pax_global_header00006660000000000000000000000064136272332200014512gustar00rootroot0000000000000052 comment=3baf58886a2f05277da354ce3a2a46eeab8db725 qiskit-aer-0.4.1/000077500000000000000000000000001362723322000135655ustar00rootroot00000000000000qiskit-aer-0.4.1/.clang-tidy000066400000000000000000000420301362723322000156200ustar00rootroot00000000000000Checks: '-*,modernize-*' WarningsAsErrors: '' AnalyzeTemporaryDtors: false User: atilag CheckOptions: - key: cert-dcl59-cpp.HeaderFileExtensions value: h,hh,hpp,hxx - key: cert-err61-cpp.CheckThrowTemporaries value: '1' - key: cert-oop11-cpp.IncludeStyle value: llvm - key: cert-oop11-cpp.UseCERTSemantics value: '1' - key: cppcoreguidelines-pro-bounds-constant-array-index.GslHeader value: '' - key: cppcoreguidelines-pro-bounds-constant-array-index.IncludeStyle value: '0' - key: cppcoreguidelines-pro-type-member-init.IgnoreArrays value: '0' - key: google-build-namespaces.HeaderFileExtensions value: h,hh,hpp,hxx - key: google-global-names-in-headers.HeaderFileExtensions value: h - key: google-readability-braces-around-statements.ShortStatementLines value: '1' - key: google-readability-function-size.BranchThreshold value: '4294967295' - key: google-readability-function-size.LineThreshold value: '4294967295' - key: google-readability-function-size.StatementThreshold value: '800' - key: google-readability-namespace-comments.ShortNamespaceLines value: '10' - key: google-readability-namespace-comments.SpacesBeforeComments value: '2' - key: google-runtime-int.SignedTypePrefix value: int - key: google-runtime-int.TypeSuffix value: '' - key: google-runtime-int.UnsignedTypePrefix value: uint - key: llvm-namespace-comment.ShortNamespaceLines value: '1' - key: llvm-namespace-comment.SpacesBeforeComments value: '1' - key: misc-assert-side-effect.AssertMacros value: assert - key: misc-assert-side-effect.CheckFunctionCalls value: '0' - key: misc-dangling-handle.HandleClasses value: 'std::basic_string_view;std::experimental::basic_string_view' - key: misc-definitions-in-headers.HeaderFileExtensions value: ',h,hh,hpp,hxx' - key: misc-definitions-in-headers.UseHeaderFileExtension value: '1' - key: misc-misplaced-widening-cast.CheckImplicitCasts value: '1' - key: misc-move-constructor-init.IncludeStyle value: llvm - key: misc-move-constructor-init.UseCERTSemantics value: '0' - key: misc-sizeof-expression.WarnOnSizeOfCompareToConstant value: '1' - key: misc-sizeof-expression.WarnOnSizeOfConstant value: '1' - key: misc-sizeof-expression.WarnOnSizeOfThis value: '1' - key: misc-string-constructor.LargeLengthThreshold value: '8388608' - key: misc-string-constructor.WarnOnLargeLength value: '1' - key: misc-suspicious-missing-comma.MaxConcatenatedTokens value: '5' - key: misc-suspicious-missing-comma.RatioThreshold value: '0.200000' - key: misc-suspicious-missing-comma.SizeThreshold value: '5' - key: misc-suspicious-string-compare.StringCompareLikeFunctions value: '' - key: misc-suspicious-string-compare.WarnOnImplicitComparison value: '1' - key: misc-suspicious-string-compare.WarnOnLogicalNotComparison value: '0' - key: misc-throw-by-value-catch-by-reference.CheckThrowTemporaries value: '1' - key: modernize-loop-convert.MaxCopySize value: '16' - key: modernize-loop-convert.MinConfidence value: reasonable - key: modernize-loop-convert.NamingStyle value: CamelCase - key: modernize-pass-by-value.IncludeStyle value: llvm - key: modernize-replace-auto-ptr.IncludeStyle value: llvm - key: modernize-use-nullptr.NullMacros value: 'NULL' - key: performance-faster-string-find.StringLikeClasses value: 'std::basic_string' - key: performance-for-range-copy.WarnOnAllAutoCopies value: '0' - key: readability-braces-around-statements.ShortStatementLines value: '1' - key: readability-function-size.BranchThreshold value: '4294967295' - key: readability-function-size.LineThreshold value: '4294967295' - key: readability-function-size.StatementThreshold value: '800' - key: readability-identifier-naming.AbstractClassCase value: aNy_CasE - key: readability-identifier-naming.AbstractClassPrefix value: '' - key: readability-identifier-naming.AbstractClassSuffix value: '' - key: readability-identifier-naming.ClassCase value: aNy_CasE - key: readability-identifier-naming.ClassConstantCase value: aNy_CasE - key: readability-identifier-naming.ClassConstantPrefix value: '' - key: readability-identifier-naming.ClassConstantSuffix value: '' - key: readability-identifier-naming.ClassMemberCase value: aNy_CasE - key: readability-identifier-naming.ClassMemberPrefix value: '' - key: readability-identifier-naming.ClassMemberSuffix value: '' - key: readability-identifier-naming.ClassMethodCase value: aNy_CasE - key: readability-identifier-naming.ClassMethodPrefix value: '' - key: readability-identifier-naming.ClassMethodSuffix value: '' - key: readability-identifier-naming.ClassPrefix value: '' - key: readability-identifier-naming.ClassSuffix value: '' - key: readability-identifier-naming.ConstantCase value: aNy_CasE - key: readability-identifier-naming.ConstantMemberCase value: aNy_CasE - key: readability-identifier-naming.ConstantMemberPrefix value: '' - key: readability-identifier-naming.ConstantMemberSuffix value: '' - key: readability-identifier-naming.ConstantParameterCase value: aNy_CasE - key: readability-identifier-naming.ConstantParameterPrefix value: '' - key: readability-identifier-naming.ConstantParameterSuffix value: '' - key: readability-identifier-naming.ConstantPrefix value: '' - key: readability-identifier-naming.ConstantSuffix value: '' - key: readability-identifier-naming.ConstexprFunctionCase value: aNy_CasE - key: readability-identifier-naming.ConstexprFunctionPrefix value: '' - key: readability-identifier-naming.ConstexprFunctionSuffix value: '' - key: readability-identifier-naming.ConstexprMethodCase value: aNy_CasE - key: readability-identifier-naming.ConstexprMethodPrefix value: '' - key: readability-identifier-naming.ConstexprMethodSuffix value: '' - key: readability-identifier-naming.ConstexprVariableCase value: aNy_CasE - key: readability-identifier-naming.ConstexprVariablePrefix value: '' - key: readability-identifier-naming.ConstexprVariableSuffix value: '' - key: readability-identifier-naming.EnumCase value: aNy_CasE - key: readability-identifier-naming.EnumConstantCase value: aNy_CasE - key: readability-identifier-naming.EnumConstantPrefix value: '' - key: readability-identifier-naming.EnumConstantSuffix value: '' - key: readability-identifier-naming.EnumPrefix value: '' - key: readability-identifier-naming.EnumSuffix value: '' - key: readability-identifier-naming.FunctionCase value: aNy_CasE - key: readability-identifier-naming.FunctionPrefix value: '' - key: readability-identifier-naming.FunctionSuffix value: '' - key: readability-identifier-naming.GlobalConstantCase value: aNy_CasE - key: readability-identifier-naming.GlobalConstantPrefix value: '' - key: readability-identifier-naming.GlobalConstantSuffix value: '' - key: readability-identifier-naming.GlobalFunctionCase value: aNy_CasE - key: readability-identifier-naming.GlobalFunctionPrefix value: '' - key: readability-identifier-naming.GlobalFunctionSuffix value: '' - key: readability-identifier-naming.GlobalVariableCase value: aNy_CasE - key: readability-identifier-naming.GlobalVariablePrefix value: '' - key: readability-identifier-naming.GlobalVariableSuffix value: '' - key: readability-identifier-naming.IgnoreFailedSplit value: '0' - key: readability-identifier-naming.InlineNamespaceCase value: aNy_CasE - key: readability-identifier-naming.InlineNamespacePrefix value: '' - key: readability-identifier-naming.InlineNamespaceSuffix value: '' - key: readability-identifier-naming.LocalConstantCase value: aNy_CasE - key: readability-identifier-naming.LocalConstantPrefix value: '' - key: readability-identifier-naming.LocalConstantSuffix value: '' - key: readability-identifier-naming.LocalVariableCase value: aNy_CasE - key: readability-identifier-naming.LocalVariablePrefix value: '' - key: readability-identifier-naming.LocalVariableSuffix value: '' - key: readability-identifier-naming.MemberCase value: aNy_CasE - key: readability-identifier-naming.MemberPrefix value: '' - key: readability-identifier-naming.MemberSuffix value: '' - key: readability-identifier-naming.MethodCase value: aNy_CasE - key: readability-identifier-naming.MethodPrefix value: '' - key: readability-identifier-naming.MethodSuffix value: '' - key: readability-identifier-naming.NamespaceCase value: aNy_CasE - key: readability-identifier-naming.NamespacePrefix value: '' - key: readability-identifier-naming.NamespaceSuffix value: '' - key: readability-identifier-naming.ParameterCase value: aNy_CasE - key: readability-identifier-naming.ParameterPackCase value: aNy_CasE - key: readability-identifier-naming.ParameterPackPrefix value: '' - key: readability-identifier-naming.ParameterPackSuffix value: '' - key: readability-identifier-naming.ParameterPrefix value: '' - key: readability-identifier-naming.ParameterSuffix value: '' - key: readability-identifier-naming.PrivateMemberCase value: aNy_CasE - key: readability-identifier-naming.PrivateMemberPrefix value: '' - key: readability-identifier-naming.PrivateMemberSuffix value: '' - key: readability-identifier-naming.PrivateMethodCase value: aNy_CasE - key: readability-identifier-naming.PrivateMethodPrefix value: '' - key: readability-identifier-naming.PrivateMethodSuffix value: '' - key: readability-identifier-naming.ProtectedMemberCase value: aNy_CasE - key: readability-identifier-naming.ProtectedMemberPrefix value: '' - key: readability-identifier-naming.ProtectedMemberSuffix value: '' - key: readability-identifier-naming.ProtectedMethodCase value: aNy_CasE - key: readability-identifier-naming.ProtectedMethodPrefix value: '' - key: readability-identifier-naming.ProtectedMethodSuffix value: '' - key: readability-identifier-naming.PublicMemberCase value: aNy_CasE - key: readability-identifier-naming.PublicMemberPrefix value: '' - key: readability-identifier-naming.PublicMemberSuffix value: '' - key: readability-identifier-naming.PublicMethodCase value: aNy_CasE - key: readability-identifier-naming.PublicMethodPrefix value: '' - key: readability-identifier-naming.PublicMethodSuffix value: '' - key: readability-identifier-naming.StaticConstantCase value: aNy_CasE - key: readability-identifier-naming.StaticConstantPrefix value: '' - key: readability-identifier-naming.StaticConstantSuffix value: '' - key: readability-identifier-naming.StaticVariableCase value: aNy_CasE - key: readability-identifier-naming.StaticVariablePrefix value: '' - key: readability-identifier-naming.StaticVariableSuffix value: '' - key: readability-identifier-naming.StructCase value: aNy_CasE - key: readability-identifier-naming.StructPrefix value: '' - key: readability-identifier-naming.StructSuffix value: '' - key: readability-identifier-naming.TemplateParameterCase value: aNy_CasE - key: readability-identifier-naming.TemplateParameterPrefix value: '' - key: readability-identifier-naming.TemplateParameterSuffix value: '' - key: readability-identifier-naming.TemplateTemplateParameterCase value: aNy_CasE - key: readability-identifier-naming.TemplateTemplateParameterPrefix value: '' - key: readability-identifier-naming.TemplateTemplateParameterSuffix value: '' - key: readability-identifier-naming.TypeTemplateParameterCase value: aNy_CasE - key: readability-identifier-naming.TypeTemplateParameterPrefix value: '' - key: readability-identifier-naming.TypeTemplateParameterSuffix value: '' - key: readability-identifier-naming.TypedefCase value: aNy_CasE - key: readability-identifier-naming.TypedefPrefix value: '' - key: readability-identifier-naming.TypedefSuffix value: '' - key: readability-identifier-naming.UnionCase value: aNy_CasE - key: readability-identifier-naming.UnionPrefix value: '' - key: readability-identifier-naming.UnionSuffix value: '' - key: readability-identifier-naming.ValueTemplateParameterCase value: aNy_CasE - key: readability-identifier-naming.ValueTemplateParameterPrefix value: '' - key: readability-identifier-naming.ValueTemplateParameterSuffix value: '' - key: readability-identifier-naming.VariableCase value: aNy_CasE - key: readability-identifier-naming.VariablePrefix value: '' - key: readability-identifier-naming.VariableSuffix value: '' - key: readability-identifier-naming.VirtualMethodCase value: aNy_CasE - key: readability-identifier-naming.VirtualMethodPrefix value: '' - key: readability-identifier-naming.VirtualMethodSuffix value: '' - key: readability-simplify-boolean-expr.ChainedConditionalAssignment value: '0' - key: readability-simplify-boolean-expr.ChainedConditionalReturn value: '0' ... qiskit-aer-0.4.1/.github/000077500000000000000000000000001362723322000151255ustar00rootroot00000000000000qiskit-aer-0.4.1/.github/CODEOWNERS000066400000000000000000000014031362723322000165160ustar00rootroot00000000000000# This file defines the persons that will be assigned as reviewers for PRs that # modify a particular file in the repo. Please note it is just a convention # for the GitHub interface, and any member of the AER team can (and should!) # review as well. # Real code owners. #* @jaygambetta @chriseclectic # Generic rule for the repository. This pattern is actually the one that will # apply unless specialized by a later rule * @chriseclectic @atilag # Individual folders on root directory /qiskit @chriseclectic @atilag /cmake @atilag /doc @chriseclectic @atilag /examples @chriseclectic @atilag /contrib @chriseclectic @atilag /test @chriseclectic @atilag /src @chriseclectic @atilag # AER specific foldersqiskit-aer-0.4.1/.github/ISSUE_TEMPLATE.md000066400000000000000000000012141362723322000176300ustar00rootroot00000000000000 *BUG TEMPLATE* ### Informations - **Qiskit AER version**: - **Operating system**: ### What is the current behavior? ### Steps to reproduce the problem ### What is the expected behavior? ### Suggested solutions --- *FEATURE REQUEST TEMPLATE* ### What is the expected behavior? --- *ENHANCEMENT REQUEST TEMPLATE* ### What is the expected enhancement? qiskit-aer-0.4.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001362723322000173105ustar00rootroot00000000000000qiskit-aer-0.4.1/.github/ISSUE_TEMPLATE/BUG_REPORT.md000066400000000000000000000007731362723322000213510ustar00rootroot00000000000000--- name: "\U0001F41B Bug report" about: "Create a report to help us improve \U0001F914." title: '' labels: bug assignees: '' --- ### Informations - **Qiskit Aer version**: - **Python version**: - **Operating system**: ### What is the current behavior? ### Steps to reproduce the problem ### What is the expected behavior? ### Suggested solutions qiskit-aer-0.4.1/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md000066400000000000000000000005521362723322000221370ustar00rootroot00000000000000--- name: "\U0001F680 Feature request" about: "Suggest an idea for this project \U0001F4A1!" title: '' labels: enhancement assignees: '' --- ### What is the expected behavior? qiskit-aer-0.4.1/.github/ISSUE_TEMPLATE/documentation.md000066400000000000000000000002141362723322000225000ustar00rootroot00000000000000--- name: Documentation about: 'Create a report to help us improve the documentation ' title: '' labels: documentation assignees: '' --- qiskit-aer-0.4.1/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000007721362723322000207340ustar00rootroot00000000000000 ### Summary ### Details and comments qiskit-aer-0.4.1/.gitignore000066400000000000000000000006631362723322000155620ustar00rootroot00000000000000# Ignore editor settings .vscode # ignore jupyter notebook checkpoints *-checkpoint.ipynb # Ignore make and cython build files *.o out/* *.so rhs*_op.pyx *.pyc *_skbuild* *_cmake_test_compile* *.whl *.egg* build/* qiskit/providers/aer/backends/libomp.dylib # Ignore macOS DS_Store .DS_Store # Ignore other IDE Files contrib/standalone/version.hpp *.log *.env *.idea/ test/.asv .tox/ .stestr/ docs/_build/ docs/stubs/ docs/api/ qiskit-aer-0.4.1/.gitmodules000066400000000000000000000004121362723322000157370ustar00rootroot00000000000000[submodule "src/third-party/headers/muparserx"] path = src/third-party/headers/muparserx url = https://github.com/beltoforion/muparserx [submodule "src/third-party/headers/thrust"] path = src/third-party/headers/thrust url = https://github.com/thrust/thrust.git qiskit-aer-0.4.1/.mailmap000066400000000000000000000041171362723322000152110ustar00rootroot00000000000000# Entries in this file are made for two reasons: # 1) to merge multiple git commit authors that correspond to a single author # 2) to change the canonical name and/or email address of an author. # # Format is: # Canonical Name commit name # \--------------+---------------/ \----------+-------------/ # replace find # See also: 'git shortlog --help' and 'git check-mailmap --help'. # # If you don't like the way your name is cited by qiskit, please feel free to # open a pull request against this file to set your preferred naming. # # Note that each qiskit element uses its own mailmap so it may be necessary to # propagate changes in other repos for consistency. # Ali Javadi-Abhari Ali Javadi-Abhari Christian Claus Christopher J. Wood Diego M. Rodríguez Gadi Aleksandrowicz Gadi Aleksandrowicz Hiroshi Horii Hiroshi Horii Hitomi Takahashi Hitomi Takahashi Ikko Hamamura Jay M. Gambetta Joe Latone John A. Gunnels Juan Cruz-Benito Juan Gomez-Mosquera Juan Gomez-Mosquera Maddy Tod <40489777+maddy-tod@users.noreply.github.com> Matthew Treinish Padraic Calpin Paul Kassebaum Paul Nation Shelly Garion <46566946+ShellyGarion@users.noreply.github.com> Wei Hu Yael Ben-Haim Yael Ben-Haim qiskit-aer-0.4.1/.pylintrc000066400000000000000000000331621362723322000154370ustar00rootroot00000000000000[MASTER] # Specify a configuration file. #rcfile= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Pickle collected data for later comparisons. persistent=yes # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins=pylint.extensions.docparams, # enable checking of docstring args pylint.extensions.docstyle # basic docstring stle checks # Use multiple processes to speed up Pylint. jobs=1 # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist= [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. #enable= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=no-self-use, # disabled as it is too verbose fixme, # disabled as TODOs would show up as warnings protected-access, # disabled as we don't follow the public vs private # convention strictly duplicate-code, # disabled as it is too verbose redundant-returns-doc, # for @abstractmethod, it cannot interpret "pass" # disable the "too-many/few-..." refactoring hints too-many-lines, too-many-branches, too-many-locals, too-many-nested-blocks, too-many-statements, too-many-instance-attributes, too-many-arguments, too-many-public-methods, too-few-public-methods, too-many-ancestors, unnecessary-pass, # allow for methods with just "pass", for clarity no-else-return, # relax "elif" after a clause with a return docstring-first-line-empty, # relax docstring style unsubscriptable-object # pylint can't determin this for numpy types [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs # (visual studio) and html. You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be # written in a file name "pylint_global.[txt|html]". This option is deprecated # and it will be removed in Pylint 2.0. files-output=no # Tells whether to display a full report or only the messages reports=yes # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= [BASIC] # Good variable names which should always be accepted, separated by a comma # i,j,k = typical indices # n,m = typical numbers # ex = for exceptions and errors # v,w = typical vectors # x,y,z = typical axes # _ = placeholder name # q,r,qr,cr,qc = quantum and classical registers, and quantum circuit # pi = the PI constant # op = operation iterator # b = basis iterator good-names=i,j,k,n,m,ex,v,w,x,y,z,Run,_,logger,q,c,r,qr,cr,qc,nd,pi,op,b,ar,br, __unittest # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,toto,tutu,tata # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Include a hint for the correct naming format with invalid-name include-naming-hint=no # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct function names function-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for function names function-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct method names method-rgx=(([a-z_][a-z0-9_]{2,49})|(assert[A-Z][a-zA-Z0-9]{2,43})|(test_[_a-zA-Z0-9]{2,}))$ # Naming hint for method names method-name-hint=[a-z_][a-z0-9_]{2,30}$ or camelCase `assert*` in tests. # Regular expression matching correct attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for attribute names attr-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct argument names argument-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for argument names argument-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct variable names variable-rgx=[a-z_][a-z0-9_]{2,30}$ # Naming hint for variable names variable-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 [ELIF] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [FORMAT] # Maximum number of characters on a single line. max-line-length=100 # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Maximum number of lines in a module max-module-lines=1000 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [SIMILARITIES] # Minimum lines number of a similarity. min-similarity-lines=4 # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [TYPECHECK] # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules=matplotlib.cm,numpy.random # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local,QuantumCircuit # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager [VARIABLES] # Tells whether we should check for unused import in __init__ files. init-import=no # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,future.builtins,tools.compiler [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make [DESIGN] # Maximum number of arguments for function / method max-args=8 # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.* # Maximum number of locals for function / method body max-locals=15 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of branch for function / method body max-branches=12 # Maximum number of statements in function / method body max-statements=50 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of attributes for a class (see R0902). max-attributes=10 # Minimum number of public methods for a class (see R0903). min-public-methods=2 # Maximum number of public methods for a class (see R0904). max-public-methods=35 # Maximum number of boolean expressions in a if statement max-bool-expr=5 [IMPORTS] # Deprecated modules which should not be used, separated by a comma deprecated-modules=optparse # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exception qiskit-aer-0.4.1/.stestr.conf000066400000000000000000000000651362723322000160370ustar00rootroot00000000000000[DEFAULT] test_path=./test/terra parallel_class=True qiskit-aer-0.4.1/.travis.yml000066400000000000000000000245011362723322000157000ustar00rootroot00000000000000# Copyright 2018, IBM. # # This source code is licensed under the Apache License, Version 2.0 found in # the LICENSE.txt file in the root directory of this source tree. notifications: email: false cache: pip: true directories: - .stestr sudo: false ############################################################################### # Anchored and aliased definitions. ############################################################################### # These are used for avoiding repeating code, and due to problems with # overriding some keys (in particular, "os" and "language: ptyhon") when using # the standard travis matrix with stages. # # This allows re-using different "sets" of configurations in the stages # matrix, mimicking a hierarchy: # * stage_generic # * stage_linux # * stage_osx stage_generic: &stage_generic install: - pip install -U 'pip<20.0.0' - pip install cython # Install terra from master on aer master else use the most recent release - | if [[ $TRAVIS_BRANCH == "master" ]] ; then pip install -c constraints.txt https://github.com/Qiskit/qiskit-terra/archive/master.zip else pip install -U -c constraints.txt qiskit-terra fi # Installing qiskit-ibmq-provider stable branch # This is only needed to suppress warnings when importing Qiskit - pip install https://github.com/Qiskit/qiskit-ibmq-provider/archive/stable.zip # Installing qiskit-aer... - pip install -U -c constraints.txt -r requirements-dev.txt stage_linux: &stage_linux <<: *stage_generic os: linux dist: bionic language: python python: 3.7 sudo: true before_install: - sudo apt-get -y update - sudo apt-get -y install g++-7 - sudo apt-get -y install libopenblas-dev before_script: - | if [ ! "$(ls -A .stestr)" ]; then rm -rf .stestr fi # Build with Thrust OpenMP CPU backend - python setup.py bdist_wheel -- -DCMAKE_CXX_COMPILER=g++-7 -DAER_THRUST_BACKEND=OMP -- -j4 - pip install dist/qiskit_aer*whl script: - stestr run --slowest stage_osx: &stage_osx <<: *stage_generic os: osx osx_image: xcode9.2 language: generic python: 3.7 env: - MPLBACKEND=ps - PYTHON_VERSION=3.7.2 cache: pip: true directories: - ~/python-interpreters/ - .stestr before_install: # Travis does not provide support for Python 3 under osx - it needs to be # installed manually. - | if [ ${TRAVIS_OS_NAME} = "osx" ]; then if [[ ! -d ~/python-interpreters/$PYTHON_VERSION ]]; then git clone git://github.com/pyenv/pyenv.git cd pyenv/plugins/python-build ./install.sh cd ../../.. python-build $PYTHON_VERSION ~/python-interpreters/$PYTHON_VERSION fi virtualenv --python ~/python-interpreters/$PYTHON_VERSION/bin/python venv source venv/bin/activate fi before_script: - | if [ ! "$(ls -A .stestr)" ]; then rm -rf .stestr fi # Build with Thrust OpenMP CPU backend - python setup.py bdist_wheel -- -DAER_THRUST_BACKEND=OMP -- -j4 - pip install dist/qiskit_aer*whl script: - python setup.py bdist_wheel -- -- -j4 - pip install dist/qiskit_aer*whl script: - stestr run --slowest ############################################################################### # Stage-related definitions ############################################################################### # Define the order of the stages. stages: - name: deploy if: tag IS present - name: lint if: tag IS blank - name: compile if: tag IS blank - name: test if: tag IS blank # Define the job matrix explicitly, as matrix expansion causes issues when # using it with stages and some variables/sections cannot be overridden. jobs: include: # "lint" stage ########################################################################### # C++ and Python linters # TODO: C++ clang-tidy! - stage: lint name: Python Style and Linter <<: *stage_linux before_script: true script: - pycodestyle --ignore=E402,W504 --max-line-length=100 qiskit/providers/aer - pylint -j 2 -rn qiskit/providers/aer # "compile" stage ########################################################################### # Linux Wheel - stage: compile name: Python Wheel Build Linux language: python python: 3.7 os: linux services: - docker env: - CIBW_BEFORE_BUILD="pip install -U Cython pip virtualenv pybind11 && yum install -y openblas-devel" - CIBW_SKIP="cp27-* cp34-* *-manylinux_i686" - CIBW_MANYLINUX_X86_64_IMAGE="manylinux2010" - CIBW_MANYLINUX_I686_IMAGE="manylinux2010" - CIBW_TEST_COMMAND="python3 {project}/tools/verify_wheels.py" - CIBW_TEST_REQUIRES="git+https://github.com/Qiskit/qiskit-terra.git" script: - pip install -U pip virtualenv twine - pip install cibuildwheel==1.1.0 - cibuildwheel --output-dir wheelhouse - stage: compile name: Python sdist Build Linux <<: *stage_linux before_script: - pip install -U virtualenv pip setuptools script: - python setup.py sdist - mkdir out; cd out; virtualenv aer-test - aer-test/bin/pip install git+https://github.com/Qiskit/qiskit-terra - aer-test/bin/pip install ../dist/*tar.gz - aer-test/bin/python ../tools/verify_wheels.py # MacOS Wheel - stage: compile name: Python Wheel Build MacOS <<: *stage_osx before_script: true script: - python setup.py bdist_wheel -- -DAER_THRUST_BACKEND=OMP -- -j4 - stage: compile name: Python sdist Build MacOS <<: *stage_osx before_script: - pip install -U virtualenv pip setuptools script: - python setup.py sdist - mkdir out; cd out; virtualenv aer-test - aer-test/bin/pip install git+https://github.com/Qiskit/qiskit-terra - aer-test/bin/pip install ../dist/*tar.gz - aer-test/bin/python ../tools/verify_wheels.py # Linux Standalone - stage: compile name: Standalone Build Linux <<: *stage_linux language: cpp install: true before_script: true script: - mkdir out; cd out; cmake .. - make # "test" stage ########################################################################### # GNU/Linux, Python 3.8 - stage: test name: Python 3.8 Tests Linux <<: *stage_linux python: 3.8 # GNU/Linux, Python 3.7 - stage: test name: Python 3.7 Tests Linux <<: *stage_linux python: 3.7 # GNU/Linux, Python 3.6 - stage: test if: type = cron name: Python 3.6 Tests Linux <<: *stage_linux python: 3.6 # GNU/Linux, Python 3.5 - stage: test if: type = cron name: Python 3.5 Tests Linux <<: *stage_linux python: 3.5 # MacOS, Python 3.8 (via pyenv) - stage: test if: type = cron name: Python 3.8 Tests MacOS <<: *stage_osx python: 3.8 env: - PYTHON_VERSION=3.8.1 # MacOS, Python 3.7 (via pyenv) - stage: test name: Python 3.7 Tests MacOS <<: *stage_osx python: 3.7 env: - MPLBACKEND=ps - PYTHON_VERSION=3.7.2 # MacOS, Python 3.6 (via pyenv) - stage: test if: type = cron name: Python 3.6 Tests MacOS <<: *stage_osx python: 3.6 env: - MPLBACKEND=ps - PYTHON_VERSION=3.6.5 # MacOS, Python 3.5 (via pyenv) - stage: test if: type = cron name: Python 3.5 Tests MacOS <<: *stage_osx python: 3.5 env: - MPLBACKEND=ps - PYTHON_VERSION=3.5.6 # "deploy" stage ########################################################################## # - name: Release Linux Wheel Builds and Upload stage: deploy language: python python: 3.7 os: linux services: - docker env: - CIBW_BEFORE_BUILD="pip install -U Cython pip virtualenv pybind11 && yum install -y openblas-devel" - CIBW_SKIP="cp27-* cp34-* *-manylinux_i686" - CIBW_MANYLINUX_X86_64_IMAGE="manylinux2010" - CIBW_MANYLINUX_I686_IMAGE="manylinux2010" - TWINE_USERNAME=qiskit - CIBW_TEST_COMMAND="python3 {project}/tools/verify_wheels.py" - CIBW_TEST_REQUIRES="git+https://github.com/Qiskit/qiskit-terra.git" if: tag IS present script: - pip install -U pip virtualenv twine - pip install cibuildwheel==1.1.0 - cibuildwheel --output-dir wheelhouse - twine upload wheelhouse/* - name: sdist Build and Upload stage: deploy if: tag IS present <<: *stage_linux env: - TWINE_USERNAME=qiskit python: 3.7 before_script: - pip install -U pip setuptools virtualenv twine install: true script: - python setup.py sdist - twine upload dist/* - name: Release MacOS Wheel Builds and Upload os: osx stage: deploy if: tag IS present env: - CIBW_BEFORE_BUILD="pip install -U Cython pip virtualenv pybind11" - CIBW_SKIP="cp27-* cp34-*" - TWINE_USERNAME=qiskit - CIBW_TEST_COMMAND="python3 {project}/tools/verify_wheels.py" - CIBW_TEST_REQUIRES="git+https://github.com/Qiskit/qiskit-terra.git" addons: homebrew: packages: - openblas script: - sudo pip2 install -U pip virtualenv - sudo pip2 install cibuildwheel==1.1.0 'twine<2.0' - cibuildwheel --output-dir wheelhouse - twine upload wheelhouse/* # Power tests (currently failing) allow_failures: # Power Build test - stage: compile name: Python Wheel Build Linux (Power) arch: ppc64le <<: *stage_linux before_script: true script: - python setup.py bdist_wheel -- -DCMAKE_CXX_COMPILER=g++-7 -DAER_THRUST_BACKEND=OMP -- -j4 # Linux Standalone - stage: compile name: Standalone Build Linux (Power) arch: ppc64le <<: *stage_linux install: true before_script: true script: - mkdir out; cd out; cmake .. - make # Power/Linux, Python 3.7 - stage: test arch: ppc64le name: Python 3.7 Tests Linux (Power) <<: *stage_linux python: 3.7 qiskit-aer-0.4.1/BENCHMARKING.md000066400000000000000000000130761362723322000157460ustar00rootroot00000000000000The main goal of the benchmarking framework is to detect regressions during development, but one can run benchmarks at any specific commit just to see how it performs, this can be a very useful tool for Aer developers so they can make sure their changes don't introduce important performance regressions. Our benchmarking framework is based on [Airspeed Velocity](https://asv.readthedocs.io/). We have only implemented benchmarks for the Qiskit Addon, not the standalone mode. # Where are the benchmarks All the benchmarks are under the `test/benchmark` directory. There you'll find a bunch of `*_benchmarks.py` files which represent the different type of benchmarks we will run: - Quantum Volume with different number of qubits and noise models - Simple one-gate circuits with different number of qubits and noise models. # How to run the benchmarks All prerequistes for building the project need to be installed in the system, take a look at the [CONTRIBUTING guide](.github/CONTRIBUTING.md) if you don't have them already installed. Install Airspeed Velocity (`ASV`): ``` $ pip install asv ``` Move to the `test` directory: ``` $ cd test ``` And run `asv` using the correct configuration file, depeding on what O.S. you are executing them: Linux: ``` $ asv run --config asv.linux.conf.json ``` MacOS: ``` $ asv run --config asv.macos.conf.json ``` NOTE: We only support Linux and MacOS at the moment Depending on your system, benchmarks will take a while to complete. After the completion of the tests, you will see the results with a format similar like this: ``` · Creating environments · Discovering benchmarks · Running 3 total benchmarks (1 commits * 1 environments * 3 benchmarks) [ 0.00%] · For qiskit-aer commit 8b4f4de1 : [ 0.00%] ·· Benchmarking conda-py3.7 [ 16.67%] ··· Running (quantum_volume_benchmarks.QuantumVolumeTimeSuite.time_quantum_volume--).. [ 50.00%] ··· Running (simple_benchmarks.SimpleU3TimeSuite.time_simple_u3--). [ 66.67%] ··· quantum_volume_benchmarks.QuantumVolumeTimeSuite.time_quantum_volume [ 66.67%] ··· ================= ========== ===================== ============= ============= -- Noise Model ----------------- ------------------------------------------------------------ Quantum Volume No Noise Mixed Unitary Noise Reset Noise Kraus Noise ================= ========== ===================== ============= ============= Num. qubits: 5 123±4ms 124±10ms 154±20ms 145±20ms Num. qubits: 10 292±10ms 319±50ms 299±10ms 346±2ms Num. qubits: 15 3.17±2s 2.38±2s 2.19±2s 9.76±2s ================= ========== ===================== ============= ============= [ 83.33%] ··· simple_benchmarks.SimpleCxTimeSuite.time_simple_cx [ 83.33%] ··· ====================== ========== ===================== ============= ============= -- Noise Model ---------------------- ------------------------------------------------------------ Simple cnot circuits No Noise Mixed Unitary Noise Reset Noise Kraus Noise ====================== ========== ===================== ============= ============= Num. qubits: 5 47.2±2ms 111±40ms 46.8±1ms 21.1±0.2ms Num. qubits: 10 117±60ms 172±60ms 164±30ms 28.6±0.3ms Num. qubits: 15 213±30ms 223±80ms 223±90ms 258±5ms ====================== ========== ===================== ============= ============= [100.00%] ··· simple_benchmarks.SimpleU3TimeSuite.time_simple_u3 [100.00%] ··· ==================== ============ ===================== ============= ============= -- Noise Model -------------------- -------------------------------------------------------------- Simple u3 circuits No Noise Mixed Unitary Noise Reset Noise Kraus Noise ==================== ============ ===================== ============= ============= Num. qubits: 5 20.3±0.3ms 21.3±0.5ms 20.7±0.4ms 21.5±0.1ms Num. qubits: 10 26.6±0.2ms 27.8±0.3ms 27.6±0.5ms 28.4±0.2ms Num. qubits: 15 244±40ms 312±70ms 295±100ms 179±100ms ==================== ============ ===================== ============= ============= ``` # Interpreting the data The output format is pretty self-explanatory, so every row starting with the text: `Num. quits:` repesents all the benchmarks run for this number of quibits configuration, more precisely, we run 4 benchmarks for every number of qubits configuration, and each of the benchmarks are run with a different noise model, so for example, this line: ``` Quantum Volume No Noise Mixed Unitary Noise Reset Noise Kraus Noise ================= ========== ===================== ============= ============= Num. qubits: 15 3.17±2s 2.38±2s 2.19±2s 9.76±2s ``` it's telling us that for our Quantum Volume circuit the time it took to complete was: - 3.17 seconds with no noise at all - 2.38 seconds with Mixed unitary noise - 2.19 seconds with Reset noise - 9.76 seconds with Kraus noise qiskit-aer-0.4.1/CHANGELOG.md000066400000000000000000000344721362723322000154100ustar00rootroot00000000000000Changelog ========= All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/). > **Types of changes:** > > - **Added**: for new features. > - **Changed**: for changes in existing functionality. > - **Deprecated**: for soon-to-be removed features. > - **Removed**: for now removed features. > - **Fixed**: for any bug fixes. > - **Security**: in case of vulnerabilities. [UNRELEASED](https://github.com/Qiskit/qiskit-aer/compare/0.4.1...HEAD) ======================================================================= Added ----- Changed ------- Deprecated ---------- Removed ------- Fixed ----- [0.4.1](https://github.com/Qiskit/qiskit-aer/compare/0.4.0...0.4.1) - 2020-02-03 ====================================================================================== Added ----- - Add terra to the `Aer` requirements list (\#593) - Find muparserx system library before using distributed one (\#621) - MPS: Support multi-qubit apply matrix (\#634) - MPS: Added thresholds to loops that use parallelization (\#638) - MPS: Improvements to apply_matrix (\#641) Changed ------- - Bump minimum required version of numpy (\#594) - Replace PyDataMem_NEW_ZEROED to PyDataMem_NEW (\#578) Deprecated ---------- Removed ------- Fixed ----- - Fixed bug in QuantumError compose method when composing Kraus with non-Kraus errors (\#605). - Fix TBB compilation (\#598) - Fixed MPS expectation value when qubits are not given in ascending order (\#603) - Fix bug in QuantumError compose method (\#605) - Fix gate fusion (\#606) - Removes static numpy initialization strategy for the Pulse simulator (\#609) - Fix QuantumError sometimes casting probabilities to complex (\#640) [0.4.0](https://github.com/Qiskit/qiskit-aer/compare/0.3.4...0.4.0) - 2020-06-02 ====================================================================================== Added ----- - Added `NoiseModel.from_backend` for building a basic device noise model for an IBMQ backend (\#569) - Added multi-GPU enabled simulation methods to the `QasmSimulator`, `StatevectorSimulator`, and `UnitarySimulator`. The qasm simulator has gpu version of the density matrix and statevector methods and can be accessed using `"method": "density_matrix_gpu"` or `"method": "statevector_gpu"` in `backend_options`. The statevector simulator gpu method can be accessed using `"method": "statevector_gpu"`. The unitary simulator GPU method can be accessed using `"method": "unitary_gpu"`. These backends use CUDA and require an NVidia GPU.(\#544) - Added ``PulseSimulator`` backend (\#542) - Added ``PulseSystemModel`` and ``HamiltonianModel`` classes to represent models to be used in ``PulseSimulator`` (\#496, \#493) - Added ``duffing_model_generators`` to generate ``PulseSystemModel`` objects from a list of parameters (\#516) - Migrated ODE function solver to C++ (\#442, \#350) - Added high level pulse simulator tests (\#379) - CMake BLAS_LIB_PATH flag to set path to look for BLAS lib (\#543) Changed ------- - Changed the structure of the `src` directory to organise simulator source code. Simulator controller headers were moved to `src/controllers` and simulator method State headers are in `src/simulators` (\#544) - Moved the location of several functions (\#568): - Moved contents of `qiskit.provider.aer.noise.errors` into the `qiskit.providers.noise` module - Moved contents of `qiskit.provider.aer.noise.utils` into the `qiskit.provider.aer.utils` module. - Enabled optimization to aggregate consecutive gates in a circuit (fusion) by default (\#579). Deprecated ---------- - Deprecated `utils.qobj_utils` functions (\#568) - Deprecated `qiskit.providers.aer.noise.device.basic_device_noise_model`. It is superseded by the `NoiseModel.from_backend` method (\#569) Removed ------- - Removed `NoiseModel.as_dict`, `QuantumError.as_dict`, `ReadoutError.as_dict`, and `QuantumError.kron` methods that were deprecated in 0.3 (\#568). Fixed ----- [0.3.4](https://github.com/Qiskit/qiskit-aer/compare/0.3.3...0.3.4) - 2019-12-09 ===================================================================================== Added ----- - Added support for probabilities snapshot and Pauli expectation value snapshot in the stabilizer simulator (\#423) - MPS simulation method: added support for ``ccx`` (\#454) Removed ------- Fixed ----- - MPS simulation method: fixed computation of snapshot_probabilities on subsets of the qubits, in any ordering (\#424) - Fixes bug where cu3 was being applied as cu1 for unitary_simulator (\#483) [0.3.3](https://github.com/Qiskit/qiskit-aer/compare/0.3.2...0.3.3) - 2019-11-14 ==================================================================================== Added ----- - Added controlled gates (``cu1``, ``cu2``, ``cu3``) to simulator basis_gates (\#417) - Added multi-controlled gates (``mcx``, ``mcy``, ``mcz``, ``mcu1``, ``mcu2``, ``mcu3``) to simulator basis gates (\#417) - Added gate definitions to simulator backend configurations (\#417) Changed ------- - Improved pershot snapshot data container performance (\#405) - Add basic linear algebra functions for numeric STL classes (\#406) - Improved average snapshot data container performance (\#407) Removed ------- Fixed ----- Deprecated ---------- - Python 3.5 support in qiskit-aer is deprecated. Support will be removed on the upstream python community's end of life date for the version, which is 09/13/2020. [0.3.2](https://github.com/Qiskit/qiskit-aer/compare/0.3.1...0.3.2) - 2019-10-16 =============================================================================== Added ----- Changed ------- - Moved the location of several functions (\#568): - Moved contents of `qiskit.provider.aer.noise.errors` into the `qiskit.providers.noise` module - Moved contents of `qiskit.provider.aer.noise.device` into the `qiskit.providers.noise` module. - Moved contents of `qiskit.provider.aer.noise.utils` into the `qiskit.provider.aer.utils` module. Deprecated ---------- - Deprecated `utils.qobj_utils` functions (\#568) Removed ------- - Removed `NoiseModel.as_dict`, `QuantumError.as_dict`, `ReadoutError.as_dict`, and `QuantumError.kron` methods that were deprecated in 0.3 (\#568). Fixed ----- - Fix sdist to always attempt to build (\#401) - New (efficient) implementation for expectation_value_pauli in MPS simulation method (\#344) [0.3.1](https://github.com/Qiskit/qiskit-aer/compare/0.3.0...0.3.1) - 2019-10-15 =============================================================================== Added ----- - Added tests for the Fredkin gate (#357) - Added tests for the cu1 gate (#360) - Added tests for statevector and stabilizer snapshots (\#355) - Added tests for density matrix snapshot (\#374) - Added tests for probabilities snapshot (\#380) - Added support for reset() in MPS simulation method (\#393) - Added tests for matrix and Pauli expectation value snapshot (\#386) - Added test decorators for tests that require OpenMP and multi-threading(\#551) - Added tests for automatic and custom parallel thread configuration (\#511) Changed ------- - Changes signature of SnapshotExpectationValue extension and the way qubit position parameters are parsed in expectation_value_matrix qobj instructions (\#386) - Change signature of SnapshotProbabilities extension (\#380) - Change signature of SnapshotDensityMatrix extension (\#374) - Stabilizer snapshot returns stabilizer instead of full Clifford table (\#355) - Signature of SnapshotStatevector and SnapshotStabilizer (\#355) - Changed all names from tensor_network_state to matrix_product_state (\#356) - Update device noise model to consume asymmetric readout errors from backends (\#354) - Update device noise model to use gate_length (\#352) - Refactoring code and introducing floating point comparison func (\#338) Removed ------- Fixed ----- - Fixed bug in parallel thread configuration where total threads could exceed the "max_parallel_threads" config settings (\#551) [0.3.0](https://github.com/Qiskit/qiskit-aer/compare/0.2.3...0.3.0) - 2019-08-21 =============================================================================== Added ----- - New simulation method for qasm simulator: tensor_network (\#56) - Added superop qobj instruction and superoperator matrix utils (\#289) - Added support for conditional unitary, kraus, superop qobj instructions (\#291) - Add "validation_threshold" config parameter to Aer backends (\#290) - Added support for apply_measure in tensor_network_state. Also changed sample_measure to use apply_measure (\#299) - Added density matrix simulation method to QasmSimulator (\#295, \#253) - Adds delay measure circuit optimization (\#317) - Added sampling for sampling with readout-errors (\#222) - Added support of single precision for statevector and density matrix simulation (\#286, \#315) - Noise model inserter module (\#239) Changed ------- - Added density matrix method to automatic QasmSimulator methods (\#316) Removed ------- Fixed ----- - Bug in handling parallelization in matrix_product_state.cpp (PR\#292) - Added support for multiplication by coeff in tensor_network_state expectation value snapshots (PR\#294) - Change name of qasm simulation method from tensor_network to matrix_product_state (\#320) [0.2.3](https://github.com/Qiskit/qiskit-aer/compare/0.2.2...0.2.3) - 2019-07-11 =============================================================================== Fixed ----- - Bug in measure sampling conditional checking with conditional instructions (\#280) [0.2.2](https://github.com/Qiskit/qiskit-aer/compare/0.2.1...0.2.2) - 2019-07-10 ================================================================================ Added ----- - Added multi-controlled phase gate to `QubitVector` and changed multi-controlled Z and multi-controlled u1 gates to use this method (\# 258) - Added optimized anti-diagonal single-qubit gates to QubitVector (\# 258) Changed ------- - Improve performance of matrix fusion circuit optimization and move fusion code out of `QubitVector` class and into Fusion optimization class (\#255) Removed ------- - Remove `matrix_sequence` Op type from `Op` class (\#255) Fixed ----- - Change maximum parameter for depolarizing_error to allow for error channel with no identity component. (\#243) - Fixed 2-qubit depolarizing-only error parameter calculation in basic_device_noise_model (\#243) - Set maximum workers to ThreadPoolExecutor in AerJob to limit thread creation (\#259) [0.2.1](https://github.com/Qiskit/qiskit-aer/compare/0.2.0...0.2.1) - 2019-05-20 ================================================================================ Added ----- - Added 2-qubit Pauli and reset approximation to noise transformation (\#236) - Added `to_instruction` method to `ReadoutError` (\#257). Changed ------- - When loading qobj check if all instructions are conditional and raise an exception if an unsupported instruction is conditional (\#271) - Deprecate the use of \".as\_dict()\" in favor of \".to\_dict()\" (\#228) - Set simulator seed from \"seed\_simulator\" in qobj (\#210) Removed ------- Fixed ----- - Fix memory error handling for huge circuits (\#216) - Fix equality expressions in Python code (\#208) [0.2.0](https://github.com/Qiskit/qiskit-aer/compare/0.1.1...0.2.0) - 2019-05-02 ================================================================================ Added ----- - Add multiplexer gate (\#192) - Add [remap\_noise\_model]{.title-ref} function to noise.utils (\#181) - Add [\_\_eq\_\_]{.title-ref} method to NoiseModel, QuantumError, ReadoutError (\#181) - Add support for labelled gates in noise models (\#175). - Add optimized mcx, mcy, mcz, mcu1, mcu2, mcu3, gates to QubitVector (\#124) - Add optimized controlled-swap gate to QubitVector (\#142) - Add gate-fusion optimization for QasmContoroller, which is enabled by setting fusion\_enable=true (\#136) - Add better management of failed simulations (\#167) - Add qubits truncate optimization for unused qubits (\#164) - Add ability to disable depolarizing error on device noise model (\#131) - Add initialise simulator instruction to statevector\_state (\#117, \#137) - Add coupling maps to simulators (\#93) - Add circuit optimization framework (\#83) - Add benchmarking (\#71, \#177) - Add wheels support for Debian-like distributions (\#69) - Add autoconfiguration of threads for qasm simulator (\#61) - Add Simulation method based on Stabilizer Rank Decompositions (\#51) Changed ------- - Add basis\_gates kwarg to NoiseModel init (\#175). - Depreciated \"initial\_statevector\" backend option for QasmSimulator and StatevectorSimulator (\#185) - Rename \"chop\_threshold\" backend option to \"zero\_threshold\" and change default value to 1e-10 (\#185). - Add an optional parameter to [NoiseModel.as\_dict()]{.title-ref} for returning dictionaries that can be serialized using the standard [json]{.title-ref} library directly. (\#165) - Refactor thread management (\#50) Removed ------- Fixed ----- - Improve noise transformations (\#162) - Improve error reporting (\#160) - Improve efficiency of parallelization with max\_memory\_mb a new parameter of backend\_opts (\#61) - Improve u1 performance in statevector (\#123) - Fix OpenMP clashing problems on MacOS for the Terra Addon (\#46) [0.1.1](https://github.com/Qiskit/qiskit-aer/compare/0.1.0...0.1.1) - 2019-01-24 ================================================================================ Added ----- - Adds version information when using the standalone simulator (\#36) - Adds a Clifford stabilizer simulation method to the QasmSimulator (\#13) - Improve Circuit and NoiseModel instructions checking (\#31) - Add reset\_error function to Noise models (\#34) - Improve error reporting at installation time (\#29) - Validate n\_qubits before execution (\#24) - Add qobj method to AerJob (\#19) Removed ------- - Reference model tests removed from the codebase (\#27) Fixed ----- - Fix Contributing guide (\#33) - Fix an import in Terra integration tests (\#33) - Fix non-OpenMP builds (\#19) [0.1.0](https://github.com/Qiskit/qiskit-aer/compare/0.0.0...0.1.0) - 2018-12-19 ================================================================================ Added ----- - QASM Simulator - Statevector Simulator - Unitary Simulator - Noise models - Terra integration - Standalone Simulators support qiskit-aer-0.4.1/CMakeLists.txt000077500000000000000000000265321362723322000163400ustar00rootroot00000000000000# CMake config file to build AER # # For Linux and Mac, we can build both statically or dynamically. The latter is # the default. If you want to build an static executable/library, you need to set # STATIC_LINKING to True, example: # out$ cmake -DSTATIC_LINKING=True .. # # For Mac, statically linking only happens with user libraries, system libraries cannot # be linked statically per Apple's indications. cmake_minimum_required(VERSION 3.6) file(STRINGS "qiskit/providers/aer/VERSION.txt" VERSION_NUM) project(qasm_simulator VERSION ${VERSION_NUM} LANGUAGES CXX C) list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) list(APPEND CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR}/cmake) # Warning: Because of a bug on CMake's FindBLAS or (it's not clear whoes fault is) # libopenblas.a for Ubuntu (maybe others) we need to copy the file: # cmake/FindBLAS.cmake.fix-static-linking, to the directory were CMake Modules are # installed in the system, but with the name: FindBLAS.cmake option(STATIC_LINKING "Specify if we want statically link the executable (for redistribution mainly)" FALSE) option(BUILD_TESTS "Specify whether we want to build tests or not" FALSE) include(CTest) include(compiler_utils) include(Linter) include(findBLASInSpecificPath) # Get version information get_version(${VERSION_NUM}) configure_file("${PROJECT_SOURCE_DIR}/contrib/standalone/version.hpp.in" "${PROJECT_SOURCE_DIR}/contrib/standalone/version.hpp") set(AER_SIMULATOR_CPP_SRC_DIR "${PROJECT_SOURCE_DIR}/src") set(AER_SIMULATOR_CPP_MAIN "${PROJECT_SOURCE_DIR}/contrib/standalone/qasm_simulator.cpp") set(AER_SIMULATOR_CPP_EXTERNAL_LIBS "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/headers" "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/macos/lib" "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/win64/lib" "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/linux/lib" "${USER_LIB_PATH}") set(AER_COMPILER_DEFINITIONS "") # TODO: We may want to change the prefix path for all the environments if(WIN32) set(CMAKE_PREFIX_PATH "${AER_SIMULATOR_CPP_EXTERNAL_LIBS} ${CMAKE_PREFIX_PATH}") endif() # Adding support for CCache find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif(CCACHE_FOUND) # Set default build type to Release with Debug Symbols IF(NOT CMAKE_BUILD_TYPE) SET(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: Debug Release" FORCE) ENDIF(NOT CMAKE_BUILD_TYPE) if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") # In order to build for MacOSX 10.9 and above with Clang, we need to force the "deployment target" to 10.9 # and force using libc++ instead of the default for this target: libstdc++ otherwise we could not # use C++11/14 set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "" FORCE) enable_cxx_compiler_flag_if_supported("-stdlib=libc++") endif() if(STATIC_LINKING) if(APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang") message(WARNING "Clang on MacOS doesn't support some -static-* flags. Switching to dyn compilation...") unset(STATIC_LINKING) else() # MacOS compilers don't support -static flag either if(NOT APPLE) enable_cxx_compiler_flag_if_supported("-static") endif() # This is enough to build a semi-static executable on Mac enable_cxx_compiler_flag_if_supported("-static-libgcc") enable_cxx_compiler_flag_if_supported("-static-libstdc++") endif() endif() if(NOT MSVC) enable_cxx_compiler_flag_if_supported("-ffast-math") if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le") # PowerPC builds are not meant to be redistributable, we build them # in place, so we can have CPU = native. enable_cxx_compiler_flag_if_supported("-mcpu=native") endif() # Warnings and Errors enable_cxx_compiler_flag_if_supported("-pedantic") enable_cxx_compiler_flag_if_supported("-Wall") enable_cxx_compiler_flag_if_supported("-Wfloat-equal") enable_cxx_compiler_flag_if_supported("-Wundef") enable_cxx_compiler_flag_if_supported("-Wcast-align") enable_cxx_compiler_flag_if_supported("-Wwrite-strings") enable_cxx_compiler_flag_if_supported("-Wmissing-declarations") enable_cxx_compiler_flag_if_supported("-Wredundant-decls") enable_cxx_compiler_flag_if_supported("-Wshadow") enable_cxx_compiler_flag_if_supported("-Woverloaded-virtual") endif() if(STATIC_LINKING) SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) if(WIN32) SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif() endif() # # Looking for external libraries # message(STATUS "Looking for OpenMP support...") find_package(OpenMP QUIET) # This is a hack for building with Apple's LLVM, which doesn't support OpenMP yet # so we need to link with an external library: libomp. # NOTE: CMake >= 3.12.0 doesn't need this hack. It will just find OpenMP in the # first find_package(OpenMP) call if(NOT "${OpenMP_FOUND}" OR NOT "${OpenMP_CXX_FOUND}") if(APPLE) set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp") set(OpenMP_CXX_LIB_NAMES "omp") set(OpenMP_omp_LIBRARY "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/macos/lib/libomp.dylib") include_directories("${AER_SIMULATOR_CPP_SRC_DIR}/third-party/macos/lib") set(OPENMP_FOUND TRUE) endif() endif() if(OPENMP_FOUND) set(AER_COMPILER_FLAGS "${AER_COMPILER_FLAGS} ${OpenMP_CXX_FLAGS}") set(AER_LINKER_FLAGS "${AER_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS} ${OpenMP_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") if(APPLE) # On Apple and clang, we do need to link against the library unless we are building # the Terra Addon, see issue: https://github.com/Qiskit/qiskit-aer/issues/1 if(NOT SKBUILD) set(OPENMP_EXTERNAL_LIB "${OpenMP_${OpenMP_CXX_LIB_NAMES}_LIBRARY}") message(STATUS "Adding Clang: ${OPENMP_EXTERNAL_LIB}") endif() endif() message(STATUS "OpenMP found!") message(STATUS "OpenMP_CXX_FLAGS = ${OpenMP_CXX_FLAGS}") message(STATUS "OpenMP_EXE_LINKER_FLAGS = ${OpenMP_EXE_LINKER_FLAGS}") else() message(STATUS "WARNING: No OpenMP support found!") endif() message(STATUS "Looking for NLOHMANN Json library...") set(NLOHMANN_JSON_PATH ${AER_SIMULATOR_CPP_EXTERNAL_LIBS}) find_package(nlohmann_json REQUIRED) if(STATIC_LINKING) message(STATUS "Using static linking with Threads...") set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG True) endif() find_package(Threads) if(STATIC_LINKING) message(STATUS "Setting BLA_STATIC") set(BLA_STATIC TRUE) endif() if(BLAS_LIB_PATH) find_BLAS_in_specific_path(${BLAS_LIB_PATH}) else() if(APPLE) message(STATUS "Looking for Apple BLAS library...") set(BLA_VENDOR "Apple") else() message(STATUS "Looking for OpenBLAS library...") set(BLA_VENDOR "OpenBLAS") endif() if(WIN32) message(STATUS "Uncompressing OpenBLAS static library...") execute_process(COMMAND ${CMAKE_COMMAND} -E tar "xvfj" "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/win64/lib/openblas.7z" WORKING_DIRECTORY "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/win64/lib/") endif() find_package(BLAS QUIET) if(NOT BLAS_FOUND) message(STATUS "OpenBLAS not found. Looking for any other BLAS library...") unset(BLA_VENDOR) find_package(BLAS REQUIRED) endif() endif() message(STATUS "BLAS library found: ${BLAS_LIBRARIES}") message(STATUS "Looking for spdlog library...") find_package(spdlog QUIET) if(spdlog_FOUND) message(STATUS "spdlog found.") set(SPDLOG_LIB spdlog::spdlog) else() message(STATUS "spdlog not found.") set(SPDLOG_LIB "") endif() # Windows don't have a DL library (dlopen, dlclose, etc...) if(NOT MSVC) find_library(DL_LIB NAMES dl) if(${DL_LIB} MATCHES "DL_LIB-NOTFOUND") message(FATAL_ERROR "No dl lib found") endif() endif() # GPU support through Thrust library (CPU fallbacks) # Defaults to TRUE, but if no Thrust backend has been defined, will set to FALSE set(AER_THRUST_SUPPORTED TRUE) if(AER_THRUST_SUPPORTED) if(AER_THRUST_BACKEND STREQUAL "CUDA") message(STATUS "Thrust library: Looking for CUDA backend...") find_package(CUDA REQUIRED) message(STATUS "Thrust library: CUDA found!") cuda_select_nvcc_arch_flags(AER_CUDA_ARCH Auto) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -ccbin ${CMAKE_CXX_COMPILER} ${AER_CUDA_ARCH} -DAER_THRUST_CUDA -std=c++14 -I${AER_SIMULATOR_CPP_SRC_DIR} -isystem ${AER_SIMULATOR_CPP_SRC_DIR}/third-party/headers -use_fast_math --expt-extended-lambda") set(AER_COMPILER_DEFINITIONS ${AER_COMPILER_DEFINITIONS} THRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_CUDA) set(THRUST_DEPENDANT_LIBS "") elseif(AER_THRUST_BACKEND STREQUAL "TBB") message(STATUS "Thrust library: Looking for TBB backend...") find_package(TBB REQUIRED) message(STATUS "TBB Support found!") get_thrust_source_code() set(THRUST_DEPENDANT_LIBS ${TBB_LIBRARIES}) set(AER_COMPILER_DEFINITIONS ${AER_COMPILER_DEFINITIONS} THRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_TBB AER_THRUST_CPU=TRUE) elseif(AER_THRUST_BACKEND STREQUAL "OMP") message(STATUS "Thrust library: Setting OMP backend") if(NOT OPENMP_FOUND) message(FATAL_ERROR "There's no OMP support. We cannot set Thrust backend to OMP!!") endif() get_thrust_source_code() set(AER_COMPILER_DEFINITIONS ${AER_COMPILER_DEFINITIONS} THRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_OMP AER_THRUST_CPU=TRUE) # We don't need to add OMP because it's already an AER dependency set(THRUST_DEPENDANT_LIBS "") else() message(STATUS "No Thrust supported backend") set(AER_THRUST_SUPPORTED FALSE) endif() endif() if(AER_THRUST_SUPPORTED) set(AER_COMPILER_DEFINITIONS ${AER_COMPILER_DEFINITIONS} AER_THRUST_SUPPORTED=TRUE) else() message(STATUS "No Thrust support enabled") endif() # Set dependent libraries set(AER_LIBRARIES ${OPENMP_EXTERNAL_LIB} ${BLAS_LIBRARIES} nlohmann_json Threads::Threads ${SPDLOG_LIB} ${DL_LIB} ${THRUST_DEPENDANT_LIBS}) # Cython build is only enabled if building through scikit-build. if(SKBUILD) # Terra Addon build add_muparserx_lib() add_subdirectory(qiskit/providers/aer/pulse/cy) add_subdirectory(qiskit/providers/aer/pulse/qutip_lite/cy) add_subdirectory(qiskit/providers/aer/backends/wrappers) add_subdirectory(src/open_pulse) else() # Standalone build set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) if(CUDA_FOUND) cuda_add_executable(qasm_simulator ${AER_SIMULATOR_CPP_MAIN}) set_source_files_properties(${AER_SIMULATOR_CPP_MAIN} PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ) target_link_libraries(qasm_simulator ${AER_LIBRARIES}) else(CUDA_FOUND) add_executable(qasm_simulator ${AER_SIMULATOR_CPP_MAIN}) target_link_libraries(qasm_simulator PRIVATE ${AER_LIBRARIES}) endif(CUDA_FOUND) set_target_properties(qasm_simulator PROPERTIES LINKER_LANGUAGE CXX CXX_STANDARD 14 COMPILE_FLAGS ${AER_COMPILER_FLAGS} LINK_FLAGS ${AER_LINKER_FLAGS} RUNTIME_OUTPUT_DIRECTORY_DEBUG Debug RUNTIME_OUTPUT_DIRECTORY_RELEASE Release) target_include_directories(qasm_simulator PRIVATE ${AER_SIMULATOR_CPP_SRC_DIR} PRIVATE ${AER_SIMULATOR_CPP_EXTERNAL_LIBS}) target_compile_definitions(qasm_simulator PRIVATE ${AER_COMPILER_DEFINITIONS}) install(TARGETS qasm_simulator DESTINATION bin) # Linter # This will add the linter as part of the compiling build target #add_linter(qasm_simulator) endif() # Tests if(BUILD_TESTS) # These tests were meant to be as an example, or template for C++ specific # code, but they're not being maintained, so we are disabling them until we # have real C++ tests in the codebase. # add_subdirectory(test) endif() qiskit-aer-0.4.1/CODE_OF_CONDUCT.md000066400000000000000000000062161362723322000163710ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at qiskit@qiskit.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org [version]: http://contributor-covenant.org/version/1/4/ qiskit-aer-0.4.1/CONTRIBUTING.md000066400000000000000000000467171362723322000160350ustar00rootroot00000000000000# Contributing We appreciate all kinds of help, so thank you! ## Issue Reporting This is a good point to start, when you find a problem please add it to the [issue tracker](https://github.com/Qiskit/qiskit-aer/issues). The ideal report should include the steps to reproduce it. ## Doubts Solving To help less advanced users is another wonderful way to start. You can help us close some opened issues. This kind of tickets should be labeled as `question`. ## Improvement Proposal If you have an idea for a new feature please open a ticket labeled as `enhancement`. If you could also add a piece of code with the idea or a partial implementation it would be awesome. ## Contributor License Agreement We'd love to accept your code! Before we can, we have to get a few legal requirements sorted out. By signing a contributor license agreement (CLA), we ensure that the community is free to use your contributions. When you contribute to the Qiskit project with a new pull request, a bot will evaluate whether you have signed the CLA. If required, the bot will comment on the pull request, including a link to accept the agreement. The [individual CLA](https://qiskit.org/license/qiskit-cla.pdf) document is available for review as a PDF. > Note: If you work for a company that wants to allow you to contribute your > work, then you'll need to sign a [corporate > CLA](https://qiskit.org/license/qiskit-corporate-cla.pdf) and email it to us > at qiskit@us.ibm.com. ## Install from Source > Note: The following are prerequisites for all operating systems We recommend using Python virtual environments to cleanly separate Qiskit from other applications and improve your experience. The simplest way to use environments is by using *Anaconda* in a terminal window $ conda create -y -n QiskitDevEnv python=3 $ source activate QiskitDevEnv Clone the Qiskit Aer repo via *git*. $ git clone https://github.com/Qiskit/qiskit-aer Most of the required dependencies can be installed via *pip*, using the `requirements-dev.txt` file, e.g.: $ cd qiskit-aer $ pip install -r requirements-dev.txt ### Linux Qiskit is supported on Ubuntu >= 16.04. To get most of the necessary compilers and libraries, install the *build-essential* package by running $ sudo apt install build-essential Although the *BLAS* and *LAPACK* library implementations included in the *build-essential* package are sufficient to build all of the Aer simulators, we recommend using *OpenBLAS*, which you can install by running $ sudo apt install libopenblas-dev There are two ways of building Aer simulators, depending on your goal: 1. Build a Terra compatible add-on; 2. Build a standalone executable. **Terra Add-on** For the former, we just need to call the `setup.py` script: qiskit-aer$ python ./setup.py bdist_wheel We are using [*scikit-build*](https://scikit-build.readthedocs.io/en/latest/index.html) as a substitute for *setuptools*. This is basically the glue between *setuptools* and *CMake*, so there are various options to pass variables to *CMake*, and the underlying build system (depending on your platform). The way to pass variables is: qiskit-aer$ python ./setup.py bdist_wheel [skbuild_opts] \ [-- [cmake_opts] [-- build_tool_opts]] where the elements within square brackets `[]` are optional, and *`skbuild_opts`*, *`cmake_opts`*, *`build_tool_opts`* are to be replaced by flags of your choice. A list of *CMake* options is available [here](https://cmake.org/cmake/help/v3.6/manual/cmake.1.html#options). For example, qiskit-aer$ python ./setup.py bdist_wheel -- -- -j8 This is passing the flag `-j8` to the underlying build system, which in this case is *Makefile*, telling it that we want to build in parallel using 8 processes. **Standalone Executable** If we want to build a standalone executable, we have to use *CMake* directly. The preferred way *CMake* is meant to be used, is by setting up an "out of source" build. So in order to build our standalone executable, we have to follow these steps: qiskit-aer$ mkdir out qiskit-aer$ cd out qiskit-aer/out$ cmake .. qiskit-aer/out$ cmake --build . --config Release -- -j4 Once built, you will have your standalone executable into the `Release/` or `Debug/` directory (depending on the type of building chosen with the `--config` option): qiskit-aer/out$ cd Release qiskit-aer/out/Release/$ ls aer_simulator_cpp ### macOS There are various methods depending on the compiler we want to use. If we want to use the *Clang* compiler, we need to install an extra library for supporting *OpenMP*: *libomp*. The *CMake* build system will warn you otherwise. To install it manually, in a terminal window, run: $ brew install libomp We recommend installing *OpenBLAS*, which is our default choice: $ brew install openblas The *CMake* build system will search for other *BLAS* implementation alternatives if *OpenBLAS* is not installed in the system. You further need to have *Xcode Command Line Tools* installed on macOS: $ xcode-select --install There are two ways of building Aer simulators, depending on your goal: 1. Build a Terra compatible add-on; 2. Build a standalone executable. **Terra Add-on** For the former, we just need to call the `setup.py` script: qiskit-aer$ python ./setup.py bdist_wheel We are using [*scikit-build*](https://scikit-build.readthedocs.io/en/latest/index.html) as a substitute for *setuptools*. This is basically the glue between *setuptools* and *CMake*, so there are various options to pass variables to *CMake*, and the underlying build system (depending on your platform). The way to pass variables is: qiskit-aer$ python ./setup.py bdist_wheel [skbuild_opts] \ [-- [cmake_opts] [-- build_tool_opts]] where the elements within square brackets `[]` are optional, and *`skbuild_opts`*, *`cmake_opts`*, *`build_tool_opts`* are to be replaced by flags of your choice. A list of *CMake* options is available [here](https://cmake.org/cmake/help/v3.6/manual/cmake.1.html#options). For example, qiskit-aer$ python ./setup.py bdist_wheel -- -- -j8 This is passing the flag `-j8` to the underlying build system, which in this case is *Makefile*, telling it that we want to build in parallel using 8 processes. > You may need to specify your platform name and turn off static linking, for > example: qiskit-aer$ python ./setup.py bdist_wheel --plat-name macosx-10.9-x86_64 \ -- -DSTATIC_LINKING=False -- -j8 Here `--plat-name` is a flag to *setuptools*, `-DSTATIC_LINKING` is a flag to *CMake*, and `-j8` is a flag to the underlying build system. After this command is executed successfully, we will have a wheel package into the `dist/` directory, so next step is installing it: qiskit-aer/$ cd dist qiskit-aer/dist$ pip install qiskit_aer-<...>.whl **Standalone Executable** If we want to build a standalone executable, we have to use **CMake** directly. The preferred way **CMake** is meant to be used, is by setting up an "out of source" build. So in order to build our standalone executable, we have to follow these steps: qiskit-aer$ mkdir out qiskit-aer$ cd out qiskit-aer/out$ cmake .. qiskit-aer/out$ cmake --build . --config Release -- -j4 Once built, you will have your standalone executable into the `Release/` or `Debug/` directory (depending on the type of building chosen with the `--config` option): qiskit-aer/out$ cd Release qiskit-aer/out/Release/$ ls aer_simulator_cpp ### Windows On Windows, you must have *Anaconda3* installed. We recommend also installing *Visual Studio 2017* (Community Edition). *Anaconda3* is required when searching for an *OpenBLAS* implementation. If *CMake* can't find a suitable implementation installed, it will take the *BLAS* library from the *Anaconda3* environment. ## Useful CMake flags There are some useful flags that can be set during cmake command invocation and will help you change some default behavior. To make use of them, you just need to pass them right after ``-D`` cmake argument. Example: ``` qiskit-aer/out$ cmake -DUSEFUL_FLAG=Value .. ``` In the case of building the Terra addon, you have to pass these flags after writing ``--`` at the end of the python command line, eg: ``` qiskit-aer$ python ./setup.py bdist_wheel -- -DUSEFUL_FLAG=Value ``` These are the flags: USER_LIB_PATH This flag tells CMake to look for libraries that are needed by some of the native components to be built, but they are not in a common place where CMake could find it automatically. Values: An absolute path with file included. Default: No value. Example: ``cmake -DUSER_LIB_PATH=C:\path\to\openblas\libopenblas.so ..`` BLAS_LIB_PATH Tells CMake the directory to look for the BLAS library instead of the usual paths. If no BLAS library is found under that directory, CMake will raise an error and stop. Values: An absolute path with file included. Default: No value. Example: ``cmake -DBLAS_LIB_PATH=/path/to/look/for/blas/ ..`` STATIC_LINKING Tells the build system whether to create static versions of the programs being built or not. NOTE: On MacOS static linking is not fully working for all versions of GNU G++/Clang compilers, so depending on the version of the compiler installed in the system, enable this flag in this platform could cause errors. Values: True|False Default: False Example: ``cmake -DSTATIC_LINKING=True ..`` BUILD_TESTS It will tell the build system to build C++ tests along with the simulator. Values: True|False Default: False Example: ``cmake -DBUILD_TESTS=True ..`` CMAKE_CXX_COMPILER This is an internal CMake flag. It forces CMake to use the provided toolchain to build everthing. If it's not set, CMake system will use one of the toolchains installed in system. Values: g++|clang++|g++-8 Default: Depends on the running platform and the toolchains installed Example: ``cmake -DCMAKE_CXX_COMPILER=g++`` AER_THRUST_BACKEND We use Thrust library for GPU support through CUDA. If we want to build a version of Aer with GPU acceleration, we need to install CUDA and set this variable to the value: "CUDA". There are other values that will use different CPU methods depending on the kind of backend we want to use: - "OMP": For OpenMP support - "TBB": For Intel Threading Building Blocks Values: CUDA|OMP|TTB Default: No value Example: ``cmake -DAER_THRUST_BACKEND=CUDA`` ## Tests Almost every code contribution should be accompained by it's corresponding set of tests. You won't probably hear complaints if there are too many tests in your PR :), but the other way around is unnacceptable :( We have two types of tests in the codebase: Qiskit Terra integration tests and Standalone integration tests. For Qiskit Terra integration tests, you first need to build and install the Terra addon, and then run `unittest` Python framework. ``` qiskit-aer$ python ./setup.py install # if you had to use --plat-name macosx-10.9-x86_64 for bdist_wheel then you need to do this for install: # python ./setup.py install -- -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.9 -DCMAKE_OSX_ARCHITECTURES:STRING=x86_64 qiskit-aer$ python -m unittest discover -s test -v ``` Alternatively you can run the integration tests in parallel using `stestr`. ``` qiskit-aer$ stestr run --slowest ``` The `slowest` option will print the slowest tests at the end. Manual for `stestr` can be found [here](https://stestr.readthedocs.io/en/latest/MANUAL.html#). You may need to install it: ``` qiskit-aer$ pip install stestr ``` The integration tests for Terra addon are included in: `test/terra`. For the Standalone version of the simulator, we have C++ tests that use the Catch library. Tests are located in `test/src` directory, and in order to run them, you have to build them first: ``` qiskit-aer$ mkdir out qiskit-aer$ cd out qiskit-aer/out$ cmake .. -DBUILD_TESTS=True qiskit-aer/out$ cmake --build . --config Release -- -j4 qiskit-aer/out$ ctest -VV ``` ## Style guide Please submit clean code and please make effort to follow existing conventions in order to keep it as readable as possible. TODO: Decide code convention A linter (clang-tidy) is passed automatically every time a building is invoqued. It will stop the current build if detects style erros, or common pitfalls. ## Good First Contributions You are welcome to contribute wherever in the code you want to, of course, but we recommend taking a look at the "Good first contribution" label into the issues and pick one. We would love to mentor you! ## Doc Review the parts of the documentation regarding the new changes and update it if it's needed. ## Pull Requests We use [GitHub pull requests](https://help.github.com/articles/about-pull-requests) to accept the contributions. A friendly reminder! We'd love to have a previous discussion about the best way to implement the feature/bug you are contributing with. This is a good way to improve code quality in our beloved simulators!, so remember to file a new Issue before starting to code for a solution. So after having discussed the best way to land your changes into the codebase, you are ready to start coding (yay!). We have two options here: 1. You think your implementation doesn't introduce a lot of code, right?. Ok, no problem, you are all set to create the PR once you have finished coding. We are waiting for it! 2. Your implementation does introduce many things in the codebase. That sounds great! Thanks!. In this case you can start coding and create a PR with the word: **[WIP]** as a prefix of the description. This means "Work In Progress", and allow reviewers to make micro reviews from time to time without waiting to the big and final solution... otherwise, it would make reviewing and coming changes pretty difficult to accomplish. The reviewer will remove the **[WIP]** prefix from the description once the PR is ready to merge. ### Pull Request Checklist When submitting a pull request and you feel it is ready for review, please double check that: * the code follows the code style of the project. For convenience, you can execute ``make style`` and ``make lint`` locally, which will print potential style warnings and fixes. * the documentation has been updated accordingly. In particular, if a function or class has been modified during the PR, please update the docstring accordingly. * your contribution passes the existing tests, and if developing a new feature, that you have added new tests that cover those changes. * you add a new line to the ``CHANGELOG.rst`` file, in the ``UNRELEASED`` section, with the title of your pull request and its identifier (for example, "``Replace OldComponent with FluxCapacitor (#123)``". ### Commit Messages Please follow the next rules for the commit messages: - It should include a reference to the issue ID in the first line of the commit, **and** a brief description of the issue, so everybody knows what this ID actually refers to without wasting to much time on following the link to the issue. - It should provide enough information for a reviewer to understand the changes and their relation to the rest of the code. A good example: ``` Issue #190: Short summary of the issue * One of the important changes * Another important change ``` A (really) bad example: ``` Fixes #190 ``` ## Development Cycle TODO: Review Our development cycle is straightforward, we define a roadmap with milestones for releases, and features that we want to include in these releases. The roadmap is not public at the moment, but it's a committed project in our community and we are working to make parts of it public in a way that can be beneficial for everyone. Whenever a new release is close to be launched, we'll announce it and detail what has changed since the latest version. The channels we'll use to announce new releases are still being discussed, but for now you can [follow us](https://twitter.com/qiskit) on Twitter! ## Branch Model There are two main branches in the repository: - ``master`` - This is the development branch. - Next release is going to be developed here. For example, if the current latest release version is r1.0.3, the master branch version will point to r1.1.0 (or r2.0.0). - You should expect this branch to be updated very frequently. - Even though we are always doing our best to not push code that breaks things, is more likely to eventually push code that breaks something... we will fix it ASAP, promise :). - This should not be considered as a stable branch to use in production environments. - The public interface could change without prior notice. - ``stable`` - This is our stable release branch. - It's always synchronized with the latest distributed package, as for now, the package you can download from pip. - The code in this branch is well tested and should be free of errors (unfortunately sometimes it's not). - This is a stable branch (as the name suggest), meaning that you can expect stable software ready for production environments. - All the tags from the release versions are created from this branch. Stable Branch Policy ==================== The stable branch is intended to be a safe source of fixes for high impact bugs and security issues which have been fixed on master since a release. When reviewing a stable branch PR we need to balance the risk of any given patch with the value that it will provide to users of the stable branch. Only a limited class of changes are appropriate for inclusion on the stable branch. A large, risky patch for a major issue might make sense. As might a trivial fix for a fairly obscure error handling case. A number of factors must be weighed when considering a change: - The risk of regression: even the tiniest changes carry some risk of breaking something and we really want to avoid regressions on the stable branch - The user visible benefit: are we fixing something that users might actually notice and, if so, how important is it? - How self-contained the fix is: if it fixes a significant issue but also refactors a lot of code, it’s probably worth thinking about what a less risky fix might look like - Whether the fix is already on master: a change must be a backport of a change already merged onto master, unless the change simply does not make sense on master. Backporting procedure: ---------------------- When backporting a patch from master to stable we want to keep a reference to the change on master. When you create the branch for the stable PR you can use: `$ git cherry-pick -x $master_commit_id` However, this only works for small self contained patches from master. If you need to backport a subset of a larger commit (from a squashed PR for example) from master this just need be done manually. This should be handled by adding:: Backported from: #master pr number in these cases, so we can track the source of the change subset even if a strict cherry pick doesn't make sense. If the patch you’re proposing will not cherry-pick cleanly, you can help by resolving the conflicts yourself and proposing the resulting patch. Please keep Conflicts lines in the commit message to help review of the stable patch. Backport Tags ------------- Bugs or PRs tagged with `stable backport potential` are bugs which apply to the stable release too and may be suitable for backporting once a fix lands in master. Once the backport has been proposed, the tag should be removed. The PR against the stable branch should include `[stable]` in the title, as a sign that setting the target branch as stable was not a mistake. Also, reference to the PR number in master that you are porting. qiskit-aer-0.4.1/LICENSE.txt000066400000000000000000000262301362723322000154130ustar00rootroot00000000000000 Copyright 2018 IBM and its contributors Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018 IBM and its contributors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. qiskit-aer-0.4.1/MANIFEST.in000066400000000000000000000012121362723322000153170ustar00rootroot00000000000000include MANIFEST.in recursive-include qiskit *pyx recursive-include qiskit *pxd recursive-include qiskit *.pxi recursive-include qiskit *cpp recursive-include qiskit *hpp graft src graft contrib include qiskit/providers/aer/backends/wrappers/CMakeLists.txt include qiskit/providers/aer/backends/wrappers/bindings.cc include qiskit/providers/aer/pulse/cy/CMakeLists.txt include qiskit/providers/aer/pulse/qutip_lite/cy/CMakeLists.txt include qiskit/providers/aer/VERSION.txt include CMakeLists.txt include cmake/*.cmake # Exclude static libraries (they are all compressed with 7z) exclude src/third-party/*/lib/*.a exclude src/third-party/*/lib/*.lib qiskit-aer-0.4.1/Makefile.Thrust000066400000000000000000000021311362723322000165120ustar00rootroot00000000000000 PROJECT_SOURCE_DIR=. AER_SIMULATOR_CPP_SRC_DIR=$(PROJECT_SOURCE_DIR)/src AER_SIMULATOR_CPP_MAIN=$(PROJECT_SOURCE_DIR)/contrib/standalone/qasm_simulator.cpp CUCC = /usr/local/cuda/bin/nvcc CXX = /gpfs/wscgpfs01/doichan/gcc/bin/g++ CXXFLAGS= -ccbin $(CXX) -DQASM_THRUST -gencode arch=compute_70,code=sm_70 -std c++14 -I$(AER_SIMULATOR_CPP_SRC_DIR) -Xcompiler "-O3 -fopenmp -ffast-math -isystem $(AER_SIMULATOR_CPP_SRC_DIR)/third-party/headers" -use_fast_math -expt-extended-lambda -I/usr/local/cuda/include -x cu #-DQASM_DEBUG -DQASM_TIMING LDFLAGS=-O3 -fopenmp -std=c++14 LDLIBS = -lpthread -L/usr/local/cuda/lib64 -lcudart -lopenblas LD = $(CXX) #// program =================================================================== MODULE = qasm_simulator SRCSC = \ $(AER_SIMULATOR_CPP_MAIN) \ OBJSC = ${SRCSC:.cpp=.o} #// rules ===================================================================== all: $(MODULE) .SUFFIXES: .o .cpp .cpp.o: $(CUCC) $(CXXFLAGS) -c $< -o $@ $(MODULE): $(OBJSC) rm -f $(MODULE) $(LD) $(OBJSC) $(LDFLAGS) $(LDLIBS) -o $@ clean: rm -f $(OBJSC) $(MODULE) qiskit-aer-0.4.1/README.md000077500000000000000000000077241362723322000150610ustar00rootroot00000000000000# Qiskit Aer [![License](https://img.shields.io/github/license/Qiskit/qiskit-aer.svg?style=popout-square)](https://opensource.org/licenses/Apache-2.0)[![Build Status](https://img.shields.io/travis/com/Qiskit/qiskit-aer/master.svg?style=popout-square)](https://travis-ci.com/Qiskit/qiskit-aer)[![](https://img.shields.io/github/release/Qiskit/qiskit-aer.svg?style=popout-square)](https://github.com/Qiskit/qiskit-aer/releases)[![](https://img.shields.io/pypi/dm/qiskit-aer.svg?style=popout-square)](https://pypi.org/project/qiskit-aer/) **Qiskit** is an open-source framework for working with noisy quantum computers at the level of pulses, circuits, and algorithms. Qiskit is made up of elements that each work together to enable quantum computing. This element is **Aer**, which provides high-performance quantum computing simulators with realistic noise models. ## Installation We encourage installing Qiskit via the PIP tool (a python package manager), which installs all Qiskit elements, including this one. ```bash pip install qiskit ``` PIP will handle all dependencies automatically for us and you will always install the latest (and well-tested) version. To install from source, follow the instructions in the [contribution guidelines](https://github.com/Qiskit/qiskit-aer/blob/master/CONTRIBUTING.md). ## Simulating your first quantum program with Qiskit Aer Now that you have Qiskit Aer installed, you can start simulating quantum circuits with noise. Here is a basic example: ``` $ python ``` ```python from qiskit import QuantumCircuit, execute from qiskit import Aer, IBMQ from qiskit.providers.aer.noise import NoiseModel # Choose a real device to simulate from IBMQ provider provider = IBMQ.load_account() backend = provider.get_backend('ibmq_vigo') coupling_map = backend.configuration().coupling_map # Generate an Aer noise model for device noise_model = NoiseModel.from_backend(backend) basis_gates = noise_model.basis_gates # Generate 3-qubit GHZ state num_qubits = 3 circ = QuantumCircuit(3, 3) circ.h(0) circ.cx(0, 1) circ.cx(1, 2) circ.measure([0, 1, 2], [0, 1 ,2]) # Perform noisy simulation backend = Aer.get_backend('qasm_simulator') job = execute(circ, backend, coupling_map=coupling_map, noise_model=noise_model, basis_gates=basis_gates) result = job.result() print(result.get_counts(0)) ``` ```python {'000': 495, '001': 18, '010': 8, '011': 18, '100': 2, '101': 14, '110': 28, '111': 441} ``` ## Contribution Guidelines If you'd like to contribute to Qiskit, please take a look at our [contribution guidelines](https://github.com/Qiskit/qiskit-aer/blob/master/CONTRIBUTING.md). This project adheres to Qiskit's [code of conduct](https://github.com/Qiskit/qiskit-aer/blob/master/CODE_OF_CONDUCT.md). By participating, you are expect to uphold to this code. We use [GitHub issues](https://github.com/Qiskit/qiskit-aer/issues) for tracking requests and bugs. Please use our [slack](https://qiskit.slack.com) for discussion and simple questions. To join our Slack community use the [link](https://join.slack.com/t/qiskit/shared_invite/enQtNDc2NjUzMjE4Mzc0LTMwZmE0YTM4ZThiNGJmODkzN2Y2NTNlMDIwYWNjYzA2ZmM1YTRlZGQ3OGM0NjcwMjZkZGE0MTA4MGQ1ZTVmYzk). For questions that are more suited for a forum we use the Qiskit tag in the [Stack Exchange](https://quantumcomputing.stackexchange.com/questions/tagged/qiskit). ## Next Steps Now you're set up and ready to check out some of the other examples from our [Qiskit IQX Tutorials](https://github.com/Qiskit/qiskit-iqx-tutorials/tree/master/qiskit/advanced/aer) or [Qiskit Community Tutorials](https://github.com/Qiskit/qiskit-community-tutorials/tree/master/aer) repositories. ## Authors and Citation Qiskit Aer is the work of [many people](https://github.com/Qiskit/qiskit-aer/graphs/contributors) who contribute to the project at different levels. If you use Qiskit, please cite as per the included [BibTeX file](https://github.com/Qiskit/qiskit/blob/master/Qiskit.bib). ## License [Apache License 2.0](LICENSE.txt) qiskit-aer-0.4.1/azure-pipelines.yml000066400000000000000000000156501362723322000174330ustar00rootroot00000000000000# Python package # Create and test a Python package on multiple Python versions. # Add steps that analyze code, save the dist with the build record, publish to a PyPI-compatible index, and more: # https://docs.microsoft.com/azure/devops/pipelines/languages/python trigger: branches: include: - master - stable/* tags: include: - '*' stages: - stage: 'Wheel_Builds' condition: startsWith(variables['Build.SourceBranch'], 'refs/tags') jobs: - job: 'Windows_Wheel_Builds' pool: {vmImage: 'vs2017-win2016'} condition: startsWith(variables['Build.SourceBranch'], 'refs/tags') variables: TWINE_USERNAME: qiskit steps: - checkout: self submodules: true - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts" displayName: Add conda to PATH - bash: | set -x set -e for version in 3.5 3.6 3.7 3.8 ; do conda create --yes --quiet --name qiskit-aer-$version python=$version done displayName: Create Anaconda environments - bash: | set -x set -e mkdir wheelhouse for version in 3.5 3.6 3.7 3.8 ; do source activate qiskit-aer-$version conda update --yes -n base conda conda config --add channels conda-forge conda install --yes --quiet --name qiskit-aer-$version python=$version numpy cmake openblas virtualenv pip setuptools pybind11 cython python setup.py bdist_wheel -- -G "Visual Studio 15 2017 Win64" virtualenv test-$version test-$version/Scripts/pip install dist/*whl test-$version/Scripts/pip install git+https://github.com/Qiskit/qiskit-terra test-$version/Scripts/python tools/verify_wheels.py mv dist/*whl wheelhouse/. rm -rf test-$version rm -rf _skbuild rm -rf .eggs rm -rf qiskit_aer.egg-info rm -rf contrib/standalone/version.hpp done displayName: Build wheels - task: PublishBuildArtifacts@1 inputs: {pathtoPublish: 'wheelhouse'} condition: succeededOrFailed() - bash: | pip install -U twine twine upload wheelhouse/* env: TWINE_PASSWORD: $(TWINE_PASSWORD) - stage: 'Tests' condition: not(startsWith(variables['Build.SourceBranch'], 'refs/tags')) jobs: - job: 'Docs' condition: not(startsWith(variables['Build.SourceBranch'], 'refs/tags')) pool: {vmImage: 'ubuntu-16.04'} strategy: matrix: Python37: python.version: '3.7' steps: - checkout: self submodules: true - task: UsePythonVersion@0 inputs: versionSpec: '$(python.version)' displayName: 'Use Python $(python.version)' - bash: | set -e python -m pip install --upgrade pip virtualenv pip install -U tox sudo apt-get update sudo apt-get install -y build-essential libopenblas-dev displayName: 'Install dependencies' - bash: | tox -edocs -- -j auto displayName: 'Run Docs build' - task: PublishBuildArtifacts@1 displayName: 'Publish docs' inputs: pathtoPublish: 'docs/_build/html' artifactName: 'html_docs' - job: 'Windows' condition: not(startsWith(variables['Build.SourceBranch'], 'refs/tags')) pool: {vmImage: 'vs2017-win2016'} strategy: matrix: Python35: python.version: '3.5' Python36: python.version: '3.6' Python37: python.version: '3.7' Python38: python.version: '3.8' steps: - checkout: self submodules: true - powershell: Write-Host "##vso[task.prependpath]$env:CONDA\Scripts" displayName: Add conda to PATH - script: conda create --yes --quiet --name qiskit-aer-$(Build.BuildNumber) python=%PYTHON_VERSION% displayName: Create Anaconda environment - bash: | set -x set -e source activate qiskit-aer-$(Build.BuildNumber) conda install --yes --quiet --name qiskit-aer-$(Build.BuildNumber) python==$(python.version) numpy pip virtualenv conda install -c conda-forge --yes --quiet --name qiskit-aer-$(Build.BuildNumber) python==$(python.version) setuptools displayName: Install Anaconda packages condition: ne(variables['python.version'], '3.5') - bash: | set -x set -e source activate qiskit-aer-$(Build.BuildNumber) conda install --yes --quiet --name qiskit-aer-$(Build.BuildNumber) python=$(python.version) mkl conda install -c conda-forge --yes --quiet --name qiskit-aer-$(Build.BuildNumber) python=$(python.version) openblas pip setuptools displayName: Install Anaconda packages condition: or(eq(variables['python.version'], '3.5'), eq(variables['python.version'], '3.8')) - bash: | set -e source activate qiskit-aer-$(Build.BuildNumber) conda install -c conda-forge --yes --quiet --name qiskit-aer-$(Build.BuildNumber) python=$(python.version) osqp pip install -r requirements-dev.txt if [[ $SYSTEM_PULLREQUEST_TARGETBRANCH == "master" || $BUILD_SOURCEBRANCH == "master" ]] ; then pip install git+https://github.com/Qiskit/qiskit-terra.git else pip install qiskit-terra fi displayName: "Install dependencies py3.8" condition: eq(variables['python.version'], '3.8') - bash: | set -e source activate qiskit-aer-$(Build.BuildNumber) pip install -r requirements-dev.txt if [[ $SYSTEM_PULLREQUEST_TARGETBRANCH == "master" || $BUILD_SOURCEBRANCH == "master" ]] ; then pip install git+https://github.com/Qiskit/qiskit-terra.git else pip install qiskit-terra fi displayName: "Install dependencies" condition: ne(variables['python.version'], '3.8') - bash: | set -e source activate qiskit-aer-$(Build.BuildNumber) git clean -fdX python setup.py bdist_wheel -- -G "Visual Studio 15 2017 Win64" displayName: 'Build Aer' - bash: | set -e source activate qiskit-aer-$(Build.BuildNumber) pip install -v dist/qiskit_aer*.whl stestr run --slowest displayName: 'Install Aer and Run Tests' qiskit-aer-0.4.1/cmake/000077500000000000000000000000001362723322000146455ustar00rootroot00000000000000qiskit-aer-0.4.1/cmake/FindBLAS.cmake.fix-static-linking000066400000000000000000000457541362723322000227130ustar00rootroot00000000000000# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. #.rst: # FindBLAS # -------- # # Find BLAS library # # This module finds an installed fortran library that implements the # BLAS linear-algebra interface (see http://www.netlib.org/blas/). The # list of libraries searched for is taken from the autoconf macro file, # acx_blas.m4 (distributed at # http://ac-archive.sourceforge.net/ac-archive/acx_blas.html). # # This module sets the following variables: # # :: # # BLAS_FOUND - set to true if a library implementing the BLAS interface # is found # BLAS_LINKER_FLAGS - uncached list of required linker flags (excluding -l # and -L). # BLAS_LIBRARIES - uncached list of libraries (using full path name) to # link against to use BLAS # BLAS95_LIBRARIES - uncached list of libraries (using full path name) # to link against to use BLAS95 interface # BLAS95_FOUND - set to true if a library implementing the BLAS f95 interface # is found # # The following variables can be used to control this module: # # :: # # BLA_STATIC if set on this determines what kind of linkage we do (static) # BLA_VENDOR if set checks only the specified vendor, if not set checks # all the possibilities # BLA_F95 if set on tries to find the f95 interfaces for BLAS/LAPACK # BLA_PREFER_PKGCONFIG if set pkg-config will be used to search for a BLAS # library first and if one is found that is preferred # # List of vendors (BLA_VENDOR) valid in this module: # # * Goto # * OpenBLAS # * FLAME # * ATLAS PhiPACK # * CXML # * DXML # * SunPerf # * SCSL # * SGIMATH # * IBMESSL # * Intel10_32 (intel mkl v10 32 bit) # * Intel10_64lp (intel mkl v10 64 bit, lp thread model, lp64 model) # * Intel10_64lp_seq (intel mkl v10 64 bit, sequential code, lp64 model) # * Intel (older versions of mkl 32 and 64 bit) # * ACML # * ACML_MP # * ACML_GPU # * Apple # * NAS # * Generic # # .. note:: # # C/CXX should be enabled to use Intel mkl # include(${CMAKE_CURRENT_LIST_DIR}/CheckFunctionExists.cmake) include(${CMAKE_CURRENT_LIST_DIR}/CheckFortranFunctionExists.cmake) include(${CMAKE_CURRENT_LIST_DIR}/CMakePushCheckState.cmake) include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake) cmake_push_check_state() set(CMAKE_REQUIRED_QUIET ${BLAS_FIND_QUIETLY}) set(_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) # Check the language being used if( NOT (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED OR CMAKE_Fortran_COMPILER_LOADED) ) if(BLAS_FIND_REQUIRED) message(FATAL_ERROR "FindBLAS requires Fortran, C, or C++ to be enabled.") else() message(STATUS "Looking for BLAS... - NOT found (Unsupported languages)") return() endif() endif() if(BLA_PREFER_PKGCONFIG) find_package(PkgConfig) pkg_check_modules(PKGC_BLAS blas) if(PKGC_BLAS_FOUND) set(BLAS_LIBRARIES "${PKGC_BLAS_LINK_LIBRARIES}") return() endif() endif() macro(Check_Fortran_Libraries LIBRARIES _prefix _name _flags _list _thread) # This macro checks for the existence of the combination of fortran libraries # given by _list. If the combination is found, this macro checks (using the # Check_Fortran_Function_Exists macro) whether can link against that library # combination using the name of a routine given by _name using the linker # flags given by _flags. If the combination of libraries is found and passes # the link test, LIBRARIES is set to the list of complete library paths that # have been found. Otherwise, LIBRARIES is set to FALSE. # N.B. _prefix is the prefix applied to the names of all cached variables that # are generated internally and marked advanced by this macro. set(_libdir ${ARGN}) set(_libraries_work TRUE) set(${LIBRARIES}) set(_combined_name) if (NOT _libdir) if (WIN32) set(_libdir ENV LIB) elseif (APPLE) set(_libdir ENV DYLD_LIBRARY_PATH) else () set(_libdir ENV LD_LIBRARY_PATH) endif () endif () foreach(_library ${_list}) set(_combined_name ${_combined_name}_${_library}) if(_libraries_work) if (BLA_STATIC) if (WIN32) set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif () if (APPLE) set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) else () set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) endif () else () if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # for ubuntu's libblas3gf and liblapack3gf packages set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .so.3gf) endif () endif () find_library(${_prefix}_${_library}_LIBRARY NAMES ${_library} PATHS ${_libdir} ) mark_as_advanced(${_prefix}_${_library}_LIBRARY) set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) set(_libraries_work ${${_prefix}_${_library}_LIBRARY}) endif() endforeach() if(_libraries_work) # Test this combination of libraries. set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_thread}) # message("DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}") if (CMAKE_Fortran_COMPILER_LOADED) check_fortran_function_exists("${_name}" ${_prefix}${_combined_name}_WORKS) else() check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) endif() set(CMAKE_REQUIRED_LIBRARIES) mark_as_advanced(${_prefix}${_combined_name}_WORKS) set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) endif() if(NOT _libraries_work) set(${LIBRARIES} FALSE) endif() #message("DEBUG: ${LIBRARIES} = ${${LIBRARIES}}") endmacro() set(BLAS_LINKER_FLAGS) set(BLAS_LIBRARIES) set(BLAS95_LIBRARIES) if (NOT $ENV{BLA_VENDOR} STREQUAL "") set(BLA_VENDOR $ENV{BLA_VENDOR}) else () if(NOT BLA_VENDOR) set(BLA_VENDOR "All") endif() endif () if (BLA_VENDOR STREQUAL "Goto" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) # gotoblas (http://www.tacc.utexas.edu/tacc-projects/gotoblas2) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "goto2" "" ) endif() endif () if (BLA_VENDOR STREQUAL "OpenBLAS" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) # OpenBLAS (http://www.openblas.net) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "openblas" "pthread" ) endif() endif () if (BLA_VENDOR STREQUAL "FLAME" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) # FLAME's blis library (https://github.com/flame/blis) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "blis" "" ) endif() endif () if (BLA_VENDOR STREQUAL "ATLAS" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/) check_fortran_libraries( BLAS_LIBRARIES BLAS dgemm "" "f77blas;atlas" "" ) endif() endif () # BLAS in PhiPACK libraries? (requires generic BLAS lib, too) if (BLA_VENDOR STREQUAL "PhiPACK" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "sgemm;dgemm;blas" "" ) endif() endif () # BLAS in Alpha CXML library? if (BLA_VENDOR STREQUAL "CXML" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "cxml" "" ) endif() endif () # BLAS in Alpha DXML library? (now called CXML, see above) if (BLA_VENDOR STREQUAL "DXML" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "dxml" "" ) endif() endif () # BLAS in Sun Performance library? if (BLA_VENDOR STREQUAL "SunPerf" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "-xlic_lib=sunperf" "sunperf;sunmath" "" ) if(BLAS_LIBRARIES) set(BLAS_LINKER_FLAGS "-xlic_lib=sunperf") endif() endif() endif () # BLAS in SCSL library? (SGI/Cray Scientific Library) if (BLA_VENDOR STREQUAL "SCSL" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "scsl" "" ) endif() endif () # BLAS in SGIMATH library? if (BLA_VENDOR STREQUAL "SGIMATH" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "complib.sgimath" "" ) endif() endif () # BLAS in IBM ESSL library? (requires generic BLAS lib, too) if (BLA_VENDOR STREQUAL "IBMESSL" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "essl;blas" "" ) endif() endif () #BLAS in acml library? if (BLA_VENDOR MATCHES "ACML" OR BLA_VENDOR STREQUAL "All") if( ((BLA_VENDOR STREQUAL "ACML") AND (NOT BLAS_ACML_LIB_DIRS)) OR ((BLA_VENDOR STREQUAL "ACML_MP") AND (NOT BLAS_ACML_MP_LIB_DIRS)) OR ((BLA_VENDOR STREQUAL "ACML_GPU") AND (NOT BLAS_ACML_GPU_LIB_DIRS)) ) # try to find acml in "standard" paths if( WIN32 ) file( GLOB _ACML_ROOT "C:/AMD/acml*/ACML-EULA.txt" ) else() file( GLOB _ACML_ROOT "/opt/acml*/ACML-EULA.txt" ) endif() if( WIN32 ) file( GLOB _ACML_GPU_ROOT "C:/AMD/acml*/GPGPUexamples" ) else() file( GLOB _ACML_GPU_ROOT "/opt/acml*/GPGPUexamples" ) endif() list(GET _ACML_ROOT 0 _ACML_ROOT) list(GET _ACML_GPU_ROOT 0 _ACML_GPU_ROOT) if( _ACML_ROOT ) get_filename_component( _ACML_ROOT ${_ACML_ROOT} PATH ) if( SIZEOF_INTEGER EQUAL 8 ) set( _ACML_PATH_SUFFIX "_int64" ) else() set( _ACML_PATH_SUFFIX "" ) endif() if( CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" ) set( _ACML_COMPILER32 "ifort32" ) set( _ACML_COMPILER64 "ifort64" ) elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "SunPro" ) set( _ACML_COMPILER32 "sun32" ) set( _ACML_COMPILER64 "sun64" ) elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" ) set( _ACML_COMPILER32 "pgi32" ) if( WIN32 ) set( _ACML_COMPILER64 "win64" ) else() set( _ACML_COMPILER64 "pgi64" ) endif() elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "Open64" ) # 32 bit builds not supported on Open64 but for code simplicity # We'll just use the same directory twice set( _ACML_COMPILER32 "open64_64" ) set( _ACML_COMPILER64 "open64_64" ) elseif( CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" ) set( _ACML_COMPILER32 "nag32" ) set( _ACML_COMPILER64 "nag64" ) else() set( _ACML_COMPILER32 "gfortran32" ) set( _ACML_COMPILER64 "gfortran64" ) endif() if( BLA_VENDOR STREQUAL "ACML_MP" ) set(_ACML_MP_LIB_DIRS "${_ACML_ROOT}/${_ACML_COMPILER32}_mp${_ACML_PATH_SUFFIX}/lib" "${_ACML_ROOT}/${_ACML_COMPILER64}_mp${_ACML_PATH_SUFFIX}/lib" ) else() set(_ACML_LIB_DIRS "${_ACML_ROOT}/${_ACML_COMPILER32}${_ACML_PATH_SUFFIX}/lib" "${_ACML_ROOT}/${_ACML_COMPILER64}${_ACML_PATH_SUFFIX}/lib" ) endif() endif() elseif(BLAS_${BLA_VENDOR}_LIB_DIRS) set(_${BLA_VENDOR}_LIB_DIRS ${BLAS_${BLA_VENDOR}_LIB_DIRS}) endif() if( BLA_VENDOR STREQUAL "ACML_MP" ) foreach( BLAS_ACML_MP_LIB_DIRS ${_ACML_MP_LIB_DIRS}) check_fortran_libraries ( BLAS_LIBRARIES BLAS sgemm "" "acml_mp;acml_mv" "" ${BLAS_ACML_MP_LIB_DIRS} ) if( BLAS_LIBRARIES ) break() endif() endforeach() elseif( BLA_VENDOR STREQUAL "ACML_GPU" ) foreach( BLAS_ACML_GPU_LIB_DIRS ${_ACML_GPU_LIB_DIRS}) check_fortran_libraries ( BLAS_LIBRARIES BLAS sgemm "" "acml;acml_mv;CALBLAS" "" ${BLAS_ACML_GPU_LIB_DIRS} ) if( BLAS_LIBRARIES ) break() endif() endforeach() else() foreach( BLAS_ACML_LIB_DIRS ${_ACML_LIB_DIRS} ) check_fortran_libraries ( BLAS_LIBRARIES BLAS sgemm "" "acml;acml_mv" "" ${BLAS_ACML_LIB_DIRS} ) if( BLAS_LIBRARIES ) break() endif() endforeach() endif() # Either acml or acml_mp should be in LD_LIBRARY_PATH but not both if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "acml;acml_mv" "" ) endif() if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "acml_mp;acml_mv" "" ) endif() if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "acml;acml_mv;CALBLAS" "" ) endif() endif () # ACML # Apple BLAS library? if (BLA_VENDOR STREQUAL "Apple" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS dgemm "" "Accelerate" "" ) endif() endif () if (BLA_VENDOR STREQUAL "NAS" OR BLA_VENDOR STREQUAL "All") if ( NOT BLAS_LIBRARIES ) check_fortran_libraries( BLAS_LIBRARIES BLAS dgemm "" "vecLib" "" ) endif () endif () # Generic BLAS library? if (BLA_VENDOR STREQUAL "Generic" OR BLA_VENDOR STREQUAL "All") if(NOT BLAS_LIBRARIES) check_fortran_libraries( BLAS_LIBRARIES BLAS sgemm "" "blas" "" ) endif() endif () #BLAS in intel mkl 10 library? (em64t 64bit) if (BLA_VENDOR MATCHES "Intel" OR BLA_VENDOR STREQUAL "All") if (NOT WIN32) set(LM "-lm") endif () if (CMAKE_C_COMPILER_LOADED OR CMAKE_CXX_COMPILER_LOADED) if(BLAS_FIND_QUIETLY OR NOT BLAS_FIND_REQUIRED) find_package(Threads) else() find_package(Threads REQUIRED) endif() set(BLAS_SEARCH_LIBS "") if(BLA_F95) set(BLAS_mkl_SEARCH_SYMBOL SGEMM) set(_LIBRARIES BLAS95_LIBRARIES) if (WIN32) if (BLA_STATIC) set(BLAS_mkl_DLL_SUFFIX "") else() set(BLAS_mkl_DLL_SUFFIX "_dll") endif() # Find the main file (32-bit or 64-bit) set(BLAS_SEARCH_LIBS_WIN_MAIN "") if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN "mkl_blas95${BLAS_mkl_DLL_SUFFIX} mkl_intel_c${BLAS_mkl_DLL_SUFFIX}") endif() if (BLA_VENDOR MATCHES "^Intel10_64lp" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN "mkl_blas95_lp64${BLAS_mkl_DLL_SUFFIX} mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}") endif () # Add threading/sequential libs set(BLAS_SEARCH_LIBS_WIN_THREAD "") if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD "mkl_sequential${BLAS_mkl_DLL_SUFFIX}") endif() if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All") # old version list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") # mkl >= 10.3 list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") endif() # Cartesian product of the above foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN}) foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD}) list(APPEND BLAS_SEARCH_LIBS "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}") endforeach() endforeach() else () if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS "mkl_blas95 mkl_intel mkl_intel_thread mkl_core guide") endif () if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All") # old version list(APPEND BLAS_SEARCH_LIBS "mkl_blas95 mkl_intel_lp64 mkl_intel_thread mkl_core guide") # mkl >= 10.3 if (CMAKE_C_COMPILER MATCHES ".+gcc") list(APPEND BLAS_SEARCH_LIBS "mkl_blas95_lp64 mkl_intel_lp64 mkl_gnu_thread mkl_core gomp") else () list(APPEND BLAS_SEARCH_LIBS "mkl_blas95_lp64 mkl_intel_lp64 mkl_intel_thread mkl_core iomp5") endif () endif () if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS "mkl_intel_lp64 mkl_sequential mkl_core") endif () endif () else () set(BLAS_mkl_SEARCH_SYMBOL sgemm) set(_LIBRARIES BLAS_LIBRARIES) if (WIN32) if (BLA_STATIC) set(BLAS_mkl_DLL_SUFFIX "") else() set(BLAS_mkl_DLL_SUFFIX "_dll") endif() # Find the main file (32-bit or 64-bit) set(BLAS_SEARCH_LIBS_WIN_MAIN "") if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN "mkl_intel_c${BLAS_mkl_DLL_SUFFIX}") endif() if (BLA_VENDOR MATCHES "^Intel10_64lp" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS_WIN_MAIN "mkl_intel_lp64${BLAS_mkl_DLL_SUFFIX}") endif () # Add threading/sequential libs set(BLAS_SEARCH_LIBS_WIN_THREAD "") if (NOT BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All") # old version list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD "libguide40 mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") # mkl >= 10.3 list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD "libiomp5md mkl_intel_thread${BLAS_mkl_DLL_SUFFIX}") endif() if (BLA_VENDOR MATCHES "_seq$" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS_WIN_THREAD "mkl_sequential${BLAS_mkl_DLL_SUFFIX}") endif() # Cartesian product of the above foreach (MAIN ${BLAS_SEARCH_LIBS_WIN_MAIN}) foreach (THREAD ${BLAS_SEARCH_LIBS_WIN_THREAD}) list(APPEND BLAS_SEARCH_LIBS "${MAIN} ${THREAD} mkl_core${BLAS_mkl_DLL_SUFFIX}") endforeach() endforeach() else () if (BLA_VENDOR STREQUAL "Intel10_32" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS "mkl_intel mkl_intel_thread mkl_core guide") endif () if (BLA_VENDOR STREQUAL "Intel10_64lp" OR BLA_VENDOR STREQUAL "All") # old version list(APPEND BLAS_SEARCH_LIBS "mkl_intel_lp64 mkl_intel_thread mkl_core guide") # mkl >= 10.3 if (CMAKE_C_COMPILER MATCHES ".+gcc") list(APPEND BLAS_SEARCH_LIBS "mkl_intel_lp64 mkl_gnu_thread mkl_core gomp") else () list(APPEND BLAS_SEARCH_LIBS "mkl_intel_lp64 mkl_intel_thread mkl_core iomp5") endif () endif () if (BLA_VENDOR STREQUAL "Intel10_64lp_seq" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS "mkl_intel_lp64 mkl_sequential mkl_core") endif () #older vesions of intel mkl libs if (BLA_VENDOR STREQUAL "Intel" OR BLA_VENDOR STREQUAL "All") list(APPEND BLAS_SEARCH_LIBS "mkl") list(APPEND BLAS_SEARCH_LIBS "mkl_ia32") list(APPEND BLAS_SEARCH_LIBS "mkl_em64t") endif () endif () endif () foreach (IT ${BLAS_SEARCH_LIBS}) string(REPLACE " " ";" SEARCH_LIBS ${IT}) if (NOT ${_LIBRARIES}) check_fortran_libraries( ${_LIBRARIES} BLAS ${BLAS_mkl_SEARCH_SYMBOL} "" "${SEARCH_LIBS}" "${CMAKE_THREAD_LIBS_INIT};${LM}" ) endif () endforeach () endif () endif () if(BLA_F95) find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS95_LIBRARIES) set(BLAS95_FOUND ${BLAS_FOUND}) if(BLAS_FOUND) set(BLAS_LIBRARIES "${BLAS95_LIBRARIES}") endif() else() find_package_handle_standard_args(BLAS REQUIRED_VARS BLAS_LIBRARIES) endif() cmake_pop_check_state() set(CMAKE_FIND_LIBRARY_SUFFIXES ${_blas_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) qiskit-aer-0.4.1/cmake/FindCatch2.cmake000066400000000000000000000006141362723322000175550ustar00rootroot00000000000000find_package(Catch2 CONFIG QUIET) if(NOT Catch2_FOUND) message("Catch2_PATH is ${Catch2_PATH}") find_path(CATCH2_INCLUDE_DIR catch.hpp PATH ${Catch2_PATH}) message("Catch2 include dir: ${CATCH2_INCLUDE_DIR}") add_library(Catch2::Catch INTERFACE IMPORTED) set_target_properties(Catch2::Catch PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CATCH2_INCLUDE_DIR}) endif() qiskit-aer-0.4.1/cmake/FindCython.cmake000066400000000000000000000051161362723322000177170ustar00rootroot00000000000000#.rst: # # Find ``cython`` executable. # # This module will set the following variables in your project: # # ``CYTHON_EXECUTABLE`` # path to the ``cython`` program # # ``CYTHON_VERSION`` # version of ``cython`` # # ``CYTHON_FOUND`` # true if the program was found # # For more information on the Cython project, see http://cython.org/. # # *Cython is a language that makes writing C extensions for the Python language # as easy as Python itself.* # #============================================================================= # Copyright 2011 Kitware, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #============================================================================= # Use the Cython executable that lives next to the Python executable # if it is a local installation. find_package(PythonInterp) if(PYTHONINTERP_FOUND) get_filename_component(_python_path ${PYTHON_EXECUTABLE} PATH) find_program(CYTHON_EXECUTABLE NAMES cython cython.bat cython3 HINTS ${_python_path} DOC "path to the cython executable") else() find_program(CYTHON_EXECUTABLE NAMES cython cython.bat cython3 DOC "path to the cython executable") endif() if(CYTHON_EXECUTABLE) set(CYTHON_version_command ${CYTHON_EXECUTABLE} --version) execute_process(COMMAND ${CYTHON_version_command} OUTPUT_VARIABLE CYTHON_version_output ERROR_VARIABLE CYTHON_version_error RESULT_VARIABLE CYTHON_version_result OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT ${CYTHON_version_result} EQUAL 0) set(_error_msg "Command \"${CYTHON_version_command}\" failed with") set(_error_msg "${_error_msg} output:\n${CYTHON_version_error}") message(SEND_ERROR "${_error_msg}") else() if("${CYTHON_version_output}" MATCHES "^[Cc]ython version ([^,]+)") set(CYTHON_VERSION "${CMAKE_MATCH_1}") endif() endif() endif() include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Cython REQUIRED_VARS CYTHON_EXECUTABLE) mark_as_advanced(CYTHON_EXECUTABLE) include(UseCython) qiskit-aer-0.4.1/cmake/FindMuparserx.cmake000066400000000000000000000024631362723322000204430ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2020. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. #.rst: # FindMuparserx # ============= # This module finds a muparserx library installed in the system (see https://beltoforion.de/article.php?a=muparserx # and https://github.com/beltoforion/muparserx). # # This module defines the following target: # # :: # # PkgConfig::muparserx # # and sets the typical package variables: # # :: # # muparserx_FOUND # muparserx_INCLUDE_DIRS # muparserx_LIBRARIES # muparserx_VERSION # .... # find_package(PkgConfig QUIET) pkg_check_modules(muparserx QUIET IMPORTED_TARGET muparserx) if(NOT muparserx_FIND_QUIETLY) if(NOT muparserx_FOUND) message(FATAL_ERROR "muparserx library not found!") endif() endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(muparserx REQUIRED_VARS muparserx_INCLUDE_DIRS muparserx_LIBRARIES VERSION_VAR muparserx_VERSION) qiskit-aer-0.4.1/cmake/FindPkgMacros.cmake000066400000000000000000000137631362723322000203500ustar00rootroot00000000000000#------------------------------------------------------------------- # This file is part of the CMake build system for OGRE # (Object-oriented Graphics Rendering Engine) # For the latest info, see http://www.ogre3d.org/ # # The contents of this file are placed in the public domain. Feel # free to make use of it in any way you like. #------------------------------------------------------------------- ################################################################## # Provides some common functionality for the FindPackage modules ################################################################## # Begin processing of package macro(findpkg_begin PREFIX) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Looking for ${PREFIX}...") endif () endmacro(findpkg_begin) # Display a status message unless FIND_QUIETLY is set macro(pkg_message PREFIX) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS ${ARGN}) endif () endmacro(pkg_message) # Get environment variable, define it as ENV_$var and make sure backslashes are converted to forward slashes macro(getenv_path VAR) set(ENV_${VAR} $ENV{${VAR}}) # replace won't work if var is blank if (ENV_${VAR}) string( REGEX REPLACE "\\\\" "/" ENV_${VAR} ${ENV_${VAR}} ) endif () endmacro(getenv_path) # Construct search paths for includes and libraries from a PREFIX_PATH macro(create_search_paths PREFIX) foreach(dir ${${PREFIX}_PREFIX_PATH}) set(${PREFIX}_INC_SEARCH_PATH ${${PREFIX}_INC_SEARCH_PATH} ${dir}/include ${dir}/Include ${dir}/include/${PREFIX} ${dir}/Headers) set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${dir}/lib ${dir}/Lib ${dir}/lib/${PREFIX} ${dir}/Libs) set(${PREFIX}_BIN_SEARCH_PATH ${${PREFIX}_BIN_SEARCH_PATH} ${dir}/bin) endforeach(dir) if(ANDROID) set(${PREFIX}_LIB_SEARCH_PATH ${${PREFIX}_LIB_SEARCH_PATH} ${OGRE_DEPENDENCIES_DIR}/lib/${ANDROID_ABI}) endif() set(${PREFIX}_FRAMEWORK_SEARCH_PATH ${${PREFIX}_PREFIX_PATH}) endmacro(create_search_paths) # clear cache variables if a certain variable changed macro(clear_if_changed TESTVAR) # test against internal check variable # HACK: Apparently, adding a variable to the cache cleans up the list # a bit. We need to also remove any empty strings from the list, but # at the same time ensure that we are actually dealing with a list. list(APPEND ${TESTVAR} "") list(REMOVE_ITEM ${TESTVAR} "") if (NOT "${${TESTVAR}}" STREQUAL "${${TESTVAR}_INT_CHECK}") message(STATUS "${TESTVAR} changed.") foreach(var ${ARGN}) set(${var} "NOTFOUND" CACHE STRING "x" FORCE) endforeach(var) endif () set(${TESTVAR}_INT_CHECK ${${TESTVAR}} CACHE INTERNAL "x" FORCE) endmacro(clear_if_changed) # Try to get some hints from pkg-config, if available macro(use_pkgconfig PREFIX PKGNAME) if(NOT ANDROID) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(${PREFIX} ${PKGNAME}) endif () endif() endmacro (use_pkgconfig) # Couple a set of release AND debug libraries (or frameworks) macro(make_library_set PREFIX) if (${PREFIX}_FWK) set(${PREFIX} ${${PREFIX}_FWK}) elseif (${PREFIX}_REL AND ${PREFIX}_DBG) set(${PREFIX} optimized ${${PREFIX}_REL} debug ${${PREFIX}_DBG}) elseif (${PREFIX}_REL) set(${PREFIX} ${${PREFIX}_REL}) elseif (${PREFIX}_DBG) set(${PREFIX} ${${PREFIX}_DBG}) endif () endmacro(make_library_set) # Generate debug names from given release names macro(get_debug_names PREFIX) foreach(i ${${PREFIX}}) set(${PREFIX}_DBG ${${PREFIX}_DBG} ${i}d ${i}D ${i}_d ${i}_D ${i}_debug) endforeach(i) endmacro(get_debug_names) # Add the parent dir from DIR to VAR macro(add_parent_dir VAR DIR) get_filename_component(${DIR}_TEMP "${${DIR}}/.." ABSOLUTE) set(${VAR} ${${VAR}} ${${DIR}_TEMP}) endmacro(add_parent_dir) # Do the final processing for the package find. macro(findpkg_finish PREFIX) # skip if already processed during this run if (NOT ${PREFIX}_FOUND) if (${PREFIX}_INCLUDE_DIR AND ${PREFIX}_LIBRARY) set(${PREFIX}_FOUND TRUE) set(${PREFIX}_INCLUDE_DIRS ${${PREFIX}_INCLUDE_DIR}) set(${PREFIX}_LIBRARIES ${${PREFIX}_LIBRARY}) if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Found ${PREFIX}: ${${PREFIX}_LIBRARIES}") endif () else () if (NOT ${PREFIX}_FIND_QUIETLY) message(STATUS "Could not locate ${PREFIX}") endif () if (${PREFIX}_FIND_REQUIRED) message(FATAL_ERROR "Required library ${PREFIX} not found! Install the library (including dev packages) and try again. If the library is already installed, set the missing variables manually in cmake.") endif () endif () mark_as_advanced(${PREFIX}_INCLUDE_DIR ${PREFIX}_LIBRARY ${PREFIX}_LIBRARY_REL ${PREFIX}_LIBRARY_DBG ${PREFIX}_LIBRARY_FWK) endif () endmacro(findpkg_finish) # Slightly customised framework finder macro(findpkg_framework fwk) if(APPLE) set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_SEARCH_PATH} ${CMAKE_FRAMEWORK_PATH} ~/Library/Frameworks /Library/Frameworks /System/Library/Frameworks /Network/Library/Frameworks ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Release ${CMAKE_CURRENT_SOURCE_DIR}/lib/macosx/Debug ) # These could be arrays of paths, add each individually to the search paths foreach(i ${OGRE_PREFIX_PATH}) set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) endforeach(i) foreach(i ${OGRE_PREFIX_BUILD}) set(${fwk}_FRAMEWORK_PATH ${${fwk}_FRAMEWORK_PATH} ${i}/lib/macosx/Release ${i}/lib/macosx/Debug) endforeach(i) foreach(dir ${${fwk}_FRAMEWORK_PATH}) set(fwkpath ${dir}/${fwk}.framework) if(EXISTS ${fwkpath}) set(${fwk}_FRAMEWORK_INCLUDES ${${fwk}_FRAMEWORK_INCLUDES} ${fwkpath}/Headers ${fwkpath}/PrivateHeaders) set(${fwk}_FRAMEWORK_PATH ${dir}) if (NOT ${fwk}_LIBRARY_FWK) set(${fwk}_LIBRARY_FWK "-framework ${fwk}") endif () endif(EXISTS ${fwkpath}) endforeach(dir) endif(APPLE) endmacro(findpkg_framework) qiskit-aer-0.4.1/cmake/FindPybind11.cmake000066400000000000000000000113521362723322000200410ustar00rootroot00000000000000find_package(PythonExtensions REQUIRED) find_package(PythonLibs REQUIRED) message(STATUS ${PYTHON_INCLUDE_DIRS}) message(STATUS "PYTHON EXECUTABLE: ${PYTHON_EXECUTABLE}") # Pybind includes are searched for through python # If they aren't found, we set them to the python include directories # set by CMake set(_find_pybind_includes_command " import sys import pybind11 sys.stdout.write(pybind11.get_include()) ") execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c "${_find_pybind_includes_command}" OUTPUT_VARIABLE _py_output RESULT_VARIABLE _py_result) if(_py_result EQUAL "0") message(STATUS "PYCOMM RAW: ${_py_output}") set(PYBIND_INCLUDE_DIRS "${_py_output}") else() message(WARNING "(NAIVE) CHECK COULD NOT FIND PYBIND!") set(PYBIND_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS}) endif() message(STATUS "PYBIND INCLUDES: ${PYBIND_INCLUDE_DIRS}") function(basic_pybind11_add_module target_name) set(options MODULE SHARED EXCLUDE_FROM_ALL NO_EXTRAS SYSTEM THIN_LTO) cmake_parse_arguments(ARG "${options}" "" "" ${ARGN}) if(ARG_MODULE AND ARG_SHARED) message(FATAL_ERROR "Can't be both MODULE and SHARED") elseif(ARG_SHARED) set(lib_type SHARED) else() set(lib_type MODULE) endif() if(ARG_EXCLUDE_FROM_ALL) set(exclude_from_all EXCLUDE_FROM_ALL) endif() if(CUDA_FOUND) cuda_add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS}) else() add_library(${target_name} ${lib_type} ${exclude_from_all} ${ARG_UNPARSED_ARGUMENTS}) endif() # This sets various properties (python include dirs) and links to python libs target_include_directories(${target_name} PRIVATE ${PYTHON_INCLUDE_DIRS}) target_include_directories(${target_name} PRIVATE ${PYBIND_INCLUDE_DIRS}) if(WIN32 OR CYGWIN) # Link against the Python shared library on Windows target_link_libraries(${target_name} ${PYTHON_LIBRARIES}) elseif(APPLE) # It's quite common to have multiple copies of the same Python version # installed on one's system. E.g.: one copy from the OS and another copy # that's statically linked into an application like Blender or Maya. # If we link our plugin library against the OS Python here and import it # into Blender or Maya later on, this will cause segfaults when multiple # conflicting Python instances are active at the same time (even when they # are of the same version). # Windows is not affected by this issue since it handles DLL imports # differently. The solution for Linux and Mac OS is simple: we just don't # link against the Python library. The resulting shared library will have # missing symbols, but that's perfectly fine -- they will be resolved at # import time. # Set some general flags if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(AER_LINKER_FLAGS "${AER_LINKER_FLAGS} -undefined dynamic_lookup") else() # -flat_namespace linker flag is needed otherwise dynamic symbol resolution doesn't work as expected with GCC. # Symbols with the same name exist in different .so, so the loader just takes the first one it finds, # which is usually the one from the first .so loaded. # See: Two-Leve namespace symbol resolution set(AER_LINKER_FLAGS "${AER_LINKER_FLAGS} -undefined dynamic_lookup -flat_namespace") endif() if(ARG_SHARED) set_target_properties(${target_name} PROPERTIES MACOSX_RPATH ON) endif() endif() # -fvisibility=hidden is required to allow multiple modules compiled against # different pybind versions to work properly, and for some features (e.g. # py::module_local). We force it on everything inside the `pybind11` # namespace; also turning it on for a pybind module compilation here avoids # potential warnings or issues from having mixed hidden/non-hidden types. set_target_properties(${target_name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}") set_target_properties(${target_name} PROPERTIES SUFFIX "${PYTHON_EXTENSION_MODULE_SUFFIX}") set_target_properties(${target_name} PROPERTIES CXX_VISIBILITY_PRESET "hidden") set_target_properties(${target_name} PROPERTIES CUDA_VISIBILITY_PRESET "hidden") set_target_properties(${target_name} PROPERTIES CXX_STANDARD 14 LINKER_LANGUAGE CXX) # Warning: Do not merge PROPERTIES when one of the variables can be empty, it breaks # the rest of the properties so they are not properly added. set_target_properties(${target_name} PROPERTIES LINK_FLAGS ${AER_LINKER_FLAGS}) set_target_properties(${target_name} PROPERTIES COMPILE_FLAGS ${AER_COMPILER_FLAGS}) endfunction() qiskit-aer-0.4.1/cmake/FindPythonExtensions.cmake000066400000000000000000000516161362723322000220220ustar00rootroot00000000000000#.rst: # # This module defines CMake functions to build Python extension modules and # stand-alone executables. # # The following variables are defined: # :: # # PYTHON_PREFIX - absolute path to the current Python # distribution's prefix # PYTHON_SITE_PACKAGES_DIR - absolute path to the current Python # distribution's site-packages directory # PYTHON_RELATIVE_SITE_PACKAGES_DIR - path to the current Python # distribution's site-packages directory # relative to its prefix # PYTHON_SEPARATOR - separator string for file path # components. Equivalent to ``os.sep`` in # Python. # PYTHON_PATH_SEPARATOR - separator string for PATH-style # environment variables. Equivalent to # ``os.pathsep`` in Python. # PYTHON_EXTENSION_MODULE_SUFFIX - suffix of the compiled module. For example, on # Linux, based on environment, it could be ``.cpython-35m-x86_64-linux-gnu.so``. # # # # The following functions are defined: # # .. cmake:command:: python_extension_module # # For libraries meant to be used as Python extension modules, either dynamically # loaded or directly linked. Amend the configuration of the library target # (created using ``add_library``) with additional options needed to build and # use the referenced library as a Python extension module. # # python_extension_module( # [LINKED_MODULES_VAR ] # [FORWARD_DECL_MODULES_VAR ] # [MODULE_SUFFIX ]) # # Only extension modules that are configured to be built as MODULE libraries can # be runtime-loaded through the standard Python import mechanism. All other # modules can only be included in standalone applications that are written to # expect their presence. In addition to being linked against the libraries for # these modules, such applications must forward declare their entry points and # initialize them prior to use. To generate these forward declarations and # initializations, see ``python_modules_header``. # # If ```` does not refer to a target, then it is assumed to refer to an # extension module that is not linked at all, but compiled along with other # source files directly into an executable. Adding these modules does not cause # any library configuration modifications, and they are not added to the list of # linked modules. They still must be forward declared and initialized, however, # and so are added to the forward declared modules list. # # If the associated target is of type ``MODULE_LIBRARY``, the LINK_FLAGS target # property is used to set symbol visibility and export only the module init function. # This applies to GNU and MSVC compilers. # # Options: # # ``LINKED_MODULES_VAR `` # Name of the variable referencing a list of extension modules whose libraries # must be linked into the executables of any stand-alone applications that use # them. By default, the global property ``PY_LINKED_MODULES_LIST`` is used. # # ``FORWARD_DECL_MODULES_VAR `` # Name of the variable referencing a list of extension modules whose entry # points must be forward declared and called by any stand-alone applications # that use them. By default, the global property # ``PY_FORWARD_DECL_MODULES_LIST`` is used. # # ``MODULE_SUFFIX `` # Suffix appended to the python extension module file. # The default suffix is retrieved using ``sysconfig.get_config_var("SO")"``, # if not available, the default is then ``.so`` on unix and ``.pyd`` on # windows. # Setting the variable ``PYTHON_EXTENSION_MODULE_SUFFIX`` in the caller # scope defines the value used for all extensions not having a suffix # explicitly specified using ``MODULE_SUFFIX`` parameter. # # # .. cmake:command:: python_standalone_executable # # python_standalone_executable() # # For standalone executables that initialize their own Python runtime # (such as when building source files that include one generated by Cython with # the --embed option). Amend the configuration of the executable target # (created using ``add_executable``) with additional options needed to properly # build the referenced executable. # # # .. cmake:command:: python_modules_header # # Generate a header file that contains the forward declarations and # initialization routines for the given list of Python extension modules. # ```` is the logical name for the header file (no file extensions). # ```` is the actual destination filename for the header file # (e.g.: decl_modules.h). # # python_modules_header( [HeaderFilename] # [FORWARD_DECL_MODULES_LIST ] # [HEADER_OUTPUT_VAR ] # [INCLUDE_DIR_OUTPUT_VAR ]) # # If only ```` is provided, and it ends in the ".h" extension, then it # is assumed to be the ````. The filename of the header file # without the extension is used as the logical name. If only ```` is # provided, and it does not end in the ".h" extension, then the # ```` is assumed to ``.h``. # # The exact contents of the generated header file depend on the logical # ````. It should be set to a value that corresponds to the target # application, or for the case of multiple applications, some identifier that # conveyes its purpose. It is featured in the generated multiple inclusion # guard as well as the names of the generated initialization routines. # # The generated header file includes forward declarations for all listed # modules, as well as implementations for the following class of routines: # # ``int _(void)`` # Initializes the python extension module, ````. Returns an integer # handle to the module. # # ``void _LoadAllPythonModules(void)`` # Initializes all listed python extension modules. # # ``void CMakeLoadAllPythonModules(void);`` # Alias for ``_LoadAllPythonModules`` whose name does not depend on # ````. This function is excluded during preprocessing if the # preprocessing macro ``EXCLUDE_LOAD_ALL_FUNCTION`` is defined. # # ``void Py_Initialize_Wrapper();`` # Wrapper arpund ``Py_Initialize()`` that initializes all listed python # extension modules. This function is excluded during preprocessing if the # preprocessing macro ``EXCLUDE_PY_INIT_WRAPPER`` is defined. If this # function is generated, then ``Py_Initialize()`` is redefined to a macro # that calls this function. # # Options: # # ``FORWARD_DECL_MODULES_LIST `` # List of extension modules for which to generate forward declarations of # their entry points and their initializations. By default, the global # property ``PY_FORWARD_DECL_MODULES_LIST`` is used. # # ``HEADER_OUTPUT_VAR `` # Name of the variable to set to the path to the generated header file. By # default, ```` is used. # # ``INCLUDE_DIR_OUTPUT_VAR `` # Name of the variable to set to the path to the directory containing the # generated header file. By default, ``_INCLUDE_DIRS`` is used. # # Defined variables: # # ```` # The path to the generated header file # # ```` # Directory containing the generated header file # # # Example usage # ^^^^^^^^^^^^^ # # .. code-block:: cmake # # find_package(PythonInterp) # find_package(PythonLibs) # find_package(PythonExtensions) # find_package(Cython) # find_package(Boost COMPONENTS python) # # # Simple Cython Module -- no executables # add_cython_target(_module.pyx) # add_library(_module MODULE ${_module}) # python_extension_module(_module) # # # Mix of Cython-generated code and C++ code using Boost Python # # Stand-alone executable -- no modules # include_directories(${Boost_INCLUDE_DIRS}) # add_cython_target(main.pyx CXX EMBED_MAIN) # add_executable(main boost_python_module.cxx ${main}) # target_link_libraries(main ${Boost_LIBRARIES}) # python_standalone_executable(main) # # # stand-alone executable with three extension modules: # # one statically linked, one dynamically linked, and one loaded at runtime # # # # Freely mixes Cython-generated code, code using Boost-Python, and # # hand-written code using the CPython API. # # # module1 -- statically linked # add_cython_target(module1.pyx) # add_library(module1 STATIC ${module1}) # python_extension_module(module1 # LINKED_MODULES_VAR linked_module_list # FORWARD_DECL_MODULES_VAR fdecl_module_list) # # # module2 -- dynamically linked # include_directories({Boost_INCLUDE_DIRS}) # add_library(module2 SHARED boost_module2.cxx) # target_link_libraries(module2 ${Boost_LIBRARIES}) # python_extension_module(module2 # LINKED_MODULES_VAR linked_module_list # FORWARD_DECL_MODULES_VAR fdecl_module_list) # # # module3 -- loaded at runtime # add_cython_target(module3a.pyx) # add_library(module1 MODULE ${module3a} module3b.cxx) # target_link_libraries(module3 ${Boost_LIBRARIES}) # python_extension_module(module3 # LINKED_MODULES_VAR linked_module_list # FORWARD_DECL_MODULES_VAR fdecl_module_list) # # # application executable -- generated header file + other source files # python_modules_header(modules # FORWARD_DECL_MODULES_LIST ${fdecl_module_list}) # include_directories(${modules_INCLUDE_DIRS}) # # add_cython_target(mainA) # add_cython_target(mainC) # add_executable(main ${mainA} mainB.cxx ${mainC} mainD.c) # # target_link_libraries(main ${linked_module_list} ${Boost_LIBRARIES}) # python_standalone_executable(main) # #============================================================================= # Copyright 2011 Kitware, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #============================================================================= find_package(PythonInterp REQUIRED) find_package(PythonLibs) include(targetLinkLibrariesWithDynamicLookup) set(_command " import distutils.sysconfig import itertools import os import os.path import site import sys import sysconfig result = None rel_result = None candidate_lists = [] try: candidate_lists.append((distutils.sysconfig.get_python_lib(),)) except AttributeError: pass try: candidate_lists.append(site.getsitepackages()) except AttributeError: pass try: candidate_lists.append((site.getusersitepackages(),)) except AttributeError: pass candidates = itertools.chain.from_iterable(candidate_lists) for candidate in candidates: rel_candidate = os.path.relpath( candidate, sys.prefix) if not rel_candidate.startswith(\"..\"): result = candidate rel_result = rel_candidate break sys.stdout.write(\";\".join(( os.sep, os.pathsep, sys.prefix, result, rel_result, sysconfig.get_config_var('SO') ))) ") execute_process(COMMAND "${PYTHON_EXECUTABLE}" -c "${_command}" OUTPUT_VARIABLE _list RESULT_VARIABLE _result) list(GET _list 0 _item) set(PYTHON_SEPARATOR "${_item}") mark_as_advanced(PYTHON_SEPARATOR) list(GET _list 1 _item) set(PYTHON_PATH_SEPARATOR "${_item}") mark_as_advanced(PYTHON_PATH_SEPARATOR) list(GET _list 2 _item) set(PYTHON_PREFIX "${_item}") mark_as_advanced(PYTHON_PREFIX) list(GET _list 3 _item) set(PYTHON_SITE_PACKAGES_DIR "${_item}") mark_as_advanced(PYTHON_SITE_PACKAGES_DIR) list(GET _list 4 _item) set(PYTHON_RELATIVE_SITE_PACKAGES_DIR "${_item}") mark_as_advanced(PYTHON_RELATIVE_SITE_PACKAGES_DIR) if(NOT DEFINED PYTHON_EXTENSION_MODULE_SUFFIX) list(GET _list 5 _item) set(PYTHON_EXTENSION_MODULE_SUFFIX "${_item}") endif() function(_set_python_extension_symbol_visibility _target) if(PYTHON_VERSION_MAJOR VERSION_GREATER 2) set(_modinit_prefix "PyInit_") else() set(_modinit_prefix "init") endif() message("_modinit_prefix:${_modinit_prefix}") if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") set_target_properties(${_target} PROPERTIES LINK_FLAGS "/EXPORT:${_modinit_prefix}${_target}" ) elseif("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") set(_script_path ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_target}-version-script.map ) file(WRITE ${_script_path} "{global: ${_modinit_prefix}${_target}; local: *; };" ) set_property(TARGET ${_target} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,--version-script=${_script_path}" ) endif() endfunction() function(python_extension_module _target) set(one_ops LINKED_MODULES_VAR FORWARD_DECL_MODULES_VAR MODULE_SUFFIX) cmake_parse_arguments(_args "" "${one_ops}" "" ${ARGN}) set(_lib_type "NA") if(TARGET ${_target}) get_property(_lib_type TARGET ${_target} PROPERTY TYPE) endif() set(_is_non_lib TRUE) set(_is_static_lib FALSE) if(_lib_type STREQUAL "STATIC_LIBRARY") set(_is_static_lib TRUE) set(_is_non_lib FALSE) endif() set(_is_shared_lib FALSE) if(_lib_type STREQUAL "SHARED_LIBRARY") set(_is_shared_lib TRUE) set(_is_non_lib FALSE) endif() set(_is_module_lib FALSE) if(_lib_type STREQUAL "MODULE_LIBRARY") set(_is_module_lib TRUE) set(_is_non_lib FALSE) endif() if(_is_static_lib OR _is_shared_lib OR _is_non_lib) if(_is_static_lib OR _is_shared_lib) if(_args_LINKED_MODULES_VAR) set(${_args_LINKED_MODULES_VAR} ${${_args_LINKED_MODULES_VAR}} ${_target} PARENT_SCOPE) else() set_property(GLOBAL APPEND PROPERTY PY_LINKED_MODULES_LIST ${_target}) endif() endif() if(_args_FORWARD_DECL_MODULES_VAR) set(${_args_FORWARD_DECL_MODULES_VAR} ${${_args_FORWARD_DECL_MODULES_VAR}} ${_target} PARENT_SCOPE) else() set_property(GLOBAL APPEND PROPERTY PY_FORWARD_DECL_MODULES_LIST ${_target}) endif() endif() if(NOT _is_non_lib) include_directories("${PYTHON_INCLUDE_DIRS}") endif() if(_is_module_lib) set_target_properties(${_target} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}") endif() if(_is_module_lib OR _is_shared_lib) if(_is_module_lib) if(NOT _args_MODULE_SUFFIX) set(_args_MODULE_SUFFIX "${PYTHON_EXTENSION_MODULE_SUFFIX}") endif() if(_args_MODULE_SUFFIX STREQUAL "" AND WIN32 AND NOT CYGWIN) set(_args_MODULE_SUFFIX ".pyd") endif() if(NOT _args_MODULE_SUFFIX STREQUAL "") set_target_properties(${_target} PROPERTIES SUFFIX ${_args_MODULE_SUFFIX}) endif() endif() target_link_libraries_with_dynamic_lookup(${_target} ${PYTHON_LIBRARIES}) if(_is_module_lib) _set_python_extension_symbol_visibility(${_target}) endif() endif() endfunction() function(python_standalone_executable _target) include_directories(${PYTHON_INCLUDE_DIRS}) target_link_libraries(${_target} ${PYTHON_LIBRARIES}) endfunction() function(python_modules_header _name) set(one_ops FORWARD_DECL_MODULES_LIST HEADER_OUTPUT_VAR INCLUDE_DIR_OUTPUT_VAR) cmake_parse_arguments(_args "" "${one_ops}" "" ${ARGN}) list(GET _args_UNPARSED_ARGUMENTS 0 _arg0) # if present, use arg0 as the input file path if(_arg0) set(_source_file ${_arg0}) # otherwise, must determine source file from name, or vice versa else() get_filename_component(_name_ext "${_name}" EXT) # if extension provided, _name is the source file if(_name_ext) set(_source_file ${_name}) get_filename_component(_name "${_source_file}" NAME_WE) # otherwise, assume the source file is ${_name}.h else() set(_source_file ${_name}.h) endif() endif() if(_args_FORWARD_DECL_MODULES_LIST) set(static_mod_list ${_args_FORWARD_DECL_MODULES_LIST}) else() get_property(static_mod_list GLOBAL PROPERTY PY_FORWARD_DECL_MODULES_LIST) endif() string(REPLACE "." "_" _header_name "${_name}") string(TOUPPER ${_header_name} _header_name_upper) set(_header_name_upper "_${_header_name_upper}_H") set(generated_file ${CMAKE_CURRENT_BINARY_DIR}/${_source_file}) set(generated_file_tmp "${generated_file}.in") file(WRITE ${generated_file_tmp} "/* Created by CMake. DO NOT EDIT; changes will be lost. */\n") set(_chunk "") set(_chunk "${_chunk}#ifndef ${_header_name_upper}\n") set(_chunk "${_chunk}#define ${_header_name_upper}\n") set(_chunk "${_chunk}\n") set(_chunk "${_chunk}#include \n") set(_chunk "${_chunk}\n") set(_chunk "${_chunk}#ifdef __cplusplus\n") set(_chunk "${_chunk}extern \"C\" {\n") set(_chunk "${_chunk}#endif /* __cplusplus */\n") set(_chunk "${_chunk}\n") set(_chunk "${_chunk}#if PY_MAJOR_VERSION < 3\n") file(APPEND ${generated_file_tmp} "${_chunk}") foreach(_module ${static_mod_list}) file(APPEND ${generated_file_tmp} "PyMODINIT_FUNC init${PYTHON_MODULE_PREFIX}${_module}(void);\n") endforeach() file(APPEND ${generated_file_tmp} "#else /* PY_MAJOR_VERSION >= 3*/\n") foreach(_module ${static_mod_list}) file(APPEND ${generated_file_tmp} "PyMODINIT_FUNC PyInit_${PYTHON_MODULE_PREFIX}${_module}(void);\n") endforeach() set(_chunk "") set(_chunk "${_chunk}#endif /* PY_MAJOR_VERSION >= 3*/\n\n") set(_chunk "${_chunk}#ifdef __cplusplus\n") set(_chunk "${_chunk}}\n") set(_chunk "${_chunk}#endif /* __cplusplus */\n") set(_chunk "${_chunk}\n") file(APPEND ${generated_file_tmp} "${_chunk}") foreach(_module ${static_mod_list}) set(_import_function "${_header_name}_${_module}") set(_prefixed_module "${PYTHON_MODULE_PREFIX}${_module}") set(_chunk "") set(_chunk "${_chunk}int ${_import_function}(void)\n") set(_chunk "${_chunk}{\n") set(_chunk "${_chunk} static char name[] = \"${_prefixed_module}\";\n") set(_chunk "${_chunk} #if PY_MAJOR_VERSION < 3\n") set(_chunk "${_chunk} return PyImport_AppendInittab(") set(_chunk "${_chunk}name, init${_prefixed_module});\n") set(_chunk "${_chunk} #else /* PY_MAJOR_VERSION >= 3 */\n") set(_chunk "${_chunk} return PyImport_AppendInittab(") set(_chunk "${_chunk}name, PyInit_${_prefixed_module});\n") set(_chunk "${_chunk} #endif /* PY_MAJOR_VERSION >= 3 */\n") set(_chunk "${_chunk}}\n\n") file(APPEND ${generated_file_tmp} "${_chunk}") endforeach() file(APPEND ${generated_file_tmp} "void ${_header_name}_LoadAllPythonModules(void)\n{\n") foreach(_module ${static_mod_list}) file(APPEND ${generated_file_tmp} " ${_header_name}_${_module}();\n") endforeach() file(APPEND ${generated_file_tmp} "}\n\n") set(_chunk "") set(_chunk "${_chunk}#ifndef EXCLUDE_LOAD_ALL_FUNCTION\n") set(_chunk "${_chunk}void CMakeLoadAllPythonModules(void)\n") set(_chunk "${_chunk}{\n") set(_chunk "${_chunk} ${_header_name}_LoadAllPythonModules();\n") set(_chunk "${_chunk}}\n") set(_chunk "${_chunk}#endif /* !EXCLUDE_LOAD_ALL_FUNCTION */\n\n") set(_chunk "${_chunk}#ifndef EXCLUDE_PY_INIT_WRAPPER\n") set(_chunk "${_chunk}static void Py_Initialize_Wrapper()\n") set(_chunk "${_chunk}{\n") set(_chunk "${_chunk} ${_header_name}_LoadAllPythonModules();\n") set(_chunk "${_chunk} Py_Initialize();\n") set(_chunk "${_chunk}}\n") set(_chunk "${_chunk}#define Py_Initialize Py_Initialize_Wrapper\n") set(_chunk "${_chunk}#endif /* !EXCLUDE_PY_INIT_WRAPPER */\n\n") set(_chunk "${_chunk}#endif /* !${_header_name_upper} */\n") file(APPEND ${generated_file_tmp} "${_chunk}") # with configure_file() cmake complains that you may not use a file created # using file(WRITE) as input file for configure_file() execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${generated_file_tmp}" "${generated_file}" OUTPUT_QUIET ERROR_QUIET) set(_header_output_var ${_name}) if(_args_HEADER_OUTPUT_VAR) set(_header_output_var ${_args_HEADER_OUTPUT_VAR}) endif() set(${_header_output_var} ${generated_file} PARENT_SCOPE) set(_include_dir_var ${_name}_INCLUDE_DIRS) if(_args_INCLUDE_DIR_OUTPUT_VAR) set(_include_dir_var ${_args_INCLUDE_DIR_OUTPUT_VAR}) endif() set(${_include_dirs_var} ${CMAKE_CURRENT_BINARY_DIR} PARENT_SCOPE) endfunction() qiskit-aer-0.4.1/cmake/FindTBB.cmake000066400000000000000000000120011362723322000170510ustar00rootroot00000000000000#------------------------------------------------------------------- # This file is part of the CMake build system for OGRE # (Object-oriented Graphics Rendering Engine) # For the latest info, see http://www.ogre3d.org/ # # The contents of this file are placed in the public domain. Feel # free to make use of it in any way you like. #------------------------------------------------------------------- # - Try to find ThreadingBuildingBlocks libraries # Once done, this will define # # TBB_FOUND - system has TBB # TBB_INCLUDE_DIRS - the TBB include directories # TBB_LIBRARIES - link these to use TBB include(FindPkgMacros) findpkg_begin(TBB) # Get path, convert backslashes as ${ENV_${var}} getenv_path(TBB_HOME) getenv_path(TBB_ROOT) getenv_path(TBB_BASE) # construct search paths set(TBB_PREFIX_PATH ${TBB_HOME} ${ENV_TBB_HOME} ${TBB_ROOT} ${ENV_TBB_ROOT} ${TBB_BASE} ${ENV_TBB_BASE} ) # redo search if prefix path changed clear_if_changed(TBB_PREFIX_PATH TBB_LIBRARY_FWK TBB_LIBRARY_REL TBB_LIBRARY_DBG TBB_INCLUDE_DIR ) create_search_paths(TBB) set(TBB_INC_SEARCH_PATH ${TBB_INC_SEARCH_PATH} ${TBB_PREFIX_PATH}) # For Windows, let's assume that the user might be using the precompiled # TBB packages from the main website. These use a rather awkward directory # structure (at least for automatically finding the right files) depending # on platform and compiler, but we'll do our best to accommodate it. # Not adding the same effort for the precompiled linux builds, though. Those # have different versions for CC compiler versions and linux kernels which # will never adequately match the user's setup, so there is no feasible way # to detect the "best" version to use. The user will have to manually # select the right files. (Chances are the distributions are shipping their # custom version of tbb, anyway, so the problem is probably nonexistant.) if (WIN32 AND MSVC) set(COMPILER_PREFIX "vc7.1") if (MSVC_VERSION EQUAL 1400) set(COMPILER_PREFIX "vc8") endif () if (MSVC_VERSION EQUAL 1500) set(COMPILER_PREFIX "vc9") endif () if (MSVC_VERSION EQUAL 1600) set(COMPILER_PREFIX "vc10") endif () if (MSVC_VERSION EQUAL 1700) set(COMPILER_PREFIX "vc11") endif () if (MSVC_VERSION EQUAL 1800) set(COMPILER_PREFIX "vc12") endif () if (MSVC_VERSION EQUAL 1900) set(COMPILER_PREFIX "vc13") endif () if (MSVC_VERSION EQUAL 1911) set(COMPILER_PREFIX "vc14") endif () # for each prefix path, add ia32/64\${COMPILER_PREFIX}\lib to the lib search path foreach (dir ${TBB_PREFIX_PATH}) if (CMAKE_CL_64) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/ia64/${COMPILER_PREFIX}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/ia64/${COMPILER_PREFIX}) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/intel64/${COMPILER_PREFIX}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/intel64/${COMPILER_PREFIX}) else () list(APPEND TBB_LIB_SEARCH_PATH ${dir}/ia32/${COMPILER_PREFIX}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/ia32/${COMPILER_PREFIX}) endif () endforeach () endif () foreach (dir ${TBB_PREFIX_PATH}) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/$ENV{TBB_ARCH_PLATFORM}/lib) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib/$ENV{TBB_ARCH_PLATFORM}) list(APPEND TBB_LIB_SEARCH_PATH ${dir}/lib) endforeach () set(TBB_LIBRARY_NAMES tbb) get_debug_names(TBB_LIBRARY_NAMES) # use_pkgconfig(TBB_PKGC TBB) findpkg_framework(TBB) find_path(TBB_INCLUDE_DIR NAMES tbb/tbb.h HINTS ${TBB_INC_SEARCH_PATH} ${TBB_PKGC_INCLUDE_DIRS}) find_library(TBB_LIBRARY_REL NAMES ${TBB_LIBRARY_NAMES} HINTS ${TBB_LIB_SEARCH_PATH} ${TBB_PKGC_LIBRARY_DIRS}) find_library(TBB_LIBRARY_DBG NAMES ${TBB_LIBRARY_NAMES_DBG} HINTS ${TBB_LIB_SEARCH_PATH} ${TBB_PKGC_LIBRARY_DIRS}) make_library_set(TBB_LIBRARY) findpkg_finish(TBB) if (NOT TBB_FOUND) return() endif () # Look for TBB's malloc package findpkg_begin(TBB_MALLOC) set(TBB_MALLOC_LIBRARY_NAMES tbbmalloc) get_debug_names(TBB_MALLOC_LIBRARY_NAMES) find_path(TBB_MALLOC_INCLUDE_DIR NAMES tbb/tbb.h HINTS ${TBB_INCLUDE_DIR} ${TBB_INC_SEARCH_PATH} ${TBB_PKGC_INCLUDE_DIRS} ) find_library(TBB_MALLOC_LIBRARY_REL NAMES ${TBB_MALLOC_LIBRARY_NAMES} HINTS ${TBB_LIB_SEARCH_PATH} ${TBB_PKGC_LIBRARY_DIRS} ) find_library(TBB_MALLOC_LIBRARY_DBG NAMES ${TBB_MALLOC_LIBRARY_NAMES_DBG} HINTS ${TBB_LIB_SEARCH_PATH} ${TBB_PKGC_LIBRARY_DIRS} ) make_library_set(TBB_MALLOC_LIBRARY) findpkg_finish(TBB_MALLOC) # Look for TBB's malloc proxy package findpkg_begin(TBB_MALLOC_PROXY) set(TBB_MALLOC_PROXY_LIBRARY_NAMES tbbmalloc_proxy) get_debug_names(TBB_MALLOC_PROXY_LIBRARY_NAMES) find_path(TBB_MALLOC_PROXY_INCLUDE_DIR NAMES tbb/tbbmalloc_proxy.h HINTS ${TBB_INCLUDE_DIR} ${TBB_INC_SEARCH_PATH} ${TBB_PKGC_INCLUDE_DIRS}) find_library(TBB_MALLOC_PROXY_LIBRARY_REL NAMES ${TBB_MALLOC_PROXY_LIBRARY_NAMES} HINTS ${TBB_LIB_SEARCH_PATH} ${TBB_PKGC_LIBRARY_DIRS}) find_library(TBB_MALLOC_PROXY_LIBRARY_DBG NAMES ${TBB_MALLOC_PROXY_LIBRARY_NAMES_DBG} HINTS ${TBB_LIB_SEARCH_PATH} ${TBB_PKGC_LIBRARY_DIRS}) make_library_set(TBB_MALLOC_PROXY_LIBRARY) findpkg_finish(TBB_MALLOC_PROXY) qiskit-aer-0.4.1/cmake/Findnlohmann_json.cmake000066400000000000000000000007151362723322000213160ustar00rootroot00000000000000find_package(nlohmann_json CONFIG QUIET) if(NOT nlohmann_json_FOUND) #message(STATUS "NLOHMANN_JSON_PATH is ${NLOHMANN_JSON_PATH}") find_path(NLOHMANN_INCLUDE_DIR nlohmann_json.hpp PATH ${NLOHMANN_JSON_PATH}) message(STATUS "nlohmann include dir: ${NLOHMANN_INCLUDE_DIR}") add_library(nlohmann_json INTERFACE IMPORTED) set_target_properties(nlohmann_json PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${NLOHMANN_INCLUDE_DIR}) endif() qiskit-aer-0.4.1/cmake/Linter.cmake000066400000000000000000000027661362723322000171170ustar00rootroot00000000000000function(add_linter target) find_program(CLANG_TIDY_EXE "clang-tidy") if(NOT CLANG_TIDY_EXE) message(WARNING "Bypassing C++ linter because 'clang-tidy' was not found.") else() # TODO: Once final checks are decided, add "-warnings-as-errors=*". set(CLANG_TIDY_PROPERTIES "${CLANG_TIDY_EXE}" "-format-style=google" "-header-filter=\"${AER_SIMULATOR_CPP_SRC_DIR}\"" "-quiet") # This will add the linter as part of the build process set_target_properties(${target} PROPERTIES CXX_CLANG_TIDY "${CLANG_TIDY_PROPERTIES}") message("Clang Tidy linter will be passed at build time") # We create two more custom targets, so we can invoque both linter and # format from the command line. # Get all project files file(GLOB_RECURSE ALL_SOURCE_FILES *.cpp *.hpp) add_custom_target( linter COMMAND ${CLANG_TIDY_EXE} ${ALL_SOURCE_FILES} ${CLANG_TIDY_PROPERTIES} ${INCLUDE_DIRECTORIES} ) find_program(CLANG_TIDY_FORMAT "clang-format") if(NOT CLANG_TIDY_FORMAT) message(WARNING "Bypassing C++ auto-format because 'clang-format' was not found.") else() add_custom_target( format COMMAND ${CLANG_TIDY_FORMAT} -style=file -i ${ALL_SOURCE_FILES} ) endif() endif() endfunction() qiskit-aer-0.4.1/cmake/README.md000066400000000000000000000002701362723322000161230ustar00rootroot00000000000000In order to build static binaries, we need to copy FindBLAS.cmake.fix-static-linking to: ~/anaconda3/envs//lib/python3./site-packages/cmake/data/share/cmake-3.12/Modules qiskit-aer-0.4.1/cmake/UseCython.cmake000066400000000000000000000325561362723322000176030ustar00rootroot00000000000000#.rst: # # The following functions are defined: # # .. cmake:command:: add_cython_target # # Create a custom rule to generate the source code for a Python extension module # using cython. # # add_cython_target( [] # [EMBED_MAIN] # [C | CXX] # [PY2 | PY3] # [OUTPUT_VAR ]) # # ```` is the name of the new target, and ```` # is the path to a cython source file. Note that, despite the name, no new # targets are created by this function. Instead, see ``OUTPUT_VAR`` for # retrieving the path to the generated source for subsequent targets. # # If only ```` is provided, and it ends in the ".pyx" extension, then it # is assumed to be the ````. The name of the input without the # extension is used as the target name. If only ```` is provided, and it # does not end in the ".pyx" extension, then the ```` is assumed to # be ``.pyx``. # # The Cython include search path is amended with any entries found in the # ``INCLUDE_DIRECTORIES`` property of the directory containing the # ```` file. Use ``include_directories`` to add to the Cython # include search path. # # Options: # # ``EMBED_MAIN`` # Embed a main() function in the generated output (for stand-alone # applications that initialize their own Python runtime). # # ``C | CXX`` # Force the generation of either a C or C++ file. By default, a C file is # generated, unless the C language is not enabled for the project; in this # case, a C++ file is generated by default. # # ``PY2 | PY3`` # Force compilation using either Python-2 or Python-3 syntax and code # semantics. By default, Python-2 syntax and semantics are used if the major # version of Python found is 2. Otherwise, Python-3 syntax and sematics are # used. # # ``OUTPUT_VAR `` # Set the variable ```` in the parent scope to the path to the # generated source file. By default, ```` is used as the output # variable name. # # Defined variables: # # ```` # The path of the generated source file. # # Cache variables that effect the behavior include: # # ``CYTHON_ANNOTATE`` # whether to create an annotated .html file when compiling # # ``CYTHON_FLAGS`` # additional flags to pass to the Cython compiler # # Example usage # ^^^^^^^^^^^^^ # # .. code-block:: cmake # # find_package(Cython) # # # Note: In this case, either one of these arguments may be omitted; their # # value would have been inferred from that of the other. # add_cython_target(cy_code cy_code.pyx) # # add_library(cy_code MODULE ${cy_code}) # target_link_libraries(cy_code ...) # #============================================================================= # Copyright 2011 Kitware, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #============================================================================= # Configuration options. set(CYTHON_ANNOTATE OFF CACHE BOOL "Create an annotated .html file when compiling *.pyx.") set(CYTHON_FLAGS "" CACHE STRING "Extra flags to the cython compiler.") mark_as_advanced(CYTHON_ANNOTATE CYTHON_FLAGS) string(REGEX REPLACE " " ";" CYTHON_FLAGS_LIST "${CYTHON_FLAGS}") find_package(PythonLibs REQUIRED) set(CYTHON_CXX_EXTENSION "cxx") set(CYTHON_C_EXTENSION "c") get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES) function(add_cython_target _name) set(options EMBED_MAIN C CXX PY2 PY3) set(options1 OUTPUT_VAR) cmake_parse_arguments(_args "${options}" "${options1}" "" ${ARGN}) list(GET _args_UNPARSED_ARGUMENTS 0 _arg0) # if provided, use _arg0 as the input file path if(_arg0) set(_source_file ${_arg0}) # otherwise, must determine source file from name, or vice versa else() get_filename_component(_name_ext "${_name}" EXT) # if extension provided, _name is the source file if(_name_ext) set(_source_file ${_name}) get_filename_component(_name "${_source_file}" NAME_WE) # otherwise, assume the source file is ${_name}.pyx else() set(_source_file ${_name}.pyx) endif() endif() set(_embed_main FALSE) if("C" IN_LIST languages) set(_output_syntax "C") elseif("CXX" IN_LIST languages) set(_output_syntax "CXX") else() message(FATAL_ERROR "Either C or CXX must be enabled to use Cython") endif() if("${PYTHONLIBS_VERSION_STRING}" MATCHES "^2.") set(_input_syntax "PY2") else() set(_input_syntax "PY3") endif() if(_args_EMBED_MAIN) set(_embed_main TRUE) endif() if(_args_C) set(_output_syntax "C") endif() if(_args_CXX) set(_output_syntax "CXX") endif() if(_args_PY2) set(_input_syntax "PY2") endif() if(_args_PY3) set(_input_syntax "PY3") endif() set(embed_arg "") if(_embed_main) set(embed_arg "--embed") endif() set(cxx_arg "") set(extension "c") if(_output_syntax STREQUAL "CXX") set(cxx_arg "--cplus") set(extension "cxx") endif() set(py_version_arg "") if(_input_syntax STREQUAL "PY2") set(py_version_arg "-2") elseif(_input_syntax STREQUAL "PY3") set(py_version_arg "-3") endif() set(generated_file "${CMAKE_CURRENT_BINARY_DIR}/${_name}.${extension}") set_source_files_properties(${generated_file} PROPERTIES GENERATED TRUE) set(_output_var ${_name}) if(_args_OUTPUT_VAR) set(_output_var ${_args_OUTPUT_VAR}) endif() set(${_output_var} ${generated_file} PARENT_SCOPE) file(RELATIVE_PATH generated_file_relative ${CMAKE_BINARY_DIR} ${generated_file}) set(comment "Generating ${_output_syntax} source ${generated_file_relative}") set(cython_include_directories "") set(pxd_dependencies "") set(c_header_dependencies "") # Get the include directories. get_source_file_property(pyx_location ${_source_file} LOCATION) get_filename_component(pyx_path ${pyx_location} PATH) get_directory_property(cmake_include_directories DIRECTORY ${pyx_path} INCLUDE_DIRECTORIES) list(APPEND cython_include_directories ${cmake_include_directories}) # Determine dependencies. # Add the pxd file with the same basename as the given pyx file. get_filename_component(pyx_file_basename ${_source_file} NAME_WE) unset(corresponding_pxd_file CACHE) find_file(corresponding_pxd_file ${pyx_file_basename}.pxd PATHS "${pyx_path}" ${cmake_include_directories} NO_DEFAULT_PATH) if(corresponding_pxd_file) list(APPEND pxd_dependencies "${corresponding_pxd_file}") endif() # pxd files to check for additional dependencies set(pxds_to_check "${_source_file}" "${pxd_dependencies}") set(pxds_checked "") set(number_pxds_to_check 1) while(number_pxds_to_check GREATER 0) foreach(pxd ${pxds_to_check}) list(APPEND pxds_checked "${pxd}") list(REMOVE_ITEM pxds_to_check "${pxd}") # look for C headers file(STRINGS "${pxd}" extern_from_statements REGEX "cdef[ ]+extern[ ]+from.*$") foreach(statement ${extern_from_statements}) # Had trouble getting the quote in the regex string(REGEX REPLACE "cdef[ ]+extern[ ]+from[ ]+[\"]([^\"]+)[\"].*" "\\1" header "${statement}") unset(header_location CACHE) find_file(header_location ${header} PATHS ${cmake_include_directories}) if(header_location) list(FIND c_header_dependencies "${header_location}" header_idx) if(${header_idx} LESS 0) list(APPEND c_header_dependencies "${header_location}") endif() endif() endforeach() # check for pxd dependencies # Look for cimport statements. set(module_dependencies "") file(STRINGS "${pxd}" cimport_statements REGEX cimport) foreach(statement ${cimport_statements}) if(${statement} MATCHES from) string(REGEX REPLACE "from[ ]+([^ ]+).*" "\\1" module "${statement}") else() string(REGEX REPLACE "cimport[ ]+([^ ]+).*" "\\1" module "${statement}") endif() list(APPEND module_dependencies ${module}) endforeach() # check for pxi dependencies # Look for include statements. set(include_dependencies "") file(STRINGS "${pxd}" include_statements REGEX include) foreach(statement ${include_statements}) string(REGEX REPLACE "include[ ]+[\"]([^\"]+)[\"].*" "\\1" module "${statement}") list(APPEND include_dependencies ${module}) endforeach() list(REMOVE_DUPLICATES module_dependencies) list(REMOVE_DUPLICATES include_dependencies) # Add modules to the files to check, if appropriate. foreach(module ${module_dependencies}) unset(pxd_location CACHE) find_file(pxd_location ${module}.pxd PATHS "${pyx_path}" ${cmake_include_directories} NO_DEFAULT_PATH) if(pxd_location) list(FIND pxds_checked ${pxd_location} pxd_idx) if(${pxd_idx} LESS 0) list(FIND pxds_to_check ${pxd_location} pxd_idx) if(${pxd_idx} LESS 0) list(APPEND pxds_to_check ${pxd_location}) list(APPEND pxd_dependencies ${pxd_location}) endif() # if it is not already going to be checked endif() # if it has not already been checked endif() # if pxd file can be found endforeach() # for each module dependency discovered # Add includes to the files to check, if appropriate. foreach(_include ${include_dependencies}) unset(pxi_location CACHE) find_file(pxi_location ${_include} PATHS "${pyx_path}" ${cmake_include_directories} NO_DEFAULT_PATH) if(pxi_location) list(FIND pxds_checked ${pxi_location} pxd_idx) if(${pxd_idx} LESS 0) list(FIND pxds_to_check ${pxi_location} pxd_idx) if(${pxd_idx} LESS 0) list(APPEND pxds_to_check ${pxi_location}) list(APPEND pxd_dependencies ${pxi_location}) endif() # if it is not already going to be checked endif() # if it has not already been checked endif() # if include file can be found endforeach() # for each include dependency discovered endforeach() # for each include file to check list(LENGTH pxds_to_check number_pxds_to_check) endwhile() # Set additional flags. set(annotate_arg "") if(CYTHON_ANNOTATE) set(annotate_arg "--annotate") endif() set(no_docstrings_arg "") if(CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") set(no_docstrings_arg "--no-docstrings") endif() set(cython_debug_arg "") set(embed_pos_arg "") set(line_directives_arg "") if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") set(cython_debug_arg "--gdb") set(embed_pos_arg "--embed-positions") set(line_directives_arg "--line-directives") endif() # Include directory arguments. list(REMOVE_DUPLICATES cython_include_directories) set(include_directory_arg "") foreach(_include_dir ${cython_include_directories}) set(include_directory_arg ${include_directory_arg} "--include-dir" "${_include_dir}") endforeach() list(REMOVE_DUPLICATES pxd_dependencies) list(REMOVE_DUPLICATES c_header_dependencies) # Add the command to run the compiler. add_custom_command(OUTPUT ${generated_file} COMMAND ${CYTHON_EXECUTABLE} ARGS ${cxx_arg} ${include_directory_arg} ${py_version_arg} ${embed_arg} ${annotate_arg} ${no_docstrings_arg} ${cython_debug_arg} ${embed_pos_arg} ${line_directives_arg} ${CYTHON_FLAGS_LIST} ${pyx_location} --output-file ${generated_file} DEPENDS ${_source_file} ${pxd_dependencies} IMPLICIT_DEPENDS ${_output_syntax} ${c_header_dependencies} COMMENT ${comment}) # NOTE(opadron): I thought about making a proper target, but after trying it # out, I decided that it would be far too convenient to use the same name as # the target for the extension module (e.g.: for single-file modules): # # ... # add_cython_target(_module.pyx) # add_library(_module ${_module}) # ... # # The above example would not be possible since the "_module" target name # would already be taken by the cython target. Since I can't think of a # reason why someone would need the custom target instead of just using the # generated file directly, I decided to leave this commented out. # # add_custom_target(${_name} DEPENDS ${generated_file}) # Remove their visibility to the user. set(corresponding_pxd_file "" CACHE INTERNAL "") set(header_location "" CACHE INTERNAL "") set(pxd_location "" CACHE INTERNAL "") endfunction() qiskit-aer-0.4.1/cmake/compiler_utils.cmake000066400000000000000000000164721362723322000207130ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. include(CheckCXXCompilerFlag) function(enable_cxx_compiler_flag_if_supported flag) string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_already_set) if(flag_already_set EQUAL -1) check_cxx_compiler_flag("${flag}" flag_supported) if(flag_supported) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) endif() unset(flag_supported CACHE) endif() endfunction() function(get_version version_str) string(REPLACE "." ";" VERSION_LIST ${version_str}) list(GET VERSION_LIST 0 TMP_MAJOR_VERSION) list(GET VERSION_LIST 1 TMP_MINOR_VERSION) list(GET VERSION_LIST 2 TMP_PATCH_VERSION) set(MAJOR_VERSION ${TMP_MAJOR_VERSION} PARENT_SCOPE) set(MINOR_VERSION ${TMP_MINOR_VERSION} PARENT_SCOPE) set(PATCH_VERSION ${TMP_PATCH_VERSION} PARENT_SCOPE) endfunction() function(is_dir_empty dir) file(GLOB RESULT ${dir}/*) list(LENGTH RESULT num_files) if(num_files EQUAL 0) set(dir_is_empty TRUE PARENT_SCOPE) else() set(dir_is_empty FALSE PARENT_SCOPE) endif() endfunction() function(_get_library_source_code library repo_url version proof_of_existance) is_dir_empty(${PROJECT_SOURCE_DIR}/src/third-party/headers/${library}) if(dir_is_empty) find_package(Git QUIET) if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") # if we have cloned the sources, the library is a submodule, so we need # to initialize it if(EXISTS "${PROJECT_SOURCE_DIR}/.gitmodules") # Update library submodule as needed message(STATUS "Submodule update") execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive src/third-party/headers/${library} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL "0") message(FATAL_ERROR "git submodule update --init --recursive src/third-party/headers/${library} \ failed with ${GIT_SUBMOD_RESULT}, please checkout submodule ${library}") endif() else() message(WARNING "Git checkout but ${PROJECT_SOURCE_DIR}/.gitmodules file not found!") endif() # Not comming from git, so probably: pip install https://...zip or similar. # This time, we want to clone the library and change the latests stable release elseif(GIT_FOUND) execute_process(COMMAND ${GIT_EXECUTABLE} clone --branch ${version} ${repo_url} ${PROJECT_SOURCE_DIR}/src/third-party/headers/${library} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL "0") message(FATAL_ERROR "git clone failed with ${GIT_SUBMOD_RESULT},\ please checkout ${library} manually from ${repo_url} and \ checkout latest stable relase") endif() # TODO: If there's no git, we have to get the library using other method (curl) endif() if(NOT EXISTS "${PROJECT_SOURCE_DIR}/src/third-party/headers/${proof_of_existance}") message(FATAL_ERROR "${library} doesn't exist! GIT_SUBMODULE was turned off or download failed.\ Please download ${library} library from ${repo_url} \ and checkout latest stable release") endif() else() message(STATUS "${library} library source code already exists") endif() # TODO: We should be adding included directories to targets, and not globally include_directories(SYSTEM ${PROJECT_SOURCE_DIR}/src/third-party/headers/${library}) endfunction() function(get_muparserx_source_code) _get_library_source_code( muparserx https://github.com/beltoforion/muparserx.git v4.0.8 muparserx/CMakeLists.txt ) endfunction() function(get_thrust_source_code) _get_library_source_code( thrust https://github.com/thrust/thrust.git 1.9.5 thrust/thrust/version.h ) endfunction() function(check_compiler_cpp11_abi) # This is needed in case the compiler doesn't work with the new C++11 ABI, # is the case of GCC in RHEL6 and RHEL7 # https://bugzilla.redhat.com/show_bug.cgi?id=1546704 # Consider also if -D_GLIBCXX_USE_CXX11_ABI has been passed as flag string(REGEX MATCH "-D_GLIBCXX_USE_CXX11_ABI=[(A-z)|(a-z)|(0-9)]+" CUSTOM_PREP_FLAGS ${CMAKE_CXX_FLAGS}) # Preprocessor run to check if CXX11_ABI is set execute_process(COMMAND echo "#include " COMMAND ${CMAKE_CXX_COMPILER} ${CUSTOM_PREP_FLAGS} -x c++ -E -dM - COMMAND fgrep _GLIBCXX_USE_CXX11_ABI OUTPUT_VARIABLE CXX11_ABI_OUT OUTPUT_STRIP_TRAILING_WHITESPACE) string(REGEX REPLACE "#define _GLIBCXX_USE_CXX11_ABI " "" CXX11_ABI "${CXX11_ABI_OUT}") set(CXX11_ABI ${CXX11_ABI} PARENT_SCOPE) endfunction() function(uncompress_muparsersx_lib) if(MSVC) set(PLATFORM "win64") elseif(APPLE) set(PLATFORM "macos") elseif(UNIX) check_compiler_cpp11_abi() if(CXX11_ABI EQUAL "0") set(MUPARSER_ABI_PREFIX oldabi_) endif() if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le") set(MUPARSER_ARCH_POSTFIX ".ppc64le") endif() set(PLATFORM "linux") endif() execute_process(COMMAND ${CMAKE_COMMAND} -E tar "xvfj" "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/${PLATFORM}/lib/${MUPARSER_ABI_PREFIX}muparserx${MUPARSER_ARCH_POSTFIX}.7z" WORKING_DIRECTORY "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/${PLATFORM}/lib/") set(MUPARSERX_LIB_PATH "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/${PLATFORM}/lib" PARENT_SCOPE) endfunction() function(add_muparserx_lib) message(STATUS "Looking for muparserx library...") # Look first for already installed muparserx find_package(muparserx QUIET) if(muparserx_FOUND) message(STATUS "Muparserx library version '${muparserx_VERSION}' found") set(AER_LIBRARIES ${AER_LIBRARIES} PkgConfig::muparserx PARENT_SCOPE) return() endif() message(STATUS "Muparserx library not found. Uncompressing muparserx static library...") uncompress_muparsersx_lib() find_library(MUPARSERX_LIB NAMES libmuparserx.a muparserx HINTS ${MUPARSERX_LIB_PATH}) if(${MUPARSERX_LIB} MATCHES "MUPARSERX_LIB-NOTFOUND") message(FATAL_ERROR "No muparserx library found") endif() message(STATUS "Muparserx library found: ${MUPARSERX_LIB}") get_muparserx_source_code() # I keep this disabled on purpose, just in case I need to debug muparserx related problems # file(GLOB MUPARSERX_SOURCES "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/headers/muparserx/parser/*.cpp") set(AER_LIBRARIES ${AER_LIBRARIES} ${MUPARSERX_LIB} PARENT_SCOPE) endfunction() qiskit-aer-0.4.1/cmake/cython_utils.cmake000066400000000000000000000125731362723322000204030ustar00rootroot00000000000000find_package(PythonExtensions REQUIRED) find_package(Cython REQUIRED) find_package(PythonLibs REQUIRED) find_package(NumPy REQUIRED) # Variables for input user data: # # CYTHON_USER_INCLUDE_DIRS: # - For Cython modules that need to import some header file not in the paths, example: # set(CYTHON_USER_INCLUDE_DIRS "/opt/my/include") # CYTHON_USER_LIB_DIRS: # - For Cython modules that need to link with external libs, example: # set(CYTHON_USER_LIB_DIRS "/opt/my/lib") # CYTHON_INSTALL_DIR: # - Where to install the resulting shared libraries # set(CYTHON_INSTALL_DIR "/opt/my/lib") # Set default values set(CYTHON_USER_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}) unset(CYTHON_USER_LIB_DIRS) set(CYTHON_INSTALL_DIR "qiskit/providers/aer/backends") function(add_cython_module module) add_cython_target(${module} ${module}.pyx CXX) # Avoid warnings in cython cpp generated code if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set_source_files_properties(${module}.cxx PROPERTIES COMPILE_FLAGS -Wno-everything) elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set_source_files_properties(${module}.cxx PROPERTIES COMPILE_FLAGS -w) elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") set_source_files_properties(${module}.cxx PROPERTIES COMPILE_FLAGS /w) endif() set(options MODULE SHARED EXCLUDE_FROM_ALL NO_EXTRAS SYSTEM THIN_LTO) cmake_parse_arguments(ARG "${options}" "" "" ${ARGN}) if(ARG_MODULE AND ARG_SHARED) message(FATAL_ERROR "Can't be both MODULE and SHARED") elseif(ARG_SHARED) set(lib_type SHARED) else() set(lib_type MODULE) endif() if(ARG_EXCLUDE_FROM_ALL) set(exclude_from_all EXCLUDE_FROM_ALL) endif() if(CUDA_FOUND) cuda_add_library(${module} ${lib_type} ${exclude_from_all} ${module} ${ARG_UNPARSED_ARGUMENTS}) set_source_files_properties(${module} PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ) else() add_library(${module} ${lib_type} ${exclude_from_all} ${module} ${ARG_UNPARSED_ARGUMENTS}) endif() # We only need to pass the linter once, as the codebase is the same for # all controllers # add_linter(target) target_include_directories(${module} PRIVATE ${AER_SIMULATOR_CPP_SRC_DIR}) target_include_directories(${module} PRIVATE ${AER_SIMULATOR_CPP_EXTERNAL_LIBS}) target_include_directories(${module} PRIVATE ${PYTHON_INCLUDE_DIRS}) target_include_directories(${module} PRIVATE ${NumPy_INCLUDE_DIRS}) target_include_directories(${module} PRIVATE ${CYTHON_USER_INCLUDE_DIRS}) target_link_libraries(${module} ${AER_LIBRARIES} ${CYTHON_USER_LIB_DIRS}) if(WIN32 OR CYGWIN) # Link against the Python shared library on Windows target_link_libraries(${module} ${PYTHON_LIBRARIES}) elseif(APPLE) # It's quite common to have multiple copies of the same Python version # installed on one's system. E.g.: one copy from the OS and another copy # that's statically linked into an application like Blender or Maya. # If we link our plugin library against the OS Python here and import it # into Blender or Maya later on, this will cause segfaults when multiple # conflicting Python instances are active at the same time (even when they # are of the same version). # Windows is not affected by this issue since it handles DLL imports # differently. The solution for Linux and Mac OS is simple: we just don't # link against the Python library. The resulting shared library will have # missing symbols, but that's perfectly fine -- they will be resolved at # import time. # Set some general flags if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(AER_LINKER_FLAGS "${AER_LINKER_FLAGS} -undefined dynamic_lookup") else() # -flat_namespace linker flag is needed otherwise dynamic symbol resolution doesn't work as expected with GCC. # Symbols with the same name exist in different .so, so the loader just takes the first one it finds, # which is usually the one from the first .so loaded. # See: Two-Leve namespace symbol resolution set(AER_LINKER_FLAGS "${AER_LINKER_FLAGS} -undefined dynamic_lookup -flat_namespace") endif() if(ARG_SHARED) set_target_properties(${target_name} PROPERTIES MACOSX_RPATH ON) endif() endif() set_target_properties(${module} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}") set_target_properties(${module} PROPERTIES SUFFIX "${PYTHON_EXTENSION_MODULE_SUFFIX}") set_target_properties(${module} PROPERTIES CXX_STANDARD 14 LINKER_LANGUAGE CXX) # Warning: Do not merge PROPERTIES when one of the variables can be empty, it breaks # the rest of the properties so they are not properly added. set_target_properties(${module} PROPERTIES LINK_FLAGS ${AER_LINKER_FLAGS}) set_target_properties(${module} PROPERTIES COMPILE_FLAGS ${AER_COMPILER_FLAGS}) target_compile_definitions(${module} PRIVATE ${AER_COMPILER_DEFINITIONS}) python_extension_module(${module} FORWARD_DECL_MODULES_VAR fdecl_module_list) python_modules_header(modules FORWARD_DECL_MODULES_LIST ${fdecl_module_list}) include_directories(${modules_INCLUDE_DIRS}) # TODO Where to put the target files install(TARGETS ${module} LIBRARY DESTINATION ${CYTHON_INSTALL_DIR}) endfunction() qiskit-aer-0.4.1/cmake/findBLASInSpecificPath.cmake000066400000000000000000000045561362723322000220150ustar00rootroot00000000000000function(find_blas_in_specific_path BLAS_LIB_PATH) function(check_blas_lib_found BLAS_LIB_PATH BLAS_LIBS BLAS_FOUND) # This function is intented to be called only from find_blas_in_specific_path # Check if the lib has been found and if it was in a sub of the provided path. # FindBLAS.cmake always search some standard paths so, if no lib is found # below provided BLAS_LIB_PATH, it could have found the BLAS lib at some other place # and not where the user specified if(NOT BLAS_FOUND) return() endif() list(GET BLAS_LIBS 0 FIRST_BLAS_PATH) # Need to add final separator in order to check if BLAS_LIB_PATH is a # parent directory for BLAS_LIBS string(APPEND BLAS_LIB_PATH "/") # already in CMake format file(TO_CMAKE_PATH ${FIRST_BLAS_PATH} FIRST_BLAS_PATH) string(APPEND FIRST_BLAS_PATH "/") # already in CMake format string(FIND ${FIRST_BLAS_PATH} ${BLAS_LIB_PATH} BLAS_DIR_MATCH) if(NOT BLAS_FOUND OR NOT BLAS_DIR_MATCH STREQUAL "0") set(BLAS_FOUND FALSE PARENT_SCOPE) endif() endfunction() get_filename_component(BLAS_LIB_PATH ${BLAS_LIB_PATH} ABSOLUTE) message(STATUS "Looking for BLAS library in user defined dir: ${BLAS_LIB_PATH}") file(TO_CMAKE_PATH ${BLAS_LIB_PATH} BLAS_LIB_PATH) if(NOT IS_DIRECTORY ${BLAS_LIB_PATH}) message(FATAL_ERROR "${BLAS_LIB_PATH} is not a valid directory") endif() # Modify CMAKE_PREFIX_PATH locally to only search in provided dir # (though FindBLAS ALWAYS search certain system dirs) set(CMAKE_PREFIX_PATH ${BLAS_LIB_PATH}) find_package(BLAS QUIET) # Check if BLAS libs are under provided DIR check_blas_lib_found(${BLAS_LIB_PATH} ${BLAS_LIBRARIES} ${BLAS_FOUND}) if(NOT BLAS_FOUND AND APPLE) # We may need to search for specific APPLE framework # Try again setting the BLA_VENDOR to APPLE set(BLA_VENDOR "Apple") find_package(BLAS QUIET) check_blas_lib_found(${BLAS_LIB_PATH} ${BLAS_LIBRARIES} ${BLAS_FOUND}) endif() if(NOT BLAS_FOUND) message(FATAL_ERROR "BLAS library not found in dir: ${BLAS_LIB_PATH}") endif() set(BLAS_LIBRARIES ${BLAS_LIBRARIES} PARENT_SCOPE) set(BLAS_FOUND ${BLAS_FOUND} PARENT_SCOPE) set(BLAS_LINKER_FLAGS ${BLAS_LINKER_FLAGS} PARENT_SCOPE) endfunction() qiskit-aer-0.4.1/cmake/targetLinkLibrariesWithDynamicLookup.cmake000066400000000000000000000404351362723322000251510ustar00rootroot00000000000000#.rst: # # Public Functions # ^^^^^^^^^^^^^^^^ # # The following functions are defined: # # .. cmake:command:: target_link_libraries_with_dynamic_lookup # # :: # # target_link_libraries_with_dynamic_lookup( []) # # # Useful to "weakly" link a loadable module. For example, it should be used # when compiling a loadable module when the symbols should be resolve from # the run-time environment where the module is loaded, and not a specific # system library. # # Like proper linking, except that the given ```` are not necessarily # linked. Instead, the ```` is produced in a manner that allows for # symbols unresolved within it to be resolved at runtime, presumably by the # given ````. If such a target can be produced, the provided # ```` are not actually linked. # # It links a library to a target such that the symbols are resolved at # run-time not link-time. # # The linker is checked to see if it supports undefined # symbols when linking a shared library. If it does then the library # is not linked when specified with this function. # # On platforms that do not support weak-linking, this function works just # like ``target_link_libraries``. # # .. note:: # # For OSX it uses ``undefined dynamic_lookup``. This is similar to using # ``-shared`` on Linux where undefined symbols are ignored. # # For more details, see `blog `_ # from Tim D. Smith. # # # .. cmake:command:: check_dynamic_lookup # # Check if the linker requires a command line flag to allow leaving symbols # unresolved when producing a target of type ```` that is # weakly-linked against a dependency of type ````. # # ```` # can be one of "STATIC", "SHARED", "MODULE", or "EXE". # # ```` # can be one of "STATIC", "SHARED", or "MODULE". # # Long signature: # # :: # # check_dynamic_lookup( # # # []) # # # Short signature: # # :: # # check_dynamic_lookup() # set to "MODULE" # # set to "SHARED" # # # The result is cached between invocations and recomputed only when the value # of CMake's linker flag list changes; ``CMAKE_STATIC_LINKER_FLAGS`` if # ```` is "STATIC", and ``CMAKE_SHARED_LINKER_FLAGS`` otherwise. # # # Defined variables: # # ```` # Whether the current C toolchain supports weak-linking for target binaries of # type ```` that are weakly-linked against a dependency target of # type ````. # # ```` # List of flags to add to the linker command to produce a working target # binary of type ```` that is weakly-linked against a dependency # target of type ````. # # ``HAS_DYNAMIC_LOOKUP__`` # Cached, global alias for ```` # # ``DYNAMIC_LOOKUP_FLAGS__`` # Cached, global alias for ```` # # # Private Functions # ^^^^^^^^^^^^^^^^^ # # The following private functions are defined: # # .. warning:: These functions are not part of the scikit-build API. They # exist purely as an implementation detail and may change from version # to version without notice, or even be removed. # # We mean it. # # # .. cmake:command:: _get_target_type # # :: # # _get_target_type( ) # # # Shorthand for querying an abbreviated version of the target type # of the given ````. # # ```` is set to: # # - "STATIC" for a STATIC_LIBRARY, # - "SHARED" for a SHARED_LIBRARY, # - "MODULE" for a MODULE_LIBRARY, # - and "EXE" for an EXECUTABLE. # # Defined variables: # # ```` # The abbreviated version of the ````'s type. # # # .. cmake:command:: _test_weak_link_project # # :: # # _test_weak_link_project( # # # ) # # # Attempt to compile and run a test project where a target of type # ```` is weakly-linked against a dependency of type ````: # # - ```` can be one of "STATIC", "SHARED", "MODULE", or "EXE". # - ```` can be one of "STATIC", "SHARED", or "MODULE". # # Defined variables: # # ```` # Whether the current C toolchain can produce a working target binary of type # ```` that is weakly-linked against a dependency target of type # ````. # # ```` # List of flags to add to the linker command to produce a working target # binary of type ```` that is weakly-linked against a dependency # target of type ````. # function(_get_target_type result_var target) set(target_type "SHARED_LIBRARY") if(TARGET ${target}) get_property(target_type TARGET ${target} PROPERTY TYPE) endif() set(result "STATIC") if(target_type STREQUAL "STATIC_LIBRARY") set(result "STATIC") endif() if(target_type STREQUAL "SHARED_LIBRARY") set(result "SHARED") endif() if(target_type STREQUAL "MODULE_LIBRARY") set(result "MODULE") endif() if(target_type STREQUAL "EXECUTABLE") set(result "EXE") endif() set(${result_var} ${result} PARENT_SCOPE) endfunction() function(_test_weak_link_project target_type lib_type can_weak_link_var project_name) set(gnu_ld_ignore "-Wl,--unresolved-symbols=ignore-all") set(osx_dynamic_lookup "-undefined dynamic_lookup") set(no_flag "") foreach(link_flag_spec gnu_ld_ignore osx_dynamic_lookup no_flag) set(link_flag "${${link_flag_spec}}") set(test_project_dir "${PROJECT_BINARY_DIR}/CMakeTmp") set(test_project_dir "${test_project_dir}/${project_name}") set(test_project_dir "${test_project_dir}/${link_flag_spec}") set(test_project_dir "${test_project_dir}/${target_type}") set(test_project_dir "${test_project_dir}/${lib_type}") set(test_project_src_dir "${test_project_dir}/src") set(test_project_bin_dir "${test_project_dir}/build") file(MAKE_DIRECTORY ${test_project_src_dir}) file(MAKE_DIRECTORY ${test_project_bin_dir}) set(mod_type "STATIC") set(link_mod_lib TRUE) set(link_exe_lib TRUE) set(link_exe_mod FALSE) if("${target_type}" STREQUAL "EXE") set(link_exe_lib FALSE) set(link_exe_mod TRUE) else() set(mod_type "${target_type}") endif() if("${mod_type}" STREQUAL "MODULE") set(link_mod_lib FALSE) endif() file(WRITE "${test_project_src_dir}/CMakeLists.txt" " cmake_minimum_required(VERSION ${CMAKE_VERSION}) project(${project_name} C) include_directories(${test_project_src_dir}) add_library(number ${lib_type} number.c) add_library(counter ${mod_type} counter.c) ") if("${mod_type}" STREQUAL "MODULE") file(APPEND "${test_project_src_dir}/CMakeLists.txt" " set_target_properties(counter PROPERTIES PREFIX \"\") ") endif() if(link_mod_lib) file(APPEND "${test_project_src_dir}/CMakeLists.txt" " target_link_libraries(counter number) ") elseif(NOT link_flag STREQUAL "") file(APPEND "${test_project_src_dir}/CMakeLists.txt" " set_target_properties(counter PROPERTIES LINK_FLAGS \"${link_flag}\") ") endif() file(APPEND "${test_project_src_dir}/CMakeLists.txt" " add_executable(main main.c) ") if(link_exe_lib) file(APPEND "${test_project_src_dir}/CMakeLists.txt" " target_link_libraries(main number) ") elseif(NOT link_flag STREQUAL "") file(APPEND "${test_project_src_dir}/CMakeLists.txt" " target_link_libraries(main \"${link_flag}\") ") endif() if(link_exe_mod) file(APPEND "${test_project_src_dir}/CMakeLists.txt" " target_link_libraries(main counter) ") else() file(APPEND "${test_project_src_dir}/CMakeLists.txt" " target_link_libraries(main \"${CMAKE_DL_LIBS}\") ") endif() file(WRITE "${test_project_src_dir}/number.c" " #include static int _number; void set_number(int number) { _number = number; } int get_number() { return _number; } ") file(WRITE "${test_project_src_dir}/number.h" " #ifndef _NUMBER_H #define _NUMBER_H extern void set_number(int); extern int get_number(void); #endif ") file(WRITE "${test_project_src_dir}/counter.c" " #include int count() { int result = get_number(); set_number(result + 1); return result; } ") file(WRITE "${test_project_src_dir}/counter.h" " #ifndef _COUNTER_H #define _COUNTER_H extern int count(void); #endif ") file(WRITE "${test_project_src_dir}/main.c" " #include #include #include ") if(NOT link_exe_mod) file(APPEND "${test_project_src_dir}/main.c" " #include ") endif() file(APPEND "${test_project_src_dir}/main.c" " int my_count() { int result = get_number(); set_number(result + 1); return result; } int main(int argc, char **argv) { int result; ") if(NOT link_exe_mod) file(APPEND "${test_project_src_dir}/main.c" " void *counter_module; int (*count)(void); counter_module = dlopen(\"./counter.so\", RTLD_LAZY | RTLD_GLOBAL); if(!counter_module) goto error; count = dlsym(counter_module, \"count\"); if(!count) goto error; ") endif() file(APPEND "${test_project_src_dir}/main.c" " result = count() != 0 ? EXIT_FAILURE : my_count() != 1 ? EXIT_FAILURE : my_count() != 2 ? EXIT_FAILURE : count() != 3 ? EXIT_FAILURE : count() != 4 ? EXIT_FAILURE : count() != 5 ? EXIT_FAILURE : my_count() != 6 ? EXIT_FAILURE : EXIT_SUCCESS; ") if(NOT link_exe_mod) file(APPEND "${test_project_src_dir}/main.c" " goto done; error: fprintf(stderr, \"Error occured:\\n %s\\n\", dlerror()); result = 1; done: if(counter_module) dlclose(counter_module); ") endif() file(APPEND "${test_project_src_dir}/main.c" " return result; } ") set(_rpath_arg) if(APPLE AND ${CMAKE_VERSION} VERSION_GREATER 2.8.11) set(_rpath_arg "-DCMAKE_MACOSX_RPATH='${CMAKE_MACOSX_RPATH}'") endif() try_compile(project_compiles "${test_project_bin_dir}" "${test_project_src_dir}" "${project_name}" CMAKE_FLAGS "-DCMAKE_SHARED_LINKER_FLAGS='${CMAKE_SHARED_LINKER_FLAGS}'" "-DCMAKE_ENABLE_EXPORTS=ON" ${_rpath_arg} OUTPUT_VARIABLE compile_output) set(project_works 1) set(run_output) if(project_compiles) execute_process(COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} "${test_project_bin_dir}/main" WORKING_DIRECTORY "${test_project_bin_dir}" RESULT_VARIABLE project_works OUTPUT_VARIABLE run_output ERROR_VARIABLE run_output) endif() set(test_description "Weak Link ${target_type} -> ${lib_type} (${link_flag_spec})") if(project_works EQUAL 0) set(project_works TRUE) message(STATUS "Performing Test ${test_description} - Success") else() set(project_works FALSE) message(STATUS "Performing Test ${test_description} - Failed") file(APPEND ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/CMakeError.log "Performing Test ${test_description} failed with the " "following output:\n" "BUILD\n-----\n${compile_output}\nRUN\n---\n${run_output}\n") endif() set(${can_weak_link_var} ${project_works} PARENT_SCOPE) if(project_works) set(${project_name} ${link_flag} PARENT_SCOPE) break() endif() endforeach() endfunction() function(check_dynamic_lookup) # Two signatures are supported: if(ARGC EQUAL "1") # # check_dynamic_lookup() # set(target_type "MODULE") set(lib_type "SHARED") set(has_dynamic_lookup_var "${ARGV0}") set(link_flags_var "unused") elseif(ARGC GREATER "2") # # check_dynamic_lookup( # # # []) # set(target_type "${ARGV0}") set(lib_type "${ARGV1}") set(has_dynamic_lookup_var "${ARGV2}") if(ARGC EQUAL "3") set(link_flags_var "unused") else() set(link_flags_var "${ARGV3}") endif() else() message(FATAL_ERROR "missing arguments") endif() _check_dynamic_lookup( ${target_type} ${lib_type} ${has_dynamic_lookup_var} ${link_flags_var} ) set(${has_dynamic_lookup_var} ${${has_dynamic_lookup_var}} PARENT_SCOPE) if(NOT "x${link_flags_var}x" STREQUAL "xunusedx") set(${link_flags_var} ${${link_flags_var}} PARENT_SCOPE) endif() endfunction() function(_check_dynamic_lookup target_type lib_type has_dynamic_lookup_var link_flags_var ) # hash the CMAKE_FLAGS passed and check cache to know if we need to rerun if("${target_type}" STREQUAL "STATIC") string(MD5 cmake_flags_hash "${CMAKE_STATIC_LINKER_FLAGS}") else() string(MD5 cmake_flags_hash "${CMAKE_SHARED_LINKER_FLAGS}") endif() set(cache_var "HAS_DYNAMIC_LOOKUP_${target_type}_${lib_type}") set(cache_hash_var "HAS_DYNAMIC_LOOKUP_${target_type}_${lib_type}_hash") set(result_var "DYNAMIC_LOOKUP_FLAGS_${target_type}_${lib_type}") if( NOT DEFINED ${cache_hash_var} OR NOT "${${cache_hash_var}}" STREQUAL "${cmake_flags_hash}") unset(${cache_var} CACHE) endif() if(NOT DEFINED ${cache_var}) set(skip_test FALSE) if(CMAKE_CROSSCOMPILING AND NOT CMAKE_CROSSCOMPILING_EMULATOR) set(skip_test TRUE) endif() if(skip_test) set(has_dynamic_lookup FALSE) set(link_flags) else() _test_weak_link_project(${target_type} ${lib_type} has_dynamic_lookup link_flags) endif() set(caveat " (when linking ${target_type} against ${lib_type})") set(${cache_var} "${has_dynamic_lookup}" CACHE BOOL "linker supports dynamic lookup for undefined symbols${caveat}") mark_as_advanced(${cache_var}) set(${result_var} "${link_flags}" CACHE STRING "linker flags for dynamic lookup${caveat}") mark_as_advanced(${result_var}) set(${cache_hash_var} "${cmake_flags_hash}" CACHE INTERNAL "hashed flags for ${cache_var} check") endif() set(${has_dynamic_lookup_var} "${${cache_var}}" PARENT_SCOPE) set(${link_flags_var} "${${result_var}}" PARENT_SCOPE) endfunction() function(target_link_libraries_with_dynamic_lookup target) _get_target_type(target_type ${target}) set(link_props) set(link_items) set(link_libs) foreach(lib ${ARGN}) _get_target_type(lib_type ${lib}) check_dynamic_lookup(${target_type} ${lib_type} has_dynamic_lookup dynamic_lookup_flags) if(has_dynamic_lookup) if(dynamic_lookup_flags) if("${target_type}" STREQUAL "EXE") list(APPEND link_items "${dynamic_lookup_flags}") else() list(APPEND link_props "${dynamic_lookup_flags}") endif() endif() elseif(${lib} MATCHES "(debug|optimized|general)") # See gh-255 else() list(APPEND link_libs "${lib}") endif() endforeach() if(link_props) list(REMOVE_DUPLICATES link_props) endif() if(link_items) list(REMOVE_DUPLICATES link_items) endif() if(link_libs) list(REMOVE_DUPLICATES link_libs) endif() if(link_props) set_target_properties(${target} PROPERTIES LINK_FLAGS "${link_props}") endif() set(links "${link_items}" "${link_libs}") if(links) target_link_libraries(${target} "${links}") endif() endfunction() qiskit-aer-0.4.1/constraints.txt000066400000000000000000000000351362723322000166730ustar00rootroot00000000000000pylint==2.4.4 astroid==2.3.3 qiskit-aer-0.4.1/contrib/000077500000000000000000000000001362723322000152255ustar00rootroot00000000000000qiskit-aer-0.4.1/contrib/standalone/000077500000000000000000000000001362723322000173555ustar00rootroot00000000000000qiskit-aer-0.4.1/contrib/standalone/qasm_simulator.cpp000077500000000000000000000114531362723322000231300ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ //#define DEBUG // Uncomment for verbose debugging output #include #include #include #include "version.hpp" // Simulator #include "controllers/qasm_controller.hpp" /******************************************************************************* * * EXIT CODES: * * 0: The Qobj was succesfully executed. * Returns full result JSON. * * 1: Command line invalid or Qobj JSON cannot be loaded. * Returns JSON: * {"success": false, "status": "ERROR: Invalid input (error msg)"} * * 2: Qobj failed to load or execute. * Returns JSON: * {"success": false, "status": "ERROR: Failed to execute qobj (error msg)"} * * 3: At least one experiment in Qobj failed to execute successfully. * Returns parial result JSON with failed experiments returning: * "{"success": false, "status": "ERROR: error msg"} * ******************************************************************************/ enum class CmdArguments { SHOW_VERSION, INPUT_CONFIG, INPUT_DATA }; inline CmdArguments parse_cmd_options(const std::string& argv){ if(argv == "-v" || argv == "--version") return CmdArguments::SHOW_VERSION; if (argv == "-c" || argv == "--config") return CmdArguments::INPUT_CONFIG; return CmdArguments::INPUT_DATA; } inline void show_version(){ std::cout << "Qiskit Aer: " << AER_MAJOR_VERSION << "." << AER_MINOR_VERSION << "." << AER_PATCH_VERSION << "\n"; } inline void failed(const std::string &msg, std::ostream &o = std::cout, int indent = -1){ json_t ret; ret["success"] = false; ret["status"] = std::string("ERROR: ") + msg; o << ret.dump(indent) << std::endl; } inline void usage(const std::string& command, std::ostream &out){ failed("Invalid command line", out); // Print usage message std::cerr << "\n\n"; show_version(); std::cerr << "\n"; std::cerr << "Usage: \n"; std::cerr << command << " [-v] [-c ] \n"; std::cerr << " -v : Show version\n"; std::cerr << " -c : Configuration file\n";; std::cerr << " file : qobj file\n"; } int main(int argc, char **argv) { std::ostream &out = std::cout; // output stream int indent = 4; json_t qobj; json_t config; if(argc == 1){ // NOLINT usage(std::string(argv[0]), out); // NOLINT return 1; } // Parse command line options for(auto pos = 1UL; pos < static_cast(argc); ++pos){ // NOLINT auto option = parse_cmd_options(std::string(argv[pos])); // NOLINT switch(option){ case CmdArguments::SHOW_VERSION: show_version(); return 0; case CmdArguments::INPUT_CONFIG: if (++pos == static_cast(argc)) { failed("Invalid config (no file is specified.)", out, indent); return 1; } try { config = JSON::load(std::string(argv[pos])); }catch(std::exception &e){ std::string msg = "Invalid config (" + std::string(e.what()) + ")"; failed(msg, out, indent); return 1; } break; case CmdArguments::INPUT_DATA: try { qobj = JSON::load(std::string(argv[pos])); // NOLINT pos = argc; //Exit from the loop }catch(std::exception &e){ std::string msg = "Invalid input (" + std::string(e.what()) + ")"; failed(msg, out, indent); return 1; } break; } } // Execute simulation try { // Check for command line config // and if present add to qobj config json_t& config_all = qobj["config"]; if (!config.empty()) // NOLINT config_all.update(config.begin(), config.end()); // Initialize simulator AER::Simulator::QasmController sim; auto result = sim.execute(qobj); out << result.json().dump(4) << std::endl; // Check if execution was successful. bool success = false; std::string status; JSON::get_value(success, "success", result); JSON::get_value(status, "status", result); if (!success) { if(status == "COMPLETED") return 3; // The simulation was was completed unsuccesfully. return 2; // Failed to execute the Qobj } } catch (std::exception &e) { std::stringstream msg; msg << "Failed to execute qobj (" << e.what() << ")"; failed(msg.str(), out, indent); return 2; } return 0; } // end main qiskit-aer-0.4.1/contrib/standalone/version.hpp.in000066400000000000000000000011671362723322000221650ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #define AER_MAJOR_VERSION ${MAJOR_VERSION} #define AER_MINOR_VERSION ${MINOR_VERSION} #define AER_PATCH_VERSION ${PATCH_VERSION}qiskit-aer-0.4.1/docs/000077500000000000000000000000001362723322000145155ustar00rootroot00000000000000qiskit-aer-0.4.1/docs/Makefile000066400000000000000000000017641362723322000161650ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) qiskit-aer-0.4.1/docs/_static/000077500000000000000000000000001362723322000161435ustar00rootroot00000000000000qiskit-aer-0.4.1/docs/_static/style.css000066400000000000000000000001711362723322000200140ustar00rootroot00000000000000.wy-nav-content { max-width: 90% !important; } .wy-side-scroll { background:#8c8c8c; } .pre { color:#BE8184; } qiskit-aer-0.4.1/docs/_templates/000077500000000000000000000000001362723322000166525ustar00rootroot00000000000000qiskit-aer-0.4.1/docs/_templates/autosummary/000077500000000000000000000000001362723322000212405ustar00rootroot00000000000000qiskit-aer-0.4.1/docs/_templates/autosummary/base.rst000066400000000000000000000002521362723322000227030ustar00rootroot00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. currentmodule:: {{ module }} .. auto{{ objtype }}:: {{ objname }} qiskit-aer-0.4.1/docs/_templates/autosummary/class.rst000066400000000000000000000020561362723322000231020ustar00rootroot00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} :no-members: :no-inherited-members: :no-special-members: {% block attributes_summary %} {% if attributes %} .. rubric:: Attributes .. autosummary:: :toctree: ../stubs/ {% for item in all_attributes %} {%- if not item.startswith('_') %} {{ name }}.{{ item }} {%- endif -%} {%- endfor %} {% endif %} {% endblock %} {% block methods_summary %} {% if methods %} .. rubric:: Methods .. autosummary:: :toctree: ../stubs/ {% for item in all_methods %} {%- if not item.startswith('_') or item in ['__call__', '__mul__', '__getitem__', '__len__'] %} {{ name }}.{{ item }} {%- endif -%} {%- endfor %} {% for item in inherited_members %} {%- if item in ['__call__', '__mul__', '__getitem__', '__len__'] %} {{ name }}.{{ item }} {%- endif -%} {%- endfor %} {% endif %} {% endblock %} qiskit-aer-0.4.1/docs/_templates/autosummary/module.rst000066400000000000000000000012771362723322000232660ustar00rootroot00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. automodule:: {{ fullname }} {% block functions %} {% if functions %} .. rubric:: Functions .. autosummary:: {% for item in functions %} {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block classes %} {% if classes %} .. rubric:: Classes .. autosummary:: {% for item in classes %} {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block exceptions %} {% if exceptions %} .. rubric:: Exceptions .. autosummary:: {% for item in exceptions %} {{ item }} {%- endfor %} {% endif %} {% endblock %} qiskit-aer-0.4.1/docs/apidocs/000077500000000000000000000000001362723322000161375ustar00rootroot00000000000000qiskit-aer-0.4.1/docs/apidocs/aer.rst000066400000000000000000000003121362723322000174340ustar00rootroot00000000000000.. _qiskit-aer: ======================== Qiskit Aer API Reference ======================== .. toctree:: :maxdepth: 1 aer_provider aer_extensions aer_noise aer_pulse aer_utils qiskit-aer-0.4.1/docs/apidocs/aer_extensions.rst000066400000000000000000000002161362723322000217160ustar00rootroot00000000000000.. _aer-circuit-extensions: .. automodule:: qiskit.providers.aer.extensions :no-members: :no-inherited-members: :no-special-members:qiskit-aer-0.4.1/docs/apidocs/aer_noise.rst000066400000000000000000000001771362723322000206420ustar00rootroot00000000000000.. _aer-noise: .. automodule:: qiskit.providers.aer.noise :no-members: :no-inherited-members: :no-special-members:qiskit-aer-0.4.1/docs/apidocs/aer_provider.rst000066400000000000000000000001741362723322000213540ustar00rootroot00000000000000.. _aer-provider: .. automodule:: qiskit.providers.aer :no-members: :no-inherited-members: :no-special-members:qiskit-aer-0.4.1/docs/apidocs/aer_pulse.rst000066400000000000000000000001771362723322000206550ustar00rootroot00000000000000.. _aer-pulse: .. automodule:: qiskit.providers.aer.pulse :no-members: :no-inherited-members: :no-special-members:qiskit-aer-0.4.1/docs/apidocs/aer_utils.rst000066400000000000000000000001771362723322000206650ustar00rootroot00000000000000.. _aer-utils: .. automodule:: qiskit.providers.aer.utils :no-members: :no-inherited-members: :no-special-members:qiskit-aer-0.4.1/docs/conf.py000066400000000000000000000116071362723322000160210ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name # Configuration file for the Sphinx documentation builder. # # This file does only contain a selection of the most common options. For a # full list see the documentation: # http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # # import os # import sys # sys.path.insert(0, os.path.abspath('.')) """ Sphinx documentation builder """ import os # Set env flag so that we can doc functions that may otherwise not be loaded # see for example interactive visualizations in qiskit.visualization. os.environ['QISKIT_DOCS'] = 'TRUE' # -- Project information ----------------------------------------------------- project = 'Qiskit' copyright = '2019, Qiskit Development Team' # pylint: disable=redefined-builtin author = 'Qiskit Development Team' # The short X.Y version version = '' # The full version, including alpha/beta/rc tags release = '0.12.0' # -- General configuration --------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. # # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'sphinx.ext.napoleon', 'sphinx.ext.autodoc', 'sphinx.ext.autosummary', 'sphinx.ext.mathjax', 'sphinx.ext.viewcode', 'sphinx.ext.extlinks', 'sphinx_tabs.tabs', 'jupyter_sphinx.execute', ] html_static_path = ['_static'] templates_path = ['_templates'] html_css_files = [ 'style.css', ] # ----------------------------------------------------------------------------- # Autosummary # ----------------------------------------------------------------------------- autosummary_generate = True # ----------------------------------------------------------------------------- # Autodoc # ----------------------------------------------------------------------------- autodoc_default_options = { 'inherited-members': None, } # If true, figures, tables and code-blocks are automatically numbered if they # have a caption. numfig = True # A dictionary mapping 'figure', 'table', 'code-block' and 'section' to # strings that are used for format of figure numbers. As a special character, # %s will be replaced to figure number. numfig_format = { 'table': 'Table %s' } # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = None # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'colorful' # A boolean that decides whether module names are prepended to all object names # (for object types where a “module” of some kind is defined), e.g. for # py:function directives. add_module_names = False # A list of prefixes that are ignored for sorting the Python module index # (e.g., if this is set to ['foo.'], then foo.bar is shown under B, not F). # This can be handy if you document a project that consists of a single # package. Works only for the HTML builder currently. modindex_common_prefix = ['qiskit.providers'] # -- Configuration for extlinks extension ------------------------------------ # Refer to https://www.sphinx-doc.org/en/master/usage/extensions/extlinks.html # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'sphinx_rtd_theme' # use the theme in subdir 'theme' html_logo = 'images/logo.png' #html_sidebars = {'**': ['globaltoc.html']} html_last_updated_fmt = '%Y/%m/%d' html_theme_options = { 'logo_only': True, 'display_version': True, 'prev_next_buttons_location': 'bottom', 'style_external_links': True, 'style_nav_header_background': '#212121', } autoclass_content = 'both' qiskit-aer-0.4.1/docs/images/000077500000000000000000000000001362723322000157625ustar00rootroot00000000000000qiskit-aer-0.4.1/docs/images/logo.png000066400000000000000000000224211362723322000174310ustar00rootroot00000000000000PNG  IHDRFgAMA a cHRMz&u0`:pQ< iTXtXML:com.adobe.xmp 2 1 1 2 E*"IDATx [ř[0`,s< [YH,w*Xfl ͹lR dlPK,ZdYaFcs,_clOϓtF꛾;<x @<x @<x @NԏN[V|| vx"a6BA ~~N' K.XŒqBf\NzΞQ @@F`JZ&.1J:Ur@#sFb ESy=Eq3Jj]7^tax7XY4[ǙJ48mp.4¡bէmb(EhvExk>F+M.ʏ!:k yYE^',HY[F Huq I;e 3n !>$K4 mDvsö|ڳ4Ԁ IKKMqve+tD ~rE9:L<K^DlI:^NH}a:) qE}t_9t^na5ⷿΌ/R~$rr0bp)*v+$H VHe]FtN'=*@E.dI8K2ni؋$^iUE8N>E/ݨIzn~B-"oNHPAC3S( qt zhЌBvJy)Fa.7JCrԯq~H!l+8HO~S' H a͚5ߛ9s W?KHvQ$ȇnNxÔ)S{zzvqz3f6U =?|&㏳HŐ|gN&OU^4vئ&@Ԅj o ['xc[ll /H/}#"Yj+N9h>CcxPC{N;ͷ ^3%3s ݶ _;\x23Қ}AQ 4L B:PsG~:&MB:Cu-lF Dƶa}_[8s9lذa9=:묊^3;VUI; hX G RZ8@od T;e7opYg? L tyd* Ϻu+DL=8v+DZ녺e˖ -'Jǒt:-; 3La n'^4 j5+؇,hdj=c<9]/aW/Zx^vz!)>i$XD`+$S %80Bި_c"JǁS 3ёSNaR NB3a`;J?ӏY/AOJ BXj@Gj#|!fm6'{VCtCF(κgݓO>C*11^?F(Zd|]UK{zx㍊|*Bn”MPre+vi,[>阏G}t1@7CCv}>SѰہ]a}RnJF(?'a¶mWӧ`'RU`UPT'ݦIDpel_YёC0׆+vp¸.++RUgp9:zTrONEJW>U̔K"A5Z;<6RUe *"+YQ (RU,2ؗAJVPC|B~ܣLYiXWHI&^>)7aTsmx2>&LNUn]e,fGuZf"@B`ģG 821z]ەi@[!m% vE+W=mm?r]~ 2RI^*&QSl) V}#'e{B+˦o䣰 l= t2[݊PeDg>2C#Yn5kVK8{jw]wY?[vv%4M Ց#.ɂ%[zHG[FgeKȐά =: [ J E54ߛӭ~&*k-⋗]yἏ}i~:hO?[7ίcә(CHi6`j#',r#;㎹^ُloKͥ=NO"tIRqQRw邢IҺQ$l}G1J}\ v8.%"~G^x "GGr3=eMʇ.`p =Pa@;aN@s?,zo+;xQ^RGC"i_1Yd[B_~y ǰ s6O鮾:Q -nd@H׌Kyi7髍LBz~#CG'!g?[lH8$9r k 3'X,T96h6fx Q$G_ .<ݙ};A~4=qqϞ6mZ aPV 08xO>Kyͽ+ N6Htc\WsV0vi 'H Sƒ2 %XVKW^zr4kg@#,ũK^'W:vm_6y"<_;_f,o?~kW@I2bԪ2-:JYkVL^{ͥ:A?ըS:XE@7ʇ@ꫯfB:[bt{*tp-ut25/|aS1gm+#%aNCI&rX1@j\#(NnC (4#mև7 ~W g12,zT,l{UsK;1'mZt mkfɜwW}H"\{WJ"N0إtH#3nh Ba”Up"ilPB]n,gSҭw6ߙV×\r+ )*IآE.0Ge[4(J&l ~p 0ᦣ>zɓ'a@ZYcM|z R疎>E0ɜx5SKed5">h BPT#HKj<8 uFt$18:2{kym<)r~7[ /`OFRBd pf3+MmDb *ʓ%ȟ4 %܄߰X8mz_Msf-33@Mߴy.dw9|/}79o=uu+F>ˇ S׃# 7x}!On5% äP4dfԴ 73ew+ʬwj׏N|Œaz#ASL*ČhZ+IzE.KM\YZ,{˹rħ7R:s՝Ō)z1 efڂ'/w2:zL[,7gN-޺ߥp T&jņ\z>cm軼Y=M]sZBv$W^e ^y7j1U=#c <ԟ@K8',xC1 cFk[/޾׽BZYƾWIx xŘize 1^Sėq8}pʬTGȤTWJLޠL#ע(x覡,{ACf^Y~mMѱZKo<]zЕ/n'gk":zB)FJа 6ٳ Wvie7 *bf l"vfYY)MI'nJu6'0'Ia <+d$Sb$賅lMl a]?9/v}q2Ծl[wy6jeF.S`Dꙭgi+yɤs9ŪK2iާ-v=Fü*t BSUIh28m駟9οOfMC*s{ŋVۨ,~m;f3H8RY[Iz9N]t7߼-f> \pq7]2g”@)#A7q (Baf&s @ipF3S4-^- &)3__: /@Bk(R}3d?k@ju/]&||ܹ{ߟAlD|w?O:pl"AT ~ \C3%[IR(%OB L%8-\izf-<û9^mݟ&*&LvNK)&jwIa#btI'+c-$,4Q6I 뵄,:MP=~g-8պ c0.ᖽx` @p)]4D|_zSZUIT ,/ZZ_2:=Z e^g|- ӟRH (9=-_\w]4O+³"O$1ӧO$3U LzE)<4zޮjm"Fz$%Wׇߠ~oUp|eN>+Hygnds}@ u^=7^9e⬨LTs-wOx 0HGF¼u=⃋K6)1f!iQ_GA% f#a?}XǗL2 _JmV<o+A:Qi= n-O[+ U6קc"֣`yh&=k;AGL@=?Y)%Ay]fmӨCȏs0<۳%O>2M#.;nQv:쵀{j"vz dlLB@?K^Өӓ)v")$.S`erڰ 1 PG݆Rþvilhzmj*Vùȝj o"/ ĪwCqsVE'HRI5`–HӔr&!X`RrrHF8˱i)5'=^m*WWiuo;ELiYP9xըoWNTBU3˱'J_zUt!4rIq^nqdōafm6oDÖC9d6TI+ m ofw+;-wd_#::=-蹒bݶ zHTy:e&D'f֋#JU yu\C,f_uUqxWFVe =/­qP>jvQj]~IuCvԡBd;Խ /3n %#qkT:#JU yq\Q{Vq7.D!?lrGtȦϘ9#)39C5Sg̘1ͻ1Hw#ꂩ ˙~/yفc_;ymN~PJS&脽fJ~I9$pb gs⽔im"K<&u.J@u.Bx?o'Y*LxfVȏy8z ',tPcsbGP ª*g`/"8Hf\AJG2¿ž[x/>pKܸ6?_N'N=0yӄ\-[]-"@\p%Ş$t 1XóQH):mȑFm:H#C:4dƠ ù2*^ApjGS RFiQ(} 6(1aXz'|Bd{lYCHunuM]d4Xϥ'mYp0Q8ePf'єzM;AOŒv%؏Yj?b4~k+ۧ|QS+eލNp[NX kFH!T7 B& 4)QC @()l|/w)m3; p9@M?)8ᆣ08 HR{ZhRX% PN<<x @<x @<x @<x {\0IENDB`qiskit-aer-0.4.1/docs/index.rst000066400000000000000000000003551362723322000163610ustar00rootroot00000000000000########################## Qiskit Aer documentation ########################## .. toctree:: :maxdepth: 2 API Documentation .. Hiding - Indices and tables :ref:`genindex` :ref:`modindex` :ref:`search` qiskit-aer-0.4.1/pyproject.toml000066400000000000000000000001441362723322000165000ustar00rootroot00000000000000[build-system] requires = ["setuptools", "wheel", "scikit-build", "cmake", "ninja", "pybind11>2.4"] qiskit-aer-0.4.1/qiskit/000077500000000000000000000000001362723322000150715ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/__init__.pxd000066400000000000000000000000001362723322000173330ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/000077500000000000000000000000001362723322000171065ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/__init__.pxd000066400000000000000000000000001362723322000213500ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/000077500000000000000000000000001362723322000176555ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/VERSION.txt000066400000000000000000000000061362723322000215370ustar00rootroot000000000000000.4.1 qiskit-aer-0.4.1/qiskit/providers/aer/__init__.py000066400000000000000000000033721362723322000217730ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ ========================================== Aer Provider (:mod:`qiskit.providers.aer`) ========================================== .. currentmodule:: qiskit.providers.aer Simulator Provider ================== .. autosummary:: :toctree: ../stubs/ AerProvider Simulator Backends ================== .. autosummary:: :toctree: ../stubs/ QasmSimulator StatevectorSimulator UnitarySimulator PulseSimulator Job Class ========= .. autosummary:: :toctree: ../stubs/ AerJob Exceptions ========== .. autosummary:: :toctree: ../stubs/ AerError """ # https://github.com/Qiskit/qiskit-aer/issues/1 # Because of this issue, we need to make sure that Numpy's OpenMP library is initialized # before loading our simulators, so we force it using this ugly trick import platform if platform.system() == "Darwin": import numpy as np np.dot(np.zeros(100), np.zeros(100)) # ... ¯\_(ツ)_/¯ # pylint: disable=wrong-import-position from .aerprovider import AerProvider from .aerjob import AerJob from .aererror import AerError from .backends import * from . import pulse from . import noise from . import utils from .version import __version__ # Global instance to be used as the entry point for convenience. Aer = AerProvider() # pylint: disable=invalid-name qiskit-aer-0.4.1/qiskit/providers/aer/aererror.py000066400000000000000000000016201362723322000220470ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Exception for errors raised by Qiskit Aer simulators backends. """ from qiskit import QiskitError class AerError(QiskitError): """Base class for errors raised by simulators.""" def __init__(self, *message): """Set the error message.""" super().__init__(*message) self.message = ' '.join(message) def __str__(self): """Return the message.""" return repr(self.message) qiskit-aer-0.4.1/qiskit/providers/aer/aerjob.py000066400000000000000000000104171362723322000214740ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=arguments-differ """This module implements the job class used for AerBackend objects.""" from concurrent import futures import logging import functools from qiskit.providers import BaseJob, JobStatus, JobError logger = logging.getLogger(__name__) def requires_submit(func): """ Decorator to ensure that a submit has been performed before calling the method. Args: func (callable): test function to be decorated. Returns: callable: the decorated function. """ @functools.wraps(func) def _wrapper(self, *args, **kwargs): if self._future is None: raise JobError("Job not submitted yet!. You have to .submit() first!") return func(self, *args, **kwargs) return _wrapper class AerJob(BaseJob): """AerJob class. Attributes: _executor (futures.Executor): executor to handle asynchronous jobs """ _executor = futures.ThreadPoolExecutor(max_workers=1) def __init__(self, backend, job_id, fn, qobj, *args): super().__init__(backend, job_id) self._fn = fn self._qobj = qobj self._args = args self._future = None def submit(self): """Submit the job to the backend for execution. Raises: QobjValidationError: if the JSON serialization of the Qobj passed during construction does not validate against the Qobj schema. JobError: if trying to re-submit the job. """ if self._future is not None: raise JobError("We have already submitted the job!") self._future = self._executor.submit(self._fn, self._job_id, self._qobj, *self._args) @requires_submit def result(self, timeout=None): # pylint: disable=arguments-differ """Get job result. The behavior is the same as the underlying concurrent Future objects, https://docs.python.org/3/library/concurrent.futures.html#future-objects Args: timeout (float): number of seconds to wait for results. Returns: qiskit.Result: Result object Raises: concurrent.futures.TimeoutError: if timeout occurred. concurrent.futures.CancelledError: if job cancelled before completed. """ return self._future.result(timeout=timeout) @requires_submit def cancel(self): return self._future.cancel() @requires_submit def status(self): """Gets the status of the job by querying the Python's future Returns: JobStatus: The current JobStatus Raises: JobError: If the future is in unexpected state concurrent.futures.TimeoutError: if timeout occurred. """ # The order is important here if self._future.running(): _status = JobStatus.RUNNING elif self._future.cancelled(): _status = JobStatus.CANCELLED elif self._future.done(): _status = JobStatus.DONE if self._future.exception() is None else JobStatus.ERROR else: # Note: There is an undocumented Future state: PENDING, that seems to show up when # the job is enqueued, waiting for someone to pick it up. We need to deal with this # state but there's no public API for it, so we are assuming that if the job is not # in any of the previous states, is PENDING, ergo INITIALIZING for us. _status = JobStatus.INITIALIZING return _status def backend(self): """Return the instance of the backend used for this job.""" return self._backend def qobj(self): """Return the Qobj submitted for this job. Returns: Qobj: the Qobj submitted for this job. """ return self._qobj qiskit-aer-0.4.1/qiskit/providers/aer/aerprovider.py000066400000000000000000000034331362723322000225540ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name, bad-continuation """Provider for Qiskit Aer backends.""" from qiskit.providers import BaseProvider from qiskit.providers.providerutils import filter_backends from .backends.qasm_simulator import QasmSimulator from .backends.statevector_simulator import StatevectorSimulator from .backends.unitary_simulator import UnitarySimulator from .backends.pulse_simulator import PulseSimulator class AerProvider(BaseProvider): """Provider for Qiskit Aer backends.""" def __init__(self, *args, **kwargs): super().__init__(args, kwargs) # Populate the list of Aer simulator providers. self._backends = [QasmSimulator(provider=self), StatevectorSimulator(provider=self), UnitarySimulator(provider=self), PulseSimulator(provider=self)] def get_backend(self, name=None, **kwargs): return super().get_backend(name=name, **kwargs) def backends(self, name=None, filters=None, **kwargs): # pylint: disable=arguments-differ backends = self._backends if name: backends = [backend for backend in backends if backend.name() == name] return filter_backends(backends, filters=filters, **kwargs) def __str__(self): return 'AerProvider' qiskit-aer-0.4.1/qiskit/providers/aer/backends/000077500000000000000000000000001362723322000214275ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/backends/__init__.py000066400000000000000000000013131362723322000235360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Aer Provider Simulator Backends """ from .qasm_simulator import QasmSimulator from .statevector_simulator import StatevectorSimulator from .unitary_simulator import UnitarySimulator from .pulse_simulator import PulseSimulator qiskit-aer-0.4.1/qiskit/providers/aer/backends/aerbackend.py000066400000000000000000000174201362723322000240640ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Qiskit Aer qasm simulator backend. """ import json import logging import datetime import os import time import uuid from numpy import ndarray from qiskit.providers import BaseBackend from qiskit.providers.models import BackendStatus from qiskit.qobj import validate_qobj_against_schema from qiskit.result import Result from qiskit.util import local_hardware_info from ..aerjob import AerJob from ..aererror import AerError # Logger logger = logging.getLogger(__name__) # Location where we put external libraries that will be loaded at runtime # by the simulator extension LIBRARY_DIR = os.path.dirname(__file__) class AerJSONEncoder(json.JSONEncoder): """ JSON encoder for NumPy arrays and complex numbers. This functions as the standard JSON Encoder but adds support for encoding: complex numbers z as lists [z.real, z.imag] ndarrays as nested lists. """ # pylint: disable=method-hidden,arguments-differ def default(self, obj): if isinstance(obj, ndarray): return obj.tolist() if isinstance(obj, complex): return [obj.real, obj.imag] if hasattr(obj, "to_dict"): return obj.to_dict() return super().default(obj) class AerBackend(BaseBackend): """Qiskit Aer Backend class.""" def __init__(self, controller, configuration, provider=None): """Aer class for backends. This method should initialize the module and its configuration, and raise an exception if a component of the module is not available. Args: controller (function): Aer cython controller to be executed configuration (BackendConfiguration): backend configuration provider (BaseProvider): provider responsible for this backend Raises: FileNotFoundError if backend executable is not available. AerError: if there is no name in the configuration """ super().__init__(configuration, provider=provider) self._controller = controller # pylint: disable=arguments-differ def run(self, qobj, backend_options=None, noise_model=None, validate=True): """Run a qobj on the backend. Args: qobj (QasmQobj): The Qobj to be executed. backend_options (dict or None): dictionary of backend options for the execution (default: None). noise_model (NoiseModel or None): noise model to use for simulation (default: None). validate (bool): validate the Qobj before running (default: True). Returns: AerJob: The simulation job. Additional Information: * The entries in the ``backend_options`` will be combined with the ``Qobj.config`` dictionary with the values of entries in ``backend_options`` taking precedence. * If present the ``noise_model`` will override any noise model specified in the ``backend_options`` or ``Qobj.config``. """ # Submit job job_id = str(uuid.uuid4()) aer_job = AerJob(self, job_id, self._run_job, qobj, backend_options, noise_model, validate) aer_job.submit() return aer_job def status(self): """Return backend status. Returns: BackendStatus: the status of the backend. """ return BackendStatus(backend_name=self.name(), backend_version=self.configuration().backend_version, operational=True, pending_jobs=0, status_msg='') def _run_job(self, job_id, qobj, backend_options, noise_model, validate): """Run a qobj job""" start = time.time() if validate: validate_qobj_against_schema(qobj) self._validate(qobj, backend_options, noise_model) output = self._controller(self._format_qobj(qobj, backend_options, noise_model)) self._validate_controller_output(output) end = time.time() return self._format_results(job_id, output, end - start) def _format_qobj(self, qobj, backend_options, noise_model): """Format qobj string for qiskit aer controller""" # Convert qobj to dict so as to avoid editing original output = qobj.to_dict() # Add new parameters to config from backend options config = output["config"] if backend_options is not None: for key, val in backend_options.items(): config[key] = val if not hasattr(val, 'to_dict') else val.to_dict() # Add noise model to config if noise_model is not None: config["noise_model"] = noise_model # Add runtime config if 'library_dir' not in config: config['library_dir'] = LIBRARY_DIR if "max_memory_mb" not in config: max_memory_mb = int(local_hardware_info()['memory'] * 1024 / 2) config['max_memory_mb'] = max_memory_mb self._validate_config(config) # Return output return output def _validate_config(self, config): # sanity checks on config- should be removed upon fixing of assemble w.r.t. backend_options if 'backend_options' in config: if isinstance(config['backend_options'], dict): for key, val in config['backend_options'].items(): if hasattr(val, 'to_dict'): config['backend_options'][key] = val.to_dict() elif not isinstance(config['backend_options'], list): raise ValueError("config[backend_options] must be a dict or list!") # Double-check noise_model is a dict type if 'noise_model' in config and not isinstance(config["noise_model"], dict): if hasattr(config["noise_model"], 'to_dict'): config["noise_model"] = config["noise_model"].to_dict() else: raise ValueError("noise_model must be a dict : " + str(type(config["noise_model"]))) def _format_results(self, job_id, output, time_taken): """Construct Result object from simulator output.""" output["job_id"] = job_id output["date"] = datetime.datetime.now().isoformat() output["backend_name"] = self.name() output["backend_version"] = self.configuration().backend_version output["time_taken"] = time_taken return Result.from_dict(output) def _validate_controller_output(self, output): """Validate output from the controller wrapper.""" if not isinstance(output, dict): logger.error("%s: simulation failed.", self.name()) if output: logger.error('Output: %s', output) raise AerError("simulation terminated without returning valid output.") def _validate(self, qobj, backend_options, noise_model): """Validate the qobj, backend_options, noise_model for the backend""" pass def __repr__(self): """Official string representation of an AerBackend.""" display = "{}('{}')".format(self.__class__.__name__, self.name()) provider = self.provider() if provider is not None: display = display + " from {}()".format(provider) return "<" + display + ">" qiskit-aer-0.4.1/qiskit/providers/aer/backends/pulse_simulator.py000066400000000000000000000146371362723322000252430ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019, 2020. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=arguments-differ, missing-return-type-doc """ Qiskit Aer pulse simulator backend. """ import uuid import time import datetime import logging from numpy import inf from qiskit.result import Result from qiskit.providers.models import BackendConfiguration, PulseDefaults from .aerbackend import AerBackend from ..aerjob import AerJob from ..version import __version__ from ..pulse.qobj.digest import digest_pulse_obj from ..pulse.solver.opsolve import opsolve logger = logging.getLogger(__name__) class PulseSimulator(AerBackend): r"""Pulse schedule simulator backend. The ``PulseSimulator`` simulates continuous time Hamiltonian dynamics of a quantum system, with controls specified by pulse :class:`~qiskit.Schedule` objects, and the model of the physical system specified by :class:`~qiskit.providers.aer.pulse.PulseSystemModel` objects. Results are returned in the same format as when jobs are submitted to actual devices. **Example** To use the simulator, first :func:`~qiskit.assemble` a :class:`PulseQobj` object from a list of pulse :class:`~qiskit.Schedule` objects, using ``backend=PulseSimulator()``. Call the simulator with the :class:`PulseQobj` and a :class:`~qiskit.providers.aer.pulse.PulseSystemModel` object representing the physical system. .. code-block:: python backend_sim = qiskit.providers.aer.PulseSimulator() # Assemble schedules using PulseSimulator as the backend pulse_qobj = assemble(schedules, backend=backend_sim) # Run simulation on a PulseSystemModel object results = backend_sim.run(pulse_qobj, system_model) **Supported PulseQobj parameters** * ``qubit_lo_freq``: Local oscillator frequencies for each :class:`DriveChannel`. Defaults to either the value given in the :class:`~qiskit.providers.aer.pulse.PulseSystemModel`, or is calculated directly from the Hamiltonian. * ``meas_level``: Type of desired measurement output, in ``[1, 2]``. ``1`` gives complex numbers (IQ values), and ``2`` gives discriminated states ``|0>`` and ``|1>``. Defaults to ``2``. * ``meas_return``: Measurement type, ``'single'`` or ``'avg'``. Defaults to ``'avg'``. * ``shots``: Number of shots per experiment. Defaults to ``1024``. **Simulation details** The simulator uses the ``zvode`` differential equation solver method through ``scipy``. Simulation is performed in the rotating frame of the diagonal of the drift Hamiltonian contained in the :class:`~qiskit.providers.aer.pulse.PulseSystemModel`. Measurements are performed in the `dressed basis` of the drift Hamiltonian. **Other options** :meth:`PulseSimulator.run` takes an additional ``dict`` argument ``backend_options`` for customization. Accepted keys: * ``'ode_options'``: A ``dict`` for ``zvode`` solver options. Accepted keys are ``'atol'``, ``'rtol'``, ``'nsteps'``, ``'max_step'``, ``'num_cpus'``, ``'norm_tol'``, and ``'norm_steps'``. """ DEFAULT_CONFIGURATION = { 'backend_name': 'pulse_simulator', 'backend_version': __version__, 'n_qubits': 20, 'coupling_map': None, 'url': 'https://github.com/Qiskit/qiskit-aer', 'simulator': True, 'meas_levels': [0, 1, 2], 'local': True, 'conditional': True, 'open_pulse': True, 'memory': False, 'max_shots': int(1e6), 'description': 'A pulse-based Hamiltonian simulator for Pulse Qobj files', 'gates': [], 'basis_gates': [] } def __init__(self, configuration=None, provider=None): # purpose of defaults is to pass assemble checks self._defaults = PulseDefaults(qubit_freq_est=[inf], meas_freq_est=[inf], buffer=0, cmd_def=[], pulse_library=[]) super().__init__(self, BackendConfiguration.from_dict(self.DEFAULT_CONFIGURATION), provider=provider) def run(self, qobj, system_model, backend_options=None, validate=False): """Run a qobj on system_model. Args: qobj (PulseQobj): Qobj for pulse Schedules to run system_model (PulseSystemModel): Physical model to run simulation on backend_options (dict): Other options validate (bool): Flag for validation checks Returns: Result: results of simulation """ # Submit job job_id = str(uuid.uuid4()) aer_job = AerJob(self, job_id, self._run_job, qobj, system_model, backend_options, validate) aer_job.submit() return aer_job def _run_job(self, job_id, qobj, system_model, backend_options, validate): """Run a qobj job""" start = time.time() if validate: self._validate(qobj, backend_options, noise_model=None) # Send to solver openpulse_system = digest_pulse_obj(qobj, system_model, backend_options) results = opsolve(openpulse_system) end = time.time() return self._format_results(job_id, results, end - start, qobj.qobj_id) def _format_results(self, job_id, results, time_taken, qobj_id): """Construct Result object from simulator output.""" # Add result metadata output = {} output['qobj_id'] = qobj_id output['results'] = results output['success'] = True output["job_id"] = job_id output["date"] = datetime.datetime.now().isoformat() output["backend_name"] = self.name() output["backend_version"] = self.configuration().backend_version output["time_taken"] = time_taken return Result.from_dict(output) def defaults(self): """Return defaults. Returns: PulseDefaults: object for passing assemble. """ return self._defaults qiskit-aer-0.4.1/qiskit/providers/aer/backends/qasm_simulator.py000066400000000000000000000450161362723322000250470ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Qiskit Aer qasm simulator backend. """ import logging from math import log2 from qiskit.util import local_hardware_info from qiskit.providers.models import QasmBackendConfiguration from .aerbackend import AerBackend # pylint: disable=import-error from .controller_wrappers import qasm_controller_execute from ..version import __version__ logger = logging.getLogger(__name__) class QasmSimulator(AerBackend): """ Noisy quantum circuit simulator backend. The `QasmSimulator` supports multiple simulation methods and configurable options for each simulation method. These options are specified in a dictionary which may be passed to the simulator using the ``backend_options`` kwarg for :meth:`QasmSimulator.run` or ``qiskit.execute``. The default behavior chooses a simulation method automatically based on the input circuit and noise model. A custom method can be specified using the ``"method"`` field in ``backend_options`` as illustrated in the following example. Available simulation methods and additional backend options are listed below. **Example** .. code-block:: python backend = QasmSimulator() backend_options = {"method": "statevector"} # Circuit execution job = execute(circuits, backend, backend_options=backend_options) # Qobj execution job = backend.run(qobj, backend_options=backend_options) **Simulation method** Available simulation methods are: * ``"statevector"``: A dense statevector simulation that can sample measurement outcomes from *ideal* circuits with all measurements at end of the circuit. For noisy simulations each shot samples a randomly sampled noisy circuit from the noise model. ``"statevector_cpu"`` is an alias of ``"statevector"``. * ``"statevector_gpu"``: A dense statevector simulation that provides the same functionalities with ``"statevector"``. GPU performs the computation to calculate probability amplitudes as CPU does. If no GPU is available, a runtime error is raised. * ``"density_matrix"``: A dense density matrix simulation that may sample measurement outcomes from *noisy* circuits with all measurements at end of the circuit. It can only simulate half the number of qubits as the statevector method. * ``"density_matrix_gpu"``: A dense density matrix simulation that provides the same functionalities with ``"density_matrix"``. GPU performs the computation to calculate probability amplitudes as CPU does. If no GPU is available, a runtime error is raised. * ``"stabilizer"``: An efficient Clifford stabilizer state simulator that can simulate noisy Clifford circuits if all errors in the noise model are also Clifford errors. * ``"extended_stabilizer"``: An approximate simulated based on a ranked-stabilizer decomposition that decomposes circuits into stabilizer state terms. The number of terms grows with the number of non-Clifford gates. * ``"matrix_product_state"``: A tensor-network statevector simulator that uses a Matrix Product State (MPS) representation for the state. * ``"automatic"``: The default behavior where the method is chosen automatically for each circuit based on the circuit instructions, number of qubits, and noise model. **Backend options** The following backend options may be used with in the ``backend_options`` kwarg for :meth:`QasmSimulator.run` or ``qiskit.execute``: * ``"method"`` (str): Set the simulation method. See backend methods for additional information (Default: "automatic"). * ``"precision"`` (str): Set the floating point precision for certain simulation methods to either "single" or "double" precision (default: "double"). * ``"zero_threshold"`` (double): Sets the threshold for truncating small values to zero in the result data (Default: 1e-10). * ``"validation_threshold"`` (double): Sets the threshold for checking if initial states are valid (Default: 1e-8). * ``"max_parallel_threads"`` (int): Sets the maximum number of CPU cores used by OpenMP for parallelization. If set to 0 the maximum will be set to the number of CPU cores (Default: 0). * ``"max_parallel_experiments"`` (int): Sets the maximum number of qobj experiments that may be executed in parallel up to the max_parallel_threads value. If set to 1 parallel circuit execution will be disabled. If set to 0 the maximum will be automatically set to max_parallel_threads (Default: 1). * ``"max_parallel_shots"`` (int): Sets the maximum number of shots that may be executed in parallel during each experiment execution, up to the max_parallel_threads value. If set to 1 parallel shot execution will be disabled. If set to 0 the maximum will be automatically set to max_parallel_threads. Note that this cannot be enabled at the same time as parallel experiment execution (Default: 0). * ``"max_memory_mb"`` (int): Sets the maximum size of memory to store a state vector. If a state vector needs more, an error is thrown. In general, a state vector of n-qubits uses 2^n complex values (16 Bytes). If set to 0, the maximum will be automatically set to half the system memory size (Default: 0). * ``"optimize_ideal_threshold"`` (int): Sets the qubit threshold for applying circuit optimization passes on ideal circuits. Passes include gate fusion and truncation of unused qubits (Default: 5). * ``"optimize_noise_threshold"`` (int): Sets the qubit threshold for applying circuit optimization passes on ideal circuits. Passes include gate fusion and truncation of unused qubits (Default: 12). These backend options only apply when using the ``"statevector"`` simulation method: * ``"statevector_parallel_threshold"`` (int): Sets the threshold that the number of qubits must be greater than to enable OpenMP parallelization for matrix multiplication during execution of an experiment. If parallel circuit or shot execution is enabled this will only use unallocated CPU cores up to max_parallel_threads. Note that setting this too low can reduce performance (Default: 14). * ``"statevector_sample_measure_opt"`` (int): Sets the threshold that the number of qubits must be greater than to enable a large qubit optimized implementation of measurement sampling. Note that setting this two low can reduce performance (Default: 10) These backend options only apply when using the ``"stabilizer"`` simulation method: * ``"stabilizer_max_snapshot_probabilities"`` (int): set the maximum qubit number for the `~qiskit.providers.aer.extensions.SnapshotProbabilities` instruction (Default: 32). These backend options only apply when using the ``"extended_stabilizer"`` simulation method: * ``"extended_stabilizer_measure_sampling"`` (bool): Enable measure sampling optimization on supported circuits. This prevents the simulator from re-running the measure monte-carlo step for each shot. Enabling measure sampling may reduce accuracy of the measurement counts if the output distribution is strongly peaked (Default: False). * ``"extended_stabilizer_mixing_time"`` (int): Set how long the monte-carlo method runs before performing measurements. If the output distribution is strongly peaked, this can be decreased alongside setting extended_stabilizer_disable_measurement_opt to True (Default: 5000). * ``"extended_stabilizer_approximation_error"`` (double): Set the error in the approximation for the extended_stabilizer method. A smaller error needs more memory and computational time (Default: 0.05). * ``"extended_stabilizer_norm_estimation_samples"`` (int): Number of samples used to compute the correct normalization for a statevector snapshot (Default: 100). * ``"extended_stabilizer_parallel_threshold"`` (int): Set the minimum size of the extended stabilizer decomposition before we enable OpenMP parallelization. If parallel circuit or shot execution is enabled this will only use unallocated CPU cores up to max_parallel_threads (Default: 100). These backend options apply in circuit optimization passes: * ``"fusion_enable"`` (bool): Enable fusion optimization in circuit optimization passes [Default: True] * ``"fusion_verbose"`` (bool): Output gates generated in fusion optimization into metadata [Default: False] * ``"fusion_max_qubit"`` (int): Maximum number of qubits for a operation generated in a fusion optimization [Default: 5] * ``"fusion_threshold"`` (int): Threshold that number of qubits must be greater than or equal to enable fusion optimization [Default: 20] """ MAX_QUBIT_MEMORY = int( log2(local_hardware_info()['memory'] * (1024**3) / 16)) DEFAULT_CONFIGURATION = { 'backend_name': 'qasm_simulator', 'backend_version': __version__, 'n_qubits': MAX_QUBIT_MEMORY, 'url': 'https://github.com/Qiskit/qiskit-aer', 'simulator': True, 'local': True, 'conditional': True, 'open_pulse': False, 'memory': True, 'max_shots': int(1e6), 'description': 'A C++ simulator with realistic noise for QASM Qobj files', 'coupling_map': None, 'basis_gates': [ 'u1', 'u2', 'u3', 'cx', 'cz', 'id', 'x', 'y', 'z', 'h', 's', 'sdg', 't', 'tdg', 'swap', 'ccx', 'unitary', 'initialize', 'cu1', 'cu2', 'cu3', 'cswap', 'mcx', 'mcy', 'mcz', 'mcu1', 'mcu2', 'mcu3', 'mcswap', 'multiplexer', 'kraus', 'roerror' ], 'gates': [{ 'name': 'u1', 'parameters': ['lam'], 'conditional': True, 'description': 'Single-qubit gate [[1, 0], [0, exp(1j*lam)]]', 'qasm_def': 'gate u1(lam) q { U(0,0,lam) q; }' }, { 'name': 'u2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'Single-qubit gate [[1, -exp(1j*lam)], [exp(1j*phi), exp(1j*(phi+lam))]]/sqrt(2)', 'qasm_def': 'gate u2(phi,lam) q { U(pi/2,phi,lam) q; }' }, { 'name': 'u3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'Single-qubit gate with three rotation angles', 'qasm_def': 'gate u3(theta,phi,lam) q { U(theta,phi,lam) q; }' }, { 'name': 'cx', 'parameters': [], 'conditional': True, 'description': 'Two-qubit Controlled-NOT gate', 'qasm_def': 'gate cx c,t { CX c,t; }' }, { 'name': 'cz', 'parameters': [], 'conditional': True, 'description': 'Two-qubit Controlled-Z gate', 'qasm_def': 'gate cz a,b { h b; cx a,b; h b; }' }, { 'name': 'id', 'parameters': [], 'conditional': True, 'description': 'Single-qubit identity gate', 'qasm_def': 'gate id a { U(0,0,0) a; }' }, { 'name': 'x', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-X gate', 'qasm_def': 'gate x a { U(pi,0,pi) a; }' }, { 'name': 'y', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-Y gate', 'qasm_def': 'TODO' }, { 'name': 'z', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-Z gate', 'qasm_def': 'TODO' }, { 'name': 'h', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Hadamard gate', 'qasm_def': 'TODO' }, { 'name': 's', 'parameters': [], 'conditional': True, 'description': 'Single-qubit phase gate', 'qasm_def': 'TODO' }, { 'name': 'sdg', 'parameters': [], 'conditional': True, 'description': 'Single-qubit adjoint phase gate', 'qasm_def': 'TODO' }, { 'name': 't', 'parameters': [], 'conditional': True, 'description': 'Single-qubit T gate', 'qasm_def': 'TODO' }, { 'name': 'tdg', 'parameters': [], 'conditional': True, 'description': 'Single-qubit adjoint T gate', 'qasm_def': 'TODO' }, { 'name': 'swap', 'parameters': [], 'conditional': True, 'description': 'Two-qubit SWAP gate', 'qasm_def': 'TODO' }, { 'name': 'ccx', 'parameters': [], 'conditional': True, 'description': 'Three-qubit Toffoli gate', 'qasm_def': 'TODO' }, { 'name': 'cswap', 'parameters': [], 'conditional': True, 'description': 'Three-qubit Fredkin (controlled-SWAP) gate', 'qasm_def': 'TODO' }, { 'name': 'unitary', 'parameters': ['matrix'], 'conditional': True, 'description': 'N-qubit arbitrary unitary gate. ' 'The parameter is the N-qubit matrix to apply.', 'qasm_def': 'unitary(matrix) q1, q2,...' }, { 'name': 'initialize', 'parameters': ['vector'], 'conditional': False, 'description': 'N-qubit state initialize. ' 'Resets qubits then sets statevector to the parameter vector.', 'qasm_def': 'initialize(vector) q1, q2,...' }, { 'name': 'cu1', 'parameters': ['lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u1 gate', 'qasm_def': 'TODO' }, { 'name': 'cu2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u2 gate', 'qasm_def': 'TODO' }, { 'name': 'cu3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u3 gate', 'qasm_def': 'TODO' }, { 'name': 'mcx', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-X gate', 'qasm_def': 'TODO' }, { 'name': 'mcy', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-Y gate', 'qasm_def': 'TODO' }, { 'name': 'mcz', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-Z gate', 'qasm_def': 'TODO' }, { 'name': 'mcu1', 'parameters': ['lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u1 gate', 'qasm_def': 'TODO' }, { 'name': 'mcu2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u2 gate', 'qasm_def': 'TODO' }, { 'name': 'mcu3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u3 gate', 'qasm_def': 'TODO' }, { 'name': 'mcswap', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-SWAP gate', 'qasm_def': 'TODO' }, { 'name': 'multiplexer', 'parameters': ['mat1', 'mat2', '...'], 'conditional': True, 'description': 'N-qubit multi-plexer gate. ' 'The input parameters are the gates for each value.', 'qasm_def': 'TODO' }, { 'name': 'kraus', 'parameters': ['mat1', 'mat2', '...'], 'conditional': True, 'description': 'N-qubit Kraus error instruction. ' 'The input parameters are the Kraus matrices.', 'qasm_def': 'TODO' }, { 'name': 'roerror', 'parameters': ['matrix'], 'conditional': False, 'description': 'N-bit classical readout error instruction. ' 'The input parameter is the readout error probability matrix.', 'qasm_def': 'TODO' }] } def __init__(self, configuration=None, provider=None): super().__init__( qasm_controller_execute, QasmBackendConfiguration.from_dict(self.DEFAULT_CONFIGURATION), provider=provider) def _validate(self, qobj, backend_options, noise_model): """Semantic validations of the qobj which cannot be done via schemas. Warn if no measurements in circuit with classical registers. """ for experiment in qobj.experiments: # If circuit contains classical registers but not # measurements raise a warning if experiment.config.memory_slots > 0: # Check if measure opts missing no_measure = True for op in experiment.instructions: if not no_measure: break # we don't need to check any more ops if no_measure and op.name == "measure": no_measure = False # Print warning if clbits but no measure if no_measure: logger.warning( 'No measurements in circuit "%s": ' 'count data will return all zeros.', experiment.header.name) qiskit-aer-0.4.1/qiskit/providers/aer/backends/statevector_simulator.py000066400000000000000000000275001362723322000264470ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Qiskit Aer statevector simulator backend. """ import logging from math import log2 from qiskit.util import local_hardware_info from qiskit.providers.models import QasmBackendConfiguration from .aerbackend import AerBackend # pylint: disable=import-error from .controller_wrappers import statevector_controller_execute from ..aererror import AerError from ..version import __version__ # Logger logger = logging.getLogger(__name__) class StatevectorSimulator(AerBackend): """Ideal quantum circuit statevector simulator **Backend options** The following backend options may be used with in the ``backend_options`` kwarg for :meth:`StatevectorSimulator.run` or ``qiskit.execute``. * ``"zero_threshold"`` (double): Sets the threshold for truncating small values to zero in the result data (Default: 1e-10). * ``"validation_threshold"`` (double): Sets the threshold for checking if the initial statevector is valid (Default: 1e-8). * ``"max_parallel_threads"`` (int): Sets the maximum number of CPU cores used by OpenMP for parallelization. If set to 0 the maximum will be set to the number of CPU cores (Default: 0). * ``"max_parallel_experiments"`` (int): Sets the maximum number of qobj experiments that may be executed in parallel up to the max_parallel_threads value. If set to 1 parallel circuit execution will be disabled. If set to 0 the maximum will be automatically set to max_parallel_threads (Default: 1). * ``"max_memory_mb"`` (int): Sets the maximum size of memory to store a state vector. If a state vector needs more, an error is thrown. In general, a state vector of n-qubits uses 2^n complex values (16 Bytes). If set to 0, the maximum will be automatically set to half the system memory size (Default: 0). * ``"statevector_parallel_threshold"`` (int): Sets the threshold that "n_qubits" must be greater than to enable OpenMP parallelization for matrix multiplication during execution of an experiment. If parallel circuit or shot execution is enabled this will only use unallocated CPU cores up to max_parallel_threads. Note that setting this too low can reduce performance (Default: 14). """ MAX_QUBIT_MEMORY = int(log2(local_hardware_info()['memory'] * (1024 ** 3) / 16)) DEFAULT_CONFIGURATION = { 'backend_name': 'statevector_simulator', 'backend_version': __version__, 'n_qubits': MAX_QUBIT_MEMORY, 'url': 'https://github.com/Qiskit/qiskit-aer', 'simulator': True, 'local': True, 'conditional': True, 'open_pulse': False, 'memory': True, 'max_shots': int(1e6), # Note that this backend will only ever # perform a single shot. This value is just # so that the default shot value for execute # will not raise an error when trying to run # a simulation 'description': 'A C++ statevector simulator for QASM Qobj files', 'coupling_map': None, 'basis_gates': [ 'u1', 'u2', 'u3', 'cx', 'cz', 'id', 'x', 'y', 'z', 'h', 's', 'sdg', 't', 'tdg', 'swap', 'ccx', 'unitary', 'initialize', 'cu1', 'cu2', 'cu3', 'cswap', 'mcx', 'mcy', 'mcz', 'mcu1', 'mcu2', 'mcu3', 'mcswap', 'multiplexer', ], 'gates': [{ 'name': 'u1', 'parameters': ['lam'], 'conditional': True, 'description': 'Single-qubit gate [[1, 0], [0, exp(1j*lam)]]', 'qasm_def': 'gate u1(lam) q { U(0,0,lam) q; }' }, { 'name': 'u2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'Single-qubit gate [[1, -exp(1j*lam)], [exp(1j*phi), exp(1j*(phi+lam))]]/sqrt(2)', 'qasm_def': 'gate u2(phi,lam) q { U(pi/2,phi,lam) q; }' }, { 'name': 'u3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'Single-qubit gate with three rotation angles', 'qasm_def': 'gate u3(theta,phi,lam) q { U(theta,phi,lam) q; }' }, { 'name': 'cx', 'parameters': [], 'conditional': True, 'description': 'Two-qubit Controlled-NOT gate', 'qasm_def': 'gate cx c,t { CX c,t; }' }, { 'name': 'cz', 'parameters': [], 'conditional': True, 'description': 'Two-qubit Controlled-Z gate', 'qasm_def': 'gate cz a,b { h b; cx a,b; h b; }' }, { 'name': 'id', 'parameters': [], 'conditional': True, 'description': 'Single-qubit identity gate', 'qasm_def': 'gate id a { U(0,0,0) a; }' }, { 'name': 'x', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-X gate', 'qasm_def': 'gate x a { U(pi,0,pi) a; }' }, { 'name': 'y', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-Y gate', 'qasm_def': 'TODO' }, { 'name': 'z', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-Z gate', 'qasm_def': 'TODO' }, { 'name': 'h', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Hadamard gate', 'qasm_def': 'TODO' }, { 'name': 's', 'parameters': [], 'conditional': True, 'description': 'Single-qubit phase gate', 'qasm_def': 'TODO' }, { 'name': 'sdg', 'parameters': [], 'conditional': True, 'description': 'Single-qubit adjoint phase gate', 'qasm_def': 'TODO' }, { 'name': 't', 'parameters': [], 'conditional': True, 'description': 'Single-qubit T gate', 'qasm_def': 'TODO' }, { 'name': 'tdg', 'parameters': [], 'conditional': True, 'description': 'Single-qubit adjoint T gate', 'qasm_def': 'TODO' }, { 'name': 'swap', 'parameters': [], 'conditional': True, 'description': 'Two-qubit SWAP gate', 'qasm_def': 'TODO' }, { 'name': 'ccx', 'parameters': [], 'conditional': True, 'description': 'Three-qubit Toffoli gate', 'qasm_def': 'TODO' }, { 'name': 'cswap', 'parameters': [], 'conditional': True, 'description': 'Three-qubit Fredkin (controlled-SWAP) gate', 'qasm_def': 'TODO' }, { 'name': 'unitary', 'parameters': ['matrix'], 'conditional': True, 'description': 'N-qubit arbitrary unitary gate. ' 'The parameter is the N-qubit matrix to apply.', 'qasm_def': 'unitary(matrix) q1, q2,...' }, { 'name': 'initialize', 'parameters': ['vector'], 'conditional': False, 'description': 'N-qubit state initialize. ' 'Resets qubits then sets statevector to the parameter vector.', 'qasm_def': 'initialize(vector) q1, q2,...' }, { 'name': 'cu1', 'parameters': ['lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u1 gate', 'qasm_def': 'TODO' }, { 'name': 'cu2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u2 gate', 'qasm_def': 'TODO' }, { 'name': 'cu3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u3 gate', 'qasm_def': 'TODO' }, { 'name': 'mcx', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-X gate', 'qasm_def': 'TODO' }, { 'name': 'mcy', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-Y gate', 'qasm_def': 'TODO' }, { 'name': 'mcz', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-Z gate', 'qasm_def': 'TODO' }, { 'name': 'mcu1', 'parameters': ['lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u1 gate', 'qasm_def': 'TODO' }, { 'name': 'mcu2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u2 gate', 'qasm_def': 'TODO' }, { 'name': 'mcu3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u3 gate', 'qasm_def': 'TODO' }, { 'name': 'mcswap', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-SWAP gate', 'qasm_def': 'TODO' }, { 'name': 'multiplexer', 'parameters': ['mat1', 'mat2', '...'], 'conditional': True, 'description': 'N-qubit multi-plexer gate. ' 'The input parameters are the gates for each value.', 'qasm_def': 'TODO' }] } def __init__(self, configuration=None, provider=None): super().__init__(statevector_controller_execute, QasmBackendConfiguration.from_dict(self.DEFAULT_CONFIGURATION), provider=provider) def _validate(self, qobj, backend_options, noise_model): """Semantic validations of the qobj which cannot be done via schemas. Some of these may later move to backend schemas. 1. Set shots=1. 2. Check number of qubits will fit in local memory. """ name = self.name() if noise_model is not None: raise AerError("{} does not support noise.".format(name)) n_qubits = qobj.config.n_qubits max_qubits = self.configuration().n_qubits if n_qubits > max_qubits: raise AerError( 'Number of qubits ({}) is greater than max ({}) for "{}" with {} GB system memory.' .format(n_qubits, max_qubits, name, int(local_hardware_info()['memory']))) if qobj.config.shots != 1: logger.info('"%s" only supports 1 shot. Setting shots=1.', name) qobj.config.shots = 1 for experiment in qobj.experiments: exp_name = experiment.header.name if getattr(experiment.config, 'shots', 1) != 1: logger.info('"%s" only supports 1 shot. ' 'Setting shots=1 for circuit "%s".', name, exp_name) experiment.config.shots = 1 qiskit-aer-0.4.1/qiskit/providers/aer/backends/unitary_simulator.py000066400000000000000000000300051362723322000255710ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name """ Qiskit Aer Unitary Simulator Backend. """ import logging from math import log2, sqrt from qiskit.util import local_hardware_info from qiskit.providers.models import QasmBackendConfiguration from .aerbackend import AerBackend from ..aererror import AerError # pylint: disable=import-error from .controller_wrappers import unitary_controller_execute from ..version import __version__ # Logger logger = logging.getLogger(__name__) class UnitarySimulator(AerBackend): """Ideal quantum circuit unitary simulator. **Backend options** The following backend options may be used with in the ``backend_options`` kwarg for :meth:`UnitarySimulator.run` or ``qiskit.execute``. * ``"initial_unitary"`` (matrix_like): Sets a custom initial unitary matrix for the simulation instead of identity (Default: None). * ``"validation_threshold"`` (double): Sets the threshold for checking if initial unitary and target unitary are unitary matrices. (Default: 1e-8). * ``"zero_threshold"`` (double): Sets the threshold for truncating small values to zero in the result data (Default: 1e-10). * ``"max_parallel_threads"`` (int): Sets the maximum number of CPU cores used by OpenMP for parallelization. If set to 0 the maximum will be set to the number of CPU cores (Default: 0). * ``"max_parallel_experiments"`` (int): Sets the maximum number of qobj experiments that may be executed in parallel up to the max_parallel_threads value. If set to 1 parallel circuit execution will be disabled. If set to 0 the maximum will be automatically set to max_parallel_threads (Default: 1). * ``"max_memory_mb"`` (int): Sets the maximum size of memory to store a state vector. If a state vector needs more, an error is thrown. In general, a state vector of n-qubits uses 2^n complex values (16 Bytes). If set to 0, the maximum will be automatically set to half the system memory size (Default: 0). * ``"statevector_parallel_threshold"`` (int): Sets the threshold that 2 * "n_qubits" must be greater than to enable OpenMP parallelization for matrix multiplication during execution of an experiment. If parallel circuit or shot execution is enabled this will only use unallocated CPU cores up to max_parallel_threads. Note that setting this too low can reduce performance (Default: 14). """ MAX_QUBIT_MEMORY = int(log2(sqrt(local_hardware_info()['memory'] * (1024 ** 3) / 16))) DEFAULT_CONFIGURATION = { 'backend_name': 'unitary_simulator', 'backend_version': __version__, 'n_qubits': MAX_QUBIT_MEMORY, 'url': 'https://github.com/Qiskit/qiskit-aer', 'simulator': True, 'local': True, 'conditional': False, 'open_pulse': False, 'memory': False, 'max_shots': int(1e6), # Note that this backend will only ever # perform a single shot. This value is just # so that the default shot value for execute # will not raise an error when trying to run # a simulation 'description': 'A C++ unitary simulator for QASM Qobj files', 'coupling_map': None, 'basis_gates': [ 'u1', 'u2', 'u3', 'cx', 'cz', 'id', 'x', 'y', 'z', 'h', 's', 'sdg', 't', 'tdg', 'swap', 'ccx', 'unitary', 'cu1', 'cu2', 'cu3', 'cswap', 'mcx', 'mcy', 'mcz', 'mcu1', 'mcu2', 'mcu3', 'mcswap', 'multiplexer', ], 'gates': [{ 'name': 'u1', 'parameters': ['lam'], 'conditional': True, 'description': 'Single-qubit gate [[1, 0], [0, exp(1j*lam)]]', 'qasm_def': 'gate u1(lam) q { U(0,0,lam) q; }' }, { 'name': 'u2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'Single-qubit gate [[1, -exp(1j*lam)], [exp(1j*phi), exp(1j*(phi+lam))]]/sqrt(2)', 'qasm_def': 'gate u2(phi,lam) q { U(pi/2,phi,lam) q; }' }, { 'name': 'u3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'Single-qubit gate with three rotation angles', 'qasm_def': 'gate u3(theta,phi,lam) q { U(theta,phi,lam) q; }' }, { 'name': 'cx', 'parameters': [], 'conditional': True, 'description': 'Two-qubit Controlled-NOT gate', 'qasm_def': 'gate cx c,t { CX c,t; }' }, { 'name': 'cz', 'parameters': [], 'conditional': True, 'description': 'Two-qubit Controlled-Z gate', 'qasm_def': 'gate cz a,b { h b; cx a,b; h b; }' }, { 'name': 'id', 'parameters': [], 'conditional': True, 'description': 'Single-qubit identity gate', 'qasm_def': 'gate id a { U(0,0,0) a; }' }, { 'name': 'x', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-X gate', 'qasm_def': 'gate x a { U(pi,0,pi) a; }' }, { 'name': 'y', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-Y gate', 'qasm_def': 'TODO' }, { 'name': 'z', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Pauli-Z gate', 'qasm_def': 'TODO' }, { 'name': 'h', 'parameters': [], 'conditional': True, 'description': 'Single-qubit Hadamard gate', 'qasm_def': 'TODO' }, { 'name': 's', 'parameters': [], 'conditional': True, 'description': 'Single-qubit phase gate', 'qasm_def': 'TODO' }, { 'name': 'sdg', 'parameters': [], 'conditional': True, 'description': 'Single-qubit adjoint phase gate', 'qasm_def': 'TODO' }, { 'name': 't', 'parameters': [], 'conditional': True, 'description': 'Single-qubit T gate', 'qasm_def': 'TODO' }, { 'name': 'tdg', 'parameters': [], 'conditional': True, 'description': 'Single-qubit adjoint T gate', 'qasm_def': 'TODO' }, { 'name': 'swap', 'parameters': [], 'conditional': True, 'description': 'Two-qubit SWAP gate', 'qasm_def': 'TODO' }, { 'name': 'ccx', 'parameters': [], 'conditional': True, 'description': 'Three-qubit Toffoli gate', 'qasm_def': 'TODO' }, { 'name': 'cswap', 'parameters': [], 'conditional': True, 'description': 'Three-qubit Fredkin (controlled-SWAP) gate', 'qasm_def': 'TODO' }, { 'name': 'unitary', 'parameters': ['matrix'], 'conditional': True, 'description': 'N-qubit arbitrary unitary gate. ' 'The parameter is the N-qubit matrix to apply.', 'qasm_def': 'unitary(matrix) q1, q2,...' }, { 'name': 'cu1', 'parameters': ['lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u1 gate', 'qasm_def': 'TODO' }, { 'name': 'cu2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u2 gate', 'qasm_def': 'TODO' }, { 'name': 'cu3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'Two-qubit Controlled-u3 gate', 'qasm_def': 'TODO' }, { 'name': 'mcx', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-X gate', 'qasm_def': 'TODO' }, { 'name': 'mcy', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-Y gate', 'qasm_def': 'TODO' }, { 'name': 'mcz', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-Z gate', 'qasm_def': 'TODO' }, { 'name': 'mcu1', 'parameters': ['lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u1 gate', 'qasm_def': 'TODO' }, { 'name': 'mcu2', 'parameters': ['phi', 'lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u2 gate', 'qasm_def': 'TODO' }, { 'name': 'mcu3', 'parameters': ['theta', 'phi', 'lam'], 'conditional': True, 'description': 'N-qubit multi-controlled-u3 gate', 'qasm_def': 'TODO' }, { 'name': 'mcswap', 'parameters': [], 'conditional': True, 'description': 'N-qubit multi-controlled-SWAP gate', 'qasm_def': 'TODO' }, { 'name': 'multiplexer', 'parameters': ['mat1', 'mat2', '...'], 'conditional': True, 'description': 'N-qubit multi-plexer gate. ' 'The input parameters are the gates for each value.', 'qasm_def': 'TODO' }] } def __init__(self, configuration=None, provider=None): super().__init__(unitary_controller_execute, QasmBackendConfiguration.from_dict(self.DEFAULT_CONFIGURATION), provider=provider) def _validate(self, qobj, backend_options, noise_model): """Semantic validations of the qobj which cannot be done via schemas. Some of these may later move to backend schemas. 1. Set shots=1 2. No measurements or reset 3. Check number of qubits will fit in local memory. """ name = self.name() if noise_model is not None: raise AerError("{} does not support noise.".format(name)) n_qubits = qobj.config.n_qubits max_qubits = self.configuration().n_qubits if n_qubits > max_qubits: raise AerError( 'Number of qubits ({}) is greater than max ({}) for "{}" with {} GB system memory.' .format(n_qubits, max_qubits, name, int(local_hardware_info()['memory']))) if qobj.config.shots != 1: logger.info('"%s" only supports 1 shot. Setting shots=1.', name) qobj.config.shots = 1 for experiment in qobj.experiments: exp_name = experiment.header.name if getattr(experiment.config, 'shots', 1) != 1: logger.info('"%s" only supports 1 shot. ' 'Setting shots=1 for circuit "%s".', name, exp_name) experiment.config.shots = 1 for operation in experiment.instructions: if operation.name in ['measure', 'reset']: raise AerError( 'Unsupported {} instruction {} in circuit {}' .format(name, operation.name, exp_name)) qiskit-aer-0.4.1/qiskit/providers/aer/backends/wrappers/000077500000000000000000000000001362723322000232725ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/backends/wrappers/CMakeLists.txt000066400000000000000000000022121362723322000260270ustar00rootroot00000000000000include(Linter) find_package(Pybind11 REQUIRED) # We need to remove the -static flag, because Python Extension system only supports # dynamic linked libraries, but we want to build a shared libraries with the least # dependencies we can, so some of these dependencies are linked statically into our # shared library. string(REPLACE " -static " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # Controllers if(CUDA_FOUND) set_source_files_properties(bindings.cc PROPERTIES CUDA_SOURCE_PROPERTY_FORMAT OBJ) endif() basic_pybind11_add_module(controller_wrappers bindings.cc) target_include_directories(controller_wrappers PRIVATE ${AER_SIMULATOR_CPP_SRC_DIR} PRIVATE ${AER_SIMULATOR_CPP_EXTERNAL_LIBS}) target_link_libraries(controller_wrappers ${AER_LIBRARIES}) target_compile_definitions(controller_wrappers PRIVATE ${AER_COMPILER_DEFINITIONS}) install(TARGETS controller_wrappers LIBRARY DESTINATION qiskit/providers/aer/backends) # Install redistributable dependencies if(APPLE) install(FILES "${AER_SIMULATOR_CPP_SRC_DIR}/third-party/macos/lib/libomp.dylib" DESTINATION qiskit/providers/aer/backends) endif() qiskit-aer-0.4.1/qiskit/providers/aer/backends/wrappers/bindings.cc000066400000000000000000000027051362723322000254020ustar00rootroot00000000000000#include #include #include "framework/matrix.hpp" #include "framework/types.hpp" #include "framework/pybind_json.hpp" #include "controllers/qasm_controller.hpp" #include "controllers/statevector_controller.hpp" #include "controllers/unitary_controller.hpp" #include "controllers/controller_execute.hpp" PYBIND11_MODULE(controller_wrappers, m) { m.def("qasm_controller_execute_json", &AER::controller_execute_json, "instance of controller_execute for QasmController"); m.def("qasm_controller_execute", [](const py::object &qobj) -> py::object { return AerToPy::from_result(AER::controller_execute(qobj)); }); m.def("statevector_controller_execute_json", &AER::controller_execute_json, "instance of controller_execute for StatevectorController"); m.def("statevector_controller_execute", [](const py::object &qobj) -> py::object { return AerToPy::from_result(AER::controller_execute(qobj)); }); m.def("unitary_controller_execute_json", &AER::controller_execute_json, "instance of controller_execute for UnitaryController"); m.def("unitary_controller_execute", [](const py::object &qobj) -> py::object { return AerToPy::from_result(AER::controller_execute(qobj)); }); } qiskit-aer-0.4.1/qiskit/providers/aer/extensions/000077500000000000000000000000001362723322000220545ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/extensions/__init__.py000066400000000000000000000026141362723322000241700ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ =========================================================== Circuit Extensions (:mod:`qiskit.providers.aer.extensions`) =========================================================== .. currentmodule:: qiskit.providers.aer.extensions Snapshots ========= Snapshot instructions allow taking a snapshot of the current state of the simulator without effecting the outcome of the simulation. These can be used with the `QasmSimulator` backend to return the expectation value of an operator or the probability of measurement outcomes. .. autosummary:: :toctree: ../stubs/ Snapshot SnapshotProbabilities SnapshotExpectationValue SnapshotStatevector SnapshotDensityMatrix SnapshotStabilizer """ from .snapshot import * from .snapshot_statevector import * from .snapshot_stabilizer import * from .snapshot_density_matrix import * from .snapshot_probabilities import * from .snapshot_expectation_value import * qiskit-aer-0.4.1/qiskit/providers/aer/extensions/snapshot.py000066400000000000000000000121421362723322000242650ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Simulator command to snapshot internal simulator representation. """ import warnings from qiskit import QuantumCircuit from qiskit.circuit.quantumregister import QuantumRegister from qiskit.circuit import Instruction from qiskit.extensions.exceptions import ExtensionError class Snapshot(Instruction): """Simulator snapshot instruction.""" def __init__(self, label, snapshot_type='statevector', num_qubits=0, num_clbits=0, params=None): """Create new snapshot instruction. Args: label (str): the snapshot label for result data. snapshot_type (str): the type of the snapshot. num_qubits (int): the number of qubits for the snapshot type [Default: 0]. num_clbits (int): the number of classical bits for the snapshot type [Default: 0]. params (list or None): the parameters for snapshot_type [Default: None]. Raises: ExtensionError: if snapshot label is invalid. """ if not isinstance(label, str): raise ExtensionError('Snapshot label must be a string.') self._label = label self._snapshot_type = snapshot_type if params is None: params = [] super().__init__('snapshot', num_qubits, num_clbits, params) def assemble(self): """Assemble a QasmQobjInstruction""" instruction = super().assemble() instruction.label = self._label instruction.snapshot_type = self._snapshot_type return instruction def inverse(self): """Special case. Return self.""" return Snapshot(self.num_qubits, self.num_clbits, self.params[0], self.params[1]) @staticmethod def define_snapshot_register(circuit, label, qubits=None): """Defines qubits to snapshot for all snapshot methods""" # Convert label to string for backwards compatibility if not isinstance(label, str): warnings.warn( "Snapshot label should be a string, " "implicit conversion is deprecated.", DeprecationWarning) label = str(label) # If no qubits are specified we add all qubits so it acts as a barrier # This is needed for full register snapshots like statevector if isinstance(qubits, QuantumRegister): qubits = qubits[:] if not qubits: tuples = [] if isinstance(circuit, QuantumCircuit): for register in circuit.qregs: tuples.append(register) if not tuples: raise ExtensionError('no qubits for snapshot') qubits = [] for tuple_element in tuples: if isinstance(tuple_element, QuantumRegister): for j in range(tuple_element.size): qubits.append(tuple_element[j]) else: qubits.append(tuple_element) return qubits @property def snapshot_type(self): """Return snapshot type""" return self._snapshot_type @property def label(self): """Return snapshot label""" return self._label @label.setter def label(self, name): """Set snapshot label to name Args: name (str or None): label to assign unitary Raises: TypeError: name is not string or None. """ if isinstance(name, str): self._label = name else: raise TypeError('label expects a string') def snapshot(self, label, snapshot_type='statevector', qubits=None, params=None): """Take a statevector snapshot of the internal simulator representation. Works on all qubits, and prevents reordering (like barrier). Args: label (str): a snapshot label to report the result snapshot_type (str): the type of the snapshot. qubits (list or None): the qubits to apply snapshot to [Default: None]. params (list or None): the parameters for snapshot_type [Default: None]. Returns: QuantumCircuit: with attached command Raises: ExtensionError: malformed command """ snapshot_register = Snapshot.define_snapshot_register(self, label, qubits) return self.append( Snapshot( label, snapshot_type=snapshot_type, num_qubits=len(snapshot_register), params=params), snapshot_register) # Add to QuantumCircuit class QuantumCircuit.snapshot = snapshot qiskit-aer-0.4.1/qiskit/providers/aer/extensions/snapshot_density_matrix.py000066400000000000000000000036361362723322000274200ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Simulator command to snapshot internal simulator representation. """ from qiskit import QuantumCircuit from qiskit.providers.aer.extensions import Snapshot class SnapshotDensityMatrix(Snapshot): """Snapshot instruction for density matrix method of Qasm simulator.""" def __init__(self, label, num_qubits): """Create a density matrix state snapshot instruction. Args: label (str): the snapshot label. num_qubits (int): the number of qubits to snapshot. Raises: ExtensionError: if snapshot is invalid. """ super().__init__(label, snapshot_type='density_matrix', num_qubits=num_qubits) def snapshot_density_matrix(self, label, qubits=None): """Take a density matrix snapshot of simulator state. Args: label (str): a snapshot label to report the result qubits (list or None): the qubits to apply snapshot to. If None all qubits will be snapshot [Default: None]. Returns: QuantumCircuit: with attached instruction. Raises: ExtensionError: if snapshot is invalid. """ snapshot_register = Snapshot.define_snapshot_register(self, label, qubits) return self.append( SnapshotDensityMatrix(label, num_qubits=len(snapshot_register)), snapshot_register) QuantumCircuit.snapshot_density_matrix = snapshot_density_matrix qiskit-aer-0.4.1/qiskit/providers/aer/extensions/snapshot_expectation_value.py000066400000000000000000000117571362723322000300770ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Simulator command to snapshot internal simulator representation. """ import math import numpy from qiskit import QuantumCircuit from qiskit.circuit import Instruction from qiskit.extensions.exceptions import ExtensionError from qiskit.quantum_info.operators import Pauli, Operator from qiskit.providers.aer.extensions import Snapshot class SnapshotExpectationValue(Snapshot): """Snapshot instruction for supported methods of Qasm simulator.""" def __init__(self, label, op, single_shot=False, variance=False): """Create a probability snapshot instruction. Args: label (str): the snapshot label. op (Operator): operator to snapshot. single_shot (bool): return list for each shot rather than average [Default: False] variance (bool): compute variance of probabilities [Default: False] Raises: ExtensionError: if snapshot is invalid. """ pauli_op = self._format_pauli_op(op) if pauli_op: # Pauli expectation value snapshot_type = 'expectation_value_pauli' params = pauli_op num_qubits = len(params[0][1]) else: snapshot_type = 'expectation_value_matrix' mat = self._format_single_matrix(op) if mat is not None: num_qubits = int(math.log2(len(mat))) if mat.shape != (2 ** num_qubits, 2 ** num_qubits): raise ExtensionError("Snapshot Operator is invalid.") qubits = list(range(num_qubits)) params = [[1., [[qubits, mat]]]] else: # If op doesn't match the previous cases we try passing # in the op as raw params params = op num_qubits = 0 for _, pair in params: num_qubits = max(num_qubits, *pair[0]) # HACK: we wrap param list in numpy array to make it validate # in terra params = [numpy.array(elt, dtype=object) for elt in params] if single_shot: snapshot_type += '_single_shot' elif variance: snapshot_type += '_with_variance' super().__init__(label, snapshot_type=snapshot_type, num_qubits=num_qubits, params=params) @staticmethod def _format_single_matrix(op): """Format op into Matrix op, return None if not Pauli op""" # This can be specified as list [[coeff, Pauli], ... ] if isinstance(op, numpy.ndarray): return op if isinstance(op, (Instruction, QuantumCircuit)): return Operator(op).data if hasattr(op, 'to_operator'): return op.to_operator().data return None @staticmethod def _format_pauli_op(op): """Format op into Pauli op, return None if not Pauli op""" # This can be specified as list [[coeff, Pauli], ... ] if isinstance(op, Pauli): return [[1., op.to_label()]] if not isinstance(op, (list, tuple)): return None pauli_op = [] for pair in op: if len(pair) != 2: return None coeff = complex(pair[0]) pauli = pair[1] if isinstance(pauli, Pauli): pauli_op.append([coeff, pauli.to_label()]) elif isinstance(pair[1], str): pauli_op.append([coeff, pauli]) else: return None return pauli_op def snapshot_expectation_value(self, label, op, qubits, single_shot=False, variance=False): """Take a snapshot of expectation value of an Operator. Args: label (str): a snapshot label to report the result op (Operator): operator to snapshot qubits (list): the qubits to snapshot. single_shot (bool): return list for each shot rather than average [Default: False] variance (bool): compute variance of probabilities [Default: False] Returns: QuantumCircuit: with attached instruction. Raises: ExtensionError: if snapshot is invalid. """ snapshot_register = Snapshot.define_snapshot_register(self, label, qubits) return self.append( SnapshotExpectationValue(label, op, single_shot=single_shot, variance=variance), snapshot_register) QuantumCircuit.snapshot_expectation_value = snapshot_expectation_value qiskit-aer-0.4.1/qiskit/providers/aer/extensions/snapshot_probabilities.py000066400000000000000000000041431362723322000271770ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals """ Simulator command to snapshot internal simulator representation. """ from qiskit import QuantumCircuit from qiskit.providers.aer.extensions import Snapshot class SnapshotProbabilities(Snapshot): """Snapshot instruction for all methods of Qasm simulator.""" def __init__(self, label, num_qubits, variance=False): """Create a probability snapshot instruction. Args: label (str): the snapshot label. num_qubits (int): the number of qubits to snapshot. variance (bool): compute variance of probabilities [Default: False] Raises: ExtensionError: if snapshot is invalid. """ snapshot_type = 'probabilities_with_variance' if variance else 'probabilities' super().__init__(label, snapshot_type=snapshot_type, num_qubits=num_qubits) def snapshot_probabilities(self, label, qubits, variance=False): """Take a probability snapshot of the simulator state. Args: label (str): a snapshot label to report the result qubits (list): the qubits to snapshot. variance (bool): compute variance of probabilities [Default: False] Returns: QuantumCircuit: with attached instruction. Raises: ExtensionError: if snapshot is invalid. """ snapshot_register = Snapshot.define_snapshot_register(self, label, qubits) return self.append( SnapshotProbabilities(label, num_qubits=len(snapshot_register), variance=variance), snapshot_register) QuantumCircuit.snapshot_probabilities = snapshot_probabilities qiskit-aer-0.4.1/qiskit/providers/aer/extensions/snapshot_stabilizer.py000066400000000000000000000043231362723322000265170ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Simulator command to snapshot internal simulator representation. """ from qiskit import QuantumCircuit from qiskit.providers.aer.extensions import Snapshot class SnapshotStabilizer(Snapshot): """Snapshot instruction for stabilizer method of Qasm simulator.""" def __init__(self, label, num_qubits=0): """Create a stabilizer state snapshot instruction. Args: label (str): the snapshot label. num_qubits (int): the instruction barrier size [Default: 0]. Raises: ExtensionError: if snapshot is invalid. Additional Information: This snapshot is always performed on all qubits in a circuit. The number of qubits parameter specifies the size of the instruction as a barrier and should be set to the number of qubits in the circuit. """ super().__init__(label, snapshot_type='stabilizer', num_qubits=num_qubits) def snapshot_stabilizer(self, label): """Take a stabilizer snapshot of the simulator state. Args: label (str): a snapshot label to report the result. Returns: QuantumCircuit: with attached instruction. Raises: ExtensionError: if snapshot is invalid. Additional Information: This snapshot is always performed on all qubits in a circuit. The number of qubits parameter specifies the size of the instruction as a barrier and should be set to the number of qubits in the circuit. """ snapshot_register = Snapshot.define_snapshot_register(self, label) return self.append( SnapshotStabilizer(label, num_qubits=len(snapshot_register)), snapshot_register) QuantumCircuit.snapshot_stabilizer = snapshot_stabilizer qiskit-aer-0.4.1/qiskit/providers/aer/extensions/snapshot_statevector.py000066400000000000000000000044451362723322000267170ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Simulator command to snapshot internal simulator representation. """ from qiskit import QuantumCircuit from qiskit.providers.aer.extensions import Snapshot class SnapshotStatevector(Snapshot): """ Snapshot instruction for statevector snapshot type """ def __init__(self, label, num_qubits=0): """Create a statevector state snapshot instruction. Args: label (str): the snapshot label. num_qubits (int): the instruction barrier size [Default: 0]. Raises: ExtensionError: if snapshot is invalid. Additional Information: This snapshot is always performed on all qubits in a circuit. The number of qubits parameter specifies the size of the instruction as a barrier and should be set to the number of qubits in the circuit. """ super().__init__(label, snapshot_type='statevector', num_qubits=num_qubits) def snapshot_statevector(self, label): """Take a statevector snapshot of the simulator state. Args: label (str): a snapshot label to report the result. Returns: QuantumCircuit: with attached instruction. Raises: ExtensionError: if snapshot is invalid. Additional Information: This snapshot is always performed on all qubits in a circuit. The number of qubits parameter specifies the size of the instruction as a barrier and should be set to the number of qubits in the circuit. """ # Statevector snapshot acts as a barrier across all qubits in the # circuit snapshot_register = Snapshot.define_snapshot_register(self, label) return self.append( SnapshotStatevector(label, num_qubits=len(snapshot_register)), snapshot_register) QuantumCircuit.snapshot_statevector = snapshot_statevector qiskit-aer-0.4.1/qiskit/providers/aer/noise/000077500000000000000000000000001362723322000207725ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/noise/__init__.py000066400000000000000000000133251362723322000231070ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. r""" ================================================ Noise Models (:mod:`qiskit.providers.aer.noise`) ================================================ .. currentmodule:: qiskit.providers.aer.noise This module contains classes and functions to build a noise model for simulating a Qiskit quantum circuit in the presence of errors. Building Noise Models ===================== The :class:`NoiseModel` class is used to represent noise model for the :class:`~qiskit.providers.aer.QasmSimulator`. It can be used to construct custom noise models for simulator, to to automatically generate a basic device noise model for an IBMQ backend. Device Noise Models ------------------- A simplified approximate :class:`NoiseModel` can be generated automatically from the properties of real device backends from the IBMQ provider using the :meth:`NoiseModel.from_backend` method. See the method documentation for details. **Example: Basic device noise model** .. code-block:: python from qiskit import QuantumCircuit, execute from qiskit import IBMQ, Aer from qiskit.visualization import plot_histogram from qiskit.providers.aer.noise import NoiseModel # Build noise model from backend properties provider = IBMQ.load_account() backend = provider.get_backend('ibmq_vigo') noise_model = NoiseModel.from_backend(backend) # Get coupling map from backend coupling_map = backend.configuration().coupling_map # Get basis gates from noise model basis_gates = noise_model.basis_gates # Make a circuit circ = QuantumCircuit(3, 3) circ.h(0) circ.cx(0, 1) circ.cx(1, 2) circ.measure([0, 1, 2], [0, 1, 2]) # Perform a noise simulation result = execute(circ, Aer.get_backend('qasm_simulator'), coupling_map=coupling_map, basis_gates=basis_gates, noise_model=noise_model).result() counts = result.get_counts(0) plot_histogram(counts) Custom Noise Models ------------------- Custom noise models can be used by adding :class:`QuantumError` to circuit gate, reset or measure instructions, and :class:`ReadoutError` to measure instructions. This module includes several helper functions for generating :class:`QuantumError` instances based on canonical error models used in Quantum Information Theory that can simplify building noise models. See the documentation for the :class:`NoiseModel` class for additional details. **Example: depolarizing noise model** .. code-block:: python from qiskit import QuantumCircuit, execute, Aer from qiskit.visualization import plot_histogram import qiskit.providers.aer.noise as noise # Error probabilities prob_1 = 0.001 # 1-qubit gate prob_2 = 0.01 # 2-qubit gate # Depolarizing quantum errors error_1 = noise.depolarizing_error(prob_1, 1) error_2 = noise.depolarizing_error(prob_2, 2) # Add errors to noise model noise_model = noise.NoiseModel() noise_model.add_all_qubit_quantum_error(error_1, ['u1', 'u2', 'u3']) noise_model.add_all_qubit_quantum_error(error_2, ['cx']) # Get basis gates from noise model basis_gates = noise_model.basis_gates # Make a circuit circ = QuantumCircuit(3, 3) circ.h(0) circ.cx(0, 1) circ.cx(1, 2) circ.measure([0, 1, 2], [0, 1, 2]) # Perform a noise simulation result = execute(circ, Aer.get_backend('qasm_simulator'), basis_gates=basis_gates, noise_model=noise_model).result() counts = result.get_counts(0) plot_histogram(counts) Classes ======= The following are the classes used to represented noise and error terms. .. autosummary:: :toctree: ../stubs/ NoiseModel QuantumError ReadoutError Quantum Error Functions ======================= The following functions can be used to generate many common types of :class:`QuantumError` objects for inclusion in a :class:`NoiseModel`. .. autosummary:: :toctree: ../stubs/ pauli_error depolarizing_error pauli_error mixed_unitary_error coherent_unitary_error reset_error amplitude_damping_error phase_damping_error phase_amplitude_damping_error thermal_relaxation_error kraus_error Device Noise Parameters ======================= The following are utility functions which can be used for extracting error parameters and error objects from device `BackendProperties`. .. autosummary:: :toctree: ../stubs/ device.basic_device_readout_errors device.basic_device_gate_errors device.gate_param_values device.gate_error_values device.gate_length_values device.readout_error_values device.thermal_relaxation_values """ # Noise and Error classes from .noise_model import NoiseModel from .errors import QuantumError from .errors import ReadoutError # Error generating functions from .errors import kraus_error from .errors import mixed_unitary_error from .errors import coherent_unitary_error from .errors import pauli_error from .errors import depolarizing_error from .errors import reset_error from .errors import thermal_relaxation_error from .errors import phase_amplitude_damping_error from .errors import amplitude_damping_error from .errors import phase_damping_error # Submodules from . import errors from . import device from . import utils qiskit-aer-0.4.1/qiskit/providers/aer/noise/device/000077500000000000000000000000001362723322000222315ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/noise/device/__init__.py000066400000000000000000000016701362723322000243460ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Functions for building noise models from backend properties. """ from .basic_device_model import basic_device_noise_model from .models import basic_device_readout_errors from .models import basic_device_gate_errors from .parameters import gate_param_values from .parameters import gate_error_values from .parameters import gate_length_values from .parameters import readout_error_values from .parameters import thermal_relaxation_values from . import parameters qiskit-aer-0.4.1/qiskit/providers/aer/noise/device/basic_device_model.py000066400000000000000000000124141362723322000263650ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name,import-outside-toplevel """ Simplified noise models for devices backends. """ import warnings def basic_device_noise_model(properties, gate_error=True, readout_error=True, thermal_relaxation=True, temperature=0, gate_lengths=None, standard_gates=True): """ Return a noise model derived from a devices backend properties. This function generates a noise model based on: * 1 and 2 qubit gate errors consisting of a :func:`depolarizing_error` followed by a :func:`thermal_relaxation_error`. * Single qubit :class:`ReadoutError` on all measurements. The Error error parameters are tuned for each individual qubit based on the :math:`T_1`, :math:`T_2`, frequency and readout error parameters for each qubit, and the gate error and gate time parameters for each gate obtained from the device backend properties. **Additional Information** The noise model includes the following errors: * If ``readout_error=True`` include single qubit readout errors on measurements. * If ``gate_error=True`` and ``thermal_relaxation=True`` include: * Single-qubit gate errors consisting of a :func:`depolarizing_error` followed by a :func:`thermal_relaxation_error` for the qubit the gate acts on. * Two-qubit gate errors consisting of a 2-qubit :func:`depolarizing_error` followed by single qubit :func:`thermal_relaxation_error` on each qubit participating in the gate. * If ``gate_error=True`` is ``True`` and ``thermal_relaxation=False``: * An N-qubit :func:`depolarizing_error` on each N-qubit gate. * If ``gate_error=False`` and ``thermal_relaxation=True`` include single-qubit :func:`thermal_relaxation_errors` on each qubits participating in a multi-qubit gate. For best practice in simulating a backend make sure that the circuit is compiled using the set of basis gates in the noise module by setting ``basis_gates=noise_model.basis_gates`` and using the device coupling map with ``coupling_map=backend.configuration().coupling_map`` **Specifying custom gate times** The ``gate_lengths`` kwarg can be used to specify custom gate times to add gate errors using the :math:`T_1` and :math:`T_2` values from the backend properties. This should be passed as a list of tuples ``gate_lengths=[(name, value), ...]`` where ``name`` is the gate name string, and ``value`` is the gate time in nanoseconds. If a custom gate is specified that already exists in the backend properties, the ``gate_lengths`` value will override the gate time value from the backend properties. If non-default values are used gate_lengths should be a list Args: properties (BackendProperties): backend properties. gate_error (bool): Include depolarizing gate errors (Default: True). readout_error (Bool): Include readout errors in model (Default: True). thermal_relaxation (Bool): Include thermal relaxation errors (Default: True). temperature (double): qubit temperature in milli-Kelvin (mK) for thermal relaxation errors (Default: 0). gate_lengths (list): Custom gate times for thermal relaxation errors. Used to extend or override the gate times in the backend properties (Default: None)) standard_gates (bool): If true return errors as standard qobj gates. If false return as unitary qobj instructions (Default: True) Returns: NoiseModel: An approximate noise model for the device backend. """ warnings.warn( 'This function is been deprecated and moved to a method of the' '`NoiseModel` class. For equivalent functionality use' ' `NoiseModel.from_backend(properties, **kwargs).', DeprecationWarning) # This wrapper is for the deprecated function # We need to import noise model here to avoid cyclic import errors # pylint: disable=import-outside-toplevel from qiskit.providers.aer.noise.noise_model import NoiseModel return NoiseModel.from_backend(properties, gate_error=gate_error, readout_error=readout_error, thermal_relaxation=thermal_relaxation, temperature=temperature, gate_lengths=gate_lengths, standard_gates=standard_gates) qiskit-aer-0.4.1/qiskit/providers/aer/noise/device/models.py000066400000000000000000000333061362723322000240730ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name """ Simplified noise models for devices backends. """ from numpy import inf, exp, allclose from .parameters import readout_error_values from .parameters import gate_param_values from .parameters import thermal_relaxation_values from ..noiseerror import NoiseError from ..errors.readout_error import ReadoutError from ..errors.standard_errors import depolarizing_error from ..errors.standard_errors import thermal_relaxation_error def basic_device_readout_errors(properties): """ Return readout error parameters from a devices BackendProperties. Args: properties (BackendProperties): device backend properties Returns: list: A list of pairs ``(qubits, ReadoutError)`` for qubits with non-zero readout error values. """ errors = [] for qubit, value in enumerate(readout_error_values(properties)): if value is not None and not allclose(value, [0, 0]): probabilities = [[1 - value[0], value[0]], [value[1], 1 - value[1]]] errors.append(([qubit], ReadoutError(probabilities))) return errors def basic_device_gate_errors(properties, gate_error=True, thermal_relaxation=True, gate_lengths=None, temperature=0, standard_gates=True): """ Return QuantumErrors derived from a devices BackendProperties. If non-default values are used gate_lengths should be a list of tuples ``(name, qubits, value)`` where ``name`` is the gate name string, ``qubits`` is either a list of qubits or ``None`` to apply gate time to this gate one any set of qubits, and ``value`` is the gate time in nanoseconds. Args: properties (BackendProperties): device backend properties gate_error (bool): Include depolarizing gate errors (Default: True). thermal_relaxation (Bool): Include thermal relaxation errors (Default: True). gate_lengths (list): Override device gate times with custom values. If None use gate times from backend properties. (Default: None). temperature (double): qubit temperature in milli-Kelvin (mK) (Default: 0). standard_gates (bool): If true return errors as standard qobj gates. If false return as unitary qobj instructions (Default: True). Returns: list: A list of tuples ``(label, qubits, QuantumError)``, for gates with non-zero quantum error terms, where `label` is the label of the noisy gate, `qubits` is the list of qubits for the gate. """ # Initilize empty errors depol_error = None relax_error = None # Generate custom gate time dict custom_times = {} relax_params = [] if thermal_relaxation: # If including thermal relaxation errors load # T1, T2, and frequency values from properties relax_params = thermal_relaxation_values(properties) # If we are specifying custom gate times include # them in the custom times dict if gate_lengths: for name, qubits, value in gate_lengths: if name in custom_times: custom_times[name].append((qubits, value)) else: custom_times[name] = [(qubits, value)] # Get the device gate parameters from properties device_gate_params = gate_param_values(properties) # Construct quantum errors errors = [] for name, qubits, gate_length, error_param in device_gate_params: # Check for custom gate time relax_time = gate_length # Override with custom value if name in custom_times: filtered = [ val for q, val in custom_times[name] if q is None or q == qubits ] if filtered: # get first value relax_time = filtered[0] # Get depolarizing error channel if gate_error: depol_error = _device_depolarizing_error( qubits, error_param, relax_time, relax_params, thermal_relaxation, standard_gates) # Get relaxation error if thermal_relaxation: relax_error = _device_thermal_relaxation_error( qubits, relax_time, relax_params, temperature, thermal_relaxation) # Combine errors if depol_error is None and relax_error is None: # No error for this gate pass elif depol_error is not None and relax_error is None: # Append only the depolarizing error errors.append((name, qubits, depol_error)) # Append only the relaxation error elif relax_error is not None and depol_error is None: errors.append((name, qubits, relax_error)) else: # Append a combined error of depolarizing error # followed by a relaxation error combined_error = depol_error.compose(relax_error) errors.append((name, qubits, combined_error)) return errors def _device_depolarizing_error(qubits, error_param, gate_time, relax_params, thermal_relaxation=True, standard_gates=True): """Construct a depolarizing_error for device""" # We now deduce the depolarizing channel error parameter in the # presence of T1/T2 thermal relaxation. We assume the gate error # parameter is given by e = 1 - F where F is the average gate fidelity, # and that this average gate fidelity is for the composition # of a T1/T2 thermal relaxation channel and a depolarizing channel. # For the n-qubit depolarizing channel E_dep = (1-p) * I + p * D, where # I is the identity channel and D is the completely depolarizing # channel, the average gate fidelity is given by: # F(E_dep) = (1 - p) * F(I) + p * F(D) # = (1 - p) * 1 + p * (1 / dim) # where F(I) = 1, F(D) = 1 / dim = 1 - p * (dim - 1) / dim # Hence we have that # p = (1 - F(E_dep)) / ((dim - 1) / dim) # = dim * (1 - F(E_dep)) / (dim - 1) # = dim * e / (dim - 1) # therefore p = dim * error_param / (dim - 1) # with dim = 2 ** N for an N-qubit gate error. error = None num_qubits = len(qubits) dim = 2 ** num_qubits if not thermal_relaxation: # Model gate error entirely as depolarizing error if error_param is not None and error_param > 0: dim = 2 ** num_qubits depol_param = dim * error_param / (dim - 1) else: depol_param = 0 else: # Model gate error as thermal relaxation and depolarizing # error. # Get depolarizing probability if num_qubits == 1: t1, t2, _ = relax_params[qubits[0]] depol_param = _depol_error_value_one_qubit( error_param, gate_time, t1=t1, t2=t2) elif num_qubits == 2: q0_t1, q0_t2, _ = relax_params[qubits[0]] q1_t1, q1_t2, _ = relax_params[qubits[1]] depol_param = _depol_error_value_two_qubit( error_param, gate_time, qubit0_t1=q0_t1, qubit0_t2=q0_t2, qubit1_t1=q1_t1, qubit1_t2=q1_t2) else: raise NoiseError("Device noise model only supports " "1 and 2-qubit gates when using " "thermal_relaxation=True.") if depol_param > 0: # If the device reports an error_param greater than the maximum # allowed for a depolarzing error model we will get a non-physical # depolarizing parameter. # In this case we truncate it to 1 so that the error channel is a # completely depolarizing channel E(rho) = id / d depol_param = min(depol_param, 1.0) error = depolarizing_error( depol_param, num_qubits, standard_gates=standard_gates) return error def _device_thermal_relaxation_error(qubits, gate_time, relax_params, temperature, thermal_relaxation=True): """Construct a thermal_relaxation_error for device""" # Check trivial case if not thermal_relaxation or gate_time is None or gate_time == 0: return None # convert gate time to same units as T1 and T2 (microseconds) gate_time = gate_time / 1000 # Construct a tensor product of single qubit relaxation errors # for any multi qubit gates first = True error = None for qubit in qubits: t1, t2, freq = relax_params[qubit] population = _excited_population(freq, temperature) if first: error = thermal_relaxation_error(t1, t2, gate_time, population) first = False else: single = thermal_relaxation_error(t1, t2, gate_time, population) error = error.expand(single) return error def _excited_population(freq, temperature): """Return excited state population""" population = 0 if freq != inf and temperature != 0: # Compute the excited state population from qubit # frequency and temperature # Boltzman constant kB = 6.62607015e-34 (eV/K) # Planck constant h = 6.62607015e-34 (eV.s) # qubit temperature temperatue = T (mK) # qubit frequency frequency = f (GHz) # excited state population = 1/(1+exp((2hf*1e9)/(kbT*1e-3))) exp_param = exp((95.9849 * freq) / abs(temperature)) population = 1 / (1 + exp_param) if temperature < 0: # negative temperate implies |1> is thermal ground population = 1 - population return population def _depol_error_value_one_qubit(error_param, gate_time=0, t1=inf, t2=inf): """Return 2-qubit depolarizing channel parameter for device model""" # Check trivial case where there is no gate error if error_param is None: return None if error_param == 0: return 0 # Check t1 and t2 are valid if t1 <= 0: raise NoiseError("Invalid T_1 relaxation time parameter: T_1 <= 0.") if t2 <= 0: raise NoiseError("Invalid T_2 relaxation time parameter: T_2 <= 0.") if t2 - 2 * t1 > 0: raise NoiseError( "Invalid T_2 relaxation time parameter: T_2 greater than 2 * T_1.") if gate_time is None: gate_time = 0 if gate_time == 0 or (t1 == inf and t2 == inf): if error_param is not None and error_param > 0: return 2 * error_param else: return 0 # Otherwise we calculate the depolarizing error parameter to account # for the difference between the relaxation error and gate error if t1 == inf: par1 = 1 else: par1 = exp(-gate_time / t1) if t2 == inf: par2 = 1 else: par2 = exp(-gate_time / t2) depol_param = 1 + 3 * (2 * error_param - 1) / (par1 + 2 * par2) return depol_param def _depol_error_value_two_qubit(error_param, gate_time=0, qubit0_t1=inf, qubit0_t2=inf, qubit1_t1=inf, qubit1_t2=inf): """Return 2-qubit depolarizing channel parameter for device model""" # Check trivial case where there is no gate error if error_param is None: return None if error_param == 0: return 0 # Check t1 and t2 are valid if qubit0_t1 <= 0 or qubit1_t1 <= 0: raise NoiseError("Invalid T_1 relaxation time parameter: T_1 <= 0.") if qubit0_t2 <= 0 or qubit1_t2 <= 0: raise NoiseError("Invalid T_2 relaxation time parameter: T_2 <= 0.") if qubit0_t2 - 2 * qubit0_t1 > 0 or qubit1_t2 - 2 * qubit1_t1 > 0: raise NoiseError( "Invalid T_2 relaxation time parameter: T_2 greater than 2 * T_1.") if gate_time is None: gate_time = 0 if gate_time == 0 or (qubit0_t1 == inf and qubit0_t2 == inf and qubit1_t1 == inf and qubit1_t2 == inf): if error_param is not None and error_param > 0: return 4 * error_param / 3 else: return 0 # Otherwise we calculate the depolarizing error probability to account # for the difference between the relaxation error and gate error if qubit0_t1 == inf: q0_par1 = 1 else: q0_par1 = exp(-gate_time / qubit0_t1) if qubit0_t2 == inf: q0_par2 = 1 else: q0_par2 = exp(-gate_time / qubit0_t2) if qubit1_t1 == inf: q1_par1 = 1 else: q1_par1 = exp(-gate_time / qubit1_t1) if qubit1_t2 == inf: q1_par2 = 1 else: q1_par2 = exp(-gate_time / qubit1_t2) denom = ( q0_par1 + q1_par1 + q0_par1 * q1_par1 + 4 * q0_par2 * q1_par2 + 2 * (q0_par2 + q1_par2) + 2 * (q1_par1 * q0_par2 + q0_par1 * q1_par2)) depol_param = 1 + 5 * (4 * error_param - 3) / denom return depol_param qiskit-aer-0.4.1/qiskit/providers/aer/noise/device/parameters.py000066400000000000000000000152431362723322000247530ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Functions to extract device error parameters from backend properties. """ from numpy import inf # Time and frequency unit conversions _MICROSECOND_UNITS = {'s': 1e6, 'ms': 1e3, 'µs': 1, 'us': 1, 'ns': 1e-3} _NANOSECOND_UNITS = {'s': 1e9, 'ms': 1e6, 'µs': 1e3, 'us': 1e3, 'ns': 1} _GHZ_UNITS = {'Hz': 1e-9, 'KHz': 1e-6, 'MHz': 1e-3, 'GHz': 1, 'THz': 1e3} def gate_param_values(properties): """ Return parameter error values from a devices BackendProperties. Args: properties (BackendProperties): device backend properties Returns: list: A list of tuples ``(name, qubits, time, error)``. If gate error or gate_length information is not available ``None`` will be returned for value. """ values = [] for gate in properties.gates: name = gate.gate qubits = gate.qubits # Check for gate time information gate_length = None # default value time_param = _check_for_item(gate.parameters, 'gate_length') if hasattr(time_param, 'value'): gate_length = time_param.value if hasattr(time_param, 'unit'): # Convert gate time to ns gate_length *= _NANOSECOND_UNITS.get(time_param.unit, 1) # Check for gate error information gate_error = None # default value error_param = _check_for_item(gate.parameters, 'gate_error') if hasattr(error_param, 'value'): gate_error = error_param.value values.append((name, qubits, gate_length, gate_error)) return values def gate_error_values(properties): """ Return gate error values from a devices BackendProperties. Args: properties (BackendProperties): device backend properties Returns: list: A list of tuples ``(name, qubits, value)``. If gate error information is not available ``None`` will be returned for value. """ values = [] for gate in properties.gates: name = gate.gate qubits = gate.qubits value = None # default value params = _check_for_item(gate.parameters, 'gate_error') if hasattr(params, 'value'): value = params.value values.append((name, qubits, value)) return values def gate_length_values(properties): """ Return gate length values from a devices BackendProperties. Args: properties (BackendProperties): device backend properties Returns: list: A list of tuples ``(name, qubits, value)``. If gate length information is not available ``None`` will be returned for value. Additional Information: Gate length values are returned in nanosecond (ns) units. """ values = [] for gate in properties.gates: name = gate.gate qubits = gate.qubits value = None # default value params = _check_for_item(gate.parameters, 'gate_length') if hasattr(params, 'value'): value = params.value if hasattr(params, 'unit'): # Convert gate time to ns value *= _NANOSECOND_UNITS.get(params.unit, 1) values.append((name, qubits, value)) return values def readout_error_values(properties): """ Return readout error values from a devices BackendProperties. Args: properties (BackendProperties): device backend properties Returns: list: A list of readout error values for qubits. If readout error information is not available None will be returned for value. """ values = [] for qubit_props in properties.qubits: value = None # default value params_roerror = _check_for_item(qubit_props, 'readout_error') params_m1p0 = _check_for_item(qubit_props, 'prob_meas1_prep0') params_m0p1 = _check_for_item(qubit_props, 'prob_meas0_prep1') if hasattr(params_m1p0, 'value') and hasattr(params_m0p1, 'value'): value = [params_m1p0.value, params_m0p1.value] elif hasattr(params_roerror, 'value'): value = [params_roerror.value, params_roerror.value] values.append(value) return values def thermal_relaxation_values(properties): """ Return T1, T2 and frequency values from a devices BackendProperties. Args: properties (BackendProperties): device backend properties Returns: list: A list of tuples ``(T1, T2, freq)`` for each qubit in the device. If :math:`T_1`, :math:`T_2`, or frequency cannot be found for qubit a value of ``Numpy.inf`` will be used. Additional Information: :math:`T_1` and :math:`T_2` values are returned in microsecond (µs) units. Frequency is returned in gigahertz (GHz) units. """ values = [] for qubit_props in properties.qubits: # pylint: disable=invalid-name # Default values t1, t2, freq = inf, inf, inf # Get the readout error value t1_params = _check_for_item(qubit_props, 'T1') t2_params = _check_for_item(qubit_props, 'T2') freq_params = _check_for_item(qubit_props, 'frequency') # Load values from parameters if hasattr(t1_params, 'value'): t1 = t1_params.value if hasattr(t1_params, 'unit'): # Convert to micro seconds t1 *= _MICROSECOND_UNITS.get(t1_params.unit, 1) if hasattr(t2_params, 'value'): t2 = t2_params.value if hasattr(t2_params, 'unit'): # Convert to micro seconds t2 *= _MICROSECOND_UNITS.get(t2_params.unit, 1) if hasattr(t2_params, 'value'): freq = freq_params.value if hasattr(freq_params, 'unit'): # Convert to Gigahertz freq *= _GHZ_UNITS.get(freq_params.unit, 1) # NOTE: T2 cannot be larger than 2 * T1 for a physical noise # channel, however if a backend erroneously reports such a value we # truncated it here: t2 = min(2 * t1, t2) values.append((t1, t2, freq)) return values def _check_for_item(lst, name): """Search list for item with given name.""" filtered = [item for item in lst if item.name == name] if not filtered: return None else: return filtered[0] qiskit-aer-0.4.1/qiskit/providers/aer/noise/errors/000077500000000000000000000000001362723322000223065ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/noise/errors/__init__.py000066400000000000000000000021101362723322000244110ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Errors for qiskit-aer noise models. """ from .readout_error import ReadoutError from .quantum_error import QuantumError from .standard_errors import kraus_error from .standard_errors import mixed_unitary_error from .standard_errors import coherent_unitary_error from .standard_errors import pauli_error from .standard_errors import depolarizing_error from .standard_errors import reset_error from .standard_errors import thermal_relaxation_error from .standard_errors import phase_amplitude_damping_error from .standard_errors import amplitude_damping_error from .standard_errors import phase_damping_error qiskit-aer-0.4.1/qiskit/providers/aer/noise/errors/errorutils.py000066400000000000000000000531521362723322000251000ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Helper functions for noise model creation. """ import numpy as np from qiskit.quantum_info.operators.operator import Operator from qiskit.quantum_info.operators.channel.kraus import Kraus from qiskit.quantum_info.operators.channel.superop import SuperOp from qiskit.quantum_info.operators.predicates import is_identity_matrix from qiskit.quantum_info.operators.predicates import is_unitary_matrix from qiskit.quantum_info.operators.predicates import matrix_equal from qiskit.quantum_info.operators.predicates import ATOL_DEFAULT from ..noiseerror import NoiseError def standard_gates_instructions(instructions): """Convert a list with unitary matrix instructions into standard gates. Args: instructions (list): A list of qobj instructions. Returns: list: a list of qobj instructions equivalent to in input instruction. """ output_instructions = [] for instruction in instructions: output_instructions += standard_gate_instruction(instruction) return output_instructions # pylint: disable=too-many-return-statements def standard_gate_instruction(instruction, ignore_phase=True): """Convert a unitary matrix instruction into a standard gate instruction. Args: instruction (dict): A qobj instruction. ignore_phase (bool): Ignore global phase on unitary matrix in comparison to canonical unitary. Returns: list: a list of qobj instructions equivalent to in input instruction. """ name = instruction.get("name", None) if name not in ["mat", "unitary", "kraus"]: return [instruction] qubits = instruction["qubits"] params = instruction["params"] # Check for single-qubit reset Kraus if name == "kraus": if len(qubits) == 1: superop = SuperOp(Kraus(params)) # Check if reset to |0> reset0 = reset_superop(1) if superop == reset0: return [{"name": "reset", "qubits": qubits}] # Check if reset to |1> reset1 = reset0.compose(Operator(standard_gate_unitary('x'))) if superop == reset1: return [{"name": "reset", "qubits": qubits}, {"name": "x", "qubits": qubits}] # otherwise just return the kraus instruction return [instruction] # Check single qubit gates mat = params[0] if len(qubits) == 1: # Check clifford gates for j in range(24): if matrix_equal( mat, single_qubit_clifford_matrix(j), ignore_phase=ignore_phase): return single_qubit_clifford_instructions(j, qubit=qubits[0]) # Check t gates for name in ["t", "tdg"]: if matrix_equal( mat, standard_gate_unitary(name), ignore_phase=ignore_phase): return [{"name": name, "qubits": qubits}] # TODO: u1,u2,u3 decomposition # Check two qubit gates if len(qubits) == 2: for name in ["cx", "cz", "swap"]: if matrix_equal( mat, standard_gate_unitary(name), ignore_phase=ignore_phase): return [{"name": name, "qubits": qubits}] # Check reversed CX if matrix_equal( mat, standard_gate_unitary("cx_10"), ignore_phase=ignore_phase): return [{"name": "cx", "qubits": [qubits[1], qubits[0]]}] # Check 2-qubit Pauli's paulis = ["id", "x", "y", "z"] for pauli0 in paulis: for pauli1 in paulis: pmat = np.kron( standard_gate_unitary(pauli1), standard_gate_unitary(pauli0)) if matrix_equal(mat, pmat, ignore_phase=ignore_phase): if pauli0 == "id": return [{"name": pauli1, "qubits": [qubits[1]]}] elif pauli1 == "id": return [{"name": pauli0, "qubits": [qubits[0]]}] else: return [{ "name": pauli0, "qubits": [qubits[0]] }, { "name": pauli1, "qubits": [qubits[1]] }] # Check three qubit toffoli if len(qubits) == 3: if matrix_equal( mat, standard_gate_unitary("ccx_012"), ignore_phase=ignore_phase): return [{"name": "ccx", "qubits": qubits}] if matrix_equal( mat, standard_gate_unitary("ccx_021"), ignore_phase=ignore_phase): return [{ "name": "ccx", "qubits": [qubits[0], qubits[2], qubits[1]] }] if matrix_equal( mat, standard_gate_unitary("ccx_120"), ignore_phase=ignore_phase): return [{ "name": "ccx", "qubits": [qubits[1], qubits[2], qubits[0]] }] # Else return input in return [instruction] def single_qubit_clifford_gates(j): """Return a QASM gate names for a single qubit Clifford. The labels are returned in a basis set consisting of ('id', 's', 'sdg', 'z', 'h', x', 'y') gates decomposed to use the minimum number of X-90 pulses in a (u1, u2, u3) decomposition. Args: j (int): Clifford index 0, ..., 23. Returns: tuple(str): The tuple of basis gates. Raises: NoiseError: If index is out of range [0, 23]. """ if not isinstance(j, int) or j < 0 or j > 23: raise NoiseError( "Index {} must be in the range [0, ..., 23]".format(j)) labels = [ ('id', ), ('s', ), ('sdg', ), ('z', ), # u2 gates ( 'h', ), ('h', 'z'), ('z', 'h'), ('h', 's'), ('s', 'h'), ('h', 'sdg'), ('sdg', 'h'), ('s', 'h', 's'), ('sdg', 'h', 's'), ('z', 'h', 's'), ('s', 'h', 'sdg'), ('sdg', 'h', 'sdg'), ('z', 'h', 'sdg'), ('s', 'h', 'z'), ('sdg', 'h', 'z'), ('z', 'h', 'z'), # u3 gates ( 'x', ), ('y', ), ('s', 'x'), ('sdg', 'x') ] return labels[j] def single_qubit_clifford_matrix(j): """Return Numpy array for a single qubit Clifford. Args: j (int): Clifford index 0, ..., 23. Returns: np.array: The matrix for the indexed clifford. Raises: NoiseError: If index is out of range [0, 23]. """ if not isinstance(j, int) or j < 0 or j > 23: raise NoiseError( "Index {} must be in the range [0, ..., 23]".format(j)) basis_dict = { 'id': np.eye(2), 'x': np.array([[0, 1], [1, 0]], dtype=complex), 'y': np.array([[0, -1j], [1j, 0]], dtype=complex), 'z': np.array([[1, 0], [0, -1]], dtype=complex), 'h': np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2), 's': np.array([[1, 0], [0, 1j]], dtype=complex), 'sdg': np.array([[1, 0], [0, -1j]], dtype=complex) } mat = np.eye(2) for gate in single_qubit_clifford_gates(j): mat = np.dot(basis_dict[gate], mat) return mat # pylint: disable=invalid-name def single_qubit_clifford_instructions(index, qubit=0): """Return a list of qobj instructions for a single qubit Cliffords. The instructions are returned in a basis set consisting of ('id', 's', 'sdg', 'z', 'h', x', 'y') gates decomposed to use the minimum number of X-90 pulses in a (u1, u2, u3) decomposition. Args: index (int): Clifford index 0, ..., 23. qubit (int): the qubit to apply the Clifford to. Returns: list(dict): The list of instructions. Raises: NoiseError: If index is out of range [0, 23] or qubit invalid. """ if not isinstance(index, int) or index < 0 or index > 23: raise NoiseError( "Index {} must be in the range [0, ..., 23]".format(index)) if not isinstance(qubit, int) or qubit < 0: raise NoiseError("qubit position must be positive integer.") instructions = [] for gate in single_qubit_clifford_gates(index): instructions.append({"name": gate, "qubits": [qubit]}) return instructions def standard_gate_unitary(name): """Return the unitary matrix for a standard gate.""" unitary_matrices = { ("id", "I"): np.eye(2, dtype=complex), ("x", "X"): np.array([[0, 1], [1, 0]], dtype=complex), ("y", "Y"): np.array([[0, -1j], [1j, 0]], dtype=complex), ("z", "Z"): np.array([[1, 0], [0, -1]], dtype=complex), ("h", "H"): np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2), ("s", "S"): np.array([[1, 0], [0, 1j]], dtype=complex), ("sdg", "Sdg"): np.array([[1, 0], [0, -1j]], dtype=complex), ("t", "T"): np.array([[1, 0], [0, np.exp(1j * np.pi / 4)]], dtype=complex), ("tdg", "Tdg"): np.array([[1, 0], [0, np.exp(-1j * np.pi / 4)]], dtype=complex), ("cx", "CX", "cx_01"): np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]], dtype=complex), ("cx_10",): np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]], dtype=complex), ("cz", "CZ"): np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, -1]], dtype=complex), ("swap", "SWAP"): np.array([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]], dtype=complex), ("ccx", "CCX", "ccx_012", "ccx_102"): np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0]], dtype=complex), ("ccx_021", "ccx_201"): np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 0]], dtype=complex), ("ccx_120", "ccx_210"): np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0]], dtype=complex) } return next((value for key, value in unitary_matrices.items() if name in key), None) def reset_superop(num_qubits): """Return a N-qubit reset SuperOp.""" reset = SuperOp( np.array([[1, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])) if num_qubits == 1: return reset reset_n = reset for _ in range(num_qubits - 1): reset_n.tensor(reset) return reset_n def standard_instruction_operator(instr): """Return the Operator for a standard gate instruction.""" # Convert to dict (for QobjInstruction types) if hasattr(instr, 'as_dict'): instr = instr.as_dict() # Get name and parameters name = instr.get('name', "") params = instr.get('params', []) # Check if standard unitary gate name mat = standard_gate_unitary(name) if isinstance(mat, np.ndarray): return Operator(mat) # Check if standard parameterized waltz gates if name == 'u1': lam = params[0] mat = np.diag([1, np.exp(1j * lam)]) return Operator(mat) if name == 'u2': phi = params[0] lam = params[1] mat = np.array([[1, -np.exp(1j * lam)], [np.exp(1j * phi), np.exp(1j * (phi + lam))]]) / np.sqrt(2) return Operator(mat) if name == 'u3': theta = params[0] phi = params[1] lam = params[2] mat = np.array( [[np.cos(theta / 2), -np.exp(1j * lam) * np.sin(theta / 2)], [np.exp(1j * phi) * np.sin(theta / 2), np.exp(1j * (phi + lam)) * np.cos(theta / 2)]]) return Operator(mat) # Check if unitary instruction if name == 'unitary': return Operator(params[0]) # Otherwise return None if we cannot convert instruction return None def standard_instruction_channel(instr): """Return the SuperOp channel for a standard instruction.""" # Check if standard operator oper = standard_instruction_operator(instr) if oper is not None: return SuperOp(oper) # Convert to dict (for QobjInstruction types) if hasattr(instr, 'as_dict'): instr = instr.as_dict() # Get name and parameters name = instr.get('name', "") # Check if reset instruction if name == 'reset': # params should be the number of qubits being reset num_qubits = len(instr['qubits']) return reset_superop(num_qubits) # Check if Kraus instruction if name == 'kraus': params = instr['params'] return SuperOp(Kraus(params)) return None def circuit2superop(circuit, min_qubits=1): """Return the SuperOp for a standard instruction.""" # Get number of qubits max_qubits = 1 for instr in circuit: qubits = [] if hasattr(instr, 'qubits'): qubits = instr.qubits elif isinstance(instr, dict): qubits = instr.get('qubits', []) max_qubits = max(max_qubits, 1 + max(qubits)) num_qubits = max(max_qubits, min_qubits) # Initialize N-qubit identity superoperator superop = SuperOp(np.eye(4**num_qubits)) # compose each circuit element with the superoperator for instr in circuit: instr_op = standard_instruction_channel(instr) if instr_op is None: raise NoiseError('Cannot convert instruction {} to SuperOp'.format(instr)) if hasattr(instr, 'qubits'): qubits = instr.qubits else: qubits = instr['qubits'] superop = superop.compose(instr_op, qubits) return superop def make_unitary_instruction(mat, qubits, standard_gates=True): """Return a qobj instruction for a unitary matrix gate. Args: mat (matrix): A square or diagonal unitary matrix. qubits (list[int]): The qubits the matrix is applied to. standard_gates (bool): Check if the matrix instruction is a standard instruction. Returns: dict: The qobj instruction object. Raises: NoiseError: if the input is not a unitary matrix. """ if not is_unitary_matrix(mat): raise NoiseError("Input matrix is not unitary.") if isinstance(qubits, int): qubits = [qubits] instruction = {"name": "unitary", "qubits": qubits, "params": [mat]} if standard_gates: return standard_gate_instruction(instruction) else: return [instruction] def make_kraus_instruction(mats, qubits): """Return a qobj instruction for a Kraus error. Args: mats (list[matrix]): A list of square or diagonal Kraus matrices. qubits (list[int]): The qubits the matrix is applied to. Returns: dict: The qobj instruction object. Raises: NoiseError: if the input is not a CPTP Kraus channel. """ kraus = Kraus(mats) if not kraus.is_cptp() or kraus._input_dim != kraus._output_dim: raise NoiseError("Input Kraus matrices are not a CPTP channel.") if isinstance(qubits, int): qubits = [qubits] return [{"name": "kraus", "qubits": qubits, "params": kraus.data}] def qubits_from_mat(mat): """Return the number of qubits for a multi-qubit matrix.""" arr = np.array(mat) shape = arr.shape num_qubits = int(np.log2(shape[1])) if shape[1] != 2**num_qubits: raise NoiseError("Input Kraus channel is not a multi-qubit channel.") return num_qubits def is_matrix_diagonal(mat): """Test if row-vector representation of diagonal matrix.""" mat = np.array(mat) shape = mat.shape return len(shape) == 2 and shape[0] == 1 def kraus2instructions(kraus_ops, standard_gates, atol=ATOL_DEFAULT): """ Convert a list of Kraus matrices into qobj circuits. If any Kraus operators are a unitary matrix they will be converted into unitary qobj instructions. Identity unitary matrices will also be converted into identity qobj instructions. Args: kraus_ops (list[matrix]): A list of Kraus matrices for a CPTP map. standard_gates (bool): Check if the matrix instruction is a standard instruction (default: True). atol (double): Threshold for testing if probabilities are zero. Returns: list: A list of pairs (p, circuit) where `circuit` is a list of qobj instructions, and `p` is the probability of that circuit for the given error. Raises: NoiseError: If the input Kraus channel is not CPTP. """ # Check threshold if atol < 0: raise NoiseError("atol cannot be negative") if atol > 1e-5: raise NoiseError( "atol value is too large. It should be close to zero.") # Check CPTP if not Kraus(kraus_ops).is_cptp(atol=atol): raise NoiseError("Input Kraus channel is not CPTP.") # Get number of qubits num_qubits = int(np.log2(len(kraus_ops[0]))) if len(kraus_ops[0]) != 2**num_qubits: raise NoiseError("Input Kraus channel is not a multi-qubit channel.") # Check if each matrix is a: # 1. scaled identity matrix # 2. scaled non-identity unitary matrix # 3. a non-unitary Kraus operator # Probabilities prob_identity = 0 prob_unitary = 0 # total probability of all unitary ops (including id) prob_kraus = 0 # total probability of non-unitary ops probabilities = [] # initialize with probability of Identity # Matrices unitaries = [] # non-identity unitaries non_unitaries = [] # non-unitary Kraus matrices for mat in kraus_ops: # Get the value of the maximum diagonal element # of op.H * op for rescaling # pylint: disable=no-member prob = abs(max(np.diag(np.conj(np.transpose(mat)).dot(mat)))) if prob > 0.0: if abs(prob - 1) > 0.0: # Rescale the operator by square root of prob rescaled_mat = np.array(mat) / np.sqrt(prob) else: rescaled_mat = mat # Check if identity operator if is_identity_matrix(rescaled_mat, ignore_phase=True): prob_identity += prob prob_unitary += prob # Check if unitary elif is_unitary_matrix(rescaled_mat): probabilities.append(prob) prob_unitary += prob unitaries.append(rescaled_mat) # Non-unitary op else: non_unitaries.append(mat) # Check probabilities prob_kraus = 1 - prob_unitary if prob_unitary - 1 > atol: raise NoiseError("Invalid kraus matrices: unitary probability " "{} > 1".format(prob_unitary)) if prob_unitary < -atol: raise NoiseError("Invalid kraus matrices: unitary probability " "{} < 1".format(prob_unitary)) if prob_identity - 1 > atol: raise NoiseError("Invalid kraus matrices: identity probability " "{} > 1".format(prob_identity)) if prob_identity < -atol: raise NoiseError("Invalid kraus matrices: identity probability " "{} < 1".format(prob_identity)) if prob_kraus - 1 > atol: raise NoiseError("Invalid kraus matrices: non-unitary probability " "{} > 1".format(prob_kraus)) if prob_kraus < -atol: raise NoiseError("Invalid kraus matrices: non-unitary probability " "{} < 1".format(prob_kraus)) # Build qobj instructions instructions = [] qubits = list(range(num_qubits)) # Add unitary instructions for unitary in unitaries: instructions.append( make_unitary_instruction( unitary, qubits, standard_gates=standard_gates)) # Add identity instruction if prob_identity > atol: if abs(prob_identity - 1) < atol: probabilities.append(1) else: probabilities.append(prob_identity) instructions.append([{"name": "id", "qubits": [0]}]) # Add Kraus if prob_kraus < atol: # No Kraus operators return zip(instructions, probabilities) if prob_kraus < 1: # Rescale kraus operators by probabilities non_unitaries = [ np.array(op) / np.sqrt(prob_kraus) for op in non_unitaries ] instructions.append(make_kraus_instruction(non_unitaries, qubits)) probabilities.append(prob_kraus) # Normalize probabilities to account for any rounding errors probabilities = list(np.array(probabilities) / np.sum(probabilities)) return zip(instructions, probabilities) qiskit-aer-0.4.1/qiskit/providers/aer/noise/errors/quantum_error.py000066400000000000000000000624341362723322000255740ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Quantum error class for Qiskit Aer noise model """ import logging import copy import numpy as np from qiskit.quantum_info.operators.base_operator import BaseOperator from qiskit.quantum_info.operators import Kraus, SuperOp, Choi, Operator from qiskit.quantum_info.operators.predicates import ATOL_DEFAULT, RTOL_DEFAULT from ..noiseerror import NoiseError from .errorutils import kraus2instructions from .errorutils import circuit2superop from .errorutils import standard_instruction_channel from .errorutils import standard_instruction_operator logger = logging.getLogger(__name__) class QuantumError: """ Quantum error class for Qiskit Aer noise model WARNING: The init interface for this class is not finalized and may change in future releases. For maximum backwards compatibility use the QuantumError generating functions in the `noise.errors` module. """ # pylint: disable=invalid-name ATOL = ATOL_DEFAULT RTOL = RTOL_DEFAULT MAX_TOL = 1e-4 def __init__(self, noise_ops, number_of_qubits=None, standard_gates=True, atol=ATOL_DEFAULT): """ Create a quantum error for a noise model. Noise ops may either be specified as list of Kraus operators for a general CPTP map, or as a list of ``(circuit, p)`` pairs where ``circuit`` is a qobj circuit for the noise, and ``p`` is the probability of the error circuit. If the input is Kraus operators they will be converted to the circuit format, with checks applied for determining if any Kraus operators are unitary matrices. **Example** An example noise_ops for a bit-flip error with error probability ``p = 0.1`` is: .. code-block:: python noise_ops = [([{"name": "id", "qubits": 0}], 0.9), ([{"name": "x", "qubits": 0}], 0.1)] The same error represented as a Kraus channel can be input as: .. code-block:: python noise_ops = [np.sqrt(0.9) * np.array([[1, 0], [0, 1]]), np.sqrt(0.1) * np.array([[0, 1], [1, 0]])] Args: noise_ops (list): A list of noise ops. See additional information. number_of_qubits (int): specify the number of qubits for the error. If None this will be determined automatically (default None). standard_gates (bool): Check if input matrices are standard gates. atol (double): Threshold for testing if probabilities are equal to 0 or 1 (Default: 1e-8). Raises: NoiseError: If input noise_ops are not a CPTP map. """ # Shallow copy constructor if isinstance(noise_ops, QuantumError): self._number_of_qubits = noise_ops._number_of_qubits self._noise_circuits = noise_ops._noise_circuits self._noise_probabilities = noise_ops._noise_probabilities return # Initialize internal variables self._number_of_qubits = None self._noise_circuits = [] self._noise_probabilities = [] # Convert operator subclasses into Kraus list if issubclass(noise_ops.__class__, BaseOperator) or hasattr( noise_ops, 'to_quantumchannel') or hasattr( noise_ops, 'to_operator'): noise_ops, other = Kraus(noise_ops)._data if other is not None: # A Kraus map with different left and right Kraus matrices # cannot be CPTP raise NoiseError("Input quantum channel is not CPTP.") # Convert iterable input into list noise_ops = list(noise_ops) # Check if Kraus if isinstance(noise_ops[0], np.ndarray): noise_ops = kraus2instructions( noise_ops, standard_gates, atol=atol) minimum_qubits = 0 # Add non-zero probability error circuits to the error for circuit, prob in noise_ops: if prob > 0.0: self._noise_circuits.append(circuit) self._noise_probabilities.append(prob) # Determinine minimum qubit number for error from circuits for gate in circuit: gate_qubits = max(gate["qubits"]) + 1 minimum_qubits = max([minimum_qubits, gate_qubits]) # Set number of qubits if number_of_qubits is None: self._number_of_qubits = minimum_qubits else: self._number_of_qubits = number_of_qubits # Combine any kraus circuits noise_ops = self._combine_kraus(noise_ops, self.number_of_qubits) # Error checking if minimum_qubits > self._number_of_qubits: raise NoiseError("Input errors require {} qubits, " "but number_of_qubits is {}".format( minimum_qubits, number_of_qubits)) if len(self._noise_circuits) != len(self._noise_probabilities): raise NoiseError( "Number of error circuits does not match length of probabilities" ) total_probs = np.sum(self._noise_probabilities) if abs(total_probs - 1) > atol: raise NoiseError( "Probabilities are not normalized: {} != 1".format( total_probs)) if [p for p in self._noise_probabilities if (isinstance(p, complex) or (p < 0))]: raise NoiseError("Probabilities are invalid.") # Rescale probabilities if their sum is ok to avoid # accumulation of rounding errors self._noise_probabilities = list(np.array(self._noise_probabilities) / total_probs) def __repr__(self): """Display QuantumError.""" return "QuantumError({})".format( list(zip(self.circuits, self.probabilities))) def __str__(self): """Print error information.""" output = "QuantumError on {} qubits. Noise circuits:".format( self._number_of_qubits) for j, pair in enumerate(zip(self.probabilities, self.circuits)): output += "\n P({0}) = {1}, QasmQobjInstructions = [{2}".format( j, pair[0], pair[1]) return output def __eq__(self, other): """Test if two QuantumErrors are equal as SuperOps""" if not isinstance(other, QuantumError): return False return self.to_quantumchannel() == other.to_quantumchannel() def copy(self): """Make a copy of current QuantumError.""" # pylint: disable=no-value-for-parameter # The constructor of subclasses from raw data should be a copy return copy.deepcopy(self) @property def atol(self): """The absolute tolerance parameter for float comparisons.""" return self.ATOL @atol.setter def atol(self, atol): """Set the absolute tolerance parameter for float comparisons.""" max_tol = self.MAX_TOL if atol < 0: raise NoiseError("Invalid atol: must be non-negative.") if atol > max_tol: raise NoiseError( "Invalid atol: must be less than {}.".format(max_tol)) self.ATOL = atol @property def rtol(self): """The relative tolerance parameter for float comparisons.""" return self.RTOL @rtol.setter def rtol(self, rtol): """Set the relative tolerance parameter for float comparisons.""" max_tol = self.MAX_TOL if rtol < 0: raise NoiseError("Invalid rtol: must be non-negative.") if rtol > max_tol: raise NoiseError( "Invalid rtol: must be less than {}.".format(max_tol)) self.RTOL = rtol @property def size(self): """Return the number of error circuit.""" return len(self._noise_circuits) @property def number_of_qubits(self): """Return the number of qubits for the error.""" return self._number_of_qubits @property def circuits(self): """Return the list of error circuits.""" return self._noise_circuits @property def probabilities(self): """Return the list of error probabilities.""" return self._noise_probabilities def ideal(self): """Return True if current error object is an identity""" instructions, probability = self.error_term(0) if probability == 1 and instructions == [{ "name": "id", "qubits": [0] }]: logger.debug("Error object is ideal") return True return False def to_quantumchannel(self): """Convert the QuantumError to a SuperOp quantum channel.""" # Initialize as an empty superoperator of the correct size dim = 2**self.number_of_qubits channel = SuperOp(np.zeros([dim * dim, dim * dim])) for circuit, prob in zip(self._noise_circuits, self._noise_probabilities): component = prob * circuit2superop(circuit, self.number_of_qubits) channel = channel + component return channel def to_instruction(self): """Convert the QuantumError to a circuit Instruction.""" return self.to_quantumchannel().to_instruction() def error_term(self, position): """ Return a single term from the error. Args: position (int): the position of the error term. Returns: tuple: A pair `(p, circuit)` for error term at `position` < size where `p` is the probability of the error term, and `circuit` is the list of qobj instructions for the error term. Raises: NoiseError: If the position is greater than the size of the quantum error. """ if position < self.size: return self.circuits[position], self.probabilities[position] else: raise NoiseError("Position {} is greater than the number".format( position) + "of error outcomes {}".format(self.size)) def to_dict(self): """Return the current error as a dictionary.""" error = { "type": "qerror", "operations": [], "instructions": list(self._noise_circuits), "probabilities": list(self._noise_probabilities) } return error def compose(self, other, front=False): """Return the composition error channel other * self. Note that for `front=True` this is equivalent to the :meth:`QuantumError.dot` method. Args: other (QuantumError): a quantum error channel. front (bool): If True return the reverse order composation self * other instead [default: False]. Returns: QuantumError: The composition error channel. Raises: NoiseError: if other cannot be converted into a QuantumError, or has incompatible dimensions. """ if front: return self._matmul(other, left_multiply=False) return self._matmul(other, left_multiply=True) def dot(self, other): """Return the composition error channel self * other. Args: other (QuantumError): a quantum error channel. Returns: QuantumError: The composition error channel. Raises: NoiseError: if other cannot be converted into a QuantumError, or has incompatible dimensions. """ return self._matmul(other, left_multiply=False) def power(self, n): """Return the compose of a error channel with itself n times. Args: n (int): the number of times to compose with self (n>0). Returns: QuantumError: the n-times composition error channel. Raises: NoiseError: if the power is not a positive integer. """ if not isinstance(n, int) or n < 1: raise NoiseError("Can only power with positive integer powers.") ret = self.copy() for _ in range(1, n): ret = ret.compose(self) return ret def tensor(self, other): """Return the tensor product quantum error channel self ⊗ other. Args: other (QuantumError): a quantum error channel. Returns: QuantumError: the tensor product error channel self ⊗ other. Raises: NoiseError: if other cannot be converted to a QuantumError. """ return self._tensor_product(other, reverse=False) def expand(self, other): """Return the tensor product quantum error channel self ⊗ other. Args: other (QuantumError): a quantum error channel. Returns: QuantumError: the tensor product error channel other ⊗ self. Raises: NoiseError: if other cannot be converted to a QuantumError. """ return self._tensor_product(other, reverse=True) def _matmul(self, other, left_multiply=False): """Return the composition quantum error. Args: other (QuantumError): a quantum error. left_multiply (bool): If True return other * self If False return self * other [Default:False] Returns: QuantumError: The composition quantum error. Raises: NoiseError: if other cannot be converted into a QuantumError, or has incompatible dimensions. """ # Convert other into a quantum error if not isinstance(other, QuantumError): other = QuantumError(other) # Error checking if self.number_of_qubits != other.number_of_qubits: raise NoiseError( "QuantumErrors are not defined on same number of qubits.") combined_noise_circuits = [] combined_noise_probabilities = [] # Combine subcircuits and probabilities if left_multiply: noise_ops0 = list( zip(self._noise_circuits, self._noise_probabilities)) noise_ops1 = list( zip(other._noise_circuits, other._noise_probabilities)) else: noise_ops0 = list( zip(other._noise_circuits, other._noise_probabilities)) noise_ops1 = list( zip(self._noise_circuits, self._noise_probabilities)) # Combine subcircuits and probabilities for circuit0, prob0 in noise_ops0: for circuit1, prob1 in noise_ops1: combined_noise_probabilities.append(prob0 * prob1) tmp_combined = circuit0 + circuit1 # Fuse compatible ops to reduce noise operations: combined_circuit = [tmp_combined[0]] for instr in tmp_combined[1:]: last_instr = combined_circuit[-1] last_name = last_instr['name'] name = instr['name'] can_combine = (last_name in ['id', 'kraus', 'unitary'] or name in ['id', 'kraus', 'unitary']) if (can_combine and self._check_instr(last_name) and self._check_instr(name)): combined_circuit[-1] = self._compose_instr( last_instr, instr, self.number_of_qubits) else: # If they cannot be combined append the operation combined_circuit.append(instr) # Check if circuit is empty and add identity if not combined_circuit: combined_circuit.append({'name': 'id', 'qubits': [0]}) # Add circuit combined_noise_circuits.append(combined_circuit) noise_ops = self._combine_kraus( zip(combined_noise_circuits, combined_noise_probabilities), self.number_of_qubits) return QuantumError(noise_ops) def _tensor_product(self, other, reverse=False): """Return the tensor product error channel. Args: other (QuantumError): a quantum channel subclass reverse (bool): If False return self ⊗ other, if True return if True return (other ⊗ self) [Default: False Returns: QuantumError: the tensor product error channel. Raises: NoiseError: if other cannot be converted to a QuantumError. """ # Convert other into a quantum error if not isinstance(other, QuantumError): other = QuantumError(other) combined_noise_circuits = [] combined_noise_probabilities = [] # Combine subcircuits and probabilities if reverse: shift_qubits = self.number_of_qubits noise_ops0 = list( zip(self._noise_circuits, self._noise_probabilities)) noise_ops1 = list( zip(other._noise_circuits, other._noise_probabilities)) else: shift_qubits = other.number_of_qubits noise_ops0 = list( zip(other._noise_circuits, other._noise_probabilities)) noise_ops1 = list( zip(self._noise_circuits, self._noise_probabilities)) for circuit1, prob1 in noise_ops1: for circuit0, prob0 in noise_ops0: combined_noise_probabilities.append(prob0 * prob1) # Shift qubits in circuit1 circuit1_shift = [] for instr in circuit1: tmp = instr.copy() tmp['qubits'] = [q + shift_qubits for q in tmp['qubits']] circuit1_shift.append(tmp) tmp_combined = circuit0 + circuit1_shift # Fuse compatible ops to reduce noise operations: combined_circuit = [tmp_combined[0]] for instr in tmp_combined[1:]: # Check if instructions can be combined last_instr = combined_circuit[-1] last_name = last_instr['name'] name = instr['name'] can_combine = (last_name in ['id', 'kraus', 'unitary'] or name in ['id', 'kraus', 'unitary']) if (can_combine and self._check_instr(last_name) and self._check_instr(name)): combined_circuit[-1] = self._tensor_instr( last_instr, instr) else: # If they cannot be combined append the operation combined_circuit.append(instr) # Check if circuit is empty and add identity if not combined_circuit: combined_circuit.append({'name': 'id', 'qubits': [0]}) # Add circuit combined_noise_circuits.append(combined_circuit) # Now we combine any error circuits containing only Kraus operations noise_ops = self._combine_kraus( zip(combined_noise_circuits, combined_noise_probabilities), self.number_of_qubits + other.number_of_qubits) return QuantumError(noise_ops) @staticmethod def _combine_kraus(noise_ops, num_qubits): """Combine any noise circuits containing only Kraus instructions.""" kraus_instr = [] kraus_probs = [] new_circuits = [] new_probs = [] # Partion circuits into Kraus and non-Kraus for circuit, prob in noise_ops: if len(circuit) == 1 and circuit[0]['name'] == 'kraus': kraus_instr.append(circuit[0]) kraus_probs.append(prob) else: new_circuits.append(circuit) new_probs.append(prob) # Combine matching Kraus instructions via Choi rep if len(kraus_probs) == 1: new_circuits.append([kraus_instr[0]]) new_probs.append(kraus_probs[0]) elif len(kraus_probs) > 1: dim = 2 ** num_qubits iden = SuperOp(np.eye(dim ** 2)) choi_sum = Choi(np.zeros((dim ** 2, dim ** 2))) for prob, instr in zip(kraus_probs, kraus_instr): choi_sum = choi_sum + prob * iden.compose(Kraus(instr['params']), instr['qubits']) # Renormalize the Choi operator to find probability # of Kraus error chan_prob = abs(np.trace(choi_sum.data) / dim) chan_instr = { "name": "kraus", "qubits": list(range(num_qubits)), "params": Kraus(choi_sum / chan_prob).data } new_circuits.append([chan_instr]) new_probs.append(chan_prob) return list(zip(new_circuits, new_probs)) @staticmethod def _check_instr(name): """Check if instruction name can be converted to standard operator""" return name in [ 'kraus', 'unitary', 'reset', 'u1', 'u2', 'u3', 'id', 'x', 'y', 'z', 'h', 's', 'sdg', 't', 'tdg', 'cx', 'cz', 'swap', 'ccx' ] @staticmethod def _instr2op(instr): """Try and convert an instruction into an operator""" # Try and convert to operator first operator = standard_instruction_operator(instr) if operator is not None: return operator # Otherwise return SuperOp or None return standard_instruction_channel(instr) @staticmethod def _tensor_instr(instr0, instr1): """Tensor of two operator qobj instructions.""" # If one of the instructions is an identity we only need # to return the other instruction if instr0['name'] == 'id': return instr1 if instr1['name'] == 'id': return instr0 # Combine qubits qubits = instr0['qubits'] + instr1['qubits'] # Convert to ops op0 = QuantumError._instr2op(instr0) op1 = QuantumError._instr2op(instr1) # Check if at least one of the instructions is a channel # and if so convert to Kraus representation. if isinstance(op0, SuperOp) or isinstance(op1, SuperOp): name = 'kraus' params = Kraus(SuperOp(op0).expand(op1)).data else: name = 'unitary' params = [op0.expand(op1).data] return {'name': name, 'qubits': qubits, 'params': params} @staticmethod def _compose_instr(instr0, instr1, num_qubits): """Helper function for compose a kraus with another instruction.""" # If one of the instructions is an identity we only need # to return the other instruction if instr0['name'] == 'id': return instr1 if instr1['name'] == 'id': return instr0 # Convert to ops op0 = QuantumError._instr2op(instr0) op1 = QuantumError._instr2op(instr1) # Check if at least one of the instructions is a channel # and if so convert both to SuperOp representation if isinstance(op0, (SuperOp, Kraus)) or isinstance(op1, (SuperOp, Kraus)): name = 'kraus' op0 = SuperOp(op0) op1 = SuperOp(op1) else: name = 'unitary' # Check qubits for compositions qubits0 = instr0['qubits'] qubits1 = instr1['qubits'] if qubits0 == qubits1: composed = op0.compose(op1) qubits = qubits0 else: # If qubits don't match we compose with total number of qubits # for the error if name == 'kraus': composed = SuperOp(np.eye(4 ** num_qubits)) else: composed = Operator(np.eye(2 ** num_qubits)) composed.compose(op0, qargs=qubits0).compose(op1, qargs=qubits1) qubits = list(range(num_qubits)) # Get instruction params if name == 'kraus': params = Kraus(composed).data else: params = [composed.data] return {'name': name, 'qubits': qubits, 'params': params} # Overloads def __matmul__(self, other): return self.compose(other) def __mul__(self, other): return self.dot(other) def __pow__(self, n): return self.power(n) def __xor__(self, other): return self.tensor(other) def __rmul__(self, other): raise NotImplementedError( "'QuantumError' does not support scalar multiplication.") def __truediv__(self, other): raise NotImplementedError("'QuantumError' does not support division.") def __add__(self, other): raise NotImplementedError("'QuantumError' does not support addition.") def __sub__(self, other): raise NotImplementedError( "'QuantumError' does not support subtraction.") def __neg__(self): raise NotImplementedError("'QuantumError' does not support negation.") qiskit-aer-0.4.1/qiskit/providers/aer/noise/errors/readout_error.py000066400000000000000000000272451362723322000255460ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Readout error class for Qiskit Aer noise model. """ import copy import numpy as np from numpy.linalg import norm from qiskit.circuit import Instruction from qiskit.quantum_info.operators.predicates import ATOL_DEFAULT, RTOL_DEFAULT from ..noiseerror import NoiseError from .errorutils import qubits_from_mat class ReadoutError: """ Readout error class for Qiskit Aer noise model. """ # pylint: disable=invalid-name ATOL = ATOL_DEFAULT RTOL = RTOL_DEFAULT MAX_TOL = 1e-4 def __init__(self, probabilities, atol=ATOL_DEFAULT): """ Create a readout error for a noise model. For an N-qubit readout error probabilities are entered as vectors: .. code-block:: python probabilities[j] = [P(0|m), P(1|m), ..., P(2 ** N - 1|m)] where ``P(j|m)`` is the probability of recording a measurement outcome of ``m`` as the value ``j``. Where ``j`` and ``m`` are integer representations of bit-strings. **Example: 1-qubit** .. code-block:: python probabilities[0] = [P("0"|"0"), P("1"|"0")] probabilities[1] = [P("0"|"1"), P("1"|"1")] **Example: 2-qubit** .. code-block:: python probabilities[0] = [P("00"|"00"), P("01"|"00"), P("10"|"00"), P("11"|"00")] probabilities[1] = [P("00"|"01"), P("01"|"01"), P("10"|"01"), P("11"|"01")] probabilities[2] = [P("00"|"10"), P("01"|"10"), P("10"|"10"), P("11"|"10")] probabilities[3] = [P("00"|"11"), P("01"|"11"), P("10"|"11"), P("11"|"11")] Args: probabilities (matrix): List of outcome assignment probabilities. atol (double): Threshold for checking probabilities are normalized (Default: 1e-8). """ self._check_probabilities(probabilities, atol) self._probabilities = np.array(probabilities, dtype=float) self._number_of_qubits = qubits_from_mat(probabilities) def __repr__(self): """Display ReadoutError.""" return "ReadoutError({})".format(self._probabilities) def __str__(self): """Print error information.""" output = "ReadoutError on {} qubits.".format(self._number_of_qubits) + \ " Assignment probabilities:" for j, vec in enumerate(self._probabilities): output += "\n P(j|{0}) = {1}".format(j, vec) return output def __eq__(self, other): """Test if two ReadoutErrors are equal.""" if not isinstance(other, ReadoutError): return False if self.number_of_qubits != other.number_of_qubits: return False return np.allclose(self._probabilities, other._probabilities, atol=self.atol, rtol=self.rtol) def copy(self): """Make a copy of current ReadoutError.""" # pylint: disable=no-value-for-parameter # The constructor of subclasses from raw data should be a copy return copy.deepcopy(self) @property def number_of_qubits(self): """Return the number of qubits for the error.""" return self._number_of_qubits @property def probabilities(self): """Return the readout error probabilities matrix.""" return self._probabilities @property def atol(self): """The absolute tolerance parameter for float comparisons.""" return self.ATOL @atol.setter def atol(self, atol): """Set the absolute tolerance parameter for float comparisons.""" max_tol = self.MAX_TOL if atol < 0: raise NoiseError("Invalid atol: must be non-negative.") if atol > max_tol: raise NoiseError( "Invalid atol: must be less than {}.".format(max_tol)) self.ATOL = atol @property def rtol(self): """The relative tolerance parameter for float comparisons.""" return self.RTOL @rtol.setter def rtol(self, rtol): """Set the relative tolerance parameter for float comparisons.""" max_tol = self.MAX_TOL if rtol < 0: raise NoiseError("Invalid rtol: must be non-negative.") if rtol > max_tol: raise NoiseError( "Invalid rtol: must be less than {}.".format(max_tol)) self.RTOL = rtol def ideal(self): """Return True if current error object is an identity""" iden = np.eye(2**self.number_of_qubits) delta = round(norm(np.array(self.probabilities) - iden), 12) if delta == 0: return True return False def to_instruction(self): """Convert the ReadoutError to a circuit Instruction.""" return Instruction("roerror", 0, self.number_of_qubits, self._probabilities) def to_dict(self): """Return the current error as a dictionary.""" error = { "type": "roerror", "operations": ["measure"], "probabilities": self._probabilities.tolist() } return error def compose(self, other, front=False): """Return the composition readout error other * self. Note that for `front=True` this is equivalent to the :meth:`ReadoutError.dot` method. Args: other (ReadoutError): a readout error. front (bool): If True return the reverse order composation self * other instead [default: False]. Returns: ReadoutError: The composition readout error. Raises: NoiseError: if other is not a ReadoutError or has incompatible dimensions. """ if front: return self._matmul(other) return self._matmul(other, left_multiply=True) def dot(self, other): """Return the composition readout error self * other. Args: other (ReadoutError): a readout error. Returns: ReadoutError: The composition readout error. Raises: NoiseError: if other is not a ReadoutError or has incompatible dimensions. """ return self._matmul(other) def power(self, n): """Return the compose of the readout error with itself n times. Args: n (int): the number of times to compose with self (n>0). Returns: ReadoutError: the n-times composition channel. Raises: NoiseError: if the power is not a positive integer. """ if not isinstance(n, int) or n < 1: raise NoiseError("Can only power with positive integer powers.") ret = self.copy() for _ in range(1, n): ret = ret.compose(self) return ret def tensor(self, other): """Return the tensor product readout error self ⊗ other. Args: other (ReadoutError): a readout error. Returns: ReadoutError: the tensor product readout error self ⊗ other. Raises: NoiseError: if other is not a ReadoutError. """ return self._tensor_product(other, reverse=False) def expand(self, other): """Return the tensor product readout error self ⊗ other. Args: other (ReadoutError): a readout error. Returns: ReadoutError: the tensor product readout error other ⊗ self. Raises: NoiseError: if other is not a ReadoutError. """ return self._tensor_product(other, reverse=True) @staticmethod def _check_probabilities(probabilities, threshold): """Check probabilities are valid.""" # probabilities parameter can be a list or a numpy.ndarray if (isinstance(probabilities, list) and not probabilities) or \ (isinstance(probabilities, np.ndarray) and probabilities.size == 0): raise NoiseError("Input probabilities: empty.") num_outcomes = len(probabilities[0]) num_qubits = int(np.log2(num_outcomes)) if 2**num_qubits != num_outcomes: raise NoiseError("Invalid probabilities: length " "{} != 2**{}".format(num_outcomes, num_qubits)) if len(probabilities) != num_outcomes: raise NoiseError("Invalid probabilities.") for vec in probabilities: arr = np.array(vec) if len(arr) != num_outcomes: raise NoiseError( "Invalid probabilities: vectors are different lengths.") if abs(sum(arr) - 1) > threshold: raise NoiseError("Invalid probabilities: sum({})= {} " "is not 1.".format(vec, sum(arr))) if arr[arr < 0].size > 0: raise NoiseError( "Invalid probabilities: {} " "contains a negative probability.".format(vec)) def _matmul(self, other, left_multiply=False): """Return the composition readout error. Args: other (ReadoutError): a readout error. left_multiply (bool): If True return other * self If False return self * other [Default:False] Returns: ReadoutError: The composition readout error. Raises: NoiseError: if other is not a ReadoutError or has incompatible dimensions. """ if not isinstance(other, ReadoutError): other = ReadoutError(other) if self.number_of_qubits != other.number_of_qubits: raise NoiseError("other must have same number of qubits.") if left_multiply: probs = np.dot(other._probabilities, self._probabilities) else: probs = np.dot(self._probabilities, other._probabilities) return ReadoutError(probs) def _tensor_product(self, other, reverse=False): """Return the tensor product readout error. Args: other (ReadoutError): a readout error. reverse (bool): If False return self ⊗ other, if True return if True return (other ⊗ self) [Default: False Returns: ReadoutError: the tensor product readout error. """ if not isinstance(other, ReadoutError): other = ReadoutError(other) if reverse: probs = np.kron(other._probabilities, self._probabilities) else: probs = np.kron(self._probabilities, other._probabilities) return ReadoutError(probs) # Overloads def __matmul__(self, other): return self.compose(other) def __mul__(self, other): return self.dot(other) def __pow__(self, n): return self.power(n) def __xor__(self, other): return self.tensor(other) def __rmul__(self, other): raise NotImplementedError( "'ReadoutError' does not support scalar multiplication.") def __truediv__(self, other): raise NotImplementedError("'ReadoutError' does not support division.") def __add__(self, other): raise NotImplementedError("'ReadoutError' does not support addition.") def __sub__(self, other): raise NotImplementedError( "'ReadoutError' does not support subtraction.") def __neg__(self): raise NotImplementedError("'ReadoutError' does not support negation.") qiskit-aer-0.4.1/qiskit/providers/aer/noise/errors/standard_errors.py000066400000000000000000000531641362723322000260650ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Standard quantum computing error channels for Qiskit Aer. """ import itertools as it import numpy as np from qiskit.quantum_info.operators.pauli import Pauli from qiskit.quantum_info.operators.channel import Choi, Kraus from qiskit.quantum_info.operators.predicates import is_unitary_matrix from qiskit.quantum_info.operators.predicates import is_identity_matrix from ..noiseerror import NoiseError from .errorutils import make_unitary_instruction from .errorutils import qubits_from_mat from .errorutils import standard_gate_unitary from .quantum_error import QuantumError def kraus_error(noise_ops, standard_gates=True, canonical_kraus=False): """ Return a Kraus quantum error channel. Args: noise_ops (list[matrix]): Kraus matrices. standard_gates (bool): Check if input matrices are standard gates. canonical_kraus (bool): Convert input Kraus matrices into the canonical Kraus representation (default: False) Returns: QuantumError: The quantum error object. Raises: NoiseError: if error parameters are invalid. """ if not isinstance(noise_ops, (list, tuple)): raise NoiseError("Invalid Kraus error input.") if not noise_ops: raise NoiseError("Kraus error noise_ops must not be empty.") kraus = Kraus(noise_ops) if canonical_kraus: # Convert to Choi and back to get canonical Kraus kraus = Kraus(Choi(kraus)) return QuantumError(kraus, standard_gates=standard_gates) def mixed_unitary_error(noise_ops, standard_gates=True): """ Return a mixed unitary quantum error channel. The input should be a list of pairs ``(U[j], p[j])``, where ``U[j]`` is a unitary matrix and ``p[j]`` is a probability. All probabilities must sum to 1 for the input ops to be valid. Args: noise_ops (list[pair[matrix, double]]): unitary error matrices. standard_gates (bool): Check if input matrices are standard gates. Returns: QuantumError: The quantum error object. Raises: NoiseError: if error parameters are invalid. """ # Error checking if not isinstance(noise_ops, (list, tuple, zip)): raise NoiseError("Input noise ops is not a list.") # Convert to numpy arrays noise_ops = [(np.array(op, dtype=complex), p) for op, p in noise_ops] if not noise_ops: raise NoiseError("Input noise list is empty.") # Check for identity unitaries prob_identity = 0. instructions = [] instructions_probs = [] num_qubits = qubits_from_mat(noise_ops[0][0]) qubits = list(range(num_qubits)) for unitary, prob in noise_ops: # Check unitary if qubits_from_mat(unitary) != num_qubits: raise NoiseError("Input matrices different size.") if not is_unitary_matrix(unitary): raise NoiseError("Input matrix is not unitary.") if is_identity_matrix(unitary): prob_identity += prob else: instr = make_unitary_instruction( unitary, qubits, standard_gates=standard_gates) instructions.append(instr) instructions_probs.append(prob) if prob_identity > 0: instructions.append([{"name": "id", "qubits": [0]}]) instructions_probs.append(prob_identity) return QuantumError(zip(instructions, instructions_probs)) def coherent_unitary_error(unitary): """ Return a coherent unitary quantum error channel. Args: unitary (matrix like): unitary error matrix. Returns: QuantumError: The quantum error object. """ return mixed_unitary_error([(unitary, 1)]) def pauli_error(noise_ops, standard_gates=True): """ Return a mixed Pauli quantum error channel. The input should be a list of pairs ``(P[j], p[j])``, where ``P[j]`` is a ``Pauli`` object or string label, and ``p[j]`` is a probability. All probabilities must sum to 1 for the input ops to be valid. Args: noise_ops (list[pair[Pauli, double]]): Pauli error terms. standard_gates (bool): if True return the operators as standard qobj Pauli gate instructions. If false return as unitary matrix qobj instructions. (Default: True) Returns: QuantumError: The quantum error object. Raises: NoiseError: If depolarizing probability is less than 0 or greater than 1. """ # Error checking if not isinstance(noise_ops, (list, tuple, zip)): raise NoiseError("Input noise ops is not a list.") noise_ops = list(noise_ops) if not noise_ops: raise NoiseError("Input noise list is empty.") num_qubits = None for pauli, _ in noise_ops: if isinstance(pauli, Pauli): pauli_str = pauli.to_label() elif isinstance(pauli, str): pauli_str = pauli else: raise NoiseError("Invalid Pauli input operator: {}".format(pauli)) if num_qubits is None: num_qubits = len(pauli_str) elif num_qubits != len(pauli_str): raise NoiseError("Pauli's are not all of the same length.") # Compute Paulis as single matrix if standard_gates is False: return _pauli_error_unitary(noise_ops, num_qubits) # Compute as qobj Pauli gate instructions return _pauli_error_standard(noise_ops, num_qubits) def _pauli_error_unitary(noise_ops, num_qubits): """Return Pauli error as unitary qobj instructions.""" def single_pauli(pauli): if pauli == 'I': return standard_gate_unitary('id') if pauli == 'X': return standard_gate_unitary('x') if pauli == 'Y': return standard_gate_unitary('y') if pauli == 'Z': return standard_gate_unitary('z') raise NoiseError("Invalid Pauli string.") prob_identity = 0.0 pauli_circs = [] pauli_probs = [] for pauli, prob in noise_ops: if prob > 0: # Pauli strings go from qubit-0 on left to qubit-N on right # but pauli ops are tensor product of qubit-N on left to qubit-0 on right # We also drop identity operators to reduce dimension of matrix multiplication mat = np.identity(1) qubits = [] if isinstance(pauli, Pauli): pauli_str = pauli.to_label() else: pauli_str = pauli for qubit, pstr in enumerate(reversed(pauli_str)): if pstr in ['X', 'Y', 'Z']: mat = np.kron(single_pauli(pstr), mat) qubits.append(qubit) elif pstr != 'I': raise NoiseError("Invalid Pauli string.") if mat.size == 1: prob_identity += prob else: circ = make_unitary_instruction( mat, qubits, standard_gates=False) pauli_circs.append(circ) pauli_probs.append(prob) if prob_identity > 0: pauli_probs.append(prob_identity) pauli_circs.append([{"name": "id", "qubits": [0]}]) error = QuantumError( zip(pauli_circs, pauli_probs), number_of_qubits=num_qubits) return error def _pauli_error_standard(noise_ops, num_qubits): """Return Pauli error as standard Pauli gate qobj instructions.""" def single_pauli(pauli): if pauli == 'I': return {'name': 'id'} if pauli == 'X': return {'name': 'x'} if pauli == 'Y': return {'name': 'y'} if pauli == 'Z': return {'name': 'z'} raise NoiseError("Invalid Pauli string.") prob_identity = 0.0 pauli_circuits = [] pauli_probs = [] for pauli, prob in noise_ops: if prob > 0: # Pauli strings go from qubit-0 on left to qubit-N on right # but pauli ops are tensor product of qubit-N on left to qubit-0 on right # We also drop identity operators to reduce dimension of matrix multiplication circuit = [] if isinstance(pauli, Pauli): pauli_str = pauli.to_label() else: pauli_str = pauli for qubit, pstr in enumerate(reversed(pauli_str)): if pstr in ['X', 'Y', 'Z']: instruction = single_pauli(pstr) instruction["qubits"] = [qubit] circuit.append(instruction) elif pstr != 'I': raise NoiseError("Invalid Pauli string.") if circuit == []: prob_identity += prob else: pauli_circuits.append(circuit) pauli_probs.append(prob) if prob_identity > 0: pauli_circuits.append([{"name": "id", "qubits": [0]}]) pauli_probs.append(prob_identity) error = QuantumError( zip(pauli_circuits, pauli_probs), number_of_qubits=num_qubits) return error def depolarizing_error(param, num_qubits, standard_gates=True): r""" Return a depolarizing quantum error channel. The depolarizing channel is defined as: .. math:: E(ρ) = (1 - λ) ρ + λ \text{Tr}[ρ] \frac{I}{2^n} with :math:`0 \le λ \le 4^n / (4^n - 1)` where :math:`λ` is the depolarizing error param and :math`n` is the number of qubits. * If :math:`λ = 0` this is the identity channel :math:`E(ρ) = ρ` * If :math:`λ = 1` this is a completely depolarizing channel :math:`E(ρ) = I / 2^n` * If :math:`λ = 4^n / (4^n - 1)` this is a uniform Pauli error channel: :math:`E(ρ) = \sum_j P_j ρ P_j / (4^n - 1)` for all :math:`P_j != I`. Args: param (double): depolarizing error parameter. num_qubits (int): the number of qubits for the error channel. standard_gates (bool): if True return the operators as standard qobj Pauli gate instructions. If false return as unitary matrix qobj instructions. (Default: True) Returns: QuantumError: The quantum error object. Raises: NoiseError: If noise parameters are invalid. """ if not isinstance(num_qubits, int) or num_qubits < 1: raise NoiseError("num_qubits must be a positive integer.") # Check that the depolarizing parameter gives a valid CPTP num_terms = 4**num_qubits max_param = num_terms / (num_terms - 1) if param < 0 or param > max_param: raise NoiseError("Depolarizing parameter must be in between 0 " "and {}.".format(max_param)) # Rescale completely depolarizing channel error probs # with the identity component removed prob_iden = 1 - param / max_param prob_pauli = param / num_terms probs = [prob_iden] + (num_terms - 1) * [prob_pauli] # Generate pauli strings. The order doesn't matter as long # as the all identity string is first. paulis = [ "".join(tup) for tup in it.product(['I', 'X', 'Y', 'Z'], repeat=num_qubits) ] return pauli_error(zip(paulis, probs), standard_gates=standard_gates) def reset_error(prob0, prob1=0): r""" Return a single qubit reset quantum error channel. The error channel returned is given by the map .. math:: E(ρ) = (1 - p_0 - p_1) ρ + \text{Tr}[ρ] \left( p_0 |0 \rangle\langle 0| + p_1 |1 \rangle\langle 1| \right) where the probability of no reset is given by :math:`1 - p_0 - p_1`. Args: prob0 (double): reset probability to :math:`|0\rangle`. prob1 (double): reset probability to :math:`|1\rangle`. Returns: QuantumError: the quantum error object. Raises: NoiseError: If noise parameters are invalid. """ if prob0 < 0 or prob1 < 0 or prob0 > 1 or prob1 > 1: raise NoiseError("Invalid reset probabilities.") noise_ops = [ ([{ 'name': 'id', 'qubits': [0] }], 1 - prob0 - prob1), ([{ 'name': 'reset', 'qubits': [0] }], prob0), ([{ 'name': 'reset', 'qubits': [0] }, { 'name': 'x', 'qubits': [0] }], prob1), ] return QuantumError(noise_ops) # pylint: disable=invalid-name def thermal_relaxation_error(t1, t2, time, excited_state_population=0): r""" Return a single-qubit thermal relaxation quantum error channel. Args: t1 (double): the :math:`T_1` relaxation time constant. t2 (double): the :math:`T_2` relaxation time constant. time (double): the gate time for relaxation error. excited_state_population (double): the population of :math:`|1\rangle` state at equilibrium (default: 0). Returns: QuantumError: a quantum error object for a noise model. Raises: NoiseError: If noise parameters are invalid. Additional information: * For parameters to be valid :math:`T_1` and :math:`T_2` must satisfy :math:`T_2 \le 2 T_1`. * If :math:`T_2 \le T_1` the error can be expressed as a mixed reset and unitary error channel. * If :math:`T_1 < T_2 \le 2 T_1` the error must be expressed as a general non-unitary Kraus error channel. """ if excited_state_population < 0: raise NoiseError("Invalid excited state population " "({} < 0).".format(excited_state_population)) if excited_state_population > 1: raise NoiseError("Invalid excited state population " "({} > 1).".format(excited_state_population)) if time < 0: raise NoiseError("Invalid gate_time ({} < 0)".format(time)) if t1 <= 0: raise NoiseError("Invalid T_1 relaxation time parameter: T_1 <= 0.") if t2 <= 0: raise NoiseError("Invalid T_2 relaxation time parameter: T_2 <= 0.") if t2 - 2 * t1 > 0: raise NoiseError( "Invalid T_2 relaxation time parameter: T_2 greater than 2 * T_1.") # T1 relaxation rate if t1 == np.inf: rate1 = 0 p_reset = 0 else: rate1 = 1 / t1 p_reset = 1 - np.exp(-time * rate1) # T2 dephasing rate if t2 == np.inf: rate2 = 0 exp_t2 = 1 else: rate2 = 1 / t2 exp_t2 = np.exp(-time * rate2) # Qubit state equilibrium probabilities p0 = 1 - excited_state_population p1 = excited_state_population if t2 > t1: # If T_2 > T_1 we must express this as a Kraus channel # We start with the Choi-matrix representation: chan = Choi( np.array([[1 - p1 * p_reset, 0, 0, exp_t2], [0, p1 * p_reset, 0, 0], [0, 0, p0 * p_reset, 0], [exp_t2, 0, 0, 1 - p0 * p_reset]])) return QuantumError(Kraus(chan)) else: # If T_2 < T_1 we can express this channel as a probabilistic # mixture of reset operations and unitary errors: circuits = [[{ 'name': 'id', 'qubits': [0] }], [{ 'name': 'z', 'qubits': [0] }], [{ 'name': 'reset', 'qubits': [0] }], [{ 'name': 'reset', 'qubits': [0] }, { 'name': 'x', 'qubits': [0] }]] # Probability p_reset0 = p_reset * p0 p_reset1 = p_reset * p1 p_z = (1 - p_reset) * (1 - np.exp(-time * (rate2 - rate1))) / 2 p_identity = 1 - p_z - p_reset0 - p_reset1 probabilities = [p_identity, p_z, p_reset0, p_reset1] return QuantumError(zip(circuits, probabilities)) def phase_amplitude_damping_error(param_amp, param_phase, excited_state_population=0, canonical_kraus=True): r""" Return a single-qubit combined phase and amplitude damping quantum error channel. The single-qubit combined phase and amplitude damping channel is described by the following Kraus matrices: .. code-block:: python A0 = sqrt(1 - p1) * [[1, 0], [0, sqrt(1 - a - b)]] A1 = sqrt(1 - p1) * [[0, sqrt(a)], [0, 0]] A2 = sqrt(1 - p1) * [[0, 0], [0, sqrt(b)]] B0 = sqrt(p1) * [[sqrt(1 - a - b), 0], [0, 1]] B1 = sqrt(p1) * [[0, 0], [sqrt(a), 0]] B2 = sqrt(p1) * [[sqrt(b), 0], [0, 0]] where ``a = param_amp``, ``b = param_phase``, and ``p1 = excited_state_population``. The equilibrium state after infinitely many applications of the channel is: .. code-block:: python rho_eq = [[1 - p1, 0]], [0, p1]] Args: param_amp (double): the amplitude damping error parameter. param_phase (double): the phase damping error parameter. excited_state_population (double): the population of :math:`|1\rangle` state at equilibrium (default: 0). canonical_kraus (bool): Convert input Kraus matrices into the canonical Kraus representation (default: True) Returns: QuantumError: a quantum error object for a noise model. Raises: NoiseError: If noise parameters are invalid. """ if param_amp < 0: raise NoiseError("Invalid amplitude damping to |0> parameter " "({} < 0)".format(param_amp)) if param_phase < 0: raise NoiseError("Invalid phase damping parameter " "({} < 0)".format(param_phase)) if param_phase + param_amp > 1: raise NoiseError("Invalid amplitude and phase damping parameters " "({} + {} > 1)".format(param_phase, param_amp)) if excited_state_population < 0: raise NoiseError("Invalid excited state population " "({} < 0).".format(excited_state_population)) if excited_state_population > 1: raise NoiseError("Invalid excited state population " "({} > 1).".format(excited_state_population)) c0 = np.sqrt(1 - excited_state_population) c1 = np.sqrt(excited_state_population) param = 1 - param_amp - param_phase # Damping ops to 0 state A0 = c0 * np.array([[1, 0], [0, np.sqrt(param)]], dtype=complex) A1 = c0 * np.array([[0, np.sqrt(param_amp)], [0, 0]], dtype=complex) A2 = c0 * np.array([[0, 0], [0, np.sqrt(param_phase)]], dtype=complex) # Damping ops to 1 state B0 = c1 * np.array([[np.sqrt(param), 0], [0, 1]], dtype=complex) B1 = c1 * np.array([[0, 0], [np.sqrt(param_amp), 0]], dtype=complex) B2 = c1 * np.array([[np.sqrt(param_phase), 0], [0, 0]], dtype=complex) # Select non-zero ops noise_ops = [ a for a in [A0, A1, A2, B0, B1, B2] if np.linalg.norm(a) > 1e-10 ] return kraus_error(noise_ops, canonical_kraus=canonical_kraus) def amplitude_damping_error(param_amp, excited_state_population=0, canonical_kraus=True): r""" Return a single-qubit generalized amplitude damping quantum error channel. The single-qubit amplitude damping channel is described by the following Kraus matrices: .. code-block:: python A0 = sqrt(1 - p1) * [[1, 0], [0, sqrt(1 - a)]] A1 = sqrt(1 - p1) * [[0, sqrt(a)], [0, 0]] B0 = sqrt(p1) * [[sqrt(1 - a), 0], [0, 1]] B1 = sqrt(p1) * [[0, 0], [sqrt(a), 0]] where ``a = param_amp``, ``p1 = excited_state_population``. The equilibrium state after infinitely many applications of the channel is: .. code-block:: python rho_eq = [[1 - p1, 0]], [0, p1]] Args: param_amp (double): the amplitude damping parameter. excited_state_population (double): the population of :math:`|0\rangle` state at equilibrium (default: 0). canonical_kraus (bool): Convert input Kraus matrices into the canonical Kraus representation (default: True) Returns: QuantumError: a quantum error object for a noise model. """ return phase_amplitude_damping_error( param_amp, 0, excited_state_population=excited_state_population, canonical_kraus=canonical_kraus) def phase_damping_error(param_phase, canonical_kraus=True): r""" Return a single-qubit combined phase and amplitude damping quantum error channel. The single-qubit combined phase and amplitude damping channel is described by the following Kraus matrices: .. code-block:: python A0 = [[1, 0], [0, sqrt(1 - b)]] A2 = [[0, 0], [0, sqrt(b)]] where ``b = param_phase``. The equilibrium state after infinitely many applications of the channel is: .. code-block:: python rho_eq = [[rho_init[0, 0], 0]], [0, rho_init[1, 1]]] where ``rho_init`` is the input state ρ. Args: param_phase (double): the phase damping parameter. canonical_kraus (bool): Convert input Kraus matrices into the canonical Kraus representation (default: True) Returns: QuantumError: a quantum error object for a noise model. """ return phase_amplitude_damping_error( 0, param_phase, excited_state_population=0, canonical_kraus=canonical_kraus) qiskit-aer-0.4.1/qiskit/providers/aer/noise/noise_model.py000066400000000000000000001202201362723322000236360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Noise model class for Qiskit Aer simulators. """ import json import logging from qiskit.circuit import Instruction from qiskit.providers import BaseBackend from qiskit.providers.models import BackendProperties from qiskit.providers.aer.backends.aerbackend import AerJSONEncoder from qiskit.providers.aer.backends.qasm_simulator import QasmSimulator from .noiseerror import NoiseError from .errors.quantum_error import QuantumError from .errors.readout_error import ReadoutError from .device.models import basic_device_gate_errors from .device.models import basic_device_readout_errors logger = logging.getLogger(__name__) class NoiseModel: """Noise model class for Qiskit Aer simulators. This class is used to represent noise model for the :class:`~qiskit.providers.aer.QasmSimulator`. It can be used to construct custom noise models for simulator, or to automatically generate a basic device noise model for an IBMQ backend. See the :mod:`~qiskit.providers.aer.noise` module documentation for additional information. **Example: Basic device noise model** An approximate :class:`NoiseModel` can be generated automatically from the properties of real device backends from the IBMQ provider using the :meth:`~NoiseModel.from_backend` method. .. code-block:: python from qiskit import IBMQ, Aer from qiskit.providers.aer.noise import NoiseModel provider = IBMQ.load_account() backend = provider.get_backend('ibmq_vigo') noise_model = NoiseModel.from_backend(backend) print(noise_model) **Example: Custom noise model** Custom noise models can be used by adding :class:`QuantumError` to circuit gate, reset or measure instructions, and :class:`ReadoutError` to measure instructions. .. code-block:: python import qiskit.providers.aer.noise as noise # Error probabilities prob_1 = 0.001 # 1-qubit gate prob_2 = 0.01 # 2-qubit gate # Depolarizing quantum errors error_1 = noise.depolarizing_error(prob_1, 1) error_2 = noise.depolarizing_error(prob_2, 2) # Add errors to noise model noise_model = noise.NoiseModel() noise_model.add_all_qubit_quantum_error(error_1, ['u1', 'u2', 'u3']) noise_model.add_all_qubit_quantum_error(error_2, ['cx']) print(noise_model) """ # Get the default basis gates for the Qiskit Aer Qasm Simulator # this is used to decide what are instructions for a noise model # and what are labels for other named instructions _QASMSIMULATOR_BASIS_GATES = QasmSimulator.DEFAULT_CONFIGURATION[ 'basis_gates'] # Checks for standard 1-3 qubit instructions _1qubit_instructions = set([ "x90", "u1", "u2", "u3", "U", "id", "x", "y", "z", "h", "s", "sdg", "t", "tdg" ]) _2qubit_instructions = set(["CX", "cx", "cz", "cu1", "cu2", "cu3", "swap"]) _3qubit_instructions = set(["ccx", "cswap"]) def __init__(self, basis_gates=None): """Initialize an empty noise model. Args: basis_gates (list[str] or None): Specify an initial basis_gates for the noise model. If None a default value of ['id', 'u3', 'cx'] is used (Default: None). Additional Information: Errors added to the noise model will have their instruction appended to the noise model basis_gates if the instruction is in the :class:`~qiskit.providers.aer.QasmSimulator` basis_gates. If the instruction is not in the :class:`~qiskit.providers.aer.QasmSimulator` basis_gates it is assumed to be a label for a standard gate, and that gate should be added to the `NoiseModel` basis_gates either using the init method, or the :meth:`add_basis_gates` method. """ if basis_gates is None: # Default basis gates is id, u3, cx so that all standard # non-identity instructions can be unrolled to u3, cx, # and identities won't be unrolled to u3. self._basis_gates = set(['id', 'u3', 'cx']) else: self._basis_gates = set( name for name, _ in self._instruction_names_labels(basis_gates)) # Store gates with a noise model defined self._noise_instructions = set() # Store qubits referenced in noise model. # These include gate qubits in local quantum and readout errors, # and both gate and noise qubits for non-local quantum errors. self._noise_qubits = set() # Default (all-qubit) quantum errors are stored as: # dict(str: QuantumError) # where they keys are the instruction str label self._default_quantum_errors = {} # Local quantum errors are stored as: # dict(str: dict(str: QuantumError)) # where the outer keys are the instruction str label and the # inner dict keys are the gate qubits self._local_quantum_errors = {} # Non-local quantum errors are stored as: # dict(str: dict(str: dict(str: QuantumError))) # where the outer keys are the instruction str label, the middle dict # keys are the gate qubits, and the inner most dict keys are # the noise qubits. self._nonlocal_quantum_errors = {} # Default (all-qubit) readout error is stored as a single # ReadoutError object since there may only be one defined. self._default_readout_error = None # Local readout errors are stored as: # dict(str: ReadoutError) # where the dict keys are the gate qubits. self._local_readout_errors = {} self._x90_gates = [] @property def basis_gates(self): """Return basis_gates for compiling to the noise model.""" # Convert noise instructions to basis_gates string return sorted(self._basis_gates) @property def noise_instructions(self): """Return the set of noisy instructions for this noise model.""" return sorted(self._noise_instructions) @property def noise_qubits(self): """Return the set of noisy qubits for this noise model.""" return sorted(self._noise_qubits) @classmethod def from_backend(cls, backend, gate_error=True, readout_error=True, thermal_relaxation=True, temperature=0, gate_lengths=None, standard_gates=True): """Return a noise model derived from a devices backend properties. This function generates a noise model based on: * 1 and 2 qubit gate errors consisting of a :func:`depolarizing_error` followed by a :func:`thermal_relaxation_error`. * Single qubit :class:`ReadoutError` on all measurements. The Error error parameters are tuned for each individual qubit based on the :math:`T_1`, :math:`T_2`, frequency and readout error parameters for each qubit, and the gate error and gate time parameters for each gate obtained from the device backend properties. **Additional Information** The noise model includes the following errors: * If ``readout_error=True`` include single qubit readout errors on measurements. * If ``gate_error=True`` and ``thermal_relaxation=True`` include: * Single-qubit gate errors consisting of a :func:`depolarizing_error` followed by a :func:`thermal_relaxation_error` for the qubit the gate acts on. * Two-qubit gate errors consisting of a 2-qubit :func:`depolarizing_error` followed by single qubit :func:`thermal_relaxation_error` on each qubit participating in the gate. * If ``gate_error=True`` is ``True`` and ``thermal_relaxation=False``: * An N-qubit :func:`depolarizing_error` on each N-qubit gate. * If ``gate_error=False`` and ``thermal_relaxation=True`` include single-qubit :func:`thermal_relaxation_errors` on each qubits participating in a multi-qubit gate. For best practice in simulating a backend make sure that the circuit is compiled using the set of basis gates in the noise module by setting ``basis_gates=noise_model.basis_gates`` and using the device coupling map with ``coupling_map=backend.configuration().coupling_map`` **Specifying custom gate times** The ``gate_lengths`` kwarg can be used to specify custom gate times to add gate errors using the :math:`T_1` and :math:`T_2` values from the backend properties. This should be passed as a list of tuples ``gate_lengths=[(name, value), ...]`` where ``name`` is the gate name string, and ``value`` is the gate time in nanoseconds. If a custom gate is specified that already exists in the backend properties, the ``gate_lengths`` value will override the gate time value from the backend properties. If non-default values are used gate_lengths should be a list Args: backend (Backend or BackendProperties): backend properties. gate_error (bool): Include depolarizing gate errors (Default: True). readout_error (Bool): Include readout errors in model (Default: True). thermal_relaxation (Bool): Include thermal relaxation errors (Default: True). temperature (double): qubit temperature in milli-Kelvin (mK) for thermal relaxation errors (Default: 0). gate_lengths (list): Custom gate times for thermal relaxation errors. Used to extend or override the gate times in the backend properties (Default: None)) standard_gates (bool): If true return errors as standard qobj gates. If false return as unitary qobj instructions (Default: True) Returns: NoiseModel: An approximate noise model for the device backend. Raises: NoiseError: If the input backend is not valid. """ if isinstance(backend, BaseBackend): properties = backend.properties() if not properties: raise NoiseError('Qiskit backend {} does not have a ' 'BackendProperties'.format(backend)) elif isinstance(backend, BackendProperties): properties = backend else: raise NoiseError('{} is not a Qiskit backend or' ' BackendProperties'.format(backend)) noise_model = NoiseModel() # Add single-qubit readout errors if readout_error: for qubits, error in basic_device_readout_errors(properties): noise_model.add_readout_error(error, qubits) # Add gate errors gate_errors = basic_device_gate_errors( properties, gate_error=gate_error, thermal_relaxation=thermal_relaxation, gate_lengths=gate_lengths, temperature=temperature, standard_gates=standard_gates) for name, qubits, error in gate_errors: noise_model.add_quantum_error(error, name, qubits) return noise_model def __repr__(self): """Display noise model""" # Get default errors default_error_ops = [] for inst in self._default_quantum_errors: default_error_ops.append('{}'.format(inst)) if self._default_readout_error is not None: if 'measure' not in default_error_ops: default_error_ops.append('measure') # Get local errors local_error_ops = [] for inst, dic in self._local_quantum_errors.items(): for q_str in dic.keys(): local_error_ops.append((inst, self._str2qubits(q_str))) for q_str in self._local_readout_errors: tmp = ('measure', self._str2qubits(q_str)) if tmp not in local_error_ops: local_error_ops.append(tmp) # Get nonlocal errors nonlocal_error_ops = [] for inst, dic in self._nonlocal_quantum_errors.items(): for q_str, errors in dic.items(): for nq_str in errors: nonlocal_error_ops.append((inst, self._str2qubits(q_str), self._str2qubits(nq_str))) output = "NoiseModel:" if default_error_ops == [] and local_error_ops == [] and nonlocal_error_ops == []: output += " Ideal" else: output += "\n Basis gates: {}".format(self.basis_gates) if self._noise_instructions: output += "\n Instructions with noise: {}".format( list(self._noise_instructions)) if self._noise_qubits: output += "\n Qubits with noise: {}".format( list(self._noise_qubits)) if self._x90_gates: output += "\n X-90 based single qubit gates: {}".format( list(self._x90_gates)) if default_error_ops != []: output += "\n All-qubits errors: {}".format(default_error_ops) if local_error_ops != []: output += "\n Specific qubit errors: {}".format( local_error_ops) if nonlocal_error_ops != []: output += "\n Non-local specific qubit errors: {}".format( nonlocal_error_ops) return output def __eq__(self, other): """Test if two noise models are equal.""" # This returns True if both noise models have: # the same basis_gates # the same noise_qubits # the same noise_instructions if (not isinstance(other, NoiseModel) or self.basis_gates != other.basis_gates or self.noise_qubits != other.noise_qubits or self.noise_instructions != other.noise_instructions): return False # Check default readout errors is equal if not self._readout_errors_equal(other): return False # Check quantum errors equal if not self._all_qubit_quantum_errors_equal(other): return False if not self._local_quantum_errors_equal(other): return False if not self._nonlocal_quantum_errors_equal(other): return False # If we made it here they are equal return True def reset(self): """Reset the noise model.""" self.__init__() def add_basis_gates(self, instructions, warnings=True): """Add additional gates to the noise model basis_gates. This should be used to add any gates that are identified by a custom gate label in the noise model. Args: instructions (list[str] or list[Instruction]): the instructions error applies to. warnings (bool): display warning if instruction is not in QasmSimulator basis_gates (Default: True). """ for name, _ in self._instruction_names_labels(instructions): # If the instruction is in the default basis gates for the # QasmSimulator we add it to the basis gates. if name in self._QASMSIMULATOR_BASIS_GATES: if name not in ['measure', 'reset']: self._basis_gates.add(name) elif warnings: logger.warning( "Warning: Adding a gate \"%s\" to basis_gates which is " "not in QasmSimulator basis_gates.", name) def set_x90_single_qubit_gates(self, instructions): """ Declares X90 based gates for noise model. Args: instructions (list[str] or list[Instruction]): the instructions error applies to. Raises: NoiseError: if the input instructions are not valid. """ for name, label in self._instruction_names_labels(instructions): # Add X-90 based gate to noisy gates self._noise_instructions.add(label) self._basis_gates.add(name) self._x90_gates = instructions def add_all_qubit_quantum_error(self, error, instructions, warnings=True): """ Add a quantum error to the noise model that applies to all qubits. Args: error (QuantumError): the quantum error object. instructions (str or list[str] or Instruction or list[Instruction]): the instructions error applies to. warnings (bool): Display warning if appending to an instruction that already has an error (Default: True). Raises: NoiseError: if the input parameters are invalid. Additional Information: If the error object is ideal it will not be added to the model. """ # Format input as QuantumError if not isinstance(error, QuantumError): try: error = QuantumError(error) except NoiseError: raise NoiseError("Input is not a valid quantum error.") # Check if error is ideal and if so don't add to the noise model if error.ideal(): return # Add instructions for name, label in self._instruction_names_labels(instructions): self._check_number_of_qubits(error, name) if label in self._default_quantum_errors: new_error = self._default_quantum_errors[label].compose(error) self._default_quantum_errors[label] = new_error if warnings: logger.warning( "WARNING: all-qubit error already exists for " "instruction \"%s\", " "composing with additional error.", label) else: self._default_quantum_errors[label] = error # Check if a specific qubit error has been applied for this instruction if label in self._local_quantum_errors: local_qubits = self._keys2str( self._local_quantum_errors[label].keys()) if warnings: logger.warning( "WARNING: all-qubit error for instruction " "\"%s\" will not apply to qubits: " "%s as specific error already exists.", label, local_qubits) self._noise_instructions.add(label) self.add_basis_gates(name, warnings=False) def add_quantum_error(self, error, instructions, qubits, warnings=True): """ Add a quantum error to the noise model. Args: error (QuantumError): the quantum error object. instructions (str or list[str] or Instruction or list[Instruction]): the instructions error applies to. qubits (list[int]): qubits instruction error applies to. warnings (bool): Display warning if appending to an instruction that already has an error (Default: True). Raises: NoiseError: if the input parameters are invalid. Additional Information: If the error object is ideal it will not be added to the model. """ if not isinstance(qubits, (list, tuple)): raise NoiseError("Qubits must be a list of integers.") # Error checking if not isinstance(error, QuantumError): try: error = QuantumError(error) except NoiseError: raise NoiseError("Input is not a valid quantum error.") # Check if error is ideal and if so don't add to the noise model if error.ideal(): return # Add noise qubits for qubit in qubits: self._noise_qubits.add(qubit) # Add instructions for name, label in self._instruction_names_labels(instructions): self._check_number_of_qubits(error, name) if not isinstance(label, str): raise NoiseError("Qobj invalid instructions.") # Check number of qubits is correct for standard instructions self._check_number_of_qubits(error, name) if label in self._local_quantum_errors: qubit_dict = self._local_quantum_errors[label] else: qubit_dict = {} # Convert qubits list to hashable string qubits_str = self._qubits2str(qubits) if error.number_of_qubits != len(qubits): raise NoiseError("Number of qubits ({}) does not match " " the error size ({})".format( len(qubits), error.number_of_qubits)) if qubits_str in qubit_dict: new_error = qubit_dict[qubits_str].compose(error) qubit_dict[qubits_str] = new_error if warnings: logger.warning( "WARNING: quantum error already exists for " "instruction \"%s\" on qubits %s " ", appending additional error.", label, qubits) else: qubit_dict[qubits_str] = error # Add updated dictionary self._local_quantum_errors[label] = qubit_dict # Check if all-qubit error is already defined for this instruction if label in self._default_quantum_errors: if warnings: logger.warning( "WARNING: Specific error for instruction \"%s\" " "on qubits %s overrides previously defined " "all-qubit error for these qubits.", label, qubits) self._noise_instructions.add(label) self.add_basis_gates(name, warnings=False) def add_nonlocal_quantum_error(self, error, instructions, qubits, noise_qubits, warnings=True): """ Add a non-local quantum error to the noise model. Args: error (QuantumError): the quantum error object. instructions (str or list[str] or Instruction or list[Instruction]): the instructions error applies to. qubits (list[int]): qubits instruction error applies to. noise_qubits (list[int]): Specify the exact qubits the error should be applied to if different to the instruction qubits. warnings (bool): Display warning if appending to an instruction that already has an error (Default: True). Raises: NoiseError: if the input parameters are invalid. Additional Information: If the error object is ideal it will not be added to the model. """ if not isinstance(noise_qubits, (list, tuple)): raise NoiseError("Noise qubits must be a list of integers.") # Error checking if not isinstance(error, QuantumError): try: error = QuantumError(error) except NoiseError: raise NoiseError("Input is not a valid quantum error.") if not isinstance(qubits, (list, tuple)): raise NoiseError("Qubits must be a list of integers.") # Check if error is ideal and if so don't add to the noise model if error.ideal(): return # Add noise qubits for qubit in qubits: self._noise_qubits.add(qubit) for qubit in noise_qubits: self._noise_qubits.add(qubit) # Add instructions for name, label in self._instruction_names_labels(instructions): if label in self._nonlocal_quantum_errors: gate_qubit_dict = self._nonlocal_quantum_errors[label] else: gate_qubit_dict = {} qs_str = self._qubits2str(qubits) nqs_str = self._qubits2str(noise_qubits) if qs_str in gate_qubit_dict: noise_qubit_dict = gate_qubit_dict[qs_str] if nqs_str in noise_qubit_dict: new_error = noise_qubit_dict[nqs_str].compose(error) noise_qubit_dict[nqs_str] = new_error else: noise_qubit_dict[nqs_str] = error gate_qubit_dict[qs_str] = noise_qubit_dict if warnings: logger.warning( "Warning: nonlocal error already exists for " "instruction \"%s\" on qubits %s." "Composing additional error.", label, qubits) else: gate_qubit_dict[qs_str] = {nqs_str: error} # Add updated dictionary self._nonlocal_quantum_errors[label] = gate_qubit_dict self._noise_instructions.add(label) self.add_basis_gates(name, warnings=False) def add_all_qubit_readout_error(self, error, warnings=True): """ Add a single-qubit readout error that applies measure on all qubits. Args: error (ReadoutError): the quantum error object. warnings (bool): Display warning if appending to an instruction that already has an error (Default: True) Raises: NoiseError: if the input parameters are invalid. Additional Information: If the error object is ideal it will not be added to the model. """ # Error checking if not isinstance(error, ReadoutError): try: error = ReadoutError(error) except NoiseError: raise NoiseError("Input is not a valid readout error.") # Check if error is ideal and if so don't add to the noise model if error.ideal(): return # Check number of qubits is correct for standard instructions if error.number_of_qubits != 1: raise NoiseError( "All-qubit readout errors must defined as single-qubit errors." ) if self._default_readout_error is not None: if warnings: logger.warning( "WARNING: all-qubit readout error already exists, " "overriding with new readout error.") self._default_readout_error = error # Check if a specific qubit error has been applied for this instruction if self._local_readout_errors: local_qubits = self._keys2str(self._local_readout_errors.keys()) if warnings: logger.warning( "WARNING: The all-qubit readout error will not " "apply to measure of qubits qubits: %s " "as specific readout errors already exist.", local_qubits) self._noise_instructions.add("measure") def add_readout_error(self, error, qubits, warnings=True): """ Add a readout error to the noise model. Args: error (ReadoutError): the quantum error object. qubits (list[int]): qubits instruction error applies to. warnings (bool): Display warning if appending to an instruction that already has an error [Default: True] Raises: NoiseError: if the input parameters are invalid. Additional Information: If the error object is ideal it will not be added to the model. """ # Error checking if not isinstance(error, ReadoutError): try: error = ReadoutError(error) except NoiseError: raise NoiseError("Input is not a valid readout error.") if not isinstance(qubits, (list, tuple)): raise NoiseError("Qubits must be a list of integers.") # Check if error is ideal and if so don't add to the noise model if error.ideal(): return # Add noise qubits for qubit in qubits: self._noise_qubits.add(qubit) # Convert qubits list to hashable string qubits_str = self._qubits2str(qubits) # Check error matches qubit size if error.number_of_qubits != len(qubits): raise NoiseError( "Number of qubits ({}) does not match the readout " "error size ({})".format(len(qubits), error.number_of_qubits)) # Check if we are overriding a previous error if qubits_str in self._local_readout_errors: if warnings: logger.warning( "WARNING: readout error already exists for qubits " "%s, overriding with new readout error.", qubits) self._local_readout_errors[qubits_str] = error # Check if all-qubit readout error is already defined if self._default_readout_error is not None: if warnings: logger.warning( "WARNING: Specific readout error on qubits " "%s overrides previously defined " "all-qubit readout error for these qubits.", qubits) self._noise_instructions.add("measure") def to_dict(self, serializable=False): """ Return the noise model as a dictionary. Args: serializable (bool): if `True`, return a dict containing only types that can be serializable by the stdlib `json` module. Returns: dict: a dictionary for a noise model. """ error_list = [] # Add default quantum errors for name, error in self._default_quantum_errors.items(): error_dict = error.to_dict() error_dict["operations"] = [name] error_list.append(error_dict) # Add specific qubit errors for name, qubit_dict in self._local_quantum_errors.items(): for qubits_str, error in qubit_dict.items(): error_dict = error.to_dict() error_dict["operations"] = [name] error_dict["gate_qubits"] = [self._str2qubits(qubits_str)] error_list.append(error_dict) # Add non-local errors for name, qubit_dict in self._nonlocal_quantum_errors.items(): for qubits_str, noise_qubit_dict in qubit_dict.items(): for noise_qubits_str, error in noise_qubit_dict.items(): error_dict = error.to_dict() error_dict["operations"] = [name] error_dict["gate_qubits"] = [self._str2qubits(qubits_str)] error_dict["noise_qubits"] = [ self._str2qubits(noise_qubits_str) ] error_list.append(error_dict) # Add default readout error if self._default_readout_error is not None: error_dict = self._default_readout_error.to_dict() error_list.append(error_dict) # Add local readout error for qubits_str, error in self._local_readout_errors.items(): error_dict = error.to_dict() error_dict["gate_qubits"] = [self._str2qubits(qubits_str)] error_list.append(error_dict) ret = {"errors": error_list, "x90_gates": self._x90_gates} if serializable: ret = json.loads(json.dumps(ret, cls=AerJSONEncoder)) return ret @staticmethod def from_dict(noise_dict): """ Load NoiseModel from a dictionary. Args: noise_dict (dict): A serialized noise model. Returns: NoiseModel: the noise model. Raises: NoiseError: if dict cannot be converted to NoiseModel. """ # Return noise model noise_model = NoiseModel() # Set X90 gates noise_model.set_x90_single_qubit_gates(noise_dict.get('x90_gates', [])) # Get error terms errors = noise_dict.get('errors', []) for error in errors: error_type = error['type'] # Add QuantumError if error_type == 'qerror': noise_ops = tuple( zip(error['instructions'], error['probabilities'])) instruction_names = error['operations'] all_gate_qubits = error.get('gate_qubits', None) all_noise_qubits = error.get('noise_qubits', None) qerror = QuantumError(noise_ops) if all_gate_qubits is not None: for gate_qubits in all_gate_qubits: # Load non-local quantum error if all_noise_qubits is not None: for noise_qubits in all_noise_qubits: noise_model.add_nonlocal_quantum_error( qerror, instruction_names, gate_qubits, noise_qubits, warnings=False) # Add local quantum error else: noise_model.add_quantum_error( qerror, instruction_names, gate_qubits, warnings=False) else: # Add all-qubit quantum error noise_model.add_all_qubit_quantum_error( qerror, instruction_names, warnings=False) # Add ReadoutError elif error_type == 'roerror': probabilities = error['probabilities'] all_gate_qubits = error.get('gate_qubits', None) roerror = ReadoutError(probabilities) # Add local readout error if all_gate_qubits is not None: for gate_qubits in all_gate_qubits: noise_model.add_readout_error( roerror, gate_qubits, warnings=False) # Add all-qubit readout error else: noise_model.add_all_qubit_readout_error( roerror, warnings=False) # Invalid error type else: raise NoiseError("Invalid error type: {}".format(error_type)) return noise_model def _instruction_names_labels(self, instructions): """Return two lists of instruction name strings and label strings.""" if not isinstance(instructions, (list, tuple)): instructions = [instructions] names_labels = [] for inst in instructions: # If instruction does not have a label we use the name # as the label if isinstance(inst, Instruction): name = inst.name label = getattr(inst, 'label', inst.name) names_labels.append((name, label)) elif isinstance(inst, str): names_labels.append((inst, inst)) else: raise NoiseError('Invalid instruction type {}'.format(inst)) return names_labels def _check_number_of_qubits(self, error, name): """ Check if error is corrected number of qubits for standard instruction. Args: error (QuantumError): the quantum error object. name (str): qobj instruction name to apply error to. Raises: NoiseError: If instruction and error qubit number do not match. """ def error_message(gate_qubits): msg = "{} qubit QuantumError".format(error.number_of_qubits) + \ " cannot be applied to {} qubit".format(gate_qubits) + \ " instruction \"{}\".".format(name) return msg if name in self._1qubit_instructions and error.number_of_qubits != 1: raise NoiseError(error_message(1)) if name in self._2qubit_instructions and error.number_of_qubits != 2: raise NoiseError(error_message(2)) if name in self._3qubit_instructions and error.number_of_qubits != 3: raise NoiseError(error_message(3)) def _qubits2str(self, qubits): """Convert qubits list to comma seperated qubits string.""" return ",".join([str(q) for q in qubits]) def _str2qubits(self, qubits_str): """Convert qubits string to qubits list.""" return [int(q) for q in qubits_str.split(',')] def _keys2str(self, keys): """Convert dicitonary keys to comma seperated print string.""" tmp = "".join(["{}, ".format(self._str2qubits(key)) for key in keys]) return tmp[:-2] def _readout_errors_equal(self, other): """Check two noise models have equal readout errors""" # Check default readout error is equal if self._default_readout_error != other._default_readout_error: return False # Check local readout errors are equal if sorted(self._local_readout_errors.keys()) != sorted( other._local_readout_errors.keys()): return False for key in self._local_readout_errors: if self._local_readout_errors[key] != other._local_readout_errors[ key]: return False return True def _all_qubit_quantum_errors_equal(self, other): """Check two noise models have equal local quantum errors""" if sorted(self._default_quantum_errors.keys()) != sorted( other._default_quantum_errors.keys()): return False for key in self._default_quantum_errors: if self._default_quantum_errors[ key] != other._default_quantum_errors[key]: return False return True def _local_quantum_errors_equal(self, other): """Check two noise models have equal local quantum errors""" if sorted(self._local_quantum_errors.keys()) != sorted( other._local_quantum_errors.keys()): return False for key in self._local_quantum_errors: inner_dict1 = self._local_quantum_errors[key] inner_dict2 = other._local_quantum_errors[key] if sorted(inner_dict1.keys()) != sorted(inner_dict2.keys()): return False for inner_key in inner_dict1: if inner_dict1[inner_key] != inner_dict2[inner_key]: return False if self._local_quantum_errors[key] != other._local_quantum_errors[ key]: return False return True def _nonlocal_quantum_errors_equal(self, other): """Check two noise models have equal non-local quantum errors""" if sorted(self._nonlocal_quantum_errors.keys()) != sorted( other._nonlocal_quantum_errors.keys()): return False for key in self._nonlocal_quantum_errors: inner_dict1 = self._nonlocal_quantum_errors[key] inner_dict2 = other._nonlocal_quantum_errors[key] if sorted(inner_dict1.keys()) != sorted(inner_dict2.keys()): return False for inner_key in inner_dict1: iinner_dict1 = inner_dict1[inner_key] iinner_dict2 = inner_dict2[inner_key] if sorted(iinner_dict1.keys()) != sorted(iinner_dict2.keys()): return False for iinner_key in iinner_dict1: if iinner_dict1[iinner_key] != iinner_dict2[iinner_key]: return False return True qiskit-aer-0.4.1/qiskit/providers/aer/noise/noiseerror.py000066400000000000000000000016241362723322000235360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Exception for errors raised by Qiskit Aer noise module. """ from qiskit import QiskitError class NoiseError(QiskitError): """Class for errors raised in qiskit_aer.noise package.""" def __init__(self, *message): """Set the error message.""" super().__init__(*message) self.message = ' '.join(message) def __str__(self): """Return the message.""" return repr(self.message) qiskit-aer-0.4.1/qiskit/providers/aer/noise/utils/000077500000000000000000000000001362723322000221325ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/noise/utils/__init__.py000066400000000000000000000203531362723322000242460ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ The functions here have been moved to `qiskit.providers.aer.utils`. """ import warnings as warn # DEPRECATED: these functions have been moved from ...utils import remap_noise_model as _remap_noise_model from ...utils import NoiseTransformer as _NoiseTransformer from ...utils import approximate_quantum_error as _approximate_quantum_error from ...utils import approximate_noise_model as _approximate_noise_model from ...utils import insert_noise as _insert_noise def remap_noise_model(noise_model, remapping, discard_qubits=False, warnings=True): """Remap qubits in a noise model. This remaps the specified gate qubits for local quantum errors, the gate and noise qubits for non-local quantum errors, and the gate qubits for local ReadoutErrors. All-qubit quantum and readout errors are unaffected. Args: noise_model (NoiseModel): a noise model to remap qubits. remapping (list): list or remappings of old qubit to new qubit. See Additional Information. discard_qubits (bool): if True discard qubits not in remapping keys, if False an identity mapping wil be assumed for unnamed qubits (Default: False). warnings (bool): display warnings if qubits being remapped are not in the input noise model (Default: True). Returns: NoiseModel: a new noise model with the same errors but remapped gate and noise qubits for local and non-local errors. Raises: NoiseError: if remapping has duplicate qubits in the remapped qubits. Additional Information: * The remapping map be specified as either a list of pairs: ``[(old, new), ...]``, or a list of old qubits where the new qubit is inferred from the position: ``[old0, old1, ...]`` is treated as ``[(old0, 0), (old1, 1), ...]``. * If ``discard_qubits`` is ``False``, any qubits in the noise model not specified in the list of old qubits will be added to the remapping as a trivial mapping ``(qubit, qubit)``. """ warn.warn( 'This function is been moved to `qiskit.providers.aer.utils.remap_noise_model`.' ' Importing it from `qiskit.providers.aer.noise.utils` will be' ' removed in a future release.', DeprecationWarning) return _remap_noise_model(noise_model, remapping, discard_qubits=discard_qubits, warnings=warnings) def insert_noise(circuits, noise_model, transpile=False): """Return a noisy version of a QuantumCircuit. Args: circuits (QuantumCircuit or list[QuantumCircuit]): Input noise-free circuits. noise_model (NoiseModel): The noise model containing the errors to add transpile (Boolean): Should the circuit be transpiled into the noise model basis gates Returns: QuantumCircuit: The new circuit with the Kraus noise instructions inserted. Additional Information: The noisy circuit return by this function will consist of the original circuit with ``Kraus`` instructions inserted after all instructions referenced in the ``noise_model``. The resulting circuit cannot be ran on a quantum computer but can be executed on the :class:`~qiskit.providers.aer.QasmSimulator`. """ warn.warn( 'This function is been moved to `qiskit.providers.aer.utils.insert_noise`.' ' Importing it from `qiskit.providers.aer.noise.utils` will be' ' removed in a future release.', DeprecationWarning) return _insert_noise(circuits, noise_model, transpile=transpile) def approximate_quantum_error(error, *, operator_string=None, operator_dict=None, operator_list=None): """ Return an approximate QuantumError bases on the Hilbert-Schmidt metric. Currently this is only implemented for 1-qubit QuantumErrors. Args: error (QuantumError): the error to be approximated. operator_string (string or None): a name for a pre-made set of building blocks for the output channel (Default: None). operator_dict (dict or None): a dictionary whose values are the building blocks for the output channel (Default: None). operator_list (dict or None): list of building blocks for the output channel (Default: None). Returns: QuantumError: the approximate quantum error. Raises: NoiseError: if number of qubits is not supported or approximation failed. RuntimeError: If there's no information about the noise type. Additional Information: The operator input precedence is: ``list`` < ``dict`` < ``str``. If a string is given, dict is overwritten; if a dict is given, list is overwritten. Oossible values for string are ``'pauli'``, ``'reset'``, ``'clifford'``. For further information see :meth:`NoiseTransformer.named_operators`. """ warn.warn( 'This function is been moved to `qiskit.providers.aer.utils.approximate_qauntum_error`.' ' Importing it from `qiskit.providers.aer.noise.utils` will be removed' ' in a future release.', DeprecationWarning) return _approximate_quantum_error(error, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) def approximate_noise_model(model, *, operator_string=None, operator_dict=None, operator_list=None): """ Return an approximate noise model. Args: model (NoiseModel): the noise model to be approximated. operator_string (string or None): a name for a pre-made set of building blocks for the output channel (Default: None). operator_dict (dict or None): a dictionary whose values are the building blocks for the output channel (Default: None). operator_list (dict or None): list of building blocks for the output channel (Default: None). Returns: NoiseModel: the approximate noise model. Raises: NoiseError: if number of qubits is not supported or approximation failed. Additional Information: The operator input precedence is: ``list`` < ``dict`` < ``str``. If a string is given, dict is overwritten; if a dict is given, list is overwritten. Oossible values for string are ``'pauli'``, ``'reset'``, ``'clifford'``. For further information see :meth:`NoiseTransformer.named_operators`. """ warn.warn( 'This function is been moved to `qiskit.providers.aer.utils.approximate_noise_model`.' ' Importing it from `qiskit.providers.aer.noise.utils` will be removed in a' ' future release.', DeprecationWarning) return _approximate_noise_model(model, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) class NoiseTransformer(_NoiseTransformer): """Transforms one quantum channel to another based on a specified criteria.""" def __init__(self): warn.warn( 'This function is been moved to `qiskit.providers.aer.utils.NoiseTransformer`.' ' Importing it from `qiskit.providers.aer.noise.utils` will be removed in a' ' future release.', DeprecationWarning) super().__init__() qiskit-aer-0.4.1/qiskit/providers/aer/pulse/000077500000000000000000000000001362723322000210055ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/__init__.py000066400000000000000000000032031362723322000231140ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ ======================================================= Pulse System Models (:mod:`qiskit.providers.aer.pulse`) ======================================================= .. currentmodule:: qiskit.providers.aer.pulse This module contains classes and functions to build a pulse system model for simulating a Qiskit pulse schedule. Classes ======= .. autosummary:: :toctree: ../stubs/ PulseSystemModel Functions ========= These functions can be used to generate a pulse system model for certain types of systems. .. autosummary:: :toctree: ../stubs/ duffing_system_model """ # pylint: disable=import-error import distutils.sysconfig # noqa import numpy as np from .qutip_lite.cy import pyxbuilder as pbldr from .duffing_model_generators import duffing_system_model from .pulse_system_model import PulseSystemModel # Remove -Wstrict-prototypes from cflags CFG_VARS = distutils.sysconfig.get_config_vars() if "CFLAGS" in CFG_VARS: CFG_VARS["CFLAGS"] = CFG_VARS["CFLAGS"].replace("-Wstrict-prototypes", "") # Setup pyximport # pylint: disable=no-member pbldr.install(setup_args={'include_dirs': [np.get_include()]}) del pbldr qiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/000077500000000000000000000000001362723322000214205ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/CMakeLists.txt000066400000000000000000000010711362723322000241570ustar00rootroot00000000000000# Cython OP extensions include(Linter) include(cython_utils) # We need to remove the -static flag, because Python Extension system only supports # dynamic linked libraries, but we want to build a shared libraries with the least # dependencies we can, so some of these dependencies are linked statically into our # shared library. string(REPLACE " -static " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") set(CYTHON_INSTALL_DIR "qiskit/providers/aer/pulse/cy/") add_cython_module(channel_value) add_cython_module(measure) add_cython_module(memory) add_cython_module(utils) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/__init__.py000066400000000000000000000007741362723322000235410ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. qiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/channel_value.pxd000066400000000000000000000016671362723322000247530ustar00rootroot00000000000000# -*- coding: utf-8 -*- #!python #cython: language_level = 3 #distutils: language = c++ # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. cdef complex chan_value(double t, unsigned int chan_num, double freq_ch, double[::1] chan_pulse_times, complex[::1] pulse_array, unsigned int[::1] pulse_ints, double[::1] fc_array, unsigned char[::1] register) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/channel_value.pyx000066400000000000000000000076541362723322000250020ustar00rootroot00000000000000# -*- coding: utf-8 -*- #!python #cython: language_level = 3 #distutils: language = c++ # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. cimport cython cimport cython from libc.math cimport floor, M_PI cdef extern from "" namespace "std" nogil: double complex exp(double complex x) @cython.cdivision(True) cdef inline int get_arr_idx(double t, double start, double stop, int len_arr): """Computes the array index value for sampling a pulse in pulse_array. Args: t (double): The current simulation time. start (double): Start time of pulse in question. stop (double): Stop time of pulse. len_arr (int): Length of the pulse sample array. Returns: int: The array index value. """ return floor(((t-start)/(stop-start)*len_arr)) @cython.boundscheck(False) cdef complex chan_value(double t, unsigned int chan_num, double freq_ch, double[::1] chan_pulse_times, complex[::1] pulse_array, unsigned int[::1] pulse_ints, double[::1] fc_array, unsigned char[::1] register): """Computes the value of a given channel at time `t`. Args: t (double): Current time. chan_num (int): The int that labels the channel. chan_pulse_times (int array): Array containing start_time, stop_time, pulse_int, conditional for each pulse on the channel. pulse_array (complex array): The array containing all the pulse data in the passed pulse qobj. pulse_ints (int array): Array that tells you where to start indexing pulse_array for a given pulse labeled by chan_pulse_times[4*kk+2]. current_pulse_idx (int array), freq_ch (doule) channel frequency: """ cdef size_t kk cdef double start_time, stop_time, phase=0 cdef int start_idx, stop_idx, offset_idx, temp_int, cond cdef complex out = 0 # This is because each entry has four values: # start_time, stop_time, pulse_int, conditional cdef unsigned int num_times = chan_pulse_times.shape[0] // 4 for kk in range(num_times): # the time is overlapped with the kkth pulse start_time = chan_pulse_times[4*kk] stop_time = chan_pulse_times[4*kk+1] if start_time <= t < stop_time: cond = chan_pulse_times[4*kk+3] if cond < 0 or register[cond]: temp_int = chan_pulse_times[4*kk+2] start_idx = pulse_ints[temp_int] stop_idx = pulse_ints[temp_int+1] offset_idx = get_arr_idx(t, start_time, stop_time, stop_idx-start_idx) out = pulse_array[start_idx+offset_idx] break # Compute the frame change up to time t if out != 0: num_times = fc_array.shape[0] // 3 for kk in range(num_times): if t >= fc_array[3*kk]: do_fc = 1 # Check if FC is conditioned on register if fc_array[3*kk+2] >= 0: # If condition not satisfied no do FC if not register[fc_array[3*kk+2]]: do_fc = 0 if do_fc: # Update the frame change value phase += fc_array[3*kk+1] else: break if phase != 0: out *= exp(1j*phase) out *= exp(-1j*2*M_PI*freq_ch*t) return out qiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/measure.pyx000066400000000000000000000043401362723322000236240ustar00rootroot00000000000000# -*- coding: utf-8 -*- #!python #cython: language_level = 3 #distutils: language = c++ # -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. cimport cython import numpy as np cimport numpy as np from qiskit.providers.aer.pulse.qutip_lite.cy.spmatfuncs import cy_expect_psi_csr @cython.boundscheck(False) def occ_probabilities(unsigned int[::1] qubits, complex[::1] state, list meas_ops): """Computes the occupation probabilities of the specifed qubits for the given state. Args: qubits (int array): Ints labelling which qubits are to be measured. """ cdef unsigned int num_qubits = qubits.shape[0] cdef np.ndarray[double, ndim=1, mode="c"] probs = np.zeros(qubits.shape[0], dtype=float) cdef size_t kk cdef object oper for kk in range(num_qubits): oper = meas_ops[qubits[kk]] probs[kk] = cy_expect_psi_csr(oper.data.data, oper.data.indices, oper.data.indptr, state, 1) return probs @cython.boundscheck(False) def write_shots_memory(unsigned char[:, ::1] mem, unsigned int[::1] mem_slots, double[::1] probs, double[::1] rand_vals): """Converts probabilities back into shots Args: mem mem_slots probs: expectation value rand_vals: random values used to convert back into shots """ cdef unsigned int nrows = mem.shape[0] cdef unsigned int nprobs = probs.shape[0] cdef size_t ii, jj cdef unsigned char temp for ii in range(nrows): for jj in range(nprobs): temp = (probs[jj] > rand_vals[nprobs*ii+jj]) if temp: mem[ii,mem_slots[jj]] = tempqiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/memory.pyx000066400000000000000000000030251362723322000234720ustar00rootroot00000000000000# -*- coding: utf-8 -*- #!python #cython: language_level = 3 #distutils: language = c++ # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. cimport cython @cython.boundscheck(False) def write_memory(unsigned char[:, ::1] mem, unsigned int[::1] memory_slots, double[::1] probs, double[::1] rand_vals): """Writes the results of measurements to memory in place. Args: mem (int8 array): 2D array of memory of size (shots*memory_slots). memory_slots (uint32 array): Array of ints for memory_slots to write too. probs (double array): Probability of being in excited state for each qubit in `qubits`. rand_vals (double array): Random values of len = len(qubits)*shots """ cdef unsigned int nrows = mem.shape[0] cdef unsigned int nprobs = probs.shape[0] cdef size_t ii, jj cdef unsigned char temp for ii in range(nrows): for jj in range(nprobs): temp = (probs[jj] > rand_vals[nprobs*ii+jj]) if temp: mem[ii,memory_slots[jj]] = tempqiskit-aer-0.4.1/qiskit/providers/aer/pulse/cy/utils.pyx000066400000000000000000000027231362723322000233260ustar00rootroot00000000000000# -*- coding: utf-8 -*- #!python #cython: language_level = 3 #distutils: language = c++ # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. cimport cython @cython.boundscheck(False) @cython.wraparound(False) def oplist_to_array(list A, complex[::1] B, int start_idx=0): """Takes a list of complex numbers represented by a list of pairs of floats, and inserts them into a complex NumPy array at a given starting index. Parameters: A (list): A nested-list of [re, im] pairs. B(ndarray): Array for storing complex numbers from list A. start_idx (int): The starting index at which to insert elements. Notes: This is ~5x faster than doing it in Python. """ cdef size_t kk cdef unsigned int lenA = len(A) cdef list temp if (start_idx+lenA) > B.shape[0]: raise Exception('Input list does not fit into array if start_idx is {}.'.format(start_idx)) for kk in range(lenA): temp = A[kk] B[start_idx+kk] = temp[0]+1j*temp[1]qiskit-aer-0.4.1/qiskit/providers/aer/pulse/duffing_model_generators.py000066400000000000000000000462331362723322000264220ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name "Helper functions for creating HamiltonianModel and PulseSystemModel objects" from warnings import warn from collections.abc import Iterable from .hamiltonian_model import HamiltonianModel from .pulse_system_model import PulseSystemModel def duffing_system_model(dim_oscillators, oscillator_freqs, anharm_freqs, drive_strengths, coupling_dict, dt): r"""Returns a :class:`PulseSystemModel` representing a physical model for a collection of Duffing oscillators. In the model, each individual oscillator is specified by the parameters: * Frequency: :math:`\nu`, specified in the list ``oscillator_freqs`` * Anharmonicity: :math:`\alpha`, specified in the list ``anharm_freqs``, and * Drive strength: :math:`r`, specified in the list ``drive_strengths``. For each oscillator, the above parameters enter into the Hamiltonian via the terms: .. math:: \pi(2 \nu - \alpha)a^\dagger a + \pi \alpha (a^\dagger a)^2 + 2 \pi r D(t) (a + a^\dagger), where :math:`a^\dagger` and :math:`a` are, respectively, the creation and annihilation operators for the oscillator, and :math:`D(t)` is the drive signal for the oscillator. Each coupling term between a pair of oscillators is specified by: * Oscillator pair: :math:`(i,k)`, and * Coupling strength: :math:`j`, which are passed in the argument ``coupling_dict``, which is a ``dict`` with keys being the ``tuple`` ``(i,k)``, and values the strength ``j``. Specifying a coupling results in the Hamiltonian term: .. math:: 2 \pi j (a_i^\dagger a_k + a_i a_k^\dagger). Finally, the returned :class:`PulseSystemModel` is setup for performing cross-resonance drives between coupled qubits. The index for the :class:`ControlChannel` corresponding to a particular cross-resonance drive channel is retreived by calling :meth:`PulseSystemModel.control_channel_index` with the tuple ``(drive_idx, target_idx)``, where ``drive_idx`` is the index of the oscillator being driven, and ``target_idx`` is the target oscillator (see example below). Note: In this model, all frequencies are in frequency units (as opposed to radial). **Example** Constructing a three Duffing Oscillator :class:``PulseSystemModel``. .. code-block:: python # cutoff dimensions dim_oscillators = 3 # single oscillator drift parameters oscillator_freqs = [5.0e9, 5.1e9, 5.2e9] anharm_freqs = [-0.33e9, -0.33e9, -0.33e9] # drive strengths drive_strengths = [0.02e9, 0.02e9, 0.02e9] # specify coupling as a dictionary; here the qubit pair (0,1) is coupled with # strength 0.002e9, and the qubit pair (1,2) is coupled with strength 0.001e9 coupling_dict = {(0,1): 0.002e9, (1,2): 0.001e9} # time dt = 1e-9 # create the model three_qubit_model = duffing_system_model(dim_oscillators=dim_oscillators, oscillator_freqs=oscillator_freqs, anharm_freqs=anharm_freqs, drive_strengths=drive_strengths, coupling_dict=coupling_dict, dt=dt) In the above model, qubit pairs (0,1) and (1,2) are coupled. To perform a cross-resonance drive on qubit 1 with target 0, use the :class:`ControlChannel` with index: .. code-block:: python three_qubit_model.control_channel_index((1,0)) Args: dim_oscillators (int): Dimension of truncation for each oscillator. oscillator_freqs (list): Oscillator frequencies in frequency units. anharm_freqs (list): Anharmonicity values in frequency units. drive_strengths (list): Drive strength values in frequency units. coupling_dict (dict): Coupling graph with keys being edges, and values the coupling strengths in frequency units. dt (float): Sample width for pulse instructions. Returns: PulseSystemModel: The generated Duffing system model """ # set symbols for string generation freq_symbol = 'v' anharm_symbol = 'alpha' drive_symbol = 'r' coupling_symbol = 'j' coupling_edges = coupling_dict.keys() # construct coupling graph, and raise warning if coupling_edges contains duplicate edges coupling_graph = CouplingGraph(coupling_edges) if len(coupling_graph.graph) < len(coupling_edges): warn('Warning: The coupling_dict contains diplicate edges, and the second appearance of \ the same edge will be ignored.') # construct the HamiltonianModel num_oscillators = len(oscillator_freqs) oscillators = list(range(num_oscillators)) oscillator_dims = [dim_oscillators] * num_oscillators freq_symbols = _str_list_generator(freq_symbol + '{0}', oscillators) anharm_symbols = _str_list_generator(anharm_symbol + '{0}', oscillators) drive_symbols = _str_list_generator(drive_symbol + '{0}', oscillators) sorted_coupling_edges = coupling_graph.sorted_graph # populate coupling strengths in sorted order (vertex indices are now also sorted within edges, # so this needs to be accounted for when retrieving weights from coupling_dict) coupling_strengths = [coupling_dict.get(edge) or coupling_dict.get((edge[1], edge[0])) for edge in sorted_coupling_edges] coupling_symbols = _str_list_generator(coupling_symbol + '{0}{1}', *zip(*sorted_coupling_edges)) cr_idx_dict = coupling_graph.two_way_graph_dict hamiltonian_dict = _duffing_hamiltonian_dict(oscillators=oscillators, oscillator_dims=oscillator_dims, oscillator_freqs=oscillator_freqs, freq_symbols=freq_symbols, anharm_freqs=anharm_freqs, anharm_symbols=anharm_symbols, drive_strengths=drive_strengths, drive_symbols=drive_symbols, ordered_coupling_edges=sorted_coupling_edges, coupling_strengths=coupling_strengths, coupling_symbols=coupling_symbols, cr_idx_dict=cr_idx_dict) hamiltonian_model = HamiltonianModel.from_dict(hamiltonian_dict) # construct the u_channel_lo list u_channel_lo = _cr_lo_list(cr_idx_dict) # construct and return the PulseSystemModel return PulseSystemModel(hamiltonian=hamiltonian_model, u_channel_lo=u_channel_lo, control_channel_labels=coupling_graph.sorted_two_way_graph, subsystem_list=oscillators, dt=dt) # Helper functions for creating pieces necessary to construct oscillator system models def _duffing_hamiltonian_dict(oscillators, oscillator_dims, oscillator_freqs, freq_symbols, anharm_freqs, anharm_symbols, drive_strengths, drive_symbols, ordered_coupling_edges, coupling_strengths, coupling_symbols, cr_idx_dict): """Creates a hamiltonian string dict for a duffing oscillator model Note, this function makes the following assumptions: - oscillators, oscillator_dims, oscillator_freqs, freq_symbols, anharm_freqs, anharm_symbols, drive_strengths, and drive_symbols are all lists of the same length (i.e. the total oscillator number) - ordered_coupling_edges, coupling_strengths, and coupling_symbols are lists of the same length Args: oscillators (list): ints for oscillator labels oscillator_dims (list): ints for oscillator dimensions oscillator_freqs (list): oscillator frequencies freq_symbols (list): symbols to be used for oscillator frequencies anharm_freqs (list): anharmonicity values anharm_symbols (list): symbols to be used for anharmonicity terms drive_strengths (list): drive strength coefficients drive_symbols (list): symbols for drive coefficients ordered_coupling_edges (list): tuples of two ints specifying oscillator couplings. Order corresponds to order of coupling_strengths and coupling_symbols coupling_strengths (list): strength of each coupling term (corresponds to ordering of ordered_coupling_edges) coupling_symbols (list): symbols for coupling coefficients cr_idx_dict (dict): A dict with keys given by tuples containing two ints, and value an int, representing cross resonance drive channels. E.g. an entry {(0,1) : 1} specifies a CR drive on oscillator 0 with oscillator 1 as target, with u_channel index 1. Returns: dict: hamiltonian string format """ # single oscillator terms hamiltonian_str = _single_duffing_drift_terms(freq_symbols, anharm_symbols, oscillators) hamiltonian_str += _drive_terms(drive_symbols, oscillators) # exchange terms if len(ordered_coupling_edges) > 0: hamiltonian_str += _exchange_coupling_terms(coupling_symbols, ordered_coupling_edges) # cr terms if len(cr_idx_dict) > 0: driven_system_indices = [key[0] for key in cr_idx_dict.keys()] cr_drive_symbols = [drive_symbols[idx] for idx in driven_system_indices] cr_channel_idx = cr_idx_dict.values() hamiltonian_str += _cr_terms(cr_drive_symbols, driven_system_indices, cr_channel_idx) # construct vars dictionary var_dict = {} for idx in oscillators: var_dict[freq_symbols[idx]] = oscillator_freqs[idx] var_dict[anharm_symbols[idx]] = anharm_freqs[idx] var_dict[drive_symbols[idx]] = drive_strengths[idx] if len(coupling_symbols) > 0: for symbol, strength in zip(coupling_symbols, coupling_strengths): var_dict[symbol] = strength dim_dict = {str(oscillator): dim for oscillator, dim in zip(oscillators, oscillator_dims)} return {'h_str': hamiltonian_str, 'vars': var_dict, 'qub': dim_dict} def _cr_lo_list(cr_idx_dict): """Generates u_channel_lo list for a PulseSystemModel from a cr_idx_dict. Args: cr_idx_dict (dict): A dictionary with keys given by tuples of ints with int values. A key, e.g. (0,1), signifies CR drive on system 0 with target 1, and the value is the u channel index corresponding to that drive. Note: this function assumes that cr_idx_dict.values() == range(len(cr_idx_dict)). Returns: list: u_channel_lo format required by the simulator """ # populate list of u channel lo for cr gates lo_list = [0] * len(cr_idx_dict) for system_pair, u_idx in cr_idx_dict.items(): lo_list[u_idx] = [{'scale': [1.0, 0.0], 'q': system_pair[1]}] return lo_list # Functions for creating Hamiltonian strings for various types of terms def _single_duffing_drift_terms(freq_symbols, anharm_symbols, system_list): """Harmonic and anharmonic drift terms Args: freq_symbols (list): coefficients for harmonic part anharm_symbols (list): coefficients for anharmonic part system_list (list): list of system indices Returns: list: drift term strings """ harm_terms = _str_list_generator('np.pi*(2*{0}-{1})*O{2}', freq_symbols, anharm_symbols, system_list) anharm_terms = _str_list_generator('np.pi*{0}*O{1}*O{1}', anharm_symbols, system_list) return harm_terms + anharm_terms def _drive_terms(drive_symbols, system_list): """Drive terms for single oscillator Args: drive_symbols (list): coefficients of drive terms system_list (list): list of system indices Returns: list: drive term strings """ return _str_list_generator('2*np.pi*{0}*X{1}||D{1}', drive_symbols, system_list) def _exchange_coupling_terms(coupling_symbols, ordered_edges): """Exchange coupling terms between systems Args: coupling_symbols (list): coefficients of exchange couplings ordered_edges (list): list tuples of system indices for the couplings Returns: list: exchange coupling strings """ idx1_list, idx2_list = zip(*list(ordered_edges)) return _str_list_generator('2*np.pi*{0}*(Sp{1}*Sm{2}+Sm{1}*Sp{2})', coupling_symbols, idx1_list, idx2_list) def _cr_terms(drive_symbols, driven_system_indices, u_channel_indices): """Cross resonance drive terms Args: drive_symbols (list): coefficients for drive terms driven_system_indices (list): list of indices for systems that drive is applied to u_channel_indices (list): indicies for the u_channels corresponding to each term Returns: list: cr term strings """ return _str_list_generator('2*np.pi*{0}*X{1}||U{2}', drive_symbols, driven_system_indices, u_channel_indices) def _str_list_generator(str_template, *args): """Given a string template, returns a list where each entry is the template formatted by the zip of args. It is assumed that either args is a tuple of lists each of the same length, or is a tuple with each entry beign either an str or int. E.g. 1. _str_list_generator('First: {0}, Second: {1}', 'a0', 'b0') returns ['First: a0, Second: b0'] 2. _str_list_generator('First: {0}, Second: {1}', ['a0', 'a1'], ['b0', 'b1']) returns ['First: a0, Second: b0', 'First: a1, Second: b1'] Args: str_template (str): string template args (tuple): assumed to be either tuple of iterables of the same length, or a tuple with entries that are either type str or int Returns: list: list of str_template formated by args lists """ args = [_arg_to_iterable(arg) for arg in args] return [str_template.format(*zipped_arg) for zipped_arg in zip(*args)] def _arg_to_iterable(arg): """Check if arg is an iterable, if not put it into a list. The purpose is to allow arguments of functions to be either lists or singletons, e.g. instead of having to pass ['a'], 'a' can be passed directly. Args: arg (Iterable): argument to be checked and turned into an interable if necessary Returns: Iterable: either arg, or arg transformed into a list """ # catch expected types (issue is str is iterable) if isinstance(arg, (int, str)): return [arg] if isinstance(arg, Iterable): return arg return [arg] # Helper classes class CouplingGraph: """ Helper class containing functionality for representing coupling graphs, with the main goal to construct different representations for different purposes: - self.graph: graph as a set of edges stored as frozen sets, e.g. {frozenset({0,1}), frozenset({1,2}), frozenset({2,3})} - self.sorted_graph: graph as a list of tuples in lexicographic order, e.g. [(0,1), (1,2), (2,3)] Note: these are actively ordered by the object, as the point is to have a canonical ordering of edges. The integers in the tuples are also ordered. - self.sorted_two_way_graph: list of tuples where each edge is repeated with the vertices reversed. The ordering is the same as in sorted_graph, with the duplicate appearing immediately after the original, e.g. [(0,1), (1,0), (1,2), (2,1), (2,3), (3,2)] - self.two_way_graph_dict: same as above, but in dict form, e.g. {(0,1) : 0, (1,0) : 1, (1,2) : 2, (2,1) : 3, (2,3) : 4, (3,2) : 5} """ def __init__(self, edges): """returns CouplingGraph object Args: edges (Iterable): An iterable of iterables, where the inner interables are assumed to contain two elements, e.g. [(0,1), (2,3)], or ((0,1), (2,3)) Returns: CouplingGraph: coupling graph specified by edges """ # create the set representation of the graph self.graph = {frozenset({idx1, idx2}) for idx1, idx2 in edges} # created the sorted list representation graph_list = [] for edge in self.graph: edge_list = list(edge) edge_list.sort() graph_list.append(tuple(edge_list)) graph_list.sort() self.sorted_graph = graph_list # create the sorted_two_way_graph two_way_graph_list = [] for edge in self.sorted_graph: two_way_graph_list.append(edge) two_way_graph_list.append((edge[1], edge[0])) self.sorted_two_way_graph = two_way_graph_list # create the dictionary version self.two_way_graph_dict = {self.sorted_two_way_graph[k]: k for k in range(len(self.sorted_two_way_graph))} def sorted_edge_index(self, edge): """Given an edge, returns the index in self.sorted_graph. Order in edge does not matter. Args: edge (Iterable): an iterable containing two integers Returns: int: index of edge """ edge_list = list(edge) edge_list.sort() return self.sorted_graph.index(tuple(edge_list)) def two_way_edge_index(self, directed_edge): """Given a directed edge, returns the index in self.sorted_two_way_graph Args: directed_edge (Iterable): an iterable containing two integers Returns: int: index of directed_edge """ return self.two_way_graph_dict[tuple(directed_edge)] qiskit-aer-0.4.1/qiskit/providers/aer/pulse/hamiltonian_model.py000066400000000000000000000264421362723322000250520ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=eval-used, exec-used, invalid-name, missing-return-type-doc "HamiltonianModel class for system specification for the PulseSimulator" from collections import OrderedDict import numpy as np import numpy.linalg as la from .qobj.opparse import HamiltonianParser from ..aererror import AerError class HamiltonianModel(): """Hamiltonian model for pulse simulator.""" def __init__(self, system=None, variables=None, subsystem_dims=None): """Initialize a Hamiltonian model. Args: system (list): List of Qobj objects representing operator form of the Hamiltonian. variables (OrderedDict): Ordered dict for parameter values in Hamiltonian. subsystem_dims (dict): dict of subsystem dimensions. Raises: ValueError: if arguments are invalid. """ # Initialize internal variables # The system Hamiltonian in numerical format self._system = system # System variables self._variables = variables # Channels in the Hamiltonian string # Qubit subspace dimensinos self._subsystem_dims = subsystem_dims or {} # The rest are computed from the previous # These tell the order in which the channels are evaluated in # the RHS solver. self._channels = None # Diagonal elements of the hamiltonian self._h_diag = None # Eigenvalues of the time-independent hamiltonian self._evals = None # Eigenstates of the time-indepedent hamiltonian self._estates = None # populate self._channels self._calculate_hamiltonian_channels() # populate self._h_diag, self._evals, self._estates self._compute_drift_data() @classmethod def from_dict(cls, hamiltonian, subsystem_list=None): """Initialize from a Hamiltonian string specification. Args: hamiltonian (dict): dictionary representing Hamiltonian in string specification. subsystem_list (list or None): List of subsystems to extract from the hamiltonian. Returns: HamiltonianModel: instantiated from hamiltonian dictionary Raises: ValueError: if arguments are invalid. """ _hamiltonian_parse_exceptions(hamiltonian) # get variables variables = OrderedDict(hamiltonian['vars']) # Get qubit subspace dimensions if 'qub' in hamiltonian: if subsystem_list is None: subsystem_list = [int(qubit) for qubit in hamiltonian['qub']] subsystem_dims = { int(key): val for key, val in hamiltonian['qub'].items() } else: subsystem_dims = {} # Get oscillator subspace dimensions if 'osc' in hamiltonian: oscillator_dims = { int(key): val for key, val in hamiltonian['osc'].items() } else: oscillator_dims = {} # Parse the Hamiltonian system = HamiltonianParser(h_str=hamiltonian['h_str'], dim_osc=oscillator_dims, dim_qub=subsystem_dims) system.parse(subsystem_list) system = system.compiled return cls(system, variables, subsystem_dims) def get_qubit_lo_from_drift(self): """ Computes a list of qubit frequencies corresponding to the exact energy gap between the ground and first excited states of each qubit. Returns: qubit_lo_freq (list): the list of frequencies """ qubit_lo_freq = [0] * len(self._subsystem_dims) # compute difference between first excited state of each qubit and # the ground energy min_eval = np.min(self._evals) for q_idx in range(len(self._subsystem_dims)): single_excite = _first_excited_state(q_idx, self._subsystem_dims) dressed_eval = _eval_for_max_espace_overlap( single_excite, self._evals, self._estates) qubit_lo_freq[q_idx] = (dressed_eval - min_eval) / (2 * np.pi) return qubit_lo_freq def _calculate_hamiltonian_channels(self): """ Get all the qubit channels D_i and U_i in the string representation of a system Hamiltonian. Raises: Exception: Missing index on channel. """ channels = [] for _, ham_str in self._system: chan_idx = [ i for i, letter in enumerate(ham_str) if letter in ['D', 'U'] ] for ch in chan_idx: if (ch + 1) == len(ham_str) or not ham_str[ch + 1].isdigit(): raise Exception('Channel name must include' + 'an integer labeling the qubit.') for kk in chan_idx: done = False offset = 0 while not done: offset += 1 if not ham_str[kk + offset].isdigit(): done = True # In case we hit the end of the string elif (kk + offset + 1) == len(ham_str): done = True offset += 1 temp_chan = ham_str[kk:kk + offset] if temp_chan not in channels: channels.append(temp_chan) channels.sort(key=lambda x: (int(x[1:]), x[0])) channel_dict = OrderedDict() for idx, val in enumerate(channels): channel_dict[val] = idx self._channels = channel_dict def _compute_drift_data(self): """Calculate the the drift Hamiltonian. This computes the dressed frequencies and eigenstates of the diagonal part of the Hamiltonian. Raises: Exception: Missing index on channel. """ # Get the diagonal elements of the hamiltonian with all the # drive terms set to zero for chan in self._channels: exec('%s=0' % chan) # might be a better solution to replace the 'var' in the hamiltonian # string with 'op_system.vars[var]' for var in self._variables: exec('%s=%f' % (var, self._variables[var])) ham_full = np.zeros(np.shape(self._system[0][0].full()), dtype=complex) for ham_part in self._system: ham_full += ham_part[0].full() * eval(ham_part[1]) # Remap eigenvalues and eigenstates evals, estates = la.eigh(ham_full) evals_mapped = np.zeros(evals.shape, dtype=evals.dtype) estates_mapped = np.zeros(estates.shape, dtype=estates.dtype) # order the eigenvalues and eigenstates according to overlap with computational basis pos_list = [] min_overlap = 1 for i, estate in enumerate(estates.T): # make a copy and set entries with indices in pos_list to 0 estate_copy = estate.copy() estate_copy[pos_list] = 0 pos = np.argmax(np.abs(estate_copy)) pos_list.append(pos) min_overlap = min(np.abs(estate_copy)[pos]**2, min_overlap) evals_mapped[pos] = evals[i] estates_mapped[:, pos] = estate self._evals = evals_mapped self._estates = estates_mapped self._h_diag = np.ascontiguousarray(np.diag(ham_full).real) def _hamiltonian_parse_exceptions(hamiltonian): """Raises exceptions for hamiltonian specification. Parameters: hamiltonian (dict): dictionary specification of hamiltonian Returns: Raises: AerError: if some part of the hamiltonian dictionary is unsupported """ if hamiltonian.get('osc', {}) != {}: raise AerError('Oscillator-type systems are not supported.') def _first_excited_state(qubit_idx, subsystem_dims): """ Returns the vector corresponding to all qubits in the 0 state, except for qubit_idx in the 1 state. Assumption: the keys in dim_qub consist exactly of the str version of the int in range(len(dim_qub)). They don't need to be in order, but they need to be of this format Parameters: qubit_idx (int): the qubit to be in the 1 state subsystem_dims (dict): a dictionary with keys being subsystem index, and value being the dimension of the subsystem Returns: vector: the state with qubit_idx in state 1, and the rest in state 0 """ vector = np.array([1.]) # iterate through qubits, tensoring on the state qubit_indices = [int(qubit) for qubit in subsystem_dims] qubit_indices.sort() for idx in qubit_indices: new_vec = np.zeros(subsystem_dims[idx]) if idx == qubit_idx: new_vec[1] = 1 else: new_vec[0] = 1 vector = np.kron(new_vec, vector) return vector def _eval_for_max_espace_overlap(u, evals, evecs, decimals=14): """Return the eigenvalue for eigenvector closest to input. Given an eigenvalue decomposition evals, evecs, as output from get_diag_hamiltonian, returns the eigenvalue from evals corresponding to the eigenspace that the vector vec has the maximum overlap with. Args: u (numpy.array): the vector of interest evals (numpy.array): list of eigenvalues evecs (numpy.array): eigenvectors corresponding to evals decimals (int): rounding option, to try to handle numerical error if two evals should be the same but are slightly different Returns: complex: eigenvalue corresponding to eigenspace for which vec has maximal overlap. """ # get unique evals (with rounding for numerical error) rounded_evals = evals.copy().round(decimals=decimals) unique_evals = np.unique(rounded_evals) # compute overlaps to unique evals overlaps = np.zeros(len(unique_evals)) for idx, val in enumerate(unique_evals): overlaps[idx] = _proj_norm(evecs[:, val == rounded_evals], u) # return eval with largest overlap return unique_evals[np.argmax(overlaps)] def _proj_norm(mat, vec): """ Compute the projection form of a vector an matrix. Given a matrix ``mat`` and vector ``vec``, computes the norm of the projection of ``vec`` onto the column space of ``mat`` using least squares. Note: ``mat`` can also be specified as a 1d numpy.array, in which case it will convert it into a matrix with one column Parameters: mat (numpy.array): 2d array, a matrix. vec (numpy.array): 1d array, a vector. Returns: complex: the norm of the projection """ # if specified as a single vector, turn it into a column vector if mat.ndim == 1: mat = np.array([mat]).T lsq_vec = la.lstsq(mat, vec, rcond=None)[0] return la.norm(mat @ lsq_vec) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/pulse_system_model.py000066400000000000000000000222041362723322000252730ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=eval-used, exec-used, invalid-name "System Model class for system specification for the PulseSimulator" from warnings import warn from collections import OrderedDict from qiskit.providers import BaseBackend from .hamiltonian_model import HamiltonianModel from ..aererror import AerError class PulseSystemModel(): r"""Physical model object for pulse simulator. This class contains model information required by the :class:`~qiskit.providers.aer.PulseSimulator`. It contains: * ``"hamiltonian"``: a :class:`HamiltonianModel` object representing the Hamiltonian of the system. * ``"qubit_freq_est"`` and ``"meas_freq_est"``: optional default values for qubit and measurement frequencies. * ``"u_channel_lo"``: A description of :class:`ControlChannel` local oscillator frequencies in terms of qubit local oscillator frequencies. * ``"control_channel_labels"``: Optional list of identifying information for each :class:`ControlChannel` that the model supports. * ``"subsystem_list"``: List of subsystems in the model. * ``"dt"``: Sample width size for OpenPulse instructions. A model can be instantiated from the helper function :func:`duffing_system_model`, or using the :meth:`PulseSystemModel.from_backend` constructor. **Example** Constructing from a backend: .. code-block: python provider = IBMQ.load_account() armonk_backend = provider.get_backend('ibmq_armonk') system_model = PulseSystemModel.from_backend(armonk_backend) """ def __init__(self, hamiltonian=None, qubit_freq_est=None, meas_freq_est=None, u_channel_lo=None, control_channel_labels=None, subsystem_list=None, dt=None): """Initialize a PulseSystemModel. Args: hamiltonian (HamiltonianModel): The Hamiltonian of the system. qubit_freq_est (list): list of qubit lo frequencies defaults to be used in simulation if none are specified in the PulseQobj. meas_freq_est (list): list of qubit meas frequencies defaults to be used in simulation if none are specified in the PulseQobj. u_channel_lo (list): list of ControlChannel frequency specifications. control_channel_labels (list): list of labels for control channels, which can be of any type. subsystem_list (list): list of valid qubit indicies for the model. dt (float): pixel size for pulse Instructions. Raises: AerError: if hamiltonian is not None or a HamiltonianModel """ # default type values self._qubit_freq_est = qubit_freq_est self._meas_freq_est = meas_freq_est # necessary values if hamiltonian is not None and not isinstance(hamiltonian, HamiltonianModel): raise AerError("hamiltonian must be a HamiltonianModel object") self.hamiltonian = hamiltonian self.u_channel_lo = u_channel_lo self.control_channel_labels = control_channel_labels or [] self.subsystem_list = subsystem_list self.dt = dt @classmethod def from_backend(cls, backend, subsystem_list=None): """Returns a PulseSystemModel constructed from an OpenPulse enabled backend object. Args: backend (Backend): backend object to draw information from. subsystem_list (list): a list of ints for which qubits to include in the model. Returns: PulseSystemModel: the PulseSystemModel constructed from the backend. Raises: AerError: If channel or u_channel_lo are invalid. """ if not isinstance(backend, BaseBackend): raise AerError("{} is not a Qiskit backend".format(backend)) # get relevant information from backend defaults = backend.defaults().to_dict() config = backend.configuration().to_dict() if not config['open_pulse']: raise AerError('{} is not an open pulse backend'.format(backend)) # draw defaults qubit_freq_est = defaults.get('qubit_freq_est', None) meas_freq_est = defaults.get('meas_freq_est', None) # draw from configuration # if no subsystem_list, use all for device subsystem_list = subsystem_list or list(range(config['n_qubits'])) ham_string = config['hamiltonian'] hamiltonian = HamiltonianModel.from_dict(ham_string, subsystem_list) u_channel_lo = config.get('u_channel_lo', None) dt = config.get('dt', None) control_channel_labels = [None] * len(u_channel_lo) # populate control_channel_dict # for now it assumes the u channel drives a single qubit, and we return the index # of the driven qubit, along with the frequency description if u_channel_lo is not None: for u_idx, u_lo in enumerate(u_channel_lo): # find drive index drive_idx = None while drive_idx is None: u_str_label = 'U{0}'.format(str(u_idx)) for h_term_str in ham_string['h_str']: # check if this string corresponds to this u channel if u_str_label in h_term_str: # get index of X operator drive term x_idx = h_term_str.find('X') # if 'X' is found, and is not at the end of the string, drive_idx # is the subsequent character if x_idx != -1 and x_idx + 1 < len(h_term_str): drive_idx = int(h_term_str[x_idx + 1]) if drive_idx is not None: # construct string for u channel u_string = '' for u_term_dict in u_lo: scale = u_term_dict.get('scale', [1.0, 0]) q_idx = u_term_dict.get('q') if len(u_string) > 0: u_string += ' + ' u_string += str(scale[0] + scale[1] * 1j) + 'q' + str(q_idx) control_channel_labels[u_idx] = {'driven_q': drive_idx, 'freq': u_string} return cls(hamiltonian=hamiltonian, qubit_freq_est=qubit_freq_est, meas_freq_est=meas_freq_est, u_channel_lo=u_channel_lo, control_channel_labels=control_channel_labels, subsystem_list=subsystem_list, dt=dt) def control_channel_index(self, label): """Return the index of the control channel with identifying label. Args: label (Any): label that identifies a control channel Returns: int or None: index of the ControlChannel """ if label not in self.control_channel_labels: warn('There is no listed ControlChannel matching the provided label.') return None else: return self.control_channel_labels.index(label) def calculate_channel_frequencies(self, qubit_lo_freq=None): """Calculate frequencies for each channel given qubit_lo_freq. Args: qubit_lo_freq (list or None): list of qubit linear oscillator drive frequencies. If None these will be calculated using self._qubit_freq_est. Returns: OrderedDict: a dictionary of channel frequencies. Raises: ValueError: If channel or u_channel_lo are invalid. """ if not qubit_lo_freq: if not self._qubit_freq_est: raise ValueError("No qubit_lo_freq to use.") qubit_lo_freq = self._qubit_freq_est if self.u_channel_lo is None: raise ValueError("{} has no u_channel_lo.".format(self.__class__.__name__)) # Setup freqs for the channels freqs = OrderedDict() for key in self.hamiltonian._channels: chidx = int(key[1:]) if key[0] == 'D': freqs[key] = qubit_lo_freq[chidx] elif key[0] == 'U': freqs[key] = 0 for u_lo_idx in self.u_channel_lo[chidx]: if u_lo_idx['q'] < len(qubit_lo_freq): qfreq = qubit_lo_freq[u_lo_idx['q']] qscale = u_lo_idx['scale'][0] freqs[key] += qfreq * qscale else: raise ValueError("Channel is not D or U") return freqs qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/000077500000000000000000000000001362723322000217405ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/__init__.py000066400000000000000000000007741362723322000240610ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/digest.py000066400000000000000000000452401362723322000235760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name, missing-return-type-doc """A module of routines for digesting a PULSE qobj into something we can actually use. """ from warnings import warn from collections import OrderedDict import numpy as np from qiskit.providers.aer.aererror import AerError from .op_system import OPSystem from .opparse import NoiseParser from .operators import qubit_occ_oper_dressed from ..solver.options import OPoptions # pylint: disable=no-name-in-module,import-error from ..cy.utils import oplist_to_array from . import op_qobj as op def digest_pulse_obj(qobj, system_model, backend_options=None): """Convert specification of a simulation in the pulse language into the format accepted by the simulator. Args: qobj (PulseQobj): experiment specification system_model (PulseSystemModel): object representing system model backend_options (dict): dictionary of simulation options Returns: out (OPSystem): object understandable by the pulse simulator Raises: ValueError: When necessary parameters are missing Exception: For invalid ode options """ out = OPSystem() qobj_dict = qobj.to_dict() qobj_config = qobj_dict['config'] if backend_options is None: backend_options = {} # override anything in qobj_config that is present in backend_options for key in backend_options.keys(): qobj_config[key] = backend_options[key] noise_model = backend_options.get('noise_model', None) # post warnings for unsupported features _unsupported_warnings(qobj_dict, noise_model) # ############################### # ### Parse qobj_config settings # ############################### if 'memory_slots' not in qobj_config: raise ValueError('Number of memory_slots must be specific in Qobj config') out.global_data['shots'] = int(qobj_config.get('shots', 1024)) out.global_data['meas_level'] = int(qobj_config.get('meas_level', 2)) out.global_data['meas_return'] = qobj_config.get('meas_return', 'avg') out.global_data['memory_slots'] = qobj_config.get('memory_slots', 0) out.global_data['memory'] = qobj_config.get('memory', False) out.global_data['n_registers'] = qobj_config.get('n_registers', 0) # Handle qubit_lo_freq # First, try to draw from the PulseQobj. If the PulseQobj was assembled using the # PulseSimulator as the backend, and no qubit_lo_freq was specified, it will default to # [np.inf] qubit_lo_freq = None if 'qubit_lo_freq' in qobj_config and qobj_config['qubit_lo_freq'] != [np.inf]: # qobj frequencies are divided by 1e9, so multiply back qubit_lo_freq = [freq * 1e9 for freq in qobj_config['qubit_lo_freq']] # if it wasn't specified in the PulseQobj, draw from system_model if qubit_lo_freq is None: qubit_lo_freq = system_model._qubit_freq_est # if still None draw from the Hamiltonian if qubit_lo_freq is None: qubit_lo_freq = system_model.hamiltonian.get_qubit_lo_from_drift() warn('Warning: qubit_lo_freq was not specified in PulseQobj or in PulseSystemModel, ' + 'so it is beign automatically determined from the drift Hamiltonian.') # Build pulse arrays *************************************************************** pulses, pulses_idx, pulse_dict = build_pulse_arrays(qobj_dict['experiments'], qobj_config['pulse_library']) out.global_data['pulse_array'] = pulses out.global_data['pulse_indices'] = pulses_idx out.pulse_to_int = pulse_dict # ############################### # ### Extract model parameters # ############################### # Get qubit list and number qubit_list = system_model.subsystem_list if qubit_list is None: raise ValueError('Model must have a qubit list to simulate.') n_qubits = len(qubit_list) # get Hamiltonian if system_model.hamiltonian is None: raise ValueError('Model must have a Hamiltonian to simulate.') ham_model = system_model.hamiltonian # For now we dump this into OpSystem, though that should be refactored out.system = ham_model._system out.vars = ham_model._variables out.channels = ham_model._channels out.h_diag = ham_model._h_diag out.evals = ham_model._evals out.estates = ham_model._estates dim_qub = ham_model._subsystem_dims dim_osc = {} out.freqs = system_model.calculate_channel_frequencies(qubit_lo_freq=qubit_lo_freq) # convert estates into a Qutip qobj estates = [op.state(state) for state in ham_model._estates.T[:]] out.initial_state = estates[0] out.global_data['vars'] = list(out.vars.values()) # Need this info for evaluating the hamiltonian vars in the c++ solver out.global_data['vars_names'] = list(out.vars.keys()) out.global_data['freqs'] = list(out.freqs.values()) # Get dt if system_model.dt is None: raise ValueError('Qobj must have a dt value to simulate.') out.dt = system_model.dt # Parse noise noise_dict = noise_model or {} if noise_dict: noise = NoiseParser(noise_dict=noise_dict, dim_osc=dim_osc, dim_qub=dim_qub) noise.parse() out.noise = noise.compiled if any(out.noise): out.can_sample = False out.global_data['c_num'] = len(out.noise) else: out.noise = None # ############################### # ### Parse backend_options # ############################### if 'seed' in backend_options: out.global_data['seed'] = int(backend_options.get('seed')) else: out.global_data['seed'] = None out.global_data['q_level_meas'] = int(backend_options.get('q_level_meas', 1)) # solver options allowed_ode_options = ['atol', 'rtol', 'nsteps', 'max_step', 'num_cpus', 'norm_tol', 'norm_steps', 'rhs_reuse', 'rhs_filename'] ode_options = backend_options.get('ode_options', {}) for key in ode_options: if key not in allowed_ode_options: raise Exception('Invalid ode_option: {}'.format(key)) out.ode_options = OPoptions(**ode_options) # Set the ODE solver max step to be the half the # width of the smallest pulse min_width = np.iinfo(np.int32).max for key, val in out.pulse_to_int.items(): if key != 'pv': stop = out.global_data['pulse_indices'][val + 1] start = out.global_data['pulse_indices'][val] min_width = min(min_width, stop - start) out.ode_options.max_step = min_width / 2 * out.dt # ############################### # ### Convert experiments to data structures. # ############################### out.global_data['measurement_ops'] = [None] * n_qubits for exp in qobj_dict['experiments']: exp_struct = experiment_to_structs(exp, out.channels, out.global_data['pulse_indices'], out.pulse_to_int, out.dt, qubit_list) # Add in measurement operators # Not sure if this will work for multiple measurements # Note: the extraction of multiple measurements works, but the simulator itself # implicitly assumes there is only one measurement at the end if any(exp_struct['acquire']): for acq in exp_struct['acquire']: for jj in acq[1]: if jj > qubit_list[-1]: continue if not out.global_data['measurement_ops'][jj]: out.global_data['measurement_ops'][jj] = \ qubit_occ_oper_dressed(jj, estates, h_osc=dim_osc, h_qub=dim_qub, level=out.global_data['q_level_meas'] ) out.experiments.append(exp_struct) if not exp_struct['can_sample']: out.can_sample = False # This is a temporary flag while stabilizing cpp func ODE solver out.use_cpp_ode_func = qobj_config.get('use_cpp_ode_func', True) return out def _unsupported_warnings(qobj_dict, noise_model): """ Warns the user about untested/unsupported features. Parameters: qobj_dict (dict): qobj in dictionary form noise_model (dict): backend_options for simulation Returns: Raises: AerError: for unsupported features """ # Warnings that don't stop execution warning_str = '{} are an untested feature, and therefore may not behave as expected.' if noise_model is not None: warn(warning_str.format('Noise models')) if _contains_pv_instruction(qobj_dict['experiments']): raise AerError(warning_str.format('PersistentValue instructions')) required_str = '{} are required for simulation, and none were specified.' if not _contains_acquire_instruction(qobj_dict['experiments']): raise AerError(required_str.format('Acquire instructions')) def _contains_acquire_instruction(experiments): """ Return True if the list of experiments contains an Acquire instruction Parameters: experiments (list): list of schedules Returns: True or False: whether or not the schedules contain an Acquire command Raises: """ for exp in experiments: for inst in exp['instructions']: if inst['name'] == 'acquire': return True return False def _contains_pv_instruction(experiments): """ Return True if the list of experiments contains a PersistentValue instruction Parameters: experiments (list): list of schedules Returns: True or False: whether or not the schedules contain a PersistentValue command Raises: """ for exp in experiments: for inst in exp['instructions']: if inst['name'] == 'pv': return True return False def build_pulse_arrays(experiments, pulse_library): """ Build pulses and pulse_idx arrays, and a pulse_dict used in simulations and mapping of experimental pulse sequencies to pulse_idx sequencies and timings. Parameters: experiments (list): list of experiments pulse_library (list): list of pulses Returns: tuple: Returns all pulses in one array, an array of start indices for pulses, and dict that maps pulses to the index at which the pulses start. """ pulse_dict = {} total_pulse_length = 0 num_pulse = 0 for pulse in pulse_library: pulse_dict[pulse['name']] = num_pulse total_pulse_length += len(pulse['samples']) num_pulse += 1 idx = num_pulse + 1 # now go through experiments looking for PV gates pv_pulses = [] for exp in experiments: for pulse in exp['instructions']: if pulse['name'] == 'pv': if pulse['val'] not in [pval[1] for pval in pv_pulses] and pulse['val'] != 0: pv_pulses.append((pulse['val'], idx)) idx += 1 total_pulse_length += 1 pulse_dict['pv'] = pv_pulses pulses = np.empty(total_pulse_length, dtype=complex) pulses_idx = np.zeros(idx + 1, dtype=np.uint32) stop = 0 ind = 1 for _, pulse in enumerate(pulse_library): stop = pulses_idx[ind - 1] + len(pulse['samples']) pulses_idx[ind] = stop oplist_to_array(pulse['samples'], pulses, pulses_idx[ind - 1]) ind += 1 for pv in pv_pulses: stop = pulses_idx[ind - 1] + 1 pulses_idx[ind] = stop oplist_to_array([pv[0]], pulses, pulses_idx[ind - 1]) ind += 1 return pulses, pulses_idx, pulse_dict def experiment_to_structs(experiment, ham_chans, pulse_inds, pulse_to_int, dt, qubit_list=None): """Converts an experiment to a better formatted structure Args: experiment (dict): An experiment. ham_chans (dict): The channels in the Hamiltonian. pulse_inds (array): Array of pulse indices. pulse_to_int (array): Qobj pulses labeled by ints. dt (float): Pulse time resolution. qubit_list (list): List of qubits. Returns: dict: The output formatted structure. Raises: ValueError: Channel not in Hamiltonian. TypeError: Incorrect snapshot type. """ # TO DO: Error check that operations are restricted to qubit list max_time = 0 structs = {} structs['header'] = experiment['header'] structs['channels'] = OrderedDict() for chan_name in ham_chans: structs['channels'][chan_name] = [[], []] structs['acquire'] = [] structs['cond'] = [] structs['snapshot'] = [] structs['tlist'] = [] structs['can_sample'] = True # This is a list that tells us whether # the last PV pulse on a channel needs to # be assigned a final time based on the next pulse on that channel pv_needs_tf = [0] * len(ham_chans) # The instructions are time-ordered so just loop through them. for inst in experiment['instructions']: # Do D and U channels if 'ch' in inst.keys() and inst['ch'][0] in ['d', 'u']: chan_name = inst['ch'].upper() if chan_name not in ham_chans.keys(): raise ValueError('Channel {} is not in Hamiltonian model'.format(inst['ch'])) # If last pulse on channel was a PV then need to set # its final time to be start time of current pulse if pv_needs_tf[ham_chans[chan_name]]: structs['channels'][chan_name][0][-3] = inst['t0'] * dt pv_needs_tf[ham_chans[chan_name]] = 0 # Get condtional info if 'conditional' in inst.keys(): cond = inst['conditional'] else: cond = -1 # PV's if inst['name'] == 'pv': # Get PV index for pv in pulse_to_int['pv']: if pv[0] == inst['val']: index = pv[1] break structs['channels'][chan_name][0].extend([inst['t0'] * dt, None, index, cond]) pv_needs_tf[ham_chans[chan_name]] = 1 # Frame changes elif inst['name'] == 'fc': structs['channels'][chan_name][1].extend([inst['t0'] * dt, inst['phase'], cond]) # A standard pulse else: start = inst['t0'] * dt pulse_int = pulse_to_int[inst['name']] pulse_width = (pulse_inds[pulse_int + 1] - pulse_inds[pulse_int]) * dt stop = start + pulse_width structs['channels'][chan_name][0].extend([start, stop, pulse_int, cond]) max_time = max(max_time, stop) # Take care of acquires and snapshots (bfuncs added ) else: # measurements if inst['name'] == 'acquire': # Better way?? qlist2 = [] mlist2 = [] if qubit_list is None: qlist2 = inst['qubits'] mlist2 = inst['memory_slot'] else: for qind, qb in enumerate(inst['qubits']): if qb in qubit_list: qlist2.append(qb) mlist2.append(inst['memory_slot'][qind]) acq_vals = [inst['t0'] * dt, np.asarray(qlist2, dtype=np.uint32), np.asarray(mlist2, dtype=np.uint32) ] if 'register_slot' in inst.keys(): acq_vals.append(np.asarray(inst['register_slot'], dtype=np.uint32)) else: acq_vals.append(None) structs['acquire'].append(acq_vals) # update max_time max_time = max(max_time, (inst['t0'] + inst['duration']) * dt) # Add time to tlist if inst['t0'] * dt not in structs['tlist']: structs['tlist'].append(inst['t0'] * dt) # conditionals elif inst['name'] == 'bfunc': bfun_vals = [inst['t0'] * dt, inst['mask'], inst['relation'], inst['val'], inst['register']] if 'memory' in inst.keys(): bfun_vals.append(inst['memory']) else: bfun_vals.append(None) structs['cond'].append(acq_vals) # update max_time max_time = max(max_time, inst['t0'] * dt) # Add time to tlist if inst['t0'] * dt not in structs['tlist']: structs['tlist'].append(inst['t0'] * dt) # snapshots elif inst['name'] == 'snapshot': if inst['type'] != 'state': raise TypeError("Snapshots must be of type 'state'") structs['snapshot'].append([inst['t0'] * dt, inst['label']]) # Add time to tlist if inst['t0'] * dt not in structs['tlist']: structs['tlist'].append(inst['t0'] * dt) # update max_time max_time = max(max_time, inst['t0'] * dt) # If any PVs still need time then they are at the end # and should just go til final time ham_keys = list(ham_chans.keys()) for idx, pp in enumerate(pv_needs_tf): if pp: structs['channels'][ham_keys[idx]][0][-3] = max_time pv_needs_tf[idx] = 0 # Convert lists to numpy arrays for key in structs['channels'].keys(): structs['channels'][key][0] = np.asarray(structs['channels'][key][0], dtype=float) structs['channels'][key][1] = np.asarray(structs['channels'][key][1], dtype=float) structs['tlist'] = np.asarray([0] + structs['tlist'], dtype=float) if structs['tlist'][-1] > structs['acquire'][-1][0]: structs['can_sample'] = False return structs qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/op_qobj.py000066400000000000000000000112571362723322000237510ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name, no-name-in-module, import-error """Operators to use in simulator""" import numpy as np from ..qutip_lite import operators as ops from ..qutip_lite import states as st from ..qutip_lite import tensor as ten from ..qutip_lite.qobj import Qobj from ..qutip_lite.cy.spmatfuncs import (spmv_csr, cy_expect_psi_csr) def sigmax(dim=2): """Qiskit wrapper of sigma-X operator. """ if dim == 2: return ops.sigmax() else: raise Exception('Invalid level specification of the qubit subspace') def sigmay(dim=2): """Qiskit wrapper of sigma-Y operator. """ if dim == 2: return ops.sigmay() else: raise Exception('Invalid level specification of the qubit subspace') def sigmaz(dim=2): """Qiskit wrapper of sigma-Z operator. """ if dim == 2: return ops.sigmaz() else: raise Exception('Invalid level specification of the qubit subspace') def sigmap(dim=2): """Qiskit wrapper of sigma-plus operator. """ return ops.create(dim) def sigmam(dim=2): """Qiskit wrapper of sigma-minus operator. """ return ops.destroy(dim) def create(dim): """Qiskit wrapper of creation operator. """ return ops.create(dim) def destroy(dim): """Qiskit wrapper of annihilation operator. """ return ops.destroy(dim) def num(dim): """Qiskit wrapper of number operator. """ return ops.num(dim) def qeye(dim): """Qiskit wrapper of identity operator. """ return ops.qeye(dim) def project(dim, states): """Qiskit wrapper of projection operator. """ ket, bra = states if ket in range(dim) and bra in range(dim): return st.basis(dim, ket) * st.basis(dim, bra).dag() else: raise Exception('States are specified on the outside of Hilbert space %s' % states) def tensor(list_qobj): """ Qiskit wrapper of tensor product """ return ten.tensor(list_qobj) def conj(val): """ Qiskit wrapper of conjugate """ if isinstance(val, Qobj): return val.conj() else: return np.conj(val) def sin(val): """ Qiskit wrapper of sine function """ if isinstance(val, Qobj): return val.sinm() else: return np.sin(val) def cos(val): """ Qiskit wrapper of cosine function """ if isinstance(val, Qobj): return val.cosm() else: return np.cos(val) def exp(val): """ Qiskit wrapper of exponential function """ if isinstance(val, Qobj): return val.expm() else: return np.exp(val) def sqrt(val): """ Qiskit wrapper of square root """ if isinstance(val, Qobj): return val.sqrtm() else: return np.sqrt(val) def dag(qobj): """ Qiskit wrapper of adjoint """ return qobj.dag() def dammy(qobj): """ Return given quantum object """ return qobj def basis(level, pos): """ Qiskit wrapper of basis """ return st.basis(level, pos) def state(state_vec): """ Qiskit wrapper of qobj """ return Qobj(state_vec) def fock_dm(level, eigv): """ Qiskit wrapper of fock_dm """ return st.fock_dm(level, eigv) def opr_prob(opr, state_vec): """ Measure probability of operator in given quantum state """ return cy_expect_psi_csr(opr.data.data, opr.data.indices, opr.data.indptr, state_vec, 1) def opr_apply(opr, state_vec): """ Apply operator to given quantum state """ return spmv_csr(opr.data.data, opr.data.indices, opr.data.indptr, state_vec) def get_oper(name, *args): """ Return quantum operator of given name """ return __operdict.get(name, qeye)(*args) def get_func(name, qobj): """ Apply function of given name """ return __funcdict.get(name, dammy)(qobj) __operdict = {'X': sigmax, 'Y': sigmay, 'Z': sigmaz, 'Sp': create, 'Sm': destroy, 'I': qeye, 'O': num, 'P': project, 'A': destroy, 'C': create, 'N': num} __funcdict = {'cos': cos, 'sin': sin, 'exp': exp, 'sqrt': sqrt, 'conj': conj, 'dag': dag} qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/op_system.py000066400000000000000000000043421362723322000243370ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name "The OpenPulse simulator system class" class OPSystem(): """ A Class that holds all the information needed to simulate a given PULSE qobj """ def __init__(self): # The system Hamiltonian in numerical format self.system = None # The noise (if any) in numerical format self.noise = None # System variables self.vars = None # The initial state of the system self.initial_state = None # Channels in the Hamiltonian string # these tell the order in which the channels # are evaluated in the RHS solver. self.channels = None # options of the ODE solver self.ode_options = None # time between pulse sample points. self.dt = None # Array containing all pulse samples self.pulse_array = None # Array of indices indicating where a pulse starts in the self.pulse_array self.pulse_indices = None # A dict that translates pulse names to integers for use in self.pulse_indices self.pulse_to_int = None # Holds the parsed experiments self.experiments = [] # Can experiments be simulated once then sampled self.can_sample = True # holds global data self.global_data = {} # holds frequencies for the channels self.freqs = {} # diagonal elements of the hamiltonian self.h_diag = None # eigenvalues of the time-independent hamiltonian self.evals = None # Use C++ version of the function to pass to the ODE solver or the Cython one self.use_cpp_ode_func = False # eigenstates of the time-independent hamiltonian self.estates = None qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/operators.py000066400000000000000000000211701362723322000243310ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name """Module for creating quantum operators.""" import numpy as np import scipy.linalg as la from ..qobj import op_qobj as op def gen_oper(opname, index, h_osc, h_qub, states=None): """Generate quantum operators. Args: opname (str): Name of the operator to be returned. index (int): Index of operator. h_osc (dict): Dimension of oscillator subspace h_qub (dict): Dimension of qubit subspace states (tuple): State indices of projection operator. Returns: Qobj: quantum operator for target qubit. """ opr_tmp = None # get number of levels in Hilbert space if opname in ['X', 'Y', 'Z', 'Sp', 'Sm', 'I', 'O', 'P']: is_qubit = True dim = h_qub.get(index, 2) if opname in ['X', 'Y', 'Z'] and dim > 2: if opname == 'X': opr_tmp = op.get_oper('A', dim) + op.get_oper('C', dim) elif opname == 'Y': opr_tmp = (-1j * op.get_oper('A', dim) + 1j * op.get_oper('C', dim)) else: opr_tmp = op.get_oper('I', dim) - 2 * op.get_oper('N', dim) else: is_qubit = False dim = h_osc.get(index, 5) if opname == 'P': opr_tmp = op.get_oper(opname, dim, states) else: if opr_tmp is None: opr_tmp = op.get_oper(opname, dim) # reverse sort by index rev_h_osc = sorted(h_osc.items(), key=lambda x: x[0])[::-1] rev_h_qub = sorted(h_qub.items(), key=lambda x: x[0])[::-1] # osc_n * … * osc_0 * qubit_n * … * qubit_0 opers = [] for ii, dd in rev_h_osc: if ii == index and not is_qubit: opers.append(opr_tmp) else: opers.append(op.qeye(dd)) for ii, dd in rev_h_qub: if ii == index and is_qubit: opers.append(opr_tmp) else: opers.append(op.qeye(dd)) return op.tensor(opers) def qubit_occ_oper(target_qubit, h_osc, h_qub, level=0): """Builds the occupation number operator for a target qubit in a qubit oscillator system, where the oscillator are the first subsystems, and the qubit last. Parameters ---------- target_qubit (int): Qubit for which operator is built. h_osc (dict): Dict of number of levels in each oscillator. h_qub (dict): Dict of number of levels in each qubit system. level (int): Level of qubit system to be measured. Returns: Qobj: Occupation number operator for target qubit. """ # reverse sort by index rev_h_osc = sorted(h_osc.items(), key=lambda x: x[0])[::-1] rev_h_qub = sorted(h_qub.items(), key=lambda x: x[0])[::-1] # osc_n * … * osc_0 * qubit_n * … * qubit_0 opers = [] for ii, dd in rev_h_osc: opers.append(op.qeye(dd)) for ii, dd in rev_h_qub: if ii == target_qubit: opers.append(op.fock_dm(h_qub.get(target_qubit, 2), level)) else: opers.append(op.qeye(dd)) return op.tensor(opers) def qubit_occ_oper_dressed(target_qubit, estates, h_osc, h_qub, level=0): """Builds the occupation number operator for a target qubit in a qubit oscillator system, where the oscillator are the first subsystems, and the qubit last. This does it for a dressed systems assuming estates has the same ordering Args: target_qubit (int): Qubit for which operator is built. estates (list): eigenstates in the dressed frame h_osc (dict): Dict of number of levels in each oscillator. h_qub (dict): Dict of number of levels in each qubit system. level (int): Level of qubit system to be measured. Returns: Qobj: Occupation number operator for target qubit. """ # reverse sort by index rev_h_osc = sorted(h_osc.items(), key=lambda x: x[0])[::-1] rev_h_qub = sorted(h_qub.items(), key=lambda x: x[0])[::-1] # osc_n * … * osc_0 * qubit_n * … * qubit_0 states = [] proj_op = 0 * op.fock_dm(len(estates), 0) for ii, dd in rev_h_osc: states.append(op.basis(dd, 0)) for ii, dd in rev_h_qub: if ii == target_qubit: states.append(op.basis(dd, level)) else: states.append(op.state(np.ones(dd))) state = op.tensor(states) for ii, estate in enumerate(estates): if state[ii] == 1: proj_op += estate * estate.dag() return proj_op def measure_outcomes(measured_qubits, state_vector, measure_ops, seed=None): """Generate measurement outcomes for a given set of qubits and state vector. Parameters: measured_qubits (array_like): Qubits to be measured. state_vector(ndarray): State vector. measure_ops (list): List of measurement operator seed (int): Optional seed to RandomState for reproducibility. Returns: str: String of binaries representing measured qubit values. """ outcome_len = max(measured_qubits) + 1 # Create random generator with given seed (if any). rng_gen = np.random.RandomState(seed) rnds = rng_gen.rand(outcome_len) outcomes = '' for kk in range(outcome_len): if kk in measured_qubits: excited_prob = op.opr_prob(measure_ops[kk], state_vector) if excited_prob >= rnds[kk]: outcomes += '1' else: outcomes += '0' else: # We need a string for all the qubits up to the last # one being measured for the mask operation to work # Here, we default to unmeasured qubits in the grnd state. outcomes += '0' return outcomes def apply_projector(measured_qubits, results, h_qub, h_osc, state_vector): """Builds and applies the projection operator associated with a given qubit measurement result onto a state vector. Args: measured_qubits (list): measured qubit indices. results (list): results of qubit measurements. h_qub (dict): Dict of number of levels in each qubit system. h_osc (dict): Dict of number of levels in each oscillator. state_vector (ndarray): State vector. Returns: Qobj: State vector after projector applied, and normalized. """ # reverse sort by index rev_h_osc = sorted(h_osc.items(), key=lambda x: x[0])[::-1] rev_h_qub = sorted(h_qub.items(), key=lambda x: x[0])[::-1] # osc_n * … * osc_0 * qubit_n * … * qubit_0 opers = [] for ii, dd in rev_h_osc: opers.append(op.qeye(dd)) for ii, dd in rev_h_qub: if ii in measured_qubits: opers.append(op.fock_dm(dd, results[ii])) else: opers.append(op.qeye(dd)) proj_oper = op.tensor(opers) psi = op.opr_apply(proj_oper, state_vector) psi /= la.norm(psi) return psi # pylint: disable=dangerous-default-value,comparison-with-callable def init_fock_state(h_osc, h_qub, noise_dict={}): """ Generate initial Fock state, in the number state basis, for an oscillator in a thermal state defined by the expectation value of number of particles. Parameters: h_osc (dict): Dimension of oscillator subspace h_qub (dict): Dimension of qubit subspace noise_dict (dict): Dictionary of thermal particles for each oscillator subspace Returns: Qobj: State vector """ # reverse sort by index rev_h_osc = sorted(h_osc.items(), key=lambda x: x[0])[::-1] rev_h_qub = sorted(h_qub.items(), key=lambda x: x[0])[::-1] # osc_n * … * osc_0 * qubit_n * … * qubit_0 sub_state_vecs = [] for ii, dd in rev_h_osc: n_thermal = noise_dict['oscillator']['n_th'].get(str(ii), 0) if n_thermal == 0: # no thermal particles idx = 0 else: # consider finite thermal excitation levels = np.arange(dd) beta = np.log(1.0 / n_thermal + 1.0) diags = np.exp(-1.0 * beta * levels) diags /= np.sum(diags) cum_sum = np.cumsum(diags) idx = np.where(np.random.random() < cum_sum)[0][0] sub_state_vecs.append(op.basis(dd, idx)) for ii, dd in rev_h_qub: sub_state_vecs.append(op.basis(dd, 0)) return op.tensor(sub_state_vecs) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qobj/opparse.py000066400000000000000000000366131362723322000237740ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name """ The openpulse simulator parser""" import re import copy from collections import namedtuple, OrderedDict import numpy as np from .op_qobj import get_func from .operators import gen_oper Token = namedtuple('Token', ('type', 'name')) ham_elements = OrderedDict( QubOpr=re.compile(r"(?PO|Sp|Sm|X|Y|Z|I)(?P[0-9]+)"), PrjOpr=re.compile(r"P(?P[0-9]+),(?P[0-9]+),(?P[0-9]+)"), CavOpr=re.compile(r"(?PA|C|N)(?P[0-9]+)"), Func=re.compile(r"(?P[a-z]+)\("), Ext=re.compile(r"\.(?Pdag)"), Var=re.compile(r"[a-z]+[0-9]*"), Num=re.compile(r"[0-9.]+"), MathOrd0=re.compile(r"[*/]"), MathOrd1=re.compile(r"[+-]"), BrkL=re.compile(r"\("), BrkR=re.compile(r"\)") ) class HamiltonianParser: """ Generate QuTip hamiltonian object from string """ def __init__(self, h_str, dim_osc, dim_qub): """ Create new quantum operator generator Parameters: h_str (list): list of Hamiltonian string dim_osc (dict): dimension of oscillator subspace dim_qub (dict): dimension of qubit subspace """ self.h_str = h_str self.dim_osc = dim_osc self.dim_qub = dim_qub self.__td_hams = [] self.__tc_hams = [] self.__str2qopr = {} @property def compiled(self): """ Return Hamiltonian in OpenPulse handler format """ return self.__tc_hams + self.__td_hams def parse(self, qubit_list=None): """ Parse and generate quantum class object """ self.__td_hams = [] self.__tc_hams = [] # expand sum self._expand_sum() # convert to reverse Polish notation for ham in self.h_str: if len(re.findall(r"\|\|", ham)) > 1: raise Exception("Multiple time-dependent terms in %s" % ham) p_td = re.search(r"(?P[\S]+)\|\|(?P[\S]+)", ham) # find time-dependent term if p_td: coef, token = self._tokenizer(p_td.group('opr'), qubit_list) if token is None: continue # combine coefficient to time-dependent term if coef: td = '*'.join([coef, p_td.group('ch')]) else: td = p_td.group('ch') token = self._shunting_yard(token) _td = self._token2qobj(token), td self.__td_hams.append(_td) else: coef, token = self._tokenizer(ham, qubit_list) if token is None: continue token = self._shunting_yard(token) _tc = self._token2qobj(token), coef self.__tc_hams.append(_tc) def _expand_sum(self): """ Takes a string-based Hamiltonian list and expands the _SUM action items out. """ sum_str = re.compile(r"_SUM\[(?P[a-z]),(?P[a-z\d{}+-]+),(?P[a-z\d{}+-]+),") brk_str = re.compile(r"]") ham_list = copy.copy(self.h_str) ham_out = [] while any(ham_list): ham = ham_list.pop(0) p_sums = list(sum_str.finditer(ham)) p_brks = list(brk_str.finditer(ham)) if len(p_sums) != len(p_brks): raise Exception('Missing correct number of brackets in %s' % ham) # find correct sum-bracket correspondence if any(p_sums) == 0: ham_out.append(ham) else: itr = p_sums[0].group('itr') _l = int(p_sums[0].group('l')) _u = int(p_sums[0].group('u')) for ii in range(len(p_sums) - 1): if p_sums[ii + 1].end() > p_brks[ii].start(): break else: ii = len(p_sums) - 1 # substitute iterator value _temp = [] for kk in range(_l, _u + 1): trg_s = ham[p_sums[0].end():p_brks[ii].start()] # generate replacement pattern pattern = {} for p in re.finditer(r"\{(?P[a-z0-9*/+-]+)\}", trg_s): if p.group() not in pattern: sub = parse_binop(p.group('op_str'), operands={itr: str(kk)}) if sub.isdecimal(): pattern[p.group()] = sub else: pattern[p.group()] = "{%s}" % sub for key, val in pattern.items(): trg_s = trg_s.replace(key, val) _temp.append(''.join([ham[:p_sums[0].start()], trg_s, ham[p_brks[ii].end():]])) ham_list.extend(_temp) self.h_str = ham_out return ham_out def _tokenizer(self, op_str, qubit_list=None): """ Convert string to token and coefficient Check if the index is in qubit_list """ # generate token _op_str = copy.copy(op_str) token_list = [] prev = 'none' while any(_op_str): for key, parser in ham_elements.items(): p = parser.match(_op_str) if p: # find quantum operators if key in ['QubOpr', 'CavOpr']: _key = key _name = p.group() if p.group() not in self.__str2qopr.keys(): idx = int(p.group('idx')) if qubit_list is not None and idx not in qubit_list: return 0, None name = p.group('opr') opr = gen_oper(name, idx, self.dim_osc, self.dim_qub) self.__str2qopr[p.group()] = opr elif key == 'PrjOpr': _key = key _name = p.group() if p.group() not in self.__str2qopr.keys(): idx = int(p.group('idx')) name = 'P' lvs = int(p.group('ket')), int(p.group('bra')) opr = gen_oper(name, idx, self.dim_osc, self.dim_qub, lvs) self.__str2qopr[p.group()] = opr elif key in ['Func', 'Ext']: _name = p.group('name') _key = key elif key == 'MathOrd1': _name = p.group() if prev not in ['QubOpr', 'PrjOpr', 'CavOpr', 'Var', 'Num']: _key = 'MathUnitary' else: _key = key else: _name = p.group() _key = key token_list.append(Token(_key, _name)) _op_str = _op_str[p.end():] prev = _key break else: raise Exception('Invalid input string %s is found' % op_str) # split coefficient coef = '' if any([k.type == 'Var' for k in token_list]): for ii, _ in enumerate(token_list): if token_list[ii].name == '*': if all([k.type != 'Var' for k in token_list[ii + 1:]]): coef = ''.join([k.name for k in token_list[:ii]]) token_list = token_list[ii + 1:] break else: raise Exception('Invalid order of operators and coefficients in %s' % op_str) return coef, token_list def _shunting_yard(self, token_list): """ Reformat token to reverse Polish notation """ stack = [] queue = [] while any(token_list): token = token_list.pop(0) if token.type in ['QubOpr', 'PrjOpr', 'CavOpr', 'Num']: queue.append(token) elif token.type in ['Func', 'Ext']: stack.append(token) elif token.type in ['MathUnitary', 'MathOrd0', 'MathOrd1']: while stack and math_priority(token, stack[-1]): queue.append(stack.pop(-1)) stack.append(token) elif token.type in ['BrkL']: stack.append(token) elif token.type in ['BrkR']: while stack[-1].type not in ['BrkL', 'Func']: queue.append(stack.pop(-1)) if not any(stack): raise Exception('Missing correct number of brackets') pop = stack.pop(-1) if pop.type == 'Func': queue.append(pop) else: raise Exception('Invalid token %s is found' % token.name) while any(stack): queue.append(stack.pop(-1)) return queue def _token2qobj(self, tokens): """ Generate quantum class object from tokens """ stack = [] for token in tokens: if token.type in ['QubOpr', 'PrjOpr', 'CavOpr']: stack.append(self.__str2qopr[token.name]) elif token.type == 'Num': stack.append(float(token.name)) elif token.type in ['MathUnitary']: if token.name == '-': stack.append(-stack.pop(-1)) elif token.type in ['MathOrd0', 'MathOrd1']: op2 = stack.pop(-1) op1 = stack.pop(-1) if token.name == '+': stack.append(op1 + op2) elif token.name == '-': stack.append(op1 - op2) elif token.name == '*': stack.append(op1 * op2) elif token.name == '/': stack.append(op1 / op2) elif token.type in ['Func', 'Ext']: stack.append(get_func(token.name, stack.pop(-1))) else: raise Exception('Invalid token %s is found' % token.name) if len(stack) > 1: raise Exception('Invalid mathematical operation in ' % tokens) return stack[0] class NoiseParser: """ Generate QuTip noise object from dictionary Qubit noise is given in the format of nested dictionary: "qubit": { "0": { "Sm": 0.006 } } and oscillator noise is given in the format of nested dictionary: "oscillator": { "n_th": { "0": 0.001 }, "coupling": { "0": 0.05 } } these configurations are combined in the same dictionary """ def __init__(self, noise_dict, dim_osc, dim_qub): """ Create new quantum operator generator Parameters: noise_dict (dict): dictionary of noise configuration dim_osc (dict): dimension of oscillator subspace dim_qub (dict): dimension of qubit subspace """ self.noise_osc = noise_dict.get('oscillator', {'n_th': {}, 'coupling': {}}) self.noise_qub = noise_dict.get('qubit', {}) self.dim_osc = dim_osc self.dim_qub = dim_qub self.__c_list = [] @property def compiled(self): """ Return noise configuration in OpenPulse handler format """ return self.__c_list def parse(self): """ Parse and generate quantum class object """ # Qubit noise for index, config in self.noise_qub.items(): for opname, coef in config.items(): # TODO: support noise in multi-dimensional system # TODO: support noise with math operation if opname in ['X', 'Y', 'Z', 'Sp', 'Sm']: opr = gen_oper(opname, int(index), self.dim_osc, self.dim_qub) else: raise Exception('Unsupported noise operator %s is given' % opname) self.__c_list.append(np.sqrt(coef) * opr) # Oscillator noise ndic = self.noise_osc['n_th'] cdic = self.noise_osc['coupling'] for (n_ii, n_coef), (c_ii, c_coef) in zip(ndic.items(), cdic.items()): if n_ii == c_ii: if c_coef > 0: opr = gen_oper('A', int(n_ii), self.dim_osc, self.dim_qub) if n_coef: self.__c_list.append(np.sqrt(c_coef * (1 + n_coef)) * opr) self.__c_list.append(np.sqrt(c_coef * n_coef) * opr.dag()) else: self.__c_list.append(np.sqrt(c_coef) * opr) else: raise Exception('Invalid oscillator index in noise dictionary.') def math_priority(o1, o2): """ Check priority of given math operation """ rank = {'MathUnitary': 2, 'MathOrd0': 1, 'MathOrd1': 0} diff_ops = rank.get(o1.type, -1) - rank.get(o2.type, -1) if diff_ops > 0: return False else: return True # pylint: disable=dangerous-default-value def parse_binop(op_str, operands={}, cast_str=True): """ Calculate binary operation in string format """ oprs = OrderedDict( sum=r"(?P[a-zA-Z0-9]+)\+(?P[a-zA-Z0-9]+)", sub=r"(?P[a-zA-Z0-9]+)\-(?P[a-zA-Z0-9]+)", mul=r"(?P[a-zA-Z0-9]+)\*(?P[a-zA-Z0-9]+)", div=r"(?P[a-zA-Z0-9]+)\/(?P[a-zA-Z0-9]+)", non=r"(?P[a-zA-Z0-9]+)" ) for key, regr in oprs.items(): p = re.match(regr, op_str) if p: val0 = operands.get(p.group('v0'), p.group('v0')) if key == 'non': # substitution retv = val0 else: val1 = operands.get(p.group('v1'), p.group('v1')) # binary operation if key == 'sum': if val0.isdecimal() and val1.isdecimal(): retv = int(val0) + int(val1) else: retv = '+'.join([str(val0), str(val1)]) elif key == 'sub': if val0.isdecimal() and val1.isdecimal(): retv = int(val0) - int(val1) else: retv = '-'.join([str(val0), str(val1)]) elif key == 'mul': if val0.isdecimal() and val1.isdecimal(): retv = int(val0) * int(val1) else: retv = '*'.join([str(val0), str(val1)]) elif key == 'div': if val0.isdecimal() and val1.isdecimal(): retv = int(val0) / int(val1) else: retv = '/'.join([str(val0), str(val1)]) else: retv = 0 break else: raise Exception('Invalid string %s' % op_str) if cast_str: return str(retv) else: return retv qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/000077500000000000000000000000001362723322000231645ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/__init__.py000077500000000000000000000044251362723322000253050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/000077500000000000000000000000001362723322000235775ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/CMakeLists.txt000066400000000000000000000011501362723322000263340ustar00rootroot00000000000000include(Linter) include(cython_utils) # We need to remove the -static flag, because Python Extension system only supports # dynamic linked libraries, but we want to build a shared libraries with the least # dependencies we can, so some of these dependencies are linked statically into our # shared library. string(REPLACE " -static " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") set(CYTHON_INSTALL_DIR "qiskit/providers/aer/pulse/qutip_lite/cy") add_cython_module(spconvert src/zspmv.cpp) add_cython_module(spmath src/zspmv.cpp) add_cython_module(sparse_utils src/zspmv.cpp) add_cython_module(spmatfuncs src/zspmv.cpp) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/__init__.py000077500000000000000000000000001362723322000257010ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/complex_math.pxi000077500000000000000000000017671362723322000270170ustar00rootroot00000000000000cdef extern from "" namespace "std" nogil: double abs(double complex x) double complex acos(double complex x) double complex acosh(double complex x) double arg(double complex x) double complex asin(double complex x) double complex asinh(double complex x) double complex atan(double complex x) double complex atanh(double complex x) double complex conj(double complex x) double complex cos(double complex x) double complex cosh(double complex x) double complex exp(double complex x) double imag(double complex x) double complex log(double complex x) double complex log10(double complex x) double norm(double complex x) double complex proj(double complex x) double real(double complex x) double complex sin(double complex x) double complex sinh(double complex x) double complex sqrt(double complex x) double complex tan(double complex x) double complex tanh(double complex x) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/parameters.pxi000077500000000000000000000003621362723322000264700ustar00rootroot00000000000000import numpy as np cimport numpy as cnp DTYPE = np.float64 ctypedef cnp.float64_t DTYPE_t ITYPE = np.int32 ctypedef cnp.int32_t ITYPE_t CTYPE = np.complex128 ctypedef cnp.complex128_t CTYPE_t CTYPE = np.int64 ctypedef cnp.int64_t LTYPE_t qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/pyxbuilder.py000077500000000000000000000065471362723322000263570ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### """Utility for making the build options for compiling the Hamiltonian""" import sys import os import pyximport from pyximport import install __all__ = ["install"] OLD_EXT = pyximport.pyximport.get_distutils_extension def new_get_distutils_extension(modname, pyxfilename, language_level=None): """Get the distutils extension""" extension_mod, setup_args = OLD_EXT(modname, pyxfilename, language_level) extension_mod.language = 'c++' # If on Win and Python version >= 3.5 and not in MSYS2 (i.e. Visual studio compile) if sys.platform == 'win32' and \ (int(str(sys.version_info[0]) + str(sys.version_info[1])) >= 35) \ and os.environ.get('MSYSTEM') is None: extension_mod.extra_compile_args = ['/w', '/O1'] else: extension_mod.extra_compile_args = ['-w', '-O1'] if sys.platform == 'darwin': extension_mod.extra_compile_args.append('-mmacosx-version-min=10.9') extension_mod.extra_link_args = ['-mmacosx-version-min=10.9'] return extension_mod, setup_args pyximport.pyximport.get_distutils_extension = new_get_distutils_extension qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/sparse_routines.pxi000077500000000000000000000477031362723322000275640ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### import numpy as np from scipy.sparse import coo_matrix from qiskit.providers.aer.pulse.qutip_lite.fastsparse import fast_csr_matrix cimport numpy as np cimport cython from libcpp.algorithm cimport sort from libcpp.vector cimport vector from .sparse_structs cimport CSR_Matrix, COO_Matrix np.import_array() from libc.string cimport memset cdef extern from "numpy/arrayobject.h" nogil: void PyArray_ENABLEFLAGS(np.ndarray arr, int flags) void PyDataMem_FREE(void * ptr) void PyDataMem_RENEW(void * ptr, size_t size) void PyDataMem_NEW(size_t size) #Struct used for CSR indices sorting cdef struct _data_ind_pair: double complex data int ind ctypedef _data_ind_pair data_ind_pair ctypedef int (*cfptr)(data_ind_pair, data_ind_pair) cdef void raise_error_CSR(int E, CSR_Matrix * C = NULL): if not C.numpy_lock and C != NULL: free_CSR(C) if E == -1: raise MemoryError('Could not allocate memory.') elif E == -2: raise Exception('Error manipulating CSR_Matrix structure.') elif E == -3: raise Exception('CSR_Matrix is not initialized.') elif E == -4: raise Exception('NumPy already has lock on data.') elif E == -5: raise Exception('Cannot expand data structures past max_length.') elif E == -6: raise Exception('CSR_Matrix cannot be expanded.') elif E == -7: raise Exception('Data length cannot be larger than max_length') else: raise Exception('Error in Cython code.') cdef void raise_error_COO(int E, COO_Matrix * C = NULL): if not C.numpy_lock and C != NULL: free_COO(C) if E == -1: raise MemoryError('Could not allocate memory.') elif E == -2: raise Exception('Error manipulating COO_Matrix structure.') elif E == -3: raise Exception('COO_Matrix is not initialized.') elif E == -4: raise Exception('NumPy already has lock on data.') elif E == -5: raise Exception('Cannot expand data structures past max_length.') elif E == -6: raise Exception('COO_Matrix cannot be expanded.') elif E == -7: raise Exception('Data length cannot be larger than max_length') else: raise Exception('Error in Cython code.') cdef inline int int_min(int a, int b) nogil: return b if b < a else a cdef inline int int_max(int a, int b) nogil: return a if a > b else b @cython.boundscheck(False) @cython.wraparound(False) cdef void init_CSR(CSR_Matrix * mat, int nnz, int nrows, int ncols = 0, int max_length = 0, int init_zeros = 1): """ Initialize CSR_Matrix struct. Matrix is assumed to be square with shape nrows x nrows. Manually set mat.ncols otherwise Parameters ---------- mat : CSR_Matrix * Pointer to struct. nnz : int Length of data and indices arrays. Also number of nonzero elements nrows : int Number of rows in matrix. Also gives length of indptr array (nrows+1). ncols : int (default = 0) Number of cols in matrix. Default is ncols = nrows. max_length : int (default = 0) Maximum length of data and indices arrays. Used for resizing. Default value of zero indicates no resizing. """ if max_length == 0: max_length = nnz if nnz > max_length: raise_error_CSR(-7, mat) if init_zeros: mat.data = PyDataMem_NEW(nnz * sizeof(double complex)) memset(&mat.data[0],0,nnz * sizeof(double complex)) else: mat.data = PyDataMem_NEW(nnz * sizeof(double complex)) if mat.data == NULL: raise_error_CSR(-1, mat) if init_zeros: mat.indices = PyDataMem_NEW(nnz * sizeof(int)) mat.indptr = PyDataMem_NEW((nrows+1) * sizeof(int)) memset(&mat.indices[0],0,nnz * sizeof(int)) memset(&mat.indptr[0],0,(nrows+1) * sizeof(int)) else: mat.indices = PyDataMem_NEW(nnz * sizeof(int)) mat.indptr = PyDataMem_NEW((nrows+1) * sizeof(int)) mat.nnz = nnz mat.nrows = nrows if ncols == 0: mat.ncols = nrows else: mat.ncols = ncols mat.is_set = 1 mat.max_length = max_length mat.numpy_lock = 0 @cython.boundscheck(False) @cython.wraparound(False) cdef void copy_CSR(CSR_Matrix * out, CSR_Matrix * mat): """ Copy a CSR_Matrix. """ cdef size_t kk if not mat.is_set: raise_error_CSR(-3) elif out.is_set: raise_error_CSR(-2) init_CSR(out, mat.nnz, mat.nrows, mat.nrows, mat.max_length) # We cannot use memcpy here since there are issues with # doing so on Win with the GCC compiler for kk in range(mat.nnz): out.data[kk] = mat.data[kk] out.indices[kk] = mat.indices[kk] for kk in range(mat.nrows+1): out.indptr[kk] = mat.indptr[kk] @cython.boundscheck(False) @cython.wraparound(False) cdef void init_COO(COO_Matrix * mat, int nnz, int nrows, int ncols = 0, int max_length = 0, int init_zeros = 1): """ Initialize COO_Matrix struct. Matrix is assumed to be square with shape nrows x nrows. Manually set mat.ncols otherwise Parameters ---------- mat : COO_Matrix * Pointer to struct. nnz : int Number of nonzero elements. nrows : int Number of rows in matrix. nrows : int (default = 0) Number of cols in matrix. Default is ncols = nrows. max_length : int (default = 0) Maximum length of arrays. Used for resizing. Default value of zero indicates no resizing. """ if max_length == 0: max_length = nnz if nnz > max_length: raise_error_COO(-7, mat) if init_zeros: mat.data = PyDataMem_NEW(nnz * sizeof(double complex)) memset(&mat.data[0],0,nnz * sizeof(double complex)) else: mat.data = PyDataMem_NEW(nnz * sizeof(double complex)) if mat.data == NULL: raise_error_COO(-1, mat) if init_zeros: mat.rows = PyDataMem_NEW(nnz * sizeof(int)) mat.cols = PyDataMem_NEW(nnz * sizeof(int)) memset(&mat.rows[0],0,nnz * sizeof(int)) memset(&mat.cols[0],0,nnz * sizeof(int)) else: mat.rows = PyDataMem_NEW(nnz * sizeof(int)) mat.cols = PyDataMem_NEW(nnz * sizeof(int)) mat.nnz = nnz mat.nrows = nrows if ncols == 0: mat.ncols = nrows else: mat.ncols = ncols mat.is_set = 1 mat.max_length = max_length mat.numpy_lock = 0 @cython.boundscheck(False) @cython.wraparound(False) cdef void free_CSR(CSR_Matrix * mat): """ Manually free CSR_Matrix data structures if data is not locked by NumPy. """ if not mat.numpy_lock and mat.is_set: if mat.data != NULL: PyDataMem_FREE(mat.data) if mat.indices != NULL: PyDataMem_FREE(mat.indices) if mat.indptr != NULL: PyDataMem_FREE(mat.indptr) mat.is_set = 0 else: raise_error_CSR(-2) @cython.boundscheck(False) @cython.wraparound(False) cdef void free_COO(COO_Matrix * mat): """ Manually free COO_Matrix data structures if data is not locked by NumPy. """ if not mat.numpy_lock and mat.is_set: if mat.data != NULL: PyDataMem_FREE(mat.data) if mat.rows != NULL: PyDataMem_FREE(mat.rows) if mat.cols != NULL: PyDataMem_FREE(mat.cols) mat.is_set = 0 else: raise_error_COO(-2) @cython.boundscheck(False) @cython.wraparound(False) cdef void shorten_CSR(CSR_Matrix * mat, int N): """ Shortends the length of CSR data and indices arrays. """ if (not mat.numpy_lock) and mat.is_set: mat.data = PyDataMem_RENEW(mat.data, N * sizeof(double complex)) mat.indices = PyDataMem_RENEW(mat.indices, N * sizeof(int)) mat.nnz = N else: if mat.numpy_lock: raise_error_CSR(-4, mat) elif not mat.is_set: raise_error_CSR(-3, mat) @cython.boundscheck(False) @cython.wraparound(False) cdef void expand_CSR(CSR_Matrix * mat, int init_zeros=0): """ Expands the length of CSR data and indices arrays to accomodate more nnz. THIS IS CURRENTLY NOT USED """ cdef size_t ii cdef int new_size if mat.nnz == mat.max_length: raise_error_CSR(-5, mat) #Cannot expand data past max_length. elif (not mat.numpy_lock) and mat.is_set: new_size = int_min(2*mat.nnz, mat.max_length) new_data = PyDataMem_RENEW(mat.data, new_size * sizeof(double complex)) if new_data == NULL: raise_error_CSR(-1, mat) else: mat.data = new_data if init_zeros == 1: for ii in range(mat.nnz, new_size): mat.data[ii] = 0 new_ind = PyDataMem_RENEW(mat.indices, new_size * sizeof(int)) mat.indices = new_ind if init_zeros == 1: for ii in range(mat.nnz, new_size): mat.indices[ii] = 0 mat.nnz = new_size else: if mat.numpy_lock: raise_error_CSR(-4, mat) elif not mat.is_set: raise_error_CSR(-3, mat) @cython.boundscheck(False) @cython.wraparound(False) cdef object CSR_to_scipy(CSR_Matrix * mat): """ Converts a CSR_Matrix struct to a SciPy csr_matrix class object. The NumPy arrays are generated from the pointers, and the lifetime of the pointer memory is tied to that of the NumPy array (i.e. automatic garbage cleanup.) Parameters ---------- mat : CSR_Matrix * Pointer to CSR_Matrix. """ cdef np.npy_intp dat_len, ptr_len cdef np.ndarray[complex, ndim=1] _data cdef np.ndarray[int, ndim=1] _ind, _ptr if (not mat.numpy_lock) and mat.is_set: dat_len = mat.nnz ptr_len = mat.nrows+1 _data = np.PyArray_SimpleNewFromData(1, &dat_len, np.NPY_COMPLEX128, mat.data) PyArray_ENABLEFLAGS(_data, np.NPY_OWNDATA) _ind = np.PyArray_SimpleNewFromData(1, &dat_len, np.NPY_INT32, mat.indices) PyArray_ENABLEFLAGS(_ind, np.NPY_OWNDATA) _ptr = np.PyArray_SimpleNewFromData(1, &ptr_len, np.NPY_INT32, mat.indptr) PyArray_ENABLEFLAGS(_ptr, np.NPY_OWNDATA) mat.numpy_lock = 1 return fast_csr_matrix((_data, _ind, _ptr), shape=(mat.nrows,mat.ncols)) else: if mat.numpy_lock: raise_error_CSR(-4) elif not mat.is_set: raise_error_CSR(-3) @cython.boundscheck(False) @cython.wraparound(False) cdef object COO_to_scipy(COO_Matrix * mat): """ Converts a COO_Matrix struct to a SciPy coo_matrix class object. The NumPy arrays are generated from the pointers, and the lifetime of the pointer memory is tied to that of the NumPy array (i.e. automatic garbage cleanup.) Parameters ---------- mat : COO_Matrix * Pointer to COO_Matrix. """ cdef np.npy_intp dat_len cdef np.ndarray[complex, ndim=1] _data cdef np.ndarray[int, ndim=1] _row, _col if (not mat.numpy_lock) and mat.is_set: dat_len = mat.nnz _data = np.PyArray_SimpleNewFromData(1, &dat_len, np.NPY_COMPLEX128, mat.data) PyArray_ENABLEFLAGS(_data, np.NPY_OWNDATA) _row = np.PyArray_SimpleNewFromData(1, &dat_len, np.NPY_INT32, mat.rows) PyArray_ENABLEFLAGS(_row, np.NPY_OWNDATA) _col = np.PyArray_SimpleNewFromData(1, &dat_len, np.NPY_INT32, mat.cols) PyArray_ENABLEFLAGS(_col, np.NPY_OWNDATA) mat.numpy_lock = 1 return coo_matrix((_data, (_row, _col)), shape=(mat.nrows,mat.ncols)) else: if mat.numpy_lock: raise_error_COO(-4) elif not mat.is_set: raise_error_COO(-3) @cython.boundscheck(False) @cython.wraparound(False) cdef void COO_to_CSR(CSR_Matrix * out, COO_Matrix * mat): """ Conversion from COO to CSR. Not in place, but result is sorted correctly. """ cdef int i, j, iad, j0 cdef double complex val cdef size_t kk init_CSR(out, mat.nnz, mat.nrows, mat.ncols, max_length=0, init_zeros=1) # Determine row lengths for kk in range(mat.nnz): out.indptr[mat.rows[kk]] = out.indptr[mat.rows[kk]] + 1 # Starting position of rows j = 0 for kk in range(mat.nrows): j0 = out.indptr[kk] out.indptr[kk] = j j += j0 #Do the data for kk in range(mat.nnz): i = mat.rows[kk] j = mat.cols[kk] val = mat.data[kk] iad = out.indptr[i] out.data[iad] = val out.indices[iad] = j out.indptr[i] = iad+1 # Shift back for kk in range(mat.nrows,0,-1): out.indptr[kk] = out.indptr[kk-1] out.indptr[0] = 0 @cython.boundscheck(False) @cython.wraparound(False) cdef void CSR_to_COO(COO_Matrix * out, CSR_Matrix * mat): """ Converts a CSR_Matrix to a COO_Matrix. """ cdef int k1, k2 cdef size_t jj, kk init_COO(out, mat.nnz, mat.nrows, mat.ncols) for kk in range(mat.nnz): out.data[kk] = mat.data[kk] out.cols[kk] = mat.indices[kk] for kk in range(mat.nrows-1,0,-1): k1 = mat.indptr[kk+1] k2 = mat.indptr[kk] for jj in range(k2, k1): out.rows[jj] = kk @cython.boundscheck(False) @cython.wraparound(False) cdef void COO_to_CSR_inplace(CSR_Matrix * out, COO_Matrix * mat): """ In place conversion from COO to CSR. In place, but not sorted. The length of the COO (data,rows,cols) must be equal to the NNZ in the final matrix (i.e. no padded zeros on ends of arrays). """ cdef size_t kk cdef int i, j, init, inext, jnext, ipos cdef int * _tmp_rows cdef complex val, val_next cdef int * work = PyDataMem_NEW((mat.nrows+1) * sizeof(int)) memset(&work[0],0,(mat.nrows+1) * sizeof(int)) # Determine output indptr array for kk in range(mat.nnz): i = mat.rows[kk] work[i+1] += 1 work[0] = 0 for kk in range(mat.nrows): work[kk+1] += work[kk] if mat.nnz < (mat.nrows+1): _tmp_rows = PyDataMem_RENEW(mat.rows, (mat.nrows+1) * sizeof(int)) mat.rows = _tmp_rows init = 0 while init < mat.nnz: while (mat.rows[init] < 0): init += 1 val = mat.data[init] i = mat.rows[init] j = mat.cols[init] mat.rows[init] = -1 while 1: ipos = work[i] val_next = mat.data[ipos] inext = mat.rows[ipos] jnext = mat.cols[ipos] mat.data[ipos] = val mat.cols[ipos] = j mat.rows[ipos] = -1 work[i] += 1 if inext < 0: break val = val_next i = inext j = jnext init += 1 for kk in range(mat.nrows): mat.rows[kk+1] = work[kk] mat.rows[0] = 0 if mat.nnz > (mat.nrows+1): _tmp_rows = PyDataMem_RENEW(mat.rows, (mat.nrows+1) * sizeof(int)) mat.rows = _tmp_rows #Free working array PyDataMem_FREE(work) #Set CSR pointers to original COO data. out.data = mat.data out.indices = mat.cols out.indptr = mat.rows out.nrows = mat.nrows out.ncols = mat.ncols out.nnz = mat.nnz out.max_length = mat.nnz out.is_set = 1 out.numpy_lock = 0 @cython.boundscheck(False) @cython.wraparound(False) cdef int ind_sort(data_ind_pair x, data_ind_pair y): return x.ind < y.ind @cython.boundscheck(False) @cython.wraparound(False) cdef void sort_indices(CSR_Matrix * mat): """ Sorts the indices of a CSR_Matrix inplace. """ cdef size_t ii, jj cdef vector[data_ind_pair] pairs cdef cfptr cfptr_ = &ind_sort cdef int row_start, row_end, length for ii in range(mat.nrows): row_start = mat.indptr[ii] row_end = mat.indptr[ii+1] length = row_end - row_start pairs.resize(length) for jj in range(length): pairs[jj].data = mat.data[row_start+jj] pairs[jj].ind = mat.indices[row_start+jj] sort(pairs.begin(),pairs.end(),cfptr_) for jj in range(length): mat.data[row_start+jj] = pairs[jj].data mat.indices[row_start+jj] = pairs[jj].ind @cython.boundscheck(False) @cython.wraparound(False) cdef CSR_Matrix CSR_from_scipy(object A): """ Converts a SciPy CSR sparse matrix to a CSR_Matrix struct. """ cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows = A.shape[0] cdef int ncols = A.shape[1] cdef int nnz = ptr[nrows] cdef CSR_Matrix mat mat.data = &data[0] mat.indices = &ind[0] mat.indptr = &ptr[0] mat.nrows = nrows mat.ncols = ncols mat.nnz = nnz mat.max_length = nnz mat.is_set = 1 mat.numpy_lock = 1 return mat @cython.boundscheck(False) @cython.wraparound(False) cdef void CSR_from_scipy_inplace(object A, CSR_Matrix* mat): """ Converts a SciPy CSR sparse matrix to a CSR_Matrix struct. """ cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows = A.shape[0] cdef int ncols = A.shape[1] cdef int nnz = ptr[nrows] mat.data = &data[0] mat.indices = &ind[0] mat.indptr = &ptr[0] mat.nrows = nrows mat.ncols = ncols mat.nnz = nnz mat.max_length = nnz mat.is_set = 1 mat.numpy_lock = 1 @cython.boundscheck(False) @cython.wraparound(False) cdef COO_Matrix COO_from_scipy(object A): """ Converts a SciPy COO sparse matrix to a COO_Matrix struct. """ cdef complex[::1] data = A.data cdef int[::1] rows = A.row cdef int[::1] cols = A.col cdef int nrows = A.shape[0] cdef int ncols = A.shape[1] cdef int nnz = data.shape[0] cdef COO_Matrix mat mat.data = &data[0] mat.rows = &rows[0] mat.cols = &cols[0] mat.nrows = nrows mat.ncols = ncols mat.nnz = nnz mat.max_length = nnz mat.is_set = 1 mat.numpy_lock = 1 return mat @cython.boundscheck(False) @cython.wraparound(False) cdef void identity_CSR(CSR_Matrix * mat, unsigned int nrows): cdef size_t kk init_CSR(mat, nrows, nrows, nrows, 0, 0) for kk in range(nrows): mat.data[kk] = 1 mat.indices[kk] = kk mat.indptr[kk] = kk mat.indptr[nrows] = nrows qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/sparse_structs.pxd000077500000000000000000000042751362723322000274130ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### cdef struct _csr_mat: double complex * data int * indices int * indptr int nnz int nrows int ncols int is_set int max_length int numpy_lock cdef struct _coo_mat: double complex * data int * rows int * cols int nnz int nrows int ncols int is_set int max_length int numpy_lock ctypedef _csr_mat CSR_Matrix ctypedef _coo_mat COO_Matrix qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/sparse_utils.pyx000077500000000000000000000276421362723322000270740ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### import numpy as np from qiskit.providers.aer.pulse.qutip_lite.fastsparse import fast_csr_matrix cimport numpy as cnp from libc.math cimport abs, fabs, sqrt from libcpp cimport bool cimport cython cnp.import_array() from libc.string cimport memset cdef extern from "numpy/arrayobject.h" nogil: void PyArray_ENABLEFLAGS(cnp.ndarray arr, int flags) void PyDataMem_FREE(void * ptr) void PyDataMem_RENEW(void * ptr, size_t size) void PyDataMem_NEW(size_t size) cdef extern from "" namespace "std" nogil: double abs(double complex x) double real(double complex x) double imag(double complex x) cdef extern from "" namespace "std" nogil: double cabs "abs" (double complex x) cdef inline int int_max(int x, int y): return x ^ ((x ^ y) & -(x < y)) include "parameters.pxi" @cython.boundscheck(False) @cython.wraparound(False) def _sparse_bandwidth( int[::1] idx, int[::1] ptr, int nrows): """ Calculates the max (mb), lower(lb), and upper(ub) bandwidths of a csr_matrix. """ cdef int ldist cdef int lb = -nrows cdef int ub = -nrows cdef int mb = 0 cdef size_t ii, jj for ii in range(nrows): for jj in range(ptr[ii], ptr[ii + 1]): ldist = ii - idx[jj] lb = int_max(lb, ldist) ub = int_max(ub, -ldist) mb = int_max(mb, ub + lb + 1) return mb, lb, ub @cython.boundscheck(False) @cython.wraparound(False) def _sparse_profile(int[::1] idx, int[::1] ptr, int nrows): cdef int ii, jj, temp, ldist=0 cdef LTYPE_t pro = 0 for ii in range(nrows): temp = 0 for jj in range(ptr[ii], ptr[ii + 1]): ldist = idx[jj] - ii temp = int_max(temp, ldist) pro += temp return pro @cython.boundscheck(False) @cython.wraparound(False) def _sparse_permute( cnp.ndarray[cython.numeric, ndim=1] data, int[::1] idx, int[::1] ptr, int nrows, int ncols, cnp.ndarray[ITYPE_t, ndim=1] rperm, cnp.ndarray[ITYPE_t, ndim=1] cperm, int flag): """ Permutes the rows and columns of a sparse CSR or CSC matrix according to the permutation arrays rperm and cperm, respectively. Here, the permutation arrays specify the new order of the rows and columns. i.e. [0,1,2,3,4] -> [3,0,4,1,2]. """ cdef int ii, jj, kk, k0, nnz cdef cnp.ndarray[cython.numeric] new_data = np.zeros_like(data) cdef cnp.ndarray[ITYPE_t] new_idx = np.zeros_like(idx) cdef cnp.ndarray[ITYPE_t] new_ptr = np.zeros_like(ptr) cdef cnp.ndarray[ITYPE_t] perm_r cdef cnp.ndarray[ITYPE_t] perm_c cdef cnp.ndarray[ITYPE_t] inds if flag == 0: # CSR matrix if rperm.shape[0] != 0: inds = np.argsort(rperm).astype(ITYPE) perm_r = np.arange(rperm.shape[0], dtype=ITYPE)[inds] for jj in range(nrows): ii = perm_r[jj] new_ptr[ii + 1] = ptr[jj + 1] - ptr[jj] for jj in range(nrows): new_ptr[jj + 1] = new_ptr[jj+1] + new_ptr[jj] for jj in range(nrows): k0 = new_ptr[perm_r[jj]] for kk in range(ptr[jj], ptr[jj + 1]): new_idx[k0] = idx[kk] new_data[k0] = data[kk] k0 = k0 + 1 if cperm.shape[0] != 0: inds = np.argsort(cperm).astype(ITYPE) perm_c = np.arange(cperm.shape[0], dtype=ITYPE)[inds] nnz = new_ptr[new_ptr.shape[0] - 1] for jj in range(nnz): new_idx[jj] = perm_c[new_idx[jj]] elif flag == 1: # CSC matrix if cperm.shape[0] != 0: inds = np.argsort(cperm).astype(ITYPE) perm_c = np.arange(cperm.shape[0], dtype=ITYPE)[inds] for jj in range(ncols): ii = perm_c[jj] new_ptr[ii + 1] = ptr[jj + 1] - ptr[jj] for jj in range(ncols): new_ptr[jj + 1] = new_ptr[jj + 1] + new_ptr[jj] for jj in range(ncols): k0 = new_ptr[perm_c[jj]] for kk in range(ptr[jj], ptr[jj + 1]): new_idx[k0] = idx[kk] new_data[k0] = data[kk] k0 = k0 + 1 if rperm.shape[0] != 0: inds = np.argsort(rperm).astype(ITYPE) perm_r = np.arange(rperm.shape[0], dtype=ITYPE)[inds] nnz = new_ptr[new_ptr.shape[0] - 1] for jj in range(nnz): new_idx[jj] = perm_r[new_idx[jj]] return new_data, new_idx, new_ptr @cython.boundscheck(False) @cython.wraparound(False) def _sparse_reverse_permute( cnp.ndarray[cython.numeric, ndim=1] data, int[::1] idx, int[::1] ptr, int nrows, int ncols, cnp.ndarray[ITYPE_t, ndim=1] rperm, cnp.ndarray[ITYPE_t, ndim=1] cperm, int flag): """ Reverse permutes the rows and columns of a sparse CSR or CSC matrix according to the original permutation arrays rperm and cperm, respectively. """ cdef int ii, jj, kk, k0, nnz cdef cnp.ndarray[cython.numeric, ndim=1] new_data = np.zeros_like(data) cdef cnp.ndarray[ITYPE_t, ndim=1] new_idx = np.zeros_like(idx) cdef cnp.ndarray[ITYPE_t, ndim=1] new_ptr = np.zeros_like(ptr) if flag == 0: # CSR matrix if rperm.shape[0] != 0: for jj in range(nrows): ii = rperm[jj] new_ptr[ii + 1] = ptr[jj + 1] - ptr[jj] for jj in range(nrows): new_ptr[jj + 1] = new_ptr[jj + 1] + new_ptr[jj] for jj in range(nrows): k0 = new_ptr[rperm[jj]] for kk in range(ptr[jj], ptr[jj + 1]): new_idx[k0] = idx[kk] new_data[k0] = data[kk] k0 = k0 + 1 if cperm.shape[0] > 0: nnz = new_ptr[new_ptr.shape[0] - 1] for jj in range(nnz): new_idx[jj] = cperm[new_idx[jj]] if flag == 1: # CSC matrix if cperm.shape[0] != 0: for jj in range(ncols): ii = cperm[jj] new_ptr[ii + 1] = ptr[jj + 1] - ptr[jj] for jj in range(ncols): new_ptr[jj + 1] = new_ptr[jj + 1] + new_ptr[jj] for jj in range(ncols): k0 = new_ptr[cperm[jj]] for kk in range(ptr[jj], ptr[jj + 1]): new_idx[k0] = idx[kk] new_data[k0] = data[kk] k0 = k0 + 1 if cperm.shape[0] != 0: nnz = new_ptr[new_ptr.shape[0] - 1] for jj in range(nnz): new_idx[jj] = rperm[new_idx[jj]] return new_data, new_idx, new_ptr @cython.boundscheck(False) @cython.wraparound(False) def _isdiag(int[::1] idx, int[::1] ptr, int nrows): cdef int row, num_elems for row in range(nrows): num_elems = ptr[row+1] - ptr[row] if num_elems > 1: return 0 elif num_elems == 1: if idx[ptr[row]] != row: return 0 return 1 @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode='c'] _csr_get_diag(complex[::1] data, int[::1] idx, int[::1] ptr, int k=0): cdef size_t row, jj cdef int num_rows = ptr.shape[0]-1 cdef int abs_k = abs(k) cdef int start, stop cdef cnp.ndarray[complex, ndim=1, mode='c'] out = np.zeros(num_rows-abs_k, dtype=complex) if k >= 0: start = 0 stop = num_rows-abs_k else: #k < 0 start = abs_k stop = num_rows for row in range(start, stop): for jj in range(ptr[row], ptr[row+1]): if idx[jj]-k == row: out[row-start] = data[jj] break return out @cython.boundscheck(False) @cython.wraparound(False) @cython.cdivision(True) def unit_row_norm(complex[::1] data, int[::1] ptr, int nrows): cdef size_t row, ii cdef double total for row in range(nrows): total = 0 for ii in range(ptr[row], ptr[row+1]): total += real(data[ii]) * real(data[ii]) + imag(data[ii]) * imag(data[ii]) total = sqrt(total) for ii in range(ptr[row], ptr[row+1]): data[ii] /= total @cython.boundscheck(False) @cython.wraparound(False) cpdef double zcsr_one_norm(complex[::1] data, int[::1] ind, int[::1] ptr, int nrows, int ncols): cdef int k cdef size_t ii, jj cdef double * col_sum = PyDataMem_NEW(ncols * sizeof(double)) cdef double max_col = 0 memset(&col_sum[0],0,ncols * sizeof(double)) for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] col_sum[k] += cabs(data[jj]) for ii in range(ncols): if col_sum[ii] > max_col: max_col = col_sum[ii] PyDataMem_FREE(col_sum) return max_col @cython.boundscheck(False) @cython.wraparound(False) cpdef double zcsr_inf_norm(complex[::1] data, int[::1] ind, int[::1] ptr, int nrows, int ncols): cdef int k cdef size_t ii, jj cdef double * row_sum = PyDataMem_NEW(nrows * sizeof(double)) cdef double max_row = 0 memset(&row_sum[0],0,nrows * sizeof(double)) for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): row_sum[ii] += cabs(data[jj]) for ii in range(nrows): if row_sum[ii] > max_row: max_row = row_sum[ii] PyDataMem_FREE(row_sum) return max_row @cython.boundscheck(False) @cython.wraparound(False) cpdef bool cy_tidyup(complex[::1] data, double atol, unsigned int nnz): """ Performs an in-place tidyup of CSR matrix data """ cdef size_t kk cdef double re, im cdef bool re_flag, im_flag, out_flag = 0 for kk in range(nnz): re_flag = 0 im_flag = 0 re = real(data[kk]) im = imag(data[kk]) if fabs(re) < atol: re = 0 re_flag = 1 if fabs(im) < atol: im = 0 im_flag = 1 if re_flag or im_flag: data[kk] = re + 1j*im if re_flag and im_flag: out_flag = 1 return out_flag qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/spconvert.pxd000077500000000000000000000040001362723322000263340ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### from qiskit.providers.aer.pulse.qutip_lite.cy.sparse_structs cimport CSR_Matrix cdef void fdense2D_to_CSR(complex[::1, :] mat, CSR_Matrix * out, unsigned int nrows, unsigned int ncols) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/spconvert.pyx000077500000000000000000000216711362723322000263760ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### import numpy as np from qiskit.providers.aer.pulse.qutip_lite.fastsparse import fast_csr_matrix cimport numpy as cnp cimport cython from libc.stdlib cimport div, malloc, free cdef extern from "stdlib.h": ctypedef struct div_t: int quot int rem include "sparse_routines.pxi" @cython.boundscheck(False) @cython.wraparound(False) def arr_coo2fast(complex[::1] data, int[::1] rows, int[::1] cols, int nrows, int ncols): """ Converts a set of ndarrays (data, rows, cols) that specify a COO sparse matrix to CSR format. """ cdef int nnz = data.shape[0] cdef COO_Matrix mat mat.data = &data[0] mat.rows = &rows[0] mat.cols = &cols[0] mat.nrows = nrows mat.ncols = ncols mat.nnz = nnz mat.is_set = 1 mat.max_length = nnz cdef CSR_Matrix out COO_to_CSR(&out, &mat) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) def dense2D_to_fastcsr_cmode(complex[:, ::1] mat, int nrows, int ncols): """ Converts a dense c-mode complex ndarray to a sparse CSR matrix. Parameters ---------- mat : ndarray Input complex ndarray nrows : int Number of rows in matrix. ncols : int Number of cols in matrix. Returns ------- out : fast_csr_matrix Output matrix in CSR format. """ cdef int nnz = 0 cdef size_t ii, jj cdef np.ndarray[complex, ndim=1, mode='c'] data = np.zeros(nrows*ncols, dtype=complex) cdef np.ndarray[int, ndim=1, mode='c'] ind = np.zeros(nrows*ncols, dtype=np.int32) cdef np.ndarray[int, ndim=1, mode='c'] ptr = np.zeros(nrows+1, dtype=np.int32) for ii in range(nrows): for jj in range(ncols): if mat[ii,jj] != 0: ind[nnz] = jj data[nnz] = mat[ii,jj] nnz += 1 ptr[ii+1] = nnz if nnz < (nrows*ncols): return fast_csr_matrix((data[:nnz], ind[:nnz], ptr), shape=(nrows,ncols)) else: return fast_csr_matrix((data, ind, ptr), shape=(nrows,ncols)) @cython.boundscheck(False) @cython.wraparound(False) def dense1D_to_fastcsr_ket(complex[::1] vec): """ Converts a dense c-mode complex ndarray to a sparse CSR matrix. Parameters ---------- mat : ndarray Input complex ndarray Returns ------- out : fast_csr_matrix Output matrix in CSR format. """ cdef int nnz = 0 cdef size_t ii, nrows = vec.shape[0] cdef np.ndarray[complex, ndim=1, mode='c'] data = np.zeros(nrows, dtype=complex) cdef np.ndarray[int, ndim=1, mode='c'] ind = np.zeros(nrows, dtype=np.int32) cdef np.ndarray[int, ndim=1, mode='c'] ptr = np.zeros(nrows+1, dtype=np.int32) for ii in range(nrows): if vec[ii] != 0: data[nnz] = vec[ii] nnz += 1 ptr[ii+1] = nnz if nnz < (nrows): return fast_csr_matrix((data[:nnz], ind[:nnz], ptr), shape=(nrows,1)) else: return fast_csr_matrix((data, ind, ptr), shape=(nrows,1)) @cython.boundscheck(False) @cython.wraparound(False) cdef void fdense2D_to_CSR(complex[::1, :] mat, CSR_Matrix * out, unsigned int nrows, unsigned int ncols): """ Converts a dense complex ndarray to a CSR matrix struct. Parameters ---------- mat : ndarray Input complex ndarray nrows : int Number of rows in matrix. ncols : int Number of cols in matrix. Returns ------- out : CSR_Matrix Output matrix as CSR struct. """ cdef int nnz = 0 cdef size_t ii, jj init_CSR(out, nrows*ncols, nrows, ncols, nrows*ncols) for ii in range(nrows): for jj in range(ncols): if mat[ii,jj] != 0: out.indices[nnz] = jj out.data[nnz] = mat[ii,jj] nnz += 1 out.indptr[ii+1] = nnz if nnz < (nrows*ncols): shorten_CSR(out, nnz) @cython.boundscheck(False) @cython.wraparound(False) def dense2D_to_fastcsr_fmode(complex[::1, :] mat, int nrows, int ncols): """ Converts a dense fortran-mode complex ndarray to a sparse CSR matrix. Parameters ---------- mat : ndarray Input complex ndarray nrows : int Number of rows in matrix. ncols : int Number of cols in matrix. Returns ------- out : fast_csr_matrix Output matrix in CSR format. """ cdef int nnz = 0 cdef size_t ii, jj cdef np.ndarray[complex, ndim=1, mode='c'] data = np.zeros(nrows*ncols, dtype=complex) cdef np.ndarray[int, ndim=1, mode='c'] ind = np.zeros(nrows*ncols, dtype=np.int32) cdef np.ndarray[int, ndim=1, mode='c'] ptr = np.zeros(nrows+1, dtype=np.int32) for ii in range(nrows): for jj in range(ncols): if mat[ii,jj] != 0: ind[nnz] = jj data[nnz] = mat[ii,jj] nnz += 1 ptr[ii+1] = nnz if nnz < (nrows*ncols): return fast_csr_matrix((data[:nnz], ind[:nnz], ptr), shape=(nrows,ncols)) else: return fast_csr_matrix((data, ind, ptr), shape=(nrows,ncols)) @cython.boundscheck(False) @cython.wraparound(False) def zcsr_reshape(object A not None, int new_rows, int new_cols): """ Reshapes a complex CSR matrix. Parameters ---------- A : fast_csr_matrix Input CSR matrix. new_rows : int Number of rows in reshaped matrix. new_cols : int Number of cols in reshaped matrix. Returns ------- out : fast_csr_matrix Reshaped CSR matrix. Notes ----- This routine does not need to make a temp. copy of the matrix. """ cdef CSR_Matrix inmat = CSR_from_scipy(A) cdef COO_Matrix mat CSR_to_COO(&mat, &inmat) cdef CSR_Matrix out cdef div_t new_inds cdef size_t kk if (mat.nrows * mat.ncols) != (new_rows * new_cols): raise Exception('Total size of array must be unchanged.') for kk in range(mat.nnz): new_inds = div(mat.ncols*mat.rows[kk]+mat.cols[kk], new_cols) mat.rows[kk] = new_inds.quot mat.cols[kk] = new_inds.rem mat.nrows = new_rows mat.ncols = new_cols COO_to_CSR_inplace(&out, &mat) sort_indices(&out) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) @cython.cdivision(True) def cy_index_permute(int [::1] idx_arr, int [::1] dims, int [::1] order): cdef int ndims = dims.shape[0] cdef int ii, n, dim, idx, orderr #the fastest way to allocate memory for a temporary array cdef int * multi_idx = malloc(sizeof(int) * ndims) try: for ii from 0 <= ii < idx_arr.shape[0]: idx = idx_arr[ii] #First, decompose long index into multi-index for n from ndims > n >= 0: dim = dims[n] multi_idx[n] = idx % dim idx = idx // dim #Finally, assemble new long index from reordered multi-index dim = 1 idx = 0 for n from ndims > n >= 0: orderr = order[n] idx += multi_idx[orderr] * dim dim *= dims[orderr] idx_arr[ii] = idx finally: free(multi_idx) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/spmatfuncs.pxd000077500000000000000000000103541362723322000265050ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### cimport numpy as cnp cimport cython from libcpp cimport bool include "parameters.pxi" cpdef cnp.ndarray[CTYPE_t, ndim=1, mode="c"] spmv_csr(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1] vec) cdef void spmvpy(complex * data, int * ind, int * ptr, complex * vec, complex a, complex * out, unsigned int nrows) cpdef cy_expect_rho_vec_csr(complex[::1] data, int[::1] idx, int[::1] ptr, complex[::1] rho_vec, int herm) cpdef cy_expect_psi(object A, complex[::1] vec, bool isherm) cpdef cy_expect_psi_csr(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1] vec, bool isherm) cdef void _spmm_c_py(complex * data, int * ind, int * ptr, complex * mat, complex a, complex * out, unsigned int sp_rows, unsigned int nrows, unsigned int ncols) cpdef void spmmpy_c(complex[::1] data, int[::1] ind, int[::1] ptr, complex[:,::1] M, complex a, complex[:,::1] out) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmmc(object sparse, complex[:,::1] mat) cdef void _spmm_f_py(complex * data, int * ind, int * ptr, complex * mat, complex a, complex * out, unsigned int sp_rows, unsigned int nrows, unsigned int ncols) cpdef void spmmpy_f(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1,:] mat, complex a, complex[::1,:] out) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmmf(object sparse, complex[::1,:] mat) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmm(object sparse, cnp.ndarray[complex, ndim=2] mat) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/spmatfuncs.pyx000077500000000000000000000414451362723322000265370ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### import numpy as np cimport numpy as cnp cimport cython cimport libc.math from libcpp cimport bool cdef extern from "src/zspmv.hpp" nogil: void zspmvpy(double complex *data, int *ind, int *ptr, double complex *vec, double complex a, double complex *out, int nrows) include "complex_math.pxi" @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmv( object super_op, complex[::1] vec): """ Sparse matrix, dense vector multiplication. Here the vector is assumed to have one-dimension. Matrix must be in CSR format and have complex entries. Parameters ---------- super_op : csr matrix vec : array Dense vector for multiplication. Must be one-dimensional. Returns ------- out : array Returns dense array. """ return spmv_csr(super_op.data, super_op.indices, super_op.indptr, vec) @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmv_csr(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1] vec): """ Sparse matrix, dense vector multiplication. Here the vector is assumed to have one-dimension. Matrix must be in CSR format and have complex entries. Parameters ---------- data : array Data for sparse matrix. idx : array Indices for sparse matrix data. ptr : array Pointers for sparse matrix data. vec : array Dense vector for multiplication. Must be one-dimensional. Returns ------- out : array Returns dense array. """ cdef unsigned int num_rows = ptr.shape[0] - 1 cdef cnp.ndarray[complex, ndim=1, mode="c"] out = np.zeros((num_rows), dtype=np.complex) zspmvpy(&data[0], &ind[0], &ptr[0], &vec[0], 1.0, &out[0], num_rows) return out @cython.boundscheck(False) @cython.wraparound(False) def spmvpy_csr(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1] vec, complex alpha, complex[::1] out): """ Sparse matrix, dense vector multiplication. Here the vector is assumed to have one-dimension. Matrix must be in CSR format and have complex entries. Parameters ---------- data : array Data for sparse matrix. idx : array Indices for sparse matrix data. ptr : array Pointers for sparse matrix data. vec : array Dense vector for multiplication. Must be one-dimensional. alpha : complex Numerical coefficient for sparse matrix. out: array Output array """ cdef unsigned int num_rows = vec.shape[0] zspmvpy(&data[0], &ind[0], &ptr[0], &vec[0], alpha, &out[0], num_rows) @cython.boundscheck(False) @cython.wraparound(False) cdef inline void spmvpy(complex* data, int* ind, int* ptr, complex* vec, complex a, complex* out, unsigned int nrows): zspmvpy(data, ind, ptr, vec, a, out, nrows) @cython.boundscheck(False) @cython.wraparound(False) cdef void _spmm_c_py(complex* data, int* ind, int* ptr, complex* mat, complex a, complex* out, unsigned int sp_rows, unsigned int nrows, unsigned int ncols): """ sparse*dense "C" ordered. """ cdef int row, col, ii, jj, row_start, row_end for row from 0 <= row < sp_rows : row_start = ptr[row] row_end = ptr[row+1] for jj from row_start <= jj < row_end: for col in range(ncols): out[row * ncols + col] += a*data[jj]*mat[ind[jj] * ncols + col] cpdef void spmmpy_c(complex[::1] data, int[::1] ind, int[::1] ptr, complex[:,::1] M, complex a, complex[:,::1] out): """ Sparse matrix, c ordered dense matrix multiplication. The sparse matrix must be in CSR format and have complex entries. Parameters ---------- data : array Data for sparse matrix. idx : array Indices for sparse matrix data. ptr : array Pointers for sparse matrix data. mat : array 2d Dense matrix for multiplication. Must be in c mode. alpha : complex Numerical coefficient for sparse matrix. out: array Output array. Must be in c mode. """ cdef unsigned int sp_rows = ptr.shape[0]-1 cdef unsigned int nrows = M.shape[0] cdef unsigned int ncols = M.shape[1] _spmm_c_py(&data[0], &ind[0], &ptr[0], &M[0,0], 1., &out[0,0], sp_rows, nrows, ncols) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmmc(object sparse, complex[:,::1] mat): """ Sparse matrix, c ordered dense matrix multiplication. The sparse matrix must be in CSR format and have complex entries. Parameters ---------- sparse : csr matrix mat : array 2d Dense matrix for multiplication. Must be in c mode. Returns ------- out : array Keep input ordering """ cdef unsigned int sp_rows = sparse.indptr.shape[0]-1 cdef unsigned int ncols = mat.shape[1] cdef cnp.ndarray[complex, ndim=2, mode="c"] out = \ np.zeros((sp_rows, ncols), dtype=complex) spmmpy_c(sparse.data, sparse.indices, sparse.indptr, mat, 1., out) return out @cython.boundscheck(False) @cython.wraparound(False) cdef void _spmm_f_py(complex* data, int* ind, int* ptr, complex* mat, complex a, complex* out, unsigned int sp_rows, unsigned int nrows, unsigned int ncols): """ sparse*dense "F" ordered. """ cdef int col for col in range(ncols): spmvpy(data, ind, ptr, mat+nrows*col, a, out+sp_rows*col, sp_rows) cpdef void spmmpy_f(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1,:] mat, complex a, complex[::1,:] out): """ Sparse matrix, fortran ordered dense matrix multiplication. The sparse matrix must be in CSR format and have complex entries. Parameters ---------- data : array Data for sparse matrix. idx : array Indices for sparse matrix data. ptr : array Pointers for sparse matrix data. mat : array 2d Dense matrix for multiplication. Must be in fortran mode. alpha : complex Numerical coefficient for sparse matrix. out: array Output array. Must be in fortran mode. """ cdef unsigned int sp_rows = ptr.shape[0]-1 cdef unsigned int nrows = mat.shape[0] cdef unsigned int ncols = mat.shape[1] _spmm_f_py(&data[0], &ind[0], &ptr[0], &mat[0,0], 1., &out[0,0], sp_rows, nrows, ncols) cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmmf(object sparse, complex[::1,:] mat): """ Sparse matrix, fortran ordered dense matrix multiplication. The sparse matrix must be in CSR format and have complex entries. Parameters ---------- sparse : csr matrix mat : array 2d Dense matrix for multiplication. Must be in fortran mode. Returns ------- out : array Keep input ordering """ cdef unsigned int sp_rows = sparse.indptr.shape[0]-1 cdef unsigned int ncols = mat.shape[1] cdef cnp.ndarray[complex, ndim=2, mode="fortran"] out = \ np.zeros((sp_rows, ncols), dtype=complex, order="F") spmmpy_f(sparse.data, sparse.indices, sparse.indptr, mat, 1., out) return out cpdef cnp.ndarray[complex, ndim=1, mode="c"] spmm(object sparse, cnp.ndarray[complex, ndim=2] mat): """ Sparse matrix, dense matrix multiplication. The sparse matrix must be in CSR format and have complex entries. Parameters ---------- sparse : csr matrix mat : array 2d Dense matrix for multiplication. Can be in c or fortran mode. Returns ------- out : array Keep input ordering """ if mat.flags["F_CONTIGUOUS"]: return spmmf(sparse, mat) else: return spmmc(sparse, mat) @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode="c"] cy_ode_rhs( double t, complex[::1] rho, complex[::1] data, int[::1] ind, int[::1] ptr): cdef unsigned int nrows = rho.shape[0] cdef cnp.ndarray[complex, ndim=1, mode="c"] out = \ np.zeros(nrows, dtype=complex) zspmvpy(&data[0], &ind[0], &ptr[0], &rho[0], 1.0, &out[0], nrows) return out @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode="c"] cy_ode_psi_func_td( double t, cnp.ndarray[complex, ndim=1, mode="c"] psi, object H_func, object args): H = H_func(t, args).data return -1j * spmv_csr(H.data, H.indices, H.indptr, psi) @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode="c"] cy_ode_psi_func_td_with_state( double t, cnp.ndarray[complex, ndim=1, mode="c"] psi, object H_func, object args): H = H_func(t, psi, args) return -1j * spmv_csr(H.data, H.indices, H.indptr, psi) @cython.boundscheck(False) @cython.wraparound(False) cpdef cnp.ndarray[complex, ndim=1, mode="c"] cy_ode_rho_func_td( double t, cnp.ndarray[complex, ndim=1, mode="c"] rho, object L0, object L_func, object args): cdef object L L = L0 + L_func(t, args).data return spmv_csr(L.data, L.indices, L.indptr, rho) @cython.boundscheck(False) @cython.wraparound(False) cpdef cy_expect_psi(object A, complex[::1] vec, bool isherm): cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef size_t row, jj cdef int nrows = vec.shape[0] cdef complex expt = 0, temp, cval for row in range(nrows): cval = conj(vec[row]) temp = 0 for jj in range(ptr[row], ptr[row+1]): temp += data[jj]*vec[ind[jj]] expt += cval*temp if isherm : return real(expt) else: return expt @cython.boundscheck(False) @cython.wraparound(False) cpdef cy_expect_psi_csr(complex[::1] data, int[::1] ind, int[::1] ptr, complex[::1] vec, bool isherm): cdef size_t row, jj cdef int nrows = vec.shape[0] cdef complex expt = 0, temp, cval for row in range(nrows): cval = conj(vec[row]) temp = 0 for jj in range(ptr[row], ptr[row+1]): temp += data[jj]*vec[ind[jj]] expt += cval*temp if isherm : return real(expt) else: return expt @cython.boundscheck(False) @cython.wraparound(False) cpdef cy_expect_rho_vec(object super_op, complex[::1] rho_vec, int herm): return cy_expect_rho_vec_csr(super_op.data, super_op.indices, super_op.indptr, rho_vec, herm) @cython.boundscheck(False) @cython.wraparound(False) cpdef cy_expect_rho_vec_csr(complex[::1] data, int[::1] idx, int[::1] ptr, complex[::1] rho_vec, int herm): cdef size_t row cdef int jj,row_start,row_end cdef int num_rows = rho_vec.shape[0] cdef int n = libc.math.sqrt(num_rows) cdef complex dot = 0.0 for row from 0 <= row < num_rows by n+1: row_start = ptr[row] row_end = ptr[row+1] for jj from row_start <= jj < row_end: dot += data[jj]*rho_vec[idx[jj]] if herm == 0: return dot else: return real(dot) @cython.boundscheck(False) @cython.wraparound(False) cpdef cy_spmm_tr(object op1, object op2, int herm): cdef size_t row cdef complex tr = 0.0 cdef int col1, row1_idx_start, row1_idx_end cdef complex[::1] data1 = op1.data cdef int[::1] idx1 = op1.indices cdef int[::1] ptr1 = op1.indptr cdef int col2, row2_idx_start, row2_idx_end cdef complex[::1] data2 = op2.data cdef int[::1] idx2 = op2.indices cdef int[::1] ptr2 = op2.indptr cdef int num_rows = ptr1.shape[0]-1 for row in range(num_rows): row1_idx_start = ptr1[row] row1_idx_end = ptr1[row + 1] for row1_idx from row1_idx_start <= row1_idx < row1_idx_end: col1 = idx1[row1_idx] row2_idx_start = ptr2[col1] row2_idx_end = ptr2[col1 + 1] for row2_idx from row2_idx_start <= row2_idx < row2_idx_end: col2 = idx2[row2_idx] if col2 == row: tr += data1[row1_idx] * data2[row2_idx] break if herm == 0: return tr else: return real(tr) @cython.boundscheck(False) @cython.wraparound(False) def expect_csr_ket(object A, object B, int isherm): cdef complex[::1] Adata = A.data cdef int[::1] Aind = A.indices cdef int[::1] Aptr = A.indptr cdef complex[::1] Bdata = B.data cdef int[::1] Bptr = B.indptr cdef int nrows = A.shape[0] cdef int j cdef size_t ii, jj cdef double complex cval=0, row_sum, expt = 0 for ii in range(nrows): if (Bptr[ii+1] - Bptr[ii]) != 0: cval = conj(Bdata[Bptr[ii]]) row_sum = 0 for jj in range(Aptr[ii], Aptr[ii+1]): j = Aind[jj] if (Bptr[j+1] - Bptr[j]) != 0: row_sum += Adata[jj]*Bdata[Bptr[j]] expt += cval*row_sum if isherm: return real(expt) else: return expt @cython.boundscheck(False) @cython.wraparound(False) cpdef double complex zcsr_mat_elem(object A, object left, object right, bool bra_ket=1): """ Computes the matrix element for an operator A and left and right vectors. right must be a ket, but left can be a ket or bra vector. If left is bra then bra_ket = 1, else set bra_ket = 0. """ cdef complex[::1] Adata = A.data cdef int[::1] Aind = A.indices cdef int[::1] Aptr = A.indptr cdef int nrows = A.shape[0] cdef complex[::1] Ldata = left.data cdef int[::1] Lind = left.indices cdef int[::1] Lptr = left.indptr cdef int Lnnz = Lind.shape[0] cdef complex[::1] Rdata = right.data cdef int[::1] Rind = right.indices cdef int[::1] Rptr = right.indptr cdef int j, go, head=0 cdef size_t ii, jj, kk cdef double complex cval=0, row_sum, mat_elem=0 for ii in range(nrows): row_sum = 0 go = 0 if bra_ket: for kk in range(head, Lnnz): if Lind[kk] == ii: cval = Ldata[kk] head = kk go = 1 else: if (Lptr[ii] - Lptr[ii+1]) != 0: cval = conj(Ldata[Lptr[ii]]) go = 1 if go: for jj in range(Aptr[ii], Aptr[ii+1]): j = Aind[jj] if (Rptr[j] - Rptr[j+1]) != 0: row_sum += Adata[jj]*Rdata[Rptr[j]] mat_elem += cval*row_sum return mat_elem qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/spmath.pxd000077500000000000000000000054131362723322000256160ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### from qiskit.providers.aer.pulse.qutip_lite.cy.sparse_structs cimport CSR_Matrix cdef void _zcsr_add(CSR_Matrix * A, CSR_Matrix * B, CSR_Matrix * C, double complex alpha) cdef int _zcsr_add_core(double complex * Adata, int * Aind, int * Aptr, double complex * Bdata, int * Bind, int * Bptr, double complex alpha, CSR_Matrix * C, int nrows, int ncols) nogil cdef void _zcsr_mult(CSR_Matrix * A, CSR_Matrix * B, CSR_Matrix * C) cdef void _zcsr_kron(CSR_Matrix * A, CSR_Matrix * B, CSR_Matrix * C) cdef void _zcsr_kron_core(double complex * dataA, int * indsA, int * indptrA, double complex * dataB, int * indsB, int * indptrB, CSR_Matrix * out, int rowsA, int rowsB, int colsB) nogil cdef void _zcsr_transpose(CSR_Matrix * A, CSR_Matrix * B) cdef void _zcsr_adjoint(CSR_Matrix * A, CSR_Matrix * B) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/spmath.pyx000077500000000000000000000541321362723322000256450ustar00rootroot00000000000000#!python #cython: language_level=3 # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### import numpy as np cimport numpy as cnp cimport cython from libcpp cimport bool from libc.string cimport memset cdef extern from "" namespace "std" nogil: double complex conj(double complex x) double real(double complex) double imag(double complex) double abs(double complex) include "sparse_routines.pxi" @cython.boundscheck(False) @cython.wraparound(False) def zcsr_add(complex[::1] dataA, int[::1] indsA, int[::1] indptrA, complex[::1] dataB, int[::1] indsB, int[::1] indptrB, int nrows, int ncols, int Annz, int Bnnz, double complex alpha = 1): """ Adds two sparse CSR matries. Like SciPy, we assume the worse case for the fill A.nnz + B.nnz. """ cdef int worse_fill = Annz + Bnnz cdef int nnz #Both matrices are zero mats if Annz == 0 and Bnnz == 0: return fast_csr_matrix(([], [], []), shape=(nrows,ncols)) #A is the zero matrix elif Annz == 0: return fast_csr_matrix((alpha*np.asarray(dataB), indsB, indptrB), shape=(nrows,ncols)) #B is the zero matrix elif Bnnz == 0: return fast_csr_matrix((dataA, indsA, indptrA), shape=(nrows,ncols)) # Out CSR_Matrix cdef CSR_Matrix out init_CSR(&out, worse_fill, nrows, ncols, worse_fill) nnz = _zcsr_add_core(&dataA[0], &indsA[0], &indptrA[0], &dataB[0], &indsB[0], &indptrB[0], alpha, &out, nrows, ncols) #Shorten data and indices if needed if out.nnz > nnz: shorten_CSR(&out, nnz) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_add(CSR_Matrix * A, CSR_Matrix * B, CSR_Matrix * C, double complex alpha): """ Adds two sparse CSR matries. Like SciPy, we assume the worse case for the fill A.nnz + B.nnz. """ cdef int worse_fill = A.nnz + B.nnz cdef int nrows = A.nrows cdef int ncols = A.ncols cdef int nnz init_CSR(C, worse_fill, nrows, ncols, worse_fill) nnz = _zcsr_add_core(A.data, A.indices, A.indptr, B.data, B.indices, B.indptr, alpha, C, nrows, ncols) #Shorten data and indices if needed if C.nnz > nnz: shorten_CSR(C, nnz) @cython.boundscheck(False) @cython.wraparound(False) cdef int _zcsr_add_core(double complex * Adata, int * Aind, int * Aptr, double complex * Bdata, int * Bind, int * Bptr, double complex alpha, CSR_Matrix * C, int nrows, int ncols) nogil: cdef int j1, j2, kc = 0 cdef int ka, kb, ka_max, kb_max cdef size_t ii cdef double complex tmp C.indptr[0] = 0 if alpha != 1: for ii in range(nrows): ka = Aptr[ii] kb = Bptr[ii] ka_max = Aptr[ii+1]-1 kb_max = Bptr[ii+1]-1 while (ka <= ka_max) or (kb <= kb_max): if ka <= ka_max: j1 = Aind[ka] else: j1 = ncols+1 if kb <= kb_max: j2 = Bind[kb] else: j2 = ncols+1 if j1 == j2: tmp = Adata[ka] + alpha*Bdata[kb] if tmp != 0: C.data[kc] = tmp C.indices[kc] = j1 kc += 1 ka += 1 kb += 1 elif j1 < j2: C.data[kc] = Adata[ka] C.indices[kc] = j1 ka += 1 kc += 1 elif j1 > j2: C.data[kc] = alpha*Bdata[kb] C.indices[kc] = j2 kb += 1 kc += 1 C.indptr[ii+1] = kc else: for ii in range(nrows): ka = Aptr[ii] kb = Bptr[ii] ka_max = Aptr[ii+1]-1 kb_max = Bptr[ii+1]-1 while (ka <= ka_max) or (kb <= kb_max): if ka <= ka_max: j1 = Aind[ka] else: j1 = ncols+1 if kb <= kb_max: j2 = Bind[kb] else: j2 = ncols+1 if j1 == j2: tmp = Adata[ka] + Bdata[kb] if tmp != 0: C.data[kc] = tmp C.indices[kc] = j1 kc += 1 ka += 1 kb += 1 elif j1 < j2: C.data[kc] = Adata[ka] C.indices[kc] = j1 ka += 1 kc += 1 elif j1 > j2: C.data[kc] = Bdata[kb] C.indices[kc] = j2 kb += 1 kc += 1 C.indptr[ii+1] = kc return kc @cython.boundscheck(False) @cython.wraparound(False) def zcsr_mult(object A, object B, int sorted = 1): cdef complex [::1] dataA = A.data cdef int[::1] indsA = A.indices cdef int[::1] indptrA = A.indptr cdef int Annz = A.nnz cdef complex [::1] dataB = B.data cdef int[::1] indsB = B.indices cdef int[::1] indptrB = B.indptr cdef int Bnnz = B.nnz cdef int nrows = A.shape[0] cdef int ncols = B.shape[1] #Both matrices are zero mats if Annz == 0 or Bnnz == 0: return fast_csr_matrix(shape=(nrows,ncols)) cdef int nnz cdef CSR_Matrix out nnz = _zcsr_mult_pass1(&dataA[0], &indsA[0], &indptrA[0], &dataB[0], &indsB[0], &indptrB[0], nrows, ncols) if nnz == 0: return fast_csr_matrix(shape=(nrows,ncols)) init_CSR(&out, nnz, nrows, ncols) _zcsr_mult_pass2(&dataA[0], &indsA[0], &indptrA[0], &dataB[0], &indsB[0], &indptrB[0], &out, nrows, ncols) #Shorten data and indices if needed if out.nnz > out.indptr[out.nrows]: shorten_CSR(&out, out.indptr[out.nrows]) if sorted: sort_indices(&out) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_mult(CSR_Matrix * A, CSR_Matrix * B, CSR_Matrix * C): nnz = _zcsr_mult_pass1(A.data, A.indices, A.indptr, B.data, B.indices, B.indptr, A.nrows, B.ncols) init_CSR(C, nnz, A.nrows, B.ncols) _zcsr_mult_pass2(A.data, A.indices, A.indptr, B.data, B.indices, B.indptr, C, A.nrows, B.ncols) #Shorten data and indices if needed if C.nnz > C.indptr[C.nrows]: shorten_CSR(C, C.indptr[C.nrows]) sort_indices(C) @cython.boundscheck(False) @cython.wraparound(False) cdef int _zcsr_mult_pass1(double complex * Adata, int * Aind, int * Aptr, double complex * Bdata, int * Bind, int * Bptr, int nrows, int ncols) nogil: cdef int j, k, nnz = 0 cdef size_t ii,jj,kk #Setup mask array cdef int * mask = PyDataMem_NEW(ncols*sizeof(int)) for ii in range(ncols): mask[ii] = -1 #Pass 1 for ii in range(nrows): for jj in range(Aptr[ii], Aptr[ii+1]): j = Aind[jj] for kk in range(Bptr[j], Bptr[j+1]): k = Bind[kk] if mask[k] != ii: mask[k] = ii nnz += 1 PyDataMem_FREE(mask) return nnz @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_mult_pass2(double complex * Adata, int * Aind, int * Aptr, double complex * Bdata, int * Bind, int * Bptr, CSR_Matrix * C, int nrows, int ncols) nogil: cdef int head, length, temp, j, k, nnz = 0 cdef size_t ii,jj,kk cdef double complex val cdef double complex * sums = PyDataMem_NEW(ncols * sizeof(double complex)) cdef int * nxt = PyDataMem_NEW(ncols*sizeof(int)) memset(&sums[0],0,ncols * sizeof(double complex)) for ii in range(ncols): nxt[ii] = -1 C.indptr[0] = 0 for ii in range(nrows): head = -2 length = 0 for jj in range(Aptr[ii], Aptr[ii+1]): j = Aind[jj] val = Adata[jj] for kk in range(Bptr[j], Bptr[j+1]): k = Bind[kk] sums[k] += val*Bdata[kk] if nxt[k] == -1: nxt[k] = head head = k length += 1 for jj in range(length): if sums[head] != 0: C.indices[nnz] = head C.data[nnz] = sums[head] nnz += 1 temp = head head = nxt[head] nxt[temp] = -1 sums[temp] = 0 C.indptr[ii+1] = nnz #Free temp arrays PyDataMem_FREE(sums) PyDataMem_FREE(nxt) @cython.boundscheck(False) @cython.wraparound(False) def zcsr_kron(object A, object B): """ Computes the kronecker product between two complex sparse matrices in CSR format. """ cdef complex[::1] dataA = A.data cdef int[::1] indsA = A.indices cdef int[::1] indptrA = A.indptr cdef int rowsA = A.shape[0] cdef int colsA = A.shape[1] cdef complex[::1] dataB = B.data cdef int[::1] indsB = B.indices cdef int[::1] indptrB = B.indptr cdef int rowsB = B.shape[0] cdef int colsB = B.shape[1] cdef int out_nnz = _safe_multiply(dataA.shape[0], dataB.shape[0]) cdef int rows_out = rowsA * rowsB cdef int cols_out = colsA * colsB cdef CSR_Matrix out init_CSR(&out, out_nnz, rows_out, cols_out) _zcsr_kron_core(&dataA[0], &indsA[0], &indptrA[0], &dataB[0], &indsB[0], &indptrB[0], &out, rowsA, rowsB, colsB) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_kron(CSR_Matrix * A, CSR_Matrix * B, CSR_Matrix * C): """ Computes the kronecker product between two complex sparse matrices in CSR format. """ cdef int out_nnz = _safe_multiply(A.nnz, B.nnz) cdef int rows_out = A.nrows * B.nrows cdef int cols_out = A.ncols * B.ncols init_CSR(C, out_nnz, rows_out, cols_out) _zcsr_kron_core(A.data, A.indices, A.indptr, B.data, B.indices, B.indptr, C, A.nrows, B.nrows, B.ncols) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_kron_core(double complex * dataA, int * indsA, int * indptrA, double complex * dataB, int * indsB, int * indptrB, CSR_Matrix * out, int rowsA, int rowsB, int colsB) nogil: cdef size_t ii, jj, ptrA, ptr cdef int row = 0 cdef int ptr_start, ptr_end cdef int row_startA, row_endA, row_startB, row_endB, distA, distB, ptrB for ii in range(rowsA): row_startA = indptrA[ii] row_endA = indptrA[ii+1] distA = row_endA - row_startA for jj in range(rowsB): row_startB = indptrB[jj] row_endB = indptrB[jj+1] distB = row_endB - row_startB ptr_start = out.indptr[row] ptr_end = ptr_start + distB out.indptr[row+1] = out.indptr[row] + distA * distB row += 1 for ptrA in range(row_startA, row_endA): ptrB = row_startB for ptr in range(ptr_start, ptr_end): out.indices[ptr] = indsA[ptrA] * colsB + indsB[ptrB] out.data[ptr] = dataA[ptrA] * dataB[ptrB] ptrB += 1 ptr_start += distB ptr_end += distB @cython.boundscheck(False) @cython.wraparound(False) def zcsr_transpose(object A): """ Transpose of a sparse matrix in CSR format. """ cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows = A.shape[0] cdef int ncols = A.shape[1] cdef CSR_Matrix out init_CSR(&out, data.shape[0], ncols, nrows) _zcsr_trans_core(&data[0], &ind[0], &ptr[0], &out, nrows, ncols) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_transpose(CSR_Matrix * A, CSR_Matrix * B): """ Transpose of a sparse matrix in CSR format. """ init_CSR(B, A.nnz, A.ncols, A.nrows) _zcsr_trans_core(A.data, A.indices, A.indptr, B, A.nrows, A.ncols) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_trans_core(double complex * data, int * ind, int * ptr, CSR_Matrix * out, int nrows, int ncols) nogil: cdef int k, nxt cdef size_t ii, jj for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] + 1 out.indptr[k] += 1 for ii in range(ncols): out.indptr[ii+1] += out.indptr[ii] for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] nxt = out.indptr[k] out.data[nxt] = data[jj] out.indices[nxt] = ii out.indptr[k] = nxt + 1 for ii in range(ncols,0,-1): out.indptr[ii] = out.indptr[ii-1] out.indptr[0] = 0 @cython.boundscheck(False) @cython.wraparound(False) def zcsr_adjoint(object A): """ Adjoint of a sparse matrix in CSR format. """ cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows = A.shape[0] cdef int ncols = A.shape[1] cdef CSR_Matrix out init_CSR(&out, data.shape[0], ncols, nrows) _zcsr_adjoint_core(&data[0], &ind[0], &ptr[0], &out, nrows, ncols) return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_adjoint(CSR_Matrix * A, CSR_Matrix * B): """ Adjoint of a sparse matrix in CSR format. """ init_CSR(B, A.nnz, A.ncols, A.nrows) _zcsr_adjoint_core(A.data, A.indices, A.indptr, B, A.nrows, A.ncols) @cython.boundscheck(False) @cython.wraparound(False) cdef void _zcsr_adjoint_core(double complex * data, int * ind, int * ptr, CSR_Matrix * out, int nrows, int ncols) nogil: cdef int k, nxt cdef size_t ii, jj for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] + 1 out.indptr[k] += 1 for ii in range(ncols): out.indptr[ii+1] += out.indptr[ii] for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] nxt = out.indptr[k] out.data[nxt] = conj(data[jj]) out.indices[nxt] = ii out.indptr[k] = nxt + 1 for ii in range(ncols,0,-1): out.indptr[ii] = out.indptr[ii-1] out.indptr[0] = 0 @cython.boundscheck(False) @cython.wraparound(False) def zcsr_isherm(object A not None, double tol = 1e-12): """ Determines if a given input sparse CSR matrix is Hermitian to within a specified floating-point tolerance. Parameters ---------- A : csr_matrix Input sparse matrix. tol : float (default is atol from settings) Desired tolerance value. Returns ------- isherm : int One if matrix is Hermitian, zero otherwise. Notes ----- This implimentation is esentially an adjoint calulation where the data and indices are not stored, but checked elementwise to see if they match those of the input matrix. Thus we do not need to build the actual adjoint. Here we only need a temp array of output indptr. """ cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows = A.shape[0] cdef int ncols = A.shape[1] cdef int k, nxt, isherm = 1 cdef size_t ii, jj cdef complex tmp, tmp2 if nrows != ncols: return 0 cdef int * out_ptr = PyDataMem_NEW( (ncols+1) * sizeof(int)) memset(&out_ptr[0],0,(ncols+1) * sizeof(int)) for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] + 1 out_ptr[k] += 1 for ii in range(nrows): out_ptr[ii+1] += out_ptr[ii] for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): k = ind[jj] nxt = out_ptr[k] out_ptr[k] += 1 #structure test if ind[nxt] != ii: isherm = 0 break tmp = conj(data[jj]) tmp2 = data[nxt] #data test if abs(tmp-tmp2) > tol: isherm = 0 break else: continue break PyDataMem_FREE(out_ptr) return isherm @cython.overflowcheck(True) cdef _safe_multiply(int A, int B): """ Computes A*B and checks for overflow. """ cdef int C = A*B return C @cython.boundscheck(False) @cython.wraparound(False) def zcsr_trace(object A, bool isherm): cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows = ptr.shape[0]-1 cdef size_t ii, jj cdef complex tr = 0 for ii in range(nrows): for jj in range(ptr[ii], ptr[ii+1]): if ind[jj] == ii: tr += data[jj] break if imag(tr) == 0 or isherm: return real(tr) else: return tr @cython.boundscheck(False) @cython.wraparound(False) def zcsr_proj(object A, bool is_ket=1): """ Computes the projection operator from a given ket or bra vector in CSR format. The flag 'is_ket' is True if passed a ket. This is ~3x faster than doing the conjugate transpose and sparse multiplication directly. Also, does not need a temp matrix. """ cdef complex[::1] data = A.data cdef int[::1] ind = A.indices cdef int[::1] ptr = A.indptr cdef int nrows cdef int nnz cdef int offset = 0, new_idx, count, change_idx cdef size_t jj, kk if is_ket: nrows = A.shape[0] nnz = ptr[nrows] else: nrows = A.shape[1] nnz = ptr[1] cdef CSR_Matrix out init_CSR(&out, nnz**2, nrows) if is_ket: #Compute new ptrs and inds for jj in range(nrows): out.indptr[jj] = ptr[jj]*nnz if ptr[jj+1] != ptr[jj]: new_idx = jj for kk in range(nnz): out.indices[offset+kk*nnz] = new_idx offset += 1 #set nnz in new ptr out.indptr[nrows] = nnz**2 #Compute the data for jj in range(nnz): for kk in range(nnz): out.data[jj*nnz+kk] = data[jj]*conj(data[kk]) else: count = nnz**2 new_idx = nrows for kk in range(nnz-1,-1,-1): for jj in range(nnz-1,-1,-1): out.indices[offset+jj] = ind[jj] out.data[kk*nnz+jj] = conj(data[kk])*data[jj] offset += nnz change_idx = ind[kk] while new_idx > change_idx: out.indptr[new_idx] = count new_idx -= 1 count -= nnz return CSR_to_scipy(&out) @cython.boundscheck(False) @cython.wraparound(False) def zcsr_inner(object A, object B, bool bra_ket): """ Computes the inner-product between ket-ket, or bra-ket vectors in sparse CSR format. """ cdef complex[::1] a_data = A.data cdef int[::1] a_ind = A.indices cdef int[::1] a_ptr = A.indptr cdef complex[::1] b_data = B.data cdef int[::1] b_ind = B.indices cdef int[::1] b_ptr = B.indptr cdef int nrows = B.shape[0] cdef double complex inner = 0 cdef size_t jj, kk cdef int a_idx, b_idx if bra_ket: for kk in range(a_ind.shape[0]): a_idx = a_ind[kk] for jj in range(nrows): if (b_ptr[jj+1]-b_ptr[jj]) != 0: if jj == a_idx: inner += a_data[kk]*b_data[b_ptr[jj]] break else: for kk in range(nrows): a_idx = a_ptr[kk] b_idx = b_ptr[kk] if (a_ptr[kk+1]-a_idx) != 0: if (b_ptr[kk+1]-b_idx) != 0: inner += conj(a_data[a_idx])*b_data[b_idx] return inner qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/src/000077500000000000000000000000001362723322000243665ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/src/zspmv.cpp000077500000000000000000000161771362723322000262700ustar00rootroot00000000000000// This file is part of QuTiP: Quantum Toolbox in Python. // // Copyright (c) 2011 and later, QuSTaR. // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names // of its contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //############################################################################# #include #if defined(__GNUC__) && defined(__SSE3__) // Using GCC or CLANG and SSE3 #include void zspmvpy(const std::complex * __restrict__ data, const int * __restrict__ ind, const int * __restrict__ ptr, const std::complex * __restrict__ vec, const std::complex a, std::complex * __restrict__ out, const unsigned int nrows) { size_t row, jj; unsigned int row_start, row_end; __m128d num1, num2, num3, num4; for (row=0; row < nrows; row++) { num4 = _mm_setzero_pd(); row_start = ptr[row]; row_end = ptr[row+1]; for (jj=row_start; jj (data[jj])[0]); num2 = _mm_set_pd(std::imag(vec[ind[jj]]),std::real(vec[ind[jj]])); num3 = _mm_mul_pd(num2, num1); num1 = _mm_loaddup_pd(&reinterpret_cast(data[jj])[1]); num2 = _mm_shuffle_pd(num2, num2, 1); num2 = _mm_mul_pd(num2, num1); num3 = _mm_addsub_pd(num3, num2); num4 = _mm_add_pd(num3, num4); } num1 = _mm_loaddup_pd(&reinterpret_cast(a)[0]); num3 = _mm_mul_pd(num4, num1); num1 = _mm_loaddup_pd(&reinterpret_cast(a)[1]); num4 = _mm_shuffle_pd(num4, num4, 1); num4 = _mm_mul_pd(num4, num1); num3 = _mm_addsub_pd(num3, num4); num2 = _mm_loadu_pd((double *)&out[row]); num3 = _mm_add_pd(num2, num3); _mm_storeu_pd((double *)&out[row], num3); } } #elif defined(__GNUC__) // Using GCC or CLANG but no SSE3 void zspmvpy(const std::complex * __restrict__ data, const int * __restrict__ ind, const int * __restrict__ ptr, const std::complex * __restrict__ vec, const std::complex a, std::complex * __restrict__ out, const unsigned int nrows) { size_t row, jj; unsigned int row_start, row_end; std::complex dot; for (row=0; row < nrows; row++) { dot = 0; row_start = ptr[row]; row_end = ptr[row+1]; for (jj=row_start; jj void zspmvpy(const std::complex * __restrict data, const int * __restrict ind, const int * __restrict ptr, const std::complex * __restrict vec, const std::complex a, std::complex * __restrict out, const unsigned int nrows) { size_t row, jj; unsigned int row_start, row_end; __m128d num1, num2, num3, num4; for (row=0; row < nrows; row++) { num4 = _mm_setzero_pd(); row_start = ptr[row]; row_end = ptr[row+1]; for (jj=row_start; jj (data[jj])[0]); num2 = _mm_set_pd(std::imag(vec[ind[jj]]),std::real(vec[ind[jj]])); num3 = _mm_mul_pd(num2, num1); num1 = _mm_loaddup_pd(&reinterpret_cast(data[jj])[1]); num2 = _mm_shuffle_pd(num2, num2, 1); num2 = _mm_mul_pd(num2, num1); num3 = _mm_addsub_pd(num3, num2); num4 = _mm_add_pd(num3, num4); } num1 = _mm_loaddup_pd(&reinterpret_cast(a)[0]); num3 = _mm_mul_pd(num4, num1); num1 = _mm_loaddup_pd(&reinterpret_cast(a)[1]); num4 = _mm_shuffle_pd(num4, num4, 1); num4 = _mm_mul_pd(num4, num1); num3 = _mm_addsub_pd(num3, num4); num2 = _mm_loadu_pd((double *)&out[row]); num3 = _mm_add_pd(num2, num3); _mm_storeu_pd((double *)&out[row], num3); } } #elif defined(_MSC_VER) // Visual Studio no AVX void zspmvpy(const std::complex * __restrict data, const int * __restrict ind, const int * __restrict ptr, const std::complex * __restrict vec, const std::complex a, std::complex * __restrict out, const unsigned int nrows) { size_t row, jj; unsigned int row_start, row_end; std::complex dot; for (row=0; row < nrows; row++) { dot = 0; row_start = ptr[row]; row_end = ptr[row+1]; for (jj=row_start; jj * data, const int * ind, const int * ptr, const std::complex * vec, const std::complex a, std::complex * out, const unsigned int nrows) { size_t row, jj; unsigned int row_start, row_end; std::complex dot; for (row=0; row < nrows; row++) { dot = 0; row_start = ptr[row]; row_end = ptr[row+1]; for (jj=row_start; jj #ifdef __GNUC__ void zspmvpy(const std::complex * __restrict__ data, const int * __restrict__ ind, const int *__restrict__ ptr, const std::complex * __restrict__ vec, const std::complex a, std::complex * __restrict__ out, const unsigned int nrows); #elif defined(_MSC_VER) void zspmvpy(const std::complex * __restrict data, const int * __restrict ind, const int *__restrict ptr, const std::complex * __restrict vec, const std::complex a, std::complex * __restrict out, const unsigned int nrows); #else void zspmvpy(const std::complex * data, const int * ind, const int * ptr, const std::complex * vec, const std::complex a, std::complex * out, const unsigned int nrows); #endifqiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/cy/utilities.py000077500000000000000000000057151362723322000261770ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name, no-name-in-module, import-error """Cython utilities""" import os def _cython_build_cleanup(tdname, build_dir=None): """Cleanup cython build files """ if build_dir is None: build_dir = os.path.join(os.path.expanduser('~'), '.pyxbld') # Remove tdname.pyx pyx_file = tdname + ".pyx" try: os.remove(pyx_file) except OSError: pass # Remove temp build files for dirpath, _, files in os.walk(build_dir): for file in files: if file.startswith(tdname): try: os.remove(os.path.join(dirpath, file)) except OSError: pass qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/dimensions.py000077500000000000000000000147361362723322000257240ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """ Internal use module for manipulating dims specifications. """ __all__ = [] # Everything should be explicitly imported, not made available # by default. import numpy as np def flatten(l): """Flattens a list of lists to the first level. Given a list containing a mix of scalars and lists, flattens down to a list of the scalars within the original list. Args: l (list): Input list Returns: list: Flattened list. """ if not isinstance(l, list): return [l] else: return sum(map(flatten, l), []) def is_scalar(dims): """ Returns True if a dims specification is effectively a scalar (has dimension 1). """ return np.prod(flatten(dims)) == 1 def is_vector(dims): """Is a vector""" return ( isinstance(dims, list) and isinstance(dims[0], (int, np.integer)) ) def is_vectorized_oper(dims): """Is a vectorized operator.""" return ( isinstance(dims, list) and isinstance(dims[0], list) ) # pylint: disable=too-many-return-statements def type_from_dims(dims, enforce_square=True): """Get the type of operator from dims structure""" bra_like, ket_like = map(is_scalar, dims) if bra_like: if is_vector(dims[1]): return 'bra' elif is_vectorized_oper(dims[1]): return 'operator-bra' if ket_like: if is_vector(dims[0]): return 'ket' elif is_vectorized_oper(dims[0]): return 'operator-ket' elif is_vector(dims[0]) and (dims[0] == dims[1] or not enforce_square): return 'oper' elif ( is_vectorized_oper(dims[0]) and ( ( dims[0] == dims[1] and dims[0][0] == dims[1][0] ) or not enforce_square ) ): return 'super' return 'other' def _enumerate_flat(l, idx=0): if not isinstance(l, list): # Found a scalar, so return and increment. return idx, idx + 1 else: # Found a list, so append all the scalars # from it and recurse to keep the increment # correct. acc = [] for elem in l: labels, idx = _enumerate_flat(elem, idx) acc.append(labels) return acc, idx def _collapse_composite_index(dims): """ Given the dimensions specification for a composite index (e.g.: [2, 3] for the right index of a ket with dims [[1], [2, 3]]), returns a dimensions specification for an index of the same shape, but collapsed to a single "leg." In the previous example, [2, 3] would collapse to [6]. """ return [np.prod(dims)] def _collapse_dims_to_level(dims, level=1): """ Recursively collapses all indices in a dimensions specification appearing at a given level, such that the returned dimensions specification does not represent any composite systems. """ if level == 0: return _collapse_composite_index(dims) else: return [_collapse_dims_to_level(index, level=level - 1) for index in dims] def collapse_dims_super(dims): """ Given the dimensions specifications for an operator-ket-, operator-bra- or super-type Qobj, returns a dimensions specification describing the same shape by collapsing all composite systems. For instance, the super-type dimensions specification ``[[[2, 3], [2, 3]], [[2, 3], [2, 3]]]`` collapses to ``[[[6], [6]], [[6], [6]]]``. Args: dims (list): Dimensions specifications to be collapsed. Returns: list: Collapsed dimensions specification describing the same shape such that ``len(collapsed_dims[i][j]) == 1`` for ``i`` and ``j`` in ``range(2)``. """ return _collapse_dims_to_level(dims, 2) def enumerate_flat(l): """Labels the indices at which scalars occur in a flattened list. Given a list containing a mix of scalars and lists, returns a list of the same structure, where each scalar has been replaced by an index into the flattened list. Examples -------- >>> print(enumerate_flat([[[10], [20, 30]], 40])) [[[0], [1, 2]], 3] """ return _enumerate_flat(l)[0] qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/expect.py000077500000000000000000000132111362723322000250270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """ Module for expectation values. """ __all__ = ['expect', 'variance'] import numpy as np from .qobj import Qobj # pylint: disable=import-error, no-name-in-module from .cy.spmatfuncs import (cy_expect_rho_vec, cy_expect_psi, cy_spmm_tr, expect_csr_ket) expect_rho_vec = cy_expect_rho_vec expect_psi = cy_expect_psi def expect(oper, state): """Calculates the expectation value for operator(s) and state(s). Args: oper (Qobj or list): A single or a `list` or operators for expectation value. state (Qobj or list): A single or a `list` of quantum states or density matrices. Returns: real or complex or ndarray: Expectation value. ``real`` if `oper` is Hermitian, ``complex`` otherwise. A (nested) array of expectaction values of state or operator are arrays. Raises: TypeError: Inputs are not quantum objects. """ if isinstance(state, Qobj) and isinstance(oper, Qobj): return _single_qobj_expect(oper, state) elif isinstance(oper, (list, np.ndarray)): if isinstance(state, Qobj): if (all([op.isherm for op in oper]) and (state.isket or state.isherm)): return np.array([_single_qobj_expect(o, state) for o in oper]) else: return np.array([_single_qobj_expect(o, state) for o in oper], dtype=complex) else: return [expect(o, state) for o in oper] elif isinstance(state, (list, np.ndarray)): if oper.isherm and all([(op.isherm or op.type == 'ket') for op in state]): return np.array([_single_qobj_expect(oper, x) for x in state]) else: return np.array([_single_qobj_expect(oper, x) for x in state], dtype=complex) else: raise TypeError('Arguments must be quantum objects') # pylint: disable=inconsistent-return-statements def _single_qobj_expect(oper, state): """ Private function used by expect to calculate expectation values of Qobjs. """ if oper.isoper: if oper.dims[1] != state.dims[0]: raise Exception('Operator and state do not have same tensor ' + 'structure: %s and %s' % (oper.dims[1], state.dims[0])) if state.type == 'oper': # calculates expectation value via TR(op*rho) return cy_spmm_tr(oper.data, state.data, oper.isherm and state.isherm) elif state.type == 'ket': # calculates expectation value via return expect_csr_ket(oper.data, state.data, oper.isherm) else: raise TypeError('Invalid operand types') def variance(oper, state): """ Variance of an operator for the given state vector or density matrix. Args: oper (qobj.Qobj): Operator for expectation value. state (qobj.Qobj or list): A single or `list` of quantum states or density matrices.. Returns: float: Variance of operator 'oper' for given state. """ return expect(oper ** 2, state) - expect(oper, state) ** 2 qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/fastsparse.py000077500000000000000000000431331362723322000257200ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, The QuTiP Project. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """ Module for fast versions of SciPy sparse CSR matrices """ import operator from warnings import warn import numpy as np from scipy.sparse import (_sparsetools, isspmatrix, csr_matrix, dia_matrix) from scipy.sparse.sputils import (upcast, isdense, isscalarlike, get_index_dtype) from scipy.sparse.base import SparseEfficiencyWarning class fast_csr_matrix(csr_matrix): """ A subclass of scipy.sparse.csr_matrix that skips the data format checks that are run everytime a new csr_matrix is created. """ # pylint: disable=super-init-not-called def __init__(self, args=None, shape=None, dtype=None, copy=False): if args is None: # Build zero matrix if shape is None: raise Exception('Shape must be given when building zero matrix.') self.data = np.array([], dtype=complex) self.indices = np.array([], dtype=np.int32) self.indptr = np.zeros(shape[0] + 1, dtype=np.int32) self._shape = tuple(int(s) for s in shape) else: if args[0].shape[0] and args[0].dtype != complex: raise TypeError('fast_csr_matrix allows only complex data.') if args[1].shape[0] and args[1].dtype != np.int32: raise TypeError('fast_csr_matrix allows only int32 indices.') if args[2].shape[0] and args[1].dtype != np.int32: raise TypeError('fast_csr_matrix allows only int32 indptr.') self.data = np.array(args[0], dtype=complex, copy=copy) self.indices = np.array(args[1], dtype=np.int32, copy=copy) self.indptr = np.array(args[2], dtype=np.int32, copy=copy) if shape is None: self._shape = tuple([len(self.indptr) - 1] * 2) else: self._shape = tuple(int(s) for s in shape) self.dtype = complex self.maxprint = 50 self.format = 'csr' def _binopt(self, other, op): """ Do the binary operation fn to two sparse matrices using fast_csr_matrix only when other is also a fast_csr_matrix. """ # e.g. csr_plus_csr, csr_minus_csr, etc. if not isinstance(other, fast_csr_matrix): other = csr_matrix(other) # e.g. csr_plus_csr, csr_minus_csr, etc. fn = getattr(_sparsetools, self.format + op + self.format) maxnnz = self.nnz + other.nnz idx_dtype = get_index_dtype((self.indptr, self.indices, other.indptr, other.indices), maxval=maxnnz) indptr = np.empty(self.indptr.shape, dtype=idx_dtype) indices = np.empty(maxnnz, dtype=idx_dtype) bool_ops = ['_ne_', '_lt_', '_gt_', '_le_', '_ge_'] if op in bool_ops: data = np.empty(maxnnz, dtype=np.bool_) else: data = np.empty(maxnnz, dtype=upcast(self.dtype, other.dtype)) fn(self.shape[0], self.shape[1], np.asarray(self.indptr, dtype=idx_dtype), np.asarray(self.indices, dtype=idx_dtype), self.data, np.asarray(other.indptr, dtype=idx_dtype), np.asarray(other.indices, dtype=idx_dtype), other.data, indptr, indices, data) actual_nnz = indptr[-1] indices = indices[:actual_nnz] data = data[:actual_nnz] if actual_nnz < maxnnz // 2: # too much waste, trim arrays indices = indices.copy() data = data.copy() if isinstance(other, fast_csr_matrix) and (op not in bool_ops): A = fast_csr_matrix((data, indices, indptr), dtype=data.dtype, shape=self.shape) else: A = csr_matrix((data, indices, indptr), dtype=data.dtype, shape=self.shape) return A # pylint: disable=too-many-return-statements def multiply(self, other): """Point-wise multiplication by another matrix, vector, or scalar. """ # Scalar multiplication. if isscalarlike(other): return self._mul_scalar(other) # Sparse matrix or vector. if isspmatrix(other): if self.shape == other.shape: if not isinstance(other, fast_csr_matrix): other = csr_matrix(other) return self._binopt(other, '_elmul_') # Single element. elif other.shape == (1, 1): return self._mul_scalar(other.toarray()[0, 0]) elif self.shape == (1, 1): return other._mul_scalar(self.toarray()[0, 0]) # A row times a column. elif self.shape[1] == other.shape[0] and self.shape[1] == 1: return self._mul_sparse_matrix(other.tocsc()) elif self.shape[0] == other.shape[1] and self.shape[0] == 1: return other._mul_sparse_matrix(self.tocsc()) # Row vector times matrix. other is a row. elif other.shape[0] == 1 and self.shape[1] == other.shape[1]: other = dia_matrix((other.toarray().ravel(), [0]), shape=(other.shape[1], other.shape[1])) return self._mul_sparse_matrix(other) # self is a row. elif self.shape[0] == 1 and self.shape[1] == other.shape[1]: copy = dia_matrix((self.toarray().ravel(), [0]), shape=(self.shape[1], self.shape[1])) return other._mul_sparse_matrix(copy) # Column vector times matrix. other is a column. elif other.shape[1] == 1 and self.shape[0] == other.shape[0]: other = dia_matrix((other.toarray().ravel(), [0]), shape=(other.shape[0], other.shape[0])) return other._mul_sparse_matrix(self) # self is a column. elif self.shape[1] == 1 and self.shape[0] == other.shape[0]: copy = dia_matrix((self.toarray().ravel(), [0]), shape=(self.shape[0], self.shape[0])) return copy._mul_sparse_matrix(other) else: raise ValueError("inconsistent shapes") # Dense matrix. if isdense(other): if self.shape == other.shape: ret = self.tocoo() ret.data = np.multiply(ret.data, other[ret.row, ret.col] ).view(np.ndarray).ravel() return ret # Single element. elif other.size == 1: return self._mul_scalar(other.flat[0]) # Anything else. return np.multiply(self.todense(), other) def _mul_sparse_matrix(self, other): """ Do the sparse matrix mult returning fast_csr_matrix only when other is also fast_csr_matrix. """ M, _ = self.shape _, N = other.shape major_axis = self._swap((M, N))[0] if isinstance(other, fast_csr_matrix): A = zcsr_mult(self, other, sorted=1) return A other = csr_matrix(other) # convert to this format idx_dtype = get_index_dtype((self.indptr, self.indices, other.indptr, other.indices), maxval=M * N) indptr = np.empty(major_axis + 1, dtype=idx_dtype) fn = getattr(_sparsetools, self.format + '_matmat_pass1') fn(M, N, np.asarray(self.indptr, dtype=idx_dtype), np.asarray(self.indices, dtype=idx_dtype), np.asarray(other.indptr, dtype=idx_dtype), np.asarray(other.indices, dtype=idx_dtype), indptr) nnz = indptr[-1] idx_dtype = get_index_dtype((self.indptr, self.indices, other.indptr, other.indices), maxval=nnz) indptr = np.asarray(indptr, dtype=idx_dtype) indices = np.empty(nnz, dtype=idx_dtype) data = np.empty(nnz, dtype=upcast(self.dtype, other.dtype)) fn = getattr(_sparsetools, self.format + '_matmat_pass2') fn(M, N, np.asarray(self.indptr, dtype=idx_dtype), np.asarray(self.indices, dtype=idx_dtype), self.data, np.asarray(other.indptr, dtype=idx_dtype), np.asarray(other.indices, dtype=idx_dtype), other.data, indptr, indices, data) A = csr_matrix((data, indices, indptr), shape=(M, N)) return A def _scalar_binopt(self, other, op): """Scalar version of self._binopt, for cases in which no new nonzeros are added. Produces a new spmatrix in canonical form. """ self.sum_duplicates() res = self._with_data(op(self.data, other), copy=True) res.eliminate_zeros() return res # pylint: disable=too-many-return-statements def __eq__(self, other): # Scalar other. if isscalarlike(other): if np.isnan(other): return csr_matrix(self.shape, dtype=np.bool_) if other == 0: warn("Comparing a sparse matrix with 0 using == is inefficient" ", try using != instead.", SparseEfficiencyWarning) all_true = _all_true(self.shape) inv = self._scalar_binopt(other, operator.ne) return all_true - inv else: return self._scalar_binopt(other, operator.eq) # Dense other. elif isdense(other): return self.todense() == other # Sparse other. elif isspmatrix(other): warn("Comparing sparse matrices using == is inefficient, try using" " != instead.", SparseEfficiencyWarning) # TODO sparse broadcasting if self.shape != other.shape: return False elif self.format != other.format: other = other.asformat(self.format) res = self._binopt(other, '_ne_') all_true = _all_true(self.shape) return all_true - res else: return False # pylint: disable=too-many-return-statements def __ne__(self, other): # Scalar other. if isscalarlike(other): if np.isnan(other): warn("Comparing a sparse matrix with nan using != is inefficient", SparseEfficiencyWarning) all_true = _all_true(self.shape) return all_true elif other != 0: warn("Comparing a sparse matrix with a nonzero scalar using !=" " is inefficient, try using == instead.", SparseEfficiencyWarning) all_true = _all_true(self.shape) inv = self._scalar_binopt(other, operator.eq) return all_true - inv else: return self._scalar_binopt(other, operator.ne) # Dense other. elif isdense(other): return self.todense() != other # Sparse other. elif isspmatrix(other): # TODO sparse broadcasting if self.shape != other.shape: return True elif self.format != other.format: other = other.asformat(self.format) return self._binopt(other, '_ne_') else: return True def _inequality(self, other, op, op_name, bad_scalar_msg): # Scalar other. if isscalarlike(other): if other == 0 and op_name in ('_le_', '_ge_'): raise NotImplementedError(" >= and <= don't work with 0.") if op(0, other): warn(bad_scalar_msg, SparseEfficiencyWarning) other_arr = np.empty(self.shape, dtype=np.result_type(other)) other_arr.fill(other) other_arr = csr_matrix(other_arr) return self._binopt(other_arr, op_name) else: return self._scalar_binopt(other, op) # Dense other. elif isdense(other): return op(self.todense(), other) # Sparse other. elif isspmatrix(other): # TODO sparse broadcasting if self.shape != other.shape: raise ValueError("inconsistent shapes") if self.format != other.format: other = other.asformat(self.format) if op_name not in ('_ge_', '_le_'): return self._binopt(other, op_name) warn("Comparing sparse matrices using >= and <= is inefficient, " "using <, >, or !=, instead.", SparseEfficiencyWarning) all_true = _all_true(self.shape) res = self._binopt(other, '_gt_' if op_name == '_le_' else '_lt_') return all_true - res else: raise ValueError("Operands could not be compared.") def _with_data(self, data, copy=True): """Returns a matrix with the same sparsity structure as self, but with different data. By default the structure arrays (i.e. .indptr and .indices) are copied. """ # We need this just in case something like abs(data) gets called # does nothing if data.dtype is complex. data = np.asarray(data, dtype=complex) if copy: return fast_csr_matrix((data, self.indices.copy(), self.indptr.copy()), shape=self.shape, dtype=data.dtype) else: return fast_csr_matrix((data, self.indices, self.indptr), shape=self.shape, dtype=data.dtype) # pylint: disable=arguments-differ def transpose(self): """ Returns the transpose of the matrix, keeping it in fast_csr format. """ return zcsr_transpose(self) def trans(self): """ Same as transpose """ return zcsr_transpose(self) def getH(self): """ Returns the conjugate-transpose of the matrix, keeping it in fast_csr format. """ return zcsr_adjoint(self) def adjoint(self): """ Same as getH """ return zcsr_adjoint(self) def csr2fast(A, copy=False): """Converts a SciPy CSR matrix to the internal fast version. Args: A (csr_matrx): Input csr_matrix. copy (bool): Make a copy of the data arrays. Returns: fast_csr: The equivilent fast CSR matrix. """ if (not isinstance(A, fast_csr_matrix)) or copy: # Do not need to do any type checking here # since fast_csr_matrix does that. return fast_csr_matrix((A.data, A.indices, A.indptr), shape=A.shape, copy=copy) else: return A def fast_identity(N): """Generates a sparse identity matrix in fast_csr format. """ data = np.ones(N, dtype=complex) ind = np.arange(N, dtype=np.int32) ptr = np.arange(N + 1, dtype=np.int32) ptr[-1] = N return fast_csr_matrix((data, ind, ptr), shape=(N, N)) # Convenience functions # -------------------- def _all_true(shape): A = csr_matrix((np.ones(np.prod(shape), dtype=np.bool_), np.tile(np.arange(shape[1], dtype=np.int32), shape[0]), np.arange(0, np.prod(shape) + 1, shape[1], dtype=np.int32)), shape=shape) return A # Need to do some trailing imports here # ------------------------------------- # pylint: disable=no-name-in-module, wrong-import-position, import-error from .cy.spmath import (zcsr_transpose, zcsr_adjoint, zcsr_mult) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/operators.py000077500000000000000000000361461362723322000255710ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """ This module contains functions for generating Qobj representation of a variety of commonly occuring quantum operators. """ import numpy as np import scipy.sparse as sp from .fastsparse import fast_csr_matrix, fast_identity # pylint: disable=no-member # Spin operators def jmat(j, *args): """Higher-order spin operators: Args: j (float): Spin of operator args (str): Which operator to return 'x','y','z','+','-'. If no args given, then output is ['x','y','z'] Returns: Qobj: Requested spin operator(s). Raises: TypeError: Invalid input. """ if (np.fix(2 * j) != 2 * j) or (j < 0): raise TypeError('j must be a non-negative integer or half-integer') if not args: return jmat(j, 'x'), jmat(j, 'y'), jmat(j, 'z') if args[0] == '+': A = _jplus(j) elif args[0] == '-': A = _jplus(j).getH() elif args[0] == 'x': A = 0.5 * (_jplus(j) + _jplus(j).getH()) elif args[0] == 'y': A = -0.5 * 1j * (_jplus(j) - _jplus(j).getH()) elif args[0] == 'z': A = _jz(j) else: raise TypeError('Invalid type') return Qobj(A) def _jplus(j): """ Internal functions for generating the data representing the J-plus operator. """ m = np.arange(j, -j - 1, -1, dtype=complex) data = (np.sqrt(j * (j + 1.0) - (m + 1.0) * m))[1:] N = m.shape[0] ind = np.arange(1, N, dtype=np.int32) ptr = np.array(list(range(N - 1)) + [N - 1] * 2, dtype=np.int32) ptr[-1] = N - 1 return fast_csr_matrix((data, ind, ptr), shape=(N, N)) def _jz(j): """ Internal functions for generating the data representing the J-z operator. """ N = int(2 * j + 1) data = np.array([j - k for k in range(N) if (j - k) != 0], dtype=complex) # Even shaped matrix if N % 2 == 0: ind = np.arange(N, dtype=np.int32) ptr = np.arange(N + 1, dtype=np.int32) ptr[-1] = N # Odd shaped matrix else: j = int(j) ind = np.array(list(range(j)) + list(range(j + 1, N)), dtype=np.int32) ptr = np.array(list(range(j + 1)) + list(range(j, N)), dtype=np.int32) ptr[-1] = N - 1 return fast_csr_matrix((data, ind, ptr), shape=(N, N)) # # Spin j operators: # def spin_Jx(j): """Spin-j x operator Parameters ---------- j : float Spin of operator Returns ------- op : Qobj ``qobj`` representation of the operator. """ return jmat(j, 'x') def spin_Jy(j): """Spin-j y operator Args: j (float): Spin of operator Returns: Qobj: representation of the operator. """ return jmat(j, 'y') def spin_Jz(j): """Spin-j z operator Args: j (float): Spin of operator Returns: Qobj: representation of the operator. """ return jmat(j, 'z') def spin_Jm(j): """Spin-j annihilation operator Parameters: j (float): Spin of operator Returns: Qobj: representation of the operator. """ return jmat(j, '-') def spin_Jp(j): """Spin-j creation operator Args: j (float): Spin of operator Returns: Qobj: representation of the operator. """ return jmat(j, '+') def spin_J_set(j): """Set of spin-j operators (x, y, z) Args: j (float): Spin of operators Returns: list: list of ``qobj`` representating of the spin operator. """ return jmat(j) # # Pauli spin 1/2 operators: # def sigmap(): """Creation operator for Pauli spins. Examples -------- >>> sigmap() Quantum object: dims = [[2], [2]], \ shape = [2, 2], type = oper, isHerm = False Qobj data = [[ 0. 1.] [ 0. 0.]] """ return jmat(1 / 2., '+') def sigmam(): """Annihilation operator for Pauli spins. Examples -------- >>> sigmam() Quantum object: dims = [[2], [2]], \ shape = [2, 2], type = oper, isHerm = False Qobj data = [[ 0. 0.] [ 1. 0.]] """ return jmat(1 / 2., '-') def sigmax(): """Pauli spin 1/2 sigma-x operator Examples -------- >>> sigmax() Quantum object: dims = [[2], [2]], \ shape = [2, 2], type = oper, isHerm = False Qobj data = [[ 0. 1.] [ 1. 0.]] """ return 2.0 * jmat(1.0 / 2, 'x') def sigmay(): """Pauli spin 1/2 sigma-y operator. Examples -------- >>> sigmay() Quantum object: dims = [[2], [2]], \ shape = [2, 2], type = oper, isHerm = True Qobj data = [[ 0.+0.j 0.-1.j] [ 0.+1.j 0.+0.j]] """ return 2.0 * jmat(1.0 / 2, 'y') def sigmaz(): """Pauli spin 1/2 sigma-z operator. Examples -------- >>> sigmaz() Quantum object: dims = [[2], [2]], \ shape = [2, 2], type = oper, isHerm = True Qobj data = [[ 1. 0.] [ 0. -1.]] """ return 2.0 * jmat(1.0 / 2, 'z') # # DESTROY returns annihilation operator for N dimensional Hilbert space # out = destroy(N), N is integer value & N>0 # def destroy(N, offset=0): """Destruction (lowering) operator. Args: N (int): Dimension of Hilbert space. offset (int): (default 0) The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj: Qobj for lowering operator. Raises: ValueError: Invalid input. """ if not isinstance(N, (int, np.integer)): # raise error if N not integer raise ValueError("Hilbert space dimension must be integer value") data = np.sqrt(np.arange(offset + 1, N + offset, dtype=complex)) ind = np.arange(1, N, dtype=np.int32) ptr = np.arange(N + 1, dtype=np.int32) ptr[-1] = N - 1 return Qobj(fast_csr_matrix((data, ind, ptr), shape=(N, N)), isherm=False) # # create returns creation operator for N dimensional Hilbert space # out = create(N), N is integer value & N>0 # def create(N, offset=0): """Creation (raising) operator. Args: N (int): Dimension of Hilbert space. offset (int): (default 0) The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj: Qobj for raising operator. Raises: ValueError: Invalid inputs. """ if not isinstance(N, (int, np.integer)): # raise error if N not integer raise ValueError("Hilbert space dimension must be integer value") qo = destroy(N, offset=offset) # create operator using destroy function return qo.dag() # # QEYE returns identity operator for an N dimensional space # a = qeye(N), N is integer & N>0 # def qeye(N): """ Identity operator Args: N (int): Dimension of Hilbert space. If provided as a list of ints, then the dimension is the product over this list, but the ``dims`` property of the new Qobj are set to this list. Returns: Qobj: Identity operator Qobj. Raises: ValueError: Invalid input. """ N = int(N) if N < 0: raise ValueError("N must be integer N>=0") return Qobj(fast_identity(N), isherm=True, isunitary=True) def identity(N): """Identity operator. Alternative name to :func:`qeye`. Parameters ---------- N : int or list of ints Dimension of Hilbert space. If provided as a list of ints, then the dimension is the product over this list, but the ``dims`` property of the new Qobj are set to this list. Returns ------- oper : qobj Identity operator Qobj. """ return qeye(N) def position(N, offset=0): """ Position operator x=1/sqrt(2)*(a+a.dag()) Args: N (int): Number of Fock states in Hilbert space. offset (int): (default 0) The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj: Position operator as Qobj. """ a = destroy(N, offset=offset) return 1.0 / np.sqrt(2.0) * (a + a.dag()) def momentum(N, offset=0): """ Momentum operator p=-1j/sqrt(2)*(a-a.dag()) Args: N (int): Number of Fock states in Hilbert space. offset (int): (default 0) The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj: Momentum operator as Qobj. """ a = destroy(N, offset=offset) return -1j / np.sqrt(2.0) * (a - a.dag()) def num(N, offset=0): """Quantum object for number operator. Args: N (int): The dimension of the Hilbert space. offset(int): (default 0) The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj: Qobj for number operator. """ if offset == 0: data = np.arange(1, N, dtype=complex) ind = np.arange(1, N, dtype=np.int32) ptr = np.array([0] + list(range(0, N)), dtype=np.int32) ptr[-1] = N - 1 else: data = np.arange(offset, offset + N, dtype=complex) ind = np.arange(N, dtype=np.int32) ptr = np.arange(N + 1, dtype=np.int32) ptr[-1] = N return Qobj(fast_csr_matrix((data, ind, ptr), shape=(N, N)), isherm=True) def squeeze(N, z, offset=0): """Single-mode Squeezing operator. Args: N (int): Dimension of hilbert space. z (complex): Squeezing parameter. offset (int): (default 0) The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj:`Squeezing operator. """ a = destroy(N, offset=offset) op = (1 / 2.0) * np.conj(z) * (a ** 2) - (1 / 2.0) * z * (a.dag()) ** 2 return op.expm() def squeezing(a1, a2, z): """Generalized squeezing operator. Args: a1 (Qobj): Operator 1. a2 (Qobj): Operator 2. z (complex): Squeezing parameter. Returns: Qobj: Squeezing operator. """ b = 0.5 * (np.conj(z) * (a1 * a2) - z * (a1.dag() * a2.dag())) return b.expm() def displace(N, alpha, offset=0): """Single-mode displacement operator. Args: N (int): Dimension of Hilbert space. alpha (complex): Displacement amplitude. offset (int): The lowest number state that is included in the finite number state representation of the operator. Returns: Qobj: Displacement operator. """ a = destroy(N, offset=offset) D = (alpha * a.dag() - np.conj(alpha) * a).expm() return D def commutator(A, B, kind="normal"): """ Return the commutator of kind `kind` (normal, anti) of the two operators A and B. Args: A (Qobj): Operator A. B (Qobj): Operator B. kind (str): 'normal' or 'anti' commutator. Returns: Qobj: Commutator Raises: TypeError: Invalid input. """ if kind == 'normal': return A * B - B * A elif kind == 'anti': return A * B + B * A else: raise TypeError("Unknown commutator kind '%s'" % kind) def qzero(N): """ Zero operator Args: N (int or list): Dimension of Hilbert space. If provided as a list of ints, then the dimension is the product over this list, but the ``dims`` property of the new Qobj are set to this list. Returns: Qobj: Zero operator Qobj. Raises: ValueError: Invalid input. """ N = int(N) if (not isinstance(N, (int, np.integer))) or N < 0: raise ValueError("N must be integer N>=0") return Qobj(sp.csr_matrix((N, N), dtype=complex), isherm=True) def charge(Nmax, Nmin=None, frac=1): """ Generate the diagonal charge operator over charge states from Nmin to Nmax. Args: Nmax (int): Maximum charge state to consider. Nmin (int): (default = -Nmax) Lowest charge state to consider. frac (float): (default = 1) Specify fractional charge if needed. Returns: Qobj: Charge operator over [Nmin,Nmax]. """ if Nmin is None: Nmin = -Nmax diag = np.arange(Nmin, Nmax + 1, dtype=float) if frac != 1: diag *= frac C = sp.diags(diag, 0, format='csr', dtype=complex) return Qobj(C, isherm=True) def tunneling(N, m=1): """ Tunneling operator with elements of the form :math:`\\sum |N> atol)) def __ne__(self, other): """ INEQUALITY operator. """ return not self == other def __pow__(self, n, m=None): # calculates powers of Qobj """ POWER operation. """ if self.type not in ['oper', 'super']: raise Exception("Raising a qobj to some power works only for " + "operators and super-operators (square matrices).") if m is not None: raise NotImplementedError("modulo is not implemented for Qobj") try: data = self.data ** n out = Qobj(data, dims=self.dims) out.superrep = self.superrep return out.tidyup() if auto_tidyup else out except ValueError: raise ValueError('Invalid choice of exponent.') def __abs__(self): return abs(self.data) def __str__(self): s = "" t = self.type shape = self.shape if self.type in ['oper', 'super']: s += ("Quantum object: " + "dims = " + str(self.dims) + ", shape = " + str(shape) + ", type = " + t + ", isherm = " + str(self.isherm) + ( ", superrep = {0.superrep}".format(self) if t == "super" and self.superrep != "super" else "" ) + "\n") else: s += ("Quantum object: " + "dims = " + str(self.dims) + ", shape = " + str(shape) + ", type = " + t + "\n") s += "Qobj data =\n" if shape[0] > 10000 or shape[1] > 10000: # if the system is huge, don't attempt to convert to a # dense matrix and then to string, because it is pointless # and is likely going to produce memory errors. Instead print the # sparse data string representation s += str(self.data) elif all(np.imag(self.data.data) == 0): s += str(np.real(self.full())) else: s += str(self.full()) return s def __repr__(self): # give complete information on Qobj without print statement in # command-line we cant realistically serialize a Qobj into a string, # so we simply return the informal __str__ representation instead.) return self.__str__() def __call__(self, other): """ Acts this Qobj on another Qobj either by left-multiplication, or by vectorization and devectorization, as appropriate. """ if not isinstance(other, Qobj): raise TypeError("Only defined for quantum objects.") if self.type == "oper": if other.type == "ket": return self * other else: raise TypeError("Can only act oper on ket.") else: return None def __getstate__(self): # defines what happens when Qobj object gets pickled self.__dict__.update({'qiskit_version': __version__[:5]}) return self.__dict__ def __setstate__(self, state): # defines what happens when loading a pickled Qobj if 'qiskit_version' in state.keys(): del state['qiskit_version'] (self.__dict__).update(state) def _repr_latex_(self): """ Generate a LaTeX representation of the Qobj instance. Can be used for formatted output in ipython notebook. """ t = self.type shape = self.shape s = r'' if self.type in ['oper', 'super']: s += ("Quantum object: " + "dims = " + str(self.dims) + ", shape = " + str(shape) + ", type = " + t + ", isherm = " + str(self.isherm) + ( ", superrep = {0.superrep}".format(self) if t == "super" and self.superrep != "super" else "" )) else: s += ("Quantum object: " + "dims = " + str(self.dims) + ", shape = " + str(shape) + ", type = " + t) M, N = self.data.shape s += r'\begin{equation*}\left(\begin{array}{*{11}c}' def _format_float(value): if value == 0.0: return "0.0" elif abs(value) > 1000.0 or abs(value) < 0.001: return ("%.3e" % value).replace("e", r"\times10^{") + "}" elif abs(value - int(value)) < 0.001: return "%.1f" % value else: return "%.3f" % value def _format_element(_, n, d): s = " & " if n > 0 else "" if isinstance(d, str): return s + d else: if abs(np.imag(d)) < atol: return s + _format_float(np.real(d)) elif abs(np.real(d)) < atol: return s + _format_float(np.imag(d)) + "j" else: s_re = _format_float(np.real(d)) s_im = _format_float(np.imag(d)) if np.imag(d) > 0.0: return s + "(" + s_re + "+" + s_im + "j)" else: return s + "(" + s_re + s_im + "j)" if M > 10 and N > 10: # truncated matrix output for m in range(5): for n in range(5): s += _format_element(m, n, self.data[m, n]) s += r' & \cdots' for n in range(N - 5, N): s += _format_element(m, n, self.data[m, n]) s += r'\\' for n in range(5): s += _format_element(m, n, r'\vdots') s += r' & \ddots' for n in range(N - 5, N): s += _format_element(m, n, r'\vdots') s += r'\\' for m in range(M - 5, M): for n in range(5): s += _format_element(m, n, self.data[m, n]) s += r' & \cdots' for n in range(N - 5, N): s += _format_element(m, n, self.data[m, n]) s += r'\\' elif N <= 10 < M: # truncated vertically elongated matrix output for m in range(5): for n in range(N): s += _format_element(m, n, self.data[m, n]) s += r'\\' for n in range(N): s += _format_element(m, n, r'\vdots') s += r'\\' for m in range(M - 5, M): for n in range(N): s += _format_element(m, n, self.data[m, n]) s += r'\\' elif M <= 10 < N: # truncated horizontally elongated matrix output for m in range(M): for n in range(5): s += _format_element(m, n, self.data[m, n]) s += r' & \cdots' for n in range(N - 5, N): s += _format_element(m, n, self.data[m, n]) s += r'\\' else: # full output for m in range(M): for n in range(N): s += _format_element(m, n, self.data[m, n]) s += r'\\' s += r'\end{array}\right)\end{equation*}' return s def dag(self): """Adjoint operator of quantum object. """ out = Qobj() out.data = zcsr_adjoint(self.data) out.dims = [self.dims[1], self.dims[0]] out._isherm = self._isherm out.superrep = self.superrep return out def conj(self): """Conjugate operator of quantum object. """ out = Qobj() out.data = self.data.conj() out.dims = [self.dims[0], self.dims[1]] return out def norm(self, norm=None, sparse=False, tol=0, maxiter=100000): """Norm of a quantum object. Default norm is L2-norm for kets and trace-norm for operators. Other ket and operator norms may be specified using the `norm` and argument. Args: norm (str): Which norm to use for ket/bra vectors: L2 'l2', max norm 'max', or for operators: trace 'tr', Frobius 'fro', one 'one', or max 'max'. sparse (bool): Use sparse eigenvalue solver for trace norm. Other norms are not affected by this parameter. tol (float): Tolerance for sparse solver (if used) for trace norm. The sparse solver may not converge if the tolerance is set too low. maxiter (int): Maximum number of iterations performed by sparse solver (if used) for trace norm. Returns: float: The requested norm of the operator or state quantum object. Raises: ValueError: Invalid input. """ if self.type in ['oper', 'super']: if norm is None or norm == 'tr': _op = self * self.dag() vals = sp_eigs(_op.data, _op.isherm, vecs=False, sparse=sparse, tol=tol, maxiter=maxiter) return np.sum(np.sqrt(np.abs(vals))) elif norm == 'fro': return sp_fro_norm(self.data) elif norm == 'one': return sp_one_norm(self.data) elif norm == 'max': return sp_max_norm(self.data) else: raise ValueError( "For matrices, norm must be 'tr', 'fro', 'one', or 'max'.") else: if norm is None or norm == 'l2': return sp_L2_norm(self.data) elif norm == 'max': return sp_max_norm(self.data) else: raise ValueError("For vectors, norm must be 'l2', or 'max'.") def proj(self): """Form the projector from a given ket or bra vector. Returns: qobj.Qobj: Projection operator. Raises: TypeError: Project from only bra or ket. """ if self.isket: _out = zcsr_proj(self.data, 1) _dims = [self.dims[0], self.dims[0]] elif self.isbra: _out = zcsr_proj(self.data, 0) _dims = [self.dims[1], self.dims[1]] else: raise TypeError('Projector can only be formed from a bra or ket.') return Qobj(_out, dims=_dims) def tr(self): """Trace of a quantum object. Returns ------- trace : float Returns ``real`` if operator is Hermitian, returns ``complex`` otherwise. """ return zcsr_trace(self.data, self.isherm) def full(self, order='C', squeeze=False): """Dense array from quantum object. Parameters ---------- order : str {'C', 'F'} Return array in C (default) or Fortran ordering. squeeze : bool {False, True} Squeeze output array. Returns ------- data : array Array of complex data from quantum objects `data` attribute. """ if squeeze: return self.data.toarray(order=order).squeeze() else: return self.data.toarray(order=order) # pylint: disable=unused-argument def __array__(self, *arg, **kwarg): """Numpy array from Qobj For compatibility with np.array """ return self.full() def diag(self): """Diagonal elements of quantum object. Returns ------- diags : array Returns array of ``real`` values if operators is Hermitian, otherwise ``complex`` values are returned. """ out = self.data.diagonal() if np.any(np.imag(out) > atol) or not self.isherm: return out else: return np.real(out) def expm(self, method='dense'): """Matrix exponential of quantum operator. Input operator must be square. Args: method (str): Use set method to use to calculate the matrix exponentiation. The available choices includes 'dense' and 'sparse'. Since the exponential of a matrix is nearly always dense, method='dense' is set as default. Returns: Qobj: Exponentiated quantum operator. Raises: TypeError: Quantum operator is not square. ValueError: Invalid input. """ if self.dims[0][0] != self.dims[1][0]: raise TypeError('Invalid operand for matrix exponential') if method == 'dense': F = sp_expm(self.data, sparse=False) elif method == 'sparse': F = sp_expm(self.data, sparse=True) else: raise ValueError("method must be 'dense' or 'sparse'.") out = Qobj(F, dims=self.dims) return out.tidyup() if auto_tidyup else out def check_herm(self): """Check if the quantum object is hermitian. Returns: bool: Returns the new value of isherm property. """ self._isherm = None return self.isherm def sqrtm(self, sparse=False, tol=0, maxiter=100000): """Sqrt of a quantum operator. Operator must be square. Args: sparse (bool): Use sparse eigenvalue/vector solver. tol (float): Tolerance used by sparse solver (0 = machine precision). maxiter (int): Maximum number of iterations used by sparse solver. Returns: Qobj: Matrix square root of operator. Raises: TypeError: Quantum object is not square. """ if self.dims[0][0] == self.dims[1][0]: evals, evecs = sp_eigs(self.data, self.isherm, sparse=sparse, tol=tol, maxiter=maxiter) numevals = len(evals) dV = sp.spdiags(np.sqrt(evals, dtype=complex), 0, numevals, numevals, format='csr') if self.isherm: spDv = dV.dot(evecs.T.conj().T) else: spDv = dV.dot(np.linalg.inv(evecs.T)) out = Qobj(evecs.T.dot(spDv), dims=self.dims) return out.tidyup() if auto_tidyup else out else: raise TypeError('Invalid operand for matrix square root') def cosm(self): """Cosine of a quantum operator. Operator must be square. Returns ------- oper : :class:`qutip.Qobj` Matrix cosine of operator. Raises ------ TypeError Quantum object is not square. Notes ----- Uses the Q.expm() method. """ if self.dims[0][0] == self.dims[1][0]: return 0.5 * ((1j * self).expm() + (-1j * self).expm()) else: raise TypeError('Invalid operand for matrix square root') def sinm(self): """Sine of a quantum operator. Operator must be square. Returns ------- oper : :class:`qutip.Qobj` Matrix sine of operator. Raises ------ TypeError Quantum object is not square. Notes ----- Uses the Q.expm() method. """ if self.dims[0][0] == self.dims[1][0]: return -0.5j * ((1j * self).expm() - (-1j * self).expm()) raise TypeError('Invalid operand for matrix square root') def unit(self, inplace=False, norm=None, sparse=False, tol=0, maxiter=100000): """Operator or state normalized to unity. Uses norm from Qobj.norm(). Args: inplace (bool): Do an in-place normalization norm (str): Requested norm for states / operators. sparse (bool): Use sparse eigensolver for trace norm. Does not affect other norms. tol (float): Tolerance used by sparse eigensolver. maxiter (int): Number of maximum iterations performed by sparse eigensolver. Returns: qobj.Qobj: Normalized quantum object if not in-place, else None. Raises: TypeError: Inplace value must be a bool. """ if inplace: nrm = self.norm(norm=norm, sparse=sparse, tol=tol, maxiter=maxiter) self.data /= nrm return None elif not inplace: out = self / self.norm(norm=norm, sparse=sparse, tol=tol, maxiter=maxiter) if auto_tidyup: return out.tidyup() else: return out else: raise TypeError('inplace kwarg must be bool.') def tidyup(self, atol=auto_tidyup_atol): """Removes small elements from the quantum object. Parameters ---------- atol : float Absolute tolerance used by tidyup. Default is set via qutip global settings parameters. Returns ------- oper : :class:`qutip.Qobj` Quantum object with small elements removed. """ if self.data.nnz: # This does the tidyup and returns True if # The sparse data needs to be shortened if cy_tidyup(self.data.data, atol, self.data.nnz): self.data.eliminate_zeros() return self else: return self def transform(self, inpt, inverse=False, sparse=True): """Basis transform defined by input array. Input array can be a ``matrix`` defining the transformation, or a ``list`` of kets that defines the new basis. Args: inpt (ndarray): A ``matrix`` or ``list`` of kets defining the transformation. inverse (bool): Whether to return inverse transformation. sparse (bool): Use sparse matrices when possible. Can be slower. Returns: Qobj: Operator in new basis. Raises: TypeError: Invalid input. """ if isinstance(inpt, list) or (isinstance(inpt, np.ndarray) and len(inpt.shape) == 1): if len(inpt) != max(self.shape): raise TypeError( 'Invalid size of ket list for basis transformation') if sparse: S = sp.hstack([psi.data for psi in inpt], format='csr').conj().T else: S = np.hstack([psi.full() for psi in inpt]).conj().T elif isinstance(inpt, Qobj) and inpt.isoper: S = inpt.data elif isinstance(inpt, np.ndarray): S = inpt.conj() sparse = False else: raise TypeError('Invalid operand for basis transformation') # transform data if inverse: if self.isket: data = (S.conj().T) * self.data elif self.isbra: data = self.data.dot(S) else: if sparse: data = (S.conj().T) * self.data * S else: data = (S.conj().T).dot(self.data.dot(S)) else: if self.isket: data = S * self.data elif self.isbra: data = self.data.dot(S.conj().T) else: if sparse: data = S * self.data * (S.conj().T) else: data = S.dot(self.data.dot(S.conj().T)) out = Qobj(data, dims=self.dims) out._isherm = self._isherm out.superrep = self.superrep if auto_tidyup: return out.tidyup() else: return out def matrix_element(self, bra, ket): """Calculates a matrix element. Gives the matrix element for the quantum object sandwiched between a `bra` and `ket` vector. Args: bra (Qobj): Quantum object of type 'bra' or 'ket' ket (Qobj): Quantum object of type 'ket'. Returns: complex: Complex valued matrix element. Raises: TypeError: Invalid input. """ if not self.isoper: raise TypeError("Can only get matrix elements for an operator.") if bra.isbra and ket.isket: return zcsr_mat_elem(self.data, bra.data, ket.data, 1) elif bra.isket and ket.isket: return zcsr_mat_elem(self.data, bra.data, ket.data, 0) else: raise TypeError("Can only calculate matrix elements " + "for bra and ket vectors.") def overlap(self, other): """Overlap between two state vectors or two operators. Gives the overlap (inner product) between the current bra or ket Qobj and and another bra or ket Qobj. It gives the Hilbert-Schmidt overlap when one of the Qobj is an operator/density matrix. Parameters ----------- other : :class:`qutip.Qobj` Quantum object for a state vector of type 'ket', 'bra' or density matrix. Returns ------- overlap : complex Complex valued overlap. Raises ------ TypeError Can only calculate overlap between a bra, ket and density matrix quantum objects. Notes ----- Since QuTiP mainly deals with ket vectors, the most efficient inner product call is the ket-ket version that computes the product with both vectors expressed as kets. """ if isinstance(other, Qobj): returnval = 0 if self.isbra: if other.isket: returnval = zcsr_inner(self.data, other.data, 1) elif other.isbra: # Since we deal mainly with ket vectors, the bra-bra combo # is not common, and not optimized. returnval = zcsr_inner(self.data, other.dag().data, 1) elif other.isoper: returnval = (states.ket2dm(self).dag() * other).tr() else: raise TypeError("Can only calculate overlap for " + "state vector Qobjs") elif self.isket: if other.isbra: returnval = zcsr_inner(other.data, self.data, 1) elif other.isket: returnval = zcsr_inner(self.data, other.data, 0) elif other.isoper: returnval = (states.ket2dm(self).dag() * other).tr() else: raise TypeError("Can only calculate overlap for " + "state vector Qobjs") elif self.isoper: if other.isket or other.isbra: returnval = (self.dag() * states.ket2dm(other)).tr() elif other.isoper: returnval = (self.dag() * other).tr() else: raise TypeError("Can only calculate overlap " + "for state vector Qobjs") else: raise TypeError("Can only calculate overlap for state vector Qobjs") return returnval def eigenstates(self, sparse=False, sort='low', eigvals=0, tol=0, maxiter=100000): """Eigenstates and eigenenergies. Eigenstates and eigenenergies are defined for operators and superoperators only. Parameters ---------- sparse : bool Use sparse Eigensolver sort : str Sort eigenvalues (and vectors) 'low' to high, or 'high' to low. eigvals : int Number of requested eigenvalues. Default is all eigenvalues. tol : float Tolerance used by sparse Eigensolver (0 = machine precision). The sparse solver may not converge if the tolerance is set too low. maxiter : int Maximum number of iterations performed by sparse solver (if used). Returns ------- eigvals : array Array of eigenvalues for operator. eigvecs : array Array of quantum operators representing the oprator eigenkets. Order of eigenkets is determined by order of eigenvalues. Notes ----- The sparse eigensolver is much slower than the dense version. Use sparse only if memory requirements demand it. """ evals, evecs = sp_eigs(self.data, self.isherm, sparse=sparse, sort=sort, eigvals=eigvals, tol=tol, maxiter=maxiter) new_dims = [self.dims[0], [1] * len(self.dims[0])] ekets = np.array([Qobj(vec, dims=new_dims) for vec in evecs], dtype=object) norms = np.array([ket.norm() for ket in ekets]) return evals, ekets / norms def eigenenergies(self, sparse=False, sort='low', eigvals=0, tol=0, maxiter=100000): """Eigenenergies of a quantum object. Eigenenergies (eigenvalues) are defined for operators or superoperators only. Parameters ---------- sparse : bool Use sparse Eigensolver sort : str Sort eigenvalues 'low' to high, or 'high' to low. eigvals : int Number of requested eigenvalues. Default is all eigenvalues. tol : float Tolerance used by sparse Eigensolver (0=machine precision). The sparse solver may not converge if the tolerance is set too low. maxiter : int Maximum number of iterations performed by sparse solver (if used). Returns ------- eigvals : array Array of eigenvalues for operator. Notes ----- The sparse eigensolver is much slower than the dense version. Use sparse only if memory requirements demand it. """ return sp_eigs(self.data, self.isherm, vecs=False, sparse=sparse, sort=sort, eigvals=eigvals, tol=tol, maxiter=maxiter) def groundstate(self, sparse=False, tol=0, maxiter=100000, safe=True): """Ground state Eigenvalue and Eigenvector. Defined for quantum operators or superoperators only. Args: sparse (bool): Use sparse Eigensolver tol (float): Tolerance used by sparse Eigensolver (0 = machine precision). The sparse solver may not converge if the tolerance is set too low. maxiter (int): Maximum number of iterations performed by sparse solver (if used). safe (bool): Check for degenerate ground state Returns: tuple: Eigenenergy and eigenstate of ground state. """ if safe: evals = 2 else: evals = 1 grndval, grndvec = sp_eigs(self.data, self.isherm, sparse=sparse, eigvals=evals, tol=tol, maxiter=maxiter) if safe: if tol == 0: tol = 1e-15 if (grndval[1] - grndval[0]) <= 10 * tol: print("WARNING: Ground state may be degenerate. " "Use Q.eigenstates()") new_dims = [self.dims[0], [1] * len(self.dims[0])] grndvec = Qobj(grndvec[0], dims=new_dims) grndvec = grndvec / grndvec.norm() return grndval[0], grndvec def trans(self): """Transposed operator. Returns: Qobj: Transpose of input operator. """ out = Qobj() out.data = zcsr_transpose(self.data) out.dims = [self.dims[1], self.dims[0]] return out @property def isherm(self): """Is operator Hermitian. Returns: bool: Operator is Hermitian or not. """ if self._isherm is not None: # used previously computed value return self._isherm self._isherm = bool(zcsr_isherm(self.data)) return self._isherm @isherm.setter def isherm(self, isherm): self._isherm = isherm def check_isunitary(self): """ Checks whether qobj is a unitary matrix """ if self.isoper: eye_data = fast_identity(self.shape[0]) return not (np.any(np.abs((self.data * self.dag().data - eye_data).data) > atol) or np.any(np.abs((self.dag().data * self.data - eye_data).data) > atol)) else: return False @property def isunitary(self): """Is operator unitary. Returns: bool: Is operator unitary or not. """ if self._isunitary is not None: # used previously computed value return self._isunitary self._isunitary = self.check_isunitary() return self._isunitary @isunitary.setter def isunitary(self, isunitary): self._isunitary = isunitary @property def type(self): """Type of Qobj """ if not self._type: self._type = type_from_dims(self.dims) return self._type @property def shape(self): """Shape of Qobj """ if self.data.shape == (1, 1): return tuple([np.prod(self.dims[0]), np.prod(self.dims[1])]) else: return tuple(self.data.shape) @property def isbra(self): """Is bra vector""" return self.type == 'bra' @property def isket(self): """Is ket vector""" return self.type == 'ket' @property def isoperbra(self): """Is operator-bra""" return self.type == 'operator-bra' @property def isoperket(self): """Is operator-ket""" return self.type == 'operator-ket' @property def isoper(self): """Is operator""" return self.type == 'oper' @property def issuper(self): """Is super operator""" return self.type == 'super' @staticmethod def evaluate(qobj_list, t, args): """Evaluate a time-dependent quantum object in list format. For example, qobj_list = [H0, [H1, func_t]] is evaluated to Qobj(t) = H0 + H1 * func_t(t, args) and qobj_list = [H0, [H1, 'sin(w * t)']] is evaluated to Qobj(t) = H0 + H1 * sin(args['w'] * t) Args: qobj_list (list): A nested list of Qobj instances and corresponding time-dependent coefficients. t (float): The time for which to evaluate the time-dependent Qobj instance. args (dict): A dictionary with parameter values required to evaluate the time-dependent Qobj intance. Returns: Qobj: A Qobj instance that represents the value of qobj_list at time t. Raises: TypeError: Invalid input. """ q_sum = 0 if isinstance(qobj_list, Qobj): q_sum = qobj_list elif isinstance(qobj_list, list): for q in qobj_list: if isinstance(q, Qobj): q_sum += q elif (isinstance(q, list) and len(q) == 2 and isinstance(q[0], Qobj)): if isinstance(q[1], types.FunctionType): q_sum += q[0] * q[1](t, args) elif isinstance(q[1], str): args['t'] = t # pylint: disable=eval-used q_sum += q[0] * float(eval(q[1], globals(), args)) else: raise TypeError('Unrecognized format for ' + 'specification of time-dependent Qobj') else: raise TypeError('Unrecognized format for specification ' + 'of time-dependent Qobj') else: raise TypeError( 'Unrecongized format for specification of time-dependent Qobj') return q_sum # pylint: disable=wrong-import-position from ..qutip_lite import states qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/settings.py000077500000000000000000000051531362723322000254050ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """ This module contains settings for qutip_lite functionality """ # use auto tidyup auto_tidyup = True # use auto tidyup dims on multiplication auto_tidyup_dims = True # detect hermiticity auto_herm = True # general absolute tolerance atol = 1e-12 # use auto tidyup absolute tolerance auto_tidyup_atol = 1e-12 qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/sparse.py000077500000000000000000000441461362723322000250470ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name, len-as-condition, no-name-in-module # pylint: disable=import-error """ This module contains a collection of routines for operating on sparse matrices on the scipy.sparse formats, for use internally by other modules throughout QuTiP. """ __all__ = ['sp_fro_norm', 'sp_inf_norm', 'sp_L2_norm', 'sp_max_norm', 'sp_one_norm', 'sp_reshape', 'sp_eigs', 'sp_expm', 'sp_permute', 'sp_reverse_permute', 'sp_bandwidth', 'sp_profile'] import numpy as np import scipy.linalg as la import scipy.sparse as sp import scipy.sparse.linalg as spla from scipy.linalg.blas import get_blas_funcs from .cy.sparse_utils import (_sparse_profile, _sparse_permute, _sparse_reverse_permute, _sparse_bandwidth, _isdiag, zcsr_one_norm, zcsr_inf_norm) from .fastsparse import fast_csr_matrix from .cy.spconvert import (zcsr_reshape) _dznrm2 = get_blas_funcs("znrm2") def sp_fro_norm(data): """ Frobius norm for sparse matrix """ out = np.sum(np.abs(data.data)**2) return np.sqrt(out) def sp_inf_norm(A): """ Infinity norm for sparse matrix """ return zcsr_inf_norm(A.data, A.indices, A.indptr, A.shape[0], A.shape[1]) def sp_L2_norm(A): """ L2 norm sparse vector """ if 1 not in A.shape: raise TypeError("Use L2-norm only for vectors.") if len(A.data): return _dznrm2(A.data) else: return 0 def sp_max_norm(A): """ Max norm for sparse matrix """ return np.max(np.abs(A.data)) if any(A.data) else 0 def sp_one_norm(A): """ One norm for sparse matrix """ return zcsr_one_norm(A.data, A.indices, A.indptr, A.shape[0], A.shape[1]) # pylint: disable=redefined-builtin def sp_reshape(A, shape, format='csr'): """ Reshapes a sparse matrix. Args: A (sparse): Input matrix in any format shape (list):Desired shape of new matrix format (str): Optional string indicating desired output format Returns: csr_matrix: Reshaped sparse matrix Raises: ValueError: Invalid input. """ if not hasattr(shape, '__len__') or len(shape) != 2: raise ValueError('Shape must be a list of two integers') if format == 'csr': return zcsr_reshape(A, shape[0], shape[1]) C = A.tocoo() nrows, ncols = C.shape size = nrows * ncols new_size = shape[0] * shape[1] if new_size != size: raise ValueError('Total size of new array must be unchanged.') flat_indices = ncols * C.row + C.col new_row, new_col = divmod(flat_indices, shape[1]) B = sp.coo_matrix((C.data, (new_row, new_col)), shape=shape) if format == 'coo': return B elif format == 'csc': return B.tocsc() elif format == 'lil': return B.tolil() else: raise ValueError('Return format not valid.') def _dense_eigs(data, isherm, vecs, N, eigvals, num_large, num_small): """ Internal functions for computing eigenvalues and eigenstates for a dense matrix. """ evecs = None if vecs: if isherm: if eigvals == 0: evals, evecs = la.eigh(data) else: if num_small > 0: evals, evecs = la.eigh( data, eigvals=[0, num_small - 1]) if num_large > 0: evals, evecs = la.eigh( data, eigvals=[N - num_large, N - 1]) else: evals, evecs = la.eig(data) else: if isherm: if eigvals == 0: evals = la.eigvalsh(data) else: if num_small > 0: evals = la.eigvalsh(data, eigvals=[0, num_small - 1]) if num_large > 0: evals = la.eigvalsh(data, eigvals=[N - num_large, N - 1]) else: evals = la.eigvals(data) _zipped = list(zip(evals, range(len(evals)))) _zipped.sort() evals, perm = list(zip(*_zipped)) if vecs: evecs = np.array([evecs[:, k] for k in perm]) if not isherm and eigvals > 0: if vecs: if num_small > 0: evals, evecs = evals[:num_small], evecs[:num_small] elif num_large > 0: evals, evecs = evals[(N - num_large):], evecs[(N - num_large):] else: if num_small > 0: evals = evals[:num_small] elif num_large > 0: evals = evals[(N - num_large):] return np.array(evals), np.array(evecs) def _sp_eigs(data, isherm, vecs, N, eigvals, num_large, num_small, tol, maxiter): """ Internal functions for computing eigenvalues and eigenstates for a sparse matrix. """ big_vals = np.array([]) small_vals = np.array([]) evecs = None remove_one = False if eigvals == (N - 1): # calculate all eigenvalues and remove one at output if using sparse eigvals = 0 num_small = int(np.ceil(N / 2.0)) num_large = N - num_small remove_one = True if vecs: if isherm: if num_large > 0: big_vals, big_vecs = sp.linalg.eigsh(data, k=num_large, which='LA', tol=tol, maxiter=maxiter) big_vecs = sp.csr_matrix(big_vecs, dtype=complex) if num_small > 0: small_vals, small_vecs = sp.linalg.eigsh( data, k=num_small, which='SA', tol=tol, maxiter=maxiter) else: if num_large > 0: big_vals, big_vecs = sp.linalg.eigs(data, k=num_large, which='LR', tol=tol, maxiter=maxiter) big_vecs = sp.csr_matrix(big_vecs, dtype=complex) if num_small > 0: small_vals, small_vecs = sp.linalg.eigs( data, k=num_small, which='SR', tol=tol, maxiter=maxiter) if num_large != 0 and num_small != 0: evecs = sp.hstack([small_vecs, big_vecs], format='csr') elif num_large != 0 and num_small == 0: evecs = big_vecs elif num_large == 0 and num_small != 0: evecs = small_vecs else: if isherm: if num_large > 0: big_vals = sp.linalg.eigsh( data, k=num_large, which='LA', return_eigenvectors=False, tol=tol, maxiter=maxiter) if num_small > 0: small_vals = sp.linalg.eigsh( data, k=num_small, which='SA', return_eigenvectors=False, tol=tol, maxiter=maxiter) else: if num_large > 0: big_vals = sp.linalg.eigs( data, k=num_large, which='LR', return_eigenvectors=False, tol=tol, maxiter=maxiter) if num_small > 0: small_vals = sp.linalg.eigs( data, k=num_small, which='SR', return_eigenvectors=False, tol=tol, maxiter=maxiter) evals = np.hstack((small_vals, big_vals)) if isherm: evals = np.real(evals) _zipped = list(zip(evals, range(len(evals)))) _zipped.sort() evals, perm = list(zip(*_zipped)) if vecs: evecs = np.array([evecs[:, k] for k in perm]) # remove last element if requesting N-1 eigs and using sparse if remove_one: evals = np.delete(evals, -1) if vecs: evecs = np.delete(evecs, -1) return np.array(evals), np.array(evecs) def sp_eigs(data, isherm, vecs=True, sparse=False, sort='low', eigvals=0, tol=0, maxiter=100000): """Returns Eigenvalues and Eigenvectors for a sparse matrix. Uses dense eigen-solver unless user sets sparse=True. Args: data (csr_matrix): Input matrix. isherm (bool): Indicate whether the matrix is hermitian or not vecs (bool): Flag for requesting eigenvectors sparse (bool): Flag to use sparse solver sort (str): Return lowest or highest eigenvals/vecs eigvals (int): Number of eigenvals/vecs to return. Default = 0 (return all) tol (float): Tolerance for sparse eigensolver. Default = 0 (Machine precision) maxiter (int): Max. number of iterations used by sparse sigensolver. Returns: array: Eigenvalues and (by default) array of corresponding Eigenvectors. Raises: TypeError: Invalid input. ValueError: Invalid input. """ if data.shape[0] != data.shape[1]: raise TypeError("Can only diagonalize square matrices") N = data.shape[0] if eigvals == N: eigvals = 0 if eigvals > N: raise ValueError("Number of requested eigen vals/vecs must be <= N.") # set number of large and small eigenvals/vecs if eigvals == 0: # user wants all eigs (default) D = int(np.ceil(N / 2.0)) num_large = N - D if not np.mod(N, 2): M = D else: M = D - 1 num_small = N - M else: # if user wants only a few eigen vals/vecs if sort == 'low': num_small = eigvals num_large = 0 elif sort == 'high': num_large = eigvals num_small = 0 else: raise ValueError("Invalid option for 'sort'.") # Dispatch to sparse/dense solvers if sparse: evals, evecs = _sp_eigs(data, isherm, vecs, N, eigvals, num_large, num_small, tol, maxiter) else: evals, evecs = _dense_eigs(data.todense(), isherm, vecs, N, eigvals, num_large, num_small) if sort == 'high': # flip arrays to largest values first if vecs: evecs = np.flipud(evecs) evals = np.flipud(evals) return (evals, evecs) if vecs else evals def sp_expm(A, sparse=False): """ Sparse matrix exponential. """ if _isdiag(A.indices, A.indptr, A.shape[0]): A = sp.diags(np.exp(A.diagonal()), shape=A.shape, format='csr', dtype=complex) return A if sparse: E = spla.expm(A.tocsc()) else: E = spla.expm(A.toarray()) return sp.csr_matrix(E) def sp_permute(A, rperm=(), cperm=(), safe=True): """ Permutes the rows and columns of a sparse CSR/CSC matrix according to the permutation arrays rperm and cperm, respectively. Here, the permutation arrays specify the new order of the rows and columns. i.e. [0,1,2,3,4] -> [3,0,4,1,2]. Args: A (csr_matrix): Input matrix. rperm (ndarray): Array of row permutations. cperm (ndarray): Array of column permutations. safe (bool): Check structure of permutation arrays. Returns: csr_matrix: CSR matrix with permuted rows/columns. Raises: ValueError: Invalid input. """ rperm = np.asarray(rperm, dtype=np.int32) cperm = np.asarray(cperm, dtype=np.int32) nrows = A.shape[0] ncols = A.shape[1] if len(rperm) == 0: rperm = np.arange(nrows, dtype=np.int32) if len(cperm) == 0: cperm = np.arange(ncols, dtype=np.int32) if safe: if len(np.setdiff1d(rperm, np.arange(nrows))) != 0: raise ValueError('Invalid row permutation array.') if len(np.setdiff1d(cperm, np.arange(ncols))) != 0: raise ValueError('Invalid column permutation array.') shp = A.shape kind = A.getformat() if kind == 'csr': flag = 0 elif kind == 'csc': flag = 1 else: raise ValueError('Input must be Qobj, CSR, or CSC matrix.') data, ind, ptr = _sparse_permute(A.data, A.indices, A.indptr, nrows, ncols, rperm, cperm, flag) if kind == 'csr': return fast_csr_matrix((data, ind, ptr), shape=shp) return sp.csc_matrix((data, ind, ptr), shape=shp, dtype=data.dtype) def sp_reverse_permute(A, rperm=(), cperm=(), safe=True): """ Performs a reverse permutations of the rows and columns of a sparse CSR/CSC matrix according to the permutation arrays rperm and cperm, respectively. Here, the permutation arrays specify the order of the rows and columns used to permute the original array. Args: A (csr_matrix): Input matrix. rperm (ndarray): Array of row permutations. cperm (ndarray): Array of column permutations. safe (bool): Check structure of permutation arrays. Returns: csr_matrix: CSR matrix with permuted rows/columns. Raises: Exception: Invalid permutation. """ rperm = np.asarray(rperm, dtype=np.int32) cperm = np.asarray(cperm, dtype=np.int32) nrows = A.shape[0] ncols = A.shape[1] if len(rperm) == 0: rperm = np.arange(nrows, dtype=np.int32) if len(cperm) == 0: cperm = np.arange(ncols, dtype=np.int32) if safe: if len(np.setdiff1d(rperm, np.arange(nrows))) != 0: raise Exception('Invalid row permutation array.') if len(np.setdiff1d(cperm, np.arange(ncols))) != 0: raise Exception('Invalid column permutation array.') shp = A.shape kind = A.getformat() if kind == 'csr': flag = 0 elif kind == 'csc': flag = 1 else: raise Exception('Input must be Qobj, CSR, or CSC matrix.') data, ind, ptr = _sparse_reverse_permute(A.data, A.indices, A.indptr, nrows, ncols, rperm, cperm, flag) if kind == 'csr': return fast_csr_matrix((data, ind, ptr), shape=shp) return sp.csc_matrix((data, ind, ptr), shape=shp, dtype=data.dtype) def sp_bandwidth(A): """ Returns the max(mb), lower(lb), and upper(ub) bandwidths of a sparse CSR/CSC matrix. If the matrix is symmetric then the upper and lower bandwidths are identical. Diagonal matrices have a bandwidth equal to one. Args: A (csr_matrix): Input matrix Returns: tuple: Maximum, lower, and upper bandwidths Raises: Exception: Invalid input. """ nrows = A.shape[0] ncols = A.shape[1] if A.getformat() == 'csr': return _sparse_bandwidth(A.indices, A.indptr, nrows) elif A.getformat() == 'csc': # Normal output is mb,lb,ub but since CSC # is transpose of CSR switch lb and ub mb, ub, lb = _sparse_bandwidth(A.indices, A.indptr, ncols) return mb, lb, ub else: raise Exception('Invalid sparse input format.') def sp_profile(A): """Returns the total, lower, and upper profiles of a sparse matrix. If the matrix is symmetric then the upper and lower profiles are identical. Diagonal matrices have zero profile. Args: A (csr_matrix): Input matrix Returns: tuple: Maximum, lower, and upper profiles. Raises: TypeError: Invalid inputs. """ if sp.isspmatrix_csr(A): up = _sparse_profile(A.indices, A.indptr, A.shape[0]) A = A.tocsc() lp = _sparse_profile(A.indices, A.indptr, A.shape[0]) elif sp.isspmatrix_csc(A): lp = _sparse_profile(A.indices, A.indptr, A.shape[0]) A = A.tocsr() up = _sparse_profile(A.indices, A.indptr, A.shape[0]) else: raise TypeError('Input sparse matrix must be in CSR or CSC format.') return up + lp, lp, up def sp_isdiag(A): """Determine if sparse CSR matrix is diagonal. Args: A (csr_matrix); Input matrix Returns: int: True if matix is diagonal, False otherwise. Raises: TypeError: Invalid input. """ if not sp.isspmatrix_csr(A): raise TypeError('Input sparse matrix must be in CSR format.') return _isdiag(A.indices, A.indptr, A.shape[0]) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/states.py000077500000000000000000000247141362723322000250540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """States """ import numpy as np import scipy.sparse as sp from .qobj import Qobj from .operators import destroy from .fastsparse import fast_csr_matrix def basis(N, n=0, offset=0): """Generates the vector representation of a Fock state. Args: N (int): Number of Fock states in Hilbert space. n (int): Integer corresponding to desired number state, defaults to 0 if omitted. offset (int): The lowest number state that is included in the finite number state representation of the state. Returns: Qobj: Qobj representing the requested number state ``|n>``. Raises: ValueError: Invalid input value. """ if (not isinstance(N, (int, np.integer))) or N < 0: raise ValueError("N must be integer N >= 0") if (not isinstance(n, (int, np.integer))) or n < offset: raise ValueError("n must be integer n >= 0") if n - offset > (N - 1): # check if n is within bounds raise ValueError("basis vector index need to be in n <= N-1") data = np.array([1], dtype=complex) ind = np.array([0], dtype=np.int32) ptr = np.array([0] * ((n - offset) + 1) + [1] * (N - (n - offset)), dtype=np.int32) return Qobj(fast_csr_matrix((data, ind, ptr), shape=(N, 1)), isherm=False) def qutrit_basis(): """Basis states for a three level system (qutrit) Returns: array: Array of qutrit basis vectors """ return np.array([basis(3, 0), basis(3, 1), basis(3, 2)], dtype=object) def coherent(N, alpha, offset=0, method='operator'): """Generates a coherent state with eigenvalue alpha. Constructed using displacement operator on vacuum state. Args: N (int): Number of Fock states in Hilbert space. alpha (complex): Eigenvalue of coherent state. offset (int): The lowest number state that is included in the finite number state representation of the state. Using a non-zero offset will make the default method 'analytic'. method (str): Method for generating coherent state. Returns: Qobj: Qobj quantum object for coherent state Raises: TypeError: Invalid input. """ if method == "operator" and offset == 0: x = basis(N, 0) a = destroy(N) D = (alpha * a.dag() - np.conj(alpha) * a).expm() return D * x elif method == "analytic" or offset > 0: sqrtn = np.sqrt(np.arange(offset, offset + N, dtype=complex)) sqrtn[0] = 1 # Get rid of divide by zero warning data = alpha / sqrtn if offset == 0: data[0] = np.exp(-abs(alpha)**2 / 2.0) else: s = np.prod(np.sqrt(np.arange(1, offset + 1))) # sqrt factorial data[0] = np.exp(-abs(alpha)**2 / 2.0) * alpha**(offset) / s np.cumprod(data, out=sqrtn) # Reuse sqrtn array return Qobj(sqrtn) else: raise TypeError( "The method option can only take values 'operator' or 'analytic'") def coherent_dm(N, alpha, offset=0, method='operator'): """Density matrix representation of a coherent state. Constructed via outer product of :func:`qutip.states.coherent` Parameters: N (int): Number of Fock states in Hilbert space. alpha (complex): Eigenvalue for coherent state. offset (int): The lowest number state that is included in the finite number state representation of the state. method (str): Method for generating coherent density matrix. Returns: Qobj: Density matrix representation of coherent state. Raises: TypeError: Invalid input. """ if method == "operator": psi = coherent(N, alpha, offset=offset) return psi * psi.dag() elif method == "analytic": psi = coherent(N, alpha, offset=offset, method='analytic') return psi * psi.dag() else: raise TypeError( "The method option can only take values 'operator' or 'analytic'") def fock_dm(N, n=0, offset=0): """Density matrix representation of a Fock state Constructed via outer product of :func:`qutip.states.fock`. Args: N (int): Number of Fock states in Hilbert space. n (int): Desired number state, defaults to 0 if omitted. offset (int): Energy level offset. Returns: Qobj: Density matrix representation of Fock state. """ psi = basis(N, n, offset=offset) return psi * psi.dag() def fock(N, n=0, offset=0): """Bosonic Fock (number) state. Same as :func:`qutip.states.basis`. Args: N (int): Number of states in the Hilbert space. n (int): Desired number state, defaults to 0 if omitted. offset (int): Energy level offset. Returns: Qobj: Requested number state :math:`\\left|n\\right>`. """ return basis(N, n, offset=offset) def thermal_dm(N, n, method='operator'): """Density matrix for a thermal state of n particles Args: N (int): Number of basis states in Hilbert space. n (float): Expectation value for number of particles in thermal state. method (str): Sets the method used to generate the thermal state probabilities Returns: Qobj: Thermal state density matrix. Raises: ValueError: Invalid input. """ if n == 0: return fock_dm(N, 0) else: i = np.arange(N) if method == 'operator': beta = np.log(1.0 / n + 1.0) diags = np.exp(-1 * beta * i) diags = diags / np.sum(diags) # populates diagonal terms using truncated operator expression rm = sp.spdiags(diags, 0, N, N, format='csr') elif method == 'analytic': # populates diagonal terms using analytic values rm = sp.spdiags((1.0 + n) ** (-1.0) * (n / (1.0 + n)) ** (i), 0, N, N, format='csr') else: raise ValueError( "'method' keyword argument must be 'operator' or 'analytic'") return Qobj(rm) def maximally_mixed_dm(N): """ Returns the maximally mixed density matrix for a Hilbert space of dimension N. Args: N (int): Number of basis states in Hilbert space. Returns: Qobj: Thermal state density matrix. Raises: ValueError: Invalid input. """ if (not isinstance(N, (int, np.int64))) or N <= 0: raise ValueError("N must be integer N > 0") dm = sp.spdiags(np.ones(N, dtype=complex) / float(N), 0, N, N, format='csr') return Qobj(dm, isherm=True) def ket2dm(Q): """Takes input ket or bra vector and returns density matrix formed by outer product. Args: Q (Qobj): Ket or bra type quantum object. Returns: Qobj: Density matrix formed by outer product of `Q`. Raises: TypeError: Invalid input. """ if Q.type == 'ket': out = Q * Q.dag() elif Q.type == 'bra': out = Q.dag() * Q else: raise TypeError("Input is not a ket or bra vector.") return Qobj(out) # # projection operator # def projection(N, n, m, offset=0): """The projection operator that projects state :math:`|m>` on state :math:`|n>`. Args: N (int): Number of basis states in Hilbert space. n (float): The number states in the projection. m (float): The number states in the projection. offset (int): The lowest number state that is included in the finite number state representation of the projector. Returns: Qobj: Requested projection operator. """ ket1 = basis(N, n, offset=offset) ket2 = basis(N, m, offset=offset) return ket1 * ket2.dag() def zero_ket(N, dims=None): """ Creates the zero ket vector with shape Nx1 and dimensions `dims`. Parameters ---------- N : int Hilbert space dimensionality dims : list Optional dimensions if ket corresponds to a composite Hilbert space. Returns ------- zero_ket : qobj Zero ket on given Hilbert space. """ return Qobj(sp.csr_matrix((N, 1), dtype=complex), dims=dims) qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/superoperator.py000077500000000000000000000232731362723322000264620ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### # pylint: disable=invalid-name """ Module for super operators. """ import numpy as np from .qobj import Qobj from .fastsparse import fast_csr_matrix, fast_identity from .sparse import sp_reshape # pylint: disable=no-name-in-module, import-error from .cy.spmath import zcsr_kron # pylint: disable=dangerous-default-value def liouvillian(H, c_ops=[], data_only=False, chi=None): """Assembles the Liouvillian superoperator from a Hamiltonian and a ``list`` of collapse operators. Args: H (qobj.Qobj): System Hamiltonian. c_ops (qobj.Qobj or array_like): A single collapse operator or an array. data_only (bool): Return data only. chi (flaot): Multiplication factor. Returns: qobj.Qobj: Liouvillian superoperator. Raises: ValueError: Chi must be list of len(c_ops). TypeError: Invalidinput types. """ if isinstance(c_ops, (Qobj)): c_ops = [c_ops] if chi and len(chi) != len(c_ops): raise ValueError('chi must be a list with same length as c_ops') h = None if H is not None: h = H if h.isoper: op_dims = h.dims op_shape = h.shape elif h.issuper: op_dims = h.dims[0] op_shape = [np.prod(op_dims[0]), np.prod(op_dims[0])] else: raise TypeError("Invalid type for Hamiltonian.") else: # no hamiltonian given, pick system size from a collapse operator if isinstance(c_ops, list) and any(c_ops) > 0: c = c_ops[0] if c.isoper: op_dims = c.dims op_shape = c.shape elif c.issuper: op_dims = c.dims[0] op_shape = [np.prod(op_dims[0]), np.prod(op_dims[0])] else: raise TypeError("Invalid type for collapse operator.") else: raise TypeError("Either H or c_ops must be given.") sop_dims = [[op_dims[0], op_dims[0]], [op_dims[1], op_dims[1]]] sop_shape = [np.prod(op_dims), np.prod(op_dims)] spI = fast_identity(op_shape[0]) L = None if isinstance(H, Qobj): if H.isoper: Ht = H.data.T data = -1j * zcsr_kron(spI, H.data) data += 1j * zcsr_kron(Ht, spI) else: data = H.data else: data = fast_csr_matrix(shape=(sop_shape[0], sop_shape[1])) for idx, c_op in enumerate(c_ops): c_ = c_op if c_.issuper: data = data + c_.data else: cd = c_.data.H c = c_.data if chi: data = data + (np.exp(1j * chi[idx]) * zcsr_kron(c.conj(), c)) else: data = data + zcsr_kron(c.conj(), c) cdc = cd * c cdct = cdc.T data = data - 0.5 * zcsr_kron(spI, cdc) data = data - 0.5 * zcsr_kron(cdct, spI) if data_only: return data else: L = Qobj() L.dims = sop_dims L.data = data L.superrep = 'super' return L def lindblad_dissipator(a, b=None, data_only=False, chi=None): """ Lindblad dissipator (generalized) for a single pair of collapse operators (a, b), or for a single collapse operator (a) when b is not specified: .. math:: \\mathcal{D}[a,b]\\rho = a \\rho b^\\dagger - \\frac{1}{2}a^\\dagger b\\rho - \\frac{1}{2}\\rho a^\\dagger b Args: a (Qobj): Left part of collapse operator. b (Qobj): Right part of collapse operator. If not specified, b defaults to a. data_only (bool): Return data only. chi (flaot): Multiplication factor. Returns: Qobj: Lindblad dissipator superoperator. """ if b is None: b = a ad_b = a.dag() * b if chi: D = spre(a) * spost(b.dag()) * np.exp(1j * chi) \ - 0.5 * spre(ad_b) - 0.5 * spost(ad_b) else: D = spre(a) * spost(b.dag()) - 0.5 * spre(ad_b) - 0.5 * spost(ad_b) return D.data if data_only else D def operator_to_vector(op): """ Create a vector representation of a quantum operator given the matrix representation. """ q = Qobj() q.dims = [op.dims, [1]] q.data = sp_reshape(op.data.T, (np.prod(op.shape), 1)) return q def vector_to_operator(op): """ Create a matrix representation given a quantum operator in vector form. """ q = Qobj() q.dims = op.dims[0] n = int(np.sqrt(op.shape[0])) q.data = sp_reshape(op.data.T, (n, n)).T return q def mat2vec(mat): """ Private function reshaping matrix to vector. """ return mat.T.reshape(np.prod(np.shape(mat)), 1) def vec2mat(vec): """ Private function reshaping vector to matrix. """ n = int(np.sqrt(len(vec))) return vec.reshape((n, n)).T def vec2mat_index(N, I): """ Convert a vector index to a matrix index pair that is compatible with the vector to matrix rearrangement done by the vec2mat function. """ j = int(I / N) i = I - N * j return i, j def mat2vec_index(N, i, j): """ Convert a matrix index pair to a vector index that is compatible with the matrix to vector rearrangement done by the mat2vec function. """ return i + N * j def spost(A): """Superoperator formed from post-multiplication by operator A Args: A (Qobj): Quantum operator for post multiplication. Returns: Qobj: Superoperator formed from input qauntum object. Raises: TypeError: Invalid inputs. """ if not isinstance(A, Qobj): raise TypeError('Input is not a quantum object') if not A.isoper: raise TypeError('Input is not a quantum operator') S = Qobj(isherm=A.isherm, superrep='super') S.dims = [[A.dims[0], A.dims[1]], [A.dims[0], A.dims[1]]] S.data = zcsr_kron(A.data.T, fast_identity(np.prod(A.shape[0]))) return S def spre(A): """Superoperator formed from pre-multiplication by operator A. Args: A (Qobj): Quantum operator for pre-multiplication. Returns: Qobj: Superoperator formed from input quantum object. Raises: TypeError: Invalid input type. """ if not isinstance(A, Qobj): raise TypeError('Input is not a quantum object') if not A.isoper: raise TypeError('Input is not a quantum operator') S = Qobj(isherm=A.isherm, superrep='super') S.dims = [[A.dims[0], A.dims[1]], [A.dims[0], A.dims[1]]] S.data = zcsr_kron(fast_identity(np.prod(A.shape[1])), A.data) return S def _drop_projected_dims(dims): """ Eliminate subsystems that has been collapsed to only one state due to a projection. """ return [d for d in dims if d != 1] def sprepost(A, B): """Superoperator formed from pre-multiplication by operator A and post- multiplication of operator B. Parameters ---------- A : Qobj or QobjEvo Quantum operator for pre-multiplication. B : Qobj or QobjEvo Quantum operator for post-multiplication. Returns -------- super : Qobj or QobjEvo Superoperator formed from input quantum objects. """ dims = [[_drop_projected_dims(A.dims[0]), _drop_projected_dims(B.dims[1])], [_drop_projected_dims(A.dims[1]), _drop_projected_dims(B.dims[0])]] data = zcsr_kron(B.data.T, A.data) return Qobj(data, dims=dims, superrep='super') qiskit-aer-0.4.1/qiskit/providers/aer/pulse/qutip_lite/tensor.py000077500000000000000000000103611362723322000250540ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # 3. Neither the name of the QuTiP: Quantum Toolbox in Python nor the names # of its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A # PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ############################################################################### """ Module for the creation of composite quantum objects via the tensor product. """ import numpy as np # pylint: disable=no-name-in-module, import-error from .cy.spmath import zcsr_kron from .qobj import Qobj from ..qutip_lite.settings import auto_tidyup def tensor(*args): """Calculates the tensor product of input operators. Args: args (array_like): List or array of quantum objects for tensor product. Returns: qobj.Qobj: A composite quantum object. Raises: TypeError: Requires at least one input argument. """ if not args: raise TypeError("Requires at least one input argument") if len(args) == 1 and isinstance(args[0], (list, np.ndarray)): # this is the case when tensor is called on the form: # tensor([q1, q2, q3, ...]) qlist = args[0] elif len(args) == 1 and isinstance(args[0], Qobj): # tensor is called with a single Qobj as an argument, do nothing return args[0] else: # this is the case when tensor is called on the form: # tensor(q1, q2, q3, ...) qlist = args if not all([isinstance(q, Qobj) for q in qlist]): # raise error if one of the inputs is not a quantum object raise TypeError("One of inputs is not a quantum object") out = Qobj() if qlist[0].issuper: out.superrep = qlist[0].superrep if not all([q.superrep == out.superrep for q in qlist]): raise TypeError("In tensor products of superroperators, all must" + "have the same representation") out.isherm = True for n, q in enumerate(qlist): if n == 0: out.data = q.data out.dims = q.dims else: out.data = zcsr_kron(out.data, q.data) out.dims = [out.dims[0] + q.dims[0], out.dims[1] + q.dims[1]] out.isherm = out.isherm and q.isherm if not out.isherm: out._isherm = None return out.tidyup() if auto_tidyup else out qiskit-aer-0.4.1/qiskit/providers/aer/pulse/readme.md000066400000000000000000000070351362723322000225710ustar00rootroot00000000000000# Openpulse This simulates job using the open pulse format (see the spec). ## Example The Hamiltonian `H=-w_0 * \sigma_z/2 + w_1 * cos(w t + \phi) * \sigma_x/2` may be specified as: ``` hamiltonian = {} hamiltonian['h_str'] = [] #Q0 terms hamiltonian['h_str'].append('-0.5*w0*Z0') hamiltonian['h_str'].append('0.5*w1*X0||D0') hamiltonian['vars'] = {'w0': (add w0 val here), 'w1': (add w1 value here)} # set the qubit dimension to 2 hamiltonian['qub'] = {'0': 2} ``` This Hamiltonian has a closed form in the rotating frame specified in the solving section. Note: Variable names must be lowercase (uppercase is reserved for operators). ## Hamiltonian One of the main components of the open pulse simulator is the specification of the Hamiltonian. The Hamiltonian dictates how the simulation will evolve the dynamics based on the pulse schedule. There are two allowed components to a simulation, *qubits* and *oscillators*. *Qubits* are the objects that will be measured at the end of the simulation. The operators for qubits are defined as Pauli's but if the number of levels is defined to be greater than 2 these will be internally converted to creation and annhilation operators. The Hamiltonian is a dictionary comprised of - `h_str`: Definition of the Hamiltonian in terms of operators, drives and coefficients - `vars`: Numeric values for the variables in the Hamiltonian - `qubs`: Dictionary indicating the number of levels for each qubit to use in the simulation - `osc`: Dictionary indicating the number of levels for each oscillator to use in the simulation There must be qubits, but there does not need to be oscillators. Measurements are given by the qubit state; the measurement process is not simulated. ### `h_str` Syntax The `h_str` is a list of strings which indicate various terms in the Hamiltonian. These can have the form `||` or `` where `` is a string form of an operator with coefficients and `` indicates one of the time-dependent drive channels (e.g. `D2` or `U10`). Additionally, there is a sum form `_SUM[i,n1,n2,F[{i}]]` where {i} is replaced in each loop by the value. Available operators are: {'X': sigmax, 'Y': sigmay, 'Z': sigmaz, 'Sp': creation (sigma plus), 'Sm': destruction (sigma minus), 'I': identity, 'O': number, 'P': projection, 'A': destruction, 'C': creation, 'N': number op} The following functions are also available: {'cos': cos, 'sin': sin, 'exp': exp, 'sqrt': sqrt, 'conj': complex conjugate, 'dag': dagger (Hermitian conjugate)} ## Solving The solver takes the Hamiltonian (`H(t=0)`) and sets all drive/control channels to zero. Consider `H_d` to be the diagonal elements of `H(t=0)`, then the transformation applied to the statevector `\psi` is `U=e^{-i H_d t/hbar}` (`\psi \rightarrow U \psi). For all drive/control channels, the LO is applied so `d(t) -> D(t)e^{-i w t}`. The LO frequency `w` may be set in the pulse. If the drive is associated with some operator *B* then the upper triangular part of *B* is multiplied by `d(t)` and the lower triangular part by `d*(t)`. This ensures the Hamiltonian is Hermitian and also that in the transformed frame that a resonant pulse is close to DC. ### Measurement The measurement operators are the projections onto the 1 excitation subsystem for qubit `l` where qubit `l` is defined by diagonalizing `H(t=0)` (i.e. the dressed basis). There are three measurement levels that return the data. Measurement level `0` gives the raw data. Measurement level `1` gives complex numbers (IQ values). Measurement level `2` gives the discriminated states, `|0>` and `|1>`. qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/000077500000000000000000000000001362723322000223175ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/__init__.py000066400000000000000000000007741362723322000244400ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/codegen.py000066400000000000000000000226501362723322000243020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # pylint: disable=invalid-name """OpenPulse runtime code generator""" import os import sys from ..qutip_lite import cy from . import settings _cython_path = os.path.abspath(cy.__file__).replace('__init__.py', '') _cython_path = _cython_path.replace("\\", "/") _include_string = "'" + _cython_path + "complex_math.pxi'" class OPCodegen(): """ Class for generating cython code files at runtime. """ def __init__(self, op_system): sys.path.append(os.getcwd()) # Hamiltonian time-depdendent pieces self.op_system = op_system self.dt = op_system.dt self.num_ham_terms = self.op_system.global_data['num_h_terms'] # Code generator properties self._file = None self.code = [] # strings to be written to file self.level = 0 # indent level self.spline_count = 0 def write(self, string): """write lines of code to self.code""" self.code.append(" " * self.level + string + "\n") def file(self, filename): """open file called filename for writing""" self._file = open(filename, "w") def generate(self, filename="rhs.pyx"): """generate the file""" for line in cython_preamble(): self.write(line) # write function for Hamiltonian terms (there is always at least one # term) for line in cython_checks() + self.ODE_func_header(): self.write(line) self.indent() for line in func_header(self.op_system): self.write(line) for line in self.channels(): self.write(line) for line in self.func_vars(): self.write(line) for line in self.func_end(): self.write(line) self.dedent() self.file(filename) self._file.writelines(self.code) self._file.close() settings.CGEN_NUM += 1 def indent(self): """increase indention level by one""" self.level += 1 def dedent(self): """decrease indention level by one""" if self.level == 0: raise SyntaxError("Error in code generator") self.level -= 1 def ODE_func_header(self): """Creates function header for time-dependent ODE RHS.""" func_name = "def cy_td_ode_rhs(" # strings for time and vector variables input_vars = ("\n double t" + ",\n complex[::1] vec") # add diagonal hamiltonian terms input_vars += (",\n double[::1] energ") for k in range(self.num_ham_terms): input_vars += (",\n " + "complex[::1] data%d, " % k + "int[::1] idx%d, " % k + "int[::1] ptr%d" % k) # Add global vaiables input_vars += (",\n " + "complex[::1] pulse_array") input_vars += (",\n " + "unsigned int[::1] pulse_indices") # Add per experiment variables for key in self.op_system.channels.keys(): input_vars += (",\n " + "double[::1] %s_pulses" % key) input_vars += (",\n " + "double[::1] %s_fc" % key) # add Hamiltonian variables for key in self.op_system.vars.keys(): input_vars += (",\n " + "complex %s" % key) # add Freq variables for key in self.op_system.freqs.keys(): input_vars += (",\n " + "double %s_freq" % key) # register input_vars += (",\n " + "unsigned char[::1] register") func_end = "):" return [func_name + input_vars + func_end] def channels(self): """Write out the channels """ channel_lines = [""] channel_lines.append("# Compute complex channel values at time `t`") for chan, idx in self.op_system.channels.items(): chan_str = "%s = chan_value(t, %s, %s_freq, " % (chan, idx, chan) + \ "%s_pulses, pulse_array, pulse_indices, " % chan + \ "%s_fc, register)" % (chan) channel_lines.append(chan_str) channel_lines.append('') return channel_lines def func_vars(self): """Writes the variables and spmv parts""" func_vars = [] sp1 = " " sp2 = sp1 + sp1 func_vars.append("# Eval the time-dependent terms and do SPMV.") for idx in range(len(self.op_system.system) + 1): if (idx == len(self.op_system.system) and (len(self.op_system.system) < self.num_ham_terms)): # this is the noise term term = [1.0, 1.0] elif idx < len(self.op_system.system): term = self.op_system.system[idx] else: continue if isinstance(term, list) or term[1]: func_vars.append("td%s = %s" % (idx, term[1])) else: func_vars.append("td%s = 1.0" % (idx)) func_vars.append("if abs(td%s) > 1e-15:" % idx) func_vars.append(sp1 + "for row in range(num_rows):") func_vars.append(sp2 + "dot = 0;") func_vars.append(sp2 + "row_start = ptr%d[row];" % idx) func_vars.append(sp2 + "row_end = ptr%d[row+1];" % idx) func_vars.append(sp2 + "for jj in range(row_start,row_end):") func_vars.append(sp1 + sp2 + "osc_term = exp(1j*(energ[row]-energ[idx%d[jj]])*t)" % idx) func_vars.append(sp1 + sp2 + "if rowPyDataMem_NEW(num_rows * sizeof(complex))', 'memset(&out[0],0,num_rows * sizeof(complex))' ] func_vars.append("") for val in op_system.channels: func_vars.append("cdef double complex %s" % val) for kk in range(len(op_system.system) + 1): func_vars.append("cdef double complex td%s" % kk) return func_vars def cython_preamble(): """ Returns list of code segments for Cython preamble. """ preamble = ["""\ #!python #cython: language_level=3 # This code is part of Qiskit. # # (C) Copyright IBM 2017, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import numpy as np cimport numpy as np cimport cython np.import_array() cdef extern from "numpy/arrayobject.h" nogil: void PyDataMem_NEW(size_t size) void PyArray_ENABLEFLAGS(np.ndarray arr, int flags) cdef extern from "" namespace "std" nogil: double complex exp(double complex x) cdef extern from "" namespace "std" nogil: double complex conj(double complex x) from qiskit.providers.aer.pulse.qutip_lite.cy.spmatfuncs cimport spmvpy from libc.math cimport pi from qiskit.providers.aer.pulse.cy.channel_value cimport chan_value from libc.string cimport memset include """ + _include_string + """ """] return preamble def cython_checks(): """ List of strings that turn off Cython checks. """ return ["""@cython.cdivision(True) @cython.boundscheck(False) @cython.wraparound(False)"""] qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/data_config.py000066400000000000000000000102421362723322000251260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=invalid-name """Data configuration module""" import numpy as np pi = np.pi def op_data_config(op_system): """ Preps the data for the opsolver. Everything is stored in the passed op_system. Args: op_system (OPSystem): An openpulse system. """ num_h_terms = len(op_system.system) H = [hpart[0] for hpart in op_system.system] op_system.global_data['num_h_terms'] = num_h_terms # take care of collapse operators, if any op_system.global_data['c_num'] = 0 if op_system.noise: op_system.global_data['c_num'] = len(op_system.noise) op_system.global_data['num_h_terms'] += 1 op_system.global_data['c_ops_data'] = [] op_system.global_data['c_ops_ind'] = [] op_system.global_data['c_ops_ptr'] = [] op_system.global_data['n_ops_data'] = [] op_system.global_data['n_ops_ind'] = [] op_system.global_data['n_ops_ptr'] = [] op_system.global_data['h_diag_elems'] = op_system.h_diag # if there are any collapse operators H_noise = 0 for kk in range(op_system.global_data['c_num']): c_op = op_system.noise[kk] n_op = c_op.dag() * c_op # collapse ops op_system.global_data['c_ops_data'].append(c_op.data.data) op_system.global_data['c_ops_ind'].append(c_op.data.indices) op_system.global_data['c_ops_ptr'].append(c_op.data.indptr) # norm ops op_system.global_data['n_ops_data'].append(n_op.data.data) op_system.global_data['n_ops_ind'].append(n_op.data.indices) op_system.global_data['n_ops_ptr'].append(n_op.data.indptr) # Norm ops added to time-independent part of # Hamiltonian to decrease norm H_noise -= 0.5j * n_op if H_noise: H = H + [H_noise] # construct data sets op_system.global_data['h_ops_data'] = [-1.0j * hpart.data.data for hpart in H] op_system.global_data['h_ops_ind'] = [hpart.data.indices for hpart in H] op_system.global_data['h_ops_ptr'] = [hpart.data.indptr for hpart in H] # setup ode args string ode_var_str = "" # diagonal elements ode_var_str += "global_data['h_diag_elems'], " # Hamiltonian data for kk in range(op_system.global_data['num_h_terms']): h_str = "global_data['h_ops_data'][%s], " % kk h_str += "global_data['h_ops_ind'][%s], " % kk h_str += "global_data['h_ops_ptr'][%s], " % kk ode_var_str += h_str # Add pulse array and pulse indices ode_var_str += "global_data['pulse_array'], " ode_var_str += "global_data['pulse_indices'], " var_list = list(op_system.vars.keys()) final_var = var_list[-1] freq_list = list(op_system.freqs.keys()) final_freq = freq_list[-1] # Now add channel variables chan_list = list(op_system.channels.keys()) final_chan = chan_list[-1] for chan in chan_list: ode_var_str += "exp['channels']['%s'][0], " % chan ode_var_str += "exp['channels']['%s'][1]" % chan if chan != final_chan or var_list: ode_var_str += ', ' # now do the variables for idx, var in enumerate(var_list): ode_var_str += "global_data['vars'][%s]" % idx if var != final_var or freq_list: ode_var_str += ', ' # now do the freq for idx, freq in enumerate(freq_list): ode_var_str += "global_data['freqs'][%s]" % idx if freq != final_freq: ode_var_str += ', ' # Add register ode_var_str += ", register" op_system.global_data['string'] = ode_var_str # Convert inital state to flat array in global_data op_system.global_data['initial_state'] = \ op_system.initial_state.full().ravel() qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/monte_carlo.py000066400000000000000000000164751362723322000252100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # pylint: disable=no-name-in-module, import-error, unused-variable, invalid-name """Monte carlo wave function solver.""" from math import log import logging import numpy as np from scipy.integrate import ode from scipy.linalg.blas import get_blas_funcs from qiskit.providers.aer.pulse.solver.zvode import qiskit_zvode from qiskit.providers.aer.pulse.cy.measure import occ_probabilities, write_shots_memory from ..qutip_lite.cy.spmatfuncs import cy_expect_psi_csr, spmv_csr dznrm2 = get_blas_funcs("znrm2", dtype=np.float64) def monte_carlo(seed, exp, op_system): """ Monte Carlo algorithm returning state-vector or expectation values at times tlist for a single trajectory. """ global_data = op_system.global_data ode_options = op_system.ode_options cy_rhs_func = global_data['rhs_func'] rng = np.random.RandomState(seed) tlist = exp['tlist'] snapshots = [] # Init memory memory = np.zeros((1, global_data['memory_slots']), dtype=np.uint8) # Init register register = np.zeros(global_data['n_registers'], dtype=np.uint8) # Get number of acquire, snapshots, and conditionals num_acq = len(exp['acquire']) acq_idx = 0 num_snap = len(exp['snapshot']) snap_idx = 0 num_cond = len(exp['cond']) cond_idx = 0 collapse_times = [] collapse_operators = [] # first rand is collapse norm, second is which operator rand_vals = rng.rand(2) ODE = ode(cy_rhs_func) if op_system.use_cpp_ode_func: # Don't know how to use OrderedDict type on Cython, so transforming it to dict channels = dict(op_system.channels) ODE.set_f_params(global_data, exp, op_system.system, channels, register) else: _inst = 'ODE.set_f_params(%s)' % global_data['string'] logging.debug("Monte Carlo: %s\n\n", _inst) code = compile(_inst, '', 'exec') # pylint: disable=exec-used exec(code) # initialize ODE solver for RHS ODE._integrator = qiskit_zvode(method=ode_options.method, order=ode_options.order, atol=ode_options.atol, rtol=ode_options.rtol, nsteps=ode_options.nsteps, first_step=ode_options.first_step, min_step=ode_options.min_step, max_step=ode_options.max_step ) # Forces complex ODE solving if not any(ODE._y): ODE.t = 0.0 ODE._y = np.array([0.0], complex) ODE._integrator.reset(len(ODE._y), ODE.jac is not None) ODE.set_initial_value(global_data['initial_state'], 0) # make array for collapse operator inds cinds = np.arange(global_data['c_num']) n_dp = np.zeros(global_data['c_num'], dtype=float) # RUN ODE UNTIL EACH TIME IN TLIST for stop_time in tlist: # ODE WHILE LOOP FOR INTEGRATE UP TO TIME TLIST[k] while ODE.t < stop_time: t_prev = ODE.t y_prev = ODE.y norm2_prev = dznrm2(ODE._y) ** 2 # integrate up to stop_time, one step at a time. ODE.integrate(stop_time, step=1) if not ODE.successful(): raise Exception("ZVODE step failed!") norm2_psi = dznrm2(ODE._y) ** 2 if norm2_psi <= rand_vals[0]: # collapse has occured: # find collapse time to within specified tolerance # ------------------------------------------------ ii = 0 t_final = ODE.t while ii < ode_options.norm_steps: ii += 1 t_guess = t_prev + \ log(norm2_prev / rand_vals[0]) / \ log(norm2_prev / norm2_psi) * (t_final - t_prev) ODE._y = y_prev ODE.t = t_prev ODE._integrator.call_args[3] = 1 ODE.integrate(t_guess, step=0) if not ODE.successful(): raise Exception( "ZVODE failed after adjusting step size!") norm2_guess = dznrm2(ODE._y)**2 if (abs(rand_vals[0] - norm2_guess) < ode_options.norm_tol * rand_vals[0]): break if norm2_guess < rand_vals[0]: # t_guess is still > t_jump t_final = t_guess norm2_psi = norm2_guess else: # t_guess < t_jump t_prev = t_guess y_prev = ODE.y norm2_prev = norm2_guess if ii > ode_options.norm_steps: raise Exception("Norm tolerance not reached. " + "Increase accuracy of ODE solver or " + "Options.norm_steps.") collapse_times.append(ODE.t) # all constant collapse operators. for i in range(n_dp.shape[0]): n_dp[i] = cy_expect_psi_csr(global_data['n_ops_data'][i], global_data['n_ops_ind'][i], global_data['n_ops_ptr'][i], ODE._y, 1) # determine which operator does collapse and store it _p = np.cumsum(n_dp / np.sum(n_dp)) j = cinds[_p >= rand_vals[1]][0] collapse_operators.append(j) state = spmv_csr(global_data['c_ops_data'][j], global_data['c_ops_ind'][j], global_data['c_ops_ptr'][j], ODE._y) state /= dznrm2(state) ODE._y = state ODE._integrator.call_args[3] = 1 rand_vals = rng.rand(2) # after while loop (Do measurement or conditional) # ------------------------------------------------ out_psi = ODE._y / dznrm2(ODE._y) for aind in range(acq_idx, num_acq): if exp['acquire'][aind][0] == stop_time: current_acq = exp['acquire'][aind] qubits = current_acq[1] memory_slots = current_acq[2] probs = occ_probabilities(qubits, out_psi, global_data['measurement_ops']) rand_vals = rng.rand(memory_slots.shape[0]) write_shots_memory(memory, memory_slots, probs, rand_vals) acq_idx += 1 return memory qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/opsolve.py000066400000000000000000000235661362723322000243740ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=no-name-in-module, import-error, invalid-name """The main OpenPulse solver routine. """ import time import numpy as np from scipy.linalg.blas import get_blas_funcs from qiskit.tools.parallel import parallel_map, CPU_COUNT from ..qutip_lite.cy.spmatfuncs import cy_expect_psi_csr from ..qutip_lite.cy.utilities import _cython_build_cleanup from ..qobj.operators import apply_projector from .rhs_utils import _op_generate_rhs, _op_func_load from .data_config import op_data_config from .unitary import unitary_evolution from .monte_carlo import monte_carlo dznrm2 = get_blas_funcs("znrm2", dtype=np.float64) # # Internal, global variables for storing references to dynamically loaded # cython functions # _cy_rhs_func = None def opsolve(op_system): """Opsolver """ if not op_system.initial_state.isket: raise Exception("Initial state must be a state vector.") # set num_cpus to the value given in settings if none in Options if not op_system.ode_options.num_cpus: op_system.ode_options.num_cpus = CPU_COUNT # build Hamiltonian data structures op_data_config(op_system) if not op_system.use_cpp_ode_func: # compile Cython RHS _op_generate_rhs(op_system) # Load cython function _op_func_load(op_system) # load monte carlo class montecarlo = OP_mcwf(op_system) # Run the simulation out = montecarlo.run() # Results are stored in ophandler.result return out # ----------------------------------------------------------------------------- # MONTE CARLO CLASS # ----------------------------------------------------------------------------- class OP_mcwf(): """ Private class for solving Monte Carlo evolution """ def __init__(self, op_system): self.op_system = op_system # set output variables, even if they are not used to simplify output # code. self.output = None self.collapse_times = None self.collapse_operator = None # FOR EVOLUTION WITH COLLAPSE OPERATORS if not op_system.can_sample: # preallocate ntraj arrays for state vectors, collapse times, and # which operator self.collapse_times = [[] for kk in range(op_system.global_data['shots'])] self.collapse_operators = [[] for kk in range(op_system.global_data['shots'])] # setup seeds array if op_system.global_data['seed']: prng = np.random.RandomState(op_system.global_data['seed']) else: prng = np.random.RandomState( np.random.randint(np.iinfo(np.int32).max - 1)) for exp in op_system.experiments: exp['seed'] = prng.randint(np.iinfo(np.int32).max - 1) def run(self): """Runs the solver. """ map_kwargs = {'num_processes': self.op_system.ode_options.num_cpus} # exp_results from the solvers return the values of the measurement # operators # If no collapse terms, and only measurements at end # can do a single shot. # exp_results is a list of '0' and '1' # where '0' occurs with probability 1- # and '1' occurs with probability # M is the measurement operator, which is a projector # into one of the qubit states (usually |1>) if self.op_system.can_sample: start = time.time() exp_results = parallel_map(unitary_evolution, self.op_system.experiments, task_args=(self.op_system,), **map_kwargs ) end = time.time() exp_times = (np.ones(len(self.op_system.experiments)) * (end - start) / len(self.op_system.experiments)) # need to simulate each trajectory, so shots*len(experiments) times # Do a for-loop over experiments, and do shots in parallel_map else: exp_results = [] exp_times = [] for exp in self.op_system.experiments: start = time.time() rng = np.random.RandomState(exp['seed']) seeds = rng.randint(np.iinfo(np.int32).max - 1, size=self.op_system.global_data['shots']) exp_res = parallel_map(monte_carlo, seeds, task_args=(exp, self.op_system,), **map_kwargs) # exp_results is a list for each shot # so transform back to an array of shots exp_res2 = [] for exp_shot in exp_res: exp_res2.append(exp_shot[0].tolist()) end = time.time() exp_times.append(end - start) exp_results.append(np.array(exp_res2)) # format the data into the proper output all_results = [] for idx_exp, exp in enumerate(self.op_system.experiments): m_lev = self.op_system.global_data['meas_level'] m_ret = self.op_system.global_data['meas_return'] # populate the results dictionary results = {'seed_simulator': exp['seed'], 'shots': self.op_system.global_data['shots'], 'status': 'DONE', 'success': True, 'time_taken': exp_times[idx_exp], 'header': exp['header'], 'meas_level': m_lev, 'meas_return': m_ret, 'data': {}} if self.op_system.can_sample: memory = exp_results[idx_exp][0] results['data']['statevector'] = [] for coef in exp_results[idx_exp][1]: results['data']['statevector'].append([np.real(coef), np.imag(coef)]) results['header']['ode_t'] = exp_results[idx_exp][2] else: memory = exp_results[idx_exp] # meas_level 2 return the shots if m_lev == 2: # convert the memory **array** into a n # integer # e.g. [1,0] -> 2 int_mem = memory.dot(np.power(2.0, np.arange(memory.shape[1]))).astype(int) # if the memory flag is set return each shot if self.op_system.global_data['memory']: hex_mem = [hex(val) for val in int_mem] results['data']['memory'] = hex_mem # Get hex counts dict unique = np.unique(int_mem, return_counts=True) hex_dict = {} for kk in range(unique[0].shape[0]): key = hex(unique[0][kk]) hex_dict[key] = unique[1][kk] results['data']['counts'] = hex_dict # meas_level 1 returns the elif m_lev == 1: if m_ret == 'avg': memory = [np.mean(memory, 0)] # convert into the right [real, complex] pair form for json # this should be cython? results['data']['memory'] = [] for mem_shot in memory: results['data']['memory'].append([]) for mem_slot in mem_shot: results['data']['memory'][-1].append( [np.real(mem_slot), np.imag(mem_slot)]) if m_ret == 'avg': results['data']['memory'] = results['data']['memory'][0] all_results.append(results) if not self.op_system.use_cpp_ode_func: _cython_build_cleanup(self.op_system.global_data['rhs_file_name']) return all_results # Measurement def _proj_measurement(pid, ophandler, tt, state, memory, register=None): """ Projection measurement of quantum state """ prng = np.random.RandomState(np.random.randint(np.iinfo(np.int32).max - 1)) qubits = [] results = [] for key, acq in ophandler._acqs.items(): if pid < 0: if any(acq.m_slot): mem_slot_id = acq.m_slot[-1] else: continue reg_slot_id = None else: if tt in acq.t1: mem_slot_id = acq.m_slot[acq.t1.index(tt)] reg_slot_id = acq.r_slot[acq.t1.index(tt)] else: continue oper = ophandler._measure_ops[acq.name] p_q = cy_expect_psi_csr(oper.data.data, oper.data.indices, oper.data.indptr, state, 1) # level2 measurement rnd = prng.rand() if rnd <= p_q: outcome = 1 else: outcome = 0 memory[mem_slot_id][0] = outcome if reg_slot_id is not None and register is not None: register[reg_slot_id] = outcome qubits.append(key) results.append(outcome) # projection if any(qubits): psi_proj = apply_projector(qubits, results, ophandler.h_qub, ophandler.h_osc, state) else: psi_proj = state return psi_proj qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/options.py000066400000000000000000000104451362723322000243700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """OpenPulse options""" class OPoptions(): """ Class of options for opsolver. Options can be specified either as arguments to the constructor:: opts = Options(order=10, ...) or by changing the class attributes after creation:: opts = Options() opts.order = 10 Returns options class to be used as options in evolution solvers. Attributes: atol (float, 1e-8): Absolute tolerance. rtol (float, 1e-/6): Relative tolerance. method (str, 'adams'): Integration method, 'adams' or 'bdf'. order (int, 12): Order of integrator (<=12 'adams', <=5 'bdf'). nsteps (int, 50000): Max. number of internal steps per time interval. first_step (float, 0): Size of initial step (0 = automatic). min_step (float, 0): Minimum step size (0 = automatic). max_step (float, 0): Maximum step size (0 = automatic) num_cpus (int): Number of cpus used by mcsolver (default = # of cpus). norm_tol (float, 1e-3): Tolerance used when finding wavefunction norm. norm_steps (int, 5): Max. number of steps used to find wavefunction norm to within norm_tol shots (int, 1024): Number of shots to run. rhs_reuse (bool, False): Reuse RHS compiled function. rhs_filename (str): Name of compiled Cython module. seeds (ndarray, None): Array containing random number seeds for repeatible shots. reuse_seeds (bool, False): Reuse seeds, if already generated. store_final_state (bool, False): Whether or not to store the final state of the evolution. """ def __init__(self, atol=1e-8, rtol=1e-6, method='adams', order=12, nsteps=50000, first_step=0, max_step=0, min_step=0, num_cpus=0, norm_tol=1e-3, norm_steps=5, progress_bar=True, rhs_reuse=False, rhs_filename=None, shots=1024, store_final_state=False, seeds=None, reuse_seeds=False): # Absolute tolerance (default = 1e-8) self.atol = atol # Relative tolerance (default = 1e-6) self.rtol = rtol # Integration method (default = 'adams', for stiff 'bdf') self.method = method # Max. number of internal steps/call self.nsteps = nsteps # Size of initial step (0 = determined by solver) self.first_step = first_step # Minimal step size (0 = determined by solver) self.min_step = min_step # Max step size (0 = determined by solver) self.max_step = max_step # Maximum order used by integrator (<=12 for 'adams', <=5 for 'bdf') self.order = order # Number of shots to run (default=500) self.shots = shots # Holds seeds for rand num gen self.seeds = seeds # reuse seeds self.reuse_seeds = reuse_seeds # Use preexisting RHS function for time-dependent solvers self.rhs_reuse = rhs_reuse # Track progress self.progress_bar = progress_bar # Use filename for preexisting RHS function (will default to last # compiled function if None & rhs_exists=True) self.rhs_filename = rhs_filename # Number of processors to use if num_cpus: self.num_cpus = num_cpus else: self.num_cpus = 0 # Tolerance for wavefunction norm (mcsolve only) self.norm_tol = norm_tol # Max. number of steps taken to find wavefunction norm to within # norm_tol (mcsolve only) self.norm_steps = norm_steps # store final state? self.store_final_state = store_final_state def __str__(self): return str(vars(self)) def __repr__(self): return self.__str__() qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/rhs_utils.py000066400000000000000000000034601362723322000247100ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """Routines for generating and loading runtime RHS function""" import os from .codegen import OPCodegen from . import settings as op_set def _op_generate_rhs(op_system): """ Generates the RHS Cython file for solving the sytem described in op_system Args: op_system (OPSystem): An OpenPulse system object. """ name = "rhs" + str(os.getpid()) + str(op_set.CGEN_NUM) + '_op' op_system.global_data['rhs_file_name'] = name cgen = OPCodegen(op_system) cgen.generate(name + ".pyx") def _op_func_load(op_system): """Loads the Cython function defined in the file `rhs_file_name.pyx` where `rhs_file_name` is stored in the op_system. Args: op_system (OPSystem): An OpenPulse system object. """ if op_system.use_cpp_ode_func: # pylint: disable=no-name-in-module, import-error, import-outside-toplevel from ..cy.numeric_integrator_wrapper import td_ode_rhs_static op_system.global_data['rhs_func'] = td_ode_rhs_static else: code = compile('from ' + op_system.global_data['rhs_file_name'] + ' import cy_td_ode_rhs', '', 'exec') # pylint: disable=exec-used exec(code, globals()) # pylint: disable=undefined-variable op_system.global_data['rhs_func'] = cy_td_ode_rhs qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/settings.py000066400000000000000000000011131362723322000245250ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """Holds OpenPulse solver settings""" # Code generation counter CGEN_NUM = 0 qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/unitary.py000066400000000000000000000076751362723322000244030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=unused-variable, no-name-in-module, protected-access, # pylint: disable=invalid-name, import-error, exec-used """Module for unitary pulse evolution. """ import logging import numpy as np from scipy.integrate import ode from scipy.linalg.blas import get_blas_funcs from ..cy.measure import occ_probabilities, write_shots_memory dznrm2 = get_blas_funcs("znrm2", dtype=np.float64) def unitary_evolution(exp, op_system): """ Calculates evolution when there is no noise, or any measurements that are not at the end of the experiment. Args: exp (dict): Dictionary of experimental pulse and fc op_system (OPSystem): Global OpenPulse system settings Returns: array: Memory of shots. Raises: Exception: Error in ODE solver. """ global_data = op_system.global_data ode_options = op_system.ode_options cy_rhs_func = global_data['rhs_func'] rng = np.random.RandomState(exp['seed']) tlist = exp['tlist'] snapshots = [] shots = global_data['shots'] # Init memory memory = np.zeros((shots, global_data['memory_slots']), dtype=np.uint8) # Init register register = np.zeros(global_data['n_registers'], dtype=np.uint8) num_channels = len(exp['channels']) ODE = ode(cy_rhs_func) if op_system.use_cpp_ode_func: # Don't know how to use OrderedDict type on Cython, so transforming it to dict channels = dict(op_system.channels) ODE.set_f_params(global_data, exp, op_system.system, channels, register) else: _inst = 'ODE.set_f_params(%s)' % global_data['string'] logging.debug("Unitary Evolution: %s\n\n", _inst) code = compile(_inst, '', 'exec') exec(code) # pylint disable=exec-used ODE.set_integrator('zvode', method=ode_options.method, order=ode_options.order, atol=ode_options.atol, rtol=ode_options.rtol, nsteps=ode_options.nsteps, first_step=ode_options.first_step, min_step=ode_options.min_step, max_step=ode_options.max_step) if not ODE._y: ODE.t = 0.0 ODE._y = np.array([0.0], complex) ODE._integrator.reset(len(ODE._y), ODE.jac is not None) # Since all experiments are defined to start at zero time. ODE.set_initial_value(global_data['initial_state'], 0) for time in tlist[1:]: ODE.integrate(time, step=0) if ODE.successful(): psi = ODE.y / dznrm2(ODE.y) else: err_msg = 'ZVODE exited with status: %s' % ODE.get_return_code() raise Exception(err_msg) # Do any snapshots here # set channel and frame change indexing arrays # Do final measurement at end, only take acquire channels at the end psi_rot = np.exp(-1j * global_data['h_diag_elems'] * ODE.t) psi *= psi_rot qubits = [] memory_slots = [] for acq in exp['acquire']: if acq[0] == tlist[-1]: qubits += list(acq[1]) memory_slots += list(acq[2]) qubits = np.array(qubits, dtype='uint32') memory_slots = np.array(memory_slots, dtype='uint32') probs = occ_probabilities(qubits, psi, global_data['measurement_ops']) rand_vals = rng.rand(memory_slots.shape[0] * shots) write_shots_memory(memory, memory_slots, probs, rand_vals) return [memory, psi, ODE.t] qiskit-aer-0.4.1/qiskit/providers/aer/pulse/solver/zvode.py000066400000000000000000000023421362723322000240210ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # This file is part of QuTiP: Quantum Toolbox in Python. # # Copyright (c) 2011 and later, Paul D. Nation and Robert J. Johansson. # All rights reserved. # pylint: disable=no-value-for-parameter, invalid-name """Hack for the ZVODE solver to do the correct stepping without restart.""" from scipy.integrate._ode import zvode class qiskit_zvode(zvode): """Modifies the stepper for ZVODE so that it always stops at a given time in tlist. By default, it over shoots the time, which of course is just stupid. """ def step(self, *args): itask = self.call_args[2] self.rwork[0] = args[4] self.call_args[2] = 5 r = self.run(*args) self.call_args[2] = itask return r qiskit-aer-0.4.1/qiskit/providers/aer/utils/000077500000000000000000000000001362723322000210155ustar00rootroot00000000000000qiskit-aer-0.4.1/qiskit/providers/aer/utils/__init__.py000066400000000000000000000025241362723322000231310ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ ============================================= Utilities (:mod:`qiskit.providers.aer.utils`) ============================================= .. currentmodule:: qiskit.providers.aer.utils This module contains utility functions for modifying :class:`~qiskit.providers.aer.noise.NoiseModel` objects and ``QuantumCircuits`` using noise models. Classes ======= .. autosummary:: :toctree: ../stubs/ NoiseTransformer Functions ========= .. autosummary:: :toctree: ../stubs/ remap_noise_model insert_noise approximate_quantum_error approximate_noise_model """ from .noise_remapper import remap_noise_model from .noise_transformation import NoiseTransformer from .noise_transformation import approximate_quantum_error from .noise_transformation import approximate_noise_model from .noise_model_inserter import insert_noise from . import qobj_utils qiskit-aer-0.4.1/qiskit/providers/aer/utils/noise_model_inserter.py000066400000000000000000000046611362723322000256060ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Noise model inserter module The goal of this module is to add QuantumError gates (Kraus gates) to a circuit based on a given noise model. """ import qiskit.compiler def insert_noise(circuits, noise_model, transpile=False): """Return a noisy version of a QuantumCircuit. Args: circuits (QuantumCircuit or list[QuantumCircuit]): Input noise-free circuits. noise_model (NoiseModel): The noise model containing the errors to add transpile (Boolean): Should the circuit be transpiled into the noise model basis gates Returns: QuantumCircuit: The new circuit with the Kraus noise instructions inserted. Additional Information: The noisy circuit return by this function will consist of the original circuit with ``Kraus`` instructions inserted after all instructions referenced in the ``noise_model``. The resulting circuit cannot be ran on a quantum computer but can be executed on the :class:`~qiskit.providers.aer.QasmSimulator`. """ is_circuits_list = isinstance(circuits, (list, tuple)) circuits = circuits if is_circuits_list else [circuits] result_circuits = [] errors = noise_model._default_quantum_errors for circuit in circuits: if transpile: transpiled_circuit = qiskit.compiler.transpile(circuit, basis_gates=noise_model.basis_gates) else: transpiled_circuit = circuit result_circuit = circuit.copy(name=transpiled_circuit.name + '_with_noise') result_circuit.data = [] for inst, qargs, cargs in transpiled_circuit.data: result_circuit.data.append((inst, qargs, cargs)) if inst.name in errors.keys(): error = errors[inst.name] result_circuit.append(error.to_instruction(), qargs) result_circuits.append(result_circuit) return result_circuits if is_circuits_list else result_circuits[0] qiskit-aer-0.4.1/qiskit/providers/aer/utils/noise_remapper.py000066400000000000000000000115201362723322000243760ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Remap qubits in a NoiseModel. """ import logging from ..noise.noise_model import NoiseModel from ..noise.noiseerror import NoiseError logger = logging.getLogger(__name__) def remap_noise_model(noise_model, remapping, discard_qubits=False, warnings=True): """Remap qubits in a noise model. This remaps the specified gate qubits for local quantum errors, the gate and noise qubits for non-local quantum errors, and the gate qubits for local ReadoutErrors. All-qubit quantum and readout errors are unaffected. Args: noise_model (NoiseModel): a noise model to remap qubits. remapping (list): list or remappings of old qubit to new qubit. See Additional Information. discard_qubits (bool): if True discard qubits not in remapping keys, if False an identity mapping wil be assumed for unnamed qubits (Default: False). warnings (bool): display warnings if qubits being remapped are not in the input noise model (Default: True). Returns: NoiseModel: a new noise model with the same errors but remapped gate and noise qubits for local and non-local errors. Raises: NoiseError: if remapping has duplicate qubits in the remapped qubits. Additional Information: * The remapping map be specified as either a list of pairs: ``[(old, new), ...]``, or a list of old qubits where the new qubit is inferred from the position: ``[old0, old1, ...]`` is treated as ``[(old0, 0), (old1, 1), ...]``. * If ``discard_qubits`` is ``False``, any qubits in the noise model not specified in the list of old qubits will be added to the remapping as a trivial mapping ``(qubit, qubit)``. """ if not isinstance(noise_model, NoiseModel): raise NoiseError("Input must be a NoiseModel.") if warnings: # Warning if remapped qubit isn't in noise model for qubit in remapping: if qubit not in noise_model.noise_qubits: logger.warning('Warning: qubit %s is not in noise model', qubit) # Convert remapping into a inverse mapping dict inv_map = {} for pos, item in enumerate(remapping): if isinstance(item, (list, tuple)) and len(item) == 2: inv_map[int(item[0])] = int(item[1]) elif isinstance(item, int): inv_map[item] = pos # Add noise model qubits not in mapping as identity mapping if not discard_qubits: for qubit in noise_model.noise_qubits: if qubit not in inv_map: inv_map[qubit] = qubit # Check mapping doesn't have duplicate qubits in output new_qubits = list(inv_map.values()) if len(set(new_qubits)) != len(new_qubits): raise NoiseError('Duplicate qubits in remapping: {}'.format(inv_map)) # Convert noise model to dict nm_dict = noise_model.to_dict() # Indexes of errors to keep new_errors = [] for error in nm_dict['errors']: keep_error = True gate_qubits = error.get('gate_qubits', []) noise_qubits = error.get('noise_qubits', []) for qubits in gate_qubits + noise_qubits: for qubit in qubits: if qubit not in inv_map: keep_error = False break # If any qubits were not in the full_mapping we discard error if keep_error: new_gate_qubits = gate_qubits for i, qubits in enumerate(gate_qubits): for j, qubit in enumerate(qubits): new_gate_qubits[i][j] = inv_map[qubit] # Otherwise we remap the noise and gate qubits new_noise_qubits = noise_qubits for i, qubits in enumerate(noise_qubits): for j, qubit in enumerate(qubits): new_noise_qubits[i][j] = inv_map[qubit] if new_gate_qubits: error['gate_qubits'] = new_gate_qubits if new_noise_qubits: error['noise_qubits'] = new_noise_qubits new_errors.append(error) # Update errors and convert back to NoiseModel nm_dict['errors'] = new_errors new_noise_model = NoiseModel.from_dict(nm_dict) # Update basis gates from original model new_noise_model._basis_gates = noise_model._basis_gates return new_noise_model qiskit-aer-0.4.1/qiskit/providers/aer/utils/noise_transformation.py000066400000000000000000000724231362723322000256420ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Noise transformation module The goal of this module is to transform one 1-qubit noise channel (given by the QuantumError class) into another, built from specified "building blocks" (given as Kraus matrices) such that the new channel is as close as possible to the original one in the Hilber-Schmidt metric. For a typical use case, consider a simulator for circuits built from the Clifford group. Computations on such circuits can be simulated at polynomial time and space, but not all noise channels can be used in such a simulation. To enable noisy Clifford simulation one can transform the given noise channel into the closest one, Hilbert-Schmidt wise, that can be used in a Clifford simulator. """ # pylint: disable=import-outside-toplevel import itertools import logging import numpy from qiskit.quantum_info.operators.channel import Kraus from qiskit.quantum_info.operators.channel import SuperOp from ..noise.errors import QuantumError from ..noise.noise_model import NoiseModel from ..noise.noiseerror import NoiseError from ..noise.errors.errorutils import single_qubit_clifford_instructions logger = logging.getLogger(__name__) def approximate_quantum_error(error, *, operator_string=None, operator_dict=None, operator_list=None): """ Return an approximate QuantumError bases on the Hilbert-Schmidt metric. Currently this is only implemented for 1-qubit QuantumErrors. Args: error (QuantumError): the error to be approximated. operator_string (string or None): a name for a pre-made set of building blocks for the output channel (Default: None). operator_dict (dict or None): a dictionary whose values are the building blocks for the output channel (Default: None). operator_list (dict or None): list of building blocks for the output channel (Default: None). Returns: QuantumError: the approximate quantum error. Raises: NoiseError: if number of qubits is not supported or approximation failed. RuntimeError: If there's no information about the noise type. Additional Information: The operator input precedence is: ``list`` < ``dict`` < ``str``. If a string is given, dict is overwritten; if a dict is given, list is overwritten. Oossible values for string are ``'pauli'``, ``'reset'``, ``'clifford'``. For further information see :meth:`NoiseTransformer.named_operators`. """ if not isinstance(error, QuantumError): error = QuantumError(error) if error.number_of_qubits > 2: raise NoiseError("Only 1-qubit and 2-qubit noises can be converted, {}-qubit " "noise found in model".format(error.number_of_qubits)) error_kraus_operators = Kraus(error.to_quantumchannel()).data transformer = NoiseTransformer() if operator_string is not None: no_info_error = "No information about noise type {}".format(operator_string) operator_string = operator_string.lower() if operator_string not in transformer.named_operators.keys(): raise RuntimeError(no_info_error) operator_lists = transformer.named_operators[operator_string] if len(operator_lists) < error.number_of_qubits: raise RuntimeError( no_info_error + " for {} qubits".format(error.number_of_qubits)) operator_dict = operator_lists[error.number_of_qubits - 1] if operator_dict is not None: _, operator_list = zip(*operator_dict.items()) if operator_list is not None: op_matrix_list = [ transformer.operator_matrix(operator) for operator in operator_list ] probabilities = transformer.transform_by_operator_list( op_matrix_list, error_kraus_operators) identity_prob = numpy.round(1 - sum(probabilities), 9) if identity_prob < 0 or identity_prob > 1: raise RuntimeError( "Channel probabilities sum to {}".format(1 - identity_prob)) quantum_error_spec = [([{'name': 'id', 'qubits': [0]}], identity_prob)] op_circuit_list = [ transformer.operator_circuit(operator) for operator in operator_list ] for (operator, probability) in zip(op_circuit_list, probabilities): quantum_error_spec.append((operator, probability)) return QuantumError(quantum_error_spec) raise NoiseError( "Quantum error approximation failed - no approximating operators detected" ) def approximate_noise_model(model, *, operator_string=None, operator_dict=None, operator_list=None): """ Return an approximate noise model. Args: model (NoiseModel): the noise model to be approximated. operator_string (string or None): a name for a pre-made set of building blocks for the output channel (Default: None). operator_dict (dict or None): a dictionary whose values are the building blocks for the output channel (Default: None). operator_list (dict or None): list of building blocks for the output channel (Default: None). Returns: NoiseModel: the approximate noise model. Raises: NoiseError: if number of qubits is not supported or approximation failed. Additional Information: The operator input precedence is: ``list`` < ``dict`` < ``str``. If a string is given, dict is overwritten; if a dict is given, list is overwritten. Oossible values for string are ``'pauli'``, ``'reset'``, ``'clifford'``. For further information see :meth:`NoiseTransformer.named_operators`. """ # We need to iterate over all the errors in the noise model. # No nice interface for this now, easiest way is to mimic as_dict error_list = [] # Add default quantum errors for operation, error in model._default_quantum_errors.items(): error = approximate_quantum_error( error, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) error_dict = error.to_dict() error_dict["operations"] = [operation] error_list.append(error_dict) # Add specific qubit errors for operation, qubit_dict in model._local_quantum_errors.items(): for qubits_str, error in qubit_dict.items(): error = approximate_quantum_error( error, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) error_dict = error.to_dict() error_dict["operations"] = [operation] error_dict["gate_qubits"] = [model._str2qubits(qubits_str)] error_list.append(error_dict) # Add non-local errors for operation, qubit_dict in model._nonlocal_quantum_errors.items(): for qubits_str, noise_dict in qubit_dict.items(): for noise_str, error in noise_dict.items(): error = approximate_quantum_error( error, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) error_dict = error.to_dict() error_dict["operations"] = [operation] error_dict["gate_qubits"] = [model._str2qubits(qubits_str)] error_dict["noise_qubits"] = [model._str2qubits(noise_str)] error_list.append(error_dict) # Add default readout error if model._default_readout_error is not None: error = approximate_quantum_error( model._default_readout_error, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) error_dict = error.to_dict() error_list.append(error_dict) # Add local readout error for qubits_str, error in model._local_readout_errors.items(): error = approximate_quantum_error( error, operator_string=operator_string, operator_dict=operator_dict, operator_list=operator_list) error_dict = error.to_dict() error_dict["gate_qubits"] = [model._str2qubits(qubits_str)] error_list.append(error_dict) approx_noise_model = NoiseModel.from_dict({ "errors": error_list, "x90_gates": model._x90_gates }) # Update basis gates approx_noise_model._basis_gates = model._basis_gates return approx_noise_model def pauli_operators(): """Return a list of Pauli operators for 1 and 2 qubits.""" pauli_1_qubit = { 'X': [{'name': 'x', 'qubits': [0]}], 'Y': [{'name': 'y', 'qubits': [0]}], 'Z': [{'name': 'z', 'qubits': [0]}] } pauli_2_qubit = { 'XI': [{'name': 'x', 'qubits': [1]}, {'name': 'id', 'qubits': [0]}], 'YI': [{'name': 'y', 'qubits': [1]}, {'name': 'id', 'qubits': [0]}], 'ZI': [{'name': 'z', 'qubits': [1]}, {'name': 'id', 'qubits': [0]}], 'IX': [{'name': 'id', 'qubits': [1]}, {'name': 'x', 'qubits': [0]}], 'IY': [{'name': 'id', 'qubits': [1]}, {'name': 'y', 'qubits': [0]}], 'IZ': [{'name': 'id', 'qubits': [1]}, {'name': 'z', 'qubits': [0]}], 'XX': [{'name': 'x', 'qubits': [1]}, {'name': 'x', 'qubits': [0]}], 'YY': [{'name': 'y', 'qubits': [1]}, {'name': 'y', 'qubits': [0]}], 'ZZ': [{'name': 'z', 'qubits': [1]}, {'name': 'z', 'qubits': [0]}], 'XY': [{'name': 'x', 'qubits': [1]}, {'name': 'y', 'qubits': [0]}], 'XZ': [{'name': 'x', 'qubits': [1]}, {'name': 'z', 'qubits': [0]}], 'YX': [{'name': 'y', 'qubits': [1]}, {'name': 'x', 'qubits': [0]}], 'YZ': [{'name': 'y', 'qubits': [1]}, {'name': 'z', 'qubits': [0]}], 'ZX': [{'name': 'z', 'qubits': [1]}, {'name': 'x', 'qubits': [0]}], 'ZY': [{'name': 'z', 'qubits': [1]}, {'name': 'y', 'qubits': [0]}], } return [pauli_1_qubit, pauli_2_qubit] def reset_operators(): """Return a list of reset operators for 1 and 2 qubits.""" reset_0_to_0 = [{'name': 'reset', 'qubits': [0]}] reset_0_to_1 = [{'name': 'reset', 'qubits': [0]}, {'name': 'x', 'qubits': [0]}] reset_1_to_0 = [{'name': 'reset', 'qubits': [1]}] reset_1_to_1 = [{'name': 'reset', 'qubits': [1]}, {'name': 'x', 'qubits': [1]}] id_0 = [{'name': 'id', 'qubits': [0]}] id_1 = [{'name': 'id', 'qubits': [1]}] reset_1_qubit = { 'p': reset_0_to_0, 'q': reset_0_to_1 } reset_2_qubit = { 'p0': reset_0_to_0 + id_1, 'q0': reset_0_to_1 + id_1, 'p1': reset_1_to_0 + id_0, 'q1': reset_1_to_1 + id_0, 'p0_p1': reset_0_to_0 + reset_1_to_0, 'p0_q1': reset_0_to_0 + reset_1_to_1, 'q0_p1': reset_0_to_1 + reset_1_to_0, 'q0_q1': reset_0_to_1 + reset_1_to_1, } return [reset_1_qubit, reset_2_qubit] class NoiseTransformer: """Transforms one quantum channel to another based on a specified criteria.""" def __init__(self): self.named_operators = { 'pauli': pauli_operators(), 'reset': reset_operators(), 'clifford': [{j: single_qubit_clifford_instructions(j) for j in range(24)}] } self.fidelity_data = None self.use_honesty_constraint = True self.noise_kraus_operators = None self.transform_channel_operators = None def operator_matrix(self, operator): """Converts an operator representation to Kraus matrix representation Args: operator (operator): operator representation. Can be a noise circuit or a matrix or a list of matrices. Returns: Kraus: the operator, converted to Kraus representation. """ if isinstance(operator, list) and isinstance(operator[0], dict): operator_error = QuantumError([(operator, 1)]) kraus_rep = Kraus(operator_error.to_quantumchannel()).data return kraus_rep return operator def operator_circuit(self, operator): """Converts an operator representation to noise circuit. Args: operator (operator): operator representation. Can be a noise circuit or a matrix or a list of matrices. Returns: List: The operator, converted to noise circuit representation. """ if isinstance(operator, numpy.ndarray): return [{'name': 'unitary', 'qubits': [0], 'params': [operator]}] if isinstance(operator, list) and isinstance(operator[0], numpy.ndarray): if len(operator) == 1: return [{'name': 'unitary', 'qubits': [0], 'params': operator}] else: return [{'name': 'kraus', 'qubits': [0], 'params': operator}] return operator # transformation interface methods def transform_by_operator_list(self, transform_channel_operators, noise_kraus_operators): r""" Transform input Kraus operators. Allows approximating a set of input Kraus operators as in terms of a different set of Kraus matrices. For example, setting :math:`[X, Y, Z]` allows approximating by a Pauli channel, and :math:`[(|0 \langle\rangle 0|, |0\langle\rangle 1|), |1\langle\rangle 0|, |1 \langle\rangle 1|)]` represents the relaxation channel In the case the input is a list :math:`[A_1, A_2, ..., A_n]` of transform matrices and :math:`[E_0, E_1, ..., E_m]` of noise Kraus operators, the output is a list :math:`[p_1, p_2, ..., p_n]` of probabilities such that: 1. :math:`p_i \ge 0` 2. :math:`p_1 + ... + p_n \le 1` 3. :math:`[\sqrt(p_1) A_1, \sqrt(p_2) A_2, ..., \sqrt(p_n) A_n, \sqrt(1-(p_1 + ... + p_n))I]` is a list of Kraus operators that define the output channel (which is "close" to the input channel given by :math:`[E_0, ..., E_m]`.) This channel can be thought of as choosing the operator :math:`A_i` in probability :math:`p_i` and applying this operator to the quantum state. More generally, if the input is a list of tuples (not necessarily of the same size): :math:`[(A_1, B_1, ...), (A_2, B_2, ...), ..., (A_n, B_n, ...)]` then the output is still a list :math:`[p_1, p_2, ..., p_n]` and now the output channel is defined by the operators: :math:`[\sqrt(p_1)A1, \sqrt(p_1)B_1, ..., \sqrt(p_n)A_n, \sqrt(p_n)B_n, ..., \sqrt(1-(p_1 + ... + p_n))I]` Args: noise_kraus_operators (List): a list of matrices (Kraus operators) for the input channel. transform_channel_operators (List): a list of matrices or tuples of matrices representing Kraus operators that can construct the output channel. Returns: List: A list of amplitudes that define the output channel. """ self.noise_kraus_operators = noise_kraus_operators # pylint: disable=invalid-name self.transform_channel_operators = transform_channel_operators full_transform_channel_operators = self.prepare_channel_operator_list( self.transform_channel_operators) channel_matrices, const_channel_matrix = self.generate_channel_matrices( full_transform_channel_operators) self.prepare_honesty_constraint(full_transform_channel_operators) probabilities = self.transform_by_given_channel( channel_matrices, const_channel_matrix) return probabilities @staticmethod def prepare_channel_operator_list(ops_list): """ Prepares a list of channel operators. Args: ops_list (List): The list of operators to prepare Returns: List: The channel operator list """ # convert to sympy matrices and verify that each singleton is # in a tuple; also add identity matrix from sympy import Matrix, eye result = [] for ops in ops_list: if not isinstance(ops, tuple) and not isinstance(ops, list): ops = [ops] result.append([Matrix(op) for op in ops]) n = result[0][0].shape[0] # grab the dimensions from the first element result = [[eye(n)]] + result return result # pylint: disable=invalid-name def prepare_honesty_constraint(self, transform_channel_operators_list): """ Prepares the honesty constraint. Args: transform_channel_operators_list (list): A list of tuples of matrices which represent Kraus operators. """ if not self.use_honesty_constraint: return goal = self.fidelity(self.noise_kraus_operators) coefficients = [ self.fidelity(ops) for ops in transform_channel_operators_list ] self.fidelity_data = { 'goal': goal, 'coefficients': coefficients[1:] # coefficients[0] corresponds to I } # methods relevant to the transformation to quadratic programming instance @staticmethod def fidelity(channel): """ Calculates channel fidelity """ return sum([numpy.abs(numpy.trace(E)) ** 2 for E in channel]) # pylint: disable=invalid-name def generate_channel_matrices(self, transform_channel_operators_list): r""" Generate symbolic channel matrices. Generates a list of 4x4 symbolic matrices describing the channel defined from the given operators. The identity matrix is assumed to be the first element in the list: .. code-block:: python [(I, ), (A1, B1, ...), (A2, B2, ...), ..., (An, Bn, ...)] E.g. for a Pauli channel, the matrices are: .. code-block:: python [(I,), (X,), (Y,), (Z,)] For relaxation they are: .. code-block:: python [(I, ), (|0><0|, |0><1|), |1><0|, |1><1|)] We consider this input to symbolically represent a channel in the following manner: define indeterminates :math:`x_0, x_1, ..., x_n` which are meant to represent probabilities such that :math:`x_i \ge 0` and :math:`x0 = 1-(x_1 + ... + x_n)`. Now consider the quantum channel defined via the Kraus operators :math:`{\sqrt(x_0)I, \sqrt(x_1) A_1, \sqrt(x1) B_1, ..., \sqrt(x_m)A_n, \sqrt(x_n) B_n, ...}` This is the channel C symbolically represented by the operators. Args: transform_channel_operators_list (list): A list of tuples of matrices which represent Kraus operators. Returns: list: A list of 4x4 complex matrices ``([D1, D2, ..., Dn], E)`` such that the matrix :math:`x_1 D_1 + ... + x_n D_n + E` represents the operation of the channel C on the density operator. we find it easier to work with this representation of C when performing the combinatorial optimization. """ from sympy import symbols as sp_symbols, sqrt symbols_string = " ".join([ "x{}".format(i) for i in range(len(transform_channel_operators_list)) ]) symbols = sp_symbols(symbols_string, real=True, positive=True) exp = symbols[ 1] # exp will contain the symbolic expression "x1 +...+ xn" for i in range(2, len(symbols)): exp = symbols[i] + exp # symbolic_operators_list is a list of lists; we flatten it the next line symbolic_operators_list = [[ sqrt(symbols[i]) * op for op in ops ] for (i, ops) in enumerate(transform_channel_operators_list)] symbolic_operators = [ op for ops in symbolic_operators_list for op in ops ] # channel_matrix_representation() performs the required linear # algebra to find the representing matrices. operators_channel = self.channel_matrix_representation( symbolic_operators).subs(symbols[0], 1 - exp) return self.generate_channel_quadratic_programming_matrices( operators_channel, symbols[1:]) @staticmethod def compute_channel_operation(rho, operators): """ Given a quantum state's density function rho, the effect of the channel on this state is: rho -> sum_{i=1}^n E_i * rho * E_i^dagger Args: rho (number): Density function operators (list): List of operators Returns: number: The result of applying the list of operators """ from sympy import zeros return sum([E * rho * E.H for E in operators], zeros(operators[0].rows)) @staticmethod def flatten_matrix(m): """ Args: m (Matrix): The matrix to flatten Returns: list: A row vector repesenting the flattened matrix """ return list(m) def channel_matrix_representation(self, operators): """ We convert the operators to a matrix by applying the channel to the four basis elements of the 2x2 matrix space representing density operators; this is standard linear algebra Args: operators (list): The list of operators to transform into a Matrix Returns: sympy.Matrix: The matrx representation of the operators """ from sympy import Matrix, zeros shape = operators[0].shape standard_base = [] for i in range(shape[0]): for j in range(shape[1]): basis_element_ij = zeros(*shape) basis_element_ij[(i, j)] = 1 standard_base.append(basis_element_ij) return (Matrix([ self.flatten_matrix( self.compute_channel_operation(rho, operators)) for rho in standard_base ])) def generate_channel_quadratic_programming_matrices( self, channel, symbols): """ Generate matrices for quadratic program. Args: channel (Matrix): a 4x4 symbolic matrix symbols (list): the symbols x1, ..., xn which may occur in the matrix Returns: list: A list of 4x4 complex matrices ([D1, D2, ..., Dn], E) such that: channel == x1*D1 + ... + xn*Dn + E """ return ( [self.get_matrix_from_channel(channel, symbol) for symbol in symbols], self.get_const_matrix_from_channel(channel, symbols) ) @staticmethod def get_matrix_from_channel(channel, symbol): """ Extract the numeric parameter matrix. Args: channel (matrix): a 4x4 symbolic matrix. symbol (list): a symbol xi Returns: matrix: a 4x4 numeric matrix. Additional Information: Each entry of the 4x4 symbolic input channel matrix is assumed to be a polynomial of the form a1x1 + ... + anxn + c. The corresponding entry in the output numeric matrix is ai. """ from sympy import Poly n = channel.rows M = numpy.zeros((n, n), dtype=numpy.complex_) for (i, j) in itertools.product(range(n), range(n)): M[i, j] = numpy.complex( Poly(channel[i, j], symbol).coeff_monomial(symbol)) return M @staticmethod def get_const_matrix_from_channel(channel, symbols): """ Extract the numeric constant matrix. Args: channel (matrix): a 4x4 symbolic matrix. symbols (list): The full list [x1, ..., xn] of symbols used in the matrix. Returns: matrix: a 4x4 numeric matrix. Additional Information: Each entry of the 4x4 symbolic input channel matrix is assumed to be a polynomial of the form a1x1 + ... + anxn + c. The corresponding entry in the output numeric matrix is c. """ from sympy import Poly n = channel.rows M = numpy.zeros((n, n), dtype=numpy.complex_) for (i, j) in itertools.product(range(n), range(n)): M[i, j] = numpy.complex( Poly(channel[i, j], symbols).coeff_monomial(1)) return M def transform_by_given_channel(self, channel_matrices, const_channel_matrix): """ Transform by by quantum channels. This method creates objective function representing the Hilbert-Schmidt norm of the matrix (A-B) obtained as the difference of the input noise channel and the output channel we wish to determine. This function is represented by a matrix P and a vector q, such that f(x) = 1/2(x*P*x)+q*x where x is the vector we wish to minimize, where x represents probabilities for the noise operators that construct the output channel Args: channel_matrices (list): A list of 4x4 symbolic matrices const_channel_matrix (matrix): a 4x4 constant matrix Returns: list: a list of the optimal probabilities for the channel matrices, determined by the quadratic program solver """ target_channel = SuperOp(Kraus(self.noise_kraus_operators)) target_channel_matrix = target_channel._data.T const_matrix = const_channel_matrix - target_channel_matrix P = self.compute_P(channel_matrices) q = self.compute_q(channel_matrices, const_matrix) return self.solve_quadratic_program(P, q) def compute_P(self, As): """ This method creates the matrix P in the f(x) = 1/2(x*P*x)+q*x representation of the objective function Args: As (list): list of symbolic matrices repersenting the channel matrices Returns: matrix: The matrix P for the description of the quadaric program """ from sympy import zeros vs = [numpy.array(A).flatten() for A in As] n = len(vs) P = zeros(n, n) for (i, j) in itertools.product(range(n), range(n)): P[i, j] = 2 * numpy.real(numpy.dot(vs[i], numpy.conj(vs[j]))) return P def compute_q(self, As, C): """ This method creates the vector q for the f(x) = 1/2(x*P*x)+q*x representation of the objective function Args: As (list): list of symbolic matrices repersenting the quadratic program C (matrix): matrix representing the the constant channel matrix Returns: list: The vector q for the description of the quadaric program """ from sympy import zeros vs = [numpy.array(A).flatten() for A in As] vC = numpy.array(C).flatten() n = len(vs) q = zeros(1, n) for i in range(n): q[i] = 2 * numpy.real(numpy.dot(numpy.conj(vC), vs[i])) return q def solve_quadratic_program(self, P, q): """ Solve the quadratic program optimization problem. This function solved the quadratic program to minimize the objective function f(x) = 1/2(x*P*x)+q*x subject to the additional constraints Gx <= h Where P, q are given and G,h are computed to ensure that x represents a probability vector and subject to honesty constraints if required Args: P (matrix): A matrix representing the P component of the objective function q (list): A vector representing the q component of the objective function Returns: list: The solution of the quadratic program (represents probabilities) Additional information: This method is the only place in the code where we rely on the cvxpy library should we consider another library, only this method needs to change. """ try: import cvxpy except ImportError: logger.error("cvxpy module needs to be installed to use this feature.") P = numpy.array(P).astype(float) q = numpy.array(q).astype(float).T n = len(q) # G and h constrain: # 1) sum of probs is less then 1 # 2) All probs bigger than 0 # 3) Honesty (measured using fidelity, if given) G_data = [[1] * n] + [([-1 if i == k else 0 for i in range(n)]) for k in range(n)] h_data = [1] + [0] * n if self.fidelity_data is not None: G_data.append(self.fidelity_data['coefficients']) h_data.append(self.fidelity_data['goal']) G = numpy.array(G_data).astype(float) h = numpy.array(h_data).astype(float) x = cvxpy.Variable(n) prob = cvxpy.Problem( cvxpy.Minimize((1 / 2) * cvxpy.quad_form(x, P) + q.T@x), [G@x <= h]) prob.solve() return x.value qiskit-aer-0.4.1/qiskit/providers/aer/utils/qobj_utils.py000066400000000000000000000230241362723322000235430ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Temporary hacks for qobj until Terra supports Aer instructions (likely 0.8) THESE SHOULD ONLY BE USED UNTIL A PROPER QUANTUM CIRCUIT INTERFACE IS ADDED TO QISKIT TERRA. THEY WILL NOT BE SUPPORTED AFTER THAT. """ import copy import warnings import numpy as np from qiskit.qobj import QasmQobjInstruction def append_instr(qobj, exp_index, instruction): """Append a QasmQobjInstruction to a QobjExperiment. Args: qobj (Qobj): a Qobj object. exp_index (int): The index of the experiment in the qobj. instruction (QasmQobjInstruction): instruction to insert. Returns: qobj(Qobj): The Qobj object """ warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) qobj.experiments[exp_index].instructions.append(instruction) return qobj def insert_instr(qobj, exp_index, item, pos): """Insert a QasmQobjInstruction into a QobjExperiment. Args: qobj (Qobj): a Qobj object exp_index (int): The index of the experiment in the qobj. item (QasmQobjInstruction): instruction to insert. pos (int): the position to insert the item. Returns: qobj(Qobj): The Qobj object """ warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) qobj.experiments[exp_index].instructions.insert(pos, item) return qobj def get_instr_pos(qobj, exp_index, name): """Return all locations of QasmQobjInstruction in a Qobj experiment. The return list is sorted in reverse order so iterating over it to insert new items will work as expected. Args: qobj (Qobj): a Qobj object exp_index (int): The index of the experiment in the qobj name (str): QasmQobjInstruction name to find Returns: list[int]: A list of positions where the QasmQobjInstruction is located. """ warnings.warn( 'This funnction is deprecated and will be removed in a future release.', DeprecationWarning) # Check only the name string of the item positions = [ i for i, val in enumerate(qobj.experiments[exp_index].instructions) if val.name == name ] return positions def unitary_instr(mat, qubits, label=None): """Create a unitary gate QasmQobjInstruction. Args: mat (matrix_like): an n-qubit unitary matrix qubits (list[int]): qubits to apply the matrix to. label (str): optional string label for the untiary matrix Returns: QasmQobjInstruction: The qobj item for the unitary instruction. Raises: ValueError: if the input matrix is not unitary Additional Information: Qubit Ordering: The n-qubit matrix is ordered in little-endian with respect to the qubits in the label string. For example. If M is a tensor product of single qubit matrices `M = kron(M_(n-1), ..., M_1, M_0)` then `M_0` is applied to `qubits[0]`, `M_1` to `qubits[1]` etc. Label string: The string label is used for identifying the matrix in a noise model so that noise may be applied to the implementation of this matrix. """ warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) array = np.array(mat, dtype=complex) dim = 2**len(qubits) if array.shape not in [(dim, dim), (1, dim)]: raise ValueError("Invalid") instruction = { "name": "unitary", "qubits": list(qubits), "params": [np.array(mat, dtype=complex)] } if label is not None: instruction["label"] = str(label) return QasmQobjInstruction(**instruction) def measure_instr(qubits, memory, registers=None): """Create a multi-qubit measure instruction""" warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) if len(qubits) != len(memory): raise ValueError("Number of qubits does not match number of memory") if registers is None: return QasmQobjInstruction(name='measure', qubits=qubits, memory=memory) # Case where we also measure to registers if len(qubits) != len(registers): raise ValueError("Number of qubits does not match number of registers") return QasmQobjInstruction(name='measure', qubits=qubits, memory=memory, register=registers) def reset_instr(qubits): """Create a multi-qubit reset instruction""" warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) return QasmQobjInstruction(name='reset', qubits=qubits) def barrier_instr(num_qubits): """Create a barrier QasmQobjInstruction.""" warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) return QasmQobjInstruction(name='barrier', qubits=list(range(num_qubits))) def iden_instr(qubit): """Create a barrier QasmQobjInstruction.""" warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) return QasmQobjInstruction(name='id', qubits=[qubit]) def snapshot_instr(snapshot_type, label, qubits=None, params=None): """Create a snapshot qobj item. Args: snapshot_type (str): the snapshot type identifier label (str): the snapshot label string qubits (list[int]): qubits snapshot applies to (optional) params (custom): optional parameters for special snapshot types. See additional information. Returns: QasmQobjInstruction: The qobj item for the snapshot instruction. Additional Information: Snapshot types: "statevector" -- returns the current statevector for each shot "memory" -- returns the current memory hex-string for each shot "register" -- returns the current register hex-string for each shot "probabilities" -- returns the measurement outcome probabilities averaged over all shots, but conditioned on the current memory value. This requires the qubits field to be set. "expval_pauli" -- returns the expectation value of an operator averaged over all shots, but conditioned on the current memory value. This requires the qubits field to be set and the params field to be set. "expval_matrix" -- same as expval_pauli but with different params Pauli expectation value params: These are a list of terms [complex_coeff, pauli_str] where string is in little endian: pauli_str CBA applies Pauli A to qubits[0], B to qubits[1] and C to qubits[2]. Example for op 0.5 XX + 0.7 IZ we have [[0.5, 'XX'], [0.7, 'IZ']] Matrix expectation value params: TODO """ warnings.warn( 'This function is deprecated and will be removed in a future release.' ' Use the snapshot circuit instructions in' ' `qiskit.provider.aer.extensions` instead.', DeprecationWarning) snap = { "name": "snapshot", "snapshot_type": snapshot_type, "label": str(label) } if qubits is not None: snap["qubits"] = list(qubits) if params is not None: snap["params"] = params # Check if single-matrix expectation value if snapshot_type in ["expval", "expval_matrix"] and \ isinstance(params, np.ndarray): snap["name"] = "expval_matrix" snap["params"] = [[1.0, qubits, params]] # TODO: implicit conversion for Pauli expval params return QasmQobjInstruction(**snap) def insert_snapshots_after_barriers(qobj, snapshot): """Insert a snapshot instruction after each barrier in qobj. The label of the input snapshot will be appended with "i" where "i" ranges from 0 to the 1 - number of barriers. Args: qobj (Qobj): a qobj to insert snapshots into snapshot (QasmQobjInstruction): a snapshot instruction. Returns: qobj(Qobj): The Qobj object Raises: ValueError: if the name of the instruction is not an snapshot Additional Information: """ warnings.warn( 'This function is deprecated and will be removed in a future release.', DeprecationWarning) if snapshot.name != "snapshot": raise ValueError("Invalid snapshot instruction") label = snapshot.label for exp_index in range(len(qobj.experiments)): positions = get_instr_pos(qobj, exp_index, "barrier") for i, pos in reversed(list(enumerate(positions))): item = copy.copy(snapshot) item.label = label + "{}".format(i) insert_instr(qobj, exp_index, item, pos) return qobj qiskit-aer-0.4.1/qiskit/providers/aer/version.py000066400000000000000000000013131362723322000217120ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Helper tools for getting Terra addon version information """ import os ROOT_DIR = os.path.dirname(__file__) with open(os.path.join(ROOT_DIR, "VERSION.txt"), "r") as version_file: __version__ = version_file.read().strip() qiskit-aer-0.4.1/requirements-dev.txt000066400000000000000000000003061362723322000176240ustar00rootroot00000000000000cmake scikit-build cython asv cvxpy>=1.0.0,!=1.0.26 pylint pycodestyle Sphinx>=1.8.3 sphinx-rtd-theme>=0.4.0 sphinx-tabs>=1.1.11 sphinx-automodapi jupyter-sphinx;python_version<'3.8' stestr>=2.5.0 qiskit-aer-0.4.1/setup.py000066400000000000000000000053171362723322000153050ustar00rootroot00000000000000# pylint: disable=invalid-name """ Main setup file for qiskit-aer """ import os import subprocess import sys import inspect try: from skbuild import setup except ImportError: subprocess.call([sys.executable, '-m', 'pip', 'install', 'scikit-build']) from skbuild import setup try: import pybind11 except ImportError: subprocess.call([sys.executable, '-m', 'pip', 'install', 'pybind11>=2.4']) import setuptools requirements = [ 'qiskit-terra>=0.12.0', 'numpy>=1.16.3', 'scipy>=1.0', 'cython>=0.27.1', 'pybind11>=2.4' # This isn't really an install requirement, # Pybind11 is required to be pre-installed for # CMake to successfully find header files. # This should be fixed in the CMake build files. ] setup_requirements = requirements + [ 'scikit-build', 'cmake' ] if not hasattr(setuptools, 'find_namespace_packages') or not inspect.ismethod( setuptools.find_namespace_packages): print("Your setuptools version:'{}' does not support PEP 420 " "(find_namespace_packages). Upgrade it to version >='40.1.0' and " "repeat install.".format(setuptools.__version__)) sys.exit(1) VERSION_PATH = os.path.join(os.path.dirname(__file__), "qiskit", "providers", "aer", "VERSION.txt") with open(VERSION_PATH, "r") as version_file: VERSION = version_file.read().strip() setup( name='qiskit-aer', version=VERSION, packages=setuptools.find_namespace_packages(include=['qiskit.*']), cmake_source_dir='.', description="Qiskit Aer - High performance simulators for Qiskit", url="https://github.com/Qiskit/qiskit-aer", author="AER Development Team", author_email="qiskit@us.ibm.com", license="Apache 2.0", classifiers=[ "Environment :: Console", "License :: OSI Approved :: Apache Software License", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: C++", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Scientific/Engineering", ], install_requires=requirements, setup_requires=setup_requirements, include_package_data=True, cmake_args=["-DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.9"], keywords="qiskit aer simulator quantum addon backend", zip_safe=False ) qiskit-aer-0.4.1/src/000077500000000000000000000000001362723322000143545ustar00rootroot00000000000000qiskit-aer-0.4.1/src/controllers/000077500000000000000000000000001362723322000167225ustar00rootroot00000000000000qiskit-aer-0.4.1/src/controllers/controller.hpp000077500000000000000000000644141362723322000216320ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_base_controller_hpp_ #define _aer_base_controller_hpp_ #include #include #include #include #include #include #include #include #if defined(__linux__) || defined(__APPLE__) #include #elif defined(_WIN64) // This is needed because windows.h redefine min()/max() so interferes with std::min/max #define NOMINMAX #include #endif #ifdef _OPENMP #include #endif // Base Controller #include "framework/qobj.hpp" #include "framework/rng.hpp" #include "framework/creg.hpp" #include "framework/results/result.hpp" #include "framework/results/experiment_data.hpp" #include "noise/noise_model.hpp" #include "transpile/circuitopt.hpp" #include "transpile/truncate_qubits.hpp" namespace AER { namespace Base { //========================================================================= // Controller base class //========================================================================= // This is the top level controller for the Qiskit-Aer simulator // It manages execution of all the circuits in a QOBJ, parallelization, // noise sampling from a noise model, and circuit optimizations. /************************************************************************** * --------------- * Parallelization * --------------- * Parallel execution uses the OpenMP library. It may happen at three levels: * * 1. Parallel execution of circuits in a QOBJ * 2. Parallel execution of shots in a Circuit * 3. Parallelization used by the State class for performing gates. * * Options 1 and 2 are mutually exclusive: enabling circuit parallelization * disables shot parallelization. Option 3 is available for both cases but * conservatively limits the number of threads since these are subthreads * spawned by the higher level threads. If no parallelization is used for * 1 and 2, all available threads will be used for 3. * * ------------------------- * Config settings: * * - "noise_model" (json): A noise model to use for simulation [Default: null] * - "max_parallel_threads" (int): Set the maximum OpenMP threads that may * be used across all levels of parallelization. Set to 0 for maximum * available. [Default : 0] * - "max_parallel_experiments" (int): Set number of circuits that may be * executed in parallel. Set to 0 to automatically select a number of * parallel threads. [Default: 1] * - "max_parallel_shots" (int): Set number of shots that maybe be executed * in parallel for each circuit. Set to 0 to automatically select a * number of parallel threads. [Default: 0]. * - "max_memory_mb" (int): Sets the maximum size of memory for a store. * If a state needs more, an error is thrown. If set to 0, the maximum * will be automatically set to the system memory size [Default: 0]. * * Config settings from Data class: * * - "counts" (bool): Return counts objecy in circuit data [Default: True] * - "snapshots" (bool): Return snapshots object in circuit data [Default: True] * - "memory" (bool): Return memory array in circuit data [Default: False] * - "register" (bool): Return register array in circuit data [Default: False] * - "noise_model" (json): A noise model JSON dictionary for the simulator. * [Default: null] **************************************************************************/ class Controller { public: Controller() {clear_parallelization();} //----------------------------------------------------------------------- // Execute qobj //----------------------------------------------------------------------- // Load a QOBJ from a JSON file and execute on the State type // class. virtual Result execute(const json_t &qobj); virtual Result execute(std::vector &circuits, const Noise::NoiseModel &noise_model, const json_t &config); //----------------------------------------------------------------------- // Config settings //----------------------------------------------------------------------- // Load Controller, State and Data config from a JSON // config settings will be passed to the State and Data classes virtual void set_config(const json_t &config); // Clear the current config void virtual clear_config(); // Add circuit optimization template inline auto add_circuit_optimization(Type&& opt)-> typename std::enable_if_t>>::value > { optimizations_.push_back(std::make_shared>>(std::forward(opt))); } protected: //----------------------------------------------------------------------- // Circuit Execution //----------------------------------------------------------------------- // Parallel execution of a circuit // This function manages parallel shot configuration and internally calls // the `run_circuit` method for each shot thread virtual ExperimentResult execute_circuit(Circuit &circ, Noise::NoiseModel &noise, const json_t &config); // Abstract method for executing a circuit. // This method must initialize a state and return output data for // the required number of shots. virtual ExperimentData run_circuit(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const = 0; //------------------------------------------------------------------------- // State validation //------------------------------------------------------------------------- // Return True if a given circuit (and internal noise model) are valid for // execution on the given state. Otherwise return false. // If throw_except is true an exception will be thrown on the return false // case listing the invalid instructions in the circuit or noise model. template static bool validate_state(const state_t &state, const Circuit &circ, const Noise::NoiseModel &noise, bool throw_except = false); // Return True if a given circuit are valid for execution on the given state. // Otherwise return false. // If throw_except is true an exception will be thrown directly. template bool validate_memory_requirements(const state_t &state, const Circuit &circ, bool throw_except = false) const; //------------------------------------------------------------------------- // Circuit optimization //------------------------------------------------------------------------- // Generate an equivalent circuit with input_circ as output_circ. template void optimize_circuit(Circuit &circ, Noise::NoiseModel& noise, state_t& state, ExperimentData &data) const; //----------------------------------------------------------------------- // Config //----------------------------------------------------------------------- // Timer type using myclock_t = std::chrono::high_resolution_clock; // Circuit optimization std::vector> optimizations_; // Validation threshold for validating states and operators double validation_threshold_ = 1e-8; //----------------------------------------------------------------------- // Parallelization Config //----------------------------------------------------------------------- // Set OpenMP thread settings to default values void clear_parallelization(); // Set parallelization for experiments virtual void set_parallelization_experiments(const std::vector& circuits, const Noise::NoiseModel& noise); // Set parallelization for a circuit virtual void set_parallelization_circuit(const Circuit& circuit, const Noise::NoiseModel& noise); // Return an estimate of the required memory for a circuit. virtual size_t required_memory_mb(const Circuit& circuit, const Noise::NoiseModel& noise) const = 0; // Get system memory size size_t get_system_memory_mb(); // The maximum number of threads to use for various levels of parallelization int max_parallel_threads_; // Parameters for parallelization management in configuration int max_parallel_experiments_; int max_parallel_shots_; size_t max_memory_mb_; // use explicit parallelization bool explicit_parallelization_; // Parameters for parallelization management for experiments int parallel_experiments_; int parallel_shots_; int parallel_state_update_; // Truncate qubits bool truncate_qubits_ = true; }; //========================================================================= // Implementations //========================================================================= //------------------------------------------------------------------------- // Config settings //------------------------------------------------------------------------- void Controller::set_config(const json_t &config) { // Load validation threshold JSON::get_value(validation_threshold_, "validation_threshold", config); // Load qubit truncation JSON::get_value(truncate_qubits_, "truncate_enable", config); #ifdef _OPENMP // Load OpenMP maximum thread settings if (JSON::check_key("max_parallel_threads", config)) JSON::get_value(max_parallel_threads_, "max_parallel_threads", config); if (JSON::check_key("max_parallel_experiments", config)) JSON::get_value(max_parallel_experiments_, "max_parallel_experiments", config); if (JSON::check_key("max_parallel_shots", config)) JSON::get_value(max_parallel_shots_, "max_parallel_shots", config); // Limit max threads based on number of available OpenMP threads auto omp_threads = omp_get_max_threads(); max_parallel_threads_ = (max_parallel_threads_ > 0) ? std::min(max_parallel_threads_, omp_threads) : std::max(1, omp_threads); #else // No OpenMP so we disable parallelization max_parallel_threads_ = 1; max_parallel_shots_ = 1; max_parallel_experiments_ = 1; #endif // Load configurations for parallelization if (JSON::check_key("max_memory_mb", config)) { JSON::get_value(max_memory_mb_, "max_memory_mb", config); } for (std::shared_ptr opt: optimizations_) opt->set_config(config); // for debugging if (JSON::check_key("_parallel_experiments", config)) { JSON::get_value(parallel_experiments_, "_parallel_experiments", config); explicit_parallelization_ = true; } // for debugging if (JSON::check_key("_parallel_shots", config)) { JSON::get_value(parallel_shots_, "_parallel_shots", config); explicit_parallelization_ = true; } // for debugging if (JSON::check_key("_parallel_state_update", config)) { JSON::get_value(parallel_state_update_, "_parallel_state_update", config); explicit_parallelization_ = true; } if (explicit_parallelization_) { parallel_experiments_ = std::max( { parallel_experiments_, 1 }); parallel_shots_ = std::max( { parallel_shots_, 1 }); parallel_state_update_ = std::max( { parallel_state_update_, 1 }); } } void Controller::clear_config() { clear_parallelization(); validation_threshold_ = 1e-8; } void Controller::clear_parallelization() { max_parallel_threads_ = 0; max_parallel_experiments_ = 1; max_parallel_shots_ = 0; parallel_experiments_ = 1; parallel_shots_ = 1; parallel_state_update_ = 1; explicit_parallelization_ = false; max_memory_mb_ = get_system_memory_mb() / 2; } void Controller::set_parallelization_experiments(const std::vector& circuits, const Noise::NoiseModel& noise) { // Use a local variable to not override stored maximum based // on currently executed circuits const auto max_experiments = (max_parallel_experiments_ > 0) ? std::min({max_parallel_experiments_, max_parallel_threads_}) : max_parallel_threads_; if (max_experiments == 1) { // No parallel experiment execution parallel_experiments_ = 1; return; } // If memory allows, execute experiments in parallel std::vector required_memory_mb_list(circuits.size()); for (size_t j=0; j()); size_t total_memory = 0; parallel_experiments_ = 0; for (size_t required_memory_mb : required_memory_mb_list) { total_memory += required_memory_mb; if (total_memory > max_memory_mb_) break; ++parallel_experiments_; } if (parallel_experiments_ <= 0) throw std::runtime_error("a circuit requires more memory than max_memory_mb."); parallel_experiments_ = std::min({parallel_experiments_, max_experiments, max_parallel_threads_, static_cast(circuits.size())}); } void Controller::set_parallelization_circuit(const Circuit& circ, const Noise::NoiseModel& noise) { // Use a local variable to not override stored maximum based // on currently executed circuits const auto max_shots = (max_parallel_shots_ > 0) ? std::min({max_parallel_shots_, max_parallel_threads_}) : max_parallel_threads_; // If we are executing circuits in parallel we disable // parallel shots if (max_shots == 1 || parallel_experiments_ > 1) { parallel_shots_ = 1; } else { // Parallel shots is > 1 // Limit parallel shots by available memory and number of shots // And assign the remaining threads to state update int circ_memory_mb = required_memory_mb(circ, noise); if (max_memory_mb_ < circ_memory_mb) throw std::runtime_error("a circuit requires more memory than max_memory_mb."); // If circ memory is 0, set it to 1 so that we don't divide by zero circ_memory_mb = std::max({1, circ_memory_mb}); parallel_shots_ = std::min({static_cast(max_memory_mb_ / circ_memory_mb), max_shots, static_cast(circ.shots)}); } parallel_state_update_ = (parallel_shots_ > 1) ? std::max({1, max_parallel_threads_ / parallel_shots_}) : std::max({1, max_parallel_threads_ / parallel_experiments_}); } size_t Controller::get_system_memory_mb(){ size_t total_physical_memory = 0; #if defined(__linux__) || defined(__APPLE__) auto pages = sysconf(_SC_PHYS_PAGES); auto page_size = sysconf(_SC_PAGE_SIZE); total_physical_memory = pages * page_size; #elif defined(_WIN64) MEMORYSTATUSEX status; status.dwLength = sizeof(status); GlobalMemoryStatusEx(&status); total_physical_memory = status.ullTotalPhys; #endif return total_physical_memory >> 20; } //------------------------------------------------------------------------- // State validation //------------------------------------------------------------------------- template bool Controller::validate_state(const state_t &state, const Circuit &circ, const Noise::NoiseModel &noise, bool throw_except) { // First check if a noise model is valid a given state bool noise_valid = noise.is_ideal() || state.validate_opset(noise.opset()); bool circ_valid = state.validate_opset(circ.opset()); if (noise_valid && circ_valid) { return true; } // If we didn't return true then either noise model or circ has // invalid instructions. if (throw_except == false) return false; // If we are throwing an exception we include information // about the invalid operations std::stringstream msg; if (!noise_valid) { msg << "Noise model contains invalid instructions ("; msg << state.invalid_opset_message(noise.opset()) << ")"; } if (!circ_valid) { msg << "Circuit contains invalid instructions ("; msg << state.invalid_opset_message(circ.opset()) << ")"; } throw std::runtime_error(msg.str()); } template bool Controller::validate_memory_requirements(const state_t &state, const Circuit &circ, bool throw_except) const { if (max_memory_mb_ == 0) return true; size_t required_mb = state.required_memory_mb(circ.num_qubits, circ.ops); if(max_memory_mb_ < required_mb) { if(throw_except) { std::string name = ""; JSON::get_value(name, "name", circ.header); throw std::runtime_error("AER::Base::Controller: State " + state.name() + " has insufficient memory to run the circuit " + name); } return false; } return true; } //------------------------------------------------------------------------- // Circuit optimization //------------------------------------------------------------------------- template void Controller::optimize_circuit(Circuit &circ, Noise::NoiseModel& noise, state_t& state, ExperimentData &data) const { Operations::OpSet allowed_opset; allowed_opset.optypes = state.allowed_ops(); allowed_opset.gates = state.allowed_gates(); allowed_opset.snapshots = state.allowed_snapshots(); for (std::shared_ptr opt: optimizations_) { opt->optimize_circuit(circ, noise, allowed_opset, data); } } //------------------------------------------------------------------------- // Qobj execution //------------------------------------------------------------------------- Result Controller::execute(const json_t &qobj_js) { // Load QOBJ in a try block so we can catch parsing errors and still return // a valid JSON output containing the error message. try { // Start QOBJ timer auto timer_start = myclock_t::now(); Qobj qobj(qobj_js); Noise::NoiseModel noise_model; json_t config; // Check for config if (JSON::get_value(config, "config", qobj_js)) { // Set config set_config(config); // Load noise model JSON::get_value(noise_model, "noise_model", config); } auto result = execute(qobj.circuits, noise_model, config); // Get QOBJ id and pass through header to result result.qobj_id = qobj.id; if (!qobj.header.empty()) { result.header = qobj.header; } // Stop the timer and add total timing data including qobj parsing auto timer_stop = myclock_t::now(); result.metadata["time_taken"] = std::chrono::duration(timer_stop - timer_start).count(); return result; } catch (std::exception &e) { // qobj was invalid, return valid output containing error message Result result; result.status = Result::Status::error; result.message = std::string("Failed to load qobj: ") + e.what(); return result; } } //------------------------------------------------------------------------- // Experiment execution //------------------------------------------------------------------------- Result Controller::execute(std::vector &circuits, const Noise::NoiseModel &noise_model, const json_t &config) { // Start QOBJ timer auto timer_start = myclock_t::now(); // Initialize Result object for the given number of experiments const auto num_circuits = circuits.size(); Result result(num_circuits); // Execute each circuit in a try block try { if (!explicit_parallelization_) { // set parallelization for experiments set_parallelization_experiments(circuits, noise_model); } #ifdef _OPENMP result.metadata["omp_enabled"] = true; #else result.metadata["omp_enabled"] = false; #endif result.metadata["parallel_experiments"] = parallel_experiments_; result.metadata["max_memory_mb"] = max_memory_mb_; #ifdef _OPENMP if (parallel_shots_ > 1 || parallel_state_update_ > 1) omp_set_nested(1); #endif if (parallel_experiments_ > 1) { // Parallel circuit execution #pragma omp parallel for num_threads(parallel_experiments_) for (int j = 0; j < result.results.size(); ++j) { // Make a copy of the noise model for each circuit execution // so that it can be modified if required auto circ_noise_model = noise_model; result.results[j] = execute_circuit(circuits[j], circ_noise_model, config); } } else { // Serial circuit execution for (int j = 0; j < num_circuits; ++j) { // Make a copy of the noise model for each circuit execution auto circ_noise_model = noise_model; result.results[j] = execute_circuit(circuits[j], circ_noise_model, config); } } // Check each experiment result for completed status. // If only some experiments completed return partial completed status. result.status = Result::Status::completed; for (const auto& experiment: result.results) { if (experiment.status != ExperimentResult::Status::completed) { result.status = Result::Status::partial_completed; break; } } // Stop the timer and add total timing data auto timer_stop = myclock_t::now(); result.metadata["time_taken"] = std::chrono::duration(timer_stop - timer_start).count(); } // If execution failed return valid output reporting error catch (std::exception &e) { result.status = Result::Status::error; result.message = e.what(); } return result; } ExperimentResult Controller::execute_circuit(Circuit &circ, Noise::NoiseModel& noise, const json_t &config) { // Start individual circuit timer auto timer_start = myclock_t::now(); // state circuit timer // Initialize circuit json return ExperimentResult exp_result; ExperimentData data; data.set_config(config); // Execute in try block so we can catch errors and return the error message // for individual circuit failures. try { // Truncate unused qubits from circuit and noise model if (truncate_qubits_) { Transpile::TruncateQubits truncate_pass; truncate_pass.set_config(config); truncate_pass.optimize_circuit(circ, noise, Operations::OpSet(), data); } // set parallelization for this circuit if (!explicit_parallelization_) { set_parallelization_circuit(circ, noise); } // Single shot thread execution if (parallel_shots_ <= 1) { auto tmp_data = run_circuit(circ, noise, config, circ.shots, circ.seed); data.combine(std::move(tmp_data)); // Parallel shot thread execution } else { // Calculate shots per thread std::vector subshots; for (int j = 0; j < parallel_shots_; ++j) { subshots.push_back(circ.shots / parallel_shots_); } // If shots is not perfectly divisible by threads, assign the remainder for (int j=0; j < int(circ.shots % parallel_shots_); ++j) { subshots[j] += 1; } // Vector to store parallel thread output data std::vector par_data(parallel_shots_); std::vector error_msgs(parallel_shots_); #pragma omp parallel for if (parallel_shots_ > 1) num_threads(parallel_shots_) for (int i = 0; i < parallel_shots_; i++) { try { par_data[i] = run_circuit(circ, noise, config, subshots[i], circ.seed + i); } catch (std::runtime_error &error) { error_msgs[i] = error.what(); } } for (std::string error_msg: error_msgs) if (error_msg != "") throw std::runtime_error(error_msg); // Accumulate results across shots // Use move semantics to avoid copying data for (auto &datum : par_data) { data.combine(std::move(datum)); } } // Report success exp_result.data = data; exp_result.status = ExperimentResult::Status::completed; // Pass through circuit header and add metadata exp_result.header = circ.header; exp_result.shots = circ.shots; exp_result.seed = circ.seed; // Move any metadata from the subclass run_circuit data // to the experiment resultmetadata field for(const auto& pair: exp_result.data.metadata()) { exp_result.add_metadata(pair.first, pair.second); } // Remove the metatdata field from data exp_result.data.metadata().clear(); exp_result.metadata["parallel_shots"] = parallel_shots_; exp_result.metadata["parallel_state_update"] = parallel_state_update_; // Add timer data auto timer_stop = myclock_t::now(); // stop timer double time_taken = std::chrono::duration(timer_stop - timer_start).count(); exp_result.time_taken = time_taken; } // If an exception occurs during execution, catch it and pass it to the output catch (std::exception &e) { exp_result.status = ExperimentResult::Status::error; exp_result.message = e.what(); } return exp_result; } //------------------------------------------------------------------------- } // end namespace Base //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/controllers/controller_execute.hpp000077500000000000000000000037451362723322000233540ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_controller_execute_hpp_ #define _aer_controller_execute_hpp_ #include #include "framework/json.hpp" #include "misc/hacks.hpp" #include "framework/results/result.hpp" //========================================================================= // Controller Execute interface //========================================================================= // This is used to make wrapping Controller classes in Cython easier // by handling the parsing of std::string input into JSON objects. namespace AER { template std::string controller_execute_json(const std::string &qobj_str) { controller_t controller; auto qobj_js = json_t::parse(qobj_str); // Fix for MacOS and OpenMP library double initialization crash. // Issue: https://github.com/Qiskit/qiskit-aer/issues/1 if (JSON::check_key("config", qobj_js)) { std::string path; JSON::get_value(path, "library_dir", qobj_js["config"]); Hacks::maybe_load_openmp(path); } return controller.execute(qobj_js).json().dump(-1); } template Result controller_execute(const json_t &qobj_js) { controller_t controller; // Fix for MacOS and OpenMP library double initialization crash. // Issue: https://github.com/Qiskit/qiskit-aer/issues/1 if (JSON::check_key("config", qobj_js)) { std::string path; JSON::get_value(path, "library_dir", qobj_js["config"]); Hacks::maybe_load_openmp(path); } return controller.execute(qobj_js); } } // end namespace AER #endif qiskit-aer-0.4.1/src/controllers/qasm_controller.hpp000077500000000000000000001235061362723322000226510ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019, 2020. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_qasm_controller_hpp_ #define _aer_qasm_controller_hpp_ #include "controller.hpp" #include "simulators/density_matrix/densitymatrix_state.hpp" #include "simulators/extended_stabilizer/extended_stabilizer_state.hpp" #include "simulators/matrix_product_state/matrix_product_state.hpp" #include "simulators/stabilizer/stabilizer_state.hpp" #include "simulators/statevector/statevector_state.hpp" #include "simulators/superoperator/superoperator_state.hpp" #include "transpile/basic_opts.hpp" #include "transpile/delay_measure.hpp" #include "transpile/fusion.hpp" namespace AER { namespace Simulator { //========================================================================= // QasmController class //========================================================================= /************************************************************************** * Config settings: * - "optimize_ideal_threshold" (int): Qubit threshold for running circuit * optimizations passes for an ideal circuit [Default: 0]. * - "optimize_noise_threshold" (int): Qubit threshold for running circuit * optimizations passes for a noisy circuit [Default: 12]. * * From Statevector::State class * * - "initial_statevector" (json complex vector): Use a custom initial * statevector for the simulation [Default: null]. * - "zero_threshold" (double): Threshold for truncating small values to * zero in result data [Default: 1e-10] * - "statevector_parallel_threshold" (int): Threshold that number of qubits * must be greater than to enable OpenMP parallelization at State * level [Default: 13] * - "statevector_sample_measure_opt" (int): Threshold that number of qubits * must be greater than to enable indexing optimization during * measure sampling [Default: 10] * * From ExtendedStabilizer::State class * - "extended_stabilizer_approximation_error" (double): Set the error in the * approximation for the ch method. A smaller error needs more * memory and computational time. [Default: 0.05] * * - "extended_stabilizer_disable_measurement_opt" (bool): Force the simulator *to re-run the monte-carlo step for every measurement. Enabling this will *improve the sampling accuracy if the output distribution is strongly peaked, *but requires more computational time. [Default: True] * * - "extended_stabilizer_mixing_time" (int): Set how long the monte-carlo *method runs before performing measurements. If the output distribution is *strongly peaked, this can be decreased alongside setting *extended_stabilizer_disable_measurement_opt to True. [Default: 5000] * * - "extended_stabilizer_norm_estimation_samples" (int): Number of samples used *to compute the correct normalisation for a statevector snapshot. [Default: *100] * * - "extended_stabilizer_parallel_threshold" (int): Set the minimum size of the *ch decomposition before we enable OpenMP parallelisation. If parallel circuit *or shot execution is enabled this will only use unallocated CPU cores up to *max_parallel_threads. [Default: 100] * * From BaseController Class * * - "noise_model" (json): A noise model to use for simulation [Default: null] * - "max_parallel_threads" (int): Set the maximum OpenMP threads that may * be used across all levels of parallelization. Set to 0 for maximum * available. [Default : 0] * - "max_parallel_experiments" (int): Set number of circuits that may be * executed in parallel. Set to 0 to use the number of max parallel * threads [Default: 1] * - "max_parallel_shots" (int): Set number of shots that maybe be executed * in parallel for each circuit. Sset to 0 to use the number of max * parallel threads [Default: 1]. * - "counts" (bool): Return counts objecy in circuit data [Default: True] * - "snapshots" (bool): Return snapshots object in circuit data [Default: True] * - "memory" (bool): Return memory array in circuit data [Default: False] * - "register" (bool): Return register array in circuit data [Default: False] * - "max_memory_mb" (int): Memory in MB available to the state class. * If specified, is divided by the number of parallel shots/experiments. * [Default: 0] * * From Transpile:Fusion Class * - fusion_enable (bool): Enable fusion optimization in circuit optimization * passes [Default: True] * - fusion_verbose (bool): Output gates generated in fusion optimization * into metadata [Default: False] * - fusion_max_qubit (int): Maximum number of qubits for a operation generated * in a fusion optimization [Default: 5] * - fusion_threshold (int): Threshold that number of qubits must be greater * than or equal to enable fusion optimization [Default: 20] * **************************************************************************/ class QasmController : public Base::Controller { public: //----------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------- QasmController(); //----------------------------------------------------------------------- // Base class config override //----------------------------------------------------------------------- // Load Controller, State and Data config from a JSON // config settings will be passed to the State and Data classes // Allowed config options: // - "initial_statevector: complex_vector" // Plus Base Controller config options virtual void set_config(const json_t &config) override; // Clear the current config void virtual clear_config() override; protected: //----------------------------------------------------------------------- // Simulation types //----------------------------------------------------------------------- // Simulation methods for the Qasm Controller enum class Method { automatic, statevector, statevector_thrust_gpu, statevector_thrust_cpu, density_matrix, density_matrix_thrust_gpu, density_matrix_thrust_cpu, stabilizer, extended_stabilizer, matrix_product_state }; // Simulation precision enum class Precision { double_precision, single_precision }; //----------------------------------------------------------------------- // Base class abstract method override //----------------------------------------------------------------------- // Abstract method for executing a circuit. // This method must initialize a state and return output data for // the required number of shots. virtual ExperimentData run_circuit(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const override; //---------------------------------------------------------------- // Utility functions //---------------------------------------------------------------- // Return the simulation method to use for the input circuit // If a custom method is specified in the config this will be // used. If the default automatic method is set this will choose // the appropriate method based on the input circuit. Method simulation_method(const Circuit &circ, const Noise::NoiseModel &noise, bool validate = false) const; // Initialize a State subclass to a given initial state template void initialize_state(const Circuit &circ, State_t &state, const Initstate_t &initial_state) const; // Set parallelization for qasm simulator virtual void set_parallelization_circuit( const Circuit &circ, const Noise::NoiseModel &noise) override; //---------------------------------------------------------------- // Run circuit helpers //---------------------------------------------------------------- // Execute n-shots of a circuit on the input state template ExperimentData run_circuit_helper(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed, const Initstate_t &initial_state, const Method method) const; // Execute a single shot a circuit by initializing the state vector // to initial_state, running all ops in circ, and updating data with // simulation output. template void run_single_shot(const Circuit &circ, State_t &state, const Initstate_t &initial_state, ExperimentData &data, RngEngine &rng) const; // Execute a n-shots of a circuit without noise. // If possible this is done using measure sampling to only simulate // a single shot up to the first measurement, then sampling measure // outcomes for each shot. template void run_circuit_without_noise(const Circuit &circ, uint_t shots, State_t &state, const Initstate_t &initial_state, const Method method, ExperimentData &data, RngEngine &rng) const; // Execute n-shots of a circuit with noise by sampling a new noisy // instance of the circuit for each shot. template void run_circuit_with_noise(const Circuit &circ, const Noise::NoiseModel &noise, uint_t shots, State_t &state, const Initstate_t &initial_state, ExperimentData &data, RngEngine &rng) const; //---------------------------------------------------------------- // Measure sampling optimization //---------------------------------------------------------------- // Sample measurement outcomes for the input measure ops from the // current state of the input State_t template void measure_sampler(const std::vector &meas_ops, uint_t shots, State_t &state, ExperimentData &data, RngEngine &rng) const; // Check if measure sampling optimization is valid for the input circuit // if so return a pair {true, pos} where pos is the position of the // first measurement operation in the input circuit std::pair check_measure_sampling_opt(const Circuit &circ, const Method method) const; //----------------------------------------------------------------------- // Config //----------------------------------------------------------------------- size_t required_memory_mb(const Circuit &circ, const Noise::NoiseModel &noise) const override; // Simulation method Method simulation_method_ = Method::automatic; // Simulation precision Precision simulation_precision_ = Precision::double_precision; // Qubit threshold for running circuit optimizations uint_t circuit_opt_ideal_threshold_ = 0; uint_t circuit_opt_noise_threshold_ = 12; // Initial statevector for Statevector simulation method cvector_t initial_statevector_; // TODO: initial stabilizer state // Controller-level parameter for CH method bool extended_stabilizer_measure_sampling_ = false; }; //========================================================================= // Implementations //========================================================================= //------------------------------------------------------------------------- // Constructor //------------------------------------------------------------------------- QasmController::QasmController() { add_circuit_optimization(Transpile::ReduceBarrier()); add_circuit_optimization(Transpile::DelayMeasure()); add_circuit_optimization(Transpile::Fusion()); } //------------------------------------------------------------------------- // Config //------------------------------------------------------------------------- void QasmController::set_config(const json_t &config) { // Set base controller config Base::Controller::set_config(config); // Override automatic simulation method with a fixed method std::string method; if (JSON::get_value(method, "method", config)) { if (method == "statevector" || method == "statevector_cpu") { simulation_method_ = Method::statevector; } else if (method == "statevector_gpu") { simulation_method_ = Method::statevector_thrust_gpu; } else if (method == "statevector_thrust") { simulation_method_ = Method::statevector_thrust_cpu; } else if (method == "density_matrix" || method == "density_matrix_cpu") { simulation_method_ = Method::density_matrix; } else if (method == "density_matrix_gpu") { simulation_method_ = Method::density_matrix_thrust_gpu; } else if (method == "density_matrix_thrust") { simulation_method_ = Method::density_matrix_thrust_cpu; } else if (method == "stabilizer") { simulation_method_ = Method::stabilizer; } else if (method == "extended_stabilizer") { simulation_method_ = Method::extended_stabilizer; } else if (method == "matrix_product_state") { simulation_method_ = Method::matrix_product_state; } else if (method != "automatic") { throw std::runtime_error( std::string("QasmController: Invalid simulation method (") + method + std::string(").")); } } std::string precision; if (JSON::get_value(precision, "precision", config)) { if (precision == "double") { simulation_precision_ = Precision::double_precision; } else if (precision == "single") { simulation_precision_ = Precision::single_precision; } } // Check for circuit optimization threshold JSON::get_value(circuit_opt_ideal_threshold_, "optimize_ideal_threshold", config); JSON::get_value(circuit_opt_noise_threshold_, "optimize_noise_threshold", config); // Check for extended stabilizer measure sampling JSON::get_value(extended_stabilizer_measure_sampling_, "extended_stabilizer_measure_sampling", config); // DEPRECATED: Add custom initial state if (JSON::get_value(initial_statevector_, "initial_statevector", config)) { // Raise error if method is set to stabilizer or ch if (simulation_method_ == Method::stabilizer) { throw std::runtime_error( std::string("QasmController: Using an initial statevector") + std::string(" is not valid with stabilizer simulation method.") + method); } else if (simulation_method_ == Method::extended_stabilizer) { throw std::runtime_error( std::string("QasmController: Using an initial statevector") + std::string(" is not valid with the CH simulation method.") + method); } // Override simulator method to statevector simulation_method_ = Method::statevector; // Check initial state is normalized if (!Utils::is_unit_vector(initial_statevector_, validation_threshold_)) { throw std::runtime_error( "QasmController: initial_statevector is not a unit vector"); } } } void QasmController::clear_config() { Base::Controller::clear_config(); simulation_method_ = Method::automatic; initial_statevector_ = cvector_t(); } //------------------------------------------------------------------------- // Base class override //------------------------------------------------------------------------- ExperimentData QasmController::run_circuit(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const { // Validate circuit for simulation method switch (simulation_method(circ, noise, true)) { case Method::statevector: if (simulation_precision_ == Precision::double_precision) { // Double-precision Statevector simulation return run_circuit_helper>>( circ, noise, config, shots, rng_seed, initial_statevector_, Method::statevector); } else { // Single-precision Statevector simulation return run_circuit_helper>>( circ, noise, config, shots, rng_seed, initial_statevector_, Method::statevector); } case Method::statevector_thrust_gpu: #ifndef AER_THRUST_CUDA throw std::runtime_error( "QasmController: method statevector_gpu is not supported on this " "system"); #else if (simulation_precision_ == Precision::double_precision) { // Double-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed, initial_statevector_, Method::statevector_thrust_gpu); } else { // Single-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed, initial_statevector_, Method::statevector_thrust_gpu); } #endif case Method::statevector_thrust_cpu: #ifndef AER_THRUST_CPU throw std::runtime_error( "QasmController: method statevector_thrust is not supported on this " "system"); #else if (simulation_precision_ == Precision::double_precision) { // Double-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed, initial_statevector_, Method::statevector_thrust_cpu); } else { // Single-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed, initial_statevector_, Method::statevector_thrust_cpu); } #endif case Method::density_matrix: if (simulation_precision_ == Precision::double_precision) { // Double-precision density matrix simulation return run_circuit_helper< DensityMatrix::State>>( circ, noise, config, shots, rng_seed, cvector_t(), Method::density_matrix); } else { // Single-precision density matrix simulation return run_circuit_helper< DensityMatrix::State>>( circ, noise, config, shots, rng_seed, cvector_t(), Method::density_matrix); } case Method::density_matrix_thrust_gpu: #ifndef AER_THRUST_CUDA throw std::runtime_error( "QasmController: method density_matrix_gpu is not supported on this " "system"); #else if (simulation_precision_ == Precision::double_precision) { // Double-precision density matrix simulation return run_circuit_helper< DensityMatrix::State>>( circ, noise, config, shots, rng_seed, cvector_t(), Method::density_matrix_thrust_gpu); } else { // Single-precision density matrix simulation return run_circuit_helper< DensityMatrix::State>>( circ, noise, config, shots, rng_seed, cvector_t(), Method::density_matrix_thrust_gpu); } #endif case Method::density_matrix_thrust_cpu: #ifndef AER_THRUST_CPU throw std::runtime_error( "QasmController: method density_matrix_thrust is not supported on this " "system"); #else if (simulation_precision_ == Precision::double_precision) { // Double-precision density matrix simulation return run_circuit_helper< DensityMatrix::State>>( circ, noise, config, shots, rng_seed, cvector_t(), Method::density_matrix_thrust_cpu); } else { // Single-precision density matrix simulation return run_circuit_helper< DensityMatrix::State>>( circ, noise, config, shots, rng_seed, cvector_t(), Method::density_matrix_thrust_cpu); } #endif case Method::stabilizer: // Stabilizer simulation // TODO: Stabilizer doesn't yet support custom state initialization return run_circuit_helper( circ, noise, config, shots, rng_seed, Clifford::Clifford(), Method::stabilizer); case Method::extended_stabilizer: return run_circuit_helper( circ, noise, config, shots, rng_seed, CHSimulator::Runner(), Method::extended_stabilizer); case Method::matrix_product_state: return run_circuit_helper( circ, noise, config, shots, rng_seed, MatrixProductState::MPS(), Method::matrix_product_state); default: throw std::runtime_error("QasmController:Invalid simulation method"); } } //------------------------------------------------------------------------- // Utility methods //------------------------------------------------------------------------- QasmController::Method QasmController::simulation_method( const Circuit &circ, const Noise::NoiseModel &noise_model, bool validate) const { // Check simulation method and validate state switch (simulation_method_) { case Method::statevector: { if (validate) { if (simulation_precision_ == Precision::single_precision) { Statevector::State> state; validate_state(state, circ, noise_model, true); } else { Statevector::State> state; validate_state(state, circ, noise_model, true); } } return Method::statevector; } case Method::statevector_thrust_gpu: { #ifndef AER_THRUST_CUDA throw std::runtime_error( "QasmController: method statevector_gpu is not supported on this " "system"); #else if (validate) { if (simulation_precision_ == Precision::single_precision) { Statevector::State> state; validate_state(state, circ, noise_model, true); } else { Statevector::State> state; validate_state(state, circ, noise_model, true); } } return Method::statevector_thrust_gpu; #endif } case Method::statevector_thrust_cpu: { #ifndef AER_THRUST_CPU throw std::runtime_error( "QasmController: method statevector_thrust is not supported on this " "system"); #else if (validate) { if (simulation_precision_ == Precision::single_precision) { Statevector::State> state; validate_state(state, circ, noise_model, true); } else { Statevector::State> state; validate_state(state, circ, noise_model, true); } } return Method::statevector_thrust_cpu; #endif } case Method::density_matrix: { if (validate) { if (simulation_precision_ == Precision::single_precision) { validate_state(DensityMatrix::State>(), circ, noise_model, true); } else { validate_state(DensityMatrix::State>(), circ, noise_model, true); } } return Method::density_matrix; } case Method::density_matrix_thrust_gpu: { #ifndef AER_THRUST_SUPPORTED throw std::runtime_error( "QasmController: method density_matrix_gpu is not supported on this " "system"); #else if (validate) { if (simulation_precision_ == Precision::single_precision) { validate_state(DensityMatrix::State>(), circ, noise_model, true); } else { validate_state( DensityMatrix::State>(), circ, noise_model, true); } } return Method::density_matrix_thrust_gpu; #endif } case Method::density_matrix_thrust_cpu: { #ifndef AER_THRUST_SUPPORTED throw std::runtime_error( "QasmController: method density_matrix_thrust is not supported on this " "system"); #else if (validate) { if (simulation_precision_ == Precision::single_precision) { validate_state(DensityMatrix::State>(), circ, noise_model, true); } else { validate_state( DensityMatrix::State>(), circ, noise_model, true); } } return Method::density_matrix_thrust_cpu; #endif } case Method::stabilizer: { if (validate) validate_state(Stabilizer::State(), circ, noise_model, true); return Method::stabilizer; } case Method::extended_stabilizer: { if (validate) validate_state(ExtendedStabilizer::State(), circ, noise_model, true); return Method::extended_stabilizer; } case Method::matrix_product_state: { if (validate) validate_state(MatrixProductState::State(), circ, noise_model, true); return Method::matrix_product_state; } case Method::automatic: { // If circuit and noise model are Clifford run on Stabilizer simulator if (validate_state(Stabilizer::State(), circ, noise_model, false)) { return Method::stabilizer; } // For noisy simulations we enable the density matrix method if // shots > 2 ** num_qubits. This is based on a rough estimate that // a single shot of the density matrix simulator is approx 2 ** nq // times slow than a single shot of statevector due the increased // dimension if (noise_model.has_quantum_errors() && circ.shots > (1 << circ.num_qubits) && validate_memory_requirements(DensityMatrix::State<>(), circ, false) && validate_state(DensityMatrix::State<>(), circ, noise_model, false) && check_measure_sampling_opt(circ, Method::density_matrix).first) { return Method::density_matrix; } // Finally we check the statevector memory requirement for the // current number of qubits. If it fits in available memory we // default to the Statevector method. Otherwise we attempt to use // the extended stabilizer simulator. bool enough_memory = true; if (simulation_precision_ == Precision::single_precision) { Statevector::State> sv_state; enough_memory = validate_memory_requirements(sv_state, circ, false); } else { Statevector::State<> sv_state; enough_memory = validate_memory_requirements(sv_state, circ, false); } if (!enough_memory) { if (validate_state(ExtendedStabilizer::State(), circ, noise_model, false)) { return Method::extended_stabilizer; } else { throw std::runtime_error( "QasmSimulator: Circuit cannot be run using available methods."); } } } // If we didn't select extended stabilizer above proceed to the default // switch clause default: { // For default we use statevector followed by density matrix (for the case // when the circuit contains invalid instructions for statevector) if (validate_state(Statevector::State<>(), circ, noise_model, false)) { return Method::statevector; } // If circuit contains invalid instructions for statevector throw a hail // mary and try for density matrix. if (validate) validate_state(DensityMatrix::State<>(), circ, noise_model, true); return Method::density_matrix; } } } template void QasmController::initialize_state(const Circuit &circ, State_t &state, const Initstate_t &initial_state) const { if (initial_state.empty()) { state.initialize_qreg(circ.num_qubits); } else { state.initialize_qreg(circ.num_qubits, initial_state); } state.initialize_creg(circ.num_memory, circ.num_registers); } size_t QasmController::required_memory_mb( const Circuit &circ, const Noise::NoiseModel &noise) const { switch (simulation_method(circ, noise, false)) { case Method::statevector: case Method::statevector_thrust_cpu: case Method::statevector_thrust_gpu: { if (simulation_precision_ == Precision::single_precision) { Statevector::State> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } else { Statevector::State<> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } } case Method::density_matrix: case Method::density_matrix_thrust_cpu: case Method::density_matrix_thrust_gpu: { if (simulation_precision_ == Precision::single_precision) { DensityMatrix::State> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } else { DensityMatrix::State<> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } } case Method::stabilizer: { Stabilizer::State state; return state.required_memory_mb(circ.num_qubits, circ.ops); } case Method::extended_stabilizer: { ExtendedStabilizer::State state; return state.required_memory_mb(circ.num_qubits, circ.ops); } case Method::matrix_product_state: { MatrixProductState::State state; return state.required_memory_mb(circ.num_qubits, circ.ops); } default: // We shouldn't get here, so throw an exception if we do throw std::runtime_error("QasmController: Invalid simulation method"); } } void QasmController::set_parallelization_circuit( const Circuit &circ, const Noise::NoiseModel &noise_model) { const auto method = simulation_method(circ, noise_model, false); switch (method) { case Method::statevector: case Method::statevector_thrust_gpu: case Method::statevector_thrust_cpu: case Method::stabilizer: case Method::matrix_product_state: { if ((noise_model.is_ideal() || !noise_model.has_quantum_errors()) && check_measure_sampling_opt(circ, Method::statevector).first) { parallel_shots_ = 1; parallel_state_update_ = std::max({1, max_parallel_threads_ / parallel_experiments_}); return; } Base::Controller::set_parallelization_circuit(circ, noise_model); break; } case Method::density_matrix: case Method::density_matrix_thrust_gpu: case Method::density_matrix_thrust_cpu:{ if (check_measure_sampling_opt(circ, Method::density_matrix).first) { parallel_shots_ = 1; parallel_state_update_ = std::max({1, max_parallel_threads_ / parallel_experiments_}); return; } Base::Controller::set_parallelization_circuit(circ, noise_model); break; } default: { Base::Controller::set_parallelization_circuit(circ, noise_model); } } } //------------------------------------------------------------------------- // Run circuit helpers //------------------------------------------------------------------------- template ExperimentData QasmController::run_circuit_helper( const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed, const Initstate_t &initial_state, const Method method) const { // Initialize new state object State_t state; // Check memory requirements, raise exception if they're exceeded validate_memory_requirements(state, circ, true); // Set state config state.set_config(config); state.set_parallalization(parallel_state_update_); // Rng engine RngEngine rng; rng.set_seed(rng_seed); // Output data container ExperimentData data; data.set_config(config); data.add_metadata("method", state.name()); // Add measure sampling to metadata // Note: this will set to `true` if sampling is enabled for the circuit data.add_metadata("measure_sampling", false); // Choose execution method based on noise and method if (noise.is_ideal()) { run_circuit_without_noise(circ, shots, state, initial_state, method, data, rng); } else if ((method == Method::density_matrix || method == Method::density_matrix_thrust_gpu || method == Method::density_matrix_thrust_cpu) && noise.has_quantum_errors()) { // We can sample the noise model using superoperator method // and then execute the resulting circuit containing superoperators Noise::NoiseModel noise_cpy = noise; noise_cpy.activate_superop_method(); Circuit noise_circ = noise_cpy.sample_noise(circ, rng); run_circuit_without_noise(noise_circ, shots, state, initial_state, method, data, rng); } else if (noise.has_quantum_errors() == false) { // We can insert the readout errors from the noise model and then // execute the resulting circuit Circuit noise_circ = noise.sample_noise(circ, rng); run_circuit_without_noise(noise_circ, shots, state, initial_state, method, data, rng); } else { // Run sampling a noisy instance of the circuit for each shot run_circuit_with_noise(circ, noise, shots, state, initial_state, data, rng); } return data; } template void QasmController::run_single_shot(const Circuit &circ, State_t &state, const Initstate_t &initial_state, ExperimentData &data, RngEngine &rng) const { initialize_state(circ, state, initial_state); state.apply_ops(circ.ops, data, rng); state.add_creg_to_data(data); } template void QasmController::run_circuit_with_noise(const Circuit &circ, const Noise::NoiseModel &noise, uint_t shots, State_t &state, const Initstate_t &initial_state, ExperimentData &data, RngEngine &rng) const { // Sample a new noise circuit and optimize for each shot while (shots-- > 0) { Circuit noise_circ = noise.sample_noise(circ, rng); noise_circ.shots = 1; if (noise_circ.num_qubits > circuit_opt_noise_threshold_) { Noise::NoiseModel dummy; optimize_circuit(noise_circ, dummy, state, data); } run_single_shot(noise_circ, state, initial_state, data, rng); } } template void QasmController::run_circuit_without_noise(const Circuit &circ, uint_t shots, State_t &state, const Initstate_t &initial_state, const Method method, ExperimentData &data, RngEngine &rng) const { // Optimize circuit for state type Circuit opt_circ = circ; if (opt_circ.num_qubits > circuit_opt_ideal_threshold_) { Noise::NoiseModel dummy; optimize_circuit(opt_circ, dummy, state, data); } // Check if measure sampler and optimization are valid auto check = check_measure_sampling_opt(opt_circ, method); if (check.first == false) { // Perform standard execution if we cannot apply the // measurement sampling optimization while (shots-- > 0) { run_single_shot(opt_circ, state, initial_state, data, rng); } } else { // Implement measure sampler auto pos = check.second; // Position of first measurement op // Run circuit instructions before first measure std::vector ops(opt_circ.ops.begin(), opt_circ.ops.begin() + pos); initialize_state(opt_circ, state, initial_state); state.apply_ops(ops, data, rng); // Get measurement operations and set of measured qubits ops = std::vector(opt_circ.ops.begin() + pos, opt_circ.ops.end()); measure_sampler(ops, shots, state, data, rng); // Add measure sampling metadata data.add_metadata("measure_sampling", true); } } //------------------------------------------------------------------------- // Measure sampling optimization //------------------------------------------------------------------------- std::pair QasmController::check_measure_sampling_opt( const Circuit &circ, const Method method) const { // Find first instance of a measurement and check there // are no reset or initialize operations before the measurement if (method == Method::extended_stabilizer && !extended_stabilizer_measure_sampling_) { return std::make_pair(false, 0); } auto start = circ.ops.begin(); while (start != circ.ops.end()) { const auto type = start->type; if (method != Method::density_matrix && method != Method::density_matrix_thrust_gpu && method != Method::density_matrix_thrust_cpu) { if (type == Operations::OpType::reset || type == Operations::OpType::initialize || type == Operations::OpType::kraus || type == Operations::OpType::superop) { return std::make_pair(false, 0); } } if (type == Operations::OpType::measure || type == Operations::OpType::roerror) break; ++start; } // Record position for if optimization passes auto start_meas = start; // Check all remaining operations are measurements while (start != circ.ops.end()) { if ((start->type != Operations::OpType::measure && start->type != Operations::OpType::roerror) || start->conditional) { return std::make_pair(false, 0); } ++start; } // If we made it this far we can apply the optimization // size_t meas_pos = start_meas - circ.ops.begin(); size_t meas_pos = std::distance(circ.ops.begin(), start_meas); return std::make_pair(true, meas_pos); } template void QasmController::measure_sampler( const std::vector &meas_roerror_ops, uint_t shots, State_t &state, ExperimentData &data, RngEngine &rng) const { // Check if meas_circ is empty, and if so return initial creg if (meas_roerror_ops.empty()) { while (shots-- > 0) { state.add_creg_to_data(data); } return; } std::vector meas_ops; std::vector roerror_ops; for (const Operations::Op &op : meas_roerror_ops) if (op.type == Operations::OpType::roerror) roerror_ops.push_back(op); else /*(op.type == Operations::OpType::measure) */ meas_ops.push_back(op); // Get measured qubits from circuit sort and delete duplicates std::vector meas_qubits; // measured qubits for (const auto &op : meas_ops) { for (size_t j = 0; j < op.qubits.size(); ++j) meas_qubits.push_back(op.qubits[j]); } sort(meas_qubits.begin(), meas_qubits.end()); meas_qubits.erase(unique(meas_qubits.begin(), meas_qubits.end()), meas_qubits.end()); // Generate the samples auto all_samples = state.sample_measure(meas_qubits, shots, rng); // Make qubit map of position in vector of measured qubits std::unordered_map qubit_map; for (uint_t j = 0; j < meas_qubits.size(); ++j) { qubit_map[meas_qubits[j]] = j; } // Maps of memory and register to qubit position std::unordered_map memory_map; std::unordered_map register_map; for (const auto &op : meas_ops) { for (size_t j = 0; j < op.qubits.size(); ++j) { auto pos = qubit_map[op.qubits[j]]; if (!op.memory.empty()) memory_map[op.memory[j]] = pos; if (!op.registers.empty()) register_map[op.registers[j]] = pos; } } // Process samples // Convert opts to circuit so we can get the needed creg sizes // NB: this function could probably be moved somewhere else like Utils or Ops Circuit meas_circ(meas_roerror_ops); ClassicalRegister creg; while (!all_samples.empty()) { auto sample = all_samples.back(); creg.initialize(meas_circ.num_memory, meas_circ.num_registers); // process memory bit measurements for (const auto &pair : memory_map) { creg.store_measure(reg_t({sample[pair.second]}), reg_t({pair.first}), reg_t()); } // process register bit measurements for (const auto &pair : register_map) { creg.store_measure(reg_t({sample[pair.second]}), reg_t(), reg_t({pair.first})); } // process read out errors for memory and registers for (const Operations::Op &roerror : roerror_ops) { creg.apply_roerror(roerror, rng); } auto memory = creg.memory_hex(); data.add_memory_count(memory); data.add_pershot_memory(memory); data.add_pershot_register(creg.register_hex()); // pop off processed sample all_samples.pop_back(); } } //------------------------------------------------------------------------- } // end namespace Simulator //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/controllers/statevector_controller.hpp000077500000000000000000000261761362723322000242600ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_statevector_controller_hpp_ #define _aer_statevector_controller_hpp_ #include "controller.hpp" #include "simulators/statevector/statevector_state.hpp" namespace AER { namespace Simulator { //========================================================================= // StatevectorController class //========================================================================= /************************************************************************** * Config settings: * * From Statevector::State class * * - "initial_statevector" (json complex vector): Use a custom initial * statevector for the simulation [Default: null]. * - "zero_threshold" (double): Threshold for truncating small values to * zero in result data [Default: 1e-10] * - "statevector_parallel_threshold" (int): Threshold that number of qubits * must be greater than to enable OpenMP parallelization at State * level [Default: 13] * - "statevector_sample_measure_opt" (int): Threshold that number of qubits * must be greater than to enable indexing optimization during * measure sampling [Default: 10] * - "statevector_hpc_gate_opt" (bool): Enable large qubit gate optimizations. * [Default: False] * * From BaseController Class * * - "max_parallel_threads" (int): Set the maximum OpenMP threads that may * be used across all levels of parallelization. Set to 0 for maximum * available. [Default : 0] * - "max_parallel_experiments" (int): Set number of circuits that may be * executed in parallel. Set to 0 to use the number of max parallel * threads [Default: 1] * - "counts" (bool): Return counts object in circuit data [Default: True] * - "snapshots" (bool): Return snapshots object in circuit data [Default: True] * - "memory" (bool): Return memory array in circuit data [Default: False] * - "register" (bool): Return register array in circuit data [Default: False] * **************************************************************************/ class StatevectorController : public Base::Controller { public: //----------------------------------------------------------------------- // Base class config override //----------------------------------------------------------------------- StatevectorController(); // Load Controller, State and Data config from a JSON // config settings will be passed to the State and Data classes // Allowed config options: // - "initial_statevector: complex_vector" // Plus Base Controller config options virtual void set_config(const json_t& config) override; // Clear the current config void virtual clear_config() override; protected: virtual size_t required_memory_mb( const Circuit& circuit, const Noise::NoiseModel& noise) const override; // Simulation methods for the Statevector Controller enum class Method { automatic, statevector_cpu, statevector_thrust_gpu, statevector_thrust_cpu }; // Simulation precision enum class Precision { double_precision, single_precision }; private: //----------------------------------------------------------------------- // Base class abstract method override //----------------------------------------------------------------------- // This simulator will only return a single shot, regardless of the // input shot number virtual ExperimentData run_circuit(const Circuit& circ, const Noise::NoiseModel& noise, const json_t& config, uint_t shots, uint_t rng_seed) const override; // Execute n-shots of a circuit on the input state template ExperimentData run_circuit_helper(const Circuit& circ, const Noise::NoiseModel& noise, const json_t& config, uint_t shots, uint_t rng_seed) const; //----------------------------------------------------------------------- // Custom initial state //----------------------------------------------------------------------- cvector_t initial_state_; // Method for storing statevector Method method_ = Method::automatic; // Precision of statevector Precision precision_ = Precision::double_precision; }; //========================================================================= // Implementations //========================================================================= StatevectorController::StatevectorController() : Base::Controller() { // Disable qubit truncation by default Base::Controller::truncate_qubits_ = false; } //------------------------------------------------------------------------- // Config //------------------------------------------------------------------------- void StatevectorController::set_config(const json_t& config) { // Set base controller config Base::Controller::set_config(config); // Add custom initial state if (JSON::get_value(initial_state_, "initial_statevector", config)) { // Check initial state is normalized if (!Utils::is_unit_vector(initial_state_, validation_threshold_)) throw std::runtime_error( "StatevectorController: initial_statevector is not a unit vector"); } // Add method std::string method; if (JSON::get_value(method, "method", config)) { if (method == "statevector" || method == "statevector_cpu") { method_ = Method::statevector_cpu; } else if (method == "statevector_gpu") { method_ = Method::statevector_thrust_gpu; } else if (method == "statevector_thrust") { method_ = Method::statevector_thrust_cpu; } else if (method != "automatic") { throw std::runtime_error( std::string("UnitaryController: Invalid simulation method (") + method + std::string(").")); } } std::string precision; if (JSON::get_value(precision, "precision", config)) { if (precision == "double") { precision_ = Precision::double_precision; } else if (precision == "single") { precision_ = Precision::single_precision; } } } void StatevectorController::clear_config() { Base::Controller::clear_config(); initial_state_ = cvector_t(); } size_t StatevectorController::required_memory_mb( const Circuit& circ, const Noise::NoiseModel& noise) const { if (precision_ == Precision::single_precision) { Statevector::State> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } else { Statevector::State<> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } } //------------------------------------------------------------------------- // Run circuit //------------------------------------------------------------------------- ExperimentData StatevectorController::run_circuit( const Circuit& circ, const Noise::NoiseModel& noise, const json_t& config, uint_t shots, uint_t rng_seed) const { switch (method_) { case Method::automatic: case Method::statevector_cpu: { if (precision_ == Precision::double_precision) { // Double-precision Statevector simulation return run_circuit_helper>>( circ, noise, config, shots, rng_seed); } else { // Single-precision Statevector simulation return run_circuit_helper>>( circ, noise, config, shots, rng_seed); } } case Method::statevector_thrust_gpu: { #ifdef AER_THRUST_CUDA if (precision_ == Precision::double_precision) { // Double-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed); } else { // Single-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed); } #else throw std::runtime_error( "StatevectorController: method statevector_gpu is not supported on " "this " "system"); #endif } case Method::statevector_thrust_cpu: { #ifdef AER_THRUST_CPU if (precision_ == Precision::double_precision) { // Double-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed); } else { // Single-precision Statevector simulation return run_circuit_helper< Statevector::State>>( circ, noise, config, shots, rng_seed); } #else throw std::runtime_error( "StatevectorController: method statevector_thrust is not supported " "on this " "system"); #endif } default: throw std::runtime_error( "StatevectorController:Invalid simulation method"); } } template ExperimentData StatevectorController::run_circuit_helper( const Circuit& circ, const Noise::NoiseModel& noise, const json_t& config, uint_t shots, uint_t rng_seed) const { // Initialize state Statevector::State<> state; // Validate circuit and throw exception if invalid operations exist validate_state(state, circ, noise, true); // Check for custom initial state, and if so check it matches num qubits if (!initial_state_.empty()) { if (initial_state_.size() != 1ULL << circ.num_qubits) { uint_t num_qubits(std::log2(initial_state_.size())); std::stringstream msg; msg << "StatevectorController: " << num_qubits << "-qubit initial state "; msg << "cannot be used for a " << circ.num_qubits << "-qubit circuit."; throw std::runtime_error(msg.str()); } } // Set config state.set_config(config); state.set_parallalization(parallel_state_update_); // Rng engine RngEngine rng; rng.set_seed(rng_seed); // Output data container ExperimentData data; data.set_config(config); // Run single shot collecting measure data or snapshots if (initial_state_.empty()) state.initialize_qreg(circ.num_qubits); else state.initialize_qreg(circ.num_qubits, initial_state_); state.initialize_creg(circ.num_memory, circ.num_registers); state.apply_ops(circ.ops, data, rng); state.add_creg_to_data(data); // Add final state to the data data.add_additional_data("statevector", state.qreg().vector()); return data; } //------------------------------------------------------------------------- } // end namespace Simulator //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/controllers/unitary_controller.hpp000077500000000000000000000257571362723322000234140ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_unitary_controller_hpp_ #define _aer_unitary_controller_hpp_ #include "controller.hpp" #include "simulators/unitary/unitary_state.hpp" namespace AER { namespace Simulator { //========================================================================= // UnitaryController class //========================================================================= /************************************************************************** * Config settings: * * From QubitUnitary::State class * * - "initial_unitary" (json complex matrix): Use a custom initial unitary * matrix for the simulation [Default: null]. * - "zero_threshold" (double): Threshold for truncating small values to * zero in result data [Default: 1e-10] * - "unitary_parallel_threshold" (int): Threshold that number of qubits * must be greater than to enable OpenMP parallelization at State * level [Default: 6] * * From BaseController Class * * - "max_parallel_threads" (int): Set the maximum OpenMP threads that may * be used across all levels of parallelization. Set to 0 for maximum * available. [Default : 0] * - "max_parallel_experiments" (int): Set number of circuits that may be * executed in parallel. Set to 0 to use the number of max parallel * threads [Default: 1] * - "snapshots" (bool): Return snapshots object in circuit data [Default: True] * **************************************************************************/ class UnitaryController : public Base::Controller { public: //----------------------------------------------------------------------- // Base class config override //----------------------------------------------------------------------- UnitaryController(); // Load Controller, State and Data config from a JSON // config settings will be passed to the State and Data classes // Allowed config options: // - "initial_unitary: complex_matrix" // Plus Base Controller config options virtual void set_config(const json_t &config) override; // Clear the current config void virtual clear_config() override; protected: size_t required_memory_mb(const Circuit &circ, const Noise::NoiseModel &noise) const override; // Simulation methods for the Unitary Controller enum class Method { automatic, unitary_cpu, unitary_thrust_gpu, unitary_thrust_cpu }; // Simulation precision enum class Precision { double_precision, single_precision }; private: //----------------------------------------------------------------------- // Base class abstract method override //----------------------------------------------------------------------- // This simulator will only return a single shot, regardless of the // input shot number virtual ExperimentData run_circuit(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const override; template ExperimentData run_circuit_helper(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const; //----------------------------------------------------------------------- // Custom initial state //----------------------------------------------------------------------- cmatrix_t initial_unitary_; // Method to construct a unitary matrix Method method_ = Method::automatic; // Precision of a unitary matrix Precision precision_ = Precision::double_precision; }; //========================================================================= // Implementation //========================================================================= UnitaryController::UnitaryController() : Base::Controller() { // Disable qubit truncation by default Base::Controller::truncate_qubits_ = false; } //------------------------------------------------------------------------- // Config //------------------------------------------------------------------------- void UnitaryController::set_config(const json_t &config) { // Set base controller config Base::Controller::set_config(config); // Add custom initial unitary if (JSON::get_value(initial_unitary_, "initial_unitary", config)) { // Check initial state is unitary if (!Utils::is_unitary(initial_unitary_, validation_threshold_)) throw std::runtime_error( "UnitaryController: initial_unitary is not unitary"); } // Add method std::string method; if (JSON::get_value(method, "method", config)) { if (method == "unitary" || method == "unitary_cpu") { method_ = Method::unitary_cpu; } else if (method == "unitary_gpu") { method_ = Method::unitary_thrust_gpu; } else if (method == "unitary_thrust") { method_ = Method::unitary_thrust_cpu; } else if (method != "automatic") { throw std::runtime_error( std::string("UnitaryController: Invalid simulation method (") + method + std::string(").")); } } std::string precision; if (JSON::get_value(precision, "precision", config)) { if (precision == "double") { precision_ = Precision::double_precision; } else if (precision == "single") { precision_ = Precision::single_precision; } } } void UnitaryController::clear_config() { Base::Controller::clear_config(); initial_unitary_ = cmatrix_t(); } size_t UnitaryController::required_memory_mb( const Circuit &circ, const Noise::NoiseModel &noise) const { if (precision_ == Precision::single_precision) { QubitUnitary::State> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } else { QubitUnitary::State<> state; return state.required_memory_mb(circ.num_qubits, circ.ops); } } //------------------------------------------------------------------------- // Run circuit //------------------------------------------------------------------------- ExperimentData UnitaryController::run_circuit(const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const { switch (method_) { case Method::automatic: case Method::unitary_cpu: { if (precision_ == Precision::double_precision) { // Double-precision unitary simulation return run_circuit_helper< QubitUnitary::State>>(circ, noise, config, shots, rng_seed); } else { // Single-precision unitary simulation return run_circuit_helper< QubitUnitary::State>>(circ, noise, config, shots, rng_seed); } } case Method::unitary_thrust_gpu: { #ifdef AER_THRUST_CUDA if (precision_ == Precision::double_precision) { // Double-precision unitary simulation return run_circuit_helper< QubitUnitary::State>>( circ, noise, config, shots, rng_seed); } else { // Single-precision unitary simulation return run_circuit_helper< QubitUnitary::State>>( circ, noise, config, shots, rng_seed); } #else throw std::runtime_error( "UnitaryController: method unitary_gpu is not supported on this " "system"); #endif } case Method::unitary_thrust_cpu: { #ifdef AER_THRUST_CPU if (precision_ == Precision::double_precision) { // Double-precision unitary simulation return run_circuit_helper< QubitUnitary::State>>( circ, noise, config, shots, rng_seed); } else { // Single-precision unitary simulation return run_circuit_helper< QubitUnitary::State>>( circ, noise, config, shots, rng_seed); } #else throw std::runtime_error( "UnitaryController: method unitary_thrust is not supported on this " "system"); #endif } default: throw std::runtime_error("UnitaryController:Invalid simulation method"); } } template ExperimentData UnitaryController::run_circuit_helper( const Circuit &circ, const Noise::NoiseModel &noise, const json_t &config, uint_t shots, uint_t rng_seed) const { // Initialize state State_t state; // Validate circuit and throw exception if invalid operations exist validate_state(state, circ, noise, true); // Check for custom initial state, and if so check it matches num qubits if (!initial_unitary_.empty()) { auto nrows = initial_unitary_.GetRows(); auto ncols = initial_unitary_.GetColumns(); if (nrows != ncols) { throw std::runtime_error( "UnitaryController: initial unitary is not square."); } auto nstates = 1ULL << circ.num_qubits; if (nrows != nstates) { uint_t num_qubits(std::log2(nrows)); std::stringstream msg; msg << "UnitaryController: " << num_qubits << "-qubit initial unitary "; msg << "cannot be used for a " << circ.num_qubits << "-qubit circuit."; throw std::runtime_error(msg.str()); } } // Set state config state.set_config(config); state.set_parallalization(parallel_state_update_); // Rng engine (not actually needed for unitary controller) RngEngine rng; rng.set_seed(rng_seed); // Output data container ExperimentData data; data.set_config(config); data.add_metadata("method", state.name()); // Run single shot collecting measure data or snapshots if (initial_unitary_.empty()) state.initialize_qreg(circ.num_qubits); else state.initialize_qreg(circ.num_qubits, initial_unitary_); state.initialize_creg(circ.num_memory, circ.num_registers); state.apply_ops(circ.ops, data, rng); state.add_creg_to_data(data); // Add final state unitary to the data data.add_additional_data("unitary", state.qreg().matrix()); return data; } //------------------------------------------------------------------------- } // end namespace Simulator //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/framework/000077500000000000000000000000001362723322000163515ustar00rootroot00000000000000qiskit-aer-0.4.1/src/framework/circuit.hpp000077500000000000000000000163431362723322000205360ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_circuit_hpp_ #define _aer_framework_circuit_hpp_ #include #include "framework/operations.hpp" #include "framework/json.hpp" namespace AER { //============================================================================ // Circuit class for Qiskit-Aer //============================================================================ // A circuit is a list of Ops along with a specification of maximum needed // qubits, memory bits, and register bits for the input operators. class Circuit { public: using Op = Operations::Op; using OpType = Operations::OpType; std::vector ops; // circuit operations uint_t num_qubits = 0; // maximum number of qubits needed for ops uint_t num_memory = 0; // maximum number of memory clbits needed for ops uint_t num_registers = 0; // maximum number of registers clbits needed for ops uint_t shots = 1; uint_t seed; // Measurement sampling bool measure_sampling_flag = false; // Optional data members from QOBJ json_t header; // Constructor // The constructor automatically calculates the num_qubits, num_memory, num_registers // parameters by scanning the input list of ops. Circuit() {set_random_seed();} Circuit(const std::vector &_ops); // Construct a circuit from JSON Circuit(const json_t &circ); Circuit(const json_t &circ, const json_t &qobj_config); // Automatically set the number of qubits, memory, registers based on ops void set_sizes(); // Set the circuit rng seed to a fixed value inline void set_seed(uint_t s) {seed = s;} // Set the circuit rng seed to random value inline void set_random_seed() {seed = std::random_device()();} // Return the opset for the circuit inline const Operations::OpSet& opset() const {return opset_;} // Check if any circuit ops are conditional ops bool has_conditional() const; // Check if circuit contains a specific op bool has_op(std::string name) const; // return minimum and maximum op.qubit arguments as pair (min, max) std::pair minmax_qubits() const; // return minimum and maximum op.memory arguments as pair (min, max) std::pair minmax_memory() const; // return minimum and maximum op.registers arguments as pair (min, max) std::pair minmax_registers() const; private: Operations::OpSet opset_; // Set of operation types contained in circuit }; // Json conversion function inline void from_json(const json_t &js, Circuit &circ) {circ = Circuit(js);} //============================================================================ // Implementation: Circuit methods //============================================================================ void Circuit::set_sizes() { // Check maximum qubit, and register size // Memory size is loaded from qobj config for (const auto &op: ops) { if (!op.qubits.empty()) { auto max = std::max_element(std::begin(op.qubits), std::end(op.qubits)); num_qubits = std::max(num_qubits, 1UL + *max); } if (!op.registers.empty()) { auto max = std::max_element(std::begin(op.registers), std::end(op.registers)); num_registers = std::max(num_registers, 1UL + *max); } if (!op.memory.empty()) { auto max = std::max_element(std::begin(op.memory), std::end(op.memory)); num_memory = std::max(num_memory, 1UL + *max); } } } Circuit::Circuit(const std::vector &_ops) : Circuit() { ops = _ops; set_sizes(); opset_ = Operations::OpSet(ops); } Circuit::Circuit(const json_t &circ) : Circuit(circ, json_t()) {} Circuit::Circuit(const json_t &circ, const json_t &qobj_config) : Circuit() { // Get config json_t config = qobj_config; if (JSON::check_key("config", circ)) { for (auto it = circ["config"].cbegin(); it != circ["config"].cend(); ++it) { config[it.key()] = it.value(); // overwrite circuit level config values } } // Load instructions if (JSON::check_key("instructions", circ) == false) { throw std::invalid_argument("Invalid Qobj experiment: no \"instructions\" field."); } ops.clear(); // remove any current operations const json_t &jops = circ["instructions"]; for(auto jop: jops){ ops.emplace_back(Operations::json_to_op(jop)); } // Set optype information opset_ = Operations::OpSet(ops); // Set minimum sizes from operations set_sizes(); // Load metadata JSON::get_value(header, "header", circ); JSON::get_value(shots, "shots", config); // Check for specified memory slots uint_t memory_slots = 0; JSON::get_value(memory_slots, "memory_slots", config); if (memory_slots < num_memory) { throw std::invalid_argument("Invalid Qobj experiment: not enough memory slots."); } // override memory slot number num_memory = memory_slots; // Check for specified n_qubits if (JSON::check_key("n_qubits", config)) { uint_t n_qubits = config["n_qubits"]; if (n_qubits < num_qubits) { throw std::invalid_argument("Invalid Qobj experiment: n_qubits < instruction qubits."); } // override qubit number num_qubits = n_qubits; } } bool Circuit::has_conditional() const { for (const auto &op: ops) { if (op.conditional) return true; } return false; } bool Circuit::has_op(std::string name) const { for (const auto &op: ops) { if (op.name == name) return true; } return false; } std::pair Circuit::minmax_qubits() const{ uint_t min = 0; uint_t max = 0; for (const auto &op: ops) { if (op.qubits.empty() == false) { auto minmax = std::minmax_element(std::begin(op.qubits), std::end(op.qubits)); min = std::min(min, *minmax.first); max = std::max(max, *minmax.second); } } return std::make_pair(min, max); } std::pair Circuit::minmax_memory() const { uint_t min = 0; uint_t max = 0; for (const auto &op: ops) { if (op.memory.empty() == false) { auto minmax = std::minmax_element(std::begin(op.memory), std::end(op.memory)); min = std::min(min, *minmax.first); max = std::max(max, *minmax.second); } } return std::make_pair(min, max); } std::pair Circuit::minmax_registers() const { uint_t min = 0; uint_t max = 0; for (const auto &op: ops) { if (op.registers.empty() == false) { auto minmax = std::minmax_element(std::begin(op.registers), std::end(op.registers)); min = std::min(min, *minmax.first); max = std::max(max, *minmax.second); } } return std::make_pair(min, max); } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/creg.hpp000077500000000000000000000237701362723322000200160ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_creg_hpp_ #define _aer_framework_creg_hpp_ #include "framework/operations.hpp" #include "framework/utils.hpp" #include "framework/rng.hpp" namespace AER { //============================================================================ // ClassicalRegister base class for Qiskit-Aer //============================================================================ // ClassicalRegister class class ClassicalRegister { public: // Return the current value of the memory as little-endian hex-string inline std::string memory_hex() const {return Utils::bin2hex(creg_memory_);} // Return the current value of the memory as little-endian bit-string inline std::string memory_bin() const {return "0b" + creg_memory_;} // Return the current value of the memory as little-endian hex-string inline std::string register_hex() const {return Utils::bin2hex(creg_register_);} // Return the current value of the memory as little-endian bit-string inline std::string register_bin() const {return "0b" + creg_register_;} // Return the size of the memory bits size_t memory_size() const {return creg_memory_.size();} // Return the size of the register bits size_t register_size() const {return creg_register_.size();} // Return a reference to the current value of the memory // this is a bit-string without the "0b" prefix. inline auto& creg_memory() {return creg_memory_;} // Return a reference to the current value of the memory // this is a bit-string without the "0b" prefix. inline auto& creg_register() {return creg_register_;} // Initialize the memory and register bits to default values (all 0) void initialize(size_t num_memory, size_t num_registers); // Initialize the memory and register bits to specific values void initialize(size_t num_memory, size_t num_registers, const std::string &memory_hex, const std::string ®ister_hex); // Return true if a conditional op test passes based on the current // register bits values. // If the op is not a conditional op this will return true. bool check_conditional(const Operations::Op &op) const; // Apply a boolean function Op void apply_bfunc(const Operations::Op &op); // Apply readout error instruction to classical registers void apply_roerror(const Operations::Op &op, RngEngine &rng); // Store a measurement outcome in the specified memory and register bit locations void store_measure(const reg_t &outcome, const reg_t &memory, const reg_t ®isters); protected: // Classical registers std::string creg_memory_; // standard classical bit memory std::string creg_register_; // optional classical bit register // Measurement config settings bool return_hex_strings_ = true; // Set to false for bit-string output }; //============================================================================ // Implementations //============================================================================ void ClassicalRegister::initialize(size_t num_memory, size_t num_register) { // Set registers to the all 0 bit state creg_memory_ = std::string(num_memory, '0'); creg_register_ = std::string(num_register, '0'); } void ClassicalRegister::initialize(size_t num_memory, size_t num_register, const std::string &memory_hex, const std::string ®ister_hex) { // Convert to bit-string for internal storage std::string memory_bin = Utils::hex2bin(memory_hex, false); creg_memory_ = std::move(Utils::padleft_inplace(memory_bin, '0', num_memory)); std::string register_bin = Utils::hex2bin(register_hex, false); creg_register_ = std::move(Utils::padleft_inplace(memory_bin, '0', num_register)); } void ClassicalRegister::store_measure(const reg_t &outcome, const reg_t &memory, const reg_t ®isters) { // Assumes memory and registers are either empty or same size as outcome! bool use_mem = !memory.empty(); bool use_reg = !registers.empty(); for (size_t j=0; j < outcome.size(); j++) { if (use_mem) { // least significant bit first ordering const size_t pos = creg_memory_.size() - memory[j] - 1; creg_memory_[pos] = std::to_string(outcome[j])[0]; // int->string->char } if (use_reg) { // least significant bit first ordering const size_t pos = creg_register_.size() - registers[j] - 1; creg_register_[pos] = std::to_string(outcome[j])[0]; // int->string->char } } } bool ClassicalRegister::check_conditional(const Operations::Op &op) const { // Check if op is conditional if (op.conditional) return (creg_register_[creg_register_.size() - op.conditional_reg - 1] == '1'); // DEPRECATED: old style conditional if (op.old_conditional) { std::string current; auto mask = Utils::padleft(Utils::hex2bin(op.old_conditional_mask, false), '0', creg_memory_.size()); for (size_t pos=0; pos < mask.size(); pos++) { if (mask[pos] == '1') current.push_back(creg_memory_[pos]); } auto val = Utils::padleft(Utils::hex2bin(op.old_conditional_val, false), '0', current.size()); return (val == current); } // Op is not conditional return true; } void ClassicalRegister::apply_bfunc(const Operations::Op &op) { // Check input is boolean function op if (op.type != Operations::OpType::bfunc) { throw std::invalid_argument("ClassicalRegister::apply_bfunc: Input is not a bfunc op."); } const std::string &mask = op.string_params[0]; const std::string &target_val = op.string_params[1]; int_t compared; // if equal this should be 0, if less than -1, if greater than +1 // Check if register size fits into a 64-bit integer if (creg_register_.size() <= 64) { uint_t reg_int = std::stoull(creg_register_, nullptr, 2); // stored as bitstring uint_t mask_int = std::stoull(mask, nullptr, 16); // stored as hexstring uint_t target_int = std::stoull(target_val, nullptr, 16); // stored as hexstring compared = (reg_int & mask_int) - target_int; } else { // We need to use big ints so we implement the bit-mask via the binary string // representation rather than using a big integer class std::string mask_bin = Utils::hex2bin(mask); // has 0b prefix while creg_register_ doesn't size_t length = std::min(mask_bin.size() - 2, creg_register_.size()); // -2 to remove 0b std::string masked_val = std::string(length, '0'); for (size_t rev_pos = 0; rev_pos < length; rev_pos++) { masked_val[length - 1 - rev_pos] = (mask_bin[mask_bin.size() - 1 - rev_pos] & creg_register_[creg_register_.size() - 1 - rev_pos]); } masked_val = Utils::bin2hex(masked_val); // convert to hex string // Using string comparison to compare to target value compared = masked_val.compare(target_val); } // check value of compared integer for different comparison operations bool outcome; switch (op.bfunc) { case Operations::RegComparison::Equal: outcome = (compared == 0); break; case Operations::RegComparison::NotEqual: outcome = (compared != 0); break; case Operations::RegComparison::Less: outcome = (compared < 0); break; case Operations::RegComparison::LessEqual: outcome = (compared <= 0); break; case Operations::RegComparison::Greater: outcome = (compared > 0); break; case Operations::RegComparison::GreaterEqual: outcome = (compared >= 0); break; default: // we shouldn't ever get here throw std::invalid_argument("Invalid boolean function relation."); } // Store outcome in register if (op.registers.size() > 0) { const size_t pos = creg_register_.size() - op.registers[0] - 1; creg_register_[pos] = (outcome) ? '1' : '0'; } // Optionally store outcome in memory if (op.memory.size() > 0) { const size_t pos = creg_memory_.size() - op.memory[0] - 1; creg_memory_[pos] = (outcome) ? '1' : '0'; } } // Apply readout error instruction to classical registers void ClassicalRegister::apply_roerror(const Operations::Op &op, RngEngine &rng) { // Check input is readout error op if (op.type != Operations::OpType::roerror) { throw std::invalid_argument("ClassicalRegister::apply_roerror Input is not a readout error op."); } // Get current classical bit (and optionally register bit) values std::string mem_str; // Get values of bits as binary string // We iterate from the end of the list of memory bits for (auto it = op.memory.rbegin(); it < op.memory.rend(); ++it) { auto bit = *it; mem_str.push_back(creg_memory_[creg_memory_.size() - 1 - bit]); } auto mem_val = std::stoull(mem_str, nullptr, 2); auto outcome = rng.rand_int(op.probs[mem_val]); auto noise_str = Utils::int2string(outcome, 2, op.memory.size()); for (size_t pos = 0; pos < op.memory.size(); ++pos) { auto bit = op.memory[pos]; creg_memory_[creg_memory_.size() - 1 - bit] = noise_str[noise_str.size() - 1 - pos]; } // and the same error to register classical bits if they are used for (size_t pos = 0; pos < op.registers.size(); ++pos) { auto bit = op.registers[pos]; creg_register_[creg_register_.size() - 1 - bit] = noise_str[noise_str.size() - 1 - pos]; } } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/json.hpp000077500000000000000000000222461362723322000200440ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_json_hpp_ #define _aer_framework_json_hpp_ #include #include #include #include #include #include #include #include #include #include "framework/matrix.hpp" namespace nl = nlohmann; using json_t = nlohmann::json; //============================================================================ // JSON Library helper functions //============================================================================ namespace JSON { /** * Load a json_t from a file. If the file name is 'stdin' or '-' the json_t will * be * loaded from the standard input stream. * @param name: file name to load. * @returns: the loaded json. */ json_t load(std::string name); /** * Check if a key exists in a json_t object. * @param key: key name. * @param js: the json_t to search for key. * @returns: true if the key exists, false otherwise. */ bool check_key(std::string key, const json_t &js); /** * Check if all keys exists in a json_t object. * @param keys: vector of key names. * @param js: the json_t to search for keys. * @returns: true if all keys exists, false otherwise. */ bool check_keys(std::vector keys, const json_t &js); /** * Load a json_t object value into a variable if the key name exists. * @param var: variable to store key value. * @param key: key name. * @param js: the json_t to search for key. * @returns: true if the keys exists and val was set, false otherwise. */ template bool get_value(T &var, std::string key, const json_t &js); } // end namespace JSON //============================================================================ // JSON Conversion for complex STL types //============================================================================ namespace std { /** * Convert a complex number to a json list z -> [real(z), imag(z)]. * @param js a json_t object to contain converted type. * @param z a complex number to convert. */ template void to_json(json_t &js, const std::complex &z); /** * Convert a JSON value to a complex number z. If the json value is a float * it will be converted to a complex z = (val, 0.). If the json value is a * length two list it will be converted to a complex z = (val[0], val[1]). * @param js a json_t object to convert. * @param z a complex number to contain result. */ template void from_json(const json_t &js, std::complex &z); /** * Convert a complex vector to a json list * v -> [ [real(v[0]), imag(v[0])], ...] * @param js a json_t object to contain converted type. * @param vec a complex vector to convert. */ template void to_json(json_t &js, const std::vector> &vec); /** * Convert a JSON list to a complex vector. The input JSON value may be: * - an object with complex pair values: {'00': [re, im], ... } * - an object with real pair values: {'00': n, ... } * - an list with complex values: [ [a0re, a0im], ...] * - an list with real values: [a0, a1, ....] * @param js a json_t object to convert. * @param vec a complex vector to contain result. */ template void from_json(const json_t &js, std::vector> &vec); /** * Convert a map with integer keys to a json. This converts the integer keys * to strings in the resulting json object. * @param js a json_t object to contain converted type. * @param map a map to convert. */ template void to_json(json_t &js, const std::map &map); template void to_json(json_t &js, const std::map &map); } // end namespace std. /** * Convert a matrix to a json. * @param js a json_t object to contain converted type. * @param mat a matrix to convert. */ template void from_json(const json_t &js, matrix &mat); template void to_json(json_t &js, const matrix &mat); /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // JSON Helper Functions //------------------------------------------------------------------------------ json_t JSON::load(std::string name) { if (name == "") { json_t js; return js; // Return empty node if no config file } json_t js; if (name == "stdin" || name == "-") // Load from stdin std::cin >> js; else { // Load from file std::ifstream ifile; ifile.exceptions(std::ifstream::failbit | std::ifstream::badbit); try { ifile.open(name); } catch (std::exception &e) { throw std::runtime_error(std::string("no such file or directory")); } ifile >> js; } return js; } bool JSON::check_key(std::string key, const json_t &js) { // returns false if the value is 'null' if (js.find(key) != js.end() && !js[key].is_null()) return true; else return false; } bool JSON::check_keys(std::vector keys, const json_t &js) { bool pass = true; for (auto s : keys) pass &= check_key(s, js); return pass; } template bool JSON::get_value(T &var, std::string key, const json_t &js) { if (check_key(key, js)) { var = js[key].get(); return true; } else { return false; } } //------------------------------------------------------------------------------ // JSON Conversion //------------------------------------------------------------------------------ template void std::to_json(json_t &js, const std::complex &z) { js = std::pair{z.real(), z.imag()}; } template void std::from_json(const json_t &js, std::complex &z) { if (js.is_number()) z = std::complex{js.get()}; else if (js.is_array() && js.size() == 2) { z = std::complex{js[0].get(), js[1].get()}; } else { throw std::invalid_argument( std::string("JSON: invalid complex number")); } } template void std::to_json(json_t &js, const std::vector> &vec) { std::vector> out; for (auto &z : vec) { out.push_back(std::vector{real(z), imag(z)}); } js = out; } template void std::from_json(const json_t &js, std::vector> &vec) { std::vector> ret; if (js.is_array()) { for (auto &elt : js) ret.push_back(elt); vec = ret; } else { throw std::invalid_argument( std::string("JSON: invalid complex vector.")); } } // Int-key maps template void std::to_json(json_t &js, const std::map &map) { js = json_t(); for (const auto &p : map) { std::string key = std::to_string(p.first); js[key] = p.second; } } // Int-key maps template void std::to_json(json_t &js, const std::map &map) { js = json_t(); for (const auto &p : map) { std::string key = std::to_string(p.first); js[key] = p.second; } } // Matrices //------------------------------------------------------------------------------ // Implementation: JSON Conversion //------------------------------------------------------------------------------ template void to_json(json_t &js, const matrix &mat) { js = json_t(); size_t rows = mat.GetRows(); size_t cols = mat.GetColumns(); for (size_t r = 0; r < rows; r++) { std::vector mrow; for (size_t c = 0; c < cols; c++) mrow.push_back(mat(r, c)); js.push_back(mrow); } } template void from_json(const json_t &js, matrix &mat) { // Check JSON is an array if(!js.is_array()) { throw std::invalid_argument( std::string("JSON: invalid matrix (not array).")); } // Check JSON isn't empty if(js.empty()) { throw std::invalid_argument( std::string("JSON: invalid matrix (empty array).")); } // check rows are all same length bool rows_valid = js.is_array() && !js.empty(); // Check all entries of array are same size size_t ncols = js[0].size(); size_t nrows = js.size(); for (auto &row : js) rows_valid &= (row.is_array() && row.size() == ncols); if(!rows_valid) { throw std::invalid_argument( std::string("JSON: invalid matrix (rows different sizes).")); } // Matrix looks ok, now we parse it mat = matrix(nrows, ncols); for (size_t r = 0; r < nrows; r++) for (size_t c = 0; c < ncols; c++) mat(r, c) = js[r][c].get(); } //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/linalg/000077500000000000000000000000001362723322000176175ustar00rootroot00000000000000qiskit-aer-0.4.1/src/framework/linalg/almost_equal.hpp000077500000000000000000000033341362723322000230240ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_almost_equal_hpp_ #define _aer_framework_linalg_almost_equal_hpp_ #include #include #include #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // No silver bullet for floating point comparison techniques. // With this function the user can at least specify the precision // If we have numbers closer to 0, then max_diff can be set to a value // way smaller than epsilon. For numbers larger than 1.0, epsilon will // scale (the bigger the number, the bigger the epsilon). template > bool almost_equal(T f1, T f2, T max_diff = std::numeric_limits::epsilon(), T max_relative_diff = std::numeric_limits::epsilon()) { T diff = std::abs(f1 - f2); if (diff <= max_diff) return true; return diff <= max_relative_diff * std::max(std::abs(f1), std::abs(f2)); } //------------------------------------------------------------------------------ } // namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/enable_if_numeric.hpp000077500000000000000000000026751362723322000237730ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_enable_if_numeric_hpp_ #define _aer_framework_linalg_enable_if_numeric_hpp_ #include #include // Type check template to enable functions if type is a numeric scalar // (integer, float, or complex float) template struct is_numeric_scalar : std::integral_constant< bool, std::is_arithmetic::value || std::is_same, typename std::remove_cv::type>::value || std::is_same, typename std::remove_cv::type>::value || std::is_same, typename std::remove_cv::type>::value> {}; template using enable_if_numeric_t = std::enable_if_t::value>; //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linalg.hpp000077500000000000000000000020161362723322000216000ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_hpp_ #define _aer_framework_linalg_hpp_ #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/linops/linops_array.hpp" #include "framework/linalg/linops/linops_json.hpp" #include "framework/linalg/linops/linops_map.hpp" #include "framework/linalg/linops/linops_matrix.hpp" #include "framework/linalg/linops/linops_unordered_map.hpp" #include "framework/linalg/linops/linops_vector.hpp" #include "framework/linalg/linops/linops_generic.hpp" #include "framework/linalg/square.hpp" #endifqiskit-aer-0.4.1/src/framework/linalg/linops/000077500000000000000000000000001362723322000211235ustar00rootroot00000000000000qiskit-aer-0.4.1/src/framework/linalg/linops/linops_array.hpp000077500000000000000000000117571362723322000243540ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_array_hpp_ #define _aer_framework_linalg_linops_array_hpp_ #include #include #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions add, sub, mul, div and iadd, imul, isub, idiv // that work for numeric vector types //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- template > std::array& iadd(std::array& lhs, const std::array& rhs) { std::transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), std::plus()); return lhs; } template > std::array add(const std::array& lhs, const std::array& rhs) { std::array result = lhs; return iadd(result, rhs); } template > std::array& isub(std::array& lhs, const std::array& rhs) { std::transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), std::minus()); return lhs; } template > std::array sub(const std::array& lhs, const std::array& rhs) { std::array result = lhs; return isub(result, rhs); } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::array& iadd(std::array& data, const Scalar& val) { std::transform(data.begin(), data.end(), data.begin(), std::bind(std::plus(), std::placeholders::_1, val)); return data; } template , typename = enable_if_numeric_t> std::array add(const std::array& data, const Scalar& val) { std::array result = data; return iadd(result, val); } template , typename = enable_if_numeric_t> std::array& isub(std::array& data, const Scalar& val) { std::transform(data.begin(), data.end(), data.begin(), std::bind(std::minus(), std::placeholders::_1, val)); return data; } template , typename = enable_if_numeric_t> std::array sub(const std::array& data, const Scalar& val) { std::array result = data; return isub(result, val); } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::array& imul(std::array& data, const Scalar& val) { std::transform(data.begin(), data.end(), data.begin(), std::bind(std::multiplies(), std::placeholders::_1, val)); return data; } template , typename = enable_if_numeric_t> std::array mul(const std::array& data, const Scalar& val) { std::array result = data; return imul(result, val); } template , typename = enable_if_numeric_t> std::array& idiv(std::array& data, const Scalar& val) { std::transform(data.begin(), data.end(), data.begin(), std::bind(std::divides(), std::placeholders::_1, val)); return data; } template , typename = enable_if_numeric_t> std::array div(const std::array& data, const Scalar& val) { std::array result = data; return idiv(result, val); } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linops/linops_generic.hpp000077500000000000000000000070711362723322000246440ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_generic_hpp_ #define _aer_framework_linalg_linops_generic_hpp_ #include #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions add, sub, mul, div and iadd, imul, isub, idiv // that for generic types that support +,-,*,/ and +=, -=, *=, /= overloads //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- template T add(const T& lhs, const T& rhs) { return std::plus()(lhs, rhs); } template T& iadd(T& lhs, const T& rhs) { lhs = std::plus()(lhs, rhs); return lhs; } template T sub(const T& lhs, const T& rhs) { return std::minus()(lhs, rhs); } template T& isub(T& lhs, const T& rhs) { lhs = std::minus()(lhs, rhs); return lhs; } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template > T add(const T& data, const Scalar& val) { return std::plus()(data, val); } template > T& iadd(T& data, const Scalar& val) { data = std::plus()(data, val); return data; } template > T sub(const T& data, const Scalar& val) { return std::minus()(data, val); } template > T& isub(T& data, const Scalar& val) { data = std::minus()(data, val); return data; } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template > T mul(const T& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } return std::multiplies()(data, val); } template > T& imul(T& data, const Scalar& val) { if (!almost_equal(val, 1)) { data = std::multiplies()(data, val); } return data; } template > T div(const T& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } return std::divides()(data, val); } template > T& idiv(T& data, const Scalar& val) { if (!almost_equal(val, 1)) { data = std::divides()(data, val); } return data; } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linops/linops_json.hpp000077500000000000000000000150741362723322000242030ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_json_hpp_ #define _aer_framework_linalg_linops_json_hpp_ #include "framework/json.hpp" #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions add, sub, mul, div and iadd, imul, isub, idiv // that for numeric json that support +,-,*,/ and +=, -=, *=, /= overloads //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- json_t& iadd(json_t& lhs, const json_t& rhs) { // Null case if (lhs.is_null()) { lhs = rhs; return lhs; } if (rhs.is_null()) { return lhs; } // Terminating case if (lhs.is_number() && rhs.is_number()) { lhs = double(lhs) + double(rhs); return lhs; } // Recursive cases if (lhs.is_array() && rhs.is_array() && lhs.size() == rhs.size()) { for (size_t pos = 0; pos < lhs.size(); pos++) { iadd(lhs[pos], rhs[pos]); } } else if (lhs.is_object() && rhs.is_object()) { for (auto it = rhs.begin(); it != rhs.end(); ++it) { iadd(lhs[it.key()], it.value()); } } else { throw std::invalid_argument("Input JSONs cannot be added."); } return lhs; } json_t add(const json_t& lhs, const json_t& rhs) { json_t result = lhs; return iadd(result, rhs); } json_t& isub(json_t& lhs, const json_t& rhs) { // Null case if (rhs.is_null()) { return lhs; } // Terminating case if (lhs.is_number() && rhs.is_number()) { lhs = double(lhs) - double(rhs); return lhs; } // Recursive cases if (lhs.is_array() && rhs.is_array() && lhs.size() == rhs.size()) { for (size_t pos = 0; pos < lhs.size(); pos++) { isub(lhs[pos], rhs[pos]); } } else if (lhs.is_object() && rhs.is_object()) { for (auto it = rhs.begin(); it != rhs.end(); ++it) { isub(lhs[it.key()], it.value()); } } else { throw std::invalid_argument("Input JSONs cannot be subtracted."); } return lhs; } template json_t sub(const T& lhs, const json_t& rhs) { json_t result = lhs; return isub(result, rhs); } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template > json_t& iadd(json_t& data, const Scalar& val) { // Null case if (val == 0) { return data; } // Terminating case if (data.is_number()) { data = double(data) + val; return data; } // Recursive cases if (data.is_array()) { for (size_t pos = 0; pos < data.size(); pos++) { iadd(data[pos], val); } } else if (data.is_object()) { for (auto it = data.begin(); it != data.end(); ++it) { iadd(data[it.key()], val); } } else { throw std::invalid_argument("Input JSON does not support affine addition."); } return data; } template > json_t add(const json_t& data, const Scalar& val) { json_t result = data; return iadd(result, val); } template > json_t& isub(json_t& data, const Scalar& val) { // Null case if (val == 0) { return data; } // Terminating case if (data.is_number()) { data = double(data) - val; return data; } // Recursive cases if (data.is_array()) { for (size_t pos = 0; pos < data.size(); pos++) { isub(data[pos], val); } } else if (data.is_object()) { for (auto it = data.begin(); it != data.end(); ++it) { isub(data[it.key()], val); } } else { throw std::invalid_argument( "Input JSON does not support affine subtraction."); } return data; } template > json_t sub(const json_t& data, const Scalar& val) { json_t result = data; return isub(result, val); } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template > json_t& imul(json_t& data, const Scalar& val) { // Trival case if (almost_equal(val, 1)) { return data; } // Terminating case if (data.is_number()) { data = double(data) * val; return data; } // Recursive cases if (data.is_array()) { for (size_t pos = 0; pos < data.size(); pos++) { imul(data[pos], val); } return data; } if (data.is_object()) { for (auto it = data.begin(); it != data.end(); ++it) { imul(data[it.key()], val); } return data; } throw std::invalid_argument( "Input JSON does not support scalar multiplication."); } template > json_t mul(const json_t& data, const Scalar& val) { // Null case json_t result = data; return imul(result, val); } template > json_t& idiv(json_t& data, const Scalar& val) { // Trival case if (almost_equal(val, 1)) { return data; } // Terminating case if (data.is_number()) { data = double(data) / val; return data; } // Recursive cases if (data.is_array()) { for (size_t pos = 0; pos < data.size(); pos++) { idiv(data[pos], val); } return data; } if (data.is_object()) { for (auto it = data.begin(); it != data.end(); ++it) { idiv(data[it.key()], val); } return data; } throw std::invalid_argument("Input JSON does not support scalar division."); } template > json_t div(const json_t& data, const Scalar& val) { // Null case json_t result = data; return idiv(result, val); } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linops/linops_map.hpp000077500000000000000000000151641362723322000240070ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_map_hpp_ #define _aer_framework_linalg_linops_map_hpp_ #include #include #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions add, sub, mul, div and iadd, imul, isub, idiv // that work for numeric map types //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- template > std::map add(const std::map& lhs, const std::map& rhs) { std::map result = lhs; for (const auto& pair : rhs) { result[pair.first] = std::plus()(result[pair.first], pair.second); } return result; } template > std::map& iadd(std::map& lhs, const std::map& rhs) { for (const auto& pair : rhs) { lhs[pair.first] = std::plus()(lhs[pair.first], pair.second); } return lhs; } template > std::map sub(const std::map& lhs, const std::map& rhs) { std::map result = lhs; for (const auto& pair : rhs) { result[pair.first] = std::minus()(result[pair.first], pair.second); } return result; } template > std::map& isub(std::map& lhs, const std::map& rhs) { for (const auto& pair : rhs) { lhs[pair.first] = std::minus()(lhs[pair.first], pair.second); } return lhs; } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::map add(const std::map& data, const Scalar& val) { std::map result; for (const auto& pair : data) { result[pair.first] = std::plus()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::map& iadd(std::map& data, const Scalar& val) { for (const auto& pair : data) { data[pair.first] = std::plus()(data[pair.first], val); } return data; } template , typename = enable_if_numeric_t> std::map sub(const std::map& data, const Scalar& val) { std::map result; for (const auto& pair : data) { result[pair.first] = std::minus()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::map& isub(std::map& data, const Scalar& val) { for (const auto& pair : data) { data[pair.first] = std::plus()(data[pair.first], val); } return data; } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::map mul(const std::map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::map result; for (const auto& pair : data) { result[pair.first] = std::multiplies()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::map& imul(std::map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } for (const auto& pair : data) { data[pair.first] = std::multiplies()(data[pair.first], val); } return data; } template , typename = enable_if_numeric_t> std::map div(const std::map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::map result; for (const auto& pair : data) { result[pair.first] = std::divides()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::map& idiv(std::map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } for (const auto& pair : data) { data[pair.first] = std::divides()(data[pair.first], val); } return data; } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linops/linops_matrix.hpp000077500000000000000000000107201362723322000245270ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_matrix_hpp_ #define _aer_framework_linalg_linops_matrix_hpp_ #include #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" #include "framework/matrix.hpp" namespace AER { namespace Linalg { // This defines some missing overloads for matrix class // It should really be added to the matrix class //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- template > matrix add(const matrix& lhs, const matrix& rhs) { return lhs + rhs; } template > matrix& iadd(matrix& lhs, const matrix& rhs) { lhs = lhs + rhs; return lhs; } template > matrix sub(const matrix& lhs, const matrix& rhs) { return lhs - rhs; } template > matrix& isub(matrix& lhs, const matrix& rhs) { lhs = lhs - rhs; return lhs; } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> matrix& iadd(matrix& data, const Scalar& val) { if (val == 0) { return data; } for (size_t j = 0; j < data.size(); j++) { data[j] = std::plus()(data[j], val); } return data; } template , typename = enable_if_numeric_t> matrix add(const matrix& data, const Scalar& val) { matrix result(data); return iadd(result, val); } template , typename = enable_if_numeric_t> matrix sub(const matrix& data, const Scalar& val) { return add(data, -val); } template , typename = enable_if_numeric_t> matrix& isub(matrix& data, const Scalar& val) { return iadd(data, -val); } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> matrix& imul(matrix& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } for (size_t j = 0; j < data.size(); j++) { data[j] = std::multiplies()(data[j], val); } return data; } template , typename = enable_if_numeric_t> matrix mul(const matrix& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } matrix result = data; imul(result, val); return result; } template , typename = enable_if_numeric_t> matrix& idiv(matrix& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } for (size_t j = 0; j < data.size(); j++) { data[j] = std::divides()(data[j], val); } return data; } template , typename = enable_if_numeric_t> matrix div(const matrix& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } matrix result = data; idiv(result, val); return result; } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linops/linops_unordered_map.hpp000077500000000000000000000157241362723322000260600ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_unordered_map_hpp_ #define _aer_framework_linalg_linops_unordered_map_hpp_ #include #include #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions add, sub, mul, div and iadd, imul, isub, idiv // that work for numeric unordered_map types //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- template > std::unordered_map add( const std::unordered_map& lhs, const std::unordered_map& rhs) { std::unordered_map result = lhs; for (const auto& pair : rhs) { result[pair.first] = std::plus()(result[pair.first], pair.second); } return result; } template > std::unordered_map& iadd( std::unordered_map& lhs, const std::unordered_map& rhs) { for (const auto& pair : rhs) { lhs[pair.first] = std::plus()(lhs[pair.first], pair.second); } return lhs; } template > std::unordered_map sub( const std::unordered_map& lhs, const std::unordered_map& rhs) { std::unordered_map result = lhs; for (const auto& pair : rhs) { result[pair.first] = std::minus()(result[pair.first], pair.second); } return result; } template > std::unordered_map& isub( std::unordered_map& lhs, const std::unordered_map& rhs) { for (const auto& pair : rhs) { lhs[pair.first] = std::minus()(lhs[pair.first], pair.second); } return lhs; } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::unordered_map add( const std::unordered_map& data, const Scalar& val) { std::unordered_map result; for (const auto& pair : data) { result[pair.first] = std::plus()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::unordered_map& iadd( std::unordered_map& data, const Scalar& val) { for (const auto& pair : data) { data[pair.first] = std::plus()(data[pair.first], val); } return data; } template , typename = enable_if_numeric_t> std::unordered_map sub( const std::unordered_map& data, const Scalar& val) { std::unordered_map result; for (const auto& pair : data) { result[pair.first] = std::minus()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::unordered_map& isub( std::unordered_map& data, const Scalar& val) { for (const auto& pair : data) { data[pair.first] = std::plus()(data[pair.first], val); } return data; } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::unordered_map mul( const std::unordered_map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::unordered_map result; for (const auto& pair : data) { result[pair.first] = std::multiplies()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::unordered_map& imul( std::unordered_map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } for (const auto& pair : data) { data[pair.first] = std::multiplies()(data[pair.first], val); } return data; } template , typename = enable_if_numeric_t> std::unordered_map div( const std::unordered_map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::unordered_map result; for (const auto& pair : data) { result[pair.first] = std::divides()(pair.second, val); } return result; } template , typename = enable_if_numeric_t> std::unordered_map& idiv( std::unordered_map& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } for (const auto& pair : data) { data[pair.first] = std::divides()(data[pair.first], val); } return data; } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/linops/linops_vector.hpp000077500000000000000000000145531362723322000245350ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_linops_vector_hpp_ #define _aer_framework_linalg_linops_vector_hpp_ #include #include #include "framework/linalg/almost_equal.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions add, sub, mul, div and iadd, imul, isub, idiv // that work for numeric vector types //---------------------------------------------------------------------------- // Linear operations //---------------------------------------------------------------------------- template > std::vector add(const std::vector& lhs, const std::vector& rhs) { if (lhs.size() != rhs.size()) { throw std::runtime_error("Cannot add two vectors of different sizes."); } std::vector result; result.reserve(lhs.size()); std::transform(lhs.begin(), lhs.end(), rhs.begin(), std::back_inserter(result), std::plus()); return result; } template > std::vector& iadd(std::vector& lhs, const std::vector& rhs) { if (lhs.size() != rhs.size()) { throw std::runtime_error("Cannot add two vectors of different sizes."); } std::transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), std::plus()); return lhs; } template > std::vector sub(const std::vector& lhs, const std::vector& rhs) { if (lhs.size() != rhs.size()) { throw std::runtime_error("Cannot add two vectors of different sizes."); } std::vector result; result.reserve(lhs.size()); std::transform(lhs.begin(), lhs.end(), rhs.begin(), std::back_inserter(result), std::minus()); return result; } template > std::vector& isub(std::vector& lhs, const std::vector& rhs) { if (lhs.size() != rhs.size()) { throw std::runtime_error("Cannot add two vectors of different sizes."); } std::transform(lhs.begin(), lhs.end(), rhs.begin(), lhs.begin(), std::minus()); return lhs; } //---------------------------------------------------------------------------- // Affine operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::vector add(const std::vector& data, const Scalar& val) { std::vector result; result.reserve(data.size()); std::transform(data.begin(), data.end(), std::back_inserter(result), std::bind(std::plus(), std::placeholders::_1, val)); return result; } template , typename = enable_if_numeric_t> std::vector& iadd(std::vector& data, const Scalar& val) { std::transform(data.begin(), data.end(), data.begin(), std::bind(std::plus(), std::placeholders::_1, val)); return data; } template , typename = enable_if_numeric_t> std::vector sub(const std::vector& data, const Scalar& val) { std::vector result; result.reserve(data.size()); std::transform(data.begin(), data.end(), std::back_inserter(result), std::bind(std::minus(), std::placeholders::_1, val)); return result; } template , typename = enable_if_numeric_t> std::vector& isub(std::vector& data, const Scalar& val) { std::transform(data.begin(), data.end(), data.begin(), std::bind(std::minus(), std::placeholders::_1, val)); return data; } //---------------------------------------------------------------------------- // Scalar operations //---------------------------------------------------------------------------- template , typename = enable_if_numeric_t> std::vector mul(const std::vector& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::vector result; result.reserve(data.size()); std::transform(data.begin(), data.end(), std::back_inserter(result), std::bind(std::multiplies(), std::placeholders::_1, val)); return result; } template , typename = enable_if_numeric_t> std::vector& imul(std::vector& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::transform(data.begin(), data.end(), data.begin(), std::bind(std::multiplies(), std::placeholders::_1, val)); return data; } template , typename = enable_if_numeric_t> std::vector div(const std::vector& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::vector result; result.reserve(data.size()); std::transform(data.begin(), data.end(), std::back_inserter(result), std::bind(std::divides(), std::placeholders::_1, val)); return result; } template , typename = enable_if_numeric_t> std::vector& idiv(std::vector& data, const Scalar& val) { if (almost_equal(val, 1)) { return data; } std::transform(data.begin(), data.end(), data.begin(), std::bind(std::divides(), std::placeholders::_1, val)); return data; } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/linalg/square.hpp000077500000000000000000000136011362723322000216340ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_linalg_square_hpp_ #define _aer_framework_linalg_square_hpp_ #include #include #include #include #include #include "framework/json.hpp" #include "framework/matrix.hpp" #include "framework/types.hpp" #include "framework/linalg/enable_if_numeric.hpp" namespace AER { namespace Linalg { // This defines functions 'square' for entrywise square of // numeric types, and 'isquare' for inplace entywise square. //---------------------------------------------------------------------------- // Entrywise square of std::array //---------------------------------------------------------------------------- // Return entrywise square of a vector template > std::array square(const std::array& data) { std::array result = data; return isquare(result); } // Return inplace entrywise square of a vector template > std::array& isquare(std::array& data) { std::transform(data.begin(), data.end(), data.begin(), data.begin(), std::multiplies()); return data; } //---------------------------------------------------------------------------- // Entrywise square of std::vector //---------------------------------------------------------------------------- // Return entrywise square of a vector template > std::vector square(const std::vector& data) { std::vector result; result.reserve(data.size()); std::transform(data.begin(), data.end(), data.begin(), std::back_inserter(result), std::multiplies()); return result; } // Return inplace entrywise square of a vector template > std::vector& isquare(std::vector& data) { std::transform(data.begin(), data.end(), data.begin(), data.begin(), std::multiplies()); return data; } //---------------------------------------------------------------------------- // Entrywise square of std::map //---------------------------------------------------------------------------- template > std::map square(const std::map& data) { std::map result; for (const auto& pair : data) { result[pair.first] = pair.second * pair.second; } return result; } template > std::map& isquare(std::map& data) { for (auto& pair : data) { pair.second *= pair.second; } return data; } //---------------------------------------------------------------------------- // Entrywise square of std::unordered_map //---------------------------------------------------------------------------- template > std::unordered_map square( const std::unordered_map& data) { std::unordered_map result; for (const auto& pair : data) { result[pair.first] = pair.second * pair.second; } return result; } template > std::unordered_map& isquare(std::unordered_map& data) { for (auto& pair : data) { pair.second *= pair.second; } return data; } //---------------------------------------------------------------------------- // Entrywise square of matrix //---------------------------------------------------------------------------- template > matrix& isquare(matrix& data) { for (size_t j = 0; j < data.size(); j++) { data[j] *= data[j]; } return data; } template > matrix square(const matrix& data) { matrix result = data; return isquare(result); } //---------------------------------------------------------------------------- // Entrywise square of JSON //---------------------------------------------------------------------------- json_t& isquare(json_t& data) { // Terminating case if (data.is_number()) { double val = data; data = val * val; return data; } // Recursive cases if (data.is_array()) { for (size_t pos = 0; pos < data.size(); pos++) { isquare(data[pos]); } return data; } if (data.is_object()) { for (auto it = data.begin(); it != data.end(); ++it) { isquare(data[it.key()]); } return data; } throw std::invalid_argument("Input JSONs cannot be squared."); } json_t square(const json_t& data) { json_t result = data; return isquare(result); } //---------------------------------------------------------------------------- // Square of general type //---------------------------------------------------------------------------- template T square(const T& data) { return data * data; } template T& isquare(T& data) { data *= data; return data; } //------------------------------------------------------------------------------ } // end namespace Linalg //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/matrix.hpp000077500000000000000000000767101362723322000204040ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ /* Dependences: BLAS Brief Discription: This is my Matrix class. It works only with real/complex matrices and stores the entries in column-major-order. In column-major storage the columns are stored one after the other. The linear offset p from the beginning of the array to any given element A(i,j) can then be computed as: p = j*Nrows+i where Nrows is the number of rows in the matrix. Hence, one scrolls down rows and moves to a new column once the last row is reached. More precisely, if i wanted to know the i and j associtated with a given p then i would use i=p %Nrows j= floor(p/Nrows) Multiplication is done with the C wrapper of the fortran blas library. */ #ifndef _aer_framework_matrix_hpp #define _aer_framework_matrix_hpp #include #include #include #include /******************************************************************************* * * BLAS headers * ******************************************************************************/ const std::array Trans = {'N', 'T', 'C'}; /* Trans (input) CHARACTER*1. On entry, TRANSA specifies the form of op( A ) to be used in the matrix multiplication as follows: = 'N' no transpose; = 'T' transpose of A; = 'C' hermitian conjugate of A. */ const std::array UpLo = {'U', 'L'}; /* UpLo (input) CHARACTER*1 = 'U': Upper triangle of A is stored; = 'L': Lower triangle of A is stored. */ const std::array Jobz = {'V', 'N'}; /* Jobz (input) CHARACTER*1 = 'N': Compute eigenvalues only; = 'V': Compute eigenvalues and eigenvectors. */ const std::array Range = {'A', 'V', 'I'}; /* Range (input) CHARACTER*1 = 'A': all eigenvalues will be found. = 'V': all eigenvalues in the half-open interval (VL,VU] will be found. = 'I': the IL-th through IU-th eigenvalues will be found. */ #ifdef __cplusplus extern "C" { #endif //=========================================================================== // Prototypes for level 3 BLAS //=========================================================================== // Single-Precison Real Matrix-Vector Multiplcation void sgemv_(const char *TransA, const size_t *M, const size_t *N, const float *alpha, const float *A, const size_t *lda, const float *x, const size_t *incx, const float *beta, float *y, const size_t *lincy); // Double-Precison Real Matrix-Vector Multiplcation void dgemv_(const char *TransA, const size_t *M, const size_t *N, const double *alpha, const double *A, const size_t *lda, const double *x, const size_t *incx, const double *beta, double *y, const size_t *lincy); // Single-Precison Complex Matrix-Vector Multiplcation void cgemv_(const char *TransA, const size_t *M, const size_t *N, const std::complex *alpha, const std::complex *A, const size_t *lda, const std::complex *x, const size_t *incx, const std::complex *beta, std::complex *y, const size_t *lincy); // Double-Precison Real Matrix-Vector Multiplcation void zgemv_(const char *TransA, const size_t *M, const size_t *N, const std::complex *alpha, const std::complex *A, const size_t *lda, const std::complex *x, const size_t *incx, const std::complex *beta, std::complex *y, const size_t *lincy); // Single-Precison Real Matrix-Matrix Multiplcation void sgemm_(const char *TransA, const char *TransB, const size_t *M, const size_t *N, const size_t *K, const float *alpha, const float *A, const size_t *lda, const float *B, const size_t *lba, const float *beta, float *C, size_t *ldc); // Double-Precison Real Matrix-Matrix Multiplcation void dgemm_(const char *TransA, const char *TransB, const size_t *M, const size_t *N, const size_t *K, const double *alpha, const double *A, const size_t *lda, const double *B, const size_t *lba, const double *beta, double *C, size_t *ldc); // Single-Precison Complex Matrix-Matrix Multiplcation void cgemm_(const char *TransA, const char *TransB, const size_t *M, const size_t *N, const size_t *K, const std::complex *alpha, const std::complex *A, const size_t *lda, const std::complex *B, const size_t *ldb, const std::complex *beta, std::complex *C, size_t *ldc); // Double-Precison Complex Matrix-Matrix Multiplcation void zgemm_(const char *TransA, const char *TransB, const size_t *M, const size_t *N, const size_t *K, const std::complex *alpha, const std::complex *A, const size_t *lda, const std::complex *B, const size_t *ldb, const std::complex *beta, std::complex *C, size_t *ldc); #ifdef __cplusplus } #endif /******************************************************************************* * * Matrix Class * ******************************************************************************/ enum OutputStyle { Column, List, Matrix }; template // define a class template class matrix { // friend functions get to use the private varibles of the class as well as // have different classes as inputs template friend std::ostream & operator<<(std::ostream &output, const matrix &A); // overloading << to output a matrix template friend std::istream & operator>>(std::istream &input, const matrix &A); // overloading >> to read in a matrix // Multiplication (does not catch an error of a S1 = real and S2 being // complex) template friend matrix operator*(const S2 &beta, const matrix &A); // multiplication by a scalar beta*A template friend matrix operator*(const matrix &A, const S2 &beta); // multiplication by a scalar A*beta // Single-Precison Matrix Multiplication friend matrix operator*(const matrix &A, const matrix &B); // real matrix multiplication A*B friend matrix> operator*( const matrix> &A, const matrix> &B); // complex matrix multplication A*B friend matrix> operator*(const matrix &A, const matrix> &B); // real-complex matrix multplication A*B friend matrix> operator*(const matrix> &A, const matrix &B); // real-complex matrix multplication A*B // Double-Precision Matrix Multiplication friend matrix operator*(const matrix &A, const matrix &B); // real matrix multiplication A*B friend matrix> operator*(const matrix> &A, const matrix> &B); // complex matrix multplication A*B friend matrix> operator*(const matrix &A, const matrix> &B); // real-complex matrix multplication A*B friend matrix> operator*(const matrix> &A, const matrix &B); // real-complex matrix multplication A*B // Single-Precision Matrix-Vector Multiplication friend std::vector operator*(const matrix &A, const std::vector &v); friend std::vector> operator*(const matrix> &A, const std::vector> &v); // Double-Precision Matrix-Vector Multiplication friend std::vector operator*(const matrix &A, const std::vector &v); friend std::vector> operator*(const matrix> &A, const std::vector> &v); public: // Constructors of matrix class matrix(); matrix(size_t rows, size_t cols); explicit matrix(size_t size); // Makes a square matrix and rows = sqrt(size) columns = // sqrt(dims) matrix(const matrix &m); matrix(const matrix &m, const char uplo); // Initialize an empty matrix() to matrix(size_t rows, size_t cols) void initialize(size_t rows, size_t cols); // Clear used memory void clear(); // Destructor virtual ~matrix(); // Assignment operator matrix &operator=(const matrix &m); template matrix &operator=(const matrix &m); // Still would like to have real // assigend by complex -- take real // part // Addressing elements by vector representation T &operator[](size_t element); T operator[](size_t element) const; // Addressing elements by matrix representation T &operator()(size_t row, size_t col); T operator()(size_t row, size_t col) const; // overloading functions. matrix operator+(const matrix &A); matrix operator-(const matrix &A); matrix operator+(const matrix &A) const; matrix operator-(const matrix &A) const; matrix &operator+=(const matrix &A); matrix &operator-=(const matrix &A); // Member Functions size_t GetColumns() const; // gives the number of columns size_t GetRows() const; // gives the number of rows size_t GetLD() const; // gives the leading dimension -- number of rows size_t size() const; // gives the size of the underlying vector bool empty() const; // Return true if size == 0; void resize(size_t row, size_t col); // sets the size of the underlying vector void SetOutputStyle(enum OutputStyle outputstyle); // sets the style the // matrix is display by << T *GetMat() const; // gives you the address of element 0 then *(c+i) gives you // the ith element protected: size_t rows_ = 0, cols_ = 0, size_ = 0, LD_ = 0; // rows_ and cols_ are the rows and columns of the matrix // size_ = rows*colums dimensions of the vector representation // LD is the leading dimeonsion and for Column major order is in general eqaul // to rows enum OutputStyle outputstyle_ = Matrix; // outputstyle_ is the output style used by << T *mat_ = nullptr; // the ptr to the vector containing the matrix }; /******************************************************************************* * * Matrix class: methods * ******************************************************************************/ template inline matrix::matrix(){} // constructs an empty matrix using the .... template inline matrix::matrix(size_t rows, size_t cols) : rows_(rows), cols_(cols), size_(rows * cols), LD_(rows), outputstyle_(Column), mat_(new T[size_]) {} // constructs an empty matrix of size rows, cols and sets outputstyle to zero template inline matrix::matrix(size_t dim2) : size_(dim2), outputstyle_(Column), mat_(new T[size_]) { // constructs a square matrix of dims sqrt(size)*sqrt(size) // PLEASE DO NOT CHANGE THIS AS IT IS USED BY ODESOLVER // size_t dim2 = rhovec.GetRows(); // size_t dim = (size_t)std::floor(sqrt((double)dim2+1.0)); if (size_ == 0) rows_ = size_; else if (size_ == 1) rows_ = size_; else if (size_ == 2) { std::cerr << "Error: matrix constructor matrix(dim): the number you entered " "does not have a integer sqrt." << std::endl; exit(1); } else for (rows_ = 2; rows_ < size_; ++rows_) { if (size_ == rows_ * rows_) break; if (rows_ * rows_ > size_) { std::cerr << "Error: matrix constructor matrix(dim): the number you " "enterd does not have a interger sqrt" << std::endl; exit(1); } } cols_ = rows_; LD_ = rows_; } // constructs an empty matrix of size rows, cols and sets outputstyle to zero template inline matrix::matrix(const matrix &rhs) : rows_(rhs.rows_), cols_(rhs.cols_), size_(rhs.size_), LD_(rows_), outputstyle_(rhs.outputstyle_), mat_(new T[size_]) { // Copy constructor, copies the matrix to another matrix for (size_t p = 0; p < size_; p++) { mat_[p] = rhs.mat_[p]; } } template inline matrix::matrix(const matrix &rhs, const char uplo) : rows_(rhs.rows_), cols_(rhs.cols_), size_(rhs.size_), LD_(rows_), outputstyle_(rhs.outputstyle_), mat_(new T[size_]) { // Copy constructor, copies the matric to another matrix but only the upper or // lower triangle if (uplo == 'U') { for (size_t i = 0; i < rows_; i++) for (size_t j = i; j < cols_; j++) mat_[j * rows_ + i] = rhs.mat_[j * rows_ + i]; } else if (uplo == 'L') { for (size_t i = 0; i < rows_; i++) for (size_t j = 0; j <= i; j++) mat_[j * rows_ + i] = rhs.mat_[j * rows_ + i]; } else { std::cerr << "Error: matrix copy constructor did not have a valid option " "-- these are Lower, Upper" << std::endl; exit(1); } } template inline void matrix::initialize(size_t rows, size_t cols) { if (rows_ != rows || cols_ != cols) { // if the rows are different size delete // re-construct the matrix if (mat_ != 0) delete[](mat_); rows_ = rows; cols_ = cols; size_ = rows_ * cols_; LD_ = rows; mat_ = new T[size_]; // std::cout << "Assignement (reassigment), size " << size_ << " rows_ " << // rows_ << " cols " << cols_ << " LD "<< LD_ << std::endl; } } template inline void matrix::clear() { if (!mat_ || !size_) return; rows_ = cols_ = size_ = 0; delete[](mat_); mat_ = 0; } template inline void matrix::resize(size_t rows, size_t cols) { if (rows_ == rows && cols_ == cols) return; T *tempmat = new T[size_ = rows * cols]; for (size_t i = 0; i < rows; i++) for (size_t j = 0; j < cols; j++) if (i < rows_ && j < cols_) tempmat[j * rows + i] = mat_[j * rows_ + i]; else tempmat[j * rows + i] = 0.0; LD_ = rows_ = rows; cols_ = cols; delete[](mat_); mat_ = tempmat; } template inline matrix::~matrix() { // destructor, deletes the matrix from memory when we leave the scope if (mat_ != nullptr) delete[](mat_); } template inline matrix &matrix::operator=(const matrix &rhs) { // overloading the assignement operator // postcondition: normal assignment via copying has been performed; // if matrix and rhs were different sizes, matrix // has been resized to match the size of rhs //#ifdef DEBUG if (rows_ != rhs.rows_ || cols_ != rhs.cols_) { // if the rows are different // size delete re-construct // the matrix if (mat_ != 0) delete[](mat_); rows_ = rhs.rows_; cols_ = rhs.cols_; size_ = rows_ * cols_; LD_ = rhs.LD_; mat_ = new T[size_]; } //#endif for (size_t p = 0; p < size_; p++) { // the copying of the matrix // std::cout << p << std::endl; mat_[p] = T(rhs.mat_[p]); } return *this; } template template inline matrix &matrix::operator=(const matrix &rhs) { // overloading the assignement operator // postcondition: normal assignment via copying has been performed; // if matrix and rhs were different sizes, matrix // has been resized to match the size of rhs //#ifdef DEBUG if (rows_ != rhs.GetRows() || cols_ != rhs.GetColumns()) { // if the rows are different size delete // re-construct the matrix if (mat_ != nullptr) delete[](mat_); rows_ = rhs.GetRows(); cols_ = rhs.GetColumns(); size_ = rows_ * cols_; LD_ = rhs.GetLD(); mat_ = new T[size_]; } //#endif for (size_t p = 0; p < size_; p++) { // the copying of the matrix mat_[p] = T(rhs[p]); } return *this; } template inline T &matrix::operator[](size_t p) { // returns the pth element of the vector representing the matrix, remember [] // is the operator acting on the object matrix (read backwards). #ifdef DEBUG if (p >= size_) { std::cerr << "error: matrix class operator []: Matrix subscript out of bounds" << std::endl; exit(1); } #endif return mat_[p]; } template inline T matrix::operator[](size_t p) const { // returns the pth element of the vector representing the matrix if the operator // is acting on a const #ifdef DEBUG if (p >= size_) { std::cerr << "Error: matrix class operator [] const: Matrix subscript out " "of bounds" << std::endl; exit(1); } #endif return mat_[p]; } template inline T &matrix::operator()(size_t i, size_t j) { // return the data at position i,j, remember () is the operator acting on the // object matrix (read backwards). #ifdef DEBUG if (i >= rows_ || j >= cols_) { std::cerr << "Error: matrix class operator (): Matrices subscript out of bounds" << std::endl; exit(1); } #endif return mat_[j * rows_ + i]; } template inline T matrix::operator()(size_t i, size_t j) const { // return the data at i,j if the operator is acting on a const #ifdef DEBUG if (i >= rows_ || j >= cols_) { std::cerr << "Error: matrix class operator () const: Matrices subscript " "out of bounds" << std::endl; exit(1); } #endif return mat_[j * rows_ + i]; } template inline size_t matrix::GetRows() const { // returns the rows of the matrix return rows_; } template inline size_t matrix::GetColumns() const { // returns the colums of the matrix return cols_; } template inline size_t matrix::GetLD() const { // returns the leading dimension return LD_; } template inline size_t matrix::size() const { // returns the size of the underlying vector return size_; } template inline bool matrix::empty() const { // returns the size of the underlying vector return (size() == 0); } template inline T *matrix::GetMat() const { // returns the ptr for the matrix data return mat_; } template inline void matrix::SetOutputStyle(enum OutputStyle outputstyle) { // sets the outputstyle outputstyle_ = outputstyle; } template inline matrix matrix::operator+(const matrix &A) { // overloads the + for matrix addition, can this be more efficient #ifdef DEBUG if (rows_ != A.rows_ || cols_ != A.cols_) { std::cerr << "Error: matrix class operator +: Matrices are not the same size" << std::endl; exit(1); } #endif matrix temp(rows_, cols_); for (unsigned int p = 0; p < size_; p++) { temp.mat_[p] = mat_[p] + A.mat_[p]; } return temp; } template inline matrix matrix::operator-(const matrix &A) { // overloads the - for matrix substraction, can this be more efficient #ifdef DEBUG if (rows_ != A.rows_ || cols_ != A.cols_) { std::cerr << "Error: matrix class operator -: Matrices are not the same size" << std::endl; exit(1); } #endif matrix temp(rows_, cols_); for (unsigned int p = 0; p < size_; p++) { temp.mat_[p] = mat_[p] - A.mat_[p]; } return temp; } template inline matrix matrix::operator+(const matrix &A) const { // overloads the + for matrix addition if it is a const matrix, can this be more // efficient #ifdef DEBUG if (rows_ != A.rows_ || cols_ != A.cols_) { std::cerr << "Error: matrix class operator + const: Matrices are not the " "same size" << std::endl; exit(1); } #endif matrix temp(rows_, cols_); for (unsigned int p = 0; p < size_; p++) { temp.mat_[p] = mat_[p] + A.mat_[p]; } return temp; } template inline matrix matrix::operator-(const matrix &A) const { // overloads the - for matrix substraction, can this be more efficient #ifdef DEBUG if (rows_ != A.rows_ || cols_ != A.cols_) { std::cerr << "Error: matrix class operator - const: Matrices are not the " "same size" << std::endl; exit(1); } #endif matrix temp(rows_, cols_); for (unsigned int p = 0; p < size_; p++) { temp.mat_[p] = mat_[p] - A.mat_[p]; } return temp; } template inline matrix &matrix::operator+=(const matrix &A) { // overloads the += for matrix addition and assignment, can this be more // efficient #ifdef DEBUG if (rows_ != A.rows_ || cols_ != A.cols_) { std::cerr << "Error: matrix class operator +=: Matrices are not the same size" << std::endl; exit(1); } #endif for (size_t p = 0; p < size_; p++) { mat_[p] += A.mat_[p]; } return *this; } template inline matrix &matrix::operator-=(const matrix &A) { // overloads the -= for matrix subtraction and assignement, can this be more // efficient #ifdef DEBUG if (rows_ != A.rows_ || cols_ != A.cols_) { std::cerr << "Error: matrix class operator -=: Matrices are not the same size" << std::endl; exit(1); } #endif for (size_t p = 0; p < size_; p++) { mat_[p] -= A.mat_[p]; } return *this; } /******************************************************************************* * * Matrix class: Friend Functions * ******************************************************************************/ template std::ostream &operator<<(std::ostream &output, const matrix &A) { // overloads << and has three output styles // Column is in a column vector // List is a row of the actual column vector // Matrix is the matrix if (A.outputstyle_ == List) { for (size_t p = 0; p < A.size_; p++) { output << A.mat_[p] << '\t'; } } else if (A.outputstyle_ == Matrix) { for (size_t i = 0; i < A.rows_; i++) { for (size_t j = 0; j < A.cols_; j++) { output << A.mat_[j * A.rows_ + i] << "\t"; } output << std::endl; } } else if (A.outputstyle_ == Column) { for (size_t p = 0; p < A.size_; p++) { output << A.mat_[p] << '\n'; } } else { std::cerr << "Error: matrix operator << is not assigned with a valid " "option -- these are Column, List, Matrix" << std::endl; exit(1); } return output; } template std::istream &operator>>(std::istream &input, const matrix &A) { // overloads the >> to read in a row into column format for (size_t j = 0; j < A.cols_; j++) { for (size_t i = 0; i < A.rows_; i++) { input >> A.mat_[j * A.rows_ + i]; } } return input; } template matrix operator*(const matrix &A, const S2 &beta) { // overloads A*beta size_t rows = A.rows_, cols = A.cols_; matrix temp(rows, cols); for (size_t j = 0; j < cols; j++) { for (size_t i = 0; i < rows; i++) { temp(i, j) = beta * A(i, j); } } return temp; } template matrix operator*(const S2 &beta, const matrix &A) { // overloads beta*A size_t rows = A.rows_, cols = A.cols_; matrix temp(rows, cols); for (size_t j = 0; j < cols; j++) { for (size_t i = 0; i < rows; i++) { temp(i, j) = beta * A(i, j); } } return temp; } // Operator overloading with BLAS functions inline matrix operator*(const matrix &A, const matrix &B) { // overloads A*B for real matricies and uses the blas dgemm routine // cblas_dgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix C(A.rows_, B.cols_); double alpha = 1.0, beta = 0.0; dgemm_(&Trans[0], &Trans[0], &A.rows_, &B.cols_, &A.cols_, &alpha, A.mat_, &A.LD_, B.mat_, &B.LD_, &beta, C.mat_, &C.LD_); // cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, A.rows_, B.cols_, // A.cols_, 1.0, A.mat_, A.LD_, B.mat_, B.LD_, 0.0, C.mat_, C.LD_); return C; } inline matrix operator*(const matrix &A, const matrix &B) { // overloads A*B for real matricies and uses the blas sgemm routine // cblas_sgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix C(A.rows_, B.cols_); float alpha = 1.0, beta = 0.0; sgemm_(&Trans[0], &Trans[0], &A.rows_, &B.cols_, &A.cols_, &alpha, A.mat_, &A.LD_, B.mat_, &B.LD_, &beta, C.mat_, &C.LD_); // cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, A.rows_, B.cols_, // A.cols_, 1.0, A.mat_, A.LD_, B.mat_, B.LD_, 0.0, C.mat_, C.LD_); return C; } inline matrix> operator*(const matrix> &A, const matrix> &B) { // overloads A*B for complex matricies and uses the blas zgemm routine // cblas_zgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix> C(A.rows_, B.cols_); std::complex alpha = 1.0, beta = 0.0; cgemm_(&Trans[0], &Trans[0], &A.rows_, &B.cols_, &A.cols_, &alpha, A.mat_, &A.LD_, B.mat_, &B.LD_, &beta, C.mat_, &C.LD_); // cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, A.rows_, B.cols_, // A.cols_, &alpha, A.mat_, A.LD_, B.mat_, B.LD_, &beta, C.mat_, C.LD_); return C; } inline matrix> operator*(const matrix> &A, const matrix> &B) { // overloads A*B for complex matricies and uses the blas zgemm routine // cblas_zgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix> C(A.rows_, B.cols_); std::complex alpha = 1.0, beta = 0.0; zgemm_(&Trans[0], &Trans[0], &A.rows_, &B.cols_, &A.cols_, &alpha, A.mat_, &A.LD_, B.mat_, &B.LD_, &beta, C.mat_, &C.LD_); // cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, A.rows_, B.cols_, // A.cols_, &alpha, A.mat_, A.LD_, B.mat_, B.LD_, &beta, C.mat_, C.LD_); return C; } inline matrix> operator*(const matrix &A, const matrix> &B) { // overloads A*B for complex matricies and uses the blas zgemm routine // cblas_zgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix> C(A.rows_, B.cols_), Ac(A.rows_, A.cols_); Ac = A; std::complex alpha = 1.0, beta = 0.0; cgemm_(&Trans[0], &Trans[0], &Ac.rows_, &B.cols_, &Ac.cols_, &alpha, Ac.mat_, &Ac.LD_, B.mat_, &B.LD_, &beta, C.mat_, &C.LD_); // cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, Ac.rows_, B.cols_, // Ac.cols_, &alpha, Ac.mat_, Ac.LD_, B.mat_, B.LD_, &beta, C.mat_, C.LD_); return C; } inline matrix> operator*(const matrix &A, const matrix> &B) { // overloads A*B for complex matricies and uses the blas zgemm routine // cblas_zgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix> C(A.rows_, B.cols_), Ac(A.rows_, A.cols_); Ac = A; std::complex alpha = 1.0, beta = 0.0; zgemm_(&Trans[0], &Trans[0], &Ac.rows_, &B.cols_, &Ac.cols_, &alpha, Ac.mat_, &Ac.LD_, B.mat_, &B.LD_, &beta, C.mat_, &C.LD_); // cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, Ac.rows_, B.cols_, // Ac.cols_, &alpha, Ac.mat_, Ac.LD_, B.mat_, B.LD_, &beta, C.mat_, C.LD_); return C; } inline matrix> operator*(const matrix> &A, const matrix &B) { // overloads A*B for complex matricies and uses the blas zgemm routine // cblas_zgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix> C(A.rows_, B.cols_), Bc(B.rows_, B.cols_); Bc = B; std::complex alpha = 1.0, beta = 0.0; cgemm_(&Trans[0], &Trans[0], &A.rows_, &Bc.cols_, &A.cols_, &alpha, A.mat_, &A.LD_, Bc.mat_, &Bc.LD_, &beta, C.mat_, &C.LD_); // cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, A.rows_, Bc.cols_, // A.cols_, &alpha, A.mat_, A.LD_, Bc.mat_, Bc.LD_, &beta, C.mat_, C.LD_); return C; } inline matrix> operator*(const matrix> &A, const matrix &B) { // overloads A*B for complex matricies and uses the blas zgemm routine // cblas_zgemm(CblasXMajor,op,op,N,M,K,alpha,A,LDA,B,LDB,beta,C,LDC) // C-> alpha*op(A)*op(B) +beta C matrix> C(A.rows_, B.cols_), Bc(B.rows_, B.cols_); Bc = B; std::complex alpha = 1.0, beta = 0.0; zgemm_(&Trans[0], &Trans[0], &A.rows_, &Bc.cols_, &A.cols_, &alpha, A.mat_, &A.LD_, Bc.mat_, &Bc.LD_, &beta, C.mat_, &C.LD_); // cblas_zgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, A.rows_, Bc.cols_, // A.cols_, &alpha, A.mat_, A.LD_, Bc.mat_, Bc.LD_, &beta, C.mat_, C.LD_); return C; } // Single-Precision Real inline std::vector operator*(const matrix &A, const std::vector &x) { // overload A*v for complex matrixies and will used a blas function std::vector y(A.rows_); float alpha = 1.0, beta = 0.0; const size_t incx = 1, incy = 1; sgemv_(&Trans[0], &A.rows_, &A.cols_, &alpha, A.mat_, &A.LD_, x.data(), &incx, &beta, y.data(), &incy); return y; } // Double-Precision Real inline std::vector operator*(const matrix &A, const std::vector &x) { // overload A*v for complex matrixies and will used a blas function std::vector y(A.rows_); double alpha = 1.0, beta = 0.0; const size_t incx = 1, incy = 1; dgemv_(&Trans[0], &A.rows_, &A.cols_, &alpha, A.mat_, &A.LD_, x.data(), &incx, &beta, y.data(), &incy); return y; } // Single-Precision Complex inline std::vector> operator*(const matrix> &A, const std::vector> &x) { // overload A*v for complex matrixies and will used a blas function std::vector> y(A.rows_); std::complex alpha = 1.0, beta = 0.0; const size_t incx = 1, incy = 1; cgemv_(&Trans[0], &A.rows_, &A.cols_, &alpha, A.mat_, &A.LD_, x.data(), &incx, &beta, y.data(), &incy); return y; } // Double-Precision Complex inline std::vector> operator*(const matrix> &A, const std::vector> &x) { // overload A*v for complex matrixies and will used a blas function std::vector> y(A.rows_); std::complex alpha = 1.0, beta = 0.0; const size_t incx = 1, incy = 1; zgemv_(&Trans[0], &A.rows_, &A.cols_, &alpha, A.mat_, &A.LD_, x.data(), &incx, &beta, y.data(), &incy); return y; } //------------------------------------------------------------------------------ // end _matrix_h_ //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/operations.hpp000077500000000000000000001004541362723322000212540ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_operations_hpp_ #define _aer_framework_operations_hpp_ #include #include #include #include #include #include "framework/types.hpp" #include "framework/json.hpp" #include "framework/utils.hpp" namespace AER { namespace Operations { // Comparisons enum class used for Boolean function operation. // these are used to compare two hexadecimal strings and return a bool // for now we only have one comparison Equal, but others will be added enum class RegComparison {Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual}; // Enum class for operation types enum class OpType { gate, measure, reset, bfunc, barrier, snapshot, matrix, multiplexer, kraus, superop, roerror, noise_switch, initialize }; inline std::ostream& operator<<(std::ostream& stream, const OpType& type) { switch (type) { case OpType::gate: stream << "gate"; break; case OpType::measure: stream << "measure"; break; case OpType::reset: stream << "reset"; break; case OpType::bfunc: stream << "bfunc"; break; case OpType::barrier: stream << "barrier"; break; case OpType::snapshot: stream << "snapshot"; break; case OpType::matrix: stream << "matrix"; break; case OpType::multiplexer: stream << "multiplexer"; break; case OpType::kraus: stream << "kraus"; break; case OpType::superop: stream << "superop"; break; case OpType::roerror: stream << "roerror"; break; case OpType::noise_switch: stream << "noise_switch"; break; case OpType::initialize: stream << "initialize"; break; default: stream << "unknown"; } return stream; } //------------------------------------------------------------------------------ // Op Class //------------------------------------------------------------------------------ struct Op { // General Operations OpType type; // operation type identifier std::string name; // operation name reg_t qubits; // qubits operation acts on std::vector regs; // list of qubits for matrixes std::vector params; // real or complex params for gates std::vector string_params; // used or snapshot label, and boolean functions // Conditional Operations bool conditional = false; // is gate conditional gate uint_t conditional_reg; // (opt) the (single) register location to look up for conditional RegComparison bfunc; // (opt) boolean function relation // DEPRECATED: Old style conditionals (remove in 0.3) bool old_conditional = false; // is gate old style conditional gate std::string old_conditional_mask; // hex string for conditional mask std::string old_conditional_val; // hex string for conditional value // Measurement reg_t memory; // (opt) register operation it acts on (measure) reg_t registers; // (opt) register locations it acts on (measure, conditional) // Mat and Kraus std::vector mats; // Readout error std::vector probs; // Snapshots using pauli_component_t = std::pair; // Pair (coeff, label_string) using matrix_component_t = std::pair>>; // vector of Pair(qubits, matrix), combined with coefficient std::vector params_expval_pauli; std::vector params_expval_matrix; // note that diagonal matrices are stored as // 1 x M row-matrices // Projector vectors are stored as // M x 1 column-matrices }; inline std::ostream& operator<<(std::ostream& s, const Op& op) { s << op.name << "["; bool first = true; for (size_t qubit: op.qubits) { if (!first) s << ","; s << qubit; first = false; } s << "],["; first = true; for (reg_t reg: op.regs) { if (!first) s << ","; s << "["; bool first0 = true; for (size_t qubit: reg) { if (!first0) s << ","; s << qubit; first0 = false; } s << "]"; first = false; } s << "]"; return s; } //========================================================================= // OpSet Class //========================================================================= // This class is used to store type information about a set of operations. class OpSet { private: // Hash function so that we can use an enum class as a std::unordered_set // key on older C++11 compilers like GCC 5. struct EnumClassHash { template size_t operator()(T t) const { return static_cast(t); } }; public: // Alias for set of OpTypes using optypeset_t = std::unordered_set; // Public data members optypeset_t optypes; // A set of op types stringset_t gates; // A set of names for OpType::gates stringset_t snapshots; // set of types for OpType::snapshot OpSet() = default; OpSet(const std::vector &ops) {insert(ops);} //----------------------------------------------------------------------- // Insert operations to the OpSet //----------------------------------------------------------------------- // Add another opset to the current one void insert(const OpSet& opset); // Add additional op to the opset void insert(const Op &op); // Add additional ops to the opset void insert(const std::vector &ops); //----------------------------------------------------------------------- // Check if operations are in the OpSet //----------------------------------------------------------------------- // Return true if an operation is contained in the current OpSet bool contains(const OpType &optype) const; //----------------------------------------------------------------------- // Validate OpSet against sets of allowed operations //----------------------------------------------------------------------- // Return True if opset ops, gates and snapshots are contained in // allowed_ops, allowed_gates, allowed_snapshots bool validate(const optypeset_t &allowed_ops, const stringset_t &allowed_gates, const stringset_t &allowed_snapshots) const; // Return True if opset ops are contained in allowed_ops bool validate_optypes(const optypeset_t &allowed_ops) const; // Return True if opset gates are contained in allowed_gate bool validate_gates(const stringset_t &allowed_gates) const; // Return True if opset snapshots are contained in allowed_snapshots bool validate_snapshots(const stringset_t &allowed_snapshots) const; //----------------------------------------------------------------------- // Return OpSet operations invalid for a set of allowed operations //----------------------------------------------------------------------- // Return a set of all invalid circuit op names optypeset_t invalid_optypes(const optypeset_t &allowed_ops) const; // Return a set of all invalid circuit op names stringset_t invalid_gates(const stringset_t &allowed_gates) const; // Return a set of all invalid circuit op names stringset_t invalid_snapshots(const stringset_t &allowed_snapshots) const; }; inline std::ostream& operator<<(std::ostream& s, const OpSet& opset) { s << "optypes={"; bool first = true; for (OpType optype: opset.optypes) { if (first) first = false; else s << ","; s << optype; } s << "}, gates={"; first = true; for (const std::string& gate: opset.gates) { if (first) first = false; else s << ","; s << gate; } s << "}, snapshots={"; first = true; for (const std::string& snapshot: opset.snapshots) { if (first) first = false; else s << ","; s << snapshot; } s << "}"; return s; } //------------------------------------------------------------------------------ // OpSet class methods //------------------------------------------------------------------------------ void OpSet::insert(const Op &op) { optypes.insert(op.type); if (op.type == OpType::gate) gates.insert(op.name); if (op.type == OpType::snapshot) snapshots.insert(op.name); } void OpSet::insert(const std::vector &ops) { for (const auto &op : ops) insert(op); } void OpSet::insert(const OpSet &opset) { optypes.insert(opset.optypes.begin(), opset.optypes.end()); gates.insert(opset.gates.begin(), opset.gates.end()); snapshots.insert(opset.snapshots.begin(), opset.snapshots.end()); } bool OpSet::contains(const OpType &optype) const { if (optypes.find(optype) == optypes.end()) return false; return true; } bool OpSet::validate(const optypeset_t &allowed_ops, const stringset_t &allowed_gates, const stringset_t &allowed_snapshots) const { return validate_optypes(allowed_ops) && validate_gates(allowed_gates) && validate_snapshots(allowed_snapshots); } bool OpSet::validate_optypes(const optypeset_t &allowed_ops) const { for (const auto &op : optypes) { if (allowed_ops.find(op) == allowed_ops.end()) return false; } return true; } bool OpSet::validate_gates(const stringset_t &allowed_gates) const { for (const auto &gate : gates) { if (allowed_gates.find(gate) == allowed_gates.end()) return false; } return true; } bool OpSet::validate_snapshots(const stringset_t &allowed_snapshots) const { for (const auto &snap : snapshots) { if (allowed_snapshots.find(snap) == allowed_snapshots.end()) return false; } return true; } // Return a set of all invalid circuit op names OpSet::optypeset_t OpSet::invalid_optypes(const optypeset_t &allowed_ops) const { optypeset_t invalid; for (const auto &op : optypes) { if (allowed_ops.find(op) == allowed_ops.end()) invalid.insert(op); } return invalid; } stringset_t OpSet::invalid_gates(const stringset_t &allowed_gates) const { stringset_t invalid; for (const auto &gate : gates) { if (allowed_gates.find(gate) == allowed_gates.end()) invalid.insert(gate); } return invalid; } stringset_t OpSet::invalid_snapshots(const stringset_t &allowed_snapshots) const { stringset_t invalid; for (const auto &snap : snapshots) { if (allowed_snapshots.find(snap) == allowed_snapshots.end()) invalid.insert(snap); } return invalid; } //------------------------------------------------------------------------------ // Error Checking //------------------------------------------------------------------------------ // Raise an exception if name string is empty inline void check_empty_name(const Op &op) { if (op.name.empty()) throw std::invalid_argument(R"(Invalid qobj instruction ("name" is empty).)"); } // Raise an exception if qubits list is empty inline void check_empty_qubits(const Op &op) { if (op.qubits.empty()) throw std::invalid_argument(R"(Invalid qobj ")" + op.name + R"(" instruction ("qubits" is empty).)"); } // Raise an exception if params is empty inline void check_empty_params(const Op &op) { if (op.params.empty()) throw std::invalid_argument(R"(Invalid qobj ")" + op.name + R"(" instruction ("params" is empty).)"); } // Raise an exception if params is empty inline void check_length_params(const Op &op, const size_t size) { if (op.params.size() != size) throw std::invalid_argument(R"(Invalid qobj ")" + op.name + R"(" instruction ("params" is incorrect length).)"); } // Raise an exception if qubits list contains duplications inline void check_duplicate_qubits(const Op &op) { auto cpy = op.qubits; std::unique(cpy.begin(), cpy.end()); if (cpy != op.qubits) throw std::invalid_argument(R"(Invalid qobj ")" + op.name + R"(" instruction ("qubits" are not unique).)"); } //------------------------------------------------------------------------------ // Generator functions //------------------------------------------------------------------------------ inline Op make_unitary(const reg_t &qubits, const cmatrix_t &mat, std::string label = "") { Op op; op.type = OpType::matrix; op.name = "unitary"; op.qubits = qubits; op.mats = {mat}; if (label != "") op.string_params = {label}; return op; } inline Op make_superop(const reg_t &qubits, const cmatrix_t &mat) { Op op; op.type = OpType::superop; op.name = "superop"; op.qubits = qubits; op.mats = {mat}; return op; } template // real or complex numeric type inline Op make_u1(uint_t qubit, T lam) { Op op; op.type = OpType::gate; op.name = "u1"; op.qubits = {qubit}; op.params = {lam}; op.string_params = {op.name}; return op; } template // real or complex numeric type inline Op make_u2(uint_t qubit, T phi, T lam) { Op op; op.type = OpType::gate; op.name = "u2"; op.qubits = {qubit}; op.params = {phi, lam}; op.string_params = {op.name}; return op; } template // real or complex numeric type inline Op make_u3(uint_t qubit, T theta, T phi, T lam) { Op op; op.type = OpType::gate; op.name = "u3"; op.qubits = {qubit}; op.params = {theta, phi, lam}; op.string_params = {op.name}; return op; } inline Op make_reset(const reg_t & qubits, uint_t state = 0) { Op op; op.type = OpType::reset; op.name = "reset"; op.qubits = qubits; return op; } inline Op make_multiplexer(const reg_t &qubits, const std::vector &mats, std::string label = "") { // Check matrices are N-qubit auto dim = mats[0].GetRows(); auto num_targets = static_cast(std::log2(dim)); if (1ULL << num_targets != dim) { throw std::invalid_argument("invalid multiplexer matrix dimension."); } // Check number of matrix compents is power of 2. size_t num_mats = mats.size(); auto num_controls = static_cast(std::log2(num_mats)); if (1ULL << num_controls != num_mats) { throw std::invalid_argument("invalid number of multiplexer matrices."); } // Check number of targets and controls matches qubits if (num_controls + num_targets != qubits.size()) { throw std::invalid_argument("multiplexer qubits don't match parameters."); } // Check each matrix component is unitary and same size for (const auto &mat : mats) { if (!Utils::is_unitary(mat, 1e-7)) throw std::invalid_argument("multiplexer matrix is not unitary."); if (mat.GetRows() != dim) { throw std::invalid_argument("multiplexer matrices are different size."); } } // Get lists of controls and targets reg_t controls(num_controls), targets(num_targets); std::copy_n(qubits.begin(), num_controls, controls.begin()); std::copy_n(qubits.begin() + num_controls, num_targets, targets.begin()); // Construct the Op Op op; op.type = OpType::multiplexer; op.name = "multiplexer"; op.qubits = qubits; op.mats = mats; op.regs = std::vector({controls, targets}); if (label != "") op.string_params = {label}; // Validate qubits are unique. check_empty_qubits(op); check_duplicate_qubits(op); return op; } inline Op make_kraus(const reg_t &qubits, const std::vector &mats) { Op op; op.type = OpType::kraus; op.name = "kraus"; op.qubits = qubits; op.mats = mats; return op; } inline Op make_roerror(const reg_t &memory, const std::vector &probs) { Op op; op.type = OpType::roerror; op.name = "roerror"; op.memory = memory; op.probs = probs; return op; } //------------------------------------------------------------------------------ // JSON conversion //------------------------------------------------------------------------------ // Main JSON deserialization functions Op json_to_op(const json_t &js); // Patial TODO json_t op_to_json(const Op &op); // Patial TODO inline void from_json(const json_t &js, Op &op) {op = json_to_op(js);} inline void to_json(json_t &js, const Op &op) { js = op_to_json(op);} // Standard operations Op json_to_op_gate(const json_t &js); Op json_to_op_barrier(const json_t &js); Op json_to_op_measure(const json_t &js); Op json_to_op_reset(const json_t &js); Op json_to_op_bfunc(const json_t &js); Op json_to_op_initialize(const json_t &js); // Snapshots Op json_to_op_snapshot(const json_t &js); Op json_to_op_snapshot_default(const json_t &js); Op json_to_op_snapshot_matrix(const json_t &js); Op json_to_op_snapshot_pauli(const json_t &js); // Matrices Op json_to_op_unitary(const json_t &js); Op json_to_op_superop(const json_t &js); Op json_to_op_multiplexer(const json_t &js); Op json_to_op_kraus(const json_t &js); Op json_to_op_noise_switch(const json_t &js); // Classical bits Op json_to_op_roerror(const json_t &js); // Optional instruction parameters enum class Allowed {Yes, No}; void add_condtional(const Allowed val, Op& op, const json_t &js); //------------------------------------------------------------------------------ // Implementation: JSON deserialization //------------------------------------------------------------------------------ // TODO: convert if-else to switch Op json_to_op(const json_t &js) { // load operation identifier std::string name; JSON::get_value(name, "name", js); // Barrier if (name == "barrier") return json_to_op_barrier(js); // Measure & Reset if (name == "measure") return json_to_op_measure(js); if (name == "reset") return json_to_op_reset(js); if (name == "initialize") return json_to_op_initialize(js); // Arbitrary matrix gates if (name == "unitary") return json_to_op_unitary(js); if (name == "superop") return json_to_op_superop(js); // Snapshot if (name == "snapshot") return json_to_op_snapshot(js); // Bit functions if (name == "bfunc") return json_to_op_bfunc(js); // Noise functions if (name == "noise_switch") return json_to_op_noise_switch(js); if (name == "multiplexer") return json_to_op_multiplexer(js); if (name == "kraus") return json_to_op_kraus(js); if (name == "roerror") return json_to_op_roerror(js); // Default assume gate return json_to_op_gate(js); } json_t op_to_json(const Op &op) { json_t ret; ret["name"] = op.name; if (!op.qubits.empty()) ret["qubits"] = op.qubits; if (!op.regs.empty()) ret["regs"] = op.regs; if (!op.params.empty()) ret["params"] = op.params; if (op.conditional) ret["conditional"] = op.conditional_reg; if (!op.memory.empty()) ret["memory"] = op.memory; if (!op.registers.empty()) ret["register"] = op.registers; if (!op.mats.empty()) ret["mats"] = op.mats; return ret; } //------------------------------------------------------------------------------ // Implementation: Gates, measure, reset deserialization //------------------------------------------------------------------------------ void add_condtional(const Allowed allowed, Op& op, const json_t &js) { // Check conditional if (JSON::check_key("conditional", js)) { // If instruction isn't allow to be conditional throw an exception if (allowed == Allowed::No) { throw std::invalid_argument("Invalid instruction: \"" + op.name + "\" cannot be conditional."); } // If instruction is allowed to be conditional add parameters if (js["conditional"].is_number()) { // New style conditional op.conditional_reg = js["conditional"]; op.conditional = true; } else { // DEPRECATED: old style conditional (remove in 0.3) JSON::get_value(op.old_conditional_mask, "mask", js["conditional"]); JSON::get_value(op.old_conditional_val, "val", js["conditional"]); op.old_conditional = true; } } } Op json_to_op_gate(const json_t &js) { Op op; op.type = OpType::gate; JSON::get_value(op.name, "name", js); JSON::get_value(op.qubits, "qubits", js); JSON::get_value(op.params, "params", js); // Check for optional label // If label is not specified record the gate name as the label std::string label; JSON::get_value(label, "label", js); if (label != "") op.string_params = {label}; else op.string_params = {op.name}; // Conditional add_condtional(Allowed::Yes, op, js); // Validation check_empty_name(op); check_empty_qubits(op); check_duplicate_qubits(op); if (op.name == "u1") check_length_params(op, 1); else if (op.name == "u2") check_length_params(op, 2); else if (op.name == "u3") check_length_params(op, 3); return op; } Op json_to_op_barrier(const json_t &js) { Op op; op.type = OpType::barrier; op.name = "barrier"; JSON::get_value(op.qubits, "qubits", js); // Check conditional add_condtional(Allowed::No, op, js); return op; } Op json_to_op_measure(const json_t &js) { Op op; op.type = OpType::measure; op.name = "measure"; JSON::get_value(op.qubits, "qubits", js); JSON::get_value(op.memory, "memory", js); JSON::get_value(op.registers, "register", js); // Conditional add_condtional(Allowed::No, op, js); // Validation check_empty_qubits(op); check_duplicate_qubits(op); if (op.memory.empty() == false && op.memory.size() != op.qubits.size()) { throw std::invalid_argument(R"(Invalid measure operation: "memory" and "qubits" are different lengths.)"); } if (op.registers.empty() == false && op.registers.size() != op.qubits.size()) { throw std::invalid_argument(R"(Invalid measure operation: "register" and "qubits" are different lengths.)"); } return op; } Op json_to_op_reset(const json_t &js) { Op op; op.type = OpType::reset; op.name = "reset"; JSON::get_value(op.qubits, "qubits", js); // Conditional add_condtional(Allowed::No, op, js); // Validation check_empty_qubits(op); check_duplicate_qubits(op); return op; } Op json_to_op_initialize(const json_t &js) { Op op; op.type = OpType::initialize; op.name = "initialize"; JSON::get_value(op.qubits, "qubits", js); JSON::get_value(op.params, "params", js); // Conditional add_condtional(Allowed::No, op, js); // Validation check_empty_qubits(op); check_duplicate_qubits(op); check_length_params(op, 1ULL << op.qubits.size()); return op; } //------------------------------------------------------------------------------ // Implementation: Boolean Functions //------------------------------------------------------------------------------ Op json_to_op_bfunc(const json_t &js) { Op op; op.type = OpType::bfunc; op.name = "bfunc"; op.string_params.resize(2); std::string relation; JSON::get_value(op.string_params[0], "mask", js); // mask hexadecimal string JSON::get_value(op.string_params[1], "val", js); // value hexadecimal string JSON::get_value(relation, "relation", js); // relation string // Load single register / memory bit for storing result uint_t tmp; if (JSON::get_value(tmp, "register", js)) { op.registers.push_back(tmp); } if (JSON::get_value(tmp, "memory", js)) { op.memory.push_back(tmp); } // Format hex strings Utils::format_hex_inplace(op.string_params[0]); Utils::format_hex_inplace(op.string_params[1]); const stringmap_t comp_table({ {"==", RegComparison::Equal}, {"!=", RegComparison::NotEqual}, {"<", RegComparison::Less}, {"<=", RegComparison::LessEqual}, {">", RegComparison::Greater}, {">=", RegComparison::GreaterEqual}, }); auto it = comp_table.find(relation); if (it == comp_table.end()) { std::stringstream msg; msg << "Invalid bfunc relation string :\"" << it->first << "\"." << std::endl; throw std::invalid_argument(msg.str()); } else { op.bfunc = it->second; } // Conditional add_condtional(Allowed::No, op, js); // Validation if (op.registers.empty()) { throw std::invalid_argument("Invalid measure operation: \"register\" is empty."); } return op; } Op json_to_op_roerror(const json_t &js) { Op op; op.type = OpType::roerror; op.name = "roerror"; JSON::get_value(op.memory, "memory", js); JSON::get_value(op.registers, "register", js); JSON::get_value(op.probs, "probabilities", js); // DEPRECATED: Remove in 0.4 JSON::get_value(op.probs, "params", js); // Conditional add_condtional(Allowed::No, op, js); return op; } //------------------------------------------------------------------------------ // Implementation: Matrix and Kraus deserialization //------------------------------------------------------------------------------ Op json_to_op_unitary(const json_t &js) { Op op; op.type = OpType::matrix; op.name = "unitary"; JSON::get_value(op.qubits, "qubits", js); JSON::get_value(op.mats, "params", js); // Validation check_empty_qubits(op); check_duplicate_qubits(op); if (op.mats.size() != 1) { throw std::invalid_argument("\"unitary\" params must be a single matrix."); } for (const auto mat : op.mats) { if (!Utils::is_unitary(mat, 1e-7)) { throw std::invalid_argument("\"unitary\" matrix is not unitary."); } } // Check for a label std::string label; JSON::get_value(label, "label", js); op.string_params.push_back(label); // Conditional add_condtional(Allowed::Yes, op, js); return op; } Op json_to_op_superop(const json_t &js) { // Warning: we don't check superoperator is valid! Op op; op.type = OpType::superop; op.name = "superop"; JSON::get_value(op.qubits, "qubits", js); JSON::get_value(op.mats, "params", js); // Check conditional add_condtional(Allowed::Yes, op, js); // Validation check_empty_qubits(op); check_duplicate_qubits(op); if (op.mats.size() != 1) { throw std::invalid_argument("\"superop\" params must be a single matrix."); } return op; } Op json_to_op_multiplexer(const json_t &js) { // Parse parameters reg_t qubits; std::vector mats; std::string label; JSON::get_value(qubits, "qubits", js); JSON::get_value(mats, "params", js); JSON::get_value(label, "label", js); // Construct op auto op = make_multiplexer(qubits, mats, label); // Conditional add_condtional(Allowed::Yes, op, js); return op; } Op json_to_op_kraus(const json_t &js) { Op op; op.type = OpType::kraus; op.name = "kraus"; JSON::get_value(op.qubits, "qubits", js); JSON::get_value(op.mats, "params", js); // Validation check_empty_qubits(op); check_duplicate_qubits(op); // Conditional add_condtional(Allowed::Yes, op, js); return op; } Op json_to_op_noise_switch(const json_t &js) { Op op; op.type = OpType::noise_switch; op.name = "noise_switch"; JSON::get_value(op.params, "params", js); // Conditional add_condtional(Allowed::No, op, js); return op; } //------------------------------------------------------------------------------ // Implementation: Snapshot deserialization //------------------------------------------------------------------------------ Op json_to_op_snapshot(const json_t &js) { std::string snapshot_type; JSON::get_value(snapshot_type, "snapshot_type", js); // LEGACY: to remove in 0.3 JSON::get_value(snapshot_type, "type", js); if (snapshot_type.find("expectation_value_pauli") != std::string::npos) return json_to_op_snapshot_pauli(js); if (snapshot_type.find("expectation_value_matrix") != std::string::npos) return json_to_op_snapshot_matrix(js); // Default snapshot: has "type", "label", "qubits" auto op = json_to_op_snapshot_default(js); // Conditional add_condtional(Allowed::No, op, js); return op; } Op json_to_op_snapshot_default(const json_t &js) { Op op; op.type = OpType::snapshot; JSON::get_value(op.name, "type", js); // LEGACY: to remove in 0.3 JSON::get_value(op.name, "snapshot_type", js); // If missing use "default" for label op.string_params.emplace_back("default"); JSON::get_value(op.string_params[0], "label", js); // Add optional qubits field JSON::get_value(op.qubits, "qubits", js); // If qubits is not empty, check for duplicates check_duplicate_qubits(op); return op; } Op json_to_op_snapshot_pauli(const json_t &js) { // Load default snapshot parameters Op op = json_to_op_snapshot_default(js); // Check qubits are valid check_empty_qubits(op); check_duplicate_qubits(op); // Parse Pauli operator components const auto threshold = 1e-10; // drop small components // Get components if (JSON::check_key("params", js) && js["params"].is_array()) { for (const auto &comp : js["params"]) { // Check component is length-2 array if (!comp.is_array() || comp.size() != 2) throw std::invalid_argument("Invalid Pauli expval snapshot (param component " + comp.dump() + " invalid)."); // Get complex coefficient complex_t coeff = comp[0]; // If coefficient is above threshold, get the Pauli operator string // This string may contain I, X, Y, Z // qubits are stored as a list where position is qubit number: // eq op.qubits = [a, b, c], a is qubit-0, b is qubit-1, c is qubit-2 // Pauli string labels are stored in little-endian ordering: // eg label = "CBA", A is the Pauli for qubit-0, B for qubit-1, C for qubit-2 if (std::abs(coeff) > threshold) { std::string pauli = comp[1]; if (pauli.size() != op.qubits.size()) { throw std::invalid_argument(std::string("Invalid Pauli expectation value snapshot ") + "(Pauli label does not match qubit number.)."); } // make tuple and add to components op.params_expval_pauli.emplace_back(coeff, pauli); } // end if > threshold } // end component loop } else { throw std::invalid_argument("Invalid Pauli snapshot \"params\"."); } return op; } Op json_to_op_snapshot_matrix(const json_t &js) { // Load default snapshot parameters Op op = json_to_op_snapshot_default(js); const auto threshold = 1e-10; // drop small components // Get matrix operator components // TODO: fix repeated throw string if (JSON::check_key("params", js) && js["params"].is_array()) { for (const auto &comp : js["params"]) { // Check component is length-2 array if (!comp.is_array() || comp.size() != 2) { throw std::invalid_argument("Invalid matrix expval snapshot (param component " + comp.dump() + " invalid)."); } // Get complex coefficient complex_t coeff = comp[0]; std::vector> mats; if (std::abs(coeff) > threshold) { if (!comp[1].is_array()) { throw std::invalid_argument("Invalid matrix expval snapshot (param component " + comp.dump() + " invalid)."); } for (const auto &subcomp : comp[1]) { if (!subcomp.is_array() || subcomp.size() != 2) { throw std::invalid_argument("Invalid matrix expval snapshot (param component " + comp.dump() + " invalid)."); } reg_t comp_qubits = subcomp[0]; cmatrix_t comp_matrix = subcomp[1]; // Check qubits are ok // TODO: check that qubits are in range from 0 to Num of Qubits - 1 for instr std::unordered_set unique = {comp_qubits.begin(), comp_qubits.end()}; if (unique.size() != comp_qubits.size()) { throw std::invalid_argument("Invalid matrix expval snapshot (param component " + comp.dump() + " invalid)."); } mats.emplace_back(comp_qubits, comp_matrix); } op.params_expval_matrix.emplace_back(coeff, mats); } } // end component loop } else { throw std::invalid_argument(std::string("Invalid matrix expectation value snapshot ") + "(\"params\" field missing)."); } return op; } //------------------------------------------------------------------------------ } // end namespace Operations //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/pybind_json.hpp000077500000000000000000000420551362723322000214110ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_pybind_json_hpp_ #define _aer_framework_pybind_json_hpp_ #if defined(_MSC_VER) && _MSC_VER < 1500 // VC++ 8.0 and below #define snprintf _snprintf #else #undef snprintf #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "framework/json.hpp" namespace py = pybind11; namespace nl = nlohmann; using namespace pybind11::literals; using json_t = nlohmann::json; #include "framework/results/result.hpp" #include "framework/results/data/average_data.hpp" namespace std { /** * Convert a python object to a json. * @param js a json_t object to contain converted type. * @param o is a python object to convert. */ void to_json(json_t &js, const py::handle &o); /** * Create a python object from a json * @param js a json_t object * @param o is a reference to an existing (empty) python object */ void from_json(const json_t &js, py::object &o); } // end namespace std. //------------------------------------------------------------------------------ // Python->JSON Conversion //------------------------------------------------------------------------------ namespace JSON { /** * Convert a numpy array to a json object * @param arr is a numpy array * @returns a json list (potentially of lists) */ template json_t numpy_to_json(py::array_t arr); /** * Convert a 1-d numpy array to a json object * @param arr is a numpy array * @returns a json list (potentially of lists) */ template json_t numpy_to_json_1d(py::array_t arr); /** * Convert a 2-d numpy array to a json object * @param arr is a numpy array * @returns a json list (potentially of lists) */ template json_t numpy_to_json_2d(py::array_t arr); /** * Convert a 3-d numpy array to a json object * @param arr is a numpy array * @returns a json list (potentially of lists) */ template json_t numpy_to_json_3d(py::array_t arr); } //end namespace JSON //------------------------------------------------------------------------------ // Aer C++ -> Python Conversion //------------------------------------------------------------------------------ namespace AerToPy { /** * Convert a Matrix to a python object * @param mat is a Matrix * @returns a python object (py::list of lists) */ template py::object from_matrix(const matrix &mat); /** * Convert a AverageData to a python object * @param avg_data is an AverageData * @returns a py::dict */ template py::dict from_avg_data(const AER::AverageData &avg_data); /** * Convert a AverageSnapshot to a python object * @param avg_snap is an AverageSnapshot * @returns a py::dict */ template py::object from_avg_snap(const AER::AverageSnapshot &avg_snap); /** * Convert an ExperimentData to a python object * @param result is an ExperimentData * @returns a py::dict */ py::object from_exp_data(const AER::ExperimentData &result); /** * Convert an ExperimentResult to a python object * @param result is an ExperimentResult * @returns a py::dict */ py::object from_exp_result(const AER::ExperimentResult &result); /** * Convert a Result to a python object * @param result is a Result * @returns a py::dict */ py::object from_result(const AER::Result &result); } //end namespace AerToPy /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // JSON Conversion //------------------------------------------------------------------------------ template json_t JSON::numpy_to_json_1d(py::array_t arr) { py::buffer_info buf = arr.request(); if (buf.ndim != 1) { throw std::runtime_error("Number of dims must be 1"); } T *ptr = (T *) buf.ptr; size_t D0 = buf.shape[0]; std::vector tbr; // to be returned for (size_t n0 = 0; n0 < D0; n0++) tbr.push_back(ptr[n0]); return std::move(tbr); } template json_t JSON::numpy_to_json_2d(py::array_t arr) { py::buffer_info buf = arr.request(); if (buf.ndim != 2) { throw std::runtime_error("Number of dims must be 2"); } T *ptr = (T *) buf.ptr; size_t D0 = buf.shape[0]; size_t D1 = buf.shape[1]; std::vector > tbr; // to be returned for (size_t n0 = 0; n0 < D0; n0++) { std::vector tbr1; for (size_t n1 = 0; n1 < D1; n1++) { tbr1.push_back(ptr[n1 + D1*n0]); } tbr.push_back(tbr1); } return std::move(tbr); } template json_t JSON::numpy_to_json_3d(py::array_t arr) { py::buffer_info buf = arr.request(); if (buf.ndim != 3) { throw std::runtime_error("Number of dims must be 3"); } T *ptr = (T *) buf.ptr; size_t D0 = buf.shape[0]; size_t D1 = buf.shape[1]; size_t D2 = buf.shape[2]; // to be returned std::vector > > tbr; for (size_t n0 = 0; n0 < D0; n0++) { std::vector > tbr1; for (size_t n1 = 0; n1 < D1; n1++) { std::vector tbr2; for (size_t n2 = 0; n2 < D2; n2++) { tbr2.push_back(ptr[n2 + D2*(n1 + D1*n0)]); } tbr1.push_back(tbr2); } tbr.push_back(tbr1); } return std::move(tbr); } template json_t JSON::numpy_to_json(py::array_t arr) { py::buffer_info buf = arr.request(); //std::cout << "buff dim: " << buf.ndim << std::endl; if (buf.ndim == 1) { return JSON::numpy_to_json_1d(arr); } else if (buf.ndim == 2) { return JSON::numpy_to_json_2d(arr); } else if (buf.ndim == 3) { return JSON::numpy_to_json_3d(arr); } else { throw std::runtime_error("Invalid number of dimensions!"); } json_t tbr; return tbr; } void std::to_json(json_t &js, const py::handle &obj) { if (py::isinstance(obj)) { js = obj.cast(); //js = obj.cast(); } else if (py::isinstance(obj)) { js = obj.cast(); } else if (py::isinstance(obj)) { js = obj.cast(); } else if (py::isinstance(obj)) { js = obj.cast(); } else if (py::isinstance(obj) || py::isinstance(obj)) { js = nl::json::array(); for (py::handle value: obj) { js.push_back(value); } } else if (py::isinstance(obj)) { for (auto item : py::cast(obj)) { js[item.first.cast()] = item.second; } } else if (py::isinstance >(obj)) { js = JSON::numpy_to_json(obj.cast >()); } else if (py::isinstance > >(obj)) { js = JSON::numpy_to_json(obj.cast, py::array::c_style> >()); } else if (std::string(py::str(obj.get_type())) == "") { auto tmp = obj.cast>(); js.push_back(tmp.real()); js.push_back(tmp.imag()); } else if (obj.is_none()) { return; } else { throw std::runtime_error("to_json not implemented for this type of object: " + obj.cast()); } } void std::from_json(const json_t &js, py::object &o) { if (js.is_boolean()) { o = py::bool_(js.get()); } else if (js.is_number()) { if (js.is_number_float()) { o = py::float_(js.get()); } else if (js.is_number_unsigned()) { o = py::int_(js.get()); } else { o = py::int_(js.get()); } } else if (js.is_string()) { o = py::str(js.get()); } else if (js.is_array()) { std::vector obj(js.size()); for (auto i = 0; i < js.size(); i++) { py::object tmp; from_json(js[i], tmp); obj[i] = tmp; } o = py::cast(obj); } else if (js.is_object()) { py::dict obj; for (json_t::const_iterator it = js.cbegin(); it != js.cend(); ++it) { py::object tmp; from_json(it.value(), tmp); obj[py::str(it.key())] = tmp; } o = std::move(obj); } else if (js.is_null()) { o = py::none(); } else { throw std::runtime_error("from_json not implemented for this json::type: " + js.dump()); } } //------------------------------------------------------------------------------ //============================================================================ // Pybind Conversion for Simulator types //============================================================================ template py::object AerToPy::from_matrix(const matrix &mat) { // THIS SHOULD RETURN A py::array_t but the author was la... size_t rows = mat.GetRows(); size_t cols = mat.GetColumns(); std::vector > tbr; tbr.reserve(rows); for (size_t r = 0; r < rows; r++) { std::vector mrow; mrow.reserve(cols); for (size_t c = 0; c < cols; c++) mrow.emplace_back(mat(r, c)); tbr.emplace_back(mrow); } return py::cast(tbr); } template py::dict AerToPy::from_avg_data(const AER::AverageData &avg_data) { py::dict d; d["value"] = avg_data.mean(); if (avg_data.has_variance()) { d["variance"] = avg_data.variance(); } return d; } template py::object AerToPy::from_avg_snap(const AER::AverageSnapshot &avg_snap) { py::dict d; for (const auto &outer_pair : avg_snap.data()) { py::list d1; for (const auto &inner_pair : outer_pair.second) { // Store mean and variance for snapshot py::dict datum = AerToPy::from_avg_data(inner_pair.second); // Add memory key if there are classical registers auto memory = inner_pair.first; if ( ! memory.empty()) datum["memory"] = inner_pair.first; // Add to list of output d1.append(datum); } d[outer_pair.first.data()] = d1; } return d; } py::object AerToPy::from_exp_data(const AER::ExperimentData &result) { py::dict pyresult; // Measure data if (result.return_counts_ && ! result.counts_.empty()) pyresult["counts"] = result.counts_; if (result.return_memory_ && ! result.memory_.empty()) pyresult["memory"] = result.memory_; if (result.return_register_ && ! result.register_.empty()) pyresult["register"] = result.register_; // Add additional data for (const auto &pair : result.additional_json_data_) { py::object tmp; from_json(pair.second, tmp); pyresult[pair.first.data()] = tmp; } for (const auto &pair : result.additional_cvector_data_) { pyresult[pair.first.data()] = pair.second; } for (const auto &pair : result.additional_cmatrix_data_) { pyresult[pair.first.data()] = AerToPy::from_matrix(pair.second); } // Snapshot data if (result.return_snapshots_) { py::dict snapshots; // Average snapshots for (const auto &pair : result.average_json_snapshots_) { py::object tmp; from_json(pair.second, tmp); snapshots[pair.first.data()] = tmp; } for (auto &pair : result.average_complex_snapshots_) { snapshots[pair.first.data()] = AerToPy::from_avg_snap(pair.second); } for (auto &pair : result.average_cvector_snapshots_) { snapshots[pair.first.data()] = AerToPy::from_avg_snap(pair.second); } for (auto &pair : result.average_cmatrix_snapshots_) { snapshots[pair.first.data()] = AerToPy::from_avg_snap(pair.second); } for (auto &pair : result.average_cmap_snapshots_) { snapshots[pair.first.data()] = AerToPy::from_avg_snap(pair.second); } for (auto &pair : result.average_rmap_snapshots_) { snapshots[pair.first.data()] = AerToPy::from_avg_snap(pair.second); } // Singleshot snapshot data // Note these will override the average snapshots // if they share the same type string for (const auto &pair : result.pershot_json_snapshots_) { py::object tmp; from_json(pair.second, tmp); snapshots[pair.first.data()] = tmp; } for (auto &pair : result.pershot_complex_snapshots_) { py::dict d; // string PershotData for (auto &per_pair : pair.second.data()) d[per_pair.first.data()] = per_pair.second.data(); snapshots[pair.first.data()] = d; } for (auto &pair : result.pershot_cvector_snapshots_) { py::dict d; // string PershotData for (auto &per_pair : pair.second.data()) d[per_pair.first.data()] = per_pair.second.data(); snapshots[pair.first.data()] = d; } for (auto &pair : result.pershot_cmatrix_snapshots_) { py::dict d; // string PershotData for (auto &per_pair : pair.second.data()) d[per_pair.first.data()] = per_pair.second.data(); snapshots[pair.first.data()] = d; } for (auto &pair : result.pershot_cmap_snapshots_) { py::dict d; // string PershotData for (auto &per_pair : pair.second.data()) d[per_pair.first.data()] = per_pair.second.data(); snapshots[pair.first.data()] = d; } for (auto &pair : result.pershot_rmap_snapshots_) { py::dict d; // string PershotData for (auto &per_pair : pair.second.data()) d[per_pair.first.data()] = per_pair.second.data(); snapshots[pair.first.data()] = d; } if ( py::len(snapshots) != 0 ) pyresult["snapshots"] = snapshots; } //for (auto item : pyresult) // py::print(" {}:, {}"_s.format(item.first, item.second)); return pyresult; } py::object AerToPy::from_exp_result(const AER::ExperimentResult &result) { py::dict pyresult; pyresult["shots"] = result.shots; pyresult["seed_simulator"] = result.seed; pyresult["data"] = AerToPy::from_exp_data(result.data); pyresult["success"] = (result.status == AER::ExperimentResult::Status::completed); switch (result.status) { case AER::ExperimentResult::Status::completed: pyresult["status"] = std::string("DONE"); break; case AER::ExperimentResult::Status::error: pyresult["status"] = std::string("ERROR: ") + result.message; break; case AER::ExperimentResult::Status::empty: pyresult["status"] = std::string("EMPTY"); } pyresult["time_taken"] = result.time_taken; if (result.header.empty() == false) { py::object tmp; from_json(result.header, tmp); pyresult["header"] = tmp; } if (result.metadata.empty() == false) { py::object tmp; from_json(result.metadata, tmp); pyresult["metadata"] = tmp; } return pyresult; } py::object AerToPy::from_result(const AER::Result &result) { py::dict pyresult; pyresult["qobj_id"] = result.qobj_id; pyresult["backend_name"] = result.backend_name; pyresult["backend_version"] = result.backend_version; pyresult["date"] = result.date; pyresult["job_id"] = result.job_id; py::list exp_results; for( const AER::ExperimentResult& exp : result.results) exp_results.append(AerToPy::from_exp_result(exp)); pyresult["results"] = exp_results; // For header and metadata we continue using the json->pyobject casting // bc these are assumed to be small relative to the ExperimentResults if (result.header.empty() == false) { py::object tmp; from_json(result.header, tmp); pyresult["header"] = tmp; } if (result.metadata.empty() == false) { py::object tmp; from_json(result.metadata, tmp); pyresult["metadata"] = tmp; } pyresult["success"] = (result.status == AER::Result::Status::completed); switch (result.status) { case AER::Result::Status::completed: pyresult["status"] = std::string("COMPLETED"); break; case AER::Result::Status::partial_completed: pyresult["status"] = std::string("PARTIAL COMPLETED"); break; case AER::Result::Status::error: pyresult["status"] = std::string("ERROR: ") + result.message; break; case AER::Result::Status::empty: pyresult["status"] = std::string("EMPTY"); } return pyresult; } #endif qiskit-aer-0.4.1/src/framework/qobj.hpp000077500000000000000000000066711362723322000200320ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_qobj_hpp_ #define _aer_framework_qobj_hpp_ #include #include #include #include #include "framework/circuit.hpp" namespace AER { //============================================================================ // Qobj data structure //============================================================================ class Qobj { public: //---------------------------------------------------------------- // Constructors //---------------------------------------------------------------- // Default constructor and destructors Qobj() = default; virtual ~Qobj() = default; // JSON deserialization constructor Qobj(const json_t &js); //---------------------------------------------------------------- // Data //---------------------------------------------------------------- std::string id; // qobj identifier passed to result std::string type = "QASM"; // currently we only support QASM std::vector circuits; // List of circuits json_t header; // (optional) passed through to result json_t config; // (optional) qobj level config data }; //============================================================================ // JSON initialization and deserialization //============================================================================ // JSON deserialization inline void from_json(const json_t &js, Qobj &qobj) {qobj = Qobj(js);} Qobj::Qobj(const json_t &js) { // Check required fields if (JSON::get_value(id, "qobj_id", js) == false) { throw std::invalid_argument(R"(Invalid qobj: no "qobj_id" field)"); }; JSON::get_value(type, "type", js); if (type != "QASM") { throw std::invalid_argument(R"(Invalid qobj: "type" != "QASM".)"); }; if (JSON::check_key("experiments", js) == false) { throw std::invalid_argument(R"(Invalid qobj: no "experiments" field.)"); } // Get header and config; JSON::get_value(config, "config", js); JSON::get_value(header, "header", js); // Check for fixed simulator seed // If seed is negative a random seed will be chosen for each // experiment. Otherwise each experiment will be set to a fixed // (but different) seed. int_t seed = -1; uint_t seed_shift = 0; JSON::get_value(seed, "seed_simulator", config); // Parse experiments const json_t &circs = js["experiments"]; for (const auto &circ : circs) { Circuit circuit(circ, config); // Override random seed with fixed seed if set // We shift the seed for each successive experiment // So that results aren't correlated between experiments if (seed >= 0) { circuit.set_seed(seed + seed_shift); seed_shift += 2113; // Shift the seed } circuits.push_back(circuit); } } //------------------------------------------------------------------------------ } // end namespace QISKIT //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/framework/results/000077500000000000000000000000001362723322000200525ustar00rootroot00000000000000qiskit-aer-0.4.1/src/framework/results/data/000077500000000000000000000000001362723322000207635ustar00rootroot00000000000000qiskit-aer-0.4.1/src/framework/results/data/average_data.hpp000077500000000000000000000153171362723322000241110ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_results_data_average_data_hpp_ #define _aer_framework_results_data_average_data_hpp_ #include "framework/json.hpp" #include "framework/linalg/linalg.hpp" #include "framework/types.hpp" namespace AER { template class AverageData { public: // Return the mean of the accumulated data: // mean = accum / count T mean() const; // Return the unbiased sample variance of the accumulated data: // var = (1 / (n - 1)) * (sum_i (data[i]^2 / n) - mean^2) for n > 1 T variance() const; // Add a new datum to the snapshot at the specified key // Uses copy semantics void add_data(const T &datum, bool compute_variance = false); // Add a new datum to the snapshot at the specified key // Uses move semantics void add_data(T &&datum, bool compute_variance = false) noexcept; // Combine with another snapshot container // Uses copy semantics void combine(const AverageData &other); // Combine with another snapshot container // Uses move semantics void combine(AverageData &&other) noexcept; // Access data T &data() { return accum_; } // Const access data const T &data() const { return accum_; } // Get number of datum accumulated size_t size() const { return count_; } // Change the size to a new value for normalization // This will effect value of mean and variance void resize(size_t sz) { count_ = sz; } // Clear all stored data void clear(); // Return true if data is empty bool empty() const { return count_ == 0; } // Return bool for in the container can compute variance bool has_variance() const { return variance_; } protected: // Accumulated data T accum_; // Store the square of accumulated data for computing sample variance. T accum_squared_; // Flag for storing accum squared for computing variance bool variance_ = true; // Number of datum that have been accumulated size_t count_ = 0; }; //------------------------------------------------------------------------------ // Implementation //------------------------------------------------------------------------------ template T AverageData::mean() const { return (count_ > 1) ? Linalg::div(T(accum_), double(count_)) : accum_; } template T AverageData::variance() const { // If no counts zero or we haven't been computing variance // we return default value if (count_ == 0 || variance_ == false) { return T(); } // If counts is 1 variance is zero if (count_ == 1) { return Linalg::mul(accum_squared_, 0); } // var = (count / (count - 1)) * (accum_squared ** 2 / count - mean ** 2) for // n > 1 T mean_squared = mean(); Linalg::isquare(mean_squared); // mean_squared T var = Linalg::div(accum_squared_, double(count_)); // squared mean Linalg::isub(var, mean_squared); // squared mean - mean squared // Apply sample bias correction of counts / (counts - 1) Linalg::idiv(var, double(count_) / double(count_ - 1)); return var; } template void AverageData::combine(const AverageData &other) { // If empty we copy data without accumulating if (empty()) { count_ = other.count_; accum_ = other.accum_; variance_ = other.has_variance(); if (variance_) { accum_squared_ = other.accum_squared_; } } else { // Otherwise we accumulate count_ += other.count_; Linalg::iadd(accum_, other.accum_); // If either container doesn't have variance we disable variance // of the current container variance_ &= other.has_variance(); if (variance_) { Linalg::iadd(accum_squared_, other.accum_squared_); } } } template void AverageData::combine(AverageData &&other) noexcept { // If empty we copy data without accumulating if (empty()) { count_ = other.count_; accum_ = std::move(other.accum_); variance_ = other.has_variance(); if (variance_) { accum_squared_ = std::move(other.accum_squared_); } } else { // Otherwise we accumulate count_ += other.count_; Linalg::iadd(accum_, std::move(other.accum_)); // If either container doesn't have variance we disable variance // of the current container variance_ &= other.has_variance(); if (variance_) { Linalg::iadd(accum_squared_, std::move(other.accum_squared_)); } } // Now that we have moved we clear the other to initial state. other.clear(); } template void AverageData::clear() { // Clear stored data using default constructor of data type accum_ = T(); accum_squared_ = T(); count_ = 0; variance_ = true; } template void AverageData::add_data(const T &datum, bool compute_variance) { // If we add a single datum without variance we // disable variance for the container variance_ &= compute_variance; // For initial datum we set the accumulators to the data if (count_ == 0) { accum_ = datum; if (has_variance()) { accum_squared_ = Linalg::square(accum_); } } else { // We use Linalg library to accumulate standard types Linalg::iadd(accum_, datum); if (has_variance()) { Linalg::iadd(accum_squared_, Linalg::square(datum)); } } // Increment the count size of the accumulated data count_ += 1; } template void AverageData::add_data(T &&datum, bool compute_variance) noexcept { variance_ &= compute_variance; if (count_ == 0) { accum_ = std::move(datum); if (has_variance()) { accum_squared_ = Linalg::square(accum_); } } else { Linalg::iadd(accum_, datum); if (has_variance()) { T tmp = std::move(datum); Linalg::iadd(accum_squared_, Linalg::isquare(tmp)); } } count_ += 1; } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ template void to_json(json_t &js, const AverageData &data) { js = json_t::object(); js["value"] = data.mean(); if (data.has_variance()) { js["variance"] = data.variance(); } } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/results/data/average_snapshot.hpp000077500000000000000000000110241362723322000250260ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_results_data_average_snapshot_hpp_ #define _aer_framework_results_data_average_snapshot_hpp_ #include "framework/json.hpp" #include "framework/results/data/average_data.hpp" #include "framework/types.hpp" namespace AER { //------------------------------------------------------------------------------ // Average Snapshot data storage class //------------------------------------------------------------------------------ template class AverageSnapshot { // Inner snapshot data map type public: // Add a new datum to the snapshot at the specified key // Uses copy semantics void add_data(const std::string &key, const std::string &memory, const T &datum, bool variance = false); // Add a new datum to the snapshot at the specified key // Uses move semantics void add_data(const std::string &key, const std::string &memory, T &&datum, bool variance = false) noexcept; // Combine with another average snapshot container // Uses copy semantics void combine(const AverageSnapshot &other); // Combine with another average snapshot container // Uses move semantics void combine(AverageSnapshot &&other) noexcept; // Clear all data from current snapshot void clear() { data_.clear(); } // Clear all snapshot data for a given label void erase(const std::string &label) { data_.erase(label); } // Return true if snapshot container is empty bool empty() const { return data_.empty(); } // Return data reference stringmap_t>> data() { return data_; } // Return const data reference const stringmap_t>> &data() const { return data_; } protected: // Internal Storage // Outer map key is the snapshot label string // Inner map key is the memory value string stringmap_t>> data_; }; //------------------------------------------------------------------------------ // Implementation: AverageSnapshot class methods //------------------------------------------------------------------------------ template void AverageSnapshot::add_data(const std::string &key, const std::string &memory, const T &datum, bool variance) { data_[key][memory].add_data(datum, variance); } template void AverageSnapshot::add_data(const std::string &key, const std::string &memory, T &&datum, bool variance) noexcept { data_[key][memory].add_data(std::move(datum), variance); } template void AverageSnapshot::combine(const AverageSnapshot &other) { for (const auto &outer : other.data_) { for (const auto &inner : outer.second) { data_[outer.first][inner.first].combine(inner.second); } } } template void AverageSnapshot::combine(AverageSnapshot &&other) noexcept { for (auto &outer : other.data_) { for (auto &inner : outer.second) { data_[outer.first][inner.first].combine(std::move(inner.second)); } } // Clear moved snapshot other.clear(); } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ template void to_json(json_t &js, const AverageSnapshot &snapshot) { js = json_t::object(); for (const auto &outer_pair : snapshot.data()) { for (const auto &inner_pair : outer_pair.second) { // Store mean and variance for snapshot json_t datum = inner_pair.second; // Add memory key if there are classical registers auto memory = inner_pair.first; if (memory.empty() == false) datum["memory"] = inner_pair.first; // Add to list of output js[outer_pair.first].push_back(datum); } } } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/results/data/pershot_data.hpp000077500000000000000000000057171362723322000241660ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_results_data_pershot_data_hpp_ #define _aer_framework_results_data_pershot_data_hpp_ #include "framework/json.hpp" #include "framework/types.hpp" namespace AER { template class PershotData { public: // Constructor PershotData(size_t num_shots = 0) { data_.reserve(num_shots); } // Add a new shot of data by appending to data vector // Uses copy semantics void add_data(const T& datum) { data_.push_back(datum); } // Add a new shot of data by appending to data vector // Uses move semantics void add_data(T&& datum) noexcept { data_.push_back(std::move(datum)); } // Combine with another pershot data by concatinating // Uses copy semantics void combine(const PershotData& other); // Combine with another pershot data by concatinating // Uses move semantics void combine(PershotData&& other) noexcept; // Access data std::vector& data() { return data_; } // Const access data const std::vector& data() const { return data_; } // Get number of datum accumulated size_t size() const { return data_.size(); } void reserve(size_t sz) { data_.reserve(sz); } // Clear all stored data void clear() { data_.clear(); } // Return true if data is empty bool empty() const { return data_.empty(); } protected: // Internal Storage std::vector data_; }; //------------------------------------------------------------------------------ // Implementation //------------------------------------------------------------------------------ template void PershotData::combine(const PershotData& other) { // Copy data from other container data_.reserve(data_.size() + other.data_.size()); data_.insert(data_.end(), other.data_.begin(), other.data_.end()); } template void PershotData::combine(PershotData&& other) noexcept { // Move data from other container data_.insert(data_.end(), std::make_move_iterator(other.data_.begin()), std::make_move_iterator(other.data_.end())); } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ template void to_json(json_t& js, const PershotData& data) { js = data.data(); } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/results/data/pershot_snapshot.hpp000077500000000000000000000071141362723322000251050ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_results_data_pershot_snapshot_hpp_ #define _aer_framework_results_data_pershot_snapshot_hpp_ #include "framework/json.hpp" #include "framework/results/data/pershot_data.hpp" #include "framework/types.hpp" namespace AER { //------------------------------------------------------------------------------ // Pershot Snapshot data storage class //------------------------------------------------------------------------------ template class PershotSnapshot { // Inner snapshot data map type public: // Add a new datum to the snapshot at the specified key // Uses copy semantics void add_data(const std::string &key, const T &datum); // Add a new datum to the snapshot at the specified key // Uses move semantics void add_data(const std::string &key, T &&datum) noexcept; // Combine with another pershot snapshot container // Uses copy semantics void combine(const PershotSnapshot &other); // Combine with another pershot snapshot container // Uses move semantics void combine(PershotSnapshot &&other) noexcept; // Clear all data from current snapshot container void clear() { data_.clear(); } // Clear all snapshot data for a given label void erase(const std::string &label) { data_.erase(label); } // Return true if snapshot container is empty bool empty() const { return data_.empty(); } // Return data reference stringmap_t> data() { return data_; } // Return const data reference const stringmap_t> &data() const { return data_; } private: // Internal Storage // Map key is the snapshot label string stringmap_t> data_; }; //------------------------------------------------------------------------------ // Implementation: PershotSnapshot class methods //------------------------------------------------------------------------------ template void PershotSnapshot::add_data(const std::string &key, const T &datum) { data_[key].add_data(datum); } template void PershotSnapshot::add_data(const std::string &key, T &&datum) noexcept { data_[key].add_data(std::move(datum)); } template void PershotSnapshot::combine(const PershotSnapshot &other) { for (const auto &pair : other.data_) { data_[pair.first].combine(pair.second); } } template void PershotSnapshot::combine(PershotSnapshot &&other) noexcept { for (auto &pair : other.data_) { data_[pair.first].combine(std::move(pair.second)); } // Clear added snapshot other.clear(); } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ template void to_json(json_t &js, const PershotSnapshot &snapshot) { js = json_t::object(); for (const auto &pair : snapshot.data()) { js[pair.first] = pair.second; } } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/results/experiment_data.hpp000077500000000000000000001117121362723322000237420ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_experiment_data_hpp_ #define _aer_framework_experiment_data_hpp_ #include "framework/json.hpp" #include "framework/results/data/average_snapshot.hpp" #include "framework/results/data/pershot_snapshot.hpp" #include "framework/utils.hpp" namespace AER { //============================================================================ // Output data class for Qiskit-Aer //============================================================================ /************************************************************************** * Data config options: * * - "counts" (bool): Return counts object in circuit data [Default: True] * - "snapshots" (bool): Return snapshots object in circuit data [Default: True] * - "memory" (bool): Return memory array in circuit data [Default: False] * - "register" (bool): Return register array in circuit data [Default: False] **************************************************************************/ class ExperimentData { public: //---------------------------------------------------------------- // Measurement //---------------------------------------------------------------- // Add a single memory value to the counts map void add_memory_count(const std::string &memory); // Add a single memory value to the memory vector void add_pershot_memory(const std::string &memory); // Add a single register value to the register vector void add_pershot_register(const std::string ®); //---------------------------------------------------------------- // Pershot snapshots //---------------------------------------------------------------- // Add a new datum to the snapshot of the specified type and label // This will use the json conversion method `to_json` for // data type T unless T is one of the supported basic types: // complex, complex vector, complex matrix, map, // map template void add_pershot_snapshot(const std::string &type, const std::string &label, T &&datum); //---------------------------------------------------------------- // Average snapshots //---------------------------------------------------------------- // Add a new datum to the snapshot of the specified type and label // This will use the json conversion method `to_json` for // data type T // If variance is true the variance of the averaged sample will also // be computed template void add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, T &&datum, bool variance = false); //---------------------------------------------------------------- // Additional data //---------------------------------------------------------------- // Add new data at the specified key. // If they key already exists this will override the stored data // This will use the json conversion method `to_json` for data type T // if it isn't a natively supported data type. // Current native types are: cvector_t, cmatrix_t. template void add_additional_data(const std::string &key, T &&data); // Erase additional data stored at the provided key. // This will erase from all additional data containers void erase_additional_data(const std::string &key); //---------------------------------------------------------------- // Metadata //---------------------------------------------------------------- // Access metadata map stringmap_t &metadata() { return metadata_; } const stringmap_t &metadata() const { return metadata_; } // Add new data to metadata at the specified key. // This will use the json conversion method `to_json` for data type T. // If they key already exists this will update the current data // with the new data. template void add_metadata(const std::string &key, T &&data); //---------------------------------------------------------------- // Config //---------------------------------------------------------------- // Set the output data config options void set_config(const json_t &config); // Empty engine of stored data void clear(); // Serialize engine data to JSON json_t json() const; // Combine engines for accumulating data // Second engine should no longer be used after combining // as this function should use move semantics to minimize copying ExperimentData &combine(ExperimentData &&eng); // Move semantics ExperimentData &combine(const ExperimentData &eng); // Copy semantics // Operator overload for combine // Note this operator is not defined to be const on the input argument inline ExperimentData &operator+=(const ExperimentData &eng) { return combine(eng); } inline ExperimentData &operator+=(ExperimentData &&eng) { return combine(std::move(eng)); } //---------------------------------------------------------------- // Measurement data //---------------------------------------------------------------- // Histogram of memory counts over shots std::map counts_; // Memory state for each shot as hex string std::vector memory_; // Register state for each shot as hex string std::vector register_; //---------------------------------------------------------------- // Snapshots //---------------------------------------------------------------- // The outer keys of the snapshot maps are the "snapshot_type". // The JSON type snapshot is used as a generic dynamic-type // storage since it can store any class that has a `to_json` // method implemented. //---------------------------------------------------------------- // Pershot Snapshots //---------------------------------------------------------------- // Generic JSON pershot snapshots stringmap_t> pershot_json_snapshots_; // Complex value pershot snapshots stringmap_t> pershot_complex_snapshots_; // Complex vector pershot snapshots stringmap_t> pershot_cvector_snapshots_; // Complex matrix pershot snapshots stringmap_t> pershot_cmatrix_snapshots_; // Map pershot snapshots stringmap_t>> pershot_cmap_snapshots_; // Map pershot snapshots stringmap_t>> pershot_rmap_snapshots_; //---------------------------------------------------------------- // Average Snapshots //---------------------------------------------------------------- // Generic JSON average snapshots stringmap_t> average_json_snapshots_; // Complex value average snapshots stringmap_t> average_complex_snapshots_; // Complex vector average snapshots stringmap_t> average_cvector_snapshots_; // Complex matrix average snapshots stringmap_t> average_cmatrix_snapshots_; // Map average snapshots stringmap_t>> average_cmap_snapshots_; // Map average snapshots stringmap_t>> average_rmap_snapshots_; //---------------------------------------------------------------- // Additional data //---------------------------------------------------------------- // Reserved keys that can't be used by additional data const static stringset_t reserved_keys_; // Miscelaneous data stringmap_t additional_json_data_; // Complex vector data stringmap_t additional_cvector_data_; // Complex matrix data stringmap_t additional_cmatrix_data_; // Check if key name is reserved and if so throw an exception void check_reserved_key(const std::string &key); //---------------------------------------------------------------- // Metadata //---------------------------------------------------------------- // This will be passed up to the experiment_result level // metadata field stringmap_t metadata_; //---------------------------------------------------------------- // Config //---------------------------------------------------------------- bool return_counts_ = true; bool return_memory_ = false; bool return_register_ = false; bool return_snapshots_ = true; bool return_additional_data_ = true; }; //============================================================================ // Implementations //============================================================================ void ExperimentData::set_config(const json_t &config) { JSON::get_value(return_counts_, "counts", config); JSON::get_value(return_memory_, "memory", config); JSON::get_value(return_register_, "register", config); JSON::get_value(return_snapshots_, "snapshots", config); } //------------------------------------------------------------------ // Classical data //------------------------------------------------------------------ void ExperimentData::add_memory_count(const std::string &memory) { // Memory bits value if (return_counts_ && !memory.empty()) { counts_[memory] += 1; } } void ExperimentData::add_pershot_memory(const std::string &memory) { // Memory bits value if (return_memory_ && !memory.empty()) { memory_.push_back(memory); } } void ExperimentData::add_pershot_register(const std::string ®) { if (return_register_ && !reg.empty()) { register_.push_back(reg); } } //------------------------------------------------------------------ // Pershot Snapshots //------------------------------------------------------------------ // Generic template void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, T &&datum) { if (return_snapshots_) { // use implicit to_json conversion function for T json_t tmp = datum; add_pershot_snapshot(type, label, std::move(tmp)); } } // JSON template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, json_t &&datum) { if (return_snapshots_) { pershot_json_snapshots_[type].add_data(label, std::move(datum)); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, const json_t &datum) { if (return_snapshots_) { pershot_json_snapshots_[type].add_data(label, datum); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, json_t &datum) { if (return_snapshots_) { pershot_json_snapshots_[type].add_data(label, datum); } } // Complex template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, complex_t &&datum) { if (return_snapshots_) { pershot_complex_snapshots_[type].add_data(label, std::move(datum)); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, const complex_t &datum) { if (return_snapshots_) { pershot_complex_snapshots_[type].add_data(label, datum); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, complex_t &datum) { if (return_snapshots_) { pershot_complex_snapshots_[type].add_data(label, datum); } } // Complex vector template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, cvector_t &&datum) { if (return_snapshots_) { pershot_cvector_snapshots_[type].add_data(label, std::move(datum)); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, const cvector_t &datum) { if (return_snapshots_) { pershot_cvector_snapshots_[type].add_data(label, datum); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, cvector_t &datum) { if (return_snapshots_) { pershot_cvector_snapshots_[type].add_data(label, datum); } } // Complex matrix template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, cmatrix_t &&datum) { if (return_snapshots_) { pershot_cmatrix_snapshots_[type].add_data(label, std::move(datum)); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, const cmatrix_t &datum) { if (return_snapshots_) { pershot_cmatrix_snapshots_[type].add_data(label, datum); } } template <> void ExperimentData::add_pershot_snapshot(const std::string &type, const std::string &label, cmatrix_t &datum) { if (return_snapshots_) { pershot_cmatrix_snapshots_[type].add_data(label, datum); } } // Complex map template <> void ExperimentData::add_pershot_snapshot( const std::string &type, const std::string &label, std::map &&datum) { if (return_snapshots_) { pershot_cmap_snapshots_[type].add_data(label, std::move(datum)); } } template <> void ExperimentData::add_pershot_snapshot( const std::string &type, const std::string &label, const std::map &datum) { if (return_snapshots_) { pershot_cmap_snapshots_[type].add_data(label, datum); } } template <> void ExperimentData::add_pershot_snapshot( const std::string &type, const std::string &label, std::map &datum) { if (return_snapshots_) { pershot_cmap_snapshots_[type].add_data(label, datum); } } // Real map template <> void ExperimentData::add_pershot_snapshot( const std::string &type, const std::string &label, std::map &&datum) { if (return_snapshots_) { pershot_rmap_snapshots_[type].add_data(label, std::move(datum)); } } template <> void ExperimentData::add_pershot_snapshot( const std::string &type, const std::string &label, const std::map &datum) { if (return_snapshots_) { pershot_rmap_snapshots_[type].add_data(label, datum); } } template <> void ExperimentData::add_pershot_snapshot( const std::string &type, const std::string &label, std::map &datum) { if (return_snapshots_) { pershot_rmap_snapshots_[type].add_data(label, datum); } } //------------------------------------------------------------------ // Average Snapshots //------------------------------------------------------------------ template void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, T &&datum, bool variance) { if (return_snapshots_) { json_t tmp = datum; // use implicit to_json conversion function for T add_average_snapshot(type, label, memory, std::move(tmp), variance); } } // JSON template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, json_t &&datum, bool variance) { if (return_snapshots_) { average_json_snapshots_[type].add_data(label, memory, std::move(datum), variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, const json_t &datum, bool variance) { if (return_snapshots_) { average_json_snapshots_[type].add_data(label, memory, datum, variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, json_t &datum, bool variance) { if (return_snapshots_) { average_json_snapshots_[type].add_data(label, memory, datum, variance); } } // Complex template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, complex_t &&datum, bool variance) { if (return_snapshots_) { average_complex_snapshots_[type].add_data(label, memory, std::move(datum), variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, const complex_t &datum, bool variance) { if (return_snapshots_) { average_complex_snapshots_[type].add_data(label, memory, datum, variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, complex_t &datum, bool variance) { if (return_snapshots_) { average_complex_snapshots_[type].add_data(label, memory, datum, variance); } } // Complex vector template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, cvector_t &&datum, bool variance) { if (return_snapshots_) { average_cvector_snapshots_[type].add_data(label, memory, std::move(datum), variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, const cvector_t &datum, bool variance) { if (return_snapshots_) { average_cvector_snapshots_[type].add_data(label, memory, datum, variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, cvector_t &datum, bool variance) { if (return_snapshots_) { average_cvector_snapshots_[type].add_data(label, memory, datum, variance); } } // Complex matrix template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, cmatrix_t &&datum, bool variance) { if (return_snapshots_) { average_cmatrix_snapshots_[type].add_data(label, memory, std::move(datum), variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, const cmatrix_t &datum, bool variance) { if (return_snapshots_) { average_cmatrix_snapshots_[type].add_data(label, memory, datum, variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, cmatrix_t &datum, bool variance) { if (return_snapshots_) { average_cmatrix_snapshots_[type].add_data(label, memory, datum, variance); } } // Complex map template <> void ExperimentData::add_average_snapshot( const std::string &type, const std::string &label, const std::string &memory, std::map &&datum, bool variance) { if (return_snapshots_) { average_cmap_snapshots_[type].add_data(label, memory, std::move(datum), variance); } } template <> void ExperimentData::add_average_snapshot( const std::string &type, const std::string &label, const std::string &memory, const std::map &datum, bool variance) { if (return_snapshots_) { average_cmap_snapshots_[type].add_data(label, memory, datum, variance); } } template <> void ExperimentData::add_average_snapshot( const std::string &type, const std::string &label, const std::string &memory, std::map &datum, bool variance) { if (return_snapshots_) { average_cmap_snapshots_[type].add_data(label, memory, datum, variance); } } // Real map template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, std::map &&datum, bool variance) { if (return_snapshots_) { average_rmap_snapshots_[type].add_data(label, memory, std::move(datum), variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, const std::map &datum, bool variance) { if (return_snapshots_) { average_rmap_snapshots_[type].add_data(label, memory, datum, variance); } } template <> void ExperimentData::add_average_snapshot(const std::string &type, const std::string &label, const std::string &memory, std::map &datum, bool variance) { if (return_snapshots_) { average_rmap_snapshots_[type].add_data(label, memory, datum, variance); } } //------------------------------------------------------------------ // Additional Data //------------------------------------------------------------------ const stringset_t ExperimentData::reserved_keys_ = {"counts", "memory", "register", "snapshots"}; void ExperimentData::check_reserved_key(const std::string &key) { if (reserved_keys_.find(key) != reserved_keys_.end()) { throw std::invalid_argument( "Cannot add additional data with reserved key name \"" + key + "\"."); } } void ExperimentData::erase_additional_data(const std::string &key) { additional_json_data_.erase(key); additional_cvector_data_.erase(key); additional_cmatrix_data_.erase(key); } template void ExperimentData::add_additional_data(const std::string &key, T &&data) { check_reserved_key(key); if (return_additional_data_) { json_t jdata = data; add_additional_data(key, std::move(jdata)); } } template <> void ExperimentData::add_additional_data(const std::string &key, json_t &&data) { check_reserved_key(key); if (return_additional_data_) { erase_additional_data(key); additional_json_data_[key] = std::move(data); } } template <> void ExperimentData::add_additional_data(const std::string &key, const json_t &data) { check_reserved_key(key); if (return_additional_data_) { erase_additional_data(key); additional_json_data_[key] = data; } } template <> void ExperimentData::add_additional_data(const std::string &key, json_t &data) { const json_t &const_data = data; add_additional_data(key, const_data); } template <> void ExperimentData::add_additional_data(const std::string &key, cvector_t &&data) { check_reserved_key(key); if (return_additional_data_) { erase_additional_data(key); additional_cvector_data_[key] = std::move(data); } } template <> void ExperimentData::add_additional_data(const std::string &key, const cvector_t &data) { check_reserved_key(key); if (return_additional_data_) { erase_additional_data(key); additional_cvector_data_[key] = data; } } template <> void ExperimentData::add_additional_data(const std::string &key, cvector_t &data) { const cvector_t &const_data = data; add_additional_data(key, const_data); } template <> void ExperimentData::add_additional_data(const std::string &key, cmatrix_t &&data) { check_reserved_key(key); if (return_additional_data_) { erase_additional_data(key); additional_cmatrix_data_[key] = std::move(data); } } template <> void ExperimentData::add_additional_data(const std::string &key, const cmatrix_t &data) { check_reserved_key(key); if (return_additional_data_) { erase_additional_data(key); additional_cmatrix_data_[key] = data; } } template <> void ExperimentData::add_additional_data(const std::string &key, cmatrix_t &data) { const cmatrix_t &const_data = data; add_additional_data(key, const_data); } //------------------------------------------------------------------ // Metadata //------------------------------------------------------------------ template void ExperimentData::add_metadata(const std::string &key, T &&data) { // Use implicit to_json conversion function for T json_t jdata = data; add_metadata(key, std::move(jdata)); } template <> void ExperimentData::add_metadata(const std::string &key, json_t &&data) { auto elt = metadata_.find("key"); if (elt == metadata_.end()) { // If key doesn't already exist add new data metadata_[key] = std::move(data); } else { // If key already exists append with additional data elt->second.update(data.begin(), data.end()); } } template <> void ExperimentData::add_metadata(const std::string &key, const json_t &data) { auto elt = metadata_.find("key"); if (elt == metadata_.end()) { // If key doesn't already exist add new data metadata_[key] = data; } else { // If key already exists append with additional data elt->second.update(data.begin(), data.end()); } } template <> void ExperimentData::add_metadata(const std::string &key, json_t &data) { const json_t &const_data = data; add_metadata(key, const_data); } //------------------------------------------------------------------ // Clear and combine //------------------------------------------------------------------ void ExperimentData::clear() { // Clear measurement data counts_.clear(); memory_.clear(); register_.clear(); // Clear pershot snapshots pershot_json_snapshots_.clear(); pershot_complex_snapshots_.clear(); pershot_cvector_snapshots_.clear(); pershot_cmatrix_snapshots_.clear(); pershot_cmap_snapshots_.clear(); pershot_rmap_snapshots_.clear(); // Clear average snapshots average_json_snapshots_.clear(); average_complex_snapshots_.clear(); average_cvector_snapshots_.clear(); average_cmatrix_snapshots_.clear(); average_cmap_snapshots_.clear(); average_rmap_snapshots_.clear(); // Clear additional data additional_json_data_.clear(); additional_cvector_data_.clear(); additional_cmatrix_data_.clear(); // Clear metadata metadata_.clear(); } ExperimentData &ExperimentData::combine(const ExperimentData &other) { // Combine measure std::copy(other.memory_.begin(), other.memory_.end(), std::back_inserter(memory_)); std::copy(other.register_.begin(), other.register_.end(), std::back_inserter(register_)); // Combine counts for (auto pair : other.counts_) { counts_[pair.first] += pair.second; } // Combine pershot snapshots for (const auto &pair : other.pershot_json_snapshots_) { pershot_json_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.pershot_complex_snapshots_) { pershot_complex_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.pershot_cvector_snapshots_) { pershot_cvector_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.pershot_cmatrix_snapshots_) { pershot_cmatrix_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.pershot_cmap_snapshots_) { pershot_cmap_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.pershot_rmap_snapshots_) { pershot_rmap_snapshots_[pair.first].combine(pair.second); } // Combine average snapshots for (const auto &pair : other.average_json_snapshots_) { average_json_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.average_complex_snapshots_) { average_complex_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.average_cvector_snapshots_) { average_cvector_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.average_cmatrix_snapshots_) { average_cmatrix_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.average_cmap_snapshots_) { average_cmap_snapshots_[pair.first].combine(pair.second); } for (const auto &pair : other.average_rmap_snapshots_) { average_rmap_snapshots_[pair.first].combine(pair.second); } // Combine metadata for (const auto &pair : other.metadata_) { metadata_[pair.first] = pair.second; } // Combine additional data for (const auto &pair : other.additional_json_data_) { const auto &key = pair.first; erase_additional_data(key); additional_json_data_[key] = pair.second; } for (const auto &pair : other.additional_cvector_data_) { const auto &key = pair.first; erase_additional_data(key); additional_cvector_data_[key] = pair.second; } for (const auto &pair : other.additional_cmatrix_data_) { const auto &key = pair.first; erase_additional_data(key); additional_cmatrix_data_[key] = pair.second; } return *this; } ExperimentData &ExperimentData::combine(ExperimentData &&other) { // Combine measure std::move(other.memory_.begin(), other.memory_.end(), std::back_inserter(memory_)); std::move(other.register_.begin(), other.register_.end(), std::back_inserter(register_)); // Combine counts for (auto pair : other.counts_) { counts_[pair.first] += pair.second; } // Combine pershot snapshots for (auto &pair : other.pershot_json_snapshots_) { pershot_json_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.pershot_complex_snapshots_) { pershot_complex_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.pershot_cvector_snapshots_) { pershot_cvector_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.pershot_cmatrix_snapshots_) { pershot_cmatrix_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.pershot_cmap_snapshots_) { pershot_cmap_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.pershot_rmap_snapshots_) { pershot_rmap_snapshots_[pair.first].combine(std::move(pair.second)); } // Combine average snapshots for (auto &pair : other.average_json_snapshots_) { average_json_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.average_complex_snapshots_) { average_complex_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.average_cvector_snapshots_) { average_cvector_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.average_cmatrix_snapshots_) { average_cmatrix_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.average_cmap_snapshots_) { average_cmap_snapshots_[pair.first].combine(std::move(pair.second)); } for (auto &pair : other.average_rmap_snapshots_) { average_rmap_snapshots_[pair.first].combine(std::move(pair.second)); } // Combine metadata for (auto &pair : other.metadata_) { metadata_[pair.first] = std::move(pair.second); } // Combine additional data for (auto &pair : other.additional_json_data_) { const auto &key = pair.first; erase_additional_data(key); additional_json_data_[key] = std::move(pair.second); } for (auto &pair : other.additional_cvector_data_) { const auto &key = pair.first; erase_additional_data(key); additional_cvector_data_[key] = std::move(pair.second); } for (auto &pair : other.additional_cmatrix_data_) { const auto &key = pair.first; erase_additional_data(key); additional_cmatrix_data_[key] = std::move(pair.second); } // Clear any remaining data from other container other.clear(); return *this; } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ json_t ExperimentData::json() const { // Initialize output as additional data JSON json_t tmp; // Measure data if (return_counts_ && counts_.empty() == false) tmp["counts"] = counts_; if (return_memory_ && memory_.empty() == false) tmp["memory"] = memory_; if (return_register_ && register_.empty() == false) tmp["register"] = register_; // Add additional data for (const auto &pair : additional_json_data_) { tmp[pair.first] = pair.second; } for (const auto &pair : additional_cvector_data_) { tmp[pair.first] = pair.second; } for (const auto &pair : additional_cmatrix_data_) { tmp[pair.first] = pair.second; } // Snapshot data if (return_snapshots_) { // Average snapshots for (const auto &pair : average_json_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : average_complex_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : average_cvector_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : average_cmatrix_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : average_cmap_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : average_rmap_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } // Singleshot snapshot data // Note these will override the average snapshots // if they share the same type string for (const auto &pair : pershot_json_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : pershot_complex_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : pershot_cvector_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : pershot_cmatrix_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : pershot_cmap_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } for (auto &pair : pershot_rmap_snapshots_) { tmp["snapshots"][pair.first] = pair.second; } } // Check if data is null (empty) and if so return an empty JSON object if (tmp.is_null()) return json_t::object(); return tmp; } inline void to_json(json_t &js, const ExperimentData &data) { js = data.json(); } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/results/experiment_result.hpp000066400000000000000000000075521362723322000243520ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_results_experiment_result_hpp_ #define _aer_framework_results_experiment_result_hpp_ #include "framework/results/experiment_data.hpp" namespace AER { //============================================================================ // Result container for Qiskit-Aer //============================================================================ struct ExperimentResult { public: // Status enum class Status {empty, completed, error}; // Experiment data ExperimentData data; uint_t shots; uint_t seed; double time_taken; // Success and status Status status = Status::empty; std::string message; // error message // Metadata json_t header; stringmap_t metadata; // Append metadata for a given key. // This assumes the metadata value is a dictionary and appends // any new values template void add_metadata(const std::string &key, T &&data); // Serialize engine data to JSON json_t json() const; }; //------------------------------------------------------------------------------ // Add metadata //------------------------------------------------------------------------------ template void ExperimentResult::add_metadata(const std::string &key, T &&meta) { // Use implicit to_json conversion function for T json_t jdata = meta; add_metadata(key, std::move(jdata)); } template <> void ExperimentResult::add_metadata(const std::string &key, json_t &&meta) { auto elt = metadata.find("key"); if (elt == metadata.end()) { // If key doesn't already exist add new data metadata[key] = std::move(meta); } else { // If key already exists append with additional data elt->second.update(meta.begin(), meta.end()); } } template <> void ExperimentResult::add_metadata(const std::string &key, const json_t &meta) { auto elt = metadata.find("key"); if (elt == metadata.end()) { // If key doesn't already exist add new data metadata[key] = meta; } else { // If key already exists append with additional data elt->second.update(meta.begin(), meta.end()); } } template <> void ExperimentResult::add_metadata(const std::string &key, json_t &meta) { const json_t &const_meta = meta; add_metadata(key, const_meta); } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ json_t ExperimentResult::json() const { // Initialize output as additional data JSON json_t result; result["data"] = data; result["shots"] = shots; result["seed_simulator"] = seed; result["success"] = (status == Status::completed); switch (status) { case Status::completed: result["status"] = std::string("DONE"); break; case Status::error: result["status"] = std::string("ERROR: ") + message; break; case Status::empty: result["status"] = std::string("EMPTY"); } result["time_taken"] = time_taken; if (header.empty() == false) result["header"] = header; if (metadata.empty() == false) result["metadata"] = metadata; return result; } inline void to_json(json_t &js, const ExperimentResult &result) { js = result.json(); } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/results/result.hpp000077500000000000000000000074721362723322000221160ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_results_result_hpp_ #define _aer_framework_results_result_hpp_ #include "framework/results/experiment_result.hpp" namespace AER { //============================================================================ // Result container for Qiskit-Aer //============================================================================ struct Result { public: // Result status: // completed: all experiments were executed successfully // partial: only some experiments were executed succesfully enum class Status {empty, completed, partial_completed, error}; // Constructor Result(size_t num_exp = 0) {results.resize(num_exp);} // Experiment results std::vector results; // Job metadata std::string backend_name; std::string backend_version; std::string qobj_id; std::string job_id; std::string date; // Success and status Status status = Status::empty; // Result status std::string message; // error message // Metadata json_t header; json_t metadata; // Size and resize auto size() {return results.size();} void resize(size_t size) {results.resize(size);} // Clear all metadata for given key void clear_metadata(const std::string &key); // Append metadata for a given key. // This assumes the metadata value is a dictionary and appends // any new values template void add_metadata(const std::string &key, const T &data); // Serialize engine data to JSON json_t json() const; }; //------------------------------------------------------------------------------ // Add metadata //------------------------------------------------------------------------------ template void Result::add_metadata(const std::string &key, const T &data) { json_t js = data; // use implicit to_json conversion function for T if (JSON::check_key(key, metadata)) metadata[key].update(js.begin(), js.end()); else metadata[key] = js; } void Result::clear_metadata(const std::string &key) { metadata.erase(key); } //------------------------------------------------------------------------------ // JSON serialization //------------------------------------------------------------------------------ json_t Result::json() const { // Initialize output as additional data JSON json_t result; result["qobj_id"] = qobj_id; result["backend_name"] = backend_name; result["backend_version"] = backend_version; result["date"] = date; result["job_id"] = job_id; result["results"] = results; if (header.empty() == false) result["header"] = header; if (metadata.empty() == false) result["metadata"] = metadata; result["success"] = (status == Status::completed); switch (status) { case Status::completed: result["status"] = std::string("COMPLETED"); break; case Status:: partial_completed: result["status"] = std::string("PARTIAL COMPLETED"); break; case Status::error: result["status"] = std::string("ERROR: ") + message; break; case Status::empty: result["status"] = std::string("EMPTY"); } return result; } inline void to_json(json_t &js, const Result &result) { js = result.json(); } //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/rng.hpp000077500000000000000000000074611362723322000176630ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_rng_hpp_ #define _aer_framework_rng_hpp_ #include #include #include "framework/types.hpp" namespace AER { /***************************************************************************/ /** * * RngEngine Class * * Objects of this class are used to generate random numbers for backends. *These * are used to decide outcomes of measurements and resets, and for implementing * noise. * ******************************************************************************/ class RngEngine { public: /** * Generate a uniformly distributed pseudo random real in the half-open * interval [a,b) * @param a closed lower bound on interval * @param b open upper bound on interval * @return the generated double */ double rand(double a, double b); /** * Generate a uniformly distributed pseudo random real in the half-open * interval [0,b) * @param b open upper bound on interval * @return the generated double */ inline double rand(double b) { return rand(0, b); }; /** * Generate a uniformly distributed pseudo random real in the half-open * interval [0,1) * @return the generated double */ inline double rand() { return rand(0, 1); }; /** * Generate a uniformly distributed pseudo random integer in the closed * interval [a,b] * @param a lower bound on interval * @param b upper bound on interval * @return the generated integer */ int_t rand_int(int_t a, int_t b); uint_t rand_int(uint_t a, uint_t b); /** * Generate a pseudo random integer from a a discrete distribution * constructed from an input vector of probabilities for [0,..,n-1] * where n is the lenght of the vector. If this vector is not normalized * it will be scaled when it is converted to a discrete_distribution * @param probs the vector of probabilities * @return the generated integer */ uint_t rand_int(const std::vector &probs); /** * Default constructor initialize RNG engine with a random seed */ RngEngine() { std::random_device rd; rng.seed(rd()); }; /** * Seeded constructor initialize RNG engine with a fixed seed * @param seed integer to use as seed for mt19937 engine */ explicit RngEngine(uint_t seed) { rng.seed(seed); }; // Set a fixed seed for the RNG engine void set_seed(uint_t seed) { rng.seed(seed); }; private: std::mt19937 rng; // Mersenne twister rng engine }; /******************************************************************************* * * RngEngine Methods * ******************************************************************************/ double RngEngine::rand(double a, double b) { double p = std::uniform_real_distribution(a, b)(rng); return p; } // randomly distributed integers in [a,b] int_t RngEngine::rand_int(int_t a, int_t b) { int_t n = std::uniform_int_distribution(a, b)(rng); return n; } uint_t RngEngine::rand_int(uint_t a, uint_t b) { int_t n = std::uniform_int_distribution(a, b)(rng); return n; } // randomly distributed integers from vector uint_t RngEngine::rand_int(const std::vector &probs) { uint_t n = std::discrete_distribution(probs.begin(), probs.end())(rng); return n; } //------------------------------------------------------------------------------ } // End namespace QISKIT #endif qiskit-aer-0.4.1/src/framework/types.hpp000077500000000000000000000111111362723322000202240ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_types_hpp_ #define _aer_framework_types_hpp_ #include #include #include #include #include #include #include #include #include #include "framework/matrix.hpp" // matrix class /***************************************************************************/ /** * * Numeric Types for backends * ******************************************************************************/ namespace AER { // Numeric Types using int_t = int_fast64_t; using uint_t = uint_fast64_t; using complex_t = std::complex; using cvector_t = std::vector; using cmatrix_t = matrix; using rvector_t = std::vector; using rmatrix_t = matrix; using reg_t = std::vector; using stringset_t = std::unordered_set; template using stringmap_t = std::unordered_map; } //============================================================================ // STL ostream overloads //============================================================================ // STL containers template std::ostream &operator<<(std::ostream &out, const std::pair &p); template std::ostream &operator<<(std::ostream &out, const std::vector &v); template std::ostream &operator<<(std::ostream &out, const std::array &v); template std::ostream &operator<<(std::ostream &out, const std::map &m); template std::ostream &operator<<(std::ostream &out, const std::unordered_map &m); template std::ostream &operator<<(std::ostream &out, const std::unordered_set &s); template std::ostream &operator<<(std::ostream &out, const std::set &s); // ostream overload for pairs template std::ostream &operator<<(std::ostream &out, const std::pair &p) { out << "(" << p.first << ", " << p.second << ")"; return out; } // ostream overload for vectors template std::ostream &operator<<(std::ostream &out, const std::vector &v) { out << "["; size_t last = v.size() - 1; for (size_t i = 0; i < v.size(); ++i) { out << v[i]; if (i != last) out << ", "; } out << "]"; return out; } // ostream overload for arrays template std::ostream &operator<<(std::ostream &out, const std::array &v) { out << "["; for (size_t i = 0; i < N; ++i) { out << v[i]; if (i != N - 1) out << ", "; } out << "]"; return out; } // ostream overload for maps template std::ostream &operator<<(std::ostream &out, const std::map &m) { out << "{"; size_t pos = 0, last = m.size() - 1; for (auto const &p : m) { out << p.first << ":" << p.second; if (pos != last) out << ", "; pos++; } out << "}"; return out; } // ostream overload for unordered maps template std::ostream &operator<<(std::ostream &out, const std::unordered_map &m) { out << "{"; size_t pos = 0, last = m.size() - 1; for (auto const &p : m) { out << p.first << ":" << p.second; if (pos != last) out << ", "; pos++; } out << "}"; return out; } // ostream overload for sets template std::ostream &operator<<(std::ostream &out, const std::unordered_set &s) { out << "{"; size_t pos = 0, last = s.size() - 1; for (auto const &elt : s) { out << elt; if (pos != last) out << ", "; pos++; } out << "}"; return out; } // ostream overload for unordered sets template std::ostream &operator<<(std::ostream &out, const std::set &s) { out << "{"; size_t pos = 0, last = s.size() - 1; for (auto const &elt : s) { out << elt; if (pos != last) out << ", "; pos++; } out << "}"; return out; } //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/framework/utils.hpp000077500000000000000000001375271362723322000202440ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_framework_utils_hpp_ #define _aer_framework_utils_hpp_ #include #include #include #include #include "framework/types.hpp" namespace AER { namespace Utils { //------------------------------------------------------------------------------ // Static Matrices //------------------------------------------------------------------------------ class Matrix { public: // Single-qubit gates const static cmatrix_t I; // name: "id" const static cmatrix_t X; // name: "x" const static cmatrix_t Y; // name: "y" const static cmatrix_t Z; // name: "z" const static cmatrix_t H; // name: "h" const static cmatrix_t S; // name: "s" const static cmatrix_t SDG; // name: "sdg" const static cmatrix_t T; // name: "t" const static cmatrix_t TDG; // name: "tdg" const static cmatrix_t X90; // name: "x90" // Two-qubit gates const static cmatrix_t CX; // name: "cx" const static cmatrix_t CZ; // name: "cz" const static cmatrix_t SWAP; // name: "swap" const static cmatrix_t CR; // TODO const static cmatrix_t CR90; // TODO // Identity Matrix static cmatrix_t identity(size_t dim); // Single-qubit waltz gates static cmatrix_t u1(double lam); static cmatrix_t u2(double phi, double lam); static cmatrix_t u3(double theta, double phi, double lam); // Complex arguments are implemented by taking std::real // of the input static cmatrix_t u1(complex_t lam) {return u1(std::real(lam));} static cmatrix_t u2(complex_t phi, complex_t lam) { return u2(std::real(phi), std::real(lam)); } static cmatrix_t u3(complex_t theta, complex_t phi, complex_t lam) { return u3(std::real(theta), std::real(phi), std::real(lam)); }; // Return the matrix for a named matrix string // Allowed names correspond to all the const static single-qubit // and two-qubit gate members static const cmatrix_t from_name(const std::string &name) { return *label_map_.at(name); } // Check if the input name string is allowed static bool allowed_name(const std::string &name) { return (label_map_.find(name) != label_map_.end()); } private: // Lookup table that returns a pointer to the static data member const static stringmap_t label_map_; }; //------------------------------------------------------------------------------ // Static Vectorized Matrices //------------------------------------------------------------------------------ class VMatrix { public: // Single-qubit gates const static cvector_t I; // name: "id" const static cvector_t X; // name: "x" const static cvector_t Y; // name: "y" const static cvector_t Z; // name: "z" const static cvector_t H; // name: "h" const static cvector_t S; // name: "s" const static cvector_t SDG; // name: "sdg" const static cvector_t T; // name: "t" const static cvector_t TDG; // name: "tdg" const static cvector_t X90; // name: "x90" // Two-qubit gates const static cvector_t CX; // name: "cx" const static cvector_t CZ; // name: "cz" const static cvector_t SWAP; // name: "swap" const static cvector_t CR; // TODO const static cvector_t CR90; // TODO // Identity Matrix static cvector_t identity(size_t dim); // Single-qubit waltz gates static cvector_t u1(double lam); static cvector_t u2(double phi, double lam); static cvector_t u3(double theta, double phi, double lam); // Complex arguments are implemented by taking std::real // of the input static cvector_t u1(complex_t lam) {return u1(std::real(lam));} static cvector_t u2(complex_t phi, complex_t lam) { return u2(std::real(phi), std::real(lam)); } static cvector_t u3(complex_t theta, complex_t phi, complex_t lam) { return u3(std::real(theta), std::real(phi), std::real(lam)); }; // Return the matrix for a named matrix string // Allowed names correspond to all the const static single-qubit // and two-qubit gate members static const cvector_t from_name(const std::string &name) { return *label_map_.at(name); } // Check if the input name string is allowed static bool allowed_name(const std::string &name) { return (label_map_.find(name) != label_map_.end()); } private: // Lookup table that returns a pointer to the static data member const static stringmap_t label_map_; }; //------------------------------------------------------------------------------ // Static Superoperator Matrices //------------------------------------------------------------------------------ class SMatrix { public: // Single-qubit gates const static cmatrix_t I; // name: "id" const static cmatrix_t X; // name: "x" const static cmatrix_t Y; // name: "y" const static cmatrix_t Z; // name: "z" const static cmatrix_t H; // name: "h" const static cmatrix_t S; // name: "s" const static cmatrix_t SDG; // name: "sdg" const static cmatrix_t T; // name: "t" const static cmatrix_t TDG; // name: "tdg" const static cmatrix_t X90; // name: "x90" // Two-qubit gates const static cmatrix_t CX; // name: "cx" const static cmatrix_t CZ; // name: "cz" const static cmatrix_t SWAP; // name: "swap" // Identity Matrix static cmatrix_t identity(size_t dim); // Single-qubit waltz gates static cmatrix_t u1(double lam); static cmatrix_t u2(double phi, double lam); static cmatrix_t u3(double theta, double phi, double lam); // Complex arguments are implemented by taking std::real // of the input static cmatrix_t u1(complex_t lam) {return u1(std::real(lam));} static cmatrix_t u2(complex_t phi, complex_t lam) { return u2(std::real(phi), std::real(lam)); } static cmatrix_t u3(complex_t theta, complex_t phi, complex_t lam) { return u3(std::real(theta), std::real(phi), std::real(lam)); }; // Return superoperator matrix for reset instruction // on specified dim statespace. // The returned matrix is (dim * dim, dim * dim). static cmatrix_t reset(size_t dim); // Return the matrix for a named matrix string // Allowed names correspond to all the const static single-qubit // and two-qubit gate members static const cmatrix_t from_name(const std::string &name) { return *label_map_.at(name); } // Check if the input name string is allowed static bool allowed_name(const std::string &name) { return (label_map_.find(name) != label_map_.end()); } private: // Lookup table that returns a pointer to the static data member const static stringmap_t label_map_; }; //------------------------------------------------------------------------------ // Matrix Functions //------------------------------------------------------------------------------ // Construct a matrix from a vector of matrix-row vectors template matrix make_matrix(const std::vector> &mat); // Reshape a length column-major vectorized matrix into a square matrix template matrix devectorize_matrix(const std::vector &vec); // Vectorize a matrix by stacking matrix columns (column-major vectorization) template std::vector vectorize_matrix(const matrix &mat); // Return the transpose a matrix template matrix transpose(const matrix &A); // Return the adjoing (Hermitian-conjugate) of a matrix template matrix> dagger(const matrix> &A); // Return the complex conjugate of a matrix template matrix> conjugate(const matrix> &A); // Given a list of matrices for a multiplexer stacks and packs them 0/1/2/... // into a single 2^control x (2^target x 2^target) cmatrix_t) // Equivalent to a 2^qubits x 2^target "flat" matrix template matrix stacked_matrix(const std::vector> &mmat); // Return a vector containing the diagonal of a matrix template std::vector matrix_diagonal(const matrix& mat); // Inplace transformations template matrix& transpose_inplace(matrix &A); template matrix>& dagger_inplace(matrix> &A); template matrix>& conjugate_inplace(matrix> &A); // Tracing template T trace(const matrix &A); template matrix partial_trace_a(const matrix &rho, size_t dimA); template matrix partial_trace_b(const matrix &rho, size_t dimB); // Tensor product template matrix tensor_product(const matrix &A, const matrix &B); template matrix unitary_superop(const matrix &mat); // concatenate // Returns a matrix that is the concatenation of two matrices A, B // The matrices must have the same dimensions // If axis == 0, place rows of B after rows of A (vertical extension) // If axis == 1, place columns of B after columns of A (horizontal extension) template matrix concatenate (const matrix &A, const matrix &B, uint_t axis); // split // Splits A into 2 matrices B and C equal in dimensions // If axis == 0, split A by rows. A must have an even number of rows. // If axis == 1, split A by columns. A must have an even number of columns. template void split (const matrix &A, matrix &B, matrix &C, uint_t axis); //Elementwise matrix multiplication template matrix elementwise_multiplication(const matrix &A, const matrix &B); //Matrix sum of elements template T sum(const matrix &A); // Matrix comparison template bool is_square(const matrix &mat); template bool is_diagonal(const matrix &mat); template bool is_equal(const matrix &mat1, const matrix &mat2, double threshold); template bool is_diagonal(const matrix &mat, double threshold); template std::pair is_identity_phase(const matrix &mat, double threshold); template bool is_identity(const matrix &mat, double threshold); template bool is_diagonal_identity(const matrix &mat, double threshold); template bool is_unitary(const matrix &mat, double threshold); template bool is_hermitian(const matrix &mat, double threshold); template bool is_symmetrix(const matrix &mat, double threshold); template bool is_cptp_kraus(const std::vector> &kraus, double threshold); //------------------------------------------------------------------------------ // Vector functions //------------------------------------------------------------------------------ // Return true of the vector has norm-1. template double is_unit_vector(const std::vector &vec); // Conjugate a vector template std::vector> conjugate(const std::vector> &v); // Compute the Euclidean 2-norm of a vector template double norm(const std::vector &vec); // Return the matrix formed by taking the outproduct of two vector |ket> matrix outer_product(const std::vector &ket, const std::vector &bra); template inline matrix projector(const std::vector &ket) {return outer_product(ket, ket);} // Tensor product vector template std::vector tensor_product(const std::vector &v, const std::vector &w); // Return a new vector formed by multiplying each element of the input vector // with a scalar. The product of types T1 * T2 must be valid. template std::vector scalar_multiply(const std::vector &vec, T2 val); // Inplace multiply each entry in a vector by a scalar and returns a reference to // the input vector argument. The product of types T1 * T2 must be valid. template std::vector& scalar_multiply_inplace(std::vector &vec, T2 scalar); // Truncate the first argument its absolute value is less than epsilon // this function returns a refernce to the chopped first argument double &chop_inplace(double &val, double epsilon); std::complex &chop_inplace(std::complex &val, double epsilon); double chop(double val, double epsilon); // As above for complex first arguments template std::complex chop(std::complex val, double epsilon); // Truncate each element in a vector if its absolute value is less than epsilon // This function returns a reference to the chopped input vector template std::vector &chop_inplace(std::vector &vec, double epsilon); template std::vector chop(const std::vector &vec, double epsilon); // Add rhs vector to lhs using move semantics. // rhs should not be used after this operation. template void combine(std::vector &lhs, const std::vector &rhs); // Convert a dense vector into sparse ket form. // epsilon determins the threshold for which small values will be removed from // the output. The base of the ket (2-10 for qudits, or 16 for hexadecimal) // specifies the subsystem dimension and the base of the dit-string labels. template std::map vec2ket(const std::vector &vec, double epsilon, uint_t base = 2); //------------------------------------------------------------------------------ // Bit Conversions //------------------------------------------------------------------------------ // Format a hex string so that it has a prefix "0x", abcdef chars are lowercase // and leading zeros are removed // Example: 0010A -> 0x10a std::string format_hex(const std::string &hex); std::string& format_hex_inplace(std::string &hex); // Pad string with a char if it is less std::string padleft(const std::string &s, char c, size_t min_length); std::string& padleft_inplace(std::string &s, char c, size_t min_length); // Convert integers and hexadecimals to register vectors reg_t int2reg(uint_t n, uint_t base = 2); reg_t int2reg(uint_t n, uint_t base, uint_t minlen); reg_t hex2reg(std::string str); // Convert bit-strings to hex-strings // if prefix is true "0x" will prepend the output string std::string bin2hex(const std::string bin, bool prefix = true); // Convert hex-strings to bit-strings // if prefix is true "0b" will prepend the output string std::string hex2bin(const std::string bs, bool prefix = true); // Convert 64-bit unsigned integers to dit-string (dit base = 2 to 10) std::string int2string(uint_t n, uint_t base = 2); std::string int2string(uint_t n, uint_t base, uint_t length); // Convert integers to bit-strings inline std::string int2bin(uint_t n) {return int2string(n, 2);} inline std::string int2bin(uint_t n, uint_t length) {return int2string(n, 2, length);} // Convert integers to hex-strings inline std::string int2hex(uint_t n) {return bin2hex(int2bin(n));} // Convert reg to int uint_t reg2int(const reg_t ®, uint_t base); //============================================================================== // Implementations: Static Matrices //============================================================================== const cmatrix_t Matrix::I = make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {1, 0}}}); const cmatrix_t Matrix::X = make_matrix({{{0, 0}, {1, 0}}, {{1, 0}, {0, 0}}}); const cmatrix_t Matrix::Y = make_matrix({{{0, 0}, {0, -1}}, {{0, 1}, {0, 0}}}); const cmatrix_t Matrix::Z = make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {-1, 0}}}); const cmatrix_t Matrix::S = make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {0, 1}}}); const cmatrix_t Matrix::SDG = make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {0, -1}}}); const cmatrix_t Matrix::T = make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {1 / std::sqrt(2), 1 / std::sqrt(2)}}}); const cmatrix_t Matrix::TDG = make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {1 / std::sqrt(2), -1 / std::sqrt(2)}}}); const cmatrix_t Matrix::H = make_matrix({{{1 / std::sqrt(2.), 0}, {1 / std::sqrt(2.), 0}}, {{1 / std::sqrt(2.), 0}, {-1 / std::sqrt(2.), 0}}}); const cmatrix_t Matrix::X90 = make_matrix({{{1. / std::sqrt(2.), 0}, {0, -1. / std::sqrt(2.)}}, {{0, -1. / std::sqrt(2.)}, {1. / std::sqrt(2.), 0}}}); const cmatrix_t Matrix::CX = make_matrix({{{1, 0}, {0, 0}, {0, 0}, {0, 0}}, {{0, 0}, {0, 0}, {0, 0}, {1, 0}}, {{0, 0}, {0, 0}, {1, 0}, {0, 0}}, {{0, 0}, {1, 0}, {0, 0}, {0, 0}}}); const cmatrix_t Matrix::CZ = make_matrix({{{1, 0}, {0, 0}, {0, 0}, {0, 0}}, {{0, 0}, {1, 0}, {0, 0}, {0, 0}}, {{0, 0}, {0, 0}, {1, 0}, {0, 0}}, {{0, 0}, {0, 0}, {0, 0}, {-1, 0}}}); const cmatrix_t Matrix::SWAP = make_matrix({{{1, 0}, {0, 0}, {0, 0}, {0, 0}}, {{0, 0}, {0, 0}, {1, 0}, {0, 0}}, {{0, 0}, {1, 0}, {0, 0}, {0, 0}}, {{0, 0}, {0, 0}, {0, 0}, {1, 0}}}); // TODO const cmatrix_t Matrix::CR = ... // TODO const cmatrix_t Matrix::CR90 = ... // Lookup table const stringmap_t Matrix::label_map_ = { {"id", &Matrix::I}, {"x", &Matrix::X}, {"y", &Matrix::Y}, {"z", &Matrix::Z}, {"h", &Matrix::H}, {"s", &Matrix::S}, {"sdg", &Matrix::SDG}, {"t", &Matrix::T}, {"tdg", &Matrix::TDG}, {"x90", &Matrix::X90}, {"cx", &Matrix::CX}, {"cz", &Matrix::CZ}, {"swap", &Matrix::SWAP} }; cmatrix_t Matrix::identity(size_t dim) { cmatrix_t mat(dim, dim); for (size_t j=0; j VMatrix::label_map_ = { {"id", &VMatrix::I}, {"x", &VMatrix::X}, {"y", &VMatrix::Y}, {"z", &VMatrix::Z}, {"h", &VMatrix::H}, {"s", &VMatrix::S}, {"sdg", &VMatrix::SDG}, {"t", &VMatrix::T}, {"tdg", &VMatrix::TDG}, {"x90", &VMatrix::X90}, {"cx", &VMatrix::CX}, {"cz", &VMatrix::CZ}, {"swap", &VMatrix::SWAP} }; cvector_t VMatrix::identity(size_t dim) { cvector_t mat(dim * dim); for (size_t j=0; j SMatrix::label_map_ = { {"id", &SMatrix::I}, {"x", &SMatrix::X}, {"y", &SMatrix::Y}, {"z", &SMatrix::Z}, {"h", &SMatrix::H}, {"s", &SMatrix::S}, {"sdg", &SMatrix::SDG}, {"t", &SMatrix::T}, {"tdg", &SMatrix::TDG}, {"x90", &SMatrix::X90}, {"cx", &SMatrix::CX}, {"cz", &SMatrix::CZ}, {"swap", &SMatrix::SWAP} }; cmatrix_t SMatrix::identity(size_t dim) { return Matrix::identity(dim * dim); } cmatrix_t SMatrix::u1(double lambda) { cmatrix_t mat(4, 4); mat(0, 0) = {1., 0.}; mat(1, 1) = std::exp(complex_t(0., lambda)); mat(2, 2) = std::exp(complex_t(0., -lambda)); mat(3, 3) = {1., 0.}; return mat; } cmatrix_t SMatrix::u2(double phi, double lambda) { return tensor_product(Matrix::u2(-phi, -lambda), Matrix::u2(phi, lambda)); } cmatrix_t SMatrix::u3(double theta, double phi, double lambda) { return tensor_product(Matrix::u3(theta, -phi, -lambda), Matrix::u3(theta, phi, lambda)); } cmatrix_t SMatrix::reset(size_t dim) { cmatrix_t mat(dim * dim, dim * dim); for (size_t j=0; j < dim; j++) { mat(0, j * (dim + 1)) = 1.; } return mat; } //============================================================================== // Implementations: Matrix functions //============================================================================== template matrix devectorize_matrix(const std::vector& vec) { size_t dim = std::sqrt(vec.size()); matrix mat(dim, dim); for (size_t col=0; col < dim; col++) for (size_t row=0; row < dim; row++) { mat(row, col) = vec[dim * col + row]; } return mat; } template std::vector vectorize_matrix(const matrix& mat) { std::vector vec; vec.resize(mat.size(), 0.); size_t nrows = mat.GetRows(); size_t ncols = mat.GetColumns(); for (size_t col=0; col < ncols; col++) for (size_t row=0; row < nrows; row++) { vec[nrows * col + row] = mat(row, col); } return vec; } template matrix make_matrix(const std::vector> & mat) { size_t nrows = mat.size(); size_t ncols = mat[0].size(); matrix ret(nrows, ncols); for (size_t row = 0; row < nrows; row++) for (size_t col = 0; col < nrows; col++) { ret(row, col) = mat[row][col]; } return ret; } template matrix transpose(const matrix &A) { // Transposes a Matrix const size_t rows = A.GetRows(), cols = A.GetColumns(); matrix temp(cols, rows); for (size_t i = 0; i < rows; i++) { for (size_t j = 0; j < cols; j++) { temp(j, i) = A(i, j); } } return temp; } template matrix> dagger(const matrix> &A) { // Take the Hermitian conjugate of a complex matrix const size_t cols = A.GetColumns(), rows = A.GetRows(); matrix> temp(cols, rows); for (size_t i = 0; i < rows; i++) { for (size_t j = 0; j < cols; j++) { temp(j, i) = std::conj(A(i, j)); } } return temp; } template matrix> conjugate(const matrix> &A) { // Take the complex conjugate of a complex matrix const size_t rows = A.GetRows(), cols = A.GetColumns(); matrix> temp(rows, cols); for (size_t i = 0; i < rows; i++) { for (size_t j = 0; j < cols; j++) { temp(i, j) = std::conj(A(i, j)); } } return temp; } template matrix stacked_matrix(const std::vector> &mmat){ size_t size_of_controls = mmat[0].GetRows(); // or GetColumns, as these matrices are (should be) square size_t number_of_controls = mmat.size(); // Pack vector of matrices into single (stacked) matrix ... note: matrix dims: rows = (stacked_rows x size_of_controls) where: // stacked_rows is the number of control matrices * the size (#rows or #columns) of each control matrix // size_of_controls is the #rows (or #columns) of each control matrix uint_t stacked_rows = number_of_controls*size_of_controls; // Used only for clarity in allocating the matrix cmatrix_t stacked_matrix(stacked_rows, size_of_controls); for(uint_t row = 0; row < stacked_rows; row++) for(uint_t col = 0; col < size_of_controls; col++) stacked_matrix(row, col) = {0.0, 0.0}; for(uint_t mmat_number = 0; mmat_number < mmat.size(); mmat_number++) { for(uint_t row = 0; row < size_of_controls; row++) { for(uint_t col = 0; col < size_of_controls; col++) { stacked_matrix(mmat_number * size_of_controls + row, col) = mmat[mmat_number](row, col); } } } return stacked_matrix; } template std::vector matrix_diagonal(const matrix& mat) { std::vector vec; size_t size = std::min(mat.GetRows(), mat.GetColumns()); vec.resize(size, 0.); for (size_t i=0; i < size; i++) vec[i] = mat(i, i); return vec; } template matrix& transpose_inplace(matrix &A) { // Transposes a Matrix const size_t rows = A.GetRows(), cols = A.GetColumns(); for (size_t i = 0; i < rows; i++) { for (size_t j = i + 1; j < cols; j++) { const auto tmp = A(i, j); A(i, j) = A(j, i); A(j, i) = tmp; } } return A; } template matrix>& dagger_inplace(matrix> &A) { // Take the Hermitian conjugate of a complex matrix const size_t cols = A.GetColumns(), rows = A.GetRows(); matrix> temp(cols, rows); for (size_t i = 0; i < rows; i++) { A(i, i) = conj(A(i, i)); for (size_t j = i + 1; j < cols; j++) { const auto tmp = conj(A(i, j)); A(i, j) = conj(A(j, i)); A(j, i) = tmp; } } return A; } template matrix>& conj_inplace(matrix> &A) { // Take the complex conjugate of a complex matrix const size_t rows = A.GetRows(), cols = A.GetColumns(); for (size_t i = 0; i < rows; i++) { for (size_t j = 0; j < cols; j++) { A(i, j) = conj(A(i, j)); } } return A; } template T trace(const matrix &A) { // Finds the trace of a matrix size_t rows = A.GetRows(), cols = A.GetColumns(); if (rows != cols) { throw std::invalid_argument("MU::trace: matrix is not square"); } T temp = 0.0; for (size_t i = 0; i < rows; i++) { temp = temp + A(i, i); } return temp; } template matrix partial_trace_a(const matrix &rho, size_t dimA) { // Traces out first system (dimension dimA) of composite Hilbert space size_t rows = rho.GetRows(), cols = rho.GetColumns(); if (rows != cols) { throw std::invalid_argument("MU::partial_trace_a: matrix is not square"); } if (rows % dimA != 0) { throw std::invalid_argument("MU::partial_trace_a: dim(rho)/dim(system b) is not an integer"); } size_t dimB = rows / dimA; matrix rhoB(dimB, dimB); T temp = 0.0; for (size_t i = 0; i < dimB; i++) { for (size_t j = 0; j < dimB; j++) { for (size_t k = 0; k < dimA; k++) { temp = temp + rho(i + dimB * k, j + dimB * k); } rhoB(i, j) = temp; temp = 0.0; } } return rhoB; } template matrix partial_trace_b(const matrix &rho, size_t dimB) { // Traces out second system (dimension dimB) of composite Hilbert space size_t rows = rho.GetRows(), cols = rho.GetColumns(); if (rows != cols) { throw std::invalid_argument("MU::partial_trace_b: matrix is not square"); } if (rows % dimB != 0) { throw std::invalid_argument("MU::partial_trace_b: dim(rho)/dim(system a) is not an integer"); } size_t dimA = rows / dimB; matrix rhoA(dimA, dimA); T temp = 0.0; for (size_t i = 0; i < dimA; i++) { size_t offsetX = i * dimB; for (size_t j = 0; j < dimA; j++) { size_t offsetY = j * dimB; for (size_t k = 0; k < dimB; k++) { temp = temp + rho(offsetX + k, offsetY + k); } rhoA(i, j) = temp; temp = 0.0; } } return rhoA; } template matrix tensor_product(const matrix &A, const matrix &B) { // Works out the TensorProduct of two matricies A tensor B // Note that if A is i x j and B is p x q then A \otimes B is an ip x jq // rmatrix // If A or B is empty it will return the other matrix if (A.size() == 0) return B; if (B.size() == 0) return A; size_t rows1 = A.GetRows(), rows2 = B.GetRows(), cols1 = A.GetColumns(), cols2 = B.GetColumns(); size_t rows_new = rows1 * rows2, cols_new = cols1 * cols2, n, m; matrix temp(rows_new, cols_new); // a11 B, a12 B ... a1j B // ai1 B, ai2 B ... aij B for (size_t i = 0; i < rows1; i++) { for (size_t j = 0; j < cols1; j++) { for (size_t p = 0; p < rows2; p++) { for (size_t q = 0; q < cols2; q++) { n = i * rows2 + p; m = j * cols2 + q; // 0 (0 + 1) + 1*dimb=2 + (0 + 1 ) (j*dimb+q) temp(n, m) = A(i, j) * B(p, q); } } } } return temp; } template matrix unitary_superop(const matrix &mat) { return tensor_product(conjugate(mat), mat); } template matrix concatenate (const matrix &A, const matrix &B, uint_t axis) { if (axis != 0 && axis!= 1) { throw std::invalid_argument("Utils::concatenate: axis must be 0 or 1"); } size_t rows1 = A.GetRows(), rows2 = B.GetRows(), cols1 = A.GetColumns(), cols2 = B.GetColumns(); matrix temp = A; if(axis == 0) { if(cols1 != cols2) { throw std::invalid_argument("Utils::concatenate: axis must be 0 or 1"); } temp.resize(rows1 + rows2, cols1); for (size_t i = 0; i < rows2; i++) for (size_t j = 0; j < cols1; j++) temp(rows1 + i,j) = B(i,j); } else if(axis == 1) { if(rows1 != rows2) { throw std::invalid_argument("Utils::concatenate: the 2 matrices have a different number of rows"); } temp.resize(rows1, cols1 + cols2); for (size_t i = 0; i < rows1; i++) for (size_t j = 0; j < cols2; j++) temp(i,cols1 + j) = B(i,j); } return temp; } template void split (const matrix &A, matrix &B, matrix &C, uint_t axis) { if (axis != 0 && axis != 1) { throw std::invalid_argument("Utils::split: axis must be 0 or 1"); } size_t rows = A.GetRows(), cols = A.GetColumns(); matrix temp = A; if(axis == 0) { if (rows % 2 != 0) { throw std::invalid_argument("Utils::split: can't split matrix A by rows"); } B.resize(rows/2 , cols); C.resize(rows/2 , cols); for (size_t i = 0; i < rows/2; i++) { for (size_t j = 0; j < cols; j++) { B(i,j) = A(i,j); C(i,j) = A(i+rows/2,j); } } } else if(axis == 1) { if (cols % 2 != 0) { throw std::invalid_argument("Utils::split: can't split matrix A by columns"); } B.resize(rows, cols/2); C.resize(rows, cols/2); for (size_t i = 0; i < rows; i++){ for (size_t j = 0; j < cols/2; j++) { B(i,j) = A(i,j); C(i,j) = A(i,j+cols/2); } } } } template matrix elementwise_multiplication(const matrix &A, const matrix &B) { // Works out an elementwise multiplication of two matrices A, B // If A or B is empty it will return the other matrix size_t rows1 = A.GetRows(), rows2 = B.GetRows(), cols1 = A.GetColumns(), cols2 = B.GetColumns(); if(rows1 != rows2 || cols1 != cols2) { throw std::invalid_argument("Utils::elementwise_multiplication: matrices have different sizes"); } matrix temp(rows1, cols1); for (size_t i = 0; i < rows1; i++) for (size_t j = 0; j < cols1; j++) temp(i, j) = A(i, j) * B(i, j); return temp; } template T sum(const matrix &A){ T temp = 0; for(uint_t i = 0; i < A.size(); i++) temp += A[i]; return temp; } template bool is_square(const matrix &mat) { if (mat.GetRows() != mat.GetColumns()) return false; return true; } template bool is_diagonal(const matrix &mat) { // Check if row-matrix for diagonal if (mat.GetRows() == 1 && mat.GetColumns() > 0) return true; return false; } template bool is_equal(const matrix &mat1, const matrix &mat2, double threshold) { // Check matrices are same shape const auto nrows = mat1.GetRows(); const auto ncols = mat1.GetColumns(); if (nrows != mat2.GetRows() || ncols != mat2.GetColumns()) return false; // Check matrices are equal on an entry by entry basis double delta = 0; for (size_t i=0; i < nrows; i++) { for (size_t j=0; j < ncols; j++) { delta += std::real(std::abs(mat1(i, j) - mat2(i, j))); } } return (delta < threshold); } template bool is_diagonal(const matrix &mat, double threshold) { // Check U matrix is identity const auto nrows = mat.GetRows(); const auto ncols = mat.GetColumns(); if (nrows != ncols) return false; for (size_t i=0; i < nrows; i++) for (size_t j=0; j < ncols; j++) if (i != j && std::real(std::abs(mat(i, j))) > threshold) return false; return true; } template std::pair is_identity_phase(const matrix &mat, double threshold) { // To check if identity we first check we check that: // 1. U(0,0) = exp(i * theta) // 2. U(i, i) = U(0, 0) // 3. U(i, j) = 0 for j != i auto failed = std::make_pair(false, 0.0); // Check condition 1. const auto u00 = mat(0, 0); //if (std::norm(std::abs(u00) - 1.0) > threshold) // return failed; if (std::norm(std::abs(u00) - 1.0) > threshold) { return failed; } const auto theta = std::arg(u00); // Check conditions 2 and 3 double delta = 0.; const auto nrows = mat.GetRows(); const auto ncols = mat.GetColumns(); if (nrows != ncols) return failed; for (size_t i=0; i < nrows; i++) { for (size_t j=0; j < ncols; j++) { auto val = (i==j) ? std::norm(mat(i, j) - u00) : std::norm(mat(i, j)); if (val > threshold) { return failed; // fail fast if single entry differs } else delta += val; // accumulate difference } } // Check small errors didn't accumulate if (delta > threshold) { return failed; } // Otherwise we pass return std::make_pair(true, theta); } template bool is_identity(const matrix &mat, double threshold) { // Check mat(0, 0) == 1 if (std::norm(mat(0, 0) - T(1)) > threshold) return false; // If this passes now use is_identity_phase (and we know // phase will be zero). return is_identity_phase(mat, threshold).first; } template bool is_diagonal_identity(const matrix &mat, double threshold) { // Check U matrix is identity if (is_diagonal(mat, threshold) == false) return false; double delta = 0.; const auto ncols = mat.GetColumns(); for (size_t j=0; j < ncols; j++) { delta += std::real(std::abs(mat(0, j) - 1.0)); } return (delta < threshold); } template bool is_unitary(const matrix &mat, double threshold) { size_t nrows = mat.GetRows(); size_t ncols = mat.GetColumns(); // Check if diagonal row-matrix if (nrows == 1) { for (size_t j=0; j < ncols; j++) { double delta = std::abs(1.0 - std::real(std::abs(mat(0, j)))); if (delta > threshold) return false; } return true; } // Check U matrix is square if (nrows != ncols) return false; // Check U matrix is unitary const matrix check = mat * dagger(mat); return is_identity(check, threshold); } template bool is_hermitian_matrix(const matrix &mat, double threshold) { return is_equal(mat, dagger(mat), threshold); } template bool is_symmetrix(const matrix &mat, double threshold) { return is_equal(mat, transpose(mat), threshold); } template bool is_cptp_kraus(const std::vector> &mats, double threshold) { matrix cptp(mats[0].size()); for (const auto &mat : mats) { cptp = cptp + dagger(mat) * mat; } return is_identity(cptp, threshold); } //============================================================================== // Implementations: Vector functions //============================================================================== template bool is_unit_vector(const std::vector &vec, double threshold) { return (std::abs(norm(vec) - 1.0) < threshold); } template std::vector> conjugate(const std::vector> &v) { std::vector> ret; std::transform(v.cbegin(), v.cend(), std::back_inserter(ret), [] (const std::complex &c) -> std::complex { return std::conj(c); }); return ret; } template double norm(const std::vector &vec) { double val = 0.0; for (const auto v : vec) { val += std::real(v * std::conj(v)); } return std::sqrt(val); } template matrix outer_product(const std::vector &ket, const std::vector &bra) { const uint_t d1 = ket.size(); const uint_t d2 = bra.size(); matrix ret(d1, d2); for (uint_t i = 0; i < d1; i++) for (uint_t j = 0; j < d2; j++) { ret(i, j) = ket[i] * std::conj(bra[j]); } return ret; } template std::vector tensor_product(const std::vector &vec1, const std::vector &vec2) { std::vector ret; ret.reserve(vec1.size() * vec2.size()); for (const auto &a : vec1) for (const auto &b : vec2) { ret.push_back(a * b); } return ret; } template std::vector scalar_multiply(const std::vector &vec, T2 val) { std::vector ret; ret.reserve(vec.size()); for (const auto &elt : vec) { ret.push_back(val * elt); } return ret; } template std::vector& scalar_multiply_inplace(std::vector &vec, T2 val) { for (auto &elt : vec) { elt = val * elt; // use * incase T1 doesn't have *= method } return vec; } double &chop_inplace(double &val, double epsilon) { if (std::abs(val) < epsilon) val = 0.; return val; } std::complex &chop_inplace(std::complex &val, double epsilon) { val.real(chop(val.real(), epsilon)); val.imag(chop(val.imag(), epsilon)); return val; } template std::vector &chop_inplace(std::vector &vec, double epsilon) { if (epsilon > 0.) for (auto &v : vec) chop_inplace(v, epsilon); return vec; } double chop(double val, double epsilon) { return (std::abs(val) < epsilon) ? 0. : val; } template std::complex chop(std::complex val, double epsilon) { return {chop(val.real(), epsilon), chop(val.imag(), epsilon)}; } template std::vector chop(const std::vector &vec, double epsilon) { std::vector tmp; tmp.reserve(vec.size()); for (const auto &v : vec) tmp.push_back(chop(v, epsilon)); return tmp; } template void combine(std::vector &lhs, const std::vector &rhs) { // if lhs is empty, set it to be rhs vector if (lhs.size() == 0) { lhs = rhs; return; } // if lhs is not empty rhs must be same size if (lhs.size() != rhs.size()) { throw std::invalid_argument("Utils::combine (vectors are not same length.)"); } for (size_t j=0; j < lhs.size(); ++j) { lhs[j] += rhs[j]; } } template std::map vec2ket(const std::vector &vec, double epsilon, uint_t base) { bool hex_output = false; if (base == 16) { hex_output = true; base = 2; // If hexadecimal strings we convert to bin first } // check vector length size_t dim = vec.size(); double n = std::log(dim) / std::log(base); uint_t nint = std::trunc(n); if (std::abs(nint - n) > 1e-5) { std::stringstream ss; ss << "vec2ket (vector dimension " << dim << " is not of size " << base << "^n)"; throw std::invalid_argument(ss.str()); } std::map ketmap; for (size_t k = 0; k < dim; ++k) { T val = chop(vec[k], epsilon); if (std::abs(val) > epsilon) { std::string key = (hex_output) ? Utils::int2hex(k) : Utils::int2string(k, base, nint); ketmap.insert({key, val}); } } return ketmap; } //============================================================================== // Implementations: Bit conversions //============================================================================== std::string& format_hex_inplace(std::string &hex) { // make abcdef and x lower case std::transform(hex.begin(), hex.end(), hex.begin(), ::tolower); // check if 0x prefix is present, add if it isn't std::string prefix = hex.substr(0, 2); if (prefix != "0x") hex = "0x" + hex; // delete leading zeros Eg 0x001 -> 0x1 hex.erase(2, std::min(hex.find_first_not_of("0", 2) - 2, hex.size() - 3)); return hex; } std::string format_hex(const std::string &hex) { std::string tmp = hex; format_hex_inplace(tmp); return tmp; } std::string& padleft_inplace(std::string &s, char c, size_t min_length) { auto l = s.size(); if (l < min_length) s = std::string(min_length - l, c) + s; return s; } std::string padleft(const std::string &s, char c, size_t min_length) { std::string tmp = s; return padleft_inplace(tmp, c, min_length); } reg_t int2reg(uint_t n, uint_t base) { reg_t ret; while (n >= base) { ret.push_back(n % base); n /= base; } ret.push_back(n); // last case n < base; return ret; } reg_t int2reg(uint_t n, uint_t base, uint_t minlen) { reg_t ret = int2reg(n, base); if (ret.size() < minlen) // pad vector with zeros ret.resize(minlen); return ret; } reg_t hex2reg(std::string str) { reg_t reg; std::string prefix = str.substr(0, 2); if (prefix == "0x" || prefix == "0X") { // Hexadecimal str.erase(0, 2); // remove '0x'; size_t length = (str.size() % 8) + 32 * (str.size() / 8); reg.reserve(length); while (str.size() > 8) { unsigned long hex = stoull(str.substr(str.size() - 8), nullptr, 16); reg_t tmp = int2reg(hex, 2, 32); std::move(tmp.begin(), tmp.end(), back_inserter(reg)); str.erase(str.size() - 8); } if (str.size() > 0) { reg_t tmp = int2reg(stoul(str, nullptr, 16), 2, 0); std::move(tmp.begin(), tmp.end(), back_inserter(reg)); } return reg; } else { throw std::runtime_error(std::string("invalid hexadecimal")); } } std::string hex2bin(std::string str, bool prefix) { // empty case if (str.empty()) return std::string(); // If string starts with 0b prob prefix if (str.size() > 1 && str.substr(0, 2) == "0x") { str.erase(0, 2); } // We go via long integer conversion, so we process 64-bit chunks at // a time const size_t block = 8; const size_t len = str.size(); const size_t chunks = len / block; const size_t remain = len % block; // Initialize output string std::string bin = (prefix) ? "0b" : ""; // Start with remain bin += int2string(std::stoull(str.substr(0, remain), nullptr, 16), 2); for (size_t j=0; j < chunks; ++j) { std::string part = int2string(std::stoull(str.substr(remain + j * block, block), nullptr, 16), 2, 64); bin += part; } return bin; } std::string bin2hex(std::string str, bool prefix) { // empty case if (str.empty()) return std::string(); // If string starts with 0b prob prefix if (str.size() > 1 && str.substr(0, 2) == "0b") { str.erase(0, 2); } // We go via long integer conversion, so we process 64-bit chunks at // a time const size_t bin_block = 64; const size_t hex_block = bin_block / 4; const size_t len = str.size(); const size_t chunks = len / bin_block; const size_t remain = len % bin_block; // initialize output string std::string hex = (prefix) ? "0x" : ""; // Add remainder if (remain > 0) { // Add remainder std::stringstream ss; ss << std::hex << std::stoull(str.substr(0, remain), nullptr, 2); hex += ss.str(); } // Add > 64 bit chunks if (chunks > 0) { // Add last 64-bit chunk std::stringstream ss; ss << std::hex << std::stoull(str.substr(remain, bin_block), nullptr, 2); std::string part = ss.str(); if (remain > 0) { part.insert(0, hex_block - part.size(), '0'); // pad out zeros } hex += part; // Add any additional chunks for (size_t j=1; j < chunks; ++j) { ss = std::stringstream(); // clear string stream ss << std::hex << std::stoull(str.substr(remain + j * bin_block, bin_block), nullptr, 2); part = ss.str(); part.insert(0, hex_block - part.size(), '0'); hex += part; } } return hex; } uint_t reg2int(const reg_t ®, uint_t base) { uint_t ret = 0; if (base == 2) { // For base-2 use bit-shifting for (size_t j=0; j < reg.size(); j++) if (reg[j]) ret += (1ULL << j); } else { // For other bases use exponentiation for (size_t j=0; j < reg.size(); j++) if (reg[j] > 0) ret += reg[j] * static_cast(pow(base, j)); } return ret; } std::string int2string(uint_t n, uint_t base) { if (base < 2 || base > 10) { throw std::invalid_argument("Utils::int2string base must be between 2 and 10."); } if (n < base) return std::to_string(n); else return int2string(n / base, base) + std::to_string(n % base); } std::string int2string(uint_t n, uint_t base, uint_t minlen) { std::string tmp = int2string(n, base); return padleft_inplace(tmp, '0', minlen); } //------------------------------------------------------------------------------ } // end namespace Utils //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/misc/000077500000000000000000000000001362723322000153075ustar00rootroot00000000000000qiskit-aer-0.4.1/src/misc/clang_omp_symbols.hpp000066400000000000000000000442441362723322000215370ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_misc_hacks_clang_symbols_ #define _aer_misc_hacks_clang_symbols_ /* * This is some sort of "black magic" to solve a problem we have with OpenMP libraries on Mac. * The problem is actually in the library itself, but it's out of our control, so we had to * fix it this way. * Symbol signatures are taken from: https://github.com/llvm/llvm-project/blob/master/openmp/runtime/src/kmp.h */ #include #include // Define undefined symbols extern "C" { typedef struct { int reserved_1; int flags; int reserved_2; int reserved_3; char *psource; }id; typedef int kmp_int32; typedef struct ident { kmp_int32 reserved_1; /**< might be used in Fortran; see above */ kmp_int32 flags; /**< also f.flags; KMP_IDENT_xxx flags; KMP_IDENT_KMPC identifies this union member */ kmp_int32 reserved_2; /**< not really used in Fortran any more; see above */ kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for C++ */ char const *psource; /**< String describing the source location. The string is composed of semi-colon separated fields which describe the source file, the function and a pair of line numbers that delimit the construct. */ } ident_t; typedef ident_t kmp_Ident; using __kmpc_barrier_t = void(*)(id*, int); __kmpc_barrier_t _hook__kmpc_barrier; void __kmpc_barrier(id* pId, int gtid){ _hook__kmpc_barrier(pId, gtid); } using __kmpc_for_static_fini_t = void(*)(kmp_Ident *, int32_t); __kmpc_for_static_fini_t _hook__kmpc_for_static_fini; void __kmpc_for_static_fini(kmp_Ident *loc, int32_t global_tid){ _hook__kmpc_for_static_fini(loc, global_tid); } using __kmpc_for_static_init_4_t = void(*)(kmp_Ident *, int32_t, int32_t, int32_t *, int32_t *, int32_t *, int32_t *, int32_t, int32_t); __kmpc_for_static_init_4_t _hook__kmpc_for_static_init_4; void __kmpc_for_static_init_4(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, int32_t *plower, int32_t *pupper, int32_t *pstride, int32_t incr, int32_t chunk){ _hook__kmpc_for_static_init_4(loc, global_tid, sched, plastiter, plower, pupper, pstride, incr, chunk); } using __kmpc_for_static_init_8_t = void(*)(kmp_Ident *, int32_t, int32_t, int32_t *, int64_t *, int64_t *, int64_t *, int64_t, int64_t); __kmpc_for_static_init_8_t _hook__kmpc_for_static_init_8; void __kmpc_for_static_init_8(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, int64_t *plower, int64_t *pupper, int64_t *pstride, int64_t incr, int64_t chunk){ _hook__kmpc_for_static_init_8(loc, global_tid, sched, plastiter, plower, pupper, pstride, incr, chunk); } using __kmpc_for_static_init_8u_t = void(*)(kmp_Ident *, int32_t, int32_t, int32_t *, uint64_t *, uint64_t *, int64_t *, int64_t, int64_t); __kmpc_for_static_init_8u_t _hook__kmpc_for_static_init_8u; void __kmpc_for_static_init_8u(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter1, uint64_t *plower, uint64_t *pupper, int64_t *pstride, int64_t incr, int64_t chunk){ _hook__kmpc_for_static_init_8u(loc, global_tid, sched, plastiter1, plower, pupper, pstride, incr, chunk); } using kpm_int32 = int; typedef void (*kmp_ParFctPtr)(kpm_int32 *global_tid, kpm_int32 *bound_tid, ...); using __kmpc_fork_call_t = void(*)(kmp_Ident *, kpm_int32, kmp_ParFctPtr, ...); __kmpc_fork_call_t _hook__kmpc_fork_call; #include void __kmpc_fork_call(kmp_Ident *loc, kpm_int32 argc, kmp_ParFctPtr microtask, ...){ va_list argptr; va_start(argptr, microtask); // The types are always pointer to void (from llvm kmp_runtime.cpp) void * arg1 = va_arg(argptr, void *); void * arg2 = va_arg(argptr, void *); void * arg3 = va_arg(argptr, void *); void * arg4 = va_arg(argptr, void *); void * arg5 = va_arg(argptr, void *); void * arg6 = va_arg(argptr, void *); void * arg7 = va_arg(argptr, void *); void * arg8 = va_arg(argptr, void *); void * arg9 = va_arg(argptr, void *); _hook__kmpc_fork_call(loc, argc, microtask, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9); va_end(argptr); } using __kmpc_push_num_threads_t = void(*)(kmp_Ident *, int32_t, int32_t); __kmpc_push_num_threads_t _hook__kmpc_push_num_threads; void __kmpc_push_num_threads(kmp_Ident *loc, int32_t global_tid, int32_t num_threads){ _hook__kmpc_push_num_threads(loc, global_tid, num_threads); } typedef kmp_int32 kmp_critical_name[8]; using __kmpc_reduce_nowait_t = kmp_int32(*)(ident_t *, kmp_int32, kmp_int32, size_t, void *, void (*)(void *lhs_data, void *rhs_data),kmp_critical_name *); __kmpc_reduce_nowait_t _hook__kmpc_reduce_nowait; kmp_int32 __kmpc_reduce_nowait( ident_t *loc, kmp_int32 global_tid, kmp_int32 num_vars, size_t reduce_size, void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data), kmp_critical_name *lck){ return _hook__kmpc_reduce_nowait(loc, global_tid, num_vars, reduce_size, reduce_data, reduce_func, lck); } using __kmpc_for_static_init_4u_t = void(*)(kmp_Ident *, int32_t, int32_t, int32_t *, uint32_t *, uint32_t *, int32_t *, int32_t, int32_t); __kmpc_for_static_init_4u_t _hook__kmpc_for_static_init_4u; void __kmpc_for_static_init_4u(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, uint32_t *plower, uint32_t *pupper, int32_t *pstride, int32_t incr, int32_t chunk){ _hook__kmpc_for_static_init_4u(loc, global_tid, sched, plastiter, plower, pupper, pstride, incr, chunk); } using __kmpc_end_reduce_nowait_t = void(*)(ident_t *, kmp_int32, kmp_critical_name *); __kmpc_end_reduce_nowait_t _hook__kmpc_end_reduce_nowait; void __kmpc_end_reduce_nowait(ident_t *loc, kmp_int32 global_tid, kmp_critical_name *lck){ _hook__kmpc_end_reduce_nowait(loc, global_tid, lck); } using __kmpc_serialized_parallel_t = void(*)(kmp_Ident *loc, uint32_t global_tid); __kmpc_serialized_parallel_t _hook__kmpc_serialized_parallel; void __kmpc_serialized_parallel(kmp_Ident *loc, uint32_t global_tid){ _hook__kmpc_serialized_parallel(loc, global_tid); } using __kmpc_end_serialized_parallel_t = void(*)(ident_t *loc, kmp_int32 global_tid); __kmpc_end_serialized_parallel_t _hook__kmpc_end_serialized_parallel; void __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid){ _hook__kmpc_end_serialized_parallel(loc, global_tid); } using __kmpc_global_thread_num_t = int(*)(id*); __kmpc_global_thread_num_t _hook__kmpc_global_thread_num; int __kmpc_global_thread_num(id* pId){ return _hook__kmpc_global_thread_num(pId); } using __kmpc_critical_t = void(*)(ident_t *, kmp_int32, kmp_critical_name *); __kmpc_critical_t _hook__kmpc_critical; void __kmpc_critical(ident_t *id, kmp_int32 global_tid, kmp_critical_name *lck){ return _hook__kmpc_critical(id, global_tid, lck); } using __kmpc_end_critical_t = void(*)(ident_t *, kmp_int32, kmp_critical_name *); __kmpc_end_critical_t _hook__kmpc_end_critical; void __kmpc_end_critical(ident_t *id, kmp_int32 global_tid, kmp_critical_name *lck){ return _hook__kmpc_end_critical(id, global_tid, lck); } using __kmpc_master_t = kmp_int32(*)(ident_t *, kmp_int32); __kmpc_master_t _hook__kmpc_master; kmp_int32 __kmpc_master(ident_t *id, kmp_int32 global_tid){ return _hook__kmpc_master(id, global_tid); } using __kmpc_end_master_t = void(*)(ident_t *, kmp_int32); __kmpc_end_master_t _hook__kmpc_end_master; void __kmpc_end_master(ident_t *id, kmp_int32 global_tid){ return _hook__kmpc_end_master(id, global_tid); } #define __KAI_KMPC_CONVENTION using omp_get_max_threads_t = int(*)(void); omp_get_max_threads_t _hook_omp_get_max_threads; int __KAI_KMPC_CONVENTION omp_get_max_threads(void) { return _hook_omp_get_max_threads(); } using omp_get_num_threads_t = int(*)(void); omp_get_num_threads_t _hook_omp_get_num_threads; int __KAI_KMPC_CONVENTION omp_get_num_threads(void) { return _hook_omp_get_num_threads(); } using omp_get_thread_num_t = int(*)(void); omp_get_thread_num_t _hook_omp_get_thread_num; int __KAI_KMPC_CONVENTION omp_get_thread_num(void) { return _hook_omp_get_thread_num(); } using omp_set_nested_t = void(*)(int); omp_set_nested_t _hook_omp_set_nested; void __KAI_KMPC_CONVENTION omp_set_nested(int foo){ _hook_omp_set_nested(foo); } using omp_get_num_procs_t = int(*)(void); omp_get_num_procs_t _hook_omp_get_num_procs; int __KAI_KMPC_CONVENTION omp_get_num_procs(void) { return _hook_omp_get_num_procs(); } // Symbols above this line would be needed in a future, if clang changes // the OpenMP implementation. So I'll keep them here just in case I need // them in the future void __kmpc_dispatch_init_4(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t lower, int32_t upper, int32_t incr, int32_t chunk); //{} void __kmpc_dispatch_init_4u(kmp_Ident *loc, int32_t global_tid, int32_t sched, uint32_t lower, uint32_t upper, int32_t incr, int32_t chunk); //{} void __kmpc_dispatch_init_8(kmp_Ident *loc, int32_t global_tid, int32_t sched, int64_t lower, int64_t upper, int64_t incr, int64_t chunk); //{} void __kmpc_dispatch_init_8u(kmp_Ident *loc, int32_t global_tid, int32_t sched, uint64_t lower, uint64_t upper, int64_t incr, int64_t chunk); //{} int __kmpc_dispatch_next_4(kmp_Ident *loc, int32_t global_tid, int32_t *plastiter, int32_t *plower, int32_t *pupper, int32_t *pstride); //{} int __kmpc_dispatch_next_4u(kmp_Ident *loc, int32_t global_tid, int32_t *plastiter, uint32_t *plower, uint32_t *pupper, int32_t *pstride); //{} int __kmpc_dispatch_next_8(kmp_Ident *loc, int32_t global_tid, int32_t *plastiter, int64_t *plower, int64_t *pupper, int64_t *pstride); //{} int __kmpc_dispatch_next_8u(kmp_Ident *loc, int32_t global_tid, int32_t *plastiter, uint64_t *plower, uint64_t *pupper, int64_t *pstride); //{} void __kmpc_dispatch_fini_4(kmp_Ident *loc, int32_t global_tid); //{} void __kmpc_dispatch_fini_4u(kmp_Ident *loc, int32_t global_tid); //{} void __kmpc_dispatch_fini_8(kmp_Ident *loc, int32_t global_tid); //{} void __kmpc_dispatch_fini_8u(kmp_Ident *loc, int32_t global_tid); //{} void __kmpc_for_static_init_4_simple_spmd(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, int32_t *plower, int32_t *pupper, int32_t *pstride, int32_t incr, int32_t chunk); //{} void __kmpc_for_static_init_4u_simple_spmd(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, uint32_t *plower, uint32_t *pupper, int32_t *pstride, int32_t incr, int32_t chunk); //{} void __kmpc_for_static_init_8_simple_spmd(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, int64_t *plower, int64_t *pupper, int64_t *pstride, int64_t incr, int64_t chunk); //{} void __kmpc_for_static_init_8u_simple_spmd(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter1, uint64_t *plower, uint64_t *pupper, int64_t *pstride, int64_t incr, int64_t chunk); //{} void __kmpc_for_static_init_4_simple_generic(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, int32_t *plower, int32_t *pupper, int32_t *pstride, int32_t incr, int32_t chunk); //{} void __kmpc_for_static_init_4u_simple_generic( kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, uint32_t *plower, uint32_t *pupper, int32_t *pstride, int32_t incr, int32_t chunk); //{} void __kmpc_for_static_init_8_simple_generic(kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter, int64_t *plower, int64_t *pupper, int64_t *pstride, int64_t incr, int64_t chunk); //{} void __kmpc_for_static_init_8u_simple_generic( kmp_Ident *loc, int32_t global_tid, int32_t sched, int32_t *plastiter1, uint64_t *plower, uint64_t *pupper, int64_t *pstride, int64_t incr, int64_t chunk); //{} } namespace AER { namespace Hacks { void populate_hooks(void * handle){ _hook__kmpc_barrier = reinterpret_cast(dlsym(handle, "__kmpc_barrier")); _hook__kmpc_for_static_fini = reinterpret_cast(dlsym(handle, "__kmpc_for_static_fini")); _hook__kmpc_end_reduce_nowait = reinterpret_cast(dlsym(handle, "__kmpc_end_reduce_nowait")); _hook__kmpc_reduce_nowait = reinterpret_cast(dlsym(handle, "__kmpc_reduce_nowait")); _hook__kmpc_for_static_init_4 = reinterpret_cast(dlsym(handle, "__kmpc_for_static_init_4")); _hook__kmpc_for_static_init_8 = reinterpret_cast(dlsym(handle, "__kmpc_for_static_init_8")); _hook__kmpc_for_static_init_8u = reinterpret_cast(dlsym(handle, "__kmpc_for_static_init_8u")); _hook__kmpc_fork_call = reinterpret_cast(dlsym(handle, "__kmpc_fork_call")); _hook__kmpc_push_num_threads = reinterpret_cast(dlsym(handle, "__kmpc_push_num_threads")); _hook__kmpc_serialized_parallel = reinterpret_cast(dlsym(handle, "__kmpc_serialized_parallel")); _hook__kmpc_end_serialized_parallel = reinterpret_cast(dlsym(handle, "__kmpc_end_serialized_parallel")); _hook__kmpc_global_thread_num = reinterpret_cast(dlsym(handle, "__kmpc_global_thread_num")); _hook__kmpc_critical = reinterpret_cast(dlsym(handle, "__kmpc_critical")); _hook__kmpc_end_critical = reinterpret_cast(dlsym(handle, "__kmpc_end_critical")); _hook__kmpc_master = reinterpret_cast(dlsym(handle, "__kmpc_master")); _hook__kmpc_end_master = reinterpret_cast(dlsym(handle, "__kmpc_end_master")); _hook_omp_get_max_threads = reinterpret_cast(dlsym(handle, "omp_get_max_threads")); _hook_omp_get_num_threads = reinterpret_cast(dlsym(handle, "omp_get_num_threads")); _hook_omp_get_thread_num = reinterpret_cast(dlsym(handle, "omp_get_thread_num")); _hook_omp_set_nested = reinterpret_cast(dlsym(handle, "omp_set_nested")); _hook_omp_get_num_procs = reinterpret_cast(dlsym(handle, "omp_get_num_procs")); } } } #endifqiskit-aer-0.4.1/src/misc/gcc_omp_symbols.hpp000066400000000000000000000103241362723322000211770ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_misc_hacks_gcc_symbols_ #define _aer_misc_hacks_gcc_symbols_ #include #include #include // These symboles were taken from: https://github.com/gcc-mirror/gcc/blob/gcc-8_2_0-release/libgomp/libgomp_g.h // Define undefined symbols extern "C" { using GOMP_atomic_start_t = void(*)(); GOMP_atomic_start_t _hook_GOMP_atomic_start; void GOMP_atomic_start (void){ _hook_GOMP_atomic_start(); } using GOMP_atomic_end_t = void(*)(); GOMP_atomic_end_t _hook_GOMP_atomic_end; void GOMP_atomic_end (void){ _hook_GOMP_atomic_end(); } using GOMP_barrier_t = void(*)(); GOMP_barrier_t _hook_GOMP_barrier; void GOMP_barrier(void){ _hook_GOMP_barrier(); } using GOMP_parallel_t = void(*)(void (*)(void *), void *, unsigned, unsigned); GOMP_parallel_t _hook_GOMP_parallel; void GOMP_parallel(void (*fn) (void *), void *data, unsigned num_threads, unsigned flags){ _hook_GOMP_parallel(fn, data, num_threads, flags); } using GOMP_critical_start_t = void(*)(); GOMP_critical_start_t _hook_GOMP_critical_start; void GOMP_critical_start(void){ _hook_GOMP_critical_start(); } using GOMP_critical_end_t = void(*)(); GOMP_critical_end_t _hook_GOMP_critical_end; void GOMP_critical_end(void){ _hook_GOMP_critical_end(); } #define __KAI_KMPC_CONVENTION using omp_get_max_threads_t = int(*)(void); omp_get_max_threads_t _hook_omp_get_max_threads; int __KAI_KMPC_CONVENTION omp_get_max_threads(void) { return _hook_omp_get_max_threads(); } using omp_set_nested_t = void(*)(int); omp_set_nested_t _hook_omp_set_nested; void __KAI_KMPC_CONVENTION omp_set_nested(int foo){ _hook_omp_set_nested(foo); } using omp_get_num_threads_t = int(*)(void); omp_get_num_threads_t _hook_omp_get_num_threads; int __KAI_KMPC_CONVENTION omp_get_num_threads(void) { return _hook_omp_get_num_threads(); } using omp_get_thread_num_t = int(*)(void); omp_get_thread_num_t _hook_omp_get_thread_num; int __KAI_KMPC_CONVENTION omp_get_thread_num(void) { return _hook_omp_get_thread_num(); } using omp_get_num_procs_t = int(*)(void); omp_get_num_procs_t _hook_omp_get_num_procs; int __KAI_KMPC_CONVENTION omp_get_num_procs(void) { return _hook_omp_get_num_procs(); } } namespace AER { namespace Hacks { void populate_hooks(void * handle){ _hook_GOMP_atomic_end = reinterpret_cast(dlsym(handle, "GOMP_atomic_end")); _hook_GOMP_atomic_start = reinterpret_cast(dlsym(handle, "GOMP_atomic_start")); _hook_GOMP_barrier = reinterpret_cast(dlsym(handle, "GOMP_barrier")); _hook_GOMP_parallel = reinterpret_cast(dlsym(handle, "GOMP_parallel")); _hook_GOMP_critical_end = reinterpret_cast(dlsym(handle, "GOMP_critical_end")); _hook_GOMP_critical_start = reinterpret_cast(dlsym(handle, "GOMP_critical_start")); _hook_omp_get_num_threads = reinterpret_cast(dlsym(handle, "omp_get_num_threads")); _hook_omp_get_max_threads = reinterpret_cast(dlsym(handle, "omp_get_max_threads")); _hook_omp_set_nested = reinterpret_cast(dlsym(handle, "omp_set_nested")); _hook_omp_get_thread_num = reinterpret_cast(dlsym(handle, "omp_get_thread_num")); _hook_omp_get_num_procs = reinterpret_cast(dlsym(handle, "omp_get_num_procs")); } } } #endifqiskit-aer-0.4.1/src/misc/hacks.hpp000066400000000000000000000052511362723322000171140ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_misc_hacks_hpp_ #define _aer_misc_hacks_hpp_ // We only need this hack for MacOS builds, // on Linux and Windows everything works fine #ifdef __APPLE__ #include #include #include #include #include #include #include #if defined(__clang__) #include "clang_omp_symbols.hpp" #elif defined(__GNUC__) || defined(__GNUG__) #include "gcc_omp_symbols.hpp" #endif namespace { /* * Returns the path to the already loaded OpenMP library, if there's no * library loaded, then load our default one. */ auto _apple_get_loaded_openmp_library = [](const std::string& default_path) -> std::string { // Iterate through all images currently in memory for (int32_t i = _dyld_image_count(); i >= 0 ; i--) { const char *image_name = _dyld_get_image_name(i); if(image_name) { // These are the only libraries we know that implement OpenMP on Mac // and that clash each other if(strstr(image_name, "libomp.dylib") || strstr(image_name, "libiomp5.dylib") || strstr(image_name, "libgomp.dylib")) { return std::string(image_name); } } } return default_path + "/libomp.dylib"; }; /* * I hope this is a temporary hack, for fixing Issue: * https://github.com/Qiskit/qiskit-aer/issues/1 */ auto _apple_maybe_load_openmp = [](const std::string& library_path) -> void { // dlopen() will return a handle to the library if this is already loaded void * handle = dlopen(_apple_get_loaded_openmp_library(library_path).c_str(), RTLD_LAZY); if(handle == nullptr){ fprintf(stderr, "WARNING: Couldn't load libomp.dylib but we needed to. Error: %s\n", dlerror()); fprintf(stderr, "Make sure you have libomp.dylib or libiomp5.dylib accesible to the program\n"); } AER::Hacks::populate_hooks(handle); }; } #endif // endif __APPLE__ namespace AER { namespace Hacks { #ifdef __APPLE__ const auto maybe_load_openmp = ::_apple_maybe_load_openmp; #else const auto maybe_load_openmp = [](const std::string& dummy) -> void {}; #endif } } #endif qiskit-aer-0.4.1/src/noise/000077500000000000000000000000001362723322000154715ustar00rootroot00000000000000qiskit-aer-0.4.1/src/noise/noise_model.hpp000066400000000000000000001206141362723322000205030ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_noise_model_hpp_ #define _aer_noise_model_hpp_ #define _USE_MATH_DEFINES #include #include "framework/operations.hpp" #include "framework/types.hpp" #include "framework/rng.hpp" #include "framework/circuit.hpp" #include "noise/quantum_error.hpp" #include "noise/readout_error.hpp" namespace AER { namespace Noise { //========================================================================= // Noise Model class //========================================================================= // This allows specification of default and individual noise parameters for // each circuit operation that may either be local (applied to the qubits // in the operation) or nonlocal (applied to different qubits). The errors // may each also be applied either before or after the operation as per // the specification of the AbstractError subclass. class NoiseModel { public: using Method = QuantumError::Method; using NoiseOps = std::vector; NoiseModel() = default; NoiseModel(const json_t &js) {load_from_json(js);} // Sample a noisy implementation of a full circuit // An RngEngine is passed in as a reference so that sampling // can be done in a thread-safe manner. // Sample methods are: // standard: each noisy op will be returned along with additional noise ops // superop: each noisy gate or reset will be returned as a single superop Circuit sample_noise(const Circuit &circ, RngEngine &rng) const; // Set sample mode to superoperator // This will cause all QuantumErrors stored in the noise model // to calculate their superoperator representations and raise // an exception if they cannot be converted. void activate_superop_method(); //----------------------------------------------------------------------- // Checking if errors types are in noise model //----------------------------------------------------------------------- // Return True if noise model contains readout errors inline bool has_readout_errors() const { return !readout_errors_.empty(); } // Return True if noise model contains quantum errors inline bool has_quantum_errors() const { return local_quantum_errors_ || nonlocal_quantum_errors_; } // Return True if noise model contains nonlocal quantum errors inline bool has_nonlocal_quantum_errors() const { return nonlocal_quantum_errors_; } // Return True if noise model contains local quantum errors inline bool has_local_quantum_errors() const { return local_quantum_errors_; } // Return true if the noise model is ideal inline bool is_ideal() const { return !has_readout_errors() && !has_quantum_errors(); } //----------------------------------------------------------------------- // Add errors to noise model //----------------------------------------------------------------------- // Load a noise model from JSON void load_from_json(const json_t &js); // Add a QuantumError to the noise model void add_quantum_error(const QuantumError &error, const stringset_t &op_labels, const std::vector &op_qubits = {}, const std::vector &noise_qubits = {}); // Add a ReadoutError to the noise model void add_readout_error(const ReadoutError &error, const std::vector &op_qubits = {}); // Set which single qubit gates should use the X90 waltz error model inline void set_x90_gates(const stringset_t &x90_gates) { x90_gates_ = x90_gates; } //----------------------------------------------------------------------- // Utils //----------------------------------------------------------------------- // Remap the qubits in the noise model. // A remapping is entered as a map {old: new} // Any qubits not in the mapping are assumed to be mapped to themselves. // Hence the sets of all keys and all values of the map must be equal. void remap_qubits(const std::unordered_map &mapping); // Return vector of noise qubits for non local error on specified label and qubits // If no nonlocal error exists an empty set is returned. std::set nonlocal_noise_qubits(const std::string label, const reg_t &qubits) const; // Set threshold for applying u1 rotation angles. // an Op for u1(theta) will only be added if |theta| > 0 and |theta - 2*pi| > 0 inline void set_u1_threshold(double threshold) { u1_threshold_ = threshold; } // Return the opset for the noise model inline const Operations::OpSet& opset() const {return opset_;} private: // Sample noise for the current operation. NoiseOps sample_noise(const Operations::Op &op, RngEngine &rng) const; // Sample noise for the current operation void sample_readout_noise(const Operations::Op &op, NoiseOps &noise_after, RngEngine &rng) const; void sample_local_quantum_noise(const Operations::Op &op, NoiseOps &noise_before, NoiseOps &noise_after, RngEngine &rng) const; void sample_nonlocal_quantum_noise(const Operations::Op &op, NoiseOps &noise_ops, NoiseOps &noise_after, RngEngine &rng) const; // Sample noise for the current operation NoiseOps sample_noise_helper(const Operations::Op &op, RngEngine &rng) const; // Sample a noisy implementation of a two-X90 pulse u3 gate NoiseOps sample_noise_x90_u3(uint_t qubit, complex_t theta, complex_t phi, complex_t lamba, RngEngine &rng) const; // Sample a noisy implementation of a single-X90 pulse u2 gate NoiseOps sample_noise_x90_u2(uint_t qubit, complex_t phi, complex_t lambda, RngEngine &rng) const; // Add a local quantum error to the noise model for specific qubits void add_local_quantum_error(const QuantumError &error, const stringset_t &op_labels, const std::vector &op_qubits); // Add a non-local Error type to the model for specific qubits void add_nonlocal_quantum_error(const QuantumError &error, const stringset_t &op_labels, const std::vector &op_qubits, const std::vector &noise_qubits); // Flags which say whether the local or nonlocal error tables are used bool local_quantum_errors_ = false; bool nonlocal_quantum_errors_ = false; // List of quantum errors std::vector quantum_errors_; // List of readout errors std::vector readout_errors_; // Set of qubits used in noise model std::set noise_qubits_; using inner_table_t = stringmap_t>; using outer_table_t = stringmap_t; // Table indexes a name with a vector of the position of noise operations inner_table_t readout_error_table_; outer_table_t local_quantum_error_table_; // Nonlocal noise lookup table. Things get messy here... // the outer map is a table from gate strings to gate qubit maps // the gate qubit map is a map from qubits to another map of target qubits // which is then the final qubit map from target qubits to error_ptr positions stringmap_t nonlocal_quantum_error_table_; // Helper function to convert reg to string for key of unordered maps/sets std::string reg2string(const reg_t ®) const; reg_t string2reg(std::string s) const; std::string remap_string(const std::string key, const std::unordered_map &mapping) const; // Helper function to try and convert an instruction to superop matrix // If conversion isn't possible this returns an empty matrix cmatrix_t op2superop(const Operations::Op &op) const; // Try and convert an instruction to unitary matrix // If conversion isn't possible this returns an empty matrix cmatrix_t op2unitary(const Operations::Op &op) const; // Table of single-qubit gates to use a Waltz X90 based error model stringset_t x90_gates_; // Lookup table for gate strings to enum enum class WaltzGate {id, x, y, z, h, s, sdg, t, tdg, u0, u1, u2, u3}; const static stringmap_t waltz_gate_table_; // waltz threshold for applying u1 rotations if |theta - 2n*pi | > threshold double u1_threshold_ = 1e-10; // Joint OpSet of all errors Operations::OpSet opset_; // Sampling method Method method_ = Method::standard; }; //========================================================================= // Noise sampling //========================================================================= NoiseModel::NoiseOps NoiseModel::sample_noise(const Operations::Op &op, RngEngine &rng) const { // Look to see if gate is a waltz gate for this error model auto it = x90_gates_.find(op.name); if (it == x90_gates_.end()) { // Non-X90 based gate, run according to base model return sample_noise_helper(op, rng); } // Decompose ops in terms of their waltz implementation auto gate = waltz_gate_table_.find(op.name); if (gate != waltz_gate_table_.end()) { switch (gate->second) { case WaltzGate::u3: return sample_noise_x90_u3(op.qubits[0], op.params[0], op.params[1], op.params[2], rng); case WaltzGate::u2: return sample_noise_x90_u2(op.qubits[0], op.params[0], op.params[1], rng); case WaltzGate::x: return sample_noise_x90_u3(op.qubits[0], M_PI, 0., M_PI, rng); case WaltzGate::y: return sample_noise_x90_u3(op.qubits[0], M_PI, 0.5 * M_PI, 0.5 * M_PI, rng); case WaltzGate::h: return sample_noise_x90_u2(op.qubits[0], 0., M_PI, rng); default: // The rest of the Waltz operations are noise free (u1 only) return {op}; } } else { // something went wrong if we end up here throw std::invalid_argument("Invalid waltz gate."); } } Circuit NoiseModel::sample_noise(const Circuit &circ, RngEngine &rng) const { bool noise_active = true; // set noise active to on-state Circuit noisy_circ = circ; // copy input circuit noisy_circ.measure_sampling_flag = false; // disable measurement opt flag noisy_circ.ops.clear(); // delete ops noisy_circ.ops.reserve(2 * circ.ops.size()); // just to be safe? // Sample a noisy realization of the circuit for (const auto &op: circ.ops) { switch (op.type) { // Operations that cannot have noise case Operations::OpType::barrier: noisy_circ.ops.push_back(op); break; case Operations::OpType::snapshot: noisy_circ.ops.push_back(op); break; case Operations::OpType::kraus: noisy_circ.ops.push_back(op); break; case Operations::OpType::superop: noisy_circ.ops.push_back(op); break; case Operations::OpType::roerror: noisy_circ.ops.push_back(op); break; case Operations::OpType::bfunc: noisy_circ.ops.push_back(op); break; // Switch noise on or off during current circuit sample case Operations::OpType::noise_switch: noise_active = static_cast(std::real(op.params[0])); break; default: if (noise_active) { NoiseOps noisy_op = sample_noise(op, rng); noisy_circ.ops.insert(noisy_circ.ops.end(), noisy_op.begin(), noisy_op.end()); } break; } } return noisy_circ; } void NoiseModel::activate_superop_method() { // Set internal sampling method method_ = Method::superop; // Compute superoperators for (auto& qerror : quantum_errors_) { qerror.compute_superoperator(); } } void NoiseModel::add_readout_error(const ReadoutError &error, const std::vector &op_qubits) { // Add roerror to noise model ops opset_.optypes.insert(Operations::OpType::roerror); // Add error term as unique pointer readout_errors_.push_back(error); // Get position of error in error vector const auto error_pos = readout_errors_.size() - 1; // Add error index to the error table if (op_qubits.empty()) { readout_error_table_[""].push_back(error_pos); } else { for (const auto &qubits : op_qubits) { readout_error_table_[reg2string(qubits)].push_back(error_pos); for (const auto &qubit : qubits) noise_qubits_.insert(qubit); } } } void NoiseModel::add_quantum_error(const QuantumError &error, const stringset_t &op_labels, const std::vector &op_qubits, const std::vector &noise_qubits) { // Add error opset to noise model opset opset_.insert(error.opset()); // Add error to noise model if (op_qubits.empty()) { // Add default local error add_local_quantum_error(error, op_labels, {reg_t()}); } else if (noise_qubits.empty()) { // Add local error for specific qubits add_local_quantum_error(error, op_labels, op_qubits); } else { // Add non local error for specific qubits and target qubits add_nonlocal_quantum_error(error, op_labels, op_qubits, noise_qubits); } } void NoiseModel::add_local_quantum_error(const QuantumError &error, const stringset_t &op_labels, const std::vector &op_qubits) { // Turn on local error flag if (!op_labels.empty()) { local_quantum_errors_ = true; } // Add error term as unique pointer quantum_errors_.push_back(error); // Get position of error in error vector const auto error_pos = quantum_errors_.size() - 1; // Add error index to the error table for (const auto &gate: op_labels) for (const auto &qubits : op_qubits) { local_quantum_error_table_[gate][reg2string(qubits)].push_back(error_pos); for (const auto &qubit : qubits) noise_qubits_.insert(qubit); } } void NoiseModel::add_nonlocal_quantum_error(const QuantumError &error, const stringset_t &op_labels, const std::vector &op_qubits, const std::vector &noise_qubits) { // Turn on nonlocal error flag if (!op_labels.empty() && !op_qubits.empty() && !noise_qubits.empty()) { nonlocal_quantum_errors_ = true; } // Add error term as unique pointer quantum_errors_.push_back(error); // Get position of error in error vector const auto error_pos = quantum_errors_.size() - 1; // Add error index to the error table for (const auto &gate: op_labels) for (const auto &qubits_gate : op_qubits) { for (const auto &qubit : qubits_gate) noise_qubits_.insert(qubit); for (const auto &qubits_noise : noise_qubits) { nonlocal_quantum_error_table_[gate][reg2string(qubits_gate)][reg2string(qubits_noise)].push_back(error_pos); for (const auto &qubit : qubits_noise) noise_qubits_.insert(qubit); } } } NoiseModel::NoiseOps NoiseModel::sample_noise_helper(const Operations::Op &op, RngEngine &rng) const { // Return operator set NoiseOps noise_before; NoiseOps noise_after; // Apply local errors first sample_local_quantum_noise(op, noise_before, noise_after, rng); // Apply nonlocal errors second sample_nonlocal_quantum_noise(op, noise_before, noise_after, rng); // Apply readout error to measure ops if (op.type == Operations::OpType::measure) { sample_readout_noise(op, noise_after, rng); } // Combine errors noise_before.reserve(noise_before.size() + noise_after.size() + 1); noise_before.push_back(op); noise_before.insert(noise_before.end(), noise_after.begin(), noise_after.end()); if (op.type != Operations::OpType::measure && noise_before.size() == 2 && noise_before[0].qubits == noise_before[1].qubits) { // Try and fuse operations // If either are superoperators combine superoperators // else if either are unitaries combine unitaries // otherwise return the full list auto& first_op = noise_before[0]; auto& second_op = noise_before[1]; if (second_op.type == Operations::OpType::superop) { auto& current = second_op; const auto mat = op2superop(first_op); if (!mat.empty()) { current.mats[0] = current.mats[0] * mat; return NoiseOps({current}); } } else if (first_op.type == Operations::OpType::superop) { auto& current = first_op; const auto mat = op2superop(second_op); if (!mat.empty()) { current.mats[0] = mat * current.mats[0]; return NoiseOps({current}); } } else if (second_op.type == Operations::OpType::matrix) { auto& current = noise_before[1]; const auto mat = op2unitary(first_op); if (!mat.empty()) { current.mats[0] = current.mats[0] * mat; return NoiseOps({current}); } } else if (first_op.type == Operations::OpType::matrix) { auto& current = first_op; const auto mat = op2unitary(second_op); if (!mat.empty()) { current.mats[0] = mat * current.mats[0]; return NoiseOps({current}); } } } // Otherwise return the list of ops return noise_before; } void NoiseModel::sample_readout_noise(const Operations::Op &op, NoiseOps &noise_after, RngEngine &rng) const { // If no readout errors are defined pass if (readout_errors_.empty()) { return; } // Check if measure op writes only to memory, or also to registers // We will use the same error model for both memory and registers bool has_registers = !op.registers.empty(); // std::string op_qubits = reg2string(op.qubits); // Check if the qubits are listed in the readout error model auto iter_default = readout_error_table_.find(std::string()); // Format qubit sets std::vector qubit_keys; std::vector memory_sets, registers_sets; if (readout_error_table_.find(op_qubits) == readout_error_table_.end()) { // Since measure can be defined on multiple qubits // but error model may be specified only on single qubits we add // each one separately. If a multi-qubit model is found for specified // qubits however, that will be used instead. for (const auto &q : op.qubits) { qubit_keys.push_back(std::to_string(q)); } // Add the classical register sets for measure ops for (const auto &q : op.memory) { memory_sets.push_back({q}); } if (has_registers) { for (const auto &q : op.registers) { registers_sets.push_back({q}); } } } else { // for gate operations we use the qubits as specified qubit_keys.push_back(op_qubits); memory_sets.push_back(op.memory); if (has_registers) registers_sets.push_back(op.registers); } // Iterate over qubits for (size_t qs=0; qs < qubit_keys.size(); ++qs) { auto iter_qubits = readout_error_table_.find(qubit_keys[qs]); if (iter_qubits != readout_error_table_.end() || iter_default != readout_error_table_.end()) { auto &error_positions = (iter_qubits != readout_error_table_.end()) ? iter_qubits->second : iter_default->second; for (auto &pos : error_positions) { // Sample Readout error auto noise_ops = readout_errors_[pos].sample_noise(memory_sets[qs], rng); if (has_registers) { for (auto& noise_op: noise_ops) { noise_op.registers = registers_sets[qs]; } } // Add noise after the error noise_after.insert(noise_after.end(), noise_ops.begin(), noise_ops.end()); } } } } void NoiseModel::sample_local_quantum_noise(const Operations::Op &op, NoiseOps &noise_before, NoiseOps &noise_after, RngEngine &rng) const { // If no errors are defined pass if (local_quantum_errors_ == false) return; // Get op name, or label if it is a gate or unitary matrix std::string name = (op.type == Operations::OpType::matrix || op.type == Operations::OpType::gate) ? op.string_params[0] : op.name; // Check if op is a measure or reset bool is_measure_or_reset = (op.type == Operations::OpType::measure || op.type == Operations::OpType::reset); // Convert qubits to string for table lookup std::string op_qubits = reg2string(op.qubits); // Get the qubit error map for gate name auto iter = local_quantum_error_table_.find(name); if (iter != local_quantum_error_table_.end()) { // Check if the qubits are listed in the inner model const auto qubit_map = iter->second; // Get the default qubit model in case a specific qubit model is not found // The default model is stored under the empty key string "" auto iter_default = qubit_map.find(std::string()); // Format qubit sets std::vector qubit_keys; if (is_measure_or_reset && qubit_map.find(op_qubits) == qubit_map.end()) { // Since measure and reset ops can be defined on multiple qubits // but error model may be specified only on single qubits we add // each one separately. If a multi-qubit model is found for specified // qubits however, that will be used instead. for (const auto &q : op.qubits) { qubit_keys.push_back(std::to_string(q) + std::string(",")); } } else { // for gate operations we use the qubits as specified qubit_keys.push_back(op_qubits); } for(auto qubit_key: qubit_keys){ auto iter_qubits = qubit_map.find(qubit_key); if (iter_qubits != qubit_map.end() || iter_default != qubit_map.end()) { auto &error_positions = (iter_qubits != qubit_map.end()) ? iter_qubits->second : iter_default->second; for (auto &pos : error_positions) { auto noise_ops = quantum_errors_[pos].sample_noise(string2reg(qubit_key), rng, method_); // Duplicate same sampled error operations if (quantum_errors_[pos].errors_after()) noise_after.insert(noise_after.end(), noise_ops.begin(), noise_ops.end()); else noise_before.insert(noise_before.end(), noise_ops.begin(), noise_ops.end()); } } } } } void NoiseModel::sample_nonlocal_quantum_noise(const Operations::Op &op, NoiseOps &noise_before, NoiseOps &noise_after, RngEngine &rng) const { // If no errors are defined pass if (nonlocal_quantum_errors_ == false) return; // Get op name, or label if it is a gate or unitary matrix std::string name = (op.type == Operations::OpType::matrix || op.type == Operations::OpType::gate) ? op.string_params[0] : op.name; // Convert qubits to string for table lookup std::string qubits_str = reg2string(op.qubits); // Get the inner error map for gate name auto iter = nonlocal_quantum_error_table_.find(name); if (iter != nonlocal_quantum_error_table_.end()) { const auto qubit_map = iter->second; // Format qubit sets std::vector qubit_keys; if ((op.type == Operations::OpType::measure || op.type == Operations::OpType::reset) && qubit_map.find(qubits_str) == qubit_map.end()) { // Since measure and reset ops can be defined on multiple qubits // but error model may be specified only on single qubits we add // each one separately. If a multi-qubit model is found for specified // qubits however, that will be used instead. for (const auto &q : op.qubits) qubit_keys.push_back(std::to_string(q)); } else { // for gate operations we use the qubits as specified qubit_keys.push_back(reg2string(op.qubits)); } for (const auto &qubits: qubit_keys) { // Check if the qubits are listed in the inner model auto iter_qubits = qubit_map.find(qubits); if (iter_qubits != qubit_map.end()) { for (auto &target_pair : iter_qubits->second) { auto &target_qubits = target_pair.first; auto &error_positions = target_pair.second; for (auto &pos : error_positions) { auto ops = quantum_errors_[pos].sample_noise(string2reg(target_qubits), rng, method_); if (quantum_errors_[pos].errors_after()) noise_after.insert(noise_after.end(), ops.begin(), ops.end()); else noise_before.insert(noise_before.end(), ops.begin(), ops.end()); } } } } } } const stringmap_t NoiseModel::waltz_gate_table_ = { {"u3", WaltzGate::u3}, {"u2", WaltzGate::u2}, {"u1", WaltzGate::u1}, {"u0", WaltzGate::u0}, {"id", WaltzGate::id}, {"x", WaltzGate::x}, {"y", WaltzGate::y}, {"z", WaltzGate::z}, {"h", WaltzGate::h}, {"s", WaltzGate::s}, {"sdg", WaltzGate::sdg}, {"t", WaltzGate::t}, {"tdg", WaltzGate::tdg} }; NoiseModel::NoiseOps NoiseModel::sample_noise_x90_u3(uint_t qubit, complex_t theta, complex_t phi, complex_t lambda, RngEngine &rng) const { // sample noise for single X90 const auto x90 = Operations::make_unitary({qubit}, Utils::Matrix::X90, "x90"); switch (method_) { case Method::superop: { // The first element of the sample should be the superoperator to combine auto sample = sample_noise_helper(x90, rng); // The first element of the sample should be the superoperator to combine if (sample[0].type != Operations::OpType::superop) { throw std::runtime_error("Sampling superoperator noise failed."); } cmatrix_t& current = sample[0].mats[0]; // Combine with middle u1 gate with two noisy x90 superops auto mat = Utils::Matrix::u1(theta + M_PI); auto super = Utils::tensor_product(AER::Utils::conjugate(mat), mat); current = current * super * current; // Prepend with first u1 matrix with superop mat = Utils::Matrix::u1(lambda); super = Utils::tensor_product(AER::Utils::conjugate(mat), mat); current = current * super; // Append third u1 matrix with superop mat = Utils::Matrix::u1(phi + M_PI); super = Utils::tensor_product(AER::Utils::conjugate(mat), mat); current = super * current; return sample; } default: { NoiseOps ret; if (std::abs(lambda) > u1_threshold_ && std::abs(lambda - 2 * M_PI) > u1_threshold_ && std::abs(lambda + 2 * M_PI) > u1_threshold_) { ret.push_back(Operations::make_u1(qubit, lambda)); // add 1st U1 } auto sample = sample_noise_helper(x90, rng); // sample noise for 1st X90 ret.insert(ret.end(), sample.begin(), sample.end()); // add 1st noisy X90 if (std::abs(theta + M_PI) > u1_threshold_ && std::abs(theta - M_PI) > u1_threshold_) { ret.push_back(Operations::make_u1(qubit, theta + M_PI)); // add 2nd U1 } sample = sample_noise_helper(x90, rng); // sample noise for 2nd X90 ret.insert(ret.end(), sample.begin(), sample.end()); // add 2nd noisy X90 if (std::abs(phi + M_PI) > u1_threshold_ && std::abs(phi - M_PI) > u1_threshold_) { ret.push_back(Operations::make_u1(qubit, phi + M_PI)); // add 3rd U1 } return ret; } } } NoiseModel::NoiseOps NoiseModel::sample_noise_x90_u2(uint_t qubit, complex_t phi, complex_t lambda, RngEngine &rng) const { // sample noise for single X90 const auto x90 = Operations::make_unitary({qubit}, Utils::Matrix::X90, "x90"); auto sample = sample_noise_helper(x90, rng); switch (method_) { case Method::superop: { // The first element of the sample should be the superoperator to combine if (sample[0].type != Operations::OpType::superop) { throw std::runtime_error("Sampling superoperator noise failed."); } cmatrix_t ¤t = sample[0].mats[0]; // Combine first u1 matrix with superop auto mat = Utils::Matrix::u1(lambda - 0.5 * M_PI); auto super = Utils::tensor_product(AER::Utils::conjugate(mat), mat); current = current * super; // Combine second u1 matrix with superop mat = Utils::Matrix::u1(phi + 0.5 * M_PI); super = Utils::tensor_product(AER::Utils::conjugate(mat), mat); current = super * current; return sample; } default: { NoiseOps ret; // Standard method doesn't combine any ops if (std::abs(lambda - 0.5 * M_PI) > u1_threshold_) { // add 1st u1 ret.push_back(Operations::make_u1(qubit, lambda - 0.5 * M_PI)); } // add 1st noisy x90 ret.insert(ret.end(), sample.begin(), sample.end()); if (std::abs(phi + 0.5 * M_PI) > u1_threshold_) { // add 2nd u1 ret.push_back(Operations::make_u1(qubit, phi + 0.5 * M_PI)); } return ret; } } } cmatrix_t NoiseModel::op2superop(const Operations::Op &op) const { switch (op.type) { case Operations::OpType::superop: return op.mats[0]; case Operations::OpType::kraus: { const auto dim = op.mats[0].GetRows(); cmatrix_t mat(dim * dim, dim * dim); for (const auto& kraus : op.mats) { mat += Utils::unitary_superop(kraus); } return mat; } case Operations::OpType::reset: return Utils::SMatrix::reset(1ULL << op.qubits.size()); case Operations::OpType::matrix: return Utils::unitary_superop(op.mats[0]); case Operations::OpType::gate: { // Check if a parameterized gate if (op.name == "u1") { return Utils::SMatrix::u1(op.params[0]); } if (op.name == "u2") { return Utils::SMatrix::u2(op.params[0], op.params[1]); } if (op.name == "u3") { return Utils::SMatrix::u3(op.params[0], op.params[1], op.params[2]); } if (Utils::SMatrix::allowed_name(op.name)) { // Check if we can convert this gate to a standard superoperator matrix return Utils::SMatrix::from_name(op.name); } } default: return cmatrix_t(); } } cmatrix_t NoiseModel::op2unitary(const Operations::Op &op) const { switch (op.type) { case Operations::OpType::matrix: return op.mats[0]; case Operations::OpType::gate: { // Check if a parameterized gate if (op.name == "u1") { return Utils::SMatrix::u1(op.params[0]); } if (op.name == "u2") { return Utils::SMatrix::u2(op.params[0], op.params[1]); } if (op.name == "u3") { return Utils::SMatrix::u3(op.params[0], op.params[1], op.params[2]); } if (Utils::SMatrix::allowed_name(op.name)) { // Check if we can convert this gate to a standard superoperator matrix return Utils::SMatrix::from_name(op.name); } } default: return cmatrix_t(); } } std::string NoiseModel::reg2string(const reg_t ®) const { std::stringstream result; std::copy(reg.begin(), reg.end(), std::ostream_iterator(result, ",")); return result.str(); } reg_t NoiseModel::string2reg(std::string s) const { reg_t result; size_t pos = 0; while ((pos = s.find(",")) != std::string::npos) { result.push_back(std::stoi(s.substr(0, pos))); s.erase(0, pos + 1); } return result; } //========================================================================= // Qubit Remapping //========================================================================= std::set NoiseModel::nonlocal_noise_qubits(const std::string label, const reg_t& qubits) const { std::set all_noise_qubits; // Check if label has noise const auto outer_it = nonlocal_quantum_error_table_.find(label); if (outer_it != nonlocal_quantum_error_table_.end()) { const auto outer_table = outer_it->second; const auto it = outer_table.find(reg2string(qubits)); // Check if label on specified qubits has noise if (it != outer_table.end()) { // Add all noise qubit errors to the return value const auto inner_table = it->second; for (const auto &pair : inner_table) { auto noise_qubits = string2reg(pair.first); for (const auto& qubit : noise_qubits) { all_noise_qubits.insert(qubit); } } } } return all_noise_qubits; } std::string NoiseModel::remap_string(const std::string key, const std::unordered_map &mapping) const{ reg_t qubits = string2reg(key); for (size_t j=0; j &mapping) { // If noise model is ideal we have no need to remap if (is_ideal()) return; // We only need the mapping for qubits in the noise model. // We add qubits not specified in the mapping as trivial mapping to themselves // We also validate the mapping while building the full mapping std::unordered_map full_mapping = mapping; // Add noise qubits not specified in mapping for (const auto &qubit : noise_qubits_) { if (full_mapping.find(qubit) == full_mapping.end()) { full_mapping[qubit] = qubit; } } // Check mapping is valid std::set qubits_in; std::set qubits_out; for (const auto& pair: full_mapping) { qubits_in.insert(pair.first); qubits_out.insert(pair.second); } if (qubits_in != qubits_out) { std::stringstream msg; msg << "NoiseModel: invalid qubit re-mapping " << full_mapping; throw std::invalid_argument(msg.str()); } // Remap readout error if (has_readout_errors()) { inner_table_t new_readout_error_table; for (const auto& pair : readout_error_table_) { new_readout_error_table[remap_string(pair.first, full_mapping)] = pair.second; } readout_error_table_ = new_readout_error_table; new_readout_error_table.clear(); } // Remap local quantum error if (has_local_quantum_errors()) { for (auto& outer_pair : local_quantum_error_table_) { // Get reference to the inner table we need to change the keys for auto& inner_table = outer_pair.second; // Make a temporary table to store remapped table inner_table_t new_table; for (const auto& inner_pair : inner_table) { new_table[remap_string(inner_pair.first, full_mapping)] = inner_pair.second; } // Replace inner table with the remapped table inner_table = new_table; } } // Remap nonlocal quantum error if (has_nonlocal_quantum_errors()) { for (auto& pair : nonlocal_quantum_error_table_) { // Get reference to the middle table we need to change the keys for auto& outer_table = pair.second; // Make a temporary table to store remapped outer table outer_table_t new_outer_table; for (auto& outer_pair : outer_table) { // Remap inner table auto& inner_table = outer_pair.second; inner_table_t new_inner_table; for (const auto& inner_pair : inner_table) { new_inner_table[remap_string(inner_pair.first, full_mapping)] = inner_pair.second; } // Update outer table with remapped inner table new_outer_table[remap_string(outer_pair.first, full_mapping)] = new_inner_table; } outer_table = new_outer_table; } } } //========================================================================= // JSON Conversion //========================================================================= /* Schemas: { "error_model": { "errors": [error js], "x90_gates": which gates should be implemented as waltz gates and use the "x90" term } } Specific types additional parameters Quantum Error { "type": "qerror", "operations": ["x", "y", ...], // ops to apply error to "gate_qubits": [[0], [1]] // error only apples when op is on these qubits (blank for all) "noise_qubits": [[2], ...] // error term will be applied to these qubits (blank for input qubits) // if false noise will be applied before op "probabilities": [p0, p1, ..], "instructions": [qobj_circuit_instrs0, qobj_circuit_instrs1, ...] } Readout Error (note: readout errors can only be local) { "type": "roerror", "operations": ["measure"], "probabilities": [[P(0|0), P(0|1)], [P(1|0), P(1|1)]] "gate_qubits": [[0]] // error only apples when op is on these qubits (blank for all) } */ void NoiseModel::load_from_json(const json_t &js) { // If JSON is empty stop if (js.empty()) return; // Check JSON is an object if (!js.is_object()) { throw std::invalid_argument("Invalid noise_params JSON: not an object."); } // See if any single qubit gates have a waltz error model applied to them if (JSON::check_key("x90_gates", js)) { set_x90_gates(js["x90_gates"]); } if (JSON::check_key("errors", js)) { if (!js["errors"].is_array()) { throw std::invalid_argument("Invalid noise_params JSON: \"error\" field is not a list"); } for (const auto &gate_js : js["errors"]) { std::string type; JSON::get_value(type, "type", gate_js); stringset_t ops; // want set so ops are unique, and we can pull out measure JSON::get_value(ops, "operations", gate_js); std::vector gate_qubits; JSON::get_value(gate_qubits, "gate_qubits", gate_js); std::vector noise_qubits; JSON::get_value(noise_qubits, "noise_qubits", gate_js); // We treat measure as a separate error op so that it can be applied before // the measure operation, rather than after like the other gates if (ops.find("measure") != ops.end() && type != "roerror") { ops.erase("measure"); // remove measure from set of ops if (type != "qerror") throw std::invalid_argument("NoiseModel: Invalid noise type (" + type + ")"); QuantumError error; error.load_from_json(gate_js); error.set_errors_before(); // set errors before the op add_quantum_error(error, {"measure"}, gate_qubits, noise_qubits); } // Load the remaining ops as errors that come after op if (type == "qerror") { QuantumError error; error.load_from_json(gate_js); add_quantum_error(error, ops, gate_qubits, noise_qubits); } else if (type == "roerror") { // We do not allow non-local readout errors if (!noise_qubits.empty()) { throw std::invalid_argument("Readout error must be a local error"); } ReadoutError error; // readout error goes after error.load_from_json(gate_js); add_readout_error(error, gate_qubits); }else { throw std::invalid_argument("NoiseModel: Invalid noise type (" + type + ")"); } } } } inline void from_json(const json_t &js, NoiseModel &model) { model = NoiseModel(js); } //------------------------------------------------------------------------- } // end namespace Noise //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/noise/quantum_error.hpp000066400000000000000000000300001362723322000210760ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_noise_quantum_error_hpp_ #define _aer_noise_quantum_error_hpp_ #include "simulators/superoperator/superoperator_state.hpp" namespace AER { namespace Noise { //========================================================================= // Quantum Error class //========================================================================= // Quantum error class that can model any error that is expressed as a // qobj instruction acting on qubits. class QuantumError { public: // Methods for sampling enum class Method {standard, superop}; // Alias for return type using NoiseOps = std::vector; //----------------------------------------------------------------------- // Sampling method //----------------------------------------------------------------------- // Sample a noisy implementation of op NoiseOps sample_noise(const reg_t &qubits, RngEngine &rng, Method method = Method::standard) const; // Return the opset for the quantum error const Operations::OpSet& opset() const {return opset_;} // Return the superoperator matrix representation of the error. // If the error cannot be converted to a superoperator and error // will be raised. const cmatrix_t& superoperator() const; //----------------------------------------------------------------------- // Initialization //----------------------------------------------------------------------- // Load a QuantumError object from a JSON Error object void load_from_json(const json_t &js); // Sets the sub-circuits and probabilities to be sampled from. // The length of the circuits vector and probability vector must be equal. void set_circuits(const std::vector &circuits, const rvector_t &probs); // Construct a quantum error from a set of Kraus matrices // This will factor out any identity or unitary Kraus operators into // non-kraus subcircuits. void set_from_kraus(const std::vector &mats); // Compute the superoperator representation of the quantum error void compute_superoperator(); //----------------------------------------------------------------------- // Utility //----------------------------------------------------------------------- // Set number of qubits or memory bits for error inline void set_num_qubits(uint_t num_qubits) {num_qubits_ = num_qubits;} // Get number of qubits or memory bits for error inline uint_t get_num_qubits() const {return num_qubits_;} // Set the sampled errors to be applied after the original operation inline void set_errors_after() {errors_after_op_ = true;} // Set the sampled errors to be applied before the original operation inline void set_errors_before() {errors_after_op_ = false;} // Returns true if the errors are to be applied after the operation inline bool errors_after() const {return errors_after_op_;} // Set threshold for checking probabilities and matrices void set_threshold(double); protected: // Number of qubits sthe error applies to uint_t num_qubits_ = 0; // Probabilities, first entry is no-error (identity) rvector_t probabilities_; // List of unitary error matrices std::vector circuits_; // List of OpTypes contained in error circuits Operations::OpSet opset_; // threshold for validating if matrices are unitary double threshold_ = 1e-10; // Superoperator matrix representation of the error cmatrix_t superoperator_; // flag for where errors should be applied relative to the sampled op bool errors_after_op_ = true; }; //------------------------------------------------------------------------- // Implementation: Mixed unitary error subclass //------------------------------------------------------------------------- QuantumError::NoiseOps QuantumError::sample_noise(const reg_t &qubits, RngEngine &rng, Method method) const { if (qubits.size() < get_num_qubits()) { std::stringstream msg; msg << "QuantumError: qubits size (" << qubits.size() << ")"; msg << " < error qubits (" << get_num_qubits() << ")."; throw std::invalid_argument(msg.str()); } switch (method) { case Method::superop: { // Truncate qubits to size of the actual error reg_t op_qubits = qubits; op_qubits.resize(get_num_qubits()); auto op = Operations::make_superop(op_qubits, superoperator()); return NoiseOps({op}); } default: { auto r = rng.rand_int(probabilities_); // Check for invalid arguments if (r + 1 > circuits_.size()) { throw std::invalid_argument( "QuantumError: probability outcome (" + std::to_string(r) + ")" " is greater than number of circuits (" + std::to_string(circuits_.size()) + ")." ); } NoiseOps noise_ops = circuits_[r]; // Add qubits to noise op commands; for (auto &op : noise_ops) { // Update qubits based on position in qubits list for (auto &qubit: op.qubits) { qubit = qubits[qubit]; } } return noise_ops; } } } void QuantumError::set_threshold(double threshold) { threshold_ = std::abs(threshold); } void QuantumError::set_circuits(const std::vector &circuits, const rvector_t &probs) { if (probs.size() != circuits.size()) { throw std::invalid_argument( "QuantumError: invalid input, number of circuits (" + std::to_string(circuits.size()) + ") and number of probabilities (" + std::to_string(probs.size()) + ") are not equal." ); } // Check probability vector double total = 0.; bool probs_valid = true; uint_t num_qubits = 0; for (const auto &p : probs) { probs_valid &= !(p < 0 || p > 1); total += p; } if (!probs_valid || std::abs(total - 1.0) > threshold_) { throw std::invalid_argument("QuantumError: invalid probability vector total (" + std::to_string(total) + "!= 1)"); } // Reset OpSet opset_ = Operations::OpSet(); // Add elements with non-zero probability for (size_t j=0; j < probs.size(); j++ ) { if (probs[j] > threshold_) { probabilities_.push_back(probs[j]); circuits_.push_back(circuits[j]); for (const auto &op: circuits[j]) { // Check max qubit size for (const auto &qubit : op.qubits) { num_qubits = std::max(num_qubits, qubit + 1); } // Record op in opset opset_.insert(op); } } } set_num_qubits(num_qubits); } void QuantumError::set_from_kraus(const std::vector &mats) { // Check input isn't empty if (mats.empty()) throw std::invalid_argument("QuantumError: Kraus channel input is empty."); // Check input is a CPTP map if (Utils::is_cptp_kraus(mats, threshold_) == false) throw std::invalid_argument("QuantumError: Kraus channel input is not a CPTP map."); // Get number of qubits from first Kraus operator size_t mat_dim = mats[0].GetRows(); auto num_qubits = static_cast(std::log2(mat_dim)); set_num_qubits(num_qubits); if (mat_dim != 1UL << num_qubits) throw std::invalid_argument("QuantumError: Kraus channel input is a multi-qubit channel."); // Check if each matrix is a: // - scaled identity matrix // - scaled non-identity unitary matrix // - a non-unitary Kraus operator // Probabilities double p_unitary = 0.; // total probability of all unitary ops rvector_t probs = {0.}; // initialize with probability of Identity // Matrices std::vector unitaries; // non-identity unitaries std::vector kraus; // non-unitary Kraus matrices for (const auto &mat : mats) { if (!Utils::is_square(mat) && !Utils::is_diagonal(mat)) { throw std::invalid_argument("Error matrix is not square or diagonal."); } // Get the value of the first non-zero diagonal element of mat * dagger(mat) for rescaling double p = 0.; for (size_t i=0; i < mat.GetColumns(); i ++) { for (size_t j=0; j < mat.GetRows(); j ++) { p += std::real(std::abs(mat(j, i) * std::conj(mat(j, i)) )); } if (p > threshold_) break; } if (p > 0) { // Rescale mat by probability cmatrix_t tmp = (1 / std::sqrt(p)) * mat; // Check if rescaled matrix is an identity if (Utils::is_identity(tmp, threshold_) || Utils::is_diagonal_identity(tmp, threshold_)) { // Add to identity probability probs[0] += p; p_unitary += p; } // Check if rescaled matrix is a unitary else if (Utils::is_unitary(tmp, threshold_)) { unitaries.push_back(tmp); probs.push_back(p); // add probability for unitary p_unitary += p; } else { // Original matrix is non-unitary so add original matrix to Kraus ops kraus.push_back(mat); } } } // Create noise circuits: std::vector circuits; // Add identity Operations::Op iden; iden.name = "id"; iden.qubits = reg_t({0}); iden.type = Operations::OpType::gate; circuits.push_back({iden}); // Create n-qubit argument {0, ... , n-1} // for indexing remaining errors operators reg_t error_qubits(num_qubits); std::iota(error_qubits.begin(), error_qubits.end(), 0); for (size_t j=1; j < probs.size(); j++) { auto op = Operations::make_unitary(error_qubits, unitaries[j - 1]); circuits.push_back({op}); } // Add Kraus // Probability of non-unitary Kraus error is 1 - p_total double p_kraus = 1.0 - p_unitary; if (std::abs(p_kraus) > threshold_) { // Rescale Kraus operators by probability Utils::scalar_multiply_inplace(kraus, complex_t(1. / std::sqrt(p_kraus), 0.0)); // Check rescaled Kraus map is still CPTP if (Utils::is_cptp_kraus(kraus, threshold_) == false) { throw std::invalid_argument("QuantumError: Rescaled non-unitary Kraus channel is not a CPTP map."); } // Add Kraus error subcircuit auto op = Operations::make_kraus(error_qubits, kraus); circuits.push_back({op}); // Add kraus error prob probs.push_back(p_kraus); } // Add the circuits set_circuits(circuits, probs); } const cmatrix_t& QuantumError::superoperator() const { // Check the superoperator is actually computed // If not raise an exception if (superoperator_.empty()) { throw std::runtime_error("QuantumError: superoperator is empty."); } return superoperator_; } void QuantumError::compute_superoperator() { // Initialize superoperator matrix to correct size size_t dim = 1 << (2 * get_num_qubits()); superoperator_.initialize(dim, dim); // We use the superoperator simulator state to do this QubitSuperoperator::State<> superop; for (size_t j=0; j circuits; JSON::get_value(circuits, "instructions", js); set_circuits(circuits, probs); } //------------------------------------------------------------------------- } // end namespace Noise //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endifqiskit-aer-0.4.1/src/noise/readout_error.hpp000066400000000000000000000102301362723322000210520ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_noise_readout_error_hpp_ #define _aer_noise_readout_error_hpp_ namespace AER { namespace Noise { //========================================================================= // Readout Error class //========================================================================= class ReadoutError { public: // Alias for return type using NoiseOps = std::vector; //----------------------------------------------------------------------- // Error sampling //----------------------------------------------------------------------- // Sample a noisy implementation of op NoiseOps sample_noise(const reg_t &memory, RngEngine &rng) const; //----------------------------------------------------------------------- // Initialization //----------------------------------------------------------------------- // Load a ReadoutError object from a JSON Error object void load_from_json(const json_t &js); // Set the default assignment probabilities for measurement of each qubit // Each vector is a list of probabilities {P(0|q), P(1|q), ... P(n-1|q)} // For the no-error case this list viewed as a matrix should be an // identity matrix void set_probabilities(const std::vector &probs); //----------------------------------------------------------------------- // Utility //----------------------------------------------------------------------- // Set number of qubits or memory bits for error inline void set_num_qubits(uint_t num_qubits) {num_qubits_ = num_qubits;} // Get number of qubits or memory bits for error inline uint_t get_num_qubits() const {return num_qubits_;} protected: // Number of qubits/memory bits the error applies to uint_t num_qubits_ = 0; // Vector of assignment probability vectors std::vector assignment_probabilities_; // threshold for checking probabilities double threshold_ = 1e-10; }; //------------------------------------------------------------------------- // Implementation: Mixed unitary error subclass //------------------------------------------------------------------------- ReadoutError::NoiseOps ReadoutError::sample_noise(const reg_t &memory, RngEngine &rng) const { (void)rng; // RNG is unused for readout error since it is handled by engine // Check assignment fidelity matrix is correct size if (memory.size() > get_num_qubits()) throw std::invalid_argument("ReadoutError: number of qubits don't match assignment probability matrix."); // Initialize return ops, return {Operations::make_roerror(memory, assignment_probabilities_)}; } void ReadoutError::set_probabilities(const std::vector &probs) { assignment_probabilities_ = probs; set_num_qubits(assignment_probabilities_.size()); for (const auto &ps : assignment_probabilities_) { double total = 0.0; for (const auto &p : ps) { if (p < 0 || p > 1) { throw std::invalid_argument("ReadoutError probability is not valid (p=" + std::to_string(p) +")."); } total += p; } if (std::abs(total - 1) > threshold_) throw std::invalid_argument("ReadoutError probability vector is not normalized."); } } void ReadoutError::load_from_json(const json_t &js) { std::vector probs; JSON::get_value(probs, "probabilities", js); if (!probs.empty()) { set_probabilities(probs); } } //------------------------------------------------------------------------- } // end namespace Noise //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endifqiskit-aer-0.4.1/src/open_pulse/000077500000000000000000000000001362723322000165255ustar00rootroot00000000000000qiskit-aer-0.4.1/src/open_pulse/CMakeLists.txt000066400000000000000000000010651362723322000212670ustar00rootroot00000000000000# Cython OP extensions include(Linter) include(cython_utils) # We need to remove the -static flag, because Python Extension system only supports # dynamic linked libraries, but we want to build a shared libraries with the least # dependencies we can, so some of these dependencies are linked statically into our # shared library. string(REPLACE " -static " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") set(CYTHON_INSTALL_DIR "qiskit/providers/aer/pulse/cy/") add_cython_module(numeric_integrator_wrapper numeric_integrator.cpp) add_cython_module(test_python_to_cpp) qiskit-aer-0.4.1/src/open_pulse/eval_hamiltonian.hpp000066400000000000000000000100041362723322000225430ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _EVAL_HAMILTONIAN_HPP #define _EVAL_HAMILTONIAN_HPP #include #include #include #include #include #include struct ParserValues { ParserValues(std::unique_ptr parser, const std::string& expr): parser(std::move(parser)), expr(expr) { } std::unique_ptr parser; std::string expr; std::unordered_map> var_values; }; namespace std { template <> struct hash{ std::size_t operator()(const ParserValues& p) const { return std::hash()(p.expr); } }; } // TODO: Document complex_t evaluate_hamiltonian_expression(const std::string& expr_string, const std::vector& vars, const std::vector& vars_names, const std::unordered_map& chan_values){ static std::unordered_map> parser_expr; auto parser_iter = parser_expr.find(expr_string); if(parser_iter == parser_expr.end()){ auto parserx = std::make_unique(); //Value pi(M_PI); //parser->DefineVar("npi", Variable(&pi)); const auto replace = [](const std::string& from, const std::string& to, std::string where) -> std::string { size_t start_pos = 0; while((start_pos = where.find(from, start_pos)) != std::string::npos) { where.replace(start_pos, from.length(), to); start_pos += to.length(); } return where; }; parserx->SetExpr(replace("np.pi", "pi", expr_string)); auto parser = std::make_unique(std::move(parserx), expr_string); //std::cout << "Creating parser: " << std::hex << parser.get() << " for expr: " << expr_string << "\n"; parser_expr.emplace(expr_string, std::move(parser)); } auto * parser = parser_expr[expr_string].get(); //std::cout << "Getting parser " << std::hex << parser << "\n"; auto maybe_update_value = [parser](const std::string& var_name, const complex_t& var_value){ if(parser->var_values.find(var_name) == parser->var_values.end()){ parser->var_values.emplace(var_name, std::make_unique(var_value)); parser->parser->DefineVar(var_name, mup::Variable(parser->var_values[var_name].get())); }else{ // There's already a variable defined for this expresion //std::cout << var_name << " is now: " << std::to_string(var_value.real()) << "," << std::to_string(var_value.imag()) << "\n"; auto * ref = parser->var_values[var_name].get(); // Update the value from the container *ref = var_value; } }; for(const auto& idx_var : enumerate(vars)){ size_t index = idx_var.first; auto var_value = static_cast(idx_var.second); maybe_update_value(vars_names[index], var_value); } for(const auto& idx_channel : chan_values){ auto channel = idx_channel.first; // The string of the channel auto var_value = idx_channel.second; // The complex_t of the map maybe_update_value(channel, var_value); } try{ mup::Value result = parser->parser->Eval(); return result.GetComplex(); }catch(std::exception ex){ std::cout << ex.what(); } return 0.; } #endif //_EVAL_HAMILTONIAN_HPP qiskit-aer-0.4.1/src/open_pulse/iterators.hpp000066400000000000000000000043461362723322000212610ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _ITERATORS_HPP #define _ITERATORS_HPP template struct iterator_extractor { using type = typename T::iterator; }; template struct iterator_extractor { using type = typename T::const_iterator; }; /** * Python-like `enumerate()` for C++14 ranged-for * * I wish I'd had this included in the STL :) * * Usage: * ```c++ * for(auto& elem: index(vec)){ * std::cout << "Index: " << elem.first << " Element: " << elem.second; * } * ``` **/ template class Indexer { public: class _Iterator { using inner_iterator = typename iterator_extractor::type; using inner_reference = typename std::iterator_traits::reference; public: using reference = std::pair; _Iterator(inner_iterator it): _pos(0), _it(it) {} reference operator*() const { return reference(_pos, *_it); } _Iterator& operator++() { ++_pos; ++_it; return *this; } _Iterator operator++(int) { _Iterator tmp(*this); ++*this; return tmp; } bool operator==(_Iterator const& it) const { return _it == it._it; } bool operator!=(_Iterator const& it) const { return !(*this == it); } private: size_t _pos; inner_iterator _it; }; Indexer(T& t): _container(t) {} _Iterator begin() const { return _Iterator(_container.begin()); } _Iterator end() const { return _Iterator(_container.end()); } private: T& _container; }; // class Indexer template Indexer enumerate(T& t) { return Indexer(t); } #endifqiskit-aer-0.4.1/src/open_pulse/log.hpp000066400000000000000000000053701362723322000200240ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _LOG_HPP #define _LOG_HPP #include #include #include #include #include #include "types.hpp" #include "python_to_cpp.hpp" #include "nparray.hpp" template void jlog(const std::string& msg, const T& value){ spdlog::debug("{}: {}", msg, value); } template<> void jlog(const std::string& msg, const complex_t& values){ spdlog::debug("{}: [{},{}i]", msg, values.real(), values.imag()); } template void jlog(const std::string& msg, const NpArray& values){ spdlog::debug("{}", msg); spdlog::debug(".shape: "); for(const auto& shape : values.shape) spdlog::debug("{} ", shape); spdlog::debug("\n.data: "); for(const auto& val : values.data){ jlog("", val); } } template void jlog(const std::string& msg, const std::vector& values){ spdlog::debug("{}", msg); for(const auto& val : values){ jlog("", val); } } template<> void jlog(const std::string& msg, const std::unordered_map>>& values){ spdlog::debug("{}", msg); for(const auto& val : values){ for(const auto& inner: val.second){ for(const auto& inner2: inner){ spdlog::debug("{}:{} ", val.first, inner2); } } } } template<> void jlog(const std::string& msg, const std::unordered_map& values){ spdlog::debug("{}", msg); for(const auto& val : values){ spdlog::debug("{}:{} ", val.first, val.second); } } template<> void jlog(const std::string& msg, const std::unordered_map>>& values){ spdlog::debug("{}", msg); for(const auto& val : values){ for(const auto& inner: val.second){ jlog(val.first, inner); } } } template<> void jlog(const std::string& msg, const ordered_map>>& values){ spdlog::debug("{}", msg); using order_map_t = ordered_map>>; for(const auto& val : const_cast(values)){ for(const auto& inner: val.second){ jlog(val.first, inner); } } } #endif //_LOG_HPPqiskit-aer-0.4.1/src/open_pulse/numeric_integrator.cpp000066400000000000000000000175061362723322000231420ustar00rootroot00000000000000#include #include #include #include #include #define _USE_MATH_DEFINES #include #include #include #ifdef DEBUG #include #include #include #endif #include "numeric_integrator.hpp" #include "python_to_cpp.hpp" #ifdef DEBUG class Unregister { public: ~Unregister(){ spdlog::drop_all(); } }; #endif /** * Python // operator-like division */ int32_t floor_div(int32_t a, int32_t b) { int32_t q = a / b; int32_t r = a - q*b; q -= ((r != 0) & ((r ^ b) < 0)); return q; } complex_t chan_value( double t, unsigned int chan_num, const double freq_ch, const NpArray& chan_pulse_times, const NpArray& pulse_array, const NpArray& pulse_indexes, const NpArray& fc_array, const NpArray& reg){ static const auto get_arr_idx = [](double t, double start, double stop, size_t len_array) -> int { return static_cast(std::floor((t - start) / (stop - start) * len_array)); }; complex_t out = {0., 0.}; auto num_times = floor_div(static_cast(chan_pulse_times.shape[0]), 4); for(auto i=0; i < num_times; ++i){ auto start_time = chan_pulse_times[4 * i]; auto stop_time = chan_pulse_times[4 * i + 1]; if(start_time <= t && t < stop_time){ auto cond = static_cast(chan_pulse_times[4 * i + 3]); if(cond < 0 || reg[cond]) { auto temp_idx = static_cast(chan_pulse_times[4 * i + 2]); auto start_idx = pulse_indexes[temp_idx]; auto stop_idx = pulse_indexes[temp_idx+1]; auto offset_idx = get_arr_idx(t, start_time, stop_time, stop_idx - start_idx); out = pulse_array[start_idx + offset_idx]; } } } // TODO floating point comparsion with complex ?! // Seems like this is equivalent to: out != complex_t(0., 0.) if(out != 0.){ double phase = 0.; num_times = floor_div(fc_array.shape[0], 3); for(auto i = 0; i < num_times; ++i){ // TODO floating point comparison if(t >= fc_array[3 * i]){ bool do_fc = true; if(fc_array[3 * i + 2] >= 0){ if(!reg[static_cast(fc_array[3 * i + 2])]){ do_fc = false; } } if(do_fc){ phase += fc_array[3 * i + 1]; } }else{ break; } } if(phase != 0.){ out *= std::exp(complex_t(0.,1.) * phase); } out *= std::exp(complex_t(0., -1.) * 2. * M_PI * freq_ch * t); } return out; } PyArrayObject * create_py_array_from_vector( complex_t * out, int num_rows){ npy_intp dims = num_rows; PyArrayObject * array = reinterpret_cast(PyArray_SimpleNewFromData(1, &dims, NPY_COMPLEX128, out)); PyArray_ENABLEFLAGS(array, NPY_OWNDATA); #ifdef DEBUG CALLGRIND_STOP_INSTRUMENTATION; CALLGRIND_DUMP_STATS; #endif return array; } PyArrayObject * td_ode_rhs( double t, PyArrayObject * py_vec, PyObject * py_global_data, PyObject * py_exp, PyObject * py_system, PyObject * py_channels, PyObject * py_register){ #ifdef DEBUG CALLGRIND_START_INSTRUMENTATION; #endif import_array(); // I left this commented on porpose so we can use logging eventually // This is just a RAII for the logger //const Unregister unregister; //auto file_logger = spdlog::basic_logger_mt("basic_logger", "logs/td_ode_rhs.txt"); //spdlog::set_default_logger(file_logger); //spdlog::set_level(spdlog::level::debug); // Set global log level to debug //spdlog::flush_on(spdlog::level::debug); if(py_vec == nullptr || py_global_data == nullptr || py_exp == nullptr || py_system == nullptr || py_register == nullptr){ std::string msg = "These arguments cannot be null: "; msg += (py_vec == nullptr ? "py_vec " : "" ); msg += (py_global_data == nullptr ? "py_global_data " : "" ); msg += (py_exp == nullptr ? "py_exp " : "" ); msg += (py_system == nullptr ? "py_system " : "" ); msg += (py_register == nullptr ? "py_register " : "" ); throw std::invalid_argument(msg); } auto vec = get_value>(py_vec); auto num_rows = vec.shape[0]; auto out = static_cast(PyDataMem_NEW(num_rows * sizeof(complex_t))); memset(&out[0],0,num_rows * sizeof(complex_t)); auto pulses = get_ordered_map_from_dict_item>>(py_exp, "channels"); auto freqs = get_vec_from_dict_item(py_global_data, "freqs"); auto pulse_array = get_value_from_dict_item>(py_global_data, "pulse_array"); auto pulse_indices = get_value_from_dict_item>(py_global_data, "pulse_indices"); auto reg = get_value>(py_register); std::unordered_map chan_values; chan_values.reserve(pulses.size()); for(const auto& elem : enumerate(pulses)){ /** * eleme is map of string as key type, and vector of vectors of doubles. * elem["D0"] = [[0.,1.,2.][0.,1.,2.]] **/ auto i = elem.first; auto channel = elem.second.first; auto pulse = elem.second.second; auto val = chan_value(t, i, freqs[i], pulse[0], pulse_array, pulse_indices, pulse[1], reg); chan_values.emplace(channel, val); } // 4. Eval the time-dependent terms and do SPMV. auto systems = get_value>(py_system); auto vars = get_vec_from_dict_item(py_global_data, "vars"); auto vars_names = get_vec_from_dict_item(py_global_data, "vars_names"); auto num_h_terms = get_value_from_dict_item(py_global_data, "num_h_terms"); auto datas = get_vec_from_dict_item>(py_global_data, "h_ops_data"); auto idxs = get_vec_from_dict_item>(py_global_data, "h_ops_ind"); auto ptrs = get_vec_from_dict_item>(py_global_data, "h_ops_ptr"); auto energy = get_value_from_dict_item>(py_global_data, "h_diag_elems"); for(const auto& idx_sys : enumerate(systems)){ auto sys_index = idx_sys.first; auto sys = idx_sys.second; // TODO: Refactor std::string term; if(sys_index == systems.size() && num_h_terms > systems.size()){ term = "1.0"; }else if(sys_index < systems.size()){ //term = sys.second; term = sys.term; }else{ continue; } auto td = evaluate_hamiltonian_expression(term, vars, vars_names, chan_values); if(std::abs(td) > 1e-15){ for(auto i=0; i #include #include #include #include PyArrayObject * td_ode_rhs( double , PyArrayObject * , PyObject * , PyObject * , PyObject * , PyObject * , PyObject * ); #endif // _NUMERIC_INTEGRATOR_HPPqiskit-aer-0.4.1/src/open_pulse/numeric_integrator_wrapper.pyx000066400000000000000000000016631362723322000247350ustar00rootroot00000000000000#!python #cython: language_level=3 # This code is part of Qiskit. # # (C) Copyright IBM 2017, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. cimport cython cimport numpy as np cdef extern from "numeric_integrator.hpp": cdef np.ndarray td_ode_rhs( double t, np.ndarray vec, dict global_data, dict exp, list system, dict channels, register ) except + def td_ode_rhs_static(t, vec, global_data, exp, system, channels, register): return td_ode_rhs(t, vec, global_data, exp, system, channels, register) qiskit-aer-0.4.1/src/open_pulse/ordered_map.hpp000066400000000000000000000067431362723322000215310ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _ORDERED_MAP_HPP #define _ORDERED_MAP_HPP #include #include #include #include template< class Key, class T, class Hash = std::hash, class KeyEqual = std::equal_to, class Allocator = std::allocator> > class ordered_map { public: using unordered_map_t = std::unordered_map; using vector_t = std::vector; auto reserve(size_t size){ order.reserve(size); return internal_map.reserve(size); } template decltype(auto) emplace(Args&&... args) { const auto first = std::get<0>(std::forward_as_tuple(args...)); order.emplace_back(first); return internal_map.emplace(std::forward(args)...); } size_t size(){ return internal_map.size(); } const T& operator[](const std::string& index) const { return internal_map[index]; } // This is needed so we can use the container in an iterator context like ranged fors. template class ordered_map_iterator_t { using unordered_map_iter_t = typename _map_t::iterator; using vec_iter_t = typename _vec_t::iterator; _map_t& map; _vec_t& vec; unordered_map_iter_t map_iter; vec_iter_t vec_iter; public: using reference = typename unordered_map_iter_t::reference; using difference_type = typename unordered_map_iter_t::difference_type; using value_type = typename unordered_map_iter_t::value_type; using pointer = typename unordered_map_iter_t::reference; using iterator_category = typename unordered_map_iter_t::iterator_category; ordered_map_iterator_t(_map_t& map, _vec_t& vec) : map(map), vec(vec){ } ordered_map_iterator_t begin() { vec_iter = vec.begin(); map_iter = map.find(*vec_iter); return *this; } ordered_map_iterator_t end() { vec_iter = vec.end(); map_iter = map.find(*(vec_iter - 1)); return *this; } ordered_map_iterator_t operator ++(){ auto tmp = ++vec_iter; tmp = (tmp == vec.end()? --tmp: tmp); map_iter = map.find(*tmp); return *this; } bool operator ==(const ordered_map_iterator_t& rhs) const { return vec_iter == rhs.vec_iter; } bool operator !=(const ordered_map_iterator_t& rhs) const { return vec_iter != rhs.vec_iter; } reference operator *() const { return *map_iter; } }; using iterator = ordered_map_iterator_t; using const_iterator = ordered_map_iterator_t; iterator it{internal_map, order}; const_iterator begin() { return it.begin(); } const_iterator end() { return it.end(); } private: unordered_map_t internal_map; vector_t order; }; #endif //_ORDERED_MAP_HPPqiskit-aer-0.4.1/src/open_pulse/python_to_cpp.hpp000066400000000000000000000333061362723322000221300ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _PYTHON_TO_CPP_HPP #define _PYTHON_TO_CPP_HPP #include #include #include #include #include #include #include #ifdef DEBUG #include #include #endif #include #include "ordered_map.hpp" #include "types.hpp" #include "iterators.hpp" #include "eval_hamiltonian.hpp" bool check_is_integer(PyObject * value){ if(value == nullptr) throw std::invalid_argument("PyObject is null!"); // Seems like this function checks every integer type if(!PyLong_Check(value)) return false; return true; } bool check_is_string(PyObject * value){ if(value == nullptr) throw std::invalid_argument("PyObject is null!"); if(!PyUnicode_Check(value)) return false; return true; } bool check_is_floating_point(PyObject * value){ if(value == nullptr) throw std::invalid_argument("PyObject is null!"); if(!PyFloat_Check(value)) return false; return true; } bool check_is_complex(PyObject * value){ if(value == nullptr) throw std::invalid_argument("PyObject is null!"); if(!PyComplex_Check(value)) return false; return true; } bool check_is_list(PyObject * value){ if(value == nullptr) throw std::invalid_argument("Pyhton list is null!"); // Check that it's a list if(!PyList_Check(value)) return false; return true; } bool check_is_tuple(PyObject * value){ if(value == nullptr) throw std::invalid_argument("Pyhton tuple is null!"); // Check that it's a tuple if(!PyTuple_Check(value)) return false; return true; } bool check_is_dict(PyObject * value){ if(value == nullptr) throw std::invalid_argument("Pyhton dict is null!"); // Check that it's a dict if(!PyDict_Check(value)) return false; return true; } bool check_is_np_array(PyArrayObject * value){ if(value == nullptr) throw std::invalid_argument("Numpy ndarray is null!"); import_array(); // Check that it's a numpy ndarray if(!PyArray_Check(value)) return false; return true; } // Simon Brand technique to achive partial specialization on function templates // https://www.fluentcpp.com/2017/08/15/function-templates-partial-specialization-cpp/ // This "type" struct will carry T, but wil be ignored by the compiler later. // It's like a help you give to the compiler so it can resolve the specialization template struct type{}; template T get_value(type _, PyObject * value){ throw std::invalid_argument("Cannot get value for this type!"); } // TODO: We might want to expose only these two functions template T get_value(PyObject * value){ return get_value(type{}, value); } template const T get_value(PyArrayObject * value){ return get_value(type{}, value); } // template<> uint8_t get_value(type _, PyObject * value){ return get_value(value); } template<> long get_value(type _, PyObject * value){ if(!check_is_integer(value)) throw std::invalid_argument("PyObject is not a long!"); long c_value = PyLong_AsLong(value); auto ex = PyErr_Occurred(); if(ex) throw ex; return c_value; } template<> double get_value(type _, PyObject * value){ if(!check_is_floating_point(value)){ // it's not a floating point, but maybe an integer? if(check_is_integer(value)) return static_cast(get_value(value)); throw std::invalid_argument("PyObject is not a double!"); } double c_value = PyFloat_AsDouble(value); auto ex = PyErr_Occurred(); if(ex) throw ex; return c_value; } template<> std::complex get_value(type> _, PyObject * value){ if(!check_is_complex(value)) throw std::invalid_argument("PyObject is not a complex number!"); Py_complex c_value = PyComplex_AsCComplex(value); auto ex = PyErr_Occurred(); if(ex) throw ex; return std::complex(c_value.real, c_value.imag); } template<> std::string get_value(type _, PyObject * value){ if(!check_is_string(value)) throw std::invalid_argument("PyObject is not a string!"); auto bytes_str = PyUnicode_AsUTF8String(value); auto c_str = PyBytes_AsString(bytes_str); if(c_str == nullptr) throw std::invalid_argument("Conversion to utf-8 has failed!"); return std::string(c_str); } template std::vector get_value(type> _, PyObject * value){ if(!check_is_list(value)) throw std::invalid_argument("PyObject is not a List!"); auto size = PyList_Size(value); std::vector vector; vector.reserve(size); for(auto i=0; i(py_item); vector.emplace_back(item); } return vector; } /* WARNING: There's no support for variadic templates in Cython, so we use a std::pair because there's no more than two types in the Python tuples so far, so as we are fine for now... */ template std::pair get_value(type> _, PyObject * value){ if(!check_is_tuple(value)) throw std::invalid_argument("PyObject is not a Tuple!"); if(PyTuple_Size(value) > 2) throw std::invalid_argument("Tuples with more than 2 elements are not supported yet!!"); auto first_py_item = PyTuple_GetItem(value, 0); if(first_py_item == nullptr) throw std::invalid_argument("The tuple must have a first element"); auto second_py_item = PyTuple_GetItem(value, 1); if(second_py_item == nullptr) throw std::invalid_argument("The tuple must have a second element"); auto first_item = get_value(first_py_item); auto second_item = get_value(second_py_item); return std::make_pair(first_item, second_item); } template std::unordered_map get_value(type> _, PyObject * value){ if(!check_is_dict(value)) throw std::invalid_argument("PyObject is not a dictonary!!"); auto size = PyDict_Size(value); std::unordered_map map; map.reserve(size); PyObject *key, *val; Py_ssize_t pos = 0; while (PyDict_Next(value, &pos, &key, &val)) { auto inner_key = get_value(key); auto inner_value = get_value(val); map.emplace(inner_key, inner_value); } return map; } template const ordered_map get_value(type> _, PyObject * value){ if(!check_is_dict(value)) throw std::invalid_argument("PyObject is not a dictonary!!"); auto size = PyDict_Size(value); ordered_map map; map.reserve(size); PyObject *key, *val; Py_ssize_t pos = 0; while (PyDict_Next(value, &pos, &key, &val)) { auto inner_key = get_value(key); auto inner_value = get_value(val); map.emplace(inner_key, inner_value); } return map; } template<> TermExpression get_value(type_, PyObject * value) { if(!check_is_tuple(value)) throw std::invalid_argument("PyObject is not a Tuple!"); if(PyTuple_Size(value) > 2) throw std::invalid_argument("Tuples with more than 2 elements are not supported yet!!"); auto term = PyTuple_GetItem(value, 1); // 0 is first if(term == nullptr) throw std::invalid_argument("The tuple must have a second element"); auto term_expr = get_value(term); return TermExpression(term_expr); } template class NpArray { public: NpArray(){} NpArray(PyArrayObject * array){ _populate_data(array); _populate_shape(array); size = array->dimensions[0]; } const VecType * data = nullptr; size_t size = 0; /** * The shape of the array: like * ```pyhton * arr = np.array([0,1,2],[3,4,5]) * arr.shape **/ std::vector shape; const VecType& operator[](size_t index) const { return data[index]; } NpArray& operator=(const NpArray& other){ data = reinterpret_cast(other.data); size = other.size; shape = other.shape; return *this; } bool operator==(const NpArray& other) const { if(other.size != size || other.shape.size() != shape.size()) return false; for(auto i = 0; i < other.size; ++i){ if(data[i] != other[i]) return false; } for(auto i = 0; i < other.shape.size(); ++i){ if(shape[i] != other.shape[i]) return false; } return true; } private: void _populate_shape(PyArrayObject * array){ if(!check_is_np_array(array)) throw std::invalid_argument("PyArrayObject is not a numpy array!"); auto p_dims = PyArray_SHAPE(array); if(p_dims == nullptr) throw std::invalid_argument("Couldn't get the shape of the array!"); auto num_dims = PyArray_NDIM(array); shape.reserve(num_dims); for(auto i = 0; i < num_dims; ++i){ shape.emplace_back(p_dims[i]); } } void _populate_data(PyArrayObject * array){ data = reinterpret_cast(array->data); } }; template const NpArray get_value(type> _, PyArrayObject * value){ if(!check_is_np_array(value)) throw std::invalid_argument("PyArrayObject is not a numpy array!"); return NpArray(value); } template const NpArray get_value(type> _, PyObject * value) { PyArrayObject * array = reinterpret_cast(value); return get_value>(array); } PyObject * _get_py_value_from_py_dict(PyObject * dict, const std::string& key){ if(!check_is_dict(dict)) throw std::invalid_argument("Python dictionary is null!"); // PyObject * tmp_key; // PyObject * value; // Py_ssize_t pos = 0; // while (PyDict_Next(dict, &pos, &tmp_key, &value)) { // auto key_str = get_value(tmp_key); // if(key_str == key){ // return value; // } // } return PyDict_GetItemString(dict, key.c_str()); } /** * Returns a C++ vector from a Python list that is inside a Pyhton dictionary under a key. * * We assume that the item indexed by the key, it's a list: * ```python * my_dict = { "key": [1,2,3,4] } * ``` * ```c++ * auto v = get_vec_from_dict_item(pyobj_dict, "key") * for(auto& elem: v) * std::cout << elem; * ``` * Output: * ``` * 1234 * ``` * * @param dict PyObject* A pointer to a PyObject type representing a dictionary * @return A vector of type VecType from the Pyhton's dictionary key. **/ template const std::vector get_vec_from_dict_item(PyObject * dict, const std::string& item_key){ PyObject * py_value = _get_py_value_from_py_dict(dict, item_key); return get_value>(py_value); } /** * Returns a C++ unordered_map from a Python dictionary that is inside another Pyhton * dictionary under a key. * * We assume that the item indexed by the key, it's a dictionary: * ```python * my_dict = { "key": {"inner": 1, "renni": 255} } * ``` * ```c++ * auto m = get_map_from_dict_item(pyobj_dict, "key"); * for(auto& item: m) * std::cout << " key:" << item.first << " val:" << item.second; * ``` * Output: * ``` * key:inner val:1 key:renni val:255 * ``` * * @param dict PyObject* A pointer to a PyObject type representing a dictionary * @return An unordered map of type from the Pyhton's dictionary key. **/ template const std::unordered_map get_map_from_dict_item(PyObject * dict, const std::string& item_key){ PyObject * py_value = _get_py_value_from_py_dict(dict, item_key); return get_value>(py_value); } template const ordered_map get_ordered_map_from_dict_item(PyObject * dict, const std::string& item_key){ PyObject * py_value = _get_py_value_from_py_dict(dict, item_key); return get_value>(py_value); } /** * Returns a C++ value of type ValueTyep from a Python numeric that is inside a Pyhton * dictionary under a key. * * We assume that the item indexed by the key, it's a numeric: * ```python * my_dict = { "key": 255} } * ``` * ```c++ * auto l = get_value_from_dict_item(pyobj_dict, "key"); * std::cout << "val: " << l; * ``` * Output: * ``` * 255 * ``` * * @param dict PyObject* A pointer to a PyObject type representing a dictionary * @return A long from the Pyhton's dictionary key. **/ template ValueType get_value_from_dict_item(PyObject * dict, const std::string& item_key){ PyObject * py_value = _get_py_value_from_py_dict(dict, item_key); if(py_value == Py_None) return {}; return get_value(py_value); } #endif //_PYTHON_TO_CPP_HPP qiskit-aer-0.4.1/src/open_pulse/test_python_to_cpp.hpp000066400000000000000000000053111362723322000231620ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _TEST_HELPERS_HPP #define _TEST_HELPERS_HPP #include #include #include #include #include #include #include #include "python_to_cpp.hpp" // TODO: Test QuantumObj // TODO: Test Hamiltonian bool cpp_test_py_list_to_cpp_vec(PyObject * val){ // val = [1., 2., 3.] auto vec = get_value>(val); auto expected = std::vector{1., 2., 3.}; return vec == expected; } bool cpp_test_py_list_of_lists_to_cpp_vector_of_vectors(PyObject * val){ // val = [[1., 2., 3.]] auto vec = get_value>>(val); auto expected = std::vector>{{1., 2., 3.}}; return vec == expected; } bool cpp_test_py_dict_string_numeric_to_cpp_map_string_numeric(PyObject * val){ // val = {"key": 1} auto map = get_value>(val); auto expected = std::unordered_map{{"key", 1}}; return map == expected; } bool cpp_test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles(PyObject * val){ // val = {"key": [[1., 2., 3.]]} auto map = get_value>>>(val); auto expected = std::unordered_map>>{{"key", {{1., 2., 3.}}}}; return map == expected; } bool cpp_test_np_array_of_doubles(PyArrayObject * val){ // val = np.array([0., 1., 2., 3.]) auto vec = get_value>(val); if(vec[0] != 0. || vec[1] != 1. || vec[2] != 2. || vec[3] != 3.) return false; return true; } bool cpp_test_evaluate_hamiltonians(PyObject * val){ // TODO: Add tests! return false; } bool cpp_test_py_ordered_map(PyObject * val){ // Ordered map should guarantee insertion order. // val = {"D0": 1, "U0": 2, "D1": 3, "U1": 4} std::vector order = {"D0", "U0", "D1", "U1"}; auto ordered = get_value>(val); size_t i = 0; for(const auto& elem: ordered) { auto key = elem.first; if(key != order[i++]) return false; } return true; } #endif // _TEST_HELPERS_HPPqiskit-aer-0.4.1/src/open_pulse/test_python_to_cpp.pyx000066400000000000000000000041331362723322000232140ustar00rootroot00000000000000#!python #cython: language_level=3 # This code is part of Qiskit. # # (C) Copyright IBM 2017, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have be cimport cython from cpython.ref cimport PyObject from libcpp.vector cimport vector from libcpp.unordered_map cimport unordered_map from libcpp.string cimport string from libcpp.complex cimport complex from libcpp cimport bool import numpy as np cimport numpy as np # These definitions are only for testing the C++ wrappers over Python C API cdef extern from "test_python_to_cpp.hpp": cdef bool cpp_test_py_list_to_cpp_vec(list val) cdef bool cpp_test_py_list_of_lists_to_cpp_vector_of_vectors(list val) cdef bool cpp_test_py_dict_string_numeric_to_cpp_map_string_numeric(dict val) cdef bool cpp_test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles(dict val) cdef bool cpp_test_np_array_of_doubles(np.ndarray val) cdef bool cpp_test_evaluate_hamiltonians(list val) cdef bool cpp_test_py_ordered_map(dict val) def test_py_list_to_cpp_vec(val): return cpp_test_py_list_to_cpp_vec(val) def test_py_list_of_lists_to_cpp_vector_of_vectors(val): return cpp_test_py_list_of_lists_to_cpp_vector_of_vectors(val) def test_py_dict_string_numeric_to_cpp_map_string_numeric(val): return cpp_test_py_dict_string_numeric_to_cpp_map_string_numeric(val) def test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles(val): return cpp_test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles(val) def test_np_array_of_doubles(val): return cpp_test_np_array_of_doubles(val) def test_evaluate_hamiltonians(val): return cpp_test_evaluate_hamiltonians(val) def test_py_ordered_map(val): return cpp_test_py_ordered_map(val) qiskit-aer-0.4.1/src/open_pulse/types.hpp000066400000000000000000000013541362723322000204050ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _TEST_TYPES_HPP #define _TEST_TYPES_HPP #include using complex_t = std::complex; struct TermExpression { TermExpression(const std::string& term) : term(term) {} std::string term; }; #endif // _TEST_TYPES_HPPqiskit-aer-0.4.1/src/simulators/000077500000000000000000000000001362723322000165565ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/density_matrix/000077500000000000000000000000001362723322000216215ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/density_matrix/densitymatrix.hpp000077500000000000000000000341051362723322000252440ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_density_matrix_hpp_ #define _qv_density_matrix_hpp_ #include "framework/utils.hpp" #include "simulators/unitary/unitarymatrix.hpp" namespace QV { //============================================================================ // DensityMatrix class //============================================================================ // This class is derived from the UnitaryMatrix class and stores an N-qubit // matrix as a 2*N-qubit vector. // The vector is formed using column-stacking vectorization as under this // convention left-matrix multiplication on qubit-n is equal to multiplication // of the vectorized 2*N qubit vector also on qubit-n. template class DensityMatrix : public UnitaryMatrix { public: // Parent class aliases using BaseVector = QubitVector; using BaseMatrix = UnitaryMatrix; //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- DensityMatrix() : DensityMatrix(0) {}; explicit DensityMatrix(size_t num_qubits); DensityMatrix(const DensityMatrix& obj) = delete; DensityMatrix &operator=(const DensityMatrix& obj) = delete; //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Return the string name of the DensityMatrix class static std::string name() {return "density_matrix";} // Initializes the current vector so that all qubits are in the |0> state. void initialize(); // Initializes the vector to a custom initial state. // The vector can be either a statevector or a vectorized density matrix // If the length of the data vector does not match either case for the // number of qubits an exception is raised. void initialize_from_vector(const cvector_t &data); // Returns the number of qubits for the superoperator virtual uint_t num_qubits() const override {return BaseMatrix::num_qubits_;} //----------------------------------------------------------------------- // Apply Matrices //----------------------------------------------------------------------- // Apply a N-qubit unitary matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. void apply_unitary_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a N-qubit superoperator matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit superop. void apply_superop_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a N-qubit diagonal unitary matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_unitary_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a N-qubit diagonal superoperator matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_superop_matrix(const reg_t &qubits, const cvector_t &mat); //----------------------------------------------------------------------- // Apply Specialized Gates //----------------------------------------------------------------------- // Apply a 2-qubit Controlled-NOT gate to the state vector void apply_cnot(const uint_t qctrl, const uint_t qtrgt); // Apply a 2-qubit Controlled-Z gate to the state vector void apply_cz(const uint_t q0, const uint_t q1); // Apply a 2-qubit SWAP gate to the state vector void apply_swap(const uint_t q0, const uint_t q1); // Apply a single-qubit Pauli-X gate to the state vector void apply_x(const uint_t qubit); // Apply a single-qubit Pauli-Y gate to the state vector void apply_y(const uint_t qubit); // Apply a single-qubit Pauli-Z gate to the state vector void apply_z(const uint_t qubit); // Apply a 3-qubit toffoli gate void apply_toffoli(const uint_t qctrl0, const uint_t qctrl1, const uint_t qtrgt); //----------------------------------------------------------------------- // Z-measurement outcome probabilities //----------------------------------------------------------------------- // Return the Z-basis measurement outcome probability P(outcome) for // outcome in [0, 2^num_qubits - 1] virtual double probability(const uint_t outcome) const override; protected: // Convert qubit indicies to vectorized-density matrix qubitvector indices // For the QubitVector apply matrix function virtual reg_t superop_qubits(const reg_t &qubits) const; // Construct a vectorized superoperator from a vectorized matrix // This is equivalent to vec(tensor(conj(A), A)) cvector_t vmat2vsuperop(const cvector_t &vmat) const; // Qubit threshold for when apply unitary will apply as two matrix multiplications // rather than as a 2n-qubit superoperator matrix. size_t apply_unitary_threshold_ = 4; }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template DensityMatrix::DensityMatrix(size_t num_qubits) : UnitaryMatrix(num_qubits) {}; //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template void DensityMatrix::initialize() { // Zero the underlying vector BaseVector::zero(); // Set to be all |0> sate BaseVector::data_[0] = 1.0; } template void DensityMatrix::initialize_from_vector(const cvector_t &statevec) { if (BaseVector::data_size_ == statevec.size()) { // Use base class initialize for already vectorized matrix BaseVector::initialize_from_vector(statevec); } else if (BaseVector::data_size_ == statevec.size() * statevec.size()) { // Convert statevector into density matrix cvector_t densitymat = AER::Utils::tensor_product(AER::Utils::conjugate(statevec), statevec); std::move(densitymat.begin(), densitymat.end(), BaseVector::data_); } else { throw std::runtime_error("DensityMatrix::initialize input vector is incorrect length. Expected: " + std::to_string(BaseVector::data_size_) + " Received: " + std::to_string(statevec.size())); } } //------------------------------------------------------------------------------ // Apply matrix functions //------------------------------------------------------------------------------ template reg_t DensityMatrix::superop_qubits(const reg_t &qubits) const { reg_t superop_qubits = qubits; // Number of qubits const auto nq = num_qubits(); for (const auto q: qubits) { superop_qubits.push_back(q + nq); } return superop_qubits; } template cvector_t DensityMatrix::vmat2vsuperop(const cvector_t &vmat) const { // Get dimension of unvectorized matrix size_t dim = size_t(std::sqrt(vmat.size())); cvector_t ret(dim * dim * dim * dim, 0.); for (size_t i=0; i < dim; i++) for (size_t j=0; j < dim; j++) for (size_t k=0; k < dim; k++) for (size_t l=0; l < dim; l++) ret[dim*i+k+(dim*dim)*(dim*j+l)] = std::conj(vmat[i+dim*j])*vmat[k+dim*l]; return ret; } template void DensityMatrix::apply_superop_matrix(const reg_t &qubits, const cvector_t &mat) { BaseVector::apply_matrix(superop_qubits(qubits), mat); } template void DensityMatrix::apply_diagonal_superop_matrix(const reg_t &qubits, const cvector_t &diag) { BaseVector::apply_diagonal_matrix(superop_qubits(qubits), diag); } template void DensityMatrix::apply_unitary_matrix(const reg_t &qubits, const cvector_t &mat) { // Check if we apply as two N-qubit matrix multiplications or a single 2N-qubit matrix mult. if (qubits.size() > apply_unitary_threshold_) { // Apply as two N-qubit matrix mults auto nq = num_qubits(); reg_t conj_qubits; for (const auto q: qubits) { conj_qubits.push_back(q + nq); } // Apply id \otimes U BaseVector::apply_matrix(qubits, mat); // Apply conj(U) \otimes id BaseVector::apply_matrix(conj_qubits, AER::Utils::conjugate(mat)); } else { // Apply as single 2N-qubit matrix mult. apply_superop_matrix(qubits, vmat2vsuperop(mat)); } } template void DensityMatrix::apply_diagonal_unitary_matrix(const reg_t &qubits, const cvector_t &diag) { // Apply as single 2N-qubit matrix mult. apply_diagonal_superop_matrix(qubits, AER::Utils::tensor_product(AER::Utils::conjugate(diag), diag)); } //----------------------------------------------------------------------- // Apply Specialized Gates //----------------------------------------------------------------------- template void DensityMatrix::apply_cnot(const uint_t qctrl, const uint_t qtrgt) { std::vector> pairs = { {{1, 3}, {4, 12}, {5, 15}, {6, 14}, {7, 13}, {9, 11}} }; const size_t nq = num_qubits(); const reg_t qubits = {{qctrl, qtrgt, qctrl + nq, qtrgt + nq}}; BaseVector::apply_permutation_matrix(qubits, pairs); } template void DensityMatrix::apply_cz(const uint_t q0, const uint_t q1) { // Lambda function for CZ gate auto lambda = [&](const areg_t<1ULL << 4> &inds)->void { BaseVector::data_[inds[3]] *= -1.; BaseVector::data_[inds[7]] *= -1.; BaseVector::data_[inds[11]] *= -1.; BaseVector::data_[inds[12]] *= -1.; BaseVector::data_[inds[13]] *= -1.; BaseVector::data_[inds[14]] *= -1.; }; const auto nq = num_qubits(); const areg_t<4> qubits = {{q0, q1, q0 + nq, q1 + nq}}; BaseVector::apply_lambda(lambda, qubits); } template void DensityMatrix::apply_swap(const uint_t q0, const uint_t q1) { std::vector> pairs = { {{1, 2}, {4, 8}, {5, 10}, {6, 9}, {7, 11}, {13, 14}} }; const size_t nq = num_qubits(); const reg_t qubits = {{q0, q1, q0 + nq, q1 + nq}}; BaseVector::apply_permutation_matrix(qubits, pairs); } template void DensityMatrix::apply_x(const uint_t qubit) { // Lambda function for X gate superoperator auto lambda = [&](const areg_t<1ULL << 2> &inds)->void { std::swap(BaseVector::data_[inds[0]], BaseVector::data_[inds[3]]); std::swap(BaseVector::data_[inds[1]], BaseVector::data_[inds[2]]); }; // Use the lambda function const areg_t<2> qubits = {{qubit, qubit + num_qubits()}}; BaseVector::apply_lambda(lambda, qubits); } template void DensityMatrix::apply_y(const uint_t qubit) { // Lambda function for Y gate superoperator auto lambda = [&](const areg_t<1ULL << 2> &inds)->void { std::swap(BaseVector::data_[inds[0]], BaseVector::data_[inds[3]]); const std::complex cache = std::complex(-1) * BaseVector::data_[inds[1]]; BaseVector::data_[inds[1]] = std::complex(-1) * BaseVector::data_[inds[2]]; BaseVector::data_[inds[2]] = cache; }; // Use the lambda function const areg_t<2> qubits = {{qubit, qubit + num_qubits()}}; BaseVector::apply_lambda(lambda, qubits); } template void DensityMatrix::apply_z(const uint_t qubit) { // Lambda function for Z gate superoperator auto lambda = [&](const areg_t<1ULL << 2> &inds)->void { BaseVector::data_[inds[1]] *= -1; BaseVector::data_[inds[2]] *= -1; }; // Use the lambda function const areg_t<2> qubits = {{qubit, qubit + num_qubits()}}; BaseVector::apply_lambda(lambda, qubits); } template void DensityMatrix::apply_toffoli(const uint_t qctrl0, const uint_t qctrl1, const uint_t qtrgt) { std::vector> pairs = { {{3, 7}, {11, 15}, {19, 23}, {24, 56}, {25, 57}, {26, 58}, {27, 63}, {28, 60}, {29, 61}, {30, 62}, {31, 59}, {35, 39}, {43,47}, {51, 55}} }; const size_t nq = num_qubits(); const reg_t qubits = {{qctrl0, qctrl1, qtrgt, qctrl0 + nq, qctrl1 + nq, qtrgt + nq}}; BaseVector::apply_permutation_matrix(qubits, pairs); } //----------------------------------------------------------------------- // Z-measurement outcome probabilities //----------------------------------------------------------------------- template double DensityMatrix::probability(const uint_t outcome) const { const auto shift = BaseMatrix::num_rows() + 1; return std::real(BaseVector::data_[outcome * shift]); } //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::DensityMatrix&m) { out << m.matrix(); return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/simulators/density_matrix/densitymatrix_state.hpp000066400000000000000000000657771362723322000264640ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_densitymatrix_state_hpp #define _aer_densitymatrix_state_hpp #include #define _USE_MATH_DEFINES #include #include "framework/utils.hpp" #include "framework/json.hpp" #include "simulators/state.hpp" #include "densitymatrix.hpp" #ifdef AER_THRUST_SUPPORTED #include "densitymatrix_thrust.hpp" #endif namespace AER { namespace DensityMatrix { // Allowed gates enum class enum class Gates { u1, u2, u3, id, x, y, z, h, s, sdg, t, tdg, // single qubit cx, cz, swap, // two qubit ccx // three qubit }; // Allowed snapshots enum class enum class Snapshots { cmemory, cregister, densitymatrix, probs, probs_var /* TODO: The following expectation value snapshots still need to be implemented */ //,expval_pauli, expval_pauli_var, //expval_matrix, expval_matrix_var }; //========================================================================= // DensityMatrix State subclass //========================================================================= template > class State : public Base::State { public: using BaseState = Base::State; State() = default; virtual ~State() = default; //----------------------------------------------------------------------- // Base class overrides //----------------------------------------------------------------------- // Return the string name of the State class virtual std::string name() const override {return densmat_t::name();} // Return the set of qobj instruction types supported by the State virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t({ Operations::OpType::gate, Operations::OpType::measure, Operations::OpType::reset, Operations::OpType::snapshot, Operations::OpType::barrier, Operations::OpType::bfunc, Operations::OpType::roerror, Operations::OpType::matrix, Operations::OpType::kraus, Operations::OpType::superop }); } // Return the set of qobj gate instruction names supported by the State virtual stringset_t allowed_gates() const override { return {"U", "CX", "u1", "u2", "u3", "cx", "cz", "swap", "id", "x", "y", "z", "h", "s", "sdg", "t", "tdg", "ccx"}; } // Return the set of qobj snapshot types supported by the State virtual stringset_t allowed_snapshots() const override { return {"density_matrix", "memory", "register", "probabilities", "probabilities_with_variance"}; } // Apply a sequence of operations by looping over list // If the input is not in allowed_ops an exeption will be raised. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; // Initializes an n-qubit state to the all |0> state virtual void initialize_qreg(uint_t num_qubits) override; // Initializes to a specific n-qubit state virtual void initialize_qreg(uint_t num_qubits, const densmat_t &state) override; // Returns the required memory for storing an n-qubit state in megabytes. // For this state the memory is indepdentent of the number of ops // and is approximately 16 * 1 << num_qubits bytes virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const override; // Load the threshold for applying OpenMP parallelization // if the controller/engine allows threads for it virtual void set_config(const json_t &config) override; // Sample n-measurement outcomes without applying the measure operation // to the system state virtual std::vector sample_measure(const reg_t& qubits, uint_t shots, RngEngine &rng) override; //----------------------------------------------------------------------- // Additional methods //----------------------------------------------------------------------- // Initializes to a specific n-qubit state given as a complex std::vector virtual void initialize_qreg(uint_t num_qubits, const cvector_t &state); // Initializes to a specific n-qubit state given as a complex matrix virtual void initialize_qreg(uint_t num_qubits, const cmatrix_t &state); // Initialize OpenMP settings for the underlying DensityMatrix class void initialize_omp(); protected: //----------------------------------------------------------------------- // Apply instructions //----------------------------------------------------------------------- // Applies a sypported Gate operation to the state class. // If the input is not in allowed_gates an exeption will be raised. void apply_gate(const Operations::Op &op); // Measure qubits and return a list of outcomes [q0, q1, ...] // If a state subclass supports this function it then "measure" // should be contained in the set returned by the 'allowed_ops' // method. virtual void apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng); // Reset the specified qubits to the |0> state by tracing out qubits void apply_reset(const reg_t &qubits); // Apply a supported snapshot instruction // If the input is not in allowed_snapshots an exeption will be raised. virtual void apply_snapshot(const Operations::Op &op, ExperimentData &data); // Apply a matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cmatrix_t & mat); // Apply a vectorized matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cvector_t & vmat); // Apply a Kraus error operation void apply_kraus(const reg_t &qubits, const std::vector &kraus); //----------------------------------------------------------------------- // Measurement Helpers //----------------------------------------------------------------------- // Return vector of measure probabilities for specified qubits // If a state subclass supports this function it then "measure" // should be contained in the set returned by the 'allowed_ops' // method. // TODO: move to private (no longer part of base class) rvector_t measure_probs(const reg_t &qubits) const; // Sample the measurement outcome for qubits // return a pair (m, p) of the outcome m, and its corresponding // probability p. // Outcome is given as an int: Eg for two-qubits {q0, q1} we have // 0 -> |q1 = 0, q0 = 0> state // 1 -> |q1 = 0, q0 = 1> state // 2 -> |q1 = 1, q0 = 0> state // 3 -> |q1 = 1, q0 = 1> state std::pair sample_measure_with_prob(const reg_t &qubits, RngEngine &rng); void measure_reset_update(const std::vector &qubits, const uint_t final_state, const uint_t meas_state, const double meas_prob); //----------------------------------------------------------------------- // Special snapshot types // // IMPORTANT: These methods are not marked const to allow modifying state // during snapshot, but after the snapshot is applied the simulator // should be left in the pre-snapshot state. //----------------------------------------------------------------------- // Snapshot current qubit probabilities for a measurement (average) void snapshot_probabilities(const Operations::Op &op, ExperimentData &data, bool variance); // Snapshot the expectation value of a Pauli operator void snapshot_pauli_expval(const Operations::Op &op, ExperimentData &data, bool variance); // Snapshot the expectation value of a matrix operator void snapshot_matrix_expval(const Operations::Op &op, ExperimentData &data, bool variance); //----------------------------------------------------------------------- // Single-qubit gate helpers //----------------------------------------------------------------------- // Apply a waltz gate specified by parameters u3(theta, phi, lambda) void apply_gate_u3(const uint_t qubit, const double theta, const double phi, const double lambda); // Optimize phase gate with diagonal [1, phase] void apply_gate_phase(const uint_t qubit, const complex_t phase); //----------------------------------------------------------------------- // Config Settings //----------------------------------------------------------------------- // OpenMP qubit threshold // NOTE: This is twice the number of qubits in the DensityMatrix since it // refers to the equivalent qubit number in the underlying QubitVector class int omp_qubit_threshold_ = 14; // Threshold for chopping small values to zero in JSON double json_chop_threshold_ = 1e-10; // Table of allowed gate names to gate enum class members const static stringmap_t gateset_; // Table of allowed snapshot types to enum class members const static stringmap_t snapshotset_; }; //========================================================================= // Implementation: Allowed ops and gateset //========================================================================= template const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::x}, // Pauli-X gate {"y", Gates::y}, // Pauli-Y gate {"z", Gates::z}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gates::t}, // T-gate (sqrt(S)) {"tdg", Gates::tdg}, // Conjguate-transpose of T gate // Waltz Gates {"u1", Gates::u1}, // zero-X90 pulse waltz gate {"u2", Gates::u2}, // single-X90 pulse waltz gate {"u3", Gates::u3}, // two X90 pulse waltz gate {"U", Gates::u3}, // two X90 pulse waltz gate // Two-qubit gates {"CX", Gates::cx}, // Controlled-X gate (CNOT) {"cx", Gates::cx}, // Controlled-X gate (CNOT) {"cz", Gates::cz}, // Controlled-Z gate {"swap", Gates::swap}, // SWAP gate // Three-qubit gates {"ccx", Gates::ccx} // Controlled-CX gate (Toffoli) }); template const stringmap_t State::snapshotset_({ {"density_matrix", Snapshots::densitymatrix}, {"probabilities", Snapshots::probs}, {"probabilities_with_variance", Snapshots::probs_var}, {"memory", Snapshots::cmemory}, {"register", Snapshots::cregister} }); //========================================================================= // Implementation: Base class method overrides //========================================================================= //------------------------------------------------------------------------- // Initialization //------------------------------------------------------------------------- template void State::initialize_qreg(uint_t num_qubits) { initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize(); } template void State::initialize_qreg(uint_t num_qubits, const densmat_t &state) { // Check dimension of state if (state.num_qubits() != num_qubits) { throw std::invalid_argument("DensityMatrix::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_data(state.data(), 1ULL << 2 * num_qubits); } template void State::initialize_qreg(uint_t num_qubits, const cmatrix_t &state) { if (state.size() != 1ULL << 2 * num_qubits) { throw std::invalid_argument("DensityMatrix::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_matrix(state); } template void State::initialize_qreg(uint_t num_qubits, const cvector_t &state) { if (state.size() != 1ULL << 2 * num_qubits) { throw std::invalid_argument("DensityMatrix::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_vector(state); } template void State::initialize_omp() { BaseState::qreg_.set_omp_threshold(omp_qubit_threshold_); if (BaseState::threads_ > 0) BaseState::qreg_.set_omp_threads(BaseState::threads_); // set allowed OMP threads in qubitvector } //------------------------------------------------------------------------- // Utility //------------------------------------------------------------------------- template size_t State::required_memory_mb(uint_t num_qubits, const std::vector &ops) const { // An n-qubit state vector as 2^n complex doubles // where each complex double is 16 bytes (void)ops; // avoid unused variable compiler warning size_t shift_mb = std::max(0, num_qubits + 4 - 20); size_t mem_mb = 1ULL << shift_mb; return mem_mb; } template void State::set_config(const json_t &config) { // Set threshold for truncating snapshots JSON::get_value(json_chop_threshold_, "chop_threshold", config); BaseState::qreg_.set_json_chop_threshold(json_chop_threshold_); // Set OMP threshold for state update functions JSON::get_value(omp_qubit_threshold_, "statevector_parallel_threshold", config); } //========================================================================= // Implementation: apply operations //========================================================================= template void State::apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) { // Simple loop over vector of input operations for (const auto op: ops) { // If conditional op check conditional if (BaseState::creg_.check_conditional(op) == false) return; switch (op.type) { case Operations::OpType::barrier: break; case Operations::OpType::reset: apply_reset(op.qubits); break; case Operations::OpType::measure: apply_measure(op.qubits, op.memory, op.registers, rng); break; case Operations::OpType::bfunc: BaseState::creg_.apply_bfunc(op); break; case Operations::OpType::roerror: BaseState::creg_.apply_roerror(op, rng); break; case Operations::OpType::gate: apply_gate(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data); break; case Operations::OpType::matrix: apply_matrix(op.qubits, op.mats[0]); break; case Operations::OpType::superop: BaseState::qreg_.apply_superop_matrix(op.qubits, Utils::vectorize_matrix(op.mats[0])); break; case Operations::OpType::kraus: apply_kraus(op.qubits, op.mats); break; default: throw std::invalid_argument("DensityMatrix::State::invalid instruction \'" + op.name + "\'."); } } } //========================================================================= // Implementation: Snapshots //========================================================================= template void State::apply_snapshot(const Operations::Op &op, ExperimentData &data) { // Look for snapshot type in snapshotset auto it = snapshotset_.find(op.name); if (it == snapshotset_.end()) throw std::invalid_argument("DensityMatrixState::invalid snapshot instruction \'" + op.name + "\'."); switch (it -> second) { case Snapshots::densitymatrix: data.add_average_snapshot("density_matrix", op.string_params[0], BaseState::creg_.memory_hex(), BaseState::qreg_, false); break; case Snapshots::cmemory: BaseState::snapshot_creg_memory(op, data); break; case Snapshots::cregister: BaseState::snapshot_creg_register(op, data); break; case Snapshots::probs: // get probs as hexadecimal snapshot_probabilities(op, data, false); break; case Snapshots::probs_var: // get probs as hexadecimal snapshot_probabilities(op, data, true); break; /* TODO case Snapshots::expval_pauli: { snapshot_pauli_expval(op, data, false); } break; case Snapshots::expval_matrix: { snapshot_matrix_expval(op, data, false); } break; case Snapshots::expval_pauli_var: { snapshot_pauli_expval(op, data, true); } break; case Snapshots::expval_matrix_var: { snapshot_matrix_expval(op, data, true); } break; */ default: // We shouldn't get here unless there is a bug in the snapshotset throw std::invalid_argument("DensityMatrix::State::invalid snapshot instruction \'" + op.name + "\'."); } } template void State::snapshot_probabilities(const Operations::Op &op, ExperimentData &data, bool variance) { // get probs as hexadecimal auto probs = Utils::vec2ket(measure_probs(op.qubits), json_chop_threshold_, 16); data.add_average_snapshot("probabilities", op.string_params[0], BaseState::creg_.memory_hex(), probs, variance); } //========================================================================= // Implementation: Matrix multiplication //========================================================================= template void State::apply_gate(const Operations::Op &op) { // Look for gate name in gateset auto it = gateset_.find(op.name); if (it == gateset_.end()) throw std::invalid_argument("DensityMatrixState::invalid gate instruction \'" + op.name + "\'."); switch (it -> second) { case Gates::u3: apply_gate_u3(op.qubits[0], std::real(op.params[0]), std::real(op.params[1]), std::real(op.params[2])); break; case Gates::u2: apply_gate_u3(op.qubits[0], M_PI / 2., std::real(op.params[0]), std::real(op.params[1])); break; case Gates::u1: apply_gate_phase(op.qubits[0], std::exp(complex_t(0., 1.) * op.params[0])); break; case Gates::cx: BaseState::qreg_.apply_cnot(op.qubits[0], op.qubits[1]); break; case Gates::cz: BaseState::qreg_.apply_cz(op.qubits[0], op.qubits[1]); break; case Gates::id: break; case Gates::x: BaseState::qreg_.apply_x(op.qubits[0]); break; case Gates::y: BaseState::qreg_.apply_y(op.qubits[0]); break; case Gates::z: BaseState::qreg_.apply_z(op.qubits[0]); break; case Gates::h: apply_gate_u3(op.qubits[0], M_PI / 2., 0., M_PI); break; case Gates::s: apply_gate_phase(op.qubits[0], complex_t(0., 1.)); break; case Gates::sdg: apply_gate_phase(op.qubits[0], complex_t(0., -1.)); break; case Gates::t: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, isqrt2)); } break; case Gates::tdg: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, -isqrt2)); } break; case Gates::swap: { BaseState::qreg_.apply_swap(op.qubits[0], op.qubits[1]); } break; case Gates::ccx: BaseState::qreg_.apply_toffoli(op.qubits[0], op.qubits[1], op.qubits[2]); break; default: // We shouldn't reach here unless there is a bug in gateset throw std::invalid_argument("DensityMatrix::State::invalid gate instruction \'" + op.name + "\'."); } } template void State::apply_matrix(const reg_t &qubits, const cmatrix_t &mat) { if (mat.GetRows() == 1) { BaseState::qreg_.apply_diagonal_unitary_matrix(qubits, Utils::vectorize_matrix(mat)); } else { BaseState::qreg_.apply_unitary_matrix(qubits, Utils::vectorize_matrix(mat)); } } template void State::apply_gate_u3(uint_t qubit, double theta, double phi, double lambda) { BaseState::qreg_.apply_unitary_matrix(reg_t({qubit}), Utils::VMatrix::u3(theta, phi, lambda)); } template void State::apply_gate_phase(uint_t qubit, complex_t phase) { cvector_t diag = {{1., phase}}; BaseState::qreg_.apply_diagonal_unitary_matrix(reg_t({qubit}), diag); } //========================================================================= // Implementation: Reset and Measurement Sampling //========================================================================= template void State::apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng) { // Actual measurement outcome const auto meas = sample_measure_with_prob(qubits, rng); // Implement measurement update measure_reset_update(qubits, meas.first, meas.first, meas.second); const reg_t outcome = Utils::int2reg(meas.first, 2, qubits.size()); BaseState::creg_.store_measure(outcome, cmemory, cregister); } template rvector_t State::measure_probs(const reg_t &qubits) const { return BaseState::qreg_.probabilities(qubits); } template std::vector State::sample_measure(const reg_t &qubits, uint_t shots, RngEngine &rng) { // Generate flat register for storing std::vector rnds; rnds.reserve(shots); for (uint_t i = 0; i < shots; ++i) rnds.push_back(rng.rand(0, 1)); auto allbit_samples = BaseState::qreg_.sample_measure(rnds); // Convert to reg_t format std::vector all_samples; all_samples.reserve(shots); for (int_t val : allbit_samples) { reg_t allbit_sample = Utils::int2reg(val, 2, BaseState::qreg_.num_qubits()); reg_t sample; sample.reserve(qubits.size()); for (uint_t qubit : qubits) { sample.push_back(allbit_sample[qubit]); } all_samples.push_back(sample); } return all_samples; } template void State::apply_reset(const reg_t &qubits) { // TODO: This can be more efficient by adding reset // to base class rather than doing a matrix multiplication // where all but 1 row is zeros. const auto reset_op = Utils::SMatrix::reset(1ULL << qubits.size()); BaseState::qreg_.apply_superop_matrix(qubits, Utils::vectorize_matrix(reset_op)); } template std::pair State::sample_measure_with_prob(const reg_t &qubits, RngEngine &rng) { rvector_t probs = measure_probs(qubits); // Randomly pick outcome and return pair uint_t outcome = rng.rand_int(probs); return std::make_pair(outcome, probs[outcome]); } template void State::measure_reset_update(const reg_t &qubits, const uint_t final_state, const uint_t meas_state, const double meas_prob) { // Update a state vector based on an outcome pair [m, p] from // sample_measure_with_prob function, and a desired post-measurement final_state // Single-qubit case if (qubits.size() == 1) { // Diagonal matrix for projecting and renormalizing to measurement outcome cvector_t mdiag(2, 0.); mdiag[meas_state] = 1. / std::sqrt(meas_prob); BaseState::qreg_.apply_diagonal_unitary_matrix(qubits, mdiag); // If it doesn't agree with the reset state update if (final_state != meas_state) { BaseState::qreg_.apply_x(qubits[0]); } } // Multi qubit case else { // Diagonal matrix for projecting and renormalizing to measurement outcome const size_t dim = 1ULL << qubits.size(); cvector_t mdiag(dim, 0.); mdiag[meas_state] = 1. / std::sqrt(meas_prob); BaseState::qreg_.apply_diagonal_unitary_matrix(qubits, mdiag); // If it doesn't agree with the reset state update // TODO This function could be optimized as a permutation update if (final_state != meas_state) { // build vectorized permutation matrix cvector_t perm(dim * dim, 0.); perm[final_state * dim + meas_state] = 1.; perm[meas_state * dim + final_state] = 1.; for (size_t j=0; j < dim; j++) { if (j != final_state && j != meas_state) perm[j * dim + j] = 1.; } // apply permutation to swap state BaseState::qreg_.apply_unitary_matrix(qubits, perm); } } } //========================================================================= // Implementation: Kraus Noise //========================================================================= template void State::apply_kraus(const reg_t &qubits, const std::vector &kmats) { // Convert to Superoperator const auto nrows = kmats[0].GetRows(); cmatrix_t superop(nrows * nrows, nrows * nrows); for (const auto kraus : kmats) { superop += Utils::tensor_product(Utils::conjugate(kraus), kraus); } BaseState::qreg_.apply_superop_matrix(qubits, Utils::vectorize_matrix(superop)); } //------------------------------------------------------------------------- } // end namespace DensityMatrix //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/simulators/density_matrix/densitymatrix_thrust.hpp000077500000000000000000000445201362723322000266570ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_density_matrix_thrust_hpp_ #define _qv_density_matrix_thrust_hpp_ #include "framework/utils.hpp" #include "simulators/unitary/unitarymatrix_thrust.hpp" namespace QV { //============================================================================ // DensityMatrixThrust class //============================================================================ // This class is derived from the UnitaryMatrix class and stores an N-qubit // matrix as a 2*N-qubit vector. // The vector is formed using column-stacking vectorization as under this // convention left-matrix multiplication on qubit-n is equal to multiplication // of the vectorized 2*N qubit vector also on qubit-n. template class DensityMatrixThrust : public UnitaryMatrixThrust { public: // Parent class aliases using BaseVector = QubitVectorThrust; using BaseMatrix = UnitaryMatrixThrust; //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- DensityMatrixThrust() : DensityMatrixThrust(0) {}; explicit DensityMatrixThrust(size_t num_qubits); DensityMatrixThrust(const DensityMatrixThrust& obj) = delete; DensityMatrixThrust &operator=(const DensityMatrixThrust& obj) = delete; //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Return the string name of the class #ifdef AER_THRUST_CUDA static std::string name() {return "density_matrix_gpu";} #else static std::string name() {return "density_matrix_thrust";} #endif // Initializes the current vector so that all qubits are in the |0> state. void initialize(); // Initializes the vector to a custom initial state. // The vector can be either a statevector or a vectorized density matrix // If the length of the data vector does not match either case for the // number of qubits an exception is raised. void initialize_from_vector(const cvector_t &data); // Returns the number of qubits for the superoperator virtual uint_t num_qubits() const override {return BaseMatrix::num_qubits_;} //----------------------------------------------------------------------- // Apply Matrices //----------------------------------------------------------------------- // Apply a N-qubit unitary matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. void apply_unitary_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a N-qubit superoperator matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit superop. void apply_superop_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a N-qubit diagonal unitary matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_unitary_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a N-qubit diagonal superoperator matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_superop_matrix(const reg_t &qubits, const cvector_t &mat); //----------------------------------------------------------------------- // Apply Specialized Gates //----------------------------------------------------------------------- // Apply a 2-qubit Controlled-NOT gate to the state vector void apply_cnot(const uint_t qctrl, const uint_t qtrgt); // Apply a 2-qubit Controlled-Z gate to the state vector void apply_cz(const uint_t q0, const uint_t q1); // Apply a 2-qubit SWAP gate to the state vector void apply_swap(const uint_t q0, const uint_t q1); // Apply a single-qubit Pauli-X gate to the state vector void apply_x(const uint_t qubit); // Apply a single-qubit Pauli-Y gate to the state vector void apply_y(const uint_t qubit); // Apply a single-qubit Pauli-Z gate to the state vector void apply_z(const uint_t qubit); // Apply a 3-qubit toffoli gate void apply_toffoli(const uint_t qctrl0, const uint_t qctrl1, const uint_t qtrgt); //----------------------------------------------------------------------- // Z-measurement outcome probabilities //----------------------------------------------------------------------- // Return the Z-basis measurement outcome probability P(outcome) for // outcome in [0, 2^num_qubits - 1] virtual double probability(const uint_t outcome) const override; // Return M sampled outcomes for Z-basis measurement of all qubits // The input is a length M list of random reals between [0, 1) used for // generating samples. virtual reg_t sample_measure(const std::vector &rnds) const override; protected: // Convert qubit indicies to vectorized-density matrix qubitvector indices // For the QubitVector apply matrix function virtual reg_t superop_qubits(const reg_t &qubits) const; // Construct a vectorized superoperator from a vectorized matrix // This is equivalent to vec(tensor(conj(A), A)) cvector_t vmat2vsuperop(const cvector_t &vmat) const; // Qubit threshold for when apply unitary will apply as two matrix multiplications // rather than as a 2n-qubit superoperator matrix. size_t apply_unitary_threshold_ = 4; }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template DensityMatrixThrust::DensityMatrixThrust(size_t num_qubits) : UnitaryMatrixThrust(num_qubits) {}; //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template void DensityMatrixThrust::initialize() { // Zero the underlying vector BaseVector::zero(); // Set to be all |0> sate std::complex one = 1.0; BaseVector::set_state(0,one); } template void DensityMatrixThrust::initialize_from_vector(const cvector_t &statevec) { if (BaseVector::data_size_ == statevec.size()) { // Use base class initialize for already vectorized matrix BaseVector::initialize_from_vector(statevec); } else if (BaseVector::data_size_ == statevec.size() * statevec.size()) { // Convert statevector into density matrix cvector_t densitymat = AER::Utils::tensor_product(AER::Utils::conjugate(statevec), statevec); // std::move(densitymat.begin(), densitymat.end(), BaseVector::data_); BaseVector::initialize_from_vector(densitymat); } else { throw std::runtime_error("DensityMatrixThrust::initialize input vector is incorrect length. Expected: " + std::to_string(BaseVector::data_size_) + " Received: " + std::to_string(statevec.size())); } #ifdef AER_DEBUG BaseVector::DebugMsg(" density::initialize_from_vector"); #endif } //------------------------------------------------------------------------------ // Apply matrix functions //------------------------------------------------------------------------------ template reg_t DensityMatrixThrust::superop_qubits(const reg_t &qubits) const { reg_t superop_qubits = qubits; // Number of qubits const auto nq = num_qubits(); for (const auto q: qubits) { superop_qubits.push_back(q + nq); } return superop_qubits; } template cvector_t DensityMatrixThrust::vmat2vsuperop(const cvector_t &vmat) const { // Get dimension of unvectorized matrix size_t dim = size_t(std::sqrt(vmat.size())); cvector_t ret(dim * dim * dim * dim, 0.); for (size_t i=0; i < dim; i++) for (size_t j=0; j < dim; j++) for (size_t k=0; k < dim; k++) for (size_t l=0; l < dim; l++) ret[dim*i+k+(dim*dim)*(dim*j+l)] = std::conj(vmat[i+dim*j])*vmat[k+dim*l]; return ret; } template void DensityMatrixThrust::apply_superop_matrix(const reg_t &qubits, const cvector_t &mat) { BaseVector::apply_matrix(superop_qubits(qubits), mat); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_superop_matrix",qubits); #endif } template void DensityMatrixThrust::apply_diagonal_superop_matrix(const reg_t &qubits, const cvector_t &diag) { BaseVector::apply_diagonal_matrix(superop_qubits(qubits), diag); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_diagonal_superop_matrix",qubits); #endif } template void DensityMatrixThrust::apply_unitary_matrix(const reg_t &qubits, const cvector_t &mat) { // Check if we apply as two N-qubit matrix multiplications or a single 2N-qubit matrix mult. if (qubits.size() > apply_unitary_threshold_) { // Apply as two N-qubit matrix mults auto nq = num_qubits(); reg_t conj_qubits; for (const auto q: qubits) { conj_qubits.push_back(q + nq); } // Apply id \otimes U BaseVector::apply_matrix(qubits, mat); // Apply conj(U) \otimes id BaseVector::apply_matrix(conj_qubits, AER::Utils::conjugate(mat)); } else { // Apply as single 2N-qubit matrix mult. apply_superop_matrix(qubits, vmat2vsuperop(mat)); } #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_unitary_matrix",qubits); #endif } template void DensityMatrixThrust::apply_diagonal_unitary_matrix(const reg_t &qubits, const cvector_t &diag) { // Apply as single 2N-qubit matrix mult. apply_diagonal_superop_matrix(qubits, AER::Utils::tensor_product(AER::Utils::conjugate(diag), diag)); } //----------------------------------------------------------------------- // Apply Specialized Gates //----------------------------------------------------------------------- template void DensityMatrixThrust::apply_cnot(const uint_t qctrl, const uint_t qtrgt) { std::vector> pairs = { {{1, 3}, {4, 12}, {5, 15}, {6, 14}, {7, 13}, {9, 11}} }; const size_t nq = num_qubits(); const reg_t qubits = {{qctrl, qtrgt, qctrl + nq, qtrgt + nq}}; BaseVector::apply_permutation_matrix(qubits, pairs); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_cnot",qubits); #endif } template void DensityMatrixThrust::apply_cz(const uint_t q0, const uint_t q1) { cvector_t vec; vec.resize(16, 0.); vec[3] = -1.; vec[7] = -1.; vec[11] = -1.; vec[12] = -1.; vec[13] = -1.; vec[14] = -1.; const auto nq = num_qubits(); const reg_t qubits = {{q0, q1, q0 + nq, q1 + nq}}; BaseVector::apply_matrix(qubits, vec); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_cz",qubits); #endif } template void DensityMatrixThrust::apply_swap(const uint_t q0, const uint_t q1) { std::vector> pairs = { {{1, 2}, {4, 8}, {5, 10}, {6, 9}, {7, 11}, {13, 14}} }; const size_t nq = num_qubits(); const reg_t qubits = {{q0, q1, q0 + nq, q1 + nq}}; //TODO support BaseVector::apply_permutation_matrix(qubits, pairs); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_swap",qubits); #endif } template class DensityX : public GateFuncBase { protected: uint_t mask0; uint_t mask1; public: DensityX(int q0,int q1) { if(q0 < q1){ mask0 = (1ull << q0) - 1; mask1 = (1ull << q1) - 1; } else{ mask0 = (1ull << q1) - 1; mask1 = (1ull << q0) - 1; } } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,i0,i1,i2; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1,q2,q3; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; i0 = i & mask0; i2 = (i - i0) << 1; i1 = i2 & mask1; i2 = (i2 - i1) << 1; i0 = i0 + i1 + i2; q0 = pV[offsets[0]+i0]; q1 = pV[offsets[1]+i0]; q2 = pV[offsets[2]+i0]; q3 = pV[offsets[3]+i0]; pV[offsets[0]+i0] = q3; pV[offsets[1]+i0] = q2; pV[offsets[2]+i0] = q1; pV[offsets[3]+i0] = q0; return 0.0; } }; template void DensityMatrixThrust::apply_x(const uint_t qubit) { // Use the lambda function const reg_t qubits = {{qubit, qubit + num_qubits()}}; BaseVector::apply_function(DensityX(qubits[0], qubits[1]), qubits); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_x",qubits); BaseVector::DebugDump(); #endif } template void DensityMatrixThrust::apply_y(const uint_t qubit) { cvector_t vec; vec.resize(16, 0.); vec[0 * 4 + 3] = 1.; vec[1 * 4 + 2] = -1.; vec[2 * 4 + 1] = -1.; vec[3 * 4 + 0] = 1.; // Use the lambda function const reg_t qubits = {{qubit, qubit + num_qubits()}}; BaseVector::apply_matrix(qubits, vec); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_y",qubits); #endif } template void DensityMatrixThrust::apply_z(const uint_t qubit) { cvector_t vec; vec.resize(16, 0.); vec[0 * 4 + 0] = 1.; vec[1 * 4 + 1] = -1.; vec[2 * 4 + 2] = -1.; vec[3 * 4 + 3] = 1.; // Use the lambda function const reg_t qubits = {{qubit, qubit + num_qubits()}}; BaseVector::apply_matrix(qubits, vec); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_z",qubits); #endif } template void DensityMatrixThrust::apply_toffoli(const uint_t qctrl0, const uint_t qctrl1, const uint_t qtrgt) { std::vector> pairs = { {{3, 7}, {11, 15}, {19, 23}, {24, 56}, {25, 57}, {26, 58}, {27, 63}, {28, 60}, {29, 61}, {30, 62}, {31, 59}, {35, 39}, {43,47}, {51, 55}} }; const size_t nq = num_qubits(); const reg_t qubits = {{qctrl0, qctrl1, qtrgt, qctrl0 + nq, qctrl1 + nq, qtrgt + nq}}; BaseVector::apply_permutation_matrix(qubits, pairs); #ifdef AER_DEBUG BaseVector::DebugMsg(" density::apply_toffoli",qubits); #endif } //----------------------------------------------------------------------- // Z-measurement outcome probabilities //----------------------------------------------------------------------- template double DensityMatrixThrust::probability(const uint_t outcome) const { const auto shift = BaseMatrix::num_rows() + 1; return std::real(BaseVector::get_state(outcome * shift)); } template reg_t DensityMatrixThrust::sample_measure(const std::vector &rnds) const { const int_t END = 1LL << num_qubits(); const int_t SHOTS = rnds.size(); reg_t samples; samples.assign(SHOTS, 0); const int INDEX_SIZE = BaseVector::sample_measure_index_size_; const int_t INDEX_END = BITS[INDEX_SIZE]; // Qubit number is below index size, loop over shots if (END < INDEX_END) { #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #pragma omp for for (int_t i = 0; i < SHOTS; ++i) { double rnd = rnds[i]; double p = .0; int_t sample; for (sample = 0; sample < END - 1; ++sample) { p += probability(sample); if (rnd < p) break; } samples[i] = sample; } } // end omp parallel } // Qubit number is above index size, loop over index blocks else { // Initialize indexes std::vector idxs; idxs.assign(INDEX_END, 0.0); uint_t loop = (END >> INDEX_SIZE); #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #pragma omp for for (int_t i = 0; i < INDEX_END; ++i) { uint_t base = loop * i; double total = .0; double p = .0; for (uint_t j = 0; j < loop; ++j) { uint_t k = base | j; p = probability(k); total += p; } idxs[i] = total; } } // end omp parallel #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #pragma omp for for (int_t i = 0; i < SHOTS; ++i) { double rnd = rnds[i]; double p = .0; int_t sample = 0; for (uint_t j = 0; j < idxs.size(); ++j) { if (rnd < (p + idxs[j])) { break; } p += idxs[j]; sample += loop; } for (; sample < END - 1; ++sample) { p += probability(sample); if (rnd < p){ break; } } samples[i] = sample; } } // end omp parallel } #ifdef AER_DEBUG BaseVector::DebugMsg(" density::sample_measure",samples); #endif return samples; } //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::DensityMatrixThrust&m) { out << m.matrix(); return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/simulators/extended_stabilizer/000077500000000000000000000000001362723322000226065ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/extended_stabilizer/ch_runner.hpp000066400000000000000000000443651362723322000253160ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef chsimulator_runner_hpp #define chsimulator_runner_hpp #include "chlib/core.hpp" #include "chlib/chstabilizer.hpp" #include "gates.hpp" #include "framework/json.hpp" #include "framework/operations.hpp" #include "framework/rng.hpp" #include "framework/types.hpp" #define _USE_MATH_DEFINES #include #include #include #include #ifdef _OPENMP #include #endif namespace CHSimulator { using chstabilizer_t = StabilizerState; const double T_ANGLE = M_PI/4.; const double TDG_ANGLE = -1.*M_PI/4.; const U1Sample t_sample(T_ANGLE); const U1Sample tdg_sample(TDG_ANGLE); const uint_t ZERO = 0ULL; thread_local std::unordered_map Z_ROTATIONS; class Runner { private: uint_t n_qubits_; uint_t num_states_; std::vector states_; std::vector coefficients_; uint_t num_threads_; uint_t omp_threshold_; bool accept_; complex_t old_ampsum_; uint_t x_string_; uint_t last_proposal_; void init_metropolis(AER::RngEngine &rng); void metropolis_step(AER::RngEngine &rng); // json_t serialize_state(uint_t rank) const; public: Runner(): n_qubits_(0), num_states_(0) {}; Runner(uint_t n_qubits); virtual ~Runner() = default; void initialize(uint_t n_qubits); void initialize_omp(uint_t n_threads, uint_t threshold_rank); bool empty() const { return (n_qubits_ == 0 || num_states_ == 0); } uint_t get_num_states() const; uint_t get_n_qubits() const; bool check_omp_threshold(); //Convert each state to a json object and return it. std::vector serialize_decomposition() const; //Creates num_states_ copies of the 'base state' in the runner //This will be either the |0>^n state, or a stabilizer state //produced by applying the first m Clifford gates of the //circuit. void initialize_decomposition(uint_t n_states); //Check if the coefficient omega is 0 bool check_eps(uint_t rank); //Methods for applying gates void apply_cx(uint_t control, uint_t target, uint_t rank); void apply_cz(uint_t control, uint_t target, uint_t rank); void apply_swap(uint_t qubit_1, uint_t qubit_2, uint_t rank); void apply_h(uint_t qubit, uint_t rank); void apply_s(uint_t qubit, uint_t rank); void apply_sdag(uint_t qubit, uint_t rank); void apply_x(uint_t qubit, uint_t rank); void apply_y(uint_t qubit, uint_t rank); void apply_z(uint_t qubit, uint_t rank); //Methods for non-clifford gates, including parameters for the Sampling void apply_t(uint_t qubit, double r, int rank); void apply_tdag(uint_t qubit, double r, int rank); void apply_u1(uint_t qubit, complex_t lambda, double r, int rank); void apply_ccx(uint_t control_1, uint_t control_2, uint_t target, uint_t branch, int rank); void apply_ccz(uint_t control_1, uint_t control_2, uint_t target, uint_t branch, int rank); //Measure a Pauli projector on each term in the decomposition and update their coefficients // omega. void apply_pauli_projector(const std::vector &generators); void apply_pauli_projector(const std::vector &generators, uint_t rank); //Routine for Norm Estimation, thin wrapper for the CHSimulator method that uses AER::RngEngine //to set up the estimation routine. double norm_estimation(uint_t n_samples, AER::RngEngine &rng); double norm_estimation(uint_t n_samples, std::vector generators, AER::RngEngine &rng); //Metropolis Estimation for sampling from the output distribution uint_t metropolis_estimation(uint_t n_steps, AER::RngEngine &rng); std::vector metropolis_estimation(uint_t n_steps, uint_t n_shots, AER::RngEngine &rng); //Efficient Sampler for the output distribution of a stabilizer state uint_t stabilizer_sampler(AER::RngEngine &rng); std::vector stabilizer_sampler(uint_t n_shots, AER::RngEngine &rng); //Utilities for the state-vector snapshot. complex_t amplitude(uint_t x_measure); void state_vector(std::vector &svector, AER::RngEngine &rng); }; //========================================================================= // Implementation //========================================================================= Runner::Runner(uint_t num_qubits) { initialize(num_qubits); } void Runner::initialize(uint_t num_qubits) { states_.clear(); coefficients_.clear(); n_qubits_ = num_qubits; num_states_ = 1; num_threads_ = 1; states_ = std::vector(1, chstabilizer_t(num_qubits)); coefficients_.push_back(complex_t(1.,0.)); } void Runner::initialize_decomposition(uint_t n_states) { num_states_ = n_states; states_.reserve(num_states_); coefficients_.reserve(num_states_); if(states_.size() > 1 || coefficients_.size() > 1) { throw std::runtime_error(std::string("CHSimulator::Runner was initialized without") + std::string("being properly cleared since the last ") + std::string("experiment.")); } chstabilizer_t base_sate(states_[0]); complex_t coeff(coefficients_[0]); for(uint_t i=1; i omp_threshold_; } //------------------------------------------------------------------------- // Operations on the decomposition //------------------------------------------------------------------------- void Runner::apply_pauli_projector(const std::vector &generators) { const int_t END = num_states_; #pragma omp parallel for if(num_states_ > omp_threshold_ && num_threads_ > 1) num_threads(num_threads_) for(int_t i=0; i &generators, uint_t rank) { states_[rank].MeasurePauliProjector(generators); } bool Runner::check_eps(uint_t rank) { return (states_[rank].Omega().eps == 1); } void Runner::apply_cx(uint_t control, uint_t target, uint_t rank) { states_[rank].CX(control, target); } void Runner::apply_cz(uint_t control, uint_t target, uint_t rank) { states_[rank].CZ(control, target); } void Runner::apply_swap(uint_t qubit_1, uint_t qubit_2, uint_t rank) { states_[rank].CX(qubit_1, qubit_2); states_[rank].CX(qubit_2, qubit_1); states_[rank].CX(qubit_1, qubit_2); } void Runner::apply_h(uint_t qubit, uint_t rank) { states_[rank].H(qubit); } void Runner::apply_s(uint_t qubit, uint_t rank) { states_[rank].S(qubit); } void Runner::apply_sdag(uint_t qubit, uint_t rank) { states_[rank].Sdag(qubit); } void Runner::apply_x(uint_t qubit, uint_t rank) { states_[rank].X(qubit); } void Runner::apply_y(uint_t qubit, uint_t rank) { states_[rank].Y(qubit); } void Runner::apply_z(uint_t qubit, uint_t rank) { states_[rank].Z(qubit); } void Runner::apply_t(uint_t qubit, double r, int rank) { sample_branch_t branch = t_sample.sample(r); coefficients_[rank] *= branch.first; if (branch.second == Gates::s) { states_[rank].S(qubit); } } void Runner::apply_tdag(uint_t qubit, double r, int rank) { sample_branch_t branch = tdg_sample.sample(r); coefficients_[rank] *= branch.first; if (branch.second == Gates::sdg) { states_[rank].Sdag(qubit); } } void Runner::apply_u1(uint_t qubit, complex_t param, double r, int rank) { double lambda = std::real(param); auto it = Z_ROTATIONS.find(lambda); //Look for cached z_rotations sample_branch_t branch; if (it == Z_ROTATIONS.end()) { U1Sample rotation(lambda); Z_ROTATIONS.insert({lambda, rotation}); branch = rotation.sample(r); } else { branch = it->second.sample(r); } coefficients_[rank] *= branch.first; switch(branch.second) { case Gates::s: states_[rank].S(qubit); break; case Gates::sdg: states_[rank].Sdag(qubit); break; case Gates::z: states_[rank].Z(qubit); break; default: break; } } void Runner::apply_ccx(uint_t control_1, uint_t control_2, uint_t target, uint_t branch, int rank) { switch(branch) //Decomposition of the CCX gate into Cliffords { case 1: states_[rank].CZ(control_1, control_2); break; case 2: states_[rank].CX(control_1, target); break; case 3: states_[rank].CX(control_2, target); break; case 4: states_[rank].CZ(control_1, control_2); states_[rank].CX(control_1, target); states_[rank].Z(control_1); break; case 5: states_[rank].CZ(control_1, control_2); states_[rank].CX(control_2, target); states_[rank].Z(control_2); break; case 6: states_[rank].CX(control_1, target); states_[rank].CX(control_2, target); states_[rank].X(target); break; case 7: states_[rank].CZ(control_1, control_2); states_[rank].CX(control_1, target); states_[rank].CX(control_2, target); states_[rank].Z(control_1); states_[rank].Z(control_2); states_[rank].X(target); coefficients_[rank] *= -1; //Additional phase break; default: //Identity break; } } void Runner::apply_ccz(uint_t control_1, uint_t control_2, uint_t target, uint_t branch, int rank) { switch(branch) //Decomposition of the CCZ gate into Cliffords { case 1: states_[rank].CZ(control_1, control_2); break; case 2: states_[rank].CZ(control_1, target); break; case 3: states_[rank].CZ(control_2, target); break; case 4: states_[rank].CZ(control_1, control_2); states_[rank].CZ(control_1, target); states_[rank].Z(control_1); break; case 5: states_[rank].CZ(control_1, control_2); states_[rank].CZ(control_2, target); states_[rank].Z(control_2); break; case 6: states_[rank].CZ(control_1, target); states_[rank].CZ(control_2, target); states_[rank].Z(target); break; case 7: states_[rank].CZ(control_1, control_2); states_[rank].CZ(control_1, target); states_[rank].CZ(control_2, target); states_[rank].Z(control_1); states_[rank].Z(control_2); states_[rank].Z(target); coefficients_[rank] *= -1; //Additional phase break; default: //Identity break; } } //------------------------------------------------------------------------- //Measurement //------------------------------------------------------------------------- double Runner::norm_estimation(uint_t n_samples, AER::RngEngine &rng) { std::vector adiag_1(n_samples, 0ULL); std::vector adiag_2(n_samples, 0ULL); std::vector< std::vector > a(n_samples, std::vector(n_qubits_, 0ULL)); const int_t NSAMPLES = n_samples; const int_t NQUBITS = n_qubits_; #pragma omp parallel if (num_threads_ > 1) num_threads(num_threads_) { #ifdef _WIN32 #pragma omp for #else #pragma omp for collapse(2) #endif for (int_t l=0; l generators, AER::RngEngine &rng) { apply_pauli_projector(generators); return norm_estimation(n_samples, rng); } uint_t Runner::metropolis_estimation(uint_t n_steps, AER::RngEngine &rng) { init_metropolis(rng); for (uint_t i=0; i Runner::metropolis_estimation(uint_t n_steps, uint_t n_shots, AER::RngEngine &rng) { std::vector shots(n_shots, zer); shots[0] = metropolis_estimation(n_steps, rng); for (uint_t i=1; i omp_threshold_ && num_threads_ > 1) num_threads(num_threads_) reduction(+:local_real) reduction(+:local_imag) for (int_t i=0; i omp_threshold_ && num_threads_ > 1) num_threads(num_threads_) reduction(+:real_part) reduction(+:imag_part) for (int_t i=0; i omp_threshold_ && num_threads_ > 1) num_threads(num_threads_) reduction(+:real_part) reduction(+:imag_part) for (int_t i=0; i Runner::stabilizer_sampler(uint_t n_shots, AER::RngEngine &rng) { if(num_states_ > 1) { throw std::invalid_argument("CH::Runner::stabilizer_sampler: This method can only be used for a single Stabilizer state.\n"); } std::vector shots; shots.reserve(n_shots); for(uint_t i=0; i omp_threshold_ && num_threads_ > 1) num_threads(num_threads_) reduction(+:real_part) reduction(+:imag_part) for(int_t i=0; i &svector, AER::RngEngine &rng) { uint_t ceil = 1ULL << n_qubits_; if (!svector.empty()) { svector.clear(); } svector.reserve(ceil); // double norm = 1; double norm = 1; if(num_states_ > 1) { norm = norm_estimation(40, rng); } for(uint_t i=0; i Runner::serialize_decomposition() const { std::vector serialized_states(num_states_); const int_t END = num_states_; #pragma omp parallel for if(num_threads_ > 1 && num_states_ > omp_threshold_) num_threads(num_threads_) for(int_t i=0; i gamma; std::vector M; std::vector F; std::vector G; gamma.reserve(n_qubits_); M = states_[rank].MMatrix(); F = states_[rank].FMatrix(); G = states_[rank].GMatrix(); uint_t gamma1 = states_[rank].Gamma1(); uint_t gamma2 = states_[rank].Gamma2(); for(uint_t i=0; i> i) & 1ULL) + 2*((gamma2 >> i) & 1ULL)); } js["gamma"] = gamma; js["M"] = M; js["F"] = F; js["G"] = G; js["internal_cofficient"] = states_[rank].Omega().to_complex(); js["coefficient"] = coefficients_[rank]; return js; } } // Close namespace CHSimulator #endif qiskit-aer-0.4.1/src/simulators/extended_stabilizer/chlib/000077500000000000000000000000001362723322000236675ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/extended_stabilizer/chlib/chstabilizer.hpp000066400000000000000000000670221362723322000270720ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef CH_STABILIZER_HPP #define CH_STABILIZER_HPP #include #include #include #include #include #include #include "core.hpp" namespace CHSimulator { // Clifford simulator based on the CH-form class StabilizerState { public: // constructor creates basis state |phi>=|00...0> StabilizerState(const unsigned n_qubits); //Copy constructor StabilizerState(const StabilizerState& rhs); // n = number of qubits // qubits are numbered as q=0,1,...,n-1 uint_fast64_t NQubits() const { return n; } scalar_t Omega() const { return omega; } uint_fast64_t Gamma1() const { return gamma1; } uint_fast64_t Gamma2() const { return gamma2; } std::vector GMatrix() const { return G; } std::vector FMatrix() const { return F; } std::vector MMatrix() const { return M; } // Clifford gates void CX(unsigned q, unsigned r); // q=control, r=target void CZ(unsigned q, unsigned r); void H(unsigned q); void S(unsigned q); void Z(unsigned q); void X(unsigned q); void Y(unsigned q); void Sdag(unsigned q); // S inverse // state preps void CompBasisVector(uint_fast64_t x); // prepares |x> void HadamardBasisVector(uint_fast64_t x); // prepares H(x)|00...0> // measurements scalar_t Amplitude(uint_fast64_t x); // computes the amplitude uint_fast64_t Sample(); // returns a sample from the distribution ||^2 uint_fast64_t Sample(uint_fast64_t v_mask); void MeasurePauli(const pauli_t P); // applies a gate (I+P)/2 // where P is an arbitrary Pauli operator void MeasurePauliProjector(const std::vector& generators); inline scalar_t ScalarPart() {return omega;} //InnerProduct & Norm Estimation scalar_t InnerProduct(const uint_fast64_t& A_diag1, const uint_fast64_t& A_diag2, const std::vector& A); // Metropolis updates: // To initialize Metropolis by a state x call Amplitude(x) scalar_t ProposeFlip(unsigned flip_pos); // returns the amplitude // where x'=bitflip(x,q) // x = current Metropolis state inline void AcceptFlip() {P=Q;} // accept the proposed bit flip friend double NormEstimate(std::vector& states, const std::vector< std::complex >& phases, const std::vector& Samples_d1, const std::vector &Samples_d2, const std::vector< std::vector >& Samples); #ifdef _OPENMP friend double ParallelNormEstimate(std::vector& states, const std::vector< std::complex >& phases, const std::vector& Samples_d1, const std::vector &Samples_d2, const std::vector< std::vector >& Samples, int n_threads); #endif private: unsigned n; // define CH-data (F,G,M,gamma,v,s,omega) see Section IIIA for notations // stabilizer tableaux of the C-layer uint_fast64_t gamma1; //phase vector gamma = gamma1 + 2*gamma2 (mod 4) uint_fast64_t gamma2; // each column of F,G,M is represented by uint_fast64_t integer std::vector F; // F[i] = i-th column of F std::vector G; // G[i] = i-th column of G std::vector M; // M[i] = i-th column of M uint_fast64_t v; // H-layer U_H=H(v) uint_fast64_t s; // initial state |s> scalar_t omega; // scalar factor such that |phi>=omega*U_C*U_H|s> // multiplies the C-layer on the right by a C-type gate void RightCX(unsigned q, unsigned r); // q=control, r=target void RightCZ(unsigned q, unsigned r); void RightS(unsigned q); void RightZ(unsigned q); void RightSdag(unsigned q); // computes a Pauli operator U_C^{-1}X(x)U_C pauli_t GetPauliX(uint_fast64_t x); // replace the initial state |s> in the CH-form by a superposition // (|t> + i^b |u>)*sqrt(1/2) as described in Proposition 3 // update the CH-form void UpdateSvector(uint_fast64_t t, uint_fast64_t u, unsigned b); // F-transposed and M-transposed. Need this to compute amplitudes std::vector FT; // FT[i] = i-th row of F std::vector MT; // MT[i] = i-th row of M // compute the transposed matrices void TransposeF(); void TransposeM(); bool isReadyFT; // true if F-transposed is available bool isReadyMT; // true if M-transposed is available // auxiliary Pauli operators pauli_t P; pauli_t Q; }; typedef std::complex cdouble; //-------------------------------// // Implementation // //-------------------------------// //Lookup table for e^(i pi m / 4) static const int RE_PHASE[8] = {1, 1, 0, -1, -1, -1, 0, 1}; static const int IM_PHASE[8] = {0, 1, 1, 1, 0, -1, -1, -1}; // Clifford simulator based on the CH-form for for n<=64 qubits StabilizerState::StabilizerState(const unsigned n_qubits): n(n_qubits), // number of qubits gamma1(zer), gamma2(zer), F(n,zer), G(n,zer), M(n,zer), v(zer), s(zer), omega(), FT(n,zer), MT(n,zer), isReadyFT(false), isReadyMT(false) { // initialize by the basis vector 00...0 if(n>63) { throw std::invalid_argument("The CH simulator only supports up to 63 qubits.\n"); } // G and F are identity matrices for (unsigned q=0; q>q) & one)*C; } // update phase vector: gamma[q] gets gamma[q] - 1 gamma1^=C; gamma2^=((gamma1 >> q) & one )*C; } void StabilizerState::Sdag(unsigned q) { isReadyMT=false;// we are going to change M uint_fast64_t C=(one<>q) & one)*C; } // update phase vector: gamma[q] gets gamma[q] + 1 gamma2^=((gamma1 >> q) & one )*C; gamma1^=C; } void StabilizerState::Z(unsigned q) { // update phase vector: gamma[q] gets gamma[q] + 2 gamma2^=(one<> q)&one) + 4*((gamma2>>q) & one); //Commute the z_string through the hadamard layer // Each z that hits a hadamard becomes a Pauli X s ^= (z_string & v); //Remaining Z gates add a global phase from their action on the s string phase += 4*(hamming_parity((z_string & ~(v)) & s)); //Commute the x_string through the hadamard layer // Any remaining X gates update s s ^= (x_string & ~(v)); //New z gates add a global phase from their action on the s string phase += 4*(hamming_parity((x_string & v) & s)); //Update the global phase omega.e = (omega.e + phase)%8; } void StabilizerState::Y(unsigned q) { Z(q); X(q); //Add a global phase of -i omega.e = (omega.e + 2)%8; } void StabilizerState::RightCX(unsigned q, unsigned r) { G[q]^=G[r]; F[r]^=F[q]; M[q]^=M[r]; } void StabilizerState::CX(unsigned q, unsigned r) { isReadyMT=false;// we are going to change M and F isReadyFT=false; uint_fast64_t C=(one<>q) & one)*T; F[p]^=((F[p]>>r) & one)*C; M[p]^=((M[p]>>r) & one)*C; } // update phase vector as // gamma[q] gets gamma[q] + gamma[r] + 2*b (mod 4) if (b) gamma2^=C; b= ( (gamma1 & C) && (gamma1 & T)); gamma1^=((gamma1 >> r) & one)*C; gamma2^=((gamma2 >> r) & one)*C; if (b) gamma2^=C; } void StabilizerState::RightCZ(unsigned q, unsigned r) { isReadyMT=false;// we are going to change M M[q]^=F[r]; M[r]^=F[q]; gamma2^=(F[q] & F[r]); } void StabilizerState::CZ(unsigned q, unsigned r) { isReadyMT=false;// we are going to change M uint_fast64_t C=(one<>r) & one)*C; M[p]^=((G[p]>>q) & one)*T; } } pauli_t StabilizerState::GetPauliX(uint_fast64_t x) { // make sure that M-transposed and F-transposed have been already computed if (!isReadyMT) { TransposeM(); } if (!isReadyFT) { TransposeF(); } pauli_t R; for (unsigned pos=0; pos>pos) & one); P1.e+=2*((gamma2>>pos) & one); P1.X=FT[pos]; P1.Z=MT[pos]; R*=P1; } } return R; } scalar_t StabilizerState::Amplitude(uint_fast64_t x) { // compute transposed matrices if needed if (!isReadyMT) { TransposeM(); } if (!isReadyFT) { TransposeF(); } // compute Pauli U_C^{-1} X(x) U_C P=GetPauliX(x); if (!omega.eps) return omega; // the state is zero // now the amplitude = complex conjugate of // Z-part of P is absorbed into 0^n scalar_t amp; amp.e=2*P.e; int p = (int) hamming_weight(v); amp.p= -1 * p;// each Hadamard gate contributes 1/sqrt(2) bool isNonZero=true; for (unsigned q=0; q } else { isNonZero=( ((P.X & pos)==(s & pos)) ); } if (!isNonZero) break; } amp.e%=8; if (isNonZero) { amp.conjugate(); } else { amp.eps=0; return amp; } // multiply amp by omega amp.p+=omega.p; amp.e=(amp.e + omega.e) % 8; return amp; } scalar_t StabilizerState::ProposeFlip(unsigned flip_pos) { // Q gets Pauli operator U_C^{-1} X_{flip_pos} U_C Q.e=1*((gamma1>>flip_pos) & one); Q.e+=2*((gamma2>>flip_pos) & one); Q.X=FT[flip_pos]; Q.Z=MT[flip_pos]; Q*=P; if (!omega.eps) return omega; // the state is zero // the rest is the same as Amplitude() except that P becomes Q // now the amplitude = complex conjugate of // Z-part of Q is absorbed into 0^n // the rest is the same as Amplitude() except that P is replaced by Q scalar_t amp; amp.e=2*Q.e; amp.p=-1*(hamming_weight(v));// each Hadamard gate contributes 1/sqrt(2) bool isNonZero=true; for (unsigned q=0; q } else { isNonZero=( ((Q.X & pos)==(s & pos)) ); } if (!isNonZero) break; } amp.e%=8; if (isNonZero) { amp.conjugate(); } else { amp.eps=0; return amp; } // multiply amp by omega amp.p+=omega.p; amp.e=(amp.e + omega.e) % 8; return amp; } uint_fast64_t StabilizerState::Sample() { uint_fast64_t x=zer; for (unsigned q=0; q1 then multiply U_C on the right by the first half of the circuit VC nu0^=qpos; // set q-th bit to zero if (nu0) for (unsigned q1=q+1; q10 then apply the second half of the circuit VC if (nu1) for (unsigned q1=0; q11 then apply the circuit VC nu1^=qpos; if (nu1) for (unsigned q1=q+1; q1 = eta^{e1} S^{e2} H^{e3} |e4> // here eta=exp( i (pi/4) ) // a=0,1 // b=0,1,2,3 // // H^0 S^0 |+> = eta^0 S^0 H^1 |0> // H^0 S^1 |+> = eta^0 S^1 H^1 |0> // H^0 S^2 |+> = eta^0 S^0 H^1 |1> // H^0 S^3 |+> = eta^0 S^1 H^1 |1> // // H^1 S^0 |+> = eta^0 S^0 H^0 |0> // H^1 S^1 |+> = eta^1 S^1 H^1 |1> // H^1 S^2 |+> = eta^0 S^0 H^0 |1> // H^1 S^3 |+> = eta^{7} S^1 H^1 |0> // // "analytic" formula: // e1 = a * (b mod 2) * ( 3*b -2 ) // e2 = b mod 2 // e3 = not(a) + a * (b mod 2) // e4 = not(a)*(b>=2) + a*( (b==1) || (b==2) ) bool a=((v & qpos)>0); unsigned e1=a*(b % 2)*( 3*b -2); unsigned e2 = b % 2; bool e3 = ( (!a) != (a && ((b % 2)>0) ) ); bool e4 = ( ( (!a) && (b>=2) ) != (a && ((b==1) || (b==2))) ); // update CH-form // set q-th bit of s to e4 s&=~qpos; s^=e4*qpos; // set q-th bit of v to e3 v&=~qpos; v^=e3*qpos; // update the scalar factor omega omega.e=(omega.e + e1) % 8; // multiply the C-layer on the right by S^{e2} on the q-th qubit if (e2) RightS(q); } void StabilizerState::H(unsigned q) { isReadyMT=false;// we are going to change M and F isReadyFT=false; // extract the q-th row of F,G,M uint_fast64_t rowF=zer; uint_fast64_t rowG=zer; uint_fast64_t rowM=zer; for (unsigned j=0; j>q) & one ); rowG^=pos*( (G[j]>>q) & one ); rowM^=pos*( (M[j]>>q) & one ); } // after commuting H through the C and H laters it maps |s> to a state // sqrt(0.5)*[ (-1)^alpha |t> + i^{gamma[p]} (-1)^beta |u> ] // // compute t,s,alpha,beta uint_fast64_t t = s ^ (rowG & v); uint_fast64_t u = s ^ (rowF & (~v)) ^ (rowM & v); unsigned alpha = hamming_weight( rowG & (~v) & s ); unsigned beta = hamming_weight( (rowM & (~v) & s) ^ (rowF & v & (rowM ^ s)) ); if (alpha % 2) omega.e=(omega.e+4) % 8; // get the phase gamma[q] unsigned phase = ((gamma1>>q) & one) + 2*((gamma2>>q) & one); unsigned b=(phase + 2*alpha + 2*beta) % 4; // now the initial state is sqrt(0.5)*(|t> + i^b |u>) // take care of the trivial case if (t==u) { s=t; if(!((b==1) || (b==3))) // otherwise the state is not normalized { throw std::logic_error("State is not properly normalised, b should be 1 or 3.\n"); } if (b==1) omega.e=(omega.e + 1) % 8; else omega.e=(omega.e + 7) % 8; } else UpdateSvector(t,u,b); } void StabilizerState::MeasurePauli(pauli_t PP) { // compute Pauli R = U_C^{-1} P U_C pauli_t R; R.e = PP.e; for (unsigned j=0; j>j) & one) { // multiply R by U_C^{-1} X_j U_C // extract the j-th rows of F and M uint_fast64_t rowF=zer; uint_fast64_t rowM=zer; for (unsigned i=0; i>j) & one); rowM^=(one<>j) & one); } R.e+= 2*hamming_weight(R.Z & rowF); // extra sign from Pauli commutation R.Z^=rowM; R.X^=rowF; R.e+= ((gamma1>>j) & one) + 2*((gamma2>>j) & one); } for (unsigned q=0; q becomes 0.5*(|s> + R |s>) = 0.5*(|s> + i^b |s ^ R.X>) unsigned b = (R.e + 2*hamming_weight(R.Z & s) ) % 4; UpdateSvector(s, s ^ R.X, b); // account for the extra factor sqrt(1/2) omega.p-=1; isReadyMT=false;// we have changed change M and F isReadyFT=false; } void StabilizerState::MeasurePauliProjector(const std::vector& generators) //Measure generators of a projector. { for (uint_fast64_t i=0; iMeasurePauli(generators[i]); if (omega.eps == 0) { break; } } } scalar_t StabilizerState::InnerProduct(const uint_fast64_t& A_diag1, const uint_fast64_t& A_diag2, const std::vector& A) { uint_fast64_t K_diag1 = zer, K_diag2=zer, J_diag1=gamma1, J_diag2=gamma2; std::vector J(n, zer); std::vector K(n, zer); std::vector placeholder(n, zer); if(!isReadyMT) { TransposeM(); } if (!isReadyFT) { TransposeF(); } //Setup the J matrix for (size_t i=0; i> r) & one) { uint_fast64_t one_bit = (J_diag1 >> r) & one; if ((K_diag1 >> i) & one_bit) { K_diag2 ^= shift; } K_diag1 ^= one_bit*shift; K_diag2 ^= ((J_diag2 >> r)&one) * shift; } for (size_t k=r+1; k> r) & (col_i >> r) & (col_i >> k) & one) { K_diag2 ^= shift; } } } } unsigned col=0; QuadraticForm q(hamming_weight(v)); //We need to setup a quadratic form to evaluate the Exponential Sum for (size_t i=0; i>i) & one) { uint_fast64_t shift = (one << col); //D = Diag(K(1,1)) + 2*[s + s*K](1) // J = K(1,1); q.D1 ^= ((K_diag1 >> i) & one) * shift; q.D2 ^= (( ((K_diag2 >> i) ^ (s >> i)) & one) ^ hamming_parity(K[i] & s)) * shift; // q.D2 ^= ((s >> i) & one) * shift; // q.D2 ^= hamming_parity(K[i] & s) * shift; unsigned row=0; for (size_t j=0; j>j) & one) { q.J[col] |= (((K[i] >> j) & one) << row); row++; } } col++; } } // Q = 4* (s.v) + sKs q.Q = hamming_parity(s&v)*4; for (size_t i=0; i>i) & one) { q.Q = (q.Q + 4*((K_diag2 >> i) & one) + 2*((K_diag1 >> i) & one))%8;// + 2*((K_diag1 >> i) & one))%8; for (size_t j=i+1; j>j) & (K[j] >> i) & one) { q.Q ^= 4; } } } } scalar_t amp = q.ExponentialSum(); // Reweight by 2^{-(n+|v|)}/2 amp.p -= (n+hamming_weight(v)); // We need to further multiply by omega* scalar_t psi_amp(omega); psi_amp.conjugate(); amp *= psi_amp; return amp; } double NormEstimate(std::vector& states, const std::vector< std::complex >& phases, const std::vector& Samples_d1, const std::vector &Samples_d2, const std::vector< std::vector >& Samples) { // Norm estimate for a state |psi> = \sum_{i} c_{i}|phi_{i}> double xi=0; unsigned L = Samples_d1.size(); // std::vector data = (L,0.); for (size_t i=0; i& states, const std::vector< std::complex >& phases, const std::vector& Samples_d1, const std::vector& Samples_d2, const std::vector< std::vector >& Samples, int n_threads) { double xi=0; unsigned L = Samples_d1.size(); unsigned chi = states.size(); for (uint_fast64_t i=0; i #include #include #include #include #include static const int RE_PHASE[8] = {1, 1, 0, -1, -1, -1, 0, 1}; static const int IM_PHASE[8] = {0, 1, 1, 1, 0, -1, -1, -1}; namespace CHSimulator { using complex_t = std::complex; using uint_t = uint_fast64_t; using int_t = int_fast64_t; // Definitions for implementing arbitrary binary vectors and matrices as arrays of 64bit integers typedef uint_fast64_t word; // typedef unsigned long word; #define WORD_BITS (CHAR_BIT * sizeof(word)) // Calculate which integer in the array we are looking at #define WORD_INDEX(INDEX) ((INDEX) / (WORD_BITS)) // Calculate the shift we need to read, set or clear that bit #define WORD_SHIFT(INDEX) ((INDEX) % WORD_BITS) extern const word zer = 0U; extern const word one = 1U; extern bool (*hamming_parity)(word); extern unsigned (*hamming_weight)(word); struct scalar_t { // complex numbers of the form eps * 2^{p/2} * exp(i (pi/4)*e ) // eps=0,1 p=integer e=0,1,...,7 // if eps=0 then p and e are arbitrary int eps; int p; int e; // constructor makes number 1 scalar_t(): eps(1), p(0), e(0) {}; scalar_t(const scalar_t& rhs): eps(rhs.eps), p(rhs.p), e(rhs.e) {}; scalar_t(const std::complex coeff): eps(1), p(0), e(0) { double abs_val = std::abs(coeff); if(std::abs(abs_val-0.)<1e-8) { eps = 0; } else { p = (int) std::log2(std::pow(abs_val, 2)); bool is_real_zero = (std::abs(coeff.real()-0)<1e-8); bool is_imag_zero = (std::abs(coeff.imag()-0)<1e-8); bool is_real_posi = (coeff.real() > 0) && !(is_real_zero); bool is_imag_posi = (coeff.imag() > 0) && !(is_imag_zero); char switch_var = (is_real_zero * 1) + (is_imag_zero*2) + (is_real_posi * 4) + (is_imag_posi * 8); switch(switch_var) { case 0: e = 5; break; case 1: e = 6; break; case 2: e = 4; break; case 4: e=7; break; case 6: e=0; break; case 8: e=3; break; case 9: e=2; break; case 12: e=1; break; default: throw std::runtime_error("Unsure what to do here chief."); break; } } } // complex conjugation inline void conjugate() { e%=8; e=(8-e) % 8; } inline void makeOne() { eps=1; p=0; e=0; } scalar_t& operator*=(const scalar_t& rhs); scalar_t operator*(const scalar_t& rhs) const; std::complex to_complex() const { if (eps==0) { return std::complex(0., 0.); } std::complex mag(std::pow(2, p/(double)2), 0.); std::complex phase(RE_PHASE[e], IM_PHASE[e]); return mag*phase; } void Print() { std::cout<<"eps="<63) { throw qubex; } } QuadraticForm::QuadraticForm(const QuadraticForm &rhs) : J(rhs.n, zer) { n=rhs.n; Q=rhs.Q; D1=rhs.D1; D2=rhs.D2; for (size_t i=0; i> i) & one) + ((q.D1 >> i) & one))); } os << std::endl; os <<"J:\n"; for (size_t i=0; i> j) & one) << " "; } os << "\n"; } return os; } // Computes exponential sums Z=sum_x exp(j*(pi/4)*q(x)) // where q(x) is a quadratic form and x runs over n-bit strings // Usage: run "mex ExponentialSum.c" in matlab command line // This creates the mex file. // Now one can compute the exponential sum by calling // [p,m,eps]=ExponentialSum(J0,J1,J2) // from any matlab script // // Input parameters define a quadratic form // q(x)=q(x_1,...,x_n) // q(x)=J0 + sum_{a=1}^n J1_a x_a + 4*sum_{1<=a=0, m=0,1,2,..,7, and eps=0,1 such that // Z = sum_x exp(j*(pi/4)*q(x)) = eps*2^(p/2)*exp(j*pi*m/4) // if eps=0 then p and m can be ignored scalar_t QuadraticForm::ExponentialSum() { // Variables for Z2-valued exponential sums // Z=(2^pow2)*sigma // where pow2 is integer // sigma=0,1 // if Z=0 then pow2,sigma contain junk and isZero=1 int pow2_real=0; bool sigma_real=0; bool isZero_real=0; int pow2_imag=0; bool sigma_imag=0; bool isZero_imag=0; scalar_t amp; amp.makeOne(); int m = n+1; // Lreal, Limag define the linear part of the Z2-valued forms // M defines the quadratic part of the Z2-valued forms // each column of M is represented by long integer uint_fast64_t Lreal, c=zer; std::vector M(n+1,zer); Lreal = D2; for (size_t i=0; i> i) & one ) { c |= (one << i); M[n] |= (one << i); } } uint_fast64_t Limag = Lreal; Limag ^= (one << n); for (size_t i=0; i> j) & one); bool c1 = !!((c>>i) & one); bool c2 = !!((c>>j) & one); if (x ^ (c1 & c2)) { M[j] ^= (one << i); } } } uint_fast64_t active = zer; active = ~(active); int nActive=m; int firstActive=0; while (nActive>=1) { // find the first active variable int i1; for (i1=firstActive; i1> i1) & one) { break; } } firstActive=i1; // find i2 such that M(i1,i2)!=M(i2,i1) int i2; bool isFound=false; for (i2=0; i2>i2) & one) != ((M[i2]>>i1) & one) ); if (isFound) { break; } } bool L1real = !!(((Lreal >> i1) & one) ^ ((M[i1]>>i1) & one)); bool L1imag = !!(((Limag >> i1) & one) ^ ((M[i1]>>i1) & one)); // take care of the trivial cases if (!isFound) { // the form is linear in the variable i1 if (L1real) isZero_real=1; pow2_real++; if (L1imag) isZero_imag=1; pow2_imag++; nActive--; uint_fast64_t not_shift; not_shift = ~(one << i1); active &= not_shift; // set column i1 to zero M[i1] = zer; // set row i1 to zero for (int j=0; j>i2) & one) ^ ((M[i2]>>i2) & one)); bool L2imag = !!(((Limag>>i2) & one) ^ ((M[i2]>>i2) & one)); Lreal&=~(one<>i1) & one)<>i2) & one)<> j) & one) { M[j]^=m1; } } active &= ~(one << i1); active &= ~(one << i2); nActive-=2; } // int J0 = Q; // int J0 = inJ0[0]; Q%=8; // Combine the real and the imaginary parts if (isZero_imag) { amp.p = 2*pow2_real - 2; amp.e = (4*sigma_real + Q) % 8; } else if (isZero_real) { amp.p = 2*pow2_imag - 2; amp.e = (2 + 4*sigma_imag + Q) % 8; } else { // now both parts are nonzero amp.p = 2*pow2_real - 1; amp.eps = 1; if (sigma_real == 0) { if (sigma_imag == 0) { amp.e=(1 + Q) % 8; } else { amp.e=(7 + Q) % 8; } } else { if (sigma_imag == 0) { amp.e=(3 + Q) % 8; } else { amp.e=(5 + Q) % 8; } } } return amp; } // prints a binary form of x void Print(uint_fast64_t x, unsigned n) { for (unsigned i=0; i0); } std::cout< A, unsigned n) { for (unsigned row=0; row0); } std::cout< #include #include "simulators/state.hpp" #include "framework/json.hpp" #include "framework/types.hpp" #include "chlib/core.hpp" #include "chlib/chstabilizer.hpp" #include "ch_runner.hpp" #include "gates.hpp" namespace AER{ namespace ExtendedStabilizer { using chpauli_t = CHSimulator::pauli_t; using chstate_t = CHSimulator::Runner; using Gates = CHSimulator::Gates; uint_t zero = 0ULL; uint_t toff_branch_max = 7ULL; enum class Snapshots { state, statevector, probabilities, cmemory, cregister, probs }; class State: public Base::State { public: using BaseState = Base::State; State() = default; virtual ~State() = default; virtual std::string name() const override {return "extended_stabilizer";} inline virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t({ Operations::OpType::gate, Operations::OpType::measure, Operations::OpType::reset, Operations::OpType::barrier, Operations::OpType::roerror, Operations::OpType::bfunc, Operations::OpType::snapshot }); } inline virtual stringset_t allowed_gates() const override { return {"CX", "u0", "u1", "cx", "cz", "swap", "id", "x", "y", "z", "h", "s", "sdg", "t", "tdg", "ccx", "ccz"}; } inline virtual stringset_t allowed_snapshots() const override { return {"statevector", "probabilities", "memory", "register"};//, "state"}; } //Apply a sequence of operations to the cicuit. For each operation, //we loop over the terms in the decomposition in parallel virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; virtual void initialize_qreg(uint_t num_qubits) override; virtual void initialize_qreg(uint_t num_qubits, const chstate_t &state) override; virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const override; virtual void set_config(const json_t &config) override; virtual std::vector sample_measure(const reg_t& qubits, uint_t shots, RngEngine &rng) override; protected: //Alongside the sample measure optimisaiton, we can parallelise //circuit applicaiton over the states. This reduces the threading overhead //as we only have to fork once per circuit. void apply_ops_parallel(const std::vector &ops, RngEngine &rng); //Small routine that eschews any parallelisation/decomposition and applies a stabilizer //circuit to a single state. This is used to optimize a circuit with a large //initial clifford fraction, or for running stabilizer circuits. void apply_stabilizer_circuit(const std::vector &ops, ExperimentData &data, RngEngine &rng); // Applies a sypported Gate operation to the state class. // If the input is not in allowed_gates an exeption will be raised. // TODO: Investigate OMP synchronisation over stattes to remove these different versions // One option would be tasks, but the memory overhead isn't clear void apply_gate(const Operations::Op &op, RngEngine &rng); void apply_gate(const Operations::Op &op, RngEngine &rng, uint_t rank); // Measure qubits and return a list of outcomes [q0, q1, ...] // If a state subclass supports this function then "measure" // should be contained in the set returned by the 'allowed_ops' // method. void apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng); // Reset the specified qubits to the |0> state by measuring the // projectors Id+Z_{i} for each qubit i void apply_reset(const reg_t &qubits, AER::RngEngine &rng); //Take a snapshot of the simulation state //TODO: Improve the CHSimulator::to_json method. void apply_snapshot(const Operations::Op &op, ExperimentData &data, RngEngine &rng); //Convert a decomposition to a state-vector void statevector_snapshot(const Operations::Op &op, ExperimentData &data, RngEngine &rng); //Compute probabilities from a stabilizer rank decomposition //TODO: Check ordering/output format... void probabilities_snapshot(const Operations::Op &op, ExperimentData &data, RngEngine &rng); const static stringmap_t gateset_; const static stringmap_t snapshotset_; //----------------------------------------------------------------------- //Parameters and methods specific to the Stabilizer Rank Decomposition //----------------------------------------------------------------------- //Allowed error in the stabilizer rank decomposition. //The required number of states scales as \delta^{-2} //for allowed error \delta double approximation_error_ = 0.05; uint_t norm_estimation_samples_ = 100; // How long the metropolis algorithm runs before // we consider it to be well mixed and sample form the // output distribution uint_t metropolis_mixing_steps_ = 5000; //Minimum number of states before we try to parallelise uint_t omp_threshold_rank_ = 100; double snapshot_chop_threshold_ = 1e-10; double probabilities_snapshot_samples_ = 3000.; // Compute the required stabilizer rank of the circuit uint_t compute_chi(const std::vector &ops) const; // Add the given operation to the extent void compute_extent(const Operations::Op &op, double &xi) const; //Compute the required chi, and count the number of three qubit gates std::pair decomposition_parameters(const std::vector &ops); //Check if this is a stabilizer circuit, for the locaiton of the first non-CLifford gate std::pair check_stabilizer_opt(const std::vector &ops) const; //Check if we can use the sample_measure optimisation bool check_measurement_opt(const std::vector &ops) const; }; //========================================================================= // Implementation: Allowed ops and gateset //========================================================================= const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::x}, // Pauli-X gate {"y", Gates::y}, // Pauli-Y gate {"z", Gates::z}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gates::t}, // T-gate (sqrt(S)) {"tdg", Gates::tdg}, // Conjguate-transpose of T gate // Waltz Gates {"u0", Gates::u0}, // idle gate in multiples of X90 {"u1", Gates::u1}, // zero-X90 pulse waltz gate // Two-qubit gates {"CX", Gates::cx}, // Controlled-X gate (CNOT) {"cx", Gates::cx}, // Controlled-X gate (CNOT) {"cz", Gates::cz}, // Controlled-Z gate {"swap", Gates::swap}, // SWAP gate // Three-qubit gates {"ccx", Gates::ccx}, // Controlled-CX gate (Toffoli) {"ccz", Gates::ccz} // Constrolled-CZ gate (H3 Toff H3) }); const stringmap_t State::snapshotset_({ {"state", Snapshots::state}, {"statevector", Snapshots::statevector}, {"probabilities", Snapshots::probabilities}, {"memory", Snapshots::cmemory}, {"register", Snapshots::cregister} }); //------------------------------------------------------------------------- // Implementation: Initialisation and Config //------------------------------------------------------------------------- void State::initialize_qreg(uint_t num_qubits) { BaseState::qreg_.initialize(num_qubits); BaseState::qreg_.initialize_omp(BaseState::threads_, omp_threshold_rank_); } void State::initialize_qreg(uint_t num_qubits, const chstate_t &state) { if(BaseState::qreg_.get_n_qubits() != num_qubits) { throw std::invalid_argument("CH::State::initialize: initial state does not match qubit number."); } BaseState::qreg_ = state; BaseState::qreg_.initialize_omp(BaseState::threads_, omp_threshold_rank_); } void State::set_config(const json_t &config) { // Set the error upper bound in the stabilizer rank approximation JSON::get_value(approximation_error_, "extended_stabilizer_approximation_error", config); // Set the number of samples used in the norm estimation routine JSON::get_value(norm_estimation_samples_, "extended_stabilizer_norm_estimation_samples", config); // Set the number of steps used in the metropolis sampler before we // consider the distribution as approximating the output JSON::get_value(metropolis_mixing_steps_, "extended_stabilizer_mixing_time", config); //Set the threshold of the decomposition before we use omp JSON::get_value(omp_threshold_rank_, "extended_stabilizer_parallel_threshold", config); //Set the truncation threshold for the probabilities snapshot. JSON::get_value(snapshot_chop_threshold_, "zero_threshold", config); //Set the number of samples for the probabilities snapshot JSON::get_value(probabilities_snapshot_samples_, "probabilities_snapshot_samples", config); } std::pair State::decomposition_parameters(const std::vector &ops) { double xi=1.; unsigned three_qubit_gate_count = 0; for (const auto op: ops) { if (op.type == Operations::OpType::gate) { compute_extent(op, xi); auto it = CHSimulator::gate_types_.find(op.name); if (it->second == CHSimulator::Gatetypes::non_clifford && op.qubits.size() == 3) { //We count the number of 3 qubit gates for normalisation purposes three_qubit_gate_count++; } } } uint_t chi=1; if (xi >1) { double err_scaling = std::pow(approximation_error_, -2); chi = std::llrint(std::ceil(xi*err_scaling)); } return std::pair({chi, three_qubit_gate_count}); } std::pair State::check_stabilizer_opt(const std::vector &ops) const { for(auto op = ops.cbegin(); op != ops.cend(); op++) { if (op->type != Operations::OpType::gate) { continue; } auto it = CHSimulator::gate_types_.find(op->name); if(it == CHSimulator::gate_types_.end()) { throw std::invalid_argument("CHState::check_measurement_opt doesn't recognise a the operation \'"+ op->name + "\'."); } if(it->second == CHSimulator::Gatetypes::non_clifford) { return std::pair({false, op - ops.cbegin()}); } } return std::pair({true, 0}); } bool State::check_measurement_opt(const std::vector &ops) const { for (const auto op: ops) { if (op.conditional || op.old_conditional) { return false; } if (op.type == Operations::OpType::measure || op.type == Operations::OpType::bfunc || op.type == Operations::OpType::snapshot) { return false; } } return true; } //------------------------------------------------------------------------- // Implementation: Operations //------------------------------------------------------------------------- void State::apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) { std::pair stabilizer_opts = check_stabilizer_opt(ops); bool is_stabilizer = stabilizer_opts.first; if(is_stabilizer) { apply_stabilizer_circuit(ops, data, rng); } else { //Split the circuit into stabilizer and non-stabilizer fractions size_t first_non_clifford = stabilizer_opts.second; if (first_non_clifford > 0) { //Apply the stabilizer circuit first. This optimisaiton avoids duplicating the application //of the initial stabilizer circuit chi times. std::vector stabilizer_circuit(ops.cbegin(), ops.cbegin()+first_non_clifford); apply_stabilizer_circuit(stabilizer_circuit, data, rng); } std::vector non_stabilizer_circuit(ops.cbegin()+first_non_clifford, ops.cend()); uint_t chi = compute_chi(non_stabilizer_circuit); BaseState::qreg_.initialize_decomposition(chi); //Check for measurement optimisaitons bool measurement_opt = check_measurement_opt(ops); if(measurement_opt) { apply_ops_parallel(non_stabilizer_circuit, rng); } else { for (const auto op: non_stabilizer_circuit) { if(BaseState::creg_.check_conditional(op)) { switch (op.type) { case Operations::OpType::gate: apply_gate(op, rng); break; case Operations::OpType::reset: apply_reset(op.qubits, rng); break; case Operations::OpType::barrier: break; case Operations::OpType::measure: apply_measure(op.qubits, op.memory, op.registers, rng); break; case Operations::OpType::roerror: BaseState::creg_.apply_roerror(op, rng); break; case Operations::OpType::bfunc: BaseState::creg_.apply_bfunc(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data, rng); break; default: throw std::invalid_argument("CH::State::apply_ops does not support operations of the type \'" + op.name + "\'."); break; } } } } } } std::vector State::sample_measure(const reg_t& qubits, uint_t shots, RngEngine &rng) { std::vector output_samples; if(BaseState::qreg_.get_num_states() == 1) { output_samples = BaseState::qreg_.stabilizer_sampler(shots, rng); } else { output_samples = BaseState::qreg_.metropolis_estimation(metropolis_mixing_steps_, shots, rng); } std::vector all_samples; all_samples.reserve(shots); for(uint_t sample: output_samples) { reg_t sample_bits(qubits.size(), 0ULL); for(size_t i=0; i> qubits[i]) & 1ULL) { sample_bits[i] = 1ULL; } } all_samples.push_back(sample_bits); } return all_samples; } //------------------------------------------------------------------------- // Implemenation: Protected Methods //------------------------------------------------------------------------- //Method with slighty optimized parallelisation for the case of a sample_measure circuit void State::apply_ops_parallel(const std::vector &ops, RngEngine &rng) { const int_t NUM_STATES = BaseState::qreg_.get_num_states(); #pragma omp parallel for if(BaseState::qreg_.check_omp_threshold() && BaseState::threads_>1) num_threads(BaseState::threads_) for(int_t i=0; i < NUM_STATES; i++) { if(!BaseState::qreg_.check_eps(i)) { continue; } for(const auto op: ops) { switch (op.type) { case Operations::OpType::gate: apply_gate(op, rng, i); break; case Operations::OpType::barrier: break; default: throw std::invalid_argument("CH::State::apply_ops_parallel does not support operations of the type \'" + op.name + "\'."); break; } } } } void State::apply_stabilizer_circuit(const std::vector &ops, ExperimentData &data, RngEngine &rng) { for (const auto op: ops) { switch (op.type) { case Operations::OpType::gate: if(BaseState::creg_.check_conditional(op)) { apply_gate(op, rng, 0); } break; case Operations::OpType::reset: apply_reset(op.qubits, rng); break; case Operations::OpType::barrier: break; case Operations::OpType::measure: apply_measure(op.qubits, op.memory, op.registers, rng); break; case Operations::OpType::roerror: BaseState::creg_.apply_roerror(op, rng); break; case Operations::OpType::bfunc: BaseState::creg_.apply_bfunc(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data, rng); break; default: throw std::invalid_argument("CH::State::apply_stabilizer_circuit does not support operations of the type \'" + op.name + "\'."); break; } } } void State::apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng) { uint_t full_string; if(BaseState::qreg_.get_num_states() == 1) { //For a single state, we use the efficient sampler defined in Sec IV.A ofarxiv:1808.00128 full_string = BaseState::qreg_.stabilizer_sampler(rng); } else { //We use the metropolis algorithm to sample an output string non-destructively full_string = BaseState::qreg_.metropolis_estimation(metropolis_mixing_steps_, rng); } //We prepare the Pauli projector corresponding to the measurement result std::vectorpaulis(qubits.size(), chpauli_t()); // Prepare an output register for the qubits we are measurig reg_t outcome(qubits.size(), 0ULL); for (uint_t i=0; i> qubits[i]) & 1ULL) { //Additionally, store the output bit for this qubit outcome[i]= 1ULL; paulis[i].e = 2; } } // Convert the output string to a reg_t. and store BaseState::creg_.store_measure(outcome, cmemory, cregister); //Project the decomposition onto the measurement outcome BaseState::qreg_.apply_pauli_projector(paulis); } void State::apply_reset(const reg_t &qubits, AER::RngEngine &rng) { uint_t measure_string; const int_t NUM_STATES = BaseState::qreg_.get_num_states(); if(BaseState::qreg_.get_num_states() == 1) { measure_string = BaseState::qreg_.stabilizer_sampler(rng); } else { measure_string = BaseState::qreg_.metropolis_estimation(metropolis_mixing_steps_, rng); } std::vector paulis(qubits.size(), chpauli_t()); for(size_t i=0; i 1 && BaseState::qreg_.check_omp_threshold()) num_threads(BaseState::threads_) for(int_t i=0; i< NUM_STATES; i++) { for (auto qubit: qubits) { if ((measure_string>>qubit) & 1ULL) { BaseState::qreg_.apply_x(qubit, i); } } } } void State::apply_gate(const Operations::Op &op, RngEngine &rng) { const int_t NUM_STATES = BaseState::qreg_.get_num_states(); #pragma omp parallel for if (BaseState::threads_ > 1 && BaseState::qreg_.check_omp_threshold()) num_threads(BaseState::threads_) for(int_t i=0; i < NUM_STATES; i++) { if(BaseState::qreg_.check_eps(i)) { apply_gate(op, rng, i); } } } void State::apply_gate(const Operations::Op &op, RngEngine &rng, uint_t rank) { auto it = gateset_.find(op.name); if (it == gateset_.end()) { throw std::invalid_argument("CH::State: Invalid gate operation \'" +op.name + "\'."); } switch(it->second) { case Gates::x: BaseState::qreg_.apply_x(op.qubits[0], rank); break; case Gates::y: BaseState::qreg_.apply_y(op.qubits[0], rank); break; case Gates::z: BaseState::qreg_.apply_z(op.qubits[0], rank); break; case Gates::s: BaseState::qreg_.apply_s(op.qubits[0], rank); break; case Gates::sdg: BaseState::qreg_.apply_sdag(op.qubits[0], rank); break; case Gates::h: BaseState::qreg_.apply_h(op.qubits[0], rank); break; case Gates::cx: BaseState::qreg_.apply_cx(op.qubits[0], op.qubits[1], rank); break; case Gates::cz: BaseState::qreg_.apply_cz(op.qubits[0], op.qubits[1], rank); break; case Gates::swap: BaseState::qreg_.apply_swap(op.qubits[0], op.qubits[1], rank); break; case Gates::t: BaseState::qreg_.apply_t(op.qubits[0], rng.rand(), rank); break; case Gates::tdg: BaseState::qreg_.apply_tdag(op.qubits[0], rng.rand(), rank); break; case Gates::ccx: BaseState::qreg_.apply_ccx(op.qubits[0], op.qubits[1], op.qubits[2], rng.rand_int(zero, toff_branch_max), rank); break; case Gates::ccz: BaseState::qreg_.apply_ccz(op.qubits[0], op.qubits[1], op.qubits[2], rng.rand_int(zero, toff_branch_max), rank); break; case Gates::u1: BaseState::qreg_.apply_u1(op.qubits[0], op.params[0], rng.rand(), rank); break; default: //u0 or Identity break; } } void State::apply_snapshot(const Operations::Op &op, ExperimentData &data, RngEngine &rng) { auto it = snapshotset_.find(op.name); if (it == snapshotset_.end()) { throw std::invalid_argument("CH::State::invlaid snapshot instruction \'"+ op.name + "\'."); } switch(it->second) { case Snapshots::state: BaseState::snapshot_state(op, data, "extended_stabilizer_state"); break; case Snapshots::cmemory: BaseState::snapshot_creg_memory(op, data); break; case Snapshots::cregister: BaseState::snapshot_creg_register(op, data); break; case Snapshots::statevector: statevector_snapshot(op, data, rng); break; case Snapshots::probabilities: probabilities_snapshot(op, data, rng); break; default: throw std::invalid_argument("CH::State::invlaid snapshot instruction \'"+ op.name + "\'."); break; } } void State::statevector_snapshot(const Operations::Op &op, ExperimentData &data, RngEngine &rng) { cvector_t statevector; BaseState::qreg_.state_vector(statevector, rng); double sum = 0.; for(uint_t i=0; i samples; if(BaseState::qreg_.get_num_states() == 1) { samples = BaseState::qreg_.stabilizer_sampler(probabilities_snapshot_samples_, rng); } else { samples = BaseState::qreg_.metropolis_estimation(metropolis_mixing_steps_, probabilities_snapshot_samples_, rng); } #pragma omp parallel for if(BaseState::qreg_.check_omp_threshold() && BaseState::threads_>1) num_threads(BaseState::threads_) for(int_t i=0; i < dim; i++) { uint_t target = 0ULL; for(uint_t j=0; j> j) & 1ULL) { target ^= (1ULL << op.qubits[j]); } } for(uint_t j=0; j &ops) const { double xi = 1; for (const auto op: ops) { compute_extent(op, xi); } double err_scaling = std::pow(approximation_error_, -2); return std::llrint(std::ceil(xi*err_scaling)); } void State::compute_extent(const Operations::Op &op, double &xi) const { if(op.type == Operations::OpType::gate) { auto it = gateset_.find(op.name); if (it == gateset_.end()) { throw std::invalid_argument("CH::State: Invalid gate operation \'" +op.name + "\'."); } switch (it->second) { case Gates::t: xi *= CHSimulator::t_extent; break; case Gates::tdg: xi *= CHSimulator::t_extent; break; case Gates::ccx: xi *= CHSimulator::ccx_extent; break; case Gates::ccz: xi *= CHSimulator::ccx_extent; break; case Gates::u1: xi *= CHSimulator::u1_extent(std::real(op.params[0])); break; default: break; } } } size_t State::required_memory_mb(uint_t num_qubits, const std::vector &ops) const { size_t required_chi = compute_chi(ops); // 5 vectors of num_qubits*8byte words // Plus 2*CHSimulator::scalar_t which has 3 4 byte words // Plus 2*CHSimulator::pauli_t which has 2 8 byte words and one 4 byte word; double mb_per_state = 5e-5*num_qubits;// size_t required_mb = std::llrint(std::ceil(mb_per_state*required_chi)); return required_mb; //Todo: Update this function to account for snapshots } } } #endif qiskit-aer-0.4.1/src/simulators/extended_stabilizer/gates.hpp000066400000000000000000000141101362723322000244170ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_chsimulator_gates_hpp #define _aer_chsimulator_gates_hpp #define _USE_MATH_DEFINES #include #include #include #include "framework/operations.hpp" #include "framework/types.hpp" namespace CHSimulator { using uint_t = uint_fast64_t; using complex_t = std::complex; enum class Gates { u0, u1, id, x, y, z, h, s, sdg, t, tdg, cx, cz, swap, ccx, ccz }; enum class Gatetypes { pauli, clifford, non_clifford }; const AER::stringmap_t gate_types_ = { {"id", Gatetypes::pauli}, // Pauli-Identity gate {"x", Gatetypes::pauli}, // Pauli-X gate {"y", Gatetypes::pauli}, // Pauli-Y gate {"z", Gatetypes::pauli}, // Pauli-Z gate {"s", Gatetypes::clifford}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gatetypes::clifford}, // Conjugate-transpose of Phase gate {"h", Gatetypes::clifford}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gatetypes::non_clifford}, // T-gate (sqrt(S)) {"tdg", Gatetypes::non_clifford}, // Conjguate-transpose of T gate // Waltz Gates {"u0", Gatetypes::pauli}, // idle gate in multiples of X90 {"u1", Gatetypes::non_clifford}, // zero-X90 pulse waltz gate // Two-qubit gates {"CX", Gatetypes::clifford}, // Controlled-X gate (CNOT) {"cx", Gatetypes::clifford}, // Controlled-X gate (CNOT) {"cz", Gatetypes::clifford}, // Controlled-Z gate {"swap", Gatetypes::clifford}, // SWAP gate // Three-qubit gates {"ccx", Gatetypes::non_clifford}, // Controlled-CX gate (Toffoli) {"ccz", Gatetypes::non_clifford} // Constrolled-CZ gate (H3 Toff H3) }; using sample_branch_t = std::pair; const double root2 = std::sqrt(2); const double root1_2 = 1./root2; const complex_t pi_over_8_phase(0., M_PI/8); const complex_t omega(root1_2, root1_2); const complex_t omega_star(root1_2, -1*root1_2); const complex_t root_omega = std::exp(pi_over_8_phase); const complex_t root_omega_star = std::conj(root_omega); const double tan_pi_over_8 = std::tan(M_PI/8.); //Base class for sampling over non-Clifford gates in the Sum Over Cliffords routine. struct Sample { public: Sample() = default; virtual ~Sample() = default; Sample(const Sample& other) : branches(other.branches) {}; std::vector branches; virtual sample_branch_t sample(double r) const = 0; }; //Functor class that defines how to sample branches over a U1 operation //Used for caching each U1 gate angle we encounter in the circuit struct U1Sample : public Sample { double p_threshold; U1Sample() = default; U1Sample(double lambda); U1Sample(const U1Sample &other) : Sample(other) { p_threshold = other.p_threshold; } ~U1Sample() = default; sample_branch_t sample(double r) const override; }; U1Sample::U1Sample(double lambda) { // Shift parameter into +- 2 Pi uint_t shift_factor = std::floor(std::abs(lambda)/(2*M_PI)); if (shift_factor != 0) { if(lambda < 0) { lambda += shift_factor*(2*M_PI); } else { lambda -= shift_factor*(2*M_PI); } } // Shift parameter into +- Pi if (lambda > M_PI) { lambda -= 2*M_PI; } else if (lambda < -1*M_PI) { lambda += 2*M_PI; } // Compute the coefficients double angle = std::abs(lambda); bool s_z_quadrant = (angle > M_PI/2); if(s_z_quadrant) { angle = angle - M_PI/2; } angle /= 2; complex_t coeff_0 = std::cos(angle)-std::sin(angle); complex_t coeff_1 = root2*std::sin(angle); if(lambda < 0) { coeff_0 *= root_omega_star; coeff_1 = coeff_1 * root_omega; if(s_z_quadrant) { branches = { sample_branch_t(coeff_0, Gates::sdg), sample_branch_t(coeff_1, Gates::z) }; } else { branches = { sample_branch_t(coeff_0, Gates::id), sample_branch_t(coeff_1, Gates::sdg) }; } } else { coeff_0 *= root_omega; coeff_1 = coeff_1 * root_omega_star; if(s_z_quadrant) { branches = { sample_branch_t(coeff_0, Gates::s), sample_branch_t(coeff_1, Gates::z) }; } else { branches = { sample_branch_t(coeff_0, Gates::id), sample_branch_t(coeff_1, Gates::s) }; } } p_threshold = std::abs(coeff_0) / (std::abs(coeff_0)+std::abs(coeff_1)); } sample_branch_t U1Sample::sample(double r) const { if (r M_PI) { lambda -= 2*M_PI; } else if (lambda < -1*M_PI) { lambda += 2*M_PI; } double angle = std::abs(lambda); bool s_z_quadrant = (angle > M_PI/2); if(s_z_quadrant) { angle = angle - M_PI/2; } angle /= 2; return std::pow(std::cos(angle) + tan_pi_over_8*std::sin(angle), 2.); } } #endif qiskit-aer-0.4.1/src/simulators/matrix_product_state/000077500000000000000000000000001362723322000230225ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/matrix_product_state/matrix_product_state.hpp000066400000000000000000000655761362723322000300220ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ //========================================================================= // Tensor Network State - simulation method //========================================================================= // For this simulation method, we represent the state of the circuit using a tensor // network structure, the specifically matrix product state. The idea is based on // the following paper (there exist other sources as well): // The density-matrix renormalization group in the age of matrix product states by // Ulrich Schollwock. // //-------------------------------------------------------------------------- #ifndef _matrix_product_state_hpp #define _matrix_product_state_hpp #include #define _USE_MATH_DEFINES #include #include "framework/json.hpp" #include "simulators/state.hpp" #include "matrix_product_state_internal.hpp" #include "matrix_product_state_internal.cpp" namespace AER { namespace MatrixProductState { // Allowed snapshots enum class enum class Snapshots { statevector, cmemory, cregister, probs, probs_var, expval_pauli, expval_pauli_var, expval_pauli_shot, expval_matrix, expval_matrix_var, expval_matrix_shot }; // Enum class for different types of expectation values enum class SnapshotDataType {average, average_var, pershot}; //========================================================================= // Matrix Product State subclass //========================================================================= using matrixproductstate_t = MPS; class State : public Base::State { public: using BaseState = Base::State; State() = default; State(uint_t num_qubits) { qreg_.initialize((uint_t)num_qubits); } virtual ~State() = default; //----------------------------------------------------------------------- // Base class overrides //----------------------------------------------------------------------- // Return the string name of the State class virtual std::string name() const override { return "matrix_product_state"; } bool empty() const { return qreg_.empty(); } // Return the set of qobj instruction types supported by the State virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t({ //TODO: Review these operations Operations::OpType::gate, Operations::OpType::measure, Operations::OpType::reset, Operations::OpType::initialize, Operations::OpType::snapshot, Operations::OpType::barrier, Operations::OpType::bfunc, Operations::OpType::roerror, Operations::OpType::matrix //Operations::OpType::kraus // TODO }); } // Return the set of qobj gate instruction names supported by the State virtual stringset_t allowed_gates() const override { stringset_t allowed_gates; for(auto& gate: gateset_){ allowed_gates.insert(gate.first); } return allowed_gates; } // Return the set of qobj snapshot types supported by the State virtual stringset_t allowed_snapshots() const override { //TODO: Review this return {"statevector", "memory", "register", "probabilities", "expectation_value_pauli", "expectation_value_pauli_with_variance", "expectation_value_pauli_single_shot", "expectation_value_matrix", "expectation_value_matrix_with_variance", "expectation_value_matrix_single_shot" }; } // Apply a sequence of operations by looping over list // If the input is not in allowed_ops an exception will be raised. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; // Initializes an n-qubit state to the all |0> state virtual void initialize_qreg(uint_t num_qubits) override; // Initializes to a specific n-qubit state given as a complex std::vector virtual void initialize_qreg(uint_t num_qubits, const matrixproductstate_t &state) override; void initialize_qreg(uint_t num_qubits, const cvector_t &statevector); // Returns the required memory for storing an n-qubit state in megabytes. // For this state the memory is indepdentent of the number of ops // and is approximately 16 * 1 << num_qubits bytes virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const override; // Load the threshold for applying OpenMP parallelization // if the controller/engine allows threads for it // We currently set the threshold to 1 in qasm_controller.hpp, i.e., no parallelization virtual void set_config(const json_t &config) override; // Sample n-measurement outcomes without applying the measure operation // to the system state virtual std::vector sample_measure(const reg_t& qubits, uint_t shots, RngEngine &rng) override; //----------------------------------------------------------------------- // Additional methods //----------------------------------------------------------------------- void initialize_omp(); protected: //----------------------------------------------------------------------- // Apply instructions //----------------------------------------------------------------------- // Applies a sypported Gate operation to the state class. // If the input is not in allowed_gates an exeption will be raised. void apply_gate(const Operations::Op &op); // Initialize the specified qubits to a given state |psi> // by creating the MPS state with the new state |psi>. // |psi> is given in params // Currently only supports intialization of all qubits void apply_initialize(const reg_t &qubits, const cvector_t ¶ms, RngEngine &rng); // Measure qubits and return a list of outcomes [q0, q1, ...] // If a state subclass supports this function, then "measure" // should be contained in the set defineed by 'allowed_ops' virtual void apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng); // Reset the specified qubits to the |0> state by simulating // a measurement, applying a conditional x-gate if the outcome is 1, and // then discarding the outcome. void apply_reset(const reg_t &qubits, RngEngine &rng); // Apply a supported snapshot instruction // If the input is not in allowed_snapshots an exception will be raised. virtual void apply_snapshot(const Operations::Op &op, ExperimentData &data); // Apply a matrix to given qubits (identity on all other qubits) // We assume matrix to be 2x2 void apply_matrix(const reg_t &qubits, const cmatrix_t & mat); // Apply a vectorized matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cvector_t & vmat); // Apply a Kraus error operation //void apply_kraus(const reg_t &qubits, // const std::vector &krausops, // RngEngine &rng); //----------------------------------------------------------------------- // Measurement Helpers //----------------------------------------------------------------------- // Return vector of measure probabilities for specified qubits // If a state subclass supports this function, then "measure" // must be contained in the set defined by 'allowed_ops' rvector_t measure_probs(const reg_t &qubits) const; // Sample the measurement outcome for qubits // return a pair (m, p) of the outcome m, and its corresponding // probability p. // Outcome is given as an int: Eg for two-qubits {q0, q1} we have // 0 -> |q1 = 0, q0 = 0> state // 1 -> |q1 = 0, q0 = 1> state // 2 -> |q1 = 1, q0 = 0> state // 3 -> |q1 = 1, q0 = 1> state std::pair sample_measure_with_prob(const reg_t &qubits, RngEngine &rng); void measure_reset_update(const reg_t &qubits, const uint_t final_state, const reg_t &meas_state); //----------------------------------------------------------------------- // Special snapshot types // // IMPORTANT: These methods are not marked const to allow modifying state // during snapshot, but after the snapshot is applied the simulator // should be left in the pre-snapshot state. //----------------------------------------------------------------------- // Snapshot current qubit probabilities for a measurement (average) void snapshot_probabilities(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); // Snapshot the expectation value of a Pauli operator void snapshot_pauli_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); // Snapshot the expectation value of a matrix operator void snapshot_matrix_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); // Snapshot the state vector void snapshot_state(const Operations::Op &op, ExperimentData &data, std::string name = ""); //----------------------------------------------------------------------- // Single-qubit gate helpers //----------------------------------------------------------------------- // Apply a waltz gate specified by parameters u3(theta, phi, lambda) void apply_gate_u3(const uint_t qubit, const double theta, const double phi, const double lambda); // Optimize phase gate with diagonal [1, phase] void apply_gate_phase(const uint_t qubit, const complex_t phase); //----------------------------------------------------------------------- // Config Settings //----------------------------------------------------------------------- // Table of allowed gate names to gate enum class members const static stringmap_t gateset_; // Table of allowed snapshot types to enum class members const static stringmap_t snapshotset_; }; //========================================================================= // Implementation: Allowed ops and gateset //========================================================================= const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::x}, // Pauli-X gate {"y", Gates::y}, // Pauli-Y gate {"z", Gates::z}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gates::t}, // T-gate (sqrt(S)) {"tdg", Gates::tdg}, // Conjguate-transpose of T gate // Waltz Gates {"u1", Gates::u1}, // zero-X90 pulse waltz gate {"u2", Gates::u2}, // single-X90 pulse waltz gate {"u3", Gates::u3}, // two X90 pulse waltz gate {"U", Gates::u3}, // two X90 pulse waltz gate // Two-qubit gates {"CX", Gates::cx}, // Controlled-X gate (CNOT) {"cx", Gates::cx}, // Controlled-X gate (CNOT) {"cz", Gates::cz}, // Controlled-Z gate {"cu1", Gates::cu1}, // Controlled-U1 gate {"swap", Gates::swap}, // SWAP gate // Three-qubit gates {"ccx", Gates::mcx} // Controlled-CX gate (Toffoli) }); const stringmap_t State::snapshotset_({ {"statevector", Snapshots::statevector}, {"probabilities", Snapshots::probs}, {"expectation_value_pauli", Snapshots::expval_pauli}, {"expectation_value_matrix", Snapshots::expval_matrix}, {"probabilities_with_variance", Snapshots::probs_var}, {"expectation_value_pauli_with_variance", Snapshots::expval_pauli_var}, {"expectation_value_matrix_with_variance", Snapshots::expval_matrix_var}, {"expectation_value_pauli_single_shot", Snapshots::expval_pauli_shot}, {"expectation_value_matrix_single_shot", Snapshots::expval_matrix_shot}, {"memory", Snapshots::cmemory}, {"register", Snapshots::cregister} }); //========================================================================= // Implementation: Base class method overrides //========================================================================= //------------------------------------------------------------------------- // Initialization //------------------------------------------------------------------------- void State::initialize_qreg(uint_t num_qubits) { qreg_.initialize((uint_t)num_qubits); } void State::initialize_qreg(uint_t num_qubits, const matrixproductstate_t &state) { // Check dimension of state if (qreg_.num_qubits() != num_qubits) { throw std::invalid_argument("MatrixProductState::State::initialize: initial state does not match qubit number"); } #ifdef DEBUG cout << "initialize with state not supported yet"; #endif } void State::initialize_qreg(uint_t num_qubits, const cvector_t &statevector) { // Check dimension of state if (qreg_.num_qubits() != num_qubits) { throw std::invalid_argument("MatrixProductState::State::initialize: initial state does not match qubit number"); } // internal bit ordering is the opposite of ordering in Qasm, so must // reverse order before starting cvector_t mps_format_state_vector = reverse_all_bits(statevector, num_qubits); qreg_.initialize_from_statevector(num_qubits, mps_format_state_vector); } size_t State::required_memory_mb(uint_t num_qubits, const std::vector &ops) const { // for each qubit we have a tensor structure. // Initially, each tensor contains 2 matrices with a single complex double // Depending on the number of 2-qubit gates, // these matrices may double their size // for now - compute only initial size // later - FIXME size_t mem_mb = 16 * 2 * num_qubits; return mem_mb; } void State::set_config(const json_t &config) { // Set threshold for truncating snapshots uint_t json_chop_threshold; if (JSON::get_value(json_chop_threshold, "chop_threshold", config)) MPS::set_json_chop_threshold(json_chop_threshold); // Set OMP threshold for state update functions uint_t omp_qubit_threshold; if (JSON::get_value(omp_qubit_threshold, "mps_parallel_threshold", config)) MPS::set_omp_threshold(omp_qubit_threshold); // Set the sample measure indexing size int index_size; if (JSON::get_value(index_size, "mps_sample_measure_opt", config)) { MPS::set_sample_measure_index_size(index_size); }; // Enable sorted gate optimzations bool gate_opt = false; // if (JSON::get_value(gate_opt, "mps_gate_opt", config)) // MPS::set_enable_gate_opt(gate_opt); } //========================================================================= // Implementation: apply operations //========================================================================= void State::apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) { // Simple loop over vector of input operations for (const auto op: ops) { if(BaseState::creg_.check_conditional(op)) { switch (op.type) { case Operations::OpType::barrier: break; case Operations::OpType::reset: apply_reset(op.qubits, rng); break; case Operations::OpType::initialize: apply_initialize(op.qubits, op.params, rng); break; case Operations::OpType::measure: apply_measure(op.qubits, op.memory, op.registers, rng); break; case Operations::OpType::bfunc: BaseState::creg_.apply_bfunc(op); break; case Operations::OpType::roerror: BaseState::creg_.apply_roerror(op, rng); break; case Operations::OpType::gate: apply_gate(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data); break; case Operations::OpType::matrix: apply_matrix(op.qubits, op.mats[0]); break; default: throw std::invalid_argument("MatrixProductState::State::invalid instruction \'" + op.name + "\'."); } } } } //========================================================================= // Implementation: Snapshots //========================================================================= void State::snapshot_pauli_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type){ if (op.params_expval_pauli.empty()) { throw std::invalid_argument("Invalid expval snapshot (Pauli components are empty)."); } //Compute expval components complex_t expval(0., 0.); for (const auto ¶m : op.params_expval_pauli) { complex_t coeff = param.first; std::string pauli_matrices = param.second; complex_t pauli_expval = qreg_.expectation_value_pauli(op.qubits, pauli_matrices); expval += coeff * pauli_expval; } // add to snapshot Utils::chop_inplace(expval, MPS::get_json_chop_threshold()); switch (type) { case SnapshotDataType::average: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, false); break; case SnapshotDataType::average_var: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, true); break; case SnapshotDataType::pershot: data.add_pershot_snapshot("expectation_values", op.string_params[0], expval); break; } } void State::snapshot_matrix_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type){ if (op.params_expval_matrix.empty()) { throw std::invalid_argument("Invalid matrix snapshot (components are empty)."); } complex_t expval(0., 0.); double one_expval = 0; for (const auto ¶m : op.params_expval_matrix) { complex_t coeff = param.first; for (const auto &pair: param.second) { reg_t sub_qubits; for (const auto pos : pair.first) { sub_qubits.push_back(op.qubits[pos]); } const cmatrix_t &mat = pair.second; one_expval = qreg_.expectation_value(sub_qubits, mat); expval += coeff * one_expval; } } // add to snapshot Utils::chop_inplace(expval, MPS::get_json_chop_threshold()); switch (type) { case SnapshotDataType::average: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, false); break; case SnapshotDataType::average_var: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, true); break; case SnapshotDataType::pershot: data.add_pershot_snapshot("expectation_values", op.string_params[0], expval); break; } } void State::snapshot_state(const Operations::Op &op, ExperimentData &data, std::string name) { cvector_t statevector; qreg_.full_state_vector(statevector); data.add_pershot_snapshot("statevector", op.string_params[0], statevector); } void State::snapshot_probabilities(const Operations::Op &op, ExperimentData &data, SnapshotDataType type) { rvector_t prob_vector; qreg_.get_probabilities_vector(prob_vector, op.qubits); auto probs = Utils::vec2ket(prob_vector, MPS::get_json_chop_threshold(), 16); bool variance = type == SnapshotDataType::average_var; data.add_average_snapshot("probabilities", op.string_params[0], BaseState::creg_.memory_hex(), probs, variance); } void State::apply_gate(const Operations::Op &op) { // Look for gate name in gateset auto it = gateset_.find(op.name); if (it == gateset_.end()) throw std::invalid_argument( "MatrixProductState::State::invalid gate instruction \'" + op.name + "\'."); switch (it -> second) { case Gates::mcx: qreg_.apply_ccx(op.qubits); break; case Gates::u3: qreg_.apply_u3(op.qubits[0], std::real(op.params[0]), std::real(op.params[1]), std::real(op.params[2])); break; case Gates::u2: qreg_.apply_u2(op.qubits[0], std::real(op.params[0]), std::real(op.params[1])); break; case Gates::u1: qreg_.apply_u1(op.qubits[0], std::real(op.params[0])); break; case Gates::cx: qreg_.apply_cnot(op.qubits[0], op.qubits[1]); break; case Gates::id: { break; } case Gates::x: qreg_.apply_x(op.qubits[0]); break; case Gates::y: qreg_.apply_y(op.qubits[0]); break; case Gates::z: qreg_.apply_z(op.qubits[0]); break; case Gates::h: qreg_.apply_h(op.qubits[0]); break; case Gates::s: qreg_.apply_s(op.qubits[0]); break; case Gates::sdg: qreg_.apply_sdg(op.qubits[0]); break; case Gates::t: qreg_.apply_t(op.qubits[0]); break; case Gates::tdg: qreg_.apply_tdg(op.qubits[0]); break; case Gates::swap: qreg_.apply_swap(op.qubits[0], op.qubits[1]); break; case Gates::cz: qreg_.apply_cz(op.qubits[0], op.qubits[1]); break; case Gates::cu1: qreg_.apply_cu1(op.qubits[0], op.qubits[1], std::real(op.params[0])); break; default: // We shouldn't reach here unless there is a bug in gateset throw std::invalid_argument( "MatrixProductState::State::invalid gate instruction \'" + op.name + "\'."); } } void State::apply_matrix(const reg_t &qubits, const cmatrix_t &mat) { if (!qubits.empty() && mat.size() > 0) { qreg_.apply_matrix(qubits, mat); return; } } void State::apply_matrix(const reg_t &qubits, const cvector_t &vmat) { // Check if diagonal matrix if (vmat.size() == 1ULL << qubits.size()) { qreg_.apply_diagonal_matrix(qubits, vmat); } else { qreg_.apply_matrix(qubits, vmat); } } //========================================================================= // Implementation: Reset and Measurement Sampling //========================================================================= void State::apply_initialize(const reg_t &qubits, const cvector_t ¶ms, RngEngine &rng) { if (qubits.size() == BaseState::qreg_.num_qubits()) { // If qubits is all ordered qubits in the statevector // we can just initialize the whole state directly auto sorted_qubits = qubits; std::sort(sorted_qubits.begin(), sorted_qubits.end()); if (qubits == sorted_qubits) { initialize_qreg(qubits.size(), params); return; } } // partial initialization not supported yet throw std::invalid_argument("MPS_State: Partial initialization not supported yet."); } void State::apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng) { reg_t outcome = qreg_.apply_measure(qubits, rng); creg_.store_measure(outcome, cmemory, cregister); } rvector_t State::measure_probs(const reg_t &qubits) const { rvector_t probvector; qreg_.get_probabilities_vector(probvector, qubits); return probvector; } std::vector State::sample_measure(const reg_t &qubits, uint_t shots, RngEngine &rng) { MPS temp; std::vector all_samples; all_samples.resize(shots); reg_t single_result; for (int_t i=0; i(shots); i++) { temp.initialize(qreg_); single_result = temp.apply_measure(qubits, rng); all_samples[i] = single_result; } return all_samples; } void State::apply_snapshot(const Operations::Op &op, ExperimentData &data) { // Look for snapshot type in snapshotset auto it = snapshotset_.find(op.name); if (it == snapshotset_.end()) throw std::invalid_argument("MatrixProductState::invalid snapshot instruction \'" + op.name + "\'."); switch (it -> second) { case Snapshots::statevector: { snapshot_state(op, data, "statevector"); break; } case Snapshots::cmemory: BaseState::snapshot_creg_memory(op, data); break; case Snapshots::cregister: BaseState::snapshot_creg_register(op, data); break; case Snapshots::probs: { // get probs as hexadecimal snapshot_probabilities(op, data, SnapshotDataType::average); break; } case Snapshots::expval_pauli: { snapshot_pauli_expval(op, data, SnapshotDataType::average); } break; case Snapshots::expval_matrix: { snapshot_matrix_expval(op, data, SnapshotDataType::average); } break; case Snapshots::probs_var: { // get probs as hexadecimal snapshot_probabilities(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_pauli_var: { snapshot_pauli_expval(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_matrix_var: { snapshot_matrix_expval(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_pauli_shot: { snapshot_pauli_expval(op, data, SnapshotDataType::pershot); } break; case Snapshots::expval_matrix_shot: { snapshot_matrix_expval(op, data, SnapshotDataType::pershot); } break; default: // We shouldn't get here unless there is a bug in the snapshotset throw std::invalid_argument("MatrixProductState::State::invalid snapshot instruction \'" + op.name + "\'."); } } void State::apply_reset(const reg_t &qubits, RngEngine &rng) { // Simulate unobserved measurement reg_t outcome = qreg_.apply_measure(qubits, rng); // Apply update to reset state measure_reset_update(qubits, 0, outcome); } void State::measure_reset_update(const reg_t &qubits, const uint_t final_state, const reg_t &meas_state) { for (uint_t i=0; i State::sample_measure_with_prob(const reg_t &qubits, RngEngine &rng) { rvector_t probs = measure_probs(qubits); // Randomly pick outcome and return pair uint_t outcome = rng.rand_int(probs); return std::make_pair(outcome, probs[outcome]); } //------------------------------------------------------------------------- } // end namespace MatrixProductState //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/simulators/matrix_product_state/matrix_product_state_internal.cpp000066400000000000000000001205341362723322000316730ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #include #include #include "stdlib.h" #include "stdio.h" #include "string.h" #include #include #include "framework/utils.hpp" #include "framework/matrix.hpp" #include "matrix_product_state_internal.hpp" #include "matrix_product_state_tensor.hpp" namespace AER { namespace MatrixProductState { static const cmatrix_t zero_measure = AER::Utils::make_matrix({{{1, 0}, {0, 0}}, {{0, 0}, {0, 0}}}); static const cmatrix_t one_measure = AER::Utils::make_matrix({{{0, 0}, {0, 0}}, {{0, 0}, {1, 0}}}); uint_t MPS::omp_threads_ = 1; uint_t MPS::omp_threshold_ = 14; int MPS::sample_measure_index_size_ = 10; double MPS::json_chop_threshold_ = 1E-8; //------------------------------------------------------------------------ // local function declarations //------------------------------------------------------------------------ //------------------------------------------------------------------------ // Function name: squeeze_qubits // Description: Takes a list of qubits, and squeezes them into a list of the same size, // that begins at 0, and where all qubits are consecutive. Note that relative // order between qubits is preserved. // Example: [8, 4, 6, 0, 9] -> [3, 1, 2, 0, 4] // Input: original_qubits // Returns: squeezed_qubits // //------------------------------------------------------------------------ void squeeze_qubits(const reg_t &original_qubits, reg_t &squeezed_qubits); //------------------------------------------------------------------------ // Function name: reorder_all_qubits // Description: The ordering of the amplitudes in the statevector in this module is // [n, (n-1),.., 2, 1, 0], i.e., msb is leftmost and lsb is rightmost. // Sometimes, we need to provide a different ordering of the amplitudes, such as // in snapshot_probabilities. For example, instead of [2, 1, 0] the user requests // the probabilities of [1, 0, 2]. // Note that the ordering in the qubits vector is the same as that of the mps solver, // i.e., qubits are numbered from left to right, e.g., 210 // Input: orig_probvector - the ordered vector of probabilities // qubits - a list containing the new ordering // Returns: new_probvector - the vector in the new ordering // e.g., 011->101 (for the ordering [1, 0, 2] // //------------------------------------------------------------------------ template void reorder_all_qubits(const std::vector& orig_probvector, reg_t qubits, std::vector& new_probvector); uint_t reorder_qubits(const reg_t qubits, uint_t index); //-------------------------------------------------------------------------- // Function name: reverse_all_bits // Description: The ordering of the amplitudes in the statevector in this module is // 000, 001, 010, 011, 100, 101, 110, 111. // The ordering of the amplitudes in the statevector in Qasm in general is // 000, 100, 010, 110, 001, 101, 011, 111. // This function converts the statevector from one representation to the other. // This is a special case of reorder_qubits // Input: the input statevector and the number of qubits // Output: the statevector in reverse order //---------------------------------------------------------------- template std::vector reverse_all_bits(const std::vector& statevector, uint_t num_qubits); uint_t reverse_bits(uint_t num, uint_t len); std::vector calc_new_indices(const reg_t &indices); // The following two functions are helper functions used by // initialize_from_statevector cmatrix_t reshape_matrix(cmatrix_t input_matrix); cmatrix_t mul_matrix_by_lambda(const cmatrix_t &mat, const rvector_t &lambda); std::string sort_paulis_by_qubits(const std::string &paulis, const reg_t &qubits); bool is_ordered(const reg_t &qubits); //------------------------------------------------------------------------ // local function implementations //------------------------------------------------------------------------ void squeeze_qubits(const reg_t &original_qubits, reg_t &squeezed_qubits) { std::vector sorted_qubits; for (uint_t index : original_qubits) { sorted_qubits.push_back(index); } sort(sorted_qubits.begin(), sorted_qubits.end()); for (uint_t i=0; i void reorder_all_qubits(const std::vector& orig_probvector, reg_t qubits, std::vector& new_probvector) { uint_t new_index; uint_t length = 1ULL << qubits.size(); // length = pow(2, num_qubits) // if qubits are [k0, k1,...,kn], move them to [0, 1, .. , n], but preserve relative // ordering reg_t squeezed_qubits(qubits.size()); squeeze_qubits(qubits, squeezed_qubits); for (uint_t i=0; i < length; i++) { new_index = reorder_qubits(squeezed_qubits, i); new_probvector[new_index] = orig_probvector[i]; } } uint_t reorder_qubits(const reg_t qubits, uint_t index) { uint_t new_index = 0; int_t current_pos = 0, current_val = 0, new_pos = 0, shift =0; uint_t num_qubits = qubits.size(); for (uint_t i=0; i 0) { new_index += current_val << shift; } else if (shift < 0) { new_index += current_val >> -shift; } else { new_index += current_val; } } } return new_index; } uint_t reverse_bits(uint_t num, uint_t len) { uint_t sum = 0; for (uint_t i=0; i>1; if (num == 0) { break; } } return sum; } template std::vector reverse_all_bits(const std::vector& statevector, uint_t num_qubits) { uint_t length = statevector.size(); // length = pow(2, num_qubits_) std::vector output_vector(length); #pragma omp parallel for if (length > MPS::get_omp_threshold() && MPS::get_omp_threads() > 1) num_threads(MPS::get_omp_threads()) for (int_t i = 0; i < static_cast(length); i++) { output_vector[i] = statevector[reverse_bits(i, num_qubits)]; } return output_vector; } std::vector calc_new_indices(const reg_t &indices) { // assumes indices vector is sorted uint_t n = indices.size(); uint_t mid_index = indices[(n-1)/2]; uint_t first = mid_index - (n-1)/2; std::vector new_indices(n); std::iota( std::begin( new_indices ), std::end( new_indices ), first); return new_indices; } cmatrix_t mul_matrix_by_lambda(const cmatrix_t &mat, const rvector_t &lambda) { if (lambda == rvector_t {1.0}) return mat; cmatrix_t res_mat(mat); uint_t num_rows = mat.GetRows(), num_cols = mat.GetColumns(); #ifdef _WIN32 #pragma omp parallel for if (num_rows*num_cols > 64 && MPS::get_omp_threads() > 1) num_threads(MPS::get_omp_threads()) #else #pragma omp parallel for collapse(2) if (num_rows*num_cols > 64 && MPS::get_omp_threads() > 1) num_threads(MPS::get_omp_threads()) #endif for(int_t row = 0; row < static_cast(num_rows); row++) { for(int_t col = 0; col < static_cast(num_cols); col++) { res_mat(row, col) = mat(row, col) * lambda[col]; } } return res_mat; } cmatrix_t reshape_matrix(cmatrix_t input_matrix) { std::vector res(2); AER::Utils::split(input_matrix, res[0], res[1], 1); cmatrix_t reshaped_matrix = AER::Utils::concatenate(res[0], res[1], 0); return reshaped_matrix; } std::string sort_paulis_by_qubits(const std::string &paulis, const reg_t &qubits) { uint_t min = UINT_MAX; uint_t min_index = 0; std::string new_paulis; std::vector temp_qubits = qubits; // find min_index, the next smallest index in qubits for (uint_t i=0; i index_B) { std::swap(index_A, index_B); } //for MPS if(index_A + 1 < index_B) { uint_t i; for(i = index_A; i < index_B; i++) { apply_swap(i,i+1); } for(i = index_B-1; i > index_A; i--) { apply_swap(i,i-1); } return; } MPS_Tensor A = q_reg_[index_A], B = q_reg_[index_B]; rvector_t left_lambda, right_lambda; //There is no lambda in the edges of the MPS left_lambda = (index_A != 0) ? lambda_reg_[index_A-1] : rvector_t {1.0}; right_lambda = (index_B != num_qubits_-1) ? lambda_reg_[index_B ] : rvector_t {1.0}; q_reg_[index_A].mul_Gamma_by_left_Lambda(left_lambda); q_reg_[index_B].mul_Gamma_by_right_Lambda(right_lambda); MPS_Tensor temp = MPS_Tensor::contract(q_reg_[index_A], lambda_reg_[index_A], q_reg_[index_B]); temp.apply_swap(); MPS_Tensor left_gamma,right_gamma; rvector_t lambda; MPS_Tensor::Decompose(temp, left_gamma, lambda, right_gamma); left_gamma.div_Gamma_by_left_Lambda(left_lambda); right_gamma.div_Gamma_by_right_Lambda(right_lambda); q_reg_[index_A] = left_gamma; lambda_reg_[index_A] = lambda; q_reg_[index_B] = right_gamma; } //------------------------------------------------------------------------- // MPS::apply_2_qubit_gate - outline of the algorithm // 1. Swap qubits A and B until they are consecutive // 2. Contract MPS_Tensor[A] and MPS_Tensor[B], yielding a temporary four-matrix MPS_Tensor // that represents the entangled states of A and B. // 3. Apply the gate // 4. Decompose the temporary MPS_Tensor (using SVD) into U*S*V, where U and V are matrices // and S is a diagonal matrix // 5. U is split by rows to yield two MPS_Tensors representing qubit A (in reshape_U_after_SVD), // V is split by columns to yield two MPS_Tensors representing qubit B (in reshape_V_after_SVD), // the diagonal of S becomes the Lambda-vector in between A and B. //------------------------------------------------------------------------- void MPS::apply_2_qubit_gate(uint_t index_A, uint_t index_B, Gates gate_type, const cmatrix_t &mat) { // We first move the two qubits to be in consecutive positions // If index_B > index_A, we move the qubit at index_B to index_A+1 // If index_B < index_A, we move the qubit at index_B to index_A-1, and then // swap between the qubits uint_t A = index_A; bool swapped = false, greater = false, smaller = false; if (index_B > index_A+1) { greater = true; change_position(index_B, index_A+1); // Move B to be right after A } else if (index_A > 0 && index_B < index_A-1) { smaller = true; change_position(index_B, index_A-1); // Move B to be right before A } if (index_B < index_A) { A = index_A - 1; swapped = true; } // After we moved the qubits as necessary, // the operation is always between qubits A and A+1 rvector_t left_lambda, right_lambda; //There is no lambda on the edges of the MPS left_lambda = (A != 0) ? lambda_reg_[A-1] : rvector_t {1.0}; right_lambda = (A+1 != num_qubits_-1) ? lambda_reg_[A+1] : rvector_t {1.0}; q_reg_[A].mul_Gamma_by_left_Lambda(left_lambda); q_reg_[A+1].mul_Gamma_by_right_Lambda(right_lambda); MPS_Tensor temp = MPS_Tensor::contract(q_reg_[A], lambda_reg_[A], q_reg_[A+1]); switch (gate_type) { case cx: temp.apply_cnot(swapped); break; case cz: temp.apply_cz(); break; case id: break; case cu1: { cmatrix_t Zeros = AER::Utils::Matrix::I-AER::Utils::Matrix::I; cmatrix_t temp1 = AER::Utils::concatenate(AER::Utils::Matrix::I, Zeros , 1), temp2 = AER::Utils::concatenate(Zeros, mat, 1); cmatrix_t cu = AER::Utils::concatenate(temp1, temp2 ,0) ; temp.apply_matrix(cu); break; } case su4: // We reverse the order of the qubits, according to the Qiskit convention. // Effectively, this reverses swap for 2-qubit gates temp.apply_matrix(mat, !swapped); break; default: throw std::invalid_argument("illegal gate for apply_2_qubit_gate"); } MPS_Tensor left_gamma,right_gamma; rvector_t lambda; MPS_Tensor::Decompose(temp, left_gamma, lambda, right_gamma); left_gamma.div_Gamma_by_left_Lambda(left_lambda); right_gamma.div_Gamma_by_right_Lambda(right_lambda); q_reg_[A] = left_gamma; lambda_reg_[A] = lambda; q_reg_[A+1] = right_gamma; if (greater) { change_position(index_A+1, index_B); // Move B back to its original position } else if (smaller) { change_position(index_A-1, index_B); } } void MPS::apply_3_qubit_gate(const reg_t &qubits, Gates gate_type, const cmatrix_t &mat) { if (qubits.size() != 3) { std::stringstream ss; ss << "error: apply_3_qubit gate must receive 3 qubits"; throw std::runtime_error(ss.str()); } bool ordered = true; reg_t new_qubits(qubits.size()); reg_t sorted_qubits(qubits.size()); centralize_and_sort_qubits(qubits, sorted_qubits, new_qubits, ordered); // The controlled (or target) qubit, is qubit[2]. Since in new_qubits the qubits are sorted, // the relative position of the controlled qubit will be 0, 1, or 2 depending on // where qubit[2] was moved to in new_qubits uint_t target=0; if (qubits[2] > qubits[0] && qubits[2] > qubits[1]) target = 2; else if (qubits[2] < qubits[0] && qubits[2] < qubits[1]) target = 0; else target = 1; // extract the tensor containing only the 3 qubits on which we apply the gate uint_t first = new_qubits.front(); MPS_Tensor sub_tensor(state_vec_as_MPS(first, first+2)); // apply the gate to sub_tensor switch (gate_type) { case mcx: sub_tensor.apply_ccx(target); break; default: throw std::invalid_argument("illegal gate for apply_3_qubit_gate"); } // state_mat is a matrix containing the flattened representation of the sub-tensor // into a single matrix. Note that sub_tensor will contain 8 matrices for 3-qubit // gates. state_mat will be the concatenation of them all. cmatrix_t state_mat = sub_tensor.get_data(0); for (uint_t i=1; i 0) q_reg_[first].div_Gamma_by_left_Lambda(lambda_reg_[first-1]); if (first+2 < num_qubits_-1) q_reg_[first+2].div_Gamma_by_right_Lambda(lambda_reg_[first+2]); // This is the reverse of centralize_qubits which we did at the beginning if (!ordered) move_qubits_to_original_location(first, qubits, sorted_qubits); } void MPS::apply_matrix(const reg_t & qubits, const cmatrix_t &mat) { switch (qubits.size()) { case 1: q_reg_[qubits[0]].apply_matrix(mat); break; case 2: apply_2_qubit_gate(qubits[0], qubits[1], su4, mat); break; default: apply_multi_qubit_gate(qubits, mat); } } void MPS::apply_multi_qubit_gate(const reg_t &qubits, const cmatrix_t &mat) { // need to reverse qubits because that is the way they // are defined in the Qiskit interface reg_t reversed_qubits = qubits; std::reverse(reversed_qubits.begin(), reversed_qubits.end()); if (is_ordered(reversed_qubits)) apply_matrix_to_target_qubits(reversed_qubits, mat); else apply_unordered_multi_qubit_gate(reversed_qubits, mat); } void MPS::apply_unordered_multi_qubit_gate(const reg_t &qubits, const cmatrix_t &mat){ reg_t actual_indices(num_qubits_); std::iota( std::begin(actual_indices), std::end(actual_indices), 0); reg_t target_qubits(qubits.size()); // need to move all target qubits to be consecutive at the right end uint_t right_end = move_qubits_to_right_end(qubits, target_qubits, actual_indices); apply_matrix_to_target_qubits(target_qubits, mat); // need to move qubits back to original position move_qubits_back_from_right_end(qubits, actual_indices, right_end); } void MPS::apply_matrix_to_target_qubits(const reg_t &target_qubits, const cmatrix_t &mat) { uint_t num_qubits = target_qubits.size(); uint_t first = target_qubits.front(); MPS_Tensor sub_tensor(state_vec_as_MPS(first, first+num_qubits-1)); sub_tensor.apply_matrix(mat); // state_mat is a matrix containing the flattened representation of the sub-tensor // into a single matrix. E.g., sub_tensor will contain 8 matrices for 3-qubit // gates. state_mat will be the concatenation of them all. cmatrix_t state_mat = sub_tensor.get_data(0); for (uint_t i=1; i 0) q_reg_[first].div_Gamma_by_left_Lambda(lambda_reg_[first-1]); for (uint_t i=1; i qubits[index+1]){ ordered = false; break; } } if (!ordered) sort(sorted_indices.begin(), sorted_indices.end()); centralized_qubits = calc_new_indices(sorted_indices); } void MPS::move_qubits_to_centralized_indices(const reg_t &sorted_indices, const reg_t ¢ralized_qubits) { // We wish to minimize the number of swaps. Therefore we center the // new indices around the median uint_t mid_index = (centralized_qubits.size()-1)/2; for(uint_t i = mid_index; i < sorted_indices.size(); i++) { change_position(sorted_indices[i], centralized_qubits[i]); } for(int i = mid_index-1; i >= 0; i--) { change_position(sorted_indices[i], centralized_qubits[i]); } } void MPS::move_qubits_to_original_location(uint_t first, const reg_t &original_qubits, const reg_t &sorted_qubits) { uint_t num_qubits = original_qubits.size(); uint_t mid_index = (num_qubits-1)/2; for(uint_t i = 0; i < mid_index; i++) { change_position(first+i, sorted_qubits[i]); } for(uint_t i = num_qubits-1; i > mid_index; i--) { change_position(first+i, sorted_qubits[i]); } // note that the qubit at mid_index does not need to move, because we didn't move it // during centralize_qubits } uint_t MPS::move_qubits_to_right_end(const reg_t &qubits, reg_t &target_qubits, reg_t &actual_indices) { // actual_qubits is a temporary structure that stores the current ordering of the // qubits in the MPS structure. It is necessary, because when we perform swaps, // the positions of the qubits change. We need to move the qubits from their // current position (as in actual_qubits), not from the original position uint_t num_target_qubits = qubits.size(); uint_t num_moved = 0; // We define the right_end as the position of the largest qubit in // 'qubits`. We will move all `qubits` to be consecutive with the // rightmost being at right_end. uint_t right_end = qubits[0]; for (uint_t i=1; i=0; right_index--) { // find "largest" element and move it to the right end uint_t next_right = qubits[right_index]; for (uint_t i=0; ifinal_pos; j--) { //swap the qubits until smallest reaches its original position apply_swap(j, j-1); // swap actual_indices to keep track of the new qubit positions std::swap(actual_indices[j], actual_indices[j-1]); } break; } } void MPS::change_position(uint_t src, uint_t dst) { if(src == dst) return; else if(src < dst) for(uint_t i = src; i < dst; i++) apply_swap(i,i+1); else for(uint_t i = src; i > dst; i--) apply_swap(i,i-1); } cmatrix_t MPS::density_matrix(const reg_t &qubits) const { MPS temp_MPS; temp_MPS.initialize(*this); reg_t new_qubits; bool ordered = true; temp_MPS.centralize_qubits(qubits, new_qubits, ordered); MPS_Tensor psi = temp_MPS.state_vec_as_MPS(new_qubits.front(), new_qubits.back()); uint_t size = psi.get_dim(); cmatrix_t rho(size,size); #ifdef _WIN32 #pragma omp parallel for if (size > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) #else #pragma omp parallel for collapse(2) if (size > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) #endif for(int_t i = 0; i < static_cast(size); i++) { for(int_t j = 0; j < static_cast(size); j++) { rho(i,j) = AER::Utils::sum( AER::Utils::elementwise_multiplication(psi.get_data(i), AER::Utils::conjugate(psi.get_data(j))) ); } } return rho; } rvector_t MPS::trace_of_density_matrix(const reg_t &qubits) const { MPS temp_MPS; temp_MPS.initialize(*this); bool ordered = true; reg_t new_qubits; temp_MPS.centralize_qubits(qubits, new_qubits, ordered); MPS_Tensor psi = temp_MPS.state_vec_as_MPS(new_qubits.front(), new_qubits.back()); uint_t size = psi.get_dim(); rvector_t trace_rho(size); for(int_t i = 0; i < static_cast(size); i++) { trace_rho[i] = real(AER::Utils::sum( AER::Utils::elementwise_multiplication(psi.get_data(i), AER::Utils::conjugate(psi.get_data(i))) )); } return trace_rho; } void MPS::MPS_with_new_indices(const reg_t &qubits, reg_t &sorted_qubits, reg_t ¢ralized_qubits, MPS& temp_MPS) const { temp_MPS.initialize(*this); bool ordered = true; temp_MPS.centralize_and_sort_qubits(qubits, sorted_qubits, centralized_qubits, ordered); } double MPS::expectation_value(const reg_t &qubits, const cmatrix_t &M) const { // need to reverse qubits because that is the way they // are defined in the Qiskit interface reg_t reversed_qubits = qubits; std::reverse(reversed_qubits.begin(), reversed_qubits.end()); bool are_qubits_ordered = is_ordered(reversed_qubits); cmatrix_t rho; // if qubits are in consecutive order, can extract the density matrix // without moving them, for performance reasons reg_t target_qubits(qubits.size()); if (are_qubits_ordered) { rho = density_matrix(reversed_qubits); } else { MPS temp_MPS; temp_MPS.initialize(*this); reg_t actual_indices(num_qubits_); std::iota( std::begin(actual_indices), std::end(actual_indices), 0); temp_MPS.move_qubits_to_right_end(reversed_qubits, target_qubits, actual_indices); rho = temp_MPS.density_matrix(target_qubits); } // Trace(rho*M). not using methods for efficiency complex_t res = 0; for (uint_t i = 0; i < M.GetRows(); i++) for (uint_t j = 0; j < M.GetRows(); j++) res += M(i,j)*rho(j,i); return real(res); } //--------------------------------------------------------------- // Function: expectation_value_pauli // Algorithm: For more details, see "The density-matrix renormalization group in the age of matrix // product states" by Ulrich Schollwock. // For the illustration, assume computing the expectation // value on qubits numbered q0, q1, q2, q3. There may be additional qubits // before q0 or after q3 // Initial state: // q0 q1 q2 q3 // -a0-o--a1--o--a2--o--a3--o--- // | | | | // -a0-o--a1--o--a2--o--a3--o--- // // // We can actually think of this as q0 q1 q2 q3 // --o---o---o---o-- // | | | | | | // --o---o---o---o-- // because expectation value on the left and right are 1. // After Step 4: // q1 q2 q3 // a1/o--a2--o--a3--o-- // o | | | | // a1\o--a2--o--a3--o-- // // After step 8: // q1 q2 q3 // o--a2--o--a3--o-- // a1||i | | | // o--a2--o--a3--o-- // // After step 9: // q2 q3 // a2/o--a3--o-- // o | | | // a2\o--a3--o-- //--------------------------------------------------------------- complex_t MPS::expectation_value_pauli(const reg_t &qubits, const std::string &matrices) const { MPS temp_MPS; reg_t sorted_qubits = qubits; reg_t centralized_qubits = qubits; // if the qubits are not ordered, we can sort them, because the order doesn't matter // when computing the expectation value. We only have to sort the pauli matrices // to be in the same ordering as the qubits MPS_with_new_indices(qubits, sorted_qubits, centralized_qubits, temp_MPS); uint_t first_index = centralized_qubits.front(); uint_t last_index = centralized_qubits.back(); // Preliminary step - reverse the order of the matrices because // they are ordered in reverse to that of the qubits (in the interface) std::string reversed_matrices = matrices; reverse(reversed_matrices.begin(), reversed_matrices.end()); // sort the paulis according to the initial ordering of the qubits auto sorted_matrices = sort_paulis_by_qubits(reversed_matrices, qubits); char gate = sorted_matrices[0]; // Step 1 - multiply tensor of q0 by its left lambda MPS_Tensor left_tensor = temp_MPS.q_reg_[first_index]; if (first_index > 0) { left_tensor.mul_Gamma_by_left_Lambda(temp_MPS.lambda_reg_[first_index-1]); } // The last gamma must be multiplied also by its right lambda. // Here we handle the special case that we are calculating exp val // on a single qubit // we need to mul every gamma by its right lambda if (first_index==last_index && first_index < num_qubits_-1) { left_tensor.mul_Gamma_by_right_Lambda(temp_MPS.lambda_reg_[first_index]); } // Step 2 - prepare the dagger of left_tensor MPS_Tensor left_tensor_dagger(AER::Utils::dagger(left_tensor.get_data(0)), AER::Utils::dagger(left_tensor.get_data(1))); // Step 3 - Apply the gate to q0 left_tensor.apply_pauli(gate); // Step 4 - contract Gamma0' with Gamma0 over dimensions a0 and i // Before contraction, Gamma0' has size a1 x a0 x i, Gamma0 has size i x a0 x a1 // result = left_contract is a matrix of size a1 x a1 cmatrix_t final_contract; MPS_Tensor::contract_2_dimensions(left_tensor_dagger, left_tensor, omp_threads_, final_contract); for (uint_t qubit_num=first_index+1; qubit_num<=last_index; qubit_num++) { // Step 5 - multiply next Gamma by its left lambda (same as Step 1) // next gamma has dimensions a0 x a1 x i MPS_Tensor next_gamma = temp_MPS.q_reg_[qubit_num]; next_gamma.mul_Gamma_by_left_Lambda(temp_MPS.lambda_reg_[qubit_num-1]); // Last qubit must be multiplied by rightmost lambda if (qubit_num==last_index && qubit_num < num_qubits_-1) next_gamma.mul_Gamma_by_right_Lambda(temp_MPS.lambda_reg_[qubit_num]); // Step 6 - prepare the dagger of the next gamma (same as Step 2) // next_gamma_dagger has dimensions a1' x a0' x i MPS_Tensor next_gamma_dagger(AER::Utils::dagger(next_gamma.get_data(0)), AER::Utils::dagger(next_gamma.get_data(1))); // Step 7 - apply gate (same as Step 3) gate = sorted_matrices[qubit_num - first_index]; next_gamma.apply_pauli(gate); // Step 8 - contract final_contract from previous stage with next gamma over a1 // final_contract has dimensions a1 x a1, Gamma1 has dimensions a1 x a2 x i (where i=2) // result is a tensor of size a1 x a2 x i MPS_Tensor next_contract(final_contract * next_gamma.get_data(0), final_contract * next_gamma.get_data(1)); // Step 9 - contract next_contract (a1 x a2 x i) // with next_gamma_dagger (i x a2 x a1) (same as Step 4) // here we need to contract across two dimensions: a1 and i // result is a matrix of size a2 x a2 MPS_Tensor::contract_2_dimensions(next_gamma_dagger, next_contract, omp_threads_, final_contract); } // Step 10 - contract over final matrix of size aN x aN // We need to contract the final matrix with itself // Compute this by taking the trace of final_contract complex_t result = AER::Utils::trace(final_contract); return result; } std::ostream& MPS::print(std::ostream& out) const { for(uint_t i=0; i MPS::get_matrices_sizes() const { std::vector result; for(uint_t i=0; i omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t i = 0; i < static_cast(length); i++) { statevector[i] = mps_vec.get_data(reverse_bits(i, num_qubits_))(0,0); } #ifdef DEBUG std::cout << *this; #endif } void MPS::get_probabilities_vector(rvector_t& probvector, const reg_t &qubits) const { cvector_t state_vec; uint_t num_qubits = qubits.size(); uint_t length = 1ULL << num_qubits; // length = pow(2, num_qubits) probvector.resize(length); // compute the probability vector assuming the qubits are in ascending order rvector_t ordered_probvector = trace_of_density_matrix(qubits); // reorder the probabilities according to the specification in 'qubits' rvector_t temp_probvector(ordered_probvector.size()); reorder_all_qubits(ordered_probvector, qubits, temp_probvector); // reverse to be consistent with qasm ordering probvector = reverse_all_bits(temp_probvector, num_qubits); } reg_t MPS::apply_measure(const reg_t &qubits, RngEngine &rng) { reg_t qubits_to_update; reg_t outcome_vector; outcome_vector.resize(qubits.size()); for (uint_t i=0; i0; i--) { if (lambda_reg_[i-1].size() == 1) break; // no need to propagate if no entanglement apply_2_qubit_gate(i-1, i, id, cmatrix_t(1)); } return measurement; } void MPS::initialize_from_matrix(uint_t num_qubits, const cmatrix_t mat) { if (!q_reg_.empty()) q_reg_.clear(); if (!lambda_reg_.empty()) lambda_reg_.clear(); num_qubits_ = 0; // remaining_matrix is the matrix that remains after each iteration // It is initialized to the input statevector after reshaping cmatrix_t remaining_matrix, reshaped_matrix; cmatrix_t U, V; rvector_t S(1.0); bool first_iter = true; for (uint_t i=0; i left_data = reshape_U_after_SVD(U); MPS_Tensor left_gamma(left_data[0], left_data[1]); if (!first_iter) left_gamma.div_Gamma_by_left_Lambda(lambda_reg_.back()); q_reg_.push_back(left_gamma); lambda_reg_.push_back(S); num_qubits_++; first_iter = false; } // step 4 - create the rightmost gamma and update q_reg_ std::vector right_data = reshape_V_after_SVD(V); MPS_Tensor right_gamma(right_data[0], right_data[1]) ; q_reg_.push_back(right_gamma); num_qubits_++; } //------------------------------------------------------------------------- } // end namespace MPS //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- qiskit-aer-0.4.1/src/simulators/matrix_product_state/matrix_product_state_internal.hpp000066400000000000000000000432011362723322000316730ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_matrix_product_state_hpp_ #define _aer_matrix_product_state_hpp_ #include "framework/json.hpp" #include "framework/utils.hpp" #include "framework/operations.hpp" #include "matrix_product_state_tensor.hpp" namespace AER { namespace MatrixProductState { // Allowed gates enum class enum Gates { id, h, x, y, z, s, sdg, t, tdg, u1, u2, u3, // single qubit cx, cz, cu1, swap, su4, // two qubit mcx // three qubit }; enum class Direction {RIGHT, LEFT}; //========================================================================= // MPS class //========================================================================= // // The structure used to store the state is a vector of n Gamma-tensors // (each implemented by two matrices), // and n-1 Lambda tensors (each implemented by a single vector), // where n is the number of qubits in the circuit. // Qubit i is controlled by Gamma-tensor i and Lambda-tensors i and i+1, // for 0<=i<=n-1. // ------------------------------------------------------------------------- class MPS{ public: MPS(uint_t num_qubits = 0): num_qubits_(num_qubits) {} ~MPS() {} //-------------------------------------------------------------------------- // Function name: initialize // Description: Initialize the MPS with some state. // 1. Parameters: none. Initializes all qubits to |0>. // 2. Parameters: const MPS &other - Copy another MPS // TODO: // 3. Parameters: uint_t num_qubits, const cvector_t &vecState - // Initializes qubits with a statevector. // Returns: none. //---------------------------------------------------------------- virtual void initialize(uint_t num_qubits=0); void initialize(const MPS &other); //void initialize(uint_t num_qubits, const cvector_t &vecState); //---------------------------------------------------------------- // Function name: num_qubits // Description: Get the number of qubits in the MPS // Parameters: none. // Returns: none. //---------------------------------------------------------------- uint_t num_qubits() const{return num_qubits_;} //---------------------------------------------------------------- // Function name: set_num_qubits // Description: Set the number of qubits in the MPS // Parameters: size_t num_qubits - number of qubits to set. // Returns: none. //---------------------------------------------------------------- void set_num_qubits(uint_t num_qubits) { num_qubits_ = num_qubits; } bool empty() const { return(num_qubits_ == 0); } //---------------------------------------------------------------- // Function name: apply_x,y,z,... // Description: Apply a gate on some qubits by their indexes. // Parameters: uint_t index of the qubit/qubits. // Returns: none. //---------------------------------------------------------------- void apply_h(uint_t index); void apply_x(uint_t index){q_reg_[index].apply_x();} void apply_y(uint_t index){q_reg_[index].apply_y();} void apply_z(uint_t index){q_reg_[index].apply_z();} void apply_s(uint_t index){q_reg_[index].apply_s();} void apply_sdg(uint_t index){q_reg_[index].apply_sdg();} void apply_t(uint_t index){q_reg_[index].apply_t();} void apply_tdg(uint_t index){q_reg_[index].apply_tdg();} void apply_u1(uint_t index, double lambda); void apply_u2(uint_t index, double phi, double lambda); void apply_u3(uint_t index, double theta, double phi, double lambda); void apply_cnot(uint_t index_A, uint_t index_B); void apply_swap(uint_t index_A, uint_t index_B); void apply_cz(uint_t index_A, uint_t index_B); void apply_cu1(uint_t index_A, uint_t index_B, double lambda); void apply_2_qubit_gate(uint_t index_A, uint_t index_B, Gates gate_type, const cmatrix_t &mat); void apply_ccx(const reg_t &qubits); void apply_3_qubit_gate(const reg_t &qubits, Gates gate_type, const cmatrix_t &mat); void apply_matrix(const reg_t & qubits, const cmatrix_t &mat); void apply_matrix(const AER::reg_t &qubits, const cvector_t &vmat) { apply_diagonal_matrix(qubits, vmat); } // apply_matrix for more than 2 qubits void apply_multi_qubit_gate(const reg_t &qubits, const cmatrix_t &mat); // The following two are helper functions for apply_multi_qubit_gate void apply_unordered_multi_qubit_gate(const reg_t &qubits, const cmatrix_t &mat); void apply_matrix_to_target_qubits(const reg_t &target_qubits, const cmatrix_t &mat); void apply_diagonal_matrix(const AER::reg_t &qubits, const cvector_t &vmat); cmatrix_t density_matrix(const reg_t &qubits) const; rvector_t trace_of_density_matrix(const reg_t &qubits) const; //--------------------------------------------------------------- // Function: expectation_value // Description: Computes expectation value of the given qubits on the given matrix. // Parameters: The qubits for which we compute expectation value. // M - the matrix // Returns: The expectation value. //------------------------------------------------------------------ double expectation_value(const reg_t &qubits, const cmatrix_t &M) const; //--------------------------------------------------------------- // Function: expectation_value_pauli // Description: Computes expectation value of the given qubits on a string of Pauli matrices. // Parameters: The qubits for which we compute expectation value. // A string of matrices of the set {X, Y, Z, I}. The matrices are given in // reverse order relative to the qubits. // Returns: The expectation value in the form of a complex number. The real part is the // actual expectation value. //------------------------------------------------------------------ complex_t expectation_value_pauli(const reg_t &qubits, const std::string &matrices) const; //------------------------------------------------------------------ // Function name: MPS_with_new_indices // Description: Creates a copy of *this where the indices of the // selected qubits have been moved for more efficient computation // of the expectation value // Parameters: The qubits for which we compute expectation value. // Returns: temp_MPS - the new MPS after reordering the qubits // sorted_qubits - the qubits, after sorting // centralized_qubits - the qubits, after sorting and centralizing // //---------------------------------------------------------------- void MPS_with_new_indices(const reg_t &qubits, reg_t &sorted_qubits, reg_t ¢ralized_qubits, MPS& temp_MPS) const; //---------------------------------------------------------------- // Function name: print // Description: prints the MPS //---------------------------------------------------------------- virtual std::ostream& print(std::ostream& out) const; //---------------------------------------------------------------- // Function name: get_matrices_sizes // Description: returns the size of the inner matrices of the MPS //---------------------------------------------------------------- std::vector get_matrices_sizes() const; //---------------------------------------------------------------- // Function name: state_vec_as_MPS // Description: Computes the state vector of a subset of qubits. // The regular use is with for all qubits. in this case the output is // MPS_Tensor with a 2^n vector of 1X1 matrices. // If not used for all qubits, the result tensor will contain a // 2^(distance between edges) vector of matrices of some size. This // method is used for computing expectation value of a subset of qubits. // Parameters: none. // Returns: none. //---------------------------------------------------------------- MPS_Tensor state_vec_as_MPS(const reg_t &qubits) const; // This function computes the state vector for all the consecutive qubits // between first_index and last_index MPS_Tensor state_vec_as_MPS(uint_t first_index, uint_t last_index) const; void full_state_vector(cvector_t &state_vector) const; void get_probabilities_vector(rvector_t& probvector, const reg_t &qubits) const; static void set_omp_threads(uint_t threads) { if (threads > 0) omp_threads_ = threads; } static void set_omp_threshold(uint_t omp_qubit_threshold) { if (omp_qubit_threshold > 0) omp_threshold_ = omp_qubit_threshold; } static void set_json_chop_threshold(double json_chop_threshold) { json_chop_threshold_ = json_chop_threshold; } static void set_sample_measure_index_size(uint_t index_size){ sample_measure_index_size_ = index_size; } static void set_enable_gate_opt(bool enable_gate_opt) { enable_gate_opt_ = enable_gate_opt; } static uint_t get_omp_threads() { return omp_threads_; } static uint_t get_omp_threshold() { return omp_threshold_; } static double get_json_chop_threshold() { return json_chop_threshold_; } static uint_t get_sample_measure_index_size(){ return sample_measure_index_size_; } static bool get_enable_gate_opt() { return enable_gate_opt_; } // void store_measure(const AER::reg_t outcome, const AER::reg_t &cmemory, const AER::reg_t &cregister) const{ // cout << " store_measure not supported yet" < MPS::get_omp_threshold() && MPS::get_omp_threads() > 1) num_threads(MPS::get_omp_threads()) for (int_t i=0; i(state_vector.size()); i++) { statevector_as_matrix(0, i) = state_vector[i]; } initialize_from_matrix(num_qubits, statevector_as_matrix); } void initialize_from_matrix(uint_t num_qubits, cmatrix_t mat); protected: //---------------------------------------------------------------- // Function name: centralize_qubits // Description: Creates a new MPS where a subset of the qubits is // moved to be in consecutive positions. Used for // computations involving a subset of the qubits. // Parameters: Input: new_MPS - the MPS with the shifted qubits // qubits - the subset of qubits // Returns: new_first, new_last - new positions of the // first and last qubits respectively // ordered - are the qubits in ascending order // Returns: none. //---------------------------------------------------------------- void centralize_qubits(const reg_t &qubits, reg_t &new_qubits, bool &ordered); //---------------------------------------------------------------- // Function name: centralize_and_sort_qubits // Description: Similar to centralize_qubits, but also returns the sorted qubit vector //---------------------------------------------------------------- void centralize_and_sort_qubits(const reg_t &qubits, reg_t &sorted_indexes, reg_t ¢ralized_qubits, bool &ordered); //---------------------------------------------------------------- // Function name: find_centralized_indices // Description: Performs the first part of centralize_qubits, i.e., returns the // new target indices, but does not actually change the MPS structure. //---------------------------------------------------------------- void find_centralized_indices(const reg_t &qubits, reg_t &sorted_indices, reg_t ¢ralized_qubits, bool & ordered) const; //---------------------------------------------------------------- // Function name: move_qubits_to_centralized_indices // Description: Performs the second part of centralize_qubits, i.e., moves the // qubits to the centralized indices //---------------------------------------------------------------- void move_qubits_to_centralized_indices(const reg_t &sorted_indices, const reg_t ¢ralized_qubits); //---------------------------------------------------------------- // Function name: move_qubits_to_right_end // Description: This function moves qubits from the default (sorted) position // to the 'right_end', in the order specified in qubits. // right_end is defined as the position of the largest qubit i 'qubits', // because this will ensure we only move qubits to the right // Example: num_qubits_=8, 'qubits'= [5, 1, 2], then at the end of the function, // actual_indices=[0, 3, 4, 2, 1, 5, 6, 7], target_qubits=[3, 4, 5] // Parameters: Input: qubits - the qubits we wish to move // target_qubits - the new location of qubits // actual_indices - the final location of all the qubits in the MPS // Returns: right_end - the rightmost position of 'qubits'. //---------------------------------------------------------------- uint_t move_qubits_to_right_end(const reg_t &qubits, reg_t &target_qubits, reg_t &actual_indices); //---------------------------------------------------------------- // Function name: move_qubits_back_from_right_end // Description: This function moves qubits back to their original position after // move_qubits_to_right_end // Parameters: Input/output: qubits - the qubits we wish to move // actual_indices - the actual location of qubits, returned from // move_qubits_to_right_end, and updated here. // right_end - location of the rightmost qubit out // of 'qubits' // Returns: none. //---------------------------------------------------------------- void move_qubits_back_from_right_end(const reg_t &qubits, reg_t &actual_indices, uint_t right_end); //---------------------------------------------------------------- // Function name: move_qubits_to_original_location // Description: This function reverses the effect of centralize_qubits. // It returns the qubits that were previously centralized, to their original positions. // Parameters: Input: first - the index of the first qubit that was moved // original_qubits - the subset of qubits that were moved // sorted_qubits - the original_qubits in sorted order // Effect: the MPS (this) where the qubits have been moved back to their original // position. // Returns: none. //---------------------------------------------------------------- void move_qubits_to_original_location(uint_t first, const reg_t &original_qubits, const reg_t &sorted_qubits); //---------------------------------------------------------------- // Function name: change_position // Description: Move qubit from src to dst in the MPS. Used only // for expectation value calculations. Similar to swap, but doesn't // move qubit in dst back to src, therefore being used only on the temp MPS // in Expectation_value function. // Parameters: uint_t src, source of the qubit. // uint_t dst, destination of the qubit. // Returns: none. //---------------------------------------------------------------- void change_position(uint_t src, uint_t dst); uint_t num_qubits_; std::vector q_reg_; std::vector lambda_reg_; //----------------------------------------------------------------------- // Config settings //----------------------------------------------------------------------- static uint_t omp_threads_; // Disable multithreading by default static uint_t omp_threshold_; // Qubit threshold for multithreading when enabled static int sample_measure_index_size_; // Sample measure indexing qubit size static double json_chop_threshold_; // Threshold for choping small values // in JSON serialization static bool enable_gate_opt_; // allow optimizations on gates }; inline std::ostream &operator<<(std::ostream &out, const rvector_t &vec) { out << "["; uint_t size = vec.size(); for (uint_t i = 0; i < size-1; ++i) { out << vec[i]; out << ", "; } out << vec[size-1] << "]"; return out; } inline std::ostream& operator <<(std::ostream& out, const MPS& mps) { return mps.print(out); } //------------------------------------------------------------------------- } // end namespace MPS //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif /* _aer_matrix_product_state_hpp_ */ qiskit-aer-0.4.1/src/simulators/matrix_product_state/matrix_product_state_tensor.hpp000066400000000000000000000424141362723322000313760ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _tensor_tensor_hpp_ #define _tensor_tensor_hpp_ #define SQR_HALF sqrt(0.5) #define NUMBER_OF_PRINTED_DIGITS 3 #include #include #include #include #include #include #include #include "svd.hpp" #include "svd.cpp" #include "framework/matrix.hpp" #include "framework/utils.hpp" namespace AER { namespace MatrixProductState { //============================================================================ // MPS_Tensor class //============================================================================ // The MPS_Tensor class is used to represent the data structure of a single // Gamma-tensor (corresponding to a single qubit) in the MPS algorithm. // In the stable state, each MPS_Tensor consists of two matrices - // the matrix with index 0 (data_[0]) represents the amplitude of |0> and // the matrix with index 1 (data_[1]) represents the amplitude of |1>. // When applying a two-qubit gate, we temporarily create an MPS_Tensor of four matrices, // corresponding to |00>, |01>, |10>, |11>. // These are later decomposed back to the stable state of two matrices MPS_Tensor (per qubit). //---------------------------------------------------------------- class MPS_Tensor { public: // Constructors of MPS_Tensor class MPS_Tensor(){} explicit MPS_Tensor(complex_t& alpha, complex_t& beta){ // matrix A = matrix(1), B = matrix(1); cmatrix_t A = cmatrix_t(1), B = cmatrix_t(1); A(0,0) = alpha; B(0,0) = beta; data_.push_back(A); data_.push_back(B); } MPS_Tensor(const MPS_Tensor& rhs){ data_ = rhs.data_; } MPS_Tensor(const cmatrix_t& data0, const cmatrix_t& data1){ if (!data_.empty()) data_.clear(); data_.push_back(data0); data_.push_back(data1); } MPS_Tensor(const std::vector &data){ if (!data_.empty()) data_.clear(); for (uint_t i=0; i get_data() const { return data_; } void insert_data(uint_t a1, uint_t a2, cvector_t data); //------------------------------------------------------------------ // function name: get_dim // Description: Get the dimension of the physical index of the tensor // Parameters: none. // Returns: uint_t of the dimension of the physical index of the tensor. //------------------------------------------------------------------ uint_t get_dim() const { return data_.size(); } void apply_pauli(char gate); void apply_x(); void apply_y(); void apply_z(); void apply_h(); void apply_s(); void apply_sdg(); void apply_t(); void apply_tdg(); void apply_u1(double lambda); void apply_u2(double phi, double lambda); void apply_u3(double theta, double phi, double lambda); void apply_matrix(const cmatrix_t &mat, bool swapped=false); void apply_cnot(bool swapped = false); void apply_swap(); void apply_cz(); void apply_ccx(uint_t target_qubit); void mul_Gamma_by_left_Lambda(const rvector_t &Lambda); void mul_Gamma_by_right_Lambda(const rvector_t &Lambda); void div_Gamma_by_left_Lambda(const rvector_t &Lambda); void div_Gamma_by_right_Lambda(const rvector_t &Lambda); static MPS_Tensor contract(const MPS_Tensor &left_gamma, const rvector_t &lambda, const MPS_Tensor &right_gamma, bool mul_by_lambda); static void Decompose(MPS_Tensor &temp, MPS_Tensor &left_gamma, rvector_t &lambda, MPS_Tensor &right_gamma); static void reshape_for_3_qubits_before_SVD(const std::vector data, MPS_Tensor &reshaped_tensor); static void contract_2_dimensions(const MPS_Tensor &left_gamma, const MPS_Tensor &right_gamma, uint_t omp_threads, cmatrix_t &result); private: void mul_Gamma_by_Lambda(const rvector_t &Lambda, bool right, /* or left */ bool mul /* or div */); std::vector data_; }; //========================================================================= // Implementation //========================================================================= //--------------------------------------------------------------- // function name: print // Description: Prints the Tensor. All the submatrices are aligned by rows. //------------------------------------------------------------- std::ostream& MPS_Tensor::print(std::ostream& out) const { complex_t value; out << "[" << std::endl; if (data_.size() > 0){ //Printing the matrices row by row (i.e., not matrix by matrix) for (uint_t row = 0; row < data_[0].GetRows(); row++){ for(uint_t i = 0; i < data_.size(); i++) { out << " |"; for (uint_t column = 0; column < data_[0].GetColumns(); column++){ value = data_[i](row, column); out << "(" << std::fixed << std::setprecision(NUMBER_OF_PRINTED_DIGITS) << value.real() << ", "; out << std::fixed << std::setprecision(NUMBER_OF_PRINTED_DIGITS) << value.imag() << ")," ; } out << "| ,"; } out << std::endl; } } out << "]" << std::endl; return out; } //************************************************************** // function name: get_size // Description: get size of the matrices of the tensor. // Parameters: none. // Returns: reg_t of size 2, for rows and columns. //************************************************************** reg_t MPS_Tensor::get_size() const { reg_t result; result.push_back(data_[0].GetRows()); result.push_back(data_[0].GetColumns()); return result; } //---------------------------------------------------------------- // function name: get_data // Description: Get the data in some axis of the MPS_Tensor // 1. Parameters: uint_t a1, uint_t a2 - indexes of data in matrix // Returns: cvector_t of data in (a1,a2) in all matrices // 2. Parameters: uint_t i - index of a matrix in the MPS_Tensor // Returns: cmatrix_t of the data //--------------------------------------------------------------- cvector_t MPS_Tensor::get_data(uint_t a1, uint_t a2) const { cvector_t Res; for(uint_t i = 0; i < data_.size(); i++) Res.push_back(data_[i](a1,a2)); return Res; } //--------------------------------------------------------------- // function name: insert_data // Description: Insert data to some axis of the MPS_Tensor // Parameters: uint_t a1, uint_t a2 - indexes of data in matrix // Parameters: cvector_t data - data to insert. // Returns: void. //--------------------------------------------------------------- void MPS_Tensor::insert_data(uint_t a1, uint_t a2, cvector_t data) { for(uint_t i = 0; i < data_.size(); i++) data_[i](a1,a2) = data[i]; } void MPS_Tensor::apply_pauli(char gate) { switch (gate) { case 'X': apply_x(); break; case 'Y': apply_y(); break; case 'Z': apply_z(); break; case 'I': break; default: throw std::invalid_argument("illegal gate for contract_with_self"); } } //--------------------------------------------------------------- // function name: apply_x,y,z,... // Description: Apply some gate on the tensor. tensor must represent // the number of qubits the gate expect // Parameters: none. // Returns: none. //--------------------------------------------------------------- void MPS_Tensor::apply_x() { std::swap(data_[0],data_[1]); } void MPS_Tensor::apply_y() { data_[0] = data_[0] * complex_t(0, 1); data_[1] = data_[1] * complex_t(0, -1); std::swap(data_[0],data_[1]); } void MPS_Tensor::apply_z() { data_[1] = data_[1] * (-1.0); } void MPS_Tensor::apply_s() { data_[1] = data_[1] * complex_t(0, 1); } void MPS_Tensor::apply_sdg() { data_[1] = data_[1] * complex_t(0, -1); } void MPS_Tensor::apply_t() { data_[1] = data_[1] * complex_t(SQR_HALF, SQR_HALF); } void MPS_Tensor::apply_tdg() { data_[1] = data_[1] * complex_t(SQR_HALF, -SQR_HALF); } void MPS_Tensor::apply_matrix(const cmatrix_t &mat, bool swapped) { if (swapped) swap(data_[1], data_[2]); MPS_Tensor new_tensor; // initialize by multiplying first column of mat by data_[0] for (uint_t i=0; i 10) && (omp_threads > 1)) num_threads(omp_threads) #else #pragma omp parallel for collapse(2) if ((omp_limit > 10) && (omp_threads > 1)) num_threads(omp_threads) #endif for (int_t l_row=0; l_row 10) && (omp_threads > 1)) num_threads(omp_threads) #else #pragma omp parallel for collapse(2) if ((omp_limit > 10) && (omp_threads > 1)) num_threads(omp_threads) #endif for (int_t l_row=0; l_row C; C = reshape_before_SVD(temp.data_); matrix U,V; rvector_t S(std::min(C.GetRows(), C.GetColumns())); #ifdef DEBUG std::cout << "Input matrix before SVD =" << std::endl << C ; #endif csvd_wrapper(C, U, S, V); reduce_zeros(U, S, V); #ifdef DEBUG std::cout << "matrices after SVD:" < data) { // Turns 4 matrices A0,A1,A2,A3 to big matrix: // A0 A1 // A2 A3 cmatrix_t temp1 = AER::Utils::concatenate(data[0], data[1], 1), temp2 = AER::Utils::concatenate(data[2], data[3], 1); return AER::Utils::concatenate(temp1, temp2, 0); } std::vector reshape_U_after_SVD(const cmatrix_t U) { std::vector Res(2); AER::Utils::split(U, Res[0], Res[1], 0); return Res; } std::vector reshape_V_after_SVD(const cmatrix_t V) { std::vector Res(2); AER::Utils::split(AER::Utils::dagger(V), Res[0], Res[1] ,1); return Res; } //------------------------------------------------------------- // function name: num_of_SV // Description: Computes the number of none-zero singular values // in S // Parameters: rvector_t S - vector of singular values from the // SVD decomposition // Returns: number of elements in S that are greater than 0 // (actually greater than threshold) //------------------------------------------------------------- uint_t num_of_SV(rvector_t S, double threshold) { uint_t sum = 0; for(uint_t i = 0; i < S.size(); ++i) { if(std::norm(S[i]) > threshold) sum++; } if (sum == 0) std::cout << "SV_Num == 0"<< '\n'; return sum; } void reduce_zeros(cmatrix_t &U, rvector_t &S, cmatrix_t &V) { uint_t SV_num = num_of_SV(S, 1e-16); U.resize(U.GetRows(), SV_num); S.resize(SV_num); V.resize(V.GetRows(), SV_num); } // added cut-off at the end status csvd(cmatrix_t &A, cmatrix_t &U,rvector_t &S,cmatrix_t &V) { int m = A.GetRows(), n = A.GetColumns(), size = std::max(m,n); rvector_t b(size,0.0), c(size,0.0), t(size,0.0); double cs = 0.0, eps = 0.0, f = 0.0 ,g = 0.0, h = 0.0, sn = 0.0 , w = 0.0, x = 0.0, y = 0.0, z = 0.0; double eta = 1e-10, tol = 1.5e-34; // using int and not uint_t because uint_t caused bugs in loops with condition of >= 0 int i = 0, j = 0, k = 0, k1 = 0, l = 0, l1 = 0; complex_t q = 0; // Transpose when m < n bool transposed = false; if (m < n) { transposed = true; A = AER::Utils::dagger(A); std::swap(m,n); } cmatrix_t temp_A = A; c[0] = 0; while(true) { k1 = k + 1; z = 0.0; for( i = k; i < m; i++){ z = z + norm(A(i,k)); } b[k] = 0.0; if ( tol < z ) { z = std::sqrt( z ); b[k] = z; w = std::abs( A(k,k) ); if ( w == 0.0 ) { q = complex_t( 1.0, 0.0 ); } else { q = A(k,k) / w; } A(k,k) = q * ( z + w ); if ( k != n - 1 ) { for( j = k1; j < n ; j++) { q = complex_t( 0.0, 0.0 ); for( i = k; i < m; i++){ q = q + std::conj( A(i,k) ) * A(i,j); } q = q / ( z * ( z + w ) ); for( i = k; i < m; i++){ A(i,j) = A(i,j) - q * A(i,k); } } // // Phase transformation. // q = -std::conj(A(k,k))/std::abs(A(k,k)); for( j = k1; j < n; j++){ A(k,j) = q * A(k,j); } } } if ( k == n - 1 ) break; z = 0.0; for( j = k1; j < n; j++){ z = z + norm(A(k,j)); } c[k1] = 0.0; if ( tol < z ) { z = std::sqrt( z ); c[k1] = z; w = std::abs( A(k,k1) ); if ( w == 0.0 ){ q = complex_t( 1.0, 0.0 ); } else{ q = A(k,k1) / w; } A(k,k1) = q * ( z + w ); for( i = k1; i < m; i++) { q = complex_t( 0.0, 0.0 ); for( j = k1; j < n; j++){ q = q + std::conj( A(k,j) ) * A(i,j); } q = q / ( z * ( z + w ) ); for( j = k1; j < n; j++){ A(i,j) = A(i,j) - q * A(k,j); } } // // Phase transformation. // q = -std::conj(A(k,k1) )/std::abs(A(k,k1)); for( i = k1; i < m; i++){ A(i,k1) = A(i,k1) * q; } } k = k1; } eps = 0.0; for( k = 0; k < n; k++) { S[k] = b[k]; t[k] = c[k]; eps = std::max( eps, S[k] + t[k] ); } eps = eps * eta; // // Initialization of U and V. // U.initialize(m, m); V.initialize(n, n); for( j = 0; j < m; j++) { for( i = 0; i < m; i++){ U(i,j) = complex_t( 0.0, 0.0 ); } U(j,j) = complex_t( 1.0, 0.0 ); } for( j = 0; j < n; j++) { for( i = 0; i < n; i++){ V(i,j) = complex_t( 0.0, 0.0 ); } V(j,j) = complex_t( 1.0, 0.0 ); } for( k = n-1; k >= 0; k--) { while(true) { bool jump = false; for( l = k; l >= 0; l--) { if ( std::abs( t[l] ) < eps ) { jump = true; break; } else if ( std::abs( S[l-1] ) < eps ) { break; } } if(!jump) { cs = 0.0; sn = 1.0; l1 = l - 1; for( i = l; i <= k; i++) { f = sn * t[i]; t[i] = cs * t[i]; if ( std::abs(f) < eps ) { break; } h = S[i]; w = std::sqrt( f * f + h * h ); S[i] = w; cs = h / w; sn = - f / w; for( j = 0; j < n; j++) { x = std::real( U(j,l1) ); y = std::real( U(j,i) ); U(j,l1) = complex_t( x * cs + y * sn, 0.0 ); U(j,i) = complex_t( y * cs - x * sn, 0.0 ); } } } w = S[k]; if ( l == k ){ break; } x = S[l]; y = S[k-1]; g = t[k-1]; h = t[k]; f = ( ( y - w ) * ( y + w ) + ( g - h ) * ( g + h ) )/ ( 2.0 * h * y ); g = std::sqrt( f * f + 1.0 ); if ( f < -1.0e-13){ //if ( f < 0.0){ //didn't work when f was negative very close to 0 (because of numerical reasons) g = -g; } f = ( ( x - w ) * ( x + w ) + ( y / ( f + g ) - h ) * h ) / x; cs = 1.0; sn = 1.0; l1 = l + 1; for( i = l1; i <= k; i++) { g = t[i]; y = S[i]; h = sn * g; g = cs * g; w = std::sqrt( h * h + f * f ); if (w == 0) { #ifdef DEBUG std::cout << "ERROR 1: w is exactly 0: h = " << h << " , f = " << f << std::endl; std::cout << " w = " << w << std::endl; #endif } t[i-1] = w; cs = f / w; sn = h / w; f = x * cs + g * sn; // might be 0 long double large_f = 0; if (f==0) { #ifdef DEBUG std::cout << "f == 0 because " << "x = " << x << ", cs = " << cs << ", g = " << g << ", sn = " << sn < #include #include "framework/utils.hpp" #include "framework/types.hpp" namespace AER { // Data types using long_complex_t = std::complex; enum status {SUCCESS, FAILURE}; cmatrix_t reshape_before_SVD(std::vector data); std::vector reshape_U_after_SVD(cmatrix_t U); rvector_t reshape_S_after_SVD(rvector_t S); std::vector reshape_V_after_SVD(const cmatrix_t V); uint_t num_of_SV(rvector_t S, double threshold); void reduce_zeros(cmatrix_t &U, rvector_t &S, cmatrix_t &V); status csvd(cmatrix_t &C, cmatrix_t &U,rvector_t &S,cmatrix_t &V); void csvd_wrapper(cmatrix_t &C, cmatrix_t &U,rvector_t &S,cmatrix_t &V); } //namespace AER #endif /* SVD_HPP_ */ qiskit-aer-0.4.1/src/simulators/stabilizer/000077500000000000000000000000001362723322000207265ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/stabilizer/binary_vector.hpp000066400000000000000000000163571362723322000243210ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _binary_vector_hpp_ #define _binary_vector_hpp_ #include #include #include #include #include namespace BV { /******************************************************************************* * * BinaryVector Class * ******************************************************************************/ class BinaryVector { public: const static size_t BLOCK_SIZE = 64; BinaryVector() : m_length(0), m_data(0){}; explicit BinaryVector(uint64_t length) : m_length(length), m_data((length - 1) / BLOCK_SIZE + 1, ZERO_){}; BinaryVector(std::vector mdata) : m_length(mdata.size()), m_data(mdata){}; explicit BinaryVector(std::string); void setLength(uint64_t length); void setVector(std::string); void setValue(bool value, uint64_t pos); void set0(uint64_t pos) { setValue(ZERO_, pos); }; void set1(uint64_t pos) { setValue(ONE_, pos); }; void flipAt(uint64_t pos); BinaryVector &operator+=(const BinaryVector &rhs); bool operator[](const uint64_t pos) const; void swap(BinaryVector &rhs); uint64_t getLength() const { return m_length; }; void makeZero() { m_data.assign((m_length - 1) / BLOCK_SIZE + 1, ZERO_); } bool isZero() const; bool isSame(const BinaryVector &rhs) const; bool isSame(const BinaryVector &rhs, bool pad) const; std::vector nonzeroIndices() const; std::vector getData() const { return m_data; }; private: uint64_t m_length; std::vector m_data; static const uint64_t ZERO_; static const uint64_t ONE_; }; /******************************************************************************* * * Related Functions * ******************************************************************************/ inline bool operator==(const BinaryVector &lhs, const BinaryVector &rhs) { return lhs.isSame(rhs, true); } inline int64_t gauss_eliminate(std::vector &M, const int64_t start_col = 0) // returns the rank of M. // M[] has length nrows. // each M[i] must have the same length ncols. { const int64_t nrows = M.size(); const int64_t ncols = M.front().getLength(); int64_t rank = 0; int64_t k, r, i; for (k = start_col; k < ncols; k++) { i = -1; for (r = rank; r < nrows; r++) { if (M[r][k] == 0) continue; if (i == -1) { i = r; rank++; } else { M[r] += M[i]; } } if (i >= rank) { M[i].swap(M[rank - 1]); } } return rank; } inline std::vector string_to_bignum(std::string val, uint64_t blockSize, uint64_t base) { std::vector ret; if (blockSize * log2(base) > 64) { throw std::runtime_error( std::string("block size is greater than 64-bits for current case")); } auto n = val.size(); auto blocks = n / blockSize; auto tail = n % blockSize; for (uint64_t j = 0; j != blocks; ++j) ret.push_back( stoull(val.substr(n - (j + 1) * blockSize, blockSize), 0, blockSize)); if (tail > 0) ret.push_back(stoull(val.substr(0, tail), 0, blockSize)); return ret; } inline std::vector string_to_bignum(std::string val) { std::string type = val.substr(0, 2); if (type == "0b" || type == "0B") // Binary string return string_to_bignum(val.substr(2, val.size() - 2), 64, 2); else if (type == "0x" || type == "0X") // Hexidecimal string return string_to_bignum(val.substr(2, val.size() - 2), 16, 16); else { // Decimal string throw std::runtime_error( std::string("string must be binary (0b) or hex (0x)")); } } /******************************************************************************* * * BinaryVector Class Methods * ******************************************************************************/ const uint64_t BinaryVector::ZERO_ = 0ULL; const uint64_t BinaryVector::ONE_ = 1ULL; BinaryVector::BinaryVector(std::string val) { m_data = string_to_bignum(val); m_length = m_data.size(); } void BinaryVector::setLength(uint64_t length) { if (length == 0 || m_length > 0) return; m_length = length; m_data.assign((length - 1) / BLOCK_SIZE + 1, ZERO_); } void BinaryVector::setValue(bool value, uint64_t pos) { auto q = pos / BLOCK_SIZE; auto r = pos % BLOCK_SIZE; if (value) m_data[q] |= (ONE_ << r); else m_data[q] &= ~(ONE_ << r); } void BinaryVector::flipAt(const uint64_t pos) { auto q = pos / BLOCK_SIZE; auto r = pos % BLOCK_SIZE; m_data[q] ^= (ONE_ << r); } BinaryVector &BinaryVector::operator+=(const BinaryVector &rhs) { const auto size = m_data.size(); for (size_t i = 0; i < size; i++) m_data[i] ^= rhs.m_data[i]; return (*this); } bool BinaryVector::operator[](const uint64_t pos) const { auto q = pos / BLOCK_SIZE; auto r = pos % BLOCK_SIZE; return ((m_data[q] & (ONE_ << r)) != 0); } void BinaryVector::swap(BinaryVector &rhs) { uint64_t tmp; tmp = rhs.m_length; rhs.m_length = m_length; m_length = tmp; m_data.swap(rhs.m_data); } bool BinaryVector::isZero() const { const size_t size = m_data.size(); for (size_t i = 0; i < size; i++) if (m_data[i]) return false; return true; } bool BinaryVector::isSame(const BinaryVector &rhs) const { if (m_length != rhs.m_length) return false; const size_t size = m_data.size(); for (size_t q = 0; q < size; q++) { if (m_data[q] != rhs.m_data[q]) return false; } return true; } bool BinaryVector::isSame(const BinaryVector &rhs, bool pad) const { if (!pad) return isSame(rhs); const size_t sz0 = m_data.size(); const size_t sz1 = rhs.m_data.size(); const size_t sz = (sz0 > sz1) ? sz1 : sz0; // Check vectors agree on overlap for (size_t q = 0; q < sz; q++) if (m_data[q] != rhs.m_data[q]) return false; // Check padding of larger vector is trivial for (size_t q = sz; q < sz0; q++) if (m_data[q] != 0) return false; for (size_t q = sz; q < sz1; q++) if (rhs.m_data[q] != 0) return false; return true; } std::vector BinaryVector::nonzeroIndices() const { std::vector result; size_t i = 0; while (i < m_data.size()) { while (m_data[i] == 0) { i++; if (i == m_data.size()) return result; // empty } auto m = m_data[i]; size_t r = 0; while (r < BLOCK_SIZE) { while ((m & (ONE_ << r)) == 0) { r++; } if (r >= BLOCK_SIZE) break; result.push_back(static_cast((i * BLOCK_SIZE) + r)); r++; } i++; } return result; } //------------------------------------------------------------------------------ } // end namespace BV //------------------------------------------------------------------------------ #endifqiskit-aer-0.4.1/src/simulators/stabilizer/clifford.hpp000066400000000000000000000407211362723322000232330ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _clifford_hpp_ #define _clifford_hpp_ #include "pauli.hpp" namespace Clifford { /******************************************************************************* * * Clifford Class * ******************************************************************************/ class Clifford { public: using phase_t = int8_t; using phasevec_t = std::vector; //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- Clifford() = default; explicit Clifford(const uint64_t nqubit); //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Get number of qubits of the Clifford table uint64_t num_qubits() const {return num_qubits_;} // Return true if the number of qubits is 0 bool empty() const {return (num_qubits_ == 0);} // Return JSON serialization of QubitVector; json_t json() const; // Access stabilizer table Pauli::Pauli &operator[](uint64_t j) {return table_[j];} const Pauli::Pauli& operator[](uint64_t j) const {return table_[j];} // Return reference to internal Stabilizer table std::vector& table() {return table_;} const std::vector& table() const {return table_;} // Return reference to internal phases vector phasevec_t& phases() {return phases_;} const phasevec_t& phases() const {return phases_;} // Return n-th destabilizer from internal stabilizer table Pauli::Pauli &destabilizer(uint64_t n) {return table_[n];} const Pauli::Pauli& destabilizer(uint64_t n) const {return table_[n];} // Return n-th stabilizer from internal stabilizer table Pauli::Pauli &stabilizer(uint64_t n) {return table_[num_qubits_ + n];} const Pauli::Pauli& stabilizer(uint64_t n) const {return table_[num_qubits_ + n];} //----------------------------------------------------------------------- // Apply basic Clifford gates //----------------------------------------------------------------------- // Apply Controlled-NOT (CX) gate void append_cx(const uint64_t qubit_ctrl, const uint64_t qubit_trgt); // Apply Hadamard (H) gate void append_h(const uint64_t qubit); // Apply Phase (S, square root of Z) gate void append_s(const uint64_t qubit); // Apply Pauli::Pauli X gate void append_x(const uint64_t qubit); // Apply Pauli::Pauli Y gate void append_y(const uint64_t qubit); // Apply Pauli::Pauli Z gate void append_z(const uint64_t qubit); //----------------------------------------------------------------------- // Measurement //----------------------------------------------------------------------- // If we perform a single qubit Z measurement, // will the outcome be random or deterministic. bool is_deterministic_outcome(const uint64_t& qubit) const; // Return the outcome (0 or 1) of a single qubit Z measurement, and // update the stabilizer to the conditional (post measurement) state if // the outcome was random. bool measure_and_update(const uint64_t qubit, const uint64_t randint); // Return 1 or -1: the expectation value of observable Z on all // the qubits in the parameter `qubits` int64_t expectation_value(const std::vector& qubits); //----------------------------------------------------------------------- // Configuration settings //----------------------------------------------------------------------- // Set the threshold for chopping values to 0 in JSON void set_json_chop_threshold(double threshold); // Set the threshold for chopping values to 0 in JSON double get_json_chop_threshold() {return json_chop_threshold_;} // Set the maximum number of OpenMP thread for operations. void set_omp_threads(int n); // Get the maximum number of OpenMP thread for operations. uint64_t get_omp_threads() {return omp_threads_;} // Set the qubit threshold for activating OpenMP. // If self.qubits() > threshold OpenMP will be activated. void set_omp_threshold(int n); // Get the qubit threshold for activating OpenMP. uint64_t get_omp_threshold() {return omp_threshold_;} private: //----------------------------------------------------------------------- // Protected data members //----------------------------------------------------------------------- std::vector table_; phasevec_t phases_; uint64_t num_qubits_ = 0; //----------------------------------------------------------------------- // Config settings //----------------------------------------------------------------------- uint64_t omp_threads_ = 1; // Disable multithreading by default uint64_t omp_threshold_ = 1000; // Qubit threshold for multithreading when enabled double json_chop_threshold_ = 0; // Threshold for chopping small values // in JSON serialization //----------------------------------------------------------------------- // Helper functions //----------------------------------------------------------------------- // Check if there exists stabilizer or destabilizer row anticommuting // with Z[qubit]. If so return pair (true, row), else return (false, 0) std::pair z_anticommuting(const uint64_t qubit) const; // Check if there exists stabilizer or destabilizer row anticommuting // with X[qubit]. If so return pair (true, row), else return (false, 0) std::pair x_anticommuting(const uint64_t qubit) const; void rowsum_helper(const Pauli::Pauli &row, const phase_t row_phase, Pauli::Pauli &accum, phase_t &accum_phase) const; }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // Config settings //------------------------------------------------------------------------------ void Clifford::set_json_chop_threshold(double threshold) { json_chop_threshold_ = threshold; } void Clifford::set_omp_threads(int n) { if (n > 0) omp_threads_ = n; } void Clifford::set_omp_threshold(int n) { if (n > 0) omp_threshold_ = n; } //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ Clifford::Clifford(uint64_t nq) : num_qubits_(nq) { // initial state = all zeros // add destabilizers #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(nq); i++) { Pauli::Pauli P(nq); P.X.setValue(1, i); table_.push_back(P); } // add stabilizers #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(nq); i++) { Pauli::Pauli P(nq); P.Z.setValue(1, i); table_.push_back(P); } // Add phases phases_.resize(2 * nq); } //------------------------------------------------------------------------------ // Apply Clifford gates //------------------------------------------------------------------------------ void Clifford::append_cx(const uint64_t qcon, const uint64_t qtar) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(2 * num_qubits_); i++) { phases_[i] ^= (table_[i].X[qcon] && table_[i].Z[qtar] && (table_[i].X[qtar] ^ table_[i].Z[qcon] ^ 1)); table_[i].X.setValue(table_[i].X[qtar] ^ table_[i].X[qcon], qtar); table_[i].Z.setValue(table_[i].Z[qtar] ^ table_[i].Z[qcon], qcon); } } void Clifford::append_h(const uint64_t qubit) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(2 * num_qubits_); i++) { phases_[i] ^= (table_[i].X[qubit] && table_[i].Z[qubit]); // exchange X and Z bool b = table_[i].X[qubit]; table_[i].X.setValue(table_[i].Z[qubit], qubit); table_[i].Z.setValue(b, qubit); } } void Clifford::append_s(const uint64_t qubit) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(2 * num_qubits_); i++) { phases_[i] ^= (table_[i].X[qubit] && table_[i].Z[qubit]); table_[i].Z.setValue(table_[i].Z[qubit] ^ table_[i].X[qubit], qubit); } } void Clifford::append_x(const uint64_t qubit) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(2 * num_qubits_); i++) phases_[i] ^= table_[i].Z[qubit]; } void Clifford::append_y(const uint64_t qubit) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(2 * num_qubits_); i++) phases_[i] ^= (table_[i].Z[qubit] ^ table_[i].X[qubit]); } void Clifford::append_z(const uint64_t qubit) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int64_t i = 0; i < static_cast(2 * num_qubits_); i++) phases_[i] ^= table_[i].X[qubit]; } //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ std::pair Clifford::z_anticommuting(const uint64_t qubit) const { for (uint64_t p = num_qubits_; p < 2 * num_qubits_; p++) { if (table_[p].X[qubit]) return std::make_pair(true, p); } return std::make_pair(false, 0); } std::pair Clifford::x_anticommuting(const uint64_t qubit) const { for (uint64_t p = num_qubits_; p < 2 * num_qubits_; p++) { if (table_[p].Z[qubit]) return std::make_pair(true, p); } return std::make_pair(false, 0); } //------------------------------------------------------------------------------ // Measurement //------------------------------------------------------------------------------ bool Clifford::is_deterministic_outcome(const uint64_t& qubit) const { // Clifford state measurements only have three probabilities: // (p0, p1) = (0.5, 0.5), (1, 0), or (0, 1) // The random case happens if there is a row anti-commuting with Z[qubit] return !z_anticommuting(qubit).first; } bool Clifford::measure_and_update(const uint64_t qubit, const uint64_t randint) { // Clifford state measurements only have three probabilities: // (p0, p1) = (0.5, 0.5), (1, 0), or (0, 1) // The random case happens if there is a row anti-commuting with Z[qubit] auto anticom = z_anticommuting(qubit); if (anticom.first) { bool outcome = (randint == 1); auto row = anticom.second; for (uint64_t i = 0; i < 2 * num_qubits_; i++) { // the last condition is not in the AG paper but we seem to need it if ((table_[i].X[qubit]) && (i != row) && (i != (row - num_qubits_))) { rowsum_helper(table_[row], phases_[row], table_[i], phases_[i]); } } // Update state table_[row - num_qubits_].X = table_[row].X; table_[row - num_qubits_].Z = table_[row].Z; phases_[row - num_qubits_] = phases_[row]; table_[row].X.makeZero(); table_[row].Z.makeZero(); table_[row].Z.setValue(1, qubit); phases_[row] = outcome; return outcome; } else { // Deterministic outcome Pauli::Pauli accum(num_qubits_); phase_t outcome = 0; for (uint64_t i = 0; i < num_qubits_; i++) { if (table_[i].X[qubit]) { rowsum_helper(table_[i + num_qubits_], phases_[i + num_qubits_], accum, outcome); } } return outcome; } } int64_t Clifford::expectation_value(const std::vector& qubits) { // Check if there is a row that anti-commutes with an odd number of qubits // If so expectation value is 0 for (uint64_t p = num_qubits_; p < 2 * num_qubits_; p++) { uint64_t num_of_x = 0; for (auto qubit : qubits) { if (table_[p].X[qubit]) num_of_x ++; } if(num_of_x % 2 == 1) return 0; } // Otherwise the expectation value is +1 or -1 uint64_t sum_of_outcomes = 0; for (auto qubit : qubits) { Pauli::Pauli accum(num_qubits_); phase_t outcome = 0; for (uint64_t i = 0; i < num_qubits_; i++) { if (table_[i].X[qubit]) { rowsum_helper(table_[i + num_qubits_], phases_[i + num_qubits_], accum, outcome); } } sum_of_outcomes += outcome; } return (sum_of_outcomes % 2 == 0) ? 1 : -1; } void Clifford::rowsum_helper(const Pauli::Pauli &row, const phase_t row_phase, Pauli::Pauli &accum, phase_t &accum_phase) const { int8_t newr = ((2 * row_phase + 2 * accum_phase) + Pauli::Pauli::phase_exponent(row, accum)) % 4; // Since we are only using +1 and -1 phases in our Clifford phases // the exponent must be 0 (for +1) or 2 (for -1) if ((newr != 0) && (newr != 2)) { throw std::runtime_error("Clifford: rowsum error"); } accum_phase = (newr == 2); accum.X += row.X; accum.Z += row.Z; } //------------------------------------------------------------------------------ // JSON Serialization //------------------------------------------------------------------------------ json_t Clifford::json() const { json_t js = json_t::object(); // Add destabilizers json_t stab; for (size_t i = 0; i < num_qubits_; i++) { // Destabilizer std::string label = (phases_[i] == 0) ? "" : "-"; label += table_[i].str(); js["destabilizers"].push_back(label); // Stabilizer label = (phases_[num_qubits_ + i] == 0) ? "" : "-"; label += table_[num_qubits_ + i].str(); js["stabilizers"].push_back(label); } return js; } inline void to_json(json_t &js, const Clifford &clif) { js = clif.json(); } inline void from_json(const json_t &js, Clifford &clif) { bool has_keys = JSON::check_keys({"stabilizers", "destabilizers"}, js); if (!has_keys) throw std::invalid_argument("Invalid Clifford JSON."); const std::vector stab = js["stabilizers"]; const std::vector destab = js["destabilizers"]; const auto nq = stab.size(); if (nq != destab.size()) { throw std::invalid_argument("Invalid Clifford JSON: stabilizer and destabilizer lengths do not match."); } clif = Clifford(nq); for (size_t i = 0; i < nq; i++) { std::string label; // Get destabilizer label = destab[i]; switch (label[0]) { case '-': clif.phases()[i] = 1; clif.table()[i] = Pauli::Pauli(label.substr(1, nq)); break; case '+': clif.table()[i] = Pauli::Pauli(label.substr(1, nq)); break; case 'I': case 'X': case 'Y': case 'Z': clif.table()[i] = Pauli::Pauli(label); break; default: throw std::invalid_argument("Invalid Stabilizer JSON string."); } // Get stabilizer label = stab[i]; switch (label[0]) { case '-': clif.phases()[i + nq] = 1; clif.table()[i + nq] = Pauli::Pauli(label.substr(1, nq)); break; case '+': clif.table()[i + nq] = Pauli::Pauli(label.substr(1, nq)); break; case 'I': case 'X': case 'Y': case 'Z': clif.table()[i + nq] = Pauli::Pauli(label); break; default: throw std::invalid_argument("Invalid Stabilizer JSON string."); } } } //------------------------------------------------------------------------------ } // end namespace Clifford //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template std::ostream &operator<<(std::ostream &out, const Clifford::Clifford &clif) { out << clif.json().dump(); return out; } //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/simulators/stabilizer/pauli.hpp000066400000000000000000000072611362723322000225570ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _pauli_hpp_ #define _pauli_hpp_ #include #include "binary_vector.hpp" namespace Pauli { /******************************************************************************* * * Pauli Class * ******************************************************************************/ class Pauli { public: // Symplectic binary vectors BV::BinaryVector X; BV::BinaryVector Z; // Construct an empty pauli Pauli() : X(0), Z(0) {}; // Construct an n-qubit identity Pauli explicit Pauli(uint64_t len) : X(len), Z(len) {}; // Construct an n-qubit Pauli from a string label; explicit Pauli(const std::string &label); // Return the string representation of the Pauli std::string str() const; // exponent g of i such that P(x1,z1) P(x2,z2) = i^g P(x1+x2,z1+z2) static int8_t phase_exponent(const Pauli& pauli1, const Pauli& pauli2); }; /******************************************************************************* * * Implementations * ******************************************************************************/ Pauli::Pauli(const std::string &label) { const auto num_qubits = label.size(); X = BV::BinaryVector(num_qubits); Z = BV::BinaryVector(num_qubits); // The label corresponds to tensor product order // So the first element of label is the last qubit and vice versa for (size_t i =0; i < num_qubits; i++) { const auto qubit_i = num_qubits - 1 - i; switch (label[i]) { case 'I': break; case 'X': X.set1(qubit_i); break; case 'Y': X.set1(qubit_i); Z.set1(qubit_i); break; case 'Z': Z.set1(qubit_i); break; default: throw std::invalid_argument("Invalid Pauli label"); } } } std::string Pauli::str() const { // Check X and Z are same length const auto num_qubits = X.getLength(); if (Z.getLength() != num_qubits) throw std::runtime_error("Pauli::str X and Z vectors are different length."); std::string label; for (size_t i =0; i < num_qubits; i++) { const auto qubit_i = num_qubits - 1 - i; if (!X[qubit_i] && !Z[qubit_i]) label.push_back('I'); else if (X[qubit_i] && !Z[qubit_i]) label.push_back('X'); else if (X[qubit_i] && Z[qubit_i]) label.push_back('Y'); else if (!X[qubit_i] && Z[qubit_i]) label.push_back('Z'); } return label; } int8_t Pauli::phase_exponent(const Pauli& pauli1, const Pauli& pauli2) { int8_t exponent = 0; for (size_t q = 0; q < pauli1.X.getLength(); q++) { exponent += pauli2.X[q] * pauli1.Z[q] * (1 + 2 * pauli2.Z[q] + 2 * pauli1.X[q]); exponent -= pauli1.X[q] * pauli2.Z[q] * (1 + 2 * pauli1.Z[q] + 2 * pauli2.X[q]); exponent %= 4; } if (exponent < 0) exponent += 4; return exponent; } //------------------------------------------------------------------------------ } // end namespace Pauli //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const Pauli::Pauli &pauli) { out << pauli.str(); return out; } //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/simulators/stabilizer/stabilizer_state.hpp000066400000000000000000000541251362723322000250160ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_stabilizer_state_hpp #define _aer_stabilizer_state_hpp #include "framework/utils.hpp" #include "framework/json.hpp" #include "simulators/state.hpp" #include "clifford.hpp" namespace AER { namespace Stabilizer { //============================================================================ // Stabilizer state gates //============================================================================ enum class Gates {id, x, y, z, h, s, sdg, cx, cz, swap}; // Allowed snapshots enum class enum class Snapshots { stabilizer, cmemory, cregister, probs, probs_var, expval_pauli, expval_pauli_var, expval_pauli_shot }; // Enum class for different types of expectation values enum class SnapshotDataType {average, average_var, pershot}; //============================================================================ // Stabilizer Table state class //============================================================================ class State : public Base::State { public: using BaseState = Base::State; State() = default; virtual ~State() = default; //----------------------------------------------------------------------- // Base class overrides //----------------------------------------------------------------------- // Return the string name of the State class virtual std::string name() const override {return "stabilizer";} // Return the set of qobj instruction types supported by the State virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t({ Operations::OpType::gate, Operations::OpType::measure, Operations::OpType::reset, Operations::OpType::snapshot, Operations::OpType::barrier, Operations::OpType::bfunc, Operations::OpType::roerror }); } // Return the set of qobj gate instruction names supported by the State virtual stringset_t allowed_gates() const override { return {"CX", "cx", "cz", "swap", "id", "x", "y", "z", "h", "s", "sdg"}; } // Return the set of qobj snapshot types supported by the State virtual stringset_t allowed_snapshots() const override { return {"stabilizer", "memory", "register", "probabilities", "probabilities_with_variance", "expectation_value_pauli", "expectation_value_pauli_with_variance", "expectation_value_pauli_single_shot" }; } // Apply a sequence of operations by looping over list // If the input is not in allowed_ops an exeption will be raised. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; // Initializes an n-qubit state to the all |0> state virtual void initialize_qreg(uint_t num_qubits) override; // Initializes to a specific n-qubit state virtual void initialize_qreg(uint_t num_qubits, const Clifford::Clifford &state) override; // TODO: currently returns 0 // Returns the required memory for storing an n-qubit state in megabytes. virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const override; // Load any settings for the State class from a config JSON virtual void set_config(const json_t &config) override; // Sample n-measurement outcomes without applying the measure operation // to the system state virtual std::vector sample_measure(const reg_t& qubits, uint_t shots, RngEngine &rng) override; protected: //----------------------------------------------------------------------- // Apply instructions //----------------------------------------------------------------------- // Applies a sypported Gate operation to the state class. // If the input is not in allowed_gates an exeption will be raised. void apply_gate(const Operations::Op &op); // Measure qubits and return a list of outcomes [q0, q1, ...] // If a state subclass supports this function then "measure" // should be contained in the set returned by the 'allowed_ops' // method. virtual void apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng); // Reset the specified qubits to the |0> state by simulating // a measurement, applying a conditional x-gate if the outcome is 1, and // then discarding the outcome. void apply_reset(const reg_t &qubits, RngEngine &rng); // Apply a supported snapshot instruction // If the input is not in allowed_snapshots an exeption will be raised. virtual void apply_snapshot(const Operations::Op &op, ExperimentData &data); //----------------------------------------------------------------------- // Measurement Helpers //----------------------------------------------------------------------- // Implement a measurement on all specified qubits and return the outcome reg_t apply_measure_and_update(const reg_t &qubits, RngEngine &rng); //----------------------------------------------------------------------- // Special snapshot types // // IMPORTANT: These methods are not marked const to allow modifying state // during snapshot, but after the snapshot is applied the simulator // should be left in the pre-snapshot state. //----------------------------------------------------------------------- // Snapshot the stabilizer state of the simulator. // This returns a list of stabilizer generators void snapshot_stabilizer(const Operations::Op &op, ExperimentData &data); // Snapshot current qubit probabilities for a measurement (average) void snapshot_probabilities(const Operations::Op &op, ExperimentData &data, bool variance); void snapshot_probabilities_auxiliary(const reg_t& qubits, std::string outcome, double outcome_prob, stringmap_t& probs); // Snapshot the expectation value of a Pauli operator void snapshot_pauli_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); //----------------------------------------------------------------------- // Config Settings //----------------------------------------------------------------------- // Set maximum number of qubits for which snapshot // probabilities can be implemented size_t max_qubits_snapshot_probs_ = 32; // Threshold for chopping small values to zero in JSON double json_chop_threshold_ = 1e-10; // Table of allowed gate names to gate enum class members const static stringmap_t gateset_; // Table of allowed snapshot types to enum class members const static stringmap_t snapshotset_; }; //============================================================================ // Implementation: Allowed ops and gateset //============================================================================ const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::x}, // Pauli-X gate {"y", Gates::y}, // Pauli-Y gate {"z", Gates::z}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) // Two-qubit gates {"CX", Gates::cx}, // Controlled-X gate (CNOT) {"cx", Gates::cx}, // Controlled-X gate (CNOT), {"cz", Gates::cz}, // Controlled-Z gate {"swap", Gates::swap} // SWAP gate }); const stringmap_t State::snapshotset_({ {"stabilizer", Snapshots::stabilizer}, {"memory", Snapshots::cmemory}, {"register", Snapshots::cregister}, {"probabilities", Snapshots::probs}, {"probabilities_with_variance", Snapshots::probs_var}, {"expectation_value_pauli", Snapshots::expval_pauli}, {"expectation_value_pauli_with_variance", Snapshots::expval_pauli_var}, {"expectation_value_pauli_single_shot", Snapshots::expval_pauli_shot} }); //============================================================================ // Implementation: Base class method overrides //============================================================================ //------------------------------------------------------------------------- // Initialization //------------------------------------------------------------------------- void State::initialize_qreg(uint_t num_qubits) { BaseState::qreg_ = Clifford::Clifford(num_qubits); } void State::initialize_qreg(uint_t num_qubits, const Clifford::Clifford &state) { // Check dimension of state if (state.num_qubits() != num_qubits) { throw std::invalid_argument("Stabilizer::State::initialize: initial state does not match qubit number"); } BaseState::qreg_ = state; } //------------------------------------------------------------------------- // Utility //------------------------------------------------------------------------- size_t State::required_memory_mb(uint_t num_qubits, const std::vector &ops) const { (void)ops; // avoid unused variable compiler warning // The Clifford object requires very little memory. // A Pauli vector consists of 2 binary vectors each with // Binary vector = (4 + n // 64) 64-bit ints // Pauli = 2 * binary vector size_t mem = 16 * (4 + num_qubits); // Pauli bytes // Clifford = 2n * Pauli + 2n phase ints mem = 2 * num_qubits * (mem + 16); // Clifford bytes mem = mem >> 20; // Clifford mb return mem; } void State::set_config(const json_t &config) { // Set threshold for truncating snapshots JSON::get_value(json_chop_threshold_, "zero_threshold", config); // Load max snapshot qubit size and set hard limit of 64 qubits. JSON::get_value(max_qubits_snapshot_probs_, "stabilizer_max_snapshot_probabilities", config); max_qubits_snapshot_probs_ = std::max(max_qubits_snapshot_probs_, 64); } //========================================================================= // Implementation: apply operations //========================================================================= void State::apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) { // Simple loop over vector of input operations for (const auto op: ops) { if(BaseState::creg_.check_conditional(op)) { switch (op.type) { case Operations::OpType::barrier: break; case Operations::OpType::reset: apply_reset(op.qubits, rng); break; case Operations::OpType::measure: apply_measure(op.qubits, op.memory, op.registers, rng); break; case Operations::OpType::bfunc: BaseState::creg_.apply_bfunc(op); break; case Operations::OpType::roerror: BaseState::creg_.apply_roerror(op, rng); break; case Operations::OpType::gate: apply_gate(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data); break; default: throw std::invalid_argument("Stabilizer::State::invalid instruction \'" + op.name + "\'."); } } } } void State::apply_gate(const Operations::Op &op) { // Check Op is supported by State auto it = gateset_.find(op.name); if (it == gateset_.end()) throw std::invalid_argument("Stabilizer::State::invalid gate instruction \'" + op.name + "\'."); switch (it -> second) { case Gates::id: break; case Gates::x: BaseState::qreg_.append_x(op.qubits[0]); break; case Gates::y: BaseState::qreg_.append_y(op.qubits[0]); break; case Gates::z: BaseState::qreg_.append_z(op.qubits[0]); break; case Gates::h: BaseState::qreg_.append_h(op.qubits[0]); break; case Gates::s: BaseState::qreg_.append_s(op.qubits[0]); break; case Gates::sdg: BaseState::qreg_.append_z(op.qubits[0]); BaseState::qreg_.append_s(op.qubits[0]); break; case Gates::cx: BaseState::qreg_.append_cx(op.qubits[0], op.qubits[1]); break; case Gates::cz: BaseState::qreg_.append_h(op.qubits[1]); BaseState::qreg_.append_cx(op.qubits[0], op.qubits[1]); BaseState::qreg_.append_h(op.qubits[1]); break; case Gates::swap: BaseState::qreg_.append_cx(op.qubits[0], op.qubits[1]); BaseState::qreg_.append_cx(op.qubits[1], op.qubits[0]); BaseState::qreg_.append_cx(op.qubits[0], op.qubits[1]); break; default: // We shouldn't reach here unless there is a bug in gateset throw std::invalid_argument("Stabilizer::State::invalid gate instruction \'" + op.name + "\'."); } } //========================================================================= // Implementation: Reset and Measurement Sampling //========================================================================= void State::apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng) { // Apply measurement and get classical outcome reg_t outcome = apply_measure_and_update(qubits, rng); // Add measurement outcome to creg BaseState::creg_.store_measure(outcome, cmemory, cregister); } void State::apply_reset(const reg_t &qubits, RngEngine &rng) { // Apply measurement and get classical outcome reg_t outcome = apply_measure_and_update(qubits, rng); // Use the outcome to apply X gate to any qubits left in the // |1> state after measure, then discard outcome. for (size_t j=0; j < qubits.size(); j++) { if (outcome[j] == 1) { qreg_.append_x(qubits[j]); } } } reg_t State::apply_measure_and_update(const reg_t &qubits, RngEngine &rng) { // Measurement outcome probabilities in the clifford // table are either deterministic or random. // We generate the distribution for the random case // which is used to generate the random integer // needed by the measure function. const rvector_t dist = {0.5, 0.5}; reg_t outcome; // Measure each qubit for (const auto q : qubits) { uint_t r = rng.rand_int(dist); outcome.push_back(qreg_.measure_and_update(q, r)); } return outcome; } std::vector State::sample_measure(const reg_t &qubits, uint_t shots, RngEngine &rng) { // TODO: see if we can improve efficiency by directly sampling from Clifford table auto qreg_cache = BaseState::qreg_; std::vector samples; samples.reserve(shots); while (shots-- > 0) { // loop over shots samples.push_back(apply_measure_and_update(qubits, rng)); BaseState::qreg_ = qreg_cache; // restore pre-measurement data from cache } return samples; } //========================================================================= // Implementation: Snapshots //========================================================================= void State::apply_snapshot(const Operations::Op &op, ExperimentData &data) { // Look for snapshot type in snapshotset auto it = snapshotset_.find(op.name); if (it == snapshotset_.end()) throw std::invalid_argument("Stabilizer::State::invalid snapshot instruction \'" + op.name + "\'."); switch (it->second) { case Snapshots::stabilizer: snapshot_stabilizer(op, data); break; case Snapshots::cmemory: BaseState::snapshot_creg_memory(op, data); break; case Snapshots::cregister: BaseState::snapshot_creg_register(op, data); break; case Snapshots::probs: { snapshot_probabilities(op, data, false); } break; case Snapshots::probs_var: { snapshot_probabilities(op, data, true); } break; case Snapshots::expval_pauli: { snapshot_pauli_expval(op, data, SnapshotDataType::average); } break; case Snapshots::expval_pauli_var: { snapshot_pauli_expval(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_pauli_shot: { snapshot_pauli_expval(op, data, SnapshotDataType::pershot); } break; default: // We shouldn't get here unless there is a bug in the snapshotset throw std::invalid_argument("Stabilizer::State::invalid snapshot instruction \'" + op.name + "\'."); } } void State::snapshot_stabilizer(const Operations::Op &op, ExperimentData &data) { // We don't want to snapshot the full Clifford table, only the // stabilizer part. First Convert simulator clifford table to JSON json_t clifford = BaseState::qreg_; // Then extract the stabilizer generator list data.add_pershot_snapshot("stabilizer", op.string_params[0], clifford["stabilizers"]); } void State::snapshot_probabilities(const Operations::Op &op, ExperimentData &data, bool variance) { // Check number of qubits being measured is less than 64. // otherwise we cant use 64-bit int logic. // Practical limits are much lower. For example: // A 32-qubit probability vector takes approx 16 GB of memory // to store. const size_t num_qubits = op.qubits.size(); if (num_qubits > max_qubits_snapshot_probs_) { std::string msg = "Stabilizer::State::snapshot_probabilities: " "cannot return measure probabilities for " + std::to_string(num_qubits) + "-qubit measurement. Maximum is set to " + std::to_string(max_qubits_snapshot_probs_); throw std::runtime_error(msg); } stringmap_t probs; snapshot_probabilities_auxiliary(op.qubits, std::string(op.qubits.size(), 'X'), 1, probs); // Add snapshot to data data.add_average_snapshot("probabilities", op.string_params[0], BaseState::creg_.memory_hex(), probs, variance); } void State::snapshot_probabilities_auxiliary(const reg_t& qubits, std::string outcome, double outcome_prob, stringmap_t& probs) { uint_t qubit_for_branching = -1; for(uint_t i=0; i measured_qubits; for (uint_t pos=0; pos < op.qubits.size(); ++pos) { uint_t qubit = op.qubits[pos]; switch (pauli[pauli.size() - 1 - pos]) { case 'I': break; case 'X': BaseState::qreg_.append_h(qubit); measured_qubits.push_back(qubit); break; case 'Y': BaseState::qreg_.append_s(qubit); BaseState::qreg_.append_z(qubit); measured_qubits.push_back(qubit); break; case 'Z': measured_qubits.push_back(qubit); break; default: { std::stringstream msg; msg << "QubitVectorState::invalid Pauli string \'" << pauli[pos] << "\'."; throw std::invalid_argument(msg.str()); } } } expval += coeff * (double)BaseState::qreg_.expectation_value(measured_qubits); BaseState::qreg_ = copy_of_qreg; } // add to snapshot Utils::chop_inplace(expval, json_chop_threshold_); switch (type) { case SnapshotDataType::average: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, false); break; case SnapshotDataType::average_var: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, true); break; case SnapshotDataType::pershot: data.add_pershot_snapshot("expectation_values", op.string_params[0], expval); break; } } //------------------------------------------------------------------------------ } // end namespace Stabilizer //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/simulators/state.hpp000066400000000000000000000311501362723322000204070ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_base_state_hpp_ #define _aer_base_state_hpp_ #include "framework/json.hpp" #include "framework/operations.hpp" #include "framework/types.hpp" #include "framework/creg.hpp" #include "framework/results/experiment_data.hpp" namespace AER { namespace Base { //========================================================================= // State interface base class for Qiskit-Aer //========================================================================= template class State { public: using ignore_argument = void; State() = default; virtual ~State() = default; //======================================================================= // Subclass Override Methods // // The following methods should be implemented by any State subclasses. // Abstract methods are required, while some methods are optional for // State classes that support measurement to be compatible with a general // QasmController. //======================================================================= //----------------------------------------------------------------------- // Abstract methods // // The implementation of these methods must be defined in all subclasses //----------------------------------------------------------------------- // Return a string name for the State type virtual std::string name() const = 0; // Return the set of qobj instruction types supported by the State // by the Operations::OpType enum class. // Standard OpTypes that can be included here are: // - `OpType::gate` if gates are supported // - `OpType::measure` if measure is supported // - `OpType::reset` if reset is supported // - `OpType::snapshot` if any snapshots are supported // - `OpType::barrier` if barrier is supported // - `OpType::matrix` if arbitrary unitary matrices are supported // - `OpType::kraus` if general Kraus noise channels are supported // For the case of gates the specific allowed gates are checked // with the `allowed_gates` function. virtual Operations::OpSet::optypeset_t allowed_ops() const = 0; // Return the set of qobj gate instruction names supported by the state class // For example this could include {"u1", "u2", "u3", "U", "cx", "CX"} virtual stringset_t allowed_gates() const = 0; // Return the set of qobj gate instruction names supported by the state class // For example this could include {"probabilities", "pauli_observable"} virtual stringset_t allowed_snapshots() const = 0; // Apply a sequence of operations to the current state of the State class. // It is up to the State subclass to decide how this sequence should be // executed (ie in sequence, or some other execution strategy.) // If this sequence contains operations not in allowed_operations // an exeption will be thrown. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) = 0; // Initializes the State to the default state. // Typically this is the n-qubit all |0> state virtual void initialize_qreg(uint_t num_qubits) = 0; // Initializes the State to a specific state. virtual void initialize_qreg(uint_t num_qubits, const state_t &state) = 0; // Return an estimate of the required memory for implementing the // specified sequence of operations on a `num_qubit` sized State. virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const = 0; //----------------------------------------------------------------------- // Optional: Load config settings //----------------------------------------------------------------------- // Load any settings for the State class from a config JSON virtual void set_config(const json_t &config); //----------------------------------------------------------------------- // Optional: measurement sampling // // This method is only required for a State subclass to be compatible with // the measurement sampling optimization of a general the QasmController //----------------------------------------------------------------------- // Sample n-measurement outcomes without applying the measure operation // to the system state. Even though this method is not marked as const // at the end of sample the system should be left in the same state // as before sampling virtual std::vector sample_measure(const reg_t &qubits, uint_t shots, RngEngine &rng); //======================================================================= // Standard Methods // // Typically these methods do not need to be modified for a State // subclass, but can be should it be necessary. //======================================================================= //----------------------------------------------------------------------- // OpSet validation //----------------------------------------------------------------------- // Return false if an OpSet contains unsupported instruction for // the state class. Otherwise return true. virtual bool validate_opset(const Operations::OpSet& opset) const; // Raise an exeption if the OpSet contains unsupported // instructions for the state class. The exception message // contains the name of the unsupported instructions. virtual std::string invalid_opset_message(const Operations::OpSet& opset) const; //======================================================================= // Standard non-virtual methods // // These methods should not be modified in any State subclasses //======================================================================= //----------------------------------------------------------------------- // ClassicalRegister methods //----------------------------------------------------------------------- // Initialize classical memory and register to default value (all-0) void initialize_creg(uint_t num_memory, uint_t num_register); // Initialize classical memory and register to specific values void initialize_creg(uint_t num_memory, uint_t num_register, const std::string &memory_hex, const std::string ®ister_hex); // Add current creg classical bit values to a ExperimentData container void add_creg_to_data(ExperimentData &data) const; //----------------------------------------------------------------------- // Standard snapshots //----------------------------------------------------------------------- // Snapshot the current statevector (single-shot) // if type_label is the empty string the operation type will be used for the type void snapshot_state(const Operations::Op &op, ExperimentData &data, std::string name = "") const; // Snapshot the classical memory bits state (single-shot) void snapshot_creg_memory(const Operations::Op &op, ExperimentData &data, std::string name = "memory") const; // Snapshot the classical register bits state (single-shot) void snapshot_creg_register(const Operations::Op &op, ExperimentData &data, std::string name = "register") const; //----------------------------------------------------------------------- // OpenMP thread settings //----------------------------------------------------------------------- // Sets the number of threads available to the State implementation // If negative there is no restriction on the backend inline void set_parallalization(int n) {threads_ = n;} //----------------------------------------------------------------------- // Data accessors //----------------------------------------------------------------------- // Returns a const reference to the states data structure inline const state_t &qreg() const {return qreg_;} inline const auto &creg() const {return creg_;} protected: // The quantum state data structure state_t qreg_; // Classical register data ClassicalRegister creg_; // Maximum threads which may be used by the backend for OpenMP multithreading // Default value is single-threaded unless overridden int threads_ = 1; }; //========================================================================= // Implementations //========================================================================= template void State::set_config(const json_t &config) { (ignore_argument)config; } template std::vector State::sample_measure(const reg_t &qubits, uint_t shots, RngEngine &rng) { (ignore_argument)qubits; (ignore_argument)shots; return std::vector(); } template bool State::validate_opset(const Operations::OpSet &opset) const { return opset.validate(allowed_ops(), allowed_gates(), allowed_snapshots()); } template std::string State::invalid_opset_message(const Operations::OpSet &opset) const { // Check operations are allowed auto invalid_optypes = opset.invalid_optypes(allowed_ops()); auto invalid_gates = opset.invalid_gates(allowed_gates()); auto invalid_snapshots = opset.invalid_snapshots(allowed_snapshots()); bool bad_instr = !invalid_optypes.empty(); bool bad_gates = !invalid_gates.empty(); bool bad_snaps = !invalid_snapshots.empty(); std::stringstream ss; if (bad_gates) ss << " invalid gate instructions: " << invalid_gates; if (bad_snaps) ss << " invalid snapshot instructions: " << invalid_snapshots; // We can't print OpTypes so we add a note if there are invalid // instructions other than gates or snapshots if (bad_instr && (!bad_gates && !bad_snaps)) ss << " invalid non gate or snapshot instructions in opset {" << opset << "}"; ss << " for " << name() << " method"; return ss.str(); } template void State::initialize_creg(uint_t num_memory, uint_t num_register) { creg_.initialize(num_memory, num_register); } template void State::initialize_creg(uint_t num_memory, uint_t num_register, const std::string &memory_hex, const std::string ®ister_hex) { creg_.initialize(num_memory, num_register, memory_hex, register_hex); } template void State::snapshot_state(const Operations::Op &op, ExperimentData &data, std::string name) const { name = (name.empty()) ? op.name : name; data.add_pershot_snapshot(name, op.string_params[0], qreg_); } template void State::snapshot_creg_memory(const Operations::Op &op, ExperimentData &data, std::string name) const { data.add_pershot_snapshot(name, op.string_params[0], creg_.memory_hex()); } template void State::snapshot_creg_register(const Operations::Op &op, ExperimentData &data, std::string name) const { data.add_pershot_snapshot(name, op.string_params[0], creg_.register_hex()); } template void State::add_creg_to_data(ExperimentData &data) const { if (creg_.memory_size() > 0) { std::string memory_hex = creg_.memory_hex(); data.add_memory_count(memory_hex); data. add_pershot_memory(memory_hex); } // Register bits value if (creg_.register_size() > 0) { data. add_pershot_register(creg_.register_hex()); } } //------------------------------------------------------------------------- } // end namespace Base //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/simulators/statevector/000077500000000000000000000000001362723322000211215ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/statevector/qubitvector.hpp000077500000000000000000002277761362723322000242310ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_qubit_vector_hpp_ #define _qv_qubit_vector_hpp_ #include #include #include #include #include #include #include #include #include #include #include "framework/json.hpp" namespace QV { // Type aliases using uint_t = uint64_t; using int_t = int64_t; using reg_t = std::vector; using indexes_t = std::unique_ptr; template using areg_t = std::array; template using cvector_t = std::vector>; //============================================================================ // BIT MASKS and indexing //============================================================================ /* # Auto generate these values with following python snippet import json def cpp_init_list(int_lst): ret = json.dumps([str(i) + 'ULL' for i in int_lst]) return ret.replace('"', '').replace('[','{{').replace(']','}};') print('const std::array BITS = ' + cpp_init_list([(1 << i) for i in range(64)]) + '\n') print('const std::array MASKS = ' + cpp_init_list([(1 << i) - 1 for i in range(64)])) */ const std::array BITS {{ 1ULL, 2ULL, 4ULL, 8ULL, 16ULL, 32ULL, 64ULL, 128ULL, 256ULL, 512ULL, 1024ULL, 2048ULL, 4096ULL, 8192ULL, 16384ULL, 32768ULL, 65536ULL, 131072ULL, 262144ULL, 524288ULL, 1048576ULL, 2097152ULL, 4194304ULL, 8388608ULL, 16777216ULL, 33554432ULL, 67108864ULL, 134217728ULL, 268435456ULL, 536870912ULL, 1073741824ULL, 2147483648ULL, 4294967296ULL, 8589934592ULL, 17179869184ULL, 34359738368ULL, 68719476736ULL, 137438953472ULL, 274877906944ULL, 549755813888ULL, 1099511627776ULL, 2199023255552ULL, 4398046511104ULL, 8796093022208ULL, 17592186044416ULL, 35184372088832ULL, 70368744177664ULL, 140737488355328ULL, 281474976710656ULL, 562949953421312ULL, 1125899906842624ULL, 2251799813685248ULL, 4503599627370496ULL, 9007199254740992ULL, 18014398509481984ULL, 36028797018963968ULL, 72057594037927936ULL, 144115188075855872ULL, 288230376151711744ULL, 576460752303423488ULL, 1152921504606846976ULL, 2305843009213693952ULL, 4611686018427387904ULL, 9223372036854775808ULL }}; const std::array MASKS {{ 0ULL, 1ULL, 3ULL, 7ULL, 15ULL, 31ULL, 63ULL, 127ULL, 255ULL, 511ULL, 1023ULL, 2047ULL, 4095ULL, 8191ULL, 16383ULL, 32767ULL, 65535ULL, 131071ULL, 262143ULL, 524287ULL, 1048575ULL, 2097151ULL, 4194303ULL, 8388607ULL, 16777215ULL, 33554431ULL, 67108863ULL, 134217727ULL, 268435455ULL, 536870911ULL, 1073741823ULL, 2147483647ULL, 4294967295ULL, 8589934591ULL, 17179869183ULL, 34359738367ULL, 68719476735ULL, 137438953471ULL, 274877906943ULL, 549755813887ULL, 1099511627775ULL, 2199023255551ULL, 4398046511103ULL, 8796093022207ULL, 17592186044415ULL, 35184372088831ULL, 70368744177663ULL, 140737488355327ULL, 281474976710655ULL, 562949953421311ULL, 1125899906842623ULL, 2251799813685247ULL, 4503599627370495ULL, 9007199254740991ULL, 18014398509481983ULL, 36028797018963967ULL, 72057594037927935ULL, 144115188075855871ULL, 288230376151711743ULL, 576460752303423487ULL, 1152921504606846975ULL, 2305843009213693951ULL, 4611686018427387903ULL, 9223372036854775807ULL }}; //============================================================================ // QubitVector class //============================================================================ // Template class for qubit vector. // The arguement of the template must have an operator[] access method. // The following methods may also need to be template specialized: // * set_num_qubits(size_t) // * initialize() // * initialize_from_vector(cvector_t) // If the template argument does not have these methods then template // specialization must be used to override the default implementations. template class QubitVector { public: //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- QubitVector(); explicit QubitVector(size_t num_qubits); virtual ~QubitVector(); QubitVector(const QubitVector& obj) = delete; QubitVector &operator=(const QubitVector& obj) = delete; //----------------------------------------------------------------------- // Data access //----------------------------------------------------------------------- // Element access std::complex &operator[](uint_t element); std::complex operator[](uint_t element) const; // Returns a reference to the underlying data_t data class std::complex* &data() {return data_;} // Returns a copy of the underlying data_t data class std::complex* data() const {return data_;} //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Return the string name of the QUbitVector class static std::string name() {return "statevector";} // Set the size of the vector in terms of qubit number void set_num_qubits(size_t num_qubits); // Returns the number of qubits for the current vector virtual uint_t num_qubits() const {return num_qubits_;} // Returns the size of the underlying n-qubit vector uint_t size() const {return data_size_;} // Returns required memory size_t required_memory_mb(uint_t num_qubits) const; // Returns a copy of the underlying data_t data as a complex vector cvector_t vector() const; // Return JSON serialization of QubitVector; json_t json() const; // Set all entries in the vector to 0. void zero(); // convert vector type to data type of this qubit vector cvector_t convert(const cvector_t& v) const; // index0 returns the integer representation of a number of bits set // to zero inserted into an arbitrary bit string. // Eg: for qubits 0,2 in a state k = ba ( ba = 00 => k=0, etc). // indexes0([1], k) -> int(b0a) // indexes0([1,3], k) -> int(0b0a) // Example: k = 77 = 1001101 , qubits_sorted = [1,4] // ==> output = 297 = 100101001 (with 0's put into places 1 and 4). template uint_t index0(const list_t &qubits_sorted, const uint_t k) const; // Return a std::unique_ptr to an array of of 2^N in ints // each int corresponds to an N qubit bitstring for M-N qubit bits in state k, // and the specified N qubits in states [0, ..., 2^N - 1] // qubits_sorted must be sorted lowest to highest. Eg. {0, 1}. // qubits specifies the location of the qubits in the returned strings. // NOTE: since the return is a unique_ptr it cannot be copied. // indexes returns the array of all bit values for the specified qubits // (Eg: for qubits 0,2 in a state k = ba: // indexes([1], [1], k) = [int(b0a), int(b1a)], // if it were two qubits inserted say at 1,3 it would be: // indexes([1,3], [1,3], k) -> [int(0b0a), int(0b1a), int(1b0a), (1b1a)] // If the qubits were passed in reverse order it would swap qubit position in the list: // indexes([3,1], [1,3], k) -> [int(0b0a), int(1b0a), int(0b1a), (1b1a)] // Example: k=77, qubits=qubits_sorted=[1,4] ==> output=[297,299,313,315] // input: k = 77 = 1001101 // output[0]: 297 = 100101001 (with 0's put into places 1 and 4). // output[1]: 299 = 100101011 (with 0 put into place 1, and 1 put into place 4). // output[2]: 313 = 100111001 (with 1 put into place 1, and 0 put into place 4). // output[3]: 313 = 100111011 (with 1's put into places 1 and 4). indexes_t indexes(const reg_t &qubits, const reg_t &qubits_sorted, const uint_t k) const; // As above but returns a fixed sized array of of 2^N in ints template areg_t<1ULL << N> indexes(const areg_t &qs, const areg_t &qubits_sorted, const uint_t k) const; // State initialization of a component // Initialize the specified qubits to a desired statevector // (leaving the other qubits in their current state) // assuming the qubits being initialized have already been reset to the zero state // (using apply_reset) void initialize_component(const reg_t &qubits, const cvector_t &state); //----------------------------------------------------------------------- // Check point operations //----------------------------------------------------------------------- // Create a checkpoint of the current state void checkpoint(); // Revert to the checkpoint void revert(bool keep); // Compute the inner product of current state with checkpoint state std::complex inner_product() const; //----------------------------------------------------------------------- // Initialization //----------------------------------------------------------------------- // Initializes the current vector so that all qubits are in the |0> state. void initialize(); // Initializes the vector to a custom initial state. // If the length of the data vector does not match the number of qubits // an exception is raised. void initialize_from_vector(const cvector_t &data); // Initializes the vector to a custom initial state. // If num_states does not match the number of qubits an exception is raised. void initialize_from_data(const std::complex* data, const size_t num_states); //----------------------------------------------------------------------- // Apply Matrices //----------------------------------------------------------------------- // Apply a 1-qubit matrix to the state vector. // The matrix is input as vector of the column-major vectorized 1-qubit matrix. void apply_matrix(const uint_t qubit, const cvector_t &mat); // Apply a N-qubit matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. void apply_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a stacked set of 2^control_count target_count--qubit matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. void apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const cvector_t &mat); // Apply a 1-qubit diagonal matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_matrix(const uint_t qubit, const cvector_t &mat); // Apply a N-qubit diagonal matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_matrix(const reg_t &qubits, const cvector_t &mat); // Swap pairs of indicies in the underlying vector void apply_permutation_matrix(const reg_t &qubits, const std::vector> &pairs); //----------------------------------------------------------------------- // Apply Specialized Gates //----------------------------------------------------------------------- // Apply a general N-qubit multi-controlled X-gate // If N=1 this implements an optimized X gate // If N=2 this implements an optimized CX gate // If N=3 this implements an optimized Toffoli gate void apply_mcx(const reg_t &qubits); // Apply a general multi-controlled Y-gate // If N=1 this implements an optimized Y gate // If N=2 this implements an optimized CY gate // If N=3 this implements an optimized CCY gate void apply_mcy(const reg_t &qubits); // Apply a general multi-controlled single-qubit phase gate // with diagonal [1, ..., 1, phase] // If N=1 this implements an optimized single-qubit phase gate // If N=2 this implements an optimized CPhase gate // If N=3 this implements an optimized CCPhase gate // if phase = -1 this is a Z, CZ, CCZ gate void apply_mcphase(const reg_t &qubits, const std::complex phase); // Apply a general multi-controlled single-qubit unitary gate // If N=1 this implements an optimized single-qubit U gate // If N=2 this implements an optimized CU gate // If N=3 this implements an optimized CCU gate void apply_mcu(const reg_t &qubits, const cvector_t &mat); // Apply a general multi-controlled SWAP gate // If N=2 this implements an optimized SWAP gate // If N=3 this implements an optimized Fredkin gate void apply_mcswap(const reg_t &qubits); //----------------------------------------------------------------------- // Z-measurement outcome probabilities //----------------------------------------------------------------------- // Return the Z-basis measurement outcome probability P(outcome) for // outcome in [0, 2^num_qubits - 1] virtual double probability(const uint_t outcome) const; // Return the probabilities for all measurement outcomes in the current vector // This is equivalent to returning a new vector with new[i]=|orig[i]|^2. // Eg. For 2-qubits this is [P(00), P(01), P(010), P(11)] virtual std::vector probabilities() const; // Return the Z-basis measurement outcome probabilities [P(0), ..., P(2^N-1)] // for measurement of N-qubits. virtual std::vector probabilities(const reg_t &qubits) const; // Return M sampled outcomes for Z-basis measurement of all qubits // The input is a length M list of random reals between [0, 1) used for // generating samples. virtual reg_t sample_measure(const std::vector &rnds) const; //----------------------------------------------------------------------- // Norms //----------------------------------------------------------------------- // Returns the norm of the current vector double norm() const; // These functions return the norm obtained by // applying a matrix A to the vector. It is equivalent to returning the // expectation value of A^\dagger A, and could probably be removed because // of this. // Return the norm for of the vector obtained after apply the 1-qubit // matrix mat to the vector. // The matrix is input as vector of the column-major vectorized 1-qubit matrix. double norm(const uint_t qubit, const cvector_t &mat) const; // Return the norm for of the vector obtained after apply the N-qubit // matrix mat to the vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. double norm(const reg_t &qubits, const cvector_t &mat) const; // Return the norm for of the vector obtained after apply the 1-qubit // diagonal matrix mat to the vector. // The matrix is input as vector of the matrix diagonal. double norm_diagonal(const uint_t qubit, const cvector_t &mat) const; // Return the norm for of the vector obtained after apply the N-qubit // diagonal matrix mat to the vector. // The matrix is input as vector of the matrix diagonal. double norm_diagonal(const reg_t &qubits, const cvector_t &mat) const; //----------------------------------------------------------------------- // JSON configuration settings //----------------------------------------------------------------------- // Set the threshold for chopping values to 0 in JSON void set_json_chop_threshold(double threshold); // Set the threshold for chopping values to 0 in JSON double get_json_chop_threshold() {return json_chop_threshold_;} //----------------------------------------------------------------------- // OpenMP configuration settings //----------------------------------------------------------------------- // Set the maximum number of OpenMP thread for operations. void set_omp_threads(int n); // Get the maximum number of OpenMP thread for operations. uint_t get_omp_threads() {return omp_threads_;} // Set the qubit threshold for activating OpenMP. // If self.qubits() > threshold OpenMP will be activated. void set_omp_threshold(int n); // Get the qubit threshold for activating OpenMP. uint_t get_omp_threshold() {return omp_threshold_;} //----------------------------------------------------------------------- // Optimization configuration settings //----------------------------------------------------------------------- // Set the sample_measure index size void set_sample_measure_index_size(int n) {sample_measure_index_size_ = n;} // Get the sample_measure index size int get_sample_measure_index_size() {return sample_measure_index_size_;} protected: //----------------------------------------------------------------------- // Protected data members //----------------------------------------------------------------------- size_t num_qubits_; size_t data_size_; std::complex* data_; std::complex* checkpoint_; //----------------------------------------------------------------------- // Config settings //----------------------------------------------------------------------- uint_t omp_threads_ = 1; // Disable multithreading by default uint_t omp_threshold_ = 14; // Qubit threshold for multithreading when enabled int sample_measure_index_size_ = 10; // Sample measure indexing qubit size double json_chop_threshold_ = 0; // Threshold for choping small values // in JSON serialization //----------------------------------------------------------------------- // Error Messages //----------------------------------------------------------------------- void check_qubit(const uint_t qubit) const; void check_vector(const cvector_t &diag, uint_t nqubits) const; void check_matrix(const cvector_t &mat, uint_t nqubits) const; void check_dimension(const QubitVector &qv) const; void check_checkpoint() const; //----------------------------------------------------------------------- // Statevector update with Lambda function //----------------------------------------------------------------------- // Apply a lambda function to all entries of the statevector. // The function signature should be: // // [&](const int_t k)->void // // where k is the index of the vector template void apply_lambda(Lambda&& func); //----------------------------------------------------------------------- // Statevector block update with Lambda function //----------------------------------------------------------------------- // These functions loop through the indexes of the qubitvector data and // apply a lambda function to each block specified by the qubits argument. // // NOTE: The lambda functions can use the dynamic or static indexes // signature however if N is known at compile time the static case should // be preferred as it is significantly faster. // Apply a N-qubit lambda function to all blocks of the statevector // for the given qubits. The function signature should be either: // // (Static): [&](const areg_t<1ULL< &inds)->void // (Dynamic): [&](const indexes_t &inds)->void // // where `inds` are the 2 ** N indexes for each N-qubit block returned by // the `indexes` function. template void apply_lambda(Lambda&& func, const list_t &qubits); // Apply an N-qubit parameterized lambda function to all blocks of the // statevector for the given qubits. The function signature should be: // // (Static): [&](const areg_t<1ULL< &inds, const param_t ¶ms)->void // (Dynamic): [&](const indexes_t &inds, const param_t ¶ms)->void // // where `inds` are the 2 ** N indexes for each N-qubit block returned by // the `indexes` function and `param` is a templated parameter class. // (typically a complex vector). template void apply_lambda(Lambda&& func, const list_t &qubits, const param_t &par); //----------------------------------------------------------------------- // State reduction with Lambda functions //----------------------------------------------------------------------- // Apply a complex reduction lambda function to all entries of the // statevector and return the complex result. // The function signature should be: // // [&](const int_t k, double &val_re, double &val_im)->void // // where k is the index of the vector, val_re and val_im are the doubles // to store the reduction. // Returns std::complex(val_re, val_im) template std::complex apply_reduction_lambda(Lambda&& func) const; //----------------------------------------------------------------------- // Statevector block reduction with Lambda function //----------------------------------------------------------------------- // These functions loop through the indexes of the qubitvector data and // apply a reduction lambda function to each block specified by the qubits // argument. The reduction lambda stores the reduction in two doubles // (val_re, val_im) and returns the complex result std::complex(val_re, val_im) // // NOTE: The lambda functions can use the dynamic or static indexes // signature however if N is known at compile time the static case should // be preferred as it is significantly faster. // Apply a N-qubit complex matrix reduction lambda function to all blocks // of the statevector for the given qubits. // The lambda function signature should be: // // (Static): [&](const areg_t<1ULL< &inds, const param_t &mat, // double &val_re, double &val_im)->void // (Dynamic): [&](const indexes_t &inds, const param_t &mat, // double &val_re, double &val_im)->void // // where `inds` are the 2 ** N indexes for each N-qubit block returned by // the `indexes` function, `val_re` and `val_im` are the doubles to // store the reduction returned as std::complex(val_re, val_im). template std::complex apply_reduction_lambda(Lambda&& func, const list_t &qubits) const; // Apply a N-qubit complex matrix reduction lambda function to all blocks // of the statevector for the given qubits. // The lambda function signature should be: // // (Static): [&](const areg_t<1ULL< &inds, const param_t &parms, // double &val_re, double &val_im)->void // (Dynamic): [&](const indexes_t &inds, const param_t ¶ms, // double &val_re, double &val_im)->void // // where `inds` are the 2 ** N indexes for each N-qubit block returned by // the `indexe`s function, `params` is a templated parameter class // (typically a complex vector), `val_re` and `val_im` are the doubles to // store the reduction returned as std::complex(val_re, val_im). template std::complex apply_reduction_lambda(Lambda&& func, const list_t &qubits, const param_t ¶ms) const; }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // JSON Serialization //------------------------------------------------------------------------------ template inline void to_json(json_t &js, const QubitVector &qv) { js = qv.json(); } template json_t QubitVector::json() const { const int_t END = data_size_; const json_t ZERO = std::complex(0.0, 0.0); json_t js = json_t(data_size_, ZERO); if (json_chop_threshold_ > 0) { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t j=0; j < END; j++) { if (std::abs(data_[j].real()) > json_chop_threshold_) js[j][0] = data_[j].real(); if (std::abs(data_[j].imag()) > json_chop_threshold_) js[j][1] = data_[j].imag(); } } else { #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t j=0; j < END; j++) { js[j][0] = data_[j].real(); js[j][1] = data_[j].imag(); } } return js; } //------------------------------------------------------------------------------ // Error Handling //------------------------------------------------------------------------------ template void QubitVector::check_qubit(const uint_t qubit) const { if (qubit + 1 > num_qubits_) { std::string error = "QubitVector: qubit index " + std::to_string(qubit) + " > " + std::to_string(num_qubits_); throw std::runtime_error(error); } } template void QubitVector::check_matrix(const cvector_t &vec, uint_t nqubits) const { const size_t DIM = BITS[nqubits]; const auto SIZE = vec.size(); if (SIZE != DIM * DIM) { std::string error = "QubitVector: vector size is " + std::to_string(SIZE) + " != " + std::to_string(DIM * DIM); throw std::runtime_error(error); } } template void QubitVector::check_vector(const cvector_t &vec, uint_t nqubits) const { const size_t DIM = BITS[nqubits]; const auto SIZE = vec.size(); if (SIZE != DIM) { std::string error = "QubitVector: vector size is " + std::to_string(SIZE) + " != " + std::to_string(DIM); throw std::runtime_error(error); } } template void QubitVector::check_dimension(const QubitVector &qv) const { if (data_size_ != qv.size_) { std::string error = "QubitVector: vectors are different shape " + std::to_string(data_size_) + " != " + std::to_string(qv.num_states_); throw std::runtime_error(error); } } template void QubitVector::check_checkpoint() const { if (!checkpoint_) { throw std::runtime_error("QubitVector: checkpoint must exist for inner_product() or revert()"); } } //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template QubitVector::QubitVector(size_t num_qubits) : num_qubits_(0), data_(nullptr), checkpoint_(0){ set_num_qubits(num_qubits); } template QubitVector::QubitVector() : QubitVector(0) {} template QubitVector::~QubitVector() { if (data_) free(data_); if (checkpoint_) free(checkpoint_); } //------------------------------------------------------------------------------ // Element access operators //------------------------------------------------------------------------------ template std::complex &QubitVector::operator[](uint_t element) { // Error checking #ifdef DEBUG if (element > data_size_) { std::string error = "QubitVector: vector index " + std::to_string(element) + " > " + std::to_string(data_size_); throw std::runtime_error(error); } #endif return data_[element]; } template std::complex QubitVector::operator[](uint_t element) const { // Error checking #ifdef DEBUG if (element > data_size_) { std::string error = "QubitVector: vector index " + std::to_string(element) + " > " + std::to_string(data_size_); throw std::runtime_error(error); } #endif return data_[element]; } template cvector_t QubitVector::vector() const { cvector_t ret(data_size_, 0.); const int_t END = data_size_; #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t j=0; j < END; j++) { ret[j] = data_[j]; } return ret; } //------------------------------------------------------------------------------ // Indexing //------------------------------------------------------------------------------ template template uint_t QubitVector::index0(const list_t &qubits_sorted, const uint_t k) const { uint_t lowbits, retval = k; for (size_t j = 0; j < qubits_sorted.size(); j++) { lowbits = retval & MASKS[qubits_sorted[j]]; retval >>= qubits_sorted[j]; retval <<= qubits_sorted[j] + 1; retval |= lowbits; } return retval; } template template areg_t<1ULL << N> QubitVector::indexes(const areg_t &qs, const areg_t &qubits_sorted, const uint_t k) const { areg_t<1ULL << N> ret; ret[0] = index0(qubits_sorted, k); for (size_t i = 0; i < N; i++) { const auto n = BITS[i]; const auto bit = BITS[qs[i]]; for (size_t j = 0; j < n; j++) ret[n + j] = ret[j] | bit; } return ret; } template indexes_t QubitVector::indexes(const reg_t& qubits, const reg_t& qubits_sorted, const uint_t k) const { const auto N = qubits_sorted.size(); indexes_t ret(new uint_t[BITS[N]]); // Get index0 ret[0] = index0(qubits_sorted, k); for (size_t i = 0; i < N; i++) { const auto n = BITS[i]; const auto bit = BITS[qubits[i]]; for (size_t j = 0; j < n; j++) ret[n + j] = ret[j] | bit; } return ret; } //------------------------------------------------------------------------------ // State initialize component //------------------------------------------------------------------------------ template void QubitVector::initialize_component(const reg_t &qubits, const cvector_t &state0) { cvector_t state = convert(state0); // Lambda function for initializing component auto lambda = [&](const indexes_t &inds, const cvector_t &_state)->void { const uint_t DIM = 1ULL << qubits.size(); std::complex cache = data_[inds[0]]; // the k-th component of non-initialized vector for (size_t i = 0; i < DIM; i++) { data_[inds[i]] = cache * _state[i]; // set component to psi[k] * state[i] } // (where psi is is the post-reset state of the non-initialized qubits) }; // Use the lambda function apply_lambda(lambda, qubits, state); } //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template void QubitVector::zero() { const int_t END = data_size_; // end for k loop #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t k = 0; k < END; ++k) { data_[k] = 0.0; } } template cvector_t QubitVector::convert(const cvector_t& v) const { cvector_t ret(v.size()); for (size_t i = 0; i < v.size(); ++i) ret[i] = v[i]; return ret; } template void QubitVector::set_num_qubits(size_t num_qubits) { size_t prev_num_qubits = num_qubits_; num_qubits_ = num_qubits; data_size_ = BITS[num_qubits]; if (checkpoint_) { free(checkpoint_); checkpoint_ = nullptr; } // Free any currently assigned memory if (data_) { if (prev_num_qubits != num_qubits_) { free(data_); data_ = nullptr; } } // Allocate memory for new vector if (data_ == nullptr) data_ = reinterpret_cast*>(malloc(sizeof(std::complex) * data_size_)); } template size_t QubitVector::required_memory_mb(uint_t num_qubits) const { size_t unit = std::log2(sizeof(std::complex)); size_t shift_mb = std::max(0, num_qubits + unit - 20); size_t mem_mb = 1ULL << shift_mb; return mem_mb; } template void QubitVector::checkpoint() { if (!checkpoint_) checkpoint_ = reinterpret_cast*>(malloc(sizeof(std::complex) * data_size_)); const int_t END = data_size_; // end for k loop #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t k = 0; k < END; ++k) checkpoint_[k] = data_[k]; } template void QubitVector::revert(bool keep) { #ifdef DEBUG check_checkpoint(); #endif // If we aren't keeping checkpoint we don't need to copy memory // we can simply swap the pointers and free discarded memory if (!keep) { free(data_); data_ = checkpoint_; checkpoint_ = nullptr; } else { // Otherwise we need to copy data const int_t END = data_size_; // end for k loop #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t k = 0; k < END; ++k) data_[k] = checkpoint_[k]; } } template std::complex QubitVector::inner_product() const { #ifdef DEBUG check_checkpoint(); #endif // Lambda function for inner product with checkpoint state auto lambda = [&](int_t k, double &val_re, double &val_im)->void { const std::complex z = data_[k] * std::conj(checkpoint_[k]); val_re += std::real(z); val_im += std::imag(z); }; return apply_reduction_lambda(lambda); } //------------------------------------------------------------------------------ // Initialization //------------------------------------------------------------------------------ template void QubitVector::initialize() { zero(); data_[0] = 1.; } template void QubitVector::initialize_from_vector(const cvector_t &statevec) { if (data_size_ != statevec.size()) { std::string error = "QubitVector::initialize input vector is incorrect length (" + std::to_string(data_size_) + "!=" + std::to_string(statevec.size()) + ")"; throw std::runtime_error(error); } const int_t END = data_size_; // end for k loop #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t k = 0; k < END; ++k) data_[k] = statevec[k]; } template void QubitVector::initialize_from_data(const std::complex* statevec, const size_t num_states) { if (data_size_ != num_states) { std::string error = "QubitVector::initialize input vector is incorrect length (" + std::to_string(data_size_) + "!=" + std::to_string(num_states) + ")"; throw std::runtime_error(error); } const int_t END = data_size_; // end for k loop #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t k = 0; k < END; ++k) data_[k] = statevec[k]; } /******************************************************************************* * * CONFIG SETTINGS * ******************************************************************************/ template void QubitVector::set_omp_threads(int n) { if (n > 0) omp_threads_ = n; } template void QubitVector::set_omp_threshold(int n) { if (n > 0) omp_threshold_ = n; } template void QubitVector::set_json_chop_threshold(double threshold) { json_chop_threshold_ = threshold; } /******************************************************************************* * * LAMBDA FUNCTION TEMPLATES * ******************************************************************************/ //------------------------------------------------------------------------------ // State update //------------------------------------------------------------------------------ template template void QubitVector::apply_lambda(Lambda&& func) { const int_t END = data_size_; #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { #pragma omp for for (int_t k = 0; k < END; k++) { std::forward(func)(k); } } } template template void QubitVector::apply_lambda(Lambda&& func, const list_t &qubits) { // Error checking #ifdef DEBUG for (const auto &qubit : qubits) check_qubit(qubit); #endif const auto NUM_QUBITS = qubits.size(); const int_t END = data_size_ >> NUM_QUBITS; auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { #pragma omp for for (int_t k = 0; k < END; k++) { // store entries touched by U const auto inds = indexes(qubits, qubits_sorted, k); std::forward(func)(inds); } } } template template void QubitVector::apply_lambda(Lambda&& func, const list_t &qubits, const param_t ¶ms) { // Error checking #ifdef DEBUG for (const auto &qubit : qubits) check_qubit(qubit); #endif const auto NUM_QUBITS = qubits.size(); const int_t END = data_size_ >> NUM_QUBITS; auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { #pragma omp for for (int_t k = 0; k < END; k++) { const auto inds = indexes(qubits, qubits_sorted, k); std::forward(func)(inds, params); } } } //------------------------------------------------------------------------------ // Reduction Lambda //------------------------------------------------------------------------------ template template std::complex QubitVector::apply_reduction_lambda(Lambda &&func) const { // Reduction variables double val_re = 0.; double val_im = 0.; const int_t END = data_size_; #pragma omp parallel reduction(+:val_re, val_im) if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) \ num_threads(omp_threads_) { #pragma omp for for (int_t k = 0; k < END; k++) { std::forward(func)(k, val_re, val_im); } } // end omp parallel return std::complex(val_re, val_im); } template template std::complex QubitVector::apply_reduction_lambda(Lambda&& func, const list_t &qubits) const { // Error checking #ifdef DEBUG for (const auto &qubit : qubits) check_qubit(qubit); #endif const size_t NUM_QUBITS = qubits.size(); const int_t END = data_size_ >> NUM_QUBITS; auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); // Reduction variables double val_re = 0.; double val_im = 0.; #pragma omp parallel reduction(+:val_re, val_im) if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) \ num_threads(omp_threads_) { #pragma omp for for (int_t k = 0; k < END; k++) { const auto inds = indexes(qubits, qubits_sorted, k); std::forward(func)(inds, val_re, val_im); } } // end omp parallel return std::complex(val_re, val_im); } template template std::complex QubitVector::apply_reduction_lambda(Lambda&& func, const list_t &qubits, const param_t ¶ms) const { const auto NUM_QUBITS = qubits.size(); // Error checking #ifdef DEBUG for (const auto &qubit : qubits) check_qubit(qubit); #endif const int_t END = data_size_ >> NUM_QUBITS; auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); // Reduction variables double val_re = 0.; double val_im = 0.; #pragma omp parallel reduction(+:val_re, val_im) if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) \ num_threads(omp_threads_) { #pragma omp for for (int_t k = 0; k < END; k++) { const auto inds = indexes(qubits, qubits_sorted, k); std::forward(func)(inds, params, val_re, val_im); } } // end omp parallel return std::complex(val_re, val_im); } /******************************************************************************* * * MATRIX MULTIPLICATION * ******************************************************************************/ template void QubitVector::apply_matrix(const reg_t &qubits, const cvector_t &mat) { const size_t N = qubits.size(); // Error checking #ifdef DEBUG check_vector(mat, 2 * N); #endif // Static array optimized lambda functions switch (N) { case 1: apply_matrix(qubits[0], mat); return; case 2: { // Lambda function for 2-qubit matrix multiplication auto lambda = [&](const areg_t<4> &inds, const cvector_t &_mat)->void { std::array, 4> cache; for (size_t i = 0; i < 4; i++) { const auto ii = inds[i]; cache[i] = data_[ii]; data_[ii] = 0.; } // update state vector for (size_t i = 0; i < 4; i++) for (size_t j = 0; j < 4; j++) data_[inds[i]] += _mat[i + 4 * j] * cache[j]; }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}}), convert(mat)); return; } case 3: { // Lambda function for 3-qubit matrix multiplication auto lambda = [&](const areg_t<8> &inds, const cvector_t &_mat)->void { std::array, 8> cache; for (size_t i = 0; i < 8; i++) { const auto ii = inds[i]; cache[i] = data_[ii]; data_[ii] = 0.; } // update state vector for (size_t i = 0; i < 8; i++) for (size_t j = 0; j < 8; j++) data_[inds[i]] += _mat[i + 8 * j] * cache[j]; }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}}), convert(mat)); return; } case 4: { // Lambda function for 4-qubit matrix multiplication auto lambda = [&](const areg_t<16> &inds, const cvector_t &_mat)->void { std::array, 16> cache; for (size_t i = 0; i < 16; i++) { const auto ii = inds[i]; cache[i] = data_[ii]; data_[ii] = 0.; } // update state vector for (size_t i = 0; i < 16; i++) for (size_t j = 0; j < 16; j++) data_[inds[i]] += _mat[i + 16 * j] * cache[j]; }; apply_lambda(lambda, areg_t<4>({{qubits[0], qubits[1], qubits[2], qubits[3]}}), convert(mat)); return; } default: { // Lambda function for N-qubit matrix multiplication auto lambda = [&](const indexes_t &inds, const cvector_t &_mat)->void { const uint_t DIM = BITS[N]; auto cache = std::make_unique[]>(DIM); for (size_t i = 0; i < DIM; i++) { const auto ii = inds[i]; cache[i] = data_[ii]; data_[ii] = 0.; } // update state vector for (size_t i = 0; i < DIM; i++) for (size_t j = 0; j < DIM; j++) data_[inds[i]] += _mat[i + DIM * j] * cache[j]; }; apply_lambda(lambda, qubits, convert(mat)); } } // end switch } template void QubitVector::apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const cvector_t &mat) { auto lambda = [&](const indexes_t &inds, const cvector_t &_mat)->void { // General implementation const size_t control_count = control_qubits.size(); const size_t target_count = target_qubits.size(); const uint_t DIM = BITS[(target_count+control_count)]; const uint_t columns = BITS[target_count]; const uint_t blocks = BITS[control_count]; // Lambda function for stacked matrix multiplication auto cache = std::make_unique[]>(DIM); for (uint_t i = 0; i < DIM; i++) { const auto ii = inds[i]; cache[i] = data_[ii]; data_[ii] = 0.; } // update state vector for (uint_t b = 0; b < blocks; b++) for (uint_t i = 0; i < columns; i++) for (uint_t j = 0; j < columns; j++) { data_[inds[i+b*columns]] += _mat[i+b*columns + DIM * j] * cache[b*columns+j]; } }; // Use the lambda function auto qubits = target_qubits; for (const auto &q : control_qubits) {qubits.push_back(q);} apply_lambda(lambda, qubits, convert(mat)); } template void QubitVector::apply_diagonal_matrix(const reg_t &qubits, const cvector_t &diag) { // Error checking #ifdef DEBUG check_vector(diag, qubits.size()); #endif if (qubits.size() == 1) { apply_diagonal_matrix(qubits[0], diag); return; } auto lambda = [&](const areg_t<2> &inds, const cvector_t &_diag)->void { for (int_t i = 0; i < 2; ++i) { const int_t k = inds[i]; int_t iv = 0; for (int_t j = 0; j < qubits.size(); j++) if ((k & (1ULL << qubits[j])) != 0) iv += (1 << j); if (_diag[iv] != (data_t) 1.0) data_[k] *= _diag[iv]; } }; apply_lambda(lambda, areg_t<1>({{qubits[0]}}), convert(diag)); } template void QubitVector::apply_permutation_matrix(const reg_t& qubits, const std::vector> &pairs) { const size_t N = qubits.size(); // Error checking #ifdef DEBUG check_vector(diag, N); #endif switch (N) { case 1: { // Lambda function for permutation matrix auto lambda = [&](const areg_t<2> &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; apply_lambda(lambda, areg_t<1>({{qubits[0]}})); return; } case 2: { // Lambda function for permutation matrix auto lambda = [&](const areg_t<4> &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}})); return; } case 3: { // Lambda function for permutation matrix auto lambda = [&](const areg_t<8> &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}})); return; } case 4: { // Lambda function for permutation matrix auto lambda = [&](const areg_t<16> &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; apply_lambda(lambda, areg_t<4>({{qubits[0], qubits[1], qubits[2], qubits[3]}})); return; } case 5: { // Lambda function for permutation matrix auto lambda = [&](const areg_t<32> &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; apply_lambda(lambda, areg_t<5>({{qubits[0], qubits[1], qubits[2], qubits[3], qubits[4]}})); return; } case 6: { // Lambda function for permutation matrix auto lambda = [&](const areg_t<64> &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; apply_lambda(lambda, areg_t<6>({{qubits[0], qubits[1], qubits[2], qubits[3], qubits[4], qubits[5]}})); return; } default: { // Lambda function for permutation matrix auto lambda = [&](const indexes_t &inds)->void { for (const auto& p : pairs) { std::swap(data_[inds[p.first]], data_[inds[p.second]]); } }; // Use the lambda function apply_lambda(lambda, qubits); } } // end switch } /******************************************************************************* * * APPLY OPTIMIZED GATES * ******************************************************************************/ //------------------------------------------------------------------------------ // Multi-controlled gates //------------------------------------------------------------------------------ template void QubitVector::apply_mcx(const reg_t &qubits) { // Calculate the permutation positions for the last qubit. const size_t N = qubits.size(); const size_t pos0 = MASKS[N - 1]; const size_t pos1 = MASKS[N]; switch (N) { case 1: { // Lambda function for X gate auto lambda = [&](const areg_t<2> &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, areg_t<1>({{qubits[0]}})); return; } case 2: { // Lambda function for CX gate auto lambda = [&](const areg_t<4> &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}})); return; } case 3: { // Lambda function for Toffli gate auto lambda = [&](const areg_t<8> &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}})); return; } default: { // Lambda function for general multi-controlled X gate auto lambda = [&](const indexes_t &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, qubits); } } // end switch } template void QubitVector::apply_mcy(const reg_t &qubits) { // Calculate the permutation positions for the last qubit. const size_t N = qubits.size(); const size_t pos0 = MASKS[N - 1]; const size_t pos1 = MASKS[N]; const std::complex I(0., 1.); switch (N) { case 1: { // Lambda function for Y gate auto lambda = [&](const areg_t<2> &inds)->void { const std::complex cache = data_[inds[pos0]]; data_[inds[pos0]] = -I * data_[inds[pos1]]; data_[inds[pos1]] = I * cache; }; apply_lambda(lambda, areg_t<1>({{qubits[0]}})); return; } case 2: { // Lambda function for CY gate auto lambda = [&](const areg_t<4> &inds)->void { const std::complex cache = data_[inds[pos0]]; data_[inds[pos0]] = -I * data_[inds[pos1]]; data_[inds[pos1]] = I * cache; }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}})); return; } case 3: { // Lambda function for CCY gate auto lambda = [&](const areg_t<8> &inds)->void { const std::complex cache = data_[inds[pos0]]; data_[inds[pos0]] = -I * data_[inds[pos1]]; data_[inds[pos1]] = I * cache; }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}})); return; } default: { // Lambda function for general multi-controlled Y gate auto lambda = [&](const indexes_t &inds)->void { const std::complex cache = data_[inds[pos0]]; data_[inds[pos0]] = -I * data_[inds[pos1]]; data_[inds[pos1]] = I * cache; }; apply_lambda(lambda, qubits); } } // end switch } template void QubitVector::apply_mcswap(const reg_t &qubits) { // Calculate the swap positions for the last two qubits. // If N = 2 this is just a regular SWAP gate rather than a controlled-SWAP gate. const size_t N = qubits.size(); const size_t pos0 = MASKS[N - 1]; const size_t pos1 = pos0 + BITS[N - 2]; switch (N) { case 2: { // Lambda function for SWAP gate auto lambda = [&](const areg_t<4> &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}})); return; } case 3: { // Lambda function for C-SWAP gate auto lambda = [&](const areg_t<8> &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}})); return; } default: { // Lambda function for general multi-controlled SWAP gate auto lambda = [&](const indexes_t &inds)->void { std::swap(data_[inds[pos0]], data_[inds[pos1]]); }; apply_lambda(lambda, qubits); } } // end switch } template void QubitVector::apply_mcphase(const reg_t &qubits, const std::complex phase) { const size_t N = qubits.size(); switch (N) { case 1: { // Lambda function for arbitrary Phase gate with diagonal [1, phase] auto lambda = [&](const areg_t<2> &inds)->void { data_[inds[1]] *= phase; }; apply_lambda(lambda, areg_t<1>({{qubits[0]}})); return; } case 2: { // Lambda function for CPhase gate with diagonal [1, 1, 1, phase] auto lambda = [&](const areg_t<4> &inds)->void { data_[inds[3]] *= phase; }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}})); return; } case 3: { auto lambda = [&](const areg_t<8> &inds)->void { data_[inds[7]] *= phase; }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}})); return; } default: { // Lambda function for general multi-controlled Phase gate // with diagonal [1, ..., 1, phase] auto lambda = [&](const indexes_t &inds)->void { data_[inds[MASKS[N]]] *= phase; }; apply_lambda(lambda, qubits); } } // end switch } template void QubitVector::apply_mcu(const reg_t &qubits, const cvector_t &mat) { // Calculate the permutation positions for the last qubit. const size_t N = qubits.size(); const size_t pos0 = MASKS[N - 1]; const size_t pos1 = MASKS[N]; // Check if matrix is actually diagonal and if so use // diagonal matrix lambda function // TODO: this should be changed to not check doubles with == if (mat[1] == 0.0 && mat[2] == 0.0) { // Check if actually a phase gate if (mat[0] == 1.0) { apply_mcphase(qubits, mat[3]); return; } // Otherwise apply general diagonal gate const cvector_t diag = {{mat[0], mat[3]}}; // Diagonal version switch (N) { case 1: { // If N=1 this is just a single-qubit matrix apply_diagonal_matrix(qubits[0], diag); return; } case 2: { // Lambda function for CU gate auto lambda = [&](const areg_t<4> &inds, const cvector_t &_diag)->void { data_[inds[pos0]] = _diag[0] * data_[inds[pos0]]; data_[inds[pos1]] = _diag[1] * data_[inds[pos1]]; }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}}), convert(diag)); return; } case 3: { // Lambda function for CCU gate auto lambda = [&](const areg_t<8> &inds, const cvector_t &_diag)->void { data_[inds[pos0]] = _diag[0] * data_[inds[pos0]]; data_[inds[pos1]] = _diag[1] * data_[inds[pos1]]; }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}}), convert(diag)); return; } default: { // Lambda function for general multi-controlled U gate auto lambda = [&](const indexes_t &inds, const cvector_t &_diag)->void { data_[inds[pos0]] = _diag[0] * data_[inds[pos0]]; data_[inds[pos1]] = _diag[1] * data_[inds[pos1]]; }; apply_lambda(lambda, qubits, convert(diag)); return; } } // end switch } // Non-diagonal version switch (N) { case 1: { // If N=1 this is just a single-qubit matrix apply_matrix(qubits[0], mat); return; } case 2: { // Lambda function for CU gate auto lambda = [&](const areg_t<4> &inds, const cvector_t &_mat)->void { const auto cache = data_[inds[pos0]]; data_[inds[pos0]] = _mat[0] * data_[inds[pos0]] + _mat[2] * data_[inds[pos1]]; data_[inds[pos1]] = _mat[1] * cache + _mat[3] * data_[inds[pos1]]; }; apply_lambda(lambda, areg_t<2>({{qubits[0], qubits[1]}}), convert(mat)); return; } case 3: { // Lambda function for CCU gate auto lambda = [&](const areg_t<8> &inds, const cvector_t &_mat)->void { const auto cache = data_[inds[pos0]]; data_[inds[pos0]] = _mat[0] * data_[inds[pos0]] + _mat[2] * data_[inds[pos1]]; data_[inds[pos1]] = _mat[1] * cache + _mat[3] * data_[inds[pos1]]; }; apply_lambda(lambda, areg_t<3>({{qubits[0], qubits[1], qubits[2]}}), convert(mat)); return; } default: { // Lambda function for general multi-controlled U gate auto lambda = [&](const indexes_t &inds, const cvector_t &_mat)->void { const auto cache = data_[inds[pos0]]; data_[inds[pos0]] = _mat[0] * data_[inds[pos0]] + _mat[2] * data_[inds[pos1]]; data_[inds[pos1]] = _mat[1] * cache + _mat[3] * data_[inds[pos1]]; }; apply_lambda(lambda, qubits, convert(mat)); return; } } // end switch } //------------------------------------------------------------------------------ // Single-qubit matrices //------------------------------------------------------------------------------ template void QubitVector::apply_matrix(const uint_t qubit, const cvector_t& mat) { // Check if matrix is diagonal and if so use optimized lambda if (mat[1] == 0.0 && mat[2] == 0.0) { const cvector_t diag = {{mat[0], mat[3]}}; apply_diagonal_matrix(qubit, diag); return; } // Convert qubit to array register for lambda functions areg_t<1> qubits = {{qubit}}; // Check if anti-diagonal matrix and if so use optimized lambda if(mat[0] == 0.0 && mat[3] == 0.0) { if (mat[1] == 1.0 && mat[2] == 1.0) { // X-matrix auto lambda = [&](const areg_t<2> &inds)->void { std::swap(data_[inds[0]], data_[inds[1]]); }; apply_lambda(lambda, qubits); return; } if (mat[2] == 0.0) { // Non-unitary projector // possibly used in measure/reset/kraus update auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { data_[inds[1]] = _mat[1] * data_[inds[0]]; data_[inds[0]] = 0.0; }; apply_lambda(lambda, qubits, convert(mat)); return; } if (mat[1] == 0.0) { // Non-unitary projector // possibly used in measure/reset/kraus update auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { data_[inds[0]] = _mat[2] * data_[inds[1]]; data_[inds[1]] = 0.0; }; apply_lambda(lambda, qubits, convert(mat)); return; } // else we have a general anti-diagonal matrix auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const std::complex cache = data_[inds[0]]; data_[inds[0]] = _mat[2] * data_[inds[1]]; data_[inds[1]] = _mat[1] * cache; }; apply_lambda(lambda, qubits, convert(mat)); return; } // Otherwise general single-qubit matrix multiplication auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto cache = data_[inds[0]]; data_[inds[0]] = _mat[0] * cache + _mat[2] * data_[inds[1]]; data_[inds[1]] = _mat[1] * cache + _mat[3] * data_[inds[1]]; }; apply_lambda(lambda, qubits, convert(mat)); } template void QubitVector::apply_diagonal_matrix(const uint_t qubit, const cvector_t& diag) { // TODO: This should be changed so it isn't checking doubles with == if (diag[0] == 1.0) { // [[1, 0], [0, z]] matrix if (diag[1] == 1.0) return; // Identity if (diag[1] == std::complex(0., -1.)) { // [[1, 0], [0, -i]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k = inds[1]; double cache = data_[k].imag(); data_[k].imag(data_[k].real() * -1.); data_[k].real(cache); }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } if (diag[1] == std::complex(0., 1.)) { // [[1, 0], [0, i]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k = inds[1]; double cache = data_[k].imag(); data_[k].imag(data_[k].real()); data_[k].real(cache * -1.); }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } if (diag[0] == 0.0) { // [[1, 0], [0, 0]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { data_[inds[1]] = 0.0; }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } // general [[1, 0], [0, z]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k = inds[1]; data_[k] *= _mat[1]; }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } else if (diag[1] == 1.0) { // [[z, 0], [0, 1]] matrix if (diag[0] == std::complex(0., -1.)) { // [[-i, 0], [0, 1]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k = inds[1]; double cache = data_[k].imag(); data_[k].imag(data_[k].real() * -1.); data_[k].real(cache); }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } if (diag[0] == std::complex(0., 1.)) { // [[i, 0], [0, 1]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k = inds[1]; double cache = data_[k].imag(); data_[k].imag(data_[k].real()); data_[k].real(cache * -1.); }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } if (diag[0] == 0.0) { // [[0, 0], [0, 1]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { data_[inds[0]] = 0.0; }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } // general [[z, 0], [0, 1]] auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k = inds[0]; data_[k] *= _mat[0]; }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); return; } else { // Lambda function for diagonal matrix multiplication auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat)->void { const auto k0 = inds[0]; const auto k1 = inds[1]; data_[k0] *= _mat[0]; data_[k1] *= _mat[1]; }; apply_lambda(lambda, areg_t<1>({{qubit}}), convert(diag)); } } /******************************************************************************* * * NORMS * ******************************************************************************/ template double QubitVector::norm() const { // Lambda function for norm auto lambda = [&](int_t k, double &val_re, double &val_im)->void { (void)val_im; // unused val_re += std::real(data_[k] * std::conj(data_[k])); }; return std::real(apply_reduction_lambda(lambda)); } template double QubitVector::norm(const reg_t &qubits, const cvector_t &mat) const { // Error checking #ifdef DEBUG check_vector(mat, 2 * qubits.size()); #endif // Static array optimized lambda functions switch (qubits.size()) { case 1: return norm(qubits[0], mat); case 2: { // Lambda function for 2-qubit matrix norm auto lambda = [&](const areg_t<4> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < 4; i++) { std::complex vi = 0; for (size_t j = 0; j < 4; j++) vi += _mat[i + 4 * j] * data_[inds[j]]; val_re += std::real(vi * std::conj(vi)); } }; areg_t<2> qubits_arr = {{qubits[0], qubits[1]}}; return std::real(apply_reduction_lambda(lambda, qubits_arr, convert(mat))); } case 3: { // Lambda function for 3-qubit matrix norm auto lambda = [&](const areg_t<8> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < 8; i++) { std::complex vi = 0; for (size_t j = 0; j < 8; j++) vi += _mat[i + 8 * j] * data_[inds[j]]; val_re += std::real(vi * std::conj(vi)); } }; areg_t<3> qubits_arr = {{qubits[0], qubits[1], qubits[2]}}; return std::real(apply_reduction_lambda(lambda, qubits_arr, convert(mat))); } case 4: { // Lambda function for 4-qubit matrix norm auto lambda = [&](const areg_t<16> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < 16; i++) { std::complex vi = 0; for (size_t j = 0; j < 16; j++) vi += _mat[i + 16 * j] * data_[inds[j]]; val_re += std::real(vi * std::conj(vi)); } }; areg_t<4> qubits_arr = {{qubits[0], qubits[1], qubits[2], qubits[3]}}; return std::real(apply_reduction_lambda(lambda, qubits_arr, convert(mat))); } default: { // Lambda function for N-qubit matrix norm auto lambda = [&](const indexes_t &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused const uint_t DIM = BITS[qubits.size()]; for (size_t i = 0; i < DIM; i++) { std::complex vi = 0; for (size_t j = 0; j < DIM; j++) vi += _mat[i + DIM * j] * data_[inds[j]]; val_re += std::real(vi * std::conj(vi)); } }; // Use the lambda function return std::real(apply_reduction_lambda(lambda, qubits, convert(mat))); } } // end switch } template double QubitVector::norm_diagonal(const reg_t &qubits, const cvector_t &mat) const { const uint_t N = qubits.size(); // Error checking #ifdef DEBUG check_vector(mat, N); #endif // Static array optimized lambda functions switch (N) { case 1: return norm_diagonal(qubits[0], mat); case 2: { // Lambda function for 2-qubit matrix norm auto lambda = [&](const areg_t<4> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < 4; i++) { const auto vi = _mat[i] * data_[inds[i]]; val_re += std::real(vi * std::conj(vi)); } }; areg_t<2> qubits_arr = {{qubits[0], qubits[1]}}; return std::real(apply_reduction_lambda(lambda, qubits_arr, convert(mat))); } case 3: { // Lambda function for 3-qubit matrix norm auto lambda = [&](const areg_t<8> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < 8; i++) { const auto vi = _mat[i] * data_[inds[i]]; val_re += std::real(vi * std::conj(vi)); } }; areg_t<3> qubits_arr = {{qubits[0], qubits[1], qubits[2]}}; return std::real(apply_reduction_lambda(lambda, qubits_arr, convert(mat))); } case 4: { // Lambda function for 4-qubit matrix norm auto lambda = [&](const areg_t<16> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < 16; i++) { const auto vi = _mat[i] * data_[inds[i]]; val_re += std::real(vi * std::conj(vi)); } }; areg_t<4> qubits_arr = {{qubits[0], qubits[1], qubits[2], qubits[3]}}; return std::real(apply_reduction_lambda(lambda, qubits_arr, convert(mat))); } default: { // Lambda function for N-qubit matrix norm const uint_t DIM = BITS[N]; auto lambda = [&](const indexes_t &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused for (size_t i = 0; i < DIM; i++) { const auto vi = _mat[i] * data_[inds[i]]; val_re += std::real(vi * std::conj(vi)); } }; // Use the lambda function return std::real(apply_reduction_lambda(lambda, qubits, convert(mat))); } } // end switch } //------------------------------------------------------------------------------ // Single-qubit specialization //------------------------------------------------------------------------------ template double QubitVector::norm(const uint_t qubit, const cvector_t &mat) const { // Error handling #ifdef DEBUG check_vector(mat, 2); #endif // Check if input matrix is diagonal, and if so use diagonal function. if (mat[1] == 0.0 && mat[2] == 0.0) { const cvector_t diag = {{mat[0], mat[3]}}; return norm_diagonal(qubit, diag); } // Lambda function for norm reduction to real value. auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused const auto v0 = _mat[0] * data_[inds[0]] + _mat[2] * data_[inds[1]]; const auto v1 = _mat[1] * data_[inds[0]] + _mat[3] * data_[inds[1]]; val_re += std::real(v0 * std::conj(v0)) + std::real(v1 * std::conj(v1)); }; return std::real(apply_reduction_lambda(lambda, areg_t<1>({{qubit}}), convert(mat))); } template double QubitVector::norm_diagonal(const uint_t qubit, const cvector_t &mat) const { // Error handling #ifdef DEBUG check_vector(mat, 1); #endif // Lambda function for norm reduction to real value. auto lambda = [&](const areg_t<2> &inds, const cvector_t &_mat, double &val_re, double &val_im)->void { (void)val_im; // unused const auto v0 = _mat[0] * data_[inds[0]]; const auto v1 = _mat[1] * data_[inds[1]]; val_re += std::real(v0 * std::conj(v0)) + std::real(v1 * std::conj(v1)); }; return std::real(apply_reduction_lambda(lambda, areg_t<1>({{qubit}}), convert(mat))); } /******************************************************************************* * * Probabilities * ******************************************************************************/ template double QubitVector::probability(const uint_t outcome) const { return std::real(data_[outcome] * std::conj(data_[outcome])); } template std::vector QubitVector::probabilities() const { const int_t END = 1LL << num_qubits(); std::vector probs(END, 0.); #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t j=0; j < END; j++) { probs[j] = probability(j); } return probs; } template std::vector QubitVector::probabilities(const reg_t &qubits) const { const size_t N = qubits.size(); const int_t DIM = BITS[N]; const int_t END = BITS[num_qubits() - N]; // Error checking #ifdef DEBUG for (const auto &qubit : qubits) check_qubit(qubit); #endif auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); if ((N == num_qubits_) && (qubits == qubits_sorted)) return probabilities(); std::vector probs(DIM, 0.); #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { std::vector probs_private(DIM, 0.); #pragma omp for for (int_t k = 0; k < END; k++) { auto idx = indexes(qubits, qubits_sorted, k); for (int_t m = 0; m < DIM; ++m) { probs_private[m] += probability(idx[m]); } } #pragma omp critical for (int_t m = 0; m < DIM; ++m) { probs[m] += probs_private[m]; } } return probs; } //------------------------------------------------------------------------------ // Sample measure outcomes //------------------------------------------------------------------------------ template reg_t QubitVector::sample_measure(const std::vector &rnds) const { const int_t END = 1LL << num_qubits(); const int_t SHOTS = rnds.size(); reg_t samples; samples.assign(SHOTS, 0); const int INDEX_SIZE = sample_measure_index_size_; const int_t INDEX_END = BITS[INDEX_SIZE]; // Qubit number is below index size, loop over shots if (END < INDEX_END) { #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { #pragma omp for for (int_t i = 0; i < SHOTS; ++i) { double rnd = rnds[i]; double p = .0; int_t sample; for (sample = 0; sample < END - 1; ++sample) { p += probability(sample); if (rnd < p) break; } samples[i] = sample; } } // end omp parallel } // Qubit number is above index size, loop over index blocks else { // Initialize indexes std::vector idxs; idxs.assign(INDEX_END, 0.0); uint_t loop = (END >> INDEX_SIZE); #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { #pragma omp for for (int_t i = 0; i < INDEX_END; ++i) { uint_t base = loop * i; double total = .0; double p = .0; for (uint_t j = 0; j < loop; ++j) { uint_t k = base | j; p = probability(k); total += p; } idxs[i] = total; } } // end omp parallel #pragma omp parallel if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) { #pragma omp for for (int_t i = 0; i < SHOTS; ++i) { double rnd = rnds[i]; double p = .0; int_t sample = 0; for (uint_t j = 0; j < idxs.size(); ++j) { if (rnd < (p + idxs[j])) { break; } p += idxs[j]; sample += loop; } for (; sample < END - 1; ++sample) { p += probability(sample); if (rnd < p){ break; } } samples[i] = sample; } } // end omp parallel } return samples; } //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::QubitVector&qv) { out << "["; size_t last = qv.size() - 1; for (size_t i = 0; i < qv.size(); ++i) { out << qv[i]; if (i != last) out << ", "; } out << "]"; return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/simulators/statevector/qubitvector_thrust.hpp000066400000000000000000003366171362723322000256320ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_qubit_vector_thrust_hpp_ #define _qv_qubit_vector_thrust_hpp_ #ifdef AER_THRUST_CUDA #include #include #endif #include #include #include #include #include #include #include #include #include #include #ifdef AER_THRUST_CUDA #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "framework/json.hpp" #ifdef AER_TIMING #include double mysecond() { struct timeval tp; struct timezone tzp; int i; i = gettimeofday(&tp,&tzp); return ( (double) tp.tv_sec + (double) tp.tv_usec * 1.e-6 ); } #define QS_NUM_GATES 5 #define QS_GATE_INIT 0 #define QS_GATE_MULT 1 #define QS_GATE_CX 2 #define QS_GATE_DIAG 3 #define QS_GATE_MEASURE 4 #endif #define AER_DEFAULT_MATRIX_BITS 8 #define AER_CHUNK_BITS 21 #define AER_MAX_BUFFERS 2 namespace QV { // Type aliases using uint_t = uint64_t; using int_t = int64_t; using reg_t = std::vector; using indexes_t = std::unique_ptr; template using areg_t = std::array; template using cvector_t = std::vector>; //================================== // parameters for gate kernels //================================== template struct GateParams { thrust::complex* buf_; uint_t* offsets_; thrust::complex* matrix_; uint_t* params_; uint_t gid_; uint_t lmask_; }; //======================================== // base class of gate functions //======================================== class GateFuncBase { public: GateFuncBase(void) { } virtual bool IsDiagonal(void) { return false; } virtual int NumControlBits(void) { return 0; } virtual int ControlMask(void) { return 1; } virtual bool Reduction(void) { return false; } virtual const char* Name(void) { return "base function"; } }; //============================================================= // virtual buffer class //============================================================= template class QubitVectorBuffer { protected: uint_t m_size; public: QubitVectorBuffer(uint_t size = 0) { m_size = size; } uint_t Size(void) { return m_size; } virtual data_t* BufferPtr(void) { return NULL; } virtual void Set(uint_t i,const data_t& t) = 0; virtual data_t Get(uint_t i) const = 0; virtual void Resize(uint_t size) = 0; virtual void Copy(const std::vector& v) = 0; virtual void Copy(uint_t pos,QubitVectorBuffer* pSrc,uint_t srcPos,uint_t size,int isDevice = 0) = 0; virtual void CopyIn(uint_t pos,const data_t* pSrc,uint_t size) = 0; virtual void CopyOut(uint_t pos,data_t* pDest,uint_t size) = 0; }; #ifdef AER_THRUST_CUDA #define AERDeviceVector thrust::device_vector #else #define AERDeviceVector thrust::host_vector #endif template class QubitVectorDeviceBuffer : public QubitVectorBuffer { protected: AERDeviceVector m_Buffer; public: QubitVectorDeviceBuffer(uint_t size) : m_Buffer(size) { ; } AERDeviceVector& Buffer(void) { return m_Buffer; } data_t* BufferPtr(void) { return (data_t*)thrust::raw_pointer_cast(m_Buffer.data()); } void Set(uint_t i,const data_t& t) { m_Buffer[i] = t; } data_t Get(uint_t i) const { return m_Buffer[i]; } void Resize(uint_t size) { if(QubitVectorBuffer::m_size != size){ m_Buffer.resize(size); QubitVectorBuffer::m_size = size; } } void Copy(const std::vector& v) { m_Buffer = v; } void Copy(uint_t pos,QubitVectorBuffer* pSrc,uint_t srcPos,uint_t size,int isDevice = 1); void CopyIn(uint_t pos,const data_t* pSrc,uint_t size); void CopyOut(uint_t pos,data_t* pDest,uint_t size); }; template class QubitVectorHostBuffer : public QubitVectorBuffer { protected: thrust::host_vector m_Buffer; public: QubitVectorHostBuffer(uint_t size) : m_Buffer(size) { ; } thrust::host_vector& Buffer(void) { return m_Buffer; } data_t* BufferPtr(void) { return (data_t*)thrust::raw_pointer_cast(&m_Buffer[0]); } void Set(uint_t i,const data_t& t) { m_Buffer[i] = t; } data_t Get(uint_t i) const { return m_Buffer[i]; } void Resize(uint_t size) { if(QubitVectorBuffer::m_size != size){ m_Buffer.resize(size); QubitVectorBuffer::m_size = size; } } void Copy(const std::vector& v) { m_Buffer = v; } void Copy(uint_t pos,QubitVectorBuffer* pSrc,uint_t srcPos,uint_t size,int isDevice = 0); void CopyIn(uint_t pos,const data_t* pSrc,uint_t size); void CopyOut(uint_t pos,data_t* pDest,uint_t size); }; template void QubitVectorDeviceBuffer::Copy(uint_t pos,QubitVectorBuffer* pSrc,uint_t srcPos,uint_t size,int isDevice) { if(isDevice){ QubitVectorDeviceBuffer* pSrcDev = (QubitVectorDeviceBuffer*)pSrc; thrust::copy_n(pSrcDev->Buffer().begin() + srcPos,size,m_Buffer.begin() + pos); } else{ QubitVectorHostBuffer* pSrcHost = (QubitVectorHostBuffer*)pSrc; thrust::copy_n(pSrcHost->Buffer().begin() + srcPos,size,m_Buffer.begin() + pos); } } template void QubitVectorDeviceBuffer::CopyIn(uint_t pos,const data_t* pSrc,uint_t size) { thrust::copy_n(pSrc,size,m_Buffer.begin() + pos); } template void QubitVectorDeviceBuffer::CopyOut(uint_t pos,data_t* pDest,uint_t size) { thrust::copy_n(m_Buffer.begin() + pos,size,pDest); } template void QubitVectorHostBuffer::Copy(uint_t pos,QubitVectorBuffer* pSrc,uint_t srcPos,uint_t size,int isDevice) { if(isDevice){ QubitVectorDeviceBuffer* pSrcDev = (QubitVectorDeviceBuffer*)pSrc; thrust::copy_n(pSrcDev->Buffer().begin() + srcPos,size,m_Buffer.begin() + pos); } else{ QubitVectorHostBuffer* pSrcHost = (QubitVectorHostBuffer*)pSrc; thrust::copy_n(pSrcHost->Buffer().begin() + srcPos,size,m_Buffer.begin() + pos); } } template void QubitVectorHostBuffer::CopyIn(uint_t pos,const data_t* pSrc,uint_t size) { thrust::copy_n(pSrc,size,m_Buffer.begin() + pos); } template void QubitVectorHostBuffer::CopyOut(uint_t pos,data_t* pDest,uint_t size) { thrust::copy_n(m_Buffer.begin() + pos,size,pDest); } //============================================================= // chunk container class //============================================================= template class QubitVectorChunkContainer { protected: QubitVectorBuffer>* m_pChunks; QubitVectorBuffer>* m_pMatrix; QubitVectorBuffer* m_pOffsets; QubitVectorBuffer* m_pParams; uint_t m_size; uint_t m_bufferSize; uint_t m_globalID; int m_iDevice; //device ID : if device ID < 0, allocate chunks on host memory int m_matrixBits; std::vector m_p2pEnable; public: QubitVectorChunkContainer(void) { m_pChunks = NULL; m_pMatrix = NULL; m_pOffsets = NULL; m_pParams = NULL; m_size = 0; m_bufferSize = 0; m_matrixBits = 0; m_iDevice = -1; m_globalID = 0; } ~QubitVectorChunkContainer(void); void SetDevice(int iDev) { m_iDevice = iDev; } void SetGlobalIndex(uint_t idx) { m_globalID = idx; } uint_t GlobalIndex(void) { return m_globalID; } uint_t NumChunks(int chunkBits) const { return (m_size >> chunkBits); } uint_t ChunkID(uint_t id,int chunkBits) const { return (m_globalID >> chunkBits) + id; } uint_t LocalChunkID(uint_t id,int chunkBits) const { return id - (m_globalID >> chunkBits); } int DeviceID(void) const { return m_iDevice; } uint_t Size(void) { return m_size; } int Allocate(uint_t size,uint_t bufferSize = 0); int AllocateParameters(int bits); int Get(const QubitVectorChunkContainer& chunks,uint_t src,uint_t bufDest,int chunkBits); int Put(QubitVectorChunkContainer& chunks,uint_t dest,uint_t bufSrc,int chunkBits); int CopyIn(const thrust::complex* pVec,uint_t offset,uint_t chunkID,int chunkBits); int CopyOut(thrust::complex* pVec,uint_t offset,uint_t chunkID,int chunkBits); int SetState(uint_t chunkID,uint_t pos,thrust::complex t,int chunkBits); int SetState(uint_t lid,thrust::complex t); thrust::complex GetState(uint_t chunkID,uint_t pos,int chunkBits) const; thrust::complex GetState(uint_t lid) const; thrust::complex* ChunkPtr(uint_t chunkID,int chunkBits) const; thrust::complex* BufferPtr(uint_t ibuf,int chunkBits); void StoreMatrix(const std::vector>& mat); void StoreUintParams(const std::vector& prm); void StoreOffsets(const std::vector& ptr); template int Execute(std::vector& offsets,Function func,uint_t size,uint_t gid,uint_t localMask, bool omp_parallel); template double ExecuteSum(std::vector& offsets,Function func,uint_t size,uint_t gid, uint_t localMask, bool omp_parallel); void SetParams(struct GateParams& params); void SetupP2P(int nDev); }; template QubitVectorChunkContainer::~QubitVectorChunkContainer(void) { if(m_pChunks){ delete m_pChunks; } if(m_pMatrix){ delete m_pMatrix; } if(m_pOffsets){ delete m_pOffsets; } if(m_pParams){ delete m_pParams; } } //allocate buffer for chunks template int QubitVectorChunkContainer::Allocate(uint_t size_in,uint_t bufferSize) { uint_t size = size_in + bufferSize; m_size = size_in; m_bufferSize = bufferSize; if(m_pChunks == NULL){ #ifdef AER_THRUST_CUDA if(m_iDevice >= 0){ cudaSetDevice(m_iDevice); m_pChunks = new QubitVectorDeviceBuffer>(size); } else{ #endif m_pChunks = new QubitVectorHostBuffer>(size); #ifdef AER_THRUST_CUDA } #endif } else if(m_pChunks->Size() != size){ if(m_iDevice >= 0){ #ifdef AER_THRUST_CUDA cudaSetDevice(m_iDevice); #endif } m_pChunks->Resize(size); } return 0; } //allocate buffers for parameters template int QubitVectorChunkContainer::AllocateParameters(int bits) { uint_t size; if(bits > m_matrixBits){ size = 1ull << bits; if(m_iDevice >= 0){ #ifdef AER_THRUST_CUDA cudaSetDevice(m_iDevice); #endif } if(m_pMatrix == NULL){ #ifdef AER_THRUST_CUDA if(m_iDevice >= 0){ m_pMatrix = new QubitVectorDeviceBuffer>(size*size); } else{ #endif m_pMatrix = new QubitVectorHostBuffer>(size*size); #ifdef AER_THRUST_CUDA } #endif } else{ m_pMatrix->Resize(size*size); } if(m_pOffsets == NULL){ #ifdef AER_THRUST_CUDA if(m_iDevice >= 0){ m_pOffsets = new QubitVectorDeviceBuffer(size); } else{ #endif m_pOffsets = new QubitVectorHostBuffer(size); #ifdef AER_THRUST_CUDA } #endif } else{ m_pOffsets->Resize(size); } if(m_pParams == NULL){ #ifdef AER_THRUST_CUDA if(m_iDevice >= 0){ m_pParams = new QubitVectorDeviceBuffer(size*4); } else{ #endif m_pParams = new QubitVectorHostBuffer(size*4); #ifdef AER_THRUST_CUDA } #endif } else{ m_pParams->Resize(size*4); } m_matrixBits = bits; } return 0; } //copy chunk from other container to buffer template int QubitVectorChunkContainer::Get(const QubitVectorChunkContainer& chunks,uint_t src,uint_t bufDest,int chunkBits) { uint_t srcPos,destPos,size; srcPos = src << chunkBits; destPos = m_size + (bufDest << chunkBits); size = 1ull << chunkBits; if(m_iDevice >=0 && chunks.DeviceID() >= 0){ if(m_p2pEnable[chunks.DeviceID()]){ m_pChunks->Copy(destPos,chunks.m_pChunks,srcPos,size,1); } else{ QubitVectorHostBuffer> tmp(size); tmp.Copy(0,chunks.m_pChunks,srcPos,size,1); //D to H m_pChunks->Copy(destPos,&tmp,0,size,0); //H to D } } else{ m_pChunks->Copy(destPos,chunks.m_pChunks,srcPos,size,(chunks.DeviceID() >= 0)); } return 0; } //copy chunk to other container from buffer template int QubitVectorChunkContainer::Put(QubitVectorChunkContainer& chunks,uint_t dest,uint_t bufSrc,int chunkBits) { uint_t srcPos,destPos,size; destPos = dest << chunkBits; srcPos = m_size + (bufSrc << chunkBits); size = 1ull << chunkBits; if(m_iDevice >=0 && chunks.DeviceID() >= 0){ if(m_p2pEnable[chunks.DeviceID()]){ chunks.m_pChunks->Copy(destPos,m_pChunks,srcPos,size,1); } else{ QubitVectorHostBuffer> tmp(size); tmp.Copy(0,m_pChunks,srcPos,size,1); //D to H chunks.m_pChunks->Copy(destPos,&tmp,0,size,0); //H to D } } else{ chunks.m_pChunks->Copy(destPos,m_pChunks,srcPos,size,(DeviceID() >= 0)); } return 0; } //copy chunk from std::vector template int QubitVectorChunkContainer::CopyIn(const thrust::complex* pVec,uint_t offset,uint_t chunkID,int chunkBits) { uint_t size,destPos; size = 1ull << chunkBits; destPos = chunkID << chunkBits; m_pChunks->CopyIn(destPos,pVec + offset,size); return 0; } //copy chunk to std::vector template int QubitVectorChunkContainer::CopyOut(thrust::complex* pVec,uint_t offset,uint_t chunkID,int chunkBits) { uint_t size,srcPos; size = 1ull << chunkBits; srcPos = chunkID << chunkBits; m_pChunks->CopyOut(srcPos,pVec + offset,size); return 0; } template thrust::complex* QubitVectorChunkContainer::ChunkPtr(uint_t chunkID,int chunkBits) const { return m_pChunks->BufferPtr() + (chunkID << chunkBits); } template thrust::complex* QubitVectorChunkContainer::BufferPtr(uint_t ibuf,int chunkBits) { return m_pChunks->BufferPtr() + m_size + (ibuf << chunkBits); } template int QubitVectorChunkContainer::SetState(uint_t chunkID,uint_t pos,thrust::complex t,int chunkBits) { m_pChunks->Set((chunkID << chunkBits) + pos,t); return 0; } template int QubitVectorChunkContainer::SetState(uint_t lid,thrust::complex t) { m_pChunks->Set(lid,t); return 0; } template thrust::complex QubitVectorChunkContainer::GetState(uint_t chunkID,uint_t pos,int chunkBits) const { return m_pChunks->Get((chunkID << chunkBits) + pos); } template thrust::complex QubitVectorChunkContainer::GetState(uint_t lid) const { return m_pChunks->Get(lid); } template void QubitVectorChunkContainer::StoreMatrix(const std::vector>& mat) { m_pMatrix->Copy(mat); } template void QubitVectorChunkContainer::StoreUintParams(const std::vector& prm) { m_pParams->Copy(prm); } template void QubitVectorChunkContainer::StoreOffsets(const std::vector& offsets) { m_pOffsets->Copy(offsets); } #define ExtractIndexFromTuple(itp) thrust::get<0>(itp) #define ExtractParamsFromTuple(itp) thrust::get<1>(itp) template template int QubitVectorChunkContainer::Execute(std::vector& offsets,Function func,uint_t size,uint_t gid,uint_t localMask, bool omp_parallel) { struct GateParams params; params.buf_ = m_pChunks->BufferPtr(); if(m_iDevice >= 0){ StoreOffsets(offsets); params.offsets_ = m_pOffsets->BufferPtr(); } else{ params.offsets_ = &offsets[0]; } params.matrix_ = m_pMatrix->BufferPtr(); params.params_ = m_pParams->BufferPtr(); params.gid_ = gid; params.lmask_ = localMask; auto ci = thrust::counting_iterator(0); thrust::constant_iterator> cp(params); auto chunkTuple = thrust::make_tuple(ci,cp); auto chunkIter = thrust::make_zip_iterator(chunkTuple); if(m_iDevice >= 0){ #ifdef AER_THRUST_CUDA cudaSetDevice(m_iDevice); #endif thrust::for_each_n(thrust::device, chunkIter, size, func); } else{ if (omp_parallel) { thrust::for_each_n(thrust::omp::par, chunkIter, size, func); } else { thrust::for_each_n(thrust::seq, chunkIter, size, func); } } return 0; } template template double QubitVectorChunkContainer::ExecuteSum(std::vector& offsets,Function func,uint_t size,uint_t gid,uint_t localMask, bool omp_parallel) { struct GateParams params; double ret; params.buf_ = m_pChunks->BufferPtr(); if(m_iDevice >= 0){ StoreOffsets(offsets); params.offsets_ = m_pOffsets->BufferPtr(); } else{ params.offsets_ = &offsets[0]; } params.matrix_ = m_pMatrix->BufferPtr(); params.params_ = m_pParams->BufferPtr(); params.gid_ = gid; params.lmask_ = localMask; auto ci = thrust::counting_iterator(0); thrust::constant_iterator> cp(params); auto chunkTuple = thrust::make_tuple(ci,cp); auto chunkIter = thrust::make_zip_iterator(chunkTuple); if(m_iDevice >= 0){ #ifdef AER_THRUST_CUDA cudaSetDevice(m_iDevice); #endif ret = thrust::transform_reduce(thrust::device, chunkIter, chunkIter + size, func,0.0,thrust::plus()); } else{ if (omp_parallel) { ret = thrust::transform_reduce(thrust::omp::par, chunkIter, chunkIter + size, func,0.0,thrust::plus()); } else { ret = thrust::transform_reduce(thrust::seq, chunkIter, chunkIter + size, func,0.0,thrust::plus()); } } return ret; } template void QubitVectorChunkContainer::SetParams(struct GateParams& params) { params.buf_ = m_pChunks->BufferPtr(); params.offsets_ = m_pOffsets->BufferPtr(); params.matrix_ = m_pMatrix->BufferPtr(); params.params_ = m_pParams->BufferPtr(); } template void QubitVectorChunkContainer::SetupP2P(int nDev) { int i; if(nDev > 0){ m_p2pEnable.resize(nDev); if(m_iDevice >= 0){ for(i=0;i) // If the template argument does not have these methods then template // specialization must be used to override the default implementations. template class QubitVectorThrust { public: //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- QubitVectorThrust(); explicit QubitVectorThrust(size_t num_qubits); virtual ~QubitVectorThrust(); QubitVectorThrust(const QubitVectorThrust& obj) = delete; QubitVectorThrust &operator=(const QubitVectorThrust& obj) = delete; //----------------------------------------------------------------------- // Data access //----------------------------------------------------------------------- // Element access std::complex &operator[](uint_t element); std::complex operator[](uint_t element) const; void set_state(uint_t pos,std::complex& c); std::complex get_state(uint_t pos) const; // Returns a reference to the underlying data_t data class std::complex* &data() {return data_;} // Returns a copy of the underlying data_t data class std::complex* data() const {return data_;} //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Return the string name of the QubitVector class #ifdef AER_THRUST_CUDA static std::string name() {return "statevector_gpu";} #else static std::string name() {return "statevector_thrust";} #endif // Set the size of the vector in terms of qubit number virtual void set_num_qubits(size_t num_qubits); // Returns the number of qubits for the current vector virtual uint_t num_qubits() const {return num_qubits_;} // Returns the size of the underlying n-qubit vector uint_t size() const {return data_size_;} // Returns required memory size_t required_memory_mb(uint_t num_qubits) const; // Returns a copy of the underlying data_t data as a complex vector cvector_t vector() const; // Return JSON serialization of QubitVectorThrust; json_t json() const; // Set all entries in the vector to 0. void zero(); // State initialization of a component // Initialize the specified qubits to a desired statevector // (leaving the other qubits in their current state) // assuming the qubits being initialized have already been reset to the zero state // (using apply_reset) void initialize_component(const reg_t &qubits, const cvector_t &state); //----------------------------------------------------------------------- // Check point operations //----------------------------------------------------------------------- // Create a checkpoint of the current state void checkpoint(); // Revert to the checkpoint void revert(bool keep); // Compute the inner product of current state with checkpoint state std::complex inner_product() const; //----------------------------------------------------------------------- // Initialization //----------------------------------------------------------------------- // Initializes the current vector so that all qubits are in the |0> state. void initialize(); // Initializes the vector to a custom initial state. // If the length of the data vector does not match the number of qubits // an exception is raised. void initialize_from_vector(const cvector_t &data); // Initializes the vector to a custom initial state. // If num_states does not match the number of qubits an exception is raised. void initialize_from_data(const std::complex* data, const size_t num_states); //----------------------------------------------------------------------- // Apply Matrices //----------------------------------------------------------------------- // Apply a 1-qubit matrix to the state vector. // The matrix is input as vector of the column-major vectorized 1-qubit matrix. void apply_matrix(const uint_t qubit, const cvector_t &mat); // Apply a N-qubit matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. void apply_matrix(const reg_t &qubits, const cvector_t &mat); // Apply a stacked set of 2^control_count target_count--qubit matrix to the state vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. void apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const cvector_t &mat); // Apply a 1-qubit diagonal matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_matrix(const uint_t qubit, const cvector_t &mat); // Apply a N-qubit diagonal matrix to the state vector. // The matrix is input as vector of the matrix diagonal. void apply_diagonal_matrix(const reg_t &qubits, const cvector_t &mat); // Swap pairs of indicies in the underlying vector void apply_permutation_matrix(const reg_t &qubits, const std::vector> &pairs); //----------------------------------------------------------------------- // Apply Specialized Gates //----------------------------------------------------------------------- // Apply a general N-qubit multi-controlled X-gate // If N=1 this implements an optimized X gate // If N=2 this implements an optimized CX gate // If N=3 this implements an optimized Toffoli gate void apply_mcx(const reg_t &qubits); // Apply a general multi-controlled Y-gate // If N=1 this implements an optimized Y gate // If N=2 this implements an optimized CY gate // If N=3 this implements an optimized CCY gate void apply_mcy(const reg_t &qubits); // Apply a general multi-controlled single-qubit phase gate // with diagonal [1, ..., 1, phase] // If N=1 this implements an optimized single-qubit phase gate // If N=2 this implements an optimized CPhase gate // If N=3 this implements an optimized CCPhase gate // if phase = -1 this is a Z, CZ, CCZ gate void apply_mcphase(const reg_t &qubits, const std::complex phase); // Apply a general multi-controlled single-qubit unitary gate // If N=1 this implements an optimized single-qubit U gate // If N=2 this implements an optimized CU gate // If N=3 this implements an optimized CCU gate void apply_mcu(const reg_t &qubits, const cvector_t &mat); // Apply a general multi-controlled SWAP gate // If N=2 this implements an optimized SWAP gate // If N=3 this implements an optimized Fredkin gate void apply_mcswap(const reg_t &qubits); //----------------------------------------------------------------------- // Z-measurement outcome probabilities //----------------------------------------------------------------------- // Return the Z-basis measurement outcome probability P(outcome) for // outcome in [0, 2^num_qubits - 1] virtual double probability(const uint_t outcome) const; // Return the probabilities for all measurement outcomes in the current vector // This is equivalent to returning a new vector with new[i]=|orig[i]|^2. // Eg. For 2-qubits this is [P(00), P(01), P(010), P(11)] virtual std::vector probabilities() const; // Return the Z-basis measurement outcome probabilities [P(0), ..., P(2^N-1)] // for measurement of N-qubits. virtual std::vector probabilities(const reg_t &qubits) const; // Return M sampled outcomes for Z-basis measurement of all qubits // The input is a length M list of random reals between [0, 1) used for // generating samples. virtual reg_t sample_measure(const std::vector &rnds) const; //----------------------------------------------------------------------- // Norms //----------------------------------------------------------------------- // Returns the norm of the current vector double norm() const; // These functions return the norm obtained by // applying a matrix A to the vector. It is equivalent to returning the // expectation value of A^\dagger A, and could probably be removed because // of this. // Return the norm for of the vector obtained after apply the 1-qubit // matrix mat to the vector. // The matrix is input as vector of the column-major vectorized 1-qubit matrix. double norm(const uint_t qubit, const cvector_t &mat) const; // Return the norm for of the vector obtained after apply the N-qubit // matrix mat to the vector. // The matrix is input as vector of the column-major vectorized N-qubit matrix. double norm(const reg_t &qubits, const cvector_t &mat) const; // Return the norm for of the vector obtained after apply the 1-qubit // diagonal matrix mat to the vector. // The matrix is input as vector of the matrix diagonal. double norm_diagonal(const uint_t qubit, const cvector_t &mat) const; // Return the norm for of the vector obtained after apply the N-qubit // diagonal matrix mat to the vector. // The matrix is input as vector of the matrix diagonal. double norm_diagonal(const reg_t &qubits, const cvector_t &mat) const; //----------------------------------------------------------------------- // JSON configuration settings //----------------------------------------------------------------------- // Set the threshold for chopping values to 0 in JSON void set_json_chop_threshold(double threshold); // Set the threshold for chopping values to 0 in JSON double get_json_chop_threshold() {return json_chop_threshold_;} //----------------------------------------------------------------------- // OpenMP configuration settings //----------------------------------------------------------------------- // Set the maximum number of OpenMP thread for operations. void set_omp_threads(int n); // Get the maximum number of OpenMP thread for operations. uint_t get_omp_threads() {return omp_threads_;} // Set the qubit threshold for activating OpenMP. // If self.qubits() > threshold OpenMP will be activated. void set_omp_threshold(int n); // Get the qubit threshold for activating OpenMP. uint_t get_omp_threshold() {return omp_threshold_;} //----------------------------------------------------------------------- // Optimization configuration settings //----------------------------------------------------------------------- // Set the sample_measure index size void set_sample_measure_index_size(int n) {sample_measure_index_size_ = n;} // Get the sample_measure index size int get_sample_measure_index_size() {return sample_measure_index_size_;} protected: //----------------------------------------------------------------------- // Protected data members //----------------------------------------------------------------------- size_t num_qubits_; size_t data_size_; std::complex* data_; //this is allocated on host for reference std::complex* checkpoint_; //----------------------------------------------------------------------- // Config settings //----------------------------------------------------------------------- uint_t omp_threads_ = 1; // Disable multithreading by default uint_t omp_threshold_ = 14; // Qubit threshold for multithreading when enabled int sample_measure_index_size_ = 10; // Sample measure indexing qubit size double json_chop_threshold_ = 0; // Threshold for choping small values // in JSON serialization //----------------------------------------------------------------------- // Error Messages //----------------------------------------------------------------------- void check_qubit(const uint_t qubit) const; void check_vector(const cvector_t &diag, uint_t nqubits) const; void check_matrix(const cvector_t &mat, uint_t nqubits) const; void check_dimension(const QubitVectorThrust &qv) const; void check_checkpoint() const; //----------------------------------------------------------------------- // Statevector update with Lambda function //----------------------------------------------------------------------- template double apply_function(Function func,const reg_t &qubits) const; void set_matrix(const cvector_t& mat) const; void set_params(const reg_t& prm) const; void allocate_buffers(int qubit); int m_iDev; int m_nDev; int m_nDevParallel; int m_iPlaceHost; int m_nPlaces; mutable std::vector> m_Chunks; int m_maxChunkBits; //bits per chunk uint_t m_globalSize; //number of total states uint_t m_localSize; //number of states in this process uint_t m_globalIndex; //starting state ID for this process int m_maxNumBuffers; //max number of buffer chunks mutable uint_t m_refPosition; //position for reference (if >= data_size_ data_ is empty) int FindPlace(uint_t chunkID,int chunkBits) const; int GlobalToLocal(uint_t& lcid,uint_t& lid,uint_t gid,int chunkBits) const; uint_t GetBaseChunkID(const uint_t gid,const reg_t& qubits,const int chunkBits) const; void UpdateReferencedValue(void) const; #ifdef AER_TIMING mutable uint_t m_gateCounts[QS_NUM_GATES]; mutable double m_gateTime[QS_NUM_GATES]; mutable double m_gateStartTime[QS_NUM_GATES]; void TimeStart(int i) const; void TimeEnd(int i) const; void TimeReset(void); void TimePrint(void); #endif #ifdef AER_DEBUG //for debugging mutable FILE* debug_fp; mutable uint_t debug_count; void DebugMsg(const char* str,const reg_t &qubits) const; void DebugMsg(const char* str,const int qubit) const; void DebugMsg(const char* str) const; void DebugMsg(const char* str,const std::complex c) const; void DebugMsg(const char* str,const double d) const; void DebugMsg(const char* str,const std::vector& v) const; void DebugDump(void) const; #endif }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // JSON Serialization //------------------------------------------------------------------------------ template inline void to_json(json_t &js, const QubitVectorThrust &qv) { js = qv.json(); } template json_t QubitVectorThrust::json() const { int iPlace; uint_t i,ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; cvector_t tmp(csize); const json_t ZERO = std::complex(0.0, 0.0); json_t js = json_t(data_size_, ZERO); #ifdef AER_DEBUG DebugMsg("json()"); #endif UpdateReferencedValue(); for(iPlace=0;iPlace*)&tmp[0],0,ic,m_maxChunkBits); if (json_chop_threshold_ > 0) { for(i=0;i json_chop_threshold_) js[pos+i][0] = tmp[i].real(); if (std::abs(tmp[i].imag()) > json_chop_threshold_) js[pos+i][1] = tmp[i].imag(); } } else{ for(i=0;i void QubitVectorThrust::check_qubit(const uint_t qubit) const { if (qubit + 1 > num_qubits_) { std::string error = "QubitVectorThrust: qubit index " + std::to_string(qubit) + " > " + std::to_string(num_qubits_); throw std::runtime_error(error); } } template void QubitVectorThrust::check_matrix(const cvector_t &vec, uint_t nqubits) const { const size_t DIM = 1ull << nqubits; const auto SIZE = vec.size(); if (SIZE != DIM * DIM) { std::string error = "QubitVectorThrust: vector size is " + std::to_string(SIZE) + " != " + std::to_string(DIM * DIM); throw std::runtime_error(error); } } template void QubitVectorThrust::check_vector(const cvector_t &vec, uint_t nqubits) const { const size_t DIM = 1ull << nqubits; const auto SIZE = vec.size(); if (SIZE != DIM) { std::string error = "QubitVectorThrust: vector size is " + std::to_string(SIZE) + " != " + std::to_string(DIM); throw std::runtime_error(error); } } template void QubitVectorThrust::check_dimension(const QubitVectorThrust &qv) const { if (data_size_ != qv.size_) { std::string error = "QubitVectorThrust: vectors are different shape " + std::to_string(data_size_) + " != " + std::to_string(qv.num_states_); throw std::runtime_error(error); } } template void QubitVectorThrust::check_checkpoint() const { if (!checkpoint_) { throw std::runtime_error("QubitVectorThrust: checkpoint must exist for inner_product() or revert()"); } } //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template QubitVectorThrust::QubitVectorThrust(size_t num_qubits) : num_qubits_(0), data_(nullptr), checkpoint_(0) { #ifdef AER_DEBUG debug_fp = NULL; debug_count = 0; #endif if(num_qubits != 0){ set_num_qubits(num_qubits); } } template QubitVectorThrust::QubitVectorThrust() : QubitVectorThrust(0) { } template QubitVectorThrust::~QubitVectorThrust() { #ifdef AER_TIMING TimePrint(); #endif // m_DeviceChunks.erase(m_DeviceChunks.begin(),m_DeviceChunks.end()); if(data_) free(data_); if (checkpoint_) free(checkpoint_); #ifdef AER_DEBUG if(debug_fp != NULL){ fflush(debug_fp); if(debug_fp != stdout) fclose(debug_fp); } #endif } //------------------------------------------------------------------------------ // Element access operators //------------------------------------------------------------------------------ template std::complex &QubitVectorThrust::operator[](uint_t element) { // Error checking #ifdef DEBUG if (element > data_size_) { std::string error = "QubitVectorThrust: vector index " + std::to_string(element) + " > " + std::to_string(data_size_); throw std::runtime_error(error); } #endif uint_t lcid,lid; int iPlace = GlobalToLocal(lcid,lid,element,m_maxChunkBits); #ifdef AER_DEBUG DebugMsg(" calling ref []"); #endif UpdateReferencedValue(); if(iPlace >= 0){ data_[0] = (std::complex)m_Chunks[iPlace].GetState(lcid,lid,m_maxChunkBits); m_refPosition = element; } else{ data_[0] = 0.0; m_refPosition = data_size_; } #ifdef AER_DEBUG DebugMsg("ref operator[]",(int)element); DebugMsg(" ",data_[0]); DebugDump(); #endif return data_[0]; } template void QubitVectorThrust::UpdateReferencedValue(void) const { if(m_refPosition < data_size_){ uint_t lcid,lid; int iPlace = GlobalToLocal(lcid,lid,m_refPosition,m_maxChunkBits); if(iPlace >= 0){ m_Chunks[iPlace].SetState(lcid,lid,(thrust::complex)data_[0],m_maxChunkBits); } m_refPosition = data_size_; } } template std::complex QubitVectorThrust::operator[](uint_t element) const { uint_t lcid,lid; int iPlace = GlobalToLocal(lcid,lid,element,m_maxChunkBits); #ifdef AER_DEBUG DebugMsg(" calling []"); #endif UpdateReferencedValue(); if(iPlace >= 0){ std::complex ret; ret = (std::complex)m_Chunks[iPlace].GetState(lcid,lid,m_maxChunkBits); #ifdef AER_DEBUG DebugMsg("operator[]",(int)element); DebugMsg(" ",ret); DebugDump(); #endif return ret; } else{ return data_[0]; } } template void QubitVectorThrust::set_state(uint_t pos, std::complex& c) { uint_t lcid,lid; int iPlace = GlobalToLocal(lcid,lid,pos,m_maxChunkBits); if(iPlace >= 0){ m_Chunks[iPlace].SetState(lcid,lid,(thrust::complex)c,m_maxChunkBits); } } template std::complex QubitVectorThrust::get_state(uint_t pos) const { uint_t lcid,lid; std::complex ret = 0.0;; int iPlace = GlobalToLocal(lcid,lid,pos,m_maxChunkBits); UpdateReferencedValue(); if(iPlace >= 0){ ret = (std::complex)m_Chunks[iPlace].GetState(lcid,lid,m_maxChunkBits); } return ret; } template cvector_t QubitVectorThrust::vector() const { cvector_t ret(data_size_, 0.); int iPlace; uint_t ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; #ifdef AER_DEBUG DebugMsg("vector"); #endif UpdateReferencedValue(); for(iPlace=0;iPlace*)&ret[0],pos,ic,m_maxChunkBits); pos += csize; } } return ret; } //------------------------------------------------------------------------------ // State initialize component //------------------------------------------------------------------------------ template class initialize_component_func : public GateFuncBase { protected: int nqubits; uint_t matSize; public: initialize_component_func(const cvector_t& mat,const reg_t &qb) { nqubits = qb.size(); matSize = 1ull << nqubits; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { thrust::complex* pV; uint_t* offsets; thrust::complex q0; thrust::complex q; thrust::complex* state; uint_t* qubits; uint_t i,j,k; uint_t ii,idx,t; uint_t mask; struct GateParams params; //get parameters from iterator i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; state = params.matrix_; qubits = params.params_; idx = 0; ii = i; for(j=0;j void QubitVectorThrust::initialize_component(const reg_t &qubits, const cvector_t &state0) { auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); set_matrix(state0); set_params(qubits_sorted); apply_function(initialize_component_func(state0,qubits_sorted), qubits); } //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template class fill_func : public GateFuncBase { protected: thrust::complex val; public: fill_func(thrust::complex& v) { val = v; } bool IsDiagonal(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i; thrust::complex* pV; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; pV[i] = val; return 0.0; } const char* Name(void) { return "fill"; } }; template void QubitVectorThrust::zero() { thrust::complex z = 0.0; reg_t qubits = {0}; apply_function(fill_func(z), qubits); } template void QubitVectorThrust::set_num_qubits(size_t num_qubits) { size_t prev_num_qubits = num_qubits_; num_qubits_ = num_qubits; data_size_ = 1ull << num_qubits; char* str; int i; #ifdef AER_TIMING TimeReset(); TimeStart(QS_GATE_INIT); #endif if (checkpoint_) { free(checkpoint_); checkpoint_ = nullptr; } m_refPosition = data_size_; if (!data_) data_ = reinterpret_cast*>(malloc(sizeof(std::complex))); //data_ is only allocated to store reference value // Free any currently assigned memory if(m_Chunks.size() > 0){ if (prev_num_qubits != num_qubits_) { m_Chunks.erase(m_Chunks.begin(),m_Chunks.end()); } } int tid,nid; nid = omp_get_num_threads(); tid = omp_get_thread_num(); m_nDev = 1; #ifdef AER_THRUST_CUDA cudaGetDeviceCount(&m_nDev); #endif m_iDev = 0; if(nid > 1 && m_nDev > 0){ m_iDev = tid % m_nDev; #ifdef AER_THRUST_CUDA cudaSetDevice(m_iDev); #endif m_nDevParallel = 1; } else{ m_nDevParallel = 1; str = getenv("AER_MULTI_GPU"); if(str != NULL){ m_nDevParallel = m_nDev; } } str = getenv("AER_HOST_ONLY"); if(str || m_nDev == 0){ m_nDevParallel = 0; } //chunk setting int numBuffers = AER_MAX_BUFFERS; //uint_t numBuffers = 1; int numDummy = 2; m_maxChunkBits = AER_CHUNK_BITS; str = getenv("AER_CHUNK_BITS"); if(str){ m_maxChunkBits = atol(str); } // else if(m_nDevParallel <= 1){ // m_maxChunkBits = num_qubits_; // } if(m_maxChunkBits > num_qubits_){ m_maxChunkBits = num_qubits_; i = m_nDevParallel; while(i > 1){ m_maxChunkBits--; i >>= 1; } } //currently using only one process m_globalSize = 1ull << num_qubits_; m_localSize = m_globalSize; m_globalIndex = 0; //-- int fitOneGPU = 0; #ifdef AER_THRUST_CUDA if(m_nDevParallel == 1){ size_t freeMem,totalMem; cudaMemGetInfo(&freeMem,&totalMem); if(m_localSize < (freeMem / ((uint_t)sizeof(thrust::complex) )) ){ fitOneGPU = 1; } else{ //need multiple GPUs if(nid <= 1){ m_nDevParallel = m_nDev; } } } #else //for OMP, TBB use 1 device fitOneGPU = 1; omp_set_nested(1); #endif m_Chunks.resize(m_nDevParallel+1); m_nPlaces = m_nDevParallel; m_iPlaceHost = -1; uint_t is,ie,chunksOnDevice = m_localSize >> m_maxChunkBits; str = getenv("AER_TEST_HYBRID"); //use only for debugging if(str != NULL){ chunksOnDevice = chunksOnDevice/2; } else if(fitOneGPU){ m_maxChunkBits = num_qubits_; } if(m_maxChunkBits == num_qubits_){ //no buffer needed for chunk exchange numBuffers = 0; numDummy = 0; chunksOnDevice = 1; } is = 0; for(i=0;i= (freeMem / ((uint_t)sizeof(thrust::complex) << m_maxChunkBits)) ){ ie = is + (freeMem / ((uint_t)sizeof(thrust::complex) << m_maxChunkBits)) - numBuffers - numDummy; } #endif m_Chunks[i].SetGlobalIndex(m_globalIndex + (is << m_maxChunkBits)); #ifdef AER_THRUST_CUDA m_Chunks[i].SetDevice((m_iDev + i) % m_nDev); #else m_Chunks[i].SetDevice(-1); #endif m_Chunks[i].Allocate((ie - is) << m_maxChunkBits,numBuffers << m_maxChunkBits); m_Chunks[i].AllocateParameters(AER_DEFAULT_MATRIX_BITS); m_Chunks[i].SetupP2P(m_nDevParallel); is = ie; } if(is < (m_localSize >> m_maxChunkBits)){ //rest of chunks are stored on host memory m_iPlaceHost = m_nDevParallel; m_nPlaces = m_nDevParallel + 1; m_Chunks[m_iPlaceHost].SetGlobalIndex(m_globalIndex + (is << m_maxChunkBits)); m_Chunks[m_iPlaceHost].SetDevice(-1); m_Chunks[m_iPlaceHost].Allocate(m_localSize - (is << m_maxChunkBits),numBuffers << m_maxChunkBits); m_Chunks[m_iPlaceHost].AllocateParameters(AER_DEFAULT_MATRIX_BITS); m_Chunks[m_iPlaceHost].SetupP2P(m_nDevParallel); //Host execution uses nested parallelizm omp_set_nested(1); } #ifdef AER_TIMING TimeEnd(QS_GATE_INIT); #endif #ifdef AER_DEBUG //TODO Migrate to SpdLog if(debug_fp == NULL && tid == 0){ // char filename[1024]; // sprintf(filename,"logs/debug_%d.txt",getpid()); // debug_fp = fopen(filename,"a"); debug_fp = stdout; fprintf(debug_fp," ==== Thrust qubit vector initialization %d qubits ====\n",num_qubits_); fprintf(debug_fp," TEST : threads %d/%d , dev %d/%d, using %d devices\n",tid,nid,m_iDev,m_nDev,m_nDevParallel); fprintf(debug_fp," TEST : max chunk bit = %d, %d/%d states, gid = %d , numBuffer = %d\n",m_maxChunkBits,m_localSize,m_globalSize,m_globalIndex,numBuffers); fprintf(debug_fp," TEST : "); for(i=0;i= 0){ fprintf(debug_fp," [%d] %d ",m_Chunks[i].DeviceID(),m_Chunks[i].NumChunks(m_maxChunkBits)); } else{ fprintf(debug_fp," [Host] %d ",m_Chunks[i].NumChunks(m_maxChunkBits)); } } fprintf(debug_fp,"\n"); } #endif } template void QubitVectorThrust::allocate_buffers(int nq) { //delete this } template size_t QubitVectorThrust::required_memory_mb(uint_t num_qubits) const { size_t unit = std::log2(sizeof(std::complex)); size_t shift_mb = std::max(0, num_qubits + unit - 20); size_t mem_mb = 1ULL << shift_mb; return mem_mb; } template void QubitVectorThrust::checkpoint() { #ifdef AER_DEBUG DebugMsg("checkpoint"); DebugDump(); #endif if (!checkpoint_) checkpoint_ = reinterpret_cast*>(malloc(sizeof(std::complex) * data_size_)); int iPlace; uint_t ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; UpdateReferencedValue(); for(iPlace=0;iPlace*)checkpoint_,pos,ic,m_maxChunkBits); pos += csize; } } } template void QubitVectorThrust::revert(bool keep) { #ifdef DEBUG check_checkpoint(); #endif #ifdef AER_DEBUG DebugMsg("calling revert"); #endif int iPlace; uint_t ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; for(iPlace=0;iPlace*)checkpoint_,pos,ic,m_maxChunkBits); pos += csize; } } #ifdef AER_DEBUG DebugMsg("revert"); DebugDump(); #endif } template std::complex QubitVectorThrust::inner_product() const { double d = 0.0; int iPlace; uint_t i,ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; cvector_t tmp(csize); #ifdef AER_DEBUG DebugMsg("calling inner_product"); #endif UpdateReferencedValue(); for(iPlace=0;iPlace*)&tmp[0],0,ic,m_maxChunkBits); for(i=0;i(d,0.0)); #endif return std::complex(d,0.0); } //------------------------------------------------------------------------------ // Initialization //------------------------------------------------------------------------------ template void QubitVectorThrust::initialize() { zero(); thrust::complex t; t = 1.0; if(m_globalIndex == 0){ m_Chunks[0].SetState(0,0,t,m_maxChunkBits); } } template void QubitVectorThrust::initialize_from_vector(const cvector_t &statevec) { if (data_size_ != statevec.size()) { std::string error = "QubitVectorThrust::initialize input vector is incorrect length (" + std::to_string(data_size_) + "!=" + std::to_string(statevec.size()) + ")"; throw std::runtime_error(error); } #ifdef AER_DEBUG DebugMsg("calling initialize_from_vector"); #endif int iPlace; uint_t i,ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; cvector_t tmp(csize); for(iPlace=0;iPlace t((data_t)std::real(statevec[pos + i]), (data_t)std::imag(statevec[pos + i])); tmp[i] = t; } m_Chunks[iPlace].CopyIn((thrust::complex*)&tmp[0],0,ic,m_maxChunkBits); pos += csize; } } #ifdef AER_DEBUG DebugMsg("initialize_from_vector"); DebugDump(); #endif } template void QubitVectorThrust::initialize_from_data(const std::complex* statevec, const size_t num_states) { if (data_size_ != num_states) { std::string error = "QubitVectorThrust::initialize input vector is incorrect length (" + std::to_string(data_size_) + "!=" + std::to_string(num_states) + ")"; throw std::runtime_error(error); } #ifdef AER_DEBUG DebugMsg("calling initialize_from_data"); #endif int iPlace; uint_t ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; for(iPlace=0;iPlace*)statevec,pos,ic,m_maxChunkBits); pos += csize; } } #ifdef AER_DEBUG DebugMsg("initialize_from_data"); DebugDump(); #endif } //-------------------------------------------------------------------------------------- // gate kernel execution //-------------------------------------------------------------------------------------- template int QubitVectorThrust::FindPlace(uint_t chunkID,int chunkBits) const { int i; uint_t ids,baseGID,endGID; baseGID = m_globalIndex; endGID = m_globalIndex + m_localSize; if(chunkID < baseGID || chunkID >= endGID){ return -1; //not in this process } for(i=0;i= ids && chunkID < ids + m_Chunks[i].NumChunks(chunkBits)){ return i; } } return -1; } template int QubitVectorThrust::GlobalToLocal(uint_t& lcid,uint_t& lid,uint_t gid,int chunkBits) const { uint_t gcid = (gid >> chunkBits); int iPlace = FindPlace(gcid,chunkBits); if(iPlace >= 0){ lcid = gcid - m_Chunks[iPlace].ChunkID(0,chunkBits); lid = gid - (gcid << chunkBits); } return iPlace; } template uint_t QubitVectorThrust::GetBaseChunkID(const uint_t gid,const reg_t& qubits,const int chunkBits) const { int i,n; uint_t base = gid; n = qubits.size(); for(i=0;i void QubitVectorThrust::set_matrix(const cvector_t& mat) const { uint_t i,size = mat.size(); std::vector> matTh(size); for(i=0;i)mat[i]; } //store matrix to devices for(i=0;i void QubitVectorThrust::set_params(const reg_t& prm) const { int i; //store params to devices for(i=0;i template double QubitVectorThrust::apply_function(Function func,const reg_t &qubits) const { const size_t N = qubits.size(); const int numCBits = func.NumControlBits(); uint_t size,iChunk,nChunk,controlMask,controlFlag; int i,ib,nBuf; int nSmall,nLarge = 0; reg_t large_qubits; int chunkBits; double ret = 0.0; int noDataExchange = 0; #ifdef AER_DEBUG DebugMsg(func.Name(),qubits); #endif UpdateReferencedValue(); //decreasing chunk-bits for fusion chunkBits = m_maxChunkBits - (N - 1); //If no data exchange required execute along with all the state vectors if(m_nPlaces == 1 || func.IsDiagonal()){ //note: for multi-process m_nPlaces == 1 is not valid noDataExchange = 1; chunkBits = num_qubits_; } //count number of qubits which is larger than chunk size for(ib=numCBits;ib= chunkBits){ large_qubits.push_back(qubits[ib]); nLarge++; } } nSmall = N - nLarge - numCBits; if(nLarge == 0){ noDataExchange = 1; chunkBits = num_qubits_; } if(func.IsDiagonal()){ size = 1ull << chunkBits; nBuf = 1; nChunk = 1; } else{ size = 1ull << (chunkBits - nSmall); nBuf = 1ull << (N - numCBits); nChunk = 1ull << nLarge; } //setup buffer configuration reg_t offsetBase(nBuf,0); reg_t buf2chunk(nBuf,0); iChunk = 1; for(ib=numCBits;ib= chunkBits){ for(i=0;i> (ib-numCBits)) & 1){ buf2chunk[i] += iChunk; } } iChunk <<= 1; } else{ for(i=0;i> (ib-numCBits)) & 1){ offsetBase[i] += (1ull << qubits[ib]); } } } } if(noDataExchange){ #pragma omp parallel if (num_qubits_ > omp_threshold_ && m_nPlaces > 1) private(size,iChunk,i,ib) num_threads(m_nPlaces) { int iPlace = omp_get_thread_num(); uint_t localMask = 0xffffffff; size = m_Chunks[iPlace].Size(); if(!func.IsDiagonal()){ size >>= (N - numCBits); } //execute kernel bool enable_omp = (num_qubits_ > omp_threshold_ && omp_threads_ > 1); if(func.Reduction()) ret += m_Chunks[iPlace].ExecuteSum(offsetBase,func,size,m_Chunks[iPlace].ChunkID(0,0),localMask, enable_omp); else m_Chunks[iPlace].Execute(offsetBase,func,size,m_Chunks[iPlace].ChunkID(0,0),localMask, enable_omp); } } else{ controlMask = 0; controlFlag = 0; for(ib=0;ib= chunkBits) controlMask |= (1ull << (qubits[ib] - chunkBits)); } if(func.ControlMask() != 0){ controlFlag = controlMask; } #pragma omp parallel if (num_qubits_ > omp_threshold_ && m_nPlaces > 1) private(iChunk,i,ib) num_threads(m_nPlaces) { int iPlace = omp_get_thread_num(); int iPlaceSrc; uint_t localMask,baseChunk; reg_t offsets(nBuf); reg_t chunkOffsets(nChunk); reg_t chunkIDs(nChunk); std::vector places(nChunk); for(iChunk=0;iChunk> ib) & 1){ chunkIDs[i] += (1ull << (large_qubits[ib] - chunkBits)); } } iPlaceSrc = FindPlace(chunkIDs[i],chunkBits); places[i] = iPlaceSrc; if(iPlaceSrc == iPlace){ chunkOffsets[i] = m_Chunks[iPlace].LocalChunkID(chunkIDs[i],chunkBits) << chunkBits; } else{ m_Chunks[iPlace].Get(m_Chunks[iPlaceSrc],m_Chunks[iPlaceSrc].LocalChunkID(chunkIDs[i],chunkBits),i,chunkBits); //copy chunk from other place chunkOffsets[i] = m_Chunks[iPlace].Size() + (i << chunkBits); //offset to buffer } } //setting buffers localMask = 0; for(i=0;i omp_threshold_ && omp_threads_ > 1); if(func.Reduction()) ret += m_Chunks[iPlace].ExecuteSum(offsets,func,size,(baseChunk << chunkBits),localMask, enable_omp); else m_Chunks[iPlace].Execute(offsets,func,size,(baseChunk << chunkBits),localMask, enable_omp); //copy back for(i=0;i class MatrixMult4x4 : public GateFuncBase { protected: thrust::complex m00,m10,m20,m30; thrust::complex m01,m11,m21,m31; thrust::complex m02,m12,m22,m32; thrust::complex m03,m13,m23,m33; int qubit0; int qubit1; uint_t mask0; uint_t mask1; public: MatrixMult4x4(const cvector_t& mat,int q0,int q1) { qubit0 = q0; qubit1 = q1; m00 = mat[0]; m01 = mat[1]; m02 = mat[2]; m03 = mat[3]; m10 = mat[4]; m11 = mat[5]; m12 = mat[6]; m13 = mat[7]; m20 = mat[8]; m21 = mat[9]; m22 = mat[10]; m23 = mat[11]; m30 = mat[12]; m31 = mat[13]; m32 = mat[14]; m33 = mat[15]; mask0 = (1ull << qubit0) - 1; mask1 = (1ull << qubit1) - 1; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,i0,i1,i2,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1,q2,q3; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; localMask = params.lmask_; i0 = i & mask0; i2 = (i - i0) << 1; i1 = i2 & mask1; i2 = (i2 - i1) << 1; i0 = i0 + i1 + i2; q0 = pV[offsets[0] + i0]; q1 = pV[offsets[1] + i0]; q2 = pV[offsets[2] + i0]; q3 = pV[offsets[3] + i0]; if(localMask & 1) pV[offsets[0]+i0] = m00 * q0 + m10 * q1 + m20 * q2 + m30 * q3; if(localMask & 2) pV[offsets[1]+i0] = m01 * q0 + m11 * q1 + m21 * q2 + m31 * q3; if(localMask & 4) pV[offsets[2]+i0] = m02 * q0 + m12 * q1 + m22 * q2 + m32 * q3; if(localMask & 8) pV[offsets[3]+i0] = m03 * q0 + m13 * q1 + m23 * q2 + m33 * q3; return 0.0; } const char* Name(void) { return "mult4x4"; } }; template class MatrixMult8x8 : public GateFuncBase { protected: int qubit0; int qubit1; int qubit2; uint_t mask0; uint_t mask1; uint_t mask2; public: MatrixMult8x8(int q0,int q1,int q2) { qubit0 = q0; qubit1 = q1; qubit2 = q2; mask0 = (1ull << qubit0) - 1; mask1 = (1ull << qubit1) - 1; mask2 = (1ull << qubit2) - 1; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,i0,i1,i2,i3,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1,q2,q3,q4,q5,q6,q7; thrust::complex m0,m1,m2,m3,m4,m5,m6,m7; thrust::complex* pMat; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; pMat = params.matrix_; localMask = params.lmask_; i0 = i & mask0; i3 = (i - i0) << 1; i1 = i3 & mask1; i3 = (i3 - i1) << 1; i2 = i3 & mask2; i3 = (i3 - i2) << 1; i0 = i0 + i1 + i2 + i3; q0 = pV[offsets[0]+i0]; q1 = pV[offsets[1]+i0]; q2 = pV[offsets[2]+i0]; q3 = pV[offsets[3]+i0]; q4 = pV[offsets[4]+i0]; q5 = pV[offsets[5]+i0]; q6 = pV[offsets[6]+i0]; q7 = pV[offsets[7]+i0]; if(localMask & 1){ m0 = pMat[0]; m1 = pMat[8]; m2 = pMat[16]; m3 = pMat[24]; m4 = pMat[32]; m5 = pMat[40]; m6 = pMat[48]; m7 = pMat[56]; pV[offsets[0]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 2){ m0 = pMat[1]; m1 = pMat[9]; m2 = pMat[17]; m3 = pMat[25]; m4 = pMat[33]; m5 = pMat[41]; m6 = pMat[49]; m7 = pMat[57]; pV[offsets[1]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 4){ m0 = pMat[2]; m1 = pMat[10]; m2 = pMat[18]; m3 = pMat[26]; m4 = pMat[34]; m5 = pMat[42]; m6 = pMat[50]; m7 = pMat[58]; pV[offsets[2]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 8){ m0 = pMat[3]; m1 = pMat[11]; m2 = pMat[19]; m3 = pMat[27]; m4 = pMat[35]; m5 = pMat[43]; m6 = pMat[51]; m7 = pMat[59]; pV[offsets[3]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 16){ m0 = pMat[4]; m1 = pMat[12]; m2 = pMat[20]; m3 = pMat[28]; m4 = pMat[36]; m5 = pMat[44]; m6 = pMat[52]; m7 = pMat[60]; pV[offsets[4]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 32){ m0 = pMat[5]; m1 = pMat[13]; m2 = pMat[21]; m3 = pMat[29]; m4 = pMat[37]; m5 = pMat[45]; m6 = pMat[53]; m7 = pMat[61]; pV[offsets[5]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 64){ m0 = pMat[6]; m1 = pMat[14]; m2 = pMat[22]; m3 = pMat[30]; m4 = pMat[38]; m5 = pMat[46]; m6 = pMat[54]; m7 = pMat[62]; pV[offsets[6]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } if(localMask & 128){ m0 = pMat[7]; m1 = pMat[15]; m2 = pMat[23]; m3 = pMat[31]; m4 = pMat[39]; m5 = pMat[47]; m6 = pMat[55]; m7 = pMat[63]; pV[offsets[7]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7; } return 0.0; } const char* Name(void) { return "mult8x8"; } }; template class MatrixMult16x16 : public GateFuncBase { protected: int qubit0; int qubit1; int qubit2; int qubit3; uint_t mask0; uint_t mask1; uint_t mask2; uint_t mask3; public: MatrixMult16x16(int q0,int q1,int q2,int q3) { qubit0 = q0; qubit1 = q1; qubit2 = q2; qubit3 = q3; mask0 = (1ull << qubit0) - 1; mask1 = (1ull << qubit1) - 1; mask2 = (1ull << qubit2) - 1; mask3 = (1ull << qubit3) - 1; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,i0,i1,i2,i3,i4,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1,q2,q3,q4,q5,q6,q7; thrust::complex q8,q9,q10,q11,q12,q13,q14,q15; thrust::complex m0,m1,m2,m3,m4,m5,m6,m7; thrust::complex m8,m9,m10,m11,m12,m13,m14,m15; thrust::complex* pMat; int j; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; pMat = params.matrix_; localMask = params.lmask_; i0 = i & mask0; i4 = (i - i0) << 1; i1 = i4 & mask1; i4 = (i4 - i1) << 1; i2 = i4 & mask2; i4 = (i4 - i2) << 1; i3 = i4 & mask3; i4 = (i4 - i3) << 1; i0 = i0 + i1 + i2 + i3 + i4; q0 = pV[offsets[0]+i0]; q1 = pV[offsets[1]+i0]; q2 = pV[offsets[2]+i0]; q3 = pV[offsets[3]+i0]; q4 = pV[offsets[4]+i0]; q5 = pV[offsets[5]+i0]; q6 = pV[offsets[6]+i0]; q7 = pV[offsets[7]+i0]; q8 = pV[offsets[8]+i0]; q9 = pV[offsets[9]+i0]; q10 = pV[offsets[10]+i0]; q11 = pV[offsets[11]+i0]; q12 = pV[offsets[12]+i0]; q13 = pV[offsets[13]+i0]; q14 = pV[offsets[14]+i0]; q15 = pV[offsets[15]+i0]; for(j=0;j<16;j++){ if(((localMask >> j) & 1) == 0){ continue; } m0 = pMat[0+j]; m1 = pMat[16+j]; m2 = pMat[32+j]; m3 = pMat[48+j]; m4 = pMat[64+j]; m5 = pMat[80+j]; m6 = pMat[96+j]; m7 = pMat[112+j]; m8 = pMat[128+j]; m9 = pMat[144+j]; m10= pMat[160+j]; m11= pMat[176+j]; m12= pMat[192+j]; m13= pMat[208+j]; m14= pMat[224+j]; m15= pMat[240+j]; pV[offsets[j]+i0] = m0 * q0 + m1 * q1 + m2 * q2 + m3 * q3 + m4 * q4 + m5 * q5 + m6 * q6 + m7 * q7 + m8 * q8 + m9 * q9 + m10* q10+ m11* q11+ m12* q12+ m13* q13+ m14* q14+ m15* q15; } return 0.0; } const char* Name(void) { return "mult16x16"; } }; //in-place NxN matrix multiplication using LU factorization template class MatrixMultNxN_LU : public GateFuncBase { protected: int nqubits; uint_t matSize; int nswap; public: MatrixMultNxN_LU(const cvector_t& mat,const reg_t &qb,cvector_t& matLU,reg_t& params) { uint_t i,j,k,imax; std::complex c0,c1; double d,dmax; uint_t* pSwap; nqubits = qb.size(); matSize = 1ull << nqubits; matLU = mat; params.resize(nqubits + matSize*2); for(k=0;k dmax){ dmax = d; imax = j; } } if(imax != i){ j = params[nqubits + imax]; params[nqubits + imax] = params[nqubits + i]; params[nqubits + i] = j; } if(dmax != 0){ c0 = matLU[(i << nqubits) + params[nqubits + i]]; for(j=i+1;j> &iter) const { thrust::complex q,qt; thrust::complex m; thrust::complex r; uint_t i,j,k,l; uint_t ii,idx,t; uint_t mask; thrust::complex* pV; uint_t* offsets; thrust::complex* pMat; uint_t* qubits; uint_t* pivot; uint_t* table; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; pMat = params.matrix_; qubits = params.params_; pivot = qubits + nqubits; table = pivot + matSize; idx = 0; ii = i; for(j=0;j0;j--){ r = pV[offsets[j]+idx]; for(k=0;k 0){ q = pV[offsets[table[0]]+idx]; k = pivot[table[0]]; for(j=1;j void QubitVectorThrust::apply_matrix(const reg_t &qubits, const cvector_t &mat) { const size_t N = qubits.size(); auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); #ifdef AER_TIMING TimeStart(QS_GATE_MULT); #endif if(N == 1){ apply_function(MatrixMult2x2(mat,qubits_sorted[0]), qubits); } else if(N == 2){ apply_function(MatrixMult4x4(mat,qubits_sorted[0],qubits_sorted[1]), qubits); } else if(N == 3){ set_matrix(mat); apply_function(MatrixMult8x8(qubits_sorted[0],qubits_sorted[1],qubits_sorted[2]), qubits); } else if(N == 4){ set_matrix(mat); apply_function(MatrixMult16x16(qubits_sorted[0],qubits_sorted[1],qubits_sorted[2],qubits_sorted[3]), qubits); } else{ cvector_t matLU; reg_t params; MatrixMultNxN_LU f(mat,qubits_sorted,matLU,params); set_matrix(matLU); set_params(params); apply_function(f, qubits); } #ifdef AER_TIMING TimeEnd(QS_GATE_MULT); #endif } template void QubitVectorThrust::apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const cvector_t &mat) { const size_t control_count = control_qubits.size(); const size_t target_count = target_qubits.size(); const uint_t DIM = 1ull << (target_count+control_count); const uint_t columns = 1ull << target_count; const uint_t blocks = 1ull << control_count; auto qubits = target_qubits; for (const auto &q : control_qubits) {qubits.push_back(q);} size_t N = qubits.size(); cvector_t matMP(DIM*DIM,0.0); uint_t b,i,j; //make DIMxDIM matrix for(b = 0; b < blocks; b++){ for(i = 0; i < columns; i++){ for(j = 0; j < columns; j++){ matMP[(i+b*columns) + DIM*(b*columns+j)] += mat[i+b*columns + DIM * j]; } } } #ifdef AER_DEBUG DebugMsg("apply_multiplexer",control_qubits); DebugMsg(" ",target_qubits); #endif apply_matrix(qubits,matMP); } template class DiagonalMult2x2 : public GateFuncBase { protected: thrust::complex m0,m1; int qubit; public: DiagonalMult2x2(const cvector_t& mat,int q) { qubit = q; m0 = mat[0]; m1 = mat[1]; } bool IsDiagonal(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,gid; thrust::complex q; thrust::complex* pV; thrust::complex m; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; gid = params.gid_; q = pV[i]; if((((i + gid) >> qubit) & 1) == 0){ m = m0; } else{ m = m1; } pV[i] = m * q; return 0.0; } const char* Name(void) { return "diagonal_mult2x2"; } }; template class DiagonalMultNxN : public GateFuncBase { protected: int nqubits; public: DiagonalMultNxN(const reg_t &qb) { nqubits = qb.size(); } bool IsDiagonal(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,j,im,gid; thrust::complex* pV; thrust::complex q; thrust::complex m; thrust::complex* pMat; uint_t* qubits; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; pMat = params.matrix_; qubits = params.params_; gid = params.gid_; im = 0; for(j=0;j void QubitVectorThrust::apply_diagonal_matrix(const reg_t &qubits, const cvector_t &diag) { const int_t N = qubits.size(); #ifdef AER_TIMING TimeStart(QS_GATE_DIAG); #endif if(N == 1){ apply_function(DiagonalMult2x2(diag,qubits[0]), qubits); } else{ set_matrix(diag); set_params(qubits); apply_function(DiagonalMultNxN(qubits), qubits); } #ifdef AER_TIMING TimeEnd(QS_GATE_DIAG); #endif } template class Permutation : public GateFuncBase { protected: uint_t matSize; int nqubits; int npairs; public: Permutation(const reg_t& qb,const std::vector> &pairs_in,reg_t& params) { uint_t j; nqubits = qb.size(); matSize = 1ull << nqubits; npairs = pairs_in.size(); params.resize(nqubits + npairs*2); for(j=0;j> &iter) const { uint_t i; thrust::complex* pV; uint_t* offsets; thrust::complex q; uint_t j,ip0,ip1; uint_t ii,idx,t; uint_t mask; uint_t* pairs; uint_t* qubits; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; qubits = params.params_; pairs = qubits + nqubits; idx = 0; ii = i; for(j=0;j void QubitVectorThrust::apply_permutation_matrix(const reg_t& qubits, const std::vector> &pairs) { const size_t N = qubits.size(); auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); reg_t params; Permutation f(qubits_sorted,pairs,params); set_params(params); apply_function(f, qubits); } /******************************************************************************* * * APPLY OPTIMIZED GATES * ******************************************************************************/ //------------------------------------------------------------------------------ // Multi-controlled gates //------------------------------------------------------------------------------ template class CX_func : public GateFuncBase { protected: uint_t mask; uint_t cmask; int nqubits; int qubit_t; public: CX_func(const reg_t &qubits) { int i; nqubits = qubits.size(); qubit_t = qubits[nqubits-1]; mask = (1ull << qubit_t) - 1; cmask = 0; for(i=0;i> &iter) const { uint_t i,i0,i1; uint_t gid,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1; thrust::complex* pV0; thrust::complex* pV1; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; gid = params.gid_; localMask = params.lmask_; pV0 = pV + offsets[0]; pV1 = pV + offsets[1]; i1 = i & mask; i0 = (i - i1) << 1; i0 += i1; if(((i0 + gid) & cmask) == cmask){ q0 = pV0[i0]; q1 = pV1[i0]; if((localMask & 1) == 1) pV0[i0] = q1; if((localMask & 2) == 2) pV1[i0] = q0; } return 0.0; } const char* Name(void) { return "CX"; } }; template void QubitVectorThrust::apply_mcx(const reg_t &qubits) { #ifdef AER_TIMING TimeStart(QS_GATE_CX); #endif apply_function(CX_func(qubits), qubits); #ifdef AER_TIMING TimeEnd(QS_GATE_CX); #endif } template class CY_func : public GateFuncBase { protected: uint_t mask; uint_t cmask; int nqubits; int qubit_t; public: CY_func(const reg_t &qubits) { int i; nqubits = qubits.size(); qubit_t = qubits[nqubits-1]; mask = (1ull << qubit_t) - 1; cmask = 0; for(i=0;i> &iter) const { uint_t i,i0,i1; uint_t gid,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1; thrust::complex* pV0; thrust::complex* pV1; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; gid = params.gid_; localMask = params.lmask_; pV0 = pV + offsets[0]; pV1 = pV + offsets[1]; i1 = i & mask; i0 = (i - i1) << 1; i0 += i1; if(((i0 + gid) & cmask) == cmask){ q0 = pV0[i0]; q1 = pV1[i0]; if((localMask & 1) == 1) pV0[i0] = thrust::complex(q1.imag(),-q1.real()); if((localMask & 2) == 2) pV1[i0] = thrust::complex(-q0.imag(),q0.real()); } return 0.0; } const char* Name(void) { return "CY"; } }; template void QubitVectorThrust::apply_mcy(const reg_t &qubits) { apply_function(CY_func(qubits), qubits); } template class CSwap_func : public GateFuncBase { protected: uint_t mask0; uint_t mask1; uint_t cmask; int nqubits; int qubit_t0; int qubit_t1; public: CSwap_func(const reg_t &qubits) { int i; nqubits = qubits.size(); if(qubits[nqubits-2] < qubits[nqubits-1]){ qubit_t0 = qubits[nqubits-2]; qubit_t1 = qubits[nqubits-1]; } else{ qubit_t1 = qubits[nqubits-2]; qubit_t0 = qubits[nqubits-1]; } mask0 = (1ull << qubit_t0) - 1; mask1 = (1ull << qubit_t1) - 1; cmask = 0; for(i=0;i> &iter) const { uint_t i,i0,i1,i2; uint_t gid,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q1,q2; thrust::complex* pV1; thrust::complex* pV2; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; gid = params.gid_; localMask = params.lmask_; pV1 = pV + offsets[1]; pV2 = pV + offsets[2]; i0 = i & mask0; i2 = (i - i0) << 1; i1 = i2 & mask1; i2 = (i2 - i1) << 1; i0 = i0 + i1 + i2; if(((i0+gid) & cmask) == cmask){ q1 = pV1[i0]; q2 = pV2[i0]; if(localMask & 2) pV1[i0] = q2; if(localMask & 4) pV2[i0] = q1; } return 0.0; } const char* Name(void) { return "CSWAP"; } }; template void QubitVectorThrust::apply_mcswap(const reg_t &qubits) { apply_function(CSwap_func(qubits), qubits); } template class phase_func : public GateFuncBase { protected: thrust::complex phase; uint_t mask; int nqubits; public: phase_func(const reg_t &qubits,thrust::complex p) { int i; nqubits = qubits.size(); phase = p; mask = 0; for(i=0;i> &iter) const { uint_t i,gid; thrust::complex* pV; thrust::complex q0; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; gid = params.gid_; if(((i+gid) & mask) == mask){ q0 = pV[i]; pV[i] = q0 * phase; } return 0.0; } const char* Name(void) { return "phase"; } }; template void QubitVectorThrust::apply_mcphase(const reg_t &qubits, const std::complex phase) { apply_function(phase_func(qubits,*(thrust::complex*)&phase), qubits ); } template class DiagonalMult2x2Controlled : public GateFuncBase { protected: thrust::complex m0,m1; uint_t mask; uint_t cmask; int nqubits; public: DiagonalMult2x2Controlled(const cvector_t& mat,const reg_t &qubits) { int i; nqubits = qubits.size(); m0 = mat[0]; m1 = mat[1]; mask = (1ull << qubits[nqubits-1]) - 1; cmask = 0; for(i=0;i> &iter) const { uint_t i,gid; thrust::complex* pV; thrust::complex q0; thrust::complex m; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; gid = params.gid_; if(((i + gid) & cmask) == cmask){ if((i + gid) & mask){ m = m1; } else{ m = m0; } q0 = pV[i]; pV[i] = m*q0; } return 0.0; } const char* Name(void) { return "diagonal_Cmult2x2"; } }; template class MatrixMult2x2Controlled : public GateFuncBase { protected: thrust::complex m0,m1,m2,m3; uint_t mask; uint_t cmask; int nqubits; public: MatrixMult2x2Controlled(const cvector_t& mat,const reg_t &qubits) { int i; m0 = mat[0]; m1 = mat[1]; m2 = mat[2]; m3 = mat[3]; nqubits = qubits.size(); mask = (1ull << qubits[nqubits-1]) - 1; cmask = 0; for(i=0;i> &iter) const { uint_t i,i0,i1; uint_t gid,localMask; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1; thrust::complex* pV0; thrust::complex* pV1; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; gid = params.gid_; localMask = params.lmask_; pV0 = pV + offsets[0]; pV1 = pV + offsets[1]; i1 = i & mask; i0 = (i - i1) << 1; i0 += i1; if(((i0+gid) & cmask) == cmask){ q0 = pV0[i0]; q1 = pV1[i0]; if(localMask & 1) pV0[i0] = m0 * q0 + m2 * q1; if(localMask & 2) pV1[i0] = m1 * q0 + m3 * q1; } return 0.0; } const char* Name(void) { return "diagonal_CmultNxN"; } }; template void QubitVectorThrust::apply_mcu(const reg_t &qubits, const cvector_t &mat) { // Calculate the permutation positions for the last qubit. const size_t N = qubits.size(); // Check if matrix is actually diagonal and if so use // diagonal matrix lambda function // TODO: this should be changed to not check doubles with == if (mat[1] == 0.0 && mat[2] == 0.0) { // Check if actually a phase gate if (mat[0] == 1.0) { apply_mcphase(qubits, mat[3]); return; } // Otherwise apply general diagonal gate const cvector_t diag = {{mat[0], mat[3]}}; if(N == 1){ // If N=1 this is just a single-qubit matrix apply_diagonal_matrix(qubits[0], diag); return; } else{ apply_function(DiagonalMult2x2Controlled(diag,qubits), qubits ); } } else{ if(N == 1){ // If N=1 this is just a single-qubit matrix apply_matrix(qubits[0], mat); return; } else{ apply_function(MatrixMult2x2Controlled(mat,qubits), qubits ); } } } //------------------------------------------------------------------------------ // Single-qubit matrices //------------------------------------------------------------------------------ template void QubitVectorThrust::apply_matrix(const uint_t qubit, const cvector_t& mat) { // Check if matrix is diagonal and if so use optimized lambda if (mat[1] == 0.0 && mat[2] == 0.0) { #ifdef AER_TIMING TimeStart(QS_GATE_DIAG); #endif const std::vector> diag = {{mat[0], mat[3]}}; apply_diagonal_matrix(qubit, diag); #ifdef AER_TIMING TimeEnd(QS_GATE_DIAG); #endif return; } #ifdef AER_TIMING TimeStart(QS_GATE_MULT); #endif reg_t qubits = {qubit}; apply_function(MatrixMult2x2(mat,qubit), qubits); #ifdef AER_TIMING TimeEnd(QS_GATE_MULT); #endif } template void QubitVectorThrust::apply_diagonal_matrix(const uint_t qubit, const cvector_t& diag) { #ifdef AER_TIMING TimeStart(QS_GATE_DIAG); #endif reg_t qubits = {qubit}; apply_function(DiagonalMult2x2(diag,qubits[0]), qubits); #ifdef AER_TIMING TimeEnd(QS_GATE_DIAG); #endif } /******************************************************************************* * * NORMS * ******************************************************************************/ template class Norm : public GateFuncBase { protected: public: Norm() { } bool IsDiagonal(void) { return true; } bool Reduction(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i; thrust::complex* pV; thrust::complex q0; double ret; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; ret = 0.0; q0 = pV[i]; ret = q0.real()*q0.real() + q0.imag()*q0.imag(); return ret; } const char* Name(void) { return "Norm"; } }; template double QubitVectorThrust::norm() const { reg_t qubits = {0}; double ret = apply_function(Norm(),qubits); return ret; } template class NormMatrixMultNxN : public GateFuncBase { protected: int nqubits; uint_t matSize; public: NormMatrixMultNxN(const cvector_t& mat,const reg_t &qb) { nqubits = qb.size(); matSize = 1ull << nqubits; } bool Reduction(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i; thrust::complex* pV; uint_t* offsets; thrust::complex* pMat; thrust::complex q; thrust::complex m; thrust::complex r; double sum = 0.0; uint_t j,k,l; uint_t ii,idx,t; uint_t mask; uint_t* qubits; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; pMat = params.matrix_; qubits = params.params_; idx = 0; ii = i; for(j=0;j double QubitVectorThrust::norm(const reg_t &qubits, const cvector_t &mat) const { const size_t N = qubits.size(); if(N == 1){ return norm(qubits[0], mat); } else{ set_matrix(mat); set_params(qubits); double ret = apply_function(NormMatrixMultNxN(mat,qubits), qubits); return ret; } } template class NormDiagonalMultNxN : public GateFuncBase { protected: int nqubits; public: NormDiagonalMultNxN(const reg_t &qb) { nqubits = qb.size(); } bool IsDiagonal(void) { return true; } bool Reduction(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,im,j,gid; thrust::complex q; thrust::complex m,r; thrust::complex* pMat; thrust::complex* pV; uint_t* qubits; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; pMat = params.matrix_; qubits = params.params_; gid = params.gid_; im = 0; for(j=0;j double QubitVectorThrust::norm_diagonal(const reg_t &qubits, const cvector_t &mat) const { const uint_t N = qubits.size(); if(N == 1){ return norm_diagonal(qubits[0], mat); } else{ set_matrix(mat); set_params(qubits); double ret = apply_function(NormDiagonalMultNxN(qubits), qubits ); return ret; } } //------------------------------------------------------------------------------ // Single-qubit specialization //------------------------------------------------------------------------------ template class NormMatrixMult2x2 : public GateFuncBase { protected: thrust::complex m0,m1,m2,m3; int qubit; uint_t mask; public: NormMatrixMult2x2(const cvector_t &mat,int q) { qubit = q; m0 = mat[0]; m1 = mat[1]; m2 = mat[2]; m3 = mat[3]; mask = (1ull << qubit) - 1; } bool Reduction(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,i0,i1; thrust::complex* pV; uint_t* offsets; thrust::complex q0,q1; thrust::complex r0,r1; double sum = 0.0; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; offsets = params.offsets_; i1 = i & mask; i0 = (i - i1) << 1; i0 += i1; q0 = pV[offsets[0]+i0]; q1 = pV[offsets[1]+i0]; r0 = m0 * q0 + m2 * q1; sum += r0.real()*r0.real() + r0.imag()*r0.imag(); r1 = m1 * q0 + m3 * q1; sum += r1.real()*r1.real() + r1.imag()*r1.imag(); return sum; } const char* Name(void) { return "Norm_mult2x2"; } }; template double QubitVectorThrust::norm(const uint_t qubit, const cvector_t &mat) const { reg_t qubits = {qubit}; double ret = apply_function(NormMatrixMult2x2(mat,qubit), qubits); return ret; } template class NormDiagonalMult2x2 : public GateFuncBase { protected: thrust::complex m0,m1; int qubit; public: NormDiagonalMult2x2(cvector_t &mat,int q) { qubit = q; m0 = mat[0]; m1 = mat[1]; } bool IsDiagonal(void) { return true; } bool Reduction(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,gid; thrust::complex* pV; uint_t* offsets; thrust::complex q; thrust::complex m,r; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; gid = params.gid_; q = pV[i]; if((((i+gid) >> qubit) & 1) == 0){ m = m0; } else{ m = m1; } r = m * q; return (r.real()*r.real() + r.imag()*r.imag()); } const char* Name(void) { return "Norm_diagonal_mult2x2"; } }; template double QubitVectorThrust::norm_diagonal(const uint_t qubit, const cvector_t &mat) const { reg_t qubits = {qubit}; double ret = apply_function(NormDiagonalMult2x2(mat,qubit), qubits); return ret; } /******************************************************************************* * * Probabilities * ******************************************************************************/ template double QubitVectorThrust::probability(const uint_t outcome) const { uint_t lcid,lid; int iPlace = GlobalToLocal(lcid,lid,outcome,m_maxChunkBits); UpdateReferencedValue(); if(iPlace >= 0){ std::complex ret; ret = (std::complex)m_Chunks[iPlace].GetState(lcid,lid,m_maxChunkBits); return std::real(ret)*std::real(ret) + std::imag(ret) * std::imag(ret); } else{ return 0.0; } } template std::vector QubitVectorThrust::probabilities() const { const int_t END = 1LL << num_qubits(); std::vector probs(END, 0.); #ifdef AER_DEBUG DebugMsg("calling probabilities"); #endif #pragma omp parallel for if (num_qubits_ > omp_threshold_ && omp_threads_ > 1) num_threads(omp_threads_) for (int_t j=0; j < END; j++) { probs[j] = probability(j); } #ifdef AER_DEBUG DebugMsg("probabilities",probs); #endif return probs; } template class dot_func : public GateFuncBase { protected: uint64_t mask; uint64_t cmask; public: dot_func(const reg_t &qubits,const reg_t &qubits_sorted,int i) { int k; int nq = qubits.size(); mask = 0; cmask = 0; for(k=0;k> k) & 1) != 0){ cmask |= (1ull << qubits[k]); } } } bool IsDiagonal(void) { return true; } bool Reduction(void) { return true; } __host__ __device__ double operator()(const thrust::tuple> &iter) const { uint_t i,gid; thrust::complex q; thrust::complex* pV; double ret; struct GateParams params; i = ExtractIndexFromTuple(iter); params = ExtractParamsFromTuple(iter); pV = params.buf_; gid = params.gid_; ret = 0.0; if(((i + gid) & mask) == cmask){ q = pV[i]; ret = q.real()*q.real() + q.imag()*q.imag(); } return ret; } const char* Name(void) { return "dot"; } }; template std::vector QubitVectorThrust::probabilities(const reg_t &qubits) const { const size_t N = qubits.size(); const int_t DIM = 1 << N; auto qubits_sorted = qubits; std::sort(qubits_sorted.begin(), qubits_sorted.end()); if ((N == num_qubits_) && (qubits == qubits_sorted)) return probabilities(); std::vector probs((1ull << N), 0.); int i; for(i=0;i(qubits,qubits_sorted,i), qubits_sorted); } return probs; } //------------------------------------------------------------------------------ // Sample measure outcomes //------------------------------------------------------------------------------ template reg_t QubitVectorThrust::sample_measure(const std::vector &rnds) const { const int_t SHOTS = rnds.size(); reg_t samples,localSamples; std::vector placeSum; data_t* pVec; uint_t i; uint_t size; double sum,localSum,globalSum; int iPlace; #ifdef AER_TIMING TimeStart(QS_GATE_MEASURE); #endif UpdateReferencedValue(); samples.assign(SHOTS, 0); localSamples.assign(SHOTS, 0); placeSum.assign(m_nPlaces+1, 0.0); //calculate sum of each place #pragma omp parallel if (num_qubits_ > omp_threshold_ && m_nPlaces > 1) num_threads(m_nPlaces) private(pVec,size,iPlace) { int iDev; iPlace = omp_get_thread_num(); iDev = m_Chunks[iPlace].DeviceID(); #ifdef AER_THRUST_CUDA if(iDev >= 0){ cudaSetDevice(iDev); } #endif pVec = (data_t*)m_Chunks[iPlace].ChunkPtr(0,m_maxChunkBits); size = m_Chunks[iPlace].Size() * 2; if(iPlace < m_nDevParallel){ thrust::transform_inclusive_scan(thrust::device,pVec,pVec+size,pVec,thrust::square(),thrust::plus()); } else{ auto policy = (num_qubits_ > omp_threshold_ && omp_threads_ > 1) ? thrust::omp::par : thrust::seq; thrust::transform_inclusive_scan(policy,pVec,pVec+size,pVec,thrust::square(),thrust::plus()); } placeSum[iPlace] = m_Chunks[iPlace].GetState(m_Chunks[iPlace].Size()-1).imag(); } localSum = 0.0; for(iPlace=0;iPlace 1){ pProcTotal = new double[m_nprocs]; for(i=0;i omp_threshold_ && m_nPlaces > 1) num_threads(m_nPlaces) private(pVec,iPlace,i,size) { thrust::host_vector vIdx(SHOTS); thrust::host_vector vRnd(SHOTS); thrust::host_vector vSmp(SHOTS); uint_t nIn; int iDev; iPlace = omp_get_thread_num(); iDev = m_Chunks[iPlace].DeviceID(); #ifdef AER_THRUST_CUDA if(iDev >= 0){ cudaSetDevice(iDev); } #endif pVec = (data_t*)m_Chunks[iPlace].ChunkPtr(0,m_maxChunkBits); size = m_Chunks[iPlace].Size() * 2; nIn = 0; for(i=0;i= globalSum + placeSum[iPlace] && rnds[i] < globalSum + placeSum[iPlace+1]){ vRnd[nIn] = rnds[i] - (globalSum + placeSum[iPlace]); vIdx[nIn] = i; nIn++; } } if(nIn > 0){ #ifdef AER_THRUST_CUDA if(iPlace < m_nDevParallel){ thrust::device_vector vRnd_dev(SHOTS); thrust::device_vector vSmp_dev(SHOTS); vRnd_dev = vRnd; thrust::lower_bound(thrust::device, pVec, pVec + size, vRnd_dev.begin(), vRnd_dev.begin() + nIn, vSmp_dev.begin()); vSmp = vSmp_dev; } else{ #endif auto policy = (num_qubits_ > omp_threshold_ && omp_threads_ > 1) ? thrust::omp::par : thrust::seq; thrust::lower_bound(policy, pVec, pVec + size, vRnd.begin(), vRnd.begin() + nIn, vSmp.begin()); #ifdef AER_THRUST_CUDA } #endif for(i=0;i void QubitVectorThrust::TimeReset(void) { int i; for(i=0;i void QubitVectorThrust::TimeStart(int i) const { m_gateStartTime[i] = mysecond(); } template void QubitVectorThrust::TimeEnd(int i) const { double t = mysecond(); m_gateTime[i] += t - m_gateStartTime[i]; m_gateCounts[i]++; } template void QubitVectorThrust::TimePrint(void) { int i; double total; total = 0; for(i=0;i 0) printf(" Initialization : %f \n",m_gateTime[QS_GATE_INIT]); if(m_gateCounts[QS_GATE_MULT] > 0) printf(" Matrix mult. : %f (%d)\n",m_gateTime[QS_GATE_MULT],m_gateCounts[QS_GATE_MULT]); if(m_gateCounts[QS_GATE_CX] > 0) printf(" CX : %f (%d)\n",m_gateTime[QS_GATE_CX],m_gateCounts[QS_GATE_CX]); if(m_gateCounts[QS_GATE_DIAG] > 0) printf(" Diagonal : %f (%d)\n",m_gateTime[QS_GATE_DIAG],m_gateCounts[QS_GATE_DIAG]); if(m_gateCounts[QS_GATE_MEASURE] > 0) printf(" Measure : %f (%d)\n",m_gateTime[QS_GATE_MEASURE],m_gateCounts[QS_GATE_MEASURE]); printf(" Total Kernel time : %f sec\n",total); printf(" ======================================================= \n"); } #endif #ifdef AER_DEBUG template void QubitVectorThrust::DebugMsg(const char* str,const reg_t &qubits) const { if(debug_fp != NULL){ fprintf(debug_fp," [%d] %s : %d (",debug_count,str,qubits.size()); int iq; for(iq=0;iq void QubitVectorThrust::DebugMsg(const char* str,const int qubit) const { if(debug_fp != NULL){ fprintf(debug_fp," [%d] %s : (%d) \n",debug_count,str,qubit); } debug_count++; } template void QubitVectorThrust::DebugMsg(const char* str) const { if(debug_fp != NULL){ fprintf(debug_fp," [%d] %s \n",debug_count,str); } debug_count++; } template void QubitVectorThrust::DebugMsg(const char* str,const std::complex c) const { if(debug_fp != NULL){ fprintf(debug_fp," [%d] %s : %e, %e \n",debug_count,str,std::real(c),imag(c)); } debug_count++; } template void QubitVectorThrust::DebugMsg(const char* str,const double d) const { if(debug_fp != NULL){ fprintf(debug_fp," [%d] %s : %e \n",debug_count,str,d); } debug_count++; } template void QubitVectorThrust::DebugMsg(const char* str,const std::vector& v) const { if(debug_fp != NULL){ fprintf(debug_fp," [%d] %s : <",debug_count,str); int i,n; n = v.size(); for(i=0;i\n"); } debug_count++; } template void QubitVectorThrust::DebugDump(void) const { if(debug_fp != NULL){ if(num_qubits_ < 10){ char bin[64]; int iPlace; uint_t i,j,ic,nc; uint_t pos = 0; uint_t csize = 1ull << m_maxChunkBits; cvector_t tmp(csize); UpdateReferencedValue(); for(iPlace=0;iPlace*)&tmp[0],0,ic,m_maxChunkBits); for(i=0;i> j) & 1); } bin[num_qubits_] = 0; fprintf(debug_fp," %s | %e, %e\n",bin,std::real(tmp[i]),imag(tmp[i])); } pos += csize; } } } } } #endif //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::QubitVectorThrust&qv) { out << "["; size_t last = qv.size() - 1; for (size_t i = 0; i < qv.size(); ++i) { out << qv[i]; if (i != last) out << ", "; } out << "]"; return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/simulators/statevector/statevector_state.hpp000077500000000000000000001132431362723322000254040ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _statevector_state_hpp #define _statevector_state_hpp #include #define _USE_MATH_DEFINES #include #include "framework/utils.hpp" #include "framework/json.hpp" #include "simulators/state.hpp" #include "qubitvector.hpp" #ifdef AER_THRUST_SUPPORTED #include "qubitvector_thrust.hpp" #endif namespace AER { namespace Statevector { // Allowed gates enum class enum class Gates { id, h, s, sdg, t, tdg, // single qubit // multi-qubit controlled (including single-qubit non-controlled) mcx, mcy, mcz, mcu1, mcu2, mcu3, mcswap }; // Allowed snapshots enum class enum class Snapshots { statevector, cmemory, cregister, probs, probs_var, expval_pauli, expval_pauli_var, expval_pauli_shot, expval_matrix, expval_matrix_var, expval_matrix_shot }; // Enum class for different types of expectation values enum class SnapshotDataType {average, average_var, pershot}; //========================================================================= // QubitVector State subclass //========================================================================= template > class State : public Base::State { public: using BaseState = Base::State; State() = default; virtual ~State() = default; //----------------------------------------------------------------------- // Base class overrides //----------------------------------------------------------------------- // Return the string name of the State class virtual std::string name() const override {return statevec_t::name();} // Return the set of qobj instruction types supported by the State virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t({ Operations::OpType::gate, Operations::OpType::measure, Operations::OpType::reset, Operations::OpType::initialize, Operations::OpType::snapshot, Operations::OpType::barrier, Operations::OpType::bfunc, Operations::OpType::roerror, Operations::OpType::matrix, Operations::OpType::multiplexer, Operations::OpType::kraus }); } // Return the set of qobj gate instruction names supported by the State virtual stringset_t allowed_gates() const override { return {"u1", "u2", "u3", "cx", "cz", "cy", "cu1", "cu2", "cu3", "swap", "id", "x", "y", "z", "h", "s", "sdg", "t", "tdg", "ccx", "cswap", "mcx", "mcy", "mcz", "mcu1", "mcu2", "mcu3", "mcswap"}; } // Return the set of qobj snapshot types supported by the State virtual stringset_t allowed_snapshots() const override { return {"statevector", "memory", "register", "probabilities", "probabilities_with_variance", "expectation_value_pauli", "expectation_value_pauli_with_variance", "expectation_value_matrix_single_shot", "expectation_value_matrix", "expectation_value_matrix_with_variance", "expectation_value_pauli_single_shot" }; } // Apply a sequence of operations by looping over list // If the input is not in allowed_ops an exception will be raised. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; // Initializes an n-qubit state to the all |0> state virtual void initialize_qreg(uint_t num_qubits) override; // Initializes to a specific n-qubit state virtual void initialize_qreg(uint_t num_qubits, const statevec_t &state) override; // Returns the required memory for storing an n-qubit state in megabytes. // For this state the memory is indepdentent of the number of ops // and is approximately 16 * 1 << num_qubits bytes virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const override; // Load the threshold for applying OpenMP parallelization // if the controller/engine allows threads for it virtual void set_config(const json_t &config) override; // Sample n-measurement outcomes without applying the measure operation // to the system state virtual std::vector sample_measure(const reg_t& qubits, uint_t shots, RngEngine &rng) override; //----------------------------------------------------------------------- // Additional methods //----------------------------------------------------------------------- // Initializes to a specific n-qubit state given as a complex std::vector virtual void initialize_qreg(uint_t num_qubits, const cvector_t &state); // Initialize OpenMP settings for the underlying QubitVector class void initialize_omp(); protected: //----------------------------------------------------------------------- // Apply instructions //----------------------------------------------------------------------- // Applies a sypported Gate operation to the state class. // If the input is not in allowed_gates an exeption will be raised. void apply_gate(const Operations::Op &op); // Measure qubits and return a list of outcomes [q0, q1, ...] // If a state subclass supports this function it then "measure" // should be contained in the set returned by the 'allowed_ops' // method. virtual void apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng); // Reset the specified qubits to the |0> state by simulating // a measurement, applying a conditional x-gate if the outcome is 1, and // then discarding the outcome. void apply_reset(const reg_t &qubits, RngEngine &rng); // Initialize the specified qubits to a given state |psi> // by applying a reset to the these qubits and then // computing the tensor product with the new state |psi> // /psi> is given in params void apply_initialize(const reg_t &qubits, const cvector_t ¶ms, RngEngine &rng); // Apply a supported snapshot instruction // If the input is not in allowed_snapshots an exeption will be raised. virtual void apply_snapshot(const Operations::Op &op, ExperimentData &data); // Apply a matrix to given qubits (identity on all other qubits) void apply_matrix(const Operations::Op &op); // Apply a vectorized matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cvector_t & vmat); // Apply a vector of control matrices to given qubits (identity on all other qubits) void apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const std::vector &mmat); // Apply stacked (flat) version of multiplexer matrix to target qubits (using control qubits to select matrix instance) void apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const cmatrix_t &mat); // Apply a Kraus error operation void apply_kraus(const reg_t &qubits, const std::vector &krausops, RngEngine &rng); //----------------------------------------------------------------------- // Measurement Helpers //----------------------------------------------------------------------- // Return vector of measure probabilities for specified qubits // If a state subclass supports this function it then "measure" // should be contained in the set returned by the 'allowed_ops' // method. // TODO: move to private (no longer part of base class) rvector_t measure_probs(const reg_t &qubits) const; // Sample the measurement outcome for qubits // return a pair (m, p) of the outcome m, and its corresponding // probability p. // Outcome is given as an int: Eg for two-qubits {q0, q1} we have // 0 -> |q1 = 0, q0 = 0> state // 1 -> |q1 = 0, q0 = 1> state // 2 -> |q1 = 1, q0 = 0> state // 3 -> |q1 = 1, q0 = 1> state std::pair sample_measure_with_prob(const reg_t &qubits, RngEngine &rng); void measure_reset_update(const std::vector &qubits, const uint_t final_state, const uint_t meas_state, const double meas_prob); //----------------------------------------------------------------------- // Special snapshot types // // IMPORTANT: These methods are not marked const to allow modifying state // during snapshot, but after the snapshot is applied the simulator // should be left in the pre-snapshot state. //----------------------------------------------------------------------- // Snapshot current amplitudes void snapshot_statevector(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); // Snapshot current qubit probabilities for a measurement (average) void snapshot_probabilities(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); // Snapshot the expectation value of a Pauli operator void snapshot_pauli_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); // Snapshot the expectation value of a matrix operator void snapshot_matrix_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type); //----------------------------------------------------------------------- // Single-qubit gate helpers //----------------------------------------------------------------------- // Optimize phase gate with diagonal [1, phase] void apply_gate_phase(const uint_t qubit, const complex_t phase); //----------------------------------------------------------------------- // Multi-controlled u3 //----------------------------------------------------------------------- // Apply N-qubit multi-controlled single qubit waltz gate specified by // parameters u3(theta, phi, lambda) // NOTE: if N=1 this is just a regular u3 gate. void apply_gate_mcu3(const reg_t& qubits, const double theta, const double phi, const double lambda); //----------------------------------------------------------------------- // Config Settings //----------------------------------------------------------------------- // OpenMP qubit threshold int omp_qubit_threshold_ = 14; // QubitVector sample measure index size int sample_measure_index_size_ = 10; // Threshold for chopping small values to zero in JSON double json_chop_threshold_ = 1e-10; // Table of allowed gate names to gate enum class members const static stringmap_t gateset_; // Table of allowed snapshot types to enum class members const static stringmap_t snapshotset_; }; //========================================================================= // Implementation: Allowed ops and gateset //========================================================================= template const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::mcx}, // Pauli-X gate {"y", Gates::mcy}, // Pauli-Y gate {"z", Gates::mcz}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gates::t}, // T-gate (sqrt(S)) {"tdg", Gates::tdg}, // Conjguate-transpose of T gate // Waltz Gates {"u1", Gates::mcu1}, // zero-X90 pulse waltz gate {"u2", Gates::mcu2}, // single-X90 pulse waltz gate {"u3", Gates::mcu3}, // two X90 pulse waltz gate // Two-qubit gates {"cx", Gates::mcx}, // Controlled-X gate (CNOT) {"cy", Gates::mcy}, // Controlled-Y gate {"cz", Gates::mcz}, // Controlled-Z gate {"cu1", Gates::mcu1}, // Controlled-u1 gate {"cu2", Gates::mcu2}, // Controlled-u2 gate {"cu3", Gates::mcu3}, // Controlled-u3 gate {"swap", Gates::mcswap}, // SWAP gate // 3-qubit gates {"ccx", Gates::mcx}, // Controlled-CX gate (Toffoli) {"cswap", Gates::mcswap}, // Controlled SWAP gate (Fredkin) // Multi-qubit controlled gates {"mcx", Gates::mcx}, // Multi-controlled-X gate {"mcy", Gates::mcy}, // Multi-controlled-Y gate {"mcz", Gates::mcz}, // Multi-controlled-Z gate {"mcu1", Gates::mcu1}, // Multi-controlled-u1 {"mcu2", Gates::mcu2}, // Multi-controlled-u2 {"mcu3", Gates::mcu3}, // Multi-controlled-u3 {"mcswap", Gates::mcswap} // Multi-controlled SWAP gate }); template const stringmap_t State::snapshotset_({ {"statevector", Snapshots::statevector}, {"probabilities", Snapshots::probs}, {"expectation_value_pauli", Snapshots::expval_pauli}, {"expectation_value_matrix", Snapshots::expval_matrix}, {"probabilities_with_variance", Snapshots::probs_var}, {"expectation_value_pauli_with_variance", Snapshots::expval_pauli_var}, {"expectation_value_matrix_with_variance", Snapshots::expval_matrix_var}, {"expectation_value_pauli_single_shot", Snapshots::expval_pauli_shot}, {"expectation_value_matrix_single_shot", Snapshots::expval_matrix_shot}, {"memory", Snapshots::cmemory}, {"register", Snapshots::cregister} }); //========================================================================= // Implementation: Base class method overrides //========================================================================= //------------------------------------------------------------------------- // Initialization //------------------------------------------------------------------------- template void State::initialize_qreg(uint_t num_qubits) { initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize(); } template void State::initialize_qreg(uint_t num_qubits, const statevec_t &state) { // Check dimension of state if (state.num_qubits() != num_qubits) { throw std::invalid_argument("QubitVector::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_data(state.data(), 1ULL << num_qubits); } template void State::initialize_qreg(uint_t num_qubits, const cvector_t &state) { if (state.size() != 1ULL << num_qubits) { throw std::invalid_argument("QubitVector::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_vector(state); } template void State::initialize_omp() { BaseState::qreg_.set_omp_threshold(omp_qubit_threshold_); if (BaseState::threads_ > 0) BaseState::qreg_.set_omp_threads(BaseState::threads_); // set allowed OMP threads in qubitvector } //------------------------------------------------------------------------- // Utility //------------------------------------------------------------------------- template size_t State::required_memory_mb(uint_t num_qubits, const std::vector &ops) const { // An n-qubit state vector as 2^n complex doubles // where each complex double is 16 bytes (void)ops; // avoid unused variable compiler warning return BaseState::qreg_.required_memory_mb(num_qubits); } template void State::set_config(const json_t &config) { // Set threshold for truncating snapshots JSON::get_value(json_chop_threshold_, "zero_threshold", config); BaseState::qreg_.set_json_chop_threshold(json_chop_threshold_); // Set OMP threshold for state update functions JSON::get_value(omp_qubit_threshold_, "statevector_parallel_threshold", config); // Set the sample measure indexing size int index_size; if (JSON::get_value(index_size, "statevector_sample_measure_opt", config)) { BaseState::qreg_.set_sample_measure_index_size(index_size); }; } //========================================================================= // Implementation: apply operations //========================================================================= template void State::apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) { // Simple loop over vector of input operations for (const auto & op: ops) { if(BaseState::creg_.check_conditional(op)) { switch (op.type) { case Operations::OpType::barrier: break; case Operations::OpType::reset: apply_reset(op.qubits, rng); break; case Operations::OpType::initialize: apply_initialize(op.qubits, op.params, rng); break; case Operations::OpType::measure: apply_measure(op.qubits, op.memory, op.registers, rng); break; case Operations::OpType::bfunc: BaseState::creg_.apply_bfunc(op); break; case Operations::OpType::roerror: BaseState::creg_.apply_roerror(op, rng); break; case Operations::OpType::gate: apply_gate(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data); break; case Operations::OpType::matrix: apply_matrix(op); break; case Operations::OpType::multiplexer: apply_multiplexer(op.regs[0], op.regs[1], op.mats); // control qubits ([0]) & target qubits([1]) break; case Operations::OpType::kraus: apply_kraus(op.qubits, op.mats, rng); break; default: throw std::invalid_argument("QubitVector::State::invalid instruction \'" + op.name + "\'."); } } } } //========================================================================= // Implementation: Snapshots //========================================================================= template void State::apply_snapshot(const Operations::Op &op, ExperimentData &data) { // Look for snapshot type in snapshotset auto it = snapshotset_.find(op.name); if (it == snapshotset_.end()) throw std::invalid_argument("QubitVectorState::invalid snapshot instruction \'" + op.name + "\'."); switch (it -> second) { case Snapshots::statevector: data.add_pershot_snapshot("statevector", op.string_params[0], BaseState::qreg_.vector()); break; case Snapshots::cmemory: BaseState::snapshot_creg_memory(op, data); break; case Snapshots::cregister: BaseState::snapshot_creg_register(op, data); break; case Snapshots::probs: { // get probs as hexadecimal snapshot_probabilities(op, data, SnapshotDataType::average); } break; case Snapshots::expval_pauli: { snapshot_pauli_expval(op, data, SnapshotDataType::average); } break; case Snapshots::expval_matrix: { snapshot_matrix_expval(op, data, SnapshotDataType::average); } break; case Snapshots::probs_var: { // get probs as hexadecimal snapshot_probabilities(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_pauli_var: { snapshot_pauli_expval(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_matrix_var: { snapshot_matrix_expval(op, data, SnapshotDataType::average_var); } break; case Snapshots::expval_pauli_shot: { snapshot_pauli_expval(op, data, SnapshotDataType::pershot); } break; case Snapshots::expval_matrix_shot: { snapshot_matrix_expval(op, data, SnapshotDataType::pershot); } break; default: // We shouldn't get here unless there is a bug in the snapshotset throw std::invalid_argument("QubitVector::State::invalid snapshot instruction \'" + op.name + "\'."); } } template void State::snapshot_probabilities(const Operations::Op &op, ExperimentData &data, SnapshotDataType type) { // get probs as hexadecimal auto probs = Utils::vec2ket(measure_probs(op.qubits), json_chop_threshold_, 16); bool variance = type == SnapshotDataType::average_var; data.add_average_snapshot("probabilities", op.string_params[0], BaseState::creg_.memory_hex(), probs, variance); } template void State::snapshot_pauli_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type) { // Check empty edge case if (op.params_expval_pauli.empty()) { throw std::invalid_argument("Invalid expval snapshot (Pauli components are empty)."); } // Cache the current quantum state BaseState::qreg_.checkpoint(); bool first = true; // flag for first pass so we don't unnecessarily revert from checkpoint // Compute expval components complex_t expval(0., 0.); for (const auto ¶m : op.params_expval_pauli) { // Revert the quantum state to cached checkpoint if (first) first = false; else BaseState::qreg_.revert(true); // Apply each pauli operator as a gate to the corresponding qubit // qubits are stored as a list where position is qubit number: // eq op.qubits = [a, b, c], a is qubit-0, b is qubit-1, c is qubit-2 // Pauli string labels are stored in little-endian ordering: // eg label = "CBA", A is the Pauli for qubit-0, B for qubit-1, C for qubit-2 const auto& coeff = param.first; const auto& pauli = param.second; for (uint_t pos=0; pos < op.qubits.size(); ++pos) { switch (pauli[pauli.size() - 1 - pos]) { case 'I': break; case 'X': BaseState::qreg_.apply_mcx({op.qubits[pos]}); break; case 'Y': BaseState::qreg_.apply_mcy({op.qubits[pos]}); break; case 'Z': BaseState::qreg_.apply_mcphase({op.qubits[pos]}, -1); break; default: { std::stringstream msg; msg << "QubitVectorState::invalid Pauli string \'" << pauli[pos] << "\'."; throw std::invalid_argument(msg.str()); } } } // Pauli expecation values should always be real for a valid state // so we truncate the imaginary part expval += coeff * std::real(BaseState::qreg_.inner_product()); } // add to snapshot Utils::chop_inplace(expval, json_chop_threshold_); switch (type) { case SnapshotDataType::average: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, false); break; case SnapshotDataType::average_var: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, true); break; case SnapshotDataType::pershot: data.add_pershot_snapshot("expectation_values", op.string_params[0], expval); break; } // Revert to original state BaseState::qreg_.revert(false); } template void State::snapshot_matrix_expval(const Operations::Op &op, ExperimentData &data, SnapshotDataType type) { // Check empty edge case if (op.params_expval_matrix.empty()) { throw std::invalid_argument("Invalid matrix snapshot (components are empty)."); } reg_t qubits = op.qubits; // Cache the current quantum state BaseState::qreg_.checkpoint(); bool first = true; // flag for first pass so we don't unnecessarily revert from checkpoint // Compute expval components complex_t expval(0., 0.); for (const auto ¶m : op.params_expval_matrix) { complex_t coeff = param.first; // Revert the quantum state to cached checkpoint if (first) first = false; else BaseState::qreg_.revert(true); // Apply each matrix component for (const auto &pair: param.second) { reg_t sub_qubits; for (const auto pos : pair.first) { sub_qubits.push_back(qubits[pos]); } const cmatrix_t &mat = pair.second; cvector_t vmat = (mat.GetColumns() == 1) ? Utils::vectorize_matrix(Utils::projector(Utils::vectorize_matrix(mat))) // projector case : Utils::vectorize_matrix(mat); // diagonal or square matrix case if (vmat.size() == 1ULL << qubits.size()) { BaseState::qreg_.apply_diagonal_matrix(sub_qubits, vmat); } else { BaseState::qreg_.apply_matrix(sub_qubits, vmat); } } expval += coeff*BaseState::qreg_.inner_product(); } // add to snapshot Utils::chop_inplace(expval, json_chop_threshold_); switch (type) { case SnapshotDataType::average: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, false); break; case SnapshotDataType::average_var: data.add_average_snapshot("expectation_value", op.string_params[0], BaseState::creg_.memory_hex(), expval, true); break; case SnapshotDataType::pershot: data.add_pershot_snapshot("expectation_values", op.string_params[0], expval); break; } // Revert to original state BaseState::qreg_.revert(false); } //========================================================================= // Implementation: Matrix multiplication //========================================================================= template void State::apply_gate(const Operations::Op &op) { // Look for gate name in gateset auto it = gateset_.find(op.name); if (it == gateset_.end()) throw std::invalid_argument("QubitVectorState::invalid gate instruction \'" + op.name + "\'."); switch (it -> second) { case Gates::mcx: // Includes X, CX, CCX, etc BaseState::qreg_.apply_mcx(op.qubits); break; case Gates::mcy: // Includes Y, CY, CCY, etc BaseState::qreg_.apply_mcy(op.qubits); break; case Gates::mcz: // Includes Z, CZ, CCZ, etc BaseState::qreg_.apply_mcphase(op.qubits, -1); break; case Gates::id: break; case Gates::h: apply_gate_mcu3(op.qubits, M_PI / 2., 0., M_PI); break; case Gates::s: apply_gate_phase(op.qubits[0], complex_t(0., 1.)); break; case Gates::sdg: apply_gate_phase(op.qubits[0], complex_t(0., -1.)); break; case Gates::t: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, isqrt2)); } break; case Gates::tdg: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, -isqrt2)); } break; case Gates::mcswap: // Includes SWAP, CSWAP, etc BaseState::qreg_.apply_mcswap(op.qubits); break; case Gates::mcu3: // Includes u3, cu3, etc apply_gate_mcu3(op.qubits, std::real(op.params[0]), std::real(op.params[1]), std::real(op.params[2])); break; case Gates::mcu2: // Includes u2, cu2, etc apply_gate_mcu3(op.qubits, M_PI / 2., std::real(op.params[0]), std::real(op.params[1])); break; case Gates::mcu1: // Includes u1, cu1, etc BaseState::qreg_.apply_mcphase(op.qubits, std::exp(complex_t(0, 1) * op.params[0])); break; default: // We shouldn't reach here unless there is a bug in gateset throw std::invalid_argument("QubitVector::State::invalid gate instruction \'" + op.name + "\'."); } } template void State::apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const cmatrix_t &mat) { if (control_qubits.empty() == false && target_qubits.empty() == false && mat.size() > 0) { cvector_t vmat = Utils::vectorize_matrix(mat); BaseState::qreg_.apply_multiplexer(control_qubits, target_qubits, vmat); } } template void State::apply_matrix(const Operations::Op &op) { if (op.qubits.empty() == false && op.mats[0].size() > 0) { if (Utils::is_diagonal(op.mats[0], .0)) { BaseState::qreg_.apply_diagonal_matrix(op.qubits, Utils::matrix_diagonal(op.mats[0])); } else { BaseState::qreg_.apply_matrix(op.qubits, Utils::vectorize_matrix(op.mats[0])); } } } template void State::apply_matrix(const reg_t &qubits, const cvector_t &vmat) { // Check if diagonal matrix if (vmat.size() == 1ULL << qubits.size()) { BaseState::qreg_.apply_diagonal_matrix(qubits, vmat); } else { BaseState::qreg_.apply_matrix(qubits, vmat); } } template void State::apply_gate_mcu3(const reg_t& qubits, double theta, double phi, double lambda) { BaseState::qreg_.apply_mcu(qubits, Utils::VMatrix::u3(theta, phi, lambda)); } template void State::apply_gate_phase(uint_t qubit, complex_t phase) { cvector_t diag = {{1., phase}}; apply_matrix(reg_t({qubit}), diag); } //========================================================================= // Implementation: Reset, Initialize and Measurement Sampling //========================================================================= template void State::apply_measure(const reg_t &qubits, const reg_t &cmemory, const reg_t &cregister, RngEngine &rng) { // Actual measurement outcome const auto meas = sample_measure_with_prob(qubits, rng); // Implement measurement update measure_reset_update(qubits, meas.first, meas.first, meas.second); const reg_t outcome = Utils::int2reg(meas.first, 2, qubits.size()); BaseState::creg_.store_measure(outcome, cmemory, cregister); } template rvector_t State::measure_probs(const reg_t &qubits) const { return BaseState::qreg_.probabilities(qubits); } template std::vector State::sample_measure(const reg_t &qubits, uint_t shots, RngEngine &rng) { // Generate flat register for storing std::vector rnds; rnds.reserve(shots); for (uint_t i = 0; i < shots; ++i) rnds.push_back(rng.rand(0, 1)); auto allbit_samples = BaseState::qreg_.sample_measure(rnds); // Convert to reg_t format std::vector all_samples; all_samples.reserve(shots); for (int_t val : allbit_samples) { reg_t allbit_sample = Utils::int2reg(val, 2, BaseState::qreg_.num_qubits()); reg_t sample; sample.reserve(qubits.size()); for (uint_t qubit : qubits) { sample.push_back(allbit_sample[qubit]); } all_samples.push_back(sample); } return all_samples; } template void State::apply_reset(const reg_t &qubits, RngEngine &rng) { // Simulate unobserved measurement const auto meas = sample_measure_with_prob(qubits, rng); // Apply update to reset state measure_reset_update(qubits, 0, meas.first, meas.second); } template std::pair State::sample_measure_with_prob(const reg_t &qubits, RngEngine &rng) { rvector_t probs = measure_probs(qubits); // Randomly pick outcome and return pair uint_t outcome = rng.rand_int(probs); return std::make_pair(outcome, probs[outcome]); } template void State::measure_reset_update(const std::vector &qubits, const uint_t final_state, const uint_t meas_state, const double meas_prob) { // Update a state vector based on an outcome pair [m, p] from // sample_measure_with_prob function, and a desired post-measurement final_state // Single-qubit case if (qubits.size() == 1) { // Diagonal matrix for projecting and renormalizing to measurement outcome cvector_t mdiag(2, 0.); mdiag[meas_state] = 1. / std::sqrt(meas_prob); apply_matrix(qubits, mdiag); // If it doesn't agree with the reset state update if (final_state != meas_state) { BaseState::qreg_.apply_mcx(qubits); } } // Multi qubit case else { // Diagonal matrix for projecting and renormalizing to measurement outcome const size_t dim = 1ULL << qubits.size(); cvector_t mdiag(dim, 0.); mdiag[meas_state] = 1. / std::sqrt(meas_prob); apply_matrix(qubits, mdiag); // If it doesn't agree with the reset state update // This function could be optimized as a permutation update if (final_state != meas_state) { // build vectorized permutation matrix cvector_t perm(dim * dim, 0.); perm[final_state * dim + meas_state] = 1.; perm[meas_state * dim + final_state] = 1.; for (size_t j=0; j < dim; j++) { if (j != final_state && j != meas_state) perm[j * dim + j] = 1.; } // apply permutation to swap state apply_matrix(qubits, perm); } } } template void State::apply_initialize(const reg_t &qubits, const cvector_t ¶ms, RngEngine &rng) { if (qubits.size() == BaseState::qreg_.num_qubits()) { // If qubits is all ordered qubits in the statevector // we can just initialize the whole state directly auto sorted_qubits = qubits; std::sort(sorted_qubits.begin(), sorted_qubits.end()); if (qubits == sorted_qubits) { initialize_qreg(qubits.size(), params); return; } } // Apply reset to qubits apply_reset(qubits, rng); // Apply initialize_component BaseState::qreg_.initialize_component(qubits, params); } //========================================================================= // Implementation: Multiplexer Circuit //========================================================================= template void State::apply_multiplexer(const reg_t &control_qubits, const reg_t &target_qubits, const std::vector &mmat) { // (1) Pack vector of matrices into single (stacked) matrix ... note: matrix dims: rows = DIM[qubit.size()] columns = DIM[|target bits|] cmatrix_t multiplexer_matrix = Utils::stacked_matrix(mmat); // (2) Treat as single, large(r), chained/batched matrix operator apply_multiplexer(control_qubits, target_qubits, multiplexer_matrix); } //========================================================================= // Implementation: Kraus Noise //========================================================================= template void State::apply_kraus(const reg_t &qubits, const std::vector &kmats, RngEngine &rng) { // Check edge case for empty Kraus set (this shouldn't happen) if (kmats.empty()) return; // end function early // Choose a real in [0, 1) to choose the applied kraus operator once // the accumulated probability is greater than r. // We know that the Kraus noise must be normalized // So we only compute probabilities for the first N-1 kraus operators // and infer the probability of the last one from 1 - sum of the previous double r = rng.rand(0., 1.); double accum = 0.; bool complete = false; // Loop through N-1 kraus operators for (size_t j=0; j < kmats.size() - 1; j++) { // Calculate probability cvector_t vmat = Utils::vectorize_matrix(kmats[j]); double p = BaseState::qreg_.norm(qubits, vmat); accum += p; // check if we need to apply this operator if (accum > r) { // rescale vmat so projection is normalized Utils::scalar_multiply_inplace(vmat, 1 / std::sqrt(p)); // apply Kraus projection operator apply_matrix(qubits, vmat); complete = true; break; } } // check if we haven't applied a kraus operator yet if (complete == false) { // Compute probability from accumulated complex_t renorm = 1 / std::sqrt(1. - accum); apply_matrix(qubits, Utils::vectorize_matrix(renorm * kmats.back())); } } //------------------------------------------------------------------------- } // end namespace QubitVector //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/simulators/superoperator/000077500000000000000000000000001362723322000214705ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/superoperator/superoperator.hpp000077500000000000000000000121421362723322000251160ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_superoperator_hpp_ #define _qv_superoperator_hpp_ #include "framework/utils.hpp" #include "simulators/density_matrix/densitymatrix.hpp" namespace QV { //============================================================================ // Superoperator class //============================================================================ // This class is derived from the DensityMatrix class and stores an N-qubit // superoperator as a 2 * N-qubit vector. // The vector is formed using column-stacking vectorization of the // superoperator (itself with respect to column-stacking vectorization). template class Superoperator : public DensityMatrix { public: // Parent class aliases using BaseVector = QubitVector; using BaseDensity = DensityMatrix; using BaseUnitary = UnitaryMatrix; //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- Superoperator() : Superoperator(0) {}; explicit Superoperator(size_t num_qubits); Superoperator(const Superoperator& obj) = delete; Superoperator &operator=(const Superoperator& obj) = delete; //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Set the size of the vector in terms of qubit number void set_num_qubits(size_t num_qubits); // Returns the number of qubits for the superoperator virtual uint_t num_qubits() const override {return num_qubits_;} // Initialize to the identity superoperator void initialize(); // Initializes the vector to a custom initial state. // The matrix can either be superoperator matrix or unitary matrix. // The type is inferred by the dimensions of the input matrix. void initialize_from_matrix(const AER::cmatrix_t &data); protected: // Number of qubits for the superoperator size_t num_qubits_; }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template Superoperator::Superoperator(size_t num_qubits) { set_num_qubits(num_qubits); } //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template void Superoperator::set_num_qubits(size_t num_qubits) { num_qubits_ = num_qubits; // Superoperator is same size matrix as a unitary matrix // of twice as many qubits BaseDensity::set_num_qubits(2 * num_qubits); } template void Superoperator::initialize() { // Set underlying unitary matrix to identity BaseUnitary::initialize(); } template void Superoperator::initialize_from_matrix(const AER::cmatrix_t &mat) { if (AER::Utils::is_square(mat)) { const size_t nrows = mat.GetRows(); if (nrows == BaseUnitary::rows_) { // The matrix is the same size as the superoperator matrix so we // initialze as the matrix. BaseUnitary::initialize_from_matrix(mat); return; } else if (nrows * nrows == BaseUnitary::rows_) { // If the input matrix has half the number of rows we assume it is // A unitary matrix input so we convert to a superoperator BaseUnitary::initialize_from_matrix( AER::Utils::tensor_product(AER::Utils::conjugate(mat), mat) ); return; } } // Throw an exception if the input matrix is the wrong size for // unitary or superoperator input throw std::runtime_error( "Superoperator::initial matrix is wrong size (" + std::to_string(BaseUnitary::rows_) + "," + std::to_string(BaseUnitary::rows_) + ")!=(" + std::to_string(mat.GetRows()) + "," + std::to_string(mat.GetColumns()) + ")." ); }; //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::Superoperator&m) { out << m.matrix(); return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/simulators/superoperator/superoperator_state.hpp000077500000000000000000000416311362723322000263230ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _superoperator_state_hpp #define _superoperator_state_hpp #include #define _USE_MATH_DEFINES #include #include "framework/utils.hpp" #include "framework/json.hpp" #include "simulators/state.hpp" #include "superoperator.hpp" namespace AER { namespace QubitSuperoperator { // Allowed gates enum class enum class Gates { u1, u2, u3, id, x, y, z, h, s, sdg, t, tdg, // single qubit cx, cz, swap, // two qubit ccx // three qubit }; // Allowed snapshots enum class enum class Snapshots {superop}; //========================================================================= // QubitUnitary State subclass //========================================================================= template > class State : public Base::State { public: using BaseState = Base::State; State() = default; virtual ~State() = default; //----------------------------------------------------------------------- // Base class overrides //----------------------------------------------------------------------- // Return the string name of the State class virtual std::string name() const override {return "superoperator";} // Return the set of qobj instruction types supported by the State virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t({ Operations::OpType::gate, Operations::OpType::reset, Operations::OpType::snapshot, Operations::OpType::barrier, Operations::OpType::matrix, Operations::OpType::kraus, Operations::OpType::superop }); } // Return the set of qobj gate instruction names supported by the State virtual stringset_t allowed_gates() const override { return {"U", "CX", "u1", "u2", "u3", "cx", "cz", "swap", "id", "x", "y", "z", "h", "s", "sdg", "t", "tdg", "ccx"}; } // Return the set of qobj snapshot types supported by the State virtual stringset_t allowed_snapshots() const override { return {"superoperator"}; } // Apply a sequence of operations by looping over list // If the input is not in allowed_ops an exeption will be raised. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; // Initializes an n-qubit unitary to the identity matrix virtual void initialize_qreg(uint_t num_qubits) override; // Initializes to a specific n-qubit unitary superop virtual void initialize_qreg(uint_t num_qubits, const data_t &unitary) override; // Returns the required memory for storing an n-qubit state in megabytes. // For this state the memory is indepdentent of the number of ops // and is approximately 16 * 1 << 4 * num_qubits bytes virtual size_t required_memory_mb(uint_t num_qubits, const std::vector &ops) const override; // Load the threshold for applying OpenMP parallelization // if the controller/engine allows threads for it // Config: {"omp_qubit_threshold": 3} virtual void set_config(const json_t &config) override; //----------------------------------------------------------------------- // Additional methods //----------------------------------------------------------------------- // Initializes to a specific n-qubit unitary given as a complex matrix virtual void initialize_qreg(uint_t num_qubits, const cmatrix_t &unitary); // Initialize OpenMP settings for the underlying QubitVector class void initialize_omp(); protected: //----------------------------------------------------------------------- // Apply Instructions //----------------------------------------------------------------------- // Applies a Gate operation to the state class. // This should support all and only the operations defined in // allowed_operations. void apply_gate(const Operations::Op &op); // Apply a supported snapshot instruction // If the input is not in allowed_snapshots an exeption will be raised. virtual void apply_snapshot(const Operations::Op &op, ExperimentData &data); // Apply a matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cmatrix_t & mat); // Apply a matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cvector_t & vmat); // Reset the specified qubits to the |0> state by simulating // a measurement, applying a conditional x-gate if the outcome is 1, and // then discarding the outcome. void apply_reset(const reg_t &qubits); // Apply a Kraus error operation void apply_kraus(const reg_t &qubits, const std::vector &krausops); //----------------------------------------------------------------------- // 1-Qubit Gates //----------------------------------------------------------------------- // Optimize phase gate with diagonal [1, phase] void apply_gate_phase(const uint_t qubit, const complex_t phase); //----------------------------------------------------------------------- // Multi-controlled u3 //----------------------------------------------------------------------- // Apply N-qubit multi-controlled single qubit waltz gate specified by // parameters u3(theta, phi, lambda) // NOTE: if N=1 this is just a regular u3 gate. void apply_gate_u3(const uint_t qubit, const double theta, const double phi, const double lambda); //----------------------------------------------------------------------- // Config Settings //----------------------------------------------------------------------- // OpenMP qubit threshold int omp_qubit_threshold_ = 3; // Threshold for chopping small values to zero in JSON double json_chop_threshold_ = 1e-10; // Table of allowed gate names to gate enum class members const static stringmap_t gateset_; }; //============================================================================ // Implementation: Allowed ops and gateset //============================================================================ template const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::x}, // Pauli-X gate {"y", Gates::y}, // Pauli-Y gate {"z", Gates::z}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gates::t}, // T-gate (sqrt(S)) {"tdg", Gates::tdg}, // Conjguate-transpose of T gate // Waltz Gates {"u1", Gates::u1}, // zero-X90 pulse waltz gate {"u2", Gates::u2}, // single-X90 pulse waltz gate {"u3", Gates::u3}, // two X90 pulse waltz gate {"U", Gates::u3}, // two X90 pulse waltz gate // Two-qubit gates {"CX", Gates::cx}, // Controlled-X gate (CNOT) {"cx", Gates::cx}, // Controlled-X gate (CNOT) {"cz", Gates::cz}, // Controlled-Z gate {"swap", Gates::swap}, // SWAP gate // Three-qubit gates {"ccx", Gates::ccx} // Controlled-CX gate (Toffoli) }); //============================================================================ // Implementation: Base class method overrides //============================================================================ template void State::apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) { // Simple loop over vector of input operations for (const auto op: ops) { switch (op.type) { case Operations::OpType::barrier: break; case Operations::OpType::gate: // Note conditionals will always fail since no classical registers if (BaseState::creg_.check_conditional(op)) apply_gate(op); break; case Operations::OpType::reset: apply_reset(op.qubits); break; case Operations::OpType::matrix: apply_matrix(op.qubits, op.mats[0]); break; case Operations::OpType::kraus: apply_kraus(op.qubits, op.mats); break; case Operations::OpType::superop: BaseState::qreg_.apply_superop_matrix(op.qubits, Utils::vectorize_matrix(op.mats[0])); break; case Operations::OpType::snapshot: apply_snapshot(op, data); break; default: throw std::invalid_argument("QubitSuperoperator::State::invalid instruction \'" + op.name + "\'."); } } } template size_t State::required_memory_mb(uint_t num_qubits, const std::vector &ops) const { // An n-qubit unitary as 2^4n complex doubles // where each complex double is 16 bytes (void)ops; // avoid unused variable compiler warning size_t shift_mb = std::max(0, num_qubits + 4 - 20); size_t mem_mb = 1ULL << (4 * shift_mb); return mem_mb; } template void State::set_config(const json_t &config) { // Set OMP threshold for state update functions JSON::get_value(omp_qubit_threshold_, "superoperator_parallel_threshold", config); // Set threshold for truncating snapshots JSON::get_value(json_chop_threshold_, "zero_threshold", config); BaseState::qreg_.set_json_chop_threshold(json_chop_threshold_); } template void State::initialize_qreg(uint_t num_qubits) { initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize(); } template void State::initialize_qreg(uint_t num_qubits, const data_t &supermat) { // Check dimension of state if (supermat.num_qubits() != num_qubits) { throw std::invalid_argument("QubitSuperoperator::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); const size_t sz = 1ULL << BaseState::qreg_.size(); BaseState::qreg_.initialize_from_data(supermat.data(), sz); } template void State::initialize_qreg(uint_t num_qubits, const cmatrix_t &mat) { // Check dimension of unitary const auto sz_uni = 1ULL << (2 * num_qubits); const auto sz_super = 1ULL << (4 * num_qubits); if (mat.size() != sz_uni && mat.size() != sz_super) { throw std::invalid_argument( "QubitSuperoperator::State::initialize: initial state does not match qubit number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_matrix(mat); } template void State::initialize_omp() { BaseState::qreg_.set_omp_threshold(omp_qubit_threshold_); if (BaseState::threads_ > 0) BaseState::qreg_.set_omp_threads(BaseState::threads_); // set allowed OMP threads in qubitvector } //========================================================================= // Implementation: Reset //========================================================================= template void State::apply_reset(const reg_t &qubits) { // TODO: This can be more efficient by adding reset // to base class rather than doing a matrix multiplication // where all but 1 row is zeros. const auto reset_op = Utils::SMatrix::reset(1ULL << qubits.size()); BaseState::qreg_.apply_superop_matrix(qubits, Utils::vectorize_matrix(reset_op)); } //========================================================================= // Implementation: Kraus Noise //========================================================================= template void State::apply_kraus(const reg_t &qubits, const std::vector &kmats) { // Convert to Superoperator const auto nrows = kmats[0].GetRows(); cmatrix_t superop(nrows * nrows, nrows * nrows); for (const auto kraus : kmats) { superop += Utils::tensor_product(Utils::conjugate(kraus), kraus); } BaseState::qreg_.apply_superop_matrix(qubits, Utils::vectorize_matrix(superop)); } //========================================================================= // Implementation: Gates //========================================================================= template void State::apply_gate(const Operations::Op &op) { // Look for gate name in gateset auto it = gateset_.find(op.name); if (it == gateset_.end()) throw std::invalid_argument("Unitary::State::invalid gate instruction \'" + op.name + "\'."); switch (it -> second) { case Gates::u3: apply_gate_u3(op.qubits[0], std::real(op.params[0]), std::real(op.params[1]), std::real(op.params[2])); break; case Gates::u2: apply_gate_u3(op.qubits[0], M_PI / 2., std::real(op.params[0]), std::real(op.params[1])); break; case Gates::u1: apply_gate_phase(op.qubits[0], std::exp(complex_t(0., 1.) * op.params[0])); break; case Gates::cx: BaseState::qreg_.apply_cnot(op.qubits[0], op.qubits[1]); break; case Gates::cz: BaseState::qreg_.apply_cz(op.qubits[0], op.qubits[1]); break; case Gates::id: break; case Gates::x: BaseState::qreg_.apply_x(op.qubits[0]); break; case Gates::y: BaseState::qreg_.apply_y(op.qubits[0]); break; case Gates::z: BaseState::qreg_.apply_z(op.qubits[0]); break; case Gates::h: apply_gate_u3(op.qubits[0], M_PI / 2., 0., M_PI); break; case Gates::s: apply_gate_phase(op.qubits[0], complex_t(0., 1.)); break; case Gates::sdg: apply_gate_phase(op.qubits[0], complex_t(0., -1.)); break; case Gates::t: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, isqrt2)); } break; case Gates::tdg: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, -isqrt2)); } break; case Gates::swap: { BaseState::qreg_.apply_swap(op.qubits[0], op.qubits[1]); } break; case Gates::ccx: BaseState::qreg_.apply_toffoli(op.qubits[0], op.qubits[1], op.qubits[2]); break; default: // We shouldn't reach here unless there is a bug in gateset throw std::invalid_argument("Superoperator::State::invalid gate instruction \'" + op.name + "\'."); } } template void State::apply_matrix(const reg_t &qubits, const cmatrix_t &mat) { if (qubits.empty() == false && mat.size() > 0) { BaseState::qreg_.apply_unitary_matrix(qubits, Utils::vectorize_matrix(mat)); } } template void State::apply_matrix(const reg_t &qubits, const cvector_t &vmat) { // Check if diagonal matrix if (vmat.size() == 1ULL << qubits.size()) { BaseState::qreg_.apply_diagonal_unitary_matrix(qubits, vmat); } else { BaseState::qreg_.apply_unitary_matrix(qubits, vmat); } } template void State::apply_gate_phase(uint_t qubit, complex_t phase) { cvector_t diag(2); diag[0] = 1.0; diag[1] = phase; BaseState::qreg_.apply_diagonal_unitary_matrix(reg_t({qubit}), diag); } template void State::apply_gate_u3(const uint_t qubit, double theta, double phi, double lambda) { const auto u3 = Utils::VMatrix::u3(theta, phi, lambda); BaseState::qreg_.apply_unitary_matrix(reg_t({qubit}), u3); } template void State::apply_snapshot(const Operations::Op &op, ExperimentData &data) { // Look for snapshot type in snapshotset if (op.name == "superopertor" || op.name == "state") { BaseState::snapshot_state(op, data, "superoperator"); } else { throw std::invalid_argument("QubitSuperoperator::State::invalid snapshot instruction \'" + op.name + "\'."); } } //------------------------------------------------------------------------------ } // end namespace QubitSuperoperator } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/simulators/unitary/000077500000000000000000000000001362723322000202515ustar00rootroot00000000000000qiskit-aer-0.4.1/src/simulators/unitary/unitary_state.hpp000077500000000000000000000372151362723322000236700ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _unitary_state_hpp #define _unitary_state_hpp #include #define _USE_MATH_DEFINES #include #include "simulators/state.hpp" #include "framework/json.hpp" #include "framework/utils.hpp" #include "unitarymatrix.hpp" #ifdef AER_THRUST_SUPPORTED #include "unitarymatrix_thrust.hpp" #endif namespace AER { namespace QubitUnitary { // Allowed gates enum class enum class Gates { id, h, s, sdg, t, tdg, // single qubit // multi-qubit controlled (including single-qubit non-controlled) mcx, mcy, mcz, mcu1, mcu2, mcu3, mcswap }; //========================================================================= // QubitUnitary State subclass //========================================================================= template > class State : public Base::State { public: using BaseState = Base::State; State() = default; virtual ~State() = default; //----------------------------------------------------------------------- // Base class overrides //----------------------------------------------------------------------- // Return the string name of the State class virtual std::string name() const override { return "unitary"; } // Return the set of qobj instruction types supported by the State virtual Operations::OpSet::optypeset_t allowed_ops() const override { return Operations::OpSet::optypeset_t( {Operations::OpType::gate, Operations::OpType::barrier, Operations::OpType::matrix, Operations::OpType::snapshot}); } // Return the set of qobj gate instruction names supported by the State virtual stringset_t allowed_gates() const override { return {"u1", "u2", "u3", "cx", "cz", "cy", "cu1", "cu2", "cu3", "swap", "id", "x", "y", "z", "h", "s", "sdg", "t", "tdg", "ccx", "cswap", "mcx", "mcy", "mcz", "mcu1", "mcu2", "mcu3", "mcswap"}; } // Return the set of qobj snapshot types supported by the State virtual stringset_t allowed_snapshots() const override { return {"unitary"}; } // Apply a sequence of operations by looping over list // If the input is not in allowed_ops an exeption will be raised. virtual void apply_ops(const std::vector &ops, ExperimentData &data, RngEngine &rng) override; // Initializes an n-qubit unitary to the identity matrix virtual void initialize_qreg(uint_t num_qubits) override; // Initializes to a specific n-qubit unitary matrix virtual void initialize_qreg(uint_t num_qubits, const unitary_matrix_t &unitary) override; // Returns the required memory for storing an n-qubit state in megabytes. // For this state the memory is indepdentent of the number of ops // and is approximately 16 * 1 << 2 * num_qubits bytes virtual size_t required_memory_mb( uint_t num_qubits, const std::vector &ops) const override; // Load the threshold for applying OpenMP parallelization // if the controller/engine allows threads for it // Config: {"omp_qubit_threshold": 7} virtual void set_config(const json_t &config) override; //----------------------------------------------------------------------- // Additional methods //----------------------------------------------------------------------- // Initializes to a specific n-qubit unitary given as a complex matrix virtual void initialize_qreg(uint_t num_qubits, const cmatrix_t &unitary); // Initialize OpenMP settings for the underlying QubitVector class void initialize_omp(); protected: //----------------------------------------------------------------------- // Apply Instructions //----------------------------------------------------------------------- // Applies a Gate operation to the state class. // This should support all and only the operations defined in // allowed_operations. void apply_gate(const Operations::Op &op); // Apply a supported snapshot instruction // If the input is not in allowed_snapshots an exeption will be raised. virtual void apply_snapshot(const Operations::Op &op, ExperimentData &data); // Apply a matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cmatrix_t &mat); // Apply a matrix to given qubits (identity on all other qubits) void apply_matrix(const reg_t &qubits, const cvector_t &vmat); //----------------------------------------------------------------------- // 1-Qubit Gates //----------------------------------------------------------------------- // Optimize phase gate with diagonal [1, phase] void apply_gate_phase(const uint_t qubit, const complex_t phase); //----------------------------------------------------------------------- // Multi-controlled u3 //----------------------------------------------------------------------- // Apply N-qubit multi-controlled single qubit waltz gate specified by // parameters u3(theta, phi, lambda) // NOTE: if N=1 this is just a regular u3 gate. void apply_gate_mcu3(const reg_t &qubits, const double theta, const double phi, const double lambda); //----------------------------------------------------------------------- // Config Settings //----------------------------------------------------------------------- // OpenMP qubit threshold int omp_qubit_threshold_ = 6; // Threshold for chopping small values to zero in JSON double json_chop_threshold_ = 1e-10; // Table of allowed gate names to gate enum class members const static stringmap_t gateset_; }; //============================================================================ // Implementation: Allowed ops and gateset //============================================================================ template const stringmap_t State::gateset_({ // Single qubit gates {"id", Gates::id}, // Pauli-Identity gate {"x", Gates::mcx}, // Pauli-X gate {"y", Gates::mcy}, // Pauli-Y gate {"z", Gates::mcz}, // Pauli-Z gate {"s", Gates::s}, // Phase gate (aka sqrt(Z) gate) {"sdg", Gates::sdg}, // Conjugate-transpose of Phase gate {"h", Gates::h}, // Hadamard gate (X + Z / sqrt(2)) {"t", Gates::t}, // T-gate (sqrt(S)) {"tdg", Gates::tdg}, // Conjguate-transpose of T gate // Waltz Gates {"u1", Gates::mcu1}, // zero-X90 pulse waltz gate {"u2", Gates::mcu2}, // single-X90 pulse waltz gate {"u3", Gates::mcu3}, // two X90 pulse waltz gate // Two-qubit gates {"cx", Gates::mcx}, // Controlled-X gate (CNOT) {"cy", Gates::mcy}, // Controlled-Z gate {"cz", Gates::mcz}, // Controlled-Z gate {"cu1", Gates::mcu1}, // Controlled-u1 gate {"cu2", Gates::mcu2}, // Controlled-u2 {"cu3", Gates::mcu3}, // Controlled-u3 gate {"swap", Gates::mcswap}, // SWAP gate // Three-qubit gates {"ccx", Gates::mcx}, // Controlled-CX gate (Toffoli) {"cswap", Gates::mcswap}, // Controlled-SWAP gate (Fredkin) // Multi-qubit controlled gates {"mcx", Gates::mcx}, // Multi-controlled-X gate {"mcy", Gates::mcy}, // Multi-controlled-Y gate {"mcz", Gates::mcz}, // Multi-controlled-Z gate {"mcu1", Gates::mcu1}, // Multi-controlled-u1 {"mcu2", Gates::mcu2}, // Multi-controlled-u2 {"mcu3", Gates::mcu3}, // Multi-controlled-u3 {"mcswap", Gates::mcswap} // Multi-controlled-SWAP gate }); //============================================================================ // Implementation: Base class method overrides //============================================================================ template void State::apply_ops( const std::vector &ops, ExperimentData &data, RngEngine &rng) { // Simple loop over vector of input operations for (const auto op : ops) { switch (op.type) { case Operations::OpType::barrier: break; case Operations::OpType::gate: // Note conditionals will always fail since no classical registers if (BaseState::creg_.check_conditional(op)) apply_gate(op); break; case Operations::OpType::snapshot: apply_snapshot(op, data); break; case Operations::OpType::matrix: apply_matrix(op.qubits, op.mats[0]); break; default: throw std::invalid_argument( "QubitUnitary::State::invalid instruction \'" + op.name + "\'."); } } } template size_t State::required_memory_mb( uint_t num_qubits, const std::vector &ops) const { // An n-qubit unitary as 2^2n complex doubles // where each complex double is 16 bytes (void)ops; // avoid unused variable compiler warning size_t shift_mb = std::max(0, num_qubits + 4 - 20); size_t mem_mb = 1ULL << (2 * shift_mb); return mem_mb; } template void State::set_config(const json_t &config) { // Set OMP threshold for state update functions JSON::get_value(omp_qubit_threshold_, "unitary_parallel_threshold", config); // Set threshold for truncating snapshots JSON::get_value(json_chop_threshold_, "zero_threshold", config); BaseState::qreg_.set_json_chop_threshold(json_chop_threshold_); } template void State::initialize_qreg(uint_t num_qubits) { initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize(); } template void State::initialize_qreg( uint_t num_qubits, const unitary_matrix_t &unitary) { // Check dimension of state if (unitary.num_qubits() != num_qubits) { throw std::invalid_argument( "Unitary::State::initialize: initial state does not match qubit " "number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); const size_t sz = 1ULL << BaseState::qreg_.size(); BaseState::qreg_.initialize_from_data(unitary.data(), sz); } template void State::initialize_qreg( uint_t num_qubits, const cmatrix_t &unitary) { // Check dimension of unitary if (unitary.size() != 1ULL << (2 * num_qubits)) { throw std::invalid_argument( "Unitary::State::initialize: initial state does not match qubit " "number"); } initialize_omp(); BaseState::qreg_.set_num_qubits(num_qubits); BaseState::qreg_.initialize_from_matrix(unitary); } template void State::initialize_omp() { BaseState::qreg_.set_omp_threshold(omp_qubit_threshold_); if (BaseState::threads_ > 0) BaseState::qreg_.set_omp_threads( BaseState::threads_); // set allowed OMP threads in qubitvector } //========================================================================= // Implementation: Gates //========================================================================= template void State::apply_gate(const Operations::Op &op) { // Look for gate name in gateset auto it = gateset_.find(op.name); if (it == gateset_.end()) throw std::invalid_argument("Unitary::State::invalid gate instruction \'" + op.name + "\'."); Gates g = it->second; switch (g) { case Gates::mcx: // Includes X, CX, CCX, etc BaseState::qreg_.apply_mcx(op.qubits); break; case Gates::mcy: // Includes Y, CY, CCY, etc BaseState::qreg_.apply_mcy(op.qubits); break; case Gates::mcz: // Includes Z, CZ, CCZ, etc BaseState::qreg_.apply_mcphase(op.qubits, -1); break; case Gates::id: break; case Gates::h: apply_gate_mcu3(op.qubits, M_PI / 2., 0., M_PI); break; case Gates::s: apply_gate_phase(op.qubits[0], complex_t(0., 1.)); break; case Gates::sdg: apply_gate_phase(op.qubits[0], complex_t(0., -1.)); break; case Gates::t: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, isqrt2)); } break; case Gates::tdg: { const double isqrt2{1. / std::sqrt(2)}; apply_gate_phase(op.qubits[0], complex_t(isqrt2, -isqrt2)); } break; case Gates::mcswap: // Includes SWAP, CSWAP, etc BaseState::qreg_.apply_mcswap(op.qubits); break; case Gates::mcu3: // Includes u3, cu3, etc apply_gate_mcu3(op.qubits, std::real(op.params[0]), std::real(op.params[1]), std::real(op.params[2])); break; case Gates::mcu2: // Includes u2, cu2, etc apply_gate_mcu3(op.qubits, M_PI / 2., std::real(op.params[0]), std::real(op.params[1])); break; case Gates::mcu1: // Includes u1, cu1, etc BaseState::qreg_.apply_mcphase(op.qubits, std::exp(complex_t(0, 1) * op.params[0])); break; default: // We shouldn't reach here unless there is a bug in gateset throw std::invalid_argument( "Unitary::State::invalid gate instruction \'" + op.name + "\'."); } } template void State::apply_matrix(const reg_t &qubits, const cmatrix_t &mat) { if (qubits.empty() == false && mat.size() > 0) { apply_matrix(qubits, Utils::vectorize_matrix(mat)); } } template void State::apply_matrix(const reg_t &qubits, const cvector_t &vmat) { // Check if diagonal matrix if (vmat.size() == 1ULL << qubits.size()) { BaseState::qreg_.apply_diagonal_matrix(qubits, vmat); } else { BaseState::qreg_.apply_matrix(qubits, vmat); } } template void State::apply_gate_phase(uint_t qubit, complex_t phase) { cmatrix_t diag(1, 2); diag(0, 0) = 1.0; diag(0, 1) = phase; apply_matrix(reg_t({qubit}), diag); } template void State::apply_gate_mcu3(const reg_t &qubits, double theta, double phi, double lambda) { const auto u3 = Utils::Matrix::u3(theta, phi, lambda); BaseState::qreg_.apply_mcu(qubits, Utils::vectorize_matrix(u3)); } template void State::apply_snapshot(const Operations::Op &op, ExperimentData &data) { // Look for snapshot type in snapshotset if (op.name == "unitary" || op.name == "state") { data.add_pershot_snapshot("unitary", op.string_params[0], BaseState::qreg_.matrix()); BaseState::snapshot_state(op, data); } else { throw std::invalid_argument( "Unitary::State::invalid snapshot instruction \'" + op.name + "\'."); } } //------------------------------------------------------------------------------ } // namespace QubitUnitary } // end namespace AER //------------------------------------------------------------------------------ #endif qiskit-aer-0.4.1/src/simulators/unitary/unitarymatrix.hpp000077500000000000000000000260121362723322000237060ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_unitary_matrix_hpp_ #define _qv_unitary_matrix_hpp_ #include "framework/utils.hpp" #include "simulators/statevector/qubitvector.hpp" namespace QV { //============================================================================ // UnitaryMatrix class //============================================================================ // This class is derived from the QubitVector class and stores an N-qubit // matrix as a 2*N-qubit vector. // The vector is formed using column-stacking vectorization as under this // convention left-matrix multiplication on qubit-n is equal to multiplication // of the vectorized 2*N qubit vector also on qubit-n. template class UnitaryMatrix : public QubitVector { public: // Type aliases using BaseVector = QubitVector; //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- UnitaryMatrix() : UnitaryMatrix(0) {}; explicit UnitaryMatrix(size_t num_qubits); UnitaryMatrix(const UnitaryMatrix& obj) = delete; UnitaryMatrix &operator=(const UnitaryMatrix& obj) = delete; //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Set the size of the vector in terms of qubit number void set_num_qubits(size_t num_qubits); // Return the number of rows in the matrix size_t num_rows() const {return rows_;} // Returns the number of qubits for the current vector virtual uint_t num_qubits() const override { return num_qubits_;} // Returns a copy of the underlying data_t data as a complex vector AER::cmatrix_t matrix() const; // Return the trace of the unitary std::complex trace() const; // Return JSON serialization of UnitaryMatrix; json_t json() const; // Initializes the current vector so that all qubits are in the |0> state. void initialize(); // Initializes the vector to a custom initial state. // If the length of the statevector does not match the number of qubits // an exception is raised. void initialize_from_matrix(const AER::cmatrix_t &mat); //----------------------------------------------------------------------- // Identity checking //----------------------------------------------------------------------- // Return pair (True, theta) if the current matrix is equal to // exp(i * theta) * identity matrix. Otherwise return (False, 0). // The phase is returned as a parameter between -Pi and Pi. std::pair check_identity() const; // Set the threshold for verify_identity void set_check_identity_threshold(double threshold) { identity_threshold_ = threshold; } // Get the threshold for verify_identity double get_check_identity_threshold() {return identity_threshold_;} protected: //----------------------------------------------------------------------- // Protected data members //----------------------------------------------------------------------- size_t num_qubits_; size_t rows_; //----------------------------------------------------------------------- // Additional config settings //----------------------------------------------------------------------- double identity_threshold_ = 1e-10; // Threshold for verifying if the // internal matrix is identity up to // global phase }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // JSON Serialization //------------------------------------------------------------------------------ template inline void to_json(json_t &js, const UnitaryMatrix &qmat) { js = qmat.json(); } template json_t UnitaryMatrix::json() const { const int_t nrows = rows_; // Initialize empty matrix const json_t ZERO = std::complex(0.0, 0.0); json_t js = json_t(nrows, json_t(nrows, ZERO)); if (BaseVector::json_chop_threshold_ > 0) { #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #ifdef _WIN32 #pragma omp for #else #pragma omp for collapse(2) #endif for (int_t i=0; i < nrows; i++) for (int_t j=0; j < nrows; j++) { const auto val = BaseVector::data_[i + nrows * j]; if (std::abs(val.real()) > BaseVector::json_chop_threshold_) js[i][j][0] = val.real(); if (std::abs(val.imag()) > BaseVector::json_chop_threshold_) js[i][j][1] = val.imag(); } } } else { #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #ifdef _WIN32 #pragma omp for #else #pragma omp for collapse(2) #endif for (int_t i=0; i < nrows; i++) for (int_t j=0; j < nrows; j++) { const auto val = BaseVector::data_[i + nrows * j]; js[i][j][0] = val.real(); js[i][j][1] = val.imag(); } } } return js; } //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template UnitaryMatrix::UnitaryMatrix(size_t num_qubits) { set_num_qubits(num_qubits); } //------------------------------------------------------------------------------ // Convert data vector to matrix //------------------------------------------------------------------------------ template AER::cmatrix_t UnitaryMatrix::matrix() const { const int_t nrows = rows_; AER::cmatrix_t ret(nrows, nrows); #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #ifdef _WIN32 #pragma omp for #else #pragma omp for collapse(2) #endif for (int_t i=0; i < nrows; i++) for (int_t j=0; j < nrows; j++) { ret(i, j) = BaseVector::data_[i + nrows * j]; } } // end omp parallel return ret; } //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template void UnitaryMatrix::initialize() { // Zero the underlying vector BaseVector::zero(); // Set to be identity matrix const int_t nrows = rows_; // end for k loop #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) for (int_t k = 0; k < nrows; ++k) { BaseVector::data_[k * (nrows + 1)] = 1.0; } } template void UnitaryMatrix::initialize_from_matrix(const AER::cmatrix_t &mat) { const int_t nrows = rows_; // end for k loop if (nrows != static_cast(mat.GetRows()) || nrows != static_cast(mat.GetColumns())) { throw std::runtime_error( "UnitaryMatrix::initialize input matrix is incorrect shape (" + std::to_string(nrows) + "," + std::to_string(nrows) + ")!=(" + std::to_string(mat.GetRows()) + "," + std::to_string(mat.GetColumns()) + ")." ); } if (AER::Utils::is_unitary(mat, 1e-10) == false) { throw std::runtime_error( "UnitaryMatrix::initialize input matrix is not unitary." ); } #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) for (int_t row = 0; row < nrows; ++row) for (int_t col = 0; col < nrows; ++col) { BaseVector::data_[row + nrows * col] = mat(row, col); } } template void UnitaryMatrix::set_num_qubits(size_t num_qubits) { // Set the number of rows for the matrix num_qubits_ = num_qubits; rows_ = 1ULL << num_qubits; // Set the underlying vectorized matrix to be 2 * number of qubits BaseVector::set_num_qubits(2 * num_qubits); } template std::complex UnitaryMatrix::trace() const { const int_t NROWS = rows_; const int_t DIAG = NROWS + 1; double val_re = 0.; double val_im = 0.; #pragma omp parallel reduction(+:val_re, val_im) if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #pragma omp for for (int_t k = 0; k < NROWS; ++k) { val_re += std::real(BaseVector::data_[k * DIAG]); val_im += std::imag(BaseVector::data_[k * DIAG]); } } return std::complex(val_re, val_im); } //------------------------------------------------------------------------------ // Check Identity //------------------------------------------------------------------------------ template std::pair UnitaryMatrix::check_identity() const { // To check if identity we first check we check that: // 1. U(0, 0) = exp(i * theta) // 2. U(i, i) = U(0, 0) // 3. U(i, j) = 0 for j != i auto failed = std::make_pair(false, 0.0); // Check condition 1. const auto u00 = BaseVector::data_[0]; if (std::norm(std::abs(u00) - 1.0) > identity_threshold_) { return failed; } const auto theta = std::arg(u00); // Check conditions 2 and 3 double delta = 0.; for (size_t i=0; i < rows_; i++) { for (size_t j=0; j < rows_; j++) { auto val = (i==j) ? std::norm(BaseVector::data_[i + rows_ * j] - u00) : std::norm(BaseVector::data_[i + rows_ * j]); if (val > identity_threshold_) { return failed; // fail fast if single entry differs } else delta += val; // accumulate difference } } // Check small errors didn't accumulate if (delta > identity_threshold_) { return failed; } // Otherwise we pass return std::make_pair(true, theta); } //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::UnitaryMatrix&m) { out << m.matrix(); return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/simulators/unitary/unitarymatrix_thrust.hpp000077500000000000000000000325421362723322000253240ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019, 2020. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _qv_unitary_matrix_thrust_hpp_ #define _qv_unitary_matrix_thrust_hpp_ #include "framework/utils.hpp" #include "simulators/statevector/qubitvector_thrust.hpp" namespace QV { //============================================================================ // UnitaryMatrixThrust class //============================================================================ // This class is derived from the QubitVectorThrust class and stores an N-qubit // matrix as a 2*N-qubit vector. // The vector is formed using column-stacking vectorization as under this // convention left-matrix multiplication on qubit-n is equal to multiplication // of the vectorized 2*N qubit vector also on qubit-n. template class UnitaryMatrixThrust : public QubitVectorThrust { public: // Type aliases using BaseVector = QubitVectorThrust; //----------------------------------------------------------------------- // Constructors and Destructor //----------------------------------------------------------------------- UnitaryMatrixThrust() : UnitaryMatrixThrust(0) {}; explicit UnitaryMatrixThrust(size_t num_qubits); UnitaryMatrixThrust(const UnitaryMatrixThrust& obj) = delete; UnitaryMatrixThrust &operator=(const UnitaryMatrixThrust& obj) = delete; //----------------------------------------------------------------------- // Utility functions //----------------------------------------------------------------------- // Return the string name of the class #ifdef AER_THRUST_CUDA static std::string name() {return "unitary_gpu";} #else static std::string name() {return "unitary_thrust";} #endif // Set the size of the vector in terms of qubit number void set_num_qubits(size_t num_qubits); // Return the number of rows in the matrix size_t num_rows() const {return rows_;} // Returns the number of qubits for the current vector virtual uint_t num_qubits() const override { return num_qubits_;} // Returns a copy of the underlying data_t data as a complex vector AER::cmatrix_t matrix() const; // Return the trace of the unitary std::complex trace() const; // Return JSON serialization of UnitaryMatrixThrust; json_t json() const; // Initializes the current vector so that all qubits are in the |0> state. void initialize(); // Initializes the vector to a custom initial state. // If the length of the statevector does not match the number of qubits // an exception is raised. void initialize_from_matrix(const AER::cmatrix_t &mat); //----------------------------------------------------------------------- // Identity checking //----------------------------------------------------------------------- // Return pair (True, theta) if the current matrix is equal to // exp(i * theta) * identity matrix. Otherwise return (False, 0). // The phase is returned as a parameter between -Pi and Pi. std::pair check_identity() const; // Set the threshold for verify_identity void set_check_identity_threshold(double threshold) { identity_threshold_ = threshold; } // Get the threshold for verify_identity double get_check_identity_threshold() {return identity_threshold_;} protected: //----------------------------------------------------------------------- // Protected data members //----------------------------------------------------------------------- size_t num_qubits_; size_t rows_; //----------------------------------------------------------------------- // Additional config settings //----------------------------------------------------------------------- double identity_threshold_ = 1e-10; // Threshold for verifying if the // internal matrix is identity up to // global phase }; /******************************************************************************* * * Implementations * ******************************************************************************/ //------------------------------------------------------------------------------ // JSON Serialization //------------------------------------------------------------------------------ template inline void to_json(json_t &js, const UnitaryMatrixThrust &qmat) { js = qmat.json(); } template json_t UnitaryMatrixThrust::json() const { const int_t nrows = rows_; int iPlace; uint_t i, irow, icol, ic, nc; uint_t pos = 0; uint_t csize = 1ull << BaseVector::m_maxChunkBits; cvector_t tmp(csize); const json_t ZERO = std::complex < data_t > (0.0, 0.0); json_t js = json_t(nrows, json_t(nrows, ZERO)); BaseVector::UpdateReferencedValue(); for (iPlace = 0; iPlace < BaseVector::m_nPlaces; iPlace++) { nc = BaseVector::m_Chunks[iPlace].NumChunks(BaseVector::m_maxChunkBits); for (ic = 0; ic < nc; ic++) { BaseVector::m_Chunks[iPlace].CopyOut((thrust::complex*) &tmp[0], 0, ic,BaseVector::m_maxChunkBits); #pragma omp parallel private(i,irow,icol) if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { if (BaseVector::json_chop_threshold_ > 0) { #pragma omp for for (i = 0; i < csize; i++) { irow = ((pos + i) >> num_qubits_); icol = (pos + i) - (irow << num_qubits_); if (std::abs(tmp[i].real()) > BaseVector::json_chop_threshold_) js[icol][irow][0] = tmp[i].real(); if (std::abs(tmp[i].imag()) > BaseVector::json_chop_threshold_) js[icol][irow][1] = tmp[i].imag(); } } else { #pragma omp for for (i = 0; i < csize; i++) { irow = ((pos + i) >> num_qubits_); icol = (pos + i) - (irow << num_qubits_); js[icol][irow][0] = tmp[i].real(); js[icol][irow][1] = tmp[i].imag(); } } } pos += csize; } } return js; } //------------------------------------------------------------------------------ // Constructors & Destructor //------------------------------------------------------------------------------ template UnitaryMatrixThrust::UnitaryMatrixThrust(size_t num_qubits) { if(num_qubits > 0){ set_num_qubits(num_qubits); } } //------------------------------------------------------------------------------ // Convert data vector to matrix //------------------------------------------------------------------------------ template AER::cmatrix_t UnitaryMatrixThrust::matrix() const { const int_t nrows = rows_; AER::cmatrix_t ret(nrows, nrows); cvector_t qreg = BaseVector::vector(); int iPlace; uint_t ic, nc; uint_t pos = 0; uint_t csize = 1ull << BaseVector::m_maxChunkBits; cvector_t tmp(csize); BaseVector::UpdateReferencedValue(); for (iPlace = 0; iPlace < BaseVector::m_nPlaces; iPlace++) { nc = BaseVector::m_Chunks[iPlace].NumChunks(BaseVector::m_maxChunkBits); for (ic = 0; ic < nc; ic++) { BaseVector::m_Chunks[iPlace].CopyOut((thrust::complex*) &tmp[0], 0, ic,BaseVector::m_maxChunkBits); int_t i, irow, icol; #pragma omp parallel for private(i,irow,icol) if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) for (i = 0; i < csize; i++) { irow = ((pos + i) >> num_qubits_); icol = (pos + i) - (irow << num_qubits_); ret(icol, irow) = tmp[i]; } pos += csize; } } return ret; } //------------------------------------------------------------------------------ // Utility //------------------------------------------------------------------------------ template void UnitaryMatrixThrust::initialize() { std::complex one = 1.0; // Zero the underlying vector BaseVector::zero(); // Set to be identity matrix const int_t nrows = rows_; // end for k loop #pragma omp parallel if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) for (int_t k = 0; k < nrows; ++k) { BaseVector::set_state(k * (nrows + 1),one); } } template void UnitaryMatrixThrust::initialize_from_matrix(const AER::cmatrix_t &mat) { const int_t nrows = rows_; // end for k loop if (nrows != static_cast(mat.GetRows()) || nrows != static_cast(mat.GetColumns())) { throw std::runtime_error( "UnitaryMatrixThrust::initialize input matrix is incorrect shape (" + std::to_string(nrows) + "," + std::to_string(nrows) + ")!=(" + std::to_string(mat.GetRows()) + "," + std::to_string(mat.GetColumns()) + ")." ); } if (AER::Utils::is_unitary(mat, 1e-10) == false) { throw std::runtime_error( "UnitaryMatrixThrust::initialize input matrix is not unitary." ); } int iPlace; uint_t i,irow,icol,ic,nc; uint_t pos = 0; uint_t csize = 1ull << BaseVector::m_maxChunkBits; cvector_t tmp(csize); for(iPlace=0;iPlace BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) for(i=0;i> num_qubits_); icol = (pos+i) - (irow << num_qubits_); tmp[i] = mat(irow,icol); } BaseVector::m_Chunks[iPlace].CopyIn((thrust::complex*)&tmp[0],0,ic,BaseVector::m_maxChunkBits); pos += csize; } } } template void UnitaryMatrixThrust::set_num_qubits(size_t num_qubits) { // Set the number of rows for the matrix num_qubits_ = num_qubits; rows_ = 1ULL << num_qubits; // Set the underlying vectorized matrix to be 2 * number of qubits BaseVector::set_num_qubits(2 * num_qubits); } template std::complex UnitaryMatrixThrust::trace() const { const int_t NROWS = rows_; const int_t DIAG = NROWS + 1; double val_re = 0.; double val_im = 0.; std::complex d; #pragma omp parallel private(d) reduction(+:val_re, val_im) if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) { #pragma omp for for (int_t k = 0; k < NROWS; ++k) { d = BaseVector::get_state(k * DIAG,BaseVector::m_maxChunkBits); val_re += std::real(d); val_im += std::imag(d); } } return std::complex(val_re, val_im); } //------------------------------------------------------------------------------ // Check Identity //------------------------------------------------------------------------------ template std::pair UnitaryMatrixThrust::check_identity() const { // To check if identity we first check we check that: // 1. U(0, 0) = exp(i * theta) // 2. U(i, i) = U(0, 0) // 3. U(i, j) = 0 for j != i auto failed = std::make_pair(false, 0.0); // Check condition 1. const auto u00 = BaseVector::get_state(0); if (std::norm(std::abs(u00) - 1.0) > identity_threshold_) { return failed; } const auto theta = std::arg(u00); // Check conditions 2 and 3 double delta = 0.; int iPlace; uint_t i,irow,icol,ic,nc; uint_t pos = 0; uint_t csize = 1ull << BaseVector::m_maxChunkBits; cvector_t tmp(csize); BaseVector::UpdateReferencedValue(); for(iPlace=0;iPlace*)&tmp[0],0,ic,BaseVector::m_maxChunkBits); uint_t err_count = 0; #pragma omp parallel for private(i,irow,icol) reduction(+:delta,err_count) if (BaseVector::num_qubits_ > BaseVector::omp_threshold_ && BaseVector::omp_threads_ > 1) num_threads(BaseVector::omp_threads_) for(i=0;i> num_qubits_); icol = (pos+i) - (irow << num_qubits_); auto val = (irow==icol) ? std::norm(tmp[i] - u00) : std::norm(tmp[i]); if (val > identity_threshold_) { err_count++; } else{ delta += val; // accumulate difference } } if(err_count > 0){ return failed; } pos += csize; } } // Check small errors didn't accumulate if (delta > identity_threshold_) { return failed; } // Otherwise we pass return std::make_pair(true, theta); } //------------------------------------------------------------------------------ } // end namespace QV //------------------------------------------------------------------------------ // ostream overload for templated qubitvector template inline std::ostream &operator<<(std::ostream &out, const QV::UnitaryMatrixThrust&m) { out << m.matrix(); return out; } //------------------------------------------------------------------------------ #endif // end module qiskit-aer-0.4.1/src/third-party/000077500000000000000000000000001362723322000166235ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/headers/000077500000000000000000000000001362723322000202365ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/headers/LICENSE-json.MIT000077500000000000000000000020631362723322000226460ustar00rootroot00000000000000MIT License Copyright (c) 2013-2018 Niels Lohmann 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.qiskit-aer-0.4.1/src/third-party/headers/LICENSE-thrust.txt000066400000000000000000000236771362723322000234270ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS qiskit-aer-0.4.1/src/third-party/headers/muparserx/000077500000000000000000000000001362723322000222645ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/headers/nlohmann_json.hpp000077500000000000000000022044771362723322000236350ustar00rootroot00000000000000/* __ _____ _____ _____ __| | __| | | | JSON for Modern C++ | | |__ | | | | | | version 3.1.1 |_____|_____|_____|_|___| https://github.com/nlohmann/json Licensed under the MIT License . Copyright (c) 2013-2018 Niels Lohmann . 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 NLOHMANN_JSON_HPP #define NLOHMANN_JSON_HPP #define NLOHMANN_JSON_VERSION_MAJOR 3 #define NLOHMANN_JSON_VERSION_MINOR 1 #define NLOHMANN_JSON_VERSION_PATCH 1 #include // all_of, find, for_each #include // assert #include // and, not, or #include // nullptr_t, ptrdiff_t, size_t #include // hash, less #include // initializer_list #include // istream, ostream #include // iterator_traits, random_access_iterator_tag #include // accumulate #include // string, stoi, to_string #include // declval, forward, move, pair, swap // #include #ifndef NLOHMANN_JSON_FWD_HPP #define NLOHMANN_JSON_FWD_HPP #include // int64_t, uint64_t #include // map #include // allocator #include // string #include // vector /*! @brief namespace for Niels Lohmann @see https://github.com/nlohmann @since version 1.0.0 */ namespace nlohmann { /*! @brief default JSONSerializer template argument This serializer ignores the template arguments and uses ADL ([argument-dependent lookup](http://en.cppreference.com/w/cpp/language/adl)) for serialization. */ template struct adl_serializer; template class ObjectType = std::map, template class ArrayType = std::vector, class StringType = std::string, class BooleanType = bool, class NumberIntegerType = std::int64_t, class NumberUnsignedType = std::uint64_t, class NumberFloatType = double, template class AllocatorType = std::allocator, template class JSONSerializer = adl_serializer> class basic_json; /*! @brief JSON Pointer A JSON pointer defines a string syntax for identifying a specific value within a JSON document. It can be used with functions `at` and `operator[]`. Furthermore, JSON pointers are the base for JSON patches. @sa [RFC 6901](https://tools.ietf.org/html/rfc6901) @since version 2.0.0 */ template class json_pointer; /*! @brief default JSON class This type is the default specialization of the @ref basic_json class which uses the standard template types. @since version 1.0.0 */ using json = basic_json<>; } #endif // #include // This file contains all internal macro definitions // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them // exclude unsupported compilers #if defined(__clang__) #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" #endif #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40900 #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" #endif #endif // disable float-equal warnings on GCC/clang #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wfloat-equal" #endif // disable documentation warnings on clang #if defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdocumentation" #endif // allow for portable deprecation warnings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #define JSON_DEPRECATED __attribute__((deprecated)) #elif defined(_MSC_VER) #define JSON_DEPRECATED __declspec(deprecated) #else #define JSON_DEPRECATED #endif // allow to disable exceptions #if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) #define JSON_THROW(exception) throw exception #define JSON_TRY try #define JSON_CATCH(exception) catch(exception) #else #define JSON_THROW(exception) std::abort() #define JSON_TRY if(true) #define JSON_CATCH(exception) if(false) #endif // override exception macros #if defined(JSON_THROW_USER) #undef JSON_THROW #define JSON_THROW JSON_THROW_USER #endif #if defined(JSON_TRY_USER) #undef JSON_TRY #define JSON_TRY JSON_TRY_USER #endif #if defined(JSON_CATCH_USER) #undef JSON_CATCH #define JSON_CATCH JSON_CATCH_USER #endif // manual branch prediction #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #define JSON_LIKELY(x) __builtin_expect(!!(x), 1) #define JSON_UNLIKELY(x) __builtin_expect(!!(x), 0) #else #define JSON_LIKELY(x) x #define JSON_UNLIKELY(x) x #endif // C++ language standard detection #if (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 #define JSON_HAS_CPP_17 #define JSON_HAS_CPP_14 #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) #define JSON_HAS_CPP_14 #endif // Ugly macros to avoid uglier copy-paste when specializing basic_json. They // may be removed in the future once the class is split. #define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ template class ObjectType, \ template class ArrayType, \ class StringType, class BooleanType, class NumberIntegerType, \ class NumberUnsignedType, class NumberFloatType, \ template class AllocatorType, \ template class JSONSerializer> #define NLOHMANN_BASIC_JSON_TPL \ basic_json /*! @brief Helper to determine whether there's a key_type for T. This helper is used to tell associative containers apart from other containers such as sequence containers. For instance, `std::map` passes the test as it contains a `mapped_type`, whereas `std::vector` fails the test. @sa http://stackoverflow.com/a/7728728/266378 @since version 1.0.0, overworked in version 2.0.6 */ #define NLOHMANN_JSON_HAS_HELPER(type) \ template struct has_##type { \ private: \ template \ static int detect(U &&); \ static void detect(...); \ public: \ static constexpr bool value = \ std::is_integral()))>::value; \ } // #include #include // not #include // size_t #include // numeric_limits #include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type #include // declval // #include // #include namespace nlohmann { /*! @brief detail namespace with internal helper functions This namespace collects functions that should not be exposed, implementations of some @ref basic_json methods, and meta-programming helpers. @since version 2.1.0 */ namespace detail { ///////////// // helpers // ///////////// template struct is_basic_json : std::false_type {}; NLOHMANN_BASIC_JSON_TPL_DECLARATION struct is_basic_json : std::true_type {}; // alias templates to reduce boilerplate template using enable_if_t = typename std::enable_if::type; template using uncvref_t = typename std::remove_cv::type>::type; // implementation of C++14 index_sequence and affiliates // source: https://stackoverflow.com/a/32223343 template struct index_sequence { using type = index_sequence; using value_type = std::size_t; static constexpr std::size_t size() noexcept { return sizeof...(Ints); } }; template struct merge_and_renumber; template struct merge_and_renumber, index_sequence> : index_sequence < I1..., (sizeof...(I1) + I2)... > {}; template struct make_index_sequence : merge_and_renumber < typename make_index_sequence < N / 2 >::type, typename make_index_sequence < N - N / 2 >::type > {}; template<> struct make_index_sequence<0> : index_sequence<> {}; template<> struct make_index_sequence<1> : index_sequence<0> {}; template using index_sequence_for = make_index_sequence; /* Implementation of two C++17 constructs: conjunction, negation. This is needed to avoid evaluating all the traits in a condition For example: not std::is_same::value and has_value_type::value will not compile when T = void (on MSVC at least). Whereas conjunction>, has_value_type>::value will stop evaluating if negation<...>::value == false Please note that those constructs must be used with caution, since symbols can become very long quickly (which can slow down compilation and cause MSVC internal compiler errors). Only use it when you have to (see example ahead). */ template struct conjunction : std::true_type {}; template struct conjunction : B1 {}; template struct conjunction : std::conditional, B1>::type {}; template struct negation : std::integral_constant {}; // dispatch utility (taken from ranges-v3) template struct priority_tag : priority_tag < N - 1 > {}; template<> struct priority_tag<0> {}; //////////////////////// // has_/is_ functions // //////////////////////// // source: https://stackoverflow.com/a/37193089/4116453 template struct is_complete_type : std::false_type {}; template struct is_complete_type : std::true_type {}; NLOHMANN_JSON_HAS_HELPER(mapped_type); NLOHMANN_JSON_HAS_HELPER(key_type); NLOHMANN_JSON_HAS_HELPER(value_type); NLOHMANN_JSON_HAS_HELPER(iterator); template struct is_compatible_object_type_impl : std::false_type {}; template struct is_compatible_object_type_impl { static constexpr auto value = std::is_constructible::value and std::is_constructible::value; }; template struct is_compatible_object_type { static auto constexpr value = is_compatible_object_type_impl < conjunction>, has_mapped_type, has_key_type>::value, typename BasicJsonType::object_t, CompatibleObjectType >::value; }; template struct is_basic_json_nested_type { static auto constexpr value = std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value; }; template struct is_compatible_array_type { static auto constexpr value = conjunction>, negation>, negation>, negation>, has_value_type, has_iterator>::value; }; template struct is_compatible_integer_type_impl : std::false_type {}; template struct is_compatible_integer_type_impl { // is there an assert somewhere on overflows? using RealLimits = std::numeric_limits; using CompatibleLimits = std::numeric_limits; static constexpr auto value = std::is_constructible::value and CompatibleLimits::is_integer and RealLimits::is_signed == CompatibleLimits::is_signed; }; template struct is_compatible_integer_type { static constexpr auto value = is_compatible_integer_type_impl < std::is_integral::value and not std::is_same::value, RealIntegerType, CompatibleNumberIntegerType > ::value; }; // trait checking if JSONSerializer::from_json(json const&, udt&) exists template struct has_from_json { private: // also check the return type of from_json template::from_json( std::declval(), std::declval()))>::value>> static int detect(U&&); static void detect(...); public: static constexpr bool value = std::is_integral>()))>::value; }; // This trait checks if JSONSerializer::from_json(json const&) exists // this overload is used for non-default-constructible user-defined-types template struct has_non_default_from_json { private: template < typename U, typename = enable_if_t::from_json(std::declval()))>::value >> static int detect(U&&); static void detect(...); public: static constexpr bool value = std::is_integral>()))>::value; }; // This trait checks if BasicJsonType::json_serializer::to_json exists template struct has_to_json { private: template::to_json( std::declval(), std::declval()))> static int detect(U&&); static void detect(...); public: static constexpr bool value = std::is_integral>()))>::value; }; template struct is_compatible_complete_type { static constexpr bool value = not std::is_base_of::value and not std::is_same::value and not is_basic_json_nested_type::value and has_to_json::value; }; template struct is_compatible_type : conjunction, is_compatible_complete_type> { }; // taken from ranges-v3 template struct static_const { static constexpr T value{}; }; template constexpr T static_const::value; } } // #include #include // exception #include // runtime_error #include // to_string namespace nlohmann { namespace detail { //////////////// // exceptions // //////////////// /*! @brief general exception of the @ref basic_json class This class is an extension of `std::exception` objects with a member @a id for exception ids. It is used as the base class for all exceptions thrown by the @ref basic_json class. This class can hence be used as "wildcard" to catch exceptions. Subclasses: - @ref parse_error for exceptions indicating a parse error - @ref invalid_iterator for exceptions indicating errors with iterators - @ref type_error for exceptions indicating executing a member function with a wrong type - @ref out_of_range for exceptions indicating access out of the defined range - @ref other_error for exceptions indicating other library errors @internal @note To have nothrow-copy-constructible exceptions, we internally use `std::runtime_error` which can cope with arbitrary-length error messages. Intermediate strings are built with static functions and then passed to the actual constructor. @endinternal @liveexample{The following code shows how arbitrary library exceptions can be caught.,exception} @since version 3.0.0 */ class exception : public std::exception { public: /// returns the explanatory string const char* what() const noexcept override { return m.what(); } /// the id of the exception const int id; protected: exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} static std::string name(const std::string& ename, int id_) { return "[json.exception." + ename + "." + std::to_string(id_) + "] "; } private: /// an exception object as storage for error messages std::runtime_error m; }; /*! @brief exception indicating a parse error This exception is thrown by the library when a parse error occurs. Parse errors can occur during the deserialization of JSON text, CBOR, MessagePack, as well as when using JSON Patch. Member @a byte holds the byte index of the last read character in the input file. Exceptions have ids 1xx. name / id | example message | description ------------------------------ | --------------- | ------------------------- json.exception.parse_error.101 | parse error at 2: unexpected end of input; expected string literal | This error indicates a syntax error while deserializing a JSON text. The error message describes that an unexpected token (character) was encountered, and the member @a byte indicates the error position. json.exception.parse_error.102 | parse error at 14: missing or wrong low surrogate | JSON uses the `\uxxxx` format to describe Unicode characters. Code points above above 0xFFFF are split into two `\uxxxx` entries ("surrogate pairs"). This error indicates that the surrogate pair is incomplete or contains an invalid code point. json.exception.parse_error.103 | parse error: code points above 0x10FFFF are invalid | Unicode supports code points up to 0x10FFFF. Code points above 0x10FFFF are invalid. json.exception.parse_error.104 | parse error: JSON patch must be an array of objects | [RFC 6902](https://tools.ietf.org/html/rfc6902) requires a JSON Patch document to be a JSON document that represents an array of objects. json.exception.parse_error.105 | parse error: operation must have string member 'op' | An operation of a JSON Patch document must contain exactly one "op" member, whose value indicates the operation to perform. Its value must be one of "add", "remove", "replace", "move", "copy", or "test"; other values are errors. json.exception.parse_error.106 | parse error: array index '01' must not begin with '0' | An array index in a JSON Pointer ([RFC 6901](https://tools.ietf.org/html/rfc6901)) may be `0` or any number without a leading `0`. json.exception.parse_error.107 | parse error: JSON pointer must be empty or begin with '/' - was: 'foo' | A JSON Pointer must be a Unicode string containing a sequence of zero or more reference tokens, each prefixed by a `/` character. json.exception.parse_error.108 | parse error: escape character '~' must be followed with '0' or '1' | In a JSON Pointer, only `~0` and `~1` are valid escape sequences. json.exception.parse_error.109 | parse error: array index 'one' is not a number | A JSON Pointer array index must be a number. json.exception.parse_error.110 | parse error at 1: cannot read 2 bytes from vector | When parsing CBOR or MessagePack, the byte vector ends before the complete value has been read. json.exception.parse_error.112 | parse error at 1: error reading CBOR; last byte: 0xF8 | Not all types of CBOR or MessagePack are supported. This exception occurs if an unsupported byte was read. json.exception.parse_error.113 | parse error at 2: expected a CBOR string; last byte: 0x98 | While parsing a map key, a value that is not a string has been read. @note For an input with n bytes, 1 is the index of the first character and n+1 is the index of the terminating null byte or the end of file. This also holds true when reading a byte vector (CBOR or MessagePack). @liveexample{The following code shows how a `parse_error` exception can be caught.,parse_error} @sa @ref exception for the base class of the library exceptions @sa @ref invalid_iterator for exceptions indicating errors with iterators @sa @ref type_error for exceptions indicating executing a member function with a wrong type @sa @ref out_of_range for exceptions indicating access out of the defined range @sa @ref other_error for exceptions indicating other library errors @since version 3.0.0 */ class parse_error : public exception { public: /*! @brief create a parse error exception @param[in] id_ the id of the exception @param[in] byte_ the byte index where the error occurred (or 0 if the position cannot be determined) @param[in] what_arg the explanatory string @return parse_error object */ static parse_error create(int id_, std::size_t byte_, const std::string& what_arg) { std::string w = exception::name("parse_error", id_) + "parse error" + (byte_ != 0 ? (" at " + std::to_string(byte_)) : "") + ": " + what_arg; return parse_error(id_, byte_, w.c_str()); } /*! @brief byte index of the parse error The byte index of the last read character in the input file. @note For an input with n bytes, 1 is the index of the first character and n+1 is the index of the terminating null byte or the end of file. This also holds true when reading a byte vector (CBOR or MessagePack). */ const std::size_t byte; private: parse_error(int id_, std::size_t byte_, const char* what_arg) : exception(id_, what_arg), byte(byte_) {} }; /*! @brief exception indicating errors with iterators This exception is thrown if iterators passed to a library function do not match the expected semantics. Exceptions have ids 2xx. name / id | example message | description ----------------------------------- | --------------- | ------------------------- json.exception.invalid_iterator.201 | iterators are not compatible | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid. json.exception.invalid_iterator.202 | iterator does not fit current value | In an erase or insert function, the passed iterator @a pos does not belong to the JSON value for which the function was called. It hence does not define a valid position for the deletion/insertion. json.exception.invalid_iterator.203 | iterators do not fit current value | Either iterator passed to function @ref erase(IteratorType first, IteratorType last) does not belong to the JSON value from which values shall be erased. It hence does not define a valid range to delete values from. json.exception.invalid_iterator.204 | iterators out of range | When an iterator range for a primitive type (number, boolean, or string) is passed to a constructor or an erase function, this range has to be exactly (@ref begin(), @ref end()), because this is the only way the single stored value is expressed. All other ranges are invalid. json.exception.invalid_iterator.205 | iterator out of range | When an iterator for a primitive type (number, boolean, or string) is passed to an erase function, the iterator has to be the @ref begin() iterator, because it is the only way to address the stored value. All other iterators are invalid. json.exception.invalid_iterator.206 | cannot construct with iterators from null | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) belong to a JSON null value and hence to not define a valid range. json.exception.invalid_iterator.207 | cannot use key() for non-object iterators | The key() member function can only be used on iterators belonging to a JSON object, because other types do not have a concept of a key. json.exception.invalid_iterator.208 | cannot use operator[] for object iterators | The operator[] to specify a concrete offset cannot be used on iterators belonging to a JSON object, because JSON objects are unordered. json.exception.invalid_iterator.209 | cannot use offsets with object iterators | The offset operators (+, -, +=, -=) cannot be used on iterators belonging to a JSON object, because JSON objects are unordered. json.exception.invalid_iterator.210 | iterators do not fit | The iterator range passed to the insert function are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid. json.exception.invalid_iterator.211 | passed iterators may not belong to container | The iterator range passed to the insert function must not be a subrange of the container to insert to. json.exception.invalid_iterator.212 | cannot compare iterators of different containers | When two iterators are compared, they must belong to the same container. json.exception.invalid_iterator.213 | cannot compare order of object iterators | The order of object iterators cannot be compared, because JSON objects are unordered. json.exception.invalid_iterator.214 | cannot get value | Cannot get value for iterator: Either the iterator belongs to a null value or it is an iterator to a primitive type (number, boolean, or string), but the iterator is different to @ref begin(). @liveexample{The following code shows how an `invalid_iterator` exception can be caught.,invalid_iterator} @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error @sa @ref type_error for exceptions indicating executing a member function with a wrong type @sa @ref out_of_range for exceptions indicating access out of the defined range @sa @ref other_error for exceptions indicating other library errors @since version 3.0.0 */ class invalid_iterator : public exception { public: static invalid_iterator create(int id_, const std::string& what_arg) { std::string w = exception::name("invalid_iterator", id_) + what_arg; return invalid_iterator(id_, w.c_str()); } private: invalid_iterator(int id_, const char* what_arg) : exception(id_, what_arg) {} }; /*! @brief exception indicating executing a member function with a wrong type This exception is thrown in case of a type error; that is, a library function is executed on a JSON value whose type does not match the expected semantics. Exceptions have ids 3xx. name / id | example message | description ----------------------------- | --------------- | ------------------------- json.exception.type_error.301 | cannot create object from initializer list | To create an object from an initializer list, the initializer list must consist only of a list of pairs whose first element is a string. When this constraint is violated, an array is created instead. json.exception.type_error.302 | type must be object, but is array | During implicit or explicit value conversion, the JSON type must be compatible to the target type. For instance, a JSON string can only be converted into string types, but not into numbers or boolean types. json.exception.type_error.303 | incompatible ReferenceType for get_ref, actual type is object | To retrieve a reference to a value stored in a @ref basic_json object with @ref get_ref, the type of the reference must match the value type. For instance, for a JSON array, the @a ReferenceType must be @ref array_t&. json.exception.type_error.304 | cannot use at() with string | The @ref at() member functions can only be executed for certain JSON types. json.exception.type_error.305 | cannot use operator[] with string | The @ref operator[] member functions can only be executed for certain JSON types. json.exception.type_error.306 | cannot use value() with string | The @ref value() member functions can only be executed for certain JSON types. json.exception.type_error.307 | cannot use erase() with string | The @ref erase() member functions can only be executed for certain JSON types. json.exception.type_error.308 | cannot use push_back() with string | The @ref push_back() and @ref operator+= member functions can only be executed for certain JSON types. json.exception.type_error.309 | cannot use insert() with | The @ref insert() member functions can only be executed for certain JSON types. json.exception.type_error.310 | cannot use swap() with number | The @ref swap() member functions can only be executed for certain JSON types. json.exception.type_error.311 | cannot use emplace_back() with string | The @ref emplace_back() member function can only be executed for certain JSON types. json.exception.type_error.312 | cannot use update() with string | The @ref update() member functions can only be executed for certain JSON types. json.exception.type_error.313 | invalid value to unflatten | The @ref unflatten function converts an object whose keys are JSON Pointers back into an arbitrary nested JSON value. The JSON Pointers must not overlap, because then the resulting value would not be well defined. json.exception.type_error.314 | only objects can be unflattened | The @ref unflatten function only works for an object whose keys are JSON Pointers. json.exception.type_error.315 | values in object must be primitive | The @ref unflatten function only works for an object whose keys are JSON Pointers and whose values are primitive. json.exception.type_error.316 | invalid UTF-8 byte at index 10: 0x7E | The @ref dump function only works with UTF-8 encoded strings; that is, if you assign a `std::string` to a JSON value, make sure it is UTF-8 encoded. | @liveexample{The following code shows how a `type_error` exception can be caught.,type_error} @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error @sa @ref invalid_iterator for exceptions indicating errors with iterators @sa @ref out_of_range for exceptions indicating access out of the defined range @sa @ref other_error for exceptions indicating other library errors @since version 3.0.0 */ class type_error : public exception { public: static type_error create(int id_, const std::string& what_arg) { std::string w = exception::name("type_error", id_) + what_arg; return type_error(id_, w.c_str()); } private: type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} }; /*! @brief exception indicating access out of the defined range This exception is thrown in case a library function is called on an input parameter that exceeds the expected range, for instance in case of array indices or nonexisting object keys. Exceptions have ids 4xx. name / id | example message | description ------------------------------- | --------------- | ------------------------- json.exception.out_of_range.401 | array index 3 is out of range | The provided array index @a i is larger than @a size-1. json.exception.out_of_range.402 | array index '-' (3) is out of range | The special array index `-` in a JSON Pointer never describes a valid element of the array, but the index past the end. That is, it can only be used to add elements at this position, but not to read it. json.exception.out_of_range.403 | key 'foo' not found | The provided key was not found in the JSON object. json.exception.out_of_range.404 | unresolved reference token 'foo' | A reference token in a JSON Pointer could not be resolved. json.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch operations 'remove' and 'add' can not be applied to the root element of the JSON value. json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF. json.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON only supports integers numbers up to 9223372036854775807. | json.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. | @liveexample{The following code shows how an `out_of_range` exception can be caught.,out_of_range} @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error @sa @ref invalid_iterator for exceptions indicating errors with iterators @sa @ref type_error for exceptions indicating executing a member function with a wrong type @sa @ref other_error for exceptions indicating other library errors @since version 3.0.0 */ class out_of_range : public exception { public: static out_of_range create(int id_, const std::string& what_arg) { std::string w = exception::name("out_of_range", id_) + what_arg; return out_of_range(id_, w.c_str()); } private: out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} }; /*! @brief exception indicating other library errors This exception is thrown in case of errors that cannot be classified with the other exception types. Exceptions have ids 5xx. name / id | example message | description ------------------------------ | --------------- | ------------------------- json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed. @sa @ref exception for the base class of the library exceptions @sa @ref parse_error for exceptions indicating a parse error @sa @ref invalid_iterator for exceptions indicating errors with iterators @sa @ref type_error for exceptions indicating executing a member function with a wrong type @sa @ref out_of_range for exceptions indicating access out of the defined range @liveexample{The following code shows how an `other_error` exception can be caught.,other_error} @since version 3.0.0 */ class other_error : public exception { public: static other_error create(int id_, const std::string& what_arg) { std::string w = exception::name("other_error", id_) + what_arg; return other_error(id_, w.c_str()); } private: other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} }; } } // #include #include // array #include // and #include // size_t #include // uint8_t namespace nlohmann { namespace detail { /////////////////////////// // JSON type enumeration // /////////////////////////// /*! @brief the JSON type enumeration This enumeration collects the different JSON types. It is internally used to distinguish the stored values, and the functions @ref basic_json::is_null(), @ref basic_json::is_object(), @ref basic_json::is_array(), @ref basic_json::is_string(), @ref basic_json::is_boolean(), @ref basic_json::is_number() (with @ref basic_json::is_number_integer(), @ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), @ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and @ref basic_json::is_structured() rely on it. @note There are three enumeration entries (number_integer, number_unsigned, and number_float), because the library distinguishes these three types for numbers: @ref basic_json::number_unsigned_t is used for unsigned integers, @ref basic_json::number_integer_t is used for signed integers, and @ref basic_json::number_float_t is used for floating-point numbers or to approximate integers which do not fit in the limits of their respective type. @sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON value with the default value for a given type @since version 1.0.0 */ enum class value_t : std::uint8_t { null, ///< null value object, ///< object (unordered set of name/value pairs) array, ///< array (ordered collection of values) string, ///< string value boolean, ///< boolean value number_integer, ///< number value (signed integer) number_unsigned, ///< number value (unsigned integer) number_float, ///< number value (floating-point) discarded ///< discarded by the the parser callback function }; /*! @brief comparison operator for JSON types Returns an ordering that is similar to Python: - order: null < boolean < number < object < array < string - furthermore, each type is not smaller than itself - discarded values are not comparable @since version 1.0.0 */ inline bool operator<(const value_t lhs, const value_t rhs) noexcept { static constexpr std::array order = {{ 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */ } }; const auto l_index = static_cast(lhs); const auto r_index = static_cast(rhs); return l_index < order.size() and r_index < order.size() and order[l_index] < order[r_index]; } } } // #include #include // transform #include // array #include // and, not #include // forward_list #include // inserter, front_inserter, end #include // string #include // tuple, make_tuple #include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible #include // pair, declval #include // valarray // #include // #include // #include // #include namespace nlohmann { namespace detail { // overloads for basic_json template parameters template::value and not std::is_same::value, int> = 0> void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) { switch (static_cast(j)) { case value_t::number_unsigned: { val = static_cast(*j.template get_ptr()); break; } case value_t::number_integer: { val = static_cast(*j.template get_ptr()); break; } case value_t::number_float: { val = static_cast(*j.template get_ptr()); break; } default: JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()))); } } template void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) { if (JSON_UNLIKELY(not j.is_boolean())) { JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name()))); } b = *j.template get_ptr(); } template void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) { if (JSON_UNLIKELY(not j.is_string())) { JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()))); } s = *j.template get_ptr(); } template void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) { get_arithmetic_value(j, val); } template void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) { get_arithmetic_value(j, val); } template void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) { get_arithmetic_value(j, val); } template::value, int> = 0> void from_json(const BasicJsonType& j, EnumType& e) { typename std::underlying_type::type val; get_arithmetic_value(j, val); e = static_cast(val); } template void from_json(const BasicJsonType& j, typename BasicJsonType::array_t& arr) { if (JSON_UNLIKELY(not j.is_array())) { JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); } arr = *j.template get_ptr(); } // forward_list doesn't have an insert method template::value, int> = 0> void from_json(const BasicJsonType& j, std::forward_list& l) { if (JSON_UNLIKELY(not j.is_array())) { JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); } std::transform(j.rbegin(), j.rend(), std::front_inserter(l), [](const BasicJsonType & i) { return i.template get(); }); } // valarray doesn't have an insert method template::value, int> = 0> void from_json(const BasicJsonType& j, std::valarray& l) { if (JSON_UNLIKELY(not j.is_array())) { JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); } l.resize(j.size()); std::copy(j.m_value.array->begin(), j.m_value.array->end(), std::begin(l)); } template void from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, priority_tag<0> /*unused*/) { using std::end; std::transform(j.begin(), j.end(), std::inserter(arr, end(arr)), [](const BasicJsonType & i) { // get() returns *this, this won't call a from_json // method when value_type is BasicJsonType return i.template get(); }); } template auto from_json_array_impl(const BasicJsonType& j, CompatibleArrayType& arr, priority_tag<1> /*unused*/) -> decltype( arr.reserve(std::declval()), void()) { using std::end; arr.reserve(j.size()); std::transform(j.begin(), j.end(), std::inserter(arr, end(arr)), [](const BasicJsonType & i) { // get() returns *this, this won't call a from_json // method when value_type is BasicJsonType return i.template get(); }); } template void from_json_array_impl(const BasicJsonType& j, std::array& arr, priority_tag<2> /*unused*/) { for (std::size_t i = 0; i < N; ++i) { arr[i] = j.at(i).template get(); } } template < typename BasicJsonType, typename CompatibleArrayType, enable_if_t < is_compatible_array_type::value and not std::is_same::value and std::is_constructible < BasicJsonType, typename CompatibleArrayType::value_type >::value, int > = 0 > void from_json(const BasicJsonType& j, CompatibleArrayType& arr) { if (JSON_UNLIKELY(not j.is_array())) { JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); } from_json_array_impl(j, arr, priority_tag<2> {}); } template::value, int> = 0> void from_json(const BasicJsonType& j, CompatibleObjectType& obj) { if (JSON_UNLIKELY(not j.is_object())) { JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name()))); } auto inner_object = j.template get_ptr(); using value_type = typename CompatibleObjectType::value_type; std::transform( inner_object->begin(), inner_object->end(), std::inserter(obj, obj.begin()), [](typename BasicJsonType::object_t::value_type const & p) { return value_type(p.first, p.second.template get()); }); } // overload for arithmetic types, not chosen for basic_json template arguments // (BooleanType, etc..); note: Is it really necessary to provide explicit // overloads for boolean_t etc. in case of a custom BooleanType which is not // an arithmetic type? template::value and not std::is_same::value and not std::is_same::value and not std::is_same::value and not std::is_same::value, int> = 0> void from_json(const BasicJsonType& j, ArithmeticType& val) { switch (static_cast(j)) { case value_t::number_unsigned: { val = static_cast(*j.template get_ptr()); break; } case value_t::number_integer: { val = static_cast(*j.template get_ptr()); break; } case value_t::number_float: { val = static_cast(*j.template get_ptr()); break; } case value_t::boolean: { val = static_cast(*j.template get_ptr()); break; } default: JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()))); } } template void from_json(const BasicJsonType& j, std::pair& p) { p = {j.at(0).template get(), j.at(1).template get()}; } template void from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_sequence) { t = std::make_tuple(j.at(Idx).template get::type>()...); } template void from_json(const BasicJsonType& j, std::tuple& t) { from_json_tuple_impl(j, t, index_sequence_for {}); } struct from_json_fn { private: template auto call(const BasicJsonType& j, T& val, priority_tag<1> /*unused*/) const noexcept(noexcept(from_json(j, val))) -> decltype(from_json(j, val), void()) { return from_json(j, val); } template void call(const BasicJsonType& /*unused*/, T& /*unused*/, priority_tag<0> /*unused*/) const noexcept { static_assert(sizeof(BasicJsonType) == 0, "could not find from_json() method in T's namespace"); #ifdef _MSC_VER // MSVC does not show a stacktrace for the above assert using decayed = uncvref_t; static_assert(sizeof(typename decayed::force_msvc_stacktrace) == 0, "forcing MSVC stacktrace to show which T we're talking about."); #endif } public: template void operator()(const BasicJsonType& j, T& val) const noexcept(noexcept(std::declval().call(j, val, priority_tag<1> {}))) { return call(j, val, priority_tag<1> {}); } }; } /// namespace to hold default `from_json` function /// to see why this is required: /// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html namespace { constexpr const auto& from_json = detail::static_const::value; } } // #include #include // or, and, not #include // begin, end #include // tuple, get #include // is_same, is_constructible, is_floating_point, is_enum, underlying_type #include // move, forward, declval, pair #include // valarray #include // vector // #include // #include namespace nlohmann { namespace detail { ////////////////// // constructors // ////////////////// template struct external_constructor; template<> struct external_constructor { template static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept { j.m_type = value_t::boolean; j.m_value = b; j.assert_invariant(); } }; template<> struct external_constructor { template static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) { j.m_type = value_t::string; j.m_value = s; j.assert_invariant(); } template static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) { j.m_type = value_t::string; j.m_value = std::move(s); j.assert_invariant(); } }; template<> struct external_constructor { template static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept { j.m_type = value_t::number_float; j.m_value = val; j.assert_invariant(); } }; template<> struct external_constructor { template static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept { j.m_type = value_t::number_unsigned; j.m_value = val; j.assert_invariant(); } }; template<> struct external_constructor { template static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept { j.m_type = value_t::number_integer; j.m_value = val; j.assert_invariant(); } }; template<> struct external_constructor { template static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) { j.m_type = value_t::array; j.m_value = arr; j.assert_invariant(); } template static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) { j.m_type = value_t::array; j.m_value = std::move(arr); j.assert_invariant(); } template::value, int> = 0> static void construct(BasicJsonType& j, const CompatibleArrayType& arr) { using std::begin; using std::end; j.m_type = value_t::array; j.m_value.array = j.template create(begin(arr), end(arr)); j.assert_invariant(); } template static void construct(BasicJsonType& j, const std::vector& arr) { j.m_type = value_t::array; j.m_value = value_t::array; j.m_value.array->reserve(arr.size()); for (const bool x : arr) { j.m_value.array->push_back(x); } j.assert_invariant(); } template::value, int> = 0> static void construct(BasicJsonType& j, const std::valarray& arr) { j.m_type = value_t::array; j.m_value = value_t::array; j.m_value.array->resize(arr.size()); std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); j.assert_invariant(); } }; template<> struct external_constructor { template static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) { j.m_type = value_t::object; j.m_value = obj; j.assert_invariant(); } template static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) { j.m_type = value_t::object; j.m_value = std::move(obj); j.assert_invariant(); } template::value, int> = 0> static void construct(BasicJsonType& j, const CompatibleObjectType& obj) { using std::begin; using std::end; j.m_type = value_t::object; j.m_value.object = j.template create(begin(obj), end(obj)); j.assert_invariant(); } }; ///////////// // to_json // ///////////// template::value, int> = 0> void to_json(BasicJsonType& j, T b) noexcept { external_constructor::construct(j, b); } template::value, int> = 0> void to_json(BasicJsonType& j, const CompatibleString& s) { external_constructor::construct(j, s); } template void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) { external_constructor::construct(j, std::move(s)); } template::value, int> = 0> void to_json(BasicJsonType& j, FloatType val) noexcept { external_constructor::construct(j, static_cast(val)); } template::value, int> = 0> void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept { external_constructor::construct(j, static_cast(val)); } template::value, int> = 0> void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept { external_constructor::construct(j, static_cast(val)); } template::value, int> = 0> void to_json(BasicJsonType& j, EnumType e) noexcept { using underlying_type = typename std::underlying_type::type; external_constructor::construct(j, static_cast(e)); } template void to_json(BasicJsonType& j, const std::vector& e) { external_constructor::construct(j, e); } template::value or std::is_same::value, int> = 0> void to_json(BasicJsonType& j, const CompatibleArrayType& arr) { external_constructor::construct(j, arr); } template::value, int> = 0> void to_json(BasicJsonType& j, std::valarray arr) { external_constructor::construct(j, std::move(arr)); } template void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) { external_constructor::construct(j, std::move(arr)); } template::value, int> = 0> void to_json(BasicJsonType& j, const CompatibleObjectType& obj) { external_constructor::construct(j, obj); } template void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) { external_constructor::construct(j, std::move(obj)); } template::value, int> = 0> void to_json(BasicJsonType& j, T (&arr)[N]) { external_constructor::construct(j, arr); } template void to_json(BasicJsonType& j, const std::pair& p) { j = {p.first, p.second}; } template void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence) { j = {std::get(t)...}; } template void to_json(BasicJsonType& j, const std::tuple& t) { to_json_tuple_impl(j, t, index_sequence_for {}); } struct to_json_fn { private: template auto call(BasicJsonType& j, T&& val, priority_tag<1> /*unused*/) const noexcept(noexcept(to_json(j, std::forward(val)))) -> decltype(to_json(j, std::forward(val)), void()) { return to_json(j, std::forward(val)); } template void call(BasicJsonType& /*unused*/, T&& /*unused*/, priority_tag<0> /*unused*/) const noexcept { static_assert(sizeof(BasicJsonType) == 0, "could not find to_json() method in T's namespace"); #ifdef _MSC_VER // MSVC does not show a stacktrace for the above assert using decayed = uncvref_t; static_assert(sizeof(typename decayed::force_msvc_stacktrace) == 0, "forcing MSVC stacktrace to show which T we're talking about."); #endif } public: template void operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(std::declval().call(j, std::forward(val), priority_tag<1> {}))) { return call(j, std::forward(val), priority_tag<1> {}); } }; } /// namespace to hold default `to_json` function namespace { constexpr const auto& to_json = detail::static_const::value; } } // #include #include // min #include // array #include // assert #include // size_t #include // strlen #include // streamsize, streamoff, streampos #include // istream #include // begin, end, iterator_traits, random_access_iterator_tag, distance, next #include // shared_ptr, make_shared, addressof #include // accumulate #include // string, char_traits #include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer #include // pair, declval // #include namespace nlohmann { namespace detail { //////////////////// // input adapters // //////////////////// /*! @brief abstract input adapter interface Produces a stream of std::char_traits::int_type characters from a std::istream, a buffer, or some other input type. Accepts the return of exactly one non-EOF character for future input. The int_type characters returned consist of all valid char values as positive values (typically unsigned char), plus an EOF value outside that range, specified by the value of the function std::char_traits::eof(). This value is typically -1, but could be any arbitrary value which is not a valid char value. */ struct input_adapter_protocol { /// get a character [0,255] or std::char_traits::eof(). virtual std::char_traits::int_type get_character() = 0; /// restore the last non-eof() character to input virtual void unget_character() = 0; virtual ~input_adapter_protocol() = default; }; /// a type to simplify interfaces using input_adapter_t = std::shared_ptr; /*! Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at beginning of input. Does not support changing the underlying std::streambuf in mid-input. Maintains underlying std::istream and std::streambuf to support subsequent use of standard std::istream operations to process any input characters following those used in parsing the JSON input. Clears the std::istream flags; any input errors (e.g., EOF) will be detected by the first subsequent call for input from the std::istream. */ class input_stream_adapter : public input_adapter_protocol { public: ~input_stream_adapter() override { // clear stream flags; we use underlying streambuf I/O, do not // maintain ifstream flags is.clear(); } explicit input_stream_adapter(std::istream& i) : is(i), sb(*i.rdbuf()) { // skip byte order mark std::char_traits::int_type c; if ((c = get_character()) == 0xEF) { if ((c = get_character()) == 0xBB) { if ((c = get_character()) == 0xBF) { return; // Ignore BOM } else if (c != std::char_traits::eof()) { is.unget(); } is.putback('\xBB'); } else if (c != std::char_traits::eof()) { is.unget(); } is.putback('\xEF'); } else if (c != std::char_traits::eof()) { is.unget(); // no byte order mark; process as usual } } // delete because of pointer members input_stream_adapter(const input_stream_adapter&) = delete; input_stream_adapter& operator=(input_stream_adapter&) = delete; // std::istream/std::streambuf use std::char_traits::to_int_type, to // ensure that std::char_traits::eof() and the character 0xFF do not // end up as the same value, eg. 0xFFFFFFFF. std::char_traits::int_type get_character() override { return sb.sbumpc(); } void unget_character() override { sb.sungetc(); // is.unget() avoided for performance } private: /// the associated input stream std::istream& is; std::streambuf& sb; }; /// input adapter for buffer input class input_buffer_adapter : public input_adapter_protocol { public: input_buffer_adapter(const char* b, const std::size_t l) : cursor(b), limit(b + l), start(b) { // skip byte order mark if (l >= 3 and b[0] == '\xEF' and b[1] == '\xBB' and b[2] == '\xBF') { cursor += 3; } } // delete because of pointer members input_buffer_adapter(const input_buffer_adapter&) = delete; input_buffer_adapter& operator=(input_buffer_adapter&) = delete; std::char_traits::int_type get_character() noexcept override { if (JSON_LIKELY(cursor < limit)) { return std::char_traits::to_int_type(*(cursor++)); } return std::char_traits::eof(); } void unget_character() noexcept override { if (JSON_LIKELY(cursor > start)) { --cursor; } } private: /// pointer to the current character const char* cursor; /// pointer past the last character const char* limit; /// pointer to the first character const char* start; }; class input_adapter { public: // native support /// input adapter for input stream input_adapter(std::istream& i) : ia(std::make_shared(i)) {} /// input adapter for input stream input_adapter(std::istream&& i) : ia(std::make_shared(i)) {} /// input adapter for buffer template::value and std::is_integral::type>::value and sizeof(typename std::remove_pointer::type) == 1, int>::type = 0> input_adapter(CharT b, std::size_t l) : ia(std::make_shared(reinterpret_cast(b), l)) {} // derived support /// input adapter for string literal template::value and std::is_integral::type>::value and sizeof(typename std::remove_pointer::type) == 1, int>::type = 0> input_adapter(CharT b) : input_adapter(reinterpret_cast(b), std::strlen(reinterpret_cast(b))) {} /// input adapter for iterator range with contiguous storage template::iterator_category, std::random_access_iterator_tag>::value, int>::type = 0> input_adapter(IteratorType first, IteratorType last) { // assertion to check that the iterator range is indeed contiguous, // see http://stackoverflow.com/a/35008842/266378 for more discussion assert(std::accumulate( first, last, std::pair(true, 0), [&first](std::pair res, decltype(*first) val) { res.first &= (val == *(std::next(std::addressof(*first), res.second++))); return res; }).first); // assertion to check that each element is 1 byte long static_assert( sizeof(typename std::iterator_traits::value_type) == 1, "each element in the iterator range must have the size of 1 byte"); const auto len = static_cast(std::distance(first, last)); if (JSON_LIKELY(len > 0)) { // there is at least one element: use the address of first ia = std::make_shared(reinterpret_cast(&(*first)), len); } else { // the address of first cannot be used: use nullptr ia = std::make_shared(nullptr, len); } } /// input adapter for array template input_adapter(T (&array)[N]) : input_adapter(std::begin(array), std::end(array)) {} /// input adapter for contiguous container template::value and std::is_base_of()))>::iterator_category>::value, int>::type = 0> input_adapter(const ContiguousContainer& c) : input_adapter(std::begin(c), std::end(c)) {} operator input_adapter_t() { return ia; } private: /// the actual adapter input_adapter_t ia = nullptr; }; } } // #include #include // localeconv #include // size_t #include // strtof, strtod, strtold, strtoll, strtoull #include // initializer_list #include // hex, uppercase #include // setw, setfill #include // stringstream #include // char_traits, string #include // vector // #include // #include namespace nlohmann { namespace detail { /////////// // lexer // /////////// /*! @brief lexical analysis This class organizes the lexical analysis during JSON deserialization. */ template class lexer { using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; public: /// token types for the parser enum class token_type { uninitialized, ///< indicating the scanner is uninitialized literal_true, ///< the `true` literal literal_false, ///< the `false` literal literal_null, ///< the `null` literal value_string, ///< a string -- use get_string() for actual value value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value value_integer, ///< a signed integer -- use get_number_integer() for actual value value_float, ///< an floating point number -- use get_number_float() for actual value begin_array, ///< the character for array begin `[` begin_object, ///< the character for object begin `{` end_array, ///< the character for array end `]` end_object, ///< the character for object end `}` name_separator, ///< the name separator `:` value_separator, ///< the value separator `,` parse_error, ///< indicating a parse error end_of_input, ///< indicating the end of the input buffer literal_or_value ///< a literal or the begin of a value (only for diagnostics) }; /// return name of values of type token_type (only used for errors) static const char* token_type_name(const token_type t) noexcept { switch (t) { case token_type::uninitialized: return ""; case token_type::literal_true: return "true literal"; case token_type::literal_false: return "false literal"; case token_type::literal_null: return "null literal"; case token_type::value_string: return "string literal"; case lexer::token_type::value_unsigned: case lexer::token_type::value_integer: case lexer::token_type::value_float: return "number literal"; case token_type::begin_array: return "'['"; case token_type::begin_object: return "'{'"; case token_type::end_array: return "']'"; case token_type::end_object: return "'}'"; case token_type::name_separator: return "':'"; case token_type::value_separator: return "','"; case token_type::parse_error: return ""; case token_type::end_of_input: return "end of input"; case token_type::literal_or_value: return "'[', '{', or a literal"; default: // catch non-enum values return "unknown token"; // LCOV_EXCL_LINE } } explicit lexer(detail::input_adapter_t adapter) : ia(std::move(adapter)), decimal_point_char(get_decimal_point()) {} // delete because of pointer members lexer(const lexer&) = delete; lexer& operator=(lexer&) = delete; private: ///////////////////// // locales ///////////////////// /// return the locale-dependent decimal point static char get_decimal_point() noexcept { const auto loc = localeconv(); assert(loc != nullptr); return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); } ///////////////////// // scan functions ///////////////////// /*! @brief get codepoint from 4 hex characters following `\u` For input "\u c1 c2 c3 c4" the codepoint is: (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The conversion is done by subtracting the offset (0x30, 0x37, and 0x57) between the ASCII value of the character and the desired integer value. @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or non-hex character) */ int get_codepoint() { // this function only makes sense after reading `\u` assert(current == 'u'); int codepoint = 0; const auto factors = { 12, 8, 4, 0 }; for (const auto factor : factors) { get(); if (current >= '0' and current <= '9') { codepoint += ((current - 0x30) << factor); } else if (current >= 'A' and current <= 'F') { codepoint += ((current - 0x37) << factor); } else if (current >= 'a' and current <= 'f') { codepoint += ((current - 0x57) << factor); } else { return -1; } } assert(0x0000 <= codepoint and codepoint <= 0xFFFF); return codepoint; } /*! @brief check if the next byte(s) are inside a given range Adds the current byte and, for each passed range, reads a new byte and checks if it is inside the range. If a violation was detected, set up an error message and return false. Otherwise, return true. @param[in] ranges list of integers; interpreted as list of pairs of inclusive lower and upper bound, respectively @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, 1, 2, or 3 pairs. This precondition is enforced by an assertion. @return true if and only if no range violation was detected */ bool next_byte_in_range(std::initializer_list ranges) { assert(ranges.size() == 2 or ranges.size() == 4 or ranges.size() == 6); add(current); for (auto range = ranges.begin(); range != ranges.end(); ++range) { get(); if (JSON_LIKELY(*range <= current and current <= *(++range))) { add(current); } else { error_message = "invalid string: ill-formed UTF-8 byte"; return false; } } return true; } /*! @brief scan a string literal This function scans a string according to Sect. 7 of RFC 7159. While scanning, bytes are escaped and copied into buffer token_buffer. Then the function returns successfully, token_buffer is *not* null-terminated (as it may contain \0 bytes), and token_buffer.size() is the number of bytes in the string. @return token_type::value_string if string could be successfully scanned, token_type::parse_error otherwise @note In case of errors, variable error_message contains a textual description. */ token_type scan_string() { // reset token_buffer (ignore opening quote) reset(); // we entered the function by reading an open quote assert(current == '\"'); while (true) { // get next character switch (get()) { // end of file while parsing string case std::char_traits::eof(): { error_message = "invalid string: missing closing quote"; return token_type::parse_error; } // closing quote case '\"': { return token_type::value_string; } // escapes case '\\': { switch (get()) { // quotation mark case '\"': add('\"'); break; // reverse solidus case '\\': add('\\'); break; // solidus case '/': add('/'); break; // backspace case 'b': add('\b'); break; // form feed case 'f': add('\f'); break; // line feed case 'n': add('\n'); break; // carriage return case 'r': add('\r'); break; // tab case 't': add('\t'); break; // unicode escapes case 'u': { const int codepoint1 = get_codepoint(); int codepoint = codepoint1; // start with codepoint1 if (JSON_UNLIKELY(codepoint1 == -1)) { error_message = "invalid string: '\\u' must be followed by 4 hex digits"; return token_type::parse_error; } // check if code point is a high surrogate if (0xD800 <= codepoint1 and codepoint1 <= 0xDBFF) { // expect next \uxxxx entry if (JSON_LIKELY(get() == '\\' and get() == 'u')) { const int codepoint2 = get_codepoint(); if (JSON_UNLIKELY(codepoint2 == -1)) { error_message = "invalid string: '\\u' must be followed by 4 hex digits"; return token_type::parse_error; } // check if codepoint2 is a low surrogate if (JSON_LIKELY(0xDC00 <= codepoint2 and codepoint2 <= 0xDFFF)) { // overwrite codepoint codepoint = // high surrogate occupies the most significant 22 bits (codepoint1 << 10) // low surrogate occupies the least significant 15 bits + codepoint2 // there is still the 0xD800, 0xDC00 and 0x10000 noise // in the result so we have to subtract with: // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 - 0x35FDC00; } else { error_message = "invalid string: surrogate U+DC00..U+DFFF must be followed by U+DC00..U+DFFF"; return token_type::parse_error; } } else { error_message = "invalid string: surrogate U+DC00..U+DFFF must be followed by U+DC00..U+DFFF"; return token_type::parse_error; } } else { if (JSON_UNLIKELY(0xDC00 <= codepoint1 and codepoint1 <= 0xDFFF)) { error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; return token_type::parse_error; } } // result of the above calculation yields a proper codepoint assert(0x00 <= codepoint and codepoint <= 0x10FFFF); // translate codepoint into bytes if (codepoint < 0x80) { // 1-byte characters: 0xxxxxxx (ASCII) add(codepoint); } else if (codepoint <= 0x7FF) { // 2-byte characters: 110xxxxx 10xxxxxx add(0xC0 | (codepoint >> 6)); add(0x80 | (codepoint & 0x3F)); } else if (codepoint <= 0xFFFF) { // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx add(0xE0 | (codepoint >> 12)); add(0x80 | ((codepoint >> 6) & 0x3F)); add(0x80 | (codepoint & 0x3F)); } else { // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx add(0xF0 | (codepoint >> 18)); add(0x80 | ((codepoint >> 12) & 0x3F)); add(0x80 | ((codepoint >> 6) & 0x3F)); add(0x80 | (codepoint & 0x3F)); } break; } // other characters after escape default: error_message = "invalid string: forbidden character after backslash"; return token_type::parse_error; } break; } // invalid control characters case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: { error_message = "invalid string: control character must be escaped"; return token_type::parse_error; } // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) case 0x20: case 0x21: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F: case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3E: case 0x3F: case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F: case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5A: case 0x5B: case 0x5D: case 0x5E: case 0x5F: case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D: case 0x7E: case 0x7F: { add(current); break; } // U+0080..U+07FF: bytes C2..DF 80..BF case 0xC2: case 0xC3: case 0xC4: case 0xC5: case 0xC6: case 0xC7: case 0xC8: case 0xC9: case 0xCA: case 0xCB: case 0xCC: case 0xCD: case 0xCE: case 0xCF: case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9: case 0xDA: case 0xDB: case 0xDC: case 0xDD: case 0xDE: case 0xDF: { if (JSON_UNLIKELY(not next_byte_in_range({0x80, 0xBF}))) { return token_type::parse_error; } break; } // U+0800..U+0FFF: bytes E0 A0..BF 80..BF case 0xE0: { if (JSON_UNLIKELY(not (next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) { return token_type::parse_error; } break; } // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF case 0xE1: case 0xE2: case 0xE3: case 0xE4: case 0xE5: case 0xE6: case 0xE7: case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xEE: case 0xEF: { if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) { return token_type::parse_error; } break; } // U+D000..U+D7FF: bytes ED 80..9F 80..BF case 0xED: { if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) { return token_type::parse_error; } break; } // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF case 0xF0: { if (JSON_UNLIKELY(not (next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) { return token_type::parse_error; } break; } // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF case 0xF1: case 0xF2: case 0xF3: { if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) { return token_type::parse_error; } break; } // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF case 0xF4: { if (JSON_UNLIKELY(not (next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) { return token_type::parse_error; } break; } // remaining bytes (80..C1 and F5..FF) are ill-formed default: { error_message = "invalid string: ill-formed UTF-8 byte"; return token_type::parse_error; } } } } static void strtof(float& f, const char* str, char** endptr) noexcept { f = std::strtof(str, endptr); } static void strtof(double& f, const char* str, char** endptr) noexcept { f = std::strtod(str, endptr); } static void strtof(long double& f, const char* str, char** endptr) noexcept { f = std::strtold(str, endptr); } /*! @brief scan a number literal This function scans a string according to Sect. 6 of RFC 7159. The function is realized with a deterministic finite state machine derived from the grammar described in RFC 7159. Starting in state "init", the input is read and used to determined the next state. Only state "done" accepts the number. State "error" is a trap state to model errors. In the table below, "anything" means any character but the ones listed before. state | 0 | 1-9 | e E | + | - | . | anything ---------|----------|----------|----------|---------|---------|----------|----------- init | zero | any1 | [error] | [error] | minus | [error] | [error] minus | zero | any1 | [error] | [error] | [error] | [error] | [error] zero | done | done | exponent | done | done | decimal1 | done any1 | any1 | any1 | exponent | done | done | decimal1 | done decimal1 | decimal2 | [error] | [error] | [error] | [error] | [error] | [error] decimal2 | decimal2 | decimal2 | exponent | done | done | done | done exponent | any2 | any2 | [error] | sign | sign | [error] | [error] sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] any2 | any2 | any2 | done | done | done | done | done The state machine is realized with one label per state (prefixed with "scan_number_") and `goto` statements between them. The state machine contains cycles, but any cycle can be left when EOF is read. Therefore, the function is guaranteed to terminate. During scanning, the read bytes are stored in token_buffer. This string is then converted to a signed integer, an unsigned integer, or a floating-point number. @return token_type::value_unsigned, token_type::value_integer, or token_type::value_float if number could be successfully scanned, token_type::parse_error otherwise @note The scanner is independent of the current locale. Internally, the locale's decimal point is used instead of `.` to work with the locale-dependent converters. */ token_type scan_number() { // reset token_buffer to store the number's bytes reset(); // the type of the parsed number; initially set to unsigned; will be // changed if minus sign, decimal point or exponent is read token_type number_type = token_type::value_unsigned; // state (init): we just found out we need to scan a number switch (current) { case '-': { add(current); goto scan_number_minus; } case '0': { add(current); goto scan_number_zero; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_any1; } default: { // all other characters are rejected outside scan_number() assert(false); // LCOV_EXCL_LINE } } scan_number_minus: // state: we just parsed a leading minus sign number_type = token_type::value_integer; switch (get()) { case '0': { add(current); goto scan_number_zero; } case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_any1; } default: { error_message = "invalid number; expected digit after '-'"; return token_type::parse_error; } } scan_number_zero: // state: we just parse a zero (maybe with a leading minus sign) switch (get()) { case '.': { add(decimal_point_char); goto scan_number_decimal1; } case 'e': case 'E': { add(current); goto scan_number_exponent; } default: goto scan_number_done; } scan_number_any1: // state: we just parsed a number 0-9 (maybe with a leading minus sign) switch (get()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_any1; } case '.': { add(decimal_point_char); goto scan_number_decimal1; } case 'e': case 'E': { add(current); goto scan_number_exponent; } default: goto scan_number_done; } scan_number_decimal1: // state: we just parsed a decimal point number_type = token_type::value_float; switch (get()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_decimal2; } default: { error_message = "invalid number; expected digit after '.'"; return token_type::parse_error; } } scan_number_decimal2: // we just parsed at least one number after a decimal point switch (get()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_decimal2; } case 'e': case 'E': { add(current); goto scan_number_exponent; } default: goto scan_number_done; } scan_number_exponent: // we just parsed an exponent number_type = token_type::value_float; switch (get()) { case '+': case '-': { add(current); goto scan_number_sign; } case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_any2; } default: { error_message = "invalid number; expected '+', '-', or digit after exponent"; return token_type::parse_error; } } scan_number_sign: // we just parsed an exponent sign switch (get()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_any2; } default: { error_message = "invalid number; expected digit after exponent sign"; return token_type::parse_error; } } scan_number_any2: // we just parsed a number after the exponent or exponent sign switch (get()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { add(current); goto scan_number_any2; } default: goto scan_number_done; } scan_number_done: // unget the character after the number (we only read it to know that // we are done scanning a number) unget(); char* endptr = nullptr; errno = 0; // try to parse integers first and fall back to floats if (number_type == token_type::value_unsigned) { const auto x = std::strtoull(token_buffer.data(), &endptr, 10); // we checked the number format before assert(endptr == token_buffer.data() + token_buffer.size()); if (errno == 0) { value_unsigned = static_cast(x); if (value_unsigned == x) { return token_type::value_unsigned; } } } else if (number_type == token_type::value_integer) { const auto x = std::strtoll(token_buffer.data(), &endptr, 10); // we checked the number format before assert(endptr == token_buffer.data() + token_buffer.size()); if (errno == 0) { value_integer = static_cast(x); if (value_integer == x) { return token_type::value_integer; } } } // this code is reached if we parse a floating-point number or if an // integer conversion above failed strtof(value_float, token_buffer.data(), &endptr); // we checked the number format before assert(endptr == token_buffer.data() + token_buffer.size()); return token_type::value_float; } /*! @param[in] literal_text the literal text to expect @param[in] length the length of the passed literal text @param[in] return_type the token type to return on success */ token_type scan_literal(const char* literal_text, const std::size_t length, token_type return_type) { assert(current == literal_text[0]); for (std::size_t i = 1; i < length; ++i) { if (JSON_UNLIKELY(get() != literal_text[i])) { error_message = "invalid literal"; return token_type::parse_error; } } return return_type; } ///////////////////// // input management ///////////////////// /// reset token_buffer; current character is beginning of token void reset() noexcept { token_buffer.clear(); token_string.clear(); token_string.push_back(std::char_traits::to_char_type(current)); } /* @brief get next character from the input This function provides the interface to the used input adapter. It does not throw in case the input reached EOF, but returns a `std::char_traits::eof()` in that case. Stores the scanned characters for use in error messages. @return character read from the input */ std::char_traits::int_type get() { ++chars_read; current = ia->get_character(); if (JSON_LIKELY(current != std::char_traits::eof())) { token_string.push_back(std::char_traits::to_char_type(current)); } return current; } /// unget current character (return it again on next get) void unget() { --chars_read; if (JSON_LIKELY(current != std::char_traits::eof())) { ia->unget_character(); assert(token_string.size() != 0); token_string.pop_back(); } } /// add a character to token_buffer void add(int c) { token_buffer.push_back(std::char_traits::to_char_type(c)); } public: ///////////////////// // value getters ///////////////////// /// return integer value constexpr number_integer_t get_number_integer() const noexcept { return value_integer; } /// return unsigned integer value constexpr number_unsigned_t get_number_unsigned() const noexcept { return value_unsigned; } /// return floating-point value constexpr number_float_t get_number_float() const noexcept { return value_float; } /// return current string value (implicitly resets the token; useful only once) std::string move_string() { return std::move(token_buffer); } ///////////////////// // diagnostics ///////////////////// /// return position of last read token constexpr std::size_t get_position() const noexcept { return chars_read; } /// return the last read token (for errors only). Will never contain EOF /// (an arbitrary value that is not a valid char value, often -1), because /// 255 may legitimately occur. May contain NUL, which should be escaped. std::string get_token_string() const { // escape control characters std::string result; for (const auto c : token_string) { if ('\x00' <= c and c <= '\x1F') { // escape control characters std::stringstream ss; ss << "(c) << ">"; result += ss.str(); } else { // add character as is result.push_back(c); } } return result; } /// return syntax error message constexpr const char* get_error_message() const noexcept { return error_message; } ///////////////////// // actual scanner ///////////////////// token_type scan() { // read next character and ignore whitespace do { get(); } while (current == ' ' or current == '\t' or current == '\n' or current == '\r'); switch (current) { // structural characters case '[': return token_type::begin_array; case ']': return token_type::end_array; case '{': return token_type::begin_object; case '}': return token_type::end_object; case ':': return token_type::name_separator; case ',': return token_type::value_separator; // literals case 't': return scan_literal("true", 4, token_type::literal_true); case 'f': return scan_literal("false", 5, token_type::literal_false); case 'n': return scan_literal("null", 4, token_type::literal_null); // string case '\"': return scan_string(); // number case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': return scan_number(); // end of input (the null byte is needed when parsing from // string literals) case '\0': case std::char_traits::eof(): return token_type::end_of_input; // error default: error_message = "invalid literal"; return token_type::parse_error; } } private: /// input adapter detail::input_adapter_t ia = nullptr; /// the current character std::char_traits::int_type current = std::char_traits::eof(); /// the number of characters read std::size_t chars_read = 0; /// raw input token string (for error messages) std::vector token_string {}; /// buffer for variable-length tokens (numbers, strings) std::string token_buffer {}; /// a description of occurred lexer errors const char* error_message = ""; // number values number_integer_t value_integer = 0; number_unsigned_t value_unsigned = 0; number_float_t value_float = 0; /// the decimal point const char decimal_point_char = '.'; }; } } // #include #include // assert #include // isfinite #include // uint8_t #include // function #include // string #include // move // #include // #include // #include // #include // #include namespace nlohmann { namespace detail { //////////// // parser // //////////// /*! @brief syntax analysis This class implements a recursive decent parser. */ template class parser { using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using number_float_t = typename BasicJsonType::number_float_t; using lexer_t = lexer; using token_type = typename lexer_t::token_type; public: enum class parse_event_t : uint8_t { /// the parser read `{` and started to process a JSON object object_start, /// the parser read `}` and finished processing a JSON object object_end, /// the parser read `[` and started to process a JSON array array_start, /// the parser read `]` and finished processing a JSON array array_end, /// the parser read a key of a value in an object key, /// the parser finished reading a JSON value value }; using parser_callback_t = std::function; /// a parser reading from an input adapter explicit parser(detail::input_adapter_t adapter, const parser_callback_t cb = nullptr, const bool allow_exceptions_ = true) : callback(cb), m_lexer(adapter), allow_exceptions(allow_exceptions_) {} /*! @brief public parser interface @param[in] strict whether to expect the last token to be EOF @param[in,out] result parsed JSON value @throw parse_error.101 in case of an unexpected token @throw parse_error.102 if to_unicode fails or surrogate error @throw parse_error.103 if to_unicode fails */ void parse(const bool strict, BasicJsonType& result) { // read first token get_token(); parse_internal(true, result); result.assert_invariant(); // in strict mode, input must be completely read if (strict) { get_token(); expect(token_type::end_of_input); } // in case of an error, return discarded value if (errored) { result = value_t::discarded; return; } // set top-level value to null if it was discarded by the callback // function if (result.is_discarded()) { result = nullptr; } } /*! @brief public accept interface @param[in] strict whether to expect the last token to be EOF @return whether the input is a proper JSON text */ bool accept(const bool strict = true) { // read first token get_token(); if (not accept_internal()) { return false; } // strict => last token must be EOF return not strict or (get_token() == token_type::end_of_input); } private: /*! @brief the actual parser @throw parse_error.101 in case of an unexpected token @throw parse_error.102 if to_unicode fails or surrogate error @throw parse_error.103 if to_unicode fails */ void parse_internal(bool keep, BasicJsonType& result) { // never parse after a parse error was detected assert(not errored); // start with a discarded value if (not result.is_discarded()) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } switch (last_token) { case token_type::begin_object: { if (keep) { if (callback) { keep = callback(depth++, parse_event_t::object_start, result); } if (not callback or keep) { // explicitly set result to object to cope with {} result.m_type = value_t::object; result.m_value = value_t::object; } } // read next token get_token(); // closing } -> we are done if (last_token == token_type::end_object) { if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } break; } // parse values std::string key; BasicJsonType value; while (true) { // store key if (not expect(token_type::value_string)) { return; } key = m_lexer.move_string(); bool keep_tag = false; if (keep) { if (callback) { BasicJsonType k(key); keep_tag = callback(depth, parse_event_t::key, k); } else { keep_tag = true; } } // parse separator (:) get_token(); if (not expect(token_type::name_separator)) { return; } // parse and add value get_token(); value.m_value.destroy(value.m_type); value.m_type = value_t::discarded; parse_internal(keep, value); if (JSON_UNLIKELY(errored)) { return; } if (keep and keep_tag and not value.is_discarded()) { result.m_value.object->emplace(std::move(key), std::move(value)); } // comma -> next value get_token(); if (last_token == token_type::value_separator) { get_token(); continue; } // closing } if (not expect(token_type::end_object)) { return; } break; } if (keep and callback and not callback(--depth, parse_event_t::object_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } break; } case token_type::begin_array: { if (keep) { if (callback) { keep = callback(depth++, parse_event_t::array_start, result); } if (not callback or keep) { // explicitly set result to array to cope with [] result.m_type = value_t::array; result.m_value = value_t::array; } } // read next token get_token(); // closing ] -> we are done if (last_token == token_type::end_array) { if (callback and not callback(--depth, parse_event_t::array_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } break; } // parse values BasicJsonType value; while (true) { // parse value value.m_value.destroy(value.m_type); value.m_type = value_t::discarded; parse_internal(keep, value); if (JSON_UNLIKELY(errored)) { return; } if (keep and not value.is_discarded()) { result.m_value.array->push_back(std::move(value)); } // comma -> next value get_token(); if (last_token == token_type::value_separator) { get_token(); continue; } // closing ] if (not expect(token_type::end_array)) { return; } break; } if (keep and callback and not callback(--depth, parse_event_t::array_end, result)) { result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } break; } case token_type::literal_null: { result.m_type = value_t::null; break; } case token_type::value_string: { result.m_type = value_t::string; result.m_value = m_lexer.move_string(); break; } case token_type::literal_true: { result.m_type = value_t::boolean; result.m_value = true; break; } case token_type::literal_false: { result.m_type = value_t::boolean; result.m_value = false; break; } case token_type::value_unsigned: { result.m_type = value_t::number_unsigned; result.m_value = m_lexer.get_number_unsigned(); break; } case token_type::value_integer: { result.m_type = value_t::number_integer; result.m_value = m_lexer.get_number_integer(); break; } case token_type::value_float: { result.m_type = value_t::number_float; result.m_value = m_lexer.get_number_float(); // throw in case of infinity or NAN if (JSON_UNLIKELY(not std::isfinite(result.m_value.number_float))) { if (allow_exceptions) { JSON_THROW(out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); } expect(token_type::uninitialized); } break; } case token_type::parse_error: { // using "uninitialized" to avoid "expected" message if (not expect(token_type::uninitialized)) { return; } break; // LCOV_EXCL_LINE } default: { // the last token was unexpected; we expected a value if (not expect(token_type::literal_or_value)) { return; } break; // LCOV_EXCL_LINE } } if (keep and callback and not callback(depth, parse_event_t::value, result)) { result.m_type = value_t::discarded; } } /*! @brief the actual acceptor @invariant 1. The last token is not yet processed. Therefore, the caller of this function must make sure a token has been read. 2. When this function returns, the last token is processed. That is, the last read character was already considered. This invariant makes sure that no token needs to be "unput". */ bool accept_internal() { switch (last_token) { case token_type::begin_object: { // read next token get_token(); // closing } -> we are done if (last_token == token_type::end_object) { return true; } // parse values while (true) { // parse key if (last_token != token_type::value_string) { return false; } // parse separator (:) get_token(); if (last_token != token_type::name_separator) { return false; } // parse value get_token(); if (not accept_internal()) { return false; } // comma -> next value get_token(); if (last_token == token_type::value_separator) { get_token(); continue; } // closing } return (last_token == token_type::end_object); } } case token_type::begin_array: { // read next token get_token(); // closing ] -> we are done if (last_token == token_type::end_array) { return true; } // parse values while (true) { // parse value if (not accept_internal()) { return false; } // comma -> next value get_token(); if (last_token == token_type::value_separator) { get_token(); continue; } // closing ] return (last_token == token_type::end_array); } } case token_type::value_float: { // reject infinity or NAN return std::isfinite(m_lexer.get_number_float()); } case token_type::literal_false: case token_type::literal_null: case token_type::literal_true: case token_type::value_integer: case token_type::value_string: case token_type::value_unsigned: return true; default: // the last token was unexpected return false; } } /// get next token from lexer token_type get_token() { return (last_token = m_lexer.scan()); } /*! @throw parse_error.101 if expected token did not occur */ bool expect(token_type t) { if (JSON_UNLIKELY(t != last_token)) { errored = true; expected = t; if (allow_exceptions) { throw_exception(); } else { return false; } } return true; } [[noreturn]] void throw_exception() const { std::string error_msg = "syntax error - "; if (last_token == token_type::parse_error) { error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" + m_lexer.get_token_string() + "'"; } else { error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token)); } if (expected != token_type::uninitialized) { error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); } JSON_THROW(parse_error::create(101, m_lexer.get_position(), error_msg)); } private: /// current level of recursion int depth = 0; /// callback function const parser_callback_t callback = nullptr; /// the type of the last read token token_type last_token = token_type::uninitialized; /// the lexer lexer_t m_lexer; /// whether a syntax error occurred bool errored = false; /// possible reason for the syntax error token_type expected = token_type::uninitialized; /// whether to throw exceptions in case of errors const bool allow_exceptions = true; }; } } // #include #include // ptrdiff_t #include // numeric_limits namespace nlohmann { namespace detail { /* @brief an iterator for primitive JSON types This class models an iterator for primitive JSON types (boolean, number, string). It's only purpose is to allow the iterator/const_iterator classes to "iterate" over primitive values. Internally, the iterator is modeled by a `difference_type` variable. Value begin_value (`0`) models the begin, end_value (`1`) models past the end. */ class primitive_iterator_t { private: using difference_type = std::ptrdiff_t; static constexpr difference_type begin_value = 0; static constexpr difference_type end_value = begin_value + 1; /// iterator as signed integer type difference_type m_it = (std::numeric_limits::min)(); public: constexpr difference_type get_value() const noexcept { return m_it; } /// set iterator to a defined beginning void set_begin() noexcept { m_it = begin_value; } /// set iterator to a defined past the end void set_end() noexcept { m_it = end_value; } /// return whether the iterator can be dereferenced constexpr bool is_begin() const noexcept { return m_it == begin_value; } /// return whether the iterator is at end constexpr bool is_end() const noexcept { return m_it == end_value; } friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept { return lhs.m_it == rhs.m_it; } friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept { return lhs.m_it < rhs.m_it; } primitive_iterator_t operator+(difference_type n) noexcept { auto result = *this; result += n; return result; } friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept { return lhs.m_it - rhs.m_it; } primitive_iterator_t& operator++() noexcept { ++m_it; return *this; } primitive_iterator_t const operator++(int) noexcept { auto result = *this; m_it++; return result; } primitive_iterator_t& operator--() noexcept { --m_it; return *this; } primitive_iterator_t const operator--(int) noexcept { auto result = *this; m_it--; return result; } primitive_iterator_t& operator+=(difference_type n) noexcept { m_it += n; return *this; } primitive_iterator_t& operator-=(difference_type n) noexcept { m_it -= n; return *this; } }; } } // #include // #include namespace nlohmann { namespace detail { /*! @brief an iterator value @note This structure could easily be a union, but MSVC currently does not allow unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. */ template struct internal_iterator { /// iterator for JSON objects typename BasicJsonType::object_t::iterator object_iterator {}; /// iterator for JSON arrays typename BasicJsonType::array_t::iterator array_iterator {}; /// generic iterator for all other types primitive_iterator_t primitive_iterator {}; }; } } // #include #include // not #include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next #include // conditional, is_const, remove_const // #include // #include // #include // #include // #include // #include namespace nlohmann { namespace detail { // forward declare, to be able to friend it later on template class iteration_proxy; /*! @brief a template for a bidirectional iterator for the @ref basic_json class This class implements a both iterators (iterator and const_iterator) for the @ref basic_json class. @note An iterator is called *initialized* when a pointer to a JSON value has been set (e.g., by a constructor or a copy assignment). If the iterator is default-constructed, it is *uninitialized* and most methods are undefined. **The library uses assertions to detect calls on uninitialized iterators.** @requirement The class satisfies the following concept requirements: - [BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). @since version 1.0.0, simplified in version 2.0.9, change to bidirectional iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) */ template class iter_impl { /// allow basic_json to access private members friend iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; friend BasicJsonType; friend iteration_proxy; using object_t = typename BasicJsonType::object_t; using array_t = typename BasicJsonType::array_t; // make sure BasicJsonType is basic_json or const basic_json static_assert(is_basic_json::type>::value, "iter_impl only accepts (const) basic_json"); public: /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. /// The C++ Standard has never required user-defined iterators to derive from std::iterator. /// A user-defined iterator should provide publicly accessible typedefs named /// iterator_category, value_type, difference_type, pointer, and reference. /// Note that value_type is required to be non-const, even for constant iterators. using iterator_category = std::bidirectional_iterator_tag; /// the type of the values when the iterator is dereferenced using value_type = typename BasicJsonType::value_type; /// a type to represent differences between iterators using difference_type = typename BasicJsonType::difference_type; /// defines a pointer to the type iterated over (value_type) using pointer = typename std::conditional::value, typename BasicJsonType::const_pointer, typename BasicJsonType::pointer>::type; /// defines a reference to the type iterated over (value_type) using reference = typename std::conditional::value, typename BasicJsonType::const_reference, typename BasicJsonType::reference>::type; /// default constructor iter_impl() = default; /*! @brief constructor for a given JSON instance @param[in] object pointer to a JSON object for this iterator @pre object != nullptr @post The iterator is initialized; i.e. `m_object != nullptr`. */ explicit iter_impl(pointer object) noexcept : m_object(object) { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { m_it.object_iterator = typename object_t::iterator(); break; } case value_t::array: { m_it.array_iterator = typename array_t::iterator(); break; } default: { m_it.primitive_iterator = primitive_iterator_t(); break; } } } /*! @note The conventional copy constructor and copy assignment are implicitly defined. Combined with the following converting constructor and assignment, they support: (1) copy from iterator to iterator, (2) copy from const iterator to const iterator, and (3) conversion from iterator to const iterator. However conversion from const iterator to iterator is not defined. */ /*! @brief converting constructor @param[in] other non-const iterator to copy from @note It is not checked whether @a other is initialized. */ iter_impl(const iter_impl::type>& other) noexcept : m_object(other.m_object), m_it(other.m_it) {} /*! @brief converting assignment @param[in,out] other non-const iterator to copy from @return const/non-const iterator @note It is not checked whether @a other is initialized. */ iter_impl& operator=(const iter_impl::type>& other) noexcept { m_object = other.m_object; m_it = other.m_it; return *this; } private: /*! @brief set the iterator to the first value @pre The iterator is initialized; i.e. `m_object != nullptr`. */ void set_begin() noexcept { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { m_it.object_iterator = m_object->m_value.object->begin(); break; } case value_t::array: { m_it.array_iterator = m_object->m_value.array->begin(); break; } case value_t::null: { // set to end so begin()==end() is true: null is empty m_it.primitive_iterator.set_end(); break; } default: { m_it.primitive_iterator.set_begin(); break; } } } /*! @brief set the iterator past the last value @pre The iterator is initialized; i.e. `m_object != nullptr`. */ void set_end() noexcept { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { m_it.object_iterator = m_object->m_value.object->end(); break; } case value_t::array: { m_it.array_iterator = m_object->m_value.array->end(); break; } default: { m_it.primitive_iterator.set_end(); break; } } } public: /*! @brief return a reference to the value pointed to by the iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ reference operator*() const { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { assert(m_it.object_iterator != m_object->m_value.object->end()); return m_it.object_iterator->second; } case value_t::array: { assert(m_it.array_iterator != m_object->m_value.array->end()); return *m_it.array_iterator; } case value_t::null: JSON_THROW(invalid_iterator::create(214, "cannot get value")); default: { if (JSON_LIKELY(m_it.primitive_iterator.is_begin())) { return *m_object; } JSON_THROW(invalid_iterator::create(214, "cannot get value")); } } } /*! @brief dereference the iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ pointer operator->() const { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { assert(m_it.object_iterator != m_object->m_value.object->end()); return &(m_it.object_iterator->second); } case value_t::array: { assert(m_it.array_iterator != m_object->m_value.array->end()); return &*m_it.array_iterator; } default: { if (JSON_LIKELY(m_it.primitive_iterator.is_begin())) { return m_object; } JSON_THROW(invalid_iterator::create(214, "cannot get value")); } } } /*! @brief post-increment (it++) @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl const operator++(int) { auto result = *this; ++(*this); return result; } /*! @brief pre-increment (++it) @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl& operator++() { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { std::advance(m_it.object_iterator, 1); break; } case value_t::array: { std::advance(m_it.array_iterator, 1); break; } default: { ++m_it.primitive_iterator; break; } } return *this; } /*! @brief post-decrement (it--) @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl const operator--(int) { auto result = *this; --(*this); return result; } /*! @brief pre-decrement (--it) @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl& operator--() { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: { std::advance(m_it.object_iterator, -1); break; } case value_t::array: { std::advance(m_it.array_iterator, -1); break; } default: { --m_it.primitive_iterator; break; } } return *this; } /*! @brief comparison: equal @pre The iterator is initialized; i.e. `m_object != nullptr`. */ bool operator==(const iter_impl& other) const { // if objects are not the same, the comparison is undefined if (JSON_UNLIKELY(m_object != other.m_object)) { JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers")); } assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: return (m_it.object_iterator == other.m_it.object_iterator); case value_t::array: return (m_it.array_iterator == other.m_it.array_iterator); default: return (m_it.primitive_iterator == other.m_it.primitive_iterator); } } /*! @brief comparison: not equal @pre The iterator is initialized; i.e. `m_object != nullptr`. */ bool operator!=(const iter_impl& other) const { return not operator==(other); } /*! @brief comparison: smaller @pre The iterator is initialized; i.e. `m_object != nullptr`. */ bool operator<(const iter_impl& other) const { // if objects are not the same, the comparison is undefined if (JSON_UNLIKELY(m_object != other.m_object)) { JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers")); } assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators")); case value_t::array: return (m_it.array_iterator < other.m_it.array_iterator); default: return (m_it.primitive_iterator < other.m_it.primitive_iterator); } } /*! @brief comparison: less than or equal @pre The iterator is initialized; i.e. `m_object != nullptr`. */ bool operator<=(const iter_impl& other) const { return not other.operator < (*this); } /*! @brief comparison: greater than @pre The iterator is initialized; i.e. `m_object != nullptr`. */ bool operator>(const iter_impl& other) const { return not operator<=(other); } /*! @brief comparison: greater than or equal @pre The iterator is initialized; i.e. `m_object != nullptr`. */ bool operator>=(const iter_impl& other) const { return not operator<(other); } /*! @brief add to iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl& operator+=(difference_type i) { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators")); case value_t::array: { std::advance(m_it.array_iterator, i); break; } default: { m_it.primitive_iterator += i; break; } } return *this; } /*! @brief subtract from iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl& operator-=(difference_type i) { return operator+=(-i); } /*! @brief add to iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl operator+(difference_type i) const { auto result = *this; result += i; return result; } /*! @brief addition of distance and iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ friend iter_impl operator+(difference_type i, const iter_impl& it) { auto result = it; result += i; return result; } /*! @brief subtract from iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ iter_impl operator-(difference_type i) const { auto result = *this; result -= i; return result; } /*! @brief return difference @pre The iterator is initialized; i.e. `m_object != nullptr`. */ difference_type operator-(const iter_impl& other) const { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators")); case value_t::array: return m_it.array_iterator - other.m_it.array_iterator; default: return m_it.primitive_iterator - other.m_it.primitive_iterator; } } /*! @brief access to successor @pre The iterator is initialized; i.e. `m_object != nullptr`. */ reference operator[](difference_type n) const { assert(m_object != nullptr); switch (m_object->m_type) { case value_t::object: JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators")); case value_t::array: return *std::next(m_it.array_iterator, n); case value_t::null: JSON_THROW(invalid_iterator::create(214, "cannot get value")); default: { if (JSON_LIKELY(m_it.primitive_iterator.get_value() == -n)) { return *m_object; } JSON_THROW(invalid_iterator::create(214, "cannot get value")); } } } /*! @brief return the key of an object iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ typename object_t::key_type key() const { assert(m_object != nullptr); if (JSON_LIKELY(m_object->is_object())) { return m_it.object_iterator->first; } JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators")); } /*! @brief return the value of an iterator @pre The iterator is initialized; i.e. `m_object != nullptr`. */ reference value() const { return operator*(); } private: /// associated JSON instance pointer m_object = nullptr; /// the actual iterator of the associated instance internal_iterator::type> m_it; }; } } // #include #include // size_t #include // string, to_string // #include namespace nlohmann { namespace detail { /// proxy class for the items() function template class iteration_proxy { private: /// helper class for iteration class iteration_proxy_internal { private: /// the iterator IteratorType anchor; /// an index for arrays (used to create key names) std::size_t array_index = 0; public: explicit iteration_proxy_internal(IteratorType it) noexcept : anchor(it) {} /// dereference operator (needed for range-based for) iteration_proxy_internal& operator*() { return *this; } /// increment operator (needed for range-based for) iteration_proxy_internal& operator++() { ++anchor; ++array_index; return *this; } /// inequality operator (needed for range-based for) bool operator!=(const iteration_proxy_internal& o) const noexcept { return anchor != o.anchor; } /// return key of the iterator std::string key() const { assert(anchor.m_object != nullptr); switch (anchor.m_object->type()) { // use integer array index as key case value_t::array: return std::to_string(array_index); // use key from the object case value_t::object: return anchor.key(); // use an empty key for all primitive types default: return ""; } } /// return value of the iterator typename IteratorType::reference value() const { return anchor.value(); } }; /// the container to iterate typename IteratorType::reference container; public: /// construct iteration proxy from a container explicit iteration_proxy(typename IteratorType::reference cont) noexcept : container(cont) {} /// return iterator begin (needed for range-based for) iteration_proxy_internal begin() noexcept { return iteration_proxy_internal(container.begin()); } /// return iterator end (needed for range-based for) iteration_proxy_internal end() noexcept { return iteration_proxy_internal(container.end()); } }; } } // #include #include // ptrdiff_t #include // reverse_iterator #include // declval namespace nlohmann { namespace detail { ////////////////////// // reverse_iterator // ////////////////////// /*! @brief a template for a reverse iterator class @tparam Base the base iterator type to reverse. Valid types are @ref iterator (to create @ref reverse_iterator) and @ref const_iterator (to create @ref const_reverse_iterator). @requirement The class satisfies the following concept requirements: - [BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator): The iterator that can be moved can be moved in both directions (i.e. incremented and decremented). - [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator): It is possible to write to the pointed-to element (only if @a Base is @ref iterator). @since version 1.0.0 */ template class json_reverse_iterator : public std::reverse_iterator { public: using difference_type = std::ptrdiff_t; /// shortcut to the reverse iterator adapter using base_iterator = std::reverse_iterator; /// the reference type for the pointed-to element using reference = typename Base::reference; /// create reverse iterator from iterator json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept : base_iterator(it) {} /// create reverse iterator from base class json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} /// post-increment (it++) json_reverse_iterator const operator++(int) { return static_cast(base_iterator::operator++(1)); } /// pre-increment (++it) json_reverse_iterator& operator++() { return static_cast(base_iterator::operator++()); } /// post-decrement (it--) json_reverse_iterator const operator--(int) { return static_cast(base_iterator::operator--(1)); } /// pre-decrement (--it) json_reverse_iterator& operator--() { return static_cast(base_iterator::operator--()); } /// add to iterator json_reverse_iterator& operator+=(difference_type i) { return static_cast(base_iterator::operator+=(i)); } /// add to iterator json_reverse_iterator operator+(difference_type i) const { return static_cast(base_iterator::operator+(i)); } /// subtract from iterator json_reverse_iterator operator-(difference_type i) const { return static_cast(base_iterator::operator-(i)); } /// return difference difference_type operator-(const json_reverse_iterator& other) const { return base_iterator(*this) - base_iterator(other); } /// access to successor reference operator[](difference_type n) const { return *(this->operator+(n)); } /// return the key of an object iterator auto key() const -> decltype(std::declval().key()) { auto it = --this->base(); return it.key(); } /// return the value of an iterator reference value() const { auto it = --this->base(); return it.operator * (); } }; } } // #include #include // copy #include // size_t #include // streamsize #include // back_inserter #include // shared_ptr, make_shared #include // basic_ostream #include // basic_string #include // vector namespace nlohmann { namespace detail { /// abstract output adapter interface template struct output_adapter_protocol { virtual void write_character(CharType c) = 0; virtual void write_characters(const CharType* s, std::size_t length) = 0; virtual ~output_adapter_protocol() = default; }; /// a type to simplify interfaces template using output_adapter_t = std::shared_ptr>; /// output adapter for byte vectors template class output_vector_adapter : public output_adapter_protocol { public: explicit output_vector_adapter(std::vector& vec) : v(vec) {} void write_character(CharType c) override { v.push_back(c); } void write_characters(const CharType* s, std::size_t length) override { std::copy(s, s + length, std::back_inserter(v)); } private: std::vector& v; }; /// output adapter for output streams template class output_stream_adapter : public output_adapter_protocol { public: explicit output_stream_adapter(std::basic_ostream& s) : stream(s) {} void write_character(CharType c) override { stream.put(c); } void write_characters(const CharType* s, std::size_t length) override { stream.write(s, static_cast(length)); } private: std::basic_ostream& stream; }; /// output adapter for basic_string template class output_string_adapter : public output_adapter_protocol { public: explicit output_string_adapter(std::basic_string& s) : str(s) {} void write_character(CharType c) override { str.push_back(c); } void write_characters(const CharType* s, std::size_t length) override { str.append(s, length); } private: std::basic_string& str; }; template class output_adapter { public: output_adapter(std::vector& vec) : oa(std::make_shared>(vec)) {} output_adapter(std::basic_ostream& s) : oa(std::make_shared>(s)) {} output_adapter(std::basic_string& s) : oa(std::make_shared>(s)) {} operator output_adapter_t() { return oa; } private: output_adapter_t oa = nullptr; }; } } // #include #include // generate_n #include // array #include // assert #include // ldexp #include // size_t #include // uint8_t, uint16_t, uint32_t, uint64_t #include // memcpy #include // setw, setfill #include // hex #include // back_inserter #include // numeric_limits #include // stringstream #include // char_traits, string #include // make_pair, move // #include // #include // #include // #include namespace nlohmann { namespace detail { /////////////////// // binary reader // /////////////////// /*! @brief deserialization of CBOR and MessagePack values */ template class binary_reader { using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; using string_t = typename BasicJsonType::string_t; public: /*! @brief create a binary reader @param[in] adapter input adapter to read from */ explicit binary_reader(input_adapter_t adapter) : ia(std::move(adapter)) { assert(ia); } /*! @brief create a JSON value from CBOR input @param[in] strict whether to expect the input to be consumed completed @return JSON value created from CBOR input @throw parse_error.110 if input ended unexpectedly or the end of file was not reached when @a strict was set to true @throw parse_error.112 if unsupported byte was read */ BasicJsonType parse_cbor(const bool strict) { const auto res = parse_cbor_internal(); if (strict) { get(); expect_eof(); } return res; } /*! @brief create a JSON value from MessagePack input @param[in] strict whether to expect the input to be consumed completed @return JSON value created from MessagePack input @throw parse_error.110 if input ended unexpectedly or the end of file was not reached when @a strict was set to true @throw parse_error.112 if unsupported byte was read */ BasicJsonType parse_msgpack(const bool strict) { const auto res = parse_msgpack_internal(); if (strict) { get(); expect_eof(); } return res; } /*! @brief create a JSON value from UBJSON input @param[in] strict whether to expect the input to be consumed completed @return JSON value created from UBJSON input @throw parse_error.110 if input ended unexpectedly or the end of file was not reached when @a strict was set to true @throw parse_error.112 if unsupported byte was read */ BasicJsonType parse_ubjson(const bool strict) { const auto res = parse_ubjson_internal(); if (strict) { get_ignore_noop(); expect_eof(); } return res; } /*! @brief determine system byte order @return true if and only if system's byte order is little endian @note from http://stackoverflow.com/a/1001328/266378 */ static constexpr bool little_endianess(int num = 1) noexcept { return (*reinterpret_cast(&num) == 1); } private: /*! @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead */ BasicJsonType parse_cbor_internal(const bool get_char = true) { switch (get_char ? get() : current) { // EOF case std::char_traits::eof(): JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); // Integer 0x00..0x17 (0..23) case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: return static_cast(current); case 0x18: // Unsigned integer (one-byte uint8_t follows) return get_number(); case 0x19: // Unsigned integer (two-byte uint16_t follows) return get_number(); case 0x1A: // Unsigned integer (four-byte uint32_t follows) return get_number(); case 0x1B: // Unsigned integer (eight-byte uint64_t follows) return get_number(); // Negative integer -1-0x00..-1-0x17 (-1..-24) case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F: case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: return static_cast(0x20 - 1 - current); case 0x38: // Negative integer (one-byte uint8_t follows) { return static_cast(-1) - get_number(); } case 0x39: // Negative integer -1-n (two-byte uint16_t follows) { return static_cast(-1) - get_number(); } case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) { return static_cast(-1) - get_number(); } case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) { return static_cast(-1) - static_cast(get_number()); } // UTF-8 string (0x00..0x17 bytes follow) case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: // UTF-8 string (one-byte uint8_t for n follows) case 0x79: // UTF-8 string (two-byte uint16_t for n follow) case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) case 0x7F: // UTF-8 string (indefinite length) { return get_cbor_string(); } // array (0x00..0x17 data items follow) case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8A: case 0x8B: case 0x8C: case 0x8D: case 0x8E: case 0x8F: case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: { return get_cbor_array(current & 0x1F); } case 0x98: // array (one-byte uint8_t for n follows) { return get_cbor_array(get_number()); } case 0x99: // array (two-byte uint16_t for n follow) { return get_cbor_array(get_number()); } case 0x9A: // array (four-byte uint32_t for n follow) { return get_cbor_array(get_number()); } case 0x9B: // array (eight-byte uint64_t for n follow) { return get_cbor_array(get_number()); } case 0x9F: // array (indefinite length) { BasicJsonType result = value_t::array; while (get() != 0xFF) { result.push_back(parse_cbor_internal(false)); } return result; } // map (0x00..0x17 pairs of data items follow) case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: case 0xA8: case 0xA9: case 0xAA: case 0xAB: case 0xAC: case 0xAD: case 0xAE: case 0xAF: case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: { return get_cbor_object(current & 0x1F); } case 0xB8: // map (one-byte uint8_t for n follows) { return get_cbor_object(get_number()); } case 0xB9: // map (two-byte uint16_t for n follow) { return get_cbor_object(get_number()); } case 0xBA: // map (four-byte uint32_t for n follow) { return get_cbor_object(get_number()); } case 0xBB: // map (eight-byte uint64_t for n follow) { return get_cbor_object(get_number()); } case 0xBF: // map (indefinite length) { BasicJsonType result = value_t::object; while (get() != 0xFF) { auto key = get_cbor_string(); result[key] = parse_cbor_internal(); } return result; } case 0xF4: // false { return false; } case 0xF5: // true { return true; } case 0xF6: // null { return value_t::null; } case 0xF9: // Half-Precision Float (two-byte IEEE 754) { const int byte1 = get(); unexpect_eof(); const int byte2 = get(); unexpect_eof(); // code from RFC 7049, Appendix D, Figure 3: // As half-precision floating-point numbers were only added // to IEEE 754 in 2008, today's programming platforms often // still only have limited support for them. It is very // easy to include at least decoding support for them even // without such support. An example of a small decoder for // half-precision floating-point numbers in the C language // is shown in Fig. 3. const int half = (byte1 << 8) + byte2; const int exp = (half >> 10) & 0x1F; const int mant = half & 0x3FF; double val; if (exp == 0) { val = std::ldexp(mant, -24); } else if (exp != 31) { val = std::ldexp(mant + 1024, exp - 25); } else { val = (mant == 0) ? std::numeric_limits::infinity() : std::numeric_limits::quiet_NaN(); } return (half & 0x8000) != 0 ? -val : val; } case 0xFA: // Single-Precision Float (four-byte IEEE 754) { return get_number(); } case 0xFB: // Double-Precision Float (eight-byte IEEE 754) { return get_number(); } default: // anything else (0xFF is handled inside the other types) { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(112, chars_read, "error reading CBOR; last byte: 0x" + ss.str())); } } } BasicJsonType parse_msgpack_internal() { switch (get()) { // EOF case std::char_traits::eof(): JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); // positive fixint case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0E: case 0x0F: case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F: case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3E: case 0x3F: case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4E: case 0x4F: case 0x50: case 0x51: case 0x52: case 0x53: case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5A: case 0x5B: case 0x5C: case 0x5D: case 0x5E: case 0x5F: case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D: case 0x7E: case 0x7F: return static_cast(current); // fixmap case 0x80: case 0x81: case 0x82: case 0x83: case 0x84: case 0x85: case 0x86: case 0x87: case 0x88: case 0x89: case 0x8A: case 0x8B: case 0x8C: case 0x8D: case 0x8E: case 0x8F: { return get_msgpack_object(current & 0x0F); } // fixarray case 0x90: case 0x91: case 0x92: case 0x93: case 0x94: case 0x95: case 0x96: case 0x97: case 0x98: case 0x99: case 0x9A: case 0x9B: case 0x9C: case 0x9D: case 0x9E: case 0x9F: { return get_msgpack_array(current & 0x0F); } // fixstr case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: case 0xA8: case 0xA9: case 0xAA: case 0xAB: case 0xAC: case 0xAD: case 0xAE: case 0xAF: case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: case 0xB8: case 0xB9: case 0xBA: case 0xBB: case 0xBC: case 0xBD: case 0xBE: case 0xBF: return get_msgpack_string(); case 0xC0: // nil return value_t::null; case 0xC2: // false return false; case 0xC3: // true return true; case 0xCA: // float 32 return get_number(); case 0xCB: // float 64 return get_number(); case 0xCC: // uint 8 return get_number(); case 0xCD: // uint 16 return get_number(); case 0xCE: // uint 32 return get_number(); case 0xCF: // uint 64 return get_number(); case 0xD0: // int 8 return get_number(); case 0xD1: // int 16 return get_number(); case 0xD2: // int 32 return get_number(); case 0xD3: // int 64 return get_number(); case 0xD9: // str 8 case 0xDA: // str 16 case 0xDB: // str 32 return get_msgpack_string(); case 0xDC: // array 16 { return get_msgpack_array(get_number()); } case 0xDD: // array 32 { return get_msgpack_array(get_number()); } case 0xDE: // map 16 { return get_msgpack_object(get_number()); } case 0xDF: // map 32 { return get_msgpack_object(get_number()); } // positive fixint case 0xE0: case 0xE1: case 0xE2: case 0xE3: case 0xE4: case 0xE5: case 0xE6: case 0xE7: case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF: case 0xF0: case 0xF1: case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7: case 0xF8: case 0xF9: case 0xFA: case 0xFB: case 0xFC: case 0xFD: case 0xFE: case 0xFF: return static_cast(current); default: // anything else { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(112, chars_read, "error reading MessagePack; last byte: 0x" + ss.str())); } } } /*! @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead */ BasicJsonType parse_ubjson_internal(const bool get_char = true) { return get_ubjson_value(get_char ? get_ignore_noop() : current); } /*! @brief get next character from the input This function provides the interface to the used input adapter. It does not throw in case the input reached EOF, but returns a -'ve valued `std::char_traits::eof()` in that case. @return character read from the input */ int get() { ++chars_read; return (current = ia->get_character()); } /*! @return character read from the input after ignoring all 'N' entries */ int get_ignore_noop() { do { get(); } while (current == 'N'); return current; } /* @brief read a number from the input @tparam NumberType the type of the number @return number of type @a NumberType @note This function needs to respect the system's endianess, because bytes in CBOR and MessagePack are stored in network order (big endian) and therefore need reordering on little endian systems. @throw parse_error.110 if input has less than `sizeof(NumberType)` bytes */ template NumberType get_number() { // step 1: read input into array with system's byte order std::array vec; for (std::size_t i = 0; i < sizeof(NumberType); ++i) { get(); unexpect_eof(); // reverse byte order prior to conversion if necessary if (is_little_endian) { vec[sizeof(NumberType) - i - 1] = static_cast(current); } else { vec[i] = static_cast(current); // LCOV_EXCL_LINE } } // step 2: convert array into number of type T and return NumberType result; std::memcpy(&result, vec.data(), sizeof(NumberType)); return result; } /*! @brief create a string by reading characters from the input @param[in] len number of bytes to read @note We can not reserve @a len bytes for the result, because @a len may be too large. Usually, @ref unexpect_eof() detects the end of the input before we run out of string memory. @return string created by reading @a len bytes @throw parse_error.110 if input has less than @a len bytes */ template string_t get_string(const NumberType len) { string_t result; std::generate_n(std::back_inserter(result), len, [this]() { get(); unexpect_eof(); return static_cast(current); }); return result; } /*! @brief reads a CBOR string This function first reads starting bytes to determine the expected string length and then copies this number of bytes into a string. Additionally, CBOR's strings with indefinite lengths are supported. @return string @throw parse_error.110 if input ended @throw parse_error.113 if an unexpected byte is read */ string_t get_cbor_string() { unexpect_eof(); switch (current) { // UTF-8 string (0x00..0x17 bytes follow) case 0x60: case 0x61: case 0x62: case 0x63: case 0x64: case 0x65: case 0x66: case 0x67: case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77: { return get_string(current & 0x1F); } case 0x78: // UTF-8 string (one-byte uint8_t for n follows) { return get_string(get_number()); } case 0x79: // UTF-8 string (two-byte uint16_t for n follow) { return get_string(get_number()); } case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) { return get_string(get_number()); } case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) { return get_string(get_number()); } case 0x7F: // UTF-8 string (indefinite length) { string_t result; while (get() != 0xFF) { result.append(get_cbor_string()); } return result; } default: { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(113, chars_read, "expected a CBOR string; last byte: 0x" + ss.str())); } } } template BasicJsonType get_cbor_array(const NumberType len) { BasicJsonType result = value_t::array; std::generate_n(std::back_inserter(*result.m_value.array), len, [this]() { return parse_cbor_internal(); }); return result; } template BasicJsonType get_cbor_object(const NumberType len) { BasicJsonType result = value_t::object; std::generate_n(std::inserter(*result.m_value.object, result.m_value.object->end()), len, [this]() { get(); auto key = get_cbor_string(); auto val = parse_cbor_internal(); return std::make_pair(std::move(key), std::move(val)); }); return result; } /*! @brief reads a MessagePack string This function first reads starting bytes to determine the expected string length and then copies this number of bytes into a string. @return string @throw parse_error.110 if input ended @throw parse_error.113 if an unexpected byte is read */ string_t get_msgpack_string() { unexpect_eof(); switch (current) { // fixstr case 0xA0: case 0xA1: case 0xA2: case 0xA3: case 0xA4: case 0xA5: case 0xA6: case 0xA7: case 0xA8: case 0xA9: case 0xAA: case 0xAB: case 0xAC: case 0xAD: case 0xAE: case 0xAF: case 0xB0: case 0xB1: case 0xB2: case 0xB3: case 0xB4: case 0xB5: case 0xB6: case 0xB7: case 0xB8: case 0xB9: case 0xBA: case 0xBB: case 0xBC: case 0xBD: case 0xBE: case 0xBF: { return get_string(current & 0x1F); } case 0xD9: // str 8 { return get_string(get_number()); } case 0xDA: // str 16 { return get_string(get_number()); } case 0xDB: // str 32 { return get_string(get_number()); } default: { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(113, chars_read, "expected a MessagePack string; last byte: 0x" + ss.str())); } } } template BasicJsonType get_msgpack_array(const NumberType len) { BasicJsonType result = value_t::array; std::generate_n(std::back_inserter(*result.m_value.array), len, [this]() { return parse_msgpack_internal(); }); return result; } template BasicJsonType get_msgpack_object(const NumberType len) { BasicJsonType result = value_t::object; std::generate_n(std::inserter(*result.m_value.object, result.m_value.object->end()), len, [this]() { get(); auto key = get_msgpack_string(); auto val = parse_msgpack_internal(); return std::make_pair(std::move(key), std::move(val)); }); return result; } /*! @brief reads a UBJSON string This function is either called after reading the 'S' byte explicitly indicating a string, or in case of an object key where the 'S' byte can be left out. @param[in] get_char whether a new character should be retrieved from the input (true, default) or whether the last read character should be considered instead @return string @throw parse_error.110 if input ended @throw parse_error.113 if an unexpected byte is read */ string_t get_ubjson_string(const bool get_char = true) { if (get_char) { get(); // TODO: may we ignore N here? } unexpect_eof(); switch (current) { case 'U': return get_string(get_number()); case 'i': return get_string(get_number()); case 'I': return get_string(get_number()); case 'l': return get_string(get_number()); case 'L': return get_string(get_number()); default: std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(113, chars_read, "expected a UBJSON string; last byte: 0x" + ss.str())); } } /*! @brief determine the type and size for a container In the optimized UBJSON format, a type and a size can be provided to allow for a more compact representation. @return pair of the size and the type */ std::pair get_ubjson_size_type() { std::size_t sz = string_t::npos; int tc = 0; get_ignore_noop(); if (current == '$') { tc = get(); // must not ignore 'N', because 'N' maybe the type unexpect_eof(); get_ignore_noop(); if (current != '#') { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(112, chars_read, "expected '#' after UBJSON type information; last byte: 0x" + ss.str())); } sz = parse_ubjson_internal(); } else if (current == '#') { sz = parse_ubjson_internal(); } return std::make_pair(sz, tc); } BasicJsonType get_ubjson_value(const int prefix) { switch (prefix) { case std::char_traits::eof(): // EOF JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); case 'T': // true return true; case 'F': // false return false; case 'Z': // null return nullptr; case 'U': return get_number(); case 'i': return get_number(); case 'I': return get_number(); case 'l': return get_number(); case 'L': return get_number(); case 'd': return get_number(); case 'D': return get_number(); case 'C': // char { get(); unexpect_eof(); if (JSON_UNLIKELY(current > 127)) { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(113, chars_read, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + ss.str())); } return string_t(1, static_cast(current)); } case 'S': // string return get_ubjson_string(); case '[': // array return get_ubjson_array(); case '{': // object return get_ubjson_object(); default: // anything else std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << current; JSON_THROW(parse_error::create(112, chars_read, "error reading UBJSON; last byte: 0x" + ss.str())); } } BasicJsonType get_ubjson_array() { BasicJsonType result = value_t::array; const auto size_and_type = get_ubjson_size_type(); if (size_and_type.first != string_t::npos) { if (JSON_UNLIKELY(size_and_type.first > result.max_size())) { JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(size_and_type.first))); } if (size_and_type.second != 0) { if (size_and_type.second != 'N') { std::generate_n(std::back_inserter(*result.m_value.array), size_and_type.first, [this, size_and_type]() { return get_ubjson_value(size_and_type.second); }); } } else { std::generate_n(std::back_inserter(*result.m_value.array), size_and_type.first, [this]() { return parse_ubjson_internal(); }); } } else { while (current != ']') { result.push_back(parse_ubjson_internal(false)); get_ignore_noop(); } } return result; } BasicJsonType get_ubjson_object() { BasicJsonType result = value_t::object; const auto size_and_type = get_ubjson_size_type(); if (size_and_type.first != string_t::npos) { if (JSON_UNLIKELY(size_and_type.first > result.max_size())) { JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(size_and_type.first))); } if (size_and_type.second != 0) { std::generate_n(std::inserter(*result.m_value.object, result.m_value.object->end()), size_and_type.first, [this, size_and_type]() { auto key = get_ubjson_string(); auto val = get_ubjson_value(size_and_type.second); return std::make_pair(std::move(key), std::move(val)); }); } else { std::generate_n(std::inserter(*result.m_value.object, result.m_value.object->end()), size_and_type.first, [this]() { auto key = get_ubjson_string(); auto val = parse_ubjson_internal(); return std::make_pair(std::move(key), std::move(val)); }); } } else { while (current != '}') { auto key = get_ubjson_string(false); result[std::move(key)] = parse_ubjson_internal(); get_ignore_noop(); } } return result; } /*! @brief throw if end of input is not reached @throw parse_error.110 if input not ended */ void expect_eof() const { if (JSON_UNLIKELY(current != std::char_traits::eof())) { JSON_THROW(parse_error::create(110, chars_read, "expected end of input")); } } /*! @briefthrow if end of input is reached @throw parse_error.110 if input ended */ void unexpect_eof() const { if (JSON_UNLIKELY(current == std::char_traits::eof())) { JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input")); } } private: /// input adapter input_adapter_t ia = nullptr; /// the current character int current = std::char_traits::eof(); /// the number of characters read std::size_t chars_read = 0; /// whether we can assume little endianess const bool is_little_endian = little_endianess(); }; } } // #include #include // reverse #include // array #include // uint8_t, uint16_t, uint32_t, uint64_t #include // memcpy #include // numeric_limits // #include // #include namespace nlohmann { namespace detail { /////////////////// // binary writer // /////////////////// /*! @brief serialization to CBOR and MessagePack values */ template class binary_writer { public: /*! @brief create a binary writer @param[in] adapter output adapter to write to */ explicit binary_writer(output_adapter_t adapter) : oa(adapter) { assert(oa); } /*! @brief[in] j JSON value to serialize */ void write_cbor(const BasicJsonType& j) { switch (j.type()) { case value_t::null: { oa->write_character(static_cast(0xF6)); break; } case value_t::boolean: { oa->write_character(j.m_value.boolean ? static_cast(0xF5) : static_cast(0xF4)); break; } case value_t::number_integer: { if (j.m_value.number_integer >= 0) { // CBOR does not differentiate between positive signed // integers and unsigned integers. Therefore, we used the // code from the value_t::number_unsigned case here. if (j.m_value.number_integer <= 0x17) { write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x18)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x19)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x1A)); write_number(static_cast(j.m_value.number_integer)); } else { oa->write_character(static_cast(0x1B)); write_number(static_cast(j.m_value.number_integer)); } } else { // The conversions below encode the sign in the first // byte, and the value is converted to a positive number. const auto positive_number = -1 - j.m_value.number_integer; if (j.m_value.number_integer >= -24) { write_number(static_cast(0x20 + positive_number)); } else if (positive_number <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x38)); write_number(static_cast(positive_number)); } else if (positive_number <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x39)); write_number(static_cast(positive_number)); } else if (positive_number <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x3A)); write_number(static_cast(positive_number)); } else { oa->write_character(static_cast(0x3B)); write_number(static_cast(positive_number)); } } break; } case value_t::number_unsigned: { if (j.m_value.number_unsigned <= 0x17) { write_number(static_cast(j.m_value.number_unsigned)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x18)); write_number(static_cast(j.m_value.number_unsigned)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x19)); write_number(static_cast(j.m_value.number_unsigned)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x1A)); write_number(static_cast(j.m_value.number_unsigned)); } else { oa->write_character(static_cast(0x1B)); write_number(static_cast(j.m_value.number_unsigned)); } break; } case value_t::number_float: // Double-Precision Float { oa->write_character(static_cast(0xFB)); write_number(j.m_value.number_float); break; } case value_t::string: { // step 1: write control byte and the string length const auto N = j.m_value.string->size(); if (N <= 0x17) { write_number(static_cast(0x60 + N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x78)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x79)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x7A)); write_number(static_cast(N)); } // LCOV_EXCL_START else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x7B)); write_number(static_cast(N)); } // LCOV_EXCL_STOP // step 2: write the string oa->write_characters( reinterpret_cast(j.m_value.string->c_str()), j.m_value.string->size()); break; } case value_t::array: { // step 1: write control byte and the array size const auto N = j.m_value.array->size(); if (N <= 0x17) { write_number(static_cast(0x80 + N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x98)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x99)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x9A)); write_number(static_cast(N)); } // LCOV_EXCL_START else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0x9B)); write_number(static_cast(N)); } // LCOV_EXCL_STOP // step 2: write each element for (const auto& el : *j.m_value.array) { write_cbor(el); } break; } case value_t::object: { // step 1: write control byte and the object size const auto N = j.m_value.object->size(); if (N <= 0x17) { write_number(static_cast(0xA0 + N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0xB8)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0xB9)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0xBA)); write_number(static_cast(N)); } // LCOV_EXCL_START else if (N <= (std::numeric_limits::max)()) { oa->write_character(static_cast(0xBB)); write_number(static_cast(N)); } // LCOV_EXCL_STOP // step 2: write each element for (const auto& el : *j.m_value.object) { write_cbor(el.first); write_cbor(el.second); } break; } default: break; } } /*! @brief[in] j JSON value to serialize */ void write_msgpack(const BasicJsonType& j) { switch (j.type()) { case value_t::null: // nil { oa->write_character(static_cast(0xC0)); break; } case value_t::boolean: // true and false { oa->write_character(j.m_value.boolean ? static_cast(0xC3) : static_cast(0xC2)); break; } case value_t::number_integer: { if (j.m_value.number_integer >= 0) { // MessagePack does not differentiate between positive // signed integers and unsigned integers. Therefore, we used // the code from the value_t::number_unsigned case here. if (j.m_value.number_unsigned < 128) { // positive fixnum write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 8 oa->write_character(static_cast(0xCC)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 16 oa->write_character(static_cast(0xCD)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 32 oa->write_character(static_cast(0xCE)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 64 oa->write_character(static_cast(0xCF)); write_number(static_cast(j.m_value.number_integer)); } } else { if (j.m_value.number_integer >= -32) { // negative fixnum write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer >= (std::numeric_limits::min)() and j.m_value.number_integer <= (std::numeric_limits::max)()) { // int 8 oa->write_character(static_cast(0xD0)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer >= (std::numeric_limits::min)() and j.m_value.number_integer <= (std::numeric_limits::max)()) { // int 16 oa->write_character(static_cast(0xD1)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer >= (std::numeric_limits::min)() and j.m_value.number_integer <= (std::numeric_limits::max)()) { // int 32 oa->write_character(static_cast(0xD2)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_integer >= (std::numeric_limits::min)() and j.m_value.number_integer <= (std::numeric_limits::max)()) { // int 64 oa->write_character(static_cast(0xD3)); write_number(static_cast(j.m_value.number_integer)); } } break; } case value_t::number_unsigned: { if (j.m_value.number_unsigned < 128) { // positive fixnum write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 8 oa->write_character(static_cast(0xCC)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 16 oa->write_character(static_cast(0xCD)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 32 oa->write_character(static_cast(0xCE)); write_number(static_cast(j.m_value.number_integer)); } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { // uint 64 oa->write_character(static_cast(0xCF)); write_number(static_cast(j.m_value.number_integer)); } break; } case value_t::number_float: // float 64 { oa->write_character(static_cast(0xCB)); write_number(j.m_value.number_float); break; } case value_t::string: { // step 1: write control byte and the string length const auto N = j.m_value.string->size(); if (N <= 31) { // fixstr write_number(static_cast(0xA0 | N)); } else if (N <= (std::numeric_limits::max)()) { // str 8 oa->write_character(static_cast(0xD9)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { // str 16 oa->write_character(static_cast(0xDA)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { // str 32 oa->write_character(static_cast(0xDB)); write_number(static_cast(N)); } // step 2: write the string oa->write_characters( reinterpret_cast(j.m_value.string->c_str()), j.m_value.string->size()); break; } case value_t::array: { // step 1: write control byte and the array size const auto N = j.m_value.array->size(); if (N <= 15) { // fixarray write_number(static_cast(0x90 | N)); } else if (N <= (std::numeric_limits::max)()) { // array 16 oa->write_character(static_cast(0xDC)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { // array 32 oa->write_character(static_cast(0xDD)); write_number(static_cast(N)); } // step 2: write each element for (const auto& el : *j.m_value.array) { write_msgpack(el); } break; } case value_t::object: { // step 1: write control byte and the object size const auto N = j.m_value.object->size(); if (N <= 15) { // fixmap write_number(static_cast(0x80 | (N & 0xF))); } else if (N <= (std::numeric_limits::max)()) { // map 16 oa->write_character(static_cast(0xDE)); write_number(static_cast(N)); } else if (N <= (std::numeric_limits::max)()) { // map 32 oa->write_character(static_cast(0xDF)); write_number(static_cast(N)); } // step 2: write each element for (const auto& el : *j.m_value.object) { write_msgpack(el.first); write_msgpack(el.second); } break; } default: break; } } /*! @param[in] j JSON value to serialize @param[in] use_count whether to use '#' prefixes (optimized format) @param[in] use_type whether to use '$' prefixes (optimized format) @param[in] add_prefix whether prefixes need to be used for this value */ void write_ubjson(const BasicJsonType& j, const bool use_count, const bool use_type, const bool add_prefix = true) { switch (j.type()) { case value_t::null: { if (add_prefix) { oa->write_character(static_cast('Z')); } break; } case value_t::boolean: { if (add_prefix) oa->write_character(j.m_value.boolean ? static_cast('T') : static_cast('F')); break; } case value_t::number_integer: { write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix); break; } case value_t::number_unsigned: { write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix); break; } case value_t::number_float: { write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix); break; } case value_t::string: { if (add_prefix) { oa->write_character(static_cast('S')); } write_number_with_ubjson_prefix(j.m_value.string->size(), true); oa->write_characters( reinterpret_cast(j.m_value.string->c_str()), j.m_value.string->size()); break; } case value_t::array: { if (add_prefix) { oa->write_character(static_cast('[')); } bool prefix_required = true; if (use_type and not j.m_value.array->empty()) { assert(use_count); const char first_prefix = ubjson_prefix(j.front()); const bool same_prefix = std::all_of(j.begin() + 1, j.end(), [this, first_prefix](const BasicJsonType & v) { return ubjson_prefix(v) == first_prefix; }); if (same_prefix) { prefix_required = false; oa->write_character(static_cast('$')); oa->write_character(static_cast(first_prefix)); } } if (use_count) { oa->write_character(static_cast('#')); write_number_with_ubjson_prefix(j.m_value.array->size(), true); } for (const auto& el : *j.m_value.array) { write_ubjson(el, use_count, use_type, prefix_required); } if (not use_count) { oa->write_character(static_cast(']')); } break; } case value_t::object: { if (add_prefix) { oa->write_character(static_cast('{')); } bool prefix_required = true; if (use_type and not j.m_value.object->empty()) { assert(use_count); const char first_prefix = ubjson_prefix(j.front()); const bool same_prefix = std::all_of(j.begin(), j.end(), [this, first_prefix](const BasicJsonType & v) { return ubjson_prefix(v) == first_prefix; }); if (same_prefix) { prefix_required = false; oa->write_character(static_cast('$')); oa->write_character(static_cast(first_prefix)); } } if (use_count) { oa->write_character(static_cast('#')); write_number_with_ubjson_prefix(j.m_value.object->size(), true); } for (const auto& el : *j.m_value.object) { write_number_with_ubjson_prefix(el.first.size(), true); oa->write_characters( reinterpret_cast(el.first.c_str()), el.first.size()); write_ubjson(el.second, use_count, use_type, prefix_required); } if (not use_count) { oa->write_character(static_cast('}')); } break; } default: break; } } private: /* @brief write a number to output input @param[in] n number of type @a NumberType @tparam NumberType the type of the number @note This function needs to respect the system's endianess, because bytes in CBOR, MessagePack, and UBJSON are stored in network order (big endian) and therefore need reordering on little endian systems. */ template void write_number(const NumberType n) { // step 1: write number to array of length NumberType std::array vec; std::memcpy(vec.data(), &n, sizeof(NumberType)); // step 2: write array to output (with possible reordering) if (is_little_endian) { // reverse byte order prior to conversion if necessary std::reverse(vec.begin(), vec.end()); } oa->write_characters(vec.data(), sizeof(NumberType)); } template void write_number_with_ubjson_prefix(const NumberType n, const bool add_prefix) { if (std::is_floating_point::value) { if (add_prefix) { oa->write_character(static_cast('D')); // float64 } write_number(n); } else if (std::is_unsigned::value) { if (n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('i')); // int8 } write_number(static_cast(n)); } else if (n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('U')); // uint8 } write_number(static_cast(n)); } else if (n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('I')); // int16 } write_number(static_cast(n)); } else if (n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('l')); // int32 } write_number(static_cast(n)); } else if (n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('L')); // int64 } write_number(static_cast(n)); } else { JSON_THROW(out_of_range::create(407, "number overflow serializing " + std::to_string(n))); } } else { if ((std::numeric_limits::min)() <= n and n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('i')); // int8 } write_number(static_cast(n)); } else if ((std::numeric_limits::min)() <= n and n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('U')); // uint8 } write_number(static_cast(n)); } else if ((std::numeric_limits::min)() <= n and n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('I')); // int16 } write_number(static_cast(n)); } else if ((std::numeric_limits::min)() <= n and n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('l')); // int32 } write_number(static_cast(n)); } else if ((std::numeric_limits::min)() <= n and n <= (std::numeric_limits::max)()) { if (add_prefix) { oa->write_character(static_cast('L')); // int64 } write_number(static_cast(n)); } // LCOV_EXCL_START else { JSON_THROW(out_of_range::create(407, "number overflow serializing " + std::to_string(n))); } // LCOV_EXCL_STOP } } /*! @brief determine the type prefix of container values @note This function does not need to be 100% accurate when it comes to integer limits. In case a number exceeds the limits of int64_t, this will be detected by a later call to function write_number_with_ubjson_prefix. Therefore, we return 'L' for any value that does not fit the previous limits. */ char ubjson_prefix(const BasicJsonType& j) const noexcept { switch (j.type()) { case value_t::null: return 'Z'; case value_t::boolean: return j.m_value.boolean ? 'T' : 'F'; case value_t::number_integer: { if ((std::numeric_limits::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits::max)()) { return 'i'; } else if ((std::numeric_limits::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits::max)()) { return 'U'; } else if ((std::numeric_limits::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits::max)()) { return 'I'; } else if ((std::numeric_limits::min)() <= j.m_value.number_integer and j.m_value.number_integer <= (std::numeric_limits::max)()) { return 'l'; } else // no check and assume int64_t (see note above) { return 'L'; } } case value_t::number_unsigned: { if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { return 'i'; } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { return 'U'; } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { return 'I'; } else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) { return 'l'; } else // no check and assume int64_t (see note above) { return 'L'; } } case value_t::number_float: return 'D'; case value_t::string: return 'S'; case value_t::array: return '['; case value_t::object: return '{'; default: // discarded values return 'N'; } } private: /// whether we can assume little endianess const bool is_little_endian = binary_reader::little_endianess(); /// the output output_adapter_t oa = nullptr; }; } } // #include #include // reverse, remove, fill, find, none_of #include // array #include // assert #include // and, or #include // localeconv, lconv #include // labs, isfinite, isnan, signbit #include // size_t, ptrdiff_t #include // uint8_t #include // snprintf #include // setfill #include // next #include // numeric_limits #include // string #include // stringstream #include // is_same // #include // #include #include // assert #include // or, and, not #include // signbit, isfinite #include // intN_t, uintN_t #include // memcpy, memmove namespace nlohmann { namespace detail { /*! @brief implements the Grisu2 algorithm for binary to decimal floating-point conversion. This implementation is a slightly modified version of the reference implementation which may be obtained from http://florian.loitsch.com/publications (bench.tar.gz). The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. For a detailed description of the algorithm see: [1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming Language Design and Implementation, PLDI 2010 [2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language Design and Implementation, PLDI 1996 */ namespace dtoa_impl { template Target reinterpret_bits(const Source source) { static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); Target target; std::memcpy(&target, &source, sizeof(Source)); return target; } struct diyfp // f * 2^e { static constexpr int kPrecision = 64; // = q uint64_t f; int e; constexpr diyfp() noexcept : f(0), e(0) {} constexpr diyfp(uint64_t f_, int e_) noexcept : f(f_), e(e_) {} /*! @brief returns x - y @pre x.e == y.e and x.f >= y.f */ static diyfp sub(const diyfp& x, const diyfp& y) noexcept { assert(x.e == y.e); assert(x.f >= y.f); return diyfp(x.f - y.f, x.e); } /*! @brief returns x * y @note The result is rounded. (Only the upper q bits are returned.) */ static diyfp mul(const diyfp& x, const diyfp& y) noexcept { static_assert(kPrecision == 64, "internal error"); // Computes: // f = round((x.f * y.f) / 2^q) // e = x.e + y.e + q // Emulate the 64-bit * 64-bit multiplication: // // p = u * v // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) // // (Since Q might be larger than 2^32 - 1) // // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) // // (Q_hi + H does not overflow a 64-bit int) // // = p_lo + 2^64 p_hi const uint64_t u_lo = x.f & 0xFFFFFFFF; const uint64_t u_hi = x.f >> 32; const uint64_t v_lo = y.f & 0xFFFFFFFF; const uint64_t v_hi = y.f >> 32; const uint64_t p0 = u_lo * v_lo; const uint64_t p1 = u_lo * v_hi; const uint64_t p2 = u_hi * v_lo; const uint64_t p3 = u_hi * v_hi; const uint64_t p0_hi = p0 >> 32; const uint64_t p1_lo = p1 & 0xFFFFFFFF; const uint64_t p1_hi = p1 >> 32; const uint64_t p2_lo = p2 & 0xFFFFFFFF; const uint64_t p2_hi = p2 >> 32; uint64_t Q = p0_hi + p1_lo + p2_lo; // The full product might now be computed as // // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) // p_lo = p0_lo + (Q << 32) // // But in this particular case here, the full p_lo is not required. // Effectively we only need to add the highest bit in p_lo to p_hi (and // Q_hi + 1 does not overflow). Q += uint64_t{1} << (64 - 32 - 1); // round, ties up const uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32); return diyfp(h, x.e + y.e + 64); } /*! @brief normalize x such that the significand is >= 2^(q-1) @pre x.f != 0 */ static diyfp normalize(diyfp x) noexcept { assert(x.f != 0); while ((x.f >> 63) == 0) { x.f <<= 1; x.e--; } return x; } /*! @brief normalize x such that the result has the exponent E @pre e >= x.e and the upper e - x.e bits of x.f must be zero. */ static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept { const int delta = x.e - target_exponent; assert(delta >= 0); assert(((x.f << delta) >> delta) == x.f); return diyfp(x.f << delta, target_exponent); } }; struct boundaries { diyfp w; diyfp minus; diyfp plus; }; /*! Compute the (normalized) diyfp representing the input number 'value' and its boundaries. @pre value must be finite and positive */ template boundaries compute_boundaries(FloatType value) { assert(std::isfinite(value)); assert(value > 0); // Convert the IEEE representation into a diyfp. // // If v is denormal: // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) // If v is normalized: // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) static_assert(std::numeric_limits::is_iec559, "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); constexpr int kMinExp = 1 - kBias; constexpr uint64_t kHiddenBit = uint64_t{1} << (kPrecision - 1); // = 2^(p-1) using bits_type = typename std::conditional< kPrecision == 24, uint32_t, uint64_t >::type; const uint64_t bits = reinterpret_bits(value); const uint64_t E = bits >> (kPrecision - 1); const uint64_t F = bits & (kHiddenBit - 1); const bool is_denormal = (E == 0); const diyfp v = is_denormal ? diyfp(F, kMinExp) : diyfp(F + kHiddenBit, static_cast(E) - kBias); // Compute the boundaries m- and m+ of the floating-point value // v = f * 2^e. // // Determine v- and v+, the floating-point predecessor and successor if v, // respectively. // // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) // // v+ = v + 2^e // // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ // between m- and m+ round to v, regardless of how the input rounding // algorithm breaks ties. // // ---+-------------+-------------+-------------+-------------+--- (A) // v- m- v m+ v+ // // -----------------+------+------+-------------+-------------+--- (B) // v- m- v m+ v+ const bool lower_boundary_is_closer = (F == 0 and E > 1); const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); const diyfp m_minus = lower_boundary_is_closer ? diyfp(4 * v.f - 1, v.e - 2) // (B) : diyfp(2 * v.f - 1, v.e - 1); // (A) // Determine the normalized w+ = m+. const diyfp w_plus = diyfp::normalize(m_plus); // Determine w- = m- such that e_(w-) = e_(w+). const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); return {diyfp::normalize(v), w_minus, w_plus}; } // Given normalized diyfp w, Grisu needs to find a (normalized) cached // power-of-ten c, such that the exponent of the product c * w = f * 2^e lies // within a certain range [alpha, gamma] (Definition 3.2 from [1]) // // alpha <= e = e_c + e_w + q <= gamma // // or // // f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q // <= f_c * f_w * 2^gamma // // Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies // // 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma // // or // // 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) // // The choice of (alpha,gamma) determines the size of the table and the form of // the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well // in practice: // // The idea is to cut the number c * w = f * 2^e into two parts, which can be // processed independently: An integral part p1, and a fractional part p2: // // f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e // = (f div 2^-e) + (f mod 2^-e) * 2^e // = p1 + p2 * 2^e // // The conversion of p1 into decimal form requires a series of divisions and // modulos by (a power of) 10. These operations are faster for 32-bit than for // 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be // achieved by choosing // // -e >= 32 or e <= -32 := gamma // // In order to convert the fractional part // // p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... // // into decimal form, the fraction is repeatedly multiplied by 10 and the digits // d[-i] are extracted in order: // // (10 * p2) div 2^-e = d[-1] // (10 * p2) mod 2^-e = d[-2] / 10^1 + ... // // The multiplication by 10 must not overflow. It is sufficient to choose // // 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. // // Since p2 = f mod 2^-e < 2^-e, // // -e <= 60 or e >= -60 := alpha constexpr int kAlpha = -60; constexpr int kGamma = -32; struct cached_power // c = f * 2^e ~= 10^k { uint64_t f; int e; int k; }; /*! For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c satisfies (Definition 3.2 from [1]) alpha <= e_c + e + q <= gamma. */ inline cached_power get_cached_power_for_binary_exponent(int e) { // Now // // alpha <= e_c + e + q <= gamma (1) // ==> f_c * 2^alpha <= c * 2^e * 2^q // // and since the c's are normalized, 2^(q-1) <= f_c, // // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) // ==> 2^(alpha - e - 1) <= c // // If c were an exakt power of ten, i.e. c = 10^k, one may determine k as // // k = ceil( log_10( 2^(alpha - e - 1) ) ) // = ceil( (alpha - e - 1) * log_10(2) ) // // From the paper: // "In theory the result of the procedure could be wrong since c is rounded, // and the computation itself is approximated [...]. In practice, however, // this simple function is sufficient." // // For IEEE double precision floating-point numbers converted into // normalized diyfp's w = f * 2^e, with q = 64, // // e >= -1022 (min IEEE exponent) // -52 (p - 1) // -52 (p - 1, possibly normalize denormal IEEE numbers) // -11 (normalize the diyfp) // = -1137 // // and // // e <= +1023 (max IEEE exponent) // -52 (p - 1) // -11 (normalize the diyfp) // = 960 // // This binary exponent range [-1137,960] results in a decimal exponent // range [-307,324]. One does not need to store a cached power for each // k in this range. For each such k it suffices to find a cached power // such that the exponent of the product lies in [alpha,gamma]. // This implies that the difference of the decimal exponents of adjacent // table entries must be less than or equal to // // floor( (gamma - alpha) * log_10(2) ) = 8. // // (A smaller distance gamma-alpha would require a larger table.) // NB: // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. constexpr int kCachedPowersSize = 79; constexpr int kCachedPowersMinDecExp = -300; constexpr int kCachedPowersDecStep = 8; static constexpr cached_power kCachedPowers[] = { { 0xAB70FE17C79AC6CA, -1060, -300 }, { 0xFF77B1FCBEBCDC4F, -1034, -292 }, { 0xBE5691EF416BD60C, -1007, -284 }, { 0x8DD01FAD907FFC3C, -980, -276 }, { 0xD3515C2831559A83, -954, -268 }, { 0x9D71AC8FADA6C9B5, -927, -260 }, { 0xEA9C227723EE8BCB, -901, -252 }, { 0xAECC49914078536D, -874, -244 }, { 0x823C12795DB6CE57, -847, -236 }, { 0xC21094364DFB5637, -821, -228 }, { 0x9096EA6F3848984F, -794, -220 }, { 0xD77485CB25823AC7, -768, -212 }, { 0xA086CFCD97BF97F4, -741, -204 }, { 0xEF340A98172AACE5, -715, -196 }, { 0xB23867FB2A35B28E, -688, -188 }, { 0x84C8D4DFD2C63F3B, -661, -180 }, { 0xC5DD44271AD3CDBA, -635, -172 }, { 0x936B9FCEBB25C996, -608, -164 }, { 0xDBAC6C247D62A584, -582, -156 }, { 0xA3AB66580D5FDAF6, -555, -148 }, { 0xF3E2F893DEC3F126, -529, -140 }, { 0xB5B5ADA8AAFF80B8, -502, -132 }, { 0x87625F056C7C4A8B, -475, -124 }, { 0xC9BCFF6034C13053, -449, -116 }, { 0x964E858C91BA2655, -422, -108 }, { 0xDFF9772470297EBD, -396, -100 }, { 0xA6DFBD9FB8E5B88F, -369, -92 }, { 0xF8A95FCF88747D94, -343, -84 }, { 0xB94470938FA89BCF, -316, -76 }, { 0x8A08F0F8BF0F156B, -289, -68 }, { 0xCDB02555653131B6, -263, -60 }, { 0x993FE2C6D07B7FAC, -236, -52 }, { 0xE45C10C42A2B3B06, -210, -44 }, { 0xAA242499697392D3, -183, -36 }, { 0xFD87B5F28300CA0E, -157, -28 }, { 0xBCE5086492111AEB, -130, -20 }, { 0x8CBCCC096F5088CC, -103, -12 }, { 0xD1B71758E219652C, -77, -4 }, { 0x9C40000000000000, -50, 4 }, { 0xE8D4A51000000000, -24, 12 }, { 0xAD78EBC5AC620000, 3, 20 }, { 0x813F3978F8940984, 30, 28 }, { 0xC097CE7BC90715B3, 56, 36 }, { 0x8F7E32CE7BEA5C70, 83, 44 }, { 0xD5D238A4ABE98068, 109, 52 }, { 0x9F4F2726179A2245, 136, 60 }, { 0xED63A231D4C4FB27, 162, 68 }, { 0xB0DE65388CC8ADA8, 189, 76 }, { 0x83C7088E1AAB65DB, 216, 84 }, { 0xC45D1DF942711D9A, 242, 92 }, { 0x924D692CA61BE758, 269, 100 }, { 0xDA01EE641A708DEA, 295, 108 }, { 0xA26DA3999AEF774A, 322, 116 }, { 0xF209787BB47D6B85, 348, 124 }, { 0xB454E4A179DD1877, 375, 132 }, { 0x865B86925B9BC5C2, 402, 140 }, { 0xC83553C5C8965D3D, 428, 148 }, { 0x952AB45CFA97A0B3, 455, 156 }, { 0xDE469FBD99A05FE3, 481, 164 }, { 0xA59BC234DB398C25, 508, 172 }, { 0xF6C69A72A3989F5C, 534, 180 }, { 0xB7DCBF5354E9BECE, 561, 188 }, { 0x88FCF317F22241E2, 588, 196 }, { 0xCC20CE9BD35C78A5, 614, 204 }, { 0x98165AF37B2153DF, 641, 212 }, { 0xE2A0B5DC971F303A, 667, 220 }, { 0xA8D9D1535CE3B396, 694, 228 }, { 0xFB9B7CD9A4A7443C, 720, 236 }, { 0xBB764C4CA7A44410, 747, 244 }, { 0x8BAB8EEFB6409C1A, 774, 252 }, { 0xD01FEF10A657842C, 800, 260 }, { 0x9B10A4E5E9913129, 827, 268 }, { 0xE7109BFBA19C0C9D, 853, 276 }, { 0xAC2820D9623BF429, 880, 284 }, { 0x80444B5E7AA7CF85, 907, 292 }, { 0xBF21E44003ACDD2D, 933, 300 }, { 0x8E679C2F5E44FF8F, 960, 308 }, { 0xD433179D9C8CB841, 986, 316 }, { 0x9E19DB92B4E31BA9, 1013, 324 }, }; // This computation gives exactly the same results for k as // k = ceil((kAlpha - e - 1) * 0.30102999566398114) // for |e| <= 1500, but doesn't require floating-point operations. // NB: log_10(2) ~= 78913 / 2^18 assert(e >= -1500); assert(e <= 1500); const int f = kAlpha - e - 1; const int k = (f * 78913) / (1 << 18) + (f > 0); const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; assert(index >= 0); assert(index < kCachedPowersSize); static_cast(kCachedPowersSize); // Fix warning. const cached_power cached = kCachedPowers[index]; assert(kAlpha <= cached.e + e + 64); assert(kGamma >= cached.e + e + 64); return cached; } /*! For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. For n == 0, returns 1 and sets pow10 := 1. */ inline int find_largest_pow10(const uint32_t n, uint32_t& pow10) { // LCOV_EXCL_START if (n >= 1000000000) { pow10 = 1000000000; return 10; } // LCOV_EXCL_STOP else if (n >= 100000000) { pow10 = 100000000; return 9; } else if (n >= 10000000) { pow10 = 10000000; return 8; } else if (n >= 1000000) { pow10 = 1000000; return 7; } else if (n >= 100000) { pow10 = 100000; return 6; } else if (n >= 10000) { pow10 = 10000; return 5; } else if (n >= 1000) { pow10 = 1000; return 4; } else if (n >= 100) { pow10 = 100; return 3; } else if (n >= 10) { pow10 = 10; return 2; } else { pow10 = 1; return 1; } } inline void grisu2_round(char* buf, int len, uint64_t dist, uint64_t delta, uint64_t rest, uint64_t ten_k) { assert(len >= 1); assert(dist <= delta); assert(rest <= delta); assert(ten_k > 0); // <--------------------------- delta ----> // <---- dist ---------> // --------------[------------------+-------------------]-------------- // M- w M+ // // ten_k // <------> // <---- rest ----> // --------------[------------------+----+--------------]-------------- // w V // = buf * 10^k // // ten_k represents a unit-in-the-last-place in the decimal representation // stored in buf. // Decrement buf by ten_k while this takes buf closer to w. // The tests are written in this order to avoid overflow in unsigned // integer arithmetic. while (rest < dist and delta - rest >= ten_k and (rest + ten_k < dist or dist - rest > rest + ten_k - dist)) { assert(buf[len - 1] != '0'); buf[len - 1]--; rest += ten_k; } } /*! Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. M- and M+ must be normalized and share the same exponent -60 <= e <= -32. */ inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, diyfp M_minus, diyfp w, diyfp M_plus) { static_assert(kAlpha >= -60, "internal error"); static_assert(kGamma <= -32, "internal error"); // Generates the digits (and the exponent) of a decimal floating-point // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. // // <--------------------------- delta ----> // <---- dist ---------> // --------------[------------------+-------------------]-------------- // M- w M+ // // Grisu2 generates the digits of M+ from left to right and stops as soon as // V is in [M-,M+]. assert(M_plus.e >= kAlpha); assert(M_plus.e <= kGamma); uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): // // M+ = f * 2^e // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e // = ((p1 ) * 2^-e + (p2 )) * 2^e // = p1 + p2 * 2^e const diyfp one(uint64_t{1} << -M_plus.e, M_plus.e); uint32_t p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e // 1) // // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] assert(p1 > 0); uint32_t pow10; const int k = find_largest_pow10(p1, pow10); // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) // // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) // // M+ = p1 + p2 * 2^e // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e // = d[k-1] * 10^(k-1) + ( rest) * 2^e // // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) // // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] // // but stop as soon as // // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e int n = k; while (n > 0) { // Invariants: // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) // pow10 = 10^(n-1) <= p1 < 10^n // const uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) const uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) // // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) // assert(d <= 9); buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d // // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) // p1 = r; n--; // // M+ = buffer * 10^n + (p1 + p2 * 2^e) // pow10 = 10^n // // Now check if enough digits have been generated. // Compute // // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e // // Note: // Since rest and delta share the same exponent e, it suffices to // compare the significands. const uint64_t rest = (uint64_t{p1} << -one.e) + p2; if (rest <= delta) { // V = buffer * 10^n, with M- <= V <= M+. decimal_exponent += n; // We may now just stop. But instead look if the buffer could be // decremented to bring V closer to w. // // pow10 = 10^n is now 1 ulp in the decimal representation V. // The rounding procedure works with diyfp's with an implicit // exponent of e. // // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e // const uint64_t ten_n = uint64_t{pow10} << -one.e; grisu2_round(buffer, length, dist, delta, rest, ten_n); return; } pow10 /= 10; // // pow10 = 10^(n-1) <= p1 < 10^n // Invariants restored. } // 2) // // The digits of the integral part have been generated: // // M+ = d[k-1]...d[1]d[0] + p2 * 2^e // = buffer + p2 * 2^e // // Now generate the digits of the fractional part p2 * 2^e. // // Note: // No decimal point is generated: the exponent is adjusted instead. // // p2 actually represents the fraction // // p2 * 2^e // = p2 / 2^-e // = d[-1] / 10^1 + d[-2] / 10^2 + ... // // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) // // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) // // using // // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) // = ( d) * 2^-e + ( r) // // or // 10^m * p2 * 2^e = d + r * 2^e // // i.e. // // M+ = buffer + p2 * 2^e // = buffer + 10^-m * (d + r * 2^e) // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e // // and stop as soon as 10^-m * r * 2^e <= delta * 2^e assert(p2 > delta); int m = 0; for (;;) { // Invariant: // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e // = buffer * 10^-m + 10^-m * (p2 ) * 2^e // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e // assert(p2 <= UINT64_MAX / 10); p2 *= 10; const uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e const uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e // // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e // assert(d <= 9); buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d // // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e // p2 = r; m++; // // M+ = buffer * 10^-m + 10^-m * p2 * 2^e // Invariant restored. // Check if enough digits have been generated. // // 10^-m * p2 * 2^e <= delta * 2^e // p2 * 2^e <= 10^m * delta * 2^e // p2 <= 10^m * delta delta *= 10; dist *= 10; if (p2 <= delta) { break; } } // V = buffer * 10^-m, with M- <= V <= M+. decimal_exponent -= m; // 1 ulp in the decimal representation is now 10^-m. // Since delta and dist are now scaled by 10^m, we need to do the // same with ulp in order to keep the units in sync. // // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e // const uint64_t ten_m = one.f; grisu2_round(buffer, length, dist, delta, p2, ten_m); // By construction this algorithm generates the shortest possible decimal // number (Loitsch, Theorem 6.2) which rounds back to w. // For an input number of precision p, at least // // N = 1 + ceil(p * log_10(2)) // // decimal digits are sufficient to identify all binary floating-point // numbers (Matula, "In-and-Out conversions"). // This implies that the algorithm does not produce more than N decimal // digits. // // N = 17 for p = 53 (IEEE double precision) // N = 9 for p = 24 (IEEE single precision) } /*! v = buf * 10^decimal_exponent len is the length of the buffer (number of decimal digits) The buffer must be large enough, i.e. >= max_digits10. */ inline void grisu2(char* buf, int& len, int& decimal_exponent, diyfp m_minus, diyfp v, diyfp m_plus) { assert(m_plus.e == m_minus.e); assert(m_plus.e == v.e); // --------(-----------------------+-----------------------)-------- (A) // m- v m+ // // --------------------(-----------+-----------------------)-------- (B) // m- v m+ // // First scale v (and m- and m+) such that the exponent is in the range // [alpha, gamma]. const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] const diyfp w = diyfp::mul(v, c_minus_k); const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); // ----(---+---)---------------(---+---)---------------(---+---)---- // w- w w+ // = c*m- = c*v = c*m+ // // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and // w+ are now off by a small amount. // In fact: // // w - v * 10^k < 1 ulp // // To account for this inaccuracy, add resp. subtract 1 ulp. // // --------+---[---------------(---+---)---------------]---+-------- // w- M- w M+ w+ // // Now any number in [M-, M+] (bounds included) will round to w when input, // regardless of how the input rounding algorithm breaks ties. // // And digit_gen generates the shortest possible such number in [M-, M+]. // Note that this does not mean that Grisu2 always generates the shortest // possible number in the interval (m-, m+). const diyfp M_minus(w_minus.f + 1, w_minus.e); const diyfp M_plus (w_plus.f - 1, w_plus.e ); decimal_exponent = -cached.k; // = -(-k) = k grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); } /*! v = buf * 10^decimal_exponent len is the length of the buffer (number of decimal digits) The buffer must be large enough, i.e. >= max_digits10. */ template void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) { static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, "internal error: not enough precision"); assert(std::isfinite(value)); assert(value > 0); // If the neighbors (and boundaries) of 'value' are always computed for double-precision // numbers, all float's can be recovered using strtod (and strtof). However, the resulting // decimal representations are not exactly "short". // // The documentation for 'std::to_chars' (http://en.cppreference.com/w/cpp/utility/to_chars) // says "value is converted to a string as if by std::sprintf in the default ("C") locale" // and since sprintf promotes float's to double's, I think this is exactly what 'std::to_chars' // does. // On the other hand, the documentation for 'std::to_chars' requires that "parsing the // representation using the corresponding std::from_chars function recovers value exactly". That // indicates that single precision floating-point numbers should be recovered using // 'std::strtof'. // // NB: If the neighbors are computed for single-precision numbers, there is a single float // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision // value is off by 1 ulp. #if 0 const boundaries w = compute_boundaries(static_cast(value)); #else const boundaries w = compute_boundaries(value); #endif grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); } /*! @brief appends a decimal representation of e to buf @return a pointer to the element following the exponent. @pre -1000 < e < 1000 */ inline char* append_exponent(char* buf, int e) { assert(e > -1000); assert(e < 1000); if (e < 0) { e = -e; *buf++ = '-'; } else { *buf++ = '+'; } uint32_t k = static_cast(e); if (k < 10) { // Always print at least two digits in the exponent. // This is for compatibility with printf("%g"). *buf++ = '0'; *buf++ = static_cast('0' + k); } else if (k < 100) { *buf++ = static_cast('0' + k / 10); k %= 10; *buf++ = static_cast('0' + k); } else { *buf++ = static_cast('0' + k / 100); k %= 100; *buf++ = static_cast('0' + k / 10); k %= 10; *buf++ = static_cast('0' + k); } return buf; } /*! @brief prettify v = buf * 10^decimal_exponent If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point notation. Otherwise it will be printed in exponential notation. @pre min_exp < 0 @pre max_exp > 0 */ inline char* format_buffer(char* buf, int len, int decimal_exponent, int min_exp, int max_exp) { assert(min_exp < 0); assert(max_exp > 0); const int k = len; const int n = len + decimal_exponent; // v = buf * 10^(n-k) // k is the length of the buffer (number of decimal digits) // n is the position of the decimal point relative to the start of the buffer. if (k <= n and n <= max_exp) { // digits[000] // len <= max_exp + 2 std::memset(buf + k, '0', static_cast(n - k)); // Make it look like a floating-point number (#362, #378) buf[n + 0] = '.'; buf[n + 1] = '0'; return buf + (n + 2); } if (0 < n and n <= max_exp) { // dig.its // len <= max_digits10 + 1 assert(k > n); std::memmove(buf + (n + 1), buf + n, static_cast(k - n)); buf[n] = '.'; return buf + (k + 1); } if (min_exp < n and n <= 0) { // 0.[000]digits // len <= 2 + (-min_exp - 1) + max_digits10 std::memmove(buf + (2 + -n), buf, static_cast(k)); buf[0] = '0'; buf[1] = '.'; std::memset(buf + 2, '0', static_cast(-n)); return buf + (2 + (-n) + k); } if (k == 1) { // dE+123 // len <= 1 + 5 buf += 1; } else { // d.igitsE+123 // len <= max_digits10 + 1 + 5 std::memmove(buf + 2, buf + 1, static_cast(k - 1)); buf[1] = '.'; buf += 1 + k; } *buf++ = 'e'; return append_exponent(buf, n - 1); } } // namespace dtoa_impl /*! @brief generates a decimal representation of the floating-point number value in [first, last). The format of the resulting decimal representation is similar to printf's %g format. Returns an iterator pointing past-the-end of the decimal representation. @note The input number must be finite, i.e. NaN's and Inf's are not supported. @note The buffer must be large enough. @note The result is NOT null-terminated. */ template char* to_chars(char* first, char* last, FloatType value) { static_cast(last); // maybe unused - fix warning assert(std::isfinite(value)); // Use signbit(value) instead of (value < 0) since signbit works for -0. if (std::signbit(value)) { value = -value; *first++ = '-'; } if (value == 0) // +-0 { *first++ = '0'; // Make it look like a floating-point number (#362, #378) *first++ = '.'; *first++ = '0'; return first; } assert(last - first >= std::numeric_limits::max_digits10); // Compute v = buffer * 10^decimal_exponent. // The decimal digits are stored in the buffer, which needs to be interpreted // as an unsigned decimal integer. // len is the length of the buffer, i.e. the number of decimal digits. int len = 0; int decimal_exponent = 0; dtoa_impl::grisu2(first, len, decimal_exponent, value); assert(len <= std::numeric_limits::max_digits10); // Format the buffer like printf("%.*g", prec, value) constexpr int kMinExp = -4; // Use digits10 here to increase compatibility with version 2. constexpr int kMaxExp = std::numeric_limits::digits10; assert(last - first >= kMaxExp + 2); assert(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); assert(last - first >= std::numeric_limits::max_digits10 + 6); return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); } } // namespace detail } // namespace nlohmann // #include // #include // #include // #include namespace nlohmann { namespace detail { /////////////////// // serialization // /////////////////// template class serializer { using string_t = typename BasicJsonType::string_t; using number_float_t = typename BasicJsonType::number_float_t; using number_integer_t = typename BasicJsonType::number_integer_t; using number_unsigned_t = typename BasicJsonType::number_unsigned_t; static constexpr uint8_t UTF8_ACCEPT = 0; static constexpr uint8_t UTF8_REJECT = 1; public: /*! @param[in] s output stream to serialize to @param[in] ichar indentation character to use */ serializer(output_adapter_t s, const char ichar) : o(std::move(s)), loc(std::localeconv()), thousands_sep(loc->thousands_sep == nullptr ? '\0' : * (loc->thousands_sep)), decimal_point(loc->decimal_point == nullptr ? '\0' : * (loc->decimal_point)), indent_char(ichar), indent_string(512, indent_char) {} // delete because of pointer members serializer(const serializer&) = delete; serializer& operator=(const serializer&) = delete; /*! @brief internal implementation of the serialization function This function is called by the public member function dump and organizes the serialization internally. The indentation level is propagated as additional parameter. In case of arrays and objects, the function is called recursively. - strings and object keys are escaped using `escape_string()` - integer numbers are converted implicitly via `operator<<` - floating-point numbers are converted to a string using `"%g"` format @param[in] val value to serialize @param[in] pretty_print whether the output shall be pretty-printed @param[in] indent_step the indent level @param[in] current_indent the current indent level (only used internally) */ void dump(const BasicJsonType& val, const bool pretty_print, const bool ensure_ascii, const unsigned int indent_step, const unsigned int current_indent = 0) { switch (val.m_type) { case value_t::object: { if (val.m_value.object->empty()) { o->write_characters("{}", 2); return; } if (pretty_print) { o->write_characters("{\n", 2); // variable to hold indentation for recursive calls const auto new_indent = current_indent + indent_step; if (JSON_UNLIKELY(indent_string.size() < new_indent)) { indent_string.resize(indent_string.size() * 2, ' '); } // first n-1 elements auto i = val.m_value.object->cbegin(); for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) { o->write_characters(indent_string.c_str(), new_indent); o->write_character('\"'); dump_escaped(i->first, ensure_ascii); o->write_characters("\": ", 3); dump(i->second, true, ensure_ascii, indent_step, new_indent); o->write_characters(",\n", 2); } // last element assert(i != val.m_value.object->cend()); assert(std::next(i) == val.m_value.object->cend()); o->write_characters(indent_string.c_str(), new_indent); o->write_character('\"'); dump_escaped(i->first, ensure_ascii); o->write_characters("\": ", 3); dump(i->second, true, ensure_ascii, indent_step, new_indent); o->write_character('\n'); o->write_characters(indent_string.c_str(), current_indent); o->write_character('}'); } else { o->write_character('{'); // first n-1 elements auto i = val.m_value.object->cbegin(); for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) { o->write_character('\"'); dump_escaped(i->first, ensure_ascii); o->write_characters("\":", 2); dump(i->second, false, ensure_ascii, indent_step, current_indent); o->write_character(','); } // last element assert(i != val.m_value.object->cend()); assert(std::next(i) == val.m_value.object->cend()); o->write_character('\"'); dump_escaped(i->first, ensure_ascii); o->write_characters("\":", 2); dump(i->second, false, ensure_ascii, indent_step, current_indent); o->write_character('}'); } return; } case value_t::array: { if (val.m_value.array->empty()) { o->write_characters("[]", 2); return; } if (pretty_print) { // QISKIT EDIT this makes pretty print leave arrays on a single line bool QISKIT_FORMAT = true; if (QISKIT_FORMAT) { o->write_character('['); // first n-1 elements for (auto i = val.m_value.array->cbegin(); i != val.m_value.array->cend() - 1; ++i) { dump(*i, true, ensure_ascii, indent_step, current_indent); o->write_characters(", ", 2); } // last element assert(not val.m_value.array->empty()); dump(val.m_value.array->back(), true, ensure_ascii, indent_step, current_indent); o->write_character(']'); } else // ORIGINAL { o->write_characters("[\n", 2); // variable to hold indentation for recursive calls const auto new_indent = current_indent + indent_step; if (JSON_UNLIKELY(indent_string.size() < new_indent)) { indent_string.resize(indent_string.size() * 2, ' '); } // first n-1 elements for (auto i = val.m_value.array->cbegin(); i != val.m_value.array->cend() - 1; ++i) { o->write_characters(indent_string.c_str(), new_indent); dump(*i, true, ensure_ascii, indent_step, new_indent); o->write_characters(",\n", 2); } // last element assert(not val.m_value.array->empty()); o->write_characters(indent_string.c_str(), new_indent); dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); o->write_character('\n'); o->write_characters(indent_string.c_str(), current_indent); o->write_character(']'); } } else { o->write_character('['); // first n-1 elements for (auto i = val.m_value.array->cbegin(); i != val.m_value.array->cend() - 1; ++i) { dump(*i, false, ensure_ascii, indent_step, current_indent); o->write_character(','); } // last element assert(not val.m_value.array->empty()); dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); o->write_character(']'); } return; } case value_t::string: { o->write_character('\"'); dump_escaped(*val.m_value.string, ensure_ascii); o->write_character('\"'); return; } case value_t::boolean: { if (val.m_value.boolean) { o->write_characters("true", 4); } else { o->write_characters("false", 5); } return; } case value_t::number_integer: { dump_integer(val.m_value.number_integer); return; } case value_t::number_unsigned: { dump_integer(val.m_value.number_unsigned); return; } case value_t::number_float: { dump_float(val.m_value.number_float); return; } case value_t::discarded: { o->write_characters("", 11); return; } case value_t::null: { o->write_characters("null", 4); return; } } } private: /*! @brief dump escaped string Escape a string by replacing certain special characters by a sequence of an escape character (backslash) and another character and other control characters by a sequence of "\u" followed by a four-digit hex representation. The escaped string is written to output stream @a o. @param[in] s the string to escape @param[in] ensure_ascii whether to escape non-ASCII characters with \uXXXX sequences @complexity Linear in the length of string @a s. */ void dump_escaped(const string_t& s, const bool ensure_ascii) { uint32_t codepoint; uint8_t state = UTF8_ACCEPT; std::size_t bytes = 0; // number of bytes written to string_buffer for (std::size_t i = 0; i < s.size(); ++i) { const auto byte = static_cast(s[i]); switch (decode(state, codepoint, byte)) { case UTF8_ACCEPT: // decode found a new code point { switch (codepoint) { case 0x08: // backspace { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = 'b'; break; } case 0x09: // horizontal tab { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = 't'; break; } case 0x0A: // newline { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = 'n'; break; } case 0x0C: // formfeed { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = 'f'; break; } case 0x0D: // carriage return { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = 'r'; break; } case 0x22: // quotation mark { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = '\"'; break; } case 0x5C: // reverse solidus { string_buffer[bytes++] = '\\'; string_buffer[bytes++] = '\\'; break; } default: { // escape control characters (0x00..0x1F) or, if // ensure_ascii parameter is used, non-ASCII characters if ((codepoint <= 0x1F) or (ensure_ascii and (codepoint >= 0x7F))) { if (codepoint <= 0xFFFF) { std::snprintf(string_buffer.data() + bytes, 7, "\\u%04x", static_cast(codepoint)); bytes += 6; } else { std::snprintf(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", static_cast(0xD7C0 + (codepoint >> 10)), static_cast(0xDC00 + (codepoint & 0x3FF))); bytes += 12; } } else { // copy byte to buffer (all previous bytes // been copied have in default case above) string_buffer[bytes++] = s[i]; } break; } } // write buffer and reset index; there must be 13 bytes // left, as this is the maximal number of bytes to be // written ("\uxxxx\uxxxx\0") for one code point if (string_buffer.size() - bytes < 13) { o->write_characters(string_buffer.data(), bytes); bytes = 0; } break; } case UTF8_REJECT: // decode found invalid UTF-8 byte { std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << static_cast(byte); JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + ss.str())); } default: // decode found yet incomplete multi-byte code point { if (not ensure_ascii) { // code point will not be escaped - copy byte to buffer string_buffer[bytes++] = s[i]; } break; } } } if (JSON_LIKELY(state == UTF8_ACCEPT)) { // write buffer if (bytes > 0) { o->write_characters(string_buffer.data(), bytes); } } else { // we finish reading, but do not accept: string was incomplete std::stringstream ss; ss << std::setw(2) << std::uppercase << std::setfill('0') << std::hex << static_cast(static_cast(s.back())); JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + ss.str())); } } /*! @brief dump an integer Dump a given integer to output stream @a o. Works internally with @a number_buffer. @param[in] x integer number (signed or unsigned) to dump @tparam NumberType either @a number_integer_t or @a number_unsigned_t */ template::value or std::is_same::value, int> = 0> void dump_integer(NumberType x) { // special case for "0" if (x == 0) { o->write_character('0'); return; } const bool is_negative = (x <= 0) and (x != 0); // see issue #755 std::size_t i = 0; while (x != 0) { // spare 1 byte for '\0' assert(i < number_buffer.size() - 1); const auto digit = std::labs(static_cast(x % 10)); number_buffer[i++] = static_cast('0' + digit); x /= 10; } if (is_negative) { // make sure there is capacity for the '-' assert(i < number_buffer.size() - 2); number_buffer[i++] = '-'; } std::reverse(number_buffer.begin(), number_buffer.begin() + i); o->write_characters(number_buffer.data(), i); } /*! @brief dump a floating-point number Dump a given floating-point number to output stream @a o. Works internally with @a number_buffer. @param[in] x floating-point number to dump */ void dump_float(number_float_t x) { // NaN / inf if (not std::isfinite(x)) { o->write_characters("null", 4); return; } // If number_float_t is an IEEE-754 single or double precision number, // use the Grisu2 algorithm to produce short numbers which are // guaranteed to round-trip, using strtof and strtod, resp. // // NB: The test below works if == . static constexpr bool is_ieee_single_or_double = (std::numeric_limits::is_iec559 and std::numeric_limits::digits == 24 and std::numeric_limits::max_exponent == 128) or (std::numeric_limits::is_iec559 and std::numeric_limits::digits == 53 and std::numeric_limits::max_exponent == 1024); dump_float(x, std::integral_constant()); } void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) { char* begin = number_buffer.data(); char* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); o->write_characters(begin, static_cast(end - begin)); } void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) { // get number of digits for a float -> text -> float round-trip static constexpr auto d = std::numeric_limits::max_digits10; // the actual conversion std::ptrdiff_t len = snprintf(number_buffer.data(), number_buffer.size(), "%.*g", d, x); // negative value indicates an error assert(len > 0); // check if buffer was large enough assert(static_cast(len) < number_buffer.size()); // erase thousands separator if (thousands_sep != '\0') { const auto end = std::remove(number_buffer.begin(), number_buffer.begin() + len, thousands_sep); std::fill(end, number_buffer.end(), '\0'); assert((end - number_buffer.begin()) <= len); len = (end - number_buffer.begin()); } // convert decimal point to '.' if (decimal_point != '\0' and decimal_point != '.') { const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); if (dec_pos != number_buffer.end()) { *dec_pos = '.'; } } o->write_characters(number_buffer.data(), static_cast(len)); // determine if need to append ".0" const bool value_is_int_like = std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, [](char c) { return (c == '.' or c == 'e'); }); if (value_is_int_like) { o->write_characters(".0", 2); } } /*! @brief check whether a string is UTF-8 encoded The function checks each byte of a string whether it is UTF-8 encoded. The result of the check is stored in the @a state parameter. The function must be called initially with state 0 (accept). State 1 means the string must be rejected, because the current byte is not allowed. If the string is completely processed, but the state is non-zero, the string ended prematurely; that is, the last byte indicated more bytes should have followed. @param[in,out] state the state of the decoding @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) @param[in] byte next byte to decode @return new state @note The function has been edited: a std::array is used. @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ */ static uint8_t decode(uint8_t& state, uint32_t& codep, const uint8_t byte) noexcept { static const std::array utf8d = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 } }; const uint8_t type = utf8d[byte]; codep = (state != UTF8_ACCEPT) ? (byte & 0x3fu) | (codep << 6) : static_cast(0xff >> type) & (byte); state = utf8d[256u + state * 16u + type]; return state; } private: /// the output of the serializer output_adapter_t o = nullptr; /// a (hopefully) large enough character buffer std::array number_buffer{{}}; /// the locale const std::lconv* loc = nullptr; /// the locale's thousand separator character const char thousands_sep = '\0'; /// the locale's decimal point character const char decimal_point = '\0'; /// string buffer std::array string_buffer{{}}; /// the indentation character const char indent_char; /// the indentation string string_t indent_string; }; } } // #include #include #include namespace nlohmann { namespace detail { template class json_ref { public: using value_type = BasicJsonType; json_ref(value_type&& value) : owned_value(std::move(value)), value_ref(&owned_value), is_rvalue(true) {} json_ref(const value_type& value) : value_ref(const_cast(&value)), is_rvalue(false) {} json_ref(std::initializer_list init) : owned_value(init), value_ref(&owned_value), is_rvalue(true) {} template json_ref(Args&& ... args) : owned_value(std::forward(args)...), value_ref(&owned_value), is_rvalue(true) {} // class should be movable only json_ref(json_ref&&) = default; json_ref(const json_ref&) = delete; json_ref& operator=(const json_ref&) = delete; value_type moved_or_copied() const { if (is_rvalue) { return std::move(*value_ref); } return *value_ref; } value_type const& operator*() const { return *static_cast(value_ref); } value_type const* operator->() const { return static_cast(value_ref); } private: mutable value_type owned_value = nullptr; value_type* value_ref = nullptr; const bool is_rvalue; }; } } // #include #include // assert #include // accumulate #include // string #include // vector // #include // #include // #include namespace nlohmann { template class json_pointer { // allow basic_json to access private members NLOHMANN_BASIC_JSON_TPL_DECLARATION friend class basic_json; public: /*! @brief create JSON pointer Create a JSON pointer according to the syntax described in [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). @param[in] s string representing the JSON pointer; if omitted, the empty string is assumed which references the whole JSON value @throw parse_error.107 if the given JSON pointer @a s is nonempty and does not begin with a slash (`/`); see example below @throw parse_error.108 if a tilde (`~`) in the given JSON pointer @a s is not followed by `0` (representing `~`) or `1` (representing `/`); see example below @liveexample{The example shows the construction several valid JSON pointers as well as the exceptional behavior.,json_pointer} @since version 2.0.0 */ explicit json_pointer(const std::string& s = "") : reference_tokens(split(s)) {} /*! @brief return a string representation of the JSON pointer @invariant For each JSON pointer `ptr`, it holds: @code {.cpp} ptr == json_pointer(ptr.to_string()); @endcode @return a string representation of the JSON pointer @liveexample{The example shows the result of `to_string`., json_pointer__to_string} @since version 2.0.0 */ std::string to_string() const noexcept { return std::accumulate(reference_tokens.begin(), reference_tokens.end(), std::string{}, [](const std::string & a, const std::string & b) { return a + "/" + escape(b); }); } /// @copydoc to_string() operator std::string() const { return to_string(); } /*! @param[in] s reference token to be converted into an array index @return integer representation of @a s @throw out_of_range.404 if string @a s could not be converted to an integer */ static int array_index(const std::string& s) { std::size_t processed_chars = 0; const int res = std::stoi(s, &processed_chars); // check if the string was completely read if (JSON_UNLIKELY(processed_chars != s.size())) { JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'")); } return res; } private: /*! @brief remove and return last reference pointer @throw out_of_range.405 if JSON pointer has no parent */ std::string pop_back() { if (JSON_UNLIKELY(is_root())) { JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent")); } auto last = reference_tokens.back(); reference_tokens.pop_back(); return last; } /// return whether pointer points to the root document bool is_root() const { return reference_tokens.empty(); } json_pointer top() const { if (JSON_UNLIKELY(is_root())) { JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent")); } json_pointer result = *this; result.reference_tokens = {reference_tokens[0]}; return result; } /*! @brief create and return a reference to the pointed to value @complexity Linear in the number of reference tokens. @throw parse_error.109 if array index is not a number @throw type_error.313 if value cannot be unflattened */ BasicJsonType& get_and_create(BasicJsonType& j) const { using size_type = typename BasicJsonType::size_type; auto result = &j; // in case no reference tokens exist, return a reference to the JSON value // j which will be overwritten by a primitive value for (const auto& reference_token : reference_tokens) { switch (result->m_type) { case detail::value_t::null: { if (reference_token == "0") { // start a new array if reference token is 0 result = &result->operator[](0); } else { // start a new object otherwise result = &result->operator[](reference_token); } break; } case detail::value_t::object: { // create an entry in the object result = &result->operator[](reference_token); break; } case detail::value_t::array: { // create an entry in the array JSON_TRY { result = &result->operator[](static_cast(array_index(reference_token))); } JSON_CATCH(std::invalid_argument&) { JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number")); } break; } /* The following code is only reached if there exists a reference token _and_ the current value is primitive. In this case, we have an error situation, because primitive values may only occur as single value; that is, with an empty list of reference tokens. */ default: JSON_THROW(detail::type_error::create(313, "invalid value to unflatten")); } } return *result; } /*! @brief return a reference to the pointed to value @note This version does not throw if a value is not present, but tries to create nested values instead. For instance, calling this function with pointer `"/this/that"` on a null value is equivalent to calling `operator[]("this").operator[]("that")` on that value, effectively changing the null value to an object. @param[in] ptr a JSON value @return reference to the JSON value pointed to by the JSON pointer @complexity Linear in the length of the JSON pointer. @throw parse_error.106 if an array index begins with '0' @throw parse_error.109 if an array index was not a number @throw out_of_range.404 if the JSON pointer can not be resolved */ BasicJsonType& get_unchecked(BasicJsonType* ptr) const { using size_type = typename BasicJsonType::size_type; for (const auto& reference_token : reference_tokens) { // convert null values to arrays or objects before continuing if (ptr->m_type == detail::value_t::null) { // check if reference token is a number const bool nums = std::all_of(reference_token.begin(), reference_token.end(), [](const char x) { return (x >= '0' and x <= '9'); }); // change value to array for numbers or "-" or to object otherwise *ptr = (nums or reference_token == "-") ? detail::value_t::array : detail::value_t::object; } switch (ptr->m_type) { case detail::value_t::object: { // use unchecked object access ptr = &ptr->operator[](reference_token); break; } case detail::value_t::array: { // error condition (cf. RFC 6901, Sect. 4) if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0')) { JSON_THROW(detail::parse_error::create(106, 0, "array index '" + reference_token + "' must not begin with '0'")); } if (reference_token == "-") { // explicitly treat "-" as index beyond the end ptr = &ptr->operator[](ptr->m_value.array->size()); } else { // convert array index to number; unchecked access JSON_TRY { ptr = &ptr->operator[]( static_cast(array_index(reference_token))); } JSON_CATCH(std::invalid_argument&) { JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number")); } } break; } default: JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); } } return *ptr; } /*! @throw parse_error.106 if an array index begins with '0' @throw parse_error.109 if an array index was not a number @throw out_of_range.402 if the array index '-' is used @throw out_of_range.404 if the JSON pointer can not be resolved */ BasicJsonType& get_checked(BasicJsonType* ptr) const { using size_type = typename BasicJsonType::size_type; for (const auto& reference_token : reference_tokens) { switch (ptr->m_type) { case detail::value_t::object: { // note: at performs range check ptr = &ptr->at(reference_token); break; } case detail::value_t::array: { if (JSON_UNLIKELY(reference_token == "-")) { // "-" always fails the range check JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range")); } // error condition (cf. RFC 6901, Sect. 4) if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0')) { JSON_THROW(detail::parse_error::create(106, 0, "array index '" + reference_token + "' must not begin with '0'")); } // note: at performs range check JSON_TRY { ptr = &ptr->at(static_cast(array_index(reference_token))); } JSON_CATCH(std::invalid_argument&) { JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number")); } break; } default: JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); } } return *ptr; } /*! @brief return a const reference to the pointed to value @param[in] ptr a JSON value @return const reference to the JSON value pointed to by the JSON pointer @throw parse_error.106 if an array index begins with '0' @throw parse_error.109 if an array index was not a number @throw out_of_range.402 if the array index '-' is used @throw out_of_range.404 if the JSON pointer can not be resolved */ const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const { using size_type = typename BasicJsonType::size_type; for (const auto& reference_token : reference_tokens) { switch (ptr->m_type) { case detail::value_t::object: { // use unchecked object access ptr = &ptr->operator[](reference_token); break; } case detail::value_t::array: { if (JSON_UNLIKELY(reference_token == "-")) { // "-" cannot be used for const access JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range")); } // error condition (cf. RFC 6901, Sect. 4) if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0')) { JSON_THROW(detail::parse_error::create(106, 0, "array index '" + reference_token + "' must not begin with '0'")); } // use unchecked array access JSON_TRY { ptr = &ptr->operator[]( static_cast(array_index(reference_token))); } JSON_CATCH(std::invalid_argument&) { JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number")); } break; } default: JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); } } return *ptr; } /*! @throw parse_error.106 if an array index begins with '0' @throw parse_error.109 if an array index was not a number @throw out_of_range.402 if the array index '-' is used @throw out_of_range.404 if the JSON pointer can not be resolved */ const BasicJsonType& get_checked(const BasicJsonType* ptr) const { using size_type = typename BasicJsonType::size_type; for (const auto& reference_token : reference_tokens) { switch (ptr->m_type) { case detail::value_t::object: { // note: at performs range check ptr = &ptr->at(reference_token); break; } case detail::value_t::array: { if (JSON_UNLIKELY(reference_token == "-")) { // "-" always fails the range check JSON_THROW(detail::out_of_range::create(402, "array index '-' (" + std::to_string(ptr->m_value.array->size()) + ") is out of range")); } // error condition (cf. RFC 6901, Sect. 4) if (JSON_UNLIKELY(reference_token.size() > 1 and reference_token[0] == '0')) { JSON_THROW(detail::parse_error::create(106, 0, "array index '" + reference_token + "' must not begin with '0'")); } // note: at performs range check JSON_TRY { ptr = &ptr->at(static_cast(array_index(reference_token))); } JSON_CATCH(std::invalid_argument&) { JSON_THROW(detail::parse_error::create(109, 0, "array index '" + reference_token + "' is not a number")); } break; } default: JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); } } return *ptr; } /*! @brief split the string input to reference tokens @note This function is only called by the json_pointer constructor. All exceptions below are documented there. @throw parse_error.107 if the pointer is not empty or begins with '/' @throw parse_error.108 if character '~' is not followed by '0' or '1' */ static std::vector split(const std::string& reference_string) { std::vector result; // special case: empty reference string -> no reference tokens if (reference_string.empty()) { return result; } // check if nonempty reference string begins with slash if (JSON_UNLIKELY(reference_string[0] != '/')) { JSON_THROW(detail::parse_error::create(107, 1, "JSON pointer must be empty or begin with '/' - was: '" + reference_string + "'")); } // extract the reference tokens: // - slash: position of the last read slash (or end of string) // - start: position after the previous slash for ( // search for the first slash after the first character std::size_t slash = reference_string.find_first_of('/', 1), // set the beginning of the first reference token start = 1; // we can stop if start == string::npos+1 = 0 start != 0; // set the beginning of the next reference token // (will eventually be 0 if slash == std::string::npos) start = slash + 1, // find next slash slash = reference_string.find_first_of('/', start)) { // use the text between the beginning of the reference token // (start) and the last slash (slash). auto reference_token = reference_string.substr(start, slash - start); // check reference tokens are properly escaped for (std::size_t pos = reference_token.find_first_of('~'); pos != std::string::npos; pos = reference_token.find_first_of('~', pos + 1)) { assert(reference_token[pos] == '~'); // ~ must be followed by 0 or 1 if (JSON_UNLIKELY(pos == reference_token.size() - 1 or (reference_token[pos + 1] != '0' and reference_token[pos + 1] != '1'))) { JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'")); } } // finally, store the reference token unescape(reference_token); result.push_back(reference_token); } return result; } /*! @brief replace all occurrences of a substring by another string @param[in,out] s the string to manipulate; changed so that all occurrences of @a f are replaced with @a t @param[in] f the substring to replace with @a t @param[in] t the string to replace @a f @pre The search string @a f must not be empty. **This precondition is enforced with an assertion.** @since version 2.0.0 */ static void replace_substring(std::string& s, const std::string& f, const std::string& t) { assert(not f.empty()); for (auto pos = s.find(f); // find first occurrence of f pos != std::string::npos; // make sure f was found s.replace(pos, f.size(), t), // replace with t, and pos = s.find(f, pos + t.size())) // find next occurrence of f {} } /// escape "~"" to "~0" and "/" to "~1" static std::string escape(std::string s) { replace_substring(s, "~", "~0"); replace_substring(s, "/", "~1"); return s; } /// unescape "~1" to tilde and "~0" to slash (order is important!) static void unescape(std::string& s) { replace_substring(s, "~1", "/"); replace_substring(s, "~0", "~"); } /*! @param[in] reference_string the reference string to the current value @param[in] value the value to consider @param[in,out] result the result object to insert values to @note Empty objects or arrays are flattened to `null`. */ static void flatten(const std::string& reference_string, const BasicJsonType& value, BasicJsonType& result) { switch (value.m_type) { case detail::value_t::array: { if (value.m_value.array->empty()) { // flatten empty array as null result[reference_string] = nullptr; } else { // iterate array and use index as reference string for (std::size_t i = 0; i < value.m_value.array->size(); ++i) { flatten(reference_string + "/" + std::to_string(i), value.m_value.array->operator[](i), result); } } break; } case detail::value_t::object: { if (value.m_value.object->empty()) { // flatten empty object as null result[reference_string] = nullptr; } else { // iterate object and use keys as reference string for (const auto& element : *value.m_value.object) { flatten(reference_string + "/" + escape(element.first), element.second, result); } } break; } default: { // add primitive value with its reference string result[reference_string] = value; break; } } } /*! @param[in] value flattened JSON @return unflattened JSON @throw parse_error.109 if array index is not a number @throw type_error.314 if value is not an object @throw type_error.315 if object values are not primitive @throw type_error.313 if value cannot be unflattened */ static BasicJsonType unflatten(const BasicJsonType& value) { if (JSON_UNLIKELY(not value.is_object())) { JSON_THROW(detail::type_error::create(314, "only objects can be unflattened")); } BasicJsonType result; // iterate the JSON object values for (const auto& element : *value.m_value.object) { if (JSON_UNLIKELY(not element.second.is_primitive())) { JSON_THROW(detail::type_error::create(315, "values in object must be primitive")); } // assign value to reference pointed to by JSON pointer; Note that if // the JSON pointer is "" (i.e., points to the whole value), function // get_and_create returns a reference to result itself. An assignment // will then create a primitive value. json_pointer(element.first).get_and_create(result) = element.second; } return result; } friend bool operator==(json_pointer const& lhs, json_pointer const& rhs) noexcept { return (lhs.reference_tokens == rhs.reference_tokens); } friend bool operator!=(json_pointer const& lhs, json_pointer const& rhs) noexcept { return not (lhs == rhs); } /// the reference tokens std::vector reference_tokens; }; } // #include #include // #include // #include namespace nlohmann { template struct adl_serializer { /*! @brief convert a JSON value to any value type This function is usually called by the `get()` function of the @ref basic_json class (either explicit or via conversion operators). @param[in] j JSON value to read from @param[in,out] val value to write to */ template static void from_json(BasicJsonType&& j, ValueType& val) noexcept( noexcept(::nlohmann::from_json(std::forward(j), val))) { ::nlohmann::from_json(std::forward(j), val); } /*! @brief convert any value type to a JSON value This function is usually called by the constructors of the @ref basic_json class. @param[in,out] j JSON value to write to @param[in] val value to read from */ template static void to_json(BasicJsonType& j, ValueType&& val) noexcept( noexcept(::nlohmann::to_json(j, std::forward(val)))) { ::nlohmann::to_json(j, std::forward(val)); } }; } /*! @brief namespace for Niels Lohmann @see https://github.com/nlohmann @since version 1.0.0 */ namespace nlohmann { /*! @brief a class to store JSON values @tparam ObjectType type for JSON objects (`std::map` by default; will be used in @ref object_t) @tparam ArrayType type for JSON arrays (`std::vector` by default; will be used in @ref array_t) @tparam StringType type for JSON strings and object keys (`std::string` by default; will be used in @ref string_t) @tparam BooleanType type for JSON booleans (`bool` by default; will be used in @ref boolean_t) @tparam NumberIntegerType type for JSON integer numbers (`int64_t` by default; will be used in @ref number_integer_t) @tparam NumberUnsignedType type for JSON unsigned integer numbers (@c `uint64_t` by default; will be used in @ref number_unsigned_t) @tparam NumberFloatType type for JSON floating-point numbers (`double` by default; will be used in @ref number_float_t) @tparam AllocatorType type of the allocator to use (`std::allocator` by default) @tparam JSONSerializer the serializer to resolve internal calls to `to_json()` and `from_json()` (@ref adl_serializer by default) @requirement The class satisfies the following concept requirements: - Basic - [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible): JSON values can be default constructed. The result will be a JSON null value. - [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible): A JSON value can be constructed from an rvalue argument. - [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible): A JSON value can be copy-constructed from an lvalue expression. - [MoveAssignable](http://en.cppreference.com/w/cpp/concept/MoveAssignable): A JSON value van be assigned from an rvalue argument. - [CopyAssignable](http://en.cppreference.com/w/cpp/concept/CopyAssignable): A JSON value can be copy-assigned from an lvalue expression. - [Destructible](http://en.cppreference.com/w/cpp/concept/Destructible): JSON values can be destructed. - Layout - [StandardLayoutType](http://en.cppreference.com/w/cpp/concept/StandardLayoutType): JSON values have [standard layout](http://en.cppreference.com/w/cpp/language/data_members#Standard_layout): All non-static data members are private and standard layout types, the class has no virtual functions or (virtual) base classes. - Library-wide - [EqualityComparable](http://en.cppreference.com/w/cpp/concept/EqualityComparable): JSON values can be compared with `==`, see @ref operator==(const_reference,const_reference). - [LessThanComparable](http://en.cppreference.com/w/cpp/concept/LessThanComparable): JSON values can be compared with `<`, see @ref operator<(const_reference,const_reference). - [Swappable](http://en.cppreference.com/w/cpp/concept/Swappable): Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of other compatible types, using unqualified function call @ref swap(). - [NullablePointer](http://en.cppreference.com/w/cpp/concept/NullablePointer): JSON values can be compared against `std::nullptr_t` objects which are used to model the `null` value. - Container - [Container](http://en.cppreference.com/w/cpp/concept/Container): JSON values can be used like STL containers and provide iterator access. - [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer); JSON values can be used like STL containers and provide reverse iterator access. @invariant The member variables @a m_value and @a m_type have the following relationship: - If `m_type == value_t::object`, then `m_value.object != nullptr`. - If `m_type == value_t::array`, then `m_value.array != nullptr`. - If `m_type == value_t::string`, then `m_value.string != nullptr`. The invariants are checked by member function assert_invariant(). @internal @note ObjectType trick from http://stackoverflow.com/a/9860911 @endinternal @see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange Format](http://rfc7159.net/rfc7159) @since version 1.0.0 @nosubgrouping */ NLOHMANN_BASIC_JSON_TPL_DECLARATION class basic_json { private: template friend struct detail::external_constructor; friend ::nlohmann::json_pointer; friend ::nlohmann::detail::parser; friend ::nlohmann::detail::serializer; template friend class ::nlohmann::detail::iter_impl; template friend class ::nlohmann::detail::binary_writer; template friend class ::nlohmann::detail::binary_reader; /// workaround type for MSVC using basic_json_t = NLOHMANN_BASIC_JSON_TPL; // convenience aliases for types residing in namespace detail; using lexer = ::nlohmann::detail::lexer; using parser = ::nlohmann::detail::parser; using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; template using internal_iterator = ::nlohmann::detail::internal_iterator; template using iter_impl = ::nlohmann::detail::iter_impl; template using iteration_proxy = ::nlohmann::detail::iteration_proxy; template using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator; template using output_adapter_t = ::nlohmann::detail::output_adapter_t; using binary_reader = ::nlohmann::detail::binary_reader; template using binary_writer = ::nlohmann::detail::binary_writer; using serializer = ::nlohmann::detail::serializer; public: using value_t = detail::value_t; /// @copydoc nlohmann::json_pointer using json_pointer = ::nlohmann::json_pointer; template using json_serializer = JSONSerializer; /// helper type for initializer lists of basic_json values using initializer_list_t = std::initializer_list>; //////////////// // exceptions // //////////////// /// @name exceptions /// Classes to implement user-defined exceptions. /// @{ /// @copydoc detail::exception using exception = detail::exception; /// @copydoc detail::parse_error using parse_error = detail::parse_error; /// @copydoc detail::invalid_iterator using invalid_iterator = detail::invalid_iterator; /// @copydoc detail::type_error using type_error = detail::type_error; /// @copydoc detail::out_of_range using out_of_range = detail::out_of_range; /// @copydoc detail::other_error using other_error = detail::other_error; /// @} ///////////////////// // container types // ///////////////////// /// @name container types /// The canonic container types to use @ref basic_json like any other STL /// container. /// @{ /// the type of elements in a basic_json container using value_type = basic_json; /// the type of an element reference using reference = value_type&; /// the type of an element const reference using const_reference = const value_type&; /// a type to represent differences between iterators using difference_type = std::ptrdiff_t; /// a type to represent container sizes using size_type = std::size_t; /// the allocator type using allocator_type = AllocatorType; /// the type of an element pointer using pointer = typename std::allocator_traits::pointer; /// the type of an element const pointer using const_pointer = typename std::allocator_traits::const_pointer; /// an iterator for a basic_json container using iterator = iter_impl; /// a const iterator for a basic_json container using const_iterator = iter_impl; /// a reverse iterator for a basic_json container using reverse_iterator = json_reverse_iterator; /// a const reverse iterator for a basic_json container using const_reverse_iterator = json_reverse_iterator; /// @} /*! @brief returns the allocator associated with the container */ static allocator_type get_allocator() { return allocator_type(); } /*! @brief returns version information on the library This function returns a JSON object with information about the library, including the version number and information on the platform and compiler. @return JSON object holding version information key | description ----------- | --------------- `compiler` | Information on the used compiler. It is an object with the following keys: `c++` (the used C++ standard), `family` (the compiler family; possible values are `clang`, `icc`, `gcc`, `ilecpp`, `msvc`, `pgcpp`, `sunpro`, and `unknown`), and `version` (the compiler version). `copyright` | The copyright line for the library as string. `name` | The name of the library as string. `platform` | The used platform as string. Possible values are `win32`, `linux`, `apple`, `unix`, and `unknown`. `url` | The URL of the project as string. `version` | The version of the library. It is an object with the following keys: `major`, `minor`, and `patch` as defined by [Semantic Versioning](http://semver.org), and `string` (the version string). @liveexample{The following code shows an example output of the `meta()` function.,meta} @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @complexity Constant. @since 2.1.0 */ static basic_json meta() { basic_json result; result["copyright"] = "(C) 2013-2017 Niels Lohmann"; result["name"] = "JSON for Modern C++"; result["url"] = "https://github.com/nlohmann/json"; result["version"]["string"] = std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." + std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." + std::to_string(NLOHMANN_JSON_VERSION_PATCH); result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; #ifdef _WIN32 result["platform"] = "win32"; #elif defined __linux__ result["platform"] = "linux"; #elif defined __APPLE__ result["platform"] = "apple"; #elif defined __unix__ result["platform"] = "unix"; #else result["platform"] = "unknown"; #endif #if defined(__ICC) || defined(__INTEL_COMPILER) result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; #elif defined(__clang__) result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; #elif defined(__GNUC__) || defined(__GNUG__) result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; #elif defined(__HP_cc) || defined(__HP_aCC) result["compiler"] = "hp" #elif defined(__IBMCPP__) result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; #elif defined(_MSC_VER) result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; #elif defined(__PGI) result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; #elif defined(__SUNPRO_CC) result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; #else result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; #endif #ifdef __cplusplus result["compiler"]["c++"] = std::to_string(__cplusplus); #else result["compiler"]["c++"] = "unknown"; #endif return result; } /////////////////////////// // JSON value data types // /////////////////////////// /// @name JSON value data types /// The data types to store a JSON value. These types are derived from /// the template arguments passed to class @ref basic_json. /// @{ #if defined(JSON_HAS_CPP_14) // Use transparent comparator if possible, combined with perfect forwarding // on find() and count() calls prevents unnecessary string construction. using object_comparator_t = std::less<>; #else using object_comparator_t = std::less; #endif /*! @brief a type for an object [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows: > An object is an unordered collection of zero or more name/value pairs, > where a name is a string and a value is a string, number, boolean, null, > object, or array. To store objects in C++, a type is defined by the template parameters described below. @tparam ObjectType the container to store objects (e.g., `std::map` or `std::unordered_map`) @tparam StringType the type of the keys or names (e.g., `std::string`). The comparison function `std::less` is used to order elements inside the container. @tparam AllocatorType the allocator to use for objects (e.g., `std::allocator`) #### Default type With the default values for @a ObjectType (`std::map`), @a StringType (`std::string`), and @a AllocatorType (`std::allocator`), the default value for @a object_t is: @code {.cpp} std::map< std::string, // key_type basic_json, // value_type std::less, // key_compare std::allocator> // allocator_type > @endcode #### Behavior The choice of @a object_t influences the behavior of the JSON class. With the default type, objects have the following behavior: - When all names are unique, objects will be interoperable in the sense that all software implementations receiving that object will agree on the name-value mappings. - When the names within an object are not unique, it is unspecified which one of the values for a given key will be chosen. For instance, `{"key": 2, "key": 1}` could be equal to either `{"key": 1}` or `{"key": 2}`. - Internally, name/value pairs are stored in lexicographical order of the names. Objects will also be serialized (see @ref dump) in this order. For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored and serialized as `{"a": 2, "b": 1}`. - When comparing objects, the order of the name/value pairs is irrelevant. This makes objects interoperable in the sense that they will not be affected by these differences. For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be treated as equal. #### Limits [RFC 7159](http://rfc7159.net/rfc7159) specifies: > An implementation may set limits on the maximum depth of nesting. In this class, the object's limit of nesting is not explicitly constrained. However, a maximum depth of nesting may be introduced by the compiler or runtime environment. A theoretical limit can be queried by calling the @ref max_size function of a JSON object. #### Storage Objects are stored as pointers in a @ref basic_json type. That is, for any access to object values, a pointer of type `object_t*` must be dereferenced. @sa @ref array_t -- type for an array value @since version 1.0.0 @note The order name/value pairs are added to the object is *not* preserved by the library. Therefore, iterating an object may return name/value pairs in a different order than they were originally stored. In fact, keys will be traversed in alphabetical order as `std::map` with `std::less` is used by default. Please note this behavior conforms to [RFC 7159](http://rfc7159.net/rfc7159), because any order implements the specified "unordered" nature of JSON objects. */ using object_t = ObjectType>>; /*! @brief a type for an array [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows: > An array is an ordered sequence of zero or more values. To store objects in C++, a type is defined by the template parameters explained below. @tparam ArrayType container type to store arrays (e.g., `std::vector` or `std::list`) @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) #### Default type With the default values for @a ArrayType (`std::vector`) and @a AllocatorType (`std::allocator`), the default value for @a array_t is: @code {.cpp} std::vector< basic_json, // value_type std::allocator // allocator_type > @endcode #### Limits [RFC 7159](http://rfc7159.net/rfc7159) specifies: > An implementation may set limits on the maximum depth of nesting. In this class, the array's limit of nesting is not explicitly constrained. However, a maximum depth of nesting may be introduced by the compiler or runtime environment. A theoretical limit can be queried by calling the @ref max_size function of a JSON array. #### Storage Arrays are stored as pointers in a @ref basic_json type. That is, for any access to array values, a pointer of type `array_t*` must be dereferenced. @sa @ref object_t -- type for an object value @since version 1.0.0 */ using array_t = ArrayType>; /*! @brief a type for a string [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows: > A string is a sequence of zero or more Unicode characters. To store objects in C++, a type is defined by the template parameter described below. Unicode values are split by the JSON class into byte-sized characters during deserialization. @tparam StringType the container to store strings (e.g., `std::string`). Note this container is used for keys/names in objects, see @ref object_t. #### Default type With the default values for @a StringType (`std::string`), the default value for @a string_t is: @code {.cpp} std::string @endcode #### Encoding Strings are stored in UTF-8 encoding. Therefore, functions like `std::string::size()` or `std::string::length()` return the number of bytes in the string rather than the number of characters or glyphs. #### String comparison [RFC 7159](http://rfc7159.net/rfc7159) states: > Software implementations are typically required to test names of object > members for equality. Implementations that transform the textual > representation into sequences of Unicode code units and then perform the > comparison numerically, code unit by code unit, are interoperable in the > sense that implementations will agree in all cases on equality or > inequality of two strings. For example, implementations that compare > strings with escaped characters unconverted may incorrectly find that > `"a\\b"` and `"a\u005Cb"` are not equal. This implementation is interoperable as it does compare strings code unit by code unit. #### Storage String values are stored as pointers in a @ref basic_json type. That is, for any access to string values, a pointer of type `string_t*` must be dereferenced. @since version 1.0.0 */ using string_t = StringType; /*! @brief a type for a boolean [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a type which differentiates the two literals `true` and `false`. To store objects in C++, a type is defined by the template parameter @a BooleanType which chooses the type to use. #### Default type With the default values for @a BooleanType (`bool`), the default value for @a boolean_t is: @code {.cpp} bool @endcode #### Storage Boolean values are stored directly inside a @ref basic_json type. @since version 1.0.0 */ using boolean_t = BooleanType; /*! @brief a type for a number (integer) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: > The representation of numbers is similar to that used in most > programming languages. A number is represented in base 10 using decimal > digits. It contains an integer component that may be prefixed with an > optional minus sign, which may be followed by a fraction part and/or an > exponent part. Leading zeros are not allowed. (...) Numeric values that > cannot be represented in the grammar below (such as Infinity and NaN) > are not permitted. This description includes both integer and floating-point numbers. However, C++ allows more precise storage if it is known whether the number is a signed integer, an unsigned integer or a floating-point number. Therefore, three different types, @ref number_integer_t, @ref number_unsigned_t and @ref number_float_t are used. To store integer numbers in C++, a type is defined by the template parameter @a NumberIntegerType which chooses the type to use. #### Default type With the default values for @a NumberIntegerType (`int64_t`), the default value for @a number_integer_t is: @code {.cpp} int64_t @endcode #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For instance, the C++ integer literal `010` will be serialized to `8`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits [RFC 7159](http://rfc7159.net/rfc7159) specifies: > An implementation may set limits on the range and precision of numbers. When the default type is used, the maximal integer number that can be stored is `9223372036854775807` (INT64_MAX) and the minimal integer number that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers that are out of range will yield over/underflow when used in a constructor. During deserialization, too large or small integer numbers will be automatically be stored as @ref number_unsigned_t or @ref number_float_t. [RFC 7159](http://rfc7159.net/rfc7159) further states: > Note that when such software is used, numbers that are integers and are > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense > that implementations will agree exactly on their numeric values. As this range is a subrange of the exactly supported range [INT64_MIN, INT64_MAX], this class's integer type is interoperable. #### Storage Integer number values are stored directly inside a @ref basic_json type. @sa @ref number_float_t -- type for number values (floating-point) @sa @ref number_unsigned_t -- type for number values (unsigned integer) @since version 1.0.0 */ using number_integer_t = NumberIntegerType; /*! @brief a type for a number (unsigned) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: > The representation of numbers is similar to that used in most > programming languages. A number is represented in base 10 using decimal > digits. It contains an integer component that may be prefixed with an > optional minus sign, which may be followed by a fraction part and/or an > exponent part. Leading zeros are not allowed. (...) Numeric values that > cannot be represented in the grammar below (such as Infinity and NaN) > are not permitted. This description includes both integer and floating-point numbers. However, C++ allows more precise storage if it is known whether the number is a signed integer, an unsigned integer or a floating-point number. Therefore, three different types, @ref number_integer_t, @ref number_unsigned_t and @ref number_float_t are used. To store unsigned integer numbers in C++, a type is defined by the template parameter @a NumberUnsignedType which chooses the type to use. #### Default type With the default values for @a NumberUnsignedType (`uint64_t`), the default value for @a number_unsigned_t is: @code {.cpp} uint64_t @endcode #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in integer literals lead to an interpretation as octal number. Internally, the value will be stored as decimal number. For instance, the C++ integer literal `010` will be serialized to `8`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits [RFC 7159](http://rfc7159.net/rfc7159) specifies: > An implementation may set limits on the range and precision of numbers. When the default type is used, the maximal integer number that can be stored is `18446744073709551615` (UINT64_MAX) and the minimal integer number that can be stored is `0`. Integer numbers that are out of range will yield over/underflow when used in a constructor. During deserialization, too large or small integer numbers will be automatically be stored as @ref number_integer_t or @ref number_float_t. [RFC 7159](http://rfc7159.net/rfc7159) further states: > Note that when such software is used, numbers that are integers and are > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense > that implementations will agree exactly on their numeric values. As this range is a subrange (when considered in conjunction with the number_integer_t type) of the exactly supported range [0, UINT64_MAX], this class's integer type is interoperable. #### Storage Integer number values are stored directly inside a @ref basic_json type. @sa @ref number_float_t -- type for number values (floating-point) @sa @ref number_integer_t -- type for number values (integer) @since version 2.0.0 */ using number_unsigned_t = NumberUnsignedType; /*! @brief a type for a number (floating-point) [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: > The representation of numbers is similar to that used in most > programming languages. A number is represented in base 10 using decimal > digits. It contains an integer component that may be prefixed with an > optional minus sign, which may be followed by a fraction part and/or an > exponent part. Leading zeros are not allowed. (...) Numeric values that > cannot be represented in the grammar below (such as Infinity and NaN) > are not permitted. This description includes both integer and floating-point numbers. However, C++ allows more precise storage if it is known whether the number is a signed integer, an unsigned integer or a floating-point number. Therefore, three different types, @ref number_integer_t, @ref number_unsigned_t and @ref number_float_t are used. To store floating-point numbers in C++, a type is defined by the template parameter @a NumberFloatType which chooses the type to use. #### Default type With the default values for @a NumberFloatType (`double`), the default value for @a number_float_t is: @code {.cpp} double @endcode #### Default behavior - The restrictions about leading zeros is not enforced in C++. Instead, leading zeros in floating-point literals will be ignored. Internally, the value will be stored as decimal number. For instance, the C++ floating-point literal `01.2` will be serialized to `1.2`. During deserialization, leading zeros yield an error. - Not-a-number (NaN) values will be serialized to `null`. #### Limits [RFC 7159](http://rfc7159.net/rfc7159) states: > This specification allows implementations to set limits on the range and > precision of numbers accepted. Since software that implements IEEE > 754-2008 binary64 (double precision) numbers is generally available and > widely used, good interoperability can be achieved by implementations > that expect no more precision or range than these provide, in the sense > that implementations will approximate JSON numbers within the expected > precision. This implementation does exactly follow this approach, as it uses double precision floating-point numbers. Note values smaller than `-1.79769313486232e+308` and values greater than `1.79769313486232e+308` will be stored as NaN internally and be serialized to `null`. #### Storage Floating-point number values are stored directly inside a @ref basic_json type. @sa @ref number_integer_t -- type for number values (integer) @sa @ref number_unsigned_t -- type for number values (unsigned integer) @since version 1.0.0 */ using number_float_t = NumberFloatType; /// @} private: /// helper for exception-safe object creation template static T* create(Args&& ... args) { AllocatorType alloc; using AllocatorTraits = std::allocator_traits>; auto deleter = [&](T * object) { AllocatorTraits::deallocate(alloc, object, 1); }; std::unique_ptr object(AllocatorTraits::allocate(alloc, 1), deleter); AllocatorTraits::construct(alloc, object.get(), std::forward(args)...); assert(object != nullptr); return object.release(); } //////////////////////// // JSON value storage // //////////////////////// /*! @brief a JSON value The actual storage for a JSON value of the @ref basic_json class. This union combines the different storage types for the JSON value types defined in @ref value_t. JSON type | value_t type | used type --------- | --------------- | ------------------------ object | object | pointer to @ref object_t array | array | pointer to @ref array_t string | string | pointer to @ref string_t boolean | boolean | @ref boolean_t number | number_integer | @ref number_integer_t number | number_unsigned | @ref number_unsigned_t number | number_float | @ref number_float_t null | null | *no value is stored* @note Variable-length types (objects, arrays, and strings) are stored as pointers. The size of the union should not exceed 64 bits if the default value types are used. @since version 1.0.0 */ union json_value { /// object (stored with pointer to save storage) object_t* object; /// array (stored with pointer to save storage) array_t* array; /// string (stored with pointer to save storage) string_t* string; /// boolean boolean_t boolean; /// number (integer) number_integer_t number_integer; /// number (unsigned integer) number_unsigned_t number_unsigned; /// number (floating-point) number_float_t number_float; /// default constructor (for null values) json_value() = default; /// constructor for booleans json_value(boolean_t v) noexcept : boolean(v) {} /// constructor for numbers (integer) json_value(number_integer_t v) noexcept : number_integer(v) {} /// constructor for numbers (unsigned) json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} /// constructor for numbers (floating-point) json_value(number_float_t v) noexcept : number_float(v) {} /// constructor for empty values of a given type json_value(value_t t) { switch (t) { case value_t::object: { object = create(); break; } case value_t::array: { array = create(); break; } case value_t::string: { string = create(""); break; } case value_t::boolean: { boolean = boolean_t(false); break; } case value_t::number_integer: { number_integer = number_integer_t(0); break; } case value_t::number_unsigned: { number_unsigned = number_unsigned_t(0); break; } case value_t::number_float: { number_float = number_float_t(0.0); break; } case value_t::null: { object = nullptr; // silence warning, see #821 break; } default: { object = nullptr; // silence warning, see #821 if (JSON_UNLIKELY(t == value_t::null)) { JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.1.1")); // LCOV_EXCL_LINE } break; } } } /// constructor for strings json_value(const string_t& value) { string = create(value); } /// constructor for rvalue strings json_value(string_t&& value) { string = create(std::move(value)); } /// constructor for objects json_value(const object_t& value) { object = create(value); } /// constructor for rvalue objects json_value(object_t&& value) { object = create(std::move(value)); } /// constructor for arrays json_value(const array_t& value) { array = create(value); } /// constructor for rvalue arrays json_value(array_t&& value) { array = create(std::move(value)); } void destroy(value_t t) noexcept { switch (t) { case value_t::object: { AllocatorType alloc; std::allocator_traits::destroy(alloc, object); std::allocator_traits::deallocate(alloc, object, 1); break; } case value_t::array: { AllocatorType alloc; std::allocator_traits::destroy(alloc, array); std::allocator_traits::deallocate(alloc, array, 1); break; } case value_t::string: { AllocatorType alloc; std::allocator_traits::destroy(alloc, string); std::allocator_traits::deallocate(alloc, string, 1); break; } default: { break; } } } }; /*! @brief checks the class invariants This function asserts the class invariants. It needs to be called at the end of every constructor to make sure that created objects respect the invariant. Furthermore, it has to be called each time the type of a JSON value is changed, because the invariant expresses a relationship between @a m_type and @a m_value. */ void assert_invariant() const noexcept { assert(m_type != value_t::object or m_value.object != nullptr); assert(m_type != value_t::array or m_value.array != nullptr); assert(m_type != value_t::string or m_value.string != nullptr); } public: ////////////////////////// // JSON parser callback // ////////////////////////// /*! @brief parser event types The parser callback distinguishes the following events: - `object_start`: the parser read `{` and started to process a JSON object - `key`: the parser read a key of a value in an object - `object_end`: the parser read `}` and finished processing a JSON object - `array_start`: the parser read `[` and started to process a JSON array - `array_end`: the parser read `]` and finished processing a JSON array - `value`: the parser finished reading a JSON value @image html callback_events.png "Example when certain parse events are triggered" @sa @ref parser_callback_t for more information and examples */ using parse_event_t = typename parser::parse_event_t; /*! @brief per-element parser callback type With a parser callback function, the result of parsing a JSON text can be influenced. When passed to @ref parse, it is called on certain events (passed as @ref parse_event_t via parameter @a event) with a set recursion depth @a depth and context JSON value @a parsed. The return value of the callback function is a boolean indicating whether the element that emitted the callback shall be kept or not. We distinguish six scenarios (determined by the event type) in which the callback function can be called. The following table describes the values of the parameters @a depth, @a event, and @a parsed. parameter @a event | description | parameter @a depth | parameter @a parsed ------------------ | ----------- | ------------------ | ------------------- parse_event_t::object_start | the parser read `{` and started to process a JSON object | depth of the parent of the JSON object | a JSON value with type discarded parse_event_t::key | the parser read a key of a value in an object | depth of the currently parsed JSON object | a JSON string containing the key parse_event_t::object_end | the parser read `}` and finished processing a JSON object | depth of the parent of the JSON object | the parsed JSON object parse_event_t::array_start | the parser read `[` and started to process a JSON array | depth of the parent of the JSON array | a JSON value with type discarded parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value @image html callback_events.png "Example when certain parse events are triggered" Discarding a value (i.e., returning `false`) has different effects depending on the context in which function was called: - Discarded values in structured types are skipped. That is, the parser will behave as if the discarded value was never read. - In case a value outside a structured type is skipped, it is replaced with `null`. This case happens if the top-level element is skipped. @param[in] depth the depth of the recursion during parsing @param[in] event an event of type parse_event_t indicating the context in the callback function has been called @param[in,out] parsed the current intermediate parse result; note that writing to this value has no effect for parse_event_t::key events @return Whether the JSON value which called the function during parsing should be kept (`true`) or not (`false`). In the latter case, it is either skipped completely or replaced by an empty discarded object. @sa @ref parse for examples @since version 1.0.0 */ using parser_callback_t = typename parser::parser_callback_t; ////////////////// // constructors // ////////////////// /// @name constructors and destructors /// Constructors of class @ref basic_json, copy/move constructor, copy /// assignment, static functions creating objects, and the destructor. /// @{ /*! @brief create an empty value with a given type Create an empty JSON value with a given type. The value will be default initialized with an empty value which depends on the type: Value type | initial value ----------- | ------------- null | `null` boolean | `false` string | `""` number | `0` object | `{}` array | `[]` @param[in] v the type of the value to create @complexity Constant. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @liveexample{The following code shows the constructor for different @ref value_t values,basic_json__value_t} @sa @ref clear() -- restores the postcondition of this constructor @since version 1.0.0 */ basic_json(const value_t v) : m_type(v), m_value(v) { assert_invariant(); } /*! @brief create a null object Create a `null` JSON value. It either takes a null pointer as parameter (explicitly creating `null`) or no parameter (implicitly creating `null`). The passed null pointer itself is not read -- it is only used to choose the right constructor. @complexity Constant. @exceptionsafety No-throw guarantee: this constructor never throws exceptions. @liveexample{The following code shows the constructor with and without a null pointer parameter.,basic_json__nullptr_t} @since version 1.0.0 */ basic_json(std::nullptr_t = nullptr) noexcept : basic_json(value_t::null) { assert_invariant(); } /*! @brief create a JSON value This is a "catch all" constructor for all compatible JSON types; that is, types for which a `to_json()` method exists. The constructor forwards the parameter @a val to that method (to `json_serializer::to_json` method with `U = uncvref_t`, to be exact). Template type @a CompatibleType includes, but is not limited to, the following types: - **arrays**: @ref array_t and all kinds of compatible containers such as `std::vector`, `std::deque`, `std::list`, `std::forward_list`, `std::array`, `std::valarray`, `std::set`, `std::unordered_set`, `std::multiset`, and `std::unordered_multiset` with a `value_type` from which a @ref basic_json value can be constructed. - **objects**: @ref object_t and all kinds of compatible associative containers such as `std::map`, `std::unordered_map`, `std::multimap`, and `std::unordered_multimap` with a `key_type` compatible to @ref string_t and a `value_type` from which a @ref basic_json value can be constructed. - **strings**: @ref string_t, string literals, and all compatible string containers can be used. - **numbers**: @ref number_integer_t, @ref number_unsigned_t, @ref number_float_t, and all convertible number types such as `int`, `size_t`, `int64_t`, `float` or `double` can be used. - **boolean**: @ref boolean_t / `bool` can be used. See the examples below. @tparam CompatibleType a type such that: - @a CompatibleType is not derived from `std::istream`, - @a CompatibleType is not @ref basic_json (to avoid hijacking copy/move constructors), - @a CompatibleType is not a @ref basic_json nested type (e.g., @ref json_pointer, @ref iterator, etc ...) - @ref @ref json_serializer has a `to_json(basic_json_t&, CompatibleType&&)` method @tparam U = `uncvref_t` @param[in] val the value to be forwarded to the respective constructor @complexity Usually linear in the size of the passed @a val, also depending on the implementation of the called `to_json()` method. @exceptionsafety Depends on the called constructor. For types directly supported by the library (i.e., all types for which no `to_json()` function was provided), strong guarantee holds: if an exception is thrown, there are no changes to any JSON value. @liveexample{The following code shows the constructor with several compatible types.,basic_json__CompatibleType} @since version 2.1.0 */ template , detail::enable_if_t< detail::is_compatible_type::value, int> = 0> basic_json(CompatibleType && val) noexcept(noexcept( JSONSerializer::to_json(std::declval(), std::forward(val)))) { JSONSerializer::to_json(*this, std::forward(val)); assert_invariant(); } /*! @brief create a container (array or object) from an initializer list Creates a JSON value of type array or object from the passed initializer list @a init. In case @a type_deduction is `true` (default), the type of the JSON value to be created is deducted from the initializer list @a init according to the following rules: 1. If the list is empty, an empty JSON object value `{}` is created. 2. If the list consists of pairs whose first element is a string, a JSON object value is created where the first elements of the pairs are treated as keys and the second elements are as values. 3. In all other cases, an array is created. The rules aim to create the best fit between a C++ initializer list and JSON values. The rationale is as follows: 1. The empty initializer list is written as `{}` which is exactly an empty JSON object. 2. C++ has no way of describing mapped types other than to list a list of pairs. As JSON requires that keys must be of type string, rule 2 is the weakest constraint one can pose on initializer lists to interpret them as an object. 3. In all other cases, the initializer list could not be interpreted as JSON object type, so interpreting it as JSON array type is safe. With the rules described above, the following JSON values cannot be expressed by an initializer list: - the empty array (`[]`): use @ref array(initializer_list_t) with an empty initializer list in this case - arrays whose elements satisfy rule 2: use @ref array(initializer_list_t) with the same initializer list in this case @note When used without parentheses around an empty initializer list, @ref basic_json() is called instead of this function, yielding the JSON null value. @param[in] init initializer list with JSON values @param[in] type_deduction internal parameter; when set to `true`, the type of the JSON value is deducted from the initializer list @a init; when set to `false`, the type provided via @a manual_type is forced. This mode is used by the functions @ref array(initializer_list_t) and @ref object(initializer_list_t). @param[in] manual_type internal parameter; when @a type_deduction is set to `false`, the created JSON value will use the provided type (only @ref value_t::array and @ref value_t::object are valid); when @a type_deduction is set to `true`, this parameter has no effect @throw type_error.301 if @a type_deduction is `false`, @a manual_type is `value_t::object`, but @a init contains an element which is not a pair whose first element is a string. In this case, the constructor could not create an object. If @a type_deduction would have be `true`, an array would have been created. See @ref object(initializer_list_t) for an example. @complexity Linear in the size of the initializer list @a init. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @liveexample{The example below shows how JSON values are created from initializer lists.,basic_json__list_init_t} @sa @ref array(initializer_list_t) -- create a JSON array value from an initializer list @sa @ref object(initializer_list_t) -- create a JSON object value from an initializer list @since version 1.0.0 */ basic_json(initializer_list_t init, bool type_deduction = true, value_t manual_type = value_t::array) { // check if each element is an array with two elements whose first // element is a string bool is_an_object = std::all_of(init.begin(), init.end(), [](const detail::json_ref& element_ref) { return (element_ref->is_array() and element_ref->size() == 2 and (*element_ref)[0].is_string()); }); // adjust type if type deduction is not wanted if (not type_deduction) { // if array is wanted, do not create an object though possible if (manual_type == value_t::array) { is_an_object = false; } // if object is wanted but impossible, throw an exception if (JSON_UNLIKELY(manual_type == value_t::object and not is_an_object)) { JSON_THROW(type_error::create(301, "cannot create object from initializer list")); } } if (is_an_object) { // the initializer list is a list of pairs -> create object m_type = value_t::object; m_value = value_t::object; std::for_each(init.begin(), init.end(), [this](const detail::json_ref& element_ref) { auto element = element_ref.moved_or_copied(); m_value.object->emplace( std::move(*((*element.m_value.array)[0].m_value.string)), std::move((*element.m_value.array)[1])); }); } else { // the initializer list describes an array -> create array m_type = value_t::array; m_value.array = create(init.begin(), init.end()); } assert_invariant(); } /*! @brief explicitly create an array from an initializer list Creates a JSON array value from a given initializer list. That is, given a list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the initializer list is empty, the empty array `[]` is created. @note This function is only needed to express two edge cases that cannot be realized with the initializer list constructor (@ref basic_json(initializer_list_t, bool, value_t)). These cases are: 1. creating an array whose elements are all pairs whose first element is a string -- in this case, the initializer list constructor would create an object, taking the first elements as keys 2. creating an empty array -- passing the empty initializer list to the initializer list constructor yields an empty object @param[in] init initializer list with JSON values to create an array from (optional) @return JSON array value @complexity Linear in the size of @a init. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @liveexample{The following code shows an example for the `array` function.,array} @sa @ref basic_json(initializer_list_t, bool, value_t) -- create a JSON value from an initializer list @sa @ref object(initializer_list_t) -- create a JSON object value from an initializer list @since version 1.0.0 */ static basic_json array(initializer_list_t init = {}) { return basic_json(init, false, value_t::array); } /*! @brief explicitly create an object from an initializer list Creates a JSON object value from a given initializer list. The initializer lists elements must be pairs, and their first elements must be strings. If the initializer list is empty, the empty object `{}` is created. @note This function is only added for symmetry reasons. In contrast to the related function @ref array(initializer_list_t), there are no cases which can only be expressed by this function. That is, any initializer list @a init can also be passed to the initializer list constructor @ref basic_json(initializer_list_t, bool, value_t). @param[in] init initializer list to create an object from (optional) @return JSON object value @throw type_error.301 if @a init is not a list of pairs whose first elements are strings. In this case, no object can be created. When such a value is passed to @ref basic_json(initializer_list_t, bool, value_t), an array would have been created from the passed initializer list @a init. See example below. @complexity Linear in the size of @a init. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @liveexample{The following code shows an example for the `object` function.,object} @sa @ref basic_json(initializer_list_t, bool, value_t) -- create a JSON value from an initializer list @sa @ref array(initializer_list_t) -- create a JSON array value from an initializer list @since version 1.0.0 */ static basic_json object(initializer_list_t init = {}) { return basic_json(init, false, value_t::object); } /*! @brief construct an array with count copies of given value Constructs a JSON array value by creating @a cnt copies of a passed value. In case @a cnt is `0`, an empty array is created. @param[in] cnt the number of JSON copies of @a val to create @param[in] val the JSON value to copy @post `std::distance(begin(),end()) == cnt` holds. @complexity Linear in @a cnt. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @liveexample{The following code shows examples for the @ref basic_json(size_type\, const basic_json&) constructor.,basic_json__size_type_basic_json} @since version 1.0.0 */ basic_json(size_type cnt, const basic_json& val) : m_type(value_t::array) { m_value.array = create(cnt, val); assert_invariant(); } /*! @brief construct a JSON container given an iterator range Constructs the JSON value with the contents of the range `[first, last)`. The semantics depends on the different types a JSON value can have: - In case of a null type, invalid_iterator.206 is thrown. - In case of other primitive types (number, boolean, or string), @a first must be `begin()` and @a last must be `end()`. In this case, the value is copied. Otherwise, invalid_iterator.204 is thrown. - In case of structured types (array, object), the constructor behaves as similar versions for `std::vector` or `std::map`; that is, a JSON array or object is constructed from the values in the range. @tparam InputIT an input iterator type (@ref iterator or @ref const_iterator) @param[in] first begin of the range to copy from (included) @param[in] last end of the range to copy from (excluded) @pre Iterators @a first and @a last must be initialized. **This precondition is enforced with an assertion (see warning).** If assertions are switched off, a violation of this precondition yields undefined behavior. @pre Range `[first, last)` is valid. Usually, this precondition cannot be checked efficiently. Only certain edge cases are detected; see the description of the exceptions below. A violation of this precondition yields undefined behavior. @warning A precondition is enforced with a runtime assertion that will result in calling `std::abort` if this precondition is not met. Assertions can be disabled by defining `NDEBUG` at compile time. See http://en.cppreference.com/w/cpp/error/assert for more information. @throw invalid_iterator.201 if iterators @a first and @a last are not compatible (i.e., do not belong to the same JSON value). In this case, the range `[first, last)` is undefined. @throw invalid_iterator.204 if iterators @a first and @a last belong to a primitive type (number, boolean, or string), but @a first does not point to the first element any more. In this case, the range `[first, last)` is undefined. See example code below. @throw invalid_iterator.206 if iterators @a first and @a last belong to a null value. In this case, the range `[first, last)` is undefined. @complexity Linear in distance between @a first and @a last. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @liveexample{The example below shows several ways to create JSON values by specifying a subrange with iterators.,basic_json__InputIt_InputIt} @since version 1.0.0 */ template::value or std::is_same::value, int>::type = 0> basic_json(InputIT first, InputIT last) { assert(first.m_object != nullptr); assert(last.m_object != nullptr); // make sure iterator fits the current value if (JSON_UNLIKELY(first.m_object != last.m_object)) { JSON_THROW(invalid_iterator::create(201, "iterators are not compatible")); } // copy type from first iterator m_type = first.m_object->m_type; // check if iterator range is complete for primitive values switch (m_type) { case value_t::boolean: case value_t::number_float: case value_t::number_integer: case value_t::number_unsigned: case value_t::string: { if (JSON_UNLIKELY(not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())) { JSON_THROW(invalid_iterator::create(204, "iterators out of range")); } break; } default: break; } switch (m_type) { case value_t::number_integer: { m_value.number_integer = first.m_object->m_value.number_integer; break; } case value_t::number_unsigned: { m_value.number_unsigned = first.m_object->m_value.number_unsigned; break; } case value_t::number_float: { m_value.number_float = first.m_object->m_value.number_float; break; } case value_t::boolean: { m_value.boolean = first.m_object->m_value.boolean; break; } case value_t::string: { m_value = *first.m_object->m_value.string; break; } case value_t::object: { m_value.object = create(first.m_it.object_iterator, last.m_it.object_iterator); break; } case value_t::array: { m_value.array = create(first.m_it.array_iterator, last.m_it.array_iterator); break; } default: JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " + std::string(first.m_object->type_name()))); } assert_invariant(); } /////////////////////////////////////// // other constructors and destructor // /////////////////////////////////////// /// @private basic_json(const detail::json_ref& ref) : basic_json(ref.moved_or_copied()) {} /*! @brief copy constructor Creates a copy of a given JSON value. @param[in] other the JSON value to copy @post `*this == other` @complexity Linear in the size of @a other. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes to any JSON value. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. - As postcondition, it holds: `other == basic_json(other)`. @liveexample{The following code shows an example for the copy constructor.,basic_json__basic_json} @since version 1.0.0 */ basic_json(const basic_json& other) : m_type(other.m_type) { // check of passed value is valid other.assert_invariant(); switch (m_type) { case value_t::object: { m_value = *other.m_value.object; break; } case value_t::array: { m_value = *other.m_value.array; break; } case value_t::string: { m_value = *other.m_value.string; break; } case value_t::boolean: { m_value = other.m_value.boolean; break; } case value_t::number_integer: { m_value = other.m_value.number_integer; break; } case value_t::number_unsigned: { m_value = other.m_value.number_unsigned; break; } case value_t::number_float: { m_value = other.m_value.number_float; break; } default: break; } assert_invariant(); } /*! @brief move constructor Move constructor. Constructs a JSON value with the contents of the given value @a other using move semantics. It "steals" the resources from @a other and leaves it as JSON null value. @param[in,out] other value to move to this object @post `*this` has the same value as @a other before the call. @post @a other is a JSON null value. @complexity Constant. @exceptionsafety No-throw guarantee: this constructor never throws exceptions. @requirement This function helps `basic_json` satisfying the [MoveConstructible](http://en.cppreference.com/w/cpp/concept/MoveConstructible) requirements. @liveexample{The code below shows the move constructor explicitly called via std::move.,basic_json__moveconstructor} @since version 1.0.0 */ basic_json(basic_json&& other) noexcept : m_type(std::move(other.m_type)), m_value(std::move(other.m_value)) { // check that passed value is valid other.assert_invariant(); // invalidate payload other.m_type = value_t::null; other.m_value = {}; assert_invariant(); } /*! @brief copy assignment Copy assignment operator. Copies a JSON value via the "copy and swap" strategy: It is expressed in terms of the copy constructor, destructor, and the `swap()` member function. @param[in] other value to copy from @complexity Linear. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. @liveexample{The code below shows and example for the copy assignment. It creates a copy of value `a` which is then swapped with `b`. Finally\, the copy of `a` (which is the null value after the swap) is destroyed.,basic_json__copyassignment} @since version 1.0.0 */ reference& operator=(basic_json other) noexcept ( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value ) { // check that passed value is valid other.assert_invariant(); using std::swap; swap(m_type, other.m_type); swap(m_value, other.m_value); assert_invariant(); return *this; } /*! @brief destructor Destroys the JSON value and frees all allocated memory. @complexity Linear. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is linear. - All stored elements are destroyed and all memory is freed. @since version 1.0.0 */ ~basic_json() noexcept { assert_invariant(); m_value.destroy(m_type); } /// @} public: /////////////////////// // object inspection // /////////////////////// /// @name object inspection /// Functions to inspect the type of a JSON value. /// @{ /*! @brief serialization Serialization function for JSON values. The function tries to mimic Python's `json.dumps()` function, and currently supports its @a indent and @a ensure_ascii parameters. @param[in] indent If indent is nonnegative, then array elements and object members will be pretty-printed with that indent level. An indent level of `0` will only insert newlines. `-1` (the default) selects the most compact representation. @param[in] indent_char The character to use for indentation if @a indent is greater than `0`. The default is ` ` (space). @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters in the output are escaped with `\uXXXX` sequences, and the result consists of ASCII characters only. @return string containing the serialization of the JSON value @throw type_error.316 if a string stored inside the JSON value is not UTF-8 encoded @complexity Linear. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @liveexample{The following example shows the effect of different @a indent\, @a indent_char\, and @a ensure_ascii parameters to the result of the serialization.,dump} @see https://docs.python.org/2/library/json.html#json.dump @since version 1.0.0; indentation character @a indent_char, option @a ensure_ascii and exceptions added in version 3.0.0 */ string_t dump(const int indent = -1, const char indent_char = ' ', const bool ensure_ascii = false) const { string_t result; serializer s(detail::output_adapter(result), indent_char); if (indent >= 0) { s.dump(*this, true, ensure_ascii, static_cast(indent)); } else { s.dump(*this, false, ensure_ascii, 0); } return result; } /*! @brief return the type of the JSON value (explicit) Return the type of the JSON value as a value from the @ref value_t enumeration. @return the type of the JSON value Value type | return value ------------------------- | ------------------------- null | value_t::null boolean | value_t::boolean string | value_t::string number (integer) | value_t::number_integer number (unsigned integer) | value_t::number_unsigned number (floating-point) | value_t::number_float object | value_t::object array | value_t::array discarded | value_t::discarded @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `type()` for all JSON types.,type} @sa @ref operator value_t() -- return the type of the JSON value (implicit) @sa @ref type_name() -- return the type as string @since version 1.0.0 */ constexpr value_t type() const noexcept { return m_type; } /*! @brief return whether type is primitive This function returns true if and only if the JSON type is primitive (string, number, boolean, or null). @return `true` if type is primitive (string, number, boolean, or null), `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_primitive()` for all JSON types.,is_primitive} @sa @ref is_structured() -- returns whether JSON value is structured @sa @ref is_null() -- returns whether JSON value is `null` @sa @ref is_string() -- returns whether JSON value is a string @sa @ref is_boolean() -- returns whether JSON value is a boolean @sa @ref is_number() -- returns whether JSON value is a number @since version 1.0.0 */ constexpr bool is_primitive() const noexcept { return is_null() or is_string() or is_boolean() or is_number(); } /*! @brief return whether type is structured This function returns true if and only if the JSON type is structured (array or object). @return `true` if type is structured (array or object), `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_structured()` for all JSON types.,is_structured} @sa @ref is_primitive() -- returns whether value is primitive @sa @ref is_array() -- returns whether value is an array @sa @ref is_object() -- returns whether value is an object @since version 1.0.0 */ constexpr bool is_structured() const noexcept { return is_array() or is_object(); } /*! @brief return whether value is null This function returns true if and only if the JSON value is null. @return `true` if type is null, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_null()` for all JSON types.,is_null} @since version 1.0.0 */ constexpr bool is_null() const noexcept { return (m_type == value_t::null); } /*! @brief return whether value is a boolean This function returns true if and only if the JSON value is a boolean. @return `true` if type is boolean, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_boolean()` for all JSON types.,is_boolean} @since version 1.0.0 */ constexpr bool is_boolean() const noexcept { return (m_type == value_t::boolean); } /*! @brief return whether value is a number This function returns true if and only if the JSON value is a number. This includes both integer (signed and unsigned) and floating-point values. @return `true` if type is number (regardless whether integer, unsigned integer or floating-type), `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_number()` for all JSON types.,is_number} @sa @ref is_number_integer() -- check if value is an integer or unsigned integer number @sa @ref is_number_unsigned() -- check if value is an unsigned integer number @sa @ref is_number_float() -- check if value is a floating-point number @since version 1.0.0 */ constexpr bool is_number() const noexcept { return is_number_integer() or is_number_float(); } /*! @brief return whether value is an integer number This function returns true if and only if the JSON value is a signed or unsigned integer number. This excludes floating-point values. @return `true` if type is an integer or unsigned integer number, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_number_integer()` for all JSON types.,is_number_integer} @sa @ref is_number() -- check if value is a number @sa @ref is_number_unsigned() -- check if value is an unsigned integer number @sa @ref is_number_float() -- check if value is a floating-point number @since version 1.0.0 */ constexpr bool is_number_integer() const noexcept { return (m_type == value_t::number_integer or m_type == value_t::number_unsigned); } /*! @brief return whether value is an unsigned integer number This function returns true if and only if the JSON value is an unsigned integer number. This excludes floating-point and signed integer values. @return `true` if type is an unsigned integer number, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_number_unsigned()` for all JSON types.,is_number_unsigned} @sa @ref is_number() -- check if value is a number @sa @ref is_number_integer() -- check if value is an integer or unsigned integer number @sa @ref is_number_float() -- check if value is a floating-point number @since version 2.0.0 */ constexpr bool is_number_unsigned() const noexcept { return (m_type == value_t::number_unsigned); } /*! @brief return whether value is a floating-point number This function returns true if and only if the JSON value is a floating-point number. This excludes signed and unsigned integer values. @return `true` if type is a floating-point number, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_number_float()` for all JSON types.,is_number_float} @sa @ref is_number() -- check if value is number @sa @ref is_number_integer() -- check if value is an integer number @sa @ref is_number_unsigned() -- check if value is an unsigned integer number @since version 1.0.0 */ constexpr bool is_number_float() const noexcept { return (m_type == value_t::number_float); } /*! @brief return whether value is an object This function returns true if and only if the JSON value is an object. @return `true` if type is object, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_object()` for all JSON types.,is_object} @since version 1.0.0 */ constexpr bool is_object() const noexcept { return (m_type == value_t::object); } /*! @brief return whether value is an array This function returns true if and only if the JSON value is an array. @return `true` if type is array, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_array()` for all JSON types.,is_array} @since version 1.0.0 */ constexpr bool is_array() const noexcept { return (m_type == value_t::array); } /*! @brief return whether value is a string This function returns true if and only if the JSON value is a string. @return `true` if type is string, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_string()` for all JSON types.,is_string} @since version 1.0.0 */ constexpr bool is_string() const noexcept { return (m_type == value_t::string); } /*! @brief return whether value is discarded This function returns true if and only if the JSON value was discarded during parsing with a callback function (see @ref parser_callback_t). @note This function will always be `false` for JSON values after parsing. That is, discarded values can only occur during parsing, but will be removed when inside a structured value or replaced by null in other cases. @return `true` if type is discarded, `false` otherwise. @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies `is_discarded()` for all JSON types.,is_discarded} @since version 1.0.0 */ constexpr bool is_discarded() const noexcept { return (m_type == value_t::discarded); } /*! @brief return the type of the JSON value (implicit) Implicitly return the type of the JSON value as a value from the @ref value_t enumeration. @return the type of the JSON value @complexity Constant. @exceptionsafety No-throw guarantee: this member function never throws exceptions. @liveexample{The following code exemplifies the @ref value_t operator for all JSON types.,operator__value_t} @sa @ref type() -- return the type of the JSON value (explicit) @sa @ref type_name() -- return the type as string @since version 1.0.0 */ constexpr operator value_t() const noexcept { return m_type; } /// @} private: ////////////////// // value access // ////////////////// /// get a boolean (explicit) boolean_t get_impl(boolean_t* /*unused*/) const { if (JSON_LIKELY(is_boolean())) { return m_value.boolean; } JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name()))); } /// get a pointer to the value (object) object_t* get_impl_ptr(object_t* /*unused*/) noexcept { return is_object() ? m_value.object : nullptr; } /// get a pointer to the value (object) constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept { return is_object() ? m_value.object : nullptr; } /// get a pointer to the value (array) array_t* get_impl_ptr(array_t* /*unused*/) noexcept { return is_array() ? m_value.array : nullptr; } /// get a pointer to the value (array) constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept { return is_array() ? m_value.array : nullptr; } /// get a pointer to the value (string) string_t* get_impl_ptr(string_t* /*unused*/) noexcept { return is_string() ? m_value.string : nullptr; } /// get a pointer to the value (string) constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept { return is_string() ? m_value.string : nullptr; } /// get a pointer to the value (boolean) boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept { return is_boolean() ? &m_value.boolean : nullptr; } /// get a pointer to the value (boolean) constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept { return is_boolean() ? &m_value.boolean : nullptr; } /// get a pointer to the value (integer number) number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept { return is_number_integer() ? &m_value.number_integer : nullptr; } /// get a pointer to the value (integer number) constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept { return is_number_integer() ? &m_value.number_integer : nullptr; } /// get a pointer to the value (unsigned number) number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept { return is_number_unsigned() ? &m_value.number_unsigned : nullptr; } /// get a pointer to the value (unsigned number) constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept { return is_number_unsigned() ? &m_value.number_unsigned : nullptr; } /// get a pointer to the value (floating-point number) number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept { return is_number_float() ? &m_value.number_float : nullptr; } /// get a pointer to the value (floating-point number) constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept { return is_number_float() ? &m_value.number_float : nullptr; } /*! @brief helper function to implement get_ref() This function helps to implement get_ref() without code duplication for const and non-const overloads @tparam ThisType will be deduced as `basic_json` or `const basic_json` @throw type_error.303 if ReferenceType does not match underlying value type of the current JSON */ template static ReferenceType get_ref_impl(ThisType& obj) { // delegate the call to get_ptr<>() auto ptr = obj.template get_ptr::type>(); if (JSON_LIKELY(ptr != nullptr)) { return *ptr; } JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name()))); } public: /// @name value access /// Direct access to the stored value of a JSON value. /// @{ /*! @brief get special-case overload This overloads avoids a lot of template boilerplate, it can be seen as the identity method @tparam BasicJsonType == @ref basic_json @return a copy of *this @complexity Constant. @since version 2.1.0 */ template::type, basic_json_t>::value, int> = 0> basic_json get() const { return *this; } /*! @brief get a value (explicit) Explicit type conversion between the JSON value and a compatible value which is [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) and [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. The function is equivalent to executing @code {.cpp} ValueType ret; JSONSerializer::from_json(*this, ret); return ret; @endcode This overloads is chosen if: - @a ValueType is not @ref basic_json, - @ref json_serializer has a `from_json()` method of the form `void from_json(const basic_json&, ValueType&)`, and - @ref json_serializer does not have a `from_json()` method of the form `ValueType from_json(const basic_json&)` @tparam ValueTypeCV the provided value type @tparam ValueType the returned value type @return copy of the JSON value, converted to @a ValueType @throw what @ref json_serializer `from_json()` method throws @liveexample{The example below shows several conversions from JSON values to other types. There a few things to note: (1) Floating-point numbers can be converted to integers\, (2) A JSON array can be converted to a standard `std::vector`\, (3) A JSON object can be converted to C++ associative containers such as `std::unordered_map`.,get__ValueType_const} @since version 2.1.0 */ template, detail::enable_if_t < not std::is_same::value and detail::has_from_json::value and not detail::has_non_default_from_json::value, int> = 0> ValueType get() const noexcept(noexcept( JSONSerializer::from_json(std::declval(), std::declval()))) { // we cannot static_assert on ValueTypeCV being non-const, because // there is support for get(), which is why we // still need the uncvref static_assert(not std::is_reference::value, "get() cannot be used with reference types, you might want to use get_ref()"); static_assert(std::is_default_constructible::value, "types must be DefaultConstructible when used with get()"); ValueType ret; JSONSerializer::from_json(*this, ret); return ret; } /*! @brief get a value (explicit); special case Explicit type conversion between the JSON value and a compatible value which is **not** [CopyConstructible](http://en.cppreference.com/w/cpp/concept/CopyConstructible) and **not** [DefaultConstructible](http://en.cppreference.com/w/cpp/concept/DefaultConstructible). The value is converted by calling the @ref json_serializer `from_json()` method. The function is equivalent to executing @code {.cpp} return JSONSerializer::from_json(*this); @endcode This overloads is chosen if: - @a ValueType is not @ref basic_json and - @ref json_serializer has a `from_json()` method of the form `ValueType from_json(const basic_json&)` @note If @ref json_serializer has both overloads of `from_json()`, this one is chosen. @tparam ValueTypeCV the provided value type @tparam ValueType the returned value type @return copy of the JSON value, converted to @a ValueType @throw what @ref json_serializer `from_json()` method throws @since version 2.1.0 */ template, detail::enable_if_t::value and detail::has_non_default_from_json::value, int> = 0> ValueType get() const noexcept(noexcept( JSONSerializer::from_json(std::declval()))) { static_assert(not std::is_reference::value, "get() cannot be used with reference types, you might want to use get_ref()"); return JSONSerializer::from_json(*this); } /*! @brief get a pointer value (explicit) Explicit pointer access to the internally stored JSON value. No copies are made. @warning The pointer becomes invalid if the underlying JSON object changes. @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, @ref number_unsigned_t, or @ref number_float_t. @return pointer to the internally stored JSON value if the requested pointer type @a PointerType fits to the JSON value; `nullptr` otherwise @complexity Constant. @liveexample{The example below shows how pointers to internal values of a JSON value can be requested. Note that no type conversions are made and a `nullptr` is returned if the value and the requested pointer type does not match.,get__PointerType} @sa @ref get_ptr() for explicit pointer-member access @since version 1.0.0 */ template::value, int>::type = 0> PointerType get() noexcept { // delegate the call to get_ptr return get_ptr(); } /*! @brief get a pointer value (explicit) @copydoc get() */ template::value, int>::type = 0> constexpr const PointerType get() const noexcept { // delegate the call to get_ptr return get_ptr(); } /*! @brief get a pointer value (implicit) Implicit pointer access to the internally stored JSON value. No copies are made. @warning Writing data to the pointee of the result yields an undefined state. @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, @ref number_unsigned_t, or @ref number_float_t. Enforced by a static assertion. @return pointer to the internally stored JSON value if the requested pointer type @a PointerType fits to the JSON value; `nullptr` otherwise @complexity Constant. @liveexample{The example below shows how pointers to internal values of a JSON value can be requested. Note that no type conversions are made and a `nullptr` is returned if the value and the requested pointer type does not match.,get_ptr} @since version 1.0.0 */ template::value, int>::type = 0> PointerType get_ptr() noexcept { // get the type of the PointerType (remove pointer and const) using pointee_t = typename std::remove_const::type>::type>::type; // make sure the type matches the allowed types static_assert( std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value , "incompatible pointer type"); // delegate the call to get_impl_ptr<>() return get_impl_ptr(static_cast(nullptr)); } /*! @brief get a pointer value (implicit) @copydoc get_ptr() */ template::value and std::is_const::type>::value, int>::type = 0> constexpr const PointerType get_ptr() const noexcept { // get the type of the PointerType (remove pointer and const) using pointee_t = typename std::remove_const::type>::type>::type; // make sure the type matches the allowed types static_assert( std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value or std::is_same::value , "incompatible pointer type"); // delegate the call to get_impl_ptr<>() const return get_impl_ptr(static_cast(nullptr)); } /*! @brief get a reference value (implicit) Implicit reference access to the internally stored JSON value. No copies are made. @warning Writing data to the referee of the result yields an undefined state. @tparam ReferenceType reference type; must be a reference to @ref array_t, @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or @ref number_float_t. Enforced by static assertion. @return reference to the internally stored JSON value if the requested reference type @a ReferenceType fits to the JSON value; throws type_error.303 otherwise @throw type_error.303 in case passed type @a ReferenceType is incompatible with the stored JSON value; see example below @complexity Constant. @liveexample{The example shows several calls to `get_ref()`.,get_ref} @since version 1.1.0 */ template::value, int>::type = 0> ReferenceType get_ref() { // delegate call to get_ref_impl return get_ref_impl(*this); } /*! @brief get a reference value (implicit) @copydoc get_ref() */ template::value and std::is_const::type>::value, int>::type = 0> ReferenceType get_ref() const { // delegate call to get_ref_impl return get_ref_impl(*this); } /*! @brief get a value (implicit) Implicit type conversion between the JSON value and a compatible value. The call is realized by calling @ref get() const. @tparam ValueType non-pointer type compatible to the JSON value, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for JSON arrays. The character type of @ref string_t as well as an initializer list of this type is excluded to avoid ambiguities as these types implicitly convert to `std::string`. @return copy of the JSON value, converted to type @a ValueType @throw type_error.302 in case passed type @a ValueType is incompatible to the JSON value type (e.g., the JSON value is of type boolean, but a string is requested); see example below @complexity Linear in the size of the JSON value. @liveexample{The example below shows several conversions from JSON values to other types. There a few things to note: (1) Floating-point numbers can be converted to integers\, (2) A JSON array can be converted to a standard `std::vector`\, (3) A JSON object can be converted to C++ associative containers such as `std::unordered_map`.,operator__ValueType} @since version 1.0.0 */ template < typename ValueType, typename std::enable_if < not std::is_pointer::value and not std::is_same>::value and not std::is_same::value #ifndef _MSC_VER // fix for issue #167 operator<< ambiguity under VS2015 and not std::is_same>::value #endif #if defined(JSON_HAS_CPP_17) and not std::is_same::value #endif , int >::type = 0 > operator ValueType() const { // delegate the call to get<>() const return get(); } /// @} //////////////////// // element access // //////////////////// /// @name element access /// Access to the JSON value. /// @{ /*! @brief access specified array element with bounds checking Returns a reference to the element at specified location @a idx, with bounds checking. @param[in] idx index of the element to access @return reference to the element at index @a idx @throw type_error.304 if the JSON value is not an array; in this case, calling `at` with an index makes no sense. See example below. @throw out_of_range.401 if the index @a idx is out of range of the array; that is, `idx >= size()`. See example below. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Constant. @since version 1.0.0 @liveexample{The example below shows how array elements can be read and written using `at()`. It also demonstrates the different exceptions that can be thrown.,at__size_type} */ reference at(size_type idx) { // at only works for arrays if (JSON_LIKELY(is_array())) { JSON_TRY { return m_value.array->at(idx); } JSON_CATCH (std::out_of_range&) { // create better exception explanation JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); } } else { JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); } } /*! @brief access specified array element with bounds checking Returns a const reference to the element at specified location @a idx, with bounds checking. @param[in] idx index of the element to access @return const reference to the element at index @a idx @throw type_error.304 if the JSON value is not an array; in this case, calling `at` with an index makes no sense. See example below. @throw out_of_range.401 if the index @a idx is out of range of the array; that is, `idx >= size()`. See example below. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Constant. @since version 1.0.0 @liveexample{The example below shows how array elements can be read using `at()`. It also demonstrates the different exceptions that can be thrown., at__size_type_const} */ const_reference at(size_type idx) const { // at only works for arrays if (JSON_LIKELY(is_array())) { JSON_TRY { return m_value.array->at(idx); } JSON_CATCH (std::out_of_range&) { // create better exception explanation JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); } } else { JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); } } /*! @brief access specified object element with bounds checking Returns a reference to the element at with specified key @a key, with bounds checking. @param[in] key key of the element to access @return reference to the element at key @a key @throw type_error.304 if the JSON value is not an object; in this case, calling `at` with a key makes no sense. See example below. @throw out_of_range.403 if the key @a key is is not stored in the object; that is, `find(key) == end()`. See example below. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Logarithmic in the size of the container. @sa @ref operator[](const typename object_t::key_type&) for unchecked access by reference @sa @ref value() for access by value with a default value @since version 1.0.0 @liveexample{The example below shows how object elements can be read and written using `at()`. It also demonstrates the different exceptions that can be thrown.,at__object_t_key_type} */ reference at(const typename object_t::key_type& key) { // at only works for objects if (JSON_LIKELY(is_object())) { JSON_TRY { return m_value.object->at(key); } JSON_CATCH (std::out_of_range&) { // create better exception explanation JSON_THROW(out_of_range::create(403, "key '" + key + "' not found")); } } else { JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); } } /*! @brief access specified object element with bounds checking Returns a const reference to the element at with specified key @a key, with bounds checking. @param[in] key key of the element to access @return const reference to the element at key @a key @throw type_error.304 if the JSON value is not an object; in this case, calling `at` with a key makes no sense. See example below. @throw out_of_range.403 if the key @a key is is not stored in the object; that is, `find(key) == end()`. See example below. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Logarithmic in the size of the container. @sa @ref operator[](const typename object_t::key_type&) for unchecked access by reference @sa @ref value() for access by value with a default value @since version 1.0.0 @liveexample{The example below shows how object elements can be read using `at()`. It also demonstrates the different exceptions that can be thrown., at__object_t_key_type_const} */ const_reference at(const typename object_t::key_type& key) const { // at only works for objects if (JSON_LIKELY(is_object())) { JSON_TRY { return m_value.object->at(key); } JSON_CATCH (std::out_of_range&) { // create better exception explanation JSON_THROW(out_of_range::create(403, "key '" + key + "' not found")); } } else { JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); } } /*! @brief access specified array element Returns a reference to the element at specified location @a idx. @note If @a idx is beyond the range of the array (i.e., `idx >= size()`), then the array is silently filled up with `null` values to make `idx` a valid reference to the last stored element. @param[in] idx index of the element to access @return reference to the element at index @a idx @throw type_error.305 if the JSON value is not an array or null; in that cases, using the [] operator with an index makes no sense. @complexity Constant if @a idx is in the range of the array. Otherwise linear in `idx - size()`. @liveexample{The example below shows how array elements can be read and written using `[]` operator. Note the addition of `null` values.,operatorarray__size_type} @since version 1.0.0 */ reference operator[](size_type idx) { // implicitly convert null value to an empty array if (is_null()) { m_type = value_t::array; m_value.array = create(); assert_invariant(); } // operator[] only works for arrays if (JSON_LIKELY(is_array())) { // fill up array with null values if given idx is outside range if (idx >= m_value.array->size()) { m_value.array->insert(m_value.array->end(), idx - m_value.array->size() + 1, basic_json()); } return m_value.array->operator[](idx); } JSON_THROW(type_error::create(305, "cannot use operator[] with " + std::string(type_name()))); } /*! @brief access specified array element Returns a const reference to the element at specified location @a idx. @param[in] idx index of the element to access @return const reference to the element at index @a idx @throw type_error.305 if the JSON value is not an array; in that case, using the [] operator with an index makes no sense. @complexity Constant. @liveexample{The example below shows how array elements can be read using the `[]` operator.,operatorarray__size_type_const} @since version 1.0.0 */ const_reference operator[](size_type idx) const { // const operator[] only works for arrays if (JSON_LIKELY(is_array())) { return m_value.array->operator[](idx); } JSON_THROW(type_error::create(305, "cannot use operator[] with " + std::string(type_name()))); } /*! @brief access specified object element Returns a reference to the element at with specified key @a key. @note If @a key is not found in the object, then it is silently added to the object and filled with a `null` value to make `key` a valid reference. In case the value was `null` before, it is converted to an object. @param[in] key key of the element to access @return reference to the element at key @a key @throw type_error.305 if the JSON value is not an object or null; in that cases, using the [] operator with a key makes no sense. @complexity Logarithmic in the size of the container. @liveexample{The example below shows how object elements can be read and written using the `[]` operator.,operatorarray__key_type} @sa @ref at(const typename object_t::key_type&) for access by reference with range checking @sa @ref value() for access by value with a default value @since version 1.0.0 */ reference operator[](const typename object_t::key_type& key) { // implicitly convert null value to an empty object if (is_null()) { m_type = value_t::object; m_value.object = create(); assert_invariant(); } // operator[] only works for objects if (JSON_LIKELY(is_object())) { return m_value.object->operator[](key); } JSON_THROW(type_error::create(305, "cannot use operator[] with " + std::string(type_name()))); } /*! @brief read-only access specified object element Returns a const reference to the element at with specified key @a key. No bounds checking is performed. @warning If the element with key @a key does not exist, the behavior is undefined. @param[in] key key of the element to access @return const reference to the element at key @a key @pre The element with key @a key must exist. **This precondition is enforced with an assertion.** @throw type_error.305 if the JSON value is not an object; in that case, using the [] operator with a key makes no sense. @complexity Logarithmic in the size of the container. @liveexample{The example below shows how object elements can be read using the `[]` operator.,operatorarray__key_type_const} @sa @ref at(const typename object_t::key_type&) for access by reference with range checking @sa @ref value() for access by value with a default value @since version 1.0.0 */ const_reference operator[](const typename object_t::key_type& key) const { // const operator[] only works for objects if (JSON_LIKELY(is_object())) { assert(m_value.object->find(key) != m_value.object->end()); return m_value.object->find(key)->second; } JSON_THROW(type_error::create(305, "cannot use operator[] with " + std::string(type_name()))); } /*! @brief access specified object element Returns a reference to the element at with specified key @a key. @note If @a key is not found in the object, then it is silently added to the object and filled with a `null` value to make `key` a valid reference. In case the value was `null` before, it is converted to an object. @param[in] key key of the element to access @return reference to the element at key @a key @throw type_error.305 if the JSON value is not an object or null; in that cases, using the [] operator with a key makes no sense. @complexity Logarithmic in the size of the container. @liveexample{The example below shows how object elements can be read and written using the `[]` operator.,operatorarray__key_type} @sa @ref at(const typename object_t::key_type&) for access by reference with range checking @sa @ref value() for access by value with a default value @since version 1.1.0 */ template reference operator[](T* key) { // implicitly convert null to object if (is_null()) { m_type = value_t::object; m_value = value_t::object; assert_invariant(); } // at only works for objects if (JSON_LIKELY(is_object())) { return m_value.object->operator[](key); } JSON_THROW(type_error::create(305, "cannot use operator[] with " + std::string(type_name()))); } /*! @brief read-only access specified object element Returns a const reference to the element at with specified key @a key. No bounds checking is performed. @warning If the element with key @a key does not exist, the behavior is undefined. @param[in] key key of the element to access @return const reference to the element at key @a key @pre The element with key @a key must exist. **This precondition is enforced with an assertion.** @throw type_error.305 if the JSON value is not an object; in that case, using the [] operator with a key makes no sense. @complexity Logarithmic in the size of the container. @liveexample{The example below shows how object elements can be read using the `[]` operator.,operatorarray__key_type_const} @sa @ref at(const typename object_t::key_type&) for access by reference with range checking @sa @ref value() for access by value with a default value @since version 1.1.0 */ template const_reference operator[](T* key) const { // at only works for objects if (JSON_LIKELY(is_object())) { assert(m_value.object->find(key) != m_value.object->end()); return m_value.object->find(key)->second; } JSON_THROW(type_error::create(305, "cannot use operator[] with " + std::string(type_name()))); } /*! @brief access specified object element with default value Returns either a copy of an object's element at the specified key @a key or a given default value if no element with key @a key exists. The function is basically equivalent to executing @code {.cpp} try { return at(key); } catch(out_of_range) { return default_value; } @endcode @note Unlike @ref at(const typename object_t::key_type&), this function does not throw if the given key @a key was not found. @note Unlike @ref operator[](const typename object_t::key_type& key), this function does not implicitly add an element to the position defined by @a key. This function is furthermore also applicable to const objects. @param[in] key key of the element to access @param[in] default_value the value to return if @a key is not found @tparam ValueType type compatible to JSON values, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for JSON arrays. Note the type of the expected value at @a key and the default value @a default_value must be compatible. @return copy of the element at key @a key or @a default_value if @a key is not found @throw type_error.306 if the JSON value is not an object; in that case, using `value()` with a key makes no sense. @complexity Logarithmic in the size of the container. @liveexample{The example below shows how object elements can be queried with a default value.,basic_json__value} @sa @ref at(const typename object_t::key_type&) for access by reference with range checking @sa @ref operator[](const typename object_t::key_type&) for unchecked access by reference @since version 1.0.0 */ template::value, int>::type = 0> ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const { // at only works for objects if (JSON_LIKELY(is_object())) { // if key is found, return value and given default value otherwise const auto it = find(key); if (it != end()) { return *it; } return default_value; } JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()))); } /*! @brief overload for a default value of type const char* @copydoc basic_json::value(const typename object_t::key_type&, ValueType) const */ string_t value(const typename object_t::key_type& key, const char* default_value) const { return value(key, string_t(default_value)); } /*! @brief access specified object element via JSON Pointer with default value Returns either a copy of an object's element at the specified key @a key or a given default value if no element with key @a key exists. The function is basically equivalent to executing @code {.cpp} try { return at(ptr); } catch(out_of_range) { return default_value; } @endcode @note Unlike @ref at(const json_pointer&), this function does not throw if the given key @a key was not found. @param[in] ptr a JSON pointer to the element to access @param[in] default_value the value to return if @a ptr found no value @tparam ValueType type compatible to JSON values, for instance `int` for JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for JSON arrays. Note the type of the expected value at @a key and the default value @a default_value must be compatible. @return copy of the element at key @a key or @a default_value if @a key is not found @throw type_error.306 if the JSON value is not an objec; in that case, using `value()` with a key makes no sense. @complexity Logarithmic in the size of the container. @liveexample{The example below shows how object elements can be queried with a default value.,basic_json__value_ptr} @sa @ref operator[](const json_pointer&) for unchecked access by reference @since version 2.0.2 */ template::value, int>::type = 0> ValueType value(const json_pointer& ptr, const ValueType& default_value) const { // at only works for objects if (JSON_LIKELY(is_object())) { // if pointer resolves a value, return it or use default value JSON_TRY { return ptr.get_checked(this); } JSON_CATCH (out_of_range&) { return default_value; } } JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()))); } /*! @brief overload for a default value of type const char* @copydoc basic_json::value(const json_pointer&, ValueType) const */ string_t value(const json_pointer& ptr, const char* default_value) const { return value(ptr, string_t(default_value)); } /*! @brief access the first element Returns a reference to the first element in the container. For a JSON container `c`, the expression `c.front()` is equivalent to `*c.begin()`. @return In case of a structured type (array or object), a reference to the first element is returned. In case of number, string, or boolean values, a reference to the value is returned. @complexity Constant. @pre The JSON value must not be `null` (would throw `std::out_of_range`) or an empty array or object (undefined behavior, **guarded by assertions**). @post The JSON value remains unchanged. @throw invalid_iterator.214 when called on `null` value @liveexample{The following code shows an example for `front()`.,front} @sa @ref back() -- access the last element @since version 1.0.0 */ reference front() { return *begin(); } /*! @copydoc basic_json::front() */ const_reference front() const { return *cbegin(); } /*! @brief access the last element Returns a reference to the last element in the container. For a JSON container `c`, the expression `c.back()` is equivalent to @code {.cpp} auto tmp = c.end(); --tmp; return *tmp; @endcode @return In case of a structured type (array or object), a reference to the last element is returned. In case of number, string, or boolean values, a reference to the value is returned. @complexity Constant. @pre The JSON value must not be `null` (would throw `std::out_of_range`) or an empty array or object (undefined behavior, **guarded by assertions**). @post The JSON value remains unchanged. @throw invalid_iterator.214 when called on a `null` value. See example below. @liveexample{The following code shows an example for `back()`.,back} @sa @ref front() -- access the first element @since version 1.0.0 */ reference back() { auto tmp = end(); --tmp; return *tmp; } /*! @copydoc basic_json::back() */ const_reference back() const { auto tmp = cend(); --tmp; return *tmp; } /*! @brief remove element given an iterator Removes the element specified by iterator @a pos. The iterator @a pos must be valid and dereferenceable. Thus the `end()` iterator (which is valid, but is not dereferenceable) cannot be used as a value for @a pos. If called on a primitive type other than `null`, the resulting JSON value will be `null`. @param[in] pos iterator to the element to remove @return Iterator following the last removed element. If the iterator @a pos refers to the last element, the `end()` iterator is returned. @tparam IteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. @throw type_error.307 if called on a `null` value; example: `"cannot use erase() with null"` @throw invalid_iterator.202 if called on an iterator which does not belong to the current JSON value; example: `"iterator does not fit current value"` @throw invalid_iterator.205 if called on a primitive type with invalid iterator (i.e., any iterator which is not `begin()`); example: `"iterator out of range"` @complexity The complexity depends on the type: - objects: amortized constant - arrays: linear in distance between @a pos and the end of the container - strings: linear in the length of the string - other types: constant @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType} @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @sa @ref erase(const size_type) -- removes the element from an array at the given index @since version 1.0.0 */ template::value or std::is_same::value, int>::type = 0> IteratorType erase(IteratorType pos) { // make sure iterator fits the current value if (JSON_UNLIKELY(this != pos.m_object)) { JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); } IteratorType result = end(); switch (m_type) { case value_t::boolean: case value_t::number_float: case value_t::number_integer: case value_t::number_unsigned: case value_t::string: { if (JSON_UNLIKELY(not pos.m_it.primitive_iterator.is_begin())) { JSON_THROW(invalid_iterator::create(205, "iterator out of range")); } if (is_string()) { AllocatorType alloc; std::allocator_traits::destroy(alloc, m_value.string); std::allocator_traits::deallocate(alloc, m_value.string, 1); m_value.string = nullptr; } m_type = value_t::null; assert_invariant(); break; } case value_t::object: { result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); break; } case value_t::array: { result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); break; } default: JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); } return result; } /*! @brief remove elements given an iterator range Removes the element specified by the range `[first; last)`. The iterator @a first does not need to be dereferenceable if `first == last`: erasing an empty range is a no-op. If called on a primitive type other than `null`, the resulting JSON value will be `null`. @param[in] first iterator to the beginning of the range to remove @param[in] last iterator past the end of the range to remove @return Iterator following the last removed element. If the iterator @a second refers to the last element, the `end()` iterator is returned. @tparam IteratorType an @ref iterator or @ref const_iterator @post Invalidates iterators and references at or after the point of the erase, including the `end()` iterator. @throw type_error.307 if called on a `null` value; example: `"cannot use erase() with null"` @throw invalid_iterator.203 if called on iterators which does not belong to the current JSON value; example: `"iterators do not fit current value"` @throw invalid_iterator.204 if called on a primitive type with invalid iterators (i.e., if `first != begin()` and `last != end()`); example: `"iterators out of range"` @complexity The complexity depends on the type: - objects: `log(size()) + std::distance(first, last)` - arrays: linear in the distance between @a first and @a last, plus linear in the distance between @a last and end of the container - strings: linear in the length of the string - other types: constant @liveexample{The example shows the result of `erase()` for different JSON types.,erase__IteratorType_IteratorType} @sa @ref erase(IteratorType) -- removes the element at a given position @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @sa @ref erase(const size_type) -- removes the element from an array at the given index @since version 1.0.0 */ template::value or std::is_same::value, int>::type = 0> IteratorType erase(IteratorType first, IteratorType last) { // make sure iterator fits the current value if (JSON_UNLIKELY(this != first.m_object or this != last.m_object)) { JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value")); } IteratorType result = end(); switch (m_type) { case value_t::boolean: case value_t::number_float: case value_t::number_integer: case value_t::number_unsigned: case value_t::string: { if (JSON_LIKELY(not first.m_it.primitive_iterator.is_begin() or not last.m_it.primitive_iterator.is_end())) { JSON_THROW(invalid_iterator::create(204, "iterators out of range")); } if (is_string()) { AllocatorType alloc; std::allocator_traits::destroy(alloc, m_value.string); std::allocator_traits::deallocate(alloc, m_value.string, 1); m_value.string = nullptr; } m_type = value_t::null; assert_invariant(); break; } case value_t::object: { result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, last.m_it.object_iterator); break; } case value_t::array: { result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, last.m_it.array_iterator); break; } default: JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); } return result; } /*! @brief remove element from a JSON object given a key Removes elements from a JSON object with the key value @a key. @param[in] key value of the elements to remove @return Number of elements removed. If @a ObjectType is the default `std::map` type, the return value will always be `0` (@a key was not found) or `1` (@a key was found). @post References and iterators to the erased elements are invalidated. Other references and iterators are not affected. @throw type_error.307 when called on a type other than JSON object; example: `"cannot use erase() with null"` @complexity `log(size()) + count(key)` @liveexample{The example shows the effect of `erase()`.,erase__key_type} @sa @ref erase(IteratorType) -- removes the element at a given position @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const size_type) -- removes the element from an array at the given index @since version 1.0.0 */ size_type erase(const typename object_t::key_type& key) { // this erase only works for objects if (JSON_LIKELY(is_object())) { return m_value.object->erase(key); } JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); } /*! @brief remove element from a JSON array given an index Removes element from a JSON array at the index @a idx. @param[in] idx index of the element to remove @throw type_error.307 when called on a type other than JSON object; example: `"cannot use erase() with null"` @throw out_of_range.401 when `idx >= size()`; example: `"array index 17 is out of range"` @complexity Linear in distance between @a idx and the end of the container. @liveexample{The example shows the effect of `erase()`.,erase__size_type} @sa @ref erase(IteratorType) -- removes the element at a given position @sa @ref erase(IteratorType, IteratorType) -- removes the elements in the given range @sa @ref erase(const typename object_t::key_type&) -- removes the element from an object at the given key @since version 1.0.0 */ void erase(const size_type idx) { // this erase only works for arrays if (JSON_LIKELY(is_array())) { if (JSON_UNLIKELY(idx >= size())) { JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); } m_value.array->erase(m_value.array->begin() + static_cast(idx)); } else { JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); } } /// @} //////////// // lookup // //////////// /// @name lookup /// @{ /*! @brief find an element in a JSON object Finds an element in a JSON object with key equivalent to @a key. If the element is not found or the JSON value is not an object, end() is returned. @note This method always returns @ref end() when executed on a JSON type that is not an object. @param[in] key key value of the element to search for. @return Iterator to an element with key equivalent to @a key. If no such element is found or the JSON value is not an object, past-the-end (see @ref end()) iterator is returned. @complexity Logarithmic in the size of the JSON object. @liveexample{The example shows how `find()` is used.,find__key_type} @since version 1.0.0 */ template iterator find(KeyT&& key) { auto result = end(); if (is_object()) { result.m_it.object_iterator = m_value.object->find(std::forward(key)); } return result; } /*! @brief find an element in a JSON object @copydoc find(KeyT&&) */ template const_iterator find(KeyT&& key) const { auto result = cend(); if (is_object()) { result.m_it.object_iterator = m_value.object->find(std::forward(key)); } return result; } /*! @brief returns the number of occurrences of a key in a JSON object Returns the number of elements with key @a key. If ObjectType is the default `std::map` type, the return value will always be `0` (@a key was not found) or `1` (@a key was found). @note This method always returns `0` when executed on a JSON type that is not an object. @param[in] key key value of the element to count @return Number of elements with key @a key. If the JSON value is not an object, the return value will be `0`. @complexity Logarithmic in the size of the JSON object. @liveexample{The example shows how `count()` is used.,count} @since version 1.0.0 */ template size_type count(KeyT&& key) const { // return 0 for all nonobject types return is_object() ? m_value.object->count(std::forward(key)) : 0; } /// @} /////////////// // iterators // /////////////// /// @name iterators /// @{ /*! @brief returns an iterator to the first element Returns an iterator to the first element. @image html range-begin-end.svg "Illustration from cppreference.com" @return iterator to the first element @complexity Constant. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. @liveexample{The following code shows an example for `begin()`.,begin} @sa @ref cbegin() -- returns a const iterator to the beginning @sa @ref end() -- returns an iterator to the end @sa @ref cend() -- returns a const iterator to the end @since version 1.0.0 */ iterator begin() noexcept { iterator result(this); result.set_begin(); return result; } /*! @copydoc basic_json::cbegin() */ const_iterator begin() const noexcept { return cbegin(); } /*! @brief returns a const iterator to the first element Returns a const iterator to the first element. @image html range-begin-end.svg "Illustration from cppreference.com" @return const iterator to the first element @complexity Constant. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).begin()`. @liveexample{The following code shows an example for `cbegin()`.,cbegin} @sa @ref begin() -- returns an iterator to the beginning @sa @ref end() -- returns an iterator to the end @sa @ref cend() -- returns a const iterator to the end @since version 1.0.0 */ const_iterator cbegin() const noexcept { const_iterator result(this); result.set_begin(); return result; } /*! @brief returns an iterator to one past the last element Returns an iterator to one past the last element. @image html range-begin-end.svg "Illustration from cppreference.com" @return iterator one past the last element @complexity Constant. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. @liveexample{The following code shows an example for `end()`.,end} @sa @ref cend() -- returns a const iterator to the end @sa @ref begin() -- returns an iterator to the beginning @sa @ref cbegin() -- returns a const iterator to the beginning @since version 1.0.0 */ iterator end() noexcept { iterator result(this); result.set_end(); return result; } /*! @copydoc basic_json::cend() */ const_iterator end() const noexcept { return cend(); } /*! @brief returns a const iterator to one past the last element Returns a const iterator to one past the last element. @image html range-begin-end.svg "Illustration from cppreference.com" @return const iterator one past the last element @complexity Constant. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).end()`. @liveexample{The following code shows an example for `cend()`.,cend} @sa @ref end() -- returns an iterator to the end @sa @ref begin() -- returns an iterator to the beginning @sa @ref cbegin() -- returns a const iterator to the beginning @since version 1.0.0 */ const_iterator cend() const noexcept { const_iterator result(this); result.set_end(); return result; } /*! @brief returns an iterator to the reverse-beginning Returns an iterator to the reverse-beginning; that is, the last element. @image html range-rbegin-rend.svg "Illustration from cppreference.com" @complexity Constant. @requirement This function helps `basic_json` satisfying the [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(end())`. @liveexample{The following code shows an example for `rbegin()`.,rbegin} @sa @ref crbegin() -- returns a const reverse iterator to the beginning @sa @ref rend() -- returns a reverse iterator to the end @sa @ref crend() -- returns a const reverse iterator to the end @since version 1.0.0 */ reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } /*! @copydoc basic_json::crbegin() */ const_reverse_iterator rbegin() const noexcept { return crbegin(); } /*! @brief returns an iterator to the reverse-end Returns an iterator to the reverse-end; that is, one before the first element. @image html range-rbegin-rend.svg "Illustration from cppreference.com" @complexity Constant. @requirement This function helps `basic_json` satisfying the [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `reverse_iterator(begin())`. @liveexample{The following code shows an example for `rend()`.,rend} @sa @ref crend() -- returns a const reverse iterator to the end @sa @ref rbegin() -- returns a reverse iterator to the beginning @sa @ref crbegin() -- returns a const reverse iterator to the beginning @since version 1.0.0 */ reverse_iterator rend() noexcept { return reverse_iterator(begin()); } /*! @copydoc basic_json::crend() */ const_reverse_iterator rend() const noexcept { return crend(); } /*! @brief returns a const reverse iterator to the last element Returns a const iterator to the reverse-beginning; that is, the last element. @image html range-rbegin-rend.svg "Illustration from cppreference.com" @complexity Constant. @requirement This function helps `basic_json` satisfying the [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rbegin()`. @liveexample{The following code shows an example for `crbegin()`.,crbegin} @sa @ref rbegin() -- returns a reverse iterator to the beginning @sa @ref rend() -- returns a reverse iterator to the end @sa @ref crend() -- returns a const reverse iterator to the end @since version 1.0.0 */ const_reverse_iterator crbegin() const noexcept { return const_reverse_iterator(cend()); } /*! @brief returns a const reverse iterator to one before the first Returns a const reverse iterator to the reverse-end; that is, one before the first element. @image html range-rbegin-rend.svg "Illustration from cppreference.com" @complexity Constant. @requirement This function helps `basic_json` satisfying the [ReversibleContainer](http://en.cppreference.com/w/cpp/concept/ReversibleContainer) requirements: - The complexity is constant. - Has the semantics of `const_cast(*this).rend()`. @liveexample{The following code shows an example for `crend()`.,crend} @sa @ref rend() -- returns a reverse iterator to the end @sa @ref rbegin() -- returns a reverse iterator to the beginning @sa @ref crbegin() -- returns a const reverse iterator to the beginning @since version 1.0.0 */ const_reverse_iterator crend() const noexcept { return const_reverse_iterator(cbegin()); } public: /*! @brief wrapper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref iterator::value() during range-based for loops. In these loops, a reference to the JSON values is returned, so there is no access to the underlying iterator. For loop without iterator_wrapper: @code{cpp} for (auto it = j_object.begin(); it != j_object.end(); ++it) { std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; } @endcode Range-based for loop without iterator proxy: @code{cpp} for (auto it : j_object) { // "it" is of type json::reference and has no key() member std::cout << "value: " << it << '\n'; } @endcode Range-based for loop with iterator proxy: @code{cpp} for (auto it : json::iterator_wrapper(j_object)) { std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; } @endcode @note When iterating over an array, `key()` will return the index of the element as string (see example). @param[in] ref reference to a JSON value @return iteration proxy object wrapping @a ref with an interface to use in range-based for loops @liveexample{The following code shows how the wrapper is used,iterator_wrapper} @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Constant. @note The name of this function is not yet final and may change in the future. @deprecated This stream operator is deprecated and will be removed in future 4.0.0 of the library. Please use @ref items() instead; that is, replace `json::iterator_wrapper(j)` with `j.items()`. */ JSON_DEPRECATED static iteration_proxy iterator_wrapper(reference ref) noexcept { return ref.items(); } /*! @copydoc iterator_wrapper(reference) */ JSON_DEPRECATED static iteration_proxy iterator_wrapper(const_reference ref) noexcept { return ref.items(); } /*! @brief helper to access iterator member functions in range-based for This function allows to access @ref iterator::key() and @ref iterator::value() during range-based for loops. In these loops, a reference to the JSON values is returned, so there is no access to the underlying iterator. For loop without `items()` function: @code{cpp} for (auto it = j_object.begin(); it != j_object.end(); ++it) { std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; } @endcode Range-based for loop without `items()` function: @code{cpp} for (auto it : j_object) { // "it" is of type json::reference and has no key() member std::cout << "value: " << it << '\n'; } @endcode Range-based for loop with `items()` function: @code{cpp} for (auto it : j_object.items()) { std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; } @endcode @note When iterating over an array, `key()` will return the index of the element as string (see example). For primitive types (e.g., numbers), `key()` returns an empty string. @return iteration proxy object wrapping @a ref with an interface to use in range-based for loops @liveexample{The following code shows how the function is used.,items} @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Constant. @since version 3.x.x. */ iteration_proxy items() noexcept { return iteration_proxy(*this); } /*! @copydoc items() */ iteration_proxy items() const noexcept { return iteration_proxy(*this); } /// @} ////////////// // capacity // ////////////// /// @name capacity /// @{ /*! @brief checks whether the container is empty. Checks if a JSON value has no elements (i.e. whether its @ref size is `0`). @return The return value depends on the different types and is defined as follows: Value type | return value ----------- | ------------- null | `true` boolean | `false` string | `false` number | `false` object | result of function `object_t::empty()` array | result of function `array_t::empty()` @liveexample{The following code uses `empty()` to check if a JSON object contains any elements.,empty} @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their `empty()` functions have constant complexity. @iterators No changes. @exceptionsafety No-throw guarantee: this function never throws exceptions. @note This function does not return whether a string stored as JSON value is empty - it returns whether the JSON container itself is empty which is false in the case of a string. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `begin() == end()`. @sa @ref size() -- returns the number of elements @since version 1.0.0 */ bool empty() const noexcept { switch (m_type) { case value_t::null: { // null values are empty return true; } case value_t::array: { // delegate call to array_t::empty() return m_value.array->empty(); } case value_t::object: { // delegate call to object_t::empty() return m_value.object->empty(); } default: { // all other types are nonempty return false; } } } /*! @brief returns the number of elements Returns the number of elements in a JSON value. @return The return value depends on the different types and is defined as follows: Value type | return value ----------- | ------------- null | `0` boolean | `1` string | `1` number | `1` object | result of function object_t::size() array | result of function array_t::size() @liveexample{The following code calls `size()` on the different value types.,size} @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their size() functions have constant complexity. @iterators No changes. @exceptionsafety No-throw guarantee: this function never throws exceptions. @note This function does not return the length of a string stored as JSON value - it returns the number of elements in the JSON value which is 1 in the case of a string. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of `std::distance(begin(), end())`. @sa @ref empty() -- checks whether the container is empty @sa @ref max_size() -- returns the maximal number of elements @since version 1.0.0 */ size_type size() const noexcept { switch (m_type) { case value_t::null: { // null values are empty return 0; } case value_t::array: { // delegate call to array_t::size() return m_value.array->size(); } case value_t::object: { // delegate call to object_t::size() return m_value.object->size(); } default: { // all other types have size 1 return 1; } } } /*! @brief returns the maximum possible number of elements Returns the maximum number of elements a JSON value is able to hold due to system or library implementation limitations, i.e. `std::distance(begin(), end())` for the JSON value. @return The return value depends on the different types and is defined as follows: Value type | return value ----------- | ------------- null | `0` (same as `size()`) boolean | `1` (same as `size()`) string | `1` (same as `size()`) number | `1` (same as `size()`) object | result of function `object_t::max_size()` array | result of function `array_t::max_size()` @liveexample{The following code calls `max_size()` on the different value types. Note the output is implementation specific.,max_size} @complexity Constant, as long as @ref array_t and @ref object_t satisfy the Container concept; that is, their `max_size()` functions have constant complexity. @iterators No changes. @exceptionsafety No-throw guarantee: this function never throws exceptions. @requirement This function helps `basic_json` satisfying the [Container](http://en.cppreference.com/w/cpp/concept/Container) requirements: - The complexity is constant. - Has the semantics of returning `b.size()` where `b` is the largest possible JSON value. @sa @ref size() -- returns the number of elements @since version 1.0.0 */ size_type max_size() const noexcept { switch (m_type) { case value_t::array: { // delegate call to array_t::max_size() return m_value.array->max_size(); } case value_t::object: { // delegate call to object_t::max_size() return m_value.object->max_size(); } default: { // all other types have max_size() == size() return size(); } } } /// @} /////////////// // modifiers // /////////////// /// @name modifiers /// @{ /*! @brief clears the contents Clears the content of a JSON value and resets it to the default value as if @ref basic_json(value_t) would have been called with the current value type from @ref type(): Value type | initial value ----------- | ------------- null | `null` boolean | `false` string | `""` number | `0` object | `{}` array | `[]` @post Has the same effect as calling @code {.cpp} *this = basic_json(type()); @endcode @liveexample{The example below shows the effect of `clear()` to different JSON types.,clear} @complexity Linear in the size of the JSON value. @iterators All iterators, pointers and references related to this container are invalidated. @exceptionsafety No-throw guarantee: this function never throws exceptions. @sa @ref basic_json(value_t) -- constructor that creates an object with the same value than calling `clear()` @since version 1.0.0 */ void clear() noexcept { switch (m_type) { case value_t::number_integer: { m_value.number_integer = 0; break; } case value_t::number_unsigned: { m_value.number_unsigned = 0; break; } case value_t::number_float: { m_value.number_float = 0.0; break; } case value_t::boolean: { m_value.boolean = false; break; } case value_t::string: { m_value.string->clear(); break; } case value_t::array: { m_value.array->clear(); break; } case value_t::object: { m_value.object->clear(); break; } default: break; } } /*! @brief add an object to an array Appends the given element @a val to the end of the JSON value. If the function is called on a JSON null value, an empty array is created before appending @a val. @param[in] val the value to add to the JSON array @throw type_error.308 when called on a type other than JSON array or null; example: `"cannot use push_back() with number"` @complexity Amortized constant. @liveexample{The example shows how `push_back()` and `+=` can be used to add elements to a JSON array. Note how the `null` value was silently converted to a JSON array.,push_back} @since version 1.0.0 */ void push_back(basic_json&& val) { // push_back only works for null objects or arrays if (JSON_UNLIKELY(not(is_null() or is_array()))) { JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()))); } // transform null object into an array if (is_null()) { m_type = value_t::array; m_value = value_t::array; assert_invariant(); } // add element to array (move semantics) m_value.array->push_back(std::move(val)); // invalidate object val.m_type = value_t::null; } /*! @brief add an object to an array @copydoc push_back(basic_json&&) */ reference operator+=(basic_json&& val) { push_back(std::move(val)); return *this; } /*! @brief add an object to an array @copydoc push_back(basic_json&&) */ void push_back(const basic_json& val) { // push_back only works for null objects or arrays if (JSON_UNLIKELY(not(is_null() or is_array()))) { JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()))); } // transform null object into an array if (is_null()) { m_type = value_t::array; m_value = value_t::array; assert_invariant(); } // add element to array m_value.array->push_back(val); } /*! @brief add an object to an array @copydoc push_back(basic_json&&) */ reference operator+=(const basic_json& val) { push_back(val); return *this; } /*! @brief add an object to an object Inserts the given element @a val to the JSON object. If the function is called on a JSON null value, an empty object is created before inserting @a val. @param[in] val the value to add to the JSON object @throw type_error.308 when called on a type other than JSON object or null; example: `"cannot use push_back() with number"` @complexity Logarithmic in the size of the container, O(log(`size()`)). @liveexample{The example shows how `push_back()` and `+=` can be used to add elements to a JSON object. Note how the `null` value was silently converted to a JSON object.,push_back__object_t__value} @since version 1.0.0 */ void push_back(const typename object_t::value_type& val) { // push_back only works for null objects or objects if (JSON_UNLIKELY(not(is_null() or is_object()))) { JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()))); } // transform null object into an object if (is_null()) { m_type = value_t::object; m_value = value_t::object; assert_invariant(); } // add element to array m_value.object->insert(val); } /*! @brief add an object to an object @copydoc push_back(const typename object_t::value_type&) */ reference operator+=(const typename object_t::value_type& val) { push_back(val); return *this; } /*! @brief add an object to an object This function allows to use `push_back` with an initializer list. In case 1. the current value is an object, 2. the initializer list @a init contains only two elements, and 3. the first element of @a init is a string, @a init is converted into an object element and added using @ref push_back(const typename object_t::value_type&). Otherwise, @a init is converted to a JSON value and added using @ref push_back(basic_json&&). @param[in] init an initializer list @complexity Linear in the size of the initializer list @a init. @note This function is required to resolve an ambiguous overload error, because pairs like `{"key", "value"}` can be both interpreted as `object_t::value_type` or `std::initializer_list`, see https://github.com/nlohmann/json/issues/235 for more information. @liveexample{The example shows how initializer lists are treated as objects when possible.,push_back__initializer_list} */ void push_back(initializer_list_t init) { if (is_object() and init.size() == 2 and (*init.begin())->is_string()) { basic_json&& key = init.begin()->moved_or_copied(); push_back(typename object_t::value_type( std::move(key.get_ref()), (init.begin() + 1)->moved_or_copied())); } else { push_back(basic_json(init)); } } /*! @brief add an object to an object @copydoc push_back(initializer_list_t) */ reference operator+=(initializer_list_t init) { push_back(init); return *this; } /*! @brief add an object to an array Creates a JSON value from the passed parameters @a args to the end of the JSON value. If the function is called on a JSON null value, an empty array is created before appending the value created from @a args. @param[in] args arguments to forward to a constructor of @ref basic_json @tparam Args compatible types to create a @ref basic_json object @throw type_error.311 when called on a type other than JSON array or null; example: `"cannot use emplace_back() with number"` @complexity Amortized constant. @liveexample{The example shows how `push_back()` can be used to add elements to a JSON array. Note how the `null` value was silently converted to a JSON array.,emplace_back} @since version 2.0.8 */ template void emplace_back(Args&& ... args) { // emplace_back only works for null objects or arrays if (JSON_UNLIKELY(not(is_null() or is_array()))) { JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name()))); } // transform null object into an array if (is_null()) { m_type = value_t::array; m_value = value_t::array; assert_invariant(); } // add element to array (perfect forwarding) m_value.array->emplace_back(std::forward(args)...); } /*! @brief add an object to an object if key does not exist Inserts a new element into a JSON object constructed in-place with the given @a args if there is no element with the key in the container. If the function is called on a JSON null value, an empty object is created before appending the value created from @a args. @param[in] args arguments to forward to a constructor of @ref basic_json @tparam Args compatible types to create a @ref basic_json object @return a pair consisting of an iterator to the inserted element, or the already-existing element if no insertion happened, and a bool denoting whether the insertion took place. @throw type_error.311 when called on a type other than JSON object or null; example: `"cannot use emplace() with number"` @complexity Logarithmic in the size of the container, O(log(`size()`)). @liveexample{The example shows how `emplace()` can be used to add elements to a JSON object. Note how the `null` value was silently converted to a JSON object. Further note how no value is added if there was already one value stored with the same key.,emplace} @since version 2.0.8 */ template std::pair emplace(Args&& ... args) { // emplace only works for null objects or arrays if (JSON_UNLIKELY(not(is_null() or is_object()))) { JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name()))); } // transform null object into an object if (is_null()) { m_type = value_t::object; m_value = value_t::object; assert_invariant(); } // add element to array (perfect forwarding) auto res = m_value.object->emplace(std::forward(args)...); // create result iterator and set iterator to the result of emplace auto it = begin(); it.m_it.object_iterator = res.first; // return pair of iterator and boolean return {it, res.second}; } /*! @brief inserts element Inserts element @a val before iterator @a pos. @param[in] pos iterator before which the content will be inserted; may be the end() iterator @param[in] val element to insert @return iterator pointing to the inserted @a val. @throw type_error.309 if called on JSON values other than arrays; example: `"cannot use insert() with string"` @throw invalid_iterator.202 if @a pos is not an iterator of *this; example: `"iterator does not fit current value"` @complexity Constant plus linear in the distance between @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert} @since version 1.0.0 */ iterator insert(const_iterator pos, const basic_json& val) { // insert only works for arrays if (JSON_LIKELY(is_array())) { // check if iterator pos fits to this JSON value if (JSON_UNLIKELY(pos.m_object != this)) { JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); } // insert to array and return iterator iterator result(this); result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, val); return result; } JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); } /*! @brief inserts element @copydoc insert(const_iterator, const basic_json&) */ iterator insert(const_iterator pos, basic_json&& val) { return insert(pos, val); } /*! @brief inserts elements Inserts @a cnt copies of @a val before iterator @a pos. @param[in] pos iterator before which the content will be inserted; may be the end() iterator @param[in] cnt number of copies of @a val to insert @param[in] val element to insert @return iterator pointing to the first element inserted, or @a pos if `cnt==0` @throw type_error.309 if called on JSON values other than arrays; example: `"cannot use insert() with string"` @throw invalid_iterator.202 if @a pos is not an iterator of *this; example: `"iterator does not fit current value"` @complexity Linear in @a cnt plus linear in the distance between @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__count} @since version 1.0.0 */ iterator insert(const_iterator pos, size_type cnt, const basic_json& val) { // insert only works for arrays if (JSON_LIKELY(is_array())) { // check if iterator pos fits to this JSON value if (JSON_UNLIKELY(pos.m_object != this)) { JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); } // insert to array and return iterator iterator result(this); result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); return result; } JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); } /*! @brief inserts elements Inserts elements from range `[first, last)` before iterator @a pos. @param[in] pos iterator before which the content will be inserted; may be the end() iterator @param[in] first begin of the range of elements to insert @param[in] last end of the range of elements to insert @throw type_error.309 if called on JSON values other than arrays; example: `"cannot use insert() with string"` @throw invalid_iterator.202 if @a pos is not an iterator of *this; example: `"iterator does not fit current value"` @throw invalid_iterator.210 if @a first and @a last do not belong to the same JSON value; example: `"iterators do not fit"` @throw invalid_iterator.211 if @a first or @a last are iterators into container for which insert is called; example: `"passed iterators may not belong to container"` @return iterator pointing to the first element inserted, or @a pos if `first==last` @complexity Linear in `std::distance(first, last)` plus linear in the distance between @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__range} @since version 1.0.0 */ iterator insert(const_iterator pos, const_iterator first, const_iterator last) { // insert only works for arrays if (JSON_UNLIKELY(not is_array())) { JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); } // check if iterator pos fits to this JSON value if (JSON_UNLIKELY(pos.m_object != this)) { JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); } // check if range iterators belong to the same JSON object if (JSON_UNLIKELY(first.m_object != last.m_object)) { JSON_THROW(invalid_iterator::create(210, "iterators do not fit")); } if (JSON_UNLIKELY(first.m_object == this)) { JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container")); } // insert to array and return iterator iterator result(this); result.m_it.array_iterator = m_value.array->insert( pos.m_it.array_iterator, first.m_it.array_iterator, last.m_it.array_iterator); return result; } /*! @brief inserts elements Inserts elements from initializer list @a ilist before iterator @a pos. @param[in] pos iterator before which the content will be inserted; may be the end() iterator @param[in] ilist initializer list to insert the values from @throw type_error.309 if called on JSON values other than arrays; example: `"cannot use insert() with string"` @throw invalid_iterator.202 if @a pos is not an iterator of *this; example: `"iterator does not fit current value"` @return iterator pointing to the first element inserted, or @a pos if `ilist` is empty @complexity Linear in `ilist.size()` plus linear in the distance between @a pos and end of the container. @liveexample{The example shows how `insert()` is used.,insert__ilist} @since version 1.0.0 */ iterator insert(const_iterator pos, initializer_list_t ilist) { // insert only works for arrays if (JSON_UNLIKELY(not is_array())) { JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); } // check if iterator pos fits to this JSON value if (JSON_UNLIKELY(pos.m_object != this)) { JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); } // insert to array and return iterator iterator result(this); result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, ilist.begin(), ilist.end()); return result; } /*! @brief inserts elements Inserts elements from range `[first, last)`. @param[in] first begin of the range of elements to insert @param[in] last end of the range of elements to insert @throw type_error.309 if called on JSON values other than objects; example: `"cannot use insert() with string"` @throw invalid_iterator.202 if iterator @a first or @a last does does not point to an object; example: `"iterators first and last must point to objects"` @throw invalid_iterator.210 if @a first and @a last do not belong to the same JSON value; example: `"iterators do not fit"` @complexity Logarithmic: `O(N*log(size() + N))`, where `N` is the number of elements to insert. @liveexample{The example shows how `insert()` is used.,insert__range_object} @since version 3.0.0 */ void insert(const_iterator first, const_iterator last) { // insert only works for objects if (JSON_UNLIKELY(not is_object())) { JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); } // check if range iterators belong to the same JSON object if (JSON_UNLIKELY(first.m_object != last.m_object)) { JSON_THROW(invalid_iterator::create(210, "iterators do not fit")); } // passed iterators must belong to objects if (JSON_UNLIKELY(not first.m_object->is_object())) { JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects")); } m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); } /*! @brief updates a JSON object from another object, overwriting existing keys Inserts all values from JSON object @a j and overwrites existing keys. @param[in] j JSON object to read values from @throw type_error.312 if called on JSON values other than objects; example: `"cannot use update() with string"` @complexity O(N*log(size() + N)), where N is the number of elements to insert. @liveexample{The example shows how `update()` is used.,update} @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update @since version 3.0.0 */ void update(const_reference j) { // implicitly convert null value to an empty object if (is_null()) { m_type = value_t::object; m_value.object = create(); assert_invariant(); } if (JSON_UNLIKELY(not is_object())) { JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()))); } if (JSON_UNLIKELY(not j.is_object())) { JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(j.type_name()))); } for (auto it = j.cbegin(); it != j.cend(); ++it) { m_value.object->operator[](it.key()) = it.value(); } } /*! @brief updates a JSON object from another object, overwriting existing keys Inserts all values from from range `[first, last)` and overwrites existing keys. @param[in] first begin of the range of elements to insert @param[in] last end of the range of elements to insert @throw type_error.312 if called on JSON values other than objects; example: `"cannot use update() with string"` @throw invalid_iterator.202 if iterator @a first or @a last does does not point to an object; example: `"iterators first and last must point to objects"` @throw invalid_iterator.210 if @a first and @a last do not belong to the same JSON value; example: `"iterators do not fit"` @complexity O(N*log(size() + N)), where N is the number of elements to insert. @liveexample{The example shows how `update()` is used__range.,update} @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update @since version 3.0.0 */ void update(const_iterator first, const_iterator last) { // implicitly convert null value to an empty object if (is_null()) { m_type = value_t::object; m_value.object = create(); assert_invariant(); } if (JSON_UNLIKELY(not is_object())) { JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()))); } // check if range iterators belong to the same JSON object if (JSON_UNLIKELY(first.m_object != last.m_object)) { JSON_THROW(invalid_iterator::create(210, "iterators do not fit")); } // passed iterators must belong to objects if (JSON_UNLIKELY(not first.m_object->is_object() or not first.m_object->is_object())) { JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects")); } for (auto it = first; it != last; ++it) { m_value.object->operator[](it.key()) = it.value(); } } /*! @brief exchanges the values Exchanges the contents of the JSON value with those of @a other. Does not invoke any move, copy, or swap operations on individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. @param[in,out] other JSON value to exchange the contents with @complexity Constant. @liveexample{The example below shows how JSON values can be swapped with `swap()`.,swap__reference} @since version 1.0.0 */ void swap(reference other) noexcept ( std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value and std::is_nothrow_move_constructible::value and std::is_nothrow_move_assignable::value ) { std::swap(m_type, other.m_type); std::swap(m_value, other.m_value); assert_invariant(); } /*! @brief exchanges the values Exchanges the contents of a JSON array with those of @a other. Does not invoke any move, copy, or swap operations on individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. @param[in,out] other array to exchange the contents with @throw type_error.310 when JSON value is not an array; example: `"cannot use swap() with string"` @complexity Constant. @liveexample{The example below shows how arrays can be swapped with `swap()`.,swap__array_t} @since version 1.0.0 */ void swap(array_t& other) { // swap only works for arrays if (JSON_LIKELY(is_array())) { std::swap(*(m_value.array), other); } else { JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); } } /*! @brief exchanges the values Exchanges the contents of a JSON object with those of @a other. Does not invoke any move, copy, or swap operations on individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. @param[in,out] other object to exchange the contents with @throw type_error.310 when JSON value is not an object; example: `"cannot use swap() with string"` @complexity Constant. @liveexample{The example below shows how objects can be swapped with `swap()`.,swap__object_t} @since version 1.0.0 */ void swap(object_t& other) { // swap only works for objects if (JSON_LIKELY(is_object())) { std::swap(*(m_value.object), other); } else { JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); } } /*! @brief exchanges the values Exchanges the contents of a JSON string with those of @a other. Does not invoke any move, copy, or swap operations on individual elements. All iterators and references remain valid. The past-the-end iterator is invalidated. @param[in,out] other string to exchange the contents with @throw type_error.310 when JSON value is not a string; example: `"cannot use swap() with boolean"` @complexity Constant. @liveexample{The example below shows how strings can be swapped with `swap()`.,swap__string_t} @since version 1.0.0 */ void swap(string_t& other) { // swap only works for strings if (JSON_LIKELY(is_string())) { std::swap(*(m_value.string), other); } else { JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); } } /// @} public: ////////////////////////////////////////// // lexicographical comparison operators // ////////////////////////////////////////// /// @name lexicographical comparison operators /// @{ /*! @brief comparison: equal Compares two JSON values for equality according to the following rules: - Two JSON values are equal if (1) they are from the same type and (2) their stored values are the same according to their respective `operator==`. - Integer and floating-point numbers are automatically converted before comparison. Note than two NaN values are always treated as unequal. - Two JSON null values are equal. @note Floating-point inside JSON values numbers are compared with `json::number_float_t::operator==` which is `double::operator==` by default. To compare floating-point while respecting an epsilon, an alternative [comparison function](https://github.com/mariokonrad/marnav/blob/master/src/marnav/math/floatingpoint.hpp#L34-#L39) could be used, for instance @code {.cpp} template::value, T>::type> inline bool is_same(T a, T b, T epsilon = std::numeric_limits::epsilon()) noexcept { return std::abs(a - b) <= epsilon; } @endcode @note NaN values never compare equal to themselves or to other NaN values. @param[in] lhs first JSON value to consider @param[in] rhs second JSON value to consider @return whether the values @a lhs and @a rhs are equal @exceptionsafety No-throw guarantee: this function never throws exceptions. @complexity Linear. @liveexample{The example demonstrates comparing several JSON types.,operator__equal} @since version 1.0.0 */ friend bool operator==(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (lhs_type) { case value_t::array: return (*lhs.m_value.array == *rhs.m_value.array); case value_t::object: return (*lhs.m_value.object == *rhs.m_value.object); case value_t::null: return true; case value_t::string: return (*lhs.m_value.string == *rhs.m_value.string); case value_t::boolean: return (lhs.m_value.boolean == rhs.m_value.boolean); case value_t::number_integer: return (lhs.m_value.number_integer == rhs.m_value.number_integer); case value_t::number_unsigned: return (lhs.m_value.number_unsigned == rhs.m_value.number_unsigned); case value_t::number_float: return (lhs.m_value.number_float == rhs.m_value.number_float); default: return false; } } else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) { return (static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float); } else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) { return (lhs.m_value.number_float == static_cast(rhs.m_value.number_integer)); } else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) { return (static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float); } else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) { return (lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned)); } else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) { return (static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer); } else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) { return (lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned)); } return false; } /*! @brief comparison: equal @copydoc operator==(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept { return (lhs == basic_json(rhs)); } /*! @brief comparison: equal @copydoc operator==(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept { return (basic_json(lhs) == rhs); } /*! @brief comparison: not equal Compares two JSON values for inequality by calculating `not (lhs == rhs)`. @param[in] lhs first JSON value to consider @param[in] rhs second JSON value to consider @return whether the values @a lhs and @a rhs are not equal @complexity Linear. @exceptionsafety No-throw guarantee: this function never throws exceptions. @liveexample{The example demonstrates comparing several JSON types.,operator__notequal} @since version 1.0.0 */ friend bool operator!=(const_reference lhs, const_reference rhs) noexcept { return not (lhs == rhs); } /*! @brief comparison: not equal @copydoc operator!=(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept { return (lhs != basic_json(rhs)); } /*! @brief comparison: not equal @copydoc operator!=(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept { return (basic_json(lhs) != rhs); } /*! @brief comparison: less than Compares whether one JSON value @a lhs is less than another JSON value @a rhs according to the following rules: - If @a lhs and @a rhs have the same type, the values are compared using the default `<` operator. - Integer and floating-point numbers are automatically converted before comparison - In case @a lhs and @a rhs have different types, the values are ignored and the order of the types is considered, see @ref operator<(const value_t, const value_t). @param[in] lhs first JSON value to consider @param[in] rhs second JSON value to consider @return whether @a lhs is less than @a rhs @complexity Linear. @exceptionsafety No-throw guarantee: this function never throws exceptions. @liveexample{The example demonstrates comparing several JSON types.,operator__less} @since version 1.0.0 */ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { const auto lhs_type = lhs.type(); const auto rhs_type = rhs.type(); if (lhs_type == rhs_type) { switch (lhs_type) { case value_t::array: return (*lhs.m_value.array) < (*rhs.m_value.array); case value_t::object: return *lhs.m_value.object < *rhs.m_value.object; case value_t::null: return false; case value_t::string: return *lhs.m_value.string < *rhs.m_value.string; case value_t::boolean: return lhs.m_value.boolean < rhs.m_value.boolean; case value_t::number_integer: return lhs.m_value.number_integer < rhs.m_value.number_integer; case value_t::number_unsigned: return lhs.m_value.number_unsigned < rhs.m_value.number_unsigned; case value_t::number_float: return lhs.m_value.number_float < rhs.m_value.number_float; default: return false; } } else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; } else if (lhs_type == value_t::number_float and rhs_type == value_t::number_integer) { return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); } else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_float) { return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; } else if (lhs_type == value_t::number_float and rhs_type == value_t::number_unsigned) { return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); } else if (lhs_type == value_t::number_integer and rhs_type == value_t::number_unsigned) { return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); } else if (lhs_type == value_t::number_unsigned and rhs_type == value_t::number_integer) { return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; } // We only reach this line if we cannot compare values. In that case, // we compare types. Note we have to call the operator explicitly, // because MSVC has problems otherwise. return operator<(lhs_type, rhs_type); } /*! @brief comparison: less than @copydoc operator<(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator<(const_reference lhs, const ScalarType rhs) noexcept { return (lhs < basic_json(rhs)); } /*! @brief comparison: less than @copydoc operator<(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator<(const ScalarType lhs, const_reference rhs) noexcept { return (basic_json(lhs) < rhs); } /*! @brief comparison: less than or equal Compares whether one JSON value @a lhs is less than or equal to another JSON value by calculating `not (rhs < lhs)`. @param[in] lhs first JSON value to consider @param[in] rhs second JSON value to consider @return whether @a lhs is less than or equal to @a rhs @complexity Linear. @exceptionsafety No-throw guarantee: this function never throws exceptions. @liveexample{The example demonstrates comparing several JSON types.,operator__greater} @since version 1.0.0 */ friend bool operator<=(const_reference lhs, const_reference rhs) noexcept { return not (rhs < lhs); } /*! @brief comparison: less than or equal @copydoc operator<=(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator<=(const_reference lhs, const ScalarType rhs) noexcept { return (lhs <= basic_json(rhs)); } /*! @brief comparison: less than or equal @copydoc operator<=(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator<=(const ScalarType lhs, const_reference rhs) noexcept { return (basic_json(lhs) <= rhs); } /*! @brief comparison: greater than Compares whether one JSON value @a lhs is greater than another JSON value by calculating `not (lhs <= rhs)`. @param[in] lhs first JSON value to consider @param[in] rhs second JSON value to consider @return whether @a lhs is greater than to @a rhs @complexity Linear. @exceptionsafety No-throw guarantee: this function never throws exceptions. @liveexample{The example demonstrates comparing several JSON types.,operator__lessequal} @since version 1.0.0 */ friend bool operator>(const_reference lhs, const_reference rhs) noexcept { return not (lhs <= rhs); } /*! @brief comparison: greater than @copydoc operator>(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator>(const_reference lhs, const ScalarType rhs) noexcept { return (lhs > basic_json(rhs)); } /*! @brief comparison: greater than @copydoc operator>(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator>(const ScalarType lhs, const_reference rhs) noexcept { return (basic_json(lhs) > rhs); } /*! @brief comparison: greater than or equal Compares whether one JSON value @a lhs is greater than or equal to another JSON value by calculating `not (lhs < rhs)`. @param[in] lhs first JSON value to consider @param[in] rhs second JSON value to consider @return whether @a lhs is greater than or equal to @a rhs @complexity Linear. @exceptionsafety No-throw guarantee: this function never throws exceptions. @liveexample{The example demonstrates comparing several JSON types.,operator__greaterequal} @since version 1.0.0 */ friend bool operator>=(const_reference lhs, const_reference rhs) noexcept { return not (lhs < rhs); } /*! @brief comparison: greater than or equal @copydoc operator>=(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator>=(const_reference lhs, const ScalarType rhs) noexcept { return (lhs >= basic_json(rhs)); } /*! @brief comparison: greater than or equal @copydoc operator>=(const_reference, const_reference) */ template::value, int>::type = 0> friend bool operator>=(const ScalarType lhs, const_reference rhs) noexcept { return (basic_json(lhs) >= rhs); } /// @} /////////////////// // serialization // /////////////////// /// @name serialization /// @{ /*! @brief serialize to stream Serialize the given JSON value @a j to the output stream @a o. The JSON value will be serialized using the @ref dump member function. - The indentation of the output can be controlled with the member variable `width` of the output stream @a o. For instance, using the manipulator `std::setw(4)` on @a o sets the indentation level to `4` and the serialization result is the same as calling `dump(4)`. - The indentation character can be controlled with the member variable `fill` of the output stream @a o. For instance, the manipulator `std::setfill('\\t')` sets indentation to use a tab character rather than the default space character. @param[in,out] o stream to serialize to @param[in] j JSON value to serialize @return the stream @a o @throw type_error.316 if a string stored inside the JSON value is not UTF-8 encoded @complexity Linear. @liveexample{The example below shows the serialization with different parameters to `width` to adjust the indentation level.,operator_serialize} @since version 1.0.0; indentation character added in version 3.0.0 */ friend std::ostream& operator<<(std::ostream& o, const basic_json& j) { // read width member and use it as indentation parameter if nonzero const bool pretty_print = (o.width() > 0); const auto indentation = (pretty_print ? o.width() : 0); // reset width to 0 for subsequent calls to this stream o.width(0); // do the actual serialization serializer s(detail::output_adapter(o), o.fill()); s.dump(j, pretty_print, false, static_cast(indentation)); return o; } /*! @brief serialize to stream @deprecated This stream operator is deprecated and will be removed in future 4.0.0 of the library. Please use @ref operator<<(std::ostream&, const basic_json&) instead; that is, replace calls like `j >> o;` with `o << j;`. @since version 1.0.0; deprecated since version 3.0.0 */ JSON_DEPRECATED friend std::ostream& operator>>(const basic_json& j, std::ostream& o) { return o << j; } /// @} ///////////////////// // deserialization // ///////////////////// /// @name deserialization /// @{ /*! @brief deserialize from a compatible input This function reads from a compatible input. Examples are: - an array of 1-byte values - strings with character/literal type with size of 1 byte - input streams - container with contiguous storage of 1-byte values. Compatible container types include `std::vector`, `std::string`, `std::array`, `std::valarray`, and `std::initializer_list`. Furthermore, C-style arrays can be used with `std::begin()`/`std::end()`. User-defined containers can be used as long as they implement random-access iterators and a contiguous storage. @pre Each element of the container has a size of 1 byte. Violating this precondition yields undefined behavior. **This precondition is enforced with a static assertion.** @pre The container storage is contiguous. Violating this precondition yields undefined behavior. **This precondition is enforced with an assertion.** @pre Each element of the container has a size of 1 byte. Violating this precondition yields undefined behavior. **This precondition is enforced with a static assertion.** @warning There is no way to enforce all preconditions at compile-time. If the function is called with a noncompliant container and with assertions switched off, the behavior is undefined and will most likely yield segmentation violation. @param[in] i input to read from @param[in] cb a parser callback function of type @ref parser_callback_t which is used to control the deserialization by filtering unwanted values (optional) @return result of the deserialization @throw parse_error.101 if a parse error occurs; example: `""unexpected end of input; expected string literal""` @throw parse_error.102 if to_unicode fails or surrogate error @throw parse_error.103 if to_unicode fails @complexity Linear in the length of the input. The parser is a predictive LL(1) parser. The complexity can be higher if the parser callback function @a cb has a super-linear complexity. @note A UTF-8 byte order mark is silently ignored. @liveexample{The example below demonstrates the `parse()` function reading from an array.,parse__array__parser_callback_t} @liveexample{The example below demonstrates the `parse()` function with and without callback function.,parse__string__parser_callback_t} @liveexample{The example below demonstrates the `parse()` function with and without callback function.,parse__istream__parser_callback_t} @liveexample{The example below demonstrates the `parse()` function reading from a contiguous container.,parse__contiguouscontainer__parser_callback_t} @since version 2.0.3 (contiguous containers) */ static basic_json parse(detail::input_adapter i, const parser_callback_t cb = nullptr, const bool allow_exceptions = true) { basic_json result; parser(i, cb, allow_exceptions).parse(true, result); return result; } /*! @copydoc basic_json parse(detail::input_adapter, const parser_callback_t) */ static basic_json parse(detail::input_adapter& i, const parser_callback_t cb = nullptr, const bool allow_exceptions = true) { basic_json result; parser(i, cb, allow_exceptions).parse(true, result); return result; } static bool accept(detail::input_adapter i) { return parser(i).accept(true); } static bool accept(detail::input_adapter& i) { return parser(i).accept(true); } /*! @brief deserialize from an iterator range with contiguous storage This function reads from an iterator range of a container with contiguous storage of 1-byte values. Compatible container types include `std::vector`, `std::string`, `std::array`, `std::valarray`, and `std::initializer_list`. Furthermore, C-style arrays can be used with `std::begin()`/`std::end()`. User-defined containers can be used as long as they implement random-access iterators and a contiguous storage. @pre The iterator range is contiguous. Violating this precondition yields undefined behavior. **This precondition is enforced with an assertion.** @pre Each element in the range has a size of 1 byte. Violating this precondition yields undefined behavior. **This precondition is enforced with a static assertion.** @warning There is no way to enforce all preconditions at compile-time. If the function is called with noncompliant iterators and with assertions switched off, the behavior is undefined and will most likely yield segmentation violation. @tparam IteratorType iterator of container with contiguous storage @param[in] first begin of the range to parse (included) @param[in] last end of the range to parse (excluded) @param[in] cb a parser callback function of type @ref parser_callback_t which is used to control the deserialization by filtering unwanted values (optional) @param[in] allow_exceptions whether to throw exceptions in case of a parse error (optional, true by default) @return result of the deserialization @throw parse_error.101 in case of an unexpected token @throw parse_error.102 if to_unicode fails or surrogate error @throw parse_error.103 if to_unicode fails @complexity Linear in the length of the input. The parser is a predictive LL(1) parser. The complexity can be higher if the parser callback function @a cb has a super-linear complexity. @note A UTF-8 byte order mark is silently ignored. @liveexample{The example below demonstrates the `parse()` function reading from an iterator range.,parse__iteratortype__parser_callback_t} @since version 2.0.3 */ template::iterator_category>::value, int>::type = 0> static basic_json parse(IteratorType first, IteratorType last, const parser_callback_t cb = nullptr, const bool allow_exceptions = true) { basic_json result; parser(detail::input_adapter(first, last), cb, allow_exceptions).parse(true, result); return result; } template::iterator_category>::value, int>::type = 0> static bool accept(IteratorType first, IteratorType last) { return parser(detail::input_adapter(first, last)).accept(true); } /*! @brief deserialize from stream @deprecated This stream operator is deprecated and will be removed in version 4.0.0 of the library. Please use @ref operator>>(std::istream&, basic_json&) instead; that is, replace calls like `j << i;` with `i >> j;`. @since version 1.0.0; deprecated since version 3.0.0 */ JSON_DEPRECATED friend std::istream& operator<<(basic_json& j, std::istream& i) { return operator>>(i, j); } /*! @brief deserialize from stream Deserializes an input stream to a JSON value. @param[in,out] i input stream to read a serialized JSON value from @param[in,out] j JSON value to write the deserialized input to @throw parse_error.101 in case of an unexpected token @throw parse_error.102 if to_unicode fails or surrogate error @throw parse_error.103 if to_unicode fails @complexity Linear in the length of the input. The parser is a predictive LL(1) parser. @note A UTF-8 byte order mark is silently ignored. @liveexample{The example below shows how a JSON value is constructed by reading a serialization from a stream.,operator_deserialize} @sa parse(std::istream&, const parser_callback_t) for a variant with a parser callback function to filter values while parsing @since version 1.0.0 */ friend std::istream& operator>>(std::istream& i, basic_json& j) { parser(detail::input_adapter(i)).parse(false, j); return i; } /// @} /////////////////////////// // convenience functions // /////////////////////////// /*! @brief return the type as string Returns the type name as string to be used in error messages - usually to indicate that a function was called on a wrong JSON type. @return a string representation of a the @a m_type member: Value type | return value ----------- | ------------- null | `"null"` boolean | `"boolean"` string | `"string"` number | `"number"` (for all number types) object | `"object"` array | `"array"` discarded | `"discarded"` @exceptionsafety No-throw guarantee: this function never throws exceptions. @complexity Constant. @liveexample{The following code exemplifies `type_name()` for all JSON types.,type_name} @sa @ref type() -- return the type of the JSON value @sa @ref operator value_t() -- return the type of the JSON value (implicit) @since version 1.0.0, public since 2.1.0, `const char*` and `noexcept` since 3.0.0 */ const char* type_name() const noexcept { { switch (m_type) { case value_t::null: return "null"; case value_t::object: return "object"; case value_t::array: return "array"; case value_t::string: return "string"; case value_t::boolean: return "boolean"; case value_t::discarded: return "discarded"; default: return "number"; } } } private: ////////////////////// // member variables // ////////////////////// /// the type of the current element value_t m_type = value_t::null; /// the value of the current element json_value m_value = {}; ////////////////////////////////////////// // binary serialization/deserialization // ////////////////////////////////////////// /// @name binary serialization/deserialization support /// @{ public: /*! @brief create a CBOR serialization of a given JSON value Serializes a given JSON value @a j to a byte vector using the CBOR (Concise Binary Object Representation) serialization format. CBOR is a binary serialization format which aims to be more compact than JSON itself, yet more efficient to parse. The library uses the following mapping from JSON values types to CBOR types according to the CBOR specification (RFC 7049): JSON value type | value/range | CBOR type | first byte --------------- | ------------------------------------------ | ---------------------------------- | --------------- null | `null` | Null | 0xF6 boolean | `true` | True | 0xF5 boolean | `false` | False | 0xF4 number_integer | -9223372036854775808..-2147483649 | Negative integer (8 bytes follow) | 0x3B number_integer | -2147483648..-32769 | Negative integer (4 bytes follow) | 0x3A number_integer | -32768..-129 | Negative integer (2 bytes follow) | 0x39 number_integer | -128..-25 | Negative integer (1 byte follow) | 0x38 number_integer | -24..-1 | Negative integer | 0x20..0x37 number_integer | 0..23 | Integer | 0x00..0x17 number_integer | 24..255 | Unsigned integer (1 byte follow) | 0x18 number_integer | 256..65535 | Unsigned integer (2 bytes follow) | 0x19 number_integer | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1A number_integer | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1B number_unsigned | 0..23 | Integer | 0x00..0x17 number_unsigned | 24..255 | Unsigned integer (1 byte follow) | 0x18 number_unsigned | 256..65535 | Unsigned integer (2 bytes follow) | 0x19 number_unsigned | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1A number_unsigned | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1B number_float | *any value* | Double-Precision Float | 0xFB string | *length*: 0..23 | UTF-8 string | 0x60..0x77 string | *length*: 23..255 | UTF-8 string (1 byte follow) | 0x78 string | *length*: 256..65535 | UTF-8 string (2 bytes follow) | 0x79 string | *length*: 65536..4294967295 | UTF-8 string (4 bytes follow) | 0x7A string | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow) | 0x7B array | *size*: 0..23 | array | 0x80..0x97 array | *size*: 23..255 | array (1 byte follow) | 0x98 array | *size*: 256..65535 | array (2 bytes follow) | 0x99 array | *size*: 65536..4294967295 | array (4 bytes follow) | 0x9A array | *size*: 4294967296..18446744073709551615 | array (8 bytes follow) | 0x9B object | *size*: 0..23 | map | 0xA0..0xB7 object | *size*: 23..255 | map (1 byte follow) | 0xB8 object | *size*: 256..65535 | map (2 bytes follow) | 0xB9 object | *size*: 65536..4294967295 | map (4 bytes follow) | 0xBA object | *size*: 4294967296..18446744073709551615 | map (8 bytes follow) | 0xBB @note The mapping is **complete** in the sense that any JSON value type can be converted to a CBOR value. @note If NaN or Infinity are stored inside a JSON number, they are serialized properly. This behavior differs from the @ref dump() function which serializes NaN or Infinity to `null`. @note The following CBOR types are not used in the conversion: - byte strings (0x40..0x5F) - UTF-8 strings terminated by "break" (0x7F) - arrays terminated by "break" (0x9F) - maps terminated by "break" (0xBF) - date/time (0xC0..0xC1) - bignum (0xC2..0xC3) - decimal fraction (0xC4) - bigfloat (0xC5) - tagged items (0xC6..0xD4, 0xD8..0xDB) - expected conversions (0xD5..0xD7) - simple values (0xE0..0xF3, 0xF8) - undefined (0xF7) - half and single-precision floats (0xF9-0xFA) - break (0xFF) @param[in] j JSON value to serialize @return MessagePack serialization as byte vector @complexity Linear in the size of the JSON value @a j. @liveexample{The example shows the serialization of a JSON value to a byte vector in CBOR format.,to_cbor} @sa http://cbor.io @sa @ref from_cbor(detail::input_adapter, const bool strict) for the analogous deserialization @sa @ref to_msgpack(const basic_json&) for the related MessagePack format @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the related UBJSON format @since version 2.0.9 */ static std::vector to_cbor(const basic_json& j) { std::vector result; to_cbor(j, result); return result; } static void to_cbor(const basic_json& j, detail::output_adapter o) { binary_writer(o).write_cbor(j); } static void to_cbor(const basic_json& j, detail::output_adapter o) { binary_writer(o).write_cbor(j); } /*! @brief create a MessagePack serialization of a given JSON value Serializes a given JSON value @a j to a byte vector using the MessagePack serialization format. MessagePack is a binary serialization format which aims to be more compact than JSON itself, yet more efficient to parse. The library uses the following mapping from JSON values types to MessagePack types according to the MessagePack specification: JSON value type | value/range | MessagePack type | first byte --------------- | --------------------------------- | ---------------- | ---------- null | `null` | nil | 0xC0 boolean | `true` | true | 0xC3 boolean | `false` | false | 0xC2 number_integer | -9223372036854775808..-2147483649 | int64 | 0xD3 number_integer | -2147483648..-32769 | int32 | 0xD2 number_integer | -32768..-129 | int16 | 0xD1 number_integer | -128..-33 | int8 | 0xD0 number_integer | -32..-1 | negative fixint | 0xE0..0xFF number_integer | 0..127 | positive fixint | 0x00..0x7F number_integer | 128..255 | uint 8 | 0xCC number_integer | 256..65535 | uint 16 | 0xCD number_integer | 65536..4294967295 | uint 32 | 0xCE number_integer | 4294967296..18446744073709551615 | uint 64 | 0xCF number_unsigned | 0..127 | positive fixint | 0x00..0x7F number_unsigned | 128..255 | uint 8 | 0xCC number_unsigned | 256..65535 | uint 16 | 0xCD number_unsigned | 65536..4294967295 | uint 32 | 0xCE number_unsigned | 4294967296..18446744073709551615 | uint 64 | 0xCF number_float | *any value* | float 64 | 0xCB string | *length*: 0..31 | fixstr | 0xA0..0xBF string | *length*: 32..255 | str 8 | 0xD9 string | *length*: 256..65535 | str 16 | 0xDA string | *length*: 65536..4294967295 | str 32 | 0xDB array | *size*: 0..15 | fixarray | 0x90..0x9F array | *size*: 16..65535 | array 16 | 0xDC array | *size*: 65536..4294967295 | array 32 | 0xDD object | *size*: 0..15 | fix map | 0x80..0x8F object | *size*: 16..65535 | map 16 | 0xDE object | *size*: 65536..4294967295 | map 32 | 0xDF @note The mapping is **complete** in the sense that any JSON value type can be converted to a MessagePack value. @note The following values can **not** be converted to a MessagePack value: - strings with more than 4294967295 bytes - arrays with more than 4294967295 elements - objects with more than 4294967295 elements @note The following MessagePack types are not used in the conversion: - bin 8 - bin 32 (0xC4..0xC6) - ext 8 - ext 32 (0xC7..0xC9) - float 32 (0xCA) - fixext 1 - fixext 16 (0xD4..0xD8) @note Any MessagePack output created @ref to_msgpack can be successfully parsed by @ref from_msgpack. @note If NaN or Infinity are stored inside a JSON number, they are serialized properly. This behavior differs from the @ref dump() function which serializes NaN or Infinity to `null`. @param[in] j JSON value to serialize @return MessagePack serialization as byte vector @complexity Linear in the size of the JSON value @a j. @liveexample{The example shows the serialization of a JSON value to a byte vector in MessagePack format.,to_msgpack} @sa http://msgpack.org @sa @ref from_msgpack(const std::vector&, const size_t) for the analogous deserialization @sa @ref to_cbor(const basic_json& for the related CBOR format @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the related UBJSON format @since version 2.0.9 */ static std::vector to_msgpack(const basic_json& j) { std::vector result; to_msgpack(j, result); return result; } static void to_msgpack(const basic_json& j, detail::output_adapter o) { binary_writer(o).write_msgpack(j); } static void to_msgpack(const basic_json& j, detail::output_adapter o) { binary_writer(o).write_msgpack(j); } /*! @brief create a UBJSON serialization of a given JSON value Serializes a given JSON value @a j to a byte vector using the UBJSON (Universal Binary JSON) serialization format. UBJSON aims to be more compact than JSON itself, yet more efficient to parse. The library uses the following mapping from JSON values types to UBJSON types according to the UBJSON specification: JSON value type | value/range | UBJSON type | marker --------------- | --------------------------------- | ----------- | ------ null | `null` | null | `Z` boolean | `true` | true | `T` boolean | `false` | false | `F` number_integer | -9223372036854775808..-2147483649 | int64 | `L` number_integer | -2147483648..-32769 | int32 | `l` number_integer | -32768..-129 | int16 | `I` number_integer | -128..127 | int8 | `i` number_integer | 128..255 | uint8 | `U` number_integer | 256..32767 | int16 | `I` number_integer | 32768..2147483647 | int32 | `l` number_integer | 2147483648..9223372036854775807 | int64 | `L` number_unsigned | 0..127 | int8 | `i` number_unsigned | 128..255 | uint8 | `U` number_unsigned | 256..32767 | int16 | `I` number_unsigned | 32768..2147483647 | int32 | `l` number_unsigned | 2147483648..9223372036854775807 | int64 | `L` number_float | *any value* | float64 | `D` string | *with shortest length indicator* | string | `S` array | *see notes on optimized format* | array | `[` object | *see notes on optimized format* | map | `{` @note The mapping is **complete** in the sense that any JSON value type can be converted to a UBJSON value. @note The following values can **not** be converted to a UBJSON value: - strings with more than 9223372036854775807 bytes (theoretical) - unsigned integer numbers above 9223372036854775807 @note The following markers are not used in the conversion: - `Z`: no-op values are not created. - `C`: single-byte strings are serialized with `S` markers. @note Any UBJSON output created @ref to_ubjson can be successfully parsed by @ref from_ubjson. @note If NaN or Infinity are stored inside a JSON number, they are serialized properly. This behavior differs from the @ref dump() function which serializes NaN or Infinity to `null`. @note The optimized formats for containers are supported: Parameter @a use_size adds size information to the beginning of a container and removes the closing marker. Parameter @a use_type further checks whether all elements of a container have the same type and adds the type marker to the beginning of the container. The @a use_type parameter must only be used together with @a use_size = true. Note that @a use_size = true alone may result in larger representations - the benefit of this parameter is that the receiving side is immediately informed on the number of elements of the container. @param[in] j JSON value to serialize @param[in] use_size whether to add size annotations to container types @param[in] use_type whether to add type annotations to container types (must be combined with @a use_size = true) @return UBJSON serialization as byte vector @complexity Linear in the size of the JSON value @a j. @liveexample{The example shows the serialization of a JSON value to a byte vector in UBJSON format.,to_ubjson} @sa http://ubjson.org @sa @ref from_ubjson(detail::input_adapter, const bool strict) for the analogous deserialization @sa @ref to_cbor(const basic_json& for the related CBOR format @sa @ref to_msgpack(const basic_json&) for the related MessagePack format @since version 3.1.0 */ static std::vector to_ubjson(const basic_json& j, const bool use_size = false, const bool use_type = false) { std::vector result; to_ubjson(j, result, use_size, use_type); return result; } static void to_ubjson(const basic_json& j, detail::output_adapter o, const bool use_size = false, const bool use_type = false) { binary_writer(o).write_ubjson(j, use_size, use_type); } static void to_ubjson(const basic_json& j, detail::output_adapter o, const bool use_size = false, const bool use_type = false) { binary_writer(o).write_ubjson(j, use_size, use_type); } /*! @brief create a JSON value from an input in CBOR format Deserializes a given input @a i to a JSON value using the CBOR (Concise Binary Object Representation) serialization format. The library maps CBOR types to JSON value types as follows: CBOR type | JSON value type | first byte ---------------------- | --------------- | ---------- Integer | number_unsigned | 0x00..0x17 Unsigned integer | number_unsigned | 0x18 Unsigned integer | number_unsigned | 0x19 Unsigned integer | number_unsigned | 0x1A Unsigned integer | number_unsigned | 0x1B Negative integer | number_integer | 0x20..0x37 Negative integer | number_integer | 0x38 Negative integer | number_integer | 0x39 Negative integer | number_integer | 0x3A Negative integer | number_integer | 0x3B Negative integer | number_integer | 0x40..0x57 UTF-8 string | string | 0x60..0x77 UTF-8 string | string | 0x78 UTF-8 string | string | 0x79 UTF-8 string | string | 0x7A UTF-8 string | string | 0x7B UTF-8 string | string | 0x7F array | array | 0x80..0x97 array | array | 0x98 array | array | 0x99 array | array | 0x9A array | array | 0x9B array | array | 0x9F map | object | 0xA0..0xB7 map | object | 0xB8 map | object | 0xB9 map | object | 0xBA map | object | 0xBB map | object | 0xBF False | `false` | 0xF4 True | `true` | 0xF5 Nill | `null` | 0xF6 Half-Precision Float | number_float | 0xF9 Single-Precision Float | number_float | 0xFA Double-Precision Float | number_float | 0xFB @warning The mapping is **incomplete** in the sense that not all CBOR types can be converted to a JSON value. The following CBOR types are not supported and will yield parse errors (parse_error.112): - byte strings (0x40..0x5F) - date/time (0xC0..0xC1) - bignum (0xC2..0xC3) - decimal fraction (0xC4) - bigfloat (0xC5) - tagged items (0xC6..0xD4, 0xD8..0xDB) - expected conversions (0xD5..0xD7) - simple values (0xE0..0xF3, 0xF8) - undefined (0xF7) @warning CBOR allows map keys of any type, whereas JSON only allows strings as keys in object values. Therefore, CBOR maps with keys other than UTF-8 strings are rejected (parse_error.113). @note Any CBOR output created @ref to_cbor can be successfully parsed by @ref from_cbor. @param[in] i an input in CBOR format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) @return deserialized JSON value @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @throw parse_error.112 if unsupported features from CBOR were used in the given input @a v or if the input is not valid CBOR @throw parse_error.113 if a string was expected as map key, but not found @complexity Linear in the size of the input @a i. @liveexample{The example shows the deserialization of a byte vector in CBOR format to a JSON value.,from_cbor} @sa http://cbor.io @sa @ref to_cbor(const basic_json&) for the analogous serialization @sa @ref from_msgpack(detail::input_adapter, const bool) for the related MessagePack format @sa @ref from_ubjson(detail::input_adapter, const bool) for the related UBJSON format @since version 2.0.9; parameter @a start_index since 2.1.1; changed to consume input adapters, removed start_index parameter, and added @a strict parameter since 3.0.0 */ static basic_json from_cbor(detail::input_adapter i, const bool strict = true) { return binary_reader(i).parse_cbor(strict); } /*! @copydoc from_cbor(detail::input_adapter, const bool) */ template::value, int> = 0> static basic_json from_cbor(A1 && a1, A2 && a2, const bool strict = true) { return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_cbor(strict); } /*! @brief create a JSON value from an input in MessagePack format Deserializes a given input @a i to a JSON value using the MessagePack serialization format. The library maps MessagePack types to JSON value types as follows: MessagePack type | JSON value type | first byte ---------------- | --------------- | ---------- positive fixint | number_unsigned | 0x00..0x7F fixmap | object | 0x80..0x8F fixarray | array | 0x90..0x9F fixstr | string | 0xA0..0xBF nil | `null` | 0xC0 false | `false` | 0xC2 true | `true` | 0xC3 float 32 | number_float | 0xCA float 64 | number_float | 0xCB uint 8 | number_unsigned | 0xCC uint 16 | number_unsigned | 0xCD uint 32 | number_unsigned | 0xCE uint 64 | number_unsigned | 0xCF int 8 | number_integer | 0xD0 int 16 | number_integer | 0xD1 int 32 | number_integer | 0xD2 int 64 | number_integer | 0xD3 str 8 | string | 0xD9 str 16 | string | 0xDA str 32 | string | 0xDB array 16 | array | 0xDC array 32 | array | 0xDD map 16 | object | 0xDE map 32 | object | 0xDF negative fixint | number_integer | 0xE0-0xFF @warning The mapping is **incomplete** in the sense that not all MessagePack types can be converted to a JSON value. The following MessagePack types are not supported and will yield parse errors: - bin 8 - bin 32 (0xC4..0xC6) - ext 8 - ext 32 (0xC7..0xC9) - fixext 1 - fixext 16 (0xD4..0xD8) @note Any MessagePack output created @ref to_msgpack can be successfully parsed by @ref from_msgpack. @param[in] i an input in MessagePack format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @throw parse_error.112 if unsupported features from MessagePack were used in the given input @a i or if the input is not valid MessagePack @throw parse_error.113 if a string was expected as map key, but not found @complexity Linear in the size of the input @a i. @liveexample{The example shows the deserialization of a byte vector in MessagePack format to a JSON value.,from_msgpack} @sa http://msgpack.org @sa @ref to_msgpack(const basic_json&) for the analogous serialization @sa @ref from_cbor(detail::input_adapter, const bool) for the related CBOR format @sa @ref from_ubjson(detail::input_adapter, const bool) for the related UBJSON format @since version 2.0.9; parameter @a start_index since 2.1.1; changed to consume input adapters, removed start_index parameter, and added @a strict parameter since 3.0.0 */ static basic_json from_msgpack(detail::input_adapter i, const bool strict = true) { return binary_reader(i).parse_msgpack(strict); } /*! @copydoc from_msgpack(detail::input_adapter, const bool) */ template::value, int> = 0> static basic_json from_msgpack(A1 && a1, A2 && a2, const bool strict = true) { return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_msgpack(strict); } /*! @brief create a JSON value from an input in UBJSON format Deserializes a given input @a i to a JSON value using the UBJSON (Universal Binary JSON) serialization format. The library maps UBJSON types to JSON value types as follows: UBJSON type | JSON value type | marker ----------- | --------------------------------------- | ------ no-op | *no value, next value is read* | `N` null | `null` | `Z` false | `false` | `F` true | `true` | `T` float32 | number_float | `d` float64 | number_float | `D` uint8 | number_unsigned | `U` int8 | number_integer | `i` int16 | number_integer | `I` int32 | number_integer | `l` int64 | number_integer | `L` string | string | `S` char | string | `C` array | array (optimized values are supported) | `[` object | object (optimized values are supported) | `{` @note The mapping is **complete** in the sense that any UBJSON value can be converted to a JSON value. @param[in] i an input in UBJSON format convertible to an input adapter @param[in] strict whether to expect the input to be consumed until EOF (true by default) @throw parse_error.110 if the given input ends prematurely or the end of file was not reached when @a strict was set to true @throw parse_error.112 if a parse error occurs @throw parse_error.113 if a string could not be parsed successfully @complexity Linear in the size of the input @a i. @liveexample{The example shows the deserialization of a byte vector in UBJSON format to a JSON value.,from_ubjson} @sa http://ubjson.org @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the analogous serialization @sa @ref from_cbor(detail::input_adapter, const bool) for the related CBOR format @sa @ref from_msgpack(detail::input_adapter, const bool) for the related MessagePack format @since version 3.1.0 */ static basic_json from_ubjson(detail::input_adapter i, const bool strict = true) { return binary_reader(i).parse_ubjson(strict); } template::value, int> = 0> static basic_json from_ubjson(A1 && a1, A2 && a2, const bool strict = true) { return binary_reader(detail::input_adapter(std::forward(a1), std::forward(a2))).parse_ubjson(strict); } /// @} ////////////////////////// // JSON Pointer support // ////////////////////////// /// @name JSON Pointer functions /// @{ /*! @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. No bound checking is performed. Similar to @ref operator[](const typename object_t::key_type&), `null` values are created in arrays and objects if necessary. In particular: - If the JSON pointer points to an object key that does not exist, it is created an filled with a `null` value before a reference to it is returned. - If the JSON pointer points to an array index that does not exist, it is created an filled with a `null` value before a reference to it is returned. All indices between the current maximum and the given index are also filled with `null`. - The special value `-` is treated as a synonym for the index past the end. @param[in] ptr a JSON pointer @return reference to the element pointed to by @a ptr @complexity Constant. @throw parse_error.106 if an array index begins with '0' @throw parse_error.109 if an array index was not a number @throw out_of_range.404 if the JSON pointer can not be resolved @liveexample{The behavior is shown in the example.,operatorjson_pointer} @since version 2.0.0 */ reference operator[](const json_pointer& ptr) { return ptr.get_unchecked(this); } /*! @brief access specified element via JSON Pointer Uses a JSON pointer to retrieve a reference to the respective JSON value. No bound checking is performed. The function does not change the JSON value; no `null` values are created. In particular, the the special value `-` yields an exception. @param[in] ptr JSON pointer to the desired element @return const reference to the element pointed to by @a ptr @complexity Constant. @throw parse_error.106 if an array index begins with '0' @throw parse_error.109 if an array index was not a number @throw out_of_range.402 if the array index '-' is used @throw out_of_range.404 if the JSON pointer can not be resolved @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} @since version 2.0.0 */ const_reference operator[](const json_pointer& ptr) const { return ptr.get_unchecked(this); } /*! @brief access specified element via JSON Pointer Returns a reference to the element at with specified JSON pointer @a ptr, with bounds checking. @param[in] ptr JSON pointer to the desired element @return reference to the element pointed to by @a ptr @throw parse_error.106 if an array index in the passed JSON pointer @a ptr begins with '0'. See example below. @throw parse_error.109 if an array index in the passed JSON pointer @a ptr is not a number. See example below. @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr is out of range. See example below. @throw out_of_range.402 if the array index '-' is used in the passed JSON pointer @a ptr. As `at` provides checked access (and no elements are implicitly inserted), the index '-' is always invalid. See example below. @throw out_of_range.403 if the JSON pointer describes a key of an object which cannot be found. See example below. @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved. See example below. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Constant. @since version 2.0.0 @liveexample{The behavior is shown in the example.,at_json_pointer} */ reference at(const json_pointer& ptr) { return ptr.get_checked(this); } /*! @brief access specified element via JSON Pointer Returns a const reference to the element at with specified JSON pointer @a ptr, with bounds checking. @param[in] ptr JSON pointer to the desired element @return reference to the element pointed to by @a ptr @throw parse_error.106 if an array index in the passed JSON pointer @a ptr begins with '0'. See example below. @throw parse_error.109 if an array index in the passed JSON pointer @a ptr is not a number. See example below. @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr is out of range. See example below. @throw out_of_range.402 if the array index '-' is used in the passed JSON pointer @a ptr. As `at` provides checked access (and no elements are implicitly inserted), the index '-' is always invalid. See example below. @throw out_of_range.403 if the JSON pointer describes a key of an object which cannot be found. See example below. @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved. See example below. @exceptionsafety Strong guarantee: if an exception is thrown, there are no changes in the JSON value. @complexity Constant. @since version 2.0.0 @liveexample{The behavior is shown in the example.,at_json_pointer_const} */ const_reference at(const json_pointer& ptr) const { return ptr.get_checked(this); } /*! @brief return flattened JSON value The function creates a JSON object whose keys are JSON pointers (see [RFC 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all primitive. The original JSON value can be restored using the @ref unflatten() function. @return an object that maps JSON pointers to primitive values @note Empty objects and arrays are flattened to `null` and will not be reconstructed correctly by the @ref unflatten() function. @complexity Linear in the size the JSON value. @liveexample{The following code shows how a JSON object is flattened to an object whose keys consist of JSON pointers.,flatten} @sa @ref unflatten() for the reverse function @since version 2.0.0 */ basic_json flatten() const { basic_json result(value_t::object); json_pointer::flatten("", *this, result); return result; } /*! @brief unflatten a previously flattened JSON value The function restores the arbitrary nesting of a JSON value that has been flattened before using the @ref flatten() function. The JSON value must meet certain constraints: 1. The value must be an object. 2. The keys must be JSON pointers (see [RFC 6901](https://tools.ietf.org/html/rfc6901)) 3. The mapped values must be primitive JSON types. @return the original JSON from a flattened version @note Empty objects and arrays are flattened by @ref flatten() to `null` values and can not unflattened to their original type. Apart from this example, for a JSON value `j`, the following is always true: `j == j.flatten().unflatten()`. @complexity Linear in the size the JSON value. @throw type_error.314 if value is not an object @throw type_error.315 if object values are not primitive @liveexample{The following code shows how a flattened JSON object is unflattened into the original nested JSON object.,unflatten} @sa @ref flatten() for the reverse function @since version 2.0.0 */ basic_json unflatten() const { return json_pointer::unflatten(*this); } /// @} ////////////////////////// // JSON Patch functions // ////////////////////////// /// @name JSON Patch functions /// @{ /*! @brief applies a JSON patch [JSON Patch](http://jsonpatch.com) defines a JSON document structure for expressing a sequence of operations to apply to a JSON) document. With this function, a JSON Patch is applied to the current JSON value by executing all operations from the patch. @param[in] json_patch JSON patch document @return patched document @note The application of a patch is atomic: Either all operations succeed and the patched document is returned or an exception is thrown. In any case, the original value is not changed: the patch is applied to a copy of the value. @throw parse_error.104 if the JSON patch does not consist of an array of objects @throw parse_error.105 if the JSON patch is malformed (e.g., mandatory attributes are missing); example: `"operation add must have member path"` @throw out_of_range.401 if an array index is out of range. @throw out_of_range.403 if a JSON pointer inside the patch could not be resolved successfully in the current JSON value; example: `"key baz not found"` @throw out_of_range.405 if JSON pointer has no parent ("add", "remove", "move") @throw other_error.501 if "test" operation was unsuccessful @complexity Linear in the size of the JSON value and the length of the JSON patch. As usually only a fraction of the JSON value is affected by the patch, the complexity can usually be neglected. @liveexample{The following code shows how a JSON patch is applied to a value.,patch} @sa @ref diff -- create a JSON patch by comparing two JSON values @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) @since version 2.0.0 */ basic_json patch(const basic_json& json_patch) const { // make a working copy to apply the patch to basic_json result = *this; // the valid JSON Patch operations enum class patch_operations {add, remove, replace, move, copy, test, invalid}; const auto get_op = [](const std::string & op) { if (op == "add") { return patch_operations::add; } if (op == "remove") { return patch_operations::remove; } if (op == "replace") { return patch_operations::replace; } if (op == "move") { return patch_operations::move; } if (op == "copy") { return patch_operations::copy; } if (op == "test") { return patch_operations::test; } return patch_operations::invalid; }; // wrapper for "add" operation; add value at ptr const auto operation_add = [&result](json_pointer & ptr, basic_json val) { // adding to the root of the target document means replacing it if (ptr.is_root()) { result = val; } else { // make sure the top element of the pointer exists json_pointer top_pointer = ptr.top(); if (top_pointer != ptr) { result.at(top_pointer); } // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result[ptr]; switch (parent.m_type) { case value_t::null: case value_t::object: { // use operator[] to add value parent[last_path] = val; break; } case value_t::array: { if (last_path == "-") { // special case: append to back parent.push_back(val); } else { const auto idx = json_pointer::array_index(last_path); if (JSON_UNLIKELY(static_cast(idx) > parent.size())) { // avoid undefined behavior JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); } else { // default case: insert add offset parent.insert(parent.begin() + static_cast(idx), val); } } break; } default: { // if there exists a parent it cannot be primitive assert(false); // LCOV_EXCL_LINE } } } }; // wrapper for "remove" operation; remove value at ptr const auto operation_remove = [&result](json_pointer & ptr) { // get reference to parent of JSON pointer ptr const auto last_path = ptr.pop_back(); basic_json& parent = result.at(ptr); // remove child if (parent.is_object()) { // perform range check auto it = parent.find(last_path); if (JSON_LIKELY(it != parent.end())) { parent.erase(it); } else { JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found")); } } else if (parent.is_array()) { // note erase performs range check parent.erase(static_cast(json_pointer::array_index(last_path))); } }; // type check: top level value must be an array if (JSON_UNLIKELY(not json_patch.is_array())) { JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects")); } // iterate and apply the operations for (const auto& val : json_patch) { // wrapper to get a value for an operation const auto get_value = [&val](const std::string & op, const std::string & member, bool string_type) -> basic_json & { // find value auto it = val.m_value.object->find(member); // context-sensitive error message const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; // check if desired value is present if (JSON_UNLIKELY(it == val.m_value.object->end())) { JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'")); } // check if result is of type string if (JSON_UNLIKELY(string_type and not it->second.is_string())) { JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'")); } // no error: return value return it->second; }; // type check: every element of the array must be an object if (JSON_UNLIKELY(not val.is_object())) { JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects")); } // collect mandatory members const std::string op = get_value("op", "op", true); const std::string path = get_value(op, "path", true); json_pointer ptr(path); switch (get_op(op)) { case patch_operations::add: { operation_add(ptr, get_value("add", "value", false)); break; } case patch_operations::remove: { operation_remove(ptr); break; } case patch_operations::replace: { // the "path" location must exist - use at() result.at(ptr) = get_value("replace", "value", false); break; } case patch_operations::move: { const std::string from_path = get_value("move", "from", true); json_pointer from_ptr(from_path); // the "from" location must exist - use at() basic_json v = result.at(from_ptr); // The move operation is functionally identical to a // "remove" operation on the "from" location, followed // immediately by an "add" operation at the target // location with the value that was just removed. operation_remove(from_ptr); operation_add(ptr, v); break; } case patch_operations::copy: { const std::string from_path = get_value("copy", "from", true); const json_pointer from_ptr(from_path); // the "from" location must exist - use at() basic_json v = result.at(from_ptr); // The copy is functionally identical to an "add" // operation at the target location using the value // specified in the "from" member. operation_add(ptr, v); break; } case patch_operations::test: { bool success = false; JSON_TRY { // check if "value" matches the one at "path" // the "path" location must exist - use at() success = (result.at(ptr) == get_value("test", "value", false)); } JSON_CATCH (out_of_range&) { // ignore out of range errors: success remains false } // throw an exception if test fails if (JSON_UNLIKELY(not success)) { JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump())); } break; } case patch_operations::invalid: { // op must be "add", "remove", "replace", "move", "copy", or // "test" JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid")); } } } return result; } /*! @brief creates a diff as a JSON patch Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can be changed into the value @a target by calling @ref patch function. @invariant For two JSON values @a source and @a target, the following code yields always `true`: @code {.cpp} source.patch(diff(source, target)) == target; @endcode @note Currently, only `remove`, `add`, and `replace` operations are generated. @param[in] source JSON value to compare from @param[in] target JSON value to compare against @param[in] path helper value to create JSON pointers @return a JSON patch to convert the @a source to @a target @complexity Linear in the lengths of @a source and @a target. @liveexample{The following code shows how a JSON patch is created as a diff for two JSON values.,diff} @sa @ref patch -- apply a JSON patch @sa @ref merge_patch -- apply a JSON Merge Patch @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) @since version 2.0.0 */ static basic_json diff(const basic_json& source, const basic_json& target, const std::string& path = "") { // the patch basic_json result(value_t::array); // if the values are the same, return empty patch if (source == target) { return result; } if (source.type() != target.type()) { // different types: replace value result.push_back( { {"op", "replace"}, {"path", path}, {"value", target} }); } else { switch (source.type()) { case value_t::array: { // first pass: traverse common elements std::size_t i = 0; while (i < source.size() and i < target.size()) { // recursive call to compare array values at index i auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); result.insert(result.end(), temp_diff.begin(), temp_diff.end()); ++i; } // i now reached the end of at least one array // in a second pass, traverse the remaining elements // remove my remaining elements const auto end_index = static_cast(result.size()); while (i < source.size()) { // add operations in reverse order to avoid invalid // indices result.insert(result.begin() + end_index, object( { {"op", "remove"}, {"path", path + "/" + std::to_string(i)} })); ++i; } // add other remaining elements while (i < target.size()) { result.push_back( { {"op", "add"}, {"path", path + "/" + std::to_string(i)}, {"value", target[i]} }); ++i; } break; } case value_t::object: { // first pass: traverse this object's elements for (auto it = source.cbegin(); it != source.cend(); ++it) { // escape the key name to be used in a JSON patch const auto key = json_pointer::escape(it.key()); if (target.find(it.key()) != target.end()) { // recursive call to compare object values at key it auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); result.insert(result.end(), temp_diff.begin(), temp_diff.end()); } else { // found a key that is not in o -> remove it result.push_back(object( { {"op", "remove"}, {"path", path + "/" + key} })); } } // second pass: traverse other object's elements for (auto it = target.cbegin(); it != target.cend(); ++it) { if (source.find(it.key()) == source.end()) { // found a key that is not in this -> add it const auto key = json_pointer::escape(it.key()); result.push_back( { {"op", "add"}, {"path", path + "/" + key}, {"value", it.value()} }); } } break; } default: { // both primitive type: replace value result.push_back( { {"op", "replace"}, {"path", path}, {"value", target} }); break; } } } return result; } /// @} //////////////////////////////// // JSON Merge Patch functions // //////////////////////////////// /// @name JSON Merge Patch functions /// @{ /*! @brief applies a JSON Merge Patch The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content. This function applies a merge patch to the current JSON value. The function implements the following algorithm from Section 2 of [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396): ``` define MergePatch(Target, Patch): if Patch is an Object: if Target is not an Object: Target = {} // Ignore the contents and set it to an empty Object for each Name/Value pair in Patch: if Value is null: if Name exists in Target: remove the Name/Value pair from Target else: Target[Name] = MergePatch(Target[Name], Value) return Target else: return Patch ``` Thereby, `Target` is the current object; that is, the patch is applied to the current value. @param[in] patch the patch to apply @complexity Linear in the lengths of @a patch. @liveexample{The following code shows how a JSON Merge Patch is applied to a JSON document.,merge_patch} @sa @ref patch -- apply a JSON patch @sa [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396) @since version 3.0.0 */ void merge_patch(const basic_json& patch) { if (patch.is_object()) { if (not is_object()) { *this = object(); } for (auto it = patch.begin(); it != patch.end(); ++it) { if (it.value().is_null()) { erase(it.key()); } else { operator[](it.key()).merge_patch(it.value()); } } } else { *this = patch; } } /// @} }; } // namespace nlohmann /////////////////////// // nonmember support // /////////////////////// // specialization of std::swap, and std::hash namespace std { /*! @brief exchanges the values of two JSON objects @since version 1.0.0 */ template<> inline void swap(nlohmann::json& j1, nlohmann::json& j2) noexcept( is_nothrow_move_constructible::value and is_nothrow_move_assignable::value ) { j1.swap(j2); } /// hash value for JSON objects template<> struct hash { /*! @brief return a hash value for a JSON object @since version 1.0.0 */ std::size_t operator()(const nlohmann::json& j) const { // a naive hashing via the string representation const auto& h = hash(); return h(j.dump()); } }; /// specialization for std::less /// @note: do not remove the space after '<', /// see https://github.com/nlohmann/json/pull/679 template<> struct less< ::nlohmann::detail::value_t> { /*! @brief compare two value_t enum values @since version 3.0.0 */ bool operator()(nlohmann::detail::value_t lhs, nlohmann::detail::value_t rhs) const noexcept { return nlohmann::detail::operator<(lhs, rhs); } }; } // namespace std /*! @brief user-defined string literal for JSON values This operator implements a user-defined string literal for JSON objects. It can be used by adding `"_json"` to a string literal and returns a JSON object if no parse error occurred. @param[in] s a string representation of a JSON object @param[in] n the length of string @a s @return a JSON object @since version 1.0.0 */ inline nlohmann::json operator "" _json(const char* s, std::size_t n) { return nlohmann::json::parse(s, s + n); } /*! @brief user-defined string literal for JSON pointer This operator implements a user-defined string literal for JSON Pointers. It can be used by adding `"_json_pointer"` to a string literal and returns a JSON pointer object if no parse error occurred. @param[in] s a string representation of a JSON Pointer @param[in] n the length of string @a s @return a JSON pointer object @since version 2.0.0 */ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) { return nlohmann::json::json_pointer(std::string(s, n)); } // #include // restore GCC/clang diagnostic settings #if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) #pragma GCC diagnostic pop #endif #if defined(__clang__) #pragma GCC diagnostic pop #endif // clean up #undef JSON_CATCH #undef JSON_THROW #undef JSON_TRY #undef JSON_LIKELY #undef JSON_UNLIKELY #undef JSON_DEPRECATED #undef JSON_HAS_CPP_14 #undef JSON_HAS_CPP_17 #undef NLOHMANN_BASIC_JSON_TPL_DECLARATION #undef NLOHMANN_BASIC_JSON_TPL #undef NLOHMANN_JSON_HAS_HELPER #endif qiskit-aer-0.4.1/src/third-party/headers/thrust/000077500000000000000000000000001362723322000215675ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/linux/000077500000000000000000000000001362723322000177625ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/linux/lib/000077500000000000000000000000001362723322000205305ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/linux/lib/muparserx.7z000066400000000000000000006204361362723322000230530ustar00rootroot000000000000007z'% j. ]ruMᶃ]?p H'@f8߆%zQNTC Vۜ좣q}0HN U,iҽhzA#Nܽ/wt@HU5E;C\3'b̎G:<"\+rڦSca{!"5QyVJ&sE|\"`j#iK.UCફ7c%ƔH?N6>8RgX6%MOuڱUu~լ FY;-x|cؽʧ8;]Bh"/2m>ې+q(omWFAPSVԲ|!+ch C,xzjlk"3m땍ν|}>OH[м vkIj;ꍝ{ W^ vۇ ]LP^$ﱀW νt2A'):PGy8gG[^IW=R1ϙtd}a`n}$r]B2C Jd#iv񎵧6 BӗY# gzq;Y]{f.)TbES۔¨ӇE8GF(@<;sn]q TΓcݩR?v b4/ݗO5q\x1}cf>nZnV_#P bc!E5XG=8>8Wrb WAGh#$Zл<vdRhhOGfpo[_}5CKlP,:d+Jmգy¬M%F9jvpヒ7IBjk{4v1ql}G~$P~zǻJ|KiTywH͵~32YgMk|Jry5 Ubd3ZɌ!-#Ds }k Ρ+a[3`CYA4qĊbJqƁ.8L 0'y[෴90_M@^x%Vrc,EcXr<9aDoA6MZcA{ilUcmF]s\9=(=qxݙ!@]V3:Z (-b(zY/9 FzaNz0D(t]Fh79A,9^`T@^B{N{\@ (5!H-H506Fɵ }𺱴Lw[YYelixͿ i<@ڐ;{o,p6j<ծWA'T.Dqb=8:퓬p=#BS| |_A?,yUNW|`46_ڇ88l\ q;]xFh9#|'ϷHI~$ Fׂ7xJwDAH0xT6(QEJPϚ=3voa"Q[w9\gqG_Q Rov>@hc`|}aˉD V*6;4AM?AO!Ƴi/-|`*@gɧ'=G=B!-<&Z0*f*(1IHM,,OuT_a>(P4ڙ_!$&EiXyjiP5O_lg ǫ #Դ۲5*f8u'n(xLAQ\|9$"hRFX .ҍV^{zjٛ>klϴW?-^S/j]+;oIJ;$ :GyX>WLxLo,I`pQ]svO!@D\vUמ%$R[.aL'A $^n,ypć֒szc{$o '8u ec(x}HAtu'W}}l$ cʽ=gM9+^ە*+(?S8&fRi"2ABkI'._(^ @Ѡ,#2s _w3緎`G(r$niu ݴ#I2Ȫ΍ƤGmNlSԚK-rQ IqWVu See/$80͒ʠktԝ~O_IS0rF;MiCC->sPEI f~axCۻq+sBm5Zm U˸Qd|ƣvMrW oՀ=GT}2CRV6ieTv+>i*n:66,9$ۀr;Le"`{+ qPޡu#s{Xu JNݜk,UeFEzSY.\Mk!X'.K֍_!0$P9uP^볐x_WJݮcFж!glp8ϊdz[HhPh ե"8@'A){fn &pvkjDŽRG~ u,Sҹx8hcbPA td5(m~tDcVuݽ siK03awrȸC__U9X2A :\cQF*juY'<OkqӘFy:߆zve3_ /([%ITYfArd%P"ZW;] / y }~>.e`5q<8s= 1G *T]4r.W}g:blIoj ~$D.-͐*&;ʆ1WWb3JVS #,jZ-9޶vQ "PCQ(xV yиR:q9LŽ7iuP?tsxudC-|yH؂Lre$N?LnJ06(ٲAZ+mWjRL,q>@ I숹nGG%jr,bw T&?LLN2Г @cG}B/Սo2&DŃҳNUl gT`< ztxFcimYg:;uT*v!d=?/^ pZ/W4;%LC[>O>D?(JLUGi氊`,[P~p1)t^+L=^ [.ַ=,f}S!DК& ՜|۪K\&?i"dkL ÷GXzeA<(D?oO1]FHخt(fK(0Es{)~ :#r?Yso]PmU@AP=̋܌רRbtsH !ƁU3$Qů0#=^|T5FT#c-IHXoZm1*8jdЉZ~aG csVhz1OjZ}|Wpͳ-\ oUevY lS';Uˀ,FN%3#+i7CEm{Uu6?95ibġH`SrMHRc!|D%lz{_C{%UӪt4l@t^ Xm0-pD}Sī;+J1j:ywb׏"y)EJ ibk5Db<.v62waN}Gٙs/ʂуzvG蕾Wj9Tv(iB{fA>Vy%=4GV}e]e$DҶMaEp90A0WᏩThn~{,~oKG/aAr-TA1`n-t[@/DfK2A2o֙/J0|G ybLl^:vH9rbjyTP\B bT 8$,&7zʼqoBB%7K@$ǞG3g'w ^cx~.@@J@Z3nijܖ };`:I91FwRnKIۜ?rgR'\ o\5S``0;q''jrRoG/UO$ѡBH9ͧY;VE-*+vpQ4?q6>ΒOrC:t?UV3?A*; 4S_iyv2i@8`-a`L[]Kx 0aS Wѻ*,  #b`:d2u)t2ilN߼fU9_`w?DG,K'Z~sb8;g,TYdd1zҚ4ɨbI!ґL͸u1n,\deٓWcz zdƩb6ET~ I&^y;b@5*76CWOpԻdWtJr `R_t咿 ԭD4 It2x ;\QʓJ?ǒU--榷v05ƞJ5W&o;(r 8SGU!|etHf;Jn#AH'ע0q! 2Z&mt< zג9:|;DKu?uE&1ۖuԿNzWM0pe'/6WOSse1{9!vi7.P?W[h&6B2wUj>׿<M2vBɱ~QK$<]+Q"/3(w9g8vozf AaG!ttXCh=kWj:u|u,T7J_}^dѲmsoIl5HYk>4dwJmk QzA4g;b~N=Wy)aka]H7H;šW7vi)X%jlQ('Lm?gZ4"_6{cZ2 {M\6˺q0D[]6*i˛rti[+tK|j͇("M(D<=io\hI+zN^ϟ7W%!A0qbff".z=ڋuBnJY\Zio-;&2H8:Ⱦ7$LOӱCp˲48e X,6ɘU7i`rkdncR'ҟhD?$Jx/tMO.߃mPc>ni=-v F)\ :׽QM D YVLtvʿ)F+ҫK\],R h56F]Z ~]ͻQd_w.J 9# ]:AGրFg] NXQE㦔|]V u*/ ڈ$ .gТa x&Yъm|a5TQҞܢk֖1XkX9]4OUavJw3^Pv(T#Sh?aq%@i*ec_fkWG `"mi'9a+udky86ԝZss䩟wCB.\HڲOw]7 *"D0Ne`חB+^+$.ƳY2E۰ՈC,UPuV  >aoEڪX8źa˻*-bӠ6H k]50.UH@Qor?ͤ+3 Ÿ22 @Ȧ(hL=c +_4;%z\ *οI8_ xd㦪1-۝Vg䣜YŅSpl,nC؀x3y˱;5@Zϼ ] _?[y:Nu)^RwH~ S+R#bE5rJj%_p.(tX""N; H +%sO#y ~i9"kb.= C)d̐5_Zh\wnۄI_j5lm  Da;|+ݢP ̫ e5xP$s}Ϻj4ad*$ PBe0Ž%~m{mOS>6@T#o\D@PlP["ȥh/4Jb>BrnN`uDT@jhi<@)U-g"0tw vtvR.ja~+<^ psp "{ݧ-#DJu-ɁmJBM*cd#iɸ!NN ̿}&$ƏVh?5JCD |sg69`04HbvٟV>g~G#l;FB#2\*ȇ^̧9'fm{N,.vaۋ&#RB]43YEVs-p1Eo'ӑڵF$(7E5]_cWְs'-|ThlpOQ㚚t9>E>)8ftʿ25N%!QSP1-B,CF׊Йqr'\PFBrBH!xJ #VAs#VL 3ܧmz?d6 [N/BhѸBF8SN85(^wPAy$W/ ,fK A4-jZeF7L8-OV#[`Re_;F]5+oM3¨L~V G(k;Xʘ][ tEzriz4 6E!s71 x"T,ܾȚ*Dޑ@g[8JZ^{{Y6l[}%(vn=ۏd@[-F2 3?qͿ:m6kV*  qؔb_Cڗy(@qDSTc j|3X2 26Nb۽T 鞡3kvW8{mr!JյrC9nw}+ntk.H,Ҩ.(cN\`jdg "mEnPUn"|>X=jd*TׁEɯAA3oKۡfh4.'Ǖ&TaeDϻ'j:w[)fF:Ghi~1K/t!=4>sG^_}Kub k_yMɇBHNIq-gh#aۓ,gripKqh;I{ѼddIoFBrSn&qB¶`1L|#!34G+.Lmj5emG0kdPUꉍϤLCTOYG%,,l[POTe"w$WÏ靄3`V9(yc#`j9Nf+ \E?oZπ(ѪFTQsOlؒSxSR,k \o.sY%{D f8u{{nԏD!K'JIrWLw" t>@IrZv1zxU"P=H9516ڪc@CL6~Gey;h^qdž WU"$KK:@]$8yߋ̯oV4[-B| Rn߶i/I9.~:{A..a*Jۯi7ǮZnXks(A }cDʠ=21r v)/ jg"[u z*h(V[RY* D^@ђH{MޣK|vVj: rfܻ!_<" d]f,^Ǚ˶ojV\,#g/ѓЦA{Z`4)QʱAmTe8|T@=z(#J`|±P  8*(}bm:<;:& M"}]5s"|B$a /cƢl.:owUgiK7JkXɩB,]@B%/ZDj?doCЫ=wMF9˗fvTY-VǺ2^(mq1`k-x=*nIRU<#9'͎[LCEu(9XjѾYK;PbuXu btu>E?<4U^4f`wAPs!.01ηZUWx,)t.t`+7:8*n~\݊/.?>=ryDP`v3TesW(mːsq rRLf:ѶX~|{'!"+w˾fToC(ˋ?1nSB|PnaJKuUZ0@c=sLg4 7k$Kw}cvy`EPfO쬦TIG`jC"əfc.9SPä-\eJomG:OXkJbeO]pxc@8Fl8AtnxZ̊p޸&k ,A xS7-{XN==!PuomMx!UpctQpiia7 `I2>1%6GO;WfКY= {"]5 #X3 +t#'^ !O׾ƚkc`t  ? >j)8" r8$ˑxq^o3n~"nX:ClyDD_wvX/f5r+2leQ}<#AA(_Dp\h~A\,-JcG.c3aaT[E|kpV'1U·EY=4J3jL~wV_!Cj:LJA1R-i||صb08&I觙 7Uf]]ύ#hZc^rr!;f*?.3V%Zv%$n_yNeUm"6E&vgTGwFSۨ0ju! WĶ>;BW꡽),D  (%aB|ԬKqՖTW ,hϖ|%ښs=HqeވBjdG ¸%zq*7#0&`8VLp5ߪu^RJ|֊-Z 9#쏙ŁߐUk*sU©cUwb _MRh ջpO\IXg՟71Qln{SQ$ʒNYAUupm= :rd% 6PŔhₙpE~[4\ɛ3GiRS}eR4,5[C[KC1!Nj7Sc^ٴ"Fƨt ًCZ^^ܜ=hntNؐdHKHu:b 2?$ف⾢u#g.!7>'xҋ[R7SbgĂkck0Y,ߧ)hρc8`7ӫ\xXn\RyT sasRHoo.Q9uƳ{4873VCoo1] 1@^Y-qT  ._e޺Y-tѨP, \`1JGқoȼ1be؝j5ubEmXԝrȠB H6$>w{n?R (~IG=Og;<_جw\$J(T,k (wNM4\_O!8y怍KV}Te.]V5%ObPsiBxMHؓ{\U"Gf^L|T%Nɾ:yteׯe'J_HE{ B&43G“W7q$YiHTeeARd߅Csd$iXva[AGl'dbF |Ӏ,+ϗ Ӫ:T) `WXlPz}#;Zح7vi WPy8 Q8&hRףLSu9cJXbFGG36uF2%4_P {c =K|f-w0dfiK9- £Kr/be<$@ k-~ѷAYzUI3xIܩ^ҺS(^ч"/j4x(z)*{߃) U v8l]{HVw*C}v.[Nu>dmM |n9PrjWz!:lCux:!9b+_?ՁY<)Wea^wO!7 UѲQ3 ScsLΝCqiWGb~&A'Un?ŻBX: D ( wdN2L7&rGJ# 绯}z27` fOs"il >"׌Z8b'ފ <=C`R =5眒z}Ow"氧Z}.WAST]IXtpt΋ ?EYF ec< #&:ps Q2N ]*&)z;vb")md%LfA zBl4a]ꡎ )_  qL|6e-cB}a!dz rw8&K9u۳GVQZ Xh gxphH PC+0^4IųEQU8/7LrcCL4?DUݕDE7x>Jzk:%(##¼:2Ҹ+mw)66W^h.e<+G٠DmpBO(nsĎz=N@ߪ2 .x# h?T`T *MMsdh /aL90?^4o?qHwxB,a,(-071CQ'BdI.װL͒@jуn1OHzO`mEϻrlʔ$2oYq KJyMBWƔt]ǒCP8Ԣq%lCo?3|ly;5jv?! AP `hL D t']> >Z:33?G3?+ThTI njI']O\蓾‐WwSaR9<֔'P2h%]<4Qw H4aqfG2O͎`kɺ#wlo*wR)6Gձ0l[ D+:rSFb{\ }7ACEeLhp`&߳;#! Ι.a_9#?l|WG=itJX98X{@j(Gd=%WۃfQJ !5ħ($-/PU;@]ik)mDޙalt{0ӾVjy@Y!5B%B˨nw+"r~ڸEʍg sDȧP(jQG cOւ0;0*kdJѳ>1PnUzwzT#k O2Z]2Zckk+!HjG4˂ Al@QmQCJ-.GFďmQӶYRѓ=zIWȺ ;DU SץEkEL8Š I٥uueY !&Q=hIUZ.GV!փǤ`Vr,`.4FvM>yH~]T/oNfsxGh:Uh4e.$t/:[>Hc NI0U֑'0#E љcҭ=eԭٳӿfz,,_{1odo43`;mڕ', ~}6D#QF-X|,],ˬ"hQdY~xðY'z^z mqgD> FʯP a^>;G%O~bÐ2Ql:to# >s21X Nl{FxA^.偰 "|^S|+LE.k}?9H"D?[tiv<`LzRN&rVڛV/Ǯρ$#$&{n)wXj6JMӥ&vpkۺIADS͉P!a&kM )[Q:67Xza*=AP;pCќd7.q ,J9iCq_' ::\xeN1w4^ٰ:*v^sA-P#*_|ZHlɜk7$k2z$E-6ͣ[p<`-S/5+8v̈́m&]9TDuIj+ꍃIAo_ Z/̅JhTĘ7l$'P6 $0,3bBzb;q.mI+VSlOTHjiH]ٿ.Qe{-?~>m3fy=y0)iS:d T;yEN._@}0?5&F(JrX^MjfHQ9C@<?s&)^Gf4~n62K+wwhɞʱ{詰2WM]V)>:(x/!٢}` 6բ _Ɂ '=Ӱa/8-~)FAad^q L=bB Hp9H\"t_=*`iص S%gF}`D纶Äӏ ߦf. E uL K K\oRt39} <@=1WQ=cGә(hUꥃ [Y #\'0 ;_ҡ_Y gd:(Z F[֨=x;k &Q%?ac ,:qO[ԫLW;֙6ۅnp깪~ ع+ɹ h2_W{P T #x-9|YhW @KSJ;ZoCX2&nRi(Y4"%1ܹ]͗6/藋mV!AD}ӊ+w⼪vMLՙfm|XǾ&t~`ܵ2VgMے7_ԏ(Y׎]Y)uNLnǷBsDk0~>rsrؓU ԥ5j83WA0+~*{b!W3D4/Ee3$T3+~"jepmV^Q9O!ՕAeDAUyj8!E֋؈Kӥχ+~?4ʼ3 K6m7ڳw|yBy@=8޼H`9"I@ȣf 78b$E`xMmJ|ZS!ёlf׿? PIW7PGX(؅XY@uYO瀫Ⓡ~ƛ.D8j8זZtcN");4w/L"8xz?|dJmuOuJh.W"ᤀ}/}ssK۾j|ف& Gy.5c\&9YmO7Gfh%i=~;7Λ 4Nn>6p+&oqUznncU02]tV[uj1a\z\n¿kt[O +2tYjL`_VaF#7 ªg`^Q֩g'::Cyh ȶGfY'&.C@WWD3t]c,CCɇ`i H3hsM`5A'cR)/J Y!S$\Y[ c]VHECTZ:3^^}%`ws?u0̮Ða:phcܸ~|b1G![0eD`I 4 c'LQ\JÁ@@|$L%i .NJ|y0E⡭0;`/> +M|y8u n&ÑЅ[ ʻT0W4um9q܆~J%oۉA_DRcD{eTHs-t +STMBwɑ>*61;BV_Јjc☯x/BNb-;4|b x|Mcf$^j@A{>$8ܫ ؉;w-GR'z{$ I)1s6C&N~8knvel-?G1= uS=8پw2R'wV&œT稂)E?M8N6TXM[Bo:W=nÔsP"=+hktT.#2Y4bvhxkL>!v9{rC%YtSed p$OB@5!3.#T,  \M| fXԨsĶܮp@^ s%MH7Q{_7y+15d@~j?pp@ȅ QsA 0C"nT6-E^kT7Q%ȹ3OOMAHܑBT&Vф9mk&]}N'd(G#~5$<`M@?W|ml_ ڵuXl%(KB"'v]Kf,p|IFK wJ(W$hf3|SI (\,l˧J4D$Okc*ǭ;ksC 81h5i`gc`"$(3q X'-pHLאjMED>[7 C&F/\UVK:Z, p ӒD$ aZq*5XhUDE{YwשTLlJv;95kVQ,Qkj6?;p~es{:ƜN|!똒#$꟡#ٌbA1/^{ϵNO}@` 6 +Mܖ2C`FFWMաFmd V'/[tXdwi! SByib+<!;MniVwYt'a "hÄ&k]VF'euS 8 I2=(_iGK} *i+qsEݷμHMw\ڛ)+笀{BVv4-bALZ2G'r&ƅunf 5(Ofr0)j Frr\瓧l󵎴&&DF$'K>;s6ؑ(9$y! PsFR3غl,F?qwЕy|aH^ߒrr!z8;%DmCVF!; FK щFeQlңVf*Y>AOhXɌ U*3ӡV,̩ЋWb~ͩ`*:$ +r/j3~9 qJw*yceK?ӫA $ϧ{%=@m~UavRc\[^7őUz@R0Ѩ Ꚏ"| 8@$erZkQ0=W^ڜv!W! 8ӊ8&M _e&}RF?n3YBqEseJ2xjM٦ cH֙R ?DLjKP$'ɟH^Kr}p4 9̻T~33-b}drL%YTRtIEޢ)Sg#xi ɉ&r1Pзh>PӍX}*3%B&YHt?K)1+^·$`[8A`oxc7Mghm\wm ]jseՎRk௶޿΄懳k-c뗅--p. F=H'ħor[%e/;~tӺ:P&%cUϻi&A@̟Z0^sry""vuHMx Ts ?.PldL=!X8LJT ā]l_㨢"6qFHVKž. MK9p&rSbX0ɬ[%OCE&G"̑ ^{l:hj6◷w>R.}9i~ǸX1lK!YVűKw*&Sjj/r|W$6_gm!|g|j\Nv=e;[g#1}<m}BR5OU4~^>iCw +WDR.W18g^A 9! X_ƓEAYGC^ߜp4S?NVcm\/((Vy/tfO /ԺB(mh}=͎.=oh7fpLԡxo9eJeG:dce0`2l~{ڞ8JƴW,cEл`ϗ*euehŻd$Y "lR\ޤ'3l m w[۴Q@y1@fioO*'d ҄fDp=Խ*8!6ΗlG%x˸QMPy!Pm'r9sbfI >H]LDDֆ8oHg+[$tk^*}sx\` ~b_zX!/=N$2j#|ǝ?skiU֛fGk#ZRok>L'hNfLи / S%_C59˞l|"Zr;I,N9Mj׎F̓)$G JloVu%.6D]o`4B}L4Ic^Q`_=(_D} f{qphaF܌q nk"~HIrg:2%y3> &ۊIeG#rєޡ_}v|msU$iF 3q`;D*xWRcQڡ|9A'?f [HjBB'#z_O\e G:SVFKs^sx,3Mi @B(y^.T^U#1VlB 2 HBi!^(lq2HyژdɣHy-V1Z_+yeMLD/7F3ln$YjR&5Hٰ 668;% Fh?s[ȘH30Dr2h4Ĭ{Ųw9/QW\вƨ0HGt/"QR%\7+Y\Cr e#+()_-zVԚ?k6sh+S7-+˷ 1Of\̴|}{b9ɆpYF~,sT}f>)g WqK5]Bv1~i~C(>eAx+mA ?IϣRlY|KoW(&;ZZcЭa?NI֙y:=\+Z(`$k~ "Lu ~M{Cx;ֿeqoN;+>lQԉsK?Tl w"a۾1RÐgC!@x0M_soYdZCiB""Nqn^ R65@IJ\aI6ƄJ@0 Tn)&0`)6P =PggKFQ,#µb$a`&XhY[\8L?('f-W*GP7)?IB燺lz^tL*]&xT3b/s\\vey!5~?=+2d$Y}CRen>gЏ-ԚlԤHEͨeǟrZ9dE=MAj#>\zXӇ{J;{c51 <|]e 57,J9an i'Vi?pQ[.sn2ܴ'$jm i38[> iM,EK9rJ?,Ȁ bk?B$9iE{AT]3 hr`5E=(6DVIE1Y  r;m1.=.o`*lf&q(kŰ  ײmֵP<_LU.FP0qRJQ"䔖n E@XۧYuT6nR}q9m q1Bay$Wd19?Sw }>`c@yC·){[BGR)?#WG7NId%`)L:{J7#0#->,:a\p.i+*"1lDzG:} Zc6B!݀_)črċjXـ/UEhW {;Cx$`]ppCBIL} 5%pMœ#_zc{)eIGLxqw%Z2PX"+vZ2y-dOtf/ J`Qd450{#PJIE4_M2?&Gv ػpWQȒI@P+.or].G*?z `,RjZ4~/}z[/nZh'ޥOeh] 7" UV1@fֈ?DgME2@;R̓hh&*$oڡ'Q Cpk!rH!S6 ٬#БV#S-#!"-bu\${9{hԎ%2Y||z酥S;yeT@ VEsOk#$P568fdfHXI|S&KQQ] Z1De*+\|+?$mS#=QrNъ3|Z%XqN-|qr5/.%tQtݲ,N9Pzi Rmp*afTePs LD(:SMIi&=#;)0z. XV[:cCBA" 矸?1/`$|i)Ȝ[V &F/x.TpXr}M''M )bf[.1z2aeAN7 c Tݐ{C [̟ 墨 pMQ?e<זM%JNCQz QoǾ\if'!IGrYaE&G78 Tk4!Fۣ!%ZXפPۏE i\z}i^O`3/.|7,SɒQxj:yr ̂XC[ޛ-^Pz͸[WIu?ZS)bjiƒvC+5bʬp/ްwv;JY(7ԽLdD7~p I. j qDŽ~0hPtGx{=.̌? )s PGlRram M5G[g|Ϛ ^h`';_[Wnדkߵ?;ϐnʡ'lZQa%*WEKZO4\:W9;XU)sy8&N--il<#h}(t%<өi}̏KF){)Ln٠Fs~Hrn YAojfn_k!℻]TMg`jr9{N, V>IBs| LJD=$i]nzk{O(i6ֽu<iZ?N0bH.=ZϚXqec<3ϗ'ǪiLyQ &酙TYl } gTT| /&8'kjrtIޚf@JN8?\+yG[w1|hWkcWs-,[05eF́RI'}opʩ Nk! etqY}aea~[%)/T|^)-*fHt OI[.4&ެ|o~v݋{"ǹҮ8ƀAӤ.[>Ap#Ml~762( F.5)1@GNMBUxpcg ҉T(ԝ'f.^~L sPD z1W?|R;gYQZA[ FHG1$a"׸ݡ {ԮhO7CyӼo6mJ Q*h?D=AEuSD5I_zY0R6j_Y6u{D) to/|>]-nٗIs;@PB9llQ{lJ\Wo縌/ Zcx?#;O=a:m rx{Gn!wݕ;"wx~&#g' X ߬jUęn^E< ]B%\͒Ý9eSܓ!Z9!O4/8Qzp!*eY -)MBcIβՖ +T$o=Qͮ.7 4A9SDB,!pi,ZaXJh>h1},ZD[L-%+@ں|D|Nsoe,P!#N؆GEi)䏕7?䚦J{K%|TЬmuć+`/:;壜4R36 絀* ộhaRG %ϹΡ a|z{yX [1;\ҥMՋO[2 \Jgf~ oTQapZ 0ٟ9 %ˠn6W<]"0S19 2CLx$o7FtF.r謙 +ixB/2BnPglQQA0 .,(C\s8ʎHug jgI}85 e {G~zJ#<ӊrj+P]vHV C_,XxM9`[: vcB`L"{MF/ƲxeR00ܥcƄ&"%ij)Jy;*4K>ž-myeh.̧®cV2izev,e;/+V3Ҧ*-kRӿ:poJHN`rȶ'VNxۮ ;z6Gdvrdc:{^8%"C ތKzlŭ ZWp?m-hՖV|B7c5G%̃U^곝ztcj*ЃJ\.R7F3 k!F0\z71 sSJx hFԕ+Vѱ~e"l67횿 ,+98ښ;$r ZeCe=+t2}S{=kYA-$/k|Ot$PC`SF#zO~FF|Xnj'r/[YmÝ-?NtTPCҴP0%/gJfPq#qGۜ6@9I;"9uk]bϚ8'vdzLw8:w G07!˰eK_TrzaEQ wѡ6+h*ހT`"O4ʠ,s DР0SU(b9y.ڛ*V0uAW mW:# ғ%5A>vf4o EW2Әw5WH_n/eYutkI#Қ^Mv~6\q"0&):iɅkOθS(@slTnYZN%6hK<u:q)8Bܞ`++hU4()sj: -^۪E&KO[V\=/-QA* 7TvCǿ^Cx ̀_ b=i`=mm)) :9aMCz^_~%vPzwnwHB7w\Ee蕳{w 5twPN찢xqDV)lD3ۋɱj2  ]xq~ ` j7^@Y0$t <س JHBNs װ3ӪT ]>0j;:9aw%X*y7GpMF2`۳%Ez+T##0amZJ @|`rYC #{cWm;10ߵG 2i@ |}MpU֓p'QT ?N%$eGA_u߈k!/9zw]RtӟPAċbœu)e,f<~+Cj+@:>J ֜Hh,T%_{?-!K5AvV vunݪ Nuc`KIdlKe;_O~ 0z3|銻knX;(SKCz@=>vg8>$*m [+ƣ{~ &s1+*H57r44{j<5”Bʥcq'X0z7Qh;?Y0E!e=Ow@M{Ƞ6ݒ]ՍŠ^t .jcShqzA>0+4Z{E<ޛK\;ǫv 3B 8 –=wo{~w^t" C "z'0޵2(2I@(,5삄P 2"*D*دU`QPʅ]4լ2 r3քdSgК{BЊ'GС0tE6 V=oq&k^JJ tdAl-d-3YF΍:q &c8ٺfXbcAND廦JU1~^/6v͹ ͙|ii@rew`AտuKSq4,*qD+7[R3ef+pyOق<~F,DTN~L&o'H+=MdY~Ѭah>\^"L_Ydy'"ÒdpѕpC NDŽ=J"DWf9sLIn*ƿ˦"9I69^1G uXYT8ӆ}^gCMߪqRLMgl )Fh- R.(ĦJ{Wn%[oa맳NODUbtkhSKY8A)ϫ޵ 7#M pRSEQEe<_%׋hj)v4~q̀&KJ\ @<}å98/- ۳e)5T8*RjHE bhV,1+Z|Hb%u|RLW1. vR'J~&BdmTd'6ɳ HGrq9 $޲YQ8NYg@*ܴ_غ_94+e[uS9(ڦt} nfX4li;"CTM#޾@˵nz'˾Zvo|gvanq)O܁3tL@E,_+lޝEQRfhby׽LZe3#miT%xdP`Vymh~:V C70LYGAl mdkqAhP!8D,zF)nÔOY ]N5yk늅k9x{wD]~yQ^ӏ])BBkPWÕb=A,0gJ.36Mc4Nf](#XP_DoᝀZivh˗,7i[Y{ nEz_ "2)~U^~ǟ#ɼO a5$鸅Ek"i,dvm|R0Mw9j9W,< -XJ^gP °FbWI,b罰W Zl{wJ Sՠ+/B{3 M&W^ZU(Kb 1!7MA,:Z3p~Mf/n.$?,\L1!.Zs@zFZ=gTq׳$dbΣY7?L%7GN@Zv'pr(ѣP،,9Lpl WjRPGknyrU~^p]:$5x-+DJ[p8e ײ&94}~OܪHxw9ʹpJ̻P:_llDQ~28iQ9^_jV$&),(ee0ϹR ?a]M6?(RӽP* y \-2yXm{S;tാibyxt վQd||EQI(AInY:93E׵ۛBWXFu[MkPj8:3$edi״uE//=QSěN0`&$Q\O}<ҫJwog:e厬o3>"H-Fap8R\GjL;Sǧ~Fs>5JaJ݊4̣3GN\d){QawTReMF)}C_V PYʹP\n iO֕%k?:'"'ٷ:85mR׃^38FN?ZT0#?p= $ 5n)j'Z)Y\Y;~EJ#^s3 _/MBu@?p1v&]*aJ][|[-jm0zSBdtW-^jUm6<24k,y9jfYn͉V5pա`+ۙ,`$\ Sqipܥ/ o5^nGN N; !^ɱ`4Q4O %8jնzg;/VGŝUE6˿nb-qy{vRFHwI֜358ro5o\*7Łƹm֧$:ላ#Jˎ^ w !{3;{#j4 |Mɏ!|qQ++k(2;F8D]QOD\c'\XuE;G|>b[B5J9WK̄a{_= ¬{Yŧ-Ҧ]} D-ōƊa[ckLnLZqct jd0bN{_n>1r+ Ǧs5^WK F@(o95C#Yl%#f0a໐S>=^nIJK̉3␄3f#VEΖǹjׅ|0# E\U&Fd*E|<gH[f3y- WAkL J's'bԗp\70T_ΞrB|!'ͣe $șB_X1i=%DcjBoߦGUed 4ny,%0)75#p.zQeg꜖s.uo-3k >XCl(\.yN.<ζVMNmPɤ՗#!n T/C?Hw;ɴ… W_S+<YyᶈrԷN7b /'U˺ cz4XMO!E>ȭgp+dpnLSK;>^`[Hfs" J/uPHBe8y8t1 0?gۍWZEi#1ԭ1QM3>fu~fà͘ȞCGʳS%=py5S7F^Ɇ>SD~蛐ȢL$@qۻӠ!>i)#c`uIDV$ܷbj,7bA흉sEH>4,9U 'ɸ~%v4l&2'h'ʂ֒E_nItgbwX•k&'8iP Nb4uȠ7 8_jJzda cq{g4d%fXxmKaHe՜iۅ 3sCoN"~KB4zu.a`Wp]?'L㍋="-gb;FwWO}XKKp:"m 4f?sMd,*1{eeK"a6PpPq]mӓM;۞+D(0*`zۍξ_0?@`VEsd#t O' 5#7i㏞ݪ!TSkRz闥HGr3_<8EM/MCm 0{eWZHAF+6D>\YD0cB>դ/(]p=d4Iַp׬rn Lo.g+ y :cyC#Dgp ;3uݤABbݍ}șL ZVѿ2 roUu .PjM|mu0u.-vZdC%52$\94N;#Kɇ @xh7oAN' Ÿr\ 8@|fVQ81nK.WvU O'öѿC&yIQ.%iuCg^$2|ץӀX?j_}Ҝ"KR3ҝ6-'*HYL)gy_MƴD]w3IpC~-r-&vA%ֳR]=qvR>Qv(| l|y!pkCJW3E3_7%4 hu54@g#c >dA ^xo&eJkLPZB(+ʖ@Q&v "tyQwCmP߂b!Yoݽ{_aՖ>}9ia-}zԴiCyi/~fkDVؔ62{M1 9Pv%,:ҭs=DAg/#w&m S8bA m;اE /u'EVnZÉ]pj4l# ZRo'"I?(vռR?[HB_W8?urqpZ`#v$G-ro&V+M kY-^(iC+Benv}a⣿n=ad xl?>$̬nL( +9Bjn7@m7b,O+'҆g&> m@EBAKigQU7 t3*B{- π @c'T*Mj_~M% *1-zǀ}V7 $"0~ 0 N?Vgpy¾1H s.3,>Cka,_"Eտvq-+Ԣ;^7ݖ:Zlp`aU,⒛`rƕ8B0nn` #W͂X  6pk1 kpvG$)D1,"瑏>~:Z*< lc@,3ߦN r5I_#`Fӛj_#mFTb`mLώDq \u?nvi!/m 2G2A8 XL/5 %^QVZT4FNa\Zktٛs Wn\U!ṙ !e~&P# 7pjc-14@ ~ vˉLχWp{bT| %Je66f'aSQ݉ W|Gܑk)QK BHfWՅaP~\-1&$}Pdn6xh(Zfpՠ9TSVx½QWx:^6k0R.`ݐiV6hH?f?b; \M v{'˺%_(h@B#mrR5Ƹu{>*oA4|қ8}%ք5 Sr>E2ԴZ@@D*-Nv'Gij#,tĽN$V1UESzjjM}9@(lܜz؋K=ZI dyyKj>go-V8ʌ7 ^̑&*Uˡa<8bw^Xue5YsIbZV)dTcLJ1z ́nt8.E^o֫yBhrH!lWV\V`qw׹3!UZ#sOu37t#\YTZ"|=5]L!-kԑMC A֠s7ILS8k\c_p,\8H5DcX- Nf xMش Q`&3Fd/>~7~;ٲ} ԺBUCUoGA7H!kYɛ6-CS@ 4o[E{dI=x(ll|0tWeFD8nF¦"LLl}.4vR"H꒝^gwƱn8Go028:dRԮ1/6l+-V&..a.3*ԿI-7ۗ~6Qfz[GPnʀJ`vV99\3ݑcq3;i1vyJG\8z(,tG ]|: Pȥ;رx:gOa7\VZΨzbt_Z*/c<~~ xѨJ'Bi4|+jf׸˨!,FNO6кfzY$\F̞T7!OrW9;<+C؋>5UYm"΁w3r.$r3қO˾=\aZmN09Ş}!e+򨨄3qf c=g⍃LQY+h7gXKT{y+f7UmyD^ V͍ 5&_gIkw@ cߜ`v$?CZy~Jh-XȮ]_咪ɿ_rKrt8{nܭq0?|]%`ճ]AZ+W46nș C[{A \z:TIJAײ1:'P]>G5fUwBU˙O= E&p0cP|Cxoݚ 4ֱJBn}<%h'$wG$Ut4dSѓ"@}#Y2G4<%eACaܠV7 UqwN7\J)8^) aq4 &vD_=x5Kh?j"P "/(,9ik`q§Lur@>o\UEN`vqO]Ū4 m` m= 6Ads)2gac\fٱGѪpuG%РCV㳕VPٵ!!|19'dg| ׫s{y\QIUY/; PIʐZx)?sP 0E%/v */d@կ8"/~--[]ٛ3>&3`0\ֿ:9jp̱a5̄I7c2hDxUi{Bے B&X ؎<}G*>?MF8.}>~RssDV x7RF%D {EY:ڂNXs!~{c`UcsVww--p$H|"K5 ҿ[9+ 𯄝z}6W xw\guB_:3dAK$K rPwr..Λkgi}E ;Cig4wK, ZOab9 /cR쨊nj%z:@mu-ߑdў(VYjMCe ;h6~ Z[aX׏2zZI9qG3|l96۶. x1gS!5 s;K c␴Ş}q XT7Bq%3rՊC C0n'C&l#gfgHWZs#wDG-T ׉Z{*!? 3WGK@ٳ@<Ê*Qm&\:i +”cRWuh5q$L^f8vQ6"f(\|o`mj:W^s>QGw;W+&b'I PK>;`?D6c\GӥTY׃e̦KQx\TgqsNJ|e11^h*lEt).@˓n0+Q*TAtvQs?G_1׶@|" 5@Z_1ʋ~ET|#y<8&iUnE7{ڀ <:V1:=V­WWlM>}W4lCz־79u"A*x?[^ $o<΋W@C컹s-/޲ƚQg G15W!,"\YÁ P F'p]!>f[sG}zҴT ,V?N,GixTդ6ZƗYO51ۓYZѾr{{X%Hno♒9s~>?~3"O f^y=, ?3,n41 Ejr#EA XAyyvT,vne9[cAlQ%+4EV'C:(9`w kG2WMn:hNE0n߁)%d?IJ?L_E%Cs Fm /Xȝ[]l%.ygn7Ɩ' ;˜ -x\&ǹpLK[#O˪NC=X9!Hp'[I>9Y{s xL4N2 ff5v^l`JZ$X-f{>>i` @^6QnI3Mdfwkdjaj-fr;qdSЈ+@-\yc$XZ6h4o+~^Box!_; Hg0x+hqCNReal'. }k܌^TQUH~h,2&iGʀK(R#u_BCnZT7*;NK{iI@/J_.a g3/uJc$_vdq'3S 5 jBtsA34N!A(Zӫ"|~~l(!0ڈ 3Zr:ŗ : 0Ld$Sؾ ':$o_N M/>P1`L5,k.hQE4q=ZL[cu5@`IH/˽m:LʈZK("|HHsp|/S;vtDnjIc & QGzsDrc8;؟gǍ\\ hWTc6m@k/\ p/aOWA\ OAxtMwF+{$krdKFInh_"h 7*δj6$'.P𞷻@x@wNob^r9PWfϻK)> [' VO0 ťڎD |PD!Ǹt7 dKBM|u^MS.W6oqLjiz ŃQ<7ovQ:8$ef9_~|bSb)1%$&ُ]E] z `h۝sEb>c)~:A3PQ6 3e8Mӷܶ?@ 0qVD^t'>0RlXaR|^!#X|2qq7UufPШӍU^Cr;! 8AF bȫC( RL1D;7kl4}qux?䛽>.6gtM!dp~CZ?X2(!h[+Yg R؁R\h0߃@E C4H;#,W"bC[b|6gt[=d ~->2\!OP_r$SbLD8X8Tn S8h!S8UײMeuf N+cC i*kZ`Í1ufpaȚi bFdLc6xф἖s',hI-8X`Jng=Gc2hK~Cg du5ӛJQ'fFo}6`wyI5$'+>RD~';afp }Eh( <_ӿEw?7+HVϭ>ln5r۶0#q#o0q="roqgޕKkt(6AyH Q`9߅7І!6ޫ6/dm / *OU:i yz8a,Em1}{$ݞŢZ/Cg`]A0讴 ZFTt=|}< ;O ֺY]iVloSӽf̋bA"I=rV&o=`Etbxzo ; @LYӂxi4 r|{e⤀?f}`߃Z i$[ ETTk߉Ι YTeJ0Fk|dW[ME`7W0~!ތ?%M^勇+z?ZF HNJrqj%*eزWUA_ڴh1Z\S0P/-we+)g>\S~E~:T DvPШT6xXZB#d-i@omHdž2/Z8[eK; J ?bWBBtB͞ jQE C|\v.stcӥR0,o|UNN,Xu.N g^ϑTK.2?QNŖA\̨W5cXQϝT-V(=7O HT&T 6BT'X??x(["OoLs[h]XhђC& :d8F֝sP4= Ko)0wpg#z ]oS|>`LL$Ѽj#!mE˷2A}^Q)b rƗiC8܊F } n$/dsP_8fUh_MM洞(7hœUeqD0)z[.r 5cvP߳Lp]vt="+&FɕOa_..3uB[7A|{wU>3F]-E.׊Cѕ2 q7Ti@_{ ;jհˍxr>lX`ZۿvרltхI0%dReGc{_י@Dܹ! vuqlfh4܀Dl5C /?PNBY-֧iCYj륽þboj̥Qos}Nb$6QT䞝Is_!xxIlLuIQPT~si:z,NUJʦ-Xp$k{Pp_3<#ifFPxHZZZ%Y_z ؗ~ 4t2GFPZp>}s/><\Z@FFVqFJ'02nSq{">Nrb$>|HCɠE[!n t:w[,EI1í\6 J"1@ \u)x*Dh k6 ߒH8ঊ0jw.} Q'24!:<4v|TAuki$HF>щOLh{%ohV)|ؑIjS'hY<2 cyro (*A֡}2U"mƤvB)\nS ~iReWj [WQ6B0َ8eǮcRh$Ɵ-0(`t½d@'#kCȽ ݘ֨`+N}2 L#IQЌ.( *'UU-dQBI4'V$]wzO O)* H`9Qbalr-\ iyR9wAs(1|3/¿AbN햃\%Bw2Acu0v`ゖ-Y͜H8@t&@PtdǑ^{YJ>&'NWyhn,}~_7v[A㢕wy}'x5d<7!P |8Kc ,6gZ8hW1knըgq?[C{)(+p?cH~A5AH cFhnc#]p17"ij_ ApL0 7V{.8"m kq[ž(o2IQ^Wn0[vfE|$gZs#xLSanH\H'Sv_C)=La|JB_>\2':}/E%'{jח<> ֙Bn1@ )y֝L6DO<^F r]chT)1dwQُ|1]M{3zg%IJn̪v&Bm̜|V4LzKo'bj<7 3! |ZR:֨oaO \j.V]:,Lw2,ڀ.0 _Rn{}/YUce&.?B!E7;",KVI>$`‚ &LWJ7+iw(Mq<,FsFa.[O튬-u.~"ecAA w8uNH(d r:#OP83%q> 59u;U2H4;GHs;N)N'4_ nd>U-##|ӡ!0~dQ8o޷FLUˏ< DM(r>INCsb|ݱT[zPʚwx!yA|TՊDI`]<ۡ`'֥alT7$':"eF{C q?|&v383]&4A3ﭡ1k6PfMcx/MƉ8k f5)/^> h s"`E1ToubFo G('݋4D1:<+k\6 W/ z-DQ8Nۃ'?ݧ3 vͪ4~i/oҰa8)6m\`;=^%̺+@N#4l:>&ّA:n :}Eh'VZE+psӹ枠'`ˇ4g`>Jgj2ϘP[7ǁc[`uY)!N"X1W=Q߼醌Q^ V.p{+DTPPySH0V1OG& ՀmbޕB?gIG~.ΠBs_2 9YIL!;kL ,ӕhrч|hR O w[J}Os,DNnK>lC4N {A=|ndy |9:}ҺE˿\bqS5by \@߶K>>,KX-uүY˻CS4g^),zu[MљɈwAVY3wRВM4S&x`P^kx40(ybK ϫv EgY3Uʂb1iQBY7 y!1i+ @M3<`662TØ kDLFs1s:ڕf+AX)OOaRmyS⋠ow D \dH9v|~+C|!qFJ*°i8,+MaJ8bEfKG_U6MiV 3ZH$`"ɀ唠/Y>&)I0ᆢmr.sIOO2Cb?|T;Ά'8^@"G!=MWx Y큯W3HkXb( vLPf͟P}|Zu)YXא;.(]׀Y*7&)$e bvCtyĴY@Hn{8$\Vd&}nEj=UFث9OW4j49&.?lnS{1 niKf<>SFLxut1d&iġҋgwc){32 wx`-ink"sofU֛l8AShh':26zfCˡBǝ K#l=Ek8P  ,(VF8mR;"79x%x=zL)9 W2X5g6SHN,#>ш(c7qe2`+̝:92&IXX -Mc!O6_3Q h8u ͋0WOp, k4E1`wwFHc%!+f^~& $Ek3;$\\| K!ToRKw8jDˋSxF!-xAx@*f3.7ULWP22?~엾mbaU_&8(BF *5f q=K[(vNEπR>BhjH){=w6ȶtH0n⺅@pG??uIڭ0u;˿tj]qs^g&nWѾ$e4$[45ZԻ) ʆZf,8%El. GtA| P8+y1|FNx=N |$*$GBAQcHFbZvWA@3|:jWTZs ?#z(Y}sF;vAȘC3j?&ghX<.Jm@yd%ƺ\Zu,)\瓫($p!1PrQ-tagXzx}N;$!}Vmz#$κ.V`{/\tla? S(šG0Zzэ/rGp,czT=]X Ŭj hY7PxȜ`[b`\,vɎ-I8]l܃sRx3zhGO#5&@H :E.q4l(=MOҩVLz!{ '8*x.}<}WCJ[HqND Ez&!H!hze@U"xY$8kOW_;G`kߕޜtڡ'GtydŸꛍ)}wabxy(#Ekj`5ɔVT J#+] ؀E&xE[3-a\!+Ҍ("!R lib`؛<>-@u_* 195?-rβȰ93MRvH!r:`VzC)"ԼגbjJ"¤穪o84=( C4'.K10:g,AꝯHm1 ''m up(Z9h?:vw>XE{~y!Z+GB}qBg0 {jjt@ .mk7dWbi6~]@\G ϳUY@Dɧ6roRGV~ ǔx_3*a_o PbެČixa8h 2\bi3v1< ]&4*u=f |#.R6~4xg;sÏu+Ş%!*A u/2$eU=dF4!0in@9ы?Ԑ_b8slN-+Xj`^MtGRo `ҪrQ0${,E&PA:-%ﲴ"*e3?`Dǰ/~"e} (v.VzP-cW`W0{\>S<`Td@oWv* 5 ׵߀r , ICmŊx F 6"'cta97[8gyv_%i;n 8;m%ڛA!7Nd R:N+=0 :! ˉ-s|Ӆ2Cb"̅2>P6p eάn2Q,cӲn?&~n2[Yv̙aWFuDb"`o@O .&oxM_,Hnd,UQ-aS=`g nA/}NيM[/WI?m٘1eZ) k'?Ov>IO#!8[]Kc:m8KzK;e ͩSȑ vrNP@Mb-F ZCo5C[2r6F&J uy٩l G7o{t ck-Ag3}[?W ?!zo8uPi Zi'~u*Ke$-Iz*l:n zE=9n%:=׵s?:$h<8_xeHm@z b=E>e;wJJ?a[^r,ّ>mC($ Aq1wUZ1i"~F 2N4=0̊4"@la-S³7.f7d+v{m5> ʖjQ=0w܉UZAq넨RU"\D &@"c`<?(=j9BYvXDECrYk6鞶i/S*O=K^b녶hJ{gNVo"=z{Me6 N854 jKjZJ5i}_#]zM6Q}uUԡ80٬!ʿ)ji~~ nW_(oM?|3b )-CxOYIO50^K!oPlmhߗUncdZG 6/= YZґ>.h[M5\j=Fx C)Ex)w!dwE=\^~c+B='>)щ'WP@ H|Ú6?pl |ԾC\y < 1?6)$P5Sƥ!08PQ:ݘV Gƙaͧ*&/&ن^[G4[ Ƨn5,{i4)d [)VƼ`/Mj>NK:vRʉ+~Ub7Gv2JˉU27g!N_5UJWiEeAI4Jx+'#aGt%{dN~oU@@6ӌ2.EOʴOm=xVED]㱪m>NJ>+~Z.Wtu 1p~J.JN< ;(p]1,"Eg^>Eb;xm"}IX>T&9~M7\\U&2ai9-,3YI"ݴgw[?L[ͳ~hk+LŘ Bj%2;n2@IiM~ 2r#ls۠ȳMo(b wkf%Pds/h]ʼnY~~}DB A]/(]IutWHVIw?&т:%4Nz2@D? G l;h%%$$4m>?P6<6BaV8Puڛ&Z~3sVl^i=[d|U|7rd69O2_QivJO^w)U@15TՖ;wy+Bhjce [R09B蠒{[d|x-S %֥|'h{fu$#( T !!wKl0}ErrMq)cjczcCW\xqXbdDK57綳GC庇vC5'DǭpZE7 @^E +Arl5`Nd0/0;oPW^(c B \v?r]:ؗYGiϩCCJiO[Wݬqur(ʽ80/~9)<'8)Y9#z.+S٭%q]HXȀMU&ৗn4PS`Y\Zɚ^n= F#˔[T"58%Rf"krWla4"wD}?®tf hFEO8pU!= 7ODCC/Ǐ @0q:$gnI2I/*fGYUZ#:l&MmX pjhjQ"je1}.a8x78i/ڸu+o'z»_L7jMAm*΄!WŸA"/iqG8qos_rv-ax"iDcf`gWm{n`UbIr:%{n3yAq`XoeCw%FMյ{ .TLJӧ#i_$`(z;UNgQK1Қ ݪhɰ4g1hȆ*)&$QGxɌx\u )IIwGfxӹ#SD@+7}xk ?`껳ԂNB.UʨRLcäB>U0>Z"=T=9#"9n{a ZT@ v>K6Z(fLc-$jn9NsT6f(=JP$4om3 b2?#h_2*#aju1ւ鮳;g.8ў&_5ZZ't74npbV+W 4Rj5>ѪdOzBkKa &1bj a׫$r!jHuAѶ cQl3j:עd;ris)Q k*ٶTVP? %&zݑʣGxv uv( $W1dw '3;C^AMGJXcƶ(\]x? vZ+RGw.t"s}MM9&w3kVҺD&ٲVfn{SoYR"9RE/hbXtZ$l,1OZuiϐem@-_ {7rEoڣHش#0a/=i_RޓO3x ^Z"xȷ+9A[ýpMikFl_<6TSZxRtN s$wҐZ"k+ [aͲ`IfL1 !4B9?M!xNd4{+KYeut|Ӡ5TJ`^eImQd}]}N,$<:u!wP-)Hkm8}23N^O&:fROe;;D'۲@k91~}[lxzOFo%ʻbY~Uq85m,Nŧ^y¶9k:TPLt BF7#X٧*TeRDs?ɬ,H="b5*E 0e[mvH 8d$k(-w4^Cn!fc/1Hjˮ$# wGF\3 :Mƒ<lvOr$Rv7tqF#oxY>DFr^uݝo~%z̐eRPvr)N}Q!}1\A/^WQ̽'3*äʓ;\81l(dqj#:֟n\eÎV/P~naF88 R kg6ty6mrƔ5meŪ93җϬeՏ(LcU쀖m j}P&L&A_)WC ̭v"XZB"$i)> S`Ye9焐 HsQdZ;K\Xǝ8Y.Q.;߱LDG$Bl,pMϾ^-rњ*)؜)T2Xˑ3jA]O>w7(͐kĥ*DDAwR'!x[h8x5:Nr]7~ w Vx W`X^3eztƑ1B,!l{-ɋ #jhhT+EL{5 Vc/.ս@;1B *,ᰍG1 |X(FU\WVBoyA (&r”4rsZ@ cFV[}eػvmI1mq^C\r)vh8˶#BƱccv,ҀSs쯓Ik)Ɠ kX&m8  = fd)Z+m%ߺ9sU-Arz F9!T5xl4LOpi10)xu9n*'d`N ތKhT |azhgላ  f`IQ;I&W: jKRv3CDS+ =Jd2XKqYA(4)/8sg`%DlwT.'姵MVZ=GG!l9bg@bE zR۝4A_w ƪ}]v7tn`m 5rD z5A}B53N'گ<?u."93~G nR#4גm~65\iDs/DRy[<@a/]z328;`Zؓ έzH5qOzu }4PP-IkSܫB]wCg@wd0K+uwAqi,r<`Ugfmt48%?&P3AX~CL<@6jdDVr99Jh32Q'< aw9TH#XU%i'Z<\͇g B'wq NίK&T#3AI. 1"eZDE0Xs<"'uS7$+L);ra$&[7{H:xbϕ=)BLGu?\wM*06W]SB ($UܪǍK/d2ÐpW%}V~()"D|-Tˬ5×AMY%%$~汁ג5J"U`Z!z~?/~){A"ƛ]ADΓ: K> t][۹`ha'z-yB+@G(BԂAq5c(_R;*AB_DIM f'ܦW jGP;$tM'"qȀ6|n2h=5?hR0V 6mץ(74x>Vs&d֠^^j$3ΰ$s@| QL~&{Y1 eZBJG|,4EI _oÅY+=(A;S ::Z.!'-fx{:l `0vKbXyJbEQXO˘K}XY\; hd~$JzWc/B0 ȡ=,2rVd>sAY{JI.Ͼ|̽'xiK՟$Z YN;$L\%#skjJ`N53:3uNDv8Իe@#KTYg z!-5h I~.gimn^xfEۆ 0^=pN@.9^㏚| H<&3 ?\`€yF%j 5QMD$\V߼h3;c~[$ֶ0!TMM&$S 31Nql]7+koY*~rX+?>v>44~/Y տE»Ū`]O^ibe4(f ^*$y*$5*𳿐l<ͭ}Z&تߑe)KWdMh{#tD + ;:lrn4YVNh/I{B#ֹ;"b$AAmBDG\sEwH5]L&=xn␋bCPtNہ1slq=Rb/l,J^jͫ@#s6dZW_GioXtw+SS%y2Tjr\͌r}u7S>/A.lqmE'ᶓĂ/n"_ym(?t+{dYgIu3kڑ]3d#Gz"WJ++K @.R;X6V]ENyKEYz?j5xxEv ?Gڶ7~Djz2aT Vw+*%DQʤ%i`6vJ8i[]B]ͬ3mg^Q  c;$/_{rwKaƸmAJ kd ӟ+k:-PT͒['9.#PPS.A-!5?S;JxKR/@KTRblJ6jߪD[?,h zs,#$96Dq6;VL֔ ޼,&Hӱ%C~:?Ƚ9=J:6 e Q~nu`wU yi{"s>~!j27w*wh>#36A2g:ml1U?D90*^qJEJl4J5qԦҼimZ`D}w:~kG9#bQRKkڙf[=9纘&H۪]t7 +zOXݔ"˅9bsd+#eB,uc-j|͜b|mzF-jz۞9¡svұ1v``>l\Q WM- vz¢>qϽ{ؤ"g$CbjΊ%]F|R xtFEA5&Dm͎Abpu\YJRZ&8hbTY7btNeƈܳu`|ȨuPIZg>u`ը Q(-F $H}Uw;@(6;⬯|Lb>5&F4+y# NŭDN rt`٢mM]w0_ Yk')ƇƥPbw23Aryi8 zhPԝgB!C騲LNNWo INc-BdflvZpnr}H,/h:]@>::5>Q e t!7>ޑt;֧䟩~-@%n_ -3,OPqP%$W1Dk"Z`PÉh_ sg_~Pb:9v\3X!$ַ $AcYWX{MGOeݛqz>Eɜ+дn䵤cVeH_<.b21ގ*,o0u 6hmA!Nvp$R_'y1yhKn4;3$t9cw0 +籘zp+-QGHAK>hߨY3>W*7UUqE?shhsJc822^pX븞Yl3/& ~^?xfü1 :i @K9_1X$ [9! ?q_CfKυDzD>#jl=/I Is/Kr (.w|[҈МzQXp|W|T>P`nY=7:վ\xC<߁0.ʨjDuEQjfۓ]0#0G_Rl_"\kh^z3)ջ*"#vpi:tRZuyaqZZ#{GC,"I@xT ƌu)9!z5r@dMΗInRN' 8'geZR| D{KCNʆ|,59+O]b[|49eP׀phA6S!ӵ/@I2kt0Ś,>9v̆L#cK,`CLpNx$vʠ!euaf˾ V4I;f̏>Q;` 0V9}:⼊0ivh 5 ++sl]"hnLa]ihS"Aa}M$.b_Gυȑ6\)4̝Ʈi[GC퉇/~e}][WPVo9b?ƾexji&ЙImTnSItnm)7rʜd|!K PNV P bE'6fQՙb`a> g 6¯3Um eΗ3P"|^ϧH%Ю*{Cvܢd 3>j4K(]+Bм j АTӎwҹNuQƸ  2{v&\B a4y[֡rMzن(CB=KAUp/J3iNϽ5_3ՐXOP-}-5^ɝe=*ATcJ]&|Z؛%9>ӚtOQfnjs"?iStWZZ_ R ggQ|jp^s_ːy@K0F.%e5!6ܝa2*=g%~צa5r9Q.O=lOHS_L庼֣W*o"nierϯ ig J} ٧Ҏ!(G!UCMN9|QESSioYi- ?JH^hqI3Fn/1Wr$ǞQIEkӏ̅g(>{j%ALd4 ^1k[S ?εnJ*̺vX+o6/")LT\)ieI0/ qjZ'L4D%`e-aw9"j}!˧vi&r2y&Oίy% kBS2 L1h5Cp@5~м] H*NdVcqaLTWqj$oI2.1X1lDAkFOM*plᬇa8oI*5*pA p#zKƳ*:g7%rl_=ɷ$3e[kvt08ձ"bҼj.94쇳ےvt"p <7D)5\'ƹ^fu(@Fހ3v簵{i䀔 Bxi/í1lX£;`#V G{l;4e լ"ǒdk"PWardX]RQ~hʋ]*\_ ̓4r}ZÝdK$be.Ӝ_i#[-NrQ31tCET^;w%.jf^si^,g Ӳ\ףt5E(A8]e Y /aajCF,)ydV:\ {+:gX<J_q6tt5JF5]4,9&=pWc&FP1|c+CZ]'cUeLiH3n٧0o5iۡLa6ZA?6̀;"`;0Ktm^oއTr#(e] xgIgUWڥ& 4A|;vat͖˼\u4a6rܩbK8] ӝ)dQzKLMDR<[di^;܌ #XL`?'~rJ ?'Z` qjՏZo3Ĩ \``8X=-qF.#`gi|QUfz@= `\Uzow>Y2|TH{ E؊6$BlPa4z(̚c p}]ԡ?YpL܌`x-uT`ѝL7wDc39 l-s""q%Y D|Go?'P5$k}u0+hI9x;o4"!Hz36K$}54Q$Jw7켅+-e&#heX;3ʴٜN"6O|Np%ۤ5!J['Y@N*?fT@qo6IiKI=dqPd0X}IaX]2ђ#p~dI,eLcH& J.D5y G'|< KTj}52  U,ա__փp[ +LOH4O_Y=r3OeLT6%e:o> \G<=4{!ۘ3eMn VR'KF|1a71Y%2h4{.?+F I^sV'U$ -* Nջs]M6 DLLKdVz|b!uX7Զ=EBtLs'q[OaC>tUb_0%dT\_3r)Sĵ gŽJ8 ̋k: TPؾ2ώDi 0$'ƕ놩1Xq/'Zx5n+v1sܿD WTX1y5ի<%:ed`F/sVcCbfc3\ϰjU YlqIk}m8m/cq 52- k2Ngi#D$#*kPHW~# }G:[a"cKb'j[,U9"~Q!Ͱ'^6oēwB߭8Pq8"~rù|} ~ǿ5ÂS+T_VĶ ˄NQ1UI軹]+r/h%P1͘p|Rx?|Jruڅ|޸ub`EVbrtBZc,` vh/7_/ 栭p 4!Bm_[g$B_@ԣܹAY~YvQԊ6ߵqZYqs7W p13!0}u*h'B׉->kā:!<S1D)htz&XS"P,+IoMbұѡT`:$?# 9b4eoqOUF*q =WaF`u?8p T,ā ZiEeK*MGOV7M Y y1:bv{ؤ99X,³!Y|[%+ >V9V(P~ʱ pE SpY26zMoi_ !֒j9 0.Sܛ0{q  {0eDmX'L|n^hwc̡ sjn91v{FѠn,Lm dTI7֒"B%vc_uHt\ cGg PIȼ9NS@႔+ X‹<ܢ~.6'\c 3j'6=Q{͵vz!9e3Z+fF`7ڻh0d/X椀a{,Vt#gn/T]NJK*3~ܼJƤ0 ZAz$BѰ!k( (k#ݴ?P>^|=Q\9]a z|(2J@􀊋^ks>Wf߈lfyɹ)8u5}~ To,fВ:pЧ*[I7Ҝ @JGd]n!:*D!icxPOws?owݷf<8E*$'\Zx $fV+b!ܻl=meJP]pU^}NsVkm3 g{a&dΫ Vsgzl7~a)*KHXVuA<"83J")}sU$˴q-ך(;<l5;9>0c9DVV C0ŭM_/_nr9x&9YFX_=aKJž\riQQbaQ!_f&Sx'6>hz[)CU)-8;%ͯeȾ#/#tX+{e͍GZ_xwD姌8*I,AXtУ|wFTOSax RTp֝U#taO7M[|䵓#iLjPUe 9GQYq"ln[x]NWݶpБE-Ȋ%T-%OBCBILRyA.g/xh?޹;UOK}&FBx|JݡRjEBM*'^u | 9L# N`Btكuo8ojQa]Z+5I6OL7\(I]g -*uxoO0A7%Rr睧8 GŬ,q]6^*?AlWc2/ IM"`4%f?W%S28M}HyJXxC׎AT_.;JzE֛!|E,tZo3(JFRFb؂;)13@^e~FPZ |eÏ>=(ѴBOG202;qe- jfQ*RAd `){CsC>tqZ<`x̡̱I>RY5]5d9̃|/#޵aFܗ?H+DC$yp(wՔfT:S4TIp1wu24N"J! Cjm(G3ڰQ0sn->VѢ0s|0;%\q44uzIk;N/5,-G1Y #$M}X~~adxfzӔAInCMXՐPpКu o(.D jbu<ИͧC@aDzv6Nؔ F0a#;΅bN x0kFn?w3@u]kv`$= >q#s4qH1UÏ Q&f0n-qZ(sVqNΥ}̙*'fN"߆#^ b JۧڥZj{/40 ڭܪAl^d6ڮi(#&rX7d'}2kj|g Ɠ 9ʅNl {6ui'F!BQVo !P{Mlk&A[-#Cl>˲K2]bw6l*#T1 @MىBC6;UMN 8˾'˹F4A^`fp:ޙ&0F96y>- 6R6nD@dڙ}!G1s"!ͫ" P)80e¼=:p\Q?u|݅%_:tLVɪ30oO[{XN 8ph^`^6nb޸ioj%Nsyqd"(BTo# T[/;Qs7X۫9; #3ra/=]K姢rq>6ŢR%&#psu),IŃςK`,6/2rEhkH/Q7t'xm"ճm%T!̰'X~W$2]ZAYݬ?Vh-3p:ؑ낫=*L<݅ImǷoezm(&Q\)>(Fxm8Hxdcؔ/'@ͦlUCTo 8<<ܽ|\O2uh1-hsIa(/ I]2BG"]v5v>ykjDP~Y6c6=gi|.ydzw֌I6!õ#X3 j,L.!WTK>ıI+n4Ʀ| w7K6XW+CzP{èyi3E:/?/6¥ V( ʢD)o7)~^Ifj;$JK9ON\4W`6PHӺ7>"bH$>1^3;fu'IH66v+VNpJ}agUF?Ƚϔ |G +; 2"7L% oQ+ޚ_ o+~b]ÇHQ%:AAB|w{&= n?&` ܐÒx;Ҧ8lYxknw}[M:* {wc({Ċ!L~sMwR']%2ʒ^%uo<?UӽX^[|6oBt$xi;GF~Okɚ2 " obn`Y T@das4-aHB0j hF-l|q>/ď /n!]Mw..'¦/C -"UVxE##7 8-6lwt@˕[QBת(i50T9keI+]6w7=MTt@FiL8 `s(x95X7} b<NpQI^X:!;jJch";LƸ [ &!+}$>ޖ5aKՂސ8M/ntp=F _i{z`-;_Aml8YnVj& o"Z.9ݞHyv쬒eKSg|> Aŧ~0ɺ\OJXX$|s+G/>a; $҂xI<ÔnqB£`Z0SOпDα&^&z"1!Wv3$x=ЯK>/>dB 1M ޟf A='`Yތw)6}}0ICBL>B.wx9{iO>/J~IN[SWzR;ZЮ"XXwbldjqoVWҚ,uD^@GcEa* ؆e4{ շl^]B!$1׷dz?d}%f# ~Q y?Ljˤ-3}P[SɁ`\frvkcK)${'7>hgafO]ref?Ng*$ .xdU~]@7@L$l05c̑c.!Kx}gHiF ;?8'Ź8p3%Ǎm@(iHEa7#uy/j\ųpMǬMB*qցF"#%U#MXoȹz \C7pBx!鼿|Z;=[hj]iB`\In|9gdp$No7[1Tp@c @xDݻBs#~͌*~C"Sz̘p6>Si2kP] HjTW ċwe'aڨ<^‹\d,}azdY vBa`'l9%aFSnlE.DW(TsfH֦y&]?-{kK_2^֔%d& T>LlV S-tZBYNb?Ťry+Y;hbo]kL7|*7yOۨ;Sd;+z T^B嶔.yb [~rP^NG4HQR1,h< kS2cR6EƤj f,OjGtYy p@;3'~lw<6뫀]z|KUޟ-?}ïς$ DJ8n=m?=ZfCƜ²"@tY"QKxVe,c4 [6⁂/ vRWwvzu2 $ Sks2E!k?0w \2V pX͖h˔`$zEln}0ROH@s4w9./0&U1|"gv+[u2!IR_G3> @WS^ZG"STB5\:xn 0 !O̭>+w>nFԢ{.|TY}'PC} xGBgN>LyJ9<5Wmk*)Ѧd^vМ%|;u$2"+6(OL!ݷt ct?Z`)4į2Z-WAij,ψs6JUb_C%PPK~O\uRV]%_0`VTNkƧ Nf\RB]0(>-)1 8䭂R*05cCT-BX85]8yQ7|$F}M AǒN-4λ>"qԧpV)w:|_"QLV3`z x?\h.95\>`O ϰ);P8h;+ak)(کqp_ .lӣ`ReH⋐@VO^S%Pe:%X# ]M4x7Zf>ܪժ1ǽgE,aG+;JS}]ˍ?}VE_0wuT#]NՃm=w툽{l}ypTظ'I0,bDbQ]c`%]CM>V8cL/=MMЫBСo2}@]%nͨ0z,8/jroGyRVϞ٘:$5J}v7ʮ️s#֖0Fa q46 ޚ4yNSqJQzWPT )j;Jaa}x0;qk HZ͌a>O -,[Dta` nb5޶o"PJQ8~"KNqQ(G+Qe~gE(dg-ߛ#t®XEԡjwɫMhrрv ]Ǜ F{7I|9Dq~au^!m?+P0qc=nt($a&qmƕ'Ϝbm1QC:m\B[F&%1?QfƼl>f ׫!KQ3& oo:0UCS$uqNHCR[{7?#r֤r%`wJqڝ)H^ FkudDWk9gj SlAg[95pìJ& $wOB`AmC*Q!wFAds_z/'&6` f]M{/I*e+{ЎRo'BN>RY=#l>#s6I}#*Hm j L1/.Dr>joR {"5YXf;YKfg8`DĴ(`a<Mkȯ=vsD3e(Xqӽ1dOFLl]Xw\7.z-uM,pkΖ ]%S_цzt*%'ףgޥ @D,ٴv$l2}鈄GGLB6`Gs7N>qȁ,cOǝ2 YGܸP;Ӕ#\!!}^#YhF_V{M@눯P@g) U),:chS~TO:T\-VRBFdF=P\;$<_SM0jL@Ύ΂:q~_4>/!aq-ƲH[z2B8ᅫtќEEʼn='يp .0(Du UB+}C^g+>V}6zRJr?Ѹdu=S֋MI_;wuP~j%}afx=1\mX4o.msa8M 'X nelPءR۶WB!罶*#K+ (^6w:ziAgLD"{m4aj%:Cz-} j~ ǔJLRdl۸d{uBfB =q_3'0Bk̂XaXnlttkm?D=-_e@Z~7XC<:'|gJWA#v~C/vu02z7N"Ynl+zp?-L&gL4a5Hb>NĂwldx#*ΤR ځj, Ks|ܑG.Bn,1yX>6JTi3,DH2q XJoewsl3?ۜy'{dvgFN~ ĻBBS¾tJY1P6*VwifG֥%|fK>VR2Ob,,H]YH15ř"z&ɺ7F{"̯⭩ْ=^;` 2C^x (Lwo — SuZocNlu9:Ӯasڿ4`Ձ}7dvW<5>kpS|bBUP>218֔quyJ_ܛkOMOwɀ5E89mt`ɻoS4ʃԡlcѽXl6+ѮpzÙh[ؖFc/'R;me=?f2iI&cͺݺ!>55K]xRo* bJ/s8v"DG6B&߀lJZg})\@:r|ծKWlP#6P1g(HxG49 F4#W *! gl)fV{*dDg s9./e\п] ȷ֢E>a{A"%.VMz84^+@zL,:JjL!-4 _:yX0/*u}j ~߭n}>ffB{.!FI[?@KM'ZcuD6f'Q V~[DpRljc#̿ǗIbVFbV`Pz\(`#?E:Ҿ,D;ƹAk K ֑P4%LfFzPWȋ<( 0)ߛH эka>=ij*E1e" l!#̼mtgF"uS6eک MW*iOܣd[$ :aC %Z湁 B E#+(|Ư*F?*4ry/ ꅃ0RF]s  vlM:n+mqp`^+aWR#j%w` ezւ()%2E4wB=< *EV(v+B8.!uSMP.y8 kCYb#sS+i\\uQTzH\r\_skÞDU "uZ!(}vp^GW^Dl{FME`'-];æyAwPYވtyymWmp<8hӶ)FC)nΦ,c Z{~%-5H*~}GO*Q.9-t0V?-U̦֨KGm+d"a:ټ~eqv8 F%Q0" LQ58%X. ?O{턊 ccj^23{&k !L{(~I;Swnw(5a^^i7'v^Cݒ(+<7fD F'yMSaJoݢ-rȇ[m 89]ىGFV&'t6 3IH N]D4<Fd2:Y8Av#t΢k(ֺ+<dף[y:mGdEz2$;zuq 0\ٰ;ƥgB,:4뗷z:Ϡ"Bs\Ʀ'yٷGAk-)eJʭq8s{){g%+ { ٶF_i¯MV1ًI$UY+:GzFg_BҖJkF:xw1d_b8x[񳗀F  Q@)g6),I,<` vd^Waх^X._忎t8P;}ح8kʋ%1]ˑՐFB]YHTiӲdٮPK sѴj;ٯJLo\S(J! 9IUZ;# 5;3VH!z8}'w}fr6{,+ [V=,ÎK3c Ρhg#aj0U h9-khJe$pD,ӳ.u,ΆZv(yNs3kLٛm4Fɇ@] }n!у]T<pH~S{qH1 ;=eeN?ftnx [ 'L>,]vI~fbf;'1:<?>}4W7 ]oos_S3TO]G9+ &dמrL#3qM}r1ٶu&X[(viO/a{UT ܄bWjy,J_jH:hyĥ4@5;=+Wn|8<[[JzP~؏QFW6gE]]& O1Ԭ338 :g  t\jVY {^E!xSl8EmhPQ-9 ZY1elKyPѓM^ jC(W4#VuXi1 "i·egLO}TCT#V7 )ω } 0\e[h$j)$ ƋhD+ JL1\#0yuʲ\]!bڒM6U\A\@ǒoJpSJ.hdv8eTtkgzzn/kO59( Л-%5YD@\UQ/L xh[fTOWS`ڸg~9"_ 㫇ٺIYO QλTF[I`/Gx;bG>NyRA]u#eUCCp^fGpٽżE ) L ,w~h$9}T/xϾуw#igaB'5([fxJK>ރGUzl#,_ ߤծѴ[x_i m[3d'Ѿip O O\L-sp!K2󒐿"`ic|g>{|]zgPu:&={1^F= Mb;Q zV>4<;VTEޜAܧ|'p1s-~K\-M43hqDE`؃t7UEڒ7e1ЗHk^۶H[7VGiV E ^J:cur`s><*qQKp)vȶ%ehIhPo{)/O9WX Cr͉.>ھd,қf-{ bH"sjL0$;28 8V=_v Kєd6苛*&M}aX{qg]=Wdɜw7p"C@;FMKoPҲ5ZEJ~g`*uPKF9R *4bһLxu6NQfu-ز*\FL,A=I/%3YrOIDQva%#ctb]A#D@m K'-%GA:,.Euٰ6gPu#'TGHK- GSX!5 :3-=篨)c:F6^x>x1U#T#eE_uN>!I<_x~zV? usZat3|w=uweP֚ߵ[E@sQq.Mk|f`HhSƁ8ï0.D0Iqʪ]h >4xS_&}ճݓ?jY)ؤ,}hþY$Tvz_=ާ3NA \=X>H6½5 ƨ&Sp4GC-$ 5%F$cuQ-C)(.ocf{.!ڿp^Td[YDw)q[\Dî5':m`Ps)PYK6G idK0T_wlV LT:(J޻0_%LepjB&LNn|Zžm'm#P?|`Hg.>h4Δ,C MAh?!+ePML6@t1{>><:!jYʼn5Ǝ15$A +r돇Jqm2b?і&m؎A`!s"2'+9\HDcݍ7u]V'a, QwD`s"N=-=GjuIxF3* U{ugR6mKL6Fns֔T)6_<`yriZ{g_1|NgKĎ.ʦYC!r[qa HiP(ː7e-"IϜ*@ps-p(7/\NRGG1Y_ JLGWw]Qv].PB?@Mo$YzG# \sD@t1M)DYhN!hCo;O)R;:-tTƣL20E.'"s)AXu!Mux1Fu|)ꅣ Rna3^BH˴*a0 [$唣T>Tb]k޷EAAJH4x>؝G4m7wn BtՄ ^KUYϰX@m Ph8eTWݬ3G0@фK o!J˴4֮ ٧uk6u Jd6-KiD+1+0q?א?C:omQ) E;8@a[`;ljM7Us!mBa:ZҎ& ,8vrCi$.JpՓ6ODpqPMnyAE~U܋{^~B@~8ka VKBڰY't+>pP0]:ҜFIv:Wn;MͿw+Þd Zc`II vôeI(ꈬ>!ϥi_<1><.T@#ϼ~RhHi7hG"}=d7$г@(5p`TC]j [dB&[qPy{)[~P@р,vU:NShsZ={]VM2v{ѷ`4}*>};',7! TMB\غ$bS/$p`ޅvf|Do8ռwhШ c&7P@#3Y=\ mÚj;Vr%2|ui9> cL.+ŇȲ(.La 4YYD,G'TF. go}-ڦUVk4wjf,]lC yt$H@@+x ~_#'LeI(Cx]v"b6vt3( =K/}k>f(LrTgp*S!DF%Vzvg#3x5@GVwtVRpV+n`ϊ}%f:)tg aphևP;(N$<^'s@@ ~*)jv&mA,?ԮMjYN#~Vx/P Nf*Q_/pF#m$qw9L~$>`EhkdY u:D?M y;l5ɟ 8P"&i5sRv -mq[G٘TBW|@NJn @ [ЯYFβ0(V@N+㕋OL:ܯFY-:8iRbL>wҴ AmLkM<};#S ` 5cjyaOZ*sDۂϬi>Ǚ<c$!Jeya[xWx*~([—Y-{2inHSc2ƹo/VK5]$-SJZ/x iC쮖X?]S*u5ا\~ ds[QAZ~0Iwiը3S;Ҭ7vZ5p>LA UXyZЙ2zamA:vA46M?53yUpX>ؒ2+퀽4ҢvIv?5\AOTmc\9Sr RUtЩb&tP":XIwЀAP:3N. |%M(g8D޾u̶2ť2gJ.>}[dE{y4V5b1JВgisZ伖ib٢urV?4:ө$XbOAs)m`Vd%jŷ&J(WpjHQ],$҇dJ`/Nf;513&b@m۞Me?g3d]c"X~rgJB;u#i_g$TdA3:ۈwK3sz1Tus_Ȕ]Ү7]7׃gj5hjz^*v؟;qk% 6J{ae:"l, C:(!\pI})H E!4+}4ʸSE|Eb~1hznM/2I3u 8s bGh:0WHL #z$<ڂlL3yঝ'Gٲfx O99YvbD, l'm'2$H+_ Q3b &f`W[z0ڏ |5s7̨`Ù:+l$Y(CҔMv0o*6eu ).q*T_#[LB|(1An oMOA64;^H@0$( э_uC{]FPD;a@eslWu?&_`f!V xFӷ?{`fб#$a'{予A*X@k|vjZ/1z+lNŬ3M,n/E۟;eЀ˪[lדLFžX/M5Hbvsh$oxZ5ǔ:.\[ \NCBf 4<6W`J2Ɉ}lAϳk*X,7<=-[^HlhZw׿SB?&kCUH{B2&`Mh 'a8 WM>ּN4uW| R˵.<@c_ 60Y[S@r*rbj5md&:6uTnfO3涚9~Ar"<4ipIe;x >Av#/y6(ٞww;ȂD:Ba$WS!y'qa6ǵ21S'< V >2` h%P%@+,S8vPKe|2پKspgex^1A:8}Z8$,v,e]"6 Bh܁hBF蹲pݍϺ)VUqqL/=t3-sVK+ЏaKV$QнJ{EI Hj[] |i-2:3>P 5Iطy++bˀ }Pޯ&-j[a<)3n '4WCb]APX*^@͟FfePh7χHi;Nc<`.h!?7.o ,tuLook LUwSM{t$֪K+B87-{C_RP܄\fNHA\'(hT;bnv'^{}nK 0L4ПU4# l#e<]qDg%[AMȺHhM*8BW2QL7jzIMFy).Rv ͌G~J˿j47Ԇ>-8$6 'XdFF:+:FऩeւԺt pG࿱ȸ_SxRB$2$@tIۢf=1P7)[˚6~G$U( $U* X.él7O)k$p%,!{oxx+7+U F7e-ALDjθة~Q}e=  /j?$=yd䦊$'͢)YGVuMZabqG~wCL&[ڬtd;xb^+@ސm\[[hE'Nӡ'oSR攠Ǩ>2)~<< B`T+[625`lMoƂ/'w.\MPPw/Rx]r^ɱ!"܋"1fⵍx%Tspz㈑w_yMVW(?QGI2UuG78`w4mD|ܲzytClc  "X;(3wG#D\hoɚs.YB@{O|Yb4 N$1n/:2| C@FPHPS Xr"4+I_E^9o#%#.^YMǰǨlcQ=cX-_@ƯQW2[ɉ0 NF=,݉ ̐X.N$σL ^*VMSrV.uOl3:>Fq[[3QORNm0w߳6Z}AI +]RY}B=>Lx9#0DHT{Bl*ˠƐ;S+)kvQF&NZ' զ>f4 \g)֝w#A^<̍eB(```vWygf"E(1YB;A a)K [K[azyE 'L>ٳ=h>94y>uN݌.@Z77&-e^䕯-jJB)s>@l[({#*;jG{lxS2e$|$`{O}:8J+1಴1&-c?du1Sd2! 75u!Meߴ+7#0G?fhǚL'?聿"p;-wzKVKkGm} FZ>rډPtG4Ջɪ Anj2 8\cu~\õfJ:C* 4ev"kwnz4`V&|^֛i+ ,<DXX' \)O`dn#h_A9e& k#1A2u3j$݀!qEiYeʑ,fY|Q&EE{ÒU3KJ"֢1WCNygw :b!Nq)%B:?%r]/x3&SU;qz0[Z++9#e[iDA^2)`D;Tk^G]& c {|iDm%[!W*S+tJ4KQcA.rS|m32 H_5css?0)ݠZ\qɫn0IW1+5[_0W7sb) m %{a\F +5yWJNJ0 {AP{_!&J^˘kGyZRXgRa]$qoP!JЙ%N1`,q6+^G}]~glpJ<'.9ˉM ku,ow(p9'u@=/z/4@KUx6 {?Al\ TxrRI|7Ёnɽ*pC`[z݀qX}C7.T!VK-y1A[Gy.ApV88 7+SEσ-F} Qb9AmpolžV#k˗[)xmpׄrs}DjZBO@o}i)P ~=ޡ<?X[iJ$\〈Mχ?;VKOP .Cd_vVyr> KbLp_a5bȽb+mџO[k$ŀ<9z$t~R],툐hMPzW(LK. z">q(HZM@ZMQ"K3-@Y57R~5?8]5]Z7cdh@ nع|=;R0t_@3P+$j:ӬTEJq:1_2A^XJuqF"Y͆֯ sNtʜHΒ Cx !sQp |0'H2eсTo0' ,99&"z R; 8Us~*F Z _*f\(>mh^iXFe?78_9PچrOv-_ jȅ -^ ͌`|I+p*Awzy%dOyq~q(Pn1v?T{^tc 5=qnۇ Abբ_pS k'TI`cPgxvl~xϢպ)=!2e.tsb\Puk&k(;jOG=A^9g"D"@tAHeapةu N͈lpY%fZlǮ0V76m B#'-3Lݧ+iXn"wڥc_1q:QЩGr=jHexHTū,C9$J xӑsk{j_OBWb0Ksj?ˋߝUhÛ52#NylɘA(yl td;eBRɎJM!!>[nsDZM⪔=mۦ/d K[\FKP 5]^41q6*gxb(LyF.w\CԤ.;n7n!Œo^TevhFl~nv џ b.@S #Eu*?6LC6L縦z~T,X0,{Ȩ}8:}o 5C#XZƐ O@37t) voɕ {?O63!G**sH(ܿ*<ևS[|ى43| u!7"$ ,.Ot-x LI8 5{qJfWw 6T Dju*f[̓%es A3 d&e䝞c #]90aN>@O׶URйwWtQE-\h\;V^udwi#k MPr5:7hAW҆(վkg^ QxPzh^~ ާ>U0%z"qVMsuӿx QrǻVIclw2L"x} WV,<+ ։{5ٮ }H1d4/#6~ڰĻ3r'U*TST \B#H6fjٚ> '0JKB {qO:%R1h4rAj`t'qoHPi_j|5{:CL8Q̙Ҏ4-;VuE"FC&$w1ܒii'j7BJwΓym& ںYyH.T?r8XF  .f67o|I`7y| .'mO87;7ϿWd|T@csTd}A5 {Qq2kC'X1= []"x-u!MC]!;YהRW1؅ct HQTL|>G ʂ14ld;\?QRio*V"O+! ̪Z5?HՊwHԎ-ʽύ5;.F JMia?i&fż%`P|n5JLfIZx0^s;ML8+4xm+ؗo &k̕jAw Q49O$v^RPEug ]WxWR`@ ",x~w]܋0C>CpL!1.c]Ux>] 妤&8%,Xz! K<Zзf,N6ApST 7pay뀡h4u6@@zĄ[ptA#3bWt4\0f1zܰW0CvZ+j~"ӗ:3YKc3)0gHT݈=*\gFz"'6w1}tKp n5ax@[E?Qw@![])j^6wSK)HbGy]{2U+!2?DrI{HZɠe89 3N_C/zGVB.zO;af}R0Wl?}5|_v{҆݃_8_: B3?J=ha|!QUD\nƽ:Ry;̏tUN?yp3?Oљ.nLv; LJ2H,MéCI  /<`̆>Y%l]s ys ;Lp ߏ7jP$#q I})PV[9^oh`^ںG(#dsW#\;*Ñ_W +"7@ϼVA@9:S@ hb YF=.:j((0#為k$F7i<&H<ڊ;]ZK4_@r,jk}PJ-Nej4,'ǣFƞ?|8k&^~ '2tCց![ULI9P-gtժCnl6 _;4!d$⮿R.WHKRB#xEG]"*:zG vHI6tP[fd?ܹsdvC_ȼ!PafD@Ϩ jPC살w½+'5yХY\654_f|wκK mO11c::>I9:_&o e'2ԇϲB26O^u0iioR!wb5+ Og GU4 c|:ʴe._tPߐUKԔ-[k`Ehbįrݥ V5҅'B tP[i3ʶ(u} V>D |V WJn-#RD-]-Kc=qFd;9r#-WgV壟6 D! M$نKc1Ո3/ۍ7$ X߮2:D{ُ濸n/LUx,BR`^\RCxWk޺pt%o{bl=$/s,:u}(fmbF{+Kx>Z+?Y٢(GV;%.*$'Ԫs^Rؚ9k6|D)A` N~AD繱~iIs(*I9x̌6Qr\<%ųWgsݩ0RJ3'Zs`m6Ht²E Wa>H1e27ތE}|E&x}j/sARpCF)2#J5[F 3w7ָEC>)$ ꯙߒf2+j]_JR|N{m;\P6j6 s>+ko6shP iʱv)TA+*I:²#k!݋͎a߃3?XcDydv'd,/BO9_Ncz^L᥷|Y;Oďq~i|{ɇ.kU j ťLXfOgRR}u|c(gwa mHbw|i_?UA8t?¦T-6v>R/]lzBXݞɫ KQ̊} I]aQZ<Ec ưfsoӣ$%5q6LZ@!"^3# Z7$ Qk(t}&,_8Q::ྠ:xVh!W`>ba|fchXth cpQ5=񤢓PR$("?6DM ^Q MhOj{a3N>O>J8 &8qȫނ}ps&Ӂ&/^UZ3qCkGn6Bn*"_J|N-Hן}X^`儹l[[%.ǼYU;Ӄé6e ׀beɠq;1F+JֱwfӌySR^~(ZyAY X382 A{WaDҀٙrm[h='$U ˭Ý*<_jV-)Us6ZɽAe`sݩ;S4OeQ܏ç(-'uZCz ˾; :z4e;g)SnVqJ9Ws; 5 l\;GMWvd!ɤ:7ADd']p % ?Nnt+X:nFx4 C|g$nYEZKUl>?5ɗT){X דcZώFH3 b,ZMC {k8YD2pB(_D "b8}ʾuGR:/w 5EG>B h8X4 ɩ4=PO7;e'Xc-X:C/!ţmIdmC|9‚`n8IX/V~qi([PVomvhw}UO7pmE`B嚭H*G$=%@Į̤Ip\Ah4F M$rEy_}P$St^r0c[ gY>j1D`2x2DT *+UmwAIGXJl++^KᘢH$W8Q0*^EMH((BZƘ;Xu##>$Je{WTRZ4ǝON~I?1:] {j01Pc0*JsASe=PW u3˔3~Ȱ}b%",X1ZS(9Es z*s?!Y#Ђdq:f!fb t-d h?Hv 8*kf0n}/)gF|px`Aup WAFMϋޫ)lwuZ'dB#wrmMʩH\g89 ҭǙȉ3t ْԎja[{Sp䞸 EQH,k@Z߯]͙j񆒖''NiŃ&Z\Rfm=E6AK2L?wJ:NVtւ|Y#m:Au}9-8/7Zd- M$8Y^B\\ uS/MlEaq\yPn;Y=Oe{ D4 hkŽǾH8Yd"bJ` qi`Ǥ|R1aʇjUw:}!-rd&\%#7B&!L2^_;(꓿`jZn6y@A()Ko; p.U$n H%k6<yu?H*vdE;4d1;gi}B6˔Om? re}ߗ$|(°f=$QA=6?k:#*խ)z8~ʘ8fk`}2W{ƀ vpGg޵Uk+1oG$ؾUXڟB>zU*lU-)kfՠ@oXU2;DG>Ne$&YSi)ZL64S1nIrafY[Oj!e|p?QU EB WSBPW 2UĤ;]g[5sF 'Od_Y}wz& Gbtf o౾B(&C=p\e8kMDۜ/Ufbo* (N2O Ԛ;6 FG5vVeSs~wAקV ߚEyY.|.Y ;[ &p}esG8s~#K;-m=17vSsv+#bi$$Rڧ\Ƹj4R4Cc/ZFgQd|0@ +!ltx[JI6__kpSZ3Gc>ϋ,{ķ{ aȵ0H+ zBդ*aW@L@ta+NVKg1p=A>xc'X  ?.%!擺k1:ܧno_=yR:~.?.TdjxomBy7R1+p:%#%j2w Lq0w'԰mc&^j !J85⼹HI䤖zۻcѥ>JIu蔂ouuB Õ"ȸ=74.h|ʝfk,7F%m3Kvk(=I@L+pLaFO o,>=!W[9ꇌЯ71H0@5:0z8gve# zp:O!1AA#WKm!jUl)|aEDi>\&{|ֽY9@Qw#5~+jsXBGd-@ϳגw%ͱ2 Œt T=&FboPQԡ&.Mptw9%_u!_YTA/O4iEI*E <ơkɡiq9'yzz O;K!8!ѮmK,#f䃌,b!!*'=&El|PUJ6Mv;R:`xm j†>$ٲ?4LN!pE.8n*': b kdϛC^>sx*uNIDNe\R&>? 2%풐}pm"j,LD}/ Uŕ؅}yRi#";%[L7lV5sP؁sl ͪ= Qb猉mGޜhЃ.۝lU- 2ݒ^(~%dQ6 [ԍw E)p F)ǹ4~Y h4]lz캦ZV;ߤOz? XroՒQUОT>'KG'8ihwU7Z eBY_oҠdļHz-pml/|' @V8\iտ' \}'0ڸN Gt#(cʃ,FQ3o+ڹT "]]NqDF`%8cԲ(m8ĢS#>[x仧6!!@Lx4')-E5:hyJQ [)rB׹dBsnǜ Wgĥ>%ʤ$u?vH?ص'X< ~zF[;;XR Ab ӇCڨ~1TTV]4,0 Y[p7IL78Q~öbC4l[0i;Ƞ3=OA%Y,);>l)EGFѣ!B(\l_Þc"x0{Q⇮V bRgƀ rNcami=+|,h[j6Ko %Hq/K0z8?u! XrݰKqn9tX8;ƍ.v *`*d &wiCp'nóӏr)#aKN1c{^Uô`v-H+tro}nQq_&y1^<^BP9!mk r^Xcգ,ڄ*޲t .I%b'3z0NܠS_HN')])?b( Ƿ CuS>f {f*?o]Aa7tNkҦC~2l/qu~%kIPnY]gL1 s`I| 1n^DPueM`Yr/=t[-:i#\tBx<=d#p9Tfgw2`ߋxW!aσ`W(9,M^ţļ̖@Q6i odڻ/_#쐸ʣIFr •NJ^VG΅$?F~26 rImH6fl-x &ES'4%Y.ZoZ\b*nuR ]Ji͑!A k```dyN 8Nu&wSEa{ @mgGE`)Ȑt0 1,ǐuI%j!>05A[FxpZ~&dnNHp!+%3!%M:fR $u'9l%24u9EH9!OWUVn'@ydLDӫ[@$澶>^_3G͉@7X5'pP|Md _[%QݲIgd=;4UDl+x'!2uKς5҆'#t/S 䒭(N$")S#Й唽1ЅrX.1EwaKy+,C|܍ЗPp3Sm&mheZ1t݈md4ev:qE}~݋]o hRJXN+.eBqfנL]9Էc*-3J7Ru XzϤR`6z2yXSN`ݝ6k֬do=?1Q45ZlޞӽZckߞgV)wYPt)9d<؛N~ i B1o|vpl4l!ybh |f c)` !5i zТekZ z  '(7K[_{:@޷d)\ŵ8ZC#/U/mh+nl7Y+0"C}81"<? 1٧U/㟁MeMR7AcqE\*YH:EƎ-u*һO@C:`?>gՀO ue&VX YvQuvi^ to*V}ɔqKE.@@LnyUv030`>u]cU8Y;:),aCOBisRM (Y X[ybo̖ [+5SWwW;E_MΈƇ),A Kj"0bF׉Wj &}5k%q%j71;\#b#=EEڹ-鴓+)Fye7σ=Q5iUfd||68 l3a;".OWt9j@.HLM,[/{rZm4Ï*ͫx( oTi9[>x%.4')ԖTP QzBHYivC@J!I[+MLAnMgPVM&<$8#BcRCKKB{wÌ)>CÏ@"sJsj}KCI4`îALT)냊Q/i،j:gk%f.]mFZTt֖G8B;dOOh|`rh3Ϧ2QqETJ-xj,´7 KrUfY&OUuѓEiO"NҐA}J4'6sdyPd&x seP8ߨ3Nt/s]5= =HGq @|]]{NดT"!4 ?N aScv%֬?=~-Ήt}wCBId+1 t8*_[I=fĵ5Q GuIs.I k Xfh %nغi<Vo.ڳ;CNn0T0\_epU<33ƌSTqD2* o+BP^]ePeϖ355ÁYG L1상4<K_ahC{ضN!aOyU潡ۈr,!&J*fG_ ,H?X J?IW quGPxV+o`AQ M-H-o$Ȋv)0H>m c4&p|uR2)IqVl,ի/=ƹX8{AP֎+!LijfQv-4LWfI]Q%J^ FOJj鿚;jY 9W ?s4l}{{ ?e?:mL-Lp)?+?wIa8ulH#p2ϣ\ hӬhYQщaTn]fӫ1eM]Vi;X.OaDU΄5*vQ =hF6'\ҞiL]7Mƶ~;jua$լKX-ϕn#QTs$Қn}oSM4s9?`n짩o[ ]!QŖxa;6$֜`Q&)aAckOĊj?NU~dfvŅCDb l|젠χlS[x-ٞ9ʚv>i][eoeg( :nu+LU/<[!HV`PL?%-R3SĽekm 0I8T1CN~Rnց-\]F ɸWzғχRjbi%Irmǟ" p*FpPw_ =G^w ;kAXz?lL0 QCD^x{ؕr@q ǭa:43-~=Vwd~!+8(NZQC_Juud*VBC_m~W<`X4 Z~+%$ժ:= csX"%#jJc!"\YWH&I ㌠퐾ܭM ȑB52{oT,?O5! a8Wٽ)f2 Z{IE5_07 fI!^㵈V[zW빸VW,;U\u'O @t%zC)R(ȆN'gD/ł G԰TZnżkޡ =K V QOߚ%W24hN`)χn~vn)g5rj>K ǻt^vLj%.9.BC1A ƨ7wl @PQFaaz>7@OڕP?Lc'Ew7kKҔ|HzoTq*ku`(lK'Xj'4v5-7*M>찰6 ~Q 2mG';9Y@ysXR\Va ̯p"͟ac94Mt^}/`3Iz +L)B>6ؖh?3iZ/IN =%}rC Б"!V06(Fq< /Hs+a虢-:÷ ݳUyjV#V$nwR]N9g]^"}: &(|HMh7FoM5F'hզ[`.? FM U(SQts_ 3Ðm/kkfP3~9]<5i7 fJ,@3`4f׭ Pacf- gn&P9Ȑ3gjFi+_9yS8 /=#WЉ9$0С739Ͱf^ݬ-:5(/_6w @F9l)aj, ݉}'t+&}iN7ۮ9j24K.Qx!9v,Yk_._Lt`;WZQ 2fisf}!CxX>C]4mӽ/[S-T[tv;2 .ٖK ЊJ]DW` )D 5i1d@r.O)p= (3+k-Si4'9aL@;3!'ˀD yuONoI^)cCB2DvDf]71r{=7xJM67>ғWuij8K(F؀9!u`{&Qw"QQ(!`B\ N)t%z Q`l~ގpW9<1VB:& +=Z ۰05 (0+HK'Ib9iE.PUXdpT6\1>+_PI@ڋSI\z]<"9V/Nxwҹ@eahHKBK9BQ&lTv7x: @d`D0 'ֳ+ka((vr{JRujT͍Mss7ǴWj(76Ē->E ]3YE4:t;B_n!2.)^fv n![AazS%GTq6KHlĤWx:b./`["dtd簀KxIHXB*^DN)Y٫ע6~Sq~:2owar('5ze\'ñE\nA!L-el2:7fEޓ2X}Pn͞xGh #}p]ύ=Z>̈Ci^>`Kx^`[FhĨJ\eUsC8qcyHEZG{s %Ǚ0fzv!qn7,G1}knPxKC7q ''6* Mat5t4*N+&ﺯJťnjUibջ{*7a8ʹXګ)_K(hy(66%tB4Fd!SAV %s9Q4!E%'~Eb*?>uӳ\ILj? 겞|1.V06X;)AbLZczUg]uP08}Ûͭ4fٯ>u#+/͝EE u̻.!'78ZoO9Fng}C҈pܥ#gz՚g[6l]7:uYm$ʿ{޿2!)E WxhVEѤ@پaf- ǛL#SO G aä8#jjޒ3VP6p)ywaT4D&#W-6 i!j!yW |uU!gcxCmIf.|#)xcZ2mG m`Z$VQ6Jf0 8t/TޭT8u"^+ByOni,xeW%S/'UgU6)e.FC|"d 2y֕b ie 2ttbOjnzx4ˆai&'BuF!27Y.? ;X9ߡ)dJ.{o͉5l7pcNjAZQ =Ib.l&YAdi{U'] _*SmrSxHw7PJm-7l, r[]P-Iθ)ԟ[*L '(TRU~k^93}[74;n~Ob"v2{;3A<Yif$0:{>F{pq|6ɪ[ Nɥӷ"p-`I=9޼SO _>^1ܪ_n%MD.l,{tlJd[ja;ؒͫ.~l(u#Ϻ{i(!dEr FhSv =,<~;N^-}ē9qjTV'HQS TYOR SiAlthX죮*{G9^mʵn>6P-:zɿw Ik 4X[-b).TupIcjC''[~mbp?t!Y F)ҦJOZ}7S+DpFIb>/_Ψ]"XL>VmNO,.eۯ5;T%;IP-bҵia\3?* 8>z 7.l gie: CK}976zڔ>P/HK Lƺ'o㹇ȟ$>!ڃsj4Eԯ뾾]BEk@|3ۧ߭k= Vҵ%̀=WfjsU;>E5_?.iv'!) kTu)LKh3G;yV%_& $ M[>7Y[6آ\p gc`2~|xGq %xoh2(Ԯ\Rl5ڋ:=0u.eP&jedȵȎ ?$=\LIݴMEA԰hǫfM%_bϞ_QY_BjQN++7EgR?B`힕 [&cLt 1 ؘV?ruE5-#c H9&4qͤ- (&*zي(s,ud ^oM$$RڔTNB >Ʉ﮵[ʺQE3AGSCZpvmjt{}eWzƬVTvF\/mpBi *A1 <0U}V Iވ:5ֺ'RVyhJLhI7T.RCXVb7wi24IVzfuxs=9P6sYm)ΧA҂Y~{Q2i.TЯ|VnxRɘQscz&i~f)"CJxd@qoE5+=gLx,r6R>x+^T+1ɛiCdOn P}!"߿$ЗN0zew5$Q{|u'uw07V3*-|l1} bSY3vxy:yɨV>z-X1Y$؛v_Lph603`|Y_;;o&*SvH6=\c|EKXqJ3Od\ mi'&l&3zeY@HVaGt;Q 0CTda< ObY<+jQCŷ(."w,dfZ vM; `Oʅ^ AVI(ӷAʃP>`b !$jwPĨwU(f?vq{Ltxy0몱 0;0F\ߊ}~eFQs|rnEv?I R TDXhO,s;{[PIqS + 7 L`%9jd̪btNmͬwYYR)1tLW`UCz ܦ9c>~<ӏ^j=W.ag{-Nl(I-&"!0z,hJqRf6, \fѠ ?!JdNHT;Fހ3PWrY2ۤ?W֏LdJjmu՜x*34xٝan %s&T(̛*/vP A`821ä [1['IƲ]؇4Dyߝa^k83++8dߜrk5扝4t1N 9[E-m\6_6]ȩ^nZ-LFD(PD>}:sd{2pW؉p`N 2$ L5(渧/6wuIxmb$<";{4.Y?]]Y-w|?$yAVA5!hX }K*rh_I9ѺYFMV~zE6aOz9eTtቡwdjil<ȱe { BP9Pi& ZJ%z k$t W7}ʅyKFhQXA"),LnPDkb+gI{iB0̕Z{ f4FU'_$fp)uRHgM_:Vi9n],y礊K ?,.mgj}I5t)]:dd3،g^ݧ܍^ & SZA\|yc2Ƞg3D]JNӾd㜒Kڎ@B]V֫T"jѤUl*fO#2R;KťA5|yu -qe4o1;"iKǁg1%PźhP*jjPJr wz!zu#]ZD׭ B5\fYbio+$OބÙf7lN(c}Tj =}gvfE ;EYa,Բ\^RV62IӶ"3ı9yP v8g( Ę{GKrv>pHU[.ac11]Ĵ,26oCAm *2@b"::mzmu;[Y+pwQykY1jBC4 axCr72L9xW9S ƅ I 2 h`)Upo픿N) K$ B,o8C7'hORڮ|mA V :UEi>"^ݹ}zEkGeg?3K{04~EUh/d HEFgU$`"+yeb3t.:SE"X>.AdF8ZRKgt%?Gn۾8N.l">ۈf )=F伊UU,oSE<`f#=q#P$hX$ <#1'?e+ULm_ņeW~"qjvLKҌXNҸC67E eJ]nϪM?4yV@z-vPu@%Q^Mn|yEf` aV $7)4k#8֘ ԟ"*{@pI<a񾵍hXAVn]Z1tn mKl!x(ǵy[Pg@ \ NÜQ.΍(1OK|I? X=V8jRB`ѓsj vZ[ R)4]Ael7]3+uXv8@e]V3r;t.|)N:OM`oej[ؖ#4ݴTGR6 C!j^G}qݙPEn7P>dJ6xZ[Ac)>[{`+B#7k9ћl7B8{l6@7d&y\8IX5=v7$g?lrhё3qK/ M y:|=/h"ΚE5Ck-}{h.E]=Zh 9f%9i/J{tdsXVcc;֒mumn@1j% uV7Q0 ;g z1)2 /@n >v8u3ǃ_Tzف\-*AjΦַXU+;%{E!7L>Aȯލ1ry"U -G$JjmZo4gA5 6JOÛ߈c?M,c`H`Ѷ xLŶՒag޳N̏@tRU!B1oJZ#aHHq6k׎;ޑ~p%Tf3A~Sm~;0ƴ! |JstL,0(6bv?#(ǪM& ;O f.܇=aTEiZVk='f'b\F0vfЎ&nO؀6HxˋX*PZ (f#Ɔf`2!*`/-5g g9 hA&Ҩ&Dczhń矷>\xu;HZf0ZHj* Ѧfb 0lE"&|`hqLث.Ic[&*Ql [?z@0Ol+l2s4O©1IIޣirl!-}3LJ]8if2'Rlg/ r5;oRfvg'T Kd4 .{3߶\qCKAKx! JeKŔH9YBkʨA9; 2+1FdyZ*+=#&l,;|720!J= { Tkpvi0Oqt )¨ߑj{7 sʖ`x%]`| j\Qb΍sZڶ0sg_kscV,sT-BY7nE#WA&Y ]ޅ AHt>{d#]RKTVUW4Ao.q)80#j19@%_(.qU)yPRGOR ^cʮ~d*$[>f&9OCEX~^!縜oSYs.mapdZvҩW__d1!_`~f59+=o?01RC8FH@ *N|;Gm ^yg6¸(rW0+#!-#Fh}8%c3Y#!i ޳y 9Nu8f>jRMK1X2Ƀ)I@0Ӷ\4:^]2#Ev?g7Nk[M ֔Sb_nX:p'h` fұܭ J (sAqh\y.G~uK"f (vZzQ}jߕH W)Av/\&<}d/T-vUm2YQ-Hޞ-Oˈ1Ď!.S:l'!<g')D^J4zqDžd!6svDWcs hOXkgR'"? P \LuZ'ZAwgP#)QGGjR7̡ߔxǨy'ͧ&*5] !6%0ޜ1R!3-?; }WTp)/IrշOL6_9"`.Ǔ6T7 W51+;ߥ5¨,OqG7>.&h. n!K/Ndk0}# <~ T4]8ᗄu:D uP*?y#"Jcݕz!},= XDlĸd&,+(R);DѾ,&~ݰ#R/xrxJp#SӴ#@\KcxOk@iǔ'~+K^^5>|օXCGMI NG`\*k|ZlkP^h(.p"6/tO ewm (-J)̙iGs`aG +_`맾ǡ)zٝl]t<՘YqρI'K @ofe_-xo2.b=-}ZբU ]BYZ򣚚z>G6x}5N݆O@:DӪCXVՆI'7$H.9](g ƕBKNB)skt{_hcyȜuae²I!9kwtjq Q*8'TJUN)] i?aw6ud/PAו>OyE(+:? ejK3L? UK~yulw^Ϲ3 +ɂj crMPRn%D9Ck=WV]NiKÞ50g5m5V>%g[][1wqe(T>M\OSTEc(?  `Cۊ饙IuoPD-LlcxXPKvod>na O1Nְ'Z {W-h($Fww!SOE- gzd/1pY!t‚P4M=Z8lL3Zx-92=6i)ߠ3MAhq)+L惏)N% ɀ`qiĝ3YSmjye3Wrld6M⠓q a+O˾\բCm%Fq& Mr 㯺 5Í֡N"3aJDqDȚ\Ԍ:7g O P+PzjrMh0xWr#޳D&g"0EQ3å?)÷ z d\< U$!rFr25Jtv$Y}0+/LϬ:B9gf8Pm5<5Ħgk9)?NfZA8n Rs 8eQ}/'Þ㸗Q'_؅1ɓYUpC#%ep5 .~k'@A9 ?޻g_qb]]<ȯB߯8}{Z)(Dq @yݦbk,t^TSy p?i]vÊh EP;ѹr}H^c@sOq+}%,^ ›i׳H;8[7Ǿ:Z}:E%b:ʠcMHDyV{T d#  AW3ۊ%F8n.~QLOڊY3KXF4+d0sZU.v?zj.2W{q*>\< n ^)1nTAQ}2DGF$n,ʼn4%];au/Iwrd^oGUQOLc qlpk`ғ.šH"2_>j@1yRrcD~3:-њm/1LVV,K?>L;jVCY$EռV@VhRm]H(XKȘVOǜ='[ԋL$‡?<*0\QTL+Fd YmLfˡ?'w"`^ʹwNXpjwo=QYX`rJצ [R윪Ĥ&a=pe$[¤Yg[[o<-a~دP#j<[ET1+W$oN70vIQgv<!j#N=1[=??Y(\>+!~TSɒ6Y8pÐ?~3Pٳ20闥I*K `yq\KV}ȽߖD.쾡>au5K}5Ёyc>f{ZnÄ#n{<(<N|.F̾R49mNAŎӈxqyh*"˗K{ǵcשe+ T3~VvO$LЉw{K/|t))E IyxH^+ٓ)f4.ȓsޭsj*r[@rL~+Ӳ&.;]5`)ԫ/+B:@n>-5Oܡ1fJ^1;;}5{z64ml &.ws9&V 33& wtIG⚘H>72B.Fфe$1s*r퉰Dv On:FnOo *ՠDjD0;+zr6% m+kH$]HbP}Kn6nwˇP fWx9݈vD-,w:N#Ipo=_ w/)9'c`~+p^ U,NEby#c8cT+&Y@ QRۜi^߁.Xٰrq%,4rDM7gXeX5" 2^Kf)㰵:yc12 [ dY;! _`&T՚I]s>Cl?Wmi{mR__E|yIF>UƘQ/Ÿ344MSI"QYm5Λ/EL$O=Z7caKQ|9:D#G6c\:͏w̍K2s&"ؑ: S9##NČޑ;/UVʀ(z+#۵%$l-YNː^XR##v;]2.TNӺ9aT+qm$SI0-oƆiTv%QL.( i}uJn+"P MwN⟉$EPe)2VɾkJ'oh_o($fӎ'E`:"E%\dC *p0Ptf8yTKQrA\=&"WAc)e&u*y2Z:& ,v+, :p\×{$"~4jEC\^RxՀ7Os{wl];ǒs@U>TS[3_^,'g[.:N$XO>8ۗzȂ`n/NhOٽ/艭'ݮO#]hIwaljs)9IM~xn]S0dXz^:pǟ6ؑ D1 Sa;JIi3Pި92+h㌊QU{.[a> D*Ǜ8{U?W em  @sB3q(l3ZjLGm LĊl%QWÅt/tw.M*X5MbN]uA~S/{-SN$o xV1;g*N'doJڥ>H7J\ ߇B f`ա3ʨ}ఔ}i[\'Oq[AZOyڌPB)7_֐{s2n2.E ZEpp_o'!l0DIU<#YFSe|3̡_W2c̫/N-EC |<`zBy7LQk u~0F0VIC#c#e1qHgJO[ QI1v/1^oEjTމ17;ٯ5dzbEvub㚸gպCfj<$NQ0htc2ɵLbte.[iIC۩k^Fk@!+A<~(RɘUV愑1u2r5 720 򽈚(p[Ζ̺+XtRըxxɋݬ:=ş$!w֪m^-+xr0EI8TԗH9mci P,osj bXD?l̝uf`n.5yMg_l36~?⻒}W)15 Mchz?ٌWlE|9КGó\5|6>*xyEW?.uvRkƬ xqg_5eTU-w \64 NNoG;$͊(&0¡>W#0G*1z*l'6&PIGl̠%-)-C($`s+YO{2Lv UEu79KL}N$ǣgD)RUEibTy7:n!N?:ݵt]Mc^ŠOJiJG݈ /Q.︤^Nِo) gvZFgPf!y/[F2WC,vŗp3"s:yg# =l6 uYA`pm^۞M52LKW,GЂ-.(( (L93@66E2W,B9|ga(c"ېu(t6iQOۨ=ٓ_%xٝ04X]ڊF4t8>sH)ld#"&=/&Ȟٟc&6K v>h!ĴB]f+4F Y)ޔ`5K4$EA^zDҝk2cdr$G%q%zy` ߾1qhՁ+p h,,xӱQ9Іp4UdU"W-vR5pմh[JHONz^ULG?yQ Ғ%\]O;%=Ӟ M\Nne`\Lj&a[7l $~yw:'&NryZUw/ulI(#0FޛȐq lP}ҁ|1i;םTO8 0oLկK-$2~BzCP$Qɘ @:3PzG6-Ҍs_<{ Tskj t5A.&t J/njYCԈO 9t2*D8y7B-M4):xey_Tǭ $v\6bxr~ =rR!'`lM;גTM !ě_:+e!RG2pAW# cK|Ԡ~w)$Z4`/!ԓ"_1 Zi(21V2r#~M-~Jmp9o WnsFvm,VԻQڠU 31~9YXV F*/S#ɽ)%RG~]cL|o<!i#SdL :_}D7&<ܬ)* ni3R4" ¨Zw<=2z:pJV_xܾnpofc6Xح_8FW iG ?L7˲Y퀃bMZä !>:sm;R-%5{/ݧR^Ug( S8s&oך^zl֧rv9Fc!w7tp >CExõRep:)t$M6ņy%ywHk@Ԕ0deר+{(cv3#&这F<-̣zw9;yʄ/ Jދk+eĪzB9e~T19*M|,VAס^ 4st;ن=Rǖk'Yh 6i~c'TgW H=l[o˜?;un_a.6!Y(Έ??G oyD4Ε)JeÈ@RV6R` R&~biz  #]yc>T e?*6ك&ef1uKкx>D`NwN ]]\TEA!oy-g7WtO9.MmD ;ۄQkdj@qw^^!j+LoY%j?3.U'3Oe3e"E> >F p#5& !tDڻj(e"Vh9ITAPpxm&i^q\<;s Eet`l,XMKݡBAÖ=mu{! [ O(+ 6@?-*DKhXlk b-dT5ӆ2(b؃.?Ns^k=2l@81G=JiC@˞^?)'|&fD !j32lR!2i[DlV(USaL~KּxIxٟy~Fsľ41:Ji4~7ub𷀢3rV'<7~ OZ N(LŽs PRhLIݳҚ&Z," {y$I%=t^4-{?aoDEblƓFjrFn^ ߶T*V[ Mv[v2XV]Sͣ5J)x.(uֱ]/ \'T8 "G<_([Iex7A(躴AsEFv~ z> ,%A 4]8#;0DE4A?oXy`,,Z0&pəsO#ZJ+VNlJ`^+8ǃOkT xn-.7x#*EVɘ)YVrzohJl3Oy O@kPLjȔJ\A"yzЋ$㪣BR _cVi]!ȓzi_-@?Ѐ4lrE]Ƕ/ϻ:tL र޹%`@c&jpW.RlZRڳ 2(8CHt`EE^MX@N&^9v#unektgI?||H l=>N "e*O}x8 yЇN9]Q,' 2o% 27[uhITzH{Ի' "6 ntʆ4M! [ GQFO :/{}{y@bBr˶=gn μ4U҃i@y1_ܾ5?cc>e=i: vM!X[,)NDi mU.:"յ (>~)Hsqv:I&q |n-|3nk74:ۯu,^2Hޙ?nB7; Z;1HzW2'+yͭ,B/u>Xr٬'dwꕪz#l86M~Y@ݧx4ڈv([MHo}cڛJ;d;D5#@v: C.N5]ˆ !OیX8[&_]{OMml6Q}dGu}><݈rbt i! !'ޤ+4Hydp>):˅'+%0Kz[P 0Z/p-_[3|Hn2bӷJ^xCh: x#A.y ٞ8 ru B#G{+ m%&7i3]UV e:dǾsJnimpn&sخM wo|4jPA* ~6tA#q0/O3ޕ 鈉qq91ugkfk8)^]L#NaecY R2h3Nsl)~ق? ڨ',E~7#c\F5&NٻH U"Îe#x~LK5T<,‹f0[YklͱM7AK'fTh"fwϦ6ۋtgЩ?dPQs?7'Q F&b?}ÙB"F& ѷov0#]XT=y @g\^b\֯1/+T׏<3DtdA#[kN&CXzQ-z~_?!]'.kWo m=% IqR$J = ֶ'gA+P}8h닊J7^mWR>A7cK=4P@/=%aj_:eCZVmɣx>b)ir37$f찯SE+_՟g"^wu:BeRdS -= /fOu+yPoA? fEPΏ~n[~V<{]G#t# )0#Ӫ?7!\{o1rwtK< E@pPw{훶'pS>cکg'?hJS:TY]c Pg,/37#.6[ SėhF]eg^W:"= *TpF~4*JCIԯ,Zo]6/ga[3;jIia&8>gĒU^Ʊŧh3 pwرvZ(B+ŵ KyNִ`m@(gM,j?)k* Rfo _ vnxӑ;L9Ҳk^HũEMON"О^fiRw{2c[t C!rs-gȒbd-mw ݼUg|'!`nV.H)cgP=wS+TſJ> [$gx~hy5(!8._sv|VJ cC#,2T v'-ï>#>i"L0&\\X~+M]Oϟ:QۓWN2ZE0A3RgpI %IUSqpK"Whg)oHNU@}x~U4\Zxz07GvcBGZ^7a+HVWC6Iׯݟ'-#vASMNnE lIL8uϙ0|_j x}A\Ԝ'9jBw> D :tsU{7[P~M`:} h c=N@k7=tS T= }0۬i yp&$;Q wpe$Ш)ٌ3m`blƈ) Gz4a( QZmؘ0|QƪeUl\ m]EHӏطI!ᔔ lLY~@x5ϞrXC5:?p8o#È?Ҽ>#硾e\f˞f]P)_2M3 I`n.Q%@;LoPbX[^K0"ZZ\A:BGZE,\b0ӟqxp)Ђ%(olVD30f]9V1jPyY%Ȳ2R!9vt,tw΀_w=)uȊ {}o= %*agJj풄Je77&:u#ZU  !5,N#DO9 Ƶ‡N?wz'֌Y%Wrʻ:rW:se^h9Ry&iycԠ01I8b_+0O=$le0 MLQg ~]+]fʾ(΅dlMsfN mJ+wD }G.h.RO*Iv{+"/z^#gKuܭoW)=S!d ֧6tliZ %.S;GEq_ [Vž^,M0L%:(@]Z5w3>FaK׀IGĮu=%3UXk tX?/^nOaHl$S.Bl 'WH&w >J2oGEu1tu&:_Ecl2ɆEٷdyv*(JrBN*ܪ6TE'>WؚtobL|= +7Df|TDxL}CPLz!5ѳCܮ* 䨛VpAvxSk dhu^wZe[ oԚڞlҖf9g䮠3? ҅ 5+?JXGꋽr~ Ț(kJDTa΢]a[}4(ZlV'1ꢔu?`~2'{ E{m/fl\|Pۃګpn kurzg 0D 7!GKv*VG&@qY H N1WΟ&CT~NMԦ &$Bw$<_>LhM9 ʗq#~Y!p^ O50xId4a<.E28}+D+H"YڂjZ߱)H@6,U-R_0XCkM٠{PYtwԣt0gF(=o:!OU&uK.J*F)Bk^ҖZ~hB :7|na=e \|M|(Jh,kgq#-j*]1MLJ+f٢%NlߣD6Y?L㗧\c8aRs*AB ՛ye͛yc;\ j hs)KYy] nb"{s|Γ\cY>AVHMD1hr djS:|00 BCE`1;Ŗx YK lsIZaM2%iEEVQ 9V:ԦaNHIӟrɪCdA8x̡aC)ˊ 9$W!}7)bz 1AXK EPbG+Cd}ەEqA{¦QCtv@$pB-}h0I,iM-s]I\_ ypZ~{ toCT !±T9]I12rên8Pyɹ͈w&w6a7T2d판Anf49X7_=2T-/L퀥\ `9Zfv_X%ZT;\z`58QahQzJg g!5Zah;iʴJKryq˕.* }"I𛩨 ~7vH#ᏳcSZ$"۬oۓҘT2R)*̈Y꓍. oUUza1:NH sy7kp5UX89γ|7IL3SbviJ+!9;j {H`=фaO*K=;Gr*\n#(3a:jTś%u|E D¡ƏE@RMa">VJ ,IKv*w'7dn!r_^~ѹ L-:Nߧt%?*_'/|KR^gkZ`F)4,%!p%)p [b5($9IIvL^m꿿mXv plcJt6DtaҹӃ%cZc9}hn`wԤqFH:Z ktt'59ef 8S)oMEU܄SۣP1zY= tW:&R`/y Kw4r9=.G_S^|mա(.&)l8 "IŃ}T2pק6E| K'U\]~㝘jl6{eQ<6}ba϶"j-]MoՆ#6y+'jlP: {2OE?Pbj L9dZqxB!BY97Q0;&E}BAG tm띥zqdg\Q;%ck]; be-o4u>p# \jՑsMa1vc_$iT{pG6K` u@#=B;N;+O<)MVSwlpV^l-/z` >".kv ^ĊEx/ ȴj†59kTksptC{=ۿ1jҸ~i7\76m/LKyH_@./Fq)cqWS,"unz )\y^ Vuƿn?~Ȇ\<Ҙ9bH jQ(.S f?ycyX߼EPq%Qz@NM "DΚVuqq5E!ؿdG e Y+%‰#2qǁ1EΛ;8nz";oq#9$5.3k]x-Eu+E0HeE_h)Bb(VJ#8h4Q<989+r~]&+yy"G>$ ~zHnG:Z*D.̪{r(61HPZOYZr/]&;:Nj6FnU NI +P.jU|)-)phD/4 1aGq gvq]1AzNc1)HފE"tTQ>f=sZMnjUDCZYx;vc޼zdQ@qA?TՉ3w3^v% .%HOW: $wKE_h )fR- d b{`G#1S]noVݑ;-t+>,'{V| -?#Et4j@;݈ {?AD^uތ46D g~/@0X',tFO G /p .Y3<5ݖ̐Z<Efߏ:.}wd|JcECN'tJ#z&63+.L mG%1}afz6(#Env%IPXV϶0D41N/]U%EռM]_h| ylQ_XtթԺB~ح, ,CY~d-,p sJ?Pۤ`mL{8 !$=j[gԘp@Qo &Y!fkUg a&&`[<}xi%MHdYea广ێNwrm4V̟A^~-$If)ߞ|(W Os-y'ugD^ Z?3]Qz@^۠WCo9r!aG/rjx}&yql{8$s l6"LC#ז6(h|yI`8ouTLdZؗ/CuI0dS q Q,vaXE T ZڒjDv.#8#vߟ|n'Q@c 9P\׵-.lCxMW,_锉$gCVrTξڛI/kYCԐHY?fT(+a@sfCMITK5h(0>cدDH/n8gKW[iot2 an5?0m5-#yٷ %r fh*Bp"GK2oEή&!K:HtyB`zкx.UL!R#7ESf!7)K+# `1Kv -yu^˸,A 8V /ix2(wFb'ލ;Ԡe&HZX_9XSy00LDJU&&_O8?w~umƚDb4%i}3E&] ($Y]ˀAJ| .ݘ |C硛>{TMHGܒnzm/YaR ?uԞ(Х3!b#$B ~>X>CTY^m(29n!&Zbrv]/ftLJӇ7ARCC>jg˻Beb!an'$1P6`_'/w8>4 65PzJ! TKWZHOtPy<ܣCɿKO֓S $_?=ǭmer9 G ć9,x{ȯ! ȡ=_02*),u((h* w=#-LE8Y+Ӂ nQa( ioH27\N, ayU0]ݛ H)󹱀^`*WX2*mPt {ciXKJA\nV yLߓ"TOdIcf.e^oD3]:2͸.Zʇũ衚vOqQLL=ŬIUcWHcJF+"6%,!VT[Ϊp2=0@[zCsi8=xBrR?5homEu:5ؓ$WZ@gէ`]~/O`Q-9ۨNI5`Ew"g#Q~.e3Y퓥l(G{ c?g~uUG !jiw3HPT]vqtaK7ǸZCw!WKx!+nHVS)V%z2{v@pTEB˸0! uaQXP󢛭?t9Er}ʣ"lqqa5po 6'hjX@YW: N#Aόʋ W@u+*^]U5g*婏کjը>jceAsrRlQbP`?n_j9+{vz(b*C\*?сҦKJ*+T˼y`{eFɼݡT͔U򁦋d{M>+']-D}JR*cimWϾ[Z#!=*uEUB*HYLsjN~ϜR?bѭW̫y>:n^0JZMMHv>xvW7 JrDLF<_K;ZrՀٌꄡ-ӟDȣ7mҷ< _4Yw[:7,K \D9È( *Y͏j~z7\ʼJ3Gm|p#[lAh_?Rj-P3z͂>k+9:qAAVgQ{%r6S]R[Qz/F‡,(;6\Ɉsdlʴe~ITx4 N׵8m?NɶRABؖ,FF)Ҁ@^_X6㕐/ƣF򝨯y1>(Z X1.^1~0/묠{_< oGH J(k|l±x&Gk/QBTK%vjRo|cTy>Ԩ2l{k,ˏF|vEQ3$~[KW׸|<s|'j+,OG=q`$M£iPafHoNll:p؊,[/n#D|7@qݑr#j0E%pw_B9"XbУ mt+">hVI2bW8:Bp9؆5ʪ +47v߀En"}y͞g߬C@ݒ"Qޕ#nq **SPt֕zw8I`BOipB%$(e91?{&ʑ-*Lll]eoU𵟖=IQz@~(E~`2Z~)ϙi&*$wR <IViud\nl0tMr f5`;x\Hu?/zg@vync-p݌AbB{m{t(+F,,Nt,o4B۔cVkXQ6"iT}56c(mc!;?T&Ֆ o‘90)u,!@{MwI\vL4Jΰq]2] $NR<Il4I(\A7|14joS3\zkQڿeKt_z۴./@"aFdy]m u_bgDkk5|x_&QE #wZ:1  thfմ;KQ~nV\:HzVeIj" Tkk]Q/vkEIEHeY[$%-XTߛ ʹGԑlO-}Q!ӛAM3.SC|96 Zg6̚Np⯩sUޟv~T 1t;L9~Py!߉b@^{ӌֽMܒ{8N;z'`tDZ"Mz05@iP#d#DcKuM|VF- 3 iJIk̔xB +ݦ =.0q_qT(;HpxU&D|T6,N}U=*%]iۡ| bϦaa).8_`hUGm qz萉w fY4=c"_V}\S). ݲ̭֚VFBZ%ϣ@/A_>s8@${"T5K+)m"8߸q| b $yyF7Ņbxd9eSa!C Rlϵ[ ЎDCa>W\O쨽s熳9hi(rDUC('A*(YAvZ"enF쟥[VD2^ BC tXXF.$] J65-b˛g0\Z IoCiq#٪$r/p"\{k.?7Y6vXQBPX荬*PZt·+b:%籼Qw;BSF^{p07[K殀Q$pzk}cmw (P@W? ߌ>Y<-/4l<D>?_ U'DXv#O}2n!]?|~{!DuxJQ@mh -7ZgmKP}& }qN~nl x-Uk$Pv^ [¦Uolc Oť]u(椎 o`$6[F!4 %fC/lnZQVaSQV8NW٧ Τ82չٍ .AExrt;V?)Kzh\Gw0,fı`PqD~{xd($ʫY ]h01V\Lr@2_WSX=ƛ1D8M˃ǿ,'&N&9JyW(H=16IA`| /bo#c0jG>hFE%)k%9PvmbsM86K&@=f*xVޔdXn5rEdV<{VT!eA}0HwjP2:Yn0{li+7k?j9%m1#fu|ı˺IʝDUFxאYrm[|'QޱDaD1r>N/Mf:`+9=ó=P9}w27LK?W{epİ*}E֡? ǥK*m>k%3 ` b뀺')c{0i󃦰h#S6n9UCKр_Zq>d bhZ5z|>}QXM+:Efc$ E|_7B\FZMkhi$0c ]<ѯFܹ:wVt=]Y#캙p J(P;k`T>դ 3 \1,jeP2/+ ]ri}-#;ΡPV CIvB G?JH\WnHIûƪ/B>rP1FPnW7R歭.mEuKu=0\|S MAȃP):6C踀Is>ucv͎UÏ#nDb`Ǘ6WVPpPY$T}`q|f6`zl`I_}%"|מ0h T*q`N!O1XY>oS:zKIʫPɝLB-h`s9l밁U~èwZЮ [Uۍ2|i)M ϭO>!ov0'8/R j$fRj\-bpFbL4gR ѰpLsx g޴5 :G,_5wRE mba1 OWV]"A06﶑ P7*Qbqiy9u$y!= `C' w H"z>1f"y&̄">I<,*,C8]ug8-hIG LbHVBH테@Q-h {BD6fec:ɉuu$5'/-IzȩJ T*e<崰U[#)o>^3V n5rlkpT&_ncxۨbEә,qz&TVP?̔& xE[*eܷkX!Kc r 䓺PQ㶞h`N75 JBsYT0~}j*@yyƪ\ĝk >2 3cQK΁o2 웨ˣG%Mܲ[h"w`adD /*щ* 6[q m^ޗ=[yn1"_;U;B|¬DDQP;6Ezveb›!bw!SF% O t4ӘK݀q%kQJP\/oڻ=])AoOkcagwoЃHE9mRVEwbm @6vPlO]{V*sfAпTzSk3/^& |B\PM2Z̰H]$ԏa_3_KAvek` CIhP MTi? C_94#k3z]J"ETSs7Y鍶io[:p9P7R.uQp0~/+ߟ[+:7bOgD ц [hw"?P+?/m{Ɩ}m"(%Ꚍ04G m|H9 Ͱk72~H*l`ZLSf :Cy DfIGG G,Ivۖ0"C|A;x7eG?ƕ̶逬Z,z(_ Ưn=mw]ꖎiV0T]wR}z}lJu|5Gv$4_>Zvq oTriKpnCeD\$Qy\?@y{|BMق+-|z.!Yd%{s1Eш>Q<S)sHyv'҃N0ͧTi!06ѭp#IZ:'ho4&Ǟj:>χV30y?rd~x8p|#Z1z,&qL/&*eEb7_{kz=,B~OЛnIS.\\6T8ڗ^sLk+k30p)cWE9 Nut ZyħݖSЕJ#Qefc5 "e; C0t(VK4 =L(e‰~F/י2F6$ur-T?;E^v-יz'M ij2ǚu},-NKzY2N~v[n&O߿p3MGm7ܴ8]MBDc;V6̆E!Y>Y0k}-G&@qG"IlfpxAPr`p3.~;X>C4erZ[1F~ L? ײķ5FM|%TfDg2q6+CYtN[qi`D́[KSd(?P1B_.\ҍT|.XTI5p?5$C^8)Az]so2Yڦzچ W@ʊE`>N&!òឱ-iǹ we=.s5m%k|<[84I`Jm4fNhdjuh 7kē"J]SYu@՚\cl AN+wGvʁ,9 vS%űl#dTO)M{Ui `®\i7}Лq頿%Iu$7W^QkF6u$%%8>RLȪs/F >m{,^:jGK!l{t5ExwsDXSӗTHPy4*D,#,r\hhp^OGS.?0j %ILBhtBJzT;{ZqyrtLg™B2Aj9S`Ux 3=G\h˘&s &5rt̍@T7X|l&Rm>&4n͗MLc H] S*6; L|2oD4UeEcӦ6Q7'=ҋݫ#rnG*;rE0ɍk`!| }f{~TZ WmH mJ^?#|튂<{rUۿJhq@DG H5AnE_( Xn|z%snފ˧7k]jl+cjCf#XNNNɬIxj苞Ywݞ;ח%v ERdON ,|2P D%mYgčܾ=!bu1rV< >=9C5!rx >G"PH|Yq0dѪxd#Ts!ڮq;\AuD?e6?=1eVT{@m?O\hWm%by"IHԹLC;d*@ד1=fVrQwcȱ<ȉ$0´*3X%1E㿭׳3ts1LJ=ώ1 &eZPg9R~\z|ͫ|gþ퀰EW#2lСݏPE8z 6YwȒ1Aњ}*FS۔au4[s lӞPҖKMvBuoxd`OSИ%n8MW1AQ+!NߟM:r#du|{OmǘB)f1~<0fphL|F C2_UqڕfOND~Md?:(;KE\l쇷& ET{>I`"b:9Km_X*{NaN\,Zh'coz}M :Gi뎀m \*:6*RV~=?Qy%ԝ'-eni<Y"}؃1Ж\10x{*Kvc 8ezxI3O@Q M˿Y|@oO"H=Nq/N:P|ڧGFޫ ]25$ne@B+ڠD楛閱rY[u*xoi|G`ќC" sS&=؈-)8niň[X=* חѨ%~_rM,AddA TRNSsɞN}C"iz0vwڪlw 7 3E/Ur gF- [Ҁ^$c s_4#gۖK@Ee! _ºs}B<όR-zE+JRL#2 ½nQ.Vd>#! jf[$(w`.JaaSϰVK1MZvM])wckLEͰ:UESmf튳p_MW.ښTwGsN%OT za$5y.֧3L?jY瓆~"PJS- 7^/ GށnȾG*zE?gᄋeuz -#1E:|tmhAgg_a7;/q1vLK$@;|Xmsu%DYc1g~TߛWz:@7h$MDL|Be*?Htsg׵&}08-Aj ]kcv:cmԎ: ݐ=4ƞ7t&@>JnM#_,yq9eF,!ΐL8#Ko#M }2."R˸$, ]*xR#@w hx%/4K1OL}28I%efs;s0)CXX6n=YyСvcJ[`%h F`,JDy o2"9_Sf2HVB(!С'0`pgySRb{ڕu]::=VaJ 4![Jc\DwtKU9MJ/)О^v12FP]]ٖB]r`vT(܀6 $/h#,!K+I_tU=S˙ݥ*ݓA939,\W9CIbRhȘd}\[IP<Sv%yP `PGB){DP&$tlii 2YoKvdmnC E$XF̂WZW5ö {g+ƪ@ wNqfy_`{́`[s$ݻ! y ] }(yMZ].2.d.n<,\V6#ݦ'`YRq)_- _'X,.k\\bki [o;< ?Q\ǃM+,!We"Z!fѕQJ_Z)ŌXǝJ~,e WrݺfGeĵR!t*ADߨ%4@'\-&lw#rBO?L4ЋT-W=ɊX~ע,SBU_úު [@adIB.4,tA p3Yr\o-xJ]A&Qq c,4*/,"cA3ֿAGE3ėqRuZ/Y2`%?o YA%.>9c:S@PkZK'4MBl y^#*(=򚜧r]sօ|{߭4lLplHqZ } 9F{;)Y{_I%9zǞ{c9m)]`[>U'ݹSS IY {=J5f%~%ꚺHe3I*lC$Իg$N88n2Z36+N02,kJbj'nT||:QmEEy䵋^(QYgHd^"NB{|Civewhɲp 8)2BMˊ#$CiOWX)Exg(_в/3UD&N$mx?|89, F6G[><4 783`>.%k/NAhxW{6c7>5#ݹFq5 E/g[qƊgnssYoH kcZt,pH=ע!V*xà}JθRgIGQ_,K{>֑]!@9CYK eOCYH͂*h%>>p`r=+Ygo }]VH E~t 'R~ˋ> d}{ ,LH-',+=C}֌"og {q2asJ86.~ojϹ0/9QqҘL86wuiɷ+nE6fD#Mvylër]xLRH嶈. <1YQlgW٣ZԪk챨S^=0aa[~Ch(. 22]|~ RhĭSq4_v?s͝'(N2rvx97NMRGr6O "0,0jr V2,Lp j{+ w6g8C5jcᆸOWǯk9;O 3͑\~,1 -7y6J߽`Ö⯵ۈX5{| WKk*C3*266k(̮)SdJFVDd:r 8i+"Z﫝n*eh6ϱ͞HqtРj8O bn+hq2(m]KY4zj0r+n%㶉\css\o)GJ=_e:VN! PJU(pݝ71X$Ŏ&~9Uv &a|1ށ *Z_l-׀2*V3lf| `_l [ְ3=9OFsOYYZ/DM̜Ң0܊g5 E-Qu6ႍ135,kP2^j{-'zK^UK%-No irR_/b@SQpX1pfġO?7@+k _sӤEnib}`ꆴFl=FkNu؄Y_0~tu)G [yB,;A_(ۇwʗRQUǚSt揯֛ǺLIO\a[.! dXܬXD*YFc8 *zM3pO(œ=ZSQy^ !l9HdȈΓIK׶&3ݐ{N95Evhu9U~QYÔd=|iмxpj"A)ZC3Z;u>7T(J3nDV Hy?R1%YT`M04<9iV*H9pӫE þzDT\NLksgaE˟I`a-?:|\h'jwN@@> `^+睾u>}wP9ЈW,0'ጬ= m 4/r9x% fD;/^ͿG].onbY<-)}bOwʳj`U}Cu fUh$W狛Xg#S̙ł"[ARTK3+Gs5eL'|0;h1yGM,9`=O0ne~0"jyDYJd2g`.DJ{Z4sm7an[696ޙ?l utم) ԸxbC.DDwʓV"yCPtՋ4>!.L[Ŀ Wǣj?|o~r`S]/QG`o[-iQX[~l",W=>0R(+|8 w2yVdۼ F.V7Fh߻dý/E eb8]%>Іt[h"ؖBKn~X6 k SCL4'ύ.8FC(~셅`Ѭw%u׾-Yl}߇W\5g՘$FpD즭m-;58NhT=oMSh(Ox  ǝ7&@0$ų~;M'n[T+5c t@J>4{Zph~,a32R7{$w|Ot0rSB<1!Sx fP\',68C$IDde[ 嵜G z0vۓG7X,'dmÄe՚^$q&9.DNhO:Z$S.Ś OQGEN՚νw<ٵ[VK!5(n8h;LoM>j~^o ^tFlf4pu[0ӍOCB+A%t`KS!!^UV02 'e_'d>j+HZ eQ lYuXSO)9؞Pi@l |;0ȚA6Lh[zKΩƋX>fV|)^rA45q.۞uhF7ff/xdjMBjo 'y2UuXM*%I8qQ_q?ݖ6Va轗aJmHaؕ{(@'26rP6 ,(^P."^h ƺX;uȎ0g]V'qΨ2KѿqkEuv+& %v!zh4ꁰbe:M|PIٚz-^0JyVuHBٍvº l&{> JIFnkub gG,Ȱ r΃5eU-vm|Mt%HA_OAjsNB-_bDr*,-/rY"+9 w{S_eopݡH~dPffnF.6h-hp@_oY`mwi\7s]ݧD6#fO/G vD:&P?UL +lrX̵Bf'c H)0- 9 f^v;Sjʠ5dh@lRY|{ j&׋q;w(K8k uS&nSY)7VLԄRs!#yEˢRe}tLWEޢnd4ͤ%nNEC#B]pLث RcUvk=''BBI}(9)zs>uA( mo9AJH 7bvObkz(ao6 43)y7Si|zPC|Mّ3ͧWaܢ+ďW@pô]Z7p2lP[AYOPXGfrԅ?Q\$FɱO3e;f:&_ BX1~<Ĥ˺L-:u 9Ni0u-/mW0KXfQspj]ֳ`{ ?͵ d7\2ԅ xD0STnj<,p1W+@/;.OfB#h:F/Berݜs=rVʠQMRT*ifxQt~F7΁\I(&BU׋aǗ&>IɓNsGu}< CN}+Y4mUR\^1}NܰCB t ={SQIMx̉&{I;hr5`</ɗV6x7:]1~m s}b B?9=gv-&LÍϞ=t )igI+,!ײu gQGtQتaJ62mRkP@͵QdFRM}:?[?6G29C|]1 y΢G'KVѯϻ0mwn3EΕ(iP"2^NZZ_`of?,)ѵuO2W桤oBYKSp~JKf8Iş*MزtUTTZd1?ǀ!sf k3髺+Ɋ ۛp$YCIT&"C24u]1*"]aoxV9I{@ ӭ݀S?Zx1Ê>$%r ʫfoÈu?/'T{TfoSEEL؟{o'̴ʇ] u/ey`kwzliyQX3-c+XU(s8g>0>麹`wWtEo o塬b!~An;%MO|^ڭQd95|FՍ*H! r/U9V3EWHzgvӦM ~CIh~:[r8Ԕc 4 45"b*^|%#P#OI*AzZ;JCC.TXq;H{i^ͺ+X[^'^ӗj-c %CJ 5/XO"q! bSEI9RD .S8֒ uF^jk׍8+9(~Fx"Q\[Z=\9z/]rvq} [yG غr|0xPIw;ѬĈH簧O3s4n0r=,G3o]-k÷k]!bWho=qDQ^ <>SHN4l9PtΫu<.&U8=h_mUV;(%^JJpAskrC'6n 4ZuU_zh] JYyx]^k؇ekduE/?bw ~r ܬIWBh$q= (9}w5#Gg1`d|ZS M5?ApA];C;<솦4ڮ:E9,X\N`̊jAuڢ=XtPK ϹB]#ʟl%r< >YS ]dZ{ g>xoNwuՖY 5;ΑX%Bg:Kh!$7a4Xvqf1:EЗ0 ?B4c=oO7v:ni~4::ny)T*DB:gmOmav~os]8lb|˷Vv< 'Ioȇj>2DHĭ0:SU{)Sꤙa \/+7N$-4&" j~R]n4k@ζw1ج2%Bz۽Q5SBɴ:1HС:)6F3vF_)ﶮ׆vdc[dt}޷,qcixmJ:XSR귐 .27ȲKp̫9\EW9gB@_.-m(s,H/~{~ )íY$@N_l)?cچ}/[9Hp2⤞;eEYhGΡTyƛC|l#p.SGm'~zD¬HQ "s;bvK3ͻre8_i?Y?>Nj|vfBW3\p3"G{ h L@@[-B(NDHo>Zbj $TBYx!X./+aäyk{Ghb9@jKsV̚ *ۯ-¿f}꺚٣^P݈,| 끪!I}6HnFjLqufo:# !ϣLLFEC8D!Y *LB'; U3-<^HƉ!' ~W7 $8D1+צF"BN{z8?hb >xlEp'|):C83Y0p r{7A ~o&617ZܸXDb$qpNɵ` 8ZâKS;ZXUV<}ߐY)UVyxƞJK+ d/P))H4-Cm#!"໣]!$4< ?l䝄!f a,TnX@<%ˋ8e0MF'2pyoL?e 7ݐꥏs1LbT gY䪕WK~b|LiԍWD>5&[{QuV #CJQ bNV<$ؚ)]n袧|Cv &L~^(,y.p!8jRWn&S70r{D]ϢU C)OtTqތ;{´,<~^ՔLr*&I^ 0haPvܮs^-кiNbIqU}.9ߑ0QIpy[;G"I$.6ygsa{<$] X30*ڰK}lٷb&k`M)'Nc^JYEcFRO2}n ğ}bxlY] <D0S'9IM)\w;T6Y*M"DAKf֭c:mA!`\84m1R` lFyD\R|}NDv8wۢi;b8kdKJ)&7}xoؓ2=P(*CǁO83LM;jDuLzr##*MQ8RRC;łhRÐJfFZmE |CAbԩ^SPN ײxGYh%nWh 78LO/2֝pNh0[Qf)%t2[pZXR<_86'|߰Q:bmJq_ALt7gDJSo"2hjʠ-nvҭ-&2z}Jܳd3?֡mwi14 `I{)4 T틫 v@w{ BO8 icn渰(zdy+27d3U+vt X1<ˈz~0+``j-A ,%'[:$ mOVPIfA b؝`((Nm%MI-MH7Lc4,и?UG-' rhńX YxKgqoT*m .@'s{4|~~P0,|jZhĠG]Ľ llXl8;l8D2ߨO~2YLJP#OA瀽gp䳧Aqt wvzO7[yAe*EWÇ3C`iA1Sc4SSXoWbPƻnRŧΏ?*$!UYm)ՍQɛ:Qx˨8$$;N 2cKN=X]P)`3v:.r;G4oEJ:dM#/nn $}Mʏ:aTau#fP@Gl,F>Uʒ~~]/ &jUʮm Ո( ߅a[C#ELFpޥ`ПCaq-C*Xћq$o;"tnZ>^5di)=}-QzN%EwO*6Sw-%I>ޥ?ݮ?i}GTğ?2*;kI,tGtd?#qXe;efgn Qs'MVƒhL2T`;< Pշinr{z;*)vL]F/>eF#|,t_C. GXG%by( T_5A9RZJ}eH&{eMFP̼3fV[baL1xs.=PK 짬7vfD0H f?znιY-&`G oi[:ъ! ZjOױ2ߘbH%RAJ譏B^#+!et&unjn5MJ|əW6sYZ, De{1 5gKB!ct.5F΁sQn+%{'Yf't !iJz1VW NȕU iZPY8f7C)64Iݽ,*.Iurʼ*?,8$][p)9kGeEϴ=5{&6p2(ݻ$*I; A'~){k[ y-wbS1JERnK8VIR^f;v#4Ȓx7S<%N MĊH4cBm{#RQq.k5u]":oag`ŜRSüIAmR*3R`UQo oo ^Ry#P@DcGB%NP9%xpM\Mu]߅ U坓&&H$m $[&uA}Pq{tu%xʼkQLֺpPtue}uf[}vq0oqAPqyPaMzO_ 2 ^tKe^j7Z47Xk6+ǫTsVeY8B6ʘ(DžcC]h6f{o7Lڇ XuKKDIrmlX`h0wrfsv]"?&sZ j%A0 P5ƽma}mbv+uz#.)~B~<\jϪO N(~`YUkn}z]#ӓ0/wE鿀[CGb8%5|9sѱn?3AFGq>׈ҽWYD.7C;Wb"ބ,JV` W:^(t1q ko%آr&?Zhj<"\?h}+M%lcSIVVhI> ya%H0+Px6Pԙ5+86(htѕN`J*ysWzRT͈ pq.aKLSƜsVC,0^"覌R?qЁ!=h¹Y=d`9ƫm|oyщ \)O x^ t r B" SjxohTC:.r{t'#qwiSy9Lڙ l}I$6 s%!g;EkqpDOR6Njc2 bojna 0~a3Uw4r5VoOYVHq]o<{3j~+ibyEM9bXըD{]3<)~\(ng>_lmEjPp M-?1Or|d1BTR2eSm͜}VyHB 'щo h<>u,^c]c8'!I?YNCf](mA¢)y{?] }?"7ȚRO,Ɍ W.G# rZue'FwE/Hl->'zsm^7ϭ] v?SIW\Q+GHF5BBzLJoJ W5 *AEl9[O~Xa#Ix'dEf՗j* )Vb QTȏDL3k}U3o$l#}U9>XP EG?kc+.M^(Oj S꾈W \hlͽih.%s$dmb/)M(a ,`qhI7n58,"g)lC[`KzliU;"tm*έhI1Ll0̽NpDk '3i}蒫'`^Ĝ"aއ%pȽl63o_8ce i/NN+ɷDlDUD{W%`džv@Q+5(RW'툆x=vJN!Fz>\Yv!ˇ?ކ5'&1)sh7ͦa*Pt3iG}sؒ\a(YeyF`][.9D,˸ a$@>eCc@4 9B"/ttj:s)as≥;gGo{@&9Pʲ7kLjVѬ3GGI屑T߭N`]}%Ȫ!\%HI8C8Q3I>Y?7O\d{4PUI:l@OPQ }4;u, U,LXp<<|  W@OeX4F$D&A_P b#x8͵C,V;/M#ty]%ot{KlLW)lFqYIaׁ6aZגn| &a(6d8ck=*뻻PfP(nYw =f{ET <†*#J#YRm(9GeauXX mr=T !^SJABz+ /@ _xc=X ?yC7HX1/33ɟM v P m~yXZH'k( Fq)#J ;9i~[ 5N㍇0eqdRZ+L$@nac* |E*4^!5"4JLjqEDoޜ͍}E< #^W7ȳ2t`;JۧZ?ĿD+ʹ}cu@\o9:xB"8q PټT"9ԻJP5x0JZͣUp7)G@^"o N8$6ڎ90镭>8v&nnt%7{РMU2ӧٮ8hwOסUNƢy\s3DRZm50G6$F[)qFED".Z5wIRhMg|>837Uh]g(;(]!qQ@z֧npFE kp'֝GW ,ϰ̦{5y.\V* TM䀵, 4N'y2zl`eв9lSq>:(n̥ n )T;ӫ21<7c*Bt9e)ds=ƠD%6DwS걊^.? [NQm$}V/F bn83{PqDBWkE}VUq"K qp!IOK$=w`Q9bwj53ku̾Kp7oXb.>-_e1D i H/W<I,3`W _f*q7&4~R E&liþe~RG*05`\׿ |`/f5 u)XfEE8l4I+yw.w2Ud8#zMܹyYVވwW{G2\UR y@YT WՐ} )铇+3u_(`B )u؇6U9.}*7t(nⱷ?*ז~%,pV d)|09N ? @Cnz,Z<;hD)OAηitE@+x*A2וF8S}WFH)rH¡:y!Wk +$1tr&7 @W_vPBax?>:~Xv:qkrsŲX?DMS1o@1Q(33 5ӽ^ + *HQ~jŒclb-Vf IQ Be6B0B:/}{ &xYH(c\8DFg`x[!Y]%Xojv Q\p9mǾOs_wndϪ/Yl~v;VA j_0nȺI"iSg!zBAofq8KoJ}/ !d2%\p6au [Mq98r0'g>US[Yw9(@/^[VQ[QKǑԫ.Aɥ$ Qk )Aܥ}AdQaҲ<'=6+KV8Mq6hKO}]ÓDI+GdAqfg0EkfH|upU!n3荞Oc=vj/UW7nmZGab-UTOo.]Wn03G",;R@';vZflGedwwiX,wE;I XTx6lam[ 3ù:i3̯:R/FUt2Ⅺ r8{8Kg,.qaeI~\tbSywp8:$]jypgv 1LͳH^{L ^ 'UyC/#iBxq3\Jͩ˃XUtxܞn,u>-{rR P!]z-/B#AҜpn0,.Xةzz$TД2 kWP&Ym,u;T&Qd4ܵ<~:rG,Pɏ|,kpt, [59Y"].U5  {ͥXԨ%|4Y@*fZgQCn6l 9d9bβOzDZ9ͥc?KT)l" }JG*":I%dFՎ!,ه"3 ןt3|3 W*{i+Pw{@lej{-?j i빻Z쮪 . ԱÔă?s45Щj~C{. 7ûETqԷmV0EzƤ%kF!oL-7K RFT(jV#y\E=^ieSVMfK'8gl0 +I 7G0`C3hb+ /Ա&-P@Yl@2 lvE8hTMfb!g <=ݒsC{Twp/g Mџ}xXd"E~Ӯ303WyGRc_@N]ZTD?kٳo@6dcoI-(7|`: OLYc&!d[&{Ú0^L1du@=Ij, $^U=Br$aXSOToڦH5!w"\H׸Uey^$ݩZg„(Wf2ΐɺI[w]r`%GAQ9mS/'.J;f-T:*kL[3FΎ:C d>>Gi(dЃs -HMJrWz&٨GsSTKmL.ѤGXɋ.Jf$÷b$[ cBw*E:ѐ[#0ى=g=<"q,1d8gq8eA3-' V֕-wr7T\8aRGA {)BK1B"C0R4Ҡ"<|6ϚQH[UueZϥƒtzˡxFij )($Qt~ாs/%4xd$j]zDrSsQTj<vͅ`HKk,3aKTGe 5}>\WßH*Hcc]FJknrw[UM'et&Wvf|XqFG=0xRex"ՑxayЇhQF®;y(43:d@CazD;ZxH|q.jw["em UsQnu}' 4H)r;M lڵ/EtL^>=OrsR@*c =8RQ.Ŏڑjv9Ue|@=( Mj6wR!>/:L274=H2֦Փ%Pz>EY5.O'h c_;$E&K@_&{ejr*N=yJ^$jZ?Qp%z'̴*KZZpQ,ڰ 6gbWXoȬ?({x7K W} ՂbL'.>QLo@ji_"POcBiDg2Uz?}.rFKo# .*nTxшs=:趝\Ws7Cۏ| K1G!$/ NJ:nw @}Avw< v1aryT,ӵ)'UtIhC=}ĺ:aoE96o&G3*ֱ Twʭ,э`oRdK*E$sgȁheTBSZ\sSjcMmiqjoajl 'E`۹Cx_UH )GKfWxgcdݺ'5Y͕^1;6,\jR-pYyaT2xO\Iž'a! 6";-i%r ݢ S[\WLrtК jiO2;_{G^aqo 10?"&L U:q%*K\zPo43[*g =/!l*$ה/'[ ~_P9I z}?m /DFS%$>|d< w«%?>J NrOdFN?_I7=';w!z3|Ku3`]2 rk':*07!\P_DX ְOԯUV8ŲB߉5y=R%=J)g#=6DdwpqWzKZV$Mz.m%4֜ 6jCPefXʟ`M'^z—@U޲E'XW vߝGPJb#+v:Z׸|~fq+`x)HMD;L1K* ^.۹^:HJ!e h%;-LD* _X DIEyZKWY"a]z¶âs FY#7ug] J7e'ѡ.\<eTUOuI[|旈 ,_WSP%{aҖ͟صK4?y'=߼Bj MROd)@=y4BƋq{ύE$vAD"ZL1w rT 5yQ s7oEZ=h+S7t1aҼA/VDՏBWGt׌7;+YyI\|lt@2mIG C40IP7\skB,Z)]DPC[9ZK#}O*G4ip q(9Qfx^u~~$)>[z㑿%nv?ɮw>ؠumEHKhߕHuQc.y8o"e c{@|95'L2R</UbNaQ:1v=; , }| M:Vׄ/wBm܇^vv=L㦚b fW#=߆l.%­9x'̄(+"9YxZmk(Fl1%r8t'5VAp$w+F/M9`tɬB\*|~{'48oaE PS "o̽m"~!F|P,VYNuIuH|[CPô3@7 )Qʾw$79G6Y124E='i-̽B VxP6,el[R;M !!sœVdΠd{"%_F;jQ}?u%b%mjzWc}GY0fL&{'od&dTTwIr)/tQtf,`1 S HIF T=չ>gNaZ$T*q_`>~{5]?5 _R`%ĐVZ-yuC ^r+lb#FUOHUo 鍿>4>͡ ެ"0&<A|1 ]~rNfP;)"ĩk+q> آXPgt3)*bX6θ)ɰ^BFvIšQZ6JC3Vy+~nqѫ.QNzўmU0@2^#*?[mâ![O[֐5ɽWF i<_z} FᘉŷMskVYSaI2;GY& Dl;Udh^[7$瓸O3|uR2ؤ5Qðu[ЂK3x"^e,=㈃ x!b@MlXvY$v9b;?rW6(ALiprqө̛ <&2w.t^b䄦=jeH|n̟M8SMpC')Hx 4,k.!i3!%pYTf^_W=BsmQgt#,%:+_E:\_h8Z%9cJ.\ ZuI 6)8ΎGió0Y"j>p,' {0$#Oc5,b9m )Sv^ܣQrKR,L+a eOa -JS km1HgI5c>#чDB2!;,r&ᅨ5Db7JGNU~iHßIUo5'R6M52<-y?$EQch"UPTcؽe kZiO_APMi!ls<4}Ǜf E\6uxXh́M$-1O=phf,Gɠ[S2ݫډ}CJM]JF'gB j|֒ r%1ad#gΨdT;:zNwa\#|y?]st8ztDŽbfB lG7emyF um=z8 6 \aBw,lⷧ?t~]Ә_vU1cGxL% ͎AX@&y5bLroL ;JE!~}4Vcy/zR&S,la09I U tm10yBL"[TTg'0. ۀO%ȿU5>d8}ѼrO8 Oo/ ieBs 5I޿k}3fqԭ -s]cR//'pČvxXtPcٔgɄE;?U\+ y&nVKx%h };h-+NnomEe֖OwGH8!Fg'QLKfѨ6NxUJKܴ!eBz( ~i~4ʽt0 V'sgN;|; :+ Xj~b@j9Se"O5u[Xt_/^6牃h&۝;"bMSOWQɬ!c=\Ms.\ܳZ! vSr͠r|s[}|kn6UH3s{,vdWi~omx%KVI{S g)L܂cL2l4|5p(*52nX,TGݝ HS o|Bq%Vʕo J[gu&xp)(" aN}#P|R604uTk*Cr! ;0KkaMȓ_ȟ(mm/2sZ쓄$Bhy+b8ɱd+my@OGv m5|*B<9󕥠hd;r]S eU[gēZ-;I3]ɗ;4 >}WW"]vS]x~oo?#G%ޫ-7v-ը`ߋiy~dy+}2M4%Ɨ'&,(:ؗ]^"o!*Y %'YGD*=a2Զ\8Ĭ+FZҖ0d.e#(݈rg XB1cam f~hV=DJf-@( DiZ܂ Ǟ V T\&"L6 LeoxNo*[Ixi3dIE5.{5^L6-saw7I?,_'>E?1݈/>Ef3!Z16b@-+.>x뙄&FL15P`zHk@^H,\ ]J鵽Y:I;%fh\LBmy=A L-E1h&pgT*iۍL,a [o9CQK\=*ȸWg) &/+Vɷdžn;c7~I# aȇ&~ߘiS3p:D(@*c|{juPҙf:ɻvD5܁(3[hޕ !619’d(,xteG<\J#꯾4ce)4^7CT9lfiM5t^zGGScfu?yAа14/37 tqz#y`kSMU"E2q_%p+OQ8ZZP'b?*YoFX nʲ[r]l(K,rl;SVryy=:J-!{=O4CdT7UK)+)j+KS{K)bbnTmBhr&~~}h !Y"{Z昷V|6k} _({g~]}}naBl][WK1|}~.o7~ɖOŜ=qǼe/_Y}f"  rT<\m=8GMfn1P,EpTlmds@v-.rWP>' R Y(Y u_%wcʞ6Zz_ʐ ɈB1D_VVg7@)B데jpaSŗ/%ra[2ٟ]k0#Fg0 Ci͡Yh). G| Έ9vC.>C?ص11% eC"VⶰbhO%%BH//>H?D7ׯ:AzZ~nUO0l)X:66jETV#J$y>!\U玑uDX}OT?]J%d}?^ ,k?30IAL? т>'GRlU( nWVwGdqYG2ba7$m3Q"[]) ZSL/ h35 _ (_v$g7P&b ap⚖e #kO}-yMB0wZEuÿf6@;饬պB{Zo*Qf-C*Gt ETnjDs'U zhX'8Jô8 |1#]\D'g1v"4X%Ӊ^"k y]ޔood@Va BmX>վ/Tü|[ H`x[ z&x &53))m) ʂܘB%dn9>Qׂ|a-P rw[?l_׎ efg 4 3+,#uݡy7*H/T{8E|)c_'!VӴ@qb;I=迡p[E2#^,_eyNB<5Qmpkcs@7ӒZ/diQs6 XYl줴P0v&^:f96ѦT ú)bS{6hI:nĈ"#^ 4c@FAWb6xz0 M7V*0kn*9J\ۀ 1qlh'Y/VGOOV20<a^ibj$,Rdz_}.s󶆈Kќ'4U]}g@7T]BJק-FMxYxY6[ ",;SgxiRϸD[4WB7s.3xbWt YN*kNK./I:X|wwtΖ ok$Q\PAT" Vo%MkAcq΃-1 lFgCva5Cb0qw* =MaLf* X,Fݙdƞ?|{tļRJf)}9ޒO];'ҍLyRc5*\6l(zK 4LW[64xv&V1F\%':jf7R q;ߩpE>sw/߃@`RNj$T|]= !*F-BqXp7˹i]  '~S%hoM>cHY&k-{?2[~ØkT*-K* ]6\1r7R4>`~L6 9áPRPvІiS p\D;1r`w[粙&`ye{ƕZxFֵ1H%du ,]OE^H:_ll#wL <ۻ:bhJIDk=)`g[LWo I\ ;ESx\0zVu+8P{`6^b2Ocتng^W1잽4/w]H :8HV; x"^G2D)[C-ݦXo%X|U0}* {/Y!KtnIK儼~1hQZ:57D P(8U[p1N%US#m)+[:c:B$| D$n퀌́_eׁgyk8#Л*i?7γ鯒sMFkcꖱν=,Qak5+^{S)Y/5.F+j#'1ľ%׭,ӔNknT)b%whP A0F:Oqq-kC1ƙ>gsYT諷3:d ~}}6;_H zHoI>R[@r.#QwvOh)wwYE(Ljv~fV:ܐG4Il WshTNwM~wo}/4J 6-eSѨ0S3@AK@BA-#_6\ TCmiXJb@{V"U-q7R &֭s¢)ӳ%2k/֌˔1IHkCׅX <0Ix 4Sr͐*4>g}u!-ӣ,e P;=c1OD-xtpA(!5(HΖ~+59Hh0*w6|7߹#Ty5G[CqYK{Ѩ86eCf3Kݗi8)^bZ6r/hRgS:us y--J-C}s- IƨԵ薐E`eԧ6'oUw%<8?z;NЍt T baJBF-ZGlAtFoODE_ '|y[P$4@,փyjޔ͂~L9e䁾kc@Ss[(G k[m˲дK7ծ8%"[v1]|RM 2q1{z\L!)~MtF:a ~>Pd3,kU=~=Z_":G(D{@7 p8=+6ݢX\&Ǵfwy,kJrtACV&ΤEQEj]D2c]v Kݟm@.nٜOM^=q1鵸̯H\u^Sֺ۩iFCK}Fz26`f^!E;Fי-E>aj6󷟕5 {\%1vg9xchra?Mlԯ0E\\i+t8\bhd;|)? /G؍.oȋ= +զhn?ͣɼk)`Qh䩝wld+R\Jӏ;6`g,c|!TZHԾz926+-Bpd)js=̄DB Y ͝6DhL {2^#:Ǥy\|؜5VSWE<-i/yQ}Cc> 荮(^7sfQKxXHTժzl%zDsT|[j3p\>wCVrl.k 3N>.mǟƛkTWpXYxsl ߅߱\0uv͌Xo]1W vwp qv++~j#k"ga| ?lݼįR f:{.5=#Jy!,B%򫋽L(TT`|Y\l ;DDp!Qo}*䦄Iz?9rw?d{ ,(_ { NJ*^JZֻ< adG2{H,HbHVbt0uao7Reo;gQ}X֠@,U H`.h n~n *oCTzӝ$G`JK-\-V*ֳ!AKAS- %$2 ̇5U׋TO2Į5g@f㣠U,A"Nz}hKkC/OwѺ; 3y2 H?qn=30ѣ#ЄT¼V!_r4TQC+7UiaQy @7aP> >;AbSnü92m#U`zMe!ΈmRTŒcP"=N=]V1@ pTƂ?EK';?uѿR+  Ȝ g/S9Y1m1Vgfjaw;C'}96ry{C ]] 1gcyX!AF^pp&M84"&,MSZ"l\ߟ6K.D: jG VON麐3O53c}ExT˘>!S-s'(3>T dV)IB*OE{ Z8D|r`aq/$3J3_C w8a`[FĖ{4|UiZ| t$-c$2ncVW }:W5XyQԀ)tmlp>V|̮U 0{$m$A#h[nAi3-}HT_* &`< +ABЎ⡯2iiLQ|kP;MfF{ ie?RXHgU[UyB\swVj/UD?#RyaI˞ ek0:rzftt6}%"+[ilYan>"i"Q5ţφ* ?&Xܷ*/.D(?3-9thVGMHAZ`qgNnU{OUgkY@iuc(2߾It€m>e\({kTˀB,&bQ\'ECsʦ6FΟĎ_/ uOpLpKM_ݕB/ ][Q2ab%WԻӒw1{y> `[tr1X:26 lP*1#D5%Ƚn½^8_& *{_f>jAZAZ 4١EpG0쾂̘v@-KTͮw*7䨒@@Z\(>YJ+D1=@^?.bD3" 0Y&7q> :8GBVZ =+6!F.L|jJ}yt̩A5Lq sٓOu^hf>*Pn8&ikXROoJ kwn5e hhy85ғt0ޮZI5' -8#{J$:6aϊIV\YEzj4udLU舩@ɜ=fM|o BL 8U?pkIP#rxZ^!#y)z[b~y$;VcWcsgzqږ`+ÆNB+YQ lnei`BGjV#hN`zCd-57haخ:<ڃb~+fD}H, ~xa~w7lvWKL4]ο 5_:xؙ '|©g&n^F]`l>1 VGͱ lؤf;o\[YPШQZlpvg Ud %*79uh{huKO )k2-?:+,4WY}ּo rf y]"tpG&&-DX$gyک&[.2~C^LHFS3eiFd: +MC_}΄X#+^%y^Xemq=iN ނ M=4 Tá) #Chi?`B)8e#)ԡ?uwϗd%0 ׸ҮނSYk[y>GXSΔq.jXDʃ?t吭 (/N]l}}Cdk`LvJwIS4ӱK̃7[;XFF+mqR2[֬ F3 SY IHJAr r/hIdT0{FbԊ9H\Ğ_.SV Ô  !! H f!wlibmuparserx.a ] qiskit-aer-0.4.1/src/third-party/linux/lib/muparserx.ppc64le.7z000066400000000000000000010671341362723322000243300ustar00rootroot000000000000007z'mjQ]ruMBe`V)3vwɵYdjmѪ*kph@ X,A>UqI ӣBz9b0)U,`Hn~rvx=zOM-*;wm)go-or*IPAB'g$3OD&Г&b£c^<4){Mx\>)zG޹CxP\Γ S`fc3,tEo*_Lݐڰ#^x5rԪd9s<ȗQ%*ߓ_%O\O޴mk}ۉ6lz ZUI3AA{gGj[S%@15:a=?5#9[-ddZo؂3VG97ׄW71Sfu^*-'BĺMQsV=.C_di43?<kO2"GKKп="y rE + S~r8-WQN_/q)p:#..<Oe˒DL_3,sUF 3ZO?XD4q$@]Cl{Jb;hsNZºxwwܦ[9yB!mjI9k&E =_ʜA 'r(vdA+1lR̀%@e%;92hB?(" C@Nb`٦//!Kyl_к{kgm׷')&S'@.To~L6qPx6WYi1 m`^̅Ļ:yK'Q~ 8S1L=D5Sp+PVftGg*vBy$ ;`<PK#BtOhbp̕ȱG/bC+i ;3:P1BH$: pY=>FvW_k& 5r@eDG\펤,-x#;^)M>=FL{(i #h3_lbDE(R%{@k 5 |ʊ\"ߥBWEZSgD/? Qb-Q?МTHzfd` E|칿,7҂D٢TTT k pI~VŒ.9Idxoi~fiz]mP|=p 0(%B-R) #&(?$38WoҎBC!AN9zEk%2I҄m#[c@dEA?TM\LId>6kR0Td]K(Mn !4\8jq@}TLMnH;eۇxn~zӑ"+UQmtz2jm˖І>y*cI_:ne^ x2F~ncs∞ I"a7~s]_s-Z=>;ɆB4Ev RV 7*f_QHLg3B} '| F%pUf}N:AB|L(ZˣnUB0a/ut)?6gf2\ V󜫊5z# WjC}BOۙO {ڎ6.>\r3>NE`眴HdȍqiCN}k"H#K%er _qw\1 LBa/jw_/k~_B-Ǎ3bl˝!bkF}I`=UGZn[ 2'2it;G<\tc[:yٱXAZϼT^,t1P0IEyuʞTՄƄ/Q0p1I6}F1ktn{ ز qFĥ?/{VnV()Mxf[ ҖZejbi?@?@эֻ݁ g kbrw}RG`˹O|)FcfXylX™V|nгqWcs7т,}kiV]d;JT,?| ] ¿k-nTb( ([< kr8$jѺ<@Ҩ,yVTc(-=򣷭L  xmFǖO^Ye'U_}Y}H<V~\R\&&YDVEz7S. c;mLXyJ=(&v?J_zr~)Hx}`u/p^@"l[rȳy0 9!/WV? մyyWEe%U iIAo)JQ(*Pf8Ò96 9>P#M~v$JZFPNYXE'1˕5h蟦-kJۜ&L$3D.XȆO^Z13W/>M 4a1<c`LSZ%+7ff[LೌWVTn/PжY6ZHLGNz`_0 W<#ø};eo⮋ʀFY`7sU/8g%J^V族-g/0wSp;W@+pŠWYp$!D͞+WlVr<8UXHd7Z ('0@(1%]12TݕsDΝ}j $DKA Rkzʇ wKKY\9 > 45k k|^)SO܋\.ek zwG}qE)zX>o,/4rgtcx) fVƪGӁpu@ytJ%QC{f6A\Z͙M6L.~L<N'IH;~ {pW?wKQJ-`n X h'p_+4ZP2A uTRBja> /Thkv 칛zT)m>Zq*3tmmmҰ$'tӵnH>8)iPPg(0誎a{|[n w%pCAv+u^J{$?:P CҾJv7 cvl`эxRG)!:YDE J>oϖ7Q[I(-zvqS*hKe7f{\ʶQ;Ȅ)Zyvv9o]bԯ$)^87PL M,@0:LeA3(|%/fqHqtl,-dpj{3=@ޔ>mZSo CGt{Lp~Vd"JwKhfGIcI؀[Ad/u+,ln&t ;zC#unT|% tU_.*"<6Oja8DO1y葨s\`@Άx3[ Uߍkd;ʄRH]-艑Q77(lB?"ipd"Z@G<Oܦ\9hux{L(-$Ϩ[;NltJd<~7Ja1'`RZѿR?AoGX\;bl`^c_6ՂyU??h +<zR5-s⩅~RW?>vqOP08ޞjv nqxtz GzAǯS6uLngzARZs~ W'vBgԁtYs,ۼ$q(X \+C;(A&e 7&Ȯ3Rn[fW;-(,^YQ?AN:w8lBBā:mwSɵ F=ĜC@Stbo ܶݡ!vurğlskcaH{BL3Y%m/NjxW Q8ӰoEŵ0N^R o .@t:RujgF ^~^ƭ.E.PKjF|kЕfIқ9 .Dŋk~;0{X/R=R<[DC:pR.U=< dѝ"<$ FUSc*?j Pҩ򮼠q͆?V?xL>P_R(q{_eA'E{ǛYGq+lWq*~lǣQ؁A.^آ]bHX'QMd"8maiAw8FuUn%L 9wZV첱f$ԻSbi9p&JvW?%J,7\q(qԢ'/"Ϳ@gb:&"-:>TkAv9A"{ &bF1-?!'f|<Ώ'3}d>`~Waem aB<>һHd@,$veLoU4p0<>²6a- G}@1`Ky۳v}{Ι\O_}O';m-럖{<%l~6x$Nm^!id؏ѱ]qӆ*T,oqA*BKc :lj87㘽 BjY نg}->kB7M2#˟,Qc+8M O; KZxn%YSȚ cuRJ&>F,e$P @za0A8 ]i/%=?+,WqbKߢ&VI0H3%uze[,o`g&j7mTx%$eةEyL/2tp aÍ)쇌 ǿ#W@ξ߲Zo2Σf7)5ڹR*>{ȯ[5Sˍk{j~%ܣ8cf+z]# ^/<]QmlM$ƿkU+]"}s6]8T Ji[)Zs:4ov^Igj1X ^`%ʂ=g 12.j>Pll=+PvSJK>CiᲧ;z" =79p4ꕕA CrCoHʬ<=T\E/_/(WO()43d[ )lC%GeU)'x@X}3 DA +jwX>-,Fø2(3zcOJuGD$ēWkщz]$'K rXe4{͍E$` ~pň_%o_1,URgC3lq&8qr7 FT)iRKd+Dvkj)߽HHGy2J)1Z1~DdzYj@t Ud9 ~SERߧbĐt`8 ,91Y0;#L|4Eߡ|o|$tXK;]1@@w0K`I1@oYsȰj!"& @ 5zXQVplG;8`DI.0kB2500z4 *2ٸdH,ǘ4N ĐV`[J/-a@op ȤƞS19[. Z7AJF*Dty vvk4t_S]\>~9ØS?I*j$ dpHiK$nV~݁ X]Z6r tQlaH&O),yB oÉUn> n27n`CMm^sqI`c6%aNNJjIiWWPo0 ٸ-~W&2ۮ C6J:T|>h\5Lݒѷ 'IDXZU?>J e uR@A ᝅL#8iwBW?ӊgTH=v秼29%u֣Po=MҮŢ{?f6Cb:ǯRf]o磄*?M{(|9MPZ+:+!pOUFY"J((| L+pZ2S˂֢M .kPĺxoa[X^/_<4dⰁVv_mku&ڂ }7i k(Dvp)),vj5[p|йɂ_=?&cv o"|Lt/1E2@!oMX ^v- FzSvIН/pM>ݝ!j}r eG γ<갵iщp#PlZaaoȄ~VJ])ͩ ZIq}’.W6ȑ?7n:tLoҰ}R>t~5hSr*D]si \Z_8փTVl^$PZij3I@F(]ZHИ}TD~7x;N,VX2TMj)&Z[5ԿcӢ/;046l1)`_EC?pN!N vb9/b[{^ :<+@RGM}Z깹䛸;n|o}k_;`Xe! ZـRNkݾ" !3Z{/NglT}0(oԣ }Or/ oi{$]hJ?&y.|Ճl|d܀=5zF.OUpM@215ze P\_b>}k,._u!%_giD|M (0lsP>Us0^lf2q}|1((kS|{yy.uKaͫQ2/y"M˧rЏEjΥeCF ܿH@q!u?bѣh5G SL~ܗ,PeOKTȗ}*H5~|4%ۆt}KP[0\WB'Rm4׉|#-{t?kGGإjy`走5گ8%sOWa]ہYF` l~%(Oc \ZEaǹOZs[7$94A΃^]V(K>ai Ts5P ~C)IHcz/ @_ 9 @V([Ƥ#N>Ѷ7Pas޻{vC'\KDcwюV r&1W24:(|QH5&hxw2\GY;OYs|@brMٴU|V ښmmk4XZ3rT&wnm~]R>hPj#{dBj!~h}fxр DXy$#\qUpBJzT&Q (ո\* -rB9|CHb}o~&_~1W7G?vbK724h |ßQdo&{Ox#ː "p¥$N D/!BŵށJ%&jcS?0oM`1·&?ab _`q2͌AyՌ>/T{pj(B1ecJ]h_M"Z4Ync?N[^JYw7]n\SD#z1A uHFBз:[L4$lOL$!ǿ:i7^v’V׆p+$2Fbl.= ޲„ ;]wu/޺F`~͙։vFXB'+MXw"՜K_X,ĩ@q V?1FUj^lC=~FEir`xݪŢ, V5q0ˤ[yo^ZR`|&kQ)b\Ԏʃ3` ^Q9յ[m=*Nq|/o\! Q}ݣu]PdFgFLhфEt@vks_e1rXM (kF>! |o=Xk6n*mn2vB&@d(h0V^*T~i #vx|cɥbB?ΝAn 5U,N LTr{n "m6إo۴/s/jus08Nsfc3#3h$դy$&9gyN21햕 g.B>yXMIs01t~Lqhv|}H}5YxZ\ʌ$&0mkzVwץ+F`zD]6/S=0l[f_ C2ˇwQe$98j:m{kZ_/ #e`x0/9V¶RlJ ݏ2.s"-,|KS2;.?W]ye_>?EofF K6U?ht9E8%8&P=r*NEZ6OFT-%eaA V9,­E2`}^#L/]+I\ hFn~{d!eJvr50Ki,?/iwA^X vb|mK#rLH68^f*7.'Ǖ}-V=}|;TB͂Pp d$Cz2NMǺEO ;[$ Y^qFnU)eBDСrW?j$2Y˵%(Mv%%cUȡ(6^D`)f RLGv:Tz,Yʵ_[sgEy-^t\Dn|zD[V|4Z $^&Gb[{I}84fUY^L< /GU,0k/hJ خs(j;]T:*'ȾXcȒOf!ޑOO (o ИΜ(; 8[d&VYv:wK`9|= !1Jv@ԚZĄIX7Z㆝Ɓȸ5 kCEo }M$?j .][NAx,#KF zh%S bɌ'~\S/2(5;(i4){pk )ݽdE& &D_Fq>)CvByex 0H/_NN~Ғ3v$#ji]á54C|ڕG 9t+ sVw$+ C7+ҪyHawtyt: ;wMP0U_oU1kqڜRRKz`E/U?O8f3+l2^g3Bi+//$DtZzQ FgD=gS1pؖHao2"8Mܛ{F[.EϞqr\whI2hOŊ ̜Jr覉i>ą[I z_.B4sNv0Q ͿT]g"V'ڒ 6h cNs_@,dgx7:kCd"DJ*ɭG1! >*aW4}P VΆ c0I/tvӄ/R>¶``Ň .-ph9EazrYMǛZOr|5=MrƦ5nAI*v+:MH@]u)v]Tx}oH!ݷk6L2Ac3":݉F}gemomq(+(mLb}X7 Yg#nKCotQ$qB^5}v l5HP3NMq]ѝ7⭷ WlgZy(͑+cR5[*`"ȿ((J1ı?k~7tmm 2c.^hFL4ls5|~Ec`%fe P3 g=>ԣ WO#",9Dgꋥ#~(!Cmi z=//RNNTuOQb<_"#}dϋxVef7U؄ QTrY0sI7'gZRr;ʼn~wZ) a~lϛbS}8*bz,ޙY,wxIa_l=ĭ=wiIsFJ1~0bC>s;ZIYWD'.Q]uc7NuY ܻx|nfy9rcR &ՁS.N0)kS>_&J4|`{e@RUvio fx Isr ]$Y. O\<(]bd[t%m@zWxԀX {lb0 )m, vw8]N!9 h9AH! ISb,mhWȯru5'JEĠ35)X<.9: |)k'%[m[8hG?1[ٴ $Hc?UHXF* Cᗠ%CQ臌ZMYn(A~y\ " pZ۽ `# j_@6/#WյqךJ\U tْe鳆 (lC,%TtL?:%!4Osy$Ìd 2kܞ^OfzHPt-*rad}go`hz+nu&r=#S܍*ak 1,xt `7OwA(V~~q0HЭ9CogYl͘5)\)"h,*F˜7 r4^_;mafFph@.q%B4Do`C;•ρ2*{:_W: vL ك<A rbB|x1.?KaTBуeZX=Kc܇[.Krq#ʡ zR C咭\qc_u]5RbR:ޙrK6#M۴+~_d" ^C{@T*VEy=߰|ѣ4΍H Ƥ rΞKW(ěpvO)2ur)9qvc4MIM-3,cN?̾x€y ͊QL,KCP {Ohѝ\BX{Q9eI)wRP樳,,G̮rWR7̢H4}@`)im%1b!׵2)C14@*qYPA />[ǴgY̜e~8av2Ĝ0|_3RM/訿*62 !U( R=IECe83{KiGzo r Wo2ӑB2Z/# L$ sI\i-iy nd8N_9=u+ذ]$C LkTaF4fO2\V^H^K$v۱kv,v׏֦A/NօN8!'gQxP>y"Zݰ*x;k_4xC!2IJ@)º̉К"x!M~G$Ο&oS2]hot>ᚌS{)K˴kq&_}]OcNT$z<`Dsװn:vY @1-~wkҷ-7\?d{#ɚx2D_ԚMd[1eHy+أR-z V-i#:. x`2};Y-6W9AL˹84^0q/ x31Jk3f[03 4P4/zMJke [THޓwZoC-;X:ⶹ_I8cM6]*go (SU^ ' 1B[W /겪=?U['3'4b BF856\q .ZUu3 s"EsupK'!W'L˟j\ b.>4ؑ3Jwa}FNuV*^mn 83'͂8w#:)pu=3FX.g,ɖ: DYi$`OnCy4 M u@/K]jrT#|Mi.*LPlF,mv^O-?cFt(zz,ǎ-XfHVPx&޽6M]=9`T@!G@ N(q7+w y/Xy擒egjBCbW^o[[pjdg4y74 jg S!EeCh~E.a7yfц$o7 "X6X\i.[PBOjכ[Q ݡ3ӼUy6lvջMh&ߨֽ AfW06m1]1w]m7`EJ$zDcIj{1d60x,ʟr6#6{ZpƵ JRB?бrr>zj K9G+^ce.b~T^KU7a.!M xb/GD 7or`Fr'Szۥ0v54"p4;ԌՐgɂ¹P5,9KmB/TjG;R~>`YS wx‚&DOKo" "|K:cA=3~1BוLVxp_@xfGBLDurAб0#[)o4i<s.|S;d%+a+x ^: ꀘ"D5E-E yֻgi2 Dl .,GљL(SɈȷ+I@HQګD0Em\mm<-o`AZf:yC(Ks#%IBͽ>6K&w\7uUBJu[ /];~L q ~7 TgPۘTqffg+{ۅ/Ht0HKO D;Z wdG?bYz5.K> L9ӞT~(XjmI||h [mq ,wUnӅJ;qk+*| l[|~I$+ej*AYg%]2#}Xa|1cR:<Q׉[vs2sHSK{p+k%Oԇjlh7ȑ&Mi"oZ\ݓDs2TKRvA$N݅2 ^B, /I9O"DRriERD`mhBq;1fu#Һnu<"(Y](mܠb@ O]# *~BjC Nb}4Z4:w+W_ 2'O:ka{^*-Z3(J':\sc6 0ҿnr 3-4ܭ-N@T0~(N+MitN]1kSn95vJ8/v \OUz;ъF8YWgq_>ޥ}›5tX@azEXFLRZ!5N?wY3|]M|3[ O8H2uF-0A\޽'ڿshׅՖ%(uuUl jɭm__EDKRgl&fj4UjAc" W R51Z>/jKyvoyxDQ2a|^*qFLJT`cN{{L2٩\((pY=KjpQSSi.f/ryP8սgt_DƮx.[Acn <U'}< &3\<ʐ4~.@6~5D@n8V( 4Q $%] vy*r n |bx˻=4F=} c Su]ls!6{d=p#E?ГrH%0oFZˡ YH^}%y ۚgV.66]Y sT3n1diR`ZsiUdȫưu!JޡCo4V},5H/klVP\lf3:LHeo ߗr2WGR*9%+5<$祊7oJUJVoE\ى&bkv?!M FS7W/0\=l3xfmգ}tֶꨐή \-i (J.[_U=onmru<4&Щ(d|G{ ۸{(bz{+LFPzP@XH B+<2wsuGg&DǍB z} k뉌sg )f-n|L9!` ^ld.du5`Q הKg$tWo{HQۥ2)}Tп}KSM ;Cr|d 6LGY-̅ܪ, {{ ;Ķ2V·vYՎ1b= ʿ.,X3*7$ ?@4!K|#+/eMvj5gO)Wʓ0AphB¦b $5wAQi]`5~8A0eeOE9㑺"dHwuky ύ P$~ B"q046QM̟FfK`缧ԋ ͧ!qZoz MFՄ_(ryVuSk 17Fߒ_BNVxN#2;z,q\J"6y΂7~$,뎭b,!7"j+m1&}5@/D Y‚Ŭg#yRE}+`C(A` bm^AՂi$wExllB}M HzRU!hñɠrɂn_{'ōu5`aһIEz,ko$b-"w8f4O2{R՜Rq?$eJ3.ϥM7CZj nH3Pi9n$ղ\yqr4@8#TWpoPx( R)[g<S`h"ߥZRf@aD4K/*Ɠ@xakՕ"!&nZf0CjjC0pQĴc|c~;F]F18ndiP<[b0e´K,jϼ1aNS=X 'X4i?B%D e:[HJ늪kA1xJbNҷ524%'GQzT]||ZA^u%HoYOAPS7WJϧC)}FI<ѹD\JJ@>bi3s I?؋X3 AǪrT0^v cvZ+>j-lWLfW(Kz9ȓ7r-6}xZQqN ;>U9k)<[an n-38.u;g?΅:$|U^W;8і);09C#Y)X%/v b= #6a3PI !Ȗ,omn<-IT@g݈ȡ(j#զSVO[sN?I"S/UJ,->f\F T$>k_ Y$exJRW'ly ׊[$@3sٯ jY7wo ™]Z V[ ?/d'"l`7\C8$)䎈V"+;72n„{s= Q.{#ശ"f̿HexϽjrMUdRY{KϽkStC#<&Gg)Mr |I4B؍ "F Pޜ4SV:}+@N":8TYٞXv8:vb]|uBuA ioT1qRæXYy_M9nd /G{*cQMhOn$[n"[9o,fx]`@@Gs4DU:a3 9 G4 Dg+9w|^j0R^Xh?PF-VV\-~?+NkEw8ۼ8wBNOm9P{  pDdr;zzڥAWĻ>+!"1}Ƶ2AY6YжY -Ā7돛cFGԽ2W:TGˋ.*AwI^u5Ā|ʲ3,jH!s>:̕f4~Vٺ.UGҖ҅販WfgDKةh9klQ7!jºJdj9RDOSC?L/_a?AڐR~]8&UQlHEW#$ i(?Vw44ׂqTWi@[)EgS KxC=U2nÞf uS1/pmđ)9(}r~UJ cJaKlQ*nS'Qz y(B eO M&בG;O,[;f*q$rUX[3+iU'+tWw;]ALA<<='ib?>-#'S[ X}9g3H'|!esuFsgjjj(UVEFhPclMW Ԕ?ئ>)!G8MBj=n+1>}^5X pсv]xmg%;":m u=|Fk".dHJ&Xۅ]Sk*T U"o/]}6}i, `a{t? e]{=KM@tvb{򨇛56g.":2~vt'Й\$"ۤ09:X[e[©h ՗1 .f 2~(|AۀTp"#f50|hO&k/mˀ>Y ܷI)$ru1VIK?Ji{SCL:sKO%M \dYȑK#yh23E<o0PK_4e4$e޸iyWS) ~>-9r]Q1u7<,<ᐴ$:SN2#C` R)\MNS0) ԉP\@mDH}iz1vV܀nS=1on`Ж*s܋gJ*WuAP,M~l" R[fpς -. \٘& |diIKe=>5j*,甏d˵FSI_gB>E!Q% ]-C1Ĉ2T*F&l BHEu;UaΡ}G[~N[h9#>3H2UE&(]@1*d45!ҵ 2Jd1Jk0ZyBg}gAħ9 ]Ucek.ٷlInZkS&^RO 9嬷uzo v3!O ` s#=nS#<|aaҢŝ e;Nqʒb1~U疟sTWvti?SӱƳt{x,Op325 I8AizXXQ`J1>8m8K\aGEnZX/w2W1Moxo옳E'ΚCif#Bq~Nwo^O~ h6g%t[a#2y[|a=ڢwL?soORcX6K;Mkdr1K/UCNdp7P"WG' 4)<ϫ .ZcשB$ phwX$q{qףܘ?}`?99f+n32ZⴽK,==.>P%QK%䅽CWa9;6-C5晷Psi㷘 +X8Ƿt`0_u{ m .eRYi :sc_axj yqzd W VkS^G҈}!#o%kjAѿf.ھRyiM"K,}vzɮ`+FmExؚ774ѬNTcZ?a(Ppp M5TnYD9 =.Btv1)A"=L7'ԇK,5!,U8O?7-;[8bB)΍1%.bc6S\ׅڃVo "U\j!oj#Nr-ȼ~VάO=I2Mu6 ݂9'g]g9gaڝ8lzDޜiXf7}p Ah~ǻ E=/\9LCO\p U?⮋GWn-oC1{k8vܽ-Br FcP!_5pQA+8?7/uޏQtjdb sy"_sA۲!Dq_u4c܋P"z>ҿT۫ly]8j6kW77 N<yƞ/F tG@k2~YHP]ⷵ# N `-nVS!x-09 DzZH[I19z ] ~)q ,It۩P4b`<%h&>_{ZS\;hkCbws<1)#{$Kҿahι]V. l> f[z:_Q wǂ<[|P# ^xjHtvצA)ǶSj|*Д#Ċn %]*QpjfŊfԽy<ۈa׬}.%ZŒ_|؏y(d?6. Trcs%֎'aE  \ QV2:UrDGnhWڇ^65Y iZi~TY"Dmw PFOЊFG҃aKYD5bCVk]XJDݓ,?^F$6zb %FO1Z?#ܤœkaDh |5/Je= W106=E$`i"7od#8sU'3haa>}TFk^՛x , !Sxy nwmYj@]_U @og/_ʗwks4MAnpPyi^?y:D[$2*եZ3D~H4H=ќ"6m!I9v{V9 *r`2JD ;gH7 4ׇ_M%|zli u F{':w8R"?Әb ^p{>#o 0ݔ2P_z)·"X >eWC=5W]Q59+ LjrI6C&W*c#OsF,ڈՌLݓLV/+`=qxɷ-ōD< !_L!&“̢m+(1>gL$<|d_omU(3ŅL0H@F7j#@!mWRsn!5&CK@-jر@VGnW0!pQ+W̫C.lL l#_犨p :kpS 9DkXٜi޲9?]#<mj e8&Χ9QZ-.bK=:Gp1WK)>\97nN8p4߀82"ܻ҃%ĩ.$'{102d׽'XeԚ_6%igvPƪܲڵ)5/1anB β5##n ~[4m]u*qQ6eY8#Ԕ>=gN09;jX*|zn<[(ơʬȠY2wb" ,T Ү}P6fFKDWf{H]oqG=q6]A{. k/p@W] ¾V3ig_]qFJV{U}i k=1dQ6t{"c܈\*] kw6kXtsq0R'whx*"V65tNE&ʱ( s.k͔,(.j11yviDѺbkԯ>'ה% bc F$j{O-+7}no4@-iM{"EJs}N%1'&GVn#O CdN:3[:Jea[Z1HhjXvf5S\2@W:`ݿy\^k7qjuT]~roj&gaUWݓwQoIc^p#҅*2aabjp7c{EVbAfftZIBhL枼&Pga`eIӰP#RQ)6t :BjL<@CR~|Rf% Ob`x:%v"|;]Ȋ8Dn^PaRˎ+f 9{-rN'xhK}x@ ͪ+~ n Sb8>5ȋ6PAN>$9{XEAQ[/|xC}3d|8b2ރU,П`Hj9QȧW_fwn]ЉyM+m2҃=$aOV)eMJb 3G1KL"*AUI-Xn}&y$cxLEI7l ͊ Z q;߈`ke^ CM)U"9s?;H.~ BX XVY5C⑴zgdv?{?%K~޿^7.Gw5$Hk ,V,G ܁ 蠗 CeV=5@,DP)aQoڹ=r.9v{>$k^o/d_^ƛgUY1zi::^c~*Cٖ'd2ma;ԃĆWsd Xt{:jCq)tSjJa:+3`WԧT҈ɽdR(ߖe%39pSVsZZ*"ơ0 V+K.j>I5z¯#*RTG6E? v+h,bf:W.0mWkF!od:,ʁ[ %pNg+bxֺ̬0.i w;7#_=ز$xX=oU8ʄ,]R/TxV(L#Y  jG0x.JIؑl@}ln, Jb6qVE'W [o-&1. W}id,'IoPjW(Tn .,ڥ| K@5Dw4M%Slv@}. byS>ޖJ܈5ь: )F/vA*iU"6q֌5քC 'fλ% V|Pv+,v^}VwPժL?su[*[p|s;G58δ^&\}|7җֹe/wR&1dQva.Fƀx,ts7;~ٳNrY549sl$G[u.]#~L1lU XP0е CiŪc~ńAbj PC6H[x\/PD 7Kk/_P1+~AI{v*JGcYn(bg6&NKЙ]w R+M;Ze{'6E2^2VJ[NY%#Є7A𫃙4bŒmLu\76fu4(1zTɃ.bWac[WI[0x&% ]`+4}VFmWzFfS^VmqJXEKl6pxѥJkˮ%ZIM#Wͅf;e-`wc*X>V1bz`oM96>9y0 U돮8|MI].WR8gnљjxTI{W`Jj"aTO#p"^I[wfxLtm O~WP0L/pyoN"Xmۯ‘8JQ\0?x~Iz B?jnYu\ ڗ+kJ/8=V!tP'2״@ò-Rpj&Bߖe/TJ% ü֣MNCU6 .giQ8+ @'M)Y9W^f998g뗋Hh{đ j8AVD#'Orh`7ʠfzT+F+ĵ O(Zӂjy]u"y'wbߍ!QmD$G- /(L"&*ʪ 6 JD {&O5k!%P5GzN(ҙ Ö 9ɅqMO]ž+S 16chk; .~LzvUICW қs p1Kk_FPS_Hjnd1Ys&Id35{F VhHYW:džd[ȸ=eyX>yN\<X(Y "0PX?قβDN1]Ni+MBmy~ V^3Wsx04{Gdia/2HS=čSX#,hYt:ӕ§%[u#w}:uY1mG|'Y5}.ponKd6@+> .u9 J͢jR'UHRoWy;{"z)mem ^D2}ʂyx8 rRi>r Kp^)/w .!<Ո<Ǚ5CzhnbH9)i;Qįk@5 9fܯP>/B ,ΨHq^մYf%A}E&1TےޚU` ƆBPw a rmGJx~\lh//oOR[X FQ4d'-opū JfօllخEƲ [J,u5A<1&m.y1EUz ]t١$ ;A p;JYM4\(Y9)':ȹ4lIKԎ1 zN2B\ڿOtm'1h@JOR_C'Eh}M6)<;f~KC5 "\iOZoZ?ſ.3&mD!ZY: vr_ ])v,F0]p!x9I7Oӑ 0ue~1.YO ߳ E@no)w%S4j{zH母a7sQ?$/.Pȸ&4!?m6Al"/Ƶfn% \QN)̳_-⍼kM}m,:{Z_(v8mQ X7\Fi?f`Ɋ7jl^~P3BY^* (aZFfm  *Mn2$KH+eZc!$=H; (gqĹ)Q9Y2@Jq= xd}v49PkrQHGO;$>k- A[ KA! ιi)x7Kk=5GVݺ3!fLHǜ̪v^auný< GS|T?C\?tU ZmBpk{gO`lz%Ur 8u=nw6(' TR{ȢI]/2>@ 8;5Vt[ӄmgChg,O>:T~55[">ex\6{'ڹ ͩ=~M@k\HR@loa; VrJ#yVo|hQfx^P^IjQk@AH3&nTLÐ&E&ȻR;̪ "܁fV L@ =A*}(e,gj ^ 4B`qGrm<2\A/[V }5:|8Oe Y *"5,FH{,kѵ±Kym嚩X+h+قל͎:V؅CAWYitN󚭠.%^-.ELwxܰC嶺 h>82Mt`ws!"1'%BGH=7u`P5I>YAxx xEZ%Ihq/T#E(x2#hqm߽BOZ`$B{Y "F_ t_% *.oxִ ̢BpC?!q?4x@Ca*B5/{7?V5h?XፈVuK5o h[$s;ɡ 4g- [(-vs엽μZ`{Qr˰F qqV%sIc-Y|4_tWq=fnp?Ix%%D~z;4k|,OO!M zٽTY HG}Ҋټ3&䊟bBX.nپ6fyNu@JaO !]jVFUʣFQSZKuf:g#dSm7}z8FQ: v ;Hjn\M-cū  ɠ=H6sԴɩO5EU mMc@NayG|Ӣ@8/Uy;J]\X~ V7y" [4FB"Duyu.xE Ny[B!lmR: /XG(K] CC4:n/aךwJҰlM /v5W+(ۘEGp`Ҧ:iEҗO׹1*њP1zBK-Wc2W?g2Gҧx+N&IbB, ڿX8H=QX-]C 44)Gi='M@ַP#PSH"ag:O1OQ)ӎZLJw|1_U+8>\ }|_@[ Ekd2Aq9Am :̇_ $@ {z>J K,^2-hUEqE\||ݚ36~`|QxAl̛8 f+2fTJ#)]7(,pq;}7X@"nrQ6v `w37dq΁yW> k)49aoT@3V,'Dn_O:XjRhFYC[0o#;KV_RR:svD04 KYA at &y`7U|QeR&hc!CRI(C,((I{hQ7V6W#㴟ݞe|#ULpKS=0 O,a/IfTSrZ,j}4n;"Hi?O3@KvǮ50m#'׾J`{|a-S+߼hc{6W##7#7GB);㚤KIf))Zw2 a]-H6p,𲳣9GT9nIDn{ B1pL3J_fU4Fcw@' l4<qtu(*+P4W EƽD]Ek (W֡ a^>=_9/5[+ہsVqÆGxAiOe%sxY. $iփ.jEU9n<HKzqޮEf(Lӟ":Q3uu) zO *9k8 6'oa0$Njor[q*_} iXh8?UMp1tϔ#fdSH Bv^BBN#2HkfCoq;$8Ǝ2~ u|uN i%D՜ZM'*[!ԓzL&Zm4 UиC4`~ 2rT ?L8:lè|A7 nZ[9WR%\ фLaLjy pΟlt&LQٳ.SasRإ^k)FwVv?}(pTTvtf%‹/`fW5u\a4+&@^SdrvT*&N㦹uubO0RglAqNw98#}TrzL5I)Q/|"ԅ?ʎ p&ff>օgh4p(yt@޼%:K^K'gg~!DvH:|hnhAg& UQϻ,H-qɕkT9 kDH>ƴ (RRcIc/q'x7 E4xO!C8xQ4de&=`$4fgHv?Y s3ov (%¾t,#pgf]܂O*ܳzF &ͻID‡/ nɯ(Պ\B}'%fͱlD]mm3G'Mvnu|&迊eIFʣh5יثg&D-)T/#@c7r8qjLmYS$SU9!Kt6fR[{_ixLC@~>7B9`Cͤml>vo) qGp5Ӓl4RH|8ҲV)uS`Èԥ3H k}1og$!gF[.M@0eG۝*Ҵw)bQxbʧiXL~AeuFfa4@@?w=c4'@&CRp}_k)KC ~B:v;KX\3ϐHNFTs> nDZaK ѣ槢'=8g;D\xɇl(s53,<@VڮDbbixXȂ$ND6Ahtߚû@v_)}T8(9.[JV8!QߔÃXߣr*ərd*f&͢D's [߃zN4TJ`b8?cq78K&-ޭ|]ñ}qUN>ٲpȊ"l9׈(Ip dnۿvFȱHH+Kx {{+y׻M#GJASefӺ e6 oӦaq i0P!XrN_eijjQˮ&Iž8K#լRÊ" `pvBBݓ/qb&%ǹmQ8-:\4 ~Wܶw&,"OpRɭz x1ɰ=վe5kܢ2F0=(3ȉ"neUoŧUɌ%F"L"T x[ԉO XOϏ5 ;4Xr_Ijy&~$U/cpU;WīzȆNF;J~mYeNUgC_keسש/*]^? f\x݃4O3ElѨY : /z)hVľ)[U5UDŽ6& sAEj+t!OL!.Pъ& ׷f(gB իO5 u؀#}RCUw{e'u6Mr"#_N>́,",pTW0oU3'"ڣ8S}x^SˁN-߮k .j܏ S/"Vt63(/[^Nthe}k$W ZV0i|x$~6}vd3l/WFx9} !A,]ӡa9O1I|8XTد<OBHO}Aok ט";o?MLj/;ى76diLN)庲 䛃PdҼ舯:byj[bȵ^M b! m`iŠ:e>k2 VA vYN.6>Nkr̻GQRIioj K?B]k0Bfn)xN"8pAna29{ "2s1O 5jdMDh0+ "`:NspЉ*;qU8}wȗjl\vέӓ5̔lKl]ǮA+-Pt9\̎OⱅP|ȯ1L_G˓/dOI:zI"eD j 6V?$|-\A\m%q0c$w'!|#=`\@#à*,՛Sk"? ˉyϵW.n~OZW)'/4z;nwke¥Kf_|ԯJZk.ZU--I0UGk w؍@;G\ɔz?b|vJᰮ7ҵ$AV w_/@%:١~8"?='{5tR[ *!:JŮA'6_pY NOW6R{`>+0lE|N/ h36q 6kX8 㜐sxG/:۠o}dF&g)uC;!{WidS`JN )i(UqOzDwBx/gAOGLF}1Xf),w[ yfϝ8Ig߷E|Ae37PW$Rc:I*a'2s JjP$EMHab !f7@ivkkJ1bCfrSe6LV|L^¬[f{a~> D\FB_Jv^|}C-Rh=.|2ج$ֽg*ogTXlmGx(P}Z{RBuЃIE˨zj)U5P[u#7q@rjc3;:,Oͦ&%Ȇ!9wڀ ˔T>:F.&I12Q g-ԁ.6K?TbK5-Si:pG+6L\+*c"wYcX+BɗؒlVm~ Z;z2y*@d&0ePBGGT,b%z6 1EM(^lM};cg̩UD7(nVC0.?pC]ES s#[DШ̢`@K&_$ .HgTW@P1דgz5&QMc- B@=,x/o-|[7>< rAKyo jgGlDl_Q50F lf7/+c;T̵ZQy$:%+MD"[@ϥ.|su+@uJug%Ǐ|LjRucY{AJ$y3fw[YXղK |ΈBD3uV[Q9  P>K).rJ *,F0hzmVSYDpznL! Ŧs}f=TyW$ʺ`).mW)9-|tk1QGS,֔$JmH%']=SRVn#h^L 7 &{ 7ndt(:jv|hg-qׄd~82cz\U$g򭐴E"|4.F5e(]j TI꾼h8䕴"1o%.D^d5vuǿmvZFͼ؞"+7cĊ}˩ Yzm1AXUo;7ϩVa K ~%2- Žʞ3g+jPx6bmpqjNuUF &ޓW[ ?Nܻz>VG1$8=l-\3\B8kr`Kޚ?J҈9*'Cȉ\ɡ犧/'q > 5fbn*#G1񆌣jxJ m2z^ũp^nh]8YD"/(\4K2 G輑SgB Q9r: 7 ?%b z"(GR,Sʦx3UqdWe Y#\g/}.jhc Er~yl"mC8+/ {|N;$hO1B*zHFy[%U޻!+ٳ;? X+$7Z]Fh,I}+ݽ8l;5-9q9Ԅ[AjfƛM- MeAžN踈@d;!rƁ&`,1a;/F}͂]~ mqP l>[ɋv܇_m4 ՔIW呲RS15H ~cT2WN{7%$ӲB`6 ԕ=0`(4G"Ej$v ݽ?r%2"!H AG:iife(,A ~hhI ;pIc^ʭ1g38ϲ(CkG񑃟_=|vDJKa>"ψ<|WHO7noݨsXJL$䘯 b9=H,LEQ03Yy"'뿹h1e$1OrT%;bFu_)}i˦]/(z`Tx?jӳT68#u3X$ Aft})`i?_'7Kb&}D{?u>9#g#((Fz@}`TXa(`)*k4Be׏Y)h|Te&M}юPᣪ_LԨ8@$wpÓ}1 Q'ޔİ b-=Jsxe#HTWN7KXqF`?xg(,qdK ~WE+%;TV l}?;0oYO9Umfzb|zV  d1F*SQ֛wSr كWQbO/ٹI.Ȼaq-~7瀡je]BdiKjhy^zq#J1vL+4 } wx/Շ( `.J.sg3h=[-{~Do ^E]ϲ6hጛ ugo巎CuT[@v1JlӼ.#æU"r^! ,O̷)mzV!dݧzK$J Ҹ9D\MiƑ42 f >h)k:#*Iճ.$ӴϭeQZ9&l5ncSWUxrKy":gl qΉ؊,q`V10hHU:~ۊR rWsu,1;@4"hE9ȺpG2y-50++,FP64{SLˬys'M$WoZm &箶:hx}Cœg5ƀ} bUz%*E<97 @%L鏀VaI C.R@$Mݣ͟p.&7iiɡTbU3񶡎͐ɄpSv͸7 >yJ:$4WpX@6}0_eRo|!tD\JXz5He Żw; tЍ]7x$@X//g!f/*nF L_uNcO_=@Lgk Mg*H -M!4m n=Qŋ<4L`8'>SROVS(xz-z'Q|vגK"əpJ]QP} >WS- `Gb 8ۼlWnDvz׎G%%$Q7B݈"cR!CQuVCl۾e׫`RE`Wu#vS\߮S e-FSf P\YdހtCۋy:e{:4v-ki[a>#r2yy=^qD0فMYik.CO+rk3z'ne C{x4gl2͌^ǻG[Gz(!ktI:+<(Dvp#z bf938M: WĽ%5nft%Q- hl,Re(Xoh}㐿̺IL_QGG\&CB$Ѡ4&U_D%pU{]]bemRٰjو7c]To.b} 3Eϣ;hk]F̥l`ebט e8FQTzO$%p2)7/C ۜZ͆0ÏS2 77rLJّ9-~]ƟJ; OiGgժ맵L("Q3:\wMPq!d[_E>:ӍlPMb ?1ە#]̄e_iH\F2ԟ5Wǟ Cdࣣ 3;׌l]+A9 >,lT>om0+oALYΝ|`0h? cVA "iC`53U+r+Cx&1d"roY %ܮto IG8u:PE>wij"{CDO&2?ɧ89㏏d'Cfa/w6 cLYITz ס)[3M3J T:;rd7'efǢR=7eCVaxjt r- D]-c|ŧ8NxN%BHRZl1%E\mh aI y8@կ]n~0./9V}ycv!OoGy :#e1X*f!XuΘ26U1Fn:{W?0T`R޴Q}`V*6ߨ9,76GbMxv͘Vٝ2w?M%U!CCN"֗,ĴzK]c̢Vt2qanլ"g P!G#}yqí{u|p#2_X'"&^#"FsBY5:y/J`f2&Xr"]st+x>(J3p_Â9rǦwTzTHP ĖެJ;l%niiLQC/zWaBcz#(az)( M8vnX?~6<H/d^MaS= >/ t AӺX+T8!t"s}N{F[5r9"X!+("- 0,!oe_]0ӽ/lJW^J:NN=,e<zʇ]CxC<8KQ#qOtԈٕlYy'4.9nsA6]WH{4`~4[J.\'cApcPùV~H!=b*&Pw`oaA#j^OI)㥤k  Aua)!&]RkpɈ9+љ}>;sRY8T&2>if欑%L9:n@%YYV-WƫYvgկ|h}e6 !#sW=x8\U$Si7CjidG-w R ? OJ. @0Q֎%@l:}#T jpDŽۀ(%p2h6xVl?]Ů.5ؕ θ` B-'oΞr$w+%AnOs  %3>I]lo  -T_HJc@y [$4Hc4c% p=DSknç-Pۘm@w Dx ~sYKW>y&Zoj|pfS.=)aiͱV,4ɐ#.b,h]e&os;sbx󭅡xZ܁6q+ɥo;zQR:Q^SdLND+wwjbCDEQuB } cO:3OfYSKm}c_Mb JE ck #pO_D=p] c3,hVx&;dɼحrKgh)N}E+Ch⭵BG9+as'AVXeM|~!9?C..+Mjׇt{/~GlkcS/JډtM"s=s'Td5<1`֓sH.[ l[]65/Ѭ\Z(#>(Q F877`Լ'D^WX7za4AY}NyXn"9 wCah0zVU|Ȱb!0Y`rn~vJ[+ 0A=BSo(nN] qBgQ+s}uA;y ¯;3Cpc|k'(]銘'.}EO?ptlA~JNn8 N)EF#0dE_wzz讜%mD&WBk&o|8"s}*WJ0BʕS&$., ɗDԦaUlbN*veOX 1};]G_Ӻtю1e *u pm![;gw-ujU>*ՀǾU`\̠ϑ YW*vNJk^8`i]B9k|A)90ŋ]Q4guJCSxX7PGMx4P#YD]o6$ifh#K+*;S3(G`\IOFf0lJ0zJn xrSv+lAK7W5գ͢لϦN;8 lTؼledVB<&cR_uwזٱY9pF’%Q{}QYhXV ~+X K9#V,RNұKЂفn5 +(.l]R9'9bpŎRU ]OVwg]8mR{r<1K(oe_m,gx#hwD_;6,NH .vKje&(Guaԏ+Ɨ)HȁzZVN/#nQpOf$Ơ]'i 9W1u2Uuy1!"tԒ_O"cAؖ\^!:^'}[)4Djv(i}6~m'Pa 2ye}a@xt>I몧_(I)q2{^dĘ,b+g0r#c1Eه FX{> P=ͻࢤ(ygl)pm,uoGRV!i+@gvqMLؠC G/;ޔidwNOv s㛰bap )C )(ύw.T7o @K}ir%jӶk0Og }(W`$> !:ϯ!!b9Auq9eQM|$z Xfa[jlO|Os56oe8bEÂJ;W++Le3+܌- ;ۗ k@ʎ CVB~I3~.R׭;$.<ÙEDRDys-NO!2MB8tJYz3ϕ.@Β``5sG1SзypfˠzdM]Eb4zğ/lWQr=l6ڶH ')獋W/ж^+J4-)g[zGyPe {o'7g.iVxK*/fkNEX<jQ(%̭ #{<)Ru U KB$ mpK6Tw(Q@Taf3!J*]X[_DFl+sVQ Ra1ɰ]$<Se_3RL!RdUT-pZM+bW>$%s_o+皖;Y/L斐Jnʍ4qvwsÜ&)wwb=a\Q6ZʍWe>_~%c4T's}FGpp;dm/7QIi>gVN篇e8~9%ߡfl?iU!A$X2r/A?@xt=g+2Mm<&1Bs s{+ 7LjaAm:So*: țC\[HQ.KE+հI^2j7WM ]?+ ϾadPiڽA Rr;ZbNI("Nj} #p@E%W2tTuXNwjBn 3@6ͨ*]SX_'(/0aGP¡`甆ьL0(d!AnHjdtĶ kq4?ɘv-XNJ"GGݟb\xq Mxm K ^!CKQ_VCR:< -pm;PiY0 imi1fS(ZAS;WT#Ǖ~  o")-4i"4yX~囎yոO_.$.xҸ|Oew/!Ke朞%@N^ih"]ԝx fw&U#6#)ҡYV ~'҉DK!x2]UM&*Xh{.D|gƏhm&K!} հ=ݦ-;Z=⓾L)lw26o D<⨷N2/8ĢfHV1n>zגkM]ʳ`E%Ǩ+^?;^,4Li<ށ3k%?%|yjl\J('W]ѐЉm,nKsc&\+^7&PfJ5c\jؕy&\h0U\5":|yD!^]B5а_š7@],ppΦDGv2ϩBI3Z,>3iP7#Ct[<0\k!<$qabF~pV-bVX∪S[C캼#>a#{/""xڻX|h爄nu0}kg0uCt3Q땅nH}" {Eq-F6$w"*Ik/zTX5s Kmɤows](Mݚf5f TbRͿMcI/3"\]H нS/]yY-CZ?5NsL2Z7$_i0[+Vf,. ifnf"fenHD6UYO`He Ӊ5; ҡs0`ltЬ3Y[a{a-7IO_cܢ3e{d_9Qf yVmS Pbj9`l=gKAN1the$] l%wu iD{?HvJXrL18jK/=>Xd_]Q8!\$YVV3Zb睓N &ؤK9ѽ~3BYOcb#!M3§ ֿ;˽me[;*!g~HAXkL*d䬒a&In)w(2Pދ)*DcuӼtZ+$47bř ! {D,vw<*0h:MfypINÈ!tRX<#km?S = v;-B%M刞S)y:! p0C6T'\} Ȣy.c5BDCx )i rVnP!?_K?tvWzQ=7sc[qui i}\n=՛LА 7oCL£ noMp݌S۾/DZH:;VIepc m&H!'gGJA``,a7-˼SqGuDB뿡)w"p-I'Z yҟSZ]1r8 l!!.-gqbG +"^{뚙_ 1?1:hzya0 I3ىpp)Yk\QL 5r!~'+͞rnٔה+,-.* 'xqѻY Fδ'"6e,UJi!eQFAu B!ܡ64<[1Z$q1:a9 DEM-Ǡ>ZPuoPB M>+MxS{?='\\(D *'bR ыuT.%>R,1~ӉI:58: E#2̹걩Z_nKkï>dC/)jv<^'+OL/AY@4z\]ja+JNI27s:OyO'gL&쉨e0 I^M+@ l2-o+qtikM$/gv#^*kY[18Z5ZKR\9yIkv ꫲT ).|~_`4Opĝ Ex;ej;mR<,{mOk@`daG$o룴-*EXsbɝlX7#fz&:72w=:p>B?[~n7OU"wUZ" 3 1V0춄D&jM7r6l(Ah ˊf iOK7l^`;fA]yDji%6iofBUk@:; `G0-6DoJ NsyeŞq.`izq>MKؐ}B 625$ېwl[|wn#{"= C$)!axڢiԫTZ5(bD;yv$rHi5 TcZT^Icm,xbpi[9jcoz'-" vy%JXE w!!՛ Uń"A?QUKhSH=뻞\%!/6iپ_#' اhn>@#sTƞ2anPzfc=kMo~(zD}kcgd؆ИL%]/-8+, ['MfCawJ!cBhZַl#Uniz2^k]NpR2Uo$YRDS$%6ʔ02˳s5Jru(K eU6 qċsxe,4`4`/ Zvi #g՚NkkbH>9 k..aG & d,ѓ x:,`+Pl@~Z !t eܥ6Vj&VS;ѩs[bi#psbR}aI=u N.DK?{=m! p0M1% 1*]WV} R\+t ~|Ab+whf2i5-y` {H:pMG%k/n5,ky1 :Rkk.譍xLFsWB} D&\W5c$PhY..l8jCh=zȂUf0)Dz1#w TD :vDyAhsGh ~Pe&h}3TRpG:vt#cb;G׷\KvC85qܽ`KV(җY8ˢDG<r6| I76{u #pgȧU i T-˪# Tsa'eyfo?NayaTcra)k}̓wLpOlה6^isS>wx7 F`RVc;09& vfiBjk<ʃ#-%\*וEf0Pq/yPs(?V'\u/^-bU"&'TYvU8֭BT!L'wn _@*! xU) 1%gg}CLJ_s# 13#y;Np_9[NҀ}A[ Rʃ2}=g2bnb%6sџ U_BnMI^YLC7GNm@>ѤMO#hAf&_N’^W3ڋ {VXV[1" t,y4me{E5k)X^VxLZrBB\F2妞@I4=ݷ'21ϫn$c8+H7 B u'{nOS/o_öߍqw7⭺8i*V{x凯t{j84ASe yRZ: iYsW2,qUZF6'/_QUU8[ݩiBf&:cLѡ壎nqR ]^< ϻW+yM=B{-ܤo;('%/çR%E1gÃ*mdoܫz5֨$QIZ>INTakn\J sXƛL@e50dsRiʭynOԉZ\`6?=Fs>"qJVpZ#s2+wDzxiŔD:[&a6R>6,a@9lö-3M`^_j2UӶ_sDzHCg;3F7vGF%ivIcpbEW  _} 6_5{(g.\^J  䆉\u-'sL)V1+]<cf+TܹQ$HWI5&EN)wа1LeFv]VUl5ry:vG.d_ I%y#OyYwӛ~V;0\k"TS.yl%jiˋ`*)0~?up0zy^LIL'_G" 7 E9ñvڑTaE %H~+rw}Q(T@鿲@{q ҃w`7 7ڰ!l!!ϑXߡk_!tpA0~x ¢q{.%I I>1d>˚GGCs=5ŞiR!]?q(\i\"3"(=h*H}D~Z/ y1@̕fʍfcb;2 ZvyZđV"q -Vh|!:L# VQ4\E(QoV-|ј HAmO e1*m4ѪײFrdʳ?Z5sQ2?q$:]E~Ov.X5 h孔Rd~s0 dx$,б0[*,SaXe7̳֬jk鏵_tE-1%i,[o`މIXʼFAE}J܏/| +NiOpmn;$hUCunpAAb&Mu\KF{lPBE9W6"[)TC`jzZ'*[3ֲsVOGa>0GteaK.p/u8r`|L3]Cq^(! yi5ߡʀa8]裚&(9#@6_[d5Ç_-swTX.U%o~iaݵz4m1 Ny}'G޵HM&AʀqQG^s5?['HsX1칆4ϓ|Pڋ WOWB+ fTd'4 qUBL̺$KP~@Nt]n[{i_Kr>h] kP~Hd@{ C!_[*rʚP!ڗB. @DixAɈ#̟O>([c( q53myE2'OًfXHeQ7&HeqיQN~G^C&1? =A3a'GS}5w@ٖհNaҩe ++~~67A+S'+HVX m6E3 cACzS­ }elaC&/O02fxs?e}]ռo)j.dȞFnaqfX6[=qP :"N\?`[c: ׮bMO0KLexVP<{5Fg BVH%3Ws1g%q4B%8??zf?g=sܲ+|pꮈApRFMwIkp3HdP4E񨶆|="뒒s{6-_G+uk|Ra>6G)߅QEcȩ-Ak)'HH.t $&gV )2OK;P|CIM_I]V.aD\"?nZP*+I+'֫ $-9;דs4Hzʅp*1'NL:;}VV"5+3b\(Bgq)17>,*YҜ;*5Jm`fcf6Y-R#> I^exkBgrab{Rh~.ԅƺM(P Qu SA|EЇx(t Hv 3zo8׬Vc#t~[Dy-_cOFS@ٜH=n>VM ~$)6zOi0RJ>Zn?oi"/,,) 6h)bP2)AҺ/tt2 pK*?>YLLORk̩eÖTrTELS dkM)1sw`pԃDd7䊅|i0Əy֢4e >t" 8I.N1 hYb"Vn\b*x "W~نdxj; C\jmN3dA2_urJ%.-'x){c ;%$c&}LDғ$M_Eϥ"OhR>l:ƅ揰=&M#BیgQ"ɃE(OɸhS%"Qrc^uxUIE^ yMmXo 1fW=3fEOh=ǀMmQDK_2K,x]m"[(_v_ DS$P+AWW˵;b&2SghŠd^MX|g v[O'nk=r$|ٝWVl$kOzTԋK$0a医(4@ެI;I񫈟,O$P;Ew>h˲'֣!kl|H]׮/\:0jşVi}߉Cft 'Ӷ'81íkEܗ-=m{ ydޕY5{y>PP'I0j8,I.4 5,E$3;VG<+N:L҇ Q '1Cչ'n~PBA,jQ;x4Ŷ p0\k0r,/_m7twJr׬ S͞nmԏhzL)QqNL__5Ҙ#_z%DGԹ!ؒs-(icBQB4dXՏ̝4rе]*@u*z; -[_6zyaCI٧}~GD.4#/4s8dX~}y![8zab)R Q'M(iIoew<}rI9 /#\&Yp'f-$d)#q{{x@IG4!5RU.%ũM@jUXݗK}>PJ:{  vZUN9c_Ρjу&{PCR9_į0y#7]u"*XVߞ&5"Ѯ )軿'Nq|^ _ m4o8LN2?cTD$Q,5c#"PGdN,Ŧ0!uj@D>E{E7ӿ;:10FG(o׈7F SQ:K91ZT<]# zд%.ep aQXBPE4z4w&Ui՟(0Gn9Dt]@H "l~{QLwH Lqh݂CX-ADEɅ!ƟBUᖬqP6[/:q9b|t97(x6_Ƣbo僴:5_rV ,`IBf`->XnڄJP Ǧ1W5췔hX#Ey^94,.[c9J!+TMOGckE'2ƃQ#IPͯ:"ލn\J4ݰT9 @4mt( kߗC'Cbddޟ+5¯HO0\J]nQCK_16jS+ i8om/>بSs }`\mDjh?u(3$FG*:q^JF9#7oQx=릨#* 賅ŋ¶dL)Y)xٚt޵^ Bޔ1*x(l<ʑ)O@\Grs|Ԕ,xa"M]yH=b׵q$#vgEj\SPs8o"8b[{LշZ$3C/_!\ q,47%!J9?5v1DK51 ^8ؠ阵 `EWg~s4ƮAΗe],0B VMɘyktsYb`z%3ua ڮ2;=pͼ?DYI$mokGuGVe*?@bgR6yuWR'%ۨbUgv,[bEpate A*T_; #77i Lz]CDٔ\P8]u-Ɔ[.B8~ie i}զ*}dT9 EnMcL]x?C_Q^ HKU74te:v闺Cm XD✑`#rElNթܙ!24jXU2v:'wZAܜ ecIgbjڹMIǾ\uF|Os=င۪} )ZLAAw܃={'pZZL('$Q`Oed%SGPŹzRGn Con4'Џ$A_fUnȑa;}B"CԟɝPcę℩Fu]1n`0^Z U5ȿ$mt d;=݆0RitR_cD *M'{<E#o~vNS}]73: p #fph VRIKxPVlg ˶rYx팲/i_Rf@ߕk*dPq_xT'\Z:$>EᄘTNb ]D({tK.vPlksp`PV fYNX),G1bѕnG-*ux򫬅3CρuW}K_B }v&(0j&jQ7qwUϒ u4Dk:F%Hsc.SܴGvԤ^:CQ0MC۵Vzw&H@Gt9iŮ鸠ˣ4HdOwG%3E9R&9b1Ǯ*\޲EhImtoB[ǽU`a:MN[GCtu9H<$7ep5*OUsS!{msC 9 ]D`7 /{Nrimc<}Ì g Q]ھ{~?Wy;/†\zu?T9}^3?u2#IJ~A+~?R${c j;t s4 \-ZE\?[bp_?f3PiG4RͲOs$JWIgi'nc,1"S&RВJlHT!oؠ 5V(7I†R0_N h=؇1Q9l~ 7d҅24*1k%b2w4Ծ r$X)\H!s|4T;KJ!kQ\!T$X@{b)SXc֘:@˝~t I1M{v("xl/e7=j⒢qC;Nf@\5US<5Hڝa2')%BI>11,G9A`n{(TVASG^|$GdJՉ9"ac@|;Yjʈ mFq|.LJ()bt$Aw @v~Uk+TqF^knM߽GXRR&DɦS3ajw5혢sC1IvߌТ Elpijٹhu K[!P5ڠ*2Qz1*0rNѪy8"Wg#P;zA&d>C:s:tHBwV>2!_fax.<,- 3,נ&e尷6ݗU^%KfD@65͉ *?=?m*<ܢ8m.WÉt7tsFd6=kр<+7&H9` ωXN2_-s7=`aRT[ g T;+ܓ_}wKHBVe  qE$W?@Y\L5}<`Jݛes 2-tşӰpYywpք? 'pHk?|!مp4tPnMȶar#<&-Mo.߉ >Foyjl-NXecsq-Uo RH|N6Ja[QshvkI fLDa5຅>u`4v%e~oYtTA#|o,B/Ku۰cE\wmr-((3!;ˏ=Fٯ1 VS&% K 4X;]Y9\+O3P2:F׆I,D_'!wS-Sc0ӛO* (hU#$Y:Xߧ."?hwW,z 6nSŃ[X!P(1ixի˧l8NM;wxpk_.%KWVT*Kֈ-a|ZJ?E[oi@Zu⫷qo#z7J@" \(4RD"!30l1 3}I|+i|W OrF2dhìoqx4hyY f nwѸ-TZS-)"FLc7'.Bƥ 1\QhP6g&e߸J-c$ pȫLT&uO@.@enu @:l˻5k򰪊>`]Xє&Wv-N”a?:KYE'I^i-YOn358Ok6v ޫnC`b$ nƭT^2Vpe,,(7PN 9oqh4CfDN+ܻ#Sb=.DJOOpAS/O3 :o^-=C Y[.lS p*}RaX8sqz%6*Z%UW#!3y} @BR<V%Cá$A5H;5*&iisv*Ft]dc5X-~J.RQڜչKSDPvZ{*GHi1N%0au /|9$%Z\e96-,= ?Soü¹\y!kO' HKA}QiR6?1ӹR#)Œ g@I;~}^ ?٫z1+Rx [yGي!WI LN0YDR;](xqv 2震aDױ\1ٳ RF`FjB' *TC̕d\b*<2'  QMަl >11&eG׋,$<+策 n*N[^8:L=;vc,l6]aL2MpFSt8h{XR0t&{"ɜкʵl5:_FWDrP8Es;D~D)Bo+WBlF+0kE_ L|#WS㴣PPhc"l|x.zQbdTR]`4D8lp4Ycg¤,!\zSaa|LF#׷yFIt[HOVZe'[Ah /zWvzeoqOL,tz.i9Yx]hv>B;X]7D E 3 JN_|[P%y."tm+%^'㻂 B)Yjmz=PW'3pz Z8vnSFOdpI8C!M4i<Ӡ٭z_|^uJlҵ?J$IqlB|-5XtgZ;ӏG Cv;SIb03ctNYOcnΣr&_R۞ܱY9FG;\T{.Cu =i  )"YI[pu\,ؔT|w.|RIqڳCiib5:bHBGa$Œhň"8gxѣ8wU{040-? ]^QGo 1U#A <9FUmL|vv,@@T=M sAߘ}z$GGݏñXO+phF:~t,b"k, dJg"B`;=n}鎀xLI"GďmbEsPsҌťf`/_ť"q&~e?5F^ada|>ɾFw77g.AF`7‚>2:jѮǥWF4ȵ@b m.Es_%.cՐERvLD/*6nMj@_Od6 B>(ɲFwe2TVЪYIa?-A=:ӾwCwm͎0Yd+i"9> Mw>8n()a`_I $ʦOHDMcZlˮa̳c.3fNxؔVRvRbܒoGO?3H 9N$oW͔-WJ#?@x-  ( 6|uқt3{t?P%W="Aq8w\a7h˄b&>ZX=8-鎯cßn0yFyձ>ks;}ZZlO7\89( AKjia^Q]&;tgu[+:TBwu{z; i eJ}9*JfoWk(>(к߾u.N b? jkt>5yHA<ыChl.mZv.auW(\Qڨ¾X!upadz,rR˾ܛqBXJ7&P3l~|"Aڷɳ) œ4yysjib6Qx]FPG9w.+ oEG|(grS ,@i)Q1uH*C6S I;j02:w{D #\2I(΍Y+4nQZܑhi~N? :Qp)½6a0YDzN޻hb}!( K-jP[e5yMy.0Au5oYU0M'l>вx7${#Dúf_.xNPshc./fs,?fyN¬}N29<*C2p~咄'60(h;$X-j찰85.Na0,`4-b(2N{Gԧ|3NުVAi[[my+Y`0xKY8$MKHS^,{.{Lv¡< $Jov7$zXE7va`OBlG+[ZV\[мۛU_-nxmNDF:}SwC266no |kB1$m<~)}[or&[_{DZ+ ހ w F+vbT*s@'{jwHFxݐhvNڊ"96'shq)E ZO͜KЏv}g8ȟrTUw ո"/=u#@QSUjsNgG-.MhB%pFTN,y@vQUq+AVt䩹;g̛ CS ُODXHvX~nHz|g\`d:Z:TAk#F!v8~gPVZ+jWya(Xy{HWM W-FG K$uR gT!C钙Ҹ  ))%q_jݯ$NK 3j>^tSq($~ e۾ 0V#~yoYipྎǫl~(ؾTVLoH4D` : v"&O)!Qݷyk&g-4We9iGiy6.Dos?g{R$u^j,PZen>PŁT!ߠϖͧ7r8l?~2ƿzl>CdG ,sn B \ emN8vg7]{V^JN#V!ʣȝ pŧIm# x,/}zlk;$Uh)(3qZj5g1[.Y_MEÏ3LuƽS2e0fc+"|j ֤̅KKlc&AMגOtw(2Oa_=e?nן` \䑇M.7nr͊7uze;N4ANpQ:Kθy@+#|G'PpKQ ԓ;Yo S4 d)A+ˊ@i,WstC ΉͺVRF#|MH <ˋ`iuȁHR>hVwMNn]ZYLd]نx ^q0V <L8-`" ]@@*.i tӨ?olƂ:l~.0;"P<ﯠi%bQ̴w}>aR3'~Cm;BP3U,7}Eʜi6Lԭ:1lκRG6nqUc9 >"ۙۘ.tdWTe<ܮwG*:-(!g" Of1dbETz({t*͂@)nOzH]Ww))뙓-bIipK'Ζ_Yyk  &d\MYE5Y.*=bfK\;OŔH3C J V )JBU.*}2@ߘMf궞L}!D3FtMNwOduʙ۠/_ȤkϵDf|æ(>Hˮh;Z~1 Vnkp 8sW,F[-Toe29N0 !m7RLpOU4A$FUm`wFkUfRՀTkhj(IKj E ӪsLa{2A W /qL&BDiODhݤlrX)LӆDiɃ%Bɸȃx/} k1s *EF.]RKߜ> -'[BFz`YHRR$G)mD<mfNkdи%,} R+8 0LE%isVrh%x\дZן0({[-CJ._`}6KvBY݃\9V^J X׼~"lc9,UIS3le",$D#Cd:r"Y0H7 dM]Y9_OX6FPn/WttaB$4]\sL6gPCnRw&.?}Џs-8}ތZ_w8grQ@`8Ւ`ʋ-zv$\,h5[t`e)%:Uxku5j8@WtW.k)G}z /y+sRҰHY%?=GMUUL)w rqo 4^&f΂lAܨ0!TDXB!I)AZlRgFIy>BhcAcLlMdbߴZ +Vg]D/$XkNTW[ ;7Qn (|oH5,_CzjN0:!y c}evS킅!M#܋]Ш1;*]2Cf̜F+f-?T(ngZ90r {V# _jFM^a_HCVjՆ ̴i`ə + ^ڭӛqj\~ꤛ! B +"a VBb6UehVtF!,Wbg$%`uϵ.֪v|+T90ncK_& e9lxtR~x@q-4i!/s㎬?Rk{dd~X6y!Mjsq.0"V +(ڝax[u!7D~LuH~?Ќďӫ@]SRoI}خ>^Da _MxB/G 5^ fjYI ,L`)ng~bfB|:kw&#"2 cI;XA j I"!NMqL~И=/#,,220ZbɊ6ф*%m vaad$e, F v e\hh5V@_]71X h"# |կ/+s<=Hmn0*hua3 ѻgYQed҉nFB|YG ~y H~BՋ$ů£AЏMl"+ lt܌xČ^{6^plK`Dp,'\O6]WcSC43COG N8qj/?$ iגyMn$JD7۫Pʛ71o2OtE{)xJɡCnå>O !bd'U*?Pq o~Vo{$o5-$85#ƩFػfvfHR8 4n(pl?M|bZսLRz}K_ op#6*_ފ'U!4@7ӻC_ C簤]F \R_<;_iG$(ۀPa/!@x5% %{YƗ1{W#^G✵.[dtH9jkT|ɦ#ʧ$-kCMdUL,zrQ]|)1^`ҴT:kQs`#eDGlgҁQ |.ݖJ??b+ibgCne YT Eƿ̂Mzt@食2 H@@-F+k`d՗Nώ$0yo8}`'[SR*Ywy_U@ ,o96gѴkoR)@GcUjA_A;H]ѧt~\x~獴u~6KOl$b ~zS\C&hLyҴpH,։-:J!\q[!Rѣ Ć5~šM8ŭBcyN3`d͋YZGvOGbv> eA.SfX^U|H0zi8EtHN4iz*n!٫b?Vڈ Bd֯Up*t>p^دGgY05xq lcn`a;4#u_# `usYaB08*qkfZ8S殜0{E,BKEbkFze kF.!dj " 2oۃ gtϑ\Kqٔ $yz ad #%oq%]u5,t(ܰ,A4`䵌GSUAuT7l ?-1Dw]v60N!4լ erױݫ&+5BR'cq,T 3vDwijCes.(<ͅ߈f䛍8DgzTNMRUs69~Y _\#)~,HJ-ak3Iw%=ǧax>֗o/tRY@"wURAXG ͦ'MnK#$ݏGO0$߮έEԍVj}rz5.ԗ"D*^Kp\^țGPX2e4Ev/nX< K(PH*2;/X߳*dNKGik^>y-~Ԇ"i[flNRi9pC.ҜSIL"K]݋+ %0U nTЩ~Z]Y{Yrn*QM{^S̉OUk\,"k^~#*-R#W݉u(.({ͨDXce:MH%Z / ZXF+*8Λ: #dxETF4+Mp-?|SC%{4kxՓrq6/lZdj(m|J=Q'v`ʟ&G2mT P)D[\SZ&uD ' J` 6+Is Rh?*mS+|>;n; ra. 3XB.aMcF܂끿ȇSc+/y+{axy|'=ɀRW=iT♈:F?އM"CČCD>Pپu*MVkcG1 $J[UOT1A$A "t+M2,Χ>ERLÇἻeLBRgѥyuC4= {oP÷exs3*(рI@.uKq!/D`}Ͷ^P? wkO CR鈝30rlaЖuQSlq%2e|<@`Sj]|-*J#aۤ@od 7EC=-b !"- 'a8댏9J[a|۞Zde/̔426{R@^j6;=&|_`,ݨSw f)O !X Zh`cRJT&ΈTs[4!񆈦0}i{PR`#fgZhP]ʘ0o.&LX;&;.? t>%,xzxPNԦ=$bDt\ vu4 VH& m?wH^7݅i鲉rY1 ,ÿfdOWQ) Z)6!3)Ny}ǹZQ4 i h<йy.]83&w( 7IjsM+_`n6}>q+Xd7 Rd6BKh#x)*rCN<<{9adTN@~43&O릞'eGvG.,±jrK u+~hi ջ';5B pzn)̾ 9#qW ɯSI&Y-S{ۉ<˒uDkwP;hTx{ȮG#T03}ծĐBP\ -Z$*O*UZbed0|lzhL.n'Eo­Q$2[mY9M+ᇽ'pWh( 8wolFThD^Ұ"O;JoJ"LϒLN.sչy!v4ʼFBɛ?-_Z]uό[^(Q[dA$BR/3sGg(ͳÓO6y:151ŨË5zD?&?g6x.xGg08H Jem.joqFm*t#$ըUz[`4& $P s"H@2ߥu' vI:2e 5`rJ.Ğړ@%̥W 5,50Ƶ g"JM]Mp׌ɷ6AKT}D|vJf~.cم46~`pqp^[oW=H/7 2IA ƐM|hSBJn J7:?BH9IBddbWih<3*0o+݋՛!2_Nˆ'K8 ~^tcKϏdr]xRm?j5' @ԛ!UYƬ|3 ;E&] $[dNzILoq(LR KnnTb'[;7>\F1\*#iđrz1\XyYIM^LY~M֡=Ԯ*zRYVR!8 }vXXnǞt}@@}cyw FWx]ʉkGs;i?4\t:gj47ۧʪ+(8vmF+ߋY0x=x|\ #v2&#&e6WY/8F)s*!… c-aYK8piQ+;V'Ob'}"Řk39}O7!Xp3iٝ4F Fm M>&v5vQ~sQZBG\";p?Lg$HۜO>$4y|jVZ!gbOx.f)hESW[V4C:+!u5h-oJI?5zYe{抆P|2.m޳v:h@F@@YoKz..آGpse/񂙬ZdEXe9QK4/0Doe϶_EB %'Q\' - ў I([Vea{y?|:1H s;q (8pM "^;d9*.vZ4\#n>(@8-:$˙ڦujAT#Hpv-q {C"j 2aI28UYF0S;^9[Sӧ r :n{v[X=(YQN{8J|^LF$;x%΁.0 CvC 0Wiʔϕgd꜎㛋M8l bx& +i_IwJ8cQ'fA(R*JdSB^1T@R+= `e=}݉F.X\I6z1Խ:巫\[`KFoUDuT;2ސ;yۜtlOE/7=6skWBS>v9qO.X{kGL5 ,Y.*N_~!<-:ˋpfTCa.f7\^Qk) Bf'w9z@&|NՉy Kn@Oѯ_z2ָHdgR\0KG BՍ\WZׅZa f̫XH/8'Л0A?LLƂ`*M/ݏi=*W(UF=7S})3FXf:ж˳o6mdPpE0nCQh@xҿVI\%bh Xjv +p?eE"dD}5#4ϐvqgG bzOHN2I@KVs @9j`\DU-1GA5J߆J񩢡X3ך(C~Ѕ)a$kkZRJRA}W xE_/IL:2it5!l-S"wA|ك r67q㚰x ]G>O@'&7|ctW!ܺ8 _aH| OQ;e=7rt9+rhزonMg#6)IvYP  ?׼inK.& h !WG2Uzt)b;|{GN?7&;ć Fr=FwB56QniZvVT Clҫ)E~`xkHjjEn\>Vf"a"omeݮ` dHb|0J$}z2N༦*q[q r[OSپh/C}8AH 6a6> s!0.<)M]5B\XS>ZQZ,b c%!#&oWʚg~MdϲzɥuSib'+8zӦ $lD 3&MtU6 qT\ǢI$,[ΫҨ ̨RiI$HE`<_C5v7B1YnnTq*hԂ ޺o) ''WC\'dN}C2`®x= THoU 3٨TnZ.[ozL&W9L >&{xSNF!#A5s{DE33|jDH 4-MWJO*y;19^J`kewN,\wsVVet$ )-QY%1%ޠf!/yZYu͎| y`4gSy`ɔ9êM4h h3dg" K#ȉ7bzx<)F6R` ?Hԩu h/k( | LN 4Ii\P^Q]0^By]%U7 B ZF#"w%+Y~޺:ƦƝ%K;$H=ob>&Z\4|,c6&ӛ>`B*PF7ZX:q-p^7D_kX:PCDkja(}`4,d?yݴ?Iߎ\Dv|ZRf[+ڐP*uxdMT]'8] g?A&WoRnKϰg3>~4@diuތ@[Wha"3% ǭRL&H @2VMn4pTţ4;IZ-[m̆ȉpHKQ+U?KuYF7Q%4);DT:3Ɵځho.5zK,CYdi 1)(NV^9VKCDeǰ:S58V`t|e굙|&S2ҽ5iU3Tcy.goiFܠi / &8~wVc*UR դ7 s@iRz^=oG]Px ,d[+#)(Zg%C]<ڋ:Y\3=[4, copx AtiN9 Cٓ(\|wZ#3uy{!ҀqƵdvr@46f`qgEySbqD v܂Q0!*]"m9 zvdžMdIvJ){B7𺃿Kozm8g #DYdim"nT܂B5fӍO! Zd#>&):s<lH_B- RFLzb2Ȅyp=͍/H M0cVƨC o6:J޽ҔfƐ~K >)Y?=eERCHظ S?q﹤D@XhI &Icov\5{<ؔΎ]K>U3+S)c<ܴ 1 fLEv+c/\UjՄvOӐH7g e^V8[2m0|2NB/7vW^\Ðtʌ<{4o2"1|Т`jO%:%1ǥD䖙 0E9?X*?.66o& RaA!5 (IRsc{ڥ7$ww9+4 ,aëuQl4,T.\`ȹnor _,.̞zUEk_7'Mxvf֘RMf^S+ɾ vV?zj5T>(rX-hxRc m 9t=4K}tJױ.f=ه1d]1Cv,"jyf*>C٧VG$vTN.{yA `T g>L_lhJP fd,u1BXI )F")Ld _yi(*٤?q]>cP:$Р c|*&M.. -,Śt[Fr*( >@wqUuL:$ f@4Z~3>qge fGGN/2 aOͫހI5m8OFa,R"]Z%)-?d.iyTBPODȐkW_|WJ6(Ruތ Cp ɋs|3V5"I;E1Ek9I xC"kR@{OI(Drqd< Ǹ>g(8ɶ2@RӤHnNDK4k9z21&i)ӊwB>*@yq"=uuyLkZ FOށt}U8)@0k\W؄./qEPQm|MGQqou]ct9d mwS~}P.R\R7&`LxO@ 1xgΡY"Li ~bc_Y_3N;Kkmd(@[uEM%(E2(+JKBrb$#2q>g]1gl2caiW@-t/hHT8#cNKuX16ށ-<? 1 ;l-wawJ֘ 0*j", PXFys?aTA| j&ͯkTxp OsXYU/la  QK f{mׯ~}ZqϏXa2 $p4鈋fnNG;54 V?=ͼU%@ ӳ5%*aey$ v;WNoD2@קDI ⧶-̖'cFPqzl g$H"`;kWKm;#(c7se_"@?2Hg7}'C 0@yZit^LUdLkEgSp7Jh){SblY ,8pD eiTE](XU03=oC-oOX^u،"vēcn/DqC#5?ygZ{SB&&{$&ӎi-P$<[jU".Ѩ+UV#V!^'gCcӴqxuXfI*]v/fWn$Vr#:㊳ 5^Hrp=ghӊn=?0wi?s 3ɀԯ"dًCӧ~ՄW:8 i\ `D&` 0Y ) GTXbfXg*Ҹٵs !es(o;6Ϡe\yHIZ -=`{KA>a]v&WVAS6hoٝ![yf젲]8 L:,{&ɫ7,T;)"g22A( !A*LSիsQ2?ٖnx|e]mb:!M1%2wRP62ݖג oߣzS8`z$^!?pDӠf$FMEJ=Ҭ-oQp<2M4À 2V? fOaOj5dP(^V `3)?Eew4.S;y/<<ʑ1uEw5:V.2C^---3  zZ*Sd,F|Ώ,/~BcVn_H* ;r'gEv#7A +8?B}ĽLϱ#]4=k v;=Ǿ'Lg%4"0\;!v 8q 1-v I5a?g[aTVXxH/ ^y#d"e+N,JJT|lfڮid|ԉm=BTXkWe-e[b!fb_ołcz7:L~$])\yz NRޣ7RX V K+)Vq_ʲ}_|n.OZ?{Ν/YrwhF듔~]<+Zu>4T2WګQkBԵo{+Jlu]GeMk4ģH#[d9jWˣhJ̲Z?f# (IC7;Am+D0h,nf rpk@.UÓ, :'Rno _VګoO4!mv'HTRJ/t/`Rj4RlQ-IM$KXLTJS~jA9T]*jX[~4Ȋ.zt`d.Yʕ-R5Aйtt;y"տ <bqh`-2L=&D';Ea>Dr %Tb="gWZ@LJM<wg >k{a$] '#NK q_x2᡾U-kaۤ/ii40 $_ZB=ϓ0Z@SK̈́!J:Sne#G8B,u}j."*Gd]8nzK\!1yNo|r[\ 4k* )\UIZ,}:񱎽DGduE16w3+_QWkz&$Mu VM(UEהTeVqEWxc3Mu{lǃBj(Z>8і&njB7L'n%ٕɘy\ Lz!"4xh;?*u[i Mwng-QǟmXUg0aڑbt=jw4@FNm]OtQ=gϗeXZ^rR9AxW\\NrTYFy? D39B5#rO$sNjv!j! ւMolC6M)t]Ȓao>B0nt8\X?}Feyۊp?Hr3ɄqͼAuU&?^=ǎeBC)"1O`;a?P?v=SJd)DʙzǮײNK01u]UҖ~\ 'zSװY & zSp 1ءo$*ow?hmT΢68g˧iRS G*̑p{CD> e+ P}?!j9z n=;~ctb{K̘hUauE2kiN@&ӱ5"Qќ=^V]YTp}t[ڄ- MHJÝ/ :2RTI+SK 0Τx %7eCw QQ;|#3hf8z%- rJtyd*b5aza}g5 \#/=0Yad'7k]6 MLbtf48v|`M+P !~pΑ(Yꖄ-F@؏|ĥ2'61(H#7ڑA-L-LJ=KT4<@yANΰnt٧`nNǭ#x;[bM&w*?v(@1an;w M}\k j@ªTjĂXbŅXli]itSDg,?7IHVqkf^G@M"%CNguDdO#<3&Zj ߲gt[qŻ2S حNEA@bn17Ncj)؈"Fo![Xh*u m!*X656DXk a[n_bawGl7'w7ZA\İkJaԔuwف6b Ƴm0eRM(R?Ց>^0š96ۏ83b1|ບ8`.frj4z q?eDM:|~I4ٖP<1(b-2>=:^ DKMcf"D܆"jnfzMnf8+æSp~Ptȕ+P_*Ul|XD";\~083=X[mML-Q޵8XwbTE1So)3 j, )00AN"&4v-9V1ښry ^en>pJ!]L0؛Ld9 XښÅ }GX#ܾy߯=}]ำDkID\G%o<"y"⭏>y79~x _E97'*'0>Tcw uj#LǬc k"’LDMo ^nGSgKYtM`.eEwePQ-!F FBk0.oӃLysKy]&D N`ɫ'YTVozFaK*qܙ /JҪ5h87vW1K}Or"н3n(F:8۠{Ò}8^BYUѿ6q0|דl3DŽ%㍒I4J*Bԟa>V߁jqR {SJ=,+W1FՈddyèqV]vST$-`@s Bi_{ Bלa| Br"; c,#DZu_.ڠ[-9HdGp%Zb$qҒ}J&IWm]D m}SE{ N_ r7U 43 @5ˡS5a܆*4u}A7` _,n(FԞc>C`/rō)FxCl7gR0֍p,a@rK?:VE5GR+ͿlH"/=i/gzl$;C5Olp%fNc4̓Hq#I(ƍ\m#?`!s.J!aVXZ64g<.'8Bny=6ğ%*5@7/,[M$A T/ MYP9iJ1H>d&<ηȜ`>XY8)L%fuyX+9?*-J_%Fl 2ŽI`u-}4Á e=.SG4! j6@WH()҇uҙO?S@-"@ԛ ľҐiR)JD#)2{Rk[iܯ _2Gd eЬ>գu pI䋅yK}ƺ-޲odqBǬ~L&L3/hb~xMt$)1nRJҧuhIߋ2ÉsVq=hDAC /#HAt S2QY I^p\wA&G)ޛg" qZ8tu,Q7ϼ 2>ߟPvJ{-O0>Vs+&}|ύf-=e/j!Ff0$([gnUu([>83I2=JC8TP$mv*Cn缛l:~4#cz r͔)IfA ^Y]>`fYWI:'~T^6ъgge\{C4'0|U˅V/"b&32H.GH~ljjVy-L8w~KtGo<ѹ~*$!~u L?З%';^\I $WB@ q*!تpS$"`ýzŒr^ͅ7z^o T$%J T 0I0䬬w?8ƌ",7zu[!pPGRֈlEG]sҦNz}!<͉cd[c 2@DW5 c.|"s==YYESbwy^/1&0F^[:-vZE00'O=^*H}-&|dĴ |g,GhUDSHe,1D?(R7DX^F'D">rЉ1.k^p13p 2Nʯ_#kx3u[i[?(r$i 7pU3![67ɶSӱ[-ɐ|ڄf\#F3 2Q׳'?2+yhp} Fp? EџwZdVD5ttc7ORem7X9 #bh!;fh@Q|ǥ-OM5рolsR^Hȋm|5"YCA RG|rG8* j`ar^R W10Ԛǁ#A) ̷ ¨o4#GnM\ sD]"DbTBR?3_ŕ xY%KG?Jϡ(>Mxʺ8EzLەC8; ?dլ" YJس2}m OjQeݓŦZC:YO¹QkK*M== e h-Sg g9LpDFb{T]>%_CW*o;pim}%_}"mIoB]E2D͎ 4J!`N?5K0{PCI1_g X8N-2V_> Gzψ=+ QL~潜ȋIF-03RCgq`* 9ro6U|VitĴE$E\FBI~[Զl],!d;vv{*f:bhk+RX`C3PĴO>\Mkz(hp' c\6juy30(12#rU.}BdOWmpyM57rE"#-JElx Q{7mi:lS8a[ AH%yX9~*[JQS6#`㖴`.jL-rGͨ~,OTNe _7&-~Gkqu.ߘ!^mLޒ4Az)'@ 1s_lQkuν]35~,laqˑF |/d=~{JɈ(> nvާkڽYG倨-O,yȺKBo@[՞y>AreH3[<3PE[Z)PsBwq[V1lp'KNrpJ/w$S[p8-xvXhtATWr!(j ~&j=^Hٽ!M󙋓/3ʖ&MWۡ GLF m>aYf'(KZ.ip. bW7Pd~/}Jߙ I+[`Uy4+ &mkC=mMwaKx Ƞ0[+fKt]+ýHG?V~_+VRjY)B\|r\ٴwSEĐ;Tf e,:>{衘IYASmMߝ]Gd 婑lOÇ x_#HqEh(Wyz.pR&ëʁ'ڏn wn. sWD*EFS%S91bdUҟI^ZvE/YXkSal[->ه.?`=xz}.ˣRObR8cR u4~מN Nw5f@[+d"/a^G8i (~IbSRƌUپ#VZ;†ɝas  ˙iz5f2MBLvFGNUgNGy:eb%DIP(oM" c[1ڔnÅxSuxDqM/2 -yW"NJiѿ_+Bt$8:b-ȹ+'p$fTNYn ^cn!qOfI{4t޽p537L@ڊV*n)a5dq Uϣm3&?ED9B*!kmfGwU8tI{PȄ,٥Gi4jc2k˛ZW Aoam͏F/E*N/U: <{&>~#TYy)3|6\9Tp,LTģ ut86t/SkyDeHGqb6i} >iֆFY>. ۿv]OR\7/⟘c@kls ͗8{<D:3L4ҦWȮ3қD)hb?]nw[r᪕3z;Zؔ?D܂irM |z"lF(CMWx2^}pJ'?v̴L]R*IƩ ,Q0"k||A7E,%|ȍykkϩCc<'&&ԭ DjhKpc3Z Ơ_8x",R\(vWk'Q8ΊQnmd4QrmO9- 10y8GL30 ~ՅAMuȌ K'Ay }T2cNJG73xA(EE$V`~WO !#l whV}792)O;v\9]Ih_}cgo4-M0W7;`k"Ppl .sXOrbz1nȳd+J[I s-^H7]g/'6!f,JϗMJẸC[h2\FI-kն򏏴 ^?tٰ (!Ee:oc⦷apYu~\e5(0Nyd dyB&΂X[뺗79{3M]r1׹NpCiBlE`heϿ_Q{$xtZX0J];o_?cҀ:)PTNI]U{^%5uAK ?;3"㱙&c:uOr>Zm|C S|(SEFv?+;1L\.פ:+BJ&Y# KGw;'}tʞ%Zo>crJ ]cj l=СmP%b(mp Cz ljIWF#~K%^?)tu,w>AZr'`2ڒ/u7f89:Đu;VS?]÷6[ 䒠Ugb܀u[WSH)4}D>jS>qSY6CRq|PJA0. E} =r3Mýq*=c`zE>sJ֑sQh^Y٣i!z,*X-jS_=3?ai=25㊸Z'PV1wj;c䕼=}B`~ע;2a{BgX^@ΉDyVйJ$B?Ӭa+-M^e*!yFk{X$KV+GC*8xrUEsf+Dž"&lڧTGž'ke/vCŗ"셸Ζ8Ցg 4R+w$S?)KHرx.C* |jC:m O^ (Z\s}Rm KE9ȮShRkm>%0R*iՓ)Qr5kq HEZ€4Sq,$>r Y1qWsIQF:I(d)*#VU 8uhn? Ϥo)@:eҩ9/i1ei9Pfd׻r;Vpq0Ɍf&=cy먄z:o"=$6=İ'ܽm!fKK#Un=鏒 1WG+[:@M-*ZCO{N5^E*&Q%`5wJ,"*E&@D?mX0`k'y'uA >(^х#㽱7 cѓ,w;z5踸P€/_I*ޭ+ʃ*9?/h/cs)PY/R%!h%֊:let@vCO[YС21\^P@Q@XYՈ%?(/MAֹoEٍ0Ɛ^n.Ĭ.%8̎zo TCvŔ4zW9goGzX{ 1ʨ%Mn]][K6lGd\$'4s ׌'Ƀc~ 51HIIO~!0y,XYP[].e9Ppxh(ukDa`:aUͲx%W[< ԗN8z v*};q!cmYKY q?Xwצ?=J'Sm៱rK4'Cا| 7 IIp1P];.dh}+ ?sxЍ~} &T'AR`l>l9f]g;0@~)SQUw98sY5[{ڷ}˛݊F LPPt(.cGúVqfܮq5.ۮ0rl^ѱ:F/WTZ.%*Nzfv}SmZ 9-HS je yLj _@0UQu*3TNmqVO 5 _0!ŧbm dº{sz`*}^]lBеٱ>l5̜1t|%N=!Aϝnhܦ>]3GC| ʔ{?e6w ?d+ /X%xo0g=L9sc\d&:D,N7GWIdSSo۩RqQyA!~)CΔh'gr>|1wZb2&Q.bO6%ۓQהzZ`Fh$s|6BS[]&Pl3ڪ-4-0F350f"^@nFHk@]#*?da[Y>mQ"`DE7႐&34w[gblݩq{fd2S3P:͢fCDXxI9K|gr{3JBN N"¥ΐ#ܓm&ǵ0F=$~ɄU o=Kı8ε1֡4|ddݦpQ!vQm3𗸺je@T%mcs鰍f22)oVeC[sv>P:ffISR(EHcը\K. SklÍe zc n!Geu%54.zR(ѧ'LqmM iHī=dįUh\X^jcqߠ++Þ֊;Lqӟΰ⏯"'Nd*r<*Q,Qc0e?%'Z\?q geUH]%GD즼\I&:mLMT&-E~1yfNR(Y}ڀBRR4*cuiPNKYz8*r-ܭSmۜ7䬷Oy͊xFHBg yr;]L 0п-Ӄ}aM˺֙NMLW{ f/xO'x`L tz4 `]!DǥU8 r+b}$;3eo0Dٗ[ R8j+"X^PeCa*YjU7}{j|cd j^z!qP^>s"(80VCASf"":N^ݛ=#[1jD#& ck%1;CAɭuqGZsS#MypkP d%CM6U8IXƱ4?xRޱ?M%*b1xOt>[i*-v$]wIm}2! p],sZ{[xati7pL{K6',+ 0;v~مQL~c%P&ƼtiFRU<`~:5菭ԣV|'hďM~>"4;]᷉S΁)hBc pZ; eorD=8{JV~ Pd ~;جF=섆(Čd)<%Oؼ |y[Ry|1 eztRMJcrޓ" X(1^E< čwVC68' "7OOV!_ zMB$ҋ>9v,*CEWj{L/ySO_[2TՋ+rP~+f+9S׍(zއmRK֊Q0>![Uzr*~/[G5Z[pY&'C#d=R|R-!'t'>i\OVZRoꂝ{8-T+7Jud:Yɗw)Lz&9  xf crHYP8rכˆOK$r^Xu>x7 i@q>=NN,T]y$3쓔nN/ҙLf*'2ϪM 2aכHǨ&O:U1& k",-54%>L+OHPAn3ME@ħԴĐ0N^:*īu Z/nI".;ǻNn쳢(z9}]]0Hyq>ɽ-jA noh턿#H9 8gw><bOwSj(LPnRku@f\ ][͚]']{qd.= ]4GRZS*W[v,*m0- 9tӑplѴӔҀhP5%Ggc$S. "W Fqs5aPe*;x@7oE]{|HXw/Ѵ O@FDؕ-JܱB6>L3oB$F wk#Q~Y0-"!yf|@fQ'C{d4nQoc";G ozy (𝓣'#[cBSo7Y+ E$+dm0n_T&Æ SFgyTˠ ='D-`G;T:>P:lÆ0d9RXtYr7hFoIC.3Os;MBJFw?A:lïˋTxI*z[bNDZ於N Z:IsR.WJTs#:d+ލs1S.EÖbڕ}ac))߳(  u(  #kĹ䵆b> cm )XDPlM2nlXMBT '߈,fp`8Ǽ 9zTcv YdD&=gxcy~i s aYVT6+4ܳݩA` ȅdTAc=r#$R#1H+/o=fRb8f<|l{, !AZ j!NG?)EDyo>Q3;I\ ^}Xɦ-ܛho1WbrOM/Z4OO[t})MȦYvĖ &/`!bwjkߪY^m;WtPTz}"@;YCE?d7mx[K#CkʜX%AekqMH.mL Y)_~ 2ly :W_U $Y,%}&j%+;]3%6o9o|]K=mFR  .؂(4Dcm >a0f0Q32 V}\r\&6֛"79jxrשV>@r-}^D VqݥAABF^CWu==m7ձ(0 ܾСȻg|ih)1`iЮ]K=:ui5iI. M")lѣn;~mp՘ic%!Fx_O3gӌab 0j~dEUNEi3%4ٲX+k]:kM4TE2l(ỻ,E16IHt?:NK2 7r_@]&;WzYBofl%ң$fHCլVJQ>m3U4'\=t<1B jk5#8Ⱦr5v ֎! O5Jm%¬B2WO?VTEEc>ؙz9'o*`m(fgh|<46! 1ٍd*/<Z2:ctʹceO"! ,"^GaT%L<}37߉ aҋR0økxkÙG{,sPV1jp%̜͐ߝ[x_6U8ddtgac!J eWmAhjyG\VE<+w$ȋ ["[]v+0O9sft"7q,y1 ]:9M؉:A;@<1qJZ NռU Rș=.3%,ufIj?uiAD%yfK6s= t4єB1ZsZN 7XfĜx= 5 4$Aݽk*cjuj| c`~35rs`vtzm, r>~Bgd4)/wӬEa#>N3Hb20HYDA`}W!6HqK *-!QPxNU>e1DDV 5ՉwFkry Ţ,)O7LGQ$>eqUƅD؏ 'i'f 4Іs _e#DD6OScO(Jql^Ҵ`C{& 5{t2.T\_đF|),ϲ }@pG|^Ķg"I7~謊#KAreծL:bVy-Ek/;Eio_Z28s4~_o@ċ9y?6 gvQDT=E4ۅx;Qԩܬcz'sm̙k.=8 2yV!xv=K^lm=~YK&h1@u=@V+1 ԑ<تD9%bfAVRkI]]. pӌBx¶_󁆧Y$&>J3 mvkhs?a>$-R'8Cm7K9sT=gq%xctw4t"Ε|lOЮ&kMEB3;6Y#6Xep6vuͲTҽg72\{ v:07)9d[.AS*e2</o]sW/Y*k+*eD[ƻW›VHwJ#8Sۆ6az`}@3#:w7Kz8H2NC3Yri aVg,YOS%6'7]0A baq#f)l v.~)9Q@mqpUݐώ'JniъFS8y3}<\y!C퇜X$!c 3YɹW y=gD..5 T{[5Pc!֘\f&J퇀z;1mϱhcq}e\m/"'T@H%Xks)BD0j?>aaD3;-qo$$e6~ܨo  SdOGaVnUJʳZoֺl$jlt_@9o.KW :χ=0Uܫ?*0olnD2w8O<:".tk?qk]ǃo{X{+\/&\ \?q1*;R6jT!I>ƶ`7"9*t?у/"s,$ ݎnNbG!l5N6"n5th$s_-o7;2>+G mJ7&85Y$CŠaҰbcCf`bOTNqEh5Í.PCb3Q<$Ŷn.8 ֜$u? {r ccR"5Em?;&ASz*QgBFWѷu~DK94FUJ⪁ QUzm)ܲl:> `(K.sN\Dٿ'7 O@GvJa H׹inW(Ltjx@dG&"`X"Q|K1Gc4p+3IF؊RyFI+@=FCe'j.͈[<\0+-Dpme|j/> ǔЎLob!7Pޑ~8mGID:؞7AZi3+(OBgkF5K 0{)"J?x%)L~E@v<^+WJ<ST^ 2E2HO~vU/p'50.nc*zng$!:GIH!hd,M>2n?&֌! V)6*x*pR\a< VkIK:H7ڔWەf7ɺwڝ =Q͆Ho53'[PMݾ" |ݨk$qf`%oaU6@nC +*ƯL(O'J||7 #i)"oK;f N he[W]s'/\]"ӷ=o07#H0$D8Mbu!A4lѕ6QK3,,=șe:5MHjWNIG L_C7 Lڪ; -ZeLJzŸ́9D^Q0k*>DK)Н2*K~q`t%d_HL~x,LJs2v,vP~i8v#(tIbV1JK(Hqi ?zwЙ VWE8 AfD>S|ln {:,8cMROwSܣ3I='&^N[`׮drfCڊ#VYzRPxT(!'_+ЮyqSkC` { I=e.'5ښءJFKnx5IHQz_.p%& Z>l\&ҙpaߣE;=~ꇩ =tʉ3JQ44:jזl=+&7 MhoS:Z7#Y2*, l2^,Ŧ>%Ů~>9^V-93g+%VzsC+e[nY79d}cnjR*+XYdG_-N^J{Ec(L9$&#VoX^nu!Q&vV˛a zϴzZݖ8bFg +5iۏ)>Mq=ZӖ>ٻt?`'U^NBP}ݭpwMgZQ0-tecK}E@f6YVHDZɆ_f̘Eb:7SGl7\d*ҜIsj(ONP>M4w\p-$ITn_Sbz!O{L>4ѝ@қ#s]eHso=-Pf=+ScDA~Kly >-ܲ 786k}ۈx"CLgSRWۥ|bLy[©: R:>0{&9P0ZI='Bau6R_pcwk!,YlgSX̠)p?qdsY]-=giwښk:HG|dIlwʩ2WE6Lխa*/3dy8!MR8kd ?1/hz4P$,O$gϲChE#uF-&!:ͰwgzmB P4og SH&Ab~_w]21t([hZJ2/26\4/A E⎟4 4v|?(l  }BUL Do6c-,fW` l˚#h@_,)@ALމ= {fN'V XHEfr,תqg.53A~ .L5ZX `^'*\|[HycJ$x0L̐X_X3m=_ÊǵԶ ֭yY%?&P.l+(#K%ܲ>n쳮m[-Ɣq.MAֹJhpwkANITv=WݩU6øb6U#<5k^i Vs֧A x'pEZw~4Jㄺ|–PrԀGGBh 510i3uJ˼@+T;JeyIҐ$/SK`zeqƝ&zul_Yxu!Ryq, hxeI؈B46_$hμ /ѪyrOTL")޴6n_kɛ{p)4.5y`9mi"cuyrSI1vB1!ENٶ- A)NFCzX?7(B~9$bNYMM=z-(0\eH'=-_+Kt:i"8 pЗA{ -&=Uay0bM_ӹ l9T Яt9 A9!{zUԓ^~Pb?4c%[% I*j~ #!ZOG?o`Uה7',.v% oK>/;:zC(kINL9Ë s?TBIo͜r^8ċKF>!nQM- bj>_l'eBh|JksT-q~8|↋>Dؑ"xmȀ: 5Ju'k(iU⛾@ذ%JN/F`0<1R+m7Y|M0e4iLhғ1xh)`oSvEzYi?qD%h;G2W7=ehnvá*c;}L7M0DS[D.M-aǫ6v7vIq"h½;}S8;9}#ATܧ=ddUXMWvt$Z~O7?u܌R ji>&J5@ uߦ>CSP ķ2yn&-@4 rߟ3 FAZ=pfV;$?@(p,LDaefnAQ&^vKVMxFٌTj2h^Ȫw螰L8ʑXb&jx \9ң6f AS8QCjњJ 170TŎ6F[@hW,3u5k ؀r3 B nlW*\"?̓(r8ɲ&ys:w-,6r$6 mjAs='MΓdž2}։qM /6 ĩ_ ]:[i7A7O H3ƚH-.r}*`됂[^u Ox,]ZRIR6߆ :2*#B[{ u{PjiLE%}1_m`XU nWm6*ړU͌_}ӦpN~@Wz&n}#>릢ӸN&N:dLN6-U3 ((0nQ~>#:H39I,3^7US:J`j.v'Sc eP|ByQZ/g |ǥ}Hk ݖrfz2 |cn[ YU(SXxb^43o6Tw-4wu4S[` >ehOTg7e'}|@g6W]gG"zvwŔfo -\HnZlcFj_토(3u$)Mz9wb='*dD:ȉ(FUQ59.bZst5~phj ^'q:VC{,OЎ/KxfmыC2Z6eTܨI<ֱe'q O4\ @Xp"iqL=v9a1XqގunF.W(] Gm)3]"vxᎂ<=mtf; E`%JN]F|KO)OpkFS⼤ L>;?3~oE-S-mQ*S;Z+A6k?zvHH|I=Jr\ D[I wUI8[KK0i,F-)d'h!^hWU ͛)DN&~1ÉP`aC|dݣ '9ɦ EXaRW^4@=v:ni"CɱPB X P/F^&'=peIgpHJXxy2O Jf*#f4evhO.Ϸatq$'> {=LƠo\$a95PK芅~7͔%S8'_ML4?C`(DT?jS =7%E"yYGdG%#&$6f 넧#mb]ITMq8b SE%yRqI. ,ZMP0i`LIf<3[).a'J žKj4IBf(ϧe&IFoW"3tU JLV,-L_ Ud6`np{ Wt@2׳S19J:dՑ dlm;ڕh<. mumҖ<z#Lr/=o=ڊiQrȺr=?P-#RLgQT!oc &Kf@kWM243jAZICSR؅(#gwP־JGJmQFȚse/Ki|`:Q˯9wWE?<^d OjA:ĶcҋFo NMW)l7.T;)KWOMOcDLKmB#_䟪 wiμz0ě/rKį_:=AKi=rԂ6oS%~zƫB!5B"$K\s*qN#<28!9nz>/G^ЀFaP tt1݃j !fi{Fosݳo0 ܷhGImV.Tf;zw:gRdbId?3'2O:6?/B昴D,W=*>C'fgc ?鿣Lʁ6ThOъUݕ'Ą?_۞q" {u'}G*RzgxޭP'NAzu ݠ Rci`|Y4QMEO9sCLY7^0^2F) R9Ʉ4fݼј8}{B!KOJ[M3!>hh]g h:9IhRM-Xd"'PپmBt϶Hq'k>ƹ'% ϼkm}=ս@0|E| 4X\6#BU:_\1L}=(P1iA 3Sk-q@Q=e*Ƹ;Su7n,6nf*)B>qSB|nlIlܭ} Zޛ:%ܩkkQM`o@<";BcuuNUa$-TJQg,ovr,EI$N6%.ZF<ʜ]/N<2ܦqZ܏B.6Q* G>^m*Ueԝ4ExD '(*fް[|,{״nn2E m/ %me6RtԐbil[QQDf@7,Sno@>K)*T:?l a,}8"IB\CDoq nqFI%¼M|i {;\F 旉뵱k- ~._[UM0\֍4DLohX?|vc^^>`BF¹1}ڱgiT^3w s­_Nզ| &,揄hgmjL(?r-iV<ψ_5[mOFL,YB_Qp.cQM {Ojz)^:O!S"t$1##m}N=T5/Hh7Q~D<\5%1b6㫸mhJ&{Nq)Pb0Eb-'VR.Vĉ7I>)6}F6w*E1'_ur ) QJQYB (sBxx&ϷZs3-[:血b kuč,͏Q)Kn _9䞇 H͹)kWpΓZ>kC">B׈ܖ*ȵT(뎃P, jVQ_<ڠD)P蘔8=`ݠ" En9a@XͅeH1]1c׍Y]~<]7v~S-FK{274k3#$`ti$q,3Z3Kpx߱CJ&`L`PaBGEJ1fZl'}Of!@j)jtijb_tףrm`MǢ"z=i>57 I&H#{nAoJ s?EotqM25b^C8e?vvaѮC$XOKs+#xJ7t&c!f%mզB/67@]hg~j Rʭ0dg+44zg諁]x:П?3ntWenXP\l'.հA˶&c;oh3JIJj0P/0>lsMvɱi*Zy6Ɛ.hKZL"oA/E Cn;7w;쁾P RJo*5Irթlyyi<#A!SR^,R|Y8zو חcF3%A'!숾Xی5+ټ8N$aw+Yu[S;!;:Z5 Οv~EbfFj#hg]\w. Z$a Cd(eg#3v70w]t$ͶULS68b~p"~ͯ-`f?f/DE2i.8 _$b̦uxF4DB7 /uu:j> c2${tlb UlJBy>@09JxoQbZNJB̜IMh\Mqc!f^?.Rc1#MXp')G/)V``I6=Jۃ9AAg (ۂb4%͕ˤ/F %/?A$kG7MUObX5Gt. 紕@ۻޜTzH^WRUGxs !DIX%Tޱ"ZӿGU(F΢{Q>_B$5;}ldˊzOFS* &zUk]-!`EFMkِ+rBOoήw@o`j&aUά~fΣaF| /p;g޳ϋ%٠K{NanaK lgPzsi޾{7OnvgWk+DрP^4@ܗ:E.'q›Ҿ by7ZI Ko-v^ցI8+a%LYKv0nլ7û[tucq57`?Y/kؤxœ"!&x{I-xQ!}P|r^7^\4F L`yv 4FuB•Kp F*zyx.im@NoG{n#wWjl^iҮf*z3ZYpx| (մ.TĖk/!<3oe ZWGZ~z%ELǟ~'oO 6v>/sʊ \~MsM`%w.ć'u :ܑWB}n䴞]\rt o4$L˝!и{ I!Z)M<(ZSO+nYXuf%W0̵LM.B>޲Hj(ud)T#3 +<{ Qjg; fYEsm=TMt[LRdaC.*cλdnzVsʻ~PA:j ރwe2Ý&*"iFXbgp /0܊C,(hł,$N m XPKuLd8n,=\KEeG "h݋RģT+Rao%zȞ ,k%);63*%p6L|VHQK_@2&ej%gx|ǽPjo殣r yB8Qԩ IDsyIrKU`R*dԒ1%|kE/PJSOsf}+ "ުpMa:v `-^ݖK̚eF9/zS~? p/\lNwF rm=N}?'dn\1ڝ'Ubح(i5$b9D𔊀^AE ~)m=}fY*2ʧlyKL3P,. jRޏrim )TFjȿ睄ylD%ZR8vLrM8QXa]̇H́Id7]Q~ Y R-{lH".m 1[/pH"f ~l /Bd G+ze5i곮4=ԟfa(l HH9iC~^,R۵ T,"m[ǗD<vdqY%oƧ-03=J٩\R,%6m8qEX0~QNFIRMrhKEcsHuS$׿]Uϓ7Z>5`CpHxŷ|Nӓ7k^ C.s\1Wٜ_0}}udjgk)W*v9U… 1C{C?'?TI&TWp dwºh>B7d:3 p&*e r`۫P))-LAG=CdI6!`?贗Xek^9=:u-\,)]'uӔm(3=y֮j<ÉJC/#!R%7RqjrLIdav sc-2b%_NE+$̫wjYsH;?ˉMcW|Uă-Q08[G )tRy1XURLu-&XƳh)Ti ^VKLL8zDsTdMr1,{#|hj KuFpnNB' #̎-x?KӀ}'(Ê=M;4rDKL[Kx>a&"|!Lv%D6 ;%kNoQ]&MLyt!N C ܣQtGyTd{B1X* hv鬌¦P޶NL/v/\jXwVKqS,ǒi=Y%2E5*lmt;:&y ^(Ĵl,w^> g9]'?[^R Xfy<ڧ^a`A9{{NxG\ok*WGnZnAGnrl-1VŊAf|< Pr JoGv1@c'i~PKᯉ\N@?ŏrGaFrnUvE<hn >Of;aW^NMMG6%7 \Ep=ߞڒU$(KNS32^z3q}Hϴ{j%k Y%$Ct43 )4ć<*ʳ+6Lx -m"4mX8Fn8s% %,=[#Yv7PhBг JBS#k*MØŷszfUjK͹@G*.I"@PmXf:Z\֦KI x\e2NpO&ڠJr_ؒ@vWo5nl$iw1g5K>,ƫpFх+CG\)L* kh fuY|cNI j>4g*+ܬt7wbƜ]l*G/xscCڏgϷ:M_G&/W{vv^ғ[w]"mO;sL*{ I,0CϢo7k{\8gk~Ԉ|h8` RbXK$vFccG9LD0$<8f o/9^sf& 8}_Ȇpg6nTGAY; P <8Ki|<ԆݷRCvvS gq!WOy}xz)(zv I4Oz\}>fޜdF~[X !]$TŃ+>Fa_)y?܃ԕՄW>tXs/U'Wg?}Qhv"wTmR~$,EnX{GJ$OI̜Nr]p~q4iw$"ufkjqu12BsܭK_s°C-Kc&ю>r8 NJҢ Q Ĺm lkqsS f'U6Гl0 C]l֏Ko>$ ʭu+\SɏS(rȬ?|'@8IR6dZ"|*pN!:0P"To\̚1[1>ϋ"}M49]|c[u V-3]lu-73|ib.bpIkyE:j.^#cbT#|0\oO,|1YxM:E=ŁjO DVgB,I_B+-&2bQK6Olfn,Khŭkn uMr4БYv |z?(9,9+֒wp96J1J_RD+|R1sW;ɍOѵ3ba#XIQPe --bY }q[s^o.=<^Fʳ}r | 4)t'qyKp-zy9:" X;3vG#.&yZrq*ժz#U[BgZt [z9or2[Ihfulm;1Xln9bæn\_쎔 $E|TؙI dS3I,DổUnzN|Xsc%+T{GA/2&D>}w숱k]8\O p[J¿́kQ~ROrg~ LZ P$ 9령|G7@wŀU3:ҕjyU؟#6SArH-QN᢮$Nwr 'Jv/C\/Q~қ&Wo\VΧSȋ.P{ &'f86(@f !G:@{4\ A+')\JD?PG ҌS<0R+VVnf;u$` Agk]V|{>Y-bC{{C RЌzxMk<: QѸ;^'guHknӔ|t>tcG(&GS&rC-?(9G  ʴPN8[e.4nrfz>[_$\/\Ai}):נ3Ě7e x!M3B+(vpV=7$[]ϯڦx[4?v3!ʆ!ڿ9]m4G6Qy.!6DSWd/V6zE&wCΡ| IC$ܪe!'zBhavk;h̹(C$7.5oTC`Gi@$;qy`v`ԼWԤ,<01^̻ʾ{EI!Y}w"h*< W$6S۷-|??dx#Z-+]Ca (':,nO2-w"ܩCbu|2>^Ӱn׍tZqo\T_]aE!hZaxkIA*YS0yђET+B[-F.ϧrp GlDxz)M=@Mu6No";U2Qli5ɢ!\[m ̰vlvE`FpiUeM=:^ y,/}=OesS_rc _eGڍ !UkcwX˖ a2+eN?@D}a n 0(i@pP\eJ~auR J@,Xn)@_|D G/BxLWTC@5ÐnET;ؘe[_SO&Q>m+'j SV?%@9LC=p͍G]Xxl ZwMsj gGFK i9*/LA cB1(wUz~!嵑-nz2.ex;Bu ֬.&|dڵ&9EWj~LL۴F1jA$xRN-g偐#|A*jeDn4ٜ>? X 靚$~$.Ku+ib@W+6zr7t>%hEpͥ}r; ̈ <36L;F4I`Et(4oQ{ &eu=,46=()E_9rc|:fY'nBW*O0ml hh o;ޮNt,w%Yxc"$`^K߼a0Rꐱڱ4D(K V#]d=9T:`ۛ0ugACa[˜s+ +Ա89/koE͌/y<D)Sl=BX^nVbEH,<9,Weҿ (DL0!I z\|fFRIcuA*F(p@q 7}ch =9 )[>U! P{d/<\% ^Ŋ]Gzm?9V%^CQ@TЊg(1zH!u7URR7U'=~҃ 0B;V:7aKn 7*|k/tXbS3 `5r|G%(0lx$ aQfQijmUho/e`ȴ>+O#p*\4BqP|S {HTxQ m`Vse Q-ZUMS@+6@URㆎV>elA!.!&/,v7GR E%^ULZ# rV)۴RŌם@O=Z=P ςG;dA5vӿ7=OZ+GkURǙ_:|%/v!¦L( Kڂ"!SiCRd5w!S7Vc:]Sξazbl؞uN6ifwU"Grmgt/܃) ]rOdL><H[|`m st?EYzf/DK/+tZ>CšGˑ\m˚¯\Ů΋sՋ7ʋԿ>d/աCnJY*$n~^3n׀ ōmfR U|WX0CE@e'?.THZBY7,;vߨdo?4.wYF[K3p$`?7BŁ/a>$ۑh+k{zs$/'еϩq,b)bzxp,G%VH*1-܌[[%iKʩՌghi SUZ% K5! fF6+?iýgu_Sq_) Wy/*d^$uQ*~-ŜQm򊮋kmp}]) sހ9U !`n8dJNTv]j =WZҽبؤҖVg$g]Fk\1)Ǿ΂nsdx*\p ȧ&H/*,f*|ǂWEd/c%0Yiɴ!FNb԰\J\?Bhy"+'S^t-ZecɷnyppDΡ92$@OW;p6̊4cm zbuz4bLyH5U7>r!Ft@KY*ڪZҒYoG_s?@av hWr3ʁ4kjMɫvJؖ<@Nm$h"lad@ fq[Ny}M7HhRwݥp^?M_A6Zg ,cbrmd1M<3 n}KQ_HyaCZ 9Y(p,u! HF*+$G ڗ X/'d!l[KTS 2v ȅhsuPoAEP>++f1 ZSt"`Rן2_NHB2-b:3[]H+\FeeeêIpO9Z>\5$6فsOX%zCcb'30Ww]/n5*G"3B{8 y_ZSQ6X8ڄΝXn#yVWl뫍 O%y%b,i0~8MjDP ()mևV8 w5hN|_~(%9 gfnթjOoHOq*nN;B7EG8k$N|DR%(9ֳP5 B6~:}6zZ @A/ƆuacR}6T [}ZV]=XYцHC'ÉXqgLپLZeςT|Wݐ7T{B3;xY]1C}+iy ytpyYǧQ뵲anN<ʹdC(s5(1F[iu UClFNn,FO K*9mHXV͠t,A+DNͮxº>  !X4-b>q߃~{< 6#2x ܐ,`l_h4,8ǯ!0Դ p}]Jr$dEH7kȱagۃ{C˙˞x7yO}JΖx}X7e^'k}. 3wɾH6}#{y;:! T[FAE|*Ⱦ[TZ'IlzĐ7QXapwV?VP=vYxOe[}^M? /,&'&l-^ @[M<(gQ9Pb|/HCH"TQ~KXbu7F UMc!T>%y `kg/kq8(3 TyTEJ.G&4V Hg3e ]%rE8n]Jjw a_aJj>Zl؞ZJP=9 Lh=P<,$lT+,HЮj„yDCfcu *asC%2_Wm2xYԵTgImlOL]\Y)G!x ꭲo۫HA&z u^)C;e|mдh:Մ6_K޲@*Z|ثToO&[X TތW[Cp/Gh{j\^%B8,Hl&:1Y<,Gg{d8,sLo=)9BѫN w[د <\\)'bb-U K(0XM~*>2%[􅾚 WS݄+, CDqF j;O ˀL^/=΄jD͑'ƷS5TZd 2~tM (OY)gjgvC oB9@Xc}m1xꅮ4Y--JPW-2+o, !2`_]_ 9YÁaUiTl6B!'utxT zMe H} U/ pCړ,`,vCm)뜈R"Ygĝd=9iV#8'αlg/rh\tgf 葰Q2V"pR`ϗnB3QTkflMѬ% x%gHIyZrIC`ww'\MX 9 jWឮ C]Mpip9NaF|?7UZr6)[Xt ʮ^IQ[^>/7N[{r@#c,\cD=Π`j J*Ͼe]~EԕcaLhbbXS+pGUa;ƪ܌6E,~=Nٸ,UI[G"䗸Mf~:VݬM&Jµ1-1!= U܄Vw- l_QTU e .L-Vܝ$ZPj"J4 ;{^y,92P(N󳂺|La,Yo&~XPFY[:(zDAQVC!֓ǚ. 3Ff:;~e|/L01>\L1S?Պ2R.o\4c2iub2̮R|^g4,$EkaGc{qEvɎJ/.MyLAk] qX ^[_ilﷵ a(0CjwM-3Z_%l\i!Ak( S}f3O4yYS*bʐ$Qn\r0  FV 6Ԃ8|f<=w.R#FugI vKPadq/AA/:.{JU[I~hx[IQTPvc~=X#vajRJҙvФJdy4 \diҨDI?ZqE Z4$_M>tпmQXUT%K59OA=v)ϸMam<!z([q$|^&5@,*%w OiC&OVV՗  u,p[ÙWyVPĜD\A`_ԹbLFSwIIu+5>EUH[FA\ hhPf;~ mQ`nֳ\Os.tax>/.Z;?{-32^WujN9\a KJ9jZܛKer/%2>3j%bf@O# ϲ[;\ԑ~2RV(Oi9 Ӷl&ּln56zmT %wzmfK! t1AH̊ .jSdM[;N3^'Z{iɡn3c"?S/z̞BFMtnaԂ`\|2GDңX@ OAd.҅J31כKea E(m382 g?/Lb{6:+_@ E@DPdOlU #3]bØǔ؏@7 [5X9Ԏkr%u[y]󡹱T !jƭD8A|yoYN!aJS͞UIg?md92'u;`[vFMk}?j>- @"0Wl ~`~(w_%[-ɾnuD 5N.Er7g'%"OKCgȽ8eTEz1v$iOU#%d4K+=<\a|c޹mӈ(3^FG#S>Ax EYjP]@=16g337F-w2D:1R5O ZMlQ4&I[K@| oNDJ%HW7b{}PBՐ1}EDPg{<ា(သzf#cHȿCvwxbN;y6d0z5hrarZsƚ4M zmPJO_UgoE йqCENCKmJ#ë!re."A8GYw5kY!FZq:_&)a&5U g"N[hRv@.&B$q|`1d ]`RSsL'`riѫTiϟVȹAYN]Iz:sXBn/^ ח<{W x=f4l6~rRo?b,-MiZ#.6Vg$p]Im}a4U˰+6 >CxڀYFǨT9N(W2\?fFu`hM+a<qMD4kT.OU48yc<&y?t ZO>AikQA 5{Gk&E\6\t Je&V`).R*[S6q=n_4 >I6:HҪg6Z.3Ъp^<҇x[LWj4g e?5sTJ]iz = Ԙps]xDu۟TFEp' : , !ﺩjd`vmg(׆% FKv &L7c~UΦoXs E[NnSAT8]0OzZ[0]rr_+"+zu7t /굻KNap#u7~6԰ 2ڜT>f_$$|b'6XPMXG1nhtg]Uy+%rέ .(/BqjU%ohX GlGK rZDzkh6fL5d=R.fIƖ›L+Iݫ"7 ɥ+<@Xvt93.hX.$G#sٯRF4x& cܥu1oGc:fdL1Ung)"|,Ǔ.J8!MV~5`!ёDZa"s_}7"1c5EF4Ha7db @*A(皂ԷD#{9*gfaC+1>_b38rs=%O ;ǴS'yf4خi=Y' @ a; rXFJ]d<QHFwDORfc9a~ ð98V͊@fChT( &E=Q ,< OC%Q_hhj/] FVBاS0T!0VRLSvV?cTFPK/Lg.IAfvq#tSŊLPH,<5.yrol{kx+$f3Cf˂U.+M m=\[Et▍MlX#m9]rgJ31˛ Ɵs̄? t+P4=$xe9TXcQm`>'v<ݾ믉st([jeY DG5&h%M2U/~ S@dܥֲr`OG*>ch˝!+UtAasLf|sTmz9@h~~$Zd t&ݛ`\;,Q|̵#։Y19c.!'YaFIwJ6MbF0>L1ϹÏE/* L*(s 2`s?^]">l NK$7O> I:Vel֢^yE'FUg|r#Qq. (WKI5C&#}y52>!F*|v*M:n;g|8Cu`x,rϩ?:?M=7잓>fQ#1Im.Ɩ;U[OI59M T yJRht$ C0Dd`oXpACNT#`U? py`^6L(jcg wUJSѴI2. ~, zeVJ>3ALnRK|`GK>f߭5{Fnmj敊pu^9?#x[2O'F_.гe@tԻգfC':x`ph$*!2qmg %B- a^bYCN-ZR9z$M̜gAB%)PFjCf7` k`!<1 pĈ aE 9Y?9kR,Ww*}jMgsǮ@P)N1Afߠ-(܏iVxUKl=:)i0lgeNgW3Q-Lobh=Լ` uF܎N%A!͞3k=0H YQ86tќˢ܍~aZ9UGDrjel :!ғKMNe ku@5wʱƀso\J@d|oG@%Veqs ya9,Ax}E2}*mB}Bƹji0 #^E*]} e d?m$qv8iq)} ́/cd޸V /|)L){$L=X'ץm"%@yu_]UlSAjϴ]`( -f+!n̐[q>[E}(D֯o]H!^\$IEõslEf(,IP+$YǮp/&I.^rulk`9')|5Ο8ӃLT[͞B:#amoA0ԭW nj`ڳΘo;473X9nd550b >SvP| 4j+~h)3`K-pRľqC: H )1 ]f:4? BOC]q쵔R& %$2-`Sl"oŅ$vqQ慏%rjHrIW8́i.)ƸAs? I<}QelTòs2|Ah -ZXB+hw'%L-'ul>(i DzH17a!:YC(Rњ('P!jfKqTpWKC7 ~z0گR7r"v6W`6Ee1r@҆TӅ(lLR",| t2"FGFLƽ{)@*fW uϷX̙%ǧH93,T~נ/V{C$ sJʣDUS;<#-]; C,܎AcHX7##kc:.,Cꀡw2Gc敔* }|?.#%&Ry8Oi|LtjZL+>-)nYA:wXR'3Ƀx%8;SuLӷT^ LD_#$z9jE&A]Y#fa}ull@5uRZ) +!ރdHؾKbkIK]xV+D@KTNљ^:{&WK0-_5ͨ;j_̇Y"p3m(-ˆW"i0 \'ߕ+p3<ّ) t?f?kD) V?Jd3 rˀ㈻-qN?~)I$͠ [`bq—Gϼ>]SYi>c'%i )\2Z!"bg<E7 Zĕ? H"IJd)Qbi=P?70߁,$GrtmJs.9/I|w/پu6]<1cJD.nՒ9IV+I1Ec 3(;=@UsHoVx=+M|u1DFum6GAkO5ja/DNEysMR<+UK3'aT4n>$%dB\xI߯Ig|% [;XO4.>ʠVN D'p;zWD#܊`hͿ|5e!09˺{bsDC"O\;e<C;4A…nG|pڳRm(GaOVr[Kܺs(7@,N0 %wQ%eꢘYKE,yFݽܲvu:t~ ֕3}s0P!Vt!W ҡ)%%1QY|>sOo&BcTͿ7Ro>0+eq @Yq;Zs*h(kg ж9A1tF1ya@ř4I葄wj2hT\N^^~rJk ބif`Hj\P5{TwIu7>ѓokO NWjV"I^jCPRR&)y&%2O,³{ }mket BOîDs(d6I1{Zr:*TfNKZ[MkX8Uc%=ŜDPgvODv  6QooD Gb qQ*SI9"3F'R i>}_@Z>(ixy}_囉\n9S7>xmߖ" S >R㉖#U,`3Ybd%ç/\Xͳ0 ᧨ 4. xm.PnN,g=7sq[?o8oj4㚒%wMBs] f)p@kuIEӻ_?2,J !Dё_S+ѷ!N4r$O79Sr )zI-2r1+ rd/yQӣ+R,_dh<#5cO G|"RŻvBPU7j1PhS Zũe8yr`m pP$qxAϏyaKzDxCjMp/áx$ѭsڞ_QীԒ02UL_YZnz{hDC@ܹo7>%>d. :z.@l_`޸-|.@(JMS:d "[k6DJ~8ҹBgk~V &I)˼oݩDϲFEoƻۢW9H*\RmB/(sʑJ{mB6 7L( gɢP%g/ RC78N_T<ԙȘ6)9dE{͐纙:9%lO8nLu^%XXN!k6Q^) tڽ)oC){;SAKQ-Ͳ<ץ͇uMZ F`M_岲\[tECgjjUOiaf&R}4.'>%5 Ȑɢ6}W9_^*Tz8lR1_ְ(ʉ;<T 8&jǾ9tu c W; z Jrx9Up\oɏ}O96şP .gc-ˠ`^-YB0H:'[ZlHbF*XU l>ES`D ~r;f$JxpU!Ye(_isk[Mfe"g:J_(y4:Nq؈ipP{C3b˰xz#wtK3iؚ:6k0LRWTuy]>㣾Ƣ¶WІw0Rts%Cb:!wthTh-34_M*= I{*ӥ!˕!I*1ns7}uбR1ZHbi ݜTjR`k , ㍌MewD=PM%kl&y JTYmE鿊ȝ2>ίwmԦrbDxo![?pN^JQ\#o|"w&0Xg|* .Ю1 FX—I,!JRc~=YK)fr\@Urd qk^/ϐ*l_KB[IS&ͯ]NqVOu<:‘}mo fp&ϺP86C鋙!_*،VQDojc2;XL~vu][$K +1~8Oγo8BBwkCH M3)%Pϰ|"xe<.!%̕| pH,lH@Sܡ mݟ ڷ1əf\wcUQ'֍?bqgmq h+c2!kIb?*@+1G݈5qy;U~?sG^SӒwK!Ì&pc⤜ \8g5jЧ-|oDCk&>$s%C!:#::>0~ѪRɣV`Uo2IGTS3da@x֖EiӢs)ӫ4\_6{W6@Mu46uJׯGi#RT$6'o ]0#pW'UzRM L$X:(qiêdQXGvFX'SNƤPh3B^@g7O^_RV-&.W_bG .ke< &В W%*- bB*l8.萤nsrr#7dC4a Qq04pLE&^xjbz:qy= nNX0.Zon`pU0̆!sXIlH`W4iC\Ewt@%Y^nѴܫ7~ՓD b/T8,21AfZ0-@!es  _9H@I#Bp-|;p0rQP1#eXyTs).VuG៖ΠՒBAkgڨaZ7h/}N~QX7?7~BBobG֮arC$<b`)6[!@9E,;u:䲉H3]  3%|~#ݧdso^]Gh'? m &9n"(; IïI M 'XQ"H < 9kݡQh9!&}CBR*C015G:R@ s*Vw$gg~H~6.wnƥr_zaiN$]&#VHeɽ+T՗8 tٙ%rI &68S e Vb΍`]a'cuWZo3 ,cʲ w_1A:?^%s岠@V%[Tzmvs6̶ yh R~0h!X}׎@ ๼ۣل)<|`u|G#VBJVz8Sc@>mc2(ѸʵSO!͜뉏1+zCWaNd@s)w|<`n{{-g t IQfW+B"ӡR8WUǏc|J m @ÔMts/h"N@^MDQ Eq:;ߙKTdemr5n,-3lid ?X͎wAOR0(F+,ӸK?wz0=;1/bpr;#=  B)1Y>eڈo=/xJJDq۱>ƣL@yjs1OѴL}p˺__o:%y*e X[&PzE񻲃}wdVzOSd1$R1:0<ˈ}~4O Rdzۚ,˼Xf7헊g*/V/v6:ĆK>y7yĹ[Gg n4mI ɘ${hӺa"_W)ߥ=|&RHdt؜-'&С nDLZ܅&JX\7Ҋ!{2U+[`Ʒfd6>]$3`&]J+} n4北j\pUۑp4FtݓH֌tgL>tZU|=CaĂA⇪pCS֋"`m>oO] &ڳks z<Ҥ9q{HDЊQ촠-01<.m6 )?mce0&!^Vr)p|WyOY Ѕ"4?1)L #".c ,!4EQ92QǔB(dY#@E J_W:y@mı/B|leBtݨ TZ`y7Uj&=ٵו2B7y8Hj}۲GL>NϫRgAW_ë;֭IjiA#쵡Fo(+{E&X:h 2Udx{axM3NS]]?Q1@L-|LDĩ_PbsdDڹϲ;@2z[J\clۙY\+7p,qʝ+昆XA70"$MZYFb'Eq0+Ipr&#lKb\Yg.]!?@_;!QOI]]ıx5s%?ehrd v?i(uU_[C]d"sFȨVMV[?ٜO2x|4`r)9NY;.NCT@tJ-EYTpF%3UYw؇Il:b}4&f5"O0eKC 3?t:IXg ~@ƒڸhZvu9aM4Z3ReQ/8*'"Gof'_WɆ涎5z%QwִsH".\P#9uf5MNdFs ov4bS#^#sA]R'ͤB"4Za4_yɅ6$ Wiaϵfk `d+[h.[@h\NJ%RGn+9htXђ7BW'ię8hx%!_?;J"idƄ,nyB#M "hDqsE8\m\¾[ar.mw p4YK*uwیAR^gAdH:Rg6xq15S9LJ!+H|"׾V\+`]N~`מw'; ke)7G V iLTD~``.] 5Թp2JfvU[ 1,~ͷ>Ɇӱyf0'yϔ+~*WLzhOxh'! UQ71KC JpBT0Z0%S0KgBoX>D@{1 Eb+Zx9|_}y1`q.tDk0b 3Jj1eҹ9< %8WiLR.MaS#2?WH’C^wI@:, Qh{?I/DbKs[r;jFb;F9WlgK3/A`+n"gΓh`Z{K7<`(,FCyrg&F8)H1ҷ[f1lr- jxvϳQLm[TԋJMIKe !n=^tA5yU9IB#ar"vFtXDҝb `n5 gI:huFfò_C5fԁe,bcJ1uϴ1@jy0'#):r(_qfbw~dbӐޢV 3 Ux94:3Fa2Euy3Rs鋄'8fzn7=Zk !~$Rq :TIWKUqz@P R-}\WNOϛȓ7Nts9 5ɪ)򾑱 hH/Qe@b &)&o˫ z$b""NlqGfucʓ.${Cb]#h0Ή=djƈ̪@4𨲸|v#--MНy 4ߘF)+G߉,4 1m| z_s*mS9&rMH!WC~@z–H" *jhoWYOr /\P]KO0m2Pm} rFjV_Ѫ,y>`W5o[ :T/I^>SiVWo A(rn-w¯Y |̉y'vUG߉慱1BP~%o皅e4|ʸ=̳3"PPvdֺa <\rKA;ŠQ0|UiWahPpL@?(z >aOݯV߻P!$\'ݓg/3)n׺eZtmyOY^-ShhuQ/8ki DFl8]jlp˻IvߡS7>g~S:y:XշI9?xˍ SQtG7.+WkϜKrXб7^;ƮM?Kb F}+7eEYmM~*԰0jX6H26bJL#kC=]VD Fラ ]^z+hs aSDU"W3abń ")kGBi +vӾ AF_SptN>9i:`0 ({iKa|?AH$.giGw%$mWI)T-̊X5lzP^ Wo+t6_#ۥ;%XLLL[UЃ=đ4O%0%3Ybi| ;Q)T;QŃ$_-GU68ϜWUs!" 5Q/?jdSW!_ V pgdzGU ÎQ9A@De^J1G;=>yNI9z3H#$'Xηtz%X,v::N~PCۧjߋ? 654Ѡ~F0m7>wx.g 3mqy!# =a+)@#Sck$Оvk؈kG2 x0@j-~Q# \w3ºFF[,VtƳ^L:R?TZ: *u&ouly4*;s_öUoݝ3:y}c&ӳ6z0'MruZINZ\'jBrŗ]kF&CW{Lo6dOj>(EW>Luct⎷iYGf i5ܞzǦUmP0TNF^ KycSo$`[N"KVG|y}3@9؞IϿ\.Ibo mu/Q x7NC$~\B*eQ0<֕r?cx L1#4 ջSKdGQ1.S),FPBǬ(.J#\7߄xi|3=ljVYּn%BQ,ӰZiMԟi^`eq}MS<Cļaps ^ ;PpD=;?a>+Zm] k,!k; fxcI8&Y4%y0!wFJbGGyRS $\*e9 l`Solq#':as b^Sqgq[ށ{2;NQ1E2Pn@:Y 0L$KQ$F eT)9$+5ⷶ隆h1ʽGMj=6h#;0!u8)_:ka>J (3 ֪rRϐ\k'u dRߍЁr)*:*\aR|L) _+UFq'83x|$rmi25;(: +eT ytzf҂lc .nP'e~dq}0= _6z?0:-X (DႶIݥU)n|㯞R\/8ī~w`cR &=\3No%|hZLLVڗ>XV.7K1*?aT#CCbUs! =c //IfTIG@MK /۶\O&vN$*it58CϿTUfb|?ow=I]a'Mi9!1:|{aaӷ5@P7ďxoDuw B&rIG'~ nOʶOXNd|.S\(503lb%u~HߠX R* يGFs.cb:"|MG"۟l?'EO!70!UFnPt4_%5۞$ ֆr;Iӄ~do]*k#HjY ㄵe\eks{bQWnY#&PΛh v+B3ٻ?R6O4rXY\u+,L.DXҩxa*IKUM ,kWxGX vzT]wsWʯP~dg&YxRݰfi#"\HˏK3:oAdłQxęK"l.JS QW e%.1PRfܜ,ֹ{iVK .ґӲGdxo61&Ì[+N4ʬv׏x9ڌ}O $-jWۈE{%==u?(9݅P :Z^6  ū*=R߈uQV{ 2|bVMlNIH"%>LJ+ܿ?IG`fcbY>8C`aAxO 8[L8aitM50<vRm5&,_GKdZ'cU&ke߄_EZNifPN5ldkAsCAφCtc;,/zq.la@BSNfG$QjAY"1-o՚MYU/C$.Z7mdL`{::FB Gl$n+:KwguhZsET:h6 \~<BW'i[&(zL`,R75Q5Ih^Whj@m}Km F)RQʣY#,jT>ЪypNqMK: YD*D(g'u?*cj F z裒pA+FlHIk"@  Ubpn~ UElpTnK<9d#ܐ7lqg;c <£ro]fKnHӜXN7-I LqXTIJ2s\7+8I䡥xQ%L{b6-k_`F;lYN "@!R Oz,ut5|yFCx=Dht4KBdPP>ђ)hO۷ :tqwHIS;C鰴ֹmQ)?n =fS%Fi82C jVz&[ۆGK# 6m5-&}ʼni7dG(aPR- Y\`w<4ڍXcmR.+C"o+C ‡Dt^n7)nx/RQw\hOG  ;Hn1mLSں';*`ezs-dy*jKnAMdP7,{ m|oca( (ƺ>TnU))tU:]׋r+F@na3$}E%&IT6ڷmF-?\xpP`^3b}/1OJ0%30-^rc]0²}5yf ,:&@UAOVx\Ҁ(T~@~_HXwmqGZ[#t HG&/'=閺:%W ͳ 8}BhApar)b(8tԇnʓ 0ᤵ*ߵQm4 f"ɿ'Ɩ ]FI\`CFX:͌⫯@]߱ 23FU;QC^_qHhOVM+j9 7q{h\U/dr>]45ʈnDw07'@vXhbi85fjY?o$/xFxDTZuEBMpХ8(涹PNQV5wU;{dgsX Ao,*i~O'S'F$s&%MȮJk.gOHwY#*qzq |<5g'{CxB+g\. 2{ 񛋗yr,犸B8 J,~l!k 4r1D<BVL47k15jEPي@0N<s@NYr$v?LG^:@-ը #[bBF:Eުϵ>;M;  vIFD'msiIJoD>~`VP c9"0 ߗã-Z~;K,EdwQz@gGyTM)1E9wk^v!;?3~i'u.HpBVDaQ nt3'6]aYKbX6]̀4'Lă-r k' %BS0emռk-{MyS`3h34r6dַ8bгmKAqnW^/]'rXۙmwV5jC Ս2FIM#}JzuK;)y7W` 7-bG#^!&0~ӷmָܪ 4Ɗ Mf#a! k̖S{it|K3oMbJNUAWF'@c+MqGj{*u`{̦D/8:0}6bm"~~Gt1[?bݚC f/ؒW[m=a FIAO?LvR06L~-dݯ; Z]w]Gq! S^EaAC^2v7z UvoH^۽,_\ '@R(z/xQzҮ ;o"o=Y3~ʇL)2NV&&uoJ>$GE&MK9 `sMwNU?)VH\}ЁqB ADaZ ?ֆA@lV%A_+>WTdS5hVuQO[W,4u.xiF?hne"w[eyC~YO6'/+~܅^(fܾN X) 32Rte)$Ϝly;3;]5Rg>ZXߊGu`R)YcKI|c')`&dzSbD[L5D監@”ܫ*MOO=Rr[2 =nhNf\Y#NI9zp7GpD &rcs; 9?Y]K(a^[4d>$@m@}OySz%X128gB8<%1=­bNMS(^B&נ".OMjp2D~J\BR:CNaY jq\йb|.Boޙ)?0hF oq:q$&sJmYI7!6.Xxܞ8fEB?p _Yy!{q벙|hEW$2/\U!*Kw$tjc <uv`% ZHxHD[T›_wSA{{/jrhAEwYo[#2+)UmFo хkخр})Ԅ{H!Q]TХv&릈!J-b7WwOэߕgWJ-Q?8xr + N3qA)ucM̤d~9Ȃ.@Ɲ~]|2DRũ'ܲLAR`DQ_WZmQQrvl#˗C.![&1oN,{R]+?Qu%Xaie*Vbo_QsZҤ'V `PØFu4, nOÀbQ:SCs/Q*n[Y <Fy"bꗸB6Ti4&-݂um 5,ؚY̻Vn9,5/E}Ӟ>M=hf?_zWS0תU4bzeV@dF2x %GKW<,NO|:~<)u0<.t&=bg0|Kr}l^ #Sd;%$ .hl2%OcwRwx zPx"P]5wfa1֫DMSmTW՝$ryRBh .eo38F0oq wwDM|F NCAxW3{`g5-~n#8D/"U 䂭л;ޘJ`u3 v)]ilw= ϙXAՎx:Dsnmx #|do4K@a20v{vSR64м[n|G=@7n%Q?Oi~n8͸f#_bXM杒-~>LmzXVo::򿛷aC=d;'?4VSJ4I Q}L+DGꡫ@^@H8s]= C1]1L]mc<5F`D1 Z 24bɧ&>'c:{Nȋ⢕2Pgگ桟ڨ^Ҭq-L&Z4__}ߋז/  9%f#i /0X;;.cK(Csʡ 7鄕GFDHDjzB~O4(1icLdx%$~vq_J}Sm˪XaƬPb6|.>NǤ!٪Sxk6C]0cip{̱ X.T`_BEy[Vom]I*єRNDN`#8ؾՠ\۠p2Sq@EVp#U̽ ; rȯ~h ND`;Ž-u'e:H@(eX%NF19^8FwT%K(PaBЋ֌>C'%KJwbfC\,zAb _p9p6y{rQnqd;h6lh"50EG= Pmn2$Aόg&c wQf+P#z"!bl ߩN>]zZj .^܀izOt.pVcj>3YgN <-}tc>%A_0E0#a'dي1 Q6PZq% ,.='i͑7EY38ZEzO)*LsLQcf80\p O-VhQf|ܔ/Pϴuq"H0|K(RDiO{~8 Ot*50'VL%spyktZeΏwS`6KTLsjBjHd PJzW6Tf$:2DhHcMdfyTysϭ ۋO$cI^qٱR '3O ]B},ffSMޟSS* mAaO[S,rtf4d$xÖ^g>`u P^,,NS;kokޢ*AL4Ա͏8iF|ިG PE5KM wZ\ jT*bĈ3;x*2޷u?/\)<5CЩ5K>>A*H [-guvޞ2watȁ[\tEV 8%9]?Jyƒld3sZVmB9x VM ʸϗM_eaPHrhZl#F.E]_f9&ƓC@;=|#Ў(/>7JëY MU374pJΥ0 zg]nw^ Xy>>#F's@'wQPܖS'Gە[SȪz;%`"7H{:n%3oQQ  \3'CO62r}HME6әLx1/HQ$1p_.-7/ a3>3PRޅ{8wTr>nϱ(y88>}P #~oyQ~#3J~kTU1;Dȹ_)ѝcMOj8 GeHʵ&iW@@Jd7qsi*_7D+ϩ__K#FqMd >R:c˜V堚x =臉RcZ rMzo[ZuAXԽKqBp)4sDuyvŬζ ()|MN"x[)[ EkRPیfӒkps TeԨ$ [͉]+}X3OpN5R@I Wpp0<_k2y(<Z4]fhKΏ*@ ÃR19ҫ!WWw=$PLpyL1…=<<2bZq(Ci(TS5BJSp-g}zsS G@wO:(e}%>??7 뿽j[%F}ܓnJ$#>`zlfIwfߴ@lh ?fO䎻c"?wqȡ~ Qr`.aLԾՑQ6ye(%_?[3BuI:u5ݰc,ݱvp7fM; n딣T$+hk9סicڜ) NR4cG T Bs3ljE]O7ѿ/N8J֦NN@K P r@P+aD%&gJ)R; ua7D<*O WEmWQ2;[;HaܐLBgK\IGʊUn:h}PMXpcK`t-u kI3cO}$=XFI 6n²: qZ-kI,PA1wQ>fmUy Zb )3[!ݘ#YA?Ҳ6)>磯01Guw va9gM@(% #uEeLF) o$.XD一Z&x٢1/BQͯapfuʼ.yEf@4-VZmw\o|wCYV3}K /Y$Y|Mw`,\ SX\Ѵ1u3qM.Y2m@,G\,VS@4n(as,0䎕d beo`E]{AJ.XM)N!2aZ1&:T C2DŽ3.)lmJlgͅCQC;ҡR`X-XIŀڄҟAOE ') V%'vLw8Qśw6Փᶊ Ao6)<ڟЃ[t?&)cɩ܊GNm+hĠ;K{F%Ilǭ5Q墛 tU-$ S =s /À7ϗdsa4WӶ+R-o vhw;huZD?)>]LncBh(w :|_`?5zC-]5̦LF凿C+毵ؒ#uӱ{謌_,SdO+cQ.ޚ>>J"5;*X[>6ĦW2D*u] 1/߮P*[[ϑf! n:U&ݥ9jY~eOօeF}*.} vbC̮>rTSL*F?{{4V=;(ϩWlT3VY@QP <( l)!j a3-, Jmj_r+gbj3$ai:`ēD6 of9ò 4SK=?/B4jVm]_do:2h"2?PT̫ И'2@צ"f~meN<}#KN1ʘ`_̔G0 W}r]CͿc̽Udn|_yLv1fz[( T7B(@ZXy{cL%&. vjuhn0oSwr_1~ ?j4im.rژU19R H[T%RvI<ټ"O'U Xfis}k4lrhzk]tOB!_+\<L9H-i>\q,v::##?pK=O+T!-[zmVUk- G2Y rb?{$0ruuX7ceYQ6"&GޗyS!;EkwoT_q%J7U~ɻٜ)7ˣzdZ 0eu[UD`4V;Vצ #XNѳ o8o7Phx8 !w鉥ۿTG24UOs }R#UW, 0N1Q ƚ<'Aӡ@SMgs{F=vT@Q4()Ͻ@\)FιvTbʗ w-[_YN|vp8@Xtq$hG,0 N},޽ҙ2+cܬ#}- j caEh"bG!LDk2_^-A*_,£ƾ3SjV Je{5e_m)*[؈Qa^)]: JNqagd5(KJ/pJ^">=l+PI֒ 9F~lA6@4ݓ EHwA$WOϵ]e Km0C $ou%@,@[0m )›9F)EKb:]hjcr.-F'5 d vO?uX1֘#~t TӀK0ԣ" sn)^6i96'DTr?$ܻ ts ml1cd+#_zJ.asP &&2 LK?,Zq`F[D]`0iby(\+-`U-ˌln_[Ѐpg^ͬ?0c }oB(5-F b+ݚrM撞/7߶r!|_QA,FXDJ:*aEF$s"B%{]0LQxkWA)N%eZ5<^" +g`ՐD 0`y0|[]vf1r͑Jwc4&*IlP9; oª[s*-3$&8Q&/lz4/뫳ߙ'*.(X?>HWIdu%b88I'`r9x;uxL؁mΚ9!X\LÒHH|&;p?s`fA`M$ \`8N(u+ǯgSܾ~=BdiH L_>*: WZf{o \^gf\3M A&gTHfo/㖈Ѻ-}axq&/48PچRXd !'k_]FI{je/F+4OpJ1cu|xDk>"Yyeg$OpK<03d/[{<@Ay+h @g">W7`=[TU}=4)a>h[aۊl-Ue&H)Iv*44+aMe/= &>25E}pib8 .!auM21'QU#Lf.YNMIM)=?Y:Y͖)RR{hԶ1Qm'E0H,{[ k4 hd06482~m_D&""4`5G%9 +x!Y̑IuDL$> Uv:H徇u. -I@I HM.a>q9%R2'¾~N#~mai&ߜ n] JX(6Rrh&JG22ܞSxkLpNeX0Rep 9,)=>D߅o釈A֌I¦ LWFa0ҜX%:YfXzG-XW&ُ]By䄋y}~@L4LjLj"5&+TR0}^3MmzBуSiV C!=B+B Fuz(tu>ȩƑ+SUkސ_3p})ԟ9^m AF~]yljC|uP{U~ Uh$Kn0THeo LG/>(}Bk;` 8|CsInCT $Lwt̐Pt7YsmP˨r [/hqBW3b Pώj mC WJ(TˈK8Kw^Y?zS~U'ڊ֮[1$/rZ4a?lPgZ?iF,Obz96ƣH {̇BF;{"&Ilx/z T.ьuȖo+FBW $KK Q1\J٫&4HԜ ua oS: 1qN{t{ IyJ7IU[KDKE?60UG|~vdt tj)x0 z;0aD#֟u7Df'YqF GY0)t`c>.E- ]GR NtWׇA!S6yS)vQ;VŞ|?h;iP.? nGPb$S{:X! xԮCG5"f\p2΃Me*n-q# -:a)gp0;$J{18IG mצBC_'ass>A[UB )1f&钸w#ܑT%@cDVfM+:Ez= 4: 喳6$.V  ЧYSx h98ts$}!7i&ziiɹ3Br_3ǹmU^Alԩub LR/OlsR-Jg_Mi ],l'_h7jv# HcwP. [*,vt#}J*I^H,HjrayAb k9W99 T|˜3|ѼXߌ[$94t?DO v1Xd5Ձw"ψۓC/ٸ=;My:n /Odjye톿8GJ>MjVA +m33Vt(z,e_.*jh%ģ NU[Ǜg~.a@& QBNn!K@zX婎Np!\ _̀0ı[kp߄/F-YK3 VnS_r4XLkA"wMhv4`[,ʋ7`M0ѮceZ3* Q҉`N :;0@?b"wp?D]#qn)ߔ/\!¢lT;m%V&7bcjny¼ҦuDkˎn:Q(h3a`!f:6sH%EK!X=Eʨרp(3u{0Z+JE0uYw酁?wFݿ|0g|Su^orW~+;A.46z/_Ccc_E[m@w/JT8A$ΡnL`-A I"`wɉϮh5}fXuo"@:u+5os#q5Mt򠢘 7w c>ԹҶyi, q ^ '#Ywb!qߛA1Wx^NOH̚-}!]>VZSV,ܑܛ{åj -m"~)%\V|eruL6$hRq'QLp `BYŷQv@?&Z([^k6I6{Gvqr{U0^g& ¤L)0+,g"5;c{gP2vwM޳3hx$~%L\7O☈_߉H=L`95Q]xL0&taz 2܇% H0L(…m`=4c0}K9,9l6}!qf ͍:!hӅx~P X/,JNi9Z/y;InEu{y:)k d%p?>wzhL!UT@ p9)aB7f@ [ 7ZKif>(Fu2i,DPxȓDŽ=|o;9QonƱꗞJo;<f ɺ}82M|՛fYEjT U?bzH`re} m rLc!Բ\Cz;ɳFSY'*[5QĆb`z8Ԯ~>oߚ{g܇ wQ8CƂ]]bdbe;s n^rUV0os kuW葚c,sS{.i0N/=L:MQZ..j`w4#e?ebL.B7ܖuZ}:=l!(Sg#n4Aj_8yz߅:ş1-*[n,>`Q7Dd~E2< -}#M5i &0[?&tnCۤooZ;|>b/'\L#1Zj6.Y/)[RXD Bgbû-a/ާĨ9vRsj6o. pEנF=6K@"Svny'γk;TN.mmijjDLD-Xzf4& r}9{Q[oO;cm; M=TZ)8)!YST TRM ]Kѣ$U.\b*nH],LfD1oVގ0ia`Kjjhi "\GV人qnr;ǍB\XVxֻ1mPQԽz@)JuHx«Qhθq{\s;GCi8.v|3r}mM>@ ޘk,xlڄԕm X-X""gK{/=]Qu 3d" 7gtۆѫ$,jfoO~m LkNb[5óH-Ӊ.!Yy\h{SO]bXٚpW:6RȇPX}+y۳92e yу@]\笎 s2Cbtn΋šMđw"zJvLpш&|֢$WXDyq=:ճCȋgu/=j9ԂU㘱u_*cJ$^3ZUYtcAY+5Hoӷ :ft??Ooz9suVa1Xsh3^;8nA EWi<q zz^4ny؁ IMms9sN mCJNcF.sA -06IΡ-쇳%6+?gW7 &yʁnDߦuɭ6rVU9ꝅN)^&2ʃ#1Ɉ$ʰɒ!/ m vmJ ?ҋp+vYhH]Gnh o;síQad7jWQJ{#\E/ޱuwd5pȀE9=54M]6tGDl}4!r&QmfV&Dz2VUdܳh^r|Ke1)QrrhϷ?|^sYXm:.B6/LqVC7;!@]%\Arv%=r`#4ۅ:[h2!BW%yfP./:FW&~uWR3xD[-bM'~2lc`gxlY l:d3"98b)c1s{ \x:W Kl(R9_t7?&vEwEs'ʄ njLg;GٿXM0nw7V)RuB <>:i`$/[PniJkI;Fk%25ӤiVPE kgV5,*HT߭II?QRkB{k`&"tjQs-7řRbB[(S#߳c{_9n)ytF0q ;'BTjgkODAa-_I =ίI#s"w(BdG"үM6ĉO؆Ȥ[5]z;Er,5Ro#0zh23b%;rLr<",3Wҕ3vFgKM3@!L73r2?oլϓ?W߮9m]<l~Q9ǾANtߜ3ds(T^ؠ@XL<ՑAjg4ᶞ" ;Ii2aor||\O 2ލYzNqyϕmA3֚2lq=MS^ E[kTjcZFs^?SٰY8^ `Cj?a:7 t;*]xT厹oI13JC vB w8|=:(C.5ƛD2uu"qz  r[C۱ 7b%̓ [7r6u'0^"mNKM~ŏ[Mۊy}EĖu \pWtE ~ M9ƃˁzbӵ&gXY .Y2YUǞkgIEK||F3֗K GB߾XR!LD)8 sb(7ؿ9cOesfg6In N[ScS&g04ICWՉW++솯{cWAe}COLyH[h3MUGfPj]bۨX4>=p"CvuΩ;F FM~džY+ԜS+Mlq^K_?#ʻv8*,l:V>hXB"`݇Qz}>%L9 pKO uFm<׿ny"s7?G?k g'{5_ LidDc0f?0-260>U OʖY) ĉRpq.T n(=;A0uIrʚ2\u&:4Mi6M#hq @q;+)ܰ+ Y/prk]} [R펄sLHl{-L\fFŬ6E0m, m0)?=;O!yU>Wī]-=|٫˰ש a8Ҿt mwS Z>`N]h?V< E0QF5?ЕA/wML(}sXܫM[1˳蓀Wܴi|"5H " @KN^oPʎ), | Z sB5M4q氅wJwC1g$o׷ t [ Eh' oL|734^leqf- (dH)7wccEjҢK(P<6U2sg{T"=Hu5˲Y !­4|*xqԡmW(s_[?|"\u30[VK(hu1٩;qr|ĕCadD*^Vμ=SIYim $}kRnO eކUՓ8'6K% tu,Ǟ2 7q7=MI C`nhp%[y$Rv+B31檙W0AebZA;h}3}e8J JDNJAoy7M1a" /m^B@3#L**vnLV٩lth:Gݍhq|f&9ȵ>( h!WeкG-3 e`>)>OKS$8hPS9=7a9{ɮl6%V<(w:d%e,9,!"Vag"YVo;E9FBѯuV:=vӨY1^Ub bsKSoLi&M 7Cg** p;-MYTS~0yzѾָTsåzhY/iqz0LWV)[Q.!8?iNutu0!>Ri6Q "Is95.M/.Ua(̴j3Stkt濓c? !Aߑ*D?y=^xL A~ 9mؖ+VʶUG XatQj0/tCVJIT2.)Vy@jyYRğ{Gpq exoO%E'7yMȏB~(N>[< ռtpNjnȷ(94`GNӈ yA:łӣAh1QuϚ%eϡhB1mvH}5tb1]:{ Dz m]uѾ5E{D6=:X~"@ Z>F3ׂD5uxac0;lDŽinV-TleV$䳩s a!S֐}es%Aa|uO ` I*yX,r yv9+(#C%ߕid%^lhѺX26@dPވ~IߺٜӛwwTCs40ct6j qU|'j3a:h3ZcޜZ|or'H ʔfilr穨;\>@2cY@ U Yz"r쀥S,&FK\cM~~l5$fР\5ޯGr~j]ꐼGܯ| Wy;$&`1D(צѢ[Vpo.;MOIJ)j1.ҌGLB?4h%]4RuM'F>hA~M,=?嗼Dy|x +X»ڎ0}%/I(5b2qJv,2K0Hy/ii\%N z$Ȗ_݈fmnBQ u%:|OyGҼTMv'Q!**[[C7|$X1NJ;-]/ m-Z!҅}q-i3E.WMϬy+. Re0spLVUN@#:b AdGRt\SVz[\Yݫu[ ^чD`KJ%7͟*K.!іܬM\J*|~P< :j|3q*N̈́aV >8wLy@#L'%hI]ߣlm$8ppgLs8=TZ8C1JJҿgejmcJKEX(,'H2"3mE-Lp.SaS_75]z~Ν,$U/{ jD %DpJ4 ,%MRvW"$'J]!4 'Vwg>xx#;n,n87H_8';ޕj+p'5Na޿čx'< >9R$P ڤj<5. 4bѲ.2-@X DכB{οiyxX]}sBBR^DZn̷/-_ ]8]Ne2<'Ţ9ʏ0b;\gswNί:L܍n0ThPX9 Klz2Zg"he[kzp'C!G f}'6c^O] /F) M\ڳfAa(i&Co3_k> a!-7s7qִphF f%LHȝ^/>@sJ4neQaf ޏZ=cV I=.^;f{ږ /JoNXdbBo:"(t^KY8Ȩ˫hs.2/XÊ;"Q}/p2 צvKC)(zpChur`aXE.P]"<|^GJ%!75Q<lࡨpxODtlB%AVA8$wˆ.! &-bDH`KiăZ$&x?5-L;wl)-qƠ8 ?`QXKw+\J˹)-שq*ą]'"vAih^O.bt]@)ԜU hGcZJŠTIw  ?_F!a>̙@̲y`{ViRz_jXi8ԫm/ U#)n*^?+3@%dZw Keixࢹ:ͰYx~[o3u[n 0˵P | "ALC"󻶡an /C? ϽtuShvhSeo ?ŷ(7-QT9)]&~l=9X-W3ŀ\gs&BTШ ]fAdEƟTj-a* T?Z ڟj綟 \$=i9]Pl0AF>گPywVBVe=YȯFcBoi]X—nH D8WQO@&O)ߟ ulƾh((Mp|NxL_>`D)o@K2}R9|4 Ish!ǯ#ծ[clRgP¡lWv픥0qLzR˿&*xZH]Oȿ?/fC ż]GB?b숝;1QbhaK"j!;eMNM*U1 ^|40imvFՋ[:`?IPئ}vSI/;4~N#uᦉ Y1 D_=¢lCrRV*ψC@E >6UCNN£[&'#WG[:XZS*u*Z?#ǴXw2ӭail6j$y.S#FN4&rK^ mhz9*u N\=|//U2;J"흊i sc ^N3AtuM[#9lX5YHڬP&4Wt퉁9'^pipuߟ% !C*k-h4 Ĵ*d5[5v;#wrϏg.X6i6,]#78=p& fѻ+;X:ԗ#[ĺW=@` f Zרv6p(AlA@S) 7$ U[KMt8iS 6L5CQER3{o.)vӺ$>sBh3ŠKnRv+N䷂/ԏO$igpu~|_>1"qUV?sJ1ZTt8 ޽QME.$*D bB!= NU5`vt9ZZ{lI9^ó傄)+/9Jsi`0e:oniKBd\Uٛ_pn\Z;In, rNov&;?+cv8er"x_+ΩAO'Mp0/ız۾. 'ku,rB2ܨb׭w/h/樵dfY΅X[43UKWPߊ2,:,ݍ* 'Rc ?;rwv~h5&^0e%k5M5)BA<6 {4+ƨC GiH!&&= 6v><줮~s&QK +~NFVZŢbo8ٜl׭ }v:iD5A;L"8@RļɏDeZK-Xh=}rI]!ۣ [%}E?_29FY^G7I9y<<(®Q(Rq.czN~P ]I_`c];) TGUszsFys]ED1H'7yE&M,@6{0yR r F6_ D _)b!id5tWqVmv, ;%;:_+);z_85ZI;)%*p&E+OĀ4W"C_Sbޮ'(1v&XǶ%)(%d1=,G<-AK303V6Q,0\l+cǐ !S!lIتkGc?<Y /uy%}1->y%5Iր@o-DY) &R؋\L^DzIU$!!|'g0 >_ *F屔GMD0 / U:6쁪5/"X#ʾCB*[8W/ngCEC[qzMD9k*q#!)8dn>XΰW4gLj?B,o]D22f2=6 y>- r5wdzܙW2%r|AuIƲNhLL{€cA;k̎NJ9eRBOO|j6s P*/wtrj5h#t|,VXw*X2y^ZSmoB'a9m;YFpn݋qAsIkIm;F Zq20q,4ʣ,jӧ<]BP{ҕ[ɿS1Z-z"B󖘄 $mIx!}!wNą@g|ԿS;O*4+g+7}eɍw8P/=pT7%[l>L(tb؉5?N mo:k_ns m&o}Kw\9K.%FvAq-/.*P}_p ܺ8 x_ʯ7Fa͜v͎=,>Zn+Hum1*oqG٘pk-Sl)7QdϿt/{bF .t؏bݪܾږgz# ŒȔY0g85sׯCuxJ譋S>yl?iv- # zAb"S@4-Z01 382^oa8eDC`>2IG3y٥F#K)P+:)& Gإ~o͘(ϬCpS2Ko)HdnwfþÞc~ CZP^65p"{rM$؍ȃ^ED9|@RA*h//kaC(h͸9py)Qd_4idxxU?wC{m6j&Gpxέ&U~)pE 0? :+ܟ:6 ss1]{O @N>)K;L.aU|4_Eلd/,],x2c1Fx$MeJ{5~seEc脙J%7=N'u;,BuG/foV&!EVy4Y`5dT]}(YFb?1vnW1PM/P.sUK̅.J2@!|.]>#ROpQP"`_ 7S$\zp9f9$+_wp.d/|-XG>6]EZdktC9>߁6Mwp]SzDN,_>ey[$)%XFTfچٮ=d&$T Gc5ߊމi`vcz X#0\s jxrMĂ_GE]@†N#oV낿|9OT1h  CZ|!`T gA H/%%f򠴘+tE]kht`L ܮ6Z0H;T; OAOe/p3O|o0޷|9d¦E-8V[]Ce,y݅4&1i~ ,dFHKw{PUeq 6TmΡ?T_Zk\<{ sWKZF+>1޸7* Q:X:$Hn &T7 |噚x]ܭ+e]ܭ +\+!Xl"N|o{w1S-,'7KVɓz˔WagR>|Z8)/s@sI{`U3[KrA.L*z~[5@F+*y,LEHH/K\{oJ1$=0LSNOܷ Hyd鶋 +-3o Mq^B <,MgOcƖxO@hش=RT{ay#{m{-2 c>WbDz7Pn*(1@J68ߟFȔe6̫4Ӵ:][Ӷ 9F>T]l_]c1/QiCEJe\$/{տk5x@nTN ~Dkm k;iO&p ,Ft&"- njXS v^yueoE=("g &K5r9fK'J@xIy9^xsԨS":+뺯ES}k8-~{ҏoMPY;Frڸ1rf@X_W۫eI|WXy0~'^=a25tAv"ͤmTbv }~i#{淰@* 'JA…˂t*Vİ[2#43p+AVrZ܂%?a='yZ_Nyn CBn+,U2[DnmtIBv_ J䗏  %׳{G0R0A@I"~٠ yz0].KV+ P=)T_1yW)txO,So^!xxiԄa]Jg$wc':j %wI#TS d"yh`gKSPZT1 PQׂ̨hjn<<^aZ|"n=OxD\۴3tWCE jDU,a&vq8wQqO-ysx=\3DWЂ_ƜYd]V%dĶɡA3/ӂuo vrϕk(Q¥=CT<\`:v(BًԠhm|kwHFU &`*h.4hXlg!lc(ӂ~vv[j2@ Yճ{?ܔ\=٥'ofn,&r!ڝqelPYkj͏ID5&ֽPz;VjkE3m.E'R)h5ǫdKW D+!UupbX7f) r^T@ppHt 8Z  #c Rt" |+'z;Gw鐥l{zJ)X{'&y767Nfۦ]RLfgAV /KC)l 㚺NTP$ *h]RmQ^y.>ދ#}wfHKxWW(1;4낆&.ꛞ8l/p^kijYeO+!O&F4(J[@ٕsfP*U4m#Sw)Mn(5s^⍍vAz,"l!` 9Gcoۮw4(޾nWpo6W0kqF?pSCJ}M VrkCtgFsZ9YJYs3;YY|%pH%شPۻl/rTe䙿<>!ĺJ$py+(?ckF #,;?R6v. F|xO"u Bq3asSXM\'ZIH xp@Eݦ;/%0t iOM'S4ں,$-F,ڱPE9 X\"E&Q&naCf@H4 I}q7Y āMwn[a dZG2[&k 8BybEFS 8Z~$[ /vӉ #Oj ?S#kW}f"JVw y ¢8s?JWLꟑ(LŎY(ʫ6]&L;,X>≜h/V~QTKy܄e·DYT [>e.t}NANܽ-|#<=tP ]H2h iJ}xoy둰Zs|VY(亃Qs*׬)e ILgh 0W88Äbs 7q9j`ވ*U26`1Gz r2c|rHv|f+w~7i/-'t GmNDN/HSUK^[z"҆e˒#LyΌ%?\=1\Uvn J=_nջ|1%4`Hݸga* ۮLoÙJ7$1͎Cں|eR$UHzX.ă/%[>n[X#gl7Njs :Jqd'O䉍3#*Iy0,\F*BcDLʂՇCjT"o]!;Q;Aa=7GS{ܬ.r <6jWە/iNUxr KHI&o؈mT-X$/CzT%d@x8F ҰJك@SI5'*KGyJCc>C7΂G7 %inxXf!#C CH!! 9QAZ.Wb(3F4@\MŀnUeٕ@-TI>rGUl5(i늷ah7E7B)]\IdmxmIcVZ ӄڑ0S|IXF45(;6۵49ttw9 c:FLUZZW 2lvC84|OQH0#~4ra9 kkcɄgUhg3ЧMx)]mbHBϲ2og6݌|`l3 d吿0佗e{%)ݜ޷L;GEq應ƶ#~dH%5ʺL&->H !8ŜIgLF4Xo9Yy?7d3Ԅ)R=D ?y4/! t|U0m2=ʆ:œޖOWC\k$jֲ́q-bl LQ%VQʁ8Լ_iܧi&M]L@a|'Xv{/Ee~ A6c(Fܢqc=gRA?mH?(?8ttS8j Rj5?J$ARͮud-GZ-MR i\h3=%t} )Yj$+iȯP,pN>l;:\f86YO4Bp\Y7ۥꯏNVkH`z7(}dشg) {50"v?shJO?IGZx7?p{`bAcmy \m)|n]K,^2 Rtlhw/YcYw^:^80'B|FH2.ePL=.5=KO J;xZ@t#ܧ~3l=6vJ9d5'ulfR<\Qad{ ;X-+SHȍMnM$2v$Em\_aX,y9B2%;6u%KXy/aX45 KQNLX\,? J?/Cpwi8+=!w`2/ɦ>X0K}K/ dw}Uu /_R̄#ʟW%i2lHVe 2A" }͒#7>`K1=mk˳ ('1|jZ4u{yg0/R욙jA[?"ci,WYB];qrqն`ZlTĹ0*q:!\(}9aA4/M|?H)y}1_sԽB DIJ߾0ʟ!0H i%wfv* HӒI8Md)ш w Jf)PxZF5l, Η HTYd Z(< ʧ^fh f'eQ:,I#f4`rg_m~&|Aᥢsq8d.Ȭ qR^*JcB'!Jp5V6'i<:x$=-%J/Ó7)9?BABX땰MIFv v) y_® v],ٯ4Z*QN BK/.v+hj7@8Tɍq˹L (DȄ\I<jL=k+w4`Yz&% œfz҄:w؛׫rڽPdj|.OZiGm)'Im+0,M>hp^Vvh QKAǷ>&ac޷~f)e] _ZTVH0očm%W5#H j*0YȲΟ:gwajaߧ0#)98Hm^+]vXE*翯y N㚫ig^D8~% HWڴ`IC }Xs+nbݓ ~G/]WV4:a/T[JV]WzBwrѦ3O{ΉѼg -kR7"Y eO $j[.,+. }.,^ kCUPw?/IǯO*K–J]S&f*ID2ȮIo\gt.hbB0%:p,ݿ9ᄍZ4!$uZbkm59Wa(=}ΐSZn;fJ̄& >:.q݂:rAz_qZjm5Х :, 鵵u:etNQoDU q'慢c4'qϸ $VSt=eLkx:HHٸ1ѝ|66%U@ADpM7 æ[}dm<( %m1MF-ۂ9GXq\:X`E"$sHN.\yDݏ>͝CEf&;$_M5سʓ/|yƺiηFK6N&F253hiPї9G=P~pgdL%2MIkZ@;W`4?bɷ fN,/g/ }랎+C|F9D 85!-84Dlw7_rd~F U1LMsΦT3_;( p~RHK_T0ͤĸ#7zI:aM *&!TT޴Џst%QUE' s@a `$vn l2@ezOQ8&FZeSKJ7N7wcf S'"!srX_C'㴨ʣ7GjӮ2KPO.{jER3~%?Gh(0*gbݍ%P&d Z52֩bF=F:kv?0*]yz 1?pԽc]`NSl+%5g^qbI ULdC29f#2O.SDI ԴzJտcQz] hF{x#kQ QRb$ ZWK)]ɱLD[*3_K=ǥKmlpyb!%AsacjC^>S8ؙX\_V{럚l:qWg"["RxpdSaӐFX,(鞃 Q(D<G%te?8>ABߖ*iѼ+*m'OCلrӍG5 #7όZ6vTC"IPS/x c;H`>0ԾNrg#\^7LX`WZ#v`7j4n 6C|r+@U)C`" 6VJ.q\`ՑúhpeXW: jώ I8J!,ɿՐ//786X\`Q="G)ubW;zL+X le"9IMg T ၭX{ZłՅ(*R|u A U 0Iqdg?tHjQ?=6)3ѕr}@,Ň_qQ>ppX趰TEwFǧ( Kό$b?mDlL2 Ecι)ydJUryD^ [Iom3qT }2]U@ͅR)y˷|Q2`S, 1d_ΙQ]:.}qk_j-Sx'3]Ś@2|Y5سo! }B /F MrL_&59FJp6 d VԊ?dPO]w<51JM8QըT1ل '@=ō`TE0'nopĄW{Ck]qmk]MtsW0ǎcՈ"3v1a5:ݜh̰ɿݘw=9 J]?{D`!D!`03񦍚jo]vUߧb| 3ҡL켸͂) fw +EN+3n&>3~[pq\O*ui| {W5\i2)i:t9Mԣf+=nT2:7I*9cvMD*aS8J%R!e>1sT ۓ "]#wzl¸{2R&ʮWP?92lHvPk&k>YcPxZ%8H1,H=BێSwNvn ӳ&t=#R&2$.&tsG-y/s&K QZfint2H+e/6l>q3n݊UQИdLtO#72mq0aPfY;>3g0CZiaAe _m-v-f-Y^Z9H+q&! zơ.]}.txSUqZƉ&~vG=>Zxy '7jlMl玎 *"cLCֳsdʰ~aZR@hd4ANUd䀡k<eU4(nLVnjܓx|p^̄|)kDcm*+`HŠقՉ$ ت_KK' y96pF$hR /& #7?GSfeueIcC@xSCkH CnkG}rE|q)ZM= }) *鶱ۨ\%џ9G@Y&$@Ђr]z~|@%RjyMK 3LY^  ¶5P]ݽHJgDF!x;cLvDuQ:hppG%.y hDQ.I>߹A,K`9 21F0|_ do ^e7 oKWl)3Ӄ|j(*$"$dbl㛀0PgUq2Xw3'Tū璹0]uCM?E"wwg%oNtO!]as5 2+&||Jh[o nD)-nh;|W.\gpWr9(e!5͡x-ےh: D+eC-Mڶ)}Cx^q(L? $20l Uќ8d gV=S8SP cBjG,hl b LR_/w $p@ i{ [|~ś#o fֆ|uԑyiu\1NmIn eb2[ YS\ܝM9]#uSJ$0SnX5 DÚo>} (& 3`UZGJrA-bd@;ǿ{-k.c];߁Hx wz*荫L59ǗPe.y]W'oʥsE\~)WHy]G?xGZi7"|"E"+%J,E0pb4ՂESLuDMXnt/o?԰s~;T߄Bլz,~p%;lT BmnQrVWɸ?ݵ%3|~#)vB KLQ2aJ^o,V LמcUl ?^i;)ec .@5o;]Zj5~Mv꫸`kBX,le+Osc8Z9sPv-0သB͈hrV]8e*4ݕow&wm:"`CvsU}laBt%Y,"9nrz)|ӽ{sQĿXZ%u\ s߮ {*ۧ$`!j *chʙ`_I,t?oIǒd8mfi5&&X%e5d Ag|QɐEadq=(-|urWꥍ"'cؑ?j!KJڌ.2}FXBs韯Ƭy w:fa|5|i l}bĻ+VD898_6ϣX]b\Zq<0_}mº\%cH1vU) 9nT6QKF{cu?X[*s_C*Kt`~yUgcgU 9DICEV #j[_!*aIo֩V< 4%jŮj66XF]3j.5b$״xgG+r (͵<Ȧ1bW"1@G&/@pl6\ٙz#ȥeF:S&xTYDPyg.ۋDHK؃a2N̏ƕGZe ##BaWP=qw11|ݮ7vlOUmB)uV_Ͻq^7&"{ڻj G+| + ֈО.x !Lc΃>M~L- P7` <#[n#g4HG45ev(g0 he|?=+槬fV\Ҏ> C`64kg^1U|M%s&a_ =Hܯ p$zSt;~YIţ@Ģ  D8mwE.랈YЬF# Ha@dl{ҢN3Ksy3L%ZE˛S"X@LsS:8~0珵O52w6 j }cUh) [<>%] l+CkQ!:5Gh4o ˥)\uYl!yo!kG[qO}_&<[# 94NٱX-Q3+gθ"ƺZ(bR|2;Chٷ=NZ^FVV QFruِF:)"e Eh5Զa.,fk8{ۺ}5]UdMVҽnZJOYЕ.HA/7]BHC,+q/=>1Jv\oz]ΛK~؞:Dp@{(WȫTFٮg FS/LTpb'py̒&Hz@΄2OMFaQӗ1i>蚦"fZ)󦗏Y"-]Ql1г+C?hN}BjF}Q_9k{8)0~ 痭\\`+_$w ^=!T $p{ĺJ1R  N L]} #3/ Gr,noӶAn=zQ#=[Z8eRU੼P&<=.ȚrӅgDվRƸl4)CGvJ:q 2Lx\B\w%Nڟ,>BHs<͕9A2*Vgk&,7xN 8.|L~YԆNdJd.Gv0{*Q-F ziܿYq 9Zd1u5X>q_yȶo㸸"F[2/J (f@-]y/([[:lx~mfQKċcҫX$|\{1mUhIL"T0&@0-DiG>umo'DA̟>TмZ.iXL׉HF^߶.O^|0>a$-a*8vx0lؤjZR. To䨹s:0-!u0E/*/v"s Ŋ6n$@{s"~Of0羇A9%5&\{F*h],8MgmGy45G/ E #>e~vCS ϸƖe{@r"Z;%epͫ}&޸*drr.ޟ {LƠ[ymقS;_^m\_Vtw;#V|;ƥոh4tǫ%$YGyϖ%۷+ܪ9m>W L+R+`= n(YOf SvP _Ow d>0 MP@"yr.<gP ə7XV2QnM!/I/FFcI"mA/./ĭ ߶F3Mb<%w{K&C<5)2KjGHIk-c?X]3B57=`K͐Mnjz%XCڏP/ިYCp1(D>@[q/.zcLx᥂,0ۅ1޷\s?7[OK!e-rM7k/Iz ʸmq+ln EWȖ&4Xy5`Avц')|x,[0S"#p6(C 0 ':Ĵd-QA f9}XcHE= {gY AX6E\}C"5g~Q"WI?“wwG[ED;ſcm9偩_C6q=Q) #nʃ1uVp<~*}P 62TxjplCJ%LG/ s=XUڷK*\e (=.L(w9PB4s5uR?.܈KU⟌{CNd7qzrgX]:穩 <yQazHr]륺C>7hVK˹eDv;DM0k"C._Y @reM^1y J*ہ﬈IQv5ۗ8k)N2fPVI=F$\V?/VTr lg0?[p%zz9ULH.G:i!4SCT70iJ`*^G ,$e֠v#Ͽ $0`6j@@Fb2'~/w"irI2k=5 IC7r40[*H J5C0[/TX@xݲjM5, GKPD TLkcN;ʘʃ u2V"dNM|A948Kz٪UG=SFHgƀuf4#0If=|v擗&] (0WTHǁU ~wݣw%( vfsOSMPf陞+߰4TJG$nD/:0Q8< LJ0[2lģϏaB}|vΞ$_ #C=˳*{?nO\iDCǟ:;1UOPdqBw5wk$9RclNv`pPC!(1ek&=fWp@MOtf]Q16]P/E`:5k GVmWaY`.Oώ"m/K6r%J.52#7:ˑ\'6*4뎈i%J`E#neĔtDU5=Q;F|]F_p{3 OiBEm }ѯp͞0+6dۍ디TS^TՉ,7&m&O-rqO0_@"o7`9ċWL"A|NХC#LQ? )\ @z#1W|Lfj_}X^@qXo5l H(~n)GNZXvE'%U1wf"{lTB?|hW@/fN}IW4Sl(~ -/α bUR6MCKEtTxmr:"KHJ+** K+;n]-ΑCͤ !jV27}xKhw6Rv>l|?L@k6' &:EVdExsDTRTf-Ԓ:K EK)ȼK\{^ڽ:a\-U"C0+SB y4 J2 &0.AwgoZcM4vlyatBm5D=o@1r/!NQ$=n%:zᮚ-w.=i"Ch X׿Z6U/=GUr]c}ڻnP7$J {aHh4 cw!tnY_y2S>{7B@A@ ެ7a5DMo0m" 6,KW(eQTF`stMl&T ՆpБô΋E Zm z`6]ڧ"2~<9]˭@hq*q y]LP"uK$HG:n ٶl˾8~jP7n"l HPdJ(} ceZ"8"SLl" Λ ua>'.ƚxiTʎ`xz k?dYaHU 69 >PI|%vP :ќU xu,ܯiQbv PTz B -9fDeߥ5nSfCq:]?&v@#؂K^4OyQ͏:v%W!WEޙR 7%.z.X4_0jm&3Vp5ƦeJx寞s90?#!aG.__&҂gb@@1`[fc:JKt[xqIZ؇c`v$ ?KdV8js_%f=:2#L]l<[2п54CWƘH]]c+`G/^$z9 !x++hN.eUͨ:#s (j 2D*ԡF)RkEv|jӵ x˦9ژ%YusHiTnL̏ v WZl)>P[[Hm2$4bD@k8#CǛIDhqB TovMw #:ːQ gD_On)D̀!R+Љã@B,lpa`Y+?" ޔ|fc21Xt|u%Pi4?#<Qʡ{9 ;B7A4vŌb09D&/BUN3kAztI|mq(D,S͊w,y2,%#MXn2I%*Ěw %a^q u LMVŬ#01QkPvz}MU缗ʢ'1Pǂc>i.W B"_ 3Jz`x!+eQGq?)#b)c# 겳ip v:"G/:CvBuJK]Gm)l{_jsWWAB ƵeBS&A^n}A#Ξ_ pqN.7xMuTȏ\ong 43w^jkgXדi^lryNF ?cf\5fu.r<| PP)r(gZqoB<6{s0PPb=}V7ie:]h/0olF:@<ɲлjpAw1);8dDȁtsK6^qwO9!?U@gլ%*&f , P zS)&A}nƌŸ*#>)%7=ڸ*[TmhG(튌 B3(Q,]rDc^ŝɿzmD$'MjfԧK6RI@I%8b:=,0HawvAɨݚH$Z(Uk+WبzΠO K|P2_)a +a8nTWt4ٷL%S81/?!BI*.*g=Kv[Jz"3hmhNޚnРP}` p dַMBw:Fq A{t!(ohk7-ּ=ǜGkhޞs9&g!v'ADB!W\[}IK̭LDӺК:aED+G&\Eu8蔟:8-.H\I[sRLF;}4E;5-s~9 Xt3,|[׏e}W? <ҟW.&d;6337~CC8-UPEɍUkTT0p}s5q i HxvΥ#OC1'IW<2Xi~j;YmQɨ6NAE:Dfrl\ט_T2|nDBy!b9řZ@k^xIG2g{GTGQL9,>*ٸ:N٤d}3l5ٳ^]OAU6BOuH+/G=;R^n0OL8!n}>@:o.I&7#~}޷wms$Wq4(]w HeHB܍P$"ՂZ`? {Hkր'Sh>#C d|FMT_eh݀9_MkrgNj |yg |/g)QUBҝ(eRID=`dMOwf>,GBG Z6xpl l  :MI/\7ZSױ~?_x|B3P'QXP~Ov0h!9׊6-@Re8缔#S=]#6=1眰o$)c1jjQ9&1f<(r4?R)Gle˜cK?q!yKn_L5z3-T0 WU,Ü@$2QzXZT-C BRa)]0rE5m|ϝ.An/ K̢=X(囨@֟Mز.ʩʖn㭠͎TY vc:'_U~~nVIBy iEqv(BA1,F~`\3?\|$ao  K@ $N&;,xt,L?PC\z3-ՁGFhBL+ѹXԍa޸>9*/U_|oÖR?>y#2]ՈߜR9I^>f<Z7EȩuCΤc%Z8p @9q{_Ru?bo/a,3iNCRqLJiX‹_xj.$f=$GccEB吝=^n |QUXaq '.ۅK9uR3twɩ]<~o7!*6j0 b>0T{ËClpRZmӍoNv2&~dawBs(, ctʵ"G\{"*M]]}=8HqWb/ZeuhΈ ~}JNkj46YUʕA2K) Q-v4屢 ?YM!S3vf*zư7Ĩ s3Rk3MGD+}ls'I˂ 9s-SYu [R}z?[ȑr:3R֏<{*|Υ6/fD7l|˷ajC@?X3ZۮY:h{6k&jgvɳ)`Oz9xh+R|ccd\kQ3(+G@-gۆesžerQ}[ m :m͠)[ n՘Aݤ׬_yrlBDN"Fb+WdݲGFZ D43r2"nqyYxwz?6v4AKd z:ؓHubX+T9?GH!U$n,C ,a; }#&b]bf$DŔH4GlpumdM/b4o6t &h~\lB[yQ37۴F_95|IMhQ7Ȯ3l#>4 :Ly M1vc>B&jԼZb8װp&glE-nj&c'2[8hq!ㅕT+T_*J;jI O6h鞵!,ðc9:&xtMo^w^ 'Se9GU^4-f縶N>,c7x2 Y J dE֕ R1Bg,a&[Ud}nKHD~a!=ςVM(&փ@3+0pBI 5bdb隆!7؍+(N>%Db}ЦX!&dOjj:jV﹫< MB?HF=I,jwզ^B>8 aX? Qeb!ėޝ?pџūV^\ꦓ۔8%n_-Lck)+sCom(=\Y`cL -qOqe ፸h,0&]1-?d*3尟x $dwh|)Ǭ} %$<ݙfXt ЕS,'eIfھ0 @倚7T=r3;TjAa qMBD.!caɹ<ݠ J&2 6@vvÌ H/ܝ'%*%E,c`7 BXh5] я_Q3QGr!?c' fIER5SnM/,uː`#Ls2 9@~t'TFY]QBF7mg'ݚJbƦJC&va0!zo~ D$Tqfﲿs6"`'5Th2UTVR}֞b}M&A“ڳb0T_j \S&1[u]hY툗'?גIlMܾǑxfLxJ+*|jdKxMo(iƿ| >tZp%| (¶Oͮ@ ;eC_L$dͰ|ނ¶@:O {nڧt벪Ѭ`<]qM(d!]ؔLJFL IWwɡKApM7k4{)s}c|iR'k|yhtb_ES.I+]PʤVhs,( VǧoA-J 43x;S'XȠ2{s WsCɮϾUNO̭p2HmXl Pѫqd FXwP4j#ahRyn~(8ud[D]ɝrЈVDqdKG݋:p刿ud_x,]r{OrNrȝ~eZAdSl)QJ!⊰EBT ƚ'hl|~³u7Oɴ{21G؎86ס7ޤ&=P>@Lf}C{ Q>̆2dt@g'oN6D[R/Mm:̃??Ļ'qC9KBj1 %\vk 0 EŦ`8p3+6n^vQBV&IYs% +o+\)0lXDl,7fI&Λp|aahmP[u5Ra{SM÷whPb]JO>([(^(\1]_*T5Q n:mKq7}wy/pܹ:Y0{'|y1+#%LpIy;ļ񼧇NӖ{_,}N=U^Q:S10׽fMU wPv,۴b?39J t_[qS: J^V{Co>`tu7"Sl5R p /X n>#Er>X^tچz mXs1_a7<_:f#dqۙ>َ]]!EM{-*=*n⏕&B'_s~ we6!Uq|L??n6_Gǜ8|mk:5ZAip{݋vӫg){ -\/UK)7{1H^/ nYMi7+ ^dP9"H䦂W詅nn?r \LRu)A>uT%FRVUwnzd%a䠯GژT2M)#DY%Aئ;&00}M 5Lx-s;Σ`('OKltmYDz(|HE;Q.1)7Qcݗe]FSys^, ? _pʏ-9՛$ [FGMGR4wD[!xY[n,쵧JSNNs ϪN-=#wQ*:eD>,k퀧yESC 103> d /rm#=S[Wd&m[xg|JII&CyS,H6KP  EqCQM% zAeCӦ{(`9{յlh4WcRr*w4 S ^;/DyaABQ">4ݏH  o\b{s'\l8&'zD&sM+I0Hx(J:3btYtsàb0xW.aN{)Bϟ[>1ov Oˑ#v,˟ڳUߐ 2ПAR{cSS#kxa$6[TU%ob7SEXkڇ ˜ݛaUW7;&WjV6ņWU;! 'hsԖx͉(tUzW$1/Hb;UO>st֏}.ci(Gݿ1zJ^f,1zrv:YW-G7!H6Jp0`דHj?vd=ЅZ~(R$,ΫUgOr%-G /CQ?Q X>afJO$NYB>g,8rWr 5 4u؋%pRg`pO2.4:bATD5cN5Zn~JF tQMs|*[jr\zU}q!;1K1{VR(wq.A Ht[`XL`ph;}v|;Vmz/N7A>@X!ޢxpM)>%ƝT~VT3!̼^]Eik)0Y(LUeB(B UdT!, ꩕h [G>o5 *g!OmBdXC^7|f /䅞;Ȟ۱B6PN"c#`cPXRN;S@ ~v$N|UzfaiKU00K@MѦx^^Y: PhG1Bk++mŪ{nrUhqӨ[v񔣒t&|,J "uu@F(XtbrI٘u(;Bȵӟc /RDD;[Zr'a *㑸/@8}={'VV q>&?_Rh| &`4Cc)}Ixms d1_t"{z l},>(~vIĮXPHK4CfK6Xk) mHQ nW\ ެ1X۟Qa"|N9dh8xߠuw_Nq!tvϰ:`Llcj!(Jh@wK/;5$od~+8ggWS!|ouD@v' k?ЉdR(i[E\$jv%#?K(%|UAx%B'&*n˭w~&ep y⠋;f">2?!BvKJE` dS/*}Rq؊[G8[Q[].ecthǠd@Op%j";KMԮF>wI/Nbpś# Js1X_N 6@B1ls;"_Uv3B@;59'7yHLw* $hci)]|*FBA5g ӃsGJ{ w;E3yJ.l),@bLF"SiFqIpڕ+ nQyz-V+St9h+NW,T(Iu?i#Ԍfa. /O`Tó#kIEu}`^Vp {)pѬ)lL*>nEg nx$\l]rؿᙧ@amzrqR ),1j>V2޾odQ}/\ϓSP*l@ }Pnk})W7^Ҁ$Rɔt~wC=n~[f>;2sQu hMZhE臄dJ24Op>qܬ;W,c|C&(50Ŕ-]q[TB9:@x)bC8IKXq\z5o+L7e>OceQoQL|b(1Hh' 'dpw`- Lg̳&X2Ɇ`/uǍx{[8ջK!Lw!"tSʫ9Il8B|UDאEm,4wPz\ǟrab+K1fWu@qϟF`>W ={M 8;dn=/~Ff14K5etFp흻%ZY7 s{_v+9TZl?Ug}@(>1 ]׮5IfAW5fʳq~6%3x.1K005(ˢm8 jy:G%nC*wp&p,+Ҿ^ͺ?&5t\dKOq} t_EU/kRTYNB̮H(M,GQ,zŧ|it2[H~ج/󦓧n*"q߫ *44Z^ wcF?V`&`MFuh"M<4 f1R.3c7 x3@p?-ccc|G͈ g[$ f`=q"f&inЇ,DZl<ևcR$ǐquĜ!J#H`)ӵuaf1 H>6e_рsΡe./=& iX'%i,BHy 9r@9,'CZgH_Dç `#&4!v0#%sĬjs5^"qPq؉JWhBw _2S.هm6܏ߔL"# ǝyMpy @Ɩa׀uubW&1XEda^ɹOZtjzbfcͬ -ȋTH$_]z[~`Bkݾ#EL-T J\'ij{! 4qۊ)r-8w0behm׽uDor[IXG̡|Žov*)j9 &آ7 )$ \؃4{^VPFuST~pE>\6^Ȑ^*N'5b0}9줫Нm?뇸mEHK~rF* .5s(V/ӪukL,Ey{NŭoUR-  8>nbchE%&LW _toKK ǡصalQROޙoBEVؼt9&R{ ak~ C vSj($邹m:a2`Q>,y؊k< %<5~dr,7%f|pQ.4XN` SٺW=~(CF!t?v^ϪFt g{ 82Ȫu7 WOW7nbq~s]Z"W=EQte\܆)E!qJH2a7̷6[bPaҼ?>ɁDžW@%7O"BJW-vyT/ V߮'I룹;c?gWQs8Q#eY"_J'pi5:Ӣ`,ڶ.Y ,7[@}-}N&b:R- g%D#AiK80a2x|+ :Ȟ\N*as!kNdJqD'0 sxCMȀVKr@*څz1} :).'>`2Q< J83r sm(qi \+[v}g$U:*, A ;pUk uɓw9:#jçYk"d@*Cr">N]h^`ګh]S= ΫŁ(l]>+^`/$i01C/Ⱥd/K1 Fk7Xӊ^K0={>6w(ɓ@NyJtC\H]˛i*de_+NN* dpuƣ˺_A)T`zw8(v9.}lbUl/IV9AΌ{|hJ%" ۋш@rsqv9J_̙%Y0()IV2KbWGQON$Ȯ739X?\rnkΟNe/˗e {υLZKu][k&١U%n"{]-2~:p!P, {dy9X$IwyZ25DY 7rJnobe[㐠oP:BY%d3PЅ!8"v/l6|/iEsZC _'~ ~bDe%E-'Q 1M5rc=ʪfW6񄛣zn4M%˰gO'SW,Y= ըS: T^1jfk.`5het5ANM'k"y_3̏8Ϊv?+5I^&GqV;naUX  9ոԺD4HԾ<9UQ̥$([!rtPSnDQܤ)_oy4OZHNŭ "r-w!9s֒0NXx2xV:'ӳ ]Gbn<_*< awMԷEO~Z2|3ь`PVOt IMso,u*˲OdP1-UJ/HyG"Et:_gfSS AҀV%'E;A-7/>AƃV K+ֻTtآRћ:p덠w}yT“w DAn}>Ҥ3'-FH~!Ayɤ}̋9Σ$bNxqXh ,{盚.7Ѣ\zH 5`cnqHw/ΣFuox]E 5*R2ŀ`\RKM45=z;eі0ݯ\Ut|ZU鑥^lufndFdN.w_)%%埗iƭ"4rNXqd2[5QȝY*G_{jE(m1AK'`bR+>v[I9[r g&7]9Ӹ+g}lBv3ZisoUכp1'Sj"}qoeb `ҿD'$w : :h4wr,7v87< A)? EC} ChRU7̺($So8x0/p𝿓X6e Ʀܪ_nTz$n"1d. NŎNCEiO-#QU(ϋKxf A12;*\ Ӽ5X5R 4#fш쏁⾼e9•  IsVӀD~ofq?S P=0-;/@X$|eTp8O(W hбzSNNFܙO9+|ce2gp^ oG35[`9 >#yg i](TY4Q8qKqИ 1/|=yc@ $/ֱW#3F",{HlD_d=CZl)|=h $\wR$BAVJ{}5!3_ eOum48UǯR8Ŧ.LCCg#!kK%A0+)L[}uo%@Gq7OtخTMⳍ̮_Khok5 xco/_#Y^7A;=;e,Me'|[=qv^o2bIaGC"9LM7uyܩ'MuHI϶4*.dO#@^ς!+Z,Ҍ]! XNH,BNJ(G٘G&6(Cǜ*#&Ry\UX}ѤI(q>gc*1h\MnTuk` 5Q(@2~4L$SM~5 6_}H.`X [vۭ<$a h:`aM&}, ?>_svDe/be`τ4geKFB=8?$!mۨS 캈{?vn@ڣ?Vkx( a$ʻ}no%BmbZZ>(!YJvˠ ZĪqi#ңDWА[UmQr T:X n?Drt+g" ΛcɆ;H*1 _lAyĥ+4oŕ,4M+T7ۊgty~OE3$)5sǜ "y2b]—1As%4ÁzHb Kf!%ݫfLp%/=4x@܀}7#uZjLhDtqQ]\޲rBt҅Auy.iVsL.JD~QתS2Xodi6clՂBVz L{ U\Ie䌌3kFXB(j/?!ٮU`òOn2Ыn&!Ϙ^yϦ|g3K5bܱe|1+l.N! WS: 圆4{mձL,H`AX֐mRF;pR3ˡ௿@GPҿ qOHugDI;~_Y45 ^*^iuKNضPCYXM3Z(\<_m0` q_|kгϟḌc ÍU)pt5s1Y#\)f $y,G qnf9I.fھqq&wI(DC;1.l3C1k?ϳ?Hց}:rY_j_wv`5CMiͫ4 6{+{3%a"LjZ"m̀R_WIy$- 9RQV=F9Ws`@bJuky@?O*&ǻ<8W'D9FءgNۣ {8Mg(HnDV.P-6/db/}Dٹ/`8r Sk\,lBCC8jBj{jhtxrcʔ>UAltx[>XZރ^jDm~(BRxȏNq 8y }PY/_4]ȑ+`&bYy5]G?zjH/DDwR !UTm_c57y>;g;6`mdgO5#ons;PcVJgH@""dpF#ɐ HRV='TR4BSe2t7?R%PMOYEwH͢?X1N +LqI$W3&R2r[ 9NOHuC"A?2/O{ 7!{ `}7Gdr;k=Q:KkhXFP4gY03l Z ~^`{~_dV}Y@w3LYf_MTЫ"0n^X-ϑ 7BD43ABK.*צ獞m»h˺]?Uh3$\0%#pȚX,h8iEq(JgpPdm.&fgK/zY*0,2Q|:Fu~5b+!S],*t;Ix7bWy))māTυ7/3IG-hӸ*[c$l|چA'SGcISUsm:{ժp;R+9ZҊ5 ]Xfi}Zt3P+7ϫ.ڔamG3xFKr+3c''K\$b/]yǦhԦ):|kQxЛ-sZHBN-]9{='t~w|"z7l"^acY=z|6%$ո}iAhw3˞!wO{ΪОr1 |'hނPEm<< Q@ȵ*E7Tίwi ӑ!/)dw-xr0b_Su3EqZc?㍊%Gҭsq.&6>r0c=s54RN=~ ]tm-2$LCFw-$K~"mn^?,m F豿%"L:q3䭻Q#7\ bRbbnRՓBAWhS׏Z< *&,z<L"4}yҀ[U2V= ,|5SvάB9SF^k$2NGe"YEg vion D1x1դItTk((Iɍ0oIHl߳\:TtK>B/6;(ĔbK}qЫ xm\)FRKB: G$ $>br34|IJpWW1ܿU>5 zΈ{%}(]fYK%Ht&-^64B-fp˜L1,@b=L Z>&[ld񦶙ٸTNLA+^}^I£J"6h qé"4a$;rߓ4(>'Ƭc1 RiȗxyK kJFTDtZR~oP`殢k" GEm`qƐŇ >$}yw *;6OTkUQrby6 Cgd0YS&t;{A eq%@+ⲢiEQ(#$;.诱򸧧``.|Ml`&BVÅ8GnĖMSfOmBaвA mf !/.xkU/+&}FcoQRxlVj:e x3sCHXG:C a4L,fkWm&_HJ0mA@i2eMmS8`e&C^zrtl8^w@Q{(t+'p'?QxO.$yI&)ÖC-լR4*%l7T9ݔ!Q7r /~.wRe~ imXNh5{%߄cadT;Qz VFT$,ŎkJ7[]ϮrB:[vQf0M74d~L  Xa9@jI:y]p l*eKF%KD㇊:K}"|p7ݓoK<ՀbDP!K m2L}Gge_q1~<,mgH'fS2%V-Ex:[JneJEaKa 4`(|?ݺlaAf0)k9[xi`k`N`3Oâ*EapcgzϥdWR L)aGVq6s9Ew$P. &zc+W{D:f/ےRDz R#Cfճ\tP{'?Ql{W) ~NgzŃ5 slTY;=N>M5g:`:Q.Bc> AhSOsy:ye3dZ &>^涃`]#\qMKW?N6\ MdChL*S#.m_W>&8Cʏ+Dc^:jў+9ԺS OHcDj<3vwݑ9M2ulOal\=ʙٞ*){gXcc"M}![Nch#qq`GbvX?BD]"/sHڎ#-Q\!뺬lǺWnlZ!\Fޮլέk4&Z}XLU9?uc64bm69uvm P[R}FhĴQH2BN0 Wjqb"=S|]_Q" eD8{wZkT 3Wp5Ρ=>"kgèJvtx@2+ז0w;osjtnDQq0`$_ a*:`[n&^$;E]}>\2sgeJ(gś67`yH#`L zydIP';XC,"0i I{t'nMƨ82%D+ "NC S<"iYL.xyh$ N4hJsGZ>uזQ4.U1fB3nS/*sq yF~nB?r_|;Փ U#+u kVboh(ta6g[jm{943Vp'ճm۠f#7賋1Ow ecr.t'gA6R.?T:wQ:L۹ c6yV:ꑔ] CZv#}p`s+rGnmu>/M[Z꣌6ۏ Mwerc0+JN_fN ,|Gt[u9EOtEŦ%@=- F,݄C$Ǜi$L _GW#LvhvpsufWz̹{}B`pDev"CҒ'y>@`mp% |҆nyxeHeH U5o!|pH &Bt FIseL6hs-wYdxOf+St + 'Ih-xlɠHϩq;x'Yg~ׄ~wS(Voӳ{a5nt&B*4: owxy~tŬSU7OhBa-Fϩ~`V%wRvH,a:3WEvNÜg" (@ñ]ݴ_`O}n(T.  sD:oԢސ'P{y*SܢRӞ]&!Z8pJ:jMς,~{Uc(vX7r*\ x2䛟AÑDk+|.MChܭźP T͚:" ,D|`Y5@-UUt\KԥWxa, JEYҩn\+ix8Қ *;MCI3^j$ڎ9+ _WqL/Ĥ c\?(ᐼ@*h2wz~ ѹ08Dq5 ϬWxz_ )5-V.L[@5vzsI9ËD&/I囑ugVcVRvD0'ř-VˡQoqD. tgtaِ= m9P**KЋߺ<8vV[H#O^1N z -/qaW26E#FSn>]lm QM~ X5! &TmsUkћH,aEhZn9Vbz/<)Jwg _CԵmՏ]H! T(G-obzRaCbpG}B3K..0؝6{]I"}i-|ڨ-]nrλ9p?&Н-(誌bmc1BTD<*sÖzi +K# cXMUtXaP~=_"FS䕴\ N hDL*PuOe^}ܱ@ N391+؅ <;$µ&i~~eh{X܃T3`D(μyhm_of2RYZQ87&,鸯1/V*A Ͼ";oȑ6k]/B<~o P uIVhat %QeBIi޶Nc[9h>) (Wח&YH'y#@v| 9Ժ &*gKʃ nb78 FTB8ͺv.--݋ AATCZkXd7'\pݜר ^K)WƳ:<7!ܕg5](7b'IݥhDcD>q Eǝ&2WG1gY>+8?WlM<$l o&ܚS#mz a|8-~{dk>ֱQň3;NlbNod^2Ce@S<ߘl# gZx54%8OYM%w'm=xzm>TF¼t\w03PT,wF RZ4I!IbWh L`>:VAZXW+biy@7a;`Xa9>U>5pG] lT%BkM^~%=h@H9;&ݟ0\!@mK򱞞Iȋ@CU5SAӔjv`x,o8(Yן< vOv5C?pr'psL){/ D0%=S63!wWb]QEm8@$Dx ;m=zYdti@yzf }?Tx̪ atAJJwqp!C4gŤ)g{H 13!zwZleی%<**t=.[A8۾2yJ?9IrvgrEI~_EG=D$m SӖLO>Y%Th}XjhA!+|bU)oWt z6O~(qPlz31J{C}2h.`Tw`; Y0hYp@}c<CѦ;9;RM?ZX"++F Ӟ ^^07 7}0./@XR0Jg٨r޽WWr r m)PAkx@5xDY=mMZF=er%[?0Yd^f~7T0O/3{Ci}s G?9r-(3ĂѶ? i@qsVGqT:ʂd侧F'oQ7~WF鑗9'"m^HZ7PCu6|V^uظ#n)\$HJ htT{5i;b۟ u킽iVB{]+W%vۺc=*Z0**F%ɏ0汓;JcfC!&4kb6kvbqv،ax#tnHh iEZY!wh{]zN[G6ZH`mWvTG7C =^hYo/+RlWEnKi6e?d E?E| ^vib>A~\ޥҊڋ}|u` xLhЈbf?yۤ^4ܪ&ӌ0HnX't h"?yyrXdƏυ*ap'~H2 EeQ`%g~S(fX=Ofˑ$yT\m2zBdI@8i-L"Jzu):쳀t;_i!e k1LXhVAJWYLJ G~=ٮ*֪L6 Z@'γid'?kX? G$,oڥ.mZ,s[WN] -@ю%c[bf;Ϭ:UMPdq-8TlfYx++[w|URJ aз^n/m%ݟ1`Y}jU1Pin oy>wacm SGs0?qj8,OFRCqMGz^x J'j)L.0C`ts<6R9PXJ=wiTTKCrl[ǩ.0Ά _kH:!ֱ&ЬTZS[QWv2(U`,+VZKe d|1pxY7;[kt4~QL)'H(rUT&u.Wb=l:!UDUPHYp+񴁜S(q;aB=Ph r.8yO*Nī܅mFAbqjOAJH_fCBmuCEMӑ[J7V]l "VXuyMwU~eC Z֤@']1:=iNOΏj>uhuu1c]ia՞=0%rRn2cM+xRK:RFSGi% Mp~ҁP$}iJ}ND}&L-`mڠEh#J!!,RpŰJABqkfE 9K0l ~ݥ"?'99,:3/+P(p@ 5}|ˮfN{Ĕ*}e1Vn Obg; ,mU#92iI=\J"\%ɖ8-p,";Uv-m>I~nI\toUStrJaPa4A@zZ`gX <@k]m51H قf`;lAw\&)XE]'#~+Elع`.<\WH΀)}ɉli}ҤN!Nz8ĕiReUQIMFo\#0K)'\2ΰ:Omԋ$\c4r(فB.S@/ ~+`O- 7dk`h$0[-),7Sh$z o>22,aIu1/f%1J `tmF-̩iz:]L7|?NpOʈaJ#OB?Q,t%!cMC/X:qNv:#`IlA`٧Z˨@< so<)9ŵ.*/\q֝+o5 iB8;nU2b㱦fGfF}[D^B*Ḟi>ð.lFc0QkU2/KZ_N\72vl.;f̌2yWZmnIXC:^aYK Vr~=BG.s]V7R̥ܩ>2NNű܃W<3+ZiHw"c:JƳl=8>(dG{ph d7v̷̦;lI}*ePa6&֋uL5 #O#Y RQ#g1jT>oe#i/7m/JmPmOTH*Ocϟ s!FRTкg\4+7pEZÌ[E?q;\ϥVS:ڜ(`H"$a+WU?{YfO7S:z5FkjIjN뎟Lv,LPCH;i󙐹 T8V2IMnEX8:/6]W &OE<9d'ֿ4W't"}-H"3#bC)#}F> Hb74(]ʤq |Q\k&֢ \NY `xfl|zs*@<|=E08+M .]|U+YGFj?t:LiEʾO-']C *:Lc<VV ^J6b5T)n\w}? PgLyhk]7AQTnDo g-4$ Z Ph\=CZs|Le  D`AQf}]97K3v zHpԬ`bB E{.r #ɃKar5 ߓ8rKwB[1 e5 E0D߽bɊh*/rZ6hLg8R*C)AEX*媝gQEQd`wߪTD&{,>%#k!/;>2IxR>a>Yu7V G)ׄVW'.U>7H9L {9J3I({ =QOC&} (6 6 &s0'(Y t\%[o+^:]vZ:Q#yΉF| kOH#nxuQV'e#+g^6ocQi8%*s :\JA"S L8x"(Xў.OSryJ4*R+ĆVx &Sn8 *VZ}Zt|qG)  z?̕WO "Sב%ֵI9?RPfmNf:I8T> |~!Sa[;kNȷĸٹ$哅SYlKS jB y7 &ZB)"43/l Oj& _3hwKb'$lt;o3B`uu\eMoqfn&dtvth2ԣ8Ig eh$k-Iw/^az]xvIIrLOM72u?{im?qAdu8Si^@%$_$<>(-@EQ0;E>u+< rYjB`6`aMa[oCEp;I"\)h L/7(Y՛_O\.ӏZnS;۔B].PdrYH!LXt-j0`Axv59םD0XK o pv x2M0D G!;} xL۪o';q7+9NyFMKKSYrSBbQӹR :{gޕ!MZiP ;ðiӬ vk#h*cll+畣GeO-3}8)jQqȄ20 Lp.%nOhV)4vC)'N&ʧ*mּPsP7YGGXgWUqόH:uJ!;~A@~•lS)f WegzIʓ84e1H mLv9N$jHh l}{}IK"G4["Uĵd{޺wk\V`PщgS\ zɴa:q~ AH$%vO&sqAM{޳\)}6զ:x-2r!w(4q-eKWY& a}Zm ,OWC^FÆ(ӑ>p l]75A/Ijyg2sp_N3ﱯmhL9+߲,6%;dSP iuĕT2m0+Xp!\/>r.$-hYu~GB3j@wC3{4t&0^3N1V茑8[ԮΐBm: TsVYnܟx)&Q/Q_1MlXľqXhm¢88yv4 56{֡8c|>S) 2DOԠDN(SpIiH#K̩ bܡɖ8#c9u/o2eŻ҆߳qC HY h>9ןxdwi)950r0r('E4cd|< uҽQ 2 pcv[v}䰌xc~/]@M"X!pt7wT-?ilϱC ȺY4*'etqzM62p'hex@8OP94{VN4ʦWr kLd6ڛ^,F|79sv+uN҈ nmZ3Z/ aCx*/93\[zf-շpMqi9pr4(',g?񈬪ƌp!4Cx ) cKUJ!縝Qxn67(!T9E-I2Q HfhYARΑ#z&nu#k|.\+G X$6ӧdenӍrɝ#nR9@35 R]\16n We͎'(KKS= jlA{Z@X݀J;?ߡVlhRkzIU,0T}h,~!2Z.[Z!!^_ݪS`J?ϖDxh38c2fZ) 㵼د~A-ǪsABp"E+]+o.*ߣIZUrrj3TfA^̿0XHλ!,C''NIdq(F076_2o9{7ħ7X;pł5Nbw[sdj=++Y27bg{7ցy^Is=ЈM3Cjn*#;lW 2bJU3In:l{3+VWpP 9Zi8<muߒn> xS,VZIeAV=D5=;7af ţ~n2ϡch5 !-4$}1I11 ~ Mـ$Ćx!X̀euǵ8sAXӯ]*PP&H'FQ:N\T#jyTaӰ5tYwE5[ܻrE?(̄ waŧ d2Ei?vgj'.tp~#XAъ({QԣM:đ|vTnl,XN:/lj\&Ry4O'@.22sm'.[o `Jv~8ͺlg]Wᔵg+( hQ'%y Q۔x ٽ[NN@Fx:?ﯨҾt'f}v["rr맷B*J>GY)WTاq(oN>RٟcO]r 16! ԘYXFL&b LT$ָ" +F^T ," N#y"^(Ps<>{t{u\ZO[H1l"SHFɮ|}ogTxC1~8SuΊJb=k0XN\ {!~He<9ݥ2'gxUڶ&{3y]7u+BH[çnb~c5ceI処E ܣNi=/|ǡ-s7[-L$ ; DsqH>UxVgi.)qژ(BK1p]Y]7?Jn;=!S=)!hm2I 贷 /m:8<)ҕZE'h?g ސ5LrONœ1΀x& f[!J)Hx!$ܪamNiY' ZxٛrZe-`?Yn)G@ˑ` 5j)'ϒtUJeޤûlʲ1;[neiy ?*f5] qj;֘Kg@!/;Dᴤ?z+Ix`­o h4YN(1H>Q=8!&JUI?4= 72`GSGC#B~ֿ\9`:ژFn)-f-qV<y)Uql=u^H4)5},KH'8Whds C܂O9༳*LxLYlE%&S;Y9PCqPybPg{7@`J5Wbl|FRe TКۃ0=j1CQQA%ֈpVNd6/qu S^!<^X<*&K ܑwfObh  srx ~,:*/rmW-({rN"^o_S)xv$LI; >BX\! ~;3d½"&3!OG8/œkhL"nðiB>3JQ9`iɸrSēL7m5smDRoڵ l̻.#:XZ ˁJ*LjIݚNZeKI\<5SQ$8tӂ [Dˣ:!g"Qy3&1_q3RaY݂rrFrj32j9_;Q ƳdӸ&8,:cWpΏ*َ r?ڮXj&{[]L Vxql &Qa;:'h\|`dBB"Ahv}C9 6n2D>Lg #?%&o Dg;>X8&^% G~|&\%QXHhCp= @8fHVmUIE5O~@ӝ_  "úӊÜ6}Nu+ '?@HV7pX$14xT\፱6fw&:sVԢ6؎Z.Z[ "'rx%a=^agFBxx jCsv؅Ubx.NXt_\s )0wpNuwTcR \jWYk|z OiKL|E֛z"jU*b{~C"e9mV4mhf7"$fπGMͰJԻ+6%]gTB9u}w: 'gP3W3KA a;;`W#E7QqB@Nw4h!bx7wj1ĵsU4T#%f5vKLf'R[H*m8"3a "l| ]̀ >U7R V8Yn!I}I"m"Ч@] ^DO"4t;@&WmRۘ°26'o 06;NK 9a^ɾz8~k7J_;bu4-ѺB3?] O?yDX=<\},#fq "LE@: uV%( Ur)'H [A@PO'K 12 H@ ū8oZ(L=]Dk\<ǧC0omz2]>{V|IaL4,>= :>/?ǥ{wѺ~H ɼ66Il"֔t71‚sFFaTY^3a3ڹZ Fq\5_o]p*HI zoS_>.(qZ$(ќJ8n.ɦR%vgT7:.;QV RPNĕ+' дHz (}t `Y@ )k]/m`2o1VeIizտ'9ZgRh,h"8u=C6Wq[m}n"Y5%i1rC]{?Iߟ#9m0ߞX_QѤ> #gƊoK8ö L&rLZګEdjP3]\!oaV@qܳlX5vr#u|NjؽIsq6 9 aPE8O~J pw<kN TdWM'd pW &&eh={fT,~R4] ) ^ z4g"BB8 !!>y|/XElM1|JwSFeSRhaĹ[>Y}c4,`~7`HI<d8dAף?e0eG1'3Bz; 7j ϭ䓄8=6n\IbB=ӳ2@6X.A'~kQ6%'iDNBI'PZ.jk ٜЉN ,([ķϵx?Bɔ6W!sr֏N ABXG} dFH JUmV瓬/muc5p^T!oG r3뷜 ٸ"QjQ72NZI\eB,}pه7%rG+C=2SĴh'u[-M\a.Pl2N `㆕и5g9.kRt̢Z`E[ /VUoџ_eIJmj!Ez%<aTz&!0Љ/wqGG2s'!Gw1t*oAQrv4E(*nņ7/h :HYz׫U:?cTtLi<Ь׃q…Gg&m})7 ;i$n(]wW)IztG5HL~=Ȗng3捡#T>w"2N2%;?%# XÔL/ю`Bcx>ixDʜC8{oվK,,v5Yl. VH#lRT z\,TxIoXSqH^ +ajqROx-ѥ= ߹Z23?400Nmeu. 9sz`*n^2t=NGKb >@KEUr>@Kkkxq?7ZZoyY>Ə`=p}nޜ/݌gA٥Q *:2J椣Œ)K]o踻:y]?ζ 64>BH$ЋAT=dO&qxQBxPAf@?4faE+s`m&͗mABq 53iU] &C!;'n@X~p^Xt^{S34PF, 2%-Yua{мn{0V,Oz:C&48OKkИ{ử|hvG+#s̕:c$йZ{ F꧒vXk}r.]UAwIxZʙ pbM|xNqqJ#K><`ᱚ;/|GU}KٜE -6M2oсo+EڃՃVm!lDWcXUAF|'%xY9x es8p|Z=6{‘9M=OBM1 9:(Gv8TU}ʺ Djri^t>}F:dsA2uo5Ɍ̔r(Nׯ']<:Smlu#*.C Vt(Y?^99)&W;΢N<#iN|I>ܴDOe+~0b5QYmw-hNTzG_kE 7XTCqo! YdMQv^j$OA\&Ѥ̦2MVQo/k!HF%1¨l xok&=W|Rṅ԰#j{o 4'5/ Vâ=1*zT<>0E CG3@Yx hN7m{6<1A 0Ƭ7KP?`^Pyzk% l?rH\!pxhMfPoP 3BsfYXMx?DRzbH5Vt68}p.,݄3tV8&9!v`Qn#٬p0^ex䚌is^1.+|9:qRC H"@g˽kJ\7%:MN,B׾&Q6\GULd֯i-~JTCBa(|| 9l|TƊRÂJ,b.Uؕ:kzQHxc=x%AXu3TsŌ؊XYXۀHgRY'ց\'F_]h.o6yoLP|y6([0@Gbp"hT>$ /{pt4.DBNCu6Se]BlޙX<5&QN T!PPRYW*i`$>N-G, P8m4$aӣ8ĝ.8a:)ÀMs'zչDN~t-|D=tu [ڀ7ΖЦ?-yCf 'xhBio=\y6xUo*e3ڞ{6h3 M 6I@`5<<=00J%8R})Rirgc|# :?k™!jh???$0ԇζ$фn{(OۿdzHwLKC3XT2l4vѿh|SKw@0 /ˡrkq16ov φ_`ﱂ̓Fj0Y2dlkԀj[6Rc|x5a{ \g(`E\M~6ހ 0M\o}ӿ'R,j苟Jp<f ?qI=4/`׭B½UɯWRO";~~"вX,u2Gҿ ɼ\Ɋv \QϫW _\1w6/Zov(]@ 0BRc\r -(?]ux('KWIGcx\,/4DxN#zmEt2T*NaN%.Μ8e2jT }G:csOON]H1FT'dA\;R6osOr J.^ZBv3䀙is-h}bIÖb{s\D)r}Eb7pb+c_{Qi6lXm`m G!g\ޱ]a}9,c.r2@y[!];p* `萨Ihl͟?_ v~Gh @+_Ot3_!R H{l݌NH!\i揹/GMZj=Cn&z2Oybc,#*)BۓF i7HNQ&4$@hʙM ЗSj87,"aZ8R@CxÙ>?'@'nj"=ёҥmUcEl K2ȧΩtfF*$%ٞȌTՑ8O H.ur_8[z6:.A)t"r=`>U4%תշ7`>%2.nh{=z0NQ#v>#Fp/Owa(1_5\IJ`s1Q"}iC۱+g 8鋂‘to{ aeG_]͞l{{j֋:U T9+ɣɯ~7Pҭ8KQ.-)Qsl[4e0ӳx+[ӜԞ9ysȷMl;R[oQxQОP[XP:1t=s|UݞXO7A( ty=8HwP=CCLO;^|*=g+ØFѭKyaZtj:_7E5/B-cfd$BfȬ&D, n*3HoC 2CbWdvPJ̪d>qM{_ol(yyjZuF}iP2$N[h=3rL9T;7F48Q#">,*uT9lсVdt1P}Ώ*hS&/꟏XW"p,3݆FQkC䜔8SKb.i4棬(w}@[1Z;PK*N@+1WL^ XTmeoFY !xnd􉅙0f2 K( pҕ~}}zNb̒k:@ʛJKi.=7o΀ 0, Dkh^t6=hЮ;tÊ_I1-$΍piJR^P!O9~Y}* AßS*b6"Obq=VqD.ƉIs婜;}EVk@rǾ#,v5^)j~~A>i:.JsuTTyS?*l/N=HISJe_ckڄm[Tn2{"}YMjNe){ʟ{RPܘɻ f3")Nmf꼇N\*\}[T~H7@S3h[kgaրJ~¼uq`"Ο)wCYܿ{h׸Aiϖ h֎` ΡhIMx}cŋc~2 X˟jT>5+lS]@Wӗ!1-ܖdK?߂f9YwA'p/}xc5?6~LBzi20U66"D RՇ"pBiv.df]`i?5oug/:!=iC#۷|.φs > 5Fy²E+Yk2aCB} sïk/se- ƕS@MʻK<`ypW}zT")Sk+171}V$*Si+Ju=5yַ_f웃#  4csI:L~?5\as6#s?AҍkpiP&xW~P5stX?>NeKC@ %hGػsZ* &H"ƌ)( !(D@V̼bd.ypa"C&DU}lv'/B;Ē 58'UBvlQ3< Ϡ#S,2TLm>Q'.{I-P&]F6" ǽ7lDW7)μwl±:qڟ.W^yr>oƴIٞR&Tx@NjT3c9eZy9[DeToUYUՎeY95D xuz>S㥦ldD?烨a+Ѓ=lKd)@qCLHD8t.% hT8roߝA57YLԩaFG_,3rV):KPZ=&XoKN6)wlt#o54-fa_]|]"ӓcz)N5ׇ/ RSG8"8ϯwI!<AS5s`u4iTE-ORj|c7lgR5=Q-`W\ pY p*:t"D<^.U90g9Ar .R~wz&8} (p^Oz8IV,~]-rz J9EJHfԣP=mBs2Jpxͼ.:5z,8 AGprm\!u!W [#GVݦEMMt]Z`Hka!k7y[>d :ÂxZ%7aOjeC:Y;PLV@0+ITo%*MxK' ڂwU+A O@yNw{!i ĺ {\vh$~aw3{U!\yE!k2j3HbC}&e+CK$.Mgm@jv07+y͝ S/M3,wUK֯jb_yFQ9eN&Jnr BY bkcc ]?_d!)I mڡXRIU' >헂KImS< 国PltT~ }5,(bY%aJ Vf= \ 8X,,ozv7Z~="&xlĒjqdXJgM.Wma*kOu?pϬmZ*/)*'D _]j.tǨ:V)ث("~s/bzASYJa]nEEl(x Fbi hKԒ|n5}YM96n rԆz xڛwN8JКK#GyVrB, wŽAyNt@Yw=z#FWg՜jQ@w{:J޴Vy J3Z/ŲP'~Hryh$enǂ\=t"byME=X^b*8p4 '^3/ oC+G@$Ҍ5ð sE{"Qgi,m$L9p}k g* E&&kdQ}Uӭ<[̉{'YIًlCP/'g4yZdekWe gxh8]>*^o߿L}M=MF3SGjg%;InW{+5-p !sƦ&G[4a^~T6y㿾qLEpBEVGwfU<ɮJ|W͇L' rk uPq0.!"$"Ba2 /t!k਋W\ WH^g4y|e4B@ s(?*͗-* nBhj`Xc\Aw 6H S˝:^,G~Wbʋ~+ˊ:06uɛ\)kOzfeVv׵:r2lƹStݪ`'";5R=!S#0cQKgMyENs NA+} [?ƞgXǻ=39 f|3?6yJT!Aag*_wb1$HX HMJF՟ϕU<]J ./{F=p '<l7o^ G[t#yx}B\[z+_Jڶ?7JU ācg*A| +?pz9fdQDLȋTY۩[ -iԬ-q4h6R34\ⱤK0N4kcۉre$+4= 뿔W->y*9Jw/@.Y]n\on\jdoi"U w,%|hĉ HtZ[ 7Kמ;I=z`,zbܜ;U}R"ɏPZtdL΃bp)&M5hYO ] wEM~cr5 uZ '^pb;N5F1JW[* '-N%x{Y3z./T`B |dgaLj{/ IP6#QO>p]< AkO? e6XZOv1R< _+>ܜEՈF(^W;𪰳Oc1:SӺ`SԢrȀ~M\u#JnPh^b 4i0o$Dp>aI.~1uREq ͢\HO(-U"Xъ.'O?VAHŅ1ie>b_{ew/midNhdR2[/e"yo 읕YK񧹸ɵROP,y$ԑ :ēm^Ä=h"(1A~8!1Vҩ xaHΩ@{ih[ƴj Om)nynt"⾷f't[SoK$" +[ lfFcpe1VЭ{[,QXJp_Z1uV eVJ񅈄0X5esԕ!]r+.::;kf'khwc~l ZUTx&VW.Mx2h` @ͣcDZ@*x>~QfwfD&> 0ec]¶7YƱ]?`N *CySkdAK%kkϮ!)T$d9)b2Bijub5$*7b}T?!kvq-M<8 |SwGCR}YEle5|CJUw ԩWȳZ :v _vZʆ]xEMwqcH[c3A#2@vWS12.f[j/>r)1KR*tqI&AgaicmGk#r^/&m,UNx_ TJ*TtXߤ`Uř doL>n #=Xw gů?މfAh9Bst֙$qnAa^6ݜ\{ ^dzٻv zY0UƝ}S1Ccd~hjķWdQ9&E0h;k U$&&3YH㡣9K%V 6A. I h!T&B{WTueYܮ6E 6eI?Q Ɇ.# c50 D ЁJÁ!9n׍OnNK}}&浾 .>Hq `AʙCl`%(ɶ3<&I6#-&4ޏ5c̩MFA#NFJ8]YhK"qE[Wꃤϣihɧ3$ v"AM48\dݴMrrYDDeo+`$NB"*em⽥Q_E'M WJ"Cz!+Qқ0 v|?VJ9uCIOo3_R+Q@0)Ln(`C8>0©h[i18tMu&6Z ԤgƤ*C %-1ܥ^kLyܸ#b1QoW4+F ̰@;u6\i5T޵2 \C"%y V#'Id*/‡IrojF@%To507@jGٜ_e#uIpv5@`&2)lȄyZT#9ZMx, z$D(2uGݗ>87B+MV"*7*.l ͿJ|lMtgNX(: 4 CJӁztz$16>3q{BGG0^>v#Ա\y]n r(g_@pm /-JKo_Şu`Q=qӉ݄5'΁ԝQ}MIfMQĸo($PcE`ܗ\^eg 򰍐N!ݓ!pG'Za@!8L೫`=@PE!"N~ IbCB;"泧FwQf- 6R j4)~e* {cJ l} QDbk/ZbaٲMy 2B?Bˍ?>ĉ2OEZ.ы>""Ku~cweZɄl> 'Bn$] @jgSFL!*dIksׯYȟÌt ֣e~%5E,kP =ydTgf`vY;Glp±  V0A+acg=M3>3n,D@y#19D^Ab;ݯPB"%f*:Ucap@C4G 'ц [oq_!ps~BDZuA-@HV QA`ZdDa_O0Ey>6&*7gk7 8'JAkLqn6GrM+`(bʷJ`՚N/9^$U]A;R7ԆV#&;3S׆љrdKU Ȁ:e<'!+ՎQo%}1 8|]D0 3z hCHV\!6iq$`'vy2:spI);X[lCGwMwi_s$w~IUjTksuci A^:9^@^CD,$wQRne`s& v1|iyyeFvśv[WΕ ];c7= c2 ;hʰ=Df#>};+cmL~@C{ֈ3*)}Tn?^/x$۳EnvXs#t’",xqęXF zy~ٗ%(fɮ6 gyA<Юɷe Ks:v-[s# pB @u`!ߒ#SUP<D҇ze?kzHm9D6&qM|3uM. 6wo8Y휪+gz-`&$FHsgV蚦HW G]أTZ/(WեBy׭=~ÙtPF -؏xI ]CF[ H4=qҚ$(jo-מdzT*5N3li@4p5FxNov:G?svz0{ƱXJ&l6 K´!nDdo˛*$XSHt ɪ7~7?䴩1Q׾e`nKH ;cu&g~$#mݳj:w|?TӖ$*"Z$Q ly2s1T*c7)Dvgs~'P+7 *B}rNs9'}>g_ QQ*$Mg+tYEC6^Yj4|M?F=$,8w%;AX\/l\k<}YsXgd'ɏeص(?%AC-yO:Ѩo192~xrvMLᮬx%g=)NBV.$xguGDf}7&3]$B^!rB ,G$+;#c*;k*:?KS"˰79jM@'A;E+mjjRLsohJ][0G[p;BƑklorJX+zksE>N$D $| ڻo!Yml(E[} siQ0k~nEyLaf^O(-d-zs"K_@]뇱{t=+~?l'ހFq;SY*̩'$fLRy\^dj9CPxu.=n aM[dtf~N+A59Vx?k'[bNsމVU1IxbXKp:%1jw.[, tM4 Z3l&aȆkU֨޼IRHuȣz !2O3>%-QZ|8O~w0Xz ֔6EBgaMCHU`Xx[1rgf;_{c"pp2,I -:;z\5$S]h*JDFDRoE 1W;62^Sl &&QJ&v9eXOQ6Vt%TpmPMk^?Ba4p8`(GuA۠j-϶Ůdҏބh]{Uc8N:,\G`mמa5p9q¤߷apd1]0A1P>dYopL>=<+y#wUljXS+'P)5׮6"n⎤8+&=tcLc+;` uQSVu|6RQzbA_ծgyØdE^03EBSiVY[c( < y#%ukh\d=?" ) yz7i+aA.Sj雱ßvRED2Nh+?H{QNTU|djMkl<^P@i ΙL@_>c14Ԙ u+:s_&V}uVt%#(ǯ'1#uKx+R@ gs^,w[8@8D0 "D Hs4#eFt]=}pC "+%Z| v#'5-忭kj;f2>)|( %ƿvoG$*߆]Y8uCz+%JiJŸ{LNRH ~p$V[5/L$:~g(iW7EOaY_ggQޱ@w{1n [|r1$ 5^Hx4͠Et(duH#Oş(gƕQhŒ7pY ;ߟr/I=:=H9=f"%H}^w 'E\L"tox!b$p+F:ԠK/gS%j$Yj4jFvv5*t6W[|NvEechfv7 WF7p9+/D#[&@кVJx1;q\Τsw]ou,·njjĺ3,d(|,Lj|p&?V;q m !! j7 Tրflibmuparserx.a <  qiskit-aer-0.4.1/src/third-party/linux/lib/oldabi_muparserx.7z000066400000000000000000005742641362723322000243740ustar00rootroot000000000000007zXZִF!t/+7]6Hj "݌9)r/鐮AGQ# N#a:9h %c e4\D_C $p-}j1ԐZ`ڒ/~YCж\LÇ~I>eJEhiM '!'rojR!rXgi܆_۔t/݋%쓞1mR6`f?d˅0p E w• P&dQ,qgBPJMI;:zcT(N(4SPzfYrs"ೲ7iCq60knbdh_dVK6M=DEg`@0՞$MpK f1L֕|F }A $7[X'FM$+t;ka83{ncn?Cs.; feV $jmR&JjKE=T M0㻑*r-4W! Mj(u/dH{9ߡ&JR2ɋ6GOٖa?`g'3&g[_^П;c)*(aaf8i2m#K_ aQλ?-ʼnM 9k0> hrt,EoB-m7f ~DrRP΃vKQj$?iS4Xreh8*ܐLrh}Ҭ>ܰ=LsH)hpw{1PĮ>$H=VY bƕ}p <7*:FIB!+^U"muq8J] q-ǡoL,W5x"ٌ>-imx8Nanj,s|_ٲ(ص'E%-HiwkB%[8b;KrP8퍲`7ߨ>whܞ!;G؏mfaJPQ" `"wuUBV$T5N-i{2?ĉƜ4IS7rHҵOL,.nY]Tj?Ykwf{+T T{)7UÄw'{}e>Ȁz<l6#Y>mn sEx\(es{|0tCVs"Fo!Ч-[mr:ň~ wYm/"ߚ>|))i|k1˸\%ES3h3AoiZ_">8A֕%'[ ~m lPy~p6s3dz,O$ gZheVN2 nPr UR ,t ; { lOJ&z}p%lj 1i>Br2ȗ&<ָb%o4NBLMPQv /'s *gЍ GO=}{-iZNP^ͪ ڈK$(h Y]iD?(ȼ 焄;Ӳx=y. h$YH<5{OTm-=[ cAA:֘v;9n -Ume o!gdMB.H@"<}"h,N(9Tj2 d̆~~NN/ Av%|[OvG6R_XJXW9?i$A/6瓙醞b0mj8G fn䚊bؾ񔷠~ l|bnxm@4T`Rj4Om? ]\3JixCx~ >\Cb'˻RW"xjova`Bh5ʳ]ߺ+"CvmT[NW޿I$E];oՐ=*ff}ʌۛ%5 R#k`ek!/)ѻ7y3G.s[g:"WxHN Etw>FP-9.*WUAl#0\$c'צm_IlZSGj؎! NX +ĪBΤCi6pbZ3&P±8ˑx㝤uV¥]-QN+فOտx HTDYwk,a'Jgۺ-Yׄ]B5tXFV{ [;oN㔀bh 'VajIKdJ٩崨yDpچ*l [bkG\yKԶdo;7Cl 쁙V֎L}rS^[0U_S߼pWB]ݛ&/͝xCjh?Cذ\l#[ I*rqTIC0(K!ղ%5[͚oV21{}l4 7 goXkA B.ᑕ&|q }S]BQy00k͏ d$3rp#߂A&mO,5eKQD;JaQ(~ס^6`z6n6乼[w*;Vɋ0=ֺŇBMDVvK/ .oPչ))I+F&ے'`-q >= BturP&Z="bMP X:8)hZC' x405&weSՆU(bY6Q!F_aWNTc9֯NV7BZB`ZzKެ-䈊eءn``ײT3An jKS~]6g'֪_"laOD'F\x\2Rh Ҧ±ϒ W vF`UYD<{gFNM9NVuƠ%b(kZ&U+  'kޒY.`/b?¿p"CzPXhd`Ҫ4+Nk7IңCI~)#kv~-&]kM]qOw0Ӹ%fV<>[ /H" g`9h9ƾJ~BG_ޏ_Vӧ"Mп22j =*H@B!Ve[-zW"+YeRбx D` v@#"eJzJ׵e5Aa>@@K\PQ2Hp(<ssSCGlwii̴}/}L.~WDzaQtNVR Iʖ&lt ;d|>:Jn\E@y\ Hߪ`^L9XS K!U_~gۢC؆R{;+JxNxWG[.iFCWv &-(S;f| Z9uұPnҥۖ$oWOۑ9uɌ=aՔT$pj@~G1 8b݋0eC2w*DMpG(Òj^( hyBqkXX,H?2#i7O=MHi;YeFAST]غPuHޡp"~QCl( mz!t sFqZ7Ii'4ưA]ruVAsjQvv&s/ a&}%|x'?DU|0 K3W,>Zzw$ a$,S LOqL|Aw!0xdYRasAfY9q6ZID@~a*DQͤaD7A$MU<|*we;<z(cl}q@ β_<=`tx9 N 3Bt1y#Ά7ecQXlѢzg)0kw6s'{Xp^׫R;1 sK!$b}RMؼ ].AsN홁3 R@g,e$UنB5[ݠQhi= us &J6wR)~s_?}~$Y$huW3IՉdr.Epk3uV/xa(ղ{j#F!~CSݨ6{W\ F!v,Ok` ռԠ-J [~ww[ZqmHLNs:`!v]0nZκgr%xru<\ ?/L ݭȐx֑Wª?zhn.0ұ껥ǁDgS.%XkX\T:0] {>wJpSwQt{e 08±f;ihxw󭱚ʼN1=SK Aѕfj7&љ>RdmZMInw.D=7#=Zq`&xOFKNIV_:*)gst2+Pl&A $xKV좋 1 4L1`V˂x}\[g*#r5W: D{ ]jPt,uL_i/CKAE6ˍ$[@BdD9qY%L,T[ڏdl{N˴Ȳ|?%.—`WLQGeo':Y-TSr2bMשGp& Df[@MC6[ ,P DaF>=f}} }y Q%41N+2Lj/&%ly)ֈ{$/ Ia҂bzJU-9h g. cO{eLp\'טBlNT6lS߽I,*~gkaS0O}.T>4f+zO[oVPudaJoۈ<و3{!8RJމ[B(7|l ?9K\-WӇY). r+:_B#;{!ܾ3XDxîz]J_^vficBkSc Jv/Lقk=TSՂyJN^ j)oﬗ/kJe".JshՀ5C1KiǀVչ9A#gGNe~+l,V(=r l Z#:tql*"X1"Qdq562=67JLYh V_Ҙk KG\;*xK 6Ֆ9rʪyGp d([]\$P_ũa֥CX$ȬOÚ=ɹ2#Ta+\\Zvok $t~@>v182p6gTYPqVa#:w24$GolIVB0\Iͥn&]Rvįn3c|pX 6ƶR .P,@ܸMUGP%=,e]fCp_H[VK5d$:O5ȇpAsIk.fuff.)a1n텞L;hӌ<3/BG(+/XBezGDM(|ą6mӞDA(Ie8mL(%wԵlRxܽ'KQ`WԂ\*yqOɛa{&O \!A:׀n+::ÝU6RAǙ.rBge1-k$%A#Y~x2lӑ)&O>7v&;{//i{&!kۛԸء64d@x2RH)Q27&ERKu.}lw"Y `v@wQǬ P#+`vl|3(eQ)?؁mXf4kT[LFc1{a9A5f9͙LH1T6-ЅL8>HYuY0v]y\7PVcFa5j\V 'ߓw? fBZntKB _3YNHҦ-M;s^{ 4FÊf!|<2Gj?'w'>gb& S:pa˓/nz:b8#nS-&q G%R:uj zV}V2hugz >h/ S/&R>60O\׌)07M190QypJZBz%bM+.Tę=$v!|BıTsA$hu@V)gO WS6R`= pwI̴hx ?QCVL+K#FBݐT05 |*rU=yW:)(O|p/r\pt fʲ`+3l2 Heg{Y8yƽJ~S.~;t~̷s?>*W^6ԸEJKVy\?Kk 6f[L&.ύ^Y8=cjEk[܇5XM=%A5|8̠qnq UƳi,"n3-5f44xuIoKoQ)xO#d&! S{tp~P&< G_ˆ^R]o IT\zیP`p̆:ZVxPh͇#B=@]h]O^g F+L,J%A R A^((J[fEَ|omCZ!n/ز_Ҝ ^ͫdڤe*1q,P.I1{cpOa[f \OyvctYc>@8kLxG3yIi"k~ٜ YyECg#:i4#PI6%#$L]<Ú)(!n%0dHRl#<,ȓj~p.H2՞sjx9r?Q@[z?w^pB,T,/-'yʍϽ30Hಔ }#~<-1>{{{2:ċ8 ?ꙵ(4*g`6pѥDbP\J@"\wu,fl 85,/WG/fѫ  3PJMxi2DyqּfvNi %|u1"ɗsR 5"G#=Ex ò1g_DͅL2YIfN+F*z#W5m^:\wnkfw#o!P VM WԷ+^%-8"T)6%(b-Лpv<,;4 nqV|>aQA`6yA!' XvC0hd8Dsjw%B8O[:3!7ճbTt7:$g×ЫC̺ i $j.b`I`62u%60De<:-δDK"o(g)m+E~J\9c xEufEF <[M SG124-9[A᩿~ag\s3 ѪeD"F'Hk&=H<$/F0%5`j=G: /R7'f⯱Wj~*ug';O*ޢ #g7ܼ;{'KPiπkGD4ξa ޱ v!6^/r4$j.ڬ2Jn3=@OG946-9zU]'MǴUj.)r.Lв\]Bjw<W_"\a{B&PB-{%$1jB8C> {|T3#8b&͟L֖ c!F! 8nӯqͳ..<2 x+G hP0&\ɧ: ʼ#ȝ^F[8d p ;нh)zwPֺn@SF}z E4؆>$L ֪K8KBNn+bZbiE,QJ!c5| NPt׾O,Pp:ɒn Gۤ>鷹V}ױ\*Ibk-y-Scr<cT{ *G6|Tp U/\݈hk6rN /gR܄;wDU]~'|sEImH[J 1 %# ~)xUazqק|[&y2o`1w$t̙@"&E8*õLhV1-z)aS 5EL/Qq9F|_çQ Y߲݌`kl+IVƥGBO/^YB@ Ta ȍgr_iL%~TMs{k.A Í͍dxg6 0V$e !$Yzyr&y;ntqRl&)&9_*(C-${Әr?,i|-KkZ$7i$uZ?Izqb a)Hr09%rGM'>ے]R-Yw Wp/<^̍K[ƷV\ Mrj+40x+Q3&k'0 s+T2mw©}n#j?t]mu_ZuAx#UGK\\JhMPM퀻m&&[{줐Ÿ1 ۫ O0x9mFO%IGx\8b%-rAL:Oc029_n'.j-yZ޿P֨a>!x %p3ayIr+X}F# !;[&β^SԢ!m΄'bS_,ߦ4\;ԩ𤒋T Ih>BwS8愥.}὏*=EG66Ŀ14m !^:MtIlM. '73hƨE t5 zYöqC PFu_ތ8q'E4 6Qhi}U]cYs`9(X :e[wW4 j<8 3zTB^u8=ʁa g7%0{7õ+1y=zw'}c8Xͷg8c2ӐXȮ=73V-pHOIrBڷӒI'gKvSaJۗ< |eNa_} |<;tD/vy}Bc< ߯ imgB" /H-H$ (!8#¢Y8CwhJ$V&VOp. 8"ӝ^,nP!<_d}Ox\btgq' [Tmb`rW[ q%^o#H80[nVg򎰜 f&fGݰekWHL+`TIUe:>!#-ZO팫$!'Lzb!u5oyl:Xcu"IRSɕZ)QI`o\8L8d m:iΈW*hT+7[Kv@7OD+NMs2/(RmT=Y/E`{6k#(pCp:?g#u: – 㔞 #c8kh iB^Ӝ '9c q*G/_8gӘ׵v/5 0<x[ɱ|  MFkx(˙r|j;?E/@+@P4m%ïj:O|43 ^VbWmXt݋ثcmk%r3֧%kyrh9eqDd`qZ]zh@itP=Сx5ߞ#!ș(̈d2*vBũ>Pnj.YZ ~" CaE-E26&%IK1\_Ro'C@'ED*?Z#͸%Zk&Iz 90mʈ>'Powtb R*-I;$&uk~ZBM Nd =RߎmݹDvhc%/hAYspAAƙ =*FAʪ3֋ѧW;苕/O6=B]M~th8,yH*%=>7 oTb}a G8K"3ّ[ϣͳK^,i;j7r"l-- Fl29:8N'JGImqH*q!/8Z[h}|%U\Ki^S_mMݹ4ґEJ{Wjس/_{_۝mtr:.UvUWfF;N'9(|e.cߎILymxd%qnwXzI& IAȀzIu+!N=L5G>ekU,uPn9%^>'םs?pNey1-I耝|] yG~*U1=,CtƤކtQ%¨qR0kEBGpQR XYf@.hQ7oO6>DCip)\ӹ`uoӜ%MxGiZ=Q.w/+Omą>_Y-S>Φ |uwcczVJVUim*1|[3Xvx'ط\[ Ӄ\䚉̛rDj_TK56DM= ߣwH)@vOd5T;vE%MKP}tymG?Uy:඀473b eZ} FUmpg$ϟ{TߙzS?l &\»L&]{;ak{(; Kybwi:y:/oqި~=(ڟ gؔʖUB8i~)&ww<L<%7^ҽyYrޓ_Zv\9n;/BӱrLI ;$oܳӏ$dыyVsR[$YFJvfq?lh+l _M_?)3k:}U|5D1x2>9 1ُ?+up%zB}~?c73گiAX-~\0E˔1eݮ@@URlF;ڼӱ¬nvކ *"T]u4&r[eQkv2Jl&ͣEZ~o%Z6%K=̫SyE&v~^s|m !۔l^䓩0-mf םWC E0zx;,mӍeעoy-}Dr U!XU+܆B5ʥL]EI*@a])5+V^9tzZ/&$wƒ/֝Σ4ׂC/>">%ۇK!jF'-{X҃ 7OM]v)^ѱM =#'< %gEt~=;s:>FG炱@If#ڱ)+$4AlRS+U*+>i^fyKq7I:v4]zu첢b_ tOĴ)!G(a=L(/{( 8! e}Y^]ۥ/:.&;t1|Gkp~s`6w>ҏ5ѕ1C>)Sg4e) ȚmKQu%XO'^LcyߋVs،[XSRS5 q<&ToV!uȍ񏭢 ᝹z7l=~JCl1%RQ=%'uH9͏ai!&,#p/SYzR+4s踗춹 p3l?jhNVBmb3Z3+` ޺T;3>5rhnyG=GX'FQd ]R)nGgdּ"PKH}cZ>HKm5"A 0b]@]NUu熑ȥ5tkE~g e=f,ӽrBE BP~a*lϧy ڟp)x 9EԂ'X+Ħ5*ydDra6d/ A7J'յpWȃ&osf䈤u,QXW'A۞ԩ𚲯J_`"}u~: ̗ؖsk4MeSt1p.+`m?Ne5No#uઽ>uv).507f3Ʋ*AN0셩 M_Q&ں0wq-rຉ#C1BAoVGڿk6_[~D^yy"Ǐtur֮+MB 'A|ʟ\o񦤒Dq'5"ցEGl=8R˘Aa-Uqܑmo-܏0Z+?VXK&d0#Vi`K@{|IG4没%А.~{-sQӠB Άȯނж!>Z^Uh `aWAp} - n2j6)QAT2eJp mA`+\ igKPpĜDɠ!y%gõoתͺLXX6vk WR˗?^m:y6ȼN#,|3T,$kWXsm@P} JTUf*_g d4[HM˾t M%N@DD]rp0q}c89Hm>[ҷYD3*ohay^MkTm 2e:9!fMbDf̟Q|mxݜh6M6T|B+NԷGI}Lѩ-CGwёi8nx֝MAyQzI`~g+) ]fPd v~,~n37L*#E͞}5u  o^viƝ:~fz,7#I˜hіfky9GCjL}+DtzpV|gNy0yc\5pыZ :k'\0"P뤜(%U75l~eӲǾZ{ qBU<y|B"SZ$D;xeQ K3VnÜou(wY:÷Zuf3/V6d5 Tp{FPR!bk4]s _㬆uQ7:, ctB}wKsUЬ ?]i;dK>gS{9O(b-iA skm2P?Mڦyqj[JͿd_ 6p \7PlwGvbxvԬ/zTvlb?<&S0! y#yڕOh>(k]0%m\+"*ce BόSśfhs()xQQ[tJ&h;k"*TgP.Ȼ4:.3jiΏPV*݃2uicqa8pK^y~r_xrX)en$ǜa}/XQ.1 sVDޏܔP*h,#u tk0e2X?Ob" (<&vggfDgǰy?b @~c J(Io.=2l7*R`kc 82[%sfkv#֕FO Ei,&^Z"Q jOPh%Gཹ7I<ʝYvjc`o߫0QR;'-P%Gve7®}v?br1ի IX>HBH%"ۖ4etzZ5&Kiĺ+!(OO6f~Ƣ y7A) vIϟ  cp V!M7?Z40 J4.sS4*e`5z*9o+ёC۴"fLWwfԨrXZnµdsADbVܝjխMկK1#ag2:AeW|O"p V5HV}h/^ \s.BTu1w lJ}xtῚߧLXT~8{9ukLzf!"9ٕSE.!hN`2Mͺ՜F]k#+=]l7Etbiq ̜X{3r̠2 L@ ښ2RH=^/*z+`^8*(i [=WSk/( >߻n7o{]ҫwՇ6s)ƑU(^r,mLQ#lklxgfOvT pNx l?0XM Cu0c_k^Las+bzy,&:F(L#oxea@ "+T}^KK0x 9U!Bd0Y=:`X>]v~}s5MPeN5A)8uPL4"V¹kL)TSm~,@; J`~y/&|IjC-/1Tn.D>+WlZi ` pjÕzd_kٛQs(T qYt;f?3I+.`pdut,m^ܵ KE4_@s$ǮQ"*"A[c/%%y<z{mNߖ\q ΅9+\('Glv1An: ʒ3ԗa9 )"ha0ISyj=J5{%OM%LV8 ;zYy͘pBĶ࿡+ד͢n|Krlمy߫ٯǵ`)ܡjlGeP2* }eޕ$HE6"zE)@;l^nI+ܡtMi :(U R:K4@G2^Yc`"xq 'Uvi)9 475ghEH=<D~jr^b o3ƾG?i/F0$k Rɒ& (!_ q WMo)2xFc' %M6Ao`R.=CIpN(Ih',˝֮FͦmDx\{Y#nK7_'-%4h !nkz1 7@]rW@-_u1nde9f%4Co1W^tU6s .?XsPa kÔ;w;_Q9-4hTR7r$|tP~+EI8$EiOB '64 [^faJ4qsHz8K,,o抎% ]`.H}Wd\ @]f,-? y&8z9㒚ss(M:z]K%.U1m'cs2$G:G0M(Y0]"9~@Yz3n?fB&l,px5 <̅0} M^9*`FtR/ڮTC2flz@^@ V3ia~)mЯZb˗%iz_PͶhH[|kSy&"qsN_<[A)&CWkq_~IF~b^;0/V,O].Cb:H]I"7 &3Pz%BXS= |KX/tFO;Htrck \%g )Iк%]]ڴZtG?quNϫ/DjB^%ȁΜ;g5*W rZR.i]u m7@#@v)V ~{7QRSw]&:@Tw)t,_vߜf|6+~c$NHRR`Qd0mtYoj/K` `lAS*t2HSOzLPAM0 _XejTĮ}g$EK}0 eJ04bIN(<,@$JM[(R/2"s0 jLǨO"a̷y2#{.U°~aMjX$ 05*YfcWBNn nƊvgq9IT7/J5H A Qn>2ly|4sM/H(tdDvzR[A#7+w~V\'LjJ#Ĵ= ,/@4Aڎ~VĤFuZz`O" 5Ҭ]۬rJ*M8ZM.\/?I*; RJvG[w7ĪZ4|bc 5`5tW] Z؊v֕=H[tK'R(TDq&١8*~6pX-BB׀f/YR goiITqeղ!2{W9^M_숒iɈb@tzscF%e ɝ,as=E 'Y#Ӧ4׏UM2uO漩ܱu`f 􄏛dT`#kѫxFen-T( Bpǔ1gI]e\QK#7;uz pI?e0uF|+# 8oºЛZ |ðxh}=PBf4tYM k4LL$:Mz++;:=nzØ## Q,^&!?,(IoձÐO0vm C^?Y$t> >H7EϨU!x4er`56MrjǏvFW=L9O y=5t2[ԛ-XX̗SM2a㞘ow?F$F' Dž23|Lۛ0V̗`mxTڜSK2`K6ǟ0cT.Eݷs(}ڮڊ)G.}TH!D.U g*'Hj&d.}5Ҿl!w Ѣ=sG f!PeB ƅݒkln;cgmZBron[E"BL⍑.Y~)FpÀk7_tc  )(SnsɾwEtNǒv!!+`겘vy!B:YCɱO߄ [t/}]8huP:iM0kl.Ǽ-;i4m%۬Lx^6̌Xh [<FY+S k6;O&5mrUpCALz@).œhI7 ިrhk0N2Vܯeݗbt< %WQ"x}&FRomHARѯ CHv?)V#G]_" )T#"_>||B֢ Wb~yDa&M=ˆ?pK%֚#LT^;}SW] 0cA`YN -MJS>@^ͅQhrǥvkfݮ~߲]q*NslVg] 3 Ĝؗpq%m%  B'gajBeἘjWЙKtk{uA6oJx}p?u! e`* ۜrP5j7Y9v^X/ܨRkkTֱfQ Q3oR:ozBCㅜ6'R]q)JQ}gO\j|"èAyOX&l5Q3\΀\TxP=-Ar1*=lvZQ F_L4Zpm6:X .4;q v\߻"I% 2aL!s28Ât"FDͯ.VyZq5G&y_ݝw}M0!} 콒Zd^e]زEk <_m)4 5˂B)&AVn*a#Gpc^kk);`귤OyQ255Iv` ~-4$ v19eiNRۑυf䏚W0]F'P':O3) b>缾u!Vo쨐 xO mhsc~`xK4]g>a6˷@GHyHɨ|\?*O"Ksv<<?HBv}Tgk3Vt[y&kkz,+Yv` RnA.S5#5dw`.]zT [BTb +N*c1"=WU?e [v ^yٺb|jVֹ)7*&36S0m0C;R;^FI W'^VXC DLtaOR .k FI^wI :M7~5#\Ƀ2ar S:iiYnB(偡-"!`4.s/#sn27͊B?eDߟt(`>:z14Qwn&OIJ #2Vi$!|9521RqTKI8 ױ {ˊ1=+TV"쳵.Fu@S=ί7`giV%50eIKѲ6!ࠛ9Q7VgzJ57|xF9{Ϭ&Gb)rUn$%0,H&MҼBm*\9;sAIwH7x;fXq7wD7Љ2U쑈͂|08\QxrH-/4'ZuiTptLP鷰[R|<5FS1[:kp_R7/Avb-$?ùd |nICa沀æg="\_Zt HQ$Jq7N%WugyjDQ;4/аuy))D3ktQ}6d?I%ӢV;J+4/!:0GxxBtiBOGON7T)a)+rO8(;A+> M ;$lwm9Z :|1̋_*5KՋ{MI}qgFQZ\kwImԵTVdtS0Rƪ%0ܠBԜ0w4QTˋl/rNu/*Tq ^ً\M|?>.hX;"t֍~H MMKDoM0CgKzxHM fY#"A^k;EOQ3pJ0fDOEՉ]!-7Xlh;3\J߈Ȅ$FWb~j2:|h+xƙm+v'o g.v;!n~j*Sc"2VAK&nT~;]%w.A&I85& k+o N,asK&,F/jGϵy0K!T:ќ%DZAKm|aNCO9_Vȯ&9l쯌2/Ω_mc0,~йJ'$Zܗ-89 蔮60 +"ap?ǫרNd}JOyޮB{0~7Y81tdدp+}b5.y do"\-*P>*s=F77!As îgE,3]H< A;Sխ/d`;[@JWG!LK H.Ijl$+We< 27#'d(pDr;ڸ 郇/vX޻̶6OI;J;Ė>-1UWZ!nT A+**NP2{rz/$K7pgy`bw'bj"f/KI}8DGm!3 FpIcU͍yY1d{Y㢊+ˉ6^Hp_|6azj'0]-,Uo fRĈ8yq4\3Wf2 b=.=?M\FxHL^R6-@. VժtYA6P7LZǿ^2iu`1 M`XZ:͠p2- /ÎsM~猫\v3F7Y;?4ފO|Y!]mu@{5wMXZ͋"P$P1(dƃ gaY-tK-LPFU3Ӯжw? "P%Gv2j~o_x]W>7`Tx~" D\%gr㖪BGƐ` AnFεx/'a ak ([eb`*^Ɵ`8ےweN"v~gGOBYh#.PZq|+1KB>mFb2*W #!8R<93ɨ{e*j#Z6 6?8fQ+5 M9|R-ŤlҥEp7%061" ,?+Jso/ FYrN,׫K }L뎠QFvIVҔU8]oE@.~H$Z_ѹ[bȈE!R C\43*8ev3'W.`"-?:[w$ 賻 A=zlHv1=\ %ofLe;FރMQa&EI9o҂MED^lV3&Jr$ gr!2؂,*g堝&"*%"YKK~ۍdkǯḘdt{#|pɧ/E +ei۾Z Bd ajL70ȓ9F$@pH g@]S7ݹ N~-Hva=8?ӨTVVq]: 5PzLzQA>=2THDtw^.>fKV;nS,D>jP^u'/Cv~ ;&8y^U HQE!TU]ЩlGYh0f;T84i6raX-FEU?qr:T1aC2MH.IK٦C {YE9 ;$j̈^䕥 ~HXrn SU8 1_?ӈc4HH 4$:#؞ T^Wl2ʇz*>6^&Ĵtb1LX;ԊyQފZJ +1fX! j^%L?4دH |sƘ},~d 5P>F~ EbC:(\ a&aaA)FScſ4ʐ& Y_m 8ҽ5 CQ0̀.氯"L>IXAc) MLa2_~PMta=w k*.4aeqB! ]Ln{X~٠T u}1bv#$a֢Ku%gf]}^S},6_瑼*Q:D=ǚ9Do Zcv蒌\ݖN3HLH&0)JAS տND7Ht4_G8J|]$N#sTXzt|h>|9ݍQ(|:I6o6u\9S@Z8P':-?D1L!!n뾶ͳSXg iHę=-g퐶:rOejaI;~2JHɺj6LExj |t.GulJO@ȗO"奉$BnNSG"4Gndk'BmO fQ&=+feӧW{u.ʔ nT3Rdn',dF-|&7XNB9xYpk9W @}Au}.Q*A%^;(EˍFC1ϖ(̯{]'ɻ`MXɖa^ 2>dtqn;C8̤¤="W*`}lI*S-n *_Cf%>!,DeR{ZE>T3uX?uaʖoJ\l@kKO&,(:'W@%ؐu/`t}TE' m/>ՌUP WXr0_9)sM [7۴`ʆ=Ͽۗ Tq*lXV7 !/,# 4KnOHk1X قõQ)9W؈3jCxwِaQ]Է#,Zt[fb'F|X+Grk@~^48cs7td{E{̶TߓWI0, !ڎ#bf@b93`3%f9y:Qc.IZ1D`S1_7s-K%vԹv,6AD"yƛC$;ű@j놚Iyo{;3"u V}k&$o%0PtVd9_ ;n~*t5! Jf枭'dYݥV[Z<&ȩ#'R" Q>nY)P1dIZ[@HYS YGJ%ߺQe$X=&(/e ӛ$m2rQTeBTqL-c6iH.^Cl3LU5|xR 5IѬ`vlP%n%be3g˺\Z#QVdY&W j]rZ>ņ8#gq5p>\>$.>sVs3VD.,919mg0V&l9$S߲#e]8X<L)3Z.`ئ!\]Mް&S h10:Jru"Q[O`pZMoؠd֌z ƀ\!5r*bn(E?|`N\ 5DCT6ʊYkOJKN"ok4z?Faj' !9pf? @.+-؄P-s_RٜUeG͜%A+0~ O+Te@cN͸#軋XR?PZ%KC m! L'WXM{8)+rϑLq՞l$-8ST?_("\vyUp~ Ec0OFkKg]I[I$ژ^\Lkin'淁׳Tt 7!~kI\+a`o!/aDY+e/Ϩ9gj) @KrmrˤnMp&@NpB/ٸ(.qo pOvZmCN*>qcW\O.#+BLʛe"#1{y4 Jl E(u**gvVIod>9ok;@G髾 ]VO d#=W!WFF^&L@ ̺fvCAuF"& ^n.:C.ӹ""(?)0G5>@|vhqi}\J Dݡ \tG6tl(, i|"w:j]/VP\Ȃå\zR|Yk)׈*%? ֈ~g'#`ut0x<S+ܛ51 Z.>L(c%MôAWǐi^a"O!Zu l`!n1C&2ce c *btzy#% 3Sf@L!#(@,O&V/!NIF%0b@Z/`N{W|~(VN$r(&?߀F\'аBO4 {8`Ey~%[Sż*娡ƭ#mP]#.@-$&I| _UPnJx. JҸ%+1s/jG(rqTU`c'J?cr7UE)<Tuܺ]6 >,aXX(EZ%"9j8q&.V$HR`󾽾8LIZ-1яQ/=jKg~ tF^ &˧;GJY8/acbU7c!i!QVMSpd xuk:iD{~W|G"%oQ8!/[dʸ֍kOK-Q &@b e ԛtz;,R,p,vV,Ĭ@&☥t(J?6\^_<Dž#utAps&W{e#[)d3 \ml+o)tի53O^ CJYGg!gSHeu D5yČB;6--\_#moV:wPL Z~[ynCX,gx\TUT+,@يk99/M'+-l"=adcCq.V(B4q.AZ bgus*4Si>&:e#6ht񹖞H|tBWvov({̢__b-DQ&htٲOz$T?rK--@ՙRou& "T7fepq^1'(%fj \ׅ +5k?(u_·[m^*GFȒ6VE1HET=D79Tc8Usmysu=nLFqFL<|mQƆ3 &NK ت+*9 a&!8ܜWpoQf: w5;RjR,[\xD|Ei.c+&7t4D3sɚ$]|sXP͆ #x.Ea Cj-C6r%yۨ=IFʎ ϋ ao9S!l85UXldr1brܫUJp~ Ngj4C-tO#5]AeJ%o#*ݬ'1 {tժĊmN^Ĭ>6cZG/fbaxaxo_BF[h 21V>3?X̀qu D:@'\ aMț(9Z.%˵hd'NcF_*m/+}Z7pF(ͼh.QUWƫ1} 8ѥ_kL'"8{ @8W 1y9*+Q%Ҽ՘[_-_Uڑ$ 7zH˭tvzZj]@;^$Gr *MrYu6%{ A6wLsW Rz:1eI6[2@tt=I<gzʰOf^cۆ˸RE5:ByQCU\уG.̲)Æ*mȑȈr^m[JM)k9"2!l۞=?&pf)|=%u;AtʰY-PZ.ٱD"hx}/9c |.af‡X0m6P\WūGAC̗ <7  p= ]E$U,8~d,:U@6 .͑xfJko<EZ*lc;\ \#M6U!#%Au|,لjQ 4 XF *'7{қMzg9״tT$guJ bcxK ]V\M}~Qt&_U$4* ja ]RM$"oMax~J1zip1du9 RN^!ŲA dd 4OB<&¿{f3GN(2skws9^o804(˭N%^ U lӧ=pB' X;Me-npQOǏ%L6^5<ic?ՀjW}\ԧ40̦s:lBd ^Q "{n4~._(eO(aDKHS:Y?QEMt2{_g0|SpFqtYvUSaӈ>>넫u8#le;@ O,"8gJRLSCSR/ACi!sdEy_G1Kö,kj,I4mgaJ/ S6bݓ]"ߐS,Etܺn+Ӯ3}bgΦiXP[iYO 3~ԸA av&i{LaPmoxF9UZ COC_w~Z_d/~)I)DQ=Z @PTJhVe_Q)'So6I)G_* g-އsDnt(V-bąV)J/ 5DpBBF(]h?E9lt)޻389J{NUP2S殊`R4*={~oA($-9>LEE'I~A0STqf 150(I%҃GM() ?F\(C1)578{.r & fj3t5)VZ+4VAs!1qbα($B]WyXlҐ+n"j: tr@POf"`@}O;,0Ph*'ɕN]i;`'Rd]!̀kG7(80742zE3=B)׆v<\:~K?Ubʃ:w&ݿŬB+@C@dܚ` ?`$VhU{p-t!R0Fu)(I~=ylɴCOQ}WE[ 4 ԢjײW70 mw Z `Ȅmn*ln*_V6lBɖ 8x1$&}\PE x$f!R :zR@Uriy:' oauGܪk5-3:$ *9լYoZ-[ 9iTBD*Vw)AYY1{(jKO+d <=D>]}]\֤xAsve Y&p+֑c3qiV~B^/D"G1.oֶyzJ)o:?N@@*@^&bBx6BɴD &BgSwr_T4G˗zEj7sV鴹E˧|K/38f\nGfϹ-ubEBsͥǴ.~J>Ǐo藄+ﺸop೿ ņ %4U%:C%i㠈kq6y|OSYЖ0>х9u]'n5<;&wi11ÐӇ cDY/~Yx ξJ0j QU-|bMm\n6UfNq@<|Oŏ֌nEs*[$)˲@vb hg،hlj&eRm;l-uSBihKG> bQ|ɲG"ce멇^2bvj T COj>!/xyOm_$@[[̮[R U1n̬B ޏB}#DQ `olnnh8Wު@!ʹEwdHsw uiYlD\&ț55sHK֓ĴQwa|ܒ}+ )Y+)I!]''jDwTz'eY'&z o72vJ J3g֓ȚiB:iatG(> Z>[2 :ɒےһkB ]{m4T/K (ñ(5jeQPT&brHQ >H0 q==UI{)0'8?Au?׫Q|K 0%W"iL]ЁXx'So>D%?i(Nzw%1 0Ng9Π[@(ٙ SBo]L<ڼ&L}O[d`um5FdωK*b̙vFCL |;D`[jc,­G-SEw0>?AD[{x7F7[<~.ϩ.v fiXFjҲҦ<`MO0|{-\O y ISX9l}?L-p2uE ֙]sX|9Nj"CcEƖ Cp T1^XOVFz2h|S2vv>N7a,QGY=iFlsru+wZLlB޴kƉ Zk򀄕 ē?[ۊywTY)GeCRW9?xg rŒNkD3?4E7L8lCwp>Jw`&Ix"AN0qz˙LT 5Hn{.1k]evc CdcET7#ѳ-id #ђA.W[o :)9Tg~w ݽ:٤_#oeӆU}_'ǘ,LHmw0A HTuDO5g612>Hsu'>LO vjJ}\jm.܀Z[UZJh*^_[oNk>DVh,[vd-$n.k7w#-67++g # ^o*aPaӺ847WĘ6 xx/v^> 3ϐ Ta"K`WYG6dٓ 4>9]U-p~J# s͛>Ga#$Y -ϫzpUf_r #l)SfWMQK |p;گLFP\P3EZN.rYБ3g\ $|6J ̘b[>0Cg=bo4>!<vȾø9j5c؏O{^HQ`WFis<:r+ٟ [ӽh<)-e3l^`y1f󋇎@ W?1(+X'X%_1l;MDS܌ta/*LEGG 󙿗opl\'w[麢<@O(RN+м>wRF;/ǮuB}2CvL7dʟSSU2 D$pao;8UU$84 {2gG9?1|-0f gt2PY'V^ө­kJ"&]GEzىU1w$~ ͓GqۀͦgXW͵JP8B#毓ը#x*fm4?E):*3("^D) {hl*#']ԼeN`kg43sNkQtv¦&j:'XQk4gֲd]cP6k l 6/T%~:'~A":B*]Ph^,h$r]?]1K2"Y&p1g.DqAa@g.Ѹ!_ިEp?sҶ hcN6yH&VEAO޺^^@"t&]/` PB,iY*\'HHQM}vZC^h3̿} =\4/$_Ǥt\tU65x Dۓ ƻHQRk=;JC;\u̎Vy;Wk]5că3A1Fig|ab[.3 FుEׅkփaplI"pؼ˄Z'YY+O]VT~[O<^n6&g_'A<aU\p1L Y"Vq}q~\Oj o,v-~T4VĪ׎Ys=b-1SEP[쯸r_dBAXF?Nv݊Sm]rct6c MFP T(T,?-Lnz94GN@vBSD$sE["HMD$0&@{n],TqK/BN=! [)Ojie+h,B! ;87y$7xcHV`&nM4SRǁN!Il:lCiX\!\"d.hp,ضgԩ[Pi|@z }~VJ^ |xvXo8{CzL(! x$w/Ş=|)Z[lJSWN᥮hrnOMMNBUoLI".Nބ_Z.Ŕ+0D,`UL~0~(oI0[\iœi:'4Ќx~JD1}V?:fbc?Da0>ap8Z C lS͗Ek&t7;D[h_UlU$H=% 3vЧTf3tv5&%kd5NI)ʓI}.ģ e6cTC|:祧==F}08klQ~d5;$!#ofMZ6wm10!'s`2LJ{K+AS(\)spFE F@"f1b8mk}5 kNv Hʴ823㚁A@Î>)qhFi ۈwpG/ *;%.a#`)]Qk86*ܫVLJ@iOrωY˴3-.]XPwR^=FmK2џe=3At@yirתYHJߚ! jyγyfXp2[M7,31Bl3Ge*Y d9->UDFcj' 'F/| lE?ZxhF>#hcm>M }S\`Y5̂T kor2e3!RDZ5UI)^{IZWt{VPNn/'`q*mލNdݗ5r I@CǛ)iś[ibiAS_i ٵq/@akO vh 4VVƃtՂd hFG~ZIO18ȞEY޹҄DaGf¼|-bvz)̷I-RX_HAKlhCbKu6gmE΄#Mh[5s4')6ӹ9xKrl9ڻ:im;"I>pUKHLF^U^w)sNNډ8H j3Lv9E5O"Aѭ@ZJQ> #*5? +8R~Hv -{6#Dz)%x0Yݸa%nLJ3ƹpb|_J).G 5U4Li"#@d/dI[< `TO "J g9@m@38lqWjq05kaI> %n \~ ̡ L'[xrXw>9c v> " =ɮrv{Kf5nIh2luӸ~iNɢkJr$Vđ)qe'brLVGUF;Ji'5FV?k.br G уfpMhvߏو6ԝbEUSqXK(;3O&/-U0n>c U]s Lm'i=y:s4 >P̠V:#-(+1K$acK}QXpKq+<`@}_qv7ɾWO/iȃ*|T+%D&s6T3Kƥlq\!=!֣+;n<(7u҃0pibCc;} W'N6v_0w\_y0ݾ(+}2xi$&@I-}e wU;*,"pRog]v a"8hb^4ZMS٥Kڑ*[\.:i6Mvj)XXf`yeMݔ40+/ %Y}^0R x9ZB:҃Ó 7\ \<,\\& x˫l,%,\ȶACDbԦ`Y҃AϘcn=r1>g"-]x'OAbkl@(ũyZ)NyyJb5#OADDa"ôy^g"=VU_? PlޠSn*TƪmꭴP;tfM;1: tK㢚UFo=S:BDC~ Pق$:RmF m(Jϰ\؞/Jwgž  ˆ#0 %9@. + YAUgnЧC@^yK2' Y s#`!p$uU]upX_‘B< l=ml}OT8DoS~Ywufu~_V^;Lgbt%j φX JC#47Y?-lv: ;`< >IGYgiz߽®'^zi Pj]Zڙȏ>HLmwVܭ6cD| xya7L;*a`A[5Ҏ)(JMr$NXf(/_#%z2U2HCbKz@eybi yj,/CA=m4 ۓqAK- ,6=H5qwD,-@OGޟHI=U!W'5 'taf 16l$ 4ḧ́4^2}QVvs`u G Zx>>'qB\waswUQ"v%=1YlH*FT1c1,5o4!OE"IȞͬ(>CSɵD%Q8}2Ӭ)6FX:W=Z|%_$&;^2?1khЊ{Wˈ25T\4VHr "I} )c[v\'$ zE=-g\qᤱf@BW'6u.LT[$ PB2D˨F*@fJ芊Mvk8 4=QL؅m_K <ߘӞȩD'OVsRY>ԙ!KPy5(󤤂5 v ܵO`ŕonJT&@K#m4dy=!d˴HihIYܣIU^k@v4e_)볌Rb|x/9{ĻH~NCkHo8 d1f-0hH3x "XHc öcA* Jzlpؘ'>QFkU#L;!ng"71h-^lJh_ >j~E{<&x#'ad"7AVr-4 ~gkCŰBɪv\i|`P,K_|Y$20K,-8a%g|n sMUS(B#NJ.')ўƦiplIdB]BC=?x]blhToY#IMQRT/ R :P%Yh`+9rK![UjC%!D֨y| J9X tMgpP)ߊsBNMkSa^_Hu{rJ=fkq %LOoހnt|ԋ'ʅT:>}ް-g5uH9_@XIn>1̡sd@UAq4*$W`%׮Oc|q}l$V~7(iw|뺻|*9,]YKSX 64#,3)3m^&gDn '"U[e#ԣzB 7,@ ŧkWtf"Wߋ-'llE,5!juZCb1P]Tz`5ʓpw iO3Tuq$'5pOX: `CaAA18zC¯_iV t q<$䪯fXZ֑2`竁 !6*Yx`ТZt#%cDDs!A`nFhcG,JPTLxHR u[AicX; ΐ_5%$;{xF5VoSt1]1 nqJ,}@l]Ap݇mv>1_jԜP##k [KR3")<'۔C=]m2צX?f`ɯiC}L+m!6䬙.e]̼ܨEs@KvHK$ 5~M+'h] D~Z]Og:N-י:)|||җQR~Xi%Q͆q6HFdzA/oX;Μ7Ld&B ;ɬpLfn#e32DWņe|-G-cPv[d ]ok ߭=nġ 7~SMnR)faku1=L|||aa"%/=p1ʗ<6CHO"Cnr,܄=7n yF k@Z<~oȦ5fqMgDDC;\AJaKp- $k9V=D] [;' FIl,ik._)1gȁļa[aLDwk>zn|uHLy<9S !u7iж/7~Ƹ6eg>Ehy(3렅[] ݍcՂ[WRژ'|-IK{u !YD=[~ĬhxnŐ&i^ՈӬ$To5 `M`ƵU:ݧ'QraTƙyU#F!#\zl`ӜXMay,HHqZ Ҩr=Qrsg=&[988EK[!0Coe7UԻ~dC(v-m ̀ %v{_e862NC[i18Dӽ Od)ƏLq\jMS%"=M'|OK7pf, Ex`0 y.a_2-L2!2zSr DJŹ9QO[ do˃-;,;*erM9kYu9|'2zUO46Ȉ<*˨tO %Cg$μp{"~׳mqIQ*?,FzaBk[r7u*6i2(.]lO5{kz|adR7jh558?^o gZ XIi,+oFa 6>4-@懚:Z#تEHMyummt77]aO3ԩ's=~e2_-skRƻ44f5VtdTY 'Le$\ٻ)X+OB]0F0@e~c)h-aDؗ-"f^|>'? tG#V`rY_PpWוN`d#Ȍ,R=h<"\jf.OzlYX6}L\7[[V-\jCK8?L Y!VmK˵olG`xĴ@G_6҉P.#A?*[<_4mSTfʆrp2U{r0NT~pr1q ̰-SzVQQwએQgzyBL Vzkٚ$qQVR0k Ss a'ŰC&y]eO4큊Z$DHzAQC^Ѫ z X%bq2${Fյt41.+fVu / q9qUo?n: tۀ!)C(sfV.XK@Rr- Tsa<\/f@57U22k< zSZhyk/2qmZt@ba2JndǗ`YX^"*gq RyąwZ3- ,یf!^q:9/jnh<MHȘbx?Go@G:LUtf[%O@,OGVm%D JdJYu_Pm `%xѠѴ 0Z$|,(A8\`/1goաM6H T#zyN';ɑ/tz2#$6b WC6~k'($g10Yͷ̑$4'%85%]V1K\ 3r=rS X~`gnt{0WCnd"$d)e;'wU(Y7Ȳs\90g`*UXkf2uZS>kMU]蘼۴;{=$+Hiyr]g(g\5GqY:jR|) za!NQz <0?8;⬃z*82݃y\f]8}In>'$V `@ H6W{ʝހffm*&hQ26V:HU0F(d[WKT&Y4N]g {i}Ys<3`' :Y}RL ߭Ȓ :\^z @.aZ''O481~&}~pY&&0,\heakE-SbJ b*&.t$<@Rn~o(p׬c% B7ق{P*3 WnB;p(ڣ}nBbg'[ P<֫x}ƃ0`+b5ecܭDy:^º{jk"SIgkpK뉫.o g!4D ɁJ_Q).2Շ]N|%{] uK:鄾IAԐ[ͅǿ@Ҵb{LǍL gp[XȰğ1J49ȋ:/m7gE#f͗l J~ˍ ^/4xf al;ea]9k қ3*2<ޔp`vm5ĘO2oq Wb8[럄wHzճHxM]iSKYLjuk#?ZUt"OK\O qX3fFce*v;kL*vT&& ?,], F8)[‹$CƕIU{F! R_B{Fx<$9^kg0}(m`Zl,s 2Y9;9f{$5?  ѡ!x,g[$EqB-+Ts_@A %O$y 4#9¯ \^ZmC2˘ fe=s2AE;]?۩T|?w"cf33?$ȱKv}zK(=/@YB39صusmEܪZQ?Ozo]P]_MSYqmX *nvMU39ֶ Nw7(]Y" &Y\FR +J}P !| Md:R礹p)UoKpu 6 ;?^/c$b`IThQx? s=Xv6l!? [&{O]Vyc_5ͤ8<#B;Wmtm{CN-!u#7/^Cas澧nqBE5޵`CahܖFRJ${ߐ_RȻ]D/:v?hOd~aj?So\ 3GlD'qhZ%I*OmA<(0Y V/9kjQG}ƺ0'oϨWV9h;9cwό$Պ1q?uBKvL3}-/ 5s#d?]K(exOo]$z2|WRږot^"22QdR1_Cf#&秪S;t}Z] "Z.O3lx-DF? $'0vhĉJ`; ^#.Bq3TEvƹDU >@_׊^,Y Ԛ+ѩ;IaV75@Qa{?y)L^6/,LoxNŔK)i` '4ef2F_UZ4hT>4ef꤫i,چZ2 L'd5}fFkՉp?,u7Fa\j.$T^+:ל@*J J/7<5$[;հ7;^Tm)"jjl{%0[_Mr0#<ªp!mOZv+sVw4+ԷZ=]6-eŻ}ɝjxoA*Ov/ Xmu-1=WnV*Cv|R9oP:#JydK+O#kۋNj'xͻ󹊓~~:'e}fGiGn0Lk d(mNH*C ԷX+2EcH`5@Vɶ̋m"~Ց?2B!a}UAR!Ɣ?:8LR,ItToDqcsqȺn Ob0j#Nn'A&Keɓi3AϐdkIo9 _4cAz93 +97.s=h4eGտMs KgX;B J[I\*i8b<2Gk>@%w0nHxw}ć&^^]֘Ϳꌋ2ό2A{O}6(#optMcjا7Dn!w);%g whF7HǨhFTs!ɠ lຫƢW6撞 suUlJcL[|A-"|}Bf7ϞHx֭(yw[jx::=jDubӏ=^B Cou@F;8@K>W9/X )VH߳gdf_lSwBTAߝ-yBV~&^l߁H‰&ZSog{}ת,XUUڱX,.M!}M30; _HQz%'*Z/42*SdR% 22қ'n) m7{@d)}h sst2os]Ro&#S;&oͬ\ʧgE:o5SZDTi|pdPm8Oz"u/t*7Y@{ik#XVDQp~x ;0$/9*Sy Kzg/]jTg\J=y=yc|:b[cuSzҽ`a*V/ހt(/nh1,D^V%O߶N5o`~QĔ'Ĕ݇ %+trس>,o b* K I~Jx+vY;ӓ)o&iQnjW ,l p{3<-kwg8[K 7X N)L,DbAUlәOоݜiq )%^N\ꮩ k16홁"Jé@黴"erQUۮŠU-m###D_"b6.9jW4r&8Gی^G/\~!THlNRTs~^hxu6o

9 ? )2(:-ۜ(:gxaVlJW}Q)b*Eإ,ШUO&¤)8.Glr/^w~5FŔBY5-zg.o: j[(uq_D OFq,BoA~ vb 3qdɑw R pijIb,BbښEth .TeO-֯ NLJ+\nה&&J;MM3bx3%=Qy@c3-Pk,,H*s"6xwϺ( ky%"@#̊{Y«qC!^O - ;BK$vpYAhSq@pb*,xޕTngijҿ]ečW n~;c]e$,3r_uܲYL J-{՟Xh(L鿾lkW[3m!G%wI*B6mO^~mB@7iiN8UҟfD-(گ6ȋX`FQ|KM5]$+8 Y+%Yi" ^GSAU(B&F#N+quLꭉz' }KwH1(^E8hueI~#ˌ`~%áݠ}"žac޼[c䤟ظch#CU2+ ԁC Inȁez~?ˈ3B?ezn+lx=3ݑҮ-Rئ4>yҜԄQj;e%=ВJ/cwA+.g[Ck ޾,nxEe{ uw)&EDv6Lf7,W: Z .GG)ImƆ:˫ZPfQ1̨yU8WSC('lܦ^\zAe |Qۭp!hlk1( j ף)yXpo"-#1^^{HF&kA֩E.fwmY=Evm[O5hCea/NpngA ltZ-Tm6mkCM$V8)liT'/luKJ":YQ+wbO2Gsi&QF2G '#QP"%GDGP}6J/g4%'Z ɞ29@GgVqQV!^ϫߧ OI :+ܙEX mDZ͈Q42H̉N|wNTH7_?ib M.+]A MMug>A}#Lp mĖN]YlG %^ZV{6j)lU qjg,=r7ǧVgmSvI9(Ύ2Z:[BwqVk- K@r8_LXQ=#!DU:g+g u@H `7D_<]ߥ2qo] <,/^ؠiPTY47 #=Ɨz=O5pH 58D:5z'N,9@&3$eۮ~SFۏx2GIHss&)@jla +o)IæYioKXX [*9k6g&J%n^0CWjP;VJ"ϴU^t#6=C;9"}T~gс5r@`4&ƁmR?._I~SMb7Pv ]MX=LĂ yړgPA_}GDI P,[s:EwVR(JZ.@;Ap,ApPL,9o# ?uPEiC!#r bG2{%;ͭFpHlu k6`[ts/ie)dŚp\^:a&XiM\TM4\*Ot;,ƿ&5Y\4`3כl2qX윦(9qJ u0 6؜mJmF̡o DR8hbI(Ɨ&E]Af5LԪgk5rn耫 (.;V\'ou2Ԋ)ꐸϵI 0ebߵ^3T3Ȫ (\ӎ:_jʈ0;ً1SѳCTo֊1Yې0?bNZ)* |c46(%ӥOvp}S½g]z+ە $l*78"xH餰vQto k tʈaoo|q4_F|Owۜ= +Z7\bBv^r=VBQ/E r˹uA ( ҩ I !5Bs`X,R^!09|z%qw^XBqԺe~Fs_ } GgX) ek{)x7ui~d?VEMC8Ԫ"廊o"1XxHTiz|jŭ} '1rv@v3 }h 0߬C>bt}{uMt9gSVBwTX4`&=ka?)Tj/x-y~ v^e;}gOlMZ`5S=AŗRі K%Yz/YN ϊx>xbTEP礈茚Ocؿ0$ALƫ[m+Րglw4gEkݺ&mB6i歗6Ch+N@pH8k.5_tmpT"1[9?BD tOl֡^iSmt:"q IL-)PK7W9KjOJ9"c|/L8;U='=*'\뷊]Coh #33.oUDB H,7GVT?b3a6lMGQP'K _ &HNw=Fvuwÿ9NG+!PY nFlfIxd Ou#K~Mzb/X|G4#OG\Y RApXr{I1L-y5 }OFe{]+Ҽi8J{6q7:(dNC罶 ]0L` ө(mѠ׀0^mJ@Ot]hKfV L㵕c^tyJO-C6]Jlq{t_M͌ Wq"M,M =;v qy0 "D A5Qa%"JsfxąMCv۸ug:ņts0m=YoFî8U>ai-'B=9"bzNOcjqvg< |7yo!J{\),[3 fyL <c3gnyo1OHQ}Q AVb v)-= r{ŵ~]tT1=̀x03`6+A_Yd%\.hzEO Tܶb1jKH1,,[t7W$7h4d i1oA2&"9$%3"# (͊0K w/."7{>* +!N/%<43gؑI ;h1(\&E-Y݀GHA $+փBzO*)- IDNKD8j\V\v"'z1# I̹Տ|ȮgȠ*WgLTך٥ff@ApV%)h>z-X?%A=ƣpɥSfZ.n-Z%9*b[CCIjT'FgjXA( K@ M`w\۴{য়+. e5 x"qg[EK?.|<Ѽ*\<,I{Zf:3x;j쪪cre:,TqSvJBq(:@iKA[U5VwNvxDr'ƒkMoxɭ EbKuv3؈Oz4\*?Nz@hՃ"xHy)締4ˮkkf=Th39A/B=dq'brYUC/~F=GtRэ `ެ)dc*3 rACZؑXi0 >7u0/6K5EUGS} 5g`d8NpwQ`%،G+dYJ7Ejy~M`RC2u7e97vӘ*s":F*U-wȅBX8` #!>-dV*a^V#4 1ؑw1qZ䣇.EWC)4r)j9"B}y<EQDSHZo:i)p9jbuʖ +a˼+-V%*iM4٨FtʃG1ʢk'1 `+/QA5$4O7Z/._qD"4'rUN줎1HqQ[jCBM iڳ5Y[/@O$XX?qt sp\ܴ$C.e<>Y9~6pnAZIB`` {J)v'|oP [$ňg8)2oGKnh`*ѿ]^n~ImS va2)Tcv6.;W2 Bv)yAJևo@=N(, /+r+YG' FKsD}B2?k (D|ؔ$n⭱sR͘תx B3+s{q g6g/h񿓤LrT9sYl4 a#j '|aRӧCAen4ʁ9@ڂ!b;H ᄆ.=T`Xѝ o,{>Ua{ֺׯkiK@ri2N㕰ӄ0M[_k G 6wu4POdܥnoyhz%>LL@&FFqH(SMeȔVrTo'>bD]Sv+~Lɩv/0[Ldn—b/]At)aSFT*pk*h &ıMT 7ۍ5DjFZVNx/=2bv)edm$6W! Ѫ&cѤiJy>O'e@x{3܀WU.I(L=Ir =ʼM qE$'VkP)"[h{Flb0!HMHbM`ee@gN}/fL _\oujr?R8U w<2'  Z#J]úH-`=\6b{ RlOJ9Ao7<{8'sS?RF%B7h ]w>euNAv0;{X  [v"Z[<=tu~hܧО27!-D{ $_WRz;S@JD0t#?csĠoD:S[Ph#x[b@-`RVt5 E>mpBG NBe#[3^ y&> U\k ޞ;]E [FJjCO686N/祗!>|m|afީ_+gh@#!x8軺K5z[[Y_:6D0**Hk2o)cL%Y"6U6zF5/,M(߬9)6Σ@*/8_ʂ4i@_ V#H/{QTkI5@_xx+ [[Deԭ) j\9 Nwf+NRkJ%,P渉J\1{8hRJ[LE X.f śq)1LoT֩HEG}^TW׷\{V6. oBnʐҠ2xÔ1P}|7:,5 nDz{~װ~R Xy`]%]r?;HP5o`|?biSH/Yl}|LG'J'buʓ XR.Wxk`b#rPqgpu R&!]sp8j0zN cdyND"ڸGFxf}vhcmz-ke~38 qCaQ`$=SXuEE5tCuv|%(!XG^0@cRWDi-_tTB?U#=hYp}f\Vt?_hO绖hn7G% *O"UG4[7=Ӆܽw;.?#"6p,RΫ&l *#b%98|"\/RpPR - jMl)Vyܓ{T3BM+VsP:[ot$c~?S}#HE|OH!P܌<5T4Mp9쥙>yϣ9[Œa5 X=Y+GouSHc+_!C$C'1rPL1$OF. v:R7rm_iv?cT +K;^fxCB^+Q#NjO#C=+6'R+5'As`'7\p% +u{c>b3u ᦻ0}A:R\V}Ǧ*O@J5 ]Af!涵6:SQdIf0(JB÷ #E3Lo,-RD̼X{<gLRJUprў̇چ|:R&C:#c8&PTK*ҀOtRixi-A}9;kN ~H|2l1}E@?va|TC7aV7X - =PQe , 兴 1*M*\Б/_НZ٘2g/-̥`$\=6HzRu, d&M2\!`" i 2Q:;_زTG[QUnMNJV,8D 25YXn"IBuz$T;kՉzt8$9G;$9/SXy@齾 -wXy\S& sk#lUƔ\e0|QsUL||ܓ\[F- RyVACZ){;f.;\x% l1`[膻K*՝i]z<K(Bׇܳв7IHC fE>P @@K \5ȂEP=scd`B}sWcmAx7W:S | 5;qx)&KOA)يZ؅]zM[NDҎ0ob,im;o(MlcЁuPbv̷ *3j^~љ3V)5`[/rZR 8ؒ M/.$Lmg[ʖO,˜}Eף XQ ֫' 9,'!&΁I=M5A ,e:UnP\N`i#yVX NBX@Z`l4%β<"bXW 3r7K Y |H~km_^;:7`]lZ\4^Ns-.++ v7W7ۛ5vC7ظ 8uw=NwO zxXu2n4V/d-\UNξ%d)>`_DBFD̿AL%⏑rn7ǁgOXp+M):ԔkW#񤨊H3{ ?I FIj-'# /8c1C eT؎du wv$/Ea9ʚb"; Gj+9 -/\1\d[@c qDN1y?CfՈx]0?bZ7ͅG"s)j~W=Oڊ-Ó$ ܴpB 3M݀嫖ze*;av3^hKhjL[,4m׷z??@=B*̓>;~3X+\.ƺ4[*3"8׽Q`iUr&#mn՛Tq%9s9ZkqVe{$u@&s 3,G&9urn_cFa.pMZklHd6}GP }ӘO0f#5ȣZUiz >۟ j~aE{O~YT&|:a63Q?^x|Νm8ib$7)JvtIBf#ցnYlZlZ?:?{/~e +F©xo? R9)'-n󡀟{ $0ݝҘQ 6{ϧuf>tlu׋{NjdzwƱRek>ŒYғƭޞd%l䀑l#Sn#-52 { WůAAZ!3/)P)iOwIXv{̓7Oj~r(3'_g2ï@]*$ȋeYN1\g}W._^DYnEGA*8֘+V> Ji呃Tȫ,|}\ !I]Bz3yCz e>!ڥMZ^4͵6LSIS;?k[8\OFم9SGPAIiYElHnpovVV=[G9n"#6S!~hK&&kg,D(3\-ł]%=8c4\Ȍ5]dw`EW[:^c~1AT=c7wX1A ]WJA]PR^%{[akuhJ~0!3cfrįf!(őtiGf{aSUp,F8p΃7ݖbwg 1/"T%0Ϲ=Xde.| FsZϯ n.5> I]Eh.ƓNG J. M+vYy'b`GqC'ӟQ:F0$Ns̆X`}z&>/pkI|(ر\SsB4 sɖ8qJ ,j\Ak'3QIˉ? Cfǭ)f+{VxIjxԨ~(i]S0ܿo,1,o_MDnZZ+} GSI̖' (y!q1E^S@W,u<|2uqQ;Ė|1˯@dD{}RpKwNMH?*R4,8;1+gW"]hM;Nʧg RpIм8d 'ekk4g޾7+pJm ʴ!:jEU|m(0ㆼ϶RLhF7SksыĀ4Q1chS 7&v*Jrr/u\gj)cW+-E_B)s1rdUX%JHWڵR) 9>{N|[Q0A_!kH).F>5j;gs{lJ\:N6h񴲮+ nH[7|BrPqmuxȠW@2kHkt6P}"@\/lVr]g(DX&G{"d $K )$F !r'h@ K?y?Y4HXx80y񥙌`SM&ӗ9'ysJ8 QOS=,$EE ~n<_[ʃ phzL3c5H LRw=cYhnzz;@|x+C'fe/>ˈ es%Sv[OJˀɗԀPtd:]mx<޹. . a1JS)ih!Y (wC_zrJ-Zk'Յ㱜C&btvɻJj흏zz[mLmt@3ZZ[0-ׇ)84 }1ƦV ex\ *7@;`=o[6z+T KFmL8Byfm~X-;$`$7Wju𳻷ub6I9!KȎAZͽiw콤N-ۡH?VN*i\:Esߥ7 r:d&1zVT7K[l<+0?q-,S"x. ǘx\bNկBIXE{)@>./r[r񚅕w ٶ' F Z= ,;57xRg"e "e2Z:ډז<2Bh-fwywyg@Ym^s6.1: ~,?wJ7kwgfRDY}$-}ɘ MH#.14K `\Awcvgr!v F,9!|/4m6-rzlJN2RT )kw dEICj6#pMБ -^`%%z|uMi\H_sE{duD/}ծ׫+Mpq; fƽǦ`n^&1y=Gk\4X.c#gю1Mo ˺~'H8qf_"O*St܅\R'˻llţ"f]ok wNAt7'q޹,ĝdSE!lߌsh[6먡A{؎3jS]㜻?eʘ|0&wXt4:8+tԶҍmrVqxx;A6JTf{$ʻ!r e]z*ܥs ļiy<Ҍri{~ '͈ĺ:U?zĂGULNemށvH,v,T`($!X,"VHo,El ND1GaAyw܍N*_4#$ 4CIc4:_π@OCn "Zb elNl'Uʓ-C/^`͹;0O(ce8Ժj!p;-Q'M)6eDO 3N].y2pHD7R!vRzJw?{ccanMcCQ]|:ǿGD0W-5:?d8 m5vb| t }$0N6yp(K EPL!uwKJ6cLǑUmsJ3]c2rzҥkmGUR9Jɪ\HM2b  | Ƒ/o\3*;K7a侀G讀 b[=+% ^@*=Ԑ'9; JTB=[)o&ܖtztmP/ؚuUҊ86cO1CnsB4 %GhMh~c#͒=* :BvL/7`dUrX|Xi~C%H?;rݒ~ŀg +F/_N q Bwl`svFЩ"kXk[_p Vr_/nBh@obNrw~ ;%z8>DEf˸+l @: 7aGOeah]ז+kuOJ CM#xy8'/~̃P}!S z?4-t!Sgdn3:^mc5q6nt1(0].U5DC^WE{TdE`0#"`W\n$91tw_eWsi,s}f%Y8.-QD^Bcear܋L)4jG_?O?&a޴}b%?~v|cb]2=3Sytgctѓ1g4U!2!IȋB/ :өڍ{휰&Z7P@ 7ڱ,Cn/R :B$A^4|SQQ_$ZlT)BA"U,cr%>%o=زzq9n7y `6=)wO63F.iَ)&7_yN=v 354 Y;Զ#F 6=iSc 1UW|C$BwJ0!xr-ԗ8b ?^KUb,tLk#|_*هxt0ȍňe //Z۪`$MauK~8(Q@֎0')oh^9LWu[W8Ƥ5{MTLQhu@:t4sJn03H_uHxGiy:|2?BW>*q^M yE!0i!Fp/`p_|l˅vy͕ gѰ\ ~ho?Y*kuEiOogɒDbwܐSku,O }ۿkWZ'0vcKK'#x녲yrUxhERd(C~kŖQc7Ie#_5CĶ5mQy]R/sSYd_؞⬡]^[fIi!Hj&m:8bxT_URf8හRebACLbQs2L`)5Kb%fE]x*h%\XqƸH5joG RZ U|olg]*<- 9zaADc8Xh!<?5OPLl& c>Q͙>atŨ!\AU.GrifmG=x{Hd\ϼ[l 5@} c獺jD>Ts'WR3hVP$*%ܜu@q( ma0B!^%n=NHGJa({:oLd% K #}֠CK6ҒGd40Ŕev[,CIlyaRO0  Ƒ!A??؛#r ƢP4eQ3g7Ȼa>#q3X4,FvNM=hOˡDZlwL$ J*j">hbѶӨ}G־AvIey&`Ik|Eu\?~[]΢քr[M3mpq<ʞNr8.ވjݽbqbr_**pv^_d턑8 J\iLi\|=ɔ4L,,Y/jBg| zدY*p HEշZj28kSznmD EF\{CݵF SR-;;3Gk "$KL+fީTkG?Q2`LgR{ڶn{vfYyu^$v@Q=.ͶLlo?W2qnbt;(AWGKJ{Ld' D[MWT4 H'~ ԣbbfzW> Kqc\OloN؊ϰ k"`-wHq<0_2Oح|Vht+bٰBn0|?I#kEtw*u_[!O ?AhYr_]톅ɞ4e"BV cEV4Ӥ y0]Zvs 5*z [SAAqxنetR!`}ѐ75Asd~o~&Lr9t'peHXꑃ ^F+U:TƲ}N=nK`.K>n$N)攖B??tnҩg?l w|PwC6Foc_H}DIbǢ3Ugܾ qeA^4;nWXw&ZG_(B ue|v.5# Gwk~ܯ1!8!ڍkDyzbT om!f\+{oˮ[ު,i'a?$ODf8e,EcKzsK`btQ Cq*ak61Inp);d5R0pP$kp4ddsԦ|bkm_`jvW7MIwEBl`WA>}RւoP:Yzkg70 o嬠y#*a>'*U2ibUK |onc)RGXC!Sm.iJ׼AiOoh76/)E{ƒC"#uIjeF;>p؂P2Ij\KO|ތH2=4 >dq3 ZܪƗHޡ}遨[28fKR|WV jnWGw<\QK˴ :u!igfuҴ({Tτ E4Њh@qPB6fI4~feb *1s@Gi#lg˽L((L*ed`T^6N!UX2>.ZAKT@);4iOC~PȞa%^۟I?Wqðj檡ZeJ *y=ߙu& q; &w(<5͇t$L$A䆩dz ?fMsjnR޲ウf>RfL{.>}oBbK8jn"&EJ0kσ pF|h.Y(iŠ}N)E h$n8W﨨,)3{F"%K_2׫xmW6ĸ# oZ?IwYHí#@gln2Pr-2^XS>=ө+6_&>کWa|;]y0hEEyGޫ:ӌQuߟ(/.Ûͧ6n{Yb.xh>T!)2kAK 4©+]QLM2dr3A4&]v P ŋ:4[]ٵX1rvR (gFԼ! inndYxJWa˓XoGr/OV0hhG 'ƺTx0r(vM8l^䃛<3/o喚L$0ZFN*ؑy"0!ox~}z|],'APGȤ-E{OͪWB]b`a WZ +ž8ahL4)wtm1CYgΚb }9+Ճ%̻aqB2WK:T.]g 'd fEّk'OM/k0 6 bFD"^yFTڛBϭ%a`風aEClnTό1*\Sh$3wX ZæwA~ JXTcoǕJ۾Wn3 ɵn%13m@ Du.&s9=d yԚOǍxf#F=/g7d OI(u?ڍ8Zkc8c4 ˕/.[˵lp\U$Jf[<z6̾CNC<A1>:O8eh =HG-_ĭ9fyǎ$.J-\fzܑ;J8fxͲ7[ c3*$>s)YiӞ٣ 5#1cm38/[0覫jS fhv >80#ʝUAHUkfDTb-znXyԪ7^XpٮUH@%Wc|U'<dt)>W4a񞋴ᬜ!Ё} '4P&Vl{L5jy(UwA~`wO,+Ve@Tgl9H /&oʄ'҆Tښgaq3X4E ǰAi :L.pI=l+ e:hI[K `%&3IWY1%"L8vZQVBK6qW:{KX0Ȣ`V|j_UX֒8[Y]UGgI~BW| l:32D|DX 7ޢ6T*t4Qd/LqÉj䀓e"l}fLYf։1O貵?Ġ0 6I=uK\:˜dc Yq|v%XEdUBY9vfR/(@\"h&|ԖZq01&O"cCػ1zrP=gl9ȕ%5)$+)HSQkE&8RGޝ"TOHS8_grMlzv!ξ⼉=Y%qqNd ıS@ ѩ0BȚ/DQ 5CnQѸw +#ɽ";.D<.gs˂]}Ίt\;߹پ2=~k'G .3?&9]ٰ4Ou))*g;'x8@-в,{1ˍq&poQ+ˣ*d6K)YkPIDkWi:sabCԒ^B\ m6 D|#BMPqn.wX;s0wД'ʶZ5J9vv>JPF nCPHTM] s/b8t2E5( 7\\P@]⬫J5}kro'GSzN^qy&#%{}!d#[}L=LRR=q RABwPT@L2 鶿 Q|RM(NBnz A =iV1hM.8u ,P(Rk3v$I(*0TK7?v bu+s vmEgYLP,X=l@sW2:iŮP}( M]ɗG)%ox0QL>~2S5 ǶٷwSu\ ǀ$D3Z{ZlL@ʄ@!}5 yQ$f ]܀#[2!y{[}Dh=?*V KSY1^6\h,P{뱈BDKpS0S*q{xm:BܝNsx j7fDTŖ-)YoCm48&.\IyGzc":"Io\y 8jgJ${( ̴qpmO}QQe; EܭѭX|0zq_THD\y9CY؈=݈vAg 8wc_۶lPდ稵X"9JSP۲s(8HEgcꗀ O+D:HoIIJcSgv^u G"~6{/ٯMDl} Pڙyնfy1DT>Y6j]0wN U_$&du ˤ)"L %DE n䓜Bjr^j_3?'jV V/ZT(7-1舩 ~5sX!i0]FGhu{Ǥ+{Ep)Y%NrU|K 9go.܊vcn =}=%Xs4p|U;7Z ir4_r4]nXٵ9-l'] `7c OL-q~Ѥ-0E4cQ,_Wy61YB%B;,ID^ĕŘx:f$suSu>QXv:W7kqg+V۶GJp/m@8 sߠ Фւ|>A`4wp*kL[#-4;6{T' aOSF&Kz։j,Z܈ ĩW+Og^ȋ+Q).R#nbja9gj MOiqs0 *_GS$?LѪϏpgJ +`m i__{u^=; |"оѨc0Pwl @\M9<VYh*ufJ 8=/1+7d߆R/[,}_JyfQF %X4G4BTgاMӞw j\)6}lΑ.Z;͈!zZ\DζS:OgL66~zdrh7+:,oe~zR7+|s-Nd BgxgMͧ0[+t~}>QrPMՍdC$ln?"|]NPYu)),#ܧ;B1!,:Y I5'jBQu&HvgyFRRF7ֿ:m6} ph ]JԶЩ9pRtr p*䗉2+%`Fm-→}4mFU$Q L+ϩ}Wgzh3!V·%?CX1,mfzMJUyQfS:Kpc>%v,>4T[=1Xښ%x64\Ez,Hntxl'GÎ]7gߘ,=75"&;l@.sL_mFV2e$|/{. &"/Ӽ1NyJnɅylOrLv rDzQՑEel%7b)o WD@6!Cx 鸰 Nm;s)L@[^V;^urg/mI`@SN2նclm2v~h/}o2G hƻ6tA68+Y>eP"ƞbsg~w1#zJ;Fsn/SܠTg&P|яc!\[YNS@"jWݣJo|0eׂ؇i]<(0F(b $k[ BxuWT|kďiάsʄ5,к`9bt-Pk꒏]¹F-d'5B }N^\nS5 w[zZ!NLE=6_6{+V0'غ%ڄD+_@5A#5-}$$ "鬑W%Yܡ`'c܎tl\'A߭𜘇)P|EQcB8|oo}_Cv;w80ʩِMIRi~Rd Qnkhʧqϩ'eͨ[#n#cqu[h1ז%g[KɳvXpBQ-uT.@Ne;䶩/j>I[wWvFE]TU;&X;{:^ 'NR6fs$'I]YٌA7ͿVcg֖#h02J=EE%"Xzm i o#LypEh*O[cM n麗9"!fEsu"{~5n48r( q%v*4LiVq!!"Nȟ(v3GS{\}O뚛M )X[Jt<J3zXqV I^`VȂ Nn:.jglɢk6f;V{_yKЍ]t%S(L[;c|P_hiLOrXKuָ>DrtkKFe68,s!~KnR3nyP|A[, 2 7s)+-fO!ױU4IA ՇCwf] mal|!e]|ʚVd 6(9 P=5v S= A=%d8Y$Zw*MS OtʇOqHR/$V˜7dwz&tA}98e7S؟W|Dߏ=lc&בWcدS0V1'5 1_60:gVn)|!ѣIK`N u7Ǫ/P2C~8flD8YlWeUqډsqm0HN)1?XW)2NFөX 9?s6QFZEAu9*IYQ~7>f5yqۙȫfAv1wHhK;Sh za#WQNAYapg \HJUeHo, k'0#y_-3Ko(w-s€L3Wo<YY@HOL٨]E{WǷAf4pX .O7_a(Zh21k꨾n޴/9&fGhJBFVC4W+ YcH;sS_սY\*mUfq@ 4[} n!tZxI$ {nmSw暔S *܅ &j7j5]ʈZԛ zt[㮌!u!Y'1 (CV *^˜Ia5[mG7UjZW*gm^e |tpj r8>C ޒg97131pBް& zhX\׉Om!ݞ5D;:*x1O닝Es62Nʺ,CmѨy-(Uf:ÒRҾ=Fdj{4bCb)⑵@Ɉ)cr*I+:v&#<2%ȅ( j;qpi4r?9F&R;Sc&6V#4]o0Jto*o'@PD߿6uOf*3 6v DYA ^bN8෕sYqq%ȡD7&URoA9*VVJLP'͠O%-?bX(.*[ciJ莞g;X֢rPK-N{\Ƚ%7˵37iro{Z|lnto0.QuۏU WidyOrsZxuJWV?킹yN ͐:ʐ[ޔ9Yz**Iiؘ{ިTr(Uuպ-%w 50  |rlQ U?-u % /W8C-BaEFJ΁v4=`m0^٦Xo=Dl՛ V͗N+sWD;-~1R|U[(M_p&}+"d@eⳏaOyn>Mx,&)FuYn(jl)fziŨBTzHs%p{+xFۀ~@94Ya*=o7μ}%qJ0c ͷe!ZFv+ANM=44E@(W#S7ZF:/ v6 |nYfx~nFAD $u{# 68Uf[m̘O]m⼁ܸ?B@?f73O i^R,IH{匞QhG>A'g3aàK)`2,L,.a+kQ,ڀeLBf wv{#`7q00e yr˫1G nQf=6b9|~dE $Dqo6hК}]{j`߱@afߠk-E!^zcK$a|YN8T &NF!BXho~\x&ȯU]~ Hሊ\b1@@zUǠIe䆶\&jn@FplD3žg?B;ԪjĢ1^΃'2ԭ#T\Ms#@=,(8=Z'd266ϓ uڀ "g?hP[]Ą_|zV?D@#\Е.9!^sT;;Q8.&SSeF½"{b*h$U|l# FWf;PSQǝ%A7 WN^sݭi`34]Dَe98?=Lz׶&WQٙ d[s5#80QKEhZcse'CsDtQy!4WOwj|kHK|rpQ{S9M0w b˞h!} dAE#'/z#iq.LQ@2t! a"䂱Qg?A0JnԕAe3Nލ sAԝ<5T%Y)9DS M*`iL&%QhGZ+{- A脿nЁb%f&hLD}xI~ VBi +!uِ0TBt(^EHWB5*0 8vUQ<ƌ],1-X#IE| `ԊscoFM5뱀y^"M9muP7,}8 Vt[|@gׯR#D`ZE16W*葽{b"u|!&]2͆0NDA4`5HV]eO~Y s["EulH~P:/]W7؛e 1;B4W6otJT JԕE]>VrEK(y%BB97 'yI٭H̐gEoڑjT?B *YO$215+6 ɖdtD$#3|f}H&rFʜ'RP\27en_ܶӖ],Z_[r[}ݏJBʌ)F&h2k/'I#.䦟0J6 "NBB;J]f5]uyb8=0/j=bz!#DH k'M=QF$ Ր&˸ c^aB`42-14*n ^h"XtD{a r!>[p(itz(|E>y>CO6|ToROdy!Ayrf]v{lWNV͘uV m\sK-..}ዩjdټD/Pӛfijt&`QSr u⾨)GӉK{ !p Z^灗F7] G-vAtL҂oS3 KjuviVhilf'[ /=2I#iknB9b&zxJ(~#dl61ɆKOiNIEQ/i9&pG#%hǿtR%@cOaL`D:v_1 O.:i]>Rii? 0;RGZ@riF\}M菤+^' ŭ5Ԉ4 /_fk\֚5]rn.v{G c]2PFzpZ# FDgQl/TNd6GOaP3\1$'yK `X1-D5$ ۳@} v‚&M /ar8qe#U\3TTTԸngɲs\Q ɧ<+ OAWV-uѴ]^nD5ɝ(@a$%v*Sp< k?E?Dre&=f<[2 M7)4dfub.Pq[)u'ڰx9^fՕ3_&!?P~kP!ZfKtoRj B3r) r侼 ?3V)Qʪ$L⾌Bj]yF?u%#u%]Ry ާ7N^9zViUTyR) 7.RKםV =01y۸26FKEo50W#-׿pL ]T8}1BmK]^AQr#nk4+)30ޑε&n]/3Ss\!Ļx *)0coa79ú.*F3yHdkC{l` W°]I{<Z*q"WuN5TpOA"VEX9BWuyS\r >N+lrgƳ6)ßQM6+wUw)k[TDMտD@I1퍺\1O}ۙF{c1cX6|Fõ Ϋ;gkvW<ǎS\{+B2,[< A;p(bKw XMwnƟ]a>c͹7o_|a@^B.1;40ҸX?:zU"%RMNZumi%J̠:Z_tѷpܲ/ӊgTwFxcLsNlÂHAdogGZP5+#3vP}QB+f5x8aeٱxy2 Q(7K#W>3AnV\Ee[M{$OdH&e{P5tAQٜjRwjz,*pQⷃe1VI`s$v1|m6Q[8u4L8c CkB8"U藈Nȷ+clhHl^Dw5!n~cl*!#B⏟>kWw>F+ij߱>vAEº_ɂ݇JѰ,a8]"GDUAAؖ2Y[NĄ̠u,,: 12m^<쵰{ ͌$Ո'F:Ly_J hzټ6nTn7I{)٨;{UF<^R)!uߕxZ*e>ͬR0;.(/#W :Mb.0mѰ*^'h4eGu@7-raQ`&mpDbvH4)M45'T'Ŭڿ]k$=d݃櫭 ԟ%>*{s4>)[Eim~*4اX2n,`Ne{H2^#`~cnĢʮy^U8buhX Ӷ,b;i8% ­Zw.h-M%%ߊouv,s;AGwsE"&*>m Wm#ՙ\Q5hx*@Fw>5A%¿֮Ţ#Ci'NhQC\eDcyX/37핤>(|0 #z}X&Wٴ yh.4hc".a k9C@-T'6l)VpLjfF (1l ,SQS9A>aV`{ y*տս 0L6Gi\9¼RP:( t5?0/zz)<`,Mj@/5tHGj=5z;"7PR `'O8; i鐖1R$ՔJ`tKj51@ԑ D$3: k BPKxZfJe=س.@S")sI7:j{3'<8-Nas"Y Tzx<&Јr “wjMg.`,<ԧӠR zHz>q"kXrB2 gD4O<-13Á- s`-i=f&xH/1Dƶ2cCe +kjRg *f%:ӨJSMs*2sLQQtjH#i 0̥k7a$8k{X OWrmX(y<*©/N-'QƉܡdE{Qee/p[Y1&t=n nP"9uvMRC=At6u)JNe#$҆]tfPhMx*<mh0bz`pbNX9o"N:,6o5u Lr ˳fY SG8GbCr0avx+9G}Li<IZ%.Tģ%Ѧ.濂MmBYʱQ'3_۞g&R@90ZE&YWAޭtZV֧_йW0-ҩbcSݱK xsAם!}o쀫.u?݂x@4uv9u'"Ḏ0QF̔֞p9U/̉Ӟ{id#A&B>#+cfj82b)7pPJ QJ߽X0JLuDcz le-]Ip d ߁-#mt0"Ž?wmVy0GpYN?Z+R.1cr\odu\#K}ސـl\7^Pշ<#FlDUĶ+t}-*g=Y+mH`?Cn. 'm)v>^]uUa]~wGm(N/[ فui$W/#\k@hu4(S!DrIǬ2Gkz~V!D柺JA^Ze.+)2& OXblsK]/|z]4`^4A^98HfD~G7j*$Yi;%j_q; +Hoߙr->\=1yXaZ@kNnD[ )BP|ǕYBo)S4;3'sj4 F @03h6"ƅP劉\ ={Э)(KRUlu$P< qy8Gy.:[mp eB$u2=)+UЧpV`dVs :\Ɲm#׼ V"|nabmwbዣ=k : vIvn?` $fڙDٟB| .c* H97{tatFa=QW@|(|v>g^s  ^ـ}ejI^X,ZRm{SqC#3#l. *JЕEݪ)f'F wy'XPJ JZ06wi65aC tjqp-es B&!,' Ulfr@V\_/`@Dj"45H_ɀ&Fq Mw9WH^1t=t4+ b)jzIɱdP.)E"ξ5p}K~08'*)i)z16}FS7ҧޓҞ ίoqq3"'@MhFgեP4rDOtwbl;Dш2Ebc6 (S̺ +UjJo,X3vP1F_uɩhL%gZkYoʌ[{+Q|^ewמiTSxS-q[hm h8ypC>C| ޿ Fe:T*Ν' B3u~ٱX/}0 BXa{hGne`dewhV}]8 P2>2џ]F)˥02 zLz '7 ?酑zGh"lȒlO$l[3!|{/ @1F}C#F {_RdfK}T,8ljLVe}+J9j5FE^Z=1ݎk'(Nf/)I@eFFe֗2ѬJ:6})n 9],6d7OYFl&M{ &ܿEϑ:@ /Ӟ[Q9N]WUw7fKs*ɽ=vG3w#JWl"0IDـWV!?M=\m,u q'wM*wʇ A͆\?Ms:eQ>b//e°͕^}J*o% ^WJ(`Җ^ѭCBLú l*JsWrr7gOQA*"H& e .F}V_σLC,$noOai27iė.BV 8QH\mb@F<ǡwd|_3`^]9H̓;H\c^p%0[SJO wF0P[ IbJv wN\,v\[T\ Lr?b GdՖ]A=S.PVn]`J/BwؼU!<=Kl)7w8xi6A=#e"r@Ebg>FI񳡏0hfՓ^ǀqC[1O !?90"sK*f- NR8pr]*VC 6<-1،h-egȩetIeEN0~ Z0wbu0ku$9g;1d\KH5GhN~"1E3)@.n-֔hLOU";FmHEBhE"Eh p ZE^F&*/!$&-mGwceC&-C K7$փ9%DE-a#i62]>,ˌh̺Cĸ<* w >/G|Sa$e2u1Ӷe@2;Eӆ WnsCr93ÐeeQLBnC#oek-Y;JB0蠭8[IәF]1Tv2tbXl=p Bwy&+_&Ceo=vNM 15h]}>,xq[N䤏J\!2BxvXPw=}W } WYWz6Dza,Λ3<"A?ڠ1v൩rAF,a_  k)tџa0"g{qSs)*}c㙃").] s!<2RP72N۱qq |( h0CKr?.w%ځ5xig9ej$:WD6Pa32&H^$Vo_O[jolN!w c4Uo^):E !Jőé6#C:`DȷF($ujva8G~Wh 7Љ~f F$dx:qqGb!NIx)aLl03h>2n h$)t)!9nPj$iڪBX|9pfYB`dX"Qszju "rr2CMfb6O׉f3ۙU Yig:ag,cxlOZIǪf[ꂪanzxk*11ȍkqh-=grP"{sTA y }P= ўR8equT4Bd^y/}&nf^8wdjP5B[z6w&]cI[m7DȈ(IH\`{cEF6"4GʣV„/cMJց`vrp$ Jm9㈽vKaʦPz9Ц=0 o%}^|%mw˰)wJq/j0N$BLSdDYU\SE@Ě]XJK k%5B`fǦDЕt܀C̱wy9Z@WjvR"nk+Eڋ4D Ϩ?G2Y&段IۋiF`x㉩;&?ᝍ3 @NQF "($(E+ILޓC+ pKf{$0%ԮO*jF. LqL,{S vP I/n؏\]a?';[~1J8Rp+gf Z:{H8 ۊA9Qy)=Aa6MLFJU [?;= %B*=Ҳ@*AqpphXj௼M: l1I޴ IWH@]: t}A%J2~?S;qt U pe?9GNjsi{@K8/ϛ}j&oYxN Bxx Pl(g5RùcJQ֦oshCyB}P`Zʣܗx CAѢ]iuMYf`p8_x^ˉ ݇u y.) T .[| j=}3zx^ՠ>^ͅqgW'b#TIȕf1CM7?* MEXPË*@ RuL{&6˴[sa}{rbm;(%$ӪGƬM|)oV\㪀C[ZbcYrA}rW0V%~Zi]fؙdV4|+#M5uZބx@'xН3F7;&t3xC} ??Z8r)VJ;7`2ÊG-t~zvhȻ\;KTӎIHq/M8% )yZ+dHd8jĴڷu9`,CTqf+ϟsVң+F8-+]ȋ"p05"!`5* .A5eR*q^Nú>\fvR~0 ú53Fgl032 +uc~  ̣}4}36aیO#Ӓ %9U6e,wUNm& BҜǵ贖zD1!ؼ lo-a LuJaQlEWF] Cmt/Oճ:4ᅶ:~ȏz5u 5sߡ'L첑]7]'DR{xM*Io:^1sJ,*c 1K8G i[wP HF0.4N!( m[yLvGִX< bA_$YI|ۥF:#f[sC`xºI& *X) #P~q4ژNb_#XW -}š1^sa5Kˇ3̫jQmvj7[m *`q<tn[8&vq Ýr3/0yH:z9j>%be$,S 7L[e p=! qM)Xn14t"y |+B(&&R#Y]IiwL|ü$Qo?|o%vppvW%/Ƈ q;J:|:RޘۧURg"g잱^w+r Ԧ.W.yO`("#p<\$VZY"Z%2M Z ^^1~qno.b =(߳jk9Tj?fڣF*)@sT RjFPUa:uagSip{ѻ3Seauߛ9,ŭwSUyk$n;y>*)"U_m. W9RS>B?/(5S:k%B^!< 1`C+=NO9ĊOVyGB^rG|/V{ ԖF=TݥNsA(-3|ANZFh)G),8,ru*N0vY*-`)ԃNb "T= x"3p$ҾyڿB%_.Vt%؍ )ż-R7>D- OݗcãavI425s[F`}&76 Ŀum(*zp[QJ2Kd ISPP4P4& {zp{Ϟe, ( :*IeX1ʩֳ aS4_b\i/_EfP M=A/Crr eDcbjꞥ>w }4: jO5$@N wTRv!9VEHد&!\a@= ضjmOExIGYBiϏm@l!qû NKN36#xU{HzD_lv#q[nY V,u" u Af䂇}PNJr9rK#d!>P|Oq֙ v3pCSxV.B8`a-Yc2}7@~ܪEwnt%\ {v &hwz'VxJT . gP' ?pol]gܺ)pkϚSQۉERo cjgd|wڢfڮ}9<I;lw.iTvK#ar=o#qho݂RAq\dz776$x6FEc^۵~5A,~ XPI~UDSjb%t_)IQoP{ukC\ lh?~S=~t~o1m¼mʌeސ0s9>=할Coư)8 foH?kG<ґW0JV*5ޱkܑ.2zs!`|^!Eg:PQu'8Rl]h#\O[K8H`` QUi\` ?-&[4u={ qbahnG/:0)ŤÑbYG|i\i+b'ako;k'opɣ^Lb# 'N?1nV!_e>cqw8=5e|ҕ)8ـP/V}2iݔFuvLe,xWw_&\mAXV.֮pYgYLj{ .|{ƀg8Vр3n^ߥbn![ ~Nwwtx~_x0@  T26hOnQeDO)9tM"8@!U5ȏ}%Q+ yZ /.[_+N 45Ipd[eǺ`*s գs6ߒ{&Fl܁=}ݎNpB(L(]AلA+B-M[#IAhAD\`OL--쟉QGr%"H ߹i9 JR':(u`bs 3od㕺h\Ie3>Ӑin@e,y3l6O'@Rt䦐]z6공)^MB?Yќbz#W{q z}twΒ( ːN&J0t6IL_N+m1ֻ^eca7kLSYľ˻n^̲M"@|c38 b^NTv`M6% Coʸ|iBredȢei]2$יhj 1׉K8]^S!׋P"uw~h̞֝Gȕ"$8P6#Ƌ3ˀѹ@[3x> p '.@~}qO0T!3}9;7ϳmt^vCKU~hy;XE"o` sLXj@{h߰XI* -@ȣz#18'@<>fr'e PM!"=<"ܚxkbUȿ,BϯtU#m:qV7nڐ/ȍcD( %Y-݂=vPt5alLi=̠׮1B2 [H>Tt:3fG&7G,b]X:Spbi+^As 0OD(zESe<>p0?|>iX~v: sl PPESP&ȁ(m:fudkuh:H1qUc/ROqTTsAl }~]o~ 4kdn} U]99t?k^XYXQ?& o+F_!Q*GNЎ\|93xGHa_ *l-7sYw.2wFovBz("֡peW: mk dJR^gC+6bv^g(S%e(~Lޡ eTTk+1Am 11"qVT d??(]MBd)ς sG}^_RZ }*!Ϋ\aȉ e0>"nS$@SS6Q-zY؊I*ʊn8]UIV٭Jͯ[!4uJI|ܟZ<G34v %T݅/Bp-3QϘ)H_@?rH.asu׳{)(.'JwQ\CbܫNx3`ٝܽCH>81.uĎyD-w彍uɋ,d]U"R2PA{a-r ZKX_Tѐ`^hŮc"ew+m)Ρh{i /*}s\VD` JԳi?5 /T9cLWH(42[#F+LD^z &  @H+55R4V hޙhXJ^_j=ϭ3Kt엌4@D ABmn|ڲ ћW2N-\W~yFM0G+=_ SԮE~A!L#QAVG.lG.|*e[#Տ|h+Tl]: $?UuD7 2 fޝQmܔA+h˔I^JH&hmN7p79z- mwIjǠemYK.c̯j&X1Di?0P>"QT%`zo+F\Al~NjNQq䶱j\4r 97ī,06ULuQB\l-ŖKW>9CQ ="cCr:I[S=ƈȜN{1şA }hw  s;DJ ~fYT(_)8^7wF&êH#^?hnU9]%N7u!]WI-Ҡ}q^vy({ !Me*U&˷K:'ةbjƝUk1 Py+`c+yv*Fr=T c)7片j}wm3{V𘺤%|ӘwRj<YcW]EdXE*h'eդtQ")8,ň3~@f֯uVw P6ó"@Od-H`诤Sn*ʗhlLp0Ew2'|b{*Ԭ%mo< c!iedG? Q kp 0~S g~kp~D{}&4b"rߣRc쩢\ %.0[Ȥv,ˑ*V؀ɮCxɮ} ǿ<9Qϱ/2iW#ëA1yvfֈdMtT&9mMYyJupXm52_mVIUt- L|lְ U4hmL>ͱ0:10pu aag˞ /?'Ұ]Ga `dUQNR1B2Qᮌá яʬS>^Ǻw r%Fv5TO8{'.]@xܽ{2[+gD_GnXW: x9Qf?65_<Уk7xG[B BQ}<0n@_BDo@ a@PD#DQ#\heZ 1 hQN1ւ.9iNrzFtz1Wl,UZE9e}r'KGiSS)#Pw x v١g uIb%u)VB i50@4ya |(zpF\w abfݾ=fxI!hwS$yd2iz ҉X{VGFuoi&2oNyN{LSaz镺ds>zAF߸g*`7S=u_|զA\VjL/y0T^Q >Κ; StLi|j\i3*gV yG94 (] 4V_ą9UF2񼓍Yٽi"s_n@+ N:$ ͵u(-t_ݗFO1Koɸ,i|L4߂g٣mɦwpޅe `eԳ*8:c3 [٩2~[ZNAtGBN䫛u]t.b1zu|`޵ejq)MB⊊_O@#&$Nq8P so mҵo"XT!]r>RA^Hf+|+[ Ϗ?:RYnZ:~g niw3/gIRyEHR1յߑɉԷp夁ޅDZ&d1k~nS 5>%:zЪb@h͵NO;vEW ku^NjɄR\OI1fփkh@IR>wqf<J􆅡 = 4!(hʢrxp}mŵhot]cG3n\HҾ-ER?ѹTqOyJH[vD\N߉&ST|Pi2]BLxLζ|VB q%U|^$EC\#vE"r=B2j2&~8qH AT!0m%߬g 4b:A.^XF;F~0n4XG"ˏ,f8\ɭ)&:}~\1-fzG~o}zѸ!O}gyusbKj `p+׈7*y nK)+xٞm:=xQsY]se>؉G PLy𥛲͍FЊ\5~Ŝr8Nx5}vLJi7 HtuD2uLuƼ0R3"_":sltf`}Jzo|)0F +9Fw!&u:Jy/u']Va.@H ҎspmKsGnnZe2gZV'~ZZ DW0n=SFv@.K~*CvO-3x^5`PXKW]$fe1`_?&ȝAF:4~d̾*Jx$.`0+z[Qk| Hy)1VA;ѴeB Ezfrkj?g97A5Rη(Ae {-[Jjg+7}jn+J3GlS{5tjY0z->Oº))֩y w[8(.aqC HKTiĔɚa,eӍX>yKjg ih' w@Ճ\U H*: fd:1dl/Lq)(aХ%aLp'G`ֽNԖK'|<`2LpdW/\H3g}ōA݌ع}G\a PNNąNL'.ZÓ)I}-ꨩFUS:+ $NIMRlaMyx7{Ŧ WeʖvB\>i0pH$0+W£pq1:XXI,2&y ny tlŰ[8^B6QX|@ %12$06j\RNFW:fes TޯZ Z{!UF-㓽(v,vcUؗ>Z5'{)Icy>%w\J̕! F0p}L]@!!W?,f jZ^<ذF:gM.EΩĬj](ΟdIy6 ZU&ok{J0!-]vpA2q@:\ ৅+% [FZXxN_tdk@j_Ta5upr/һ\6"Dc?{Y+)u>Ūu-|{PmW`4%ufU \+Xg[=A}A_ۛ?*Ηf̜l5+OC!LG)S!3"`}Ԟ$.&^y\};fCDvXNi_Liҵ:Ig dr~e@gNVo+ GYQǦS8R?!tʱoOi7wx29d;]E^5@Kt"$kӯ?ݪIBcv_\a/1WOSՔhJi@F䠌CB <M2!T ӭ >yO}wŶUR=%vS:0Fpf#.L~2#jN6O@mCu-Ҋ2bɨqqqCz?ng n\n 7j? ]~*^Iz3:k}NI W 1d~܋ so*hnEBC 2s.?^9 /Tok v<ȋ RN%"?秤o@ d7^+q^`=Y-MF>j5HIF:, UD]}Jc_tƐȚ:P`v4Zye߼kX~ؑ;3\g/[W(=B!QM Qdl \8'Cwqj<+ cRz8keDoebO[n5OGm)̕Z"ֈ6"uv^%кez͋ VmeD׃xݥW-O#\w/t}*_1C${iycdv^2U|DͥL.,cQmNagL!xEwGLGZ됟zjBmT*90;띋ͫt[cd"r {|l5ШsUxRAtR ']p踲U5%fZ2H|rt ~rnyjr5cte:r|)Q1zuc8 51މɘɐ>'Akih'ΗRlmrnW~sH؝MZ؈`x 1e%2o<^`ۉծB[7Z}Jel G9|WlK8D*4/(V|vIA\m^P?L.VVpf[|W$:'Cũ渘̅@rS|_,y9ĦpT, >\8+1_E;6@&֍ .syo#ɖ8xJR29\A1`+J<@Qt,i99{|~W=PۑZVlESJ HͶQK6JDe8g8&OMTύ07sồnXT%ſ ,ᤜ F$) >` lοSkؑNCE﹘DuV񧯳JzRLs1<m¹[ ޺'~]f}&(ܐ t1X;})^%27@&Q2z^ zWHZbYlAc79N|Ui;ƉlP\M=M1l*ҟswFջ굊t4J[Dp -t@-|GP's=xM;B& tYBXTsiW;-l-!|@1=Aq٩M_Gʵ"#S`^WJв(\6LMpCڔ]|- f20sPSGJs}?ݲfi@j͹wU|?O͏Tc׉E`n׼ߠᦁna5L[%lXbH ƒ/s6iLMΪ@Qg,EOD:^ħ$/ o`)LyHD L|,{FG]Su["^*,QdX]ZwI?tɭ-,*H%<ZE)b,(﵅;$~}0crqagN,=uu]GZIf"C#xyMXaHVHx/jS:Ӳ~,]B8:QNU}|(E%&QFxZkap3xFshZЋvQt,!2ϙV!(kw soY22u8rspv"$Fhpm^jR'pVb.kaWSuo` -{Lُ  ~ȔK^KP/:x J:ӵ/`"ܲ]hkʹva!lP[;w:dHBZpDe֙Of!x$0#dϡcQoަ0Ce}\4Ƴf:.ʢB: EDP?ٜx4y'vl=ښvӣ"3}6c.aP1)vpi54[4=4ܩ0 lWBZ2#S/0Zۃ{i"j/WF[b͘\e4=rH8kSj-$4ڈ5}\~z%NIl)sн$ik@i-7nhޜm12$뼶wV#x1"w*#^aK]߫b5((F7YqGI֥VezO'H|$kp>@X㜖K6Ԋ.űWA34<-,88_OYS4MxNP8Ta[؍ڣSU{b>H)n7V>*ut{VQ@ з y:xrٔ7rD=SI{Dѥ5Q) c( { hWmeܳleH PtNOў ]fӧJl*QFb=Ö]*T_7@$=g>wAhUV^ ;bib<|Wvt]3_;PvJp E)Mgok-Jׁ1W!T [VS{i 5(/OW`Cc)o12eU ~pWDɂ\'@F&۲RM0.lvKHrvCK¼'vЌ05.(U~IS7 mB/ C\ZH5Q}˭n+2=vISv9Ѭ\廻a]_zʗSxĭu| ܖuvr7&8o5fgWwzܪxC.H`!|(oU tʡ(1%ZB1{*gKoi鏆`.:Yk^H)'..JHTX'?/{\ !vpLEFy##Bʔ) b@g\;C  !8ԅBΫd٬ ?߭nЍqY/}?!OւG gWnIE-̘CPRS[dp.-2J[ㆋ.%nP@+<8_? 9M=*9)-^q/X^и#algkc~2 n']"=ԓk: ѩs*u"B )CNM)$t,3~lrk~lׅSw֚NFbT+E|l!1+?X|;gsaQΝPsjٌJMS,B^5 h:H֘Ҕml"9(tV/B&M9e^~9K Jm1wR!?4]?* &:Q*o\[ F{ݸdq򯻻J8ﲒ2+ب O`%A?l`[+C :aOdN_`'>_hV$6i(,jlG[<.!To3z'!5 MK}l,P^ xLygu;hhnNIɀ!w4b q ۡY |ǺGUqg` Sd;: ?{L[KoEU"R ߣo1ӻqniƝrhώ+U[JT/w =fbrY_xp+ h',!f,(PUk??2$B1UB}KedUUk@ُVYY֘FuaPaV;{k=wh)ESX꿺uc!8x xY"e P 3u؀"g&[+3i[%q= a L&DZ"g rWfO' ;ds-h&:;|To *Lxɖf?Y78 =JιoiS!Nݩ5d3Yŏp5cCDx @;Gc NS鍶0_zS]d$ "dxdI\5FΚLd%3_rIw~MqF=wq.>L[șk^eos ̺YӶQ}&,:VF.B19,խUxOR{#eɽ\aUW Bong_ͭL$AvA߰?VYe[Ӯgɴ6 0L6IP wa|>y[vgQbh:m7ddWwpɣZW{ub8ŏ6'FȢJr߻ '[.":x֌.^ڟ~ܩV},q>ŎkwKsO,v K8- Ncip|֫eg!| V% \ 3Lh~p1,mC!5d,<9trsqoo@tA(qT6KBc>w' u?c~^MTa2K[+&k_#r!IziƇ$U<,A/p|&g-x@#1 J؁@Jʧ(D^O5|{=*^} Cv={AFz=MUУUTB }y~I9B[E)ec>L6[kTmiGnD%S^)SWj38vAq v-o[$IlJ[J2",ʂ7Z,ILݭ[j8Ub?1(N='llzB=>M Sc'VnVXuʡ@ er4†eu6wɐT,PRٌ|\^4^Ңjfb ǎ.OFg|E% ֹtG@`ӒYeYB;J|t^82 b=:s Wg=(4@c_ח~]$OY!>Km{23ΚX*:]__ R3J! o(:'Ǹ,[LC>t=>N-S6Å!wkwοl?^iSuMz>A]K_cM)|fh-!~z<!vc!댧<@)d"=82*69amOÕẁ}voQgn`r }RoMbtf8KdTsRϭQhVbCz5nX)hxk8kxϪgS:!-Bac8 l2:4*k\+Tu -ֳV,&JW^?Mz\p/xX\S R~SAoFtgdaΘjwE q GsG) ]ṴU{dddL~Gv@xK=A_ckQP$k7|ӫt{G1FVR#z'S=/_8Vs'+TZ\ù_H߮qH\qvy h1te{)W&I 2^]ЦC(oU9K-{ RI<Ӎ(ĵ&:'5up%-ևWH+u |"Uޜ_ Ļ fh%K -0i^H}܋/k0%@\ʳA0+-X:n)c>`/5W/wl|e,!RDžR0xTՎ=stV,J%z_E %gM1m|qA?NS${e>&GHc[)3n\IO|?J~/=Ի.` 5:KɅOitcӜp"Xnѕ)&3#|'RvaVh](oX`{=}"(-襜Dh2LIZK2=/Qu]kS3*(  K#ShQO\U{!&e@d\9* /ըv%V9!-}fy;&ub΋c>*aW@*(@&FC9aK^H[&O^l˰>8*\`EŀXm rRۀPS$Q{RU *TţUb,40JNq jtXKc0`o=ccjB~tZG-AN1~`in.w' 6\^)A>KBΜ;hKnxmKgB{lTԌ_Is m[at,,M) afrXFƣUb vȬ/xcXld;=,ڏ~մV%3D8ւT pGZIiixBwr7wq? 7,dG UHZ@X g M@4+` #c|2S\ڭʲÈ@HMH\vc %PRӽ ,󍑺]Сxg gZ %#S](M̩g׹ 3{ A7}݊N4;f+WY @p~:C+b'˅ӵwH՟2Eb-5.-rU_5vqsFk1XF3F\"=Nx Bu|('oRZBcOx :Sh8DVT1B1jv P!Nx1Gؒ`yy69}SZVk֣u]OS*+=ILw~6[`;QP9VH@h0^*)t厙AN9ѕ'T!Oe=Q~Ԇ~D`RIy6@Dyr ~kh8HYSܩFOK FPY5bX/USX_>S$(tBxWQc&Fb#}E2>Oog7=aٓZ>ی1- 9li+>ha LH,P6.%W.C[2YCuX0 \]x܇`RcLqּԿG}K~.ńCv8X'S"}QgzWT(Lՠ{Mq-NZ=v=Rn}ճ|Y4$?Pٱ bGYH9\:?:&(DKKDh9O"S|.;ӾvD还".3G'x*ۧcH@ąF Lݠ \U9X2ʹmvbc_u4%f"QC2zKC0녏~A ȕ{6M֚бssRpx_|N}S8'7&_/CI}ctt.MhE >#2V*'\ 15D"/IJ֥o‚i$11u;E*}ț1?xXz:p~jL tՋ)Ơ /K=~+[MM?TX]5(|ns<\ \ s}q8-BiOpLXŐ_MڮA{Y 8Ҷg,1篵TduP⡎ݣF%v_TeAFs~o WRuwOrή~`уB s FOO0`J3oyYƊ>P&I'{p#L+C!0c=yz{=b |mh! pJAgE0é(ϱW*:0e_xxƗt>#h2t?i)Kwm?9\g7/~Pڄجl֗LX$"$6FaVUT)ܔ4'B͗R&,Ek=WȱZt MQ2TP,5&ti>V(S.!uX6OIY لo1ZUڭudzGncͭ7؝j-/7Q6$Cf'TFXFq%Gϸ4Ѿm>O1O:EH=0⤺Ez7-_JA=ʈ< uj>ғT?ge>7&ٓI$ܗ7X8i=eWA,"ÏM7Cz4UEwXWcgSly;!ޮi_xx;o#͊`,k%y7 i1OQhv+43ZTqR= l4yDu1913gXdJQqyWXy_6޳Hҕt0M--].9gݩ5wڋuv33F-53r^}ΧRlO&CLe7%i ӷrYHϴn|!43I<_Ϛ&M>9#"0jQ)M ;VX^$>5vVt\F~57XC1)2?/ ;Jz8סZE%$'Xч&3Ĉ40uTygw[chy0JIə|&|/ɡ%_VM)ۃ>猿x; 5m8K& RbKHN8Ȏ+z1[%36GFe戹}jw6 7PbJTU~ɩcn)Q 9ꊆv DN\K8@$F|s" vX©Ɖf}!r1 @6Gx$[_SĮ[/6"cb9ȧrܾ{K_|d"e_P¡^o3oiG+jq}u#v,a!f|YF5VQnx_9Ypq},S( oG:xm\jГ~Jru72@r[d{k0z ZN;-Q(F6`琙!94ifF e6"; N`/ækz?xm҅`qc1OJGK oլugLw_6^Z ͂R#sɸQM͸"2y7cw eYSp^_r0̶M\gֻkhmsy.6Dt{dq/XcP٬BC3/_U:m#0N#*<Zζ^3yUaNpRN3 y0"ڭ\zN0~q-|K䕣So p6Xַ)0B\ mN\}zĸ)c*1J#;1 [(B-r%:38!ٺ k\q[/) z"A^Joj{ ߣ4e)*8wzvXnZWʝn.Tr1wR5*{T" 2k&eJ uLa m<BEZ+m?( 'ё_3[&v]᛺+/VMFx!i̡ft*WWΖʴmID ./5;,qyUdI ®fp0Qr]cE)R}|2Iv=4ok5šϯ8]A\2n=ȗ @kg;v [[h=s BDE/yUAEY?dVET:^fZt .]s #b{a\S@4~>YVk#O3uv_d{_U{/;6zs[ /ݚ b)>EPQb4ZJ$Tz΀{)qC"3\[z؉R9`6A{d|'26mW^ôD>2bO!L'Lt]e.VINT [^U#C:5?q_N}=Sg9 |f4iQ(ʬbvpK~;gi@Z|,'F~͏z/`sN`_)#]lwPKx. s ҭâϭR"BfצQՆbWie.=m4!6 _\߂̘rXD)B1b-ŻlEԲ XPsfmF{S [w'R6"K'`(Ϫ+ 'ʮF4Ku3( P;&"Fmi5sa:¿đOdv+A+o` 5rWp^ZKgean[ok!QӖZ`~ Kȃ6^@X0~ ,>|;EJ>T,ϑ. ߁C-s@Q鈋=>hڀ>ډ2tS"U“ 3(kZ1%{ҁoqa7 e Yp`6Z`@ B)?5 f2& _ vw׍olۈ%vE,{Bx KO4SKgO]Rev?BqD tm'ڛym]N& RȕXfVs.85>Fz6@.Dy^1;4>Cjf)@rLw`29CԎp (Bȓ Ze? @'Qx򞮦#,Ľd{d.i;{;\Hi)5<(%$SNݡv",->P$]w仏z0F2Dz"+ĶOG7:L. hܚR2֖ }Ah"9J[( .W 3|!'u;fn9]8;q<ORНIZ":I/ u髪-Dsh )Si(Q*pya@#.(y =W*A RNM:A45Qb^\4UTXf.̚O G<-\LCQ~̘i);=egzsP.ClF#`sOo-J+(b>kmHVŵđ4Nwj$CAe5oGsF3 7Y}:@Gjswxao .5{|'SM]s|NorC@ckx?" ",TqpA@\v"ehĩ#2vC|sJr +HCI2NҰ8cͩ%NIv֫'1/Jיp/Sf*64:a%ي|Hmq?|qqWUMx%|フ6sWDeQ?}Q9aa_ UR *Ize.{&1V L1LPdǧp?IT /`ۨh,\1S位{z(F ]ܭsh:f?u܂wx."Tإ$??Qh?D,8@A,"鬡`wWи]l˂:0@z04<MAq(U OQE̕.\A,W! <|^"׫Zd!4w4ULC!' $Y:ᦿ1ߝ\ۉxA;AH`B$M\CclǀVjhQݜrr(n=J,hrb.Wg++% 4t0D63$撖2̝mym+Qc~]Y='e]$03ч)Fwh`7~X=8NL櫉Dќkx`6:TOF«Է' ۍ= LU',L0@Z>il9n )e795L;7 iDONӆ"j&mf(s+'4w8ro~:Tl.'vDzeM5 (#2LVFM+ V\oRK }lǧutR$:dG1fw3NU>o˕S'*]I\ͨ`}n[hlLiz ah﫯0nW,Cv~q)0pG\#p²kSi酜>gOj9ق_x@$$8_i/Pi0 ,Œ,:_ .Ly-T&s5'C;pI2~4~Mrfi)D# DlZS<_L1D\^(> O.ZuA>E`o-qIOfjLfFC4 5u&4$75 ^2mWl%bijLDW'QboP'qFT40'"ut)5{VLbz_|hvF"NyGؑxllvf1P˿kVef0"b8Gz; kh3] դZ{2}.nW h1 EƟAO[9p g(}Y 2}qx-<f 5 'K s<ʬFCxiƍIyXѤʦqg6.̹*Ʒkƻie*Z~կ"֙LקZ쑣n`e0JXL6Ӻd$~.(C;S0W|<=ATYH^4 4)*=&+ܺY,i;MMp70`i>B-Ae}lHw<q e1=| IN> Ӡ{"O^17m&X\pF8Kw L77\*dvalkvČ@:iZ*Ѡ/.o|8ѫ5Oxo?RTH}񉜩%V͝'Z7pޤR:BS~{虚MAK5kܦ]$ aN)œ?ul00֕ӔýpO0B{1Ғ <** BIĬ~c{8vbeol,k*9d~ Ĝԡ_߯z|I) O P{᳂1g9 yЙ4 e:2w|=P1Yχ֣v/ȃHw{e٠!h?Fw6F+i"-V$JqewjԷʤzm7=uAСe&@۲7/a޾P/?\^I/W&dl)z>-HZmyKWRL`-K;W(<$\̂f47I(/i]~*U9@Zu WH7"v&Ɋ|~&7$ܦ]<.HNw=D'r.&B1.ˆI#\#yǻϒH m])`[lYAJ$#Pe,18F.jF. {v/{ΧqįQV]rxb#`!TP,uG-S8x_GJ}Pd| cx콲@zT^ uש8ӴL0{J/ ҥgkZ-!o#׳Fo^l2rE i?!F zi?!R" ;X꺒bB;h O:|.B%.He2܇ǣ52#ײwi%|S!Ǿ$ *8֮aY4]537!א:Ɉ^ s[^R|>~h`'*I0hLuMZD尾"L`Jh0Z(_kK@ʼn ߮x%Lsl.E "y.iqbثr?4н} S^`,U`JȵS! W_d+η7ִ#vw1`ws4ڠñ vzV̄`Ozgf0O3pmEoNm,*꫔D\U($My_ꌒ+q;,FC@G#6ܴ.h$u1zx:P˰`Ra})Ʋ.QZG SS?sq=OaX>lbIҰc;5Uˤ?g^ ŵ bT?3}_|JbT r`\SŶBIUiRV jDM@ 2w u@֓4 k}Yړw#(VSbioozT@ "azw}Kݽ%~ x,ͭA4(MɛGr705}S_px[ '2Q|u7*KøJQ1bR(G^$ p̌w_C(%G!ٝ_*Ո2ھ2?z d1Re9\O#uBDD)`w5]+qsѩ &z m7À>c2~הUIV*۞”gc2@.@Nl-xDUIvb?@"DlM~&ĖAC^ƒ1[c EFSNBbWHPNN @`B/7xxlTfAPqK;0W+[G^bW~Q;)lD$X x{C`1aO: rAAGslwǖyWh2鰾Eߓw/̓9f$?(UY=6q-I@,rͪON~_Jƪ,C x\%)xx?T EdX'<o$o°\Nۋt K-utC=A4P2_0r.ÇU=3=Ԓ(>xe1%$Fh8<[ Q8tpuIC?V(3u T(q30M fpd7XR6oW; 7 eomP܈hu|zmy4TZrSp˘[ |{utt,UtF?^GQWY|=έfS'R'ψSsD~+-~ͤTm@JV`Cx(Fվn <\|c7zz,$;a >iwT~7x_xI`~"* YUW}ehqK4QT'Ϊ/ =ga}UbXFC ,I, ;wBΕ/C |pv dA X92g]p1[,wa(":‹-h !; 't1y˛%Ydo|Y{R)_ph(OA1a%3zm]kO ƢT# ͨ7o@ 3B]7K0qt۰ܰ`V uQ+)ɷz, 'ښF%xo( ٗ7jY+␧\x̽q98(agxyL#BZxL pi2jhK:}1K+=YuF:wN % &30|)q>.ͩ2eW{y0~c>2 m[/ߣ&峇S~gg^^")3oM=B&dlJ}׷Dt8*7N!dmḛxx#:_H&,R2˩qN"JCJcu[MC>#!ve/mH$/rXg?:p>Ns%ر?GCcp3b 4X3=a1j"ђYwtћrRgAY n2ehgePֳWud>_6 i.4?V^zo]nHRԼI%V;VMCljs۸.xTeQQ'vbc[T:܆ǰ߬2k<dErS%߆nv[t18T _7;'Ezߜ4Ro|HJgϘK:gja\,)qgeR9c t1yƫ,픕,wn2;w]5]Mi72{ j6g'`ra;\(grS.; {O1Lt 0u39L.nd2O(#`,F׵薟Nc7 Q}bH!E9T0 v:_> ,md, j-.HW:<ݱ/wӭ\lL`b۱v99UwA-y6A,)Y[oZS?6I3P\sߥr>^l/{**Jd0X 7YnaS*ypW85y8/2KU?:8阽W#DAv̞* `ke8&eI uyCyGw[3AkRgO ݣsFh:Q~ ucNn dWenvw."{gEAt7Ī]. *4g|rn֡ OŻtþy颂NPS}i6 V߻+MI@_zY""'izbf?Lj;(ya-1bʆw;S~tx܅8i7rp/s8`{٤i(N0dABGX,mxH~C|7THP$p9Oմӗ&U놎\,|&z“oamC$;L6-C=AˆZK3_C<X*z&-mEoӓ"FM']@15v8%lL.[tW=#v.Z|C+xF=cD^ ʪ_ludM6<3ϑ>g wX@-m_БBCvj4 Ɩ̃kMhQsw@Ed.RZϭm*lLFf*0PF2ddlM2%0ⓐOW teqrӒ-alMfzŢ30q=I!j'BqRԝO%^Zmg$vC8'4j`)Ľ[H^[(SdZ*.)c'ŶByCuoknlr=]ۜ[H p`Uj @Oi?#pBKdiτ[ 6>GN^d< s&LpWT)Ę9@.oDdߟ}\j'?]z|&\a訮 hl\v>csc^B8<[!*siY)p/*UMA$UINBҳF$fZ8ܤK' CʠNԖCl^lgO xx|[}AGba>lyi1ĀyoD-e0|vPyeCtl^Wa!FSAWM,FcB GUmZ~n4w(5rcΒF 5C+_]w9Af pVXaiv^'<8Mfo:3bYf?g~?2=b_7Af'lDʴ'$ؒs553/zf|.vcF}5uJEL(u#:r4١-95k=%z:Nljc@>#ڟsw2D+{Z>sÖ%}Kr)h)lbٷ?$axp?\%z7 %;HV_W(!pGAa M:`4sm·rEmyYNL3ݷ%[KSI 'e[G'Xj4%jv/IhA;f j]^|_;VU뵵%n逨'߆C%t0y|〨Pջ/Fܟi`O!W[d&)lsE}b*}{VX{޸[\::҄-΋ J1;NP4O0.Ial^e<4O(e K4OWaŦi#cNq,6q,K5\W<)ѽs̿Tdd8/ʿS:.(n vHIf,^ C}a˽9jzKab1ĤPT@8H?Y{edI!=wd'w(B-Z1B/ݣ@XxM$Of}) fo^R*'!V"o^I$\g6zᮺẀbIq {Ms/ӸwuX*;xlfF͆qWn7Us/Śb/TvQЗQK g۶j7P@ICYpM>ΦoX)'u!xqǗ7\ _3 YV)5ib> w$*SdwNeXEu499D!د?^ ~r 5o(qnM$Tn//FϘ@ a*]Ou,C!Ro265'O`956gvƉ?*xãڎGM#.0! T./8\ eP'QQ4%iqsdyRhߒbp/)T_V#*w8qN8na4~Z9ӆEE! Oq#U6+]0L gU6-ݖE[,A14u#yc$ǛL=Ƥ3Y[eO#}]_cs#aAxYw B-s Vgo{QcQL%F6dZf&)vMYA+=+u}o~X` V3B84D8r'G4Q|?mEU# |=muH^ʪGSvSYZU1י߿| pE&l^$/ۺ9wC (_\)58k:PPxzw6.t6Y9ǜbݛ9b!ڇd#cY^UD@@p=.˗,-x]Yh =vHbx u?鑸"HwC/ Q5HI9H8%GuJwq;͛|7U~>VE/qӭCkGOpz?ry!\AsK'xv (X;phم?r\xo|[hY t*ͬ@NOI(h PeGqb:R:0HP3#KG]Zfl+xLKTDž79%}mK?Jk&[&C;'Pan п=i;T- %humuYg HtB|Rg~B3#0TAYsUO?1g$O?-:"RN<1Dqu=^NT^.魾gIBCX&ߠ=9+h_$R wRMt?Ƶk=Iqaʀɕ:UWs'qeyP3{<0LTɰ%BaYW wNwJ͉b= "K t)ԿssJ8'R 09G^FCYc” O˾́g031 ,sU_/W1UɈ q Go o'{:=~eXlG52i_ eZj  JGz1`snjm5pzjv" ۻ՘Ӯ.P >9ddF􁻡I$~l_`X|YNbrcDL(tZyQ:}>_7}O%3E& 9 o|h HU UqsZ[Hi.3LGvW]|\qG1v6R ٪<2(&k%FHnlE^"75t'$VCE:S3 Z- ӹ=FBp[M+[LHFr t΂8D$`9 VO 니I"@N:=;#Cl J ࠌ_d+d Pa>ٌ:rJ -%CHW7`qHL!X}קvIbCR]qŵt* yPO$&0i3\.2m R4}U؛먝眗X7(N>Áx67YZtnǶQRoDYVlv4]?Q߁xjIە'D-NQ0pL >k4diAlf`&7Eg#p[ݿ;:8{1]VÅ-%ǁY.IweI.zmL,ĨnKԹWMKkW,(D)QK]v7ՓEgHgfғ=(Kd3YSCwƲY9uѺ$E/1AzSp}/&|ɯ#c71ڒw*'`1_r{3X6Jԑ'qV^!!V9v#B!0IW< U} 4Uŗ *2^)%YVaaW>c)oˊp ^HHre˹Cw3>o4J~S+xb8#r<_rE[4ia!5}Ou4-LW6OW3L;V׫ &_Q#qhiaCGQAg|Dg4ےxZ yԉ41wAFU2ӎrZ0 ­[1#nDKdtgwRۓW' ;IH& VqxP+JlEhiQ|҈з&xʢ͊Ia}~&OJ2Jm~M{/mj}Dtx;1mqp`J?qeJf>~S՘Ľý_\]1mMQrGrlMfЖSs&(䍜fYwS(M NLc#k.gP(pa*lǍaXhRpL Ȟt9aװ]i<@.oӁ{-myojw!ܴDj_ Iy^H!\>u| /dBD^،L-7QQY U~|ܐRxn=랲l|ҧJ83@?HlV_tOdS}-~N8DˋvW6`.3_lAysP JY=DSwt9CLܺE 7AIn0om[1.}*1 EjzYڪy @/lbAz42;P+09XݵIPUQ@*%KY=IMPP3dFc#tAÞ[ʬ$K)Q1~{#EBo|m-Ek@=܉dXLja}ҽ ̙Mwy@?*SLkH])PNSھ*@$ߎ6WJ)ij0:#>RB%!;*}͒=B}LنƴVb #a8 1qI9e[YޚtrO9"aW[pH}й;PzxmC47mQ7ksIO!utDiMPg;41_E&VЍ`qܜ&='j0pvSݻ%I:oNd޿ _Tp. z̑C|du&)UQ*=9`={"= yS 9&Ed ډZu䦈q)efu,qP\sϻ*aZW04t5Hv°[YV>/ ]$u2JWnXGWZ$H8cGX, E^Zg ۯ4ҡB2Fw㖪 =ٌFTvpb<#YN~@cwzQҌb'XA*#x Rin#Юre '~aG6PPlĠ5V.w^gnڤK'#RS{m ѹ1dE} uTiDt,VFԧ( pQVXwvݲzpjCAZncqh>-3/K4?E_x;kHp 6ߊ*c3֢6A3[ ]/`U$VuȲ/:VFfn$0BZkYh{;Kɠ\Ry1&0br `1ڔOfX^ ('b߿d?NqmInH;DeC tdHb6!Bۢ{;m.p|\1_ZwIds,E bqVθf{Ѱ/?d2_\=#AC&\ m|*HNz cБQ"/Z4+-s$'vs= moҘ(%iaeмDF:f Kt vb2ZQYQs!ʨ/3c~BXo~@dLZW5 (+(Z?OjQC@̸m& (ž"uZ26dcoA{Y'} :[ѽ6.Hد\~g H P]_QQ"z'-˝loA @AHrx#WnI7yܞu7{~zxM$< }@>9BGC+w/aT؈g`$-]Ñ^oQs Z4=:6h 珓Ty`K-Fξwyo)Rp]Ti2@ި}UA(]pYFAӧ]r !5*!C< Ӝ@٠^ *5HnVA8 9XN=vFFg&KvHK?%a*cJ*Mƃ-HEA֧7\6'Ҿn}KcCQ2@7<^iGݱ[f]ŁQp}]|Uhti,/p!@U)o(i5 fg-v6]Csl]a w{txШU~nx.%hWzz#Rl @~l9 EiB5'whlHOmMo\ϡL~хzxs#xy}PN2Ǥh(ԩг!q x|/}S 2|J2{~$ ^װ\Jϩ2ݾZ'ˑ x;cpʡ?B@BE_-KOdT# @Ţ|UycɊe[SѼf]|L#Ast0d ÷-A$/S> /:#{IۻF`@ E@C$eLy< |a[9Gw,F'0{jqpBIla> f]5<T`.8Š92ˋdzi%8u}Oڊ;, ghep䔊ywZ/62jF?PY LJQ=D-C`'sKr?'c3^΂X^)N8`>D_#IN?bqly}09%'ω6HлlkFT niibGq#>{t8JJ'0TvQ dPUb:9=Ņ&̀ryn#d#⋄27ZrW~ O@3UQ Ű"GytVa$}kIJ,U+Űso2tOAPYW&tƋ7σֵ(lF 7ȊwhX,kf]1 ( JwU=-Rt3dzqN^tY A䎆9 N+BXo5HeF!nNWuUn o -Mpn#wR10 E>$>>yE; im7h2Y75W&Phih^LAc߾eKt^:g ̛:@ 6". Zٮ:2f!]'KᤈڛpPe2._nϝ2Xo1{f1Tc߱t % /}tPi1MP.̯þ/,TZW)6c`z=kfή ؑE7To-I]!/?,Q^IZ~i Ml2KBѰȧX()v9նfPI3F 0 \oj H˼UTQ9!<_IEDgedNCi"[tf@ch{%+\_B0JHS6ޚoO<{ȮJT02ՓH9R?"r=xŷ< c[RŸ%fb2≁W5 v`.']-)ke#E\[Gs?n6AJs*$^NU8᰿VjsQ<= {&EF :sgK5Vfc 4CKRBɸJq UR $1G"znj@?n_ZSف-D |HCٿv 4H{IZsN)x rd=۰!ޕnVuf M !<9).8 ר9 h2uv`N^gv̱KQ!R"1³Ti3llNϞ@zFI[%($\ЌcZl> p9ۮfAw!V%V=M|>ĆYg-teߙ$uhoI$\͗v|;`U yJH#C M0]Uc:oi\Ln o~ۥ G؍7)7vGCzWw g~1N':e% aWÊOa°}и6,P4\~ RKg+2(tƞP׬0G~z&I>q`8c7~{%b.EZIUD!+}jGw0-žQ ]hgkk]z/v>ڝȈ)̞bǓyɢ3SH"hIn |M9 =Wd SԘemש$DKڠ^5q<`3նQٗM%GPa4ܬS1tPbA_8HZ\[(2T0-$ߞ6 5g0RNNf|kAES_,<z7Ѧ trq1d(rNhO_^d#qpfKʝ9ͤ} p0W4D,,JM*9[tgBAkhx5 3n݉~B}C\tlKiqB"0ڱ}lj[#׆Y.k3b "@a4Sko"pjívi{s3M|BR&X6о^8J{\pC6RC30#iWV]I]ՙC!y ] n$\^6nniV"ȃRPf󧬳l%`G Y2Ce"S~I1(Ud'^c( ҕ"tx=hHc^9bN}OmM Mg"cᆱm`+QZ/2NP=?8(}E^mZO[3~Dw/p4D׈uc*X']QѠ5cR_.ۈ+ ]:::nfHL9ddB)iԌ:2P}+#Ƨ( <Й\hd UxZur\"=Pn˽Jb9>вj<q;QMt}>ă a4T.:ɽ}XX!hDy9CvWU |/̬73yR,~\vh-9< UU LBeRN\mf4 @f)E1ʥTض5[]J@ cLb}X`R w;Vvc[wfd:}NpG֨ wND}"/ux|@AqBUaF+0; Z:x^6L\Dꖍz!.ِ 5&_c R7*UI>-f0Z8U\d}&'3袜ER]Ji[\CpN)&;Z6[ 9ϓ6\D}m$Q8L}wٍng{Tzo?>uɔy JCw@=6@ J(ooTr1/1 uR3Wz}vWǯ&e2^ x=RdGq@{givI:Vx%50GT٭m~zkT邰ubO]+$HFHFjѨ)CZ4 G$Ď5+/g>;` G㫄 G4}<צ-?xfBjrzň~%d@!D>ܱHUkR{ sKdΓ_eegWݜ#CJZp[Y&מ iEoЂQ>/('0sEm]gjj^>w)Ÿ_:x@7GdRc\iJez@ ěWR(٥ݍ Y6WSaMXu m zI}{O.w Q)ס!;epJ#k'~|]9q' BȰyXp{8d3֑}i_è;zmie8~fF%5BJ(ξZܳ7"fm*2TH)Ω!$=W=$}*'x=<λ@ėBq{H12:}QV#0cawZQIԪ a)W6f݊m*i;`'_ h6KU 1xYU!3oe\v+>D+*ms,eD .B9Qb5'?>"[֗Es' s.%Tٿ5X\ ,O*κ%`3sE0&~r+iVDM] U)Ð{Kujs,wh<,3E|) dH K5grmO'~=`c;#vaE}sI0XٵJཱུ&On7'̸'4bC,$^GiXȃ1!c ;-8|-6^stNO-rnJCYBVm(3DK}6AU=3QE3kp! ۆo/tidl~ex^gHLo[WwHU !v{xLV0~kp$\ ,w _Wk5^wjw0݉Ӣ`ȕ$&)գqb< iM:jSRi x┘FS1|r@nð:+[aCqY2hľe)k+e_PB ;]"(0Ø/˄g@| 퓬xk <.7\!vO",5۰f> pcZ~\tLlkGԂ7ÃmiTrE bH  ܍:-%oW:gx> -8z(9}(.t ʓt]`t<@ڲbH+xշ3U2Y>3_|ۯV;9Y F6;y6y>G]b'%!JM'87X ֎кoHm:1!x5*ѣ (ht >5]?eH&x<1o |Ъ1(ub-big,Ŭ/`d},H'2>)P;j؃I4R'3`} 1KkӃdd]}sxC׌4;ߜ?dmSqbvf[ZEcBz. iƕ]XS>.1N(xPs N ZDO0C*~utP@ fVqC-4X3!]Fͤ,mF u@/6ḳi?\eKeq oq:52^&mwUi -r[6EOY%$C- Л@$&ېiRf : {UBޤ">*r#T5 %;t0ddvL̗᪥c\dN^Q]Rӫ20 ߛi_?aAw"-گ--ۆގmY% >}dotpf {EɇqݽCDa. {_U.bTibvD3hsk]e0 24PttQuلj'_I U@+d JdM/(Augr^rPaD*p$9̧Yd5 ' &;<~ԡznB:ҾLKIa7Osܻ5uۢL/q G؝t~е`Z5\HN!8`4TtoKD>ؾjd׈]vs@ev(f-$Ь/zT4%njн Z|)Xwر.mz Meݽo˷KPj1]2zXPMvut$ V`V7J&ϼdŔAJ؞v+?IwV Y.zL~e>Ob%ـY[2[f6kyuV}V\fJԧc02k{f#ZN SZl5jMŴ8gk BQtĞ,fezmA*>uzx;9jURO+J%QU8fz\lخd.u;E5;7Ŧx€ݝRGҠ=<D#Τ'q5Wq (jh\cxuǟ}pjTAy1F.d@.s&э i8?,^LaC> TCtIn€SxL\"l S} DcKz e%ɐ |qw<] {1TT) Hi6tɠ4 ք+J6y m|{D2bN3?` tKK ;A_RuL_f"/Uhio+/x`3;UŚ8_9b{M+gP1g#ƍb)%,n$;_R-'TŞtٕv޺n[KmX9n8`)zQ 8㞫[%p&0# -clzȈꤢ2!uMy#@(PD5E"W`2b[|Nj?;sP.͐kHۭMU2e H!Y)ׇxUhI' 8_?JdW 38Rfjv[6g( KpѪ E&UUR|']WSVI<~sne+.~B*u<)C}Άh EBs:LG.6ˡE7>$́XԠ zQ* \^mϊWK@]( KaHdXq S.M-ɵ𮅁y(1Ly~A?hm+ jjq d.w3˾9fdڎ 'B|jgמ -#}4;@! =2ϭx ЩeM?vùw2~Kϟvgn/Q. =HRb7஑98Px9蠸ɫ.7z{+L!߁.ɋUsքSi(\ؚ[* {2*́Z&Y\mu6&R`X`%CQmU4pt%|:x)7 emXbT[3,8'NjafPS5Iv܋$lxEvzf! L_Yd)w/ߣ } Ng'#p023ɾ)ҏ2}cgrKO9Gx ln+c~V[]wyz6U!8Εxn*c`XZ{֔Ad`z/핔 \J6w2-lzh׆-wiW;p2x>ΔVH+9d{itDGXV{# ZwJl=QzDtq5.rL%s,nfD{g۠.oBwuɸ盖9+¯q_n ob4@89? 0~۾/xqҋt$[3놷IuPUGt&@*eQ _?}.KO!bb|so^yuvY=Cr+&ֲ6δ vIfCvmJ`y;Tst5q.xZ\Y9P,Cm=Y$fA)9d@p`tV[C9>8,Ȑ {l,]t)eֆ4͉§gHAo˘|S&a:Yo[b(+2hD*zZ$HxRoLs qE;UC\Lx|~A!rF_,ʅX!W0v0<{JPK Oȱ&/ ڮ:hvxǕu QUtPFz]:kרsRΤ7YISlTdœRG{+*8 LwKc~HUN!يqEʧWƱ¬Z{[bI"6wi~U5i6V/Q!֦ XRS&4z!zgΩB4No=bǦDؘ ga09"8@`?T;dI^M_} %c-bj}MrcP7[C |Tl:`/lKɃit*6֨@vWd=4)mt P n".ݑM괔k*zymj ] ^->L_WIqNrzΦZZJf ZBEGZ6 EVtPMupTP_Ҍ bs+j>3Q[sUr!IW !txa0.U;{H)sp<,muѥ4 0'CJ˼ r]GniHaŤHo/EKL-q5;RCɸd$%IBpDcUTSv@|l´8 U!v.$hFDZe0C)D$j$})S#-TdCMjzEJ:v8D0"ޓh\׏\Y$j-2s04A[ȣĿ>wfh(T#@%5z~%ˉ1 fAm2 OnS(Ү*Z3< ‰a#Z 4. ¸yJ_r݊Cm'dU(ׅYz̼慶e978yH6DD)#ӼxAy:~;GVn _ns5ݐ)T/%jŨI]Eg=*YC%% ^]F!J#7E77q4j$6̩Ɏ> Ë]Ebiɹz7]ƿmjGx+̯lqHTEa9 (=_:+BF,_l8ze Ɠ9&LcE`SWZuL`]rs*,-w8 I$;AmV:M|"zuv7H[ ? fǽ<c{ty1+mː] j|edI.3s?c?5VZc>7ըGd*Q hC=!`qo6tD1Ҝyt[tN2</_& ]SkH$CJzK㡷\rhXqقC& vְGt)xhD4O{ԛ_n5p`%SSG k wLSX…$,'/Ό<;`ܙ!MqPj짷:qysѷnr#GL7}Hr9 $Vbd(-+5&$:Fy6)%(\Y7 ˅C;4J#s '~29\=[..5L0BeF(X}USL)ƖlCS;-$/oqE+PWXU%-xܶR"AX.JdEe^0m=I{QW"$u_N[1. ԏH3QKh`&b6>*f#HݍF̈4_n oq%cOq[vF턘X#bٶ<@āC* x'm艶 pU{}0^1u`W5߼sי)$U}o|Ƭ>$ڂ̈_P#߃n9_y\0Z)qNt䏷h4I\6ĵ"#\$ VUQXL+I\N3$Edk۷V7t ؾvP$lUҳ3G0̢} Ydt=s?g_T4Τue@Qlz[=4/벢 zu"KG]3(lXѮz =9 *{ VKpDuJ6S, T/K-`0]b?F;Ix?RfяxEv%??֚3x*.HuUWzA}ؚO0afh-.! h+Oȶ=uaHclZG| !\0;,Ụ}QAR, Z'Z*cMlzSTƵ+GP(Xɔ]}Wh*6r uf36_'WZEE05Uk&&Œ=F!u5<l ?$fKIy4\މq;(Sc|BQ9E Qhd܍n8aI/&$$n*zWh'% 5 G=Yi3UKŨR6}kߤXsSo4r^?[*NIӄȴFMd'55@˛ տ }:6T :`7uEԋSTĹ)nvbX)"QCT~[@a$ Tt<MԾ7kd;c; B1wܮ8G5~4v)h! XT[$~ `AFJs6!<|x:=0kS)!aq8#`Ieخ;W?;'J>Nvȩp𷟗,JNȹHU+/s+3c0 ZdTqc}ZZMj:wHG ̽)4!fh~BĚGqS/0>Ztwhn-;,_vh&R2o3ŊKC|y͞QmTȑG\_vK JM11~Cܤ`!jWmG":ݎ/\8NLV"uYW{,sddJj!@bTP~p6b4g^s# ⧷ǝGR<7(?ҝN Ƒ4iUhǓ^.N@_'r1̘@A7AqSl]ߣhT& i>c#S%m{@jS3GR AJqyi.uKR;gF>"{=Vyx^b˦^|lH'y߮`Y=6sdt?Q;sq&y1IARyɜ ";5:RqைHȤJ-pa FC_>WFk$hU+fi6' g\eTbxeeݡکק?&( il*z-("OM%Gh5 :m"u?|aXgk!7ę€eT.%󡣴UlN=. 9LVŨ0lϊDMس>"jm;D:ď>5EсkHvu1o?HZäU0V㡩WAEʋ48֠T/zU"zaW גW3.j]ba"i A]1f8U Nu: hǰiq',=vr/^N1NMDtf1][ i2Uꫳ?$¨ur cS/G $i@sUTQnq%$)15av~)dǻWli󧿏KG8V7 rVt\@vK]RpZ>fNj!pM# OɅn& dAwXq(qCI;\ Yaz vIL]m[z,Q3sEQOw;<I#N$Ie1nPc kY*Kɩe OEYהfQ-rž]ßM͗ z5. SиD=8#z,-fRP`8z#R>HЃSgǕJ Y&b#qS \*&Lw. T f^֡[-]n* x\d c)-W;J&8bj̮6}kLq)~YKU[ēTd|MLYuz Z&[a7C0L7ʖ~P@kbv)j>3Vk)%3 5F`@ (S#yvطP$'YS2]2NZYgگMՠ 4T!CAhbnB eusn18 S;1mbp{)rO̟BNֻ-`S@gnC.YQĎ-s[iMAKgc>f+w-]G.^"36.P'ǥ/\"F۹iыN|Jo`yۉfKp<BsU_a~" LɇO|F}(ꌹ:sj]D9ۡsTo$ | %MhU~8ʥ_}|5*H//4 nݹ;9iN[=5ASr9?~ nY?= MO`pU؊Sw &-)M% fI9EPXk 冈`q)8㜬!+lLANa/8T1 JSզpʒH9t ,.Q|AxWLyOSwKQY$3 JIc6dPDop(hMϙLHr7=ZgM}sGc۴bLGE]#>] 샓g37eGztGr!t=]gq3ӱ@F=j6w;{c%eٷy.H 38ʖ.UR%E^ F1N*rwњQ0ńŠKΆ'#vGp鎯]P~B ޥr->V ItZI ){qf[_7;.~C3FOSz<H739t+_axY{, 2EÓ1&q;ns\zWɩoJBe&ghYt<MY Ct*\ 3S4'~2JЄqI1Ȫtr!*Ҽ<5DZsGan FԗQlcwV/t BpkC^h8Յw4AmBEԑ]^]v WYKϤoa)Ԏ0myN~uNZIBW{fOQ<1_8T~vmBҵ\m-H!Jdjb/4K9Pو5.ޮ:ѹdF{>v(pU.^bD;ġbMMbkI}~5o$>j"lRbLҞ0U_˫@]z dbJ\}-u)?WA2`V^Ye}yIW !K(DlNS |r%II_x.o3D9?@ݵ+} ;>]HU{Xx/ S#lh\.ǦuܗB!Cɓ\ajBĿۣn)- qo82r끽juNԣtb(*6՟$@mX Y0+uuYʔ@ :>kM.TpB!4ފVUNe҇. Fui~ܴuZT3 Y.1ḓ2Wnk8&QZ"Ԑ,_pD ݛ6J϶k)[/"o4yl,,$T[nl{ z5+Χy/5LyO,8ATe֓r6PfP暮>Eo0ȁA1j 2YjoB[[1[pz@yzFH"n ec9@`kFw%/ES֙U^&$RnH5v|X\qo Nl]5UǐdыHtH فq!ĽNgrS0 THZp‰@>X<)$k H߭u j tVmE&L;WC7%D‰bxێya!qɑ(@GQ}p?.<~#Ee-ӣr%,Mg! gƪ-UmH&-`gE;4%B (iIŊMv [@y+is}q$5xQiGvyݷnZJW3zmvDPGW;}AlLrye^a]G9w3X ӂ(ޅR=P]g!m@rQ̭zQ<\_TmKM+!y iż«'2naLeo_n0G#.!E)x_]Fn)i5Q֣WjmTW$?8u(O~\s(DžF=xT'O!+&0l`b]z%E,!,.%Nʂ*o]1Y߹EY祃+lm>DOM6];XZ Kt_td6aZHpN 5'`Zit~抡D(V҅՗t8`>А`k'!!OkaZ6`s(@ۆO<й( x]VN(K+ Qb4v+Q)!uf7}ߞ'kluZ,$% WWp)% a~eAf͉Ubʲl8/_'G$^ew| /D^ԴQTxBuA̪,Km# ä%u05C)F9^X!%ഃ&B*맼Y\S+K?߯!Kaqo,{C腎yPDVg ;}T#qsPF/Hw>S>~8L([84'QwGr9 GM~ H_tZӄO?~Bм\&)eڝ3CqF696_$_m`LV<󇖾3:\)hsȎM="Se<@5FZ~XN\&O~POjD`׫XӐZtVw[U(T9!Hep>rRVMZ4?~eTϙYQzENq_0m/@Aw.^H. H0\KrTJ!BW u(OR$:>,# %tI#w5#H~|/ꖲTIZu`D1h)nWYrf58VXMAON 6jA;<5SGe٨COb١!pD|3k[\{L{(cLĤ쏢lfhć9T͇ 0mdg՛3SZɶʄړ渜HTl DgCC67j ?X|oDÈ(.ίSq]0# V%}QۙCHZH q Y6,G9"|?]j0_N`}]CǨw=  d?GgE%Yn 8Os2 iЎjC#r-&/ X('aA( eqɠ*V)%!xI« ڜϡ ƠoUX.ɛmw0o컜 z )o$Te߰ca/XgF7== :u&څ,WHWĦlw UNM/w~?Gрo( Q~xnMdzNSL{,P;SE=TWq-Ut4 ",ԇI!IUC 쉔u/'<{_.QMٷ.Wyn/݇Nv/vRN:lNݢ9ZIxqܚˎ)LBxwJ'e2*v|7L4ԃ7}W.++NSJBr33lCmߞɧާ$8gAm,GgѕIJ,o<+|}xyqxW {} VNو?Zmɉd7[:[L>!. ~+ y(Pژ7͵/cjtLQڶ!~s_R w 9vB+ OͧŒ--#b_„}>wӼQ4n[v$&i;΅/_ju 37PmGfSMaJ;gE,){BxF^QPbD\qBɲmz׿|sDf)w[hf1 c M/5?^d}1|(1%B³792}Gѫvl1 M2Ѕl!y\i:uֻ ݂=|SWJrȨ2q {m0Nd }7itIt!B[/#\q(K5S7#М$yʎ?VՑ&R/8si 6."̬byM¡P8#ɕޅG` }uR"g4^R(R3jm] jH9pknۺ[Ph%#$t$ AY—ݽmUbU'Fu|ʩ=) 7zTX Lw9DcufAڢU` :P_?`0pf!ն7 x͝ΙI+(cLHLd:MV#|rM@H$j{mh EU8UtHYǢ\u>|:Ir"W\ Bfl-4}⤅Q *s̺U+OGєfؤD]E\QX#8~8i%@x`e"$ xο2A[RhHlgMO蘰E+;pȕ\t/"Mb`Sr0)4Wo@ϛ8&m9vHطf&Pҽn[Ao>TXY'^0{A"+XJw 腥qA[Dp4!﷾ yɇN1<N']ǿ ؝|E„ YXS;8[ōݼ0۞IPS~>$9B]9.&Y%;PyA?l5r& w8c jZ@Nƛ]PшRy6>O֛at+06J8m0 ] <#mOitx%$J%Ԯg 3<,ڄMU<^ʺJ( !F\)GXwXʢ%]5 hKJW2ii#ӆZǺn Roȴ`+c2ZVƪR:@Sz 6+`z5eAuiXz`;MZ}(a ʹBA8V8M!&/}nZŃ }v;ԥ7jsa_dwtk}3qK)Φbܠs\T_ͧq}~$7j!f !R>ę zAD}Zkܳj^λDIv0NTPfGђfRf'OW6q$$EJ;ضwp}- 5/&m.N+פW*sЗovMp{'@ebOmYIf߳O)-Ý(d KesЫlX&=߷!3lB{I3]dcL:TJ|Aywy siY[y40'߭izp1T&|ɽAqkF_ ]N_f,07 M{}kT*u{)` s FDvӻ:uU>41&5VٜvH˽o~&}&)TL>5ho@V$˵[oFCAeh ):rHӫ:4ADQ;us6I9VSë́3gLں1ZH\ 9i;_ysl+|ge,4vsCWJcKq4EgDhRh)yVFÏwo=&E~1?q*q;?Nfh+U ̎@\Pz'X>_S%M@PaNa5"F7P{YжDٛj\qqSl+Y^QWxd\rjD|2dPrKB-ٛOu2\TuIq*Dܮ m$Dk1vh(A`kc.=C'"bra|2CU粛>q>$wsqvnCI)NlftpQLV[+c0sUf00 !]!BO`cfz\JWhe# uIvuLJ`Q)/(6 WV:L` ؔ+W){Pjk@:;NW>(ƚˍo__txz1ҳ͋]q^twPqX.iz!SX'GAGrx[u#:,"b"`%LaL?W +@FwKQ ;ڸy6``\JMVqL `x,ju資W0L3z| F U }؈V#Ses} Qkn8w'0FnNjiR6.gX&xX؃> 4F<QOqm_u4dV6=99s{:O,C;U#LpoXW"5qj?̴6iO%ChdIj?eQ[49mO&5,Ґ1P:m(9qWJ|Q[&0Yfo~g\2~d)IF8a3Qy؃?uOΈ0iPjWlWEJÆX7Dq_ CpdVêӹ'aaEAlMd WװS8rVTT]e-KRWGʤT#U* Y1ݖ!kqy\grIS5DFҠR>E} cNkk cMpM[eKcцtlpL2 !|C"o#KM ~|x. 'P^/v㳎*Gw3-lUӟoewzm&#mKypRh3%! ",\Qz"XKUϧ<>VP1T+qm)+p3#G &<\]T(+7L7m W&c)bHj+YJx vy!˴Qd?Lg}^tfW4͂4pGk*:Z;w0dm\k7S{!өՅ B>&*S9G_Ip:~2xD͵n9.3߉jWri{`+#HhCUaוl9LIdL!j(Mx?IaP&4zZ'"JBVJFp#(7jKSɾiգQw۷׶+f4̸ g+Y~mtی=HݛPڣaLF~)m^uU]nNY*!7/^I{ɭ;9lĿLO5r,ryB}HXd)7#aꢂ9fImIKr"ϭPZob"kr[l[ b4sjZ *nGɓ  ZVWL"#=H;NfHtT\ĩ{$. !dҒYVVLZrBn{&{ 3s끃֖v~nŚMqNO}SM.N.5mF.ci\$;ͲB,o{V:oѬ5{)Fa`q;8(*(}1*Jƅ whvH52J%r{Hۑx+A |[R //WŵjhZej-8%o ~xgD}ť6-aVyXKU)Xk4<3\Ns7b噃2ivEعDh3q~״ lj; D>bv)+msUW^[uþ*,}1_:hMrsE/tbGduºhg2 ҹ3\96L _Za-ǟO(T/,{~Q2M%TX٣)CUݷPorAwq"ɞаAz/xΛ5c~?o}uȸU;Xzu6ב~)sjkMHqc#m`NEMɟvYє O%oiJj1u<CY;{%vJhz2WEl,{[oa;c$(6 f3 e!vtzlSpz[EMU^GR! {XxCӝǓԏRp̿3SCjiq5MoVc *ᆉ_g= EqRO]zKd &sWGXǚkcN9c(5h}= مQ~9lԵY S[߂% ֏M2ySb4?{ii>뀷ŮȦcS^9!##sM+ҵoᎌa2BF͈n+^Nl(c"j䵗ǘO~ٶ3Bp@F9v%9IJ֬Kt=c[|pJneu]snv PҖlPDmBє7 ~C.,R]F!&jwiL|}{Lئ0~KaL'%|4clxuDD_z(/4~ۡ}EyD)h) 6|\6(ڂ_"5 f|F SEXP-Fo"9^>Nci(:>W JRD Z-,? "K:LsNЉ=n/)z%|4#,?IUS8|&;}nS AU6с/cF4-/>k `ߒRhBZZRoIyvY!>`/6 %P.vA=_9k'k d)\ATZ q#P7[i彎;3М/ mʥ549ퟩLN!ۄTV9I1_k@.# JrɕD_"R)wmIyO x:a^F=p԰Tma#Rr2y$th33]wN>|DeVNG{&`Л~SU%+H }98s2.PڰFH2'a%x%yS ߪ㦳^:c^m達 >"!Ak. :ڌL`%zCD3"Uӓ[_c~&O>cWleex5dvAEU@MUث2o-)V# o Yc(y\SjO&vn~3aTR iE?$ C " *KP r5{&/t ^}&r`:E dkiY0-{{2nôݳQ1m N~\IΘVHw!?Ya~b4%n|D7Ǎ"X_JwLd,Lh6DٙZo*!FQNgv'x$Mva(]<|Y`y=0̢`UoTF|\cxT tˢ2=U"=yʎl(4 ꔼxމ$D 4կ&?Y2i%TE `&o^kӮJ/ "U!hhxkVCNŭP r> ,]Cͮ-3`_I!`X$=c1͢wyN!Mg'xsh2JWҊ&hc[\(G(뜡r[t|Γ4Bk!6KZ#kXKQ= e2\] ZauK_ ŕ3=$r&3]oD"=K,(,,J6yd!~ezNv |r<-ԧ?;t(Ν:l. [@+YL# SȌKfӏdFX~ C2;U*A(0iUooK:/"Rg5|=Pp_$D:A=*VM>HyiU{і}zHyi\'=|?|BN5D鱥ѿDbq~+yԻ+$lFt-aqp (,ޖz$R_?n'T8^zՕt n}3?;;6ĎPLQJO1"zݯ(}(drLIac6/~ʊPK4+\mbJqöjK\[>jm}u;"yaG0,.:>Afr4Kn;p97|5-U{f#$VCbc >@ Ƣ{^4և&h=e_ 5~+ bFoVe-˦\>>QAy<㳣bS?]`nQdm|5+.97b~ 5U Dt\2lI"GЈ8Ť"K~U˰\_QDQV%"U.7 ~lEWRK{2?o:HFE|+hd3;hiթ;C&u?ls'n_e?kmOXй429 j[]뜝uvSZ<~x7і^7U?9P}9L_hr;eڗ m&6sG$d@ԏk=qa kIt`hCS.i:ns:!F@ц֮l{`P[t͌sBCPiyBeօDx{{0il(XJÑQ_uUJR))zp0`0gW]aV$?~H8Zk)יJGM t2 ?:lhYe*7мsJO|zl\Kdáp;0|l4oѴU2R~&E3F :.d;b݃\_xͥYnt֊K ~cc/HNg..\g#\iߢ @h@q,esrI$&SE!=AdFd:p;&]QѮm}f5ݧ`+8?I<IOrTs:tv8: +t[)v:g@zˀݶ^ے7Պ6w׈>՜1# S7#zɾa;r59 $~`7KDSwn7kke5\iLSZU; N7$1:"2rVATyd# iHqX&. /b~8S0n FOQDR#j*ǚ$pz盞g4xdf#԰z׼ M s?cn+qW!lg&p VӉj2I1b]@@ @8#[V ^<r->FՖI+ǧ+ ikqG]SڒhɥBjOtpsY Qx둂R9pğMb]{ʚKԒ +]فlt0eȫCSdjb۲~f-}o[ .W ~cs@;-őz3ϒְTF`qhqRw;ǥ)f lݨ1VQ()W)mߟyH2)2\IԐt1 BX0zomd&hiO[.;ha~8P5O b2Rϴ Ͼ XŴ. \d`mH[ [uaXPI.kryѾv#cxHS~L9bmїr5Y :“ZI#Ix3 -'xpeDk_"L@*Kf ~\aP> N .K꼣^haԊ"&:֫OoJ1}վ3kx-č0'#Rmn7M_Mn0;6cX9kHWBL"g`Z+UF~kdG-X=s|%<c-;@fWd9#ώb"6xg`K j[` 2+s. Rwۄ5bzo,i+Mq9ٿsNr'a<_xK XIևE鯇y6@}WX?1y֢!,,<@/9VKc-hx?XG8(ݣ0hs:8`#m= C{Wq 9ò!~=V)w69x\*0yܽ,|rNICѠ\^=)хN:87v{,~̸"ߟU~ v{iw~]c(bc( =xXʀ'2LrUKͶ$u' +^{pGu*нCPߙ>FXzCs| љ=nX"]zCY0rLʊO_ O8 \$s/[~\/EK"t5nILpiA_1o@~=Q,MBi0 D-CWNT+ij!-O-6J> 3aDtsOv[0NcEiO JϷU'{%I.A8~o B]Q FÑ +}BaOG)?zf:wKn1WW1OïRfOOWF1"` VX?6Iے'2QX~Ů',yğP/&yaLSu5GZ=Ӯ$SL۱ 4"!`W­Bׇ’:THq;:ؗ{+G?)J/`wB՞BT*H1YXRDh?}w 8RVNА!r7`GuYl_)K&f Qm \3W2@ jʗf>)2>f'4Q!Sci%TpwQ{ p݀(b֖IDŠDhd(yn@CpZa#XET*}VOUq,A_B9ˊR I\7#hgH02-…h\> w<4/[/{g Y8Lf[+Jv@b]?83a[!aLkJWlVBXrgdW>+^- 1;XUIگ"ԏh`KlIlz=cJK-D|&PB<8_vĪŖ̒3Ov۩oTGQbIٟ݋'MOFJG20ra@ص/[ @T2F<_ާwOSiXmD SZMSϫ9YDZB,cg4x@_,L)Kcfu-D6S#]}YFsK7m[mdGxf NjEq7@9w F+`i3! ,-@bˏ9kJ-EYp'EP0gw@Da Ҁ8};FW@fZJy_ f@B8sb+k}/L?N0B؟a[ \J5)-]6l<<ÙUje7eaL3 ?ǜt=IwDr'ͨtgp0a#h0fk ;O K*OW'Ke :$ß OT5\.O0(aIvφ \!)S~Z _@@!𫕙dAs崊G_")8T>Yr$]QG4KCX7T E~9 H ɨHtyvM/0eG蛍q*MtPF̍4&h"6bħsSVRcM5fER1wQU*vsˡ%C6!ȖHЉ]bD8"nta60%tp-_w@Rzy]p= kA(˽{єqXjVZ-2wfm7ިt Ur~;?ĭ)qIY)T)&WwehD rL휓EAWCa" O#6$Ⱦ!3^]'|%U;zViObΑzMhnJgCREjX<7 N8AͧZ%J0qQAridf༣M# Dj%lX'.Z^sB-4~GlnCo>vN0'/ig'q RBnƒ[hOk𥛱!ec{Hl P34`Ԉs%F&wo9Ss5y+:{z3 h>${^A#O GH%كVZ,@FFG"UllL>1)8o>7 eZ8O+.C݈t2nlm@B;8Gig;7l:h%Q4v>m '[9ӬG=Lok[o1qaw >[Jy{GaƻuMki)9ʹbfqRŮ񊢎@ (G /L*r'XZcd5N-us3d9$EkΝH^-GW Aiu81%/NI؎f.QĽ (U:,5|ꢢ|Ì0 ,'*s#@U}hƆRS <ug=lSTI"RɘУLhZ<2{_)(.?$=k/mս$PyW3ȐHG)Rߺ<aΧTjL :2蹣mѭhT<)J< \N4F?Va._F39K2='7XhzՔ'MH?[ ="(= 0$9`61q&VMv?BmJ oj(Hc^kve[KSzEWo~M'.D{7ݤ~HJ>7!MK͒ -lhd|"m-,?MnD+VPG|Cl@ρU~eq\]9vA\+K ǵϚۇ8xI`oaYCGu\zb.`|ɴ\+Dտ,|cX2r`uk$!Z\ $g=QVrF]>T $=[6`, eTbb $,0]/YgmsK~>b$<h= K\>BP 32aA` [SfH4gDdUu_!K͵s!jATNxVt)OV0l Yiʜ>dz\Ҏ-*HUܠ$`EfIҽkfZ;C@PU[jyus}F@y±(m ѣgĠA*>ˈ2&{=-1oltO7'3\Pd-HukDD@xJ%υ7㮴K2}Bܞ=k ^ݡfg3ha#^Pq7Pmꉚmc Zw;R( gύ)2Mdu.|U9%Ixrf= jEЈ x=)5Hm Ȃ5940c/O%rI4~*:tTV1UrHw 4@uVR]/[x>JhP}rvDE̾Ô^r*Qm[BV؆׌򪭉ᅡƀ ?D9$ԖG1תǤS+QtnE}hEo@姍ȗ!քcl?HwPr)+-&W$*t_K'@ț^]p+@ DީȱTUWO0`E59ǯۄcOߎtl~+/zҏWiYʈFH9Vh p4-{mwwld@$+f'ma@W#uKϟ}ٽ<6qȘ\5cؔrE^W61_<❌gbϞfpg&]Q`gyYG'Hlj^QeS"[ftT؆U!2tkg rי FPAQG]&kXP+ yS)84"M30򂈃pTWjAsH bA;ͼed>McRݝ,utflF[uTe7̽@d )|_@?0˲咽PHWsv}9$q \*>zCzA8~U*d=A6<ۊJn2$_SJZLTE4SmӯZo}qpzq6F5TD00!r[NVn'(^ӄXZIM'Py )J Ѽ>Lk0Ul,k+ fIۯ|Ӕ#k}(w(Z:$gK\JzjMEi*1 ӽ#<}_9FH:y MOv/Nu‚{} ưwӫ|#PSw@o4KJ҄z'V 8>sݾKqɕ|r.Yxb8WfԒ]J6 eի#"ß`'G"T*U,dڭ#uFlv``h0d^<É!"X@l܃%$8:,6KY?8 p %\'#k;!ZEʊvAǜ,qLbΪ` (Qo+VLgx*ߛzp @|D^Au4?[F{ ֗b[U"5VbSD!IRY 8{ pt"wBb':Oe|5Ư1޾2=5ۀ>\뜭 #5>7&N,eUȵ? X)'akGQl4bNjgA K1Ž| d?*#%D? g76k-0Qc39͞{it|k7&'-ȏmv ,ʝE?nuu݂YnZ"ug],q4A*?aj'†]0QTf΄^c|˴4^Y kRu']|6}۰C]lAs3:̗ڌA~3/oUØ3az 2UA,PAӹ !R6ϐ\ ul0_9q([RgSQ`pDNEa06ٗ)/1 zkrkA2Soqb{,N?x?Ii!``Au~\A.2Kg8_SU /x;P|s3{BG[NHM q9@ڝ1(>hƕ޻6cuo8hp4 "1YK}uDyZ`f;j|Xʣ}hؒC=m\[/ nABeSnf Z^fy)Qq.bqҶ*bMNXTn7 xY&$ P 'bC$ S'v$!\%3BuW((aTr_1 ?lȭ8Ocu~$4Z׈fFL\I*|> ?\&T16M>HpX)N4E zK)(ꉘU4YP:'[Ao.Y(C^Jw]qO%70D~6@{{]} }V_rnb(t>F*T5\8po2Z΀,]xV8{8I 3YtB;XlgkrȒ]wPSպ InC䈬dh*?\H(RӁ(c2:~c`XHQIH 'D'@4<!uH]$ [!fɊ?qE^ArmƬ/7,`mU9..>1+XH5: ӡBbE@yW*V(/`kؠ|T[C |#ظ^ I3ج!؏th~1ҳs$NA2\_hg9}c£#kKJ/)5?5zH>S+>UUZBsc68~K&ɌG lxzjuz#n928hd>> C߃=% zI \ssΏ}K;vv`"n NJYX7Vpiiώ( !PkTC*ߟy}AV|u3!RH"J]֥aqIQ ԗjYU} Xd]2 8ilUV9bƕnjMȬ$ ݠ}W eͦǒWն'r),[ 5 ]uw&-2;@B4ZNۘF% 9_9TW\&S{D Dt4Sɹ_K6_;V^!XnqU\ rHFsyJ}tzsNa.Tlon|bnJϹ}7DK1PD(pZDjmh.&;1..z Kg|Toޥ`.g\ x9fοe7w ?u;V+:Gl-.##s>=:ӻ>XtJzߑuewջzʙlpR6GE9~R^CUbOj0O4l8(} (O lTY`8 EZ=LE6T8=sΈ} r{(>bNω"ͪS&zPEv-}PE"`'~0nRn!+؅MwmZ!sN"tu!;K9]$ NYs?JQh'6m,;y˳:@QF{(Sq~+^C0i2{b5+Vm6EM>C g% F17XM?jzs՝قһ>Q0}i <9 VQX|`֟aGQiBAZ$u*պ^89iMz@a5B5 }Y8Ip5riGy>g CI OG?LADc dbEU r%K9 =Jy[$?`GVI+%, TZ}!eXXJ&cy}Ph8$V9H*͘I6:a:(qz^;ШăV2}~R M vdHb{`.1|9 jū̢؎l|}ZSm,:a)rt2넑R m`e[&({8:NۮFa`T]!fLm⽕&GO. RC`ncQK^v6y6z'MkޖnaDU"ldGKQyM+eS( l}wE4^&Sl|^cƢNd6zF]Ts%\r b2PSɗx*iZwf#ٷFqpN, &%y]jkx":; mzȘJ8Um Zhe>9x:x7w$(|C;#9SXzj#Vc \ \_'Q'/<Z/{y;e,6hlj[7t3PBNlStQ b Y!}Xᦼw8g!nrMnuYYS"mÉg^v"x&T/BD-)``DlA&ѸT{gǞsh{޶F0T9.ٰ?Iun e,ʠ f 2^BG"I).S<pl\ht8e+ 7<Պۮw릓B" t6>QAD6:̳tc|ق!+Ce!%ң.·>VyHgD>左-6֑*t_`(ȥ*ײ 6Xx[k{Y?(-t>ے ݫJ8,CU/"_?ptX^Ձ鋥押~9`"θ2PY(ˎ9ܭ d4gYZqiskit-aer-0.4.1/src/third-party/macos/000077500000000000000000000000001362723322000177255ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/macos/lib/000077500000000000000000000000001362723322000204735ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/macos/lib/LICENSE.txt000066400000000000000000000221021362723322000223130ustar00rootroot00000000000000============================================================================== The software contained in this directory tree is dual licensed under both the University of Illinois "BSD-Like" license and the MIT license. As a user of this code you may choose to use it under either license. As a contributor, you agree to allow your code to be used under both. The full text of the relevant licenses is included below. In addition, a license agreement from the copyright/patent holders of the software contained in this directory tree is included below. ============================================================================== University of Illinois/NCSA Open Source License Copyright (c) 1997-2016 Intel Corporation All rights reserved. Developed by: OpenMP Runtime Team Intel Corporation http://www.openmprtl.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal with 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: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers in the documentation and/or other materials provided with the distribution. * Neither the names of Intel Corporation OpenMP Runtime Team nor the names of its contributors may be used to endorse or promote products derived from this Software without specific prior written permission. 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 CONTRIBUTORS 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 WITH THE SOFTWARE. ============================================================================== Copyright (c) 1997-2016 Intel Corporation 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. ============================================================================== Intel Corporation Software Grant License Agreement ("Agreement") Except for the license granted herein to you, Intel Corporation ("Intel") reserves all right, title, and interest in and to the Software (defined below). Definition "Software" means the code and documentation as well as any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by Intel to llvm.org (http://llvm.org) ("LLVM") for inclusion in, or documentation of, any of the products owned or managed by LLVM (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to LLVM or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, LLVM for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked otherwise. 1. Grant of Copyright License. Subject to the terms and conditions of this Agreement, Intel hereby grants to you and to recipients of the Software distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute the Software and such derivative works. 2. Grant of Patent License. Subject to the terms and conditions of this Agreement, Intel hereby grants you and to recipients of the Software distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by Intel that are necessarily infringed by Intel's Software alone or by combination of the Software with the Work to which such Software was submitted. If any entity institutes patent litigation against Intel or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that Intel's Software, or the Work to which Intel has contributed constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for the Software or Work shall terminate as of the date such litigation is filed. Unless required by applicable law or agreed to in writing, the software is provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. ============================================================================== ARM Limited Software Grant License Agreement ("Agreement") Except for the license granted herein to you, ARM Limited ("ARM") reserves all right, title, and interest in and to the Software (defined below). Definition "Software" means the code and documentation as well as any original work of authorship, including any modifications or additions to an existing work, that is intentionally submitted by ARM to llvm.org (http://llvm.org) ("LLVM") for inclusion in, or documentation of, any of the products owned or managed by LLVM (the "Work"). For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to LLVM or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, LLVM for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked otherwise. 1. Grant of Copyright License. Subject to the terms and conditions of this Agreement, ARM hereby grants to you and to recipients of the Software distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute the Software and such derivative works. 2. Grant of Patent License. Subject to the terms and conditions of this Agreement, ARM hereby grants you and to recipients of the Software distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by ARM that are necessarily infringed by ARM's Software alone or by combination of the Software with the Work to which such Software was submitted. If any entity institutes patent litigation against ARM or any other entity (including a cross-claim or counterclaim in a lawsuit) alleging that ARM's Software, or the Work to which ARM has contributed constitutes direct or contributory patent infringement, then any patent licenses granted to that entity under this Agreement for the Software or Work shall terminate as of the date such litigation is filed. Unless required by applicable law or agreed to in writing, the software is provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. ============================================================================== qiskit-aer-0.4.1/src/third-party/macos/lib/libmuparserx.a000066400000000000000000121206001362723322000233540ustar00rootroot00000000000000! #1/20 1573634249 501 20 100644 192252 ` __.SYMDEFmv @@@@@n@G@@@. @L @C@*@@ @z @ @d@@r@' @@@ @M@@@@@@$@B@o@@@@/@@@u@g@ @@? @@@(@@F@ @@@@@W @ @@@L@@@F@@@?@@ @(@ @ @@)@ @x@@D@@@?z000&0 1$1 (<(a^(~('''('{'\'D;'cI=1'2W1&(x.+q1*11*111 2'&()$)D)4Oj7Rm#:Up=Xs ! @ [ v     !$!C!f)^!y!5O!i)!)! "'")F"a",)|""""B2j, #*#I#B0:Xr5Sd# *,*mL*%,#%!.$$%3%S%o%%%##X/r/$///-$//0hN....,,,-}+ /&/(-?/A-Z-L$g$$$(00n*n%*&&&T:{&\&;&s------.).C.x^s].*=,,+++q+I+!+]0u0D0Y!3"46585546Z2w74!82346864E8 6^75|9337599u6787 :9b4Z67 62:4894v49U5=729U3V97;3377N4=95329A585o3-5i858i9$96ZAe >e>et:e?e=eBe?e>eBe;e;e;e <e-<eI<ee<e<e<e<e<e=e8=eT=ep=e=e=eBeCeCeAeCeBe>e?eY:e @e@e>e+@eI?e?eUCeN@ed>eCe Ce?e:epCe:Cep@eG>e@ei?eCe@e:e:e;e&;eA;e\;ew;eKBeBeBeAe%:eCeAe)?e?:e&>eaPKP'KP;KPOKPLPLPLPLPLPLPnLP6LP!LP LPKPKPKPKPKPcKPbPbPbPbPbPbPbPKbPZPYPYPYPYPYPkYPRYPZP6bP YP8YPZPZPZPZP[P*[PD[P`[Pz[P[P[P[P[PoZP\PVZP\P8\PR\P;ZPn\P\P\P\PXPr^P"ZP\P^P^P^P^P^P\P]P^P^P-]PJ]Pe]P]P]P]P]P]P ^P!bP_P bPaPaP*^PN^PJPaPaPaP~aP`bPjaPVaPDPNDPmDPDPDPDPDPDPBaP.aPaPaP`P`P`P`P`P`P`P#_P7_PK_P__PXPXPXPkXPQXP;XP!XPWPWPWPWPs_PWPvWP`WPFWP_P WPVPVPVPVPVPVPkVP2VPVPVPUPUPUPUPUPWUPAUP+UPUPTPTPTPTP|TPfTPPTP:TP$TP TPSPSPSPi`PzbPPPPPPPEPIEP`EPsEPEPEPEPEPPPPPUPP@PP+PPPPPPOPOPOPOPmOPXOPCOP.OPOPOPNPNPNPNPpNPBdP-dPdPdPcPcP[NPBNP-NPNPMPMPMPMPcPcPcPcPucPacPMcP9cP%cPcPMPoMPZMPAMP MPEP FP%FP9FPQFPeFPyFPFPFPFPFPGPGP0GPDGPXGPlGPGPGPGPGPGPHP#HP7HPnHPHPHPHPHPHPHPIP9IPQIPeIP}IPIPIPIPIPJPJP0JPHJP\JPpJPJPJPJPJP_P_P_P_PXPXP_P`P`PSPwSPbSPMSP4SPSPSP*`P?`PRPT`PRPRPRPzRPaRPLRP3RPQPQPQPQPQPQPyQP`QP(QPQPPPi fg Jg g  h .g g j f f %i f wf [f ?f #f f e e e le j Hj cj  h i j j h 7h h Nh h eh /j Wd i i Re j dd li Hi j i i 8e g e g e g d d d qd ~j h t`Zmw`Zk`Zp`Zq`Z3k`Zl`Z#l`Zwl`Z l`Zt`ZQl`Zu`Zt`Z_p`Zm`Z:l`Zo`ZDr`Zwo`Zn`ZIu`Zs`Z5n`Z:v`Zv`Zw`Zp`Z[k`Zm`Zx`Zk`Z(o`Zxk`Z$v`Zm`ZUm`Zp`Z&t`Z3u`Z+m`Zr`Zm`Zr`Z[s`Zl`Zcq`Zk`Zw`Zm`Zk`Zv`Zu`Zq`Zn`ZXzXzX3XxXxXxXyXXXXXXXOXXXlXGXXX߆XXX yX=yXXyXsyX>X|XXaXXXXPXXEX~X~Xm~X-X~X+xXQxXX}X~}XnXBX}XXYXxXxXmxXӃXX|Xf|X@|X|XyXyXyXyXzX{X{X{X{XV{X {X?XzXzXzX&XXĄXzXDzXczXXшyɔ<m%\yړ3D7Kjӌ[;ߋċtيX@xВX$@Ս+ˏE 6M9a`XB    ښ Q 8 ^ x D  ^ # r ¢  0 Z @ q @ ' P  % ܝ ! Ý П ] ^ ʞ V ? ƛ 7 & o  p | Y K  Ҝ p P 5      O  Ȯ          | ի  A  \ >     k  <  q  A & P  7   m M z j ̳ ܭ  R α   ղ    r R ' ̵ G ܬ    0 O  ʽ r | R  ۼ i s g G  Y P / . o M   V 8 = Z ˺ N   l 3 4 Ŀ j h  ) L % @ [  v % վ } ] һ   ?8 Z8 u8 8 G8 8 8 8 8 o8 v8 8 b8 8 8 8 /8 J8 8 68 8 N8 38 8 8 8 8 8 8 8 Q8 8 8 8 d8 8 u8 Y8 ?8 #8 8 8 8 8 8 8 8 8 8 8 8 ^8 8 8 8 8 8 i8 N8 58 8 8 8 8 k8 8 )8 8 8 ~8 e8 =8 8 =8 8 A8 h8 J8 ,8 8 8 8 8 k8 8 8 S8 H8 8 8 8 8 8 8 8 8 8 8 8 8 S8 j8 8 8 8 8 8 8 8 -8 8 8 *8 C8 X8 q8 8 8 8 8 8 8 8 8 8 8 8 8 +8 D8 Y8 n8 8 8 8 8 8 8 ,8 A8 V8 `8 O8 38 8 8 8 8 8 8 88 {8 8 `8 8 8 8 8 8 e8 8 8 e8 T8 `8 k8 8 :8 V8 8 n8 8 8 8 18 Q8 Z8 8 8 8 8 8 "8 88 N8 $8 8 8 F8 8 L8 8 8 8 r8 Y8 @8 v8 #8 8 28 8 8 8 8 8 i8 8 |8 8 8 8 8 8 +8 48 8 8 8 8 8 8 88 \8 8 8 8 8 8 }8 i8 U8 A8 -8 8 8 8 8 8 8 8 E8 8 8 8 8 8 8 8 8 8 ~8 8 8 8 k8 8 8 8 8 8 8 +8 68 8 *8 P8 8 j8 8 8 8 I8 ?8 8 $8 8 8 8 8 8 $8 _ $ M      +     /  I J c ~ (      0 K f      3 N i      6 Q l      9 T o      < W r      a @     k     # C {       " F f   n  T :        2 p & a      ' G i        2 O l     H      (   v \ B I q  )  K     f  =   % m  ) t   k K 1         s    ~   "p pppd ppK p p p p5 pWpprp<p p pl pU p> p pz p# p px@xxx xr xxxxoxxxV xTx: xx]x xxnx;x. x xxex x xxxI xxd x x xsx xxxsx xxxxHx xRxxsx x x xxx<xx@xx:xxxx x3xxx xaxm xO x1 x x;xx$x x%xx x x xxxx xxx-$-g.u,kLy..D+,,*+ 3 O i     1/  !*i//W**R)(}( 3'!B!;(+e._!''2!!22z2s3_2D2)2Q.2=.)..1D'1111&,W"V,,",%-"%|]%b %[0$-I"$0Z$H<"./9--/////#'iT"?*A#lWBK)g#-oVoA(n#U!g1G100,&",=&4858'587868485857848u4878T48684868f786878c685878385838Q7838686838z58?6878 5858683848`58d;g_8g8g8g8g=8g8g7gd9gz8g<9g9g9g8gJ;gO:g:g9g:g ;g9g:g~;gx:g0;g&:g:g;` ?`>`?`>`<`;`R?`=`v=`G>`/?`?`l>`<`<`w?`>`=`!=`>`?`=`O<`k<`?`<`3<`<`I=`;`@x9BxBxAxAxAxmAx@AxAxBxCxBxCx@x@x@x@x@xd@x>@xBxBx_BxD@D@nE@6C@E@F@F@E@C@D@ F@VF@C@E@1F@}F@!E@IE@SD@5D@F@C@pC@~D@F@D@C@jGGGGHGIIIGH?I_IWHIGIHH/HGGI|HK`P`P`J`J`J`_T`N`P`P`Q`N`'Q`dS`FT`aQ`O`O`aJ`Q`J`T`5O`KO`Q`U`~U`Q`Q`Q` R`L`iU`&L`@L`J`$R`ER`@N`T`S`xT`8K`L`K`L`U`M`5M`CV`KM`J`aM`wM`M`S`M`M`=J`U`N`*N`S`U` T`VN`?U`lN`*U`T`GS`,S`S`R`K`R`R`R`V`R`K`N`U`hR`P`*P`dP`P`O`L`TU`L`T`nK`SK`T`S`V`-V`aO`VL`U`T`K`T`O`lL`O`VPK[VPKVPKVPK%WPKWPKVPKVPK9WPK|0[0[u0[c0[90[ 0[0[}0[Z0[P0[Z0[\0[^Z0[0[0[6Z0[0[0[Y0[0[Y0[Y0[B0[J0[KY0[S0[>0[40[0[0[c0[`0[r0[>0[0[0[X0[0[X0[QX0[0[l0[-X0[W0[,0[0[W0[W0[r0[}W0[r0[er0[0[0[0[0[cW0[0[ο0[0[0[0[ 0[i0[0[׹0[#0[0[k0[&r0[q0[oq0[0[2i0[Ui0[xi0[[0[0[i0[i0[&0[#j0[p0[p0[p0[p0[Pp0[o0[o0[o0[zo0[Zo0[:o0[n0[n0[n0[>n0[n0[m0[Hj0['m0[mj0[j0[Ik0[k0[90[)0[~0[~0[0[0[[~0[}0[0[ߟ0[k0[0[}0[70[0[|}0[i0[V}0[.}0[0[0[0[+0[;0[_0[t0[f0[0[}0[|0[0[0[f0[sf0[9f0[e0[b0[e0[e0[0[Je0[e0[d0[`d0[ d0[c0[Wc0[c0[b0[Jb0[a0[a0[F0[:a0[_0[0[0[|0[|0[0[0[n|0[l0[.0[l0[l0[k0[Al0[P0[0[C|0[|0[{0[v0[{0[K{0[z0[q0[y0[x0[w0[0[v0[D0[xu0[t0[)0[0[St0[f0[s0[20[ g0[Gg0[MW0[a0[mg0[r0[g0[g0[g0[a0[h0[+h0[Qh0[xh0[h0[h0[0[h0[ i0[qs0[Ks0['s0[O0[0[0[`0[`0[`0[`0[~`0[``0[0[F`0[S0[;0[0[(`0[_0[b_0[^0[^0[^0[l^0[K^0[s0[*^0[0[]0[0[]0[A0[0[0[#]0[*0[0[0[P0[\0[\0[Z\0[0[X0[ \0[ʊ0[80[[0[y[0[P[0['[0[Z0[0[0[0[.0[0[B0[0[0[0[00[*0[0[0[*@ S@ ~@ @ @ @ @ Z@ @ @ @ @ 1@ u@ @ =@ @ @ @ @ U@ @ @ @ @ @ 9@ @ @ @ B@ i@ @ @ @ ~PPDPRPyPMPPPPPvPPWPP\PSPuPPPPP P.PPpPPgPPP:PPPP1PPpPP/PTPP&P PPPFPPgPPPsPPJPPPPPPrP1PP"PfPPPPPPPPP'P8PIPPZPkPPWPPPPPPPGP)PP&PPAPPPP0PKP"P[PP]VVcVVVVVVVVVVV.VOVIVdVVVVVVVVVVV1VVVRV>VVV`VVVHVV"VVVQV V8V|V VmV'VVkVVf{)%?Uk &Kt PwB#/Dj#n9"EbWmM:]Mq-Uix<In~ 9Kl(l8$J8QA*< < [= ; ; 3; : w: 9 9 I9 9 '8 7 A7 6 J6 5 t= 35 s4 3 2 +2 d1 0 / . - , + * ) H( & % $ w# k" ! ! !       b    A   j "   3 =  i  =   9   ?   E >   Q  #  7>    { S *     A h -   E z   u P> > R 1  >  v Q .     q  J  '       j  +? r? ? @ O  4        {  P       H     T  1    ^@  H    } =    @  < G$C$F$G$C$L$C$O$6A$P$G$AG$O$XM$L$C$kR$G$P$H$P$R$lO$D$A$RO$/D$R$5H$N$JD$8O$PA$A$^H$M$H$O$O$?N$M$A$H$ N$A$A$A$%N$B$BL$K$*B$P$EB$K$N$eK$uB$B$H$:I$eD$D$D$B$D$P$,Q$D$ZN$E$I$B$B$Q$/E$I$=J$}F$aF$EF$)F$ F$C$C$E$vQ$E$E$E$JE$eE$M$J$K$:C$sG$J$bP$|P$F$UC$pC$\x%_x%jx%kx%H_x%r_x%lx%gx%Jmx%_x%ix%Sx%_x%_x%`x%-`x%mx%jx%\x%[x%kx%[x%[x%[x%_[x%?[x%[x%Zx%Zx%Zx%Zx%aZx%8Zx%Zx%Yx%Yx%Yx%Yx%Yx%}Yx%WYx%Yx%Xx%Xx%Xx%Xx%Xx%iXx%TXx%Xx%Wx%Wx%Wx%Wx%Wx%Wx%zWx%gWx%TWx%=Wx%R`x%Wx%Vx%Vx%Vx%lVx%WVx%CVx%0Vx%Vx% Vx%Ux%Ux%Ux%Ux%vUx%aUx%Ux%Tx%Tx%Tx%Tx%Tx%rTx%DTx%zjx%`x%0jx%kx%ix% ax%ax%ax% lx%#bx%Ulx%sbx%bx%ix%cx%lx%Kcx%cx% dx%Udx%ix%dx%ex%Cex%ex%fx%thx%)Tx%fx%Sx%Tx%Sx%Sx%Sx%1Sx%Rx%gx%?ix% hx%gx%"^x%^x%]x%]x%E^x%]x%l^x%]x%y]x%]]x%B]x%']x% ]x%\x%^x%\x%\x%jx%\x%o\x%Q\x%3\x%kx%Ygx%Khx%hx%Okx%^x%Bppa'mpa'Xopa'opa' npa'1npa'npa'opa'npa' ppa'mpa'|npa'opa'Jnpa'cnpa'Urx'orx'rx'rx'rx'sx'2}x'Atx'btx'tx''sx'tx'1vx'tx'{x'}x'|x'~x'tx'Usx'Z|x'tx'sx'ux'2ux'Oux'sx'sx'yx'lux'Hyx'yx'xx'lx'xx'x'~x'ux' zx'ax'Yxx'"x'wx'x',~x'~x's~x'ux'zx'zx'fwx'sx'*{x'ux'Zpx'2x'u{x'sx'x'~x'tx'|x'wx'vx'vx'tpx'vx'|x'x'vx'\vx'px'x'ux'Awx'px'px'}x'sx'px'qx'&qx'Eqx'aqx'}qx'qx'qx'rx'4rx'Ё__ZN3mup11ParserError10GetContextEv__ZN3mup11ParserError5ResetEv__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKS0___ZN3mup11ParserErrorC1Ev__ZN3mup11ParserErrorC2ERKNS_12ErrorContextE__ZN3mup11ParserErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC2ERKS0___ZN3mup11ParserErrorC2Ev__ZN3mup11ParserErroraSERKS0___ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup12ErrorContextC1ERKS0___ZN3mup12ErrorContextC2ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12ErrorContextC2ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup12ErrorContextC2ERKS0___ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12ErrorContextaSEOS0___ZN3mup12ErrorContextaSERKS0___ZN3mup14ParserErrorMsg11m_pInstanceE__ZN3mup14ParserErrorMsg5ResetEPNS_25ParserMessageProviderBaseE__ZN3mup14ParserErrorMsg8InstanceEv__ZN3mup14ParserErrorMsgC1Ev__ZN3mup14ParserErrorMsgC2Ev__ZN3mup14ParserErrorMsgD1Ev__ZN3mup14ParserErrorMsgD2Ev__ZNK3mup11ParserError16ReplaceSubStringERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_SA___ZNK3mup11ParserError16ReplaceSubStringERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_c__ZNK3mup11ParserError16ReplaceSubStringERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_i__ZNK3mup11ParserError6GetMsgEv__ZNK3mup11ParserError6GetPosEv__ZNK3mup11ParserError7GetCodeEv__ZNK3mup11ParserError7GetExprEv__ZNK3mup11ParserError8GetTokenEv__ZNK3mup14ParserErrorMsg11GetErrorMsgENS_11EErrorCodesE__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118__search_substringIcNS_11char_traitsIcEEEEPKT_S5_S5_S5_S5___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup10FunCmplxLn4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup10FunCmplxLnC1ERKS0___ZN3mup10FunCmplxLnC1Ev__ZN3mup10FunCmplxLnC2ERKS0___ZN3mup10FunCmplxLnC2Ev__ZN3mup10FunCmplxLnD0Ev__ZN3mup10FunCmplxLnD1Ev__ZN3mup10FunCmplxLnD2Ev__ZN3mup11FunCmplxAbs4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxAbsC1ERKS0___ZN3mup11FunCmplxAbsC1Ev__ZN3mup11FunCmplxAbsC2ERKS0___ZN3mup11FunCmplxAbsC2Ev__ZN3mup11FunCmplxAbsD0Ev__ZN3mup11FunCmplxAbsD1Ev__ZN3mup11FunCmplxAbsD2Ev__ZN3mup11FunCmplxArg4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxArgC1ERKS0___ZN3mup11FunCmplxArgC1Ev__ZN3mup11FunCmplxArgC2ERKS0___ZN3mup11FunCmplxArgC2Ev__ZN3mup11FunCmplxArgD0Ev__ZN3mup11FunCmplxArgD1Ev__ZN3mup11FunCmplxArgD2Ev__ZN3mup11FunCmplxCos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxCosC1ERKS0___ZN3mup11FunCmplxCosC1Ev__ZN3mup11FunCmplxCosC2ERKS0___ZN3mup11FunCmplxCosC2Ev__ZN3mup11FunCmplxCosD0Ev__ZN3mup11FunCmplxCosD1Ev__ZN3mup11FunCmplxCosD2Ev__ZN3mup11FunCmplxExp4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxExpC1ERKS0___ZN3mup11FunCmplxExpC1Ev__ZN3mup11FunCmplxExpC2ERKS0___ZN3mup11FunCmplxExpC2Ev__ZN3mup11FunCmplxExpD0Ev__ZN3mup11FunCmplxExpD1Ev__ZN3mup11FunCmplxExpD2Ev__ZN3mup11FunCmplxLog4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxLogC1ERKS0___ZN3mup11FunCmplxLogC1Ev__ZN3mup11FunCmplxLogC2ERKS0___ZN3mup11FunCmplxLogC2Ev__ZN3mup11FunCmplxLogD0Ev__ZN3mup11FunCmplxLogD1Ev__ZN3mup11FunCmplxLogD2Ev__ZN3mup11FunCmplxPow4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxPowC1ERKS0___ZN3mup11FunCmplxPowC1Ev__ZN3mup11FunCmplxPowC2ERKS0___ZN3mup11FunCmplxPowC2Ev__ZN3mup11FunCmplxPowD0Ev__ZN3mup11FunCmplxPowD1Ev__ZN3mup11FunCmplxPowD2Ev__ZN3mup11FunCmplxSin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxSinC1ERKS0___ZN3mup11FunCmplxSinC1Ev__ZN3mup11FunCmplxSinC2ERKS0___ZN3mup11FunCmplxSinC2Ev__ZN3mup11FunCmplxSinD0Ev__ZN3mup11FunCmplxSinD1Ev__ZN3mup11FunCmplxSinD2Ev__ZN3mup11FunCmplxTan4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxTanC1ERKS0___ZN3mup11FunCmplxTanC1Ev__ZN3mup11FunCmplxTanC2ERKS0___ZN3mup11FunCmplxTanC2Ev__ZN3mup11FunCmplxTanD0Ev__ZN3mup11FunCmplxTanD1Ev__ZN3mup11FunCmplxTanD2Ev__ZN3mup12FunCmplxConj4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxConjC1ERKS0___ZN3mup12FunCmplxConjC1Ev__ZN3mup12FunCmplxConjC2ERKS0___ZN3mup12FunCmplxConjC2Ev__ZN3mup12FunCmplxConjD0Ev__ZN3mup12FunCmplxConjD1Ev__ZN3mup12FunCmplxConjD2Ev__ZN3mup12FunCmplxCosH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxCosHC1ERKS0___ZN3mup12FunCmplxCosHC1Ev__ZN3mup12FunCmplxCosHC2ERKS0___ZN3mup12FunCmplxCosHC2Ev__ZN3mup12FunCmplxCosHD0Ev__ZN3mup12FunCmplxCosHD1Ev__ZN3mup12FunCmplxCosHD2Ev__ZN3mup12FunCmplxImag4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxImagC1ERKS0___ZN3mup12FunCmplxImagC1Ev__ZN3mup12FunCmplxImagC2ERKS0___ZN3mup12FunCmplxImagC2Ev__ZN3mup12FunCmplxImagD0Ev__ZN3mup12FunCmplxImagD1Ev__ZN3mup12FunCmplxImagD2Ev__ZN3mup12FunCmplxLog24EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxLog2C1ERKS0___ZN3mup12FunCmplxLog2C1Ev__ZN3mup12FunCmplxLog2C2ERKS0___ZN3mup12FunCmplxLog2C2Ev__ZN3mup12FunCmplxLog2D0Ev__ZN3mup12FunCmplxLog2D1Ev__ZN3mup12FunCmplxLog2D2Ev__ZN3mup12FunCmplxNorm4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxNormC1ERKS0___ZN3mup12FunCmplxNormC1Ev__ZN3mup12FunCmplxNormC2ERKS0___ZN3mup12FunCmplxNormC2Ev__ZN3mup12FunCmplxNormD0Ev__ZN3mup12FunCmplxNormD1Ev__ZN3mup12FunCmplxNormD2Ev__ZN3mup12FunCmplxReal4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxRealC1ERKS0___ZN3mup12FunCmplxRealC1Ev__ZN3mup12FunCmplxRealC2ERKS0___ZN3mup12FunCmplxRealC2Ev__ZN3mup12FunCmplxRealD0Ev__ZN3mup12FunCmplxRealD1Ev__ZN3mup12FunCmplxRealD2Ev__ZN3mup12FunCmplxSinH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxSinHC1ERKS0___ZN3mup12FunCmplxSinHC1Ev__ZN3mup12FunCmplxSinHC2ERKS0___ZN3mup12FunCmplxSinHC2Ev__ZN3mup12FunCmplxSinHD0Ev__ZN3mup12FunCmplxSinHD1Ev__ZN3mup12FunCmplxSinHD2Ev__ZN3mup12FunCmplxSqrt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxSqrtC1ERKS0___ZN3mup12FunCmplxSqrtC1Ev__ZN3mup12FunCmplxSqrtC2ERKS0___ZN3mup12FunCmplxSqrtC2Ev__ZN3mup12FunCmplxSqrtD0Ev__ZN3mup12FunCmplxSqrtD1Ev__ZN3mup12FunCmplxSqrtD2Ev__ZN3mup12FunCmplxTanH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxTanHC1ERKS0___ZN3mup12FunCmplxTanHC1Ev__ZN3mup12FunCmplxTanHC2ERKS0___ZN3mup12FunCmplxTanHC2Ev__ZN3mup12FunCmplxTanHD0Ev__ZN3mup12FunCmplxTanHD1Ev__ZN3mup12FunCmplxTanHD2Ev__ZN3mup13FunCmplxLog104EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunCmplxLog10C1ERKS0___ZN3mup13FunCmplxLog10C1Ev__ZN3mup13FunCmplxLog10C2ERKS0___ZN3mup13FunCmplxLog10C2Ev__ZN3mup13FunCmplxLog10D0Ev__ZN3mup13FunCmplxLog10D1Ev__ZN3mup13FunCmplxLog10D2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup10FunCmplxLn5CloneEv__ZNK3mup10FunCmplxLn7GetDescEv__ZNK3mup11FunCmplxAbs5CloneEv__ZNK3mup11FunCmplxAbs7GetDescEv__ZNK3mup11FunCmplxArg5CloneEv__ZNK3mup11FunCmplxArg7GetDescEv__ZNK3mup11FunCmplxCos5CloneEv__ZNK3mup11FunCmplxCos7GetDescEv__ZNK3mup11FunCmplxExp5CloneEv__ZNK3mup11FunCmplxExp7GetDescEv__ZNK3mup11FunCmplxLog5CloneEv__ZNK3mup11FunCmplxLog7GetDescEv__ZNK3mup11FunCmplxPow5CloneEv__ZNK3mup11FunCmplxPow7GetDescEv__ZNK3mup11FunCmplxSin5CloneEv__ZNK3mup11FunCmplxSin7GetDescEv__ZNK3mup11FunCmplxTan5CloneEv__ZNK3mup11FunCmplxTan7GetDescEv__ZNK3mup12FunCmplxConj5CloneEv__ZNK3mup12FunCmplxConj7GetDescEv__ZNK3mup12FunCmplxCosH5CloneEv__ZNK3mup12FunCmplxCosH7GetDescEv__ZNK3mup12FunCmplxImag5CloneEv__ZNK3mup12FunCmplxImag7GetDescEv__ZNK3mup12FunCmplxLog25CloneEv__ZNK3mup12FunCmplxLog27GetDescEv__ZNK3mup12FunCmplxNorm5CloneEv__ZNK3mup12FunCmplxNorm7GetDescEv__ZNK3mup12FunCmplxReal5CloneEv__ZNK3mup12FunCmplxReal7GetDescEv__ZNK3mup12FunCmplxSinH5CloneEv__ZNK3mup12FunCmplxSinH7GetDescEv__ZNK3mup12FunCmplxSqrt5CloneEv__ZNK3mup12FunCmplxSqrt7GetDescEv__ZNK3mup12FunCmplxTanH5CloneEv__ZNK3mup12FunCmplxTanH7GetDescEv__ZNK3mup13FunCmplxLog105CloneEv__ZNK3mup13FunCmplxLog107GetDescEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNSt3__13expIdEENS_7complexIT_EERKS3___ZNSt3__13sinIdEENS_7complexIT_EERKS3___ZNSt3__13tanIdEENS_7complexIT_EERKS3___ZNSt3__14coshIdEENS_7complexIT_EERKS3___ZNSt3__14sinhIdEENS_7complexIT_EERKS3___ZNSt3__14sqrtIdEENS_7complexIT_EERKS3___ZNSt3__14tanhIdEENS_7complexIT_EERKS3___ZNSt3__15polarIdEENS_7complexIT_EERKS2_S5___ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZTIN3mup10FunCmplxLnE__ZTIN3mup11FunCmplxAbsE__ZTIN3mup11FunCmplxArgE__ZTIN3mup11FunCmplxCosE__ZTIN3mup11FunCmplxExpE__ZTIN3mup11FunCmplxLogE__ZTIN3mup11FunCmplxPowE__ZTIN3mup11FunCmplxSinE__ZTIN3mup11FunCmplxTanE__ZTIN3mup12FunCmplxConjE__ZTIN3mup12FunCmplxCosHE__ZTIN3mup12FunCmplxImagE__ZTIN3mup12FunCmplxLog2E__ZTIN3mup12FunCmplxNormE__ZTIN3mup12FunCmplxRealE__ZTIN3mup12FunCmplxSinHE__ZTIN3mup12FunCmplxSqrtE__ZTIN3mup12FunCmplxTanHE__ZTIN3mup13FunCmplxLog10E__ZTSN3mup10FunCmplxLnE__ZTSN3mup11FunCmplxAbsE__ZTSN3mup11FunCmplxArgE__ZTSN3mup11FunCmplxCosE__ZTSN3mup11FunCmplxExpE__ZTSN3mup11FunCmplxLogE__ZTSN3mup11FunCmplxPowE__ZTSN3mup11FunCmplxSinE__ZTSN3mup11FunCmplxTanE__ZTSN3mup12FunCmplxConjE__ZTSN3mup12FunCmplxCosHE__ZTSN3mup12FunCmplxImagE__ZTSN3mup12FunCmplxLog2E__ZTSN3mup12FunCmplxNormE__ZTSN3mup12FunCmplxRealE__ZTSN3mup12FunCmplxSinHE__ZTSN3mup12FunCmplxSqrtE__ZTSN3mup12FunCmplxTanHE__ZTSN3mup13FunCmplxLog10E__ZTVN3mup10FunCmplxLnE__ZTVN3mup11FunCmplxAbsE__ZTVN3mup11FunCmplxArgE__ZTVN3mup11FunCmplxCosE__ZTVN3mup11FunCmplxExpE__ZTVN3mup11FunCmplxLogE__ZTVN3mup11FunCmplxPowE__ZTVN3mup11FunCmplxSinE__ZTVN3mup11FunCmplxTanE__ZTVN3mup12FunCmplxConjE__ZTVN3mup12FunCmplxCosHE__ZTVN3mup12FunCmplxImagE__ZTVN3mup12FunCmplxLog2E__ZTVN3mup12FunCmplxNormE__ZTVN3mup12FunCmplxRealE__ZTVN3mup12FunCmplxSinHE__ZTVN3mup12FunCmplxSqrtE__ZTVN3mup12FunCmplxTanHE__ZTVN3mup13FunCmplxLog10E___clang_call_terminate__ZN3mup11FunParserID4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunParserIDC1ERKS0___ZN3mup11FunParserIDC1Ev__ZN3mup11FunParserIDC2ERKS0___ZN3mup11FunParserIDC2Ev__ZN3mup11FunParserIDD0Ev__ZN3mup11FunParserIDD1Ev__ZN3mup11FunParserIDD2Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup6FunMax4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunMaxC1ERKS0___ZN3mup6FunMaxC1Ev__ZN3mup6FunMaxC2ERKS0___ZN3mup6FunMaxC2Ev__ZN3mup6FunMaxD0Ev__ZN3mup6FunMaxD1Ev__ZN3mup6FunMaxD2Ev__ZN3mup6FunMin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunMinC1ERKS0___ZN3mup6FunMinC1Ev__ZN3mup6FunMinC2ERKS0___ZN3mup6FunMinC2Ev__ZN3mup6FunMinD0Ev__ZN3mup6FunMinD1Ev__ZN3mup6FunMinD2Ev__ZN3mup6FunSum4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunSumC1ERKS0___ZN3mup6FunSumC1Ev__ZN3mup6FunSumC2ERKS0___ZN3mup6FunSumC2Ev__ZN3mup6FunSumD0Ev__ZN3mup6FunSumD1Ev__ZN3mup6FunSumD2Ev__ZN3mup9FunSizeOf4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9FunSizeOfC1ERKS0___ZN3mup9FunSizeOfC1Ev__ZN3mup9FunSizeOfC2ERKS0___ZN3mup9FunSizeOfC2Ev__ZN3mup9FunSizeOfD0Ev__ZN3mup9FunSizeOfD1Ev__ZN3mup9FunSizeOfD2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup11FunParserID5CloneEv__ZNK3mup11FunParserID7GetDescEv__ZNK3mup6FunMax5CloneEv__ZNK3mup6FunMax7GetDescEv__ZNK3mup6FunMin5CloneEv__ZNK3mup6FunMin7GetDescEv__ZNK3mup6FunSum5CloneEv__ZNK3mup6FunSum7GetDescEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup9FunSizeOf5CloneEv__ZNK3mup9FunSizeOf7GetDescEv__ZTIN3mup11FunParserIDE__ZTIN3mup11ParserErrorE__ZTIN3mup6FunMaxE__ZTIN3mup6FunMinE__ZTIN3mup6FunSumE__ZTIN3mup9FunSizeOfE__ZTSN3mup11FunParserIDE__ZTSN3mup11ParserErrorE__ZTSN3mup6FunMaxE__ZTSN3mup6FunMinE__ZTSN3mup6FunSumE__ZTSN3mup9FunSizeOfE__ZTVN3mup11FunParserIDE__ZTVN3mup6FunMaxE__ZTVN3mup6FunMinE__ZTVN3mup6FunSumE__ZTVN3mup9FunSizeOfE___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12FunMatrixEye4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunMatrixEyeC1ERKS0___ZN3mup12FunMatrixEyeC1Ev__ZN3mup12FunMatrixEyeC2ERKS0___ZN3mup12FunMatrixEyeC2Ev__ZN3mup12FunMatrixEyeD0Ev__ZN3mup12FunMatrixEyeD1Ev__ZN3mup12FunMatrixEyeD2Ev__ZN3mup13FunMatrixOnes4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunMatrixOnesC1ERKS0___ZN3mup13FunMatrixOnesC1Ev__ZN3mup13FunMatrixOnesC2ERKS0___ZN3mup13FunMatrixOnesC2Ev__ZN3mup13FunMatrixOnesD0Ev__ZN3mup13FunMatrixOnesD1Ev__ZN3mup13FunMatrixOnesD2Ev__ZN3mup13FunMatrixSize4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunMatrixSizeC1ERKS0___ZN3mup13FunMatrixSizeC1Ev__ZN3mup13FunMatrixSizeC2ERKS0___ZN3mup13FunMatrixSizeC2Ev__ZN3mup13FunMatrixSizeD0Ev__ZN3mup13FunMatrixSizeD1Ev__ZN3mup13FunMatrixSizeD2Ev__ZN3mup14FunMatrixZeros4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup14FunMatrixZerosC1ERKS0___ZN3mup14FunMatrixZerosC1Ev__ZN3mup14FunMatrixZerosC2ERKS0___ZN3mup14FunMatrixZerosC2Ev__ZN3mup14FunMatrixZerosD0Ev__ZN3mup14FunMatrixZerosD1Ev__ZN3mup14FunMatrixZerosD2Ev__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup6MatrixINS_5ValueEEC1EiiRKS1___ZN3mup6MatrixINS_5ValueEEC2EiiRKS1___ZN3mup6MatrixINS_5ValueEED1Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup12FunMatrixEye5CloneEv__ZNK3mup12FunMatrixEye7GetDescEv__ZNK3mup13FunMatrixOnes5CloneEv__ZNK3mup13FunMatrixOnes7GetDescEv__ZNK3mup13FunMatrixSize5CloneEv__ZNK3mup13FunMatrixSize7GetDescEv__ZNK3mup14FunMatrixZeros5CloneEv__ZNK3mup14FunMatrixZeros7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZTIN3mup11ParserErrorE__ZTIN3mup12FunMatrixEyeE__ZTIN3mup13FunMatrixOnesE__ZTIN3mup13FunMatrixSizeE__ZTIN3mup14FunMatrixZerosE__ZTSN3mup11ParserErrorE__ZTSN3mup12FunMatrixEyeE__ZTSN3mup13FunMatrixOnesE__ZTSN3mup13FunMatrixSizeE__ZTSN3mup14FunMatrixZerosE__ZTVN3mup12FunMatrixEyeE__ZTVN3mup13FunMatrixOnesE__ZTVN3mup13FunMatrixSizeE__ZTVN3mup14FunMatrixZerosE___clang_call_terminate__ZN3mup12FunRemainder4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunRemainderC1ERKS0___ZN3mup12FunRemainderC1Ev__ZN3mup12FunRemainderC2ERKS0___ZN3mup12FunRemainderC2Ev__ZN3mup12FunRemainderD0Ev__ZN3mup12FunRemainderD1Ev__ZN3mup12FunRemainderD2Ev__ZN3mup5FunLn4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup5FunLnC1ERKS0___ZN3mup5FunLnC1Ev__ZN3mup5FunLnC2ERKS0___ZN3mup5FunLnC2Ev__ZN3mup5FunLnD0Ev__ZN3mup5FunLnD1Ev__ZN3mup5FunLnD2Ev__ZN3mup6FunAbs4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunAbsC1ERKS0___ZN3mup6FunAbsC1Ev__ZN3mup6FunAbsC2ERKS0___ZN3mup6FunAbsC2Ev__ZN3mup6FunAbsD0Ev__ZN3mup6FunAbsD1Ev__ZN3mup6FunAbsD2Ev__ZN3mup6FunCos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunCosC1ERKS0___ZN3mup6FunCosC1Ev__ZN3mup6FunCosC2ERKS0___ZN3mup6FunCosC2Ev__ZN3mup6FunCosD0Ev__ZN3mup6FunCosD1Ev__ZN3mup6FunCosD2Ev__ZN3mup6FunExp4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunExpC1ERKS0___ZN3mup6FunExpC1Ev__ZN3mup6FunExpC2ERKS0___ZN3mup6FunExpC2Ev__ZN3mup6FunExpD0Ev__ZN3mup6FunExpD1Ev__ZN3mup6FunExpD2Ev__ZN3mup6FunLog4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunLogC1ERKS0___ZN3mup6FunLogC1Ev__ZN3mup6FunLogC2ERKS0___ZN3mup6FunLogC2Ev__ZN3mup6FunLogD0Ev__ZN3mup6FunLogD1Ev__ZN3mup6FunLogD2Ev__ZN3mup6FunPow4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunPowC1ERKS0___ZN3mup6FunPowC1Ev__ZN3mup6FunPowC2ERKS0___ZN3mup6FunPowC2Ev__ZN3mup6FunPowD0Ev__ZN3mup6FunPowD1Ev__ZN3mup6FunPowD2Ev__ZN3mup6FunSin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunSinC1ERKS0___ZN3mup6FunSinC1Ev__ZN3mup6FunSinC2ERKS0___ZN3mup6FunSinC2Ev__ZN3mup6FunSinD0Ev__ZN3mup6FunSinD1Ev__ZN3mup6FunSinD2Ev__ZN3mup6FunTan4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunTanC1ERKS0___ZN3mup6FunTanC1Ev__ZN3mup6FunTanC2ERKS0___ZN3mup6FunTanC2Ev__ZN3mup6FunTanD0Ev__ZN3mup6FunTanD1Ev__ZN3mup6FunTanD2Ev__ZN3mup7FunACos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunACosC1ERKS0___ZN3mup7FunACosC1Ev__ZN3mup7FunACosC2ERKS0___ZN3mup7FunACosC2Ev__ZN3mup7FunACosD0Ev__ZN3mup7FunACosD1Ev__ZN3mup7FunACosD2Ev__ZN3mup7FunASin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunASinC1ERKS0___ZN3mup7FunASinC1Ev__ZN3mup7FunASinC2ERKS0___ZN3mup7FunASinC2Ev__ZN3mup7FunASinD0Ev__ZN3mup7FunASinD1Ev__ZN3mup7FunASinD2Ev__ZN3mup7FunATan4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunATanC1ERKS0___ZN3mup7FunATanC1Ev__ZN3mup7FunATanC2ERKS0___ZN3mup7FunATanC2Ev__ZN3mup7FunATanD0Ev__ZN3mup7FunATanD1Ev__ZN3mup7FunATanD2Ev__ZN3mup7FunCbrt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunCbrtC1ERKS0___ZN3mup7FunCbrtC1Ev__ZN3mup7FunCbrtC2ERKS0___ZN3mup7FunCbrtC2Ev__ZN3mup7FunCbrtD0Ev__ZN3mup7FunCbrtD1Ev__ZN3mup7FunCbrtD2Ev__ZN3mup7FunCosH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunCosHC1ERKS0___ZN3mup7FunCosHC1Ev__ZN3mup7FunCosHC2ERKS0___ZN3mup7FunCosHC2Ev__ZN3mup7FunCosHD0Ev__ZN3mup7FunCosHD1Ev__ZN3mup7FunCosHD2Ev__ZN3mup7FunFmod4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunFmodC1ERKS0___ZN3mup7FunFmodC1Ev__ZN3mup7FunFmodC2ERKS0___ZN3mup7FunFmodC2Ev__ZN3mup7FunFmodD0Ev__ZN3mup7FunFmodD1Ev__ZN3mup7FunFmodD2Ev__ZN3mup7FunLog24EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunLog2C1ERKS0___ZN3mup7FunLog2C1Ev__ZN3mup7FunLog2C2ERKS0___ZN3mup7FunLog2C2Ev__ZN3mup7FunLog2D0Ev__ZN3mup7FunLog2D1Ev__ZN3mup7FunLog2D2Ev__ZN3mup7FunSinH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunSinHC1ERKS0___ZN3mup7FunSinHC1Ev__ZN3mup7FunSinHC2ERKS0___ZN3mup7FunSinHC2Ev__ZN3mup7FunSinHD0Ev__ZN3mup7FunSinHD1Ev__ZN3mup7FunSinHD2Ev__ZN3mup7FunSqrt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunSqrtC1ERKS0___ZN3mup7FunSqrtC1Ev__ZN3mup7FunSqrtC2ERKS0___ZN3mup7FunSqrtC2Ev__ZN3mup7FunSqrtD0Ev__ZN3mup7FunSqrtD1Ev__ZN3mup7FunSqrtD2Ev__ZN3mup7FunTanH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunTanHC1ERKS0___ZN3mup7FunTanHC1Ev__ZN3mup7FunTanHC2ERKS0___ZN3mup7FunTanHC2Ev__ZN3mup7FunTanHD0Ev__ZN3mup7FunTanHD1Ev__ZN3mup7FunTanHD2Ev__ZN3mup8FunACosH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunACosHC1ERKS0___ZN3mup8FunACosHC1Ev__ZN3mup8FunACosHC2ERKS0___ZN3mup8FunACosHC2Ev__ZN3mup8FunACosHD0Ev__ZN3mup8FunACosHD1Ev__ZN3mup8FunACosHD2Ev__ZN3mup8FunASinH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunASinHC1ERKS0___ZN3mup8FunASinHC1Ev__ZN3mup8FunASinHC2ERKS0___ZN3mup8FunASinHC2Ev__ZN3mup8FunASinHD0Ev__ZN3mup8FunASinHD1Ev__ZN3mup8FunASinHD2Ev__ZN3mup8FunATanH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunATanHC1ERKS0___ZN3mup8FunATanHC1Ev__ZN3mup8FunATanHC2ERKS0___ZN3mup8FunATanHC2Ev__ZN3mup8FunATanHD0Ev__ZN3mup8FunATanHD1Ev__ZN3mup8FunATanHD2Ev__ZN3mup8FunAtan24EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunAtan2C1ERKS0___ZN3mup8FunAtan2C1Ev__ZN3mup8FunAtan2C2ERKS0___ZN3mup8FunAtan2C2Ev__ZN3mup8FunAtan2D0Ev__ZN3mup8FunAtan2D1Ev__ZN3mup8FunAtan2D2Ev__ZN3mup8FunHypot4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunHypotC1ERKS0___ZN3mup8FunHypotC1Ev__ZN3mup8FunHypotC2ERKS0___ZN3mup8FunHypotC2Ev__ZN3mup8FunHypotD0Ev__ZN3mup8FunHypotD1Ev__ZN3mup8FunHypotD2Ev__ZN3mup8FunLog104EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunLog10C1ERKS0___ZN3mup8FunLog10C1Ev__ZN3mup8FunLog10C2ERKS0___ZN3mup8FunLog10C2Ev__ZN3mup8FunLog10D0Ev__ZN3mup8FunLog10D1Ev__ZN3mup8FunLog10D2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup12FunRemainder5CloneEv__ZNK3mup12FunRemainder7GetDescEv__ZNK3mup5FunLn5CloneEv__ZNK3mup5FunLn7GetDescEv__ZNK3mup6FunAbs5CloneEv__ZNK3mup6FunAbs7GetDescEv__ZNK3mup6FunCos5CloneEv__ZNK3mup6FunCos7GetDescEv__ZNK3mup6FunExp5CloneEv__ZNK3mup6FunExp7GetDescEv__ZNK3mup6FunLog5CloneEv__ZNK3mup6FunLog7GetDescEv__ZNK3mup6FunPow5CloneEv__ZNK3mup6FunPow7GetDescEv__ZNK3mup6FunSin5CloneEv__ZNK3mup6FunSin7GetDescEv__ZNK3mup6FunTan5CloneEv__ZNK3mup6FunTan7GetDescEv__ZNK3mup7FunACos5CloneEv__ZNK3mup7FunACos7GetDescEv__ZNK3mup7FunASin5CloneEv__ZNK3mup7FunASin7GetDescEv__ZNK3mup7FunATan5CloneEv__ZNK3mup7FunATan7GetDescEv__ZNK3mup7FunCbrt5CloneEv__ZNK3mup7FunCbrt7GetDescEv__ZNK3mup7FunCosH5CloneEv__ZNK3mup7FunCosH7GetDescEv__ZNK3mup7FunFmod5CloneEv__ZNK3mup7FunFmod7GetDescEv__ZNK3mup7FunLog25CloneEv__ZNK3mup7FunLog27GetDescEv__ZNK3mup7FunSinH5CloneEv__ZNK3mup7FunSinH7GetDescEv__ZNK3mup7FunSqrt5CloneEv__ZNK3mup7FunSqrt7GetDescEv__ZNK3mup7FunTanH5CloneEv__ZNK3mup7FunTanH7GetDescEv__ZNK3mup8FunACosH5CloneEv__ZNK3mup8FunACosH7GetDescEv__ZNK3mup8FunASinH5CloneEv__ZNK3mup8FunASinH7GetDescEv__ZNK3mup8FunATanH5CloneEv__ZNK3mup8FunATanH7GetDescEv__ZNK3mup8FunAtan25CloneEv__ZNK3mup8FunAtan27GetDescEv__ZNK3mup8FunHypot5CloneEv__ZNK3mup8FunHypot7GetDescEv__ZNK3mup8FunLog105CloneEv__ZNK3mup8FunLog107GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZTIN3mup12FunRemainderE__ZTIN3mup5FunLnE__ZTIN3mup6FunAbsE__ZTIN3mup6FunCosE__ZTIN3mup6FunExpE__ZTIN3mup6FunLogE__ZTIN3mup6FunPowE__ZTIN3mup6FunSinE__ZTIN3mup6FunTanE__ZTIN3mup7FunACosE__ZTIN3mup7FunASinE__ZTIN3mup7FunATanE__ZTIN3mup7FunCbrtE__ZTIN3mup7FunCosHE__ZTIN3mup7FunFmodE__ZTIN3mup7FunLog2E__ZTIN3mup7FunSinHE__ZTIN3mup7FunSqrtE__ZTIN3mup7FunTanHE__ZTIN3mup8FunACosHE__ZTIN3mup8FunASinHE__ZTIN3mup8FunATanHE__ZTIN3mup8FunAtan2E__ZTIN3mup8FunHypotE__ZTIN3mup8FunLog10E__ZTSN3mup12FunRemainderE__ZTSN3mup5FunLnE__ZTSN3mup6FunAbsE__ZTSN3mup6FunCosE__ZTSN3mup6FunExpE__ZTSN3mup6FunLogE__ZTSN3mup6FunPowE__ZTSN3mup6FunSinE__ZTSN3mup6FunTanE__ZTSN3mup7FunACosE__ZTSN3mup7FunASinE__ZTSN3mup7FunATanE__ZTSN3mup7FunCbrtE__ZTSN3mup7FunCosHE__ZTSN3mup7FunFmodE__ZTSN3mup7FunLog2E__ZTSN3mup7FunSinHE__ZTSN3mup7FunSqrtE__ZTSN3mup7FunTanHE__ZTSN3mup8FunACosHE__ZTSN3mup8FunASinHE__ZTSN3mup8FunATanHE__ZTSN3mup8FunAtan2E__ZTSN3mup8FunHypotE__ZTSN3mup8FunLog10E__ZTVN3mup12FunRemainderE__ZTVN3mup5FunLnE__ZTVN3mup6FunAbsE__ZTVN3mup6FunCosE__ZTVN3mup6FunExpE__ZTVN3mup6FunLogE__ZTVN3mup6FunPowE__ZTVN3mup6FunSinE__ZTVN3mup6FunTanE__ZTVN3mup7FunACosE__ZTVN3mup7FunASinE__ZTVN3mup7FunATanE__ZTVN3mup7FunCbrtE__ZTVN3mup7FunCosHE__ZTVN3mup7FunFmodE__ZTVN3mup7FunLog2E__ZTVN3mup7FunSinHE__ZTVN3mup7FunSqrtE__ZTVN3mup7FunTanHE__ZTVN3mup8FunACosHE__ZTVN3mup8FunASinHE__ZTVN3mup8FunATanHE__ZTVN3mup8FunAtan2E__ZTVN3mup8FunHypotE__ZTVN3mup8FunLog10E__Z7toloweri__Z7toupperi__ZN3mup11FunStrToDbl4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunStrToDblC1ERKS0___ZN3mup11FunStrToDblC1Ev__ZN3mup11FunStrToDblC2ERKS0___ZN3mup11FunStrToDblC2Ev__ZN3mup11FunStrToDblD0Ev__ZN3mup11FunStrToDblD1Ev__ZN3mup11FunStrToDblD2Ev__ZN3mup13FunStrToLower4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunStrToLowerC1ERKS0___ZN3mup13FunStrToLowerC1Ev__ZN3mup13FunStrToLowerC2ERKS0___ZN3mup13FunStrToLowerC2Ev__ZN3mup13FunStrToLowerD0Ev__ZN3mup13FunStrToLowerD1Ev__ZN3mup13FunStrToLowerD2Ev__ZN3mup13FunStrToUpper4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunStrToUpperC1ERKS0___ZN3mup13FunStrToUpperC1Ev__ZN3mup13FunStrToUpperC2ERKS0___ZN3mup13FunStrToUpperC2Ev__ZN3mup13FunStrToUpperD0Ev__ZN3mup13FunStrToUpperD1Ev__ZN3mup13FunStrToUpperD2Ev__ZN3mup9FunStrLen4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9FunStrLenC1ERKS0___ZN3mup9FunStrLenC1Ev__ZN3mup9FunStrLenC2ERKS0___ZN3mup9FunStrLenC2Ev__ZN3mup9FunStrLenD0Ev__ZN3mup9FunStrLenD1Ev__ZN3mup9FunStrLenD2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup11FunStrToDbl5CloneEv__ZNK3mup11FunStrToDbl7GetDescEv__ZNK3mup13FunStrToLower5CloneEv__ZNK3mup13FunStrToLower7GetDescEv__ZNK3mup13FunStrToUpper5CloneEv__ZNK3mup13FunStrToUpper7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup9FunStrLen5CloneEv__ZNK3mup9FunStrLen7GetDescEv__ZTIN3mup11FunStrToDblE__ZTIN3mup13FunStrToLowerE__ZTIN3mup13FunStrToUpperE__ZTIN3mup9FunStrLenE__ZTSN3mup11FunStrToDblE__ZTSN3mup13FunStrToLowerE__ZTSN3mup13FunStrToUpperE__ZTSN3mup9FunStrLenE__ZTVN3mup11FunStrToDblE__ZTVN3mup13FunStrToLowerE__ZTVN3mup13FunStrToUpperE__ZTVN3mup9FunStrLenE___clang_call_terminate__ZN3mup9ICallback11AsICallbackEv__ZN3mup9ICallback17SetNumArgsPresentEi__ZN3mup9ICallback7SetArgcEi__ZN3mup9ICallback8AsIValueEv__ZN3mup9ICallback9GetParentEv__ZN3mup9ICallback9SetParentEPNS_11ParserXBaseE__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup9ICallbackD0Ev__ZN3mup9ICallbackD1Ev__ZN3mup9ICallbackD2Ev__ZNK3mup9ICallback14GetArgsPresentEv__ZNK3mup9ICallback7GetArgcEv__ZNK3mup9ICallback9AsciiDumpEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup9ICallbackE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup9ICallbackE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup9ICallbackE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup10IOprtInfix13AsIPrecedenceEv__ZN3mup10IOprtInfixC2EPKci__ZN3mup10IOprtInfixD0Ev__ZN3mup10IOprtInfixD1Ev__ZN3mup10IOprtInfixD2Ev__ZN3mup11IPrecedenceC2Ev__ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11IPrecedenceD2Ev__ZN3mup12IOprtPostfixC2EPKc__ZN3mup12IOprtPostfixD0Ev__ZN3mup12IOprtPostfixD1Ev__ZN3mup12IOprtPostfixD2Ev__ZN3mup8IOprtBin13AsIPrecedenceEv__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZN3mup8IOprtBinD0Ev__ZN3mup8IOprtBinD1Ev__ZN3mup8IOprtBinD2Ev__ZNK3mup10IOprtInfix16GetAssociativityEv__ZNK3mup10IOprtInfix6GetPriEv__ZNK3mup10IOprtInfix9AsciiDumpEv__ZNK3mup12IOprtPostfix9AsciiDumpEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup10IOprtInfixE__ZTIN3mup11IPrecedenceE__ZTIN3mup12IOprtPostfixE__ZTIN3mup8IOprtBinE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup10IOprtInfixE__ZTSN3mup11IPrecedenceE__ZTSN3mup12IOprtPostfixE__ZTSN3mup8IOprtBinE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup10IOprtInfixE__ZTVN3mup11IPrecedenceE__ZTVN3mup12IOprtPostfixE__ZTVN3mup8IOprtBinE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZThn80_N3mup10IOprtInfixD0Ev__ZThn80_N3mup10IOprtInfixD1Ev__ZThn80_N3mup8IOprtBinD0Ev__ZThn80_N3mup8IOprtBinD1Ev__ZThn80_NK3mup10IOprtInfix16GetAssociativityEv__ZThn80_NK3mup10IOprtInfix6GetPriEv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup8IPackageC2Ev__ZN3mup8IPackageD0Ev__ZN3mup8IPackageD1Ev__ZN3mup8IPackageD2Ev__ZTIN3mup8IPackageE__ZTSN3mup8IPackageE__ZTVN3mup8IPackageE__ZN3mup12GenericTokenC1ENS_8ECmdCodeE__ZN3mup12GenericTokenC1ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12GenericTokenC1ERKS0___ZN3mup12GenericTokenC2ENS_8ECmdCodeE__ZN3mup12GenericTokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12GenericTokenC2ERKS0___ZN3mup12GenericTokenD0Ev__ZN3mup12GenericTokenD1Ev__ZN3mup12GenericTokenD2Ev__ZN3mup6IToken10SetExprPosEi__ZN3mup6IToken11AsICallbackEv__ZN3mup6IToken13AsIPrecedenceEv__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup6IToken7ReleaseEv__ZN3mup6IToken8AddFlagsEi__ZN3mup6IToken8AsIValueEv__ZN3mup6IToken8ResetRefEv__ZN3mup6IToken8SetIdentERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup6ITokenC2ENS_8ECmdCodeE__ZN3mup6ITokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6ITokenC2ERKS0___ZN3mup6ITokenD0Ev__ZN3mup6ITokenD1Ev__ZN3mup6ITokenD2Ev__ZN3muplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_6ITokenE__ZNK3mup12GenericToken5CloneEv__ZNK3mup12GenericToken9AsciiDumpEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup6IToken6DecRefEv__ZNK3mup6IToken6GetRefEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken7GetCodeEv__ZNK3mup6IToken8GetIdentEv__ZNK3mup6IToken8ToStringEv__ZNK3mup6IToken9AsciiDumpEv__ZNK3mup6IToken9IsFlagSetEi__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup12GenericTokenE__ZTIN3mup6ITokenE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup12GenericTokenE__ZTSN3mup6ITokenE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup12GenericTokenE__ZTVN3mup6ITokenE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup12IValueReader9SetParentEPNS_11TokenReaderE__ZN3mup12IValueReaderC2ERKS0___ZN3mup12IValueReaderC2Ev__ZN3mup12IValueReaderD0Ev__ZN3mup12IValueReaderD1Ev__ZN3mup12IValueReaderD2Ev__ZNK3mup12IValueReader12TokenHistoryEm__ZNK3mup8TokenPtrINS_6ITokenEE3GetEv__ZTIN3mup12IValueReaderE__ZTSN3mup12IValueReaderE__ZTVN3mup12IValueReaderE__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup6IValue11AsICallbackEv__ZN3mup6IValue8AsIValueEv__ZN3mup6IValueC2ENS_8ECmdCodeE__ZN3mup6IValueC2ENS_8ECmdCodeERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IValueD0Ev__ZN3mup6IValueD1Ev__ZN3mup6IValueD2Ev__ZN3mup6IValueaSERKS0___ZN3muplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_6IValueE__ZN3mupmlERKNS_6IValueES2___ZNK3mup6IValue8IsScalarEv__ZNK3mup6IValue8ToStringEv__ZNK3mup6IValueeqERKS0___ZNK3mup6IValuegeERKS0___ZNK3mup6IValuegtERKS0___ZNK3mup6IValueleERKS0___ZNK3mup6IValueltERKS0___ZNK3mup6IValueneERKS0___ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup6MatrixINS_5ValueEE7GetColsEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareINS_17basic_string_viewIcS2_EEEENS_9enable_ifIXsr33__can_be_converted_to_string_viewIcS2_T_EE5valueEiE4typeERKSA___ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11ParserErrorE__ZTIN3mup6IValueE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11ParserErrorE__ZTSN3mup6IValueE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup6IValueE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceC2Ev__ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11IPrecedenceD2Ev__ZN3mup15TokenIfThenElse13AsIPrecedenceEv__ZN3mup15TokenIfThenElse9SetOffsetEi__ZN3mup15TokenIfThenElseC1ENS_8ECmdCodeE__ZN3mup15TokenIfThenElseC1ERKS0___ZN3mup15TokenIfThenElseC2ENS_8ECmdCodeE__ZN3mup15TokenIfThenElseC2ERKS0___ZN3mup15TokenIfThenElseD0Ev__ZN3mup15TokenIfThenElseD1Ev__ZN3mup15TokenIfThenElseD2Ev__ZNK3mup15TokenIfThenElse16GetAssociativityEv__ZNK3mup15TokenIfThenElse5CloneEv__ZNK3mup15TokenIfThenElse6GetPriEv__ZNK3mup15TokenIfThenElse9AsciiDumpEv__ZNK3mup15TokenIfThenElse9GetOffsetEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11IPrecedenceE__ZTIN3mup15TokenIfThenElseE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11IPrecedenceE__ZTSN3mup15TokenIfThenElseE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup11IPrecedenceE__ZTVN3mup15TokenIfThenElseE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZThn64_N3mup15TokenIfThenElseD0Ev__ZThn64_N3mup15TokenIfThenElseD1Ev__ZThn64_NK3mup15TokenIfThenElse16GetAssociativityEv__ZThn64_NK3mup15TokenIfThenElse6GetPriEv__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup10OprtAssign4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup10OprtAssignC1ERKS0___ZN3mup10OprtAssignC1Ev__ZN3mup10OprtAssignC2ERKS0___ZN3mup10OprtAssignC2Ev__ZN3mup10OprtAssignD0Ev__ZN3mup10OprtAssignD1Ev__ZN3mup10OprtAssignD2Ev__ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup13OprtAssignAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignAddC1ERKS0___ZN3mup13OprtAssignAddC1Ev__ZN3mup13OprtAssignAddC2ERKS0___ZN3mup13OprtAssignAddC2Ev__ZN3mup13OprtAssignAddD0Ev__ZN3mup13OprtAssignAddD1Ev__ZN3mup13OprtAssignAddD2Ev__ZN3mup13OprtAssignDiv4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignDivC1ERKS0___ZN3mup13OprtAssignDivC1Ev__ZN3mup13OprtAssignDivC2ERKS0___ZN3mup13OprtAssignDivC2Ev__ZN3mup13OprtAssignDivD0Ev__ZN3mup13OprtAssignDivD1Ev__ZN3mup13OprtAssignDivD2Ev__ZN3mup13OprtAssignMul4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignMulC1ERKS0___ZN3mup13OprtAssignMulC1Ev__ZN3mup13OprtAssignMulC2ERKS0___ZN3mup13OprtAssignMulC2Ev__ZN3mup13OprtAssignMulD0Ev__ZN3mup13OprtAssignMulD1Ev__ZN3mup13OprtAssignMulD2Ev__ZN3mup13OprtAssignSub4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignSubC1ERKS0___ZN3mup13OprtAssignSubC1Ev__ZN3mup13OprtAssignSubC2ERKS0___ZN3mup13OprtAssignSubC2Ev__ZN3mup13OprtAssignSubD0Ev__ZN3mup13OprtAssignSubD1Ev__ZN3mup13OprtAssignSubD2Ev__ZN3mup8IOprtBinC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZNK3mup10OprtAssign5CloneEv__ZNK3mup10OprtAssign7GetDescEv__ZNK3mup13OprtAssignAdd5CloneEv__ZNK3mup13OprtAssignAdd7GetDescEv__ZNK3mup13OprtAssignDiv5CloneEv__ZNK3mup13OprtAssignDiv7GetDescEv__ZNK3mup13OprtAssignMul5CloneEv__ZNK3mup13OprtAssignMul7GetDescEv__ZNK3mup13OprtAssignSub5CloneEv__ZNK3mup13OprtAssignSub7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZTIN3mup10OprtAssignE__ZTIN3mup11IPrecedenceE__ZTIN3mup11ParserErrorE__ZTIN3mup13OprtAssignAddE__ZTIN3mup13OprtAssignDivE__ZTIN3mup13OprtAssignMulE__ZTIN3mup13OprtAssignSubE__ZTSN3mup10OprtAssignE__ZTSN3mup11IPrecedenceE__ZTSN3mup11ParserErrorE__ZTSN3mup13OprtAssignAddE__ZTSN3mup13OprtAssignDivE__ZTSN3mup13OprtAssignMulE__ZTSN3mup13OprtAssignSubE__ZTVN3mup10OprtAssignE__ZTVN3mup11IPrecedenceE__ZTVN3mup13OprtAssignAddE__ZTVN3mup13OprtAssignDivE__ZTVN3mup13OprtAssignMulE__ZTVN3mup13OprtAssignSubE__ZThn80_N3mup10OprtAssignD0Ev__ZThn80_N3mup10OprtAssignD1Ev__ZThn80_N3mup13OprtAssignAddD0Ev__ZThn80_N3mup13OprtAssignAddD1Ev__ZThn80_N3mup13OprtAssignDivD0Ev__ZThn80_N3mup13OprtAssignDivD1Ev__ZThn80_N3mup13OprtAssignMulD0Ev__ZThn80_N3mup13OprtAssignMulD1Ev__ZThn80_N3mup13OprtAssignSubD0Ev__ZThn80_N3mup13OprtAssignSubD1Ev___clang_call_terminate__ZN3mup10IOprtInfixC2ERKS0___ZN3mup10OprtStrAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup10OprtStrAddC1ERKS0___ZN3mup10OprtStrAddC1Ev__ZN3mup10OprtStrAddC2ERKS0___ZN3mup10OprtStrAddC2Ev__ZN3mup10OprtStrAddD0Ev__ZN3mup10OprtStrAddD1Ev__ZN3mup10OprtStrAddD2Ev__ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup13OprtCastToInt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtCastToIntC1ERKS0___ZN3mup13OprtCastToIntC1Ev__ZN3mup13OprtCastToIntC2ERKS0___ZN3mup13OprtCastToIntC2Ev__ZN3mup13OprtCastToIntD0Ev__ZN3mup13OprtCastToIntD1Ev__ZN3mup13OprtCastToIntD2Ev__ZN3mup15OprtCastToFloat4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup15OprtCastToFloatC1ERKS0___ZN3mup15OprtCastToFloatC1Ev__ZN3mup15OprtCastToFloatC2ERKS0___ZN3mup15OprtCastToFloatC2Ev__ZN3mup15OprtCastToFloatD0Ev__ZN3mup15OprtCastToFloatD1Ev__ZN3mup15OprtCastToFloatD2Ev__ZN3mup6OprtEQ4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtEQC1ERKS0___ZN3mup6OprtEQC1Ev__ZN3mup6OprtEQC2ERKS0___ZN3mup6OprtEQC2Ev__ZN3mup6OprtEQD0Ev__ZN3mup6OprtEQD1Ev__ZN3mup6OprtEQD2Ev__ZN3mup6OprtGE4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtGEC1ERKS0___ZN3mup6OprtGEC1Ev__ZN3mup6OprtGEC2ERKS0___ZN3mup6OprtGEC2Ev__ZN3mup6OprtGED0Ev__ZN3mup6OprtGED1Ev__ZN3mup6OprtGED2Ev__ZN3mup6OprtGT4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtGTC1ERKS0___ZN3mup6OprtGTC1Ev__ZN3mup6OprtGTC2ERKS0___ZN3mup6OprtGTC2Ev__ZN3mup6OprtGTD0Ev__ZN3mup6OprtGTD1Ev__ZN3mup6OprtGTD2Ev__ZN3mup6OprtLE4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtLEC1ERKS0___ZN3mup6OprtLEC1Ev__ZN3mup6OprtLEC2ERKS0___ZN3mup6OprtLEC2Ev__ZN3mup6OprtLED0Ev__ZN3mup6OprtLED1Ev__ZN3mup6OprtLED2Ev__ZN3mup6OprtLT4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtLTC1ERKS0___ZN3mup6OprtLTC1Ev__ZN3mup6OprtLTC2ERKS0___ZN3mup6OprtLTC2Ev__ZN3mup6OprtLTD0Ev__ZN3mup6OprtLTD1Ev__ZN3mup6OprtLTD2Ev__ZN3mup6OprtOr4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtOrC1ERKS0___ZN3mup6OprtOrC1Ev__ZN3mup6OprtOrC2ERKS0___ZN3mup6OprtOrC2Ev__ZN3mup6OprtOrD0Ev__ZN3mup6OprtOrD1Ev__ZN3mup6OprtOrD2Ev__ZN3mup7OprtAnd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtAndC1ERKS0___ZN3mup7OprtAndC1Ev__ZN3mup7OprtAndC2ERKS0___ZN3mup7OprtAndC2Ev__ZN3mup7OprtAndD0Ev__ZN3mup7OprtAndD1Ev__ZN3mup7OprtAndD2Ev__ZN3mup7OprtLOr4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtLOrC1EPKc__ZN3mup7OprtLOrC1ERKS0___ZN3mup7OprtLOrC2EPKc__ZN3mup7OprtLOrC2ERKS0___ZN3mup7OprtLOrD0Ev__ZN3mup7OprtLOrD1Ev__ZN3mup7OprtLOrD2Ev__ZN3mup7OprtNEQ4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtNEQC1ERKS0___ZN3mup7OprtNEQC1Ev__ZN3mup7OprtNEQC2ERKS0___ZN3mup7OprtNEQC2Ev__ZN3mup7OprtNEQD0Ev__ZN3mup7OprtNEQD1Ev__ZN3mup7OprtNEQD2Ev__ZN3mup7OprtShl4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtShlC1ERKS0___ZN3mup7OprtShlC1Ev__ZN3mup7OprtShlC2ERKS0___ZN3mup7OprtShlC2Ev__ZN3mup7OprtShlD0Ev__ZN3mup7OprtShlD1Ev__ZN3mup7OprtShlD2Ev__ZN3mup7OprtShr4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtShrC1ERKS0___ZN3mup7OprtShrC1Ev__ZN3mup7OprtShrC2ERKS0___ZN3mup7OprtShrC2Ev__ZN3mup7OprtShrD0Ev__ZN3mup7OprtShrD1Ev__ZN3mup7OprtShrD2Ev__ZN3mup8IOprtBinC2ERKS0___ZN3mup8OprtLAnd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtLAndC1EPKc__ZN3mup8OprtLAndC1ERKS0___ZN3mup8OprtLAndC2EPKc__ZN3mup8OprtLAndC2ERKS0___ZN3mup8OprtLAndD0Ev__ZN3mup8OprtLAndD1Ev__ZN3mup8OprtLAndD2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup10OprtStrAdd5CloneEv__ZNK3mup10OprtStrAdd7GetDescEv__ZNK3mup13OprtCastToInt5CloneEv__ZNK3mup13OprtCastToInt7GetDescEv__ZNK3mup15OprtCastToFloat5CloneEv__ZNK3mup15OprtCastToFloat7GetDescEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup6OprtEQ5CloneEv__ZNK3mup6OprtEQ7GetDescEv__ZNK3mup6OprtGE5CloneEv__ZNK3mup6OprtGE7GetDescEv__ZNK3mup6OprtGT5CloneEv__ZNK3mup6OprtGT7GetDescEv__ZNK3mup6OprtLE5CloneEv__ZNK3mup6OprtLE7GetDescEv__ZNK3mup6OprtLT5CloneEv__ZNK3mup6OprtLT7GetDescEv__ZNK3mup6OprtOr5CloneEv__ZNK3mup6OprtOr7GetDescEv__ZNK3mup7OprtAnd5CloneEv__ZNK3mup7OprtAnd7GetDescEv__ZNK3mup7OprtLOr5CloneEv__ZNK3mup7OprtLOr7GetDescEv__ZNK3mup7OprtNEQ5CloneEv__ZNK3mup7OprtNEQ7GetDescEv__ZNK3mup7OprtShl5CloneEv__ZNK3mup7OprtShl7GetDescEv__ZNK3mup7OprtShr5CloneEv__ZNK3mup7OprtShr7GetDescEv__ZNK3mup8OprtLAnd5CloneEv__ZNK3mup8OprtLAnd7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EERKS9_SB___ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup10OprtStrAddE__ZTIN3mup11IPrecedenceE__ZTIN3mup11ParserErrorE__ZTIN3mup13OprtCastToIntE__ZTIN3mup15OprtCastToFloatE__ZTIN3mup6OprtEQE__ZTIN3mup6OprtGEE__ZTIN3mup6OprtGTE__ZTIN3mup6OprtLEE__ZTIN3mup6OprtLTE__ZTIN3mup6OprtOrE__ZTIN3mup7OprtAndE__ZTIN3mup7OprtLOrE__ZTIN3mup7OprtNEQE__ZTIN3mup7OprtShlE__ZTIN3mup7OprtShrE__ZTIN3mup8OprtLAndE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup10OprtStrAddE__ZTSN3mup11IPrecedenceE__ZTSN3mup11ParserErrorE__ZTSN3mup13OprtCastToIntE__ZTSN3mup15OprtCastToFloatE__ZTSN3mup6OprtEQE__ZTSN3mup6OprtGEE__ZTSN3mup6OprtGTE__ZTSN3mup6OprtLEE__ZTSN3mup6OprtLTE__ZTSN3mup6OprtOrE__ZTSN3mup7OprtAndE__ZTSN3mup7OprtLOrE__ZTSN3mup7OprtNEQE__ZTSN3mup7OprtShlE__ZTSN3mup7OprtShrE__ZTSN3mup8OprtLAndE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup10OprtStrAddE__ZTVN3mup11IPrecedenceE__ZTVN3mup13OprtCastToIntE__ZTVN3mup15OprtCastToFloatE__ZTVN3mup6OprtEQE__ZTVN3mup6OprtGEE__ZTVN3mup6OprtGTE__ZTVN3mup6OprtLEE__ZTVN3mup6OprtLTE__ZTVN3mup6OprtOrE__ZTVN3mup7OprtAndE__ZTVN3mup7OprtLOrE__ZTVN3mup7OprtNEQE__ZTVN3mup7OprtShlE__ZTVN3mup7OprtShrE__ZTVN3mup8OprtLAndE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZThn80_N3mup10OprtStrAddD0Ev__ZThn80_N3mup10OprtStrAddD1Ev__ZThn80_N3mup13OprtCastToIntD0Ev__ZThn80_N3mup13OprtCastToIntD1Ev__ZThn80_N3mup15OprtCastToFloatD0Ev__ZThn80_N3mup15OprtCastToFloatD1Ev__ZThn80_N3mup6OprtEQD0Ev__ZThn80_N3mup6OprtEQD1Ev__ZThn80_N3mup6OprtGED0Ev__ZThn80_N3mup6OprtGED1Ev__ZThn80_N3mup6OprtGTD0Ev__ZThn80_N3mup6OprtGTD1Ev__ZThn80_N3mup6OprtLED0Ev__ZThn80_N3mup6OprtLED1Ev__ZThn80_N3mup6OprtLTD0Ev__ZThn80_N3mup6OprtLTD1Ev__ZThn80_N3mup6OprtOrD0Ev__ZThn80_N3mup6OprtOrD1Ev__ZThn80_N3mup7OprtAndD0Ev__ZThn80_N3mup7OprtAndD1Ev__ZThn80_N3mup7OprtLOrD0Ev__ZThn80_N3mup7OprtLOrD1Ev__ZThn80_N3mup7OprtNEQD0Ev__ZThn80_N3mup7OprtNEQD1Ev__ZThn80_N3mup7OprtShlD0Ev__ZThn80_N3mup7OprtShlD1Ev__ZThn80_N3mup7OprtShrD0Ev__ZThn80_N3mup7OprtShrD1Ev__ZThn80_N3mup8OprtLAndD0Ev__ZThn80_N3mup8OprtLAndD1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup10IOprtInfixC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11MatrixErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorD0Ev__ZN3mup11MatrixErrorD1Ev__ZN3mup11MatrixErrorD2Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12OprtAddCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtAddCmplxC1ERKS0___ZN3mup12OprtAddCmplxC1Ev__ZN3mup12OprtAddCmplxC2ERKS0___ZN3mup12OprtAddCmplxC2Ev__ZN3mup12OprtAddCmplxD0Ev__ZN3mup12OprtAddCmplxD1Ev__ZN3mup12OprtAddCmplxD2Ev__ZN3mup12OprtDivCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtDivCmplxC1ERKS0___ZN3mup12OprtDivCmplxC1Ev__ZN3mup12OprtDivCmplxC2ERKS0___ZN3mup12OprtDivCmplxC2Ev__ZN3mup12OprtDivCmplxD0Ev__ZN3mup12OprtDivCmplxD1Ev__ZN3mup12OprtDivCmplxD2Ev__ZN3mup12OprtMulCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtMulCmplxC1ERKS0___ZN3mup12OprtMulCmplxC1Ev__ZN3mup12OprtMulCmplxC2ERKS0___ZN3mup12OprtMulCmplxC2Ev__ZN3mup12OprtMulCmplxD0Ev__ZN3mup12OprtMulCmplxD1Ev__ZN3mup12OprtMulCmplxD2Ev__ZN3mup12OprtPowCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtPowCmplxC1ERKS0___ZN3mup12OprtPowCmplxC1Ev__ZN3mup12OprtPowCmplxC2ERKS0___ZN3mup12OprtPowCmplxC2Ev__ZN3mup12OprtPowCmplxD0Ev__ZN3mup12OprtPowCmplxD1Ev__ZN3mup12OprtPowCmplxD2Ev__ZN3mup12OprtSubCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtSubCmplxC1ERKS0___ZN3mup12OprtSubCmplxC1Ev__ZN3mup12OprtSubCmplxC2ERKS0___ZN3mup12OprtSubCmplxC2Ev__ZN3mup12OprtSubCmplxD0Ev__ZN3mup12OprtSubCmplxD1Ev__ZN3mup12OprtSubCmplxD2Ev__ZN3mup13OprtSignCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtSignCmplxC1ERKS0___ZN3mup13OprtSignCmplxC1Ev__ZN3mup13OprtSignCmplxC2ERKS0___ZN3mup13OprtSignCmplxC2Ev__ZN3mup13OprtSignCmplxD0Ev__ZN3mup13OprtSignCmplxD1Ev__ZN3mup13OprtSignCmplxD2Ev__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEED1Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZN3mup6MatrixINS_5ValueEEmIERKS2___ZN3mup6MatrixINS_5ValueEEpLERKS2___ZN3mup8IOprtBinC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mupmiINS_5ValueEEENS_6MatrixIT_EERKS4_S6___ZN3mupplINS_5ValueEEENS_6MatrixIT_EERKS4_S6___ZNK3mup12OprtAddCmplx5CloneEv__ZNK3mup12OprtAddCmplx7GetDescEv__ZNK3mup12OprtDivCmplx5CloneEv__ZNK3mup12OprtDivCmplx7GetDescEv__ZNK3mup12OprtMulCmplx5CloneEv__ZNK3mup12OprtMulCmplx7GetDescEv__ZNK3mup12OprtPowCmplx5CloneEv__ZNK3mup12OprtPowCmplx7GetDescEv__ZNK3mup12OprtSubCmplx5CloneEv__ZNK3mup12OprtSubCmplx7GetDescEv__ZNK3mup13OprtSignCmplx5CloneEv__ZNK3mup13OprtSignCmplx7GetDescEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup6IValue9IsComplexEv__ZNK3mup6IValue9IsIntegerEv__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__13expIdEENS_7complexIT_EERKS3___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11IPrecedenceE__ZTIN3mup11MatrixErrorE__ZTIN3mup11ParserErrorE__ZTIN3mup12OprtAddCmplxE__ZTIN3mup12OprtDivCmplxE__ZTIN3mup12OprtMulCmplxE__ZTIN3mup12OprtPowCmplxE__ZTIN3mup12OprtSubCmplxE__ZTIN3mup13OprtSignCmplxE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11IPrecedenceE__ZTSN3mup11MatrixErrorE__ZTSN3mup11ParserErrorE__ZTSN3mup12OprtAddCmplxE__ZTSN3mup12OprtDivCmplxE__ZTSN3mup12OprtMulCmplxE__ZTSN3mup12OprtPowCmplxE__ZTSN3mup12OprtSubCmplxE__ZTSN3mup13OprtSignCmplxE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup11IPrecedenceE__ZTVN3mup11MatrixErrorE__ZTVN3mup12OprtAddCmplxE__ZTVN3mup12OprtDivCmplxE__ZTVN3mup12OprtMulCmplxE__ZTVN3mup12OprtPowCmplxE__ZTVN3mup12OprtSubCmplxE__ZTVN3mup13OprtSignCmplxE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZThn80_N3mup12OprtAddCmplxD0Ev__ZThn80_N3mup12OprtAddCmplxD1Ev__ZThn80_N3mup12OprtDivCmplxD0Ev__ZThn80_N3mup12OprtDivCmplxD1Ev__ZThn80_N3mup12OprtMulCmplxD0Ev__ZThn80_N3mup12OprtMulCmplxD1Ev__ZThn80_N3mup12OprtPowCmplxD0Ev__ZThn80_N3mup12OprtPowCmplxD1Ev__ZThn80_N3mup12OprtSubCmplxD0Ev__ZThn80_N3mup12OprtSubCmplxD1Ev__ZThn80_N3mup13OprtSignCmplxD0Ev__ZThn80_N3mup13OprtSignCmplxD1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup8TokenPtrINS_6IValueEE5ResetEPS1___ZN3mup9ICallbackC2ERKS0___ZN3mup9OprtIndex4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9OprtIndexC1ERKS0___ZN3mup9OprtIndexC1Ev__ZN3mup9OprtIndexC2ERKS0___ZN3mup9OprtIndexC2Ev__ZN3mup9OprtIndexD0Ev__ZN3mup9OprtIndexD1Ev__ZN3mup9OprtIndexD2Ev__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup9OprtIndex5CloneEv__ZNK3mup9OprtIndex7GetDescEv__ZTIN3mup11ParserErrorE__ZTIN3mup9OprtIndexE__ZTSN3mup11ParserErrorE__ZTSN3mup9OprtIndexE__ZTVN3mup9OprtIndexE___clang_call_terminate__ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12IOprtPostfixC2ERKS0___ZN3mup13OprtTranspose4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtTransposeC1ERKS0___ZN3mup13OprtTransposeC1Ev__ZN3mup13OprtTransposeC2ERKS0___ZN3mup13OprtTransposeC2Ev__ZN3mup13OprtTransposeD0Ev__ZN3mup13OprtTransposeD1Ev__ZN3mup13OprtTransposeD2Ev__ZN3mup15OprtCreateArray4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup15OprtCreateArrayC1ERKS0___ZN3mup15OprtCreateArrayC1Ev__ZN3mup15OprtCreateArrayC2ERKS0___ZN3mup15OprtCreateArrayC2Ev__ZN3mup15OprtCreateArrayD0Ev__ZN3mup15OprtCreateArrayD1Ev__ZN3mup15OprtCreateArrayD2Ev__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZN3mup6MatrixINS_5ValueEE9TransposeEv__ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mup6MatrixINS_5ValueEEC1EiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiiRKS1___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC2EiRKS1___ZN3mup6MatrixINS_5ValueEEC2EiiRKS1___ZN3mup6MatrixINS_5ValueEED1Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZN3mup8IOprtBinC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup9OprtColon4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9OprtColonC1ERKS0___ZN3mup9OprtColonC1Ev__ZN3mup9OprtColonC2ERKS0___ZN3mup9OprtColonC2Ev__ZN3mup9OprtColonD0Ev__ZN3mup9OprtColonD1Ev__ZN3mup9OprtColonD2Ev__ZNK3mup13OprtTranspose5CloneEv__ZNK3mup13OprtTranspose7GetDescEv__ZNK3mup15OprtCreateArray5CloneEv__ZNK3mup15OprtCreateArray7GetDescEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup6IValue6GetDimEv__ZNK3mup6IValue8IsMatrixEv__ZNK3mup6MatrixINS_5ValueEE6GetDimEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup9OprtColon5CloneEv__ZNK3mup9OprtColon7GetDescEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZTIN3mup11IPrecedenceE__ZTIN3mup11ParserErrorE__ZTIN3mup13OprtTransposeE__ZTIN3mup15OprtCreateArrayE__ZTIN3mup9OprtColonE__ZTSN3mup11IPrecedenceE__ZTSN3mup11ParserErrorE__ZTSN3mup13OprtTransposeE__ZTSN3mup15OprtCreateArrayE__ZTSN3mup9OprtColonE__ZTVN3mup11IPrecedenceE__ZTVN3mup13OprtTransposeE__ZTVN3mup15OprtCreateArrayE__ZTVN3mup9OprtColonE__ZThn80_N3mup9OprtColonD0Ev__ZThn80_N3mup9OprtColonD1Ev___clang_call_terminate__ZN3mup10IOprtInfixC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup11OprtSignPos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11OprtSignPosC1ERKS0___ZN3mup11OprtSignPosC1Ev__ZN3mup11OprtSignPosC2ERKS0___ZN3mup11OprtSignPosC2Ev__ZN3mup11OprtSignPosD0Ev__ZN3mup11OprtSignPosD1Ev__ZN3mup11OprtSignPosD2Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mup6MatrixINS_5ValueEEC1EiRKS1___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC2EiRKS1___ZN3mup6MatrixINS_5ValueEED1Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZN3mup7OprtAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtAddC1ERKS0___ZN3mup7OprtAddC1Ev__ZN3mup7OprtAddC2ERKS0___ZN3mup7OprtAddC2Ev__ZN3mup7OprtAddD0Ev__ZN3mup7OprtAddD1Ev__ZN3mup7OprtAddD2Ev__ZN3mup7OprtDiv4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtDivC1ERKS0___ZN3mup7OprtDivC1Ev__ZN3mup7OprtDivC2ERKS0___ZN3mup7OprtDivC2Ev__ZN3mup7OprtDivD0Ev__ZN3mup7OprtDivD1Ev__ZN3mup7OprtDivD2Ev__ZN3mup7OprtMul4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtMulC1ERKS0___ZN3mup7OprtMulC1Ev__ZN3mup7OprtMulC2ERKS0___ZN3mup7OprtMulC2Ev__ZN3mup7OprtMulD0Ev__ZN3mup7OprtMulD1Ev__ZN3mup7OprtMulD2Ev__ZN3mup7OprtPow4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtPowC1ERKS0___ZN3mup7OprtPowC1Ev__ZN3mup7OprtPowC2ERKS0___ZN3mup7OprtPowC2Ev__ZN3mup7OprtPowD0Ev__ZN3mup7OprtPowD1Ev__ZN3mup7OprtPowD2Ev__ZN3mup7OprtSub4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtSubC1ERKS0___ZN3mup7OprtSubC1Ev__ZN3mup7OprtSubC2ERKS0___ZN3mup7OprtSubC2Ev__ZN3mup7OprtSubD0Ev__ZN3mup7OprtSubD1Ev__ZN3mup7OprtSubD2Ev__ZN3mup8IOprtBinC2ERKS0___ZN3mup8OprtSign4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtSignC1ERKS0___ZN3mup8OprtSignC1Ev__ZN3mup8OprtSignC2ERKS0___ZN3mup8OprtSignC2Ev__ZN3mup8OprtSignD0Ev__ZN3mup8OprtSignD1Ev__ZN3mup8OprtSignD2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup11OprtSignPos5CloneEv__ZNK3mup11OprtSignPos7GetDescEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNK3mup7OprtAdd5CloneEv__ZNK3mup7OprtAdd7GetDescEv__ZNK3mup7OprtDiv5CloneEv__ZNK3mup7OprtDiv7GetDescEv__ZNK3mup7OprtMul5CloneEv__ZNK3mup7OprtMul7GetDescEv__ZNK3mup7OprtPow5CloneEv__ZNK3mup7OprtPow7GetDescEv__ZNK3mup7OprtSub5CloneEv__ZNK3mup7OprtSub7GetDescEv__ZNK3mup8OprtSign5CloneEv__ZNK3mup8OprtSign7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11IPrecedenceE__ZTIN3mup11OprtSignPosE__ZTIN3mup11ParserErrorE__ZTIN3mup7OprtAddE__ZTIN3mup7OprtDivE__ZTIN3mup7OprtMulE__ZTIN3mup7OprtPowE__ZTIN3mup7OprtSubE__ZTIN3mup8OprtSignE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11IPrecedenceE__ZTSN3mup11OprtSignPosE__ZTSN3mup11ParserErrorE__ZTSN3mup7OprtAddE__ZTSN3mup7OprtDivE__ZTSN3mup7OprtMulE__ZTSN3mup7OprtPowE__ZTSN3mup7OprtSubE__ZTSN3mup8OprtSignE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup11IPrecedenceE__ZTVN3mup11OprtSignPosE__ZTVN3mup7OprtAddE__ZTVN3mup7OprtDivE__ZTVN3mup7OprtMulE__ZTVN3mup7OprtPowE__ZTVN3mup7OprtSubE__ZTVN3mup8OprtSignE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZThn80_N3mup11OprtSignPosD0Ev__ZThn80_N3mup11OprtSignPosD1Ev__ZThn80_N3mup7OprtAddD0Ev__ZThn80_N3mup7OprtAddD1Ev__ZThn80_N3mup7OprtDivD0Ev__ZThn80_N3mup7OprtDivD1Ev__ZThn80_N3mup7OprtMulD0Ev__ZThn80_N3mup7OprtMulD1Ev__ZThn80_N3mup7OprtPowD0Ev__ZThn80_N3mup7OprtPowD1Ev__ZThn80_N3mup7OprtSubD0Ev__ZThn80_N3mup7OprtSubD1Ev__ZThn80_N3mup8OprtSignD0Ev__ZThn80_N3mup8OprtSignD1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12IOprtPostfixC2ERKS0___ZN3mup14OprtPercentage4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup14OprtPercentageC1ERKS0___ZN3mup14OprtPercentageC1Ev__ZN3mup14OprtPercentageC2ERKS0___ZN3mup14OprtPercentageC2Ev__ZN3mup14OprtPercentageD0Ev__ZN3mup14OprtPercentageD1Ev__ZN3mup14OprtPercentageD2Ev__ZN3mup8OprtFact4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtFactC1ERKS0___ZN3mup8OprtFactC1Ev__ZN3mup8OprtFactC2ERKS0___ZN3mup8OprtFactC2Ev__ZN3mup8OprtFactD0Ev__ZN3mup8OprtFactD1Ev__ZN3mup8OprtFactD2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup14OprtPercentage5CloneEv__ZNK3mup14OprtPercentage7GetDescEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup6IValue9IsIntegerEv__ZNK3mup8OprtFact5CloneEv__ZNK3mup8OprtFact7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZTIN3mup11ParserErrorE__ZTIN3mup14OprtPercentageE__ZTIN3mup8OprtFactE__ZTSN3mup11ParserErrorE__ZTSN3mup14OprtPercentageE__ZTSN3mup8OprtFactE__ZTVN3mup14OprtPercentageE__ZTVN3mup8OprtFactE__ZN3mup12PackageCmplx11AddToParserEPNS_11ParserXBaseE__ZN3mup12PackageCmplx11s_pInstanceE__ZN3mup12PackageCmplx8InstanceEv__ZN3mup12PackageCmplxC1Ev__ZN3mup12PackageCmplxC2Ev__ZN3mup12PackageCmplxD0Ev__ZN3mup12PackageCmplxD1Ev__ZN3mup12PackageCmplxD2Ev__ZN3mup8TokenPtrINS_10IOprtInfixEEC1EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC2EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEED1Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED2Ev__ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNK3mup12PackageCmplx7GetDescEv__ZNK3mup12PackageCmplx9GetPrefixEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZTIN3mup12PackageCmplxE__ZTSN3mup12PackageCmplxE__ZTVN3mup12PackageCmplxE___clang_call_terminate__ZN3mup13PackageCommon11AddToParserEPNS_11ParserXBaseE__ZN3mup13PackageCommon11s_pInstanceE__ZN3mup13PackageCommon8InstanceEv__ZN3mup13PackageCommonC1Ev__ZN3mup13PackageCommonC2Ev__ZN3mup13PackageCommonD0Ev__ZN3mup13PackageCommonD1Ev__ZN3mup13PackageCommonD2Ev__ZN3mup8TokenPtrINS_10IOprtInfixEEC1EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC2EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEED1Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED2Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEEC1EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEEC2EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEED1Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED2Ev__ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNK3mup13PackageCommon7GetDescEv__ZNK3mup13PackageCommon9GetPrefixEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZTIN3mup13PackageCommonE__ZTSN3mup13PackageCommonE__ZTVN3mup13PackageCommonE___clang_call_terminate__ZN3mup13PackageMatrix11AddToParserEPNS_11ParserXBaseE__ZN3mup13PackageMatrix11s_pInstanceE__ZN3mup13PackageMatrix8InstanceEv__ZN3mup13PackageMatrixC1Ev__ZN3mup13PackageMatrixC2Ev__ZN3mup13PackageMatrixD0Ev__ZN3mup13PackageMatrixD1Ev__ZN3mup13PackageMatrixD2Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEEC1EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEEC2EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEED1Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNK3mup13PackageMatrix7GetDescEv__ZNK3mup13PackageMatrix9GetPrefixEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZTIN3mup13PackageMatrixE__ZTSN3mup13PackageMatrixE__ZTVN3mup13PackageMatrixE___clang_call_terminate__ZN3mup15PackageNonCmplx11AddToParserEPNS_11ParserXBaseE__ZN3mup15PackageNonCmplx11s_pInstanceE__ZN3mup15PackageNonCmplx8InstanceEv__ZN3mup15PackageNonCmplxC1Ev__ZN3mup15PackageNonCmplxC2Ev__ZN3mup15PackageNonCmplxD0Ev__ZN3mup15PackageNonCmplxD1Ev__ZN3mup15PackageNonCmplxD2Ev__ZN3mup8TokenPtrINS_10IOprtInfixEEC1EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC2EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEED1Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED2Ev__ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNK3mup15PackageNonCmplx7GetDescEv__ZNK3mup15PackageNonCmplx9GetPrefixEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZTIN3mup15PackageNonCmplxE__ZTSN3mup15PackageNonCmplxE__ZTVN3mup15PackageNonCmplxE___clang_call_terminate__ZN3mup10PackageStr11AddToParserEPNS_11ParserXBaseE__ZN3mup10PackageStr11s_pInstanceE__ZN3mup10PackageStr8InstanceEv__ZN3mup10PackageStrC1Ev__ZN3mup10PackageStrC2Ev__ZN3mup10PackageStrD0Ev__ZN3mup10PackageStrD1Ev__ZN3mup10PackageStrD2Ev__ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNK3mup10PackageStr7GetDescEv__ZNK3mup10PackageStr9GetPrefixEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZTIN3mup10PackageStrE__ZTSN3mup10PackageStrE__ZTVN3mup10PackageStrE___clang_call_terminate__ZN3mup11PackageUnit11AddToParserEPNS_11ParserXBaseE__ZN3mup11PackageUnit11s_pInstanceE__ZN3mup11PackageUnit8InstanceEv__ZN3mup11PackageUnitC1Ev__ZN3mup11PackageUnitC2Ev__ZN3mup11PackageUnitD0Ev__ZN3mup11PackageUnitD1Ev__ZN3mup11PackageUnitD2Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12IOprtPostfixC2ERKS0___ZN3mup8OprtGiga4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtGigaC1EPNS_8IPackageE__ZN3mup8OprtGigaC1ERKS0___ZN3mup8OprtGigaC2EPNS_8IPackageE__ZN3mup8OprtGigaC2ERKS0___ZN3mup8OprtGigaD0Ev__ZN3mup8OprtGigaD1Ev__ZN3mup8OprtGigaD2Ev__ZN3mup8OprtKilo4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtKiloC1EPNS_8IPackageE__ZN3mup8OprtKiloC1ERKS0___ZN3mup8OprtKiloC2EPNS_8IPackageE__ZN3mup8OprtKiloC2ERKS0___ZN3mup8OprtKiloD0Ev__ZN3mup8OprtKiloD1Ev__ZN3mup8OprtKiloD2Ev__ZN3mup8OprtMega4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtMegaC1EPNS_8IPackageE__ZN3mup8OprtMegaC1ERKS0___ZN3mup8OprtMegaC2EPNS_8IPackageE__ZN3mup8OprtMegaC2ERKS0___ZN3mup8OprtMegaD0Ev__ZN3mup8OprtMegaD1Ev__ZN3mup8OprtMegaD2Ev__ZN3mup8OprtNano4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtNanoC1EPNS_8IPackageE__ZN3mup8OprtNanoC1ERKS0___ZN3mup8OprtNanoC2EPNS_8IPackageE__ZN3mup8OprtNanoC2ERKS0___ZN3mup8OprtNanoD0Ev__ZN3mup8OprtNanoD1Ev__ZN3mup8OprtNanoD2Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEEC1EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEEC2EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEED1Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED2Ev__ZN3mup9ICallbackC2ERKS0___ZN3mup9OprtMicro4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9OprtMicroC1EPNS_8IPackageE__ZN3mup9OprtMicroC1ERKS0___ZN3mup9OprtMicroC2EPNS_8IPackageE__ZN3mup9OprtMicroC2ERKS0___ZN3mup9OprtMicroD0Ev__ZN3mup9OprtMicroD1Ev__ZN3mup9OprtMicroD2Ev__ZN3mup9OprtMilli4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9OprtMilliC1EPNS_8IPackageE__ZN3mup9OprtMilliC1ERKS0___ZN3mup9OprtMilliC2EPNS_8IPackageE__ZN3mup9OprtMilliC2ERKS0___ZN3mup9OprtMilliD0Ev__ZN3mup9OprtMilliD1Ev__ZN3mup9OprtMilliD2Ev__ZNK3mup11PackageUnit7GetDescEv__ZNK3mup11PackageUnit9GetPrefixEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup8OprtGiga5CloneEv__ZNK3mup8OprtGiga7GetDescEv__ZNK3mup8OprtKilo5CloneEv__ZNK3mup8OprtKilo7GetDescEv__ZNK3mup8OprtMega5CloneEv__ZNK3mup8OprtMega7GetDescEv__ZNK3mup8OprtNano5CloneEv__ZNK3mup8OprtNano7GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup9OprtMicro5CloneEv__ZNK3mup9OprtMicro7GetDescEv__ZNK3mup9OprtMilli5CloneEv__ZNK3mup9OprtMilli7GetDescEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZTIN3mup11PackageUnitE__ZTIN3mup11ParserErrorE__ZTIN3mup8OprtGigaE__ZTIN3mup8OprtKiloE__ZTIN3mup8OprtMegaE__ZTIN3mup8OprtNanoE__ZTIN3mup9OprtMicroE__ZTIN3mup9OprtMilliE__ZTSN3mup11PackageUnitE__ZTSN3mup11ParserErrorE__ZTSN3mup8OprtGigaE__ZTSN3mup8OprtKiloE__ZTSN3mup8OprtMegaE__ZTSN3mup8OprtNanoE__ZTSN3mup9OprtMicroE__ZTSN3mup9OprtMilliE__ZTVN3mup11PackageUnitE__ZTVN3mup8OprtGigaE__ZTVN3mup8OprtKiloE__ZTVN3mup8OprtMegaE__ZTVN3mup8OprtNanoE__ZTVN3mup9OprtMicroE__ZTVN3mup9OprtMilliE___clang_call_terminate__ZN3mup7ParserX25ResetErrorMessageProviderEPNS_25ParserMessageProviderBaseE__ZN3mup7ParserXC1Ej__ZN3mup7ParserXC2Ej__ZN3mup7ParserXD0Ev__ZN3mup7ParserXD1Ev__ZN3mup7ParserXD2Ev__ZTIN3mup7ParserXE__ZTSN3mup7ParserXE__ZTVN3mup7ParserXE__ZN3mup10g_sCmdCodeE__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup11ParserXBase10AddPackageEPNS_8IPackageE__ZN3mup11ParserXBase10ClearConstEv__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup11ParserXBase10GetVersionEv__ZN3mup11ParserXBase10RemoveOprtERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase10s_bDumpRPNE__ZN3mup11ParserXBase11DefineConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_5ValueE__ZN3mup11ParserXBase11RemoveConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase12s_bDumpStackE__ZN3mup11ParserXBase13c_DefaultOprtE__ZN3mup11ParserXBase14AddValueReaderEPNS_12IValueReaderE__ZN3mup11ParserXBase14ClearInfixOprtEv__ZN3mup11ParserXBase15DefineInfixOprtERKNS_8TokenPtrINS_10IOprtInfixEEE__ZN3mup11ParserXBase15DefineNameCharsEPKc__ZN3mup11ParserXBase15DefineOprtCharsEPKc__ZN3mup11ParserXBase15EnableDebugDumpEbb__ZN3mup11ParserXBase15EnableOptimizerEb__ZN3mup11ParserXBase15InitTokenReaderEv__ZN3mup11ParserXBase15RemoveInfixOprtERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase16ClearPostfixOprtEv__ZN3mup11ParserXBase17DefinePostfixOprtERKNS_8TokenPtrINS_12IOprtPostfixEEE__ZN3mup11ParserXBase17RemovePostfixOprtERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase19EnableAutoCreateVarEb__ZN3mup11ParserXBase20DefineInfixOprtCharsEPKc__ZN3mup11ParserXBase23CheckForEntityExistenceERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11EErrorCodesE__ZN3mup11ParserXBase6AssignERKS0___ZN3mup11ParserXBase7SetExprERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase8ClearFunEv__ZN3mup11ParserXBase8ClearVarEv__ZN3mup11ParserXBase9ClearExprEv__ZN3mup11ParserXBase9ClearOprtEv__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEE__ZN3mup11ParserXBase9DefineVarERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_8VariableE__ZN3mup11ParserXBase9RemoveFunERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase9RemoveVarERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBaseC1ERKS0___ZN3mup11ParserXBaseC1Ev__ZN3mup11ParserXBaseC2ERKS0___ZN3mup11ParserXBaseC2Ev__ZN3mup11ParserXBaseD0Ev__ZN3mup11ParserXBaseD1Ev__ZN3mup11ParserXBaseD2Ev__ZN3mup11ParserXBaseaSERKS0___ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE3popEv__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE3topEv__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE4pushERKS3___ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE5clearEv__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC1ERKS9___ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC1Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC2ERKS9___ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC2Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEED0Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEED1Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEED2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3popEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3topEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE4pushERKi__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED0Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED2Ev__ZN3mup7consoleEv__ZN3mup8TokenPtrINS_6ITokenEEC1EPS1___ZN3mup8TokenPtrINS_6ITokenEEC1ERKS2___ZN3mup8TokenPtrINS_6ITokenEEC2EPS1___ZN3mup8TokenPtrINS_6ITokenEEC2ERKS2___ZN3mup8TokenPtrINS_6ITokenEED1Ev__ZN3mup8TokenPtrINS_6ITokenEED2Ev__ZN3mup8TokenPtrINS_6ITokenEEaSERKS2___ZN3mup8TokenPtrINS_6IValueEE5ResetEPS1___ZN3mup8TokenPtrINS_6IValueEEC1EPS1___ZN3mup8TokenPtrINS_6IValueEEC1ERKS2___ZN3mup8TokenPtrINS_6IValueEEC2EPS1___ZN3mup8TokenPtrINS_6IValueEEC2ERKS2___ZN3mup8TokenPtrINS_6IValueEED1Ev__ZN3mup8TokenPtrINS_6IValueEED2Ev__ZN3mup8TokenPtrINS_6IValueEEaSERKS2___ZN5utils13scoped_setterIbEC1ERbb__ZN5utils13scoped_setterIbEC2ERbb__ZN5utils13scoped_setterIbED1Ev__ZN5utils13scoped_setterIbED2Ev__ZNK2su4pred12SortByLengthINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEclERKS8_SB___ZNK3mup11ParserXBase10GetExprVarEv__ZNK3mup11ParserXBase10GetOprtDefEv__ZNK3mup11ParserXBase11ApplyIfElseERNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEE__ZNK3mup11ParserXBase12IsFunDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase12IsVarDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase12ParseFromRPNEv__ZNK3mup11ParserXBase13IsOprtDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase14IsConstDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase14ValidNameCharsEv__ZNK3mup11ParserXBase14ValidOprtCharsEv__ZNK3mup11ParserXBase15ParseFromStringEv__ZNK3mup11ParserXBase18ApplyRemainingOprtERNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEE__ZNK3mup11ParserXBase18IsInfixOprtDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase19ValidInfixOprtCharsEv__ZNK3mup11ParserXBase20IsPostfixOprtDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase22IsAutoCreateVarEnabledEv__ZNK3mup11ParserXBase4EvalEv__ZNK3mup11ParserXBase5ErrorENS_11EErrorCodesEiPKNS_6ITokenE__ZNK3mup11ParserXBase6GetVarEv__ZNK3mup11ParserXBase6ReInitEv__ZNK3mup11ParserXBase7DumpRPNEv__ZNK3mup11ParserXBase7GetExprEv__ZNK3mup11ParserXBase8GetConstEv__ZNK3mup11ParserXBase9ApplyFuncERNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEEi__ZNK3mup11ParserXBase9CheckNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9___ZNK3mup11ParserXBase9CreateRPNEv__ZNK3mup11ParserXBase9GetFunDefEv__ZNK3mup11ParserXBase9StackDumpERKNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEE__ZNK3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE4sizeEv__ZNK3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE5emptyEv__ZNK3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE5emptyEv__ZNK3mup8TokenPtrINS_10IOprtInfixEEptEv__ZNK3mup8TokenPtrINS_12IOprtPostfixEEptEv__ZNK3mup8TokenPtrINS_6ITokenEE3GetEv__ZNK3mup8TokenPtrINS_6ITokenEEptEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup8TokenPtrINS_8IOprtBinEEptEv__ZNK3mup8TokenPtrINS_9ICallbackEEptEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareINS_17basic_string_viewIcS2_EEEENS_9enable_ifIXsr33__can_be_converted_to_string_viewIcS2_T_EE5valueEiE4typeERKSA___ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10__root_ptrEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SQ_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISO_EEEE__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__root_ptrEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SO_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISM_EEEE__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE8max_sizeEv__ZNSt3__111__tree_leafIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__111__tree_nextIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIiNS_9allocatorIiEEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC1EmmS3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC2EmmS3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED1Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118__tree_left_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__119__tree_right_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEED1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEED2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEEixERSG___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEixERSE___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1ERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC2ERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED1Ev__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISP_EERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SQ_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISO_EEEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE14__assign_multiINS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEEEEvT_SS___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE14__erase_uniqueIS7_EEmRKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE15__emplace_multiIJRKNS_4pairIKS7_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSP_IJEEEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISX_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_4pairIKS7_SB_EEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISU_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__find_leaf_highERPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERKS7___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSP_SP___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE19__node_insert_multiEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSP_IJEEEEEENS_4pairINS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEERKT_DpOT0___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE5clearEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE5eraseENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE8__detachEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE8__detachEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEEC1ERKSI___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEEC2ERKSI___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEED1Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEEaSERKSK___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISN_EERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SO_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISM_EEEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__assign_multiINS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEEEEvT_SQ___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__erase_uniqueIS7_EEmRKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE15__emplace_multiIJRKNS_4pairIKS7_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISV_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_4pairIKS7_SB_EEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISS_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__find_leaf_highERPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERKS7___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSN_SN___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__node_insert_multiEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_4pairINS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEERKT_DpOT0___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5clearEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5eraseENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC1ERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC2ERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED1Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEaSERKSI___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__vallocateEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE18__construct_at_endIPS4_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1ERKS7___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2ERKS7___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE11__vallocateEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE13__vdeallocateEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE18__construct_at_endIPS4_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6assignEmRKS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIiNS_9allocatorIiEEE21__push_back_slow_pathIRKiEEvOT___ZNSt3__16vectorIiNS_9allocatorIiEEE26__swap_out_circular_bufferERNS_14__split_bufferIiRS2_EE__ZNSt3__16vectorIiNS_9allocatorIiEEED1Ev__ZNSt3__16vectorIiNS_9allocatorIiEEED2Ev__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11MatrixErrorE__ZTIN3mup11ParserErrorE__ZTIN3mup11ParserXBaseE__ZTIN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEE__ZTIN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11MatrixErrorE__ZTSN3mup11ParserErrorE__ZTSN3mup11ParserXBaseE__ZTSN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEE__ZTSN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup11ParserXBaseE__ZTVN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEE__ZTVN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup25ParserMessageProviderBase4InitEv__ZN3mup25ParserMessageProviderBaseC2Ev__ZN3mup25ParserMessageProviderBaseD0Ev__ZN3mup25ParserMessageProviderBaseD1Ev__ZN3mup25ParserMessageProviderBaseD2Ev__ZN3mup28ParserMessageProviderEnglish17InitErrorMessagesEv__ZN3mup28ParserMessageProviderEnglishC1Ev__ZN3mup28ParserMessageProviderEnglishC2Ev__ZN3mup28ParserMessageProviderEnglishD0Ev__ZN3mup28ParserMessageProviderEnglishD1Ev__ZN3mup28ParserMessageProviderEnglishD2Ev__ZNK3mup25ParserMessageProviderBase11GetErrorMsgENS_11EErrorCodesE__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8max_sizeEv__ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED2Ev__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE18__construct_at_endEm__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEEC1EmmS8___ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEEC2EmmS8___ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEED1Ev__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEED2Ev__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE11__vallocateEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE18__construct_at_endEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE6resizeEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8__appendEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC1Em__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2Em__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED1Ev__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED2Ev__ZTIN3mup25ParserMessageProviderBaseE__ZTIN3mup28ParserMessageProviderEnglishE__ZTSN3mup25ParserMessageProviderBaseE__ZTSN3mup28ParserMessageProviderEnglishE__ZTVN3mup25ParserMessageProviderBaseE__ZTVN3mup28ParserMessageProviderEnglishE___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup3RPN10AddNewlineENS_8TokenPtrINS_6ITokenEEEi__ZN3mup3RPN15EnableOptimizerEb__ZN3mup3RPN3AddENS_8TokenPtrINS_6ITokenEEE__ZN3mup3RPN3PopEi__ZN3mup3RPN5ResetEv__ZN3mup3RPN8FinalizeEv__ZN3mup3RPNC1Ev__ZN3mup3RPNC2Ev__ZN3mup3RPND1Ev__ZN3mup3RPND2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3popEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3topEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE4pushERKi__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED0Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED2Ev__ZN3mup7consoleEv__ZN3mup8TokenPtrINS_6ITokenEEC1ERKS2___ZN3mup8TokenPtrINS_6ITokenEEC2ERKS2___ZN3mup8TokenPtrINS_6ITokenEED1Ev__ZN3mup8TokenPtrINS_6ITokenEED2Ev__ZNK3mup3RPN20GetRequiredStackSizeEv__ZNK3mup3RPN7GetDataEv__ZNK3mup3RPN7GetSizeEv__ZNK3mup3RPN9AsciiDumpEv__ZNK3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE5emptyEv__ZNK3mup8TokenPtrINS_6ITokenEE3GetEv__ZNK3mup8TokenPtrINS_6ITokenEEptEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE8max_sizeEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIiNS_9allocatorIiEEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC1EmmS3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC2EmmS3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED1Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIiNS_9allocatorIiEEE21__push_back_slow_pathIRKiEEvOT___ZNSt3__16vectorIiNS_9allocatorIiEEE26__swap_out_circular_bufferERNS_14__split_bufferIiRS2_EE__ZNSt3__16vectorIiNS_9allocatorIiEEED1Ev__ZNSt3__16vectorIiNS_9allocatorIiEEED2Ev__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11ParserErrorE__ZTIN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11ParserErrorE__ZTSN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup12TokenNewline14SetStackOffsetEi__ZN3mup12TokenNewlineC1ERKS0___ZN3mup12TokenNewlineC1Ev__ZN3mup12TokenNewlineC2ERKS0___ZN3mup12TokenNewlineC2Ev__ZN3mup12TokenNewlineD0Ev__ZN3mup12TokenNewlineD1Ev__ZN3mup12TokenNewlineD2Ev__ZNK3mup12TokenNewline14GetStackOffsetEv__ZNK3mup12TokenNewline5CloneEv__ZNK3mup12TokenNewline9AsciiDumpEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup12TokenNewlineE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup12TokenNewlineE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup12TokenNewlineE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup11DbgSillyAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11DbgSillyAddC1ERKS0___ZN3mup11DbgSillyAddC1Ev__ZN3mup11DbgSillyAddC2ERKS0___ZN3mup11DbgSillyAddC2Ev__ZN3mup11DbgSillyAddD0Ev__ZN3mup11DbgSillyAddD1Ev__ZN3mup11DbgSillyAddD2Ev__ZN3mup11IPrecedenceC2ERKS0___ZN3mup11IPrecedenceD0Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup12ParserTester10TestIfElseEv__ZN3mup12ParserTester10TestMatrixEv__ZN3mup12ParserTester10TestScriptEv__ZN3mup12ParserTester10TestVectorEv__ZN3mup12ParserTester11TestComplexEv__ZN3mup12ParserTester11TestPostfixEv__ZN3mup12ParserTester12TestMultiArgEv__ZN3mup12ParserTester12TestUndefVarEv__ZN3mup12ParserTester13TestStringFunEv__ZN3mup12ParserTester13TestValReaderEv__ZN3mup12ParserTester14TestErrorCodesEv__ZN3mup12ParserTester15TestParserValueEv__ZN3mup12ParserTester16TestIssueReportsEv__ZN3mup12ParserTester3RunEv__ZN3mup12ParserTester7AddTestEMS0_FivE__ZN3mup12ParserTester7EqnTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5ValueEbi__ZN3mup12ParserTester7TestEqnEv__ZN3mup12ParserTester8c_iCountE__ZN3mup12ParserTester9TestBinOpEv__ZN3mup12ParserTester9TestInfixEv__ZN3mup12ParserTester9ThrowTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiiS7___ZN3mup12ParserTesterC1Ev__ZN3mup12ParserTesterC2Ev__ZN3mup7ParserXC1ERKS0___ZN3mup7ParserXC2ERKS0___ZN3mup7ParserXD0Ev__ZN3mup7ParserXD1Ev__ZN3mup7ParserXD2Ev__ZN3mup7ParserXaSERKS0___ZN3mup7consoleEv__ZN3mup8FunTest04EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunTest0C1ERKS0___ZN3mup8FunTest0C1Ev__ZN3mup8FunTest0C2ERKS0___ZN3mup8FunTest0C2Ev__ZN3mup8FunTest0D0Ev__ZN3mup8FunTest0D1Ev__ZN3mup8FunTest0D2Ev__ZN3mup8IOprtBinC2ERKS0___ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZN3mup9ICallbackC2ERKS0___ZNK3mup11DbgSillyAdd5CloneEv__ZNK3mup11DbgSillyAdd7GetDescEv__ZNK3mup12ParserTester10AssessmentEi__ZNK3mup12ParserTester5AbortEv__ZNK3mup6IValue8IsMatrixEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup8FunTest05CloneEv__ZNK3mup8FunTest07GetDescEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE8max_sizeEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEED2Ev__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEEC1EmmS5___ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEEC2EmmS5___ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEED1Ev__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__13expIdEENS_7complexIT_EERKS3___ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT___ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS2_RS4_EE__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEED2Ev__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZTIN3mup11DbgSillyAddE__ZTIN3mup11IPrecedenceE__ZTIN3mup11ParserErrorE__ZTIN3mup7ParserXE__ZTIN3mup8FunTest0E__ZTSN3mup11DbgSillyAddE__ZTSN3mup11IPrecedenceE__ZTSN3mup11ParserErrorE__ZTSN3mup7ParserXE__ZTSN3mup8FunTest0E__ZTVN3mup11DbgSillyAddE__ZTVN3mup11IPrecedenceE__ZTVN3mup7ParserXE__ZTVN3mup8FunTest0E__ZThn80_N3mup11DbgSillyAddD0Ev__ZThn80_N3mup11DbgSillyAddD1Ev___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup11TokenReader11AddSynFlagsEi__ZN3mup11TokenReader11IsPostOpTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader12IsInfixOpTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader13IsUndefVarTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader13ReadNextTokenEv__ZN3mup11TokenReader14AddValueReaderEPNS_12IValueReaderE__ZN3mup11TokenReader15DeleteValReaderEv__ZN3mup11TokenReader15IsVarOrConstTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader26SkipCommentsAndWhitespacesEv__ZN3mup11TokenReader5IsEOFERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader5StoreERKNS_8TokenPtrINS_6ITokenEEEi__ZN3mup11TokenReader6AssignERKS0___ZN3mup11TokenReader6IsOprtERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader6ReInitEv__ZN3mup11TokenReader7SetExprERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11TokenReader8IsFunTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader8IsValTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader9IsBuiltInERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader9IsCommentEv__ZN3mup11TokenReader9IsNewlineERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader9SetParentEPNS_11ParserXBaseE__ZN3mup11TokenReaderC1EPNS_11ParserXBaseE__ZN3mup11TokenReaderC1ERKS0___ZN3mup11TokenReaderC2EPNS_11ParserXBaseE__ZN3mup11TokenReaderC2ERKS0___ZN3mup11TokenReaderD1Ev__ZN3mup11TokenReaderD2Ev__ZN3mup11TokenReaderaSERKS0___ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup8TokenPtrINS_6ITokenEEC1EPS1___ZN3mup8TokenPtrINS_6ITokenEEC1ERKS2___ZN3mup8TokenPtrINS_6ITokenEEC2EPS1___ZN3mup8TokenPtrINS_6ITokenEEC2ERKS2___ZN3mup8TokenPtrINS_6ITokenEED1Ev__ZN3mup8TokenPtrINS_6ITokenEED2Ev__ZN3mup8TokenPtrINS_6ITokenEEaSERKS2___ZN3mup8TokenPtrINS_6IValueEEC1EPS1___ZN3mup8TokenPtrINS_6IValueEEC1ERKS2___ZN3mup8TokenPtrINS_6IValueEEC2EPS1___ZN3mup8TokenPtrINS_6IValueEEC2ERKS2___ZN3mup8TokenPtrINS_6IValueEED1Ev__ZN3mup8TokenPtrINS_6IValueEED2Ev__ZNK3mup11TokenReader10GetUsedVarEv__ZNK3mup11TokenReader12ExtractTokenEPKcRNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEi__ZNK3mup11TokenReader5CloneEPNS_11ParserXBaseE__ZNK3mup11TokenReader6GetPosEv__ZNK3mup11TokenReader7GetExprEv__ZNK3mup11TokenReader9GetTokensEv__ZNK3mup8TokenPtrINS_6ITokenEEptEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareINS_17basic_string_viewIcS2_EEEENS_9enable_ifIXsr33__can_be_converted_to_string_viewIcS2_T_EE5valueEiE4typeERKSA___ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__root_ptrEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE8max_sizeEv__ZNSt3__111__tree_leafIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initINS_11__wrap_iterIPcEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignINS_11__wrap_iterIPKcEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr38__libcpp_string_gets_noexcept_iteratorISC_EE5valueERS5_E4typeESC_SC___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEEC1EmmS6___ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEEC2EmmS6___ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEED1Ev__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strERKNS_12basic_stringIcS2_S4_EE__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__118__search_substringIcNS_11char_traitsIcEEEEPKT_S5_S5_S5_S5___ZNSt3__118__tree_left_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__119__tree_right_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEixERSE___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1ERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC2ERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED1Ev__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISN_EERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SO_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISM_EEEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__assign_multiINS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEEEEvT_SQ___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE15__emplace_multiIJRKNS_4pairIKS7_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISV_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_4pairIKS7_SB_EEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISS_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__find_leaf_highERPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERKS7___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSN_SN___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__node_insert_multiEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_4pairINS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEERKT_DpOT0___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5clearEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC1ERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC2ERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED1Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEaSERKSI___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__vallocateEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE13__vdeallocateEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE18__construct_at_endIPS4_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT___ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT___ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEED1Ev__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEED2Ev__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11EErrorCodesE__ZTIN3mup11ParserErrorE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11EErrorCodesE__ZTSN3mup11ParserErrorE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12BinValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12BinValReaderC1ERKS0___ZN3mup12BinValReaderC1Ev__ZN3mup12BinValReaderC2ERKS0___ZN3mup12BinValReaderC2Ev__ZN3mup12BinValReaderD0Ev__ZN3mup12BinValReaderD1Ev__ZN3mup12BinValReaderD2Ev__ZN3mup12DblValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12DblValReaderC1ERKS0___ZN3mup12DblValReaderC1Ev__ZN3mup12DblValReaderC2ERKS0___ZN3mup12DblValReaderC2Ev__ZN3mup12DblValReaderD0Ev__ZN3mup12DblValReaderD1Ev__ZN3mup12DblValReaderD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup12HexValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12HexValReaderC1ERKS0___ZN3mup12HexValReaderC1Ev__ZN3mup12HexValReaderC2ERKS0___ZN3mup12HexValReaderC2Ev__ZN3mup12HexValReaderD0Ev__ZN3mup12HexValReaderD1Ev__ZN3mup12HexValReaderD2Ev__ZN3mup12StrValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12StrValReader8UnescapeEPKcRi__ZN3mup12StrValReaderC1ERKS0___ZN3mup12StrValReaderC1Ev__ZN3mup12StrValReaderC2ERKS0___ZN3mup12StrValReaderC2Ev__ZN3mup12StrValReaderD0Ev__ZN3mup12StrValReaderD1Ev__ZN3mup12StrValReaderD2Ev__ZN3mup13BoolValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup13BoolValReaderC1ERKS0___ZN3mup13BoolValReaderC1Ev__ZN3mup13BoolValReaderC2ERKS0___ZN3mup13BoolValReaderC2Ev__ZN3mup13BoolValReaderD0Ev__ZN3mup13BoolValReaderD1Ev__ZN3mup13BoolValReaderD2Ev__ZNK3mup12BinValReader5CloneEPNS_11TokenReaderE__ZNK3mup12DblValReader5CloneEPNS_11TokenReaderE__ZNK3mup12HexValReader5CloneEPNS_11TokenReaderE__ZNK3mup12StrValReader5CloneEPNS_11TokenReaderE__ZNK3mup13BoolValReader5CloneEPNS_11TokenReaderE__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strERKNS_12basic_stringIcS2_S4_EE__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__118__search_substringIcNS_11char_traitsIcEEEEPKT_S5_S5_S5_S5___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11ParserErrorE__ZTIN3mup12BinValReaderE__ZTIN3mup12DblValReaderE__ZTIN3mup12HexValReaderE__ZTIN3mup12StrValReaderE__ZTIN3mup13BoolValReaderE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11ParserErrorE__ZTSN3mup12BinValReaderE__ZTSN3mup12DblValReaderE__ZTSN3mup12HexValReaderE__ZTSN3mup12StrValReaderE__ZTSN3mup13BoolValReaderE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup12BinValReaderE__ZTVN3mup12DblValReaderE__ZTVN3mup12HexValReaderE__ZTVN3mup12StrValReaderE__ZTVN3mup13BoolValReaderE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup11MatrixErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorD0Ev__ZN3mup11MatrixErrorD1Ev__ZN3mup11MatrixErrorD2Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup5Value11BindToCacheEPNS_10ValueCacheE__ZN3mup5Value2AtERKNS_6IValueES3___ZN3mup5Value2AtEii__ZN3mup5Value5ResetEv__ZN3mup5Value6AssignERKS0___ZN3mup5Value7AsValueEv__ZN3mup5Value7ReleaseEv__ZN3mup5ValueC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueC1EPKc__ZN3mup5ValueC1ERKNS_6IValueE__ZN3mup5ValueC1ERKNS_6MatrixIS0_EE__ZN3mup5ValueC1ERKNSt3__17complexIdEE__ZN3mup5ValueC1ERKS0___ZN3mup5ValueC1Eb__ZN3mup5ValueC1Ec__ZN3mup5ValueC1Ed__ZN3mup5ValueC1Ei__ZN3mup5ValueC1Eid__ZN3mup5ValueC1Eiid__ZN3mup5ValueC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueC2EPKc__ZN3mup5ValueC2ERKNS_6IValueE__ZN3mup5ValueC2ERKNS_6MatrixIS0_EE__ZN3mup5ValueC2ERKNSt3__17complexIdEE__ZN3mup5ValueC2ERKS0___ZN3mup5ValueC2Eb__ZN3mup5ValueC2Ec__ZN3mup5ValueC2Ed__ZN3mup5ValueC2Ei__ZN3mup5ValueC2Eid__ZN3mup5ValueC2Eiid__ZN3mup5ValueD0Ev__ZN3mup5ValueD1Ev__ZN3mup5ValueD2Ev__ZN3mup5ValueaSENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueaSEPKc__ZN3mup5ValueaSERKNS_6MatrixIS0_EE__ZN3mup5ValueaSERKNSt3__17complexIdEE__ZN3mup5ValueaSERKS0___ZN3mup5ValueaSEb__ZN3mup5ValueaSEd__ZN3mup5ValueaSEi__ZN3mup5ValuecvNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEv__ZN3mup5ValuecvNSt3__17complexIdEEEv__ZN3mup5ValuecvbEv__ZN3mup5ValuecvdEv__ZN3mup5ValuecviEv__ZN3mup5ValuemIERKNS_6IValueE__ZN3mup5ValuemLERKNS_6IValueE__ZN3mup5ValuepLERKNS_6IValueE__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mup6MatrixINS_5ValueEEC1EiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiiRKS1___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC2EiRKS1___ZN3mup6MatrixINS_5ValueEEC2EiiRKS1___ZN3mup6MatrixINS_5ValueEED1Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZN3mup6MatrixINS_5ValueEEaSERKS2___ZN3mup6MatrixINS_5ValueEEmIERKS2___ZN3mup6MatrixINS_5ValueEEmLERKS1___ZN3mup6MatrixINS_5ValueEEmLERKS2___ZN3mup6MatrixINS_5ValueEEpLERKS2___ZNK3mup5Value10GetComplexEv__ZNK3mup5Value10GetIntegerEv__ZNK3mup5Value10IsVariableEv__ZNK3mup5Value5CloneEv__ZNK3mup5Value7GetBoolEv__ZNK3mup5Value7GetColsEv__ZNK3mup5Value7GetImagEv__ZNK3mup5Value7GetRowsEv__ZNK3mup5Value7GetTypeEv__ZNK3mup5Value8GetArrayEv__ZNK3mup5Value8GetFloatEv__ZNK3mup5Value9AsciiDumpEv__ZNK3mup5Value9CheckTypeEc__ZNK3mup5Value9GetStringEv__ZNK3mup6IValue8IsMatrixEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup6IValue8IsStringEv__ZNK3mup6IValue9IsIntegerEv__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup6MatrixINS_5ValueEE7GetColsEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11MatrixErrorE__ZTIN3mup11ParserErrorE__ZTIN3mup5ValueE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11MatrixErrorE__ZTSN3mup11ParserErrorE__ZTSN3mup5ValueE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup11MatrixErrorE__ZTVN3mup5ValueE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate__ZN3mup10ValueCache10ReleaseAllEv__ZN3mup10ValueCache14ReleaseToCacheEPNS_5ValueE__ZN3mup10ValueCache15CreateFromCacheEv__ZN3mup10ValueCacheC1Ei__ZN3mup10ValueCacheC2Ei__ZN3mup10ValueCacheD1Ev__ZN3mup10ValueCacheD2Ev__ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE8max_sizeEv__ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEED2Ev__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE11__vallocateEm__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEEC1EmRKS3___ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEEC2EmRKS3___ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEED1Ev__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEED2Ev___clang_call_terminate__ZN3mup11ParserErrorD1Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup12ErrorContextD2Ev__ZN3mup8Variable2AtERKNS_6IValueES3___ZN3mup8Variable2AtEii__ZN3mup8Variable4BindEPNS_6IValueE__ZN3mup8Variable6AssignERKS0___ZN3mup8Variable7AsValueEv__ZN3mup8Variable7SetBoolEb__ZN3mup8Variable8SetFloatEd__ZN3mup8Variable9SetStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup8VariableC1EPNS_6IValueE__ZN3mup8VariableC1ERKS0___ZN3mup8VariableC2EPNS_6IValueE__ZN3mup8VariableC2ERKS0___ZN3mup8VariableD0Ev__ZN3mup8VariableD1Ev__ZN3mup8VariableD2Ev__ZN3mup8VariableaSENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup8VariableaSERKNS_5ValueE__ZN3mup8VariableaSERKNS_6MatrixINS_5ValueEEE__ZN3mup8VariableaSERKNSt3__17complexIdEE__ZN3mup8VariableaSERKS0___ZN3mup8VariableaSEb__ZN3mup8VariableaSEd__ZN3mup8VariableaSEi__ZN3mup8VariablemIERKNS_6IValueE__ZN3mup8VariablemLERKNS_6IValueE__ZN3mup8VariablepLERKNS_6IValueE__ZNK3mup8Variable10GetComplexEv__ZNK3mup8Variable10GetIntegerEv__ZNK3mup8Variable10IsVariableEv__ZNK3mup8Variable5CloneEv__ZNK3mup8Variable6GetPtrEv__ZNK3mup8Variable7GetBoolEv__ZNK3mup8Variable7GetColsEv__ZNK3mup8Variable7GetImagEv__ZNK3mup8Variable7GetRowsEv__ZNK3mup8Variable7GetTypeEv__ZNK3mup8Variable8GetArrayEv__ZNK3mup8Variable8GetFloatEv__ZNK3mup8Variable9AsciiDumpEv__ZNK3mup8Variable9GetStringEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTIN3mup11ParserErrorE__ZTIN3mup8VariableE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSN3mup11ParserErrorE__ZTSN3mup8VariableE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVN3mup8VariableE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev___clang_call_terminate#1/20 1573634229 501 20 100644 68164 ` mpError.cpp.o h __text__TEXT+G__StaticInit__TEXT0GK8K __gcc_except_tab__TEXT|G`K__common__DATA__cstring__TEXTIwM__const__DATA`JhNH=__const__TEXTMQ__mod_init_func__DATAMQ0 __compact_unwind__LDMQ8 __eh_frame__TEXTPhP"Xl h2  H$L PNMUHHH}H}H]DUHH HHHp HHH}HHMHHMHHHHHHEMH}HHH ]H} f.DUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}HH]fUHHH}H}HH]fUHHH}H}*HHuHHHHH]fUHH HH HuUH}HHEHH}HHUH}HHEH ]UHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH@H}uUH}HH}HMHEHEHHHuHEH0HMHEȉHH@L@M@PMHTH@]ÉHEMH}H} f.UHHH}uUH}uUH]fUHHPDEDEH}uUDUEH}IH}HMDEL]HMHHHuHEH0HMHEHHUPLUPMMHPMHTHP]ÉHEMH}H} UHH0DEDEH}uUDUEH}uUEDUDMDDEEEDMED]D$H0]f.DUHH`H}H}HHMH}HHMHEH}ȉHMH}H}HXH}H}HpH}HEHEHMHH`]ÉHE؉MH}HE؉MH}H}H} f.UHHH}H}H]DUHHH}H}H]DUHHpH}HuHuHHEH}HHuHEH}ΉHMH}H}HXHuH}HEHpHEHEHEHMHHp]ÉHEЉMH})HEЉMHEЉMH}H}H} f.UHHH}HuH}HuH]f.UHHpH}HuHuHHEH}HHuHHEHXHHEHEHpHEHEHEHMHHUHrpH}WHH}HEHXHHuH}HEHp]ÉHEMH}H}H} f.DUHHH}HuH}HuH]f.UHH0H}HuHuH}H}HHEHuHHEH0]UHHH}HuH}HuH]f.UHHPH}HuHuHHEH}HHuHHEHXHuHXHHEHEHpHEHEHEHMHHP]ÉHEMHEMH}H}H} fUHHH}HuH}HuH]f.UHH0H}HuHuH;uHu HEHE8HEHXHMHXHHHuH}HEHMHMHEHEH0]f.DUHHPH}HuHuH}H}HHEHuHHuHH}HH}HHuHEHuH0H}H0H}HHuHEHuH~HHMHyHHvPHqPHEHHP]@UHHH}HuHUHMH}HEHEH}HuHUHEHuHEHUH)H}HUHHMHEH}NHEMH}VHuH}HEHEH}HEH}HH}aH}HuH}HĀ]H} UHH@H}HuHUHUHHUH}HEH}HEHMH}HEHMH}HuHUHMIH@]f.DUHH H}HuH}HuH}HH}HEH}HuHH ]fUHHH}H}H]DUHH0H}HuHuHHuH}HEH}HH}H}HEH}HH0]f.DUHHH}HuHUMH}HHHHuHHuHUHHHHHHHHHHHHĀ]ÉHHHHH f.UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHHHHuHuHHEHEH]fDUHHH5H}H}H}HuHƀHH]UHHH}HuHUEH}HHHHuHHuHUHHHHHHHHHHHHĀ]ÉHHHHH UHH@H}EH}HuH]@UHHH}H}HHXH58HpHHuHHhH`H}ΉH`HpHuH}HXH}Hİ]ÉHE|H}H} fDUHHH}HuH}HuH]f.UHHPH}HuHuH}H}HHEHuHHuHH}HH}HHuHEHuH0H}H0H}HHuHEHuH~HHMHyHHvPHqPHEHHP]@UHH}HE]fUHHHHuHuEHHXH0H(HH H57H}HUH(H0H(H}H56H}H(HHUH(H0HH}H56H}H(HTHUHH0H}H5d6H}H(HPHUHH0H}H5*6HhH(HLHhHH0HhH55HPH(HMHPHH0HPH55H8H(H0H8H(H0HH8EEHEЉMHEЉMH}HEЉMH}HEЉMH}HEЉMH}jHEЉMHhPHEЉMHP6HEЉMH8H0H H]H0H} fDUHHH}HuH}HuH]f.UHH}HE]fUHH}H}GT]f.DUHH}H}HH]f.UHH}H}GH]f.DUHHH}H}HH0H}HHEHHH}H]f.@UHH@H}HuHuHHEH}HHuHHEHHuHHHEHEH0HMH0HHHEHHHHUHJHH@PHBPH@]ÉHEMHEMH}H}H} f.DUHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQH ]f.UHH}HE]fUHH}H}H]f.DUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHH0H}HuHuHHuH}H}HEHuH>H8H~HxH~HxHuH}H}H0]@UHH H}H}H}H}QH}H}HEH}HEHH}HuH1ɉH}1ɉH}H ]f.UHH H}HuH}HuH ]f.UHH H}H}H}H}+H}EHHu1ɉH}&H}EHHu1ɉH}H ]HHUfUHH H}HuHUH}HuHUH ]DUHHH}H}H]DUHHH}H}H@H]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuH@EMH ]f.@UHH}]fDUHH}HuHuHu]fDUHH H}HuH}HuHuHuHpH ]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuH}HuH}HHH}HEHEH0]f.UHH}HE]fUHHPH}HuHUHMLEHMH;M HEH} HEHE{HEHMHHHMHHMHuHHH}HHHHMHEHEHEHMHUHUH9 HEHEHMH)HEHEHP]HHUUHH@H}HuHUHMHMHUH)HMH} HEHEHEHMH)HEHEH;E HEHEHEMHEHMH)HEHEH;E HEHEpH}HEH+EHHHUHEH} HEHE8H}HuHU HEHEHEHHEfHEH@]f.UHH0H}HuHUH} HE)H}HEH}؉HUH}؉HEHEH0]ÐUHH H}HuHUH} EH}HuHUEEH ]UHH0H}HuH}H0HuHpHuH@HEH}HuH8H>HxH~H@HFH}HuH8H>HxH~H@HFH0]@UHH H}HuH}HuH ]f.UHH}HE]fUHH}Hu]fUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H= HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]UHHHH HHHEH]f.DUH] 33zCn2 x>W G SZ+f oW/_ u ~e JJ5R>> zW `N XQTCC=!oUUYFF=!o JJcW[>>S>> _ jW   -    / r UU `[  G+9 C1& )A 3$ " E ##_B:$EXPR$$IDENT$$POS$$ARG$$TYPE1$$TYPE2$$HINT$allocator::allocate(size_t n) 'n' exceeds maximum supported sizep@@h@h@ppNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE0G1 A|GepGip  AG'AGpaAGAG#AG# 9`#AG@ #p q  AH q G`  a AHA(H *P9A@H,AXH#p*AlH#0PBAHpi (PpC(0WZ AH""#"##0#P#p#2#*#$"0$@p$$O$1%0%'`%%%%%%&&  &@&L&$&&%'Vp'O''#(u("(($)M`)())))* *5`*p**9AH*+OP+1+$++ +, ,l, -#P-A I-+ .@.`.2.2. .//@/'p///;AI/0 0@0C00A,I12_3HP3|3#44 47`4A?P>OA`I>ApI@@9AIC#0CPCgCC!D0D7pD,D&D<EQAIpEEE|AI0F"`F+F$FGGpG zRx $1AC $DhAC zPLRx ,$@AC $ЗAC $ȗeAC $ AC $4AC $\GAC $(iAC $pAC $h AC $PAC $$H AC $L0AC , (AC $'AC ,dgAC $ aAC ,hAC $TAC $|AC ,<AC $#AC ,sAC $,p#AC $Tx9AC $|#AC ,<AC $#AC $ qAC $$xAC ,OAC $|qAC $GAC $@AC $8aAC ,AC ,pwAC $|P*AC $X9AC ,dpAC $`,AC ,hAC $T#AC $|AC $xAC ,d`*;AC $`#AC $$hAC $LPAC $tHAC $@AC $8BAC ,`{AC $ iAC $D HAC $l @AC $ 8(AC $ @AC $ 8AC $ 0AC $4 (CAC $\ P(AC $ XWAC $ ZAC $ ȩ AC $ AC , 8[AC $T AC $| #AC $ #AC $ AC $ AC $ AC $D خ2AC $l *AC $ AC $ "AC $ @AC $ AC $4 OAC $\ 1AC $ 8AC $ 0'AC $ 8AC $ 0AC $$AC $LAC $tAC $AC $AC $Ю AC $AC $<LAC $dخ$AC $AC $خ%AC $VAC $OAC $,@AC $T8#AC $|@uAC $"AC $AC $$AC $MAC $Dȯ(AC $lЯAC $ȯAC $AC $AC $ AC $45AC $\AC $AC ,D9AC $AC $OAC $,Я1AC $T$AC $|AC $ AC $ЯAC $ȯAC $lAC $DAC $l`#AC ,,hAC $ذ+AC $AC $ذAC $<а2AC $d2AC $ AC $AC $/AC $'AC $,AC $TAC ,а;;AC $AC $ذAC $аAC $$ȰCAC $LAC , ذSAC $AC $_AC $HAC $|AC $D8#AC $l@AC $(AC $7AC ,|(AC $!AC $<AC $dUAC $+AC $KAC $ UAC $X+AC $,`AC $TX3AC $|p#AC $xAC $pAC $hAC $`CAC $D#AC $l2AC $CAC $жAC $#AC $ #AC $4ȶ/AC $\жeAC $'AC $ /AC $(AC $ AC $$AC $LAC $tAC $[AC ,\8d'AC $xAC $p#AC $Dx?AC ,OAC ,4oAC $AC ,x9KAC $$#AC $LAC $tgAC $лAC $Ȼ!AC $лAC $ Ȼ7AC $< ,AC $d &AC $ <AC ,L QAC $ 8AC $ !0AC , (|3AC $d!x"AC $!+AC $!$AC $!GAC $"AC $," AC !GG-F-F-FT-F&-HF-;F"=&F-F#-E#-E-E-E-E-]E-7E-E-DT-D-C-C-vC-eC-C-B-B-B-;B -&B -A-A-A-jA-A-@-@-l@?-Y@->@?-4@$-@>-@-?-?-?-q?-?->->->->->U-{>-:>1=3>-=-=;-=-=@-=A-===-=w=-d=<-A=-*=-%==-<-<-=<- <-;-i;-a;|-9;-;-:-:-:X-x:-J:-*:e-:a- :-9-9 -9-9f-9b-9-9-u9-99- 9-8-8-8-Y8~-)8}-7|-7{-7y-7z-7y-}7;-p73-L7z-77y-74- 70-60-6 -u6=n6 -76-#6%-5x-W5/=75w-5- 5-4u-4t-B40=;4s-3r-3q-3q-e3q-83E-2D-2-a2-42-|1-$1-u0 -h0o-`0 -0n-/:-/-/l-/k-]/j-Q/--/-.-.-Q.-1.i-.h----b----f--e----_-s-E-e-d-9-c- -b-,a-,`-,<-,_-, -,E-,^-,U-y,]-R,-E,-<,\-,[-+Z-+F-w+Y-k+X-+-*(-*>-*W-*-*U-*T-*S-)R-)Q-)--)P-(H-(H-(H-u(-=(-'O-'N-'M-'E-;'L-%'E-& -n&-\&-R&-%K-q%J-M%I-A%H-!%H-$H-$G-$F-$E-W$F-"D-"C-"B-y"-i"@-U"5-#"-!?-!0-!?-!-!>-}!4-o!>-]!7-2!-!- =- <- - 4-h 4-V 0-E - 6- 0-3-2----|2-m-e5-I2-93-- 2---5-2-3--x-`2-S3-?0-&0---2-;-2-5-2-u3-S;-,0-0-:-v1-i8-S7-=6-*4-5-3-3-1-0-k1-Q2-&1-1-4-0-3-2--1-1-0-l0-:--!- -=--b->:-5-----[-R -I - - - - - -o -.-- - -n -T -: -  -  - - - --j,-^W -F- ,-  --,- --,- -u-S,-JC -5- ,- --,- -C----- -m -d-T-?-& - *---- -R-F -5-#--"-'-l-[=<--'--='-={&-h=9=2%- - - - - - -l #-4 -% "- !- - - - - -q -M -= -0 - - - - - - -u -l -O -5 -# - - - -c -? - - - -Y -8 -/ -& -- --y-K- --- - ---_-N -:---- - -j-T -? -1- ----- -w -K-: -) -- --g-^ -$ - - ---v -? -* - --- -[-L-D8 -%------[ -O -4 - ----:---z-k_-I;-3-+-E-$=-B ,.xph`XPH@980( +.67**45)ph`)@8890+23++ph`H@8 `@ CxpC`@ `@ CCC`@80C `@ `@ `@ `XPC@ `@80C xpC`@ `@ C`@ xpC`@     ` @       ` @       ` @       ` @       ` @   xpC`@ `@ C`@ C`XPC@ CCC`@ CxpC`@ CC`XPC@ CC`@ `XPC@ {CM 0G);psK|GC))*E< *p!*KGJG)JGKG6 `KGH ,bJGM# 7 ` 5 KH"p':0 +T3P3 .'83( JH 4C`4) 5OJ(HK@H/KXHe0JlH0FMKH"$" #T 0#>P#`8p#j#7#c+$$(%%'$&&'8'1(882 92:; ;P;%;'$;. <K@:3:?P<<p<!<<<<<;/P=!=0=JPI0>K`I@BC0C PCTC'CKpI D&0Dt-pD2'D9KIIBE1E'F.-DpE%KIfE@0F1`FuJI pG*>`wHh>@ #>H+>=p G)pI>DG) >U&P== A @ h4A4 -n* z0X p >6e) &1&,&-&&;2/./G#3+@&4P9N'0*+M {:@51  P0p#>L.BK}A0KALFL%FPLF`MEMEJoFhLGE`J^PPpb,*z,=? >A0p",#~!a/,R17?W7)];.+D6@Z:&%x&eA!m'^TDDtDE ]??ED zleR!! >,Q,4!G,K ! J!__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZN3mup11ParserError10GetContextEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__110unique_ptrIN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEEptEv__ZN3mup25ParserMessageProviderBase4InitEv__ZN3mup11ParserError5ResetEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup25ParserMessageProviderBaseEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup25ParserMessageProviderBaseELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup25ParserMessageProviderBaseELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEE3getEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE26__invalidate_all_iteratorsEv__ZNK3mup11ParserError6GetPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNK3mup11ParserError7GetExprEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5clearEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNK3mup11ParserError8GetTokenEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__clear_and_shrinkEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNKSt3__18ios_base5widthEv__ZNK3mup11ParserError6GetMsgEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup11ParserError7GetCodeEv__ZNKSt3__110unique_ptrIN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEEdeEv__ZN3mup14ParserErrorMsg8InstanceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEE6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12ErrorContextD2Ev__ZN3mup14ParserErrorMsgD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__110unique_ptrIN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEED2Ev__ZN3mup11ParserErrorC2Ev__ZN3mup14ParserErrorMsgC2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup14ParserErrorMsgD1Ev__ZNSt3__16localeD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__110unique_ptrIN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEED1Ev__ZN3mup11ParserErrorC1Ev__ZN3mup28ParserMessageProviderEnglishC1Ev__ZN3mup14ParserErrorMsgC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev___cxa_atexit___cxx_global_var_init_memset__ZTVSt12length_error__ZTISt12length_error_memchr__GLOBAL__sub_I_mpError.cpp_memcmp___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5_mm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__116allocator_traitsINS_9allocatorIcEEE10deallocateERS2_Pcm__ZNSt3__19allocatorIcE10deallocateEPcm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcm__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findERKS5_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup12ErrorContextC2ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZNK3mup11ParserError16ReplaceSubStringERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_i__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNK3mup11ParserError16ReplaceSubStringERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_c__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__1L4swapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS9_EE5valueEvE4typeERS9_SC___ZNK3mup11ParserError16ReplaceSubStringERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKS7_SA___ZNSt3__1L4moveIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repEEEONS_16remove_referenceIT_E4typeEOSA___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__118__search_substringIcNS_11char_traitsIcEEEEPKT_S5_S5_S5_S5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4swapERS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5___ZNSt3__1L4moveIRNS_9allocatorIcEEEEONS_16remove_referenceIT_E4typeEOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__1L16__swap_allocatorINS_9allocatorIcEEEEvRT_S4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L10__str_findIcmNS_11char_traitsIcEELm18446744073709551615EEET0_PKT_S3_S6_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__110unique_ptrIN3mup25ParserMessageProviderBaseENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup25ParserMessageProviderBaseEEclEPS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZN3mup12ErrorContextaSEOS0___ZN3mup12ErrorContextaSERKS0___ZN3mup11ParserErroraSERKS0___ZN3mup12ErrorContextC2ERKS0___ZN3mup11ParserErrorC2ERKS0___ZN3mup12ErrorContextC1ERKS0___ZN3mup11ParserErrorC1ERKS0___ZN3mup11ParserErrorC2ERKNS_12ErrorContextE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZNK3mup14ParserErrorMsg11GetErrorMsgENS_11EErrorCodesE__ZNK3mup25ParserMessageProviderBase11GetErrorMsgENS_11EErrorCodesE__ZTVN10__cxxabiv120__si_class_type_infoE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZTVNSt3__18ios_baseE__ZN3mup14ParserErrorMsg5ResetEPNS_25ParserMessageProviderBaseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup14ParserErrorMsg11m_pInstanceE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC2ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup11ParserErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__move_assignERS5_NS_17integral_constantIbLb1EEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5_NS_17integral_constantIbLb1EEE__ZNSt3__1L16__swap_allocatorINS_9allocatorIcEEEEvRT_S4_NS_17integral_constantIbLb0EEEGCC_except_table128GCC_except_table18GCC_except_table67GCC_except_table37GCC_except_table27GCC_except_table207GCC_except_table186GCC_except_table46GCC_except_table146GCC_except_table36GCC_except_table16GCC_except_table155GCC_except_table115GCC_except_table14GCC_except_table204GCC_except_table193GCC_except_table53GCC_except_table23GCC_except_table2GCC_except_table42GCC_except_table191GCC_except_table31GCC_except_table21___gxx_personality_v0GCC_except_table190GCC_except_table40GCC_except_table140 #1/28 1573634229 501 20 100644 66788 ` mpFuncCmplx.cpp.o pp __text__TEXTI(__gcc_except_tab__TEXTI0TM__literal16__TEXTJN__literal8__TEXTK8O__cstring__TEXTLO__const__DATAQ Up0__const__TEXT\TH`__compact_unwind__LD^b__eh_frame__TEXTz#~ h2   I' P'',UHHH}H}HH}HǾ HKHHHUHH]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHH@H}HuHUMH}HHEEH}EHHER`HEH@]@UHH}H}H?H]f.fUHHH}H}H?4H}H=PH5PH :PHEHHH]fUHH}HNJ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HIHHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHEEH}EHHER`HEH@]@UHH}HH]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HcHHHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHH}EHHfH~HH1fHnH}EH}HHHuRxHEH@]DUHH H}EMH}EMH ]ÐUHH}HOG]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HFHHHUHH]UHHH}H}H]DUHHPH}HuHUMH}HHH}EHHH}ME(MH}H}EHHER`HEHP]UHH H}H}H}EME(MH ]UHH}HE]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H$EHHHUHH]UHHH}H}H]DUHHPH}HuHUMH}HHH}EHHH}ME(MH}H}EHHER`HEHP]UHH0H}H}H}EH}H}ESH}H}EMYH}MH}EMYEXEEH0]UHH}HpC]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HCHHHUHH]UHHH}H}H]DUHHH}HuHUMH}HOH}H8H}HHEH}EH8H}HEHEP`HEH}H8H}HHEH}EH8H}HHEH}ME(MH}EMH}H8HxHHuHxPxHpHĐ]UHHH}H}HEMfE EiME$H]UHH@H}H}( 4>fH}EH}H}ME(MH}EMEMH@]UHH}H[A]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H@HHHUHH]UHHH}H}H]DUHHH}HuHUMH}HOH}H8H}HHEH}EH8H}HEHEP`HEH}H8H}HHEH}EH8H}HHEH}ME(MH}EMH}H8HxHHuHxPxHpHĐ]UHHH}H}f( p;fH})MEH}H}ME(MH}EMH}H}H}E(MfH}UE(MEMHĀ]UHH}Hl>]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H=HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHHPH}H}:H}$H} M9H}H}Wf.HBH},H} 8H}E(M9H}Wf.NHH}Wf.2,H} 8H}E(MH}Wf.XRH}<H}H}EH}ME(MgH}H}EMYH}MH}EMYH}EEMHP]UHH}H:]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H:HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHH0H}H}5H}H} 5H}H}Wf.;5H}H} 15H}H}Wf.4.H}HEHHMH@HEgH}H}EMYH}MH}EMYH}EEMH0]fUHH}H7]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H"7HHHUHH]UHHH}H}H]DUHHH}HuHUMH}HOH}H8H}HHEH}EH8H}HEHEP`HEH}H8H}HHEH}EH8H}HHEH}ME(MH}EMH}H8HxHHuHxPxHpHĐ]UHHH}H}f( @1fH})MEH}H}ME(MH}EMH}H}H}E(MfH}UE(MEMHĀ]UHH}H4]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H44HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHH`H}H}H}C/H}WH} !/ /Y(M( Y.fH}ME(MH}4H}Wf.HEHHMH@HE>H} m.YMH} S.YMEME(MXMEEE~Eg- --]W((fTfUfVM((fTfUfVH}((<E^EME(^EH}ME(MEMH`]UHH}H0]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H[0HHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHHEMH}HHHuRxHEH@]fUHH`H}H},H} +H}E(M|H}H}Wf.zH}H}EH}EH}( @*fEEH}ME(MH}H}E WEEH}EH}E( )fM()ffH}ECH}QEH} *^EH}HuEMEMH`]ÐUHH}H-]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H-HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHH@H}H}EH}H}Wf.$E 'EtEWf. E@E ['EH}MH}TH}4H}Wf.HEHHMH@HEkH}EEME(MYEUE(MMYH}EEMH@]f.@UHH}Hc*]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H)HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHH0H}H}H}EH}ME(MEMH0]f.UHH}Hw(]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H'HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHH}H&]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H_&HHHUHH]UHHH}H}H]DUHH`H}HuHUMH}HHH}EHHH}ME(MH}EMH}HHHuRxHEH`]f.fUHH0H}H}EMq EH}HuEMEMH0]UHH}H %]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ Hz$HHHUHH]UHHH}H}H]DUHHH}HuHUMH}HHH}EHHH}ME(MH}EMUH}HuEMmEH}HuEMH}HHHuRxHxHĐ]fDUHH0H}HuH}Hu^H}EHu^H}ME(MEMH0]fDUHH0H}HuHuH>HvHuH}HuH}EMHEH0]UHH}Hv"]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H!HHHUHH]UHHH}H}H]DUHHPH}HuHUMH}HHH}EHHMYH}MHHH}EHHMYEXQEEH}EHHER`HEHP]UHH}H ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H HHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHHUHHHEHHH}HEMH}HHHuRxHEH@]f.@UHHPH}HuH}HuH}HEMHuH}EMH}EMEMHP]UHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH}EMH}EEG]DUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}H}G]f.UHH}H}]f.@UH  EE(3 ff. $]f.fUHEE( f]DUH EE( ff.$]ÐUHEEf.$]@UHHPH}HuHuHE ) H}EMHEVHEHEHEH}7HEHEH}HEXHE e HEH}G H}EMHEHEE(MYMEWEHEHEE(MYMEWEEMH}EMHP]UHH H}H}H}EME(MH ]UHHEE$H]f.@UHEEEEEHEH?ME]DPH$UHH}EH}EYEYGGH]f.@UHHH}HuH}EH}EH}EH}EEYEEEYEEEYEEEYEEE\EEEXEEE*EEEE(EfWMx ExxM(f(ffEEWphphhM(f(!ffEEE( fEEE( fEEEE.EW`X`XXM(.f(3ffEEWPHPHHM(f(ffEEE( fEEE( ^fEEEE;E)EEEE( fEEE( fEEE( fEEE( SfEEEMMYMUYU\(YUMYMUYUXYEEMH}EMH] &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=,?@?@?$@@??realreal(x) - Returns the real part of the complex number x.imagimag(x) - Returns the imaginary part of the complex number x.conjconj(x) - Returns the complex conjugate of the complex number x.argarg(x) - Returns the phase angle (or angular component) of the complex number x, expressed in radians.normnorm(x) - Returns the norm value of the complex number x. The norm value of a complex number is the squared magnitude, defined as the addition of the square of both the real part and the imaginary part (without the imaginary unit). This is the square of abs (x).coscos(x) - Returns the cosine of the number x.sinsin(x) - Returns the sine of the number x.coshcosh(x) - Returns the hyperbolic cosine of the number x.sinhsinh(x) - Returns the hyperbolic sine of the complex number x.tantan(x) - Returns the tangens of the number x.tanhtanh(x) - Returns the hyperbolic tangent of the complex number x.sqrtsqrt(x) - Returns the square root of x.expexp(x) - Returns the base-e exponential of the complex number x.lnln(x) - Returns the natural (base-e) logarithm of the complex number x.loglog(x) - Common logarithm of x, for values of x greater than zero.log10log10(x) - Common logarithm of x, for values of x greater than zero.log2log2(x) - Logarithm to base 2 of x, for values of x greater than zero.absabs(x) - Returns the absolute value of x.powpox(x, y) - Raise x to the power of y.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup12FunCmplxRealEN3mup12FunCmplxImagEN3mup12FunCmplxConjEN3mup11FunCmplxArgEN3mup12FunCmplxNormEN3mup11FunCmplxCosEN3mup11FunCmplxSinEN3mup12FunCmplxCosHEN3mup12FunCmplxSinHEN3mup11FunCmplxTanEN3mup12FunCmplxTanHEN3mup12FunCmplxSqrtEN3mup11FunCmplxExpEN3mup10FunCmplxLnEN3mup11FunCmplxLogEN3mup13FunCmplxLog10EN3mup12FunCmplxLog2EN3mup11FunCmplxAbsEN3mup11FunCmplxPowEHPp(\@`^iAIP#H\PpiAI#H`/@`iAI#HPp@@`iAI#HPp   iAI` # H  (0 I p  iAI # H (P0iAI#H @iA J#H n0PiAJ#H@`(PpiA,J#H` HpiA?`>>>>>? ?@?`?????@ @@@`@@@@@4 A@A/pAAC@C"D;PD2D zRx $HAC $D@AC $l8AC $0AC $((AC $0\AC $ hAC $4`^AC $\AC zPLRx ,$piAC $#AC $HAC $$AC $L؅\AC $tAC ,i3AC $H#AC $PHAC $xAC $DpAC $l؆/AC $AC ,<؆i#AC $#AC $ HAC $<HAC $d@AC $@AC $AC ,\iAC $ #AC $4HAC $\(AC $ AC $AC $0AC ,|(iAC $,h#AC $TpHAC $|AC $(AC $IAC $pAC $AC ,iAC $t@#AC $HHAC $pAC $h(AC $pAC $<AC ,iAC $@#AC $HHAC $pAC $ hAC $4 AC $\ ȏAC ,iAC $ #AC $ HAC $ 0AC $, (AC $T nAC $| AC ,$ iAC $ #AC $ (HAC $$ PAC $L H(AC $t PAC $ AC ,D iAC $ #AC $ (HAC $D PAC $l HAC $ HAC $ AC ,d i{AC $ #AC $< (HAC $d PAC $ H^AC $ AC $ 8AC , 0ikAC $4p#AC $\xHAC $AC $AC $AC $AC , i[AC $T#AC $|HAC $AC $AC $SAC $AC ,iKAC $t#AC $HAC $ AC $AC $AC ,icAC $lȝ#AC $НHAC $AC $AC $ hXAC $4AC ,iSAC $؞#AC $HAC $AC $AC $,ȟjAC $THAC $|8AC ,$0iAC $p#AC $xHAC $$AC $LAC $t@AC ,8i3AC $x#AC $HAC $AC $DAC $lhAC $PAC ,<Hi#AC $#AC $AC $<(AC $dAC $(AC $AC $(AC $AC $,(AC $TAC $|(AC $AC $(AC $AC $(AC $DAC $l(AC $AC $(AC $AC $ (AC $4AC $\(AC $AC $(AC $AC $(AC $$AC $L(AC $tAC $(AC $AC $(AC $AC $<(AC $dAC $(AC $?AC $SAC $?AC $,+AC $T?AC $|?AC $0?AC $H?AC $`?AC $x?AC $D?AC $l?AC $?AC $أ?AC $?AC $ ?AC $4 ?AC $\8?AC $P?AC $h?AC $?AC $AC $$AC $LAC $tAC $xAC $pAC $hAC $ `AC $< XAC $d PAC $ HAC $ @AC $ 8AC $!0AC $,!(AC $T! AC $|!AC $!AC $!AC $!AC $"4AC $D"AC $l"/AC $"AC $"AC $"@AC $ #"AC $4#;AC $\#(2AC $#@ AC I-(I IH-HH-HH-HlH-UH -CH -1H -H -GG-GG-GGXGPG -9G.GFF -F -F -FF-{FbF-KF@FFE -EEEE -E -mE -RE-;E-D-D-D-D-KD7-BD>-C&-CD-C-C-tC-LC-4CF-C-BA-B-BB-BB -hB -VB-8B-B -A-A-AA%-A-YAHA1A@@@4-q@4-Q@4-1@4-@4-?4-?4-?4-?4-q?4-Q?4-1?4-?4->4->4->4->4-q>4-J>C>- >>-=$=-=*=-J=C=- ==-<<-<(<-J<)C<- < <-;';-;";-J;C;- ;;-:%:-::-J:!C:-9#9-z9:=s90-:9&39-8;-8]-8^-8;-85-86-^8;-U8-18-8;-8-7-7;-7U-7V-n7;-e7--A7.-7;-7M-6N-6;-6-6-~6;-u6-Q6-.6;-%6m-6n-5;-5-5-5;-5}-a5~->5;-55e-5f-4;-4E-4F-4;-4-q4-N4;-E4=-!4>-3;-3u-3v-3;-3-3-Y3Z-33,-*3;- 3X-2<-22-w2-`2-2-2#-1-1-1[-s1l13-b1)12-1,-0;-00-0<-0]0-#0- 0-/-/-/3-s/l/3-b/)/-/,-.;-.-.<-.`. -.---------t-E-o-]--A-9--0-- --,-,-,$,3-,I,-#,,-,;-+-+<-+z+-h+E-c+Q+-+-+-*-*-*-*-c**\*3-R**R-),-);-)P-)<-{)I)-6)--)-)-(-(S-((3-(I(*-#(,-(;-'(-'<-''-d'-V'E-Q'-'-'-&-&-&-&+-c&\&3-R&&J-%,-%;-%H-%<-{%N%-7%F-%A-$C-$-$-$-$-$-w$-i$T$ -B$-$$-#-# -#-#-#-v#-m#-F#-,#-#K-""3-""-c",-Z";-9"-"<-!!-!!-!-!-m!]!V!-H!-!-!-!- -  - - - - -s -] -X -J -4 , - - -----c(\3-R-,-;--<-{T-4F-- - -~G-fA-TB-A9-'-----F-{-m-aQ-L-6 -1------q-C)<3-2j-,-;-h-<-[2-------Y-F-=----H----Qk-# 3--,-;--l<-;-F--B--A--G----r-d-[S-B-=-!-- --- ----}-V-<--'3-z-s,-j;-Ix-,<--F--G--A--{B-v-h-M-? -:-)-$-------x-g-b-F-8-/' -"-- - -----v-\-1{-"3-b-,-;-i`-L<-------ld-------vF-]-G-?-c-  3-  B-s ,-j ;-I @-, <-  - - -  - - - - - -d -V A-= -' - - C-  3- y -S ,-J ;-) - <-  - - -w -d -_ -I -D -1 -, - - -- ----a-3%,3-":-,-;-8-|<-K6@--------a;-3,3-"r-,-;-p-|<-K5-----qs-C!<3-2-,-;--<-[0- --#3-i-C,-:;--<-=- --;---4-a-3&,3-" 8  9 8x p 9` 8X P 9@ 88 0 9 8  9 8  9 8  9 8  9 8  9 8x p 9` 8X P 9@ 88 0 9 8  9 898989898xp9`8XP9H@W8/0\(] .-2165//45.-2165xh`X/PH@.8-02(1 65/.-2165Ox/pThU`.X-P2H1@6850('/,-.-2165G/LM.x-p2h1`6X5PH80(/ .-2165/.-216x5phXPgH/@l8m0.(- 2165/.-2165xpwh/`|X}P.H-@28106(5 _/de.-2165?/DxEp.h-`2X1P6H5@8( /.-21657/<=.-2x1p6h5`XH@o8/0t(u .-2165/.-2165xh`X/PH@.8-02(1 65`@ `@ `@ `@ `@ `@ `@ `@ `@ `@ `@ ?`@ ?`@80? `@80?     ` X P ?@        ? ` @       ?  ` @      ?   ` @     ?    ` @    ? `@80? `XP?@ xp?`@ ?`@ ?`@ ?`@ ?`@ ?`@80? `@ ?M%I2&I}9&Ic$@@%I9$ @s A%I E&I&I/@A% J&J&,J[pA%   ,: |4 4>#& "h<"7 6?u(* ( = `(7 7@1f@3O 1 >_@1G8W 8P@   ;  5 5?` @;6 5`?U `P :e M3] 3m>@  `; p5 P5 ? 9 3 p3`>,k/,'= `,@8  8(@@~pV`  P:/ 4' `4 >uP: P9J 2B ;p. - ; 5 5@?p"i  `<y0a6q 6j?lL ` < `6 @6 ?*0,+*F`=; 0*#73 7C @5P9''070`A@v  %Xp%)bp)7220ypPo`@pPM. ./  O P0V"!-pm+-+>0 `@#P6_l  ?AD![P\t"ZuZ ["[p\ Z P[("pZZ#[ #PZ%0\`!Z!0Z#0[)[#p[k%\ 0^^["\\0]^"P^^g P] ]"\@#p]"\%^F!]!\#]]#]P%p^ WPYB"0SCT W"XYN T U!R&#T"PR$X,!Sz!Qt#`UV#@V5%pXK@Dc$oVe!$ !hP3&&F'K?F^-c__ZSt9terminatev__ZdlPv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup9ICallback9AsciiDumpEv__ZNKSt3__17complexIdE4realEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__17complexIdE4imagEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup11FunCmplxPow5CloneEv__ZNK3mup12FunCmplxSqrt5CloneEv__ZNK3mup11FunCmplxCos5CloneEv__ZNK3mup11FunCmplxAbs5CloneEv__ZNK3mup11FunCmplxExp5CloneEv__ZNK3mup11FunCmplxSin5CloneEv__ZNK3mup11FunCmplxTan5CloneEv__ZNK3mup10FunCmplxLn5CloneEv__ZNK3mup12FunCmplxNorm5CloneEv__ZNK3mup12FunCmplxReal5CloneEv__ZNK3mup12FunCmplxConj5CloneEv__ZNK3mup11FunCmplxArg5CloneEv__ZNK3mup11FunCmplxLog5CloneEv__ZNK3mup12FunCmplxImag5CloneEv__ZNK3mup12FunCmplxCosH5CloneEv__ZNK3mup12FunCmplxSinH5CloneEv__ZNK3mup12FunCmplxTanH5CloneEv__ZNK3mup12FunCmplxLog25CloneEv__ZNK3mup13FunCmplxLog105CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNK3mup11FunCmplxPow7GetDescEv__ZNK3mup12FunCmplxSqrt7GetDescEv__ZNK3mup11FunCmplxCos7GetDescEv__ZNK3mup11FunCmplxAbs7GetDescEv__ZNK3mup11FunCmplxExp7GetDescEv__ZNK3mup11FunCmplxSin7GetDescEv__ZNK3mup11FunCmplxTan7GetDescEv__ZNK3mup10FunCmplxLn7GetDescEv__ZNK3mup12FunCmplxNorm7GetDescEv__ZNK3mup12FunCmplxReal7GetDescEv__ZNK3mup12FunCmplxConj7GetDescEv__ZNK3mup11FunCmplxArg7GetDescEv__ZNK3mup11FunCmplxLog7GetDescEv__ZNK3mup12FunCmplxImag7GetDescEv__ZNK3mup12FunCmplxCosH7GetDescEv__ZNK3mup12FunCmplxSinH7GetDescEv__ZNK3mup12FunCmplxTanH7GetDescEv__ZNK3mup12FunCmplxLog27GetDescEv__ZNK3mup13FunCmplxLog107GetDescEv__ZN3mup11FunCmplxPowD2Ev__ZN3mup12FunCmplxSqrtD2Ev__ZN3mup11FunCmplxCosD2Ev__ZN3mup11FunCmplxAbsD2Ev__ZN3mup11FunCmplxExpD2Ev__ZN3mup11FunCmplxSinD2Ev__ZN3mup11FunCmplxTanD2Ev__ZN3mup10FunCmplxLnD2Ev__ZN3mup12FunCmplxNormD2Ev__ZN3mup12FunCmplxRealD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup12FunCmplxConjD2Ev__ZN3mup11FunCmplxArgD2Ev__ZN3mup11FunCmplxLogD2Ev__ZN3mup12FunCmplxImagD2Ev__ZN3mup12FunCmplxCosHD2Ev__ZN3mup12FunCmplxSinHD2Ev__ZN3mup12FunCmplxTanHD2Ev__ZN3mup12FunCmplxLog2D2Ev__ZN3mup13FunCmplxLog10D2Ev__ZN3mup11FunCmplxPowC2Ev__ZN3mup12FunCmplxSqrtC2Ev__ZN3mup11FunCmplxCosC2Ev__ZN3mup11FunCmplxAbsC2Ev__ZN3mup11FunCmplxExpC2Ev__ZN3mup11FunCmplxSinC2Ev__ZN3mup11FunCmplxTanC2Ev__ZN3mup10FunCmplxLnC2Ev__ZN3mup12FunCmplxNormC2Ev__ZN3mup12FunCmplxRealC2Ev__ZN3mup12FunCmplxConjC2Ev__ZN3mup11FunCmplxArgC2Ev__ZN3mup11FunCmplxLogC2Ev__ZN3mup12FunCmplxImagC2Ev__ZN3mup12FunCmplxCosHC2Ev__ZN3mup12FunCmplxSinHC2Ev__ZN3mup12FunCmplxTanHC2Ev__ZN3mup12FunCmplxLog2C2Ev__ZN3mup13FunCmplxLog10C2Ev__ZN3mup11FunCmplxPowD1Ev__ZN3mup12FunCmplxSqrtD1Ev__ZN3mup11FunCmplxCosD1Ev__ZN3mup11FunCmplxAbsD1Ev__ZN3mup11FunCmplxExpD1Ev__ZN3mup11FunCmplxSinD1Ev__ZN3mup11FunCmplxTanD1Ev__ZN3mup10FunCmplxLnD1Ev__ZN3mup12FunCmplxNormD1Ev__ZN3mup12FunCmplxRealD1Ev__ZN3mup12FunCmplxConjD1Ev__ZN3mup11FunCmplxArgD1Ev__ZN3mup11FunCmplxLogD1Ev__ZN3mup12FunCmplxImagD1Ev__ZN3mup12FunCmplxCosHD1Ev__ZN3mup12FunCmplxSinHD1Ev__ZN3mup12FunCmplxTanHD1Ev__ZN3mup12FunCmplxLog2D1Ev__ZN3mup13FunCmplxLog10D1Ev__ZN3mup11FunCmplxPowC1Ev__ZN3mup12FunCmplxSqrtC1Ev__ZN3mup11FunCmplxCosC1Ev__ZN3mup11FunCmplxAbsC1Ev__ZN3mup11FunCmplxExpC1Ev__ZN3mup11FunCmplxSinC1Ev__ZN3mup11FunCmplxTanC1Ev__ZN3mup10FunCmplxLnC1Ev__ZN3mup12FunCmplxNormC1Ev__ZN3mup12FunCmplxRealC1Ev__ZN3mup12FunCmplxConjC1Ev__ZN3mup11FunCmplxArgC1Ev__ZN3mup11FunCmplxLogC1Ev__ZN3mup12FunCmplxImagC1Ev__ZN3mup12FunCmplxCosHC1Ev__ZN3mup12FunCmplxSinHC1Ev__ZN3mup12FunCmplxTanHC1Ev__ZN3mup12FunCmplxLog2C1Ev__ZN3mup13FunCmplxLog10C1Ev__ZN3mup11FunCmplxPowD0Ev__ZN3mup12FunCmplxSqrtD0Ev__ZN3mup11FunCmplxCosD0Ev__ZN3mup11FunCmplxAbsD0Ev__ZN3mup11FunCmplxExpD0Ev__ZN3mup11FunCmplxSinD0Ev__ZN3mup11FunCmplxTanD0Ev__ZN3mup10FunCmplxLnD0Ev__ZN3mup12FunCmplxNormD0Ev__ZN3mup12FunCmplxRealD0Ev__ZN3mup12FunCmplxConjD0Ev__ZN3mup11FunCmplxArgD0Ev__ZN3mup11FunCmplxLogD0Ev__ZN3mup12FunCmplxImagD0Ev__ZN3mup12FunCmplxCosHD0Ev__ZN3mup12FunCmplxSinHD0Ev__ZN3mup12FunCmplxTanHD0Ev__ZN3mup12FunCmplxLog2D0Ev__ZN3mup13FunCmplxLog10D0Ev_hypot_cos_exp___assert_rtn_sin_tan__Znwm__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup11FunCmplxPow4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxSqrt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxCos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxAbs4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxExp4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxSin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxTan4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup10FunCmplxLn4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxNorm4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxReal4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxConj4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxArg4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunCmplxLog4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxImag4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxCosH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxSinH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxTanH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunCmplxLog24EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunCmplxLog104EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i_cosh_sinh___cxa_begin_catch_log___clang_call_terminate__Unwind_Resume__ZL3absd__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__17complexIdEmLEd__ZL16__libcpp_signbitIdEbT___ZNSt3__1L3powIdEENS_7complexIT_EERKS3_S5___ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZNSt3__15polarIdEENS_7complexIT_EERKS2_S5___ZNSt3__14sqrtIdEENS_7complexIT_EERKS3___ZNSt3__1L3cosIdEENS_7complexIT_EERKS3___ZNSt3__13expIdEENS_7complexIT_EERKS3___ZNSt3__13sinIdEENS_7complexIT_EERKS3___ZNSt3__13tanIdEENS_7complexIT_EERKS3___ZNSt3__14coshIdEENS_7complexIT_EERKS3___ZNSt3__14sinhIdEENS_7complexIT_EERKS3___ZNSt3__14tanhIdEENS_7complexIT_EERKS3___ZNSt3__1L3logIdEENS_7complexIT_EERKS3___ZNSt3__1L5log10IdEENS_7complexIT_EERKS3___ZNSt3__1dvIdEENS_7complexIT_EERKS3_RKS2___ZNSt3__1mlIdEENS_7complexIT_EERKS3_RKS2___ZNSt3__1L25__libcpp_isnan_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L25__libcpp_isinf_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L28__libcpp_isfinite_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZL7signbitIdENSt3__19enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZN3mup11FunCmplxPowC2ERKS0___ZN3mup12FunCmplxSqrtC2ERKS0___ZN3mup11FunCmplxCosC2ERKS0___ZN3mup11FunCmplxAbsC2ERKS0___ZN3mup11FunCmplxExpC2ERKS0___ZN3mup11FunCmplxSinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup11FunCmplxTanC2ERKS0___ZN3mup10FunCmplxLnC2ERKS0___ZN3mup12FunCmplxNormC2ERKS0___ZN3mup12FunCmplxRealC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup12FunCmplxConjC2ERKS0___ZN3mup11FunCmplxArgC2ERKS0___ZN3mup11FunCmplxLogC2ERKS0___ZN3mup12FunCmplxImagC2ERKS0___ZN3mup12FunCmplxCosHC2ERKS0___ZN3mup12FunCmplxSinHC2ERKS0___ZN3mup12FunCmplxTanHC2ERKS0___ZN3mup12FunCmplxLog2C2ERKS0___ZN3mup13FunCmplxLog10C2ERKS0___ZN3mup11FunCmplxPowC1ERKS0___ZN3mup12FunCmplxSqrtC1ERKS0___ZN3mup11FunCmplxCosC1ERKS0___ZN3mup11FunCmplxAbsC1ERKS0___ZN3mup11FunCmplxExpC1ERKS0___ZN3mup11FunCmplxSinC1ERKS0___ZN3mup11FunCmplxTanC1ERKS0___ZN3mup10FunCmplxLnC1ERKS0___ZN3mup12FunCmplxNormC1ERKS0___ZN3mup12FunCmplxRealC1ERKS0___ZN3mup12FunCmplxConjC1ERKS0___ZN3mup11FunCmplxArgC1ERKS0___ZN3mup11FunCmplxLogC1ERKS0___ZN3mup12FunCmplxImagC1ERKS0___ZN3mup12FunCmplxCosHC1ERKS0___ZN3mup12FunCmplxSinHC1ERKS0___ZN3mup12FunCmplxTanHC1ERKS0___ZN3mup12FunCmplxLog2C1ERKS0___ZN3mup13FunCmplxLog10C1ERKS0___ZTVN3mup11FunCmplxPowE__ZTSN3mup11FunCmplxPowE__ZTIN3mup11FunCmplxPowE__ZTVN3mup12FunCmplxSqrtE__ZTSN3mup12FunCmplxSqrtE__ZTIN3mup12FunCmplxSqrtE__ZTVN3mup11FunCmplxCosE__ZTSN3mup11FunCmplxCosE__ZTIN3mup11FunCmplxCosE__ZTVN3mup11FunCmplxAbsE__ZTSN3mup11FunCmplxAbsE__ZTIN3mup11FunCmplxAbsE__ZTVN3mup11FunCmplxExpE__ZTSN3mup11FunCmplxExpE__ZTIN3mup11FunCmplxExpE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN3mup11FunCmplxSinE__ZTSN3mup11FunCmplxSinE__ZTIN3mup11FunCmplxSinE__ZTVN3mup11FunCmplxTanE__ZTSN3mup11FunCmplxTanE__ZTIN3mup11FunCmplxTanE__ZTVN3mup10FunCmplxLnE__ZTSN3mup10FunCmplxLnE__ZTIN3mup10FunCmplxLnE__ZTVN3mup12FunCmplxNormE__ZTSN3mup12FunCmplxNormE__ZTIN3mup12FunCmplxNormE__ZTVN3mup12FunCmplxRealE__ZTSN3mup12FunCmplxRealE__ZTIN3mup12FunCmplxRealE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZTVN3mup12FunCmplxConjE__ZTSN3mup12FunCmplxConjE__ZTIN3mup12FunCmplxConjE__ZTVN3mup11FunCmplxArgE__ZTSN3mup11FunCmplxArgE__ZTIN3mup11FunCmplxArgE__ZTVN3mup11FunCmplxLogE__ZTSN3mup11FunCmplxLogE__ZTIN3mup11FunCmplxLogE__ZTVN3mup12FunCmplxImagE__ZTSN3mup12FunCmplxImagE__ZTIN3mup12FunCmplxImagE__ZTVN3mup12FunCmplxCosHE__ZTSN3mup12FunCmplxCosHE__ZTIN3mup12FunCmplxCosHE__ZTVN3mup12FunCmplxSinHE__ZTSN3mup12FunCmplxSinHE__ZTIN3mup12FunCmplxSinHE__ZTVN3mup12FunCmplxTanHE__ZTSN3mup12FunCmplxTanHE__ZTIN3mup12FunCmplxTanHE__ZNSt3__1L3absIdEET_RKNS_7complexIS1_EE__ZNSt3__1L4normIdEET_RKNS_7complexIS1_EE__ZNSt3__1L3argIdEET_RKNS_7complexIS1_EE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZTVN3mup12FunCmplxLog2E__ZTSN3mup12FunCmplxLog2E__ZTIN3mup12FunCmplxLog2E__ZTVN3mup13FunCmplxLog10E__ZTSN3mup13FunCmplxLog10E__ZTIN3mup13FunCmplxLog10EGCC_except_table9GCC_except_table79GCC_except_table29GCC_except_table58GCC_except_table127GCC_except_table86GCC_except_table36GCC_except_table106GCC_except_table65GCC_except_table15GCC_except_table44GCC_except_table134GCC_except_table93GCC_except_table113_atan2GCC_except_table72GCC_except_table22GCC_except_table51GCC_except_table121___gxx_personality_v0GCC_except_table100 #1/28 1573634230 501 20 100644 26100 ` mpFuncCommon.cpp.oX 9x9__text__TEXTxH=__gcc_except_tab__TEXTHH __literal8__TEXT!__cstring__TEXT(!__const__DATA x#HDR__const__TEXT"qX&__compact_unwind__LDX# &Fb__eh_frame__TEXT- 0I h2  )IIR PLj"UHH1H}H}HH}HǾ HHHHUHH]f.UHHH}H}H]DUHHH}HuHUMH}HUHHEHxH5H}HxH}H}HuH}HpHpHHIhHuHHhH}H}HĠ]ÉHEMH})HEMHEMH}H}H} UHH0H1AHuHUHUHuH}HHuLHUHEHH}HHEH0]UHHH}H}H?4H}H=H5H HEHHH]fUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HBHHHUHH]UHHH}H}H]DUHHH}HuHUMHU}H/xHƅ_HHHHHHH`HH}H`HuHƅ_H5HHHE|2HE|HE|H}H`_ HBPWHDžDD;EHEHcDH<HHHЃу HTH&HHcHHEHcDHHHHHHYTHHHHΉHHDž0D8H}HcDH<HHHHHш4ƅ5fxHHHxHH5HHxHE|HHE|HE|HxH{HPHHPDDPH}pH8HhHpHhP`H`HĠ]H}  f"''''''''UHHH}H}H]DUHHH}H}H]DUHH}H}H?H]f.fUHHH}H}H]DUHH H}HuH}HuH ]f.UHH}H ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HHHHUHH]UHHH}H}H]DUHHH}HuHUMHU}H/xHƅ_HHHHHHH`HH}H`HuHƅ_H5HHHE|2HE|HE|H}H`_ H:PPHDžDD;EHEHcDH<HHHЉփfi8HEHcDHHHHHHOHHHHΉHHDž0D8H}HcDH<HHHHHш4ƅ5fxHHHxHH5HHxHE|HHE|HE|HxH{HPHHPDDPH}pH8HhHpHhP`H`HĠ]H}  UHH H}HuH}HuH ]f.UHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HxHHHUHH]UHHH}H}H]DUHHH}HuHUMHU}H/xHƅ_HHHHHHH`HH}H`HuHƅ_H5HHHE|2HE|HE|H}H`_ HkWPDžLL;EHEHcLH<HHHЉփfi@HEHcLHHHHHXPPOHHHHΉHHDž8L@H}HcLH<HHHHHш<ƅ=fxHHHHH5HHHE|HHE|HE|HHaLLPH}xH8HpHxHpP`HhHĠ]H}  f.UHH}HC ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H HHHUHH]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHH@H}HuHUM}4H= H5 H H}H8H}HHEH*H}EH8H}HEHEP`HEH@]UHH}H}]UHH}H] ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}HE]fUHHH}HuH}HuH]f.UHH H}HuHuH}HuH0H}H7HpHwH@HGH}H ]fDUHH}HE]fUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}H]DUHH}HE]fUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHU f.$]fUHH H}HuHuHUH} HEHEHEHEHEH ]::_ u(r &&L=,>EES6'- &&L=,>EES6'- &&L=,>EES6'- &&L=, &&L=,  -ꌠ9Y>)ꌠ9Y>)FparseridmuParserX Vparserid() - muParserX version informationmaxmax(x,y,...,z) - Returns the maximum value from all of its function arguments.minmin(x,y,...,z) - Returns the minimum value from all of its function arguments.sumsum(x,y,...,z) - Returns the sum of all arguments.sizeofEval/Users/jgomez/muparserx/parser/mpFuncCommon.cppa_iArgc==1sizeof(a) - Returns the number of elements in a.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup11ParserErrorEN3mup11FunParserIDEN3mup6FunMaxEN3mup6FunMinEN3mup6FunSumEN3mup9FunSizeOfEEPpAY^@`iA#HPpA #PpiA@# H`  AP #  iA@#pHAiAP#H0(` @iA#(0P((( ?`S2BP????Pp#J`pO9A0`1$ MP.MzRx $EAC $DAC zPLRx ,$AC $YAC $^AC $ AC ,iAC $dP#AC $XHAC $AC ,txAC $ xAC $4pAC $\hAC $`AC $X#AC $`AC ,XiAC $,#AC $THAC $|AC ,<AC $#AC $AC ,iCAC $T#AC $|HAC $AC ,dAC $AC ,iAC $T#AC $|HAC $AC $AC $AC $(AC $DAC $lAC $pAC ,ThiAC $#AC $AC $<(AC $dAC $(AC $AC $(AC $AC $,(AC $T?AC $|SAC $2AC $BAC $@?AC $ X?AC $D p?AC $l ?AC $ AC $ AC $ AC $ AC $4 AC $\ h#AC $ pJAC $ AC $ OAC $ AC $$ AC , 9AC $| AC $ 1AC $ $AC $ AC $ AC $D MAC $l .AC $ MAC -----{-[~-R-A-%i-----P----v-v-v-av-:h3J-gJ-fJ-zesJ-8}-/}-}-(-}-=q-JdCJ--@-A--8-9-n-e0-A1--$-%-E-j--yC-\-+T-S-U--N-EH-!I-v-F-hu-i=-Cj-:-;--j-vT-?(-3-}--&=Y=k--dU-8}-'m- -U-rU-5-}- (--&=Y=k-m-t|-Ux->w-->-gu-Y5-3j-*- 3- -  -u j-= T- - (- - }- - &= Y=v k-] - U- }- m- - U-' U-  - }- (-o -c &=\ Y=I k-4 m- |- x- w- -q 6-C f< u-2 --j--+--[9 --)-'-fj-.T--(--}--z&=sY=gk-N-U-}-m--pU-U--}-(-_-S&=LY=9k-$m-|-x-w--a.-3e,u-"!-j---|-K%- --{-yj-p}-g}-B}-'}-}-T-|-}--l-t-a"-0d)u-$cbaph``PH^@8W0B(p GHonsrzyV]R:p?@onsrzxypQh\XPP2Hp@7880o(n srzyO[_N*p/0onsrzyMxZhL`XpP#H$@o8n0s(r zyKX  ` @   `@ `@ `@ `@ `@ `@ `@80 `XP@ `XP@ {Mp0 /  [   m@  PZ ? `p'y0G `T{ Pz pNP  PP5 pP7PP!0p  @` O j0 P0p~D@ `3D0o``@p{P  f6@ .@" `"{"""#"#h"#0# @# lp U `!! P 5Zg:xt X\ 2 .m / =  W ' ___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZN3mup9ICallback9GetParentEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup9ICallback9AsciiDumpEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZN3mup11ParserXBase10GetVersionEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup6FunMax5CloneEv__ZNK3mup6FunMin5CloneEv__ZNK3mup6FunSum5CloneEv__ZNK3mup9FunSizeOf5CloneEv__ZNK3mup11FunParserID5CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNK3mup6FunMax7GetDescEv__ZNK3mup6FunMin7GetDescEv__ZNK3mup6FunSum7GetDescEv__ZNK3mup9FunSizeOf7GetDescEv__ZNK3mup11FunParserID7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup6FunMaxD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup6FunMinD2Ev__ZN3mup6FunSumD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup9FunSizeOfD2Ev__ZN3mup11FunParserIDD2Ev__ZN3mup6FunMaxC2Ev__ZN3mup6FunMinC2Ev__ZN3mup6FunSumC2Ev__ZN3mup9FunSizeOfC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup11FunParserIDC2Ev__ZN3mup6FunMaxD1Ev__ZN3mup12ErrorContextD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup6FunMinD1Ev__ZN3mup6FunSumD1Ev__ZN3mup9FunSizeOfD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup11FunParserIDD1Ev__ZN3mup6FunMaxC1Ev__ZN3mup6FunMinC1Ev__ZN3mup6FunSumC1Ev__ZN3mup9FunSizeOfC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup11FunParserIDC1Ev__ZN3mup6FunMaxD0Ev__ZN3mup6FunMinD0Ev__ZN3mup6FunSumD0Ev__ZN3mup9FunSizeOfD0Ev__ZN3mup11FunParserIDD0Ev_memset___assert_rtn___cxa_allocate_exception___cxa_free_exception__Znwm__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup6FunMax4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunMin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunSum4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9FunSizeOf4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunParserID4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6insertEmPKc__ZNSt3__1L4moveIRNS_17__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES6_EEEEONS_16remove_referenceIT_E4typeEOSC___ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_OS9___ZNSt3__1L4moveIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEONS_16remove_referenceIT_E4typeEOS9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNKSt3__16__lessIddEclERKdS3___ZNSt3__1L3maxIdEERKT_S3_S3___ZNSt3__1L3minIdEERKT_S3_S3___ZNSt3__1L3maxIdNS_6__lessIddEEEERKT_S5_S5_T0___ZNSt3__1L3minIdNS_6__lessIddEEEERKT_S5_S5_T0___ZN3mup6FunMaxC2ERKS0___ZN3mup6FunMinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup6FunSumC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup9FunSizeOfC2ERKS0___ZN3mup11FunParserIDC2ERKS0___ZN3mup6FunMaxC1ERKS0___ZN3mup6FunMinC1ERKS0___ZN3mup6FunSumC1ERKS0___ZN3mup9FunSizeOfC1ERKS0___ZN3mup11FunParserIDC1ERKS0___ZTVN3mup6FunMaxE__ZTSN3mup6FunMaxE__ZTIN3mup6FunMaxE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup6FunMinE__ZTSN3mup6FunMinE__ZTIN3mup6FunMinE__ZTVN3mup6FunSumE__ZTSN3mup6FunSumE__ZTIN3mup6FunSumE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZTVN3mup9FunSizeOfE__ZTSN3mup9FunSizeOfE__ZTIN3mup9FunSizeOfE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZTVN3mup11FunParserIDE__ZTSN3mup11FunParserIDE__ZTIN3mup11FunParserIDEGCC_except_table69GCC_except_table28GCC_except_table17GCC_except_table6GCC_except_table24GCC_except_table2GCC_except_table21___gxx_personality_v0GCC_except_table40GCC_except_table30GCC_except_table10 #1/28 1573634230 501 20 100644 39428 ` mpFuncMatrix.cpp.oH xUhxU__text__TEXT)hX6__literal8__TEXT)h,__gcc_except_tab__TEXT)x,__cstring__TEXT*.__const__DATAp,H/bB__const__TEXT.(2__compact_unwind__LDX/2d__eh_frame__TEXT?`Ci h2  ipvt# PZZJ&UHHH}H}HH}HǾ H*HHHUHH]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHH}HuHUMH}}H }$HpHHH}ΉHHpE!EEHHH}HHxHHuHHH5HH<HhdHpHhdHhdHH}H}H8HHH`}`0HEHHH8HHH\`;\A\4H}&H8HxHHxP`Hp`\H%HljlhH`H0lhH`H}HXHXHHH0HHPH0H@HhdHhdH0H Hİ]Hh  fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}H}H?H]f.fUHHH}H}H?4H}H=&H5&H 'HEHHH]fUHH H}uUHMH}uUHMH ]ÐUHHH}H}H]DUHH}HR%]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H$HHHUHH]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHH}HuHUMH}}H }$HpHHH}ΉHHpE!EEHHH}HHxHHuHHH5HH2HhdHpHhdHhdHH}H}H8HHH`}`0HEHHH8HHH\`;\<\/H}H8HxHWHxP`Hp`\HWHljlhH`H0lhH`H}HXHXHHH0HHPH0H@HhdHhdH0H Hİ]Hh  f.fUHH}H ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H HHHUHH]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHH}HuHUMH}}H }$HpHHH}ΉHHpE!EEHHH}HHxHHuHHH5HHHhdHp]HhdHhdHH} H}H8HHH`}`0HEHHH8HxHHx\`\HWHωtpHhH0tpHhHDžH`H\dHXdHX;H0ƉHPHPHHI`xHHH^HhdHsHhdH0SH}H@H@HHH0HH8H0H]Hh  UHH H}HuH}HuH ]f.UHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=H5H 5XHEHHcuHH0]@UHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HHHHHUHH]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHH}HuHUMH}}H$HpHHH}ΉHHpE!EEHHH}HHxHHuHHH5HH[HhdHp-HhdHhdHH}HWHHH8HHH}HHHHHщ*H81ɉΉHxHxHHI`HHpH}HhHhHHHщdd*H81XHPHPHHI`HXHHH}H@H@HHH8HH8H8H]ÉHhdHHhdH8Hh  f.UHH}H$]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHH H}uUHMHMUUQAHHQHcHUH ]DUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHHHUH}GHuH}HuHUH}HEMHEHH0]H} fDUHH H}H}H}HEHH@HHEHuHH ]HHUUHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHHk}pHHHE1ɉH}H8H}H0]f.@UHH@H}HuHUHUHHHUHEH}HuH}HUHrH}HHUH}HHEHPHpHPHUHHUH}H}H@]UHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH@H}HuHuHHuH}HEH}HEHkpHuHH}HuH}HEHkpHuHH}HuHkupHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}HI$I$I]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H= Hk}pH ]f.UHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}HE]fUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHHH}H}H}pHHUH2H)HHH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHuH~H}HuHEH;E4H}H}HǐH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}HuHuH>H}HHuV8H ]DUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}HHH}HHEHHH]UHH H}H}H}HEH}HuH}H}H ]HHUUHHH}H}H]DUHpH}H}HWH?H)HHH]fUHHPH}HuHuHHuH}HEH}HEHkpHuHH}HuHkupHH}HEH}HEHkpHuHH}HEHuHHUHMLEHP]f.UHH}]fDUHHH}H}H]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHU;]fUHH}HuHuH6Hk}pHH]??4O(. &&L=,4O(. &&L=,4O(1 &&L=,2E|({l &&L=,  -6_U5 9T * M  G+9 L t  / *Lonesones(x [, y]) - Returns a matrix whose elements are all 1.zeroszeros(x [, y]) - Returns a matrix whose elements are all 0.eyeeye(x, y) - returns a matrix with ones on its diagonal and zeros elsewhere.sizesize(x) - returns the matrix dimensions.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokallocator::allocate(size_t n) 'n' exceeds maximum supported sizeAt/Users/jgomez/muparserx/parser/mpMatrix.hi < (int)m_vData.size()N3mup11ParserErrorEN3mup13FunMatrixOnesEN3mup14FunMatrixZerosEN3mup12FunMatrixEyeEN3mup13FunMatrixSizeEHPp(>A) @`^/0PpiAH)#H`(4AX)0 P iA) # H@ `   ( A)`#PpiA)#H`(SA)PpiA *#2PB?S@???9A0*@pO1$0P `K+A@*`AL*@Z #I0@6 YA\*'@` #Pp M( @ `    U!dAl*!!#!?"0"P"p""""""80#P#p##+#F$ $0$F$$7$$+ %A|*%#%#&+0&;A*p&&9&XA*0'P'''0( @(`(M('( zRx $HAC $DAC $lAC $AC $(AC zPLRx ,$>AC $4AC $\AC $AC $AC $^AC $/AC $$AC $LAC ,iAC $@#AC $HHAC $pAC $hAC $D`AC $lX(AC ,`4AC $pAC , hiAC $#AC $DHAC $lAC $AC $AC $(AC ,,AC $<(#AC $d0AC $AC ,iAC $#AC $ HAC $40AC $\(AC $ AC $(AC , SAC $PAC ,LHiAC $\#AC $2AC $BAC $?AC $SAC $$ ?AC $L8?AC $tP?AC ,h9AC $xAC $OAC $ 1AC $D $AC $l AC $ AC $ AC $ AC $ KAC $4 +AC ,| AC , `AC $ HAC $ AC $ 8ZAC $4 p AC $\ X#AC $ `IAC $ AC $ p6AC $ AC $$ AC ,l hYAC $| 'AC $ AC $ AC $ AC $ #AC $D AC $l AC $ AC $ MAC $ (AC $ AC $4AC $\AC $AC $AC $UAC ,dcAC $,XAC $TP#AC $|X?AC $pAC $hAC $`AC $XAC $D@AC $l8AC $0AC $(AC $8AC $ (AC $4 AC $\AC $+AC $FAC $0 AC $AC $$FAC $L8AC $t 7AC $8AC $0+AC , 8AC $#AC $D#AC $l+AC ,;AC $AC $9AC ,4X{AC $DAC $l'AC $AC $x AC $`AC $ XMAC $4'AC $\ AC }(Y-Q(-(7-' -'5-'5-'6-'5-'5-A'-$'- 'W-&V-&%-& -&-&U-&-g&-P&S-%R-%Q-%-t%O-h%"-S%-%N-$M-$-$J-l$L-\$J-#K-#J-#I-a#H-E#G-#F-"&-""-a"E-!"D-!=!-!C-!-n!-e!-S!-J!=C!=7!A-$!- @- ?-  =-q >-1 =-<-;-:-a9-98-7-5-6-5-6-5-5-u4-U3--2--0-/-.---,-])-+-*-)-(-'-&-l-c%-($-#-"-!-- -t-R-F-:-$------a-K-3---q-A-----k-b-Q-5-#----jc- =----o-8\-/-q---o--[;-/----n~--~---u-X-:\-1---Z==---t-[-J-1--t-u--qr-C<-2a---_--[B -)- -y-U-@----j~-3- - - -} -2 -$ \- - - - Z= = - -z -^ -E -4 - - - d- e-q -Q b-#  -  y- - - w-l -;  - - - - -u -g -H ---R-D\-;---Z==---~-e-T-;--|-}--qz-C<-2i---g--[A-%--q]-Q[-1------o-a-B-'--B-4\-+---Z==---n-U-D-+--l-m--aj-3,-"@80 nstxphXP^H@c8d0( v{|xph`fXPkHl@80( `@ `@80 `@     ` @       ` @         ` @       ` @       x p ` @   `@ `@ `@ xp`@80 `XP@ `@ `@ `@ `@ M P") "H)5#X)"):`^#)`(P'(")"#)" * @p"0*7 3`V 0 P] "@* b"L*q @;`o#"#$$"$%!0h@   p'P ="\*' R"P" "X"I"q `  R@  0!!!"l*V!o0"p"0#P#p#$ $0$M$ %`0&%)"|*%X&p&#*&' 0(u"*(4@g ` P @   > j ` &FQP K pefm` "N % 4`r@e . 0 &pO PUp Pvp, P3P 0 /& @[e)0' @(, .s@.s .!`..  /X.X @// `-=p,= -,` b!1! S6]q' w aH#Y___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__19allocatorIN3mup5ValueEE8allocateEmPKv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE26__invalidate_all_iteratorsEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNK3mup9ICallback9AsciiDumpEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__19allocatorIN3mup5ValueEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup14FunMatrixZeros5CloneEv__ZNK3mup13FunMatrixOnes5CloneEv__ZNK3mup13FunMatrixSize5CloneEv__ZNK3mup12FunMatrixEye5CloneEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNK3mup14FunMatrixZeros7GetDescEv__ZNK3mup13FunMatrixOnes7GetDescEv__ZNK3mup13FunMatrixSize7GetDescEv__ZNK3mup12FunMatrixEye7GetDescEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12ErrorContextD2Ev__ZN3mup14FunMatrixZerosD2Ev__ZN3mup13FunMatrixOnesD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup13FunMatrixSizeD2Ev__ZN3mup12FunMatrixEyeD2Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZN3mup14FunMatrixZerosC2Ev__ZN3mup13FunMatrixOnesC2Ev__ZN3mup13FunMatrixSizeC2Ev__ZN3mup12FunMatrixEyeC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIN3mup5ValueEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup14FunMatrixZerosD1Ev__ZN3mup13FunMatrixOnesD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup13FunMatrixSizeD1Ev__ZN3mup12FunMatrixEyeD1Ev__ZN3mup5ValueD1Ev__ZN3mup6MatrixINS_5ValueEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZN3mup14FunMatrixZerosC1Ev__ZN3mup13FunMatrixOnesC1Ev__ZN3mup13FunMatrixSizeC1Ev__ZN3mup12FunMatrixEyeC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup14FunMatrixZerosD0Ev__ZN3mup13FunMatrixOnesD0Ev__ZN3mup13FunMatrixSizeD0Ev__ZN3mup12FunMatrixEyeD0Ev_memset__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC2ERKS5_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC1ERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8allocateERS4_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10deallocateERS4_PS3_m__ZNSt3__19allocatorIN3mup5ValueEE10deallocateEPS2_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE14__annotate_newEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__annotate_shrinkEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup14FunMatrixZeros4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunMatrixOnes4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunMatrixSize4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunMatrixEye4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch___clang_call_terminate__Unwind_Resume__ZN3mup5ValueC1Ed__ZNSt3__1L20__throw_length_errorEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE7destroyIS3_EEvRS4_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9__destroyIS3_EEvNS_17integral_constantIbLb1EEERS4_PT___ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EEC2IDnvEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC1IDnLb1EEEOT___ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE31__annotate_contiguous_containerEPKvS7_S7_S7___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__1L16__to_raw_pointerIN3mup5ValueEEEPT_S4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8max_sizeERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS4___ZNKSt3__16__lessImmEclERKmS3___ZNKSt3__16__lessIiiEclERKiS3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L3minIiEERKT_S3_S3___ZNSt3__19allocatorIN3mup5ValueEE7destroyEPS2___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endEmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZN3mup6MatrixINS_5ValueEEC2EiiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiiRKS1___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minIiNS_6__lessIiiEEEERKT_S5_S5_T0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRKS2_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRKS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRKS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZN3mup14FunMatrixZerosC2ERKS0___ZN3mup13FunMatrixOnesC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup13FunMatrixSizeC2ERKS0___ZN3mup12FunMatrixEyeC2ERKS0___ZN3mup14FunMatrixZerosC1ERKS0___ZN3mup13FunMatrixOnesC1ERKS0___ZN3mup13FunMatrixSizeC1ERKS0___ZN3mup12FunMatrixEyeC1ERKS0___ZN3mup5ValueC1ERKS0___ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTVN3mup14FunMatrixZerosE__ZTSN3mup14FunMatrixZerosE__ZTIN3mup14FunMatrixZerosE__ZTVN3mup13FunMatrixOnesE__ZTSN3mup13FunMatrixOnesE__ZTIN3mup13FunMatrixOnesE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZTVN3mup13FunMatrixSizeE__ZTSN3mup13FunMatrixSizeE__ZTIN3mup13FunMatrixSizeE__ZTVN3mup12FunMatrixEyeE__ZTSN3mup12FunMatrixEyeE__ZTIN3mup12FunMatrixEyeE__ZNSt3__1L7forwardIRKN3mup5ValueEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table118GCC_except_table76GCC_except_table5GCC_except_table65GCC_except_table125GCC_except_table64GCC_except_table34GCC_except_table14GCC_except_table93GCC_except_table43GCC_except_table23GCC_except_table52GCC_except_table122GCC_except_table41GCC_except_table21___gxx_personality_v0GCC_except_table30 #1/28 1573634230 501 20 100644 64660 ` mpFuncNonCmplx.cpp.oH h__text__TEXT+:h__gcc_except_tab__TEXT,:=__literal16__TEXT;(?__cstring__TEXT;8?__const__DATA>HB0__const__TEXTLXP__compact_unwind__LDxNQ/__eh_frame__TEXTn(q( h2  0$ PHa(UHHH}H}HH}HǾ H;HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H}H?H]f.fUHHH}H}H?4H}H=u=H5x=H =HEHHH]fUHH}Hu:]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H9HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H8]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H08HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H{7]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H6HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H6]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H55HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H4]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H3HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H3]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H:2HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H1]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H0HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H 0]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HF/HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H.]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H-HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H-]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HZ,HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H+]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H*HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H5*]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ Hw)HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H(]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H'HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}HJ']f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H&HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H%]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H %HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H$]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H~#HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHQH}EHHER`HEH0]f.UHH}H"]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H"HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}HZ!]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HHH}EHHER`HEH0]fUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H.HHHUHH]UHHH}H}H]DUHH0H}HuHUMH}HH( fH}EHHER`HEH0]UHH}Hy]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HHHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHHEHHEHHME(MH}EHHER`HEH@]fDUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H)HHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHHEHHEHHME(MH}EHHER`HEH@]fDUHH}HF]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HHHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHHEHHEHHME(MH}EHHER`HEH@]fDUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HHHHUHH]UHHH}H}H]DUHHPH}HuHUMH}HHH(HEHHEMHHH(UE(]M(H}EHHER`HEHP]f.UHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H\HHHUHH]UHHH}H}H]DUHH@H}HuHUMH}HHHEHHEHHME(MH}EHHER`HEH@]fDUHH}H}]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H] &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=,sinsine functioncoscosine functiontantangens functionasinarcus sineacosarcus cosineatanarcus tangenssinhhyperbolic sinecoshhyperbolic cosinetanhhyperbolic tangensasinhhyperbolic arcus sineacoshhyperbolic arcus cosineatanhhyperbolic arcus tangenslogNatural logarithmlog10Logarithm base 10log2Logarithm base 2lnsqrtsqrt(x) - square root of xcbrtcbrt(x) - cubic root of xexpexp(x) - e to the power of xabsabs(x) - absolute value of xpowpow(x, y) - raise x to the power of yhypothypot(x, y) - compute the length of the vector x,yatan2arcus tangens with quadrant fixfmodfmod(x, y) - floating point remainder of x / yremainderremainder(x, y) - IEEE remainder of x / yoperator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup6FunTanEN3mup6FunCosEN3mup6FunSinEN3mup7FunASinEN3mup7FunACosEN3mup7FunATanEN3mup7FunSinHEN3mup7FunCosHEN3mup7FunTanHEN3mup8FunASinHEN3mup8FunACosHEN3mup8FunATanHEN3mup6FunLogEN3mup8FunLog10EN3mup7FunLog2EN3mup5FunLnEN3mup7FunSqrtEN3mup7FunCbrtEN3mup6FunExpEN3mup6FunAbsEN3mup6FunPowEN3mup8FunHypotEN3mup8FunAtan2EN3mup7FunFmodEN3mup12FunRemainderEHPpW^PpiA,:#H`WiA<:p#HWpiAL:#0HW iA\:#H0WiAl: #PHW @ iA|: # H0 P W  iA:@ #p H  W@ ` iA: # HP p W  iA:`#HW`iA:# HpWiA:#H WiA:#@HW0iA:#H @WiA:0#`HW0PiA ;#H@`WiA;P#HVPpiA,;#H`WiA<;p#HWpiAL;#0H] iA\;#H 0   iAl;P!#!H!!""iA|;##@#H##@$`$iA;$#%HP%p% &@&iA;&#&H0'P''(iA;p(#(((()(@)`)())()*(0*P*(**(**( +@+(p++(++(,0,(`,,(,,(- -(P-p-(--(-.(@.`.(..(./(0/P/(//(//( 0@0(p0?0S1?P1?1?1?2?P2?2?2?3?P3?3?3?4?P4?4?4?5?P5?5?5?6?P6?6?6?707P7p77777808P8p88888909P9p99999:zRx $ȑHAC $DAC $lWAC $ AC $^AC $PAC zPLRx ,$(iAC $\h#AC $pHAC $AC $WAC $ȒAC ,iAC $T#AC $|HAC $0AC $(WAC $`AC ,XiAC $L#AC $tHAC $ȓAC $WAC $AC , iAC $D0#AC $l8HAC $`AC $XWAC $AC ,i3AC $<Ȕ#AC $dДHAC $AC $WAC $(AC , iKAC $4`#AC $\hHAC $AC $WAC $AC ,icAC $,#AC $THAC $|(AC $ WAC $XAC ,Pi{AC $$#AC $LHAC $tAC $WAC $AC ,iAC $ (#AC $D 0HAC $l XAC $ PWAC $ AC ,iAC $ #AC $< ȗHAC $d AC $ WAC $ AC , iAC $ X#AC $4 `HAC $\ AC $ WAC $ AC , iAC $ #AC $, HAC $T AC $| WAC $ PAC , HiAC $ #AC $$ HAC $L AC $t WAC $ AC , i AC $ #AC $(HAC $DPAC $lHWAC $AC , xi#AC $#AC $HAC $<AC $dWAC $AC ,i;AC $P#AC $ XHAC $4AC $\xVAC $AC ,iSAC $#AC $HAC $,AC $TWAC $|HAC ,@ikAC $#AC $HAC $$AC $LWAC $tAC ,؜iAC $#AC $ HAC $HAC $D@]AC $lxAC ,piAC $#AC $HAC $AC $<؝AC $d@AC ,8iAC $x#AC $HAC $ AC $4AC $\AC ,|i˷AC $@#AC $HHAC $pAC $,hAC $TПAC ,tȟiAC $#AC $HAC $8AC $$0AC $LAC ,liAC $#AC $HAC $ AC $AC $DAC ,dxiAC $#AC $AC $(AC $AC $<(AC $dAC $(AC $AC $(AC $AC $,(AC $TAC $|(AC $AC $(AC $AC $(AC $DAC $l(AC $AC $(AC $AC $ (AC $4AC $\(AC $AC $(AC $AC $(AC $$AC $L(AC $tAC $(AC $AC $(AC $AC $<(AC $dAC $(AC $AC $(AC $AC $,(AC $TAC $|(AC $AC $(AC $AC $ (AC $D AC $l (AC $ ?AC $ ءSAC $ ?AC $ !(?AC $4!@?AC $\!X?AC $!p?AC $!?AC $!?AC $!?AC $$"Т?AC $L"?AC $t"?AC $"?AC $"0?AC $"H?AC $#`?AC $<#x?AC $d#?AC $#?AC $#?AC $#أ?AC $$?AC $,$?AC $T$ ?AC $|$8?AC $$PAC $$HAC $$@AC $%8AC $D%0AC $l%(AC $% AC $%AC $%AC $ &AC $4&AC $\&AC $&AC $&AC $&AC $&أAC $$'УAC $L'ȣAC $t'AC $'AC $'AC $'AC $(AC $<(AC $d(AC !:i-:i-9i-9i-9i-9i-a9i-A9i-!9i-9i-8i-8i-8i-8i-a8i-A8i-!8i-8i-7i-7i-7i-7i-a7i-A7i-!7i-6H6-6V6-z6^s6-:6_36-5N5-5J5-z5Ls5-:5T35-4Y4-4I4-z4Ws4-:4`34-3M3-3]3-z3[s3-:3\33-2Z2-2U2-z2Xs2-:2S32-1Q1-1R1-z1Os1-:1K31-0n=0e-0P0-^0o-U0-10 -0o-0-/-/o-/-/-n/o-e/-A/-/o-/O-.P-.o-./-.0-~.o-u.?-Q.@-..o-%.-.--o------o--'-a-(->-o-5----,o-,-,-,o-,G-q,H-N,o-E,-!,-+o-+-+-+o-+-+-^+o-U+-1+-+o-+-*-*o-*-*-n*o-e*w-A*x-*o-*g-)h-)o-)o-)p-~)o-u)W-Q)X-.)o-%)7-)8-(o-(_-(`-(-c(a-Z(o-9(-(p-''-'-'-l'-A'-'H 'h-'&-&a-&o-y&-\&p-+&%-%~-%-%-a%-3%V,%h-"%$-$a-$o-$-|$p-K$$-$x-#-#-#-s#^l#h-b#)#-#a-"o-"-"p-"^"-P"--"- "-!-!_!h-!i!L-C!a-:!o-!J- p-  - -m -L -! M-Nh-,-a-zo-Y*-<p- ----cJ\h-R<-a-o-:-p-{K-=}-,-=-Lh-|-ca-Zo-9z-p--z--q}-CT<h-2-a-o--p-[*- --Yh-i$-Ca-:o-"-p---|-Q%-#Ih--a-o--lp-; ----Wh-I-#a-o--p-{-m-\-1-`h-D-a-o-iB-Lp----E-sMlh-b)-a-o--p-[-My-<--]h--sa-jo-I-,p--t---S[Lh-B -a-o--p-k;--v---\h-y-Sa-Jo-)- p-  - - -a -3 Z, h-"  - a- o- -| p-K  - |- - - U h- Y -3 a-* o- - p-  -} -l -A - X h-  t- a- o-y r-\ p-+ -w--u-S|h-r9d-a- o-b-p-k-]s-L-!e-Qh-l-a-zo-Yj-<p- -u--m-cR\h-RT-a-o-R-p-{K-=-,-U-Oh-4-ca-Zo-92-p--{--q5-CK<h-2\-a-o-Z-p-[5q-+$---a]-3P,h-"l / m l = m l E m l F m lx 5p m` lX 1P m@ l8 30 m l ; m l @ m l 0 m l > m l G m lx 4p m` lX DP m@ l8 B0 m l C m l A m l < m l ? m l : m lx 8p m` lX 9P m@ l8 60 m l 2 m l 7 m   d   c b g f k j  x p h d` X P cH b@ g8 f0 k( j  $   d   c b g f k j  ,   d x p ch b` gX fP kH j@ 8 -(  I d N O cbgfkj)d./cbgxfpkhj`XH@98d0>(? cbgfkjyd~cbgfkjx"h`XdPH@c8b0g(f kj'!d&'cbgfkjxdph`cXbPgHf@k8j0(%dcbgfkj.AdFGcxbpghf`kXjPH8 0(d cbgfkj + dcbgfkxjph)X PHd@80c(b gfkj *dcbgfkj(xphd`XPcHb@g8f0k(j #dcbgfkj&qdvxwpchb`gXfPkHj@8!( adfgcbgfkjidnocbgxfpkhj`X H@Q8d0V(W cbgfkj1d67cbgfkjxh`YXdP^H_@c8b0g(f kj`@ `@ `@ `@ `@ `@ `@ `@ `@ `@ `@ `@ `@ r`@ r`XPr@ r`@ r`@ r`XPr@      r ` @      r   ` @    r     ` X P r@        r ` @      r   ` @    r `XPr@ r`@ r`@ r`XPr@ r`@ r`@ r`XPr@ r`@ r`@ rM #,:$<:"L:#\:$l:A#|:#:":{#:`$:.#:#:":h#:M$ ;#;#$,;"<;#L;$\;T#l;#|;";#;s$;P'Kp(1 0'6 &A@0!  0:`P @U4 p- P-k83 50-. .p9p `[1) (07jL P5, \`.< @.P9I 3 @, `,8:0 P!  5/ .Y95` P1@ p`)P @)P7p P$p0i (y (B7Q0  s1* )7lt 1T 0)d )-p7 <2} PP* 0*V7p `(5. -09 ,  2 p * *7p%& P%6 %/ /9DkP4e ` -u -U8)P _@ 0 P2  )* *7q 4- -m9p `DP 2$  T@+4  +8EpP3  + +P8ax.3 >+ p+08 Y739 i0,I ,)p8 #$o#QP6O @#/_ /?9!# !A6!P/ 0/9|@0 4z , ,j8l0|(\'c A0 ~p30!  ppPI% @  f` X@ L@&< & P 0  pP  t``$@$"":<ULoK0L(I$LPK8PLJIcPJ0J7pJKJ J LU"K JsK@!J K!J~!0K"LpL"pK`N]M NLMM%Nt MLO)MM#8MM6 VMFNA"M GM_M,!eMs M tMi!M"6N&N~"M`IKpEw0GP?F DGa?>;@0@APF" AH-"E AKE!`B^ @C BT!C!HHi"Dy! R~t27 7$#$#_pow__ZdlPv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup9ICallback9AsciiDumpEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup6FunPow5CloneEv__ZNK3mup7FunSqrt5CloneEv__ZNK3mup7FunCbrt5CloneEv__ZNK3mup8FunHypot5CloneEv__ZNK3mup6FunCos5CloneEv__ZNK3mup7FunACos5CloneEv__ZNK3mup6FunAbs5CloneEv__ZNK3mup12FunRemainder5CloneEv__ZNK3mup6FunExp5CloneEv__ZNK3mup6FunSin5CloneEv__ZNK3mup7FunASin5CloneEv__ZNK3mup6FunTan5CloneEv__ZNK3mup7FunATan5CloneEv__ZNK3mup5FunLn5CloneEv__ZNK3mup6FunLog5CloneEv__ZNK3mup7FunFmod5CloneEv__ZNK3mup7FunCosH5CloneEv__ZNK3mup8FunACosH5CloneEv__ZNK3mup7FunSinH5CloneEv__ZNK3mup8FunASinH5CloneEv__ZNK3mup7FunTanH5CloneEv__ZNK3mup8FunATanH5CloneEv__ZNK3mup8FunAtan25CloneEv__ZNK3mup7FunLog25CloneEv__ZNK3mup8FunLog105CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNK3mup6FunPow7GetDescEv__ZNK3mup7FunSqrt7GetDescEv__ZNK3mup7FunCbrt7GetDescEv__ZNK3mup8FunHypot7GetDescEv__ZNK3mup6FunCos7GetDescEv__ZNK3mup7FunACos7GetDescEv__ZNK3mup6FunAbs7GetDescEv__ZNK3mup12FunRemainder7GetDescEv__ZNK3mup6FunExp7GetDescEv__ZNK3mup6FunSin7GetDescEv__ZNK3mup7FunASin7GetDescEv__ZNK3mup6FunTan7GetDescEv__ZNK3mup7FunATan7GetDescEv__ZNK3mup5FunLn7GetDescEv__ZNK3mup6FunLog7GetDescEv__ZNK3mup7FunFmod7GetDescEv__ZNK3mup7FunCosH7GetDescEv__ZNK3mup8FunACosH7GetDescEv__ZNK3mup7FunSinH7GetDescEv__ZNK3mup8FunASinH7GetDescEv__ZNK3mup7FunTanH7GetDescEv__ZNK3mup8FunATanH7GetDescEv__ZNK3mup8FunAtan27GetDescEv__ZNK3mup7FunLog27GetDescEv__ZNK3mup8FunLog107GetDescEv__ZN3mup6FunPowD2Ev__ZN3mup7FunSqrtD2Ev__ZN3mup7FunCbrtD2Ev__ZN3mup8FunHypotD2Ev__ZN3mup6FunCosD2Ev__ZN3mup7FunACosD2Ev__ZN3mup6FunAbsD2Ev__ZN3mup12FunRemainderD2Ev__ZN3mup6FunExpD2Ev__ZN3mup6FunSinD2Ev__ZN3mup7FunASinD2Ev__ZN3mup6FunTanD2Ev__ZN3mup7FunATanD2Ev__ZN3mup5FunLnD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup6FunLogD2Ev__ZN3mup7FunFmodD2Ev__ZN3mup7FunCosHD2Ev__ZN3mup8FunACosHD2Ev__ZN3mup7FunSinHD2Ev__ZN3mup8FunASinHD2Ev__ZN3mup7FunTanHD2Ev__ZN3mup8FunATanHD2Ev__ZN3mup8FunAtan2D2Ev__ZN3mup7FunLog2D2Ev__ZN3mup8FunLog10D2Ev__ZN3mup6FunPowC2Ev__ZN3mup7FunSqrtC2Ev__ZN3mup7FunCbrtC2Ev__ZN3mup8FunHypotC2Ev__ZN3mup6FunCosC2Ev__ZN3mup7FunACosC2Ev__ZN3mup6FunAbsC2Ev__ZN3mup12FunRemainderC2Ev__ZN3mup6FunExpC2Ev__ZN3mup6FunSinC2Ev__ZN3mup7FunASinC2Ev__ZN3mup6FunTanC2Ev__ZN3mup7FunATanC2Ev__ZN3mup5FunLnC2Ev__ZN3mup6FunLogC2Ev__ZN3mup7FunFmodC2Ev__ZN3mup7FunCosHC2Ev__ZN3mup8FunACosHC2Ev__ZN3mup7FunSinHC2Ev__ZN3mup8FunASinHC2Ev__ZN3mup7FunTanHC2Ev__ZN3mup8FunATanHC2Ev__ZN3mup8FunAtan2C2Ev__ZN3mup7FunLog2C2Ev__ZN3mup8FunLog10C2Ev__ZN3mup6FunPowD1Ev__ZN3mup7FunSqrtD1Ev__ZN3mup7FunCbrtD1Ev__ZN3mup8FunHypotD1Ev__ZN3mup6FunCosD1Ev__ZN3mup7FunACosD1Ev__ZN3mup6FunAbsD1Ev__ZN3mup12FunRemainderD1Ev__ZN3mup6FunExpD1Ev__ZN3mup6FunSinD1Ev__ZN3mup7FunASinD1Ev__ZN3mup6FunTanD1Ev__ZN3mup7FunATanD1Ev__ZN3mup5FunLnD1Ev__ZN3mup6FunLogD1Ev__ZN3mup7FunFmodD1Ev__ZN3mup7FunCosHD1Ev__ZN3mup8FunACosHD1Ev__ZN3mup7FunSinHD1Ev__ZN3mup8FunASinHD1Ev__ZN3mup7FunTanHD1Ev__ZN3mup8FunATanHD1Ev__ZN3mup8FunAtan2D1Ev__ZN3mup7FunLog2D1Ev__ZN3mup8FunLog10D1Ev__ZN3mup6FunPowC1Ev__ZN3mup7FunSqrtC1Ev__ZN3mup7FunCbrtC1Ev__ZN3mup8FunHypotC1Ev__ZN3mup6FunCosC1Ev__ZN3mup7FunACosC1Ev__ZN3mup6FunAbsC1Ev__ZN3mup12FunRemainderC1Ev__ZN3mup6FunExpC1Ev__ZN3mup6FunSinC1Ev__ZN3mup7FunASinC1Ev__ZN3mup6FunTanC1Ev__ZN3mup7FunATanC1Ev__ZN3mup5FunLnC1Ev__ZN3mup6FunLogC1Ev__ZN3mup7FunFmodC1Ev__ZN3mup7FunCosHC1Ev__ZN3mup8FunACosHC1Ev__ZN3mup7FunSinHC1Ev__ZN3mup8FunASinHC1Ev__ZN3mup7FunTanHC1Ev__ZN3mup8FunATanHC1Ev__ZN3mup8FunAtan2C1Ev__ZN3mup7FunLog2C1Ev__ZN3mup8FunLog10C1Ev__ZN3mup6FunPowD0Ev__ZN3mup7FunSqrtD0Ev__ZN3mup7FunCbrtD0Ev__ZN3mup8FunHypotD0Ev__ZN3mup6FunCosD0Ev__ZN3mup7FunACosD0Ev__ZN3mup6FunAbsD0Ev__ZN3mup12FunRemainderD0Ev__ZN3mup6FunExpD0Ev__ZN3mup6FunSinD0Ev__ZN3mup7FunASinD0Ev__ZN3mup6FunTanD0Ev__ZN3mup7FunATanD0Ev__ZN3mup5FunLnD0Ev__ZN3mup6FunLogD0Ev__ZN3mup7FunFmodD0Ev__ZN3mup7FunCosHD0Ev__ZN3mup8FunACosHD0Ev__ZN3mup7FunSinHD0Ev__ZN3mup8FunASinHD0Ev__ZN3mup7FunTanHD0Ev__ZN3mup8FunATanHD0Ev__ZN3mup8FunAtan2D0Ev__ZN3mup7FunLog2D0Ev__ZN3mup8FunLog10D0Ev_cbrt_hypot_acos_cos_remainder_exp___assert_rtn_asin_sin_atan_tan__Znwm__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup6FunPow4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunSqrt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunCbrt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunHypot4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunCos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunACos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunAbs4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12FunRemainder4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunExp4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunSin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunASin4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunTan4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunATan4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup5FunLn4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6FunLog4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunFmod4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunCosH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunACosH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunSinH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunASinH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunTanH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunATanH4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunAtan24EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7FunLog24EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunLog104EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i_acosh_cosh_asinh_sinh_atanh_tanh_log__Unwind_Resume_fmod__ZN3mup6FunPowC2ERKS0___ZN3mup7FunSqrtC2ERKS0___ZN3mup7FunCbrtC2ERKS0___ZN3mup8FunHypotC2ERKS0___ZN3mup6FunCosC2ERKS0___ZN3mup7FunACosC2ERKS0___ZN3mup6FunAbsC2ERKS0___ZN3mup12FunRemainderC2ERKS0___ZN3mup6FunExpC2ERKS0___ZN3mup6FunSinC2ERKS0___ZN3mup7FunASinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup6FunTanC2ERKS0___ZN3mup7FunATanC2ERKS0___ZN3mup5FunLnC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup6FunLogC2ERKS0___ZN3mup7FunFmodC2ERKS0___ZN3mup7FunCosHC2ERKS0___ZN3mup8FunACosHC2ERKS0___ZN3mup7FunSinHC2ERKS0___ZN3mup8FunASinHC2ERKS0___ZN3mup7FunTanHC2ERKS0___ZN3mup8FunATanHC2ERKS0___ZN3mup8FunAtan2C2ERKS0___ZN3mup7FunLog2C2ERKS0___ZN3mup8FunLog10C2ERKS0___ZN3mup6FunPowC1ERKS0___ZN3mup7FunSqrtC1ERKS0___ZN3mup7FunCbrtC1ERKS0___ZN3mup8FunHypotC1ERKS0___ZN3mup6FunCosC1ERKS0___ZN3mup7FunACosC1ERKS0___ZN3mup6FunAbsC1ERKS0___ZN3mup12FunRemainderC1ERKS0___ZN3mup6FunExpC1ERKS0___ZN3mup6FunSinC1ERKS0___ZN3mup7FunASinC1ERKS0___ZN3mup6FunTanC1ERKS0___ZN3mup7FunATanC1ERKS0___ZN3mup5FunLnC1ERKS0___ZN3mup6FunLogC1ERKS0___ZN3mup7FunFmodC1ERKS0___ZN3mup7FunCosHC1ERKS0___ZN3mup8FunACosHC1ERKS0___ZN3mup7FunSinHC1ERKS0___ZN3mup8FunASinHC1ERKS0___ZN3mup7FunTanHC1ERKS0___ZN3mup8FunATanHC1ERKS0___ZN3mup8FunAtan2C1ERKS0___ZN3mup7FunLog2C1ERKS0___ZN3mup8FunLog10C1ERKS0___ZTVN3mup6FunPowE__ZTSN3mup6FunPowE__ZTIN3mup6FunPowE__ZTVN3mup7FunSqrtE__ZTSN3mup7FunSqrtE__ZTIN3mup7FunSqrtE__ZTVN3mup7FunCbrtE__ZTSN3mup7FunCbrtE__ZTIN3mup7FunCbrtE__ZTVN3mup8FunHypotE__ZTSN3mup8FunHypotE__ZTIN3mup8FunHypotE__ZTVN3mup6FunCosE__ZTSN3mup6FunCosE__ZTIN3mup6FunCosE__ZTVN3mup7FunACosE__ZTSN3mup7FunACosE__ZTIN3mup7FunACosE__ZTVN3mup6FunAbsE__ZTSN3mup6FunAbsE__ZTIN3mup6FunAbsE__ZTVN3mup12FunRemainderE__ZTSN3mup12FunRemainderE__ZTIN3mup12FunRemainderE__ZTVN3mup6FunExpE__ZTSN3mup6FunExpE__ZTIN3mup6FunExpE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN3mup6FunSinE__ZTSN3mup6FunSinE__ZTIN3mup6FunSinE__ZTVN3mup7FunASinE__ZTSN3mup7FunASinE__ZTIN3mup7FunASinE__ZTVN3mup6FunTanE__ZTSN3mup6FunTanE__ZTIN3mup6FunTanE__ZTVN3mup7FunATanE__ZTSN3mup7FunATanE__ZTIN3mup7FunATanE__ZTVN3mup5FunLnE__ZTSN3mup5FunLnE__ZTIN3mup5FunLnE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZTVN3mup6FunLogE__ZTSN3mup6FunLogE__ZTIN3mup6FunLogE__ZTVN3mup7FunFmodE__ZTSN3mup7FunFmodE__ZTIN3mup7FunFmodE__ZTVN3mup7FunCosHE__ZTSN3mup7FunCosHE__ZTIN3mup7FunCosHE__ZTVN3mup8FunACosHE__ZTSN3mup8FunACosHE__ZTIN3mup8FunACosHE__ZTVN3mup7FunSinHE__ZTSN3mup7FunSinHE__ZTIN3mup7FunSinHE__ZTVN3mup8FunASinHE__ZTSN3mup8FunASinHE__ZTIN3mup8FunASinHE__ZTVN3mup7FunTanHE__ZTSN3mup7FunTanHE__ZTIN3mup7FunTanHE__ZTVN3mup8FunATanHE__ZTSN3mup8FunATanHE__ZTIN3mup8FunATanHE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZTVN3mup8FunAtan2E__ZTSN3mup8FunAtan2E__ZTIN3mup8FunAtan2E__ZTVN3mup7FunLog2E__ZTSN3mup7FunLog2E__ZTIN3mup7FunLog2E__ZTVN3mup8FunLog10E__ZTSN3mup8FunLog10E__ZTIN3mup8FunLog10EGCC_except_table78GCC_except_table48GCC_except_table138GCC_except_table18GCC_except_table108GCC_except_table6GCC_except_table96GCC_except_table66GCC_except_table36GCC_except_table126GCC_except_table84GCC_except_table54GCC_except_table144GCC_except_table24GCC_except_table114_atan2_log2GCC_except_table72GCC_except_table42GCC_except_table132GCC_except_table12GCC_except_table102___gxx_personality_v0GCC_except_table90GCC_except_table60GCC_except_table150GCC_except_table30GCC_except_table120_log10#1/20 1573634231 501 20 100644 24068 ` mpFuncStr.cpp.oH 1h1__text__TEXTNh85__literal16__TEXTP __gcc_except_tab__TEXTp__cstring__TEXT __const__DATA8:@__const__TEXTtX__compact_unwind__LDh <g__eh_frame__TEXT$ p'? h2  ?PH P11:kUHHH}H}HH}HǾ HHHHUHH]UHHH}H}H]DUHHpH}HuHUMH}HHHHUHHHUH}fHn( fbf( f\f|H}EHEHEHHI`HEHEH}Hp]ÉHEMH}H} @UHH}H}H?H]f.fUHHH}H}H]DUHHH}H}H?4H}H=H5H HEHHH]fUHH}H8]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ HHHHUHH]UHHH}H}H]DUHHH}HuHUMH}HHHHUHHHxHxHEHxHEHxHEH}HuHUH HpHpHEH}HuH}HhHhHHIhHuHH`H}H}HĠ]ÉHEMHEMH}H}H} UHHPH}HuHUHMH}HuLHEH}HE8HEЈH}MMψH}H}HEHEHEHEHEHP]UHHH}H}H}HHEH]DUHH0H}H}H}H}HEH}HHEH}HHuHEH0]DUHH}}H]UHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H5HHHUHH]UHHH}H}H]DUHHH}HuHUMH}HHHHUHHHxHxHEHxHEHxHEH}HuHUH HpHpHEH}HuH}HhHhHHIhHuHH`H}H}HĠ]ÉHEMHEMH}H}H} UHH}}H]UHH}H ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾ H HHHUHH]UHHH}H}H]DUHHH}HuHUM}4H=p H5n H H}H}HEHEHHHHEH}HuHEH}H53 1ɈH}H}HHEUHŠEEEH}EHxHxHHI`HEHpH}HĐ]ÉHEMH}H} @UHHH}H}H]DUHHH}H}H]DUHH}HI ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HcH]f.fUHHH}H}H]DUHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}HuH}HuH]f.UHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}HuHuH}H>]UHHH}HuH}Hu4$H]fDUHH}H}H]f.DUHH}H}HHHH]DUHH H}HuH}H}HEHuH9H ]@UHH}H}H]f.DUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}HH]f.UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]0C0E0C0Eoo(5 &&L=,0([ &&L=,0([ &&L=,aa; &&L=,  -strlenstrlen(s) - Returns the length of the string s.touppertoupper(s) - Converts the string s to uppercase characters.tolowertolower(s) - Converts the string s to lowercase characters.str2dblEval/Users/jgomez/muparserx/parser/mpFuncStr.cppa_iArgc==1%lfstr2dbl(s) - Converts the string stored in s into a floating foint value.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup9FunStrLenEN3mup13FunStrToUpperEN3mup13FunStrToLowerEN3mup11FunStrToDblEHPpAp@`^iAp#H@AP+K`iA#@H@A0iA#H @ LA    iA` #  (  (0 P (  ( ? Sp ? ? ?0PpO1@`$O#@`'*@`<9A PO1$0 @#pO' @zRx $HAC $DAC zPLRx ,$AC $xAC $pAC $ h^AC $4AC ,i AC $#AC $HAC $AC ,@sAC $4AC $\x+AC $KAC $AC $AC ,iAC $,#AC $THAC $|AC ,<@AC $AC $AC ,iAC $T@#AC $|HHAC $pAC ,dhLAC $AC $$AC $LxAC , pioAC $#AC $AC $(AC $AC $D(AC $lAC $(AC $AC $(AC $ ?AC $4SAC $\?AC $ ?AC $8?AC $PAC $HAC $$@AC $L8AC $t0OAC $X1AC $pAC $h$AC $ pAC $< hAC $d POAC $ x#AC $ AC $ x'AC $ AC $, xAC $T `AC $| XAC $ @AC $ 8*AC $ @AC $ 8AC $D 0<AC $l HAC ,, @9_AC $ PAC $ XOAC $ 1AC $< $AC $d AC $ AC $ #AC $ AC $ pOAC $, AC $T 'AC $| AC $ AC 10- /---.----Y,-Q+-!*--)-(-a-Ky-B-1'-j-%-$-#-#-)"-!- -}-q-Q-)-----q-Q-----s-s-as-As-fS- g S- h S-: |=3 o- i S- }- 9- :-n }-e A-A B- }- I- J- }- Q- R-y 6-S k-J }-) 4- ~-  - - k-} w-b w-) Z- -  - x- [- - - z s 1 7- fr->-k-}-i<-L~--k-w-w-w-w-nZ-`v-<-71= ---v-[-?-sglr-b)F-k-}-D-~-o-M -2-% - - - - - - -q-Jk-Aw-8w-w-w-Z-v--2=-p-`-Tv-/[-G-hr-N-ck-Z}-9L-~--q-6k--w-w-Z--v-[-aO-3i,r-"0z(b {zc{zd{ze{U3n89mlqxppuht`TX^HW@;8n0@(A mlqputV_YCnHImlqputXx`h]`KXnPPHQ@m8l0q(p ut\a ` @       ` @   `@ `@ `@ `@ `@ `@ `@80 xp`@ `XP@ {MD`&p,Pq@O`{^1   " @8O@`@J`YG%  PKA  g  0Mxp( @` @ `      i  l SI  @v P  0  pi p   6  9 Ppp P   R  U 0.   I0sj@IpP0. c@{  ", o/ 1d  H   [__ZSt9terminatev__ZdlPv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNSt3__111__wrap_iterIPcEppEv__ZNK3mup9ICallback9AsciiDumpEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5beginEv__ZN3mup9ICallback11AsICallbackEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__111__wrap_iterIPcE4baseEv__ZNK3mup13FunStrToLower5CloneEv__ZNK3mup13FunStrToUpper5CloneEv__ZNK3mup9FunStrLen5CloneEv__ZNK3mup11FunStrToDbl5CloneEv__ZNKSt3__111__wrap_iterIPcEdeEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE3endEv__ZNK3mup13FunStrToLower7GetDescEv__ZNK3mup13FunStrToUpper7GetDescEv__ZNK3mup9FunStrLen7GetDescEv__ZNK3mup11FunStrToDbl7GetDescEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup13FunStrToLowerD2Ev__ZN3mup13FunStrToUpperD2Ev__ZN3mup9FunStrLenD2Ev__ZN3mup11FunStrToDblD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup13FunStrToLowerC2Ev__ZN3mup13FunStrToUpperC2Ev__ZN3mup9FunStrLenC2Ev__ZN3mup11FunStrToDblC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup13FunStrToLowerD1Ev__ZN3mup13FunStrToUpperD1Ev__ZN3mup9FunStrLenD1Ev__ZN3mup11FunStrToDblD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup13FunStrToLowerC1Ev__ZN3mup13FunStrToUpperC1Ev__ZN3mup9FunStrLenC1Ev__ZN3mup11FunStrToDblC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup13FunStrToLowerD0Ev__ZN3mup13FunStrToUpperD0Ev__ZN3mup9FunStrLenD0Ev__ZN3mup11FunStrToDblD0Ev_memset___tolower___toupper___assert_rtn__Znwm__Z7toloweri__Z7toupperi__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup13FunStrToLower4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13FunStrToUpper4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9FunStrLen4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11FunStrToDbl4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch_sscanf___clang_call_terminate__Unwind_Resume__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__1neIPcEEbRKNS_11__wrap_iterIT_EES6___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__1L9transformINS_11__wrap_iterIPcEES3_PFiiEEET0_T_S7_S6_T1___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__111__wrap_iterIPcEC2ES1___ZNSt3__111__wrap_iterIPcEC1ES1___ZN3mup13FunStrToLowerC2ERKS0___ZN3mup13FunStrToUpperC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9FunStrLenC2ERKS0___ZN3mup11FunStrToDblC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup13FunStrToLowerC1ERKS0___ZN3mup13FunStrToUpperC1ERKS0___ZN3mup9FunStrLenC1ERKS0___ZN3mup11FunStrToDblC1ERKS0___ZTVN3mup13FunStrToLowerE__ZTSN3mup13FunStrToLowerE__ZTIN3mup13FunStrToLowerE__ZTVN3mup13FunStrToUpperE__ZTSN3mup13FunStrToUpperE__ZTIN3mup13FunStrToUpperE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN3mup9FunStrLenE__ZTSN3mup9FunStrLenE__ZTIN3mup9FunStrLenE__ZTVN3mup11FunStrToDblE__ZTSN3mup11FunStrToDblE__ZTIN3mup11FunStrToDblE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZNSt3__1eqIPcS1_EEbRKNS_11__wrap_iterIT_EERKNS2_IT0_EE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table28GCC_except_table7GCC_except_table17GCC_except_table24GCC_except_table2GCC_except_table32GCC_except_table71GCC_except_table21GCC_except_table11___gxx_personality_v0 #1/28 1573634231 501 20 100644 50108 ` mpICallback.cpp.o xcc__text__TEXTo1fY__gcc_except_tab__TEXTp14__const__DATA2(5qM__cstring__TEXT58__const__TEXT69__compact_unwind__LD87P:s__eh_frame__TEXTJMy h2  y9 P7OUHHpH}uHUMHUuH}HEH}HLEuLHUHEH}uHUH}H=HHEH8H@@MHH@LHp]ÉHEMH}H} DUHHH}HuH}HuH]f.UHHH}H}H]DUHH} fDUHH} fDUHH}HE]fUH1H}]@UHHH}H}H@4H}H=64H594H a4OHEH@@H]UHH}uH}uwH]fUHH}H}GH]f.DUHH H}HuHuH}4HuH=3H53H 3lHEHMHA@H ]f.UHHHHuHuHHHHHHHHHH5H4HHHH5 3HH5HHHHHH5HHHH52HxHtHxtHhHH5L2H`HHXH`HXHPH52HPHHHH51H@H<H@<H0H51H0H(HpLH(H H5d1H HHH5@1HHHHHH]ÉHHH DUHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHHH}H}JH}EHH]ÐUHH H}HuH}HuH}HH}HEH}HuHH ]fUHHHHuHuHHEHEH]fDUHHH5H}H}H}HuHƀHH]UHH}uH}uwL]fUHH}H}HH}HEHHM HEHLME]UHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHH H}H}H}H}H ]HHUPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=vHMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHU CCSXHHJUUY  UU `[  -1& )A 3$ " E ##_B:  G+9 Cp@@h@h@ppGetParent/Users/jgomez/muparserx/parser/mpICallback.cppm_pParentSetParenta_pParent [addr=0x; pos=; id=""; argc= (found: )]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup9ICallbackENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEAp1#   0 @]eP A1`A1pBG/@/pG*90P8A ip   (   @ C ( W Z @A1 @#p#2@*p"@O`1' @Pp L $Pp%VOPp#u "Pp$M( Gp1$ @ P7A1P!U+0KU9A1POA1!!9A 20$#`$$g$%!@%`%7%,%&&<@&QA82&&&|AH2`'"'+'$'+ )@)3)#)))*C`*#*2+C ,0,#`,#,/,2-'0-e-'--/ .2`./..../0/P/`//[/dAX2P0p0#0?01 1OAh2zPLRx ,$ AC zRx $#AC $DAC $l AC $p AC $XAC $@ AC $ (]AC $4`AC $\XAC $PeAC , AC ,,xAC $ XBAC $4GAC $\/AC $/AC $GAC $*AC $9AC $$AC $L8AC $tAAC $8AC $0iAC $xAC $pAC $<h(AC $dpAC $hAC $`AC $XCAC $(AC $,WAC $TZAC $| AC $AC ,hAC $AC $$#AC $L#AC $t AC $AC $AC $2AC $ *AC $<(AC $d "AC $(@AC $@AC $(OAC $P1AC $,hAC $T`'AC $|hAC $`AC $HAC $@AC $ (AC $D AC $l AC $ AC $ AC $ LAC $ $AC $4 AC $\ %AC $ VAC $ HOAC $ pAC $ h#AC $$ puAC $L "AC $t AC $ $AC $ MAC $ (AC $ GAC $< (AC $d AC $ 1AC $ 0$AC $ 8AC $ 0 AC $, 7AC , 0WAC $ !AC $ AC $ UAC $ +AC $$KAC $L(UAC $t`AC ,X9#AC $xOAC $AC $AC ,AC $tPAC ,H9gAC $X#AC $`AC $XgAC $DAC $l!AC $AC $7AC $,AC $ &AC $4<AC ,QAC $AC $AC ,,|OAC $ H"AC $4P+AC $\X$AC $`+AC $hAC $`3AC $x#AC $$AC $LxAC $tpAC $hCAC $#AC $2AC $CAC $<AC $d#AC $#AC $/AC $2AC $'AC $,eAC $T@'AC $|HAC $@/AC $H2AC $`/AC $hAC $D`AC $lXAC $PAC $HAC $@AC $ 8AC $4 AC $\[AC ,PdAC $AC $#AC $?AC $,AC $TAC ,OAC k1-Y1?-K1a-0}-0=0-0|-e0->0-50-#0-0=0=0z-/-/y-/x-//v-A/w-/v-.u-}.A-A.A- .A--t--s-`-r--q--A-,A-,p-,\-y,o-E,m- ,n-+m-+4-+-+-j+l-]+k-I+j-8+i- +h-+g-+f-*e-*-*d-*c-y*b-I*-8*a-)`-)_-)^-i)]-1)\- )[-(Y-(Z-(Y-(-(-(Z-w(Y-^(-J(-1(-'-x'-k'=V'-M'-/'-'W-'V-&-&U-&-g&S-2&-!&2-%R-'%Q-$P-$-$-I$O-!$-#M-#K-k#-V#- #K-"-"L-"K-A"J-!-!-!-!-n!-d!-J!-A!-!H- G- - F-> E-# D-C--B-aA-K-B-5-#?-2->-=-=-g-S-<-=g;-E-<-9-8-r=k7-16- -5-4--3-]-M-<2-1-)-a)-1)---0-=/-+.-&---&-----1,-+-*-)-)-q)-M(-;'-%&--%-$-Y#- -!--- -m-W-O-C- ------|-`----------k-a-*- --------g-_-C-3-------y-g-_-F-9--------J-- - - - - -u -b -5 - - - - -| -O -B -& - - -j -< - - - - -y -m -K =1 - - - - - - -_ -H --- -=----[ -+ ---a-X-F-*=  -= -== -U-I-- -----o-R-:-5------q-lR-F3----=--*- -|un----d]-O-?- xph`X@80ph`H@80( xph`XPH@80( xp`@ `@ `@ `@ `@ `@80       ` @       x p ` @ 8 0         ` @         ` @       ` @   `@ `@ `@ `@ `@ `@ `@ xp`@ `@ M&p9p1& X!`/o1/@391kP3!P 91p 7  $@T f *pv*@"  3PppBP*p\(81, `'{w. V-@  P: p.+9pL O@7/481!30P 91D!20$`$= $ $s %81 @%`% %%%9 22@&'&T '$&s &F982V &0`'''8H2 )+@)&,))9+*+ 1J )))`*(+ -`, ,<,#-0-U-`-%- .`.N0 ,)0,\/.-.p%0/[`// 0-. /V.P/a&/9P0x'p09X2C'0T18h2q  "0#. 0@0"TP&PV'!2(#PO%  %.&t#)* ="@$#p I @ o,!%  &p4p+3P41324F/275640/6c7666>63/27553 p  f $@$1 Q8L 7 8: 017^';-$x$'L8V-n"g0s5 mW1kXm T/5V5!55.041)e2##.GZ9*__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup9ICallback14GetArgsPresentEv__ZN3mup9ICallback9GetParentEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup9ICallback9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup9ICallback11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup6IToken7GetCodeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNK3mup9ICallback7GetArgcEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup6ITokenD2Ev__ZN3mup9ICallbackD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZNSt12length_errorD1Ev__ZN3mup9ICallbackD1Ev__ZNSt3__16localeD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup9ICallbackD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZN3mup9ICallback17SetNumArgsPresentEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZN3mup9ICallback7SetArgcEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZTVN10__cxxabiv120__si_class_type_infoE__ZTIN3mup6ITokenE__ZTVN3mup9ICallbackE__ZTSN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L3hexERNS_8ios_baseE__ZNSt3__1L3decERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZN3mup9ICallback9SetParentEPNS_11ParserXBaseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup10g_sCmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup6ITokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table98GCC_except_table37GCC_except_table156GCC_except_table85GCC_except_table114GCC_except_table93GCC_except_table12GCC_except_table11GCC_except_table111___gxx_personality_v0GCC_except_table0GCC_except_table150GCC_except_table100 #1/20 1573634232 501 20 100644 56044 ` mpIOprt.cpp.o xqq__text__TEXTO8t__gcc_except_tab__TEXTP8h;__const__DATAp9H<__cstring__TEXT>pA__const__TEXT0?HB__compact_unwind__LD8@PCЅ__eh_frame__TEXTUY h2  $X< P~~TRUHH0H}HuUMHuHHU Huι1H}HPHH}HH}HHHHH}HHWPMOXMO\H0]f.DUHHHH}H}H]@UHHH}H}HHPH}HHEHH]f.UHH}]fDUHH} fDUHH}H}Hǰ]f.UHH} fDUHH}H}Hǰ]f.UHHHHuHuHHHHHHHHHH5H4HHHH5<HH5HHHHHH5HHHH52<HxHtHxtHhHH5;H`HHXH`HXHPH5;HPHHHH5y;H@HHHIhHщ<H@<H0HH5&;H(H$H($HHH5:HHHHHH]ÉHHH f.UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHHH}H}JH}EHH]ÐUHH H}HuH}HuH}HH}HEH}HuHH ]fUHHHHuHuHHEHEH]fDUHHH5H}H}H}HuHƀHH]UHH}H}GX]f.DUHH}H}Hǰ]f.UHH}H}G\]f.DUHH}H}Hǰ]f.UHH}H}HPH]f.UHH H}HuHuHHUHuƹHHH}HH ]UHHH}H}H]DUHH} fDUHH} fDUHHHHuHuHHHHHHHHHH5H4HHHH55HH5HHHHHH5HHHH5"5HxHtHxtHhHH54H`HHXH`HXHPH54HPHHHH5q4H@H<H@<H0HH5%4H(HHHHH]ÉHHH DUHH0H}HuUHuHHUHuƹ1H}HPIH}LH}HHHǐHLEIIxPEA@XH0]UHHH}H}HHPH}HHEHH]f.UHH} fDUHH}H}Hǰ]f.UHH} fDUHH}H}Hǰ]f.UHHHHuHuHHHHHHHHHH5H4HHHH51HH5HHHHHH5HHHH5B1HxHtHxtHhHH50H`HHXH`HXHPH50HPHHHH50H@H<H@<H0HH5E0H(HHHHH]ÉHHH DUHH}H}HPH]f.UHH}H}GX]f.DUHH}H}Hǰ]f.UH1H}]@UHH}H}Hǰ]f.UHH} fDUHH} fDUHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=KHMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUHHJUUYHHJHHJ  UU `[  -1& )A 3$ " E ##_B:  G+9 CPPp@@h@h@pp [addr=0x; pos=; id=""; prec=; argc=]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup8IOprtBinEN3mup11IPrecedenceEN3mup12IOprtPostfixEN3mup10IOprtInfixENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE5   @ PpAP8Ad8BG0/`/G*9PpH@` p A|80  5  0 @ ` A80Pp   A0i(0PpC(WPZ pA8Pp##02p*"@0@O1' @Pp LP$%V0 O  # uP!"!!$!M "(P"7"A8P#!##U$+0$K$U$%9A8@%p%O%1&$0&P& `&&&A8(((9A9+#@+`+g++! ,@,7,,,&,< -QA,9---|A<9@."p.+.$.+0 03`0#0000C@1#p122C33#@3#p3/323'4e4'44/52@5/p55555606@6`6[6dAL907P7#7?778OA\9zRx $AC $D`AC $lX5AC $p AC $X AC $@AC $ 8 AC $4 AC zPLRx ,$AC ,TجAC $BAC $GAC $,/AC $T/AC $|GAC $@*AC $H9AC $`AC $XAC $DPAC $lHAC $@AC $8HAC $`AC $ X AC $4@ AC ,(AC $AC $5AC $( AC $AC $, AC $TAC ,$AC $hAC $`AC $XAC $$P AC $L8AC $t0 AC $ AC $AAC $(AC $ iAC $<hAC $d`AC $X(AC $`AC $XAC $PAC $,HCAC $Tp(AC $|xWAC $ZAC $ AC $зAC ,X{AC $L AC $t #AC $ #AC $ AC $ AC $ AC $< 2AC $d *AC $ AC $ "AC $ @AC $ 0AC $, OAC $T @1AC $| XAC $ P'AC $ XAC $ PAC $ 8AC $D 0AC $l AC $ AC $ AC $ AC $ ػAC $4 лLAC $\ $AC $ AC $ %AC $ VAC $ 8OAC $$`AC $LX#AC $t`uAC $"AC $AC $$AC $MAC $<(AC $d7AC ,4#AC $!AC $AC $ UAC $4н+AC $\ؽKAC $UAC $8AC ,|09AC $@AC $,HOAC $Tp1AC $|$AC $AC $ AC $pAC $hAC ,PAC $t AC $AC ,l9CAC $ #AC $(AC $D gAC $lhAC $`!AC $hAC $`7AC $ x,AC $4&AC $\<AC ,,QAC $AC $AC ,|+AC $4"AC $\+AC $ $AC $(+AC $0AC $(3AC $$@#AC $LHAC $t@AC $8AC $0CAC $X#AC $`2AC $<xCAC $dAC $#AC $#AC $/AC $2AC $,'AC $TeAC $|'AC $AC $/AC $2AC $(/AC $D0AC $l(AC $ AC $AC $AC $ AC $4AC $\AC $[AC ,TdAC $XAC $P#AC $,X?AC $TpAC $|hAC ,L`OAC K8-98:-+8`-7|-7=7-i7{-E7-7-7-7 -6=6 =6y-6-6x-6w-66u-!6v-5u-5t-]5=-!5=-4=-4s-4r-@4q-3p-3=-3=-3o-3[-Y3n-%3l-2m-2l-2>-2-j2-J2k-=2j-)2i-2h-2g-1f-1e-1d-1-1c-1b-Y1a-)1-1`-0_-0^-y0]-I0\-0[-/Z-/X-/Y-/X-/-/-l/Y-W/X->/-*/-/-.-X.-K.=6.--.-.--V--U----T-m--G-R----9-,Q-,P-+O-+-u+-)+N-+-*L-*J-K*-6*-)J-) -)K-z)J-!)I-(#-(-o(-\(-I(-.(-$(- (-(-'G-'F-'-a'E-&D-&C-&B-&-q&A-A&@-&"-%?-%>-%=-k%-b%-Q%<-5%-#%:-%9-$8-$7-$=$-g$-S$-#6-#=g#5-E#-<#-"3-"2-r"=k"1-!0-!(-!(-a!(-5!- - /-m .-[ --E %-,-%--.---a+-1*- )-(-(-(-}'-k&-U%-"-$-#-"-9-) -- -----s-=-/-- - ----]-(---------Z-<---%- -------s-c-B-8- -------v-i-]-E-5----z-6-)-------e-K-+-----r-V-I- --l-E-,-----{=a-H-"------x---b-------b-J-E+- - - -  - - -| b -V C -$ -  -  - = - -R -" - - -  - "-_ -% - - - - -  - -j -e K -? , - - -  - - -  -v c -D -8 % -  -=--Q-#---?-,-=-- - -{ -K ----x-f-J=*-=-==-p-d-9-(- -----Z-U;-/------r-fS-4-(--=--b-2---=b[-R"-2-@ 80   x`XP80(h`XPH@80( hXH@ 0(    xph`X~PH@80(xph`XPH@80( !`@ !`@ `@ `@ `@ xp!`@ !`@ !`XP!@     ` @ 8 0 !      ` @ 8 0 !      ` @       ` @       ` @   `@ `@ !`@ `@ `@80! `XP!@ `@ `@80! !`@ k!M#2042`q;P8NP"6";$P#l;d83" 0 ;|8A<8"FP$pA  ,0 l,pu%B#P! , R* ;8=@.0 5 m0P@/pM P! !j !0! - "#O7#~$;8#$60$$%@% p%<8D%`&q&/0&2P&J&(5+T@+ `+0+ #+<8  ,!@,x',",;95 -)-".2', -~;,9 -q3@.)p.T<<90- 0.`00/-0-800+@1*2/@3 p333} 444 (475) @5#33+3a25/5'6@@6`6W7/5 5L006(607n)P7;L99)77-<\9 $0 {0 X ; )Ap` @i1@Tp 0 ` m P. p.$(*%&'P e(p5((&+p1O"$p%zcPpe.($m0&(7K6`=4<=5=Q1;74@;1;62P;:>9>91?4@?0`?!20?:?9?^9<!1:4;0 : 2p9<:>9<t\@ 9 P } P@ p0t&`%&36;|  ^ $j5 j KP4T)q&&)o?KL/@%Zfe3? ! I!q6w4m"TK28v8A88111 38(eP&c&!Gh<__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZThn80_NK3mup10IOprtInfix16GetAssociativityEv__ZNK3mup10IOprtInfix16GetAssociativityEv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup12IOprtPostfix9AsciiDumpEv__ZNK3mup10IOprtInfix9AsciiDumpEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup9ICallback11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZThn80_NK3mup10IOprtInfix6GetPriEv__ZNK3mup10IOprtInfix6GetPriEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup6IToken7GetCodeEv__ZN3mup10IOprtInfix13AsIPrecedenceEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNK3mup9ICallback7GetArgcEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12IOprtPostfixD2Ev__ZN3mup10IOprtInfixD2Ev__ZN3mup8IOprtBinD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup11IPrecedenceD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup11IPrecedenceC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12IOprtPostfixD1Ev__ZThn80_N3mup10IOprtInfixD1Ev__ZN3mup10IOprtInfixD1Ev__ZNSt12length_errorD1Ev__ZThn80_N3mup8IOprtBinD1Ev__ZN3mup8IOprtBinD1Ev__ZNSt3__16localeD1Ev__ZN3mup11IPrecedenceD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup12IOprtPostfixD0Ev__ZThn80_N3mup10IOprtInfixD0Ev__ZN3mup10IOprtInfixD0Ev__ZThn80_N3mup8IOprtBinD0Ev__ZN3mup8IOprtBinD0Ev__ZN3mup11IPrecedenceD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup10IOprtInfixC2EPKci__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZN3mup12IOprtPostfixC2EPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZTVN3mup12IOprtPostfixE__ZTSN3mup12IOprtPostfixE__ZTIN3mup12IOprtPostfixE__ZTVN3mup10IOprtInfixE__ZTSN3mup10IOprtInfixE__ZTIN3mup10IOprtInfixE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv121__vmi_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IOprtBinE__ZTSN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTIN3mup9ICallbackE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L3hexERNS_8ios_baseE__ZNSt3__1L3decERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup10g_sCmdCodeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table9GCC_except_table129GCC_except_table8GCC_except_table168GCC_except_table118GCC_except_table97GCC_except_table56GCC_except_table26GCC_except_table115GCC_except_table105GCC_except_table174GCC_except_table33GCC_except_table132___gxx_personality_v0#1/20 1573634232 501 20 100644 1596 ` mpIPackage.cpp.oX x__text__TEXTJxX__const__DATAPH`__const__TEXT__compact_unwind__LD __eh_frame__TEXT( h2   P PUHHHH}H}H]@UHH}]fDUHH} fDUHH} N3mup8IPackageE 0 @ zRx $AC $D AC $l AC $ AC @80( `@ C@-0 PmY__ZN3mup8IPackageD2Ev__ZN3mup8IPackageC2Ev__ZN3mup8IPackageD1Ev__ZN3mup8IPackageD0Ev___cxa_pure_virtual__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IPackageE__ZTSN3mup8IPackageE__ZTIN3mup8IPackageE #1/20 1573634232 501 20 100644 54708 ` mpIToken.cpp.o xnn__text__TEXT5qj__gcc_except_tab__TEXT5\8__const__DATA7(:8}X__cstring__TEXT:Q=__const__TEXT:>__compact_unwind__LD;`>__eh_frame__TEXTR0U h2  XD= PQFUHHPH}HuH}HuHH@HMH}HHMH}HuHEH}HEHP]ÉHEЉMH}H} f.UHH H}HuH}HuH}HH}HEH}HuHH ]fUHH HHH}uH}HuwHHH}HHE@(H@0@8H ]fDUHHH}H}H]DUHH HHH}uH}HuwHHH}HHHE@(H@0@8H ]UHHHHH}H}HHH]UHH} fDUHH} fDUHH@H}HuHuH=H>HHH}HuHuFHuЉFH}HHMH}HHuHEHEH8HEЉH8HUJ(H(H@0H@]ÉHEMH}H} UHH}H}HG0]f.UHHH}H}HH} HEHHQ@H]f.DUHHHHuHuHHEQHEH]fUHH}H}G(]f.DUHH}uH}uw(]fUHH}H}G]f.DUHH}H}HH]f.UHH H}HuHuH}HH}HHuHEH ]f.UHHpHHuHuHHHHHHHPH H4HHHHHHHHHHp]ÉHHHHH UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHHHHuHuHHEHEH]fDUHHH}H}H]DUHHH}HuH}HuH]f.UHHH5H}H}H}HuHƀHH]UHH}H}HG0HHG0]fDUHH}H}HG0HHG0]fDUHH}H}HG0]f.@UHH}uH}u w8w8]fDUHH}uH}w8#u;u$]f.@UH1H}]@UH1H}]@UH1H}]@UHH}Hu]fUHHPH}uH}uHEH}HljuHHEH}uHUH}H=HHEH8HP]ÉHEЉMH}H} f.UHHH}uH}uH]f.DUHHPH}uH}uH1HMH}HωuHHMH}uHUH}H=HHEH8HP]ÉHEЉMH}H} fDUHHH}uH}uH]f.DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}HuH}HuH]f.UHH0H}Hu@HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHHHuHuHHHHHHHHHH5H4HHHH5.HH5HHHHHH5.HHHHHHHĀ]ÉHHH UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DPH$UHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHH H}H}H}H}H ]HHUUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}H]DUHH}HE]fUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH H}HuHuHHuHuH}HuH}HuHH ] 00 Y=9 H\L__$vUUY 00f@C 77mGC &&L=,HHJ 1& )A 3$ " E ##_B:  - UU `[  G+9 Cp@@h@h@pp [addr=0x]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup6ITokenEN3mup12GenericTokenENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEvA5GZ0P]-  A51'@`6A5 A50B*#9@`"    0A5!A6 !   ( ?` # iA6 oA(6p G / i`   (  0C(WZp 0A<60#`#20*`"@OP1'0@` L$@`%VO@`#u"@`$M(A`AT6!!9A6##$0$g$$!% %7`%,%&%<& &1`&$&& &QA6 '@'`'|A6'"(+@($p(9A6(O) )0)7p)A60*!`**U*++K`+U+++-0-3p-#---.CP.#.2/C0 0#P0#0/020' 1e1'11/22P2/22223 3@3P3p3[3dA6@4`4#4?445OA6`5GzPLRx ,$vWAC zRx $GAC $D ZAC $lXAC $P]AC $-AC $ AC $ x AC ,`AC $dAC $خ1AC $'AC $AC $AC $,AC $TAC $|خ6AC ,AC ,$AC $BAC $,*AC $TAC $|#AC $9AC $AC $AC $AC $DAC $l"AC $ AC $ذ AC $ AC $ AC ,GAC $d!AC ,AC $X!AC $`AC $ XAC $4P(AC $\X?AC $p#AC ,xiAC ,,oAC $ GAC $4 /AC $\(iAC $pAC $hAC $`(AC $hAC $$`AC $LXAC $tPCAC $x(AC $WAC $ZAC $ AC $< طAC , `[AC $ AC $ #AC $ #AC $ AC $4 AC $\ AC $ 2AC $ *AC $ AC $ "AC $$ @AC $L 8AC $t OAC $ H1AC $ `AC $ X'AC $ `AC $< XAC $d @AC $ 8AC $ AC $ AC $ AC $, AC $T AC $| ػLAC $ $AC $ AC $ %AC $VAC $D@OAC $lhAC $`#AC $huAC $"AC $ ȼAC $4$AC $\ȼMAC $(AC $AAC $ AC ,LAC $,AC ,9AC $#AC $AC $gAC $8AC $$0!AC $LHAC $t@7AC $X,AC $`&AC $h<AC $AC $<x1AC $d$AC $AC $ AC ,,xQGAC $ AC $4AC ,|AC $"AC $+AC $$AC ,T9?AC $4OAC $\8AC $0AC $7AC ,$0AC $!AC $,AC $TUAC $|+AC $KAC $(UAC $`AC $X+AC $D`AC $lX3AC $p#AC $xAC $pAC $ hAC $4`CAC $\#AC $2AC $CAC $AC $#AC $$#AC $L/AC $t2AC $'AC $eAC $8'AC $@AC $<8/AC $d@2AC $X/AC $`AC $XAC $PAC $,HAC $T@AC $|8AC $0AC $AC $[AC ,lHdKAC $LAC $t#AC $?AC $AC $AC ,dOcAC $DGAC 5-5-|5I-[5-I5T-;5f-4-4=4-y4-U4-.4-%4-4- 4=4=3-3-3~-3}-33{-13|-2{-2z-m2V-12V-1V-1y-1x-P1w- 1v-1V-0V-0u-0a-i0t-50r-/s-/r-/K-/-z/-Z/q-M/p-9/o-(/n-/m-/l-.k-.j-.-.i-.h-i.g-9.-(.f--e--d--c-Y-b-!-a-,`-,^-,_-,^-,"-,-|,_-g,^-N,-:,-!,-+-+-+=~+-G+-3+-*]-g*=G*\-%*-*-)Z-)Y-R)=K)X-)W-(V-(-(T-(I-Z(-'-'='-'-'-'R-'Q-'-1'P- '-&N-&M-z&-G&L-;&K-&J-%-%I-%H-$-$-$G-q$F-V$-E$-#E-#-#C-{#A-#-#-"A-"-"B-J"A-!@-p!-_!-L!-9!-!-!- - - >- =- -Q <-;-:-9--48-7-q/-Q/-!/---y6--5-4-,-3-,-{----!2-1-0-/-/-a/-=.-+--,--y+-q*-I)--'---y&-]-G-?-3--%----{$-l#-P-------|-o-[-Q---------z-W-O-3-#-------i-W-O-6"-)----"---:!-------e-R-%- ----l-?-2-- --Z-,-----i-]-;=!-- - - - -r -O -8 - -i -] -2 -! - -  - -  -  -v =Z -= - - - - -y -J C - - - - - -t -k -H A -3 -# - ---z-l-\-/-- =---h-X-!---= -= -x=I=B ------ ---`-W==----X-.---[A-----p-g-K-9-xp`XPH@80(    x p hPH@  xph`XPH0( xphXPH@80( @80 xp`@ `@ `@ `@ `@ xp`@ `XP@ `@     ` @           ` @       ` @       ` @       ` @   `@ xp`@ `@ xp`XP@ xp`@80 `@ `XP@80 `@ `@ M=5 `q 80p(;5 "  ^'E<50)5p)T"0*<5'`5~<5X<6<61 ~3p k<(6L $0Y  +`n+0l#[!3@``@+`(;<6- P,o/.0 @ `/ , `!4#$c 0$`$$!$<T6 % %o%`%0 %<64&(`'!@()%%&V &`&&&  '0=6y @'=2''(<6 (1<6) )`*>6***<6!`+5+-,0--p-I-1,.,5 -U-)P.(/.P0y 00(0 111&1P2BP210* 0L12.2% 3 P3p3 4.2U 3N/@3&3@4'`4<6'44 <63 : 0` 2:0/ }  2 3#` f ;  Q#  .;2g:P/M1+   @; ` ! @K ] #[+"($@% \&2&+#M*.h "0#p/~0g-! `3 &06:5@938,4907079:890;0:r9p;8 ;M8p8|0p707+9987@ `   k$$$2?3'c$$K(%+* N.&t2$b_f3Xm aT7e7077U0+017(J\deG$Z$G=w__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup12GenericToken9AsciiDumpEv__ZNK3mup6IToken9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup6IToken11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZN3mup6IToken8ResetRefEv__ZNK3mup6IToken6GetRefEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup6IToken8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup12GenericToken5CloneEv__ZNK3mup6IToken7GetCodeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12GenericTokenD2Ev__ZN3mup6ITokenD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZNSt12length_errorD1Ev__ZN3mup12GenericTokenD1Ev__ZN3mup6ITokenD1Ev__ZNSt3__16localeD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup12GenericTokenD0Ev__ZN3mup6ITokenD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNK3mup6IToken9IsFlagSetEi__ZN3mup6IToken10SetExprPosEi__ZN3mup6IToken8AddFlagsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZN3mup12GenericTokenC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup12GenericTokenC1ERKS0___ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup12GenericTokenE__ZTSN3mup12GenericTokenE__ZTIN3mup12GenericTokenE__ZTVN3mup6ITokenE__ZTSN3mup6ITokenE__ZTIN3mup6ITokenE__ZN3muplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_6ITokenE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L3hexERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup10g_sCmdCodeE__ZN3mup12GenericTokenC2ENS_8ECmdCodeE__ZN3mup6ITokenC2ENS_8ECmdCodeE__ZN3mup12GenericTokenC1ENS_8ECmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12GenericTokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6ITokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12GenericTokenC1ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken8SetIdentERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table59GCC_except_table8GCC_except_table178GCC_except_table18GCC_except_table127GCC_except_table17GCC_except_table35GCC_except_table43GCC_except_table33GCC_except_table123GCC_except_table103GCC_except_table172GCC_except_table42GCC_except_table132GCC_except_table101___gxx_personality_v0GCC_except_table0GCC_except_table120 #1/28 1573634233 501 20 100644 3252 ` mpIValReader.cpp.o (__text__TEXTH __const__DATAH__cstring__TEXT0G__const__TEXTH__compact_unwind__LD@` __eh_frame__TEXT h2  ( 8 ` P UHHHH}H}HHG]f.fUHH}]fDUHH} fDUHH} fDUHHHH}HuHuHHEH@HF]@UHH H}HuHuH}4HuH=jH5mH =HEHMHAH ]f.UHH0H}HuHuH~HEH}HEHEH;E 1HM$H}HEHH+EHHHEHEH0]fUHH}H}HGH?H)H]@UHH}HuHuH6H}HHH]f.UHH}H}H]SetParent/Users/jgomez/muparserx/parser/mpIValReader.cpppTokenReaderN3mup12IValueReaderE$0 @ P `,ew#zRx $$AC $D AC $l AC $ AC $,AC $eAC $ wAC $4pAC $\h#AC $pAC e -]-&- --g  @ 80(   `@ J8`P@0 '6__ZNK3mup8TokenPtrINS_6ITokenEE3GetEv__ZNK3mup11TokenReader9GetTokensEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4sizeEv__ZN3mup12IValueReaderD2Ev__ZN3mup12IValueReaderC2Ev__ZN3mup12IValueReaderD1Ev__ZN3mup12IValueReaderD0Ev___assert_rtn__ZNK3mup12IValueReader12TokenHistoryEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEixEm___cxa_pure_virtual__ZN3mup12IValueReaderC2ERKS0___ZN3mup12IValueReader9SetParentEPNS_11TokenReaderE__ZTVN3mup12IValueReaderE__ZTSN3mup12IValueReaderE__ZTIN3mup12IValueReaderE__ZTVN10__cxxabiv117__class_type_infoE#1/20 1573634233 501 20 100644 72188 ` mpIValue.cpp.oX hxh__text__TEXTbxC__gcc_except_tab__TEXTb e__literal8__TEXT(eh__const__DATA0ehd__cstring__TEXTil__const__TEXTj(n__compact_unwind__LDxkn__eh_frame__TEXTx h2  )@;hC PGTUHHPH}HuH}HuHH@HMH}HHMH}HuHEH}HEHP]ÉHEЉMH}H} f.UHH H}HuH}HuH}HH}HEH}HuHH ]fUHHHHuHUHuHUHMHhHH`HHXHPHPH`HHHhHHH}HXH]ÉHxtH}Hx UHH0H}uH}HuH}HHHH}H} @H=2gH52gH Wg` HEMHEH H0]H} f.UHH`H}uHUHUuH}HEH}HHMuHHUHEH}uHUH}H=HHEH8} WH=IfH5IfH nfg HEȉMH}%HEȉMHEH H`]H} f.UHHH}H}H]DUHH} fDUHH} fDUH1H}]@UHH}HE]fUHHHHuHuHHHHHxHHHHшwwȃʃHhd)HHhHcHHVHHHHHXHXHHTT$HH5dHHDžHD@D@9bH<<$HH5dH0DžH,(,(9HHH HHHHHIHHHH HHH  9DHH5cH HHH$HH5bHH9$HH5$bHgH$HH5aHHHHHHHHHWf. QWf.<6Wf.F@Wf.+%HHWf. Wf.DWf. $HH5M`H[f. %HHHH5_HHHHHHHHHHHHx6HH5"_HpHHHHHhHpHhH`H5^H`HXHHHHHPHшOHx^H v^OHEHPHH@HHH5A^H8$HH5"^H0HHHHxH]HH ygUHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH}H}]UHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH}H}G]f.DUHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=[H5[H \iHEHHcuHH0]@UHH H}HuHuH>HHH}Hc?H}HHuHuHEHH ]f.UHH}uH}EH]UHHHHuHuHHEHEH]fDUHHH5H}H}H}HuHƀHH]UHHPH}HuHuH>HXHHXHPEHuH>HHHHHEMU9/HP4H}HPHHHЃžуH@<H H@HcHHPHHHEHH00f.@@ UHPHHHMH9H(HH(H H H$E:HPHHHMH9HHHHHH$EHPHH$HMH9HHH$Ћ9$EEHPHHHMH9HHH9EHPHHHMH9HHH9 EEEHPHHω9z1ҋuHPHH1HMuH9HHHHHH E_EE\ECHpHHH}ΉHHpE3EHPHHЈEHMHHH҈EչxHHuHHH5HHHhdHpRHhdHhdHH}EE$HP]Hh  fRSJf.fUHHH}H}HEMfEEiM EcME$H]DUHH0H}HuH}H}E1Mf.ȈM1+H}H}EMf. ȈEE$H0]@UHH@H}HuH}HEHEH}HEHuH9 EH}HEH}HEH}"H}HuHUMaH}MHEHE9 E2HEHHEHEHHEHEHHEEE$H@]f.UHHPH}HuHuH>HXHHXHPEHuH>HHHHHEMU9/HPH}oHPHHHЃžуH@<HZH@HcHHPHHHMH9H0HH0H(H(H$EHPHHHEHH  f.@@UHPHHHEHHf.ȲMGHPHHHEHHf.@@$EHPHH$HMH9HHH$Ћ9$EEHPHHHMH9HHH9EHPHHHMH9HHH9 EEEHPHHω9z1ҋuHPHH1HMuH9HHHHHHg E_EE\ECHpHHH}ΉHHpE3EHPHHЈEHMHHH҈EԹxHHuHHH5HHHhdHpRHhdHhdHH}EE$HP]Hh  STKf.fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}HuH}Hu4$H]fDUHHH}HuHuH>HHHHEHuH>HHHEMU9/HH}vHHHHЃžуHHHHcHHHHHMH9HHHHHH$E"HHHHEHHf.€UHHH$HMH9HHH$Ћ9$EHpHHH}ΉHHpE3EHHHЈEHMHHH҈EչxHHuHHH5HHHhdHpHhdHhdHH}YHHHHΉHH1DžPEfEiȃ)ʉXE戅TE爅UxHHHpHH5HHpHhdHQHhdHpHhdHE$HĐ]Hh  fVVVVVVVVVVVVVjf.fUHHH}HuH}HuH]ÐUHHH}HuHuH>HHHHEHuH>HHHEMU9/HH}vHHHHЃžуHHHHcHHHHHMH9HHHHHH$E"HHHHEHHf.€UHHH$HMH9HHH$Ћ9$EHpHHH}ΉHHpE3EHHHЈEHMHHH҈EչxHHuHHH5HHHhdHpHhdHhdHH}YHHHHΉHH1DžPEfEiȃ)ʉXE戅TE爅UxHHHpHH5HHpHhdHQHhdHpHhdHE$HĐ]Hh  fVVVVVVVVVVVVVjf.fUHHH}HuH}Hu$H]UHHH}HuHuH>HHHHEHuH>HHHEMU9/HH}vHHHHЃžуHHHHcHHHHHMH9HHHHHH$E"HHHHEHHf.€UHHH$HMH9HHH$Ћ9$EHpHHH}ΉHHpE3EHHHЈEHMHHH҈EչxHHuHHH5HHHhdHpHhdHhdHH}YHHHHΉHH1DžPEfEiȃ)ʉXE戅TE爅UxHHHpHH5HHpHhdHQHhdHpHhdHE$HĐ]Hh  fVVVVVVVVVVVVVjf.fUHHH}HuH}Hu4$H]fDUHHH}HuHuH>HHHHEHuH>HHHEMU9/HH}vHHHHЃžуHHHHcHHHHHMH9HHHHHH$E"HHHHEHHf.€UHHH$HMH9HHH$Ћ9$EHpHHH}ΉHHpE3EHHHЈEHMHHH҈EչxHHuHHH5HHHhdHpHhdHhdHH}YHHHHΉHH1DžPEfEiȃ)ʉXE戅TE爅UxHHHpHH5HHpHhdHQHhdHpHhdHE$HĐ]Hh  fVVVVVVVVVVVVVjf.fUHHH}HuH}Hu4$H]fDUHHH}HuHuH;uHhHhHE$HEHHHЃžуH`\0HH`HcHHEHHHEHHPH}PH(HHhHHHuQxHEsHEHHHHMHHH@HhHHIhHH@H8H8HEH} HEMH}HEHHHhH9H0HHH0HEHEHHHhH9HpЃH(HωL(AHEtxHEH57HMH HHHuHEH5HH HEMHEMH}E H xHƅwH5w6HxHHHHxHƅwH5HH^HEMHEMHxw H HEH]H}  f-!!!!!!!!!!!!q!!p@UHH H}EMH}EMH ]ÐUHHH}HuH}HuH]f.UHHH}uH}uH]f.DUHH}uH}u7]f.UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH}EMH}EEG]DUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DPH$UHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHH H}H}H}H}H ]HHUUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHpH}H}HWH?H)HHH]fUHH}HuHuH6Hk}pHH]UHH}HuHuH~H}H}H~HE]f.UHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H= HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH}H}]f.@UHH}H}G]f.UHH H}HuHUH} EH}HuHUEEH ]UHH@H}HuH}HuH}HHEHUHuH}EEH@]HHUf.UHH`H}HuHuH}HHEHGHEHHuHEH}HEH}H}HEH}HuHEHH}HuEă} EĉE;HEH;E E!HEH;E EEEH`]fUHH0H}H}H}H}HEH}HuHHEHUH0]f.fUHH}H}HG]f.@UHH}H}H]f.DUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}HuHUH}HuHUH ]DUHH}HuHUHUHuH2HuHr]f.UHH H}HuHuHHuHuH}HuH}HuHH ] 00 Y=9 II2{D OOun7@@NRR ;UUY()# ( ) #  D)#x|D)#x|D)#x|D)#x|3 !3[$9e 1& )A 3$ " E ##_B: UU `[  -  G+9 C , J?p@@h@h@ppIValue/Users/jgomez/muparserx/parser/mpIValue.cppa_iCode == cmVAL{, }; } +i"truefalsevoidinternal error: unknown value type.Assignment from void type is not possibleInternal error: unexpected data type identifier in IValue& operator=(const IValue &ref)At/Users/jgomez/muparserx/parser/mpMatrix.hi < (int)m_vData.size()allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup11ParserErrorEN3mup6IValueENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEvAbGA(bAS-S-R-Rl-'R#=Rk-Q-Q-Qi-qQh-Q$= Qg-P-xP-kP=VP-MP-/P-Pe-Pd-O-Oc-O-gOa-!O`-N9-N_-N^-N]-rN-aN\-N[-{M-rM2-WMZ-LY-L-L-yLX-QL-,LV-KT-K-K-;KT-(K-KU-JT-qJS-I-I-I3-I-I3-I-zI2-qI-GIQ-IP-H-HO-nHN-SHM-.HL- H-G-G-G-hG-_G-FK-FC-FC-QFC-%F-E-EJ-]EI-KEH-5E-DG-D-D-D- D-D-QCF-!CE-BD-BC-BC-BC-mBB-[BA-EB-B9-@@-@?-y@>-)@-@<-@1-?-?;-?,-w?3-o?-c?2--?0-?:- ?3->->->9->8->-M>0->0->,-=-=2-=,-=/-=.-=-=-J=-,=.-=-=1-<.-</-<-<.-<-<-<1-c<.-S</-2<-(<-<.-</-;,-;,-;-;-;.-f;7-Y;.-M;1-5;.-%;/-;7-:,-:,-j:6-&:--:4-:3-92-90-91-9/-9/-U9--;9,-9--9.-8--8--o80-b8,-F8/-98.-7-7--\7--57,-7,-6.-6-6-6-k6=Q6-86-6-5.-5-5-5-5 -h5-4+-4*-4)-4-34-3-36-3=3=3-o3'-R3A31-034-3-26-2=2=2-2'-221-1-1-1-h1&-0-0-/-/4-/-/6-/=}/=q/-X/1-.-.-.-.-.4-k.-K.6-?.=8.=,.-.1-------,$-*,-,-+-+-*-*4-*-*6-*=}*=q*-X*1-)-)-)-)-)4-k)-K)6-?)=8)=,)-)1-(-(-(-'"-*'-'-&-&-%-%4-%-%6-%=}%=q%-X%1-$-$-$-$-$4-k$-K$6-?$=8$=,$-$1-#-#-#-" -*"-"-!-!- - 4- - 6- =} =q -X 1-----4-k-K6-?=8=,-1-----*---a-A-!---x4-D-$6-==-1--v-]-- --------F-8---&--4--6-==-n1---------?-,-=---b-I0-?81 -x -h -! - - - = - = -x =I =B - - - - -^ -Y : -5  -   -  -L -G ( - - - - g -6  - --v-@-; ----_-Z*----t-A-<-----Q-/---0---|-/--0---}-U-G-(-----p-g-K-9-"  5xph `XP@80"(* +(),x-pX&P'H0(  h`X@80" !5555555555555555555x5p5h5`5XPH@80( 5`@ 7`@807 xp7`@ `@ `@ `@ `@ xp7`@ 7`@ 77`@     ` @        7 ` X P 7@       ` @       ` @       ` @   `@ `@ 7`@ `@ 7xp7`@807 77`@ 77`@ xp7`XP7@ 7xp7`XP7@ 77M T0TT!H&H+H0H4TCb@  E}B(bXB`h6j7j>0k=j=f70e>xhe=xf6Q5  65%pM%5@b?7?7 @ 80@2y8z)Mi&&!*/@/U34&7/b8Z Q  ;d9!m;"T6<<</=_6567c<&Hmbes-;%%UJ!GB%k__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNK3mup6MatrixINS_5ValueEE7GetColsEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup6IToken9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZNKSt3__17complexIdE4realEv__ZN3mup6IValue11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IValue8ToStringEv__ZNKSt3__17complexIdE4imagEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__117basic_string_viewIcNS_11char_traitsIcEEE4sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4sizeEv__ZN3mup6IValue8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__117basic_string_viewIcNS_11char_traitsIcEEE4dataEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEcvNS_17basic_string_viewIcS2_EEEv__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup6ITokenD2Ev__ZN3mup6IValueD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup6IValueD1Ev__ZN3mup5ValueD1Ev__ZNSt3__16localeD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup6IValueD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error_memcmp___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__117basic_string_viewIcNS_11char_traitsIcEEEC2EPKcm__ZNSt3__117basic_string_viewIcNS_11char_traitsIcEEEC1EPKcm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base9precisionEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__1L12setprecisionEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZNSt3__18__iom_t5C2Ei__ZNSt3__18__iom_t5C1Ei___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__1ltIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__1gtIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__1neIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__1leIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__1geIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareINS_17basic_string_viewIcS2_EEEENS_9enable_ifIXsr33__can_be_converted_to_string_viewIcS2_T_EE5valueEiE4typeERKSA___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__1eqINS_9allocatorIcEEEEbRKNS_12basic_stringIcNS_11char_traitsIcEET_EES9___ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__1eqIdEEbRKNS_7complexIT_EES5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mupmlERKNS_6IValueES2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNK3mup6IValueltERKS0___ZNK3mup6IValuegtERKS0___ZNK3mup6IValueeqERKS0___ZNK3mup6IValueneERKS0___ZNK3mup6IValueleERKS0___ZNK3mup6IValuegeERKS0___ZN3mup6IValueaSERKS0___ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTIN3mup6ITokenE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZTVN3mup6IValueE__ZTSN3mup6IValueE__ZTIN3mup6IValueE__ZN3mup5ValuemLERKNS_6IValueE__ZN3muplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_6IValueE__ZN3mup5ValueC1ERKNS_6IValueE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup6ITokenC2ENS_8ECmdCodeE__ZN3mup6IValueC2ENS_8ECmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IValueC2ENS_8ECmdCodeERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6ITokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt3__1lsIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_RKNS_8__iom_t5EGCC_except_table29GCC_except_table98GCC_except_table178GCC_except_table37GCC_except_table117GCC_except_table55GCC_except_table35GCC_except_table125GCC_except_table4GCC_except_table24GCC_except_table3GCC_except_table33GCC_except_table2GCC_except_table182GCC_except_table172GCC_except_table132GCC_except_table31GCC_except_table11___gxx_personality_v0GCC_except_table0GCC_except_table20GCC_except_table120GCC_except_table10GCC_except_table100#1/28 1573634234 501 20 100644 52140 ` mpIfThenElse.cpp.o xxgxg__text__TEXT2jZ__gcc_except_tab__TEXT2(5__const__DATA03H6`uZ__cstring__TEXT6a:__const__TEXTP7h:__compact_unwind__LD(8@;0x__eh_frame__TEXTLP0~ h2  8~< PDQUHH`H}uH}uH HHMH}HωuHHMH}uHUH}1H}H@HH}HH}H HH€HH}HHW@GHH`]ÉHEЉMH}H} UHHH}HuH}HuH]f.UHHHH}H}H]@UHHH}uH}uH]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH}uH}uwH]fUHH}H}GH]f.DUHHHHuHuHHHHHHHHHHHHHHH5!4HH5HHHHHH5HHHH53HxHtHxtHhHH5b3H`HpHH`HXHH5+3HPHHHHHİ]ÉHHH f.UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuH}HH}HEH}HuHH ]fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHHH}H}JH}EHH]ÐUHHHHuHuHHEHEH]fDUHHH5H}H}H}HuHƀHH]UH1H}]@UHH}H}H]f.UH1H}]@UHH}H}H]f.UHH}H}H@H]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}H]f.UHH}H}H]f.UHH} fDUHH} fDUHH H}HuHuHHEHuHHEH@HuH@HHHHƀHH}HHw@HEHHOHH ]ÐUHHHH}HuHuH]UHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}HH@H}HHEHH]f.UHH}]fDUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHH H}H}H}H}H ]HHUPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHU??O &&L=,HHJUUY  UU `[  -1& )A 3$ " E ##_B:  G+9 C@p@@h@h@pp [addr=0x; pos=; offset=]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup15TokenIfThenElseEN3mup11IPrecedenceENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEA2# !PiA$2#0A42PAH2`GBGP//*9  0P `(0 @ Po A0 P i   (0 P p  C ( WpZ A`2p##0P2*"@P`O1'@`p  Lp$%VPO#up"$M@(p5 G0P1$ 70Ax2! @U+K U9A2O@ ` p A2p""9A2$#% %g%%!%&7@&,p&&&<&QA2@'`''|A2("0(+`($(+))3 *#P*p***C+#0+2p,C,,#-#0-/`-2-'-e@.'p../.2//0/P/p/////0 0[0dA301#@1?111OA3zPLRx ,$AC zRx $x#AC $DAC $lx!AC ,iCAC $#AC $ȳAC $AC ,AC ,AC $GAC $BAC $ضGAC $/AC $</AC $d*AC $9AC $0 AC $AC $ AC $,AC $TAC $|AC $(AC $AC $AC $ض AC $D AC $loAC $ AC $AAC $AC $ iAC $4PAC $\HAC $@(AC $HAC $@AC $8AC $$0CAC $LX(AC $t`WAC $ZAC $к AC $AC ,d@AC $DAC $l#AC $#AC $AC $AC $ AC $42AC $\*AC $AC $"AC $@AC $AC $$ OAC $L (1AC $t @AC $ 8'AC $ @AC $ 8AC $ AC $< AC $d AC $ AC $ AC $ ؿ AC $ AC $, LAC $T $AC $| AC $ %AC $ VAC $ OAC $ HAC $D @#AC $l HuAC $ "AC $ AC $ $AC $ MAC $4 (AC $\ 5AC $ AC $ GAC $ AC $ AC $$1AC $L$AC $tAC $ AC $7AC ,<?AC $!AC $DAC $lUAC $+AC $KAC $UAC $ 8AC ,09 AC $dPOAC $xAC $pAC ,,XsAC $ (AC , 9OAC $d0#AC $8AC $0gAC $xAC $p!AC $,xAC $Tp7AC $|,AC $&AC $<AC ,DQAC $$AC $LAC ,|7AC $ "AC $(+AC $0$AC $8+AC $D@AC $l83AC $P#AC $XAC $PAC $ HAC $4@CAC $\h#AC $p2AC $CAC $AC $#AC $$#AC $L/AC $t2AC $'AC $eAC $'AC $ AC $</AC $d 2AC $8/AC $@AC $8AC $0AC $,(AC $T AC $|AC $AC $AC $[AC ,l(dAC $LhAC $t`#AC $h?AC $AC $xAC ,dpOAC  2-1@-1b-1~-j1=c1-)1}-1 -0-0-0-0=0=0{-0 -q0z-Z0y-U0A0w-/x-/w-/v-/B-.B-.B-.u-].t-.s--r--B--B-I-q-A-]--p-,n-,o-,n-,5-X,-*,- ,m-+l-+k-+j-+i-+h-+g-+f-+-j+e-U+d-+c-*-*b-*a-a*`-9*_- *^-)]-)\-)Z-)[-n)Z-])-P)-,)[-)Z-(-(-(-z(-(- (='-'-'-'X-'W-'-Q'V--'-'T-&-&3-b&S-%R-a%Q-F%-5%-$P-$-$N-k$L- $-#-#L-#-#M-:#L-"K-`"-O"-<"-)"-"-"-! -!-!I-!H-o!-A!G- F- E- D- -Q C- B-- --@-3-?-Y>-E=>---=-'=<---:-q9-= 8-7--w6-k5-A-!4---3--- 2-*-*-*-U--1-0-{/-e'-.-'--N-<-2---Q,--+-!*-*-*-)-(-u'-7-&-%-$-Y-I"-5--!---- -]-O -=------}-H-6-%-------z-\-M-E-)---------b-X-@-3--------}-e-U-3- ---V-I-3-- - - - - -k -K -1 - - - - -v -i - - - -e -L - - - - - = -h -B - - - - - - - -=-s-"-- ---r-B---=--k------Q-H-6-= -= -=y=r -@-4- -----y-\-D-?%------m--- --l -7-=----y-Y-K-;-=xph`XPH@80( xpPH @( x`XP80(xh`XPH@80( `@ `@ `@ `@ `@ xp`@ `@       x p ` @         ` @         ` @       ` @       ` @   `@ `@ `@ `@ `@ `@ `@ `@80 `@ M';2'h;$2"P1P31N;42/(60":H2 } P w!0 #p$  0+Pp+$!p^J2 +V)U;`2`-P m@q/p`.p(  /,@TPR y6@_B;x2P" 5@ ;2@ '` p"!5$1%  %^%!%;2g %0 &&@& p&;24&('!`(%& @';2 `'G2((0(z;2),) - *GP*3,*,1 p***+)p,.- 0-|`-i-%-p.@.&../1,*,0P/.p/j&/0 0 1./a /P//['0y0r(1;3=(@11.;30!@p0bZ #3 /02/P<DpP7 PC  0s(+#,)$I&p@ &0/'0$ *0+  V#;$0 Rp  i-"s NP ?p '6`u5545g45a331396906H3p7j1P7978784/34M103f9H6>8H40  ` 0 P o $%2 :  ;:/0W (z3X('%r%( P.(w#~2u3Zm[!|T077k78$0Q0{01<7;]:wer:$$Tn G;j__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZThn64_NK3mup15TokenIfThenElse16GetAssociativityEv__ZNK3mup15TokenIfThenElse16GetAssociativityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup6IToken8GetIdentEv__ZNK3mup15TokenIfThenElse9GetOffsetEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup15TokenIfThenElse9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup6IToken11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZThn64_NK3mup15TokenIfThenElse6GetPriEv__ZNK3mup15TokenIfThenElse6GetPriEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup6IToken8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup15TokenIfThenElse5CloneEv__ZN3mup15TokenIfThenElse13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup6ITokenD2Ev__ZN3mup15TokenIfThenElseD2Ev__ZN3mup11IPrecedenceD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup11IPrecedenceC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZNSt12length_errorD1Ev__ZThn64_N3mup15TokenIfThenElseD1Ev__ZN3mup15TokenIfThenElseD1Ev__ZNSt3__16localeD1Ev__ZN3mup11IPrecedenceD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZThn64_N3mup15TokenIfThenElseD0Ev__ZN3mup15TokenIfThenElseD0Ev__ZN3mup11IPrecedenceD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZN3mup15TokenIfThenElse9SetOffsetEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZN3mup6ITokenC2ERKS0___ZN3mup15TokenIfThenElseC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup15TokenIfThenElseC1ERKS0___ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv121__vmi_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTIN3mup6ITokenE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZTVN3mup15TokenIfThenElseE__ZTSN3mup15TokenIfThenElseE__ZTIN3mup15TokenIfThenElseE__ZNSt3__1L3hexERNS_8ios_baseE__ZNSt3__1L3decERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup10g_sCmdCodeE__ZN3mup15TokenIfThenElseC2ENS_8ECmdCodeE__ZN3mup15TokenIfThenElseC1ENS_8ECmdCodeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup6ITokenC2ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table9GCC_except_table8GCC_except_table108GCC_except_table166GCC_except_table95GCC_except_table45GCC_except_table4GCC_except_table124GCC_except_table103GCC_except_table121___gxx_personality_v0GCC_except_table0GCC_except_table160GCC_except_table110#1/28 1573634234 501 20 100644 28516 ` mpOprtBinAssign.cpp.o x>>__text__TEXTA__gcc_except_tab__TEXT4!__cstring__TEXT ,#__const__DATA X#HI|__const__TEXT0%H(__compact_unwind__LD& )(Mk__eh_frame__TEXT0 3P h2  PhZ P]u)UHHH}H}HH}HH5HHHƐHH}HHwPH]f.UHHH}H}H]DUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHpH}HuHUMH}HH>HH 1҉HHHHHH1HHHEH} HhHHH}ΉHHhEH}H5HE$xHHuHHH5HH%H`\HhH`\H`\HH}HEHHHHHHEH0HHHHHHHHH}HEHHHHHHp]ÉH`\HH`  UHH}H}H?H]f.fUHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHHH}H}H?4H}H=H5H HEHHH]fUHHH}H}HH}HH5NHHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HH@>HH 1҉H@H8HHH8H01H0H0HEH} HhHH(H}ΉH(HhEH}H5H E$xHHuHHH5HHH`\HhwH`\H`\HH}:H}H8HHHHEHHH8HHHXH}H8HHHHEHHH8HHHXHHHEH8HHHHHPxHuH}HHHHHH@]H`  UHH}H}H?H]f.fUHH H}EMH}EMH ]ÐUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5HHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HH@>HH 1҉H@H8HHH8H01H0H0HEH} HhHH(H}ΉH(HhEH}H5H E$xHHuHHH5HHH`\HhwH`\H`\HH}:H}H8HHHHEHHH8HHH\H}H8HHHHEHHH8HHH\HHHEH8HHHHHPxHuH}HHHHHH@]H`  UHH}Hs]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5HHHƐHH}HHwPH]f.UHHH}H}H]DUHHPH}HuHUMH}HH >HH 1҉H HHHHH1HHHEH} HhHHH}ΉHHhEH}H5pHE$xHHuHHH5HHH`\HhH`\H`\HH}jH}H8HHHPH}H8HHHHHEHHH8HHH@HEHHH8HHH8PY@HY8\PY8HY@\H(HEH8HHH(HPxHuH}HHHHHHP]H`  UHH}H.]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5yHHHƐHH}HHwPH]f.UHHH}H}H]DUHHPH}HuHUMH}HH>HH 1҉HHHHHH1HHHEH} HhHHH}ΉHHhEH}H50 HE$xHHuHHH5HHH`\HhH`\H`\HH}H}H8HHHPH}H8HHHHHEHHH8HHH@HEHHH8HHH8@Y@8Y8X0PY@HY8X^0HY@PY8\^0H HEH8HHH HPxHuH}HHHHHHP]H`  DUHH}H ]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEH@XHGXH ]f.DUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHHH}HuHuH]UHH} fDUHH} fDUHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH}EMH}EEG]DUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE] &&L=,. "y# " &&L=,# " &&L=,# " &&L=,# " &&L=,  -='=' assignement operator+=assignement operator-=*=multiply and assign operator/=multiply and divide operatoroperator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup11ParserErrorEN3mup10OprtAssignEN3mup13OprtAssignAddEN3mup13OprtAssignSubEN3mup13OprtAssignMulEN3mup13OprtAssignDivEN3mup11IPrecedenceEV`iA#@oA# @`^V @A$0P/iAL #@ V  A\  iA@ #p V  A0iA#V0P[AiA@#p( (Pp( @(p( @MqSp   2B@+pMMM`M0P9A O1P$ zRx $8VAC $DpAC $lhAC zPLRx ,$@ioAC $#AC ,|o'AC $<AC $dAC $#AC $AC $AC $^AC $,VAC $T AC ,AC $AC $/AC $AC ,ikAC $T#AC $|VAC $PAC ,<HAC $AC ,iAC $T@#AC $|HVAC $AC ,<x AC $hAC ,`iAC $T#AC $|VAC $AC ,<[CAC $AC ,iAC $T@#AC $|HAC $@(AC $HAC $@AC $8AC $D0(AC $l8AC $0AC $(AC $ (AC $ (AC $4 AC $\AC $(AC $AC $AC $AC $$ (AC $L AC $t AC $ MAC $ qAC $ xSAC $ AC $< AC $d AC $ x2AC $ BAC $ +AC $ MAC $, MAC $T MAC $| 8MAC $ `AC $ XAC $ PAC $ HAC $D @AC , 89AC $ HAC $ POAC $ x1AC $ $AC $< AC $d AC $ xAC $ pAC --j-7-+-----t-s-e-A-!----gG-:h3G-iG-fG-(---%--we=:=3|-= -H-jdcG-24-5--5-6-<-=-^-U=-1>-D-E--E-F-,-b-->-5--.------Y2-3u-*- 0--u-}-xT-;-U-WU-%U-U-%----#=|X=pv-Z-;-6$-w---==oS-A3-g-:-u--i8-L-u-}-T--)U-U-U-U-%--O-/-##=X=v----w--R-.='=S- ;- h - Y B-3 u-* - @- -  u- }-| T-? - U- U- U-j U-\ %-S - - - #= X= v- - -  - w-j -" - = = S- C-s il -] ) *- u--(--u-'u- }-T--U-SU-U-U-%----s#=lX=`v-J-+-&-w---~=w=_S-1+-f--Q&-1$- --u-y-p}-aT-Jy-x-T-%----s#=lX=`v-J-+-&-w---~=w=_S-)-u----q-3d,-P^H@80!(" Wabc`]xphn`oXZH@8N0/({ 45z~MZpq[P7x{p<h=`zX~PH@80O([rs\R?{DEz~Qx\h`XlPmHY80(L '{,-z~KY_jkVxphJ`X{PH@z8~0( IV ` @         ` @   `@ `@ `@ `@ `XP@ `@ `XP@ `@ xp`@ M  EP P}$w @ L\jW2 W{3P C @ `@# 6pp  j@O @   pX9   P`@{ 0X`k 30    <p @q   @  @t@ w  x"0C 4 d`0P$w%!p$3$$$gP%^%0%p%%%%O E$!#"@"  pPI   OpU O g N2@{nTR 6 :0%'0   <     ___cxa_throw__ZSt9terminatev__ZdlPv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZN3mup9ICallback11AsICallbackEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNK3mup6IToken8ToStringEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup13OprtAssignDiv5CloneEv__ZNK3mup10OprtAssign5CloneEv__ZNK3mup13OprtAssignMul5CloneEv__ZNK3mup13OprtAssignAdd5CloneEv__ZNK3mup13OprtAssignSub5CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZNK3mup13OprtAssignDiv7GetDescEv__ZNK3mup10OprtAssign7GetDescEv__ZNK3mup13OprtAssignMul7GetDescEv__ZNK3mup13OprtAssignAdd7GetDescEv__ZNK3mup13OprtAssignSub7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup13OprtAssignDivD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup8IOprtBinD2Ev__ZN3mup10OprtAssignD2Ev__ZN3mup13OprtAssignMulD2Ev__ZN3mup13OprtAssignAddD2Ev__ZN3mup13OprtAssignSubD2Ev__ZN3mup13OprtAssignDivC2Ev__ZN3mup10OprtAssignC2Ev__ZN3mup13OprtAssignMulC2Ev__ZN3mup13OprtAssignAddC2Ev__ZN3mup13OprtAssignSubC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZThn80_N3mup13OprtAssignDivD1Ev__ZN3mup13OprtAssignDivD1Ev__ZN3mup12ErrorContextD1Ev__ZN3mup11ParserErrorD1Ev__ZThn80_N3mup10OprtAssignD1Ev__ZN3mup10OprtAssignD1Ev__ZThn80_N3mup13OprtAssignMulD1Ev__ZN3mup13OprtAssignMulD1Ev__ZN3mup5ValueD1Ev__ZN3mup11IPrecedenceD1Ev__ZThn80_N3mup13OprtAssignAddD1Ev__ZN3mup13OprtAssignAddD1Ev__ZThn80_N3mup13OprtAssignSubD1Ev__ZN3mup13OprtAssignSubD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup13OprtAssignDivC1Ev__ZN3mup10OprtAssignC1Ev__ZN3mup13OprtAssignMulC1Ev__ZN3mup13OprtAssignAddC1Ev__ZN3mup13OprtAssignSubC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZThn80_N3mup13OprtAssignDivD0Ev__ZN3mup13OprtAssignDivD0Ev__ZThn80_N3mup10OprtAssignD0Ev__ZN3mup10OprtAssignD0Ev__ZThn80_N3mup13OprtAssignMulD0Ev__ZN3mup13OprtAssignMulD0Ev__ZN3mup11IPrecedenceD0Ev__ZThn80_N3mup13OprtAssignAddD0Ev__ZN3mup13OprtAssignAddD0Ev__ZThn80_N3mup13OprtAssignSubD0Ev__ZN3mup13OprtAssignSubD0Ev___dynamic_cast_memset___assert_rtn___cxa_allocate_exception___cxa_free_exception__Znwm___cxa_pure_virtual__ZN3mup13OprtAssignDiv4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup10OprtAssign4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignMul4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtAssignSub4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch___clang_call_terminate__Unwind_Resume__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc__ZN3mup6IValueaSERKS0___ZN3mup13OprtAssignDivC2ERKS0___ZN3mup8IOprtBinC2ERKS0___ZN3mup10OprtAssignC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup13OprtAssignMulC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup13OprtAssignAddC2ERKS0___ZN3mup13OprtAssignSubC2ERKS0___ZN3mup13OprtAssignDivC1ERKS0___ZN3mup10OprtAssignC1ERKS0___ZN3mup13OprtAssignMulC1ERKS0___ZN3mup13OprtAssignAddC1ERKS0___ZN3mup13OprtAssignSubC1ERKS0___ZTVN3mup13OprtAssignDivE__ZTSN3mup13OprtAssignDivE__ZTIN3mup13OprtAssignDivE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTVN3mup10OprtAssignE__ZTSN3mup10OprtAssignE__ZTIN3mup10OprtAssignE__ZTVN3mup13OprtAssignMulE__ZTSN3mup13OprtAssignMulE__ZTIN3mup13OprtAssignMulE__ZTVN3mup9ICallbackE__ZTIN3mup6IValueE__ZN3mup5ValueC1ERKNS_6IValueE__ZTIN3mup8VariableE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZTVN3mup13OprtAssignAddE__ZTSN3mup13OprtAssignAddE__ZTIN3mup13OprtAssignAddE__ZTVN3mup13OprtAssignSubE__ZTSN3mup13OprtAssignSubE__ZTIN3mup13OprtAssignSubE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table28GCC_except_table18GCC_except_table76GCC_except_table36GCC_except_table5GCC_except_table34GCC_except_table24GCC_except_table14GCC_except_table3GCC_except_table22___gxx_personality_v0GCC_except_table30#1/28 1573634234 501 20 100644 112692 ` mpOprtBinCommon.cpp.o  __text__TEXT/__gcc_except_tab__TEXT__literal16__TEXT ؒ__literal8__TEXT@__cstring__TEXTP$__const__DATA8 &__const__TEXTX__compact_unwind__LD`)@3__eh_frame__TEXT5? h2  ?8aV PnUHHH}H}HH}HH5/ HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUM}HHH5HHH5HHH@H5H@H87H8H0H5vH0H(xHƅHHH HHHHƅH5HH HRHHH H HmH}H8HHHHHHHEHHHHHHHHHhHHPHHhH}HHHHIhHPHHHPHhHH]ÉH;HHHPHhHH  UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHHHHuHuHHEHEH]fDUHHH}H}H]DUHHH5H}H}H}HuHƀHH]UHH}H}H?H]f.fUHH`HHuHUEHUH}HHEHuH}H}HEH}HEH}HUHuHHHuH}HHHMH}HUH}HHEEE%HEȉMH}H}HEH`]H} UHHH}H}H?4H}H=HH5KH nHEHHH]fUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5‡HHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HUHHHEH}HH}EHHRpDEAȃHljHEH@]ÐUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5%HHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HUHHHEH}HH}EHHRpDEAȃHljHEH@]ÐUHH}HJ]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5HHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HUHHHEH}HH}EHHRpDEAȃHljHEH@]ÐUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5HHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HUHHHEH}HH}EHHRpDEAȃHljHEH@]ÐUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5XHHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HUHHHEH}HH}EHHRpDEAȃHljHEH@]ÐUHH}H}]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5HHHƐHH}HHwPH]f.UHHH}H}H]DUHH@H}HuHUMH}HUHHHEH}HH}EHHRpDEAȃHljHEH@]ÐUHH}H~]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5/~HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}HHHH5}HH5|HHH5|HHHHH5k|HHxxHƅHHHpHHhHHhƅH5HHpHRHHH HpHZH}HxxHƅ'HH`HHXHPH(HPH}HHHHHHHшGHGDH@H(AiH@HXƅ'H5HH`IH;HHH@H(' H`HEHHHxHƅHH8HH0H(HH(HEHHH H HHHшHDHHAiHH0ƅH5HH8H;HHHH H8*H}H8HHHHEHHH8HHH,*f. xHƅ'HMHHHHHHH(HH}HHHHHшHDH@H(AiH@Hƅ'H5HHH;HHH@H(' H,*f. xHƅHMHHHHHHHHHHEHHHHHHHшHDHHAiHHƅH5HHH;HHHH HV,,!*H}H8HHHP`HHĀ]H  fUHHH}H}HEMfEEiM EcME$H]DUHHH}H}H]DUHH}H!t]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5[sHHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}HHHH5rHH5qHHH5qHH+HHH5kqHHxxHƅHHHpHHhHHhƅH5HHpHRHHH HpHZH}HxxHƅ'HH`HHXHPH(HPH}HHHHHHHшGHGDH@H(AiH@HXƅ'H5HH`IH;HHH@H(' H`HEHHHxHƅHH8HH0H(HH(HEHHH H HHHшHDHHAiHH0ƅH5HH8H;HHHH H8*H}H8HHHHEHHH8HHH,*f. xHƅ'HMHHHHHHH(HH}HHHHHшHDH@H(AiH@Hƅ'H5HHH;HHH@H(' H,*f. xHƅHMHHHHHHHHHHEHHHHHHHшHDHHAiHHƅH5HHH;HHHH HV,, *H}H8HHHP`HHĀ]H  fUHH}Hi]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHHEHuHƹHHHƐHH}HHwPH ]f.fUHHH}HuH}HuH]f.UHHH}HuHUM}HHH5gHH5gHHH5gHHXHHxH5fHxHpxHƅHHHhHH`HH`ƅH5HHh5HRHHH HhHH}H8HXHHXW0HEHHH8HHHHHWWH}GH8HpGуH8HljH8H0H]H  f.@UHH}He]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHHEHuHƺHHHƐHH}HHwPH ]fUHHH}HuH}HuH]f.UHHH}HuHUM}HHH5dHH5'cHHH5;cHHuHHxH5cHxHpxHƅHHHhHH`HH`ƅH5HHh<HRHHH HhHH}H8HXHHX1ɈʨW0HEHHH8HHHHHWWH}GH8HpGуH8HljH8H0H]H  UHH}Hb]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5?a HHHƐHH}HHwPH]f.UHHH}H}H]DUHHpH}HuHUMHU}HHHH5D`HH5L_HHH5`_HHHHH5+_HHxHƅHHHHHHHƅH5HHk HRHHH HH H}HxHƅ'HHHHHHH(HH}HHHHHшHDH@H(AiH@Hƅ'H5HHH;HHH@H(' H=HEHHHxHƅHHHHHHHHHEHHHHHHHшHDHHAiHHƅH5HHH;HHHH HH}H8HxHHxHEHHH8HpHHp,*f. xHƅ'HHhHH`\H}HPHPHHH(HHH}H@H@HHHш?H?DH@H(Ai\H@H`ƅ'H5HHhH;HHH@H(' Hh[,*f. xHƅHH0HH($HEHHHHHHHHEHHHHHHHшHDHHAi$HH(ƅH5HH0H;HHHH H0( VYDž(Uf‹(( Uff.AxHƅ'HHHHHHH(HH@-H(H@Hƅ'H5HH-H;HHH@H(' HWf.Jf: H}H8HHHP`HEf: H}H8HHHP`HHp]H  f.UHH}E}*MH]fUHHE}E}*H]fUHH}HT]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5S HHHƐHH}HHwPH]f.UHHH}H}H]DUHHpH}HuHUMHU}HHHH5RHH5QHHH5QHHHHH5QHHxHƅHHHHHHHƅH5HH HRHHH HH H}HxHƅ'HHHHHHH(HH}HHHHHшHDH@H(AiH@Hƅ'H5HHH;HHH@H(' HTHEHHHxHƅHHHHHHHHHEHHHHHHHшHDHHAiHHƅH5HHH;HHHH HH}H8HxHHxHEHHH8HpHHp,*f. xHƅ'HHhHH`\H}HPHPHHH(HHH}H@H@HHHш?H?DH@H(Ai\H@H`ƅ'H5HHhH;HHH@H(' Hhr,*f. xHƅHH0HH($HEHHHHHHHHEHHHHHHHшHDHHAi$HH(ƅH5HH0H;HHHH H0fH~HH1fHnȿ( HYDž([Hf‹(( :Hff.AxHƅ'HHHHHHH(HH@-H(H@Hƅ'H5HH-H;HHH@H(' HWf.Jf: H}H8HHHP`HEf: H}H8HHHP`HHp]H  fDUHH}HG]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5F HHHƐHH}HHwPH]f.DUHHH}H}H]DUHHH}HuHUMH}HHHAAb`D\9`fX`iTdH}H8HHHHHH}@H8H8H@H8P`H0-HpHH(H}ΉH(HpEH}H H HHHшEEfxHHuHHH5HHtHhdHpFHhdHhdHH} H]Hh  UHHH}H}H]DUHH}HD]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5nC HHHƐHH}HHwPH]f.DUHHH}H}H]DUHHH}HuHUMH}HHHAAb`D\9`fX`iTlH}H8HHHHH,*H}@H8H8H@H8P`H0-HpHH(H}ΉH(HpEH}H H HHHшEEixHHuHHH5HHtHhdHpFHhdHhdHH} H]Hh  f.UHH}H@]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}HHXH}HH}H]f.@UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEH@XHGXH ]f.DUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHHH}HuHuH]UHH} fDUHH} fDUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEHXOXH ]ÐUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHU9<<"$9I+UUY i5Q &&L=, &&L=, &&L=, &&L=, &&L=, &&L=, &&L=,GG"$9<h9< k 9  M h 9 Mk9 &&L=,GG"$9<h9< k 9  M h 9 Mk9 &&L=,!<<"$9 &&L=,!<<"$9 &&L=,GG"$9Si9S l 9  h i 9 ol9S9 &&L=,GG"$9Si9S l 9  h i 9 ol9S9 &&L=,'''{ &&L=,'''{ &&L=,  UU `[  -1& )A 3$ " E ##_B:  G+9 C$@$@//Assertion "argc == 2" failed: /Users/jgomez/muparserx/parser/mpOprtBinCommon.cpp line .string concatenation==equals operator!=not equal operator<less than operator>greater than operator<=less or equal operator>=greater or equal operator&Assertion "num == 2" failed: bitwise and|bitwise orlogical orlogical and<<shift left>>shift right(float)cast a value into a floating point number(int)allocator::allocate(size_t n) 'n' exceeds maximum supported sizeoperator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokp@@h@h@ppN3mup11ParserErrorEN3mup10OprtStrAddEN3mup6OprtEQEN3mup7OprtNEQEN3mup6OprtLTEN3mup6OprtGTEN3mup6OprtLEEN3mup6OprtGEEN3mup7OprtAndEN3mup6OprtOrEN3mup7OprtLOrEN3mup8OprtLAndEN3mup7OprtShlEN3mup7OprtShrEN3mup15OprtCastToFloatEN3mup13OprtCastToIntENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup11IPrecedenceEV`?AA@B *Pp9AX^ @iAh#V@`oiAx` # V  o  iA #@ V  o0 P iA # VP p o iAp#V oiA #PVo@`iAȊ#V`7 A؊[ @`iA`#V`7 Ap&&iAP'#'T'#(A**iA00+#`+W+#+A@..iAh/#@/V// Ax;';';<iA<#<V=0= A(I0IiAȍI#IQ0JPJ-A؍LLLiA0M#`MQMM5A P@PiA@P#PQ(0QPQpQQ(QQR R(PRpRRR(RS S@S(pSSSS(T T@T`T(TTTT( U@U`UU(UUUV(@V`VVV(VVW0W(`WWWW(WX0XPX(XXXX(Y0YPY2YiZ Z@Z(pZZZZC [(P[W^Z_  `aAPdd#e#0ePepee2e*f f"Pf@ffOf10gPg'gggggh h0h @h`hLh$hi%0iViOij#0juj"jk$0kMk(kMlqlSl m m  mMpmMmMnM`nMnMoBPoMoMoM@pMpMpM0qMqoqM@r`rrrrrs s@s`ssssst t7`tAh u!PupuUu+vKPvUv9A|v wOpw1w$wx x0x@xA@z`zz9A|#|}g}}!}}70~,`~&~<~QA؎0Pp|A" +P$+Ё3#@`C# 2`C## /P2'e0'`/2/ @`[pdA#0?pOAzRx $3VAC $D04AC zPLRx ,$4?wAC ,T7AC $7BAC $ 8*AC $<(8AC $d 89AC $88AC ,L08AC $8^AC $ (9AC , 9i7AC $d`9#AC $h9VAC $9AC $9oAC $9AC ,9iOAC $\:#AC $ :VAC $X:AC $P:oAC $:AC ,:igAC $T:#AC $|:VAC $;AC $;oAC $P;AC ,H;iAC $L;#AC $t;VAC $;AC $;oAC $<AC ,-f=-f<-wf-e;-e:-d9-d<-d7-ud,-Cd -d6-c'-c-c9-c-c+-c5-}c.-Rc -7c -c4- c3-b-b+-b+-vb'-eb9-@b--3b'-b*-b)-a5-a9-a9-a)-a7-a,-ia)-Ya*-8a8-)a)-a7-`<-`,-`)-`*-`5-`9-`)-s`*-_`'-F`'- `9-_6-_)-_2-_)-_,-_)-_*-s_2-L_'-3_'-^1-^(-^/-s^.-]^--J^+-$^,-^*-]*-](-]'-](-q])-F](- ](-\+-\'-\*-\)-3\ -[(-[(-['-['->[ -5[C- [-Z-Z=ZD-ZF-ZF-^Z -UZG-8ZG-ZG-Y-YC-xY-oY-BY-"Y-X -X-X-X-X-nX -eX-AX-"X-X-W -W-W-W-rW-NW -EW-!W-W-V-V -V-V-rV-RV-.V -%V-V-U-U-U -U-qU-RU-2U-U -U-T-T-T-~T -uT-QT-2T-T-S -S-S-S-S-^S -US-1S-S-R-R -R-R-R-bR->R -5R-R-Q-Q-Q -Q-Q-bQ-BQ-Q -Q-P-P-P-P -yP-\P -+P P-O-O-O-O-O=OQ=wO-aO-O3- O-N-N!-N2-mN3-M3-M-MxM-}MIM-#M-M -L-L -LL#-uL-[L-RL-L-K-K=KQ=K-K-K3-sK-bK-IK!-K2-J3-oJ3-AJ-IyI-II-I-I -iI-LI -II-H2-}H2-DH-&H-H-G-G=GQ=G-G-qG-RG-;G-G-FF-FFF-[F-=F-1F-E-E=EQ=E-E-GE3-2E-E-D3-D-D-D-aD-UD- D-D=CQ=C-C-kC3-]C->C-&C3-C-B-B3-bB3-TB-6B-*B-A-A=AQ=A-A-@A3-+A- A-@-@-@-@3-@-@-s@-+@-@=@Q=@-?-?3-{?-\?-E?-?- ?-?3->G->->-}>-q>=j>Q=W>-?>->-=J-==-=J-==J-==J-z=l=-!=-<<-<<-s<-j< -I<-,< -;;-;-{;-@;2-:2-:-:-:-K:-?:=8:Q=%:- :-9-9-9-9-k9d9-J999-8-8-8-y8-m8=f8Q=S8-;8-73-7-7-73-p7-I7-7-6-6-6-6=6Q=w6-_6-53-5-5-53-5-{5-$53-43-4-4-4-r4-f4=_4Q=L4-44-33-3-3-3-^3-J3-B33--3-3-3-2-2=2Q=2-}2-23- 2-1-1-1-1-13-1G-s1-U1- 1-1=0Q=0-0-0-0J-}0j0-M0J-A0.0J-"00J- 0/-/-s/l/-]/)/-/-. -. -. -.q.--.2--3--3--G---z--2--&-=-Q= --,-,-,J-,,-r,J-f,S,J-G,4,J-/,!,-+ -++-I+-#+-+ -*-* -**-F*2-*3-)3-)G-)-)-R)-F)=?)Q=,)-)-(-(J-((-(J-(s(J-g(T(J-O(A(-'-''-i'-C'-:' -'-& -&&-t&2-H&-*&-&-%-%=%Q=%-%-5%3- %-%-$3-$-$-i$-]$-$- $=$Q=#-#-t#3-f#-G#-/#3- #-"3-"3-t"-V"-J"-"-!=!Q=!-!-a!3-L!--!-!- - 3- - - -c -W =P Q== -% -3---n-Z-R3-DG-3---=Q=--a-IJ-=*- J-J-J--q-3,--- --| -K1--t2-H-*---=Q=--53- --3---i-]-- =Q=--t3-f-G-/3- -3-3-t-V-J--=Q=--a3-L-----3----c-W=PQ==-%-3---n-Z-R3-DG-3---=Q=--a-IJ-=*- J-J-J--q-3,--- --| -K2- -2-2--{|-m9--  -- -h2-\-P2-<2--}--c-Z -9- -  2- - 2- 2-a -# | -  - - - -l -;  2- - 2- 2- -s ~l -] ) - - - - - X 2-L -@ 2-, 2- -  - y -S -J -) - -2--2-|2-Q-z --- -y-\ -+----j-Z -L-' - -  ----H-{u=a-<4-I-;----u=j-7=+-u==-----G-;-/-2-K--3-s-G3-9G-(- --=Q=--V->J-2-J-J-J--q-3v,-cPs?@Axp0h>`XPBHC@`0(t           p h ` H @ 8       M M N N L L M    a x p aX FP GH a0 ( e   f   q   p   r   n p h l` P H m@ 0 ( h   j   i   k   o   g p h b` X P H @ 8 R(               R     Sx p h ` X P H @ 8 0 (     S^/xph`.X^H@80(]-,]x_h`X1P H@80( 0_[)xph`XP(H[80( Y%$YxphZXPH'@80( &ZUxph`XPH@8U( W! Wxph`XVH@80( VX#xph`XPH@80"(X\+*x\h`XPHT80( TdOxph`XPH@80( OX)P)@) ))((((((`(@( ((''''`'@' ''&&&&`&@& &&%%%%`%@% %%$$$$`$@$ $$$$######`#@# ##""""`"X"P"@" ""!!!!!!`!@! !!      ` @   `@ `@ `@ `@ `@ `@ `@ `@ `@ `@80 `@ `@ `@ `@ `@ `@ `@ `@     ` @         x p ` @           ` @           ` X P @         ` X P @     `XP@ `@ `@ `XP@ `@ `@ `XP@ `@80 xp`XP@ {M/c U tN`t0 uU@i> ie'TXfVhTxUV USVTȊ@V؊ U`VpVTT0U@Uh*@;?;sTxUT(`Tȍ"LU؍v3U9TV@8d$d0e+ Pe pe<ef<e4 f /^gshb0i+i-i8=j90jTPPf/f&?f f0gPggAgg@g7 j jT k B0kW=kPuDOpuuZUhr/PvNvv  w,V|@pwxwcw>x<0x`zM|F| }}.}V }-}60~.`~FUM~P9p.P6~ 0T؎p PJ39 LT=Ё3@|= >*`:7:`O?  +P~,`*0v7:+,,I;;HI@A`H7)p[A A98p)8nU80yVBq2E["`8Dk %QP8@rClp$mmPPYR 5o1MDP!MBq/`MT#XXPtB1PJE0M!0JC0qKI#PX0Xls}3` F` "@D m%QpQy`r#4TF"DnnP&&`T@TsF3p Ep"P mDn l%@S Ser3 %RRQr1AEP'"`PCo~#Uj`U@sb2EF"`DPo$T)T  s1(9'YE0+8'hCo+$VU`s3 #F " Dpm) % RMRr*2/rE<1"/Cp@/[$0WWs10=(EI"=7Cpi<#W;WsCl2+9+E/8`+D@p$VZV"sCl@  @P P L:L]8`@B P '0 &{&g`@3** x M<;0I_I..QoM0@h9 h5h'7h 0h7 _8@zi5`h; 6.P[Z4a5 `H_( [!ZZ>zr(@Z pY*@x7;@NL2MPKJG0F{G}LODL`O L@,H KgHL I@G`IK R@QKJpGF^GjLӠO1LO KH7J(SHEL IdGs4KTwR QСRQ0KJXF0AGWL@OLPOKHJ`?HLH GЙKp0RQ'pZR Z$PQp0Q2#0YmYp#XX%QQ &TTR%SpS% TbT$%SR#UPU$@U U$`V~@V%pR2PR@$W`W#X W$V>V(Z  Z5w5u0FSSx0qSf CG H  'T tBB[BBBBB;  =^K8)6M*P69p<A!' 0@''4&8QJ -,L-eKr.YFHPjP5PP#)H{HlFH2IIP ):&g  \'&nv&j)9)G)55a)-GV)Tw)__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw_pow__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZThn80_NK3mup10IOprtInfix16GetAssociativityEv__ZNK3mup10IOprtInfix16GetAssociativityEv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup10IOprtInfix9AsciiDumpEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup9ICallback11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZThn80_NK3mup10IOprtInfix6GetPriEv__ZNK3mup10IOprtInfix6GetPriEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup13OprtCastToInt5CloneEv__ZNK3mup15OprtCastToFloat5CloneEv__ZNK3mup7OprtShr5CloneEv__ZNK3mup6OprtOr5CloneEv__ZNK3mup7OprtLOr5CloneEv__ZNK3mup7OprtShl5CloneEv__ZNK3mup7OprtAnd5CloneEv__ZNK3mup8OprtLAnd5CloneEv__ZNK3mup10OprtStrAdd5CloneEv__ZNK3mup6OprtLT5CloneEv__ZNK3mup6OprtGT5CloneEv__ZNK3mup6OprtEQ5CloneEv__ZNK3mup7OprtNEQ5CloneEv__ZNK3mup6OprtLE5CloneEv__ZNK3mup6OprtGE5CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup10IOprtInfix13AsIPrecedenceEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNK3mup13OprtCastToInt7GetDescEv__ZNK3mup15OprtCastToFloat7GetDescEv__ZNK3mup7OprtShr7GetDescEv__ZNK3mup6OprtOr7GetDescEv__ZNK3mup7OprtLOr7GetDescEv__ZNK3mup7OprtShl7GetDescEv__ZNK3mup7OprtAnd7GetDescEv__ZNK3mup8OprtLAnd7GetDescEv__ZNK3mup10OprtStrAdd7GetDescEv__ZNK3mup6OprtLT7GetDescEv__ZNK3mup6OprtGT7GetDescEv__ZNK3mup6OprtEQ7GetDescEv__ZNK3mup7OprtNEQ7GetDescEv__ZNK3mup6OprtLE7GetDescEv__ZNK3mup6OprtGE7GetDescEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup10IOprtInfixD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup13OprtCastToIntD2Ev__ZN3mup15OprtCastToFloatD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup7OprtShrD2Ev__ZN3mup6OprtOrD2Ev__ZN3mup7OprtLOrD2Ev__ZN3mup8IOprtBinD2Ev__ZN3mup7OprtShlD2Ev__ZN3mup7OprtAndD2Ev__ZN3mup8OprtLAndD2Ev__ZN3mup10OprtStrAddD2Ev__ZN3mup6OprtLTD2Ev__ZN3mup6OprtGTD2Ev__ZN3mup6OprtEQD2Ev__ZN3mup7OprtNEQD2Ev__ZN3mup6OprtLED2Ev__ZN3mup6OprtGED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZN3mup13OprtCastToIntC2Ev__ZN3mup15OprtCastToFloatC2Ev__ZN3mup7OprtShrC2Ev__ZN3mup6OprtOrC2Ev__ZN3mup7OprtShlC2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup7OprtAndC2Ev__ZN3mup10OprtStrAddC2Ev__ZN3mup6OprtLTC2Ev__ZN3mup6OprtGTC2Ev__ZN3mup6OprtEQC2Ev__ZN3mup7OprtNEQC2Ev__ZNSt3__19allocatorIcEC2Ev__ZN3mup6OprtLEC2Ev__ZN3mup6OprtGEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZThn80_N3mup13OprtCastToIntD1Ev__ZN3mup13OprtCastToIntD1Ev__ZThn80_N3mup15OprtCastToFloatD1Ev__ZN3mup15OprtCastToFloatD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZThn80_N3mup7OprtShrD1Ev__ZN3mup7OprtShrD1Ev__ZThn80_N3mup6OprtOrD1Ev__ZN3mup6OprtOrD1Ev__ZThn80_N3mup7OprtLOrD1Ev__ZN3mup7OprtLOrD1Ev__ZThn80_N3mup7OprtShlD1Ev__ZN3mup7OprtShlD1Ev__ZNSt3__16localeD1Ev__ZN3mup11IPrecedenceD1Ev__ZThn80_N3mup7OprtAndD1Ev__ZN3mup7OprtAndD1Ev__ZThn80_N3mup8OprtLAndD1Ev__ZN3mup8OprtLAndD1Ev__ZThn80_N3mup10OprtStrAddD1Ev__ZN3mup10OprtStrAddD1Ev__ZThn80_N3mup6OprtLTD1Ev__ZN3mup6OprtLTD1Ev__ZThn80_N3mup6OprtGTD1Ev__ZN3mup6OprtGTD1Ev__ZThn80_N3mup6OprtEQD1Ev__ZN3mup6OprtEQD1Ev__ZThn80_N3mup7OprtNEQD1Ev__ZN3mup7OprtNEQD1Ev__ZThn80_N3mup6OprtLED1Ev__ZN3mup6OprtLED1Ev__ZThn80_N3mup6OprtGED1Ev__ZN3mup6OprtGED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup13OprtCastToIntC1Ev__ZN3mup15OprtCastToFloatC1Ev__ZN3mup7OprtShrC1Ev__ZN3mup6OprtOrC1Ev__ZN3mup7OprtShlC1Ev__ZN3mup7OprtAndC1Ev__ZN3mup10OprtStrAddC1Ev__ZN3mup6OprtLTC1Ev__ZN3mup6OprtGTC1Ev__ZN3mup6OprtEQC1Ev__ZN3mup7OprtNEQC1Ev__ZN3mup6OprtLEC1Ev__ZN3mup6OprtGEC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZThn80_N3mup13OprtCastToIntD0Ev__ZN3mup13OprtCastToIntD0Ev__ZThn80_N3mup15OprtCastToFloatD0Ev__ZN3mup15OprtCastToFloatD0Ev__ZThn80_N3mup7OprtShrD0Ev__ZN3mup7OprtShrD0Ev__ZThn80_N3mup6OprtOrD0Ev__ZN3mup6OprtOrD0Ev__ZThn80_N3mup7OprtLOrD0Ev__ZN3mup7OprtLOrD0Ev__ZThn80_N3mup7OprtShlD0Ev__ZN3mup7OprtShlD0Ev__ZN3mup11IPrecedenceD0Ev__ZThn80_N3mup7OprtAndD0Ev__ZN3mup7OprtAndD0Ev__ZThn80_N3mup8OprtLAndD0Ev__ZN3mup8OprtLAndD0Ev__ZThn80_N3mup10OprtStrAddD0Ev__ZN3mup10OprtStrAddD0Ev__ZThn80_N3mup6OprtLTD0Ev__ZN3mup6OprtLTD0Ev__ZThn80_N3mup6OprtGTD0Ev__ZN3mup6OprtGTD0Ev__ZThn80_N3mup6OprtEQD0Ev__ZN3mup6OprtEQD0Ev__ZThn80_N3mup7OprtNEQD0Ev__ZN3mup7OprtNEQD0Ev__ZThn80_N3mup6OprtLED0Ev__ZN3mup6OprtLED0Ev__ZThn80_N3mup6OprtGED0Ev__ZN3mup6OprtGED0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcmm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup10IOprtInfixC2EPKci__ZN3mup13OprtCastToInt4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup15OprtCastToFloat4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtShr4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtOr4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtLOr4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtShl4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtAnd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtLAnd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup10OprtStrAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtLT4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtGT4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtEQ4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtNEQ4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtLE4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup6OprtGE4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZN3mup7OprtLOrC2EPKc__ZN3mup8OprtLAndC2EPKc__ZNSt12length_errorC1EPKc__ZN3mup7OprtLOrC1EPKc__ZN3mup8OprtLAndC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EERKS9_SB___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZL3powIdiENSt3__116__lazy_enable_ifIXaasr3std13is_arithmeticIT_EE5valuesr3std13is_arithmeticIT0_EE5valueENS0_9__promoteIS2_S3_vEEE4typeES2_S3___ZL3powIidENSt3__116__lazy_enable_ifIXaasr3std13is_arithmeticIT_EE5valuesr3std13is_arithmeticIT0_EE5valueENS0_9__promoteIS2_S3_vEEE4typeES2_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNK3mup6IValueltERKS0___ZNK3mup6IValuegtERKS0___ZNK3mup6IValueeqERKS0___ZNK3mup6IValueneERKS0___ZNK3mup6IValueleERKS0___ZNK3mup6IValuegeERKS0___ZN3mup10IOprtInfixC2ERKS0___ZN3mup13OprtCastToIntC2ERKS0___ZN3mup15OprtCastToFloatC2ERKS0___ZN3mup7OprtShrC2ERKS0___ZN3mup6OprtOrC2ERKS0___ZN3mup7OprtLOrC2ERKS0___ZN3mup8IOprtBinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup7OprtShlC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup7OprtAndC2ERKS0___ZN3mup8OprtLAndC2ERKS0___ZN3mup10OprtStrAddC2ERKS0___ZN3mup6OprtLTC2ERKS0___ZN3mup6OprtGTC2ERKS0___ZN3mup6OprtEQC2ERKS0___ZN3mup7OprtNEQC2ERKS0___ZN3mup6OprtLEC2ERKS0___ZN3mup6OprtGEC2ERKS0___ZN3mup13OprtCastToIntC1ERKS0___ZN3mup15OprtCastToFloatC1ERKS0___ZN3mup7OprtShrC1ERKS0___ZN3mup6OprtOrC1ERKS0___ZN3mup7OprtLOrC1ERKS0___ZN3mup7OprtShlC1ERKS0___ZN3mup7OprtAndC1ERKS0___ZN3mup8OprtLAndC1ERKS0___ZN3mup10OprtStrAddC1ERKS0___ZN3mup6OprtLTC1ERKS0___ZN3mup6OprtGTC1ERKS0___ZN3mup6OprtEQC1ERKS0___ZN3mup7OprtNEQC1ERKS0___ZN3mup6OprtLEC1ERKS0___ZN3mup6OprtGEC1ERKS0___ZTVN3mup10IOprtInfixE__ZTIN3mup10IOprtInfixE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTVN3mup13OprtCastToIntE__ZTSN3mup13OprtCastToIntE__ZTIN3mup13OprtCastToIntE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTVN3mup15OprtCastToFloatE__ZTSN3mup15OprtCastToFloatE__ZTIN3mup15OprtCastToFloatE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN3mup7OprtShrE__ZTSN3mup7OprtShrE__ZTIN3mup7OprtShrE__ZTVN3mup6OprtOrE__ZTSN3mup6OprtOrE__ZTIN3mup6OprtOrE__ZTVN3mup7OprtLOrE__ZTSN3mup7OprtLOrE__ZTIN3mup7OprtLOrE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTVN3mup7OprtShlE__ZTSN3mup7OprtShlE__ZTIN3mup7OprtShlE__ZTVN3mup9ICallbackE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZTVN3mup7OprtAndE__ZTSN3mup7OprtAndE__ZTIN3mup7OprtAndE__ZTVN3mup8OprtLAndE__ZTSN3mup8OprtLAndE__ZTIN3mup8OprtLAndE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZTVN3mup10OprtStrAddE__ZTSN3mup10OprtStrAddE__ZTIN3mup10OprtStrAddE__ZTVN3mup6OprtLTE__ZTSN3mup6OprtLTE__ZTIN3mup6OprtLTE__ZTVN3mup6OprtGTE__ZTSN3mup6OprtGTE__ZTIN3mup6OprtGTE__ZTVN3mup6OprtEQE__ZTSN3mup6OprtEQE__ZTIN3mup6OprtEQE__ZTVN3mup7OprtNEQE__ZTSN3mup7OprtNEQE__ZTIN3mup7OprtNEQE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZTVN3mup6OprtLEE__ZTSN3mup6OprtLEE__ZTIN3mup6OprtLEE__ZTVN3mup6OprtGEE__ZTSN3mup6OprtGEE__ZTIN3mup6OprtGEE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table9GCC_except_table99GCC_except_table289GCC_except_table88GCC_except_table78GCC_except_table68GCC_except_table48GCC_except_table18GCC_except_table177GCC_except_table86GCC_except_table286GCC_except_table66GCC_except_table56GCC_except_table36GCC_except_table95GCC_except_table275GCC_except_table255GCC_except_table325GCC_except_table74GCC_except_table24GCC_except_table3GCC_except_table2GCC_except_table92GCC_except_table82GCC_except_table72GCC_except_table272GCC_except_table62GCC_except_table262GCC_except_table52GCC_except_table42GCC_except_table12GCC_except_table331GCC_except_table101___gxx_personality_v0GCC_except_table60GCC_except_table30#1/28 1573634235 501 20 100644 108076 ` mpOprtCmplx.cpp.o  __text__TEXT@z|__gcc_except_tab__TEXT@z}__literal8__TEXT(}0__literal16__TEXT`}@__cstring__TEXT}X__const__DATAp( __const__TEXT8__compact_unwind__LD8*X__eh_frame__TEXTP6p h2  > h PyUHHH}H}HH}HH5} HHHƐHH}HHwPH]f.DUHHH}H}H]DUHHH}HuHUM}HHH5|HpH5|HpHhH5|HhH`6H`HXH5|HXHPxHƅHHHHHH@HH@ƅH5HHHHRHHH HHH&H}HlH}H8H8HH8H}H8H0HH0Wf.W('fH~HH1fHn((Wf. W'fH~HH1fHnHx (H}H8HHHxHPxHH}H8HHHȃm H}H8HHHHWDžH}艅HHHHHщ99H}HHHH1HHHHHHHHHHHH1HHHHIxHHHHHHH}HHHHHH?HxHHHΉHHxDžH}HxHxHHHшwwƅsxHHHhHH5HHh|HHxNHHHhHHĠ]H  UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHHHHuHuHHEHEH]fDUHHH}H}H]DUHHH5H}H}H}HuHƀHH]UHH}H}H?H]f.fUHHH}H}HEMfEEiM EcME$H]DUHH H}EMH}EMH ]ÐUHHH}H}H?4H}H=wtH5ztH tHEHHH]fUHH0H}HuHuH>HvHuH}HuH}EMHEH0]UHHH}H}H]DUHHH}H}H]DUHH}Hr]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5"r HHHƐHH}HHwPH]f.UHHH}H}H]DUHH H}HuHUMHU}4HH=qH5+qH zqrH}HEHEHHHEH}xH}bHEHHHEHHXH}HHQ`Hx}HEHHЃmHEHHЃmHEHHHHMH9HHpHHpHhH}HhHH}H`H`HHHuHHXH}HEMH}H}fxHƅ'HHPHHHDHH8H(H8HEHHHш7H7DH@H(AcDH@HHƅ'H5HHPHEM/HEMHEMH@H(' HP)H}fxHƅHH(HH HHHHHEHHHшHDHHAcHH ƅH5HH(HEM/HEMHEMHH H(HEHHHEHHXHEHHHEHHXHH}HHHQxHH ]H}  f.DUHH}H}H?H]f.fUHHH}H}HEMfE EiME$H]UHHpHHuHUHuHUHMH}HHuHHEHMH}HuHEH}HuH}HEHp]ÉHEMH}H} f.@UHHH}H}H]DUHH}Hj]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5i HHHƐHH}HHwPH]f.UHHH}H}H]DUHHpH}HuHUMHU}4HH=ciH5 iH ZiH}HEHEHHHEH}HHEHHHbHEHHHEHH\H}HHQ`Hx`H}H8HpHHpȃmHEHHH8HhHHhȃmHEHHHHMH9HH`HH`HXH}HXHH}HPHPHHHuHHHH}_HEMH}VH}H~xHƅ'HH@HH84HH(H(H(H}H H HHHшHDH@H(Ac4H@H8ƅ'H5HH@*HEM/HEMHEMH@H(' H@HEHHHxHƅHHHHHHHHHEHHHHHHHшHDHHAcHHƅH5HHHEM/HEMHEMHH HH}H8HHHHEHHH8HHH\H}H8HHHHEHHH8HHH\HH}H8HHHHPxHHp]H}  DUHHpHHuHUHuHUHMH}HHuHHEHMH}HuHEH}HuH}HEHp]ÉHEMH}H} f.@UHH}Hmb]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5a HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUM}4H=`H5`H `H}HEHEHHHEHuHUH`HHHH}H@H@HHH8H`H]ÉHXTH`HX f.UHH}H+`]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5r_ HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUM}4H=^H5F^H ^H}HHEHHHH}H8H}HHEHEHHEH8H}HHEM^H}MH8H}HEHEP`Hx9H}H8HpHHpEH}H8HhHHhEHEHHH8H`HH`EHEHHH8HXHHXEEYEMYMXEEYEMYMX^EMYMUYU\^MH}H}H8HPHHuHPPxHHH]UHH}H\]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5[ HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUM}4H=ZH5ZH ;[)H}HjHEHHHJH}H8H}HHEWf.HEHHHH}H8H}HHEH}HHEH8H}HHEH}HEMH}H0HHEHuHHEPxHEH}H8H}HHEHEHHEH8H}HHEME(MH}xH8HpHxHpP`HhHĠ]f.UHH H}H}HH}1ɈȃcU$HEHHWf.@@UE$H ]f.@UHH H}H}H}1ɈʨUqHEHH1@Wf.@uKEHEHHHEHHE,*Mf.@AD @uE$H ]@UHHPH}HuH}HuH}HEMHuH}EMH}EMEMHP]UHH}HW]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}HHXH}HH}H]f.@UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH}EMH}EEG]DUHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEHXOXH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHHH}HuHuH]UHH} fDUHH} fDUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEH@XHGXH ]f.DUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=(HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH}EH}EYEYGGH]f.@UHHH}HuH}HuH]f.UHHpH}HuHuH};HuHEHHU;JHEH5&HMH}HHEHuH}EH5HH}HEЉMHEЉMH}E H}EEHM;vEEHM;ALH}uċUuċUH}HEH8H}HHuHEHEEEEăE{HEHp]H}  UHH0H}HuHuHHH}HuHuH}H0]ÉHEMH}H} UHHH}H}H]DUHH H}HuHuH}GFH}H}GFH}HHH}HHuHEH ]f.UHHH}H}H]DUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH H}HuHuH;uHu+HEHMHHHEH0HEHPH}HEH ]fUHH H}HuH}HuH ]f.UHHpH}HuHUHUH}HuHUHEHEH}HEHUH9HEHEEHEH}HEH}H9!EHEHEH}H}HH}HuHEHHEEIHuHUHEH}HuHUHEHUH)H}HuHEHUHHM HuH}7H}HuH}H}HHuHUHMH}H}Hp]UHH}Hu]fUHH H}HuH}HuH ]f.UHHH}H}H]DUHpH}H}HWH?H)HHH]fUHH H}HuH}HuH ]f.UHH0H}HuHUH}H}HEH}HEH}HuHH0]UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH H}H}H?H}\H}H}H}H7HEHuH}HuHHEHHHEH@HH ]UHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHHk}pHHHE1ɉH}H8H}H0]f.@UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH}]fDUHpH}HuHuH}H)HHH]UHHH}H}H}pHHUH2H)HHH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH}HuHuH}HkpH7H7]UHH H}HuHUHEH;E.HuH}HEHEHpHEHEHpHEHEH ]fDUHH}HE]fUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHpHEHEHHpHH0]f.@UHH}]fDUHHH}H}H]DUHH}H}H]f.DUHH}HuHU]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}HE]fUHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH}Hu]fUHH0H}HuHuH~H}HuHEH;E4H}H}HǐH}HEH}HHEHMHAH0]HHUUHHPH}HuHuHHuH}HEH}HEHkpHuHH}HuHkupHH}HEH}HEHkpHuHH}HEHuHHUHMLEHP]f.UHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}HuHuH>H}HHuV8H ]DUHH}HuHUHMLE]fDUHHH}H}H?H]fUHH H}H}H}HEH}HuH}H}H ]HHUUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H7H]fUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}HE]fUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHH@H}HuHuHHuH}HEH}HEHkpHuHH}HuH}HEHkpHuHH}HuHkupHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}HI$I$I]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H=Hk}pH ]f.UHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}HuH}HuH]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=8H54H WiHEHHcuHH0]@UHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=xH5tH XHEHHcuHH0]@UHH H}HuHuHHuHuH}HuH}HuHH ]fUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H}H}H]UHHH}H}H]DUHH}HuHuH6Hk}pHH]UHH}HuHuH6Hk}pHH]UHHH}H}HHH}HHEHHH]UHHpH}HuHuH};HuHEHHU;JHEH5oHMH}HHEHuH}EH5HH}HEЉMHEЉMH}E H}EEHM;vEEHM;ALH}uċUuċUH}HEH8H}HHuHEHEEEEăE{HEHp]H}  UHH@H}H}EH}H}Wf.$E  EtEWf. E@E  EH}MH}TH}4H}Wf.HEHHMH@HEkH}EEME(MYEUE(MMYH}EEMH@]f.@UHHH}HuH}EH}EH}EH}EEYEEEYEEEYEEEYEEE\EEEXEEE*EEEE(EWMx ExxM(f(ffEECWphphhM(,f(1ffEEE( fEEE( fEEEE.EUW`X`XXM(>f(CffEEWPHPHHM(f(ffEEE( fEEE( nfEEEE;E)EEEE( fEEE( fEEE( fEEE( cfEEEM$MYMUYU\(YUMYMUYUXYEEMH}EMH]@UHH0H}H}H}EH}ME(MEMH0]f.UHH}H}G]f.UH ,EE(Sff. $]f.fUHH}H}]f.@UH EE(ff.$]ÐUHEEf.$]@UHH H}H}H}EME(MH ]UHH H}H}H}EME(MH ]K<<"$9  ' -   UUY &&L=,@+XSG9S G 9  ::#u]5 &&L=,@+`Si9S l 9  ::#u]5 &&L=,$J &&L=, &&L=, &&L=,  UU `[  -1& )A 3$ " E ##_B:  G+9 CMMm-, @5( 9T Cf L t *L  / * MMMm-??-Assertion "a_iArgc == 1" failed: /Users/jgomez/muparserx/parser/mpOprtCmplx.cpp line .negative sign operator+Evalnum == 2additionsubtraction*foo*bar - multiplication/division^argc == 2raise x to the power of yallocator::allocate(size_t n) 'n' exceeds maximum supported sizeoperator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokMatrix dimension mismatchAt/Users/jgomez/muparserx/parser/mpMatrix.hi < (int)m_vData.size()p@@h@h@ppN3mup11ParserErrorEN3mup13OprtSignCmplxEN3mup12OprtAddCmplxEN3mup12OprtSubCmplxEN3mup12OprtMulCmplxEN3mup12OprtDivCmplxEN3mup12OprtPowCmplxENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup11IPrecedenceEN3mup11MatrixErrorEQ`A@zAzB* 0 9p  [ / ^ H   0 iAz # V0 P Az IpAz0PiA {#VPpA{A`{iAp{@#pVA{ iA{#V @X!!iA{0"#`"V""$bP%&hp&&iA{'#0'P'(''''((0(P(p((((()(0)P)p))())* *(P*p**2*i@+`++(+++,C`,(,W/ZP0 `13A{56#@6#p666627*@7`7"7@77O081p88'8889 9@9`9p9 99L9$ :@:%p:V:O ;@;#p;u;" <@<$p<M<(<+ =Bp=M=o0>S> > > >M ?q?M?M@@M@M@A A@A`AAA7AA{B!BBUPC+CKCU0D9A{pDDOD10E$`EE EEEA|GGH9A4|@J#pJJgK K!PKpK7K,K&L<PLQAL|LLL|A\|pM"M+M$N+0OPO3O#OOP PCpP#P2QC0R@R#pR#R/R2S'@SeS'ST/0T2pT/TTTU U@U`UpUU[UdAl|`VV#V?VW0WOA||W2W#WA|pY]A|YYVPZpZZ`A|Z [#0[I[[6[[ \W`\#\Y]^#0^P^'^#^M_kp_rA|_p`aa a(a80bPbpbb bZcc0c+`crc cd0dPdFddFee7Pe`eA|ef#f#f+ g@g`gXA|g+gh0h;A|phhhhYA} i'Pii# j@j`j pjMj(jk0kPkpkkUk#lM`llZl#m#@m`m nnG0o?po(oo o p9@pA}qs xSxy4Pypy/yy@z@zRx $(LQAC $D`LAC zPLRx ,$8LAC ,TSAC $SBAC $T*AC $<TAC $dT9AC $(TAC $ T[AC $XT/AC $`T^AC $,THAC $TTAC $|TAC $TAC ,dTiAC $T#AC $$TVAC $L(UAC ,  UwAC $ZAC $ZIAC ,Z;AC $$0[AC $L([AC ,  [iAC $`[#AC $h[VAC $[AC ,[3AC ,bGAC $|xbAC ,<pbiAC $b#AC $bVAC $$bAC ,bgAC $|cAC ,<ci#AC $d#AC $dVAC $$@dAC $L8dXAC $tpfAC ,4hfi;AC $f#AC $fVAC $fAC $DfAC $lhbAC $iAC $ihAC $iAC ,ii۾AC $< j#AC $d jAC $ j(AC $ jAC $ jAC $ jAC $, i(AC $T jAC $| iAC $ iAC $ i(AC $ iAC $ iAC $D iAC $l i(AC $ iAC $ iAC $ iAC $ i(AC $4 iAC $\ iAC $ iAC $ i(AC $ iAC $ iAC $$ i2AC $L iiAC $t jAC $ jAC $ j(AC $ jAC $jAC $<iAC $diCAC $j(AC $ jWAC $XmZAC $m AC $,xnAC ,pAC $rAC $r#AC $r#AC $rAC $$rAC $LrAC $tr2AC $r*AC $rAC $r"AC $r@AC $<rAC $drOAC $r1AC $sAC $r'AC $sAC $,rAC $TrAC $|rAC $rAC $rAC $rAC $r AC $DrAC $lxrLAC $r$AC $rAC $r%AC $ rVAC $4rOAC $\sAC $s#AC $suAC $`s"AC $hsAC $$`s$AC $LhsMAC $ts(AC $s+AC $sBAC $sMAC $soAC $<8tSAC $dpt AC $ht AC $Pt AC $8tMAC $`tqAC $,tMAC $TtMAC $|uMAC $0uMAC $XuAC $PuAC $HuAC $D@uAC $l8uAC $0uAC $(u7AC ,|@u+AC $u!AC $<uAC $duUAC $v+AC $vKAC $8vUAC ,pv9AC $4vAC $\vOAC $v1AC $v$AC $vAC $v AC $$vAC $LvAC , vAC $`xAC $XxAC ,Px9sAC $$`z#AC $LhzAC $t`zgAC $zAC $z!AC $zAC $z7AC $<z,AC $dz&AC $z<AC ,LzQ˪AC ${AC $ {AC ,{|[AC $dP{"AC $X{+AC $`{$AC $h{+AC $p|AC $,h|3AC $T|#AC $||AC $|AC $x|AC $p|CAC $ |#AC $D |2AC $l }CAC $ }AC $ }#AC $ }#AC $ !}/AC $4!}2AC $\!}'AC $!~eAC $!H~'AC $!P~AC $!H~/AC $$"P~2AC $L"h~/AC $t"p~AC $"h~AC $"`~AC $"X~AC $#P~AC $<#H~AC $d#@~AC $#(~AC $# ~[AC ,t#X~däAC $ $~AC $4$~#AC $\$~?AC $$~AC $$~AC ,l$~OۣAC $%~2AC $,%~#AC ,$~kAC ,%0]SAC $%`AC $%XVAC $&AC $,&AC ,%`AC $& AC $&#AC $&IAC $&ȀAC $$'6AC $L'ȀAC $t' AC $'WAC $'#AC $'YAC $( AC $<(#AC $d(AC $('AC $(#AC $(MAC $)@kAC ,(rǟAC $\)؂AC $)0AC $)AC $) AC $)(AC $$*8AC $L*(AC $t* AC $*AC $* AC $*ZAC $+0AC $<+AC $d++AC $+rAC $+p AC $+XAC $,PAC $,,HAC $T,@FAC $|,hAC $,PFAC $,xAC $,`7AC $-xAC ,,`AC $t-AC $-8#AC $-@#AC $-H+AC $.PAC $<.HAC ,-@XAC $.p+AC $.xAC $.pAC ,.h;AC $-q-p-p-p=pg=p-p-pp-/p_-p-o-o-o-Zo~=So-o- oJ-nC-n-n-nnn|n-n-m-mmmm-Qm-)m-l-l-l-l-l-qlM--l-k-k-k-kk-Ak-k-j-ej-Uj-1j- j-i-i-i-i-i-yi-li-=i-i-h-h-h-h-h-h-gh-Ph-$h-h-g-g-g-g-g-ug-Tg-f-f-{f-Pf-Cf-.f-f- f-e-e-e-e-e-=e-1e-d-d-d-|d-d-c-c-Qc-%c-b-ab-Eb-b-a-Pa-Ga-,aC-`-`-`-`-`-`C-L`-@`-0`-`-`-_-_-_-_-_-a_-X_-<_-'_-^-^-^-^-^-A^-^-]-]]-][-]-]\-]-]]-e]-6]-"]-]-\-\-\-y\-I\^-1\-[-[-o[-c[-W[-[-Z-Z-Z-Z-aZ`-8Z-Y-Y-Y_-Y#-Y-gY-Y"-Y>-X-X-X-}X=vXg=fX-TX-@X2X-W%-{W-iWD-[Wj-W-V=V-V-uV-NV-EV-3V-*V=#V=V-V-U-U-UU-QU-U-T~-TG-QTG-TG-S}-S|-pS{--Sz-!SG-RG-Ry-Re-Rx-URv-Rw- Rv-QH-QI-QI-zQu-mQt-YQs-HQr-0Qq-#Qp-Qo-Qn-P-Pm-Pl-Pk-YPL-HPj-Oi-Oh-Og-yOf-AOe-Od- Ob-Nc-Nb-N&-N-Nc-Nb-nN-ZN-AN-M-M-{M=fM-]M-?M-.M`-M_-M-L^-L-wL\-BL-1LC-K[-7KZ-JY-JD-JH-YJX-1J- JV-IT-{I-fI-IT-I-HU-HT-QHS-G-G-G-G-yG-^G-TG-:G-1G-GQ-FP-FU-FO-.FN-FM-EL-E-EK-qEJ-JE -EI- EH-DG-D-D-DF-eD-SDD-EDC- D-C=C-CH-C-;CB-B=BA-B-B--A=A=-A-qA-QA-1A-A-@-@@*-j@c@*-@@*-??*-b?=[?-C?+->>*->}=Z>=S>->==-=+-==-X=-O=-?=-<<-Q<4-1<4-<4-;E-;E-Y;;- ;:-:9-:1-:8-:1-[:-9H-9D-9H-97-86-85-84-84-A84-83- 82-71-7 -Y60-Q6/-)6.-5K-5,-5 -5-Y5+-=5-'5-5H-5-4-4*-4"-4)-w4-[4(-L4'-04-3-3-3-3H-3!-s3-\3-O3-;3D-13H-2H-2-2F-2 -2-2-x2G-i2-Z2F-72K-/2 -2-2-1D-1H-1-1-1-1-I1H-71E-/1-1&- 1-0 -0-0-0&-0-s0-0%-/-/#-/"-/!-/-d/ -E/-2/-/-.-.-.-.-L.-.-.-----s--:-- --,-,-~,-u,S-I,-=,-,=,T-+V-+V-+-+W-x+W-R+W-/+-+S-*-*-*-b*->*-5*-*-)-)-)-)-)-b)-B)-)-)-( -(-(-(-(-a(-B(-"(-'-'-'-'-' -n'-e' -A'!-' -&-&-& -&-{&J&Z-7&b- &-e%;-$@-$-g$A->$A-$@-$-#A-#A-#=-#A-r#A-a#<-Y#A-A#<-9#A-+#-!###"-""-}"I"-#"-"-!-!-!i!@-`!- A- A- A-[ A-0 @- A-A-:-A-:-A--zs1----z-Y-<- ----@--]?-I?-;-1*#--Y-3-*- ---&-w&-i$-S(-F$--@--A-RA-A-A----{-o=hh=U-=-A----g-S;-KA-6-- --=h=--4A-&----;-A-&-&-M@-D,-A-A-t@-":-A-:-A-?-?--a-#- ----l-;!'--&-&-$-)-$--@--)- ---=h=--1----;----R-F=?h=,-----]-I;-;&-$&- @- --= @- :- :- ?- ?- -   A -  -  - - -i -L -  - - -e -[ T M  -_ -L X-; |=! -B-Y-J--x-f-J|=*-=-|==-p-Q-E---=h=--mA-Z-I-----@--Y--A-JA-+-A-A-@--A-eA-O;-GA-9W-(- --=h=--V->a-2-a-a-a--q-.'-grqfxzp`OXPPH@Q80( $NRSo{xphPH@ ddeexcpchd`XPHp0( pVWpwuvxxp`XtP@8y0( l5 4lxph`XjH@810( 0jk3xph`XPH@802(km76xmh`XPHi80(/ .isnxph9`XPH @80( 8n`*@* **))))`)@)8)0) ))((((`(@( ((''''`'@' ''&&&&`&@& &&%%%%`%X%P%@% %%$$$$$$`$X$P$@$ $$####x#p#`#@# ##""""`"@" ""!!!!`!@! !!    ` @ 8 0   `@ `@ `XP@80 `@ `@ `@ `@ `@ `@80 `@ xp`@ `XP@ xp`@ `@ `@ `@ `@ `@     ` @       ` @         ` @       ` @       ` @   `@ `@ `@ `@ `@80 `XP@ `@ `@ xp`XP@ {M7x< /N S( 2g@zvA^A7Bfz]<<<W 0Dfzgzgzf {g{g`{gp{e{e{jf{wF&Lxf{ 5$6@6& p6Q66H6s @7G7;`76/f 9 @9p:2@::5 ;H@;@p;f{7 7K7,089 p8 8,80Q88L9 ;\ <@<aQp<I<BJ_BPCVf{97C^CpDDXg{fDE!0E `E3EEG]@JpJJK6 KDg|PKR5pK=K5KBf4|]PL0@L}6MC=LLeL|L[pM@Me\|a 0O~IPOJOO,I PJ0WOP[BpPAQLpRzR3R5 S4@SHS 1S>T320Tn3pTZ0R"C@RYTNT=@U-.pUUqV OU' UQ`U>U .`V?Vfl|?ViWg||x?lf|(Y}f|W pZ"G\ Z ZC[g|nC0[[[B[:![O[F`\e]"F^0^P^Z^xH^Mp_T4aMa3YaaZbHcGHbc/0cQ`ccS*>/$> dmc0o9*po#@m3o# M*#  =:P uU(0 2T> )'G#'Ab9@U0"' S@@,))"p)]`A9VU(T?p)) #(@A$9"T''"S@x`"( *U"*BA[:pU@8(PQT?*p(#P( A96U '`Sp=i)P'"0'x@)8 nZNYOWjOpYI$}pN@pNWT ?T0>EEpnP0 !!N &]p&-0     $ P%K8`m  )p ( Nhn89@`9; :=9p9v>T?G;9 DP9l5,:3X;`1qP0,`,1'+,KH,+&0 o*X0ELq3p`S_._D\y'PZ`l>FsF^\ 8]z\(WX@X 9WLV VU@WVba@a\>X pXW2V VU@mWV]ba`8aЄH\%XXW0V@VUSWfVpbX`X,+%@+)0(&#( ))p"))P)"0)(p*4"P*)(b#(G)'"'R,+N&`+!<D9<(9Whdb88UI<$SWcTSNWg/5Oo Mzl /  \*?#d.<<e@]G&+%ZL!Z+V%:*$j\64458\$ra6YWY`P```b-x-XXWXYZ_L-m*i$?+%+%*$j---; <-5Gg+gG--8-<?-T--__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw_pow__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__19allocatorIN3mup5ValueEE8allocateEmPKv__ZThn80_NK3mup10IOprtInfix16GetAssociativityEv__ZNK3mup10IOprtInfix16GetAssociativityEv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNK3mup6IValue9IsComplexEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNKSt13runtime_error4whatEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE26__invalidate_all_iteratorsEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup6IValue9IsIntegerEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup6IValue8IsScalarEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNK3mup10IOprtInfix9AsciiDumpEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZNKSt3__17complexIdE4realEv__ZN3mup9ICallback11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZThn80_NK3mup10IOprtInfix6GetPriEv__ZNK3mup10IOprtInfix6GetPriEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__17complexIdE4imagEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__19allocatorIN3mup5ValueEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup12OprtPowCmplx5CloneEv__ZNK3mup12OprtDivCmplx5CloneEv__ZNK3mup13OprtSignCmplx5CloneEv__ZNK3mup12OprtMulCmplx5CloneEv__ZNK3mup12OprtAddCmplx5CloneEv__ZNK3mup12OprtSubCmplx5CloneEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup10IOprtInfix13AsIPrecedenceEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNK3mup12OprtPowCmplx7GetDescEv__ZNK3mup12OprtDivCmplx7GetDescEv__ZNK3mup13OprtSignCmplx7GetDescEv__ZNK3mup12OprtMulCmplx7GetDescEv__ZNK3mup12OprtAddCmplx7GetDescEv__ZNK3mup12OprtSubCmplx7GetDescEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12OprtPowCmplxD2Ev__ZN3mup12OprtDivCmplxD2Ev__ZN3mup13OprtSignCmplxD2Ev__ZN3mup12OprtMulCmplxD2Ev__ZN3mup12OprtAddCmplxD2Ev__ZN3mup12OprtSubCmplxD2Ev__ZN3mup10IOprtInfixD2Ev__ZN3mup12ErrorContextD2Ev__ZNSt13runtime_errorD2Ev__ZN3mup11MatrixErrorD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup8IOprtBinD2Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZN3mup12OprtPowCmplxC2Ev__ZN3mup12OprtDivCmplxC2Ev__ZN3mup13OprtSignCmplxC2Ev__ZN3mup12OprtMulCmplxC2Ev__ZN3mup12OprtAddCmplxC2Ev__ZN3mup12OprtSubCmplxC2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIN3mup5ValueEEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZThn80_N3mup12OprtPowCmplxD1Ev__ZN3mup12OprtPowCmplxD1Ev__ZThn80_N3mup12OprtDivCmplxD1Ev__ZN3mup12OprtDivCmplxD1Ev__ZThn80_N3mup13OprtSignCmplxD1Ev__ZN3mup13OprtSignCmplxD1Ev__ZThn80_N3mup12OprtMulCmplxD1Ev__ZN3mup12OprtMulCmplxD1Ev__ZThn80_N3mup12OprtAddCmplxD1Ev__ZN3mup12OprtAddCmplxD1Ev__ZThn80_N3mup12OprtSubCmplxD1Ev__ZN3mup12OprtSubCmplxD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11MatrixErrorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup5ValueD1Ev__ZNSt3__16localeD1Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup6MatrixINS_5ValueEED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZN3mup12OprtPowCmplxC1Ev__ZN3mup12OprtDivCmplxC1Ev__ZN3mup13OprtSignCmplxC1Ev__ZN3mup12OprtMulCmplxC1Ev__ZN3mup12OprtAddCmplxC1Ev__ZN3mup12OprtSubCmplxC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1Ev__ZThn80_N3mup12OprtPowCmplxD0Ev__ZN3mup12OprtPowCmplxD0Ev__ZThn80_N3mup12OprtDivCmplxD0Ev__ZN3mup12OprtDivCmplxD0Ev__ZThn80_N3mup13OprtSignCmplxD0Ev__ZN3mup13OprtSignCmplxD0Ev__ZThn80_N3mup12OprtMulCmplxD0Ev__ZN3mup12OprtMulCmplxD0Ev__ZThn80_N3mup12OprtAddCmplxD0Ev__ZN3mup12OprtAddCmplxD0Ev__ZThn80_N3mup12OprtSubCmplxD0Ev__ZN3mup12OprtSubCmplxD0Ev__ZN3mup11MatrixErrorD0Ev__ZN3mup11IPrecedenceD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_hypot_memset_cos__ZTVSt12length_error__ZTISt12length_error__ZTISt13runtime_error_exp___assert_rtn___cxa_allocate_exception___cxa_free_exception_sin_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC2ERKS5_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC1ERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8allocateERS4_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10deallocateERS4_PS3_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__19allocatorIN3mup5ValueEE10deallocateEPS2_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE14__annotate_newEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__annotate_shrinkEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZN3mup5Value2AtEii__ZN3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup10IOprtInfixC2EPKci__ZN3mup12OprtPowCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtDivCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtSignCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtMulCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtAddCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup12OprtSubCmplx4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch_log___clang_call_terminate__Unwind_Resume__ZN3mup5ValueC1Eid__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__17complexIdEmLEd__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE7destroyIS3_EEvRS4_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9__destroyIS3_EEvNS_17integral_constantIbLb1EEERS4_PT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC1IDnLb1EEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE31__annotate_contiguous_containerEPKvS7_S7_S7___ZN3mupplINS_5ValueEEENS_6MatrixIT_EERKS4_S6___ZN3mupmiINS_5ValueEEENS_6MatrixIT_EERKS4_S6___ZNSt3__1L8distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5___ZNSt3__1L3powIdEENS_7complexIT_EERKS3_S5___ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__1L16__to_raw_pointerIN3mup5ValueEEEPT_S4___ZNSt3__1L13__unwrap_iterIPN3mup5ValueEEET_S4___ZNSt3__1L6__copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__1L4copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8max_sizeERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__13expIdEENS_7complexIT_EERKS3___ZNSt3__1L3logIdEENS_7complexIT_EERKS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__19allocatorIN3mup5ValueEE7destroyEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE27__invalidate_iterators_pastEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__1mlIdEENS_7complexIT_EERKS3_RKS2___ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZN3mup6MatrixINS_5ValueEEpLERKS2___ZN3mup6MatrixINS_5ValueEEmIERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mupmlERKNS_6IValueES2___ZNSt3__1L25__libcpp_isnan_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L25__libcpp_isinf_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L28__libcpp_isfinite_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE25__construct_range_forwardIPS3_S7_EEvRS4_T_S9_RT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRS2_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZN3mup6IValueaSERKS0___ZN3mup5ValueaSERKS0___ZN3mup12OprtPowCmplxC2ERKS0___ZN3mup12OprtDivCmplxC2ERKS0___ZN3mup13OprtSignCmplxC2ERKS0___ZN3mup12OprtMulCmplxC2ERKS0___ZN3mup12OprtAddCmplxC2ERKS0___ZN3mup12OprtSubCmplxC2ERKS0___ZN3mup10IOprtInfixC2ERKS0___ZN3mup8IOprtBinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup12OprtPowCmplxC1ERKS0___ZN3mup12OprtDivCmplxC1ERKS0___ZN3mup13OprtSignCmplxC1ERKS0___ZN3mup12OprtMulCmplxC1ERKS0___ZN3mup12OprtAddCmplxC1ERKS0___ZN3mup12OprtSubCmplxC1ERKS0___ZN3mup5ValueC1ERKS0___ZTVN3mup12OprtPowCmplxE__ZTSN3mup12OprtPowCmplxE__ZTIN3mup12OprtPowCmplxE__ZTVN3mup12OprtDivCmplxE__ZTSN3mup12OprtDivCmplxE__ZTIN3mup12OprtDivCmplxE__ZTVN3mup13OprtSignCmplxE__ZTSN3mup13OprtSignCmplxE__ZTIN3mup13OprtSignCmplxE__ZTVN3mup12OprtMulCmplxE__ZTSN3mup12OprtMulCmplxE__ZTIN3mup12OprtMulCmplxE__ZTVN3mup12OprtAddCmplxE__ZTSN3mup12OprtAddCmplxE__ZTIN3mup12OprtAddCmplxE__ZTVN3mup12OprtSubCmplxE__ZTSN3mup12OprtSubCmplxE__ZTIN3mup12OprtSubCmplxE__ZTVN3mup10IOprtInfixE__ZTIN3mup10IOprtInfixE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTVN3mup11MatrixErrorE__ZTSN3mup11MatrixErrorE__ZTIN3mup11MatrixErrorE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTVN3mup9ICallbackE__ZNSt3__1L10__distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L9__advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeENS_26random_access_iterator_tagE__ZTVNSt3__18ios_baseE__ZNSt3__1L7advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRN3mup5ValueEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1L3absIdEET_RKNS_7complexIS1_EE__ZNSt3__1L3argIdEET_RKNS_7complexIS1_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt13runtime_errorC2ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5_NS_17integral_constantIbLb0EEEGCC_except_table299GCC_except_table189GCC_except_table39GCC_except_table258GCC_except_table37GCC_except_table186GCC_except_table26GCC_except_table16GCC_except_table295GCC_except_table175GCC_except_table155GCC_except_table45GCC_except_table235GCC_except_table225GCC_except_table94GCC_except_table284GCC_except_table54GCC_except_table234GCC_except_table3GCC_except_table33GCC_except_table23_atan2GCC_except_table2GCC_except_table172GCC_except_table162GCC_except_table291GCC_except_table31GCC_except_table231___gxx_personality_v0GCC_except_table240GCC_except_table30GCC_except_table330GCC_except_table20 #1/28 1573634235 501 20 100644 10700 ` mpOprtIndex.cpp.o x__text__TEXT(r__gcc_except_tab__TEXT__cstring__TEXTtd__const__DATA__const__TEXT1__compact_unwind__LD@P__eh_frame__TEXT h2  A" P'UHHH}H}HH}HǾHNHHHUHH]UHHH}H}H]DUHHH}HuHUMHUHuHHHHHHHHщEHMHHHHHHHщEHMHHHHHHHш$EϋMʃ-<HE؉ME}E7H}HHHHƅWHH}HHH}HHXWHHHHXHHHHHƅWHHHXHE؉MHE؉MHXW HH}HH}HHWHHHHHHHxH}HpHpHxHhHHE؉MH-U}/EEH}HH`HHXƅoHXH}HPHHHpWHpH}H@H8HHHHHH@H8H0HPH0ƅoH`HPHp!HE؉MHE؉MHpo HXH}H(HWHH}H HH(HHHH HHH}HHHHHHE؉MHxHƅHHHHHHHH)HHHƅH5HH:HE؉M/HE؉MHE؉MHH HvEH}HHHHHH}HHH}HHEHHHHHHHHHHHHHHHE؉MHH}HH}HHEHHHHHHHHHHH}HHHHxHƅHHxHHpHhHHhH()HH(HpƅH5HHxbHE؉M/HE؉MHE؉MH(H HxEԹ9H}HHdHHXHXdHTxHHHPHH5HHPZ2HE؉MHE؉MHP H]H} HHH UHH}H}H?H]f.fUHH H}HuHuH>Hu&HEH8HHEHHHRHHEHHEH}HH ]f.UHHH}H}H?4H}H=H5H HEHHH]fUHHH}H}H]DUHHH}H}H]DPH$UHH}H4]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHH}H}H]&<Q5G'z  p  R <    9  }  ,<9#2-/} &&L=,Index operator[,] - The index operator.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup11ParserErrorEN3mup9OprtIndexEHPp A  e ^  @ ` iAd #  (P 2 B ? SzRx $HAC $DAC zPLRx ,$ AC $HAC $@eAC $ ^AC $4AC $\AC $AC ,DiAC $#AC $AC $,(AC $T2AC $|BAC $@?AC $XSAC $AC *-J7=C$- - 2- 2- 2-x -o 2-> 8-5 - - - - 8- -| 9-K ; 3-2 <-! - - :-   p --J ,- - - =- >- ?- = =u -\ ;-4 - +- <- >- 2- - ?- =y =f -N -, 1- .-;-%--`-D-/-!8--&---j-G9->-2--?-==-v-T1-5.-;- - -%--b-F-+-8- - --&-X-<-!-9- - -%-n-0---8- - --|&-4---9-----a -3,)-"M46xp5h`X#P H@"8!0((' 0/ `@80@ `XP@@ {@M\d %P     p P V( m  K t` @ P`lV 0 !'81Zt<?"oD^!H}?Mgn___cxa_throw__ZSt9terminatev__ZdlPv__ZN3mup11ParserError10GetContextEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup9ICallback9AsciiDumpEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup9OprtIndex5CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNK3mup9OprtIndex7GetDescEv__ZN3mup9OprtIndexD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup9OprtIndexC2Ev__ZN3mup9OprtIndexD1Ev__ZN3mup12ErrorContextD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup5ValueD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup9OprtIndexC1Ev__ZN3mup9OprtIndexD0Ev___assert_rtn___cxa_allocate_exception___cxa_free_exception__Znwm__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup9OprtIndex4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZN3mup5ValueC1Ed__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZN3mup8TokenPtrINS_6IValueEE5ResetEPS1___ZN3mup6IValueaSERKS0___ZN3mup9OprtIndexC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup9OprtIndexC1ERKS0___ZN3mup11ParserErrorC1ERKS0___ZTVN3mup9OprtIndexE__ZTSN3mup9OprtIndexE__ZTIN3mup9OprtIndexE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZN3mup8VariableC1EPNS_6IValueE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table2___gxx_personality_v0GCC_except_table10#1/28 1573634236 501 20 100644 48708 ` mpOprtMatrix.cpp.o x0g0g__text__TEXTS2Hj{__gcc_except_tab__TEXTT2l5 v__cstring__TEXT 487__const__DATA588(v@__const__TEXT8(;__compact_unwind__LD8`;(x__eh_frame__TEXTM( P0~ h2  8~x/ PkkVCUHHH}H}HH}HH53HHHuHH]fUHHH}H}H]DUHHH}HuHUMH}HH}H8HH}HHEH}H}HH}HEH}HEHEHHHuHHEH}FHEMH}8H}H}HxHHxHpHĐ]H} f.fUHH}H}H?H]f.fUHHH}H}Hȃm$H]UHHH}HuH}HuH]f.UHH H}H}H} HEHE/1HMQD‰AHH}HHMHMHEH ]UHHH}H}H?4H}H=2H52H 2HEHHH]fUHHH}H}H]DUHH}H#1]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HǾHy0HHHUHH]UHHH}H}H]DUHHH}HuHUMHU}H xHƅcHHHHHHpHH} HpHuHƅcH5HHHhd8HhdHhdH}Hpc H2uHWH8HHDž;EZHEHcH<HH]HHHPHHh HPHPxHHhHHH5HHHhdHhdHHhd~HhdHP^HhdHHhdHhHEHcH<HHHH81HHHHxHHhdHgH8HpH}HhHhHHH8HH`H8H8d9HhHH\HHPHP\HTxHHHHHH5HHHdHhdHhdHH H]Hh HH@ f.UHHH}H}H]DUHHH}H}H]DUHH H}uUHMH}uUHMH ]ÐUHH H}H}H} HEHHHE 1EEH ]UHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=s*H5o*H *XHEHHcuHH0]@PH$UHH}H(]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5C( HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}4HH='H5'H 'H}HEHEHHHEH}`xHƅSHHHHHH`HHEHHHшHDHxH`AiHxHƅSH5HHHXT;HXTHXTHxH`S H<H}`xHƅHHHHHHHHEHHHшHDHHAiHHƅH5HHKHXT;HXTHXTHH HH}HuxHƅH5$HHHHHHƅH5HHBHXTHXTH HHEHHHHEHHH\,‰H vHljHHHH Dž;HEHHH*XH1҉HHHHI`HHTHXTH sHXTHSH}HHHHHHHxHHĐ]HX  UHH}H}H?H]f.fUHHH}H}HEMfE EiME$H]UHHH}HuH}HuH]f.UHH H}uHUH}uHUH ]UHH}H7!]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH}H}H}1HMDЉUEE]f.DUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEH@XHGXH ]f.DUHHHH}HuHuH]UHH} fDUHH} fDUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH0H}HuHuHHH}HuHuH}H0]ÉHEMH}H} UHHH}H}H]DUHH H}HuHuH}GFH}H}GFH}HHH}HHuHEH ]f.UHHH}H}H]DUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH H}HuHuH;uHu+HEHMHHHEH0HEHPH}HEH ]fUHH H}HuH}HuH ]f.UHHpH}HuHUHUH}HuHUHEHEH}HEHUH9HEHEEHEH}HEH}H9!EHEHEH}H}HH}HuHEHHEEIHuHUHEH}HuHUHEHUH)H}HuHEHUHHM HuH}7H}HuH}H}HHuHUHMH}H}Hp]UHH}Hu]fUHH H}HuH}HuH ]f.UHHH}H}H]DUHpH}H}HWH?H)HHH]fUHH H}HuH}HuH ]f.UHH0H}HuHUH}H}HEH}HEH}HuHH0]UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH H}H}H?H}\H}H}H}H7HEHuH}HuHHEHHHEH@HH ]UHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHHk}pHHHE1ɉH}H8H}H0]f.@UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH}]fDUHpH}HuHuH}H)HHH]UHHH}H}H}pHHUH2H)HHH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH}HuHuH}HkpH7H7]UHH H}HuHUHEH;E.HuH}HEHEHpHEHEHpHEHEH ]fDUHH}HE]fUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHpHEHEHHpHH0]f.@UHH}]fDUHHH}H}H]DUHH}H}H]f.DUHH}HuHU]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}HE]fUHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH}Hu]fUHH0H}HuHuH~H}HuHEH;E4H}H}HǐH}HEH}HHEHMHAH0]HHUUHHPH}HuHuHHuH}HEH}HEHkpHuHH}HuHkupHH}HEH}HEHkpHuHH}HEHuHHUHMLEHP]f.UHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}HuHuH>H}HHuV8H ]DUHH}HuHUHMLE]fDUHHH}H}H?H]fUHH H}H}H}HEH}HuH}H}H ]HHUUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H7H]fUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}HE]fUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHH@H}HuHuHHuH}HEH}HEHkpHuHH}HuH}HEHkpHuHH}HuHkupHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}HI$I$I]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H= Hk}pH ]f.UHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}HHH}HHEHHH]UHH H}HuH}MH}HEH}HEH ]f.UHH}HE]fUHH H}uUHMHMUUQAHHQHcHUH ]DUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHHHUH}GHuH}HuHUH}HEMHEHH0]H} fDUHH@H}HuHUHUHHHUHEH}HuH}HUHrH}HHUH}HHEHPHpHPHUHHUH}H}H@]UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH}HuHuH6Hk}pHH]UHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH H}uHUHUu2BBHHHc2HUH ]hh;q &&L=,EE<6wb.$-JO # 2   4   2} &&L=,Y<F9<F9$9   1 &&L=,, @5( 9T Cf L t *L  / * M  G+96_U5'foo' - An operator for transposing a matrix.Array constructor{,} - Array construction operator.~Eval/Users/jgomez/muparserx/parser/mpOprtMatrix.cppnum==2Colon operator: Maximum value smaller than Minimum!: - Colon operatorallocator::allocate(size_t n) 'n' exceeds maximum supported sizeoperator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokAt/Users/jgomez/muparserx/parser/mpMatrix.hi < (int)m_vData.size()N3mup11ParserErrorEN3mup13OprtTransposeEN3mup15OprtCreateArrayEN3mup9OprtColonEN3mup11IPrecedenceE>@`AT2-#hp^iAh2#H Ax2   /0 Y `  iA3 # V  =A(3IP#)iA3@#p((0(`?? S2BA`?Mqp   ]A3pV0`A3 #I 06p W#0Y#' #PMkrA3  P! `!(!8!!" " @"Z"""+#r# ####F@$P$F$$7$%A3%0&#`&#&+&&'XA3`'+''';A3(0(P(`(YA3('()#))* *M`*(****+ +U+dA4+,#@,?,#,M- -Z-9-F. .Kp.+.A40//F 0Fp0070 0G01P1p111$12 2CzRx $ز>AC $DAC zPLRx ,$ȲAC $AC $-AC $ #AC $4hAC $\^AC $@AC $8AC ,l0iwAC $p#AC $,xHAC $TAC ,AC $AC $AC $/AC $$YAC $L8AC $tAC ,4غi_AC $#AC $ VAC $XAC ,P=AC $t`AC $XIAC $#AC $)AC $AC ,i/AC $l#AC $AC $(AC $AC $ (AC $4AC $\(AC $AC $AC $?AC $?AC $$SAC $L(2AC $t@BAC $hAAC $?AC $MAC $qAC $<( AC $d AC $ AC $AC $AC $ AC ,]OAC $\ AC $ VAC $ 8AC $ 0AC , (`AC $, X AC $T @#AC $| HIAC $ pAC $ X6AC $ pAC $ h AC $D PWAC $l #AC $ YAC $ AC $ #AC $ AC $4 'AC $\ #AC $ MAC $ kAC ,l 0rAC $ AC $, AC $T PAC $| AC $ (AC $ 8AC $ AC $AC $DAC $l AC $ZAC $AC $AC $ +AC $4rAC $\ AC $AC $AC $AC $FAC $$AC $LFAC $t AC $7AC $ AC ,AC $XAC $D#AC $l#AC $+AC $AC $AC ,XAC $<+AC $d AC $AC ,L;AC $ AC $ AC $4AC ,Y{AC $('AC $0AC $#AC $AC $,AC $T AC $|MAC $(AC $AC $AC $AC $DAC $lAC $UAC ,Td+AC $AC $#AC $<?AC $d#AC $MAC $@AC $8ZAC $p9AC $,FAC $TAC $|KAC $+AC ,d+AC $(AC $$FAC $LFAC $tAC $7AC $ AC $GAC $AC $<AC $d1AC $$AC $ AC $ AC $CAC I2-1j-1-1i-1h-a1-A1g-1- 1-0f-0-0c-\0e-L0c- 0d-/c-/)-/b-/9-k/'-S/&-$/-/-.`-.-.-.-a.--_--_--_----.-p-/-`-"-L-&-C-E---,V-,^-j,=c,-),]-,-+-+-+-+=+=+[-+-k+Z-Z+Y-U+A+W-*X-*W--*V-*U-)T-)S-)R-)B-c)A-K)->)A-&)-)A- )A-(Q-(-(O-(N-y(M-q(L-A(K-%(-(-'I-'+-'H-'G-T'-=' -/',-"'E-'-&9-y&D-I&C-&B-%-%A-%A-%-%A-%A-|%-T%?-H%9-3%&-$-$<-$>-|$<-,$=-$<-#;-I#:-9#9-"8-"7-k"-"6-!5-!4-/!3- - - - 2- 0-b 1-V &-J -4 -0-/--&-.-~-g,-Z+-I-;*-)-(-'-&-%-$-v$-i$-9#-"-!- -v-a-U-H-:-(------j-U-----M------u-E-!--- -g-^-A-4 ----w=2=+k-------p--J=C- =-r--r-N-E-!-----y-z-Y-3-*- ---i ----q-Q---o-V----n=}=j-R-5$- ---p--{n=t=a-I------j-^p-- n== - - -` -9 -% - - - -    -S L -=  ~- - - |- -k [ -R -B -) -    -j -E -% - q- o- - - -z -F -: n=3 =' - ------K-6-%------np-N-.---n==--t-c-A-"------f-H-<p--n==---~-W---v-s-j-It-,---R---n-U-F-6-(--------Qw-)"-M0( lmxh`XPH@80( {xh`sXPxHy@80( @ `@ `@ `@ `@ `@ `@     ` @ 8 0       ` @       ` @       ` @         ` @   `@ `@ `@ `@ `@ `@80 `@ `XP@ `XP@ {M/T2-/h2.x2W?0L/3P.(309/3^p.3 0]&&/3Y, 0p p.u+ P G P!*`!!* "}"@"M ""### $(!%%/3'`''o(v(,!!}"T ##J@$$##,$\%P$$$0&.3 &=&"`&X &'/3 '0((.3;P( ) )N* )_/3' +x#*W* *r+`***o++,.4n@,H#, .{!0/w.4$/+p0% 0Y$0 01 p111 2n'pW C  ( &`'B@N' ;p V ' &`S   A""##" j""2" .q -'3'  '@+ &q  0] u* 6 ` -0 2GpXY `(P1  - 2t0"p.!. -,7)6Z+p7X(7)7,8(8?+08;(P8)p8,7$+5(@6)6`4P L(-',Q +'\(&3 M-'v& (t m/ ;7|]&_~V()*;Y)/)u())%XQ_#ys/___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__19allocatorIN3mup5ValueEE8allocateEmPKv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNK3mup6IValue8IsMatrixEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZN3mup11ParserError10GetContextEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE26__invalidate_all_iteratorsEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNK3mup12IOprtPostfix9AsciiDumpEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNK3mup9ICallback9AsciiDumpEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNK3mup6IValue6GetDimEv__ZNK3mup6MatrixINS_5ValueEE6GetDimEv__ZN3mup9ICallback11AsICallbackEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__19allocatorIN3mup5ValueEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZN3mup6MatrixINS_5ValueEE9TransposeEv__ZN3mup6IToken7ReleaseEv__ZNK3mup15OprtCreateArray5CloneEv__ZNK3mup9OprtColon5CloneEv__ZNK3mup13OprtTranspose5CloneEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNK3mup15OprtCreateArray7GetDescEv__ZNK3mup9OprtColon7GetDescEv__ZNK3mup13OprtTranspose7GetDescEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup15OprtCreateArrayD2Ev__ZN3mup12IOprtPostfixD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup9OprtColonD2Ev__ZN3mup8IOprtBinD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup13OprtTransposeD2Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZN3mup15OprtCreateArrayC2Ev__ZN3mup9OprtColonC2Ev__ZN3mup13OprtTransposeC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIN3mup5ValueEEC2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup15OprtCreateArrayD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZThn80_N3mup9OprtColonD1Ev__ZN3mup9OprtColonD1Ev__ZN3mup5ValueD1Ev__ZN3mup13OprtTransposeD1Ev__ZN3mup11IPrecedenceD1Ev__ZN3mup6MatrixINS_5ValueEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZN3mup15OprtCreateArrayC1Ev__ZN3mup9OprtColonC1Ev__ZN3mup13OprtTransposeC1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1Ev__ZN3mup15OprtCreateArrayD0Ev__ZThn80_N3mup9OprtColonD0Ev__ZN3mup9OprtColonD0Ev__ZN3mup13OprtTransposeD0Ev__ZN3mup11IPrecedenceD0Ev_memset__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC2ERKS5_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC1ERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8allocateERS4_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10deallocateERS4_PS3_m__ZNSt3__19allocatorIN3mup5ValueEE10deallocateEPS2_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE14__annotate_newEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__annotate_shrinkEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__recommendEm___cxa_pure_virtual__ZN3mup6MatrixINS_5ValueEE2AtEii__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup15OprtCreateArray4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9OprtColon4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup13OprtTranspose4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZN3mup5ValueC1Ed__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZN3mup12IOprtPostfixC2EPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZN3mup5ValueC1Ec__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE7destroyIS3_EEvRS4_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9__destroyIS3_EEvNS_17integral_constantIbLb1EEERS4_PT___ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EEC2IDnvEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC1IDnLb1EEEOT___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE31__annotate_contiguous_containerEPKvS7_S7_S7___ZNSt3__1L8distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5___ZNSt3__1L4swapIiEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS2_EE5valueEvE4typeERS2_S5___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__1L16__to_raw_pointerIN3mup5ValueEEEPT_S4___ZNSt3__1L13__unwrap_iterIPN3mup5ValueEEET_S4___ZNSt3__1L6__copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__1L4copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8max_sizeERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS4___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L4moveIRiEEONS_16remove_referenceIT_E4typeEOS3___ZNSt3__19allocatorIN3mup5ValueEE7destroyEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE27__invalidate_iterators_pastEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endEmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mup6MatrixINS_5ValueEEC2EiiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiiRKS1___ZN3mup6MatrixINS_5ValueEEC2EiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiRKS1___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE25__construct_range_forwardIPS3_S7_EEvRS4_T_S9_RT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRS2_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRKS2_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRKS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRKS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZNK3mup6IValueltERKS0___ZN3mup6IValueaSERKS0___ZN3mup5ValueaSERKS0___ZN3mup15OprtCreateArrayC2ERKS0___ZN3mup12IOprtPostfixC2ERKS0___ZN3mup9OprtColonC2ERKS0___ZN3mup8IOprtBinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup13OprtTransposeC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup15OprtCreateArrayC1ERKS0___ZN3mup11ParserErrorC1ERKS0___ZN3mup9OprtColonC1ERKS0___ZN3mup5ValueC1ERKS0___ZN3mup13OprtTransposeC1ERKS0___ZTVN3mup15OprtCreateArrayE__ZTSN3mup15OprtCreateArrayE__ZTIN3mup15OprtCreateArrayE__ZTVN3mup12IOprtPostfixE__ZTIN3mup12IOprtPostfixE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup9OprtColonE__ZTSN3mup9OprtColonE__ZTIN3mup9OprtColonE__ZTVN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZNSt3__1L10__distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5_NS_26random_access_iterator_tagE__ZNSt3__1L9__advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeENS_26random_access_iterator_tagE__ZN3mup5ValueC1ERKNS_6IValueE__ZTVN3mup13OprtTransposeE__ZTSN3mup13OprtTransposeE__ZTIN3mup13OprtTransposeE__ZNSt3__1L7advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeE__ZNSt3__1L7forwardIRKN3mup5ValueEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRN3mup5ValueEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5_NS_17integral_constantIbLb0EEEGCC_except_table149GCC_except_table57GCC_except_table117GCC_except_table136GCC_except_table26GCC_except_table106GCC_except_table14GCC_except_table113GCC_except_table2GCC_except_table62GCC_except_table32GCC_except_table22GCC_except_table121___gxx_personality_v0GCC_except_table80GCC_except_table10#1/28 1573634236 501 20 100644 112716 ` mpOprtNonCmplx.cpp.oX `x`__text__TEXTx__literal16__TEXTx__gcc_except_tab__TEXT__cstring__TEXT __const__DATA __const__TEXT D__compact_unwind__LDh *X'__eh_frame__TEXT53 h2  )33T,d PmUHHH}H}HH}HH5s HHHƐHH}HHwPH]f.DUHHH}H}H]DUHH@H}HuHUM}HHH5ӐHH5ݐHHH5HH4HHH5HHxHƅHHHHHxHHxƅH5HHyHRHHH HHH}HvH}H8HpHHpfH~HH1fHnH}hH8H`HhH`P`HXWH}H8HPHHPȃmH}H8HHHHHH(WDž$$H}艅DH8H8HHHщ4D49H}H($H(HH1HH H HHH( f$H(1HHHHI`HH$$HH(H(H}HHHHHH(?HHHHΉHHDžH}HHHHHшƅsxHHHHH5HH|HHNHHHHH@]H  f.UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHHHHuHuHHEHEH]fDUHHH}H}H]DUHHH5H}H}H}HuHƀHH]UHH}H}H?H]f.fUHHH}H}HEMfEEiM EcME$H]DUHHH}H}H?4H}H=H5H +HEHHH]fUHHH}H}H]DUHHH}H}H]DUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5· HHHƐHH}HHwPH]f.DUHHH}H}H]DUHH0H}HuHUM}HHH5HH5HHH5ІHHfHHH5HHxHƅHHHHHxHHxƅH5HHGHRHHH HHH}H_H}H8HpHHpH}hH8H`HhH`P`HX<H}H8HPHHPȃmH}H8HHHHHH(WDž$$H}艅DH8H8HHHщ4D49H}H($H(HH1HH H HHH$H(1HHHHI`HH$$HH(H(H}HHHHHH(?HHHHΉHHDžH}HHHHHшƅsxHHHHH5HH|HHNHHHHH0]H  f.fUHH}H]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5 HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}4HH=kH5H bH}HEHEHHHEHEH8HHHȃm]HEHHЃmAHEHHHEHEHHHEH}H}9FxHƅCHHHHHHPHHHhHPAmDDHhHƅCH5HHu HHD;HHDHHDHhHPC HH}HvH|H|HHDžH}ȉxtxt9H}ȋ1HhHhggxHƅ/HHXHHPHHH0HHH}ȋ1H@H@HHHш?H?DHHH0AfHHHPƅ/H5HHXHHDHHHDHHD;HHDHHDHHH0/ HXH}1H0H0//xHƅHH HHHHHH}1HHHHHшHDHHAfHHƅH5HH $HHD;HHDHHDHH H KH}ȋ1HHHHHH}1HHHHHXH1HHHHI`HHH}HHHHHHHHPHHH}`xHƅ?HHHHHH@HHEHHHшHDHXH@AfHXHƅ?H5HHWHHD;HHDHHDHXH@? HH}`xHƅHHHHHHHHEHHHшHDHHAfHHƅH5HHHHD;HHDHHDHH HfHEHHHEHHppXH}hHHhQ`H`Hİ]HH  UHH}H}H?H]f.fUHH}H}]UHH H}uHUH}uHUH ]UHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=luH5huH uiHEHHcuHH0]@UHHH}H}HEMfE EiME$H]UHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=\tH5XtH {tXHEHHcuHH0]@UHHH}H}H]DUHH}Hr]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5q HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}4HH={qH5pH rqH}H8HHHȃmcHEHHH8HHHȃm-H}H8HHHHEHEHHH8HHHHEH}H}Љ9FxHƅSHHHHHxH`HxHHxH`AmDtDtHxHƅSH5HH HXT;HXTHXTHxH`S H= H}HvHhdH(dHhHDžH}؉`\`\9}H}؋1HPHPOOxHƅ?HH@HH8H0H@H0H}؋1H(H(HHHш'H'DHXH@AfHXH8ƅ?H5HH@gHXTH9HXTCHXT;HXTHXTHXH@? H@H}Ћ1HHxHƅHHHHHHHH}Ћ1HHHHHшHDHHAfHHƅH5HHlHXT;HXTHXTHH H H}؋1HHHHHH}Ћ1HHHHH\H}؋1HHHHHH}Ћ1HHHHH\H(H(1HHHHIxHHHOH}HHHHH(HHxH(H(H}HxxHƅ?HHpHHhH`H@H`H}HXHXHHHшWHWDHXH@AfHXHhƅ?H5HHpHXT;HXTHXTHXH@? Hp@HEHHHxHƅHHHHH@H8HH8HEHHH0H0HHHш/H/DHHAfHH@ƅH5HHH!HXT;HXTHXTHH HHH}H8H HH HEHHH8HHH\H}H8HHHP`HH]HX  f.@UHH H}EMH}EMH ]ÐUHH}Hd]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5 d HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}4HH=+cH5bH "cH}HEHEHHHEHEH8HHHȃmHEHHЃmxHEHHHH}HHEHHHHH}HH}|H}x|x9nxHƅHHpHHhH`HH`HHHAmD\D\HHhƅH5HHpH HxtHxtHxt;HxtHxtHH HpdWDžH}XTXT9H}1HHHHHHH@H}1H8H8HHH0@0YXH}(H H HHI`H(HH}H}3H}H}%HEHHЃmH}H}H8HHHHHDžH  9H1HHHHHHEHHHYH1HHHHI`HHHxtHH}HHHHHHHH$HEHHЃmH}HEHHHHDžH9H1HHHHHHEHHHYH1HHHHI`HHHxtHH}HHHHHHHH?H}`xHƅHHxHHpHhHHhHEHHHшgHgDH0HAfH0HpƅH5HHxaHxt;HxtHxtH0H HxH}`xHƅHHXHHPHHHHHHEHHHшGHGDHHAfHHPƅH5HHXHxt;HxtHxtHH HXpHEHHHEHH88YH}0HH0Q`H(H]Hx  f.UHHH}HuH}HuH]f.UHH}HW]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5*W HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUMHU}4HH=;VH5UH 2VcH}HoxHƅcHHHHHHpHH}HHHHHшHDH}HpAfHuHƅcH5HHHhd8HhdHhdH}Hpc H@HEHHHxHƅHHHHHHHHEHHHHHHHшHDHHAfHHƅH5HH!Hhd;HhdHhdHH HH}H8HHHHEHHH8HxHHx^H}pH8HhHpHhP`H`Hİ]Hh  fUHH}H~R]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5Q HHHƐHH}HHwPH]f.UHHH}H}H]DUHHH}HuHUM}4H=PH5JPH QH}H8H}HHEEHEHHH8H}HHEE,MЉMEЋM*\Wf.EȉHMEpHHMHcHEH}EH8H}HEHEP`HEEYEH}EH8H}HEHEP`HxEYEYEH}pH8HhHpHhP`H`4EYEYEYEH}XH8HPHXHPP`HHEYEYEYEYEH}@H8H8H@H8P`H0E؋}H}(H8H H(H P`HFEMH}H8HHHP`HH] ;uUHHE}E}*H]fUHH}H!N]f.DUHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}H]DUHHH}H}H}H}H]UHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}H}HHXH}HH}H]f.@UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEHXOXH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHHH}HuHuH]UHH} fDUHH} fDUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEH@XHGXH ]f.DUHH}EMH}EEG]DUHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH H}uHUHUu2BBHHHc2HUH ]f.UHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHHHUH}GHuH}HuHUH}HEMHEHH0]H} fDUHH H}H}H}HEHH@HHEHuHH ]HHUUHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHHk}pHHHE1ɉH}H8H}H0]f.@UHH@H}HuHUHUHHHUHEH}HuH}HUHrH}HHUH}HHEHPHpHPHUHHUH}H}H@]UHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH@H}HuHuHHuH}HEH}HEHkpHuHH}HuH}HEHkpHuHH}HuHkupHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}HI$I$I]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H=Hk}pH ]f.UHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}HE]fUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHHH}H}H}pHHUH2H)HHH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHuH~H}HuHEH;E4H}H}HǐH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}HuHuH>H}HHuV8H ]DUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}HHH}HHEHHH]UHH H}H}H}HEH}HuH}H}H ]HHUUHHH}H}H]DUHpH}H}HWH?H)HHH]fUHHPH}HuHuHHuH}HEH}HEHkpHuHH}HuHkupHH}HEH}HEHkpHuHH}HEHuHHUHMLEHP]f.UHH}]fDUHHH}H}H]DUHH}HuHuH6Hk}pHH]UHH}HuHuH6Hk}pHH]UHH0H}HuHuHHH}HuHuH}H0]ÉHEMH}H} UHHH}H}H]DUHH H}HuHuH}GFH}H}GFH}HHH}HHuHEH ]f.UHHH}H}H]DUHH H}HuHuH;uHu+HEHMHHHEH0HEHPH}HEH ]fUHH H}HuH}HuH ]f.UHHpH}HuHUHUH}HuHUHEHEH}HEHUH9HEHEEHEH}HEH}H9!EHEHEH}H}HH}HuHEHHEEIHuHUHEH}HuHUHEHUH)H}HuHEHUHHM HuH}7H}HuH}H}HHuHUHMH}H}Hp]UHH}Hu]fUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH0H}HuHUH}H}HEH}HEH}HuHH0]UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH H}H}H?H}\H}H}H}H7HEHuH}HuHHEHHHEH@HH ]UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHpH}HuHuH}H)HHH]UHH}HuHuH}HkpH7H7]UHH H}HuHUHEH;E.HuH}HEHEHpHEHEHpHEHEH ]fDUHH}HE]fUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHpHEHEHHpHH0]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH}Hu]fUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]K<<"$9 ' -   UUY &&L=,K<<"$9 ' -    &&L=,<:9S4<j 9   4 < j 9  U<F9<F9 &&L=,<:9S 4< j 9   4 < j 9   ]<h9<k9 &&L=,!5<:9  ~ D<F9<F9 &&L=,5<e6<k9 &&L=, &&L=,  UU `[  -1& )A 3$ " E ##_B:  G+9 C6_U5 9T * M L t  / *L, @5( Cf-Assertion "a_iArgc == 1" failed: /Users/jgomez/muparserx/parser/mpOprtNonCmplx.cpp line .-x - negative sign operator++x - positive sign operatorEvalnum==2x+y - Addition for noncomplex valuessubtraction*multiplication/division^argc==2x^y - Raises x to the power of y.allocator::allocate(size_t n) 'n' exceeds maximum supported sizeoperator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokAt/Users/jgomez/muparserx/parser/mpMatrix.hi < (int)m_vData.size()p@@h@h@ppN3mup11ParserErrorEN3mup8OprtSignEN3mup11OprtSignPosEN3mup7OprtAddEN3mup7OprtSubEN3mup7OprtMulEN3mup7OprtDivEN3mup7OprtPowENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup11IPrecedenceEQ`APA``B*9@`[^ @ `  iAx # Q  A@`iA؍#V`_ A)@IP0PiA#VP p AP-/--iAP.#@.V..s A`@:#p::iA;#0;V;;7A?@iA4@#@VA0A0D'`DDiADD# E@E(pEEEE(F F@F`F(FFFF( G@G`GG(GGGH(@H`HHH(HHI2PIiIIJ(0JPJpJJCJ(KWpNZN OQATpTT#T#TU0UPU2U*UU"V@PV`VOV1VW'@W`WpWWWWWW X XLpX$XX%XVPYOYY#YupZ"ZZ$ZM@[(p[B[M\o\S\ ] ]  ]Mp]M]q@^+p^M^M_M`_M___`0`P`p``7`Ala!aaU@b+pbKbU c9A`ccOc1 d$Pdpd dddAfff9AĐ0i#`iigij!@j`j7j,j&k<@kQAܐkkk|A`l"l+l$l+ n@n3n#nnnoC`o#o2pC q0q#`q#q/q2r'0rer'rr/ s2`s/sssst0tPt`tt[tdAPupu#u?uv vOA pvCv+vAw`A(wx yZy y#yIz z6`zz zYA8z' {@{`{|#0|P|p| |M|(} }@}`}}}U}~0~P~`~~~~~80P`+F F`p7Ѐ+AH##+;AXPp9XAh0'`  @ ` ]AxV`W#Yp##M0krA @(p ZrFЋF 07p#MzRx $X8QAC $D8AC zPLRx ,$h8AC ,T>AC $>BAC $?*AC $<?AC $d?9AC $(?AC $ ?[AC $X?^AC $?AC $,?AC $T?AC ,x?i_AC $?#AC $?QAC $?AC ,?AC $T`EAC ,XEiAC $E#AC $EVAC $EAC ,E_ 'AC $TQAC $|PAC $P)AC $PAC $QIAC $QAC $D@RAC $l8RAC ,,0RicAC $pR#AC $xRVAC $RAC ,R AC $lX_/AC $`_AC ,TX_iAC $_#AC $_VAC $<_AC ,_s _AC $ k#AC $(kAC ,| kigAC $`k#AC $<hkVAC $dkAC ,$k7ϿAC $oAC ,|oiAC $ o#AC $< oVAC $d pAC $ pAC $ r'AC $ rAC , riAC $4 0s#AC $\ 8sAC $ 0s(AC $ 8sAC $ 0sAC $ (sAC $$ s(AC $L (sAC $t sAC $ sAC $ s(AC $ sAC $ sAC $< sAC $d s(AC $ sAC $ sAC $ rAC $ r(AC $, rAC $T rAC $| rAC $ r(AC $ rAC $ rAC $rAC $Dr(AC $lrAC $rAC $r2AC $riAC $ (sAC $4 sAC $\s(AC $ sAC $sAC $sAC $sCAC $$0s(AC $L8sWAC $tpvZAC $v AC $wAC ,y˷AC ${AC $D{#AC $l{#AC ${AC ${AC ${AC $ {2AC $4{*AC $\{AC ${"AC ${@AC ${AC ${OAC $$|1AC $L|AC $t|'AC $|AC $|AC ${AC ${AC $<{AC $d{AC ${AC ${ AC ${AC ${LAC $,{$AC $T{AC $|{%AC ${VAC ${OAC $ |AC $|#AC $D |uAC $lx|"AC $|AC $x|$AC $|MAC $ |(AC $4|BAC $\|MAC $}oAC $H}SAC $} AC $x} AC $$`} AC $LH}MAC $tp}MAC $}qAC $}+AC $}MAC $ ~MAC $<H~MAC $dp~MAC $~AC $~AC $~AC $~AC $,x~AC $Tp~AC $|h~AC $`~7AC ,dx~AC $!AC $$AC $LUAC $t@+AC $HKAC $pUAC ,9AC $AC $DOAC $l1AC $$AC $AC $ AC $ AC $4AC ,AC $AC $AC ,t9KAC $ #AC $4AC $\gAC $AC $؃!AC $AC $؃7AC $$,AC $L&AC $t<AC ,4QAC $HAC $@AC ,8|3AC $L "AC $t +AC $ $AC $ +AC $ AC $!3AC $-|-p-`-L-C----و -ˈ---l-W-#----ɇ--_-VW-AU-5-(V--W- --- -t -J-5--ɅX--q-H--ׄ-΄[---1H--Ѓ -Ã----|-!\---߂-҂-ł -[--e-G-0-Ɂ--|-T-H-3--Ā---L-<----A-%-~-~-~-A~-~-}-}-}}-Q}-}-|-u|-e|-A|-|-{-{-{-{-{-{-|{-U{-5{- {-z-z-z-z-z-qz-=z-y-y-y-y-py-`y-Ly-Cy-y-x-x-x-x-hx-Tx-2x-&x-x-x>-w-w-w-tw-`wH-Aw-+wU-w-vZ-vY-kv-YvE-Kvk-u-u=u-u-eu->u-5u-#u-u=u=u-t-t-t-tt-At-t-s-}sH-AsH- sH-r~-r}-`r|-r{-rH-qH-qz-qf-yqy-Eqw- qx-pw-pI-pD-pD-jpv-]pu-Ipt-8ps- pr-pq-pp-oo-o-on-om-yol-IoG-8ok-nj-ni-nh-ing-1nf- ne-mc-md-mc-m'-m-md-wmc-^m -Jm-1m-l-xl-kl=Vl-Ml-/l-la-l`-k-k_-k-gk]-2k-!kD-j\-'j[-iZ-i?-iC-IiY-!i-hW-hU-kh-Vh- hU-g-gV-gU-AgT-f-f-f-|f-if-Nf-Df-*f-!f-eR-eQ-eP-eP-eO-eN-dM-d-dL-adK-:d-dJ-cI-cH-c-c-qcG-Uc-CcE-5cD-b-b=b-bC-b-+bC-a=aB-a-|a-,a@-a?-`=`>-`-a`-A`-!`-`-_-_-_}_-:_{3_-^|^-^~^-^=]-]'-]z]-J]yC]-\x=\=\-R\=K\-3\'-[[-[-[-[- [=-Z5-Z5-Z5-UZ@-Z@-Y<-Y;-{Y:-eY2-Y9-Y2-X-NXC-->=>c=>-}>-><->-=-=-=*-=<-=-p=-d=-=-== =c=<-<-<<-v<-W<-0<-<*-<<-<-;;;;-c;{\;-M;; -:-:-:-:-{:Y:-+:-9;-9-9-9-89-,9=%9c=9-8-8-8-[8-G8*-98-8-8-7-7=7c=7-7-07-7-6-6*-6-6;-y6-6-5-`5-->5-5*-4-4;-4-24-3-3--^3-53<-3*-2-2-2-2-2;-2-1-1--z1-\1-P1-0-0=0c=0-0-c0-D0-0-/--/--/-/-8/:-$/:-/- //.. -s.|l.-].).-.--------u--:--,;-,<-,<-,-j,-^,-,- ,=,c=+-+-u+<-`+-A+-+-+*-*<-*-*-*-w*-k*=d*c=Q*-9*-)<-)-)-)-n)*-f)<-X)-G)-);-(-(-/(,-',-',-S',-='-'-'-&-&=&c=&-&-*&,-&-%-%-%*-%,-v%-X%-L%-$-$-$=$c=$-$-/$,-$-#-#-#*-#,-a#--B#-1#-#-"--"-"-"-z"-n"=g"c=T"-<"-!-!-!-!--!--g!<-9!<- !<- <- -   a -# ~ - ----l-;!--- --- -/--;-`-B-6--=c=--W-8--*----}-q=jc=W-?----*-~-m-,;--x,-8,-"----=c=-r-,----*-q,-[-=-1---=c=-w-,----*-v,-F--'--------_-S=Lc=9-!------s--:-:--q-3z,-----|-K,- ----=c=-u-)<------;-{-- <-] <-> - <- <- ;- <-o +-g <-Y R-H -* - - = c= - -v -^ ]-R ? -" ]-  ]-  ]-  - -N yG -=  "- - - - -k Q -1 - -/-S- w=-=-T-E-Q-H-6-w=-=-w=y=r->-----=c=--;<-(-----;--&-<-T<-5- <-<-;-e<-O+-G<-9R-(- --=c=--V->]-2-]-]-]--q#-.'-lxph`aPHu@0J( KL%IMNjvph`H@8 xph_`_X`P`H^@^8_0( kkQRkrpphq`PHs@0(o mtg5xph`XPH@48g( e10exph`XfH@830(   2fh7xph`XPH@806(hd/.xdh`XPHb80() (bnixph9`XP$H%@80( 8i*))))`)@) ))((((`(X(P(@( ((''''`'@' ''&&&&&&`&@& &&%%%%%%x%p%`%@% %%$$$$$$`$@$ $$####`#@# ##""""`"@" ""!!!!`!@! !!    ` @ 8 0   `@ `XP@ `@ `@ `@ `@ `@ `@ `XP@ `@ `@ `@ `@ `@ `@ `@ `@ `@     ` @         ` @       ` @       ` @       ` @   `@ `@ xp`@ `@ `@80 `@ `XP@ `@ xp`XP@ {MD5PE' {c`\`6ac`6 cbxad؍bn00@/`@c:P-Cb:@^cPb`bcc4nI0DcD| pT$TNT TU%0UEPU@ UDU9U#5pNfW WX1X%PY3YEY>YbTV `VHPVV VZ W@WzMpW`W>JW` pZZzZMZF@[a\a@bbl5b5\pb@`cCcbcd  d PdWpd|df|[0i`iiLi4jb@j3`j;j14jaĐ([@k=k4l;kEkaܐ(kX`l=lc.  nF@nGnn@FoG vLnn"@`o?p$I`qqi1q rT20rrZ/rh<r0 s1`s X q@0qtVsrLs:<0t,`ttuLstYMPt+=t,Pu=puVbw=uLv,c wKx~byAy/b(K {^.z @{=0`{.`D~O ~ /Ѐ5AyXz@ z^ `zszP|F0|p|I|a8}}{0~~~)C`~ZN|.G}@}}H| }*`}~gP~ 0P-W`P;Op0K/>jbH/?`J,PdX 0`9gch'cx{`6DCEapCmWEJ2U@Vp+E[ENJpScHOWX >PЋN0*NnQ\[R\(]"]7 R& Q ] A(E!E _&"&I!@ p[y6PIL5M@:MMMpvE#p8ES'`yRp]-(`F#@F_7;R@&;Q_0; (H!GP`Z8.S;'.'R^@.(G"`Gl0`t70ARD&AQ`_@'Hs!Hp`8p ^S.0'P Rp^B")F0#F`Q]!8R &`Q[w(@E\" EV_@R\`@^  `6@P^0{@?:Bp:aD`D-z- %` s @l;z6Xf>W6:X<pXzW<sQ=f: XAog yM4K9Q9OTN+J-&pJJ+Hfo+J%PI.d2w !-0`B LvKvu&0 <`[\ZZКYTT0 Z TUS HZU`__ sYPTPT YdSUS4ZsU4_^p^ZY؛sT@YSUPS ZkUN_8&^8*0J$I!( F!F(F"F'`H!@H(Gr"G'HX!H)@G# G[(E@"pE+PJJ%I:c:X7T`#`6d6.S>:"WQ` R?QLT@D 0 lA   Y= ":B;>qD%*$1I!$*R$Q9)#Y%32c3fY"r4YSVU]]S]] ,UTwSAUUVW$] ,7)e#?cY*$)$s)#j|,6,D,a:t:^,3Gc,Tt,__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw_pow__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__19allocatorIN3mup5ValueEE8allocateEmPKv__ZThn80_NK3mup10IOprtInfix16GetAssociativityEv__ZNK3mup10IOprtInfix16GetAssociativityEv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE26__invalidate_all_iteratorsEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup6IValue18IsNonComplexScalarEv__ZNK3mup6IValue8IsScalarEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNK3mup10IOprtInfix9AsciiDumpEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup9ICallback11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZThn80_NK3mup10IOprtInfix6GetPriEv__ZNK3mup10IOprtInfix6GetPriEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__19allocatorIN3mup5ValueEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4sizeEv__ZN3mup9ICallback8AsIValueEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup7OprtPow5CloneEv__ZNK3mup7OprtDiv5CloneEv__ZNK3mup11OprtSignPos5CloneEv__ZNK3mup8OprtSign5CloneEv__ZNK3mup7OprtMul5CloneEv__ZNK3mup7OprtAdd5CloneEv__ZNK3mup7OprtSub5CloneEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup10IOprtInfix13AsIPrecedenceEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNK3mup7OprtPow7GetDescEv__ZNK3mup7OprtDiv7GetDescEv__ZNK3mup11OprtSignPos7GetDescEv__ZNK3mup8OprtSign7GetDescEv__ZNK3mup7OprtMul7GetDescEv__ZNK3mup7OprtAdd7GetDescEv__ZNK3mup7OprtSub7GetDescEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup10IOprtInfixD2Ev__ZN3mup7OprtPowD2Ev__ZN3mup7OprtDivD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup11OprtSignPosD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup8IOprtBinD2Ev__ZN3mup8OprtSignD2Ev__ZN3mup7OprtMulD2Ev__ZN3mup7OprtAddD2Ev__ZN3mup7OprtSubD2Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZN3mup7OprtPowC2Ev__ZN3mup7OprtDivC2Ev__ZN3mup11OprtSignPosC2Ev__ZN3mup8OprtSignC2Ev__ZN3mup7OprtMulC2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup7OprtAddC2Ev__ZN3mup7OprtSubC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIN3mup5ValueEEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZThn80_N3mup7OprtPowD1Ev__ZN3mup7OprtPowD1Ev__ZThn80_N3mup7OprtDivD1Ev__ZN3mup7OprtDivD1Ev__ZN3mup12ErrorContextD1Ev__ZThn80_N3mup11OprtSignPosD1Ev__ZN3mup11OprtSignPosD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZThn80_N3mup8OprtSignD1Ev__ZN3mup8OprtSignD1Ev__ZThn80_N3mup7OprtMulD1Ev__ZN3mup7OprtMulD1Ev__ZN3mup5ValueD1Ev__ZNSt3__16localeD1Ev__ZN3mup11IPrecedenceD1Ev__ZThn80_N3mup7OprtAddD1Ev__ZN3mup7OprtAddD1Ev__ZThn80_N3mup7OprtSubD1Ev__ZN3mup7OprtSubD1Ev__ZN3mup6MatrixINS_5ValueEED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZN3mup7OprtPowC1Ev__ZN3mup7OprtDivC1Ev__ZN3mup11OprtSignPosC1Ev__ZN3mup8OprtSignC1Ev__ZN3mup7OprtMulC1Ev__ZN3mup7OprtAddC1Ev__ZN3mup7OprtSubC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1Ev__ZThn80_N3mup7OprtPowD0Ev__ZN3mup7OprtPowD0Ev__ZThn80_N3mup7OprtDivD0Ev__ZN3mup7OprtDivD0Ev__ZThn80_N3mup11OprtSignPosD0Ev__ZN3mup11OprtSignPosD0Ev__ZThn80_N3mup8OprtSignD0Ev__ZN3mup8OprtSignD0Ev__ZThn80_N3mup7OprtMulD0Ev__ZN3mup7OprtMulD0Ev__ZN3mup11IPrecedenceD0Ev__ZThn80_N3mup7OprtAddD0Ev__ZN3mup7OprtAddD0Ev__ZThn80_N3mup7OprtSubD0Ev__ZN3mup7OprtSubD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC2ERKS5_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC1ERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8allocateERS4_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10deallocateERS4_PS3_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__19allocatorIN3mup5ValueEE10deallocateEPS2_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE14__annotate_newEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__annotate_shrinkEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZN3mup5Value2AtEii__ZN3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup10IOprtInfixC2EPKci__ZN3mup7OprtPow4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtDiv4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup11OprtSignPos4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtSign4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtMul4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup7OprtSub4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZN3mup5ValueC1Eid__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZN3mup5ValueC1Ec__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE7destroyIS3_EEvRS4_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9__destroyIS3_EEvNS_17integral_constantIbLb1EEERS4_PT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC1IDnLb1EEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE31__annotate_contiguous_containerEPKvS7_S7_S7___ZNSt3__1L8distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__1L16__to_raw_pointerIN3mup5ValueEEEPT_S4___ZNSt3__1L13__unwrap_iterIPN3mup5ValueEEET_S4___ZNSt3__1L6__copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__1L4copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8max_sizeERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZL3powIdiENSt3__116__lazy_enable_ifIXaasr3std13is_arithmeticIT_EE5valuesr3std13is_arithmeticIT0_EE5valueENS0_9__promoteIS2_S3_vEEE4typeES2_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__19allocatorIN3mup5ValueEE7destroyEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE27__invalidate_iterators_pastEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endEmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZN3mup6MatrixINS_5ValueEEC2EiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiRKS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE25__construct_range_forwardIPS3_S7_EEvRS4_T_S9_RT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRS2_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRKS2_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRKS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRKS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZN3mup6IValueaSERKS0___ZN3mup5ValueaSERKS0___ZN3mup10IOprtInfixC2ERKS0___ZN3mup7OprtPowC2ERKS0___ZN3mup7OprtDivC2ERKS0___ZN3mup11OprtSignPosC2ERKS0___ZN3mup8IOprtBinC2ERKS0___ZN3mup8OprtSignC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup7OprtMulC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup7OprtAddC2ERKS0___ZN3mup7OprtSubC2ERKS0___ZN3mup7OprtPowC1ERKS0___ZN3mup7OprtDivC1ERKS0___ZN3mup11OprtSignPosC1ERKS0___ZN3mup8OprtSignC1ERKS0___ZN3mup7OprtMulC1ERKS0___ZN3mup5ValueC1ERKS0___ZN3mup7OprtAddC1ERKS0___ZN3mup7OprtSubC1ERKS0___ZTVN3mup10IOprtInfixE__ZTIN3mup10IOprtInfixE__ZTVN3mup7OprtPowE__ZTSN3mup7OprtPowE__ZTIN3mup7OprtPowE__ZTVN3mup7OprtDivE__ZTSN3mup7OprtDivE__ZTIN3mup7OprtDivE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTVN3mup11OprtSignPosE__ZTSN3mup11OprtSignPosE__ZTIN3mup11OprtSignPosE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTVN3mup8OprtSignE__ZTSN3mup8OprtSignE__ZTIN3mup8OprtSignE__ZTVN3mup7OprtMulE__ZTSN3mup7OprtMulE__ZTIN3mup7OprtMulE__ZTVN3mup9ICallbackE__ZNSt3__1L10__distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L9__advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeENS_26random_access_iterator_tagE__ZTVNSt3__18ios_baseE__ZNSt3__1L7advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeE__ZNSt3__1L7forwardIRKN3mup5ValueEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRN3mup5ValueEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZTVN3mup7OprtAddE__ZTSN3mup7OprtAddE__ZTIN3mup7OprtAddE__ZTVN3mup7OprtSubE__ZTSN3mup7OprtSubE__ZTIN3mup7OprtSubE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5_NS_17integral_constantIbLb0EEEGCC_except_table198GCC_except_table258GCC_except_table18GCC_except_table187GCC_except_table167GCC_except_table47GCC_except_table247GCC_except_table37GCC_except_table237GCC_except_table296GCC_except_table246GCC_except_table184GCC_except_table174GCC_except_table44GCC_except_table24GCC_except_table14GCC_except_table104GCC_except_table3GCC_except_table53GCC_except_table243GCC_except_table33GCC_except_table323GCC_except_table303GCC_except_table2GCC_except_table51GCC_except_table311GCC_except_table201___gxx_personality_v0GCC_except_table60GCC_except_table40GCC_except_table20GCC_except_table300 #1/36 1573634236 501 20 100644 12028 ` mpOprtPostfixCommon.cpp.oH h__text__TEXT+ hb__literal8__TEXT0 __gcc_except_tab__TEXT@ |__cstring__TEXT $__const__DATA`("__const__TEXTG__compact_unwind__LD@( &__eh_frame__TEXTX! h2  `!H% P&*UHHH}H}HH}HH5 HHHuHH]fUHHH}H}H]DUHHH}HuHUMHUH}HH~xHƅ_HHHHHHH`HH}HHHHHшHDH}H`AiHuHƅ_H5HHHE|2HE|HE|H}H`_ H/H}H8HHHXX*PX8xHƅHHHHxtHHhHHhH%HtHHxƅH5HH#HE|5HE|HE|HH H Pf.5YB XH}`H8HXH`HXP`HPH]H}  UHH}H}H?H]f.fUHH H}H}H}1ɈʨUqHEHH1@Wf.@uKEHEHHHEHHE,*Mf.@AD @uE$H ]@UHHH}H}H]DUHHH}H}H]DUHHH}H}H?4H}H={H5~H HEHHH]fUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH}HH5?HHHuHH]fUHHH}H}H]DUHH H}HuHUMHUH}HHHHHAAfDD@Di<zH}H8H0HH0 EE^H}(H8H H(H P`HxHƅWHHHHHHHHHXHH}HHHHHшHDH}HXAfHuHƅWH5HHHxt8HxtHxtH}HXW H H ]Hx  fUHH}Hc]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HEMfEEiM EcME$H]DUHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHHH}H}H]?Y@3TTSf6S9 &&L=,Sf6 &&L=,!x! - Returns factorial of a non-negative integer.%x% - Returns percentage of integer/float.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup11ParserErrorEN3mup8OprtFactEN3mup14OprtPercentageE>@`A@ `0Pp^iAx `#>A  iA  #@ ` (  ( [@ 2 B ? ?P S ?  zRx $H>AC $D`AC zPLRx ,$8AC $AC $AC $ AC $4AC $\x^AC $AC ,DiAC $#AC $>AC $,AC ,AC $`AC ,DXiSAC $#AC $AC $,(AC $TAC $|(AC $[AC $2AC $BAC $?AC $D0?AC $lHSAC $?AC $AC $AC ! /- /- ( -z @=s 3-: ?=3 - ) - ;- ;- ;-h -_ ;- A- - -~ A-u -Q -) - *- A- - B- v *-\ E-> ;-2 -F-="=+---Q!-C:-$8- 7-D- -n!-!- -(.-y-S*-JA-)- B-C-a-A--P*- -E-u;-i-*F-="=+-,-:-8-7-lD-!!-E-;--F-="=+-r--!-:-8-7-D--!-Q-))".- <&><'> 2105469#x%p=h`X2PH@18005(4 69$`@ `@ GG`@80G `XPG@ {GM@ x   0W@ P& w     q ``n@ ` @ A P c   uHp`pPx`s 8.V:.)Y;?b___cxa_throw__ZdlPv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNK3mup6IToken8GetIdentEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup6IValue9IsIntegerEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup12IOprtPostfix9AsciiDumpEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup8OprtFact5CloneEv__ZNK3mup14OprtPercentage5CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNK3mup8OprtFact7GetDescEv__ZNK3mup14OprtPercentage7GetDescEv__ZN3mup12IOprtPostfixD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup8OprtFactD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup14OprtPercentageD2Ev__ZN3mup8OprtFactC2Ev__ZN3mup14OprtPercentageC2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup8OprtFactD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup14OprtPercentageD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup8OprtFactC1Ev__ZN3mup14OprtPercentageC1Ev__ZN3mup8OprtFactD0Ev__ZN3mup14OprtPercentageD0Ev___assert_rtn___cxa_allocate_exception___cxa_free_exception__Znwm__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup8OprtFact4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup14OprtPercentage4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__Unwind_Resume__ZN3mup12IOprtPostfixC2EPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZN3mup12IOprtPostfixC2ERKS0___ZN3mup8OprtFactC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup14OprtPercentageC2ERKS0___ZN3mup8OprtFactC1ERKS0___ZN3mup14OprtPercentageC1ERKS0___ZTVN3mup12IOprtPostfixE__ZTIN3mup12IOprtPostfixE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTVN3mup8OprtFactE__ZTSN3mup8OprtFactE__ZTIN3mup8OprtFactE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup9ICallbackE__ZTVN3mup14OprtPercentageE__ZTSN3mup14OprtPercentageE__ZTIN3mup14OprtPercentageE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table9GCC_except_table15GCC_except_table13GCC_except_table2___gxx_personality_v0 #1/28 1573634237 501 20 100644 20588 ` mpPackageCmplx.cpp.o8 +X+ __text__TEXTX0__StaticInit__TEXTK7__gcc_except_tab__TEXTD __literal8__TEXTp"__common__DATA+__cstring__TEXTx"__const__DATAX"7 __const__TEXT8#__mod_init_func__DATAP#08 __compact_unwind__LDX#886__eh_frame__TEXT$@(9 h2  9g`@ P61UHHH}H}H]DUHH HHHVHHH}HHMHHHuHEMH}HHH ]H} fUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHHH}HuH}H5HEHxHHXW HhHXHuHhHxHhH}H}PHpHHHHhHH`H@HHhHXHpHXH@H}PHPHHHHHHH@H8HHHH8HPH8H8H}PH0HHHH(HH H0HH(HH0HH0H}PHHHHHHHH(HHHHHH(H}PHHHHHHHH HHHHHH H}PHHHHHHHHHHHHHHH}PHHHHHHHHHHHHHHH}PHHHHHHHHHHHxHHxHH}PHpHHHHhHH`HHHhHXHpHXHH}PHPHHHHHHH@HHHHH8HPH8HH}PH0HHHH(HH HHH(HH0HHH}PHHHHHHHHHHHHHHH}PHHHHHHHHHHHHHHH}PHHHHHHHHHHHHHHH}PHHHHHHHHHHHHHHH}PHHHHHHHHHHHxHHxHH}PHpHHHHhHH`HHHhHXHpHXHH}PHPHHHHHHH@HHHHH8HPH8HH}PH0HHHH(HH HHH(HH0HHH}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHxHHxHH}`HpHHHHhHH`HHHhHXHpHXHHİ]ÉHPLHPLHhH};HPLH`HPLH@HPLH@HPLH8HPLH HPLH0{HPLH[HPLH(;HPLHHPLH HPLHHPLHHPLHHPLH{HPLH[HPLH;HPLH`HPLHHPLH@HPLHHPLH HPLH{HPLH[HPLH;HPLHHPLHHPLHHPLHHPLHHPLH{HPLH[HPLH;HPLH`HPLHHPLH@HPLHHPLH HPLH{HPLH[HPLH;HPLHHPLHHPLHHPLHHPLHHPLH{HPLH[HPLH;HPLH`HPLHHP f.DUHHH}HuH}HuH]f.UHH H}EMH}EMH ]ÐUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHHHuH5THEHEH]UHHHHuH5$HEHEH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HH}HHHH}HH]fUHH}EMH}EEG]DUHHH}H}H]DUHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQ H ]f.UHH}HE]fUHH}H}H]f.DUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUPH$UHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHHHH HHHEH]f.DUH] 33`CT11/e|:"1"1"1"1"1"1"1"1  "  1  "  1  "  1  "  1  "  1 " 1 "!1!"!1!""1"""1""#1#"#1#"$1$"$1$"%1%"%1%"& %/d %/d %/d?iN3mup12PackageCmplxE1 AePpAA#/ #Pp##)@)p(7+0Pp5 0PG1 $Pp ;pA<@;pAL;0pA\ zRx $1AC $D8AC zPLRx ,$AC $AC $xeAC $ AC ,A3AC $d#AC $/AC $#AC $AC $#AC $,AC $T#AC $|AC $)AC $)AC $AC $(AC $D7AC $l+AC $AC $AC $AC $ AC $4AC $\AC $5AC $AC $AC $GAC $$AC $LAC $t1AC $$AC $AC $ AC $;AC ,pkAC $lP;AC ,,hp#AC $;AC ,pAC $@ AC 5-VX-!Y-5-X-qY-;\-2b-,5-X-Y-a-:e---f--Z-}1-l----e-AW-4V-_-!-"-[ -R+ -"&-$-*-(-a.-9,-- -6-%-_-_)-?_-)-_-)-_-)-_-_)-?_---_---_---_-_--?_---_---_---_-_--?_---_---_---_-_--?_---_---_---_-_--?_---_---_---_-_[-VU-%- B- #- S- `- )- @-~ '-\ P-@ `-& )- @- '- N- `- )- @- '-d O-H `-. )- @- '- Q- `- )- @- '-l M-P `-6 --% C- +- =- `- -- C- +-t 8-X `-> --- C- +- R- `- -- C- +-| G-` `-F --5 C-" +- <-`---C-+-7-h`-N--=C-*+-;-`---C-+-K-p`-V--EC-2+-L-`---C-+-E-x`-^--MC-:+-J-`---C-+-?-`-f--UC-B+- :-`---C-+->-`-n--]C-J+-(H- `---C-+-9-`-v--eC-R+-0D-`---C-+-F-`-~--mC-Z+-8I-`-[-U-A-T- - -a-; -/----6--_-w-k_-I`-3-+-E-$a-c P]H3@^0 (! 0/2`XPd@ dd`@ `@ `@ `@ d`XPd@ {dM {P p> b   P J 0iT Pp{<L\ pe+` bP p0 7 0 pb @0   @PU@ c I /  0 j6P ;#  t > Y }G +F,% fP}   r    __ZSt9terminatev__ZdlPv__ZNK3mup12PackageCmplx9GetPrefixEv__ZNSt3__117__compressed_pairIPN3mup12PackageCmplxENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup12PackageCmplxENS_14default_deleteIS2_EEE5firstEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup12PackageCmplxEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup12PackageCmplxELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup12PackageCmplxELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup12PackageCmplxENS_14default_deleteIS2_EEE3getEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup12PackageCmplx8InstanceEv__ZNSt3__117__compressed_pairIPN3mup12PackageCmplxENS_14default_deleteIS2_EEE6secondEv__ZNK3mup12PackageCmplx7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12PackageCmplxD2Ev__ZN3mup8IPackageD2Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED2Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNSt3__110unique_ptrIN3mup12PackageCmplxENS_14default_deleteIS2_EEED2Ev__ZN3mup12PackageCmplxC2Ev__ZN3mup8IPackageC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup12PackageCmplxD1Ev__ZN3mup5ValueD1Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__110unique_ptrIN3mup12PackageCmplxENS_14default_deleteIS2_EEED1Ev__ZN3mup12OprtPowCmplxC1Ev__ZN3mup12OprtDivCmplxC1Ev__ZN3mup13OprtSignCmplxC1Ev__ZN3mup12OprtMulCmplxC1Ev__ZN3mup12PackageCmplxC1Ev__ZN3mup12OprtAddCmplxC1Ev__ZN3mup12OprtSubCmplxC1Ev__ZN3mup11FunCmplxPowC1Ev__ZN3mup12FunCmplxSqrtC1Ev__ZN3mup11FunCmplxCosC1Ev__ZN3mup11FunCmplxAbsC1Ev__ZN3mup11FunCmplxExpC1Ev__ZN3mup11FunCmplxSinC1Ev__ZN3mup11FunCmplxTanC1Ev__ZN3mup10FunCmplxLnC1Ev__ZN3mup12FunCmplxNormC1Ev__ZN3mup12FunCmplxRealC1Ev__ZN3mup12FunCmplxConjC1Ev__ZN3mup11FunCmplxArgC1Ev__ZN3mup11FunCmplxLogC1Ev__ZN3mup12FunCmplxImagC1Ev__ZN3mup12FunCmplxCosHC1Ev__ZN3mup12FunCmplxSinHC1Ev__ZN3mup12FunCmplxTanHC1Ev__ZN3mup12FunCmplxLog2C1Ev__ZN3mup13FunCmplxLog10C1Ev__ZN3mup12PackageCmplxD0Ev___cxa_atexit___cxx_global_var_init_memset__GLOBAL__sub_I_mpPackageCmplx.cpp_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm___cxa_begin_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt3__110unique_ptrIN3mup12PackageCmplxENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup12PackageCmplxEEclEPS2___ZN3mup8TokenPtrINS_10IOprtInfixEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZTVN3mup12PackageCmplxE__ZTSN3mup12PackageCmplxE__ZTIN3mup12PackageCmplxE__ZTVN10__cxxabiv120__si_class_type_infoE__ZN3mup11ParserXBase11DefineConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_5ValueE__ZN3mup12PackageCmplx11AddToParserEPNS_11ParserXBaseE__ZTIN3mup8IPackageE__ZN3mup12PackageCmplx11s_pInstanceE__ZN3mup5ValueC1ERKNSt3__17complexIdEE__ZN3mup11ParserXBase15DefineInfixOprtERKNS_8TokenPtrINS_10IOprtInfixEEE__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEEGCC_except_table38GCC_except_table6GCC_except_table43GCC_except_table2GCC_except_table41___gxx_personality_v0#1/28 1573634237 501 20 100644 22492 ` mpPackageCommon.cpp.o8 /X/ __text__TEXTX@4#__StaticInit__TEXTK"X=__gcc_except_tab__TEXTD#__literal8__TEXT!@&__common__DATA/__cstring__TEXT!P&__const__DATA"Xh&= __const__TEXTp"&__mod_init_func__DATA"&= __compact_unwind__LD"&=:__eh_frame__TEXTP(,? h2  ?pF P97UHHH}H}H]DUHH HHHVHHH}HHMHHHuHEMH}HHH ]H} fUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHHH}HuH}HHHHHHHHHH}HHHHHHHHHH}HHHHHHHHHH}HHHHHHHHHH}H52HEHHHXHuHXHHXH}H}H5H@HHHH@HHHH@H}PHHHHHxHHpHHHxHhHHhHH}PH`HHHHXHHPHHHXHHH`HHHH}PH@HHHH8HH0HHH8H(H@H(HH}PH HHHHHHHHHHH HHH}PHHHHHHHHHHHHHHH}`HHHHH5HHHHHHHHHHH}`HHHHH5VHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HHHHHxHHpHHHxHhHHhHH}`H`HHHHXHHPHHHXHHH`HHHH}`H@HHHH8HH0HxHH8H(H@H(HxH}`H HHHHHHHpHHHH HHpH}`HHHHHHHHhHHHHHHhH}`HHHHHHHH`HHHHHH`H}`HHHHHHHHXHHHHHHXH}`HHHHHHHHPHHHHHHPH}`HHHHHxHHpHHHHxHhHHhHHH}`H`HHHH5HXHHPH@HHXHHH`HHH@H}`H@HHHH5H8HH0H8HH8H(H@H(H8H}`H HHHHHHH0HHHH HH0H}`HHHHHHHH(HHHHHH(H}`HHHHHHHH HHHHHH H}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HHHHHxHHpHHHxHhHHhHH}`H`HHHHXHHPHHHXHHH`HHHH}PH@HHHH8HH0HHH8H(H@H(HH]ÉHEMH*HEMHHEMHHEMHHEMHEMHXH}HEMHEMHH@wHEMHp]HEMHCHEMHP)HEMHHEMH0HEMHHEMHHEMHHEMHHEMHsHEMHYHEMH?HEMH%HEMH HEMHHEMHHEMHpHEMHHEMHPHEMHoHEMH0UHEMHx;HEMH!HEMHpHEMHHEMHhHEMHHEMH`HEMHHEMHXkHEMHQHEMHP7HEMHpHEMHHHEMHPHEMH@HEMH0HEMH8HEMHHEMH0gHEMHMHEMH(3HEMHHEMH HEMHHEMHHEMHHEMHHEMHp}HEMHcHEMHPIHEMH/HEMH0HEMHH} @UHHH}HuH}HuH]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHHHuH5d HEHEH]UHHHHuH54 HEHEH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQ H ]f.UHH}HE]fUHH}H}H]f.DUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUPH$UHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHHHH HHHEH]f.DUH] 33`CT33I8886; = " 1 " 1!"!1!"!1!""1 " " " 1 " " " 1 # " # 1 # " # 1 # " $ 1$"$1$"%1%"%1%"%1&"&1&"&1&"'1'"'1'"'1("(1("(1(")1)")1)")1*"*1*"*1*"+ %/d %/d %/d %/d-DT! @iW @pie&&||andorN3mup13PackageCommonE1 AePpA #P### @#p))(@705pG01p$ ;pA!;pA!@;pA!;0pA! zRx $01AC $DhAC zPLRx ,$@AC $AC $eAC $ AC ,cAC $dh#AC $p#AC $xAC $p#AC $xAC $,p#AC $TxAC $|p#AC $xAC $p)AC $x)AC $AC $Dx(AC $l7AC $AC $AC $AC $ AC $4hAC $\`AC $X5AC $pAC $XAC $PGAC $$xAC $LpAC $th1AC $$AC $AC $ AC $h;AC ,pAC $l;AC ,,pAC $(;AC ,@psAC $;AC ,p+AC $t AC 8-Va-!b-8-a-qb-<8-a-b-e-k-|8-6a-b--n-W-K-!o--c-4--!-- --]-b7[\-.h-% -!- - -)-Y'-1%- #---+-1-i/-9 -9- (-h-$-h-$-h-q,-Wh-=,-#h- ,-h-,-h-,-h-m,-Sh-9,-h-,-h-,-h-,-h-i,-Oh-5,-h-,-h-,-h-,-h-e,-Kh-1,-h-,-h-,-h-0-{h-a0-Gh--0-h-0-h-0-h-d-M-]d-TM-,h-h-h-h-(-@-&-z^-^i-D$-3?- "-J-i-$-?-"-K-fi-L,-;<-(*-G-i-,-<-*-H-ni-T,-C<-0*-I- i- ,- <- *- F-v i-\ ,-K <-8 *- :- i- ,- <- *- X- w i-] ,-L <-9 *- _-  i- ,- <- *- Y-x i-^ ,-M <-: *- Q- i- ,- <- *- S- i-f ,-U <-B *- U- i- ,- <- *- R- i-n ,-] <-J *-( T- i-,-<-*-Z-i-v,-e<-R*-0[-i-,-<-*-V-i-~,-m<-Z*-8W-i-,-<-*-X-i-,-n<-[*-9_-#i-0-A-.-;-i-0-oA-\.-:P-i-0-A-.-O-i-0-wA-d.-BN-&i- 0-A-.-`-i-d-M-s=-TL-O@ -*d-M-=-L- ->-E-i-i>-QC-5i->-B-i->-D-i-a-; -/----9--h-w-k_-Ii-3-+-E-$j-l PfH6@g0(  325m`XPm@ mm`@ `@ `@ `@ m`XPm@ {mM   ?U 0  > Nps0pI-!!!!< pU/g nP@ e  @U =8 @ +p0  }e P  {P"`p"E"    {R?#( lD  X  t  ` Z    M3o @h    4 ` __ZSt9terminatev__ZdlPv__ZNK3mup13PackageCommon9GetPrefixEv__ZNSt3__117__compressed_pairIPN3mup13PackageCommonENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup13PackageCommonENS_14default_deleteIS2_EEE5firstEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup13PackageCommonEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup13PackageCommonELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup13PackageCommonELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup13PackageCommonENS_14default_deleteIS2_EEE3getEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup13PackageCommon8InstanceEv__ZNSt3__117__compressed_pairIPN3mup13PackageCommonENS_14default_deleteIS2_EEE6secondEv__ZNK3mup13PackageCommon7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup13PackageCommonD2Ev__ZN3mup8IPackageD2Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED2Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED2Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNSt3__110unique_ptrIN3mup13PackageCommonENS_14default_deleteIS2_EEED2Ev__ZN3mup13PackageCommonC2Ev__ZN3mup8IPackageC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup13PackageCommonD1Ev__ZN3mup5ValueD1Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED1Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__110unique_ptrIN3mup13PackageCommonENS_14default_deleteIS2_EEED1Ev__ZN3mup6FunMaxC1Ev__ZN3mup13OprtAssignDivC1Ev__ZN3mup13OprtCastToIntC1Ev__ZN3mup8OprtFactC1Ev__ZN3mup15OprtCastToFloatC1Ev__ZN3mup7OprtShrC1Ev__ZN3mup12HexValReaderC1Ev__ZN3mup12BinValReaderC1Ev__ZN3mup13BoolValReaderC1Ev__ZN3mup12DblValReaderC1Ev__ZN3mup6OprtOrC1Ev__ZN3mup13PackageCommonC1Ev__ZN3mup6FunMinC1Ev__ZN3mup10OprtAssignC1Ev__ZN3mup6FunSumC1Ev__ZN3mup13OprtAssignMulC1Ev__ZN3mup7OprtShlC1Ev__ZN3mup9FunSizeOfC1Ev__ZN3mup7OprtAndC1Ev__ZN3mup13OprtAssignAddC1Ev__ZN3mup13OprtAssignSubC1Ev__ZN3mup6OprtLTC1Ev__ZN3mup6OprtGTC1Ev__ZN3mup6OprtEQC1Ev__ZN3mup7OprtNEQC1Ev__ZN3mup6OprtLEC1Ev__ZN3mup6OprtGEC1Ev__ZN3mup11FunParserIDC1Ev__ZN3mup13PackageCommonD0Ev___cxa_atexit___cxx_global_var_init_memset__GLOBAL__sub_I_mpPackageCommon.cpp_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm___cxa_begin_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZN3mup5ValueC1Ed__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZN3mup7OprtLOrC1EPKc__ZN3mup8OprtLAndC1EPKc__ZNSt3__110unique_ptrIN3mup13PackageCommonENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup13PackageCommonEEclEPS2___ZN3mup8TokenPtrINS_12IOprtPostfixEEC2EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEEC1EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZN3mup11ParserXBase14AddValueReaderEPNS_12IValueReaderE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN3mup13PackageCommonE__ZTSN3mup13PackageCommonE__ZTIN3mup13PackageCommonE__ZN3mup11ParserXBase11DefineConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_5ValueE__ZN3mup13PackageCommon11AddToParserEPNS_11ParserXBaseE__ZTIN3mup8IPackageE__ZN3mup13PackageCommon11s_pInstanceE__ZN3mup11ParserXBase17DefinePostfixOprtERKNS_8TokenPtrINS_12IOprtPostfixEEE__ZN3mup11ParserXBase15DefineInfixOprtERKNS_8TokenPtrINS_10IOprtInfixEEE__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEEGCC_except_table38GCC_except_table6GCC_except_table45GCC_except_table43GCC_except_table2GCC_except_table41___gxx_personality_v0#1/28 1573634238 501 20 100644 12308 ` mpPackageMatrix.cpp.o h __text__TEXT* Y__StaticInit__TEXT0 K8__gcc_except_tab__TEXT| __common__DATA__cstring__TEXT /(__const__DATAP XX __const__TEXT __mod_init_func__DATA  __compact_unwind__LD  .__eh_frame__TEXTH h2  G$ P/UHHH}H}H]DUHH HHHVHHH}HHMHHHuHEMH}HHH ]H} fUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHHH}HuH}PH}HHHH}HHuHEHHuHEH}HuH}H}PH}HHHH}HHMHEHHuHxH}HxH}H}PHpHHHHhHH`HEHHhHXHpHXH}H}PHPHHHHHHH@HEHHHH8HPH8H}H}PH0HHHH(HH HEHH(HH0HH}H]ÉHEMH}HEMH}HEMH}HEMH}HEMH`tHEMH}]HEMH@CHEMH},HEMH HEMH}H} DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHHHuH5HEHEH]UHHH}HuH}HuH]f.UHHHHuH5HEHEH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQ H ]f.UHH}HE]fUHH}H}H]f.DUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUPH$UHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]UHHHH HHHEH]f.DUH] 33`CTo00@Y f+... %/d %/dOperators and functions for matrix operationsN3mup13PackageMatrixE0 1 A| ePp;A ##0P)#)(07p 5`p;pA P;pA GP p  1 $  p zRx $1AC $D(AC zPLRx ,$KAC $pAC $heAC $ AC ,;AC $d#AC $AC $#AC $AC $)AC $,#AC $T)AC $|AC $(AC $7AC $AC $AC $DAC $lAC $AC $AC $5AC $ AC $4AC $\;AC ,pAC $;AC ,t pAC $ `GAC $4AC $\AC $x1AC $$AC $AC $ AC $$ AC  - E- - - F-a -= ;-- *- -.-9-:-K<-BB-<.-9-:--- --8-R-K7-?--- - -k -bA#-!-'-%-/-"-?-k&-T?-:&-#?- &-?-&-?-"-0- -i5-M@-3&-%1-$-4-@-&-1-$-}2-a@-G&-91-)$- 6-@-&-1-$-3-@-a-; -/----/--?-w-k_-I@-3-+-E-$A-C P=H,@>0( )(+`@ DxpD`@ `@ `@ D`XPD@ {DM80 c | ?.    F N`p   sP  >   Wp p g fP0p h P0  =P p J  /   P @ O M3 e * O{__ZSt9terminatev__ZdlPv__ZNK3mup13PackageMatrix9GetPrefixEv__ZNSt3__117__compressed_pairIPN3mup13PackageMatrixENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup13PackageMatrixENS_14default_deleteIS2_EEE5firstEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup13PackageMatrixEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup13PackageMatrixELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup13PackageMatrixELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup13PackageMatrixENS_14default_deleteIS2_EEE3getEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup13PackageMatrix8InstanceEv__ZNSt3__117__compressed_pairIPN3mup13PackageMatrixENS_14default_deleteIS2_EEE6secondEv__ZNK3mup13PackageMatrix7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup13PackageMatrixD2Ev__ZN3mup8IPackageD2Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNSt3__110unique_ptrIN3mup13PackageMatrixENS_14default_deleteIS2_EEED2Ev__ZN3mup13PackageMatrixC2Ev__ZN3mup8IPackageC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup13PackageMatrixD1Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZNSt3__110unique_ptrIN3mup13PackageMatrixENS_14default_deleteIS2_EEED1Ev__ZN3mup13PackageMatrixC1Ev__ZN3mup14FunMatrixZerosC1Ev__ZN3mup13FunMatrixOnesC1Ev__ZN3mup13FunMatrixSizeC1Ev__ZN3mup12FunMatrixEyeC1Ev__ZN3mup13OprtTransposeC1Ev__ZN3mup13PackageMatrixD0Ev___cxa_atexit___cxx_global_var_init_memset__GLOBAL__sub_I_mpPackageMatrix.cpp_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm___cxa_begin_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt3__110unique_ptrIN3mup13PackageMatrixENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup13PackageMatrixEEclEPS2___ZN3mup8TokenPtrINS_12IOprtPostfixEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZTVN3mup13PackageMatrixE__ZTSN3mup13PackageMatrixE__ZTIN3mup13PackageMatrixE__ZTVN10__cxxabiv120__si_class_type_infoE__ZN3mup13PackageMatrix11AddToParserEPNS_11ParserXBaseE__ZTIN3mup8IPackageE__ZN3mup13PackageMatrix11s_pInstanceE__ZN3mup11ParserXBase17DefinePostfixOprtERKNS_8TokenPtrINS_12IOprtPostfixEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEEGCC_except_table27GCC_except_table6GCC_except_table2___gxx_personality_v0GCC_except_table30#1/28 1573634238 501 20 100644 21116 ` mpPackageNonCmplx.cpp.o h-- __text__TEXT1__StaticInit__TEXTK!:__gcc_except_tab__TEXT"__common__DATA-__cstring__TEXT! %__const__DATA!X%: __const__TEXTp!x%__mod_init_func__DATA!%; __compact_unwind__LD!@%;4__eh_frame__TEXT&*< h2  <h@C  P44UHHH}H}H]DUHH HHHVHHH}HHMHHHuHEMH}HHH ]H} fUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHH H}HuH}PHHHHHHHHEHHHHHH}H}PHHHHHHHHEHHHHHH}H}PHHHHHHHHEHHHHHH}H}PHxHHHHpHHhHEHHpH`HxH`H}H}PHXHHHHPHHHHEHHPH@HXH@H}H}PH8HHHH0HH(HEHH0H H8H H}H}PHHHHHHHHEHHHHHH}H}PHHHHHHHHEHHHHHH}H}PHHHHHHHHEHHHHHH}H}PHHHHHHHHEHHHHHH}H}PHHHHHHHHEHHHHHH}H}PHxHHHHpHHhHEHHpH`HxH`H}H}PHXHHHHPHHHHxHHPH@HXH@HxH}PH8HHHH0HH(HpHH0H H8H HpH}PHHHHHHHHhHHHHHHhH}PHHHHHHHH`HHHHHH`H}PHHHHHHHHXHHHHHHXH}PHHHHHHHHPHHHHHHPH}PHHHHHHHHHHHHHHHHH}PHxHHHHpHHhH@HHpH`HxH`H@H}PHXHHHHPHHHH8HHPH@HXH@H8H}PH8HHHH0HH(H0HH0H H8H H0H}PHHHHHHHH(HHHHHH(H}PHHHHHHHH HHHHHH H}PHHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH}`HxHHHHpHHhHHHpH`HxH`HH}`HXHHHHPHHHHHHPH@HXH@HH}`H8HHHH0HH(HHH0H H8H HH}`HHHHHHHHHHHHHHH}`HHHHHHHHHHHHHHH ]ÉHEMH=HEMH}&HEMH HEMH}HEMHHEMH}HEMHhHEMH}HEMHHyHEMH}bHEMH(HHEMH}1HEMHHEMH}HEMHHEMH}HEMHHEMH}HEMHHEMH}mHEMHSHEMH}<HEMHh"HEMH} HEMHHHEMHxHEMH(HEMHpHEMHHEMHhoHEMHUHEMH`;HEMH!HEMHXHEMHHEMHPHEMHHEMHHHEMHhHEMH@kHEMHHQHEMH87HEMH(HEMH0HEMHHEMH(HEMHHEMH HEMHHEMHgHEMHMHEMH3HEMHHEMHHEMHhHEMHHEMHHHEMHHEMH(}HEMHcHEMHIHEMH/HEMHHEMHH} f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHHHuH5HEHEH]UHHH}HuH}HuH]f.UHHHHuH5nHEHEH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQ H ]f.UHH}HE]fUHH}H}H]f.DUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUPH$UHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]UHHHH HHHEH]f.DUH] 33`CT33Ih{... .  .  . !.!!.!!." " . "  " . "  # . # " # 1 # " # 1 $ " $ 1$"$1$"%1%"%1%"%1&"&1&"&1&"'1'"'1'"'1("(1("(1(")1)")1)")1*"*1*"*1*"+ %/d %/d %/dN3mup15PackageNonCmplxE1 AePpA 0#`## )P#)(7@`50@`;pA ;`pA ;pA G1P$  zRx $1AC $DAC zPLRx ,$AC $0AC $(eAC $ pAC ,hAC $d#AC $AC $#AC $AC $#AC $,AC $T)AC $|#AC $)AC $AC $(AC $7AC $D(AC $l AC $AC $AC $AC $ AC $45AC $\AC $AC $;AC ,lpAC $H;AC ,`pAC $\;AC ,pAC $GAC $ AC $AC $,1AC $T($AC $|0AC $( AC $P AC -jf-7-+-g--\-/--|3-6Z-[-3-Z-Q[-]-c- 3-Z-[--- -u-QX-"2W-`-- - -i -; -2(-&-$-"-q,-I*- 4-'-`-'-`-'-`-{'-a`-G'--`-#-`-#-`-+-`-w+-]`-C+-)`-+-`-+-`-+-`-s+-Y`-?+-%`- +-`-+-`-+-`-o+-U`-;+-!`-+-`-+-`-+-`-t+-]`-C+-,`-+-`-+-`-+-`-+-h`-N+-7`-+-`-+-`-'-6-%-qO-Ua-;'-*6-%-M-a-'-6-%-yN-]a-C'-26-%-P-a-'-6-%-L-ea-K#-:7-'!-5- a- #- 7- !- Y-m a-S +-B 8-/ )- 9- a- +- 8- )- G-u a-[ +-J 8-7 )- T- a- +- 8- )- U-} a-c +-R 8-? )- ?- a- +- 8- )- ;- a-k +-Z 8-G )-% E- a- +- 8- )- J- a-s +-b 8-O )-- =- a-+-8-)-:-a-{+-j8-W)-5H-a-+-8-)-V-a-+-r8-_)-=>-!a-+-8-)-S-a-+-8-p)-QQ-5a-+- 8-)-R-a-+-8-)-eD-Ia-/+-!8-)-B-a-+-8-)-yC-]a-C+-58-")-K-a-+-8-)-F-qa-W+-I8-6)-I-a-+-8-)-A-a-k+-]8-J)-+<-a-+-8-)-@-a-a-; -/----4--`-w-k_-Ia-3-+-E-$b-d P^H1@_0( .-0 `@80e ee`@ `@ `@ e`XPe@ {eM }`c A   P V0@   {P9 l p -u P @o    )`  2Q 0F `W`v  % P! p! !q  f, mT|+?;f &% g : P P{ [A  B   ^     __ZSt9terminatev__ZdlPv__ZNK3mup15PackageNonCmplx9GetPrefixEv__ZNSt3__117__compressed_pairIPN3mup15PackageNonCmplxENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup15PackageNonCmplxENS_14default_deleteIS2_EEE5firstEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup15PackageNonCmplxEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup15PackageNonCmplxELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup15PackageNonCmplxELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup15PackageNonCmplxENS_14default_deleteIS2_EEE3getEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup15PackageNonCmplx8InstanceEv__ZNSt3__117__compressed_pairIPN3mup15PackageNonCmplxENS_14default_deleteIS2_EEE6secondEv__ZNK3mup15PackageNonCmplx7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup15PackageNonCmplxD2Ev__ZN3mup8IPackageD2Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED2Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNSt3__110unique_ptrIN3mup15PackageNonCmplxENS_14default_deleteIS2_EEED2Ev__ZN3mup15PackageNonCmplxC2Ev__ZN3mup8IPackageC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup15PackageNonCmplxD1Ev__ZN3mup8TokenPtrINS_10IOprtInfixEED1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZNSt3__110unique_ptrIN3mup15PackageNonCmplxENS_14default_deleteIS2_EEED1Ev__ZN3mup15PackageNonCmplxC1Ev__ZN3mup7OprtPowC1Ev__ZN3mup6FunPowC1Ev__ZN3mup7OprtDivC1Ev__ZN3mup7FunSqrtC1Ev__ZN3mup7FunCbrtC1Ev__ZN3mup8FunHypotC1Ev__ZN3mup11OprtSignPosC1Ev__ZN3mup6FunCosC1Ev__ZN3mup7FunACosC1Ev__ZN3mup6FunAbsC1Ev__ZN3mup12FunRemainderC1Ev__ZN3mup6FunExpC1Ev__ZN3mup6FunSinC1Ev__ZN3mup7FunASinC1Ev__ZN3mup8OprtSignC1Ev__ZN3mup6FunTanC1Ev__ZN3mup7FunATanC1Ev__ZN3mup5FunLnC1Ev__ZN3mup7OprtMulC1Ev__ZN3mup6FunLogC1Ev__ZN3mup7FunFmodC1Ev__ZN3mup7OprtAddC1Ev__ZN3mup7OprtSubC1Ev__ZN3mup7FunCosHC1Ev__ZN3mup8FunACosHC1Ev__ZN3mup7FunSinHC1Ev__ZN3mup8FunASinHC1Ev__ZN3mup7FunTanHC1Ev__ZN3mup8FunATanHC1Ev__ZN3mup8FunAtan2C1Ev__ZN3mup7FunLog2C1Ev__ZN3mup8FunLog10C1Ev__ZN3mup15PackageNonCmplxD0Ev___cxa_atexit___cxx_global_var_init_memset__GLOBAL__sub_I_mpPackageNonCmplx.cpp_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm___cxa_begin_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt3__110unique_ptrIN3mup15PackageNonCmplxENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup15PackageNonCmplxEEclEPS2___ZN3mup8TokenPtrINS_10IOprtInfixEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_10IOprtInfixEEC1EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZTVN3mup15PackageNonCmplxE__ZTSN3mup15PackageNonCmplxE__ZTIN3mup15PackageNonCmplxE__ZTVN10__cxxabiv120__si_class_type_infoE__ZN3mup15PackageNonCmplx11AddToParserEPNS_11ParserXBaseE__ZTIN3mup8IPackageE__ZN3mup15PackageNonCmplx11s_pInstanceE__ZN3mup11ParserXBase15DefineInfixOprtERKNS_8TokenPtrINS_10IOprtInfixEEE__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEEGCC_except_table29GCC_except_table6GCC_except_table34GCC_except_table2GCC_except_table32___gxx_personality_v0#1/28 1573634238 501 20 100644 12452 ` mpPackageStr.cpp.o hPH __text__TEXT P]__StaticInit__TEXT K8__gcc_except_tab__TEXT __common__DATAH__cstring__TEXT "__const__DATA X` __const__TEXT (__mod_init_func__DATA8 @ __compact_unwind__LD@ H.__eh_frame__TEXTH  h2  ( I$ P/UHHH}H}H]DUHH HHHVHHH}HHMHHHuHEMH}HHH ]H} fUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHHH}HuH}H}HHHH}HHuH}HuH}PH}HHHH}HHuHEHHuHEH}HuH}H}PHxHHHHpHHhHEHHpH`HxH`H}H}PHXHHHHPHHHHEHHPH@HXH@H}H}PH8HHHH0HH(HEHH0H H8H H}H}`HHHHHHHHEHHHHHH}H]ÉHEMH}HEMH}HEMH}HEMHhHEMH}HEMHHtHEMH}]HEMH(CHEMH},HEMHHEMH}H} f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHHHuH5HEHEH]UHHH}HuH}HuH]f.UHHHHuH5HEHEH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQ H ]f.UHH}HE]fUHH}H}H]f.DUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUPH$UHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]UHHHH HHHEH]f.DUH] 33`CTz00@/o .... %/d %/dA package for string operations.N3mup10PackageStrE 1 A ePpA #Pp#)# )Pp(7 @Pp5;@pA| ; pA p G   1@ $p   zRx $1AC $DAC zPLRx ,$KAC $AC $eAC $ @AC ,8AC $d#AC $AC $#AC $AC $)AC $,#AC $T)AC $|AC $(AC $7AC $AC $AC $DAC $lAC $AC $AC $5AC $ AC $4AC $\;AC ,pAC $;AC ,t pAC $ `GAC $4AC $\AC $x1AC $$AC $AC $ AC $$ AC  -Z G-' - - H- - =- *- -l .-& ;-<->-D-.-f;-1<--a-1 --9--8-A--a-; -2  - -#-!-a'-9%- /-"-A-&-A-&-A-q&-ZA-@&-)A-A-"-2- -0-B-&-s4-`$-A6-%B- &-4-$-7-B-&-4-t$-U1-9B-&-4-$-:-B-3-5-B-a-; -/----/--A-w-k_-IB-3-+-E-$C-E P?H,@@0( )(+`@ FxpF`@ `@ `@ F`XPF@ {FM  =   <Prp  bp @Bo |  U  @ p  + p HR /PpP p3   [ P@        / Hd8[ W T #L__ZSt9terminatev__ZdlPv__ZNK3mup10PackageStr9GetPrefixEv__ZNSt3__117__compressed_pairIPN3mup10PackageStrENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup10PackageStrENS_14default_deleteIS2_EEE5firstEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup10PackageStrEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup10PackageStrELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup10PackageStrELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup10PackageStrENS_14default_deleteIS2_EEE3getEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup10PackageStr8InstanceEv__ZNSt3__117__compressed_pairIPN3mup10PackageStrENS_14default_deleteIS2_EEE6secondEv__ZNK3mup10PackageStr7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup10PackageStrD2Ev__ZN3mup8IPackageD2Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNSt3__110unique_ptrIN3mup10PackageStrENS_14default_deleteIS2_EEED2Ev__ZN3mup10PackageStrC2Ev__ZN3mup8IPackageC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup10PackageStrD1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZNSt3__110unique_ptrIN3mup10PackageStrENS_14default_deleteIS2_EEED1Ev__ZN3mup10PackageStrC1Ev__ZN3mup13FunStrToLowerC1Ev__ZN3mup13FunStrToUpperC1Ev__ZN3mup12StrValReaderC1Ev__ZN3mup9FunStrLenC1Ev__ZN3mup11FunStrToDblC1Ev__ZN3mup10OprtStrAddC1Ev__ZN3mup10PackageStrD0Ev___cxa_atexit___cxx_global_var_init_memset__GLOBAL__sub_I_mpPackageStr.cpp_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm___cxa_begin_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt3__110unique_ptrIN3mup10PackageStrENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup10PackageStrEEclEPS2___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZTVN3mup10PackageStrE__ZTSN3mup10PackageStrE__ZTIN3mup10PackageStrE__ZN3mup11ParserXBase14AddValueReaderEPNS_12IValueReaderE__ZTVN10__cxxabiv120__si_class_type_infoE__ZN3mup10PackageStr11AddToParserEPNS_11ParserXBaseE__ZTIN3mup8IPackageE__ZN3mup10PackageStr11s_pInstanceE__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEEGCC_except_table27GCC_except_table6GCC_except_table2___gxx_personality_v0GCC_except_table30#1/28 1573634239 501 20 100644 34484 ` mpPackageUnit.cpp.o8 pLXhL __text__TEXT &XPC__literal8__TEXT&0h*__gcc_except_tab__TEXT@&*__StaticInit__TEXT@(K,Z__cstring__TEXT(,__const__DATA).[k__const__TEXTp-1__common__DATAhL__mod_init_func__DATA(.2X^ __compact_unwind__LD0. 2`^__eh_frame__TEXTP;?b h2  b0nh P%%l(UHH H}HuHuHHm(HuHHHHuHH ]f.@UHHH}HuH}HuH]f.UHHH}HuHUMH}HUH@HH]H@H}艅<H8HHpH0HHH0H}H(H(HHHш'H'DH}HpAc<HpxHHuHHH5HHHhdHpHhdHHhdH}H}H8HHH#HHHHPXH}H0HHPHHHPxHH]Hh  fDUHH}H}H?H]f.fUHHH}H}HEMfEEiM EcME$H]DUHHH}H}H]DUHHH}H}H]DUHH0H}HuHuH>HvHuH}HuH}EMHEH0]UHHH}H}H?4H}H=j%H5m%H %HEHHH]fUHH}HN$]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHH#HuHHHHuHH ]f.@UHHH}HuH}HuH]f.UHHH}HuHUMH}HUH@HH]H@H}艅<H8HHpH0HHH0H}H(H(HHHш'H'DH}HpAc<HpxHHuHHH5HHHhdHpHhdHHhdH}H}H8HHHHHHHPXH}H0HHPHHHPxHH]Hh  fDUHH}H ]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHH9 HuHHHHuHH ]f.@UHHH}HuH}HuH]f.UHHH}HuHUMH}HUH@HH]H@H}艅<H8HHpH0HHH0H}H(H(HHHш'H'DH}HpAc<HpxHHuHHH5HHHhdHpHhdHHhdH}H}H8HHHgHHHHPXH}H0HHPHHHPxHH]Hh  fDUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHHHuHHHHuHH ]f.@UHHH}HuH}HuH]f.UHHH}HuHUMH}HUH@HH]H@H}艅<H8HHpH0HHH0H}H(H(HHHш'H'DH}HpAc<HpxHHuHHH5HHHhdHpHhdHHhdH}H}H8HHHHHHHPXH}H0HHPHHHPxHH]Hh  fDUHH}H(]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHHtHuHHHHuHH ]f.@UHHH}HuH}HuH]f.UHHH}HuHUMH}HUH@HH]H@H}艅<H8HHpH0HHH0H}H(H(HHHш'H'DH}HpAc<HpxHHuHHH5HHHhdHpHhdHHhdH}H}H8HHHwHHHHPXH}H0HHPHHHPxHH]Hh  fDUHH}H]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH H}HuHuHHHuHHHHuHH ]f.@UHHH}HuH}HuH]f.UHHH}HuHUMH}HUH@HH]H@H}艅<H8HHpH0HHH0H}H(H(HHHш'H'DH}HpAc<HpxHHuHHH5HHHhdHpHhdHHhdH}H}H8HHHHHHHPXH}H0HHPHHHPxHH]Hh  fDUHH}Hb]f.DUHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHHH}H}H]DUHH HHHVHHH}HHMHHHuHEMH}HHH ]H} fUHHH}H}HH]fUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHH H}HuHuH}PH}HHuHHHHEHuHHMHEHHuHEH}HuH}H}PH}HHHHxHHuHpHEHHxHhH}HhH}H}PH`HHHHXHHuHPHEHHXHHH`HHH}H}PH@HHHH8HHuH0HEHH8H(H@H(H}H}PH HHHHHHuHHEHHHH HH}H}PHHHHHHHuHHEHHHHHH}H ]ÉHEMH}HEMH}HEMHpHEMH}HEMHPHEMH}HEMH0tHEMH}]HEMHCHEMH},HEMHHEMH}H} f.DUHHH}HuH}HuH]f.UHHH}H}H]DUHHHHuH5 HEHEH]UHHH}HuH}HuH]f.UHHHHuH5 HEHEH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}EH}EYEYGGH]f.@UHH1H}H}H]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQ H ]f.UHH}HE]fUHH}H}H]f.DUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUPH$UHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]& .>ư>MbP?@@.AeA"f  &&L=,"f  &&L=,"f  &&L=,"f  &&L=,"f  &&L=,"f  &&L=, 33`CT88Oh u+.... %/dUHHHH HHHEH]f.DUH]nn - unit multiplicator 1e-9uu - unit multiplicator 1e-6mm - unit multiplicator 1e-3kk - unit multiplicator 1e3MM - unit multiplicator 1e6GG - unit multiplicator 1e9Postfix operators for basic unit conversions.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTokN3mup11ParserErrorEN3mup8OprtNanoEN3mup9OprtMicroEN3mup9OprtMilliEN3mup8OprtKiloEN3mup8OprtMegaEN3mup8OprtGigaEN3mup11PackageUnitEBP#:A@&[@`H^0PiAh&#B@#p:Ax&iA&@#pB#:A&0 P iA& # B@ #p :A&iA'@#pB#:A '0PiAH'#B@#p:AX'iA'@#@(1pA'0PeA'#0P)#)(0P((( @(p((2PB?? S ? ?!?@!?!?!7" "@"`"""""2 #@#`#p###5#$ $;`$pA,($G0%P%p%1%$%& ( zRx $BAC $D#AC zPLRx ,$:OAC $AC $[AC $ AC $4AC $\HAC $^AC $0AC ,l(i/AC $h#AC $,pBAC $T#AC ,:AC $AC ,ligAC $#AC $,BAC $T#AC , :AC $0AC ,l(iAC $h#AC $,pBAC $T#AC ,:AC $AC ,liAC $#AC $,BAC $T#AC , :?AC $0AC ,l(iAC $h#AC $,pBAC $T#AC ,:wAC $AC ,liGAC $#AC $,1AC $TAC ,AC $0AC $(eAC $pAC ,hAC $TX#AC $|`AC $X)AC $`#AC $h)AC $ pAC $D h(AC $l pAC $ h(AC $ pAC $ h(AC $ pAC $4 h(AC $\ pAC $ h(AC $ pAC $ h(AC $ pAC $$ h(AC $L p2AC $t BAC $ ?AC $ ?AC $ SAC $ ?AC $< 0?AC $d H?AC $ `?AC $ x?AC $ 7AC $ AC $, AC $T AC $| AC $ AC $ AC $ xAC $p2AC $DAC $lAC $xAC $`AC $XAC $ P5AC $4hAC $\PAC $H;AC ,D`pAC $GAC $AC $,AC $T1AC $|$AC $AC $ AC $8 AC %#-%-%"-%!-a%-A% -%- %x-$-$-$-$-$-Q$-#-#-Q#-5#-"-"-"-q"-Q"-1"-"-!!-!!1-j!c!1-*!#!1-  1-  1-J =C - = V-1---o-8/-/--+-,--8-9-^-UH-1I--@-A--e-f-n-e]-A^--P-Q---k-bAU-S--T--T--T-i-OT-8-T--T--T--R-{3-[-AT-3- R-C--T--R-;-g-MT-?-,R- `--T--R-X-v-_T-Q-DR-+K--)----l-A-!-- &--&(---&-Y6-3-*- 4---er-L-5s-/-----=z=-s-g-V-s-s--i-s-Y5-- F---D-l-;"-r--s-/-h-H-(--=z= ----us-Hs-9-%i-s-E--Y>-3-*- <---er-L-5s-/- - - - -= z= -s -g -V - s- s- - i- s-Y =-  -  c- - - a-l -; " - r- -  s- /-h -H -( - -= z= - - - -u s-H s-9 -% i- s-b--Y[-3-*- Y---er-L-5s-/-----=z=-s-g-V-s-s--i-s-YZ-- N---L-l-;- -q0-Q.--ur-\-E#s-/-----=z=--w-f-s-s--i-s-iM--&-E-$-& *+hgx%py`XP@80 k278xph`XPjH{8o0B( GHn}m:?@xplh|XwP_H@d8e0( vuW\]txphq`JXPOHP@80( p~$     ` @         ` @       ` @       ` @   `@ `@ `@ `@ `XP@ `XP@ `@ `XP@ `XP@ {M@&$"Uh&x&&B&&&\' 'H'IX'/'9 @(( p # 0P'@#Jp#i#g#6'd$`#w#$o,(0%p%s%1%&X (hLHq ! " @`P$i p@~@!  pF" p _@ I@ x! ` `" p@! @  \" <P/h^ J " $ 0r`$ p@@DC P3 0 "/ c p v @"P'uVPs0{P0_P 80 >P%EP-w *:-;,y,`,,,,.^p-%-&-d-----++O+)0** $ l'E0'V   /zP z  +   P  ___cxa_throw__ZSt9terminatev__ZdlPv__ZNK3mup11PackageUnit9GetPrefixEv__ZNSt3__117__compressed_pairIPN3mup11PackageUnitENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup11PackageUnitENS_14default_deleteIS2_EEE5firstEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup11PackageUnitEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup11PackageUnitELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup11PackageUnitELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrIN3mup11PackageUnitENS_14default_deleteIS2_EEE3getEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup6IValue8IsScalarEv__ZNK3mup12IOprtPostfix9AsciiDumpEv__ZN3mup9ICallback11AsICallbackEv__ZNK3mup6IToken8ToStringEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZN3mup9ICallback8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNK3mup9OprtMicro5CloneEv__ZNK3mup8OprtNano5CloneEv__ZNK3mup8OprtKilo5CloneEv__ZNK3mup9OprtMilli5CloneEv__ZNK3mup8OprtGiga5CloneEv__ZNK3mup8OprtMega5CloneEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZN3mup6IToken13AsIPrecedenceEv__ZN3mup11PackageUnit8InstanceEv__ZNSt3__117__compressed_pairIPN3mup11PackageUnitENS_14default_deleteIS2_EEE6secondEv__ZNK3mup11PackageUnit7GetDescEv__ZNK3mup9OprtMicro7GetDescEv__ZNK3mup8OprtNano7GetDescEv__ZNK3mup8OprtKilo7GetDescEv__ZNK3mup9OprtMilli7GetDescEv__ZNK3mup8OprtGiga7GetDescEv__ZNK3mup8OprtMega7GetDescEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12IOprtPostfixD2Ev__ZN3mup12ErrorContextD2Ev__ZN3mup11PackageUnitD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup9OprtMicroD2Ev__ZN3mup8OprtNanoD2Ev__ZN3mup8OprtKiloD2Ev__ZN3mup9OprtMilliD2Ev__ZN3mup8IPackageD2Ev__ZN3mup8OprtGigaD2Ev__ZN3mup8OprtMegaD2Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED2Ev__ZNSt3__110unique_ptrIN3mup11PackageUnitENS_14default_deleteIS2_EEED2Ev__ZN3mup11PackageUnitC2Ev__ZN3mup8IPackageC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup11PackageUnitD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup9OprtMicroD1Ev__ZN3mup8OprtNanoD1Ev__ZN3mup8OprtKiloD1Ev__ZN3mup9OprtMilliD1Ev__ZN3mup8OprtGigaD1Ev__ZN3mup8OprtMegaD1Ev__ZN3mup8TokenPtrINS_12IOprtPostfixEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__110unique_ptrIN3mup11PackageUnitENS_14default_deleteIS2_EEED1Ev__ZN3mup11PackageUnitC1Ev__ZN3mup11PackageUnitD0Ev__ZN3mup9OprtMicroD0Ev__ZN3mup8OprtNanoD0Ev__ZN3mup8OprtKiloD0Ev__ZN3mup9OprtMilliD0Ev__ZN3mup8OprtGigaD0Ev__ZN3mup8OprtMegaD0Ev___cxa_atexit___cxx_global_var_init_memset__GLOBAL__sub_I_mpPackageUnit.cpp___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZN3mup9OprtMicro4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtNano4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtKilo4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup9OprtMilli4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtGiga4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8OprtMega4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i___cxa_begin_catch___clang_call_terminate__Unwind_Resume___dso_handle__ZNSt3__17complexIdEmLEd__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZN3mup12IOprtPostfixC2EPKc__ZNSt3__110unique_ptrIN3mup11PackageUnitENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup11PackageUnitEEclEPS2___ZNSt3__1mlIdEENS_7complexIT_EERKS3_RKS2___ZN3mup8TokenPtrINS_12IOprtPostfixEEC2EPS1___ZN3mup8TokenPtrINS_12IOprtPostfixEEC1EPS1___ZN3mup12IOprtPostfixC2ERKS0___ZN3mup9OprtMicroC2ERKS0___ZN3mup8OprtNanoC2ERKS0___ZN3mup8OprtKiloC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup9OprtMilliC2ERKS0___ZN3mup8OprtGigaC2ERKS0___ZN3mup8OprtMegaC2ERKS0___ZN3mup9OprtMicroC1ERKS0___ZN3mup8OprtNanoC1ERKS0___ZN3mup8OprtKiloC1ERKS0___ZN3mup9OprtMilliC1ERKS0___ZN3mup8OprtGigaC1ERKS0___ZN3mup8OprtMegaC1ERKS0___ZTVN3mup12IOprtPostfixE__ZTIN3mup12IOprtPostfixE__ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTVN3mup11PackageUnitE__ZTSN3mup11PackageUnitE__ZTIN3mup11PackageUnitE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN3mup9OprtMicroE__ZTSN3mup9OprtMicroE__ZTIN3mup9OprtMicroE__ZTVN3mup8OprtNanoE__ZTSN3mup8OprtNanoE__ZTIN3mup8OprtNanoE__ZTVN3mup8OprtKiloE__ZTSN3mup8OprtKiloE__ZTIN3mup8OprtKiloE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup9ICallbackE__ZTVN3mup9OprtMilliE__ZTSN3mup9OprtMilliE__ZTIN3mup9OprtMilliE__ZN3mup11PackageUnit11AddToParserEPNS_11ParserXBaseE__ZTIN3mup8IPackageE__ZN3mup9OprtMicroC2EPNS_8IPackageE__ZN3mup8OprtNanoC2EPNS_8IPackageE__ZN3mup8OprtKiloC2EPNS_8IPackageE__ZN3mup9OprtMilliC2EPNS_8IPackageE__ZN3mup8OprtGigaC2EPNS_8IPackageE__ZN3mup8OprtMegaC2EPNS_8IPackageE__ZN3mup9OprtMicroC1EPNS_8IPackageE__ZN3mup8OprtNanoC1EPNS_8IPackageE__ZN3mup8OprtKiloC1EPNS_8IPackageE__ZN3mup9OprtMilliC1EPNS_8IPackageE__ZN3mup8OprtGigaC1EPNS_8IPackageE__ZN3mup8OprtMegaC1EPNS_8IPackageE__ZN3mup11PackageUnit11s_pInstanceE__ZTVN3mup8OprtGigaE__ZTSN3mup8OprtGigaE__ZTIN3mup8OprtGigaE__ZTVN3mup8OprtMegaE__ZTSN3mup8OprtMegaE__ZTIN3mup8OprtMegaE__ZN3mup11ParserXBase17DefinePostfixOprtERKNS_8TokenPtrINS_12IOprtPostfixEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table48GCC_except_table38GCC_except_table28GCC_except_table96GCC_except_table26GCC_except_table16GCC_except_table44GCC_except_table34GCC_except_table14GCC_except_table2GCC_except_table32GCC_except_table22___gxx_personality_v0GCC_except_table40GCC_except_table20GCC_except_table10#1/20 1573634239 501 20 100644 4004 ` mpParser.cpp.o x__text__TEXT __gcc_except_tab__TEXT__const__DATA8 __cstring__TEXT0__const__TEXT__compact_unwind__LD __eh_frame__TEXT0X  h2  `  p P UHHH}uH}H}H=HHEH8H5HH5 H}H5BH}EGHEHEHEH}HuHEMHEH;E-HEHEHEH}HuE-HEHEHEH}HuE-HEHEHEH}HuE-HEHEHEH}HuE 3HEHEHxH}HxHĐ]H} DUHHH}uH}uH]f.DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]110123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+-*^/?<>=#!$%&|~'_µ{}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ()/+-*^?<>=#!$%&|~'_N3mup7ParserXE A!@`(zPLRx ,$ AC zRx $!AC $DAC $lAC $(AC $AC ---q-Q-'- - -- --k -U-/ -- - -- - -f-]Q-H<-4" =-0( `@ M]t@_J5 `3 ts.P4  G__ZdlPv__ZN3mup15PackageNonCmplx8InstanceEv__ZN3mup12PackageCmplx8InstanceEv__ZN3mup13PackageMatrix8InstanceEv__ZN3mup11PackageUnit8InstanceEv__ZN3mup10PackageStr8InstanceEv__ZN3mup13PackageCommon8InstanceEv__ZN3mup11ParserXBaseD2Ev__ZN3mup7ParserXD2Ev__ZN3mup11ParserXBaseC2Ev__ZN3mup7ParserXD1Ev__ZN3mup7ParserXD0Ev__ZN3mup7ParserXC2Ej__ZN3mup7ParserXC1Ej__Unwind_Resume__ZN3mup11ParserXBase20DefineInfixOprtCharsEPKc__ZN3mup11ParserXBase15DefineOprtCharsEPKc__ZN3mup11ParserXBase15DefineNameCharsEPKc__ZTVN10__cxxabiv120__si_class_type_infoE__ZN3mup14ParserErrorMsg5ResetEPNS_25ParserMessageProviderBaseE__ZN3mup7ParserX25ResetErrorMessageProviderEPNS_25ParserMessageProviderBaseE__ZTIN3mup11ParserXBaseE__ZN3mup11ParserXBase10AddPackageEPNS_8IPackageE__ZTVN3mup7ParserXE__ZTSN3mup7ParserXE__ZTIN3mup7ParserXE___gxx_personality_v0GCC_except_table0#1/28 1573634240 501 20 100644 306644 ` mpParserBase.cpp.o \\ __text__TEXTR` __gcc_except_tab__TEXTRD `Vж__cstring__TEXT]_a__data__DATA@d@h&__common__DATA\__const__DATAeXHiQ__const__TEXThl__compact_unwind__LDxj`j@n __eh_frame__TEXT h2  )I P}UHHH}H}HHHHH}HHEHEH HHEHEH8HHEHEHPHHEHEHhHHEHEHHHEHH}HHLJHǨH}HEHHHEHEHHHEHEHHHEHEHHHEHEƀƀH HHEHEHHHHxHEH` HHpH}HĐ]ÉHEM8HEMHEMHpHxH}H}H}H}H}H}H}H}H}H}H}H}H} UHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}HHHEH H}HHc1HMH}HHUHuHHMH}HuHUH}HEHEHMHHHHEHMH9pHHvH}HHMHEHEH}HMH`HHEHHHuHHMHHHEHHEWHEMH}HEMH}HHMHHǁHHHHHHHEHMHEHHUHH Hx HEHxHxH}HĐ]H} f.UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH@H}H}HHH}HHEHHH}HHuHUH}HuH@]ÉHEMH}H} UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}HuHuH=H>HHH}HuHuH HHuHuH8HHuHuHPHHuHuHhHHuHuHHHuH5H}HHLJHǨH}HuHưHHuHuHHHuHuHHHuHuHHHuHuƆH HHxHEHHHHpHEH` HHhHEHH`HXHXHXHuHPH`HPHuH}Hİ]ÉHEMUHEM/HEMHEMHXHhHpHxH}H}H}H}H}H}H}H}H}H}H}H} UHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHpH}HuHuH9uHuwH}H}HǨHEHH}HHHuH}HHEHPHuHPHHHuHH}HHEHuH H}H HEHuH8H}H8HEHuHhH}HhHEHuHưH}HǰHEHuHƀH}HǀHEHuHH}HHEHuHH}HHEHuHH}HHEHuHu舎HEHp]f.fUHHH}HuH}HuH]f.UHH H}H}HHHHHH}HHEH`HHEH`HHEHHHHEH HHEHHHEHHHEHHHEHHHEHHHEHHHEHhHHEHPHHEH8HHEH HHEHHH ]ÉHEMHEH`HHEHHHHEH HHEHHHEHHHEHHHEHHHEHHHEHHHEHhHHEHPHHEH8HHEH HHEHHH}f.@UHH H}H}H}HEH}HuH}H}H ]HHUPH$UHHH}H}H]DUHHH}H}H}H}H]UHH H}HuHuH}H}HHEHuHHEH ]UHHH}H}HHHLJHHH}HHHEH HHEHHHHEǀH]fUHHH}H}HH]fUHH0H}HuHuH}H}HHEHuHHuHEHH0]UHH0H}HuHuH}H}HHEHuHHuHEHH0]UHH H}HuHuH;uHu+HEHMHHHEH0HEHPH}HEH ]fUHH H}H}HHHHHHHEH}HEHHUHH HMHEHEHEH}H ]fUHH}H]f.DUHH H}HuHuH}HH}HHuHEH ]UHHH}HuH}HuH]f.UHH H}HuHuH}HH}HHuHEH ]UHH H}HuHuH}HH}HHuHEH ]UHHH}H}HHHHHHHH5$NHH55NHHH5FNHH#HHH5NHHxHƅHHHxHHpHHpƅH5HHxHRHHH HxHHHHHĐ]H  f.DUHH H}H}H}H}HE H}HEHEH ]ÐUHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHHHHuHuHHEHEH]fDUHHH}H}H]DUHHH5H}H}H}HuHƀHH]UHHH}H}H]DUHHH}H}HHHHHHHH5JHH5IHHH5IHH-HHH5IHHxHƅHHHxHHpHHpƅH5HHxHRHHH HxHHHHHĐ]H  f.DUHHH}H}HHHHHHHH5/HHH5GHHH5GHH7HHH5GHHxHƅHHHxHHpHHpƅH5HHxHRHHH HxHHHHHĐ]H  f.DUHHH}HuHuH}HH]f.UHHH}HuHuHƨHHuHH]f.UHH H}HuHUH}HUH}HHM1H}HuH21H}001H}91H}H ]@UHHH}H}H]DUHH@H}HuHUHUHHUH}HEH}HEHMH}HEHMH}HuHUHMIH@]f.DUHHH}HuH}HEH]f.UHHH}uUHMHMHxHHH@H}HHHxEE؋EEH@HǨHH8H}H8H0H}2H}H(HPH(H5FHPH}HPH HPxHHuHHH5HHHplHxXHpl;HplHPHplHH}Hp  fUHH H}HuHuHHǨHuHuHH}H ]f.@UHHH}HuHUHUHuHHUHuHUHHHUH}HuHUH}Hu0H}HuH>H?H}HHuH}HHEHHuHHEHuH}HEH}HĀ]ÉHEȉMH}HEȉMH}H} UHHH}HuH}HuH]f.UHHH}HuUHuH}H`HH`HXH}HuHXeHuHXMHuHX5HuHXHuHXxHƅkuHMHxHPH׉LHH@H}1HxLHuH@ƅkH5HHPHpl8HplHplH}Hxk HP H]Hp  DUHHH}HuH}HuH]f.UHHPH}HuH}HuHEH}HHuHEH}HuHHMLEH}HEUHHHP]f.UHH H}HuHuH}H?Hu HEH8HEH8&HEH8HHEHHHRHHEHHMHHH ]UHHH}H}H]DUHH0H}HuHuHHǀHEHuHHEHEHHHEH}Hu$H0]UHH0H}HuHuHHhHEHuHHEHEHhHHEH}Hu$H0]DUHH0H}HuHuHHHEHuHHEHEHHHEH}Hu$H0]DUHH0H}HuHuHHPHEHuHHEHEHPHHEH}Hu$H0]DUHH0H}HuHuHH HEHuHHEHEH HHEH}Hu$H0]DUHH0H}HuHuHH8HEHuHHEHEH8HHEH}Hu$H0]DUHHH}H}H]DUHHH}HuHUHUHuHHUHuHUHHHUH}HuHUH}Hu1H}HuH>H?H}HHuH}HHEHhHuHHEHuH}HEH}HĀ]ÉHEȉMH}HEȉMH}H} UHHH}HuHuH}H`HH`H)xHƅsHMHXHHPHHHHH@H}H@H}21HMHuHPƅsH5HHXbHxt5HxtHxtH}H}s HXH}HH`H}H0H6HHhHH`HH}H8H0H0H(H8H(H HhH HHhH]ÉHxtHhHx  @UHH}H}H?H]f.fUHHH}HuHuH}H`HH`H)xHƅsHMHXHHPHHHHH@H}H@H}21HMHuHPƅsH5HHXbHxt5HxtHxtH}H}s HXH}HH`H}H0H6HHhHH`HPH}H8H0H0H(H8H(H HhH HHhH]ÉHxtHhHx  @UHH}H}H?H]f.fUHHPH}HuH}HuHEH}HHuHEH}HuHHMLEH}HEUHHHP]f.UHHH}HuHuH}H`HH`H)xHƅsHMHXHHPHHHHH@H}H@H}21HMHuHPƅsH5HHXbHxt5HxtHxtH}H}s HXH}HH`H}H0H6HHhHH`H H}H8H0H0H(H8H(H HhH HHhH]ÉHxtHhHx  @UHH}H}H?H]f.fUHHH}HuHuH}H`HH`H)xHƅsHMHXHHPHHHHH@H}H@H}21HMHuHPƅsH5HHXbHxt5HxtHxtH}H}s HXH}HH`H}H0H6HHhHH`H8H}H8H0H0H(H8H(H HhH HHhH]ÉHxtHhHx  @UHH}H}H?H]f.fUHH H}HuHuHHǀHEHuHH}HEH ]f.DUHHH}HuH}HuH]f.UHH H}HuHuHHhHEHuHH}HEH ]fUHH H}HuHuHHHEHuHH}HEH ]fUHH H}HuHuHHPHEHuHH}HEH ]fUHHH}HuH}HuH]f.UHH H}HuHuHH HEHuHH}HEH ]fUHH H}HuHuHH8HEHuHH}HEH ]fUHHH}HuH}Hu$H]UHH H}HuH}HuHEHuH}HEH ]UHH H}H}HEHuH}HEH ]UHH H}HuH}HuHEHuH}HEH ]UHH H}H}HEHuH}HEH ]UHH@H}H}HHHMH}HHH}HEHHHHEH}HEH@]ÉHEMH}H} f.@UHH H}Hu$EH}HuE$H ]f.@UHHpH}H}HHHHHHH11HH}H}H}1H}1HxHvHHxHuHHHHHHH}HHHH}HHHHHHH}HHcHHEMFHEM/HEMHEMHEMHEMHEMHHH HHuHHHH>HEMH9HHH5)HH5Q(HHH5b(HHHHH5-(HHxHƅHHHHHxHHxƅH5HH+HEMFHEMHEMH HHHxHpHpHdHxHhHhdd;#H}HXHXHuHH}TTH}HHHHH@H@<<;H}88HHuHH}H0H0HHIHH(H(HHHHH5&H H5%H HH5%%HHHHH5$HHxHƅoHpHHHHHpHƅoH5HHHEMFHEMHEMHpo HHBHHH HH`HH`HH`H9HHHXH5$HH5"HHH5#HHHHH5"HHxHƅ/H0HHHHHH0Hƅ/H5HHHEMH`jHEMFHEMHEMH0/ HHHH)‰HHxHHHaHxHH#H}HHHuHH}H}HHHxHxttH}pp(H HuH H}oo&H}H`H`HXHXTT XH}HHHHH@H@<<{H}H0H0H(H(HHIHH H HH(H9TH}HHHH(H9TH}HHHHH}H}HHHHsH}HHHH  (HuHHuHHH HHuHHHHH}HuyHEMHtHuHHH HHuHHHHHH}Hǀ HEMHH}OHHHH1ɾHH}HHHuH HuHHH H H}1H}HHHH|1|mH}HpHpHhHhd1dH}HXHXHPHPL1LH}H@H@H8H8414VH}H(H(H H H}HHHHHH}HHHHHHHH5HH5HHH5HHgHHH5uHHxHƅHHHHHHHƅH5HHs HEMFHEMHEMH HH HHHI(HHHH0HHHI(HHHHHHH5'HH5HHH5HHhHHH5HHxHƅHHHHHHHƅH5HHHEMFHEMHEMH HHHHHI(HHxHxHHIHщttHHHR(HHhHhHHIHщddH`H\`\9HHHI(HHPHPHHIHщLL;;@;$HuغHZH}H@H@<<lHH HxHuH0HxH0HxHEMHxH}HucHH`HpH5lH(H5H(H H5H HHHH5HHxHƅGHHH`HHHHHHƅGH5HHHEMFHEMHEMHHG HH`HH H8HuHH8HH8lHEMH8gH}HuDž4H}H4H}HHHHIHHHH(H(HH H5HH5"HHH53HHHHH5HHxHƅHHHHHHHƅH5HHHEMFHEMHEMH HHPH}Hu$13HHuHH}HHHH HH$1HHHxH}H}H}H}Hp]HHxH}H}H}H}H}  MM{M{{{<@UHHH}H}H]DUHH}H}HǀH]UHH}H}HhH]f.UHH}H}HH]f.UHHH}H}HǨHH]fDUHHHH5 HEHEH]f.UHH0H}HuHuHuH}1ɈʃUH}HH1ɈʃUtH}HH1ɈʃUKH}HH1ɈʃU"H}HHMߊEߨH}HEH}HM؉E3E؃E.HuH})HuH}1H}3H0]f.fUHHH}H}HH]f.UHHH}H}HH]ÐUHH}H}H]f.DUHHH}HuUHuH}HuHuHEHHEH}HEHEHHIHHEHEHEH}EEH}EEEEEEEH}؋uEHM)H H}HuHMHuH}H}H}HĀ]ÉHEЉMHEЉMH}H}H} UHHH}HuHuHH}1Ɉʃ%H}HHA H}HHH5HH5HHH5HHHHH5HHxxHƅHHHpHHhHHhƅH5HHp HRHHH HpHHHHH5H`H54H`HXH5EHXHPHPHHH5HHH@xHƅwHxHH8HH0HxH0ƅwH5HH8mHRHHHxw H8HH}HHHXHhH5}H(H5tH(H H5H HHHH5PHHxHƅ?H@HXHHHH@Hƅ?H5HHHRHHH@? HHX(HuH0HuH(H0HHHH H5HH5nHHH5HHHHH5JHHxHƅHHHHHHHƅH5HHHkHKHRHHH HHH(HHHHH5HH5eHHH5vHHHHH5AHHxxHƅHHHpHHhHHhƅH5HHpHRHHH HpHHH PH`HXHX HXHPHHPHH`HH(H0HHXHHH(H0 Hİ]H  @UHHH}H}H$H]f.fUHH`HHuHuH}HHEHuxHEH5"HMH}HHEHuH}EH5HH}HE؉MHE؉MH}E H}kEH}H}HHEHHEE%HE؉MH}H}HEH`]H}  fUHHH}HuH}HuH]f.UHHH}H}H H]f.@UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHPH}H}H}xHEH5HMH}HHEHuH}EH5HH}oHE؉MHE؉MH}E H}'H}MHEHHEHP]H}  @UHH H}HuHuHH}H}HHuH ]f.@UHHH}H}HH]ÐUHHH}H}H$H]f.fUHH H}HuHuHH}H}HHuH ]f.@UHH0H}HuHuH}H5H}HEHuH}HEH}EEHEH5gH}HxHuHxHpH51HpHhHEMfHEMOH`H5H`HXHuHXHPH5HPHHH}GG4fH}HuH8HuH8H0H5?H0H(H}H H H5H4H(HH5HHH}HHHHHHH5aHHH}HEMH}KHH5HHH}H}H0]H}H}H} @UHHH}H}H]DUHHH}H}H]DUHH@H}HuHUHUHuHHUHuHUH9H}HEHEH8HMH}HHuH0HUH}HMH;MHEHEH+EHUH}HHEHHUHHHH3H}HuH}H}HHuHUH}H}H@]f.fUHHH}HuH}HuH]f.UHHH}H}H]DUHH}H}HGH?H)H]@UHH}HuHuH6H}HHH]f.UHH H}HuHuH>Hu&HEH8HHEHHHRHHEHHEH}HH ]f.UHH0 1H}H}HHHHHHEHH HH+HEHHH}ΉHH}HHǨHHH}HHEExHHuHHH5HHHxtH}SHxtHxtHH}HH H1ɉHHhDždHH HHXHDžPHPH;XHhHPH<HHHHDDHHqHHcHDžd HHH8dddHHHHlj9H H0H5HH5HHH5HHHHH5HHxHƅHH HHHHHƅH5HHHxtRHxtHxtH HH FH8HH&HEHcdHHH8HHEHcdHHHHHH2HHH`HHHHHHHHHHH2 HHHHd)ddHHH5]HxH5HxHpH5.HpHh$HhH`H5H`HXxHƅHHHPHHHHHHƅH5HHP HxtRHxtHxtH HPHy HEHcdHHHHEddHcHHHHHHH8H@HH@PP HHHHd)ddHxHH5H8H5H8H0H5H0H(5H(H H5H HxHƅ_H`HxHHHH`Hƅ_H5HH HxtRHxtHxtH`_ HHx# HEHcdHHPHPHHHHHшsHH`HHHHHHHPH0HvPHHHHHHHLAHPHHHHHHxtHxtHHt9ȉHxHHH%rH-LH!&H$rHHHHHT9HxH@HHHHΉHHHHǨHHHHHHHHHHDž0.HLMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}HH0H}HHEHHH}H]f.@UHHHHH}HuHuHHHEHHHH]ÐUHHH}HuH}HuH]f.UHHH}H}H}H}H]UHHPH}HuHuHHEH}HHuHH}HuH}HEH}NHuH}HEH0HPHMH}HEЉMHEHHP]H} fUHH0H}H}H0]DUHHH}H}HH]ÐUHH0H}HuHuHHuHEHH@HHEH}HEHuH}HH0]HHUUHH}H}HGH?H)H]@UHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHH}HHHHE1ɉH}H8H}H0]f.UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHH}]fDUHHH}H}H]DUHH}H}H]f.DUHH}]fDUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHH}HUHuH}HHEH}HEH}HH0]DUHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}H]f.fUHH]UHH H}HuHUH}HUHUHUH9 H=SHMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}HE]fUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHHH}H}H}HH}HH)HH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHHEHEHHHH0]f.@UHH}]fDUHH}HuHU]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHHH}HuH}H]ÐUHH H}HuHUH}H ]HHUDUHH H}H}HEH}HH}HuH ]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHH}]fDUHH0H}HuHuHHHuHEHEHUHuHH}H}HEH}H8H0]HHU@UHHH}H}H]DUHH H}HuHUH}HuHUH ]DUHHH}H}HHH]fUHH}HE]fUHHH}H}HH}HHEHH]f.DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}H}H]f.UHH}]fDUHH0H}HuHUHUHH}HUHuH}HHEH}HEH}HH0]DUHH}HE]fUHH H}HuHuH}HuHcHuHH ]f.DUHH}HE]fUHH H}HuH}HEH ]f.UHHH}H}H]DUHH}HE]fUHH H}H}HEH}HH}HuH ]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHH}]fDUHH0H}HuHuHHHuHEHEHUHuHH}H}HEH}H8H0]HHU@UHH H}HuHUH}HuHUH ]DUHHH}H}HHH]fUHH}HE]fUHH0H}HuHUHUHH}HUHuH}HHEH}HEH}HH0]DUHH}HE]fUHH H}HuH}HEH ]f.UHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH H}H}H}H}H ]HHUUHHH}H}H]DUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHH1H}H}H]ÐUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHuH}H}H ]fDUHH}HE]fUHH}H}H]f.DUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHH}]fDUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHHH}H}H]DUHH}HE]fUHH@H}HuHuH;uHuRH}H}HEHuH}HEH}HEH}HEHuHUH}HEH@]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH H}HuH}HuH ]f.UHHHuHUH}HUHHUH8H}HE1H}M H}HuEEEEH}HEHEH HHuHEH}HEHEHEHuH}HEHEHEHMHMH}HE8HE؉MH}HxHEHxHEH@HE/HuH}HE؉MH}2HEHxHEH@HEHuH}H}Hu6H}HH}HHEH}HpHĠ]H} HHh UHHH}H}H0H}HEH]DUHHH}H}H}HHEH]DUHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}H}H]f.DUHH}Hu]fUHHH}H}HH]ÐUHH H}H}H}HHEH}H}HEH}H8H}HH@H}HH}HHEHx HEH@HEHEH ]f.UHHH}HuH}Hu4$H]fDUHHH}H}H H]ÐUHH@H}HuHuH}HuH}HEHEHUH}HuHUHEHH@]f.fUHHH}H}H HEHEHMHEH@HHEH@HEHEHx HEHEaHEHxHEKHEHH@HEH@HEHEH8 HEHEHEH8HEHEH]f.UHH0H}HuHuH}H HuH}HuHHEHuHUHEH}HHuH}HEH0]UHHH}H}HH}HH}HHH]ÐUHH H}HuH}HuH}HH}HHEHEH ]fUHHH}H}H]DUHHH}H}H]DUHH}HE]fUHH}HuHuH6H}H;7$]f.fUHH}H}H?H]f.fUHH}HE]fUHH0H}H}HEHEHHHMH}HHHUHEHUH0]UHH0H}HuHuH}HuHHuH>HH}HEHHuH~HHuHEHH0]fUHH H}HuHUH}HuHUH ]DUHH}HuHUHUHuH2HuHr]f.UHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}HH]f.UHH}H}HEH@H;8]f.@UHH}HEH8HEHHEHEHxHEH@HEHE]f.UHH}H}HH]f.UHH@H}HuHUHUHHUHEH}H}HuH}H H}HHU>HEH8HEHHEHEHMHHEHHEfAHEHxHEH@HEHEHMHHEHHE%JH}H}HHEHHEHEH@]f.UHHH}H}H]DUHH0H}HuHUHMHMHUHHUHBHUHuHVHUHuHHHMHH8#H}HHH}HEH}H8H}H8HEH0H}H0HH0H0]fUHHH}HuH}HuH]f.UHH0H}HuHUHUHuH}HUHuH}HuH$H0]UHH0H}HuHUH}H}HEHUH9H}Hu$E&H}H}HEH}H9ME$H0]f.@UHHH}HuH}HuH]ÐUHH@H}HuH}HuH}HHEHUHuH}EEH@]HHUf.UHH`H}HuHuH}HHEHGHEHHuHEH}HEH}H}HEH}HuHEHH}HuEă} EĉE;HEH;E E!HEH;E EEEH`]fUHH0H}H}H}H}HEH}HuHHEHUH0]f.fUHH}H}HG]f.@UHH H}HuHUH} EH}HuHUEEH ]UHH}H}H]f.DUHH H}HuHUH}HuHUH ]DUHH}HuHUHUHuH2HuHr]f.UHHH}HuHuH;uHu$F1HUH;UMH}HEHEЊHMߊEߨH}HEH}2H}HEH}HEHEHHHMH}lHE@^H}HEHEHEHMAH}HEHEHEHMH;MHMQHMAH}#H}HEHEHEH}H}HEHEHEHMAH}HEHEHEHMAH}J@H}HEHEHHH HMH}rHE@dH}HEHEHEHMAH}HxHxHEHMH;MHMQHMAH})H}HpHpHEH}H}HhHhHEHMAH}H`H`HEHMAH} Hİ]HHXf.@UHH0H}H}HH}H}H?HEHxHEHxHEHxHHEH@HMHAH}HEHMHIH&HEH}HEHEHEHMHHHEHMHH}HuH0]HHUUHH0H}H}H?H}H}HHEH8HEH8HEH8HHEH@HMHAH}HEHMHIH&HEH}HEHEHEHMHHHEHMHAH}HuH0]HHUUHH}HuHuH}H~]fDUHH}HuHuH}H>]UHH H}H}HHEHxHEHH}4H}HEHEHEHEH@HEHEH ]HHUUHH}HEH8HEHHEHE]@UHHH}HuHuH}HuHuHHMHuHHH}H HHEHuH}HUHEHEHEHuHUH}HuHUH}HuHUHH}H}HH}HEHĀ]ÉHEMH}H} UHHpHHuHUHUH}HHEHEEH}HuHU1HHUHEH}HuHUH}HEH}HH HHEH}H}HuHH}@EE%HEȉMH}H}HEHp]H} UHHH}H}HH]fUHHH}H}HH]fUHH H}H}H}HHEH}HHEH ]fDUHHH}H}H]DUHH1H}HuH}HuH]fUHH H}Hu$EH}HuE$H ]f.@UHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHH}H}H]DUHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH}H]f.fUHH}Hu$EHuH}H>E$F]UHH0H}HuHUH}HUH}HHuH}HH0]HHUUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHHuHH ]f.DUHH}HE]fUHH H}HuHuH}HuH0H}H7H@HGH ]UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH H}HuHUHUH}HUH}HH ]fUHHH}HuH}HuH]f.UHH0H}HuHuH}H}HHEHuHHEHHuHHH0]ÉHEMH}H} UHHH}H}HH]ÐUHH}HE]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH1H}H}H]ÐUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHH0H}HuHuFHu;HEH8HMH H}HHEH}HuH}HMH9HuH0]HHUf.DUHH}HE]fUHHH}HuH}HuH]f.UHH}HuHuH}H>]UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH@H}HuHuH;uHuRH}H}HEHuH}HEH}HEH}HEHuHUH}HEH@]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH H}HuH}HuH ]f.UHHHuHUH}HUHHUH8H}HE1H}M H}HuEEEEH}HEHEH HHuHEH}HEHEHEHuH}HEHEHEHMHMH}HE8HE؉MH}HxHEHxHEH@HE/HuH}HE؉MH}2HEHxHEH@HEHuH}H}Hu6H}HH}HHEH}HpHĠ]H} HHh UHHH}H}H0H}HEH]DUHHH}H}H}HHEH]DUHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}H}H]f.DUHH}Hu]fUHHH}H}HH]ÐUHH H}H}H}HHEH}H}HEH}H8H}HH@H}HH}HHEHx HEH@HEHEH ]f.UHHH}H}H HEHEHMHEH@HHEH@HEHEHx HEHEaHEHxHEKHEHH@HEH@HEHEH8 HEHEHEH8HEHEH]f.UHH0H}HuHuH}H HuH}HuHHEHuHUHEH}HHuH}HEH0]UHH H}HuH}HuH}HH}HHEHEH ]fUHHH}H}H]DUHH@H}HuHUHUHHUHEH}H}HuH}H H}HHU>HEH8HEHHEHEHMHHEHHEfAHEHxHEH@HEHEHMHHEHHE%JH}H}HHEHHEHEH@]f.UHH0H}HuHUHMHMHUHHUHBHUHuHVHUHuHHHMHH8#H}HHH}HEH}H8H}H8HEH0H}H0HH0H0]fUHH0H}HuHUHUHuH}HUHuH}HuH$H0]UHH H}HuHUH}Hu$H ]@UHHH}HuHuH}HuHuHHMHuHHH}H HHEHuH}HUHEHEHEHuHUH}HuHUH}HuHUHH}H}HH}HEHĀ]ÉHEMH}H} UHHpHHuHUHUH}HHEHEEH}HuHU1HHUHEH}HuHUH}HEH}HH HHEH}H}HuHH}@EE%HEȉMH}H}HEHp]H} UHH}HE]fUHH H}HuH}HuH ]f.UHHpH}HuHUHUH}HuHUHEHEH}HEHUH9HEHEEHEH}HEH}H9!EHEHEH}H}HH}HuHEHHEEIHuHUHEH}HuHUHEHUH)H}HuHEHUHHM HuH}7H}HuH}H}HHuHUHMH}H}Hp]UHH}Hu]fUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH0H}HuHUH}H}HEH}HEH}HuHH0]UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH H}H}H?H}\H}H}H}H7HEHuH}HuHHEHHHEH@HH ]UHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHH}HHHHE1ɉH}H8H}H0]f.UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH}HuHuH}H)HH]UHH}HuHuH}HH7H7]UHH H}HuHUHEH;E.HuH}HEHEHHEHEHHEHEH ]fDUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHHEHEHHHH0]f.@UHH}]fDUHH}HuHU]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}HuH}HuH]f.UHH H}HuHuH}H?H>H>Hu HEH8H ]fUHH}Hu]fUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH H}H}H ]DUHHH}H}HH]ÐUHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHH H}HuHUH}HUHUHUH9 H=ctHMHHH ]DUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=#aHMHHH ]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH@H}HuHUHMLEHMH;MpHEHEHEHEHEHEHEH;EEH}HuHUHHEHMH)HE#HEHHEHEHEH@]@UHH0H}HuHUH} HE)H}HEH}؉HUH}؉HEHEH0]ÐUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}HuHUHMLEHMHUHHuHpHEHEHHEEHEH8H}H}HhH}H`H}HXHpHhH`IHuHUHXHPHHHpHPHHHH}HEEH}HEMH}>HuHxHH@H}HUH@HEUH]H} UHHH}H}H}HHEH]DUHHH}H]fUHHH}H}H HH]fUHHPH}HuHUHUHHUHEH}HEH}.H}HuH}H H}HHUNHEH8 HEHHEHEHHEHEHMHHEHHEH}H}H HUH}HHuUHEHx%HEHHHEHEH@HEHEHMHHEHHEBHEHMHHEHE%H}H}HHEHHEHEHP]f.UHHHHuHUHMLEHMH}HHEHEEH}ADHuHM1HHEHMH}HuHUH}HEH}HH HHEH}H}HxH}HpH}HuHxHpIH}@EE%HEMH}H}HEHĐ]H} f.fUHH}HE]fUHH}HE]fUHH}HE]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]f.UHH}HE]fUHH H}HuHUHUH}HUHUH}H$H ]UHH`H}HuHUHMLEH}HuHMH}HHuH}HEH}HEH}HuHUHMIH`]UHHPH}HuHUHMLEH}HuHMH}HHuH}HEH}HEH}HuHUHMIHP]UHH`H}HuHUHMLEHMH}HMH}HEHHEH}HuH}HEH`]f.DUHH@HuH}H}HuHUH@]fUHH0H}HuHUH}HuHUH0]DUHHPH}HuHUHUH}HUHH}HHEH1ɉHHP]ÉHEȉMH}H} f.UHH}HE]fUHHH}H}H]DUHH}H}H]f.DUHH H}HuHUHUH}HUHHUHH}HEHH ]fDUHH}HE]fUHH}HE]fUHHH}HuH}HuH]f.UHH0H}HuH}HuH0]f.UHH0H}HuH}HuH0]f.UHH@H}HuHuH}HuH}HH@]f.UHH H}HuHuH}HuHuHH ]fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}H}H?H]f.fUHH}HE]fUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHHH}HuHUHMLEHMHUHHuHpHEHEHHEEHEH8H}H}HhH}H`H}HXHpHhH`IHuHUHXHPHHHpHPHHHH}HEEH}HEMH}>HuHxHH@H}HUH@HEUH]H} UHHPH}HuHUHUHHUHEH}HEH}.H}HuH}H H}HHUNHEH8 HEHHEHEHHEHEHMHHEHHEH}H}H HUH}HHuUHEHx%HEHHHEHEH@HEHEHMHHEHHEBHEHMHHEHE%H}H}HHEHHEHEHP]f.UHHHHuHUHMLEHMH}HHEHEEH}ADHuHM1HHEHMH}HuHUH}HEH}HH HHEH}H}HxH}HpH}HuHxHpIH}@EE%HEMH}H}HEHĐ]H} f.fUHHH}H}HH]f.UHH H}HuHUHUH}HUHUH}H$H ]UHHPH}HuHuH}H}HHEHuHHEH}HEH}Hu HE.HEHEHuH}HuH}HEHEHEHP]ÐUHH`H}HuHuH}H}HHuH}HEH}HuHUHHEH}HEH}HuE1EDM3H}HuH}HEHuH}HuH4EE HEHE H}HEHEH`]f.UHH}HuHuH6H}H;7$]f.fUHHH}H}H}HHEH]DUHH@HuH}HuH}HuHEHuH}HEH}HEH}HEH}HHH}HH}HuHEH@]UHHHuH}H}HuH]f.UHH@H}HuHUHMH}H}H}VH}H}H HUH}HHuHEHEHEHHE HEH@HEHuH}HEH@]UHHH}HuH}Hu4$H]fDUHHH}H}H H]ÐUHHH}HuH}HuH]f.UHH}HuHuH}H>]UHH@H}HuHuH}HEH}HHEHuHH}H}HEHHuH9HEH}HEH}H8H}H8HH8H}H8HEHHEH@]f.UHHH}H}HH}HH}HHH]ÐUHHH}HuHuH>HEHx HEHE H}HEHEHEHEH8HEHHE HEH@HEHEHEHEH}HEH@HMHAH}MHEHMHIHHEH;E#H}HEHEHHHMHEHE5HEH}HEHEHEHMHHHUHRHHUHEHMHEH;EHEH@HMHAH}HEHMHIH%HEHHEHEHEHMHHHEHHMHHEH8HHEH@HMHAHEHxHEHxHHEHHEHHEH;EHEHEEH}H} HE@H}?HE@eHE@H}HEHE@H}HEH}H}HEH;8HEHEHEHH@HEHEH8HEH@HEHxHEH@@HE@H}HEHEHEHMH;MHE@ HE@H},H}HxHxHHHpHEH@HHpHpHEHEHxHEH@@<HEH@HE@H}H}HhHhHEH}H`H`HHU؀JH}HXHX@HMHIAH}HPHPZPHE@rHE@H}HHHH@H}H@H@H}HEH;xHEHEHEH@HHEHEH8HEH@HEHxHEH@@HE@H}H8H8HEHMAHEH;E HE@DH},H}H0H0HHH(HEH@HH(H(HEHEH8HEH@=HEH@@HE@H}H}H H HEH}HHHHU؀JH}HH@HMH AH}HH VH]HHfUHH0H}H}HHEHxHEVH}4H}HEHEHEH}HEHEHEHEH0]HHUUHHuH}HuH}H>]UHHPH}HuHuH}H}HHEHuHHEH}HEH}Hu HE.HEHEHuH}HuH}HEHEHEHP]ÐUHH`H}HuHuH}H}HHuH}HEH}HuHUHHEH}HEH}HuE1EDM3H}HuH}HEHuH}HuH4EE HEHE H}HEHEH`]f.UHHH}H}H}HHEH]DUHH@HuH}HuH}HuHEHuH}HEH}HEH}HEH}HHH}HH}HuHEH@]UHH@H}HuHUHMH}H}H}VH}H}H HUH}HHuHEHEHEHHE HEH@HEHuH}HEH@]UHH@H}HuHuH}HEH}HHEHuHH}H}HEHHuH9HEH}HEH}H8H}H8HH8H}H8HEHHEH@]f.UHH`H}HuHuH}H}HHuH}HEH}HuHUHHEH}HEH}HuE1EDM3H}HuH}HEHuH}HuH4EE HEHE H}HEHEH`]f.UHHHuH}H}HuH]f.UHH@H}HuHUHMH}H}H}VH}H}H HUH}HHuHEHEHEHHE HEH@HEHuH}HEH@]UHHuH}HuH}H>]UHH`H}HuHuH}H}HHuH}HEH}HuHUHHEH}HEH}HuE1EDM3H}HuH}HEHuH}HuH4EE HEHE H}HEHEH`]f.UHH@H}HuHUHMH}H}H}VH}H}H HUH}HHuHEHEHEHHE HEH@HEHuH}HEH@]UHH}Hu$EHuH}H>H}$FEHu$]f.UHH}H}GH?$]UHH}H}HHH]UHH}H}HH;G]fUHHH}H}HGHHH]f.UHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH}Hu]fUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHH H}HuHuH}H?H>H>Hu HEH8H ]fUHHHHH}H}HHH]UHHH}H}H]DUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHHH}H}H]DUHH}]fDUHHHHH}H}HHHH}HHEHHH]fUHH H}H}H}HEH}HuH}H}H ]HHUUHHH}H}H]DUHH}]fDUHHH}H}H]DUHHHHH}H}HHH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHHHHH}H}HHHH}HHEHHH]fUHH H}H}H}HEH}HuH}H}H ]HHUUHHH}H}H]DUHH}H}HGH?H)H]@UHHH}H}H7H]fUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHH}]fDUHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHHH}H}HH]ÐUHH}HE]fUHH H}HuH}HuH ]f.UHH}Hu]fUHHH}H}H]DUHH}H}H]f.DUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHHH}H}H}HH}HH)HH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHH H}HuHUH}HuHUH ]DUHH H}HuHUH}H ]HHUDUHH}H}HHH]UHHH}H}HGHHH]f.UHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH}Hu]fUHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH0H}HuHUHMHEH;ESH}HEHHH}HH}HH}HEH}HuHHEHHHH0]ÐUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHHH}H}H]DUHH}HE]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHH}H}HH;G]fUHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUHEH ]f.UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH H}H}H ]DUHHH}H}HH]ÐUHHH}H}H]DUHH}H?]f.fUHHH}H}H]DUHH}H}H]f.DUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H=#HMHHH ]DUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH01AH}HuHUHMHMHUH)HHMHMHUH2I)ILH2H}HEHHMHUHHHH0]fUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHUH}HUH}HHUH}HH ]fUHH@H}HuHUHUHHHUHEH}HuH}HUHrH}HHUH}HHEHPHHPHUHHUH}H}H@]UHH H}HuHUH}.HuH}HEHEHHEHEHHEHEH ]fUHH}HE]fUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH0H}HuHuHHuH}H}HEHuH>H8H~HxH~HxHuH}H}H0]@UHH H}H}H}H}QH}H}HEH}HEHH}HuH1ɉH}1ɉH}H ]f.UHH H}HuH}HuH ]f.UHH H}H}H}H}+H}EHHu1ɉH}&H}EHHu1ɉH}H ]HHUfUHH H}HuHUH}HuHUH ]DUHHH}H}H@H]ÐUHH}]fDUHH H}HuHUH}H ]HHUDUHH0H}HuH}HuH}HHH}HEHEH0]f.UHH}HE]fUHH H}H}H}H}HH}HH}H}HEHuH0H}HH ]UHH H}H}H}H}HH}HH}H}HEHuH0H}HH ]  cctP 66bJ5$  9 *L!MM"$9UUY!MM"$9!MM"$9(7~ 'BBSOO&6BBSOO&eeJ6bL&eeJ6bL&eeJ6bL&eeJ6bL 11(uY9ee s  V"$9j  " $ 9w1"$9 j')("($)(9))x*c+-,",$-,9--x.222<354"4$54955w66668:9"9$:99::j;=MM T"$9"$9 " $ 9   O  " $ 9O"$9GGg-cO99Y-v! 5$Dff$)"$9  " $ 9 "$9y DA&% j% D'`% 4 "!"!$""9""}}} == gJ:  , L t  / ]"  / ]" \\&5 Ml * M  G+9 L t  / -p -p 9T  -%PY , J@>; RKK`M*Z (C ??RG( 1"%PYKK`M*Z Cf * M UU `[1& )A 3$ " E ##_B: CX] AA XM( %/dX]  R$ Cf 9T *L 9T *L L t  / Cf~~.1 7 d O k~~.1 * M 7 d O k %/d    /BRCK. OPEN BRCK. CLOSE IDX OPEN IDX CLOSE CURLY BRCK. OPEN CURLY BRCK. CLOSEARG_SEP IF ELSE ENDIF JMP VAL FUNC OPRT_BIN OPRT_IFX OPRT_PFX END SCR_ENDL SCR_CMT SCR_WHILE SCR_GOTO SCR_LABEL SCR_FOR SCR_IF SCR_ELSE SCR_ELIF SCR_ENDIF SCR_FUNC UNKNOWN ()[]{},?:Assertion "m_sNameChars.size()" failed: /Users/jgomez/muparserx/parser/mpParserBase.cpp line .Assertion "m_sOprtChars.size()" failed: Assertion "m_sInfixOprtChars.size()" failed: 4.0.8 (2018-10-09; Dev)Assertion "a_stOpt.size() > 0" failed: Assertion "m_nPos >= 3" failed: Assertion "a_stOpt.top()->GetCode() == cmELSE" failed: Assertion "opElse->GetCode() == cmELSE" failed: Assertion "opIf->GetCode() == cmIF" failed: Assertion "eStarter == cmCBO || eStarter == cmIO" failed: Assertion "pOprtIndex != nullptr" failed: Assertion "eCmd != cmIC || m_nPos >= (int)iArgc + 1" failed: Assertion "pOprt1 != nullptr && pOprt2 != nullptr" failed: Assertion "pOprt1->AsIPrecedence() && pOprt2->AsIPrecedence()" failed: Assertion "m_nPos" failed: Assertion "pFunc != nullptr" failed: Assertion "sidx < (int)m_vStackBuffer.size()" failed: Assertion "sidx >= 0" failed: StackDump> Operator stack is empty. Operator stack: "" allocator::allocate(size_t n) 'n' exceeds maximum supported sizestack is empty.operator*/Users/jgomez/muparserx/parser/mpIToken.hm_pTok]]^^$^6^H^Z^l^~^^^^^^^^_ _2_D_V_h_z_______________p@@h@h@ppN3mup11ParserErrorEN3mup11MatrixErrorEN3mup11ParserXBaseENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEEN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEEMARPpARARpAReP  #0 BA S XAS (@9~ @`@Wnp9#9@9A,SOATSB@*p9AlSAS#@5 @q#ASB@ASP#ATp!#!s "}""` #[#[#[@$[$[% %A(T0&lADT((lApT0+P+s+lAT@.`.lAT00A@1#p1>1>1>02#`2>2>2(38P3038303AT424AU@T`TTTT*T% UtV#VVWpAVX AVPc$cNAtWd#e"0ePepeeeAWf2fg$@g2glAWjk0k@l#plll#lePmAW@#p^}p9F AY2202p2Ѓ2!@2-Є#GP `Y8A Y #P31Z`+Ї0A0Y##;A@YPpЉ @+pAPY @`##+0Pp2Ќ;A`Y'@`+ApY'02pi (PpC(0WZ AY##0Pp2*"0@pOМ10'`  @L$%Vp#u@"pM(B@?#(AYxAY` kZ  @ P`+[6@P#YAY'0P# @ PM(Ш [dAY#@?0P`0Ы+r FF`p7Э+AY##;AY@3#Я |AY`+'10Pp [ 01p#в3 @#p |A Z+0'`p[д#0`AZ#I6Pp 9A,ZO01p$ з @`:и й ~#/Ap$ Ipn+%@`p"VPpp#H/VAdZD@`H+%0"AtZ`AZ@AZ @`AZ, AZ AZ0Pp:'2@+pF[@`(OAZ+ _19 Fp7#oAZPpepA[ #Pp$~@`#/A[++@`h>0Pp0H,A@[AT[#Y`p##M krAh[0  Zp+r0 @`FF7P#> YAx['Pp[p#M70A[! @U+K UA[9A[#0Pg!07p,&<QA[p|A[0"`+$+3P#C0#`2C#0#`/2'ep'/20/` 0P[OA\@_PGoA\+@`'0DA0\    + #  @` p p@ a ' + uAD\    J0 @ P # # # 3 .Pp ;pAT\oAd\DA|\#@P$+@#*# @/ >A\` A\! !!"+"p#$$%#%&&'0(6p((((&)rA\))@*>*-***`A\P+#+I++ ,GP,XA\,, ,--0-P-(--`A\.#0.I.6.. .G@/XA\///00 0A]@1#p111#112 2@2`2202223 3Z3+3;A]34&@4rA$]445F5A4]6F777P77308909:+0:P:p:_::.;0;P;p;0<<L= =0=@=pAH]==0>#0>wAX]>>>???+@F`@ p@Ah]PApAAAFAB3@BB3 CD DYA|]DDDDE E@EF+@F'pFFF_G G.PG[GGGHHwPILI@JPJpA]JJ0K#@KwA]KKL;@LpA]L>LMWMNFPNFNN7Nl`OO# PA]P+PQ  Q;A]`QCQQh0RhzPLRx ,$+M}AC zRx $-AC $D-AC ,, }AC $.AC $.AC $.AC ,d.|AC $D/AC $l.AC $.AC $.AC $.AC ,\.{AC $<x1eAC $d1AC $H3#AC ,P3B{AC ,4p5XzAC $5AC $<5(AC $d59AC $5~AC $ 6AC $6@AC $06@AC $,H6WAC $T6nAC $|6AC $69AC $6#AC $69AC $69AC ,7xAC $t8OAC ,9{xAC $9BAC $ :*AC $(:AC $D :9AC $l8:AC ,0:wAC ,<wAC $=#AC $=5AC $D>AC $l>AC $>qAC $>#AC ,4>vAC $@BAC ,@ovAC $lA#AC ,A3vAC $C#AC $CsAC $ C}AC $< 8DAC $d 0D`AC $ hD[AC $ D[AC $ D[AC $ E[AC $, HE[AC $T EAC , xEotAC , XFl[tAC $ HAC ,T Hl/tAC $4 JAC $\ JsAC , KlsAC $ `MAC ,, XMlsAC $ OAC $4 OAAC $\ O#AC $ O>AC $ O>AC $ O>AC $ P#AC $$ P>AC $L (P>AC $t @P(AC $ HP8AC $ `P0AC $ hP8AC $P0AC ,P{qAC $lP2AC ,Q3qAC $PpAC $HpAC $@pAC $<8pAC $d0p*AC $8p%AC $@ptAC $q#AC $qAC $,qAC ,qppAC ,r pAC $p}$AC ,,x}N[qAC $ ~#AC $4~"AC $\~AC $~AC $~AC $~AC ,L~_pAC $,X2AC $TpAC $|h$AC $p2AC ,loAC $ȂAC $$AC $LAC $t#AC $AC $AC $#AC $eAC ,_nAC $l#AC $AC $^AC $}AC $ 89AC $4PFAC $\xAC ,pOnAC $З2AC $2AC $2AC $,2AC $T0AC $|(2AC $@!AC $H2AC $`-AC $hAC $D`#AC $lhGAC $ AC $xAC $pYAC ,\8kAC $<#AC $d3AC $ؘAC $1AC $ؘAC $ИZAC $,AC $T+AC $|AC $0AC ,'jAC $X#AC $$`AC $LH#AC $tPAC ,H;giAC $XAC $PAC $HAC $D@AC $l8AC $0AC $AC $AC $ +AC ,gAC $dAC $AC $#AC $#AC $+AC $,AC $TAC $|AC $AC $x2AC $AC $xAC ,`;eAC $tp'AC $xAC $pAC $hAC $PAC $<8AC $d0AC $(+AC , 0dAC $AC $ AC $4 'AC $\ 2AC $ iAC $ AC $ AC $ (AC $$!AC $L!AC $t!AC $!CAC $!(AC $!WAC $"PZAC $<" AC $d"pAC ,"aAC $"AC $"#AC $ ##AC $4#AC $\#AC $#AC $#2AC $#*AC $#AC $$$"AC $L$@AC $t$ТAC $$OAC $$1AC $$AC $%'AC $<%AC $d%AC $%آAC $%ТAC $%AC $&AC $,&AC $T& AC $|&xAC $&pLAC $&$AC $&AC $'%AC $D'VAC $l'آAC $'Т#AC $'آuAC $'0"AC $ (8MAC $4(`(AC $\(hBAC $(?AC $(#AC $((AC ,L)_[AC $,)HAC $T)@AC ,)8xZAC $)AC $)AC $)kAC $$*@ZAC $L*x AC $t*`AC $*XAC $*P AC $*8AC $+ +AC $<+([AC $d+`AC $+H6AC $+`AC $+H#AC ,T,PY{XAC $4,'AC $\,AC $,AC $,xAC $,#AC $,AC $$- AC $L-إMAC $t-(AC $-AC $-AC $-AC $.[AC ,.dSVAC $l.XAC $.P#AC $.X?AC $.pAC $ /hAC $4/`AC $\/XAC $/@AC $/8AC $/0AC $/(AC $$00AC $L0AC $t0AC $0AC $0+AC $0rAC $1P AC $<18AC $d10FAC $1XFAC $1AC $1h7AC $2AC $,2x+AC ,2KRAC $2Ц#AC $2ئ#AC $2AC ,L3ئ;QAC $,33AC $T3AC $|3#AC $3 AC ,4|PAC $38AC $$40+AC $L48'AC $t4@AC $4(1AC $4@AC $48AC $50AC $<5(AC $d5 AC $5[AC $5@AC $5(1AC $6@AC $,6(#AC $T60AC $|6(AC $63AC $6(AC $6 #AC $7( AC ,7|MAC $t7`+AC $7h'AC $7pAC $7X[AC $8AC $<8x#AC $d8AC ,8x`SLAC $8#AC $8IAC $ 9ا6AC $49AC $\9 AC ,9Ч9kKAC $9AC $9اOAC $:1AC $,:$AC $T: AC $|: AC $:AC $:AC $:AC $;اAC $D;ЧAC $l;ȧ:AC $;AC $;ȧAC $;AC $ <H AC $4<0AC $\<(AC $< AC $<AC $<AC $<~AC $$=PAC $L=HAC $t=@#AC ,=H/cGAC $=H+AC $=P+AC $>XAC $D>PAC $l>HAC $>@AC $>8AC $> AC $ ?AC $4?*AC $\?AC $?TAC $?ȪAC $?hAC $?ث/AC $$@>AC $L@AC $t@AC $@AC $@Ы$AC $@ثAC $AЫAC $AC ,4G>AC $GAC $AC $O8AC $O0AC $P(AC $DPHAC $lP,AC ,Po5AC ,QS5AC $PAC $Q#AC $DQYAC $lQȿAC $Q#AC $Q#AC $QMAC $ RkAC ,R0r3AC $dRAC $RAC $RPAC $R AC $S AC $,SZAC $TSAC $|S+AC $SrAC $S8 AC $S AC $TFAC $DT@FAC $lThAC $TP7AC $Th#AC $Tp>AC $ UAC $4UpAC $\UhAC $U`AC ,UHY0AC $Ux'AC $VAC $,VAC $TVAC $|VAC $VAC $VAC $VAC $W[AC $DW#AC $lWMAC $W07AC , XH.AC $W!AC $XAC $OAC ,k3AC $dkpAC $khAC $kAC $k+AC $lAC $,lAC $TlAC $|lAC $l#AC $lAC $l`AC $mXAC $Dm AC $lm6AC $mAC $mAC $mAC $ n&AC ,nrCAC $dnAC $nAC $n`>AC $nx-AC $oAC $,oxAC ,op`3AC $o#AC $oIAC $oAC $o AC $$pGAC ,pXKAC $|pAC $p AC $pAC $p-AC $qAC $Dq(AC $lqAC ,q`AC $q#AC $qIAC $r@6AC $AC $AC $WAC $ AC $4FAC $\FAC $AC $7AC $ԅlAC $8AC $$#AC ,3AC $|+AC $ AC $̆ AC ,D;AC $$CAC $L8AC $t hAC $hhAC R-wR-jR-ZR2-QR}-ER-R-R-Q-Q-Q-Q-Q-Q-Q-WQ-@Q-Q!-P-P-P-PE-P-vP-iPE-YP-CP(-5P- P-O-O-O-O-O-O-~O(-uO-RO-IO-"O!-O!- O-N-N-N-|N--ZHD-?HE-2HD-%HD-H-G-G-G-GqG-=G-G-F-F:-F-F-F-]F-1F-E-E-E-E-E-D-D-D-uD-SDd-BD-9D-1D-DU-CA-C-C>-C-C-Cv-C-~C-gC-HCG-AT-&AT-A-@x-@|-@H-@R-@>-@~-@>-@G-L@}-<@|-@{-?z-?-?y-?x-u?H-d?G-X?w-7?v->->u->->-{>-_>d->s-=r-=q-=-=-=o-l=d-U=n-=m-<l-<l-<l-<Y-<k-m<-<-;-;-;R-;-;-;-;-a;-%;j-:h-:i-:h-:-:-e:g-E:f-!:e-9b-9-9d-v9c-!9Q-82-8-8R-8a-8b-8-8a-8a-w8`-X8-L8_-8O-7-7-7-l7:-=7-17Z-6^-6Z-6-6P-6P-x6-Z6Y-J6Z-=6-)6N-6R-6\-5R-5-5[-5Z-p5-N5-E5Y-55-$5-5-4-4-4@-4C-y4>-k4W-,4V-3-3-3T-p3S-`3O-L3G-C3?-3M-2R-2Q-2P-q2O-T2H-1N-1M-1L-Y1K-<1-1I-1H-0G-0F-s0>-f0D-N0D-60E-)0D-0D-/C-/-/-}/A-o/@-b/?-U/>--/-/=-.=.<-.-o.;-c.:-W.-.9----7----6-n-:-e--A-5-#-4- -=,K-,-,-,2-,(-r,-e,R-=,--,]- ,=+1-+0-+-+-i+/-L+-5+--+-*,-*+-**-*=t*-.*-*R-)-)-)-)-)-n)-W)(-J)-9)R-+)'-(&-(:-'-'+-s'O-H'P-8'3-#'+-'L-&O-&5-&-&-j&:-,&-&-%%-%N-h%-X%3-C%-#%L-%N-%8-$-$-$J-$-$2-v$-U$-H$ -?$F-#-#-#,-[#-G#-;#-3#3-#-#$-"?-"-"-"#-h"P-X"-C",-#"-"#-"p-!-!-!|-!-i!-X!#-K!z- - D- D- C- ^-Z -) b- D-D-D-D-^-D-C-D-:b-"D-D-^-D-D-lD-LD-Cb-D-C-hD-^-D-D-C-&[-[-D-C-7D-D-C-b>- G-J-----x -oF- ----L-0-----3-{-n-]?---!----s-S-B-5-!------{-A -1@----c-c-i-s-U-E-5-#-`-g-f-e--c---,-}-VP-:,-4----F-c-c-ub-gw-Ja-(t----o-|-6---a-=- - - - -i  -  -  -  - -v -Y -E -9 -1 - - - - -v -i -6 - - - - - - - -Q -A @- - - -n -X c-J c-! i- -----`-g-f-xe-^---v-Z----7--}-q-M---!- --F-c-c-b--ja-H- -----}F-l-=D-.@-D-;-)-----q----M!-!-!---0--!-!-y-q-I----"-E-ZE-:------------I-I----i-9--------\-G-.---$-H-; =&-!-!-----]-7-----p-v?-eC-----;-&--/--j--H-p-_-L?-9-?-"->----]-Q-----Y-E=>-C-#--'/=-- --q-0= ---a-J-E1----a-F)-#(- c-(-c-(-(--u-Sd-B-9-1----i-=-1------}--;--pc-g-L;----v--;-l-`x-Pc-<v-3---y- ---x-\-Gv-------O-F-1-%h-- g-- --- -d -:c-%---c-c-hi-Zh-JH-8-,`-g-f-e---c-zc-qF-eb-W-Ca--E-`--H-R-i-Y@-- d-----C---p-AI--H-F---E-a=-&D-=-C-V-F-2-"-----Q--:-!-:----5--6-3-sL-\-?-A-->-5--d-R4-53- L----u-U-0-N-------9-----[-Or-4l-l----e~-I-@-#- -l-k-H-\|-LH-z-x-u{-iz-Ty-Hx-w--u-t-1--s-r-q-H-ap-(o-n-m-l-l-ak-Ak-"-c-c-i-h-H--`-g-wf-[e-C-- c-c-F-b-w-a-v-oE-c`-Zu-@H--D-C-^--[-D-C-[-;-$[-D-C-[-N-'^-D-D-b-D-C-VD-4D-D-b-D-D-^-D-oC-3D-D-D-D-C-D-qD-Y-E-"X-#-/-G-wd-fW-Y/-LV-?#--2-T-S-P2-C2-0R-2- 2- -@-Q-S2-Jd-;-+---@-c-P-,--O-QN-M--L-H--K-H-WJ-1?-I-@-\s-PH-G-F-w-v-E-q=-6D-!=-пC-B-jA-]@-1?- >-2----u-e-E=-<-;-:--]:-Q9-9-(- 5-7-6-3-ӼL-}-u?-bA-]}-$>-5-x-Ļ~-4-3-iL-F-32-1-պ0-/-q-{O-n.-e--T,-G+-*-w-Ĺ}-n)-C -6(-(-c-(-(-:--Q'-1&--%-$-G-W#-K"-!-Ѷ ----a--------u-E-!---- --M-E-!--߳-ҳ-ij--Y-1- - - - -M- - - ---a-A-- -Ͱ-Ű--q-X-?-2-$----i-\-7- --ɮ--|-T-H-3--ĭ---L-<---Y-I----u-A-$-Ѫ--j1=c-)-;-ީ-թ@-éB-=+=-=-q-Z-UA--m-E-1- --ç----y-l-E-%--զ-d----e---ե-ĥ-----Ф----x-\-G- --ң-ƣ--:-T-=----բ---}K-^-A-%R----Ρ:-š--u-K=(----Q-%@-@--;-%(--nC-\?-RC--q-M-A-!----(-WG---ɚ-yH-i-U-#/--ݙ-Ǚ?-C->-}-o-]-2#-/---И--h-V-EC- ----ۗ?-їC-C-|-mA-e-I-9-B- -A-זH-ϖ---?-xC-`-S-?-&-C-ו@-ϕ-----u-S-,---v-i-S-=-*---ғ---k-Q-&------/-ڑ---l-:-[--ݐ-=\-_-b_->:-5`-`-`-Ϗ-[-X-O----ю----u-Y-}--э--q-Q---%-----an-Em----?-y-U-1----Պ--a-U-1---ʼn--e:-G-0--و--|-T~-H}-3v-|-Ň{-z-ty-Px-@w-,v-#-L-t-yu-mt-9s--q-ą - -p-W==c--#- /--h--m-{--o-X-Om--m-؂-ςm---}-t-f-Y6-HA----сm-l-8--Հ<-ˀĀ--.--}-X-//-`-~@-~-~B-~=y~=f~-N~%- ~=-~-}}-}-}}-}}-}{}$-N}?-I}-=}@- }-|B-|=|=|-|=-|-|j-_|-5|-|-{-{-{-{-{-{-u{-A{?-<{-0{@-z-zB-z=zz=nz-Uz=-2z-z-y-y-y-y-y-y-ry-Uy>-1yA-y-x-x-x-x-ax-;x-(x>-x-w-w-Sw-4w-v/-v`-v@-v-AvB-5v=.v=v-v%-u=-u-uu-u-uubu-VuCu->u0u$-t-bt`-Qt@-3t-sB-s=s=s-s%-s=-gs-[sHs-+s-s s-sr-rr$-r-yr-jr.-Pr-Ar-r/-q-q`-q@-fq-qB-q= q=p-p%-p=-p-p{p-^p-Rp?p-3p p-p p$-o -ao-No,-o-ni-n-n-n@-n-knB-_n=Xn=Ln-6n=-n-m-m-m-m-m-m-|m -0m- m-l-Yl-*l-!lf-l-lh-k-kg-kf-ke-kd-nk -Xkc-!k-k-j-j-j-j-j-ja-j`j-{j-dj-Oj-Cj0j-j-i--i-ii-ii-i--li-`iMi-1i-'i-h(-h-hh-h-hh-Oh-Ch0h-h- hg-g(-g-g-g6-gg-hg_-%g^-g]-f\-f-fZ-}f-of@-Wf-2fB-)f="f=f-f6-ee=-e)-eY-ae-Ae-e-d-d-d-d-{dW-kd-_d-Md@-5d-dB-d=d=c-c6-cc=-c(-ecV-Dc-*c-c-c-b:-b-b-b-b-b-yb-Nb;-b`- b@-a-aB-a=a=}a-ea%-7a=-a-aa-`-``-``-``$-b`-J`--9``-(`@- `-_B-_=_=t_-\_%-._=-_- _^-^-^^-^^-^^$-Y^-A^--0^- ^- ^`-]@-]-]B-]=]=n]-V]%-(]=-]-]\-\-\\-\\-\\$-i\-a\--Y\-K\`-:\@-\-[B-[=[=[-[%-h[=-P[-D[1[-[-[Z-ZZ-ZZ$-Z`-Z@-jZ-"ZB-Z=Z=Y-Y%-Y=-Y-YY-bY-VYCY-7Y$Y-YY$-X'-X-X--X-X'-zX-qX-hX-?X-6X-(X-X-W-W-W-bW--YW-3W(-VS-VR-V-iV -WV"-V-V--V-U-U--U-U-U--U-U-U--U-fU-^U--VU-=U'-U6-TT-T-QT -S-S-S-S-S-S-S-S-S-S-|S-sS-gS-QS-S-RmR-R--R&-RmR-]R-KR`-:R@-R-QB-Q=Q=Q-Q%-zQ=-bQ-VQCQ-&Q-QQ-PP-PP$-xP--eP-FP-4P-P- P-O-O`-O@-O-cOB-WO=PO==O-%O%-N=-N-NN-N-NN-xNeN-`NMN$-N- N-M-M-M-M-sM--`M"-L-hL-K`-K@-K-`KB-TK=MK=:K-"K%-J=-J-JJ-J-JJ-uJbJ-]JJJ$-I`-I@-I-oIB-cI=\I=II-1I%-I=-H-HH-H-HH-HqH-lHYH$-H,-G,-G-G-G--nG-AG-)G--G-F-F--F-F-oF--WF-*F-F--E-E'-E-E-E-XE-EE-E-E-D)-D-D-D-D-eD-,->`->@-g>-1>->B- >=>==-=%-==-=-=t=-W=-K=8=-,==-==$-<-<-<-p<-Y<`-H<@-*<-;B-;=;=;-;%-;=-p;-d;Q;-4;-(;;- ;:-::$-:--}:-l:-E:-:-:--9-9'-9-9-n9-V9---9,-9`- 9@-8-8B-8=8=8-y8%-K8=-38-'88-7-77-77-77$-b7-H7-77-7-6-.6-6-- 6-5-5-5-5-5-5-o5-Z5-H5-:5-15-(5-52-4-4-4-|4-s4-W4-E4-=4-&4$-4-3M-3O-3M-36-r3M-a3N-:3M-)39-2L-2-2J-2-2J-I2r-$2-2K-1-1J-1-1J-Y1-'1-1J-0-0-0-|0-]0j->0-&0*- 0-/*-/-/*-/@-/-/-_/B-S/=L/=9/-$/- /-.-.*-.=-.-.-.*-4.-(.-.----j----+-{--a-+-X--I-+-;-@-----,B-,=,=,-,-{,-_,-G,+-#,=- ,-+-++-+?-+>-+y-+=+<-x+;-$+-+-*-*-*g-*-*0-k*-Q*0-H*-9*0-+*@- *-*-)B-)=)=)-)-k)-O)-7)0-)=-(-(-(0-(-(-d(-L(--(j-(-'1-'-'1-'-'1-'@-}'-t'-/'B-#'='= '-&-&-&-&1-&=-j&-[&-S&1-)&- &- &-%-%-%j-%-%-}%-o%#-^%6-K%-%-$B-$A-$@-$B-{$A-g$@-,$B-$D-$C-#B-#A-#@-l#B-[#A-G#@-#B-#A-"@-"-h"-N"-"?-!>-!-!=!<-!;-!-c!-I!@-+!-!- B- = = - - -K =-2 - - ----i9-I-@-)---j----#-~6-k-(-----@--}-]B-Q=J=>-(=---6----r-j-K-:-#-/-5-#-z/-m#-`/-1#--4-4-3-2-k-_--&-`-@--SB-G=@=--%-=----t-hU-PB$-'#--&-`-@--CB-7=0=-%-=----wd-XE-@2$-#-/-%-a-=-\3-(c-F--%--=--W=K,-8= =+-*-)-(-y-d&-J`-9@--B-==-%-g=-O-C0----$-#-k"-+"--"-{-!--K- -----k-.:-%-- &- >- - - - - -n -e h-U h-E h-5 e-% h- h- - - - - - - - -d h-T h-D h-4 e-$ h- h- - - - - - - - -m -[ -C  - - - -r -S -4 - - - - - - - -| -; -/ - ---h-h-h-e-h-h-----v-m-a-U-I:----;--m-O-.-------}-i-U-A-*-f-i---i-`:-H-6-;-- - -}-:--- --e-J;-1 -----$--a-G->h-5h-,h-#e-h-h----------y-[-=--------l-X-D-0-tMpM0( xph`XPH@80( PH-@80 -*.WXYVxpZh[`P)H@.8607(((45'  '89)h2`3X)@80)x_p`hPH-@,80.( -@j jjiiiCiii`iXiPiC@i iihhhh`h@h hhgggCggg`gXgPgC@g ggfffCfff`f@f ffeeee`e@e eedddd`d@d ddcccCccc`c@c ccbbbbxbpbC`b@b bbaaaa`aXaPaC@a aa```C`````@` ``____`_@_ __^^^^`^@^ ^^]]]C]]]`]X]P]C@] ]]\\C\\\\`\@\ \\[[[[`[@[ [[ZZZZCZZ`Z@Z ZZYYCYYYY`Y@Y YYYCYXXXX`X@X XXXCXWWWW`WXWPWC@W WWVVVVxVpVC`V@V VVUUUU`U@U UUTTTT`T@T TTTCTSSCSSSS`S@S SSRRRR`R@R RRQQCQQQQCQQQCQ`Q@Q QQPPPP`P@P PPOOOO`OXOPOC@O OONNNN`N@N NNMMMMCMM`M@M MMMCMLLLLLCL`L@L LLKKKK`K@K KKJJJJ`J@J JJIIII`I@I IIHHHH`H@H HHGGGCGGGxGpGC`G@G GGFFFF`F@F FFFCFEEEECEE`E@E EEDDDCDDD`D@D DDCCCC`C@C8C0CC CCBBBB`B@B BBAAAA`A@A AA@@@@x@p@C`@@@ @@????`?X?P?C@?8?0?C ??>>>>`>@> >>====`=@= ==<<C<<<<`<@< <<;;;;C;;`;@; ;;:::::C:`:@: ::9999`9@98909C 998888`8@8 8877777C7x7p7C`7@78707C 77666C666C666C6`6@6 6655555C5`5@5 554444`4@4 443333`3@3 332222`2@2 221111`1@1 110000`0X0P0C@0 00////`/@/ //....`.@. ..----`-@- ---C-,,,,`,X,P,C@, ,,++++`+X+P+C@+ ++****`*@* **))))`)@) ))(((((C(`(@( ((''C''''x'p'C`'@' ''&&&&`&@& &&%%%%`%@% %%$$$$`$@$8$0$C $$####`#@# ##""""x"p"C`"@" ""!!!!`!@! !!    x p C` @    C `@ `@ `@ `@ `@ C`@ `@ C`@ C`@ `@ C`@ C`@ C`@ C`@ `@ C`@ C`@ C`@   C    ` @    C    C   C  ` @       ` X P C@    C     ` @       ` @ 8 0 C  CC`XPC@80C `@ CxpC`@80C `XPC@80C xpC`@80C `@ `XPC@80C C`@ CxpC`@ CCMSH<5Pȓp`s&9R_@NllfRq@4&ORzۋR  _@&` <`* 3  S`3`զи '<S[  L̬(@H(?,S!GМKpKg0TSolSSD @ >$@PʍSySXPTYT!@D1jj`O3EhP3m2!3h3w(TuDTMpT>T݊T@1x02Rq%esgpTUwN`xD(یVV;(C(ɊtWKD3C4njW4t2P, >?- Y`'Wй $+)LL0O@IpىWN3RYK4 ݍ Y}PcU=njЇ#')_p@*0YwߘP@Y\ Љ#  Oj@`ϛcPYVXai0Ќ%`Y6`<@ J$kpYYg),)C0yRPp+)sد)/p>Y 0-#pQ.N-0`) %=@*pmWY@^@mPA`Ym ?0P=u+R2`Э +AVS@P @OY t^ 4pr0E+PHШ #Ky#Y@"tPj? "Ыo3 T`{5f-pFTY6Y(Яs`?WT 0Pp~y~W 0UOpJ#в Ep=!Y0U`Ĉ Z=pLдe0eZ>Pprt@,ZOq0$зpXD~= }p!A<h;>A@Hdtc M0[ @5pV0azP:@9`eAb@aL<ć[U`!00#)@[;T[` pSL*G Hp=+eS0h[?fp$p֞@)4`dT 6-S <#npPx[_CK+} g@R[ YgBof+(0BPi[E0p,[LfȫUGpe[GW0u`Q[", PlVN \6,0$0J`y,lʣp0ǥΧ0TG&&0P\'&Ip) \ U Q =V =C \R  P P 9)i  0` 0\yB 2 .@ j ~ }  D\z% M0 V@ G  k" !   `~pxT\d\Z|\ea[|6[@`!{ 6Q\x\f"#\$&)){)*\k**̀*P+\+R++&,\0-H-r-~.\0...(~./@/.L///?0&0\/0o@2#`2 2kp1%1@1ʼn]`1c]11c2U2=262r2}33]@44$]45R766NP7>4].7Pp;0<Z<]>P:@:8m0:e@p:^;P;R::0;=0=m  =2===H]>>>f0>9X]E >o=?B?7@R`@PAAUA8AȨ@Bh];pAs,BPH{HPI=FI.lD&D|]'D]EID E4BFglpF@FAFPG]GrGUGX GGj@J0JJNj]sK >K@K]Kf]M(M 5NISN/7PNc.N8C`OO>0 P-PP `QI&Q]- Q]QX@dRpu0ZXCj(@TIp1HY\H % op1G\D0e=F@ Ѓi`.N#ҷd@y/o20i+so`2@EDP q@5, Hpj0&+E$ȕU2nvnWu4ri vDX<>vk:llknlUkFwFIk?۔ډh|ؘsO^z7И_memcpy__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_rethrow___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIiE8allocateEmPKv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE8allocateEmPKv__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE8allocateEmPKv__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE8allocateEmPKv__ZNKSt3__16vectorIiNS_9allocatorIiEEE5emptyEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5emptyEv__ZNK3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE5emptyEv__ZNK3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE5emptyEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE8capacityEv__ZNKSt3__113__vector_baseIiNS_9allocatorIiEEE8capacityEv__ZNKSt3__114__split_bufferIiRNS_9allocatorIiEEE8capacityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE8capacityEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZN3mup11ParserError10GetContextEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEE5firstEv__ZNKSt3__117__compressed_pairIPiNS_9allocatorIiEEE5firstEv__ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEE5firstEv__ZNKSt3__117__compressed_pairIPiRNS_9allocatorIiEEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEE5firstEv__ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE5firstEv__ZNKSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE5firstEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEE5firstEv__ZNKSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEE5firstEv__ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE5firstEv__ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEEE5firstEv__ZNK3mup11ParserXBase8GetConstEv__ZN3mup11ParserXBase10ClearConstEv__ZN3mup11ParserXBase16ClearPostfixOprtEv__ZN3mup11ParserXBase14ClearInfixOprtEv__ZN3mup11ParserXBase9ClearOprtEv__ZNKSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEptEv__ZNK3mup8TokenPtrINS_12IOprtPostfixEEptEv__ZNK3mup8TokenPtrINS_10IOprtInfixEEptEv__ZNK3mup8TokenPtrINS_8IOprtBinEEptEv__ZNK3mup8TokenPtrINS_6ITokenEEptEv__ZNK3mup8TokenPtrINS_9ICallbackEEptEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEEptEv__ZNKSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEptEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE6__rootEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE6__rootEv__ZNK3mup9ICallback14GetArgsPresentEv__ZNK3mup6IToken8GetIdentEv__ZN3mup11TokenReader6ReInitEv__ZNK3mup11ParserXBase6ReInitEv__ZNK3mup15TokenIfThenElse9GetOffsetEv__ZN3mup3RPN5ResetEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIiEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIiEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup11TokenReaderEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIiEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemImLi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPiLi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPiLi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup11TokenReaderELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup11TokenReaderELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6IValueEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6IValueEEELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE3getEv__ZNSt3__112__tuple_leafILm0ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELb0EE3getEv__ZNK3mup8TokenPtrINS_6ITokenEE3GetEv__ZNSt3__16vectorIiNS_9allocatorIiEEE26__invalidate_all_iteratorsEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE26__invalidate_all_iteratorsEv__ZNK3mup11ParserXBase19ValidInfixOprtCharsEv__ZNK3mup11ParserXBase14ValidOprtCharsEv__ZNK3mup11ParserXBase14ValidNameCharsEv__ZNK3mup11TokenReader6GetPosEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__root_ptrEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10__root_ptrEv__ZNK3mup11TokenReader7GetExprEv__ZNK3mup11ParserXBase7GetExprEv__ZN3mup11ParserXBase9ClearExprEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE11get_deleterEv__ZN3mup11ParserXBase15InitTokenReaderEv__ZNSt3__16vectorIiNS_9allocatorIiEEE5clearEv__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE5clearEv__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE5clearEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5clearEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5clearEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE5clearEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5clearEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE5clearEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE5clearEv__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE5clearEv__ZNK3mup11ParserXBase6GetVarEv__ZNK3mup11ParserXBase10GetExprVarEv__ZN3mup11ParserXBase8ClearVarEv__ZNK3mup11TokenReader10GetUsedVarEv__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEppEv__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEppEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3topEv__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE3topEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3popEv__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE3popEv__ZNKSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElE8__get_npEv__ZNKSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElE8__get_npEv__ZNK3mup3RPN9AsciiDumpEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10value_compEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10value_compEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10value_compEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10value_compEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE9__end_capEv__ZNKSt3__113__vector_baseIiNS_9allocatorIiEEE9__end_capEv__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE9__end_capEv__ZNKSt3__114__split_bufferIiRNS_9allocatorIiEEE9__end_capEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE9__end_capEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9__end_capEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZN3mup11ParserXBase8ClearFunEv__ZN3mup11ParserXBase10GetVersionEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5beginEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE5beginEv__ZN3mup11TokenReader13ReadNextTokenEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup10ValueCache10ReleaseAllEv__ZNK3mup11ParserXBase4EvalEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__clear_and_shrinkEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNSt3__16vectorIiNS_9allocatorIiEEE8pop_backEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8pop_backEv__ZNSt3__16vectorIiNS_9allocatorIiEEE4backEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4backEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNKSt3__18ios_base5widthEv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE8__detachEv__ZNK3mup11ParserError6GetMsgEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup11ParserXBase15ParseFromStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEE5__refEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZNK3mup11ParserXBase10GetOprtDefEv__ZNK3mup11ParserXBase9GetFunDefEv__ZNKSt3__19allocatorIiE8max_sizeEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE8max_sizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE8max_sizeEv__ZNKSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE4sizeEv__ZNKSt3__117basic_string_viewIcNS_11char_traitsIcEEE4sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4sizeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE4sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE4sizeEv__ZNK3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE4sizeEv__ZN3mup3RPN8FinalizeEv__ZNK3mup3RPN7GetSizeEv__ZNK3mup3RPN20GetRequiredStackSizeEv__ZNSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEE11__get_valueEv__ZNKSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEE11__get_valueEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE17__annotate_deleteEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__annotate_deleteEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE13__vdeallocateEv__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE7releaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNSt3__16vectorIiNS_9allocatorIiEEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotator6__doneEv__ZN3mup7consoleEv__ZN3mup10ValueCache15CreateFromCacheEv__ZNKSt3__116__tree_node_baseIPvE15__parent_unsafeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNK3mup11ParserError7GetCodeEv__ZNK3mup6IToken7GetCodeEv__ZNKSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEdeEv__ZNKSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEdeEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEE6secondEv__ZNKSt3__117__compressed_pairIPiNS_9allocatorIiEEE6secondEv__ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEE6secondEv__ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE6secondEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEE6secondEv__ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE6secondEv__ZNKSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE6secondEv__ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEEE6secondEv__ZNKSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEEE6secondEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE3endEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE3endEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE3endEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE3endEv__ZNKSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE3endEv__ZNKSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE3endEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNK3mup11ParserXBase22IsAutoCreateVarEnabledEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__node_allocEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE12__node_allocEv__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE7__allocEv__ZNKSt3__113__vector_baseIiNS_9allocatorIiEEE7__allocEv__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE7__allocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE7__allocEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE7__allocEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNK3mup9ICallback7GetArgcEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE4dataEv__ZNKSt3__117basic_string_viewIcNS_11char_traitsIcEEE4dataEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4dataEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE4dataEv__ZNK3mup3RPN7GetDataEv__ZNK3mup11ParserXBase7DumpRPNEv__ZNK3mup11ParserXBase12ParseFromRPNEv__ZNK3mup11ParserXBase9CreateRPNEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEEC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEEC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEEC1ILb1EvEEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEEC1ILb1EvEEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEcvNS_17basic_string_viewIcS2_EEEv__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup11ParserXBaseD2Ev__ZN5utils13scoped_setterIbED2Ev__ZN3mup8TokenPtrINS_6ITokenEED2Ev__ZN3mup8TokenPtrINS_6IValueEED2Ev__ZNSt3__16vectorIiNS_9allocatorIiEEED2Ev__ZNSt3__113__vector_baseIiNS_9allocatorIiEEED2Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEED2Ev__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEED2Ev__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED2Ev__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEED2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEED2Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEED2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup11ParserXBaseC2Ev__ZNSt3__19allocatorIiEC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__15tupleIJEEC2Ev__ZNSt3__115__tree_end_nodeIPNS_16__tree_node_baseIPvEEEC2Ev__ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEEC2Ev__ZNSt3__16vectorIiNS_9allocatorIiEEEC2Ev__ZNSt3__113__vector_baseIiNS_9allocatorIiEEEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEEC2Ev__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEEC2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEC2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEEC2Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIiEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__122__compressed_pair_elemINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11TokenReaderD1Ev__ZN3mup5ValueD1Ev__ZN3mup11ParserXBaseD1Ev__ZNSt3__16localeD1Ev__ZN3mup10ValueCacheD1Ev__ZN3mup3RPND1Ev__ZN5utils13scoped_setterIbED1Ev__ZN3mup8TokenPtrINS_6ITokenEED1Ev__ZN3mup8TokenPtrINS_6IValueEED1Ev__ZNSt3__16vectorIiNS_9allocatorIiEEED1Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED1Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEED1Ev__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEED1Ev__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED1Ev__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEED1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEED1Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEED1Ev__ZN3mup11ParserXBaseC1Ev__ZN3mup3RPNC1Ev__ZNSt3__15tupleIJEEC1Ev__ZNSt3__115__tree_end_nodeIPNS_16__tree_node_baseIPvEEEC1Ev__ZNSt3__16vectorIiNS_9allocatorIiEEEC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEC1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEC1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEEC1Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC1Ev__ZN3mup11ParserXBaseD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED0Ev__ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error__ZTISt13runtime_error_memchr_memcmp___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__116allocator_traitsINS_9allocatorIiEEE10deallocateERS2_Pim__ZNSt3__19allocatorIiE10deallocateEPim__ZNSt3__116allocator_traitsINS_9allocatorIcEEE10deallocateERS2_Pcm__ZNSt3__19allocatorIcE10deallocateEPcm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__117basic_string_viewIcNS_11char_traitsIcEEEC2EPKcm__ZNSt3__117basic_string_viewIcNS_11char_traitsIcEEEC1EPKcm__ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE8allocateERSG_m__ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE10deallocateERSG_PSF_m__ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE10deallocateEPSE_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE18__construct_at_endIPS4_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE18__construct_at_endIPS4_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC2ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC2ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC1ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC1ERKS7_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE8allocateERS6_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE8allocateERS6_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE10deallocateERS6_PS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE10deallocateERS6_PS5_m__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE17find_first_not_ofERKS5_m__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE10deallocateEPS4_m__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE10deallocateEPS4_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__16vectorIiNS_9allocatorIiEEE24__RAII_IncreaseAnnotatorC2ERKS3_m__ZNSt3__16vectorIiNS_9allocatorIiEEE24__RAII_IncreaseAnnotatorC1ERKS3_m__ZNSt3__116allocator_traitsINS_9allocatorIiEEE8allocateERS2_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEixEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEixEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEixEm__ZNKSt3__16vectorIiNS_9allocatorIiEEE14__annotate_newEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE14__annotate_newEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE14__annotate_newEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__1L21__convert_to_integralEm__ZNKSt3__16vectorIiNS_9allocatorIiEEE17__annotate_shrinkEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__annotate_shrinkEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE17__annotate_shrinkEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__vallocateEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE11__vallocateEm__ZNKSt3__16vectorIiNS_9allocatorIiEEE11__recommendEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__recommendEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__19allocatorIiE7destroyEPi__ZNSt3__16vectorIiNS_9allocatorIiEEE27__invalidate_iterators_pastEPi__ZNSt3__16vectorIiNS_9allocatorIiEEE17__destruct_at_endEPi__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE17__destruct_at_endEPi__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE17__destruct_at_endEPi__ZNSt3__16vectorIiNS_9allocatorIiEEE9push_backERKi__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE4pushERKi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZN3mup9ICallback17SetNumArgsPresentEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZN3mup3RPN10AddNewlineENS_8TokenPtrINS_6ITokenEEEi__ZNK3mup11ParserXBase9ApplyFuncERNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEEi__ZN3mup10ValueCacheC1Ei___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZN3mup11ParserXBase20DefineInfixOprtCharsEPKc__ZN3mup11ParserXBase15DefineOprtCharsEPKc__ZN3mup11ParserXBase15DefineNameCharsEPKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZN3mup5ValueC1Ec__ZN5utils13scoped_setterIbEC2ERbb__ZN5utils13scoped_setterIbEC1ERbb__ZN3mup11ParserXBase15EnableDebugDumpEbb__ZNSt3__122__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEEC2ERSG_b__ZNSt3__122__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEEC1ERSG_b__ZN3mup11ParserXBase15EnableOptimizerEb__ZN3mup3RPN15EnableOptimizerEb__ZN3mup11ParserXBase19EnableAutoCreateVarEb__ZNSt3__119__tree_right_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__118__tree_left_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__1L20__tree_is_left_childIPNS_16__tree_node_baseIPvEEEEbT___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE7destroyINS_4pairIKS8_SC_EEEEvRSG_PT___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE9__destroyINS_4pairIKS8_SC_EEEEvNS_17integral_constantIbLb0EEERSG_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE7destroyIS5_EEvRS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE7destroyIS5_EEvRS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9__destroyIS5_EEvNS_17integral_constantIbLb1EEERS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE9__destroyIS5_EEvNS_17integral_constantIbLb1EEERS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIiEEE7destroyIiEEvRS2_PT___ZNSt3__116allocator_traitsINS_9allocatorIiEEE9__destroyIiEEvNS_17integral_constantIbLb1EEERS2_PT___ZNSt3__16vectorIiNS_9allocatorIiEEE21__push_back_slow_pathIRKiEEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE15__emplace_multiIJRKNS_4pairIKS7_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE15__emplace_multiIJRKNS_4pairIKS7_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSP_IJEEEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISX_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISV_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_4pairIKS7_SB_EEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISU_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_4pairIKS7_SB_EEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISS_EEEEEEDpOT___ZNSt3__14pairIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERN3mup8TokenPtrINS8_6ITokenEEEEaSIRKNS0_IKS6_SB_EELb0EEERSD_OT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemIPiLi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6IValueEEELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemImLi0ELb0EEC2IivEEOT___ZNSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEELi1ELb1EEC2IRKSI_vEEOT___ZNSt3__122__compressed_pair_elemINS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEELi1ELb0EEC2ISI_vEEOT___ZNSt3__122__compressed_pair_elemIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEELi0ELb0EEC2IRSG_vEEOT___ZNSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEELi1ELb1EEC2IRKSG_vEEOT___ZNSt3__112__tuple_leafILm0ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELb0EEC2IS8_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb0EEC2IS7_vEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EEC2IS6_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIiEELi1ELb0EEC2IS3_vEEOT___ZNSt3__122__compressed_pair_elemIPN3mup11TokenReaderELi0ELb0EEC2IS3_vEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__insert_multiIRKNS_4pairIKS7_SB_EEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE14__insert_multiIRKNS_4pairIKS7_SB_EEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEOT___ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEEC2IS3_Lb1EEEOT___ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEEC1IS3_Lb1EEEOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__erase_uniqueIS7_EEmRKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE14__erase_uniqueIS7_EEmRKT___ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISP_EERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISN_EERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE14__assign_multiINS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEEEEvT_SS___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__assign_multiINS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEEEEvT_SQ___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSP_SP___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSN_SN___ZNSt3__1L4moveIRNS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEEEEONS_16remove_referenceIT_E4typeEOSL___ZNSt3__1neERKNS_20__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEESL___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE19__copy_assign_allocERKSK___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEEaSERKSK___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEEaSERKSJ___ZNSt3__1eqERKNS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__1neERKNS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__1eqERKNS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__1neERKNS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__copy_assign_allocERKSI___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEaSERKSI___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEEC2ERKSI___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEEC1ERKSI___ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC2ESI___ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC1ESI___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEaSERKSH___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEEixERSG___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE5eraseERSG___ZNKSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE4findERSG___ZNSt3__1L3getILm1EKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEERKNS_13tuple_elementIXT_ENS_4pairIT0_T1_EEE4typeERKSG___ZNSt3__1L3getILm0EKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEERKNS_13tuple_elementIXT_ENS_4pairIT0_T1_EEE4typeERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC2ERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC1ERKSG___ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2ESG___ZNSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEEN2su4pred12SortByLengthIS6_EELb1EEC2ESG___ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1ESG___ZNSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEEN2su4pred12SortByLengthIS6_EELb1EEC1ESG___ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE5resetEPSF___ZNSt3__122__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEEclEPSF___ZNSt3__1L9addressofINS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEEEPT_RSE___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEixERSE___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE5eraseERSE___ZNKSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE4findERSE___ZNSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEC2ESE___ZNSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEC1ESE___ZNSt3__1L9addressofINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEEEPT_RSD___ZNSt3__1L3getILm0EJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEERNS_13tuple_elementIXT_ENS_5tupleIJDpT0_EEEE4typeERSD___ZNSt3__14pairIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERN3mup8TokenPtrINS8_6ITokenEEEEC2ILb1ELb0EEES7_SC___ZNSt3__14pairIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERN3mup8TokenPtrINS8_6ITokenEEEEC1ILb1ELb0EEES7_SC___ZNSt3__122__tree_key_value_typesINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE9__get_ptrERSC___ZNSt3__114pointer_traitsIPNS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE10pointer_toERSC___ZNKSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEclERKS6_RKSC___ZNKSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEEN2su4pred12SortByLengthIS6_EELb1EEclERKS6_RKSC___ZNSt3__122__tree_key_value_typesINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE9__get_keyERKSC___ZNSt3__122__tree_key_value_typesINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE11__get_valueERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC2ERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1ERKSC___ZNSt3__1L16forward_as_tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEENS_5tupleIJDpOT_EEESC___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB___ZNK2su4pred12SortByLengthINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEclERKS8_SB___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE20__construct_backwardIPS5_EEvRS6_T_SB_RSB___ZNSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEEaSERKSB___ZNSt3__1ltIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__1L4swapIPN3mup8TokenPtrINS1_6ITokenEEEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS7_EE5valueEvE4typeERS7_SA___ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareINS_17basic_string_viewIcS2_EEEENS_9enable_ifIXsr33__can_be_converted_to_string_viewIcS2_T_EE5valueEiE4typeERKSA___ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE31__annotate_contiguous_containerEPKvS9_S9_S9___ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE31__annotate_contiguous_containerEPKvS9_S9_S9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNKSt3__14lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEclERKS6_S9___ZNSt3__116allocator_traitsINS_9allocatorIiEEE20__construct_backwardIiEENS_9enable_ifIXaaooL_ZNS_17integral_constantIbLb1EE5valueEEntsr15__has_constructIS2_PT_S8_EE5valuesr31is_trivially_move_constructibleIS8_EE5valueEvE4typeERS2_S9_S9_RS9___ZNSt3__1L4moveIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEEEONS_16remove_referenceIT_E4typeEOS9___ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC2ERKS9___ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEC1ERKS9___ZNK3mup11ParserXBase9CheckNameERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES9___ZNSt3__1L4moveIRPN3mup8TokenPtrINS1_6ITokenEEEEEONS_16remove_referenceIT_E4typeEOS8___ZNSt3__15tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC2ILb1ELb0EEES8___ZNSt3__15tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC1ILb1ELb0EEES8___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__1L8distanceIPN3mup8TokenPtrINS1_6IValueEEEEENS_15iterator_traitsIT_E15difference_typeES7_S7___ZNSt3__1L9addressofINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEEEEPT_RS7___ZNSt3__1L4moveIRN3mup8TokenPtrINS1_6ITokenEEEEEONS_16remove_referenceIT_E4typeEOS7___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE19__copy_assign_allocERKS7___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEEaSERKS7___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__find_leaf_highERPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERKS7___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE16__find_leaf_highERPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERKS7___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2ERKS7___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1ERKS7___ZNSt3__1L4endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7___ZNSt3__1L16__to_raw_pointerIN3mup8TokenPtrINS1_6ITokenEEEEEPT_S6___ZNSt3__1L16__to_raw_pointerIN3mup8TokenPtrINS1_6IValueEEEEEPT_S6___ZNSt3__1L13__unwrap_iterIPN3mup8TokenPtrINS1_6IValueEEEEET_S6___ZNSt3__1L6__copyIPN3mup8TokenPtrINS1_6IValueEEES5_EET0_T_S7_S6___ZNSt3__1L4copyIPN3mup8TokenPtrINS1_6IValueEEES5_EET0_T_S7_S6___ZNSt3__1L4swapIPiEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS3_EE5valueEvE4typeERS3_S6___ZNSt3__114pointer_traitsIPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEEE10pointer_toERS6___ZNSt3__1L16move_if_noexceptIN3mup8TokenPtrINS1_6ITokenEEEEENS_11conditionalIXaantsr29is_nothrow_move_constructibleIT_EE5valuesr21is_copy_constructibleIS6_EE5valueERKS6_OS6_E4typeERS6___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2EOS6___ZNKSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEclERKSC_RKS6___ZNKSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEEN2su4pred12SortByLengthIS6_EELb1EEclERKSC_RKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE37select_on_container_copy_constructionERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE8max_sizeERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE8max_sizeERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE39__select_on_container_copy_constructionENS_17integral_constantIbLb0EEERKS6___ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5___ZNSt3__113__tree_removeIPNS_16__tree_node_baseIPvEEEEvT_S5___ZNSt3__111__tree_nextIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__1L10__tree_minIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__111__tree_leafIPNS_16__tree_node_baseIPvEEEET_S5___ZNKSt3__16vectorIiNS_9allocatorIiEEE31__annotate_contiguous_containerEPKvS5_S5_S5___ZNSt3__1L9addressofIPNS_16__tree_node_baseIPvEEEEPT_RS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5___ZNSt3__1L4moveIRNS_9allocatorIcEEEEONS_16remove_referenceIT_E4typeEOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEOS5___ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE7destroyEPS4___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE7destroyEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE27__invalidate_iterators_pastEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE27__invalidate_iterators_pastEPS4___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__1L4moveIRPiEEONS_16remove_referenceIT_E4typeEOS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6assignEmRKS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE18__construct_at_endEmRKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9push_backERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16forward_as_tupleIJEEENS_5tupleIJDpOT_EEES4___ZNSt3__112__tuple_implINS_15__tuple_indicesIJLm0EEEEJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC2IJLm0EEJSA_EJEJEJSA_EEENS1_IJXspT_EEEENS_13__tuple_typesIJDpT0_EEENS1_IJXspT1_EEEENSE_IJDpT2_EEEDpOT3___ZNSt3__112__tuple_implINS_15__tuple_indicesIJLm0EEEEJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC1IJLm0EEJSA_EJEJEJSA_EEENS1_IJXspT_EEEENS_13__tuple_typesIJDpT0_EEENS1_IJXspT1_EEEENSE_IJDpT2_EEEDpOT3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC2EmmS3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC1EmmS3___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L23__str_find_first_not_ofIcmNS_11char_traitsIcEELm18446744073709551615EEET0_PKT_S3_S6_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEE4pushERKS3___ZNSt3__1L16__to_raw_pointerIiEEPT_S2___ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116__tree_node_baseIPvE12__set_parentEPS2___ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup11TokenReaderEEclEPS2___ZNSt3__116allocator_traitsINS_9allocatorIiEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZN3mup8TokenPtrINS_6ITokenEEaSERKS2___ZN3mup8TokenPtrINS_6IValueEEaSERKS2___ZNSt3__116allocator_traitsINS_9allocatorIiEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mup8TokenPtrINS_6ITokenEEC2ERKS2___ZN3mup8TokenPtrINS_6IValueEEC2ERKS2___ZN3mup8TokenPtrINS_6ITokenEEC1ERKS2___ZN3mup8TokenPtrINS_6IValueEEC1ERKS2___ZNSt3__1L8__fill_nIPN3mup8TokenPtrINS1_6IValueEEEmS4_EET_S6_T0_RKT1___ZNSt3__1L6fill_nIPN3mup8TokenPtrINS1_6IValueEEEmS4_EET_S6_T0_RKT1___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZN3mup8TokenPtrINS_6IValueEE5ResetEPS1___ZN3mup8TokenPtrINS_6ITokenEEC2EPS1___ZN3mup8TokenPtrINS_6IValueEEC2EPS1___ZN3mup8TokenPtrINS_6ITokenEEC1EPS1___ZN3mup8TokenPtrINS_6IValueEEC1EPS1___ZNSt3__1L16__tree_next_iterIPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEES5_EET_T0___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE25__construct_range_forwardIPS5_S9_EEvRS6_T_SB_RT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE25__construct_range_forwardIPS5_S9_EEvRS6_T_SB_RT0___ZNSt3__19allocatorIiE9constructIiJRKiEEEvPT_DpOT0___ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE9constructINS_4pairIKS7_SB_EEJRKSJ_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE9constructIS4_JRS4_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE9constructIS4_JRS4_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE9constructIS4_JRKS4_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE9constructIS4_JRKS4_EEEvPT_DpOT0___ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE9constructINS_4pairIKS7_SB_EEJRKNS_21piecewise_construct_tENS_5tupleIJRSI_EEENSN_IJEEEEEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE9constructINS_4pairIKS8_SC_EEJRKSL_EEEvRSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE9constructINS_4pairIKS8_SC_EEJRKNS_21piecewise_construct_tENS_5tupleIJRSK_EEENSP_IJEEEEEEvRSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE11__constructINS_4pairIKS8_SC_EEJRKSL_EEEvNS_17integral_constantIbLb1EEERSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE11__constructINS_4pairIKS8_SC_EEJRKNS_21piecewise_construct_tENS_5tupleIJRSK_EEENSP_IJEEEEEEvNS_17integral_constantIbLb1EEERSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9constructIS5_JRS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE9constructIS5_JRS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE11__constructIS5_JRS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE11__constructIS5_JRS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE11__constructIS5_JRKS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE11__constructIS5_JRKS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIiEEE9constructIiJRKiEEEvRS2_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIiEEE11__constructIiJRKiEEEvNS_17integral_constantIbLb1EEERS2_PT_DpOT0___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSP_IJEEEEEENS_4pairINS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEERKT_DpOT0___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_4pairINS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEERKT_DpOT0___ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC2IRSG_SJ_EEOT_OT0___ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC1IRSG_SJ_EEOT_OT0___ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEEEC2IiRKSI_EEOT_OT0___ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEEEC1IiRKSI_EEOT_OT0___ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEEC2IiRKSG_EEOT_OT0___ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEEC1IiRKSG_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2IDnS7_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1IDnS7_EEOT_OT0___ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEEC2IDnS4_EEOT_OT0___ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEEC1IDnS4_EEOT_OT0___ZNSt3__14pairINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEbEC2ISI_RbLb0EEEOT_OT0___ZNSt3__14pairINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEbEC1ISI_RbLb0EEEOT_OT0___ZN3mup11ParserXBase6AssignERKS0___ZN3mup6IValueaSERKS0___ZN3mup11ParserXBaseaSERKS0___ZN3mup11ParserXBaseC2ERKS0___ZN3mup11ParserXBaseC1ERKS0___ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZNSt3__14coutE__ZN3mup11ParserXBase13c_DefaultOprtE__ZNSt3__1L19piecewise_constructE__ZN3mup11ParserXBase23CheckForEntityExistenceERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_11EErrorCodesE__ZTSN3mup11MatrixErrorE__ZTIN3mup11MatrixErrorE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZN3mup11TokenReader14AddValueReaderEPNS_12IValueReaderE__ZN3mup11ParserXBase14AddValueReaderEPNS_12IValueReaderE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZNK3mup11ParserXBase5ErrorENS_11EErrorCodesEiPKNS_6ITokenE__ZN3mup11ParserXBase12s_bDumpStackE__ZNSt3__1L10__distanceIPN3mup8TokenPtrINS1_6IValueEEEEENS_15iterator_traitsIT_E15difference_typeES7_S7_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L9__advanceIPN3mup8TokenPtrINS1_6IValueEEEEEvRT_NS_15iterator_traitsIS6_E15difference_typeENS_26random_access_iterator_tagE__ZN3mup11ParserXBase11DefineConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_5ValueE__ZTVNSt3__18ios_baseE__ZTVN3mup11ParserXBaseE__ZTSN3mup11ParserXBaseE__ZTIN3mup11ParserXBaseE__ZN3mup9ICallback9SetParentEPNS_11ParserXBaseE__ZNK3mup11TokenReader5CloneEPNS_11ParserXBaseE__ZN3mup11TokenReaderC1EPNS_11ParserXBaseE__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC2ILb1EvEEPSF_NS_16__dependent_typeINS_27__unique_ptr_deleter_sfinaeISI_EEXT_EE20__good_rval_ref_typeE__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC1ILb1EvEEPSF_NS_16__dependent_typeINS_27__unique_ptr_deleter_sfinaeISI_EEXT_EE20__good_rval_ref_typeE__ZNSt3__1L7advanceIPN3mup8TokenPtrINS1_6IValueEEEEEvRT_NS_15iterator_traitsIS6_E15difference_typeE__ZNSt3__1L7forwardIRKNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEEN2su4pred12SortByLengthIS7_EELb1EEEEEOT_RNS_16remove_referenceISL_E4typeE__ZNSt3__1L7forwardINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEEOT_RNS_16remove_referenceISJ_E4typeE__ZNSt3__1L7forwardINS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEEEEOT_RNS_16remove_referenceISJ_E4typeE__ZNSt3__1L7forwardIRKNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEEEOT_RNS_16remove_referenceISJ_E4typeE__ZNSt3__1L7forwardIRPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEOT_RNS_16remove_referenceISI_E4typeE__ZNSt3__1L7forwardIRKNS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEEEOT_RNS_16remove_referenceISG_E4typeE__ZNSt3__1L7forwardINS_5tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEEEOT_RNS_16remove_referenceISB_E4typeE__ZNSt3__1L7forwardIRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEOT_RNS_16remove_referenceIS9_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEEEOT_RNS_16remove_referenceIS8_E4typeE__ZNSt3__1L7forwardIRKN3mup8TokenPtrINS1_6ITokenEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRKN3mup8TokenPtrINS1_6IValueEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRN3mup8TokenPtrINS1_6ITokenEEEEEOT_RNS_16remove_referenceIS6_E4typeE__ZNSt3__1L7forwardIRN3mup8TokenPtrINS1_6IValueEEEEEOT_RNS_16remove_referenceIS6_E4typeE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRKNS_21piecewise_construct_tEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIPN3mup11TokenReaderEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIiEEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIRKiEEOT_RNS_16remove_referenceIS3_E4typeE__ZNSt3__1L7forwardINS_5tupleIJEEEEEOT_RNS_16remove_referenceIS3_E4typeE__ZNSt3__1L7forwardIRbEEOT_RNS_16remove_referenceIS2_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__1L7forwardIiEEOT_RNS_16remove_referenceIS1_E4typeE__ZN3mup11ParserXBase9DefineVarERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_8VariableE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup5Value11BindToCacheEPNS_10ValueCacheE__ZN3mup11ParserXBase10AddPackageEPNS_8IPackageE__ZN3mup10g_sCmdCodeE__ZN3mup15TokenIfThenElseC1ENS_8ECmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRS3_S4_E__ZN3mup11ParserXBase10s_bDumpRPNE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE21__remove_node_pointerEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE21__remove_node_pointerEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__node_insert_multiEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE19__node_insert_multiEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE8__detachEPNS_11__tree_nodeISC_PvEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2ENS_15__tree_iteratorISC_SG_lEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1ENS_15__tree_iteratorISC_SG_lEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5eraseENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE5eraseENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEE__ZNSt3__110__get_pairILm1EE3getIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEERKT0_RKNS_4pairIT_SE_EE__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__16vectorIiNS_9allocatorIiEEE26__swap_out_circular_bufferERNS_14__split_bufferIiRS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZNSt3__110__get_pairILm0EE3getIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEERKT_RKNS_4pairISE_T0_EE__ZN3mup11ParserXBase17DefinePostfixOprtERKNS_8TokenPtrINS_12IOprtPostfixEEE__ZN3mup11ParserXBase15DefineInfixOprtERKNS_8TokenPtrINS_10IOprtInfixEEE__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup3RPN3AddENS_8TokenPtrINS_6ITokenEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEE__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1IJRS7_EJEEENS_21piecewise_construct_tENS_5tupleIJDpT_EEENSG_IJDpT0_EEE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup11ParserXBase11RemoveConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase17RemovePostfixOprtERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase15RemoveInfixOprtERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase10RemoveOprtERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11TokenReader7SetExprERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase7SetExprERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase9RemoveVarERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserXBase9RemoveFunERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase14IsConstDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase20IsPostfixOprtDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase18IsInfixOprtDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase13IsOprtDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase12IsVarDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNK3mup11ParserXBase12IsFunDefinedERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SQ_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISO_EEEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SQ_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISO_EEEE__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SO_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISM_EEEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SO_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISM_EEEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC2IJRS7_EJEJLm0EEJEEENS_21piecewise_construct_tERNS_5tupleIJDpT_EEERNSG_IJDpT0_EEENS_15__tuple_indicesIJXspT1_EEEENSP_IJXspT2_EEEE__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1IJRS7_EJEJLm0EEJEEENS_21piecewise_construct_tERNS_5tupleIJDpT_EEERNSG_IJDpT0_EEENS_15__tuple_indicesIJXspT1_EEEENSP_IJXspT2_EEEE__ZTVN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTSN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTIN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZNK3mup11ParserXBase18ApplyRemainingOprtERNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEE__ZNK3mup11ParserXBase11ApplyIfElseERNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEE__ZNK3mup11ParserXBase9StackDumpERKNS_5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS4_NS5_9allocatorIS4_EEEEEE__ZTVN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEE__ZTSN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEE__ZTIN3mup5StackINS_8TokenPtrINS_6ITokenEEENSt3__16vectorIS3_NS4_9allocatorIS3_EEEEEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__move_assignERS5_NS_17integral_constantIbLb1EEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5_NS_17integral_constantIbLb1EEE__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE17__destruct_at_endEPiNS_17integral_constantIbLb0EEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE19__copy_assign_allocERKSK_NS_17integral_constantIbLb0EEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__copy_assign_allocERKSI_NS_17integral_constantIbLb0EEE__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE19__copy_assign_allocERKS7_NS_17integral_constantIbLb0EEE__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4_NS_17integral_constantIbLb0EEEGCC_except_table799GCC_except_table699GCC_except_table89GCC_except_table189GCC_except_table779GCC_except_table69GCC_except_table469GCC_except_table439GCC_except_table429GCC_except_table198GCC_except_table788GCC_except_table488GCC_except_table478GCC_except_table558GCC_except_table458GCC_except_table538GCC_except_table438GCC_except_table18GCC_except_table7GCC_except_table387GCC_except_table67GCC_except_table257GCC_except_table847GCC_except_table747GCC_except_table347GCC_except_table437GCC_except_table827GCC_except_table17GCC_except_table617GCC_except_table117GCC_except_table507GCC_except_table276GCC_except_table176GCC_except_table66GCC_except_table166GCC_except_table656GCC_except_table36GCC_except_table726GCC_except_table126GCC_except_table516GCC_except_table316GCC_except_table216GCC_except_table506GCC_except_table775GCC_except_table575GCC_except_table355GCC_except_table445GCC_except_table635GCC_except_table325GCC_except_table705GCC_except_table105GCC_except_table74GCC_except_table54GCC_except_table654GCC_except_table744GCC_except_table444GCC_except_table34GCC_except_table134GCC_except_table3GCC_except_table673GCC_except_table653GCC_except_table43GCC_except_table843GCC_except_table823GCC_except_table13GCC_except_table713GCC_except_table613GCC_except_table103GCC_except_table692GCC_except_table72GCC_except_table672GCC_except_table572GCC_except_table52GCC_except_table42GCC_except_table442GCC_except_table622GCC_except_table112GCC_except_table102GCC_except_table91GCC_except_table561GCC_except_table361GCC_except_table161GCC_except_table751GCC_except_table551GCC_except_table831___gxx_personality_v0GCC_except_table0GCC_except_table290GCC_except_table260GCC_except_table50GCC_except_table150GCC_except_table720GCC_except_table320 #1/36 1573634240 501 20 100644 46292 ` mpParserMessageProvider.cpp.o x[[__text__TEXT(^__gcc_except_tab__TEXT(,__const__DATA)x,@k __cstring__TEXT(* @-__const__TEXT4U7__compact_unwind__LDX4@p7k__eh_frame__TEXTE(Hp h2  p|8 Pzz#UHH1H HH}H}HHH]f.DUHHH}HuH}HuH]f.UHHHHH}H}HHH]UHHH}H}H]DUHH} fDUHH} fDUHH0H}H}HH}PE}4HEHHcuHHHUHH5(H}HH5HH}HEMH}EEhH0]H} fDUHH}HuHuH6Hk}HH]UHHH}H}H]DUHH0HHuUHuUUUHHH}HHEUHuDEA9%HEHHcuHH}H H}HEH0]f.fUHH}H}HWH?H)HHH]fUHH}HuHuH6Hk}HH]UHHH}H}H]DUHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHH4H}H}HHH}HHMHHHH5&3HMHHHEHH5&/HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&1҉HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5&HMHHHEHH5& HMHHHxHH5& HMHHHpHH5& HMHHHhHH5&HMHHH`HH5&HMHHHXHH5&HMHHHPHH5&&HMHHHHHH5&%HMHHH@HH5&"HMHHH8HH5&#HMHHH0HH5&HMHHH(HH5&HMHHH HH5& HMHHHHH5& HMHHHHH5'HMHHHHH5'HMHHHHH5B'HMHHHHH5}''HMHHHHH5'HMHHHHH5'HMHHHHH5u'HMHHHHH5'HMHHHHH5y'HMHHHHH5'HMHHHHH5z'(HMHHHHH5^')HMHHHHH5_'*HMHHHHH5R'+HMHHHHH52'$HMHHHHH5',HMHHHHH5"' HMHHHHH5('!HMHHHHH5-'-HMHHHxHH5&'.HMHHHpHH5?'0HMHHHhHH5*'1HMHHH`HH5$'2HMHHHXHH5'HPHİ]UHH H}HuHuHHuHEHEH;EHEH+EH}H-HEH;EHEHHkUHHHH ]fUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HHUH2H)HHH]UHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH}HE]fPH$UHH H}HuH}HuH ]f.UHHH}HuH}H]ÐUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH0H}HuHuHHuH}CHuH}HuH}HEMHEHH0]H} UHH H}H}H}HEHH@HHEHuHH ]HHUUHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHHk}HHHE1ɉH}H8H}H0]f.@UHH0H}HuHuHHuHEH}HuH}HUHrH}HH}HHEHPHHPHUHHUH}H}H0]f.@UHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHH@H}HuHuHHuH}HEH}HEHkHuHH}HuH}HEHkHuHH}HuHkuHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}H ]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H=Hk}H ]f.UHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}HE]fUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH H}HuHUH}HuHUH ]DUHH H}HuH}HuH ]f.UHH}]fDUHH}HuHU]f.@UHH H}HuH}HuH ]f.UHHH}HuHuHH]f.@UHH H}H}H}H}H ]HHUUHHH}H}H]DUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HcH]f.fUHHH}H}H]DUHH}HE]fUHHpH}HuHuHHuHH}HWH)HHH;EHuH}H}HEH}H}HH}HH}HEHMHuHHUHuHHHuH}HuH}H}HEMH}Hp]H} f.fUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH0H}HuHuHHuHEH}HEHHH}HH}HHEHHHHHHMHHMH}H0]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHkUHHAHAHHkUHHHEHMHHP]f.@UHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHkH}HHEH}HH}HEHkH}HHEH}HH}HEHkH}HHEH}HHuHUHMLEHP]f.fUHH0H}HuHUHMHEH;ESH}HEHHH}HH}HH}HEH}HuHHEHHHH0]ÐUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH}]fDUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHH}H}H]DUHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}HuH}HuH]f.UHH H}HuHuH}HuH0H}H7HpHwH@HGH}H ]fDUHH}HE]fUHH}HE]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HHUH2H)HHH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHH}Hu]fUHHPH}HuHuHHuH}HEH}HEHkHuHH}HuHkuHH}HEH}HEHkHuHH}HEHuHHUHMLEHP] ``sW L t  //TJ5 9T * M  G+9  -; Cf 7 d O kIncomplete translation (at least one error code missing)Undefined token "$IDENT$" found at position $POS$.Internal error.Unknown escape sequence.Invalid function, variable or constant name.Invalid pointer to callback function.Invalid pointer to variable.Unexpected operator "$IDENT$" found at position $POS$.Unexpected end of expression found at position $POS$.Unexpected comma found at position $POS$.Unexpected parenthesis "$IDENT$" found at position $POS$.Unexpected function "$IDENT$" found at position $POS$.Unexpected value "$IDENT$" found at position $POS$.Unexpected variable "$IDENT$" found at position $POS$.Unexpected string token found at position $POS$.The "$IDENT$" operator must be preceded by a closing bracket.Unexprected newline.Missing parenthesis.If-then-else operator is missing an else clause.Misplaced colon at position $POS$.Too many parameters passed to function "$IDENT$".Too few parameters passed to function "$IDENT$".Division by zero occurred.The value passed as argument to function/operator "$IDENT$" is not part of its domain.Name conflict.Invalid value for operator priority (must be greater or equal to zero).Binary operator identifier conflicts with a built in operator.Unterminated string starting at position $POS$.String function called with a non string type of argument.Numerical function called with a non value type of argument.Value "$IDENT$" is of type '$TYPE1$'. There is no implicit conversion to type '$TYPE2$'.Argument $ARG$ of function/operator "$IDENT$" is of type '$TYPE1$' whereas type '$TYPE2$' was expected.Index to "$IDENT$" must be a positive integer value. '$TYPE1$' is not an acceptable type.Parser error.Invalid argument type.Value type conversion from type '$TYPE1$' to '$TYPE2$' is not supported!Array size mismatch.Using the index operator on the scalar variable "$IDENT$" is not allowed.Unexpected "[]".Unexpected "{}".Index to variable "$IDENT$" is out of bounds.Index operator dimension error.Missing "]".Missing "}".Assignment operator "$IDENT$" can't be used in this context.Can't evaluate function/operator "$IDENT$": $HINT$Parameter $ARG$ of function "$IDENT$" is invalid.Invalid number of function arguments.Possible arithmetic overflow occurred in function/operator "$IDENT$".Matrix dimension error.Variable "$IDENT$" is already defined.Constant "$IDENT$" is already defined.Function/operator "$IDENT$" is already defined.allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup25ParserMessageProviderBaseEN3mup28ParserMessageProviderEnglishE1@#p-  A( ' 70P-  ~ #0 P (  Z +Pp8A(0#`#;A )0PpA)``A()` #@I6 YA8)p'`# M0(`UPdAH)#?Pp+#@ Pp#"9AX)0O1$  @PO1$0P`Ah)prA|)3uP0 P # M !+!!"_p""."""##P$L$ $F% %Fp%%7%#%J@&P&`&p&pA)&'8@'#p'wA)'(0(@(zRx $H1AC $D`#AC $lh-AC $pAC $h AC $P AC zPLRx ,$AC $\ AC $AC $AC $'AC $ AC $$AC $L7AC $t AC $- AC $ ~AC $x#AC $AC $<x(AC $dAC $xZAC $AC $+AC $AC $,8AC ,LAC $#AC $AC $#AC $AC ,;;AC $T AC $|AC $AC $AC $AC $AC $DAC ,dAC ,(`AC $XAC $AC $H AC $D0#AC $l8IAC $`AC $H6AC $`AC $ X AC ,,@YWAC $dp'AC $xAC $pAC $#AC $ AC $, AC $T AC $| MAC $ (AC $ AC $ AC $ AC $D AC $l AC $ UAC , dAC $ 8AC $ 0#AC $< 8?AC $d PAC $ HAC $ 0AC $ (AC $ AC $, +AC $T #AC $| ( AC $ AC $ #AC $ "AC , 9AC $L (AC $t OAC $ H1AC $ `$AC $ hAC $` AC $<HAC $d@AC $(OAC $P1AC $hAC $`$AC $,hAC $T`AC ,tH?AC ,(r#AC $xAC $3AC $,uAC $T`AC $|AC $#AC $MAC $@AC $+AC $DAC $lAC $_AC $AC $.AC $ AC $4AC $\AC $AC $AC $LAC $ AC $$FAC $LAC $tFAC $8AC $ 7AC $8#AC $@JAC $<hAC $dPAC $8AC , p+AC $`AC $ X8AC $4p#AC ,TxwAC $AC $AC $AC $AC (5-(-(3-(3-v(4-i(3-\(3-!(-(y-'-'-'-'Z-Y'w-'v-&u-&-& -&s-&Z-&r-0&G- &q-%p-%o-%k-\%n-L%k-%m-$l-$k-$j-u$j-e$j-2$i-"$h- $-#5-#4-#3-g#-Z#3-?#4-2#3-%#3-#B-"g-"e-e"f-Y"e-D")-8"(-"d-!c-!b-!^-6!!-*!Z-!a- :-i `-A - _- #- -]-^-"-]-]-\-x -l[-%--Z--oY-04-'- --W---V-^-J-3-%----T-- --|"-AS-R-R-R-Q-{P-eO-1N-M--L-K-AJ-!I--G-F--E-)D-C- --aB-:=3-A-----==w?-d-;>-*=-%;-<-q;-:-9-8-7-y6-S5-33-4-3-4-3-3-2-1-e-C/-2.-)--!,-+-(-*-s)-g(-)'-&-%--$-| -H#-4"-!- -----u-Y-E-&---~---A-%-----{-r-I-,--- --e-A-- - - - - -n -e -A - - - - -i -d Z -< -7 - - -  - -  - -  - - y -[ -V L -. -)  - -  - -  - -  -z -u k -M -H > - -  - -  - -  - -  -l -g ] -? -: 0 - -  ------|-^-YO-1-,"-------}-xn-P-KA-#--------o-j`-B-=3---------j-e[-@-;1---------q-lb-G-B8---------y-A- {--f-X-L-)---}-k-b=[=O-C9-#----{Y-'-ph`XPH@80 |} `@80 `@ `@     ` @       ` @ 8 0         ` @       ` @ 8 0       ` @   `XP@ `@ `XP@ `@ `@ `XP@ `@ `@ `@ M 7( P" ,pV POp Z-60 p)`"07(=#-$8 )P1B`s8)4%J8()Qp I 1@$@76#_n*>/`788)'P}'/f+`)/0 @!P9"7H)["p[P.2p#0t 08X)9 .@ e  {0PM7h)+0(@(7|) /P !c#]&#%P$ !$\/ F3!2"L""E5p"F$"" *%0$(`&5p%1 %x(P&/%o.%'.%&@&&}'8)p,@', '7p'7)U(j@ppP0?P u0 3W * U)( 0 hp&- `t6P" ` @ s 5*4*44|4044)R4)z!p!v"B"[!.+44 g!S!]8___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEE8allocateEmPKv__ZNKSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE8capacityEv__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8capacityEv__ZNKSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8capacityEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE5firstEv__ZNKSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE5firstEv__ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE5firstEv__ZNKSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE5firstEv__ZN3mup25ParserMessageProviderBase4InitEv__ZNSt3__122__compressed_pair_elemINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELi0ELb0EE5__getEv__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE26__invalidate_all_iteratorsEv__ZN3mup28ParserMessageProviderEnglish17InitErrorMessagesEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE5clearEv__ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE5clearEv__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE9__end_capEv__ZNKSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE9__end_capEv__ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE9__end_capEv__ZNKSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8max_sizeEv__ZNKSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE4sizeEv__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE17__annotate_deleteEv__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE6secondEv__ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE6secondEv__ZNKSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE6secondEv__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE7__allocEv__ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE7__allocEv__ZNKSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE7__allocEv__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup28ParserMessageProviderEnglishD2Ev__ZN3mup25ParserMessageProviderBaseD2Ev__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEED2Ev__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED2Ev__ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED2Ev__ZN3mup28ParserMessageProviderEnglishC2Ev__ZN3mup25ParserMessageProviderBaseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2Ev__ZNSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt12length_errorD1Ev__ZNSt13runtime_errorD1Ev__ZN3mup28ParserMessageProviderEnglishD1Ev__ZN3mup25ParserMessageProviderBaseD1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEED1Ev__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEED1Ev__ZN3mup28ParserMessageProviderEnglishC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup28ParserMessageProviderEnglishD0Ev__ZN3mup25ParserMessageProviderBaseD0Ev_memset__ZTVSt12length_error__ZTISt12length_error__ZTISt13runtime_error___cxa_allocate_exception___cxa_free_exception__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__RAII_IncreaseAnnotatorC2ERKS8_m__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE24__RAII_IncreaseAnnotatorC1ERKS8_m__ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE8allocateERS7_m__ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE10deallocateERS7_PS6_m__ZNSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEE10deallocateEPS5_m__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEixEm__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEixEm__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE14__annotate_newEm__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE17__annotate_shrinkEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE6resizeEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE11__vallocateEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE8__appendEm__ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE11__recommendEm__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE18__construct_at_endEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE18__construct_at_endEm__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2Em__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC1Em___cxa_pure_virtual___cxa_begin_catch___clang_call_terminate__Unwind_Resume__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNSt13runtime_errorC1EPKc__ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE7destroyIS6_EEvRS7_PT___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE9__destroyIS6_EEvNS_17integral_constantIbLb1EEERS7_PT___ZNSt3__122__compressed_pair_elemIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEELi1ELb0EEC2IS8_vEEOT___ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEEC1IDnLb1EEEOT___ZNSt3__1L4swapIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS9_EE5valueEvE4typeERS9_SC___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE20__construct_backwardIPS6_EEvRS7_T_SC_RSC___ZNSt3__1L4moveIRNS_17__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES6_EEEEONS_16remove_referenceIT_E4typeEOSC___ZNKSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE31__annotate_contiguous_containerEPKvSA_SA_SA___ZNSt3__1L4moveIRPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEONS_16remove_referenceIT_E4typeEOSA___ZNSt3__1L4moveIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEONS_16remove_referenceIT_E4typeEOS9___ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEEC2EmmS8___ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEEC1EmmS8___ZNSt3__1L16__to_raw_pointerINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEPT_S8___ZNSt3__1L16move_if_noexceptINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEENS_11conditionalIXaantsr29is_nothrow_move_constructibleIT_EE5valuesr21is_copy_constructibleIS8_EE5valueERKS8_OS8_E4typeERS8___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE8max_sizeERKS7___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS7___ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE27__invalidate_iterators_pastEPS6___ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE17__destruct_at_endEPS6___ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE17__destruct_at_endEPS6___ZNSt3__113__vector_baseINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE17__destruct_at_endEPS6___ZNSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEE7destroyEPS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2EOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEE9constructIS5_JS5_EEEvPT_DpOT0___ZNSt3__19allocatorINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEE9constructIS5_JEEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE9constructIS6_JS6_EEEvRS7_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE9constructIS6_JEEEvRS7_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE11__constructIS6_JS6_EEEvNS_17integral_constantIbLb1EEERS7_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEE11__constructIS6_JEEEvNS_17integral_constantIbLb1EEERS7_PT_DpOT0___ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEEC2IDnS9_EEOT_OT0___ZNSt3__117__compressed_pairIPNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEEC1IDnS9_EEOT_OT0___ZNK3mup25ParserMessageProviderBase11GetErrorMsgENS_11EErrorCodesE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup28ParserMessageProviderEnglishE__ZTSN3mup28ParserMessageProviderEnglishE__ZTIN3mup28ParserMessageProviderEnglishE__ZTVN3mup25ParserMessageProviderBaseE__ZTSN3mup25ParserMessageProviderBaseE__ZTIN3mup25ParserMessageProviderBaseE__ZNSt3__1L7forwardIRNS_9allocatorINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEEEEEOT_RNS_16remove_referenceIS9_E4typeE__ZNSt3__1L7forwardINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__16vectorINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS4_IS6_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS6_RS7_EE__ZNSt3__114__split_bufferINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS4_IS6_EEE17__destruct_at_endEPS6_NS_17integral_constantIbLb0EEEGCC_except_table98GCC_except_table97GCC_except_table67GCC_except_table6GCC_except_table26GCC_except_table134GCC_except_table82GCC_except_table32GCC_except_table51GCC_except_table41___gxx_personality_v0GCC_except_table40GCC_except_table130 #1/20 1573634241 501 20 100644 104484 ` mpRPN.cpp.o x00__text__TEXTgH__gcc_except_tab__TEXTgj__cstring__TEXTjm__const__TEXTkn__const__DATAloD__compact_unwind__LDo-r__eh_frame__TEXT(: ` h2  hH!v P<<bPUHHH}H}H}H}GGG G$H]@UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH H}H}HhH`H`H0HV HHhHHH`H8HXHHXPHH`H8HPHHPPHEH}HHH5hHHH5hHHH@H5hH@H8EH8H0H5hH0H(xHƅHHH HHHHƅH5HH HRHHH H HH}HhO)OHhxHHH5pgHH5&gHHH50gHHIHHH5fHHxHƅwHxHHHHHxHƅwH5HHHRHHHxw HH6HhHHhH HHHhP H ]H  @UHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHH}H}H]f.DUHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHHHHuHuHHEHEH]fDUHHH}H}H]DUHHH5H}H}H}HuHƀHH]UHH H}HuH}HuH ]f.UHH H}UH}H}HHuuHH}HuUHEH)щHHHH ]UHH}H}H]f.DUHHPH}uH}H}HEE;EH}H}H}HH}HEHEHHI HHEHEH)HEЋHHHEMH}+H}H}EETHP]H} UHH}H}HGH?H)H]@UHH}H}HHH]UHHH}HuH}HuH]f.UHHH}H}HGHHH]f.UHHH}H}H]DUHHH}H}H}H}GG GH]UHH H}H}H}HEH}HuH}H}H ]HHUUHHH}H}HEH}HH}EEH}EU9HcuH}HEH}HEH}||x^|t[| p*HEMOHEMH}8H}HuH}HuH}llEHcuH}H`H`HXEM)HXsH}TTEHcuH}HHHHH@EM)H@EEH}H}H]H}H} UHHH}H}H]DUHH}HuHuH6H}HHH]f.UHH H}HuHuHH}H}HHuH ]f.@UHHPH}H}H}xHEH5^]HMH}HHEHuH}EH5HH}oHE؉MHE؉MH}E H}'H}MHEHHEHP]H}  @UHHH}H}H]DUH@H}$EH}E$G$]fUHHH}H}H]DUHH}HE]fUHH}H}G ]f.fUHHH}H}H}HH5w[H}HEH}HHH5b[HEHH5L[Huv HHH5,[HEHEHEH}HEH}H9HuH}H}HHEEEEHuH}HxHuHxHpH5ZHpHhddEHuHhHXH}HPHPLHXLH@H5YH@H8H}H0H0HHIH}HHuH8H(H5H(H H}H}HEHHEHEMHEMH}H} H]H} fDUHH]UHH}HuHuH6H}HHH]f.UHH H}HuH}HuH}HH}HEH}HuHH ]fUHH H}HuHuH>HHH}Hc?H}HHuHuHEHH ]f.UHH}uH}EH]UHHH}HuH}UH]UHH H}H}HEHHIHH}HǾ H}H}HEHMHEHH ]UHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HH}HH)HH]UHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH}HE]fPH$UHH H}HuH}HuH ]f.UHHH}HuH}H]ÐUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}HHXH}HH}H]f.@UHHH}H}H]DUHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}uH}uH]f.DUHH}uH}u7]f.UHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHHH}H}H]DUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHuHUH} HEHEHEHEHEH ]UHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H=q6HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH0H}HuHUHMHEH;ESH}HEHHH}HH}HH}HEH}HuHHEHHHH0]ÐUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH}]fDUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHH H}H}H}H}H ]HHUUHHH}H}H]DUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=AHMHHH ]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHU;]fUHH H}HuHuH}H?H>H>Hu HEH8H ]fUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH}Hu]fUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHHHHH}H}HHH]UHHH}H}H]DUHHH}H}H}H}H]UHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHHHHH}H}HHHH}HHEHHH]fUHH H}H}H}HEH}HuH}H}H ]HHUUHHH}H}H]DUHH}H}HGH?H)H]@UHHH}H}H7H]fUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHH}]fDUHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHHH}H}HH]ÐUHH}HE]fUHH H}HuH}HuH ]f.UHH}Hu]fUHHH}H}H]DUHH}H}H]f.DUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHHH}H}H}HH}HH)HH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHH H}HuHUH}HuHUH ]DUHH H}HuHUH}H ]HHUDUHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUHEH ]f.UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH H}H}H ]DUHHH}H}HH]ÐUHHH}H}H]DUHH}H?]f.fUHHH}H}H]DUHH}H}H]f.DUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H= HMHHH ]DUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH01AH}HuHUHMHMHUH)HHMHMHUH2I)ILH2H}HEHHMHUHHHH0]fUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHHH}H}H$H]f.fUHHH}HuH}HuH]f.UHHH}H}HH]ÐUHHH}H}HGHHH]f.UHH}H}HH;G]fUHH H}HuHuHHuHuH}HuH}HuHH ]fUHH}H}HHH]UHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH}Hu]A"$9"$9UUYWWk- *L## XQ99Y-v/q L t  /  9T~~.1 * M  G+9 7 d O k UU `[  -1& )A 3$ " E ##_B: C %/d Cf 9T *L L t  /~~.1 * M 7 d O k CfAssertion "pFun != nullptr" failed: /Users/jgomez/muparserx/parser/mpRPN.cpp line .Assertion "m_nStackPos >= 0" failed: Number of tokens: MaxStackPos: : allocator::allocate(size_t n) 'n' exceeds maximum supported sizestack is empty.N3mup11ParserErrorENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEEp@@h@h@pp<@`lAgP A(h0B*9#@YA@h   # &P p 8 XATh OAdh`  # 2 A|h0P`Ah@ P#GF  @`YZ@`+0Ah`##;Ah@`20PBi0P(C0(`WZ  0Ah""###@#`###2#*$0$"`$@$$O%1@%`%'%%%%%&0&@& P&p&L&$&'%@'V'O'(#@(u("()$@)M)()!)*0*`Ah* *#*I +0+6p++ ++++F@, P,Ah0-P-`--F--7 ..3//0YA i`00#0#01 1 01M1(111202@2M2`3+3'334_`4p4.4[5dAip55#5?6 6@6`6 77L78 88899 9pA,i9909#:wA1p>$>> >>?ApiA A@A9AiC#CCg@D`D!DD7D, E&PE<EQAiEF0F|AiF"F+G$@G+pHH3H#I I@I`ICI#I2 KCpKK#K#K/L2PL'LeL' M@M/pM2M/MN N@N`NNNNN[0OPOpOOAiOMP'@P>PpAiPrAipQQ0R-`RR(RR`A j0S#`SIS6ST  TGpTXAjTTU0UU UA,jpV#VVV#WW0WPWpWWW0WX X0XPXZX+X;AAC ,)pAC ,)rۡAC $4+0AC $\+AC $+-AC $+AC $+(AC $+AC ,+`ˠAC $T,Љ#AC $|,؉IAC $,6AC $,AC $, AC $-GAC ,<, XAC $t-PAC $-HAC $-@AC $-8AC $. AC ,4-ӞAC $l.#AC $.AC $.AC $.#AC $ /AC $4/ЊAC $\/ȊAC $/AC $/AC $/AC $/0AC $$0AC $L0AC $t0AC $0AC $0ZAC $0+AC , 0; AC $D1ЊAC $l1XAC $1P+AC $1XFAC $1 AC ,1h#AC $<2AC $d2AC $2AC $2FAC $2AC $33AC $,3AC $T33AC $|3AC $3`AC ,2XYwAC $3AC $$4AC $L4xAC $t4pAC $4hAC $4`AC $4XAC $5+AC $<5'AC $d5AC $5AC $5_AC $58AC $6 .AC $,6([AC $T6`AC $|6XAC $6PAC $6HAC $6wAC $78LAC $D7`AC $l7؏AC ,6pAC $7AC $70AC $8#AC ,47w'AC $l8XAC $8PAC $8H$AC $8P#AC $ 9XAC $49P&AC $\9XAC $9PGAC $9xAC ,8prAC $:AC g-g-g-g-{g:-g- gg-f-f9-f8-Yf7-%f6-f-e5-e-e-e-e$-9e3-e2-d1-d-d-d/-d$-ud.-Fd-#d- d-c-c-c-c-c--c--uc--Mc-b-b-b-wb-jb-Ob-Bb-5b-b-a,-a-a-aa!-Ma*-a+- a*-`-`c-`)-`(-m`'-A`&-`-_%-_$-_#-!_"-^!-^ -^-^-c^y-R^x-I^-A^-!^s-]-]-]-]-]-] -]-]-w]-X]-L]-]q-\p-\-\-l\`-1\-[-[-q[-W[-N[r-6[r-([- [ -Z-Z-Zp-Z-Z-Z-Z-\Z-LZ-Z-Y-Y-Y-Y -Y-tY-hY -GY -Y-Y7-X -X-X-|X-sX-AXk-X-W-W-W-W-!W-V-V-V-lV-DV-8V-#V-U-U-U-~U-fU-YU-LU-$U-T-T-T-T-T-T-]T-MT-+T=T-Sc-S-S-Sc-IS-,S-S-R_-R-R-RP-qR-SR-;R=R-Q-Q-Q-Qo-Q-Q-^Q-GQ-:Q/-)Q-Q-P-P-tP-O-O-O-O-AO-!O- O-ON-N-QN-1N-M-M-]M-1M- M-L-mL-aL-3L-K-K-K-K-YK-MK-->->-W>-K>-=-=-=-=-=-q=-9=-%===-<e-<-k<-<=;-;-;-l;-Q;-:=:-:;-:-:-g:3-[: -?:-9-9-9-9-z9.-`9-L9-59-8-8 -8-c8-K8o->8-&8o-8- 8-7-7-7-7 -r7-]7 - 7-6o-6-6-6-6o-6-u6-Q6m-6-5=5-5-5-^5-U5-C5-:5=35='5-5-4-4-44-4-U4-I4-44d-(4c-3-3-3-3-G3t-2-2-2-]2-2-1-M1-%1-1~-0}-0|-0{-q0--U0-30y-"0x-0w-0v-/o-/-/u-/-/s-/t-/-y/s-^/s-G/r-(/ -/q-.m-.p-`.o-W.-<._- .S-.i--n--i-A-m-'---n--n-,-, -,i-, -,l-,-,k-y,-l, -,,j-,i-+h-+g-+f-M+c-+e-+d-*c-*b-*-u*`-E*_-!*^-)]-])\-!)T-)T-(T-(b-m(b-)([-'Z-'Y-'Q-k'X-U'Q-+'-&e-&a-&e-%W-%V-}%U-q%T-Q%T-%T-$S-$R-$Q-$-)#P-!#O-"N-"h-"L-"A-S"(-)"K- "<-!-!e-!-!@-!J-!C-b!)-G!(-+!I-!H-!- @- @- <-u e-P B-C <-, ?- >- a- e-e->-c-A-y>-i?-Hd-9>-*c-h-A->-?-a-e->-?-o<-V<-e-b->-G->-A->-?-G-\<-C<-F-=-D-C-mB-Z@-4A-?-?-=-<-=->-V=-=-@-<-?->-C(- =-=-<-<-N-Ey-- -=z-|-|-n-e}-H}-"}--y---o-A?->--;-:-q9-U-7- 7-U-6---y5-\-43-( - -2-1-0-T/-0.- --  --j---,-3+-*--)-(-G=4-U--U--&-%-n]-Y-M:--]-$-#---{$-`#-MR-HS-<"-"----R-----R-A-Q-- -K---r-i<=b=R-@-,-[- -q N-Y -P P-> P-5 P- - \- - J- -z \-b -A J-3 L- L- P- - ]-m -S -8 M-/ M- - - - - - -a V-< - T- - U-~ -p U- ]- S- --w-j-_\-)--~-==-^-h-Xg-!---=-=-x=I=B -- - - - --w-D-#-}----z<=s=`-H-------u-<-.}----<==-y-K-3-'-----o]-B]-]--I---qG-Q--OPuvxpwh`XPEHt@80x(y xpPH@( xpXPH0|(} `-X-P-@- --,,,,`,@, ,,,,++++++`+@+ ++****`*@* **))))`)@) ))((((((`(@( ((''''`'@'8'0' ''&&&&x&p&`&@& &&%%%%`%@% %%$$$$`$@$8$0$ $$####x#p#`#@# ##""""""`"@" ""!!!!!!!!`!@! !!!!    ` @   `@ `@ `@ `XP@ `@ `@80 `@ `@ `@ `@ `@ `@ `@ `@ `@ `@ `@ `@     ` @       ` @       ` @       ` @         ` @   `@ `@ `@80 `@ xp`@ `@80 `@80 `@80 `@ M3@+*\PB  n_tg+8+#Vc+@,*:4m;B;t(hbO  P t@h`[P @=QD 8uTh; \udhD YCJ@ffst|h;PD sV`Pj@IuhW$#'@ EG)2K0F,9`[9 ` 9L`LthLSZ7@6uhj  ",".@#`##Y#{$Y#E0$A%&5@'='@'Z(K@(th `$$ _$m%A@%`%-% b% %=`%(()=b@).Z)F)H+0* ,*Q*JvhFQ*Vi +O0+,p+++>0-o8`-#h-c-i? ."vh3 P-7c-`02_0`6ER 7R73{<7Z#1dX0 1P_0u irb@2b01X1q 102^1y1 2e`3"3=93Re446@6g`4Pp4I5=7p5J5tiJ5v  6$8US8W8IU9LV9599u,iZ9Y:>-p>w,>)>H ># A-lC CC @DA`DvpiDx@DTHD6vikEAGHPEEuiFiFKFtiipH\H]H`"I[\`IS]pO I# @INIsN K_KK:>L=PL?L" Mr;LH@M=pM>M}hpKPK6gN` NHN_7NN-0O=a@N`NaNPO"ui^P8tiZpQvi2`R)R)RQ0St jQ`SwOS5,S)TpTdTUZ=0U UujCU)$pWW;YPWj!V`VMpVv,jaMVWQCWP0WWKWX  X7X7XtP\uLj [c\} bWTb-W`c`B<c!^_`^ou`j`^B_b^0_]f `!`3;P`f``aabh anP0a/ a \Pddd_tpj:D eerPevjLefIf0gCPgtCguj-%-0%PF@LnE;p ' 2`z)(.&g +pfD f3` +0Rk6Rd2() T@a a@P9.P &&PW`$P?0Nf 0@G)00^&CP&K0&F&H& @&AIMIAwFp&SI(s&PXU.U21/>( 9^\Y^P_.^&`dA`E'F0r #601']@A5P0'@:? NP,j/2(MZm0]\.TI&0XiI04nln kmskPnflrxoq@opnfkfr`lDqlipkp0m-rXopnol45N0500PGhGq{EUE H.jL!J-"8xGGgK=140?'J4_-4/E<44/ '#i7??9@ !*t'f8j.usA&\ko7ooo6gfgn63.4/P4j/3.m76,G?G6Orv6 7_memcpy__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIiE8allocateEmPKv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE8allocateEmPKv__ZNKSt3__16vectorIiNS_9allocatorIiEEE5emptyEv__ZNK3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE5emptyEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE8capacityEv__ZNKSt3__113__vector_baseIiNS_9allocatorIiEEE8capacityEv__ZNKSt3__114__split_bufferIiRNS_9allocatorIiEEE8capacityEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE8capacityEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEE5firstEv__ZNKSt3__117__compressed_pairIPiNS_9allocatorIiEEE5firstEv__ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEE5firstEv__ZNKSt3__117__compressed_pairIPiRNS_9allocatorIiEEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5firstEv__ZNK3mup8TokenPtrINS_6ITokenEEptEv__ZNK3mup9ICallback14GetArgsPresentEv__ZN3mup3RPN5ResetEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIiEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIiEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIiEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPiLi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPiLi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EE5__getEv__ZNK3mup8TokenPtrINS_6ITokenEE3GetEv__ZNSt3__16vectorIiNS_9allocatorIiEEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__invalidate_all_iteratorsEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNSt3__16vectorIiNS_9allocatorIiEEE5clearEv__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE5clearEv__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE5clearEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5clearEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5clearEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3topEv__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE3popEv__ZNK3mup3RPN9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE9__end_capEv__ZNKSt3__113__vector_baseIiNS_9allocatorIiEEE9__end_capEv__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE9__end_capEv__ZNKSt3__114__split_bufferIiRNS_9allocatorIiEEE9__end_capEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE9__end_capEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNSt3__16vectorIiNS_9allocatorIiEEE8pop_backEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8pop_backEv__ZNSt3__16vectorIiNS_9allocatorIiEEE4backEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4backEv__ZNKSt3__18ios_base5widthEv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZNKSt3__19allocatorIiE8max_sizeEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE4sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4sizeEv__ZN3mup3RPN8FinalizeEv__ZNK3mup3RPN7GetSizeEv__ZNK3mup3RPN20GetRequiredStackSizeEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE17__annotate_deleteEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__annotate_deleteEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNSt3__16vectorIiNS_9allocatorIiEEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotator6__doneEv__ZN3mup7consoleEv__ZNK3mup6IToken7GetCodeEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEE6secondEv__ZNKSt3__117__compressed_pairIPiNS_9allocatorIiEEE6secondEv__ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE7__allocEv__ZNKSt3__113__vector_baseIiNS_9allocatorIiEEE7__allocEv__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE7__allocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE7__allocEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__16vectorIiNS_9allocatorIiEEE4dataEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4dataEv__ZNK3mup3RPN7GetDataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup3RPND2Ev__ZN3mup8TokenPtrINS_6ITokenEED2Ev__ZNSt3__16vectorIiNS_9allocatorIiEEED2Ev__ZNSt3__113__vector_baseIiNS_9allocatorIiEEED2Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup3RPNC2Ev__ZNSt3__19allocatorIiEC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__16vectorIiNS_9allocatorIiEEEC2Ev__ZNSt3__113__vector_baseIiNS_9allocatorIiEEEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEEC2Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIiEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZNSt3__16localeD1Ev__ZN3mup3RPND1Ev__ZN3mup8TokenPtrINS_6ITokenEED1Ev__ZNSt3__16vectorIiNS_9allocatorIiEEED1Ev__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED1Ev__ZN3mup3RPNC1Ev__ZNSt3__16vectorIiNS_9allocatorIiEEEC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEC1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__116allocator_traitsINS_9allocatorIiEEE10deallocateERS2_Pim__ZNSt3__19allocatorIiE10deallocateEPim__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC2ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC1ERKS7_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE8allocateERS6_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE10deallocateERS6_PS5_m__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE10deallocateEPS4_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__16vectorIiNS_9allocatorIiEEE24__RAII_IncreaseAnnotatorC2ERKS3_m__ZNSt3__16vectorIiNS_9allocatorIiEEE24__RAII_IncreaseAnnotatorC1ERKS3_m__ZNSt3__116allocator_traitsINS_9allocatorIiEEE8allocateERS2_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEixEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEixEm__ZNKSt3__16vectorIiNS_9allocatorIiEEE14__annotate_newEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE14__annotate_newEm__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNKSt3__16vectorIiNS_9allocatorIiEEE17__annotate_shrinkEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__annotate_shrinkEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNKSt3__16vectorIiNS_9allocatorIiEEE11__recommendEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__19allocatorIiE7destroyEPi__ZNSt3__16vectorIiNS_9allocatorIiEEE27__invalidate_iterators_pastEPi__ZNSt3__16vectorIiNS_9allocatorIiEEE17__destruct_at_endEPi__ZNSt3__113__vector_baseIiNS_9allocatorIiEEE17__destruct_at_endEPi__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE17__destruct_at_endEPi__ZNSt3__16vectorIiNS_9allocatorIiEEE9push_backERKi__ZN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEE4pushERKi__ZNSt3__1L4setwEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZN3mup15TokenIfThenElse9SetOffsetEi__ZN3mup12TokenNewline14SetStackOffsetEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZN3mup3RPN3PopEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZN3mup3RPN10AddNewlineENS_8TokenPtrINS_6ITokenEEEi__ZNSt3__18__iom_t6C2Ei__ZNSt3__18__iom_t6C1Ei___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZN3mup3RPN15EnableOptimizerEb__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE7destroyIS5_EEvRS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9__destroyIS5_EEvNS_17integral_constantIbLb1EEERS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIiEEE7destroyIiEEvRS2_PT___ZNSt3__116allocator_traitsINS_9allocatorIiEEE9__destroyIiEEvNS_17integral_constantIbLb1EEERS2_PT___ZNSt3__16vectorIiNS_9allocatorIiEEE21__push_back_slow_pathIRKiEEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemIPiLi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb0EEC2IS7_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIiEELi1ELb0EEC2IS3_vEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPiNS_9allocatorIiEEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1IDnLb1EEEOT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE20__construct_backwardIPS5_EEvRS6_T_SB_RSB___ZNSt3__1L4swapIPN3mup8TokenPtrINS1_6ITokenEEEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS7_EE5valueEvE4typeERS7_SA___ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE31__annotate_contiguous_containerEPKvS9_S9_S9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__116allocator_traitsINS_9allocatorIiEEE20__construct_backwardIiEENS_9enable_ifIXaaooL_ZNS_17integral_constantIbLb1EE5valueEEntsr15__has_constructIS2_PT_S8_EE5valuesr31is_trivially_move_constructibleIS8_EE5valueEvE4typeERS2_S9_S9_RS9___ZNSt3__1L4moveIRPN3mup8TokenPtrINS1_6ITokenEEEEEONS_16remove_referenceIT_E4typeEOS8___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__1L4moveIRN3mup8TokenPtrINS1_6ITokenEEEEEONS_16remove_referenceIT_E4typeEOS7___ZNSt3__1L4endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7___ZNSt3__1L16__to_raw_pointerIN3mup8TokenPtrINS1_6ITokenEEEEEPT_S6___ZNSt3__1L4swapIPiEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS3_EE5valueEvE4typeERS3_S6___ZNSt3__1L16move_if_noexceptIN3mup8TokenPtrINS1_6ITokenEEEEENS_11conditionalIXaantsr29is_nothrow_move_constructibleIT_EE5valuesr21is_copy_constructibleIS6_EE5valueERKS6_OS6_E4typeERS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE8max_sizeERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS6___ZNKSt3__16vectorIiNS_9allocatorIiEEE31__annotate_contiguous_containerEPKvS5_S5_S5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE7destroyEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE27__invalidate_iterators_pastEPS4___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__1L4moveIRPiEEONS_16remove_referenceIT_E4typeEOS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9push_backERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC2EmmS3___ZNSt3__114__split_bufferIiRNS_9allocatorIiEEEC1EmmS3___ZNKSt3__16__lessImmEclERKmS3___ZNKSt3__16__lessIiiEclERKiS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L3maxIiEERKT_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L16__to_raw_pointerIiEEPT_S2___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIiEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIiEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mup8TokenPtrINS_6ITokenEEC2ERKS2___ZN3mup8TokenPtrINS_6ITokenEEC1ERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3maxIiNS_6__lessIiiEEEERKT_S5_S5_T0___ZNSt3__19allocatorIiE9constructIiJRKiEEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE9constructIS4_JRKS4_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE11__constructIS5_JRKS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIiEEE9constructIiJRKiEEEvRS2_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIiEEE11__constructIiJRKiEEEvNS_17integral_constantIbLb1EEERS2_PT_DpOT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEEC2IDnS4_EEOT_OT0___ZNSt3__117__compressed_pairIPiRNS_9allocatorIiEEEC1IDnS4_EEOT_OT0___ZNSt3__14coutE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEEEOT_RNS_16remove_referenceIS8_E4typeE__ZNSt3__1L7forwardIRKN3mup8TokenPtrINS1_6ITokenEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIiEEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIRKiEEOT_RNS_16remove_referenceIS3_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRS3_S4_E__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__16vectorIiNS_9allocatorIiEEE26__swap_out_circular_bufferERNS_14__split_bufferIiRS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZN3mup3RPN3AddENS_8TokenPtrINS_6ITokenEEE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZTVN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTSN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZTIN3mup5StackIiNSt3__16vectorIiNS1_9allocatorIiEEEEEE__ZNSt3__114__split_bufferIiRNS_9allocatorIiEEE17__destruct_at_endEPiNS_17integral_constantIbLb0EEE__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4_NS_17integral_constantIbLb0EEE__ZNSt3__1lsIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_RKNS_8__iom_t6EGCC_except_table9GCC_except_table189GCC_except_table269GCC_except_table49GCC_except_table349GCC_except_table29GCC_except_table78GCC_except_table168GCC_except_table308GCC_except_table277GCC_except_table227GCC_except_table17GCC_except_table6GCC_except_table185GCC_except_table265GCC_except_table55GCC_except_table35GCC_except_table25GCC_except_table325GCC_except_table284GCC_except_table144GCC_except_table24GCC_except_table224GCC_except_table314GCC_except_table193GCC_except_table363GCC_except_table353GCC_except_table133GCC_except_table213GCC_except_table121GCC_except_table201___gxx_personality_v0GCC_except_table290GCC_except_table270GCC_except_table210 #1/28 1573634241 501 20 100644 48316 ` mpScriptTokens.cpp.o x____text__TEXTO/bE__gcc_except_tab__TEXTP/h2__const__DATA`0x3lK__cstring__TEXTx3a6__const__TEXT36__compact_unwind__LD47@o__eh_frame__TEXTxG0Jt h2  t7 P}}4NUHHH}H}HH}HǾHHH}HG<H]f.UHHH}H}H]DUHH0H}Hu@HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}HuH}HuH]f.UHH}uH}uw<]fUHH}H}G<]f.DUHHHHuHuHHHHHHHHHH5H4HHHH51HH5HHHHHH5HHHH51HxHtHxtHhHH50H`HpLMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHU &&L=,HHJUUY  UU `[  -1& )A 3$ " E ##_B:  G+9 Cp@@h@h@pp [addr=0x; pos=; offset=]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup12TokenNewlineENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEECPpiAP/#0P#A`/At/BG0/`/*9 (PIAi(0PC(W0 Z  PA/0P##2P*"@ Op1' 0P` L0$`%VO`#u0"`$M(0P7A/P!U+0KU9A/@pO1$0P `A/9A/"#@"`"g""! #@#7#,#&#< $QA0$$$|A$0@%"p%+%$%+' '3`'#''''C@(#p(2)C**#@*#p*/*2*'+e+'++/,2@,/p,,,,,-0-@-`-[-dA400.P.#.?../OAD0zRx $hCAC $DAC zPLRx ,$hi7AC $#AC $AC $ AC ,#AC ,AC $BAC $GAC $л/AC $ ػ/AC $4*AC $\9AC $AC $(AC $IAC $(AAC $$PAC $LHiAC $tAC $AC $(AC $AC $AC $<xAC $dpCAC $(AC $WAC $ؿZAC $ AC $,AC ,AC $0AC $(#AC $0#AC $8AC $$0AC $L(AC $t 2AC $8*AC $@AC $8"AC $@@AC $<XAC $d@OAC $h1AC $AC $x'AC $AC $,xAC $T`AC $|XAC $@AC $8AC $0AC $  AC $D AC $l LAC $ $AC $ (AC $ %AC $ (VAC $4 `OAC $\ AC $ #AC $ uAC $ "AC $ AC $$ $AC $L MAC $t (AC $ AC $ 7AC , (+AC $ !AC $D AC $l UAC $ +AC $ KAC $ UAC $ XAC , P9AC $d `AC $ hOAC $ 1AC $ $AC $AC $, AC $TAC $|AC ,<pAC $@AC $8AC ,09KAC $T@#AC $|HAC $@gAC $AC $!AC $AC $D7AC $l,AC $&AC $<AC ,|QAC $AC $<AC ,|3AC $0"AC $8+AC $@$AC $ H+AC $4PAC $\H3AC $`#AC $hAC $`AC $XAC $$PCAC $Lx#AC $t2AC $CAC $AC $#AC $#AC $</AC $d2AC $'AC $eAC $('AC $0AC $,(/AC $T02AC $|H/AC $PAC $HAC $@AC $8AC $D0AC $l(AC $ AC $AC $[AC ,8dAC $<xAC $dp#AC $x?AC $AC $AC ,OAC K/-9/9-+/_-.{-.=.-i.z-E.-.-.-.--=-=-x----w--v---t-!-u-,t-,s-],<-!,<-+<-+r-+q-@+p-*o-*<-*<-*n-*Z-Y*m-%*k-)l-)k-)=-)-j)-J)j-=)i-))h-)g-)f-(e-(d-(c-(-(b-(a-Y(`-)(-(_-'^-']-y'\-I'[-'Z-&Y-&W-&X-&W-&-&-l&X-W&W->&-*& -& -%-X%-K%=6%--%-%-$U-$T-$-$S-m$-G$Q-$-$8-#P-#O-"N-"-u"-)"M-"-!K-!I-K!-6!- I- - J-z I-! H---o-\-I-.-$- --F-E--aD-C-B-A--q@-A?-->-=-<-k-b-Q;-5-#9-8-7-6-=-g-S-5-=g4-E-<-2-1-r=k0-A-/-'-q'-A'---.-M--;,-%$-+-$-----A*-)-(-'-'-'-]&-K%-5$--#-"-i!-- ----} -g-_-S--------p-=-- --- ---{-q-:-- -------w-o-S-C-"--- - - - -w -o -V -I -= -% - - - - -Z - - - - - - - -r -E -+ - - - - -_ -R -6 -) - -z -L -% - ----}-[=A-(------o-X- -zs->-5----=-{ -K ----x-f-J=* -=-==-m-a-6-%------q-lR-F3----=-----~--a-' -ph`XPH0( x`XP80( ph`XPH@80( `@ `@ `@ `@ `@       ` @ 8 0       ` @         x p ` @       ` X P @       ` X P @   `@ `@ `@ `@ `@ `@ `@ `@ `XP@ {Mt7P/ .00.`7`/SP2?!P7t/70$PK] - w)j9)P_"F 0 3` `)'7/ + pD:-0 X,Pl0Z ` k-)D3a7/ 20@p7/`v407P 1"@" `" " "7/  #@#b$##:7/1 $s&$%$#= $&70 $/@%V&p%6$0X'N* '*`'')'*/1 'c''@(Z')+@* p***+<++$+O,A@,.*^(*3.,z,,$-X@-`- .,, ,-0-%-60.;&P.M740&..7D0"-}P-P <00i pHP%!&#`$0r O%p,%"(p(S!P"  {50P2+0qw%@2 20121p2w/0L6`3t52]/36P4*544P1C/`05240R^#`v#0>  6  %0-p  E0!&###&W,Z*"r/#a :l0WXmT .,433`4-.3m4e/:#M#G7'__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup12TokenNewline14GetStackOffsetEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup6IToken10GetExprPosEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup12TokenNewline9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup6IToken11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup6IToken8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup12TokenNewline5CloneEv__ZNK3mup6IToken7GetCodeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup6ITokenD2Ev__ZN3mup12TokenNewlineD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZN3mup12TokenNewlineC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZNSt12length_errorD1Ev__ZN3mup12TokenNewlineD1Ev__ZNSt3__16localeD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup12TokenNewlineC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup12TokenNewlineD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZN3mup12TokenNewline14SetStackOffsetEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZN3mup6ITokenC2ERKS0___ZN3mup12TokenNewlineC2ERKS0___ZN3mup12TokenNewlineC1ERKS0___ZTVN10__cxxabiv120__si_class_type_infoE__ZTIN3mup6ITokenE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L3hexERNS_8ios_baseE__ZNSt3__1L3decERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZTVN3mup12TokenNewlineE__ZTSN3mup12TokenNewlineE__ZTIN3mup12TokenNewlineE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup10g_sCmdCodeE__ZN3mup6ITokenC2ENS_8ECmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table109GCC_except_table7GCC_except_table6GCC_except_table106GCC_except_table95GCC_except_table145GCC_except_table74GCC_except_table2GCC_except_table92GCC_except_table82GCC_except_table32GCC_except_table151___gxx_personality_v0 #1/20 1573634242 501 20 100644 309244 ` mpTest.cpp.o h<< __text__TEXT@__gcc_except_tab__TEXT t,8__literal8__TEXTX__literal16__TEXT__common__DATA<__cstring__TEXT!__const__TEXTs__const__DATA6__compact_unwind__LD +__eh_frame__TEXT7 h$ h2  )p$x$(Fq P""uUHH@H}H}HHHHHHHHHHHHUHEHuHUHHHEHEHuHUHHHEHEHuHUHHHEHEHuHUHHHEHEHuHUHHHEHEHuHUHHHxHEHxHUHHHhHDžpHhHpHHHXHDž`HXH`HHHHHDžPHHHPHHH8HDž@H8H@HHH(HDž0H(H0HHHHDž HH HHHHDžHHHHHHDžHHHHHHDžHHHH@]ÉHEMHH} f.@UHHH}H}H]DUHH]UHH0HuHUHUHuH}HuHUH}HuH0]fUHH H}H}EHGH5!HHH}HxHH5HxHHxHxH5HHppHHHWH1ƉHhHhHHI`$HH`H1HXHXHHI`HHPHWH8WH8H1HHƉH@H@HHH8H8HWHH1H0H(H(H0H HHXWHXH1HHHHHHXHHuHHHHH8HHHHHH&HEEH%H$HHx$H$H$Hs$HS$H3$HH8$HH#HHX#H#H#Hs#HS#H3#H HHcHHDžHH;4H1HHHHHщHcHHEEHH52HHHHHH5HHHHHH5HHHHHHSH.Hȃf EEHSH.Hȃc EEHXH)Hȃm EEHXH.Hȃs EEHXH.Hȃs EEH}RH}+H}ȃb EEHSH.Hȃf EEHSH.Hȃc EEHXH)Hȃm EEHXH.Hȃs EEH8XH8.H8ȃs EEHXH.Hȃb EEH HW HHH HHH f.hbH xhxf./)H wwȃceHHxH5eHhEE4H~HH^H H`HW HHHXH HHPH H?Hf.hbH @@f./)H ??ȃc,HHxH5 H0EEHH 6H HMMH(ƅH eHH!HHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHMMƅHHEHHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHMMƅHHEHHуʈHMMƅH}EHHуʈHxMMƅH}pEHHуʈHhMMƅH}gEHHуʈHXMMƅH}HPEHHуʈHHMMƅH}H@EHHуʈH8MMƅH0EHHуʈH(MMƅH EHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHMMƅHHEHHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHMMƅHHEHHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHxMMƅHHpEHHуʈHhMMƅH`EHHуʈHXMMƅHWEHHуʈHHMMƅHH@EHHуʈH8MMƅHH0EHHуʈH(MMƅH EHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHMMƅHHEHHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHMMƅHHEHHуʈHMMƅHEHHуʈHMMƅHEHHуʈHMMƅHHEHHуʈHxMMƅHHpEHHуʈHhMMuHEHdHH8HHHHHHHHHH}dHĠ ]HH8HHHHHHHHHH}H f.UHHP HHHEH(H(Dž$HxH5HH7HHHxH5HHHHHHpHpHpHHhHhHhHpHH$$4H|H|HHhH$$HH7H0HH`H`HpHsHHXHXHpHMHHPHPHpH'HHH5BHHHHHH0HHHHHHHH5̆HhH@HHH HhH H@H HhHH5VHH8HHHHHH8HHHH5HH0HHuH`HH`H0H`HHH5]HHH(HHHH(HHHH H H@HHHH8H@H$$H9H|HH`H9H8HHHHHH`H9H H|H|H|HHYH|H|H HhH|H|HHH|H|H`HH|HHyH8H$$H0HHHHHHHHHHH9HHH7HHHH55HHHHHHHHHHHHHHHH$$H0HHHHHHHHHHH9HHH|H|HuHH$$H$H$H=H?HMH9ω)HP ]HH  UHHH}H}EHGH5KHHH5LH}HHHEHHHHLEȉEH}H}H5ЄH}HHuHHHHLEȉEH}H}H5]HhHHPHHHHLE􋍬ȉEHPHhH5H8HH HHHHLE􋍔ȉEH H8H5aHHHHHHHL|E|ȉEHHH5HHpHHHhHHpLhdEdȉEHHH5bHH5dHHLH`E`ȉEHHH5HxHXH`HHP,1HHXLPLELȉEH`HxH5HHH@H0HH8,1HH@L84E4ȉEH0HHH5HH(HHH ,1HH(L EȉEHHH5HHHHH,1HHLEȉEHHH5@HHHHH,HHLEȉEHHH5HHHpHH,HHLEȉEHpHH5THXHH@HH,HHLE􋍼ȉEH@HXH5~H(HHHH,HHLE􋍤ȉEHH(H5v~HHHHH,HHLE􋍌ȉEHHH5~HHHHHx,HHLxtEtȉEHHH5}HHhHHH`,HHhL`\E\ȉEHHH5}HhHPHPHHH,HHPLHDEDȉEHPHhH5|H8H8H HH0,HH8L0,E,ȉEH H8H5|HH HHH,HH LEȉEHHH5{HHHHH,HHLEȉEHHH5"{HHHHHHHLEȉEHHH5zHxHH`HHHHLEȉEH`HxH5zHHHH0HHHHLE􋍴ȉEH0HHH5yHHHHHHHLE􋍜ȉEHHH5yHHHHHHHLE􋍄ȉEHHH5xHHxHHHpHHxLplElȉEHHH5xHH`HpHHXHH`LXTETȉEHpHH5wHXHHH@HH@HHHL@<E<ȉEH@HXH5wH(H0HHH(HH0L($E$ȉEHH(H5vHHHHHHHL E ȉEHHH5vHHHHHHHLEȉEHHH5uHHHHHHHLEȉEHHH5uHhHHPHHHHLEȉEHPHhH5tH8HH HHHHLE􋍬ȉEH H8H5 tHHHHHHHLE􋍔ȉEHHH5sHHHHHHHL|E|ȉEHHH5sHHpHHHhHHpLhdEdȉEHHH5rHxHXH`HHPHHXLPLELȉEH`HxH5rHHH@H0HH8 HH@L84E4ȉEH0HHH5qHH(HHH HH(L EȉEHHH5qHHHHHHHLEȉEHHH5pHHHHHHHLEȉEHHH5"pHHHpHHHHLEȉEHpHH5oHXHH@HHHHLE􋍼ȉEH@HXH5"oH(HHHHHHLE􋍤ȉEHH(H5nHHHHHHHLE􋍌ȉEHHH5!nHHHHHxHHLxtEtȉEHHH5mHHhHHH`HHhL`\E\ȉEHHH5!mHhHPHPHHHHHPLHDEDȉEHPHhH5lH8H8H HH0HH8L0,E,ȉEH H8H5 lHH HHHHH LEȉEHHH5kHHHHH1ҹHHLEȉEHHH5%kHHHHHHHLEȉEHHH5jHxHH`HHHHLEȉEH`HxH5+jHHHH0HHHHLE􋍴ȉEH0HHH5iHHHHHHHLE􋍜ȉEHHH58iHHHHHHHLE􋍄ȉEHHH5hHHxHHHpHHxLplElȉEHHH5>hHH`HpHHXHH`LXTETȉEHpHH5gHXHHH@HH@HHHL@<E<ȉEH@HXH5HHAH,E,ȉEHHH5^HHU>HHAH(E(ȉEHHH5~^HpH=HpHAH$E$ȉEHHpH5 ^HHxa=HHxAH E ȉEHxHH5]H`H<H`HAHEȉEHH`H5]HHhe<HHhAHEȉEHhHH5\HPH;HPHAHEȉEHHPH5$\HHXq;HHXAHEȉEHXHH5[H@H:H@HAH E ȉEHH@H54[HHH}:HHHAHEȉEHHHH5ZH0H:H0HAHEȉEHH0H5FZHH89HH8AHEȉEH8HH5YH H9H HAHEȉEHH H5[YHH(8HH(AHEȉEH(HH57[HH8HHAHEEHHuHEH]ÉHEMH}H}HEMH}H}HEMHEMHHhwHEMHEMHpHCHEMHEMHHXHEMHEMH`HHEMHEMHHHHEMHEMHPHsHEMHEMHH8?HEMHEMH@H HEMHEMHH(HEMHEMH0HHEMHEMHHoHEMHEMH H;HEMHEMHHHEMHEMHHHEMHEMHHHEMHEMHHpkHEMHEMHxH7HEMHEMHH`HEMHEMHhHHEMHEMHHPHEMHEMHXHgHEMHEMHH@3HEMHEMHHHHEMHEMHH0HEMHEMH8HHEMHEMHH cHEMHEMH(H/HEMHEMHHH} f.fUHH00H}H}EHGH5 HHXHH?HuH5HH}HPHHHEHH@HXHPL@<E<ȉEH}H}H5GH}H0HxHH(HXH0L($E$ȉEHxH}H5GH`HHHHH HXHL E ȉEHHH`H5FH0HHHH HXHLEȉEHH0H5(FHHHHH HXHLEȉEHHH5EHHHHH HXHLEȉEHHH54EHHHHHHXHLE􋍬ȉEHHH5DHpHHXHHHXHLE􋍔ȉEHXHpH56DH@HH(HHHXHL|E|ȉEH(H@H5CHHpHHHhHXHpLhdEdȉEHHH5DCHHXHHHPHXHXLPLELȉEHHH5BHH@HHH8HXH@L84E4ȉEHHH5BBHH(HhHH HXH(L EȉEHhHH5AHPH*HPHAHXEȉEHHPH5QAHHX *HHXAHXEȉEHXHH5@H@H)H@HAHXEȉEHH@H5q@HHH)HHHAHX E ȉEHHHH5@H0H(H0HAHXEȉEHH0H5?HH8(HH8AHXEȉEH8HH5j?H H'H HAHXEȉEHH H5>HH( 'HH(AHXEȉEH(HH5>HH1HHAHXEȉEHHH5$>HH*&HHAHXEȉEHHH5=HH%HHAHXEȉEHHH5F=HxHHxHAHXEȉEHHxH5<HH$HHAHXEȉEHHH5l<HhH%$HhHAHXEȉEHHhH5;HHp#HHpAHXEȉEHpHH5;HXH)#HXHAHXEȉEHHXH5;HH`1HH`AHXEȉEH`HH5:HHH"HHHAHXEȉEHHHH5<:HHP!HHPAHXEȉEHPHH59H8H!H8HAHXEȉEHH8H5d9HH@ HH@AHXEȉEH@HH58H(H; H(HAHXEȉEHH(H58HH0HH0AHXEȉEH0HH5%8HHGHHAHXE􋍼ȉEHHH57HH HH AHXE􋍸ȉEH HH5U7HHCHHAHXE􋍴ȉEHHH56HHHHAHXE􋍰ȉEHHH56HHGHHAHXE􋍬ȉEHHH5*6HpHHpHAHXE􋍨ȉEHHpH55HHxSHHxAHXE􋍤ȉEHxHH5z5H`HH`HAHXE􋍠ȉEHH`H5%5HHh?HHhAHXE􋍜ȉEHhHH54HPH]HPHAHXE􋍘ȉEHHPH5~4HHXSHHXAHXE􋍔ȉEHXHH54H@HYH@HAHXE􋍐ȉEHH@H53HHHOHHHAHXE􋍌ȉEHHHH5C3H0HUH0HAHXE􋍈ȉEHH0H52HH8KHH8AHXE􋍄ȉEH8HH5u2H HQH HAHXE􋍀ȉEHH H52HH(GHH(AHX|E|ȉEH(HH51HHHHAHXxExȉEHHH5G1HHHHAHXtEtȉEHHH50HHQHHAHXpEpȉEHHH50HxHHxHAHXlElȉEHHxH50HHeHHAHXhEhȉEHHH5/HhHHhHAHXdEdȉEHHhH5M/HHpIHHpAHX`E`ȉEHpHH5.HXHHXHAHX\E\ȉEHHXH5}.HH`]HH`AHXXEXȉEH`HH5E,HHHHHHAHXTETȉEHHHH5+HHPHHPAHXPEPȉEHPHH5s+H8HH8HAHXLELȉEHH8H5 +HH@HH@AHXHEHȉEH@HH5*H(HH(HAHXDEDȉEHH(H5:*HH0HH0AHX@E@ȉEH0HH5)HHHHAHX<E<ȉEHHH5l)HH HH AHX8E8ȉEH HH5*HH#HHAHX4E4ȉEHHH5)HH HHAHX0E0ȉEHHH5N)HH HHAHX,E,ȉEHHH5(HpH% HpHAHX(E(ȉEHHpH5(HHx# HHxAHX$E$ȉEHxHH5;(H`H H`HAHX E ȉEHH`H5'HHh/ HHhAHXEȉEHhHH5y'HPH HPHAHXEȉEHHPH5'HHX HHXAHXEȉEHXHH5&H@H H@HAHXEȉEHH@H5\&HHH HHHAHX E ȉEHHHH5 &H0HH0HAHXEȉEHH0H5%HH8 HH8AHXEȉEH8HH5k%H HH HAHXEȉEHH H5%HH(HH(AHXEȉEH(HH5$HHHHAHXEȉEHHH5A$HHHHAHXEȉEHHH5#HH)HHAHXEȉEHHH5l#HxHHxHAHXEȉEHHxH5"HHHHAHXEȉEHHH5"HhHHhHAHXEȉEHHhH5$"HHpHHpAHXEȉEHpHH5!HXE( f f.‰H=HHXHAHXEȉEHHXH58!HE zf.‰H=GH`HH`AHXEEH`HuHXEH00]ÉHEMH}H}4HEMHxH}HEMHHH`HEMHH0HEMHHHEMHHyHEMHHSHEMHXHp-HEMH(H@HEMHHHEMHHHEMHHHEMHhHoHEMHEMHHP;HEMHEMHXHHEMHEMHH@HEMHEMHHHHEMHEMHH0kHEMHEMH8H7HEMHEMHH HEMHEMH(HHEMHEMHHHEMHEMHHgHEMHEMHH3HEMHEMHHx HEMHEMHH HEMHEMHHh HEMHEMHpHc HEMHEMHHX/ HEMHEMH`H HEMHEMHHH HEMHEMHPH HEMHEMHH8_ HEMHEMH@H+ HEMHEMHH( HEMHEMH0H HEMHEMHH HEMHEMH H[ HEMHEMHH' HEMHEMHH HEMHEMHH HEMHEMHHp HEMHEMHxHW HEMHEMHH`# HEMHEMHhH HEMHEMHHP HEMHEMHXH HEMHEMHH@S HEMHEMHHH HEMHEMHH0HEMHEMH8HHEMHEMHH HEMHEMH(HOHEMHEMHHHEMHEMHHHEMHEMHHHEMHEMHHxHEMHEMHHKHEMHEMHHhHEMHEMHpHHEMHEMHHXHEMHEMH`H{HEMHEMHHHGHEMHEMHPHHEMHEMHH8HEMHEMH@HHEMHEMHH(wHEMHEMH0HCHEMHEMHHHEMHEMH HHEMHEMHHHEMHEMHHsHEMHEMHH?HEMHEMHHp HEMHEMHxHHEMHEMHH`HEMHEMHhHoHEMHEMHHP;HEMHEMHXHHEMHEMHH@HEMHEMHHHHEMHEMHH0kHEMHEMH8H7HEMHEMHH HEMHEMH(HHEMHEMHHHEMHEMHHgHEMHEMHH3HEMHEMHHxHEMHEMHHHEMHEMHHhHEMHEMHpHcHEMHEMHHX/HEMHEMH`HH} UHHH}H}EHGH5H@HH5H}H8H5HhHuHhAH@4E4ȉEHhH}H5aH@H5UHH@HAH@0E0ȉEHH@H5HH5HHHHHAH@,E,ȉEHHHH5pH0HH0HAH@(E(ȉEHH0H5HH8/HH8AH@$E$ȉEH8HH5H HH HAH@ E ȉEHH H51HH(3HH(AH@EȉEH(HH5HH5HHHHHAH@EȉEHHHH5?HpH5GHHHHpHAH@EȉEHHHpH5HH5HHH`HHHH`AH@EEH`HHHuH@EH]ÉH`\H`\HhH}H`\H`\HH@[H`\H`\HHHH`\H`\HH0H`\H`\H8HH`\H`\HH [H`\H`\H(HH`\;H`\H`\HHHH`\;H`\H`\HHHp[H`\;H`\H`\H`HHHH` DUHH0'H}H}EHGH5H0HHuWHH(ΉH 1H(ΉHHHHI`ZHHH}ƉHHHHI`HHH}ƉHHHHI`HHHWH1ƉHHHHI`rHHH1HHHHI`4HHH1HHHHI`HHHWƉH1ƉHHHHI`HHH1HHHHI`FHHH1HHHHI`HHH1HHHHI`HHHƉHxHxHHI`HHpHHhHhHHI`AHH`H1HXHXHHI`HHPHHHHHHHI`HH@HƉH8H8HHI`HH0H WƉH 1ƉH(H(HHI`WHH H 1HHHHI`HHH 1HHHHI`qHHH 1HHHHI`3HHH ƉHHHHI`HHH HHHHI`HHH 1HHHHI`lHHH HHHHI`+HHH ƉHHHHI`HHHWƉH1ƉHHHHI`HHH1HHHHI`KHHH1HxHxHHI` HHpH1HhHhHHI`HH`HƉHXHXHHI`HHPHHHHHHHI`NHH@H1H8H8HHI`HH0HH(H(HHI`HH HƉHHHHI`HHH@WƉH@1ƉHHHHI`HHH@1HHHHI`HHH@1HHHHI`1HHH@1HHHHI`HHH@ƉHHHHI`HHH@HHHHI`jHHH@1HHHHI`HHH@HHHHI`KHHH@ƉHHHHI`HHHWH1ƉHxHxHHI`(HHpH1HhHhHHI`HH`H`WH`1ƉHXHXHHI`HHPH`1HHHHHHI`9HH@HWH1ƉH8H8HHI`HH0H1H(H(HHI`HH HWH1ƉHHHHI`HHH1HHHHI`HHH5HhHPHHHh,H0LEȉEHPHhH54H8H HHH8,H0LEȉEH H8H5HHHHH.H0LEȉEHHH5?HHHHH.H0LEȉEHHH5HHHHH.H0LE􋍴ȉEHHH5EHxH`HHHx.H0LE􋍤ȉEH`HxH5HHH0HHHH.H0LE􋍔ȉEH0HHH5KHHHHH.H0LE􋍄ȉEHHH5HHHHxH!H0LxtEtȉEHHH5YHHHHhH)H0LhdEdȉEHHH5HHpHHXH)H0LXTETȉEHpHH5cHXH@HHHHX(H0LHDEDȉEH@HXH5H(HHH8H(,H0L84E4ȉEHH(H5jHHHH(H,H0L($E$ȉEHHH5HHHHH,H0LEȉEHHH5nHHHHH,H0LEȉEHHH5HhHPHHHhH0LEȉEHPHhH5tH8H HHH8+H0LEȉEH H8H5HHHHHH0LEȉEHHH5zHHhHuHHhAH0EȉEHhHH5HPHHuHPHAH0EȉEHHPH5}HHXHHHXAH0EȉEHXHH5H@HH H@HAH0EȉEHH@H5}HHHHHHHAH0EȉEHHHH5H0HHH0HAH0E􋍼ȉEHH0H5}HH8HHH8AH0E􋍸ȉEH8HH5H HHH HAH0E􋍴ȉEHH H5HH(HHH(AH0E􋍰ȉEH(HHIHH+ƉH5H0HHHH0!H0LE􋍤ȉEHH0H5HHHHHH!H0LE􋍔ȉEHHH5HH`HH`AH0E􋍐ȉEH`HH5OHHHiHHHAH0E􋍌ȉEHHHH5HHPHHHHPAH0E􋍈ȉEHPHH5TH8HHH8HAH0E􋍄ȉEHH8H5HH@HHH@AH0E􋍀ȉEH@HH5ZH(HH`H(HAH0|E|ȉEHH(H5HH0HHH0AH0xExȉEH0HH5nHHHHHAH0tEtȉEHHH5HH H`HH AH0pEpȉEH HH5HHHHhH!H0LhdEdȉEHHH5HHhH`HHhAH0`E`ȉEHhHH5HPHHHPHAH0\E\ȉEHHPH5HHXHHHXAH0XEXȉEHXHH5H@HH`H@HAH0TETȉEHH@H5/HHHHHH!H0LHDEDȉEHHH5HHH`HHAH0@E@ȉEHHH5;HHHHHAH0<E<ȉEHHH5HxHHHxHAH08E8ȉEHHxH5MHHH`HHAH04E4ȉEHHH5HhHHHhHAH00E0ȉEHHhH5]HHp HHpAH0,E,ȉEHpHH5HXHHXHAH0(E(ȉEHHXH5_HH`H@HH`AH0$E$ȉEH`HH5HHHHHHAH0 E ȉEHHHH5_HHPiHHPAH0EȉEHPHH5H8HH8HAH0EȉEHH8H5]HH@SHH@AH0EȉEH@HH5H(HԹH(HAH0EȉEHH(H5_HH0UHH0AH0 E ȉEH0HH5HHHHAH0EȉEHHH5`HH ?HH AH0EȉEH HH5HHHHAH0EȉEHHH5`HH)HHAH0EȉEHHH5HHHHAH0EȉEHHH5dHpH+HpHAH0EȉEHHpH5HHxHHxAH0EȉEHxHH5jH`HHH`HAH0EȉEHH`H5HHhHHHhAH0EȉEHhHH5pHPH8HHHP$H0LEȉEH8HPuH0EHHHHHH`HH@HH HHH}H0']ÉHxtHxtHxt{Hxt[Hxt;HxtHxtHxtHxtHxtHxtHPHhoHxtH H8CHxtHHHxtHHHxtHHHxtH`HxHxtH0HHgHxtHH;HxtHHHxtHH HxtHpH HxtH@HX HxtHH(_ HxtHH3 HxtHH HxtHH HxtHPHh HxtH H8 HxtHHW HxtHxtHhH HxtHxtHHP HxtHxtHXH HxtHxtHH@W HxtHxtHHH HxtHxtHH0 HxtHxtH8H HxtHxtHH W HxtHxtH(H Hxt Hxt HxtHH0 HxtHH HxtHxtH`H? HxtHxtHHHHxtHxtHPHHxtHxtHH8HxtHxtH@H?HxtHxtHH(HxtHxtH0HHxtHxtHHHxtHxtH H?HxtHHHxtHxtHhHHxtHxtHHPHxtHxtHXHSHxtHxtHH@HxtHHHxtHxtHHHxtHxtHHgHxtHxtHHx'HxtHxtHHHxtHxtHHhHxtHxtHpHgHxtHxtHHX'HxtHxtH`HHxtHxtHHHHxtHxtHPHgHxtHxtHH8'HxtHxtH@HHxtHxtHH(HxtHxtH0HgHxtHxtHH'HxtHxtH HHxtHxtHHHxtHxtHHgHxtHxtHH'HxtHxtHHpHxtHxtHxHHxtHxtHH`gHxtHxtHhH'HxtH8HPHHHHHH`HH@HH HHH}Hx f.@UHHH}H}EHGH5-HHH57H}HHhHuHhAHEȉEHhH}H5ªH@HH@HAHEȉEHH@H5JHHH1HHHAHEȉEHHHH5֩H0H1H0HAHEȉEHH0H5aHH8HH8AHEȉEH8HH5H HH HAHEȉEHH H5qHH(1HH(AHEȉEH(HH5HHHHAHEȉEHHH5HH1HHAHEȉEHHH5HHHHAHEȉEHHH5HxH1HxHAHEȉEHHxH5(HHHHAHEȉEHHH5HhHHhHAHEȉEHHhH56HHpHHpE1HEȉEHpHH5HXHW fHHHXHE1HEȉEHHXH5$HHPךHHPE1HEȉEHPHH5H8HXH8HE1HE􋍼ȉEHH8H5<HH@ٙHH@E1HE􋍸ȉEH@HH5ȢH(HbH(HE1HE􋍴ȉEHH(H5XHH0HH0E1HE􋍰ȉEH0HH5HHdHHE1HE􋍬ȉEHHH5sHH HH E1HE􋍨ȉEH HH5HHv vHHHHE1HE􋍤ȉEHHH5hHpHW HHHpHE1HE􋍠ȉEHHpH5ןHHXW HhHXHHhE1HE􋍜ȉEHhHH5FH@HWHWHHHHH@HE1HE􋍄ȉEHH@H5SHHŔxxDžHHphhpHHHHE1HdEdȉEHHH5pHHXW HhHXHHhE1H`E`ȉEHhHH5H@HW HHH@HHA\E\ȉEHH@H5LHH(W SH8H(HH8E1HXEXȉEH8HH5HHW HHHHAHTETȉEHHH5)HxHW HHHxHE1HPEPȉEHHxH5HH`W HpH`HHpAHLELȉEHpHH5 HHHW HHHHHE1HHEHȉEHHHH5{HH0W KH@H0HH@E1HDEDȉEH@HH5HHWHHHHE1H@E@ȉEHHH5^HHWHHHHE1H<E<ȉEHHH5̗HHh HxHhHHxHA8E8ȉEHxHH52HPH׌ 'HHHPHE1H4E4ȉEHHPH5HH8@ HHH8HHHE1H0E0ȉEHHHH5H HW HHH HHA,E,ȉEHH H5mHH MHHHHAH(E(ȉEHHH5ԔHHpc HHpHHAH$E$ȉEHHH5<HXH HHHXHE1H E ȉEHHXH5HH@ HPH@HHPE1HEȉEHPHH5H(H HHH(HE1HEȉEHH(H5HH $H HHH AHEEH HuHEH]ÉH`\H`\HhH}{ H`\H`\HH@; H`\H`\HHH H`\H`\HH0 H`\H`\H8H{ H`\H`\HH ; H`\H`\H(H H`\H`\HH H`\H`\HH{ H`\H`\HH; H`\H`\HHxH`\H`\HHH`\H`\HHh{H`\H`\HpH;H`\H`\HHXH`\H`\HPHH`\H`\HH8{H`\H`\H@H;H`\H`\HH(H`\H`\H0HH`\H`\HH{H`\H`\H H;H`\H`\HHH`\H`\HHpH`\H`\HhH{H`\H`\HH@;H`\H`\HHH`\H`\HhHH`\H`\HH@{H`\H`\H8H;H`\H`\HHH`\H`\HHxH`\H`\HpH{H`\H`\HHH;H`\H`\H@HH`\H`\HHH`\H`\HH{H`\H`\HxH;H`\H`\HHPH`\H`\HHHH`\H`\HH {H`\H`\HH;H`\H`\HHH`\H`\HHXH`\H`\HPH{H`\H`\HH(;H`\H`\H HH` DUHHH}H}EHGH5HHH5H}HHHEHH,HHLEȉEH}H}H5H}HHuHH,HHLEȉEH}H}H5HhHHPHH.HHLE􋍼ȉEHPHhH5H8HH HH.HHLE􋍤ȉEH H8H5HHHHH.HHLE􋍌ȉEHHH5HHHHHx.HHLxtEtȉEHHH5HHhHHH`.HHhL`\E\ȉEHHH5HxHPH`HHH.HHPLHDEDȉEH`HxH5%HHH8H0HH0HH8L0,E,ȉEH0HHH5HH HHH HH LEȉEHHH5/HHHHH(HHLEȉEHHH5HHHHH(HHLEȉEHHH52HHHpHH(HHLEȉEHpHH5HXHH@HH(HHLE􋍴ȉEH@HXH55H(HHHH*HHLE􋍜ȉEHH(H5HHHHHHHLE􋍄ȉEHHHpWHx1HxƉHpHpHHI`FsHHhHp1H`H`HHI`sHHXHp1HPHPHHI`rHHHH5KHXHHpHXHAHDEDȉEHHXHp1ƉH8H8HHI`qHH0Hp1H(H(HHI`qHH Hp1HHHHI`kqHHH5HH`HpHH`1AH E ȉEH`HHp1ƉHHHHI`pHHHp1HHHHI`mpHHHp1HHHHI`/pHHH5HHHHpHHHAHEȉEHHHH5$HHPyoHHPAHEȉEHPHH5H8HnH8HAHEȉEHH8H52HH@1HH@AHEȉEH@HH5~H(HH(HAHEȉEHH(H5;~HH0fmHH0AHEȉEH0HH5}HHlHHAHE􋍼ȉEHHH5O}HH XlHH AHE􋍸ȉEH HH5|HHkHHAHE􋍴ȉEHHH5W|HHRkHHAHE􋍰ȉEHHH5{HHjHHAHE􋍬ȉEHHH5]{HpHLjHpHAHE􋍨ȉEHHpH5zHHxiHHxAHE􋍤ȉEHxHH5ezH`H>iH`HAHE􋍠ȉEHH`H5GpHHhhHHhAHE􋍜ȉEHhHH5oHPH(hHPHAHE􋍘ȉEHHPH5EoHHXgHHXAHE􋍔ȉEHXHH5TxH@HgH@HAHE􋍐ȉEHH@H5wHHHfHHHAHE􋍌ȉEHHHH5TwH0H fH0HAHE􋍈ȉEHH0H5vHH8}eHH8AHE􋍄ȉEH8HH5TvH HdH HAHE􋍀ȉEHH H5uHH(odHH(AH|E|ȉEH(HH5XuHHcHHAHxExȉEHHH5tHHacHHAHtEtȉEHHH5`tHHbHHAHpEpȉEHHH5sHxH[bHxHAHlElȉEHHxH5lsHHaHHAHhEhȉEHHH5rHhHeaHhHAHdEdȉEHHhH5nrHHp`HHpAH`E`ȉEHpHH5qHXH_`HXHAH\E\ȉEHHXH5pqHH`_HH`AHXEXȉEH`HH5pHHHY_HHHAHTETȉEHHHH5rpHHP^HHPAHPEPȉEHPHH5oH8H]H8HAHLELȉEHH8H5toHH@HH@AHHEHȉEH@HH5oH(HH(HAHDEDȉEHH(H5nHH0HH0AH@E@ȉEH0HH5nHHHHAH<E<ȉEHHH5mHH HH AH8E8ȉEH HHp1ƉH0H0HHI` [HH(Hp1H H HHI`WHHHp1HHHHI`WHHH5klHHHpHHAHEȉEHHH5kHHHpHHAHEȉEHHuHEHpH]ÉHEMH}H}9 HEMH}H} HEMHPHh HEMH H8 HEMHH HEMHH HEMHH[ HEMH`Hx5 HEMH0HH HEMHH HEMHH HEMHH HEMHpHw HEMH@HXQ HEMHH(+ HEMHH HEMHEMHEMHHXHEMHEMH`HHEMHEMHHHOHEMHEMHPHHEMHEMHH8HEMHEMH@HHEMHEMHH(HEMHEMH0HKHEMHEMHHHEMHEMH HHEMHEMHHHEMHEMHH{HEMHEMHHGHEMHEMHHpHEMHEMHxHHEMHEMHH`HEMHEMHhHwHEMHEMHHPCHEMHEMHXHHEMHEMHH@HEMHEMHHHHEMHEMHH0sHEMHEMH8H?HEMHEMHH HEMHEMH(HHEMHEMHHHEMHEMHHoHEMHEMHH;HEMHEMHHxHEMHEMHHHEMHEMHHhHEMHEMHpHkHEMHEMHHX7HEMHEMH`HHEMHEMHHHHEMHEMHPHHEMHEMHH8gHEMHEMH@H3HEMHEMHH(HEMHEMH0HHEMHEMHHHEMHEMH HcHEMHEMHH/HEMHEMHHHpH} UHH#H}H}EHGH5_HHH?HuH5_H}HH`MHuH`AHE􋍔ȉEH`H}H5-_H8H MH8HAHE􋍐ȉEHH8H5^HH@LHH@AHE􋍌ȉEH@HH52^H(HLH(HAHE􋍈ȉEHH(H5]HH0KHH0AHE􋍄ȉEH0HH59]HH$KHHAHE􋍀ȉEHHH5\HH JHH AH|E|ȉEH HH5K\HH0JHHAHxExȉEHHH5[HHIHHAHtEtȉEHHH5_[HH4IHHAHpEpȉEHHH5ZHpHHHpHAHlElȉEHHpH5sZHHx8HHHxAHhEhȉEHxHH5YH`HGH`HAHdEdȉEHH`H5{YHHhFHHhAH`E`ȉEHhHH5YHPHrFHPHAH\E\ȉEHHPH5XHHX8FHHXAHXEXȉEHXHH5XH@HEH@HAHTETȉEHH@H5WHHHHH`AHEȉEH`HH5PHHHP>HHHAHEȉEHHHH5jPHHP=HHPAHEȉEHPHH5OH8H\=H8HAHEȉEHH8H5sOHH@<HH@AH E ȉEH@HH5NH(Hh<H(HAHEȉEHH(H5|NHH0;HH0AHEȉEH0HH5NHHWHHAHEȉEHHH5MHHHxHH-HHLEȉEHxHH5MH`H1H`HAHEȉEHH`H5LHHh1HHhAHEEHhHHPH5AL19Mf.Ȉ%\9Mf. ȈȃHHPHAHEȉEHHPH5KHHXHHXAHEȉEHXHH5KH@HH@HAHEȉEHH@H5JHHH1HHHAHEȉEHHHH5JH0H1H0HAHEȉEHH0H5IHH81HH8AHEȉEH8HH5)IH HH HAHEȉEHH H5HHH(HH(AHEȉEH(HH55HHH1HHAHE􋍼ȉEHHH5GHHHHAHE􋍸ȉEHHH5DGHHHHAHE􋍴ȉEHHH5FHxH1HxHAHE􋍰ȉEHHxH5SFHH1HHAHE􋍬ȉEHHH5EHhH1HhHAHE􋍨ȉEHHhH5zEHHpHHpAHE􋍤ȉEHpHH5 EHXHHXHAHE􋍠ȉEHHXH5DHH`1HH`AHE􋍜ȉEH`HH5/DHHHHHHAHE􋍘ȉEHHHH5CHHP_0HHPAHE􋍔ȉEHPHH5KCH8H/H8HAHE􋍐ȉEHH8H5l=HH@.HH@AHE􋍌ȉEH@HH5<H(Hy.H(HAHE􋍈ȉEHH(H5AHH0g.HH0AHE􋍄ȉEH0HH5WAHHHHAHEEHHuHEHĀ#]ÉHXTHXTH`H}HXTHXTHH8HXTHXTH@HgHXTHXTHH('HXTHXTH0HHXTHXTHHHXTHXTH HgHXTHXTHH'HXTHXTHH HXTHXTHH HXTHXTHHpg HXTHXTHxH' HXTHXTHH` HXTHXTHhH HXTHXTHHPg HXTHXTHXH' HXTHXTHH@ HXTHXTHHH HXTHXTHH0g HXTHXTH8H' HXTHXTHH HXTHXTH(H HXTHXTHHg HXTHXTHH' HXTHXTHH HXTHXTHHx HXTHXTHHg HXTHXTHHh' HXTHXTHpHHXTHXTHHXHXTHXTH`HgHXTHXTHHH'HXTHXTHPHHXTHXTHH8HXTHXTH@HgHXTHXTHH('HXTHXTH0HHXTHXTHHHXTHxH{HXTHXTHH`;HXTHXTHhHHXTHXTHHPHXTHXTHXH{HXTHXTHH@;HXTHXTHHHHXTHXTHH0HXTHXTH8H{HXTHXTHH ;HXTHXTH(HHXTHXTHHHXTHXTHH{HXTHXTHH;HXTHXTHHxHXTHXTHHHXTHXTHHh{HXTHXTHpH;HXTHXTHHXHXTHXTH`HHXTHXTHHH{HXTHXTHPH;HXTHXTHH8HXTHXTH@HHXTHXTHH({HXTHXTH0H;HXTHXTHHHX DUHHP H}H}EHGH5*HHH5$*H}HHhHuHhAH E ȉEHhH}H5)H@HrH@HAHEȉEHH@H5%)HHHHHH1AHEȉEHHHH5(H0HH0HAHEȉEHH0H5,(HH8HH8AHEȉEH8HH5'H HH HAHEȉEHH H55'HH( HH(AHEȉEH(HH5&HHHHAHEȉEHHH5<&HHHHAHEȉEHHH5%HHHHAHEȉEHHH5A%HxHHxHAHEȉEHHxH5$HHHHAHEȉEHHH5I$HhHHhHAHEȉEHHhH5#HHpHHpAHEȉEHpHH5#HXHHXH1AHEȉEHHXH5"HH`HH`1AHEȉEH`HH5Z"HHH-HHHAHEȉEHHHH5!HHPHHPAHEȉEHPHH5]!H8HH HH%HHLEEH H8uHEHP ]ÉH`\H`\HhH}gH`\H`\HH@'H`\H`\HHHH`\H`\HH0H`\H`\H8HgH`\H`\HH 'H`\H`\H(HH`\H`\HHH`\H`\HHgH`\H`\HH'H`\H`\HHxH`\H`\HHH`\H`\HHhgH`\H`\HpH'H`\H`\HHXH`\H`\H`HH`\H`\HHHgH`\H`\HPH'H`\H H8H` UHH H}H}EHGH5HHH?HuH@HuH5H}HHXHuHXAHE􋍤ȉEHXH}H5^H0HH0HAHE􋍠ȉEHH0H5HH8 HH8AHE􋍜ȉEH8HH5hH H* H HAHE􋍘ȉEHH H5HE( fH(HH(AHE􋍔ȉEH(HH5mHE( fHHHAHE􋍐ȉEHHH5HEHHHAHE􋍌ȉEHHH5oHEXHHHAHE􋍈ȉEHHH5HxH HxHAHE􋍄ȉEHHxH5wHH HHAHE􋍀ȉEHHH5HhH HhHAH|E|ȉEHHhH5}HHp$ HHpAHxExȉEHpHH5HXHHXH1AHtEtȉEHHXH5HH` HH`AHpEpȉEH`HH5 HHHHHHAHlElȉEHHHH5HHP/HHPAHhEhȉEHPHH5H8HuH8HAHdEdȉEHH8H5HH@3HH@AH`E`ȉEH@HH5H(E {X((XP(P( 1fXH(H\H(H(HAHDDEEHH(uHEH ]ÉHPLHPLHXH}{HPLHPLHH0;HPLHPLH8HHPLHPLHH HPLHPLH(H{HPLHPLHH;HPLHPLHHHPLHPLHHHPLHPLHHx{HPLHPLHH;HPLHPLHHhHPLHPLHpHHPLHPLHHX{HPLHPLH`H;HPLHPLHHHHPLHPLHPHHPLHPLHH8{HPLHPLH@H;HPLHPLHH(HP f.UHHH}H}EHGH5 HHH5& H}HHHEHHHHLEȉEH}H}H5 H}HHuHHHHLEȉEH}H}H59 HhHHPHHHHLE􋍬ȉEHPHhH5 H8H,H8HAHE􋍨ȉEHH8H5J HH@HH@AHE􋍤ȉEH@HH5 H(H8H(HAHE􋍠ȉEHH(H5v HH0WHH0AHE􋍜ȉEH0HH5 HHAHHAHE􋍘ȉEHHH5 HH HH AHE􋍔ȉEH HH5 HHMHHAHE􋍐ȉEHHH5HHHHAHE􋍌ȉEHHH58HHQHHAHE􋍈ȉEHHH5HpHHpHAHEEHHpuHEHĀ]ÉHEMH}H}IHEMH}H})HEMHPHhHEMHEMHH8HEMHEMH@HHEMHEMHH(gHEMHEMH0H3HEMHEMHHHEMHEMH HHEMHEMHHHEMHEMHHcHEMHEMHH/HEMHEMHHpH} fUHHH}H}EHGH5HHH5H}HHHEHH HHLEȉEH}H}H5RH}HHuHH HHLEȉEH}H}H5HhHHPHH HHLEȉEHPHhH5\H8HH HH HHLE􋍬ȉEH H8H5HHHHH HHLE􋍔ȉEHHH5bHHHHH HHL|E|ȉEHHH5HH8HH8AHxExȉEH8HH5{H H H HAHtEtȉEHH H5HH(HH(AHpEpȉEH(HH5HHHHAHlElȉEHHH5HHHHAHhhEEHHuHEHĠ]ÉHEMH}H}HEMH}H}HEMHPHhqHEMH H8KHEMHH%HEMHHHEMHEMH8HHEMHEMHH HEMHEMH(HcHEMHEMHH/HEMHEMHHH} f.UHHP H}H}EHGH5hHHH5jH}HHhHuHhAH E ȉEHhH}H5 H@HZH@HAHEȉEHH@H5s HHHHHHAHEȉEHHHH5 H0HNH0HAHEȉEHH0H5t HH8HH8AHEȉEH8HH5 H HRH HAHEȉEHH H5z HH(HH(AHEȉEH(HH5 HHVHHAHEȉEHHH5 HHHHAHEȉEHHH5 HHbHHAHEȉEHHH5 HxHHxHAHEȉEHHxH5N HHnHHAHEȉEHHH5HhHHPHHHH‰LEȉEHPHhH5H8H5HH8HAHEȉEHH8H5HH@HH@AHEȉEH@HH5H(H1H(HAHEȉEHH(H5!HH0HH0AHE􋍼ȉEH0HH5HH1HHAHE􋍸ȉEHHH51HH HH AHEEH HuHEHP ]ÉH`\H`\HhH}gH`\H`\HH@'H`\H`\HHHH`\H`\HH0H`\H`\H8HgH`\H`\HH 'H`\H`\H(HH`\H`\HHH`\H`\HHgH`\H`\HH'H`\H`\HHxH`\H`\HHH`\HPHh{H`\H`\HH8;H`\H`\H@HH`\H`\HH(H`\H`\H0H{H`\H`\HH;H`\H`\H HH` f.@UHH H}H}EHGH5KHHH5UH}HHHEHHHHLEȉEH}H}H5H}HHuHHHHLE􋍴ȉEH}H}H5HhHHPHHHHLE􋍜ȉEHPHhH50H8HH HHHHLE􋍄ȉEH H8H5HHxHHHpHHxLplElȉEHHH5:HH`HHHXHH`LXTETȉEHHH5HHHHHH@HHHL@<E<ȉEHHH5:HxH0H`HH(HH0L($E$ȉEH`HxH5HHHH0HHHHL E ȉEH0HHH50HHHHHHHLEȉEHHH5HHHHHHHLEȉEHHH50HHHHHHHLEȉEHHH5HHHpHHHHLE􋍬ȉEHpHH5:HXHH@HHHHLE􋍔ȉEH@HXH5H(HHHHHHL|E|ȉEHH(H5DHHpHHHhHHpLhdEdȉEHHH5HHXHHHPHHXLPLELȉEHHH5PHH@HHH8HH@L84E4ȉEHHH5HhH(HPHH HH(L EȉEHPHhH5|H8HH HHHH‰LEȉEH H8H5HHHHH!HHLEEHHuHEH ]ÉHEMH}H}HEMH}H}HEMHPHhHEMH H8HEMHH[HEMHH5HEMHHHEMH`HxHEMH0HHHEMHHHEMHHwHEMHHQHEMHpH+HEMH@HXHEMHH(HEMHHHEMHHHEMHHmHEMHPHhGHEMH H8!HEMHHH} @UHHH}H}H]DUHHH}H}H]DUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH HHHEH HH H7LHH0HxvHHHHpHxPHHHHpHx*HHxHxHpHxHHH5H`HpHHH0H`HHpHH`HH5qHHhHHHHHHhHHHH5HH`HHHXHHXH`HXHHH5H@HXHHuHH@HHXHH@HWH1ƉHPHPHHI`HHHH1H@H@HHI`wHH8H1H0H0HHI`9HH(HWH1ƉH H HHI`HHH1HHHHI`HHH1HHHHI`GHHHWH1ƉHHHHI`HHH1HHHHI`HHH1HHHHI`]HHH1HHHHI`7HHH8WH81ƉHHHHI`HHH81HHHHIp1HHH81HHHHIpHHHWƉH1ƉHHHHI`HHxHƉHpHpHHI`HHhHƉH`H`HHI`<HHXHXWƉHX1ƉHPHPHHI`HHHHX1H@H@HHI`HH8HX1H0H0HHI`^HH(HX1H H HHI`(HHHXƉHHHHI`HHHXHHHHI`HHHX1HHHHI`iHHHXHHHHI`(HHHXƉHHHHI`HHHH5EH@HHHHH@HHHH@HH5pHHHHHXHHHHHHH5HHHH8HHH8HH8HHH5H HHHHH HHHH HH5HHHHxHHHxHHxHHH5H`HHHH8H`HHHH`HHHHHHHHXHH8HHHH0HHHHHHHHxHxHH9HHH!HHxHH9Hp8HpHHHhHhHH9HpH;HHHH`HHHHHHHXH{HHHH@;HHHHHH{HHHH@;HHHHHHH8HHHHH {HHHxH;HHHH`HXHH8HHHH0HHH`HXHXHHHPHPH`H9HXH95HHHLHLH9HHxH5H@H5zH@H8HH8H0H5JH0H(H$H($HH5HHHHHO.H9HHxH5:HH5IHHHHHH5%HHHHHH5HHHHHH@HHHHHHHHxH5HH5HHHHHH5HHHHHHHHHH5VHHHHHxHtp1tp9Јo[n:Hhdhd9ˆnnoo1ɨEщ,ZHHxH5*HH5HHHH5{Dž,HX,H H HUH9щT,TH ]H HHH UHHH}HuH}HuH]f.UHHH}H}H]DUHH0H}uH}}H},HEHxH5HH5HEAHEHxH5uHHH5HH5HEH0]f.fUHHH}H}HH]fUHHH}H}H]DUHH0LLMLUH0H($'D H0  DžLH0MHLHHLHvHHHHpHH9HHH7HHHHHHHHHHpHܷHHHHpHHHHHpHHHHHpHjHHWƉH1ƉHHHHI`HHHƉHHHHI`HHHƉHHHHI`\HHHWƉH1ƉHHHHI`HHxH1HpHpHHI`HHhH1H`H`HHI`~HHXH1HPHPHHI`PHHHHƉH@H@HHI`HH8HH0H0HHI`ϴHH(H1H H HHI`HHHHHHHI`PHHHƉHHHHI`HHH`HHHHHHHHHHHPHHHHHHHHHHHH5VHHHHHHHHHHH5޴HHHHHHHHHHHHHH5fH0HHpHH0HHHH0HH5HHHHHHHHHHH5fHpHHPH(HpH(HH(HpHH5HHHHHHHHHHH5HHHhHHHhHHhHHH5HPHHHPHHHHPHH5HHHXHHXHHXHHH5H@HxH-H@HHxHH@H`WH`1ƉHpHpHHI`HHhH`1H`H`HHI`QHHXH`1HPHPHHI`HHHHWH1ƉH@H@HHI`ͬHH8H1H0H0HHI`oHH(H1H H HHI`!HHHH5HHHH`HHHHHHH5HxHH0HHxH0HH0HxH@HHPHHHHHvHHHHpHH9HH H@H@xH@H HHS SHHH@xHHH #H H H@xHHHH5HHHH@HHHHHHH5HHHH@HH@HH@HHH5H(HH HH(HHHH(HH(HHHHHpHHHpHHpHXHHHXH1HXHHHHX1HHHHhHH0HhHHhH7HHHxHHpHxHpHHxHhHxHH`HH`HHHXHHHPHHPH}HHHH ;HH@H@HHH8H8HHHHHH9H; HHxH5H0 H0H(H5H(H HH HH55HHH HHH9H8HHHHHHH9HdH H HH HHH9H8HHHHHHH9HH H H H HH HH HyH HYH H HHH H HHHH H HH0H H HHYH H H(HpH H HHH H HhHH H HHPYH H HXHH H HH@H H H H HHYH H H0HxH HHH9H8HHHHHHH9HH ?H H HH H H H@H H H HH( H Hp_ H ? H  H Hh H H Hx H H H H HHHЈH0H0H҈1‹9ƈHHHш1‹9ƈHHHш1‹9ƈEH}HMHшȋ9@@$^HHxH5HH(HHH5żHHHHHЈHHH5HHH0H0HЈHHxH5 HxHpHHHЈooHpH`H5H`HXHHHЈWWHXHHH5\HHH@H}HEHЈ??H@H0H5bH0H(Dž<Džzc)H''ȃcH ȋ 9zHHxH5+HH(HHH5HHDž<DžHHHHcHHH1H0H1HH1hHH1,HuH$ƅDž|Džxx;|HHcxHkpHHH\(fHcxHkpHHHY(3ff.$Ȋ$!ʃ$xxƅDžtDžpp;trHHcpHkpHHH\(UfHV瞯HvHuH}Hu*HuWHHuH}HuEMEMHP]f.UHHH}H}Hȃm$H]UHHH}H}HEMfEEiM EcME$H]DUHHE}E}*H]fUHEE( ;f]DUHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHHH}H}EEH}EH}EU9HcuH}HEHEHHPHuHHHHHMHuQHEHHUHH HM=HEME9ȉECH}HEHEHxHuHMHxHHuHxHpH5HpHhH}H}HHEH`HHXH`HXHPH5HPHHH}}HEHxH55HHH5HH5H@M9~H}HEHEHxHMHHRH8HH8HH0H5H0H(H}H}H}HH5H HH}HEHEHEH}ЉEEEEHEMHEMHEMHEMH}tHEHxH5uHHH55HHH5HH5HH]H} HH@UHH}H}HGH?H)H]@UHH}HuHuH6H}HHH]f.UHHH}H}HH5HH5HEfPH$UHHH}HuH}UH]UHH H}H}HEHHIHH}HǾ H}H}HEHMHEHH ]UHH H}HuH}HuH}HH}HEH}HuHH ]fUHHH}H}H]DUHHH}HuH}Hu4$H]fDUHHH}HuH}HuH]f.UHHH}H}HH]fUHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH0H}HuHuH~HH}HHuHuH;0bH}HuHUHHUHzHEHUH}HH}HEHPH€HP HuH}H0]UHHH}H}HH]fUHH}HuHuH6Hi}HH]f.UHHH}HuH}HuH]f.UHH H}H}H}HEH}HuH}H}H ]HHUUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHH H}HuHuHHEHuHHuHEHH ]UHH@H}EH}HuH]@UHH H}HuH}HuH ]f.UHHH}H}H]DUHHH}HuHUH}HUH2H}HHUH2H׉MDEA9 EHEHHHMH9H}HHMEU9 EH}EEHMHHωEu9EEHMHHωEu9lHEu܋UHHHMu܋UH9H}HHMHEH}HuH EE؃EsE܃E8EHEHHHEHHE P{U\({fMHEHHU {Y( {fEH}HuMf.€UE$HĀ]f.UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HH}HH)HH]UHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH}HE]fUHH H}HuH}HuH ]f.UHH}Hu]fUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}EMH}EEG]DUHHH}H}HH}HH5Ø HHHƐHH}HHwPH]f.UHH0H}Hu`HuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}H}H]DUHHH}H}H}H}H]UHH`H}HuHUM}4H=H5H IH}H8H}HHEEHEHHH8H}HHEEEXEH}EH8H}HEHEP`HEH`]f.fUHH}HL]f.DUHH}H}Hǰ]f.UHH}H}Hǰ]f.UHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHƐHH}HHwPH ]UHH H}HuHuHHEHuHHEHPHuHPHHHHƐHH}HHwPHEH@XHGXH ]f.DUHH H}HuHuHHEHuHHHHuHHEHx@H~@H@HHFHH ]f.UHHHH}HuHuH]UHH} fDUHH} fDUHHH}H}H]DUHH}H}H?H]f.fUHHH}H}H?4H}H=H5H ՔHEHHH]fUHH1H}H}HH}HǾ HՔHHHUHH]f.UHH0H}HuPHuHHH}HHEHuHHEH0]ÉHEMH}H} UHHH}H}H]DUHHH}H}H}H}H]UHH0H}HuHUMH}HHWR`HEH0]f.UHH}H]f.DUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H}H}H]UHH}]fDUHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HHUH2H)HHH]UHH0H}HuHuH~H}HuHEH;E7H}H}HǀH}HEH}HHEHMHAH0]HHUf.UHH H}HuH}HuH ]f.UHH}HE]fUHH H}HuH}HuH ]f.UHH H}HuHuH>H}HHuH ]fDUHH H}HuHUH}H ]HHUDUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHHH}H}HH]f.UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UH}uu;u$]fDUH]DUHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHH H}HuHuHHuHuH}HuH}HuHH ]fUHH H}H}H}H}H ]HHUUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}H]DUHH}HE]fUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH@H}H}EH}H}Wf.$E ^EtEWf. E@E ^EH}MH}TH}4H}Wf.HEHHMH@HEkH}EEME(MYEUE(MMYH}EEMH@]f.@UHHH}HuH}EH}EH}EH}EEYEEEYEEEYEEEYEEE\EEEXEEE*EEEE(E~\WMx ExxM(\f(\ffEE\WphphhM(l\f(q\ffEEE( 1\fEEE( \fEEEE.E-[W`X`XXM(~[f([ffEEZWPHPHHM([f([ffEEE( ZfEEE( ZfEEEE;E)EEEE( 'ZfEEE( YfEEE( YfEEE( YfEEEMXMYMUYU\(YUMYMUYUXYEEMH}EMH]@UHH0H}H}H}EH}ME(MEMH0]f.UHH}H}G]f.UH XEE(Xff. $]f.fUHH}H}]f.@UH WEE(CXff.$]ÐUHEEf.$]@UHH H}H}H}EME(MH ]UHH H}H}H}EME(MH ]UHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUHH@HuHFHH ]UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHHH}H}H]DUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHuHUH} HEHEHEHEHEH ]UHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H=oHMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH01AH}HuHUHMHMHUH)HHMHMHUH2I)ILH2H}HEHHMHUHHHH0]fUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH}]fDUHH}HuHUHMLE]fDUHHH}H}H?H]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH@H}HuH}HEHEH}HEHuH9 EH}HEH}HEH}"H}HuHUMaH}MHEHE9 E2HEHHEHEHHEHEHHEEE$H@]f.UHH H}HuHUH} EH}HuHUEEH ]UHH H}HuH}HuH ]HHUf.fUHHH}HuH}HuH]f.UHH H}HuHuH}HuH}HH ]f.UHH}HE]fUHH H}HuHuH}HuHHuHH ]f.DUHH1H}H}H]ÐUHHH}H}H]DUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUH帀H}H}HWH?H)HHH]fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHHH}H}H]DUHH H}H}H ]DUHHH}H}HH]ÐUHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHiUHHAHAHHiUHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H= \Hi}H ]UHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHiH}HHEH}HH}HEHiH}HHEH}HH}HEHiH}HHEH}HHuHUHMLEHP]UHH0H}HuHUHMHEH;E[H}HEHHH}HH}HǀH}HEH}HuHHEHH€HH0]fUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHiHuHH}HuH}HEHiHuHH}HuHiuHH}HuHUHMIH@]f.UHH}]fDUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HHUH2H)HHH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A>H}H}HOHHOHHEH}HH0]HHUfDUHHH}H}HH]ÐUHHH}H}H]DUHHPH}HuHuHHuH}HEH}HEHiHuHH}HuHiuHH}HEH}HEHiHuHH}HEHuHHUHMLEHP]fUHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHu HEHHQH ]f.UHH}H}H]f.DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHU f.$] 48IIbz< 8  ;  ;        /R  a! ! "!A" " #"?# # $$@$ $ %%@% & &&A& ' ''A' ( ((?( ) ))@) * **@* + ++A+ , ,,A- - --?. . ..@/ / //@0 0 00A1 1 11A2 2 32?3 3 43@4 4 55@5 6 66A6 7 77?7 8 88@8 9 99@9 : ::A: ; ;;?; < <<@= = ==@> > >>A? ? ???@ @ @@@A A BA@B B CBAC C DD?D E EE@E F FF@F G GGAG H HH?H I II@I J JJ@J K KKAL L LL?M M MM@N N NN@OE Oll2               2 :2ee$MU$M[$Ma$Na$Na$NDN$Oa!Oa!O a !O a !P a $P a $P a$Qa$Qa$Qa$Qa$Ra$Ra$Ra$Sa$Sa$Sa$Ta$Ta$Ta$Ta$Ua$Ua$Ua$Va $V!a!$V"a"$W#a#$W$a$$W%a%$W&a&$X'a($X(a)$X)a*$Y*a+$Y+a,$Y,a-$Y-a.$Z.a/$Z/a0$Z0a1$[1a2$[2a3$[3a4$\4a5$\5a6$\6a7!\7a8$]8a9$]9a:$]:a;$^a>$_?a?$_@a@$_AaA$_BaB$`CaD$`DaE$`EaF$aFaG$aGaH$aHaI$bIaJ$bJaK$bKaL$bLee$U$>%D% D % D % D!%!D!%!D!%" D " %" D " %" D # %# D # %# D # %$D$%$D$%$D%%%D%%%D%%&D&%&D&%&D'%'D'%'D(%(D(%(D(%(D)%)D)%)D*%*D*%*  ss$`X$a^$aa$aa$aa$ba$ba$ba $c a $c a $c a $d a $d Dd%dDe%eDe%eDe%eDf%fDf%fDg%gDg%gDg%hDh%hDh%hDi%iDi%iDi%jDj%jDj%jDk%kDk%kD k %l D!l!%l!D"l"%l"D#m#%m#D$m$%m$D%m%%n%D&n&%n&D'n'%n'D(o(%o(D)o)%o)D*p*%p*D+p+%p+D,p,%p,D-q-%q-D.q.%q.D/r/%r/D0r0%r0D1r1%r2D2s2%s3D3s3%s4D4t4%t5D5t5%t6D6t6%u7D7u7%u8D8u8%u9D9v9%v:D:v:%v;D;v;%wD>x>%x?D?x?%x@D@x@%yADAyA%yBDByB%yCDCzC%zDDDzE%zEDEzF%{FDF{G%{GDG{H%{HDH|I%|IDI|J%|JDJ}K%}KDK}L%}LDL}M%}MDM~N%~NDN~O%~ODOP%PDQQ%QDRR%RDSS%SDT׀T%TDUU%UDVV%́VDWW%WDXX%XDYۂY%YDZZ%ZD[Ã[%у[D\\%\D]]%]t^ ߄^%_n_ _%`%KK c" A % D % D % D % D%D%D%P  % P   %  ZZghh hhhhiii$ii$i i $j!i!$j"i"$j#i#$k$i$$k%i%$k&i&$l'i'$l(i($l)i)$m*i*$m+i+$n,i,$n-i-$n.i/$o/i0$o0i1$o1i1p2%p2i2p3%p3i3q4%q4i4q5%q5i6r6%r6i7r7%r7i8s8%s8i9s9%s:i:t:%t;i;t;t;$t<t<$u=t=u>%u>t>v?%v?t?v@%v@t@wA%wAtBwB%wBtCxC%xCtDxD%xDtEyE%yFtFyF%yGtG$zHtHzH%zItIzI%{JtJ{J%{KtK{K%|LtL$|MtM|M%|NtN}N%}OtO}O%}PtP~P%~QtQ~Q%~RtRR%StSS%TtTU%UtUV%VtVW%WtWX%XtYY%YtZZ%Zt[[%\t\\%]t]]%^t^^%_t__%`t``%ataa%btbb%ctcc%dtdd%ete$f tf#KK6a"6A7%7D7%7D8%8D8%8D9%9D9%9D:%:D:%:D ; %; D ; %; D < %< D < %< D = "= D/="=D>">D>">D?"?D?"?D@"@D@"@DA"AD4A"AD/B"BD/B"BDC"CDC"CD/D"DD/D$DD /E "E!D!/E"%E"D"/F#"F#D$/F$%F$D%/G%"G%D&/G&"G'D'/H("H(D(/H)"H)D*4I*$I*D+4I+"I,D,4J-"J-D-/J.$J.D/4K/%K/D04K0%K1D14L2"L2D24L3"L3D44M4"M4D54M5%M6ee$FU$F[$Fa$Fa$Ga$Ga$Ga$Ha$H a $H a $I a $I a $I a$Ia$Ja$JLJJ%KJK"KJK%KJL%LJL%LJL%MJM%MJM%MJN%NJN%N J N %O!J!O!%O"J"O"%O#J#P#%P$J$P%%P%J%Q&%Q&J&Q'%Q'J(Q(%Q(J)R)%R)J*R*%R*J+S+%S,J,S,%S-J-S-%S.J.T.%T/J/T/%T0J0U0%U1J1U1%U2J2U2%V3J3V3%V4J4V4%V5J5W5%W6J6W6%W7J7W8%X8J8X9%X9J9X:%X:J:Y;%Y;J<Y<%Y<J=Y=%Z=J>Z>%Z>J?Z?%Z@J@[@%[AJA[A%[BJC[D%\DJD\E%\E JEYYBr"BAC%CDC%CDD%DDD%DDE%EDE%EDF%FDF%F D G %G D G %G D H %H D H %H D I%IDI%IDJ%JDJ%JDK%KDK%KDL%LDL%LDM%MDM%MDN%NDN%NDO%ODO%ODP%PDP%PDQ%QDQ%QD R %R D!R!%R!D"S"%S"D#S#%S#D$T$%T$D%T%%T%D&U&%U&a'$U'D(U(%V(D)V)%V)*V*%W+D+W+%W,D,W,%X-D-X-%X.D.X.%Y/D/Y/%Y0D0Y0%Z1D1Z1%Z2D2Z2%[3D3[3%[4D4[4%\5D5\5%\6D6\6%]7D7]7%]7D8]8%^8D9^9%^9D:^:%_:D;_;%_;D<_<%``>%a>D?a?%a?D@a@%bADAbA%bA KKd"A%D"D%D%D%D%D%D% D  % D  % D  % D  % D  %D"D"D%D%a$ gg"A%D%D%T %T %I %M %D % D  % D  % D  % D  " D%D%D%D%D%% ee$ U$ [$D%D%D%D%D%D% D  % D  % D  % D  % ee$ U$ [$ a$ a$ a$ D % D % D% D  % D  % KKd"A%D%D%D%D%D%D%D% D  % D  % D  % a # D  %D%D%D%D%D% ee$U$[$a$a$a$a$a$a$ a $ a $ a $ a $ a$a$a$a$a$a$a#a$Hz            !! !! "" "" ##<  %''/''-}) ***+++ , + , + , + , + - -+ --+ ..+ ..+ //+//+00+00+11+11+222222334444 4 5 4! 5!5!@4"5"_6#+6$ 6$6$J6% 6%+6& 7&+6& 7'%6LXMMM6MSiXTXTXT6UJXUU.XVXVVpWWXX_YX]}}aJE N/bC ( L}} *L L t  / &&L=, &&L=, O w  / 9T1& )A 3$ " E ##_B:  -~~.1 * M  G+9 7 d O k  ( %/d %/d 9T~~01 * M 7 d R nQ @?@@?@@@@K@I@o@p@@p@@,@@@sv%_!PxࣛPʜ%9z@{B׿oH@u(FZh^`@@?$@@&@Y@@Y@*@@@`@N@X@v@o@@@P@I@@?@I@?@@@@@ @$@4@>@D@I@N@Q@T@V@(@"@0@@@?9@@@UUUUUU?V瞯<@D@4@z6׿sAֿ8$@@@@(@?@(@@ @"@(@@p@@@UUUUUU?tYLl@ 0@@"?@@@$@2@A@AB@?Gz@{Gz & .>& .A>^@Pn@?MbP?MbPMb`@?@^@^?@@ &Ҩ₩&Ҩ?@"@"@@"?@m??.@@@?@o@@A@n@?@@@@@@ @"@?@@@@@@ @"@Hz>-C6?Hz>V瞯<??@?testing github issue reports...{0,{0}}*{0,{0}}*{,{0}}*{0,{0}0,{0}}*{0,{0}}*{,{0}}*{0}*{000}0M[,1][0/1M[0M]M]{?{{{{:440<01?1=:10<01?1<:10<01?1>:10<01?1-:10<01?1+:10<01?1*:10<01?1/:10<01?1&:10<01?1<<:10<01?1>>:1{ ? 0 : 7m}-{7, -00007m}-{7M}{ { { ? 2 }, 7:2 }*7m }{0<0?0,0:0<0}0<0-0--eye()testing implicit definition of undefined variables...a+b+c+dabcdtesting matrix calculations..."hallo"+m1m1+"hallo"va+m1m1+vava-m1m1-vava*m1va+eye(2)0-0-eye()m1[1]m1[1,2,3]va[1,2]a+m1m1+aa-m1m1-ava[,1]va[{1]{,1}m1m1*m1m1+m2m2-m110*m2m2*105*m2*bb*m2*5m1*vaones(1,2,3)ones()ones(1,1)ones(1)ones(3,3)ones(3,1)ones(3)size(ones(3,3))size(ones(1,3))size(ones(3,1))size(ones(3))zeros()size(zeros(3,3))size(zeros(1,3))size(zeros(3,1))size(zeros(3))eye()size(eye(3,3))size(eye(1,3))size(eye(3,1))size(eye(3))size(eye(3,6))va'*vb2*va'*vbva*vb'va[0]va[1]va[2]va[0,0]va[1,0]va[2,0]va'[0]va'[1]va'[2]va'[0,0]va'[0,1]va'[0,2](va')[0,2]{1,2,3}'{a,2,3}'va'[0]=123testing complex calculations...ca==1+ica==caca!=1+ica!=caca!=cbca!=vaca==vaca<10+ica>10+ica<=10+ica>=10+ica<=1ca>=1i*i1inorm(3+4i)norm(4i+3)norm(3i+4)real(4.1i+3.1)imag(3.1i+4.1)real(3.1)imag(2.1i)-(4i+5)sqrt(-1)(-1)^0.5(-3)^(4/3)(1e-15 + 1e-15*i) ^ 2sqrt(i*i)sqrt(f)sqrt(2-3)sqrt(a-b)sqrt((2-3))sqrt((a-b))sqrt(-(1))sqrt((-1))sqrt(-(-1))sqrt(1)a=1+2i-(1+2i)-(-1-2i)a*i-(a+b*i)-(-a-b*i)(2+4i)*(8-6i)(-0.27 + 0.66*i)^2(-1+5i)^2c=(a=1+2i)testing parser value types...hello world Array dimension mismatch in matrix row (expected=3; dim=) Value::operator+=(...) failed. Value::operator-=(...) failed.testing error codes...a,b(a,b)((a,b))2*1,2sin(1,2) sin(nonexistent_var)nonexistent_varsin("test")max(1, "test")max(1,sin(8), "t")str2dbl(sin(3.14))"test"n(1+3i)/(8*9i)+"hallo"(1+3i)/(8*9i)-"hallo"(1+3i)/(8*9i)*"hallo"(1+3i)/(8*9i)/"hallo"10+va"test" // 88//"test"5//8"t"//sin(8)sin(8)//"t"3+8*3+(3+sin(2+3+)3)(3))()(2+)sin(cos)sin(())sin()sin)pi)a)2(-m)2(m)(1+2((3)5z)sin(3)xyz5t65 t 6ksdfj-mm4sin(m)m mm(8)4 + m5+*3),3sin(,sin(8))a _xxx_ bsin(3)cos(3)sin(3)3sin(3)+0x1+0xa+0x3n[1]min(3,]sin(]va[]3+]sin[a)1+[8]1[8][1]]1va[[3]]testing string functions..."\"quoted_string\"""quoted_string""\"\"""""\\"\strlen("12345")strlen(toupper("abcde"))sin(0)+(float)strlen("12345")10*(float)strlen(toupper("12345"))"hello "//"world"toupper("hello ")//"world"HELLO world"hello "//toupper("world")//" !!!"hello WORLD !!!testing postfix operators...1n8n3m+51000m1000 m(a)m-(a)m-2ma++ba ++ b1++21 ++ 22+(a*1000)m5!-5!(-5)!testing infix operators...-1-(-1)-(-1)*2-(-2)*sqrt(4)-a-(a)-(-a)-(-a)*2-(8)-8-(2+1)-sin(8)3-(-a)3--a2++4--1-3^2-b^2^3-b^8testing multiarg functions...min()max()sum()max(1,8,9,(int)6)max((int)6, 1+2, 4, -9)min((int)6, 1+2, 4, -9)a=test0()b=a+test0()sum(1,2)/sum(3,4)3/sum(3,4,5)sum(3)/sum(3,4,5)sum(3)+sum(3,4,5)sum(1,2)/sum(3,4,5)testing vector operations...10+2*va10+va*2va+vcva-vcva*vcva*vbva*va(va*vb)*bva[1.23]va[sin(8)]va[-1]va[c]va[(3)]a[1]va[1va[1]]va+vb-vasizeof(va+vb)sizeof(va-vb)va==vbva!=vbvb[va[0]]m1[0,0]+m1[1,1]+m1[2,2]vb[m1[0,0]]m1[0,0]=2m1[1,1]=2m1[2,2]=2va[0]=12.3va[1]=12.3va[2]=12.3(va[2])va[a](va[a])va[b]va[(2)]va[-(-2)](va[(2)])(va[-(-2)])va[1+1]va[(int)sin(8)+1]va[2]+44+va[2]va[2]*44*va[2]va[2]+aa+va[2]va[2]*bb*va[2](abs(-3)+2)>=min(6,5)(abs(-3))>abs(2)min(1,2,-3)>-4(abs(-3))>-2abs(-3)>abs(2){1,0,0}'{(1),0,0}'testing binary operators...1+710-13*410/22^2^33+4*2/(1-5)^2^31/2/31+2-3*4/5^6a+b-c*4/5^61^2/3*4-5+6a^b/c*4-5+61+2*3a+b*c(1+2)*3(a+b)*c(1+2)*(-3)(a+b)*(-c)2/44&42+2&(a+b+c)3&3c&3(c)&3(a+b)&3(a+b+c)&6(1+2+3)&63&c(a<<1)+2(a<<2)+2(a<<3)+2(a<<4)+2(a<<5)+21<<31-1<<311<<45-1<<458<<-28<<-455<<2222222true == true && falsefalse == true && falsea==1.0 && a==1.0aaa>aa=ab>=aa>=bsqrt(a)sin(8)sqrt(a)>=sin(8)sqrt(a)==sin(8)sqrt(a)!=sin(8)sqrt(a)+1.01sqrt(a)-1.01(-2)^3imag((-2)^3)==0testing if-else conditional...: 2? 1 : 2(ab) ? true : false) ? 1 : 2((a>b) ? true : false) ? 1 : sum((a>b) ? 1 : 2)((a>b) ? false : true) ? 1 : sum((a>b) ? 1 : 2)(true) ? 10 : 11(true) ? a+b : c+d(true) ? false : true(false) ? 10 : 11(false) ? a+b : c+d(false) ? false : true(ab) ? 10 : 11(ab) ? c : d(a>b) ? true : falsesum((a>b) ? 1 : 2)sum((a>b) ? 1 : 2, 100)sum((true) ? 1 : 2)sum((true) ? 1 : 2, 100)sum(3, (a>b) ? 3 : 10)sum(3, (ab) ? 3 : 10)*10sum(3, (ab) ? 3 : 10)10*sum(3, (ab) ? sum(3, (ab) ? sum(3, (ab) ? sum(3, (ab)&&(a2)&&(1<2) ? 128 : 255((1<2)&&(1<2)) ? 128 : 255((1>2)&&(1<2)) ? 128 : 255((ab)&&(ac) ? 1 : 2) : 3(a>b) ? ((bb) ? ((b>c) ? 1 : 2) : 3(ac) ? 1 : 2 : 3(a>b) ? (bb) ? (b>c) ? 1 : 2 : 31>0 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 641>0 ? 1>2 ? 128 : 255 :(1>0 ? 32 : 64)1>0 ? 1>0 ? 128 : 255 : 1>2 ? 32 : 641>0 ? 1>0 ? 128 : 255 :(1>2 ? 32 : 64)1>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 641>2 ? 1>0 ? 128 : 255 : 1>2 ? 32 : 641>0 ? 50 : 1>0 ? 128 : 2551>0 ? 50 : (1>0 ? 128 : 255)1>0 ? 1>0 ? 128 : 255 : 501>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 : 1>2 ? 64 : 161>2 ? 1>2 ? 128 : 255 : 1>0 ? 32 :(1>2 ? 64 : 16)1>0 ? 1>2 ? 128 : 255 : 1>0 ? 32 :1>2 ? 64 : 161>0 ? 1>2 ? 128 : 255 : (1>0 ? 32 :1>2 ? 64 : 16)true ? false ? 128 : 255 : true ? 32 : 64a= false ? 128 : 255a=((a>b)&&(a::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup11ParserErrorEN3mup11DbgSillyAddEN3mup11IPrecedenceEN3mup8FunTest0EN3mup7ParserXEA  7@3)A0-= Aą61Ad`htA}BAA`DAxP'ADp5x.Apc{1APpAUApN A<AA0<ApBA#0/A +/P+h+e0,-`,[,',--A\11#2^22Y3GP3p3*3#334#@4`44#44455#5# 6XA6e6807,`7#7769:0:P:Z::+; ;0P;AЬ;#<<#@<P<;A<<<<=0=@=`=+=V=iA`>>(>????# @Mp@q@SPA pA A AAA^0BEBiABC(@C6CC#C?D0D?pD(D DDZ0EPE+EE8EApF#FF#F*G;A PGpGGGGGH`A0`H pH#HIHI6@I`I pIA@pKKK9AtM# N@NgNN!O O7`O,O#O&O<0PPP1P$PP PQOPQ1QQ'QRR0R@RQARRRS S|AS"S+S$ TGpT9ATOU U0UPUpUU@W P\S\\4]0]/`]]@]@^ ^+P^F^ ^A____F0`@`=` a3`a@b`bYAЭbb#c#@c`cc cMc(d0dPdpdddMde+e' f@f`f_ff.g[`gdAgg# h?`hhhhiwjLPjj k k@kPkpAkk0l#@lwAllmOPmpm$mnHo4A@o#po3oo1p p@p;ppA p;0qpA0qq`A@ r#PrIr6rs s0s+`sFs sAPttttF@uPu7u0v'`v3vwwYAdx x@x`xxxxxy+y'z0zPz_zz.zXP{p{{{p|}LP}~ ~0~P~p~~~pAt 8`#zA0P @5M.zPLRx ,$|AC zRx $XAC $DP AC $l87AC ,P3)/|AC ,`'= AC ,Dp01AC ,tatAC ,0wB߄AC ,йÊAC ,PDWAC ,4'AC ,d.x.AC ,P\{1AC ,ÚAC ,UۛAC ,$@N AC ,T`AC ,AC ,p<'AC $AC $xAC $pBAC ,\oAC $<H#AC $dPAC $HAC $AC $AC ,T/AC $4 /AC $\ hAC $ eAC $(!-AC $0![AC $h!'AC $$p!AC $Lh!AC ,!{AC $%AC $%#AC $%^AC $&AC $D&YAC $l8&GAC $`&AC $X&*AC $`&#AC $ h&AC $4`&AC $\X&#AC $`&AC $X&AC $P&#AC $X&AC $$ P&AC $L H&AC $t &AC $ &#AC $ &#AC ,< &XgAC $ 'eAC $D P'8AC $l h',AC $ p'#AC $ x'AC $ p'6AC $ )AC $4 )AC $\ x)AC $ p)ZAC $ )AC $ )+AC $ )AC $$ )0AC , )AC $| )#AC $ *AC $ )#AC $ )AC ,l );WAC $L )AC $t )AC $ )AC $ )AC $ )AC $)AC $<)AC $d)+AC $)VAC ,)iϘAC $ *AC $ *(AC $4 *AC $\*AC $*AC $*AC $*#AC $*MAC $$*qAC $LH+SAC $t+ AC $x+ AC $`+ AC $H+AC $@+AC $<8+^AC $dp+EAC ,+iAC $+AC $+(AC $ +6AC $4+AC $\+#AC $+?AC $,AC $,?AC $,(AC $$ , AC $L,AC $t,ZAC $8,AC $0,+AC $8,AC $0,8AC ,H,gAC $l,#AC $,AC $,#AC $,*AC ,\,;AC $<,AC $d,AC $,AC $,AC $,AC $,AC ,|x,`AC $\, AC $,#AC $,IAC $,AC $,6AC $$,AC $L, AC ,,_AC $p.AC $h.AC ,D`.9AC $$p0#AC $Lx0AC $tp0gAC $0AC $0!AC $0AC $07AC $<0,AC $d0#AC $0&AC $0<AC $0AC $01AC $,1$AC $T1AC $|1 AC $0AC $0OAC $11AC $1AC $D1'AC $l1AC $1AC $0AC $0AC ,\0QAC $<1AC $d1AC $0AC $0 AC ,,0|SAC $ (1"AC $401+AC $\81$AC $@1GAC ,h19AC $x1OAC $1AC $,1AC $T1AC $|x1AC $p1AC $X1AC $2 AC $7SAC $D8AC $l84AC $ 8AC $8/AC $ 8AC $ 8@AC $4 08@AC $\ H8AC $ @8+AC $ H8FAC $ p8 AC ,L!X8SAC $,!9AC $T!9AC $|!8AC $!8FAC $!9AC $!8=AC $"9AC $D"93AC $l"9AC $"P:AC , #H:YAC $"x:AC $#p:#AC $<#x:#AC $d#:AC $#x:AC $#p: AC $#X:MAC $$:(AC $,$:AC $T$:AC $|$x:AC $$p:AC $$h:AC $$P:MAC $%x:AC $D% ;+AC $l%(;'AC $%0;AC $%(;AC $% ;_AC $ &X;AC $4&@;.AC $\&H;[AC ,&;dAC $&;AC $&;#AC $';?AC $,';AC $T';AC $|';AC $';AC $'XHAC ,$+>4}AC $+>#AC $,+>3AC $T+?AC $|+>1AC $+?AC $+>AC $+>;AC ,l,?p|AC $L,H?;AC ,,`?pO|AC $,?AC ,-?`|AC $,?#AC $$-?IAC $L-?6AC $t-@AC $-@ AC $-?AC $-?+AC $.?FAC $<.@ AC ,.@zAC $.@AC $.@AC $.@AC $ /@FAC $4/@AC $\/@7AC $/@AC $/(A'AC $/0A3AC $/HAAC $$0BAC ,0AYxAC $|0(BAC $0 BAC $0BAC $0BAC $1BAC $D1BAC $l1AAC $1AAC $1B+AC $1B'AC $ 2BAC $42BAC $\2B_AC $2BAC $2B.AC $2BXAC $2BAC $$3BAC $L3BAC $t3BAC $3xCAC $3CLAC $3DAC $4D AC $<4xDAC $d4pDAC $4hDAC $4`DAC $4HDAC ,T50DptAC $45pDAC $\5hD8AC $5D#AC ,5DzksAC $5DAC $6DAC $,6DAC $T6PEAC $|6HEAC $6@E5AC $6XEAC $6PEMAC $7xE.AC !-1 ---ƀI----y-l-As-%--l-F- -y-5--~-~g-~-~ -~-a~-D~F-}-}-}-}-}-y}-l}-8}-%}-}-|G-|-|F-c|-5|-(|- |I-{-{-{-{-{-e{->{-*{-%{{-z-z-z-z-xzy-Ez-%z-y -y -y-Fy -:y -&y -x-qx-Ux-1x-xf-w-w-w-w-w-wv-kwL-bw-VwI->w-2w-%wC-w-v-v-vE-v-vt-v-u-u-uh-}uD-qu-,u-u-t-t-tu-xtu-jt-JtG-:t--tF-ts-tI-s-sI-sE-s-s-Qs-%s-r-ry-r-r-wry-9r-r-r-qu-q-q-Vq-!q-p-p-qp-1ps-p+-o-o-o-Yo-0o-o-n-!nl-n-m=-m=-m>-m>-m-am-=m-+m-m-lc-l-l-l[-l6-ol-)l-k-k-k-kV-k-|k-ek-4k6-j-j-j-j-j-yj-lj-8j-%j-j-i-ji-?i-2i-i9- i-h-h-h-h-uh-Jh=Ch- h-g-g-g-g -g=g=g-tg-Qg-:g-5g!g-f-f-f-fz-fy-Uf-5f- f-e-e-Ve-Je-6e-d-ad-!d-c-c-uc-Qc-)c-b-bU-b-b-b-yb-qb-Qbr-+b-"b-b9-a-a-a3-a-a-a-a5-|a-Iap-`-`-`-`g-a`-`- `-_-_-~_q-f_q-X_{-:_7-*_-_6- _o-^9-^-^9-^5-^-|^-A^-^-]-]-]-]-]-]-I]8]\\\-t\-f\-a\-5\-[[[-[t[-a[H[-5[[-[-Z-Z-Z-ZZ-ZiZ-RZGZZZ-YYYY-Y-nY-WY>Y-+YY-XXXX-XXNXFX-/X-X-X-W-W-tW-fW-XW-W-W-V-V-V-V-rV-mV-UV-GV-9V$V-V-UU-U-U-U-U-aU-EU-U-T-T-T-T-]T-MTk-->>>>->(-q>)-S>-J>-)>#- >-===-=Q=-!=c-=b-<a-<-<-p<_-)<^-;]-;-;[-;6-;5-5;Z-;Y-:X-:W-:V-:U-|:5-s:T-A:m-!:S-:-9,-99t9d9R8a-7R-y7Q-R7x-7-6P-6O-6N-6N-t6-]6L-O6K-B6J-56I- 6E-5A-5~-n5H-e5G-U5F-D5E-85D-5C-4B-4[-4Y-q4O-Q4W-)4U-4&-3A-3@-3?-a3>-=3x--3>- 3=-2-2-2<-{2-r2-j2-D2-;2"-62!,2-'21-1-1>1"-1!u1-p1f1-^1>X1-S1I1->1-91 1-1-0-0-0-0`-k0-_0P0-B0-80`-#0"-0!0-/-/"-/!/-//-/>/-|/c/-Y/`-D/"-8/!%/-/-.-."-.!.-.-.- .:--9--z--8--7-u-6-d-5-X-4-7-3--,-,-+-+y-+-p+2-E+1-* -*-*-}*-* =)-)-)u)-V)-J)7)-)-)(-(-((-(-((-a(-U(B(-#(-((-''-'-''-'-K'-'-&-&-&&-&&-y&-m&[&-J&-%&-&&-%-%%-%-%|%-X%-?%-'%-%-$-$$-$-$$-o$/-@$-$-#-#-#-#-{#-o#G-c#G-?#/-#-"-"-"-"-"-W"-K"G-?"G-!-! -!=!=!-!!-M!.-"!-- ,-h U -_,-@-~-H---k-/---vc-D-? ---u-8-,---t-hU-----r-m---_------w-k----y-m-------Q-E-------Q-E-----Z-q-QV-1--k-----wd-F-A-----}-h-I-=-%- - - - - - -{ I-c -R -: -" - - +- *- D- )- (- '-w &-k -S -; - - %- - %- - - - - - z %-n -b -Q -2 - -  %- - - - - -  %-N -I A  -   - s -0 -$ - ---%----z-b-OH%-+ --}-f-A---|-h-\-K-,-'-%------~%-r-f-U-6-1- %------%-}-q-`-A-)-%------%--}-l-M-5-"%------%---x-Y-A-.'%------%-Z--xX-`M-:-'%-V- -T-$--%-b-<---dB---n-J(---~-X6------pQ-B,$----a>X>' =H-#-"-!---p"-k!a-\! -- --- =r-mc-T-OE-@$---Z-;-/------|]-7-!------s-T-H5-0----s-V->-2-----mG->---------}-q-=-1-----}-q----y-E-9----3G- --------x-Y-H-5-)--------i-SE-9-(- ------y-cU-I-8--------sT2- --}[-4---`>----pN-(---g-C!- --}-Y7----oM-)---c-?-------}-q-`-A-)--------p-Q-9-#----~c-D><> =x-k-C-}-f-]-Q-7-+---------y-m-S-G---!---------o-c-I-=-#----------k-b-D_-5-)-A- ----A-^ -H-5.-"-A- ----xA-T ->-+$--A- ----nA-J -4-!--A- ----dA-@ -*---A- ----ZA-6 - - --A- ---u-PA-, ----A- --~w-k-FA-" - ---A- --tm-a-<A- ----A- -}-jc-W-2A- ----A- -s-`Y-P-.A-  ----A- -~-g`-Q-------P-D-------d-X-$------d-X-$------d-X-$------`_-Q-E-"<-----<-v-h-\U-I-$<-----<-{-m-aZ-N-)<-----<--tm-aZ-N-)A- ----<-{-vg-[T-H-#<-----<-w-rc-WP-D-<-----<-s-n_-SL-@-<-----<-o-j[-OH-<-<-----<-k-fW-KD-8-<-----<-g-bS-G@-7-<-----w-k-C-7-------s-g-M-A-'--------_--y-V<-,-'- --<----w-R<-(-#---<----s-N<-$----̿A- --x-l-GA-# - ---¾A- --un-b-=A- ----A- --wp-g-EA-! ------{-o-G-;---߻-ӻ---w-k-C-7---ۺ-Ϻ----x-a-X-:_-+--<-ҹ-͹---z<-P-K<-0)--<-θ-ɸ---v<-L-G8-,%--<-ʷ-ŷ---r<-H-C4-(!--<-ƶ----s<-I-D5-)"--<-ǵ-µ---o<-E-@1-%--A-ɴ ----nA-J -7-' --A-ѳ ---_-S-G---Ӳ-Dz---S-G---ӱ-DZ---S-G---Ӱ-ǰ---S-G---ӯ-ǯ---S-G---Ӯ-ʮ-_--t-Q<-'- --ĭ---}-X<-.-)---֬<----y-T<-*-%- --ҫ<----u-P<-&-!---Ϊ<----t-O<-%- ---ͩ<---|-p-K<-!- ---ɨ<---x-l-G<-----ħ<---}v-j-E<-- ---<--u-ib-V-1<----ԥ-<--q-e^-R--<---ܤ-Ӥ-<--s-c@-1---ϣ-ã---O-C---Ϣ-â---O-C---ϡ-á---O-C---Ϡ-à---O-C---ϟ-ß---K_-<-0- A- -Ӟ---<-^-YJ->7-+-<-ܝ-םȝ---<-]-XI-=6-*-<-ޜ-ٜʜ---<-\-WH-<5-)-<-ڛ-՛ƛ---<-X-SD-81-%-<-֚-њš---~<-T-O@-4--!-<-ҙ-͙---z<-P-K<-0)--<-Θ-ɘ---v<-L-G8-,%--<-ʗ-ŗ---r<-H-C4-(!--<-ɖ-Ė---q<-G-B3-' --<-˕-ƕ--e-Y-M-- -ٔ-͔---Y-M-- -ٓ-͓---Y-M-- -ْ-͒---Y-M-- -ّ-͑---Y-M-- -ِ-͐---Y-M-- -ُ-͏---Y-M-- -َ-͎---m-a---!-----m-a---!-----m-a---!-----m-a---!-----m-a---!-----m-a---!-----m-a---!-----m-a---!-----m-a---!-----m-d-)_---<-----l<-B-=.-"--<-----h<->-9*-- -<-----d<-:-5&---<-----c<-9-+-- -<-----h<->---!--<-----m<-C-5-)"--~<-~-~-~~-~-u~<-K~-:~-.~'~-~-}<-}-}-}}-}-w}<-M}-?}-3},}- }-|<-|-|-||-|-||<-R|-A|-5|.|-"|-{<-{-{-{{-{-{<-W{-I{-={6{-*{-{<-z-z-zz-z-z<-_z-Nz-Bz;z-/z- z<-y-y-yy-y-y<-ay-0y yy-xx-x-x<-x-x-{xtx-hx-Cx<-x- x-ww-w-wA-w -w-zwsw-gw-Bw<-w- w-vv-v-v<-v-vv-{vtv-hv-Cv<-v-vv-uu-u-u<-u-uu-wupu-du-?u<-u-uu-tt-t-t<-t-tt-stlt-`t-;t<-t- ts-ss-s-s<-s-s{s-oshs-\s-7s<- s-sr-rr-r-r<-r-rwr-krdr-Xr-3r<- r-rq-qq-q-q<-q-qsq-gq`q-Tq-/q<-q-qp-pp-p-p<-p-~pop-cp\p-Pp-+p<-p-oo-oo-o-o<-o-zoko-_oXo-Lo-'o<-n-nn-nn-n-n<-{n-vngn-[nTn-Hn-#n<-m-mm-mm-m-m<-wm-rmcm-WmPm-Dm-m<-l-ll-ll-l-l<-sl-nl_l-SlLl-@l-l<-k-kk-kk-k-k<-ok-jk[k-OkHk-Q-2Q- Q<-P-PP-PP-P-P<-\P-WPCP-7P0P-$P-O<-O-OO-OO-O-xO<-NO-IO5O-)O"O-O-N<-N-NN-NN-N-jN<-@N-;N'N-NN-N-M<-M-MM-MM-M-\M<-2M--MM- MM-L-L<-L-LL-LL-sL-NL<-$L-L L-KK-K-K<-K-KK-xKqK-eK-@K<-K-KJ-JJ-J-J<-J-JvJ-jJcJ-WJ-2J<-J-JI-II-I-I<-I-|IhI-\IUI-II-$I<-H-HH-HH-H-H<-sH-nHZH-NHGH-;H-H<-G-GG-GG-G-G<-eG-`GLG-@G9G--G-G<-F-FF-FF-F-F<-WF-RF>F-2F+F-F-E<-E-EE-EE-E-sE<-IE-DE0E-$EE-E-D<-D-DD-DD-D-eD<-;D-6D"D-DD-D-C<-C-C-CC-C-ZC<-0C-C-C C-B-B<-B-BB-BB-wB-RB<-(B-#BB-BA-A-A<-A-A-}AeACA-A@-@@-@-@-t@<-M@-5@-)@@?-??-?c?-Q?-E?- ?<->->->>>-t>R>-.> >-=-=-=-=A-= -t=-a=Z=-N=-)=A-= -<-<<-<-<A-< -j<-W<P<-D<-<A-; -;-;;-;-;A-v; -`;-M;F;-:;-;A-: -:-::-:-:A-l: -V:-C:<:-0:- :A-9 -9-99-9-9A-b9 -L9-9929-&9-9A-8 -8-88-8-|8A-X8 -B8-/8(8-8-7A-7 -7-77-7-r7A-N7 -87-%77-7-6A-6 -6-66-6-n6A-J6 -76-'6 6-6-5A-5 -5-55-5e5-Y5-M5-5- 5-4-4-4-4-Y4-M4-4- 4-3-3-3-3-Y3-M3-3- 3-2-2-2-2-Y2-M2-2- 2-1-1-1-1-Y1-M1-1- 1-0-0-0-0-Y0-M0-0- 0-/-/-/-/-Y/-M/-/- /-.-.-.-.-Y.-M.-.- .---------Y--M---- --,-,-,-,-Y,-M,-,- ,-+-+-+-+-Y+-M+-+- +-*-*-*-*-Y*-M*-*- *-)-)-)_-)-z)-W)<--)-)-))(-((-(-(<-(-v(-q(i(Z(-N(G(-;(-(<-'-'-'''-''-'-w'<-P'-8'-3'+''-' '-&-&<-&-&-&&z&-n&g&-[&-6&<- &-%-%%%-%%-%-%<-k%-S%-N%<%-0%)%-%-$<-$-$-$$$-$$-~$-Y$<-2$-$-$ $#-##-#-#<-#-y#-t#l#]#-Q#J#->#-#<-"-"-""-""-"-"<-X"-@"-8")"-""- "-!<-!-!-!!-!|!-p!-K!<-$!- !-! -  - - <- -o -j X -L E -9 - <------z<-P-8-3!---<----{t-h-C<------<--h-cQ-E>-2- <---|-gX-LE-9-<----q-iZ-NG-;-<------|<-U-=-8&---<----{t-h-C<-----<---}v-j-E<-- ---<---x-l-G<- - ---<---z-n-I<-"----<---t-ha-U-0<- ----<--v-jc-W-2<-----<--{-oh-\-7<- ----<---tm-a-<<-----<---yr-f-A<-----<---{t-h-C<-- ---<---|-p-K<-!----<----q<-0-'---- - - - - - - - - -w -k -7 -+ - - - - -w -k -7 -+ - - - - -w -k -7 -+ - - - - -w -k -7 -+ - - - - -w -k -7 -+ -----w-k-7-+-------K-?- ------_-S-------_-S-------_-S-------_-S-------_-S-------_-S-3-'--------w-W-K-+--------{-o-O-C-#--------s-g-G-;-I-@-4-(---------_---nA-J -/-#--<-----e<-;-#---<----}-X<-.-)- --<---{-o-J<- ----<---tm-a-<<-- ---<--r-f_-S-.<-----<-}-xd-XQ-E- <-----<-o-jV-JC-7-<-----<-a-\H-<5-)-<-----~<-T-O;-/(--<-----p<-F-.-"--<-----d<-:-"---<----}-X<-.-- --A- ---t-O<-%- ---<---{t-h-C<-----<--{-oh-\-7A- ----<--r-f_-S-.<-----<-~-f-ZS-G-"<-----<-r-Z-NG-;-<-----<-f-N-B;-/- <-----<-Y-T@-4--!-A- ----yA-U -:-."----<--t-ha-U-0<-----<--h-\U-I-$<-----<-t-\-PI-=-<-----<-h-P-D=-1- <-----<-_-J->7-+-A- ----A-_ -D-81-%-A- ----}A-Y ->-2+--A- ----wA-S -8-,%--A- ----qA-M -2-&--A- ----kA-G -,- - -A- ----eA-A -&---A- ----_A-; - - --A- ---~-YA-5 ----A- ---x-SA-/ ----A- --mK-'---~\-E----rP-, ---_-8---a?---m-V-- --z-V4- --]-9---o-I'---qO-)--{-:-#---iG-#--p-L*----^<----tR-/ ----U-I-=-1-----}-q-)------i-]-)------e_-V-J->-<-------v<-L-4-(!----<---|-pi-]-8<-- ---<--x-le-Y-4<- ----<--t-ha-U-0<-----<--yr-f_-V-1<- ------j-^-6-*---ο-¿---f-Z-2-&---ʾ----b-V-.-"---ƽ----^-R-*----¼----Z-N-&-------~-V-J-"-------z-R-F----޹----v-N-B----ڸ---~-r-J->-- --ַ---z-n-F-:---޶-Ҷ---v-j-B-6---ڵ-ε---r-f->-2- --ִ-ʴ---n-b-:-.---ҳ-Ƴ---j-^-6-*---β-²---f-Z-2-&---ʱ----b-V-.-"---ư----^-R-*----ޯ-ү-----l-`-F-:- ----Ԯ-Ȯ-----e-\->_-/-#-<-֭-ŭ ----\<-2-!--׬-<--t-ha-U-0<---߫-ӫ-<--p-d]-Q-,<---۪-Ϫ-<--{l-`Y-M-(<---ީש-˩-<-|-wh-\U-I-$<---ڨӨ-Ǩ-<-x-sd-XQ-E- <---֧ϧ-ç-<-t-o`-TM-A-<--ަ-Ҧ˦--<-p-k\-PI-=-<--ڥ-Υǥ--<-l-gX-LE-9-<--֤-ʤä--<-h-cT-HA-5-<--ң-ƣ--<-d-_P-D=-1- <--ݢ΢-¢--<-`-[L-@9---<-ޡ-١ʡ---<-\-WH-<5-)-<-ڠ-ՠƠ---<-X-SD-81-%-<-֟-џŸ---~<-T-O@-4--!-<-Ҟ-͞---z<-P-K<-0)--<-Ν-ɝ---v<-L-G8-,%--<-ʜ-Ŝ---r<-H-C4-(!--<-ƛ----n<-D-?0-$--<-š----j<-@-;,- - -<-----f<-<-7(-- -<-----b<-8-3$---<-----^<-4-/ - --ܖ<-----Z<-0-+- --ؕ<----{-V<-,-'- --Ԕ<----w-R<-(-#---Г<----s-N<-$----̒<---{-o-J<- - ---ȑ<---~w-k-F<-----Đ<---zs-g-B<-----<---vo-c-><-----<--~-rk-_-:<-- --ݍ-<--z-ng-[-6<- ---ߌ-<--|-pi-]-8<-- --ۋ-<--x-le-Y-4<- ---׊-<--w-kd-X-3<- ---։-<--s-g`-T-/<----؈-<--u-ib-V-1<----ԇ-<--q-e^-R--<---܆-І-<--|m-aZ-N-)<---߅؅-̅-<-}-xi-]V-J-%<---ۄԄ-Ȅ-A- -i-VO-C-A- --уʃ--A-u -_-LE-9-A- -ڂ-ǂ--A-k -U-B;-/- A- -Ё---A-a -K-81-%-A-܀ -ƀ---{A-W -A-.'--A- ----qA-M -7-$--~A-~ -~-~~-~-s~A-O~ -<~-%~~-~}-}-}-}-}-]}-Q}-)}-}-|-|-|-|-|-|-Y|-M|-%|-|-{-{-{-{-{-}{-U{-I{-!{-{-z-z-z-z-z-yz-Qz-Ez-z-z-y-y-y-y-y-uy-My-Ay-y- y-x-x-x-x-}x-qx-Ix-=x-x- x-w-w-w_-w-w-w<-fw-awRw-Fw?w-3w-w<-v-vv-vv-v-v<-bv-]vNv-Bv;v-/v- v<-u-uu-uu-u-u<-^u-YuJu->u7u-+u-u<-t-tt-tt-t-t<-Zt-UtFt-:t3t-'t-t<-s-ss-ss-s-s<-Vs-QsBs-6s/s-#s-r<-r-rr-rr-r-|r<-Rr-Mr>r-2r+r-r-q<-q-qq-qq-q-xq<-Nq-Iq:q-.q'q-q-p<-p-pp-pp-p-tp<-Jp-Ep6p-*p#p-p-o<-o-oo-oo-o-po<-Fo-Ao2o-&oo-o-n<-n-nn-nn-n-ln<-Bn-=n.n-"nn-n-m<-m-mm-mm-m-hm<->m-9m*m-mm- m-l<-l-ll-ll-l-dl<-:l-5l&l-ll-l-k<-k-kk-kk-k-`k<-6k-1k"k-kk-k-j<-j-jj-jj-j-\j<-2j--jj-j j-i-i<-i-ii-ii-i-^iA-:i -'i-ii-i-hA-h -h-hh-hXh-Oh-Ch-)h-h-h-g-g-g-g-g-g-g-kg-_g-Eg-9g-g-g-f-f-f-f-f-f-f-{f-af-Uf-;f-/f-f- f-e-e-e-e-e-e-}e-qe-We-Ke-1e-%e- e-d-d-d-d-d-d-d-sd-gd-Md-Ad-'d-d-d-c-c-c-c-c-c-c-ic-]c-Cc-7c-c-c-b-b-b-b-b-b-b-yb-_b-Sb-9b--b-b-b-a-a-a-a-a-a-{a-oa-Ua-Ia-/a-#a- a-`-`-`-`-`-`-`-q`-e`-K`-?`-%`-`-_-_-_-_-_-_-_-_-g_-[_-A_-5_-_-_-^-^-^-^-^-^-^-w^-]^-Q^-)^-^-^-]-]-]-]-]-]-]-q]-h]-J]_-;]-/]- ]A-\ -\-\\-\-\A-c\ -M\-:\3\-'\-\A-[ -[-[[-[-}[A-Y[ -C[-0[)[-[-ZA-Z -Z-ZZ-Z-sZA-OZ -9Z-&ZZ-Z-YA-Y -Y-YY-Y-iYA-EY -/Y-YY- Y-XA-X -X-XX-X-_XA-;X -%X-X X-W-WA-W -W-WW-zW-UWA-1W -W-WW-V-VA-V -V-V|V-pV-KVA-'V -V-UU-U-UA-U -U-yUrU-fU-AUA-U -U-TT-T-TA-T -T-oThT-\T-7TA-T -S-SS-S-SA-S -xS-eS^S-RS--SA- S -R-RR-R-RA-R -qR-^RWR-KR-&RA-R -Q-QQ-Q-QA-}Q -gQ-TQMQ-AQ-QA-P -P-PP-P-PA-sP -]P-JPCP-7P-PA-O -O-OO-O-OA-iO -SO-@O9O--O-OA-N -N-NN-N-NA-_N -IN-6N/N-#N-MA-M -M-MM-M-yMA-UM -?M-,M%M-M-LA-L -L-LL-L-oLA-KL -5L-"LL-L-KA-K -K-KK-K-eKA-AK -+K-KK-K-JA-J -J-JJ-J-[JA-7J -!J-JJ-I-IA-I -I-II-vI-QIA--I -I-IH-H-HA-H -H-HxH-lH-GHA-#H - H-GG-G-GA-G -G-uGnG-bG-=GA-G -G-FF-F-FA-F -~F-kFdF-XF-3FA-F -E-EE-E-EA-E -tE-aEZE-NE-)EA-E -D-DD-D-DA-D -jD-WDPD-DD-DA-C -C-CC-C-CA-vC -`C-MCFC-:C-CA-B -B-BB-B-BA-lB -VB-CBA-> ->->>->-h>A-D> -.>->>->-=A-= -=-==-=-^=A-:= -$=-= =-<-<A-< -<-<<-y<-T<A-3< -<- <<-;-;A-; -;-;;-u;-P;A-/; -;-;:-:-:A-: -:-:}:-q:-L:A-#:-::-:9-9-9A-9 -9-9x9-l9-G9A-#9 - 9-88-8-8A-8 -8-u8n8-b8-=8A-8 -8-77-7-7A-7 -7-w7p7-g7-E7A-!7 -7-66-66 -6-6G-s6 =f6_-T6G-/6-6-5G-5-d5->5-5- 5-4-4-44-4-4G-g4-4-4-3-3-3-3-d3-X3-$3-3-2-f2G-<2-2-1-1-1-1-11-1-z1-[1-F1-01"1-1-1-0-0-00-0-0-n0-V0-@020-&0-0-/-/-//-//-/`/-Q/2/-&//-.G-.-.-|.-V.-0.-$.-.---------- =m--a--X--L--@--4--(--------,-,-,-,-,-,-,-,-,-,-t,-h,-\,-P,-D,-8,-,_-,>,>+-+-+-+>~+>\+-<+-+-*>*>*-*-*-u*>m*>K*-+*-)-)>)>)-)-u)-b)>Z)>8)-)-(-(>(>(-(-d(-Q(>I(>'(-(-'-'>'>'-}'-Q'->'>6'>'-&-&-&>&>&-k&-@&--&>%&>&-%-%-%>%>y%-Y%--%-%>%>$-$-$-$>$>g$-G$-$- $>$>#-#-#-#>w#>U#-5#- #-">">"-"-"-m">e">C"-#"-!-!>!>!-!-n!-[!>S!>1!-!- - > > - -\ -I >A > --->>-w-J-7>/> --->>-d-8-%>>--->>s-S-&-> >--->>_-?-->>---}>u>S-3-->>---q>i>G-'-->>--t-a>Y>7--->>--c-P>H>&--->>-|-O-<>4>--->>-i-=-*>">--->>x-X-+->>----d-P-D-3-'----u`-H-)-- ---X-4------}H-a-b--a-nb-<-a-b--a-bb-0-a-b--a-Vb-$- a- b- -} a-S b-! - a- b- -q a-G b- - a- b- -e a-; b- -  - -  - -z g J- - -8 - --t- -a-----n-V-F-.------t-`-H-)----^-G-.--------p-a--=--|->;-Z9N;-"6;-/;-3;-z@n;-B26;- ?;-0;-1;-h.\;-<50;--;-=;-7;-4;-`8<J-%-*M*M4*M0*M'MFGdxKphP`QXPH@80(c   +,x^p"h`'X(PH@80( ]+****`*@* **)) ))))x)p) `)@) ))((((`(@( ((''''`'@' ''&&&&`&@& &&%%%% %%`%@% %%$$$$`$@$8$0$  $$####`#@# ##"" """" ""x"p" `"@" ""!!!!x!p! `!@! !!    x p ` @    `@ `@  `@ `@ `@  `@  `@ `@ `@  xp `@  `@ `@ `@  `@80  `@80  `XP @  `@ `@       ` @       ` @       ` X P @       ` @         x p ` @   `@  `@ `@ `@  `@  `@  xp `XP @80       xp `XP @80       `@   M*HQ3Iq ,GS-\A)? +2p0oą 35odn>,n(nqx3QP+nY+ qDppjpPDpU,po<onan\P3Jp3WpA T[,pTO2Eh20UX3 334_!5)Y495 6cW6U`7V27J71:Nn?`=VP\^16 ^%;NO<,]P^L ^191n\|BS&OmgLmXo  p0-qs70s%EQF'^`s s0v0E:Pd~p# W@e\,+D*p: ;6:NSP;E8P<?"<<C;GoЬbC<R@<:5<p <8= 0=ptn{E9PE8XEf9G8#PGGCpFo3DF1WF q  pGoGCG,H-`HGpHn0FHfHaEI.@I+`I&KLjM N@N $N<No@O; O?`O.<O:nti@Rf<S?OQkUP(0P'PP.P-P+PDPQ.QQQ2[R RW0R[R p>R9gS_BSqTo_U  U[PU> pU\][Z\Z0]Y`]k]a?23za @+=4>/0`>(A\aPA3A/pA}`@ p5P>ppz-6@0-3b8=`hlb<`cd:N2+b5a0D84pDI0(@=`6!=@CbC3`4aC1/0BM4C@2B+D`p@[4c[@p^0@4(p[4[p04)0q#a@ =a$?>0 2"0,`,1 B$C;!Ae AR`bw<RS@pK8n)P:*DM aMd0@b7)PkP`vPx1w*~TK8pIVUD^ i`a<1p)0: Esiv19X*D@A@07j3_Q@W,hgbhnhgbhmgpghm3?0?>p2>;ekTdBkkf>a(`<lB5dhaBBW?>>/h`D?cc!Gl a`<!bv(c/=(c!3U5Ur`@o!Bg$A/A/5j?0(BVG/B>:[bg/J<dLcwc445cb7cac}4,3544w>>4< 3q;>}px4j444c4>4p4&5+5_memcpy___cxa_throw_pow__ZSt9terminatev__ZdlPv__ZNSt3__19allocatorIMN3mup12ParserTesterEFivEE8allocateEmPKv__ZNSt3__19allocatorIN3mup7ParserXEE8allocateEmPKv__ZThn80_NK3mup8IOprtBin16GetAssociativityEv__ZNK3mup8IOprtBin16GetAssociativityEv__ZNKSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE8capacityEv__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE8capacityEv__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE8capacityEv__ZNK3mup5Value8GetArrayEv__ZNK3mup8Variable8GetArrayEv__ZN3mup12ParserTester10TestMatrixEv__ZNK3mup6IValue8IsMatrixEv__ZN3mup12ParserTester11TestPostfixEv__ZN3mup12ParserTester9TestInfixEv__ZN3mup12ParserTester11TestComplexEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZN3mup11ParserError10GetContextEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup7ParserXERNS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup7ParserXERNS_9allocatorIS2_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup7ParserXENS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup7ParserXENS_9allocatorIS2_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup7ParserXENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup7ParserXENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE5firstEv__ZNK3mup12ParserTester5AbortEv__ZN3mup12ParserTester10TestScriptEv__ZNK3mup8TokenPtrINS_6IValueEEptEv__ZNKSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEEptEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIMN3mup12ParserTesterEFivEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIMN3mup12ParserTesterEFivEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup7ParserXEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup7ParserXEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup7ParserXEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIMN3mup12ParserTesterEFivEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup7ParserXEEELi1ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemImLi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPMN3mup12ParserTesterEFivELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPMN3mup12ParserTesterEFivELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup7ParserXELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup7ParserXELi0ELb0EE5__getEv__ZNK3mup5Value8GetFloatEv__ZNK3mup8Variable8GetFloatEv__ZNK3mup5Value7GetRowsEv__ZN3mup12ParserTester16TestIssueReportsEv__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE26__invalidate_all_iteratorsEv__ZNK3mup11ParserError6GetPosEv__ZNKSt3__18ios_base5flagsEv__ZN3mup12ParserTester14TestErrorCodesEv__ZN3mup12ParserTester10TestVectorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZN3mup12ParserTester13TestValReaderEv__ZNK3mup6IValue8IsScalarEv__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE5clearEv__ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE5clearEv__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE5clearEv__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE5clearEv__ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE5clearEv__ZNK3mup11ParserXBase6GetVarEv__ZNK3mup11ParserXBase10GetExprVarEv__ZN3mup12ParserTester12TestUndefVarEv__ZNK3mup8IOprtBin9AsciiDumpEv__ZNK3mup9ICallback9AsciiDumpEv__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE9__end_capEv__ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE9__end_capEv__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE9__end_capEv__ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE9__end_capEv__ZN3mup12ParserTester9TestBinOpEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZN3mup12ParserTester3RunEv__ZN3mup12ParserTester13TestStringFunEv__ZN3mup12ParserTester7TestEqnEv__ZNK3mup11ParserError8GetTokenEv__ZNK3mup5Value7GetBoolEv__ZNK3mup8Variable7GetBoolEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZNK3mup11ParserXBase4EvalEv__ZNKSt3__17complexIdE4realEv__ZN3mup9ICallback11AsICallbackEv__ZThn80_NK3mup8IOprtBin6GetPriEv__ZNK3mup8IOprtBin6GetPriEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNKSt3__18ios_base5widthEv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE5flushEv__ZNK3mup11ParserError6GetMsgEv__ZN3mup12ParserTester12TestMultiArgEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup5Value9GetStringEv__ZNK3mup8Variable9GetStringEv__ZNK3mup6IToken8ToStringEv__ZNKSt3__17complexIdE4imagEv__ZNK3mup5Value7GetImagEv__ZNK3mup8Variable7GetImagEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZNKSt3__19allocatorIMN3mup12ParserTesterEFivEE8max_sizeEv__ZNKSt3__19allocatorIN3mup7ParserXEE8max_sizeEv__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4sizeEv__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE4sizeEv__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE4sizeEv__ZNKSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE4sizeEv__ZN3mup12ParserTester15TestParserValueEv__ZN3mup9ICallback8AsIValueEv__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE17__annotate_deleteEv__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE17__annotate_deleteEv__ZN3mup12ParserTester10TestIfElseEv__ZN3mup6IToken7ReleaseEv__ZNK3mup5Value7GetTypeEv__ZNK3mup8Variable7GetTypeEv__ZNK3mup11DbgSillyAdd5CloneEv__ZNK3mup8FunTest05CloneEv__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotator6__doneEv__ZN3mup7consoleEv__ZNK3mup11ParserError7GetCodeEv__ZNK3mup8TokenPtrINS_6IValueEEdeEv__ZNKSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEEdeEv__ZN3mup8IOprtBin13AsIPrecedenceEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE6secondEv__ZNKSt3__117__compressed_pairIPMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup7ParserXERNS_9allocatorIS2_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup7ParserXENS_9allocatorIS2_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup7ParserXENS_9allocatorIS2_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup7ParserXENS_14default_deleteIS2_EEE6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNK3mup11DbgSillyAdd7GetDescEv__ZNK3mup8FunTest07GetDescEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE7__allocEv__ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE7__allocEv__ZNKSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE7__allocEv__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE7__allocEv__ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE4dataEv__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup8IOprtBinD2Ev__ZN3mup9ICallbackD2Ev__ZN3mup11ParserXBaseD2Ev__ZN3mup11DbgSillyAddD2Ev__ZN3mup7ParserXD2Ev__ZN3mup8TokenPtrINS_8IOprtBinEED2Ev__ZN3mup8TokenPtrINS_9ICallbackEED2Ev__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEED2Ev__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEED2Ev__ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEED2Ev__ZNSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEED2Ev__ZN3mup8FunTest0D2Ev__ZZN3mup12ParserTester7EqnTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5ValueEbiEN10CheckArrayC2Ev__ZN3mup12ParserTesterC2Ev__ZN3mup11DbgSillyAddC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIMN3mup12ParserTesterEFivEEC2Ev__ZNSt3__19allocatorIN3mup7ParserXEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEEC2Ev__ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEEC2Ev__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEEC2Ev__ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIMN3mup12ParserTesterEFivEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup7ParserXEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup8FunTest0C2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZNSt12length_errorD1Ev__ZNSt13runtime_errorD1Ev__ZN3mup5ValueD1Ev__ZN3mup8VariableD1Ev__ZNSt3__16localeD1Ev__ZN3mup11IPrecedenceD1Ev__ZThn80_N3mup11DbgSillyAddD1Ev__ZN3mup11DbgSillyAddD1Ev__ZN3mup7ParserXD1Ev__ZN3mup8TokenPtrINS_8IOprtBinEED1Ev__ZN3mup8TokenPtrINS_9ICallbackEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEED1Ev__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEED1Ev__ZNSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEED1Ev__ZN3mup8FunTest0D1Ev__ZZN3mup12ParserTester7EqnTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5ValueEbiEN10CheckArrayC1Ev__ZN3mup12ParserTesterC1Ev__ZN3mup11DbgSillyAddC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEEC1Ev__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEEC1Ev__ZN3mup8FunTest0C1Ev__ZN3mup11IPrecedenceD0Ev__ZThn80_N3mup11DbgSillyAddD0Ev__ZN3mup11DbgSillyAddD0Ev__ZN3mup7ParserXD0Ev__ZN3mup8FunTest0D0Ev_hypot_exit_memset_cos__ZTVSt12length_error__ZTISt12length_error__ZTISt13runtime_error_getchar_exp_memcmp___assert_rtn___cxa_allocate_exception___cxa_free_exception__ZTISt9exception_sin_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC2ERKS7_m__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC1ERKS7_m__ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE8allocateERS6_m__ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE10deallocateERS6_PS5_m__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC2ERKS5_m__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC1ERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE8allocateERS4_m__ZNSt3__19allocatorIMN3mup12ParserTesterEFivEE10deallocateEPS4_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE10deallocateERS4_PS3_m__ZNSt3__19allocatorIN3mup7ParserXEE10deallocateEPS2_m__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEEixEm__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE14__annotate_newEm__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE14__annotate_newEm__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEm__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE17__annotate_shrinkEm__ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE11__recommendEm__ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE11__recommendEm___stack_chk_fail__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl___cxa_pure_virtual__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZN3mup7ParserXC1Ej__ZN3mup5Value2AtEii__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup9ICallbackC2ENS_8ECmdCodeEPKci__ZN3mup12ParserTester7EqnTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5ValueEbi__ZN3mup11DbgSillyAdd4EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZN3mup8FunTest04EvalERNS_8TokenPtrINS_6IValueEEEPKS3_i__ZNK3mup12ParserTester10AssessmentEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi___cxa_begin_catch___cxa_end_catch_log___clang_call_terminate__Unwind_Resume__ZL3absd___stack_chk_guard__ZN3mup5ValueC1Eiid__ZN3mup5ValueC1Eid__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZN3mup5ValueaSEd__ZN3mup5ValueC1Ed__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNSt13runtime_errorC1EPKc__ZN3mup5ValueC1EPKc__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE3putEc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZN3mup5ValueC1Ec__ZN3mup11ParserXBase19EnableAutoCreateVarEb__ZN3mup5ValueC1Eb__ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE7destroyIS5_EEvRS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE9__destroyIS5_EEvNS_17integral_constantIbLb1EEERS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE7destroyIS3_EEvRS4_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE9__destroyIS3_EEvNS_17integral_constantIbLb1EEERS4_PT___ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE21__push_back_slow_pathIRKS2_EEvOT___ZNSt3__122__compressed_pair_elemIPMN3mup12ParserTesterEFivELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIPN3mup7ParserXELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIMN3mup12ParserTesterEFivEEELi1ELb0EEC2IS7_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup7ParserXEEELi1ELb0EEC2IS5_vEEOT___ZNSt3__122__compressed_pair_elemIPN3mup7ParserXELi0ELb0EEC2IRS3_vEEOT___ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivENS_9allocatorIS4_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup7ParserXENS_9allocatorIS2_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivENS_9allocatorIS4_EEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup7ParserXENS_9allocatorIS2_EEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup7ParserXENS_14default_deleteIS2_EEEC2IRS3_Lb1EEEOT___ZNSt3__117__compressed_pairIPN3mup7ParserXENS_14default_deleteIS2_EEEC1IRS3_Lb1EEEOT___ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE20__construct_backwardIS5_EENS_9enable_ifIXaaooL_ZNS_17integral_constantIbLb1EE5valueEEntsr15__has_constructIS6_PT_SC_EE5valuesr31is_trivially_move_constructibleISC_EE5valueEvE4typeERS6_SD_SD_RSD___ZZN3mup12ParserTester7EqnTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_5ValueEbiEN10CheckArray5CheckERNS_6IValueESD___ZNSt3__1neIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__1L4swapIPMN3mup12ParserTesterEFivEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS7_EE5valueEvE4typeERS7_SA___ZNKSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE31__annotate_contiguous_containerEPKvS9_S9_S9___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE20__construct_backwardIPS3_EEvRS4_T_S9_RS9___ZNSt3__1eqINS_9allocatorIcEEEEbRKNS_12basic_stringIcNS_11char_traitsIcEET_EES9___ZNSt3__1L4swapIPN3mup7ParserXEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS5_EE5valueEvE4typeERS5_S8___ZNSt3__1L4moveIRPMN3mup12ParserTesterEFivEEEONS_16remove_referenceIT_E4typeEOS8___ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEEC1EmmS7___ZN3mup12ParserTester9ThrowTestERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiiS7___ZNKSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE31__annotate_contiguous_containerEPKvS7_S7_S7___ZNSt3__1L4endlIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7___ZNSt3__1L16__to_raw_pointerIMN3mup12ParserTesterEFivEEEPT_S6___ZNSt3__1L4moveIRPN3mup7ParserXEEEONS_16remove_referenceIT_E4typeEOS6___ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE8max_sizeERKS6___ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS6___ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEEC2EmmS5___ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEEC1EmmS5___ZNSt3__1L3powIdEENS_7complexIT_EERKS3_S5___ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZNSt3__1L4moveIRN3mup7ParserXEEEONS_16remove_referenceIT_E4typeEOS5___ZNSt3__1L16__to_raw_pointerIN3mup7ParserXEEEPT_S4___ZNSt3__1L16move_if_noexceptIN3mup7ParserXEEENS_11conditionalIXaantsr29is_nothrow_move_constructibleIT_EE5valuesr21is_copy_constructibleIS4_EE5valueERKS4_OS4_E4typeERS4___ZNSt3__19allocatorIMN3mup12ParserTesterEFivEE7destroyEPS4___ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__113__vector_baseIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE9push_backERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE8max_sizeERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNKSt3__16__lessImmEclERKmS3___ZNKSt3__16__lessIddEclERKdS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L3maxIdEERKT_S3_S3___ZL3powIdiENSt3__116__lazy_enable_ifIXaasr3std13is_arithmeticIT_EE5valuesr3std13is_arithmeticIT0_EE5valueENS0_9__promoteIS2_S3_vEEE4typeES2_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZNSt3__13expIdEENS_7complexIT_EERKS3___ZNSt3__1L3logIdEENS_7complexIT_EERKS3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__19allocatorIN3mup7ParserXEE7destroyEPS2___ZNSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup7ParserXEEclEPS2___ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__113__vector_baseIN3mup7ParserXENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEEC2ILb1EvEEPS2___ZNSt3__110unique_ptrIN3mup7ParserXENS_14default_deleteIS2_EEEC1ILb1EvEEPS2___ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE9push_backERKS2___ZNSt3__1L3powIdiEENS_9enable_ifIXsr13is_arithmeticIT0_EE5valueENS_7complexINS_9__promoteIT_S2_vE4typeEEEE4typeERKNS3_IS5_EERKS2___ZNSt3__1L25__libcpp_isnan_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L25__libcpp_isinf_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L28__libcpp_isfinite_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZN3mup8TokenPtrINS_8IOprtBinEEC2EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC2EPS1___ZN3mup8TokenPtrINS_8IOprtBinEEC1EPS1___ZN3mup8TokenPtrINS_9ICallbackEEC1EPS1___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3maxIdNS_6__lessIddEEEERKT_S5_S5_T0___ZNSt3__19allocatorIMN3mup12ParserTesterEFivEE9constructIS4_JRKS4_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup7ParserXEE9constructIS2_JRKS2_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIMN3mup12ParserTesterEFivEEEE11__constructIS5_JRKS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE9constructIS3_JRKS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup7ParserXEEEE11__constructIS3_JRKS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEEC2IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEEC1IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup7ParserXERNS_9allocatorIS2_EEEC2IDnS6_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup7ParserXERNS_9allocatorIS2_EEEC1IDnS6_EEOT_OT0___ZNK3mup6IValueeqERKS0___ZN3mup6IValueaSERKS0___ZN3mup5ValueaSERKS0___ZN3mup11ParserXBaseaSERKS0___ZN3mup7ParserXaSERKS0___ZN3mup8IOprtBinC2ERKS0___ZN3mup6ITokenC2ERKS0___ZN3mup9ICallbackC2ERKS0___ZN3mup11ParserXBaseC2ERKS0___ZN3mup11IPrecedenceC2ERKS0___ZN3mup11DbgSillyAddC2ERKS0___ZN3mup7ParserXC2ERKS0___ZN3mup8FunTest0C2ERKS0___ZN3mup5ValueC1ERKS0___ZN3mup11DbgSillyAddC1ERKS0___ZN3mup7ParserXC1ERKS0___ZN3mup8FunTest0C1ERKS0___ZN3mup12ParserTester7AddTestEMS0_FivE__ZNSt3__14coutE__ZN3mup12ParserTester8c_iCountE__ZN3mup8IOprtBinC2EPKciNS_9EOprtAsctE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN3mup8IOprtBinE__ZTIN3mup8IOprtBinE__ZTVN3mup9ICallbackE__ZTIN3mup9ICallbackE__ZN3mup8VariableC1EPNS_6IValueE__ZN3mup5ValuepLERKNS_6IValueE__ZN3mup5ValuemIERKNS_6IValueE__ZN3muplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_6IValueE__ZN3mup5ValueC1ERKNS_6IValueE__ZN3mup11ParserXBase11DefineConstERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_5ValueE__ZTIN3mup11ParserXBaseE__ZNSt3__1L7forwardIRNS_9allocatorIMN3mup12ParserTesterEFivEEEEEOT_RNS_16remove_referenceIS8_E4typeE__ZNSt3__1L7forwardIRKMN3mup12ParserTesterEFivEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIN3mup7ParserXEEEEEOT_RNS_16remove_referenceIS6_E4typeE__ZNSt3__1L7forwardIRPN3mup7ParserXEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRKN3mup7ParserXEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZN3mup11ParserXBase9DefineVarERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS_8VariableE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZTVN3mup11IPrecedenceE__ZTSN3mup11IPrecedenceE__ZTIN3mup11IPrecedenceE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZTVN3mup11DbgSillyAddE__ZTSN3mup11DbgSillyAddE__ZTIN3mup11DbgSillyAddE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRS3_S4_E__ZTVN3mup7ParserXE__ZTSN3mup7ParserXE__ZTIN3mup7ParserXE__ZN3mup5ValueaSERKNSt3__17complexIdEE__ZN3mup5ValueC1ERKNSt3__17complexIdEE__ZNSt3__16vectorIMN3mup12ParserTesterEFivENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIN3mup7ParserXENS_9allocatorIS2_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS2_RS4_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZNSt3__1L3absIdEET_RKNS_7complexIS1_EE__ZNSt3__1L3argIdEET_RKNS_7complexIS1_EE__ZN3mup11ParserXBase10DefineOprtERKNS_8TokenPtrINS_8IOprtBinEEE__ZN3mup11ParserXBase9DefineFunERKNS_8TokenPtrINS_9ICallbackEEE__ZN3mup11ParserXBase7SetExprERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt3__114__split_bufferIMN3mup12ParserTesterEFivERNS_9allocatorIS4_EEE17__destruct_at_endEPS4_NS_17integral_constantIbLb0EEE__ZNSt3__114__split_bufferIN3mup7ParserXERNS_9allocatorIS2_EEE17__destruct_at_endEPS2_NS_17integral_constantIbLb0EEE__ZTVN3mup8FunTest0E__ZTSN3mup8FunTest0E__ZTIN3mup8FunTest0EGCC_except_table9GCC_except_table149GCC_except_table29GCC_except_table19GCC_except_table109GCC_except_table8GCC_except_table278GCC_except_table268GCC_except_table38GCC_except_table138GCC_except_table18GCC_except_table7GCC_except_table17GCC_except_table217GCC_except_table6GCC_except_table76GCC_except_table276GCC_except_table256GCC_except_table146GCC_except_table336GCC_except_table126GCC_except_table16GCC_except_table206GCC_except_table5GCC_except_table185GCC_except_table175GCC_except_table15GCC_except_table4GCC_except_table14GCC_except_table23GCC_except_table13_atan2GCC_except_table332GCC_except_table12GCC_except_table302GCC_except_table91GCC_except_table81GCC_except_table61GCC_except_table241GCC_except_table131GCC_except_table11___gxx_personality_v0GCC_except_table0GCC_except_table290GCC_except_table280GCC_except_table180GCC_except_table260GCC_except_table10#1/28 1573634242 501 20 100644 259244 ` mpTokenReader.cpp.o x(__text__TEXT (&__gcc_except_tab__TEXT  4: __cstring__TEXT__const__TEXT__const__DATA`@;A__compact_unwind__LD( _P!H=__eh_frame__TEXTH}XypY h2  )YYP@` PP\UHHPH}HuHuHHH}HuHuH8HHuHuHƐHHuHuHƨHHuHuH}HP]ÉHEMH}H}H}H}H} fDUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH`H}HuHuH}H?H>H}HHHH}HHEHuHHuN HuȉN H}O$N$H}O(N(H}O,N,H}O0N0H}O4N4H}HǨHƨH}HHuHEHuHH}HHuHvpHwpHuHvhHwhHuHv`Hw`HuHvXHwXHuHvxHwxHuHHHuH8H8HEH}HEHEHHHEHEHEH;EWHEHHMHHuHHEHHHHuQHEH}HuHEHHEH`]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}HuH}HuH]f.UHH H}HuHuH9uHu HuH}HEH ]UHH0H}HuHuH}H}HHEHuHHuHEHH0]UHH H}HuHuH;uHu+HEHMHHHEH0HEHPH}HEH ]fUHH H}H}HHH}HMEE;EGHEHHcuHHHHE HEHHQEEHEHHH ]@UHH}H}HGH?H)H]@UHH@H}HuHuH~HH}HHuHuH;0lH}HuHUHHUHzHEH}HEH}HuHH}HEHPHHPH}H}HH@]ÐUHH}HuHuH6H}HHH]f.UHHPH}HuHuH}H>HHH}HuHuF F$F(F,F0F4H8HHuHuFPHFXHF`HFhHFpHFxHdžHdžHƐHHuHuHƨHHuWHuH>4XH=H5H  HEMH}H}H}H}HEH0HHP]H} fUHH}HuHuH}H>H}HH~XH}HPH~`H}H8H~hH}H H~pH}HǀHH}HhH~xH}HǰH]UHHH}HuH}HuH]f.UHH H}H}H}HEHHHEHHHEH8HHEHHH ]ÉHEMHEHHHEHHHEH8HHEHHH}fPH$UHHH}H}H]DUHH}HuHuH6H}HHH]f.UHH H}H}H}HEH}HuH}H}H ]HHUUHHPH}HuHuHuHHH}HHEHuHHEHHuHEH}HuHH}H}HEHEHP]ÉHEMH}HEMH}H} UHHH}HuH}HuH]f.UHHH}H}HH]fUHH H}H}H}HHEH}HHEH ]fDUHHH}H}H]DUHH H}HuHuH}HHuP HEHHHuH ]fUHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHH}uH}u w4w4]fDUHH}H}H8H]f.UHH}H}G ]f.DUHH}H}HH]f.UHH}H}HǨH]UHH0H}HuHuH}HHH}HHEHuHH}HEH0]UHHH}H}G G$G(G,G0G4.HHH}HHE@PH8HH]@UHHH}H}H]DUHH H}H}H}HEH}HuH}H}H ]HHUUHH H}HuUHuH}HuHHuFPH}uHHEH8HuHHEH ]f.UHH}H}H]f.DUHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHH@H}H}EH}HEH HHljM1Ɉʉu9ΈUEEۊEۨHEHHMHcq HAA UDE}Eԃ#E{HEHHMQ HcHǾ HEH} HEHEHEHHHEHEHEH HEH H EH@]f.UHHH}H}H]DUHHH}HuH}HEH]f.UHH @H}EHUH}EHUH ]ÐUHHHHuHuH>H(H HH=H5wH .HHG E1HMHHHHQUHuHHH HE7HEMBHuHCUHuHHH HEHH4qHuHCUHuHHH HE.HH4qHuHCUHuHHH HEHuHCUHuHHH HE3HuHCUHuHHH HEHuHCUHuHHH HEQHuHCUHuHHH HEHH4qHuHCUHuHHH HEVHH4qHuHCUHuHHpH HpEHH4qHuHooCUHuHH`H H`EBHH4qHuH__CUHuHHPH HPEHHHHqHuHOOCUHuHH@H H@EH}HH?H8HH HUHH844EHHHH(H`ƉH(HHEHHH`H HH HHH MM;H WHxHuHHEMHEMHHHEMHHHHcQ H0HHH`HHH0H0HxHH`HHH5HH\HEMHH`H}H}H(H]H}H}  f.DUHHH}HuH}HuH]f.UHHH}HuHuEHHHPHHPH HHljLL9HPH4 8H51ɉH#HEMHPx$* H51ɉHHPx,*+H51ɉHHPx(**H51ɉHdHPx0* H51ɉH)HP@4@H@H@H@H8H}H8H}HuH0H}E+HEMH@HEMH}Eܹ9XH}MHXHH(HpΉH(HXẺEH}H5H HPHHpHHHPH MĹxHHpHHH5HHtSHEMHX/HEMHEMHHpE$H]H}  @UHHH}HuH}HuH]f.UHHH}HuHuEHHHcF HPH HPH48 H51ɉH&HEMHPx$* H51ɉHHPx(**H51ɉHHPx,*+H51ɉHgHPx0* H51ɉH,HPH H @4@HHHHHHH@H}H@H}HuH8H}E+HEMHHHEMH}Eܹ9XH}MHXHH0HpΉH0HXẺEH}H5H(HPHHpHH HPH MĹxHHpHHH5HHtSHEMHX/HEMHEMHHpE$H]H}  @UHHH}HuHuH}HHH>HHH HUHHE̋MH;J EEHEM H}HHx`HEHUHEHEHEHEHHx`HEHUH}HuH}H1H}HHHEM{HH4hHuHEEH51ɉHH}HHHHHHHH HHH}HH}HuHH}H}HHHHHH H @4EEHEMH}E9H}|HHHH ΉHH|hHG tH}HH8HHHHH HHxHH HHH5HHH}HEESHEMH/HEMHEMHH 1H}E|*E$HĐ]H}H}  f.UHHH}HuHuH}HHH>HHH HUHHE̋MH;J EEHEMHHxhHEHuH}HHxhHEHuH}HEHEHHxhHEHuHEHHH}HH}H1H}HHnHEMH}HHHHHHHH HHH}HH}HuHH}H}HHHH H H4wH51ɉH-HEMH}E9H}|HHHH ΉHH|hHG tH}HHHH8HHHHH HHxHH HHH5HHH@4EE}H}HxEESHEMH/HEMHEMHH 1H}Et*E$HĐ]H}H}  f.DUHH@H}HuHuHHǐH@H E+H@HHH@HcO HHHHH8HH8HHH@HǐHvDž;HH@H HHcHH0H0HH@HHH(H@H H(H:HHH HHHHHH ЈuH@HHHHHcH@HcH HHHHH@G4@H51ɉH0HHHHHHH@@4HHHHH}HHHH}HHHHHHHH@H )HcHHHHHHHHEDžcHHgHHGDžHH9HHHHHH`ΉHHHH@G HxHHH@HH`HHH@H H)ʉxHH`HHH5HHHHH;HHHH`+EDžHHHHE$H@]H  @UHH0H}HuHuH>H HEH HHHEEHEHcMH<HEHcMH<HEHEHcMH4H}HEH HcQ HHUHHH}HHHH}HuH}H}QEԉHHHH HHHcHHEM HEMH} H H4*H51ɉH=H @4.@HƅgHHcMԉHuH4HhHHhHƅgH}HH}HuHH}Hh HEM,HEMHEMH}Hhg H! H H4*H51ɉH H H0H0x0*H51ɉH H @4.PHHHHHXHH}HXHHXV HEMH HEMHX H H4@*H51ɉH H H0H0@4.PHHHHHPHH}HPHHPH HEMHHEMHPH H4*H51ɉH{ H xP H @4,H @4.H H$H$@Hƅ/HHcMԉHuH4H0HH0Hƅ/HHHH}HHHHHH0HEM/HEMHEMHHH0/ H H H4*H51ɉHH @4H$H$x$*H51ɉH@HƅHHcMԉHuH4HH|HH|ƅH HH}H HpH HHEM/HEMHEMH H HmH H4*H51ɉHH @4. H(H(@HhƅHhHcMԉHuH4HH`\HH`\ƅHH`H}HHPHHHEM/HEMHEMHH HhH H4*H51ɉHH @4H(H(x(*H51ɉHVPHHHHHHH@HH@H}HH8H3HEMHHHEMHH H4@*H51ɉHfH @4.MH,H,@H0ƅH0HcMԉHuH4HH($HH($ƅHH(H}HHHHHEM/HEMHEMHH H06H H4*H51ɉHH @4H,H,x,*H51ɉHPHHHHHHH}HHHzHEMHHEMHE9H}H(HHH@ΉHH(H HH@HHHHHEHcMH4HXHH H xHH@HHH5HH3H51ɉHHEȉH H H EoEԃESHEMH(/HEMHEMHH@EE$H0]H}  BW}4UHHH}HuHuHHH=HHxxH#HHxXH EH}HH?HHH HUHHE̋MH;J EH}HP1H}071H}9EEHEM;HHHuHHHEHuHMHHHHHEHuHEHHHHHH4*H51ɉHEHA A4H}HHHHHHHH HHH}HH}HuHH}H}HHuHH}HHHHHH}HHxHpHxHpHhHhHH`EE\HEMH}HHxxHuHXHXHEHuH}HEHEHHxxHpHpHxHHPH}HPOO@HH4@*H51ɉHEHA A4H}H@H@HHH8H8HH HH0HhH0H}HhH(HhH}H HuH EEHEMHhE9lH}dHHHHΉHHdPHG \H HuHHHHHHxHHHHH5HHSHEMH/HEMHEMHHEEH}H}E$H]H}  UHHH}HuHuH~XHH EmH}HH?HHH HUHHE̋MH;J EEHEMHHxXHuHHHEHHyXHEH}HuEEMHEMPEHA H}HHHHHHHH HHH}HH}HuHH}H}HH5xH}HHHI0HuHH}HG4%H51ɉH]HEMH}HEMH}E9H}MHHHH(ΉHHEpHG H}艅HHHH)ʉ|H}HHHH@HHHHH(HHxHH(HxHH5HHxH@4EESHEMH/HEMHEMHxH(1H}Et*E$HĐ]H}H}  fUHHH}HuHuF4%H EH}HH?HHH HUHHE̋MH;J EEHEM"H}HHpHEHuH}HEHEHHxpHEHuHEHHH}HH}H1H}HHHEMH}HHHHHHHH HHH}HH}HuHH}H}HHHH H H4H51ɉHpHEMH}E9:H}MHHHH(ΉHHEpHG H}艅HHHH)ʉ|H}HHHH@HHHHH(HHxxHH(HpHH5HHpH@4JEE}H}HhEESHEMH/HEMHEMHpH(1H}Ed*E$HĠ]H}H}  f.UHHH}HuHuH}H(H(H>H H(H HUHH E̋MH(;J EH}HP1H}071H}9EEHEMH(H40HHHHH`ΉHHHEHxHuHH(HH`HHH(H MxHH`HHH5HHHEMHHHEMHEMHH`RH(HpHHvHHH@HH(HH@HHHH@HHHHH8HH}H8HH8HuH(HHEHHHHHHH@HEMHHEM/HEMHHEMH8H@iHHH1ɉHHH0HH}H0HH04HEMHHEMH0H}HHuHHuH(HHMHHHHHHHxEH(A A4EEH}E$HĐ]H}H}  fDUHH`H}HuHUMHUHHH}HcEH}HHuHUHM}HEHHME;EgH}HEHH}HHEHcuH}HEHEHHHEHcuH}HEHuHUH}HEEH`]f.DUHH@HHuHUHMHMHUHuH}HHEHuHMHUH}HuHUHMIHEH@]f.DUHH0H}HuHuH}H}HHEHuHHEH0]UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH@H}HuHUHUHHUH}HEHUHMH}HEHUHMH}HuHUHMIH@]@UHHpHuHUH}HUHuHuHuHuH}HuHUHEH}HEHEH;E?H}1AHEHuHEH+EHMLMH}HH$ HuH}H}HEH}Hu>H}HEH}HH}HH}H}HH}HEH}EHuHuH}HEHp]f.DUHHH}H}H}HHEH]DUHH H}HuHuH6HuHuH}HuHEHH ]UHHH}H}H]DUHHH}H}H]DUHH@H}HuH}HEHEH}HEHuH9 EH}HEH}HEH}"H}HuHUMaH}MHEHE9 E2HEHHEHEHHEHEHHEEE$H@]f.UHHH}HuH}HuH]f.UHH H}HuHUH}HuHUH ]DUHH H}HuHuH}H?Hu HEH8HEH8&HEH8HHEHHHRHHEHHMHHH ]UHHH}HuH}HuH]f.UHH H}H}HEHuH}HEH ]UHHHuH}H}HuH]f.UHHH}HuH}Hu$H]UHH H}H}HEHuH}HEH ]UHH@H}HuHUHUHHUH}HEH}HEHMH}HEHMH}HuHUHMIH@]f.DUHHH}H}HHH]DUHH H}H}H}H}HEHH ]fDUHHH}H}HH]fUHH H}HuH}HuHEHuH}HEH ]UHHH}HuH}Hu$H]UHHH}H}HHH]DUHHH}H}H]DUHHH}H}H]DUHH0H}H}HEHuH}HEHUH0]HHUf.UHH H}HuH}HEH}HEH}Hu$H ]f.@UHH0H}H}HEHuH}HEHUH0]HHUf.UHHH}H}HH]f.UHH H}H}HHH}HH}HEHH ]f.fUHH@H}HuUHuHHHuH5HHHEH8HHhHH@HpHH5HH}HHHHHUH HHhHH@HBHHu}}H׋UH@]ÉHEM#H HHEuHEHHHEHHH} UHHH}H}H}HHEH]DUHH H}HuHuH6HuHuH}HuHEHH ]UHH HuHUH}H}HuHUH ]DUHHH5H}H}H}HuHƀHH]UHH H}H}H}H}HE H}HEHEH ]ÐUHHPH}HuH}HuHEH}HHuHEH}HuHHMLEH}HEUHHHP]f.UH1H}]f.fUHHH}HuH}HuH]f.UHH0H}HuHuH~HH}HHuHuH;0_H}HuHUHHUHzHEHUH}HH}HEHPHHP HuH}H0]fDUHH}H}H?H]f.fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}HH]DUHH@H}HuHuH}HuuHEH0H}HEHpH}H}HEH}HEH H}HHEH}HuH}HuH@]HHUfDUHHH}H}HH]fUHHH}H}HH]ÐUHH H}HuH}HuH ]f.UHHH}H}HH]f.UHH H}HuHUH}HuHUH ]DUHHH}H}H]DUHH}H}H]f.DUHH H}HuH}H ]ÐUHHH}H}H]DUHHH}H}HHH}HH}H]f.@UHH}HE]fUHH}HE]fUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}HHH]fUHHH}H}H]DUHHH}H}H]DUHH}HE]fUHH}HE]fUHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HH}HH)HH]UHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH}HE]fUHH H}HuH}HuH ]f.UHH}Hu]fUHH H}HuHUH}H ]HHUDUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HH}HH)HH]UHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH}HE]fUHH H}HuH}HuH ]f.UHHH}HuH}H]ÐUHH H}HuHUH}H ]HHUDUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}H}H}H}H ]HHUUHHH}H}H]DUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHHH}H}H]DUHH H}H}H}HEHH@HHEHuHH ]HHUUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH H}H}HEH}HH}HuH ]f.UHHH}H}H]DUHHH}HuH}HuH]f.UHH}]fDUHH0H}HuHuHHHuHEHEHUHuHH}H}HEH}H8H0]HHU@UHHH}H}H]DUHH H}HuHUH}HuHUH ]DUHHH}H}HHH]fUHH}HE]fUHHH}H}HH}HHEHH]f.DUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}H}H]f.UHH}]fDUHH0H}HuHUHUHH}HUHuH}HHEH}HEH}HH0]DUHH}HE]fUHH H}HuHuH}HuHcHuHH ]f.DUHH}HE]fUHH H}HuH}HEH ]f.UHHH}H}H]DUHH}HE]fUHH@H}HuHuH;uHuRH}H}HEHuH}HEH}HEH}HEHuHUH}HEH@]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH H}HuH}HuH ]f.UHHHuHUH}HUHHUH8H}HE1H}M H}HuEEEEH}HEHEH HHuHEH}HEHEHEHuH}HEHEHEHMHMH}HE8HE؉MH}HxHEHxHEH@HE/HuH}HE؉MH}2HEHxHEH@HEHuH}H}Hu6H}HH}HHEH}HpHĠ]H} HHh UHHH}H}H0H}HEH]DUHHH}H}H}HHEH]DUHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}H}H]f.DUHH}Hu]fUHHH}H}HH]ÐUHH H}H}H}HHEH}H}HEH}H8H}HH@H}HH}HHEHx HEH@HEHEH ]f.UHHH}HuH}Hu4$H]fDUHHH}H}H H]ÐUHH@H}HuHuH}HuH}HEHEHUH}HuHUHEHH@]f.fUHHH}H}H HEHEHMHEH@HHEH@HEHEHx HEHEaHEHxHEKHEHH@HEH@HEHEH8 HEHEHEH8HEHEH]f.UHH0H}HuHuH}H HuH}HuHHEHuHUHEH}HHuH}HEH0]UHHH}H}HH}HH}HHH]ÐUHH H}HuH}HuH}HH}HHEHEH ]fUHHH}H}H]DUHHH}H}H]DUHH}HE]fUHH}HuHuH6H}H;7$]f.fUHH}H}H?H]f.fUHH}HE]fUHH0H}H}HEHEHHHMH}HHHUHEHUH0]UHH0H}HuHuH}HuHHuH>HH}HEHHuH~HHuHEHH0]fUHH H}HuHUH}HuHUH ]DUHH}HuHUHUHuH2HuHr]f.UHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}HH]f.UHH}H}HEH@H;8]f.@UHH}HEH8HEHHEHEHxHEH@HEHE]f.UHH}H}HH]f.UHH@H}HuHUHUHHUHEH}H}HuH}H H}HHU>HEH8HEHHEHEHMHHEHHEfAHEHxHEH@HEHEHMHHEHHE%JH}H}HHEHHEHEH@]f.UHHH}H}H]DUHH0H}HuHUHMHMHUHHUHBHUHuHVHUHuHHHMHH8#H}HHH}HEH}H8H}H8HEH0H}H0HH0H0]fUHHH}HuH}HuH]f.UHH0H}HuHUHUHuH}HUHuH}HuH$H0]UHH H}HuHUH}Hu$H ]@UHHH}HuH}HuH]ÐUHH@H}HuH}HuH}HHEHUHuH}EEH@]HHUf.UHH`H}HuHuH}HHEHGHEHHuHEH}HEH}H}HEH}HuHEHH}HuEă} EĉE;HEH;E E!HEH;E EEEH`]fUHH0H}H}H}H}HEH}HuHHEHUH0]f.fUHH}H}HG]f.@UHH H}HuHUH} EH}HuHUEEH ]UHH}H}H]f.DUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}HuHUH}HuHUH ]DUHH}HuHUHUHuH2HuHr]f.UHHH}HuHuH;uHu$F1HUH;UMH}HEHEЊHMߊEߨH}HEH}2H}HEH}HEHEHHHMH}lHE@^H}HEHEHEHMAH}HEHEHEHMH;MHMQHMAH}#H}HEHEHEH}H}HEHEHEHMAH}HEHEHEHMAH}J@H}HEHEHHH HMH}rHE@dH}HEHEHEHMAH}HxHxHEHMH;MHMQHMAH})H}HpHpHEH}H}HhHhHEHMAH}H`H`HEHMAH} Hİ]HHXf.@UHH0H}H}HH}H}H?HEHxHEHxHEHxHHEH@HMHAH}HEHMHIH&HEH}HEHEHEHMHHHEHMHH}HuH0]HHUUHH0H}H}H?H}H}HHEH8HEH8HEH8HHEH@HMHAH}HEHMHIH&HEH}HEHEHEHMHHHEHMHAH}HuH0]HHUUHH}HuHuH}H~]fDUHH}HuHuH}H>]UHH H}H}HHEHxHEHH}4H}HEHEHEHEH@HEHEH ]HHUUHH}HEH8HEHHEHE]@UHHH}HuHuH}HuHuHHMHuHHH}H HHEHuH}HUHEHEHEHuHUH}HuHUH}HuHUHH}H}HH}HEHĀ]ÉHEMH}H} UHHpHHuHUHUH}HHEHEEH}HuHU1HHUHEH}HuHUH}HEH}HH HHEH}H}HuHH}@EE%HEȉMH}H}HEHp]H} UHHH}H}HH]fUHHH}H}HH]fUHH H}H}H}HHEH}HHEH ]fDUHHH}H}H]DUHH1H}HuH}HuH]fUHH H}Hu$EH}HuE$H ]f.@UHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHH}H}H]DUHH H}HuHUH}HUHUHUH9 H=]tHMHHH ]DUHH}H]f.fUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHH}Hu$EHuH}H>E$F]UHH0H}HuHUH}HUH}HHuH}HH0]HHUUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHHuHH ]f.DUHH}HE]fUHH H}HuHuH}HuH0H}H7H@HGH ]UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH H}HuHUHUH}HUH}HH ]fUHHH}HuH}HuH]f.UHH0H}HuHuH}H}HHEHuHHEHHuHHH0]ÉHEMH}H} UHHH}H}HH]ÐUHH}HE]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH1H}H}H]ÐUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHH0H}HuHuFHu;HEH8HMH H}HHEH}HuH}HMH9HuH0]HHUf.DUHH}HE]fUHHH}HuH}HuH]f.UHH}HuHuH}H>]UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuH}HuH ]f.UHHpH}HuHUHUH}HuHUHEHEH}HEHUH9HEHEEHEH}HEH}H9!EHEHEH}H}HH}HuHEHHEEIHuHUHEH}HuHUHEHUH)H}HuHEHUHHM HuH}7H}HuH}H}HHuHUHMH}H}Hp]UHH}Hu]fUHH H}HuH}HuH ]f.UHHH}H}H]DUHH}H}HGH?H)H]@UHH H}HuH}HuH ]f.UHH0H}HuHUH}H}HEH}HEH}HuHH0]UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH H}H}H?H}\H}H}H}H7HEHuH}HuHHEHHHEH@HH ]UHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHH}HHHHE1ɉH}H8H}H0]f.UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH}]fDUHH}HuHuH}H)HH]UHH}HuHuH}HH7H7]UHH H}HuHUHEH;E.HuH}HEHEHHEHEHHEHEH ]fDUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHHEHEHHHH0]f.@UHH}]fDUHH}HuHU]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH}Hu]fUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H=MbHMHHH ]DUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}HE]fUHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUHHUHH ]f.UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHHH}H}H]DUHH H}H}H ]DUHHH}H}HH]ÐUHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H=YHMHHH ]DUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH01AH}HuHUHMHMHUH)HHMHMHUH2I)ILH2H}HEHHMHUHHHH0]fUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH}]fDUHH}HuHUHMLE]fDUHHH}H}H?H]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHHPH}HuHuHHuH}HEH}HEHHuHH}HuHuHHH}HEH}HEHHuHH}HEHuHHUHMLEHP]UHH H}HuH}HuH ]HHUf.fUHHH}HuH}HuH]f.UHH H}HuHuH}HuH}HH ]f.UHH}HE]fUHH H}HuHuH}HuHHuHH ]f.DUHH1H}H}H]ÐUHH0H}HuHuHHuHHEHEH}HEHuH0H}H}HuHH0]f.UHHH}H}H]DUHHH}H}H]DUHH H}HuHuHHuH}H}H ]fDUHH}HE]fUHH}H}H]f.DUHHH}H}H]DUHH}HE]fUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUHHUHH ]f.UHH H}H}H}H}HH}HH}H}HEHuH0H}HH ]UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH}HE]fUHH H}HuHuH}HuHuHH ]fUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH0H}HuHUHMHEH;ESH}HEHHH}HH}HH}HEH}HuHHEHHHH0]ÐUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHHH}H}H]DUHH}HE]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHHH}H}HH]ÐUHHH}H}H]DUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHH H}HuHuH}H?H>H>Hu HEH8H ]fUHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuHHuH}H}HEHuH>H8H~HxH~HxHuH}H}H0]@UHH H}H}H}H}QH}H}HEH}HEHH}HuH1ɉH}1ɉH}H ]f.UHH H}HuH}HuH ]f.UHH H}H}H}H}+H}EHHu1ɉH}&H}EHHu1ɉH}H ]HHUfUHH H}HuHUH}HuHUH ]DUHHH}H}H]DUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuH@EMH ]f.@UHH}]fDUHH}HuHuHu]fDUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuHUH}H ]HHUDUHHH}H}H]DUHH}H}H]f.DUHH0H}HuH}HuH}HHH}HEHEH0]f.UHH}HE]fUHH@H}HuHUHMLEHMH;MpHEHEHEHEHEHEHEH;EEH}HuHUHHEHMH)HE#HEHHEHEHEH@]@UHH0H}HuHUH} HE)H}HEH}؉HUH}؉HEHEH0]ÐUHHH}HuH}HuH]f.UHH}HuHuH}H>]UHH}HuHuH}H>H>H]ÐUHH0H}HuHuHuHuHuH}HuH0]f.UHH}Hu]fUHHH}HuH}Hu4$H]fDUHH}H}H]f.DUHH}H}HHHH]DUHH H}HuHuHHuHuH} HuH}H ]f.@UHH H}HuH}HuH ]f.UHH H}HuH}H}HEHuH)HH ]f.UHH}H}H]f.DUHH H}HuH}H}HEHuH9H ]@UHH H}HuHuHHuHuH}HuH}HuHH ]fUHH H}HuHUHUHHUHuHUH}H ]DUHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=m9HMHHH ]DUHHH}H}H0H}HEH]DUHHHuH}H}HuH]f.UHHH}HuH}HuH]f.UHH}HuHuH}H>]UHHuH}HuH}H>]UHH HuH}H}HuHuHuH ]DUHHHuH}H}HuH]f.UHHuH}HuH}H>]UHHH}H}H}HHEH]DUHHH}H}H]DUHHH}H}H HH]fUHH}HE]fUHHH}H}H]DUHH}HE]fUHHPH}HuHUHMLEHMH;M HEH} HEHE{HEHMHHHMHHMHuHHH}HHHHMHEHEHEHMHUHUH9 HEHEHMH)HEHEHP]HHUUHH@H}HuHUHMHMHUH)HMH} HEHEHEHMH)HEHEH;E HEHEHEMHEHMH)HEHEH;E HEHEpH}HEH+EHHHUHEH} HEHE8H}HuHU HEHEHEHHEfHEH@]f.UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH`H}HuHuH}H}HHuH}HEH}HuHUHHEH}HEH}HuE1EDM3H}HuH}HEHuH}HuH4EE HEHE H}HEHEH`]f.UHH@H}HuHUHMH}H}H}VH}H}H HUH}HHuHEHEHEHHE HEH@HEHuH}HEH@]UHHH}HuH}Hu4$H]fDUHHH}H}H H]ÐUHH H}HuHUHUH}HUHUH}H$H ]UHH}HuHuH6H}H;7$]f.fUHH}H}H?H]f.fUHHH}H}H]DUHHH}H}H HH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHHH}H}H]DUHH}]fDUHHH}H}H}H}HH]@UHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHH}]fDUHH H}H}HEHuH}HEH ]UHHHuH}H}HuH]f.UHHH}H}H}HHEH]DUHHH}H}HHH]fUHHuH}HuH}H>H}H~]f.DUHH H}H}HEHuH}HEH ]UHHH}H}H0H}HEH]DUHH}HE]fUHHH}HuH}Hu$H]UHH}H}HH}HE]fDUHH H}H}H}H}HEHH ]fDUHHH}H}HH}HH}HHH]ÐUHH0H}H}H?HEH8HEWHEHEH}H}HEHEHEH}HEHEHEHEH0]HHU@UHH}HEHxHEH@HEHE]fUHHH}H}HH}H}HH]ÐUHHH}H}HH]f.UHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHH H}HuUH}HuUH ]UHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH@H}HuUHuHHuH5HH}H7H@HuH}HHuH}HuHFXUV`HuH}H@]ÉHE؉MH}HEHH} UHH H}H}HEH ]ÐUHHH}HuH}HuH]f.UHHpH}HuHuH}HH@H}HHEHuHHuHFXN`HEjHEH@HH}H@HEH}HHEHxXH}H@HEH}H@HEH}HOXH}HuHHE؋H`&HEH@HHEHEH@HHEH}HGXH@HEH@H}HH}HHEHuH@HHEHuH@HHEHuH@HHEHuHH}HEHuHHUHE؋H`[H}$HEHǾHEH-HEH}HEHMHljHp]fUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH H}HuH}HuH ]f.UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHHH}HuH}HuH]f.UHH}HuHuH}H>]UHH}HuHuH}H>H>H]ÐUHH0HuHUH}HUHHUHUHUHUHUHuHUH}H0]DUHHpHuHUH}HUHuHuHuHuH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}H}Hu>H}HEH}HH}HH}H}HH}HEH}EHuHp]f.@UHH0H}HuHuHuHuHuH}HuH0]f.UHHH}HuH}Hu4$H]fDUHH}H}H]f.DUHH}H}HHHH]DUHH H}HuH}HuH ]f.UHH H}HuH}H}HEHuH)HH ]f.UHH}H}H]f.DUHH H}HuH}H}HEHuH9H ]@UHHH}HuHUHMLEHMHUHHuHpHEHEHHEEHEH8H}H}HhH}H`H}HXHpHhH`IHuHUHXHPHHHpHPHHHH}HEEH}HEMH}>HuHxHH@H}HUH@HEUH]H} UHHH}H}H}HHEH]DUHHH}H]fUHHPH}HuHUHUHHUHEH}HEH}.H}HuH}H H}HHUNHEH8 HEHHEHEHHEHEHMHHEHHEH}H}H HUH}HHuUHEHx%HEHHHEHEH@HEHEHMHHEHHEBHEHMHHEHE%H}H}HHEHHEHEHP]f.UHHHHuHUHMLEHMH}HHEHEEH}ADHuHM1HHEHMH}HuHUH}HEH}HH HHEH}H}HxH}HpH}HuHxHpIH}@EE%HEMH}H}HEHĐ]H} f.fUHH}HE]fUHH}HE]fUHH}HE]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]f.UHH}HE]fUHH`H}HuHUHMLEH}HuHMH}HHuH}HEH}HEH}HuHUHMIH`]UHHPH}HuHUHMLEH}HuHMH}HHuH}HEH}HEH}HuHUHMIHP]UHH`H}HuHUHMLEHMH}HMH}HEHHEH}HuH}HEH`]f.DUHH@HuH}H}HuHUH@]fUHH0H}HuHUH}HuHUH0]DUHHPH}HuHUHUH}HUHH}HHEH1ɉHHP]ÉHEȉMH}H} f.UHH}HE]fUHHH}H}H]DUHH}H}H]f.DUHH H}HuHUHUH}HUHHUHH}HEHH ]fDUHH}HE]fUHH}HE]fUHHH}HuH}HuH]f.UHH0H}HuH}HuH0]f.UHH0H}HuH}HuH0]f.UHH@H}HuHuH}HuH}HH@]f.UHH H}HuHuH}HuHuHH ]fUHHH}H}H]DUHH}]fDUHH H}HuHuH}H>H>Hu HEH8H ]DUHH H}H}H?H}@HEH8HEHEHHEHHHRHHH ]HHUUHHH}H}HH]ÐUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHHH}H}HH]ÐUHH}HE]fUHH}]fDUHHpH}HuHuHHuHEH}HH}HH}HEHMH}HuHH}HEH}HH}HEH}HuHHEHHEHuH}H}Hp]ÉHEMH}H} UHHH}H}H]DUHH}HE]fUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}HuH}HuH]f.UHH H}HuHuH}H?H>H>Hu HEH8H ]fUHHH}H}H]DUHH}H}H]f.DUHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH}H}HGH?H)H]@UHH H}HuHUHMH}HuHUHMH ]f.UHH H}HuHuHHuHuHHuH6H}HWHMHHHEHMHHHHEHHMHHHHEHH}HEH}HHEH@HMHH}H}HH}H ]f.UHHH}H}H]DUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHHH}H}H]DUHH H}H}H ]DUHHH}H}HH]ÐUHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHHH}H}H}HH}HH)HH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHHPH}HuHUHMHMHHHEHuHHUHuHHUHMH}H}HuHHE 1HMHEHMHHHUHHHAHAHHUHHHHEHMHHP]UHH H}HuHUH}HuHUH ]DUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH0H}HuHUHUHH}HUHuH}HHEHH}HEH}HH0]ÐUHH H}HuHuH}HuHuHHEH ]f.UHH}HE]fUHH H}HuHuH}HuHuHH ]fUHH H}HuHUH}HUHUHUH9 H= HMHHH ]DUHHH}H}HH]ÐUHH}H}H]f.DUHHH}H}H]DUHHPH}H}H}H}HEH}HEHH}HHEH}HH}HEHH}HHEH}HH}HEHH}HHEH}HHuHUHMLEHP]f.fUHH0H}HuHUHMHEH;ESH}HEHHH}HH}HH}HEH}HuHHEHHHH0]ÐUHH H}HuH}HHEH}HHuHH}HHuHH ]@UHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH}]fDUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHH}HE]fUHH0H}H}H}H}H?7H}H}H7HEHuHEH}HuHUH0]HHUUHHH}H}HwH]ÐUHH H}HuHUH}HuHUH ]DUHHH}H}H}HH}HH)HH]UHH H}HuH}HuH ]f.UHH0H}HuHuHuHEHMH;A;H}H}HOHHOHHEH}HH0]HHUfUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHHH}HuH}H]ÐUHH H}HuHUH}H ]HHUDUHHH}H}HH]ÐUHHH}H}H] n wC l  h *L**goY *L5 .Ac}p6(((2 ~2({}ymll6(((: ~2({}]R1|@z N }]Q1.  KNb }qdzz@   2 G   }|| 25 12 |:     y e   8    8$8 :8 8$ y:8 8$ A+}m`I F  ! a  /    }]RM. ! 8b}]RK.  KK  }z1./(j 2 2   l [  9  9VVY ]"  / L t  / L t  /   - 9T 9T -p%PY , J@>; RKK`M*Z  G+9 (C ??RG( 1" Cf * M~~.1 * M 7 d O k  (~~.1~~.1 7 d O k %/d    / r Q$ UU `[ ll u4 CX] AA XM( %/d~~.1 * M 7 d O k  /TokenReader/Users/jgomez/muparserx/parser/mpTokenReader.cppm_pParserReadNextTokenxxxallocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup11ParserErrorEN3mup11EErrorCodesENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEp@@h@h@ppA  @ @`#9@Wp0# Ay0#`A,0 P # XA< AL #  :@ ` > P p     I@ l  XAd0ep%#/ q At#A#A0"AP'A ,Al2ABAlIANA<SA0Y ZaZ9ZZ[0[l[1\+]9P]p]]^#^+_}_#_0_#`(@`0p`q`+ a*Papa8a(a+b0bPbEAbBbEA,@c#pc4cA<d+d90e+`e9eOespff#fpggggg+ hAThhi#@i#pi+iiij j2`jpjj;Adjj'k0kPk`kpkkZkl+@l`l0lAtm#@mPm#mm;Ammn0nPn`nnZno+0oPo0oAp#0p@p#ppp;Appq0qPq`q2qBqi`rrr(rrs0sCs(sWwZpw x0zA}0}#`}#}}}}20~*`~~"~@~OP1'0@` L$@`%V#@u"M@(p9AЃO 1`$ `Ap #I6Pp `A#0I6 30P# |A0+`'1 @` p[Њ1 0#`~0P#/A ++0Pp`*Thp/> 0$`InP+%Д0"`V #H`,/VA4 DPpH#M`(+%"AD AXAl A,AA0:p'2+0F[ dA#? (POA+_@P19F07p#oA0@`pe0AЫ#0P$#Y #Pp#MkrA  б  Zp+r0 @`FF7P`0PpYA'0ж  @`[#@M+F0@ PA0P`Fк5 3YA,` @+@'p_ .P[wPL@ PppA<00`#wAL0P4A\@#p31 e: @`pFAlF5@hFAF0@73+_`p.@LpA@`0#wA@`O' @P;pA>@`l#Ap+22@ Pp/;A Cp0_#3@P*R #P6<G@;2#/ e'/0Pp[+ #P#+# @+p'A @P@*0@p$'0@` , 00`#+'! 0P+(*/@A./@#p7Ap)U +PKAPp#OA,# Cp## Kpb3 *Pp#6 <`oA<+ DAT 0@+p#p pa'0+`uAh0J###03p. ;pAx+F @P `A@`pF70#`>3YA@` 0Ppp+' _p 6  . [P p   p  L@     0 P ` p pA +00`#wA#@#p;AzPLRx ,$AC zRx $AC $DAC $lAC $AC $AC $AC $ xAC $4pAC $\h#AC $p9AC $@AC $WAC $؄AC $$PAC $LHAC $t#AC ,ӏAC $HyAC $#AC ,lcAC $LHAC $t@#AC ,HXAC ,xӎAC $#AC $$ AC $L:AC $t0AC $(>AC $@AC $ȉAC $AC $<AC $dAC $AC $IAC $ȉlAC $AC ,|XAC $\8eAC $AC $xAC $%AC $AC $$#AC $L/AC ,q SAC $`#AC ,h7AC $#AC ,t_AC ,AC ,0ۋAC ,  AC ,4 OAC ,d AC , AC , AC , PKAC $ AC $ aAC $$ 9AC $L AC $t AC $ AC $ lAC $ 1AC $ 0+AC $< 89AC $d PAC $ HAC $ @AC $ (#AC $ 0+AC $, 8}AC $T #AC $| 0AC $ #AC $ (AC $ 0AC $ qAC $D +AC $l *AC $ AC $ 8AC $ 0(AC $ 8+AC $4@AC $\8AC ,0EAC $PBAC ,,xEAC $ #AC $44AC ,3AC $+AC $9AC $+AC $9AC $,OAC $TsAC $|XAC $P#AC $XAC $AC $AC $DAC $lAC $+AC , AC $HAC $@AC $<8#AC $d@#AC $H+AC $PAC $HAC $@AC $,8AC $T02AC $|HAC $0AC ,;AC $(AC $$ 'AC $L(AC $t AC $AC $AC $AC $ZAC $<AC $d+AC $AC $0AC ,,AC $ h#AC $4pAC $\X#AC $`AC ,H;+AC $XAC $PAC $,HAC $T@AC $|8AC $ AC $ZAC $PAC $H+AC $DPAC $lH0AC ,PSAC $#AC $AC $#AC $<AC ,;AC $AC $AC $AC $ AC $4AC $\h2AC $BAC $iAC $AC $AC $$(AC $LAC $tAC $AC $CAC $(AC $WAC $<8ZAC $dp AC $XAC ,S|AC $AC $ #AC $4#AC $\AC $AC $AC $2AC $*AC $$AC $L"AC $t@AC $AC $OAC $1AC $AC $<'AC $dAC $AC $AC $AC $ AC $, AC $T AC $| x AC $ `AC $ XLAC $ $AC $!AC $D!%AC $l!VAC $!AC $!#AC $!uAC $ ""AC $4" MAC $\"H(AC ,"P9vAC $"`AC $"XOAC $#1AC $,#$AC $T#AC $|# AC $#AC $#xAC $#`AC ,l$X`uAC $L$ AC $t$p#AC $$xIAC $$AC $$6AC $%AC $<% AC $d%AC ,%x`sAC $%#AC $%IAC $ &6AC $4&AC $\& AC $&3AC $&AC $&#AC $& AC ,t'|+rAC $T' AC $|'+AC $' 'AC $'(AC $'1AC $((AC $D( AC $l(AC $(AC $( AC $([AC $ )(AC $4)1AC $\)(AC $)#AC $)AC $)AC $)~AC $$*PAC $L*HAC $t*@#AC ,*H/nAC $*H+AC $*P+AC $+XAC $D+PAC $l+HAC $+@AC $+8AC $+ AC $ ,AC $4,*AC $\,AC $,TAC $,AC $,hAC $,/AC $$->AC $L-AC $t-AC $-AC $-$AC $-AC $.AC $<.IAC $d.nAC $.(+AC $.0%AC $.8AC $/0AC $,/AC $T/AC $|/AC $/"AC $/VAC $/0AC $0(AC $D0 AC $l0AC $0#AC $0HAC $0,AC $ 1/AC ,1VShAC $d1 AC $1DAC $1AC $1HAC $2 AC $,2#AC $T2 MAC $|2H(AC $2P+AC $2X%AC ,D3`"fAC ,t3`fAC ,3kfAC $3AC $3AC ,$4eAC $4,AC ,|4eAC ,4eAC $4AC $4AC $4:AC $5AC $,5'AC $T52AC $|5+AC $5FAC $5AC $5[AC $6HAC ,6@dcAC $t6AC $6x#AC $6?AC $6(AC ,d7OcAC $D7AC $l7+AC $7_AC $7AC $71AC $ 8AC $489AC $\8FAC $87AC $8(#AC ,$90oWaAC $9pAC $,9hAC $T9PAC $|9HAC $90AC $9(AC $9AC $:eAC ,:P_AC $t:AC $:#AC $:AC $:AC $;$AC $<;#AC $d;YAC $;AC $;#AC $;AC $<AC $,<#AC $T<MAC $|<kAC ,<@r]AC $<AC $<AC $$=`AC $L= AC $t= AC $= AC $=ZAC $=AC $>+AC $<>rAC $d>0 AC $>AC $>FAC $>8FAC $?`AC $,?H7AC $T?`AC $|?HAC $?AC $?AC $?AC $@AC $D@AC ,@YYAC $@'AC $@AC $@HAC $A@AC $AC $LTXAC $tTPAC $THAC $T@lAC $TAC $U#AC ,UEAC $lUh+AC $UpAC $Uh2AC $U2AC $ V AC $4VAC $\Vx/AC ,V;DAC $VAC $VAC $WCAC $,WAC $TWAC $|W_AC $WP#AC $WXAC $WPAC $XH3AC $DX`AC $lXH*AC $XPAC $XHAC $X@RAC $ Yx#AC $4Y6AC $\YAC $Y<AC $YGAC $Y;AC $Y2AC $$Z#AC $LZ/AC $tZeAC $ZX'AC $Z`/AC $ZhAC $[`AC $<[XAC $d[PAC $[HAC $[@[AC $[x+AC $\#AC $,\#AC $T\AC $|\AC $\+AC $\#AC $\AC $]+AC $D]AC $l]'AC $]AC $]xAC $]pAC ,\^X+=AC $<^AC $d^ AC $^AC $^AC $^AC $_ AC $,_ *AC $T_ AC $|_ @AC $_0 $AC $_8 AC $_0 AC $`( 'AC $D`0 AC $l`( AC $` AC $` AC $` AC $ a ,AC $4a AC $\a AC $a AC $a AC $a 0AC $a #AC $$b +AC $Lb 'AC $tb !AC $b 0AC $b +AC $b AC $c (AC $AC $|pAC $pAC $pxAC $pAC $q3AC $DqAC $lqAC ,qY[*AC $qAC $qAC $rAC $-'----_- ~-h--}-d-I--u-|-u-Q{-7P-.--7--u---x-y-x-|-5w- v-u-t-s-|O-6c-d-q-\-Yp-M\-o-n-m-dl-Qk-j-P-t--r-\-h-Qg-f-e-Y-X-W-d-nY-aX-TW-c-Y-X-W-_--ab-P-W-W-]-`-Y-uX-eW-S-GT-3[-"Z-Y-- -2_-+--_-@-j-M-@- ^-]-\-P-Z-6-}W-fW-UV-G!-*U--Y-X-W--BV-5V-V-V-U-9T- S--R--Q-lP-Z-M-9-(-----i--O-a-@-N-L-YM-ML-<- K-O--I--X-!-:-j-j--m-j-~:-[-Cj-2j-:-j-u-H-ah-CP-:-.t--F-E-I=--s- D-=C-eP-\x- A-@-=?-Y-Q-5>---O-4-4-|3-b<-+;-:-)-m-a9-Bz-18----7-y6-Rz-A5-4-3-2-1-1-q0-Q/-!.---,--aB-Q-!,---+-p-#}-@-*--)-}-- -t-1(-'---O- -%-$-0-#-]-Q - "-!-i -9- - -i-h--A-!---P- -h---z-Z-M-9-(-----i---q-`--l-- ---r-e-9---v-i-)--}-n--U-H -@- -O---#-- - -cO-Q-D-4-&-- -v-----r-^m-Q-D-.v-%------q-Q-4d-O-c-d-1- -----v-q-U-3O-- 4---u-U-<O-*-----x-e-U-"5--4---r-W+-J-/-"-----U-I-4-(----w-&----.--v+-^-R-E1-9---3---m-a-- -P---2-5-z-m4-Y-E+-8-)+-3--- - -z -j$-a&-U-!---P--v-h:-J(-:---- -- ----Q-----{-o-T%-<%-----Y-0O--- ----y-l-A-%-O----y-E-%- O------6--------u-e-=----g -Z-?-2-%---i-h-q-=----ؿ---]-1------ѽ---q-UO-3I-"----˼-¼- ----y-^-G-(----`-Wh-<----A-'P---:-ڹ-ʹ--- --y -l-- -Ѹ--]L-)-i-h-ѷ-q-1----ƶ---~-f-Y-L--O-ӵI-µ----e-D4--Ӵ+-ƴ----|-=-1--ܳ----4--;--`-Wh-<- -1-Ұ-ư3-h--\1-P-@-,3-#*-O-ׯ--ʯ-+--q6-h-L2-73----ٮ--a-9-.-0-.-խ-ȭ/--0-+-V-B-6+-+--լ-~-a-A-}-O---i-{-f-`-ܪ`-z-y-Qx-%w- P-t--˩r--]-Q8-u- 8-s-mq-5t-)s-r-q-ѧp-O-n-tm- =j-ɦl--~P-u-c-Zk=S=Gj-4-i-ڥh-եg-f-le-\8-!d-c-b-a-U`-E`-!_-_-P-ϣW-W-]-\-z8-h-\T-H[-7Z-Y--ҢP-ɢW-W-6-V-!-sU-I -/5-#T--8-O-s4-[3-DR-٠O- O-4-b3-?O-O-O-4-3-bO-O- -4-4--n4-X3-4-4-4--4-c4-Z -@4-/3-4-ќ4-4-4-r3-`4-14-M--L-K--2J-":-j--I-vH-ij-\G-O:-O--E-D-}C-IB-9-A-×$-- - - -r --Ӗ -9@---?->-q=-9-)<-!8-u-;-8-Ǔ:--9--̒-8-7-Z6-M!-1 -!5--4--@3-2-ڐ1-͐-0-y/-&$- - - - -Տ -.-a--!,-+--͎+-*-O-P-z-m(-a'-Y%-C|-,&--ҍ-͍&--t-R"-4'-"&-%-ٌ|-(-$-i#-E"-%!-- -ދ-Ջ-ċ--q-E------1---lj--}-u-Q-!-O- - -Ԉ - -i*-A -)- -ч--o-c-W--O----a-----ׅ--lO-U-%--ф--z-G-;---O--- -т--m-)--v-{o--܀-Ҁ-!-----a-=-+-v-~-y}-q}s-I}-|-|-|-|j-y|-]|-G|-?|-3|-{-{-{-{:-{j-{{-l{m-P{q-{-z-z-z-z-z-|z-oz-[z-Qz-z-y-y-y-y-y-y-y-zy-Wy-Oy-3y-#y-y-x-x-x-x-x-ix-Wx-Ox-6x-)x-x-x-w-w-w-w-:w-v-v-v-v-v-v-ev-Rv-%v- v-u-u-u-lu-?u-2u-u- u-tj-Zt-,t-t-s-s-s -is-]st-;sI=!s -s-r-r-r-r-rr-Or}-8r -qt-qt-qt-q-qt-Aq-%q-p-pO-p-p-Yp-p-oO-o-o4-o3-eo-Eo-!o-n-n-n-n3-n,-qn-An-%n-m-mO-m-im-)m- mO-l-l-l-ul-Ul-1l-l-k-k-k-k-k-Ak-!k-j-j-j-jO-j-Hjt-?j-j-i-i-i-Yi-Qi-)i-i-h-hO-h-h-h-ih-h&-h-g,-g+-g-`g6->g-5g-%g-g-g-f-f-Uf-Mf-=f#-0f!f-f-e-e-ev-e-|e-keH=Qe-e-d-d;-dP-d-d}-dH=bd-%dJ=d- dH=cJ=c-c-Yc-Qc-1cO-c-c-b-b-b-bO-rb-ab-Ab-!b-b-a-a-a-az-a$-aa-5a-a- a-a-`~-`:-`j-`:-`j-b`z-Q`}-)`|-_{-_z-_y-_m-H_c-._d-^x-^w-^-]v-]j-]j-]:-]:-]-a]j-4]u-\t-\s-\r-\-\q-\-{\p-Z\o-I\;-@\n-.\p-[:-[m-[l-[k-z[-][:-P[j-![-[-Z-Zi-sZs-[Zh-Z-Yg-Yf-Yg-Yf-Y7-mYe-"YP-Yt-Xt-X-X-X[-dX-VX-N-9N--N-Nt-M-M=MA=MQ-M-}Mu-WMu-8Mf- M-M7-Lf-L-Lt-LR-L-mL-TLt-=L-&L-L@= L-Kt-KR-KK-K-K-sK-9K-K_-J^-JL-J\-7J-J_-I-I[-IP-It-It-qI-lI-`I-8It-I- I=IA=HQ-H-Hu-Hu-wHt-fHR-JH-,H-H-G[-G-G-G-G-ZG-;GN-G- G@=G-FM-FK-FL-tFK-PF\-7F- F-E-EN-EN-E[-eE-\E-GE-5E-D-DN-D-D@=D-^DM-KDK-0DL-DK-C\-C8-C8-~C:-NC-%C_-C-B[-B[-B[-sBP-PB-KB-?B-Bt-A-A@=A-A-A=AA=AQ-gA-?A?-Au-@t-@R-@-@-@-i@-O@-7@-"@- @V-?-?-?@=?-?-|?@=o?-H?-*?t-?->t->->->->T-r>R-1>- >-=@==-=-=-=-~=-i=-Q=]-+=-=-=@==-<-<@=<-<-q<t-e<-/<t-#<- <-;-;T-;R-x;-Q;-E;@=8;-;-:t-:-:t-:-:-x:-Y:T-;:R-9-9-9@=9-9-9@=9-^9-@9t-49-8t-8-8-8-8T-8R-G8-7-7@=7-7-7-7-i7-T7-<7W-7-6-6@=6-6-6-s6-[6-F6-.6W-6-5-5@=5-5-5@=5-]5-?5t-35-5t-4-4-4-4T-4R-R4-34-'4@=4-3t-3t-}3t-n3Y-\3X-!3R-3-2Q-2^-2P-r2-f2t-U2-I2t-*2-%2-2-1t-1-1=1A=1Q-1-q17-I1u-#1u-0t-0R-0-0-0Y-f0Y-20t-0-/t-/[-/V-/U-r/T-_/T-=/-4/-/-/-.b-.t-.t-a.-U.@=H.-&.t-.n--R--Q-]-Q----,X-, -,-,t-,S-,R-_,Q-9, -+P-+t-+t-+-+-+-x+t-B+O-+- +=+A=*Q-*-*u-*u-*f-i*-D*t-3*R-*-)-)-)-)@=)-)7-k)N-b)-M)-;)-)-(N-(G-(N-u(M-e(K-J(L-2(K-!(J-(K-(J-'-'a-s'-='P-4't-'t-&-&-&-&t-&H-x&-l&=e&A=Y&Q-@&-(&u-&u-%F-%t-%R-%-s%-Z%-"%7- %f-$-$-$-$-$-i$F-[$-O$@=B$-$-#G-#F-{#E-f#D->#C-)#B-"-"`-"-t"P-U"-P"-D"-"t-!-!=!A=!Q-!-!u-z!?-u!d!t-S!R-7!-!-!- - - - - U-l -E -9 @=, - -@=--@=--@={-K-?@=2-8--P-u-p-d-<t--= A=Q--u-?-t-sR-W-<-#- ----S--h-\@=O---!@=--@=--@=-n-b@=U- 7-7--P--g-Yt-P-D-*-=A= Q--t-=-<-ut-Au- u-t-R---]_-N-4----v-E- ----b-1----m-N------l-;------Y-----v-E------~-tmfg-;-:-Z7-.9-8-7-`1->6-55-%4-3-2-1-0-sZ-h-Xe-P-$O- .- -- ,- +- %- *- )-/ -" u-@ 8- - (- - - - - '-Q &-% %- %- $- #- P- !- -f !-Y -K -? -6 - - - O- - - - -A -+ -" - O- t- 4-;--t-4-;--u-I-P--tt-k4-b;-Y-@-6/(---K-9-------x-W--- -Y3-A----y-Q5-1<-- - -~ -l-_ - -u-1----P-t-4-;--s-f-O-8-$-@M,@M@M\@M@M\@M@M@M @MFxph~`XPH@ 8 0B Gyzvw`XP80({|JJ>>??==>JMNChK`LXC@80CDE_^^^^^^`^X^P^@^ ^^]]]]]]`]@] ]]\\\\`\@\ \\[[[[`[@[ [[ZZZZ`Z@Z ZZYYYY`YXYPY@Y YYXXXX`X@X XXWWWW`WXWPW@W WWVVVVxVpV`V@V VVUUUU`U@U UUTTTTTT`T@T TTSSSS`S@S SSSSRRRRRR`R@R RRQQQQ`Q@Q QQPPPP`PXPPP@P PPOOOOOO`O@O OOOONNNNxNpN`N@N NNMMMM`M@M MMLLLL`L@L LLKKKK`K@K KKJJJJ`J@J JJIIIIII`I@I IIHHHH`H@H HHGGGG`G@G GGFFFF`F@F FFEEEE`E@E EEDDDD`D@D DDCCCCCC`C@C CCBBBBBB`B@B BBAAAAAA`A@A AA@@@@@@`@X@P@@@ @@????`?@? ??>>>>`>@> >>====x=p=`=@= ==<<<<<<`<@< <<;;;;`;@; ;;::::::`:X:P:@: ::999999`9@9 998888`8@8 887777`7@7 776666`6X6P6@6 665555`5@5 55444444`4@4 443333`3@3 33222222`2@2 221111`1@1 110000`0@0 00//////`/@/ //....`.@. ..------`-@- --,,,,,,`,@, ,,++++`+@+8+0+ ++******`*@* **))))`)@) ))))((((((((`(X(P(@(8(0( ((((''''`'@' ''&&&&&&`&@& &&%%%%`%@% %%$$$$`$@$ $$####`#@# ##""""`"@" ""!!!!x!p!`!@! !!    ` @   `@ `@ xp`@ `XP@ `@ `@ `@ `@ `@ xp`@ `@ `@ `@80 `@ `@ `@ xp`@ `@       ` @       ` @           ` X P @       ` @       ` @   `@ xp`XP@80 xp`@80 `@ `@ `@ `@80 `@ `@ M|B$،ez _ {p{m|~KY4 0nP 0 ~;j@l@mq0@R@)\`,,1kP&@]<%  N I@ Q]L @O t  vpx1 / KpF0nJ`6&`dw9P i0o0prQ0ZCԞAIe+0 ZZc[t__^00bi<PbbbDb7@cp`3pc=^?_J_e@``e`"3 a] K(P]^zc=dǥd0e]l^6]\KPapa[la/aP[RbZ<f_0[Y=\]h@Vk`}~ > @)PHY3F,*lDPɬ@=  I`*c@ M,p42pMJRpLpj3ny@-}f0`_Pu@ ^,(Z`j BzpZCpP\<,  H0YHP )R(:i 7@PQPhfh@iiӖpiz_TVj`ikijiij^d0kk!Pk$`k `lFl lWmJ^m;nm\txPmA m^m 0nPnqPo4oop\p9qVp]@pppZRp0q"Pq(},0}H)}C}O}6}(`~0~~w[@ )``w&@_ ~ ~,+A  07@An<Ѓ<\l `n`~:x |~pn\ :P|p|\0˻Vx0Xn@$0HU`R\\mr#p `߀X x`x@]:Њż2 0#6$60Pg>ca`PWIWV<[ SЫ5S0pb04`D<]0RN &4Дx GP`Cm?2`6o*`4IPk` Dk `f_D^Xx^l \ $1O0p[(O/_0H-[ @ pvut (.PFE_ F |R__"\!i3@۽P10[0!` 0w\{QX !Pv0ۣ *б,{pP_m0B ј@o`7l0gpg"aioж]% \`G@;@ 0#`J9к ]xP#`;NMP:HkO=],;^E; &ejp@&P] 6 }lpPs0q0)^<z `+;5Z[LY 0@*_\$pT8J ^ .`7Fc\l60R^,@M@ 8%[h%[75`׿pN/@m`x]g8@-Y([`,C+< @[j[`<BbA.gp@:W %@p\9Z]pB+ E|EP\PF jC,xp0EPTPK[R>=  ^& @X0u5l0`v7zUw d:V,?PmTcA@v[jY@vC${ d^ CPo*Pp[rIP^,Ǻ 8pR  'YP2p+gF F8P84 90(@>_<K5'9]TP'0A nIU0T``[hL%09 = 0lpx^xT @8pO7B]]K/Z#`@M Ep w 8@ & j`d] ]Hy:P pa#7&phȚq%  2\P  op +6 > ;p ^l  0 J` P / 0_T`9Y)]@GpZFvZp`qߨP GNGP'XGS[Fp_f0e`gip2 0Y- ' N* 'p A%pg )pFAGGH`G@D 0«P\p],pRpN[snwtkcӅre%sp W@suAKsr0z?xpws˄sq0s Er;`e^qqܯJň;vgekpju j ;P@|! <X `P.@1; h<CnPgqg8N/@w@Us`nY`@P@  7tpkBAPAB )p)`dNMp))NBMLMLr`rrr U)N:OX;a~O7-vE''T'ZQoEUEWԕ+*z]aЪzlbp}pRk: ϤKfY{'qpkDLLKxL*l*B*X-K /%I?|b*DO^_ ؑZ_memcpy__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_rethrow___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__19allocatorIPN3mup12IValueReaderEE8allocateEmPKv__ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE8allocateEmPKv__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE8allocateEmPKv__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE8allocateEmPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE8capacityEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE8capacityEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8capacityEv__ZNKSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE8capacityEv__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE8capacityEv__ZNKSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE5firstEv__ZNSt3__117__compressed_pairIPPN3mup12IValueReaderERNS_9allocatorIS3_EEE5firstEv__ZNKSt3__117__compressed_pairIPPN3mup12IValueReaderERNS_9allocatorIS3_EEE5firstEv__ZNSt3__117__compressed_pairIPPN3mup12IValueReaderENS_9allocatorIS3_EEE5firstEv__ZNKSt3__117__compressed_pairIPPN3mup12IValueReaderENS_9allocatorIS3_EEE5firstEv__ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEE5firstEv__ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE5firstEv__ZNKSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE5firstEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEE5firstEv__ZNKSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEE5firstEv__ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE5firstEv__ZNKSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE5firstEv__ZNKSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEptEv__ZNKSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEptEv__ZNK3mup8TokenPtrINS_6ITokenEEptEv__ZNKSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEptEv__ZNKSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEptEv__ZNKSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEEptEv__ZNKSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEptEv__ZNKSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEptEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE6__rootEv__ZN3mup11TokenReader9IsCommentEv__ZNK3mup6IToken8GetIdentEv__ZN3mup11TokenReader6ReInitEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_14default_deleteIN3mup11TokenReaderEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIPN3mup12IValueReaderEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIPN3mup12IValueReaderEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIPN3mup12IValueReaderEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEELi1ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemImLi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemImLi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup11TokenReaderELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup11TokenReaderELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPPN3mup12IValueReaderELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPPN3mup12IValueReaderELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6IValueEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6IValueEEELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEELi0ELb0EE5__getEv__ZNKSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE3getEv__ZNSt3__112__tuple_leafILm0ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELb0EE3getEv__ZNK3mup8TokenPtrINS_6IValueEE3GetEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE26__invalidate_all_iteratorsEv__ZNK3mup11ParserXBase19ValidInfixOprtCharsEv__ZNK3mup11ParserXBase14ValidOprtCharsEv__ZNK3mup11ParserXBase14ValidNameCharsEv__ZNK3mup11TokenReader6GetPosEv__ZNK3mup11TokenReader9GetTokensEv__ZN3mup11TokenReader26SkipCommentsAndWhitespacesEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5c_strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__root_ptrEv__ZNK3mup11TokenReader7GetExprEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE11get_deleterEv__ZN3mup11TokenReader15DeleteValReaderEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5clearEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5clearEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE5clearEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE5clearEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE5clearEv__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE5clearEv__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE5clearEv__ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE5clearEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE5clearEv__ZNK3mup11TokenReader10GetUsedVarEv__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEppEv__ZNSt3__111__wrap_iterIPcEppEv__ZNSt3__111__wrap_iterIPKcEppEv__ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEppEv__ZNSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEppEv__ZNKSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElE8__get_npEv__ZNKSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElE8__get_npEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10value_compEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10value_compEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE9__end_capEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE9__end_capEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9__end_capEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE9__end_capEv__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE9__end_capEv__ZNKSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE9__end_capEv__ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE9__end_capEv__ZNKSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE6rbeginEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5beginEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5beginEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5beginEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE5beginEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE5beginEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE5beginEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE5beginEv__ZN3mup11TokenReader13ReadNextTokenEv__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEmmEv__ZNSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEmmEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__clear_and_shrinkEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNSt3__111char_traitsIcE3eofEv__ZNSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEE5__refEv__ZNK3mup6IToken6IncRefEv__ZNK3mup6IToken6DecRefEv__ZNK3mup11ParserXBase10GetOprtDefEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__19allocatorIPN3mup12IValueReaderEE8max_sizeEv__ZNKSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE8max_sizeEv__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE8max_sizeEv__ZNKSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE8max_sizeEv__ZNKSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__117basic_string_viewIcNS_11char_traitsIcEEE4sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4sizeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4sizeEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE4sizeEv__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE4sizeEv__ZNKSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE4sizeEv__ZNSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEE11__get_valueEv__ZNKSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEE11__get_valueEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__annotate_deleteEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE17__annotate_deleteEv__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE17__annotate_deleteEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE13__vdeallocateEv__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEE7releaseEv__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE7releaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNKSt3__111__wrap_iterIPcE4baseEv__ZNKSt3__111__wrap_iterIPKcE4baseEv__ZNKSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEE4baseEv__ZNK3mup5Value5CloneEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNKSt3__116__tree_node_baseIPvE15__parent_unsafeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE12__begin_nodeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE10__end_nodeEv__ZNK3mup6IToken7GetCodeEv__ZNKSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEdeEv__ZNKSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEdeEv__ZNKSt3__111__wrap_iterIPcEdeEv__ZNKSt3__111__wrap_iterIPKcEdeEv__ZNKSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEdeEv__ZNKSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEdeEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE6secondEv__ZNSt3__117__compressed_pairIPPN3mup12IValueReaderERNS_9allocatorIS3_EEE6secondEv__ZNSt3__117__compressed_pairIPPN3mup12IValueReaderENS_9allocatorIS3_EEE6secondEv__ZNKSt3__117__compressed_pairIPPN3mup12IValueReaderENS_9allocatorIS3_EEE6secondEv__ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEE6secondEv__ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE6secondEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEE6secondEv__ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE6secondEv__ZNKSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEE6secondEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE4rendEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE3endEv__ZNKSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE3endEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_N2su4pred12SortByLengthIS7_EELb1EEENS5_ISC_EEE3endEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE3endEv__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEN2su4pred12SortByLengthIS6_EENS4_INS_4pairIKS6_SA_EEEEE3endEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__node_allocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE7__allocEv__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE7__allocEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE7__allocEv__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE7__allocEv__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE7__allocEv__ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE7__allocEv__ZNKSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__117basic_string_viewIcNS_11char_traitsIcEEE4dataEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE4dataEv__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE4dataEv__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEEC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZNSt3__117__compressed_pairINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEENS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS7_IcEEEEN3mup8TokenPtrINSF_6ITokenEEEEES3_EEEEEC1ILb1EvEEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEcvNS_17basic_string_viewIcS2_EEEv__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup11TokenReaderD2Ev__ZN3mup8TokenPtrINS_6ITokenEED2Ev__ZN3mup8TokenPtrINS_6IValueEED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEED2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED2Ev__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEED2Ev__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEED2Ev__ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEED2Ev__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEED2Ev__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED2Ev__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEED2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2Ev__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIPN3mup12IValueReaderEEC2Ev__ZNSt3__15tupleIJEEC2Ev__ZNSt3__115__tree_end_nodeIPNS_16__tree_node_baseIPvEEEC2Ev__ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEEC2Ev__ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC2Ev__ZNSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2Ev__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEEC2Ev__ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEEC2Ev__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEEC2Ev__ZNSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEC2Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIPN3mup12IValueReaderEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__122__compressed_pair_elemINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEELi0ELb0EEC2Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup11TokenReaderD1Ev__ZN3mup5ValueD1Ev__ZN3mup8TokenPtrINS_6ITokenEED1Ev__ZN3mup8TokenPtrINS_6IValueEED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEED1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEED1Ev__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEED1Ev__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEED1Ev__ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEED1Ev__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEED1Ev__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEED1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEED1Ev__ZN3mup15OprtCreateArrayC1Ev__ZN3mup9OprtIndexC1Ev__ZN3mup12TokenNewlineC1Ev__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1Ev__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1Ev__ZNSt3__15tupleIJEEC1Ev__ZNSt3__115__tree_end_nodeIPNS_16__tree_node_baseIPvEEEC1Ev__ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC1Ev__ZNSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1Ev__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEEC1Ev__ZNSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEC1Ev__ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEC1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error_memchr_memcmp___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__grow_byEmmmmmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignERKS5_mm__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6substrEmm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__116allocator_traitsINS_9allocatorIcEEE10deallocateERS2_Pcm__ZNSt3__19allocatorIcE10deallocateEPcm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE17find_first_not_ofEPKcm__ZNSt3__117basic_string_viewIcNS_11char_traitsIcEEEC2EPKcm__ZNSt3__117basic_string_viewIcNS_11char_traitsIcEEEC1EPKcm__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13find_first_ofEcm__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcm__ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE8allocateERSG_m__ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE10deallocateERSG_PSF_m__ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE10deallocateEPSE_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE18__construct_at_endIPS4_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC2ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC2ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC1ERKS7_m__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE24__RAII_IncreaseAnnotatorC1ERKS7_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE8allocateERS6_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE8allocateERS6_m__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE24__RAII_IncreaseAnnotatorC2ERKS6_m__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE24__RAII_IncreaseAnnotatorC1ERKS6_m__ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE8allocateERS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE10deallocateERS6_PS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE10deallocateERS6_PS5_m__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE10deallocateERS5_PS4_m__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE10deallocateEPS4_m__ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE10deallocateEPS4_m__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__19allocatorIPN3mup12IValueReaderEE10deallocateEPS3_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEixEm__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEEixEm__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEEixEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE14__annotate_newEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE14__annotate_newEm__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE14__annotate_newEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE27__invalidate_iterators_pastEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__annotate_shrinkEm__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE17__annotate_shrinkEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__set_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__vallocateEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE11__recommendEm__ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE11__recommendEm__ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNKSt3__111__wrap_iterIPcEplEl__ZNKSt3__111__wrap_iterIPKcEplEl__ZNSt3__111__wrap_iterIPcEpLEl__ZNSt3__111__wrap_iterIPKcEpLEl__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKNS_12basic_stringIcS2_S4_EEj__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKNS_12basic_stringIcS2_S4_EEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKNS_12basic_stringIcS2_S4_EEj__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZN3mup6IToken10SetExprPosEi__ZN3mup11TokenReader11AddSynFlagsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZN3mup11TokenReader5StoreERKNS_8TokenPtrINS_6ITokenEEEi__ZNK3mup11TokenReader12ExtractTokenEPKcRNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZN3mup5ValueC1Ec__ZNSt3__122__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEEC2ERSG_b__ZNSt3__122__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEEC1ERSG_b__ZNSt3__119__tree_right_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__118__tree_left_rotateIPNS_16__tree_node_baseIPvEEEEvT___ZNSt3__1L20__tree_is_left_childIPNS_16__tree_node_baseIPvEEEEbT___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE7destroyINS_4pairIKS8_SC_EEEEvRSG_PT___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE9__destroyINS_4pairIKS8_SC_EEEEvNS_17integral_constantIbLb0EEERSG_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE7destroyIS5_EEvRS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE7destroyIS5_EEvRS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9__destroyIS5_EEvNS_17integral_constantIbLb1EEERS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE9__destroyIS5_EEvNS_17integral_constantIbLb1EEERS6_PT___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE7destroyIS4_EEvRS5_PT___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE9__destroyIS4_EEvNS_17integral_constantIbLb1EEERS5_PT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE21__push_back_slow_pathIRKS4_EEvOT___ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE21__push_back_slow_pathIRKS3_EEvOT___ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE21__push_back_slow_pathIS3_EEvOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE15__emplace_multiIJRKNS_4pairIKS7_SB_EEEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISV_EEEEEEDpOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__construct_nodeIJRKNS_4pairIKS7_SB_EEEEENS_10unique_ptrINS_11__tree_nodeISC_PvEENS_22__tree_node_destructorINS5_ISS_EEEEEEDpOT___ZNSt3__14pairIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERN3mup8TokenPtrINS8_6ITokenEEEEaSIRKNS0_IKS6_SB_EELb0EEERSD_OT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemIPPN3mup12IValueReaderELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6ITokenEEELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemIPN3mup8TokenPtrINS1_6IValueEEELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemImLi0ELb0EEC2IivEEOT___ZNSt3__122__compressed_pair_elemINS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEELi1ELb0EEC2ISI_vEEOT___ZNSt3__122__compressed_pair_elemIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEELi0ELb0EEC2IRSG_vEEOT___ZNSt3__122__compressed_pair_elemINS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEELi1ELb1EEC2IRKSG_vEEOT___ZNSt3__112__tuple_leafILm0ERKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEELb0EEC2IS8_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEELi1ELb0EEC2IS7_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEELi1ELb0EEC2IS7_vEEOT___ZNSt3__122__compressed_pair_elemIRNS_9allocatorIPN3mup12IValueReaderEEELi1ELb0EEC2IS6_vEEOT___ZNSt3__122__compressed_pair_elemIPN3mup11TokenReaderELi0ELb0EEC2IRS3_vEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__insert_multiIRKNS_4pairIKS7_SB_EEEENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPPN3mup12IValueReaderENS_9allocatorIS3_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPPN3mup12IValueReaderENS_9allocatorIS3_EEEC1IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEEC2IRS3_Lb1EEEOT___ZNSt3__117__compressed_pairIPN3mup11TokenReaderENS_14default_deleteIS2_EEEC1IRS3_Lb1EEEOT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE4findIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE12__find_equalIS7_EERPNS_16__tree_node_baseIPvEERPNS_15__tree_end_nodeISN_EERKT___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE14__assign_multiINS_21__tree_const_iteratorISC_PNS_11__tree_nodeISC_PvEElEEEEvT_SQ___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__insert_node_atEPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERSN_SN___ZNSt3__1L4moveIRNS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEEEEONS_16remove_referenceIT_E4typeEOSL___ZNSt3__1neERKNS_20__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEESL___ZNSt3__1eqERKNS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEESL___ZNSt3__1neERKNS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEESL___ZNSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEC2ESK___ZNSt3__116reverse_iteratorINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEEEC1ESK___ZNSt3__1eqERKNS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__1neERKNS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__1eqERKNS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__1neERKNS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEESJ___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__copy_assign_allocERKSI___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEaSERKSI___ZNSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC2ESI___ZNSt3__114__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC1ESI___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEaSERKSH___ZNSt3__1L3getILm1EKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEERKNS_13tuple_elementIXT_ENS_4pairIT0_T1_EEE4typeERKSG___ZNSt3__1L3getILm0EKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEERKNS_13tuple_elementIXT_ENS_4pairIT0_T1_EEE4typeERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC2ERKSG___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEEC1ERKSG___ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2ESG___ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1ESG___ZNSt3__1L9addressofIKNS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEEEPT_RSF___ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEE5resetEPSF___ZNSt3__122__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEEclEPSF___ZNSt3__1L9addressofINS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEEEPT_RSE___ZNSt3__1L9addressofIKNS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEEEPT_RSE___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEEixERSE___ZNSt3__114pointer_traitsIPKNS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEE10pointer_toERSE___ZNSt3__13mapINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEENS_4lessIS6_EENS4_INS_4pairIKS6_SA_EEEEE4findERSE___ZNSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEC2ESE___ZNSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEC1ESE___ZNSt3__1L9addressofINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEEEPT_RSD___ZNSt3__114pointer_traitsIPNS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEE10pointer_toERSD___ZNSt3__114pointer_traitsIPKNS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE10pointer_toERSD___ZNSt3__1L3getILm0EJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEERNS_13tuple_elementIXT_ENS_5tupleIJDpT0_EEEE4typeERSD___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignINS_11__wrap_iterIPKcEEEENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr38__libcpp_string_gets_noexcept_iteratorISC_EE5valueERS5_E4typeESC_SC___ZNSt3__14pairIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERN3mup8TokenPtrINS8_6ITokenEEEEC2ILb1ELb0EEES7_SC___ZNSt3__14pairIRNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEERN3mup8TokenPtrINS8_6ITokenEEEEC1ILb1ELb0EEES7_SC___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE20__construct_backwardIS4_EENS_9enable_ifIXaaooL_ZNS_17integral_constantIbLb1EE5valueEEntsr15__has_constructIS5_PT_SB_EE5valuesr31is_trivially_move_constructibleISB_EE5valueEvE4typeERS5_SC_SC_RSC___ZNSt3__122__tree_key_value_typesINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE9__get_ptrERSC___ZNSt3__114pointer_traitsIPNS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE10pointer_toERSC___ZNKSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEclERKS6_RKSC___ZNSt3__122__tree_key_value_typesINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE9__get_keyERKSC___ZNSt3__122__tree_key_value_typesINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEE11__get_valueERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC2ERKSC___ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1ERKSC___ZNSt3__1L16forward_as_tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEENS_5tupleIJDpOT_EEESC___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initINS_11__wrap_iterIPcEEEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESB_SB___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE6assignIPS4_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS4_NS_15iterator_traitsISB_E9referenceEEE5valueEvE4typeESB_SB___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE20__construct_backwardIPS5_EEvRS6_T_SB_RSB___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE20__construct_backwardIPS5_EEvRS6_T_SB_RSB___ZNSt3__112__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS7_6ITokenEEEEaSERKSB___ZNSt3__1ltIcNS_11char_traitsIcEENS_9allocatorIcEEEEbRKNS_12basic_stringIT_T0_T1_EESB___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2INS_11__wrap_iterIPcEEEET_SA___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1INS_11__wrap_iterIPcEEEET_SA___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPKcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeESA_SA___ZNSt3__1L4swapIPN3mup8TokenPtrINS1_6ITokenEEEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS7_EE5valueEvE4typeERS7_SA___ZNSt3__1L4swapIPN3mup8TokenPtrINS1_6IValueEEEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS7_EE5valueEvE4typeERS7_SA___ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareINS_17basic_string_viewIcS2_EEEENS_9enable_ifIXsr33__can_be_converted_to_string_viewIcS2_T_EE5valueEiE4typeERKSA___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPKcEET_S9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPKcEET_S9___ZNKSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE31__annotate_contiguous_containerEPKvS9_S9_S9___ZNKSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE31__annotate_contiguous_containerEPKvS9_S9_S9___ZNSt3__1L4swapIPPN3mup12IValueReaderEEENS_9enable_ifIXaasr21is_move_constructibleIT_EE5valuesr18is_move_assignableIS6_EE5valueEvE4typeERS6_S9___ZNKSt3__14lessINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEclERKS6_S9___ZNSt3__1eqINS_9allocatorIcEEEEbRKNS_12basic_stringIcNS_11char_traitsIcEET_EES9___ZNKSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE31__annotate_contiguous_containerEPKvS8_S8_S8___ZNSt3__1L4moveIRPN3mup8TokenPtrINS1_6ITokenEEEEEONS_16remove_referenceIT_E4typeEOS8___ZNSt3__1L4moveIRPN3mup8TokenPtrINS1_6IValueEEEEEONS_16remove_referenceIT_E4typeEOS8___ZNSt3__15tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC2ILb1ELb0EEES8___ZNSt3__15tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC1ILb1ELb0EEES8___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEEC2EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEEC1EmmS7___ZNSt3__1L8distanceIPN3mup8TokenPtrINS1_6ITokenEEEEENS_15iterator_traitsIT_E15difference_typeES7_S7___ZNSt3__1L9addressofINS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEEEEPT_RS7___ZNSt3__1L4moveIRPPN3mup12IValueReaderEEEONS_16remove_referenceIT_E4typeEOS7___ZNSt3__1L4moveIRN3mup8TokenPtrINS1_6ITokenEEEEEONS_16remove_referenceIT_E4typeEOS7___ZNSt3__1L4moveIRN3mup8TokenPtrINS1_6IValueEEEEEONS_16remove_referenceIT_E4typeEOS7___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE19__copy_assign_allocERKS7___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEEaSERKS7___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE16__find_leaf_highERPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEERKS7___ZNSt3__1neIPKcEEbRKNS_11__wrap_iterIT_EES7___ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEEC2EmmS6___ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEEC1EmmS6___ZNSt3__1L16__to_raw_pointerIN3mup8TokenPtrINS1_6ITokenEEEEEPT_S6___ZNSt3__1L16__to_raw_pointerIN3mup8TokenPtrINS1_6IValueEEEEEPT_S6___ZNSt3__1L13__unwrap_iterIPN3mup8TokenPtrINS1_6ITokenEEEEET_S6___ZNSt3__1L6__copyIPN3mup8TokenPtrINS1_6ITokenEEES5_EET0_T_S7_S6___ZNSt3__1L4copyIPN3mup8TokenPtrINS1_6ITokenEEES5_EET0_T_S7_S6___ZNSt3__1L8distanceINS_11__wrap_iterIPKcEEEENS_15iterator_traitsIT_E15difference_typeES6_S6___ZNSt3__114pointer_traitsIPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEEE10pointer_toERS6___ZNSt3__1L16move_if_noexceptIN3mup8TokenPtrINS1_6ITokenEEEEENS_11conditionalIXaantsr29is_nothrow_move_constructibleIT_EE5valuesr21is_copy_constructibleIS6_EE5valueERKS6_OS6_E4typeERS6___ZNSt3__1L16move_if_noexceptIN3mup8TokenPtrINS1_6IValueEEEEENS_11conditionalIXaantsr29is_nothrow_move_constructibleIT_EE5valuesr21is_copy_constructibleIS6_EE5valueERKS6_OS6_E4typeERS6___ZNSt3__1L4moveIRPN3mup12IValueReaderEEEONS_16remove_referenceIT_E4typeEOS6___ZNKSt3__119__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS6_N3mup8TokenPtrINS8_6ITokenEEEEENS_4lessIS6_EELb1EEclERKSC_RKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE8max_sizeERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE8max_sizeERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS6___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS6___ZNSt3__1neIPcEEbRKNS_11__wrap_iterIT_EES6___ZNSt3__127__tree_balance_after_insertIPNS_16__tree_node_baseIPvEEEEvT_S5___ZNSt3__1L16__to_raw_pointerIPN3mup12IValueReaderEEEPT_S5___ZNSt3__1L10__tree_maxIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__1L10__tree_minIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__111__tree_leafIPNS_16__tree_node_baseIPvEEEET_S5___ZNSt3__118__search_substringIcNS_11char_traitsIcEEEEPKT_S5_S5_S5_S5___ZNSt3__1L8distanceINS_11__wrap_iterIPcEEEENS_15iterator_traitsIT_E15difference_typeES5_S5___ZNSt3__1L9addressofIPNS_16__tree_node_baseIPvEEEEPT_RS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5___ZNSt3__1L4moveIRNS_9allocatorIcEEEEONS_16remove_referenceIT_E4typeEOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEOS5___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE8max_sizeERKS5___ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNSt3__1L8distanceIPKcEENS_15iterator_traitsIT_E15difference_typeES4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE7destroyEPS4___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE7destroyEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE27__invalidate_iterators_pastEPS4___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE17__destruct_at_endEPS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5_mmRKS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE9push_backERKS4___ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE9push_backERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__1L16forward_as_tupleIJEEENS_5tupleIJDpOT_EEES4___ZNSt3__112__tuple_implINS_15__tuple_indicesIJLm0EEEEJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC2IJLm0EEJSA_EJEJEJSA_EEENS1_IJXspT_EEEENS_13__tuple_typesIJDpT0_EEENS1_IJXspT1_EEEENSE_IJDpT2_EEEDpOT3___ZNSt3__112__tuple_implINS_15__tuple_indicesIJLm0EEEEJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEC1IJLm0EEJSA_EJEJEJSA_EEENS1_IJXspT_EEEENS_13__tuple_typesIJDpT0_EEENS1_IJXspT1_EEEENSE_IJDpT2_EEEDpOT3___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L23__str_find_first_not_ofIcmNS_11char_traitsIcEELm18446744073709551615EEET0_PKT_S3_S6_S3_S3___ZNSt3__1L10__str_findIcmNS_11char_traitsIcEELm18446744073709551615EEET0_PKT_S3_S6_S3_S3___ZNSt3__19allocatorIPN3mup12IValueReaderEE7destroyEPS3___ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE17__destruct_at_endEPS3___ZNSt3__113__vector_baseIPN3mup12IValueReaderENS_9allocatorIS3_EEE17__destruct_at_endEPS3___ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE9push_backEOS3___ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE9push_backERKS3___ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116__tree_node_baseIPvE12__set_parentEPS2___ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEE5resetEPS2___ZNKSt3__114default_deleteIN3mup11TokenReaderEEclEPS2___ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEEC2ILb1EvEEPS2___ZNSt3__110unique_ptrIN3mup11TokenReaderENS_14default_deleteIS2_EEEC1ILb1EvEEPS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZN3mup8TokenPtrINS_6ITokenEEaSERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mup8TokenPtrINS_6ITokenEEC2ERKS2___ZN3mup8TokenPtrINS_6IValueEEC2ERKS2___ZN3mup8TokenPtrINS_6ITokenEEC1ERKS2___ZN3mup8TokenPtrINS_6IValueEEC1ERKS2___ZNSt3__111__wrap_iterIPKcEC2ES2___ZNSt3__111__wrap_iterIPKcEC1ES2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZN3mup8TokenPtrINS_6ITokenEEC2EPS1___ZN3mup8TokenPtrINS_6IValueEEC2EPS1___ZN3mup8TokenPtrINS_6ITokenEEC1EPS1___ZN3mup8TokenPtrINS_6IValueEEC1EPS1___ZNSt3__111__wrap_iterIPcEC2ES1___ZNSt3__111__wrap_iterIPcEC1ES1___ZNSt3__1L16__tree_next_iterIPNS_15__tree_end_nodeIPNS_16__tree_node_baseIPvEEEES5_EET_T0___ZNSt3__1L16__tree_prev_iterIPNS_16__tree_node_baseIPvEEPNS_15__tree_end_nodeIS4_EEEET_T0___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE25__construct_range_forwardIPS5_S9_EEvRS6_T_SB_RT0___ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE9constructINS_4pairIKS7_SB_EEJRKSJ_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE9constructIS4_JRS4_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6ITokenEEEE9constructIS4_JRKS4_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup8TokenPtrINS1_6IValueEEEE9constructIS4_JRKS4_EEEvPT_DpOT0___ZNSt3__19allocatorIPN3mup12IValueReaderEE9constructIS3_JRKS3_EEEvPT_DpOT0___ZNSt3__19allocatorIPN3mup12IValueReaderEE9constructIS3_JS3_EEEvPT_DpOT0___ZNSt3__19allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS0_IcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPvEEE9constructINS_4pairIKS7_SB_EEJRKNS_21piecewise_construct_tENS_5tupleIJRSI_EEENSN_IJEEEEEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE9constructINS_4pairIKS8_SC_EEJRKSL_EEEvRSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE9constructINS_4pairIKS8_SC_EEJRKNS_21piecewise_construct_tENS_5tupleIJRSK_EEENSP_IJEEEEEEvRSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE11__constructINS_4pairIKS8_SC_EEJRKSL_EEEvNS_17integral_constantIbLb1EEERSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS1_IcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEE11__constructINS_4pairIKS8_SC_EEJRKNS_21piecewise_construct_tENS_5tupleIJRSK_EEENSP_IJEEEEEEvNS_17integral_constantIbLb1EEERSG_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9constructIS5_JRS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE9constructIS5_JRKS5_EEEvRS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE11__constructIS5_JRS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEE11__constructIS5_JRKS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEE11__constructIS5_JRKS5_EEEvNS_17integral_constantIbLb1EEERS6_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE9constructIS4_JRKS4_EEEvRS5_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE9constructIS4_JS4_EEEvRS5_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE11__constructIS4_JRKS4_EEEvNS_17integral_constantIbLb1EEERS5_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup12IValueReaderEEEE11__constructIS4_JS4_EEEvNS_17integral_constantIbLb1EEERS5_PT_DpOT0___ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE25__emplace_unique_key_argsIS7_JRKNS_21piecewise_construct_tENS_5tupleIJRKS7_EEENSN_IJEEEEEENS_4pairINS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEEbEERKT_DpOT0___ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC2IRSG_SJ_EEOT_OT0___ZNSt3__117__compressed_pairIPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC1IRSG_SJ_EEOT_OT0___ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEEC2IiRKSG_EEOT_OT0___ZNSt3__117__compressed_pairImNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEEC1IiRKSG_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC2IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEEC2IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEEC1IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEEC1IDnS8_EEOT_OT0___ZNSt3__117__compressed_pairIPPN3mup12IValueReaderERNS_9allocatorIS3_EEEC2IDnS7_EEOT_OT0___ZNSt3__117__compressed_pairIPPN3mup12IValueReaderERNS_9allocatorIS3_EEEC1IDnS7_EEOT_OT0___ZNSt3__14pairINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEbEC2ISI_RbLb0EEEOT_OT0___ZNSt3__14pairINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEbEC1ISI_RbLb0EEEOT_OT0___ZN3mup11TokenReader6AssignERKS0___ZN3mup11TokenReaderaSERKS0___ZN3mup11TokenReaderC2ERKS0___ZN3mup11TokenReaderC1ERKS0___ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZNSt3__1L19piecewise_constructE__ZTSN3mup11EErrorCodesE__ZTIN3mup11EErrorCodesE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZN3mup11TokenReader14AddValueReaderEPNS_12IValueReaderE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZTVN10__cxxabiv116__enum_type_infoE__ZNSt3__1L10__distanceIPN3mup8TokenPtrINS1_6ITokenEEEEENS_15iterator_traitsIT_E15difference_typeES7_S7_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceINS_11__wrap_iterIPKcEEEENS_15iterator_traitsIT_E15difference_typeES6_S6_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceINS_11__wrap_iterIPcEEEENS_15iterator_traitsIT_E15difference_typeES5_S5_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceIPKcEENS_15iterator_traitsIT_E15difference_typeES4_S4_NS_26random_access_iterator_tagE__ZNSt3__1L9__advanceIPN3mup8TokenPtrINS1_6ITokenEEEEEvRT_NS_15iterator_traitsIS6_E15difference_typeENS_26random_access_iterator_tagE__ZN3mup8VariableC1EPNS_6IValueE__ZTVNSt3__18ios_baseE__ZN3mup11TokenReader9SetParentEPNS_11ParserXBaseE__ZNK3mup11TokenReader5CloneEPNS_11ParserXBaseE__ZN3mup11TokenReaderC2EPNS_11ParserXBaseE__ZN3mup11TokenReaderC1EPNS_11ParserXBaseE__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC2ILb1EvEEPSF_NS_16__dependent_typeINS_27__unique_ptr_deleter_sfinaeISI_EEXT_EE20__good_rval_ref_typeE__ZNSt3__110unique_ptrINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEENS_22__tree_node_destructorINS6_ISF_EEEEEC1ILb1EvEEPSF_NS_16__dependent_typeINS_27__unique_ptr_deleter_sfinaeISI_EEXT_EE20__good_rval_ref_typeE__ZNSt3__1L7advanceIPN3mup8TokenPtrINS1_6ITokenEEEEEvRT_NS_15iterator_traitsIS6_E15difference_typeE__ZNSt3__1L7forwardINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEEOT_RNS_16remove_referenceISJ_E4typeE__ZNSt3__1L7forwardINS_22__tree_node_destructorINS_9allocatorINS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS2_IcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPvEEEEEEEEOT_RNS_16remove_referenceISJ_E4typeE__ZNSt3__1L7forwardIRKNS_19__map_value_compareINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12__value_typeIS7_N3mup8TokenPtrINS9_6ITokenEEEEENS_4lessIS7_EELb1EEEEEOT_RNS_16remove_referenceISJ_E4typeE__ZNSt3__1L7forwardIRPNS_11__tree_nodeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPvEEEEOT_RNS_16remove_referenceISI_E4typeE__ZNSt3__1L7forwardIRKNS_4pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEEEOT_RNS_16remove_referenceISG_E4typeE__ZNSt3__1L7forwardINS_5tupleIJRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEEEEOT_RNS_16remove_referenceISB_E4typeE__ZNSt3__1L7forwardIRKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEEEOT_RNS_16remove_referenceIS9_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIN3mup8TokenPtrINS2_6ITokenEEEEEEEOT_RNS_16remove_referenceIS8_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIN3mup8TokenPtrINS2_6IValueEEEEEEEOT_RNS_16remove_referenceIS8_E4typeE__ZNSt3__1L7forwardIRNS_9allocatorIPN3mup12IValueReaderEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRKN3mup8TokenPtrINS1_6ITokenEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRKN3mup8TokenPtrINS1_6IValueEEEEEOT_RNS_16remove_referenceIS7_E4typeE__ZNSt3__1L7forwardIRKPN3mup12IValueReaderEEEOT_RNS_16remove_referenceIS6_E4typeE__ZNSt3__1L7forwardIRN3mup8TokenPtrINS1_6ITokenEEEEEOT_RNS_16remove_referenceIS6_E4typeE__ZNSt3__1L7forwardIRPN3mup11TokenReaderEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRKNS_21piecewise_construct_tEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIPN3mup12IValueReaderEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardINS_5tupleIJEEEEEOT_RNS_16remove_referenceIS3_E4typeE__ZNSt3__1L7forwardIRbEEOT_RNS_16remove_referenceIS2_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__1L7forwardIiEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup12GenericTokenC1ENS_8ECmdCodeE__ZN3mup15TokenIfThenElseC1ENS_8ECmdCodeE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE7destroyEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__node_insert_multiEPNS_11__tree_nodeISC_PvEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE8__detachEPNS_11__tree_nodeISC_PvEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2ENS_15__tree_iteratorISC_SG_lEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1ENS_15__tree_iteratorISC_SG_lEE__ZNSt3__110__get_pairILm1EE3getIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEERKT0_RKNS_4pairIT_SE_EE__ZNSt3__16vectorIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIN3mup8TokenPtrINS1_6IValueEEENS_9allocatorIS4_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS4_RS6_EE__ZNSt3__16vectorIPN3mup12IValueReaderENS_9allocatorIS3_EEE26__swap_out_circular_bufferERNS_14__split_bufferIS3_RS5_EE__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strERKNS_12basic_stringIcS2_S4_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__110__get_pairILm0EE3getIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEERKT_RKNS_4pairISE_T0_EE__ZNSt3__1neINS_14__map_iteratorINS_15__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINSA_6ITokenEEEEEPNS_11__tree_nodeISE_PvEElEEEESK_EEbRKNS_16reverse_iteratorIT_EERKNSL_IT0_EE__ZNSt3__1miIPKcS2_EEDTmicldtfp_4baseEcldtfp0_4baseEERKNS_11__wrap_iterIT_EERKNS4_IT0_EE__ZNSt3__1eqIPKcS2_EEbRKNS_11__wrap_iterIT_EERKNS3_IT0_EE__ZNSt3__1miIPcS1_EEDTmicldtfp_4baseEcldtfp0_4baseEERKNS_11__wrap_iterIT_EERKNS3_IT0_EE__ZNSt3__1eqIPcS1_EEbRKNS_11__wrap_iterIT_EERKNS2_IT0_EE__ZN3mup11TokenReader6IsOprtERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader9IsBuiltInERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader15IsVarOrConstTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader13IsUndefVarTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader12IsInfixOpTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader11IsPostOpTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader8IsFunTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader8IsValTokERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader9IsNewlineERNS_8TokenPtrINS_6ITokenEEE__ZN3mup11TokenReader5IsEOFERNS_8TokenPtrINS_6ITokenEEE__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1IJRS7_EJEEENS_21piecewise_construct_tENS_5tupleIJDpT_EEENSG_IJDpT0_EEE__ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC2ENS_14__map_iteratorINS_15__tree_iteratorISD_SH_lEEEE__ZNSt3__120__map_const_iteratorINS_21__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS9_6ITokenEEEEEPNS_11__tree_nodeISD_PvEElEEEC1ENS_14__map_iteratorINS_15__tree_iteratorISD_SH_lEEEE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup12GenericTokenC1ENS_8ECmdCodeENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken8SetIdentERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11TokenReader7SetExprERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE13__lower_boundIS7_EENS_15__tree_iteratorISC_PNS_11__tree_nodeISC_PvEElEERKT_SO_PNS_15__tree_end_nodeIPNS_16__tree_node_baseISM_EEEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC2EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__121__tree_const_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__115__tree_iteratorINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEEPNS_11__tree_nodeISC_PvEElEC1EPNS_15__tree_end_nodeIPNS_16__tree_node_baseISE_EEEE__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC2IJRS7_EJEJLm0EEJEEENS_21piecewise_construct_tERNS_5tupleIJDpT_EEERNSG_IJDpT0_EEENS_15__tuple_indicesIJXspT1_EEEENSP_IJXspT2_EEEE__ZNSt3__14pairIKNS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEC1IJRS7_EJEJLm0EEJEEENS_21piecewise_construct_tERNS_5tupleIJDpT_EEERNSG_IJDpT0_EEENS_15__tuple_indicesIJXspT1_EEEENSP_IJXspT2_EEEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__move_assignERS5_NS_17integral_constantIbLb1EEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5_NS_17integral_constantIbLb1EEE__ZNSt3__16__treeINS_12__value_typeINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup8TokenPtrINS8_6ITokenEEEEENS_19__map_value_compareIS7_SC_NS_4lessIS7_EELb1EEENS5_ISC_EEE19__copy_assign_allocERKSI_NS_17integral_constantIbLb0EEE__ZNSt3__113__vector_baseIN3mup8TokenPtrINS1_6ITokenEEENS_9allocatorIS4_EEE19__copy_assign_allocERKS7_NS_17integral_constantIbLb0EEE__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6ITokenEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4_NS_17integral_constantIbLb0EEE__ZNSt3__114__split_bufferIN3mup8TokenPtrINS1_6IValueEEERNS_9allocatorIS4_EEE17__destruct_at_endEPS4_NS_17integral_constantIbLb0EEE__ZNSt3__114__split_bufferIPN3mup12IValueReaderERNS_9allocatorIS3_EEE17__destruct_at_endEPS3_NS_17integral_constantIbLb0EEEGCC_except_table699GCC_except_table59GCC_except_table759GCC_except_table159GCC_except_table639GCC_except_table329GCC_except_table519GCC_except_table268GCC_except_table58GCC_except_table48GCC_except_table628GCC_except_table528GCC_except_table328GCC_except_table677GCC_except_table467GCC_except_table57GCC_except_table357GCC_except_table137GCC_except_table227GCC_except_table17GCC_except_table217GCC_except_table96GCC_except_table486GCC_except_table366GCC_except_table56GCC_except_table346GCC_except_table246GCC_except_table536GCC_except_table236GCC_except_table326GCC_except_table665GCC_except_table55GCC_except_table755GCC_except_table435GCC_except_table25GCC_except_table715GCC_except_table515GCC_except_table405GCC_except_table54GCC_except_table154GCC_except_table544GCC_except_table24GCC_except_table424GCC_except_table124GCC_except_table93GCC_except_table463GCC_except_table53GCC_except_table643GCC_except_table633GCC_except_table323GCC_except_table692GCC_except_table592GCC_except_table492GCC_except_table52GCC_except_table142GCC_except_table322GCC_except_table91GCC_except_table381GCC_except_table471GCC_except_table661GCC_except_table341GCC_except_table321GCC_except_table111___gxx_personality_v0GCC_except_table0GCC_except_table180GCC_except_table60GCC_except_table50GCC_except_table750GCC_except_table40GCC_except_table20GCC_except_table310#1/28 1573634243 501 20 100644 52596 ` mpValReader.cpp.o xxoxo__text__TEXT;r__gcc_except_tab__TEXT;>__const__DATA`=hx@~l__cstring__TEXTAD__const__TEXTPBRhE__compact_unwind__LDC F@__eh_frame__TEXTVY( h2  0 d4 P``gEUHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHpHHHEH`HXHPHHHXHPHc HHHHHH0HHHDžHDžH0HHH0H@H0VƅoDžH H=H H0H0H@H0@HXHPHc HPHpH0HpHHHH&H=>H5>H >M HHPHXHPHc iUHWHHHHIxHHHHPGHWHHHHIxHHHƅoDžH0oH=H?HMH9ψ"$Hp]H  fUHHH}HuH}HuH]f.UHH@H}HuUHuHHHuH5HHHEH8HHhHH@HpHH5HH}HHHHHUH HHhHH@HBHHu}}H׋UH@]ÉHEM#H HHEuHEHHHEHHH} UHHH}H}$H]UHHH}H}$H]UHH}H}H]f.UHH H}EMH}EMH ]ÐUHHH5H}H}H}HuHƀHH]UHH@H}HuHuHuHHH}HHEHuHHEHEHEHuHHQ HEH@]ÉHEMH}H} f.UHHH}HuH}HuH]f.UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHH`H}HuHUHMHMHUHcHH}H1H}H59HPHEHHIpHHEHEEE{HEMH}{1H}H5n9H6HEHHIp1HHEHEEEEEH}E$H`]H} f.UHH@H}HuHUHUHHUH}HEHUHMH}HEHUHMH}HuHUHMIH@]@UHH@H}HuHuHuHHH}HHEHuHHEHEHEHuHHQ HEH@]ÉHEMH}H} f.UHHH}HuH}HuH]f.UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHHHHHEHHHHHHHDHAE9dHHHcxAHHHcHHHc 0 ƅDž1HpHHHc?Ht>HHhHHhHH5HH`HH`HXHH@HWWVƅDžpHxtHHxtHHH@HVV@HHHc HHHHpHHHHHHH@H8H8H&H=4H54H S4 HpH0H0HHH*HHHR`HH(ƅDžpHH H HUH9ш'"'$H]Hx  DUHHH}H}H]DUHHH}HuH}HuH]f.UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHH@H}HuHuHuHHH}HHEHuHHEHEHEHuHHQ HEH@]ÉHEMH}H} f.UHHH}HuH}HuH]f.UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHH}HuHUHMHMHUHcHHMHM0"HEHbHEHB EEE EHEЋMăɉ 0"1HUЋEă21M E;EMEHHEЋMăɉ 1@@@΋}ȃ+}ĉM} }̉}̋EăE_} EE;ExHEH5/HMH}HHEHuH}EH5HH}HEMHEMH}E H}JE̋M+M*HUH2HV`DEAHUDDEHxE$HĐ]H}  f.UHHH}H}H]DUHH@H}HuHuHuHHH}HHEHuHHEHEHEHuHHQ HEH@]ÉHEMH}H} f.UHHH}HuH}HuH]f.UHHH}H}HH}HHHH}HH]fUHHH}H}H]DUHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHHHHuHUHMEHHEHEHMHc DDEEE"7\JE EEHEEEEBE"\n9rOtW HHHE؉M HH_ HH="HH\HHxHƅ_HMH`HxHHpHhdHx/dHpHxHhƅ_H5HHxHE؉MHE؉MHxH`_ HxhE!uHHXHEHMHc@4@uxHƅHMHHPHHHH@<HLMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}HuHuHHEHuHHHHuHH ]ÐUHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}HHXH}HH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHH H}HuUH}HuUH ]UHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH@H}HuUHuHHuH5HH}H7H@HuH}HHuH}HuHFXUV`HuH}H@]ÉHE؉MH}HEHH} UHH H}H}HEH ]ÐUHHH}HuH}HuH]f.UHHpH}HuHuH}HH@H}HHEHuHHuHFXN`HEjHEH@HH}H@HEH}HHEHxXH}H@HEH}H@HEH}HOXH}HuHHE؋H`&HEH@HHEHEH@HHEH}HGXH@HEH@H}HH}HHEHuH@HHEHuH@HHEHuH@HHEHuHH}HEHuHHUHE؋H`[H}$HEHǾHEH-HEH}HEHMHljHp]fUHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH H}HuH}HuH ]f.PH$UHH H}H}HEE}HEMHEEH ]ÐUHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHHH}H}H]DUHH}HE]fUHH}H}G ]UHH}H}G ]UHHPH}HuHUHMLEHMH;M HEH} HEHE{HEHMHHHMHHMHuHHH}HHHHMHEHEHEHMHUHUH9 HEHEHMH)HEHEHP]HHUUHH@H}HuHUHMHMHUH)HMH} HEHEHEHMH)HEHEH;E HEHEHEMHEHMH)HEHEH;E HEHEpH}HEH+EHHHUHEH} HEHE8H}HuHU HEHEHEHHEfHEH@]f.UHH0H}HuHUH} HE)H}HEH}؉HUH}؉HEHEH0]ÐUHH H}HuHUH} EH}HuHUEEH ]UHH 1H}HuHuHHuHUH}HH ]UHH H}H}H}H}H ]HHUbbzVVY **iAE[[uV **iAE#)u **iAE- **iAE;W9d 9~~ K **iAE  UU `[ ll u4 C r  -p@@h@h@ppIsValue/Users/jgomez/muparserx/parser/mpValReader.cppiEnd > 0truefalsenPos > 0Binary to integer conversion error (overflow).N3mup11ParserErrorEN3mup12DblValReaderEN3mup13BoolValReaderEN3mup12HexValReaderEN3mup12BinValReaderEN3mup12StrValReaderENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE7@`(~A;P#A;  / 9`A;# 7`(&A< l A< #P 7  A$<#G@/pAL<#07p(6A\<@`Ax<# 7`(A<-A<A<p#(+ i( @`C(W@!Z! "`$A<@'`'#''''20(*`(("((O)1P)p)'))))* *0* @*`*L*$*+%0+V+O+,#0,u,",-$0-M-(-?-?0.A..?.2 /?`/B/?/0G`0010$01  17`1A= 2)P2p2U2+3KP3A=4 4#P4P6p666OA,=7#@7O7C77# 8@8P8 p8 8A<=p9:_:H@;@;9AL=zRx $7AC $D0AC $l(AC $ AC $(AC zPLRx ,$~AC $4P#AC ,|XAC $8 AC $0 AC $(AC $ /AC $,(9AC ,t@AC $#AC $7AC $AC $AC $$AC $L(AC ,&AC $lAC ,kAC $X#AC $$`7AC $LxAC ,pAC $0AC $(#AC $0GAC $X/AC ,d`+AC $t#AC $ȳ7AC $AC $سAC $гAC $<ȳ(AC ,г6AC $AC ,صAC $8#AC $@7AC $<XAC $dPAC $HAC $@(AC ,HAC $ AC $4-AC $\AC ,gAC ,`KAC $#AC $ ȻAC $4 (AC $\ Ȼ+AC $ лiAC $ AC $ AC $ (AC $$ AC $L AC $t AC $ CAC $ (AC $ (WAC $ `ZAC $< AC $d AC , AC $ AC $ #AC $ AC $4 AC $\ AC $ 2AC $ *AC $ AC $ "AC $$ AC $L OAC $t 1AC $ AC $ 'AC $ AC $AC $<AC $dAC $AC $AC $ AC $pAC $,hLAC $T$AC $|AC $%AC $VAC $OAC $AC $D#AC $luAC $P"AC $XAC $P$AC $ XMAC $4(AC $\?AC $?AC $AAC $AC $?AC $$2AC $L?AC $t BAC $H?AC $`AC $XGAC $AC $<x1AC $d$AC $AC $ AC $x7AC ,$#AC $4 )AC $\(AC $ UAC $X+AC $`KAC ,?AC $,AC $T#AC $|AC $AC $AC $AC ,<O3AC $L#AC $tOAC $(CAC $PAC $8#AC $@AC $<8AC $d AC $ AC ,AC $AC $ _AC $4HAC $\@AC ,09AC ;-;W-;D-g; -(;-:-:-Q:-$:-l9-9-18]-8[-7\-7[-7F-Q7Z-;7-27-7Y-6-6W-6V-6U-a6T-:6,-6,-5+-5-5-5-r50-f5/-B5-.5- 5)-4-4-4-4-4-94S-4R-3-3-3-3-3P-3O-v3=o3-73-#3-2N-W2=?2M-2- 2-1K-1J-B1=;1I-1H-0 -0G-0F-q0E-M0-=0-,0D-0-//-/-/-/-J/C/-/r-.-..-T.C-..----M-B--:-,:-,:-,-],-,A-+@-+?-+7-[+>-E+7-+-*-|*-r*-)=-)<-);-):-a):-!):-(9-(8-(7-y'6-q'5-)'-'3-')-&-&2-&%-w&-o&-c&--&(-&1- &+-%-%-%0-%/-%-M%(-%(-%%-$-$*-$%-$'-$&-$-$-J$-,$&-$-$)-#&-#'-#-#&-#-#-#)-c#&-S#'-2#-(#-#&-#'-"%-"%-"-"-"&-f".-Y"&-M")-5"&-%"'-".-!%-!%-j!-&!-!,-!+- *- (- )- '- '-U -; %- - &---o(-b%-F'-9&---\-5%-%-----k=Q-8-------h--z-{--`-W-~-----o}-s--"--w-[-J-,- r--`==---b- ---r--`==-n-P-- - - - -c ------q-B;- e---c--Qa-.----`==y-g-SE--h-i--f-RK-w---u--[-- ---X=K- - -   | -i -@ - - - -C - - -  - - - - - = x-r k -9 - - - - - -j -M -@ - ----2-------q-B;- m---k--O-<-+=- - ---n-R=2 -= -==-i-H-A- =--\----0-----W-F-.-=-p-q-q-Qn-"-`XP@80( -xpXPH0( xph`XPH@80(xp`XP@80 |bghtyzxh`XPH@0( jopxp`@ `@80 `XP@ `@ `@     ` @       ` @       ` @       ` @       ` @   `@ `@ xp`@ `@ `@ `XP@ `@ `@ `@ M# P3f3;0 1.`1 23;zP8p83; O4<^ `'+$83<,+@_,S3$< @;0.3L<3\<(4x< !,3<3;3<3<@'J'''#'`(E#0((h@!*0+A+X+#, 0,4<1($()P)p))i%)!)G%),R,-%0-#-K. `0 00x0{1cP2.p22x3=P3>.34Q$ 4;4= P6$6, p6e6!70@7?3,=e!7 8+7i"7@82<=3L=F@ .+&.p & / 0 d+'e@L&--2% `+ `/* & %. P ` /*+&p`%/  { 3+& I`,&-  (`~(`'p'L( @*  *P**0*%::+`*,P4Q`$">!@x `"p9  -  -p@ -?s-@l'@>)>*>(>1)?)>1A 1AS'PBe)B*pB(B)B)B1`C0Cy0?K)>)`=(=(P>)=W1(A/0(?|2 07&'2,2'k&H@ }Fn k"TG :b $ ,  u[ \8*//\//|*R*+-/Mo $mv0>{XO3 (n_memcpy__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNKSt3__18ios_base4failEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4failEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEE5tellgEv__ZNKSt3__18ios_base3eofEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE3eofEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup12HexValReaderD2Ev__ZN3mup12StrValReaderD2Ev__ZN3mup12BinValReaderD2Ev__ZN3mup13BoolValReaderD2Ev__ZN3mup12DblValReaderD2Ev__ZN3mup12IValueReaderD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZN3mup12HexValReaderC2Ev__ZN3mup12StrValReaderC2Ev__ZN3mup12BinValReaderC2Ev__ZN3mup13BoolValReaderC2Ev__ZN3mup12DblValReaderC2Ev__ZN3mup12IValueReaderC2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZN3mup12ErrorContextD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup12HexValReaderD1Ev__ZN3mup12StrValReaderD1Ev__ZN3mup12BinValReaderD1Ev__ZN3mup13BoolValReaderD1Ev__ZN3mup12DblValReaderD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZN3mup12HexValReaderC1Ev__ZN3mup12StrValReaderC1Ev__ZN3mup12BinValReaderC1Ev__ZN3mup13BoolValReaderC1Ev__ZN3mup12DblValReaderC1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup12HexValReaderD0Ev__ZN3mup12StrValReaderD0Ev__ZN3mup12BinValReaderD0Ev__ZN3mup13BoolValReaderD0Ev__ZN3mup12DblValReaderD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset_memchr_memcmp___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEPKcm__ZNSt3__111char_traitsIcE7compareEPKcS3_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm___stack_chk_fail__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base4setfEjj__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKNS_12basic_stringIcS2_S4_EEj__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKNS_12basic_stringIcS2_S4_EEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKNS_12basic_stringIcS2_S4_EEj__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup12StrValReader8UnescapeEPKcRi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume___stack_chk_guard__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsERd__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEpLEc__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__118__search_substringIcNS_11char_traitsIcEEEEPKT_S5_S5_S5_S5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L10__str_findIcmNS_11char_traitsIcEELm18446744073709551615EEET0_PKT_S3_S6_S3_S3___ZNSt3__111char_traitsIcE4findEPKcmRS2___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZN3mup12HexValReaderC2ERKS0___ZN3mup12StrValReaderC2ERKS0___ZN3mup12BinValReaderC2ERKS0___ZN3mup13BoolValReaderC2ERKS0___ZN3mup12DblValReaderC2ERKS0___ZN3mup12IValueReaderC2ERKS0___ZN3mup12HexValReaderC1ERKS0___ZN3mup12StrValReaderC1ERKS0___ZN3mup12BinValReaderC1ERKS0___ZN3mup13BoolValReaderC1ERKS0___ZN3mup12DblValReaderC1ERKS0___ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZN3mup12IValueReader9SetParentEPNS_11TokenReaderE__ZNK3mup12HexValReader5CloneEPNS_11TokenReaderE__ZNK3mup12StrValReader5CloneEPNS_11TokenReaderE__ZNK3mup12BinValReader5CloneEPNS_11TokenReaderE__ZNK3mup13BoolValReader5CloneEPNS_11TokenReaderE__ZNK3mup12DblValReader5CloneEPNS_11TokenReaderE__ZTVN3mup12HexValReaderE__ZTSN3mup12HexValReaderE__ZTIN3mup12HexValReaderE__ZTVN3mup12StrValReaderE__ZTSN3mup12StrValReaderE__ZTIN3mup12StrValReaderE__ZTVN3mup12BinValReaderE__ZTSN3mup12BinValReaderE__ZTIN3mup12BinValReaderE__ZTVN3mup13BoolValReaderE__ZTSN3mup13BoolValReaderE__ZTIN3mup13BoolValReaderE__ZTVN3mup12DblValReaderE__ZTSN3mup12DblValReaderE__ZTIN3mup12DblValReaderE__ZTIN3mup12IValueReaderE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZN3mup12HexValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12StrValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12BinValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup13BoolValReader7IsValueEPKcRiRNS_5ValueE__ZN3mup12DblValReader7IsValueEPKcRiRNS_5ValueE__ZNSt3__1L3hexERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEErsEPFRNS_8ios_baseES5_E__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strERKNS_12basic_stringIcS2_S4_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup11ParserErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table148GCC_except_table38GCC_except_table7GCC_except_table47GCC_except_table137GCC_except_table26GCC_except_table5GCC_except_table124GCC_except_table153GCC_except_table13GCC_except_table52GCC_except_table22GCC_except_table51GCC_except_table31___gxx_personality_v0GCC_except_table70GCC_except_table40GCC_except_table130GCC_except_table20 #1/20 1573634243 501 20 100644 119484 ` mpValue.cpp.o  __text__TEXT^__gcc_except_tab__TEXT4|__literal8__TEXT __literal16__TEXT0ئ__const__DATA@05l__const__TEXTp8__cstring__TEXTT__compact_unwind__LD ,Э(9__eh_frame__TEXT(8@G h2  )HGXGgj P  aUHH@H}EH} H`H=H`H9H@WHXXH`H@PH@XMH`@dH@hUփmTPrTsLHEMH@H@HH8H`H8HxP(H0ƅoH0HpWH(1HpH(ƅoH`H(HHXHpFHEMHEMHpo H0 H]H`HH} f.UHH H}EMH}EMH ]ÐUHHH}H}H]DUHHH}EH}EH]f.UHH H}uHUH}uHUH ]UHHH}H}H]DUHH@H}EH}uH]f.UHH0H}uH} H}H=HEH8H@*EWHHEH@PH@X@`i@dH@hH0]ÉHEMHEHH} f.UHHH}uH}uH]f.DUHH0@H}$EH} H}H=HMH9H@E$*WHHEH@PH@X@`b@dH@hH0]ÉHEMHEHH} f.DUHH@H}$EH}E$H]DUHHPH}H} H}Hu؉H=HMH9H@WHEMHEHPHEHEHEH}HuHEHEHMHHUHBXB`sBdHBhHP]ÉHEMHEMH}HEHH} f.@UHHH}H}H]DUHHH}uEH} HXH=HXH8H@WHPPHXH@PHX(HHH@ƅgH@uEHhH84HhH84ƅgHhHHH8HHXA`mAdHAhH]ÉHEMFHEMHEMHhg H@HXHH} fDUHH H}uEH}uEH ]DUHHH}uUEH} HXH=HXH8H@WHPPHXH@PHX(HHH@ƅgH@uUEHhH840HhH840ƅgHhHHH8HHXA`mAdHAhH]ÉHEMFHEMHEMHhg H@HXHH} @UHH H}uUHMH}uUHMH ]ÐUHH H}uUEH}uUEH ]f.DUHHPH}HuHu HHu؉H=HMH9H@WHEMHEHPHEHEHEHuH}HEHEHMHHUHBXB`sBdHBhHP]ÉHEMHEMH}HEHH} f.UHHH}HuH}HuH]f.UHHH}HuH}HuH]f.UHHPH}HuHu HHu؉H=HMH9H@H}HHLEIxHIP@I@PI@XA@`cA@dI@hHEHEH@HEE,*Uf._YHEH@HEWMf.-'HE@`iqHEMHEH]HEH@HEWMf.ȰcfˆEMUEEEEEHM؈A`HP]H} f.fUHH}H}]f.@UHH}H}G]f.UHHH}HuH}HuH]f.UHH0H}EH} H}H=HEH8H@EWHHEH@PH@XE,*f.Ȳf@i@׈U@u@}E׈EEֈEՊEHM؈A`AdHAhH0]ÉHEMHEHH} UHHPH}HuHu HHu؉H=HMH9H@WHEMHEH@PHX(HEHEHEHuH}HEHEHMHHUB`mBdHBhHP]ÉHEMHEMH}HEHH} f.UHHH}HuH}HuH]f.UHHH}HuH}HuH]f.UHH0H}HuHu HHu؉H=HMH9H@WHEMHEH@PH@XH@hHuHH0]ÉHEMHEHH} f.UHHpH}HuHuH;uHuHEHH@HUHJ@H@HHBHHE@p`@r`HExdzdHEHxPHEHxPWHHHUHrPH}HHMHEHMHHP0HEMH}HEHpPHEHxPHE4HEHHPHHMH}H}HEH@PHEHxXHEHxXW(HHHUHrXH}HHMHEHMHHX0HEMH}XHEHpXHEHxXHE4HEHHXHHMH}H}HEH@XHp]H} f.fUHHH}HuH}HuH]f.UHHH}HuHu HHuH=HMH9H@WHEMHEH@PH@XH@hHHEHHHшEEȃʃHUMHHMHcHHEMHEHHHEH}WEHEHMHA@HEHAH;HEHHHEHEHHHEH}EMHEHMHA@HEHAHHEHxPHxHxHMHHHHpHhHpHhHEHpHHP^HEMHxjHEHHHH`HEHxPH`HXHEHxX(HPHPHMHHHHHH@HHH@HEHHHHX^HEMHPHEHHHH8HEHxXH8H0 HEHHHш/HE/H`H]HEHH} +w++UHH@H}H}HEH}HWEMHEH}HG@HEHGHHGPHHEH}H}HEH@PHHXHHMH}H}HEH@X@`f@dH@]f.@UHH H}HuHuH;uHu HuH}HEH ]UHHH}HuH}HuH]f.UHH H}HuHuH}H}HHEHuHHEH ]UHHH}HuHUHUH}HXH}HXHxHPLH}LHPHxH}KK4HEHHHшJJI/HEHHHшHHIIEEixHHuH@HH5HH@HplHxHplHplH@H}qHEHHhHMH9H8HH8dhdHXH9H0HL0AH]Hp  UHH H}H}H}1ɈʨUqHEHH1@Wf.@uKEHEHHHEHHE,*Mf.@AD @uE$H ]@UHHH}H}H]DUHHH}H}H]DUHHPH}uUH}HHHEHHyX9;EHHyX9} } xHƅkHHHHHHxHH}(HxHuHƅkH5HHHpl8HplHplH}Hxk HHHHxXuUHE}}HHExHƅHHHHHH(HHHƅH5HHyHplHplHH H HEHP]Hp  f.@UHHH}H}Hȃm$H]UHH}H}]UHH}H}G]f.DUHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=tH5pH XHEHHcuHH0]@UHH HHH}H}HHGPHH}HEH}H}HEHHXHHMH}H}HEHH ]UHHH}H}H]DUHHH}H}H}H}H]UHH0H}HupHuHHH}HHEHuHHEH0]ÉHEMH}H} UHH}HE]fUHH@@H}$EH}E$*HMH}HWHMH}HO@HMHOHHOPHHMH}H}HEH@PHHXHHMH}H}HEH@X@`b@dH@]@UHH@H}uH}u*HEH}HWHEH}HG@HEHGHHGPHHEH}H}HEH@PHHXHHMH}H}HEH@X@`i@dH@]f.@UHH@H}EH}EHEH}HWHEH}HG@HEHGHHGPHHEH}H}HEH@PHHXHHMH}H}HEH@XE,*f.Ȳf@i@׈U@u@}ELjEEƈEŊEHM؈A`AdHH@]fUHH`H}H}HEH}HWEMHuHEHuHF@HEHFHH~PSHHH}HHuHMHEHMHHP,HEMH}ZHEHxPHuHEHEHHXHHMH}H}HEH@X@`s@dH`]H} UHH`H}HuHuH}WEMHuHuH}Hw@HuHwHHPSHHHuH}HHMHEHMHHP,HE؉MH}ZHuHEHxPHEHEHHXHHMH}H}HEH@X@`s@dH`]H} f.UHHH}HuH}HuH]f.UHH`H}HuHuH}WEMHuHuH}Hw@HuHwHHwPHHuH}H}HEH@PHxXS(HHHuH}HHMHEHMHHX,HE؉MH}*HuHEHxXHEHE@`m@dH`]H} f.UHH@H}HuHuH}HHF@HGHFHHFPHHuHEH}H}HEH@PHHXHHMH}H}HEH@XH@HWf.oiHEH@HHEH}E,*Mf.Ȳf@iAЈU@uDEELjEEƈEŊEňE cEEHMA`AdHH@]fUHHH}HuHuHHhH}HEHHHhH@HHHhH@HH`Wf.HhH@HHXHXP,*Pf.Ȳf@iAЈO@NDMOM NMML cLLHhA`HhHH}sHhHxXH=~H5~H "HEHHHhHyXHH@HhHH}sHhHxPH=U~H5Y~H ~HEHHHhHyPHH8[xHƅsH52~HMH0HH(HhHHHш'HEHHHш&H'D&DH}HMHuH(ƅsH5HH0Hxt5HxtHxtH}H}s H0HhH]Hx  UHHH}H}HEMfEEiM EcME$H]DUHH H}HuHuH}HuHuXH}HuXFFHH ]UHHpH}HuHuH};HuHEHHU;JHEH5|HMH}HHEHuH}EH5HH}HEЉMHEЉMH}E H}EEHM;vEEHM;ALH}uċUuċUH}HEH8H}HHuHEHEEEEăE{HEHp]H}  UHHH}H}Hȃs$H]UHHH}HuH}HuH]f.UHHH}HuHuHHhH}HEHHHhH@HHHhH@HH`Wf.HhH@HHXHXP,*Pf.Ȳf@iAЈO@NDMOM NMML cLLHhA`HhHH}sHhHxXH=xH5NxH rxHEHHHhHyXHH@[xHƅsH54xHMH8HH0HhHHHш/HEHHHш.H/D.DH}HMHuH0ƅsH5HH8Hxt5HxtHxtH}H}s H8HhH]Hx  f.UHH H}HuHuH}HuHu\H}HuN\NHH ]f.UHHpH}HuHuH};HuHEHHU;JHEH5*wHMH}HHEHuH}EH5HH}HEЉMHEЉMH}E H}EEHM;vEEHM;ALH}uċUuċUH}HEH8H}HHuHEHEEEEăE{HEHp]H}  UHHH}HuHuHHH}HEHHHH@HHHH@HHWf.HH@HHxHxp,*pf.Ȳf@iAЈo@nDmom nmml cllHA`mHHH}HHxXH=?sH5rH sHEHHHHyXHHHyXH`>HHxX%1HHyXƉHHlHH{H}eHuHEHHXHHxXHXHPH}HxtH}HHH}jHuHHHHHHHHHOHxtHNH5mqHHH@HH@HHHHЈ??ƅmDžxHHH0HH5HH0HxtH_HxtHxtH0HHH]Hx  fUHHPH}HuHuH}HuH}EH}ME(MH}HuEMHuH}H7HuHwHHP]UHHPH}HuHuH}H@1H}ƉH}HDž||H@;DžxxH@;AHu|xH@H8H0H0HHHH8H(xxwHplH}7||"H}H@51H@ƉHHHuH@DžH@;DžH@;AHH@H HHHHHH HtHplHHH@HHU; H@0HMQHXv HD DƉHHHHXDžTTH@;DžPPHM;AHWDžH@;ATH@HHH}PHHHhHHHHhHHh9HplHXHplHplHplHhcTPHHHHHHPP=HBTTHH@HHHƅOH53kHPHHHHPHƅOH5HHzHplHplHPO HH@HP]Hp  f.DUHH@H}HuHuEHuEHM;kEEHM;AAHEuUH}HEH8H}HHuHEHEȋEEEEHEH@]f.UHH}H}G`]f.@UHHH}H}HH@H8HEH8H`iHEHH0H}ΉH0H}EH8G`EEiH(H(HjH8H H}H HHxtH}9Hxt HXHhH8HH@HXHEHHH@H@HHX HxtHXaxHHuHHH5HHEHxtHH},EH]Hx  fDUHHH}H}H]DUHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHHHHuHuHHEHEH]fDUHH0H}HuHuH}H}HHEHuHHEH0]UHHH5H}H}H}HuHƀHH]UHHH}H}H@H]ÐUHHH}H}HH@HHEHH8H}ΉH8H}EH@G`EEcH0H0HdH@H(H}H(H HE|H}>HE|H`HpH@HHHH`HEHHHHHHHH`HE|H`^xHHuHHH5HHMHE|HH}H@H@HH]H}  f.fUHH}H}H@H]f.UHHH}H}H}sH}HP4H=FaH5`H BaHEH@PH]DUHH@H}EH}w`M9H8HEHH0H}ΉH0H}EH8G`EEEH(H(HjH8H H}H HHxtH}4Hxt HXHhH8HH@HXHEHHH@H@HHX HxtHXaxHHuHHH5HH@HxtHH} H]Hx  f.UHHH}H}H}bH}H@ Xf. $H]fDUHHH}H}H}mH}HX4H=S^H5]H N^HEH@XH]DUHH H}H}HH}ȃm EHEHHHEEH ]fDUHH H}H}HH}ȃm EHEHHHEEH ]fDUH1H}]f.fUHHPHHuHuHHHHHHHHHH5H4HHHH5\HH5HHHHHH5HHHH5I\HxHtHxtHhHH5[H`HHHHш__H`HPH5[HPHHHH5[H@HH`ʃ H84HH8HcHHHTHHH@H(H  ,H(H(HHH@HHHHHH5hZHHHxP&H=4ZH5qYH Y HH5YHHHpPHHH5YHHHHHHHYH |YHEHHHH5TYHHHH52YHHHHHHP]H Hl@UHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHHH}H}JH}EHH]ÐUHH@H}EH}HuH]@UHHH}H}HhH}HEHxhH HEH HEHHQ@H]fDUHH}HuHuH}H~h]fDUHH H}H}HHH8H@HEH}EMH ]DUHHH}H}HH]ÐUHH HHuHuHH}HHEH}HHEH ]UHHH}H}HH]ÐUHHH}H}H$H]f.fUHH}EMH}EEG]DUHHH}H}HHXH}HH}H]f.@UHHH}H}HH0H}HHEHHH}H]f.@UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHH H}H}H}H}H ]HHUUHHH}H}H]DPH$UHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHH H}uHUHUu2BBHHHc2HUH ]f.UHH H}HuHUH}HuHUH ]DUHH0H}HuHUHUHHHUH}GHuH}HuHUH}HEMHEHH0]H} fDUHH H}H}H}HEHH@HHEHuHH ]HHUUHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHHk}pHHHE1ɉH}H8H}H0]f.@UHH@H}HuHUHUHHHUHEH}HuH}HUHrH}HHUH}HHEHPHpHPHUHHUH}H}H@]UHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHHH}H}HH]ÐUHH@H}HuHuHHuH}HEH}HEHkpHuHH}HuH}HEHkpHuHH}HuHkupHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}HI$I$I]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H=9Hk}pH ]f.UHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}H]DUHH}HE]fUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH}HE]fUHHH}H}H}pHHUH2H)HHH]UHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHH0H}HuHuH~H}HuHEH;E4H}H}HǐH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH H}HuH}HuH ]f.UHH H}HuHuH>H}HHuV8H ]DUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHH H}uUHMHMUUQAHHQHcHUH ]DUHH H}HuHuHHuHuH}HuH}HuHH ]fUHHH}H}H]DUHH0H}HuHuHHH}HuHuH}H0]ÉHEMH}H} UHHH}H}H]DUHH H}HuHuH}GFH}H}GFH}HHH}HHuHEH ]f.UHHH}H}H]DUHHH}H}H]DUHH H}HuHuH;uHu+HEHMHHHEH0HEHPH}HEH ]fUHH H}HuH}HuH ]f.UHHpH}HuHUHUH}HuHUHEHEH}HEHUH9HEHEEHEH}HEH}H9!EHEHEH}H}HH}HuHEHHEEIHuHUHEH}HuHUHEHUH)H}HuHEHUHHM HuH}7H}HuH}H}HHuHUHMH}H}Hp]UHH}Hu]fUHH H}HuH}HuH ]f.UHpH}H}HWH?H)HHH]fUHH H}HuH}HuH ]f.UHH0H}HuHUH}H}HEH}HEH}HuHH0]UHH@H}HuHUHMHMHHHMHEHUH}HuH}HuHUHEHHH}H@]DUHH0H}HuHuH}H}HHEHuHH}HEHuH}HuH}H0]HHUf.@UHH H}H}H?H}\H}H}H}H7HEHuH}HuHHEHHHEH@HH ]UHH@H}HuHuHHuHEHEH;E H}H}HEHEH}HH9 HEHE HEHHEH}HuHHEHEH@]f.fUHH}]fDUHpH}HuHuH}H)HHH]UHH}HuHuH}HkpH7H7]UHH H}HuHUHEH;E.HuH}HEHEHpHEHEHpHEHEH ]fDUHH}HE]fUHH0H}HuHUHMHEH;EFH}HEHH}HHUH}HHEHpHEHEHHpHH0]f.@UHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUH}HH ]fUHH}Hu]fUHHPH}HuHuHHuH}HEH}HEHkpHuHH}HuHkupHH}HEH}HEHkpHuHH}HEHuHHUHMLEHP]f.UHH H}H}H}HEH}HuH}H}H ]HHUUHH H}HuH}HuH ]f.UHH H}HuHuHUH} HEHEHEHEHEH ]UHHH}H}H]DUHH}HuHuH6Hk}pHH]UHHH}H}HHH}HHEHHH]UHHH}HuH}HuH]f.UHHH}H}H]DUHH0H}uUH}H}EHMAEEEHMEEEHMHHωE‹u9AAAH=d(H5`(H (iHEHHcuHH0]@UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H}H}H]UHHH}H}H]DUHH}HuHuH6Hk}pHH]UHH H}HuH}HuH}HH}HEH}HuHH ]fUHHH}HuH}EH}EH}EH}EEYEEEYEEEYEEEYEEE\EEEXEEE*EEEE(EWMx ExxM(uf(zffEE+WphphhM( f(ffEEE( fEEE( fEEEE.E=W`X`XXM(f(#ffEEWPHPHHM(f(ffEEE( zfEEE( NfEEEE;E)EEEE( fEEE( fEEE( ofEEE( CfEEEM MYMUYU\(YUMYMUYUXYEEMH}EMH]@UHEEf.$]@UH tEE(ff. $]f.fUHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHUUHH0H}HuHuHHuH}H}HEHuH>H8H~HxH~HxHuH}H}H0]@UHH H}H}H}H}QH}H}HEH}HEHH}HuH1ɉH}1ɉH}H ]f.UHH H}HuH}HuH ]f.UHH H}H}H}H}+H}EHHu1ɉH}&H}EHHu1ɉH}H ]HHUfUHH H}HuHUH}HuHUH ]DUHHH}H}H@H]ÐUHH}]fDUHH H}HuHUH}H ]HHUDUHH0H}HuH}HuH}HHH}HEHEH0]f.UHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]?? 88 uCR DD OR662ulAAFDDF992| luuX:: E99: d 99B{+'<<+V+X8&nne8/<69 &&L=,bbvccsb!b6MMm-!b6MMm-? S7 Y>a +  = $ 9 (U+oLUUY+@@+lT(C+oGHH /   -6_U5 9T * M  G+9 L t  /, @5( Cf *L UU `[ C    /1& )A 3$ " E ##_B:??p@@h@h@ppN3mup11ParserErrorEN3mup5ValueENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEN3mup11MatrixErrorEoperator+=/Users/jgomez/muparserx/parser/mpValue.cppm_pvValm_psVal+operator-=-operator*=*GetStringm_psVal != nullptrGetArraym_pvVal != nullptr [addr=0x; pos=; type=""; val=(matrix)AsciiDump; ; not vol]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeAt/Users/jgomez/muparserx/parser/mpMatrix.hi < (int)m_vData.size()Matrix dimension mismatchMatrix dimensions don't allow multiplicationA/@`%)%Aԝ!A+AA+A0` / 1 AP # #0 Ah   #0 A|A#@#pA A #PAP9P#9PA A8 -P`@( iAl  P!"#A| $A0%#`%Ap&7' A+[0,M,Aܟ.-0.#`.vA1U@2A3A08} 9aAt?@@`@ZAԠBBAC* D9`D9DDDAG0GkGEAHIJ@JkJZKZpKKAtPBPG0Q/`Q/Q,QZ R@R;RR=RS$0S+`S2SBSi`TTT(TTU0UCU(UWYZpY Z0\A_0_#`_#____20`*```"`@`aOPa1aa'abb0b@b`bbb bbLc$@c`c%cVcO@d`d#due"@e`e$eMe(fA`ff9AffO@g1g$gg ghhC`h+hA i`Ai jjZ k 0k#`kIkk6l l 0lYA̡l'llmm#mmn  nMpn(nnno o0oUodAܡp p#Pp?ppppq q@q`qpq8qqqr+0rFr rrFss7Psps+sA t#Pt#t+t;AtuK`uGuu]A 0vPvVvvvWPw#wYxx# y'Py#yMyk@zrAz@{{ {( | @|Z||r0}F}F}}7 ~0~~XA(@#pM 9@#pP?( GP `47A8!Up+KUP+3#0PpC#20C##/ 2`'e'0P/2/0Pp[@`OALВl@Г#A\+Д ;Al@CA|9A#0Pg!07p,&Л<QAȢp|Aآ0"`+$zPLRx ,$)SAC zRx $x+/AC $D+AC $lx+%AC $+)AC $+AC $+%AC ,\+;AC $<+!AC ,,AC $,+AC , ,AC $X-AC ,dP-oAC $D.+AC ,.7AC $H0/AC $P01AC ,<h0AC $81#AC $D@1#AC ,H1oAC $2AC $2AC $2#AC ,d2AC ,P3AC $t 4#AC $(4#AC ,04WAC ,D4;AC $$6#AC ,6AC $|X:AC $:9AC $;#AC $;9AC ,l(;PcAC $LH=AC $t=AC $=AC ,=AC $@-AC $@AC $D@AC $l@AC $0AAC $AAC $A(AC ,\AiAC $<AAC $dAAC $HBAC $BAC ,, CAC ,\ DAC $< xE#AC , EAC $ `F7AC , xG oAC $ hK[AC $ KMAC , KAC $l M-AC $ M#AC , (MvAC $ xPUAC ,d PwAC , R_AC $t V}AC , WaKAC $ H]AC $ ]AC ,l ]Z+AC $L _AC , _AC $ `*AC $ `9AC $ `9AC $ aAC , aDGAC $t cAC $ ckAC ,`cEAC $ eJAC $ekAC $DeZAC $l(fZAC $`fAC , Xf+AC $(kBAC $PkGAC $<xk/AC $dk/AC $k,AC $kZAC $kAC $k;AC $,kAC $Tk=AC $|kAC $k$AC $k+AC $k2AC $lBAC $D0liAC $lxlAC $plAC $hl(AC $plAC $ hlAC $4`lAC $\XlCAC $l(AC $lWAC $oZAC $o AC $$pAC ,hrAC $|uAC $u#AC $u#AC $ uAC $uAC $DuAC $lu2AC $ u*AC $(uAC $ u"AC $ (u@AC $4@uAC $\(uOAC $Pu1AC $huAC $`u'AC $huAC $$`uAC $LHuAC $t@uAC $(uAC $ uAC $uAC $u AC $<tAC $dtLAC $u$AC $uAC $u%AC $uVAC $,HuOAC $TpuAC $|hu#AC $puuAC $u"AC $uAC $u$AC $DuMAC $lu(AC $vAAC $(vAC ,4 v9/AC $0vAC $<8vOAC $d`v1AC $xv$AC $vAC $xv AC $`vAC $,XvAC $T@vCAC $|hv+AC ,pvAC ,$v`[AC $wAC $,xwAC $TwZAC $|(x AC $x#AC $xIAC $@xAC $(x6AC $D@xAC $l8x AC , xYAC $Px'AC $XxAC $PxAC $<HxAC $dx#AC $xAC $xAC $x AC $xMAC $,x(AC $TxAC $|xAC $xAC $xAC $xAC $ xUAC , xd AC $t yAC $ y#AC $ y?AC $ (yAC $! yAC $-4-----~-q---Ε--u-h-`-7- -b----tr-d-V-Ir-9-#Q------H--t-^Q-U-2_-)-b-b--˒-_--Q-1----a-A-ݐb-b-mb-A---}-qb-Cb- --َ--i-]-Lc-r-r-ʍ-----s-a-X-@-*--ٌ-u--A-!--ɋ--j-]-C-.-G-?--׊-@-;-;-)-=-׉q-É-[-=׈---\-A-=ۇ-E-Ɇ--qX-E,----߅--y-bW---~-gN-;"- -^V-?------ -v-h -=--.- =-с---z=s-B-)---Y -/--v--Y-4---u-~-~-~-~-~~-f~-Y~-L~- ~!-~-}-}-l}-\}-|-|r-k|;-{-{-w{-\{l-{o-{w-{-zm-z-z-z-z-yz-kz-1zt-(z- zq-ym-y-y-y-y-iy- y-x-x-x-x-x-x-xx-Ux-&x-x-x-w-w-w-iw-9w-!w-vg-v-v-Av-'v-v-vH-u-u-u-us-|u^-Qu-u-t-t-it-9t-t-s-sr-sm-s-ds-=s!-1s-r-r-lr-\r-!r-q-q-q-Qqv-4qr-p-p-zp=sp-9p-p-o-o-o-o=o=o-o-{o-jo-eoQo-n-n-=n-n-n-m-m-m-sm-[m-Nm-6m-)m-m-l-l-l-l-cl-Rl-Il~-Al}-l|-ky-k{-kz-ky-Ikx-kw-kv-jm-ju-jt-js-sjr-[jq-Cjm-jp-io-in-im-i-il-|i-eik-5ij-i-iv-hh-h-hg-h-Ih-gf-ge-g-ggd-[gc-gb-f-f-fa-f-f_-f^-4f]-e\-qeT-QeT-!eT-dn-dn-yd[--dZ-dY-dQ-cX-cQ-{c-bq-bm-bq-!bW-aV-aU-aT-aT-aaT-=aS-+aR-aQ-`-y_P-q_O-I_N-^t-^L-^A-^=-y^K-]^;-G^-?^q-3^-]@-]J-]C-].-]=-{]I-l]H-P]-]@-\@-\;-\q-\B-\;-|\?-o\>-[\m-Q\q-\q-[>-[o-[A-[>-[?-[p-[>-z[o-W[t-O[A-3[>-#[?-[m-Zq-Z>-Z?-Z;-Z;-iZq-WZn-OZ>-6ZG-)Z>-ZA-Z>-Y?-YG-Y;-Y;-:YF-X<-XD-XC-XB-X@-XA-eX?-RX?-%X<- X;-W<-W>-W<-lW<-?W@-2W;-W?- W>-V=-ZV<-,V<-V;-U;-U-U|-iU-]U-;U=!U}-U-T-T-T-T-rT-OT-8T|-S-S-S-S-S-R-Q-Q-{Q:-KQ:-P-Ps-NP-2P-!P+-P-OO-OO-OOO-\O-PO=O-O-ON-NNNN-NN-fN -4N-N -M-M-MfM-ZMGM-M-ML-L-L-LL7-L8sL-TL7-HL65L-0LL-L=K-K*-ZKi-Jj-J-JJ|JZJb-JJ - Jb-I-I-I-I-I=I={I-eI-TI-4I-(I-I,-H+-H-H*-H-oH-SH-=H)-%H-H-G-G-G-zGsGlGJGb-F-F-F-F-F-F=F=F-wF-fF-IF-=F-*F,-F+-E-E*-E-E-nE-XE)-@E-#E-E-D-De-D -D-|D-kD=KD3- Dk-C-C-C-C=C1-WC=KC0-8C= C=C/-B.-B-B-B-jB-^B=WB=KB-5B-$B-B-A-A,-A+-A-A*-hA-?A-#A- A)-@-@-@-@-@ -?G-y?-N?-0?->->=>=> -> ->>->O-n>O-]>H-,>5- >5-=;-=G-=5-p=5-A=5-)=F-=-<h-<G-<$-4<5-#<K-<#-;5-x;5-;G-:H-:!-:G-i:j-X:5-1:5-9G-g9!-[9h-C9j-8-8-8-8 -8-f8-Z8-&8-8-7=7=7-7-7-v7-Y7 -C7775-75-7-6-6d-6e-65-~65-i6S-R6-.6e-6d-6-5G-5j-5i-5T-~5-t5m5f525d-5d-4 -r4 -E4-+4&-3e-3e-3-g3G-T3h-3-2-2-2=2=2 -2 -22-2-1 -1-1-1-1-<1-01=)1=1-1-0 -o0^0-F0R-0-0 00/d-/d-&/ -/ -.-.#-.e-.e-I."----G--h-S--;---- -=-=, -, -,,-b,-M, -+-+-+-v+-1+-%+=+= +-*-~* -d*S*-;*-*- **))f-)f-)U-n)-d)])V)")d- )d-v( -b( -5(-(-'e-'e-8' -*' -'-&-&O-&-&-_&-=&Q-'&-%I-%-%-%-%-I%-%-$-$O-$-$-$ -u$-J$-$-#-#O-#-#-#-h#-=#-"-"O-q"-h"-9"-!-!O-!-!-y!-+!-"!O- - - -s -j -I !-, --5-P---O--y-K2--- -----={=h-P-3--G----B-6=/=-----ti-Mj-'d---%e---}-I-)-== --_g-V-E-*--g-g--i*-;H--O---y---Q-R-$I---o-A---Q---}v-9----O-Q--I-b-,-#----------Y+-)L----I--Z-:3-- -q -V O - ,- -X -C - - - -Z S - )- - - - -U -7 - -  - 3- N-V -M -9 - 5-5-K-z$-6- --2-t-k-W-95-5-J-$-c-8--(----B-$---.-{-r-+- -1---O-4--/-6-M-{0-Q-5----5-5-jJ-P$- ---V--&-( xyzExwph`{X|P@80( xpXPH0( h`X@80( 8X[]^_cVZ\`WEDF9:<x7p=h>`XP4H5@80( aY,++++++`+X+P+@+ ++****`*@* **))))))))`)X)P)@) ))((((((`(X(P(@( ((''''`'@' ''&&&&`&@& &&%%%%`%@% %%$$$$`$@$ $$####`#@#8#0# ##""""`"@" ""!!!!`!@! !!      ` @   `@ `@ `XP@ `@80 `@ `@ `@ `@ `@ `@ xp`@ `@ `@ `@ `@ `@ `@ `@     ` @       ` @       ` @ 8 0       x p ` @         x p ` @ 8 0   xp`@80 xp`@80 `@80 `@80 `@ `XP@80 `XP@ xp`@80 `@ MTTP838%@gj80Sfgԝ%g*jih0p< gP%<`u"  jhh|Xhgjih i8 y.]gli|;0%hgC\0,E0.JgiܟD\1hgn\8g0jtB>4B_ CD DTiԠEc^4heВyjAiHX0Q[PX`Q7gt2f4 _$0_D`_ __Z_G_ ``F0`f6`3Y@bo `bcg/`c(2@dG`d>dg`k aJ`nPa a aaXPbbK0be@e`eCQeGe3`f6ffj@g}g!g ggHh  iL jiZ  kYA0kgi-l,ll.mP,rF`q,S0rrHPspqQ-ps A`k(Zkz@k l lrmHmdnJmh̡0oepTp qd@qBqQ nHnn okJpnno1;o)p= p=jܡ<Ppp3pBqquq+rIYs TrRsLs-t> tkh?PtKt)tj%0vh vEvEPwfxaCxXPyXGyCL@z0@{{U{V |F|'G@|Q|K ~/0~pg ~J@R0}Y}S}FR}i(xQpM.cO`O<_3pi83^ ^HI HpeI0^P?v?0J/ `00-n:P.0Y@aVM0@: *@NPp7P`{iL@@CГ  Дc*8f@20h\*jl:D]B 0PY3-i|Q109pe2Dh]R=:3R9Лep hȢHeZ05=`jآd@cP5&!pR"l`S!SZ RyK4PT  AQe = XP_@\ T >h>8`g787 d< WP_[0 Tp>U>80 T777O&)"@td#; $_`%[p&T{> 8"A7P!R@R0SxRRW`.uW3VW'4MPv#OPP` NuPhPuR"N{N@2Q?WN 93N,FGm `@pK I K.DJ@@@JDK=G0G*  +. 5 ` P P[0l+5b=b7@c9cb:;u6bAij2U50\6Z-pY(U:%U0UI(T$`DS,Z0izi+y6BwkM`h/Mh%v2:P9QCP8^Х\P*] MU0U`^Xpbap4U@fUpLXibaDaUH:X@"b`'T$`TG(TW$T7f7pX[TbV5Wcc'[WGO<6z 9 G[x<!je8*8+W;9==F$pE'#3:K!O'_#N816&"Zm1/119hhn[<"m3TCW`\`'``K)a)UUX_5)b&r"'#'"#&"e)x))z77)GQj-))__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__19allocatorIN3mup5ValueEE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE8capacityEv__ZNK3mup5Value8GetArrayEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNK3mup6IValue8IsMatrixEv__ZNK3mup5Value10GetComplexEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE5firstEv__ZNK3mup6IToken8GetIdentEv__ZN3mup5Value5ResetEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EE5__getEv__ZNK3mup5Value8GetFloatEv__ZNKSt13runtime_error4whatEv__ZNK3mup5Value7GetRowsEv__ZNK3mup6MatrixINS_5ValueEE7GetRowsEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE26__invalidate_all_iteratorsEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE26__invalidate_all_iteratorsEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup5Value7GetColsEv__ZNK3mup6MatrixINS_5ValueEE7GetColsEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup5Value10GetIntegerEv__ZNK3mup6IValue9IsIntegerEv__ZNK3mup6IValue8IsScalarEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5clearEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE5clearEv__ZNK3mup5Value9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE9__end_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNK3mup5Value7GetBoolEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZNKSt3__17complexIdE4realEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__clear_and_shrinkEv__ZN3mup6IValue11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZN3mup5ValuecviEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6lengthEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup5Value9GetStringEv__ZNK3mup6IValue8IsStringEv__ZNK3mup6IValue8ToStringEv__ZNKSt3__17complexIdE4imagEv__ZNK3mup5Value7GetImagEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__19allocatorIN3mup5ValueEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4sizeEv__ZN3mup5Value7AsValueEv__ZN3mup6IValue8AsIValueEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE13__vdeallocateEv__ZN3mup5Value7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup5Value7GetTypeEv__ZNK3mup5Value5CloneEv__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotator6__doneEv__ZNK3mup5Value10IsVariableEv__ZNK3mup6IToken7GetCodeEv__ZN3mup6IToken13AsIPrecedenceEv__ZN3mup5ValuecvdEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEE6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNKSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZN3mup5ValuecvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup5ValuecvNSt3__17complexIdEEEv__ZN3mup5ValuecvNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEv__ZN3mup12ErrorContextD2Ev__ZNSt13runtime_errorD2Ev__ZN3mup11MatrixErrorD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup6IValueD2Ev__ZN3mup5ValueD2Ev__ZN3mup6MatrixINS_5ValueEED2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEED2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19allocatorIN3mup5ValueEEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIN3mup5ValueEEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11MatrixErrorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup5ValueD1Ev__ZNSt3__16localeD1Ev__ZN3mup6MatrixINS_5ValueEED1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1Ev__ZN3mup11MatrixErrorD0Ev__ZN3mup5ValueD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error__ZTISt13runtime_error___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__116allocator_traitsINS_9allocatorIcEEE10deallocateERS2_Pcm__ZNSt3__19allocatorIcE10deallocateEPcm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEPKcm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendEPKcm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endIPS2_EENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC2ERKS5_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE24__RAII_IncreaseAnnotatorC1ERKS5_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8allocateERS4_m__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10deallocateERS4_PS3_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__19allocatorIN3mup5ValueEE10deallocateEPS2_m__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEixEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE14__annotate_newEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__annotate_shrinkEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__vallocateEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZN3mup5Value2AtEii__ZN3mup6MatrixINS_5ValueEE2AtEii__ZNK3mup6MatrixINS_5ValueEE2AtEii__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEcci__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNK3mup6IToken9IsFlagSetEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZN3mup5ValueaSEi__ZN3mup5ValueC2Ei__ZN3mup5ValueC1Ei___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZN3mup5ValueC2Eiid__ZN3mup5ValueC1Eiid__ZN3mup5ValueC2Eid__ZN3mup5ValueC1Eid__ZNSt3__17complexIdEC2Edd__ZNSt3__17complexIdEC1Edd__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd__ZN3mup5ValueaSEd__ZN3mup5ValueC2Ed__ZN3mup5ValueC1Ed__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6assignEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZN3mup5ValueaSEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IDnEEPKc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IDnEEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZN3mup5ValueC2EPKc__ZNSt12length_errorC1EPKc__ZN3mup5ValueC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNK3mup5Value9CheckTypeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZN3mup5ValueC2Ec__ZN3mup5ValueC1Ec__ZN3mup5ValueaSEb__ZN3mup5ValueC2Eb__ZN3mup5ValueC1Eb__ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE7destroyIS3_EEvRS4_PT___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9__destroyIS3_EEvNS_17integral_constantIbLb1EEERS4_PT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemIPN3mup5ValueELi0ELb0EEC2IDnvEEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPN3mup5ValueENS_9allocatorIS2_EEEC1IDnLb1EEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE6assignIPS2_EENS_9enable_ifIXaasr21__is_forward_iteratorIT_EE5valuesr16is_constructibleIS2_NS_15iterator_traitsIS9_E9referenceEEE5valueEvE4typeES9_S9___ZNKSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE31__annotate_contiguous_containerEPKvS7_S7_S7___ZNSt3__1L8distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5___ZNSt3__1mlIdEENS_7complexIT_EERKS3_S5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5___ZNSt3__1L4moveIRNS_9allocatorIcEEEEONS_16remove_referenceIT_E4typeEOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSEOS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6appendERKS5___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEpLERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__1L16__to_raw_pointerIN3mup5ValueEEEPT_S4___ZNSt3__1L13__unwrap_iterIPN3mup5ValueEEET_S4___ZNSt3__1L6__copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__1L4copyIPN3mup5ValueES3_EET0_T_S5_S4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE8max_sizeERKS4___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L3maxImEERKT_S3_S3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZN3mup5Value2AtERKNS_6IValueES3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__19allocatorIN3mup5ValueEE7destroyEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE27__invalidate_iterators_pastEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE17__destruct_at_endEPS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEE18__construct_at_endEmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC2EmRKS2___ZNSt3__16vectorIN3mup5ValueENS_9allocatorIS2_EEEC1EmRKS2___ZN3mup6MatrixINS_5ValueEE6AssignERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZN3mup6MatrixINS_5ValueEEaSERKS2___ZN3mup6MatrixINS_5ValueEEpLERKS2___ZN3mup6MatrixINS_5ValueEEmLERKS2___ZN3mup6MatrixINS_5ValueEEmIERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZN3mup6MatrixINS_5ValueEEC2ERKS2___ZN3mup6MatrixINS_5ValueEEC1ERKS2___ZN3mupmlERKNS_6IValueES2___ZNSt3__1L25__libcpp_isnan_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L25__libcpp_isinf_or_builtinIdEENS_9enable_ifIXsr3std17is_floating_pointIT_EE5valueEbE4typeES2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZN3mup6MatrixINS_5ValueEEC2EiiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiiRKS1___ZN3mup6MatrixINS_5ValueEEC2EiRKS1___ZN3mup6MatrixINS_5ValueEEC1EiRKS1___ZN3mup6MatrixINS_5ValueEEmLERKS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZNSt3__1L3maxImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE25__construct_range_forwardIPS3_S7_EEvRS4_T_S9_RT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRS2_EEEvPT_DpOT0___ZNSt3__19allocatorIN3mup5ValueEE9constructIS2_JRKS2_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE9constructIS3_JRKS3_EEEvRS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIN3mup5ValueEEEE11__constructIS3_JRKS3_EEEvNS_17integral_constantIbLb1EEERS4_PT_DpOT0___ZN3mup5Value6AssignERKS0___ZN3mup5ValueaSERKS0___ZN3mup5ValueC2ERKS0___ZN3mup5ValueC1ERKS0___ZN3mup11ParserErrorC1ERKNS_12ErrorContextE__ZTVN3mup11MatrixErrorE__ZTSN3mup11MatrixErrorE__ZTIN3mup11MatrixErrorE__ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZNSt3__1L10__distanceIPN3mup5ValueEEENS_15iterator_traitsIT_E15difference_typeES5_S5_NS_26random_access_iterator_tagE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZNSt3__1L9__advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeENS_26random_access_iterator_tagE__ZTIN3mup6IValueE__ZN3mup5ValuepLERKNS_6IValueE__ZN3mup5ValuemLERKNS_6IValueE__ZN3mup5ValuemIERKNS_6IValueE__ZN3muplsERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEERKNS_6IValueE__ZN3mup5ValueC2ERKNS_6IValueE__ZN3mup5ValueC1ERKNS_6IValueE__ZTVN3mup5ValueE__ZTSN3mup5ValueE__ZTIN3mup5ValueE__ZN3mup10ValueCache14ReleaseToCacheEPNS_5ValueE__ZNSt3__1L3hexERNS_8ios_baseE__ZNSt3__1L3decERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7advanceIPN3mup5ValueEEEvRT_NS_15iterator_traitsIS4_E15difference_typeE__ZNSt3__1L7forwardIRKN3mup5ValueEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZNSt3__1L7forwardIRN3mup5ValueEEEOT_RNS_16remove_referenceIS4_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup5Value11BindToCacheEPNS_10ValueCacheE__ZN3mup10g_sCmdCodeE__ZN3mup6IValueC2ENS_8ECmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZN3mup5ValueaSERKNSt3__17complexIdEE__ZN3mup5ValueC2ERKNSt3__17complexIdEE__ZN3mup5ValueC1ERKNSt3__17complexIdEE__ZNSt3__17complexIdEpLIdEERS1_RKNS0_IT_EE__ZNSt3__17complexIdEmLIdEERS1_RKNS0_IT_EE__ZNSt3__17complexIdEmIIdEERS1_RKNS0_IT_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZN3mup5ValueaSERKNS_6MatrixIS0_EE__ZN3mup5ValueC2ERKNS_6MatrixIS0_EE__ZN3mup5ValueC1ERKNS_6MatrixIS0_EE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup12ErrorContextC1ENS_11EErrorCodesEiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup11MatrixErrorC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueaSENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueC2ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup5ValueC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZNSt13runtime_errorC2ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__move_assignERS5_NS_17integral_constantIbLb1EEE__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__move_assign_allocERS5_NS_17integral_constantIbLb1EEE__ZNSt3__113__vector_baseIN3mup5ValueENS_9allocatorIS2_EEE19__copy_assign_allocERKS5_NS_17integral_constantIbLb0EEEGCC_except_table9GCC_except_table89GCC_except_table59GCC_except_table49GCC_except_table249GCC_except_table29GCC_except_table68GCC_except_table18GCC_except_table118GCC_except_table7GCC_except_table67GCC_except_table57GCC_except_table347GCC_except_table37GCC_except_table327GCC_except_table336GCC_except_table26GCC_except_table226GCC_except_table75GCC_except_table65GCC_except_table55GCC_except_table235GCC_except_table25GCC_except_table15GCC_except_table184GCC_except_table264GCC_except_table54GCC_except_table334GCC_except_table83GCC_except_table73GCC_except_table173GCC_except_table323GCC_except_table13GCC_except_table282GCC_except_table172GCC_except_table62GCC_except_table32GCC_except_table41GCC_except_table331GCC_except_table21GCC_except_table11GCC_except_table201___gxx_personality_v0GCC_except_table0GCC_except_table80GCC_except_table70GCC_except_table160GCC_except_table350GCC_except_table30GCC_except_table230#1/28 1573634243 501 20 100644 18892 ` mpValueCache.cpp.oX x&xx&__text__TEXTx(w__gcc_except_tab__TEXT __cstring__TEXT(__compact_unwind__LD 8,X__eh_frame__TEXT 8h/ h2  p/c5  PBBQUHH H}uH}HHcuHEHUH ]UHH H}HuHUH}HuHUH ]DUHHH}uH}uH]f.DUHH H}H}H}HEHHH ]ÉHEMHEHHH}f.UHH0H}H}HEH}HEHMHHHEHMH9^HEHHuHHHHE HEHHQ@HEHHuHHHEHHE}HEH0]ÐUHHH}H}H]DPH$UHHH}H}H]DUHH}H}HGH?H)H]@UHH}HuHuH6H}HHH]f.UHH0H}HuHuH}HuHEHHH=H5H IHEHHljMU92HEHUHHuHc6HHUHUH$HEHHE HEHHQ@H0]f.DUHH@H}H}HE?H}LHEHHMHc1HHHEHEHHMHc1HHHE؋]pHHvH}HHMHEHEH}HuHEMH} HEH@]H} f.UHHH}H}H]DUHH H}H}H?H}6H}H}H}H7HEHuH}HuHH ]fDUHHH}H}H7H]fUHH H}HuHUH}HuHUH ]DUHHH}H}HH]ÐUHHH}H}H}HH}HH)HH]UHH0H}HuHuH~H}HuHEH;E4H}H}HH}HEH}HHEHMHAH0]HHUUHH H}HuH}HuH ]f.UHH}HE]fUHH H}HuH}HuH ]f.UHH}Hu]fUHH H}HuHUH}H ]HHUDUHHH}HuH}H]ÐUHHH}H}H]DUHH}H}H]f.DUHHH}H}HH]ÐUHHH}H}H]DUHH}HE]fUHH0H}HuHUHUHHHUH}GHuH}HuHUH}HEMHEHH0]H} fDUHH H}H}H}HEHH@HHEHuHH ]HHUUHH0H}HuHuH}H}HHuHuH9 H}HEHHuHHuHFHHH}HHHHE1ɉH}H8H}H0]f.UHH@H}HuHUHUHHHUHEH}HuH}HUHrH}HHUH}HHEHPHHPHUHHUH}H}H@]UHH}]fDUHHH}HuH}HuH]f.UHH H}HuHuHHEH}HHuH}HHEHH ]UHH}HE]fUHH H}HuHuH}HuHuHHEH ]f.UHHH}H}H]DUHH}]fDUHH0H}H}HHEHEH}HuHEHEHH0]HHUUHH1H}HuH}HuH]fUHHH}H}HH]ÐUHH@H}HuHuHHuH}HEH}HEHHuHH}HuH}HEHHuHH}HuHuHHH}HuHUHMIH@]UHH H}HuH}HuH ]f.UHH H}H}H ]DUHHH}H}HH]ÐUH]DUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}H]DUHH}H]f.fUHHH}H}H]DUHH}H}H]f.DUHH]UHH H}HuHUH}HUHUHUH9 H=HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}HE]fUHH}HuHUHMLE]fDUHHH}H}H?H]fUHHH}H}H]DUHH H}HuHUH}HuHUH ]DUHH@H}HuHUH}HuHUH}HHuH}HuHH@]f.UHH}]fDUHH}HuHU]f.@UHH0H}HuHUH}HuHUH}HHuH}HuHH0]f.UHH}HE]fUHH H}HuHUHUH}HUHHUHH ]  4K L t  /6_U5 9T * M  G+9ReleaseToCache/Users/jgomez/muparserx/parser/mpValueCache.cpppValue->GetRef()==0allocator::allocate(size_t n) 'n' exceeds maximum supported size8@+p!VA #PPA@`Z+00`A# #P`;A @PA`A@  # I  6`   YA ' @  # 0 P ` M (   @ ` p [ dA@`#? @`+F F`p5zRx $ 8AC $D8+AC $l@!AC zPLRx ,$(VAC $XAC $ AC $4AC $\AC $#AC $AC ,DAC $xAC $,pZAC $TAC $|+AC $AC $0AC ,dAC $$#AC $LAC $t#AC $AC ,4;CAC $AC $AC $DAC $lAC $AC $AC ,T3AC ,`AC $D8AC $lAC $( AC $#AC $IAC $ @AC $4(6AC $\@AC $8 AC , YAC $P'AC $XAC $,PAC $T#AC $|AC $AC $ AC $MAC $(AC $DAC $lAC $AC $AC $AC $ [AC ,dAC $d AC $ #AC $ ?AC $ 0AC $ (AC $, AC $T AC $| AC $ +AC $ FAC $ ( AC $ AC $D FAC $l 0AC $ 5AC ?-LA-<?-@-?->-Q-4 -=-Z=V-y<-U\-.Q-%`-a- W=Y= :- ^- 9- 8-  6-1 7- 6-} 5-U 4-E 3-! 2- 1- 0- .- /- .-v /-i .-\ .-5 -- ,- P- *- )- (- '-q &-= #- %- $- #- "-h !-C -3 - - -----zU-dI-<P-%--Q-J--K-s-1---[-P--9--P- - --E -% - ------QJ--Q-[-R-S-\-----]-T-H-X-_-O--Q-0-P-N-N-B-F-aM-.L-`@ `@ b`@ `@ b`@ bb`@ b`@80b `XPb@ xpb`@ bM  50] ` `r ]  P  @V    y  @ `   a  ` a M0  P  'p 6 Y@E` '  `  G @   B @o `p: nd `Op wPJP p [w !`d @@Pt@  / -U B   ___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__19allocatorIPN3mup5ValueEE8allocateEmPKv__ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE8capacityEv__ZNKSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE8capacityEv__ZNSt3__114numeric_limitsIlE3maxEv__ZNSt3__123__libcpp_numeric_limitsIlLb1EE3maxEv__ZNSt3__117__compressed_pairIPPN3mup5ValueENS_9allocatorIS3_EEE5firstEv__ZNKSt3__117__compressed_pairIPPN3mup5ValueENS_9allocatorIS3_EEE5firstEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIPN3mup5ValueEEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIPN3mup5ValueEEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemIPPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemIPPN3mup5ValueELi0ELb0EE5__getEv__ZNKSt3__120__vector_base_commonILb1EE20__throw_length_errorEv__ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE5clearEv__ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE9__end_capEv__ZNKSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE9__end_capEv__ZN3mup10ValueCache10ReleaseAllEv__ZNK3mup6IToken6GetRefEv__ZNKSt3__19allocatorIPN3mup5ValueEE8max_sizeEv__ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE8max_sizeEv__ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE4sizeEv__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE24__RAII_IncreaseAnnotator6__doneEv__ZN3mup10ValueCache15CreateFromCacheEv__ZNSt3__117__compressed_pairIPPN3mup5ValueENS_9allocatorIS3_EEE6secondEv__ZNKSt3__117__compressed_pairIPPN3mup5ValueENS_9allocatorIS3_EEE6secondEv__ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE7__allocEv__ZNKSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE7__allocEv__ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE4dataEv__ZN3mup10ValueCacheD2Ev__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEED2Ev__ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEED2Ev__ZNSt3__19allocatorIPN3mup5ValueEEC2Ev__ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEEC2Ev__ZNSt3__120__vector_base_commonILb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIPN3mup5ValueEEELi1ELb1EEC2Ev__ZNSt12length_errorD1Ev__ZN3mup10ValueCacheD1Ev__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEED1Ev__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception__Znwm__ZNSt3__1L19__libcpp_deallocateEPvm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE24__RAII_IncreaseAnnotatorC2ERKS6_m__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE24__RAII_IncreaseAnnotatorC1ERKS6_m__ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE8allocateERS5_m__ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE10deallocateERS5_PS4_m__ZNSt3__19allocatorIPN3mup5ValueEE10deallocateEPS3_m__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEEixEm__ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE14__annotate_newEm__ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE11__vallocateEm__ZN3mup10ValueCacheC2Ei__ZN3mup10ValueCacheC1Ei___cxa_begin_catch___clang_call_terminate__Unwind_Resume__ZNSt3__1L20__throw_length_errorEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZN3mup5ValueC1Ec__ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE7destroyIS4_EEvRS5_PT___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE9__destroyIS4_EEvNS_17integral_constantIbLb1EEERS5_PT___ZNSt3__122__compressed_pair_elemIPPN3mup5ValueELi0ELb0EEC2IDnvEEOT___ZNSt3__117__compressed_pairIPPN3mup5ValueENS_9allocatorIS3_EEEC2IDnLb1EEEOT___ZNSt3__117__compressed_pairIPPN3mup5ValueENS_9allocatorIS3_EEEC1IDnLb1EEEOT___ZNKSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE31__annotate_contiguous_containerEPKvS8_S8_S8___ZNSt3__1L16__to_raw_pointerIPN3mup5ValueEEEPT_S5___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE8max_sizeERKS5___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE10__max_sizeENS_17integral_constantIbLb1EEERKS5___ZNKSt3__16__lessImmEclERKmS3___ZNSt3__1L3minImEERKT_S3_S3___ZNSt3__19allocatorIPN3mup5ValueEE7destroyEPS3___ZNSt3__113__vector_baseIPN3mup5ValueENS_9allocatorIS3_EEE17__destruct_at_endEPS3___ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEE18__construct_at_endEmRKS3___ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEEC2EmRKS3___ZNSt3__16vectorIPN3mup5ValueENS_9allocatorIS3_EEEC1EmRKS3___ZNSt3__1L3minImNS_6__lessImmEEEERKT_S5_S5_T0___ZNSt3__19allocatorIPN3mup5ValueEE9constructIS3_JRKS3_EEEvPT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE9constructIS4_JRKS4_EEEvRS5_PT_DpOT0___ZNSt3__116allocator_traitsINS_9allocatorIPN3mup5ValueEEEE11__constructIS4_JRKS4_EEEvNS_17integral_constantIbLb1EEERS5_PT_DpOT0___ZN3mup10ValueCache14ReleaseToCacheEPNS_5ValueE__ZNSt3__1L7forwardIRKPN3mup5ValueEEEOT_RNS_16remove_referenceIS6_E4typeE__ZNSt3__1L7forwardIDnEEOT_RNS_16remove_referenceIS1_E4typeE__ZN3mup5Value11BindToCacheEPNS_10ValueCacheEGCC_except_table18GCC_except_table57GCC_except_table3GCC_except_table23GCC_except_table41GCC_except_table31GCC_except_table11___gxx_personality_v0GCC_except_table30 #1/20 1573634244 501 20 100644 62924 ` mpVariable.cpp.o x(__text__TEXTE(8__gcc_except_tab__TEXTEIP __const__DATAI(Le__cstring__TEXTLP__const__TEXTMQ__compact_unwind__LDN@QȚ__eh_frame__TEXTe i8 h2  )@H=? PYYUHH0H}HuHu HHu؉H=HMH9H}Hy@HH0]ÉHEMHEHH} f.UHHH}HuH}HuH]f.UHH0H}HuHu HHu؉H=HMH9HuHH}H0]ÉHEMHEHH} UHH}HuHuH;uHuHEH@@HMHA@]f.UHHH}HuH}HuH]f.UHH H}HuHuH}H}HHEHuHHEH ]UHH H}HuHuH~@4HuH=JH5JH JOHEHMHy@HHMHEHH ]UHH H}uH}H@4H}H=SJH5VJH }JWHEHH@uHHRXH ]@UHH H}EH}H@4H}H=IH5IH J^HEHH@EHHR`H ]UHH`H}H}H@4HuH}H=rIH5uIH IeHEHH@HUHHuHMHUHEHHIhHHuHEH}HEH`]ÉHE؉MH}H} UHH @H}$EH}H@4H}H=HH5HH HlHEHH@UH1HDHuDHMQpH ]f.UHH H}HuHuH~@4HuH="HH5%HH LHsHEHH@HuHHH ]f.DUHH H}HuHuH~@4HuH=GH5GH GzHEHH@HuHHRxH ]fUHH H}HuHuH~@4HuH=qGH55GH \GHEHH@HuHHH ]f.DUHH H}HuHuH~@4HuH=FH5FH FHEHH@HuHHH ]f.DUHH H}HuHuH~@4HuH=FH55FH \FHEHH@HuHHH ]f.DUHHH}uUH}H@uUHH]ÐUHHpH}HuHUHUHr@H}HEHHH}HHuHUHHEHEHp]ÉHEM܋Eܹ9H}HEH}HEH}HEHEHHHuHExHHuH}HH5HH}FHEMHEMH}H} HHU f.fUHHH}H}H]DPH$UHHH}H}H]DUHHH}H}H]DUHHH}H}H}H}H]UHH H}H}H@H}HEHH@HHE vEEH ]f.DUHH}H}HG@]f.@UHHPH}H}HG@HHH}HщEHEME9yH}HEH}HEH}HEHEHHHuHE8HEM EHP]H} HHU UHHPH}H}HG@HHH}HEHEME9{H}HEH}HEH}HEHEHHHuHE:HEM EHP]H} HHU f.UHHPH}H}HG@HHH}HEHEME9{H}HEH}HEH}HEHEHHHuHE:HEM EHP]H} HHU f.UHHPH}H}HG@HHH}HHEHEHP]ÉHEME9pH}HEH}HEH}HEHEHHHuHE/HEMH} HHU @UHHPH}H}HG@HHH}HHEHEHP]ÉHEME9pH}HEH}HEH}HEHEHHHuHE/HEMH} HHU @UHHPH}H}HG@HHH}HшEHEME9~H}HEH}HEH}HEHEHHHuHE=HEME$HP]H} HHU f.fUHHPH}H}HG@HHH}HHEHEHP]ÉHEME9pH}HEH}HEH}HEHEHHHuHE/HEMH} HHU @UHHPH}H}HG@HHH}HщEHEME9yH}HEH}HEH}HEHEHHHuHE8HEM EHP]H} HHU UHHPH}H}HG@HHH}HщEHEME9yH}HEH}HEH}HEHEHHHuHE8HEM EHP]H} HHU UHH H}EH}H@4H}H=a;H5;H +;HEHEHH@HHR`HEH ]f.fUHH`H}HuHuH~@4HuH=:H5:H :OHuHEHHEHEHp@H>HhH}HHuHMHEH}H`]ÉHEЉMH}H} @UHH0@H}$EH}H@4H}H=1:H59H 9VEHMHQ@H2$HDHuDHURpHEH0]f.UHH}HuHuH}H~@]fDUHH}$]f.DUHH0H}HuHHuHHH}HHEHuHHEH0]ÉHEMH}H} UH1H}]@UHHHHuHuHHHHHHHHHH5H4HHHH58HH5HHHHHH5HHHH5 8HxHtHxtHhHH57H`HHXH`HXHPH5x7HPHHHH5T7H@HHHHш??H@H0H56H0H(HH56H HHHHшȃʃ H HnHHcHHH-HHHHHH,HHHHHHHHHHHH55HHH5c5HHHHHHHHHH5 5HHHHHHH4H 4HEHHHH54HHHH54HHHHHHĀ]H r@UHH0H}uH}HHH}HHHHHMH9HHhHH@HAHHHH}HHHHHHUH HHhHH@HBHuHH0]ÉHEM#H HHEuHEHHHEHHH} fUHH H}HuH}HuHEH}HHuH}HuHH ]f.@UHH0H}HuHuH}HH@HHH}HHEHuHMHEHH0]fUHHH}H}JH}EHH]ÐUHHH}H}JH}EHH]ÐUHH H}HuH}HuH}HH}HEH}HuHH ]fUHH@H}EH}HuH]@UHHHHuHuHHEHEH]fDUHHH5H}H}H}HuHƀHH]UHHH}H}HHXH}HH}H]f.@UHHH}H}H]DUHHH}H}HH0H}HHEHHH}H]f.@UHH H}uUH}WUuH}U#UH} WWEH ]f.DUHH}uH}u#ww]UHH H}HuHuH}HHHG@HHIHHGHHFHHH}HHuHEHMHHHH ]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H}H}H]UHH}H}H]f.UHH}H}HH@H]@UHHH}H}H]DUHHHHH}H}HHH@H}HHEHH]f.UHHH}H}H}H}H]UHHHHuHUMDEHUHrXIH}LHEHuHUHUH9HEHH}HGXEH}HE}H}HHEHxX 1HM#HEHHXH@HHMHMH)HMHEHEMɉM-EE&EEs{HEE)HEHH}HEH}H)H}$HEHH}HEH}H)H}"HEHEH}HHEHEHEH}HEH;EH}HKH}yE+HEHHH}HE+HEHHH}HEFHEHMHHEHMHHxHEHMHIXH}HxHEVHEHMHHpHMHHhHpHhHHEHMAHDHuH}HEHĠ]fUHH0HHMHuUHuH}HHEHu1DEHuH>LMH}LHHEP HEH0]fDUHH@H}H}HGXHH}HHEHMH9HEHH}HGXHEH`HEHH}H;GX<HEHMHHEHMHHEHMHIXH}HuHHEHH}HEH}H9HEH8E EEH@]UHHpH}uH}HGXHH}HHEHMH9HEHH}HGXHEHH}HEH}H9(}}}̉PHEHMHHEHMHHEHHMHIXH}HuH}EHEH`3}HMHψEUpkHEHMHHEHMHHEHHMHIXH}HuH}HMHψEDEDDMDM EEHp]fDUHHH}uH}uH}u}HEHH}HEH}H)H}HEHH}HEH}H9HEH` E/H}HEH}HxHEHxH)HEHEHPXHHpHhHpHhH)HEHEH@1HHEH@HH`H`HHEH@HHXHEHEHXHPHPHHEHHHHPHHHuH}H}H@H@HEHMHAX+HEЉMH}H8EHEHHHEHEHXH}HHHuHFXN`BHEH@HHEHEHuH}H}HMHIXH0HH0HEMHE }EEH]@UHH}H}HG0]f.@UHHH}HuH}HuH]f.UHHH}H}HH]f.UHH}H}HG]f.@UHH}H}HG]f.@UHH}H}HG(]f.@UHH}HuHUHMHMHUHQHUHQHUHQ ]f.@UHH}HuHUHUHuHr0Hr(HuHr8]fDUHH}H}HG8]f.@UHH}uH}uHG0HcHHG0]f.@UHH 1H}HuHuHHuHUH}HH ]UHH}HE]fUHH H}H}H}H}HE H}HEHEH ]ÐUHHH}H}HH€H]f.DUHHH}H}H@H]ÐUHHH}H}HHH]fUHHH}H}H]DUHH}HE]fUHHH}H}H]DUHH}HE]fUHH}H}H]f.UHH}H}HG ]f.@UH@EE]UH]DUH}uu;u$]fDUHH}}}}EEEEH]@UH@@MEu}9$]f.fUH}}@]f.@UHH1H}HuH}HuH]f.UHH H}H}H}H}HEHMHEHH ]f.UHH H}H}H}H}HE H}HEHEH ]ÐUHH}HuHuH}H~0H~0]fUHH H}HuH}HuH ]f.UHH @H}EH}HO0H;O8H} }HMHHωRhE$EHMHQ0HHHq0}EEH ]f.UHHH}H}HHH]f.@UHHH}H}H@H]ÐUHHH}H}HcH]f.fUHH H}HuHuHUH} HEHEHEHEHEH ]UHH}HuHUHUHHuH;$]UHHH}H}HH}HHHH}HH]fUHH@H}HuHUHUHuH}HHH}HHuHHEHUHHEHHUHHHHEHHUH HH(H2HvH 2HH0HJH@]ÉHEMHEHUHHHH} DUHHH}uH}uH]f.DUHHHH}H}H]@UHH H}HuHUHUHuH>H:HvH:HH4:HBH2HvHHuHH ]f.UHH}HuHuH}HHHGH>HH>]DUHH H}HuHuHHEHuHHEHǀHu艆H ]DUHH H}uH}HH}HHHH}HH@HEH@Xup`H ]f.UHHH}H}H]DUHH H}H}H}H}H ]HHUUHHH}H}H]DUHH H}H}HEE}HEMHEEH ]ÐUHHH}H}HH}HHEHH]f.DUHH1H}H}H]f.fUHHH}H}H]DUHH}]fDUHHH}H}H]DUHH}HE]fUHHH}HuHUHuH}H}EEjHuH}HuH}HH@HHuEE% HEHEHEHEHEHEHMHUHHUH2HvHHHEHMHUH}DHuHUHMLEHpHpHEH}HEHHIHȾHZHEЉMHEЉMH}H}H}HHIHHhHEHĠ]H}HEЉMH} HH`f.fUHHH}H}H]DUHH}H}$]f.UHHDH}HuHUHMLEЈEH} HEHEHEHMH)HEH}HEHEH;EHEHMH)HMHEHEHMH)HEH}5H}HuHUH;EHEHEHERH}HuUHEHHEH}HEHxHHUHxHHpHpH;E3HEHEHEEHEMH}EH}EllhuHEHMH)HEH}5H}HuHUH;EHEHEHE!1H}HuHuH`HEHĠ]H}  UHHH}HuH}HuH]f.UHH}H}G]f.DUHHH}H}H}H}H} H}HEH]fUHH}H}H?$]fDUHHH}uH}uH]f.DUHH}H}HG]f.@UHH H}HuHUHUHuH}HH}HHUP`H ]fUHH H}HuEH}HuUH ]@UHH}HuHuH~H}H}H~HE]f.UHH H}HuEHuHHuHuH}UH ]@UHH0H}HuHuH}HH@HHuHEHEHMHH0]HHUf.DUHHH}H}H]DUHH}H}HG(]f.@UHH@@H}EHuH}H}H}HEuH}EH}EH@]ÉHEMH}H} @UHHH5H}H}H]f.@UHH@H}EH}EHQ8H]DUHHH}uH}w uH]f.fUHHHHuHuN`HEH}HutHEHHXHHMHMH9HEHH}HGXHEHH}HWXH@HEHUH}HuHUHMyHEH`DHEHH}HEH}H@HEH}HuHUHM"HEH@HH}HuHEHĀ]DUHH H}H}HEH ]ÐUHH H}HuHUHMH}HuHUHMH ]f.UHHH}HuH}HuH]f.UHHH}H}H]DUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHUHMHMHuHHMHuHUH}H0]f.UHH H}HuH}HuH ]f.UHHPH}HuHUHUH}HuHUHEHEH}HEHUH9 H}H}HuH}H}HE`H}HEH}H}HH}HHuHEHuH}HEHH}HHuH}HEH;E*H}HuHEHHEHEHHEH}EHuHP]f.@UHH0H}HuHuHHuHuH}HuH}HH0]f.UHH}HE]fUHH H}HuH}HEH ]f.UHH H}HuH}HuH ]f.UHHH}H}HHEHEHH]ÐUHH H}HuH}HuH@EMH ]f.@UHHH}H}HHH]fUHH H}H} HE7HEHHHHEH} HEHHEHEHEHEH ]f.UHH1H}HuH}HuH]fUHHH}H}H]DUHH H}HuH}HuHuHuHpH ]ÐUHH H}HuH}HuHHuHuH0H ]f.@UHH H}HuH}HuHuHuHpH ]ÐUHH}HuHuHu]fDUHH}HuHuH}H)H]@UHH H}H}H ]DUHHH}H}H]DUHH}H]f.DUHHH}H}H]DUHH}HE]fUHH}H}HHH]UHH H}HuHUH}HUHUHUH9 H=| HMHHH ]DUHH H}HHuH}HH5HH}HEMH}H} f.fUHHH}HuH}H]ÐUHHH}HuH}HuH]f.UHH H}HuHuHHEHuHHHHuHH ]ÐUHHH}H}H]DUHH}H}H]f.DUHH0H}HuHuH}H}HHEHuHH}H0]HHU == UJ+ 99_T+~~ 9=..UB9{8 %#) 4'3ZF,) 6'5\F.) 6'5\F.) :'9`F#) :'9`F#) 4'3ZF1) :'9`F#) 4'3ZF,) 4'3ZF,vv5 &&L=,HH  /UUY  UU `[  -1& )A 3$ " E ##_B:  G+9 Cp@@h@h@ppoperator=/Users/jgomez/muparserx/parser/mpVariable.cppm_pValoperator+=operator-=operator*=SetFloatSetStringSetBool [addr=0x; pos=; id=""; type="; val=(array); ; not vol]allocator::allocate(size_t n) 'n' exceeds maximum supported sizeN3mup11ParserErrorEN3mup8VariableENSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEENSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEEuAE#AE05p#9x`lp@AFqnqqq/0DAF( Q  ATF AFp AF` AF@ AG A0GA\GAGAGt0AGiAG0 @1AHAHBG`//G,@*p92B`Ai@`(C`(W"ZP# `$&A0H()#@)#p))))2**@*`*"*@**O0+1p++'+++, ,@,`,p, ,,L,$ -@-%p-V-O .@.#p.u." /@/$p/M/(/700AHH0! 1@1U1+1K 2U229A\H23OP313$33 34 4AlH 6@6`69AH8#88g`99!997:,@:&p:<:QAH;0;P;|AH;"<+0<$`<+==3=# >@>`>>C>#?2@@C@@#@#A/0A2pA'AeB'@B`B/B2B/C C@C`CCCCCC[PDdAHDD#E?PEpEEOAHzPLRx ,$uAC zRx $#AC , OAC $tp5AC $#AC $9AC $xAC $lAC $<HpAC ,?AC $ AC $qAC $nAC $ (qAC $4qAC $\؝qAC $0/AC ,8D AC $XAC $`AC $,XAC $TP(AC $|XQAC $AC ,+AC ,L8'AC ,|#AC ,AC ,hAC , AC ,<أAC ,lAC ,8 AC $|tAC ,@AC $ЦAC $8AC $$0AC ,(iKAC $|h AC ,P1AC ,$AC $pBAC $,GAC $T/AC $|ȭ/AC $ЭGAC $,AC $*AC $9AC $D 2AC $l8AC $0BAC $XAAC $AC $ xiAC $4 AC $\ AC $ (AC $ AC $ AC $ AC $$ CAC $L Ȯ(AC $t ЮWAC $ ZAC $ @ AC $ (AC ,d AC $D `AC $l X#AC $ `#AC $ hAC $ `AC $ XAC $4 P2AC $\ h*AC $ pAC $ h"AC $ p@AC $ AC $$ pOAC $L 1AC $t AC $ 'AC $ AC $ AC $AC $<AC $dpAC $hAC $`AC $H AC $0AC $,(LAC $TP$AC $|XAC $P%AC $XVAC $OAC $AC $D#AC $luAC $"AC $AC $$AC $ MAC $4@(AC $\H7AC ,`gAC $!AC $AC $UAC $,(+AC $T0KAC $|XUAC $AC ,93AC $AC $$OAC $L1AC $tй$AC $عAC $й AC $AC $AC ,AC $lhAC $`AC , X9AC $h#AC $pAC $<hgAC $dAC $!AC $AC $7AC $,AC $,Ƚ&AC $Tн<AC ,QAC $AC $AC ,L|oAC $,X"AC $T`+AC $|h$AC $p+AC $xAC $p3AC $#AC $DAC $lAC $AC $xCAC $#AC $ 2AC $4CAC $\AC $#AC $#AC $/AC $2AC $$'AC $LeAC $tP'AC $XAC $P/AC $X2AC $p/AC $<xAC $dpAC $hAC $`AC $XAC $PAC $,HAC $T0AC $|([AC ,`dAC $AC $#AC $$?AC $LAC $tAC ,OAC E-EG-Em-aE-:E(=3E-D-D2-D-D7-D9-D=D#=wD-dD4-AD-*D-%DD-C-qC-QC-BJ-BJ-}BJ-QB--B-A~-A}-AJ-SAJ-A|-Ah-@{-@y-y@z-m@y-\@K-(@-?-?x-?w-?v-?u-?t-?s-q?r-h?q-P?-:?p-%?o->n->->m-Q>l-1>k- >j-=i-=h-z=g-m=e-S=f->=e--=(- = -<f-<e-<!-<-<-J<-;-;=;-;-;-;c-x;b-o;-!;a-:-:_-:-:F-2:^-9]-19\-9-9-8[-8-l8Y-;8W-7-7-{7W-h7-Q7X- 7W-6V-16<-6-5-56-5-56-5-55-5-g5T-?5S-5-4R-4Q-s4P-N4O-@4-4N-3M-3;-w3L-k3K-3J-2I-2-2G-2F-2E-Y2D-E2=>2-2-1-1C-'1&=1B-0-0-0@-q0?-0'= 0>-/=-Q/5-1/5-/5-.-.-Y.<- .;--:--2--9--2-[--,-,-,-,8-+7-+6-+5-+5-A+5-+4- +3-*2-*;-Y)1-Q)0-))/-(-(--("-(-Y(,-=(-'(6-(-(5-'!-'+-'$-'-w'-['*-L')-0'-&!-&!-&-&-&#-s&-\& -O&-;&-1&-%-%-%-%"-%-% -x%-i%-Z%-7%-/%"-%-% -$-$-$-$ -$-$-I$-7$-/$-$(- $-#"-#-# -#(-#-s#-#'-"-"%-"$-"#-"!-d""-E" -2" -"-!-!-!-!-L!-!!-!- - -s -: - ---~1-u-I-=-=---1--x-R-/ ---H-?-/------{=\-2-----{----- -z=Z-'=-==-k-O->-----y-mZ--- -{ -----l-*-% ---- -y-a-\B-6#----=-}-#-1--2->3-4-&----z3-pib3---6-l8-^-A-/-"5---6-8-~-a-O-B5---6-8---u-h5---6-8----r5--- 6- 8- - - - 5-6 -( - 6- 8- - - - 5-M -? -! 6- 8- - - - 5-] -O -1 6- 8- - - - 5-y -k -O 6-< 8-. - - - 5- 1- ----5--n-`-M6-H7-#9-==-4----5-3-J3-@923-Z3-PIB3-N3-D=6----3-yr3- 3-C-*3- --)- -----o-f-F-*#-MMMxMLM MMMMpM"%&xph`XP@!80%(- .  +,/x0p!X)P*H!0 (  !h`X@80%( $xph`XPH@80( 80: xp:`@ `@ `@ `@ `@ ::`@ `@80: :`@ :`@     :  ` @       ` @       ` @       ` @       ` @   :`@ `@ `@ `@80: ::`XP:@ :::::xp:`XP:@80: :`@80: `@80: `XP:@ ::Mt8>?E>E=F/>F|>TFV>F>F=F=Gd?0G?\G>G>Gi>G=G"3`53@>H /F800#0>H !`@) -!b($)p)n ) ),)&@*,*[$`*""` ,@,p-w@-  .7-@.)p.=0H*u*%/* 0+p+++0++/,` .  /Q @/1p/V-/ 18@1:1?HH" 271d222 3=\H6P33-3334@6?78p8 8@`9!9>lH 9u 9&: @:w?H6:.)P;!0<&p: ;?Hm 0;4;)<>H0=-=h.=) >{->.E@>`>*>G*@@N/@ A0ApAjA@BB'`B$BB-4@K+@k2 C0@C'C-CCgPE^0`C C0Cu(PD D(DP?H(EpEB>H-/0\#2E10E 0*%<0031p31([A=@3Z95|11*%6%`3s3Q3`     SP p   B A @ @ `<t#,)`, % -"', p, (C( 6$,+?(!#&$`$P#B`.`6pC 42(C'87K6K6K2 J40J@<Lh;0L1M4N;pN; N:J{4I;HL:HJS@9`p%%85j1F<| @$O a N5Gd14+e#4 n5(&K&c)o,&,/A% $9u46 o 5>|!qc2 :99T:D2249TvotL%_%GV(?__ZNSt3__14fposI11__mbstate_tEC2Ex__ZNSt3__14fposI11__mbstate_tEC1Ex___cxa_rethrow___cxa_throw__ZSt9terminatev__ZdlPv__ZNSt3__18ios_base4initEPv__ZNSt3__19allocatorIcE8allocateEmPKv__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPKv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8capacityEv__ZNK3mup8Variable8GetArrayEv__ZNKSt3__14fposI11__mbstate_tEcvxEv__ZNK3mup8Variable10GetComplexEv__ZNSt3__18ios_base33__set_badbit_and_consider_rethrowEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5uflowEv__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9underflowEv__ZN3mup11ParserError10GetContextEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E5firstEv__ZNK3mup6IToken8GetIdentEv__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EE5__getEv__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNKSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EE5__getEv__ZNK3mup8Variable8GetFloatEv__ZNK3mup8Variable7GetRowsEv__ZNK3mup6IToken10GetExprPosEv__ZNK3mup8Variable7GetColsEv__ZNKSt3__18ios_base5flagsEv__ZNKSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5epptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4pptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5egptrEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE4gptrEv__ZNK3mup8Variable6GetPtrEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13get_allocatorEv__ZNKSt3__121__basic_string_commonILb1EE20__throw_length_errorEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE19__get_short_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13__get_pointerEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__get_long_pointerEv__ZNK3mup8Variable10GetIntegerEv__ZNK3mup8Variable9AsciiDumpEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__get_long_capEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__zeroEv__ZNK3mup8Variable7GetBoolEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE4fillEv__ZN3mup6IValue11AsICallbackEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5ebackEv__ZNKSt3__18ios_base5widthEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9__is_longEv__ZNK3mup8Variable9GetStringEv__ZNK3mup6IValue8ToStringEv__ZNK3mup8Variable7GetImagEv__ZNKSt3__18ios_base5rdbufEv__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5rdbufEv__ZNSt3__111char_traitsIcE3eofEv__ZNKSt3__19allocatorIcE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE8max_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__get_short_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__get_long_sizeEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4sizeEv__ZN3mup8Variable7AsValueEv__ZN3mup6IValue8AsIValueEv__ZN3mup6IToken7ReleaseEv__ZNKSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbaseEv__ZNK3mup8Variable7GetTypeEv__ZNK3mup8Variable5CloneEv__ZNK3mup8Variable10IsVariableEv__ZNK3mup6IToken7GetCodeEv__ZN3mup6IToken13AsIPrecedenceEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_E6secondEv__ZNKSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEE6failedEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE9showmanycEv__ZNKSt3__18ios_base6getlocEv__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7__allocEv__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4syncEv__ZNKSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentrycvbEv__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4dataEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2ILb1EvEEv__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1ILb1EvEEv__ZN3mup12ErrorContextD2Ev__ZN3mup11ParserErrorD2Ev__ZN3mup6IValueD2Ev__ZN3mup8VariableD2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEED2Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEED2Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED2Ev__ZNSt3__18ios_baseC2Ev__ZNSt3__19allocatorIcEC2Ev__ZNSt3__19basic_iosIcNS_11char_traitsIcEEEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEEC2Ev__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEEC2Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ev__ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2Ev__ZNSt3__122__compressed_pair_elemINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repELi0ELb0EEC2Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryD1Ev__ZN3mup12ErrorContextD1Ev__ZNSt12length_errorD1Ev__ZN3mup11ParserErrorD1Ev__ZN3mup8VariableD1Ev__ZNSt3__16localeD1Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED1Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED1Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED1Ev__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ev__ZN3mup8VariableD0Ev__ZThn16_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEED0Ev__ZTv0_n24_NSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEED0Ev__ZThn16_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZTv0_n24_NSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEED0Ev_memset__ZTVSt12length_error__ZTISt12length_error___assert_rtn___cxa_allocate_exception___cxa_free_exception_strlen__Znwm__ZNSt3__1L17__libcpp_allocateEmm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE10__align_itILm16EEEmm__ZNSt3__124__put_character_sequenceIcNS_11char_traitsIcEEEERNS_13basic_ostreamIT_T0_EES7_PKS4_m__ZNSt3__116allocator_traitsINS_9allocatorIcEEE8allocateERS2_m__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE14__set_long_capEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE16__set_short_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE15__set_long_sizeEm__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE11__recommendEm__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsgetnEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6setbufEPcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE6xsputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputnEPKcl__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE7__pbumpEl__ZNSt3__18ios_base5widthEl__ZNSt3__18ios_base4setfEjj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekoffExNS_8ios_base7seekdirEj__ZNSt3__18ios_base5clearEj__ZNSt3__18ios_base6unsetfEj__ZNSt3__18ios_base8setstateEj__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE8setstateEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE7seekposENS_4fposI11__mbstate_tEEj__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Ej__ZNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Ej__ZN3mup8Variable2AtEii__ZNSt3__111char_traitsIcE11eq_int_typeEii__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE8overflowEi__ZNK3mup6IToken9IsFlagSetEi__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEi__ZN3mup6IToken8AddFlagsEi__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5pbumpEi__ZNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE9pbackfailEi__ZNSt3__111char_traitsIcE7not_eofEi__ZNSt3__111char_traitsIcE12to_char_typeEi__ZN3mup8VariableaSEi___cxa_begin_catch___cxa_end_catch___clang_call_terminate__Unwind_Resume__ZN3mup8Variable8SetFloatEd__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEd__ZN3mup8VariableaSEd__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6resizeEmc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2Emc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1Emc__ZNSt3__111char_traitsIcE2eqEcc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_c__ZNSt3__114pointer_traitsIPcE10pointer_toERc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE18__set_long_pointerEPc__ZNSt3__111char_traitsIcE6assignERcRKc__ZNSt3__1lsINS_11char_traitsIcEEEERNS_13basic_ostreamIcT_EES6_PKc__ZNSt3__1L20__throw_length_errorEPKc__ZNSt3__111char_traitsIcE6lengthEPKc__ZNSt12length_errorC2EPKc__ZNSt11logic_errorC2EPKc__ZNSt12length_errorC1EPKc__ZNKSt3__15ctypeIcE5widenEc__ZNKSt3__19basic_iosIcNS_11char_traitsIcEEE5widenEc__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE9push_backEc__ZNSt3__111char_traitsIcE11to_int_typeEc__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5sputcEc__ZN3mup8Variable7SetBoolEb__ZN3mup8VariableaSEb__ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC2IRKS5_EENS_12__second_tagEOT___ZNSt3__117__compressed_pairINS_12basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE5__repES5_EC1IRKS5_EENS_12__second_tagEOT___ZNSt3__122__compressed_pair_elemINS_9allocatorIcEELi1ELb1EEC2IRKS2_vEEOT___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE6__initIPcEENS_9enable_ifIXsr21__is_forward_iteratorIT_EE5valueEvE4typeES9_S9___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEaSERKS5___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS5___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setpEPcS4___ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE4setgEPcS4_S4___ZNSt3__1L3maxIPcEERKT_S4_S4___ZNKSt3__16__lessIPcS1_EclERKS1_S4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1IPcEET_S8_RKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC2ERKS4___ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1ERKS4___ZNSt3__116__pad_and_outputIcNS_11char_traitsIcEEEENS_19ostreambuf_iteratorIT_T0_EES6_PKS4_S8_S8_RNS_8ios_baseES4___ZNSt3__1L16__to_raw_pointerIKcEEPT_S3___ZNSt3__1L8distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3___ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEE6sentryC1ERS3___ZN3mup8Variable2AtERKNS_6IValueES3___ZNSt3__1L9addressofIKcEEPT_RS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE8max_sizeERKS2___ZNSt3__116allocator_traitsINS_9allocatorIcEEE10__max_sizeENS_17integral_constantIbLb1EEERKS2___ZNSt3__1L9addressofIcEEPT_RS1___ZNSt3__114pointer_traitsIPKcE10pointer_toERS1___ZNSt3__1L3maxIPcNS_6__lessIS1_S1_EEEERKT_S6_S6_T0___ZN3mup8Variable6AssignERKS0___ZN3mup6IValueaSERKS0___ZN3mup8VariableaSERKS0___ZN3mup8VariableC2ERKS0___ZN3mup11ParserErrorC1ERKS0___ZN3mup8VariableC1ERKS0___ZTSN3mup11ParserErrorE__ZTIN3mup11ParserErrorE__ZTVN10__cxxabiv120__si_class_type_infoE__ZTVN10__cxxabiv117__class_type_infoE__ZNSt3__1L10__distanceIPcEENS_15iterator_traitsIT_E15difference_typeES3_S3_NS_26random_access_iterator_tagE__ZTIN3mup6IValueE__ZN3mup8Variable4BindEPNS_6IValueE__ZN3mup8VariableC2EPNS_6IValueE__ZN3mup8VariableC1EPNS_6IValueE__ZN3mup8VariablepLERKNS_6IValueE__ZN3mup8VariablemLERKNS_6IValueE__ZN3mup8VariablemIERKNS_6IValueE__ZN3mup8VariableaSERKNS_5ValueE__ZNSt3__1L3hexERNS_8ios_baseE__ZNSt3__1L3decERNS_8ios_baseE__ZTVNSt3__18ios_baseE__ZNSt3__1L7forwardIRKNS_9allocatorIcEEEEOT_RNS_16remove_referenceIS5_E4typeE__ZTVN3mup8VariableE__ZTSN3mup8VariableE__ZTIN3mup8VariableE__ZNSt3__1L9use_facetINS_5ctypeIcEEEERKT_RKNS_6localeE__ZNSt3__115basic_streambufIcNS_11char_traitsIcEEE5imbueERKNS_6localeE__ZN3mup10g_sCmdCodeE__ZN3mup6IValueC2ENS_8ECmdCodeE__ZNKSt3__16locale9use_facetERNS0_2idE__ZNSt3__15ctypeIcE2idE__ZNSt3__113basic_ostreamIcNS_11char_traitsIcEEElsEPFRNS_8ios_baseES5_E__ZN3mup8VariableaSERKNSt3__17complexIdEE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_14basic_iostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE16_NS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC2ERNS_13basic_ostreamIcS2_EE__ZNSt3__119ostreambuf_iteratorIcNS_11char_traitsIcEEEC1ERNS_13basic_ostreamIcS2_EE__ZTCNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE0_NS_13basic_istreamIcS2_EE__ZNSt3__19basic_iosIcNS_11char_traitsIcEEE4initEPNS_15basic_streambufIcS2_EE__ZNSt3__114basic_iostreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__113basic_istreamIcNS_11char_traitsIcEEEC2EPNS_15basic_streambufIcS2_EE__ZNSt3__1lsIcNS_11char_traitsIcEENS_9allocatorIcEEEERNS_13basic_ostreamIT_T0_EES9_RKNS_12basic_stringIS6_S7_T1_EE__ZN3mup8VariableaSERKNS_6MatrixINS_5ValueEEE__ZTVNSt3__19basic_iosIcNS_11char_traitsIcEEEE__ZTINSt3__114basic_iostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_ostreamIcNS_11char_traitsIcEEEE__ZTINSt3__113basic_istreamIcNS_11char_traitsIcEEEE__ZTINSt3__115basic_streambufIcNS_11char_traitsIcEEEE__ZTVNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTTNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__118basic_stringstreamIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTVNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTSNSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZTINSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEEE__ZN3mup8Variable9SetStringERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup6IToken7CompileERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE__ZN3mup8VariableaSENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEGCC_except_table9GCC_except_table69GCC_except_table39GCC_except_table29GCC_except_table28GCC_except_table118GCC_except_table27GCC_except_table127GCC_except_table17GCC_except_table186GCC_except_table26GCC_except_table35GCC_except_table25GCC_except_table144GCC_except_table33GCC_except_table2GCC_except_table42GCC_except_table32GCC_except_table41GCC_except_table141GCC_except_table31___gxx_personality_v0GCC_except_table0GCC_except_table180GCC_except_table30GCC_except_table130GCC_except_table110qiskit-aer-0.4.1/src/third-party/macos/lib/libomp.dylib000066400000000000000000015400341362723322000230110ustar00rootroot00000000000000 (__TEXT__text__TEXTpp__stubs__TEXTTT__stub_helper__TEXTll__const__TEXT __cstring__TEXTSf__unwind_info__TEXT@u @u__DATAP __got__DATA8Y__nl_symbol_ptr__DATA88`__la_symbol_ptr__DATAHHb__mod_init_func__DATA __mod_term_func__DATA __const__DATA  __data__DATA@0@@__bss__DATA__common__DATAWH__LINKEDIT@ 0@rpath/libomp.dylib"0((`g I0 PEE<]|M}E6rqpdZ$ * 8/usr/lib/libSystem.B.dylib&0Ah)HUHAWAVATSAIIH1t-HoHt"H H9tHLLD[A\A^A_][A\A^A_]UHAVSIH1$-H^oHtH H9t HL[A^][A^]UHSPH1,H(oHtH H9t HH[]H[]UHSPH1,HnHtH H9t HH[]H[]UHSPH1h,HnHtH H9t HH[]H[]UHSPH1),HnHtH H9t HH[]H[]UHSPH1+HLnHtH H9t HH[]H[]UHSP1+HnHtH H9t H[]H[]UH1s+HmHtH H9t]]UHAWAVATSIIA14+HmHt!H H9tDLL[A\A^A_][A\A^A_]UHAWAVATSIIA1*H^mHt!H H9tDLL[A\A^A_][A\A^A_]UHSPH1*HmHtH H9t HH[]H[]UHSPH1R*HlHtH H9t HH[]H[]UHSPH1*HlHtH H9t HH[]H[]UHSPH1)HvlHtH H9t HH[]H[]UHAWAVSPIIH1)H5lHt!H H9tHLLH[A^A_]H[A^A_]UHAVSIH1:)HkHtH H9t HL[A^][A^]UHAWAVSPIIH1(HkHt!H H9tHLLH[A^A_]H[A^A_]UHAVSIH1(HckHtH H9t HL[A^][A^]UHSPH1c(H-kHtH H9t HH[]H[]UHSPH1$(HjHtH H9t HH[]H[]UHAVSIH1'HjHtH H9t HL[A^][A^]UHSPH1'HjHtH H9t HH[]H[]UHAVSIH1`'HJjHtH H9t HL[A^][A^]UHAVSIH1'HjHtH H9t HL[A^][A^]UHAVSIH1&HiHtH H9t HL[A^][A^]UHSPH1&HiHtH H9t HH[]H[]UHSPH1_&HiiHtH H9t HH[]H[]UHAVSIH1&H.iHtH H9t HL[A^][A^]UHSPH1%HhHtH H9t HH[]H[]UHAVSIH1%HhHtH H9t HL[A^][A^]UHSPH1]%HhHtH H9t HH[]H[]UHAVSIH1%HLhHtH H9t HL[A^][A^]UH1$HhHtH H9t]]UH1$HgHtH H9t]]UHSPH1$HgHtH H9t HH[]H[]UHSPH1C$HgHtH H9t HH[]H[]UHSPH1$H^gHtH H9t HH[]H[]UHSP1#H(gHtH H9t H[]H[]UH1#HfHtH H9t]]UHAVSIH1W#HfHtH H9t HL[A^]1[A^]UHAWAVSPAIH1 #HfHt!H H9tHLDH[A^A_]H[A^A_]UHAWAVATSAIIH1"H4fHt"H H9tHLLD[A\A^A_][A\A^A_]UHAVSIH1b"HeHtH H9t HL[A^][A^]UHAVSIH1 "HeHtH H9t HL[A^][A^]UHAWAVATSAIIH1!HneHt"H H9tHLLD[A\A^A_][A\A^A_]UHAWAVAUATSPEIIIH1t!HeHt+H H9tHLLLEH[A\A]A^A_]H[A\A]A^A_]UH1!HdHtH H9t]]UH1 HdHtH H9t]]UH1 H~dHtH H9t]]UH1 HYdHtH H9t]]UHSP1f H0dHtH H9t H[]H[]UHSP1) HcHtH H9t H[]H[]UHSHH1HcHt.H H9t"HMHQHT$HHIHL$H$HH[]UHSHH1HqcHt.H H9t"HMHQHT$HHIHL$H$HH[]UH1>H(cHtH H9t]1]UHAVSH0IH1HbHtOH H9tCHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLH0[A^]UHSHH1HbHt.H H9t"HMHQHT$HHIHL$H$HH[]UHAVSIH1,H.bHtH H9t HL[A^][A^]UHAVSIH1HaHtH H9t HL[A^][A^]UHAWAVATSIIIH1HaHt"H H9tHLLL[A\A^A_][A\A^A_]UHAVSH0IH1JHdaHtOH H9tCHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLH0[A^]UHAVSH0IH1H`HtOH H9tCHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLH0[A^]UHAVSH0IH1HHr`HtOH H9tCHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLH0[A^]UHSPH1H`HtH H9t HH[]H[]UHAVSIH1H_HtH H9t HL[A^][A^]UHAWAVSPIIH1DH_Ht!H H9tHLLH[A^A_]H[A^A_]UHAWAVSHAIH1H4_Ht4H H9t(HMHQHT$HHIHL$H$HLDH[A^A_]UHAWAVAUATSHMIAIH1sH^Ht:H H9t.HMHQHT$HHIHL$H$HLDLMH[A\A]A^A_]UHAWAVATSH IIIH1HQ^Ht7H H9t+HMHQHT$HHIHL$H$HLLLH [A\A^A_]UHAVSH AH1H]Ht1H H9t%HMHQHT$HHIHL$H$HDH [A^]UHAVSH0AH1'H]HtOH H9tCHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HDH0[A^]UHAVSAH1H]HtH H9t HD[A^]1[A^]UHSP1kH\HtH H9t H[]1H[]UHSP1,H\HtH H9t H[]1H[]UHAWAVATSAIIH1Hh\Ht"H H9tHLLD[A\A^A_][A\A^A_]UHAWAVAUATSPDMEIAHI1zH \Ht/H H9t#LHDLEDMH[A\A]A^A_]1H[A\A]A^A_]UHSPH1H[HtH H9t HH[]H[]UHSPH1H|[HtH H9t HH[]H[]UHSPH1HE[HtH H9t HH[]H[]UHSPH1\H[HtH H9t HH[]H[]UHAVSIH1HZHtH H9t HL[A^][A^]UHAVSIH1HZHtH H9t HL[A^][A^]UHAVSIH1H_ZHtH H9t HL[A^][A^]UH1\H.ZHtH H9t]1]UHSP1)HZHtH H9t H[]1H[]UHAVSA1HYHtH H9t D[A^]1[A^]UHAVSA1HYHtH H9t D[A^]1[A^]UHSPH1eHWYHtH H9t HH[]1H[]UHSPH1$HYHtH H9t HH[]H[]UHSPH1HXHtH H9t HH[]H[]UHAVSIH1HXHtH H9t HL[A^]1[A^]UHSPH1bHtXHtH H9t HH[]H[]UHSPH1#H=XHtH H9t HH[]H[]UHAVSIH1HXHtH H9t HL[A^][A^]UHSPH1HWHtH H9t HH[]1H[]UHAVSI1^HWHtH H9t L[A^]1[A^]UHSP1 HZWHtH H9t H[]1H[]UHAVSI1HWHtH H9t L[A^]1[A^]UHSP1HVHtH H9t H[]1H[]UH1dHVHtH H9t]1]UHSPH10HVHtH H9t HH[]H[]UHSPH1HSVHtH H9t HH[]H[]UHSPH1HVHtH H9t HH[]H[]UHAVSIH1oHUHtH H9t HL[A^]1[A^]UH14HUHtH H9t]]UHAWAVSHIIH1HwUHt4H H9t(HMHQHT$HHIHL$H$HLLH[A^A_]UHAWAVSHIIH1HUHt4H H9t(HMHQHT$HHIHL$H$HLLH[A^A_]UHAWAVATSH0IIIH1HTHtUH H9tIHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLLLH0[A\A^A_]UHAWAVATSH0IIIH1HTHtUH H9tIHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLLLH0[A\A^A_]UHAWAVSPIIH1 HSHt!H H9tHLLH[A^A_]H[A^A_]UHAVSH0IH1 HISHtOH H9tCHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLH0[A^]UHAWAVATSH0IIIH1 HRHtUH H9tIHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLLLH0[A\A^A_]UHSHH1 HHRHt.H H9t"HMHQHT$HHIHL$H$HH[]UHAWAVSHIIH1+ HQHt4H H9t(HMHQHT$HHIHL$H$HLLH[A^A_]UHAWAVAUATSHEIIIH1 H~QHt:H H9t.HMHQHT$HHIHL$H$HLLLEH[A\A]A^A_]UHAWAVAUATSPLMMAIՉI13 HQHt.H H9t"LLDMLMH[A\A]A^A_]H[A\A]A^A_]UHAWAVAUATSPMIIAH1 HPHt+H H9tHDLLMH[A\A]A^A_]H[A\A]A^A_]UHAWAVATSH AIIH1T H6PHt7H H9t+HMHQHT$HHIHL$H$HLLDH [A\A^A_]UHAWAVATSH0AIIH1 HOHtUH H9tIHM(HUHqHt$(H1HIHL$ Ht$HJHL$H HRHT$H $HLLDH0[A\A^A_]UHAVSAH1V HHOHtH H9t HD[A^]1[A^]UHAWAVSPAIH1 HOHt!H H9tHLDH[A^A_]1H[A^A_]UHSPH1HNHtH H9t HH[]H[]UH1HNHtH H9t]1]UHAWAVAUATSPDMMAIՉI18HJNHt.H H9t"LLDMDMH[A\A]A^A_]1H[A\A]A^A_]UHAWAVATSH IHCHHEH=fcuHcHxvMH=IcH=cHH}tH5b1 H}ȾtH5P1 H=bHutH5?1 H}tH5.1q HbH=vbtH=}bJHbHt3HH{HtLHC(HuHb1ۿ0IME1E'L]IGMgEgHMg(Mg tSL{(T1/HILHnH +H9^H BH H;MuGLH [A\A^A_]L=bLH=aiHAHH;EuHH [A\A^A_]6UHAWAVSHIHAHHEH=.auHaHxpMH=aHaHH}tH5*1 H}оtH51 H=`HustH51] H}atH519 HM`jH=>`tH=E`H`Ht2HH;HtL_HC HuH`1ۿ(JIMt~L0I1IGAGHIG IGtQL{ R1HJHtH 3H9dH ?H H;MuCLH[A^A_]L=_LH=f_9H?HH;EuHH[A^A_]H=_uH_Hxt _UH1RH|IH]tH H9tH=^uHG_Hxt N_UH1H6IH]tH H9tUHAWAVATSIIH=l^uH^HxtfH=m^:H^HtHL9ct6HC(Hu1ۿ0萾IMMgMtNLiFMtjLZb1IHHHtH MH9rL[A\A^A_]1I1IGHIG(IG IGtL{(L=^1HH=][A\A^A_]mUHAWAVSPvIH=c]uH]HxH=`]-H]HtHL9{t_HC(Hu1ۿ0能IMM~H=]I1IFAFHIF$IFAF,tGLs(HC?1H[GH[H &H9KH[A^A_]L5]H=\H[A^A_]aUH1]UH]UH]H=L\tsUHH=W\$H=2\tLH=uB)HzH=k\H5QHt H=[1H[HDH=[]ǼUHH;\H8t"1HTHDHH\H|(HI(u]UHAWAVAUATSHAHH;HHEH=q[H=k[H_[HH6tH51HtH5l1H=[HĻtH5X1H读tH5D1HZ踻H=ZtH=Z`H=nZH=ȁ]HHH ZHAHuH=OHHH=NIMA$ҸH.1HL5,LL1H1B:7t HHuHtHuLHc8E1t"H1B:7tHHuAŊTHuHcL$1B:7t HHuLdHA$uMt{H諺ADMIcIƄH<H4LQtHHuHH R< D HA$HH -<LH1HPH1FHC HHƒ tu11L5<LJ<3HuHH u1B\3Muu cMH=IE.IL5jXMtAH5LHtQH=JXH5HAH=WD0ηH1LH H5L豷HDIHWH0HEE!1Dt tQH=WuH WHLHHWHLH9u1HDHHWH1L HLHDHHtWHt(H(HuAuTHAHAH?Hl=H?Hv=H?Hp=H?Hj=H?Hd=HV1H}H}H=VeH V1H9t(H(HQHH;QtDyu H9HI(uH 6H H;MuH[A\A]A^A_]UHHt&)`)p)U)])e)m)u)}H0LH(L@ HHHPHpH (6H HMHEHEHEE0EHUHtHuH5HH;Eu H]QUHHUH=U]UHAWAVATSHHtRH|IMtBL螶IL5UH |L)HI9sILLLyL=U!E1HE11HLL[A\A^A_]UHAVSIIHuHtVH08 Hþ8HA1H HL HL(H0H=uI1IH UH HH4HH4HH [A^]UHAVSIIH0HtRHHtFHtAH(HH9Ou0HO HW(HJ HO HQ(HHIHtH{Idž[A^]UHSPHHuH=kH5vD胕H{H[]鞳UHAVSIHH賻HHHHǀH 3HH 3HL [A^]UHSPHZH^HHHH H[]UHAVSw"H"L0&HIH[A^]UHSPHHHHHH[]UHAWAVSPIIHHHHH}LE111HvHI<I\ H9t%HHCH9tH;B}HHLH[ H9uHHBI9LLHHuIAI INIIH[A^A_]UHAVSIIHtH~Lt> I~HHINHMIN1HLHF HN(HA HF HH(L% Ao$fHn˸fHnflfA$\HN HV(HJ HN HQ(Ao$fHnȹfHnflfA$HHHNHMH 1HLLv LH[A\A]A^A_]HHIMtLHEIFWAFIAo$fHn˸fHnflfA$I$I(E1UHAVSHHCHtH16Lt3H H HHIFHtHH) 1%IVHL9IOHL|LLH[A\A^A_]UHAVSHHHtRtNH(L0,HM4LHsHuH=H5y襊HsL[A^][A^]UH]QUHH]}UH]UHAVSHIHtLwLH[A^]=[A^]UHHIH0]UHAWAVAUATSHHHIM| LhIMuZLme1L_HHHHL$(HH@HD$ HL$IEHD$IEIMHL$H$1JD# HH!HL6LcL{H[LsHHH[A\A]A^A_]UH ]3UHAVSHHH} 14Fs  s ?w`@H@HH HtHHH[A^]HHt'H1HH>t1HHH>uLcIv HHjHHHAHYLqUHAVSHIHuH=DH5O\HCH=H=t.H=$H=tH=  1H{L9H4@IHHtaLBI9HuHzHHHs HH{HdHHHuIHItIHHHuHHHCH@IH I[A^]LzHsL[A^]?UH1H`HXHPHHH@H8H0H(H HHH]UHAVSL11H@HI IT tH:HHR H9uHHuHt HAIIHHu[A^]UHLN1L HDPM9 AONȉ)ȃHcH@HH HN HL(HN(Ht(HF(Hp ]UH ]UH ]UHfn f~Xf~ u]UHfn f~\f~ u]UHH ]UHHH ]UH~ fH~XfH~H u]UH~ fH~\fH~H u]UH@@2u]UH@ @2u]UHH>‰u]UHlj@:u]UH@2lj@:u]UH@@2u]UH@2u]UH@2u]UH@2u]UH@(@2u]UH@0@2u]UHf2u]UH!f2u]UHH>‰fu]UHH>1҉f‰fu]UHf2u]UH f2u]UHf2u]UHf2u]UHf2u]UH)f2u]UH1f2u]UH!2u]UHH>‰u]UHH>1҉‰u]UH2u]UH 2u]UH2u]UH2u]UH2u]UH12u]UHHHH!H2u]UHHH>HHHHHHu]UHHH>1HHHHHu]UHHHHH2u]UHHHH H2u]UHHHHH2u]UHHHHH2u]UHHHHH2u]UHHHH1H2u]UHfn f~^f~ u]UHfn f~Yf~ u]UH~ fH~^fH~H u]UH~ fH~YfH~H u]UH@Ƅ @@@ @:u]UH@@@2u]UHf@ff@f@@ @f2u]UH1f @f2u]UH@ƅ @@@ @2u]UH1 @2u]UHHH@HH@HH@@ @H2u]UHH1HH @H2u]Ê8}UH  tEE8|]Ê8~UH  tEE8]f9} UH f tfEEf9|]f9~ UH f tfEEf9]Ë9}UH  tEE9|]Ë9~UH  tEE9]HH9} UH H tHHEHEH9|]HH9~ UH H tHHEHEH9]fn .v3UHf~MEfn.vf~ tEEfn.w]fn .v3UHf~MEfn.vf~ tEEfn.w] f.v=UHMHEfHnf.v$fH~H tHHEHEfHnf.w] f.v=UHMHEfHnf.v$fH~H tHHEHEfHnf.w]UH@0@2u]UH1f2u]UH12u]UHHHH1H2u]UH@0@2u]UH1f2u]UH12u]UHHHHH1H2u]UHAWAVSHI։m=;}uu+L=1vL=(xL芤A.mA>LH[A^A_]YUHAWAVSHI։m=:}uuŤL=uL=wL$A.mA>LH[A^A_]UHAWAVSHI։m=M:}uu_L=euL=\wL辣A.mA>LH[A^A_]鍥UHAWAVSHI։m=9}uuL=tL=vLXA.mA>LH[A^A_]'UHAWAVSH8HA=9uW)EAu蓣AL=tLD(U XXC CLDH8[A^A_]鴤HEH@HMHIHHXPX QH/HHMHMXUXMUHHMH H uH8[A^A_]UHAWAVSH8HA=8u[)EAu裢AL=sLD (] S\\ SLDH8[A^A_]HEH@HMHIHHP\ \QH/HHMHMU\M\UHHMH H uH8[A^A_]UHAVSH@(HA=7)uAu誡AH=rD(U;K(Y(Y(Y(Y\X.{ .cH=TrDH@[A^]鞢HEH@HMHIHHH(Y(Y(Y(Y\X.{ .E}H|H HEHUM(Y(Y(Y(Y\X.{.zE}HHM%(()u)]t(](uHEH H vH@[A^](C(()u)]'(](uHEHM!UHAWAVSHH(HA=5)UuXAuӟAL=pLD9(UK蝔KLDHH[A^A_]LuMvL}MHIAAN)]MAAOIFHIOLH[A^A_]UHAWAVSHI։m=t*}uu膔L=eL=gLA.mA>LH[A^A_]鴕UHAWAVSHHA=*)EuAu AL=%eL=fLD}(U \\CCLDH[A^A_]8UHAWAVSHHA=))EuAu褓AL=dL=`fLD(E[eKLDH[A^A_]鷔UHAWAVSH(I։=))E)Muu!L='dL=fL耒fAf(MfMf\fALH([A^A_]BUHAWAVSHHA=(MEuAu訒AL=cL=$fLD[EMaKLDH[A^A_]齓UHAWAVATSHALe=(uAu+AL=0cL=eLD舑A,$Al$+k;{LD[A\A^A_]HUHAWAVATSH@HALe='uAu貑AL=bL=neLDA,$Al$+k|$0|$ |$<$m;{LDH@[A\A^A_]鿒UHW*Y, u]UHW*^, u]UHW*Y,f u]UHW*^,f u]UHW*Y, u]UHW*^, u]UHHWH*YH,H u]UHHWH*^H,H u]UHfn WZXZf~f~ u]UHfn WZ\Zf~f~ u]UHfn WZYZf~f~ u]UHfn WZ^Zf~f~ u]UHHEH@HMHIH2H0ZPXZXZZQH=HHMHWZUXWZ]XZ]ZUHHMH H u]UHHEH@HMHIH2H0ZP\Z\ZZQH=HHMHWZU\WZ]\Z]ZUHHMH H u]UHSHhf(f(HHEH@HMHIHHfHnZf(ff(fYf(ff(fYf(\f(Xf.{ f.ZEWZEHH HEHZUf(fYf(fYf(\f(Xf.{f.zZEWZEHHMFf(f(f(f(f)ef)mf)uf)}ff(}f(uf(mf(eHEH H LHh[]f(f(f(f(f)ef)mf)uf)} f(}f(uf(mf(eHEHMUHAWAVSH8f(f(HLuMvL}MHIWAZWAZNU]脁ZAWZAGIFHIOKHHMHWZEWZMU]6ZEWZEHEHHMH H uH8[A^A_]UH]UHH]UHEEfn]UHHHEHEHfHn]UHEE]UHfEEf]UHAWAVSHI։=d!uuyL=\L=v^L؊A.}L趌mH[A^A_]UHAWAVSHI։=!uuL= \L=]LyA)ELT(EH[A^A_]UHAWAVSHI։= uu跊L=[L=4^LA)EL(E(H[A^A_]UHAWAVSHI։=: uuOL=U[L= ^L讉A.}An}L腋mmH[A^A_]UH ]UHf ]UH ]UHH ]UHf~]UHfH~H]UHAWAVSHI։m=}uu褉L=ZL=\LmA>LH[A^A_]׊UHAWAVSHI։=4)EuuEL=KZL=\L褈(MAAFLH[A^A_]kUHAWAVSHI։=MEuuӈL=YL=P\L2EAEAFLH[A^A_]UHAWAVATSI։Le=RuugL=mYL=$\LƇA,$Al$A>A~L[A\A^A_]鐉UHEADȍ]UHEAD)]UHHH21EHEH]UHHHH1EHEH)]UHEEfnfoXf~2utfofo]UHEEfnfo\f~2utfofo]UHHHEHEfHnfoXfH~H2uڅtfofo]UHHHEHEfHnfo\fH~H2uڅtfofo]UHE@u@ω@:uEt@]UHE@u@ ω@:uEt@]UHHE}‰uEt@@]UHEDMAƉ@2uEtAA]UHE@ulj@:uEt@]UHE@u@ω@:uEt@]UHEu@:uEt@@]UHEu@:uEt@@]UHEu@:uEt@@]UHE@u@(ω@:uEt@]UHE@u@0ω@:uEt@]UHfEuωf:uEfE]UHfEu!ωf:uEfE]UHHfE}‰fuEfE]UHHfE}1҉f‰fuEfE]UHfEuf:uEfE]UHfEu ωf:uEfE]UHfEuf:uEfE]UHfEuf:uEfE]UHfEuf:uEfE]UHfEu)ωf:uEfE]UHfEu1ωf:uEfE]UHEu!ω:uEE]UHHEu‰uEE]UHHEu1҉‰uEE]UHEu:uEE]UHEu ω:uEE]UHEu:uEE]UHEu:uEE]UHEu:uEE]UHEu1ω:uEE]UHHHEHuHH!HH:uEHEH]UHHHHEHuHHHHHHuEHEH]UHHHHEH}1HHHHHuEHEH]UHHHEHuHHHH:uEHEH]UHHHEHuHH HH:uEHEH]UHHHEHuHHHH:uEHEH]UHHHEHuHHHH:uEHEH]UHHHEHuHHHH:uEHEH]UHHHEHuHH1HH:uEHEH]UHEEfnfo^f~2utfofo]UHEEfnfoYf~2utfofo]UHHHEHEfHnfo^fH~H2uڅtfofo]UHHHEHEfHnfoYfH~H2uڅtfofo]UHE@u@@@ AE@u@@D ω@:uEt@]UHE@u@lj@:uEt@]UHfEuf@ff@2fuuf@ f:uEfE]UHfEu1f @ljf:uEfE]UHEu@Dž@2uu@ :uEE]UHEu1 @lj:uEE]UHHHEHuH@HH@H2HuHuH@ HH:uEHEH]UHHHEHu1HH @HH:uEHEH]@2@8}*UH@u tE@u@8|E]t@@2@8~*UH@u tE@u@8E]t@f9}+UHf tfEuf9|EfDΉ]f9~+UHf tfEuf9EfDΉ]Ë9}%UH  tEu9|EDΉ]Ë9~%UH  tEu9EDΉ]HH9}-UHHH tHHEHuH9|EHDH]HH9~-UHHH tHHEHuH9EHDH]fn .v;UHf~MEfn.vf~2tEEfn.w]tfofofn .v;UHf~MEfn.vf~2tEEfn.w]tfofo f.vEUHMHEfHnf.v$fH~H2tHHEHEfHnf.w]tfof( f.vEUHMHEfHnf.v$fH~H2tHHEHEfHnf.w]tfof(UHE@u@0ω@:uEt@]UHfEu1ωf:uEfE]UHEu1ω:uEE]UHHHEHuHH1HH:uEHEH]UHEE@u@0ω@:uEt@]UHfE fEu1ωf:uEfE]UHEEu1ω:uEE]UHHHEH HHEHuHH1HH:uEHEH]UHAWAVATSHAI։m=}uuxL%IL%KLwEA.mA>}LymH[A\A^A_]UHAWAVATSHAI։m=}uuxL%IL%KLwwEA.mA>}LDymH[A\A^A_]UHAWAVATSHAI։m= }uuwL%HL%JLvEA.mA>}LxmH[A\A^A_]UHAWAVATSHAI։m= }uuwL%$HL%JL}vEA.mA>}LJxmH[A\A^A_]UHAWAVATSHEI)EHA= uMAuvAH=GDvEtj(U XXC CAAGcH=$IDuEtX(U XXC CAAGQHI(U XXC CH=G+HI(U XXC CH=HDH[A\A^A_]wUHAWAVATSHEI)EHA=j uQAu~uAH=FDtEtr(] S\\ SAAWkH=HDtEt`(] S\\ SAAWYHI(] S\\ SH=E/HI(] S\\ SH=dGDH[A\A^A_]uUHAWAVATSHDIIA=> )EAuJtAH=OEDs(UA<$AL$(Y(Y(Y(Y\X.{ .nA$Ad$AAgH=FD8s(UA<$AL$(Y(Y(Y(Y\X.{ .A$Ad$AAgI$I(UA<$AL$(Y(Y(Y(Y\X.{ .A$Ad$H=C^I$I(UA<$AL$(Y(Y(Y(Y\X.{.z[A$Ad$H=^EDH[A\A^A_]s(g(og(^gE(MgUHAWAVATSHEI)EHA=uRAurAH= CDpqEtt(UKfKAAOmH=DD,qEtb(UKfKAAO[HI(UKUfKH=[B0HI(UK#fKH=CDH[A\A^A_]orUHAWAVATSH AHA=)Ef)Mu@AupAL%ALD7p1Eff(UfUfXf4L%$DLDp1Eff(MfMfXf f(fnfpDfs?frfpfTfUfVf)MLDq(E(H [A\A^A_]UHAWAVATSH AHA=)E)MuAuoAL%@L%eCLDFo1Eff(UfUf(f\f fnfpDfs?frfpfTfUfVf)ULDp(E(H [A\A^A_]UHAWAVSH(AHA= MEAu&oAH=+@Dn3{f(UYf(]Yf(Yf(Y\Xf.f. EMEf(f(cMEH=BDmU]3{f(Yf(Yf(Yf(Y\Xf.f. EtGMEtGf(f(cME.uW}uKH=>ud}uKH=]AD/oEMH([A^A_]f(f(u}bUUUUf(f(u}tbUUUUvUHAWAVATSH AHA=MEuAumAL%#>L%@LD{lKEMU]aEKt MELD$nEMH [A\A^A_]UHAWAVATSH AHALe=`uFAutlAH=y=DkEt\A,$Al$+k};}ZH=@DkEtRA,$Al$+k};}P+kA,$Al$}};{H=<,+kA,$Al$}};{H=v?DmmmH [A\A^A_]UHAWAVATSH AHALe=FuFAuZkAH=_<DjEt\A,$Al$+k};}ZH=>DjEtRA,$Al$+k};}P+kA,$Al$}};{H=;,+kA,$Al$}};{H=\>DkmmH [A\A^A_]UHAWAVATSH`IALe=-Au=jAH=B;DiA,$Al$A/Ao}|$0|$ |$m<$^\H==D,iA,$Al$A/Ao}5?|$0|$ |$m<$^^ A/AoA,$Al$}}|$0|$ m|$<$]A/AoA,$Al$}}|$0|$ m|$<$]}A?}D}A?}?A?AH=8$A?AH=;D+immH`[A\A^A_]UHAWAVATSH`AHALe=iuVAu}gAH=8DfEt|A,$Al$+k|$0|$ |$<$;\};}vH=:DfEtnA,$Al$+k|$0|$ |$<$[};}h+kA,$Al$|$0|$ }|$}<$[;{H=78+kA,$Al$|$0|$ }|$}<$[;{H=G:DgmmH`[A\A^A_]UHHE}ș‰uEt@@]UHEDM EDMAD@2uEtAA]UHEM@:uEt]UHEM@:uEt]UHEM@:uEt]UHE@u@(@:uEt@]UHHfE}ș‰fuEfE]UHHfE}1҉f‰fuEfE]UHfEMf:uEfE]UHfEMf:uEfE]UHfEMf:uEfE]UHfEu)f:uEfE]UHHEM‰uEEʉ]UHHEu1҉‰uEE]UHEM:uEEω]UHEM:uEEω]UHEM:uEEω]UHEu):uEE]UHHHHHEHMHHHHHHuEHEH]UHHHHEH}1HHHHHuEHEH]UHHHHEHMHHHH:uEHEH]UHHHHEHMHHHH:uEHEH]UHHHHEHMHHHH:uEHEH]UHHHEHuHH)HH:uEHEH]UHEEfn(^f~2ut((]UHEEfn(\f~2ut((]UHHHEHEfHnf(^fH~H2uڅtf(f(]UHHHEHEfHnf(\fH~H2uڅtf(f(]UHAWAVATSHAI։m=}uu`L%1L%3LO`EA.mA>}LbmH[A\A^A_]UHAWAVATSHAI։m=a}uus`L%y1L%p3L_EA.mA>}LamH[A\A^A_]UHAWAVATSHEI)EHA=uMAu_AH=0D\_Etj(U \\CCAAGcH=y2D_EtX(U \\CCAAGQHI(U \\CCH=V0+HI(U \\CCH=1DH[A\A^A_]o`UHAWAVATSHEI)EHA=uRAu^AH=/D<^Ett(E[SKAAOmH=T1D]Etb(E[WSKAAO[HI(E[!SKH='/0HI(E[RKH=0DH[A\A^A_];_UHAWAVATSH AHA=)Ef)Mu@Au]AL%.LD]1Eff(UfUf\f4L%0LD\1Eff(MfMf\f f(fnfpDfs?frfpfTfUfVf)MLDi^(E(H [A\A^A_]UHAWAVATSHAHA=MEuAu\AL%-L%/0LD\[EMU]bQEKt MELD]EMH[A\A^A_]UHAWAVATSH AHALe=uFAu \AH=-Dr[Et\A,$Al$+k};}ZH=/D:[EtRA,$Al$+k};}P+kA,$Al$}};{H=y,,+kA,$Al$}};{H= /D\mmH [A\A^A_]UHAWAVATSH`AHALe=uRAuZAH=+DXZEttA,$Al$+k|$0|$ |$<$O};}vH=p.DZEtnA,$Al$+k|$0|$ |$<$mO};}p+kA,$Al$}|$0}|$ |$<$/O;{H=7+<+kA,$Al$}|$0}|$ |$<$N;{H=-DK[mmH`[A\A^A_]UH ]UHf ]UH ]UHf~fn]UHH H]UHfH~HfHn]UHAWAVSHI։m=@}uuRYL=X*L=O,LXA.}mA>LZmH[A^A_]UHAWAVATSHIHA=)EuAuXAL%)L%+LD?XH(M CILDH[A\A^A_]YUHAWAVSH(HA=[MEuAueXAL=j)L=+LDW)EEECLDY(E(H([A^A_]UHAWAVATSH HALe=uAuWAL=(L=+LD=W+}k}A,$Al$;{LDYmmH [A\A^A_]UHAWAVAUATSPMIHӊLeA$LmLLLAA$AM t'LeLmELLLA֊E׊M uH[A\A]A^A_]UHAWAVAUATSPMIHLefA$LmLLLAA$AMf t,LeLmfELLLAEMf uH[A\A]A^A_]UHAWAVAUATSPMIHӋLeA$LmLLLAA$AM t'LeLmELLLA֋EԋM uH[A\A]A^A_]UHAWAVAUATSHMIHHLeI$LmLLLAI$IMH t,LeLmHHELLLAHEHMH uH[A\A]A^A_]UHAWAVATSMIHA=bu H=&H=(DTHHLAփ=5u H=\&H=S(D[A\A^A_]VUHAWAVATSMIHA=u H=&H=(DwTHHLAփ=u H=%H=f(D[A\A^A_]0VUHAWAVATSMIHA=u H=%H=f(D THHLAփ=[u H=%H=9(D[A\A^A_]UUHAWAVATSMIHA=u H=B%H=9(DSHHLAփ=u H=%H= (D[A\A^A_]VUUHSH=$]PSUHgQH=$]&UUHH=e IHtH8*t]鲴1t]]}UHHt]ÿ]鏮UH]aSUHH)b]UHSPHaH=SHHË@ H[]UH$SH aH HHH@@ ]UH]UHRH |aH HHH@H]UH].UH]UH]PUHAWAVAUATSHIAIt/)0)@)P)`)p)m)u)}HLK(LC HKHHHELRAHEHXHMHH@0H$L +LDDMHs1LD|HHH;EuH[A\A]A^A_]FUH]JUHAWAVAUATSHIԉuIt2) )0)@)P)`)p)u)}LMN(MF INHHHETQAH_HIcHLuHEHEE0ELcxHC@u11LDwHEH$LNL ̴LDMrE11LD?LsxǃLHDHH;EuH[A\A]A^A_]EUH]酳UH]eUHAWAVSPAHt GH]]8uQcH^HIcL68H[A^A_]UHAWAVSHHIHB[8yYL}о1LPBH]HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1EHZHHcHȃx u L9HH[A^A_]UHAWAVATSHI]1EH Y9u_L=I?t9HsZHHcHHH@HuH H HtH@XHxHcL%7ZI$HH@XHH}HuLHtYI?t2I$HcMHHH@HuH QH Ht H@XHxH[A\A^A_]UHAVSHIuEHH8t9HYHHcHHH@HuH H HtH@XHxHcHbYHHH@XH@H}HuLHt{YH[A^]UH1]UHAWAVAUATSPIHAI;AAu>AuNAAttAAHu3HVxH_HVxHFDBbL1 !tvHAX8BAAAAAAttAAHDL+I]HW8"AAAu`AAAttAA( H1DHbUxHA2HHUxHAuH.UxHADD DLH 4HOHHtHH3oH ʃ!QHTxHADD DLH3HHHtHHnHAMHDHHHtHH[A\A]A^A_]AA2D AHHAAAH}DRIAEH I}AEH inH Ht I}LAEH nHHt I}HHHtI}MtIW1H5Y11L+HHHI}AAD AHvHAA\D HHAqUHAWAVATSHAIHȃwnHuH=EWH5zX]HT8t DL3HHHtHHlH ʃ!HHgHHuH=VH5 XL#H&T8t DLK3HHHtLHnlHKHLD[A\A^A_]UHAVSIHQR8uEXHS8tL3HSHHcHL`11E1E1ɉ1Ʌ[A^]UH1]VUHAWAVATSH`IHQ8uWL%0SA<$tmMuYL}1L?:HUHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1<L2HRHHcHL`111E1E1ɉ~LAA<$tty\LeȾ1L9H7UHHHL$(HH@HD$ HL$ID$HD$I$IL$HL$H$1P<Et LC1DH`[A\A^A_]UHHH]RUH]WUHHHQ:tH]"0]UHSPC߉H[]rUHAVSABH QH HHH轅EHx@E[A^]UHAVSABH KQH HHH胅EHx@D[A^]UHSPBljH[]0UHAVSAkBljD[A^]҈UHSPNBljH[]6UHSP2BljH[]UHHc]UH]UHSPAH PH HH4V H[]dUH]yUHSPHl8H߉H[]骭UHHN~ u H8]UH]UH]UH]UHAWAVAUATSHXEMIHOHLcJHP@MHOtvLL}1LHMHU6HkRHHHL$(HH@HD$ HL$IGHD$IIOIHgOHL$H$1}9HUHMEt+HHJL`111E1E1Dh{7HJL`1I1HM1E1E1D={IH}AHJL`111E1E1D {HX[A\A]A^A_]UHAWAVATSHPIIIMumHNt`HRH]Ⱦ1H5H7QHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1S8AuzAu6AuFAAttAAt|uxH03HKxHHKxHxD0Fw=D6HH cLHƺHHtTH5Q11LBAtFH,LHHHtIH9MtIV1H5Q1HP[A\A^A_]D HhHAHUHAWAVATSHPIIIMumHLt`HPH]Ⱦ1H3HxOHHHL$(HH@HD$ HL$HCHD$HHKHL$H$16AuIAuKAu]AAttAAHBHFH JxHHIxHDw sȾ w HH <4HuLHٸHHtIH9MtIV1H5O1HP[A\A^A_]øAuD 1HtHA^UHAWAVSHHHIHumHKt`HVOL}о1L2HMHHHL$(HH@HD$ HL$IGHD$IIOHL$H$14Hr0Fw2D6HH cHHƷHHtIH5N11H7H7HHHHtH H9MtIV1H5N1HH[A^A_]UHAWAVSHHHIHumHJt`HXNL}о1L1HLHHHL$(HH@HD$ HL$IGHD$IIOHL$H$13HfȾ w HH w:4HMHHHHtH H9MtIV1H5M1HH[A^A_]UHSPHӋ مtHHH8H gH Ht!H HH[]$UHSPHH+HHtH H9Ћ!H HH[]$UHAWAVSPHA!DHܵHHtEtHH H9H`HHDBHHHt ʃ!tHH[A^A_]H H9H[A^A_]UHAVSHAHYHHt ʃ!tHH H9H%`H ʃ!HDHHHt ʃ!t H [A^]H H9[A^]UHAWAVSPHA!DHдHHtEtHH H9H_HJHDH[A^A_]UHAVSHAHHHt ʃ!tHH H9H>_H ʃ!HHD[A^]UHAWAVSPIAA!HHHttLIH9H^HLD؅tHгHA HHE1HtAʃ!tLIH9DH[A^A_]UHAVSHAHcHHt ʃ!tHH H9H?^H ʃ!HDAEt HH HHt ʃ!tHH H9D[A^]UHAWAVAUATSH8LMLEHMA׉H}HC8uIH:E8t1E1HU7"HUHEHLcN$I|$xtfMl$@AA;$uYAAD$ IID$@ AL$dHI$pA$EAƄ$EEEEH$H}ȉDHMLELM)H mDH J A==t=u(H}ȉHUAHD8uMxuMHUH`1҉HMLELM2pE1At:HCt-HU"H=@FH5uG X E1Eԅt6AD$ Ml$@A AD$dHcEIŨI$pA$DH8[A\A]A^A_]UHAWAVATSHHAI;HBwL1 H}D?IAD$H #I<$AD$H p[H HtI<$LAD$H [HHt I<$HHHtI<$MtIW1H5F11L#tHHHtI<$Ћ مtJH FB9t H D DLH;H rZH ƒ!HDEHL#HA8tHD DLLH=ZHKLDH[A\A^A_]UHAWAVSPI׉IHAHHcHȋ ===uIH4ȃw_HTA8t Lz HYHAʃ!LU%=tNH=CH5D 4M?H@8t L HOYHAOI?H@8tLH[A^A_]H[A^A_]UHAWAVAUATSHLLEIAAIH>8uDH\@8t1E1DLYHEH$LDDLLEH]I۝H @H IcH щ A==t=uLDHUAwuLL`DLLELMkE1At:H?t-DLH=AH54CD E1DH[A\A]A^A_]UHAWAVAUATSPIAIL%0?I$IcH ؋ =tX=tQ=uSHȃwdH>8t DLH/WHAʃ!LZL`fD芓YM?H>8t DLHVHAOI?DI$HL`111E1E1DjH.>8tDLH[A\A]A^A_]EH[A\A]A^A_]H=@H5A UH,xH =H HHHxHc1]UH,x%H =H HHHxH@HtHc1]UHAWAVAUATSH(IAHi=HHcHHFH^HuIH) HI ~ H)1HH)H1HHIHIH IIuLHH?H;%)HIP04[]rH UHAWAVAUATSPH8HHcHHK@Hu~LsXIF8H@HHHcCdH9uHAF,LPL%A<$HcLkXKt/HHyvKD/HCD/PA$CD/DIv8HRvIF8H[A\A]A^A_]UHHIt&)`)p)U)])e)m)u)}H0LH(L@ HHHPHpH H HMHUHBHEHBB0L#HsHH;Eu H]UHAWAVSHxAHHt/HOHHPHD  HL} 1LDH]о1H H9HHHL$@HH@HD$8HL$0HCHD$(HHKHL$ HD$IGHD$IIOHL$H$1 1Hx[A^A_]H06HH<UHAWAVAUATSHHEH6L%7E,$L50AEH=g$ؙA<$H=:E11l$A $uԉAILcH}IDAHcHE1MŊt{IcH|HHt H9s#Hqu@|3 @ t fD3 AHcH9u| u < tD A1H=:DH#HGMIcHL9H4HCAA9_ICD8H=91u#H=EH[A\A]A^A_]#UHSHHHHEHH@@@H/)H*)H%)DH5x91H1HHHtHH5f9H1H}HHHt HЉHvHHt1HH%HH;Eu H[]UH]G^UHAWAVSHAwDH HcHHcH)^HVHL4(WHcHNRH]1H߉4HcH)KHNPH (DHcHV?HcH)CHVHH(<HcHN7HcH)EHVHL4(>HcHN9HcH)HHVHH)AH^Hcɍx>H (7HcH~2HcH)HVHL4(HcHN}HFHHHNL0HNHAHFH1L}L'H([YHFHHHNHHVHBHFHH@Z*HFHHHNHHNHAHFH HX1HzHFHHHNL0HNHAHF1L}LH]HFHHHNHHFHHHNHH~HGHFLHp1HmH4HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1,HFHHHNL0HNHAHF1L}LH]1HLH3HHHL$@HH@HD$8HL$0IGHD$(IIOHL$ HD$HCHD$HHKHL$H$1Hθ8u H}AH[A^A_]fo%YUHAWAVATSHPIMLHHHIMu\LeȾn1LH2HHHL$(HH@HD$ HL$ID$HD$I$IL$HL$H$1LLHE1LHP[A\A^A_]UHSPHH;0HH[]UH1H]UHAVSHHLu1LH!H]ؾ 1HH1HHHL$@HH@HD$8HL$0HCHD$(HHKHL$ HD$IFHD$IINHL$H$1HĀ[A^]UH]UHAWAVAUATSHH}HtHH=P31Iƾ|L/HtdHþ|HHuHcHD\L I<$H)E1E11DHcK|IIHuIMuYL}n1LHr0HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1H5dHULuL%HLmtUIE1H]L59L}=HHUH_HEIEHEIE1LLAIHuE1HEHMHHMHHD`~E11E1HHEHuYH]n1HHl/HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1LiHEHuYH]n1H_H/HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1LuE~DuLmIL}LeI$HII HII LHL=LHUHMHEIEHEIEMLeIIIuHEHMHHMHHHMЉHHĈ[A\A]A^A_]UHHGHcwH H]UHH?H6] UHSPHH{HCHCH[]UHAWAVAUATSPILcgM~+LoIE11I}LtHIL9| E1MuLH[A\A]A^A_]UHAWAVSHHAHpIH]1HDLsH-HHHL$(HH@HD$ HL$HCHD$HHKHL$H$12LHH[A^A_]UHAWAVAUATSHHHHHEE1LLLHH@@@GwHcH LLI>;1LI>H;HLjI>L;LLPI>L;LL6H M$MME1E11H1HLH[HHHH;EuHHH[A\A]A^A_]UHAWAVATSHPHAHuIƋ{H3gIH]1HDLLgH +HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1&LLHP[A\A^A_]UHAVS AfHCE1L3x 'fHCHC dLpL0H[A^]UHSPHHt$H{Ht ZHCHH[]qZH[]UHAVSIHN'HHcHHC;C | H5CCHKHH@t3t L4HD[A^]UHAVSII^IcF LdAN H<@HHx >eIFIcNHxiHHRHtHtH4H|H|H4t=HIHAH IVHt Ht H4 H| H| H4 HHH[A^]UHAWAVSPIAH8&HHcHHC;C |HHcS9~5HKHRt|Aw |H ѿDLRHcK9~&HCH IH ȿDLH[A^A_]"H[A^A_]UHAWAVSPIAH%HHcHH#HcCHCHKH@D|st L4HDCH[A^A_]UHAWAVAUATSH(EIHUAH%HHcHLAEA;E | LAGsCIcMA;MIEH IT/&H ȃA MLD"9{AMHHEH}HEHjHE7IEHcH IL9dL uA H=&H5)uAGIcEA;E~IMH@H DHUKAIcEA;EIMH@H [DHU IcMA;MA;M~~IEH ITrsHHtaBuY uTH ȿDHUH([A\A]A^A_]HTHUHTHUHHEHM HUxH([A\A]A^A_]UHAWAVAUATSHDEHMIAH"HLcJLD9tH=2%H5'bJDLH]HDEEIcD$HAD$IL$H@DlAt$t LcHEH[A\A^A_]Ã=uu!H=O|'K D$HuO|'KUHAWAVAUATSPIL= E1MMf1LH5DZH] BFtH1LL-D9|IuIuH=1H[A\A]A^A_]kUHAWAVATSHAIt8)0)@)P)`)p)))HLH(L@ HHHPH xH HMHHIAAH]HCHEHCC0DLLHHLVDAAAGI$IGAD$ AGH~HH;EuLH[A\A^A_]CUHAWAVAUATSHhAHD{IMu\Lun1LHLHD$(H8HD$ H$HD$IFHD$IINHL$H$1UH]кDL&u~ALeLEIcHIMuYn1LHHD$(HHD$ HHD$HEHD$HEHMHL$H$1DLHu"fu MH]u& L(H]H=AH5_1ILkL8CHHh[A\A]A^A_]UHSPHHH=1HCHCHH[]UHAWAVAUATSHAt8)))) )0)@)P)`LLHHHHh|HHEAtHLmHH@@@EAUI]IMH1DHLI4$AT$HLHHEHE(HEE0EHEHHAHEHHqHIIMIuIUAMuH HH; tt uAAAUIM1HpDYHHHpHxHHHHH L2HH3H=1THAuHzHH;EuH[A\A]A^A_]UHAWAVAUATSPIHH&8t0H"H:Ht!H8t@H5H:9HJzH;HLvH;H[A\A]A^A_]Hp2H5>L=Ic7HcHHHHL8AAA9|KL%E;4$|/AL-yI}H5a\1DuI}`E4$AHD IcDH[A\A]A^A_]UHAWAVSHIt,)@)P)`)p)e)m)u)}HLH(L@ HHHPHpH yH HMH]HCHEHCC0L=L[LH>LHxHH;EuH[A^A_]!UHHt&)`)p)U)])e)m)u)}H0LH(L@ HHHPHpH PxH HMHUHBHEHBB0HHxHH;Eu H]UHAWAVATSHPHR8tH8|ԔHL8HHcH~,1HMIHtH2H9w H)H;rHH9|yÅLcKxu_Lu 1LgH HHHL$(HH@HD$ HL$IFHD$IINHL$H$1&KHHMH9vHKHHH)HH H)HPHH:tHHH)LY1AHP[A\A^A_]UHAWAVSHIHt8)@)P)`)p))))HLH(H5DvH6HuHHCHEHCC0(L$L oYL1ILLML=LXLH6LHuHH;EuH[A^A_]UHAVSL5 A>tH 8|voÃu=H=A>t 1 >H=[A^]UHAWAVAUATSP-]L59AFD1A^@A^DH=dH=hH=LH=@PH=tDH=8H=,H= H=DH=xH=H=H=H=HH=|H=H= 8H=,H=L 聖H H OHg9OL= AL% A$HdH H>)HmH h HcH5^6L% H=* L/ L 4 A AA4Ht HH uAAAH 1ۉHĔI^H1AoA?nL- AEA?A4$H nH H HHH HAE@HcJL5 IIcMHL= IH H Åx!IHcHHtIH HtH;H tH= H5UktH= H5Ul$x1PtH H] H 8t uH H  tH[A\A]A^A_]vH[A\A]A^A_]UHAWAVAUATSHAHqHHEH=3 L%Z A$EuH R H H9L= A9kFTH 8H1"HL@1LHX1HH HHHL$XHH@HD$PHL$HHCHD$@HHKHL$8HD$0IEHD$(IEIMHL$ HD$HHAHD$HHIxLp1LhH1HRH HHHL$@HH@HD$8HL$0HCHD$(HHKHL$ HD$IEHD$IEIMHL$H$1E1EAHHLLkH<uIE;,$|H=$ H5/SGE~HAHXAFHHL<$LE1LIMfM$I$L8A$ A$HA$`A$dHH HL<$E1LLoIFM$LD~1HHHH9uǀ `dǀhM~ Mu@DIH8t LDLDEo$MwHH8tDILPGL7AG ?H AlAhI@uXLLDH$E1LMGI@HuH=H5OHJHLtqHH@@D`HHHD9` t H5GQH5(QH1DIHtHHOHHDLd1IDŽHH=@uHH=HkHH;EuDH[A\A]A^A_]oUHAWAVAUATSHxIH8tSIIOII)Mw$EO$AH5MHMHEAu,H$LML M1LH#Mw$1E1H$LM1LHH<8bIcx0H 9H H HtHHHHt H;A +Mu IIM+oHDE L%E1I $JIM/Muj3IEDLD ?11LDuDHU =IIH83ADEAXH }IHcHE $LAL p?1LM}@IHU$LuA1LL 7?DeMI쀉$ALSA@1LLL ?lID4$L;A@1LHH=>I>ED$$L'A@1HHUL >ILcuLHD$$DDeLAH1L z>IJI$L@1LL5P>M}IPHOEHkX$L@H1MILH€$L@1MX|DuII11LuHU#;IIDLE9tE@IDH@H=uEMI@11DLEIH@HuEA9ADžh]~aH5/>"IHcH41>?uƄ>?>=tƄ>=HH@uHH9|$FTA9DOM9}9HcAIuHUHR )9LMAHuȃ>uHUHR D))Ӊ߉EV!)bDH]H}"H=KH5V/E`EH}HH HxyELMHf LuHi8L`1LHUMaH8L1LBH1H,H`HHHHL$XHH@HD$PHL$HHCHD$@HHKHL$8HD$0IFHD$(IINHL$ HD$IGHD$IIOHL$H$1EH`DDLML`1LHUAgH1HQHPHHHHL$@HH@HD$8HL$0HCHD$(HHKHL$ HD$IGHD$IIOHL$H$1DHPLMLuH}H=dLvIADŽ$IcIHHI)LMLϋuX|bH}HI$@LH H9EE~;AELHc7H(wHHWv7 HWHrHwHHHȃ11H}uDMXH=>H5I,eVHEL11H}uD I\$@HpHDH HuDE~@HAHcH(wHHNR HNHQHVH HHAA}p1HGHH;E He[A\A]A^A_]ADŽ$M$xA‹uDEDEAc߉uA9 ID$xHuHE@HLMAvH;p M$x}HBDA;@Lu1Ax\t0A$DL A;q }IHc49E1ADŽ$L}HLULuHuuH]I@HfIp`H0IpXH(IpPH Ip@IxHHHHDž8H]~t,HLH}DDEAT>HIƋuA9HEMdtAA9tAM9tMI9tII9tIHpI9tI9M&IL$xHtA9HMtA\A9HMtA\A9\tA\HHHxATIXA9`u A9dtA`AdAt AdžHf8tcHHH fA9"tfA"A9$tA$A HwfHut'AƆ A HXfHutAƆ Hf8huI$pA$E$D9ELHA$t"1I$ʊA$9r1D9sHHAw)HwI$I$E$ A$HeHuA$I$ A$A$I$HhHL;4t AƄ$I$A$HItEE~nAHcH(wHHNR HNHQHVH H9tHHAA.E~)D1IHH4H94tH4HH9u܋`A9tAHEȃ8u HE1AL$ Mt$@A AD$dMd$hAL$pIIL$XI$HtfA\VI|$xt3A$OH5YI9tA$1A;@;}HcHH<H4L6DIL 1LLM@A AH}LlIHIL$xHHxA$I$HIHL@IHH@HHuHIc H9|I$xH@LHuHM8H=3HA\HuuI|$xthHJHHt HuIHt uLU|%}AH=H5$vHIHb H8t*ȃu HHHHHu L-HIEHDHb3+H wH HH HQ@\H`HE QtMH=D9|LbuhH JHcH O|HcH OLIxHTHXE~ tD0HĀ[A\A^A_]UHAWAVSHHIHHHcHHxPTJ߃ w;H=Hc H1xLuо&1LeHHHHL$(HH@HD$ HL$IFHD$IINHL$H$1$Hxef@XAHH[A^A_]ÐcKnXvKKXXUH1H xH HcHtH=_H5jQwHHHH=oH[A\A]A^A_]vUHAWAVAUATSHHIHʻL0MINPHL;5yu HsyAF`HI~@tH=H5B׃AN$LL(HKAƆHIH ٺ9H ɹ 9HֹrH}ȉ]HH;tH=H5'l4H o;|H=H5mL-TIEE1LL{H|u@IIELtH8t LDOLEAI$HHxHH`IH HHXIHHHPIHHH@H@HI@I1I@(H$E1H}zIM@MHԹuH=H5!.ADžHIL0LLUDjLL#AF ?H AlAh11II(fADŽ?HH@u1APAAF`AƆAdžHH `A9t.H WA;H·} t tHk8u H_~ 9~ HtH@HDLLHH[A\A]A^A_]UHAVSIHH9tHXt ǃXHH01E1HH9HIN(HHhIN HH`INHHXINHHPIIVHPHHH@[A^]UHAWAVATSIIHE1D1H LW)IGH`ƃ fǃ"D$DH@KD#DW)p)`)P)@)0) ))))))DLHLL[A\A^A_]~UHAWAVATSIMAD~BIE1 H<Ht{IHADIHcH@I9|IJIP>I2I&1IPIWA)II(H9tLL[A\A^A_]UHAWAVAUATSPIHE>ADO8LcJ<IMcIkXIPLHHIH<[IEDE~!IPDHD1҉PHHXH9uH[A\A]A^A_]UHAWAVAUATSH(IA^$H8tIL%*>A|$DMn@LuLmHEH8A|$DHEHHHEH D=9t`L8A tSH}]DuAA"f;EtI"HEǙH}螙A$D9tEULuHEHuH=H5|, A|$DAD$DIdžpLH([A\A]A^A_]UHSPHx6HHHcHHt HHH Ht H;H u6H[]UHSPH<{@u{DtH[]H8tyB7DžxލGrH)HHcH HH HtH4HtH;q tHHǀp떃9tC@CDH[].UH]UH]UH]UHAWAVATSH;{@u{Dt [A\A^A_]L5ݰA>tyj6ǍGr׃H=<à{@{DA>H=ղ蔠H=E11sILƁIMtH5pL͙uLGH=o蕘L荘L腘L%oL%oHHcH~#H H E1JHt:uII9|CDA9H|HGHHcHHH%HH HH;H 8C@CDrHGPHHGPG`1H;HuHnHHHHLJH;HujHHH=)>H=:[A\A^A_]%UHAWAVAUATSHH=E11qITCH]H5H HnH5 nH=H 1bqHH5mLmHHELeLeH}1H5HU肗H}1H5HUlH}HHEHA?CtHEHH;EL踀H H5Um1LL~HHtH54mHH]LeLe-HHULuH}-HULuL}ML}H=~ILvHLp1LHM蒕Lm1LH"HHHL$@HH@HD$8HL$0IEHD$(IEIMHL$ HD$ID$HD$I$IL$HL$H$1 L˔HH趔L讔Hĸ[A\A]A^A_]UHSPH!;tH[]H=^7;urH=C7H[]RUHSPH;tH[]H=7қ;uH=6H[]UHAWAVSPH8uHD3L=A?H=zH5uLǫA8uAAH y ~(H1H=<uAHHcA H9| uA  H49~D9t=HW~0HcHOH01HHtHx{LuKLHH9|H8u!A~H O 9~ HHqH[A^A_]UH1HRXB(B,H9t H]W]UHSPHH8t HVHH[]{UHAWAVAUATSPAHmHIcLI^IL5]I>I^IH[A^A_]麌UHH=)ÍHtH3n1u]UHH=藍HtHn1u]UHAWAVSPAH~HIcHHXHxHtHhHH HtH;A tH=ҨH5nt H[A^A_]Ls@LD蜔u ǃLDH[A^A_]ʔUHAVSH`JH ҥH HHHHHyt^H]c1HҌHuHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1葏t't"uHǀHx@LǀH  HD HxHL[Luؾ1LHHHHL$(HH@HD$ HL$IFHD$IINHL$H$1ڎ H`[A^]UHSHhHtlt[unH]Ⱦ1H菋H2HHHL$(HH@HD$ HL$HCHD$HHKHL$H$11QH'-gH- [H]ྌ1H߉H¦HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1ލHh[]UHSPHH 8uftHHHHEH=0-Hߡ8u9H+HHHHIH9HBH*HHH=,H[]UHAWAVSPAHAH81EAIHK@HIcH HxAHH@HHHxBHAFBFH[A^A_]UHSPHH8uHHH  H t H[] H[]UHAVSH`H9HHcHH@@ u H`[A^]ËGMM ـuL H}D2Dw;H5HcHHEHuH=%H50=jiH=H5 jDIHtII(IB~ MtAF IL;m|H5H}pL}MHZuHH}HpHHHH;u螂HHu\Lun1L蕂H8HHHL$(HH@HD$ HL$IFHD$IINHL$H$1THKK }~*E1HEH|H4IHcEHI9|Hb8uH8u莙HS8t]~MH5H}oHtH8HH5_H}oHtH#8IH5]H}toHtHR8HH5EH}QoHtHc#xHHH}oHx[A\A]A^A_]ÊEXUHAWAVAUATSPL%0H B(L菁E1L51I<$L譁tHI(HB~ML-0E1L%1L}I}LttHI(HB~MHY0E1L-E1H;L?tIH(IB~IHMH pWMt1L5lWL%mWHjWHs:HAHx:IFL%;WH8WHI:HAH^:ID$L%/E1L=1I<$L蠀tHI(HB~ML%/1L=I<$LntHI(HC|L5V7L5VMt+L%VHVH9IFH9ID$HVH9IFL%/E1L=|1I<$LtHI(HB~ML-.E1L%W1I}LtHI(HB~ML-.1L%3I}LtHI(HC|L5UL=U:L5UL=UMt'L-UHUHUIFIGIEHUHUIFIGL%.E1L=1I<$L~tHI(HB~ML%-1L=I<$L~tHI(HC|L5UU7L5LUMt+L%HUHEUHF8IFHK8ID$HUH"8IFTH[A\A]A^A_] H 5-H(H= uUHAWAVATSIIMtMAtFL%,1I<$L}tHI(HB~MtIT$LLAT$AD$$[A\A^A_]UHAWAVAUATSH8HHHEHH@@@H1HfHj%L{HH5AH1HZUDcEA1HNt8N,8L}HrLH5 }t0LH5|tLH5|u"1HH5LLTDHIcIH9eH5L1LT$_zHH5v1LHqTL=?+JD;HtJt;J;LH(H uHH3H= 1蓁HhHRH=1qHHH;EuH8[A\A]A^A_]CzUHAWAVAUATSH8HHHEЛHH@@@1L1LdLh3GyHH5cL1LHRSHH5D1L8SL- *L5DN|+MtSA>t+N$+LH5ztHt$H8tN$+JT+HLAH(Hx u4xHH5H1HHRL51HLRH3H=V1H3gH.Q1LH8HH;EuH8[A\A]A^A_]xUHAWAVATSIL7L=LLyM$$LLyttLL[A\A^A_]y1[A\A^A_]UHAWAVSPIHHEu\H=tE11LEt"HLPHL`FH/H .AHD8H[A^A_]UHH]/HUHAWAVAUATSHhHIHL-AEAAEE1H}'1LHwL=zIGHD$(IIOHL$ HD$HMHAHD$HHIHL$H$1zAMH]h1HLswIGHD$(IIOHL$ HD$HCHD$HHKHL$H$11HHAHD$(HHIHL$ HD$HEHD$HEHMHL$H$1VjHH ~BH~B< ,1H}LLgHIIEHD$(IEIMHL$ HD$HEHD$HEHMHL$H$1iHui1H}LfIEHD$(IEIMHL$ HD$HEHD$HEHMHL$H$11uiHH }BII7Hx[A\A]A^A_]UHAWAVAUATSPHIL-E1O|LHfui=!t%6dHKL1LH5>1LH5L>HS}BHT}B 1LH5>IIvH[A\A]A^A_]UHAWAVAUATSHIH}MHLuLDAE1H9Jt)HwD8HwD8HwD8H[A^A_]HwHwLHH[A^A_]:/UHHpwH mw t H]0HKw]/UHHLv8HRvELQv][,UHH@v]Y.UHH].UHH]/UHAWAVAUATSHIIH*[MIAE< t< tA< wXLH]ЊHÀ rL?AEyH=!yH5 9?HIIAE< t< tHUL*H=L2tLmIAE< t< t5EtH=HUL2LmIAE< t< tHQu@ HA}t_L}Q1LLL\HxHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1_HĘ[A\A]A^A_]AtH=HUL1t.LmIAE< t< tHtH H=LH,tuL}H=Yt9wHItH8HcH\H=1tHHucLxn1L[HwHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1^H=s_މw 1ۉuAt!H=LHU0H=su̅tLmIAE< t< tAt!H=LHU_0H=Nsu̅tLmIAE< t< t*1H}LHMZHvHHAHD$(HHIHL$ HD$HEHD$HEHMHL$H$A1]H=ruHG At%H=LHU/H=ru̅LmIAE< t< tHHcÉA9}~IAE< t< tAE1< w`LHEЊʀH rL;AEy H=0uH5M;LmЋuH=qIAE< t< tD$<tElIAE< t< tXUHAWAVAUATSPIHH~qLcx =czt&6XHH51HHL#2H51HL 2EH5u1HL1EMoEL5E1HpHBHwnIcL1HH5R1HH5D1HH561HH5(1HH51HH5 1HH5T1M9}1HH5>1IM9\H51HH[A\A]A^A_]1#VHH51HHH[A\A]A^A_]0f)7ESao}UHSPHH(;t HH[]UHHk](UHAWAVAUATSHHH}HHIXHteHp11HHU7WHrHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1YND<'t<"u]Lu/1LHUVHlrHHHL$(HH@HD$ HL$IFHD$IINHL$H$1YL%&r6H(H*H);H WII9,HVLpHA;tA,LDAH=H5#AH={H#;H=fL"G;H=TL"H+31H}HUmUID$HD$(I$IL$HL$ HD$HEHD$HEHM};H=Lp";H=LT"21H}HUHTID$HD$(I$IL$HL$ HD$HEHD$HEHMHL$H$1WMI]ZHĘ[A\A]A^A_]UHAVSHI=ut&6CSHH51LHHR-H5+1LH<-H)t(u(H5qHH5qH1L-Ht+t*u,H5HH5H1L[A^],[A^]UHAWAVAUATSHIIM1LTHHE,LKTIAD<'t<"u_H/1HLPSHnHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1VH=,L= H=,L! H=ֿ,L H=,L^H=,LVH=,,LIHH*1HLLH]01HL+RHmHHHL$(HH@HD$ HL$HCHD$HHKHL$H$wHR##H;$$H$&MdH061HLLQH*mHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1FTH''!H"" H,MHi"u HW!I1L2L%hA$=KA$Lm51LLLPH6lHCHD$(HHKHL$ HD$IEHD$IEIMHL$H$1QSA $L}HhA$L`41LLL PHkHCHD$(HHKHL$ HD$IEHD$IEIMHL$H$1RA $Lxh1LLOHCHD$(HHKHL$ HD$IGHD$IIOHL$H$11nRH[A\A]A^A_]UHAVSHI=]pt&6NHH5ۺ1LHH(H51LH(HfHgt+߃ w^HHcHH5HT߃ w3H HcHH5ػH)H5H-V[A^]H5HH5Hh.H5H`H5uHUH5eHQ1L[A^]''H5QH.H5AHH51H H5!H1L[A^]&gOOw??$$UHSPH]1ҹII~ H xH[]UHHd]1UHAWAVSHHHIH=g1XtvH=<1HCtpL}о*1LLHLHhHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1OHbe HSeHH[A^A_]UH]UHSPH]1ҹI9H cH[]UHAWAVSPIHHbLc8=2mt16JHH5=1HHLMH[A^A_]$H5)1HLLH[A^A_]$UHHH$L WHE1H]UHH/H]" UHAWAVATSHIIL%A$tH=fH5U<,A$H]܉?LLI A$H H[A\A^A_]UHH]UHAWAVATSHIIL%mA$tH=%fH5ĶL=,A$H]܉?LLIyA$H bH[A\A^A_]UHH]YUHAVSHH]E11ҹI!t H $bAHD0H[A^]UHH8t1]Ha]UHHHH]:UHHPH]UHAWAVSHhIIH`8H]81HLIH#eHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1?LML51I>LIHI(HB~H=SL(u`H=HLs(uHH==L[(u0H=2LC(uH=&L+(t(H@L MtAF$Hh[A^A_]H=L'u`H=L'uHH=صL'u0H=͵L'uH=L'tH@LjH=L`'tH@L?H]о*1HLLGH7cHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1SJUH]UHAWAVSHXHIH5HU1HG~oEWf.seL}Ⱦ*1LLHFHbHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1IfWH7HX[A^A_]UH]UHL1ҹ]^UHH]\UHAWAVSHHIH]8taH]1HL%FHaHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1H3H=Hb%H=HF%H=H*%H=sH%H=dH$H=TH$uxH=HH$u`H=<H$uHH=0H$u0H=$Hv$uH=H^$t%HYwHKHĘ[A^A_]H=H!$tHwHH=H#uH=H#tHvHoH=xH#u`H=mH#uHH=bHn#u0H=WHV#uH=KH>#tH9vH=(H#t,HPZxtcHvHH=H"t2H ZxtNHuH^L}-H=H"tuHu$L}1LLHBH`^HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1|E=L}о*1LLHYBH]HHHL$(HH@HD$ HL$IGHD$IIO/UHHtHcHwH RH]]UHAWAVAUATSHIIH5uD^DVME11E1IWLHHŠ t tـЀ rFAr,iu;EHŠ t tDAH A,ـЀ =IwA_Ilj< rIWH< t< t t u < D]DULM"Å?HHP1H}LHUHMI@HQ\HHAHD$(HHIHL$ HD$HEHD$HEHMHL$H$1dCh1H}HUF@H [HAHD$(HHIHL$ HD$HEHD$HEHMHL$H$11C DI?AL$1EtDUDDLMH5kD]ALMH5WDUAAAD~ D^DVeHp1HLLz?H[HHAHD$(HHIHL$ HD$HCHD$HHKHL$H$16BH[A\A]A^A_]H@HX{UHAVSIH= `t&6=HH51HHLH51HLHHPHH51H[A^]UHAWAVAUATSHIIAE11E1ME1IT$LHHŠ t tـЀ rFAk,bu;EHŠ t tDHA A%ـЀ ?IwA\$Iĉ< rIT$H< t< t t u < D]DULMCÅIH[A\A]A^A_]H@HX{UHAVSIH=\t&6_:HH5,1HHLnH5G1HLXHHH5/1H[A^]7UHAWAVAUATSHIHHHHEH5ǥ;uqH ɥL`1LH:HVHHHL$(HH@HD$ HL$IGHD$IIOHL$H$11=8yH"AE1L5RIE1< tYMu<:u AE1D9IM|$/L&HHXID1LHID$[A\A^A_]UHAWAVAUATSHHIt5)) )0)@)P)`)p)}LLHHHHHHEп$IMu_E1Hn1H$H@HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1'HHMHAHEHAA0LL%=AL%?EDEIcLH$IMuVn1H}$ID$HD$(I$IL$HL$ HD$HEHD$HEHMHL$H$1&E1HHEHEHEE0ELHLHM$I9AHqHH;EuLHH[A\A]A^A_]"UHAVSHH; #E1L3H{"LsH{"Ls[A^]UHSPHH;"HH[]UHAWAVAUATSHIHt@H]HL{H5ܑL#At!I~HtL# AN1LeH5Lq#tI~HtL\#AE1H}("L "L"D H[A\A]A^A_]UH#1Ʌ]UHAWAVAUATSPAI1IHI_0I_(I_ Mg H=?11eIH;H"HHHþ;H"IMtjAEII$;Ln"IMtPA$IMo(;LM"IMtZAEIž;L0"HtE<1I$E1Mo(LH1EHELH[A\A]A^A_]ðEE1L IAO0}uLc 1ɅIAO4UHAWAVSPIIHHt@H!HtH1MtIMtIH[A^A_]UHSPHH{H;0 1HHC(HC H[]UH1HHDEtLE1AB t8EDEY D8ECىDI D8DCE9u1FLIEuE1DE11E1҅~9Et11uB<]UHAVSHH=HCAuzH=H(ubH=HuJH=rHu2H=bHuH=NHAA[A^]UHAVSHH=oHAuzH= HubH=HhuJH=ލHPu2H=͍H8uH=H AA[A^]UHAVSA։ D0HHlj)Hu[A^]UH]WUHAAE1A wE1C DTHЊOHʀЀ rADHA+wKHLr6HLrHLsHA%HAHt@8u-H==1ɾ1AEA9DOƀ?DED]UHAWAVATSIII1H1HHȊ t tЀ v H HcLL1IE1E1HHrаEu/H)IHL9DKLFA H< rHHcHH t td!SI XH[Hc Hs< 7HjHc HH\TtMYtZttt9yt zA1+@$H HHc 7 O|,@LHMAGX?gHMHO,AC9,}wHMK,HEOt,@L HuLA9}5HULC,IЍR!C,#E1ADH[A\A]A^A_]UHAWAVAUATSPIHAD@@9uDHH[A\A]A^A_]L@L-A}uH H HtHEAD$1HMШu/H'HIcHAgLx0A D$AD$H &9t1H W'H IcH HI@I$Htzu#tHKu DHH;AD$uDHLA}uGH&HIcHHHt*HʕHHtH+EH1HHH[A\A]A^A_]UHAWAVSPAHADuDHu/Hm&HIcHHxEtFDH(1H[A^A_]UHHкH1]UHAWAVAUATSHHA1EH 9XH%HIcH4LxAG8I0BAGuL}LLmEt(H+HHtHHHHtHA_<1HH[A\A]A^A_]UHAWAVAUATSHA1EH U9H"8 HN$HIcLAHELc(It'KDmHHhL4M }t3A~$@ttu1211L]1E1D9AAKDmHHhL4H;8uH8tIXHwH]LuHpHMLEDM $IMHE/E1D9tHED(EHH8HuTH HH`HHp@HHHHHoI!HH HiH)HIH\Ht%HύHHtHЋ}LHU6}LHU%Ht)HHHH]tH}LHU1HEH]H}}uHUH ;J HpVHEAt HEH]}tHULIuH}[JD;IL;mH]HEHCEԉCHHX[A\A]A^A_]UHAWAVAUATSPHIHHHcL4Mc~dICMuIxLMuH=?H5rMTMMhE`Ic~ Hu&H}H= H5rM!H}ME~_Ic1HHIt AD 8uH9It H9w+I9\ v$Md H9tJE~1I9t=HL9|HH9|M@MhE`MuH=uH55r1EIHuAHELc(It'KDmHHhL4M}t3A~$@ttu1臑1@1TLS1E1D9AAKDmHHhL4H8uHD8tIXHwH]LuHpHMLEDMbIMHE1E1D9tHED(EHsH8HuTHHH`HHp@HHHHHoI!HH HiH)HIH\Ht%H$HHtHЋ}LHU}LHUzHt)HHHH]tH}LHUL1HEH]H}}uHUH H H;JHpTHEAt HEH]}t>HEu1HE8uHEHEH}tHMHHH;At11xuHpH1HĈ[A\A]A^A_]øUHAWAVAUATSHLMLEMHUHHpHxHMHcK HǃHPHxTHhHHxHPHIHH`HHEHpGEuHcHXAEH]A51H8@sEuE1HE19HANjEEEEtHߋuHhMIE1H]ȃp|IMuDALPLe]t>AHELc(It'KDmHH`L4M}t3A~$@ttu1聍1:1NLN1E1D9AAKDmHH`L4H8uH>8tIXHwH]LuHhHxLEDMYIMHE=E1D9tHED(EHjH8HuTHHHXHHp@HHHHHoI!HH HiH)HIH\Ht%HHHtHЋ}LHU}LHUqHt)H~HHH]tH}LHUC1HEH]H}}u HUH H HMJ$L H;JHpEHEAt HEH]}tMHEu@HE8uHxHEH}tHMHHHEA$DH;At11puHpH1HĈ[A\A]A^A_]øUHAVSHL5ULHHC@HL[A^]H=UHAWAVAUATSPH=L5ME1IF@HM~@M9~HLHI~HHtyAFX~dE1H<tCLdLAD$TI|$@BID$@LCAFXI~HIHcHI9|PBIFHLL3BL5M3H=H[A\A]A^A_]UHAWAVAUATSPL-3MuMHחD HmAIptNE1;tCIXHt7A~$@ttu"E11E11ˎ E11܋MvPMuEuHH1H 5 ;@.nAunH-D MuMLH[A\A]A^A_]UHAVSIH=tTH=fHHt&HC@HHC@H=&H=yLHH1CPC\A CTǃH[A^]UH*HƨHp]UHAVSH HIAH֨HtM{PuGt-HHH}HHGGLH 1C\IdžpH [A^]ÐUHAWAVAUATSH8HIIEEH5'zE1L9&LDHLE8Au 9uH] 8'UHMK$MHS MH 9HMtnHHEIEAu HT  MH  MȋE19E1HԔ8tILpMt3At8A~Pu<$HߋuLMLELMr$ǃE1HǃpǃHyHHtH ^  A9} AA9|LHxDE9E~ )kEukH(EЋC`8t(tHv ƃHc ƃHz8tNMtA~PuBH9Ew7}L;|HxDu1H|8tu ǃIEA;E yHx@t HAD;8|HwHHtLH8[A\A]A^A_]UHAWAVAUATSH8AHALǨE1LEE HUL2HBDbD$$E1HDu{E1L-HLwHHtH  A9} AA9|LA}Du4ri$E1HDHULE$t A}@tH3D; |HvHHtLH8[A\A]A^A_]UH倎F@HFHtFHXN]UHAVSHH@HHHcL4ȃH$HL[A^] UHAWAVAUATSHF@HGH@HtHF 1AHu}ÉؙӅAHLxHHcL4@IK7tO7AD$A9$}JK|7@H}AD$A9$|kD9|PH}Hu}qD9[K7Ol7@L,H K<7 LmK7HPH]HэJAT$!ʉPA$L5HCH[A\A]A^A_]UHAWAVAUATSHIHxHEM@McoH}LUFHIHLuLLHtIH+EHI$HHEID$HMIL$HI$AD$ u(HHtID$@tHH[A\A]A^A_]UHAWAVAUATSHhILuH=HuHcHHUHxM(HuHUHE8HEHU(HE HEHEHEM)LEL)L)HMLHHEELMHHP1HHDH]H)ILIHxuAIuH;]ȋEԹD'M~ HEH)L9 HH+EH;EEԹBEH}L!IHMHHEM,HEIt LLUѺ}LLMLIIHx4HHHUHuHbI$@HxA$F0}LHh[A\A]A^A_]UHAWAVAUATSPAHHHKLCL{LK LS(Lk0Ls8Lc@HCPI9v"H1DAWPsHATAVAUAR?H@(H0L|$(Ld$Lt$Ll$L$DH01H[A\A]A^A_]UHAWAVAUATSHIIL}0H](LuHHHcHEuCttH[A^A_]UHAWAVATSHLcG$?LH!HHHu01ǃDLD[A\A^A_]UHAWAVAUATSPAHZHHHHcHHc@ L<@IB;H}N;Nt;@L'MAtMB;B;!J;L,Et8AEt1HUHxr LHH9t9w LE1#J; ALILH[A\A]A^A_]UHAWAVAUATSH(EHLzHHcC L$@IC'tWLpI9uKuHMLEK'HEK|'@H}!HMt L9pt"H}V1HH([A\A]A^A_]K'G'JELEt/H?HHcuHHxr HHH9t9w K'ArD!Ή2A8tHEAȉH}HYUHAWAVAUATSHhDMLEIHUAH}HHIcHHX@D IcHMHEHc@ HEDHHEt D9HHHtoK.tHEH@XH UfHnH fHnfl11E1E1DK'HUtHH@hHMHHH1\HHEH<-9HHDEu ǃC $HADDuEEHMCLdDHuEЉULLDHH@HHxt"HC@H@ǃdLD%LDD3HǃdDD?A@HEI)MLuIcIuHHA~A|HP@L+}J4:HrLHuLuAHcI̓}HEHu HHHuHiIcHEHc}HuqH@HUHB?@H)LtLc}LHu?HELIu,HuE~MHHHLH@HuLuM}ЅHshHEtMĉdHuILEwH}HuHhDpE~&HuILEH@IuEĉdEĉdHuILE}HE1ɉKpKtdHULHǃHHMP4I`1\TXHxdu4t/CtHMHIXHfHnHEfHnfl HKhH I HL@ dHpDut"H@ffCPfC@C`LxI$tmHEMI$HHMHHL8L{@1HCHHCXC`LDIGHHCPHtHXXMIHI_HLDHE$ffCPfC@C`I$IHI4$HUH HHHH 9tHxDHHHh[A\A]A^A_]UHAWAVATSL%YI$HcHLcp Lx@H78Lt 1E15I$HH@@Ht [A\A^A_]IHJp HH8HtH$1[A\A^A_]VUHAWAVATSL%I$HcHLcp Lx@H8Lt I$HH@@HuIHJH HHHt[A\A^A_]UHAWAVAUATSH(AHHHIcLI@@HHUt HH HHHHuHL?AD#du_\~-1DH_ dtH1H}DHWd 1H}HDH([A\A]A^A_] HMH}L9u(Ax u!t1DYIL-h}AEu=THN}\u0HHu&H{HudtH}DHD\u HHtDHsHuH{Ht"DH9HtH}DHDMdL\?AHhHc1҃8uHH@H9|,DHHtH}DHDpL9dH}DHHEmDmLk@Mu ]LDI}@HtDAE`I}@DDLgIMI}@utMuLH J HtH;A t:HHIGH H HtH9AuHyIw8AW0H5mIIcEI9|IHIw8AW0I0IA}~o1I$HHtT>tHuHIH HtH;A t6HHIGH H HtH9AuHyAW0H5mHIcEH9|IHLt AW0H5lM?MHEH wHHH=H[A\A]A^A_]UHAWAVSPHl8Hl8t u<x3HHHcHHtHHH Ht H;H H8HHHcHL(MtnL5IGÁLHH9Cu{@t%HC0Ht IHs8H{Ht$Hs8S0HC0HtIH{HtS0MMuH[A^A_]UHAWAVAUATSPHAAAHJ H9XttHHuPI։uI"!II]LLVIEMeHL5 L]ԉ H JIEN,LH[A\A]A^A_]4H[A\A]A^A_]UHAWAVSPHI II_AGHt-1A<u HH9uHq IGHLHLH[A^A_]UHAWAVAUATSHhHMHUIH=8Eԉ7( IMnEAAL%K L9kt;HHuPHLkHuHsHH} HCKHK H{DeH{HI~ Hi8t Eu:Mn=Ex/HHIcHHtHHH HtH;H tNIFH=ODHEH9CHs\Le1LHsHHHL$(HH@HD$ HL$ID$HD$I$IL$HL$H$1HZHDeMcJHHJ IN4IIJ H(INJ L(JHH;Eu H@[A\A^A_]ȽUHAVSIHBD3uB|3t HunknownH[A^]UHAWAVAUATSHhIH=HHEAD4HA |ẢHH#AƃcwHMl4M94,IMHL3%uA$%IILLA$%ILH<%uSـA wME1ICLDlNA_Ilj< rNADO0DLDA$IhDIÍp(RHHr|HHHHLLL)HsHkD1LHc,GHH9IA|$Md$uEHuE΄tHunknownHHL)LH LA}IA|$Md$uS趻ALLL)Hs1LH+DM聼HH9IA|$Md$uILM9sMuaHo1H^HHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1MAEH:HH;EuHh[A\A]A^A_]A?n?UHAWAVAUATSHHAՉAHHHcHMLIŃE+I`HHP@@EI`HEH?LMLMLEtxIw@HtoIcH<HHL@HHoI!HHH HiH)HIHHEAtPEudI`HHP@@v1HEE1McE1LM'HH5)Ht HPMH55)1BHH5)HtHPH5)111҅H(H5b)HDH}ALMLEHYZ8uLL6LELMHYHcH=tH ~xHIHl>H8tRHHHMHȃx tHw>HHtH}LELMHB>HHtH}LELMDm]MtM]̅LeL%YuA$t1LHulLMDHWHMtUHHM<uH=H5b'(LMDLLLEmHHM<uH=H5'4赘LMDLLLE *DLLLEDLLLEt9H<H8DtHHHMHȃx UA<$DLmtLLHU'AUu ADžHv<H8tVH)HHMHȃx u>Hy<HHtAH}ЉЉDHb<HHtAH}ЉЉDH=H8L%WA$IxA\H =H Hɉ}IA$tH;HHUtAH}ADDH;HHiAH}ADDR%HH ;H4w11҅HY%H5%HDMιLAHHHMHȃx tH.;HHtLH;HHtLйLLLU1LLPI>tH(HGO$G(Jc*IHGG %EHEJ(HcHI H(HGG HO HEHHMIL@Hĸ[A\A]A^A_]UHAWAVAUATSHxLEHMAHHS@ALCdEHVB EHKu1Ht1HHtHUMЋMHU1HHEAAF;EHuMD}LHHUHL @HHMLeIHEAE1LmOlmIHENAAKDmHHIcI H`HGG HOI}JD*@r HMHHHx[A\A]A^A_]UHAWAVAUATSHHLEIAIM}@IHIu+H/HHt HUHU1IIEt3HRHIH H}HGG HOHHID@EedHEHHHEAHILHUHIDDHUȅDUH}EDEL>HpL?GHGG HuL*MfHZ(HHSHHEMcJHp@HtNHHHHoI!HHH,(HHt!H HiH)H IH|HtEAuHCxDHJHp@HHHHoI!HHH HiH)H8Lmu"A}tH}LM@H}LM*H HH(IL$(HH IL$ HHIL$HHIL$HH@ID$I $5IK HHThIT$(HT`IT$ HTXIT$HTPIT$HT@HDHID$I$MLmH}I(AƄ?I H0A>H@HGHGG O$G(Aw,L0LO8L:A?IDŽIK HH Hr(HthHr Ht`HrHtXHrHtPH2HRHTHHt@IqH W<9LeFA};I=}}unH@II9}WIIHcH4A($A(L$A(T$ A(\$0))))H2N9|H@e}uu 9fHMtHUH PI@HU9G΍L 9HcLcAL@IHHMHH@DHD`HXLLMHL9|ɋuHUIHUHcѿL@HMH HD,HEAHUDt>I|$@Ht4HHHoI!HHH HiH)HvL|E1ID$@HEA\$ H-28uH}L H1HcH=tH YPHI$I>t HHJx HIHHtLH=HHLH[A\A]A^A_]H08tLHuLYI>tmALDDM}HxuH=¦H5DIlALDDM:ALDDMALDDMH-xDEIDžp!HHHHHH4H^@HHHHoI!HHH HiH)HIHH*8t5IHt+AF t#1ۉILHty$LAF 9r[A^]UHAWAVAUATSH8HIIEEH5oE1L9&LDHLEH8IuH9uH8*UHMK$MH* MH -*9HMt贇HHEIEIuH MH> MHE1H9E1H*8tILpMt3At8A~Pu<$HߋuLMLELMa$ǃE1HǃpǃHYHHtH  A9} AA9|LH)xDE9E~ mEu[Hl)EЋC`8t(tHƃHƃH(8tNMtA~PuB=H9Ew7}LuH%)xDu2H(8tu ǃIEHI;ExH(x@t1HD;8|H0 HHtLH8[A\A]A^A_]UHAWAVAUATSHAAHAHShHDkXtD9sxu E9u41DHLEDmEEItLEEDmLEDS\ABCPADcTEtLHUEJ1L9s9I9t&HKHHlj1D4tEA)DcT{PCTDKPE1HUиD)DC~D{XCLChIIcHDH IHHHC`HtL9u E9u1,LChIHcSTHDHRHHHC`ttDsx{PtK|1ɈK}t.ALD9v+AE)Ds}HCpEt4HKpHCp$HKpHCpH1Hs}HH9|H[A\A]A^A_]UHAVSHIH1 HHtI>H&8AN$u I HED IHUH 8t5IHt+AF t#1ۉILHty$LeAF 9rH[A^]UHAWAVAUATSH8HII$IL$8EH5d E1L9>LDHLEHHEAD$$DI;D$uH8%HMŰC$EH%EH%8HEt蝂HHEHEH/ELE1E1H%8tILpMt3At8A~Pu<$HߋuLMLELMQ$ǃE1HǃpǃHF HHtH  A9} AA9|LH$xDE9E~ ZEuHHY$EЋC`8t(tHƃHƃH#8tNMtA~PuB*H9Ew7}LbH$xDu1H#8tu ǃLKyH#x@tHrD;(|HHHtLH8[A\A]A^A_]HHy0A,H@H?uA(Hq$<0y(tMUHH0H?HHuHFHFF HI81H0]UHAWAVAUATSH8IHIEEH5HE1L9&LDHLEH8IuH9uH|8*UHMK$MHr" MH "9HMtHHEIEIuHs MH MHE1H9E1H!8tILpMt3At8A~Pu<$HߋuLMLELM:$ǃE1HǃpǃH2HHtH { A9} AA9|LH!xDE9E~ FEu4HE!EЋC`8t(tHƃHƃH 8tNMtA~PuB~H9Ew7}LN H xDu2H 8tu ǃIEHI;ExH x@t H]D;8|H HHtLH8[A\A]A^A_]UHAVSIHHHtI>IHH8t5IHt+AF t#1ۉILHty$LWAF 9r[A^]Ð=Uu(H=UHtUHHUU]UHAVSI=qUtH=\U1C9UUsH=DU;UAF\HMIcEdHH}HL?HȾ#H9H0߭0TۅTH(߭(=cAP}Hu HHHwwHH!MIcudHHH}HHHH9HUH oH HUH HcI HHIHH1H9HNHIHHI_MGHHHHHIWXMg@IMXHA8IEXHx8^DEо,BMIcMdH|'HD HHHMHDHH!IO@(IW@(\EH~HJIG@1Y#IIG@HHHHH1H9HNHH)HH1H9@I@HH}HAH)Ѐ}HuHEHu}t H:IGH;HIHHIHIwJ4 H`H9HHLHOMHNHIAtIW`IOh)EAHuHhHZ@HHHHHDHMH D!J@E1;XLmE1L=mL-l HBHHtH k A9}AA9|H}A1A;E@fAuTHeD ;XuLxLmH*kD;0|HHHtH}IEXLxHhHHAHpHUtLH1HHt=H lH HUH H`HtHR1HIXHyH531HU}HutIF߃ HMw1HaHcHHU IO@1H_SHu,uIG(HH[A\A]A^A_]HU ػ1HHH9sRH Ht(mHHuHGHFHHH9rHtkHHt&mܨHuv+mHبHus,H=mH5z}3mDEHI_Hmt$HڨHu^ݍ@ݍHHH3@HBHH81H߭8H]1HHEHJH]HUH)H)HI+Ldd 4|S|UHjuH]UHAWAVAUATSHHML`HMA׉IH/h8u#nHiHHcHxL4IN@DHM`HEH:t/HT:u#HxHЃx u I~x3EEIvXtHF HEHhHX=F(PV(H=1HX7HRHHF HEHkXHPHhD%A@,D`'wL}ALJƀL}ALJALJ@@u ALJALJ%DELp]t$HU$t4"u8H0HUHU:`"t%$u)HH0HһHOH0HcdHӃ&HD0/+HU+A~dLY1LNHljHHHL$(HH@HD$ HL$IEHD$IEIMHL$H$1QDEȾ*Q`ƒ&-t8H;t-H;.D$DHcdHHEHH]H]I_@HuDnArH=niH5 /DEIHfMu9t31A@ƃHpA^ AT$ 19LUEVAv \9ECLMMtA1A>A|$dA>}A4HE0}1AAMtAHQ8DL0jCCACAMtAEMAC A6DA ADA8C@DKDHHX1EN8LL01L58HSHHHL$@HH@HD$8HL$0IGHD$(IIOIHL$ HD$HHHAHD$HHIHL$H$1:LMEAF AA~195LEVAv DL1A9EDCH}Ht7A43DAV$AN(LEN,ҍxA)A~99 LUD]E^A^ DPA)A19ACH}HtLUA<3A:1A>AF AFAF1AV A )ȅ A;F$*AYF(H,ΉA1u1H}L}LmAF HE]ELu}AA;F$ AF(tZuݍ``Hh߭hӋỦ)ˉ)u '1uݍppHx߭xAA)A)D9vNغH}H=PH5NLMEMmH}LMMEMLuI؋]D9A1LUL}LEEF E|$dIHH HH ؍{H H I>LMt%IHH HH ؍{H H I>u9eLED]AHEN,AAEDAED‰ЙAHcHH@XL@MtM9tI@AxA^9t9u9uMtxI@ыA;FuhAN,IHH 9LMvC)׃~:ۃANÉHH H HI8xIHH 9wșAAEN,AE9+1HMHMH}L}D]LMA~ A )ȅA;F$~*AYF(H,1҉)ЅDƉA1u1jEA>9L}HED|81A9DCHuANAV HtA2AAAtA~@E~DLmDHE81E@ljDA0A}AV@A^Dp1AAHUH_T1AAHUH;0AAFAAFAAF HuHAV A )ȅ~w9H}\ 1A )ʅ~Q4919OމAVA^ H}HtA:AAAN@AvD1AAH}HEwD׉;A]̈DA0At7AV@END-DA:DDAAtAv@AVDD]LMtAMAE}AAAL$d9u'1AAAA9tAAHAA@HgI8tAtDL'AID$XE1LpLpLpL0DH[A\A]A^A_]HH!CH ILEEAv EV$AA|19ABMtA1LMHUu A42 D։2DDA9AtA^@AFD˸AVAv Ht7A:A0AAN@A^DUHAWAVAUATSHIIAIHGHIcL$IL$@ID$XHHX sE1A#^K PE19AMMDS{ L9ADCMt 19AUMtA?9A A D9LMLHLpA^A߃ LM)H HcHЉ]A>A^ AT$ 19LUEVAv \9ECLMMtA1A>A|$dA>A4HE01AAMtAHxF8DL$nCCACAMtAEMEC A:DA ADA8C@DKD HHX1E-LL01L,HHHHHL$@HH@HD$8HL$0IGHD$(IIOIHL$ HD$HHHAHD$HHIHL$H$1/LMEAF AA~199LEVAv DL1A9EDCH}Ht7A43DAV$AN(LEN,ҍxA)A~99 LUD]E^A^ DPA)A19ACH}HtLUA<3A:1A>AF AFAF1AV A )ȅ$A;F$*AYF(H,ΉA1u1H}L}LmAF HEH`߭`Lu}AA;F$AF(tZuݍhhHp߭pӋỦ)ˉ)u '1uݍxxHEmAA)A)D9vNغH}H=aEH5LMEMr mH}LMMEMLuI؋]D9A1LUL}LEEF E|$dIHH HH ؍{H H I>LMt%IHH HH ؍{H H I>u9fLED]AHEN,AAEDAED 1AЉHHRXLBMtM9tIPAxA^9t9u9uMtyIPA;FuiAN,IHH 9LMvC)׃~:ۃANÉHH H HI8yIHH 9w1҉AAEN,AE9*1HMHMH}L}D]LMA~ A )ȅA;F$~*AYF(H,1҉)ЅDƉA1u1jEA>9L}HED|81A9DCHuANAV HtA2AAAtA~@E~DLmDHE81E@ljDA0A}AV@A^Dp1AAHUH_T1AAHUH;0AAFAAFAAF HuHAV A )ȅ~w9H}\ 1A )ʅ~Q4919GމAVA^ H}HtA:AAAN@AvD1AAH}HEwD׉;A]̈DA0At7AV@END-DA:DDAAtAv@AVDD]LMtAMAE}AAAL$d9u'1AAAA9tAAHAA@H>8tAtDLlAID$XE1LpLpLpL0DH[A\A]A^A_]HH!CH ILEEAv EV$AA|19ABMtA1LMHUu A42 D։2DDA9AtA^@AFD˸AVAv Ht7A:A0AAN@A^DUHAWAVAUATSH(IAIH<HIcL1H ;@~Au~HۧD8A]ߋuAԅtHD;0|HQHHtH}ЉH[A\A]A^A_]UHAWAVAUATSPIAIH1H9HIEHHEHEHVD0Aׅur1HӋHHtH  9} 9|H}HQ1H ;@}Au}HD0LDAׅtH;|#HhHHtH}H[A\A]A^A_]H[A\A]A^A_]UH]鰋UH]馘UH]黥UH]鍳UH]UHAWAVAUATSHHIHHcHHH@H H@XHHY@DaDA)AD+uǁHMHHLiHHHLHDHUHޥD2IE19ssE1 HUHHtH  A9}AA9|H}H1H u;@n|Au\|HmD0AE9rH?D;8|HHHtH}HEǀEeH[A\A]A^A_]UH]UHAWAVSPHHHcHHH@HuLH@XLpIv`I^hH)HAH)u AdžLxIAdžI_H[A^A_]UH]UH]iUHH]8t;HYHHc?HHHH9t!H@XH@t 1E1]4]UHH8t-H HHc?HH@XH@t ]]UHAWAVAUATSPHc?HHHL5A>t#HCXLxAt 1E1HC@HtH[A\A]A^A_]HCXHHA>uLxE@LiL%I$HLHDHUHGD2I1D9sl1LHHtH  9} 9|H}HA1H ;@yAuyHޢD0AED9rH;/HXHHH}H[A\A]A^A_]UHAWAVSPHc?H|HHL=fA?tHCXLpAt ~HC@Hu4HCXHXA?uLpHԆHHHtHAH[A^A_]UHAWAVAUATSHHIIIHHHEHL3ML}IH=54H;HHHtHHHt H=c1HL5IHtAH=cIH"HHt>H=cIHHHt1H=c(H 1HH HHH1H HHcHHtH=RL3LL}HMI};Hx;Hx;HHþ;HuIHHHEI}HHEL}LeHEHEA>t9HHHt*H H1H1LELSSSH H~HH;EuHH[A\A]A^A_]tUHAWAVSPHc?HHHL5A>t#HCXLxAt 1E1HC@Ht H[A^A_]HCXHxA>uLxIw`HH[A^A_]UHAWAVSPHc?HJHHL=4A?tHCXLpAt LHC@Hu5HCXHXA?uLpHHHHtHAHH[A^A_]UHAWAVAUATSPIIHHHHLHDHMH D1IM1L9sr1L%q HHHtH Y 9} 9|H}H1A;$@1uAuuH0D0IEL9rH;|#HHHtH}H[A\A]A^A_]H[A\A]A^A_]ÐUHAWAVSPL5ML=FmC)t8LLSÃuH[A^A_]UH]UHAWAVAUATSHHu? u&HHH#HH[A\A]A^A_]uHHHtHH H<L-AML5AD9~AsDusHtL}AGH]IDeAAAU lsu D#t>L HAMAD9‹Uԃu&sH7HȀHHtHH[A\A]A^A_]UHSP1ۃu-7uHHHtЉH[]UHSPHH_HHtHHH z HkD 19@crH[]UH]UH]UHSPH9uC1HCH[]UHSPH9u KK@1Ƀu73u HxHHtHCH[]1OuUH]UHG]UH1G]HpH9tUHHxHH]UHGO9uHHt1]UHGO)GH  HD 9p]UHHGHGGG G$]UH1HGHGGGG G$]UHAWAVSPAHC D9u C$E18AsC9tH{HHC$ADs DH[A^A_]UHG 9uO$+GW19uLGPAuG$Ɖw ]ùO$1u@UHG GO)GH  HD 9}o]UHHGHGGG G$G$]UH1HGHGGGG G$G$]UH]UHAWAVAUATSH(IHHHcL1Ƀ{u6HS1ɾ12u#HGyHHtHйK$ADs [A^]1O$uUHG ?]UHHG1GGGGG H?G$]UHW)1GGGGG G$]UH]UHAWAVAUATSPIAMf@I^M~HuxHHtLHѓD(QH H  H D 19@jAuyjHD(I^M~HL!IL9rHxHHtLMI~(HtM;f Mn 8=WA)EEn0HZ H   HD 9~Ar|cHL A1MIF@HL)HL9vSEH\EI9vJ<'HEtHLH2H1HHIuM~(IFEf0I^IF@IF H[A\A]A^A_]UHAVSHLs@HCHKL!H1L9u2HS@IvLH2u HvHHtHL[A^]UHAWAVSPHHLwLHvHHtI!KH[A^A_]UHAVSHE1LsLsC0GHCW)C Ls@LǃǃH^]UHSPHW)H{tH{a;HCH{(Ht K;HC(1HCC0HC HC@HǃH[]UHAVSAHD9u 1HAD[A^]UHAVSAHD9u%H#tAD1[A^]1uMUHAWAVSPLJHHLwLHtHHtI!KH[A^A_]UHAVSHE1LsLsC0eEHCW)C Ls@LDHD[A^]UHSPHBǃH[]UHAWAVSPIE>Et&A^HH9AuADAN!AH[A^A_]UHAWAVSHHIL=>AGutupH^H [H]о1H1HHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1AGNEكELƉqHHH8HH[A^A_]UHD6]UHAWAVSHhHHM8Hu`H%^Lu1LSHHHHL$(HH@HD$ HL$IFHD$IINHL$H$1HHugH]1Luо1LHHHHL$(HH@HD$ HL$IFHD$IINHL$H$1HCH H;D{L5AvAF9tI~HLH0J HH JAFAN)AFH  HD 9cHh[A^A_]UH]UHHG1GGGGG G$H?G@GDHmOL@GH]UHHG1GGGGG G$H?]UHW)1GGGGG G$]UHW)1GGGGG G$]UHAWAVAUATSHAIHsC9tH{H|H[EHN$MtI $H J DuD5CD D;52DuzL}D$AIH5 LH=L=r5D9s#AE@@H JIM9uC6L}HLLH@>H H()()H2fHnH0fHnflfH"fHnflf fHHfHnHfHnflfHfHnflf fHHfHnHfHnflfHfHnflf fHHfHnHfHnflfHfHnflf fHH[]UHHw]UHHw]UHHw]UHw(]UHw(]UH剷]UHHG]UHHG]UHHG]UHG(]UHG(]UH勇]UHAWAVAUATSPE1L5SE1KHtH;L/G1L#MLuKII uЋtN1L5H  H щځHH<HtL<DAI?0Z9r=FH=7r#1ۉH<0Ë( H=9r0H H[A\A]A^A_]UH19]UHAWAVSHhAHH@8Hu`H)VL}1LFHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HHugHU1L}о1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HHKH;DHh[A^A_]UHAWAVSHHIxlA9u`HUL}о1L7HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1LDHH[A^A_]UH]UHt.ttuDu]UHAWAVSHhAHHD8Hu`H:TL}1LJHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1 HHugHS1L}о1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HHKH;DHh[A^A_]UHAWAVSHhAH=w`H1SL} 1LAHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1Exu~lD9t`HRLuо 1LHjHHHL$(HH@HD$ HL$IFHD$IINHL$H$1HHh[A^A_]UH]UH]UHAWAVSHhAHH8Hu`HRL}1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HHugHQ1L}о1LH:HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1VHHKH;DHh[A^A_]UHSP1ۃu-7uHeHHtЉH[]UH1]UH1]UHAWAVSHAHu`HjPL}1LH*HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1FH9[t`HPL}1L!HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1C$t`HOL}1LH\HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1xExjC D9u`H-OL}о1LJHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1 sC9tH{HQH0ADs HĘ[A^A_]UHAWAVSHxAHH9t`HwNL}1LH7HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1S{$t`HNL}1L.HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1C D9u`HML}о1LHgHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HDIADs Hx[A^A_]UHAWAVSHhIM96t`HML}1L+HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1AF 9u`HLL}о1LHdHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1LgA^ Hh[A^A_]UHAWAVSHxAHH9t`HLL}1L.HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1t`HKL}1LHhHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1ExmD9u`H6KL}о1LSHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HADHx[A^A_]UH]UHAWAVSHHAH{u`HJL}о1LHQHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1mHDHH[A^A_]UHAWAVSHxAHu`H,JL}1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1H9[t`HIL}1LH\HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1xC$u`H^IL}о1LQHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HDSHx[A^A_]UHAWAVSHhAHH9t`HHL}1LHfHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1{$u`HjHL}о1L]HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HDHh[A^A_]UHAWAVSHhAHH9t`HGL}1LHrHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1u`HsGL}о1LfH HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1%HDHh[A^A_]UHAVSAHC@CDtCDHD[A^]Cu MCuH t[A^]UHSPOLѺƒttuG@D1;GHw/G@*GtH=H5E)۵H[]UHAWAVSPAHAu CtNrȃuu LCuEAGAuHDH[A^A_]H[A^A_]UHAWAVSHAHucHqELp1L~H!HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1=H9[t`HEL}1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1C$t`HDL}1LHSHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1oC u`H9DL} 1LIHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1ExqC ~jC D9t`HCLuо 1LHvHHHL$(HH@HD$ HL$IFHD$IINHL$H$1C CK)CH ; H,D 9%JHĨ[A^A_]UHAWAVSHAHH9t`HBL}1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1{$t`HBL}1LHLHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1h{ u`H3BL} 1LCHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1C D9t`HAL}о 1LH|HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1C HD5HĘ[A^A_]UHAWAVSHxAHH9t`H,AL}1LL} 1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1Ex{A$xoA$D9t`HP>LuȾ 1L`HHHHL$(HH@HD$ HL$IFHD$IINHL$H$1ADŽ$I$HMt$M|$H|RHHtLI!KHĐ[A\A^A_]ËGt UHj]ոUHAWAVSHxAH{u`H=L}1LwHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$16=w`H-=L} 1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1D9t`H<Luо 1LHEHHHL$(HH@HD$ HL$IFHD$IINHL$H$1a1Ku HhHx[A^A_]UHAWAVATSHAIA$ucH"<Lh1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1M9d$t`H;H]1HH<HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1XAD$$u`HN;H]1H/HHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1AD$ u`H:H] 1HHiHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1AD$ D9t`Hy:H]Ⱦ 1HZHHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1LHİ[A\A^A_]UHAWAVSHAHH9t`H9L}1LHjHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1{$u`H9L}1LaHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1 { u`H9L} 1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1C D9t`H8L}о 1LH4HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1P1K$uC HDHĘ[A^A_]UHAWAVSHAIM9?t`H 8H]1HHHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1Au`H7H]1HH#HHHL$(HH@HD$ HL$HCHD$HHKHL$H$1?Au`H57H] 1HHHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1AD9t`H6H]о 1HHKHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1gLHĘ[A^A_]ËGt UH] G@ËGt UH]ոUHAWAVSHxAHu`H5L}1LHwHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1H9[t`Hm5L}1LnHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1-C$t`H5L}о1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1CS19uHSp2u ADs Hx[A^A_]UHAWAVSHhAHH9t`H[4L}1L\HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1{$t`H3L}о1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$11Ƀ{u3HS1ɾ12u HHHHtHADs Hh[A^A_]UHAWAVSHHIM96t`H63L}о1L7HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1LtA^ HH[A^A_]UHAWAVSHhAHH9t`H2L}1LHCHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1_t`H62L}о1L7HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HUt ADHh[A^A_]UH]?UHAWAVSHHAH{u`H1L}о1L蓿H6HHHL$(HH@HD$ HL$IGHD$IIOHL$H$1RHDHH[A^A_]UHAWAVSHxAHu`H71L}1LHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1H9[t`H0L}1L螾HAHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1]C$u`Hi0L}о1L6HHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HDHx[A^A_]UHAWAVSHhAHH9t`H/L}1L訽HKHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1g{$u`Hu/L}о1LBHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1HDHh[A^A_]UHAWAVSHhAHH9t`H.L}1L贼HWHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1su`H~.L}о1LKHHHHL$(HH@HD$ HL$IGHD$IIOHL$H$1 HDHh[A^A_]UHAVSHC@CDtA-UA"D;u'E9zAA$A$AmHEHEOȉȋuHUЉDA$A$)AMt1HE1u1A9AHEA HuHE01HUD!HUljAA$A$)A}t=9=>H=<H5*CDmLEEGEEIDmC9}A M31HEu1A9A HX011Duȃ)udAA9ABՋ]BMA$A$AMHEȍ@1A9AA$M1A9A uA AA$A$)AA$}t69} AMt)9A9 $ AA9679~ AMt)9A9 $ AA9}A D7EH>HHHX8IxHE\A"u1DuȃHcEDLHHH[A\A]A^A_]+UHAWAVAUATSHHLEIAӉIM HMuH}H H Hy19HcHUH HMut4HLMEMM謨uMHMEMt~4A LeA4$9r2FL莣MHMEMLeA4$A 9sMtAE1AI|AL}IG@DHHHH]HDh L}IG@HHEHuHE HEȃu5MtAt AA+$ A$A+ЉHH[A\A]A^A_]ËEԉۃU]t u ))t )1u)1Dp9tbEu]H  tPH}HLDuMDmEMMBHMLeH}ML}EDmMDuA!t>A-UA"D;u'E9zAA$A$AmHEHEOȉȋuHUЉDA$A$)AMt1HE1u1A9AHEA HuHE01HUD!HUljAA$A$)A}t=9w=>H=3H5$CDmLEE>EEIDm>9sA M.1HEu1A9A HS011Duȃ)udAA9ABՋ]BMA$A$AMHEȍ@1A9AA$M1A9A uA AA$A$)AA$}t59s AMt)9A9 $ AA9w239v A1Mt)9A9 $ AA9sA D7EH9HHH S8IxHE\A"u1DuȃHcEDLHHH[A\A]A^A_]&UHAWAVAUATSHhLMLEIAщIHM HMHUL]H H HcHuH HMH `9t2M܉HLMEM覣HMMEMHtH~8HEH0HEHH9|6JL腞HMMEMHEHHEH0H9}MtAI1AI|AL}IG@}H HHH}H@ EL}IG@L A$HuA$ HEHu1MtAHFH)H)HфHEI Hh[A\A]A^A_]IIH]LxtHuHH)0HH)(IքtHH)1LHHHH)1ILHXH]H9tZH}uSH  tFL]HULHEMDMMHUL]MML}AMHEA!LmtFA-A"HMH;M<uH;uHHMHHHMMLNLHHMHI MHHHH}HHH)HHUHMP1I1Hu1H9A5H}HHuHEH0H1HIDII!LHuHHLuIIH)HH}t4H949H=H5CMDAMLmH9}HEHMHE1I1H9A HUHN1HEHu)MHHLE1H9HBHxIBIHLuIHMHHIHHHMHMHE19EHMHHMHM1H9A HHHLuIHMHUHHuHHL)HHH}tDH9} HEH8HMt)HH+UH9HMH9H HLmAH9GLH9~ HHEH8HMt)HH+UH9HMH9H HLmAH9}HEHHEI}AH3HH.HaM8IxA$\A"u1HEHuIHILHuLHh[A\A]A^A_]%!UHAWAVAUATSHhLMLEIAщIHM HMHUL]H H HcHuH HMH 9t2M܉HLMEMHMMEMHtH~8HEH0HEHH9r6JLۘHMMEMHEHHEH0H9sMtAI1AI|AL}IG@}H HHH}H@ EL}IG@L A$HuA$ HEHu1MtAHFH)H)HфHEI Hh[A\A]A^A_]IIH]LxtHuHH)0HH)(IքtHH)1LHHHH)1ILHXH]H9tZH}uSH  tFL]HULHEMDMMpHUL]MML}AMHEA!LmtFA-A"HMH;M<uH;uHHMHHHMMLNLHHMHI MHHHH}HHH)HHUHML1I1Hu1H9A1H}HHuHEH0H1HIDII!LHuHHLuIIH)HH}t4H9w49H=IH5CMD[AMLmH9sHEHMHE1I1H9A HUHH1HEHu)MHHLE1H9HBHxIBIHLuIHMHHIHHHMHMHE19EHMHHMHM1H9A HHLuIHuHUHHMHHL)HHH}tKH9sHEHHMt(HH+UH9HuH9H HLmAH9wFKH9v HEH1Mt(HH+UH9HuH9H HLmAH9sHEHHEI}EH:.HH2HG8"IxA$\A"u1HEHuIHILHuLHh[A\A]A^A_]UHAWAVAUATSH(LEHMUIE(EDu LmHEHEH&19t^MϾLwEt~"MAHM;|"5LoHEЋMA;}LOMEAHHHcHDP D@dHH@DAuA9HEЋ0)/AtEM~&A9HEЋ0)1A$HEЋ0A9)MHEЋ0A9)1ALmȍH)A?D9vdLMHED11҉AA)ur9BACAHMAAEH}HIA1D97E9DHMD1D1EuE1AHMȋ HUD)AEE9H}} AEHtD)9HU9  ‰AE9~AMHM9A AME1HMD1HUHE9 9H}~ AEHtD)9HU9  ‰AE9}AMHM9} HMȉTAuA]HEЋ0)MGAMtA|%A]HEЋ0)1A#HEЋ0A])HEЋ0A])1A!"HD911҉AA)AA9ABDBAHMЉADHMȉHMHAE9|rgUҹOʉADA7DH]33D)HuȉH)? 11AA9 H=̼H5KH([A\A]A^A_]ւA9s|EDHMЉ1HMȉ1uADAHMDD)DHuȉE ~b9} HUHt:tD)9~HM9~9bbHMD1HMD1HtOA9tJtD<9~ HUHt:tD)9}HM9}9}H([A\A]A^A_]UHAWAVAUATSH(LEHMUIE(EDu LmHEHEH19t^MϾL;Et~"MAHM;r"5L3HEЋMA;sLMEAHHHcHDP D@dHH@DAuA9HEЋ0)/AtEM~&A9HEЋ0)1A$HEЋ0A9)MHEЋ0A9)1ALmȍH)A?D9vdLMH@D11҉AA)ur9BACAHMAAEH}HDA1D92E9DHMD1D1EuE1AHMȋ HUD)AEE9H}s AEHtD)9HU9  ‰AE9vAMHM9A AME1HMD1HUHE9 9H}v AE1HtD)9HU9  ‰AE9sAMHM9s HMȉQAuA]HEЋ0)MGAMtA|%A]HEЋ0)1A#HEЋ0A])HEЋ0A])1A!"HD911҉AA)AA9ABDBAHMЉADHMȉHMHAE9yodUҹOʉADA7DH]33D)HuȉH&?11AA9H=H5\KH([A\A]A^A_]}A9s|EDHMЉ1HMȉ1uADAHMDD)DHuȉE ~b9s HUHt:tD)9vHM9v9w__HMD1HMD1HtLA9tGtA99v1HUHt:tD)9sHM9s9sH([A\A]A^A_]UHAWAVAUATSH8MHMỦIHE(HEL} HuHEHEH8HuLMtdLMMt~LMII;LILMI;HuM}LֈHuLMMIH?HHcHDX HdHMHH@DDIMuI9IHH)=ItM~!I9IHH)1III9HH)II9HH)1IHHH)H>L9IH<;D1HIHA)LHI1I9IBICHIIIIHHHEHL}MtA1E9AMuI'EI9MM.M.HML)M)HHIHEHLMML)LH}HMI~|H9LE}L?LMutHL)H9I9 AH9~HHI9}I HUH M)M.L}MEI9 AtH9LE~IOHMutHL)H9I9 AH9}HHI9} HEH&Iu IHH)2ItII|HH)1IIHH) HH)1I!ty"HpH;u1HHuA)HI1I9IBLBHIHIILHHMHMyHEA9"eHUHҹHOHIHuHH}H7LHI6I6L)HHuHMA81H1HuI9H=^H5% KH8[A\A]A^A_]hxI9srMLIHMHiHHILIML)LLMIMI~XH9}M9LMtA8tHL)H9~I9~AH9[\HML)M.MtMI9tHAtAA8H9~ IM9LMtA8tHL)H9}I9}AH9}I H8[A\A]A^A_]UHAWAVAUATSH8MHMUԉIHE(HELu HEHEHEHEH8tZMϾLوMt~ MII;Er 3LӃIEMI;sL赃MMIH#HHcHDP DxdHH@DDIuI9I]HH)HuHItMHu~'I9I]HH)1I%I]I9HH)HuI]I9HH)1IHHH)H>L9vzLMH 6D1HIHA)L}HI1I9IBICHIIUIUIHHHEHL}MtA1E9AuAEI9MMuMuHML1M1HHIHEHLMEMEL)LH}HMIUH9L}usHHMtHL)H9I9E AH9vHHI9MI HUH M1MuL}MEI9 AH9L}uv H1MtHL)H9I9E AH9sHHI9Ms HEH;Iu I]HH)4ItII]|HH)1II]HH) HH)1I!t{"HpH}H91HHHA)HI1I9IBLBHIHIUILHHMHMA91uHUHҹHOHIHuHH}H7LHIuIuL)HHuHM*A? 1H1HuI9H=$H5KH8[A\A]A^A_].sI9s~MLI]HMHuHHILIMUL)LHuHMIU~bH9sHHMtA?tHL)H9vI9MvAH9w]^HML1MuMtNI9tIAtBA9H9v H1MtA?tHL)H9sI9MsAH9sHH8[A\A]A^A_]UHAWAVAUATSHMMII҉IDME}EHN19t}Et ~5E9|5oLDELUL]~L]LUDMDEE9}HHHHL$XHH@HD$PHL$HHCHD$@HHKHL$8HD$0IFHD$(IINHL$ HD$ID$HD$I$IL$LeL"1L跂L#LăH1H荂H0HHHL$XHH@HD$PHL$HHCHD$@HHKHL$8HD$0ID$HD$(I$IL$LeHL$ HD$IFHD$IINHL$H$1HL 1LH8HDHHHHL$@HH@HD$8HL$0HCHD$(HHKHL$ HD$IFHD$IINHL$H$1肄HEID$H}kLhLsHP1HH]UHSHH]1HSHi ʚ;HcCHiHH[]UHAWAVATSH H]1HSL;HcCLiRII$RH9rH`yL)HfHnfb_f\_f|Y:_f)EH]1H)SHHcKHiL)Hiʚ;L)HfHnfb<_f\D_f|f(U^^f(\H,HH1H,f.HCHH [A\A^A_]UHHHH 9HMLEHS1ɅH]UHH HmHHEH}8RH ~ ^f.vE=|f.^r ^f.vEuf.^r E,H H H;MuH ]RQUHAWAVSHxRQD8H7Lu1LQH]HDRHFmHHHL$@HH@HD$8HL$0HCHD$(HHKHL$ HD$IFHD$IINHL$H$1HTHx[A^A_]UH]UHAWAVATSHIA;)_IH5n)QÅHL}1LPLeLQHhlHHHL$@HH@HD$8HL$0ID$HD$(I$IL$HL$ HD$IGHD$IIOHL$H$1gSIH5(PÅHE_L}1L+PLeL>QHkHHHL$@HH@HD$8HL$0ID$HD$(I$IL$HL$ HD$IGHD$IIOHL$H$1R6(AHİ[A\A^A_]UHYH=] UHYH HH=] UH>WH HH=]/UHSPH|YH=HH[]UHSPHVH=HH[]UH7YH=?*]XUHVH='*]yZUHSPYH f8ukH5:1҉H[]hUHAVSXAHe8ukH511DguD111E1E1DlHgHIcHH@@H111E1E1DHLM1LDHMLE tMLOHML!ÉH[A\A]A^A_]UHAWAVATSHIIJL%DLo?LM1LLMtH}HHOIH[A\A^A_]UHFJ111E1E1ɉ]rUH]UHAWAVAUATSHLMLEHIIII݅LE^LE1HtM9r{M9vvLMMILNMH="ALMMju$=HE1LM1H=WDHMML+tHHHIADH[A\A]A^A_]UHAVSHIHGIH=LM1҉HM*tH}HHOIH[A^]UHAWAVAUATSHLMLEHIIII݅LE:KE1HtM9r{M9vvLMMILNMH=#ALMMjuL8LM1LLM%tH}HHOIH[A\A^A_]UHAWAVAUATSHLMLEHIIII݅LE[EE1HtM9r{M9vvLMMILNMH=DALMMju!6HE1LM1H=tDHMMI$tHHHIADH[A\A]A^A_]UHAWAVATSHII@BL%3L7LM1LLM#tH}HHOIH[A\A^A_]UHAWAVAUATSHLMLEIIILHۅIE DE1MtM9rxM9vsH۹ILNME1H=EALIjAV4HLM1H=qDHMLE#tIHHHUH ADH[A\A]A^A_]UHAWAVATSHIIAL%+Lm6LM1LLM"tH}HHOIH[A\A^A_]UHAWAVAUATSHMMHMAHH}BAH=At|txH]EtH=DDMHHNLH A H=mDLMH]SAVRH]Sj"WAUu/HH]H@H=8DVH]HMMILNMH= "DMjS'3H([A\A]A^A_]UHAWAVSPIIHMLE HE(U71ۃ"LISu02HLLH[A^A_]UHAWAVAUATSHMMHMAHH}AAH={At|txH]EtH=`DD躥MHHNLH 7A H=&DLMH]SAVRH]Sj#WAUuHH]H@H=DUH]HMMILNMH=#DMjS1H([A\A]A^A_]UHAWAVAUATSHMMHMAHH}@AH=jAt|txH]EtH=gDD詤MHHNLH &A H=-DLMH]SAVRH]Sj$WAUuHH]H@H=D~TH]HMMILNMH=$DMjS0H([A\A]A^A_]UHAWAVAUATSHMMHMAHH}p?AH=YAt|txH]EtH=nDD蘣MHHNLH A H=4DLMH]SAVRH]Sj%WAUuHH]H@H=DmSH]HMMILNMH=%DMjS/H([A\A]A^A_]UHAWAVAUATSH(EMIHUHuHDeHHHEM>DHU E1EMEAOD'MMDH=Z(DH]I*HM~8tYH]1HK&HAHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1 )-H=HH[]UHSHHH=8tYH]1H%HaAHHHL$(HH@HD$ HL$HCHD$HHKHL$H$1}(Y-H=?HH[]UH]UH]UH]UH]UH]UHAWAVAUATSPIHuHFHE1HMH N4MLHsLsLL{MtBAu/I8t;H= @H5=LL}LH}MuHMHJHAII9_H[A\A]A^A_]UHAWAVAUATSPIIMtdL%wLL;LkMt>Au+I8t;H=q?LLL}LH|MuH[A\A]A^A_]UHAVSIHHL[A^]|UHAWAVAUATSPIAHx<HIcHM$M$Mt"HL9HLq|IDŽ$MMf@LD*IFLD*LuM6MI$uHpHt 1D4M,$Mt$MtBAu/I8t;H=&>H5CHL{HL{MpLuAu=I8tH==H5;HLH[A\A]A^A_]J{H[A\A]A^A_]UHAWAVAUATSH(IAHuH:HIcL,MxAD$ tIpHz\ EHuȉMLMLEH}I$uYaHDH4HLyHXHHHW@HHHH9uI$LxyHH{@W)*)ǃI^I$HADHLDMuuu6H H}t1H([A\A]A^A_]DLH([A\A]A^A_]hUHAWAVAUATSHhDEHxHpIAD}ELeDu?LmMcDM](HELpE1K RItIHtHM9}CI|LL H7HHH;qu!GÈ_ $È_HAHuIIL;UuLHHEEADŽ$H8HDuIcHHEHMI$HEE11HEO|mH]JH/H}HxHEH@HEBDL}HEL`MI$H{tUL{@LD&H{t4L3H}awHMHMHLpDuHHEHELD&Md$MuH]HsH}HCLeH]uH]HtWH{tPL{@LD&H{t@HEHH}vHMLeL HXH]HHEHE LeLeLD&}tXHtBu0H8t;H=9H5WH}HwHEH@HEHMHDu*H]L{H} vHML LxHCVHtBu0H8t;H=8H5ÑH}HvHEHEL`IL;mH86HHMHHED}2LHHEADŽ$H6HIcHHE1HEEiI$HEDHE1E1HMHIHE IIH}HxHEH@HEH]ADHEL`MI$H{tNLk@LD#H{t-L3H}tHMHMHLpDuHALD$Md$MuH]HsH}HCLeHMH]lH]Ht[H{LetTLk@LD\#H{t-HEHH} tHML HXH]HALDs#LeHMȀ}t\HtFu4H8t;H=6H5H}HktHMHEH@HE HUHDu.H]LkH}UsHMHML LhHCZHtFu4H8t;H=D6H5 aH}HsHMHEHEL`HH;ME1HpID$HEBD8HU Hh[A\A]A^A_]UHAWAVAUATSHH@EAAH1HH$DD H3HIcHLxAE tHpHt x\IH$W)GHL$LL$!H$@DIHE1Ht$HADEt$ATt$0H tfDl$ H$HD$ HD$(Dl$8D9(~AL-L|$ Ld$ AEHE1HDLMPH$HHH;$uHe[A\A]A^A_]XUHAWAVSPHIIHHHH11IvLcJ H9t/H@Hu pH1HHHHIJHPJH[A^A_]ÐUHH08HA1HHcHȍJsHH@1ti9uccu/HxHHt11Qt6u//H=b3H5w\H=M3H5bWe1]UHSPH/1ۃ8H0HHcHȍJs3H@@te9t\H=2H51@u#HxHHt#1ۃxH=2H5H[]UHAWAVATSAHH/HIcHL`@'H/E18A$Hw:H HcHHDADŽ$HDALH=1H52HDADŽ$AH=1H5ߊD[A\A^A_]f||UHSPHE.8tMd H .H HHKsH@@9#uHxHHt x1H[]UHHc]UH]܊H,8u UH赀]H3H,8u UH蕀]HHUHSPH 3.H HH4V H[]UHH .H HHHcJ H5>t:HB@H,:HtHHxzFtHHx@H1]UH]鳇UH]餇UH]镇UH]鋇H+8u UH]Hm,UHH+~ u HƵ8]UH]UH]UH1]UHH]UH]UH]UH]UH]UHSPH߉H[]aUH1]UHH-+8u4H ,H HHHx@L]UHH v,H HH@ ]H*8u UH~]H,H*8u UH~]H+UHAVSAH ,H HHHJ`EHx@D[A^]UHVH +H HHHx1yD]UHAVSA%H +H HHH_EHx@E[A^]UHH y+H HHHx1yE]UHH N+H HHHxxtHH@1\ HHH1y]UHAVSAljD[A^]bUHAVSIH^HL[A^]dUHSP@ljH[]aUH(]vbUHH *H HHH@@\]UHH z*H HHH@@]UHSPljH[]dUHSPljH[]jeH(8u UHZ|]H)H(8t*UHiH )H HHHx@]1UH<H )H HHHx@\]UH1]UH1]UH]UH]UH1]UH]UHH p)H HH HyxtyLA@DAAHADEHE~DʍzD9~DυuEut 1MD9 I ]UHHH (H HH 1HyxtsLA@DAAHADEHE~DʍzD9~DυuEut 1MD9A]UH1]UH]UH1]UH]UHAVSIH1HL[A^]QUHAVSIHb1HL[A^]UHSPHA1HH[]UHSPH!1HH[]tUHSPH1HH[]>UHSPH1HH[]sUHSPH1HH[]UHSPH1HH[] UHSPH1HH[]xUHSPHa1HH[]UHSPHA1HH[]UHSPH!1HH[]UHSPH%8uxH]H螸H[]UHSPH$8uxH]HUH[]UH]y\UH]@`UH]`UH]aUH]cUHH}]UHHj]UHSPH H߉H[]0H5$8u UHw]H$UH]H $8u UHw]H%UHHc?]ɁUHH?]鼁H#8u UHw]HH#8u UHuw]HHUHSPHH %H HH4V ;H[]UHaH $H HHHcJ H5}>t:HB@H#:HtHHxzFtHHx@H1]UH]~UH]~UH]t~UH?]h~H"8u UHv]HJ#UHH"8u~ H ]UH]UH]UH1]UHH]UH]UH]UH]UH]UHSP$߉H[]{XUH1]UHH "8uvH w#H HHHx@L]UHH R#H HH@ ]H!8u UHqu]Hg#H!8u UHu]H!UHAVSIfH "H HHH&WA>Hx@D[A^]UH1H "H HHHx1yD]UHAVSIH "H HHHVA>Hx@E[A^]UHH S"H HHHx1yE]UHH ("H HHHxxtHH@1\ HHH1y]UHAVSIHY3A[A^]YUHAVSIH7HL[A^]ZUHSPH3H[]XUH]NYUHH w!H HHH@@\]UHH R!H HHH@@]UHSPH3H[][UHSPH3H[]@\Hl8u UH0s]HH\8t*UH?H H HHHx@]1UHH H HHHx@\]UH1]UH1]UH]UH]UH1]UH]UHH F H HH HyxtyLA@DAAHADEHE~DʍzD9~DυuEut 1MD9 I ]UHH H HH 1HyxtsLA@DAAHADEHE~DʍzD9~DυuEut 1MD9A]UH1]UH]UH1]UH]UHAVSHI]H 1L[A^]'UHAVSHI8H 1L[A^]UHSPH1HH[]^UHSPH1HH[]JUHSPH1HH[]UHSPH1HH[]IUHSPH1HH[]jUHSPHw1HH[]UHSPHW1HH[]NUHSPH71HH[]UHSPH1HH[]UHSPH1HH[]UUHSPH8uoH]HtH[]UHSPH8uqoH]H+H[]UHH?]LSUHH?H6] WUHH?H6]]WUHH?H6]WUHH?]ZUHH;]UHH(]UH]zH8u UHn]HUH]hH8u UHn]HUHAWAVSHHMHHE,qHH@@E1DxL57jHH1HL H1HLH.1HLHJ1HLHf1HLH H1HLH H1HLHTD98H qL5qIDH55wL=Lw1HLRH5Fw1HLL;H3H= 1HHHH;EuH[A^A_]cUH#u]ÐUHSH^NV [H]Ð/ffff.?fff.ffff.UHSVRHHHHHHHHH)HHH)H)HHt$HLHHHH2Vg HH}HuMHMIKHMICHIIKHIIHH]H]ffff.1H H fD%%%%%%%%%%%%%%% % %%%%%%%%%% %"%$%&%(%*%,%.%0%2%4%6%8%:%<%>%@%B%D%F%H%J%L%N%P%R%T%V%X%Z%\%^%`%b%d%f%h%j%l%n%p%r%t%v%x%z%|%~%%%%%%%%%%%%%%%%L~AS%~hhh$h4hDhThchshhhhxhnhdhZhPh Fhh4h*h hh hhh h0h@hPh_hnhhhhhhhvITT-API-Version 0.0.0 (20111111) @(#) $Revision: 43375 $  @ @ | 7@(#) Intel(R) OMP alternative compiler support: yes@(#) Intel(R) OMP API version: 5.0 (201611)y7Y !zCWwAgbk^iyt(1:Mw)i:wƭKgoM_ïh"_$-E IyI?''}՗la=Z^F=[{h.'`)nT M*T{BXTEH(  ư>f@@@(#) Intel(R) OMP Fortran __cdecl OMP support: yes@(#) Intel(R) OMP Fortran "extra" OMP support: yes~S3@(#) Intel(R) OMP performance library (dynamic) ver. 5.0.20140926 @(#) Intel(R) OMP @(#) Intel(R) OMP version: 5.0.20140926@(#) Intel(R) OMP library type: performance@(#) Intel(R) OMP link type: dynamic@(#) Intel(R) OMP build time: no_timestamp@(#) Intel(R) OMP build compiler: Clang 9.0__itt_api_finipthread_mutexattr_initpthread_mutexattr_settypepthread_mutex_initpthread_mutexattr_destroy__itt_api_init__itt_domain_create__itt_string_handle_create__itt_pause__itt_resume__itt_thread_set_name__itt_thread_ignore__itt_thr_name_set__itt_thr_ignore__itt_enable_attach__itt_sync_create__itt_sync_rename__itt_sync_destroy__itt_sync_prepare__itt_sync_cancel__itt_sync_acquired__itt_sync_releasing__itt_suppress_push__itt_suppress_pop__itt_suppress_mark_range__itt_suppress_clear_range__itt_model_site_begin__itt_model_site_end__itt_model_task_begin__itt_model_task_end__itt_model_lock_acquire__itt_model_lock_release__itt_model_record_allocation__itt_model_record_deallocation__itt_model_induction_uses__itt_model_reduction_uses__itt_model_observe_uses__itt_model_clear_uses__itt_model_site_beginA__itt_model_site_beginAL__itt_model_task_beginA__itt_model_task_beginAL__itt_model_iteration_taskA__itt_model_iteration_taskAL__itt_model_site_end_2__itt_model_task_end_2__itt_model_lock_acquire_2__itt_model_lock_release_2__itt_model_aggregate_task__itt_model_disable_push__itt_model_disable_pop__itt_heap_function_create__itt_heap_allocate_begin__itt_heap_allocate_end__itt_heap_free_begin__itt_heap_free_end__itt_heap_reallocate_begin__itt_heap_reallocate_end__itt_heap_internal_access_begin__itt_heap_internal_access_end__itt_heap_record_memory_growth_begin__itt_heap_record_memory_growth_end__itt_heap_reset_detection__itt_heap_record__itt_id_create__itt_id_destroy__itt_get_timestamp__itt_region_begin__itt_region_end__itt_frame_begin_v3__itt_frame_end_v3__itt_frame_submit_v3__itt_task_group__itt_task_begin__itt_task_begin_fn__itt_task_end__itt_counter_inc_v3__itt_counter_inc_delta_v3__itt_marker__itt_metadata_add__itt_metadata_str_add__itt_relation_add_to_current__itt_relation_add__itt_event_create__itt_event_start__itt_event_end__itt_sync_set_name__itt_notify_sync_name__itt_notify_sync_prepare__itt_notify_sync_cancel__itt_notify_sync_acquired__itt_notify_sync_releasing__itt_memory_read__itt_memory_write__itt_memory_update__itt_state_get__itt_state_set__itt_obj_mode_set__itt_thr_mode_set__itt_frame_create__itt_frame_begin__itt_frame_end__itt_counter_create__itt_counter_destroy__itt_counter_inc__itt_counter_inc_delta__itt_mark_create__itt_mark__itt_mark_off__itt_mark_global__itt_mark_global_off__itt_stack_caller_create__itt_stack_caller_destroy__itt_stack_callee_enter__itt_stack_callee_leave__itt_clock_domain_create__itt_clock_domain_reset__itt_id_create_ex__itt_id_destroy_ex__itt_task_begin_ex__itt_task_begin_fn_ex__itt_task_end_ex__itt_task_begin_overlapped__itt_task_begin_overlapped_ex__itt_task_end_overlapped__itt_task_end_overlapped_ex__itt_marker_ex__itt_metadata_add_with_scope__itt_metadata_str_add_with_scope__itt_relation_add_to_current_ex__itt_relation_add_ex__itt_track_group_create__itt_track_create__itt_set_track__itt_api_version__itt_av_saveunknownINTEL_LIBITTNOTIFY64INTEL_ITTNOTIFY_GROUPS,; allcontrolthreadmarksyncfsyncjitmodelcounterframestitchheapstructuresuppressarraysKMP_FOR_TPROFILEKMP_FOR_TCHECKlibittnotify.dylibassertion failure/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_alloc.cpp__kmp_printpool: T#%d total=%llu get=%lld rel=%lld pblk=%lld pget=%lld prel=%lld dget=%lld drel=%lld __kmp_printpool: T#%d Free block: 0x%p size %6ld bytes. __kmp_printpool: T#%d No free blocks KMP_INITIAL_THREAD_BIND/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_csupport.cppomp_init_lock_with_hintomp_init_nest_lock_with_hintomp_init_lockomp_init_nest_lockOMP CriticalOMP Lock Start dump of debugging buffer (entry=%d): %4d: %.*sEnd dump of debugging buffer (entry=%d). OMP RTL Version %d.%d.%d:%s%s/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_error.cpp(none)"parallel"work-sharing"ordered" work-sharing"sections""taskq""taskq ordered""critical""ordered""master""reduce""barrier"KMP_PLAIN_BARRIERKMP_FORKJOIN_BARRIERKMP_REDUCTION_BARRIERKMP_PLAIN_BARRIER_PATTERNKMP_FORKJOIN_BARRIER_PATTERNKMP_REDUCTION_BARRIER_PATTERNplainforkjoinreductionlineartreehyperhierarchical*** Set #%d *** %d: <<%s>> LANG CPOSIXenNLSPATHlibomp.catEnglishUSA1033220161216Error(unknown file)not a numberbad unitillegal charactersvalue too largevalue too smallvalue is not a multiple of 4kUnknown processor topologyCannot open /proc/cpuinfo/proc/cpuinfocpuinfo file invalid (No processor records)cpuinfo file invalid (Too many processor records)Cannot rewind cpuinfo filecpuinfo file invalid (long line)cpuinfo file contains too many entriescpuinfo file missing processor fieldcpuinfo file missing physical id fieldcpuinfo file invalid (missing val)cpuinfo file invalid (duplicate field)Physical node/pkg/core/thread ids not uniqueAPIC not presentInvalid cpuid infoAPIC ids not uniqueInconsistent cpuid infoOut of heap memoryMemory allocation failedcorepackagenodedecoding legacy APIC idsparsing /proc/cpuinfovalue is not definedEffective settings:User settings:warning: pointers or size don't make senseCPUTPUTPUs per packageHT enabledHT disableddecoding x2APIC idscpuid leaf 11 not supportedcpuid leaf 4 not supportedthread ids not uniqueusing pthread infolegacy APIC ids not uniquex2APIC ids not uniqueOPENMP DISPLAY ENVIRONMENT BEGINOPENMP DISPLAY ENVIRONMENT END[device][host]OMP: Info #%1$d: %2$s OMP: Warning #%1$d: %2$s OMP: Error #%1$d: %2$s OMP: System error #%1$d: %2$s OMP: Hint: %2$s %1$s pragma (at %2$s:%3$s():%4$s)Library is "serial".Cannot open message catalog "%1$s":Default messages will be used.%1$s: Lock is uninitialized%1$s: Lock was initialized as simple, but used as nestable%1$s: Lock was initialized as nestable, but used as simple%1$s: Lock is already owned by requesting thread%1$s: Lock is still owned by a thread%1$s: Attempt to release a lock not owned by any thread%1$s: Attempt to release a lock owned by another threadStack overflow detected for OpenMP thread #%1$dStack overlap detected. Assertion failure at %1$s(%2$d).Unable to register a new user thread.Initializing %1$s, but found %2$s already initialized.Cannot open file "%1$s" for reading:Getting environment variable "%1$s" failed:Setting environment variable "%1$s" failed:Getting environment failed:%1$s="%2$s": Wrong value, boolean expected.No Helper Thread support built in this OMP library.Helper thread failed to soft terminate.Buffer overflow detected.Real-time scheduling policy is not supported.OMP application is running at maximum priority with real-time scheduling policy. Changing priority of the monitor thread failed:Deadlocks are highly possible due to monitor thread starvation.Unable to set monitor thread stack size to %1$lu bytes:Unable to set OMP thread stack size to %1$lu bytes:Thread attribute initialization failed:Thread attribute destroying failed:OMP thread joinable state setting failed:Monitor thread joinable state setting failed:System unable to allocate necessary resources for OMP thread:System unable to allocate necessary resources for the monitor thread:Unable to terminate OMP thread:Wrong schedule type %1$d, see or file for the list of values supported.Unknown scheduling type "%1$d".%1$s value "%2$s" is invalid.%1$s value "%2$s" is too small.%1$s value "%2$s" is too large.%1$s: "%2$s" is an invalid value; ignored.%1$s release value "%2$s" is invalid.%1$s gather value "%2$s" is invalid.%1$s supported only on debug builds; ignored.Syntax error: Usage: %1$s=[ routine= | filename= | range=: | excl_range=: ],...Unbalanced quotes in %1$s.Empty string specified for %1$s; ignored.%1$s value is too long; ignored.%1$s: Invalid clause in "%2$s".Empty clause in %1$s.%1$s value "%2$s" is invalid chunk size.%1$s value "%2$s" is to large chunk size.%1$s value "%2$s" is ignored.Cannot get processor frequency, using zero KMP_ITT_PREPARE_DELAY.%1$s must be set prior to first parallel region; ignored.%1$s: parameter has been specified already, ignoring "%2$s".%1$s: parameter invalid, ignoring "%2$s".%1$s: too many integer parameters specified, ignoring "%2$s".%1$s: too many integer parameters specified for logical or physical type, ignoring "%2$d".%1$s: '%2$s' type does not take any integer parameters, ignoring them.%1$s: proclist not specified with explicit affinity type, using "none".%1$s: proclist specified, setting affinity type to "explicit".%1$s: proclist specified without "explicit" affinity type, proclist ignored.%1$s: syntax error, not using affinity.%1$s: range error (zero stride), not using affinity.%1$s: range error (%2$d > %3$d), not using affinity.%1$s: range error (%2$d < %3$d & stride < 0), not using affinity.%1$s: range error ((%2$d-%3$d)/%4$d too big), not using affinity.%1$s: %2$s is defined. %3$s will be ignored.%1$s: affinity not supported, using "disabled".%1$s: affinity only supported for Intel(R) processors.%1$s: getaffinity system call not supported.%1$s: setaffinity system call not supported.%1$s: pthread_aff_set_np call not found.%1$s: pthread_get_num_resources_np call not found.%1$s: the OS kernel does not support affinity.%1$s: pthread_get_num_resources_np returned %2$d.%1$s: cannot determine proper affinity mask size.%1$s="%2$s": %3$s.%1$s: extra trailing characters ignored: "%2$s".%1$s: unknown method "%2$s".KMP_STATS_TIMER: clock_gettime is undefined, using gettimeofday.KMP_STATS_TIMER: "%1$s" needs additional parameter, e.g. 'clock_gettime,2'. Using gettimeofday.KMP_STATS_TIMER: clock_gettime parameter "%1$s" is invalid, using gettimeofday.KMP_STATS_TIMER: clock_gettime failed, using gettimeofday.KMP_STATS_TIMER: clock function unknown (ignoring value "%1$s").Unknown scheduling type detected.Too many threads to use analytical guided scheduling - switching to iterative guided scheduling.ittnotify: Lookup of "%1$s" function in "%2$s" library failed.ittnotify: Loading "%1$s" library failed.ittnotify: All itt notifications disabled.ittnotify: Object state itt notifications disabled.ittnotify: Mark itt notifications disabled.ittnotify: Unloading "%1$s" library failed.Cannot form a team with %1$d threads, using %2$d instead.Requested number of active parallel levels "%1$d" is negative; ignored.Requested number of active parallel levels "%1$d" exceeds supported limit; the following limit value will be used: "%1$d".kmp_set_library must only be called from the top level serial thread; ignored.Fatal system error detected.Out of heap memory.Clearing __KMP_REGISTERED_LIB env var failed.Registering library with env var failed.%1$s value "%2$d" will be used.%1$s value "%2$u" will be used.%1$s value "%2$s" will be used.%1$s maximum value "%2$d" will be used.%1$s minimum value "%2$d" will be used.Memory allocation failed.File name too long.Lock table overflow.Too many threads to use threadprivate directive.%1$s: invalid mask.Wrong definition.Windows* OS: TLS Set Value failed.Windows* OS: TLS out of indexes.PDONE directive must be nested within a DO directive.Cannot get number of available CPUs.Assumed number of CPUs is 2.Error initializing affinity - not using affinity.Threads may migrate across all available OS procs (granularity setting too coarse).Ignoring invalid OS proc ID %1$d.No valid OS proc IDs specified - not using affinity.%1$s - using "flat" OS <-> physical proc mapping.%1$s: %2$s - using "flat" OS <-> physical proc mapping.%1$s, line %2$d: %3$s - using "flat" OS <-> physical proc mapping.%1$s: %2$s - exiting.%1$s, line %2$d: %3$s - exiting.Construct identifier invalid.Thread identifier invalid.runtime library not initialized.Inconsistent THREADPRIVATE common block declarations are non-conforming and are unsupported. Either all threadprivate common blocks must be declared identically, or the largest instance of each threadprivate common block must be referenced first during the run.Cannot set thread affinity mask.Cannot set thread priority.Cannot create thread.Cannot create event.Cannot set event.Cannot close handle.Unknown library type: %1$d.Monitor did not reap properly.Worker thread failed to join.Cannot change thread affinity mask.%1$s: Threads may migrate across %2$d innermost levels of machine%1$s: decrease to %2$d threads%1$s: increase to %2$d threads%1$s: Internal thread %2$d bound to OS proc set %3$s%1$s: Affinity capable, using cpuinfo file%1$s: Affinity capable, using global cpuid info%1$s: Affinity capable, using default "flat" topology%1$s: Affinity not capable, using local cpuid info%1$s: Affinity not capable, using cpuinfo file%1$s: Affinity not capable, assumming "flat" topology%1$s: Initial OS proc set respected: %2$s%1$s: Initial OS proc set not respected: %2$s%1$s: %2$d available OS procs%1$s: Uniform topology%1$s: Nonuniform topology%1$s: %2$d packages x %3$d cores/pkg x %4$d threads/core (%5$d total cores)%1$s: OS proc to physical thread map ([] => level not in map):%1$s: OS proc maps to th package core 0%1$s: OS proc %2$d maps to package %3$d [core %4$d] [thread %5$d]%1$s: OS proc %2$d maps to [package %3$d] [core %4$d] [thread %5$d]%1$s: OS proc %2$d maps to [package %3$d] [core %4$d] thread %5$d%1$s: OS proc %2$d maps to [package %3$d] core %4$d [thread %5$d]%1$s: OS proc %2$d maps to [package %3$d] core %4$d thread %5$d%1$s: OS proc %2$d maps to package %3$d core %4$d [thread %5$d]%1$s: OS proc %2$d maps to package %3$d [core %4$d] thread %5$d%1$s: OS proc %2$d maps to package %3$d core %4$d thread %5$d%1$s: OS proc %2$d maps to %3$s%1$s: Internal thread %2$d changed affinity mask from %3$s to %4$s%1$s: OS proc %2$d maps to package %3$d, CPU %4$d, TPU %5$d%1$s: OS proc %2$d maps to package %3$d, CPU %4$d%1$s: HT enabled; %2$d packages; %3$d TPU; %4$d TPUs per package%1$s: HT disabled; %2$d packagesThreads encountered barriers in different order. Function %1$s failed:%1$s: %2$s packages x %3$d cores/pkg x %4$d threads/core (%5$d total cores)Incompatible message catalog "%1$s": Version "%2$s" found, version "%3$s" expected.%1$s: ignored because %2$s has been defined%1$s: overrides %3$s specified before%1$s must be bound to a work-sharing or work-queuing construct with an "ordered" clauseDetected end of %1$s without first executing a corresponding beginning.Iteration range too large in %1$s.%1$s must not have a loop increment that evaluates to zero.Expected end of %1$s; %2$s, however, has most recently begun execution.%1$s is incorrectly nested within %2$s%1$s cannot be executed multiple times during execution of one parallel iteration/section of %2$s%1$s is incorrectly nested within %2$s of the same name%1$s is incorrectly nested within %2$s that does not have an "ordered" clause%1$s is incorrectly nested within %2$s but not within any of its "task" constructsOne thread at %1$s while another thread is at %2$s.Cannot connect to %1$sCannot connect to %1$s - Using %2$s%1$s does not support %2$s. Continuing without using %2$s.%1$s does not support %2$s for %3$s. Continuing without using %2$s.Static %1$s does not support %2$s. Continuing without using %2$s.KMP_DYNAMIC_MODE=irml cannot be used with KMP_USE_IRML=0ittnotify: Unknown group "%2$s" specified in environment variable "%1$s".ittnotify: Environment variable "%1$s" too long: Actual lengths is %2$lu, max allowed length is %3$lu.%1$s: Affinity capable, using global cpuid leaf 11 info%1$s: Affinity not capable, using local cpuid leaf 11 info%1$s: %2$s.%1$s: %2$s - %3$s.%1$s: OS proc to physical thread map:%1$s: using "flat" OS <-> physical proc mapping.%1$s: parsing %2$s.%1$s - exiting.Incompatible %1$s library with version %2$s found.ittnotify: Function %1$s failed:ittnofify: Error #%1$d.%1$s must be set prior to first parallel region or certain API calls; ignored.Lock initialized at %1$s(%2$d) was not destroyedCannot determine machine load balance - Using %1$s%1$s: Affinity not capable, using pthread info%1$s: Affinity capable, using pthread infoLoading "%1$s" library failed:Lookup of "%1$s" function failed:Buffer too small.Error #%1$d.%1$s: Invalid symbols found. Check the value "%2$s".%1$s: Spaces between digits are not allowed "%2$s".%1$s: %2$s - parsing %3$s.%1$s cannot be specified via kmp_set_defaults() on this machine because it has more than one processor group.Cannot use affinity type "%1$s" with multiple Windows* OS processor groups, using "%2$s".Cannot use affinity granularity "%1$s" with multiple Windows* OS processor groups, using "%2$s".%1$s: Mapping Windows* OS processor group proc to OS proc 64*+.%1$s: OS proc %2$d maps to Windows* OS processor group %3$d proc %4$d%1$s: Affinity balanced is not available.%1$s: granularity=core will be used.%1$s must be set prior to first OMP lock call or critical section; ignored.futex system call not supported; %1$s=%2$s ignored.%1$s: granularity=%2$s will be used.%1$s: invalid value "%2$s", valid format is "N[@N][,...][,Nt] ( can be S, N, L2, C, T for Socket, NUMA Node, L2 Cache, Core, Thread)".KMP_HW_SUBSET ignored: unsupported architecture.KMP_HW_SUBSET ignored: too many cores requested.%1$s: syntax error, using %2$s.%1$s: Adaptive locks are not supported; using queuing.%1$s: pid %2$d tid %3$d thread %4$d bound to OS proc set %5$s%1$s error: parallel loop increment and condition are inconsistent.libgomp cancellation is not currently supported.KMP_HW_SUBSET ignored: non-uniform topology.KMP_HW_SUBSET ignored: only three-level topology is supported.%1$s: granularity=%2$s is not supported with KMP_TOPOLOGY_METHOD=group. Using "granularity=fine".%1$s: granularity=group is not supported with KMP_AFFINITY=%2$s. Using "granularity=core".KMP_HW_SUBSET ignored: too many sockets requested.KMP_HW_SUBSET "o" offset designator deprecated, please use @ prefix for offset value.%1$s: Affinity capable, using hwloc.%1$s: Ignoring hwloc mechanism.%1$s: Hwloc failed in %2$s. Relying on internal affinity mechanisms.%1$s must be set prior to OpenMP runtime library initialization; ignored.%1$s variable deprecated, please use %2$s instead.KMP_FORCE_REDUCTION: %1$s method is not supported; using critical.KMP_HW_SUBSET ignored: unsupported item requested for non-HWLOC topology method (KMP_TOPOLOGY_METHOD)KMP_HW_SUBSET ignored: too many NUMA Nodes requested.KMP_HW_SUBSET ignored: too many L2 Caches requested.KMP_HW_SUBSET ignored: too many Procs requested.Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources. For information on submitting this issue, please see https://bugs.llvm.org/.Check NLSPATH environment variable, its value is "%1$s".Please try changing the shell stack limit or adjusting the OMP_STACKSIZE environment variable.Consider unsetting KMP_ALL_THREADS and OMP_THREAD_LIMIT (if either is set).Consider setting KMP_ALL_THREADPRIVATE to a value larger than %1$d.This could also be due to a system-related limit on the number of threads.This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://openmp.llvm.org/This name is specified in environment variable KMP_CPUINFO_FILE.Seems application required too much memory.Use "0", "FALSE". ".F.", "off", "no" as false values, "1", "TRUE", ".T.", "on", "yes" as true values.Perhaps too many threads.Decrease priority of application. This will allow the monitor thread run at higher priority than other threads.Try changing KMP_MONITOR_STACKSIZE or the shell stack limit.Try changing OMP_STACKSIZE and/or the shell stack limit.Try increasing OMP_STACKSIZE or the shell stack limit.Try decreasing OMP_STACKSIZE.Try decreasing the value of OMP_NUM_THREADS.Try increasing KMP_MONITOR_STACKSIZE.Try decreasing KMP_MONITOR_STACKSIZE.Try decreasing the number of threads in use simultaneously.Will use default schedule type (%1$s).It could be a result of using an older OMP library with a newer compiler or memory corruption. You may check the proper OMP library is linked to the application.Check %1$s environment variable, its value is "%2$s".You may want to use an %1$s library that supports %2$s interface with version %3$s.You may want to use an %1$s library with version %2$s.System error #193 is "Bad format of EXE or DLL file". Usually it means the file is found, but it is corrupted or a file for another architecture. Check whether "%1$s" is a file for %2$s architecture.System-related limit on the number of threads.(No message available)(No system error message available)OMP warning: Debugging buffer overflow; increase KMP_DEBUG_BUF_CHARS to %d th_%d stack (refinement)th_%s stack (%s)moninitialactualth_%d stack (%s)th_%d stack (overlapped)OMP storage map: %p %p%8lu %s OMP warning: %s /tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_runtime.cppstatic, no chunkteam%p-%lx-%slibomp.dylib%p%lxunknown libraryKMP_DUPLICATE_LIB_OKKMP_IGNORE_MPPBEGKMP_IGNORE_MPPENDatomicOMP Metadataomp_metadata_imbalanceomp_metadata_loopomp_metadata_singleOMP Single-%sKMP_DYNAMIC_MODE=thread limit%s$omp$parallel:%d@%s:%d:%dteam_%d.t_inline_argvteam_%d.t_argvth_%dth_%d.th_infoth_%d.th_localth_%d.th_barth_%d.th_bar[plain]th_%d.th_bar[forkjoin]th_%d.th_bar[reduction]OMP Master Thread #%dOMP Worker Thread #%dth_%d.th_pri_common th_%d.th_dispatch.th_disp_buffer (team_%d.t_dispatch[%d].th_disp_buffer)%s_%d%s_%d.t_bar%s_%d.t_bar[plain]%s_%d.t_bar[forkjoin]%s_%d.t_bar[reduction]%s_%d.t_dispatch%s_%d.t_threads%s_%d.t_disp_buffer%s_%d.t_taskq__KMP_REGISTERED_LIB_%dinfinit%lf%c%cKMP_BLOCKTIMEKMP_WARNINGS %s KMP_OMP_GOMP_ %s=%s %s %s _OPENMP='%d' %s KMP_STACKSIZEGOMP_STACKSIZEOMP_STACKSIZEKMP_LIBRARYOMP_WAIT_POLICYKMP_ALL_THREADSKMP_MAX_THREADSOMP_THREAD_LIMITKMP_FORCE_REDUCTIONKMP_DETERMINISTIC_REDUCTIONKMP_AFFINITYOMP_NUM_THREADSOMP_NESTEDOMP_DYNAMICKMP_SETTINGSKMP_STACKOFFSETKMP_STACKPADKMP_VERSIONKMP_TASKINGKMP_TASK_STEALING_CONSTRAINTOMP_MAX_ACTIVE_LEVELSOMP_DEFAULT_DEVICEOMP_MAX_TASK_PRIORITYKMP_TASKLOOP_MIN_TASKSKMP_DISP_NUM_BUFFERSKMP_HOT_TEAMS_MAX_LEVELKMP_HOT_TEAMS_MODEKMP_HANDLE_SIGNALSKMP_INHERIT_FP_CONTROLKMP_ALIGN_ALLOCKMP_ABORT_DELAYKMP_CPUINFO_FILEKMP_STORAGE_MAPKMP_ALL_THREADPRIVATEKMP_FOREIGN_THREADS_THREADPRIVATEOMP_PROC_BINDKMP_INIT_AT_FORKKMP_SCHEDULEOMP_SCHEDULEKMP_ATOMIC_MODEKMP_CONSISTENCY_CHECKKMP_ITT_PREPARE_DELAYKMP_MALLOC_POOL_INCRKMP_INIT_WAITKMP_NEXT_WAITKMP_GTID_MODEKMP_DYNAMIC_MODEKMP_LOAD_BALANCE_INTERVALKMP_NUM_LOCKS_IN_BLOCKKMP_LOCK_KINDKMP_SPIN_BACKOFF_PARAMSKMP_ADAPTIVE_LOCK_PROPSKMP_PLACE_THREADSKMP_HW_SUBSETKMP_FORKJOIN_FRAMESKMP_FORKJOIN_FRAMES_MODEOMP_DISPLAY_ENVOMP_CANCELLATION%llu %s %s='%d' %s=%d %s %s='%s' TRUEFALSEtruefalseACTIVEPASSIVEserialthroughputturnarounddedicatedmultiuser %s %s='' %s= %s %s %s%d,='%s' : %s %s='%d,%d' %s,%s' criticalverbose/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_settings.cppdisabledmasterclosespread='inteldefaultstaticgreedybalancedguidediterativeanalyticalstatic,greedystatic,balanced;%s' guided,iterativeguided,analyticaldynamicautotrapezoidalstatic_steal%s,%d' %s' none %s %s='%llu' %s=%llu load balanceload_balanceload-balanceloadbalancebalancethread limitthread_limitthread-limitthreadlimitlimitrandom%lftastest and settest_and_settest-and-settest andsettest_andsettest-andsettestand settestand_settestand-settestandsetticketqueuingqueuedrdpa ticketdrdpa_ticketdrdpa-ticketdrdpaticketdrdpaadaptivertmhle0123456789%ds@%d%s%dn%s%dL2%s%dc%s%dtVERBOSEkMGTPEZY%llu%s*/*off0.false..f.noon1.true..t.yes/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_tasking.cppOMP Taskwait/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_threadprivate.cpp%0*dMHzGHzTHz/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_barrier.cppOMP BarrierOMP For BarrierOMP Sections BarrierOMP Single BarrierOMP Workshare BarrierOMP Implicit BarrierOMP Explicit BarrierOMP Join Barrier%s$omp$barrier-imbalance:%d@%s:%d%s$omp$barrier@%s:%d/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_dispatch.cppOMP Ordered/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_lock.cppkmp_lockseq_tomp_destroy_lockomp_set_lockomp_unset_lockomp_test_lockomp_set_nest_lockomp_unset_nest_lockomp_test_nest_lock/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_sched.cpppthread_createpthread_setcancelstatepthread_atforkpthread_condattr_initpthread_cond_destroypthread_mutex_destroypthread_setspecificgetrusagegettimeofdayrbpthread_key_createpthread_cond_initpthread_key_deletepthread_setcanceltypesigactionpthread_mutex_lockpthread_cond_waitpthread_mutex_unlockpthread_cond_signal;unknown;unknown;0;0;;/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_gsupport.cpp/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_taskdeps.cpp/tmp/libomp-20180228-76200-1xweal/openmp-5.0.1.src/runtime/src/kmp_cancel.cpp%sdynamic error checking: %s Intel(R) OMP %sthread affinity support: %s 44X!a pLLUL l ZADb%d  ' k     i  IxR04yie+Z !c#RSZ\  J!!#($l$$%3%%'**+,-!33o455)6Y666g7789<I==?E@@@AAAACYDDN'RTV5WWX?ZZ^abeggchi2jskk<{4kx`Ԡ?*4|ݧƨ_k ,ٰiޱ",J޳ZP{ j˻q> JDp-LaQ1AWSj[&!xR-Gd+,-C446g789W:x:;<?ABaJJLNOOTRThUVV WW]X~XZZ[[\]__E`aab@dfeeollppsqqrrtouvvv3w}~~H[};Zi1*_<qFL}:˞I\ms(Y#\ Y"\&Rk$RiC$c Xrc*k5[u% -  pJ  #J$$B&A((R++```de6hhKkkkXlopxpp}}Ԋ$IU /}-E r*j%r"!yi\%.*M s    r y!j%%))-/..abbCikkl~mnoup3qr˅ІHc;ޕȗ~w%-ޞ3Qo.L"Mp?cܪ̬8sBzE[s rFomC]{4Ivhp+chNi-Sx<AP|&0:DNXblv  *4>HR\fpz$.8BLV`jt~8f  @$,29> H@QXi> RYdqd60kkklmnnznnnn oooooooooppppp KG a]M OTSCp- j 2!!!"j""#3#`###$`$$$i%%&F&&!''#(b(((h))`**D+++,`,,-W---.Y... /K/// 0L0001P1112T2223@3333]44_55K66a77'8899:::5;t;;<T>@@A+B7CDCNCi(<<}0T>T>8@@@@@HAAP+B+BX7C7C`DCDChNCNC@p0%H07P 0JXK]`ohpxG     Ja ] o  ]  Ȇ7ІML؆e~ O T": S(k0S8@HPCXp`!h<p- Uxj m  2!!!"j"";#Zȇ3#Ї`#؇##$`$$$i%*%?&R F&h(&y0!'8'@#(Hb(P(X(`h)h)p`*2x*ED+ X+ j+ z,1`,1,1-1W-1-1Ȉ-!Ј.4؈Y.H.X.h /{K/// 0L0 0(0018P1*@15H1DP2VXT2l`2h2p3x@3333]4-4A_5X5jK66ȉa7Љ7؉'88 9,9M:c:|:5;t; ;@ 022p @3Pnt}@ "(*+?!#$&'    ' 0 C S c      "!=!^!!!!!"H"Y"l"""""""""" #"#6#E#p#t#x#######$$/$E$f$$$$$$$$%0%E%i%%%%&K&q&&&'*'K'q''''%(A(m(((()c))) *?*g****!+g+++,!,A,a,,,,-q----- .6.`.~...7/a///A0001=1r111+2X22223B3u33344L4i44 5Z5555Y6666!7M7y777v8888$9M9m999999:+:@:q:::::;6;S;;;;0<b<<<<=2=M=n=t>>>>>>??>?\????@5@`@@@@(A^AAAAABQBBBCECCBC DIDDDD*EfEEEE,FBFFFG4GGGG3H{HHI6hCh!2fElhgޒZgߋ>Ohi[hxhהhh-h@mg`tg?%hh'h˖\io!iKgߋ8iٗy3yPyHi[XiĞgʞgʞii٠Yyii̡ݡii`iiiϰiij&jb;j(Ij;Wj̵ hDYejmݸvjjjɹj*!j~jjk->kQi2k|BkPPPpp@d '3hi~  J |  ;O =!i!`#$%;'E''1)%*o,.082]4|45*8:<=>T?V@`@@LB@CDsYEAES! + +y  ;<R,   7DD =@Bsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss2!RG`[Apppp`CpSA`ATD`ATATATATATATATATASBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBS0RASAp8p`SASASAT0pxp8p8UC`6BVB`B`Gp8p8p0SBSBSBSBRCSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBRCSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBSBp(p p8p8p@ppRBpZAYAppRBpRBpZAYAYAppRBpRBpZAYAYHpH@R@___stack_chk_guardQq@___stderrp@_free@_mach_task_self_@_malloc@dyld_stub_binderqH@__NSGetEnvironqP@___bzeroqX@___divdc3q`@___divsc3qh@___divxc3qp@___errorqx@___muldc3q@___mulsc3q@___mulxc3q@___stack_chk_failq@___toupperq@_abortq@_atoiq@_catcloseq@_catgetsq@_catopenq@_dlerrorq@_dlopenq@_dlsymq@_fcloseq@_fflushq@_fopenq@_fprintfq@_freeq@_getenvq@_gethostnameq@_getloadavgq@_getpidq@_getrusageq@_gettimeofdayq@_host_infoq@_mach_host_selfq@_mallocq@_memcpyq@_pthread_atforkq@_pthread_attr_destroyq@_pthread_attr_initq@_pthread_attr_setdetachstateq@_pthread_attr_setstacksizeq@_pthread_cancelq@_pthread_cond_destroyq@_pthread_cond_initq@_pthread_cond_signalq@_pthread_cond_waitq@_pthread_condattr_initq@_pthread_createq@_pthread_exitq@_pthread_getspecificq@_pthread_joinq@_pthread_key_createq@_pthread_key_deleteq@_pthread_mutex_destroyq@_pthread_mutex_initq@_pthread_mutex_lockq@_pthread_mutex_unlockq@_pthread_mutexattr_destroyq@_pthread_mutexattr_initq@_pthread_mutexattr_settypeq@_pthread_selfq@_pthread_setcancelstateq@_pthread_setcanceltypeq@_pthread_setspecificq@_qsortq@_reallocq@_sched_yieldq@_setenvq@_sigactionq@_sleepq@_snprintfq@_sscanfq@_strchrq@_strcmpq@_strcspnq@_strdupq@_strerror_rq@_strlenq@_strncmpq@_strncpyq@_strrchrq@_strspnq@_strtodq@_strtok_rq@_sysconfq@_timesq@_unsetenvq@_vfprintfq@_vfscanfq@_vm_read_overwriteq@_vsnprintf_.gomp_critical_user__[kmp omp5GOMP_wmetadata_domainstring_handle__{ZYou_must_link_with_kmp_kmp__c_ ifd;e?aBpCcDmFvGgHrJwaKsLtNjoin_callOlSuVo^query_cpuidebeniyieldsxhzero_bttt_n18n_catFgnore_mppVs_address_mappedw_lock_tablefise?mheap_get_timestamp_ptr__3_0retcԭnotify_sync_ɱobj_mode_set_ptr__3_0adpݹ_ittapi_globalԺbarrier_domainsini_ittlibsync_rame_Ԇnit_ittlibd_mbalance_domainset_ync_ǜuppress_terror_handlertrack_ptr__3_0itfinite_loopKternal_Ovoke_Ustall_signalssherit_fp_controldirect_ialize__Qz_lockbgetfast_memory system_tickwߕinree_ orMalize_bgetish_implicit_task\fthread_ allocate page_allocate reeast_ 12<3R74 5__kmp_env_printvX9__kmp_taskloop_taskiPvb8__kmp_fkmpc___kmp_>set_poolget_poolsizemmodeismodevizevtatPmS_ əkmpc_poolprintv __kmp_now_nsecvwc_ _cmalloc aligned_malloc calloc realloc free set_6unset_affinity_mask_proc7get_affinity_mask_proc7malloc calloc realloc free Ʈưallocate free հfast_memory cons_stackCtOimplicit_task]ɵatomic_ b/end/g/o0in1p1f2s2master4c4d8unset_9t9reduce: f cmplx1/2/4/8/32/start/end/ixed loat4 812_ u_ a s divmorxorneqveqvrd%wr&dd nd_cpt&ubhwp._ 4_8_10_addsdivmrd%wr&_$ubwp.η_!_u_ asdivmorxorneqveqvrd%wr&ddnd_cpt&ubhwp._!addsdivmrd%wr&_cpt&ubwp._"_u_ adivmorsxorneqveqvrd%wr%ddnd˸_cpt'bl_cpt'_divshr_ulaxin_#blԹ_cpt'hubwp.lr____̺_cpt'_u_ adivmorsxorneqveqvrd%wr&ddnd_cpt'bl_cpt'_divshr_ulaxinֻ_#bl_cpt(hubwp.lr___ϼ__cpt(bl_cpt(_divshr_ulaxinҽ_#bl_cpt)lr__ _ _cpt)bl׾_cpt)_ divshr_ ulaxin_$blֿ_cpt)lr_ _!_!_cpt*_!ulaxin_$_!ulaxin_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt*_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+_cpt+addsmuldivrd%wr&_cpt+ubwp._"_cpt+_"4_8_10_addsmuldivrd%wr&_c$ubwp._"_c%_"addsmuldivrd%wr&_cpt,ubwp._"_cpt,_#addsmuldivrd%wr&_cpt,ubwp/_#_cpt,_#revfloat8#cpt'revcpt'revcpt'revcpt'revcpt'revcpt'revfloat8#cpt'revcpt(revcpt(revcpt(revcpt(revcpt(revfloat8$cpt(revcpt(revcpt)rev cpt)rev cpt)rev cpt&rev float8$cpt)rev cpt)rev cpt)rev!cpt)rev!cpt)rev!cpt&rev!float8$cpt*rev!float8$cpt&rev"cpt*rev"cpt&rev"cpt+rev"cpt+rev"c%rev"c%rev"cpt,rev#cpt,rev#cpt,rev#cpt,float8#cpt'float8#cpt(float8$cpt(float8$cpt)float8$cpt&float8$cpt*mplx8$pt,mplx8%pt,mplx8%pt,mplx8%pt,ʄ_rev-_rev-_rev.І_rev._rev,_rev,ň_rev-ʉ_rev-_rev-_rev-Ίҋ_rev-_rev-_rev-_rev-_rev-_rev-_rev-_rev-_rev-ߐ_rev-_rev-ё_rev-_rev-͓_rev-_rev-_rev-ڔ_rev._rev.ՙۚɛߜݟݠޡƢ_rev._rev._rev._rev.Դ_rev._rev.ͻ_rev._rev.0/6/0/egin/ound_0arrier3_3lobal_0et_:thread_num0num_threads0thread_num0num_threads0k_to_fork0rdered4mp_\_parallel1voke_task_func2it_7ush_1op_num_threads2roxy_task_completed`num_t1proc_bind2hreads2eams2or2lush3k_2_static_5call2teams2e2ingle5rialized_parallel3t_8s3master4ordered4critical4barrier_master4reduce:task_erialized_parallel3ingle5_master4ritical4opyprivate7ancel_with_hint4_nowait4fini5init_qc_5_set_5get_6n5dynamic6max_active_levels6schedule6um_threads6ested6Ɏُancestor_thread_num6team_size6stacksize7blocktime7library7d7affinity_mask_proc7ΐ_s7ېefaults7isp_num_buffers7ڑlock8nest_lock8_with_hint88Δ_with_hint88ʛ֝estroy_8oacross_:isglock8nest_lock8lock9nest_lock9֠lock9nest_lock9ڣe9ask_hreadprivatedst_9am_static_init_rlock:nest_lock:_nowait::_nowait::Ǯtaskid:parent_taskid:öinit;wait;post;fini;ʾe;uchange_libraryiKenv_initializePKcXtask`get_logical_idiiesetup_icv_copyP8kmp_teamiP20kmp_internal_controlP5identfitt_destroyv?env_print_2vXrror_handler?vent_nable_attach_ptr__3_0κn?rror_constructAxLq_4ilapsedwv_@ter_singleLd_split_barriereables get@f@existsAsAunsetAblAcomp_all_threadsreeAormatetAtksizek_AocktimeinitAsortAfreeAvarA2AlBbort_KuWcquire_ktomic_ںdοvail_procffinity_num_placeslBign_alloc޽ocate_CThreadsSpecified_nthcons_stackCtMindirect_lockqush_Cop_ErintGarallel_KpDworkshareEsyncEnum_tUcurrent_task_to_thread\arallelDroc_bindVhDleaVobreate_workerspuinfoeck_DunkworkshareEsEbarrierFyncEtack_overlapKparallelEworkshareEsyncEcurrent_task_from_thread\openFcloseFgetsFsgFiddle_initializeTaonitor_FGformatGeGnullrror_GmptycodeGmesgGǂprintfGalidate_lockskersionfG_I_no_lockHeHtid_tuidedlobalt_H_4inerate_warnings global_thread_idImax_active_levelsPschedulePancestor_thread_numPteam_sizePrPhierarchyguser_lock_ownerqload_balancewcancellation_status˄_regJstorage_map_gtidJversion_͘eJunTootgiJaRlease_fmove_signalssstster_Jon_domain_countrootKatforksrnKit_`ĮprocessKthreadKdelaydKinitializeLeoKxoL±it_Lecute_tasks_^pand_esingleLthreadslockeMave_internal_controlsOtXpin_backoffquspend_sys_mchrialMtOized_parallelM_initializeTeamMhreadRkNeign_tpce_reduction_method_callNjoin_eNask]v_vhreadvls_gtid_minicks_per_msecp_caamOst_krminate_threadrs_masterO_ԃforkOjoinOend_SbeginVeamOhreadPask_team`ɚ_Ptingsnum_threadsPmax_active_levelsPschedulePכžǡ_globalPݩandomQeduce_methodXrandomRimplicit_task\tlnested_nqueuing_lockpdqwaitserialgtidcomparalleluser_locksx87_fpu_control_wordͪ6__kmp_unregister_root_current_threadiR0__kmp_Tp_Rd_utSworkerseamSask_teams`aunch_threadSt_4ie_4ioad_ibrarydTthreadTatexitTfiniTlibraryTestTtorTregister_library_startupvTinitial_threads_capacityiX_Utime_vbefore_invoked_taskUafter_invoked_taskUtUmicrotaskask_funcUeams_masterUhreadsVeamsVnupVr_u_fbegVendVser_Vnnamed_critical_addrset_libraryWlock_x_Wto¿set_Wdispatch_jlibraryWstacksizeWblocktimeWdefaultsWine_reduction_methodX_redˆNJr_Xorkaticdio_lockbuf_YfZeqfZloc_Zsplit[match[replace[to[cYreserveYdetachYfreeZvprintZprintZlearYatZӮ_sizeZname_ZormatZreeZinitZfreeZmatchZ¹ۻinit[free[ƾ¿_[false[true[ken[_[int[size[uint\task\wait_deps_\^begin_if0\complete_if0\alloc^parts^with_deps_]ing_`loop_min_tasksalloc]team_]stealing_constraintcounters]wait`etup]ync`mp_^penmp_versionݛtask^cancellationwait^yield^32^64_oncore___group_loopbqbbreduction__bufferbinit_get_th_data_group_qbۑto_unref_task_teams`64fyield_4j˗barrier`modeם_ooo`ؠ_dup_allocP8kmp_infoP8kmp_taskaloop_recurP5identiP8kmp_taskPyS3_xyyyyyyPvbʣtaskloop_linearP5identiP8kmp_taskPyS3_xyyyyyPvbget_physical_idiieȨ_taskb_taskbmmon_cpyrightnsole_lockinitializecdestroyc_gtidc threadprivate_insertdset_фget_cdestroy_affinity_mask؈unset_affinity_mask_procmallocaligned_mallocreallocfree_private_datadd_deregisterecachede_vecehost_nameefile_nameeƒ  arrieresr32̊ _ɻ join_barrieriffork_barrieriif    64ftlnested_nqueuing_lockpdp hierarchygindirect_user_locksq  patch_gt_ginit_gnext_hfini_h4g8g ug  ug dispatch_init_hfor_static_init_r4h8h uh ł uh 4h8h uh  uh 4h8h ui ui   eium_locks_in_blockthq_4ixt_waited_register_atforksted_     _ptrj init_jfini_chunk_j4j8j uj  uj 4j8j uj uj   tknested_mqueuing_lockpdrdpa_lockpas_lockkicket_locko tknested_mqueuing_lockpdrdpa_lockpas_locklicket_locko as_locklicket_locko as_locklicket_locko tmnested_oqueuing_lockpdrdpa_lockqas_lockmicket_lockp tmqueuing_lockpdrdpa_lockqas_lockmicket_lockp tnqueuing_lockpdrdpa_lockqas_locknicket_lockp tnqueuing_lockpdrdpa_lockqas_locknicket_lockpҎ toqueuing_lockpdrdpa_lockqas_lockoicket_lockp toqueuing_lockpdrdpa_lockqas_lockoicket_lockp   ߏ  ʐ        ڗ       Ǜ   rdpa_lockqeps rdpa_lockqynamic_user_locksq       ڤ _params٫  ̯  4r8r ur Ğ ur 4r8r urп  ur 4r8r ur  ur   _ ӄssrect_ablespƊinitializetuninitialize_threadt32t64toncoretume_terve_warn32t64toncoretزset_specificuget_specificuthreadprivate_keymodecpu_timeusystem_ufrom_filevinfoutimeusystem_timevx87_fpu_status_wordӿthreadprivate_storevkeyinitializevdestroyv_wprivssleepwpool_tickwbarrierxcxatomic_xsyordered_yparallelyloop_zt_cancelritical_xancelstartxendxname_xstartxendxstartyendyingle_yections_́startycopy_ystartyendystartyendy_zszendzloop_tartzectionsstatic_zdynamic_{guided_{runtime_{ordered_{end}ull_}start{next{start{next{start{next{start{next{static_|dynamic_|guided_|runtime_|start|next|start|next|start|next|start}next}_}nowait}cancelstatic_}dynamic_~guided_~runtime_~ordered_~start}next~start~next~start~next~start~next~̂static_dynamic_guided_runtime_startnextstartnextstartnextstartnextstaticdynamicĀguidedڀruntime_start֎_startԀǂ_start͂Ɠ_startӂוaeamsskrgetwaitƁyieldgroup_ق˛startnextend_start_nowaitcancelӟٟߟبstartendlation_pointήݱ͵_dataփend_data܃updateӵٵߵ_entries̸lationpoint_barrierństacksizeblocktimelibraryΆdaffinitywarnings_o_s_stacksizeblocktimeÆlibraryaffinitynum_known_threadscancellation_statusݔ_s____نserialt_urnaroundhroughput___isp_num_buffers܇efaultsǔ___max_procsk_proc_Ǖreate_affinity_mask͈alloc_͕_ӕmask_proc_ٕ_ߕ_set_͉get_iˍdestroy_unset_test_ndschedulemax_active_levelslockْum_threadsestԌ_ nmax_tdscheduleaŽlevelpwtiɓcancellationҔum_estedtpdeviceshreadseams_tӋactive_levelshreadsask_priority_hread_eam_numlimit__rocsɌlaces_ed_lock__ynamicefault_device_ynamicefault_device_ns_initial_device_it_parallelfinal_____ctive_levelncestor_thread_num_Ŗ_˖_іsizenum_ז_ݖ_roc_bindlace_artition___numproc_ids_procs__num_placesߐplace_nums________lockΑnest_lock_ّwith_hint×__with_hintɗ_lockÒnest_lockΒ_ϗ_՗_ۗ_locknest_lock__locknest_lock__meדck_______nff______ǘ1٘2ߘ86_cpuidprocx87_fpu_control_wordbalance_intervale_x87_fpu_control_wordܙage_mapaot_teams_mws_rdware_timestampndle_signals_ǚalt_compomp_apiftnmbuildқcopyrightlicdeclextraajorƛinor̛_b_nk_typevertypetimecompilercreҝdestroy_ptr__3_0prepare_ptr__3_0acquired_ptr__3_0set_name_ptr__3_0ñreate_ptr__3_0̝ancel_ptr__3_0name_ptr__3_0leasing_ptr__3_0ȌЌ،pӞmark_range_ptr__3_0clear_range_ptr__3_0ush_ptr__3_0op_ptr__3_0prepare_ptr__3_0cancel_ptr__3_0acquired_ptr__3_0releasing_ptr__3_0odel_arke site_task_ޡlock_reiobserve_uses_ptr__3_0clear_uses_ptr__3_0aggregate_task_ptr__3_0ƥdisable_p̥beginend__ptr__3_0Aptr__3_0ء2_ptr__3_0beginend__ptr__3_0Aܤȍptr__3_02_ptr__3_0Ѝacquire_Ǣrelease_ptr__3_02_ptr__3_0؍ptr__3_02_ptr__3_0cord_duction_uses_ptr__3_0allocation_ptr__3_0deallocation_ptr__3_0nduction_uses_ptr__3_0teration_taskA_ptr__3_0ФL_ptr__3_0֤_ptr__3_0L_ptr__3_0_ptr__3_0L_ptr__3_0ȎЎ؎ush_ptr__3_0op_ptr__3_0fallocate_Ҧreinternal_access_unction_create_ptr__3_0̦ree_begin_ptr__3_0end_ptr__3_0begin_ptr__3_0end_ptr__3_0allocate_cord_Ĩset_detection_ptr__3_0begin_ptr__3_0end_ptr__3_0begin_ptr__3_0end_ptr__3_0memory_growth_ptr__3_0begin_ptr__3_0end_ptr__3_0ȏЏ؏create_destroy_ܩptr__3_0֩ex_ptr__3_0ptr__3_0ex_ptr__3_0gion_lation_add_sume_ptr__3_0begin_ptr__3_0end_ptr__3_0domainsteam_sizebegin_end_ثsubmit_v3_ptr__3_0create_ptr__3_0ٴv3_ptr__3_0ҫptr__3_0ߴv3_ptr__3_0ptr__3_0ask_hrrack_group_ptr__3_0begin_Ƭend_ptr__3_0fn_ex_ptr__3_0overlapped_ptr__3_0ex_ptr__3_0ptr__3_0έex_ptr__3_0overlapped_ounter_lock_domain_inc_create_ptr__3_0destroy_ptr__3_0v3_ptr__3_0ɮdelta_Ϯptr__3_0Ȑv3_ptr__3_0ptr__3_0Аer__ptr__3_0ex_ptr__3_0ؐtadata_mory_̲add_ϯstr_add_ptr__3_0with_scope_ptr__3_0ptr__3_0with_scope_ptr__3_0to_current_Ѱptr__3_0ex_ptr__3_0ptr__3_0ex_ptr__3_0create_ptr__3_0start_ptr__3_0end_ptr__3_0name_ptr__3_0prepare_ptr__3_0cancel_ptr__3_0acquired_ptr__3_0releasing_ptr__3_0Ʋread_ptr__3_0write_ptr__3_0update_ptr__3_0ȑБؑaring_handle_create_ptr__3_0׹te_ѳck_calleget_ptr__3_0set_ptr__3_0_ead_mode_set_ptr__3_0Ӵname_set_ptr__3_0ºignore_ptr__3_0Ⱥcreate_ptr__3_0ptr__3_0ŵoff_ptr__3_0˵global_ѵȒptr__3_0off_ptr__3_0Вؒr_e_create_ptr__3_0destroy_ptr__3_0enter_ptr__3_0leave_ptr__3_0create_ptr__3_0reset_ptr__3_0ptr__3_0޷ex_ptr__3_0ptr__3_0ex_ptr__3_0ȓГؓgroup_create_ptr__3_0߸create_ptr__3_0pi_version_ptr__3_0v_save_ptr__3_0omain_create_ptr__3_0ѹebug_lockause_ptr__3_0repare_delayset_name_ptr__3_0ignore_ptr__3_0ȔДؔmodelocksizeoffsetpaddinglloc_pool_incrûx_gather_release_мbranch_bit_env_namepattern_type_nameҽdomain_countbpatb_dfltʼranch_bitsb޼patb_dfltranch_bits_dflttern_dfltternenv_name̽nameؽin_stksizeax_nthatch_lay_envnum_bufferslockmax_active_levelsblocktimeȿteam_nthnestedax_levelodeed_mapjust_gtid_modeaptive_backoff_paramsframeslock_mode_linescharsatomicwarn_chars_specifiedinitnextcycleon_countff_count_lockexactly_one_OpenMP_libraryIntel_OpenMP_libraryinitdestroysetunsettestinitdestroysetunsettestget_seqkind_124832ci0r6i0cirircrcĽнНЭimblloopsnglحmmonunteriddlexcsr_cache_listate_d_table_countercounterpool̯دnthtask_priority_capacity_ubpacityched_locknthproc_bind_verboseİȰаsocketnodetilecoreprocrequestedabs_flagferȱ̱б_verboseԱ_specifiedرhonsistency_checkunkecksܱstksizeall_threadsIJ_nthactive_nthȲвزȷз_locationflagslocationflags,ZB?????=-XX????WBWB??B?BBB??B?B?B--???=-DWZBBZo----==YY/YBBZ?BWmwcD??Zy????BBB/?BBA??D??BAB?B?/???D-mmWYmuowDY?/wNN ~5 5Y05/W>`GBso  .\q` ## "%% ##,6/6 ""))""))==HHffffuuuu%:!!!(*$$$ $% --'''"''..ff|uu""##!!%%++++ _chi  altg44::,,12-,,,,,,,,24-,,,,,,&,-'&&&&&/770/////44::O/P3C,Q57755,,66IITT,,&/35-9}}}}1<+++,24...,.-(((&:7222/11::}}  k|uummmm8 %% !    .v t  '::! -  UA`a-6  !0`F9gf 28w + #\W,r z!P +UKK0/t!,,nQ$39lhQ1_' -/P4, .51u4~~Q''rqM,nn0RP7N.( PZ0"OhQA&}1Bt w 3W>idE<6  rs2h3d(  ^    M?KE\ 6g 2$:1/iJR86@)$!#%% 9%  %% ..  !.m !    6 ;+;+>"#%% 9%  %% ..    8S00xDL`$`pppp888P8,p=g Kތ1GYƍ  a6^]GMuя O:kːT%USDCopϒ- ?j k  Г2!!/!Z"j"Ŕ"#-3#g`##Ε#$2`$q$$i%3%w&F&&Y!''#(,b(|(ә(2h))`*^*D+ܛ++&,V`,,-W--I-q.Y.ĝ..  /SK//Þ/ 0+L0Y00ɟ1P1.1P1s2T2Ơ2223n@333!3y]4Ң4E_55K6W6դa77'88v99Z:ȧ:$:5;t;; <7T>h@@Aթ+B7C'DCLNCtCIMJ̪MOST0BVHWf:[۫ $Q sFBxU>WMXY:`Vaŭ,ckdxD>yg~}߂`ݮ:m,֯?%5v\ˋߋ>Ho!DZ2ElQvвޒi+\ה*W-@+mgȵ'/˖\\o*fٗŷ2`y[ø#ĞYʞ٠YO̡ƺݡ 5h`ɻ"iMϰM}b!I(|;׾̵2D\Ymݸ,iɹ!*S!~'Z->Qi2|`6mb%p0mXZ| -_ H %p`"&#(C)g+,O,^*--z.82%6EV:sdN.Q$VN)XY[=]'am hkvw,yj{|~Ȃ7Qe% %aD  1Y 2p[5A  4Xw'h =|'1;/DfMYc m>wr#\OY<\ =!S!i!E`#$%;'CE''1)%*U+t++o,5.v082]43|4s5*8:E;|<<='>gT?V@`@@[LB@C7DDCDdEEv.Je83$Tg`62hv P  0  ) : K` \ m ~  `  p H X  " C d  0   x  3 V y Ⱥ غ  @  м 5 0M `f   P    0   ! H9 `X xu      4 S 8p P h    ; ^   ( @ X( pR {     B h 0 H ` x . [     B 8p P h   2 K j   ( @ X p6 [       0< H\bi +7 Y(w0@HPp .OP$BYr@@HP T2I(1;I^kNŰ l@4ڽJay(&]Q:Yy߷Nӿ-(Iwm"<EmiLm&!=_XzV-K`s}a0FZe6y  ).N>KTGlLL-ML@Ls 7o2 HN i B| >  v . h >    | z2 {W h| f[ tW UX .Y  L FX .W FW- $WC "JU"mZs"N" "S"ir"Gf"@e#8f#Vf6#efR#em#.C#J##{m#Yn#\# $ 5$ Q$l$ $ $ $ % 0(% PQ% (q% H% % (% h% & (& F& f&TC}& & & & &  ' D' g' ' ' ' ' ( >( b( ( ( (  ) 3) [) ȇ) Ї) ) ؇ * +* I* k* **D* 8* X+ P"+ H?+ @X+ ؉v+ X+ Ȉ+ ؈+ Ј+ `, A, hf, , h, , x - p1- Z- @- 8- X- ؆- `(. O. v. . . .  / F/ k/ H/ / 0/ (0 Ȇ%0 PJ0 Іm0 0 0 0  1 41 U1 8o11 11 11 "2 xC2 r2 p2 @29J2 2 p3 xB3 `j3 h3 3 3 03 !4 I4 j4 x4 h4 `4 @4 P5 X05 pS5 Hs5 5 5 5 85 +6 U6 0t6 6 Љ6 ȉ6 @7 (#7 `B7 c7 X7 P7 H7 7 8C#8c88oD8S8 p8`8U8 Р888k89+9 @!9G79M9&_9o9 9 9H909P9 Ġ9@: ȿ:H6:`F: \:p:A:~:F::2:i:h ;1;'H;V;il;^;n;n;;p;;a<2?"<@7<M<e<}<<Sb<8<<<a<=m%=?=`= =R=, = =A=>)>=>N>u_>Xt>>>Lm>m>)>?IM ? С/? bkQQ\QEQyQRdQ1R\6RrTR anRR~R\RRRqS]7SʄUSwSqS4]S"SSq T'Tf@TL]ZTNxT\TTGTaqT]U.U٤QUqpUd]UzU|]UU&aUV]6V҅TV0vVyVrVdVV`bWɍ%Wb?W]W]wW8W_yWjdW]W] Xe(X\aBX3`X~yX^XXXnrX^ Y)YĥKYriYO^YY YrYYnZg^.ZALZ]gZZbZDrZ7^Z[%[rD[[^[J|[^[m[{a[f[^ \(\LJ\yk\r\d\F\b\3\b]_1]^K]i]y]d]]^]]a^4^_~M^^g^9^^Cs^_^_^Ϧ_cs=_[W_`u__s__w_A_` `^;`Z`z}`s`+_```sa[2awPaW_kaшaaaՌaq_aaEb z?bs]bdwbsbbbbcbc_cn=cy^cdycc_ccac&dj~!d_;d͉Yd{dtd `ddd@te[+eIeLketeհee>`eZe_f7.fQfspf$`f+ffgtfeg&gMfAg#`gΩgugegg~geh)0hQShZurhhh[hh1ziX`i8i{Ziz{itiHciici@ jx`#jAjzbjv~{j[jjj\zjtkŰ.kGk\akk`kkݨktkcl/l dIlݏgl`l+l~l(\lPlm,u0mJmcmxmRmmmmDmm n$nS>nRnϿcnۿ~nnnn#nn/o'o@o0Xo qooo4ooo/pE+pqIpZhp_pep.jpRpypJ qq+qFq[qnq6qqGqqqq# r0!r$/r"Gr7Ear@J|rDOrTrrrCrss8stLs^sNzss ss'sisst0tNt3etttsttMttuX'u>uWunu`}uuuVuuu/u1v)vEvWv3hv2vvG0vvovqvrvitv; w wS;6w<Sw:rw>wzwwwwwxx 7xRxnxxx%xxxx5xxy+y?yT\yzyyyyyxyyz&z2z?zLzZzlzzzzzzzX{{9{J{\{St{t{q{{b{{a|~&|n;|Q|g|E~||2|#7|6|}*'}S<}rSI}VT}q}AO~}S}}e}}}}N~['~F~W~bi~|~~~Q~y~~4)b@Xqwv@h^!D6hL\7mQ{Ԁ8$\:rXwzgǁہYa&?,RVfx( JÂׂz-<Lb[ky"LʃBl&D'czÄ=Ԅb$K:Maq@҅"LBl* ;P,f2eƆ׆I(<KT^hr{ɇԇۇ%,5;CP\do}Ɉ߈*:PcxՉ "6J`{Ԋ%07AIQYbjv~Ë͋׋@ .gomp_critical_user__GOMP_atomic_end_GOMP_atomic_start_GOMP_barrier_GOMP_barrier_cancel_GOMP_cancel_GOMP_cancellation_point_GOMP_critical_end_GOMP_critical_name_end_GOMP_critical_name_start_GOMP_critical_start_GOMP_loop_dynamic_next_GOMP_loop_dynamic_start_GOMP_loop_end_GOMP_loop_end_cancel_GOMP_loop_end_nowait_GOMP_loop_guided_next_GOMP_loop_guided_start_GOMP_loop_ordered_dynamic_next_GOMP_loop_ordered_dynamic_start_GOMP_loop_ordered_guided_next_GOMP_loop_ordered_guided_start_GOMP_loop_ordered_runtime_next_GOMP_loop_ordered_runtime_start_GOMP_loop_ordered_static_next_GOMP_loop_ordered_static_start_GOMP_loop_runtime_next_GOMP_loop_runtime_start_GOMP_loop_static_next_GOMP_loop_static_start_GOMP_loop_ull_dynamic_next_GOMP_loop_ull_dynamic_start_GOMP_loop_ull_guided_next_GOMP_loop_ull_guided_start_GOMP_loop_ull_ordered_dynamic_next_GOMP_loop_ull_ordered_dynamic_start_GOMP_loop_ull_ordered_guided_next_GOMP_loop_ull_ordered_guided_start_GOMP_loop_ull_ordered_runtime_next_GOMP_loop_ull_ordered_runtime_start_GOMP_loop_ull_ordered_static_next_GOMP_loop_ull_ordered_static_start_GOMP_loop_ull_runtime_next_GOMP_loop_ull_runtime_start_GOMP_loop_ull_static_next_GOMP_loop_ull_static_start_GOMP_ordered_end_GOMP_ordered_start_GOMP_parallel_GOMP_parallel_end_GOMP_parallel_loop_dynamic_GOMP_parallel_loop_dynamic_start_GOMP_parallel_loop_guided_GOMP_parallel_loop_guided_start_GOMP_parallel_loop_runtime_GOMP_parallel_loop_runtime_start_GOMP_parallel_loop_static_GOMP_parallel_loop_static_start_GOMP_parallel_sections_GOMP_parallel_sections_start_GOMP_parallel_start_GOMP_sections_end_GOMP_sections_end_cancel_GOMP_sections_end_nowait_GOMP_sections_next_GOMP_sections_start_GOMP_single_copy_end_GOMP_single_copy_start_GOMP_single_start_GOMP_target_GOMP_target_data_GOMP_target_end_data_GOMP_target_update_GOMP_task_GOMP_taskgroup_end_GOMP_taskgroup_start_GOMP_taskwait_GOMP_taskyield_GOMP_teams__You_must_link_with_Intel_OpenMP_library__You_must_link_with_exactly_one_OpenMP_library__Z14__kmp_now_nsecv__Z14kmpc_poolprintv__Z15__kmp_env_printv__Z17__kmp_env_print_2v__Z17__kmp_itt_destroyv__Z17kmpc_get_poolmodev__Z17kmpc_get_poolsizev__Z17kmpc_get_poolstatPmS___Z17kmpc_set_poolmodei__Z17kmpc_set_poolsizem__Z18__kmp_fork_barrierii__Z18__kmp_join_barrieri__Z19__kmp_taskloop_taskiPv__Z20__kmp_change_libraryi__Z20__kmp_env_initializePKc__Z20__kmp_get_logical_idii__Z20__kmp_itt_initializev__Z20__kmp_setup_icv_copyP8kmp_teamiP20kmp_internal_controlP5ident__Z20__kmp_task_dup_allocP8kmp_infoP8kmp_task__Z20__kmp_taskloop_recurP5identiP8kmp_taskPyS3_xyyyyyyPv__Z21__kmp_get_physical_idii__Z21__kmp_taskloop_linearP5identiP8kmp_taskPyS3_xyyyyyPv__Z23__kmp_i18n_dump_catalogP11kmp_str_buf__Z25__kmp_default_tp_capacityiii__Z29__kmp_convert_to_millisecondsPKc__Z30__kmp_initial_threads_capacityi__Z30__kmp_register_library_startupv__Z36__kmp_unregister_root_current_threadi____kmp_allocate____kmp_fast_allocate____kmp_fast_free____kmp_free____kmp_page_allocate____kmp_thread_calloc____kmp_thread_free____kmp_thread_malloc____kmp_thread_realloc___kmp_abort_delay___kmp_abort_process___kmp_abort_thread___kmp_acquire_drdpa_lock___kmp_acquire_nested_drdpa_lock___kmp_acquire_nested_queuing_lock___kmp_acquire_nested_tas_lock___kmp_acquire_nested_ticket_lock___kmp_acquire_queuing_lock___kmp_acquire_tas_lock___kmp_acquire_ticket_lock___kmp_adaptive_backoff_params___kmp_adjust_gtid_mode___kmp_affinity_num_places___kmp_align_alloc___kmp_allThreadsSpecified___kmp_all_nth___kmp_allocate_cons_stack___kmp_allocate_indirect_lock___kmp_allocate_team___kmp_allocate_thread___kmp_atomic_lock___kmp_atomic_lock_10r___kmp_atomic_lock_16c___kmp_atomic_lock_16r___kmp_atomic_lock_1i___kmp_atomic_lock_20c___kmp_atomic_lock_2i___kmp_atomic_lock_32c___kmp_atomic_lock_4i___kmp_atomic_lock_4r___kmp_atomic_lock_8c___kmp_atomic_lock_8i___kmp_atomic_lock_8r___kmp_atomic_mode___kmp_auto___kmp_aux_dispatch_fini_chunk_4___kmp_aux_dispatch_fini_chunk_4u___kmp_aux_dispatch_fini_chunk_8___kmp_aux_dispatch_fini_chunk_8u___kmp_aux_dispatch_init_4___kmp_aux_dispatch_init_4u___kmp_aux_dispatch_init_8___kmp_aux_dispatch_init_8u___kmp_aux_set_blocktime___kmp_aux_set_defaults___kmp_aux_set_library___kmp_aux_set_stacksize___kmp_avail_proc___kmp_barrier___kmp_barrier_branch_bit_env_name___kmp_barrier_domain_count___kmp_barrier_gather_bb_dflt___kmp_barrier_gather_branch_bits___kmp_barrier_gather_pat_dflt___kmp_barrier_gather_pattern___kmp_barrier_pattern_env_name___kmp_barrier_pattern_name___kmp_barrier_release_bb_dflt___kmp_barrier_release_branch_bits___kmp_barrier_release_pat_dflt___kmp_barrier_release_pattern___kmp_barrier_type_name___kmp_bsr32___kmp_check_barrier___kmp_check_stack_overlap___kmp_check_sync___kmp_check_workshare___kmp_chunk___kmp_cleanup___kmp_cleanup_hierarchy___kmp_cleanup_indirect_user_locks___kmp_clear_system_time___kmp_clear_x87_fpu_status_word___kmp_common_destroy___kmp_common_destroy_gtid___kmp_common_initialize___kmp_console_lock___kmp_copyright___kmp_cpuinfo___kmp_create_worker___kmp_debug_assert___kmp_debug_buf___kmp_debug_buf_atomic___kmp_debug_buf_chars___kmp_debug_buf_lines___kmp_debug_buf_warn_chars___kmp_debug_buffer___kmp_debug_count___kmp_debug_lock___kmp_debug_printf___kmp_default_device___kmp_dephash_free___kmp_dephash_free_entries___kmp_destroy_drdpa_lock___kmp_destroy_nested_drdpa_lock___kmp_destroy_nested_queuing_lock___kmp_destroy_nested_tas_lock___kmp_destroy_nested_ticket_lock___kmp_destroy_queuing_lock___kmp_destroy_tas_lock___kmp_destroy_ticket_lock___kmp_determ_red___kmp_determine_reduction_method___kmp_dflt_blocktime___kmp_dflt_max_active_levels___kmp_dflt_nested___kmp_dflt_team_nth___kmp_dflt_team_nth_ub___kmp_direct_destroy___kmp_direct_init___kmp_direct_set___kmp_direct_test___kmp_direct_unset___kmp_disable___kmp_dispatch_lock___kmp_dispatch_num_buffers___kmp_display_env___kmp_display_env_verbose___kmp_dump_debug_buffer___kmp_duplicate_library_ok___kmp_elapsed___kmp_elapsed_tick___kmp_enable___kmp_end_split_barrier___kmp_enter_single___kmp_env_all_threads___kmp_env_blk_free___kmp_env_blk_init___kmp_env_blk_sort___kmp_env_blk_var___kmp_env_blocktime___kmp_env_checks___kmp_env_chunk___kmp_env_consistency_check___kmp_env_exists___kmp_env_format___kmp_env_free___kmp_env_get___kmp_env_omp_all_threads___kmp_env_omp_stksize___kmp_env_set___kmp_env_stksize___kmp_env_unset___kmp_eq_4___kmp_error_construct___kmp_error_construct2___kmp_execute_tasks_32___kmp_execute_tasks_64___kmp_execute_tasks_oncore___kmp_exit_lock___kmp_exit_single___kmp_exit_thread___kmp_expand_file_name___kmp_expand_host_name___kmp_finalize_bget___kmp_finish_implicit_task___kmp_force_reduction_method___kmp_foreign_tp___kmp_fork_call___kmp_forkjoin_frames___kmp_forkjoin_frames_mode___kmp_forkjoin_lock___kmp_free_cons_stack___kmp_free_fast_memory___kmp_free_implicit_task___kmp_free_task_team___kmp_free_team___kmp_free_thread___kmp_ge_4___kmp_generate_warnings___kmp_get_ancestor_thread_num___kmp_get_cancellation_status___kmp_get_global_thread_id___kmp_get_global_thread_id_reg___kmp_get_hierarchy___kmp_get_load_balance___kmp_get_max_active_levels___kmp_get_random___kmp_get_reduce_method___kmp_get_schedule___kmp_get_schedule_global___kmp_get_team_size___kmp_get_user_lock_owner___kmp_global___kmp_global_lock___kmp_gtid_get_specific___kmp_gtid_mode___kmp_gtid_set_specific___kmp_gtid_threadprivate_key___kmp_guided___kmp_handle_signals___kmp_hardware_timestamp___kmp_hot_teams_max_level___kmp_hot_teams_mode___kmp_hws_abs_flag___kmp_hws_core___kmp_hws_node___kmp_hws_proc___kmp_hws_requested___kmp_hws_socket___kmp_hws_tile___kmp_i18n_catclose___kmp_i18n_catgets___kmp_i18n_catopen___kmp_i_lock_table___kmp_ignore_mppbeg___kmp_ignore_mppend___kmp_indirect_destroy___kmp_indirect_get_flags___kmp_indirect_get_location___kmp_indirect_init___kmp_indirect_set___kmp_indirect_set_flags___kmp_indirect_set_location___kmp_indirect_test___kmp_indirect_unset___kmp_infinite_loop___kmp_inherit_fp_control___kmp_init_common___kmp_init_counter___kmp_init_drdpa_lock___kmp_init_dynamic_user_locks___kmp_init_gtid___kmp_init_implicit_task___kmp_init_middle___kmp_init_mxcsr___kmp_init_nested_drdpa_lock___kmp_init_nested_queuing_lock___kmp_init_nested_tas_lock___kmp_init_nested_ticket_lock___kmp_init_parallel___kmp_init_queuing_lock___kmp_init_random___kmp_init_serial___kmp_init_tas_lock___kmp_init_ticket_lock___kmp_init_user_locks___kmp_init_wait___kmp_init_x87_fpu_control_word___kmp_initialize_bget___kmp_initialize_fast_memory___kmp_initialize_system_tick___kmp_initz_lock___kmp_install_signals___kmp_internal_begin___kmp_internal_end_atexit___kmp_internal_end_dest___kmp_internal_end_dtor___kmp_internal_end_fini___kmp_internal_end_library___kmp_internal_end_thread___kmp_internal_fork___kmp_internal_join___kmp_invoke_microtask___kmp_invoke_task_func___kmp_invoke_teams_master___kmp_is_address_mapped___kmp_itt__ittapi_global___kmp_itt_api_version_ptr__3_0___kmp_itt_av_save_ptr__3_0___kmp_itt_barrier_domains___kmp_itt_clock_domain_create_ptr__3_0___kmp_itt_clock_domain_reset_ptr__3_0___kmp_itt_counter_create_ptr__3_0___kmp_itt_counter_destroy_ptr__3_0___kmp_itt_counter_inc_delta_ptr__3_0___kmp_itt_counter_inc_delta_v3_ptr__3_0___kmp_itt_counter_inc_ptr__3_0___kmp_itt_counter_inc_v3_ptr__3_0___kmp_itt_debug_lock___kmp_itt_domain_create_ptr__3_0___kmp_itt_enable_attach_ptr__3_0___kmp_itt_error_handler___kmp_itt_event_create_ptr__3_0___kmp_itt_event_end_ptr__3_0___kmp_itt_event_start_ptr__3_0___kmp_itt_fini_ittlib___kmp_itt_frame_begin_ptr__3_0___kmp_itt_frame_begin_v3_ptr__3_0___kmp_itt_frame_create_ptr__3_0___kmp_itt_frame_end_ptr__3_0___kmp_itt_frame_end_v3_ptr__3_0___kmp_itt_frame_submit_v3_ptr__3_0___kmp_itt_fsync_acquired_ptr__3_0___kmp_itt_fsync_cancel_ptr__3_0___kmp_itt_fsync_prepare_ptr__3_0___kmp_itt_fsync_releasing_ptr__3_0___kmp_itt_get_timestamp_ptr__3_0___kmp_itt_heap_allocate_begin_ptr__3_0___kmp_itt_heap_allocate_end_ptr__3_0___kmp_itt_heap_free_begin_ptr__3_0___kmp_itt_heap_free_end_ptr__3_0___kmp_itt_heap_function_create_ptr__3_0___kmp_itt_heap_internal_access_begin_ptr__3_0___kmp_itt_heap_internal_access_end_ptr__3_0___kmp_itt_heap_reallocate_begin_ptr__3_0___kmp_itt_heap_reallocate_end_ptr__3_0___kmp_itt_heap_record_memory_growth_begin_ptr__3_0___kmp_itt_heap_record_memory_growth_end_ptr__3_0___kmp_itt_heap_record_ptr__3_0___kmp_itt_heap_reset_detection_ptr__3_0___kmp_itt_id_create_ex_ptr__3_0___kmp_itt_id_create_ptr__3_0___kmp_itt_id_destroy_ex_ptr__3_0___kmp_itt_id_destroy_ptr__3_0___kmp_itt_imbalance_domains___kmp_itt_init_ittlib___kmp_itt_mark_create_ptr__3_0___kmp_itt_mark_global_off_ptr__3_0___kmp_itt_mark_global_ptr__3_0___kmp_itt_mark_off_ptr__3_0___kmp_itt_mark_ptr__3_0___kmp_itt_marker_ex_ptr__3_0___kmp_itt_marker_ptr__3_0___kmp_itt_memory_read_ptr__3_0___kmp_itt_memory_update_ptr__3_0___kmp_itt_memory_write_ptr__3_0___kmp_itt_metadata_add_ptr__3_0___kmp_itt_metadata_add_with_scope_ptr__3_0___kmp_itt_metadata_str_add_ptr__3_0___kmp_itt_metadata_str_add_with_scope_ptr__3_0___kmp_itt_model_aggregate_task_ptr__3_0___kmp_itt_model_clear_uses_ptr__3_0___kmp_itt_model_disable_pop_ptr__3_0___kmp_itt_model_disable_push_ptr__3_0___kmp_itt_model_induction_uses_ptr__3_0___kmp_itt_model_iteration_taskAL_ptr__3_0___kmp_itt_model_iteration_taskA_ptr__3_0___kmp_itt_model_lock_acquire_2_ptr__3_0___kmp_itt_model_lock_acquire_ptr__3_0___kmp_itt_model_lock_release_2_ptr__3_0___kmp_itt_model_lock_release_ptr__3_0___kmp_itt_model_observe_uses_ptr__3_0___kmp_itt_model_record_allocation_ptr__3_0___kmp_itt_model_record_deallocation_ptr__3_0___kmp_itt_model_reduction_uses_ptr__3_0___kmp_itt_model_site_beginAL_ptr__3_0___kmp_itt_model_site_beginA_ptr__3_0___kmp_itt_model_site_begin_ptr__3_0___kmp_itt_model_site_end_2_ptr__3_0___kmp_itt_model_site_end_ptr__3_0___kmp_itt_model_task_beginAL_ptr__3_0___kmp_itt_model_task_beginA_ptr__3_0___kmp_itt_model_task_begin_ptr__3_0___kmp_itt_model_task_end_2_ptr__3_0___kmp_itt_model_task_end_ptr__3_0___kmp_itt_notify_sync_acquired_ptr__3_0___kmp_itt_notify_sync_cancel_ptr__3_0___kmp_itt_notify_sync_name_ptr__3_0___kmp_itt_notify_sync_prepare_ptr__3_0___kmp_itt_notify_sync_releasing_ptr__3_0___kmp_itt_obj_mode_set_ptr__3_0___kmp_itt_pause_ptr__3_0___kmp_itt_prepare_delay___kmp_itt_region_begin_ptr__3_0___kmp_itt_region_domains___kmp_itt_region_end_ptr__3_0___kmp_itt_region_team_size___kmp_itt_relation_add_ex_ptr__3_0___kmp_itt_relation_add_ptr__3_0___kmp_itt_relation_add_to_current_ex_ptr__3_0___kmp_itt_relation_add_to_current_ptr__3_0___kmp_itt_resume_ptr__3_0___kmp_itt_set_error_handler___kmp_itt_set_track_ptr__3_0___kmp_itt_stack_callee_enter_ptr__3_0___kmp_itt_stack_callee_leave_ptr__3_0___kmp_itt_stack_caller_create_ptr__3_0___kmp_itt_stack_caller_destroy_ptr__3_0___kmp_itt_state_get_ptr__3_0___kmp_itt_state_set_ptr__3_0___kmp_itt_string_handle_create_ptr__3_0___kmp_itt_suppress_clear_range_ptr__3_0___kmp_itt_suppress_mark_range_ptr__3_0___kmp_itt_suppress_pop_ptr__3_0___kmp_itt_suppress_push_ptr__3_0___kmp_itt_sync_acquired_ptr__3_0___kmp_itt_sync_cancel_ptr__3_0___kmp_itt_sync_create_ptr__3_0___kmp_itt_sync_destroy_ptr__3_0___kmp_itt_sync_prepare_ptr__3_0___kmp_itt_sync_releasing_ptr__3_0___kmp_itt_sync_rename_ptr__3_0___kmp_itt_sync_set_name_ptr__3_0___kmp_itt_task_begin_ex_ptr__3_0___kmp_itt_task_begin_fn_ex_ptr__3_0___kmp_itt_task_begin_fn_ptr__3_0___kmp_itt_task_begin_overlapped_ex_ptr__3_0___kmp_itt_task_begin_overlapped_ptr__3_0___kmp_itt_task_begin_ptr__3_0___kmp_itt_task_end_ex_ptr__3_0___kmp_itt_task_end_overlapped_ex_ptr__3_0___kmp_itt_task_end_overlapped_ptr__3_0___kmp_itt_task_end_ptr__3_0___kmp_itt_task_group_ptr__3_0___kmp_itt_thr_ignore_ptr__3_0___kmp_itt_thr_mode_set_ptr__3_0___kmp_itt_thr_name_set_ptr__3_0___kmp_itt_thread_ignore_ptr__3_0___kmp_itt_thread_set_name_ptr__3_0___kmp_itt_track_create_ptr__3_0___kmp_itt_track_group_create_ptr__3_0___kmp_join_call___kmp_launch_thread___kmp_le_4___kmp_library___kmp_load_balance_interval___kmp_load_x87_fpu_control_word___kmp_lt_4___kmp_malloc_pool_incr___kmp_max_nth___kmp_max_task_priority___kmp_middle_initialize___kmp_monitor___kmp_msg___kmp_msg_empty___kmp_msg_error_code___kmp_msg_error_mesg___kmp_msg_format___kmp_msg_null___kmp_need_register_atfork___kmp_need_register_atfork_specified___kmp_neq_4___kmp_nested_nth___kmp_nested_proc_bind___kmp_next_wait___kmp_nth___kmp_num_locks_in_block___kmp_omp_cancellation___kmp_omp_task___kmp_openmp_version___kmp_parallel_deo___kmp_parallel_dxo___kmp_parallel_initialize___kmp_pop_current_task_from_thread___kmp_pop_parallel___kmp_pop_sync___kmp_pop_workshare___kmp_print_storage_map_gtid___kmp_print_version_1___kmp_print_version_2___kmp_printf___kmp_printf_no_lock___kmp_push_current_task_to_thread___kmp_push_num_teams___kmp_push_num_threads___kmp_push_parallel___kmp_push_proc_bind___kmp_push_sync___kmp_push_workshare___kmp_query_cpuid___kmp_read_cpu_time___kmp_read_from_file___kmp_read_system_info___kmp_read_system_time___kmp_reap_task_teams___kmp_reap_team___kmp_reap_worker___kmp_region_domain_count___kmp_register_atfork___kmp_register_root___kmp_release_64___kmp_release_deps___kmp_release_drdpa_lock___kmp_release_nested_drdpa_lock___kmp_release_nested_queuing_lock___kmp_release_nested_tas_lock___kmp_release_nested_ticket_lock___kmp_release_queuing_lock___kmp_release_tas_lock___kmp_release_ticket_lock___kmp_remove_signals___kmp_reserve_warn___kmp_resume_32___kmp_resume_64___kmp_resume_oncore___kmp_root___kmp_root_counter___kmp_run_after_invoked_task___kmp_run_before_invoked_task___kmp_runtime_destroy___kmp_runtime_initialize___kmp_save_internal_controls___kmp_sch_map___kmp_sched___kmp_serial_initialize___kmp_serialized_parallel___kmp_set_max_active_levels___kmp_set_num_threads___kmp_set_schedule___kmp_settings___kmp_spin_backoff___kmp_spin_backoff_params___kmp_static___kmp_stdio_lock___kmp_stkoffset___kmp_stkpadding___kmp_stksize___kmp_storage_map___kmp_storage_map_verbose___kmp_storage_map_verbose_specified___kmp_store_x87_fpu_control_word___kmp_str_buf_cat___kmp_str_buf_clear___kmp_str_buf_detach___kmp_str_buf_free___kmp_str_buf_print___kmp_str_buf_print_size___kmp_str_buf_reserve___kmp_str_buf_vprint___kmp_str_eqf___kmp_str_fname_free___kmp_str_fname_init___kmp_str_fname_match___kmp_str_format___kmp_str_free___kmp_str_loc_free___kmp_str_loc_init___kmp_str_match___kmp_str_match_false___kmp_str_match_true___kmp_str_replace___kmp_str_split___kmp_str_to_int___kmp_str_to_size___kmp_str_to_uint___kmp_str_token___kmp_suspend_32___kmp_suspend_64___kmp_suspend_initialize___kmp_suspend_oncore___kmp_suspend_uninitialize_thread___kmp_sys_max_nth___kmp_sys_min_stksize___kmp_task_alloc___kmp_task_counter___kmp_task_stealing_constraint___kmp_task_team_setup___kmp_task_team_sync___kmp_task_team_wait___kmp_tasking_barrier___kmp_tasking_mode___kmp_taskloop_min_tasks___kmp_team_counter___kmp_team_pool___kmp_teams_master___kmp_terminate_thread___kmp_test_drdpa_lock___kmp_test_nested_drdpa_lock___kmp_test_nested_queuing_lock___kmp_test_nested_tas_lock___kmp_test_nested_ticket_lock___kmp_test_queuing_lock___kmp_test_tas_lock___kmp_test_ticket_lock___kmp_thread_pool___kmp_thread_pool_active_nth___kmp_thread_pool_nth___kmp_thread_sleep___kmp_threadpriv_cache_list___kmp_threadprivate_d_table___kmp_threads___kmp_threads_capacity___kmp_ticks_per_msec___kmp_tls_gtid_min___kmp_tp_cached___kmp_tp_cached_lock___kmp_tp_capacity___kmp_tv_key___kmp_tv_threadprivate_store___kmp_unnamed_critical_addr___kmp_user_lock_kind___kmp_user_lock_seq___kmp_user_set_library___kmp_validate_locks___kmp_version___kmp_version_alt_comp___kmp_version_build___kmp_version_build_compiler___kmp_version_build_time___kmp_version_copyright___kmp_version_ftncdecl___kmp_version_ftnextra___kmp_version_lib_type___kmp_version_lib_ver___kmp_version_link_type___kmp_version_major___kmp_version_minor___kmp_version_omp_api___kmp_vprintf___kmp_wait_64___kmp_wait_to_unref_task_teams___kmp_wait_yield_4___kmp_wait_yield_4_ptr___kmp_warn___kmp_x86_cpuid___kmp_xproc___kmp_yield___kmp_yield_cycle___kmp_yield_init___kmp_yield_next___kmp_yield_off_count___kmp_yield_on_count___kmp_zero_bt___kmpc_atomic_1___kmpc_atomic_10___kmpc_atomic_16___kmpc_atomic_2___kmpc_atomic_20___kmpc_atomic_32___kmpc_atomic_4___kmpc_atomic_8___kmpc_atomic_cmplx10_add___kmpc_atomic_cmplx10_add_cpt___kmpc_atomic_cmplx10_div___kmpc_atomic_cmplx10_div_cpt___kmpc_atomic_cmplx10_div_cpt_rev___kmpc_atomic_cmplx10_div_rev___kmpc_atomic_cmplx10_mul___kmpc_atomic_cmplx10_mul_cpt___kmpc_atomic_cmplx10_rd___kmpc_atomic_cmplx10_sub___kmpc_atomic_cmplx10_sub_cpt___kmpc_atomic_cmplx10_sub_cpt_rev___kmpc_atomic_cmplx10_sub_rev___kmpc_atomic_cmplx10_swp___kmpc_atomic_cmplx10_wr___kmpc_atomic_cmplx4_add___kmpc_atomic_cmplx4_add_cmplx8___kmpc_atomic_cmplx4_add_cpt___kmpc_atomic_cmplx4_div___kmpc_atomic_cmplx4_div_cmplx8___kmpc_atomic_cmplx4_div_cpt___kmpc_atomic_cmplx4_div_cpt_rev___kmpc_atomic_cmplx4_div_rev___kmpc_atomic_cmplx4_mul___kmpc_atomic_cmplx4_mul_cmplx8___kmpc_atomic_cmplx4_mul_cpt___kmpc_atomic_cmplx4_rd___kmpc_atomic_cmplx4_sub___kmpc_atomic_cmplx4_sub_cmplx8___kmpc_atomic_cmplx4_sub_cpt___kmpc_atomic_cmplx4_sub_cpt_rev___kmpc_atomic_cmplx4_sub_rev___kmpc_atomic_cmplx4_swp___kmpc_atomic_cmplx4_wr___kmpc_atomic_cmplx8_add___kmpc_atomic_cmplx8_add_cpt___kmpc_atomic_cmplx8_div___kmpc_atomic_cmplx8_div_cpt___kmpc_atomic_cmplx8_div_cpt_rev___kmpc_atomic_cmplx8_div_rev___kmpc_atomic_cmplx8_mul___kmpc_atomic_cmplx8_mul_cpt___kmpc_atomic_cmplx8_rd___kmpc_atomic_cmplx8_sub___kmpc_atomic_cmplx8_sub_cpt___kmpc_atomic_cmplx8_sub_cpt_rev___kmpc_atomic_cmplx8_sub_rev___kmpc_atomic_cmplx8_swp___kmpc_atomic_cmplx8_wr___kmpc_atomic_end___kmpc_atomic_fixed1_add___kmpc_atomic_fixed1_add_cpt___kmpc_atomic_fixed1_andb___kmpc_atomic_fixed1_andb_cpt___kmpc_atomic_fixed1_andl___kmpc_atomic_fixed1_andl_cpt___kmpc_atomic_fixed1_div___kmpc_atomic_fixed1_div_cpt___kmpc_atomic_fixed1_div_cpt_rev___kmpc_atomic_fixed1_div_float8___kmpc_atomic_fixed1_div_rev___kmpc_atomic_fixed1_eqv___kmpc_atomic_fixed1_eqv_cpt___kmpc_atomic_fixed1_max___kmpc_atomic_fixed1_max_cpt___kmpc_atomic_fixed1_min___kmpc_atomic_fixed1_min_cpt___kmpc_atomic_fixed1_mul___kmpc_atomic_fixed1_mul_cpt___kmpc_atomic_fixed1_mul_float8___kmpc_atomic_fixed1_neqv___kmpc_atomic_fixed1_neqv_cpt___kmpc_atomic_fixed1_orb___kmpc_atomic_fixed1_orb_cpt___kmpc_atomic_fixed1_orl___kmpc_atomic_fixed1_orl_cpt___kmpc_atomic_fixed1_rd___kmpc_atomic_fixed1_shl___kmpc_atomic_fixed1_shl_cpt___kmpc_atomic_fixed1_shl_cpt_rev___kmpc_atomic_fixed1_shl_rev___kmpc_atomic_fixed1_shr___kmpc_atomic_fixed1_shr_cpt___kmpc_atomic_fixed1_shr_cpt_rev___kmpc_atomic_fixed1_shr_rev___kmpc_atomic_fixed1_sub___kmpc_atomic_fixed1_sub_cpt___kmpc_atomic_fixed1_sub_cpt_rev___kmpc_atomic_fixed1_sub_rev___kmpc_atomic_fixed1_swp___kmpc_atomic_fixed1_wr___kmpc_atomic_fixed1_xor___kmpc_atomic_fixed1_xor_cpt___kmpc_atomic_fixed1u_div___kmpc_atomic_fixed1u_div_cpt___kmpc_atomic_fixed1u_div_cpt_rev___kmpc_atomic_fixed1u_div_rev___kmpc_atomic_fixed1u_shr___kmpc_atomic_fixed1u_shr_cpt___kmpc_atomic_fixed1u_shr_cpt_rev___kmpc_atomic_fixed1u_shr_rev___kmpc_atomic_fixed2_add___kmpc_atomic_fixed2_add_cpt___kmpc_atomic_fixed2_andb___kmpc_atomic_fixed2_andb_cpt___kmpc_atomic_fixed2_andl___kmpc_atomic_fixed2_andl_cpt___kmpc_atomic_fixed2_div___kmpc_atomic_fixed2_div_cpt___kmpc_atomic_fixed2_div_cpt_rev___kmpc_atomic_fixed2_div_float8___kmpc_atomic_fixed2_div_rev___kmpc_atomic_fixed2_eqv___kmpc_atomic_fixed2_eqv_cpt___kmpc_atomic_fixed2_max___kmpc_atomic_fixed2_max_cpt___kmpc_atomic_fixed2_min___kmpc_atomic_fixed2_min_cpt___kmpc_atomic_fixed2_mul___kmpc_atomic_fixed2_mul_cpt___kmpc_atomic_fixed2_mul_float8___kmpc_atomic_fixed2_neqv___kmpc_atomic_fixed2_neqv_cpt___kmpc_atomic_fixed2_orb___kmpc_atomic_fixed2_orb_cpt___kmpc_atomic_fixed2_orl___kmpc_atomic_fixed2_orl_cpt___kmpc_atomic_fixed2_rd___kmpc_atomic_fixed2_shl___kmpc_atomic_fixed2_shl_cpt___kmpc_atomic_fixed2_shl_cpt_rev___kmpc_atomic_fixed2_shl_rev___kmpc_atomic_fixed2_shr___kmpc_atomic_fixed2_shr_cpt___kmpc_atomic_fixed2_shr_cpt_rev___kmpc_atomic_fixed2_shr_rev___kmpc_atomic_fixed2_sub___kmpc_atomic_fixed2_sub_cpt___kmpc_atomic_fixed2_sub_cpt_rev___kmpc_atomic_fixed2_sub_rev___kmpc_atomic_fixed2_swp___kmpc_atomic_fixed2_wr___kmpc_atomic_fixed2_xor___kmpc_atomic_fixed2_xor_cpt___kmpc_atomic_fixed2u_div___kmpc_atomic_fixed2u_div_cpt___kmpc_atomic_fixed2u_div_cpt_rev___kmpc_atomic_fixed2u_div_rev___kmpc_atomic_fixed2u_shr___kmpc_atomic_fixed2u_shr_cpt___kmpc_atomic_fixed2u_shr_cpt_rev___kmpc_atomic_fixed2u_shr_rev___kmpc_atomic_fixed4_add___kmpc_atomic_fixed4_add_cpt___kmpc_atomic_fixed4_andb___kmpc_atomic_fixed4_andb_cpt___kmpc_atomic_fixed4_andl___kmpc_atomic_fixed4_andl_cpt___kmpc_atomic_fixed4_div___kmpc_atomic_fixed4_div_cpt___kmpc_atomic_fixed4_div_cpt_rev___kmpc_atomic_fixed4_div_float8___kmpc_atomic_fixed4_div_rev___kmpc_atomic_fixed4_eqv___kmpc_atomic_fixed4_eqv_cpt___kmpc_atomic_fixed4_max___kmpc_atomic_fixed4_max_cpt___kmpc_atomic_fixed4_min___kmpc_atomic_fixed4_min_cpt___kmpc_atomic_fixed4_mul___kmpc_atomic_fixed4_mul_cpt___kmpc_atomic_fixed4_mul_float8___kmpc_atomic_fixed4_neqv___kmpc_atomic_fixed4_neqv_cpt___kmpc_atomic_fixed4_orb___kmpc_atomic_fixed4_orb_cpt___kmpc_atomic_fixed4_orl___kmpc_atomic_fixed4_orl_cpt___kmpc_atomic_fixed4_rd___kmpc_atomic_fixed4_shl___kmpc_atomic_fixed4_shl_cpt___kmpc_atomic_fixed4_shl_cpt_rev___kmpc_atomic_fixed4_shl_rev___kmpc_atomic_fixed4_shr___kmpc_atomic_fixed4_shr_cpt___kmpc_atomic_fixed4_shr_cpt_rev___kmpc_atomic_fixed4_shr_rev___kmpc_atomic_fixed4_sub___kmpc_atomic_fixed4_sub_cpt___kmpc_atomic_fixed4_sub_cpt_rev___kmpc_atomic_fixed4_sub_rev___kmpc_atomic_fixed4_swp___kmpc_atomic_fixed4_wr___kmpc_atomic_fixed4_xor___kmpc_atomic_fixed4_xor_cpt___kmpc_atomic_fixed4u_div___kmpc_atomic_fixed4u_div_cpt___kmpc_atomic_fixed4u_div_cpt_rev___kmpc_atomic_fixed4u_div_rev___kmpc_atomic_fixed4u_shr___kmpc_atomic_fixed4u_shr_cpt___kmpc_atomic_fixed4u_shr_cpt_rev___kmpc_atomic_fixed4u_shr_rev___kmpc_atomic_fixed8_add___kmpc_atomic_fixed8_add_cpt___kmpc_atomic_fixed8_andb___kmpc_atomic_fixed8_andb_cpt___kmpc_atomic_fixed8_andl___kmpc_atomic_fixed8_andl_cpt___kmpc_atomic_fixed8_div___kmpc_atomic_fixed8_div_cpt___kmpc_atomic_fixed8_div_cpt_rev___kmpc_atomic_fixed8_div_float8___kmpc_atomic_fixed8_div_rev___kmpc_atomic_fixed8_eqv___kmpc_atomic_fixed8_eqv_cpt___kmpc_atomic_fixed8_max___kmpc_atomic_fixed8_max_cpt___kmpc_atomic_fixed8_min___kmpc_atomic_fixed8_min_cpt___kmpc_atomic_fixed8_mul___kmpc_atomic_fixed8_mul_cpt___kmpc_atomic_fixed8_mul_float8___kmpc_atomic_fixed8_neqv___kmpc_atomic_fixed8_neqv_cpt___kmpc_atomic_fixed8_orb___kmpc_atomic_fixed8_orb_cpt___kmpc_atomic_fixed8_orl___kmpc_atomic_fixed8_orl_cpt___kmpc_atomic_fixed8_rd___kmpc_atomic_fixed8_shl___kmpc_atomic_fixed8_shl_cpt___kmpc_atomic_fixed8_shl_cpt_rev___kmpc_atomic_fixed8_shl_rev___kmpc_atomic_fixed8_shr___kmpc_atomic_fixed8_shr_cpt___kmpc_atomic_fixed8_shr_cpt_rev___kmpc_atomic_fixed8_shr_rev___kmpc_atomic_fixed8_sub___kmpc_atomic_fixed8_sub_cpt___kmpc_atomic_fixed8_sub_cpt_rev___kmpc_atomic_fixed8_sub_rev___kmpc_atomic_fixed8_swp___kmpc_atomic_fixed8_wr___kmpc_atomic_fixed8_xor___kmpc_atomic_fixed8_xor_cpt___kmpc_atomic_fixed8u_div___kmpc_atomic_fixed8u_div_cpt___kmpc_atomic_fixed8u_div_cpt_rev___kmpc_atomic_fixed8u_div_rev___kmpc_atomic_fixed8u_shr___kmpc_atomic_fixed8u_shr_cpt___kmpc_atomic_fixed8u_shr_cpt_rev___kmpc_atomic_fixed8u_shr_rev___kmpc_atomic_float10_add___kmpc_atomic_float10_add_cpt___kmpc_atomic_float10_div___kmpc_atomic_float10_div_cpt___kmpc_atomic_float10_div_cpt_rev___kmpc_atomic_float10_div_rev___kmpc_atomic_float10_mul___kmpc_atomic_float10_mul_cpt___kmpc_atomic_float10_rd___kmpc_atomic_float10_sub___kmpc_atomic_float10_sub_cpt___kmpc_atomic_float10_sub_cpt_rev___kmpc_atomic_float10_sub_rev___kmpc_atomic_float10_swp___kmpc_atomic_float10_wr___kmpc_atomic_float4_add___kmpc_atomic_float4_add_cpt___kmpc_atomic_float4_add_float8___kmpc_atomic_float4_div___kmpc_atomic_float4_div_cpt___kmpc_atomic_float4_div_cpt_rev___kmpc_atomic_float4_div_float8___kmpc_atomic_float4_div_rev___kmpc_atomic_float4_max___kmpc_atomic_float4_max_cpt___kmpc_atomic_float4_min___kmpc_atomic_float4_min_cpt___kmpc_atomic_float4_mul___kmpc_atomic_float4_mul_cpt___kmpc_atomic_float4_mul_float8___kmpc_atomic_float4_rd___kmpc_atomic_float4_sub___kmpc_atomic_float4_sub_cpt___kmpc_atomic_float4_sub_cpt_rev___kmpc_atomic_float4_sub_float8___kmpc_atomic_float4_sub_rev___kmpc_atomic_float4_swp___kmpc_atomic_float4_wr___kmpc_atomic_float8_add___kmpc_atomic_float8_add_cpt___kmpc_atomic_float8_div___kmpc_atomic_float8_div_cpt___kmpc_atomic_float8_div_cpt_rev___kmpc_atomic_float8_div_rev___kmpc_atomic_float8_max___kmpc_atomic_float8_max_cpt___kmpc_atomic_float8_min___kmpc_atomic_float8_min_cpt___kmpc_atomic_float8_mul___kmpc_atomic_float8_mul_cpt___kmpc_atomic_float8_rd___kmpc_atomic_float8_sub___kmpc_atomic_float8_sub_cpt___kmpc_atomic_float8_sub_cpt_rev___kmpc_atomic_float8_sub_rev___kmpc_atomic_float8_swp___kmpc_atomic_float8_wr___kmpc_atomic_start___kmpc_barrier___kmpc_barrier_master___kmpc_barrier_master_nowait___kmpc_begin___kmpc_bound_num_threads___kmpc_bound_thread_num___kmpc_cancel___kmpc_cancel_barrier___kmpc_cancellationpoint___kmpc_copyprivate___kmpc_critical___kmpc_critical_with_hint___kmpc_destroy_lock___kmpc_destroy_nest_lock___kmpc_dispatch_fini_4___kmpc_dispatch_fini_4u___kmpc_dispatch_fini_8___kmpc_dispatch_fini_8u___kmpc_dispatch_init_4___kmpc_dispatch_init_4u___kmpc_dispatch_init_8___kmpc_dispatch_init_8u___kmpc_dispatch_next_4___kmpc_dispatch_next_4u___kmpc_dispatch_next_8___kmpc_dispatch_next_8u___kmpc_dist_dispatch_init_4___kmpc_dist_dispatch_init_4u___kmpc_dist_dispatch_init_8___kmpc_dist_dispatch_init_8u___kmpc_dist_for_static_init_4___kmpc_dist_for_static_init_4u___kmpc_dist_for_static_init_8___kmpc_dist_for_static_init_8u___kmpc_doacross_fini___kmpc_doacross_init___kmpc_doacross_post___kmpc_doacross_wait___kmpc_end___kmpc_end_barrier_master___kmpc_end_critical___kmpc_end_master___kmpc_end_ordered___kmpc_end_reduce___kmpc_end_reduce_nowait___kmpc_end_serialized_parallel___kmpc_end_single___kmpc_end_taskgroup___kmpc_end_taskq___kmpc_end_taskq_task___kmpc_flush___kmpc_for_static_fini___kmpc_for_static_init_4___kmpc_for_static_init_4u___kmpc_for_static_init_8___kmpc_for_static_init_8u___kmpc_fork_call___kmpc_fork_teams___kmpc_get_parent_taskid___kmpc_get_taskid___kmpc_global_num_threads___kmpc_global_thread_num___kmpc_in_parallel___kmpc_init_lock___kmpc_init_lock_with_hint___kmpc_init_nest_lock___kmpc_init_nest_lock_with_hint___kmpc_invoke_task_func___kmpc_master___kmpc_ok_to_fork___kmpc_omp_task___kmpc_omp_task_alloc___kmpc_omp_task_begin_if0___kmpc_omp_task_complete_if0___kmpc_omp_task_parts___kmpc_omp_task_with_deps___kmpc_omp_taskwait___kmpc_omp_taskyield___kmpc_omp_wait_deps___kmpc_ordered___kmpc_pop_num_threads___kmpc_proxy_task_completed___kmpc_proxy_task_completed_ooo___kmpc_push_num_teams___kmpc_push_num_threads___kmpc_push_proc_bind___kmpc_reduce___kmpc_reduce_nowait___kmpc_serialized_parallel___kmpc_set_lock___kmpc_set_nest_lock___kmpc_single___kmpc_task___kmpc_task_buffer___kmpc_task_reduction_get_th_data___kmpc_task_reduction_init___kmpc_taskgroup___kmpc_taskloop___kmpc_taskq___kmpc_taskq_task___kmpc_team_static_init_4___kmpc_team_static_init_4u___kmpc_team_static_init_8___kmpc_team_static_init_8u___kmpc_test_lock___kmpc_test_nest_lock___kmpc_threadprivate___kmpc_threadprivate_cached___kmpc_threadprivate_register___kmpc_threadprivate_register_vec___kmpc_unset_lock___kmpc_unset_nest_lock_kmp_aligned_malloc_kmp_aligned_malloc__kmp_calloc_kmp_calloc__kmp_create_affinity_mask_kmp_create_affinity_mask__kmp_destroy_affinity_mask_kmp_destroy_affinity_mask__kmp_free_kmp_free__kmp_get_affinity_kmp_get_affinity__kmp_get_affinity_mask_proc_kmp_get_affinity_mask_proc__kmp_get_affinity_max_proc_kmp_get_affinity_max_proc__kmp_get_blocktime_kmp_get_blocktime__kmp_get_cancellation_status_kmp_get_cancellation_status__kmp_get_library_kmp_get_library__kmp_get_num_known_threads_kmp_get_num_known_threads__kmp_get_stacksize_kmp_get_stacksize__kmp_get_stacksize_s_kmp_get_stacksize_s__kmp_malloc_kmp_malloc__kmp_realloc_kmp_realloc__kmp_set_affinity_kmp_set_affinity__kmp_set_affinity_mask_proc_kmp_set_affinity_mask_proc__kmp_set_blocktime_kmp_set_blocktime__kmp_set_defaults_kmp_set_defaults__kmp_set_disp_num_buffers_kmp_set_disp_num_buffers__kmp_set_library_kmp_set_library__kmp_set_library_serial_kmp_set_library_serial__kmp_set_library_throughput_kmp_set_library_throughput__kmp_set_library_turnaround_kmp_set_library_turnaround__kmp_set_stacksize_kmp_set_stacksize__kmp_set_stacksize_s_kmp_set_stacksize_s__kmp_set_warnings_off_kmp_set_warnings_off__kmp_set_warnings_on_kmp_set_warnings_on__kmp_threadprivate_insert_kmp_threadprivate_insert_private_data_kmp_unset_affinity_mask_proc_kmp_unset_affinity_mask_proc__kmpc_aligned_malloc_kmpc_calloc_kmpc_free_kmpc_get_affinity_mask_proc_kmpc_malloc_kmpc_realloc_kmpc_set_affinity_mask_proc_kmpc_set_blocktime_kmpc_set_defaults_kmpc_set_disp_num_buffers_kmpc_set_library_kmpc_set_stacksize_kmpc_set_stacksize_s_kmpc_unset_affinity_mask_proc_metadata_domain_omp_destroy_lock_omp_destroy_lock__omp_destroy_nest_lock_omp_destroy_nest_lock__omp_get_active_level_omp_get_active_level__omp_get_ancestor_thread_num_omp_get_ancestor_thread_num__omp_get_cancellation_omp_get_cancellation__omp_get_default_device_omp_get_default_device__omp_get_dynamic_omp_get_dynamic__omp_get_level_omp_get_level__omp_get_max_active_levels_omp_get_max_active_levels__omp_get_max_task_priority_omp_get_max_task_priority__omp_get_max_threads_omp_get_max_threads__omp_get_nested_omp_get_nested__omp_get_num_devices_omp_get_num_devices__omp_get_num_places_omp_get_num_places__omp_get_num_procs_omp_get_num_procs__omp_get_num_teams_omp_get_num_teams__omp_get_num_threads_omp_get_num_threads__omp_get_partition_num_places_omp_get_partition_num_places__omp_get_partition_place_nums_omp_get_partition_place_nums__omp_get_place_num_omp_get_place_num__omp_get_place_num_procs_omp_get_place_num_procs__omp_get_place_proc_ids_omp_get_place_proc_ids__omp_get_proc_bind_omp_get_proc_bind__omp_get_schedule_omp_get_schedule__omp_get_team_num_omp_get_team_num__omp_get_team_size_omp_get_team_size__omp_get_thread_limit_omp_get_thread_limit__omp_get_thread_num_omp_get_thread_num__omp_get_wtick_omp_get_wtick__omp_get_wtime_omp_get_wtime__omp_in_final_omp_in_final__omp_in_parallel_omp_in_parallel__omp_init_lock_omp_init_lock__omp_init_lock_with_hint_omp_init_lock_with_hint__omp_init_nest_lock_omp_init_nest_lock__omp_init_nest_lock_with_hint_omp_init_nest_lock_with_hint__omp_is_initial_device_omp_is_initial_device__omp_set_default_device_omp_set_default_device__omp_set_dynamic_omp_set_dynamic__omp_set_lock_omp_set_lock__omp_set_max_active_levels_omp_set_max_active_levels__omp_set_nest_lock_omp_set_nest_lock__omp_set_nested_omp_set_nested__omp_set_num_threads_omp_set_num_threads__omp_set_schedule_omp_set_schedule__omp_test_lock_omp_test_lock__omp_test_nest_lock_omp_test_nest_lock__omp_unset_lock_omp_unset_lock__omp_unset_nest_lock_omp_unset_nest_lock__ompc_get_ancestor_thread_num_ompc_get_team_size_ompc_set_dynamic_ompc_set_max_active_levels_ompc_set_nested_ompc_set_num_threads_ompc_set_schedule_string_handle_imbl_string_handle_loop_string_handle_sngl__NSGetEnviron___bzero___divdc3___divsc3___divxc3___error___muldc3___mulsc3___mulxc3___stack_chk_fail___stack_chk_guard___stderrp___toupper_abort_atoi_catclose_catgets_catopen_dlerror_dlopen_dlsym_fclose_fflush_fopen_fprintf_free_getenv_gethostname_getloadavg_getpid_getrusage_gettimeofday_host_info_mach_host_self_mach_task_self__malloc_memcpy_pthread_atfork_pthread_attr_destroy_pthread_attr_init_pthread_attr_setdetachstate_pthread_attr_setstacksize_pthread_cancel_pthread_cond_destroy_pthread_cond_init_pthread_cond_signal_pthread_cond_wait_pthread_condattr_init_pthread_create_pthread_exit_pthread_getspecific_pthread_join_pthread_key_create_pthread_key_delete_pthread_mutex_destroy_pthread_mutex_init_pthread_mutex_lock_pthread_mutex_unlock_pthread_mutexattr_destroy_pthread_mutexattr_init_pthread_mutexattr_settype_pthread_self_pthread_setcancelstate_pthread_setcanceltype_pthread_setspecific_qsort_realloc_sched_yield_setenv_sigaction_sleep_snprintf_sscanf_strchr_strcmp_strcspn_strdup_strerror_r_strlen_strncmp_strncpy_strrchr_strspn_strtod_strtok_r_sysconf_times_unsetenv_vfprintf_vfscanf_vm_read_overwrite_vsnprintfdyld_stub_binder__ZL30__kmp_itt_sync_create_init_3_0PvPKcS1_i__ZL30__kmp_itt_sync_rename_init_3_0PvPKc__ZL31__kmp_itt_sync_destroy_init_3_0Pv__ZL31__kmp_itt_sync_prepare_init_3_0Pv__ZL30__kmp_itt_sync_cancel_init_3_0Pv__ZL32__kmp_itt_sync_acquired_init_3_0Pv__ZL33__kmp_itt_sync_releasing_init_3_0Pv__ZL32__kmp_itt_suppress_push_init_3_0j__ZL31__kmp_itt_suppress_pop_init_3_0v__ZL38__kmp_itt_suppress_mark_range_init_3_019__itt_suppress_modejPvm__ZL39__kmp_itt_suppress_clear_range_init_3_019__itt_suppress_modejPvm__ZL32__kmp_itt_fsync_prepare_init_3_0Pv__ZL31__kmp_itt_fsync_cancel_init_3_0Pv__ZL33__kmp_itt_fsync_acquired_init_3_0Pv__ZL34__kmp_itt_fsync_releasing_init_3_0Pv__ZL35__kmp_itt_model_site_begin_init_3_0PPvS0_PKc__ZL33__kmp_itt_model_site_end_init_3_0PPvS0___ZL35__kmp_itt_model_task_begin_init_3_0PPvS0_PKc__ZL33__kmp_itt_model_task_end_init_3_0PPvS0___ZL37__kmp_itt_model_lock_acquire_init_3_0Pv__ZL37__kmp_itt_model_lock_release_init_3_0Pv__ZL42__kmp_itt_model_record_allocation_init_3_0Pvm__ZL44__kmp_itt_model_record_deallocation_init_3_0Pv__ZL39__kmp_itt_model_induction_uses_init_3_0Pvm__ZL39__kmp_itt_model_reduction_uses_init_3_0Pvm__ZL37__kmp_itt_model_observe_uses_init_3_0Pvm__ZL35__kmp_itt_model_clear_uses_init_3_0Pv__ZL36__kmp_itt_model_site_beginA_init_3_0PKc__ZL37__kmp_itt_model_site_beginAL_init_3_0PKcm__ZL36__kmp_itt_model_task_beginA_init_3_0PKc__ZL37__kmp_itt_model_task_beginAL_init_3_0PKcm__ZL40__kmp_itt_model_iteration_taskA_init_3_0PKc__ZL41__kmp_itt_model_iteration_taskAL_init_3_0PKcm__ZL35__kmp_itt_model_site_end_2_init_3_0v__ZL35__kmp_itt_model_task_end_2_init_3_0v__ZL39__kmp_itt_model_lock_acquire_2_init_3_0Pv__ZL39__kmp_itt_model_lock_release_2_init_3_0Pv__ZL39__kmp_itt_model_aggregate_task_init_3_0m__ZL37__kmp_itt_model_disable_push_init_3_019__itt_model_disable__ZL36__kmp_itt_model_disable_pop_init_3_0v__ZL39__kmp_itt_heap_function_create_init_3_0PKcS0___ZL38__kmp_itt_heap_allocate_begin_init_3_0Pvmi__ZL36__kmp_itt_heap_allocate_end_init_3_0PvPS_mi__ZL34__kmp_itt_heap_free_begin_init_3_0PvS___ZL32__kmp_itt_heap_free_end_init_3_0PvS___ZL40__kmp_itt_heap_reallocate_begin_init_3_0PvS_mi__ZL38__kmp_itt_heap_reallocate_end_init_3_0PvS_PS_mi__ZL45__kmp_itt_heap_internal_access_begin_init_3_0v__ZL43__kmp_itt_heap_internal_access_end_init_3_0v__ZL50__kmp_itt_heap_record_memory_growth_begin_init_3_0v__ZL48__kmp_itt_heap_record_memory_growth_end_init_3_0v__ZL39__kmp_itt_heap_reset_detection_init_3_0j__ZL30__kmp_itt_heap_record_init_3_0j__ZL28__kmp_itt_id_create_init_3_0PK13___itt_domain9___itt_id__ZL29__kmp_itt_id_destroy_init_3_0PK13___itt_domain9___itt_id__ZL32__kmp_itt_get_timestamp_init_3_0v__ZL31__kmp_itt_region_begin_init_3_0PK13___itt_domain9___itt_idS2_P20___itt_string_handle__ZL29__kmp_itt_region_end_init_3_0PK13___itt_domain9___itt_id__ZL33__kmp_itt_frame_begin_v3_init_3_0PK13___itt_domainP9___itt_id__ZL31__kmp_itt_frame_end_v3_init_3_0PK13___itt_domainP9___itt_id__ZL34__kmp_itt_frame_submit_v3_init_3_0PK13___itt_domainP9___itt_idyy__ZL29__kmp_itt_task_group_init_3_0PK13___itt_domain9___itt_idS2_P20___itt_string_handle__ZL29__kmp_itt_task_begin_init_3_0PK13___itt_domain9___itt_idS2_P20___itt_string_handle__ZL32__kmp_itt_task_begin_fn_init_3_0PK13___itt_domain9___itt_idS2_Pv__ZL27__kmp_itt_task_end_init_3_0PK13___itt_domain__ZL33__kmp_itt_counter_inc_v3_init_3_0PK13___itt_domainP20___itt_string_handle__ZL39__kmp_itt_counter_inc_delta_v3_init_3_0PK13___itt_domainP20___itt_string_handley__ZL25__kmp_itt_marker_init_3_0PK13___itt_domain9___itt_idP20___itt_string_handle11__itt_scope__ZL31__kmp_itt_metadata_add_init_3_0PK13___itt_domain9___itt_idP20___itt_string_handle19__itt_metadata_typemPv__ZL35__kmp_itt_metadata_str_add_init_3_0PK13___itt_domain9___itt_idP20___itt_string_handlePKcm__ZL42__kmp_itt_relation_add_to_current_init_3_0PK13___itt_domain14__itt_relation9___itt_id__ZL31__kmp_itt_relation_add_init_3_0PK13___itt_domain9___itt_id14__itt_relationS2___ZL31__kmp_itt_event_create_init_3_0PKci__ZL30__kmp_itt_event_start_init_3_0i__ZL28__kmp_itt_event_end_init_3_0i__ZL32__kmp_itt_sync_set_name_init_3_0PvPKcS1_i__ZL35__kmp_itt_notify_sync_name_init_3_0PvPKciS1_ii__ZL38__kmp_itt_notify_sync_prepare_init_3_0Pv__ZL37__kmp_itt_notify_sync_cancel_init_3_0Pv__ZL39__kmp_itt_notify_sync_acquired_init_3_0Pv__ZL40__kmp_itt_notify_sync_releasing_init_3_0Pv__ZL30__kmp_itt_memory_read_init_3_0Pvm__ZL31__kmp_itt_memory_write_init_3_0Pvm__ZL32__kmp_itt_memory_update_init_3_0Pvm__ZL28__kmp_itt_state_get_init_3_0v__ZL28__kmp_itt_state_set_init_3_0i__ZL31__kmp_itt_obj_mode_set_init_3_014__itt_obj_prop15__itt_obj_state__ZL31__kmp_itt_thr_mode_set_init_3_014__itt_thr_prop15__itt_thr_state__ZL31__kmp_itt_frame_create_init_3_0PKc__ZL30__kmp_itt_frame_begin_init_3_0P13__itt_frame_t__ZL28__kmp_itt_frame_end_init_3_0P13__itt_frame_t__ZL33__kmp_itt_counter_create_init_3_0PKcS0___ZL34__kmp_itt_counter_destroy_init_3_0P14___itt_counter__ZL30__kmp_itt_counter_inc_init_3_0P14___itt_counter__ZL36__kmp_itt_counter_inc_delta_init_3_0P14___itt_countery__ZL30__kmp_itt_mark_create_init_3_0PKc__ZL23__kmp_itt_mark_init_3_0iPKc__ZL27__kmp_itt_mark_off_init_3_0i__ZL30__kmp_itt_mark_global_init_3_0iPKc__ZL34__kmp_itt_mark_global_off_init_3_0i__ZL38__kmp_itt_stack_caller_create_init_3_0v__ZL39__kmp_itt_stack_caller_destroy_init_3_0P13___itt_caller__ZL37__kmp_itt_stack_callee_enter_init_3_0P13___itt_caller__ZL37__kmp_itt_stack_callee_leave_init_3_0P13___itt_caller__ZL38__kmp_itt_clock_domain_create_init_3_0PFvP17___itt_clock_infoPvES1___ZL37__kmp_itt_clock_domain_reset_init_3_0v__ZL31__kmp_itt_id_create_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_id__ZL32__kmp_itt_id_destroy_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_id__ZL32__kmp_itt_task_begin_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_idS4_P20___itt_string_handle__ZL35__kmp_itt_task_begin_fn_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_idS4_Pv__ZL30__kmp_itt_task_end_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy__ZL40__kmp_itt_task_begin_overlapped_init_3_0PK13___itt_domain9___itt_idS2_P20___itt_string_handle__ZL43__kmp_itt_task_begin_overlapped_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_idS4_P20___itt_string_handle__ZL38__kmp_itt_task_end_overlapped_init_3_0PK13___itt_domain9___itt_id__ZL41__kmp_itt_task_end_overlapped_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_id__ZL28__kmp_itt_marker_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_idP20___itt_string_handle11__itt_scope__ZL42__kmp_itt_metadata_add_with_scope_init_3_0PK13___itt_domain11__itt_scopeP20___itt_string_handle19__itt_metadata_typemPv__ZL46__kmp_itt_metadata_str_add_with_scope_init_3_0PK13___itt_domain11__itt_scopeP20___itt_string_handlePKcm__ZL45__kmp_itt_relation_add_to_current_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy14__itt_relation9___itt_id__ZL34__kmp_itt_relation_add_ex_init_3_0PK13___itt_domainP19___itt_clock_domainy9___itt_id14__itt_relationS4___ZL37__kmp_itt_track_group_create_init_3_0P20___itt_string_handle23___itt_track_group_type__ZL31__kmp_itt_track_create_init_3_0P18___itt_track_groupP20___itt_string_handle17___itt_track_type__ZL28__kmp_itt_set_track_init_3_0P12___itt_track__ZL30__kmp_itt_api_version_init_3_0v__ZL26__kmp_itt_av_save_init_3_0PviPKiiPKci__ZL32__kmp_itt_domain_create_init_3_0PKc__ZL39__kmp_itt_string_handle_create_init_3_0PKc__ZL24__kmp_itt_pause_init_3_0v__ZL25__kmp_itt_resume_init_3_0v__ZL34__kmp_itt_thread_set_name_init_3_0PKc__ZL32__kmp_itt_thread_ignore_init_3_0v__ZL31__kmp_itt_thr_name_set_init_3_0PKci__ZL29__kmp_itt_thr_ignore_init_3_0v__ZL32__kmp_itt_enable_attach_init_3_0v__ZL26__itt_nullify_all_pointersv__ZL18__itt_report_errorjz__ZL17__itt_get_env_varPKc__ZL18__kmp_bget_dequeueP8kmp_info__ZL4bgetP8kmp_infol__ZL5bgetzP8kmp_infol__ZL4brelP8kmp_infoPv__ZL5bgetrP8kmp_infoPvl__ZL21___kmp_allocate_alignmm__ZL31__kmp_bget_insert_into_freelistP8thr_dataP6bfhead__ZL41__kmp_enter_critical_section_reduce_blockP5identiPA8_i__ZL18___kmp_env_var_cmpPK13__kmp_env_varS1___ZL12__kmp_pragmaiPK5ident__ZL23__kmp_expand_cons_stackiP11cons_header__ZL26__kmp_do_serial_initializev__ZL24__kmp_alloc_argv_entriesiP8kmp_teami__ZL20__kmp_expand_threadsii__ZL30__kmp_print_thread_storage_mapP8kmp_infoi__ZL21__kmp_get_global_icvsv__ZL21__kmp_initialize_infoP8kmp_infoP8kmp_teamii__ZL23__kmp_reinitialize_teamP8kmp_teamP20kmp_internal_controlP5ident__ZL21__kmp_initialize_teamP8kmp_teamiP20kmp_internal_controlP5ident__ZL26__kmp_allocate_team_arraysP8kmp_teami__ZL26__kmp_do_middle_initializev__ZL20__kmp_free_hot_teamsP8kmp_rootP8kmp_infoii__ZL17__kmp_reap_threadP8kmp_infoi__ZL14__kmp_stg_initv__ZL15__kmp_stg_parsePKcS0___ZL13__kmp_stg_cmpPKvS0___ZL27__kmp_stg_parse_all_threadsPKcS0_Pv__ZL27__kmp_stg_print_all_threadsP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_blocktimePKcS0_Pv__ZL25__kmp_stg_print_blocktimeP11kmp_str_bufPKcPv__ZL32__kmp_stg_parse_duplicate_lib_okPKcS0_Pv__ZL32__kmp_stg_print_duplicate_lib_okP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_wait_policyPKcS0_Pv__ZL27__kmp_stg_print_wait_policyP11kmp_str_bufPKcPv__ZL24__kmp_stg_parse_settingsPKcS0_Pv__ZL24__kmp_stg_print_settingsP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_stackoffsetPKcS0_Pv__ZL27__kmp_stg_print_stackoffsetP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_stacksizePKcS0_Pv__ZL25__kmp_stg_print_stacksizeP11kmp_str_bufPKcPv__ZL24__kmp_stg_parse_stackpadPKcS0_Pv__ZL24__kmp_stg_print_stackpadP11kmp_str_bufPKcPv__ZL23__kmp_stg_parse_versionPKcS0_Pv__ZL23__kmp_stg_print_versionP11kmp_str_bufPKcPv__ZL24__kmp_stg_parse_warningsPKcS0_Pv__ZL24__kmp_stg_print_warningsP11kmp_str_bufPKcPv__ZL22__kmp_stg_parse_nestedPKcS0_Pv__ZL22__kmp_stg_print_nestedP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_num_threadsPKcS0_Pv__ZL27__kmp_stg_print_num_threadsP11kmp_str_bufPKcPv__ZL23__kmp_stg_parse_taskingPKcS0_Pv__ZL23__kmp_stg_print_taskingP11kmp_str_bufPKcPv__ZL29__kmp_stg_parse_task_stealingPKcS0_Pv__ZL29__kmp_stg_print_task_stealingP11kmp_str_bufPKcPv__ZL33__kmp_stg_parse_max_active_levelsPKcS0_Pv__ZL33__kmp_stg_print_max_active_levelsP11kmp_str_bufPKcPv__ZL30__kmp_stg_parse_default_devicePKcS0_Pv__ZL30__kmp_stg_print_default_deviceP11kmp_str_bufPKcPv__ZL33__kmp_stg_parse_max_task_priorityPKcS0_Pv__ZL33__kmp_stg_print_max_task_priorityP11kmp_str_bufPKcPv__ZL34__kmp_stg_parse_taskloop_min_tasksPKcS0_Pv__ZL34__kmp_stg_print_taskloop_min_tasksP11kmp_str_bufPKcPv__ZL28__kmp_stg_parse_disp_buffersPKcS0_Pv__ZL28__kmp_stg_print_disp_buffersP11kmp_str_bufPKcPv__ZL31__kmp_stg_parse_hot_teams_levelPKcS0_Pv__ZL31__kmp_stg_print_hot_teams_levelP11kmp_str_bufPKcPv__ZL30__kmp_stg_parse_hot_teams_modePKcS0_Pv__ZL30__kmp_stg_print_hot_teams_modeP11kmp_str_bufPKcPv__ZL30__kmp_stg_parse_handle_signalsPKcS0_Pv__ZL30__kmp_stg_print_handle_signalsP11kmp_str_bufPKcPv__ZL34__kmp_stg_parse_inherit_fp_controlPKcS0_Pv__ZL34__kmp_stg_print_inherit_fp_controlP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_align_allocPKcS0_Pv__ZL27__kmp_stg_print_align_allocP11kmp_str_bufPKcPv__ZL34__kmp_stg_parse_barrier_branch_bitPKcS0_Pv__ZL34__kmp_stg_print_barrier_branch_bitP11kmp_str_bufPKcPv__ZL31__kmp_stg_parse_barrier_patternPKcS0_Pv__ZL31__kmp_stg_print_barrier_patternP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_abort_delayPKcS0_Pv__ZL27__kmp_stg_print_abort_delayP11kmp_str_bufPKcPv__ZL28__kmp_stg_parse_cpuinfo_filePKcS0_Pv__ZL28__kmp_stg_print_cpuinfo_fileP11kmp_str_bufPKcPv__ZL31__kmp_stg_parse_force_reductionPKcS0_Pv__ZL31__kmp_stg_print_force_reductionP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_storage_mapPKcS0_Pv__ZL27__kmp_stg_print_storage_mapP11kmp_str_bufPKcPv__ZL33__kmp_stg_parse_all_threadprivatePKcS0_Pv__ZL33__kmp_stg_print_all_threadprivateP11kmp_str_bufPKcPv__ZL45__kmp_stg_parse_foreign_threads_threadprivatePKcS0_Pv__ZL45__kmp_stg_print_foreign_threads_threadprivateP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_proc_bindPKcS0_Pv__ZL25__kmp_stg_print_proc_bindP11kmp_str_bufPKcPv__ZL28__kmp_stg_parse_init_at_forkPKcS0_Pv__ZL28__kmp_stg_print_init_at_forkP11kmp_str_bufPKcPv__ZL24__kmp_stg_parse_schedulePKcS0_Pv__ZL24__kmp_stg_print_scheduleP11kmp_str_bufPKcPv__ZL28__kmp_stg_parse_omp_schedulePKcS0_Pv__ZL28__kmp_stg_print_omp_scheduleP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_atomic_modePKcS0_Pv__ZL27__kmp_stg_print_atomic_modeP11kmp_str_bufPKcPv__ZL33__kmp_stg_parse_consistency_checkPKcS0_Pv__ZL33__kmp_stg_print_consistency_checkP11kmp_str_bufPKcPv__ZL33__kmp_stg_parse_itt_prepare_delayPKcS0_Pv__ZL33__kmp_stg_print_itt_prepare_delayP11kmp_str_bufPKcPv__ZL32__kmp_stg_parse_malloc_pool_incrPKcS0_Pv__ZL32__kmp_stg_print_malloc_pool_incrP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_init_waitPKcS0_Pv__ZL25__kmp_stg_print_init_waitP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_next_waitPKcS0_Pv__ZL25__kmp_stg_print_next_waitP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_gtid_modePKcS0_Pv__ZL25__kmp_stg_print_gtid_modeP11kmp_str_bufPKcPv__ZL27__kmp_stg_parse_omp_dynamicPKcS0_Pv__ZL27__kmp_stg_print_omp_dynamicP11kmp_str_bufPKcPv__ZL32__kmp_stg_parse_kmp_dynamic_modePKcS0_Pv__ZL32__kmp_stg_print_kmp_dynamic_modeP11kmp_str_bufPKcPv__ZL35__kmp_stg_parse_ld_balance_intervalPKcS0_Pv__ZL35__kmp_stg_print_ld_balance_intervalP11kmp_str_bufPKcPv__ZL26__kmp_stg_parse_lock_blockPKcS0_Pv__ZL26__kmp_stg_print_lock_blockP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_lock_kindPKcS0_Pv__ZL25__kmp_stg_print_lock_kindP11kmp_str_bufPKcPv__ZL35__kmp_stg_parse_spin_backoff_paramsPKcS0_Pv__ZL35__kmp_stg_print_spin_backoff_paramsP11kmp_str_bufPKcPv__ZL35__kmp_stg_parse_adaptive_lock_propsPKcS0_Pv__ZL35__kmp_stg_print_adaptive_lock_propsP11kmp_str_bufPKcPv__ZL25__kmp_stg_parse_hw_subsetPKcS0_Pv__ZL25__kmp_stg_print_hw_subsetP11kmp_str_bufPKcPv__ZL31__kmp_stg_parse_forkjoin_framesPKcS0_Pv__ZL31__kmp_stg_print_forkjoin_framesP11kmp_str_bufPKcPv__ZL36__kmp_stg_parse_forkjoin_frames_modePKcS0_Pv__ZL36__kmp_stg_print_forkjoin_frames_modeP11kmp_str_bufPKcPv__ZL31__kmp_stg_parse_omp_display_envPKcS0_Pv__ZL31__kmp_stg_print_omp_display_envP11kmp_str_bufPKcPv__ZL32__kmp_stg_parse_omp_cancellationPKcS0_Pv__ZL32__kmp_stg_print_omp_cancellationP11kmp_str_bufPKcPv__ZL22__kmp_stg_check_rivalsPKcS0_PP13__kmp_setting__ZL30__kmp_strcasecmp_with_sentinelPKcS0_c__ZL19__kmp_stg_parse_intPKcS0_iiPi__ZL19__kmp_stg_print_intP11kmp_str_bufPKci__ZL20__kmp_stg_parse_boolPKcS0_Pi__ZL20__kmp_stg_print_boolP11kmp_str_bufPKci__ZL19__kmp_stg_print_strP11kmp_str_bufPKcS2___ZL20__kmp_stg_parse_sizePKcS0_mmPiPmm__ZL20__kmp_stg_print_sizeP11kmp_str_bufPKcm__ZL15__kmp_match_strPKcS0_PS0___ZL17__kmp_task_finishiP8kmp_taskP12kmp_taskdata__ZL20__kmp_enable_taskingP13kmp_task_teamP8kmp_info__ZL15__kmp_push_taskiP8kmp_task__ZL17__kmp_invoke_taskiP8kmp_taskP12kmp_taskdata__ZL24__kmp_allocate_task_teamP8kmp_infoP8kmp_team__ZN11kmp_flag_324waitEP8kmp_infoiPv__ZL30__kmp_bottom_half_finish_proxyiP8kmp_task__ZL29__kmp_free_task_and_ancestorsiP12kmp_taskdataP8kmp_info__ZL24__kmp_realloc_task_dequeP8kmp_infoP15kmp_thread_data__ZL20__kmp_remove_my_taskP8kmp_infoiP13kmp_task_teami__ZL16__kmp_steal_taskP8kmp_infoiP13kmp_task_teamPViPii__ZL14__kmp_taskq_eoPiS_P5ident__ZL14__kmp_taskq_xoPiS_P5ident__ZL24__kmp_find_task_in_queueiP17kmpc_task_queue_t__ZL29__kmp_execute_task_from_queueP9kmp_taskqP5identiP12kmpc_thunk_ti__ZL35__kmp_find_task_in_descendant_queueiP17kmpc_task_queue_t__ZL42__kmp_find_and_remove_finished_child_taskqP9kmp_taskqiP17kmpc_task_queue_t__ZL28__kmp_remove_queue_from_treeP9kmp_taskqiP17kmpc_task_queue_ti__ZL28__kmp_remove_all_child_taskqP9kmp_taskqiP17kmpc_task_queue_t__ZL16__kmp_free_taskqP9kmp_taskqP17kmpc_task_queue_tii__ZL18__kmp_dequeue_taskiP17kmpc_task_queue_ti__ZL20__kmp_taskq_allocatemi__ZL22__kmp_init_common_dataPvm__ZL22__kmp_copy_common_dataPvP12private_data__ZL26__kmp_hyper_barrier_gather12barrier_typeP8kmp_infoiiPFvPvS2_ES2___ZL33__kmp_hierarchical_barrier_gather12barrier_typeP8kmp_infoiiPFvPvS2_ES2___ZL25__kmp_tree_barrier_gather12barrier_typeP8kmp_infoiiPFvPvS2_ES2___ZL27__kmp_linear_barrier_gather12barrier_typeP8kmp_infoiiPFvPvS2_ES2___ZL22__kmp_itt_frame_submitiyyiP5identii__ZL28__kmp_itt_metadata_imbalanceiyyyy__ZL27__kmp_hyper_barrier_release12barrier_typeP8kmp_infoiiiPv__ZL34__kmp_hierarchical_barrier_release12barrier_typeP8kmp_infoiiiPv__ZL26__kmp_tree_barrier_release12barrier_typeP8kmp_infoiiiPv__ZL28__kmp_linear_barrier_release12barrier_typeP8kmp_infoiiiPv__ZN11kmp_flag_647releaseEv__ZN11kmp_flag_644waitEP8kmp_infoiPv__ZL38__kmp_init_hierarchical_barrier_thread12barrier_typeP10kmp_bstatejiiP8kmp_team__ZN15kmp_flag_oncore7releaseEv__ZN15kmp_flag_oncore4waitEP8kmp_infoi__ZN15kmp_flag_oncore13notdone_checkEv__ZN14hierarchy_info4initEP11AddrUnsPairi__ZN14hierarchy_info6resizeEj__ZL33__kmp_affinity_cmp_Address_labelsPKvS0___ZN14hierarchy_info12deriveLevelsEP11AddrUnsPairi__GLOBAL__sub_I_kmp_affinity.cpp__ZL19__kmp_dispatch_initIiEvP5identi10sched_typeT_S3_N8traits_tIS3_E8signed_tES6_i__ZL19__kmp_dispatch_initIjEvP5identi10sched_typeT_S3_N8traits_tIS3_E8signed_tES6_i__ZL19__kmp_dispatch_initIxEvP5identi10sched_typeT_S3_N8traits_tIS3_E8signed_tES6_i__ZL19__kmp_dispatch_initIyEvP5identi10sched_typeT_S3_N8traits_tIS3_E8signed_tES6_i__ZL21__kmp_dispatch_finishIjEviP5ident__ZL21__kmp_dispatch_finishIyEviP5ident__ZL27__kmp_dispatch_finish_chunkIjEviP5ident__ZL27__kmp_dispatch_finish_chunkIyEviP5ident__ZL24__kmp_dispatch_deo_errorPiS_P5ident__ZL24__kmp_dispatch_dxo_errorPiS_P5ident__ZL18__kmp_dispatch_deoIjEvPiS0_P5ident__ZL18__kmp_dispatch_dxoIjEvPiS0_P5ident__ZL23__kmp_itt_metadata_loopP5identyyy__ZL18__kmp_dispatch_deoIyEvPiS0_P5ident__ZL18__kmp_dispatch_dxoIyEvPiS0_P5ident__ZL16__kmp_wait_yieldIyET_PVS0_S0_PFjS0_S0_EPv__ZL37__kmp_acquire_tas_lock_timed_templateP12kmp_tas_locki__ZL41__kmp_acquire_queuing_lock_timed_templateILb0EEiP16kmp_queuing_locki__ZL39__kmp_acquire_drdpa_lock_timed_templateP14kmp_drdpa_locki__ZL24__kmp_init_indirect_lockPj18kmp_dyna_lockseq_t__ZL22__kmp_init_direct_lockPj18kmp_dyna_lockseq_t__ZL27__kmp_destroy_indirect_lockPj__ZL22__kmp_destroy_hle_lockPj__ZL24__kmp_init_adaptive_lockP17kmp_adaptive_lock__ZL19__kmp_init_rtm_lockP16kmp_queuing_lock__ZL27__kmp_destroy_adaptive_lockP17kmp_adaptive_lock__ZL22__kmp_destroy_rtm_lockP16kmp_queuing_lock__ZL30__kmp_set_ticket_lock_locationP15kmp_ticket_lockPK5ident__ZL31__kmp_set_queuing_lock_locationP16kmp_queuing_lockPK5ident__ZL29__kmp_set_drdpa_lock_locationP14kmp_drdpa_lockPK5ident__ZL27__kmp_set_ticket_lock_flagsP15kmp_ticket_lockj__ZL28__kmp_set_queuing_lock_flagsP16kmp_queuing_lockj__ZL26__kmp_set_drdpa_lock_flagsP14kmp_drdpa_lockj__ZL30__kmp_get_ticket_lock_locationP15kmp_ticket_lock__ZL31__kmp_get_queuing_lock_locationP16kmp_queuing_lock__ZL29__kmp_get_drdpa_lock_locationP14kmp_drdpa_lock__ZL27__kmp_get_ticket_lock_flagsP15kmp_ticket_lock__ZL28__kmp_get_queuing_lock_flagsP16kmp_queuing_lock__ZL26__kmp_get_drdpa_lock_flagsP14kmp_drdpa_lock__ZL18__kmp_bakery_checkPvj__ZL35__kmp_set_indirect_lock_with_checksPji__ZL34__kmp_acquire_tas_lock_with_checksP12kmp_tas_locki__ZL34__kmp_acquire_hle_lock_with_checksPji__ZL22__kmp_acquire_hle_lockPji__ZL37__kmp_unset_indirect_lock_with_checksPji__ZL34__kmp_release_tas_lock_with_checksP12kmp_tas_locki__ZL34__kmp_release_hle_lock_with_checksPji__ZL22__kmp_release_hle_lockPji__ZL36__kmp_test_indirect_lock_with_checksPji__ZL31__kmp_test_tas_lock_with_checksP12kmp_tas_locki__ZL31__kmp_test_hle_lock_with_checksPji__ZL19__kmp_test_hle_lockPji__ZL37__kmp_acquire_ticket_lock_with_checksP15kmp_ticket_locki__ZL38__kmp_acquire_queuing_lock_with_checksP16kmp_queuing_locki__ZL39__kmp_acquire_adaptive_lock_with_checksP17kmp_adaptive_locki__ZL36__kmp_acquire_drdpa_lock_with_checksP14kmp_drdpa_locki__ZL34__kmp_acquire_rtm_lock_with_checksP16kmp_queuing_locki__ZL41__kmp_acquire_nested_tas_lock_with_checksP12kmp_tas_locki__ZL44__kmp_acquire_nested_ticket_lock_with_checksP15kmp_ticket_locki__ZL45__kmp_acquire_nested_queuing_lock_with_checksP16kmp_queuing_locki__ZL43__kmp_acquire_nested_drdpa_lock_with_checksP14kmp_drdpa_locki__ZL27__kmp_acquire_adaptive_lockP17kmp_adaptive_locki__ZL29__kmp_test_adaptive_lock_onlyP17kmp_adaptive_locki__ZL22__kmp_acquire_rtm_lockP16kmp_queuing_locki__ZL37__kmp_release_ticket_lock_with_checksP15kmp_ticket_locki__ZL38__kmp_release_queuing_lock_with_checksP16kmp_queuing_locki__ZL39__kmp_release_adaptive_lock_with_checksP17kmp_adaptive_locki__ZL36__kmp_release_drdpa_lock_with_checksP14kmp_drdpa_locki__ZL34__kmp_release_rtm_lock_with_checksP16kmp_queuing_locki__ZL41__kmp_release_nested_tas_lock_with_checksP12kmp_tas_locki__ZL44__kmp_release_nested_ticket_lock_with_checksP15kmp_ticket_locki__ZL45__kmp_release_nested_queuing_lock_with_checksP16kmp_queuing_locki__ZL43__kmp_release_nested_drdpa_lock_with_checksP14kmp_drdpa_locki__ZL27__kmp_release_adaptive_lockP17kmp_adaptive_locki__ZL22__kmp_release_rtm_lockP16kmp_queuing_locki__ZL34__kmp_test_ticket_lock_with_checksP15kmp_ticket_locki__ZL35__kmp_test_queuing_lock_with_checksP16kmp_queuing_locki__ZL36__kmp_test_adaptive_lock_with_checksP17kmp_adaptive_locki__ZL33__kmp_test_drdpa_lock_with_checksP14kmp_drdpa_locki__ZL31__kmp_test_rtm_lock_with_checksP16kmp_queuing_locki__ZL38__kmp_test_nested_tas_lock_with_checksP12kmp_tas_locki__ZL41__kmp_test_nested_ticket_lock_with_checksP15kmp_ticket_locki__ZL42__kmp_test_nested_queuing_lock_with_checksP16kmp_queuing_locki__ZL40__kmp_test_nested_drdpa_lock_with_checksP14kmp_drdpa_locki__ZL24__kmp_test_adaptive_lockP17kmp_adaptive_locki__ZL19__kmp_test_rtm_lockP16kmp_queuing_locki__ZL23__kmp_set_indirect_lockPji__ZL25__kmp_unset_indirect_lockPji__ZL24__kmp_test_indirect_lockPji__ZL23__kmp_itt_metadata_loopP5identyyy__ZL19__kmp_launch_workerPv__ZL25__kmp_install_one_handleriPFviEi__ZL18__kmp_team_handleri__ZL20__kmp_atfork_preparev__ZL19__kmp_atfork_parentv__ZL18__kmp_atfork_childv__ZL15__kmp_sigactioniPK9sigactionPS___ZL18__kmp_null_handleri__ZL31__kmp_suspend_initialize_threadP8kmp_info__ZL20__kmp_GOMP_fork_callP5identiPFvPvEPFvPiS4_zEiz__ZL28__kmp_GOMP_microtask_wrapperPiS_PFvPvES0___ZL37__kmp_GOMP_parallel_microtask_wrapperPiS_PFvPvES0_jP5ident10sched_typellll__ZL23__kmp_depnode_list_freeP8kmp_infoP16kmp_depnode_list__ZL16__kmp_check_depsiP11kmp_depnodeP8kmp_taskP11kmp_dephashbiP15kmp_depend_infoiS6___ZL18__kmp_dephash_findP8kmp_infoP11kmp_dephashl__ZL8dll_path__ZL11api_version__ZL13bget_bin_size__ZZL27___kmp_env_blk_parse_stringP13__kmp_env_blkPKcE13str_delimiter__ZZ23__kmp_i18n_dump_catalogP11kmp_str_bufE6ranges__ZL12__kmp_primes__ZL10__itt_null__ZL10__itt_null__ZL10__itt_null__ZL10__itt_null__ZL10group_list__ZL11group_alias__ZL11cons_text_c__ZL19__kmp_i18n_sections__ZL8api_list__ZZL17__itt_get_env_varPKcE9env_value__ZL3cat__ZL4lock__ZL23__kmp_i18n_default_meta__ZL26__kmp_i18n_default_strings__ZL26__kmp_i18n_default_formats__ZL27__kmp_i18n_default_messages__ZL24__kmp_i18n_default_hints__ZL13metadata_lock__ZL15__kmp_stg_table__ZZL14__kmp_stg_initvE8kmp_data__ZZL14__kmp_stg_initvE9gomp_data__ZZL14__kmp_stg_initvE8omp_data__ZZL14__kmp_stg_initvE8kmp_data_0__ZZL14__kmp_stg_initvE8omp_data_0__ZZL14__kmp_stg_initvE10force_data__ZZL14__kmp_stg_initvE11determ_data__ZL20__kmp_task_team_lock__ZL13metadata_lock__ZL13metadata_lock__ZL16direct_set_check__ZL18direct_unset_check__ZL17direct_test_check__ZL18indirect_set_check__ZL20indirect_unset_check__ZL19indirect_test_check__ZL10direct_set__ZL12direct_unset__ZL11direct_test__ZL12indirect_set__ZL14indirect_unset__ZL13indirect_test__ZL13metadata_lock__ZZ12GOMP_barrierE3loc__ZZ19GOMP_critical_startE3loc__ZZ17GOMP_critical_endE3loc__ZZ24GOMP_critical_name_startE3loc__ZZ22GOMP_critical_name_endE3loc__ZZ17GOMP_single_startE3loc__ZZ22GOMP_single_copy_startE3loc__ZZ18GOMP_ordered_startE3loc__ZZ16GOMP_ordered_endE3loc__ZZ19GOMP_parallel_startE3loc__ZZ17GOMP_parallel_endE3loc__ZZ22GOMP_loop_static_startE3loc__ZZ21GOMP_loop_static_nextE3loc__ZZ23GOMP_loop_dynamic_startE3loc__ZZ22GOMP_loop_dynamic_nextE3loc__ZZ22GOMP_loop_guided_startE3loc__ZZ21GOMP_loop_guided_nextE3loc__ZZ23GOMP_loop_runtime_startE3loc__ZZ22GOMP_loop_runtime_nextE3loc__ZZ30GOMP_loop_ordered_static_startE3loc__ZZ29GOMP_loop_ordered_static_nextE3loc__ZZ31GOMP_loop_ordered_dynamic_startE3loc__ZZ30GOMP_loop_ordered_dynamic_nextE3loc__ZZ30GOMP_loop_ordered_guided_startE3loc__ZZ29GOMP_loop_ordered_guided_nextE3loc__ZZ31GOMP_loop_ordered_runtime_startE3loc__ZZ30GOMP_loop_ordered_runtime_nextE3loc__ZZ26GOMP_loop_ull_static_startE3loc__ZZ25GOMP_loop_ull_static_nextE3loc__ZZ27GOMP_loop_ull_dynamic_startE3loc__ZZ26GOMP_loop_ull_dynamic_nextE3loc__ZZ26GOMP_loop_ull_guided_startE3loc__ZZ25GOMP_loop_ull_guided_nextE3loc__ZZ27GOMP_loop_ull_runtime_startE3loc__ZZ26GOMP_loop_ull_runtime_nextE3loc__ZZ34GOMP_loop_ull_ordered_static_startE3loc__ZZ33GOMP_loop_ull_ordered_static_nextE3loc__ZZ35GOMP_loop_ull_ordered_dynamic_startE3loc__ZZ34GOMP_loop_ull_ordered_dynamic_nextE3loc__ZZ34GOMP_loop_ull_ordered_guided_startE3loc__ZZ33GOMP_loop_ull_ordered_guided_nextE3loc__ZZ35GOMP_loop_ull_ordered_runtime_startE3loc__ZZ34GOMP_loop_ull_ordered_runtime_nextE3loc__ZZ31GOMP_parallel_loop_static_startE3loc__ZZ32GOMP_parallel_loop_dynamic_startE3loc__ZZ31GOMP_parallel_loop_guided_startE3loc__ZZ32GOMP_parallel_loop_runtime_startE3loc__ZZ9GOMP_taskE3loc__ZZ13GOMP_taskwaitE3loc__ZZ19GOMP_sections_startE3loc__ZZ18GOMP_sections_nextE3loc__ZZ28GOMP_parallel_sections_startE3loc__ZZ13GOMP_parallelE3loc__ZZ22GOMP_parallel_sectionsE3loc__ZZ25GOMP_parallel_loop_staticE3loc__ZZ26GOMP_parallel_loop_dynamicE3loc__ZZ25GOMP_parallel_loop_guidedE3loc__ZZ26GOMP_parallel_loop_runtimeE3loc__ZZ20GOMP_taskgroup_startE3loc__ZZ18GOMP_taskgroup_endE3loc__ZZ23GOMP_cancellation_pointE3loc__ZZ19GOMP_barrier_cancelE3loc__ZZ11GOMP_cancelE3loc__ZZ24GOMP_sections_end_cancelE3loc__ZZ20GOMP_loop_end_cancelE3loc__tid__gtid__ZL16init_thread_info__ZL11null_domain__ZL18null_string_handle__ZZ21__kmp_itt_fini_ittlibE14current_thread__ZZ21__kmp_itt_init_ittlibE14current_thread__ZZL17__itt_get_env_varPKcE8env_buff__ZL6status__ZL27__kmp_thread_pool_insert_pt__ZL23__kmp_registration_flag__ZL22__kmp_registration_str__ZL13blocktime_str__ZZL14__kmp_stg_initvE11initialized__ZZL14__kmp_stg_initvE6rivals__ZZL14__kmp_stg_initvE6rivals_0__ZZL14__kmp_stg_initvE6rivals_1__ZZL14__kmp_stg_initvE6rivals_2__ZZL25__kmp_stg_parse_hw_subsetPKcS0_PvE6parsed__ZL21__kmp_free_task_teams__ZL17machine_hierarchy__ZL24__kmp_indirect_lock_pool__ZL24__kmp_indirect_lock_size__ZL12__kmp_sigset__ZL24__kmp_suspend_mutex_attr__ZL23__kmp_suspend_cond_attr__ZL16__kmp_fork_count__ZL18__kmp_init_runtime__ZL13__kmp_wait_mx__ZL13__kmp_wait_cv__ZL14__kmp_sighldrs__ZL20__kmp_sys_timer_data.0.0__ZL20__kmp_sys_timer_data.0.1__ZL23__kmp_version_1_printed__ZL23__kmp_version_2_printedqiskit-aer-0.4.1/src/third-party/macos/lib/muparserx.7z000066400000000000000000011262141362723322000230120ustar00rootroot000000000000007z'1IjY>G]ruBoEx2& P,]_ ЊL7j{4O?ɭFJ\i) Wò}L ,k(<(P|MJ-@W@LDxbp΂6bK 8wGQFdukxȭʥd{jקq!(>ݞo2zI('K.h{xFw0kj~y{>-ʗMѽ&T:n\XSϭ1$Eߪ#>1C^ˤz&gp@Ie]|s#3ycf8|b%թeK@  ~Mke?~]x0 >L%`rUU0v؍64s:~ܴ@"OBse&ʍn?nm6կ#)!#L_"?|oM#r,\Y%颻TCq^zbM Rs5OK3dvyh*H̝dߓɩQfH]);!|,.aX#SyvA>xsE!T"|1K]a+?|YJYo4 |哃 r鼴Ee@ O'4!5 ,Aob@ANNr}md U}OV"-f,7q%ЎBF*8SzirW6߼_*] 6'c[^4ڼ3sט~DX*L Һxhb=8dyR92OdcGrѥ\wf::F+Z X"=6L:4LROGyuc6Fߦ.k"0 lX1‚`@_Xz,iU ;Z ME#csZD%v0/!H(*NеSCvL^RKi'+zPy,2S̊ST &k<6YTuΨ>wqDBaP/ G88Two^) ?H_^fShG Y8%)V/.x+9wFXԐ\@'_ :݁pE^%o;OϱsJ6CQ/l[gCBC7{f*Icx_lwC9$鎻c'N Hݦ&͊ ^~8|uQ)F+X+mѮ[Qs'0p(0hAGph CbXv[1 \ǒh>̅>-ss3tˆeY2h >-mAVcnd@-Q H{v&d2'NmƵ)~qBYv.t!>0vg1cMO~r:oQrIp1sPz3_Qac_ &r<āy9Po-/0+ը +X08> 񤞬԰/R@.iiy" deH"|xS5+^ r2^Ҝ'~Tǡ꣊a˗_҆<7`.1WP~,ky-?Z:/|_3!>rn/CwDz |n2O0! M.:HeT{4q8&EHT@4Ȇ~7dἽ0[ĢNsiX0 4x %?fhN0w^;WnɢyvZ*:ie'^PvmJ Xi!Uj:KϯnXϞ^8ze5- Ā"W,ާe0C,ºgpWS(6D>1^tRBa?RhT6II'paᷪ$A?cohGdvqJ^s`EXU9_3CB`~hzP-6<%8J݋-Vn1"4f5yP{ iM^s C6̜<.8_wYf^d0۲%^2HO홊yeycˬRxʐAnsA8ұFAɾ5f9#ʈ.H|/!Ø+bɨߤwZ 2ԭ޼/%C19<Ն2mhӱUb'~*p?ЎzGq ;,K<i݊NKA%"), g173 !;]7PոU6פF#SVr4WY؀jXKb,j%)J|E7*Z;gl.EeL b9=YLN+|T:?7Fc@Pbh yuK7!#QA۪J}:oglЯe]d}#&ʱLJ?ĊSO =PVMl!w_C08=EoŎ0`IEXN<ҤƥɹD',CJL֗9Z|o % 1 ӝ?w+gȧNч^EL1HGw~m|`^f 73͛^!;s؛uÂf4G0HjddHX%985Ib/Ty 4JZ;seZbț~FGP]z\,%՚6 Ē]~qTtP1LANsxƽ骸ViI {99[Js:mLؒg:텋nH20p08gyP'vVѳ d܎(HI/LDI<~,<؇ Y 89)2tqAAe}%`|fcH1pM51-`bT 8 ` >*03ӳȅ[Voؠd1~/x(4`ۉG%9~h--!쩍/*'2hFi"Ћ Eͻc( u j&(;uUmз`b7,<*!6x-.@J$"VeND#Q`(EvVzx4#z~i9y,VJ1i fIpv ⫶]ϭxAT3Ŗ>tT^gKc|F^}z R{ZxݗJqݎ$[YqN`-*!bk:y6$SZ Q;mhAMPZ [V⏐EÄkX^M+O؎MQзlZHm;M˖JJW=gLSpꈏC,sHv+UX }v,D(t:?Hj[7 t*;P )?HEK&z PbNjMsw Y91SQwAJ n?X\9`#NgFX /vCҙgdO1 ^JtM _4PDqѠu{̵ႊZTJ;޼\.44W.)mTjV@Vi \:-!9OdDb7ʛ,2]yϑlמM҈FN'98i(@ $u1jf5]_[._zk(φKri]a %6q&"ܵ3?5.ɡ=6E\_Zr),<]e'p*ء~C*}7q y9JmWAfSxJ9X9@/[}JSdk'[ U">.g|=JH˚a}{Q'ɿQ*Agѹ\":nU`DQT%dLdO%h^;W(gR]4{FT2"z57invbhgR,Bu)@얥MN>Pk*DA  Pj)prٚ$ea~tm쿙\7W<Ԛ5Ky s$Gs;B#v8(?&7F9,͕~ &e{\:"Gz.W-dS3Z;4LCQ[tBg3 (,g zfjC6,,iRlX/1 E.4-/c_CCa@w3*.hXM,25<'y?V)T7 >cT6%x3,Y 5"|E ֡-nA{2 ]G(x" D#tWoB:#0 ^mM?zzq%,ErѫB@Xջ<5߻ (D}MpcD*笶"k\/7kKe+v 붉f'A8 wTmfVndñ6Ad„ߦk%} AyQ84NmϳH1 ؍ma@[ |Mc {BhZwnQP/s\ WJ5N.ѩ،;uWb颞reLoΜd].{,l.ׄt+Y~\'#*v{?nwqƲJla9CM P,,RrG;rUvp,R#dzbBw ik.yO2u.YMjWyd5v !/*UsTԁZ."c6Ӧ)1S=Zy} aթv=hǦn qd7, &^֫79X\L`"QoKD,k(J!!%bX_LI(~ل^tba.v;j/6& kG3V- # *E N:#cyF{ܱ[+n})7DU~`gƨ|(#DE-1K~-OۦO8U˂E :BzC?.h"R.QW5})UU ezV״za>wn ^Ӓ;2 t# \jDY*Qۉ_9_F&x7LgM5JC1BAHof8mY{~e켑A_5!'3C ؿ/;ϴ%R'I7ܾu/bzgP5!|5;oNA.vhj2sPh@7s i}/uGJk= ݩ} # ^>G>L ;i֊'B7IG7ԁu V#N 0k0fNe۔ou!cKI,N_*k4姁a9 Q2L+2GGOD҄3Đy/{M"KmSE'Z m<Ё! Lٓ$ӆ6L5,[MNFP, -.3~/Q֚5H2Kx†$Z`OUs!ч-_*U$TJNuw}=s{Y錰bJ!_!!50^n0M꘩>_ZAs]Y߃(o*e"sOIݝĝChHRAp.<h;"NücL;h#8Y&x<lX߭v G@1[J"q*kqn^?;O$a5>WP2ɰ .ݟ5sH{-1;̜gO:H8v ljsjɥި81,^BX|dwsaB['G;vn@WI_CSXY)2#;񄭃(c2ӍKۭ5Fn&@d|R9 Y+V^A9Tӓ):[*Lrb}u`opyӋ,F #۟0&.,Uve؟"J2]NZџ!`s͇&[~񓸿qtk,>nT \:&<˳LROaQ(sM, RKi yK](1cH\j(pI[%t8!AXCp, e(BzM` 6Ɨerr9ZU#3%g) C^9?=ԽhG@~ti'l\:f|.;̿Tm06^Px"O]Yma7O65>]/}ZI<هML\ޣ_My"Yymrp7Ԣ>to`U~Mqat×BH&N*\E ۔ yb/4!acG "4@j-Y(B{V+- f*SncVZ@*seu| d!BY<1A:n!M(+L փ.e@a3cktG8QNlu{/xpSUU@1D6[fiu @=9qbK: (VI Hsn0ѐf偪)-җb@w8LN R@ñmlCi @pkmmkC\ۂu]ga>y6Z K %?^횹w綟զ.&'TYTh*7U܅I"Mk  LX'Zg-[eTY & m~ ߍbS IWu2_0mDzpL9HAZs2>UOS@}^Q ^t1C 7ȕUCĠ(1Q2e35ag2m+n=Z|ړR7L+ axlHS2y$xtf<^@IBa|N@tBvKŤW nb}%aT їL5"%h\Q-p3 ); bVTR8+Ч(Mq)Yi)(.30E7A>݄M[0rQ}bfv"'(-qPh"cFck OQ12དྷH>@D+һ8`_O'EEEQ/"GJK뾥ؾC \ɗ@iք+gDR:j 9m: -6rUL i˯7>1x]bd\A}%52Gm0]!јo.N3H-3'^N2Ǜ-9YwQ/_qR#G?x  Nr1/kSm{i5ޑT UW]3ѭ{T,k } a@&O~DD\Ռ~9F*. ɭ* .FU-6wk[L?lrUgt"$UP+iBLD#R?BSZVe V̷ b'bٛؕU7cQ⿫ОD4fyߝr0 JA7vao[`Ƕu|rg`UԪLW\qP.  GrkZmj4BЁ~SM'RE7&EU ]4HBQbЋp;|Z(6cU<X(lJ_ /6KK}eH#s(L〃iDt[kJԁMx{b9^C- :  3STKrp"-6#yN!K}s-Hgɚ8ߌ-f򸽵e:W X*LԌ;ē#i%cO4VPZ*\ɛJMi$IfCk@ K:Wyku(D}_ݠ}7QeUߣVQl g|E|I[Da+T5ښOJ}}UR֠5h}L@Q\JcE`)Z#ueS\-.z^{f?<zg2(~(}mf}K>nϾ=do.4YN vQ-?ψ)&ro",Ywv\ǖ{1UR̢nΒ0TEY2|tڥc7Z03hî.>O'o?N|l/)]@KƪL?7fӧȵ`A]ppmh(IRZ"7-EO*A4e({;o/ 6k>\KG X,*?}UQaEhs%r%5='B'$BI]=Û"C\R Br'XᮃX?h\.[o_\,1Ta/1t P0*勴m~SU ^jtS )Ž?'4Kي89ce20(2Y%Dډٖ*=GmP~Pa_}!2)!vS0|oli朵 ˣPEz ٺ" mc}Nh9RԣѴuԷV5;3{;u9eid)ue'v5(Z .^ODrG7%ؾR0z#\lN+ T^0[ÝS`H0pYԐKQ%1a4KUg nV(P \Ɛp-RiWQȋ2/*w׀vp'VynxcYҿS5 tjׂDO pKcWKa"cJ¤9k~S!Fpijf&s"һy.yW]V̺-+J27} {ҫx1"M5 i2}TcX@?QI޸{.b }o"kٽcShKf@Pc,xˋ0F.w(;[tk%YZL6%nIADxwkx[\Q&pe$1m uX*3'-ϛ}>B[t6nLfQ8MPNW$V Py~ԞpgCWBP3Xl1`׋˾+UKbWcBo`S!0J7(Sjж;cW< cX/RɴԖ\AaOy6:[7jwpMdZ?VqDK|8(64,dQemfھL솖gE}X":]~Q<({eoÖ́d݁~1Hu͠<|C|[8 :nLjp!)DuJ!_Ӱ8SN͛gD́.kK*K6뵪9NZwP{h-@NW-ML)>۵$I#\p va$"(LeT .y@i3r#<}$SNc|ʬq;إ9EE00fg)|&+  [{, znIRw4f)wrϳ"vf-Yܕr׿DJhYsn{d{1qaHNKe_$hV|*rWdͼK=1=E"{^X˘ВϨR+ S_KPCiL5g,4+ ւ̘SaD&yɕ'LSb sb~ș|>l k5=UOî^<ތe:@Ԁ|㬰B6I\alˉ^QCTɔDl@5a2#ɞa&"I$&c!RHQmU,w7Fc E#;N*IVYib+8>^YB 2}9 H,SUTiW9ʻFQƨh /rM]kKWW3NE5ܑP@U?K2Ȳ%pU"[ Z?nDrdBcY#Z.uOAW{= 5 3eY 0F.̈́uU+N/5;_mXsF[S B_ŠB)C@& )C)_5?kK# "tTant@FlɬuIlK|w1-J %aUXF  "QԮWѐsvڕa}Njsw፴tq4nB,%zv `)1t>2fvJ#cx[\$IU:%Rr Oxv-kx L\d&#\:yp @*,SB U$p5^ҹV"I]>c76s4F+K`[/!wB:%_H[iu.]/_K'qI=H"Ը1ɳSM`㙝WkTF$TY]]-WE&OŒiN_T 4: |mΰ7#L,+1&A"n</2W3>m{3.Dsog8RF~Ck0V.=䫋 k(w{ݺ092$,i<&U3.t@4pOJ<;|=a\v!JdRe<"ő5±g2z퀈/ ֡ 픜YpS'l'2B tɒ*[ב@PL \CBHh4t{f5ppz8zcR׀՘N!ٺԇtH4[PU/+Amⶃw<8xfpy!ܙMj8Q0^;]uebݳj7KѦqI?|tGBo/r{3㦈_FwU3@s[ xh^=UH4y&\QOn!Xs୩E 90A1+>mA#bΏvfKXג?Ԝ,X7zlUy^x?Z]_#Ze*`ą##ZL𐯲_?2 +{WLtŅڥ*c]#yXYVe ='I1f6W"&_ (S.! X*A:H_ WIS`Qz*ZK%8Q`_պ,QU}f k3vz&ůD 煻M2w^NǗ'L1,y1ZFaGG.ev4Biٟ0)Ԇ ; x mLN4w6>ek{&˜Aan;?Tw7T;WY|ߠYǸBM >PW2믵9|fAlvѿjd'AF {ǀ0]A0]qA2}i'h.[4t*EF]ӕ  Nt҂2B{{dc-LȇJT ԺXQh*6 V%9KHeXq:cY蕯?Va4g-tBިn˛BV;VMnŁ6׷7c_-2vpP:L R@ ={ b{PDo>1ՎIefγzb[IF ZafaYp$Lu s\ jI%_~rx&y5,=@Cu'f& rj{,ԗQړO_KZfṇ]uǡglD`P XvFC*J 8/ -R"%1o=@CbXmcD*o8v(;{/2>,{ikʡv/쯽puK^vXT!}fnϖMXҞMq v2 /9~X>V?i/&3\B~s3C:{9}KUmJ%V _#HKnC\nUEsZޘ-B-u&SCێ$1ѫn&$~䔴e6wgoFow"DvV43N`3PǎT6f ԟ$.ߊ#τ0`l9Vz.#N\-H% cir (kW5l^};>]@c Β0hq;w[\P"^1K 0}w;ʖ_IyX-0j-;.DoN|%B y}ٙ#4]}G^vf?(tVyrYn+^z]q6FώY RɦЭjY 4]4)S1D0%VkK3H<+8nl cֺ+: *:ہ^ϋ)ƆCڮq毦E4kx|ML0+T +֎[Y⥗½2aLy\kH}_ڕh&딳Um~;>Kj.lyKي)o0mQv oljzU 3j1ݪk*PJJ.BΦ҈fY -v^+i$KVSKc*%MuQj)(}&Yb<4U^`y~Ί^+UԹ (k>]O@)-[kg<\.[r,HiDW"6hjo||tz(QQg|PetG y5Ux{;>{%mWґӺ3v)j`=HL:; 22>9jh y6 3ᶊCj߶]yK=F"nٸX_\bO9b|"f{;ڏ)VWm'ռ 4AbCK/&y@ml8c`\G9!˚ I`6R?g4/$\Hkǫ%{KUYb1!G@HA&ow$|%ڙQ != ދ5~7.o}2=A5c&JoөE#WɉP{"Rk"+H{dAM#4>^hT:6oLȨ'\Nᐵ뾝Q`ݑoJfpn (jEr$ݳ[khL#Ē/{rHsI^<߲qU"~;kԟC-yFb TgeYqtv-cȾd({{G>PU (U>~^;|UXHS FAۖڐD !I2-!& 3ت -m&Uas}[5ӐU1>,mԾۗ_ANslyaڎ/r +Pq)bnm駥ZvBptv#fFHp6?T눑D%m4b P(h<)cMF;=.ePm !ҡ0PH];q"M<YeȀ*OåIؾT]VrxkԲzg%; eyW/--!?kg}+tPVbfSx0IY`u[ ~UubuG6`6]aB"x-z;TI1Xeœ_jzm8/Ysav_yRtۙ(>/oIs#F },@߮a^ b^KB~q(ѥ֕kMڄīXEJ7RO q$RN:SF؅6J6R[ڽ;wj K{0gTₔ?Cgo%AJQ #+EU6Ǚ Hm ;!EF9̧Q]oB;um un ҽ3IW y7PS4) {<;N27D@MI&NqCOyϲ5(ݼxdX1Y[ÚtºHnœ jv>(z|Y]cE$J\]i9=ʒ:kp{n1EzәKAdD"NT2j8HrQҳ =UgSO+IC}]PUYh]+* ά<AXh@o-T~O].*K!Vab!h~(Yd+afDq`Q%dmp_0e[=⟏^sTٖ(K,9MmEN%˥S-ub%&e1.*Qd`EGnYF)RiH \e2q,L}o(Ai~At7IUwg,w+Dyo]}0nɘ3 B?P>iHExoUuUu-ަjZd=ݣ%B-ωL OަȻh۳Ҩd\*X[ޏcܭjrYrXUH/ZiP` sSbQݨ*łrVG6,#7Y6 t$ NeW4\EO dQazlK~D6T&&haz*) pjkE((BiS>\(l=4eQ),Ƃs*aRy޲ ~n[#T9VuceBHY{G8_Ìʥia6wӑ[ysYѪǭP_Eg0pe H8ԉI(@(.Z|sZfV#V2Ї̱G$I ~zU{V?cQQr(m"p+y U_a 3<~aɸdgLzf OGL>?f_^YGmw+}(v,QmSa+(d z[O$r75ơp%]}xI{޵&$8Ipbb:61D1{2?( ùCcf=(mrfdoD^TkH=EX}ܼJNk'iP&!wā N V?O*ch\%w֓&GK~'KJSD݊yaTS/Iփ7 n.|FfJijaG[i2٫h.9IU= LXŒz눋tbxc߷:ͪ4\1306) "^PuXɳ|%ݧ}=khwd$IYQG)җVJ5?qYg4,HpJ)̌wX+F N|Y_-2m+qj\A *s> Rv630  (OJNAM71fԤf WPk*.!VRFp"DTi>>ۅU#5 ͵A x*t%[]xX ;!Gy3\z+gmf=(ih36)JmW;_'@KasG{ٟ[dVB81q2N.6\ ##;9;qca`7BՖq#?[J3~O#WgdF|&jxk|0*y21p O5Ge)D0:f} ;=Wh'T<:87QwK+ v5E; )IɂUj3mo8.uC%ʭh8ԡP>hI8P1EUW|(Td5U?Ho8NŠ O%K=x'6wa6Vb A['KuIۻMLX5Rf3fq(+ sWR2DWgUA{am|+ bl~]юET)X&\ {=ڨ?20 qBpz᡽?7j/S߃g w f9liL6;Yɪ&;iP$髏\ A=UTEAN9bv:h> wAH3h%;A;f,ۿ^iZ{fN5uqd{@6x=ڡbc(@NflBm=ZBh4%0V OFU>SewEܔHysRڔ?7Sش}|b:شuկ2TJ^/'{ ۦ}s3)ay1GMV!VYG+70@fb5ig ͣ Y11]$ HӐQg ZG$o =#RpK<6~`C @W-3-k?֊:8lߣlYO+aiztq[С)\;uɼ9H[% NJ߳kw1 Yɋ Ͻ3 D}dw$t=ۦX~pڋJ^Qes3P{\nF$tӐH۶TtC}y91+'3$D mn,WN3XhOiXnv+-@+0P q6vi.t;涒u{lU=[sرM}/*WlBOTM~Bɜ8/w% +ͬ~3;yO8W N bFND-/ zcg{ܷͽv,gc3=%tl 659DXȗ%q]sCٰ p /|EM۟!h'4oEEu‚x!әElD 628x]ZpPM!WO[4yY16oAN|䀌cDRb %ȫQۇyc!s Qi߄ HΖsmJ{{Ncq#<Ϙp >l.ھ >Ψ)UOg8 a|s]= C@I >0mҺәve+ǀ Faص'%m&"qnQxoC!8TC2MUs{Ƥs46ц{b!|%͓8^`(rtgI޺KHIJ֜֌#̯qp\RC201W.FOkΝ:gHޱdEzwdKI۩ 57<\='{:edN/7Bkrn_1t +Z\HÍiS'J :PT E+Q)F*7:.^| H,6׎67N|2gľ;at \6 jyFM3{3/ żf0)8E[#[bg?nS';0ljo0 hGxU㎜@CA!Dd@h!e $p[ Ȉ^Ed_*N ! IT*DA8f<Ϡ:{@ҸE[RY}|.K}C3~8q"44t-7~r5W;g_ۮqg1}RH9Lc ֩>썍WLX~;m[_~=Yf5 'Z.bܦ$e֒eKAR7iF;e&H 2ξZ02"&_y(_ cy!k_gcE+/1Z{hx |";WhhmCڝ4mdUyTfD*u-&dǵS1,l=bF\Kve3ֿp eyu{Qv}):"OVr 6N.7aMz<\F֣IاsqgK 9<=mX3j/ey=@>t~,?J4k.ePiϓ*g(̌e2FKXd&@eG\{*oK7͒MR ԩTb?$t =WS\CZa,[dF>$,ܽwi`TV\97VU&{%LB$*%߃#v>j6= 9r (pLAbA9 :Yt=)o]ۋ7P:>:óLt(mIS`DE{ -_maӒ+:9u2q%ZÈ4xܕ0svЮ!oZUb}@g󜨪*]$VVWbfī `%TT^?I5?5+ ii`@< ^ȷf=&a_Tٺ%_mXVzO%4MF{ !Cz8b BNHo<0^8Yj)bh=qQjYM?I(>-sJ3UM[&݆{e3S5`G8~ Ofn~բGnK7B03E܃{k1JFL6S-ڃ鿹8 wm/};S~6ȴ Fh ?shax\EsL$wa$y3ñ 8݆M%cywoM>_f$UX4V0Cpo 54/kkOIKC:"}S9oO`t|zv`yX9ԣY jW>+ m{Z;7&oקwt`Th:ѝAv@^(.>h;{{۹D*`3; 6xea `۫B=^|CrAf;l:6(Ms82 SzUYZBL)ꁔi,ZĶ q_ְ0!Uk>a6L!Ս?~߬B^yHfGStBt6>$+"}dgrVQaW晆2!]Fj{jB(53b⬖B̜Ge`B$3t9 & ṚsT_̱hb ozTZ<;!~~z]͕%eHC\M {PM3b'\ZXrD%le~߫kO)˟Fx܆/l• ~)A FnͅFˉ',ZnqIu R*)ijpOx fM.֥3/Oktż/w lO _3Kbۂ;4:X^mrWS z x0r,zVlXL 6{&k ~Nuֆ ''|]BTqE|{i?lz l&}G򋮚^D o"9ڥt\;Ut5΀S5]V顇B( lgf7 AUilI\93YNrA%CVJ5rF,;zx3]8sXt繫YIe 74I"SoBw;&Z=^1]D ] >| A:j69B0P7,iF +s?f LanB Rtj-@w4^bdso1!~%al x Foڎ*;FPIP5RG 81VqV)UQ/Xu6e|h'5(]W1xE*?rm<e>~/*Ss"ڸ U9#N=@rIRun]Q>wxh.Ǯ+v/x:1Q14}Dt<Jҷ>^d{#5T[[{z! -Aӑ'ןX>M}ICM"AGD4^yC$io LPgcaA[+N2S4a#* 7c{v}'Gaȃ~idiqy^!T"ߕj6}TA:A־,V&7ZjGJ&UlU7F-2'X@Xұp 8bTܢ5i!wZmVM<ɸf,daiJ*7k*d*x&$Ta3u=|d5q*Mtn:OSwO(je rMUdt=10Et%8$_T( ˉߺDž}xn5TZB1PeKi^rwզb]B*H-|:S 8~W Xqߐ5#x-  JZIÊQ8A YsYI < [a{(:Sr ȼ) @5WO>nU4 4']zNݤ^veK}"",f&4. ݡ\gXԓ=Q븊\䬴9U o]:: LT'L/n8;~je t`]0vP,>t'I@ ?Mei6؎,D-8JAbl$pm_䲡GWƑ2XG=g,( ~_*].X4K!r?3ƲJE蕈i%vƃoA k2t}_'!\ɟM|_UٺQ![o < Ȉ] pM̲쵌^gۮ~殏IsL%߻![`;vaA>\zJ"-UO`7 #1x dw= 5@%CEyx7傦\i@&p#VR X6I4_f?&8)AO[1S z=9 2B\ݻ}^rܳC)!(yw/]NVæ sF'~fc׮ ߏ9Q[ '66Runc>eoxyI|oCXZeCwThܐ0("@+1讐bcV;{@ҬnO.q3qi'Lg=a ̐hUOߢɠXhd`80ĝą0F]eT[$ qOúUհIګx~xN{+k!@cDcIݭW@e%(Xd,^^ %zmFnRrLp+I;ޔKɿGcy Q;ڧ`P|ToBfYVXج%_x,QXK#Q}oƯG12 fTAHHUu3~E>>P-tXzpQ:a| 6Ԅ t 8Fד`2cÉS\#zI1@bAaې.+gV nARXX)ͨ?ZX}|Ce:OL_0f&\f 7ߠJ5q{Y:&XP>ee #R Ip܎x{  " vLaHQwrO&8}b*f )"ȱҫQƂ7#Lr' w.WV(R8%BǢD+٬ Bge"maf  Ͳ@'5)v/>m"oiޞWg*5ǼvJ4l[/Rܚ=:JQ| jIK:c(QU(L\Ukrs<-'8 }oOi2?1N8|| NaūD#R 4{_ #k6x ! I:FF>:NA)X X20z'6*rPM kJ/ư}=g05+ys tHhbHDIFŒ꘩l`b|=Y6ƛ2ŤQgO׼">?lgO9PV~V\j[u^d;+:K6*\og ͦY8SUŪb!(o@|K{:sk~\vH2dȉI’- RORTzVXL5tmWMu&=!ct9aTxr9uܻml} }A>"bK ;?=3w8'xGH;99Vn N@ߤLnpћ{2s̞k*7>5Q=jTZӛ8LJJI+TDžꚧ3KHJFP{X6nЎB{z&Tʒ%YLƛMT2N𛰞k ?>{ֿƓP 6#lRQOhJXkp4`}K~S] ]CҫW,=kTpD:Xzn1#R{X)jQbgP> grFD 㕷aiz("jKY7F.˒ 3V/wܧ4&t)YջE^dk=?w? -Hukٯn u<2'j1[S0(/Qγ R*t) m |VW (U0b̡Ŋw9cb355w̷}nftF>op.ɰ2\ZzZ|DPq:#08/2䱸L/ ۋwXo*jZPU㠘h!FdCx3䙂ge+$SSf+݅?"W[1YKu esLwUc B֡P2zIm@sμX^{13q k9-!q4{QUN+(7gg%%'5F:*@8V|42]X` ;btS 6񵀎׈ @8Ix?{"@x e!!׽ ,sts>k5LQi; cэP,=^ G>Ԭa֎zj2W stsnP@J__-,`[>QHvW ,9rGv\3՗*&зJwD nZl ~L e{`0K}Q R/5|ݮ?T; !+!dɳ<98v"H^U5mhEQțGS.cKmƕFSG&cJ_!IFE{DR΍r&~ !2jYS%-vEil{gDwsĀ6Su(ue_Qk"0 l>U'&p - $m |%*2t*HRK<0H>#Dʤ-xr\ʆB6':mkM1k.~x޶C^ԼP _7I,}P 끾Ԧ P!0]yNV`H [ ݯV >">ڎqIY{L9.(zLgJFG{j:KMXS=m ÃJWc%oO7B'}Zf:)":_hK{ɞVu~/+: ]CvuWt ڰ?eH*D8$ XܾfYGNqWN6p2 LO8|HM l{TL |mb+\Rč)E_JGn(wm؍A@G@Hb[1N "ld} B"`wk4.ںT]C눓 u%$'@®l$=q t\ƪ#hbB3jZ_EOo,-Fy쨽]][dCCm ߠnƿv!dJ2NH&ޡ[j8HA!aacKS K*=tp!r'ˍ3nv ،% lqng3 <mIp$ ~~/h.q6 ștV g}%TGA/Dni[CBx_UL56EQ6`Ze/IJ qy?=p- yx1eθ:;)iYu[e1@a7:y^\篊ՁKl.-Q鎩-bl PP/JZCwQ.,K:F8('=P])̢}H?ZrH|$v ?ь$p Q8+Ef|̤wӦHE[w{A9|bGhꃻ;JW\/EL#1j{F*>0SPr^laq9\3ˊ-&Jr䵵,Q\._A^wd%uE!nH/BX0PYshk[Ż-a1lAr.)2]njj-{k9j'gug;8UvIǐ(I%'gݾZQk1-Rv=G%8z=rr ".[}vW FS4Qv;7}2ܝR%}'%ݷ?0<*I:o}PnAS~+T?C̟1O̠r3FOA4w9vb,'LҰEXa`-?,Go5--]th  Z;xkA5G\>?8f`קxkڭTM&D)2* ~W*5R謌WkA,*3,?P-;IʓЦI-Z_uܖ dGwHgБ1Vufh۽@z {{cGU[9Vjj8"sԁ5(qSR&,S)f cmY ʔdh.:&PKCé!ЭJ) yNQTWy )1'Jǧ*P4xd%kڿiYW0ȁ{΂$FJ(Jx@ǦuVϬmKвkH~sT{=e>f$ٜ? T~ }np٬hexiT\Oګ'7W]_4/ (wU|Ari@nZU wBnnK\h2&c#=v_w_G=P}Fђz~|ȳw${FE\:r K/+{YnAD9&0P 4tՀV:O++Aߌ2 BAzAQ0wn妤ʓ8? {i>38%8o5>MxLf0xҒJci`Gha->,WM(Z|ֶ R/cu@Lx7Qɫ8].'TL]DnXdwD%m>.<$v!/7"_ 0fR)Xp8E]X]vrT{8sz܌)KԻ/8c$NQ^:!- WMpELo.8:TYGLf#4_x|+]:m{]AN('d>dZV3>_oث @:ջ%RF㰃p mO06H1Cv u<͛)&U<|O@/YGg12 pGݫ@JaqKY6*&f/TӾ/tCjnG54 g#)MLi**SӪ_n'n/!Cp1o)xG0dJ} 1MgK=b%Q&a8rV}v6<$~)T3+C#k ?-Dg% rp\KaHss׆+a_QW*<27+x#i ͧvZզm8g2@ c1_0@ ȻRHi~qMpY,T~;jF 3eky (2[>ּ†[dk6~Q"v^K|ACM~ k"TGR .R3eXF6kʖF6&Y=%ݵkxscB^;pq?ǻbc=Zc1^SB?Q+JqtXR(itu|” 0}38K~燮?hckasp |ӣ،v49a;oVRvC^E.ojəQ 0 eJ 6ʦ|DQ2^ai>:?s. So^Q,uu#d?[g`K$E9.{ѦIƑ J7+6poQIOcU.b1˃p.Or5ODEXdfERR,[8,.Cd묅IB.ٔ\+xt}7)}Ax{s*>QI"~}g6kcGM٪ߥ AM[CK'*q* f7mH%0)+i˔f.3`6֍b Uĥ꜄"])z+uf%z S^&[%f. D&l(p_OkE.i;~?eonk/_]W>jN}7gUQ+xb\we="R/ kWOКIREadYkoeu& g4/qt|]s0p[##~^cD;1}6ɂ(݁/VRJK˯p~s6"3FVOcUs0+Kfp< ѧ8J6 wLք5FfOZڎû]#1{hoLm_7Fr}U XkhNC2;yFzMθj+~n jb꫏4)E>CkC%Pko;t$4C1?&e-p1G V#6jrO#^;`6oK8GV,RnrApo8,@*s WM֣ l#a9>]Kdѯ)1axƄӖG%'B\b9Xԟ* -.*{(S˱+\vSHG| p&u-&+a$q\l|;/Գ 6~˫ɉn Z~%XC$XYWa20E֫du :K.G D+|q;й";#K3o`Dbڱ:eTA.cRM 'AGGTe`]|)惠WG*{k~'`dC(2@[MdsZXDxxs85\_;XӖ '`:\_Hl&F5pdegRQfloe/˞@.\<ɇ-|A!z&R]"j(W6PLު%;6$!'41im)ŕ Ԯ,g(Q4gx-긯?Y, {Ͷ'Dgct *q̨w,&ഋĢ+j( <䯣UsR4't毇 1)"Zimc&Pd(@VÚ?:US:nM2,|Ä 5Bj&h1tݍQT?F 9Y+(P"*ah^\va5+ D ~ʳ, l@ܩ |Cdf]+NbyuB++\:x@U?C3k82.D xuoq!L3T/ 57S?ޓxm_ac+9]ÊhV W" AA`2,es^F,q@E? ~S34ןNcJC^n$qx /6}$[g/ VvtJv:ml"djYl7-#]0ȷai-P:Q4 m"{_ٮk=1WXY@ ',R]V[0@T=t3Cy>.y<ݕ`sk+xx3c"ˎqHx碰xF4D͸9oM,[7E=&6Gb cA .Vfb"hI9p*1Ut&og,P 692s[8O&t%:xUڅ ^X"Rx4a.!;d/:&(,n?9jچ/Gtw(Cȳ;k 7;tlVY؋}3<6껁Ÿʭ#WE h!_FPka ^2хb9&j {P^čDSC.nFqa1mJgމ/53#<ޚ(<=*n!v.OJkпЈ8S㑛_3椽"֒{KDIe@}X0yXyx wɽ|`ړdc1ʎ I H(=\%oaLb`[1mO73nmqZ\x NOM+L4JW ̞BuتYXmgQV.rEn|ч *Cx}p|||RP> l)(\_bvЙ[u*;l}@SxiF%5;Ƽ.)Aﰙ\ش{|.5̀ȗ d; 83˛52\U[`~"d g1ˉ8 4$^T R]KuURe[o_r>^ !ft=ڸ{'ږsA" )tvr_sȁzFj-=j}&PaMtpL"+Td_vWq~˘ Ĉ!H4>&vp^L5mD5v';%T$Yr2"!i) Af-Bv,$ ܐNFu`C_bN74%bݺiY0jVE:+\#I8hdalq(pN)J#Yrjx)JZ 7wS^%Z]辬W: l{gh-\sVཟ|mFOaԠQ$X;6w٧ w4^ 3;ǩjhH$GАQnGJiաcąYONWǎrKl)s ނc2@Js?uqIbǕF@ Cq&YCV~WW 2nŇOX}& N侦xF U )(dqCwfO5/W/}R,:}/},QQ&O]pet"9wkJ?'43F#IR+0>Q p^4zjK ٠Z~FXYo fωFoB"1RzGrrṡϳ)߼ʇ#cp3P}S#oli>? z,'z?A8:UHB[ZMh+t]^[}hO4l C=' DrSv4ˏPGa0Đ,xȞC^L1Н%?C8͓Eb}>kS'j&.0Y1$L0Vi>#Fքu&OdvQ(G1MP_SZ/(fXH0Gnb2,#!Y4Ƹͥ&vM!}j]XRkw2.7_О&884\\jQ5f7<[ZgjM%,jHbQ("Y`N< SaTuǩբq=Kqo0\.]d3w$} 6 |Mr}oEfn䝳b(BjaX>OnLطA:'3iu?5y6?$J^f~cDM#[(өT EF^rNj ~J S\wp:)}(:9M8U5`%Dksmjۥ=5n]qD{$h_>qa μ@44ɱPkWwвf3SCO7Fu鍴r:JS{ႇ Xr> }6p aX3C (8eoxo+7߬?+ϸk N\`%+Ϥ LN^՜KjqB`~0eVbT7E=$zRҰ3~c}!^XpdxM.3xRR˸miT+.|S}%c1; H4I$B#lr@mB)qQTCd|6_*f /? .agKl Ǿ]@\-i!Z6_ՓBδ"og8I|ZLD./fOq]p4F,WG~ú\>\o]DƻtPbOK.ڊ3m#R%ዸpS Of+L.X^ɪ-ƣ;_2l 0|kTCW4ϯVEӄzϛkkgM~Ը؈ﮉyqnD!K)s-a˥qzRP 5r$U 1Nw3E 7&(a+PiBy$Jͭ~&{aS!h"֮ȀTH-.:8n堿/ەkNXΊ/wJDI)٩YhҪ pw*t9K 9](b]*=BS8{9\kĖ~]+e @UFAtd]*Xt)?>RSھ>%:Ԉ]aKb] Kmճ!@>&CX> t3DS8OPǎyN<(R&8exOBϭOpGV`cKe΃׻E G@3}!~KWbV:sʤ1P\e4%Iũ(Gn4XRgľ%<|_ɡAM1pǚcQg/WFuMB`FIwsFR߻Ii'N>jWW#QPͷlx*,j*}t6- 樝U //[J'_rdE7|qKfJ~*IAGLbh'$ױ/g"ĉk| j+4A!emAjpۛ}ʬw,E!Dq`Sפ4/OZivrHzG6~bLF,m\6|H_Zmm7 Pv;e" 򆅝A;J<飉 =G1^;3#OWܶZ Ͼ=tGZ;Z~Gt}e-*J6x耑tڀ[HLpVs=4$E 5Ze %=Go-$A/e2棸(txS@;mX#S%?TMIy6lX|p:BAƔS~zklWͥ ^*hb {Cw!\5@Wм ~ RQLϖ`e.;m}_/~;4Ir㼒F17_4ז=\MKh/LU cR7d\J;-<&3p(s:А-m8c-X[Cҁ*{Z0ֳ9DX'Nj 5զr!ٰDcYkvV4o{Ql*=)ݓ50%*-j,lEW7whNuk~3/ Kϑd45b ]:!Y:QфՏ nZLrN  ,['+BR:cf>!+e2i!<Ž*v\VvYc['Qs48=!ċa9_g VGCTieiI=)TTLJ. PuHC&wJnRmئcO {.i랹v/Å\%qsjS)YdAG}h65`%oDŽ/4cVDԝ^g<uˮh]b hGחb<2xl{PdK 4 FSm#z+5>jD$>g͑圕 ?$b4B`WКۖ(D`oˋrk4k#_A2\fLX8sTu=e4R1?Q,w+mhH];yX]l^q7 w30dHYD]?mDW1͍rYNA%R w.#Qku9]T;Yvc;dKg) iƷ ~ >W!0Y8_ߖfs\)2dH1bR!Åem5%"(? AJj>$/D G@~ij̈MpN>7+&"5e A%nc-f(wܔ031Ylz5?eP7@ˎx2="$ыڴzͳBYl#%(+( Votۀ%A{hbۈKѦkZU 5-Py۹`8Fe>aMO(+'LnSB#!GX q#C;: /Gzd &^0)mo^ ZLSW]$tE7Eᰩ(2d. d`MZ`eN&{:dA.KkUbJ_$־[k⹛Ә%Y- l|ؾGGwbSާ)jԶ9X(3 my)1y1oSKOvw!]_NxQ[.|o6wCf7&01*O"͐q`/3{|%H%hD% ^xh2B+߻TѐMlc>(QB[W DW CP*~_#,r'6ΑEӧ|P̡Ӄ|SJXl2-' LЊ2g/a"ިy7IC{6b*H"V֗5t]H,BT3dMO޲(i2m?x Q}LVֶl4Hf{p71Y) rG,t<٭E\&yB}HM:{A Usai͘>14J55$ &Vad&qbv'Zpÿy@c,#Y"{TL6on+ %K0R=p1I#6G1/sS`@w {5O;MѬj?:DDΞ#+쨽y&GRJ7YȒfU;HU 'u5)RR )[*U]-|JO$,_ip=zho*Xs/]{u!Z0^?xA??7+wx(q(jUzU>9gh>HӜ!!/O8X1K7" Tsc]=2L?BEㅩ[*fAj:5V~كo>IQ:]YC,ޠZud_ܞʚ!xGh-aA1.s5M,,=ASk gc|,9XhDK6LLguh9eT%hY*>ttCq&$ t oӶzjq֥梳(uNB@ Lr!|ê_2cAkzpXYf3|s3vCu>xY+qXi2S\-kXd0+rF75& ܈'@9l (!5R`TAyA&Q-GC{tj) ?8*_GnlG ?@ 0t``RG@S+15Q_Ub Y3m<- j[$L,:Տ𝡕\nEok&]To@1%{|i%ZdAt8Q"qY֞B?6i)J>8n&v6KZQM1REp%ejdK" LijT1ڐ[jR}\Nܯ_{&QϢ}̕@q 'b1OZY,DE"/)9L8:h cYm3a7F Hմ$SN{LqƪS-i#0ˢY8%1~3:G$4 ̸1nwFS wΖGK_nd1";w- -,TBTD*Ҫ41EH㜴z{s;&T=X+3]|MƏ1IG&o "z7X;0[!UXY5AA5-$Z9L8t!븨ix ?X~M>!8DwQnAM"X\e6Vtkm?^ ~}MLUKh}nn,bh(٥E'hd.1 ;y7UJW1( k vvTT$J=8D0d ^z[V4(9T<^ x51b$" {Q$oo{QF$Y'<\6D,tB^2W}[۰|ǼlR>[5Ԩlz~?y^wt,Ok#,N&u`X A:@M탺PV-Fly"M1ϖW[-SIʫaL/GLZ+zM"EF]ʡDPH9!كO#Ķ"_u 86|}^kaØ.#r) v[ Y[;ċZӗh..x*M0/T!8bEP H?ὤ={'u/G_q6qmEaK`Gլr/^HFkvĹ)q x6M x;)a/h!M_ -}SJG"sGS''@2'6Ƹ%x̴Цݙ&3NJ[ l14&ߦ6dM^t+"k@zC,{DN-.v_, 5Of^=.-3Xevbz"iΨҰI~h`T3̅i%zQcי0"!k/EJѼ~#L$igW]>Y:kUkmG&4 eT/'Q}9P |ɨ8%G,w {2j;ce~L! 0IU  sqk?Ga~'-I^pP\yԀ>Qi^R*wh|*)o6/%}~ Y(*C դkb/AT` |(ӪxRIk !e߈dJAD/{}~Ʈ9>]t5׺?&Zt'ivHXpYyrIaռZM05ʝXR=F. օޙJ>&%2pCoP Ɗ,rDB ` S0i ]uV%9 w/7`Si6oޣ~10r FlXU&*/B݂ bc%BRpGވd%R3 U6d,nCҚ Ҡpxy9 #˩E&|b2*uMT(J1ew"Kqf`\pvylZ`[PWVJY,=y}jZO}ɶHb۰Gb(|F21"GO c0NoQYGX{k"Tpp^j#nTSuTfC+7Nߒ: C{C v/MȈ3a^)1ݕ9"XoG`By#/NfU&}"": [NU灙,EiGyf3yaf_+@*~'@hj榭h[V2<`!Ѝ:5M KLP[F}Zp?r E|p* 03m5+ބR_tt:=Pª3X'\4 ?g^ Sט]r >|&X0: Cjٳy "xuaMRuv]:_6w3>Σ~}tWP>:_o _d Ank1A`[Z?sN-ˆj6&"m`+ŸiMA$籁>o%\0I.qkjhbl%в=HwW_Is):Ey|SiKtįl4++YzƵhl\8Lmo60-篥:pm^oLB>Q>ZRnAjTsy[&n%]c#䎄ಃa=[ǒ^;D)`0!bQyKQg?{RE.ޚbj3-s?z57fLˢWѕ p5WĀUDXpD=LpZq"OBLgȍ4] ] ˸Q -;Z>Wb#bLytzC4lf!I,PΘF~gs(? )xD/'HDBdͼ;̯+.^s 9ǿa>uU ũ R W )iIIwP&Dx󶠳NRJ@v4I5'o1YF<$0U "W[LHQ 1Hb&.yM滇kߟOlbEَy5Z;A7X$*l0QfS4 hvd| @Q.S,ں|ܕo]Q>j/٣to-n"R5tZs>~+C?Bm84 mXP_yZPN& $݇W(/w~ۉ4C$z@h , ˧d@l>%A:A\^,fm d zNWx=G}#uMV%"[^,_e`V6>^^}^$Q@C̖VYՏpۨ:Ekb^~sxXiջ=Z 隚됲/ظ704bR9* [a< <4zz]J7>͓[ފ*ƿlWb[㝫rTnȐO1W?|"pQm'\d . p֦^?\xjݘǢ< W<=pUZl2:bܲQQ'O`BGa'o@L79⇍TSZ'D 0GLPᠬ\ZϣG쌪mfVqğPG#ɠpe B}R~.[j*h| eӎs(0du =dhmy J-a#kvn8uK^d=$(2>l7L[5hlZsX; \ٜiᦅ`m%'z2Oҧ3BT q[ژKG 4¨۾_%%{&]U|)-GFYTM(uHLPQE`Iij@ʅ,{ K9* /w:= MU-rDwv˾W;F2q]El!_sevR{tePɑ݊+XhRƊ5UH+@9S`W΅s*0 V0=}:G !z3SGxrH"jYYF Z f4Nla?d767ViKID&7@oxRu\:A)ہ̀^L>/mֱWWmWAzηqx֗ePiw]ܯrOzԖtKQ96] }& TO?Ӑ#^ʶ(-6d\;fjt.祉):߸=BjYW_~+Lɔx~Ig)f 2!y^;~f̉!4$1λGSk3F0ͭ`e(5KP)B~iXPG[A.KO$'5g>ԹY{71"|0⁵hDlm<}_z9]}N,Et\({ZB6^ `cA([B$IOPpɶKk^+ḩ*.K-v2*Xnͳ5hlX{)%GG ɻ'Ȼx910mi"mS ?_QGHCO$"N6Gfݪ?H}P~tqr7eR (_Q 4xOkQ;"Uby\ХF7|#r Σ%Y;su02؁sX2Oև.wh=#S6{.O1:BImF­4f_(r uV8k\.cEbgwB%[NIy|ehA} U2WG\xTS7f{kf4JtCu(-q bVf!\}Q$mA0[6% eg,̹BkJ**󴻲q'(9fMb_eW^$Q(SחiYXohZ^gguLxRU.L\kYj{6!ʐx&Obbi͜!ޕr hrth"vUmr<g Po8ȄECq408 j'_^9p {95m%?|lZ&%x 33.l_SuX?^VwЂ[ИILa90pl(^(pKE:Q{X|A fŁ@Oc䘽\g~/{Sw4:oQdvЬo+"k]KfeEtZywNs\RVnUKBk:Wd.9~~Hw?:r-XSOMzʤgluBB!׫^O8LUD:"uٜ5*:d 2X:ve TU\+(m 6,Gq8J`A^f!gR JěW 7|O68g_!WBj8Oܐ!z0QÔX/᥀6, ; K*D˜ *-FPcs+f#{cNG9 erMXZQgi~0E^]!V"53V(h:mGA7&!(l➄ZC"XÈwEˆ(޴vD J,b.2=&rL=39y9IāoSwyX+Ze)=*&8F!Z\1č706ʊ2}½tDupU `qƹY`q`BV f>'7_lwS $T M݃-*|n#D{(_"l:]Fѩݧ1ȩ ?]qzlv 4RoB~vʥ=C{:_UB`Cp2Qnɜ'Ѐl`lM_Q$PRBWRuI1b轐9cm~ \X66ZC_( :g MDztyj_' ?=m'Ӝm$6tL ]߲.Og+A@ˑoG2Be<.?^oVP}g6̭_dmpʥk}͗o[a0D"hBhdպfyXptQ DcFGbEg9#v0YQ2I`ٕs/$ R4?]!4j^ u\J%jj>:H-:-AEg˼pe0f*"=0D߶"Jh J(d0W]#d(6{H"6q﹦ꖐ|` gE#tQxs"⸾S"~-yC'=ZIs=#ԛ=m5786~ fG!íU= GФsqe?c~ә/mV@u\reC_q趨ä ~T8FZ1s>XӾX_ 9Fp]+ij)@|8׸>T!C~>]8/Mi{ mD}.=6ѻ6^ Y6z;.FW\T웡A 1StWFa)J0 wqFವ$mǤUܭ.xJ[Y{l+ M+&2] TVl:ZNhR^LHm~wu9?zPl^c 7Zkq/.B{Za9yb!%KJEOlPe1> 4sW FVUnƬo2UY)4Q?nNrY3`~T{^TVFNAfŒ+KJ}(u>E?Jcٖ/V2F]Zj7=r' ~x2"ƉlTF݊EqHg6U B$6 ?N`BQdG_G͠,l5E%Q2AZۧhs8V?IotQ\AS7lIα oػ9|/Z|Ǚq)U[55\dQ}X$aN{LP5l=_Nna_UbJ 0ؖ _)b79lN3s|z 2 ?Z2#AG"(9m98) `b)]_ 6k34(R{n u#0iaOj,yh$C\0XQ˕kcZF4r͙tP/RiO@IkLj^^|ΜHAP$}%[W>K5^F O|U1y0&D6|++y%1971EbƓ1~K(`wiMc_=yt; AEǨ.&OT;&ؕ *I0Q=j9 1H𔓑AloВ^f<{D9ѽ0W@٘gy|D\ 5٥LL R ÷fwyC;-S%ⲃ!i|ī3qW{{.gnknoox )T b[L6 3n`$cZGa56pҮõh2r᪵_(0XKɑT2 .IʎpF*^ ޽%KnV:kFD|@f?V)b>f,3^sʞV'NΡGOU!9?_<~?=:wv/R5k[AS`b43 F7F TLGmA ZWb7 {jS`k)*K1VPi3g"E>)~J '{g=eUrǍvDxb)eʋ .%D_+zɥ?8O VNݷܫNPNFS[SF[d&+hhZ5l21ygFF%*Wϸ{(1 W|ؤe9єY,!,IծxoJ5'Ev9e/A' *G+-\1ƊbDM&Dܝ~VY3wjU+wbI>)ϻ>Tm7},}v Djj>y2|aȮ5( 3p'@QS>gaegf¦L[`jMQCP'+/ߤz4ɐ'\իV^e%lifkݩm YsFo1ӦiS`Vo7)3Q]^4s5 ؕe|J_W~X<;5%TD3%R6FTD| (B8%q5A)Ї-=QYC ߎV/S*l)Xk6rSњ.ig)p%5VY_"4mRU}\ݠ5r8I\%A2Ga? :\t 5(U5jp|MOU\|4=|[7Yi~.0X׈=*]$s,Gdy>c]5Kkޓ#V@sےB7csrqD͛vmswA_~ʹ W48&˭9bz;,<̱~২NljqT=f4|@I<.=dzۍQ˲tC(rp}M$⣉j -CJF ӱ ߶y];mӤcQP?{̉jQ|zŷAg,e;)TESC +&KmB/ iv$VۦߝPIEutS[ )=OUB*=\<6dH/h:͕|9I@Yk{dQjȟDҫT *#f8a*e(P(-UGD{H?1"MB.k׎ 7E Qc8讙Bу`\=PxI own^Dax3~pTqjJl 34?}cls{Q6 |&qCR2ZnI1B2Un՛>hp^}%''/tK( r 9Lw'*,<ߛ? `y;a!2mߎ ,_KI}%cAY+JX:f!w nv*}sQN`K~lt=b%A..WHP  Xr\TJ#n atJC֗4g02x6v@RncjO? }y.$ϥ D,r!nF,=iH(8!sO45N*<踭 CB2$ !RCvil2_Sck]tg[?`k#Rr)3Br+\;5V)\gLb#N:) m^4ǂuǩs`8".cn $ŸstsBwOmt!Cw;8BM5FHGp[/.\|>:V.,:S$%52^)|ĈEQ5u[oV[ v)c Bر;?dQE/=nf⩔!'[GZJXt_*#tXS2%dTQPPxH xj;9 e[WX.ԱnDZqoя؁{eՠUmŨph`v X|Tpz 2{>(3Az8Ɏ!9zHtLuȪ{QnO|K+z+&M̒~I/>n^[Q )4۴"l "ٚg]ഒ/9"bdZ?t/U9yQZ%Fa27k#N9" eW1[t5cd{֡5_AYV.y?D)2mZuf|ءLPo9 b"vCC9jɅ1ҹV L=Yo^\Ixq5sKUg3SmEC؅ hN(d底k)o<\HB\* $bA[Wex!>dq3U5Ըk䞧ŋ hC=&TTD0ߤcSӒY1NqCM#X$1I2M{$ 蘙oDӺW5Dph\3&ﯲ ^fC{1#mN )k}OR&;=qpi#9ʢ娏:_7󉃑.qd[TŬ},[Ok5n.3*٢*ui䗎 1CҢ%۰rȃDЫ ;pOiel9$^'!&9%.̲ xY- "/Ŵ<[D_jG+{S.~s:m.Ek#[vUƯ[5!a.O3=,B ۢgu4 +]a ffm q?ia-ף+eEBwD ` ތ{e-zSh`'g߬D=y130.D'*U*kRЩi \"] /Ӧ6WQ""\1'O?LN/r"Bh5'~:vpɳù87BXl_]$Xl`)|~'oX~^d6$MJPiq2淈oM@3] \aOt&s[3r\F(I ;eg %]-]̼YNv"ş"~˔e :ag3,^ܷ~+f)<\7[r x2H2*'vVΛ$++]WOC,QX,|;tjJnB/~)S"}ViyХF]>k$+#Uͽdկ;"?"NmHjNĵ2Y' 6]KyDc`c=K+l떠` oICi8uUH ]"\2)\ySW jHAxkgK˵DAr+ê{&v~)9"'2;mN[*؉s_BN?qP5HNJ]~Pkoȷf9`j/Ӝۆ'̶D;#8NJ}~%Khmk"?BAQs68c'&ʢJ} cU׍M+(&FAnfڹ.e Rsќ;F#0jssϼ 3i8_e$,1[<Φ'WGo/Q] JqeUpH<%e2>v՞N8iUOɐfԹ^z'`m yq /bgf+%MxS.PFm%D->l,JU|s#ROdr+/Dyw<(ޔL1T2pXmM_J<[gĊ>dI?VơEf2*.|-p,ǦY%~̭(Q+ʋ- ޷w--^0!(wM,ށܬ3~u<w3{$Oe\c1*(OWt8CRt;^󱑿K.DZ^5f'{S&=[qVl8j2wc}ߗD F0*\{ u,ȎA#|k{/c;YqSrXjsYdjdZi+A2)s 1{0XV="0ys54{Xۼn(XcՒ\~aW4B BgB 9שR|nMb?9 xwyGS_Www9&U0`Ce9LXnT~n:kڧ[%%QN^(BS蓐WxBkXJZ1++١ _i*/M?* I)%Wrq2'i$s 9Gl3\ͣ]dv,FSN8y?ƇJhIyBRC˦0w) ](w^{5S/.}1c]shו]>}lVzQh}8t)F88Df~h)emҿS*Cވ2d-M0*"E!d*z HMZg~ v|%u 0E9AEUӏc-PJ}ZYH΅Ze˵EV1p ^"7S`#]hJ ȱH:c[>df@Hs$â`__Oo4A2MyCǚªig+<>[*-^Jٝ0 >'lԦhXF,BZsWO2$۱$-_pBniyqt!Qݽ(`ϡvr|OwRbe}o tBK<43Ё&'"1v2"z>gXDΟ6vGP+]-@`7hrK/]p,.]~sȆ//"%$2 C6 aknmZ q#RoW\:,Ll0Dh=ZQJ{弳ݫ;hXJ+}K.T 0P2 6VT} \:rq%-Z~UF:c=u]qh=N| Cxa%.[tq=K0qcy4Tѳ=2 5s^ܷJ؇͛apBMm=ZB^"lVF4TP 3F6=hfP:AY]Z5fmD4y&/ upQjCZԉ3i\Ô]еZ9YgM}|wZ¿?^y挞_bL|:t0HAG0k"~>wvfh)ѓʖ-y((H:&edR+ uym˔x<JRG_{*&6Lr EIth:EhRܕ-SDa10GGR^n_'5d<٫ևH:AJZP@*e>i^oT>hRJ$L{J䇫+6q"G8ixc*N 'LM8l Dp\Wľ3e =Ư{d-=ƫW3a@9_L~!K2ۆew yr1q.}^z $$92Z1mGub+Uؓ܄B] <좊 b8v`CRE:[^3D;,e%q@2vw\^V\۬6CXiMu_|Rwj$@7OJړ|禰j$Z)1Eػx^%$;M3 #ĨB,*?<Րy]s_D$`.>23b|Ŧ(. }%nU49&5Hǘ=k8yQŗZg[$i j*58!aB+`Iu5}cE UG2cEaX;>CGOsAT6jCZ^KZzF3XP;6t8qvUf(cea6JxjHC9 dIϝ G,O*ֺW]ό-\,u!% [0E^`{ȁeZ?ǭ˟:tQ*3%"t$Nƍ4sohwY@u;z5˸n[/nUH>Ǒr3ov߇[U,\4Ċ5(j!\xڷg; ɳ7soiL(:$U #z{H]GsmhFqMsc&~n ݫiEFv0$q_f͍ U) 1F55+n;Y,9䬜^Cȶ-kJ|-pNiᠽj\)m>p ݈&[/FpWuJjR(E]8ʶTT>:URKkSȄ/XMRay _ ]}?3lnkU͋g;pc0l,buզYN.uɞI%_xpCB[ENUmaPgi+C7}qeӁZ AYOĊK[*o=`&s~%dffc)a 1~K"*,l6 "8޼]6?N Brˆư^:O`$_3/q+;rG՘_*WSBg1}Ӫ \"y,1v6+L)ޮHܱ5&)?iPa^\-=T6[Evw!Ŵ'C(naS$&]W~ m#)ܲE0ht$&q)zc= yFbVxrj/ aW"5Ŵߔ~KV Z̯hb/`QkK}<.( d`zlp>0]XAE%òH!a$'MWLT zA\qqZSR'2gSνH^w+5 B\NVyؠg}b3!ټd^C;r-Ri-C?C :-EK_ˏF 5&:gc.o"0aa$Pv/g>j3+<0̷3Mꅧ\5ZHeI</}+6/6Rbsr͕jכS¡i/avc}#s#O߶5?e_iAt!l%Uf0{۹a6K( }b R dFۨf=iä7 O{+]rv|*fCEfoË2$ԫb=_ I fG|oN'XgȎ<:9O+3S]>6(O!F^yS?80^Ɵ<3&CV? ;|M-W'˖͂J-[5|BugQYEf.&D"OhsW~KF\\EdnLXZja7zf4N!p_/\qWQbAI2'+/jI䭞O 9kܢny0:COu{Ǜ4j&1>~CZIn )^K)}c%IO%lApTђR9U0@jKDR0l"!(.~`nLQ|Y1Ra˜qyt4mú;S &+ a?{(!bmܲkG.]SOໍZ]<@[X=:h%L ]pFr$2 ҜiPF0/Jn +Ez ɏ]'Rj&c'JW^p\F\YiddtG':<^E N1tTf**@bGN)S*6R̿ Ztu-, q*r]h|5^#S#`-Z,&O[f/F1yȕ:F<Q_ӂx >qP_ |ps)GdBg#sҾ} p[ xBbJ('ioF:m{y~+Zy4'GGC ^?w3܉& "K qUY WJaR0` ^xC)tONa~<0XiMK{r,踐gTs1kSQAC!oYOȊpeXXn:~UD0]AsIP%>VOJľJNZYy}Z܈ ūa H Z+f4 Y/%<{G`MT\ꤣJ>zh EnPEy k%AqC-`b:7|€8.z}LXo%޷Ѯp 2&)Ex&.~MH>"dl_x 8B><}{)gGJ,Lބl7%!Ƥx% !dɚD9Aj*_SOX2N}H*sU\{D+%x WxbZAP',wcr\%JZ#6y?0kvYDL}^a#wp)lSqqR3W;<1}ds+B6}yP6I{Y{%CF"7YA_8jA  + ϭP31\<$I5v>2Ym'b.vz^'fjbB97h*hA`=P}[<ÜEBv6p𙞝ƍAqw{N{tDGjfT>ٓ&sε`GtVմQfarzQB h8]Id+xzf3u-<ύA&.%Smo?} 2Jf4!CDžz`E.AߚoݛgC.EʑmЍŚVQ/4~D< |hJUZ݁C2|] /y[ZJ- mʪ^m}6yQnGdƆSʘ[|F6íڏ}hз.g,FN ;kgGCCўX 2~gtIT>R0*C""D y34q,eCұ]$ʠK9?ua7/iE<#§i,9I~:^ՃFI{F܈!crWXפxahN;ju*ܷa2*cMGSggtIy{?!ⒾI2wysf?KTeL2,}8a ɀ>b ~;U}填ihD{+YPUT&D/0<@3N|To И%F$klZ׾{ogĐb,ghXMVNR[PymmW@a_D=Q` pm`+Yi죵܅K5WFoCF>-sS@EYүt/ADO V+Bx#>@LŐT6bdB&ѩ>Ltҭ%uY q- Vt[QH|-ɶkQ`GMseT5,sHĎ Om]kU-+F- 6&фN[!")F⛿r򩏦mc)euמ|*dvU(!1칒Pi3 =7a MY]R a.15MVo5ŀH$!c@@Tiy9]CµQ!H:E[bGq13Z>=pXELNL3-۹/~Y4Sb4>e~d %Y/:([F>7S/gl,Ä5ȎXB'Vf}zfZ:P٘00% L2*Fw/~ʫhYn2AE-s:V g@(*f1.O(m*+ щ1[8-יpg-|r#PLSEVa˺g~Ê&dHi׭1B|5(㚖3._ѥ.ۈF+ meb8ivgnd"i`E~S!.r aV$Bxj_dMԳ44UEoD W=7{ -Rr&`}iܙgbKsPv.բ[u-'5yw_:e$綄 ANS :}!I[b>gII=NIn2>"iU3UlH|EN?XXL+Xs9r^տ|D C71qsU7e\ P =jg۫Q{JwƏp"wl dP;kv))^j4kK@I: iwRÅWh_5Y`>t*\J&ks#wbEɄEÃ*lsىffRJ5V$ΟϠGt,nTc,>:#1P$.mdoz[>[Mlg/Hq޸Hh`.Ոjndk s褭~G~ v%E}9E,m)RּW|8sOHaTG [vrW |\s{a\vaH{E2, [?cc`KY55_x#?(ZaQ߽x/RBaŏCt3)ynȌ !&D)*9-TB@%"-nfրPŸA@d%HvƆ}+>iILlYGV2C4VëTP'dc`{\) 7S"Drglj*˗'\_a9l]wc>9Cv(7&I"0 ]io_+ AV]抜Ry o6--r :kA/^Mo'f/AkPbƄo 'Y/%0b#e+ `Bc1QgQ0\>KeŽHlaUc+M5}͐si) P4 't7ţQ N੠ 0\\+^[7#Wh y9ℚΈ×N8Lmh+a\5 9IC+J[䜮@.*p<£F1nG&EuE8lH+=<ܲAlR",]~+VD8d5Ar>5Wl(U|0@1W&qX>Y)b9HȍʜrI=h̎J.E2xxl"*<:_6)8W-)rEX--C$ o 3.|pP^j89ywSDULn'M$za:y ڤf0^#5&t]?=Hjl]2ûJZf}h:_sGp5[J&wJU7p-PjR'aZvn-^` HW|:a DCx㨗[YHlFO(+6[ےU2{,iLU={̍2ZPæ"EHD;I|sKZY9^W` N-.* \)w’^V~0C}0Sb^{).僣cB|~Gz;"*|)sV:*}r1zr[lz.4v)u㟐NE=A w#`s.lw]q*}VLnu3EC=5]|?YjOf\ϗ~ߓ-Sh\`U:j`K%1?C3z6Yr lHaTw;5iu"]ZO_zM*'D%q-l,eCB\5+4DffC1rstŀ\R KI !D,YIB8PD(#t 4դ*۸2O9}+Hb #'ŭDZNKm}5ڭveRyKW|ۃ>AF259ESjhe1Ҽ[-jYm}Cem!1GmRTR:u!8:߂oUؗv=>m̀q*/ZMӶW%epRUvW>@ $i&e\ 5W6., D o?Q-Q5$w"s;.Nȃ"It=љ@y$hB/ǢOl1р<=1);4*bB@V5ŷ)̆&q^ҹk7;_)GS2]=\2H#86DN 2r8⁾RKKkB4~A@07whWa.>@D* xfbn;~,O,m(A.;#{ ]KCf7*> nߴ1hY]4BɴAT=E>wف\M^'WX1k5*:;CKH}:8$@ \Q\nCRtޤU|!Nѡ8i: Ri|XƱ7 ?X1 5l fի oI3BJ@Z9i+ )*jӶ6IDɉ"3֖{Iռr7=me|i[|:\ sfDM&e)P|Jp4sfzgI 䶍B2STnT&.bhrV}W2M 1`+ND!`F.8TW;YLPk^+'"Y > !-|Yfg+Ѹ@s5/4`_zOdr*uꑈ3c27n9-U\savdϏ7vIVx~dWiqp{˴6P[rDŢ`˜q( Xbˤnls Nj"ȇuT/蘡v)Z7YP4 ک×m>EL#hݟjŐ!u4bGaPG cs!'rߒ @a(JB("B"|qnF>py 1Ёq;H&슫JEbfQwrÌԁBÝ_vraÁYT%~MMN/8j5͠x\k?>&:"ڊդ-H۫ ZOG/(-6`v ? [׆ce{spHjV|l"BȜ+'l .RRZoT(rLqZ!L4iX A=\bllsq,ru('~&ND|wVtW{451Ew7m$ש1HZw79no.zK gm4ӂxΏ VkT*7 Vey\7`+u!x!Ba!3||z N,_Z^BRV|*Q1TS3kM3[Y[4(!tdVdBwf$\G)cKI r/Lg>!~M_4SU'7hb!Ą ՗.5_ ;[b%.gHWsńe} @?cPz@ u_SDAb!2szDA#/\=9NJp 6zG䆁CO%P"onO4j\oI[B$63`RZb}l.{s~(^I[!h{G2:_)۬wǿ1qQ_|Jnp+877)>R,]q6M|wڗB}R>ٝlU AD,qNo2kpfKo,y9n|xcdAa?wn{7#`)a798#ʀ%⧫KP?$WSNa 5J9|C7QRl-%1-R^6M+ˢ|վ\:*o)y^1B0ͧъ!wʺbLyUw86l}j"8nὔk 5[wd>2R)9 O?Mڀ ;LbpWaS>+2mzL2iX/m1΃g)[~z$h̉I. 镘w%ޔR!.v!6:G~]kJUa>.j*Uekf<}y*zoƨ]SuZ^ ef t<pl.bE A$x ~m{11L8~!g.|_M]w-B8_`'Y >&oV/KK** ,trk/!rVM/\l3_@) mbw%v =ql#H? .\mC ;wJrH9j\2j^ŧX4YkJ6^\c_6y{)f3Gs" SN'm4Qk`'䊍- jzRNY}ȢcO(kKiwH8 {4pa R-Vz5iL" Lw`&%zKr`T9s{f;9t$B;|LG%r<&Ys1~I}%~v71wAs˄3a@p8F&_VRь)/yY\}t4tlO8oyxɑqER[ 5rGU+\R!1o7J6gѧOi]?j $'nŊD v(mM;iA+Cv %;EvmC"VD~ }/-:j #~ȺaHLj ؁ۻG慌'5:YRAꟋҶ'5 G6E_o(#~ZOˇXѕ`+>-ӵbCm^?-|}[i=6hf`O3]J&pp$&i$/-m]~E&wEKw 2 -nvhjT k,~a4$븓|)\قgʉF#C U!QH5vϵ%Ӷ8wDI_,!|Ւ5'μf3Sɹ*_3+O}*"N;x!<*?EzE^n1^ewN'UzC>>$i3$E2XsYvl3q {H׃@SqqeC\נCX.w/Z2eL6ML){&iV(EcB63JM{"V0Ͷv_ԧ§`&Mke #7^ -e*-+AcvGyWwoǒ0?V]Ѯ_?yR6Mu\ֆ FAč/TMV[@+q0iyQ ֩_U>pmICzEc>!,FyD2m,MVQAt8+ٷv v,OJ!V:E頁#i+Nj!,EYDq#tXƴ `9'S~j |#:_6S(r^[] ~dS]*u1U[/ ,O,mFwL8{c/k)o5jfeѮiYҽ!Zm iӅC uV|,g ^h{ pk=X[ UDc0D笱+K[qxwƤkk]{+'w>o0Ȃ/B idկF|J|d\Ё3_ϖ^%̶j1SgMg-Zג9͕ >Ⱥs2?@$qթLhL#[oA(366CS!FDFh.AH\kvx Y$G0{ t_V}nfޘ~3Չ=[*En 3#> 1bɛ piFөNgpm Uq & I T@<1 5\*_CAnIR?+!XcLpB#*Ó ?P wpnXjB ˖XNcÂַUcxS;x%o;\ q Gm <{4Lԡ[ٌ~z-([m  rRP'@vB$4C䭸"ÌhxPIn߀O)2xׁ{9sP eCzSCԮh6g6( ӗ+WN0%MJn8BuKr67/ +N%n.UMI\U^oo}^6ә@ -ܷ?}qG5.MQ!;+ԺKuG q"i¢ROڦY1`zqhvi8"E1Oaj~9Ϋj1O*97#}8gy&RKz[Z)WMΌ452o4en q0ظ!9p8M]u' Nw;=q! tgFL=qnVb֓*`h,S AG^u,B-p$߶@w'ΆU(V2]1+ִX3.P;UBcVP93GMޛ6%M)W_]Bx.P!z%gEƠ"srӋ&qAt'=P>T0;"rA(\WȴHi>1K m ФXD-G7ĕƇQîO`l=~G ߵIJ(W/LJ/cɹM?Nk䨴rhus1mA rHR; 34@(8L8 u-e5Iu-{$UC,9~QuG*I@2s=5X}1Oh0 نß(8Xq,rip0 KlΥ8oK066k־CHn?o01<=8AtjX?Z=z!Q0ęX'ﯝ\i9hԦa tsib~/*#>>9S64;n)y^Di *;1t}j${@oPj3dzUN*28 `V=a1P¢07REp]ÙRnK_O$7,+li:.){F)C-YoPau(g`3E5;ocV?q] :ٝ txto~-,8I7a[ٟˀÏ#dW5u c|H?!%D%3 d@cjlTݗGh]Ww):jDB]I4zl@ԐxTR cƄ*hst4!h䦐WчuCpӏ!3$7yf2]ɥэUsqq6N=Hyx Q%vG`b28?Y60ܒeKM]:,BI8Ux %;ӌfwnvei27N[q%EKY };@{l! %V΅_FӿS]>xS$@l--PBay$”Դ_6*%< X<^7ۮd R3lG@aiz*h%+=Y ΌiRX;4kג*.*L(c1oSE2015Fc-T/}B~;)atzFP%JwE`|wRQ)|Slt`rFA-+KJ,xVH% 4vԚtJ g%YX4=I'?̛[jR `DD W~\CΥ΢ S+T0O~eks8/7)Hf:9iy$&X-qEntvB7F 2ssGOq %@$4)+C]FlQBZˊ<فdwEsW4*W%`WR9"|TFs<J'NH^&m: `Oz Aʰ?xճ~n8 uÝߍgzd DByyh>g*w۔,y TUsZ-p gV*X\t[9GM2Ϗ))POOM0} {Tp4wu2h(2alX$^RǷ ZW;$) }ՁgRƝJxLc:Q$__b-h=-`zER?o#*Sw.沆#eUH .!u Y“%T+Ri8t Tu֖V60Kznr IZ7JD;gnG\\5& i4[1w#G {,.bcoz' hTZG\7ID&@Vb ۖ6u%)^_6F,޿~J2XRO>~qa1 7ܙ5-Qh%d%.7]O9pɲ?|ꍍZI,bL =Vݣ>sabiP5| ?,iZm(0pt拥ty0vlj>Hmݸodz< g7n IĬʌQm& kWh *&s] ?#~tj/iAc{qH yQgPxCdtPVYuH-3tYPg7dAzCbR>Oʞ6) }l'k/ +IziZU',֪VuINav iv,>zݰnsBw)sS?B~' ( S;qbA^"|LU BgF{ִP|˫}o=qdq;Kb"J{~̾3,Ϥv^4y9mFsl>oh=э>LNW<[lRKJfh_jǚX(y;a2o0BLRf-ҁ~li}x+5VnYDg/څ6VRaUtFh==)v5̧DY#w)=ح'd7mz2}ae$A-^ x*Khueɥ.Upa}k݈I7?h\fNLR.:fTg-jG@Yǹ|kϣT;$*PVX0#DVՐ)/6rFhcs)E@-*&ֽ_yfibCMC64mP i?Wo9;j:::J+S }:YlN4 a *l u3K嵿8}~rݻCDwǔ*h^eҰADH$&޽enGt)!{M.4_V3P,_KgDP4ɸx@>'䉡 9R%ьy.:4$'NH Hu8n=: 38o;Å]?r!G5o[w޸a1vKN&- SiW(]$"S9[7eNc!lig=yQΆ݃C 62i5b%S0 D{ orfN{Ub2ώ(rCZK9?D#% & x]x;ێvyeF^8^"pa.$6&ir,%kYG^q<atč9*|shL:A7OdiEF=>U`{UJ,VY @55L n-p g$ آ&#w k9~wH4O5ډzo$9 ;5C tۓX.Ԍۋnc@nm|yg(X1(Wj+cnjC\ X{8yT2BLedzF1( ڑIsT31AL\hjKWe`w; %zfl4sW{+C{62($%YvI2T4H,og8)b. ވƧ#ųԉS씗0X';.@Yv;5o޳ŵL~h}<:!p4ǵ\ os6ИPͽD_֤X Yb,g|xl8z8V>ʀMQ~.s0"G#bM2@  ?DWQ.][ Agņ-7ZZ򰼓1 (z1ߞu#Zf%H&taқL'^X+me2 {D tV|MCH&% rxi:ZTƈ8w?FXWh5wͫ|-eųS%{' 2W-6&6-TK:7Y(~%x< kQ'lਨ0TS,vLf-.UG q0QyhQ*呸e~=bv؉j8Q )tdscU)PF\n {`^TQ-1L?%/ GdR˪CtZSXaF[#[h͘lA`Jemwa__ tLJ=aaNZ.8lQ#d'MH;=β iզjn"ZZ\ܪ*JE$pהD5 0[m̍8DV<ފ6W#[nK?U8GM :dq"Wx[K >UED}@L/+ Zjp g/uoPeoz -huL T+B̈́38LU(ujE:2ox%4|埏R2=".+Z>&0\%Qp06xJ˜􉘰7,)UYj0B;j^%iF y7T[Y:nS M2B7tiեm'@`()3YAi!fJ.e|ƛ2[jͬZX Y!XB$uӟAEfO@n7]1,/0vf1:/8߻M/a'iiG4>b[$t)z*~_@d6yPX4x躇'9ރٔs2E:dNp7)V@eO>A`pA^;M*@KDr)!HI $oa`&ƿf@\BBfaIFvvԞ/at+ǚnHI`qEry.C8L>4ÂD oSڂcnMR+c L!BC2e(m5s _8}qTb{AfyfЛ!\:RR/($8L ?('ň9Z3:X"(+%L^}0i $Z݁'DŌ,{r@NwFŠ: Mfb0lc[LR2pC$B]AonV/ 68d#QrDB P:3lj :Ҡ}"dEgLHz\2{-WXxcĵmwq?p_7טci:?CEX)N5>(1yb* E6kB0" ;k|oI:˛AR6IazIopv [q}>i{m[ghBoWU+bGgh8y8-'BYej ;>8ܭWܬwҹĮ>DJ,h ݿU uCq[<}cru/ {) Ȥ g% .ik39o[0B[?A@oZ ~iaagE˝-W!%Mүc.;O^)폪 aIE!X uOO("=AE7|$9+GF6#9smkIctɻKkt\Kzg׿VjaYm,Z-%NJ1+/֠i'㳘Kq90g*BiֵQ%HѨ CP|.=r5 C<ո/#YJ5E-Wh$ШY@}Ň"' Y'D˵5jR-[vS ?8^hQQ3rOxʋh"MV;X] dm. ޸XPvE}kFt>f21i5|R= '^A>8ݧ"znE_цz%iy2JQh M O-M75O\`dNx`j ݧw<acbbCvGQEK`/mLՐ8@onGm 8Kד#/ta0}LVjw "ڋU ^. NMqx(~ ͷJqYќ C$w5*DW^^Ħ۠. ]hK{,OBi1|0QElэh$⣮GZL\Wh_Ю3ybY΁4zV]n]o&ϖqU,Y,՗HA|H!G,Nz·IƶzgBgA,Ao? '&@l /i&0Ⱦ]ɲy/VYo\Z+X(c塲VLFu^;`d%Qli]p~N ;| F1OJ8ϕn޻Tʖ3z#%sV5$I; w}{40A﮳/yIA=TGnj_'QJ*ocq6!bQ4Rtr7ѹg~6)MP{ӵ -;h-ژtwG6&g&РPi,*z&@+y0~ved?# e֬iO!c|] Ѓ-4AYb5 ?ܙF!QIMT^#Ko &RWeT *|}*czʭu ܢ]pL }ǡQ^j_ [79^Jy;M8\ȆrȢIƻvG$ޫcQCV8EغD);< y,:MS)>q+n ƨa&PZOR*db?F"DGje3MUe|u?R vY jOaS\IqnaVOh}n.4O;sRZ-iB[zWR/h8Ĥ@nE1>s*Z\1oZβ*F@䕗c#s ~ *%C_ݾHX.j)/ R{1MŁ.Bjw^gquRd%dn4xRl Hr(hpqӅЗcyͧ{Ͱn; ۋ7u 土HN\UEhrܲZU%LHTV5pX|gT,n{Y"E\hٸzxWLƯϏM?k=ۙ)n㘾Bg<#;|Q;|9=c)V[+ؾ|wQ CUUf11MՙvC!6XYM?Ge'#?WexïV99V`P?;Q6k% ȃ^^EzsE5mw3BK(NI I1$X\u,+D%|b˭}maRظ,"Iv p[Nk>_ ʷzO&nw)f*c\qt{$ IA);i G^@l5BIT}?nl(YS ;'k6߼ÙKmWi܉fMLFÈP!% P&YolyRx]=~՗o1&A}X?5"Nbq|J]*oC [X2yTFntE[JRTN`s/=0'ҫ:n7M]/ ~h$ܝ 5@H+d} 1Al ݌yI2B =VP$D({;6_igI|/@4I`|x8[6R\.mб`GݐgfA b,ml"P*eG:(OƓO.Cu9EmALibn@{ŠIFЉy1\&GDn*pUX5 Ak`)XG`۰ Vs|ɢn48LQZc|lq7z'+esKcr$.e~kRw4Cc3L'ODž;Hxަ%NF}q1nc #0+l1_1elюW!)-~Z-(Э&DNKTGRM~?#ZbhSVnk,DP*.{pH:0NyfuslC52 |W9ݱ{i4}n1h:H+)NV--'],\vJ}-S_i=L;.B&'NlE&aI5$poO<:ϝ]0t-T;[} ] ھ+IJ7%m(!E3.Ҳ!zÇxCwՄ{8\,i %*HL=<vҺuB[eYZGqc[܄~hv; vRM^ 09hBU{ 7ݺ-EmQ |A; 55 ;fvpg;yMk%ؼ2F soF?|%Eq]+h 04M7v<,w AsMf~viZrlEw]yD !Hϔt(pl 3 5}R\G!ˣ1`aviA(aSLW;&\_6 H-#4zt=!Wnp %1lL/7FlLf*i#C:ͨ9J4Jd`CHlL5,a /vdJD267h|uv%9pxdSD†{>E@S12rdy\aD1mZ /A{?yb_Sw72 u1QsLr%yyV:E2FQŦv{oJa"Ax|I#R:ٞ ^!x4nNw!2naWEXBV31|+,c- W50%J[ePڹTH=,#9_@OnAހ6`BR:ECCV IN}t7ET5(ə,_>"Q#j:zUP.ȯ$'5X|3qɂrȲkt;94*gЊ}, ?,wDy.zMG@{X sj8z|ɷL?y)X;}{u"@Das)D\a1yua|2&\P=2C*:.-K1T]NM\\a=DC6optk=68 fl$2#I@Okk?mzp#q!mݤH^x*ϝ?i"6'ثG7'xP5vH ݷz1<8,eVv\'czBtHϞ&.ݺ=' gύ_Gl% q7ˆ{h5M0-&aPͣ"7<#GOqS;s Ϯ0;F6z9xJ$ї1\*UXH:g-_'E`ꢉŝ?j~4xE:eDxy}Q$fLwO "oLKp$7'fdݗ +`%Kl 2k nǴvߗݍܓ[Ѡ ֵ١LJ| J})v\T˯>`̕{5h:*%Q8TU%CL+ 0QͪDXgJN;DžbYp=ǐ "][=[<R z?~o?g8Y>n!I?>>͏ za˭O t^a~={O/×cVĻS4HJQw)_9TfOTSCuK:^{wvNc5mPmD3M6Ʌ={KQ/ k)(F-K}Yz"-ɳ6[[7]QFW3TWv^ÝeM(Q Pџ9Nd $pŔ9)P#Yg\&1O?:Ȱj2>z-AB-LZ±F.5Vl־c*|&_~M&6=K.OO_?xv&[P_+XZ8y&\qUbn(e޿(A %#SH) Q!)!]'%Lm<f׎08/Jhd:R{Gz*'i@ J4OVUӄ ,?3tAѢu$1ˎ=.ٰFސ2<;;fLzq竟k_;uvхĂM,;0'_4,\Pu*-9\ `9җ-gˇkԉKtm %YZ{<h="xVm$ _$ r'#4 斂˗o[V GڥHm[ԼA.m;6ثm+ .4rKlCoBMA>}@qS~4vOז 0r]Vai, džv6Sc Xt- erh]Rx6'sK8޷&Y(?шӏ1T˲VcFek3p`|qo"xt AVVk .MUeP莢j;S&%eXR(bJ~ʣ![qȧ/MѪT˧`,3[j+g`Vc:|U$/Y1e sQ!2ebY[Aplw4ej tWW& H >٭aN3HC//u-{񡑏T7Q]w0 v!QBпy65TrL: 76D@:<^nkD =Ǵ˞7Tlv|GI~P5/j.Rt|W}-yy@԰ +\dhŤn)K0zzA|=eAH;^;2 &<4U҆ӲB͹xsAKȟ444 KWq8Q:g.qh&6mShvh)]]$v6m# X*hzI`Lׅp3i4 x[ w# $#2-p/u/].Ɋ򥳗`b:Pu$LNqON[N'|=3,h- [) ek Q<(I#&|@ Ϥк*ب$#V"E0B6Ж<RFRM5uf rǽ: Ke(-Psl8{&yU4ʜl;9Vd}gI{?!6F4`Ki,D+ng:5r$5 H{#?MOBÂʹ"P [lq(y^oThR95'f87w9&]nLs <.&aqB0A2$7ėʿ}̠UsYKEx[#eq;|m,0zzj-) :b؋Td]F/D4(agA.4j;!_A}=5Q3+/Obri:1~_v`LrOFF[ KY77*![%n69k(k/yVpp'zυ(=N2)7Wb=f-=webs=_E)Z M1oSWgʛ~͊FMc i8,~Ǿ(> ,Q=\r /&U"J-LPXsFy6Seyɵ˔s+(Y1#JσmK:U_~j5"|R rR _g˙\z7vX~ 0kznE4&X5aK+!:G3(k8n޶&[ϘEzf{H}6A$#$fYĬV$D,=k*F5I=FgghS zQ]뾳^yd5br|8 Ir-)ZS#xxM6b5= \P#os-dM"gn(-T~.QSu*YcҘIQU˳F8/_4+Ydm2?ݖWl_"B.|H@pNQn%l,b0S%OLvzݼʢ3i.fʯe:9+V׃T–k;*t2_$ #OMO}.z!rkVwrGXH=sEz fgA % mG|x/uUF͞q%.hf|P1;WǗJW|s˼z}56ee,Ewk՝j߃V-pv YZ_ϭO' M4/sCFV.KXp޸tya0EJ 9B&T^uR#( X]?dԸ"`g'h֏|,u{t7.bqO$UV3miV#!YL@_DytKHSh(?f8/4Z,*!iUp\]zڑŹ>:Ca(o" cf5j^jtl 22An`bEQ dg>զkI7/v+ooJVy$~Tli0O u7҅ئ*.E)(90LJ̼'KqPbG@[ws':=ӌ43Dޔ{}sX0u9sˢA"$g%)4ͽ2A[&(lq>Ai"eH&kܹ" RV π\aRH9lv8> p3$H1~É U'x'PX>Ik%S VlMqɲBt-WIna2$Bqby6FL1Њ^F\~SZs#)`0\M2uaFB)'wߊYv|dB~"EBIڻ`JuTW]OZ-N1nbgVq$'5,5Z6FC٫Tq,z>`ƻ")mR^ yŧa8|,  '/C]+({uWJ*6pw& cx֋,{x%'=;0aT=Msv8{8Mpu4{Q J/u]/Α%`#86d<Ԡe)

uxY_B0յv7f,3t :XS*|EVOܱjNF⹃6jĮCI3v37k#2pI{USJ.aR@7w bH#/1U$*zBh?TľIJW[#:QVy4vUzymYaMV6OKçrp/v_0r$\3j8; &C֘692Su0eyWul.|v;ƫfTǎx`~*((F0%Ҟªjuɰ$%]6`[ &agdXYlYr%yVʋ)\vb"r.l%fK7 42үQxM&̸c9vD:#u)tš|jԵ/ouIF8vYh={#cse37 s|I1}\:DS֫@SAv6ٿiy- 5Fw{^o-N nVL)f!Lm~`%8@>nTUY KG#[\ h]e /y>PhtV!]mkLD'])?hrx-m_T t+")wVwhW-a|S0)e$QT\/֣Wrk|dP2Lbv'U&7xmIYZ[ V5"Cr"ar=Ebl49wèQKq#'uCo"x¾ƒ.L`EMoZ/CC}X,\ihS\Y =R(Z}1izJ5d8zZ׈c&@.q t[M6sEsuA}[Fʄ_nņ—YAyR_ 4I;{"Ǥ ⨰icGLL2 .Py6@a]GH*bQ&n$xf[ow؈Q~?LXa72=OuM&[ D (t% e)2!5Xƒlџ{Xf>3ZQX@E% /dxL-\&|vL ( \5cE‚iHیĕ_l!\pOXcvqG?hڭ^# ݭx{tMT.dRA|#ypBlId!cXf)p]ʬӂrD5q40[mwy.gSwG+ٹDEAzkcm9it!K?.NgGej0? Iz~Վٹ=ܫRdɜj~ѩdOc+{v@99 ['3{6' Ebyv# 4:-1͒GޜGKMtf$62LAj}77w^ziP/.9|$ە,3>^T%b0if}jU]RAsq1ߺ뫕 ۢQXU$z_lЛ$&\EB"yV(H9 TUu;d =ŁYŵ\ݮ7(< ;cnxT$к"<ZZovCwJ0&W&X/CMZlJ:LCf$ea5_ ꯻X֢Vh;%!;Fb% U ';9+r<,%ڻwX&M0Gf$s7kͪ(0w=em#G)|\{ǹÇ8mzQǨ^ [N>BxBO04LT}P Jjo1!/GtŒyQ7 -<oh ()utm4Éa%"kuT|`D24`=?i4lIģ/u-HOC0*h=,i>z:7FcLC,@WڼR\Hlrp7bF\^ !M">ԥճs 6ĺ!(ڍgdʑ*]\r^Updahk8 =E1HtʄpU֎j`So] t q:F;{NtFV|e\ B O&x֬9bY[kPnݰ?M])u&~hK/c|+4&ZE5(ڲxzNCe|C.;aL(Um-/(O-6M{شmC-!vʩIj#{'Šs#;{gZ n5?A+v2f鐃p2 6JDZ[Ncd&+"ܾO;ϠMEs:b7FdvxXĽۊϸJ_Cڃ]wE<3a &s_qԬ12 w3x7[$hOMVFf3צ՜ (a-rINDKNG~? ̆=u4ggbDU871c/|6bS=RkSU]ickJvߧ~ 3 ~~Ŷm> |/Hc5xM-ZxaD.>2?m+J #Y>%t(CUOz6fFq_xPF]E5n ̰G]A,ĠRmdB'kkӡxu6l8N9]͔*xm30%}҇GǤCkw{>1Xؼ2? HKo&U J|fjJs`\h$EmONGxJ=2UvCTQ3TF*0CJ-#%Y=| =P۬ ̀wśq$s "\ ]²'ț8zHv Iz4_$;Giج 6*f+F8V߂,ݯek9`vF׳FDӆԈON*@WN$2N {L| iIT gʋ@yYcךf)<6͝%œLK7j7v@*MB3NI(f(NCK9J_8I>CR&_7c=y@MP}XY"h4[_/Ժ4܄u]6PG$2!4B_%J]R>WX'")=/3~N_hbXf?N31Pn$e7ȵT[W+3Un$ހɸxp꤇^qZ(f zYa:1to"ƒՈ:l00٬b|.]8DGT\/ 1lUF :iYuNo%ivlMy|ȕTr(HB>ܮFf!sBd-F7x rdѾI[ |1$N _Ш<=W.q؆tIW]Qї]RK,{EN'nCfyeܣuk͂b;_L8|6lx؍qP0tyz2ILQ*F!+D $-9nW. al94mfr_մozR,(d"s j5Fb^z3N{'zJUIq1.i92LPˬn[M=Qɿ}0[hMT/{.P0i‰'e35L{r<]Z:PQMϤE $^Z@? SPOzr0c5ݣ|ʙBHA  .ocǬn2y,/"!tRD|)Fg3F, |l]欠BS#[Ee".6PJ5:qMj뚑F1&T9v?USd'r{KZGɷKCf]3ej.3#d]4=WTG7H=P X]N G30,Q!gn vw=u?/d˟آ厠o+<I@t6ZaX y疳 f%q1 ;;ţuNO\7eq9ڡt!W=I@D+̚؆FX~"huxC7( غ-7/[zv2Y4Վv8gcl%.ĔtTLi(zU`)\2ljywG~/Rqr 7aL{cI0җ}ȅSc~>KrQ1EYjK f^hR!@9X]T:'ߺ|#ZV|&1ݞTFw+@b;3@?A9 ]y~`}$AHW^]S ]D+֗I!Im-tyȮy9(ź6OAw!{eB+749ٱe_eu `|hc*)ˑۚ9З׭,z)\b#(ą`rFX)-o<,N]tDarD(oqd n%fXId- _G ?{{~ZѴU 7o|UtYԁˤ)%8}p\/+n/iEW20|@2RgoC9nDAJ3K3|ͫ<+YK*oZC2|J@?StW'?* tFfl7j +'WzkVR؞YU'G~6χGu Ums1& Z_wۙ,w-),k/ЋagVPX\'A >\^MU c'E*_< 0_PYt?$i#^?ۇ> 9ahjσ[&$Y>88a|e`IV#L54smMdb~fEUnK^LŔҰ (qb |e7IRg7sӀFI]&% 2^R `Ngh邈$88O 7Y"d;Ѥe *8DZ+c(fo!aߏ;! œp3;gH̸16ծڣvhy&bio8=ZĐ!ˊi.8`a9JD9^'΁>аyY舙<ϝ,ƫ\~D bNUzhͥo7GB zMw bRQSJݢ`Cِ-*ĩISPV)$D0--"l;քvfс]Ы_ydnETJSe⋕TcI+At[m9(WCɓ͙l^8mkyS5㸯ah6t2f1CY@7]WnT%Z[U'=~TlrW{ Cx?v)3ֈ޹Go[aSwAAJZL(u._P2XY2Y?&J$I5&xzv!Q{H1#ǙSfc1[ l6 Ӟ)-D ˢR>o~F§ B˩rW:l9'*Q0 7b8=;&g*1s6XjF^-X “Mk{6h`n0Ü(5}ۘ:i8't|+-|&M"{ V 7.nf޽F7|NUa6 ^m2#O6l3DKOo;fbgq 6淶 ¡{b@FS埥̣o36 Al=JQ(0ȍ 0=:dcL;n LيڐwI/$=&R*R3~IMEM !`{xt.;HB-6);pySf`==s&%$gX?5$MȣA ^2ᶄ=' p$Lzk`ԠbMʴ+8/GIQJZpʒ5|I5>T2fiTx<L-CfNӥl@˯ Li+F,s]+V8!*Ŗn^`o]mFBU]^ޭNVZ᧊t&r0jF,Pb#^IWmN@(W6hy *:\׶Uv*'^NW7Hð.aX㚺r]u&ޛ1tW}SFou?BCg{t@t&_lyޞLTjߣ&rAH*`vAFgB^O"peew{QT'!.g.S}4Y|l@b U9s}1G0Ts0cd쀛\0̈́ɷ?ZLTV)[/)ZhJbaWm0o&V cezKųAXyEUᵛG+KnjH2ʔmhS9~GvUucYv}Clc؁@KĖu$Oچ(I\ڢ+tc1Dhh;ܕ^ z5GM A0 "Ь#ۓ圹=1 0][؁Zt)T'UvcC|B܉t"#F?r`SvF2uQcN\@`ļO2 I$ݹD ^hXaF舺Q#%ZB0r ZBv'̕Ǯ V$ ^I%f*_x Ȑh lZJAEhmc'"٪2JoFq ̐bٙ@EO"fEK,A M]w 0QO]z~^{ʌbϤgT틝-Ǹ#wS1*Mzó0}\(@rBۋzI#砨kyߣv% o.d^-cGa,|Ffv)晰ts?X^^X۲no«K?86?#?0R3U8Ndj'D :swA.}O.bNɁ$ʤE{V*m[|u}ᣴmB"=Uīb~ LZ69T:t׏MgVjj2tm(`bL|?ululuo(h-9i_DSv7)slD̓{ii%HFb sO[uz3?3SaMV`̐LoS*A2tgEwe3Rf1&>㯲Xp Bڟ6dzB':6"e,^Vº}ȱui%p~.֛0I5{ 'hhKyq(z}Fb >%rHq Fl?:$A{i׉"؆Մqgvdž9H i%QGWЬٞ3+֥,E9c6o`m9ʗoR0;K} ] = A} ]<. 58\%3eк|K !6mD[c-"zXk=Bm}'0C_%mQ(rZޞaS(bSޯ*x>6Yp~&3Wt|"~\4$`hBv9XrJ$ծL0%@cQ\.TZlenD})GlRJE(~"9#\鰜=FEeVכ=Xsx$PtF 3[6ݓ~PtE#>=%a kRQr.8\Sn/ý*B ,ϓn,M W r~ D1Ggr qmäN%  H:yއ 8a$+@7+Uy ö^l٧+}2`C6E-ƁDe F8maQ3{X{a.`Ktd _nkUu펎*@whCa>erT=/W9oSDe0&w o݀v}:฀O9V0#%ǘלNa+ !e\: ]#T+J㒂;va-Pr0xv3ڠݹ@8/vq3Jjj10SSJi[ٹz3Ee Z'6+ y"$ X'Aør&*;q&zΒɧqY\!hm8_fH}VzHw0c<2w\j5P*A' H@PNdiM"ͥ7X˞N=Hczȴ'_mzj`H5+Q> 7!m#hHt0F-CN4݃xKT$3LjښNSa~KlJ%QOdIʳl&5))gHW<ŵޝYK ,ۭf;4:Jd9w"?/En Eg*?9QdN˷i'=?j_&n˟)\TsLpQ05 9{8Fle # jN {+֌K-,ܑCW>AQNݩnʋg冔WOh(3v"˭(Uų?~bҕv^]? YFeo"~{W5uPk5lQ"(x]L\Q@Sft99[sm&-D;ꌓ7Eglrx-(C]鈵M-1s^wl6֭:I0k"'Xxh?XѝVq) 6b4Ye1}$ʷ._Z[<~0 ! japN+Y;_PL ranc;kr]:8 G6)em W+̤\g<q04;k~/\l I7A[}.Zll e ;#sQ;AZK5`Fa@—o[ K.إ[jw@{. $r?} d)yhrW8^D)]*>SBODI~,Nn lw~80~$C.MX"&K8|D`(.-\У2qD?g=1f󧮞9D({0;6~EU?m8/oY?sGt6f ME }OeрЖ N~R -:s(ġ0[rfXQ44~ k+ɭH#y^" # >tϳ]U]m-gx}Lgܪ陀r ѡ lI su~@ 0t)`jEpOBX;:>B/"mHo9*R Vq{zNxz9vc/B\D"hzݲYks_ݜb|{:\Шᯭ?\OF9-~yrqOKmr67IrIsХ]_YDDc-{lSfYC̓22h#cGH"G?vN !,kmX"]؀nV1NF,-=% &hn-tuHw,!dF pTUnQ`XuY I ?V_ʱ4v*1)"nɠ]: ``z 6w:s{|c6\s! r2e#/qgw\-jFZp.\aM2A? k@CS} %]ذWgq;R9}D5d?5(gtف .'dJ-D,R܂Xҩ#FzK1ӻ.J Ku* oI(0M>#H)}n4 =X[vS; V䞗0U ,!DW|Nk" "dh<wvX+LLhw$_&D%H/qz| (Wv.NlSCGm?VXXgׇHbd.11h飆n2|z۩[YEK]ODYV!}j&;0nl/]h7,#Fg woY 3#U8zŦDp fMg2 S&#ؿajkd["~;U#oH}01nl+TVr~מޟʈ< %Pf`@GMZcyJ!Ҧ?CIzbڑ ZZ*P2üȰܞ:TQ%Ih5_j$XNdˀKFr[EjjIM꬝O\{BҖTK>u{9$ek.Z6#$s?MWdKby[r:Q<h ]SyCxtY &cyi8c= y CP 05̾OSA73q.*OnIuy9~z^( * dPǼGf@N~XFP5oJt0n>[S}Fٸ&@|imQ*ۨ>l?ThDݲ{W_k0n]ш"9Ȗhi6d~A2GJ-&iXKGϲm#~P띈f j73p qj%Cw6w f.ne+?Pg 0-^e)\e*X=m<ɀBZh%v#/I| я2A b,`x17zǰ]?I4~ q׶V.DY;8A7mBb4==́4|>P Tִ AT;ZL bS5+>*eno,X;i; Zż*ZƩQo)C@3D#hi ѻdQIY-q 68DpI&0n@~MmJ׬":àN_cY2J^9ѡޞ1م/mlݑٕ z< 2&XA[.[RTINS5P9fZ'`G^L4k  ;N@s1d-OֆG~! CT.KG,fgMs&_йR VE3vt|/|sIj"D0\ޜ%FkNXocO~% ƈ/TmdGA񦠠Tt~QT%pCәZn_-*yk{k2P@[룄dHTbzq֊KJ4Z?!CT!>'rb) s}I@Z!7HB,i-^$"i ||^dSp9ߛ.Uܫ,|ҰCt'?u]0MpzG>E[<Wv({4L3cY tMh'P:M((#L"f+)q '=4ӑg-ծ `b[[n+Y0;, dc5dHDjr_a\+Ӈ %$e/ܖʌ&!5 ;>2 p0\~;lo (ײu~dIXLx>B(.!>=:4(h9P(j)W4FfZoěuWF3"%ЧS넍R I;7İ>g^`L=REa).oO MzO)SmH4"nR./Ic7W(@5>ːa|{\(/6ooC4=vl/>t3R> "f8dҌˣ xʡu9B1G?exO 뭥G3SІqW=y8sa imv2҈L_dlyMϤiȣ LAv蓴eL$MQY-+y/BTpIt_T BK^,绅/}(u/`@'8\}Y oOg_f b~Wn{+ب>1)|L~ӨɈ^Խ2XydH*k**g8Fǥ1kTe4MLtʼnUA |&Z@EHN sA/@jE\ Xuu!Aþ#hY?YG1J ͟{ד~hvӮiv;0̎b} ͢]NHB9YMSm G.z!i'-Ōl^߳IMzW ju *F سsNa X)v \ݻꚀ`cfw#cQiQ ˤR:aD\ ]$~șŃthLѣZxqgj~k<ۨQvzaĔC΄myM7_4o*=4(q>"eACll3/*_]. ~.-3ei[ꉽ?AփHBQ^2!>OW+o DvɓvɭE@ %oq5y{K{,Μs3x:.+R3&HO\1TNhn v0\DNbBkO.c' cȐ^yCJ9Jd=OśqN-:^ H}xT`B O!aV%'yh#pa ݓy59yFQg:O+ 7_fp-lisjeF#jU*E &V+x%i{N@|ż651mbXi-c4g)~psC[GψYΕԭ.лH)2*Ta҇^!/~dѧtZ"*{ƉuY~۝_>:za' ꎧ,iDTD!u,䫦'lkq1HCx,XR`u&v9n$:0Z~DŽB8\E~Y)斝ท[]G\nll&][g) YA"^1w:*v܁&K5="89B*\Hp2bex;2~:W]GL%F"(}YE傡(;F\rkZGB4C5Ps㗅I}'UQAºOߐ-{pTa5#UhS~ f{"kwMY5Ќ9T4ˠ CeZ΁]fBշLZ5&:t Wj~BEKZcSa JC>_a~$f"XiA)gjyBS⌺&KNȥ[U+%دg#xI) |c\੗Wmì#)RJR$n T{(3n:Ѽ/ʁik [ɠK_t 8B>nh}ZZ P`LOf@@sbm~m?(CV6!uE<O 7-u"tXr*N/XȔTz:;umpDFdCJFeG&diHVI_5mO`(ٚa =ϽyW*mD q阕(mR4NDTJ=#Y (XFh FQzρQ;|bPCdxlʥS)ʼnɸ'5ŭ_Rup7>pG†Bug|j- WR5KW5=Cs]E(t"JPD:f3 hTyRsmo_D IR@OZ.L܆ڈ*׼SiwPp2Adƈȓ^qvE;0Ѡ`ϣ~ƅ jp1F ۣ׺ԭGҚl $6ވ:F )|KT D k=?Cu~eSy] z K[B><ɑ1}'" T J*@zJC( nx .܏l=wl2zrs(ᱰ%1GQֵqH@ح*+ ϢmQoDPIe){B{j2q>"媶2ob3cUEF+^?cޤg1Sg=_MX >*ɤʚar+g,qG PZo2$`'[f6Y[zP㶋@0Mh(GB;L7f}ިxm{\DuUxa@#pq46Ð^ÂafZQ$sN͗9c\QԤsR,$N_FMD\nVe*O#N"ۺxІ`ia{sL]P*3p}7OL,w9'zt}³zYR^"L[:@ HP2{=ۍ%Uq[B6|CD*f壛oopMcFi6<%S^Xk0;#ތV9s䥛/yeh*W^q. DFB8@`>^RQ &@&HYBjCCW ai1rG^SzT@S{ވ]YkAA𷗛7DC/J >ڊ#I=R.H|ɕO-tؗ8^nWźB@<i`Ofz%b*ʼn}Q&Y>čql"ǹ: E&Sƭ@xrH uO$x BgLQjN.bQ (IZ@B<L1 EU/iP1eϩOleZ[8Y8 @<#m&z4!cA:FH=%Ekm7,̋1_}&3 ~ڛZ&Hb:GtC|#ZX)4@m?*m< is:m&=d@"" wv^gkyJ܁io-HAƣi ,Y8X Kst[]XFrvף;,Il 5&} pU)^Ƙ%(l[Čٞ=fԍvspR3ce-v6y خWq%bK֎Ч 61+<]*)|Lʔ `{A^G5^'+VPzP*, J]rd~0/) $sl{z^ Eh@DED Kjkeb2 ^6gIlݲ88WP6Bj;?3<ƨ!ϸHPQ\}|_yhNR&mWtYߣ^bB\ [Y T:X>n]M,5NR$:ZE]~9uxI!$CNPC T4.6+y~(+Gz,dA8}[ ܏]1]ٌtˏ ]«{t@bf )u/:0N`A}0* *sNB5e߫۬ɟ@}3~4 p )rj ԏDl)`RT{ n)uْ9XO 4q1$1|q Y"%2ksѾ+wyA/plQpv#o^uji eTuDg/ċ0"Zv9JRciAM3d^~JL_YFxo-6 NῸOS7? -=*&nﲉxM> ”@r!o1)O=O,W-NZw ~tg}My,Ύ/ܸ'B?|7'8V}dvawϑ<yr6Df)1r 0KGR?r j'=ԏx@f[҆fܦ_gQ86a@W$&o<Ϥ=VP>D↦S=mP]S|s &GX]~U"0)결ѷ#4U/N#s044IYqgY^tǀ_Eƪ}QR{W m+LF5Xh'&6pދhm=ljVݗ,/+bWȈlÊe.K[+ԍuuOgQ9= VƑ&ݛy8TUB$}В![2FMR["FйNx;kk^U_-`zatkYVŁ*B<d5Qh1Q$P2t>.pקfStA39G!z[ynjJ=ݱG%75ŀ@`&T_$*AqJkovOf8=ݞuI-?9Xv#Cœ/;vr>Ԝ'ԯڣ,J|%lGu=E.Oˆ-빀Br1+3'Lݼ]ߡdbOlfD|C)k)@SZ_ϺY! |1lKN FC_+ےDoOXќ?Ϭ9+~F}!|vLoq3B~晑@|tGKrM T `%M/) Ԉ60J{"Tmԏ=&-B+/hKJ2 `{!T70? CT9Dµ>]Q[k5m]G2Bn7J-'=8mJ+YxI kbs3Ok,OT{:CRaq+uyA(%G.~ɔ{\Ox1@9}6?rO*rT=2ikл.c[-3DЕV,19Wtӝ(A,݉]ɸ7sASn=$`+-HV)CHҖ2͟xUA1OW#RR{`сQ(G72*~zMTNLCL6w/"W}Ye R-\g bjk}vkɯRΖ-dAL`R刬DZIJ6vU$|#^XdxY "Uay hk/#`yNݝpk)D]Rd>2 9_Ӎ+QgPbĔ>C҉)ڨCFUh'N\ ia^w;0-PL%>Րeڮ7cmtܼh$΋t[&|GҦbǗЪBS>.Be!c AQ;&7 ̺@.@!?~\3,_szNece0N^] &|aW6^2)HB@XR=jgn n##k$Ȳ%rU13TU5R@.Z_[_51NeD)|E% ↯cv`{vQa_YDq<4Af|ĺuxb:2Owy'%{Ҁ2uELj1!W2 t@~M1+(q?田"t0B5 FfKw]p{"83 wlO ɐ\pt)ֵ`PJ㌟$ٿ5ٖE_w G1=-AT&hEP{''oER}~{&1ʙ•`w'̈ K v; i / o` \+gXA 0iffϯ3Ŝ{ňz'*Z,2p-j`[sqOl kxI|FM>AȆ=1hP_NRVKiZƟ@H \1&aE-֠ ׈ӂ. _t- *qzۗp ũ..0_]YPnܢk{Ï}{.ew2e*@-,zgBKr1ؼ=\X )jiZUt)ĭi:?5X{,w>F{)BrVZ2Fm-#(g1"5~&;iq;/Z6O䭖37g[+ gK^Q 05sޱUķLt~kѽ9Xl?ʧ3ϫ{S~E>X W r8n| ͩuv{:">5Ayp,Jv@Y6'QѱL* 1+gc4? ^lΠk6K7 ZDڌAvM,NP[~} ,O9?{)<`~2I@qR /R;!=%HPEto$zNvJ ,JI;睱^pr(֥bՁ +ZZ}UҨy¼<~CP,g~ňQ8Sg4; &Nfۚ^:fFcCf#^؉h9[ܜ< o\*J]y\.L]yrOH;/x/R\~cocN4!]hW=c а} v]Xijf;(Q.t5û1p, g-o7*HO.m)C >vz?/LWeٔb:;Xvc8ɶG[USǭQ|O/툠 J ڨ̞8##onԿȤrQ7hp#d˳|(C*Ke%kŃ==])hv-!ci+N5["cwyo4=*X J"hw`Iט?H~Ә{SDZK LO)g{3<e>Ԋ"?QZHzdG7ץN1\7wD.ѓK:˒b.횘!VXɵG|$l.釭h_ȔlґhNF#l}R ,|$Q.ȫWTi3^\*kMyC`r`ˤ[ӏN'FBg3+Sn?ǟ'xA_ȡ[.iGWZT Y=B(ld%{Ú阕K9%[ƀ/\sEv ^ȭ^܃sAPSV(2K`*(ֶߺ cfDߏ:ٺgQtA٤F5A]4ƨqT6 *Ya {ڀynoi-r3|pԎ$%֨|jT`K(Or Of[.^C@6}%VR9zV2&Z, ))C m[d 51әqhB8'ZQ,H], xv6f?yHՀǥ->ZU8!fzּ&g"(> u5$}}}硖՘Bc\pz hA[KOK#*䇢\JdS, (3`sO=?OY^Y59U c6BCw38:#t3Ve1^LBR"^m#G:swX@:nwƜ)+n/BN&m&&F\Klf 5p_ndu6x=]B"a<`ݴЃv#pAp*E&n] {2!weH.hJDykNH'&.)]J=}o0Jw)EyHUomxHsR'? ӳl`ԂE05WRO+DpMZμTqXZ!|s y&Zsݢ63LN.56 <."خgCP! xL:=_W5R Ц]"mvsMU"35WKtL=CcFقͲWi& PzS豖}N<PǡxjY`tdy}oLzֿG>qJ٠65x<9?O gETPqC T~f45G#DKhy@+tAdl9::+Dbd;~}hu(_Avۦ4恆A:"$}_ {SdtwׯW}5+%[Tb4̈́jJР(W!&^zmPd^iuz[!w'.љ=,@Mtֻh>F՗7Cx"YaL{54$5shGV<:XrͰѴo>e,4JS\s*]lޛb*|8y ES>0Ԇ2mu 6'g˞+?x@rY0O62x30o _ĴBīan1ި !XrOj|d W]}:r' w>!n42]F{G'Xb_XElՀb|m-<Ƿ~WY¿2JW56qϣ8V/v?^{EhB^FHѿ* ӛ`у9 +Qw7FڠC#?뫇*0SI5d"-lK?Tz">3s}iM.uUfv_dT;72 j!9tWz48b IuǤjL-h9r_N!`JsprjTA.M\%J4gX3%BX nNflUf/H S~~TB iM*,Cd>-`MYbuaPU!P3͂^AaEўHQ#8sKWqt=U}f,B@Ww~X.WJs>2mվK^%Pe  *::!ۼc-ھ%ܻ0#xZ7k ߄{r$*U-Ɠ`ԺI.-*v#Ydx/,}or3d 9{R>QLȺܺ?Z0gBd5,s``Z;ԴC J?V)4Fp'OUƭ+jOb;pL[Nj} jV1 JB(֝s`m4?&۱ Tf)ՅݯĊG0u%A:YȌRև@1o4sXlģH +jƄ[TFH5>cUG#]35qNe'fj"afnQt4EFkZ̛#rkӖ}]:o46E/+suK$ÇXZ}dщ S>e|l>^bڻ_- `FjLb$xf!+kaEIh \^dL m[_ B~(f-dRPiVL<$U٦B_!nf\uCJ[& K̔AVj_14ˈ :{˔όn \HOk@g;Pyukmj RAHGbYO#fDj?}27[$u(V T^aGOxfm[l%xKKGp̚9;K6ے%|Y 7 Td'6{(AzkT{&b6b5S9'(ZlmF2gXD _/H^'$}JEjLAAYW@/)_@UEoky;|bIߜMXfkb)mFMeed*@ae4BY*RUexdtXGA`}Fwh`<M"E7WKaLsS a=K;}ŒA**^L$4˕~C͠~L(nõR`mSG*:GQװ(V)[~m[?S. ?*(:9('$hZBhR H%0$pr Zz*v|@_sk /VTݠy:,ҡHg$ { )y4N -J]ԛ aȹi'`DYL?a:ga'+mNrh^Eǚ_ɶ'PFo}T;3~Nj} EY}OyPN);1@P'.tg\C7BAj-0z&_"\gz@-u9:@MNDhlp T5o'OmZw^Bf^¤_tJxW\ tn8S0ޅ?o1-Қh ljRowB?ʷd!EeQ"!>?^"QO(gc38 yU[x cN$tWk8]㓀R&&N`6)Qm5ײdM6|~@b$耘^e1-7k%Io55ԑV%'u[v)>zP"9kШJ$TB.{u6|fGoWs)S֒뎟AכI)3I:Z`R|AuE6L;|Vݐͪ9 lM &avHY2Cy@OLp:S}]R; "˘piaKB u1+Hsn2G$#?gWc|iIB߆uCLFdp TWT9M`iaIӨW!.?ao?w噖xˁq/F' '@w?B8\}l cv.D7v%ZRs=eZݮB#8}$7 .`}hw}Lp- C{VTs%'k+ߖ"}a,I o(Ǘ|]Bk=G}'!)plU4wEV._"˥ 6'q̹uJfp pYa*ΞM֭b˻.ɓi,[,F[Qf KEDaCO Tȵm}xcH&DϝeӰ{ߧe t8:gd5rFv"8e;\nA ;ꏦ^tap KW[Q/BgWhTYx A[0D h0}"͌ޘrWJX 6'%TW9#vot(4"Hitj5"Qل6qb5W߂0kY\C$WةI]kk[-[Q=r%C#``dX+JօR/<{m~rmT*pxӃir17(ܨŻ3߽oq1to-諨Vf,'xƕg؊)f>*~\dڴEXen|\Naf$ɱ.[z=Tη(HF- 9#6+v'(#So0a*5G"۳]LuY+sGg[gG!t\3CWdYG7):Z'R)V6נrg>Qo nqF]jb5ʣpDTTX *V\}ǨmVI]O4Ӌvxc$x~@L AFe8ie4f>sL)2en%k#:Ehɀ}q8~/_'0*ƀdlgLnZb[/rBC*I2pMf*=%g:JJjNxKP[IPV4:Gmb򾹵ELƂifuCfKb_:&Q TPy'G632}H %3qL5S+Sv1cK?% { 7z)nlV_B<qosOMJs:>&p~~(>B8H۩4D,< !dy/H١GK!&z:lBӡ >nyZxU4e50߉){y_%%uCbd5>Y>t=uBї@s&G#yJl?N2>Djj݀^ZeG'TWpPu;%jZ 8ʍ LU*:Ug9v*!!6-tSa @ދgi14Kt)ML e}"LW_4H^[St"ڥH7@f0V{ U8< }J'VZ*"rv+6\D]chϯ%ܧ}8 5B2g?>} :Ձs;RڜUO5B.)r)*۹e_PV=w; OqcjJ&ȨJP %X](B֯fVWVNx nR F i@&c$>NYyڄqqsΐ@V=)ڍSz(5aYN*#{fVxcLc0OQuP <,ը-i$]l 2,)ئ!D,T2_ɢv MdxSfJցG=,ugrluVH--ăJ߿.":SDzNSdM}Bukőuʇɗŭx &08K4b}ۺ2k-ЬSN' dȔ=<[C53^Ϫvz.:I r)2+/$QCf>%̐(T~[A5䚷J$w(W_U@'omcdx+^=f@E"=\<,J\O$f}%oK6H6 :H:),r4'0Bh/i=:3KHjraKj#\Oq?$F~CV_?/ /@Hvc+.8ew ~]^R]jܔbf<1Sڝm20sGKG|^RsuES!EhFAu3-,Ŭ2]$e@;ٖI'M K]ܟgEsI Lw9g_& TFpѵMRRGu>ʣ7 d x-leqZG %AEvAS['m9mbyY!}oB AkV|}tL;(В8$˂~B3e8cnexcCs v+9Bzv~$aZ ov;/i*&JUHς;1sOdH88y(\ x߲<"r 98ċl M8 f5@[#}iq>6~m N(-'Uphn5%庴WNgs|Dhf?2H+œ<3&JciV2ţzReM=8cW®u$q]S2xn&F=.4Rl=ZMoȳ~z#m8F;u?CSd0cdvOvDL c cȢ\U:pţ K3=6ς75׌$;RN}2E.3)dKS)OƂ E}hb=*d;`軉P \$>!8MkY&kwAo9oĩ%?.WρԜVh̰bBgxn9]r/1Z?"iz&[ D`g!o`@Xu )Ebb_D0tg-]Pz4էR@Uq4Sfc C?"WjZ&#  5UeU/9j=T|Q*Vٹ75`A}T5&O8sUf^;X@N7E+-bK$WE5deXHyFe Im9e2+ҬiN\{j{R{BeJ)*Vŕ‘ شf$cJ]K Nxi4 [4/X#uND%w*gfK9٤FL; is{C4hGyD(n$rTl<^_QVDOh-siK~\JHd\@#"9U LH]08>/z_+>EWiGB *BFE&*o6N7C*S4Pwm@%~<6 gp -?^LgC9FGv¸K"eٵemJ9fQ '|ް3szxQg;\,{.+\?(o&3m 9^e+6ΉRƲ:̬¤ Od#?ꭔ{PZc0-?qvSO{(ְyK@ZjbR ;@e]n&݄4t81na?L"oU;43aZ2鞯mÓq!M n^g*\~b>1 Aseŋ,I[<^ u*82ɂA6=Hњ(c5M.0B]yŭj\"U;OKF.o2F"2~_D=c G[rXCZj`- .0K$&OU`bP׳%ϱ'p,[;oҭs(V)^.h jvbWPCwEըj@t"|P"VIq^=q 2ƈI2;O? G7M,CSޗLvqm[4d9p,ܰUz?L0tp8%¥Oթ 8BtțΪ.C?ibUTdI# ipo?d}J@ocI)76ќ,nx]M$ϣ@ 1ez8(m,d==⽣%:AɅmQK2d|@g= dB2W8O 3.{d~Sx!->0sxKU 1-_A}:j{/cb߅qʇXކ^%ܯG56=vCΣ^ #7v(, }bԉa! yٟN 4Pq]s`<m4V2} E\oOTYS6ҝG s(QgVۀN?0\VT>mjߵXG/ EE]B!puCwhۛdž:#^pRxYU"PQF >\ k`gtU: nLYF~YWjhN٬ -oUG4ˑ"$J",x'FO*vA{ 5gZ_O1Zލ$p\깉ZW!7zmO!{T-C ^L4Njl·#PⲩԖT@^$%G-L,):b@Gҿx񼐭HMOKP$Kl'zP:5@,Ɠ9gpޡ r|iR䋐zY_(iGv5l ɮU3sCl2Ԟ ",Hf7O'Q>bX41u 3\R,s!:3l\C4@=yԫA@jUٵM!Oq}@L:IV[jHf:D}ŭ\|YYiܞM4wI5=}ơ#*%fn_ڦmdee!|iߘ#zNž G8=x'cba#\("*.T:õ  \h ﯛb l pZ l7|GH/I-T0ۡ~@=_æh*2 JYm wpŏlzh!pR$XͩԟEymi _y`8q QB8R?Cߝ.- CW)Wfm¤j?^PV~636vI @m3F3nM=_*ͣuIt0YhhȔ~>|8pž*hS&16bD9v٦~8N.=PFD/뛂AgS8p7:ǵLw͜{lYzT|-en\Wtau&ՑsJ_z ʹVuTE8;oN~Vf؎Ccd~PR斸hSur T/"oO.Xc*TwVVdyqv(q}#$`؂zNh&܎!ͽ԰1W $S.Y>t3) Yv %[HxN>ۧZw` y/-cV"bGb^ۈz 8r$zN3"w|B,C-S4VϦ/E M҄b)?jy;-L!MxΔS9#株,8)gf:>U@@TNi@#!GƮg;1mJYlj %PݚR0Ѳo!d@Vr"RBeF_C[{l3)v3I@*5/5;^WMN:O*QŏxRXVӼF_;;Y-uKBލ:I7$XEE5dwuuA ѵZMC鍪I[UEO*prGz!q\ v~8 UrE 1fcAoScX{7u/!5L>\/̈nQף JA"r/`.M 3ws`* u^, XE¬n5n|S+ Bhʄ$,U갸$9fd7W \0sYyq[jhS8-HycךE1{/:Ol5c4i *uTU6?۳1l$R]J(M^ 21xQ W\Zdwy6>)c48ůŮVW@jy˞4n76y#iFWkLdE1İM_6{=T7?)9|H?!`S1CG/mv §ϯv6r-U3дo}#$5Wx+O><^_Cu/k(4*’O^zNgS~>~ וaD3d"!R5[;_&Xf;pƃLgF:, ᯎGLQ Gi4trd8k3azC|CƠ)fɡP/tȄ]^;+-bOtĠ>Rk.pko*5H\nut2!'_ߓ|XuF5iU;t>9R\sCȬ9\  >tgUXjFWMcx F SW.q3~_xg$vt*qQE _}`խ??i t5ԚlŜYuQ(='Gl3bDڈ 2^h c؟h :2sExHyBy_O) [Ӕ_2ʯ)\:r2wc śTiRqԛ f}w+fCMA+qק_#Y2# Z 2a>mL2}Lg U1 T(<@8:>sՂ,m9^A)a4ù1C#`t Y;#b$fR2䷋{ eBOԗbJtp&eh<ߎ@WK0~JKApLP(UK8+63u!z͠2&B zh_ י1ga}daaCӴ`\BrI@)V9gc庣8Ծ6Ks}E?k:&A"+d#^RsC¿]H|B3kK!{yBE$~ƪ[)(W\8~Yh~+fWE߿+|JEU+Tw~AGYfti~d"lbJzZ GYECCOKf^kkQEo_K>m҂X)X9s^QHQՄ:"KT$|ڲ"TJ8fx;J=<)_2%AVܘ U:pU-7O3u06hˑR@a^MBn5g , ^]=sumu%5j{1 =w|V~ Ii%^m'A@^(RN;Ab=h6፼էh pf;F[K262@\U0GG7T(vS I+WvYktՌt_KE 'RCit\b2C Uv6w `W6n'0mIպnl[HJ!nR>%Ey󭙞ڤ#{0`iSt)"yPLJG_GL, IiWM >$&4Bsgg,J'4`5}LFY+5p}*y?"a鬑a C Q61Q/͹% 79VF{r] 4K}J X^`QqGR90 E ;OC|ںu&ņ o'TǜSw^glư/)uhSys Eˇ206Jd<9tlVZdjutY@tS7q+vm;G:)r% ,M=Sca3X8c`*}۩ze&'-,mhROk~ע=FW݃O>Zq3⅓8~ 0%T4BME0זP]־n6'Xk؅7Vg%?9uҍSU ~uS 5krS|~-J>xqڥ3akPh+:Ob{ Zw&TVjjprmp j)yj1+]'L+ 3,@ɠh(!xsyЈRH:Hny;t&'<1B#GO7'ELpk%Wrb/N),GP c ւ« S7tL?>SE\6˕K\lrIdBo_t@"ک:*f5#ɱp^GsdUd~cđߙ5 fOSgz 3bƸb[Ohv _w-zW*unI>5kBk鯎L ߘLv~U]gv[ yok,RW-ֱ5jM`=uڄtPh|H&8ʺ*egDkW/N),"7xuA8nD4sS#Td_D?mݚ-3#ӛ==pXx-mv\f'rt&344䶽G,}%e (ǥb#^ZRIɈ-?;Ա{56Q3JC(a\BV4OdKGKA]0G#2蘈xNV$x.$-Ɖ1솳fhʝa:|ٛK*nХ= 啬蓋-ڳJ}kr{HUc󦝥,/`u֙l+'*S2d_ŶɠfзC9sMN'/t~(kz>̆vP~290(MKQTp"qo|Ya(onAtlCۿvEsXzAbW2r@v%yWdC'w Z h$̶cl l\4yESk8g\ֆBUR1FjF?ړB~B _aСm/8j8V&j ُpG! %F÷0R^L}Ms߹D=Cڶ>3#5fu'ZOlkZ.ߪNJwsEҀK4pzRA"YG6U?p#Hr- Z%[bgF[MQ¤.! W?d͞!F%Z•sVjEHqInfiXkwnSf~r{sSp>:S7D_VXESq/_ P`X]+P4qQ1 ^bE +L A8W/_LPx8p89`,@Xa&B Y>" R:@JF2{џ|s.pJ7l xC0!YRSU"MMP#k=xE| @iR OlY̛ Bimz9H+jv xt2e_YH*XDbOJKtS~>M::zp圬oJ\E8hh_bvHfnkǧt}}9Vӛ{!BFU=(/ s8c[ ZFc/l#L*^fs%MƂ+,C90J7<3k?Oau+l*/דu+wה{wǐÌb0Cژ2xL98!(NٹD}7$ߑ zN̷pQPUvxMph90u<7zd$ymq.ֲ|)_sxL˯Xt/ \Ҫج^Σ[pR)B5ed<21%S:h<]q5l8.)=,$)V78g˗lr#.94*<^hicga u[UYkKt0e.~̺Zu!Zh)ÍŮދfSUs;`Y[e3pƟ/>l %iq|Bh1>r\RC=+0sw\ vC;_M\]ƨKsAo.|J"چNԪ =: hH'Wodнe'B,cGqLg@J>ҕ{=kwzDz&*KTx|S%Q -аb׫`3\rdћcyAl0C.1S# s+1ijC tb$7I[jgN륌G9޺z8~tM([ACztGȮ@HLMZMϺ$7bFDXHLb;oFi' SM[X h;ZD e1PTV'5:O_.Jx=`(,:سC Fo cPw.JI7#~*$fx2ON`vVFQP/<[vm8&ݿ>F+o5DsT|cvxӺ YvZ(RÒ3-N*B>"A|B0btz?yiQIz ]B}sְeR' $Fr f~ Xayd}&{ D kv`a^ܑߪV%u`g`E"gBsȽx^jG7'qɅ>tK RDum,x2E}?#+S.V (x@?2gEv$8·t=4{]%p]Nw#Y.^vN o{E]OzG4q8Z'3F}w ֨ݦL\|1 Dw;@hlf.;Q@ p71/s K EA%;_+{3S{>e4 voiAY^z4CMV}~=jվ d>8*grwPz k0NFMRَs=%%{Goiy0n=MԷȺKa'_@!|m=ӘkL^ay;?7o~|Cj=/j8ś@2g$ Ix=v41ɇ3YM &$n@w3b26]RzXwGiH0&2*8eA8 >o68޶ñ"hOH׺EOG1\"$3kwB%\'{7hD,.iyEz'WoxГsjV֚luvp|e"hL7lmr]Bkt^D-ٲ#fk?ܾ.32D5sQǢX-R?of)a~Z!J Y'MH~ͺ u{zw~31Sw qN$894fM{{B~(pk%QIOOE ~dfޓM=N&'ar3iٵ$2ҳ"CY>/vT%1uwԊIS 1+iz=^ps})3h՜w86%_k2_73{,yVfDEK}a Gڞ{D* O GxCk"xoc'%C94W$o7&]< :%CU'DџAo#&w0 ›. )yF>B[J|mh& u-Acm4F2]34DQIꤢ.`U49$s'F!벗8)eua9anMܩ%`. @$*[-S?ta^} (j^EWuY`@fǩM7H~Uu)ԟ;U)؝ӊEKDfXZ<"uÃv.A+ooxÏfv} qKu@>CHż`6Sդޖ#墁#2Qm |~T 7 -jW .S=-"w{3hX5iQ篨ځ++{RMYlMR꣔hX*.|E2X>^>$YY-RONfc AZ#V/:l3$ZҧB^IZӞ08# TA }?Ł>!C많I/?S3yȑ:SY&hѺ_v` !gAAD6@?og!`_JX*m I- 3=qs]Qx +^SLx&!s =P <͙9gzݒk\iCJfଂ^7)T gwtzׂ򈻄 F39$b0l_h~p0Șߧ7޼DV%%TEvyxƝ^ mi` y B:6r>T ̤دUZ`.u ʎ'۲ '>[Q6A-#vk˱@^0]38DŎ_& x]<{4Ÿf5}|VpϵkaB,*=BB_VӮ̯*# GkoPֹWQOZս|: ΅[ر?B^L^#)LYg S?;0]\&u;Dٖ@$awr/ՂDځCMnUL 6FyjV$ w$ùR殤=x:pmփBh0H$AK[ReR ZK6ƌETp5:g=k&݃؇)/^{xݱ=dn{ ,U`mrӌ"n&b+1NJs< 1-%/ئ ?YaK\\-Sh)I±?H HY] 1#K9YC#.iʌc}JGծR!lQpc FЊSnYY7fGVMPy'5 0ƸPrZsƣ4^L2󤱦l"V~.e9'-";`ůΣL #K+*Pu$A_"h`0+4!lѥ۾ < dqE]G\ va+ޟjC5Kѕ?pSlgo5H|?&XvgNj4"/9ENM+iāb}PY0oF $iޟ:/lFI^iekEdk:T-!1qL}Wa 6&Kشl!7'ΨM,d\yYuyF8tȞ;jZO|F",dpJU(xߍ 買 EnzE4yHoሓR.>!!/57sJʓnmSUaiޫs?i; g`:?=[7bB FeQd֔0gZue-Tkd Uf DU3I0EYu 'pO욍Ôb$yr,CzcY%ɡONRhbvIZAvnNG0cmF|ly9p|bٌ>dV>̀ \]ث7tQyzӢn!& ,94\l( Gvly1tF%S!@^I^Sq 7 _C]Ԡb.Գi'?M}HVgp R1BՒ@<{X`؜IsV,9FHRE_4fRAyEJFNW/s5qG{.jj1U|8Z P7yެ4”Mif 6')LVK,د{ 5^eERd474[xDȹwm?( su@wpFxNFepdG@x7*j|\:Yڶ3CI]gwBUz_\+!16]^WdG&kˍ<* ՋkvrjWPdHhDL4430T#}ӹ,ȡhϢи]hx,zp++ +f3J?# ZO6ps[;WJ9*p*r }Ll| !Ez86XXclQFr7 ?CUvYc(u(M5&n͜^_# yZV w;.Kg1Ar"w8U+R;SuF벦@r.#5w羐Kd4nYSSqPx%ɗ3-‹TBeG(Dq}nǸp Ұ.;;*G0\&`gXo ˫і ݊tm`%P_K.pL hcjH\mu#l]90 ]4+}b^x QZoMYJmtr $V%TuݭXǦZ9RgKNjIɣzQVYrC4iitWˮ-nNW^$=X! }۠,I=fݽB'H_;~3Y5/rPf`"i$*:|ᛞw K(ZV>rf ),|+[)oJ+=c{c=35O&v\@mՆM=ya~yJ C Y*>ltn X˟RWB vB ٛڳ W"b fsfG %Cs"o L̮^vЕˇds1LY b8Xъ\Բc7'axgXڤV5m00F֘B^ha''{zQn=fmRJ~@Wś:QugneYNoa-Oݡ"L϶|W?{9M}hb{$BFV|(4r6+Mͱ*KIfcA"5- bTmJgwiSsB6[$rpHWgTf9K >Dr(JI2P;, n\,Uz_GL@%C5SYÿ%7s.+=]sS=P >"j'pΤlwqc?5T(|BEf>Ȁ7@ۧ+hjRknKuJsi7SN72Q.JOkey:nL kΞ*#y DVUM|Om[ I3m&lgu=x6q\7C(,X!*ģ,Ɯ^ݏH9rQYdZlBh XbsEC:uӓM1 kE)LmBtG(@gv-I3<1%v!{`'юk 5ҳ1씤j7^@53u>KwK&:6sg:RNZ Gks!pȤN H߇ d RUݘ<,!2U4= |أXC_ǡն:Athp.2#=oJgj*.Q҃U.Lw@"6IͤD_6֝ʵypmaFI]~,i[ z ;k95JsJ4 8R _p]QpX辚=SQ9KZ 8\ՏaϞPDNyQ9s.W":K 4&=̔@z aϛAvhp;i6H$ s:?)+k¶Y~{9G  P/cu;DW(Mcan {ABJhMA|y܋COy?*Uh+J%1eYJeYa@ЪN kWAX|Ak-ք\P.rIؿMqtYC.-"iJP]6.0纥NmonanG:P"3߆ac{41BneJǬum N^1g5NQe8ȉUc>tO;z0_PHETyN ͛u+0sM612dw7@6>*G?JY3E? ?z !2])tK[vJ@uE'5rˡh~WZ_apIE>+votCy~e*wvܝ`}q{ ]Ov~8g@K*ehKhҋk`Cu3Ov<(\oMs6.52^O%YeKߗirgSxȔ'I{'L8GPQ->ҖoFlkj0 *ؚ&F$ 縗g_%2Qg;Y@l=MHEciߌ<^R+ hHm*IggJ~.R?wCAdO LNp9_tU!Q[g2ѫ9c Hr*8 m:]MF[C/uiXcwXu*G ?c3дV!VH &5D4NxJ1F[iEQuHmI+2Z$<+X[UBi8+Kya_/O+͎'+@* F&xzgWǰ:=\AtGi$&6U2Mw(ϸ9a#/jo0>i`Ջ9W"QOUr_pG|fjgn=T8K!;s1;~KKKENphdHm|?]~i&]!"7!X+VKZRW־ f J|@Eq e)ыBnBNhE. `(i&e? !jmU-Q5}p]]q|prN#[xgMs__ܿLGW=hD1tSiYAV\tm޳ TTr-[(Rk?:AѿV?.GtaK?5tE6(BE_ȼ/'TlArlEzA E0Я~,i  ݞrJJ6@*qĮ"cAh%B(8L-C)x^6#I 09>:&W1Oʋ}Y([Ag{vqcFrGڷ,h!9gJfKy]\*;׉/ԐEt ZԤ( }Af\Z)6,H!G,죦+>GbǻxǫW @k!]6`X #[) GyXK;()$CN:PhA'l#tKʥ7u =SaT_(H7 /6?ewEr_:$AL9X:gLs渷Roe!P>}hyTV$ީ%q$VB+l!ӻәu˰Xbi|%Ru ny9{jϩLvua8 \k.dYU% y.tcáN>gk+6? vҽ9?xc[ňNo?/V%ÿ_&SdWLq f5+4s%b (L&K|$$ې3S4 R՗5y=8/)2;o`f3;<3P0O:aF?-2GUG^  #ƪ!V(" (&992Kށ$#L.]WN<"-@m/mD"([IgPq_9~aL}:ps*3RsYЛ׻ y{DMq 5QB8NI^B>M DՎCTfQ/FZ/%kfӇ2EB0_ Ju Ƒ_)i 7Mk LddX|jqKj ͦ?VeD4UzhHϝB6l.\j0`8˅eex3VKƽX/RzG4cr$u !rlIIiXpS=&b" Њ9# t` Mi{taG`-7ic{`4 {E5鞞M895'GVE(}>52hZd/Ov~Yyp-jLgpR&89qrSЎXP?LAWa(>s'm]#E⬝.СǵFS~f1CWJKz`)&$ cW/Y 5N{Ç81B_ag0JSdRSIw/$ͬ)2~ڈgzyrȍp`}:>&LS 3&Zx/SʭKچCr{D}3wtłɎw!zD,ibS;vv{UTfB;QIM&4} F1$H eR: j,K@؞>ӛ< u4?/ `⼒<-LM/FQ\=j^ntnQ.(kO6P$A⼢QH`' ΨͰ`?DXBlcVh9H%qÛ~hcե$Q5 s=!0[EqkP]%t3Uq5v4vVކd%q=HmPH(dw,dET);ѽ.m Ռ´7i_gl/LH^59. (ts13K;ج~+ןZ#'4.{&]Z込Rn#,%DXḾPN 7H y>dP/`x Ӧ|~f89~N*ga ѵs;y>?!ئim7`*& b ;iemFL]5U|j1_# ,R Ó[nmq @dIur1 غ$CZc (~$A.E"y {(HA&wjuʿNz(e aI-Evrm2 !5£j;Y>2\rh" Ζ >s^blJM7W 9vQSMTSA$cy*P(!=|8YdC?f?WDQ,LXQho3lļĞ5F/(_S?(FNsv8΢>CH[m?#3W(Ufӿ6I٤4fH dQ=gi ^2 jճ"yڐ4:dĹ:w QO18U(^xHa6Nꇥ-j`FpD>6!达%K'g9oL{=PjȬ;tCb囼-غ|rz+/AuQĀKb iTWrv̯*Y[bCTHoƐ/U ":pIPqS.ɝp,ru{Z)&gN@ltrqd,oW9Y $5twյϚ^; ")W);FV5hр@jf|qK{ !T>n7^8/e-snVA\Pn!&o1׻U8|6t6sA8$i3)@7k+ͮ5 n/|f +69-[ɷo7w52NvO;QdMF fl$#q&jȀ7'փ,ɚ9[Zv4k_(Z.OJq MOQS8Gs !e\6 =e=SM=bQc$Kt.+zTD= I`ҕNXڡR/n@dlX.Z}u=H|JG*藴tX K&T=NH3ۦ h(?  j:j (4BPmCA21`^P Z["q-ax`0'zp@ `qU|`+iQҾ+~itbEE1Kȃ=G{R\K0*՞-aBpKJF]v!<ʩ+H"$C Ul:nYeddw-J`0LN-B@䬬>z4gv cV1tZ|je[Vgxe.G2Tǣ8'E?>gVJkJ&Ԥ[Ov>{ЍB,sg $3;nc.U^7`=OV1gۯ<4lx^''V*m `݈4LoKAsg$>ֱ'`Xcf&$xgliUK5`1mU Q҅'L2 | 00l֜GMx ƶaT W!UNRcW g淺*G6{?}!`Yvr}2rH16}=܈&ljɚ wޕyugJv .*Ih=@TJ2[t6#Ҩ:9kUJOO\ϧl7j{U$9+ 迀s,DEI>tv2"bwy/9^x̵F>s@n=bd3^Bé`"SGD;ŋ,/p*Gd|HG.|kx@v"l'"jM0mb;ҘJzc69My8ޡ_q!>{ WNR5ܢRM#5`If*>\/d0d%W kx5@F/'Ygk |;uiLCEiҔU2A,{?sյFcT|z$H23e7*ljJ搆 mRluGA毺6"4N s=W` wHoևZDf~r)=.xϐ49$5A0l6 k;i\kp , )h*q.9IYʷts:2t\ Չv-T,[%fS*ӒҲq<[ p{,XgJ$UzŸ` kV Co:vުM͔o{Kb`Q QOk)4>y֞%> Xfr:R{)>7)L]-3jD x/-Ti\) |ءhPT5hǢ-s8WXO>۫˥v3-5t a-޼Z!BzcY(#Aϒ㫃]VnBC9*X . @-s4C'NuCI/S davE4](uq<͠군 m$ڦNMuk Pf<ϔDŽ{|y׊cz8foDqbW;hh:vI)*Kvk`YW3!Z ]( N1|HWjDbaFO Br-͕h'EKLt]~=C9]+*M& n]`K_c[wcpI0&MQĩPJ%ݙmH f1B)ԼW7_sg|0,e,2J+(+$0ivb;]ԘV&U$H?l"w5{D@6pheĻ V!sͶdl :ql_ή:|;+R?伌dWҢ[7eQExG오0\QIioBaXe~qQ6ܚq1ɼ"Dَ$G"yF0& "^ɧt(-fHN~t@|EiFN,Dt3w(R,17t鿎'Ͷ39<*!ٝ<"&ܬxiv ^bht//8}>7!`(BfwR #m-žMz7cʖ+_~m8V D0ΐFG&@}UіTUXFr>I@D zUQbDCyZ[g2&bU􂲗4,3P呃 | *)=; 23@_eiʝ #*7_ArjIVGQp[/Zז/0vdbMֿ>N'r{?lu'XH3u\YV]e?_x? O,0PۀB+?i백h7#pnwU/6PT#6ouKi}<srN1~kQt; ߭駎+.7c3d[?OB͈ĥ,R 8*`2JZEV^s+xW@, {LE_OB5r{*V7&/؆kS;rc\3 =!ŗr*QO%$Z_Wb腹@q;8E93752% "7Ď& |I,S2I%2?YgzJR 'w 2m &_AE)Ga)=CUi0D>`FD7g^QY:j[ f##)j« 7{Ϙ''y.T+&Cz죝=Jeׄ]V\2FڂL ,}%^q^~e`'+A$ݵ*vGrk sz6DӲvdC^ދvITm'#UլTk{bbC-M 0;Z#k,H@g28?DF1(H3/:u> )5('nǟKTj4;v n1d0;BLe҂Bc/+2O,l ] 8BuIjnؔ'7/2_z9:^7$8D7:!N˔Ԩs(Hx鎷flka:Q gB[s߸I6( ?ކS7;0["f&NuFѱmBr;MͿiE1tTqZek "i'˜Hx5 <"lmZP3"|.K|2yJ Vj*7CE >gb?}V"O\&5e66[9K _G=5vK )L=Sz >!K>%mSE9&?l\>^ ngDa׹j(O(_|aO,+m$O?v{iq!K[)Np4Mѩ'E S X[zfD SGK%_7}TgC8yu0kJ]$ъEE%osg`$T_Wd5*Ӽ7밹G`ۣd$O3 xкAV]^k.r{5G;?Xj` lm["/:98(p:pkY/ D6!/mϰk!; &m稘qe (`w_hB€ze-˞ 6pD#42gʃ.ܿYV  v'JV( 0HWnGbյRm|̏{o̤,n6,U X,Vd)X-\CU'*F1Jc8) ҒĿf aY+\* >hX0..9% NR8'g$1_pƒ٩ Rt6i>m΃nja՘yK^vλ޲R\oLN"5gWpy6Ҹ~u/i8l@}_ q$9'bɒ>;h1's'Yod˰9>T^ &Pu8G?$=p/FsGY|mu*wGX.,LkZaXd޸D c_¤8D5TPPN׫ -uX"p!ŽQA y_oqd$٥jcR9 r#>d%T1a N#Z9pg[]##DzfTs{-qu4 Mҟ(zCG6O>0=-&Q5QpB1+7px1 Xuz<x'P,ɗ4]g2TlوKYoE_rlM *[ԣ P1"H/$ІRh?DlADd/WSŕx_b9(Y%6˧w*Y>aSWi4&-y_ۛbAOƒKe';WO hգt# `~9" 7*:l9vRfyx^r8!]>8&ՙ˭y.7(IpJs[J34~q*qe$psAC!riY & z*%"i{~_̑41&:xp|l+ʀyy-^{ڧד l^ iY13([,ԫc=\IjDY t y@/m1%Č*@*!2^3Df k˞ŎC8l8v{d#YiC-˻hܵQH.-lO~,g6Er,7sfD1/S'TCXn{p㺯l-F n4Q%fp l2#Rh3Mڬ뼘uwL')/avq$<<װQ֡2ݙD6r*W,.oIj[2EbF/GK )ĕ*JvW>X o5b 0 775izBKz|^0>&d@٦l>[5ruQ`6iUH^&e&MH?fӑr ii=((~E:8IO_ZF0ruP7UHOdEF#(8)k9ߐ7 s Q:"0 1|헤Dnֹܭb|dvfʔM4FHݳ?; ~ k׷E a68!ٲMI}ZFsNaO`_ B˄VvSIv W\HD9!֍(7(l!롮aJîf虺Cy<Zq@<:"q2_*d~Y3l.V,I=۹9INYK= ^.6|\%GZngH팶<&}`7JH8*M@1׳ޔ(ik$cn]xf4&p 55SoG9JSι1\I_\ 55U/(A㘈H6 “9WU-a` 5 V"b%N\0{qΥR-BVnsf]᪎g7AKw\ 8Pzb+P :Z^[|Pm&ïPJ$!pI"_H:i'q7/e% bX0e%Z6l_E`I'GOEaFD+^'I;aw:MJ2(snnKRonK%El8M!HV,,>?HSx/t|z4Wb lb#F9w촞|_paiT#YRfx4w@>&b<&sG /x<Ru`KOWSui3bywzO@xd9CŦ] yLj*r"z(!tuS W @#rlo(o&y63pʟme>|M_!=?E'ct4H@OKZ9sRwLJX {3=6ߜFρ>7 w¼0>c)[ۘr88h}"2ND;2ԅf~ܷ JRrcpͿ~ Uzzt66&ejœ؛"gcgޛHR/.vgx3#{-s/Z goY\`&wAͶwb#+Ӑwd93f0#ŀBS=}g v<ǖ-u^bNsPm^uio#% ƳzV8Μt?q8k\ON_KZp2Zϛl{3b>cEVH<|VoU_?(|7â(/sNcLD*)!^fq1d S[sH+Db6`/@N!/: jV̶W)?'hh ׹$͗rGB |4&/0 ؄;΢"k~=tgr{jRyO}0+Jд2D\Lb>,ۍ^ܺJU(ԑbסgνlv, Iv}bMsm}Up;+=1cP;:]?rcaQT4ؿҭo;-2DZR2BJ]{^SњB 2x5<. _, gg9tPt&fMG!‚k$9Jgna_%IzTAD6krCf c5 W}l+Fi/g#)/dPЉk A˱˲.D O/tЇor2Oy7=u/UBQ78?b1S ç=Km J9: =G{z6YeR]̄sGK8gD՝B9쪏a5ӿ4O&eJy!Bb/fڳ;w ikk W:᲋5~}H5" īUUDmtj`bV?#]vu[IvQ)fiq<r*\T|?{<`A!Dq+Fcw> v00# pQjr5UZ?:״te'39 @]fU&&Te~7݂'vPe/\w&2*76 HVn*ϫXXaƩMs-rsxԿ>N+ kq)ve-ZDBEoZNhRd'5"KKBF#-ߒHsW80GO<47 , u2ǘ)t7VqkH'+Wtg:L8eS%[4D|4&B&,ESW^',81"<Mm"UM>x+h#B) Ae2 2y_o5\!_o "ɵAqb #3aq#%AT_5 %qTfQJ~MP[o& }H~^I̓gaLy 5}W6/36҆F`n :dTws<4zI' vCTTnSU..>օȮoV?Lkٶ&0UE{-(Y!L3ٝ-N&4/OkPwyt/{f ~HfBllpOVoLgIR8X*@ݵD)1lS xd& mo6$Ib_ާj-nHḵb m;B:jO=^$0uϏgCN/hJ\$_aZcPcλ!߫iF(vJ$Ӡ?s ꭤV$H2Jdw5(&#n+BrX IX/^Ju;qǯߴʃFw6|W2>%NIpbȶaXwqւM}GTu+xt z`5^az0$^Eװ!]M}q`^U RaeІdnQ!U3c;6{>zYrP+:#'{{X!S-5Ib1qhڪf˟6߉!Zt^Zd-OYA/ىFr W< 1])6_Z^qzF d\J+#Uf巿$@Nǭp6UA}0i$McRyCj̋7"`b(/]=U(ajwVEfqsD$7Xձq/ vbr6[D dtywט?" ^sqy 鳋`-db!Ovi}rmhq8(XnJlV^|\'hX'|&:|%`ۉ<'oYVp]=屘;$}nX3ǐa|h*?ʖ^ԕ3蛛)a;L@h? W .a u#I@̀ wKNX4˼(vSpaf{_hJyDp(z.Y|spqL Adlm(M|juQkRsftWD~j_/ҭ%_VyQDCI b*ArEKeߥayO~ % ,cFHJ{1uW93_"N$D3O=&B(:{:La7jCfZ $Z`kqZfT 0u潉R 6B7CzDhyܟhRswȸl%U؝6> ^+U1͎>ϟNVǟj24d"Q<)y6iWZ7%ǥ|Jc\O12.w_j&`Zoy)-{RnA?ϯsiɐ喕=\2ݑeDTcfpMm`@L[Џ~u1A3\b E{9 ڝ'랗(Qb]@.:̼Gd(iC6zu'򌣍O\dS5ef&FD˦כ򺖲\fsɜrB !|9T;xj*z%}0B㫗pyݬiA ,Զ=0m_2~Af2t /lIN,y5s.>!w Voch:8BQ7,EެaZn-$R&Q1@M+8Ey@{_9M6}d,AP)K>/ێ,{sk^\?g^zzF@l+=߀|]2&[_V*S~APp`e?5v7-\oT7;BdUr;~?5 N@PD{hH G;5Oc0ۘ뎒DbF.樉,qe a/3izŖ%0pVXg o,E"g`w鉀:\_r}!?Yͫfaā&$3GׯĮ&C0|̚*fKYHCpfFyc2@}챩XDHڙPq?yOԆX] p!a?2;8rSXgHͶ1 y[R/8ycuo6(z=7N/Dm^ tn ;7GPS7&@Qb#oR%\Y{`\Sy;[/3sMccFrرZQC%x?CDtxõ@nIFa,pP*+ aƀ3?9ZFNGJXFXot>*4Ip!1w9DG' aGI+%cP0]#>wV٢_|,I#Fm,E)])LWDMX]z)!lDg`pٍr4 35B(h瘀axrԎ 4f¦H#V+\z>nwbiʮ ' X{{jlf#-+GsM( ZQ 2#"^"E{υ _ӎeC9TG"KE aik{(?2dpB yUb `t(' n4f̞3;?O#o"K'}R.5NwlMkT="WeUTۥ {Ukf ;X-|!-Yz8!_aSd:Q9ZٱZ24pxBZS)b5cffd/};7-G* k*(RV0k%jO >VV! "E ӂ{!~aӠv5av BJ߾\Jm [\ Z)ЧE5 4E]gcĤ)/\/:-_j진'|Ղ1ȩb,4] ?)|tujux㩚-CDPX7h?J`4и.VcWh|=' ܎bz!Om6x1}iNͤ>l/%C(Ua\/i˰Ddǵo@E#K 2%H]5:^ݶj[&׈Pٽn M$ QfWea9瘀~Ac^2IRб)/ytv?}7`{_3G{aGerB0fdFEœų$M@-?G;ģZA僌V'ӹ gY⁥6f/zQr5w`]wub)RG?+'R2oT]ŸcIϝ룚)ã_\$4ll*[!࠯}j c ':''i@ 3T9#!mt^ɜ5 EeH?Zqt BQ韶V,79?S_Ug2XhERdF]Y&[xlp%,8 ,˜Xݢ)pD>r7g29t##{`k{B"k,[AŮկŔuJIqߐ (taG""B4F 0+[^ģ#9`&(ōg& 3|%Ls _!wxCkakT}dz4^5:'ך zm|L! { 5h IۙGкTQ6c5ܝyq\moz>]'.Qjpc^ݺy~c*ƫۉյq]i<.ʨRd@=5ޞO"C( ;1ȈRg#~9)7p"a,ۘP6t$^ Ckej"~ oiAXV .q\˭V@2-ZFLa8DuL]rT}ëPJٵFc UXSpx߾XUoxX,1g]+7I8@+a"F=l30ts8V#MWg=1qm8L_KPMq!˕ގOA7lۗ+5sY}\+؏uQ*Zb]ֵpc>6Fu<2T:0~/V!=,@޼,/u9Cht|c=[\1u)42y6[mɶK;oy^9mMCj.__O  *cGbb` Hm7!+ guxOK&"Qq@jn>X*ub>O] =o柡Z u5?I4t EC!MPh[p&XbeB(a-vZ 3":~ǵ[1:3hfhnn]DKDd]RJh蠧f'Ob`mb2#;ԎPA\h5%&h,J@>OG|ӖiКDdc$k0?=6=-R{Rh-Qeε Z!_Ryrus{I̝8sLE_y%R OW4/BULF1rt!Xb@r4gSٌ| 0ttȩHZM [F+ۮM۽&ЫÑqr/ DKءƃ0ꥩlBյ{U_VṊ} 0Gs!\#R9Y넑e]Lt9]fxpN !]…uW]4"F[Ly)Imp $oSdM' ]8喓BIE^Wv`*-d/x\MV!@AHYPv|;K!Ue`#pCI%h /෗:]QofFRF!y *+x)*IEVGam@ >uj pzVf_,;5{p2nKFK78dQ,2!+ }4d:vѹX۳mo*g_A pB&d=zͤ 9ǑY~x 6!9ݛާ8T܏5d*ce,5&b w/ (43 ZŃ0D(]Gm Ium7Dh}Nsmlqҵq^fשDyZJ@k`=A/o뜎ye~ڮ%EM` )wp;j2C`,jU?Q`vGnL] <1]aRAհ#[sp@JF~)eA9%b#=՝>[1)RFQJ׷q^ "X^ l|>˯d]!8mw3S3bDZŝZyB `HrPppӁWG(>#҈ *@8i!Fiza[H1[ jxzMT@Ѣ[ _nQŽZCAY֕F T5ʊr' ;6TAnUhETlE}0x*YWQWpGھ[7w[ph}mqmX4/[ }ɾ=N!eyCt6=N|WGCs5ąlf jsĝ8|s7%ܻG`)0@-C(I)O`Ft9M=n$}(AO{E۬^FQKT>f“p{kso<=-g%y?$4pK+N*amDaT˯-n_v CG5dz7*m&tCY` ЫwLYr3A@e׏19l!+Y$9?"IGtA.)k']Ɖ#k:}hW_UgHHk Y׬jŦ߀9Na+[PÎc|S' 5Ŷi"^߼ߍil7xk9EӰ"cFR6 (2i$tHvfE&>գKEU} SOfZ]4@=w 'Fx6mRs<fFV@&֕UBccc&> =?> UYAns l!':@4JI':`5sV#袹Q u1PdD fނ ]ljJ~T-rAflrKZ2FC0-leV3P̀셟^lsqݤyib-=Y̅/7ëҰUn,a}:Svr3&0X;Z `k{U`'\Lt3\= a(p+TDm 2 qрFKrZ27^BeVDb׀ƠT Iqk.V==Eih8߆)e&$ng ._ϩC11%L)pܑec) vТ1N_ L/<5;2n-g~4/fB~ɐpx'ص{I _8{z.u4I)P^0ܧ˕I›f`'Է4iP9hi'Im|)qP:ztBxyj|*{|8#'g&Ƹځ!KkM1p?NQR,Z3Y# ?,V_?X'/b̗2lݭn,?[\杓Hs2IPD+(p <2.R2%5CDjvIW9a g%e79̸ܮ4rP%z=RV3jNvb}(Z9Rp6D K0:򄲕1?u)Z_6~ GG?l>#,.\x}5nm8ߺxVo-^ 8r\c2Fm{b5UݼQ\П\zsc.UF 1]J/llx/CJM\,[˹ByBۭ#"h[yGy/x}s#U.JUlhp=N3Bt5v2.e\p=}ˇu15moԯ5H {K^8B_ J <8k 3$35fAvퟛwk7"K L-L.(pƦKڝ.ua #$ j" }AHR>P{& +)d+ZL?Gu75ˑ|<%'ЎC<*|2+I,H3Z~nL8edWu!m\}526/*f)bm@ܢokFa,B r\ةE"{c*0!Zix-xx-fNv}Cl0s¢p46%XŢ &U:V~4 DR) )n4Ǔ0/ͺ]D"m,2ěRpIس7*?}ǎJ1H!0oB,q$5xplvj6N0{5`"RSVf #٦  P [fT 7[C^1犙w\Xz]^5d%H|`mq ]4~(^ (-Q9]AN-ЭN7BKW3M*xF+1Jy̼z\ h5K/D]|$ ]#xV8e'V݈E > bQqaKg[DTUX o 1?RYэI" Y70&gI;D7;iUFœ6K|PK[5ᰗ;o]{Rh-8,Jq-? * r }bnn,RB[dҔ84ŏ]0"}B8-D;`$$ewr5p4h X^(ЍDŽ*w/?XU8yQ)apmGT ^z@ V>:fPDv VlM>9ǫhx}:Zɿ}눒E#¡WwO8?AHV*raswl-?HaNJM k;T^G]: 䎯yB܅qcÌI y@ ~lٵ eKSNim3qoEYhC+"LgF!-^@g A£_(_3B}DGgty3ߴT܄wwtqLY &pKƫf.ㆿaGQJڙBMt9M*|j}r\Fq^=77 {>"Vэ0hd.f/{r{6@Yrt^\bmAF?ߛ@Q'PidPo<2xbeK. gX  p4:HW/hH)4MxRpOEk1f'Bd}?uB ILIaNx)S h6ִ KDK s,bF@Gbd8ff1Y喊j[/XJvxѱ捬- G)8I ưHrqAH mO+? rB;+a9-' s"RWxӨ^K&D*__DI- VcCv,)к(zUZ ;煵!nc fՀqeZ6.w(詵SlY*BY@m#Y)Rv`ujgW(6c%=OD")6]i}Q}ӹ>邱t'tvSl+5e&5|JDoijK9TU 9gϋy(0'5Dh1oI:eh+Εlq7b֯ɒjgk-ɁV$&; "Ko ٷRpF JO=ʟ `zԳfx$~*bǘS(y5=MU\D7,Nu}rscM z:hӦf EA7(L r7`B =| YQ| A0:BGLX.{{bo }<Ei0joDJG矞A[Qe4nHePJ6]wFeH)6EPC592?%S#?>={cZOTz!l;4-tLKۛi^+2(YP.0ǘ` j1JuK\%e!An f%ٮ!R@ pӌ}8,43tOκMɅZ*k 8?}i545~3)E\E3rj$>6N[|;5ڎm i}/>?ϔ?LM!¾O|eDQJ0 a07>^WU"Y0dwr[IA&[N="o|#Սk ],=H>2thD0sѳK ~m@q~otU+8NV씬4287C*?4u@DqYﰎ{jЉ$M6[ 1B^?0bG_zdwp~H~+\7 >r}5tp^ y:N<\K1"Ù5?!»aNTkQ!fMrL)AcTE8TWME j,*Gx>XħNi %WN dC.lsY3,z2uMwPHZwȎ5/*( DAwԤYh.a s&QHm@*}<\aꁪ'v)`H^ٕmPε0PbKzeP./;!X YGl딩bF )7CȏD ?)جȼ& 60'Ik s"y[W['|ł5 "3SۃFFVur'J]F_Aۀ'+[DN"[z6/P[iI\s(e5;Ŀ4%FMgk}$Cp-&^]=[W,˯ B5J&UHPg]u&,AL\|*LVvH>zTa}X7wbm~XFgjE8&.$:ųRߢ龭\g_笎q~?"ι%q)54U"n>`7 + jx 0#I6mpL['FP@\zKb!iiv9X8~?'{钃0N]a%}Ե 1+lA>7GՃF[~=v'ǒ_V=, 6JR3n{O\#X , 8\ 1L^(lg@Vw#HXs)DWཟƗ-Ij2~%r !xC,Pw]Cltr` e]K 4BG ,ۉ'Ya 1 4rm!0/0z{_%xKQd~Y^f*_{wLP.ݕ-̳nCpHmpיI$%vO'hVz6=k!xZMrLn3V͎ϏT2,w9wĄZj~}[txiM_R+apqOM"K6LcZGEjv Lӟf2I64!L"Wa|r7'rf$i_IM&a߱a")YbtTI `p> ߔvmt ,E!ɗ7m/ G }َj"\S=ʗ DhP-s[هn *UU>c5S8#+WBREK.JW` V^}PiRyx;^offZOv=Rzi0zkT<ôA&<9Òa#^ף?+dF\~9-pJG~Tۧ^T!>cg! ]0zslY X7߷`]qgb4aH ԛ) @T|,EIWC0,kQ=wK>I}`wl!71U%B} i/X@GaJ[ >:¿ab&0K߲7{ t;(IrnLÔM}رr8K8VN/亓 w*+ ֖:|82PPi8UBƀzH;G}?)9y6ԗ5%jmCvb:j4T?!+oskq^8$!brqUيn$a.rZVjm? j eҿ}?, -IHyt;s n)ZLmjEA !\&)D(<w3L>21_jplm?]H_ /i<Q4PvU$T{w$K'%_>gf٩c7Dce9qۨW5\4m3s-M/+Y.l qHş= s9ރ*Opkz$nr[UEP֬yp;Y:>O7hl ^1 Yu$i7,0} Vu F26$NMȭL:}tn9L|Q5O#vn?{x5F)f}+w gOb]<fpۨ9*Tr. @gy7 朿 Y(Av}8VQ #/i^8ZOܭI\W o˸Z"JolWfjÜy3 e*I#C6!NG'+/8`-*FoYkE нuVPIZ,B{sr ~4/}2 .8Z^e{&&ْ}itQ@m*!LJ.0h k ;kDIi?d|[Y_H~oh,  9|^L.ȈF +a]KBI\lvX. ?Fl gw&+ y5YGWD.l.,CiQ DգFz9Cy\Vlt C% `3vmMv`r{/^E cY)A II N/:ѳkL~}3gSHGวl|{mlKE6'"/Mgk+EsDO*& n ۭcµlP.0}Jg@q节@: bRs;jL f¬m1}~U UC^ Cv-s%1}\% wObF ɂJ)[kk3:2@~dU>h4kui8D$a=P/P:bJO$ ʼnۆdu(.'v7Wv߷CY RsK*9+Sr#8,;Mrr#}pL&' .2gpoWKrrOϢ Nl%"'$H4Yvj1a|1ՆhGPx#$L+N*D\qKY sJ$*M7\)Mr\D+t7>xhy2O^,wgg ooIщe|%rףcOT`dlږнXr_="H[x -&T@BnֱU<)3TS"(vVeϿR fo0Z$ؓ ?a5j.MZGy(jXqu;c䭖516z Է ^s=/V!-]Ns&}6Ɓ7 ̖X+ T? K_;Qb19'2|"ƇDe7:cchS/ɪG UJ ^_ŝ1XCAѬ!c_(b҉#JzX&$.']G7BeI tKI =Xэj"Hw >{K+4Y*MF-_aץ7g6q]eiVPwނ֩,"f&8iXn6cm/cwP!wUOPt_ i}OjxG%͎0X ݣFJev\GMS>FQʘ!AGhWn߽4[0dCFW,J<*zX1UVƲ<71W-W!nTo\ cU P ̛*WӱZL2̺.|"šL؞.m*|6f9ܲ Y2iWvzCܬG([ \ylM S髁n,۵qwT#!m[x̖B䷹v,t 6ԦTtqe}&(V|ҋҞUzsH,! L>[We+)=(y De ğ3'1ef[1ziD$[7"+tF4CiԦ hd5̇FrEBڌ[wE#svՁ#,ʍ48PܽVs /[? PXZYay$[%^ J iF I3'WNz@-KEdE^u|4  V=Ǡ*(Wz AB'mX_nqSv3'+8)5Ɉ*}]32x\4MRv|Ӳ፸aNL=yFJSMϜgFT)pdEBˤX5LK2a6ҡ3t20{VB1!fwٗ$u Q[֘<͆aS1}t7sQst=J%W:app"4tuUV6"p2 ם}1VfQu਺S3''@5eϿpL?2W*o-×9j|ޠF,lxsq$0g鯵NUBLˡgVfw7/52kEЎ|hcu hƒ\81̀ t2?hiWgVTi{rWAP'%*E([sCMVѷle+Pb ~u&P&6ڜ 2[[{KOA숺*h–~M3P`RxםRvHOӚO V#DCHۜO_mf* /\Ĥw3Xk y nBiEKyTA)a e8m f=<RvuY ݲ7b(_f}H&#Y`?NA@o5|@ԭ>4Zsb\WxV?X8IeW ã$(z=_} |90P/ٜK˼pn'[?joX%Ym)ӵ\}d=8z1O>0F2vtY#lXӃJmuQ ͍/ҷB9Xw猗6^3*ɟ <':.OVEz*~D53¥rgGC6s%Ł2t=]7@0^Y 4u#2jmy@:coSbO/ '((aY Tg&1m=k^+'K`DFtUb?A9\:0hŔO>Ps3lGRi4R=1亱 E8!eǘbb 3QDGre7p0W8ʿ6eDK[Iw< _YExs VTs֩0^'ClN/:_Sr-ϕmed3d]0w{dP1rO"ex 5sUJe؞sd7jM%/ʹY9m^6l ItK**;1+!c{E(w -ҸB粙M4q8J[ SN=YuPN|֏}"D[omZk@Ƣ N>O\W=u-S: *QvlQ;K\X'$=g7F4@U{)r 饅ho8Ϲ LjCN Z)2+9ۅ[^V/uefxc/%R*gJ_A ethk86!b K&xHd7$[L% cux31^mR(Ƣs66׏dD9?>vG`-S2YZ_Tdn䴰'?OH\s=B>&۳wiƳ Z4J$ǒvyl_[E ny̢E$9ix)^'(l9m0x_wQFl1K Mī~![ Bt|SҺt/lv4;NBd($Oa2(P ܾ]!GɶW| ~( JiLA0Ug,x[Pe6:qA*W CVvAg9@sV# w$Ndz_B Xq\mf|q{oi=Ӌ3 VAT#=0BAƑXէ*ٌ+?l6Ry;;Z*rvkEvI#rMr3;[0n85O~ƐBO4*%Ko-a.bIcUwZZ|^j dC@jR\Fn$ Zv*" Hq -[SN]]ӸJ:"Cg _Xdv 4f &.Q)bUV #-Du8e`"{[ELX\[2=Dap$ĎZ<-Ń"!4$NZK~IǨZ\}:T&^"@ؼLܫmJ EIRSvb6]+7~k?#r3{ӕ7͘HBF5~= ] >jk%yG]C8P@FOA`qgVIN,l=ΗX%Јy\=)|,7s!n_Ilf`-^m*⻑_Mѥ5Ht$O#>Ymo"Cq@-!Ozh/SwΑy;]%3GG3탦2 Ni0cYYh mLl0"]ә]_hMŝi&"7eCad ZTw RP;B :.R'% lb.g1_-o` A/ҲNKQpb`.V[la:bwjx(oC`'j bAJ:RBzU#ay(,ܽAYϰ1*!|o. C_)9t<ݿ-t͛HEӿ~j`+2O孛.Lu"oӝqer3>`EPXp/ȧlԼ.i8_w\@UWy2` `OWb;0闽fuf Gr\ ٓ c]7U(o) ̙]}}qz,B}ް5KbꦃBi&\鎷X~AE j'kdg~a:mO};SGiVP+Zk?Y&o-F#`\P뇘`P_5B%8if)!uPu&_בc{s0, 75j>_bVU_nD!qe=[_nEJwڴ|>]3'/~Wpm0ZŜcZYQ/5-H҇'HV8ܽ(^ җδi!*DuY.eB&鐙@8Q"/l#6YhU$-#;%eRO<#¸>z t(p:kל!.vlb>'Nߞ`&I^`I!8!:7aV5q6-cM9•8V+"Xd0i&{d{]nד]"~ vYVkf Qk/_h,7T"zU@qx }Ǜ!5|]-9.ee{J_aҩ[;H>Y3)az~ c}-?)tRPHA㖏[I3xE)2x{{g=I|mAfvX@$kEU`=GB 2Zfk&E蒒zL|I2џKl.Sq1M@Dl:ʔ! JƤ4˃kр7+*`q9d L/hSv71%0Tz1k7Yq2-ޚ0 ܬȂju-$ =j{;z\=w?#;6yT,5[`G{{P`%~*T{}{"p*Uf}+څ3ٷRB] #y1O Sת['n" QY󫕴}t~P_Ku\t)f^!'ȩ+D{qcH,єc43\(?EK /cǿlZ&+zsZ+imNW,K3w&z@fgl􄁹kb6Ds =´ JmcUCSUݮg ytu_H"}@+Z*=AUJs L±;³nh,kK!B{H &; cҫX@);!ZS/VwHf*Y;l5_Z`#"X0܂d_V)W0L% |m8&=1G}-0"٧!ѷPa/(`k8CJ$%98ug,׸W ͗ %$\BW֚h"ݕ䋇ŵf"^{|(P1z 'ܬ GoH-,Qܫro]$7P (޸c M0T|{|H73}P4|gM߬y3wy$̋**93Qd <g' ` %ݟrf|I-ĂJsxբ}lUuPDA֠dYdXLX V@Ŝt(< ?7|2O߇3~o8nMr=!j:\?Bww-R #ߎC :xЗh%ȲnH'ƇJ_yVKJSQ00=[ UMF~fZCnM|7cSX`]<;|1vX\=3izs2h3m D<(g=C.q^}6[c6uqVL8'9rj~KeMqЌb؝8uC5d aB6hZ We Ҳ| Xj+u F%X.Rkf$jQndQ"ǣ6XsRX?˳Ӽt_ɹ:h(2P 92u&si>Rz]Xɻ|'ON0&Ct |(EWH?w!'=n ||fkl #/qf}>@ 4Gj "01* j}w6&@QbsvkCkQF9OE/w 6-6u~@H#qOPEl ~ل]څw@=Gx˱pQ- o~%K(1iyqzg1FD\ s*O JO1ĺ~-U:ZD,".Y!C7if3"3>+uU9s*.9rdDH@"0?9C0?Ej{ 6k1x}|3kG$9SȅqAw-]S24kW]Z2ž0RVX@1+ G>ة2M]YdG|gZmm?1ݸP|'ks6b1:Pȭ >9sc%>RJ8rwRrJJ{ߋӭ7v^,L3S1?+Z·3!ȝ^n '2 s:4 dNq() íiм7ߍ]x m/3yfkIF!nD#'k$" ^ nI߿ޝ[t32[{wqyG^;D\Dه ^Ix}=ɻ,?^yYiRq_$`!Zy=ؠw&LzDM>'ɖGTZʎpzX-ݽYD7BUm6l&  aOC{Ӭ~ ~ Ի/MOy~s|iocIO/5- Xtt^ꋝMyBWdą2UkqPmJ>` تhc3({҄Rw@+,p#ϰ;~cǓX)y(S=G N :smJ&Jrd~ LFUx5kGTKqߜq:J\Pj9lsWqm]RGr޶$\j>rl}y;4kRsn'~}; d"n۠] %syùVᗅAG(;NtC<k:xCoI ͍8\ v/f3@>nk%ս燬~R%}8Bͱ<`C l}waI5j`_ǔqK@RqK&C*xk] OmrASwb[C,y_+S]nĵaOs>m-ͽ-cN%e4nkFTr/=bi% MQyLM!IZcXw{˽ITD]қ~iTMg:%ք dz%iYRrikpT*Y=nhD2^&I4B1k4uf2M.6=Q""|*-fŝ)b_ӳ7/^Cl&ELxGn!of\;0=UiKlܝ/Mf{F[FYxJkpWF̨_Ck_>ev7GI[i O :Hw{Q_%UK:^ph?}sօOIm_'.yA6u'3=*N][Z?Ҫa,1lCx4bGcOU))sTJY9&8J`6}EpkZ8י{-=9ҦW!i/ }?a WdzJA/H1 NJ[dC4mtMb״=$)h3Lb}?XA,l8TccK&E_aD!hO>pVyL,YdStjZϔM˩*+e =2$䡸V5M,] Q[Bkjb]rϱ:FB @h>ICW,A7Rƹ+Z<ֆ=u pىR90di_S $a']j)9Z?w ǎ05'S;$;O_$[JRQmKk,&኉f og؆7`L?=10~cy\{A8/^@~gVBNo/VG0ҭp4NLdܗZ`s$5 0M^'j]@*֋jZ;f9:atukaK,{ ^&2Bx4NnaRQy}4\h|}ۮ׍+ۀuT+!;!~Ni1b{>zt# AP[P$7#X aUק78Uor`*^]GaVδ!nnRjc%-Uq79J5т$V71/Ԝ:)|G_)5o~4H+ye~>M]𑿹d!~Nx̚ɹ-[A5x,1_ALG"E,5PI'!̃$y]mq7W8t )OOhNY܀1H[˩HXLL ܀we>[e{ Tia/i;Ϫ^.iG @Z:ln[G8=!`΃a㚚e DvW} ,",uكTq?[+K{eqjʴc3#a{lڸ:_ nY{A yHبnCcs5m'4)7 iCrzTapډa%5 'f{ G3$j +O%GkRˠ0 qnm/ujBF%~wG#Zɑ+rCsUswz~j;RTrm!\zfxW|fJ'BCچIS@Tg_;C;pDwV{l" \ڃcw,U0a#ƒ@ y`@i䰣Upڅv׿4iPD1mANC kTl6[rIbu}"d z-‘;I"`YuI?ff30fu~bt63*#ز6~ƭ+ĿH#wd7j9<TAݰ*>r9n}zĬA6lЁjSHxNCU)5#C$k"5/^b̚^ª{P_3¹[;H. !V}m%.E=YT('Ji^fM{&mީ]_-j!.7f߽IGFd#2/2,/û)w-{㒈fÇ?%#ȡ7$ؗ zl/Q>4d[Gʎ13!y"+XGtHucPƐwY(Ƶi;'G`i  \$↠i[W% $wn6MC)h΀|4I)iIf2m2&djsblB[d[iBckUr>׈bѾ[EJ暴XO xK*b[3yffzC$#8^. lΗEK-ac[P l|Q"t#u p̨ 6g##_q4iBfjp؎5P)v2D٤hG n &CCQ89qL>jm+ljͫxݭ7ͬLdf{MɂГy-vǠq*vBwAl8]+xY^|:4aX8ͭFXe| xԮZT`$yD<i'v-3:73V7LG#N6(c/(k1ٓ= Fw1-(f`s794y51=q} 0rJ]7z0@mad e(HK/<7!T徹)gV?Rā=uPhӀ/ S%0ްp|mwUP\םc31QNv>^run|,`Q 6#TYb(ZdemϧQ"):n8}2Yi8[;WOM}G]ѵ2m] ͮҽ^|bEy5LĄ3;BcKL32Hbp^(+BR/JVXjpX?hF$ŭ/jU ߒSBŹF;CLS#?7xUSf`^$v@\ \-FhOafc>y8v0ҧ72u]au;|ܓq.oim8p}H-7Q %ߑ|@?xDFkZ1E =,>jNBAdN+fxWk!XPKVQ|(8™7ys깮 9ȹmy˨J|%hV 2ڭe?u&EnJjc2[gTYrPsgz KZBc8T.Ve_DKwMk#0h`29yoa8<5u0Wn4ZuGJ+izQ5B k_7u'6ե{ӛ[v(/Eqٜy0W?Qzտ'e.bF=Q0-TiZxVO<ce}F 0J4Kf[6k]ɢ`|bz3k)(h긁*)V75< 0=/M!Ӳ|&sYm!&%1 aXJVyߐbg"a4~φ`Zz%u?`3݆SR\~CG~x!cP ݱ; ZAidcg8;-*][iW:<yk@C5.03~=w܉mw;e㘊[ۨd_zkk%TQF%r Ɇ=Oe d*K?lւ `*)cy|k_j_|[F y*|x -E1: ?Ht1+s8WU2~Bw:F5I!9fb57Bf6Yxyn.З@M4ZCɯۥ$8Kv7fqPip tgrj3^{cbƮkw*r D%<9< á+ ҦZvYknJkzB /zg2k\%9r: yqPoۜ6ACds M%ry6f`b!Y8# R3v%!85lS2T-;+6rƒ(-q!:G>'ح40qrbFlΌ@j_ ?.S* | f ۴>ZN[`d`N4rﲀS)اBy`dķn4@7B[ՄֵYsew_XEh|5b}$iW+9>$6&":_1T%2xN`f ˁ-`\@݈ QGD:L5s8ϖZb]+EO`YҺl'h?Ӫ6Sֺ 䍔Ynf- U~HaH] YW@4-Ytpܸq,;v[:`ssMk[A8kԡXW1ITPnVF(ѕ!5QSL_#U?1Ōai< u(Bm4Vx7Mf. @o0>!UNae@EP nzoc&&ׯ$հ)6臠z~(]h}-/!)&\>BcTm E<Rf1#>B: p`\B㢹LJB2gk27x] JO T$@$u}[]ŀx@;)[{X< ">Y5ֈ-oˁsX.jOܽs9d 84JVs,e:6La\3>p7#rolZzDb#@c,@ϯrk|յ|Q@}WވroRujR j۰5Xg3 ~t'5Z'K=P%y-\J5@.mc{r_VkʼnUj#-_ T(>cɑ{&8=OtwWP6D߻_g nfM0(82% ɰ2E(ҵ[JS")˗? }xav0!cc?k58֍oPv%EfH݉_BhMр(kEB\K+YB v≲$sˣD2s^!^V`c h[ dM]Nq60;EF5ͭ~IHmH٦߲(oc`}&G} y*|]ٵWwBgX[ŲwltōiB_ՌCL{ը&&G*ub9M5߿"wVi}kwr5*/3@Dϖ:ʚ}\qHj`\8(>*PZꟽ,3qHa$ 2kQ~yTN;ӂjojJ7n[(}v]W"ax 7Z+-Bzb5WtS[,ŷPپ?PS}d8l\X S'qۗ_;t3ͤ V;ջkD-&XHY K`O 3BsIYVO$?XЊekatz@О'nHB| .N""1E^EҪI >]O3 0&ԟDYo=}G^fN~~f(볨Qa ]z  p5Y{hwȐR<\ld怭 $#gLe/vwq+Ts-0a/8nܠ $L%x- ZXe$7(A<ȽkR[4|%wU1uilZs/>+=|?]E&hK]8' [̾ӣ3̴C(ǬDFBqϸKc/Nf<d=c|(.Szd[n(>3LwRiyq·܇#qڀ\-llo&E4g 1B.X q/.Ma Kj=>DxoCj략U/5.)y2t9[G^KC i?emJeWPBUTQ "?d/ hZ\)߄>Ѷ)[[1"KMP?Ox/d&s#*dk\]v FK"'Qe4섦-6h0ǼK$KZZNU3_*}BFwF7m"b~L8ۂxxE1Mf$0U1 8bJ;IVN*Lc6!xjk;r-XYch07DI_* J}H/䊏b-ǟ>YqJh1jk `e\,>95sŤkB eЈ i7zp]j>ܻ& aȜ^ %qCbdK5LiyB}*ؘǸlCzbӿX^d܏כMtU;q۟I瑔h!7 |˖oYqְcS_̇ULQ|П7iqQX7坛dB/᭒$Cb\@ˊzKsϬ)͟ \֪eG_طymcpEctmypD";jyA)C"u h/.ȍ: %E6b~+tXּ>Lꙓ#|NݛAaqo*{s[,u/WT)~$9HpY9^Y䊩%BۓZB}tryz33&H"# 4Yag3 AzbԡBVDQY`ů.#J*'^daŞ=IfHXӶԨZ`#iE3 UF&U$Π >\fRҐ.7)CG+Z ɃWmڏ ¿ా? <;" l'^8l ޳y } 5,O,H"Y\ ;w`j+̨'}M%:#4} "r`c6/FqїKeiOq+[*] m9{yNnCc\E*7_F%{kP{:/hDPa^R&q1gi5n V ȎgXIk${=/YLٝ.ޫMLD @w ]EC4h) m"]Z, @k~gٵ/,[wuեL@ v$5V3aHƢzTN^W5 ѦU4;LWqcG-Rգ(ؽ#lآYq\ԧYYLTj<`Xsͪ؇ T'A[GW6mͥ ѵ~ zV9 :KErCDƉt3:NJ/qb"? P)Au! !q>b4?-2>]jwV΅NLת EN`E5ǒ9O9z=dǭ;6 T RDȭ=v%mu늻ZQf&ٿ$}ʻS22ܫPÐۘ(<{}s ㇪ Zm1KF ;ZvƲ^NZfݻwAh\։02dY" ^vkzՎM܅t©r b#Ak4>r",JdP:HTd_Tib.3+nc/1*&%>W5|o)ƒa3hLuAZ{+DPȢQJ >mEi|/v1/i̟;WqJJWxv-e6-\W%0D?~/4;눪# }m^z~ j\dyֹ-n:PHUe\8 Й7)ȥo%9TL#tlF,xfǺThPn(U#֏}lLov=/N _2m:ZY {\ʯ(lv\q͟N1NԊEQh;Moۜ+XO7S{C3)X4rIUwi>S2|j;/Nu9m8iw ouZN5x!жs#9[uE9\~8A~w׎!}CT$&dAcpeb15>lmf w|9,^82:⎻ԴCuJa{P \Gt+)G$iQ^WdL2}a&>n @v=|xiû5iW͗Xx.Р|֗ RTxZ%[ᝐY%#ƛΓ X+=݋'?(_Nc\ P)ʮg-WVwROQa>[B3qd\^:(M9= r5G+Oos -D+`GEnfr-X"$8 ֢5SM7:ΒUZLRyqx "^,$6uk_o,]2(l+ơz<쒀 `% @9S{?T[Ay4uL4M+6*$~A?GFG A+ ߀ '8x(%?ήr })Ϋ cS%te5TKMbW=" :k0&, K %t̞-zPb1ta$籩UM5[{CS6j@-bB8q u=PMG9dm݉cF!pҌRw9ͨt cS,&.E4Aw5a|p L8`aό#4._̎R]زG~弼[ όJ#pƪש)Laf}?|:=n;MTY {\"byENL&"/Ю.KQ6Rյ9SI()AE7b;rdItD\%ﶳkB}07NަvlhAn{m!>DeF&*ΥZiZT"9r'ʳev;jƂqK:>hx|n{H 7]9J _ҭ;䚺x};MWœ%BA dt4'J > "kX,l 2t:)VVCW 4 $ҎԳu(Zn\A/@9?Bk!!01M&Jmp~D֝X+YK,GW?Dv^?qߘٳufǏ ԏNuWc*W08,Byˆ#& sQ0U#h3V^!EGN@Qd/o'ZU gkÇl&G'" h2"y?Aūl~exC@,2r:ZcW*z'amY+ail}~Tek,m՝/FW4G yĜ?4öX7ىW-3>c:앍YZ1N‹'`E&;&`n1{PbN=9h܌6 @m#l[\͗Z5F jBxTLjT; S#E4:sȋ?uRr*['Uw|VX^!B3w27-B,aTrN(ryo`7wk%,A.ܞۯeԋi hذ2  ?R>>Ut^"p3" GڧQL>TӉpL1U#4ٞLqa=Ɋv!mr`peWwDZYda$Yw^J;*tz&Q<'E^U'e 洀>CYK!½L/}{ 㶅݊ݚ&,mFXpA]`aP$vSdžkWw??#WRB ])}C`$曺ϞM=SU'RrD&%M+DӍ<%n^t.\1Ͼ *:H$ݥt4ʋ.VCd؞SHwUZE'lé¡29j`o~ڑԘ:%嚵ݐ?+‘ExIFT-,oaF w2j}7b C3fGes4LP8znmGa}6=ӑ"(E@3XiNUYiHkǿgin2(S w⬡wt'+;8`7NFZSN㎲6T 6ۃ\H([ځ,"$sWoLO}I!4`[zb&iSDή6\1 N-^lw4s> YoAA Q^>.kκe.mlLe 1[! 6 z“4.pȀL0IHC$ K߂i0WRw$np bQ`d Z#@ dyTe㏥frj^l%|5o Ů]K셩4[7PMײv5AJ se\WȨ!}+~F.iCgHd%1]VWa\ oh~sNo?DZ;\)`}XX^7h i…ŶJ8$ip6LlHے3zQyt}e%e}~W)Jq˅lF tb()G3 *ɖSI䁬Lj`#|eÁCrϖDʜKv|{K.7-t!iIl&9y}Iw1SA"jtVH[0-:U@:3e:G!SariVSzӬ$ĬZ㯩[#@hmQ> 8*"`;i¿c;;9Qi'_Esʃ9?t807h5iҦJchd3_ַBЀyq1 vl(^~ګar(\"V[jWux~YU%uoy.V,ߏPmǛ>U: ^@g,K:8<72ݜ t{m~dCK@:KY:5e[e[UjD\U7]݊!$i;NghG L vmjuLC;9v4‰`Q]Վzrrsr]R|Mf/_>tM1SIkxvT|MvkԕZ# Kً5s0Y'!0,qЭf=\3ؠFrRXE `ݵݔ<>M_QK ^A@HArI2m_;alU$ ?up=&7C坱mdPWk ,*[h>v:CmB|oYH{;^Gڗp NՔ9c_SQyҸ91vX.ǒ{a%Z'AAp)ns7r:b&FC1Jm+dP Ci87Qv9/XvBWs$w(::LqGt3(k+wbx &N5D:!p g!39vP *:.$6r3ݤ~?hHHf OQN?w>lvqݳ,?) Eܴ)&r~H xuct 6pO M3H=J K+\ѝDXp#Ӌ*U5 J-UgNn=)~8Xxg) " Y̫=jAGpc5?۵[iW޴ ۬%~t^DhъAit٣׌Ȩ$(/c0Sl`ùvz>腠?8'B5pi'*/$-!D @HbRͮ˖U<2?.@ft"^vW"-Ny'~ڒT^ 4lV'GmCja\֢V6,'v,,*emyl`gHl4A\Hؑc5YHb̲cpqˢ KZɟ~C57v.`\ ދ'4T/vLy›:ҩiv^+pJ* {!j@sM̎`[!Kŏp-FXw#dW6oJ5Gtb9mN/ݫjMV%Ep飖U`2h!&qhvTǿ~&bKqP Tvrۇ]O9z3ҕd~.¾iGqHЀstj<@>'7(X"R#?k'ͧq#ֽ}ՙv -۫9'?} qEMq.RDMK4WSoԠ_"Nj<_6'%=ry$n&ER!WsxqT$[F86FG_,`5[F2X\(rK~V xy6NyiAEFgY{1b2Ư J0fvPsXW9騈~(U棅} wI2[S]W[=;Tl|[3 0lzǵl!#2qaC*9yɗ(>lPhx  З07ĺ$j`׳|[qh 7`lLx=HupH^^I1?'m/]@8n@Eޞ1=w<[^8{'utW-1ѮoA L wp 2 lu!M ~p1avyŧfţS̍$ԙteR{ ֢IW 6~EAU {BaOOƂnqۖ+|Ga{<1'mͦfIxFc&4FvЅuVz4 C)^Dn:D@+2?xY*V腎j3dh++Z[Q43GE%W-A5RucX}rӶ*4x.]7E @*83:FUiXz`:}e tR[?*Sm*xYALV~<ߋeCAE˗yxFVٲ|K:?|RogP5OlGB};+/M1WVv0NAps|ɏERf*b$u Кqͳ7"~sBr Æj{y,[#.v*}S0fR`̴w -Jġ5/7*ޘ 5vqPyKIsكEފy7gO.U~{*RYʓjˮ "XXh]*%jAۑ8Q.i Q6<gb{t}@§Z=!uMB( 0j`RQ|Ε,]Qz\q ޟ/H!DU:z|u־;Wl{:"SYٌUYi Cv wۑs@M,"޹\9iUښz۝T&n ` aRϕQ'qC@2CwιCJotz)4֭ P~pDR'-fD=Ob¶'1ޘ,^D3/2xil%)m$d?z%n`3n%nT%?!>(Mvg!+ 0ZX sPiȥ-K7bf>**9%9"*˝yGi`dԃez5NkwX@dehR`ӰH,7fc}fCXEXe3GfE=BY=ȣ.sj%Qo l//9.e{8y[Q_/o7 BDpTx'w5c~7l5nG1y_u֨.8'0Q%nh\+JUJI}7d~UkY4,fT=ĵIM`03AD $륂,.e.J<2$ML՟@KEO1N𸝕ጶ@#N*uɃI͸4g`QI̶xskݏhW-.r҃7%/Tj]?˲ns.fa덓 .T% —v*Ԏ#ѣY$r㙴,^L{L@$Gaږ.d/ &Zяeҝ̶54P@ܐhTy>A`' Bi u//_badC&'H 3"<5:SiA ƋU9stY6V_x QٟD.*cBg[}DGSSE(m 3GZR zR@ H|'{,qsWBU]-Yhf 3-Mr<ҕT *)q@:gJَ;+<1~do\@Үvs?rM0I}[vDr \ y|Up_V9N?ZR w[ۭΰNjkj%QWD4+L&8]e:'qTFZcgnc{Gϕ>@|⊑hj?׳;+s޲Qkx6)DB@a7LKcbP2C3,X@q!z3O՛k|FHB|KcA̮tod≹v uw.5X[ k˛r$$bQK%9nr dIc]-~CK'n{/)D)%^'\n\lD:4HxOڣC+{/Xt#HqRl0$vH _]ؕsv-=Gș65q/AwNy+jϛ2n P\d6: (v,-~BlA܏d_-sl.s|xxʰK5q\TR2pVHo[i(]}5(94pej UV, ی1M,3Uv9*;kAs7шRcgP3Hو)k׾PSR+`⥨HncsG,I{G#'`Q'52@Ē4:)GM i0 2%oPFm))}TXŴ0]eg{ 8G܊Ez\gJ8,EIBI5ssH7:6F9JW#Ǿ#)`掐0ȱK>3Ul41. o`߱vdPa Wi[MA JE,r,ttфMM9>FSK?[edB@:)` mD{vʄ4sp\-$j"s]yKRm6 ,[pީ4Ԩ'i;ek,_QX* sczخS&e:@®KH&འEQPYw,DHT?Y0r< OdDwW6myޠΥV,ђ˾s &!ǘOT|-26FwJGwV7-d UI1X;0DZM !5,rXjx. y+?p-<ݡ|EM !;5գӨJg7ֹTN姣-9Aķۂnh9G뉑+ǭlH23r¨dm%}Ja(aӁܟ'd#$\TOJTo䅾¾M?÷sbF~ǒjɵ#OLP{nj4=\dvp9EN~SH :с-(LХ@ 8Q˷cedD߇#XdLOC u5"ckg$Sc|Y܋rѓqݳEvY+}`-&KИkhys} BCL1N^#Isri_rEc2S㽿OӁD#F\GTQIG>x#TYX"Fs'ff Zc]`CVWN_cR~"Vߐd2rj۸B~xAkt`{FCprLv,Ϥ7ԃ%7’ZHϢYm`lG\Mk1OJ,5;б6*0/ߜB'O/9tb,5N_3:O]39e3R5]UZR'ż5>O)dv~;[i(zJ1.lAcܤFFl{;F8q@|CAWECSqj6R@m J3ȯc%)VdA@.kxQ% ϓ|a>l7e*Q#e NuLy,Nqynl=uHhS5%fcLBkY>TKG6sl-ԯ ew%sc2]D)|4+<韋׷$!K!ʿ: Aky}ㄓa?gg8础IlNfW1^p@jiFJ2YׇksD({̾';xfğIhO3/*(GX#Ap,ETiK[ DrLuyy(?USz -Rj?yj-KkfZw*j[»}6FQ75ؾht7.܂Z$ݪmY=͌w\ʹMus=D0Hi88U!i"( IK:?d[RU%~RXiAx TIdlMjpQ]S"u7`+Ql&ܤK OgQ\vh 'ybgg)L9={Q{Di:6Ŋm5 A_y*PۜrW[ Td!9 K? ?BEX/jowe&4P+N*&Lf%&>hK'A\;js0d tsrvS,{wʽvp`c$Dd: GBH!hnb˳k.~Kǐ_gi4DZ\"Zo\=5v~{m-3cY%X ge.0Ǖ&IOo%) "r?X"ꨫ|i$D.!$bn{[s|ENL3ٯlPn=(9'i*O߳Bi=A ^Wm!ֺgj&Z F2LFI.RB;FG fpE@0ѧQY& JhM Кs_szHN~fUf dRub~,%)u[JA{=z~ƛԹ,4 #O빫>Nr>՜ly~1·E^Uw/Dz/ZzCX,dqMK'lDzwURnq뜜Q=g@8=J08r(ͰRIZ}!?YaKXq[gkDMd/90c1P\ĤaMH #=Gzt`^TsĖQДN:$9%PIxBSJN:: m)4͒f9 &'~Bd~ =Ɉ`7 Wt9S(HwjVH,o*^He`sQ1:ߦQ6Q:s\vWiɭ";J/bDßp޸@cOц2iD\,;p&'fvu9n\iOmLip?aú aB>Lث {lH4T~'?"QNlJT艅xĵVB޶Y8Bp:'JgCxެ[JG-+Alȴ<Y$%ޫz/).k)cFAj36 OYhhpݛ7ʋ57ppUO4 @8{U3Ieb{$@mc^0샛yg4&I*Erc8䤤PjaBwG F] ;NoPBwKP]ߐz{lYN<Uzf@ ncAWRNQ U?wZ..'Jlw%V*&3HY:h2yzzmS~%͛Ohw5ZtJfjve4(TE]T)>E qh̩8nrnn&Hj=nBJeLC04eI.4#^lY.>{3shE.&hC"e]_H>ۍbTuY7q(0!+٩Ƶ4'!4-wܦil7|-.]= 3MRsGgGq?jBl6֥Qׯ#b5bU{}xRM8 횊hRZהJ"&3AH]ᶥ2 _<"ѹlGEK#YmXp'TT#X0GI&\s)5]=?r_5ѫVB 5V;=eIe'(~7u qfa}0,YF7N+ܩTc\@e8y^H|H&cܘSe/YuK"H .^۴;{1k*UEmE>?J2:8mx>H>꒥}#g0"AL 0n^#  tY/惖o#S&MAbɺN=:j.;>9~:G0kϨf2Tڽw<vR-SRrR-QkkӅWY鴖-Ni?IkME܆#8+ j >Q„uS'E/׶R=i@-y.T:>ArU"|ec;S!ܭ_@!"Qi /soq Ur:P%!nϜAdw$SꑖQCyƓpSY3:&A+Mn*2̜!h./OͿ5fbW$*8#dQ}NxɍKj?9A" uefvFx)B+LZIն(#lxLɌhѪArɭ J_WZ_?qNUǁf';#?b.yj98x` rjE<4f6 2Շqo|ᠯՏ{4QnC"`G ,TфqE[?zb )0kQ0Uy+1/ js|Z旄'ZQBz=Io_T q#_' } Ӛm4|9ӫ.PJe?bۤ/?u_5u IIC)jnhSٲ8$ͤcr]f>JVEW(\W2y^UCK/QSrV=5\fXEVG \B4S3‚p+A)F E` /d ,#"O[7jV`l iG˸GX-ٰjyU_dsx)%zLq{Y1NAIq5{>^)qXDH+rj.Z5n9JrNX[M$~qtZ!WУ/> ~20Ɏ'D5(SME@< %DhJsK]ZjF\eFpz/Ui]c""ǴחfjHNr᭑J33yX Q%Y paJbٵY*!)(i6Շ[t+<,S9(JcL7;VH[rY1-?~p/t~(ڔlaeA9^q =[r#`?d}.tZ5E77UUNu&+. KXP9-N.l;|Nþ/ >&[!vy@H.e &>a11=5}6Ɗ#0 E1Q %rC \zUk-$B["4O/Zy(KVmCz}eQ HEz# ugN/GHtʅ%4 ]zH ?z~=^+Gu?_SɳrY+A~9Nz7YFPډuL}L뚎p5W}-lYBSB:LR2*xIaEͭ5'2` a?_ƣ~w9nB!>3ͳ"i_#ɼH'-)=RZ~Q) 22Mt.ۛg" Rg {^B(ox#D.>D3ovtbzɩR eoٍ a *#-:Lm f]źP ʈRnyd/mROA/yp poTTyڼ<(BDFX ~#=[zqÜ{\KWȟ`̷-Tq|t3~cX ^"}z8ɽNE#ӨZ3|޸ӎ-h-[+beLἭB|_G+Aݝ )Ulh㈰B|}$ܶkF UvA3Bd6oyMg2\,j]Ms驪tfK)%oqO t?\͖7"m1>4).%}I(w #:ϡmSnvatFe&Ϝ?q;T (o}k6v':c0V9KYLzT3 lו70/DȰXfyk&MYmMquPi`KK1qP Smx~O?.ʀnuC;$ d `rRtq=#GAڔҧi@Μν q2+l2"w$ӭng^&H[y( y/:eMl@2%m]96\[IMיC)4&+"ʈKZzz,äF _Vg4KϽVH}CFH"sG2?4$ b;6JY0'$90&hԐ15Kl| rV]u3P?|&z۵d+n{73IAbdVQY rӵbZ9Vgmm t/(;G 7o`g:J"Jq[&x4 GrQy⬱ 6,$~](ؚАe )H-#'ϋ\۾kjW.q:O(1mLH z1HѨyYp ]lؓm4(pE*n/(_MzͣFh=d7%:gX^?6Vy^7y?dXZ:@ L ՓEjfJ"4L[n}9vVWc|͉`^G}cEbJJfYEJ%NZdD^(vc}B}08EJf2P%[5֬1궔2S+.XXwM`,Znh.B_QaT$)i3ϭBE|;( duIAfU/,&U/q*c~|ae1{gd=!RG<z;#=*8DjV%b-5\V. c_t-0chg?Ir6Uig(-2 ڙc\ fonpJ}ٍ2%O!(pGqz\FS ̒Ź< {'lqx5-`}gl>)2e:a0RvE's/ +|2?pLdpbZԮ}mca$V4HAʯ2+_OO=% 8W*4dNzt+ԥH(1! ^8 UE$ܵ;Yz!ުBjйf̽ĸ?*bPvf̴[vAů\Kr^8 !9,AIk[ aCQ3R r+ nd$eWj4.*2<%4 nx G2̄70ws$9}\FR:;Y}v|[Cb:2&ZT[hHFXybumcfu8#>, &<xH> n..COMS,2$ +͂&MntCx~z6CfUy.1# 'xK],R܇rSۍRqyaPo( &QgZ<#~9{ /|Uosd|E'45dTj=A\14݄#q61'|,WtZ|ޠ1-ϑC͘F&rQx^K\OlenTЗR^w :L(m~ܝ@ ij?8ωzy7I!}?K= LjȬK)YpGqYezwjlV jdD- C!^^b9:[/f:wtJsX@Dk gFhFV1cθd c/2|yjԤ2>nMlj:m|EQ(),c974?`,@OBmkeYSw>s%Xl7SSi3Ls/@ ǎ43'eXu^qXU2-iK~Mʎ(;#|licԎn^ qBQ%I$V}vwƮST~ q$5bqKUxB4 (uD(]5S<%EB@r`:K(R\=%<Ç_bi6x]W8ユQmPƑ{F0zjmDl@L';r?tbh؈ʜe8 *7W ibXZ&~+$#K.Ʈ_/w93,G6=|z~j10-mjl,#>(,)$̮ `kopcɯ[_;۽8݇)&2 En2PMCwe*eHEnda]+6w~5g A oڄH"*DToo 9ύyeme "rT!G5pW 8GR gVпb!a!JvZ:-bۋ},[h)w0ً.A'Wf>沧4#TO&rNd|!)fG IJzҌwq*hx E7 Fɒː7>tdJjzBp/ÛS.jrr.&u7$ˀtq~Pʔ4%18Uxmѵ.t]Yg-~"A,7&ɴZ2yM; gOUwTZEX@ZG3| A^lWa^g O\I$SȄ& X,<671nvGt "Eu8ndy$823}v2NR%bQSϪ+#jckdk"U;3qeJ2D:#uHwL5wpBF[I@qu} e/T$æQPj窕}}#5h/TH?)Σdb|>t kj$~z'TԨW~p}w  x*jݫnzvbb5j(BBY5)#8C C6xAe Y{ f81txTD/- }y7K r`rI& .!g!@:TK3~*M?Vu˿y9n>)C7(?ԋ4EV|P]:1T` <YLTݭ_yN̳ZA> 95OL.@|]MBNA'" z( z< nWS^۬}X|6 oJ 4r/>[ [LbDb%zІPjl /0Qr'Ɍ)|MUAC"< k0~\$.ʞXvKS}:Ǔok S^XO&k=4VOPS7TسQ8O r6/b9k#rg3!pT.`۬ec -]ivC)V쟺B+ KDyqr@9 ӱ?yAT߭kl@1\[mWyDEC˒|χ)wdp\}s(2g0г8 ӻ l :/6y[0RJyGNc8~cHAOHdz'1Vw$ʚ^88p QCdQS7@~e yvwx&,dHڋBh] ",_ɨjB>gy79DR38f~h-f6}5*j Ԯ߯sM?+:'lH#zvk%: Ø5n\ rVw$br%!.08TW.!ag`ʛEYWPB0dWZIr|flu-G /8^ժ4d͔XD'6U 2;/Hj80'gfHթssMBMţ~}O< )bq{,^-m(Xsa!6m:/`+ˣIKňU%؆׊)͊,6=Y% srfUGCxd~8kQ5уuۂ+0W F) O;mtJV,<6J SC\|'3eTn -㞳|Ñ]ŊYy:({Cv%~ΐu-S;ͮsK"'Qs@V[LS[Jd14wD~6? m|iR, [146Do#( W}HD>jh{"Q<hp:8<[;oOJVFʨθ k*ySZ갸a>xF0ModE$tĮ">5]T4@{70B汋>G}LRL٧oT 0a(!PMm?5$;RN'r/&֪TL_7=FvQ]2m'xj #I;C_nM‹H<2 HȰHXDLC}&E6xN^Ab`;ETcX~S*D ѿʈ`yz_+t#ΞV2K ~ܜ ^x\qS-Pzh|+OBq( ^*ncV C. ~膰B\`!t엂EY7o=U:-n-S&ߔ38^~7Qj SnMYX l+~^FҤ>F2͇ĦH\6/]`OIH0xl C`9U" 0HFWMMpnbWXYEIm!P !YaZyI9  "nJKM:2 ^ٱ&{!hx]n@LRr"9i yEGLZ@$ӑ50܇kgzFR48do⎝,ea,xR섉E~l5J4qZЛɧ{|]ҽJ'f`blgR_"R/c2'8vUi'LCAٝmo.չ#ԓk.0dfy#b.a۶!fG \ qz~um)"T 7ڑjDJ.;67nMCTުX 8Tv@$'e)|^7`QEbdҨWDh"/ŅseP]ynb\uM@rv=?{T*Aa:i_h*yWډVy_w98吂e}^m5r`N׊:[;9:hkqR`kuJ. Kalgſ:t {*b$0 EFM9Oߋ|lTp#ej1!jBCD0# EU4.0 u^?@ 'CmoD_SyL;RJBnE +vXl)S!mO[<3ݞu|.,vEɬa%(G> CB>R&Oդ'͉lǭf1n(1 <]*m ~q1r +'Fhe.48) ɎA,SKy 4e؜!%eqt磗hL o+u ar2"@P|5bk!1yH%P<^z)xG^seHHjL84-@o/(SH8(KT*_M :Cg7\w`&x.܉.e 8xkwYÈRJ##.8_3=ܿݽƕ|3µM=V l#bRare[GeI6 [5J{ nEߔ[[Y 5s^|UAޏNtѩ'q~,|-:7vYAOҶ *eJ }h.>Kƾlf po ̫y@mއnj@JɾZb&`!4⿏2K\mk0X|NDUwYsmLQedS-M*= *Ѐ n4 *|nJ 1/fcFJN!B$xmX ^rM,M~eaF2NEQ_>i,?"Ə]гZAݒrwnވ̆M{aF(۷3 ZoA x@x:qt{F^qNߐKZwѨ7$20nFk,dœOG8+yz/cb<+,:T0*WLYN> )+xYYwP5uo' [&R{w!#$[q5)}a%"[3T6ZgʩquJ]oCj֘OAXS5@lS4A5 g~2niN;;|+kvД9x(1Yt`Mqs]i_tÓeڔl?P{)}SAHNB0^xi}.ɗe4(BUU|u ZȒa3lt;N-kZhHY1Wdu~(ɍ=!:wĽPrEӸ#C^܍wx۹ͥ ޔR(].K9_]~~1CYU(Q(ONb[T|>6F֛C̲RP=11R-YLR/)L˹;Oog:BWVl U>aav)S3S kPï$J0(X~Az2 uQf"슺PP8h80<"3p%v O u9 zeqtTzWyAoDFS(츛R|芏׶!SmD C^>VyA,5c*e \eU Z]C|q!I8RBBv6F?\ԘX;]q1l?o5K:9"tkytܕ~0&N-nZy@~U+pN^0nR 2L^sQ<E0g|7\)>y!:7Α؂72)Sdhʄ?e(ӻiȐ1tZy)ٱ^ݴeiepO2kDʲwC<;K# O6Lha#»R Nfk'eJ_*cGS\U(p>0b yw"S_dZzLq,[K0N| %łK5 9vfz84ڕbB.O&f,Ivʧ5x0~'PoqMلm.:Lx%]=PJQE.p&⋅aTQO? ~ ӣjMM34<ф'W:/%ZH6#Yo.N u02} Ck?{ć:D(odv}\5 gL$.XYisN#wVpҟ`lvAK+kZ#˝!5$,*gUՌxTfHہ = @: 6" eT`0 2³FF6얺9!ыGZIR.\/nYMN[ uRH\lx΍?\ߧîak{RYv薕ݭKRp6' P~ܪa.76 n {*V \ixw?_=ͫ yU 1Ѧt[%C,yǛ…f Z#)PVHi8]uǒ05A y(@# <J}j\Gg5G`(A:&Q8YmT^@꽯wڞ͘"~Q'm]z+ĭj!ԊiO>)n51);ldzϙz6U3 }j_!71<OcU!5H= =dQ3@$h~PҤxϴtOAvK3G† '>X]`51\uRK} 1geh?|^ufijϦbSC3'|GҤгH9x)͝h`YPn}RKQ l*K?T'd "qJ8):63@dE5̌g¯ʒ #LG(q4Sujȃ7myQ*-3"ĥ)u%˗8"Qc^~X!/0)[~mK<7{kdog4>%Q^vv=Uw SRS [|YDκ$TfT!9@ JEgU褜љh*$^1!6B}nԬfթ"[e"k JQp$2 |Aj-V#cU ^AЯ@&wro d<毫FG" d*~ ip=d@Ϛ[5dp-e@^t6:Q:# li!Fo4)nhaHT*.{˼8AN0P}=//L[O)FXgGbw5brl8i zQay!Β5UюuV5[Mӝ6Lu~F7 WlɤI-r=GWx=[b$;U`iD?3T1y%&g*t%),]oAr΍e_%,ͱ wy7M!6NwޥHw`2Pz;h3(͢O#Z }qQng ܞM$U`3GZ׻4_!8JSgq1V|%ݳ3$,4Ω)`L0 HQO%T !^ ֧0 =p1ԓbE, 3*H,@?qAY ,Y?GC 7N%w.5E8",*X^^vJ]U+M?wV`R jU줞1.c2AF=;$iP$~oQ-nT|hb):mgBUBu ;o`|/~TD ÅrƊwnIT0U{uHE_RMm졭(RKӂZֺI;VcW9n_/2*NPڵ1>,7e ŏMd a o CKM"bl%Ce> _Dw-9A^U<murop7u4%MxV *@ GaCg*U9ŻF' ԃ=Th1^!6#mw3 |D 4{7XCZbЪb;ɷQwXD`IZrpYn $̐0 YAXJ^V ̞~ R!gd6aQA*T)Gl~OE[Id4ĝ#Xr#w@YoS&"~CűX[&Z 뻯ˊ =Z@ԒE4#sÄfr~~*޵:CؘN3h-E[ʖ9'Ydm>%8|Gx*.{߁9yWF- \ У Gȉ:Upōq' oP/y@P'&#EIvb㻩zZ؊&㬁|Qe\g˜9wSʨ/Yž $ ȷo tpX~~v0ZR3yC1X:٩p&` ä| <'b/-(ﶭBiƏV} ߹RSl0s_{T7]L~L`p)ZfF S*7(,*5bqB8:PPIa9vH5+&V).v熼AZR/UӸ[>5e *hKB"FCi-0EA!'!|MKf}gՌG)}^H|h! $671|qK)JS46. xIJv R>;ʧЄq`mQZ6vpZ&vJÚS'5rɓ[JɮS9b%TJ s}1ɜ>ΐ! Y IXV$kX:uܮ:{#]Pu\Sӭ9޾o6wŔ㍓|1>H3ˉ:4C^uWKT +6Ђ}LYލ:)S ʠQW(l^vDk}:{J('/^qzԚU qD"h_uV7ICV4҅ =@!5#Qd5ʶb?' }U,\Ծ)pu$Ȟ}4eGܱ0١Ά8]e9$*\N›ti[fN Iv=9g:|L}w%q%}W8hRxȌ5cE;<8;{ eXQ{^s (U?c c Gѱ:VaQlL$)90c\[xVGXtV PQb?酵u(GMbq )`'G,HM(j~̫IA]g /I"BN2K[ū%N_L, L[- xpT42nȤv3(,ubY/ԨOXی u~GZ5sS6ɑ6wԯ'y(|Qd7bCc3ԩTh =מ"heFyfz%dVe8j(Ijjg&Tʾ e"HjNYR '*=65ı,c#xi@C7s 6Cbv̀mYwI:pZ7UGN 5)z51^ZV; `_'Ѫ  G:5tFޭ(c.umN$iB0+e_t5]A[ojp?|皁Z4b.^g!5˽w"Q4t18#}th0L^6?S-?IƝ^I.\lSWPpPMmUNA#U8cEgd.b/yB%eZf^k<į:=<]{hcE/@{ly(_!"uAW۵fPw(99+z_ˌ_ 1.[5V-~IrH0}BѸ'4c[; `_%Skh AɞClBey³nqH%óng̕O/E0V& `H^3li*Ԟ<(ŬH2%g%!6LcZ7Eu!+nX8/:JW-{Gvg6wҾs9 MTNH <9;\0\>{yo!F[,Q9[hG|)`=ǻ(rv+0Fˎ翶M$zg"2H)\n9i625,Z_& =nȞS2{_kB£pVx䓠FȄQtOlA$ŚL&ru9y18`y:4]fL2}bl^=s[Dq-ratcݾqH}D ˟џ^P.{}ab^ϲZiog&Pykirvh9sh+jV9`9E:Rp囦9?BNe:2w1,pطH?r,>4ӲN+ ^6ew.Χ0֤|r'I`ұ3ec;oЊRikRӒQtd<}xHDI zsTpZ^!)ML9E?Omb?ޤdVȘk ,gU1lp64} Fm^VSp'P1DOV 'p*k.Wy\M=/sɜh-Fx? _ NĻ弃߂h3^niʀLN+#*ߠjO>%ـK[OEI=b'3TS)sXp]K\Ϧ%&3pC0t]5sHu459Z-3{@K&OfoKkPYUONը`:56~7;jF58huz'W3'~tմs=n:V 7R:PiC"}uo]y`ZV~@s^VqqR0Pp\> dJ0QV01M촟Ƃpبk* JdgAA<*!b8uAv6$_Fs$su֭p>Eܧ 6oDo:|@ cEo^<,+;lξ*~9- ]Cやo4yYO_AOy4a^u88xG삈'Y|ٸH\hHvu\FK;iӉ`SQ'd\Kuj&X|!hRi/ UQu̶YR ׺71%?@'[Qn[Ÿ@8j>[FF }h3p],I@YnQB@i g/LcwGq#HZF/bͩjR*uծ|:o@anR )2^Wv? 4mAv}%ܼ̯kVlȼ{f| P .Q< q0zwH(]H_e:m|dx=KEs-FRbh=sLrlwh1R1( }DկܦG9b}j4 E10ΟLkFw:vw-m `R@++L.pjazat{7rǫĴ%;ZU-PN@a5PV9EOҦR'LiF2$ʩpp?~D!DP F^!h)cdZfxUPh}T֠8O1&'1VFPWwl]{?]=[CEA05_,C)P$_0;`X=HanIgi&0\8"Ջ34K "R†قi\zatG-[IC8=>|^Ou,ìsX?-"c}w2pZJH)*bOQE=^2Pƞ)*/Z9]UDE?#[ *lH~S|bU_m˧4]U]U$kA}ۮ/f.}ƸН3FGv&G2("pkh=p7NxNV=<3{cWڞcET' `6\+ENOyJ" lVb rGuIV}1 &I5-%ALlcfoUiʄHv_jaeB-RkC}FTK S~M_nF)T,TE9:Z7C;ȌsVr&ͬԡ-4_U9 Σy>jtr2Vn_mh;.~q :9 wj8RM$GX{"\M({C^t?"ļ$[΢3-c._ûEeD!d4j$_im -+cJ}&W:F|zqm.!zN7miѭ#J8čT^<' .{=+05 ṩ"^#MAjcp|WTA{5odV#vqSlOv$;p[ƄvdQﱠTƙ&=Q /6!ă1(:H]2sZ}[FZP`b@]\D)Y6nDψL˽~Ɛ@2k&|Jj_,0'mja4~SFᄲ5s;%ߩ\=/хtg r2&a( ˄[.v9!Y>u]?r=KF٭ /WfJO )ZX>[|ԧ;YS\r' 0)+~߈x?.*\F8^:HRlApO-\uMU^eֻwoqfU~A&{HO~11x:RoV!ˑ|SQšl8I5*K)HĆ:,:h xH|f4d2PtĄއa!?҂ӤٱHRc~?G ځg ⷮXW'>+4%gqATWW3St "K ޥU}SvR0ùQ7@v!HEWkU]et\L m ;#n )\rwU>D#G81"?:w}K8&AgOW%CC^B&}"u˙߇e_W)wZ(cݨDE8g[2/6|~4% JpSz M$bKK/*2ۡlauՐx.Leښ#NJxj .wUbq{crmEg{̇IEӽkP#\DNyau;9~vyjOXˣCX9u^Uo&uf+:!:e٘#،„ elުxL 4 Tv"r~<6qOY=xK0JBDd3-I0 z6m/$Y̺MM2ߘVNjcKq5;^~8tkqv2JfhӸŧ=E >Ft8 <7!yIBx[CN9#v@mC<"BH {,2$H(tć<<+*wB1 Zi++t.zr"(:~ӯ@;eh`IHj|)wf@8 6$bqzM|Xpc}g\lFUA(!'E`yS>AԦaEQ*GqGś]3vJ(̲sR]_]"ej?8gyD b.۱4iQ0)68 l%o`VsW+?X h3PBaFua[EY1[NQ]QQ 2W֨9¨ FՄl^aJ,=tsP)ogH92~oqpMll҆>8xأQhLŇwph7p+mcؽBς ;,4P&av7e[ qaN'jYt@4ir]'"^WZʉDiQuʉ1e莦LS[sn2|`>aY2F~ӟ 'ɜWk|׹,DTR<$b_ndj1zaW[6{O'Ʋ;+5.R>{e.BfAݡJxHSJbN= RuP.xfVSA5+$KqDy (3=Z%kuꘅN2[oAK@t<w5"m=|bsi ёUg|Yĉc^6IsQIy*Ab܍kQ4PB, Ig~8<^6U=qwo5-;&&w*uB̄b:'tXX+fUr@^ܮ YK, m2{EZ7#^W,Krl{CԺ|mm$x?)az$K!i}Jnbp3Ԩ^W Q8o4֕ypMɬgKw]1yxG*%7tY_{䪎SPB6&H1Y;#[T|Oea>?pbx!:Ci?KnkRVl3"˪qBUYj6,M V xS I5AE M;j M3 ƶ Fkb B^X,*)1S@;$y`(eSM{9:3k8'ݩ@..CR˛+]6(A6a¡,ȋHGBδtwbh){3bnVWO»htIۛ[*L3]S7`\ &$& u$Ǹ$46h!>|-hKjhHʌ6}HSE83b҄H,DDD,p_P(DhPq7C0g\yXRԑ&Y!kaq3@+=L+g| rhOΦR1w(a$UF b'HI-lS'](Oጎo-$VW ܘ^E!J!Fl`T7(9\[&C-0c0J]FgAv(il.1h5D[3T ա",ldjHODFq4%c<}}`,aYb] zA'b֊얓4 aO˰ B&;? 3.a'/6-t]Ar_e=HXB}Z x|& "ocڮztȀMM3Qrk7B(x, X8P]BbxvŧO6Bfoil@c3D6IN*@ ar hzh jd1y2jrsIq#Ka$0wIu^E9B1:Ro4~{CK%aɟJ8lPslfFED4y.#HL'Б$ؐu~D>m1CO6dL")eFP"-tkoj hi GEs Ci7O%cfu2]4.Գ_rOT>]#bSː_yۖdez-ZvFqٱ\AHYcdqo'F H`DYAhgWLp;,|5S ~kѯi?m97i<{?`4([5q:`/.@ZG74`@ڂN5ÄaB_XT' Ebę"υQ5䲧0}Q ;m1/sMLj=&W&^i\eG0NjPt4?$+=kAh{鈯] hSR企O geJ2G_0꽜E>T1&(z{NzIiaMЉQZm5M6q=c0]wO2Vܲ&%4վA;*}&&T^17[*ʼnkC\Cjn3a ]1$/} =̃5.?6ZG#m6Ú~Ɨ1gFWNIZvJM??zڞ{ڔ"{n}NKψ$";!ơ>^̠}P/RC'Ɗց0«ؼoՀo8R_ lC}QVF@XbB>jR`8BMRg$ ߇>@ϿX!X8GDwGˠҁ?~r=5CK+89r%-_]aE""c0MۨAQg\v+*I.'C>檶c?U+Wu"'~'A-1bڌLӋ0XMP. j7hq7a i!lNX2]رrp?ur_sJ'8/f]G9k鴵/|c#qxN4F<:g- qqlõv}'|O^_kv-],pvzuռѪPv KwUDt}e\V(tZTڬ֭hD{>gW`phnU@o/4v紑\aVKӰVw>|>K;ə}VW= #T^ 8 J`oۛ\96㶵I%#x Ѽ( _K *UXD|-%'d膿Fŝڊ"upiQu翥g2:Uc`pzW^wǃt tMtso W f)< GEGWDmbNy5ΛANJpJf'^~ORXޥIyEl^ 8wWBK zy; Â2( +W?& 9\^~pp2=eFbBd{?uH/~Y+H\FI򷑝]ޙ*X:LNe*b[GdG{[+@( +2Z=Q˯s>cOX0aU@*? O4aa:9l/Y-h4'%IFSS:\svZ`u; EV w0ZNu-1MzIER" щ^i#_1 AzR ˰<C9R[@4.xɉ\x9r:3#D3UM6w(wc!XD2c1lH;kWP9-<>=&-#%Q?ͅyYr#䃲H9V``ۚ;$;= ж}>M^W!w}Gx#ywWqCB}+E wIG W v`'b> VpwՎ؁fk9P Eh'vF!Ou2-gћM#<Ѫ^GSrvSWg6QpkH"ޢُA Ǣ܏؉6[ RU9H\/ew)%KiubS(OW)OnDmZCzPFTs:ԷӸ0Y?ie},y^}X8ΩB,߰(Ri~\(>{r%/IX)'->"]\A+F9f<䈽t>*@ZCԋI?֗UYD("6"Hnٖ$IPSLM#`Zb+nQWuУ,E L& Aw*6lI%hawF} X#kw:\KYi!B܏ɔH&Qd_E;Pf~ }w)/ku |HZ64Eb7J ߕ̐~VFQ&V3 ,c[xz2fMwX6^BπPw%ebN"3,K= ;DR{v*xm/,ɅP!,vl$O@1\?uJР l#qxf ?F{!i=z1B'XMʭgR>"D8h5?V`ySN W$o3i&UX =l1Gi ~61YC} T.n%96pHsM c,i(!kDvXe4%YH5#6)޺Q&j;RV8\ǣ+J42Wi|c$8s(@z$jziJ_:.5YfҘ(N[5Y]ŊT_CGmh1<AzHv 瓠D^$яz{KeZogKP$DD%8: V.()~5kGiDI] Ĺ+Tl z^!,.Z_VkJG_U6o'TN*g z/z P%zOV'x]8Q/ "gaT(tɇEs[\{a-'o{{Jr~9}"[$>OG$ts`]u.Pm* B5E޵mcVYm\ɰ;@A'XQP#b؍%KJ o (&O7yYo":)-$ι+ٰ)ȳg!1F s|!ɣeL 9g$I/!CCϲF (ڂ O"㼮/eVyDwˁ=cwBl{q:q#A5ʯLw&.* 2CX֮i˺5qA#/V4E%?kCGs$՛ go(W&Z-5tkT_U~DR!$z掣ftms%Fœ|K1y?&GtT`y_`{\;yS`̕gr}ÉƷS҂fKO]7MQ5y l9Aa"Rl 7w& #Z#= k1.%AcuGm3} $!mڨbLJ܁m[ \=.L㡔F5E|;[?iI*e1&BPZN~Ki4'eW(Ao΅,pzpJm8Chg~Di3""P4P!9=@3bcX A-RH_'ƟMM`']Lp][! N?K#M4js]9?i}n.!^uCe)にST*9]`_!/%Cp>ޭ'bYfF3L@\=J3 +I\A*<q!CˢZ͘T.Wyx\bEUܴ\C+5S Խ|~q ~J|R 5-e]PA܋߆?>{-fCzFMQk UU YNa9:X|B+ ?=]oX~JIDvow}H1x}zp=$KK 8?TS++x$ nCnt͗(#8$G)AJ*QKBX#==^ec)Ʊ4UI eC:tl9mKwY;w'If\à]uƃӉd-U(5p< O?=h6Iwvgs Oii?<&Sv8d}FO|K4w;!C==z!I҂v'բM7MB"aFM})e\|fr>q`O=S ''ÎQ ni,I?zikҢΐpmO; =cnC2;yc b|?d},*OCAc 5j^i}`m$&+Cdȹʫ;KzF~rUr|V6)c)8Ghj)N+_Nl[w:4n>)Mro ۹Lz!"|',B*ק`r񗠣s=<p|e/Z(޼ca*&ɠn8'oO[KpZܳ:uC+M'ǭ>iV|vZ$6pԄr#7 h'%t"VUBrP U ,o ri<6Odn?kA2֗IAZ4Fk~e ?0 ?$ J# l8rF`<]!:ZZ(ȥ%u8k7>p1Nwtл5B+f|`jnKչ֏T|q+w>N!/.vP1-Av'('e㆔YaQ qzMoԋIu˖fVaۉ !p HY܃,t(T_BmЬ\ b` "鸫ESūRǺm;}Mt@%F+ {o˧w p0f@.\[v#=ʃ6_Z]ȕ-5⪴vۼ.(2FDDuiqӾk{泅rݹb='=9d,;͛88WJHQojFDErKF!% bov(USj$r 6\baPC"^ÆK8^kr|MU'zéΚiєやI!^8v@Nԅ?5.N \f"Lȿ{vU gtm(*Ok@Qk{%~' wC@ Mե\'&0 `6 | 8/8˴h! K޼goӁw ӻ\T|=)jL TJ/.2Pa_s`W,kUͳl~o:aL|ij.ͣj& ٛtfFzUc V`<6ap_ʑ9S/&mMG4a+3Q@*h/gzl3B1F"b#gv*;_&>pK~v@m |HIYS$_kʴKN\f;:H*딡 ԧ^: (0W?l)Z|{w5LT!Kq:v|-D(\[&KmC]}wɮ;5E%ߕG(=2gezufov> $L/T1'(̠σgrއ޿ 1VǡWl%SقҙFd}ńs?:ImQpYk){F2Ӊz$PzN l=z :%exŬ DI@jdЋMq^>a߯䙶l^~ꃝ~7<3W.D^b'WD-s5BK1vWI $]⢺ ?)S"1!g;XnP쾍0<}}DT#R@-YW11?@ K[FꚻTvז{6[Eg3_n3xR#tP#Q}Xu^b|Qghkl"+Én-W%?;svg+A8"A]N1C7%Hbj'] c ⋱ɗ-;e$5Yiz^&IX BzpY_3UI 5Wn*qIBk:J>PԈ}!(Ui|u#'V5;o FBQi",AD>ǐ"aB0g 2L}J]aA="Xh"ClFWаcRYGg֑">UyaH̠硇^o0E-xK{i-{CyoZqfnjΞ=Yd)Dp`zPh( |֡c! Ř3_o~Gvpo¢uPyR+ŵ+SU,*sVڿq.0ۮQ=:JRS6Gx* ԑE$ Y2;Snޖn=;to.i74E˻v۵뭡B ]P2Ʃ$ M@N<";: H1%Xd1!9b<@HpX0ĥ;zʫISL1- vnE:\~|]E#K3 Grp0>(ByBV9yB- 18UP+jHЕGք͚Fy'w.w{^ b}3sRsdY.LE '5f $=_]N0K$7S,N,y)\ꉻTb}/m<?s\;X"͒`,䊲P̖7 6>c1u^ROooTaʮZ:G뎢<9'`mNPY!jojڼIA`*;m[s5raǏR8[|Ed?7FNc{vN,lhX)I.OET>x[v7YQiˀ7AlN-T SjKBaT.CE)oգ,a+FWG΍ sJ"aUwbPojރ9n] eUnWƎbƺɻ*U<ӮWݜmHq@ Jt4@㊋?wkw -%:z)cb*jL"qip+FFk5_X{jfdJŮr)K@09b-,.wIDQYyFjH!|6(ú:5M; E"UkX(&@e vɄ{dΈbZ[`(%T#<@o#"Yq?exY:!6pЁ, c4V'`P-33e }{b+AJh  g<4hַ5 wyv!i*oi+ 6S̔{K 12Fۨ՗--{flK#N:3KƌEsolI |M eTV+ )?`Vu,I*ǬU7\ԏ."%6̮A Av3Xj#4E24/*>vhDZm؉3#seGH3zPVYcR4h)o8VM>Eiboz6`Vżw~>m=k I͒B}(Ui[އ'<0|T2H# ~ڢDŽ@)6iGx:x#@~OMEUHswHL=@_7HzKrhU D%nH-tCvɳjDߓ*HkvW$Duyޑk:sN6ہyo+@?O'i|Zhprc|~a"FC z5Ǐ?KbXb>x[b^KR"*Yٗh hn-_4dPm3kyeEY\)sEb&ƚ*Bp,Os1h}\mƚaJ8|k 2Vݱ!s|2j Vi$'#,ȹ! L)dQaTQo!헐#3B?e x=${d;QIPMW p'_cD :H+]pf3KwEunx">R~Wf$(Z~*A@H[.se0-6/@_iq3RJY[~Б:މ7\;H(D,;~/83ZO=U x+"Z\(` rK qۛQe<;:\#vj=' 9+*] J=ed6q [2*K,MtLL|ۦ `r5 \ {$(▍XJ3|ҟ/֩XK`}xpJ(4N兜䳨8,'a)+6,@rԼ*JHWd9m|H-bZ~t#AKI>so8XCpMk@I3(%z17_pu/T5c % ѳ `?mOOX&dRk)hF|O<*a )`96t|ugW}s؏b9P̻1ѓ":eg'Lj&-;RC,Ϭ[R=MjMQ\VYhF'<~f LfZ~ج ZW +g>PnbSBJˆv4Q15:n;?SVT2o %.1~}kaEg仟hɄǐ ol0aܢަwG[ b{QƉ'K3Y{OA|o**_7J0_k-Xm T)?}0[Cno9$k"6E%vyƑ$*3S.EBӜ_kƥ["@s4%.zORoθ_W^:S%Lԡ&T:]^g h>?%Ĥ{_@[L`3W9>C SnCwO}|z瘧f&hwS9Y=H\ݼ l)$WqVD"zkZ3_GHk_@6k:x3A 6 v H2-&݃okW9 Kvx.-#1X+ `e7ןn~>hK?YEϤ(4BމxBE #,8Ŀ+-7^|aC` kl^*-ݜ@WUc.tX]LޱRqwPzAy-w[౩fggyBծbq&7b Kk=ɾqíLMվ=[`1d]]Yf(_'&w˭2i aW%_ 8. UWBO, f~z!kP׵o&:yO$Į!`q:#Cn8p㼚tCZղ0FNmp ahՈoNX'ڇ37},CIJ\-8'.fW`@HcNݵ?0Z'chRYi{r,Ko/޿C[^;&ax=v#pAh(Xue2ø%>>.0ϸ$&MGvvEЈI0Bp7pwqvܜ^GY%mjZY(ݽ[%|m©AkƟWsFЮ͉m N'mByGo TϚG XH5e(w̥)\lgvתi j>N02jRMŦ@a`՘+n>v-z5ǒZ.u'*nR#,XWFs Wq8bTmK:cvxL\uۘ6?+t,( ,p'WþT:4πq Lwes$v:ݕq~?g1ᜐ$kP8~fX~lfn=1ϧ9S;7~ @ĕ5Jv|4) ū4Ei!)!bukaK2XBXls}9UHVIwGch g9|uYN)L:URZ}_`ԈH-UdCn`k'gfb|:zfsp|t֥Riē~<;?1<Ջ&5 v+~KPtP͘a~xvbFVNBbzYMH |2J[Ǒ]^ DǕq>ݘɐ]51>̍M/C=:0331a<D`0`?g̤XQ̅KrT- goR*Gpٴ"`{K⾀o [qp)R:㒟MuFoIxAf4NI~Ź~_`udǹN::D&zGȡ.sR #91 #EɺL /^@ !2erhPGȀym8Gzg1k4n-e>ȞFw!:"CX\8J:ǒPIq6D+ <$ɄS듋̰PKIRq28~qL4rg7\gwŮDtOY3 tB9<Fծ)9~> xoe&!Rg ܙ_ȝ 5?ȅV0g7{n#+х/}v7휍{VtFgBAuɧzY0|N`AIf}@R >ӶP $au&YWR>w004;yRP^> އbI}J1 `h,2xown%tFs dd!{N6= 7yX~P Mj7̅*N;Z F@ a@HٱlqN^U›ޡhLod\-oT# 2 ^L$_s4/>8vlj}Z*b͑wٵX/+Nj[DžyN\bM)⥟/UN }nIx#Y.L@4@no뫳0Vmп-i.gajI,(^.UQJ/%0k#KKTX ,05ٴ&;kFtk?ך2$j޹48C񜺪:1f>&)'\ñ_Q,[$R,5Kb#RU u5TX 2l`kd^;ţlj`l K>lL~|Zh߮D I.E8}o&"-b^Z@!ną:vjVie~˰ /Uakå 3=qP(*= 2 XL^d B\Yimb&u߁d@773-Lk8D vxςJbA);(w%bo3յ^J-=ע݈_xҒ9+,R rw ͎K.(ߕk#NN+#"2xٝ欒L J]LAPMe2A>\ągEUHUL!~mY1(6,1f,MC8݊h^@!W6J#yRDQ\W!h-鮛s@lnY~a|KbUꆑ2}L$ﶻ 8@4r EûҶɩL~P;qS ڃx^ vejC#IFMaWLtnEjy2|^g}(ٽKvk!0H~ ^W6VS1)W(V3P~Uc&hf]P^ܢ*H' f!-';^[;Yݧ -;ždk.{878dpbWv/]+ AKҷ7^F-mhUGFR02 -\ix݀$zqo7!]@uꛍR E& a% ]k(ȡӤ"…%ityj̺*6R>c >/tg 4-z$v@yNLf춟tj]XEpY.xu@\;Q:+8³RޱP-̰Z"sr"**KxG0x V4UW^EݝԲtނL&{{3,?צ5Ut Ek4ik73q #xtZ앺E|qRz.?sN ?5͚ '_rA`h;@z,iB n#9.(T g0y{HfU1 %}f|bgX6ڼ`!0p5OulhaqHؿ 3XT. V21W:Sn/3#-+BѼ]ko0PňcYF6,K,#N: x:azTw>u|`Xi_jyg|OGj`bw~LVӍ֠`/,\s7#Njv߰pHW껻}2}dTj1'A*!06EYKΈkb0rR*Pj+`™e~ f` ;x$౉z(]0*z5Bށ !=d]gB"W "cYt!t=7-OPj{D) *!p@+*gϔVP+SH=wRz2zϤ9 {R7yE<8LO⫇O0pQԺSnFUQ5uj|j$fHhŻ8ޥS-WPpqRmI)S4cCO#huZh)gU*03`!GiKpi+!pV)>iڿ*g\g#'Ճ ?? !jr_v \bAs v ,ɍ¥DڌVg_d5:/eVuW Υ)/J~"K/gʊmǭm{==*u-g G8F]1x8,&wI9!&%MoLA|+tAjX`KiA=!@)9ʖ=fGxH!VO:Loj̥|CͶk&~f衊UAOm 1WBt,_uם N[A P $gD@- ?rȲv0"To{Acq6}#{Vd2|6+Ack9&Ԓ2s7#9JSl$!sC ֳ2Ӂ'ǺY#^k08IvW(hYO&gϵBF1 j.n$y³d8)4jJnU WޝӂV9zJɴ;{i`̀>t|I_yzx +9oT5MQ8i:O5"F o}}EBdWYmt؂qqh_vOrGxv5(XF)f7ۖGk z̎Hr5dzg>uzYeii=>{mKZS>M| >}w+_i; `</QӇc,$1HF@Ӑ9Q@O% @yhL(xh|,]dU| <zRcaٺX6IxG#=-\}jSuoGQ=ʴ-'xu`6- s3͹}8ܧƮ FE,LGI7 GI |$}JTkfrX9mnet(v`Nь9:6GXvOʹt۞ kA$s(ӝ *U" ߤ#5A|%**w1H]ɣ*DJNڤS0!"/-}2CUߐ, X+W}Ƨ4VWxTZg)25An짩LSS#fUmB1yi3tOvǿ_Y]ܖwXM8[~@ճR]ḱZoڍ!ㇰ-.@mx:'xGIzY>FA8Յ P)bOۤq8Πg0|oS1rE o`AωCT [9+,XeƾF$;D J?i<"߁Ls#Z]V-Ѥ͠a=T˪>Ø^6lxj⥤ۚZ罧V6H푤W9\+l m( Ur8#q g=Nr+ z +EnO posduL0ΰ52r#&#PGY{Xn;";L풾FU_ lZwR9F?|{iA49`:ɹ;S35De4Ì)▷ @Q"5{s>)9or[|>9iv.< yx#|uL;!]`shPN7xT_ hۇQ?\B?3,=dVp\7AYf'(0HӴ2bӸ$揜e<]qx#1„V쁟u=^Ij6Tdnu 2DXv3; S_FKp8bx'Tne0ȪP~`K4ټϬWINF_-<53>4:Qem &hZ)h+X5_Cx6w~ tJ*;ŠѽZQ o-$"&(7q{R& Pͷ nD Kf#&+1"Ɩ-^D-C䕧 HlyoӴX2-CA;"&o۟3}_!jliPMp%1y_mst>:R%,,{7D.I-OXHWa,8oHFON9ڙqA]|YojFy ^16`hV1b1ܭº~Y;972EL-YQ*u1Vhп:?`sk_"m_bqqm-:5:`rf)-imOٿ`T堥ըj^G PBh4_ Y@a''c~pIK|i+0ϊd7ݰ8HjL殎P}ߊPȴQ%\B[WdľǍn-AfGk[n9*y, >w\!v f"lbM4^8 8L{ >D oVwSrU8yi7NXa|Q\-TsRcQ_hv8?R;QN-Ĥ I_dOi-l1CEt,2뉞ZG;\0A]}QLlc Ic u)4EWtm"فк/ȳ`Gydu68Ǟ9-E[2U;h߱k{NuGy_!#fݬ&{u=w: RY'Nav=cYiTZTs`?|14)Ա QHNWitZn:H OέRMܛ=DjTzzjY]ح; *=@qXHZ;FvkMI _Ih ~a;[}Y"٤ qʼnHzEőO*dr ]I?NHC O7B"z[ś,=k^?9#MIim\;4A߀ӥS!$_@9yE1iGLD)_yŠMrl' 0lk zWu9j'q4b6EeM:G[Jv.[߃Oq]4{)_ T35ߞTqD wPز 됪@+ +X#ÀDK|Lc0N5MKYW`GM?!btZ|1qD$GhmJ6S I IK[=wQ\18 ?NqyFoCMAL_1(#p{:HxA9DC5즗q' 7UZn?C) q-g#Mkф|J \ېosX}.GzY׋`B}#'$5& >r5pv ~Z>ԙnb 490je#H=dM#+Iv 2JRè}TܭuK"=*Ug>&Դ;(| fjC&P:Z?XƯIzdONQ3Mj 2q qYf# b7$x8#43ν_ә4wi(Đ!Sȑs"#Ǿ-y C4]_?iy g.uɿ@Hdc]LH])PGlYbwt%-2 "D2Bsd ⼁`$j]+1%79$n0Gxlo8ZpQ'E'38hÇZѱ:f6rm.z2CET/8vÎwW~+yb4U֨)~Q}_Du @J[~\&W6 ^1uf (.6ZhT%g9;{gTYn#ji]9GlVF2]bc9ĴF> Lg`'u kʎ iڙ[EHw !5/r8G{ꎴ͔;@uӿ0%q F~̶?qO]1[Q9Ʊ7jKE>>BtDQi9s%ID ;mGUwI&R9߾oխT5.T,  X_:1_~%F[bhw{@l!g.MʺOPAe\*- ${kG{):XCR&._i/J;-eK#ܷc7w~ut5Y+&;cYSxV  y`hk)ySlɖ?S"1ǀ_? )=zٔw`z$S(CJqmPg4c5 m[y#ҙE[K? `MQ*PH_6K肾kb^&ـ+b3kP`rgC03+?z!\_4m+`[8P XОEpcK^QR{oC,nSoG7~@f0.Zm3a< [a_^ -hmӽK_ZcYI%cl4P@StJQZ"N÷`鱭 t"~ɇ ]JMU<ۂd8PcqPΞnp,L 'kJ6,PZD @t'A-aRe< ]QuG37;9fY|ܹ|:H3Q8ps'ad1LrКJNov,l>ʧE 2 *e⧹suc-@ͽE [84IKjWhu1¢S 0d"lڌ#lV: o4[M+1LeļݡQ[USj#'1BYLk崭gȭ-!Y{|k.v#?̢Vb wfH\&RTN2h0tčhqlVKA37K)=C1 L4r ix%X5jo&Լ!tk$iOG\^5=&O |/\d>GrՀ*8( _J\[]MN1U\ &t$o#ɽ`yZ|C ?2lBm B\zHީ=~i/Y/;~Ĉ*m060q}b.^SE iCp [=[$/vkH?Z`"?D7S  !! ( Tlibmuparserx.a NҴ qiskit-aer-0.4.1/src/third-party/macos/lib/omp.h000066400000000000000000000230161362723322000214410ustar00rootroot00000000000000/* * include/50/omp.h.var */ //===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.txt for details. // //===----------------------------------------------------------------------===// #ifndef __OMP_H # define __OMP_H # define KMP_VERSION_MAJOR 5 # define KMP_VERSION_MINOR 0 # define KMP_VERSION_BUILD 20140926 # define KMP_BUILD_DATE "No_Timestamp" # ifdef __cplusplus extern "C" { # endif # if defined(_WIN32) # define __KAI_KMPC_CONVENTION __cdecl # else # define __KAI_KMPC_CONVENTION # endif /* schedule kind constants */ typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; /* set API functions */ extern void __KAI_KMPC_CONVENTION omp_set_num_threads (int); extern void __KAI_KMPC_CONVENTION omp_set_dynamic (int); extern void __KAI_KMPC_CONVENTION omp_set_nested (int); extern void __KAI_KMPC_CONVENTION omp_set_max_active_levels (int); extern void __KAI_KMPC_CONVENTION omp_set_schedule (omp_sched_t, int); /* query API functions */ extern int __KAI_KMPC_CONVENTION omp_get_num_threads (void); extern int __KAI_KMPC_CONVENTION omp_get_dynamic (void); extern int __KAI_KMPC_CONVENTION omp_get_nested (void); extern int __KAI_KMPC_CONVENTION omp_get_max_threads (void); extern int __KAI_KMPC_CONVENTION omp_get_thread_num (void); extern int __KAI_KMPC_CONVENTION omp_get_num_procs (void); extern int __KAI_KMPC_CONVENTION omp_in_parallel (void); extern int __KAI_KMPC_CONVENTION omp_in_final (void); extern int __KAI_KMPC_CONVENTION omp_get_active_level (void); extern int __KAI_KMPC_CONVENTION omp_get_level (void); extern int __KAI_KMPC_CONVENTION omp_get_ancestor_thread_num (int); extern int __KAI_KMPC_CONVENTION omp_get_team_size (int); extern int __KAI_KMPC_CONVENTION omp_get_thread_limit (void); extern int __KAI_KMPC_CONVENTION omp_get_max_active_levels (void); extern void __KAI_KMPC_CONVENTION omp_get_schedule (omp_sched_t *, int *); extern int __KAI_KMPC_CONVENTION omp_get_max_task_priority (void); /* lock API functions */ typedef struct omp_lock_t { void * _lk; } omp_lock_t; extern void __KAI_KMPC_CONVENTION omp_init_lock (omp_lock_t *); extern void __KAI_KMPC_CONVENTION omp_set_lock (omp_lock_t *); extern void __KAI_KMPC_CONVENTION omp_unset_lock (omp_lock_t *); extern void __KAI_KMPC_CONVENTION omp_destroy_lock (omp_lock_t *); extern int __KAI_KMPC_CONVENTION omp_test_lock (omp_lock_t *); /* nested lock API functions */ typedef struct omp_nest_lock_t { void * _lk; } omp_nest_lock_t; extern void __KAI_KMPC_CONVENTION omp_init_nest_lock (omp_nest_lock_t *); extern void __KAI_KMPC_CONVENTION omp_set_nest_lock (omp_nest_lock_t *); extern void __KAI_KMPC_CONVENTION omp_unset_nest_lock (omp_nest_lock_t *); extern void __KAI_KMPC_CONVENTION omp_destroy_nest_lock (omp_nest_lock_t *); extern int __KAI_KMPC_CONVENTION omp_test_nest_lock (omp_nest_lock_t *); /* lock hint type for dynamic user lock */ typedef enum omp_lock_hint_t { omp_lock_hint_none = 0, omp_lock_hint_uncontended = 1, omp_lock_hint_contended = (1<<1 ), omp_lock_hint_nonspeculative = (1<<2 ), omp_lock_hint_speculative = (1<<3 ), kmp_lock_hint_hle = (1<<16), kmp_lock_hint_rtm = (1<<17), kmp_lock_hint_adaptive = (1<<18) } omp_lock_hint_t; /* hinted lock initializers */ extern void __KAI_KMPC_CONVENTION omp_init_lock_with_hint(omp_lock_t *, omp_lock_hint_t); extern void __KAI_KMPC_CONVENTION omp_init_nest_lock_with_hint(omp_nest_lock_t *, omp_lock_hint_t); /* time API functions */ extern double __KAI_KMPC_CONVENTION omp_get_wtime (void); extern double __KAI_KMPC_CONVENTION omp_get_wtick (void); /* OpenMP 4.0 */ extern int __KAI_KMPC_CONVENTION omp_get_default_device (void); extern void __KAI_KMPC_CONVENTION omp_set_default_device (int); extern int __KAI_KMPC_CONVENTION omp_is_initial_device (void); extern int __KAI_KMPC_CONVENTION omp_get_num_devices (void); extern int __KAI_KMPC_CONVENTION omp_get_num_teams (void); extern int __KAI_KMPC_CONVENTION omp_get_team_num (void); extern int __KAI_KMPC_CONVENTION omp_get_cancellation (void); # include /* OpenMP 4.5 */ extern int __KAI_KMPC_CONVENTION omp_get_initial_device (void); extern void* __KAI_KMPC_CONVENTION omp_target_alloc(size_t, int); extern void __KAI_KMPC_CONVENTION omp_target_free(void *, int); extern int __KAI_KMPC_CONVENTION omp_target_is_present(void *, int); extern int __KAI_KMPC_CONVENTION omp_target_memcpy(void *, void *, size_t, size_t, size_t, int, int); extern int __KAI_KMPC_CONVENTION omp_target_memcpy_rect(void *, void *, size_t, int, const size_t *, const size_t *, const size_t *, const size_t *, const size_t *, int, int); extern int __KAI_KMPC_CONVENTION omp_target_associate_ptr(void *, void *, size_t, size_t, int); extern int __KAI_KMPC_CONVENTION omp_target_disassociate_ptr(void *, int); /* kmp API functions */ extern int __KAI_KMPC_CONVENTION kmp_get_stacksize (void); extern void __KAI_KMPC_CONVENTION kmp_set_stacksize (int); extern size_t __KAI_KMPC_CONVENTION kmp_get_stacksize_s (void); extern void __KAI_KMPC_CONVENTION kmp_set_stacksize_s (size_t); extern int __KAI_KMPC_CONVENTION kmp_get_blocktime (void); extern int __KAI_KMPC_CONVENTION kmp_get_library (void); extern void __KAI_KMPC_CONVENTION kmp_set_blocktime (int); extern void __KAI_KMPC_CONVENTION kmp_set_library (int); extern void __KAI_KMPC_CONVENTION kmp_set_library_serial (void); extern void __KAI_KMPC_CONVENTION kmp_set_library_turnaround (void); extern void __KAI_KMPC_CONVENTION kmp_set_library_throughput (void); extern void __KAI_KMPC_CONVENTION kmp_set_defaults (char const *); extern void __KAI_KMPC_CONVENTION kmp_set_disp_num_buffers (int); /* Intel affinity API */ typedef void * kmp_affinity_mask_t; extern int __KAI_KMPC_CONVENTION kmp_set_affinity (kmp_affinity_mask_t *); extern int __KAI_KMPC_CONVENTION kmp_get_affinity (kmp_affinity_mask_t *); extern int __KAI_KMPC_CONVENTION kmp_get_affinity_max_proc (void); extern void __KAI_KMPC_CONVENTION kmp_create_affinity_mask (kmp_affinity_mask_t *); extern void __KAI_KMPC_CONVENTION kmp_destroy_affinity_mask (kmp_affinity_mask_t *); extern int __KAI_KMPC_CONVENTION kmp_set_affinity_mask_proc (int, kmp_affinity_mask_t *); extern int __KAI_KMPC_CONVENTION kmp_unset_affinity_mask_proc (int, kmp_affinity_mask_t *); extern int __KAI_KMPC_CONVENTION kmp_get_affinity_mask_proc (int, kmp_affinity_mask_t *); /* OpenMP 4.0 affinity API */ typedef enum omp_proc_bind_t { omp_proc_bind_false = 0, omp_proc_bind_true = 1, omp_proc_bind_master = 2, omp_proc_bind_close = 3, omp_proc_bind_spread = 4 } omp_proc_bind_t; extern omp_proc_bind_t __KAI_KMPC_CONVENTION omp_get_proc_bind (void); /* OpenMP 4.5 affinity API */ extern int __KAI_KMPC_CONVENTION omp_get_num_places (void); extern int __KAI_KMPC_CONVENTION omp_get_place_num_procs (int); extern void __KAI_KMPC_CONVENTION omp_get_place_proc_ids (int, int *); extern int __KAI_KMPC_CONVENTION omp_get_place_num (void); extern int __KAI_KMPC_CONVENTION omp_get_partition_num_places (void); extern void __KAI_KMPC_CONVENTION omp_get_partition_place_nums (int *); extern void * __KAI_KMPC_CONVENTION kmp_malloc (size_t); extern void * __KAI_KMPC_CONVENTION kmp_aligned_malloc (size_t, size_t); extern void * __KAI_KMPC_CONVENTION kmp_calloc (size_t, size_t); extern void * __KAI_KMPC_CONVENTION kmp_realloc (void *, size_t); extern void __KAI_KMPC_CONVENTION kmp_free (void *); extern void __KAI_KMPC_CONVENTION kmp_set_warnings_on(void); extern void __KAI_KMPC_CONVENTION kmp_set_warnings_off(void); /* OpenMP 5.0 Tool Control */ typedef enum omp_control_tool_result_t { omp_control_tool_notool = -2, omp_control_tool_nocallback = -1, omp_control_tool_success = 0, omp_control_tool_ignored = 1 } omp_control_tool_result_t; typedef enum omp_control_tool_t { omp_control_tool_start = 1, omp_control_tool_pause = 2, omp_control_tool_flush = 3, omp_control_tool_end = 4 } omp_control_tool_t; extern int __KAI_KMPC_CONVENTION omp_control_tool(int, int, void*); # undef __KAI_KMPC_CONVENTION /* Warning: The following typedefs are not standard, deprecated and will be removed in a future release. */ typedef int omp_int_t; typedef double omp_wtime_t; # ifdef __cplusplus } # endif #endif /* __OMP_H */ qiskit-aer-0.4.1/src/third-party/win64/000077500000000000000000000000001362723322000175725ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/win64/lib/000077500000000000000000000000001362723322000203405ustar00rootroot00000000000000qiskit-aer-0.4.1/src/third-party/win64/lib/LICENSE000066400000000000000000000030141362723322000213430ustar00rootroot00000000000000Copyright (c) 2011-2014, The OpenBLAS Project All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the OpenBLAS project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. qiskit-aer-0.4.1/src/third-party/win64/lib/muparserx.7z000066400000000000000000014257461362723322000226730ustar00rootroot000000000000007z'rd+b9?X]ruM7؋,8]ZfBajoC^Lnoxqh:4ٖ/'K\I̕~=v"d΃yz$Oie| $-yB@xHBbt{2O7'q4` o֬{p}YMWkaju1!& '|{w4bϖ-6i2kT pi\#@ me[cGj)*k"%!2Z/Rx`jФL<_3ijg} *U&@ELC*.99ɴ)^zAN7lt77ok:}m!D;J)7" Ϻ?𴰒b%o=1̊ dLނ-x50\ٍّ>qzWOHz;dYjD2<K+:SW'i5*>rwO2l_ Js38 ~D_g׊,S vf{rw~]7usmS+&;J T%r놭 =G ,R:HFBzo{#.c{nMz! pyX3]?<,ֈw4jOHcTyKy.~/vw'ܤ4\",p9I# ]=w3>ϩU!F,f5I=Ⱦ\ltZx۽@.nJ!4Sd ߝ&P9#An֢kQ={jHwZ=z1@傞A8I \ Zm?aūC昕 ;һ:xHY 52#U"ٔb7cwQ.+(m&hʳج. "|V$+,X f>}STTE7:JD\_胄039*qKw5e'V-¾<=/8 y*~tPP0M#ဧgetIQ]:v`LS :q#SfF8g7a&ˍ, g@qfO]# "B9!we% AxhGT> DMBUp zѐh1@^&`{t9 Ka;{#іR-G0 ,c(C "f OT25 slew]UT2mp(*8X詯~@CJ9{z*M1Y˄pÛ%WuLlf𢺰g^{`˽s*봫:R◍ƶ'RO=k;os?dc) гM~F&d;yb[#b~Z™<})Kq79hen((#;,.U`_ʺ{Ia)VJSsH!{v"+rʄ?/훣GINRf/ڤ85!}]b{pb Chm̍ʴ3#n@;1SA}r &7!W1yZtS=|^Mo!N7E:_;.DP` KEN?] ЏUV1Ċ-,YL8<&u@^K{M!x&sSw cc am8)Vd]eH*l3 gR-rg8 9A! )ZTݷ8e_,dXf7w1i(:ߧp?sp t%ՉQ/87@:5IVy3<=4L7bVξO[ }2j\?˩ހ0,#N?.\?l3eP9W כ [X"&B/W5sMu)зjZ{~ˀQ{%Gd>IyUr3ɳ?P[ ?oSIW[X8<=Ƈt3^Diod[^ azfTJ3EY4 lrڸr{/̒c:@.n[dG3!8޺}*uNt,KKt>g#Erha|zD7"yfK`}N/rT@WI]K4Dlẅu] (HBHD$ԩIsR7 g Q\̰K>!&z? *ftx_}Q(G \I(/1k0 ,Nd;j!zF$x1$y+9Bbj+:'}|(6QEZy28p*_: p+.(q1q AXZQ&~\E=({|f ׄ*/>T`٤a8kV| VX@"cP(ct><(ˢx*vx~Y ]ob2yO5l`ew'L3œ+2aUs]'IJe&W߲бm~y'twZ.l%9 R'MuPس|r ]L!=(/€:S6-SWy #x#g2 Nht2FM4|wuR$opM1 !%lX&&>: I m[5|.}򢎑HɊQ5_7a;@DގӜ\yL6a;%Ly҄D(L ]WmحihuQ;:Oz0 \'Vj#1@`6U,jr]>|r$D7iIb̪v.)ت;0`s.*|DBܣv.pX\פ%{mr0 kFXGOT ꛵llLJK'wzbBxBH֊KuZ׵M(#@#z[PxC:-㒃puJunE~+#\Ө75twеQ?tcz}Ȑ1d`+n9s+,\+~TR.ܰXm+ CNE<oUar|l@ ]ӼoԈ5([-d|@T޻0M˪7Y kntWJQc}n cIm~Hx"̜ E0'.]z Nj]8U pi j 1uؒ3IkkhoG/Wnٛ>KNOJhjg{Clb")'&ȇ0\"H lSW1n,\R1GP]:5A6eZ#mRgO^c@juƃ~;ހu%.;nEau xS[> @(t1;@*'^oj݅߻|R!B.D Z͞_>O`ȱ Л"/.10.&> wu]6de+4z؁O4ԏtݠ\e p? Lx t.T|y˞NsɊH|`5]7TD>ՋOk\a6=ȝB|g ^۴|]Ȏwd^`km:-\T~^"^5C aϛùBₑ%~1l2́E?@i/m˟M_r0sJiVz194T[I*/5*"th矔H 1 K6뛌Br3W㐠R~ 8lDj,Ǜ v {=c/{[Kryw>ƺs$Aؑ&Z͹^ӌL.,aL`vZL9^`M-QQܾC)wJߡE|,vy2 T  Pչ$An \`"Z+X%,L>,vᎤo 21"%j3i\A&'qTo ]˘(B1?N ap|GzlV]L EftvF?%0"r"^ P%5 TZb4mLCߨy1qEoZz>H`?c+CiT_݄r]pVi]lyCL;D dS NژzQ6EZݭOF*4NbT4Rϝ[5Ljy$9&2iɯZrCW!.[ײP C3 kyBDJ~?4^8P8 tv!wsnǡLR9}2Ĩ濮$`>>!ַYNN!Ŋ+R1RNsR7F%u!ccrO"| M Ԯva{'WGQS#l¹x L f/FFw0W;e-,Ys<_tζCGH e[oqID?s@>xb-GX>My <ڣJze@G:s.p?,aɝa;oLaoW.g3L1c/NPJ!Ivz+Ew_n65do1{@==\Oe`dVgl4 4* nrX.i{Oz\q+mIDNTQc, &څM Df 5[2;"\b~k3z+Ak3 !g J&G"ӫ-k|se dT洯 y;ע(u&FN(FlsiK8B׽:}"z/SVb<;/5#Xb6boPX#Լ|ACE~1׺eXod&iDLr% t0&jH\\Gw+ ECKJF:<9͡!};KO${)w-^!Iu`uhv.R8 Q UF &@v/n0ozu$F~7w"7TQTqi6G~!$Ph|:AME<%d@30N;%MD8O^qujpVc {5֟oZmАC-qԛ `$_TwY-OT\H+nJ6vokQ[U +Ta?g@N˭`2pMtva/ ETJ :(8|-fn\=W~]nnkc]8_4Bx=,]ç 6]3\X?%eZu%cاM=>m`1)8$#=rQϻ5Q:#Rtըg&ů1ۿ8+tn^v13Tk߮/  &-\|Gx),G"+~f ;NKgO}p @&tY^C\q t|v DR!X-e~($#*I"@ٕ8\/ƜZŬ4mb*gRs OB_h (,/4L#AEȢQ'Ƕ(<: m0oD-A͖*Xh9 ho4f͛$,4Y[.(J'DcnYޏY qG4mR%<܂uCpL$=I`Ae#*q 3QA2âNh.9Ite*E%$vO }g,&YWjh^:֎p_O;8t2֎ʬWmu >ٕw bJwq7T_)=*lKWnc YFu6F X=#:*i3gmY10-sSyڝޝ'!4¨C :HȅT:7;Z7;307'B .䰛G4qoH]ߚa΢}5U%6d8R.Y vElA1Ԍ۹ iKB0;n6j Inc3i x&n '$G~cgy. sV[z3I]K UZɜVW1m:I",߀|>O)P .`JdG owyTi ~hx/R}QOVN4uKQ [,*Ɋÿ(}l/EkFV U  9fy1n4[~I]b#,f 9>o^8͟)i΂lKj%b8<1q4<-X2_k T8IU[CPygf.CjgTQ]/{q'y^UMJʯ`@d3MCгpOjGxDŶVqx]ѣ.sa#ٕ% AA[cEQ"Q7&G- Zdm)pd$ٿHˤj,:2:.sEYz,`&uU%yipH .! ÌbV )4%8 >}Ŀ劫dPw> 'BWӄ] RJBZn(h o?}NΜ󺖮*ȇj (l%FT]Ƴ/c(:o X濫ēW-j&2g^}i&``P')&mXcE7E\0 g )LNޯE0siϲ 9[WϵR8gb8 aQ·gzXe"·+[I]V2'dLm4׮j*'ZMR.)\APےIR>&On:L!dyyv WiPV`hړjn^733 @mTo@iwzTs Y}')OU ,+|ue(vࡁEm~%e+sGc|"WNG˯M8s|kr{(Dx^;7t5 Gьgb8*ӝ N-ayN'z"q;`N/QGg4q:h#PY!F*9hii*uq r)&2+H($l~|R 5HY$BnGvB΢VE)QHOK"u:ٻAga jFQ8H"c; [t} Ha{T@rc'<>?r7Z?D k:9[A9Я/'Y$Yn|$K:|!.;yGR=jt 66izrzHlUZSxr$bfr?ѩS4;7C/@FaLzCDN^g^"kWzk-\"3;[|m;oP7֨8,}=G|x*ea m6 ~؅.lrԘ0\G J+DUz(\YfY)?2"RJbzq|FTs' U~h7tAk_n5i9gUN&]mA[6 |^3phgV})qp.I"nI1ѓ]Dʍ~?Mo)9ΗYoGȮbQfe1r .?s<IQ:]~RMҏirB(3Eu0{.kI\4[}BЄ5ٙ$"LD_sYy-Z!(ߢWsm;YRuzȿUQZm\Z3)4(V&Êls&'8/t5'׻nša7Guk;WCoBϋvo7ba_E%<4irF(]vy.? $i [a: p뮡MhtUns7aTg(rBi~Y~aN}QΌw.ꑰ^VVMEg#O^=l7 4ei *z/^f:ÍZk{Fy֣nib-}[@V|c%Vx0tByFrEKPޏTsfAq Y?kw$JκuT!ãrZzB<⾿֞fmȹ}x#m?yTZ76~"Zj~S5ՏXLd w{ǟnYT)qF^Rʮ^.C!iic}5ukzۚ=<_DW o|@%<1t&RjF#+CqXsz,>c\%&ޝ}]t[ wGхa5Ի ^˝a)?b"QEOR^xl(RHx=BZL75FovK73߃ r>@ A:=)R]MǔK b]$tl>yj¼rqJlYH 3BC^;w8 %y2q]$C֡7}¶c_MYs{Q4HȎ+%xgpm&,wRvnݒ`v0=TeD7sStRvzdԌ` {/ŵ"r/r\Uu}c^~w:M SIЬN.0d9atެpFv^Hidz=0u18#p*dFG mi?v?ҧܿc9UXЅSOl +6gdP5^;|oѳ'{߮1tY9S[@z؇ hNRX;,*Ǯ,g(kg^/4 8Nݢ<m}u?+]S ^3҇0^orj=ĘMy>5v%%O؇rsb@! _IUG4&49CIt9}5w}øe'%8NS:pH,2A8LKnKȅ)%}S@/=z!\ sÆSS~ncl>4,t~FGzӠ ALn C w':|jѳ[|S/{ON{ٙ V] sFE t%~H+t,̃mCgN#gOQ<řne$Ϣz4S<[R| B;ZiuFJ7ڵO麆q;%: ]*CiY} ʍt'+բE%|ɛO֏rcW> u)zD:X2cٍ,a"Sma7 .x4@M#k)Xӌ)_ |LAu/pS14Noo?k =m^œ Ju)h +I/`w <2QSVdKy6ew?_++~兓ǁ#ơq_:ӶFj3pi.96qW,,\̘/8/c/T V}bű:rgj-Xwy¶!DDȈ݅naJ{jRJe?iZﴌxV' X)+SqTK'aO.:[`û-qqPMˁQ ?GJcd+Ri F?X1sۉ,'䶠{8U@LY49OAD NEݮ2 H^RDإՁ {si.Z+}#C҅~:V+uG|(|#ZC1)%W67[ӆ4h:8KҊs'ܵbۃ,.|^H.U /<ƶ0v@01LŸ!KAg v/jèH~L0:\, e:BAMZZE\Uڣg+%WM⍁hpN}YIT`(dRUu "ȇn#d^(U+At$A;b_$}Eg=vh֊ mie0e;Ħ-yo˥y"SX-F#a.A-3;xUޥS}yy}`VĹk!Y_b;-zAù҃96EXw+ZA7o-xTB _)z 'Sg_rLyu[e'쀑Q:c.vOgLJfa2jyrꉖ+ZB3EHpwɮSsA #4߼@ o?uձAq6Y < q8uY-jx 5î&Ƨ sMFر _7.V ط>~ll{hE^DBA|62QfnQZ $ DKu\Eq|𭺵 [Mk,Ab`M.lFBhL$1RWL"7 d;Te#X_FO хA/~0-IOyAL]hm5!sĶm[%Dטbv~϶ .!i (~`=WSY})r!U&q*J"y[UB5{6|'4Hxgmq#fV&#ݨG-sϦ=zf>kXD㎔"ozͿ r?{geHŅm<b$i8֪I~ upIpMy6V^H)-xE|˹Wb3&Od }S& <"zg K;íqcF8ZC@(dkSc4n]+ngks{%ߝ_.rchH-44Jc~qٺdsudy*̩'ՅOiEv~1N62!KowA-M:" & Z~Rʹ!GICbB \ ΜڇN JغGp>ˤVsy8!7ѷ4>_H`^mÔzmGC\2A6m}T! ]SKO6c@H]ro)XP 憦E4d/Px8`Z;Pb $IJ׌_U 1tM:;MЍ~3)#B2Ͳ>zC]Ö!oKşW; '@]?R9|ߟ/'z7$3:F .>.= HJ [eƜHlwK{pԈZOo!Bڭ 3zma"96( ojքzQaNWrO86B<9 ~ʬm <<`rzpAᑧx-wsCHq z=#t-WEq9pN_qʵoG|H "\d,kn֙wUL=B?Vm3s.&Y=6'tboO~cGI/WJ< >s@v}(T@G O+?6遱h% ě̙~}޸vil[ XfGb( p} W_O0 3=$ŀEƯ\ZR382,vUגp7T?d&-7 ;=mtw~8u$F~Oi7YmAQג2@_8S!U9S+rd],mSU2ԣ!kp Ok[_lxkS`"n^^= 0Y"^8WD7{_p3@ɓτ]kPfQ.7PL,`4hzu93ˆV$ (!.<ŮLvn)ws w&  ~Bu4;І>l &h=Śq*EpYe>ZxuI6+~9"m[M8xL}n0(j(atF52,Tv ;5%t'z,rlݨ*~VS!MfC*03EP-A0ܽ̓c~bNTKdK1VI (qσݥā0<,`C!>*v'"wY_d\"ܚcuvp=ׄ,⅖2i{Vl^J Sʹ)TR E6>qWÅb) isr@[F VH݃}v|uIn5 U}f0hH;d1K*Q}ҟ_?qH|8 :cJK ϜHpeW*2GH=[09ݡI\@p#p.MQ0^rcw ziܟeٽ f>CILpL7G@Ίq /1M\[uQ;{`#!!LbEOɰ 1qwUlkn>4q4kC,F4 چ όysS5O(#%w #Dz5@PBJJ;._.>tnKgr8(nPmcFK[ddiG#1Yг^Bzm*J rK#Gx:Mx5tx"̤Dm)"vPDA b !V=~k||z`A:60-vCPd)vx0\L#rpv.H5`_}# Z#xa1qZi{XRɟd杞frQ+z[fH>.m"t^4Dash#T`2 f`sfچ-̱x^AiewT{}a~o2 Gf+9ܜN :^˾q^"L5Bb5>\t, VU2PR)zɴ[媳]U5ICRlĔlxE*' McJC(ՌQʫUcyY:hZM <vU0ezƻ!WJYPxOps`|ms2D\YuNFWz>|d,XcN D~$!|d]ױc_b$I-#S:KB8p=ѓZn[O_2͎şp^dXz}r؇9<}#CW@_$AûEj8pP8GDD)1fJSa@Bl5>ù=pEv=~y{ d\^L甁@9';MNC>PYj0"D+sXȨjv'Sg!b9>]5z[[sIy5ވҤxט@}LE1ƦC F]^gPP1hyCd ;蠈hX=D<FVX'j*螦yU]q0>X[[2i`bKT1ƲM,}I 1,dT"IҰ@xWW]UD?iHCd rkA3X3+{ R|7ފ$J)"ӿjT/Zˤ>+m'j'&σ-Rag'`MQ Jޑ5EV =0z\3[.b] ]/ (39P#F}'| Y5m@M7pdj@{a=%,j=h Hh MoR9K)s(>5KZLH (I3aP}Mw@&w@_Kkُ1oZo6p Z3/zי!J;O6^ȔG@0_^ i[ r@Џ TTSo&:. t 3!M(NpXtK?կbz|o53l*w0 d?EEG},Ek2r۱(%XH96hj=.֮}B|=Qbn~e"Y{ͼNwmlLC.ǍTNx[ g@f%) >u[Q-6G 8t'8e&l o%;"_m|a? V;l$#Dz)V8MY`|p]C!5#H52}V.*^|0 TNRɸ\K"K9;PY0E;;n^/y,u^͓23)T*|cL͙AgnJmq}tN?hlAݠ߿6d._-C:~ VT B# _tef5Udq&"ϹE 6ךC8XT70E"Irpe ltuXfGx`鿅ٚ? -lugk -] V1;ĸf&T.]??k1Ty\d4XQ|}L)DQ#RO qAx^o5>&g[ShGg?KE+WϓmJ/#'πS',Z^ty~y #}ZJ4ydSp-5!TVin:}23PPEj~K@Ti}BΈqm JTz^kr6׺lkr\Ȃ#AjѠt[s|gO 40&i &~v3uoi1vtaT}w83 <Dؘ5 ؓ܄բ17S J[3@ '6\[wZB4ʝdUv Y"K kGuvR&uN 7؂O@:ŇO]ޱĪ/]i DY&d<Nޝ>X jnѰ毺Vt1lqiס;6B~q%:Z\K&L4BM\Mr H&$ ,jÖa̬TcbLޫnnNnw\9^Z4xWBƟuph#*qASu!3J#ԒLEj8lg["ܘ|j &jwhT(e#QIguFħB5,Q| Q-)EE+JY_'N%T=7$}+yG^!̎/zj##j0,MEiVvZųg Bt = Sq5P*Fz91\h62եIAi{Jpr2HC.ѩ*./*7;2sR׭ba@bS*TuL_ѓv5d#)4͝oweP{Jd,+4F6K*ZΌqYqlˋ+pN4Cvh$64{ҨBZIeTh]&&Z7Z@ljugq@Wu3zA \QًNEnsk)@a-P%^2!&wX-fga_Xi"9]_:O^s Un52M|^5o Nh8>; ?3[6;-S02Dtw}ƶ:=D2|n[pv .1) '"&dUqaD KGi+9sX5 B iJ}S a?VA4~n5]6 e= FFL+nDZh71o%pT&vV KG]>yj=igI"qj&nu [776{l#\Cߖ30\e=_ngQP摊b wŜb^yӧIYC.ظph=tvd$f4P8R?v3k Fڗ7jdSxugQa1wȧ8&DWyp(hPNyeq#Dv m`.E|,'sBFHɥdS e`/ }jf4Q2Z+~.lN~/T򒙺.xx䄭3"#EhTcU&wƺy2[Z2lNw+5yfѓ ʏ⤻_ =TcTc%QޔROr>C{7G#|qd:޹J{yyQȤ4& *`y\ Q PީŁs&QT?ա5Oʶ ~Th:pwRxkL1K8b'~6>9ckIve mF$!WĠT&Y X jɼ晵v=uZ}bSxa&U?u%Il$j\Nη3KBҁFAғ}>@Ǹ@-/Kl֡7QO"cV\a:(l4ocvB5Ĝ@j[>^`=C[0ZH{[ˉ5) _-ۨ~xo-\(Ev* ;3TEnI(@IIzx0\|sTn>oI91jNr O{\я\Dy R*:jn²qqϯң؉a:qmckb 'n#Wϩ{ C:T.l(L8?}VcS#dC|`r0ODFyB8.~CqSҫ4'Gj $ R_:TCc,dg`2/ :""N z692}H+ip2-c+F-Sm%A<7sB\0jF0O$-zpwRK"I%iʢ^Ӎ+%nNrl00?UR*jӾ,D{ =&@V)7׋NL!LP<=эuvL9Kdd\{'8/<ŪdLz) ō_zP'sz\OE}; #@ޒ:0B~* nB gGt~QcM.wԧ9̼]rP•~d j~EN]M :ż̗4ӳ~:!5/]DBuV@6}nM%iW)kk)z9e,168-o*Nscc Hn* EinnX‰Z; .)uaI [#fiT q%?cbrb sb1bWٟݺj-g3ՕD8yӖwH 'j  şM,KKmAϯa~{_AЧ$io#4N:>K3\T$mCyƺ!":!Dg*opܠ&vS%7{Im3K ]4dmzkYfɘOa7g#MJw(<i\,Vm>忔9cTPj/nT[(s,6u&:mp'Gx=>ƞ.OQ˫@C}oAj'Gyyx_X r^"l]Wgo1aCfd 1!74a.)%]]NY=uQ7 UX^*\L_5J΅,k>y-Ad4Pbwb]p; a-o8gVocw>z+C: FӟYTgAD\bc`RjBs5K JB}W@vT:=0 56 9&u/I Y"4+*i;3qF5(9^aFi(D\P#,|.UͱAhq[*w6=)lEITGmlaD$mA+O€*`4frRU0 ,O~t4W#x,ˬ.3\Ēoi⸀#;C+>"1%ڷbgZ%Q=2C:oEǵ~\ln i {oNJqo!|ЊnTj%P s/_NNsRT&O8&Gfn-RDqN4?w |0nQȏ[a!K,Vͽ;znύamzҡxoJ=}<=+Ƙj)8.s÷)eML:tI9Je r4.vG(/HGFKSSsN `UqODfLy'<% ~jG5n5X?Oxتrų \"?X2Cz)O1v 6 bL Q2lK'[[v%d^њ$c̏D.:VO۞SQ~5X]$3D]FH1]SD<\Xa`7L/) pD|@ޙXK$!9tݽK)xT-8frys(x"UmO󀩥ꚷm=_jNf|=@Yx6^ Kt}Dn9]VܲZCnelm쬬5Uzr2u U1~S-ck60";Y6Ȝga}.26ڹ0Yj8F+B,*р6҃v.~̾AO,WɇclM\LLcʉAibUb֑ǞFO s|NY1S@$).o\&ґkg0ÊF0dZ~(UPU2o=Pxm2^/4{s*RE)ٰ> GMhGw!3`HYכ,|CVmT yjY]h{+}s"=3JPB0p $Jeҝdǰ!bXB hlfQOV +W.37^K° D?i!n.rP4\F@H{ՑWS:)lLҙj\XmZK $5o *VTJ? T+[?,&>R"]%aadwR UKEo;Jb% vO;@GkhW $tWZFEĬ~oLoS!JL^eX꡺mEE$gYgBW'i!R|Je8&Fиf8v04:=KFᘲ*++{٨9M-D L=Bc+ԃ-2v@irug߾d(zs7F V+G"GʦS:oEb*^|ď)HڀZfưXY ct9(m[QqvcegڥSG!/,kr+rҐssfBǫ[Åj)0WqǤ&%)6E nVh|CV'IP",Kq|Q,מ9w=5'c$Tj}{̵ DzlmDxg'x#蓥~4{kɔYEQ %5UOVB`h.ͥHV2,齡mtA29U3?ɴL^L\3؜=Gօ 1I-?Y|W-[L@ڿԑ~`W.x;r4GB|nqg.<ˀ^Uۢ \t󸝃Ł4չx0.{V' pGrQ狓ed/d0&~xFD[Wْ=^46'Bƶk@.wGtHױ,¡nRxХ֡U4b4eRJ~;m.h 9I +YEt&~uϧҮreBIPJo0p³.1ѐ>-_>w7)ԼCsf#ӫ:tWOolZ%a{7(=&YOQG{V7IOg8yVX#N޾Ȥ؜8Q{rek(擯! m֭GI_hidV Gd:&V#,w*W*3|9疇z*CuiB]/_>''Sl8 I$*R(jiԚj="YDpQo[ڱZ+qz>bF;[G]&6: x[g^#W!V^ڶs[ >jZ0lWS7WO8m˩Re][n\j%K=?/B控DFA@FԜ桹þL8i- *QKL]f%|b\zK.N\m&x^xQ";#'rl=Sna QVz&IQ6`%28Ɍ*Sl5]A*-ˋ zM&,G܏Tא-Gqypgqq6off Ʈ tHkhM?. |T2Am6{f6æGC_TL6X=,֏#9l52ah9QcqhFBRl n3$u|GM(/h%ts[*݆ + ~s k7$j"`h*ze\5t'-s)>m i'R}>qu\Tp`>S[: )/*'ĸ s|vMGvZL9/? ncE}FMe ;qozwY M, 3Yؠ/n .Wq5f4xw/ڂ8EO}f7E ]\x Xre1fؽ84C! wX>t /KnOŕs5w֮ n6yR'he[Q{jdBٲ8̵\y7DK㾎' wR"dOlY]Uy.u/k!\Ҁ ‰qGB!!s \/3BBdXDPT5A4!w &(@=X:z?BՏߛmxcpS bu\ʠG%R}p(h%XFq<5c$|WN2N@`sJ*Nu]r讕cƔ T4k bѦ)[V9@dIfEax:ߟq%b֍:O1ZM*W[tH?%5di?Y< T Pt'ܾJY2oE%1Q41&Z:N} ;_熒-J+Jo5}vlWח(ؘw2,WfQwvz֨flRGw$v,. 5O(Q^v^ R~g=q~.Q ||P:Nӳ=4rӴ\lAlmH9\ Fdb+ ٷg!9E- ƅ_gCc4K rA. k{!QASrˑk&f]:hUk8R@h3K|2NDLam 1 qO`Fї 򭩋J숒;uH. 鐚^5>ˆ;}JzGunBBEUDM)Lp#hT _rh>dˀZV/<eL0 #R?T$=cS ݟKg5w=b_+ CMcΎ.s wNGZRtut55)11={Uwјd%vFbc?)堶b8dv$P'g3߱0^wzxt?Xb r4~*WSB2p ;iXYPȹr{Em7˽(%pg.+&oER2q$Z%8佻-u_8^&r8֩0pVLMl8sIK[N16^x&_Ҷկ6ɓeCAB+Q#YBi4zj}%-Ob9Gyw^|4"]K?gv8%~?L/LzF$Gch7oLyWW;FqDOеvl]#A>n9h9P浗k!&VC(b/ɳI -Ib]\_~w`Dw4Rgo#{sV}0_΋G(C:%>Nl!)U Z\W/uؿU2oUL zE۽U(} 9كxbw 8\M2`"V7n뤗$x9I&ߔƕ5s(:6+e_rïxPo2K)GAg*cgD,J,;5#\]dQl5AfRĘ(Y&F NO%ǡBކ<WhxLJg|ݨ%KL{$?-o 9*>2χ:b$epsNXqDʧfR&u%:hW:RD>->& DL % 'r[˕zЦUhdʴNzp;Q^0QBQÍR>:oXe=%OAMbQu|qQ2g{ ZPӠ|DkqM@Zu}Oԣj2d㋾TqɯQ..#}FOC_/`f]е٘( $@,s )e)IL2(,r]XU׶J~m$,(!{ \8S8e-< HU>E*ArGEcyfPHR$>1N$ުjG܃͚*˶{~V =v:2Z~H_GxO":&V[w4(G yp躟O2A黸Q'^I0mw(@z2 ]Up ]HqÖ 4'>JWM52"]aitR> !'F8hwl s+p,Nb lEa<Dž9MO4ŝ_ɟK6{uDP(qo]FgV'p@.NR"O"qr2֫j.N3%΢Q̷dq;IĊ'88MGtg%.5}wF~sy16eG"plcZ|%v1?+@a0MR 31Ż j&Y?z gG_q uG.k5D o(kZ9_J~l}{G ͻhj^;O5`ϒNa۷әʈoCba8}F /'/peΈ*괧=a = O%KG^=I]iSkvѸsv-ݹE6VF`]*2A^k8S'vr0qU.7, `wDҟo$ ]ec7ɪЊmXlbiP;qYK?wE"f%1uGgAF9mWfoHbdP\i;sLzw(roH[5ٺ cpJem1m9$Hrj5+;!!86B0r"c!# !֙ @/VW/p߭g`wozme%ɬ/_v>mmBNA Eۥ (D8{qAg֝-=2hEKZ}_*\,P.|EFL`gB *o 7 QP{G+xzߑ4]~uq]:EMPLXh !KjH;R~3 VUdB:>G{GEuA0t JHTy粖ͳ1&'j>i<~?m).NyP?AG=uyT0sHjXxgK`jOvfM :Q5 q+'PZɪ2:MMP!{y כ9 ByH 9~z6`J($=/.m{OCva[$o .ђQA ~,O8#<;\視&ȪP9 r-L/Fꑤ x[-NF놛 PF=nce z'@p:$ 82E*!ZhZutQ!A C'¡qpE|M6ͣ)aȡ(-H&Efx;RnPt!7"~_+oCR(i`.yc7CJ {`ѿ,p>sf=1 L֜>nG&jly}ɟPЅ5 |[FlE,Q&X@Lk -@u:B_-<+yȁ yOb =~^B߮EH@1 8J5 d.y̱1"@e4kvJQ&}Mgy&XPFQ;uY9 ^FLKh17B6zݿ|5c.9\?ǬfZϤF4 t˭)p>Š;#* xYm4{G#>Q8 n4EWnwtgYe>iȣ5NȽKSQȎ )/:ƷVm5,7n^"){]XJwnwpb n+ ̓gA: l*l7CNSG @gn]y4 ޛNtl)5ڭ\;n2NzP@xuuMbmtgv!XүmٴCI+@}+ 0ᗱaWoTzi\rz?֟'}"+Cόn#ҟk=ᑄ %_Aώn$D^g!J"rlaZ-rEV@sp&>չhjӁ.ѷ=O J/9/e%vdOn8mG) e  NHD9Y&l rY_ԸEEwA&(⭮@ {)G49# 'ykǿ|b̕7b(㢔XSm幈>%,>U7LV`]57YchVDL±%q4-) Й2x,5Ya-&p gI(]S:{],+2ۆږRN!B I3ns]e}aC6ъQmHV&D:EL57)a  IuĆuS!8l玈H?$lg3W([6Z`q?vLx Y(Cܡ951]G_rrb&%:CEt|P۫|>!|WZ7=1Ph*O=u+ j ?ש;sn5S -kSE>4N)`V)ϵHJypݬT1  2_DonYX jT`WN͞,g Z.{`;4M2 _@jkOC1N_/D;! MlUIU֔Lkb~6ÎRZDkYj VnZM5'hbmOV,])B'YvQyJ`LO*KzW{* |C/'(R-c7ٷaiΚs?ёIoHxԞ85E2<,^'ٕ`!?^giۓB锁9ӂEY8L I\*r-/^ t]H;mܵ.FI:${S~GYk?d0h ug-CnuM+.`1 o|M=U27-{J?|#yiJ# S++@DˎVӭoq%]r$wnnS /1'u pk̪lk үuoI-14/V"SR/&ycw%Eձb/6Ľ=!p5jr?s+ jת.%Nu@v"U07 EW3&{5SP]nڵ ɦLuc\뱼ݖ|y>gA|P@=QAb^lxEA-h/6I- FǞpTLk {X]p ŗSdA3/u3ѯW EQsr(C[KXƩ>Xo݂/ǎ "Y+jD8QCK_[Nw[KhJh@aE"Xi)oTZþւ+qo8K|+AӇ o>I~n xPtv(VSq _i0G_bJPh? YaG5o QyCsSZx~xWsaPX-G ^kep^[t[E0H3R<xu:Y0N]%>x럪Xkٳh=焍{1m рjTB5\$Bf/pv5uc޷-ν݁TY!p( u EN쯳ytbԈ5!]@`1[Wub ؤr}*o%P F̎h/H(ᾇeTO 1M7qxecNNy*My6DDFOCǕq+s/jQT?pte2l p^:jj~r-C3EacnNRx…ZpS%ib6`BAUCqғ’Xh#M޳wFުKi]bSe{U򂆲o+E:H2LB5޾~Z ེ L(pcLMW5Z\Xalo6~.>jgz. (F鄱^y+GXw,g!D"*e`?Ŏv,z5MDQ޼P1]夓6SP㥿M}xXFʣ<뙆jϥ1Tʈ,:haOaͿ]8$ ]%#w )GЊxj,akzj.*KkRC]G}x\MR^69<9"7"& 4hI! ւˏG<^^ 7^: n{4l_s\ /|z 'ߴFv)H:@wWrXŻ,_ *pN|[8shd@Ch^g"r [1hN׭=~#:F:7*42A >8m6'YFc0 v`&G'?v |j;,&z54Y>20@vǣ<|l*q $3/Uꋨ_B}άƃXKt)ЬlWL R:KDTVr&SV{ 6 B4!oJ$ű-wWg-ȂvƉ-H՝a~LN+$=P[!"yY)&_^._2[[R3BWSNXdN#qC wt&H3p& `+6/ , 'ֽ\8F+><uܚ!8:xp!BȐy@ ;2 /(8"q4 U̺^crp%(;_=vW vOi狎1=nCy8/ex Xwx;MPC ,TG"3#H kd0wAR}*pĸ6KTm]!'UGrY:1yp]a;| ̱,AJ:R'foF tFh +pᇗΈG[{V=F4` d>OXˈ"@tWw6\>0۳1djΐ-=*&Iە>iF D4 l`ⒺR76c f(.|5g1=$*oONIp]GٜteG sS~=k M,,-g;|þFNLG .Ld(d⭫kmaR{<*-&78m9; >QE S ,A=%+Na7oZ>2E777&?ZE ,)NYl %K^Z'})l=F3 o [/Y^ Th͑;+!o fmSIx5'OQ/cW\/5MR>ێj^1n2IE_6ΦI92FFT"^e }u@f < v:Ʋ_8Khl!tE5p$wf|[82_obxf' r 6dO$S7m4Ip_:Ps lݕbla=/Xi'E!lk1*"x3iӏ]0,acl0mM~ݐ)(2KM휓Sd9P+^#}ƕu@t)qu Ѣ {.轄TńK:)k|^ܪ$wQ(hYXΖI=YShjad`yr wW"1h-XšF)tʧ\c)prY]K\βnݽOQ83Ed}.˖O/zvTi=DDu|@Bcv5Zgv4$İ6S,]th3#ދF[G Ddz~IlEN@<~m>peDh<7XjBG0/΅#xD9VZB?ixnǍxH-^650TfI`{JS*Bz?*cm{\PHVeS`- Sʐn3eh=Ajvǫ/FB.c*WZhd*oBo_ʝ8A⊫#3=s)!=^]Y¸4`f?l=@ʴN2A6u«Hnc˒boYyO6s*~ yKO7/?C+FD5\Q0 bL,pV(FpWD5I*PXxl'wE^R^dom]A80G}.y|tG euf$x+SٙfHHved}tM udˁfSЋX\mi_Rs? D!a$܉Fōpj})=ʯf}}m/bLTx2}>&1Iy\ܡ) 𯩿2YtrL` 8{xjf433XYӦ/%jدMu{L.vW_"޾lb')bN%\Qfs]/Ha'I/`}A yPC HX7[`'N@63eR֖(ZX(?k;3m _lDY( >K FL,ũZ;8+jM:%ׂ\4~5̑̒ӌ* No]5OLE^bXqAZ& #L NͳߋMĦT\`sP;8G6h̟7Gm$Ihjn(~_Yo(DOb ཎGo%r[zG1' í󵏨pmBzT!8JT=PL Okݢ4E׉u:!+қY}{ 'VIJy 5bPZ怐ư>%`Ϣv6H ~%Vp&.$՝4XX{Tҩ1 E0zpʦ(noiD'掞9;.lRJϲd8C ʀυ CXQ/m#Cj)ecn`T zSk}fl`}/QZwsGpk>EtG0 ?BbgjJo&k_ -CDCQepf-=f\h~Wu/ݝ4I([B𝥎-aܯ&e6Uĸo`S[{iⱬ] ~eGo&V/L*<`520hlnfYm6_$EPJPUJ jsNXWl ?8zHc.WI5$,_= 8 JE锾'\ߜ^6KʜL.@ht8Ę}&arB _mnSWkRs̛%RֹfYaUڟ6w4S7*1ŕPW6X?KD a?PC3beqSN'cZ8$P)S~zUaվl1mJ5RbR@J4/\`tmY7J\'8d{cfkAqgx%%EX-8ro8bqഝj4hyT)o{ݬҕ=؆ 8i @.ĄaSZ<q?ootu@[s!EX`r f~t`yCiaĕX3 10+aw>/ w \–?a)wb^apqshWϱTxM"<JG lnC@tU~_#]!(2d! q7KKj]6cV,PԔ}T0axlS 2'/ <1}Phm F@bKaD |-eR,8˫D2@NZhꌾj?i|GEWyDžRcY_xoW 83Eܨ ac`:UUk.8daѶ6L"v7p۽׾3[ʏ}_etnٱN V4wώ*5A0v iEln9 {z׬|@)X ћljSί!vN$#(+`=ryoj0{ɭ%Uk5*ա aAĪ)n= 6;HQ1 cuZG,va4#[YHV~Fm?cQP`z`y r ^ό@楸xb3%ԤDAbJ-CY)8( Muh\ljzE[jQT R7̏=ʩ]gfr:{ﰭyO@>j|A73%pi% 0r nC%!O$^gy,hU4D=pl1(ꍫ?p7Kx}/kH'5N \gH` }s ;PsGؚp@ Ϯ4ίU5JGjJ|lOq\lY_XeXc7dH8#*tV:OiBͩw<۴|K}G9splNc"8JG36~g"+TE,o齚ڭUwr)wzɖ(a1 ZA՚`+Կf9~cAp=QF56a/zyGt2t l໹5=pLa8P>w#i<hj| kUT&c\b@3?<_wj>jNwwO!1AIcO'R$$> wu SJok/ࢢм¥aJS 3b /EC6lw68uF;Q=;:˕<'5U|?1v{&`&5Edww_xݥTl~蚙Ru$d &)Yq"=0i@U 0o|:+k\^"y/cԗY3qSySV 7 Oh<;q`&u1g||st1 *z.Xjpiy>ɏ(f(|smiŹAkzǥg%ZHLI"OHbJ h.\trh+܁){Jwf "uF6)Zfا>o.vHi-`ͮTh(:Ix{5K*KmRDt;l;_)tx.:zY/F%ko#CNzw>z,Ж^6@(\IШ:^c|/.ɷůN8=aq SC-:OPHe*4S ˳պ ލyp "co>?%H׹_!_$Հv|pdxVպNrYB^.(:l U\kM .팁ѻ]ɋs N9ɍE Dhp8VS̲_GM^u M-i!mǙYl@5|Qh`,`-_E2tKJɫi/NvvJt֡VQςR*pٱ:_R~kiĩSt%6Z>A俥$ (㻰_X-k9{B".L\9Jcl~a"-N[OU"csُ% 6R@TK [%]!$$?$'}VX6qV[){@X,J$u_ Ͻ`; jn #PQX&0ኵ_L2VR%(yXu\{ lmxoyij$("f"dtfvIO7"#?w&D BCx"+ea?L͜Ne,cu2??9,jjIY~,MXloUwFi,1hŧ"J>;B)B77#0- w#;tCw! 4_~v-fѻUl,LI"/uӴkPts4YG|HMՓ,/KMJH 5u[1xۦxH9[=.cQp*cGr~q&E߷pT(Fͽ_|wuwq9pGQ׈m-ߒ 7KmYuf25-sw@by(/dߍɟ-iǿ'[Ȍ%"w=.RwBy#? r[ɟmOf"?~P) bn/iɉVs{OńUF8&„QA gx<%B ۀK?u\-e/ _uedcVhjѵ3s.0 @-tt1Y->#i9FWU{U |M qSw!F0ǔ_;?sfGb5ݞd0IMx&9+6_X!sVQ;peK&gojPwb;͛vqqsiJvY]8ս_G.x }[ u 3Ϥ>7]ZzA1G4$"!ލu"Na')[e\O,ڂyVʰ5egY \'O?hP׫Ч}ՈDbXHT @{]3lɫdB0Xm`zrGS%i0¹+ځ_$8b?qmQ#Q<1&ρNHۮL{HjG }Wuh|tp=PjTi#``)bMv֦Iy¹Rh!mqfĵ$8xj+TGWp7'7 s1l,Q@PFittoΝ1%5˘_&ߴ/oGIW,7c,aI6ڬfv;W(R~}-~ыI,jE_WgڷeePGtTz<4-35OS?R =xF&$ENepf|XIcEtM:!&]Bj3NWN[b pV>TQQ{^DŢf /@/&?moIS}DD#A Z)O"Q/{.KPVAgiyK[rGGA9o=f9w^:d⼻xn]-pټt*G]' =Ra#ب+ < P(tUpf"\?ED M?CJW%ZB6¬o1ܟ!C [Kմn_bʛb!+[!QѭC-!)6{$&~D?)>耼4lR7jo, /BR`@ޙ)Z=+]3דU ` x\UrI4֢]L=dSu#5¡ĔWS2K .lܳfl,<*`@86|) r֬}~x9uW2.0 =BVf: 8P~_K5⬵ +U4~.*ƻ P7ljԾ"-¥mە9H $u;P.<27UT9uy< zwgŏm qzfen@WAQKsVV~6eb69asHƑ+]L`2aojƚGO1aR5.G@ܙP~z׶\jکDwOCEojpه[-P 5.a(gO·fbpԁ# mI2sȻ&)IBYckbzLYg@o|g̞rE n%8 Ьv@@ 00uP*Ey twe UJd@xg)WIGzn9^ $_hLo>$9P?^ɮ)2h}\|x.dV8JqSE=~WA̍ংA~j#K7w3"RccQ6D-ڵtn]>PrmaS784B~J6bi+ 6A7fYGE(z.XUl,4>6M-YN:ɣ-ty4-H+bs!%"W$"fw+]qKǡ{@f$,FAH|E~4*nˇf_o. @dGX*% lŸ?VdžJ-bNZv&Q{Έ$s1b庋Xf#?fFA:ؤk,!MH- [6N 9T; a]1T]OYuE" #yR@~ƾh{67꛺Oh#S Y+Y<71#/;LqI*꩛dOOo_]3d3 ן.^MRT |)žTNqE!50}gW:HE:ehLMCWHdpfm&JE\;(M2x53 'qd;S=Aox0a@DˊX(Gf**)"MXhP tn.4O-?8T,k簕X1<*au ]IԚAwmϡJZyн p LW1vɷ' [@اp\cQ,]eRxU0F&q*^_8VwGfRǷn\wS0&zk'!g,}^/9 ݋N 04.D;k/_̼ ]Cslg@Ws`Z{]jl1޳fh%k3m%?UtPovxlbM*( @K7 j#ѕYeT7~r Rq?EvH精ηrÙLP>\gFdf (8v!5~5v6'oZu]EE5wӖpQiT1El]z7Z\Dy~!um)S$ٗ6`8iX'<\=nnnSRd='-,SqTRv2Q)(J=\5+_jmq\sBO$Cʉ,)#Uj'S{u{硙G,/\"BcL0gK e|lF1Bu̇|ǹnL=s? Πt}y`{/ZPl]ҡyB' ?df풻d c}&N ,m"`HoC D~m]_o9ˇn%.}̵';ZpЦزAij%)b]%5=N1xvm`5 qfǝπs{vy|<8 /_H~+JНz"/*jZuVa#_GKkKRntR?OD@;_#oO~I=I3Yxi}GbyMmޮ{1=\3(\xP̫2yx\ G8UHp}$ .A1ײ\XĿ#[\/9xr:hݲzqlՖs* E<]XBț|U&.=܄k#Md;4hcu\2fF)v9R%,C5ld>19u7H]}>A2Om>?H>Gij;[hC$ƂlcM|i%ɯ5IN?F@ɮ`W&a%dPGjMBK̓#wP2XY2xy*VXnL{D kI,iKg/΃="pl$?:"'T"/[̀{N9g,9M7ֻs |iyb~k:v&pI1cu j5uT7?V9s1; 5kٶ2 +bhLL0Y7+=͡@|kJ ܐd=`yD'\^n * M@49 Ĝ"Qum5@Q35rgQLn9;u.Ӻ?ͬewh QU)قqur#O{쐇H+K&9̧5lK<(F4EkH6Yx(_E&:r~|SuJD؃+P$AnĕV݁GBќw@~1ADU:*,L5<DE`J9A|ZzV8qИM,YM(1 xzfٳʴ~7Lu$M)d+nZyN{pX*0a}m(ɘU&ju!cSl ' f>-ӗ#TPQӽ;P:6.V`LZCRYg/9tW0Y"iT~l޾HXDGӊswi1=)Yi݈̲.wX"&J+X66{98@@R}wGA>/[* ><2%$P%mg+)$!aD&TIBꩫl/Q JЇi6rC64֗3oo ;lè}ݞH8Fr٪)Qӻ^D_zǝck ǓW;YE7"HN"%W8ɐtVUUy=t&pB X4 c$Bv%;IV?}/#M, ^AJ|qAw>o`H{Ƹ ؅9/&RJnkATnV#y~[R:mMl/T|QuHs{G-TK-xd67yNpd/lyo25^fO 7`GcA=Q &6+$eDO8$Wu+)lqb"mҌ,T(q~T~(b۹K*;$vtdT ك"n_4MZۇY>oEa*f m@Or,k23_V)ݏk -lj+ {!ǐXD^43_C*JѵLǙz5"ie;z jLDy&V~4-9:c$ުaȍ+Xij*TlNQߝ`pnMiaj|yx:t"s`>8ft C3( nvVgSA:@U-%Gx" ) ,jDْ$>XO2! v21ι4"⿲].: \O_iq&lF]8~_G1|3>CCX1U_ƞi/f4|!K~Tp`$ XM|?Co.!|].>W|‡vjM6z(@õ\ZV75"ww,[FruBp ֗H`!J6T; u4>X"2+"E2zFe|^ W6!v} b&QAgFa"<>K_7S3 Hn7r܈Nϵdcq^;U ˕"[s sŀ%̂JA$A@0P2\-}[h1H| X5sIOBotFߗE+|FNUYi+ ^OLUT2B}/fSlBqlW 2 19GPvgŮ|̱/(5G&m5q.柽ݼR\ou^瀀ekF#5 :t~UWm}u[-tiCbR4c|pr~Qܭ)nZB߰`RGQ7}_4Ⱦ-;=2Rȉd).̦1MI7|9oW >Fs zXHMuiŸ){Uu8%H噧 !}fʏO3Y&`Qw!RTAg{'ٌ\ sI/إX5)TQ+eI%~B̡S1}i`UH?O|0?ҋEN*8˧Y0]20eQ}cCC3)5fY}R`Hndi⡧9f\3}T:%{-HUl }۹s(_#2lώ5缇/c1o h7Yg2) .əUC*]:Q~n1'ƱhُSP'>Z^8\sQ9ImqE"YdӒ6pN.|9Fd4?}pcűp #{-?)ט޴`uuM+5Wt?ʯ3%0OO}03 |:}7X%( ,X[ 7wl7I작)RԽBzaJC _Х<5[IxiDgi}qtXA_,_9_c_ԪRaKdR:)HN6$hD}l\eP oB梊>/E#b#HꡳἎ[$tݻc|]1_ܖ%Nny =O NfF ]TMpGHS_Z;tJqjEw̕r.)f~Z{kn{jCGX'pbc4Ͼs~ A)*9}52o7cY7O u}ƕ<G!jä;@e3 "5(l>,mCJV8Wkƈ {38^@>hK|KWFF/_N7 cALȋ f}\yYa 8pƉ!z"8e$qhϣ-nNcxUAҧ~ja> s4N}aB[Azٿ W8V٭GfX~5ǎJIEw,I2M޵:ؿڅ2A*:Uナ X@LUD~1SGnUde” B' `N|E$ .=! 3JV`&ܢn.g1OPKt"RC?d 6o*Nd.7耎i0h} 1D~Puiתps+ww$ap6GlY㌕@oY>xf*nАt8˴`] =Wh˓ ]jºYѬN· ꙕ;|P' */֡A{:[:el&SfHX^YԂ)wJv\W̋8NmW;@}P)mxd{?X뫱ٕ黹2d~MrpacлԗEtzf>$+p ;Q 2bqu ֔7U`#Wr0 R³;ǝS~bhOoWX-ӧ QbdsJIDUxk= 72wNMim/A*>X!ԣ,s 0>Ev'`ļTt8{.삛;=[y@5M(^Bs;Q}=Rixff8'W~FNw(b &p <#v7'k$&%&)UC $y6e-,#lpޟ"H̾ugSTRM F׌WO ':7H2>_=tpb .U{ zfc%d+K761Sz&[UWyK" Aّ^7ҏ-MFVkX{N1ƚ?Wyj1<*^."!ι̢%\d‰+`!쯫l *( E"ܝN0slMe&]$&WQ!=~uyZ:|/ >+]:F=|e? -"b줫:S\۞4ڰq_cHqL5vڴ,Ge.cq_4zklBE{fg[0FwJs&ϭpYuH~SRuq-Qv _LtB޼r8 h_ 7{mho$`g$,t~>6xSͣy!⳱0ϣӳO!WScmc­m}nm\ ϐg:QcƏ CŐA]AXa]Rl=n+bKʌjf¯bu4]U?bǢZ@~إېS2JsEj/^˅@QqO9iU(P$%,T }qNkKwKL-*SK`+::>b 6"j.,2ʍ3Tc'.6<ӝc JD#U)ۡmfJe7G&=OOE:`Vg1(x 2qܨ@NNK:b d{f3Wc5<n#6c=QPW)#ȃ,hK!6ߘq%zHcN#sQMf+7Sœ|p+j\%Q oeXB-T >w-VɜERJ@>XiIOJe0#S?dD p>Dߌ:~ޯ?\ƈ` s)HIɞkvѳ]\iqN"&@{C~?ka QPI!ԧCBb?'Jci,O@9MLz20Cז7@܏0d2;ς]*ҭ,2F ` Thvu%@<(⦰G[Y:ǮN'# ȦMufjWrx.גB~|ِv6Ĕ /) 7PGY=~97LI'ӋY>|Ō? h uc ^:n>F wHl"Yi7>tHSl;\Շ4g%ya`jV(*&~gŊeE@Qg5n,B.e7+sKA?=[N @CnBXhC%A,)" SKO &5 qt%8S!mGZ%) BxMgͪru`΃2wZWNuıƳF3h괄A;N j=381p\hEJ@1^@oWnvigJZ}Ըu~H,jcHѮT+ILڡGۨ!X{me!TY h2?mrǗiyٵF긦1&*ǿ;F0y ;ЊAJå|❨W4pqۜzn@OKJ`ߐ}[ ]v"?*{9ԉO|L^ʊ#K 1Oeo)1\A].qKt  8kT 5$fpP5 '󹨨MSfՊj@8t)o RCm c^!_U;SaD\}+FZDp?;P4N6dbytu! [e(^NKzk6!6 q!ѣ3~,>Ut#eI q' +ZwxLF|*O*Su79'4.vTʔ߫CQ"ٜUC.!n5oXLg*pم72o29&s*gff  |rf:f.?=tn1RKV,Ah =7FG:TAKA9s^02:Z:NbFN9^;l%˅n41grZکf>u^c:lk4Ճ: L4~J4}/;BuR- ILq廸RpWR;0 85gOE&jM&ogU,>!@Ty= "`!`qxPƇlΑ#o!PMZD.br^uHofu{|~X "}Ǹؗ\S];{fgq_`i}μHFc܎KprOe4H9QE+>ᖙ5Ӡ& b)# )X?:*ͨA-2Z8憆LkuTpƮbaGgׁ]9uV3>r5?C}ɱԓu3KNy(U#>yBA_zXPT_R1kċ0*ًFnpIr;)脴 t]M$U '1 AR)ƠUp|+!@s5}%eWRU膰T&.⤋];Y ET:s>mI7{D(F-4ͪւxRy`9v%`_>$թ<ͤjGa6*DXH-Bdj9%G vRa.tnkk cmђ* -n[:g%KvƮXoZLU*⏟rAȄ ;+3O o5H1]A.%JU4.2]x SK8+Ј* #Eģ8/dcDŽ1 +- *滲OnYp暫|9mH/h|ad4]_0DAlKE@r[mL%%m!'6s!C܎_ ]ON;7fѣ?NCwyQCD I#E7%˿.D%7986UiGi = &cڑ 3siɖ[m5|vLPuۂК;C5hF" -AXFl[_jȏNv}&,[c9>~d_x,Ɲ~K8Vcuf(ʊOyĄlDdJ={yN2b X"!VwYDL`m4i_*]KG=''xkKN 2_l @Ղj&lƩKG.R%+nfN(}Z$AN ј[Gmc6wErNr鸥>;M>(;G;~)yZNMi]V+~-WmFlkհrDE38%N=Y rVęh''4t:K?J5]Hķ,Oe,ܛ0WX"QI!+=)_ P O.bLS7~ܪhMЩ=TP_6yoSi܉!3s^ZޏB6KMVtsC<,ȫ.|`)ԗK>k2f!^M{VV"Fɶ6;na hd"g"e3H?9 {f!s՝}vS}7 +{ 3i\6}Hz%j7r Y ..y^#°Zkŝ_ji?iڵu[c_9&ǮyBl!jĢCjs2cI1{M rLb\n͒W-)Q_5}OW|5EY`PIIKň\5IiVx RCF0C4x!y /Cdv>ep(+璿ќIm>yplG$ eKJ)0.n$Xb Ơ-BNX ˏW c/<6t9 D ϓǰOu#q9Qy]_i83,l-";7&`9q"ܹY{o-s)c9\ )nOcȟ*fo"|T$AgW שQ =< lym[~-P_:sJk7 0B03X)ԛ ~JWu%3.T?V|)q5Z6 4tZbKWt ru GI: F ·"?,z;\WZ1SQ纤mY5j3v8$ _GY6Dxs{9L 1[8, h)+ I^ީ-g1)AMeݞrՕ[9J#݄Ӏ>*yO"=ؓ0#ڨhssrJ6`A"?H0/ˌcAwψ31_SZePȹd哨`ovlhfŕdlIi%dWon#T&JÙ ՎY;=NfC~f_.>W|X8*@yFB*< {-\0mie`$eg!@ Lj%WEjx;E]^w[c49N*%&C*0ݙ 5hwVEyNۼ<WQ%B }~7{/BlQ&QgNo9TIlrg+\Y:27:ߩ퇎d}Լ8iʤd4/EzrU(Br*13z;0_pluj+,My5zD)E17=qQ6$>Dх:F1{}ۃ!1%tUcpS`XPt{n[,qw{tpJp:LaxN"]'a_Tpbr*^A:w͡2~X>6z)2GPl4g<Ş yyrP-C q#t; I+hB/oyu^F`t{ӄ\[|v'=~0h~YFcbyK0ؗɁ=Qӱ%sяFg2BY7[tWz\nj7zDr_xqr! 0fu2Diො߃ƅw$yDp ".2]98tygoB}#]d.8BvEr_/jZ!-\'u%|< b >˹ǦhCjB&]f#pq[6wN߬"9YØo3̇%rr \vY>'S6N{ukx^,5z\A:gg*oN4rEVϞٚқC#a.`8p2U:ÈZ842N`eCӛF7T5r!v"4_*TZ (}zb {ôHe8N^bk uGZ 0NE ?@u : }*p/ Ѵ'7̦mfuTCS遆ShPtQE.ⲝd?}WL r.DU #ڠ=:h,b>GfɲSF,3кU<0WvnQc-lUTxK2 7A\fqX!ـC א /؊Un?8~GEXwjA~Kxd,( 2-]2IE\ bH9 Fط[Z&־ka&5Hj7;\P~_ :0ʰYm͉<%Iy^l4LaV Py<{f5Xg25$6uESr.~p24KZ34!>GCTY2inif!Lp/`VcwsKi=wsqq1ΥF+ED彋`SP.n! WWldc#:|7]rm x.yLb8Jޅd 뷻=C 8ğ ]p f^+SK@gnNj *e?+qQV rLҥY7p,9sDiT8*\ąZmbl dlF$groZ&0l X'Wױ4fxsU5כSGgi1چmA Rj+9tPhUcNi[ĕ`tK41ZT)}ۧvi;VLT0tØ IGHGu~ Y [ukdžp|&qfeCӟ>p/,&ԇ\y+4T ēz0jdp)g]yPfY z]8egH|r*(9޶{{{Ơ"<$@|kH{F_T]NˆG($\dXU|@!W659.-1ȥHc^I%-vۂ *ʠ7:ByWJfdo'4 D/HEdI#l7P *D%e%yܞuد? ?g_E>a0zV%vL'<'7fN8,'F4n9DZnPA{ E\QD6+Zc)#"}pkT?=: !5nai)%/ǸZǝv=^WDif%ǡ UFnpXhw ^0 -`SσґATc'I;TxPk]_;xb CqPq?T(@3N䤐҅\+0_3dav8F;ExlHSnҁIg0\4ÛpN&Xv8c<>DQfeLJ3贼 {}LM*^ ]蘍v$ZU)kYz QOBY"c6}3D+_R"ޙOLlXH!A|k2K#u\ $ϒֿk m͏QϜy&k }zhfC Dhu̍ `iOq[lnFFJgن]f`VQ-{M\p9dF@Nj~\KMOH W^o.1FrrY"*$;m 31R q8ud:j-\dob腁S :B(oyyRÀ w!訵˼nl9E%\k#])&p*3R3"-d^##BGeˊN Ϋۇ'`nB!;rفu1\=b](W d7$eDF+ &#e[%#JcChD3Hܭ0RqufzN|t7wikJZjzܙ8V H&" ѐ=#'BZڧÓ:΀x8;ELkkב%S-J[vpXF|P׶ͩψL[ MusNVwcBK%YTQX?GR&f$5#cA3 M]Igva֏$|1MV@DFqIXafڄJ 5 f]H=p4jysMj"Q|J>,1/WugBVRR| axA;tcw )x@Ȁp=OuwWd3~Ⓠ12܇`'*HaUU<6hmRNJЖP8P5f1:kx!讄jjACi{ٔ?{ H@tky TgG Ji}a{Z@:s%_^ ["[)uM mCG9\gzVq' 3xdR띇4wr({8P\^ԾHeB#ϝwUO(ћnvs`kޯi#H afV[:hQ`WPWlQ:*] k2kJ5χ~Uh  pR7,ߖ."n濪+S 4?YY^7.SvCK9Ex&W)󕱑|#R~d ]KWFjcCBm!EsV|u13t8 *`b]vR$Y󗟡~×A%Y5,&mO `{MIYjb7O y6M[y٩"ܸ]Nvs` G-mгD֪/(0V F;3 $H 0HŷNBcf5%߫FΖ` oDX}Ub)rHw-J?$Mr)LA覐I0!"hg;?v 7-kMok5B" u2A٬f)jqdp|~(UA'n8*kTk5{&pFC0UWkvfeStv6BJ|2΅\yfp3^ l߷bp E\6GvhZعj2 n;UՎ`;fJsa WuĖ%nUaYC0 (Fќ1 bvxZGEEٽnq ծTbP3e_+,0F'W(~s#l H(:A>_]5̗$^`pӭ*SJߝ$s MyU>igO}J$NscNmnY(HTd}.g*gW- Sez9dk_)lyK#[4fǗY+F= p Lmp>H<Ჺn'dc9nܮn)9R)vG\ O4iޞi^KcոzL7jä7gi=LWUa9;IuF>瘵s ϭtX:sL=j7 Nr M'tR+0˗}}BD-+|DUQ'9 F(,XO\^Ǧx 4DqdhhzSg3Gu#9zQTS/siwκ G!Ga;sRPl'4E[l_#K@Ɲ$^K0$wjr^`'*ƌ S%|P@Y%AN'D={~K~߯߾.MR~],V76XF];، !B𱿲m`Bk /~Fio,W9g1,qBjOѺ/zSGzሩ*L#QN;>#H^vcʽ_"L^,ӈ^J%~6SΘGJqW5YK_h}Q)E򖒦gQvg [Wfg>xu+5SHMNyCpL݌BP:So[S~[߶Jb}/JL C`0 7 ~up;Qggʱ$S|ϫX;0hl>еOLlÇ81ap!1.{[y+]pRJooN\.Q^t 鶥Kg}> O8%EIv:6x?_Sb|wӈ${졫rG,oJsRuzT7wG[u(zrkKA1=΋hn2釦DUǢ@|Ξ#Xʛ7۷g,2bB'&| .W ͌˩WZ-\qj$SC5D'KYЁtJV1 PΠXp1 )g|N𗿺C U˺4Ű[ ^_PEMQXIaJ[u&yc-mLsGϑ|CH7%Xw@jS|As g0`D37?QGc0' CWx4HsxwFL}ST3T#V!WoqTS3>7w[$#Xs |u-T@&ݶ#q (Xlr1U!gҚ_ akG!ʚ.3i^ i*aiG0Y]CuF0EʖA6)rto F"Vs`j2p6j*hj;i~E Mg lĿZ܀xY/X.@X[RP)wd\[ 2(NX"Jq62UҌĢRڗ ,C3j ,`(q~}Nuiu@D_^ $㑸tβuG t8O,Ӣ\KqU|7u\@pǭcOe 5)fF}{@ lݟ>U,%Kv^f^,!.ҦE髁1a}mWORy&Cr8j#Pzٲi+ՅH쭫?Ay!Jz篧'E՜~ Dcvyx3eg۟M<5h6 iZA;iTui_Wh2%WU5`_ي\LVsM;tR 7,E ྃfIP BK.#R"dHaUH--+b6n ߕRr%ږHƅXXlh8|ƬD`!?NrU }GQmz '>m[0zKԻdFPSJ0H_ A{=<+r }Mgs?GG%glKbkM %mJ@[87W3`GI5iX3q_y<4xzV-7kA4NYFcm`&]H?Cuno͢8EB P# 2wOWt..2V\[D(5vn5SMX~8oe= Xe\Bf/md:b9%_Q "vtz`>%]~p wt}Sr<|y$|r0P!2g4Lm"Х'>yC,f#dM~w1tOx~xASn`M#]Q/xڌT&$lJ亜W0ە1&,^Q7BvJo3ljy`@LN+lX;ŭVXR֜'gl"\ҡ8w33&U0<!,ҳB+R@0epƱ(wst0sQ%?64JK4HJ`elg't) bvv ²[T% =U[\ѽRs#\5B'Xˌ͢B ZVi5p\|tCm<.3s4s0v 'x&9D9["9xyG]N;6v=5-{U OQw'GQY&;Ҷ4ts&Sl uv48Zc/oȖmy (uy-L":Blۺ ^>k{"J=K$W9m Uzc(-?&+TVS/MrN08c7|e`lU!"Pz" U&yRM?D\[Q6ؗ_HPmd/l\1 8L|/˚DdL(U*T%φ-:Mh;V=ϾГIYJO־:߮d]BW.)Ib&k\ ϴU$,d[KaDf0Zp (^ݤ3!pXcY(Dkծ4dedYݨ B?ԇzfċ.ks 6eM]-AK"êi+Kќc-1@c^=l#$i>驤үhtox&=\0]Ռu "He۱"Qr%ϯ5 #e1@*pSSS#q ZP-w{"|H,h`0"(,k '[RQ+V4C(ZŢ/NI][bH䃪d *J;lY7NZzZ'A&2 )1粩8xg1)3IS 'Bc>2__ܫ/8J@lHN ;HB9_pSO$pǶt!_Fs kf-wai؅9lg'-eLe}12\I>0}εqkU`$yL3H;+#-@{ڴK,xX2c |^^/6CRϚ]r<1bSdF-Q?]$E&7e}X`~>7@Rf$@7dА dN5F_[ ^YXm; #A^_DY!i L眯kxb`ďlvPY1ljW9Y&yžº1Pm#km԰w({\f-ejɣYbHdBC$B\; 쎎wJR n_z ٪!Ԙ>-8VؾONl(ae$RP}v0*Mò0G-}d]T/'NE'TǙzBWl*XnߙZ*ʃQl$sc`d9&Ҹ:pG%h̘D*Bn{L>s V.R]͚a|]s9^Y$<=LkGÙ״ׄGnPsYfFfגe/ 7'[́|B^^Mp^i:A{jߕ-)@oC_=kid+rX9Nj5NI*b*_1dJ;]c$Kw<#% "Mr{IH8jX.F*u!L5&#&B+wV "!mgREBZ7CY}KQelse!5Fq2|khT|?UZz oj#y$<%J1U<&_g]mf^y]<>bW 'Ž*V< ūegЬ|2}9ߜޒ= ֲ*_lB%Q5&cYSyVIn{XY}Raܔ!v^ ^(ޫɇdGIc;\)kg@xvm'=K$]ƔgZ0g i jЗVZ_SӞꓱu%DT^~:>^",R1׎qn4 {Oz!۔+6 q"gwDFOT\@ysNvc.AuK7d#"k81a7pl$\Re`D Z6Hs<FG|B[ wà! $l:QOD:8"o0 ^S\JC0V2,5ݭX Ko~7첦P=44Sq+I 4`̚PK:sWee]wRift_/ƶ'EzJӤ[r AVV@.76rJk|jUcEϦ)-dS~Cb)-(ݕbju>Υ* h\e0jq`>3Lq;+۶{E,8uo{ɕS08 cؐ!;v> X[cu61cVUȲl4 2e~ $))t0QJJ]%79 (2FsOG< U) cg" (ހVP s9pⷅ2>nǪ &uH$hHgu.cOzERf9i&(!`#w8hbP5ο40)[B'XmqjƒVH)X|h➁1Z)> *$Y .0Jֵ~yBD>GK}Zֽp3?Oվ+5fl(te{ԸKP|_p~IrzpBx9цx>6Rg.qX])uE: pp؟VqotjRοC*zd=Z~a :8H w'#NaedQ^Ή9 /!cx^<0K`.6ZB$Ҝ9_Щ=jkyq \Nym2RaLa(]{/[D k>F)ŕflBSO*OkuIYܾr>B*zA 89+4 PjU@O_KM;7C,"3}0JƱo )%-3EC#$-iQTȓ}޾uPO\&/ٮ%3Io4^⊙hXǧI) QD/W 1wKFO8v??ZotR: Loy0/igqyX)\ T ]y+A($1 QUƩȃ1HaT Cjs;,<ȡRܦ:.-#LWyRԠr2̪|S(Y֞H2w^65LU-,ܞZjvsg'2m=*#uzn#`j%~⼻u8ABIj92bdnbqlA*T5E+O{$3w16 Wm݄y$y˜my{QP@yIUpoDU#>Nƒh"8e Ȕ52n< 4xV4_Ja1;Wl/ ZЩ E9-Bᘏaץ^%\W-&ۺysaZµ˙`&z{3]fop?]iCDI="W_]ӰQppvdCT >~˗dHg{uFw'wB)E-Ъ[3˳rpCTèd:QMGOZHo_uUlnhج3%Ճ-}a8ĺ"1GW/BţZ Wyt^ ![TIwڲGoąS)Bali%LfR'+W;1U{"WGUɅD)+9 e\O9bcF8/g u-KDHR%qIW2uIyuY)~ lIh%:41xWYq[zc +4iA-^~K5[b/Xl?6IsC%51]&Hbڧ*^"C5c iVgX]$2.\Էif(o#郩Jzdy%w0 ZZT ~AW\'q;P1/ 1aK]p2ɟ!{[7'V&(<.-|,%wAU Ȝ5-oP]n>I258l}.=C/V2^6GJILZ/G!f9o( \ )̐n7,12'tV~zY*f#t3ңugp >;Zu2R(\i䛽R/_tkO|"yau>H(F)4)J^F*;\ 269=ƶtvO5->u?604JK[3&4FVp\+9o m\mV;Ttxӄ @NW^EAg9'uCOr{ŋF#AG~軻chXrd ;$W|vpc|, |.d^zcc/d%dFk GNtCp֫uBg?}Ъ|;IgLQfȼy5SzXyh{D9fLp7æGdor܅6Ivzo) >o7=@˜z/hD&ɖ5!|@]K;!9&Q {;?-LfP/!_WLcH{%"pFynl5KeڞhzuV5jeN6#h4#=[2Ju"38kP"haiL3aMhJ^Jg`_MydchX:*YxC&' 1T_~}N (NӼfv<%ox7*ޗ!0Mjrz[{Ҭ޼s rz#@C*Am7@sbO 穸5Y Kwqh$={JyADPobE},x', ǓŻ~>'GAҙy]AyJpׅܤ}&tݢP1lghTOB`( Wj>MnSypIr_=+@,W2iIޒZlep֌q[\Y;_QA m)"RfSɂ ?չrԃvNPG (N9=۾$0{~f Z 3m(bY95ޜʒso>s| _e#*s\͆@@eU5 ʱ(ᾖ⍁<3j%Jl 剌\uwc;񥥥qpCSꎂ-1oBg6\<nь3| ݯXĿ'C6b74wJ5:nE0D/Zکe'Ѿ>|5uOݲy9ʗ[DSF]M) pCf6fe+9nWZ\#*6<.> lQwu|4DxFMN>؇P`|wq#G4oLDScTgT꼧Wߌ O67?^S-Ν ȢC@@Zd9*຦ל&閴~FKl'_Կb7#nZ-ü? =e4kd_̌Ozpq29vF N 98T֢* *yx?lWkDJ7)Z߆n-$9Y I A犷݊f@1#LTk:Ӯ6Lv\΅D=u3<=j-Y^/_ 'x =NiNj)ˀ,9gaa4 RGqgKŶ8)q4Hx d?YK@c`G>j w4 <bjd*%TCd?uB/[)>EbQV>.r(c#+K5G|{HV 3߲B`^eqaaIx&h" oS9h,ZƆ#,ˍa7Ko&/sj5tÊxu\7AVʞҖ` / ;_xYh 26UEn0S Wƃ4ra؎5˓NէG{bȐ{^ 'xJ}rVh:rv W7UV KhNn4GFnˀVW'G^đdHr|ꍄ>mۚsk1=,4 "La@[I - s^n6MIPl y7]F/!#+lXgж<=ZًT@q&'VO~+H "yNO8+:6}/@^9O&wg nNd .!2 _ZjsͨH²pV0Q{f3qes'gg*-<JY r2b$ڗyzi#PMƳil]C_-QA9za@O3|%lRljM@ξ_"1ݫ~?;-FGWXŁ6 A¯>Q{.ɰ*c"nu6 (}/ 0niw3OԄrG;|zׅqIrh)Hy^OTu)Tn00AYUDˤ $ww1,6} f=YT|selJ x-8k0Q߃*ĸbNU+޻+AwR:="m;}5܏# L:[=l:i0Z-z-&]3S& ᫷xy@Fu ,j"*&#ސJA K|Osj KT҃/_g - - j^Os{ 0pEtk "Ab/|?0u6 -k2f6^%8m=ŬJލPdFV 6.ԭwE$xXE`&dOuY8.K&χT[!LСhBbSCs'(wb:r\\Y;W ^:%(&L!qdzT~P ֢;`g]Mnh$ŷE\ !m"@ZqXe ,̳ނ~^(OS;v$[9'',_3"mEg!ϼǭn\{e^9$4}qR]mJօ;+LeIHCZˬ!!m¹ŶD+tv#;A]Y7|bW\Cȹpz"q[+Cky)r~y]aG\QMlgv>)i_jLp-uwsE]o&\"}`-#݄) tnjO qas%~q͘s@,L7du ;YMOeV(*VZ\QQ>Rxul uȭ0r7OB!y-lwh}K`X #9lZ?Pu(O~ܫZt"$]m,S*<Ox̕(t]vE&-k HW(*t> GݻD7W`s~ȉPn79x]JS5!~W3W$z}*+`jNDԑ |T>K2$sb911à ̂[ H$IBK-b6Ӌ=jfnqeb%I IbՆX76V!꙰E(dt䑓Zجr!J nxɮm<5c颌Cy=ؤH'.9%c|o_R1c.|1s٬ކ_+@:*z6]H=zK;02#'0> NZnef;+|&OMWjp;Q]:ne(22PR7f.}NiM `= C~mЏ) Ý(ԟ'W#xjarjp֟q`^?bK8͘bUDG34ZBzbM<>le7~j9qa&cIu|T#q[+_r%]gSiBC㊱C &VѨvR6GSFTa;ABi䥴ź*ğsQqNOޚc%4>L2"*/YYTjuʃcKX 󒈭j"d(Ӻ`?Y:wOGj );&2*GZ_TAt8j3]s$Hd (D,?cczv?P;M5c)bTHWZaelO|m6b] Tv_}IrH<0!^BozQcQQcH&Qr^h\'F[V 01S]$9?y}zbr;i#)2;_qJ:_m%OMTug8ZKE1Ӌ &r&k{FMō(dB<i&6l]pH?b9Yo̔_珞9n~`i"O?c<_"zvJsoiTy1Ԙ @9``vhPtcͭ`+-ɴkpi2QV+I'm&"6"\.{=^~]ħ*V4,g%Q P;a튃^Ma}MD|qX 卲~EZ g?IW3Nhe#͠Z{.Me^4+n.7 ׈ҌzxTB_ׁOjsҐ `:wuFIn.$@br.y7n+VgK"ӟ1oS*{j1М6Y\jF$ ?J$U[ĆL!{K}e}e$ҮC(ϊpO^sJ6 u^ΐCGdP1$]S/޳w*qIkĹ}=:gwtr3M4xz c 1k&E]ZٛX&5^1W5X}@7rɃɩ ,0Y(iMhe-b(b"d}ԊCгǵdDjs: 9XO41;&]V``Y~!E%D/Xtk4wǬ& `nĤ_nhg>ℭPbv:6 yxv-ͫ,0Bw, \ǻؓey_lw|C!%2xm}CF> Vڎ}=ӭNŜƊ%.m]` fzF+Si+ 4,D8z)bVw([OI<@:, Sۀ*+_BDĺu(zզ"7a(lg1 44P%)%STn:0J5K2Pri+] u>K^G0='Q`n OGA!C5}ͅ/P؀4z2]95qWT}5:9AU#FYTһ/cpP2$(d9*d}L%uHqSVmB{D+ɩ\R&+֛=ct>F8мO격z1XEb/L6!kUF̣?䜹4I:E+A穩9Y8Y U{4$zl6W%dgTaB| +7 b4l%K )@-d8yyDbY*h6tB@3e+6--tsYElـ rGRہ,f Ȇ$[ 0\vТ(`LX^چȚw6z׬AYI'B!&"T#GF#k+q72+5eO )؍ȅJ9%Ǘ ft5q>l/y]]mRgg q܍-@K 2vv,cgMR#^|\oLufcMyT,쩒 YQ Ce q6hF]9T.S: D.(P&HUy(z$63m5ނ2I'V_,J81~ H0cS>Ngg:{VHSà?:T P/ [!78Nի k[ M{_bC(Cz8rms1V42n>~Tɡ8JjSaSS,'['Ah~o2SRZ:չNx>L_@6Bi4МsJcZ@tT/IP]Q_#Ô#(jl_,/$WpxvaG/>qKMUOgr!lWRx4c2woБܫr'foB3!9?fs+h AliogK@atwuOaZ *tƋ{Yb6/ߖC_LD޺dn9{k':*WI,`NƔ!&1=ICWL}tIU)c 43ƺ8UEKWW!Emnh4i؉, i(bO 8e,k?Dݔ_'6JlBE\Zg\tTWHXGUWWXtTR>KVLp[ʡ VLLZH ٧T*J,{ fbݺb!5Q͝&Hy+;}`DvJ!`I kq7F}`dȕ%|ŻZ He&H %dv ql!Kǻp]9mc\ż\Jc l b+vusPn)y:jJ`*л7,AAnjZ&Ђ[+[A>2 1%BMPfVL7D_1/U(C?>w 0S xqa [NCw} C (>3<|bntRꇘ-H? ~[ 7wy4anp{`Yb+?;VyiwmuL)M>FZ U|vF3xSМ4F3GOō0լ]ʣ}$5+.Xp,/Ova{||\=I)wqeS~A OWu8Nc3,$*)],pO!`D7r+ϰJG|*u@om Fby.M~V3OW~m,v,?y;I.&FoN3Vh\̰àYG珥<=]xPM#(z"E*+Uz>tW5zz# U VP\>3HnLy|%+{|-D5dWwt5F]=֯/1Ņi 5f Tn~k^1@Tflm/3Rўskg Mq2Ӫ]w'nJ'}4At"O&1"\Gd`1n cEB 1>{gT&$Nk0/v%XCaߞ4ڤFS' Z"=: &`1t&:ց(ZzLtѝqDe<0 >[S+CY7bES2<&-k@^,`#ȠV[C7|z?o59DQ߃3oW}yܕSZ`!{2bL y}{[^MW,bu$7 ppLToR}N05|::%@0 l)sHT1i4$>a&psjg`Gċy;Wy/FL5.T2 ?)pWbQZ^)~P7cEIԇ#-@Žf4ߧ:wށiCqr.0nG^ iəO`pȬ$b@0y5wD{C "sPG C/E0`jͪcݺcقfK?- g%D-,vFT4VI\%xA6>}ͽ_Lcx82ax[II}`,@5 > )T 9>:E1u{\<fIģ^Mh<~P-p({ 5/ܰB[>)tp7   լ,Mn _+5n`Oϛ՜;*ս9sF%3HY NS-/Ȼl_E}0MLyE*i8ݯ(20;R:6V$*=.A䙐qiz]c[8|C̶u;-UD$2^c)ܤfHH%["IR3c 2o}/rD}d:dHqzu큝^)M{Y7 EG|x->φ\2u4Ql]|Gq4LFFmraGŚa-2gMQ&; |xZ8K qg\bLj/" :8̯vJ7.Y SCe41{y_^K|w_RB$(Q';F@aމ6a,^r^P_@K׵羱c%,RJQd ƹw. T|s HɆ?@*d'[5q529V1gZ- ~l v|w7#_xοB_V8VE%P劵ֶ+#"A\ֆ w x*lMTETg6qG:[sг޼}]/GS X6 PZ;NRW혶;O g؀nzqNsG,Wϻ=*v(!h9q [io jGWkǸ Y :"ܒ?7$7s}`i*l8B; Ӏ9a0ʰ}-! uY=_y ?{8t'kAi KO%gdT25U"'L%qu҉'qS9 A6`8Yzy'٣@ipCAXfx\{blCq<[Њ?[͓w Su7!79{ &>rAE$p=vV ΄ wE.>l1"cAOƸY=茔X zǔCcH'euA`/ b (ɑ`V(v:# J\ ; VƐ]<|բ[mvMb*^`i=-P꣪pr'UĞ0}aᓼYjj2,r /P,|qg} (1Z@[P8NO: >ι ;"kI)½b+j)tJ;[mLW }YX/B>K<W0ŒgIk]#_N Е,%KцNsMG} bLצ!|MS>duZ￝7,DJjz tjLЗ.@j)d>wbWJE&]졔*@ӜlNV_1y5 {w00^uK@(d\(l`9WcU6)<")}ǡB9 mRX9E Z+WE}cϘk {E*jԫV3v?_qڃξ1E?2@6NF`ZƉ>4n/.u"3l֌HO kIrg`wDy:ufqKrC Mրt߀Bdǩ;RaQ9 ,l^~5b9dNISbwx!Ɏr×f7Ś.9Z dVªᡏF%]z\1%_"16B]KZT(r n')3D']vrÀYӐ/)M)}vOELx/uACDWTXm:G;8z{Bٻ\"ʹfbohzf:A~l3bO*R= p+V:b@![~-XS "OWs՞>ޫx_FxD6X"8( PA)]=֗kCt(sh T}V²o~ՙݝwRH(ό vSP:u$T؀.Dq9Mw$U>T0p$iORBSڽ q|,}Smx^]Zط8E<  )6Q@9V{5АMn?zqM@Dx fܢt݌?0Lb\l[.M AݡjR<Ա̑%7+=t*sVSy~ \% As5 ,,HFWt#Z)2Eg ^<⢤DfG=*^=Ao5@s@.F jb%ht)(X7{dfi|cԕtAKآhA'LBR ǖ촃[Żo>1=gDn6.GoE$S]&wLЋj}C b2 Rъc0U*uo)ɽPwzB0AmT5jA.\]*W|St~xobdfSݍBXa zTGT>^QpPT :w}RDq7XouUBoS4I1~kX"Wja|/9&޴.aeLXZ_P%ŸÕ"FhuZ  ,!ĸd*?7jҟmF\օwMQx܈IX,팴|%}iIXV~yQ>o b^_ph5 rp(*J<<miZPԤJFvȀ4`sVҤ?G= ו)9'{6W.'A KN, 򄈌Z ]Uٛ;Dc`QCJ~?SkʱU HapsnC@&ȸtlp1&#)(e4ƘxA39=#dq}"ɵ(Bc4e+v@c)HZ8_!&K.S}t$m-FX^F6 {*GENf$xfeח-YcA]pAāwFաtx*;kF\'FNqW1ck-Z%n%M-ӽ| 'b2𶼱;X;޿M6?`J50YME&U&M SoxZ=81dŪ-J#R-5jeTU'OO''%Zm8x=lâ["piD{kddms:ETD&5?l=y+)h|$u%Ŭ{pd8,8|sCu ^gP9fcEoCZ* !9d@w;M-_1Z(<^>,3jjHjȐYRAifG1ޢ2}K46eL%7WQf}D8I'|Zo6)6 ׫l av <#ɏ0<[g>yTJUi Q;F@wZb~2bfV]qg@ K/pʢc^Z.5T"P;s4S,҉~q8{6zǎ`! `EDpLxjuZ t1^qW݁DmSZln(eNPV; I:H6ͱ~<򏪫m_>ocgEq? B}qf˰U\4WS) s(+k ldzs0*>4;>2y΍Vt2\RVKmD]g4ݒ!Em|;jj;=:*?I*~z0=ϠKUG'KwW_=ڠ'q<""mnk$8QpQ--5%7 )0>`!QqP*H*F1qZ\sXFIO] rCl5P7Ro]S>1~Q<UaNVP}[X[U[E5JG̱$Reɣ3^8R˶C:D'GA-Ƭ&{fw9 Yj% 4GkF|$4'ER2g(eMM+31 Jm ϫԏsdžC@X+JU٫o5*qR#pŧ5j蒓+e# oghgbZ^rRd~%f5(Lzt;VUIҬW |#QӶci$0úI8!*o+_ X7O6A8eɒKj G`gd#v #ZFD<73H$HFǤ#d 21ؤ?v+-ƫU%Iy#V9x?0bzA.|k i)WZrz0Mn"Ufg,)pFnaZ0N{JӧKԈ˛ acߚs|Ȫb5+a:Nxh&H7Sq3pKf*Z֕qQeL$zo)W4 3<qXچ+ǥwKFPنs|}w `\N'֩tڋR8L,O}ǭcgu`aCrM"?¾yҝ $w,} ƹ ԈZiܟgNFt,?دnğbY6< GhFreF?Bz Op6џeQ $,BxLr} ?9LW3ËE_ReD[;= AfF 9bAzSgRrLOGZrwU EQS Yz,翛$[iN!{_~ 6$1a-^v Xr#:?㘕lȥ%[ mj-\bߺ^<7QbJ,*5L'X*򗫔fڜ@P;!] {h+9@(8  lps*`һb'Õ7 /QyZ= :Xvxv {WyM>@%t&+>zO$~\"0dӼioү7 +BwqS9>C|{TL wzEW/ArDr9d + S]Ca$He˗;%Q2V H)IU7MKL(\&gY#8%"a'_ %:{:og*FZ撃d<+YOI#Og31ZɯW }fP;VHgmLɔ.d:[_] $OagO$c,.H|o$,杻W, [BG7mc S^SXqEo̫7&>}͎ ɣt:vjcM'zm6o=z^/V#jcv?U)JGj;U]~5xU.2>ʲ㯕'Ͳ'aOO%#_e'Vf}S dXPر ,Hҳzl!ke/meAvXPH!O x2/a2ʁ71FK ? *+̎t`Q5#_ AF-3f?*Dsw. %ŧ@ԆSU^TYH3!, vyD e'%A˷59w:bZ' G"fS[s)OpC~48u"G$$35dkk/qźO3E R)(ۥڵ>)]Z2'xG}O9 9[Oe<&zM+0G24Cypߥ[6[ _? A&-{g (LT00M<֬ V/'>R'L,C6x;q\Uoth$LYĬ0yqęΫD#i_""ΦZأUM]B5 5N]]-P. K`"6m"/MB!qA%IY򮺳G @Xk n]zn~YMW49;4!=7zKo/&iźM _jo{:ĔT>U (!u߶1saxy91"V_J aޫj|+Cg {)e:1M6Ր7 +c:<7w sV䙐y8prK.yK `4wroxNkRj9bQ*;I Pl v-]mB(Z]϶<0r x%D ZA+ 38cտuo^E2><8$$en`>ۇV+{0}XmTW'|H٣%;4DY9KXƿMͶ†k$cP@ߐڑ˛`*mn;f(||Aᴼ >cG VK1Oi /wD]ї"Sj0eq.bD{6MHAeU> 9̝+ll 0.fw4o=P̑CTTzO7~0{g,aqdV)q'X9$a4?kc(:N5kp#.󈳻kI jVb鵿rx s3NVƘE;p]5g̔aJdkGQx])6ds[0X߼~TsR1V]egE):T){ Ȼ o&X['vj0:QzX@Sȶd:y$t֗or2KDxj"yݫ}>%8 3i+`< ~Tg1d7;ƿ*N,Tk4ԗ5Y[&<C]G9 5omƪsغwiN V ϫ%gQ~{텱]X1dI%&U5%IaFMﶸzF~„ʎ]dwN5AB \u蒑*UPM'[bԝ:wʺi!jhJ`y2vhΛ Uq}GpYB2C&0PEgĄ hBr_cboכ #LC9[QɐNe兩JLȋ=f_Da =,HT~r`NFWhp4(QA6ut&@ImK.4ܰ(ۧ?N>@ ?M2@;?qב-9#o7 :Q7UѬyFYݪ??Hch딈[yy ,%J\ϝ_8E,T|.+jz03@Gkx5 NCǠ|JbI)J7#cwUr(t4}5nG*QO0pH C*a7aydKD (H1 '6=vvfo۹(Y(;Uj WZ NDeZ3.%r, \V.Ƨ@ )b 8V62"vI_fPKc0$FйNlk( 0:fXmnq%~X-rr(OgC2niG m̩s`YNxMBj,b[boFr3\Vxf`s =y caAQEt9ȻV9$nճٙp`hv"s&9zNm*u{[!'DxMj/eSrE:d{3aqOmZw BX$v2#r 1S #?+/0(3=q(e=H*U6Pa2EbUyٞI$B-1η?S*ߎf9$3/4 Qf(R*^t%^M0qu wW|@i7*"ʓUuph%'"A"]3N6uhE/3Έ"yN+'hhta@A)\2 |7"7\9ѵT)"RrDSB"O5p-d9ൂ[ĤdUL=l@<NAxk~/08 4rwHUfv1Nu%\75pKK[wKa]ޘ~Q*3ֵ`4cUjSN*]owܫJ6 j_PKG++UAYt]*i=ٝ <^+k@0@Rc)Cةg 9x/r9+Qu(mcy#wwȼ0/A6prQ=LI**>ZɎ[oqUKpсxWp HܑEfeb ol6  Z-LϷr @^1[SYHwvv/Qd; HU"gSِ4ݼCٞ m$D6$]!`UeMbH2"=w3HnU]ALk{k^BÍ1\h[YJePbhty.^F8$ns>ͱ`D޴*$8t\]k8AAo#d&l|~:|OmDv(⯉V /jz\ls̵pRa>N :ҢLͩ8-T:paĽz21hp9kC\Jҁp1I.Xc;d \#=9|kh%Kf]1U X4 æ_K8KؗTƩ򛷕D|;66o|}'/osH˝2uP7jwi9:4E|4Կ.ۉW9-p(E4GkV45.9zKt;C&zuԕGUTZt4C%\ׄxTaSi.Ri 8;Űr`V(FC7gcNS6`ӕQm8S#Qմhʮ_]-e7Z8f{O!D_Y`ŢBc͵}!=gf$gKxC69>G8إ cC(WW^qm.לl'ɏ a v_^SNfK44I cF34d 80.~ 7urcRUM~T1c1?"׬'Ef%+ˍ u=ۅagnCuժ0GdG=?s4A)Ng h?Cr6/\qxGU  n(ӊK"'c`cr~7~, NC{@g~74@gRjuCGBݪ%@dd|oX-' XohR-{Ig(KKO&A:+tP/ 5JI en+6RO"+ #_DU!0 *5;qw .6.p~G/qI. ( >Q`F4[/LJKcǹ ̰{2v^IpXdzhA$yNPw܆6zt ˇPyvvr|2HZz8N@HU DL".SP2aÖ3߸aޗDG$RB)hlU;=jC8*"ы3PNFfؾUL*EqC.>nU`djD_ی,g$w003 t0.[KZJV<9l![8juq΅ f@H_ !\g5(CǹXZVª沺ԯD\6(ߴpYi^R粳,*/nZަ%=`Ou=Kᶬp{VqwKQ=(']qMCC5SđR2^ޛ( 2qk_(OCgȫk<6_"SXy&l8FXe={S4ݵw#%cBoKVBOO (p0Ű1MוȾ0byڃ$C*֦Kiw)HA"d}ol(F^;c@pUBґ p@xU,_n ^O6A˴%ZjKD {M4]E;'+Msr:К ]ءײք}Daj ."_b\Sߖl/u \j[` ~;vx=*mwKr|Z30fUl{S&a%ʔLAhl׳!xO? W{ڳ|ۙ֊0|Hs ,N^0 X_&1'mATB FN(%t`RZ$G:\I*W\ OHi֡#mr3⦚#`NM d_))}L ~ s%]ػS9p{Dϕ,`W}19 iU1qMņ1=gyCNqƔ`m}Q V..q@Qc)s5 An+.#ФPZsLqq4/E eF5W'MpɮGYGG2 \]ہm,߸a[GZ)Mm_\\eF£i}{,jAC\: "9+0/rMGZ@UpJ)8Q ܣYh,W$UZiZvc옦+^θJ9~eO*c!. 6$93rR|2L^1=}/l ;Kqqv?6xxzG VHgEtKJcGsKFFȘ14 kan7*AH˞\"{Dsկw5}|\rQ v9ܲ'w~(eplFuiia^rP8(POomf(N /}Z]w{aX&1$E%oSt2(`xUl!`g׷mhcAz`'̶uF/QyXsŎJ2}8,%:l%aX(ʅ.h+FIϫ0Lɥt~޵ȜRtZέaIzFu'%/eBԸXD[j͒G:6{ܫư}罖B Bz_#N$AI

5+$èi }6QV|"8f}?T:m7`Z* Pq9C^ra~gB =#Ec6ڥ胵z2ӐgvdI)^F`دk %D|ͦR,& vA~Yr6" "G{6h \z\9@. 1^_,!]֢unnRH5t{Q GZ?@Sk@$'\ja'6q^AE ٮ&ϕԜ-c;Ib*t sۍQhS] g)L\?OapZ Jh85oݙk @I_ lXa+^qfĕ Be]VPi ^b7v`g 9mT >bze:6XUg"buaַGz!̺.!lDwTl'䖁 v[bpќ\~imhDIWo{Tq$Kݤ;ylvl) ˚䅑jǬR(xJKTZ+SL*!]D}Ed.dc .1& %S`>N֑k&9%C))Mr!-~罿b}ޥ@K46FWR/5z XTExG/5{Y)ю |o p ez yf_ ?NڭwMxఛ2 a0q4O.XakAlls`gBco܍|?.ZeAM+qm!)L`:>ᘡwcr#s2a}8 PAH E1H=/Y2 F7(q> AƁ#jq_er\*T2p ߠt/:~cBwbR#KH:.AMY(Q>D8Ғ6x~D<|YfIa{\*=j%.ӏiH^bDU NQ7[~GWfs)+A|Rw*yh±<}AN%/rd v=C+/}&EpY  )d>sfQG9O7~a i0nt'`܎?x_ד7f$'gapC McYw"ТN<;ٜ,t]CoE:`ION=mO!8?l2uy.=9a'"t%":.NnXVd5eGv}J5j〄$>\d*1(AS§rdH>|tpߵk(&A((S2O0Nk\JlSw0-V!s!r*47#[FĬͩQru?S}9g3Xar]-:jLV >7pGu37|va kd}_+Ay=Gcޜx11$ԕ[gxbv3/⒔o 2xykEddӚ46cm\;ClӞVcN{tY.YAſ$jݭv8?FPOtk0R[$%ګ(D8 qW:ic O{۴ Yus'_2PGiq(BUkI@m5BKsn{#_T׊ò~}C3PRk5wb xݑ=_k4 [ڄXB Fc}ecm 遪O ʫŅߗwzTN(5V?Jҕ~q=B, !0X;V@`HDfKoȈ]la-0t)Tf1%bb$(~5w4.IP{١h)TI4Gjj[M'=8r>.z⩪ADxFQ*eWA>ф:x^RNQDob~u?i lcއՂ$KEG]x8*?x]` %mzXgN((!]8  4~bʴ l|@3A Σ +QĈ[X9(a[7{U׋{冭M ?#7nJU?1bҧvӠHA$/SC_8`q*H]LH?"YFO¸V_.:y[b]0z(ž*U$vxlϕ VZVtVL\٧&FaɰzԼ3,o1Ui2C_o4(Bzҧq`{L5ua70ï٣~wH8hn{QUÂˁN8v7%i0؀%Dxmfv4r!2ih԰C]2XL csg4x4`*唴-Y`,CQ`JJ}n2A6:+E9RB?I( ~~$ $3(SxD}B^Lx hH\zK- .|Ixg6nS=u<Z`ac=WniftS7mU*IU )ԟD8i2IkрZ^o4*_Y);vZwmt[ħjpg]<Į?EJ;z;Ql9(S%{[sڗzdVc 򭟜+㋞ ݋kL}r36*/=xx4F;ls#F8뉨p(]; $0;n,tȑΗB9R3|9k̾C|]-aKc>) 0A\=SuPxw',"ˋs4(lj^B 1 3(?E*N>Nh~%SW/ ÕS#>}!Y`d_@h= _O~$_@7o$օKL^A5RY',3 96mM5DSkӶ7^#P!|#<]uheI#Ó]ɡWD}>T+`JkTf-/9w\[b&냔 MzM5nvU }aܨ!p$lι IVj.Ovܤb S7,s ȗd I+mu[hO~X@_~dF)Np'71xoDk,0 kbTj/%#ri,U?e6ʹ82xY9V\\rWdHXV[툶σ|}>KI.ZF98=9danuckd4 +@=!yNE=IoJ97$?+P*-& $Ga>\@U4;vPN\\@Vwq`JM>31(9>0cf-tt'0-+ VB> O3˓! U~O(P NrܵR?*Ϻb3W ςNLCjPɉ#bhfT\0a0FϐâdqhbMEH$ZT|Л;Q: %l4AoW C0ݗMq-ձ!Wtwu ],8>0w-G6q\#ҟtأ%q>EѫēH{tkvډe R$z^'r¢d)G=;LY6>A4!q-ILjk+ڃs+tڈ_aMn 5Ǣ,<2ĥ{8Db%}{{\4|n3VoO#|zT !oVqg,)KvR{)8m*Fx<43tRJ U_ltWO A[q>Ns@P*,VL00;eL2O7w=zD&.)!ȿCPŮ+|zV)keB+GLr$gTnùb5PCO<s !ެJj#ϔQuA.A h7ZzP[q=H%zM,_g-Z9]qF/kun$\}OK%ge ;Eْ o 4 "Q1m 3̙ 虫aRܾP*!73*~@!Vf*wp "CeeN>$r|>nM^5xMO_-72˜l|R|Lji,b-5΢'" 6rkʒe7B9u*VlS3Æn!"(dDkڛ! tg믹*b%-Uf:͂)E9^wd,CdޫL .D .+1%66UxO1?IQthV.~Ф k-VJخ0w'SF#65gJ#R$7<5i}jJʼnyOǍ}߅vlWoWm,JɺI}x-K -dkK0Bnsع :ok7MEAhj~MĦ'vq7<*惎ZNm*:6dwa`^ΌyGZH֬\* O (1>XR]xŅ ֓HU'{Н:M9>IUF;x~7Fep;xJu4N zyTi >k1Yi@pqf* ZЏ"w>A~O {rU=_:oϥd^Xr5z]קT_GYGpLd1S, bxļ6TZnND=Wg6:9ddu5þ_1ZaZ%w]1\6\4 Wf!)d+߷jQtu(q! wJPi္ iԽB0{]$vqFIx%)jm13s+fT{H7bGyiU(Ќ켰E/~M(V C#%jJW7)B?IJWT*q  2\=AL9CF 8wDsi{٘y"'V; Y):5sp G; ?y56NXod?:;p-V!=_-a !Y*Ņ%|^6~'Du Aűy [R2 <\v(9y.#^:sӒׄsI Էxsv8 X n v5Ӆj7Dh<.4J3a&coAN [rIPLDUzI0+_f 8?ͬ| I(1J&.;il*^Ys 5Az߈9\מA}cǾɭ~9BEkgv0EM©U3͖3QDYq{LC_\r]K4Zp|R2?%; {xJ8AYͺ@{ąrÒ˨|t5=JLjh jNO֤.T 84n؉% [,=Wա/Hұqֱ rvjHzu h$XnC8/ Mnk`)#pdrE_ۄ\Z^NMśD3%'~ț06!/GN4;;Ydz lȋ*$H wy7fI}AiiB;?lհd)Ê'2\#DҘ>Thd.lmRnj3Iaǯt)w8 63ʼr38b&= UD!y F:,[T2D,aBhEm6g{sI£sWʺcfԫ0%̺K|4h.vX njh!m̴5e֢hr:Qݲ2=i?#[3ɬ  =zAšRb%4 ڔzI rF"}՘JWeJFWb;?+ܤOJq<]CTjQ~-4",}6Shho8?$ Nu֋l:1o-K栰ÎU0cojݢD/̟.GWħ裐dD 8.]G? ϩic: GkP{!Eku;ezs /Z',6Ǐ7awjIwnno1}`'~$*y/+@9_TK87|j1(Ɩ;@I,vN+>;b9׉JqK34ZaC,᫤6Ѯ𩬙0qhWͼrF*"̮lKꊔy$5)KX=Wo s-ԱVm)y;IIOEoVeO5NIX )-=O͛R"uZ|j L3,*fUv&>D2Vm ?ɱ-t8{ϣm*!򝿫5¡A.Fvg=Mm]"Zod՚g?e"?]DU= ͳ$T_0zs>)wD@UD3o8CMi Y^[TnN|U-7 *=oO$O?$\]2:A:^ &}ofnU=.| f*cYXΏ鴚ot.Ɵ_אb(07:"ru"ݪ@n^LpGM|J?2r.ͯvg`gj#)1{:jᒡY[ iНzrhi^}3b*u7}C|mGcD5>t1@H[fVܶ>zie4~U֥.߷&B?d_nM>/ ThP@Ph}lYŤܡ" =W.9L3H'|_ꅎG!!xu=gb%CGXӥwG:D M8[ ![V":Tc'uEՙq7ٙoYir;i IIR<8XەL 2Y5@ o%в:f!qj@X/y [\c&;ٸjbh<7^ vDZ wDUͤ~F-Wpbc,e8jX\rr*c+BOK[[+[8n,0eK &eQa])Nku6jQq 6!LgiIԳ 5; *w]$eiJK-`(лEқ7-h0g$\U1[ B|L+OHҙ (` P-qKlܺ~51ؿO{q=24x"J`j)W0އK,rLQ,뾆uoya1u0?'xlx[@yPb@< nB`kZ=z2[u~5}Jv g˾Rud~pJO96h??49sFBO:IVke; c* ST8xp3+02F-\>c X"4~΢R ټ,_TLW6V;wZHARFC' 'hï5|~V 4ĸ>zsa9XfD*爚/l0IU'YFú*eg6s$.ӣ&1\ *V\m)]FrsJJo\d .# *Ƭä&]6)FH$g} ]}7:EY?3Y?~9pn3mf82FGơQU*V:Y=HݰI@3~Q46:Vϐ}2ewɎ7_6[i] $@J;x,zg挶y=qlf5lȤKKeOkp%Q8Y /Pӈ{Y-fcO#MY5GǬFRif)k֛Yz"fh>qdyUnŸ1rJlyn4?&Hwa/]pO9,ZΖDxuPx6:l1#lpn/ >RS ,j;r9^pR&{̦*? GfDsE-n-Ub6wӾ3>ʘ ;ogy*/_)ՍõD N9V2 r&E\L cFq9}423ŽU'WS,8lPzjASpvY+΍uvHj2Xnn9.w,\j,]"QA)nK]rt ['W{ >O9NOllY` Nwps,)(+(kDZ|VUeZ8WZo'w״! #d'98FHlMG,kD4Z]ފed9_I~RAݞkKfMHyEdo_bJ#6HaI\ j-k+ǠE.$ǙMb7 RLU?hf^I\r7OEo `U8bRu$Jv#PlwF$P  İ85j_4 +v.œ2WBs-BT7#A+Lpx)N@ I5#N|߀R=U;Ji7IcS읾j G;vh6~$߮ t\Z8eTYT W8!X:EĴZ`54F F. x@[4ν]+l=C *3A&ϴR,i5z/}CK_aGR MRt_\2k+nz7,Ũ{*і}l=٪9+:e+ĈS޸*#ZBJ]řb4B)+yj=#Ut{zg87DGUHW㶢2a,pU}9ۤ/*A*dc:Yts{%ʰdNn!$cb(pU1=F<,;m$q`cȃ8F| Jh%ިTK[tV $}9h~obfXFs\`F@kC $,`ځt~Q0Dq9$2>EdZ«2uvèϩc_666J%:D׳әm1~Sd1]fϷC{f~5N(1{toj13tVY\4Z5ݳ]g$8 gJ8AkeZ-5)̋np&Ogli2r1VN_Ķ`5/QH\@pNM-&v Iesr݁U$@Jt_L`}:̔qD{httڝRh( ^{`7\œ=:>BYF[bPJr?[?SM HN"{s}Jz9IϐenB=mtg$Fʲv$֟oUT[:ZN &PzxX{ o h#da0f[z~Y,'J|駮Kٱ1%O-L>~fx!^A9:(wGLxc'&hјB5N2Ix Br#[[8 e;чjLgJN4,PF?|7 ݴ00/tmaC waIOZG*2̯RNd j6,ژb\Z/zɄθ➺ n6x4D?NeJ2 ag!kP )#s['Saz0rL$}Z_R"mEAzS=?ŔyU_Сw0_wuQW3}e^&z%}7b񯀰Sezݛ&@rt{kL{/8> ] l{杍/qwv5ZNsR`d䨣 DqBK}[o2˛6Y ӱ4|M!nv5P5KR`.ZL- 2{xq@1nGEh8?}m6qa~h;`W::8E MܕU%;(m2>#d{!q IX V!`y<\`y1SQ|ê.3qd<8 q'_p̢N#̴ ҩ,CeQtPȻ}wM>{ov磞 D#164Q_N,oǐǟf1`"e28gG+-$c:hs<Uԛ(c+q f#~TW<[RF˺p'%&f$Zt޸W_f~NTT !4v{mך=m8 ]%H(8G[%O]'|4<e7]w#yLSHtj';&"}C(?s [AϘ_R[R:xzXSk)UXNieC,CX26kѰ8)ּg ,E|i i=Ng6s!Y&18Zp](b($$ !J Z4n; .Ț)$"0*}*|wδ1!.bfd#-w2( &p-8W]][I3:=h #ό(=eܰjoC"F8IQ)T`Q[-]҆xP#(Dj>+1qs{dB0N<vhPiU7`[k͡o.?Yn=$2؋(nEop•3ۓJx#ܶ'_X;;G%slhEzQ[ŀ+$cf#ix[gGG9~\F3R\#i:|Rmw"X*xUN;~Lf6y"hiE8`|"+j8–i’{Ӌ =^1Jnכ<2]0I0 jTa(7d+˦y#Hw鄁dQ!6 ߾62\C{;)F:چpۦfVEd׆ fUd=?芬9 ;DP7`Sa k"x'M:@ةiN_5 ȑDR|LLKp 5cY|5 嶾 p ֐b^)*s?Ӡ;mM^MpUP@*fx&n1rTMgjDV@!B4捃s:T6]"~IOњcY|S|:Z;fr@0p}NQU,Nk-b:DŽ7/7{\3uOԌ&(}a(mx0ꪷ&UDfpƨ7'bzěRdp)bO'93m`)tֵd t|I8ޘ,xZUnù7ɟp]dLp$P. G<[#\nUF?ՋXD:,Lc ` '/c;Bb7^~1~ pfw-\{ }/?K'ǫ8. "^ɥ"(Z%.YF?7cp }j2PkgvHۺP. 0>(R'& 0B3ÔqL5DCgwDxЁCCheQƮ\>7n0?GYW%]օ >w2yZj )ńXAT fRGɃejWv~G{/\::=F'HջƓ=V"Yo]ȣ_g ¹0+EvI;<~oQ^1D G%gX0rxFSļq?I۳NWw gΞ ;?Q E)7fq+h1Kz3LmԮ?9-+霳>"@r}\ڶp= aKdv{QRVOhbo2Cܹ< Bz3Ʀ^%t}ܔ{n~h\Dxׁ i }ļV aJr솖 Zz QnF&MHݦ@]`_yvvE"e..Ήr)s J. ~nґ2.z[˟yJ WBWS(Iod>Q?()nBsU S*3A=Z,iAQJХI] [=VwGlI$|t+̠K'(;&;ث6DI%׈kŅ,/tG]v=ͻ4+":&8@#es}/66f\[P'3&)CqIV"yo2WXUz;h S$cX.4.*YB z1¿Bؘ΄Y}˛ Oy=m@}k<u*,XaҰT'Ċk 6 d}Ng؇Z?d 3ocRixo)`"9|0h͍5#o:+ W WS=Mń: Kw]kkq/7q>K;~beR0ؼldt>$dxJ =Rx% s1ġTS5H-|_.T{ ;(W,/l-L X°`~ BkG0t(h@㿓q( ꠡflf\[qm"7&k S$QofĿo%6<_gKNޏc}{z㲈EEmb7QߢuwO _^grtLFxìp=ЇT-z.N2{nu=>@Ns+~ɥ]zuU:u_];mF+K!]wqHs+e/|$D/ǘny1Hr̀ϝr`( ҳ铉GÆaV~΅e+nS٭pAvG^*\I [ِ*v!ߐiOo3QʌPP ;֡4s8hJ/nBb#tb2s/Ǝ AO#qOg2Yv9矮kJ}28s}J-6Ջ.NJV%긝 WfE,<];CPFwR 4o[жkB3ٗO5?(&X%m"H61(QXaᄾ/'0E`oݰ``A%oʵi;NVR$1t8Lxns*{jx#O'b5![/G6-</Q俶{JwJ}"}tZÌQ? .H⹁8N":euQnYxh%kxyujgF–+9xǻRq}P+v!0oUu)+{3tT =v^.3źO8B$b1ri;G\!_Cpk͗*1:j(&'-b\9'fͲO6d3ߝA{c*k[F Y/e S7u3Ag,(I䜿|mbF A.)K\@ی1O} ROCyXew Da CR NxQ6Qэ4ԓLAwQ=7ud[aG5 NnGS$g$ɋ;%1q =//4URm,=kskr=Gߥl 4dꅐߵ!x Qٹ4Cua{jMB DjVaK=̷y_ȜmAàhoٔ$Ma㶈WrI %ʗشx'/;w5DFf Ԋj7نriGNڈ[Ɛk?D'O4m65q9+a+vM?4|iVtzSґ-aҙN Q? 4V۹sg乽D-Dw56.,J4y/y1vQHP#RU2 iu HbFʜUBo0k*ϔftBR;7Bh>ID5! JVhƚd &m)$ņ\V/':T* ~/_:t <'ЭU0"&jp,ipK쵸-Z|R4'6j:՜,)~9F H܍o_6<7 x.@5M`}:0J(0CUErSce,ˮQw-R5* CS)qL8S?n9S.1坿w b=*q~rV5{a! Wʷxa3X*sR)dS5W{qվW`Nօ"; |\AG.ttQWMFV![ĵgAa<NS:Muw y~Y pOe3-NW"a^ 3>-|zKB'<48 E_yonF*0,@Tǩ1蕶J>bkP"}Q}d͙o眐Xv0իՠrBv>W-4}2+{:$ܩ?͠~۫KenpUt$t:"c, %7!P|  'oLOsCåz"XyyuRX$l ,F>&QiA$Rc^M{YDDq}W*^edK:X_Юm FT ;e%% 1 Ԇ!:72~5kIW?þko3Pe2l5п=9``LMsZ @~!>G'큥|4L50S׶,qB"x(W4f[$e{)؉Bͳ=@]!?l,%m_fVwX$Mc>^Ρ a)wӴDCb@QPLE㳐FyCfzBEm5.F Uu׭A%r'Hj/.=F,i.gК#h2N$lsG3%9ECr{KZ !sꩣl*yqg>8zWd􆮖;LKkͦ`FI\Bt ;P#NgdT/qaoBJC \H5cׂBfpp A;"%dg=KOY\$׏9HP}䍦k >"&"GwOsFq0 `p*Ǝ[̩.Y=6à3M.@uNIFte;E8IΒHʬX$Y)'9޵?SƗ҃6R[._yx),p7Y,Þ46c|ohN B6 J4})Gߍxy7Dg{69^hEH~*Mz8(JkYoͼ!!$dC4{ww(7>-"}_Mh ZtwPh#ڣMj!x3:=({\";~hh@7FR_{kg)]m8k0ߚm.D;&`lpI9Y^C7̵c]!|FؽjN䢠*Ky 6CaM9~szTU`pG{}&4Zl*c%EXeH p֣# =V$NVX֘$-Ws)ϯ320wbC<]+ߊ^C/ij I)=%$ 4*pv`w.!kz:{;CUYbg  S?tiJ+By7L '&f/4A-yВ,T\4`U],[ߢHy,} RY YsR~rtXo8{HgZ2vBAGT^>.eK?QgG'l]dž`7%E&vy2ծr_H,+ert`\sâur{YDl `pϺJZ~O/c?5u.?h|Qeh+' u`x@Q;o N荦oQ-5eT' ManvE8JL^'@Q  ] b\)ZϭVe7pgE\ݰzO+@DhooXAHʌ)O Q9V/S1  v6ywcn cIyt9G G85KKJ隉00ez<ghqw/GBnbyUJ10鋢Ц|,X/7 /IPl a3V]˪ s*!.ѨKIm!Y톥WGyf&b_jF⥷1ZFmf+h-$L-bq,/WGs| _ #di)1 A"E;lߩKnG09Xc1Xp޲Y&vXn~BWM< !2^g3}63xM˰o2x1omH΃7ޟI'7u7EA`xQR\T[5 KZ Qg3 Ob#%wt_'(͙|ȴ{afo"cX @SKh͆:I );d cme+-a(O\Q(QkWEAN}3+otBM< p u'B &>?j2'{ ĢVр_U?)aD,h+ .! 4u&2wYh8ΘP`(`?VHθpӷ1pd2?gL F"{Uis#)KpafFV68aV ɴO/v"RI>w)Jzc_BVS `tC|\{z_OE7ֽ8A珐+py QKxusK5 1Ēv#ehz|"QGH+`Z5)/3 +G)Lbcm#pnsbYOd!t]BI6g2>zSX\NeWx#uTAՎpn ~g+>q!RP[Siu _C;N_T\YF &_|<, W%.{/#bXPIb4ݗDLҎo7KVgm эFs)!VҦ_O\F )ǻ"KNɦ8`G$Wڭbq<8>IqF`D8|[KPmW~8g MIҰ#B B94H\*PE5R˸ |T3Y3™ja9 meJ>>p/㗶'zOjigγ깕NddSssۢm,jU-gl8R\{ǫt 4ҥ 2VX!=yzʝSaXDτ8ޮ ;n}^LnG%? {ը>i:#!L\Pt@_ ҝ\> WFj-zsEXަB[b,zCL~7-#45/03]Jo=U8vILIYom.8C$~PJ]Z& jzB"?|Q B0\p=@oq۩+ZC8Zce yb" {b2^zr"-[ұ\H}6 "r^{>9r|H뢵YǛf$<썡Jd_@7yLURQOSʐ\TƄC8P1)}3w5^s?x9~gFn3pkӤЅ~⧽mx`}<p%G*;{%Š@KmЊt>l Nj tϚqBsqiǚds_D9V28<@A5*7š0 YܕwT{=ؿ'kRa4ߵ?j u1˦^}_dE57Hybd:7r JP1XX:3AvhQ@6rXPz )'}!y~iMLm_,-fS5R&2^v0r8߯ 8[cA VN0E\dR;jP6w DHL=40ܫR]DZav?!(fϑ[!cqdRv0f)TqEჍG͘xfuL3]/v! S:N$r1*J`梒覙kI8x-y}8<<|)&E֏'S[V>הoG?UT7DcfZD{pcWҒ_c`ބFi/n3OEar6׬1X. Y)yr;Cj֕En7m!aJ =S7ݣ Bd:]uMY,jS)//+3$~,j5pӄGAwZUOi4skMO δ&>/轐m_+K54҆m#||Qqyn{ҋ)HG(#* }KZ*vÛzGp$:E.6b` si;h3̅$ADkDė|a_yGf:{s&uY?|јO|iM `Y75w`ڋm"`c~*nB:FMq{Ce7 *0@/K\f)ZYVKȏY8b '"X>5[*$_Ń"%gk'q%hl^v;h@y{IQs&ՠ5#wEPj %)@ZR*FX8*.:ۨm&DS+\Q|wI qP'&'ǥ! ֛T}|=Y!0Sxb :n*@)HTP3#ܤ PJx}F&~HUu&;{q'i\'C&Ǿ51_\dΡi{kѪ|@zdr8d}z*J0 >`5bo@g&F?_pn zo\.*^tZ/0":q]#;.:{5f(ZI 藈=LX- cS e!DIO3J~eBm}AZgR4gΔ;_zb=?͌Tvvt:sy,\P\Zg*cix)x?Ir{mfLol@hMy[^we&&+Lf#cSɳByovȏl'qX0Ҕǚ+mӂdG'*LJt1&JVBM\,kH#2+Mz~IKЀˀJ~R#輀Nᓥ檸Lҡr~gT z[SnFsFH5+,pڗ˟9-Zz|ʖKAʆӼ&y s@+FS4:g>zGYdVsA (.%v#I$É>Qez]TQ1w;^b[G( "bݵU|ݡgl4W.7 Epc~"q}%Rb_~߲bu(?cLCh.]cT`q[6r:(%@C!8p擣6Q#.\Bvk*~JXBۉcF"qPE) A!DW^+GijEO+z;9[ ;IHJ%v/ 4"nxD"?pmZhGg=>)Ug.Q MrgxlQD#Ibmg9^/F98p4oњh>ajWT]OD[͌ͳ=wãJI]rWⲌ˛,bIL.SW@$;'yyK˖_BT=DQې:Bf2oŸ3L5T;%+k5왍g.eae~j_#dSV`!tȈφ?QE^&~}A|FSi%e$m׹nb"H~T>\}ehDSe֨ҤI+hG(H<6\@7{DTk` Ð 2I{ehkhzDFFb$|cU2qAĵ4/b>ZȔ;ῖQ-V!UpFH3عs t/_i+ūXr.$}zj%9Ƥh7"бљ!裛?Z xRJ;C⬉ NӦ6n-ܨ]OKLd$e]M xFx9'FccZ@Rvf#Ca,TɦQ^*I&W\lK]QHg6ΰ9 N~"t$ЎjZ,_f9csJQ.I6JM#{ﮖxEy OoU 9^Y9vfm (Ļ?Hٲ%W~,F Nշj%^z6Ri,"u8& !(+Fಝ(L0#S73#_A ! A]+ZZ3_K1xGӴRTfy=^o*I1yX-a]f.& <#xNdz"@Dj_Hh|H jCimD!?nTs@WI0<=X}3z ?rpMW3$F5̂m.PGV ONT(s0!o;*;@(k\Et^11ʌ5%Aƻ rs{h|n'i ?Zf 5Fy5 c5RL:Kg*$I=L[[qjHp2wS"پh6Tvx=v4#s҃e&C0~.?z$8tII֨ŴV|Cu7UkzP*[C.6bvGU^?0~T&V!0h,hW<+p)iG8'.5ŷK(GD< .PYyBURhrF1 aaoQv qg VAk[\Ƒ= ENت-x>#3s};!g .EL}.Z/N+zuw.uuw9YC !wiFp<{v:(`}HF-\iwOݼǯ>aژtX\i( V]_ `\ 03I|X6jN]5B -"Z.7v-'[ʆ uQEi/- D"Ѓn/3=X',?(5EV"GMV|iL|ts\25@Z0 9Qf?J—/d&rfcÞ:?⳯:IN#hE޽C GmqAP{)l]J5g;Knu :uFE;#l).Qt^@sɠ3*Bj]{-Sd=y{Rt1p]~.T-u/7:sӿe<=yxLJ1_JbғC gv'J)}4w@)Y @/ [ _A8ڗ鯚;_dt |B"m!Rl@W|{%Q'wHVC }0˞e~g$6wjdG>vvN2-vN}r߸0jV zg]'nyL8yb2q;$ر!={Dov(ℶ(HM^j5b*l[F7g`ʋBLQbm@}X"|>UhnM[fʧx%=3<3z2KJ+ %EeAWO Ek]q`fZ &cK5 3LN㫱F:{AKN7G3ǠNG_e"sr:^ H#*%&o,;ϳaغI@+=mllX9z ^l.<:ftщo>So$F)'UKTX8?#<@0]rExXgC¿|j7ݧCTנo;S+d 8ԟ^V(,{ON3>(?\O16zX~PQ=H|ܐrG{zAŁLZAY<ږC.^*Y-iT2sCЭb1߆L%ۉXF`m'omV~(~ :R~YyrI&g;.N[jYt"NG1^rP85cc 0>ik=`! B{.^Vz#pR٢S=|GeBX+{~`DZ~k+ M6w}5qsb?]qu@Fч;jۀi^wm(BKT*Nz*ޘ ^&34Xqy.!T֏8EyC4L)?ٽ AZ5K P C @Ͻ "2R|)9)䔆`(DsH;*lS\ᣃUEṟC {0LJs3P5\;w;cq#p`HPNq|uId3ow+l1rG]sVC*Nqs.,Fhr& 8Իnu?C𞜷ٲenj!dSTP}jYʠ2C\A/2rk̫/CU?9~ l۲v|_N,~a܁T71@&r#[A˞Rԕ̡!k&.riԭg99ԨPdC6_ri0bkkKw'8,|j靍3x+ÞDqɯ3J3C "\*ikٕ`-l2TgWg  i@sߪvW V,.UA3/D`ve%j V:Hq^`sUE#$^-rc!X-#[}_h`d&/WS>7wH22lۤ{g~"Bʳ~t+zDkNIIٶx+眙qH!w0rϚYPB~)(ߑ F!hDͰ2)"_yb:Vi"]_2F-FK]d9 i3 7g0=3؇dɬ8B#|nqD8['D2`ngr-0?CJ1ƲK{#M aF7y\6W)YݏV\adj.S0tlyn~leQ +w2>JY/*p(́k9ܕqeJHק+A{\YFT ̵E4KL 糚`q6 5]?sqOFtHN" ԃt7W~lͼD/[?s\m$~vG(G/As EJG UT`*!X1@cLP1;>9%> ԣі'{ snN$]6e^J$&&K 2\ZyUO;tcڵ)pZ@tG74oA9~W-ƩC]iV'Vn#+Uv>[`%:EY \]vul Cc%,| F~C߁2^FE/(!qYF뫃7zcf` dNeS?lYU|Cr)]\>krZPsVoW~^>pP8Bk?ډKJ2#'mWyo )0`Y'À2O?{:񝿯 gd;ZUd60WkkFCܨ۝d&[ϘNG_F?3,.{Ș.]䀘z a>JeH8)K-ɬypS   ";SRY8`b"hGJ,?K}Ʀ\>.ޚTn;fdȮ\c+}R/(݅qtfoILS3ʷF~=Z2;'nVOjʹ&DZMEuä'%z̖h-缛A^JV|tZ٣=={zk8276xV_Ey" $VTϋ|JFEKE%w9X?'I +W;^?F~EFuF40%'~܅91G9T:'ק8ygA S#tmAvA'nJN2{GQ-Q` >T8'!wŖiaaikƏ5ζn1gMjD ._ڧPakf~㱒qց]e68L?@dD÷׶ }Ç֠FS1<:_MӫpzF`yl:qԎ?Jc+jI8=`*Q ȓ$.JbƠ@9 R7 `AڣfQ#geQ ZO&ґ,maqrl{܋toW8;RG~醟2HΘ@pHκx`qq4"}Z2(λ8>roUưhv ,4W;=ܗk|qFƚK)̱0+{E{]Fޕ{0r~"WsR `o l6E9c{g?ڐ3c 'gtѶZ;!㖷l΂8#;1h}0r?#{kt(̮ԠDWY'l''l {r.Vy40f&b9v`;J T8~9VV:ˊC/6(lb^"2m1ُ@`zpD&Lxe&f)6 c@Z0p+;2tEf-ċL!n (BL !/AE .޲('Y|n4Ο>>a<'LdVF -ゃQt2d=( #IDT 9[HZQ#mJgk-_EY*WZwqd&L[ޞI-2voZm5a/,4',^[*yAr1jU=KL&7N { MӼϊW68FP؅>a89=HwphE%:(~C_ȩ$ZӪ׍H^r15/='XC5Qk;iΩw\>:,޲Y9 3C*<R)":,Zg$\/ }>iC5w2 8> wt#;tۊR1@!H \3qrY{Jڛ$ أ +>I! T 5dKR$VwiO.ZسTIvUYpftr83Q,Eҥ?x(<%{(G 1CrzyŲH~- !k xBH4ޑ1XZ2Z<-j@r" W~d#8NAs.S4gMZxz8o E+W)l,_U(L?[4f2mdA7ȫB% 2_8 w>d&\QxWik&q7Ly[ F =BIGpscA .F/Jx56RV94 #\n]""\Qo! <$C6ДzJ`MxGL~ѝeo}%5<:rKzL^1h._H!pDe@>2jD=#aYt0iK;,YXz"*ͩXM蚨d%!}êӋ)'x)gF<c1431sD;Fwii2qlXG7Н۞YJW*~YNБW<E)(3jsD!>ZXE_N=5e,<䐨$k2;Su>_Y(]OVyꙄ?lM>K~t i a+nRBZePR(Q)Ðz& {7 } ;d, +u3Le br3CY{Cq<㐙N ~El.4^N$E\##Vl,d Du_|gDefbja Y&L} hO ֿoӰ48Fu%VHF캏 1Dz~A1NY;:[缒ݬRk4ň#P*N+Rѓ턺$v:[~_wsL/+$z:Jj*/򓨹zRʛ9=;ѐWr@Qk<#QW5қ6?9ُW*ʈ±4U_n7"2?$}ŧ)LoTj,T R0`iKlnũMdX;ș¹jIZF?Bvȉt>Ii\ve]C̢L X2;9պfQa˟vSI>DWT>w\G5%=_0wJy4~ 6GfU~IXq}w}J]V,}N. Q&65Qn 1T4h| +fNL@Vhhou: 츥W(d:&:>2C ^9Q]f:FBq'Z7l#JiI/E  5`_c}d 9azO[i9e>繯s؞R~0>*3@)j Q,5Xθl 6[\E]@V0x^8ݝKbbәf ]O K,@=6&ތ橒i2 (9O9^6ޙ°%);JxK۶Y9x-"<,&~t.Tc^#m֌`nՌuV39ehJ{4+؁0B2)| 0U?8|`›n] :`4X*֐S Ny12*.1{h V7Ӈ%2^Y }n1ClY/$=%`giнiKtY5PNϋ{;; ?R/Gg *5+xhE\7ػ¸}Z=HYm Hwc=@8֔4X ,<-2}gXE7&u~[ mK+ߥeU ^1ϼ.c}H+W!85yBG;uVG:DkFMf>@:M@jPiڄcUS!n`6(gԤ0sUrFN Z"Q1]LQ_87h"))J)Zτ,&x;ɹr-9F_7yt4spHbcІ|*/>TWn\#&~nQb)HWsW$OՓ-s{-/vr:8 Bɯk[b8 NtJk=dx;_ߔ)rO#81I'2F.ԯ_I|4 RJ:Ri4$%U§#!K$0 '_TH컞P`Au\i쥼R CLISr20H+3@0h3n~9@؛[eM˥Op8!\I/hQ+nFMA`<ÁRf, rx>TޏHjvTz5= LIG3 ;}~\Ő6Y$޳Hܑ]:YZsrNlտiX"?TNo0mѭJ`:XwUnbs" (uV˅~3m]jzQ(AϖC@ g@b@ScTGw({y AM>d&0["* (fgTTs&)nWctMdC- W < A.SVrO yWS5olթog7ehvȴ׳ֱb2!Cq @?#yђDF+>6"XV:s}8oM\U G8K4]9e/Io]ISi4+C3O5|l\_mUX |?|y3rˆ~+)aGM퉡 1LSӾO<tɅm0]yW"Y}詛"{q7o j, SB$~j&ŮҰTdcͥCvhRek!fpk;=F} La0M?ʡ2֯8aXC D̺ [W9r K(7` Q݆lM\ [kpSj@wW@|w~V:(K `KuswW]v9\ɋn""'؝'01 $M lH5hXvƭF]Hq6#l o~ Ϣ?Gqü\RC)uqw`({$-4U q˚05|=S|al ng7ۥId"^I{RŠLJ'TEfy3XLDk4;gJGyI>"1UFku Yjc zcdrVe}wb1FuZrcy,[bF^9iJ2wt#Mavbbn3u=yigs䔦nV_!*0R!|%4J QaSoPTim{'O_ ji-6(2n؋BR<ʼn\ bEQ zR[Oe9]x2zp TQo!tm\ U'|qJ$OqgU4Ǽ%LYŒB%5A$]T@:`3RFD2ɥo#]zP%:V%ю@x '/Ƿ{60c8l+Tk{ǫK_p3%NrO1"U[l"ZjU|*Q1(ߖȉEѝ]\TmϧvE%4D>SkIx(9#,/^n؟]/ *DWLn$q I;v*2i\l%^rm߷ð:;D i -{z\f~ $٥CdC|g[oI R<.bHH7dF\Kjdn#gd>0BR8- LT ];:453RmE@bb}0-amRk³ha#gw}r)*m&+ώTiXĉ$Qm"Y|k/7br\܍t)Bk"6$wQi J#]`24^s'\h_#K>v*<%!Ukο W<@FT d W lSxD^eKRaDpV UT3vK􀒈)ϚSxXlY9RtҤqִ%,SDfr2f!dsxmcxᮊSbK #RÅ$IW%`ʀi4&t]R7s;XsRSuT~L[JB^9Ru=y@1H:7u#vٿj }U܁WDm8^a Z6d4 %ߠFo9Q HW]z=N "9TW(Iww {Wüb?uYHSEHp*<ۢgٿZmwȈ$Yk̛?ڏys wd%k?:f-+;1]ѺIiPآ~>YY@ `u@^ox)8|ٕK {3n˳*wѪecf}}P`e:P_~pDo-|'3ӟ34|¦n>-?aj bAӋuxo@T#nUJ4wC`*6e\gc ɇՙبf QR%NY Bf܁Z |i[Xy̽~g.@k\;75D)>fX4Kp\55K< !}\ttjl'ѭs+ӯÞ[79T/Ģbكx0}C:8π0{ksBV8-5#p7.x5;m A1 ,>\ꌧKGS&M JJ.* [E+6:&Q&ϛ(x98boUN=Xkyvg9܂JSꝂ695K" q{x_5z7(8&_h6'!8sq yAG|]DQj枴>v}f!.IyL!f0;1G4ASi͋Vyxs&0ѱ*CO駪rg1A.ҚxրQXatV &ƃJM1tC;%4Gt4PuxZ1! \,]&Us<ܶ@?[Up_t32=mTANQi(O?bD T"]CL774Z0wL g?Rfa7ǃt^౥|tޜET" sL83P]=RcuTu@;^ZN kkRGDk0~{yՏ}Kv^L\4t4 |DB-SlH n%F.r>ӉQe:ĈQ'tYn ,gG\O·H= [=MYЯXBPz<-0@JǶb'"KQIjvM9#eHp_ΣLE8n'ĺݦ@H`B3s.?t19Kx~dXVU՟?Ua,8]:xLfkvW|¥pXfޱpySALE&.pu5x(.?2Œ8m5J% ɫh(,`RJ5SaXk+H{8zP!$2_dŬ \<H6CMH3`Vv`V<}dĔ+ZhfBn<.} P+zp[L1|'e )wNmX$ICd=YOvy g&уnU3"K範yS曂9Jdwbd.z:;p,=j@cNʰ9Аu: 9Vl oFO3$3;vi˗^je< GJbSGl+QFjSˁ0yr7;J n쫍7XxwjJ41X&OIN ďh+sd$H|u l,Yq^F]4JJz3IJq4h15NWC)bzDqC 7.nO||;Ji܌N¬&X١aJ{ͺt2}I_А'N)tdk4]{ib%\"_(F糉ۦ85IbmNwk r/ҧ,/(l.mZQ+@_& O"qH_Mя1$tBbpY#nB@vjJ _. cqu֫?M$#AvG4soqbtt"&}x ƗXghpK;QIS6b![NOcx$_{ZK_շz>yZd6A7f6[C?xQR2܉(&N3'}߬p<(W >d:;\^akюP+I~18܆4m&9.2ۃ uNzo]Kfu>Ylj3(^6[ k5J͖kdƘ/gAHr,탎5:p;r3?n'X:u駌84%Vt;n{0 H 2 %VjeAq&~_A *&l*_h-pLm5)f)w\ Ԝ򰭣J䎈e>F;<(Ǧ}ЩY5e0 =so ɮo}ȱnG/7~*2LF0$A w<\W.EgoG6H4f:g :͉۬3pH/x/rUSAwvip6qLsq#DuvH}?-)sV ,ct!_G /Lb[*Hs2 $t=e~; ~;royLNYZ2/դWe#73Woh;teϱlAp_9)2:'\:_ fyyUbLCBGM2iCw=C 󯈢J)'Vk?)VR qb<{#oFg"-IΔ7 Íů X #}X/(5 XB!3G&Ax^ބJ@,H5!,NBm-x)@]X)m1%ŝj>ta2nT2W|`bd+1EVL6@(aшѴB29BBIylBwc&sw(0_^Pepnj B]Iݎ`]hH { kkeЩ7-KZ54>̴/כ|b>Mqn"0zd-nv$^(*7@-?0, eewk{UaG#y7_q]b]–z;j"_?PRONz?PRzAo|L.֟x䄹/о.>{X j;OOw`#HK .ܭ\I?U{1%7ezd+n}G&( |L( F*fKV!qհP$fBӬ)ju;UoN6 >]ĎhP1nބAEۻ3vӟεzoAGhklNL')"-qO]M^|zZDQS{[MnXG[%2'3`w-UB5ŞKņp.D?KS:d~Wnlp}Õ11(p`@HGnj0^IQr r"Ӆտ? nQ)R Q_$;A'\C+9vuBv%CP(+Q/VGIâQHaRdk,*TA،'x@F ^,=8*v#T6N tQa]WZg}D:^5ֱHd!fqE2qb#"ET! %X][4f ] 2_q'k Kɼz$T^/IN H+(AIͺىmQS_SPDDh-P6 Z9 %C>*B24@{HPLpg URg*$*@jr*l-kF DBu@?hjkqZ1K'SS̪`SzrPVDL oNQV}%8E3`\8<[2;|m މnZ9 MmtzגA_m0 7o,zңiO ER\&rYԫXB?_x|1P7p[^*@oL:'obe&@&0,Kv'Ҿ2`h68VA+.?']{[ Ye84[ &7nrsX:xcICUM%l(}; Ae}Ni-峎A`lX ,>nXw C -17޵zcD.i@ETcIvkyx^VǑV"4VOb,;jy"ɕ-JIʍG.em4))ʕYw( Q+\J}Q}BmS{@C1r*.h܋VFTz8{e*~(1Beu-@qBe4=?VO³P)Ѿ߲`\(En >n֞Y{qrϟn 0gԓ՘9 yGЈ&pԬE|y CMyc^ %+)e$gwj0pˣng}[pF4?0_JBjAr4#G.e{1"Ryڈ4!C::'z.4HVBA3U[`EjN{6Ȼ;DN_PCלe`^U^Z%HP.|,2}:Ի{-y~(FBl»xWi8kPrV-p;/ًbL&=l, $~ ]2|Twxt<0yn1D1crT`;~t kQ/`Z7MkC0O%Ee^?~9ܵvQ@֙(Yvy7i}F{12v5@4ɑSK*>wrI/+X$roG6Ʒ *6-s1P""!|# t驑׋ Qo ҧyU:hs(̘V=q F%h-r}4LX.<Nۥe~WZ0(ɛ~9gA%qF/XK- :l<) ::'׆?&~| Jk"Z_ 9]Q]{]~Ѥ[?_ett[OG-FM$.*ԋ̀hyVJKVϑ̵A4v)C9%taŷaďCqZ5Ƕ=G?>{Ɯ2f- 4of]/4mAR}+?i:*Mx,XNܑcT-L|?FP%p7~vNTfD (㒖oӦq|o{7<3/v@T;1:39Hة/' xuǮY&Idj|Wt۳GP܈|GGa+tr9^is{F\w\&~Q_ gS?կqflawh jCg+qQzǣL"\ 35p\ޔ6G7)d( ~j!#G(VDs_lo~ $8Oò[JWg2̾U{E%oTYA7+Vr^Vy4TNYXڛX.RR.3|*jE:tgc ۝aNᢒSZE 2*$Qk%|G4㲀oU]ʩB#|󇒳V,K/LF"besP(S]lx:~tҺ;e ըә~i?#b~77XLj2GAhizt}I(xl=mj{ѥW$OGIwYw auU<SN R9e*]`1k#,אZ%$mwR k嘆mE֖3"Ug RN\NQ"=%s=v\sм hu8$uC7g@YD3g}MT(_7 KRJq6ިC`ufoE'EӒ%/ݛ|a"6ֽ:gF&mb_)?(P E޷mZqԿO`K䓙':/0>]!v2EPe!4d@%}=\Yў!XzGZdb@rx7sn2ֳ`cL,f營hTz+p%I4ިqy^ins2%HO>/ys.oeG nwYWxHѝyzmB Q_:ҿJ,Ij-[PUs=u]8up(&壠8K '{gwƛ'$"h\'H䋠٩_c#&|{qLH-nz绯z_eȘP $𑎲l^HV}~BoCŸ$Y@^bDwf9!˒ibX5W!=TRVQ p. -vxePX4-yLϝv hbyH?mwuh7HHJ2%x𲆵Xe?Oɽeeb v2|@Z71ybGo%x/Q) yHz/~w0(=?'-vw@E6|&}O1C8uܛ)p(3]jȲ30!jՙ1zD&89eF93JU!̧gXͧxgj@cQ,h,7sN`=;~DLR횤)R`?P.ctQOߖ7 GnX 7؁PRɀk:Ӭk$LLdxJ 2DXxC4)ǣ x6L&ǡ0.Gl; $+(ag>O7Xs37`yKOϘAf> 6MC̕N2ߪE~JR*0ᩯǐ}o^^-zyo) 1PX$Gw{Ek,o!ڟ{QeÜ\IW[#qϰoƈ"!z$faGgMXibWlTLn6 6{o5ۿ57HErnj8>'$WB_@{3,?9ԪSG}nXr򠗥x~$)7ޗ7DyBb>"aV^@%D`䭡b֮]*2)S20x*vj: $ƅ$:V^@_:SB(&_!$XMo4K78F66DI".ҏHڼǵA5:.(oo4m?荧7ċW`e- 8 XAa5Ahv.7 vJ+_ӆ-DLh3oKWj_AN'|w)DlHG˅loBd#JG:/[Rmاió)2.h mH W }Mgi6zKck.e߯*fJ/a݈ ט?HXn~_}=ͥ![y MWCI\QD!ގٴyLRgu. H͆:@F, $16AtNԇ3+Ԟ2;ɑ 'oꍂaqKwȺݘHQSpEhla3U*;LnуEa͘"S˘6Uqk\J| Ri@a!J !ѩ:EL ׺j۸[vxnZ^UpPk%?ܑ{ÜbSWL^HGD_zLt2뛹@mgWXO*fLr5ht>Z d?6s7r{ >YQkg8}h>{49;V=ĘUyK2~H#F[RpĔW<^W;w`mn΢~K,u *_fpZPJY>֬2w v"b`_Na P֟]*8͚G T\YH U4 Vz_XQz2VQZ<WQ.ӡa9ɁucW1b%fE Pu9MCv]@a0D(Aփ~.(9 F¬KZ4f,8yѺ; gU7?p6>„x=' "vYHEOcGDn)/!] uoϒnu4=G޶ܧ܈ ,Y@gTYFsۚ!dLk5H7'`c¬Ayg^$N(b>sb·4`q^ɦ9!lqD,ѷ:}f?S[G>oT-|;9Y)O}tcR_d?1ʣVDyLm?dD};W> i_>1h=mC.c社@kׅAq⹉2,L3Mю>VR(QgvD(Xo~nx&c/:045gۥp%K!0BORun-["5/uXzDŽ68qi'_%Ŕ~M{S._#V@3[ƌ~UM_vOa^T˳=l USHK-֮#2롏6mXϴ+r vq<713S֫S,B)~*>xB Ao!}N,gr  ycɖNzA7LB5Aͩ}PԹX~FLo7O#{GʘQIsmy˦Hs;)r t'267;O VBJCp\}pڶ#[QЏ4K1["/VS]D`!#Ca)E{=Z7\k/.v/H ?%\yAHЌh% h:?Y"q`f?ևg fE_|V@_ 3GAJE5C̸G8F魰gngW0Jda J"e-%ree"4ѬȖK!7|+\x#g6@(ܿ",Dz"%pHԖ EE ?Ww| P KunҨTeSwz *ctQPE#T?󚜨f?qcmkbH ;@ae7S|wi<ͦiWN%uXYDm>߬v_ir4 9`FY._*TQ_@A\j1U ̳[ZAVd"9|dN(l$Ph)#%A)天Ic (E_EdW&Cҋ̭k {J~6 R3 bG%T?ٕ5~=mg!BԴ+Ӓ {UӸ(?÷gOaRbе2H\ ٸC s0$@INi h@qkg- @.OȚO;ʛ/ t>nH|:ɏW-Q&ym@b{_fˀ+ JÞ$.Ob:~npW~ksZbh~PuOGnJ?4ԌO_蕫\ԔhwaFr^& ,֋H˹kx$I 8GTg?1 tQYnݫ@,Qc忓9½%(+1U.IG5Zi8s$aݍu<²|La#(^*:PS/0pXEfɗ=g,`+?gv83:vVvTc"R .D5>ɓI`Ta}-*Oߓ7tb.J<䇤 HIFho체nQ &lg.aj;mq۱ ^|z)ɶ@ID@WH'ω<nlPLj`̉UIJoT1 3ole,0;2;J)f69E/wgN*Tn)]i:iT[6S/V8Pmw*ꟲ4gVdDV~Tf }'%t͉yRG6C/Иs3Ewe,_ht0~׽A qYZw/oX0qkKJ3ñbwԩx$^sS;=jr$\M0fq|g(ǂxv"i,$othc8$,`Pz'+y2[ N`jg5PA)n()/=.\1:B˝2[#FCc)U5 %6%d3zxR\*ށxq`̓E7 lw!'KQӁF <ԥg{A7b 8ifAiVؼS] "d-R ZqeJ1еo,|/⍆ZysG-_h4k=s6m" -;5LA$za__L?} //!¿x>a.@@Vt1ZWDL Lہɩ4LPG6%u:M!T"~NnВ=P9;Zڊ|3~x} &_pWՐ_)SO5) yO4:Rܐw~>"Dp;c#,Y3GJF>l* Sl!u?*>!]X{qSNH>:!T fԪy0p8-Vo.8:޸yŜ6Q^7\e>wM) xoyq`[ꌹW=>q0ԮM1Ѝ>Z;z#G#J0+GVr*~0+[G7&9F1 2 P'z`) ,).-hIh聶ne`shƅJIOL&FG-M$Rr^՞zH&,kSq}zTDž+_,ո.>/r~]-=O$Cw'i6I,1ڜ@[`wr+Aw-]v~y AP ,pR2T>Ib%ˆO:9?$3p9zP,r,*Q*]!I[wY'{8/A+B4T[jESS5XXtѸ32sEu+DkouQ7*wSxuƢS=- u跦Fs uN֝%wmab'yj' b0RhQ`\E@w ߿G{}Mkg ʓWxI2;Jkٙ- `ۉ5@K0_Hák,ѾHH {VeEu~2J5tR,aHy19 %TqX'$?,MZ#s@씊Gߋ Q󿚜M@Ztƀe躇آk\b0XcO E-`apf%;ꤻ^|&qo.d}ŗs誐<,x9b;*jȷ4ٍ.Hs*.{i 4WYT=ӣDʪ0Ƞ:Ys=ꐨ-6&8O*%G_[H8V҉Q8=4ujq"(yu&bg_?{rugDǕZӟ&[; <Mc AS'hRqb*]x7' 9tm v/M*Z>7ɬ"S^e$%eu!w{f,?biFY ~bbc|ܾB x]q 6H`PNRF=0<\#C9N':?뻑$fnf6RlAtSPRa7*7TD%Gi^h;px)]fbZ?| }W!2&ԔCXz6.)+7B(i~j)5#f}8@P_}<*S3FAlK7yޚssBtU8AdUA5rJ(Hk̈́hhq\/?;6zuQŸ,F&BՇS?2jjE܁=2=߇* [4/wH) \D+(X!_tUNrǭ@e &@qJuIn‰\~H+qG|翎P⽲h &Sw8^҇GyӾ63_F!4a}{cYw J#bSUF5Y>YiF<8i*L꘵|<|h@Z+EDK9Gu W d{vm7*.;;:7!+_l__-I}A۾Dubyoi'ɥd B9Zyws%*=2t܏ϖg5uIq1<;^[LܷRb$z/=XJ#$Φm7A8}'q!,X#m xL Jn82"8E(:~% +O+f[ף;yUv 2Ov&&zCgZ]qIs Q%NO]/PZ`Cn,'@W_&>m΢3yc2wNPNc2Hba!5>u@ctF3H".fU>n#Ds$muHLIX\eј#zxOƿkVKWr/C~.un`!N'A^ G4 \CWu=~HX[0䍸]~{n5}'^ uOlt`Ek!!޵<3q`=wUcT 愶d9N+Lk 9 ꉛ60e <ڭKS15mY\{d0MЭ WBeܥ"BV-ُ./,(uU i MԦmZ=MAUȦ d҄pi'd&{| ,$p^l=x9W~\T”Gl7lӉJDZQ)(i,aQ،@0\[ OG;ĻlHi)| ˌ+5M`ٵZmmtmy y-}/Kյ[N9UNӻ9@1+:xCG2;i}zoTl.Qje ~(o[L 3Jl%@ʪv=i#iDɛFMK\qiCFse%< _%{),)0Gdv͔М2NVԝo{>HG ,c]Rt0iľDܻ(\B2ai7OD׊^~>dh7LY1x _"ߗᇬl h5jT˘!f2,{4d'W(!8C霒 5ЛF̬w_ۢ>wU-͙рN98) gHWrP>Nn{$p Zş98rGY;'½a)hs+$P*6VlJ4W*M*tmW;<9<)7A>34DRf~@#t]D;ijM+LLv:(씇HU\3@J .-I5rL Rމ%Z d]`Zifcr0!k*;rT߯ϱ2\D]7.MG{>SI1_Q;'HŲ[A\ %{|5W CAܧ53۸6K,AXggj30&%Y垾FEIo60dqQ_z2_[TRKRVԌ pqX!:akn9ʳ`ߤSh؀IȞ;yCB*#4.B^k|K9R@oi9g˟jh3KO1[#?3bxio&Ʈe*f t̳ {C#i6d -: *OuI5J_0QǎŃ5b-nTl,Q{5X -HeQ ]zϕ%]L:n'D]A°0LJB6GGCϷC'ezJB1S;Fh [<@+[Oe4oZ;^j`ˡJ{Er,ҳ)9yh. DXKmK_~H|F_D*º~z൬lju K70f,- 7*0B.4Nck'6,"=zY T`ŋͶR6H9tVddLNa9$qjyFЪWA:w\&=O+\̐pF trW!~x]H6"60şfEE=_Ar O~etbCtJrzGC!]:AI#v*V4#Ľv\cڠ.P&pXn<]qآmYTgg`NN0v& @HIhy]ٖYuHeZq:Pmև͖ﻁaN( sڙlૐAŚPm;Յ@6KX}RIn:o1CD Ĵ9tky n)hHlI H"zt ..'ww51я%Q0|Ӎip%](\K^&Q3'BX OϬ2~fP̗c /% EUj•+|:UFދ0m,++ܬX@2߮ᦓ||F>2?H6fKI$Bދpb')k}&j(F+eUn!Gh[*&2tB3k!DWf>N~yh8bWLPI~O^eчRj|REZi4j-Qaf6h5,ss8_ep⠪tasN/ eJL[ kuC+l#gٻ3"G1jE:DwJ{?mMb]F;RJ9K/f$Sԇ#3ͬ@Ȭ,iw-Ϫ^KCׯJlx:%D L-a$tZItEUVhOYvZ\({+9Ԅzg"[xs/Bov'h g2} 4c6N\uF0y#M8$. {E(XC^H%Ȯ|yc֨R zӨ6@u"^NLr=:Gg2U> DLܮWV θ\k"3DWufJڈ@&'hvT=X]v!qY^;:`x7Gy՚F"3y* +kܪ)LV[6RDnZE*h]s&&Yj9v,(|=`#J{$SOw5e7ďLB:.hTE,w[ bXӤmA{667|q$Ch*&1VBqpD9<%tb)υ; Դ9Hek~AkrÐKԝK/nF⻑8}͘Y͆uػlBrK/i\lnw\rɥdK wC7Ҁ-kv\ i 2றfJ"Y+?swI_Ki@Q_ -iӥd9(+ZwioKo^=^!m yLZLy9(.Z s>8KNn <|Z[#k_e[W_2VU)! Ut4DA"h%qMZqs8|:BDk/ i7%zFh-5|<,1YIx ,8Y{Mmc 5 A1 N8a?ZyөH:([= ZB=JǂqmxĿ تjHar|tS%-{)Vybڈ|j5Gh6L,›N{1my8C^ aPQYu,2= 窙l "8с:"O.' 2¢LX~`酇U'#0@L"wXA)k/gN {P~SO2LO9$eͲR6[OjBxVi֜ӕ^kCCߍ rNgil>E>kr[?ӱJ2Μ;XٲդXefԧf*MO*xDJ׏K -J V`xUZj&@ʑtRN4"b6ȋ>F_As0dcIRoˆiYt+sa?*l7mSrn.Iz6r WB_nUhȣo)ZXS=T}0EAst9o1r=)gc8x͈N2,/eq[ ޽jeqén1s(x^cwxyCw64jr&g xPǡ4SjT; V 4 =b~0lhk݆&9H~ИGr!.vi2{IL;SrO",vaCPcf,%\z Eqx%l$I$nIR7E" 6N ӻ7GZFh!@=U9k # Jd hQ1Q' G;+y$7wrA*IV;Gph9`AgH,tMv.sњ*Coz?ˋRYE &H',l%v4.L5?:d,=sQ5qo`plrir*gDT 5ar<|]bVDy_ղIĐ@.v CHp9(*=[H>.C~ᨒ8cX\ecVFj6_R$!\,F`BPy϶"m.۔ʆ .$(׻ mA%EL9%:Vp5r.Y{P {;t6$N, Y̍pԉ5%7R(x82ԂGto{1ߠiv({t ̦?E UD2< v*^@nDKS0mJ`@z-)#${iZ=`arGHKͷ^W~ gCaE χ753P@7?dF*4g%s`ʽ2d/Uf3#ImDnϴ ͳ: 8bB/wqu[VEFо G268`cq.`d 'C=sqD,Чߎ}I뿳F@lApjxIX6n/4PlpF͐F왣Di-zUqsX"ms(Xl9LТ}nϗ-AD*{HJ;feAIK1chH%mM.w&9sFEffqɲYxA5R`Xs !F;/4| ;L tbphvl؞S\P-kN&XW##ư %W)p*5g2Z/lw?Idnj|q|i& XVhy$oMAS$ M̈́=fΓv}#N #nj$Hwr>$c^oU)Qf''2" >=D|,;og˩MڈX1Ը;(Ew<h¬v \Oor ͠qFqx'vmP>o0d|.3UtLoɊ 0L60ͱ691テ\'VE9ʋ-^}r ƿt'+Xp:>]!4 "]Ѱ!ڷ~](M] o@Ei ep//$(8,WG7*VȞWqwiP6ڑ2!C [u"'g[Y>(2u$7?MEnˏ8ohu:2n%,iKn?NA~CdCUDE0A2gkOykMJW{+aךڅI7q9c .94vv&();㧢_ |K0~1\5{CX4d䂍ch|le A|UNA] CB]$0v)=|D`:Fɒm|椹Sp(=v@WWL{wʦ1qȃb ̰! %;{-+܄=r@7YC?pWAHѱ{B`;:8ٗ%rff/v Nd~`\[.Ė`1XMu=CB?2"2 57h;OpuHfV$ E2fe. a4y+_v,Tm^b9ɣ;ĿROC=/I]HN8nZjMgH9~~b% /bt*xWv`U:Voȴuu`>g^C_ĵ~ z&kh*nNy#^bi}qrxZq$7pF\UvNq>Gd [j%\r ௶ǜ;hVJt0fԓn a<v[ڠ(4H U"cvoVN-FY?n2y 'ih*_r)F(] m/wCHbkf㥝ҽ*_F+IvMAЧ{-a)#4^)U@\wYYZp#Kn̴L> -nkE15YP>k+]\-|0tFDdއ ~e8IWM2x>DnK#QlEkPdrPat<řU?Gf4`bJt{' ž(4U(ͨ~*褒rZ֛ LN}DƘ*髠Ph'˃"'CC4Lj8 h6+[`%XiP~=t/&1-htΜrE?5c:`+ DZު Bئ;5HQ|y!5x6ݢ";s'o I+ukԯkDŽR: G`y69!qQn֚>?&K^MWn\OP'd'J Ni]t} ro<̲.x\YINSEw_xPeh,k@–!KE$ӏ5G;a1 9Yb8XI-,-5Y;?ڇIL=./c⯋~?ʑI; T8c2hރqLw2 }m:/.B9=blkL =Td@7m$m6'98f8Oah4^C}LJ.Yܧ5v'qmɅK*FTH-u¤g#$EzF;'%)bd*:n d P$2?sc-csg`˩M{C21a L,L=n3#ɻ_A*b_c`3~'ae*F".N}!K'␁z=R7A BX\kA֠%+]SM1&|W l}c %wR?$`!fvb/~!lW=^ 稾R\!sҳU㘒/`DW%KVD &mT8lTMk.1MSV?byVdg7yê\=QMQ0ƚ9%LB[ruy>X2}ZR0qh:fyzXԾ<̯*yCuU}|&X`Ym%7t帒̑Li|\AZ:goQo*H7#EO^Ck t|;ɨQ/UdMYӾ'C= ʚ"7Dz?0I_yjl@)W'=&%vGX;+ u;DX L p0\UeYM$ F5\߷߃rO0=R 2x7.P(y@-szB6hQ1Y;SHu Gy,lg%xEL^⤤D &2=K|(>|\6ťp/Q B?AL!)"~.9ٙz~hpZfӊds KV=pzruOTdx``õJa-ڞz"ɀ@c0gZp^ "<:6A[7RR lBk$bebgOO_n]-_Z̡҂ttʌ9k+K+"% ÒOZf]W%\ B\oFkTo,{,Crlt~%d]@:'U/cRI/1<=]\@⡺"u+1% ,kc2(J?G&n k6f,Yxȶ%P Mzs&XSamNEͲ]A!c.HܦG.*o&.Q@?f5O3cs~ܤ=_>it7ᖅ%FhNĎ=}=s:[H6/Zԑ~h 'L[ dL>&\g$!U"945'ZX<Ʀ%cSp\(a.߹xdpfgׂI.ӣ4;i8DN1 h9s bo>O5V(G)%lv`,E9aEz_;J/r`OHIV?hοL|gI!3,,#wC05~s5\{on,=ڈׄT?thV=ݠB2&y  CpIgun% 33 ##te*X9a-x&kfU+$6eZHؑ@iB.X0‹{' mwbbC-QhTZfm ΄ |=.y8 Dr5{o8bM[L3;cZ|2/DRbnҦYuxBYYEz2ҊMbzF e!m=$Ĺb&2,GʁI!iS0x\/OSd?祼9z`ɺr*31=\-p8dR+/{`!>rD\ڐ\tR}gtaq(*:q#ma/Dп*p}O&Xh}".gɟ{ iohu3U/΅i#uRh9fcJVPtKo|SrJr.+a隠 d,<>$F#mefdQ-G/Ɓ1t0FyMeVN8PaYGZm桓]" Aϝ'< <\Q#hp\ZMc 8lu;6PG\NN83{B{`s1`AQpfa9h鉓 Zq nP!q_`ˬ|x NUѿJC0BbO`7W$9.ޚDÔ"Rj'BȷړKt-їhX#0#Ibv&qCXІ'=Ilo{kD`t_?T!aG!E!ή5$zY#/oY-\ 1){О+$ݡL(Q.y9*y$\Kih__J"L 0 6 j;v}/e_m+V(_Ⱥ;GJK ߚJgy<ʝgP5U$6\nʅo~ FӇԗp~h^ c{uE}W˗K obӜo}>8 Oj"dmSHuăPچ$+a8@QtˑKS[3~OLI߆HJӷ'P&pCPB`~CtgEK|~Auc}M]} ~\:kёO*|+rJjIv~H'$:ccMK<ݙ۔UxYۅa_c \{l:T+4Ho1_fw35=[׫1cABZkv@~7kӡQ_e)y7J[ prY$@ø7pyjke:j=Vt}qZcA=Dӊtm}cֿUDJR5P|u1#r.θ2Or#*0G:H@* 1Z Su,/:Bh R]y'%dUkx",}*w1Oʝ+7HA9& nnlsqNM9 !2#UT4HY!`VQ$߂3PH|prQ gV~K۶O x`F%K޿|N8@bU$֥4vUCCT@5dxgX դ!%EH_nsxC1wa=VXG^UChIZA&AWa)E{8syF`RKBd(+Pw䭏/_D+1QAdj> " 9]s3_A`_&RQvtDpau ln+Hcm]- `f9@ ;v#ꁺP*tQËqh35`E#ω~&2z}-=7`y>jcT܏}FۮdZ> N,[\:>lXwG(!MSL8s-tA ^jU,(9L椫o JVՏI!cͩq1ԏ]S:M?ޠx?$JՊ*Ǥ݂LoqB#B/= (f-gw˘4 ǪV6QN8WE!9 O`SLApuz6 . zd昸 WG7@Hg$}#Efj8q'` *F8 7"%\V=:IQC j6ytמ:;"3P8|>4'wbViCSёa~in;j{O"_F`6:bϪ̤n]5[ ϔ{I_4ncSVQսwq(NB'%~NOn,K!tQ@՗lQli'ZBRNo:hO|!P D汤wc a׮zfYx vs `K(Y.R|Zo`@@}wLn+M!2gA~0 fs={{"^9&Vltb^F1)wJ&|zJ'*KAA&r #wV$mQb*N$^^`&𗾉)kLJQgo r@ŰּA_J_ s4Yd[#WeNxMo-Ra8S^Zsy80Ьr\@MѺMe3} S_+ڴPVs yS0[%,ظ!n9+w8ffc-=nlۄC6-jJ yp lF@i(?4Hz$爍~1Jf-Gɧrp/S?#bŖ†MYZ>vV+8$hJȒ`s;DYpѹp§ U>ortg448pGTn38#˳z? Sc-ƒgPT]*';m.PDak G5Y^hد(U- |U1~^,7~K羧Ɉ̡ N6v,o4ZS6chCSj@eҤ&Xc<~ۨ˝OP]>e~C2 t“LxAttV/kI`Q,EtU*<ܴWY B^%ySQkLa5^$NQI>NQH#Nj0![ &cZ]0x KQ*^>-g\|)=C%(CDHxzefŬ Y;Ҩt,y †ĴY⮩ϊ\o `hwsxht+A\ 74X!yTd':3pGY/zuCۂA1ބ}C#80MaT6`/Xpq/kZRW|XwDG6M) CB9 2d##@PYEX-ZM8H.(kzsU=a=wdmVo:?fpF{rlrcM*ګݞ<:b~g;V2/,ȣhi_mhM Y)[fYGj\i\ Zrix4'r$KVa5.X&AV[Ri!J$Y<^%UT*:@bȸcjB~;t B"tYKhb3$%-J+wV 8{3)߰6t& _Aĩ 2)Z%$qw5&a ^}Oniu(nVAgHS53?. =ޓ_TC`xJL$ミMQYnf !iTI+:zN%+ ɑj}4!R` iPnA73q]bL-[5.Ml?P$0 C1zпZy9v_wlI*| tLfdzB%0*>H<~t&009Ǽj]07L&G 0 9E/OH!Χ\+0 )|V V!IEF|(˘b vDp7 IPܫʁtPFWv R "hZF=? MՄi,p?"tਈ\^)!7 SpI;s.'8H>]8a!J*pTXyl:m=A=Lf?חA烂::Eux?tC( ǗLJ-WS_M~@2 OvuKGﱷ}fo,mG=HU!M)t .+ywLy`} ?DYߑ2oܙ!癐 '3Q@QlQtQf׀^n,:M_gl;BX9dĖҘM`Gz@H+WHef+$fWEвr5$l+)PgF5԰MXVYw`# ϥ/C,Yo!)kޝoZԏj c1w*>+qˆ |D뮳GgI8:>!!ȍZ7. xe~+U#c,1w`>]Lc1ݻ2r! nT kWr֪yO;!VWMLԚB HMh "W'wa?.m7"KnTԡKiXD_Ƈ4>Bu5Ҍ|llLUZFMT`k]3R#uVBa(ph$ [ 6gB#7-D<819eo9b($!5權OwRtUswT)./(̾j_ 8l7@Sg{L`֞y}cM>q/q%;LvlAz OedoorjC3۳#zu&kb+IgIU#bf0cl|zYn]9"Dr`|ӂ*tJWZ"]ӆ#yoJKcI\e _~e8mx&w,omϫ{n̡lo~(ܓ6"^gP_~K)ѿƗՓ#? yNk) M|) @wŞT,+*6 ˨Q,P5-?O2|F¯Z+G xG%=.@L’H0q7ه[m$(\bp=U - kGXunJ_ \ 6$'.eVm{,.PSFt.DB9=C{*r!y٭m5wo9jM<>/-i  P>D|FM1>] { -5TJRՄlݘ)!?@5nPKKcMJɓP1جy=-D8 X?h &ZӦ_+m#$/ m' zP3DNߑTJs3]x{O(ө o_ *$wO#,߾A)v$ƣ" Y3?"ZpM#_h|@/ஆf3}9d!|mw^4{&Pք-0R;?.3VGjj4a:<xʭ7-j@5Uu9V}@tk4cjޥ嬁L'`t+D_BROkXNr`Vgv "ZA%9M?Yba=WaxOډѷYLhT1?  a%+8m<B||Z'] Ihh7 DnX"||A| yU㴘F-VœJz0>疒^= USк!~XG`T:?YZ1&Wjx8BՐFwBҁRTdzxg\4^GK<ܜˉ8m L3hE8(KJ$N;̳{h]#5%]<,t-ݲ+69&^!?r aB-5#Tmdo6moeXf 5UA>0-}Ҩ-K 1 Mgf d5o/ZMj< HBKB`H(}?]7XIv?97F4\U8gbB%A)Meu}>=(=Ṡ$Oq $7P~߿8A0AXĆ2fhx]]?iyʆW~ܴ$0v_a=Bqm--Lfu.a7})RXUz  |B{"!ɬ?(X5{s|g96ҫW(̂G+7xqGjm̽03*$t |ceHafni w31@@~өJ@՚cj"Syq>9e\6?ӗ5_$3==0f3sޚ`xAN 6gߞ/LSu'So3#3Zh?fȾ%ܽA Н Uc_m>%E2K3Q/9>Ko}UBaАh]A-?l@hHeՌιaU@A\QR+"WCTV>:= IYkM^c8r, ҳOEe;dC.\g]QIexAt i8yr]QQʖAfβ._cNaqbszn$m9)+8 ]{F Ӆ g {˶T5ĠT;%3@;|j}/ 6GRw t)Q:(-6v+ o?5ɟЎC wVƴஂZWHoRBϜh٦A;5dr/! OaB$J#p(T- a~ԮZ*{[(.B:o 5sx7mGM1UK\^9GwF O(!\m/~Y1-x QWdpM:&/>J#T׍s+i84 gi(K1v% Yyෛ*`otT \oO%LL cP>kc"gA,a;ŶXvdЫI/3:`> v[@_HLRKO8HSd6+bhnC7X1YVӑ \ jᕀDJqDV<BrF|5IϙrU9纊[)od$CJ^a#boWII9v&w`X`R8=&3T{PWy}LbEڻ}sͧC/qؑN.d3Omӫ>!l_"*?wgMHu)n2NO&#ڞn.4vաo{'LzB#"H*;OѵwJuذ I)[wXn ۥυ܁^s%XT$.) ?\>*\Yᶘ6_yh'Dkum005R;@JvtdB pS|Wz@4gK {G/񏥓ޘ6}_!!*b!zfX.!y;GtiZeBh4e~as R Sc_iUCQ8 hՖjܘcڟg?ydڇX ZG${v⦈W1 e-Wk(Zp' K\6_ `aUA-?DE@ iy=ٗ)5c0&җ^&&u:Hu; Xmc@I&Rϱ)uRZðhIK'y7f7{[ KZhb#O眍ťzm7 mlӜ]C36$rVn[E#/{RRLiG`51%hM(x=W[kPO>) f+O`0$VǖW0# .lL=l`[i:mS\s 8}ӟe3H [ˡ^FȌզ8|r|!{oxM3ɩC,boݑOŠim6F\EPEL%cWاn/&Tm:Eɨ(!E>|TFӳG{Q##|ls6mj;e9&> ֖olGXDG_䗷74liej݊$sKOݾ lí,"-!2qeTFӉfWD'x#CY)Y}9T8'lWŞY<d{ploZƲ 9̳͕DМf2oȽX(3'*A.JX!_&B-}[`]:}[ } v2 D. Ұ@ג kU$2čйpzXfJ >>ŪJ9(CIΖ+q]l2sXs'}dp_wz@MzB">BTA_\"MO۪Ol;D bC MWJI} @`arK@o54紡 XpsꨇCSo=]2=Y.LUc яMj6éSCPBD8KJā6R9Gbʈ$i^E  RP5 Q 9ic7^|B>`Deӫ9P |ҝG a={d 4oisLt.b^$}8GqGLOdqOlqzHY3{`Kو&TܢM{{p#;Nag J-O3$De$I _Ya%~߷Z΍c7GDIc1 \ޥZvJyaWϨP 0h=Iـ hFq^`mJA\cA7!Rq]FO S 2iCk˸ڙь` ^m3:-W^lZOo8Ekth*_âAB[)5^cX/3l#OB~9Z~g:sXanTwܘ'sl7ipA'[n?+"&C(FCuM^r3Ӽ$Ŝejk1Ɠ(ia 6}57-)kśK?;ldmX/g!cpҾ4^kAn7#^!IJva fѤ7fcbN41M\roe C<j.\M-ԑ@45v.5ScbYR9JVڗ7CX/O;f(\4^/pͳvuxQzUԴ7QPrTK L€9`L0jT0֟Ok b2X0_?&%.ε"G/I˦U68lk8 _﹩=c p!\H'd2axy|N MS-d'"U٭,:(^QT\qw3z݂ŜE]8GZO%ʙ1v[EPH?j6FӶ(y}T} QNP Y?폐as'Sߜɘ3 _+[㷛S?\ǜ+/c ҷ"{#xF@ 9d ߷ kr3=VzT azhA]b,/QaiwORV\ב(Gdokً_gk ftD3&F.rw4s@ ;BO QA}75аw {`OM<9x0\: ^2/Ԥo鎼l| Lө1Nd4RBe}~AKr2}@rnV/Vx-hW@!,(=f- ׂiH=`IjC#xvhYUeGh5 TAu/4^=`8au|V񓘈hG?ә$?!K\H 7{0O <{F :‹uE{8T)ceDwEw r],m *%Z7oE K?C3 1}ِO<86?~ErTYO?C$us~po5Pz~$$AMk&zn2A. P0KnW<Ćdk}~'~;B/"5_sԯ|\4-L5d@V{\?( ̌'yWҙA=ė=ZgV+4&'X0| 0HM5+!Nm7+u[-+ / IheCK?qX8lv"lIɊm lJNj' Y6CߐG ?E@Mmps¿Av+3ӹN*O* K/Ǡf^*N Tpǯ G+<9*KN9*;_vr'wkPkzN~zKt4P]c$syrJj֖P-I-C5bN3 NfU 8zTbn 5ȇـU ] 6d3ڙ FK)qfH+I3ϘP盗(8h[%72 GEH%ѓXf{x]PLxԗ"Nܶ6uWo*ppzP^%-6 4_ɐu#Az(%, ncȫf'!Ǹ+=Nu&<7m>Xl) /AoXX;NǩZ,>^J5D2]_i͕poV3aB'-16H>9b}CۜL ajzmU{9sښ!銶 nRuh o!`[N;;JF1ibkXD$#;{>JV1Yǖڒњk5Un ![FG\RO4ҵjKILĕ(hU f fM!nvyxoolڦHhK]YǀKDjۻ#F3rlYSU2!ҾD?qyBR+X}s /,{6e4BKs>Rr|#.w /Bn@¯Q0̻{^ܷ IEń#UfU!Ib־F:ռX}F;a;帞J|V҄iB(=zOPYWdJ<^a[b Nzw@yeB m*>}x2P45R}_~yS aLҹ*!~=N%C.r)؇Nk +MݺBb?TÖ/M*nT/Tr8 iJ0G+k, ?) xcQ6vLj.U0w\@v+%sMLʉ_߷/ w +e`C\FCeöX Sp W_{Pҋ ѝP»dPky5&JN@ st%Ob*Εm{`I_:[m@`l/R@k??_%t@+jK\d<9wp 2kss$P4:QgP+S] 3{(TU&O:jz&h1 *|HMSa_> %ڄyJ̕)D N9QsPQs8j!êģYyMi‡KepMɦLd1,baiWY:f'?SfR_ \j&CnRڃ);uR{1|HΚu曡?>]} rns ) !u/8%4C#j2FU=ƹ AKM z9\-o׈Rba(XǹmFr%o(p_`6B+J'kiȨ׺s/q a[>]M*1ڹRșYu*?|,x#{$%8EHo7ܣR7q0^b,ke!bvX#d^cROPz(479_Z_Gmߞ=7/> mlQ};Or 4^GY "tI [x$mGt6F;LI#v@D_SN.{yRhB\+,1L_\h3gq}zX|mD=>Y8@#+獩lvM⛝ űRDQ gLb /oςȐԑ[D!' ίli6íklG#Mߑi>ɬ#xY #7gS^be<4 _DFhxi{09o-IᙼPhbFUpqx?T=}_ n$: P!=O׭."?X~en,S=nݏ0/M_3u%H5u#(e_|{Ga#啶lGLA7hߠJ8Ƕ%MmN:dgR tiARLRoΈRȾ(ʗwEtV8]&Uɷ|#{p|_@t)y ,tW=>&6gTH"VqNPNۭ)wT:WqN+ CJ&IQ'PyQ</8kmMW#K'Θ6G_[xp[磃/(ӪJoUhg}/A>;bD\ø]_ 53Ivɓ巿ME|!g(kEě/bv3hV_k`Wоef x9xiGġ{:gLp'=;ݲ/&?a2C&8TgȅZ۩fku'JW{ǭ\ޱٓj$_E[e0O_6'.Xst!Ba™ޟ^fY{'i};>e%/>^Mu-+ZBH=N2PQ`ƻhw0OjWYnT"'2Q`n<)jS2sd4  ½z9x\ [얒I,a}s#oI0'tٵy ;{Or&z\E?ΠrJ3컡5v[UeJ8v2ƖrAΑ6lBe*Ӣ;/9{7w^{}R6ܤWH]M4R(I=`Pm@ zNNt(aBpRQCv&jȍnsnaJ>1bj;5 آZ:aLlt p2bp+6ioa/A͍ĥV q83D){KSLjOŌ0p/[shg$+&&0 _ا"IKz٬`=YVqaBEز 4W[byRg[rHO 22g6<Db-@lSŃFjO/):(I.גн |k遠ɖ!u @_OXaR߳A7PPfΑ=l݅< -l0?16ΰZSKfם1U O`aƩV9XGL 8Y:H>ӶlY( ?ddE}7ja _R58Ķ@y5cioWw'ye"`C493׿I] K`&CGSU3bIطNੜ8wS>Ӊn0V¨PwT-M_'a4}3mPl83nM{M5zIi~  0 Ih#p;G|(.n蹶 1p m۫P e7a53`t}ϞO;4#l~+a,݂P;m_K_{1"/_Pi]7g#|}]Vs mٱ9F8qB)IĥyN^jw\#$<*6#HTznOeCcVet~9`SpG Y:}_;u^ɶی s3 hkҵgcea}L9;uMxaH^huX<*OaFmtQDR"qb"O>q_ZaHcKӎ*JO&^0%]wZf ̤ؼ1z .[ds6/vn;RƊ;|z SYC}yA@L+' t1eӴ D 0 PdA*ԻZG :3 b墝${\`JrIPr!wzJ.>>}˻)vrっ8M 8 G#c/Ua 5:<;QےsvԔGԽşUlnyD )6GwOyrQ"nاo?i:r2ۿ*JI>:߫qRI.g4`?E\t!b|h+N}Ӑ[dvkjsbTk'-t0.z`G+~uWknj\J|8񡻑E4bS,\=[)|VBZlJ@5tW#Wq Ț袞JW-*"ƖIf~c򥚭~p-%́;m}9argΎ$] yt콆#!k(ijo8'ivsEv$\\} tU65&}ueS{•u%ewcazyN`cWߚD}';BӴ&A",!Zo{f5f2KQFݰZb?9u.;ےӐYge_fW}}ɬ^}p8-EVChO^%Dg嗝$RQBAb;t(/7Q df%4/j ;`7فςc_܎SR=C/r[[xu|,_S&M6jO럍Оdۮ&/l)M^pOF(^Z5 _4V_'L}(#69>5e)\L?X^_¦:KU2[oxݷpѢPBgboDᐧc޾c~<)_0<tT,G8>r|rtdg5l4_kǴHeaLMSe>̂k,AC>0X/s(-5K&oT8yKώ5msտ;Θm5;լ0fPag e1J wS<_? mCȲM5nE)[][O@Bg*! xeC92xc u٧t@ bſ;54YNlQ214@]%çIeXgԞZiۗK;#L/$]W'8 5!˸^4o/CtA<v bi6Ͷuy laNEP//H<Dy?A O h`lتC˶ltwZ҆ "-R3GdgO4fpi1': v旚ǜy`]w4wh7 cvH/[VuݠqT t AɂD NqH%WVd5|nh[~i;RjtKge^s ";~PgnBj=^-sPMp-lF!.V3A+)=ӧO1U8w^>tK!Rq!@lG0]MI(K頚 9+tzgtTo0}!XJPmZԪP+ShBfwuEV3Σ &I&A%={7J )#Cr%nA\(JI{B>@q$ٱwN lqnh>!0T:ٗb~e,#9l۠˞AC Hj{z})Qu! BCJP@ ?]#;c7A݉=,3=FGEȬb<8.[AmtX+9_Ʃ#N{o'Կq=s9c<_XEbed,7C+Wjԋ #'0ڜ&MGiAҪ\oE^Ռ %Np֡j{Pbf(@ 3.N&e;)#/=^&)\BfduzZMW<FQf&/\3}#X(?X }k(x̌(M0t_2؄`.,1'ڸAbLxYvA=!~x>}9ܯIcJIB[WBքk\'(!KGM l8Ra])NgKOb~DhRBaK6$~^iVI@lz{{=҇E(bHGF57&5% qά.S9T"g*yH$<pk8TeS&& gPkGmH+QQB)@EF ]61`lj QH`]{.+O-eJ2rM mK@𑍄VUkN]l@@'O|d'ۚVcq -%51 Pb &J~3qE2M { Ԝ\k6D)u6}yUs&jaXSwrDc"ztRRaPb>4aHh̲LrѮ 4B1U>eEpwj%䝧|zxdjoGyyOD8ǟˋ!|虡q1](۪BOMDkvޯs#y_M71 E.Bk|c-uyg>rlM|QL&,:2mDLpan w+pneiNڹLrtR15cb+6#R %",b2{<;bVYrp$\c>N?vpaen? N yǏXH9صyB<>wp?EceϯOX;T,]*/Ac>IJjm]eLkrkQe͚p:H˱2*}9c̤ꤻHHx{&O&zc= D :f8rCaY~FtZѰ~1u8Kf /,SHx. Bt PFU>*fyI0=ٿgjX:U_m6nv-'F# NEtAZ"2֓Lm5對2x UOzfh)j,Z׵ŒHE%Ys(83f#{y540:p/ ^6'klLԛrtsjq3.4h1ӺY4cݨbSܙ&%3&|i;2v%1W%P[Qr6A(_ZNd*-j=wb*^Qj3/N7vMgBII0ZI‹ _7hEBǸLAP1(tPiYQ;s m<>0UH2ץuVa;!scsǜ( smfX܌L_STV90Fz<{)hj^mH;ʄ@c: 3e&5^Ur^M'BfA Tx), )ʗ\HO{W߆ ^0RGf-!rrlAVE@% IJ2%GS]0Zh|ElZ_>^@cڧ [EUƼYrgmBG ׵Sىs4U'U.sU)l] 'Y{mTXX ~#×s[E6u-X3 fE%]{G]K pR4tbe9;ӓ/tfNi),އ'r 3BB+7g(?~_f:Y}N_ <$]ohsq2@,^:1C ]k7Mײ*z{ v\kM.ɶ0C8.>18B6Y2 C$VO=WW0L^jCRH{]]UMCSIW!&}`t21OIidH= sA󴖰jg^ܻ4Oo'`_[@Z1t s3VZ1ǽg~r]aޞ]"ҿfc 5n؄}o5E1qFZթh\7't/lxG'WH$s#l^2201.\,KkzDa5: rRDkN*]mI,|gO.Cޠ.KmEWl"ː /JA|o*1rL /zy{tWamKa:(IGBwe#NR#{.'x\R䇎~ ixN)F^>& t>-U0 \3-mƓ*,W m۪ MYfSaPDw&qt!"Jnjxξn'Ez2&%?/I/ؗۋ(8[Ǵe)VL7FNx=Zf}KIfEl n!DUɝE=ҟH;ǫ}ĉRNezD`qj U{z. |ؚN;LzI?bj(je)6}nLcjpXA+rR+bMD":5u߻A6&Q'QY^ﬕ]LIs-O%ߋȪX z ^uv zB#7k_T,zPE6|C|nEu>ĝ 0 閟vuGӿCwhCaؾ#]+)p$:{ |hpȇ~f Obp?"V`q9e46<iפd&C곁KbEg4ߚ '|liLvo[H\L V˄^@f8%b_YQ1/xTPKC$VA %WԑAP8X6JBs2J&k ߅0̕.ShA@1edbP_;o#h~eJGï旀!HB^iDJQ{8j~|y9`FB"JVS>5ڡi>Z G 4<' [Q2p [#kɇj̯(*e CнjVeD+HpA@ܨPl\y lWHwjAxykP^:A9om\3khܖ5Vֽ_[n;HXm1@V+P4ī?sKӜ (B7JbUc%Yx՝xXg{S&-GnxsmF3 qQgף:eUI*G2a}gOgto!`P\ *mW@Gtx>W:s"בNmSU ҄B!IUSjc%AJ}g)W\|º)AёOZ  hͩUhiy"|.\C(Rip?.EOJcn1Mij2ĖP AD;T;q[8N~0o.VoM;@opU﷝_1$4s&ZNtvFArW7d $g4cesuU,QW y 27 R*8tY![ƈu tb]P?TkdOr5R}4͝FÏKvBbB{Yc:~Y d/D1@f6-GHg)fu2 DGƤeT7Xg`kwV^ɼV81~3 1Pzy~M B7^:e }J۰*ӅI%DGH_@X9 ~0H,p`**v448T:S摇uhJ3t|Ҋ4R~'x<kjET搭IR8Y.xc_=2pw=Gɜ7n&8Z^lP]CIYhTo)mj[d|QԃЖ${їɭlx_,M`ڤM3ͫT8eqG羹~/79+QuXzou6vkNY\i-NCYnwZ09~: CR4Άd-vf_bGs3҆ܓA*眵7Sdgk=c\Y}tX7h*85o|d؋ X>?A'5׌6Z2( LvٶKY {TPzLq *$UW-DG"ON 7S"|WS瞓b5Yl-&40TC]9-?obʒ}MRfkhb2_{YV_nm'$QUmHG\C!407uiHQ'֡= IğYl&8~bNL+$U5Abzlqn\*f\u@OO{"?SNū7`¡7ڕk.܇""8MQ*(Y#wW;Tvk*StN{a•<@ؿּ3_պZ'-G6Ϛ` H#{~(@BAF sg5AMd)kK~(wOh rEBI*3 FGXYږĿ !cWPDi4x8"YŋRVPGݑƌb'E$Gp ᶒs :86;He3:xf`Mz%,;T}8z]Z$%!|Hn}7;4q`I9ͱtpUO80JP3E;7jRޞfQ3H7-kzKN~lbbc"R:JhiL&@'LBcseGzp@aBd!8yk'Wd; 8g]Lׁw6sDJbi(^Sd*o@j?TԿ J NP'H 1Otl%Y\m5i/ϳT$wgt[QJ?u2:zDQRØ"~B䜵=!.\c|骷x㥘.bDŽdö_@UHr Vk9ں>qġy:U):9I[S'szڬi&$ XplZ*R$y=댣=b2+nS> V0~A0tgxϫP#} 7[l6 N!i)R2Dwіy@I>!)E WDNe1>ƶ9S; ǩ/#h6CIR'$E:"W"dhG0{R=RH_,To}`nԫ}UӮP3GQtoRm,[4}  WZ%18@](S:(zՍl8=PK䷆$n[;~G"/mR@##J06b-5K-%wvZJ9ή!9Zd8hD)nIsٗ}< K>ޥaKl+~)k+5 Z>#qMxV _PyHuL4*iGL$ysJ7LrB/x>ncK}2mRa퇳I-Ə#*_6|S,wN|Ɛۺ]pM1HG.#φi^lad){{gBIVBmV#ox4U1W 5MYc@^^$5f9qu/yC^}k>b"qEx]$ /JXT/Ox%89AIAi-{ sI~R(1*[eV}Boe Ze@/-HRշ>h1Q_qvtqOۧ1Q~/Gbz8pԖmtzxZYE3#keNҔZ oc0.1XpqbeM2othGF.߾2,wPYMEOy2H˶<3NSݘL?o{[DDD#+7lhR`)ЉEw(Uӷd gtHLq+zͩaT;76gĊ99 I<\xl1=d,9/m;nJR]ʜC{#VJ~r&@ s}~Q)ToS4",5[1F{UG[R4~VWD7^=6PWUY2t #n:#wno`}t֧cј*cW!R򐹪bٗ^ӄ)Ʃ%X UC8rǀ41F˱ $Ĕ[(5).,8e '4>ex eۍ@ J ݜF{;Rotbk$y) q|BaBWjgAY=ڤ& UOZ$q!YB"^qa7h˒iR\AΠ_RL0S d_$Ttɵ&OqO{iJU!ž4`ʳU]n5X nP:qφji\}A- Aג(U5?AFZՠ9,JE tnEh}%o UI ;//[}|+U/k^IלFMZt+Kk!Z͗!{n tc;qbvSudѱvIPIZ( , Z'VYu-8rXG`]en6ʍmH$N~c֡;/mnn}Er˷z __1:LC@`5C %q96xwMMƄalfwܐ2gYJԮ7gx+G7YYvk֮REH<9"C,e%\sn rVԍu~%a;,5ohWLO }V:@QͤF36Q@`Cre48cøm4`&kݙ}ͭ{Ck OqH=0wYpŏ05iM7O"#E;[t=pRRC0;Qv"˝MW(20}4Lw$rxWx?" zGjp]r=]Yb be h7Ekz -d[wpg Kk'g%9 д{Q*TBrA1 "soͿ[<< A}<ݭ I4e Sp>'(jvSzD $mƢ5ay (0@&*NRvm\݄QFpqiCv! %豭A_ь<|dG(vʢ".ԫ)[m>~%ƾ ׭&Op]n0g!8>kMݨ7d9eq2Πwl0B~cNR_jnvk;[:s$ɕD μ>E"0̶I\D,u6g)$ bpdX( rsJL@ݦ%O} 1YFX= AM\Wbh6H]@A'bV51=hiv~s+x?9 h{=GHY 9D*'fkv3N7D^*HJ)NIqXxr?d0 Ӥ]7+Ecsl/rQ\-UHGoJiQ#݅v~ǀ9p{0:Zw*4a͂h쎚oA4y)& `J{}&ݙUhF Obfc= [tFEN!"n`47sOۑpgVf֝?Fu?I:ss/$Y5:QYcJ '`{y1;h:"$#&%1 ̸(O0K\ &%Bz{0ӞfV'<ֱlĊR̎K;/uͶ#sdV+Ry`J΍dkvHT*1&W]1nVGE~FkBЙ% WŒ.C2`+;jb^M`h#I0>2 vb/W:uiЅ&DD×ZwYs\{>4Ӫnނվֈn)0.cb:;{lLGl#@n1j:8"υȳ|\& 5e԰9>vQ%[`.aR pv(i( 5r؆ى+ Y?U&Tk]BIJo'Om~K(^N⦴;$ y˰>9𜰅0_#:UG;*"&{ !)-JaԕY}#\_X,K!oLy(ᛄ!hgQ~&~sĄ5| )x*֑kNfNc#lw P/Gju8)] 8U~Ϣ|fszejeQ7g ~PD¿0c5"ܨ$-77Μ&Ap7 42T =v{ Ow{*Gsr ٘Qk j os />nEy.6)\a'f+Y,kcO4L-f~H3azN9G6 (N xVɻ6qfJ8fDޠ֨19?˻;3YÓ\!6K1lIhY;42j2[y r3l#uP[+1Q/[0ꙛ3Em]aDJD^1 >xR,9F&Ea,|)%plAL8 JAX $o~d PӚK dT')Up~3h[@42m Yha*$&FIb#_0nnANCn5<ZՍp6MdӲRճN٦Ų XŴvNF!x|`6l%šHGWn'7MIS,̏gߑnfS.p7o6)0y;.f/[[2S^My05GW -ASSkl/a$Hb0j;s #zs(~d%o3CeUъ7 },U; .x#!Q]|G O$T1Sc ΂A:8148!KMEz@莬k !:{!oq*]؍%jr.i~$)#;, '%G m :gksAyz{H3Q)4=)TR CdHQ6gvCo("B_6 ZY;JW=gߗNOv5l+&$,hhE*D-k5w0X2<#m}o!?J6 ' ˚zuһZ -[wHϬ4.L+O?Q T3@[X%Π)hI7ƿ؎66͜#Xs5!pKtf+q}Cg.}jϋ[3Ԟ{6Q⥞2.gti!-C?L[iz0!oI&h ҉lDwW9.jӗաvMvg%M> O0g!Yo z3h:Ivo&_||*hQȲ+YE泽gP_pk c 7՜ k@*4O51a?5೒kXo$[xsś60KEdWLF0σexQ-qRY,OG{ư%*g m%vFUY=8+QLqzOȑ މ09`=ʘW~n68KoE2A<5-lAY649$#ԊոFk~OzDt?T d.C/Aa1(9 &%;.Z~آ sҠZO߂(rˀ_)/\lUU;5)7RG5Sɩz*W- Q0:(^19zvjnݡQ["W _S i}pCUfA /}'M,3vOSMް虜@ .V;eJ15 T3/3N4|u>gໞO-6 6%2˶`a,Zk>iig>N[sn`Ped!SLlT`cw;}Y]?X:AY~SL4e wm>v;a۰}=G'aDoFcPrHK.Z4-d31oZlu.#Es]r99r3&:7G\wSPO^}%.#J`'pzٝeM?٠ 0~V(_ߒKN %x0u5"B|_2 "{FD -Ug!pZv'SjYk?-Hb<%TzΕriԟ*QݲO{_G|9O1hN[v ki;,e~ljt\-WgeS\4+&N]ۛ8gSI8_=H{q5gVJ0W3{kѕ*k0,T1/w8^S]s8GM vn= .gOx0/(L ePK v7qTη`+*Ȗz|9>pş7=$6od&sՠg]nZ6/Fv{3 7XoI1/^Fȴk{!hcȍȒ$6qh+r8J?wD;'p/vWT{*q@Uyw C:x 33Qczuc]U MjARR)88yI _Jwm"rNϒZU%B#fbz(Cj &X1POďDl?0d7EitYe ɇvLb &r؟Iǘ_)ۛlĔGc9g>'(rtT sѦL A1 -\jxPKG"BX Pl?E(U C7[Z,ws.d_a\i`La̙FœQ90w`26Az1Owpl4l~:(1.mz7ۈq_Ԑ3cm#ivE1vlؗ-7DJ 2W.eHid.S*uDRHCCߚrl/hG(O&}Ҁ8fՎ9oᘦ$r RVVde.\O}V=4˞P *-*i\L2NAvc_N P]5=%X 8qb$܅d!''ztG &ɣ'\L*~ڪB+1pR;I N\ɝ62uNԨuWs? N,=C+84(ZM[TE1Ǽz^_Oac괾ΰYFFHv!C{{՛]9@wɷQO Ohjph6 88qʄ@==@9yL?p wRSc.VAs1QOtymG"@\-:қZ RFzJ)A7ՠ?ɯ_~*(}㔡{0z'\rw7"t8y92:0:I#-Nzk5g' qM}k+Ofo^:k &^i^h` v. 0mN*(=}@z¯;"Qd,[yVuȇs/Ik/VJR+<*i on<͵7AlAb19J Z6Ll3Drԡϣ+ϧ_2" *Ưq ϙGvbt;],o赺iD}xCQ.Ljo4*}TBPK@Eyrqv2~g?Oߋ7aR8}M/)jFw!ZO==LXFpeê4r)[[!ZY,D*̱0kh_Ҽ_{t|*` wHLr6J;DCTcNB;Nz~4`h{S}w洞ɨ0zà{)%Њ&=¦ٖԤAB cǗ1GqwѫxN=9yհܿ }Mey❌qk+HP֟6HVB?wȼ2Uzb7Qs!vP1="c9KQ=Ҡx)ͽo kems{Mٝ\w ``VnuU{6MsΣ](Afo:WŎF4+uRim&%=)u|E%&-,g"?86A!:j3%qr%ˣ)u,`.0QJШT:w k*x1 dyQ,r>WZ1d%7`DD-@hYtdh-*Wu'E !4-+Tvzd:U'cp[^*J ]!#iԬgwim`D<8}TŵǂL:XA G7:KQnTOW/)͜_5 IyMh41qn&N?)9(䒸*5s@ȴ=;tPq#J\0Y-)ږE=M>Z=ߡĜYldWT3m~eC3yMd.: 39 [F <.fFh]8-8Y V"DKt 8PEC* ڥ( >u^܊blgɣ~"$tl}EB&^) T/'U}fH5xz 0tv(2>qWDX0 YB)MN|A ezccA2'YlvyR~rH]J9D'iI.e&.⏪#*-QMiK<Æ'SZ%}Qd !]eѓ?&B>u-6Ĩ> G/߫{j//xO 0;\6wD0)lL]r I'.rWx''~r*^6 JBᵤcE 3b}ߟxJlޔtBlj DJ5^j3Bףb:/ A^T|"%@diqxsSrQQ}ߍ症k 3I:ც26b0Sb[>ɣhZd )T Tf\zX!=NR~gL.(̈́]T"3dͱZhKfgWmρ%A4!x! "<ǻ&o+$>Uo>{f0*c>XK^4kdP'MZD6Ty.cE}?5G+0pFщdvq{q8EBZ% uxp̓l#x= ˗H=يd8>,͎8hUF@ ֒=*ƀk>])ccUJ\X [Ʌ^;hBuOD)p?kj1q,`FDz$rC kk]Dž%j7Kxh擪5u4U` /gHp[׀]x6_#[CvmwG) |MÒQF=^|؋ j G/;}WL0*rwQP BoHDm>MX*} "aa``T:+cnvT{*"=`wOz#h.%jk4ջq (_!f_C4M̦ ڞ964 /(_-@D1siX?Rj\u<.擈x.v!~b{NR[=hlϙoE:}.Ua\^ {ON~,ݼm՞9洳~)cOKFI S3&ZܰOnM=g*H(dsNecDҟrk.mQlDžtoƨRUbWx+㼒E|{u21[5pFz0]:4R$K@8P7:;%Sa)R0 CQILRJ?߆!qljǂx ПV(tߗڂ,O4r 1Y/D_7&TnX.ak#H=ǏV.Tmu`ll@z,=Xm%BV B [Ҳ#ݑYL~FZ;-̆[e^l.[k}꟝LGd7~&p["c!{FHFb*t'=h}i1TvJcH=Қ^.fŁع|yf(]X U-}kC9'JTN~-x>l&{z r$iGqf">ʯ9nϹ_ld'r- T`h q Ȣ:Jrêj-ZYcԗEy`v0 5UߡX(yJ w3Uyc F^ot,⁨+ I`5lJK:AyK##LA(_ZzG- ʻFV\p7U[U)Ѣ V5]b=>&^` : /^Px}~zCh/c!Ujщ2*;,7G ߖ83/^|!+)P(T TĵTco0Aֳֺͷd% IA *bǗwXH͑iQOKn1ҏE;r(vWSOww?7`\bjEdIݼeF6r&D!)h3x}~@Q5= #i89^~ڦ!Hq3=AڊIiѥ8ֳ5tTUk,҅t1âsMƈ 9h^["7pQb ^j9Q8|~%$xI\{#)½Hzҕyn G>BLGDW|J@\h9-`)M\h,: +?Ԗ7O#\~A{RF B W  eacc_^yALnqϡǘ1uIAdQFV'(nTV/ _M,inݔh>Y^!&¶]rX{.EYLw Ɖ|we:l`mtyܳVrbcU/:!Fd1/Nn " YT,,ʨ0P?ef`!oJ߄1gR/O'`%n##{}) H~;$BJ7FHg9ZA/Uozۢ(@D0UY(| 1춬K(53?r]m@r)$nh6HW=JVDv"QJD>N) čh]A1q4cÏOn}?r Nv*^~H~4 %[du+#w4Ng2Q"H?}MD{zVQM<-&ϡW#Jw[_ꖩӥ^XPsg, Ϩ!-J~)9[\P{x~T%#[|V=-POC`$Oyhcۂ`oijwƿlY \*25P KOѹ,8Q$㪑Qv @Q $ӈm2NVLY*$Vh6<]=J.6{殥3$yh()1\<SQp[b`r7@sgi箺3nw(o3ۡ/O_VYt`waUyD BAnʓF B~i݄K(0SEg3d\-LC&ٌY=[l-A]QH;Z.N6o>$iJXAHI`7ww)Wc{q Ԟ\a9s ص!`XDD1`}C9 CBX|Q-!j "b2|ޗ8)2{c)Eo•PىDl_`Htov9iu3Twz"/^i4̖7kk~ƣZ7 ^Y`: x-à|-˰whնc %5hbivk4zE@TwgYa+TbᲛ~K)9ֳAcsJgKA9q \b?8YXoo`jR5 eL7),cW j'd]jLYNU캼n)=z^z{5X%RVedzl$max֊4 SZO5Pv 4UaBC1r^SJcU9Ep؆44dY<$-?K)s[ʋ睁\:8y){0g*:BJێwQT`- ,OERl|VHjt(&9`<(d/DVm[nrpxLAW &+64Ze b'N/-5Skl=ҙ#g6/2|9M{_cLHڦ o(v2iyPAmiI:bK!p̍rR(x?kpX +xbָaql=?gܰ\./…B֐@ӇSpj"*c?s$.n yl~$G4r* ،]g@zAMz\;abS@ùzmiwF·[pDʆF_[X{,F.񽠎ɂ@hvF$&pT'MW V=#y vI)\nJaxI;/1m&? 8x&|}ulΧCk W՗oS|f 7@I>xW$G;wpC&d]w3/ xj2*&LΠv3<ţèn:I12-2qvrTDnT:(K)pJ:&S8w2@-)c$o9g2>BqϪŬe!5~D G:kTZnf{-F f4r Dapԣlk-͘x]lD07^.OW cZO UvA 4rɪr(]tR@bO$qI&xT* sZl&r=^h .:ͧ_fRefٕy"d,C[m@Mqc\}9G9-!!ܝKEJۚʕz~|)`,_/Į9:cV ,߀Hb)McnXYFG֛"+G 8d@ ]9/Znt3bzя+ 7Y#\8aP=F41Ak&Q_4\h-PԳPuh4!2=<]7 T1|C`Q˦qt՞( ´"l{ CoK&L' `Yѝ*{>ٷԩ]i$,H{dqW1 7o k؜G]h5X5F9(\Ŝ>FK,b X-֦ݣ9ma&HO>(3ŝbSiY@FYW&oH!!6oE{a[M#PPפB/K`;IML0a42\ٞŵU?8]M|t]VF- ИڮNX>CcLjhi'QPwf"d E3h'McӉ6̏G{"X%vhJT1z0 G <.TZ Jbt*彤Zpגd3V%s`n*Eصʫ"RLTpLcu2O< O@hc宧Կ`J4 Agōfr> rx4kV,X.S] *J&o\:UfnAB(#GLRTB/|3,#6.Z߁wH礜jKv.qXQmZ+e>} tʇ/5~#(׆+88o i?ygs!hr&~MxZ.')H8W%UEbG8_Ճf\DGؾo%'6WFqmK5wL&$sx9@TfP,P}<+M|O6A|ZS>GkH57KZ$PCߟX⫇}pvߵhH^;2\T/Cw`ёHT{)4*sx#v fڮMT6p/pḾ<5H{ $zGrv55,K 3/̉@P܃ynɩ#R"= l5TQV61zt坰L Ƽw Y tNS)Gp9wKB6LԻs!`#~F~F{N_K(-gFهY+}7TXG&yó2.e 0Y_>Τ1No[40Ҷ$S~(6jų`,qL&ے^l%kJ-z@Տ;Θ˔n> (CK }.Mv y͘,-\ӛcQx%eȾMus݋/ Z5E[[Z,sRNasј8OD]ķVӨ`rV:lPW\ꊧ,.9m215-p!3PbtUfr B&5%S՘U+PȡBN`/ŕ\L8w[3QLF w-ҔMp{OeR-@TR`V> fZد5 /(kF&,sJ)T$ #Ļ߽P;hN>a=)Ln̩iG!ϊ ~TFȹ|#丰ԕ[ذPKvoWe $S~ߤ/5=9P6nH>S{T} ǰ~Ýi'փX#ƚI5 r]OyJUh"bO˓7 XtaYCza))h#D.Hpy8 tU(|#3MkE5b)0å< + tL h=X1["}ԣV2j0L3'a=TiH1aQ((J-l/BP} +]ђ| M\JrٌG_Mn]^X ڠ5lD"*bP巢Im6щߨ?.WH$R c=ī vTюGjɕ(ES-Шo?Fх6sg $%ޠD[y=㼘9qJUFi{81svjž(x}kS1B<'ϠILjC`'|F1EE?U1~U؉es7K8BDT6"%-t<ۗ\ϋ ݺ-<ן/ *@CXCNHa>8ŠtBE\5NQU`v!O6 "PN\gӴŷRA"WYW|GHɝNr;r2o{nSoFo8R>'׉+NϯqDR3b=,M(_vZP5w ts XxH.<ș,;FXg=iߐc ѓ2%4Tʍgqv3&b8  1,g˸h+a+4Gd:FrײWٯHo><-%SȬ'bJ S8Û؟S5i Bc> ֚'`eZ*ޘ,(>z|3N7+\ Rs ^ģ;]l7>ĈKd!~y<o<L GEe#%{D=X{%q᳐HQCbJFN # 1H1ML$(9&zo!P"[t7F{1Ǎ7?.Aqvz^3)rܴ^S?,D$uZ>٭ă$r%5q9H ֥M:'ɇBb YbYX$ Z8'ZeK945+`T\`-Nwyh+cJI}Z@}hr @Y .SӐBZMumkjip/+~u W@WNDshBg)Y L8&bp#L108-tA(d&^}#7Vt!AUTG"jTI,"[F'1oWa' i,k,^_rGt%KxqNWsfzpE*逌*8:_Fc{BKz=U `T|,>6w To*Q08eYB̴{ZH)Pu^/ Ad aJ4 )C֥@r({yߌNԯG؊V^-=n3J LjyWP3=$MУ >7x!ן2FjrZ`K"/NԋUHd0BP '026iMMQJ4zG \gpҳ_{^j錄- Uޑipd)*yv q2vؙ/m  f9uŹmUD;LVU0MqZ1xV424⢖ dacn`ˏKs+6Zc0Cr5;jb#y8cYLx a3ϻK{tDs+oRx򎲍S!xCksg@G&)"SgIW_ﰝc|f%h*!PMvxh~m#e?#%%J gPK5$!L&.J;VӾn16"@֫F@:YI[/W"C0K HHL2f5h晏\kNj U?<(m9XZc#p0MOkq{ lE)=#XDQ@v%6tӶ a f#D]7ϧ> NfEiB,0 )@Yz&hQY__3v^Uq_Gߪ"m9M "㵎`ϒ嚷 Mí0h iJQGލLDo15'.it*JW⊠Y ԞW?6(NSZO g&I8]"ȶG.!ʛ[ B pA@3L7&-1n[so/(\^^#ch궧ýBB I:yel|GHj7aH) (Hч@|?,=|P4}o/?b}m@v$MoEo,Jjҝ[~$9+*ybθ@/W9Wjިhg,sq6#1g`f׾wZRW4UQjW{uc45]VED’jHC|TI 3X* MOJ@we|l@` ؖYgv1ڳ'Z ?ޠPޓwb*Ağ wx^מ׷%t=T*Aމ$)@ h;>pT(hB 2e\؟Fd mŅIF9,М~:ZjN!|(RqßfS]%`?ʑ#9*vn2$^ϸ\u?(tㆹ{Բd”JPb0^\fav0XQB;l{ 60mT&S,DG{݉LV} Zz)?l:4F.g" ձҤ(dB^.9L0"WmV vyrH&I[wۖqզ\$Ķ`=[K:S"6%YP >?*QgƖ䡝 kTl?&Urb u3 ԂAַdM,AX emKi B`0Fl('Jvvt- 'm=5߽Zf`>ӔlfP:Z3}g<\t/q5vC5~_ӋbW&=IBk`)Qq'sv\F4EbÆ{ή2;0~2 *ő +=MI x:Je#g!pr\? (٩n5 *tHg\x[S %UFp}B2(9GqE"6GO|^ 膈`dcϻI G%>?d4+IHU@N=k J-9l 42)oQp 0UJ<qRHczRe B),i!$3~S"C]1ߟFVh=Di:_[8WUPV3CY]{]ڝ\k]}dWWq)*[ffW VkEńt&z"Pd̶Zt³[DĦQ!$gt:XJ]/F^TMq Љn%,W5qvD"R4U _*h&Aܠ ?ԇG1{EInΐF඄!]0ޤ4<_, i}?ݏ ;!4)Y&K "ꆄ&BfC䜋ƝRlU ][ 6v<HK^w;']0p, ,Y>zpk@' 1JłؔDsЈ7u>ڈS;EGcɝ,J>Q0ɵϨgQ!!Sΐ(#'# b𿓰\A#IRq`gX2)^Dlnte~E7֙31fqU]Sƴn;NqMk4⃃bx[Hb-ߨ2oiΈիғ8 0=$㾀}g{uqRjBIj>1b cw鐎M@ {?qm,HgwUbsW ;k e  =D^d dě}8&FUbMf#3|v<6,*$ȭ I[UbzqI؎νPIĤ%1{eu1TU5 ߓ RRj91m'%IP24}w5/!`L?q<[4!3X #f(b7^6-u%.&(xf+y1#Om:*i@}É4IX]?Gn!& "1}M&3YfG)Ad@$a>lu[l- }΂#l*gSRrh=piT 3}'ʘOp5iȕ7CVvYQi#~v8CYzSrRJ:8YKauc J>s6o{,LJ7El -@f2=P= <@ӷ?@\)[Me$=szUTf-K2L ^Ur6ϤCYE.ЀBP&|G) ,X}wUb xh@HzS]M ^㙔o6A{ܒZZty S7{O{L-ūxw| 7tahIwQ?S;vNQS+t!/˅&d,J"$q\] pCs9i#o%\C 'N|96K}?mvO݆鑠2ڃ" )#Wx2 8Jf; r&dw.T7% YRWRghWfT(?6j:x.i@?@U1|՝ֆ^sc>=M&Qqƕâ4Id]mX bt|h 7}Զy%0)g&K,?2l_"CNwf!䞋r>WpY6k(e۰v|Mhe.J3BT;-dz:pYv䬽Y(_pM0J.U~$1Hݽ3cv4q+"x/zT 9^S#n1ӝqGdUv7Kۆum;-ˆ_Ny]CH,IsxTpk_wf!Y -J\ mϭVK8Tf$i|#ʎ _F+Y"|yDe~3+U.7?Ă N7SzK3bkhc2G^o3^Pg\qzAAky8BʜgVS*"I9%UAE> \O$v>ʁT-`^Gy1#, -`+-.a|KXk_B0IPW& 7融]_bg(`n4Z2 d8բ| 9/Fڭo\С{ 4+UAn&ed$8$cٖx,@+c6fu.)~Pu" ݾ؇:@aKc{o4@.;yqn '12`PF3JKhrݿBGIatH"!-o Y#Vq)(8u f/_uSj#3?Y{D]˕1'lOZfjKTddɍYh͢3霔E#Lo+uQI뮢|+xIH&)b),,֬U9Bk`2Sx70d+c+H2_O= ֊t;JGJLL/ɃڌY,BV2oXͽ@pn@~ޥ۟eM"72ND!iR;U@ak+rMuԝW/(pFQIoK [QP +e _5n\XZu/,3ŮBSQmŋZvB=̱I ߍs $*nLI.u.](>&0^TD-'n=q9p]VA3-_m_iֿp#De6αXN%quGfS_O~.gz'~xsSߝ3uy.[,232%mڶU)sY\m||vNAЀ@?-}U>OQz&)/9BZr&C8o TV@OF`|;|AViG׳{G\]f'tקNmV>Vx!Vg"'=84s\OHEs2 4Yj6@1 -6Ԟb[ s^ʢYEO0ՊŌJFIh;}Q)(mQi}"aghAϸ2[ M=嚴u1L,y}.wmrZ1ygKu9M~U׿L&zW:?`]_aLQѽ#ݬkf=ΛBښ=rK6!#I]V l h݄6DTW {N_O1cM]Sdk1F:V)evL?5]V `;5Hc;9OUK9lKx5c2#fZ% 7|46H9ୟY>V %e ) G9w0MvDPۭF&H6B``:KjL4 RMC9Tn~K곧3}낤arD)'@ .xtFs]/HBlOq>~i+*50mtzxgWMN)~|#YSn&hh*'O,v9:@ZiÛ8dad ;Uv>w\0/J> ?c/u(ݎMݍ"g WmթηAb# C!AN}3XAL9~ΰ[nT=$4K3:Ev: GچpX)btg?M3?^rV43'g)z_} ϽYK}VKZJ+pg>ҋ}q:qJ)|0o hQ-7V90m6]rw/Ixq;%)䁻PO1g4+d흩4vt'q^ 툭&>Ǿ瀜i7%θYҕVwQX;70K\&X7SXHxqPV3ƙKxjN}4-Zm>&S;l^o{9%$l46 ?|ܝS.er l.o` y.1[ռ$ ?2b$ S ,–oOE!*5  "+kIp`&qY[+pjv׮Hmh;2$]Kű39&NEC7rAtaS*rZگ% 9t#6|" qFgNKݷbG<6uB\_< 1I~a/lW:FPv0%VIdB5S*FNpzGVm]דսwU-N8A(-AA2x1<}K j1k*l+$4BjnpHñ'wo ϊ8T嘇^!7j IcmrSwAznu+ 4X>I`akݾ M39TR:׉}Zmm6a?c)i8x toLCOuz'X$]SiB?)ks:xaZwdd$sFW xa!)F옌AfBGмgHy.2ϑDb -VߠIiPc bMgOoמU'jŀ=Ql],!fЭvv?+^Ѓv7c88zu+R(la&nu |\FNs/~9iw-0)#@|ʈU=eg0MxۢPZZmGlQg,F{[J{ $ZbU"\w29J؀kvBWF<<k_]MmY'A8 ~9Ƹ1b4[O7A?~)¸sD&r#*%﬇ahF@ N,TC=(w :_mի@ݶgدlmW-66Jv4sn(@ϬQ\W'dFK+?¯9nz'?3cۄ|\~Y*sXT4H zp[ C@IŸ?_ncîAۧ bx҉'FBڰ_d/iV>S`z+dK$ś $ W~cWS 8!4;P ]aiY㟬"᱌цdG}͋6`VŶk 7o=mBu/%iXʱu{_K,mT(&åO%7%.k+3 Np{Ne M=ʩp);ՃAXLdY4ɱJJK?49Qv3b>ޫ@+?ۘy tsd4'IvkM?iUo:Hz(a`vR,G洫n?kw!'uZty@{*;Sk;Tl_ǎ똍}+}D|CLl_qײ۔PU%Q%fٮRڤB9*f2{0e kcu ybZ*-0˅{hAOpe{4 AڒNPS) fu7DF$֪p<~0M SM^ed<k ܥ} $aΫrpKX;L S;x@ o>ENe?@|:[) vkVUMM*zg nϽ'%p 4mOaۭ7fybNTr:TU@eaF9&~SBMUg׉HgrwNMW7%?p7j:TN"DAQ |\n]a[J2^uu^"uCS}Sy T''5&6J<D\6f$M(n7Kij_Y q9=6j,5b=k\]GSm2UjC* ح* џYL;zY`ɸ YVi#omy:DEi}MYw`$~F4ܠ$doQm=νw %1DB 91}uK7d%ԠWJ!9M|#$)-PwgeDǃc̎ߛ:M(ʎhF)TH3$@t:47𝻮eEQMh6Տ4mvXh"V)8 ES+D|s(;Or>U_C+֝|Zhtv_-{4gY6M%0 re>7s3ut>x _o"Ǫ*= c)eLAC橥tDO6fp߶ڵJV'%XtTwwx8m{9͂M| -}?De(YD晖|Hy.q%ߺ9BMv_t< ."}/n00&59'b0wa4@_0@a@oqM٩GHB8Zn=֛HB6`}j;pq^UpW}saJ)lpc1^T?wpB(\(.k wCg3TN+6Zb!ƀk8.,ͱS!q LlqxB4f'S*&EZmN[C]pwIKig#""RO丌K=aTG쓱%RܗHz+ӕmTy ?ǭp!Z³M G~Q61^XNi6B|/vQ D1ÿac?vhdhNFelgFP[1Q+|sb- wkfN 4ߕfmNkT:?KnŜ "`dNӦI43 .0h֑~DК[^\lq&7ZZ(YԤL-A>3z=m^20k(IBw)ZG$!p: d7؟;d b\?m :a.~k7_l.y.Ű~ $.^\oϭ. c/DxxJrS_Tju1 '{@U]<Ezdb]X 8ܷ,ʻ&Mi/`= 8Q8tSDXr e9BCb7cˡUHfuNKO+ZA<fC;mѺ W{ɑ5.W[PʙxL1B}CJ7wH< nt t^&`9jazE<ϹjE)qo , g$oLdaʭ)Mg߅ȻޟE2HJ !DJ-4 ִl5OZ|.RݚSoqiOfعLdil2Ύ_ːytb~/ DuA" Y[N'v1}3^qb첚xV^SL|\ɧ*x% uu7 Ƙ2~|(x0LpY 3Vw*;ʏ3˃;vu^]ETt\]vͻ!`Lm{1˸"Ft##7͓ XJ;_`DGGb{cv Dv2"F0.  ^m?QH putIǎxo09Cxi:koG?H*3-B2"ACVG/[ A[8ocj*p F?'O|Ș ,yI*&;NߌD5fPxHƷU,*Y$Y訣Nq-WshHKS_ {X!7 P(^|O "_fJBF4m41h9|?ys-WN::So6AN4M0s~/)ݭ_VJm+Ϗtma@Atn9cޫ`G[|#٩(؈M:>ʪvJ]'Lm' 2%*isrV^B=bpO5d WZ%CB3g˷|o=4^󄀚Nˏݮ(3Mu_S@3qj#(n3@E7/CwYI k+}8P*aKbV3m`C08huAdo? Yxk8bAԓ'&daå3 9_Wʟ%馅bAW,*j?!c dDzAk CK[02<-쉭Xi Խ={ɻL?] onW0V̊lfwWFIg@ɟQMPt7LyGuy!>I;ï>ZU",'plm*!8n2DUߓ6 3Jb?Ȅ ixTpYQtaԛeo&\: ׃5c,ءsA3*LYxg,pvM#ų(߳3K"v.p@Aş6r}jtu}.e&XNU R0u:I-pȬP]BС`xb=41Ư0G PD\ "alLK|~)n1}ECdY~sȎ3Ui3oi qfK٣pN74:,Za5ÐәX?lMK.n>ӆ@<$uVUskh(N]r%PdgAQ'~TDX&+(7=EjzXy2FQh`7AL$i n.B}=ީz_rTsN 0#niĭs){ l2_JcR~V(D|ߡ9=9k+twoI\Rr}RA݉1ĐKeiQ\+F.F':LyumɴH22ݹ8S>,@|xM AAqW&]2YdcgX778lt"oC [v$sgK+ |dw?U }sq'5`z9}J+|a|^, p'Wg9nH5ֶW2SwBpb g~-(}uϾ\t鉁NlKɍhw2LUm6g^eo^GeCεn4d疼j P,DŽ0OGYM&Bb')19/rYjmwC*tռxП+o0uIv 4t/|=͘YwgJ!?k29$.+ǁymom8&7ð{dNP`VYPkv !IkbIg45VZJ^*Дi'Uh(L?-;s9?q ?# c7 CQt# ,p3h!8խ'lK\/n9Z :47'lWQN )~7f U/EL6Gq7'`AKj&dj6=l3yb/ h آ,py88F_0G*Bvrs!ƖEq(n釓+Jbf1G,<Q})BE[ᶹ|@!Sm y$.0QI;dJYa*mkb*n--T:4o1OaChI?XɟJ7Kn~4Άr3pgw(! <&l})u&ʸ6BGQM2T7<QMI8lvGڻ;EK(Vnx/4q/@gk@)va_MII}a1'u%: V,h.Ҵ9?Re5'p4, 2&7|Ldd pag*(Չܯ#{㻼bxDLjjrxFx ^sk<4"v'̬mSsKZexYTt;9Sw?Ҍ5b}j.~A{5lEFۿ&Y gY6I?)dn^ʪ2wP0}mR15.nDy)Czl=F Z 8 r&*W]þNkPVUWh^ ]`AOc2!I %xjȞ0._<䈰ܗ&$5"j|tu|2u)a{t@P5r-ɡux;RrKS2TŊj:mՊK毛ʞK"dxGz t[˓ eM̮?·^C0:ƏbM&Iˠ),><.?Dx,74 eiVM rY?\k#I oZ(a*x7$e A, Gm2Lmߩ%{-Y'3W- LsfKC%1m*K5.=vCñRW],+CqW4_CRTl v}k^('ԛ5*GN.A3n(7Fer!YՃ[9}I+&2 {پ;agǭ_sz˳1[8Έ$WHvݴAM @"2Ykb9biTR5+e׷0@>KSY`OX._/k,YkMK 2%Xa3xZcğI5gCơnU1go[^L#'d'@``[c"\J*L|eWLSg`WGgL# G[ !*vj~)P⼠esO$6RYXroVe7P gMW/BQԻvEٺ [2BcM&+PBB暐6xs,h?)xI"BIdXm8~!4dȴc)m.`Yа~vJۍWaWs;Hq&@~ e3MQ@ #R>O`d##z{`(5$7T(0XюTOԨJ2F.շiŀB58MX]VzOEE+lcf E5C hIZ Xv3 :ˁuHvuR'qĸeyRHjrxcbSF+^vNH=?9Č)pB B՛̗,((mF>,3>-Bp6]=gxPv2Q:Huuc- aYdp(pm2eGTݡXAHG 6w.2 j֖R㶗GBDΔ#V$>1_N*$p 7vזSyOe0 VCv &vP# ׄҐ)QT4}NH?6"1['"gI4Fl8ԮjNGZ )m<:=.r#d>|䍩AA6s( ipK+I'ߢdE>G{aCEV`ֺO|X_ 3mܭGY Ы5^>yZ n)R+EH}0TGE[.ŸK~Uč£ %E)zq^xL@: BaA@6QHs>MFWX+ 1 HYRh"\؞MB,n[U3 g9 ϥTی]^&7x , Zӏ NdYo-{,vgTA YY`LA$c10Edx:a;0: ZQdzd㜽.Uiˁ KP0Px8I#.K=Tݞ?ayܼRivto;T+2AQq).%J˾6i6``3 %U;_}u_ɿL)BYӋΈr{\-&'41{5rqG E͵=p@r9fJ为-%yL+7"Uvj uSGE'F,h b\,5䗑oBwPń5?|&2:fOۛ:6Ī Nwp<Ȁ:o(r3Nx4l*ݥtΔx@q9xha#x\8 e=ꫨ)0Oi3OLOO_ H"&^75<8 l|n[3Mǐ,3'dIT%T0gF2 X"vJ^ahZnloh0Q+!ES{L'ޔc@PFT qBpFiz~cU5FM`DNYC𔋯#=V]waAa.֣rUsLBsf+gn^IHT@|qV'L<1b[5ϺrO}v&6ZO?)-Q䪰a NK|l8yhY;Aa}y,9p̝m#H56\T)6z6$hiL#0RIz!  ,~w3afQ8Z$q UqDŽW鯍5@E[τhQU ieR'FhY2:dAd!B aF=1(M^`l mJ۔LZ#xۛV6Nx|R#p^גϻR8/F,ڞ=쯝 X_h8uu$YsgyЅnsH0Q=/1k?z埪b`U;5:Bs;sU$%cQVk6l˚V,$%Er?܍D*_ku5 Uw@b1"WM4MRFT Z;NAۭwom0kzH6HUB8zC#cX.D[fdVu4uO@'ܚ{'Gk p"b tIb>x{ B*:aG] krA;ȪJ|42wQxΥ=IXfi..Ū-z9ѶQI\a۝5ȑ:X\JRnH*aJqUr^m'Z<<_(nZtk%II%^&;!ћϚ%hp^wKͥ!Y:_^nwM̮_=g;ח@lI[̓`g%;LE8_N9 Lo9P=R;~`_zx 1ŸSEY`S~-hf,c[O|h y~svrɣΨM[8 В?a5m`/Øi,7͘Lbح\A\F]Tgz^d4\_MZČKBp;S)(UJbHw<[>mϯA`gA9xpxrFytҶXv9k"#2Yd& q=+#`N_,Uķø&rPy>>wxR~m.N5~:7; _f\КQI?H3Q^fpzV( S"h-ZSדj<,I&;a"N';6-t\+3#nevS Fr@2{vd2G>Dav"IGOqM%blo_9dU|>`DE1LeĹ8b2O anK\rqF%-[K$Tf⿙NkRXGXdD_XT6aHEQTFoE ]-_\Tb) A8q$SA`\g_7k`wncƩ} IBșd/|b˔4(YQR]2kѢmph9 h/.D[i 6&UN?~k٠6 (%Jk$( pGh-i|ۨŽ9SA6# _ߒP=$/Vzpogco~9׬]PS!~7d h(VV)C8rN{h༮P/"AFgn :ޙ!E0E*yvJJR *БX0_ LO& }Ɂ\`!F# tuZt_9j=4?皾h:92SJ,yݘ?)0`A|z2LM&;\A&Cu+̩X(C#0,pwʚn$ m5ئ4x>f05_p# 5>n;0Y;E; M">禈t?,"s$X`4_EM|ѿ:KUg<;7+?)7e1O8g:a2*L-hR^:aZ\u.'*G"!kbEzKvLZ?ݐ HI^ӘrWpvN5uN ➿ГU#09E_o27lߖLyb#O6ױ8{e7dPҟY!2T֖P*MpoFt~;p4ݟPԡ08nz_<-[Хo{mnoUE>7,b'jǛZ:ژSR9?Xܒ<" Kf4c;ivEX jej#n6w p=q8 Q/~8lJ˼!C '0'S_rK4q@y:Eojl{@yIIt˛Co%}jWnUK_0Zkke$U^$=bKf_SNYV7-~}c|ܪ6K,5 YjΦU_;nq " h,c-XwT}剤󚰐0GPUyrۦق/UᲱ~- ,n"=vn0=OnI6z,I}{>  Q˛Iicݾԝ#3W{+Ib<.KN/P<YzC,#QF6$>qzٜJ HcŒ fZyDh4q zɠ^[>l䚉4/Iw(5\L ;fiF }6Ӻir2~tڣ`M,f{oŮK6UI[V8#JJuMC uDTwM1B3~E%!.t3xⁱut?%+S@}.cz 8s@Fo AHA6͘<K{;S>z_*^n%Sў_jO#h#&l(܆ۗM|I3wlV.3򫮝85ᾪ2[/0ʼnk8эUvH垱A?ELͣAڳ۽ `&8n/頢GXՙk$Zˎ`MzUD̬= . VE'0cy\H+lJ|˥jH 9ԁUƑkYR+ d*dX֖nk 8r\[?n皈W$Z_xr7Ļx/^}xק0̭-a?J1`)ތc3\;Q^C l{ F)`D&i-;Z *>w^<;CaO*[?/`d$*DFE?K9P]mmCD f̟V<*grT5,WSյG-d"XpYZJd-UYgMUUr%Ej$$F1~Wd wl*f=yىk`X1:+9T+!n`Sl<˟R7+!͞Sh:GNb_W7uY0;a6 J,5g~Z^gdZkN/7Sf Rd!9,1Ho?X?9X9]/3ôq{`Jg> 6}F4X?AvPT!}1:&qD>0vm1x,[kg3u/-9YPN|g(Ɋ@ iCwIGCӸPԟ'N,;HխI<)=g@!,N[UuĚm+!6uO0B 4Հ@cHU;iE}y]b> nQqq.7$!FaD_BR& 9Ntm1Zz!*>So5ń7v%~MKo30yRˈN+]Xu? ޅ7q>WiM#1 >[&B$]nj Táȫ 'Ӆ>Vp&Q?^q裷ք׈{a/,φ*DA 5h>w;Wk/EuAWD? tҺ_IJgv}$gUAPʰ.jHQ?Ƶʎs )2Ʌ.Y?,'# A$ кtirѩݴ gϧ̵㍝V&Hp<1a3"bwY+H Dq\~wb;K#b%x/WɈBi8Pn " T} l9Δcd3 5Q{:+h[C`2'~BFy| 0,338՘nd%`qmCdҔi)_'V~ˁG|nŚ-KFJ%{%#@E?7neɩre&ȱ"Ý&)K3irp~&zˈxM٦3(ce6|?01jC Έh=GONed7PVDuy)[xK:tu'f|zS]#*F* +(΂T#`BoL-;p$'Y$nVFI:CcSjNV$5>q%Ñ~*Ijd ~ߺ/+]B.$Rべwc@iTd%O?*:(9JdQIf1% Xz?FE|zRʐ1i Mt0KŜ=,w5>lQ۹:YVIB5/ n*T>cMϲ,MyO 7y78\>Ap &,K+!DDvbqc@h%x$W8za _r57J|wYG*@8G/.PbaBY*~/y[>lh]JiGۉ괋~ȕw|Ht"?,Tgu5Km`$$ҳx;:+uuW.Jp,']S̷GN^j{Ej  ^300O/i$Lvm]A}2>ȜP|>uGh0D9\-@1nsbұY^T)Wp]rXN;OS'WȨ0D{n7t[F#XCytdM  #OL/vwӁ[ )fy[:[C'MESC j {X ՠ%LiGԽ4;)F T@|e;bUvn~=ԉ;J솧@Hrb͉4r^kkuN)TXC00q uB6WbDr˛c D>~Ʌ\>< 9靷Y5n)E? uŪw^jq=!qs"!r^7'uP赧4N D@eUӹjb+&e<ˋicIOofdlDf8W2&+yL*c$bN=0']0}79""6P KKq%z%퇽 =aX6KJ ׍AП&/!5vq@@ڃռD_!fwۛT0}ٓL*1q'7sw L,WS`!^_ I4D9ەn]A+AQX8` Yb tx'~9e>iA_eE(hwx؞!$2 ck m]#"gHOκJkB7OߠDL.:# ٦l/ScV'wW'!VtYkR*1ݺc^L+ EUU*2QkzG,%K^l?ayeO}QZբ[͑Q)CMšASHid[$->XxvG;R%aքM>4:՛IpA[_O˴04_R^A6*su'Nk2ヲN氚bd_dLnMdNYM!]x!Z/:u3E&Q%6|?貙D1vvTop>n' :X6.W Vo;R{ץrOFQGP:"NBK'lD1n7NKz0#|y7dmlNqCR26Bk}N4)zgmLGݺE2LBhvN2Yu3q1|xYzL t5QbGC"B70Al@3Liߟ%!S[z,+`.҈37]K̦E* CTsn]!'JlqE4J-ϿIlGmʼnB~ 1dK sӞ3'O"U PthK»S|=d.ȜgnGkt$D2_aԒ?Ąn׭>I=|d"9k ޴mǡ9+Fb ;njo %7LJV`vbzj 9QĽ|]'"rm6Y3x3aݰ~"Z51޸yxrg֠1^ C8drQ`58|py(G/Ø8!s&=%T^$"Rhz\\p.j~rY[y%[v$hqD+v1gmRŽ5;(B-ba`yl\nיAo[ҷHXD)?d!njke:畏Vgu4N32=@/⮵"HFi|4X,9 sÌ+4*l[6>D&s܃Rr ֍rNx6THnL~5]<Ҥ@`wiĂx3h]$N/u+b~U}718@۝+TAH&;$^Oŀ|L]mS)[m}Os t\@FmN5w2n`{C]*ktș:ب* 0 {UxnU`7L?lC#ۉ/ 5[ iEYM(c$;Sǰ-:5is2E9l%pa vxު3PΰҘzSy#|Ɩ^[E\1h35BC 1]8ÂdD,+7 hwxp4^,.=C(JIw겱_$dS4F4Du[BCԋE dv+(HPbGASܓ^@$|& a)֦x @aBvSx5P?B7+9 '!Fi$-'y:àHP{2uV&iok#I5ޕL!y _7:7(SM'b9LsRљғ璫Ke<)泚6Xz=YZ)ԗI2%y\izs?g] ٳ3D}Nⱇdmk^ҋ:H'NފMX<=͡w ]Ny=~oRcPcY#}vIhȺS ٌP ڎ]_ R."s.R18":e6$'aV2l1 {R[ i7Ost#D(n F9mA F?Q_7{R㼍 k[ՋMSTI7OXE'(cSgI'%\ |se_okN(20:m+Cᄬ(/y%>p`Orh^GmئQ=]Nc6,J}?[hN{>?zj^Bjj}%O-; 2pV/ *PT&eDKZ¥~Sό}Ay0[xh?{>J46M􉲂s|Dac4P༦*ff|J<瞾ێnnc9ug}J)TN{=$- [bLF-ܪ?hvE X,IQp) k4(h !. & `u|hl'o[tj"-RU7v*:'mjXa.&c\r'X'r<.[p2?hf`LǾAq0?kƠmb rtM ̱-C:7u$ồ|A!m΄`9" npbIРX(|=n2+<ɝ ]0{JdX/lS6W6q.]Oe~ED cGz80M1J;9>KqmыJh/LQ(J `31nyY]&\}V*|ėj$3β Px2lnY)Ҫ?J̠h属Ie˳6 GF: ̨/RV7-`֮k-2'"3NgW]Lej%`pX>44TШTi8^yƿ%q2Mam3^q 3@e cvB}.xareLjW#gd(8.lvp*tYwl%dea,w2Pr&q=C l-6Y>jdXNu|3;/y-o &pBdreOڌ-so5yKą:;7߾t&:^̪5]\ E,u<30;EJ(EQKV_-) wGsʭA&Y~Ve놝i8^QӯkOBX%@EN5I{+И>IKk>V`1EgF2{8ǀcya_ k3/!jC#6:׫-[JH)JT!s[Yl3sޘ!2JHeO(.:[]]VO1hh gzGPMG2rῈ O d+F@_lͰ~p']qP5nb&۽Q(-Asv'=7+S#P:h|?KS;ɖ,L*L$:f*KݻGsCZ/ P)̈H8ZaL!_[M 5G =ṳnGjAKW@1USS$xK{I?oԟKErLP/r}{AR%(#Ndl&.y_){!qO'TqAi;ao)+܈ς<9'A3:=8I`"Kt%oxAخSᵭ?䦗 [nF-.9ἧNjЧ1'b!@}N6:fC~;KʤQ߷c,%KL2B8SĊ'}Ƴ1P):L)\d`$Xn>qY+jk_YRࣕ{ש &j>JʃīrkkERaƅ9>!>x~F[((j\*HJ/&xOEG}q, Sך6/.hj !sb?N4J8}I^R$"g@eF(M[ Wk&:<}.ڗe72p‹$OIM/Z2jO}mq&ML\I +2~1ƞWE2WDcܰz&ư_`yl`h3ro/ Vֲ2O`jCD%є+]RX= w?KH 2U4km#,m8URȿ)׽ wCROҒƾ^w#r+o^X&Yq3JN}pxjx-0h-6< .Z/Zc*$rQ!^]ƴm'M3Z=0+֩ U\ %eA$ͭQ۵>)- 3%JE*>4+w ̝L$p5L|M"};lul $mVx\H+!%๖-NYcYEj%, ^#V@GSV*V{hnqyP6{ ɟ=,mOG# ]|)3Pi_k9湊,9 wvqCsaAACK; l<Gy xxcRdъA,)Mt^i< 8OZ0VߙZW5Y졆GEFBw[ \4[H4b馊id,e3 i5L"&681Sݢk)`KK]j4/D&t J灈 ؙ~">?W <4͢ju5dSa/Y1U&Sד!) >{F|D!lSm+}B @^WmF9%8܉T~#76@1" S6~`k8#{J7BWϷ[Z_ZȨ)& L"~eW8=K <98"*TZc[f` ջ|tknn(yOqXZs|xp h_ӢxEKF4pim*xhQ·VA|?㬄O.I̮X2BZZ}d񰃔!U(oIYeVZh00yWQ%Pr˽OJ;CDFT*n(e OC^ f}ؙhO'$;CQ畦CT<2 aD-.l-R<19=g 2/!O4a`~r'M;&4hnW -3BN8ćob~'PJФtB­T_(Oޜ&p ? ?l.G{m,_* {Ӎ:j.(h]V{I5oRVŜ @~q^xduhmWkG/_Idl@:L6Jcڷ+\s%mww:4]ZXIsP zRI[d;p289깓Üec1zWqr@Kܽkg*G*ب%4,֛dؐT=w⤹c!)(~ëLYt';ɻt6)THSl'brMc,fFչꑾ8,:45_h6\T.D6u K4S)R]LljJ`?9z|MQGMVA>71,]$ڡ+`$|Xͷlt"I[w|8:ߏRrLv0(z6 qvS9#3c<ޱB'}DVJ5X0b6~"U`|!k_GVl$tLA$| ⴂ5_9X2?+qg.)ܜt256Tψ!aq2$gV$gT7?g+f9U繜IOOOGt]@Lj܏[ab ]X3֞dMM/R@\h=^%GCOrčzܗCZ`UߔJEC{hJ=ai; 7Rˎ}cϾayr"}&?2(v5ʜW-K i<^wKwh۾< RIQЉ5Oc;VeMCXkYNjsC W/`y!Ivcy{8c}̳V~r]6QM~ލC̹ɟÔw?H.g9WD&Tش< ΰE҂q\ta4 `s!k܂ 8/;"Bάk&Hܫ':E0GaH:!<|vL?w&E3!-iH(1;Ç ke8Y Gp-"fy5e>~ɑMٌ=M" {w%493D lH)!+S/>sLh-i6ԣ Kʇlv_*X|;ҝ2NYsc]7x(, (t%WG7P9?ְ{Ou&(L0J 5~!'4ˤXal963v pr4ux\pk/B1asF w* 7=}бjNdߔ;]3:bnIwVĪ,&IJ {.D@Cq{ؤoR漫!{|^UP Sȧe^AFkaE'?<8@Z7Yp~mÏ6,;+mBz pqS#~d@MuzMp BQk3D |da@nz ߤddBCY?|u~T#ۛRU~ vO 낻i_;Dl[hanڝb@0j5H{// Y'v<658+(0iJhc )؞<*OaA1BZ7T/nRSOmrNgd0#햍 <şIsfqՠU% iۍ6ӆl#yZ?ljf/{喱3>z5hO!|f@<3K-'$y$!v*d`/,TRK6s\'Kjx:|Fzc: oDQa9i ١vBh;3Я+\chII|Ip妣,puI?Rotj4ĺ_.$*Zs@䐜;8MO޺pa'ȉ=; m c DHr4;E\L6D0gj$[psmB&U=kH6MY"{}5X\cb9r<Ħ4qӳ5JGݬO0n8N*48t0{]eP'>Wݗ7,Dɽsd #Kn?a2YqO1I%%ݒYx?yF-&fN9{HSW*=I r5FVje Q/f; ɗtMvnB.c攻jM,N.M㱑Nxfq![}T%nlXG_Q6eUANPr o \%fdayϏ]ʹ9+D[xG(䀡7Tl/wr35Q:;́q2U="E}2xYm@. b ҥ e k(R#;UKOæ'Z-͉& k# ^ۻЅA+\]dd:`[ 0@2r V>kl29;ߵe`@S&ümPѣa?_I@(6`@1:~":O/CX_I t<\!MdHÖW1vC$C 8RR`Oi=ÚkjP),P5ܔq ?m28ϹnҋRF|<}HsmQ8M솉s^԰ ~bwᦪl-S!qu 0 fYX׈NiXxwi.Ho=K{%:ԈqVA''˔8*ٷrr2}'<g`ByY˽r %wmk2hlhos/NXÄ@~2n"a򫹨a/VҘ* tKM5k)Ul)].M܀bL+1Df?T%TrXN8 #<>jWLp(1x.-ܤr+ 6_%8j(NM)L BQGݍTAqFk[ 0/(_&.4g?|`xX)dg6U>n?< 7ٸL(3V.kiFAJab>7}EbyplLD+/0Ex&[AO tO'9eMUBNMxZ*%B{*wa#o\s! /'(HC#26w|LswzX4 qPF2$NlP;s53lrѯK$XW%@vQ!vIR9 \箇6Uʍ%km}9 Qd+aj^Z>{Bu|Y)&f8Zʹ0I9 <K~tYoNtg\ty׵4 weHh0 /hyJ&gAY RPTz&ɣ@4MO./ ɆZFR'w?ZEX[n<+t`Ʌ,{8 ! Yсf[m| 1u?#5klzMq$3U?D{=ּ=Q[i׬ Nv`&ӧUVy<1)em?%wGj;seF(0fp3)7qOGWE..=F!5u PGhǰ?[T@TP/y .}D _c)E~"yE~2rf߈Iف̉~ bXCL%|@wY:u19gmҭh^ZӒ7Ʈ+J!u|h:0Ĵ) Z"FnXIb{Z';'ɒLlb?WL_hi;ba_S;ϔaZܦEM dn08X]9#ea̾_}uXDpOxTs4 ,!CUՋ_  Px(kPgBn3t2 ̣fRaSdh+;2 ?Di6鱻~,wԩ8.&\2Kvk󴛲C2n0+@Oz]CFcϦANՅ6"MZ'jį$u6Z‚MOqkVNvJMQ )8 em^T̫U8\y\PLTY~^#)~mΟ:p R+GietVrHy8 Kw .xBTQ|-\_HA8zmIt,ыW #Hc/1X)K;EnɔtA*co0WH#1&7)8.b0dkQF`誢@9 6lZ|Aq qԓ2:߉͗yR@[@򈐖ۜ؎NԓO>e1O=``.9Akj,[uﮡ4=T" o0#/;f[*100k'|g.k,;}Thk=EKiy(YޖȳZˈnyP@\LjLK#Ԧ.#6>i{I&XC#Lq\ /I+#$=6s`b=ǒ \>mTC-, /t#-mTB)y}E3L&i"!:~_˯Հ7:^jS5;(yű4T~gF=8t[yƉϺ|WZ]uTu;h jl-~hBu1LLidzk}V=OJ1`jKEd1,&רb v]EEŽKd=mN?$zIzsN'"nU{LC?&&cNݪ/?od ZKةvBvm!ƙ9eT L&Jin mw Dh^*{*Iǒ1:婾 r: n'%Ƽ0Cw;^Tgd%0 y:&pz[[pL6 3W\ ~ȇ6^&G{# 8?0xTD (6J->׭ @AwB:bJPXS\i)^}!4F׶}V2R} "ӭ= .o`{&_9 pKԞ 3 l\342d_ǒz#QV?𱀜81e?AO98KgV#c),S{\ǟ|<SU0/;}0 p/8;?1 D0%l({+~˻8-S+o*ItB1vp4z@uR`~Ӕ^NW2_č>F=ǸU :x}^W/;Q9Lx@Z[8Do$<;ۑi%4ǤrR3lFWmSb^\A5 wT;Qc?Ʀc{vM;5Np)}[y]GyC_Z 1 b$v5co0"iIJu[K]e4V=;i9gX9w^!Gs0Nrݕe<ƽ a W!4/:٢Gx(25P{ޑe 1}RJ.:86?b\fG>!pG.GJXw3*F&@tgDBߧ2&];'\$SWj6ލV|\6L+Ef;衂- {4)};yb#߂? pp]2j %Y۽CdguІ9 ,,D+<+YкQxcHe%a*쩭NHѬy<UvZӑ!'SJ?Ǔp=ۮSK,""Gз~ENQ+i 3DY.H3#mjjqhuQ`ȀA"Xh1m=co:R "=3?<D|+ޠknbxZ}iAu[mG3dH )\J 1yCb}7ۨƦT]uM~R  <$ -K<˩_Rz0ԥ4T,Xsʊ9e/">SΌqbp̎3Z<9$a$,>+Z 6.d+fp B\ :Th!H)B,8NzL\wj3L7ĩ7dp2u庇^>khpg^vNfI)pʮeIxr4Qt)^nobk8aT`:.9hPgy$%xQ`2t&":Xt N,@({m-;g6P VF*cBO-#XH?7S`afmgFU˚}S@q@t7I2HH [MպF U4~# 'Z7a@1|X+0IT:܉>_+ u:wYL_IlSB,Ϧ[kuC4_N^d H J]֘qɚ|'=1 (?Ysqyh1=xZV$ͫ%gt>5'$S!l_S~"s0Wc6)YPxdo$[6'+nB*륷{=V&H^]useqY8jQζ?J\!Feзu @EI+3zTjt\OSŊ۹\%Т˵dGK,6ǥO>ڽ5PwE,y ]L$oBFouH/QRlwlOB(Lf,¢Rb &EUt {b8+ :8c>#Zƹ"T‹DɔjbO?6L#z9Np\=avJp*$J5t־dd b]0=}>BxzYU@1sr b _@6܆T,ldSnIXe!%YI>Ǎ ьfN`CN"`kFN@a}5dKxU9 9\i"_126|M9G5=52ou1X.WI'0vVkx+`Lg| y[8wy}UM֎]B領i6I[*Btz/]HhÒ0]# ":pc) ȷubLYR1`2G)wƳW fⵘ0`5gA=Ao{=3pbQCAj|K OTv:) d[n[qpB)M[ia>Gwderay[lsE42'AGoej)u4:9UW/DB+Ұ*vai\`syf8R6Em(d ĨGEfT1B+9%Y)XB)՜ݚJTUcpc]J @ʎ}tG&ɐ 6c*O!?gQ4`m@@(R۽ބ2ACm2VOe)`WYT /I ͯYխSn&vQ od1ddjYj^M 4M|LGo_dѸf=1U]Uֆ(qLhpT^6Iao v '}ުv(eOm cpJJ"\)E.z0,5f/AWG>`[NgWL4S-髣Pypnl,U3jiZ°3}ةdV@Hz>иZ?'`;hb_Or\x_@xPf|GR"$YTY;Z~*O!lYdv06:x"ז-jv̹Uڎ #΁),2N:hpAl V E@V'2N<3t}N'?Y#fP:ѡzt)hl,KfH"و_ޙ3rcƈ"8gtybqqb:վ; Yҁ,<Х9baI fӚ-rs`@40 tgHBiu9'-mHe%޷?\Pt*BY>Sh91? 1jqmn 52#ޱMֺ #)fH`]ZHte_ۻ; (%8Lo~y!6`4Y>RGN_pKv⋿TC0\8OXs7Yq)=H1./+'ߘZ1)HtE|]$ɼ5A'#0`jXZ dz_d~9։_ҮcJc#F>IJc"N&)rW~4wje5ʇӫ}Rgڛ%'Ҕ ɧz&Ү5f]Obn]* h6tix-aGhnj4s7`nUyG1d=+N m-b.N<`oM o Q :Ьҁn@&z ;fd T\ AJ}Oԛ=\3 (6f^zYSkkW_jC7Р$RB (E5PRT3kShza ك2b?b+?ꈂGϔ I_ZTȠh,L—XWl~J̴KǵXweOE+A|QDդ,#:()ݩarL4)(wE4)#YK<I:d9.Fg5s%@+h7g>W̓? EA cp Z𱞨5.T(4#$ƨ}m}Y>VqXCo-ohF8myC=Q40/li[>{#g ,!S!r!6}; KTPy'e4GSiae*ga҃Y;!'7ǰX27a!pS\’f?`Hl^~,Qj>enMϛ;W0fc,L:s쎤0(Һ DZz{o$3r*7pׁ {cYrv|8Jr'l2?{pIPѻm /Qt'W9=-$LPIر)4ҾRݘZ{ LX}78¥V*7I*ecSptf9bJ*F,d@b "aL, !ݽ {7}nn ]x-@*:/ixހ $ VIdxcEڨ~,W,*ݰ彅5:_3k INRZf4rO)#֥ek;h(!-!6 g|!eAى8r{:VzPvd>rh_o+dE`e4+ҏ %AHƱĞyn~"D Qu? ~lف?шOOIJ Y?I3a칠OHשbfU hpCvU1[)EH3jԑ" 5#/0`αYCv'e1q5foE=2cxj`}D..Y`l}eQHgGN d1S Lao7EX >гQyfV|m6|F?D>NO$ˆ#tpEgϾsȒRԾR Kr`kzjuuBg ?d Ԃt.egX3C9 ^f9S)-Ֆf8Dcq-2_5!Yxqq ZzKU ?R~3@K}i(.is8BKJZ3Ve!h1.[H9j23w #u13碥u'D/e/kz\7V>W5k7Keh͕˕<ꍐ.ƅ&x! M6A>˳>vn^Y/8=ZH4OQ=@Ƃ ig*9tR^SRHh72]d&^_7O"GvywF.Zisd$=M1Jh@fFa3KL}"ؕ7~`5ͧq|Y̙q^C*k/0dȋsr댫zsl]wy %eo( {^Wme|B,L𹘨c(4qi޼Gl8u< a0x)>2]̋U34tr,ؚX^V{IȘ?R7 M;%~uldOOrx`S$¬u S\ !W["^FB-B̠f&*jNA \ˠMOC:٠oT~fOAjEtL5pDM׃5ܧbЀ"~!U*;I!_5f+W;027$dr:75u^,4v!/>O@(0CuU= R;IQM`T>S y;J䯸HePqEOۘ>Z-5CͻRǹdwj s bH"gm@/[@UhSqpЎ+:h$)abOY76Fƞ8ׅ?vp[^('Oz9KLY[4-ѝRfl_ JmDXny FMa,o-q-jKndBr3(z$֣Fg!#^PvueLqnk /pvs$Wq&8ƫ{no=TJhleGȜ~~ڎBQY^ FAO„8:#/f]b`0sib;L+u6*R[~1{h(&J%[AOP_FZT";X7P[ .~~t=:Hie1u#BBԺ& Hh:c泡ګ7C tMEF}Jv* ^!JG2:OqC2E gvƁ*y5ٮR9Ӽ {] <埯AӚQ[ K!@M(7rׂ+o y"+E$fxS΀4jW1 `].XcR_-T ;j(p_hX-3^"7v Ed^gc?EI S FObL|C`.gKU`9]׾W y)K-c^m=8u@%-X5M0Խ@: `MϢ2yLhew}++>(dS, `vIg¬ـe.PHhR C"շ*ƶwڌ JX\15U3tm*+v)biKT.U+Ե>8WjHbcbCp\2\\V!(Ƭ=zY@_l2VX?87{40qQqHc"%i5LGΰB il/Ko-|;Be/ }s%2;dc>Pͥi.-`CEw5iQ@d-[Nw2Tk _z 0ۙaTGߢ>x(-:p񭣣VB-GHyaG)DKmϕq[v +3W<үt?r8ԺW=fR]]݃5M^xr0{e'2u> WF.*;27\'Tq-!ؗ[\vx9N!W?Hpp[,>?DB)/᷿ө]T}MpѶM %':7!)}sMsU3X =*ao MUO?Ԗ71SыW/便C"\$OӶ1ٚ;b"-'H(Ml(J[EuƪQ/(0ԙلA2Nat;q\K45\WVl-g14&Gwp{юl-cgvD!CvS8?+_iw(f48I+scj)]d?,J2+R:#4atZqk 0Db0=fl!p[rk\{rŏyQڰQ.iK;gh\b;^Kem=q,x)8&w8l,y{1fϺ] w_u=>Vx a'߻@Z .0ܙqs\k-J>n/ ܛD^j*9_l)oRiorxrNy|R|eiuU: v)`x[-3%%ca3RkA0"eApv+OhtBN0VOH[w'` rA Ұ2.#eu WD~_k=$ZY&PrCy,21pMiV.XwsfO@ygz.ge۱눅cSGE C0gRuN׫n-o [&z]('rFI9/(KCΞ3h ZN9s`[~p!!>3b[ urS55t 9nB&(ܰ:k#n+~Lo~|LCR'J([f\xKA|NW "1ϓǔ:CytBkTz3\FMcC\L$vj̾ 0m>xr,$V,-v,"DH(<\GAC͕p^Rgo܋+dÈ3~wXeF޻TH%.*1ǩbtdqQRTijPt؇b~x5ew-a% G&M=#pM=Tl+| cCNd֪Bb)l#K\nolu!;;([򙩋$aM`}.A_7E+aTť1:vWH6`/Vhx-cx=ҏCH|M]Jˍ98$ZZ=-ܳ߆ JQѯ܃3`v[oo_s5\@8Twgњp>le+)d8q!ET,PzC1N __2J# $Nt=94bfR>|+[M7DV- ̊w3&#'O4<,Q5PJ1₁ OYω^B㬍U՚HCv9q4C$'q?i="Xi͋)65Js*?\r,ow Z J*+fkH0yI Ԑ$HI@7Bt# cnT EŽr0Y=V@ Fz5XYDLfٗ@% rkR蹟Md\nt& Sg q^N=U p+@ D^k*i]дM w^$K44YwRoRx">8p8e|o11 Lq^0Xj0alxě "}."5R3V^LY1#:.f&치SLGA.{}dm7:@==li꣖*Iwlpy lYe_dus jmZ6Ng7zmj\=5ֲyRBeWăt`=`K.l2H5)3/P>c?<iaX(#I(-5m1XwSY6^lHT6ɋq1z'ZlQ %e{xZZ(t?'/7P{\ ?Uؗ/ .>%UW+̖שp[ @}:(%\1g~d[^iaΥYV^5wdj%]\{NtPpK8j|֗xF+Zz$1Cb&=1kYQ׭|'E.>/EH[2ZԪ&&G{5ݮ|Ò;ٯ2RΐKN>M~Ğ WB29px/ m=Rmе̣|\FRhIE{f,`Ô= H*%Li"zڧSd.1T.)il@< IDϔyNo:Ce<jkg_~.;M ]X\eBq`5z0@ьeh.?|@~Ot9me7'lO @$<-V V%Ff#y*YOHjt":TKkܧOK\]N.[%Kމ>SS2R[)"w2i` &Sz3 bje_f;u%mv'&#ylÍ)5;kN\≕c˽~^KZ>BtP㗒肻Kwu{S49% Ѥ3 !Wl^Tb{ĝbN\eZġrW93] 9=G\5P{˪ X|[9UuƩ$h/l;o-~ !azV,!@c@I]}H小,̔ja!M2 fڮ۫&|?Ϊ '@!DЎ&@['!a-7QV$PuG,'L[S;176E/B|m:tlj@ccb)iU$LЅlT,,{ bz*/ 4ka4X4) HZg#)Ntd1#S8oBb.['ԪïskB+>F W}㇫t6pN;޿)L'EimwmLQA5Npuɀb^t~}E#9`G-!ѫQӏqOA]LZŭ6%\r Hs9f]S>^ݑ׻[sĢ"YR,!a/\{޶ Eެ]2/T,&m\Qyq%shCQ pPC$gs$܆?S[vnHѦџJJ+Fs5'@ɕF!҅GGvY%N)A٢S9yeGdͱYKӰVv|ʚ[8viWh3 9&p2tp u,F!pg7h` LpܽQ*gæ !yb,;2#yUIunOqံF3Rh[~D*}@ށFr[eJ~lҁ5~ oʈy)3& Q*8s)2[;΍LD aG՞DȢNoOlsWTM Rsz@cxvrfTpH9Q9D*WZzp&]ыjrs94G&-?%aiǹ'q'=(%#ZJʄ)p75z]a즦e@w( b ( cj1@ =$Xi_4ę%D2evl Zm%wĚgJQTՐ#K#t8w,.Jzb'c+0=I sJC9EO3iNq-^s,r#O-@Ϗ ݘP!l( hy*zKlg nG!uh]YnƏnI P\ QBD92Ie;# 8N& +4*f!iaidU\otSNaaX@IN\ NFBGV5;PH!$F (nXzBz A+ |@W6 K:(O* _-KT6coceLJ,1L>h}}MUqHmٙ,A1 7Hʐ Ru{~ 09.]X)DTЁKڻx{ ]a#qK90q)Tw65|] %#f2G}ZH|yl/髛)٤_aW8lZiYukrdpʂ ]:4 Dy9Y ݲs39G& ƗS-k Khv+`jRѬd@x@(M3h8_ O>_302]Jfa'q M\kyCv[g&Z-DFt`^jD QWRhJ Zϝ%~6k)oTbŲUF+zY!*x`{+0O' M_" pa˪Q29Ufpuy7n\k_57u+V FU~E7%yF@W7ɘ1XA(c*$/XEuUuvra϶}j+ fTe(-Bv_1N ,9rU)l螫2)23<* A`9VѲЭcUBn?PQ1wyl_uNdQ:f:T."7RG:WW)Oڇ ci>]e[{{G[Z\AF$ޡL£GFrI#ps˿N!Gy͆`FB"r9=0NeeAfM3#D `wcin.2 ݿvr<|>>)\ͅr.E!x>ɮg-&޹3vt0ZXy>:M{kI@nYhVGMb,㘓.D=} vj7I2d͈|v.QxF\D:^20HF*h{ZO~:%zq2=S!<0=ժŝHj`(|pý}$o+@l zV^b:4ݵW^j-NDE" yW}l<2HLOM,ٞͬ*OR;Pik0ngRp*BvZ&txǶS#ޑn G`#'~U$a;`⠼)NSER+,t*LBut M1TpVS]Atx>f_R)3j#" ~NZ@&+s4|Fں:ޢhwjg6Q%?Fa돶 ASpJ=Rp0Tg|KmTvs.׾Md=Ê8?Vɀp'3rAϊZ|ǔ+oyGS|+, r#+P(3MXΪ!TvAv{b3ҧ Jg'^qŒ3:<>ZG&3V"L"En]}q>-?V;ݠry+!LJ?MëXf%J ٱvˆ1r;BIyKM`@ ^+p_Ajh Y,?7QDOFeIPSWx|/5oo6l Af@Y},Am C"hUo0JXePtjb4#LR`a!(s0(!? jP[^|>ZuDǹ3)gdoFOe#:M5?fÃǨ蔉M}إgE*sɄL3Q2łosiFφmCl+Ȓ'BSh0f42=:UrƻE-v9#\C ɜO\Qa{ߝGZ3jAMfTca 7crc@A;dI np`.7?VFH-#Xǿ@#w3wwSeQ^K$ٶ&Xڸ"Z-Qs٨NLq"WO'zkFE(iGV ['<8#M2_yz^ϝXs`o j{rRP$*NԟG('ިբEef#LJ/dпHϽ9\24uQ)g?8\#H^2[~ NSs(HHH q0}zT+۹Ƌڼo?y-H^Q]FU% #<|d++鰺4Ug 3JMz{%LF"ĩs-x}Ē#])치#Tq6yp.Hdk`F鸆!N5mn-FhW!/DQUퟎ,30 BKp 4pYYa~ªM8%Jٱ8.(魗y+v* v(T5Fxm!;ieѺ_3JSI(\L4yZ*WU.mM`伢ܐ[`3ݔIuKGj[{ 䜁Mmw@< &nnեLQƢz%d1V{)C ֹT/r.vxhp8LeAg[˟kzc( }a}cO1CADU݀`(w:JJ^sFHT^*,_"72u}42n\RdK-2ٴ f ]2n=3m`@< mnO$gNg`s֙}=8}Y7)UT/կ)$LH#*"`^@YR?yz kחMD^`Z,Pp2}"9k֒FGeWwNJw-qKi{ N>gƫ*vûϏ_Քφ:U'y_k Qh eZfp?lz\ yU͋NlF8]Po:dV@TE O }GV`&sXq0d (k^kLD 逸xG?&9׿#]Ȫs8:56Uqm7&!H0}l~42'K[v!Ua:>ВmD<)s"tЁ,UEx9;څC,hdh@=m>MNXbv0kE {Ч ac:ZhXY_NYccHByXӹ@lV5"n0B,Pߓi)RbKK,˨~2uTf6C-\5(Gd_bf:x2r~;AF[ўPK`մ+:8""$̜Olr([3˴Q;\P2Zd>z8F[Cu."CؖvIU7"> ~H8x *n@^ηU)9B]#w O7 |/Q, : o9M^Wo51s ؘ ` o%4\~ RDb9ŤZ8[Pz3Rg2nl@2hbFA :KG%) p"q?,">۱/"l[Z]ul ˪=EJYhO/h"i ~Gdv D63Jj;Q l?!)Rz˗SBiS3kh+73ܗ3rB`q>LߺMw1_kTvpJP2>I]ʐdh՜V@Kje΀Ə:'(FY4"bNֹ`wE&nN]`ݸY-3~*=^i:t7<=)kyxhKj!Ymq}eȴ]]-foϴR< E-6y ۜR4bm/B&46ЏIU#Y-Tp j+^"MbTY_Ճ2՚ zq8чn:eB?L$ kSXi?1`m^V%w3Dz@" YWmlK)8 / l8&Tjc$e$L#DA' nsA, u啬c._6kY)x@aijuFdDpw鑹GI2گ31L$"`4>ƙ#;Dܖ69 `;5fQy2;<.S#f CHepI$?^ϾüצuE3?]L퐦 d+;jHEu 6*+\g{,AA@%uB5"|\v`J -|)mn橦WJM,ЁZuX;p?{u#F<>5A!񂖏;[owY|#:+èCߗ;op2:Y'T} ~iMl yDu 6BbI<> _Zez^#$;@r`S;}.X:_>~nn*Cȡ"f+bamx(zt=iyfۜZeTG*9oԑ7ТO4|/wop $$pXf03Tj&'P3cU"&}ۭA 4h[WYِ9p6KS@Ct{&j7x*_j1@?+jDR]!Ps6xO?:)?ݰd8 u8o"x@J%ٔ*ig! j&< rU7qD!j.KIT AvzpQ oA:KQV)h-JxXJ_=izRi^G V{ꊝ_O60"DV3[J[ՁȾ׍B FW:w֚AbjpzP1";n~gĎ{Kn6!`$pFpF}eV93>CNͲ$L8;̗4ƒ|n1Q\R/;~{7ß[%zgFyCtGw%<)5K(Ԫx&4u$^NOHcWȋ%ӃN _܆_x"aU^i+EЮ?6m_Z3,m[xgJ#EieQEQ#^k~qR&śsA3OtG˹JN득pTAY3K ϭv %O8P~l;ANj Ӷ=ۻx0ӡIM8%rQ>(3ҴP%ЇP괦[ϥ_,8e[H{=zP3+ͰM.?|QE6VKȧ<. Jȣ1rOeHQGRCSg:>9 >hm1[fzj{a$XzWIJHu9Pm`6t.~Ppev3R=z&A.@N^m% >I/UdBƧ̓f``( s~p/jCV'=z*`b$:7P7Q!ix5z^Iup҉18H}gfd^ ɣ9m(.je PcXst4@/}MNŲ`̇b7P%]:Nkq jBXL`@5똊CJ+mNJ6mG'%1GW 7NҴ7NyC&=T`P] 6\*V~Ӗj*>w?SyAB r} b%d5$˲uby ;:]< E1Xa%@5q{9K[Ql>7jܵJ=9/ܰs7l\li(CV׼FzS~Fic(w pw|Sko8?3wGx4,į{{)R&jދ=٧v^+ k骻T|m k:huaO{:\c|ow=/a1$HΠ_[Zʔ1>9Sh;\HaqdҨp{!-[o4WýX{n@n*[cظ@=gݶU'6l5J6Y|^cPV?( Iǁ1; >YؙFrΓk_]bBI1/2/O?VH9mK[I @u?㸣>x3 <W eGhj~!㔵@9+Ŭ,nBPX؍\*voN0,2SX%DWIgi}ɰņ6jjofK8Cq'YP14{[pz]A>QQvDT)G[+HnY>WgA^VG2*EGxϘ>2!W&Lҥ WXI Pq#a8&o̖K>eQ'Dp8Uiݕ"2.:Ɣہۉa}K_dwVw._g)lx)*T1 ,ZUT a}Vnt|= Y6k괢2=MMjX+r;%Ikh JB(MǞvDi,̃ ׅ6RȐpasicAR| ySdg`&Od3/>|CÞl Z!ۼ gMҋf|9נQL## dJd,j)!> vh6hꄑ7E]CVrN(^qH5Wxq6~Rhl-2  8{քPO-C^ZTO=֨d=sljA誄B.^sF_$cmh,)?Ӈ@|+#+upfI-E.rr+1&x"aLt}q r ҹz-zr鐘 =47ճJ"2{ت*dCgu?[`c*/x,7>J4;֎ M\lQΌa!nCyqZzܘvI#g^0\Jg_Qqm5%"5-e;sA{fOऐ6M3cտawhW[]lHACĢh/$.d1Wd|tY셱Oh˸C}^[ )(3d*4[f6ݞفm0F&db-s$^2 '_iS._FY2w=mAtx>|xK N*P)ccS/ ׻[Ěg-AxEÁ Xo;/z'6kÙ0P(;,5 (c'h\+h<ˬ4uCӖ ' ks:w1! P..D|i`C5iBKb1 .;ny$oNڷgr EjﲙMD9͗>?k2g_#H7$=>,2*wؤU [zy =[a αym!g!|\ yEL6տ+evB$lg|rcۊ]Cݞ,ff•)Ht^Et0.+{NB>+-΅x}"AppEP K_O n)[I7#\lj`r:cpcżaRdu)qIOVcr&8*A !?yhh {\)K&qc K?A\SCwpRl/N|8IE"":vZgF@̼i+`S3w#Y̲R%*ӗUuYPzq@J1ځf#Pt|mx  Zn"[؆-oeӳR!@ɵ ƞ҇O{?[-~V;O BV6#אv.'ۇ1Ͳk3MX YZ(lp#Oױ!T _ÑGT Kn u UV;SdnQk #geҁxtzE&*2/O@I<^ޣl MLh%Yz7Ϊ[S]5ќFhi Za͵z+`:ZE o-̌ɚϋrMxQ>9~6?R폗RfP~SWm*`%5LZrcmĺ'@s}=qG˥;@kat?-ppG OZyw50DҟxD1))QYtIb bh J<{aGcͥ:QpGUK,U3lKX}@AhA"璄/I };zQl@ڨVZyr]>ޖ0'ڄO{X=Jbl6ɝzE~(`h'Q%wp2P+Ѡ!7fѠ/A孒"6R4ZIrg8PƖqt+#N br0ɒ&`fV7HBFVE|-%~L97O "n+}&v/-́q% shyoȷfFuHzerFw \A;[;EwaSg?ēSΘ?Mi9נ>0 tSieKۓ&[K'X/K\ xrD;P r?y*&\{;cMpUb ?f ŰL3O=ܠ mFbBw窺,[ La#IܻtaˣֽڼHYr]ng!IKnrl~]E h\3h ztrDMJr1mu!x7Ѧ쳔Yf.OxYDpȴ^VZDibeV+#MH6C4!DweT,Ȟm{שRDOێ zv-mp+ ^2!p׀Ek\ݮhBh"XodRøYF od]vφjS ݲ,_02~Lah ͿQeݑ58煝hQKg̏QJ[j.j\BUFѹNB&vO>P+F`Cl[L1l8V=*^` 8+d?O?)=в̩G6׭LK02dSFZViIa8T4GglZ߉&iQB9A#j^'wzҹ9q(2iRDByA ioCTՊ@_ 'Mj&v}B3KRBt-Ve=)Q>HpNˑ=m7C y~G8”dq% UޔAnW >|m\sIE)V/M~r&ٛV<}O8?z-Z]b>~7?3.{\LeءCP}ϩ6jxz][ {>3CfER*̒D j=*_^+.$.wsP3鱹b`GraP)p큇xOo09L lvJm,<;"BP|*g n: g~˪?ItvVY~}B\&vpTJ@6[t̗"W,.$> ?`CP͹y]4__׷@ I7waNAa@hf(Tx/5a}/}.͸T+d ȿx1 dD'8 Іj=eɅSsM9(Ui mMeZ-6_²i՜[|v-|+E}jMs+uaop2&J[[w+U#'b2<0 7J*LhN>I|ZG=wB|FϾȯ^+-n.=0P[>uفS'(@m x.bX,0< |lpNڈ5Pfu뿴6ʤ^ybe3_iZ|#Y۳{g#$\m8 #=}*f`7)\vq~ُ/sL6ck8cG4d)0Ob!Bp\OCPy#2Ι⤄l+6g1|Zg/4%3^] ?z; 1 %H}ȜKw/86IH6?tN \>@[~ˣ# \D ᅠ|ۢPܟ7ҹna|~q˯,pK %l.tÍq<(ߵ^g2E-:&yȣ{-' ^3\s!yf(Δ/v71݋A$ HUBv{L&>''1% XGwk"&7ҥfn};"oS.__cnۘZt(>I LW҅PHCnΜ .MF8̟Q lIX4B*8#$ Kj}?o: xm:jpe0Mf{*LHT/64ȹCNs'~c,%A[\6OugCU׽{?h ījbKL͈J!28"Rm~c{ s˚ ^h4Ɇ$N'85%xeoWjs"Ƨn rPuS 9խn2NX 9ntjWR>Vƾy?/k"'7W<9FޕA>BVZ8x2<ܚ6e}ĜVtb~Fg&--SP9!z;z^CO2CC/01ḶGܙ)b5bI1 !yY*~MnZT3YZ.6kwH_Ots WSnJp>@bQQPWV&8`>wx{ m|IĂl<hrd@1t[{ϑ -Z=t @/=SʉWn5#D8vK5Y@ȣ&9)z\60VjH% HLPMf >ǾaUB*~=ZIAeƖY+K'Cslim I(wؘ/@cа `J&}^ /7=>wF^6a؋hsi2p\NPREm6o}񲞪Lš܁Ξbt%%r[ c]Smji%Ej9TJ`gR\ȅqzrRbP+'mӟR֓ȷޙ᛻CFPe2Et͊rw4ٞiZt]V.>5&"Iݦvmybԩk6?۟oz[ϒ%)|=+xd.^E3N1v~H+^e 7,+Ù@ 3L$^MO6^D(B๫S}.}`9;xt]V?{*.tCW_]vwQ!zcU?+mɰC.6r(_e% gD>"_&JEh}Av3/ aLoۤ,ٸBYZ\ xCW sc]ɰSzÊ6FU62wD.VfR~LQ*̤ wvZJ*}X)b5 }lLv/W{tu7,w/7x G%w&Zo9η\1Ns]G~B)r Qk~Y[w3` (V;x%=ݼbɪ[/0JnV͑h8?>aO0⋬s߮B "8=w7l3ȞfvqV Ŋ"C?z?p(~+?JIâI=H[EF}%A?gNofcC\ Z6o5ςk}v,r'a`(sodCc¨SG87le8y/ 47Blm~\;*lA\zUWGgQbPu[ed"VqޑUrrN3 3HGHg62k)fy r{o|oäEƣF "PkE ba'XG/sLх9An @$/bZ;phQz}ݪ+x/%"ƼEm9OY`[+J^4\uW-jRBGRAE2?\qeānB)PrI6As7І+\A+L W,24B֏\R 3;dDه";Xx`{sRoE^emBКq~ro}:"=A% Ŝt`= ,Ǟ`K_AI?WĊdoo'>/}ȷm _Pd0AcU VFS~Ad`HF=1IU@ >˿Zd~by2DXa]|k/4eĵL.7x>']Zbd1$%. ?2=겸1^3fCH ̜; ʔgkHb$|$?L)hϸCF}2.۴!%$[DD昂S@o`dZVʣe2ttC |Aڳz=]Vɴ%~bwLcoY/XSr^6VZuV?t# 2Lu$7Xш$P xI:Eg.e4toW755wGJ>X-RfFJ7wV˛s;ɬ$eZL:oضOH,a:MY96V]Piݾ`u|U Zl VPÜ8(^ۓO6e!J?T;}7h1e Sh˪>* nɍ n,p}g0VjfU~9pl\{8ñ70dIYJPc00(~jj/:LO)@{ X聤-0e>at 5K~űP.eGhO@<lK-qA8~V.H .&y=Hy.gmC]Yӈd~N6tiMz'^@nNRt*heuk ;~WizJYa@6Ͽс6؉"Pv, (syJe`k$^ {*fQJNk㾼Ҳpo8@RfY$&¶ZI#q"B4jQ咐~ڮT$WUleоƎ JҗEJI-V?PY֚s/b:ԟ NCf=6/8av :[g۷1@|>XaFL ',l+h QKpDus2$o77gJ>x& m8H(a>g`HbE]S ra;vyqgW>?/:]q(҇ {K Vp$n@>4kõzT3QNڍ\E.'g,]88B k[Mшb @-.לePJk(v0 yA&^Ẁ9-#lYJ LhyNZ]֍e𒉶AEehՐ`!p3lj JIr.~ؒLDw˯E) c]Jgq9 UAM itzF@/l.r6'ǡ UлxNp7jfe"PCq'>@I/a,Kbk1m9 H)>"S2ǧ9j!NY€ѢDc&i%N;I}1A0c8-qH$@U9BW|`jF7؏_ GlFtVTPQ&UnMz?m-11{p8@iV÷ԧZ{P`ٖ෩G3R03=Zݝe/Ւ<[?_bTGQ8Kq?-SeJ$vFQC.2$}7r[sL^l23x#:ڧ>bD2@Z52Dh=OcY{H+6 0]dK]I1M9ϜեVs})tv/C ,v T_)NU~(w_:4CBO̜;Y.2RX;5fUT҂, V-yFݟ%q[dPVԽ͟;DI0ٚLI}Zlh1xIl& KwBT7߻SLL 6Ի+J.-q?f Oy}Ca!X[sPqK86֏l'zQ!VA4Tc=(O Ԝ(R1tMr/\P@j[AT!ttTd8k]^3iX<"vvrHEI9bﱫ2d&i6^B0F 8P|-X1ęC`S,v/\TD)x/K (Xag6[̞}K㏰=:Œ I?Lo$ ?,f苬{QaDL[^% Ρ!nߙxM2MY-(3~/g1(xOˍT`RAVr9ëeLx-8,ȅjQg;~,=w.e 9?WqfSD/zI{DCTUleKqfвtXy>9ŭ%9R}fx?Zψ{kе_ѕdfFB4ّ,O|8ڮP{Zu^̲b2rjk!y )TH.m;|o[]C}XE"N {Њegq×4DR Ѥ NQlZD9M7EsqsMzM~CjE Dy^.dNVD~^~b.]&3@N9o)%n+f6(,Ch dK@: H n@! ;xY\<%tfGAjHgq3uIC7/9 V!0Ljp{*`T:~8ܙZ( \jt5u)E2 V2('p*<9&,dVsNiš_ c#DG#&&=X'6 #Hכ_.ğl*"'Fu_3.]|\Tɡkm?ߚK|8H|%գvW@j6daߠ;y%%)KԷ/`BoԽre94J?Ԛ,`= !9%H־j<%z "?1ef}KD2懥muˏ BP kd[97nGŃejPq[R9Jh7R}pFFme8Xs?OkX^?(%Wnhڹlte%r>Q-y@"pUN$׎ ^/^6x 8_xкW 8p.dfs emd@}ܴQXfC!IWב P{\,Y?FۈH:e1󄷛CK:<@ns,3t. Yq`@ǹqduNCU(bD/z0J%0Ȱ<VBup8r@ƥBFF-,"G6<'! j(=I$;:z1'C㝤F|D hപLp菉ER<^vL_M`d v9;t'.ɤlte]թ7b;:SnǑwPCoV]# gWΈڼ%D8h)粨^N]e@Q'V$OW>DPgEdheEqA:\ۻ#Qjt/`n~b6C{ vCtuK?<+6yQJrZQb2.7S  Gـ?F?TQ:DKXô'wz5_Ez(|Q /`5}{ۃȋTjm2MD޻_ ggɆ7ԼMZޠ5]1X t"p R&u߭8@|9!Ѿ`"f_d_ ^:OM 1k ɶJ[lG,F~,ȹ%a|a9v-E^ :!ky#9f)[.CxBRM{a@-9-(Ѓ|Wt zΚ81SyNcS4MTw '|冸?TU"I?6|T /ېX2IE BIQ'DT]CyJG4r'xOt5 Z(ʬ[5房2:Xĉd*N=m=":֑87[(7ZaŭÝpRm@YO340qǶ-ƧGm}n6. I%򷰜= qfL+QZגȧlGAu9.;eXi5Ͽg_&B+3rI!JOZQ,M("_ɇlA+Y JA R]Px?R v$1%$me# u:5mZϻ6sN<B}pmEc5lf"s#zoxM"vNB)ѥD@cZe皋U5YР *?j&Iw56._WZbVQ`µ;PygȢ? XveH]y4kuf@l=FSs,G~N U7ԚB!P^D^#VHC:2)f8{ o|v8j{$W,)5߶ipyWLuZ-}c lnx`c38LVW[Zrޚne"EPi@6b*8**1ffD9?Ebn޿O9,6"_MP'u\Y'ms+Tk֭Fca7,YHl=]52n3B= .@VuVqLl>/Q-s(F;(E,B9qISA4$~)`ع ACٶl $ S%/1:j7ro~mrQ )D2sJ\U R.q(*bGfRwGJ +̑gt xɕJ]lQ >u.r'D-)E4=y ?|K˖8{ŀ:Iܰ Q2 ֹ ![fļDZ,]C*n'wrĜ?Cn5pe>.QSwv)SHTPZR?ş YDkP{3HE8v6.V.I%A6B[U*>Ǚ#Dbrc!s)g͢ 6fĭ[OAxϣmMY zC%`ZFr"ѯj)Y(?vOmErY$#KQխUvEa&pWW-߳o8,S7E(Bmo cX׾o P8|e55g-,xؤS)NAP/(:!*ʰƨYԏr*UG>iBH*r&+1tټ_!sbl$:_7J%?a̺*޾FU2xnOo'w/3l7vYMиvIP jz.٨ďmīF::a^*)#:] wý4JL`o72 YvV$Ɯl[4~˕!$2ҟo(4{v'ꂚ/"6R[.W On짬1rt9x˦(g5 \=BCpRlqDwxT/wlX=#65,9لɎ$6W ɪY$cq5̧?&':vV^a1z:dUܿUeh*uoăh^KzKغU+q55NZoں7ԱmjwTK tYT_xt`K0֤0[ݛ~M[}' FTsy~nJ3Y ?m{p:ѳ+,vO<_x!"2(3#گeg G:l^d|bkÓ"<R^BWQ0A,*P[%E]zc7 pA+/X.1 )([H38wLj]ўR玳kKM~2h>OEtx$Kw-Tj'9?\~&h)Ot'u ÖR`,uKIdSe`|{ei)X"0.0D򀒚ϗ~B(ލ6vv/ԿJ"7>e`SiSORF;݁q4@X(I3. WGI3 s>BӮM^~ H"ΕjmEtqFMP( F ɿ/޼Gԑ P<it3E0m]cjy>2MuS|?;=# ssMS[{+,Xl_Ze |Ț8P6  Q!@"Ud09FuGW{=t[CB=[xXJ!5"0%/KB\%EecKx;h?}n\ Wph)7p-\떳Ƭ*9f`E Bnbh4T]v3mKo]gDr_:ˏ,\ۤErqGqZv` 8e(x\Z6@MwH0)r*R}q4`h_ʱ#BhvXjb$Tziޮ:P- :b Dt(z?]CIMe橩5 )chk5_..<i:#Zr(cF>.l sW,wMŵRȽ`J~ѻ4z\ jgDTW__(ԫDPw ֿ!=%uq֗}KOMd̹?9' @%՝CXnE_PntMI2gK <'Cբ6ә|l-^"șx iЈѷ%N'e@hm [ca+R}2Gˆjês=WˍUnY,w,~f Kt~/M@"RTo~w[+wwLױEPA+ Hq1fE&7@…yup$x\^N˞'8Eb$=ռFU*$xy|wí3 q*+Mf8PN|ǒΓq(+ q.~_! P.ض;ҜS ?Ve"@LXjgf D%MJ*jĢ:H!dUB.%+%$,ҟ c}FhK'<N[^Ob ˶ 6=nD I:ݻpօKF`6j/'jϽ 'aA;Bvly-A#w0ASǏCput5QTIJr]0*hjIW?nT4bU1ek ̡Z5'r(9OmOy^;uFA?ߓ$*ݯgrX[ aI`fZ .vQU$ cI16ڱ..ws' p!,.qNN8_Dz-1:? e=®uNg.#:wB|Y? NdINc9>#d[f9W)2|4r7Qy OķTYL~͝~UmFW- f";PC)8=I|kAk={t5?tkBP+(ʎ yTA(-{ي!g(QRAEgB8#|r7ڃ::ņΧP4*RezUxݙ"5 _el9k.plM|D<͟؝iؙ8\S%q\u(#s;k h}(ot7l#B,?C?x[4Eqq³xՔgߒ;8<hq_gtO[U3wWlV1+ Mb^ NVm>hiTYNɍ]^pIK)lȖm#JzWقCt>\R1@z|pE!_FɩTS%Xa*ګʇcMojmt߭]FVpCbq&㰠 6BJF4ʮx 0% +03UNC[ I3+ uܿjw&KEBh#ؽo0bgPcc9 8}]'svQF׳z>Dz-$\<3:8w~ ܷ I ?D)*npc1:ԓd&}b}?M~C-C{Uq#\cԮ2WVKmvP>Mm%7FbZR $Qu4)u05p/\l3el'\Ć]xYÓ{g Gn|\v|)>TvZ_vkM]T&S8sBgsz"["c"NܛVb}+zb1J$)%GF}AѠeԍF,Y"z~>k{UƉ\NAwU{so3f?gsYôT6 ?#'S"zj\bCԟ򢲢8t5"|__8pdђ}~+4> iX\ -_)?sy%!knê YAȸfq ؝)&bsB{T-,_NJJǵ#_- Lnq~g`o)qNY[v"Mf/XꚄf*u`oX`Yc'Ur_fj >Qd4k3ۦDMut9'JhDz0 -c0/?RJZAAa0 dn9SQ&΀3ĀfؚYG_AekDs2*>l$F^gWA ]֠᧬zYE}:gAP ~ۚ'x$E$ȴr⩋8(}-%c\ݣ!lR]dxO԰'TmCD#RjZ*UB`IqgWPmI?<8ܾjIaj)LoqKlbqDIBщX|@瓄g.(o/}IKt2bTJwAmlj ^'%QrN+n(PM iYUe`{<.oi%sm?xE? ˧;xxtæe4PX&iAfR-hawֵA6qr³>dx?% 2 6+6l]tZakӗLRY:(bP<RvtRToCYfG M߸yEqX끉 iʐv~#b涗*Ddm?bHe,f@s%F;0lKA~ St4nrY_L: tB<.rwIj>x8yLҦ|%UTO=|[?;ƝjzP*H$uu w5ؠga^ɿB@aq .`'t:BD;SYCȟL{bIq?ue*.?qS8O AhvWA/I9?@#CRS{<+IUe`))HA`vW`l J>l N S4wLd#^tM|ck XUWQt2"M&۪SdX=sPbhq$'%?GN*"“(Vk-ih-]$v–ֳ}G$P6e3 | pʘ}twG 8޾a ^ awɇLstζyZ78n#̧ۢI%÷NeMpM%^Qxs](Y"BGTPD#_kʺۡ@s rx^-WX˿M!,%#Ok<Ax!?ͳX&̣%$zKlj1d&BIPX#u`#VB/uxС{e ::a:U߱ ?fmx<g'ϧKHJ3_T07⼝'mElآَøRe: I;h! jMo=$]ZxLteyy_wףI'l6vx ־Ëu9=?jnJZS8:;LσYo,)1/Hz|99z}[";0 P v<3)xB,^QUDg|ܷۣ KOj}ߡ붟ƿ󉫐_J&m]6=Ue/Q^¡!k}>iEI/^]wvV[f\;ɤRX2;s-2lڼ'X!t%zR 2a )JLe%QyG26P*Ž|є/Σο#ncz±A>0#ђ8dǡ"P<Ć{I_>qs&t%0'}[]+^/Cc$ZEBi=821@hY,`$psbuE{ *qz՟Hi^c{XOR\"[,sr>(9hg V$r&<ڠLfbd[XͿ+jH< __#< eD؊qFƀ !+/)d::>5+haQL A0m%_iJaw3t-n1sE@|N7X> an˨7EXzg^_!cU̜=(x;b RrၼlN#[ģ!ua&FKR #k;/00)W_B.^hL%_A0oOhЗNxˤZD{2X6[b>+6gO L=t-Ⴡ22Sjw&lѐwQ1.cyU~e\blJʄS?{>-c;ed8ıLto4dTm] {{;$L-. {^l#A%bb# k6Q{EgODH%rN/t_aTǿz5tQ!@B9O N,Ô)flaDwt9U1|Bա'~(OpHyYy398A-׷.dBC!X,mVπ;FHu 0wbrbP:G>Ϗb(z"{L5wUJ f3JW|_޷)RRNϞ?!a8GpXy3fuŸDrn.~j1J{ NE ;O!η(Qt}GH%csrO4 D'Ua~k-ʚPI]SSjC}u@D_L%Wsv:Ü㭐4siчnmxvF%.蓱JPձwo*-e˱M =|M`J020h>k8rAcEF5U!X%/[F\+a+4Zsd]޼7cRr..q*S.4P$hKzcxE$T"=S?x[т!QĄ\"=~TiK]"%0u1 BE&,p~;I-w%qx'77EJI sx`s<]9!FYx ^`Z8h~JI8 Q%'7J '̄m,@5)Rz)BDWmxGC 9.|쾧ğޢ~q8s'0)7cEÌ2crHܤ똢ayRq¸eb"o{s !"j6([ QZ}Ĝ#o,h&Y?w-VG(E9,$̬@}>4cXGltM_"] r\^`L䣷Gq: TFoKHSF3N9*KQfa:̻h=^O ڵ@!iVQu+=2 +-J^{DM±]hܱҭ݅ff`$mO^p-DoTyx%T2[ci3cuUg:sX-U36=^`ݫ0f]'gDH]=s)XңʂҴ4V7pșnHst7]LR$Ȳ_ドg/oBnᦏiLCz[,ώjgU 7T4#0 IP˹m1)M'GxQ2/wԠu||P< 9T ѣ(:#ӑߺ|܊s5QT\HyEưRHB͎f 8XWvtL\m/t)xFY(Z,Ԏ#nwqvy )/Vrn F^bLKcj'ň-y1N*< z.s8H/uB&Z?3 湣tj9j*2_ܪsQ%N;8fp >LhH ?}żVn|_ܠ$n㪅]oi"17o OO~"Ρ܌a+3 D|%R2(㛢c`XO7+:2@;9v+q=Ec!U=)ʍiYLUt0 ONbNfvAmPDJ =lK5 jsLJhY,4O TUԡ%z4xӷKv³m j6{a~q˜ ,7KݖGV&{eb˕3ρo]a?x Z:!;|h?#;);@fZTJ@t5*?g}ǯ^]{L D.INm]JFH@djxp^ <0TcH&s% ܝb:#%SԽ[rQ\*շ JV< zGrG7+]e܏[Q**IFc\b2+ ެvȪO}qfaQv5Q2|J v`_Bb^ȿ_tP`Ѻ޴]竐D4 aٴD=A1HքkTOs$EO\0$!ΉߑJGX pnYņɖ,&d#qo^ȤNb& )n)%"<&jh1>,}y+[}%ez#\F탼<­+?PʃWN057HBUOR$M np`EG >!&j +t'5#\M R_ /w 5GCq$X>=Klawl䢭>-U\#$VCAko>zy"Jilݲ  }գn`BLbXA7ڒ52hMˤTP'\௃,r˔ʎsϞ L ~X[+!`-Bۥ}_c5/4.aZU$ ˶Z8bTu(A:6wݰ!.GCZYZ^Yc" 3ZJIғq6- &{+\awjXTi˝םF7ЃZ,j.hT -Vz:Co wC|egn}7sخ';"D;]8*1w>U<(ZtBi:~;fۊ;ȣ8dFyx4bfUy_SՍ۳wڃe賯%`\f(9>`r Ō״~!?lO_w2:Gi!̬\u4S$h)|ځ,%=Es 0MbϺ  OEBHdF5~g*nAs`(އ<\}{O+CߢA~E5_5_Ϭtލi^O6$P$N?J`M  Pڟѵc߱%ĬJ:]B{3E\2 {0qc{ih8:9c@?l6` IGqB^L x)i !e7}ѭPUO+>1 xV޹<ЋC_s5%vP3&RK%ơF&YTC?_ <$ZսDT:8VԆ7QȗNb ྰ|O ?N*_mٰv齄[vEdkI<ӧ$|:qgIʏZ<dSXETjwY'޳+ecC({lG7^|Hշ ;ibLd;v?9P7Ka[chY2<> \>~Q Oߊ/>~(3~VxxĖ3»E%@[$S֬ANAԉ~22z@%0kFf_5bm$IUDX$2CΥy{ͬ NOkp,Ԋ;sB[ho?bڳ6LZ??xX25Ik G^݀U[SGž2,wOMzY>d.5G$JXsw*<Gn_)@.~g ӆy,]f/tաq;*/SQ*懤c3ʆg~Nr0*M%^SM w\mt)dwic`Fu@lVZK \K}c-w\ѻ414xPTXTv9WoS9>[iWK9JJ˜qRKiDZneAcʢtDž a[|jcuO= " KDz(zo[ ]WnSD/_GH~Yl5i` T]BnU<ƿ{a&Z 0 ӣ,l{Wjӫ.yζ M~%G|,f\ڄ@g?ه ^+{BISMbCXCTgEW+-OǶPؖ3`ujK#0&נ( [冖.}&EK*lY7FSefF;)@k>XsZLEbH-EGTa1>+r  ؉w/*ՋWms3'J8 8x#y͕qH7Lv$)1ºwN``IO` Gg}d ͩχ5BU@YK)@{4#@!mBbCTd}f"qD=H22.3hՓ4>Rx~5y!Ęu5kmA8O[{CXIl:l@jkU34;sĨ̔֨fdlq\gp5<~8 Ӓr!s8:88'~ (43b3Oܤ$`ag,=W喙硁wu 0r$b2KOVśZ8:«pؐ3;DEA\v]PNy@2TDrb vZIAK7Pnț/a} \Jv7M 9 jꦘ%)/ P_}^ O{)DfGfmg;7D6SqMT:bLYܷ)QkK!VovlB:9&"0$WƑhyr&@FYZ'S>q3|J2ZT, 5p %HV:BǶVv(ɐ^kOIa(N[7#'iM\A@Щ Q|\S "d֖+trǜvԩP9R~,_IU}qaWp*x[%Ԗ)%ř28Ᵹ Zk _-H"ߔx@! cwR=R^2T4f!i36< ;.h[C(c'] HMaiB%mvF9D:IWy!{*e&ix$hNb tRv1yHg٣1'AfRv%yma?)LkjS|Rw>6[HBTcE!9ČqpKN%91hc>1JŢas4"|IЄ/S#2rHp2`G$:%9za1q.nu X{k5꺁J醓'~ E>E;E) :@*gu vu1CEO *=ֆ9V]흨c9ɭCr8g_KUef:g+-9ua -V1p "btd|XU$>j$W ۫yb+| q)*˯i<L'E4`zZ*.np0'5O%ϱ>'#kj Wa IsO/u\A 3~00g'l.PSWPyeY" xq*mPcu.ea,ds=*NR+EE$5m9ScD#lpomU=a?NvH9^ 5|Kn^+Y;{!q/T'*wrF k ltݲWKz}+':V+w5!rX[K] ZG6aV tjӗJ@@P" B `AApAi^nFZxv3Be "T7\V/ M`ۼth.tv0 \$ԭص+he!/ 8suP%}H\ ʖW$@`88+ IA[xeȝ8|Q LwΫ3E5*G6/HEãG#H JꞢ L T\&KJ d(԰ xAf֊aJjh%6Alȶ$= ;,#e|&7a8WU7"{\b!];Yd| Ǎ0cʞjIԑx.!{:$fQXVL ?ߌƚy"5M0.ES;lVpDݨfI#K>*d/[;y=/j*wc@-B@-O7Y 9 ̴mpi[Vlkล3sq{+lf%"h$>/Dz8\iXIB%3ȈsúnU͞< O먤6MvCRM[zGΚ+v\i%lGv<.Tȝ(ROs‡*xxT263p9UkB2՚WQZYJJ>L /z+iUT$*X>3?4/EnYT<7O|'֤%`l疏 $P\25MS\E 1/x1Q)jNVE/hg.*&V}h)|eiwQ]ER[^v)$xM-N\*VXN--&^NIL7ec'=o=@\FjoCB@n y: < 던' 󌛱cv֭Ӭۚm9\O&.}QZK5c15{P)NȨnѕzm8ӬE+͓!ov:ڮ_O2/PIite+3<9Ơ7Sf ]Gj3`CŒҰm $y\(bJ} )Cu1έW3iAU0B-!YMA=\VoUE\Jcz\&yK}hJGӂh̺ۤ&iKk>a;)Fh8{ ĤK K%R3dOsw p,)-a"eOXiXAE^<QpPA%G띌6zdŚ>~O̱&:(nިNBT, aZ*q2/7|S7Wxk .M[oēM_LR. |%頺c,BM_\n4yz8{4% pPcEM Q5 ]<-OnH/0ls4*Bzw-y~#w,u(zU7K3h;HIgBm1I*AAR*' hAY R#';Puv/qMn A.a=+X~[p S%C#<8MZ J*+43 3qx y8>B"YrY65K@“V"V *"mD fhaQ(<rAA9:K}|i0̦eɫ`ŒI<*6ݎ 3jx՘P UfF )Ȭ8rj7cB:lIJ:h&7 Xnf9awiH*9i~aLKdQ= a ػ6 ֨g4;2޺]̈́lϿrKjǣ84d4 6Q5$DHᢹh~]6R=u -څ̑IV 6qgstd}HP*QB(VG;t:y1-7OpK C?#KŚOiylvo:ϭ.{w\Хy[&ELĶ*r Yf(<KuhuR yP;ǣ?C/:tDH:T)UإfoqLa 4 Iߜ)i=byQ$'hJbg-dz:U7KF E[q<4 o^2dyQԑwpt _B$Ƴy(m/ǯie=KH)AM=f>B I٣j4,<}8)ee1ԙʦSGżn*32z78ߊ{m 3<3\L>`]lv5wzLP\[#Ձ^Zml~yg_=^[k +YĔ}8O@#m`J `mp"ASZ2/N$0@"-EZ ~9 쫏2LK9YDDznw$;¼H1rP]Y2׻L 19.Nx ?IZ\6soFD[xۧK (vʢ<=eu IL>0YZ_ґY788p]tK4v]Y:T-}hy;@ɕe CEo7-.u*dߙXqz/TTY0ſ'Рٗ&ݬHF牭b@ؾ8UȰ"Jse11$_ ax|Ŝ MTBvKR0ۅL|g0LX߯`Ý;جj̚Q7xXrCT-T%I{eqJݪ"U,GG`!c4~:iͭ +d-ɘd& ^?ByYʦkʔ4K9lߧC oPߞ@ zM88|p Z.0,;U0k{Ͳ&ݐ?Ax=Lcfx,WʃV*$;R,ͮ$Κo\Pz7VTR[yM/ U?0MؙC.SھC2 %ߍa [4v5:^ +^y5"3o%~G>i#(@šT_@'6dmEEZ2LDX1"M@bo<,Oʤx*{ I\vkƓhԳ-yOJU1Ca(OW'kjeX=O3lL"pn<LM4gF Bv|=k%Wt (O Lob?ڋXi V^NJM ] E<F/z cHcKJ= pOٱi) gp޶6nTR%t {qTa c`t2*Z=1k pҸM |C )Nxedc]˧rƨQeHDVlޗi=UinͬӕF~Fo˿6׫;7g?¶xZg,'"c|̇ᵇ:gK2DZ)CJ5(6mJmM8SW<.E-XᶲI'E"PÙcT[p8Hʲqq;?Ia/rO2/+5Wu9m'*Y>KOeTߐz Z|fs KKd89 L |iS#ωdsR@,#T\Xݚ]L[?ͱK ovvf B<C|Oͩk0P|s'nNrƃ(ał"x!,uF gq\?}d„5*@Ҵ[ l{Z(z/N ,Gɒ COĻyX!8@1ȗ,YM>o=rc&_.剶\Bmܗv >Ŷ.C>JO7X}H3r7 BDpj_O2"_anmN_m2aƢ dM12;i-eB!eH2Eڷ(S&%tzNʞzbHK)Q'pUOH 9EKT6ދ/sL.5e6KXf+%= sQCy>=+|u.=X0?@~9$2|ZD"ۃY#s` Z޼? @N:&H4Sk;acx֥}s^D$S 朓.X5ܷjXFԃe[L-$l -ꓞ+?kCB̴|ɩWRPfs&wݠz_47Q>44X'&bzk1fʚ?-{z L֏>Μ6 ؀2 "ghcѸMb{#]콽uELK W>XFQ 4]n=}_ ;WڃKN?.]CyWA^[Y[2Uӻo1,{Ί^9kʶI[_9BғF&&t9fɎӫ'ڥb:TڨJ1:6xqu3^Teg5U1:66ɾfp:4fKyM4|IA/ k 2|$΁kށT!~n1On瑱,C\X!aL=B|UL)ωDn]\׌@ᘸ׀?uGifKt[1005{ C`ciR+lJ#Yw^KPvIE}pr]F32\w6nRchuK8 H+G/0طvo1GEZY:Pfj+;3coda~{a^KkU,uؐ7889;ޮ>NTw@A6X-Umji7{DMt] 6Cp5kOukk%1;F7=rډR@-kJ?Ttz>7Y!}Kh NjD=D\SۅŇD jJt*3aَmW+zrX]%X^؀!!m#=[v`zefufh_M'SjP8艧f䓯xZsɴ0e.g^O@G0 <<4ݽtRJE٘GVf3w]GbttV;CL/̽w{4>Z _d4p(Q%aNsץ>.7v*#DTpτT k`1Sj b2K^ǯ-@f\5yk0s@4Jӈx޽{Ղ m XW?ɥ~'\ ݛ15C1ĭ\Jm@GlŵW׼cSy #QQ<* P&B[=¥l}&{#a{`nJ gGU'L9X,i=^O=w ѳNOsAa%˶WŒ[g`]Y*;|/x6\hYVDh8SRƯʮ*R,]0Bտ$9q]?Os\|;;'O\epazu"t.'>UWVw Y&g-X*rM!swP/S??*ױrrB)q*/GhA%˲\y~ ˎL6Y;;gupwR3@nbo2[@쐗Tf) dca" ITO<>oi V#5.n++ÈDžkC$n@ۆէ(eWᡸRP|b2H.kÇ-ZGE]'Π݁1yfl>zH0E?F; F;(1~߃ m*."ׁúML\Ȝs! :a5ݫ$ObORa-s[uwq8;9wq9@] r{?..P*="bmG9 Է2@s EY?VtfYw5xu*v2A x;fs n x_ 2}y~]_4##+ӯQ1 |ܘr rttt^#BW1Y?+4 F M ?x8,!j6 (g qp^ =H -Aъ37?˥n. ;>6JUBο($v9/u;b?Ŭ^OUF>P2Z 9 jfP:WWЗgǍ=\lH!p7[D" lʜ+u:H+b 'WH2`fig_\ ֈe1X6t;ӭmV ,y4WJ %ўb93GLҐGi.x;\gEqNea`IsD&@,_C_K2-?eSrlId#4 KfŪ[ 0d$ChA5 P&P62!7ۢ jo"Z+jgrZu=ŏ4 ws|֙NJ~FB !s?1󊋦P}mD28ŏ')ؑ7w݋ܶ#OKX=]|s,ar#cMU`A8(RhHk8}56[J6;%)ERԏ5t@#E#F= y$j^iGT]xz{"D,jh\(Qk Ր8פKAxV4y9VR[ kȘY8~;{w3vdĨ: >{Y G.vTC;W&4ԩbV4Jl?|ۮ( וDT sB'~U9e3$*Ee+T*iH+f@6 wKD=rqXeRnApM2h/[yV>.tU;ȧxm>2a h#f d d0ЎqD@E4]C‰1yx#y4Rŕls-; 2 j|iYSjO/;|f^+fw>; M!lNDV=$sBN<aKOӰǐ8/ðwF"Bmy1p}M PKdk0.O$>2VT}OX71X֔@5(LܷC oퟻ`w-єC6hl:j#v[6>rѝ:KWdݠ8e¾ .+",~$WFR9]Fw\  [#K Mo3ŀTﱾ'#cGS1X$Ę 2٩,(/j`!݉| <,xF=lGc1Ts(_ٴcEvyM257erHG,˒ԼGӉfOFp>ocN[ݝR׵@u&Y`/XRU%n6+@ S. Y5Og= i~xcЂY#@O{4U1}HSB9~5,t, cG6b~?(v3 /Lu?U8EMe_+vK;gp;1GBt~fNo?&ZQyo< 0hP&7\VW1x̪ "N^c[O'55ƹONi1 f/$?o02W&wQ׊6XNƇ>h;eަ{?iu7<`X\c-ڔwRE.S! ܹ.vv; @`Ugy~zuU]D:85(Q'95mqeF&"|L+EFow l:8L[eⱰ(cԒv4>itd )CQ݈@ )jԌ=4!SxlS).cYpUDI/a*l2hYfXW>0-34m/6xָ»tcӶnQVb1hgyywᣚz_6Da"~W| qFx `{a,exm<.0\?$E{܌PO`.);y /zs:ޣDL67f@W eR\5fM\}K'$z2ˢ@&"}Fө pppӃc 15 j`ۨ3Bdf?ߙ\1.0]p:MQz)S|%3V^TF6NJ{}[~L]F l@Q:CőNiYC 11%QeTK_ҪS47qa>]=Y}C3Պez.\ȖƜݩr]yjU?a^~SG\Kf3qy>{j4K0Ǔg( /QK8 Y}+( wnIvSJr4+.qލk1C=EaJCYMkt}r+a:8nWsmAYS-y^mA,N'K\8LWDLfU[8>tV#IVhK,'(\^Pp% r6$Leȭ5gj&d-/w%yD; 7.䔛 r>Dw[sa 4b=8$Jħp_`RAY[ƹ.4X[YqUB v#aT8,bEÅUo3f- <*/lqh q{4am?л2EXv p. yQOQ])nTz cY7mu OaNh8ohDFMr%d|4%xzgP<7}/4X>{1ޅ:b {U v>"܊놏qR?Â>>2Pv}&6R|<,ٮToqY[7`Q4`.h%im*h,?fB؂R\>@Z 3Ab%O aѠW< @UsK87X5>C(7)9 s켗hE{V\u@DXؚ˿wVy  {zV%ʗO!cN88*i5?"C S.Jʙ$V 3 Ihu5Y ﶃO1EJD]*͆DU9m.t©Y8H"9}_-2gy k * 6!QSaVi0,ޤ^L6nɉI1 pZ]}}ӌ!/bM |P޾ָޡ-DNXL[fp0#g<1)^ѡFZt]bWl.t{%PWv,hq2t6`lDa6I?V #_E B7mGRq׵)<imiz-X zGy+=*jO3D .=^2+:s ,U?~xL:(ORAyӎ'^9[bƾ ˜|OOYԮ$'S;wEV5D*3:h=}mp I cvgz; I V" -Cn9רcj<J)IR qr84iݸ;;S1CigKƍ˿!X&!6T -"dqPݽ uqIT2h|=fcW!$ZWjTN A*R*oTb_d,rD >U$sOB :)yG'Q/}=g ] c {Iz6U0N= $d r) Cb3rLdHF;E<~=$>/cɼձnC^aZ-0kd|G4>1Ԗ[i\!Fx) Hw1 `ə<ѕnj۞ y՗bq=AXFSލaq!_/~[~׮1j:dPZ\6Chj,QNh=Y6执@+n)Y?UHs'm#|'ݥz-*n,+L?5]?Ygz(~/vB0A[pEgoF v?L\À 3jrV2/`GB`?_3R¯>\l kPfYvdbZ;u{]A+B\BL:D"O5!$EKfOcv1[gfTƦbBY![5aSE2\q,-B [ pJYp'iciLT^q.at9Oe~3sIFv K$l ČG4 SwQnO(#S1V3V' Jtu$sG^pYZٕ#|7|OCwft܌P x<>љޡ&UX;\w؇Ä*,>LLܸP<6޽rȖ uB c{FЧ O3j7e}al1|` /Bxyi&F?I]@Nnm=3" '+;^RH}nB&fl}}^9Wi)W#ơb0~Y̦ځs8o<.)rNe3m/cREuϏzyeHLE1OonX8jqY-&0&J{C^|NhX<ἻV餜Յ[_,@W6cӂho!>d&Z= m/KV#A\ xlr4,EKNru XB0Xk|J|ה2nxmW ]פ)J<BQY`3("S?0zzWg4 S)'e|WtBX] O6x1=l kBE4Z2 sj)bQSM*>iN!nB(jhypͻFs[zpm\^|H}O*?مU"ݢH&τ?$Ul.g.Muda695HM/* Wt pH@XRxnQSqO"㍫kW,Ιy/e<[w;Q#_{N*D?uz_` Ƈl p(3&mb/wV P͜)սDKғ4ƭt"c7ږk'Kʲ/*([uN ލIM#?0!RS'j">Lqr}wep8$dAY&vέnR'2_%Jy4)JBF]*rOfC>XǕhЂD5!PbչKmT]_0e!θh4FA<~¢C"m+GVE&gCGR&VEC5F6`[AϭT5&*&5D/<ɔ/iPϜ5ok g.G0B;n46m)gʪNJRZE"K&h;g"JDݱ_ ( p#jn:?_:[nHJW #D7qAe'8ƾ;9*cnvD^{5TEzpr$C Vu| u f 94a<ӕv/%O27߉nJBcC1A!2s 7Ь{l;u$/S[ُ< :nzN4c;#n "♍]BÝ,Kk:&q*C2Y@L--+}'ߋ.S3!2@Ԁ Wmi2A>y'qґnO:0i:BU}_S_;Oo9o1Z#I]s3rpNG= p s{mz@u{$ l4GsKUwm/FSBu![Ӆ;5(]YԺm0#\b*`vl|} JGF={\k4Li \=m '31.g}1Nїs/ujraf,(#Ew7]ک(\B5 $`ӭ=hJirX;Vl Ẹ a{~ڴU/E9Wy083 a}ʾ{3cf'o-dQӐd)aJX$x}19ʠ g^v=u}uo8|Oف+gg)A>/J7LK lvKEȫ#OEr-\s+T³GN(yv*@&1h{ig5c2VlI{qtgi{7}kUxWd]U?MVS=*] ) Kث焑c-;koxp~{x=ȋGs6=}]9-~?KXOwLL"`Bܡm}e(W;Mb{@#8X[8EIk)}s&r.sedU׿m;dg98}6~G[ޗ>yio~~v2hء|O+dqf2+eN&M͋ f'4ŭl}U9#YiãC;d;^j?X/dɐ H !/}[|߳kCj ʇ%Z6Y,d{zM7k$DB|F+{#U[IriZxB25?Ω1sVu>@@dꛎaڡ\UH lrXQ$  e2YU @9""Ѩg䔼gjnkBP,),< _ǭ$yBhe*{럺/A%,_OL]ߺu bTPWU*9p&Z.SuSzɯGpn0%lp}rj>Ǿ\TcS#o6Srb;O?՘z E#~H.Rg. Ʊ)4ۤ,kռJKLՂG`YX zϣAZ _M|Apm]LiH,r\/cn~(жy!voKR|(^cT'"mA}L͡rf:h Cf:x~8^];|x_V! 2ⴏ-I}ϣ!5/BE'=[Fݳ:CX#]:-w(Z-Y"D|fɡrD$dhA0d:+UԨ҇&\ Ǹw3"\=پ,\~a xzNYNdWy^2F`cסhmx#>'xŒ}t< ,xi.GVV9!Z35s4!tiCigZ6Y:Ii"'ɸ'BOֿ,m_DcC<4 I`'66,/3 vB N|T^(76>6N#gX%ٹHyaFzo&3R.ݕ?D/GN5%TKPpq"֚C$TSbmU~?|). &kJ2<Ǘ-G^BN-vWu0ǯXT' W $?7 6XdJ 5J(/W"!NKөuSr)L1-i(?DXF!䥴3/Uc[BJp6o]J@N]ÅWt'bRnoGMVzah>FYX7wP3|yY 6NJ/59C], U}wwpv @E~"1'{6<9a@weAOb!ꓛݑrխmJa5?=ԤW 9V[JE߆¸>Z J4QXrNUx5;>%zrg;=1o͌PJFchsi%ް9P-"Iy Kg:I[ўGoCXS XL@ ̫ Vi9pКO-]z"`f{o^FP.~ۈ[M <#YCo^HQMH_U\kiz-=oG/3|-]g\iWL64(4'3Kw#u`P.uWB)7~~yˆkR9=pO '*8>BEލ{o[~[q 65~ R = CF\MaoiJwPa 3 gUXxhҵ\3/OD|ͬi()~1nNybI$`we H>ئ^wq5ۀ[CMNH8k^; ib^&O{-6C.69/˩,烞#E#y+S)ENx LW(f}ifŹT)ZYSϻG({ ,2վD`J(TT8qL>C&W#!>|S{顁#vcq0Q ,]Uԉmn'e"WMJ߯Ua3asg8AOe%JDA7fPQU%o@<߂%Fbȍy="gjp?;1##"tƼR!/8ITߙ.=KH푘j 8o_ͺ1kԇ1}uwKU"PjA=vzWYކgՀQho e~}kܣ䬋3zPM}|{5ʏɰ&|YC/N׏E.{]}δyޕȵll᠗ ! <)r^ ~J!|{ ~Dvnb[C錻&8pLE/1F ݷ SA\0 uD{۝I ^9ӮX2f6\cNF~ݑcv} NhIM\( Uk|a2:vUL(YlUI^_+#.&b5Ije1lsx٦H#'Uas _b"#U# A\Sp.͞2ݏ,imYm>3V3.ݓHsd xSgt9rMq_vRB*k:b1.r٘Yؤ޷ԎZ 먦>뜓1]^2P+7<jNJ"eLB:-}{HkPe? =*[V%YW}(xv0<ܕewvj+^op$.@5֛Ti&(yWK(vsI)B.-eCf+r۩dNٙۉƫ汐8B<[1;7_ u2 Nj܌:8R4ۣ4bԀ@(8ւ*byGAL|>|FfB^9~g())fE#\շ={gSRVj[LLr"ʵ.:-X8nTGtMx[Ju} hij~۔w;A^hG]K%6 jyXҤ9_Hb'ei}YM!C u1?AP(d]9F#N(?.$%Lc/|/!MXՇ>/]P'tߏtqyq\ۊJwIIFƂ¹9[VųaEU.FlF1m0陑Ӣgx9$n9A !ϭj^UϒmC_7@ WqzB0Unw+p@6~TMl}q`KD=HėYGA+;|7 Zl=pd/phɃ*/Ud\>?7(H#_.k%Lʄ>cNu 3 r,hpR-Og%'6,w[P~hX l w݀êMgwpeܡRK(P]}q\5Jx覰:=8,a93MT]tqy39ظr@91lI:3ٞ}B|2>\=($O>xWD(C^8Vk]5%[th*߶vw4^۽ qu1m5?UvVr닑QX4yҎROpN2,?aV2$5ݣG+ld JfK~kT%KmY#ɽO(FoTo}SS9ƱibrR,bbY{ͩ" 'j1$FfoGè=ƭR yάOOŇD&~!R2Wjog jI) 29/$PAUBt`bhMR%uqSNo!L8]pfȭTae\AGb{ {r^D=l< 5 @?|5 9V,O?z> Tqqɒ fL3P](5g92mEȊ4p$ '`w^K.-)b>b.iAJ/Yc7rWsbTM Ǚ8 R竚 cJb0):=Q7|fܵLaM 20ր6.yKFJW zȞd#3c92Fd>ՀQ ^k=jLy(0nЋC8c@r5e4Fk;dF|ӳ(|LbZmG }虜vxΩAY* wC9{DDRlF<]@U">`II)2\ HΥ\n_&0RGՈD=0'G~]lpwGˊ\D0{ c?FHLhOHX4*6hWe5_{!GJAëS e 'E?q k3 yd&3AFMX>!H8 |'ޥ*,>IЖW#nInd vy=Ŏcݽ919]m uNgn4B;'vS LnfA9/ OQr. jF8;&l%3*?z q{D2n6*ls U`PK9^M-ޱ%a%.]8dThu[ҁTҩ&QY!6$7%[#(¸z`4auwY)X1FjܛtI|+H4f$JLsŮ?qJ}9b8lh@Y+Ԗ4!>u?w.Q˵uHOh*QLGQ.C(~kαqq%A=@zw m;ۍ;  ['-EFA飹ecA ;O6,h=FK3}rDWc_*FQo0p:RNՅȅ\n U3Y"0#21.L9^ye3/C!,ߺZ< T9 0ScҨ@Rhg:,q{Bޠ_X.VtkkJ'-0Q=20m|j΢Y]N+%ܴ7)&XTK"7&>j/6J-ĠU%| v׹/ۖ%~C@1m}7"xC'֮[5ЯOYPxwB~!ZxkFy٬~HnbvOzJ3_~9'GsaW|lM u?dFA )۫#2 ?ddz$'PeѼq1 {"1i5O=7↞DR/o t o_G??Zw[X Y5!'Kj|uT&Rc׶%= %0e8pH1 rح*9<2\UWu= ߛ"ɺW]IVtzzRO>ec0Zen֏Љ5Ad Vdn^ aϱkyF Z>7\5.wr CѪnROd!ϟz_Go٫"_A͉WlkOG)޼uQ6swWaq-|"J?óyd;2ܣZYs HuC34")lep553 =Y//. {@#Cy 5ӣqd5B5㱌F5icc 9c1?Xy~vBq (eHJ-^- /&}2 `!}x[~uE- [n joO\jptLI :V<p м+E:g7h]L&\ ZrqҪs[x^uw\"tr.C)0I ~ `* Z789(FN@l91 vNXU[?HB~1u>:w,o?U-LL(k"8e.{!>d')q ^_]L3\GDYӏцh.֐*"WKv!_ছijLr2)(ڃVnaw5:"7Yo;$ 6g#s±#x4%vŋQ ~>|,fx6FG0cdf"H!/ :Zw Xak} C&v /S5jg;-s!m&k:-Y[Gl (DT U|+?0RnJs`-"@eUWjipMN׽ga}?9xӔnԑ/)DۆʟcTa63$0]6 1KH5-T 4H$適}Tce[͒ue|wRkY4,o&dܚ_ך*l/P%-+6ݛhɢ7/=d` S*b0]fi3 )iB]ǩQ)&2*CnUlc9#nI$%T,&°ĝZ*'瑣? l>r.LD p<b2jZVvQ[&٤af}d3ٹVO~%L8N:Qud?JJ2pPqX"r0g'm!Ym0v). ;u N70m(`jo~NJS/l"0x h/TۚPhSb22c$ijp%R]c-+M_P b_&jF)(^%n/E7t #C84rK+T1Z*`fK2sƉ8ivJ'SGQa ~;p3*_(=H.5E beR^ `0=n˦T6m`:1'o:a|}ad|n:y|8ZL ig? LdIG# xɚ(ƀu pœHU9q7;a8!dUVR7" ;%&ʿVJYN.ex@~2F|ݠq6CϴAM;0/B]uc!1?\aYTM5XTJ@sPsJRNꟗb :0rބC-s.? AʼIi3Ff򅸹'׌h-Xr3ZpxpH*LJ-jv]L<-*ھ$'MB9-mn@˭Ism#,ܳEu8hXhՌ`Nj: sWנI&'9@<%Z-@ 9XDJ8f!8dˮzENG YLGR3@G]ws?;edItHVGfh2u2>H,29lWK;:D^ |xcpj("]zǑM逶T$޹P=kT[/5`H(Ny끒(#ȄLyƀC'⧹b8Wڃ7?բ\v+SE`!vM|qzEeYrAZAIّFro?C6F d@Wo&f|cq4Jta |Eܑec-{_`*_[]C fQW\1c#켏cZW{;s/!wsSDdU鲶 ȨcX+PߧF}ut !g 1`5 !@7~j@(8Тc{Ms}1`Fa+pYMY5qPOBU7}LX#ޙ0APԓrE xn8Sw(vvŠFf0f(i/ q"}Թ\8 /d+PtfNBIwP^:p'W/M od䛝Ӻ0ZqG?ܺ~ךnjUc&(Hw UB /}"aA}~a൜l2\! GW 48\dqp`n؈,䂋o5E㶔8ĩn7w<.H)bC|.}%I-ӽw/ ȥNi_3jKI37ˤ\M-şxG 9e)\*`0v G$hqa7c@Հ\_vv63.K ~B("n1l;0ֱ(j @K NuDv?W]+L_#R VVBY*! c;\Rb؄]Ѥ/#-kX]*ݦ,ӅE t]6[{ş)6:o^z A7&7QWNƚ8~(sosJ- ub :]僧/ϙɮ[-ݝ8o,T0SG'3,xTϧ2׵!ig ^#u G={ZSeA> '.c704H 9}xuC?nqL<+sa*enK*./ƭμbm![ t"AF#D'5s.}yW6+YYQZUv1&e[Z!"#I#swg91TGu<*N@ =QE|6gH8t b1mڽ_]/lA-Ǚb8ʁo1ܚh3Iy6r_UJ6E7K] :kM$qCRy?:/n a x٩^hڏއ>)]vMvI1e[ $TC@w󅹤Xvaֹ+ 087 .c7 9zמXO]mذBsQڳiy)vrO JoO#OTe iYJ̇=֕J|eE%{K%!)D(ZaV=?92aҨMDI'{:ۚ8iqUr.Qgܟy_[1#7 yܴó7Cy9/jO韃xG) /ԭLby*@RC%I( (@-7} R@MvBR)](FY*Ps ›s6FN+65&Cy;_U  vPsL YM9 8_F#7M]+4( RE07X[5;2Gtq=C'uܩ;v!4sy淁mDto?yh<<~MY6~5gFGAA%iD|NHߺ _ Vk=kqlŸG ElgHyly]+y\,[7UxK0*( 5}Z ^Q~Tje#mIUzy;_(ή9yl9[0  ZGOv^7C3ܡ\N&dv>R<]xSgįV;HΉ# $_%'77Hd7*xvY8\S{.l9^Ų29[J $*aXSwVq(;ȆN~.!L̄3aЛM]KHݔ0dpz5%'uJp=gI/{lE(ιb!{( @4CW(hx-.gvP`+ʀ VG߻qd߶U6<+L4؃c5"L|'=1AjSxXpL. "K!]a$#5a칎w#`5q&ZRTzO&HwsW)j&TGL.fh.קf  O+3-kzU5ow=M9 x"B ݾycc13JOS sU/qefӿ34j\H jlඬ8#ZqYDA+i.-t#\fa6Q5B(f{&{VBHi!Û<4"E  d+ !! 8= muparserx.lib ¤+ qiskit-aer-0.4.1/src/third-party/win64/lib/openblas.7z000066400000000000000000226520111362723322000224360ustar00rootroot000000000000007z'JSKb%6O*]ruMsC“>v;S-i-ojg<@dLKs. c㶗!W ҈)ܝ]hne-sh-j&:5!i>Nėh V2tБTt;t,x-Z)n'M/Tm~ d)ڔw3`KUn$*x\| -)"-{'>C@},;_>;"y=DPvQz2ה?\W0t]#۫vgqb2UvmҧZ1JDc,47J n t16eq0R}Z0UB[1.~']e M9^xp`wи^Gg\ ;b=Fˡ E3 찑3$2;7 q2JFFL:O7xANbKrD&j\jLzYЍ}p (ѐo :fjfY2ņ&pf >3Yt4<j]ڻi_o |4 a'>4Ϧ;2'Rv3o}ˤ1 6$*HF7]]5# smER3u .0ncE4v_I TSqˠ[y UC=6F%v=^{n3! l}$0}~{\[>RxqjU=73;^:A.n 4۸% I&_QeMO: !I eqp؝e~}J}#i7†ÒQ{%zcV ,բ{HYEܒ#8^{(I]f&7Hʻ32Dxb/V;RH^-x9YU#8rDS];TMy['"zKOUpFV/ (MQPDbWq5+YAhȹ/ӎ֕.O5x3 ggy-Lbԫz`,SF?((yݘdzs}{~u$Q]}\V!ˇN|GV|͕` /km##cvԷVl!?TV|^E2% LUgd4Z8hyZtu5!bO,ѬnT!7|Wc}o^1: 2WMtWXvKPhܔxoo3wg1w"VFՏV}-mD{/~ xy\@ aAV}3uGrUF{ \7sȱz!u1tzK<^eVD YDCǏ&SJF; J8bݾջ$vruT卡?VHVcK.F)R2g4^}r=R; 7&0#ʡC֔;zS>IM+Z?BHLW_uvMM"o_.G٧488Y#Î {4,DY~NHru=8mRۯ7 oQۏqDE^. QJNŒsѮ0t׍T'Gjy.H v)%q  %Y]3Lb ggm@G>j sWw,:ᐿe^®~#4 ]QW@>`PơfX}+H_!ӳˆO+O|;u ,h jQ3B)([ pPS֬Qn\[DUNJ订*2n>&|{U Tb/D;UBmՓO&#Kn)rG{Jx =ckR0OA^zjTq- Z`Mv)ŝW>砑TBPT rrg~4\DSU2/0%/I'\J*I>n"qٜb'.gv=pqMV?5%v%YK18X':Bt3sKyU- r_Yq?“'kΞi?_Wا$Z'%lk7EAߺ1c0yl>d$ <?B9ܳuuUj 4k6ڦP4?@WG̋EI3mVqOiD.#&o.~*\j+K%C[^ PJO!3`egmsq)21 -4EPZ;1 I|kMy6Uf͗4<0{]ͲEɗ*fUJ9|E@`RaO}"WDnz`JågBgiQPHVV<ԍ 9H< ԑE͗S)ܣf9ʨ *Z*샩̾+F[b>vhyt6}!gk蔥%~LvIKmEzH mpdżnW&@PV >>7籞/<.)S?0Մ51jV͚# $[Wа>Z[,>+ gu>WT)y,3HS l{DWommN/{b&~d16{F*`"rJ >H +_*.mȑԄ٩!sibҍqՔɬ]#Ѯk.ϵA$}!fr(17qrǣYZQ"h.8N&oGaj6^5e8̟-> bBmb_vC~ЬCzB+}f;^\yeoD 8vB2 ˤaIQr8"ѥCD[%!Qҫ?'M-3ձ8"cʔWRr!wȿ~j&34q# :Al-" (P (N:Of( z9ax#F!͏.@ j1̳Cjhbr=F3GotamYHhd(m@©4 2Uj,pTݧq#IE*C2+: +OV-Tdz؎ӉzV%5<%O! ƨ9Oɣ/k&Rj5^hbĥ@~dų9#ynX!GsAGy{I;nerM=cGHky'O w7wocL7La܍yཪLXQW)9)j+kҜ+Y+l1k#tCN""tԋA|TQ .*{ÍZ "K$fTJ'63tXɟG9hYB@C.dzhVX%Aqr743a Ty M5 FQmdD Pa59QoS;ĎOo8OB /)TVh{u7|㼼?F栰Xk3>5fӮ !QP]]A9ħ.-?ojzWY:2YD紆="C;K.MR+U[ 8ֽAzLGiF(F]fh odG%cS9uy9/0zry\Z#*u0`[HvJmsxIO\|LXR)IEobh3x}r,gufa Cḳg~>]Pɜ];'1w5vgQB-WLL tSeQ}HO2i(z8dlw8L1lG Jp%kվ-W W| ^\=G#"6*u<%'%? $hLiz5ɽasD_AUb7So"{b =z8M,9}`!Ռ#zx>wӟ *W|k#g2$J>dxC/qan'@@ $&&D+щps બ$A@?EEm>f^&;n g9`, + j.=/64]FrʘR)FTl-/m3ێlYU,sSʐԷ:o[B$Gto%݌l7Y: \'Z Z5X5Ј9K3T̸L^Z 9(m99R_2nFW}]N䯑BRu\Xt]tԏfӓPM\S:9Yeܴ"m ם u yK~,ˍ3 .? ڏ f+c5 ddў@ڵ (Tb^"'AW_V+-XVڸc%Ӿs 3M\^OA"gt!K !GÜs,4^SG0|6Ee<0m$XE#DzZb!Yz% RBCtOF׸}R+h_m?,~QzNO",o˻(/@c2z|=1j68/ -B+m-C1 y()Դ?Țhk'E%i|lXr<K)/4\!;WX 4i p3xԿ,պ5h^'7em-İk_IILSs-A;ͽ9;O12vԖޔ UbA4Y2E }s\+@ 6@}C!fJ2N؄JH V_v_r_m_0Ü]e,8JANk,Ѣȿq,W1GWz~ /{>N|I5f\i_<\bw+xÿqz'Cw0yg-(%}l> KcsM6e-4hZHMoXcY`%|mh+= `9X˙}uFZK3B=0K',Amx$< 5{MDMO#Lr5bZAzFj+nuTkӠJ U;l47~ٟ_De@^l ua8rX1׃< !(OjiıY-5ZL?p}r2*: jGǻCGRnj'fB2 $ tAJU1l"h݉(KjGQF׵;9pU= Lo*.PAQ5oܢdXckE9r>&tjS2S a3I#K6==emcAb7:|ÃK ղ=T<)m4 +f5 |y8nP{aW#,XI2ZQO%!Yt{̔˵p3Yn`Ťta`95qVa48;X}\ Ys2-TY.G |(CCi=:WDK9{[v*n &bFH+S_d/})àS^N۪ ըZ2ʙ5G]J267YHߏ^K}K.w)q%!o܊xbkJTQjkC_o~K榬ᓭ^x GϪ4*H<ͬU4 $IMq08cXgsӲqGWT2FP}1W5&#"XNQE$Rk?&\;Kd_b\TS?koD{o(\ {u?=GuY7ͫ4-E2h >7p'΢s$`5VؖǐKW7m@ш&CZrm|Ŝ2wl﷫ȩYGnl[5jkm0^cNâW&]p\i&{ ))bAEӂY\&¦%{V&N/%`3pDCS2v{}Ռ{g^;etF0k&R|ʟx+oB($FORO q>4(TGqHf"਍"/C4|WP?+hmm {7NUY-%rEPГ+V+ LcE -ziq`hw@}o-[d1;elMXү^'Zqr{Փ;=ݺT #5xOsv? j,&iӡ[su0KxJCRz>J1{?PPfy=dʼ:V<2QguuS [{^D>J>jdjD M`uy_U8ZS^| +|DUC$eUK~C>1 g*/H4tX c8hNHGMɄ o..M(8髝40b^-sΨ/(HCi㋿`0pM8A= ;l.[8JKLD WtdC~G!Qf*9-ޣ׌C#&=\@tR<'z7F#fA-xfGcHmUՑq#'bo8mPYR}|soqWQ5 $$6 5 8Zr( n9iaZEh7?ni#ii0k3YU0^"}~Ũ T[ 6b+G9 L̚q0B~+AA4s2Qy =U7r'4oY7~옔o;@x.3ڔ>"uCu4X |_*0ɞvHE 6--igbn`2;~ه@8kLPVx}D(q1f<\:T!_Pӻr3toQmlyي m8Yax¿@+"wVb݉ PpDBy[ 2-?.i4..zb 0ImhnNtJ{s#5;`s8XnD $н+!GQv_CY+܇rݞ&|v嫟?',Mu>å&x3%EP/tA>jc )7ЪCFQ-`乶N͗IQ,YV-!1;}.g )u N*iqԥ{3~)qg!_RH\*ڔl3s!1JTGz q$HlnS-uZx ؠ{Qq9gmX?:߶B,?11Zizg pRgERfFM2-.3 so%>Duxu LٱI&12;3})!bs0soaOy++@d9;Pyt=X)8$=*8Uc" 7 pRE}޹d ,X~?PQ4T-v1lε16/`^i>@p\g0L4#mw6 ƝN|\nB[hRm)} XHf099$@v_3YNV1?38sSџ69,gߑja[ 6G >=raOa܏眃W圯JpmG? GS݄Mܒf.I֯Q8~ۺn'I]Bl&HcD_ 3toEᄆV&dBwQe|s@yˣLcYe9 RN حq/vyC6 K}fN$]Ht)RJُcm h}U*n?8tH{Xl7@ I[HTITKk+$©an]X}Ґ8Xe.ƒhP,[6z0̼Re3 BS|a(nu29> )mFK!?r0@A^dx}|.{K(\2R>t0#^}!͞gLCM%ҔUp0h>|m)[G F(p /b EcTf4h4>xScL e#ֈXIi<W=!0m1>R w/] lrvR(VpV]aͦڛW|<ɿ p[(L#Rf@89"(c{ҭ@酛o"x{o/Fv}kn%.q_0?Zv d*~u4KaSkp*(BmE/*|n>]NVHF@RN5o"0Tra#v*`Ooʛ_1~B:[FV~x>Y$`F*L.ir u%ċu;z t*>\/slHw2 zi ʲYv<>|ߝyk^&9!zvpвݱY 䋰Tu eYJ>1(a- FX5FJΠrèc3.Y3GFf S½zwO|  }i2Ew>w^6H1x7B!pab(ŸuY>M_E?LX;T9tX38`Bc1=-\.$pgg|&5ڦW\lNJ=1Rn/Aύk.Raߙ 1iM`QC;(K'}" OQYYjjdFd$I;EIWh]4'֏iמs UY89\t%?̀9/${ۘ VNNL>_'^m"jNW:URZrM0\i.=aqok1OS&oa_2HGg`V S3; în6+>ڑmӪBkRHҷ ⬤O* 'Ƕ>=01Dr: U2s٦x59r=\ŭ[nE8 q߾xˢ ssyyn*<, uv~ira=:!)B| UO] (;xpjJs'AA0ԁfYؘ>B9KA¯QxZ''S2V`mKk<3yצBg%02NP_IU#]  8p]LA^fOْ57(5$ >o:9gEIV_6 -!/JdD.Qq _rLu&E 69~6h]޽; k̇ ^̀n%r:4 E0~T$V.1hZ~Uͅ1Ha_L "@"i^ Fsn|8ڐrф[2xۑaO/ 5DԎke7je* id5R#򒠎M,t_,?=dBJ`?uԻtceW rfZ:+\1ljտwNBL 8LeײWTڑ n^6ZIo৛36_sVVteR1/ۮE?rWoOZC u`4-ހyh(|6"&@_Q&wXsmf*PT lidpC~9KCX`,{``&|*RSϘ6 5;7/AUnEv}#-/ž/_TtRAׂdѮ_Eo#3N<2UQUؾJi'z/$hMu&lV:*˙=ytES̤j{*^ˆ¥Vh6#H=WyLChf R$oG} Z`[+*Ǐ _q{Gh6>ApfjzC'(32Wyr0nYt/{uQCKUzT8;0ZOUx Q.0>Z1>/q%㾟g*5 iώ~d2y<{QfDc >sb L{ I^[0֬\rF|_Q$7 >~)7-9TDDpU`"Lng?4Zt,) Iq1-Tڤ1M7<j:n[' I` 2WJ3Uo5Kt>u J銴 $kC ?3( dƦ.{K3$x|R ?#SNCݣ/p3B!RT7`'^>OT#xUxIn+1oKs eMz:M?%jԗ{` ɨۡś:뺐Jf06@{b'lB5;֛ծj ţ=.igm'e}] bδo}ݜ%P? 7NѰFL#9 d C p7/fRˇUڨn N"d\g3kq!$=6\؏yrk>r fF"OL+Q8]:\ Q59*& seXsJrO%׼&bbiiC2fFDU~l87Gou:;W4LV>aqG?w@z縗cv / ́kUxuXf[L10Nc.~Ssm63o;(A,nD4ȶ"i$#tH7s(B*\pvrlt3 zqة;,gLGٟzB)t<@ο`U\1,F s= El`߶W :cC=up 6G?~dPmJkYwuUyIzfUåS!?Ju|'s9jٺn QxΘdMÚwNk|Aoɳ]7GTW2:2\o!\q2([hcİlVt G~ܰ([+bk}nj] #"uJnVoDT=/a\F< TjVL by00DBIm="j9uܾWߴ*y}<'' n1JIkkG/T>,G"rist]",*bm.?K/|PZJ%׮TݿFX@h0aoPF**fmD.Q_+eoĮ,OA|"SVܨQMgsȽ1UO0mMoaڢa#mc?a̓Ec $n* Č{i%*< +k!H dy-51ngrDts`U(vQs?^d K's{]b>:sH!ʟE|`##}O+ zRnuoMdϫdrN/vǷܧ=) L]wQ//dFg+A=dMX^Vlt$w;^k=,r<,MLbD{VLX}2/SنWYL 'rjdP_^]5 -0.ANdzmmŦNڅZp緊WP +d"/a.U)ΚZuV?X%6=]RyTsyb$ tWےOT#)Oa4Y\.8FtA !4ƒp@v,U`N-l~(-<:hgv:"YK\>-< K1>uX@ce\ xZه)Qf/ `(a3bʰ K!0Gl&/ H!t͕@k$MGBiIˀy݅a1;϶;R ]ziܚf,e QXTʹm`Ck!5!=eV?3;#Ƣ~؀;UPM,jgfbQQ!ԠȞ{} uozThb%]7ZF͙L41)QPLITj6w'Rp pt gp)vL.>^B:>x_beXeQrD9id FdOB_-xht+ TѰ`Uv>&ʠޒ;lpJ&qWF+Kp1TM`K+wo8HI0j6~Z)nJH J\odq31ʱr4@GQQ1ۂ,"]82WR튱9]}Y^n.=H-]Iw0yT,Jf¤ zz;}QfBGOBe ".Ap&Tx4X܏EjDg5NBÑCpO8$&{+u^n޼slرXD:,Ur\%ma3*./sE|’ņ>g|^Bbވ?EIdd5,ep#tKBU<|L*YcnLNba2[GPuP^x ,۸ oәwas, w`k0h[當KUh.لEh>"ܱCߟU,v/m6*E,~%KRO>:}6^+lאK97D{3@|+T2CHYu<5ou]@z|g%)zDjl*$iG*!pYV-i*@=EUخS\ɩ-^h4Bbs>nAf18KWՇ 0hxWgiCY -?39M_1+_Bm|kp"ɸEdpݰ"bVOtAj$^7/B;e[u@H!9C)ցT^Z':4?t|!i5f !xY<c|>AͲJwCN* *,hwl˨2L"„S;wTm J{gҳM\Ҝ~GLxPN|*t-+9$7&ZY|2tt_mĮ濡9suyQ,HajJ8>7ʃ) 'Psfg8118߆&wV}_ފ?67kKpU͇TE%z`p{2hnSHoK쀰>Y)  ʟrT:2ML(ѯns\)9NJ]ͽNe{VQ5q,93~BA<|mU>QVn*-Po}Bu&ոIJ u:iJhMMOb?z{|sVcKBP 8ao2`}.m=lbFfA(AD vAKѹ}\N(GP|lnfaa9,`2H0f/D FtC)~Pij) E#ʢ|%TE1L)\j/3=<RN4I.Gs{|3䲈1QOKƩEtggXb$+~jn(34OfvM2|:AK !De%- \{ ĬmX->:BF4(颙\c'K5CqU식2+ˇ$,y:hr1:l6ZTϘ(\=87F uxb&.{R3+(C+Q~8ٶ4 bFσ0)nڭM p2:T;|0EZ9'@TMN]IJK07'EwRPEsai-U[5hôAj͘qq`=^2`xYdkR4Onu nQ]Sި§cp!%6νT0It_ɟ.C$S4 :i?a-A=jhOiZl4)W A,@hkV3{Wڸw*."$3%gn1S#m5(=<ĻlE#,۞3Y;Sh /'afw$ss+;-v9'M6N62= "H"x+"#>;ق'h3LZdya@Irz5-դGDf>V$ܥq[(˓EiU`}˺`U1zri w~zG7>pvG硁9t%(Y8`^]f6EHdDdZK)ֺǰ8 @-[}Tu0Hm׭H\WtЀ5w]ݰzD`\}+,Gc%L/ =/u|s0Ƒ봋񱕮툺7i("3GCzvr@6༆^xo#(HﶨA]1Iz`yto235{ug#}N&.Q<j1Oݬ7Txُzk5Br{}IoLKdXqƌC EGBM,gJm>;~pd w|u?Rq*f> }eTߡdFvg:uc@tV?)d`1ҭ?|7NL>#D]4 4F4?|-C554вQk4RF1kw":yZ2h j'kL4sF/Hj%J[#C wds-YZÞ?+2ўI @SLjiJG*)LeۭvR@e!x  -Y(;ʂJ+ߔhTycRhfor_,qNV]6k`SPgp]0/=NE< ":(GQ:S[Y)q0~M֝ f e٤ԝq>2ggkgIY1=NPrc˞9tYG,GEލ(6kcn!A A57M"*rĎiES|UH@t0V \GEd'oQp'|ֿ+Y)Jt<Ǯi1?iһhVʉ^-6PlI';k,pȱ`DzrZ|1(DK})qӥāe*~:m B N+d&m Όg(0'5eT %NB!HC!]X{,Α]JUe3wi-[76F33W ?"5CCIeV!#P Nd 4ñdytf]IWc F1;vtuwCVMe:TƂT sC- =4O⣣1q2LH5n]Й/fhR$65&(#=El)^Ek3SSM™\ix.9m}oMYuY.}'bFmp+d}y~_M  +Zp>AQMLҔ:`*߃J F„ݢh S~;MJiYgFsS96ex4f~Z΢-;Lˢa۠ QP%d LghB1Ef=2$5X?ڌF^+jA\deuT Xg4PnzJҨAeR$lZ? 0ȒH#m*,;PMMy"Q Fzs'6#>?[{rfc$ڵd$(zKI 48f'^oU'u+X9iv4)3M̌VXŠ1l _WPD\ٵ7Ǎ ' bm&U  zCi2dLy{v+rBZY8ů/0hc+?" %@*(%-jd@ 6{Y%LnmgrZN뀯1An "K|OG9g$)Ψ&jJ/< )6^04ō.$3HonYLfuyq nΆb2'-Wv}.oɵ],_-%IˌY "KRD=gSWB:ԵASuJPX|׷{zV1C>܌ͩɼ2Cf y wny<9T+` ?YjI\~' ;Dti}DX}#ɼfq)hªI!= f0i(SaC\ X E[gH9T,n֤+( 3{'2_%˵E|qlXNTnEW_s$(c,@yd[s2OxK<58YOUڔHQl yװSqֿ Kth5X5FCx(fam1NzcsBtmLRHm _quތO-@{Fo| ){m|P`ϗyP^ ԦJ;qOC"I{AUv6 J- bSG$EQ2k,m\a -Hl-sh]Ƴf عМ*B*NJR9D%l|IgPRɩC3U/֣>Fm37\2;#p>9Qh2_ծωn#ȥ@Zcu\hIʛكөjbϖcŞ+oU 2]L& N^p_Նq[@ g.[0Gc?d|h5ocH+y5[gZbs3]kԊڻUWk!~(᛿]SO7hpfS1=b~3+n7tuYjhRԳ7~>d!s(,_Ά^$)o)oA :V]鰢O>Z+1!02:f_5 AfIN ß)ŀQAadǦ!BWy4J%WRl]y\xZsjpsUw]EW=ML?Tj[b{qc)6t}]y V _YYg2}/Y# BjYjSܙ l|Iu%2~I>=c7+"~bPKT}/=JqJ'Z Fr~Ofߍ=i\" ?a  o#)hGŹNQXlAߐ]$~e:̗c#CcK!#[6yx0C`c?FJP x"}- \,s]>4!m08kS$xH)Fnq9$+6 .R +&j:i)d|q%YڴI%bCٜ""1opH,w|z#2$FCش|AR VӺ(0XWn,C9w_uү&`;53q̸LtSgQ?kd2M"z$x,V ]ѷV#'a~[J *  %1C4ۋ#Ny 5֞o?>JR5e )b:CB<6zRjn`#E_Ƥa`ɗB7^I/h!5l,jf @e!+m ]ofJlDq^ҧvu */$BӖ:³_r$վTiPD{؎HvR3KxZD)R.Pvд:>vm(=#'38nR+S٭~h@|`õkƙP@eBh ꀢwްIAg_L&I,KZJ F dNyMt72)ʢdm=ԝ2|{sԶ*yÖO"=Kagt 5N 'L2 XCIr3c.Eo3(+28b&X<-_i1F m ]Z#mqD|z@ U^nZYm?1Ą+CpZܝ-Wr&R '͊\J3s>m֨= ԤJ@s r;^R-J<-VĮHg 4?hDtWAVz` g)q[.$g@T. Fd{VLg[l.pA $3;K}&u9^r[Arܲ`JH4OБt/@"yT].,+КkBzu~_N଩ЮA3"-hb'gnEeC E|0D"}Ox6}wm'*W1:ڲ#)G$e ē|Y\H(?4i@ XP.kE, I36[RKr'Gt7*ۦ1nkSOКФhXhYҭк4\yu/F8F,7*rcew葶@cz3 c/)]ة}r# VԔ^^ eT f}x=+p(%FGWڜFcVW){/k&}uYKr\~l|i_]B^|tuJyP1TV:t{ CxÍT(8y;)XM4nOy0n]tfC~s/??5?JPKSZ<̪[ e IKB#.mĊX"1'%'r|<aNJ+%XT^L@TF5(&ӫ"Mvzgb9a @x*ěn_D*;hDq yWMYr˩S-^3_g 䂲&CR3#hc?'1xG\*% _x3M~L*^X.p-*n'TBc1b[&EUoBpX.=pn7S͈q6D)E{b]ܦKfOc_Dto4~Pj5a$+#1vDH#DpQRޓrAfeceST؍"\9;T\>qU<3 S(xεNbyjSbdqQڸ%ELpƁ(-5́pg{:W+ODI/ PVCIq5Ru*RY-S°S)~a!Bcc GWNB&,Sdes!ufNҹ|Dw:. u23X1w\ jP.p@BMڕ)E4vZq!͞L'S`2/YYXSo`[{^.FQ %N\ݶ\rdj!$4ǼR9\(KZip'3C LGKۆ},*~C̳R![؁SŒ`9BXE\IN,% ˓[im( χ'S{h8" m7é|?\Og6O! ?7)a$eA^CFiR%(16*ƨ)~&j`K5" uo{5^7;YmmFԂE QA`})Cj+¶vBMEz[= _*7<`>GYE!*ޅ`w[pղ}"s;c3`_ S|̢۟ C'Ra)V h4/qzqpPtnԶb3^4v R-TS0x@+S1Eܒ zgw1GX ϲԔkv>)27T~ a7ZP]Ez0 CUʫLV)8@ɱpΒOwgiU ̞R-Xia8˙o j2{QLl)D.u/*v!ԨYگ8l4MG<'fӟJ/+ yXoQ  .؂Qw%j.]u!\B6?&6AtE\A?i "X͝{[2҆= I79U}32qpL2{Vh<;NK}mm<]܅)i@AG 8h/zw FH~e_]7Q,L UCitf~B5W x属 6d:).dVK]p.]"8m=d'}36SHVt!h3K"r3N*# 1H}u16(l~ blkCJ2/(?I#9qM3r%)G`sXkz|D_M ) YTkMR7ZMmڛ "U4@Z?֨\1B{[HQUգ@ŢȄ郯^2 !KZ؅٪,!Z/)D9/B"ݕuJO<2$>9ӚRWDuۙ4qP@̐G\HRi[Z@bsnrZ򦣀2@'h]*{bú.&7̂`T>2:|>\O-xxQdj7t$dd =Pi׊ 3i׬ #[[ f&?@777lK6=ϥ:pNTJ+{EE^Jգt]c s*&ӓ8'3~fX;. g5TpYlo6*>3[4="H:l:$ (n{KQhЯo`_'# 0IR<΂s'+sJLq@3 .~q#<1 sX{O,Zi_#_͔߿J4)a P4s-z8eVZVSOz-"AO^38w_>B6&9 wS_` zFSv-DXo^j7Ʒ-'O p}g'NpS5P4pAiV]oxPD{bZSioxba ʖf?Ghb^gj#ehqr(7*S9z2'|O*Ndofq!}ԩ֬!0T(XOb3\ e dŔD1r77?UMNJn^Ir;121Nd򆈸r@;NN7ݢ[cm>~J /H2n.0G&)ڢfQ_田?5fCRpzq]cdS!-"qz 908` 5y>210q5ͬ 9:zj%)P+͍M_8\cU[h~L ^'w"bE6~OXȋ>Q|x{UJ6g߇jޏF#? lBL໋+3źg&!5GDaǭ]*Y?tj^W"ti>Q*ǪnI֖̭@!5 G\߲^b:L!&a%h.qB_<}1i\xn0ÉW8Lp_*h0EspR,L"|}6*N;gɌ$XﶔhW"e(nhdYν,l"Yw`Jц!y{z%LVY,QL D[FkVkN1ygyu)!I*.2pVA@svЦ==(}Gpr6S=C:UR][[i.gXQ* `|Ji[ڗi%4`w=X(j?(np\l3svwB! 2zчsC:)^7b:4˶37|g5!VIկ@# "⊔^VĿOcxD|8y[WQ3؃H6&.y28Go&M* pH.ziΦ2D 쿲S}ŕinE*^c ؊W_~L2v%CmPٺ?^$]TlN! KJX!!˥{NSHj-Լ$Ȇ^40W:y.? fkbs:T껆9.#F ^ZS~ɽ,iW*YS|34g0zʪ$W̛y{U276,ySXKm\Eӈ\L7t?yjrܲZf+:Ğl!sýi7E#ʑܭ7ybz$羑!m^F$i!yQrx̆'DE+|نk' 0WK6cQr +.1jB 9άL >z]1ZqkX:ddFjlM Ba77 :=F $'/_.bAPpj!n6n)SsTOz_֥UoX:nڰ3$2Y8`(`qU5".|vu[פ`#@[(`bTs qߔMm $dBU>SVE [NרqwʃFzPj L?6>YWk [JT6x}d;uq ݱ G&t"iQV a-{Mo@8EuU4&DY0<8\z2x۱p(>-֊Z &\Mb)H7w79~{ApbHīܯ'MboMwbS &]IA۲ M}u=gVA\KFr"9H؂ѕE)m64h]G [_HN75o&\r9%o6S͆"[AېMl ͚FV}+.-KNt #>\_Ҏ_~U?-b3p%gA+)̽Mti(sHvF2v,?tMvll.dRn5 p-mY*Bdn6էB5"[|`B bB<2 g5^LL ̱FkV]BbE)^c[d-Ju:@ν"{T>!C7pA: uR7fk=i Y5ChfCȰzݨ2Bh t ,S6sY úwi _K8pd4Y%OO9Bv9 QNazwʾn&ktc=ՈM4R@aG4q)V>K^P(gОE2KU6zsS ky7+Qq6yit[c7M6u$ޒ2zU./i1qJNS W SS<07`NOv~;<9(l1+ t#4J F$R" 眸rk9bcIZu:ɋV {@|q'^З͘%@e)RsL(T48b.uʿ٣4v4$D{t$e= $J\ifԣsnY}1g8_Mz4veюc!Ty֚19q#0zÖmnnSڻzVƗh4Yi$M"fm1*֦·iOĄύp*k dÉJ!%},90RSQ@USeD&beo: ,4Y"lٵ9^u/k{7`z+6D0RNOt͜cr6a٢3&H"5K(*^9`xTm)ixiشi`avΦ1aI3!_2/w47Bo\9Z!<U$-Ok.B <8SeJMYVeƷ띭&ҥyJ pޫC^wo+ū}/p1nɖU}uE^hLrc "+DA_~Э$+ZxW^$^z]fQ:MզEA&צ%Gs2%J͊"v "IҷDm&֎͸3;R!.Ap>_b#gd!`9>#?aX_bCbz2rfِ:+^ԙ-@/Ҭ{V3^#ƴ;9t,ـ2FG]:g"٤3~JVW deh. xvhmX,Jidtmgp`؏mt*7֭ty#_蹲+E|riRJT/H'?a;]9A5(\-+L; 0%wRԘB"VCVg"wY!qaLPDRFnvONoa;ʛ-ZHj (WF-ޘ;8&R \=kp Oo5~TzH2̽,/9ZN$DC<[82ʫf @ 4K/?_ S:JFRwGZltt ~ > tP*tc!PPKy 08fm=GJpp =aH\D$B҃מrc:+j C1Ihk-+p7,XZ6SaA)D&?ƹUуr=b?OW=?fVX\T2&UP !N@{*%h26Gxǹp@k FsEo4ptի4ۜs>=u(/lѶk:BwWyWҌ&hyJǾGpC_Ҫ&QD"+gdI(ؗi|MYAÁܢE}%6pXӞ`@ FaꢌkIBrKH\MU.]J*u F[=ܙ%)]"{,r%ƜG‰DNjb|"aru C"%9>5 W G)6ad/!x{ex.JyzĕH>'ۺ,>^sfC6lGH0^ #mz?;ஆwƖ;2a jo͸C/it< |mR;Gi@0 Sb6oemM@Ƅx'_sv&àyakX)ݓHxGĩ$)a_Y6AIsП!H#?.T2"vrX}m+sPKVyS [뭊}R'ZDoC  dR>bѧnPM]/gޣTP;oÄ8JʤΚ\J})7e %O;-N2TX:%;<(*YU~RL%L&BiY=&j&Nb_g3!OɆ5Se3x^{RzC޽֡LZX°.pۡa#9nix8,݌pGÓAX g˹/n).GJ'2%媎dNnLwtK[oO*@; XnSb$Oӝv;S-Sp\&"x~%W'|fvOPoT5F<;2{5wӯlAowu .Z6P.E*#m.ҦE'v5ehIYC/,Nvlr4c4 \}Dfj)vI\MJ#Y6]Sݔ80 pyǑp~ȁN(swlnЩxA[9J6Wr&[ 0,iMwR`nEbȂlX&m&l&[LVaH< d Q=y۪zԹC;/GyyMaD_#9p? +*!=f%3IqB F78Q:qq&<ĔR0dnf츕=H!x>RDM,f/'(&=d.܈`#2M")m$#`\[84AqwDG00ژ+ 14jxpIJ("-٬xD#f.RFGNq~L&GaèЀH!5K +L;^L#.[,@*%6%42bfsB܉O`o]o!T9Y)␴0Ou,aeFJw(JDo2l`eOU 5]29]/Y'$.;)󏽻mQ}̟0*]Iv.1puVLLp')j皹#&U*Z8ǀ3*rj:]y-IN)֨p̓ŅĘH/bۣ"Pv8Hes{'O88GZ2@O9qhڄx6o'Y1Y. Wu 9Ј>Вq8ZoJqޡQ;*<#[bh uI ڼc^ìb* Ӕ?)XBAKo+}!GZn Zcp*&P+6@hS7L YZ9})Rk]ֆ@]-З 25 ǐ]DCyu`=~ T >_ ŶgdlgՂFay]R. #" YfLf!6䞤sƯa2ڋ[)5)*%х6_]9[!xNd: I}g!6o$Dg؉e"<=ESccl½Soή1E_|1$2_u2dqI:^jңKuJ!vv%sYud@Խ>ln"qMT<yxtc)Կ[ҫ ºĩK+R#d-K-P5CH3t_csأoYVlwVJIɪpm{8FMgKqsPr*) '.qHr8@=uY \≬jO/qB3_i4q"d)hQaז^j흜WB')V9 k3]\G!{#wOˮ/-}moЍ21b)-j@&:B*g1ȹl6oSIYy-Ay\~xwM•2ʆ{v) 7B-k4C$SI ɂ` uw߻p4SXmXФڛ9𪸯aX\}Fty");5֣Gw`Y dӤc4OE#F’l!DCScPt{ah0oqwK$(J7BuA@h1ҕ9GUn-'3|=I#A BDs#~ج(b"ش0oA}_*+O .O.|kkqO^z]+ 0˯5[y^Ճ:m[%; ז{=jF;t:|y3n( Q/x_^RE7ARs"TGt }(4^@ŏ5ФiB=y NJ(L#wn(|ӱx!=іHάXaIؒIKz_L0Pϝp[g:'_x Å2#p"$~lL$ ^S7~cu|qbkiCG!QVRY ɑ$D= d$Y3<|V8w I菿W]b>m,ެȄ#!  x V:, Vmu"@@B[7.^ \{" ltƵϵt,:ڎuq-_І/?j2sOO1ms.|:5<*rF(MQvًh{:ݦsZTU; GT:sHEHXv{gϲroDЁzaPQ( G_>il~fey P{7:+4aՅWHiTܮ6w'9XF]XٓVbOȑr:Mˤ_Hw/u'Zf@x0{|K;qyÂӋAw5oT ay hT:EYdb hsdHJċvWaN`}{ZN#mQaE_Kk~BuF96cy85Oی,uE mO3ga y{Agr1RGC].Q}y WieVXEվ:ߝ43GSCTS>e ܛG1u~L1"ue E9Clv6r~]ػk ;Hn#8A#>eH^POS9ٚ^Ҏ'TgJ'C2 )dx\8[kRowd#$r`A2^V3T=Qm:>޿'R=X+Ź>̴^M {e4UHĩ2\8L~u#v)4C8gRo쳋 yx9m@U ׎7+YrY*lpJs112ٵ5*.IW mxWi Aʑh`)y~!O)$d=q/E)lN,'&EUOpY㠾qJC*FxNec~A50A.cSoԟ&p+Z*&%t !>1$(y<ZI~l*TaX{l3qS–LX0aYг o5),r#tNe@|){ DΩS-y4A7 8٤i'i H[oDO/ĭ_N"(PhBĢ^m1ݷIN[.",З[Z`!HeĻi=L1%!?Q2#pDc,sLjE`cxFB| ?Ƨl=C"#f#^=Χ$==SJH+qēkG170';׌pL-i@ e2ufHIhHݩW%$JeaH; 5sP5; M™8򡲚9 RߪR)iB%.Hx:ątS__ZW (3`[4nF3Wv]EbD37}:*frE O9A${c М^"o4K1XjVslɴvT(0cm^snH}v,D45|C,:%V"^|UYk$vLqrV9;b/9u p/['X& @ohBSopr[FxqOG mIj^Ϻgeq%> _Tb)b_*w9# F{6oEwO; J>F KpfdՔ: M:Լ+}dPxWbfwc$kvn g}`cJʪ2殺*RcM/ xBY=:8,RO?P\(z;5*d_E&٢;{|C>.L܆}1~|=:SyHdI;Ӏ· vr4ÊMX%+Y 6[d: #`Nt-5z([gR=dIbB$뇛{X (4ZB5cso| "ݿŵn apa:3:I 4һJm{D jZqLD}4KؕIA2;mᤉdwb+>ߝ)4GnKZϝV^7XV7 >yH\.xU{rUB0_+㊸w^( ';p*WnmGVyZhxWE7~s. `92g˓r4B|i?ٹLJoj+ժ4x*yf n50c]c /X/H&:e?E~ " Z8[%| -.>et—Wzi ݀"K5뼱GBZnB2iG,H OW+ޮ0 ~;Vy~)isbi B=FA0SHTiUxCԯ|lܻ7/VrK8y*/,˅Qsd7Klp'2R4dF籩& a&hJB=kDz쇙-:X:n Վ6VP,-rtV-O=럛$/4qͥ!X]sfhd$JV_ [wƑ}o~Nlw=3|⁓xCOߟ4ƛVS٤8J֡Wƭ/tgۆO|O)Jp奜qĕUbI"zq;(K nTmﮜYʲi)rQ.8ms$H3Rm M#!Ö\N4iJ`rZ>)m`ړ鞛&B6ox럹 ALGtLj._lceT`$lw:x|]`x( 3\oǛx$_iY Bڛ6>:Դ܌K6bX:C!Zc˜yR7&fү *|kQXYua !sv6~)Xac"^𤙑gGpXp Yk`]/p01USڂ]onכ3hga'E&_=bcdo[nFDbLUD;f%P540aթK̴ F#@x}EEX8Py+o'+zZB֗) Rrc.w5[EϘn-=c 뢑Q Ȥ̀V;^t_C0)BUn8hu͗ \N)٩܇O#폔Yۋ룞jwT!fƒs*8ّued خ 8qiy3qY`^L̔zHش7/Ѩ8OTrY &΍Poi _=+>`|A HadE^k g͌11}pHGi%E#;[қ5Z=)X7*|NHe>; (`xZ s7S29L41R&&X>0f 6?J0$ QƨP֐Nr8|b`BL̈N(v9+ΥDKˆSqrӔI\%bz~Tk%sb/9 r0FeFVv{K0+)N%# ߽%C`.Xc-$klԁnZO cn ^t̠/% MVo]m=t|֍TյjhsG"r񁱕H}fH?ZwmHOM< AGeq޵(\7kX ZY 'bHv   pޗ<3wIWUB;]Aq^N6WaRo_޻ A '7Q[Ec/U%(>T_s"p`WJĞPlWnR-NE2-~6 ~gzy( {$.Pz @*?`b0^ 2ؤMQ2}W3ަZ 3 oTC\bׅ rq}^PSqg4wb^sƝaz|z5h}ڮAA~#s{;Yu Iuʸc@>?6PA[:}p|x^1FuI$|.TA)b'ieRk*;jQ+؉ac:^ SM@y!HD۲CZۧ} ]x'tz', PdC.1d#Ӑζߒ*K(~(=[D.`1mk|3X#DZmsy_$yW-aKSJۇ#a1ܗ²Tb+ze6ݎ -C1Mm_U<= S{|J+bqE99/e&ܭnlm"R [s> e<g|pvaw{Qp@y”m?Ev?˯'{x9T~>s^X&8K3 G;  5M=z3R2OHk4h\=vL4awAq cA%4p LCxmh֖e95O a~L@1LXAE v.#nJ e΂#R%,|vE `UF&S7(d-2gPv i8e!eP INS|<ūmu3ZZ-Ϸ؎1~6`xmDOtT! dl.PX?Xnt5s Lۈg7F̷rB3j7әر%SO8+*FUd;wa/-6M&h?C\r9ha ܭU>P(˾zb,R[C9xk#>Y#e*N5]\G\>ִE| nM x$|vS(W~r{>] MNU@y҂\suځaL%0}'>/ZSBj"V@!5xp8eaW ]n[BDAI6k. b5J}lhIx j&)-"5MRcO4c,/Ѹ:A΍~ zRch vO+}1&͢6U>Kd&/#Au Gb5?TUn!0E-'J0&ꅝ;NRnmrw]3wnk֪kY0pBPY/u38A*ߗ,)D.,rh)yV"X<[Ld:'xAގ.Ellpk?돱yQGsX1GZ0 5yD YߧF9oX|kPNoQYmxCqx}WOX @OYw=Tus~㼶IJw__GO WtPIgU͞-YW6 2}҇r BN 5k}hw [==Nƶ!A$H6 qde(!8FHWIpG- p4~!}[Su^~.l CT7xwYG_f84}MfWCʭc#L@%vX;ŔCYMN֙j)޽{~羄e,4W&6عi\pJy aPbj(D~|medOaNoݣMgGle-saQӫ }.{WCGx」 Dq:6gmj,D6-?F"oNZa߸[s<' ޳q !Bbw;Qd^/n4lLb.6HC8 eB_j:4w=qI+e[c2{]ðBGԁ\5i,n#`^jf&n)tNL7Q1A('{ Ys) Sԋuܵx[a@{ mO01%8mkgK&# *(^dkZhpl\tI+b%0l hG"7&3aKr5tB:ncIe~dNùւOcLR04~j{Ʌ4{q riz`ÊK%T׃h+nt΁=GF*:vtM UKs~·;,5CJ; Qg?mbm.*M3CÙѐZ0v f/k|4壊Ux؊wG3p^0 [n3*P(W YzGcȽ uDQLmp,T.aMswx=?| ^ʊIKY$АKTN˄~U tKLDNl:5DnT7.ެi_ZA2<䕕mV=WM8Z05tW1ɆYq 9/| Pb 7 gY0d>B?e}2+!Ѕpԭ }nJxAaڛk ʃǟAwHdT7r~ 4рguC(1 sEJ`˭MV9jHR1I| fī.v V;/ijvɔIsI:$4'X"0 Y&aь=65N:'kհ=c$vÀѸ&Ѝ Iq ,r'*I+ Hʐ|#u)-hP<% }sĂP: T K~ݴϩ:*(6;dC1 sav>ng0 f%ܩ|Z?zEJ3B)jM`5x$@-d!5*kJL hHv/!+bCLzD{4vKXi9'oiZ5픴zҟ)jp$0LJ}D#F'@So3tܭX1DkT/G,#I?)kh檮Qo4d{fPa C(|D%J@|FJw} C~ͻ!}v=F|SKƌǐ,A^ tQ t8gl(;@ N,/]>qRe϶o߮9E:?N=~sa:"1̇na$&ܣVlJ$}Afh/{9Kr. g1~q0vd-)ȏb94 A{ z 4\#u(m BONZ\9=@L@rpr:\ ;u'fGl :Mos`b\> $ڌ4"%{)Co]ⶔH|{6N¢YxW~:@Y~=4|Q}'Z|@|@D`eRiߵXF9L6/mBߨ`Vآg?JvBqrADa$=Gu_S\1L)R0ht ?%6_eO''a뢼qzbe !)+,'Sue*5v[QN2jm2R+ |Їjhv}ҞL6K 3? ~inM|h֭b[WtRTc܎y?ђm/ yxnl`vy&;iF+x)qj>3mEBR?~nFLR)Ţ܉ƙ<#.5=աLڏI33H 7vN' 2~FL5>H#cO_#K7#m?>IxR^#-[ ×Y{*Hf4|O}S8[b OO'[t)P2;SO / CoܚSt8׳,FPwxnbn }itHZ=d8b1k7*/UNAGk CŁFiToQqD|B9Ow?G|;M- qx<9n}5EܵsrC vI ̮$,pQ:)rGW s16sŐox:RElI],GY_@XB72^@Ԗ 5VB˱im¢kۮ@~0 !JakCXwbb, ,ÖrVj1NHLx0{Kq L NL>"sڜ.3*s4?OQi&:**˷4!Y.`P]e?n)?Ds*rU&e ӫ) oH4l.2z 2'X%t~V|!@S1 [3fk!*gU7I'CuC/0tJ{Ug"a q/O!p@O T0z=j8͋@gxX c'4v7hwڥ/_,i'FSjƲtLWvAk.UK*T ߄ h"'v } LtWdk"?}E66yA}ezDǖ{26 R3}o|4)xy 764)|'MPQܢn:f> y ,SSO2\#;ߝmS}QjTc$5EA?QeI=TI,We,_^0fz'CGdx2JR:^5uWSϘ^y(O<.DIuz 6 FGf(uZ;?!$C7[_`HcLwL$Cq Ou; W]*"?b$ja3po_|?UY4V[iiEIHDչۗƒ| (`FUx3[` U}nɫGЗFN'QD WA%N-V[0Nc9[yX54Ģh% Lv'ᡐr=vθ76Lkz1&2hENʤa{h U ʗJi#f9^d\!T-ڵ,p m{6:"QpO":?e6+=[;;g,49l@F=uiwu`˩p]J (oɋ+ʕEg^+F Ugg+w\²<:Ji"<2 [n׀׊L]x)\aZ~Qƕ2~+gvt2-KFϤ/gj*BEǰ<[̝ dR|h

<`W>C%ɲR[u˷&O-Y<=ӻ~!FGwEf5W~r0dՋ j*yW1 3gseŅݍƵb"LGոρfח12wOeex]d4F_R&aèB85co*eH 62>S 1.#AdEF 6V ig +XA߭cCڋMt4wT^eGri\g& pU?oH.o<@IH~q†Φ=\I7:ݬń_zXͣ`B7s4jeLʍy f`#V"-d87*xu?~F&HzLr'GK-!ۓRGP  -;UxK^EIG)"IIv˜3E<|M3d%^ę*~i*gP毾lvy/^ "z`y6gezscf+ӆ\]JӖIb9.*S|)G Bb hR@>M"(DQtߧkt?&{CiN>`v±X(Q/"e^iO*f‹(Fd_ +bm+<>iT&KmzKc.vDŃc|=J΋Aa(L{wɽ Pdy-AtoESotbOF?$ii`ŧ$FV3L8-JҨ%+֝bH vVQV3NM’Q~_E4=5v͹[\X@IQjʞXD_3c 5rTPc Dp(!5 7A!Z|U'i]cLrɂlX#%!·D!SvL'QRLTv :  3 _W++(*#5Zgk=&5[e ''YdBz~߲ʏ[.;$c]@-l^5"c;;411f_kmEhVp[y&c]o|4pE8IБA~filk͋9DeXxԪ~yG-t!5j9F8Q6$c t?]xSG1=I0)kvM(cӋ0rIrl cRM>1.-^7_[#B0OXA NǎxYv7HŸK-PΫ57pޏNq_ՎVdUݬC+5kg+0Β 7a5 Z y zv%,n-5(8n*wuS>\KO,T0TRu2ڒ4vcRQ-=(E6M`M uXoG\7 R 14kY򹭜w"P9@5Z>|k4i:5buAqK%Ir!Yo/C3L0>G~ҙqfpjS͠&~^ϑI$QrhYߜmlU[KK510ԛ5(npwP!mf_3r-3̔zkodNL O !O{/f( YR;3?EB}6tP`Pl5%}HsMPqz[qUy#Sۄo^t&6_}J!7xcU6cd س0Pz)=CxT/S;ðM*݇(v@$o3é|;Z̭;DJԷ"ƳB하R?6s4% ѷηt+lfHv+Y on)ܢ:^+\BB$u'M){R o $ų( }$Y1䯞QTr)4BIUWxX(yhEu<v#r~g΀1x2lM,ƺxy0o Km:>+_Բ9^n w6?B١=8# 18]O_q#>TS)aS:zGAALϤbIאϚځR`WAwimv> c *g#`߈=5c`Xsm%ѭa$;FDfJ*@#{Q)j ِR_~EzilOWNQ6͝{l;˧-˜fkčFԸvӾ!ݝd \%VZa GojYRƲI.5T/6; ]™5RbQUK=㏍ E:2PVV6#_k&OSIUiZI<J["oڿ&Ght[/2rM`F 0JD|=:LB2m)ߐrE`^vD=ɝa6!ÖVޫ+ȓޜ9bDJ+qbt̙n#Gze(^;i/35[ӌ[1jtCF̈́v1%VE1nKy?@] "娝XV'QqYDD~ [$ƭwK4 tzᘈ0Z/*}}J܏쨩||Lj*80bH=tD$tPG4AYzi'ck<A[z&MVR2C󸎓.J9@x1zA.#=<?uvt&N(;y|W+N/./K([.q|3Y`3$]؆@Q́& L105f$ݟԧWI:uPR$~89^lZ X÷Kv`]ok+򲸯+(lB"Y&Ƶ6bt5 U˚lrcd)fƀ#1*H6^\*jC8!u65rMX|T  ,,ᩤVIZB &#E.x8-@g 3C8:Kj R[?'yG}`Ė=FU Ep8zи w[wpM8YEr E׬sGw=&ip}ڠichY4%Kfm9n7;cҳ-{ߙU\ p3HcdG]t K"^T\3!n5EWg]4/#:6AoEv)K*dIU䓟aO9`Ȋ/B i^֧G-l (ekT3LG(LV)È9:`VgF||%~cblz{=l&׎iRZ{"ٻ۲_B3UT4XNoؿŢuMmQ;=%F'Rj]bt$vɩݕ9 z]qX {15whȑ): @ADxqm/1tzƑXa^tAfj JK[s39]16 ڹ66HQ#zR>$$SU4w}H @we\AN3Ưv殗u}-%3B{lU H olDqZ[TtIT<ǫV}7M=$1}}(m3<\{r=2̞JcՊ4~lߟWw@K2|DEZ\ը$/x;F,[+HZF%zYxLRsaz#QdؿŲgDqU]G=)H1XMCe{".keʈ&i!afhM~ֿ=}x'$NEWwq=bqGΊd} wug(?[UO^0SWZ]&Y>: q!ydx7okn+Q7Cs8m.o| 42βAcn?|bЙzمzUiu)\T% L=wz31t%Lɡ#=+¾J'5E DmS 7ǕS yXrf3OjG@y:W!6L[%FDU,c0tVlU,<1}gĊ9(W q319=AME64 !ReA-3(jʦSW麟D2#䓲\غѴ#˹ B䟬x֕Z@=w)o|a.i]jl@+w2i-/>-"?X4{PcOjv>F_E@v -`AY*gŕ&|T.k#ʹAnK )_`D8:5 Ww>$36$Kvqϰ܋[EͲ 8<-eEYZVK2ZLi.Y_VxwC!dQ3*uP#aޤ cϞ"X uN K >%\4ݞY A`OU|b-,Hϸ4iϬӁۼ|9,@/ zi% }G+Q{!yl\ZH 9wJL?Jdo3r||mDb\Q?u@ 9tqe8%6/yXǚ%NLdվH:#kG PDsbC*W1$b9(QT z~cXN֧Z4K`s'`jnwmYNC'1{&Ʉ6mMˌ@[ceur!d3YdQeHSƬ ,/p>aq 9*CF># Sĵfzl֓hC,s?mwphudۤ]$&Rn0ba[CJ恓WcG-5oI;qjL/~_4'Nj\iLB4~ҏ[gMj `:Kvq`;n]?Ir*0(=M-\,ᵺj}NOQ/yGA'汬Z$s@?p$LfcGT0Weo?EIpYO<(T\\g s'^X|zZEnvD >D?u{!M-{4' >!%3ihҠhwS& ǛР&Ļ=,Ϧ`PQ =,b;],jM"*1B/{Dz}{`BAK{?+ @HA@gTBnzCk"F^͟vG&U ,<{s Ͼa07L$Ϲ %Y ǡ.QsDhO/ !Oo#Ȍ+OJtYY_A55T!{/رRӊ.R{_R_yC4 f.iߵec__)7otng#WrYr95Bj_]F8Jr/,x6:Pwdu,٫&i^m |$^#O ~G}ƆLQ؈pC.g҈\d.ؒytSX~M8NxCD/[+TS@[oE]̨rQ`EM3|%4"#m;9[!d\sBM;ckWP M(9~UO826*"ҥ)dM H&C!g_Q̊K{*ȨEM>rܛz:"ox(1? EA4O/ÆuGj6V@<,˪S"(/K1~x.`e։kV`(-/%o $ί:E D⛷d< #`lЇNw{{ 07v3~~BԓY 9+L=X%TʬnQy(r_ٌbeU {.ASɹ{c>PZ1H u &en޺cB{R^fʦ>LNn{k4^]hoNjhz#Q?LY[) FƬ|G7 ?#OCa+P2 d/{HٴġGN1rILyУ?v(J~ H pLl8 XZM$Hf "w)07cI ( SA[bo}x 9f)e$_g&z5khBO9m/h+%V~ܑ:!41sg5p@E V~$pOVBcV}C}h!im"J38gwcf3ϔn*EN0ʒۅͮwx?EEtNT{,'-OJe._tƶ( t;j/WtjŽ,G=c5ө뷓/ާv{" ddy `@"XxSɤ;OwXD%xGfO1H=h?՞{9c P퐿Pݰ5PGg/pPSuWg=.{:}F+DzC,vKj Y.lB *THd/qӺ;fIAlM0& {RoĎqԻ@qλ;i2oּB8X˞[!#Ne-P>4yU'C-1Aۃ f]L>wXp*:/}ϻ1m}dp;dU Ͳct*f+tU.>g,s8"ysYrhI]x:9:ۯTNT<vgۋ6$<q%âwIES"vYzC "eiRpjVI2f{; ?f !Ng>n$rǣ]ԫ Ql+ ̾v-Am9PR.'2BR5yV+w?&z{@xCIkYe 0> codŖF[+C-kjMh1d 0]2S#_Ie $2c.%tSD0\u{22TW#vxOpӮW fϪwqx8Tb sҸuT\Ռl1{bvҭm:zldVu0}%|,fv7*O]E4G*GzlI*&hX4 iNR0MҾN 7NYftlG7lڒ= g{jQ ٗ&Tv?#O c )=x\H( 7w" OsXޫdwV}d7qqEfO qPH!_uxˤGc`3$1n=$^%(RxSK'Ha;%0wُm7vvrlƅ /.t^*Կ$y15`Ƃ1f\=cdBKOի[6ӡ=9_.k+?زΈxeX$ylOEkl*WM@!6?r)5 ˮ5r[<+QC8}WhwKT!7uH0PV!1'2MHӁ_֎R#NBꓟRoS6ŷ9ܐFJUXn.hҳ'Wf`IFXD-ܽD6[Y]fvL 9 7uz͍w++'47]9zeAgO.t%4$.'S&A ,${a,G!j֝aiW͋uRf)C.@69Z ᑗ8jHrI&V[O3^8v# pwX}5ٚvLv*X@A!|46 f? ^A/?X<^+8 * N{vS̥>qSE^!wu6U")1;4BIgmots>eM*W1Įz|l4dV;2pq@YY- .hT՞In|:D␚(?0{JT#HZBLf/GzS{:j4؅gŒ4*1YR=68zRqxf.*ǣ‹|7,W (tSJ 4|8M^) oo ]Nnermb>B gZA;o`0CSɣhP,Ӈi@ &{>|Ly4RXoIP[xY*oڷ@4R9Bp0|moRj8aX</ %5D8 PB%A\)!Xn L;惵x 8RA.TΫ>G8 zS*оhV3:|ٞx]ny- }n4 GIQY[M ,=M4T1| _ MEx ӉHk(]h ~ R|y[7}3I.dA,4Ж߰قV WDk-OcU)pǩd^}QkQӼTcH7Vp,.W>`Eu׾JX~q_1FC$0/qU„ $d@ƧݷI@[D4,|@MHԚy!2Gfi?['l@xSY8DZ#a"=p=7z'H-NxّaHV<ѱWT\heߓ"Crw@bza&XߌĔ\6Q4-E$k6G֌#̨ KҞ#,SfO[Y&S9SE&ߢx"S Hʶɕ"Wa9OH%t8xO{Eb჌~Hrvw#f.y4Qk T(2kC96[FD+u~(ꅖOb FeEY%X?i DC]Vr]K4w3aATخ&R`u7j NJ$~KqVC)%>n҆V{IrYOey5')P8P>#TeЯrɟ~oc;vfBV2W#뛣46D=C2D ZhJs֨5b0 (G6zI"*ݞwQe~H,tH0 "ZǷxO}WYZ z2_D4vr[SI!⺔rq2B%IP FK)ٻ5//LfŷCX"SyD\ɱC^ms̨p t88_6bz8Z_Sښ=K\WnċRίe#i\*pnr*"igqgcHՖ7U^D:̘WhXq: Wq3S>ҿ/,5/11OKxLawVkjIy*fwii9TǐGe!"\d#½mR&˞;WRB`r'J)͎ډwʃAol\PG[NODQ+c*d:xUb@OD .Ҹ ";6#xdz kO:/M":If>|v9(xz*QQH-Q F,e9.$=OAsR/W p:tVDku~%@lF9tm Vglw !P=FG#0U{k+Q)*0^evu\ Of\&'ym~.DHOB$@wA5KN9Yvecv*#Bu-+{o-!UW'E0_x!eгٱt+? 3ϕO4npeG(v5hV Ec(es.}qᛟ ֠ =ejE} +@ؠ<"LKU!G˙Lh-":LRDhԪvju29K0+̋I!IFBk9"%,2XV7Ic ރYV=XCńDLӻ4G&vw?価K".5D>ޞuKV=kͣL|M^C2;_R^Z򠷑,woEi/hE==>R:QE=!q؄4ppx'aZ*ѥDJsZcNF.fLh+jb˩u" ̓.x`QdKut^JANͥڮJ ݞC0C'[41qT\bS:RL,Yh_DEwxemfr0⏚!fo˨IXIZRfҸe4y!̏/ 0a!*"sw"âPdoo?7RCHa%* oڱ-+u.u)BqOzV:ErTYI7˗Nk o|I_\ppj!RL5&zcXH*# UG.BD1{cr^~4v1`>zׯE||mL q;ҽ?;8&\ ezXZBdỤ;r*'1fPYr6?$d"`Fk^ K_0g};={sO/DdT(g9]<^>U!Erwv>d ƛdn}$bwK?mz{QE'}<(R%9M\G,/hm &[P,MkatbFl軮ȳ-5G W'jԎ.́ <rࢂϊΐ'K]+/_o3z%xmřƽ`y& R:W??ܩ,$JV`W0qK SEJ#V͆% s]|0eXR~(͍+7 ;xj]䋥կ Ub!fju=9a}+lB[#-\Ds&geypA$7n1犷9M㦼f^+sCw}hʞE Y \%*&35 (2ݷgr8_L}e"_mU'*W ?52em.82IrǞ.WNoih.tt6L\Yu)[n@?Dy5vI{oWL TWMf]K#D%m3qJ4^*wkVffBg!˼N✍q_ <2`.A{; 5At:_1oV`RRˠp}w$bcp 1zc1 TE҅ԝ&7ͳ<#=jCc)l}g1F^`;`W/$YF->&NV汘"PAT2~{b[BÔ=h+"h}A>C=!`YSOSkTi,$'LISz<98Ÿ{3p>9_ݨk0g{7|^f ilhгt D--CP Ҙ%k5// A e^ː!Xc˵-Upv0VPI&9ySGbaA~@+A&6%H3w\h[AghܠnʟFr3])4Q@,, ';E> N?bА.0>LDC3 0|cwt <ү. * =SLٟXV[OtwIW;2=Og/4 |&AOOUP]X˥>,Ij(n+ h4{B}ew̡B!oPL1?aGq(1I:0I?.0tl~E7C\=Y~g,CoY74K`$&e#.q=GC Uv̹y I lAV޺mWXr%“Uju׋xg}3}l*"oo+1ReTKjVO~dxy؞[&_/,;*H>L/)8@tE6=ӵUT;`mp &\dĎ΋AD/;}Fu1=_2Z0-ΐH6:'ԇ&$;JΔy2w0Yb~! D)ZcA89|Ix-G,!y ?r^-2PWs^^CGfLX]`8&[Af/'\pU,5^*&MepTgoHvvxP90xAr4x"y5tJ=FTtFP_rHAXӝq@RuQw]˺҆a-+r߶ZF\[,75ۋqK{g DzC{%BI.B7 )Қ/c )h4E*Q@{yzPc$$\(ocBDj| >:3!zkC_lV 9Ԡ`Ukmԕ NQ\o=U`lq |P0ur.~oD3 !fHr&q/[~$\5zH;=k%RM瞙SeJ E:S=N;D|RANDkYanhӥ ;1wb^1ԃV pqն2%!mӣ'hOb> 04kW8qOyRK 0X{Qmݹ-Dr:R)g7Gg?8C-#9!1/q5٪z`2KGP*%7T":>پčDEo`%3\d8SVݝv%ڎ !q/k /Bjy5owF.oWj0+Af`h] uHOMnLDUjd$h 𾄚@5!QHjcЙS` 18}+tMRfs>j{^ hphez`cv]x[Vhk,}}ebIbae G &6bp(2;8d,G0s)?(4Voj%4rP*3= =F}51L3 Gsb,@ϕm~lH|(W9|sQZM9vⷽfcs;h"وkz@rcQ!jt]LZR,1׳OWxrZp2I}Jisό' ](x-= ωLC]@jslbRґh RhሶW:`rsZX}AI(t):rX-Sށ8QîVp ,0x]|y%{Dh08)/Pgŭ"Y9=_EҿsDGqۡ(k.`&>KMx,a8~{Dd^Y __@a*ԯ-[<'X)N<)/Y,W-a)^ww?Dx 6şBrґ]=Dje4.|->|0u#}c H+:~f%^'z#7bi[7xi¦P:Ǟ⦜Ĝ\zP1]98|ǛtiG wR%(fT` ۼ;J*N6[eĮ ^jފRmѴ&Od绺i9(puՊ'Rh FD?T*`tVjL+Ǫj=jnJ9r<”SDM9tUpJBaа,?3r`MiWl @咵2x[4$wB1"#Qz)E"uR5,"]X^ oa楪^5>(11D{3iY {:)[5 EovfȔ _>xYp$Mˋ3RcdPܾmONLP;=C]\V ȏM{G yMMiU+NxxKWۅ 7 fD (?#s# xlR|CEP$s^Ԫ{n^_fޭoD[[yЦ8ṉ6jDo$62,} [J)݊4cB~)>@G/LXX}m?M2zzRMe`|l.s,S􃘯,\X^_N8ji0?Kc@phEֳZvRK$sĠ\~x#Y$!Q>3%*Br$+kgsmMuIzH\Ϫa14J3y%DBm C,"lrT}b]0%jRol8%]wu;%˧=q8)ș>Nn9]/]$!kJ*ymw/ {;gم1:ge|bؼE #'>AK@CnyƢ'S&Y"EXSYk^`{DqP;5q]m.5Щ8Q j=8e}hqUb.6Y>9i< 8m*F4o: ɹp&Gn7.,w`w8vj%ηآybN | &pJiLxY*}1w'6^+B 8;k'<7լb⏫IYwOg:^r-TAsz$S"`3`u[.rI 5A>+[=}"K(KVׁJP)?,+szV'+ujz\Үh$n'عڍؽ-D5EgOnQ:죌Ze V:~5u7gO7EKE;zУ#\}|7h Ph9ͣs*lɭ1ۚ+Iø ͌C~sl§=N)*pHM*6he޵ij9l'[bCO ԹLT|TD[*0KOi j ]fWb 'Y7M%׳Z?`9?`Ebq)QP|{ꡘgC|RԥT=Iْ6f:IӇ kہ\j#GE*NQefg]sMD%0g!LIHVAtΚ{l0.V\!lzꐁ,˙_ۯ} }Q5}Gcf@.Vă)j8͑*x rX&殁nO?nE u/R,c_Ζdz'PxǓ|7O.csdX&EVUi8Ta7/~D}]{ng3r#ՃG#HiLJQU [v2叓}cc1Vm(0a=޵"U/Z Glo.]Ls)h6[`L:ZsS[HtB@u)fBU$91O 2(''B^ gS߿"Ao~UWaTs?liWVcҖj%.1N 8J1&cEB3Pw b0'Uoy*yh!Z),tGE$|yk88ym>@a(wfϴ*c?+;ڪ$jHM;(lxX8XLen5oAs}ܚ ស[$WR4 .^!)&["P/;%,lLD8!{<.I^̮̿sYa l9מOٿ>꺾N%ub!c"Kdh)#&yDèZ Xwu#``6:|>p2O#nϒ?9FcrKB+J?Xn Խ[Rk<0ZF5G5zNuO<~p0abxB({ UO6L-(D ɥ'h.^m!(xu*e$!I;EB}솲b\] avW qVypmOW¡"/v|tD[|WƖ+f>vc`=6sぴYFAD>_~OceZ@2?yW/?Ղmr"ɖVt*6JHN,sd|it&z(h ={" f-~ԵE&&$}fwijа!)>SDmy G_a/j] nmFk]8ٞ; WJkl*" jP۫Q :WۅK8} 2Ue$ L㑫ʳ4'+QǝdQNu_"Жb_ɔkhOF9mb$&7ymGj ^2U\!/u%W7@w8:;nJǬΉX 5yx5K4GŅv&)Ydh&$m"4x&KMA!XR敼mzz;}"1z~Ƈ83mb _0p+kQG?"sؾY_F=㙹;; 9I&m?a֜ (cC2))o$,he>N vD:qܰ d=|s8VB~WƸC E{*{h62D$d=?~-1uog ct]nV,zg{e.yQLq^~h#-Ww2I>cxH.c vUй7Wj; asg|U`DE`=]AZS G[ b5N}^hy0X`Ma@M1g$VJLϨ٠fLspIgPz/?c_ʏsYj}Z.v>DqtsEYTE*̖7 A,,^&`m+P[h. ' f~SVGs2p+oŻ(2{?xe}ݷ<-7D??2΄ĺ}0YHT˴sԣ7||h_lB=0ض+RQ>e1ctx͏QS݁͠`Au! ?6*uW/>Ø}_, k2뺲bVHRc{x=k2n2@U9ZePp{6αC>|R(EĜF /6pG(!0CۀwO!MQa+҇ACiky <;- 4h>g&pT*pgH]b  o^ AF(K )WЫ߻fNWkOJ6ٍ:agcWPMpilxdFHWj1:1sn6tɰW !y25[)4u8Cr-gk l0a|;0TۤA l?ne0d"M n[Jh)F"__u mKCɏ;&~W͍J<ࡘS,׆b=Z]Ýr^Dz1SiB`Ьl]܌YOy[6hƒ!ĊGiXA..7H  j+t9h(3 *FQf`8x#Px#3)Vv'>RFzG_g]~3!Ju7z=45\c qNoEBvv/x~\ ?|wO✢  Gn ĸ2%>ɯ>xd.\Jsޓ5wX̆/$r:s;Ip6Z:IWL~!͎CVH AhBRfh ;2p}U OAV1QW=Sly-gL `,hgl`2<,7\c`74MX I.P=Aͮce)"T* :h^qT"!ƂÊzpP.&ۢ3gT3G$icY+h$WVj74!<Zy妼] x'=۲ .TАƀɈZ鑣ϛ⁇޸]&v `;bpUqrX?|T,ƪA>p1#H7%H$V?.bc(c//hJG~JL.!+I4@-'U&;ݣBC7 yi\UtgX"kf!h9՛yNM틮ltҨzH{c>ؽ Q[wUyd%% ʑ[;vbSSֻ/2 ":A<9'3l͔8 Ѥ=XB5ѱR*:܆RYm곞 .1KtI]^Γ%lOfڏWr6+hkP Y{SpA)w OQf\Qʲ%iN ZV=GRFH0Vޱf0z7HWGhaLjkt 6hzF[i+"WRKWvVH\`iuhGXU< #WHxrt{'aTN>{smukgW ,l(6+eRgٚ]17I  Դo# c!$l ZR-(gyĨz5'5|HO3ӫ_ 6lı[}Eg܃gSx؎+ D`'B %>(Jqz[|7xiBlF*?; t#p]}{Ȱ\m+†$+8"q-::$;5k4D~ ı29 `G^IWd#B .ٴ5CAQMk^vxsXR֑̰d$W:Z =}bvi wޫ+-t,.DJ]8Xv7Z`군F}kfhd1|OS#:D/o(87!迤T]cޝnؼ O*AA+62J-r;J*7>laí%AFyd䑦nAIŰ2:Oê6 =exj3wI_PWDW M-쥪bmX/;* u:ߊ$) z>Y4`w"Qg.ELBțá4R(z_T`q{PoZ 5 "}&vBR*"c-3ca7D٪?ك~~V  š w"M /\v%ͪkML3mS{㛋ѯaF`!џGO+b3%u#nG9T5NK).>02( 2|ÆQ_ۧJ|˔. v M^Keq Dzi}m?j  B 0it͐D2 [7(7,#-W)SXez UG9#!,+~Dg/u4XH蘇RlVm>jN)+R= u#Y;+#BPw^,RKYȶjCUPŌ#r ⋅ܧLav]N*$uq{[* G;+IuDh;`R(s\1寮5~Jxvf)7`{F.ڧ:a{V,~$η,:C[sܓC1cO0D2|Fn<;2 rXTl͠X] 0-Ad>W%O!u.)M@@wIKGd`|;{i/ 2K'IW v3HX%lK X/k=N{EHZ$h[wŶBL5t1V8+sZ@QO}sIPNap4sf2wojX1K*5-8w&BeFA[DZh)O3bç )S(=ws3zPC~lsbH""OWG8:(A (Ya]g.cR`-x6Y_*Rq& OWO붳/UP =1ămsB w0܌`laH˻Vu^-Qo[\˪'ƝqbV,X6 Z w3CR aqZNxJ]KZ>Qd8i5' x{3ir:jg{OhS ^Xd1dwJG b}KbD>Sn֚_P0.pT10bp`9j ¨*1)&!j,8zCm{n\)kr}< 6";Jo~FɊKKF6ϰzУPMZz&&߽%ގ.RuQWwԣ>&0Pezl٨T9A5-rӬ$ p~:Mj4ΈO(Tٻt6k*SepkSs;HV]7"$e-Z Oͤ6N'"v0Rܪ fFK<ك6iHdfjrr\築)*{wh}غ8P#Wc܆/Y$n_E%RX{;'/,1-SZ'J]"oՌCYekdǧHx\o =ۧgplKkNE !d+#v!.e{g[DeOP $RKn {d2 5|=v{;t!Q8JR)#HĉHh?yquZ5s_qytxt|H0sS3U Ţr 0;*u/7` *@@MDzx`"Xn{S )gl.}xY[L`[|{$6owLtyܞ]']GpٌQr΅|PhgHr֖m=aB1Iڌ\Α_فԠ4q|ǛLś(eNk 2-hQYD*40xm.af[P:[By@uWYܤ ͊%1m/IPnxy0lRkΤSX6Qy\e f@pZkMv] 9a~n@U`1.T>+;깚u7Vjcl1YQG;oGIMg:G&0J,S736rk? /q( ~i?J 1"=&I7:bUF[E>}2aM|+*`*gԅ0cA@F; %4:ST4ZB3;p$i!"m Zxo$my--PS׮ھ̔=uK`dvCSC'3aqܕϠ/z83eMOQiMul*2 J(;I<2d]*~xdm|kDU&<䬀9qJ(J=ݻ l8ъTo!v6~߶dfzےc`°ٺ"h~B1 :L"Vd Lĺ?'˄+cZ귎aBi`PeI7y= )3{teN3~rE8 y2 ڧ.]e<E9Z5%ĪZLmWLG~+zS&+r= )۝gbA%*u&+o29':ȶb$#=<<ܪjYMm;@c)Ure|AiHMZPB dD=JC7ɘ*]S?Ò'8 fݫ[@h$ҚH$m+7& ~{XD@$*CAk4W wDڔ-|g̺Ȱx 3[kL۶o(X;4'1kn\1ל]:h{Oe `nuƍUEC!+O"|uı 2)`B7gytMgUv22[2q`86ןnC-=imTu}>jkbtjO+:(>BU>)Ґ-=/[=n Po@H_e 6#lzF%Ut|k@^D*LgSH?xLϬb̫5E&k-w7MvHl:c!qSqTI fiOַ|:%g񞦉)gDHdDZFfӷY,R) sj",yMˬ}!v9A2I!.Ps~ʼُ\Q>6>(fADr{9e0>[~[9E8sqtGSmYFagl۵_<ޭQ+ lFJ{\!>.hmP^o_L+~΅w8ݽ~uBG`(8ٽ->H +'SMsTɬs (c/{Lk Y{+'oZWg[gAAH\5}LiG"@vU*!5dC:=+fH^E"7,XzRCKkn`w[&8Y'8@13 'j";kYtFkͲ|m᝝nk?Y _ĐCjl< r>cҴ^(gN݂yz4js{u쌚.`!7e8DYu.lj'~@Q`_*b}զ>AB ttsu"z:MGQk?k—pR-ۥv{)a=9aJj 4?֗L'ZUHixAzn?U76k:qgFwYZ7c$80RO@k*SyxօBK7r#J*GSq'> B7'uYFPfu(2F][4/j*s>͢Pi<( @csLr`/dgށ Y%/ͬ+'5)~h1O~xR($+M^ N̆&1dK <+4и]1q%f뤇 6dA5{ck:sڭ"67'&z۵bsY&Ile;j D,Z`.if[)<_2hGh v`JEIuO\3n¨{I!Yi@?3!y"%q.p{Ł{PnVXGxPf6pFC6؟et9~IWs5| $IFMJO_vrI9:a~47 Y^/!*"6Q!&ʘۋ'{$MzV,;k"@'Wx"ipgYcxVB*ދSm.C|~ſkhL,Sw,upO1B5{pm/opZ%,eݖ/e]`f)6Ӊ2_oX`q,劁;HQ7in5{'p#z‡HY:*~CP!xiT|/} l'M/'3eNón@ y3}2" q\A@Ew$Φ=6z l F7Z v@1~` bsXyo"}dLVG8l7n(ݹ563MֱE#YF1)fQ)I3)h'?T5ډ ˶kYLOg˹l',-_$cػ']/bwX`\\Y^w^Fe-"IEIu,+YZSJ2*tΣrED:[P":л*I::VyB(Z%㨈) HnďcĈ.2}(glgs\sÿFDA̻B_MՄ!i85bB4d_!whq-C|`"[Z,@ಧ `SZ+_B̳at;DHYV$bc[u[C5^Tk:,8xD_"Lᨳ1oUɤ]//]##Ǚ'dڹN>yz/~Jy)-݂r$YJVҺMwڦgY=H,2n a h,D{Le76Kw簷d(yO.O KS0)k";(! wM\zyCc {"^{'1l&3YYH]ÍA޶bmeI 8m'f.<^J(̱eW 5CV#/{YN̩O3ͭ:! Kl]xfQ`3&)FPj (Qu]Mhs-YͲ*OZiQyMD?&uR0#6 9B 91&Uz AUg{WWj![Un匇mm{-h_(&]Y=i9văe} J0Q] Io&IoCx. _B ~t@h 8jJ>_c$a]FTi$늮c+ Ƨ`t4;˝.,%U\ $=H"ٻVRm ߻%j`3oKBtU= A~n|EvHl?qAgxϙo}-$XuNG=.i`}Vȫ0:Nڷ0Yz}t՟^ kk+MsۣmDEST$g D1Ձ.{3^z-z!>&ӆBCoHwUKb0ܝakڳ宽J6Dz͇/ ^!X3ҹ֮j>9:P[nӡ2גlyk*T/Hԅ-Ӌc7HO#_.fS:B=lio=ڗϛUQZMq ܼJs9Vr]0.s\yt٧$bBK01#ۼu atScR4^"z1c ,k9\[9. $6"@*^0q3sB _v!A jzi)ִn]!K]b,c&>(=dcXRPЀB.-lr%hs)`}S3ՎV@Cv -nx!`>0Ud؈s1.&qBěk4IoKlbM$­;y 8m%/|e˯E Ksy(=#>kՍv}:';mPKfwL@XiM$w GٕuPX>ߤ-Gt$1+ZKۑm?@4ϽS\!zCN)}Xp#v۷q|71c+a1OAn_ul޴!1PN@#owJ#eRbޥRhXRgk J2{6GpWִت璿 ŌJNGK˟4 Lp]m,CjwrZ07ϳoji̢~3YyWAKc

N NeOEx!Gw*,ag|3?;/0Ƃފ6 g}W=+UJÉI?<>0l8=ōROzɤ,yZn3#fq+R 2OBwr.T\@ Ykj 6?]0R˦"*X5>b%SrCbDmM]ͅ&Dn 5 ,򐺎qU |]@c~g\\LMvA}E6pz>7IH] fv\j; wCf IQ.O[i K${b gxgՉlbg_V]!\fEPL9H5ItłvZ8]mɎdJw=Ys8My8; 0ntl ߶ /QA_Bؐ<p7lO'?Ytd|lՕRB$2?"JadLX?(ϗcq{%UKu*]@(Ήʞ gtyf~q8!b{fu{A k، @|Nhe;3u%g25ag0hKZ_~x®OIp0$0S5C xk5ÿur(S>Z$Du#+<ل# PeM^9Ezs,>U{{uKE7gi}cPi G=1 |I S֍,'hV^&sBS' KjzBIsq+Gzf|:Q@Y$Zp W \%y)W]]e64TeʏAW@4N? u{`hdEhRm{}XQ4F[?ڑ=79i4AƑ1bP2 Tڝi&-H5ga.6ޭ榥˜pW2z"F;w  Ɖ`|~sxS ֵ 'NVZ৾*܁'^rd>Pܲ=(&iU1ɊymXso&0(/hUB=h [ba"spU~>S?rP3fs\iv7^ ݐ #N \,0mT82x+U9^E] -%#oIS,(wyxt~ ar \2 vlDȡ@OUTo+3Q!ܽ&OtYL 5Ff_\&Vl-_rmK2m7pVA0O=p[h$ ~6.n{ժ*ta!z&e@XbʞxU,S}#ٞ!@VbJA@]zQXeߋڣf~ Uf[tt2dM"AXM%ܵ~Lj1 XB +ۙ}-LJOkgp t(3$EBmy,^Lftd&b lN^/r;)*و d5vL@ qy!aX/ nP{ c{@_xb\"W+n^jSAġ%=[l3;psID#l^|w7tT`I5k9]_}bZC q~" E^e[sIHv6bذ4=W2a,Zԙ,ݡVBoTzW@ı~)c V4iH7g̓Tqzk,.n/3K>qfsm8ZJ !OmPͪ;.p +IK.2:T4ƢoaHf]+ߠ0޻M&%ky*&|DW*D3sFy_zz9s{aӀٳV!iKhZr3/+ B/V<-Xf"G0ުw~HqoV8^Gbw'R1-( (F9dăTr1[o +)PbKC}NƟ j&Nx:"܃S#%>nٮͨF \q5ΎT# T[E~7Q%&7!0]ʢ͍h}mmF ⳬrV 6J1fsW.-VXN+]4 TNS>3ĬN 0_ǷE>\䝞1fxJ!'YHiWɍ0H~wG* ǭ۲ ~eCl$K 65~K-$U#0G2S K5A B=_IuV{ P_gvaW Yfk,*`L<3:}8"w)-p^C_Lx(͓'HfHs}xק vjN 4#I4䳢AG[2E|&8> B_$>"֩ަ}g)nƯ.f+'5NZd+"uNs:V8 Zk-ZmHhT@p;*!orz`O'vɒiq >:xT`TTG/fraTsE^2Ȕ@Dm}(ƇG_&o6TrW߲ Fgń%Q +7 q%h rcq.}Iv7>X6( ;`8⍱'֜pjHp698iQJs݄K&9O,^ ;8[؁M Tl+)'3?o7\!}gXeչh֍$/gHn.x /'iFcy2Y5Q0F)ĦyeưR1ߑ(Y\PZ r۠ Nk'\+hD0ďc/ 3yc\VjB"!!ڜf xV_w2Û[pvi]t7Z HLK*'if`BRzNu1۳GBysZA,TfU+1 $+Vkd_NO?,8E]K+;> ,II>ި )<d!NZ͔Shm1'I0RUq.L:OR!̏fmi8SjTfiY/"Yњ"@FsQ֓J%>2r^Q[XCOowi8O\q=%`lFՋYReO69ܺJHQ4YoLlh4mV0OsMaԫy^Ľ=4W폎4(3G#ɊD6yIVK_W&O 8|Z+c52fV. ]ܜ^$,]7}48^{ኀT,b~B@mھ6ZMQ"~$*q/աF.37b=2r("Ƅ) #E5@]|`+e~Ͷ='_1de4=|Qp˗fpݶaGn'H-5Q&ŸE'>mHZ%tCƳ澾["c1nɆ*2ּvj >Ǭ?*1Uן78vt1kv]>Hǻ%nPz1*g~w"k9oa^|ShjKɄT$Vl;Fj]~¿Hd-3| ِ"]V0K?tD EEbqQN4&" >r(CQ|b(ca;QϜ$J/RtИhqP{ @V 7\-΃/'_rIjW[s& eU Vl,d&ZCV#$Y@Cڒף|;x5O&beܔ%`ypFƏS>lFc"es@ULk喧0<LV#EEbShU_lcZ Z>kdѧսP)Z+?׽'U5HnLc>m|To2-N3v6FGAӛgu6u˫n""\<|3+X39|q~38# +ms<8rF4o X{B1х)koV  T҂7J%{Ȯ,J7>qm~xzs?sEOtLX0~o\>1np߷h(:ď>kv>h.Ld:ĄJ0iUX8*F79f 0*WF$} (P_ -aƅeaq]'҇X߄iAG>aǩ*2$h[&Oѓ$ -\'9.!΀V4tL@㪾:M7u#B^f lԝiyr-Fy ͍+xtRn%iwdYɼ(Nn7qӻK,V(BDEq](NKRO5]fE^~hMv /D|l߂A?3a7֔VL~Ee(.؎ @%vcD`F\#sߙEӧ@wV:}zq{?֫PmU׌l˷H c'$&.xTd26D`[\r-Rk5k'6+Ji?>xzgpIO./ݏ¬YD(]]`Mgy?fJjfXGaQS2Pϋ߮sL*Wc ;7݊Fܻ5ZtD_\b dA1GY߳,c`c[3&p`EQizxw,s1\$.\ItgSL~O8,[~|:&KHg.b_޲@*waXgA![Q\'`EkklIo>[snZ$B}+e#&AYtB8 b&<{E ?UӖ  &("?x/T$7LW-6Lc*|VdS,zxE*th7% Rj'Gz<6d/SF"Mcy]l4c\dY.fb|[x`_\WL{QY}Re9Gy_Fw7@~;^ </}QFZ`U O-q( rqЀFo\xW4|I$kWJ~z94IU&l!hcRL,=TjvK=1m +L>2 pm;@*$|+? Jv[i>mGG"u|w6Ű說v[wZ'Ӛ ;p5Š -] 9~+LC]k@ A) >P:g+{50T/OjxDseKW Kq&ři x4) KR2˗U^#wކ}mRI)efl}^vo`t5)mBAK7jy X}.߳b vT*u}GoH& 6WH\ r!tCu(\]prkU=I\XE13v(oT,c?2rG(ӵ V [a%*͢rQ3k0q'TqLr ?Ux3N`}8-s,g,LS61Bƶ> 5Ei-/_Ix˄A܍зiUb!rȘbe6ލrn跤ҒF8 oYi)>U]L_,0T4B0,GƵ?!E[| #x9$Ay˄tK I+\ UwrtjIQy58Emi>)Z³jr!;F?kBCoyj섘Y;YVr-/5.S˸DHm-޾)2d|tW!+$7^,7Ԛ箑ģb.{^G/ˏBtl!S`_b`Űh?0 @lx%I6k<0 Ǵ-4]U{ c{^ޓFUT$Fc`7Rf R[݈q+M\V|"X1lvgTt)rN]=`V"FMntt/[J˼:յM8 eqUgDYyB^n% yn/O* w$Q^7<"]2\zLg/=; h/HYpE"A e #P:e'H-\,M_B"@75xO Ayt쟃&Z-I wDdv;Eed걵UBɦ01,ش0$8i)g wmHv{0Gxh&|DBdk׀Nhe^hD̈́wtCxS`,`| (Vyh5~$WS6w4BLLZ4Uj9'N"! ݣMn_J9|hb~bB[O @^,u":[yR8Q?!#efVǘ5ߦ"f,IP^$,SZȵtNPQAQޯ94*+wQ4G>禐:ԃR kJUG\; `WA6nA{^ +ZY&-,~Ta8ܴɛ^r@ckJLO{ ܃}ot9g<c=tu@OO~f8q%F8ٯ fqpў5# rijٔI&# .|) Gd~OYlɠִz`7Mȵm?9 #И?1~L.$$(#5 yo")=f= K۰cp\OWUh-dI!LNjSwj%NP"j6p?F=V9]MTo~$/K.Dnݪ9wmTdɀU®D6c_nmaUqՐ8Tbp9Rs}8\,O 2 mH~h0sUogF#Yvț ʽN &xXj naq̴֜8 ͘h[%>,5I~ڰZ'ڤRo Ez*4{!Zwwd9oْ!Wd|Aqn[p't< EhkUhэ$^~.51AzZAb4 7S|Ik?b30y}^yXs H&8kO?a5{m1s 19U݀Oy/2ގ 19*WFۭYV{k9a~"5KVF0y}3*U7HL?gS Up*k"V0KmAizK*١I--pF*;,fZ*u?`k7ȼi/]Ώ• ;S p+Ć]I;ҹ8du`R pe>Rێ6!:>+Qq?׶.'lY׹EǨ MAeE:N0[XQwlRĨι40,8:gz-%k[ַ0Ŧ%iP9 d478z=e9&bǵVy\S.O5E?SRY@U-d]+8oLq|4LȆIuclΊ;xF:`-UFUI)[볢9O"{= ƫA"1zͪ?3k)îlH@*T7e:tHQvn%=ϊ:;ջ:z*# BԽSdBF= ӻ6-$r*6ĖH%qiY_\D=?Ar#eڮDe2_121C 7DmE#\|DZ7`[HAd.60H4hs{/Zw7 6yسu%x63ZKxql L+]NY\R pR#˶ 0M7>Ò6쒭2) }B&E64r뼄xרnu]fvKӦUV BۼjuZѥ -Yma31ٵh3iuV~.hkl1OPeMo a*j-oNcU^4VzKp"HeKʿ F?; C)瘞(zr/nyN hi%jaj{RGr,ոB4fIwT8ѭWg"7=΀{Vs<-?Ϻzu~{h3"yCjio]~˳eZ51&7|Lt=oafcS7i?S P*%I*p>aaf@'Et8띴lD~߫r d꾧0RX[eβ2z3P%FS:fe4R&GD,Nb7&$Fq'4Mo]Hֺ⍢%•# 9vj0_=.e JV#7z5+0'\#mod,P5z<s8VK%dGGCEoOHV?wtT-}[W5%Q6kXx"۟%ۂ*'X>a,гSC9h'd:XHiw?a5xOg+!Ԛqk|,|^Kz2Mv~`<0>ʈ~n~LWȯ}8 (VԶ d2jr R4܃X!1 s%*$bkWx 2ۓD3^ј>a,/g7M#1&'_Dpt9R,j4S'Q*;Ek3P@<,CW7(b߫ 7֑&5XW| bX5 TVg=+tX]FT:m~{,ژ,.3M>iw׵'5 tz,$h>Oi^W}* ́B)>C )K?Y{+m4O[Dm\EN-uOboFSmCd 4 -VtPC#A@aqoTBiLl@rں#GKR50Sћ}2fi1-3w] ܆~|aCzio+4tQ: b`6$qFƦtoq&Pp"}[5ID{ҀJКKܴjއkKuZU 3a_}8aϴgͅ+KL>*%Z&*, y:oܦ 70Ea\} Rmx?ÓjFn'n*ct7^@4^ԝ]L$a 5IJmٴmm@bżVzi3p)"SV?ډu Ѻ([~[{j΁&~3^~j6Pm8Wר'΂Eu5t^4U͂) o8*.-N<Ͼghp|ʼn.닓S+I垰:R[i-n.ѐX ,p}(&Kz2OgE~>T&8$(PPJO=I-C9ĉfe^ 'guiI^/?>pF ao'`ጊ,ozu$k{0F\ƐwP_[|+U--~/]"g%3 \Q,wڢlE<`tSd-7*HG ,6;lB4ѬX?֢%LIB9O-/EF.LXh!!4DPWX;OQc@$aы1S_YoTveoރԆ1!F7&>4!SyaĄ4 JHL/t(z@j>={rۄcjXZ{0O^y]}Ҥyu'Y߾n>;x,"AC)c[NmnhLF?UE_GV|G`dz8JŘ5WA+Ⱥ;O;`FU:2;ZIx3V:xJ6aOu6!sȏ僜d -$M[>*oWH``xwmNhuTo@M~ՠ=::',mkh.%@-. 7`fcM&d 1IF|'.qx8фs7 F]|`nBᄁb4$C|Alq $ bMZykN 갧][~7ih0s*t:>\[4xtʅ U郵cRxgW.M%.B־Tf)KsT9ʠpw,~.&,vi/I i AZ70 4l[IT0%kWscBd^"RIQ0Ջ:]8}2UZԏ@-VXIBJ4 [>xP@$[:~|ʢ3A__Y0c[ r;̔, rM$}-sK5ż^XI3Jq W<}qn5hVRGLegkøln{0 +l^qAO9T/ ߃ɋOwp1 cDv=:2hX*L:6]0Y&Zl' W{`=Qg̀Q5m+V3YHH⪑t+sP?oXgҮIZ{_G 6iՠHiy }-Kmq*ܦfVR[r< m|L;P (ĐTZ.P-{Eejj!SZV%뒣-EUX0h$9^+~px1-xls ^y4FQ NRTJRFLaBAtEz;Yӳ-뢆خ, 7ۨGW%+~hס.mHCֹh)DoKa$d xqe3u 8hAL$V =0`Ѽ+|, ۷za'HѲ ƇBԌ6MJb ۉ%?`jh`CF| I~F:DL2jH͝kdxb3hܞps#a. 8t HGTkЀ x-;(k %?O|iӰ[L+o.crXi"24tڌ$}%W=v-RH5+UqrѓjnFyIn(,{DXTqŷV%w, ,冢" p0A4lAB0oU{ф$klPf1LP?|)/"H(ՔLx&52 ƖļcbPm:v~jk>zݗY8+c?`.h-[];7yd K{6{tV$ a>!UY;1=k9)7UyyU[RV_R3gӊw]uWIF_ $(?Ë5cmTYSο|t{?>ƉpG\tM<@G-Rl@ZlG3A_-OR L3k6J`/H!7i#6~&% (74<)+@V|36-Tj.hQ#VBc17kOTx=;4 v[?F/V,n`.s<&Ы2G<)Zo]F7/M7G=2K;68_D$xZTZA)GVzNUSf ٪8.+/}-:N\ӟ U:nnrJv;7, Ѐ0 mW؍%9(/FWh(3@ C#Vk܊VkxvV}aY0@1ة'c[8G1 LW[Jp)&O*LɭB!r3JJìsڠ799f3 4/2BtEĪXJɺvnhCԭz8a(%΅YF<);nmoL M0Kq<ͭCW#1_ 6Ŀ/Fb>~p͡8lׇ; 7ձj34-w9u)n j!VڦCxQ{}PЉb7`?Efm2NykHtŭq旃@si酽 }|ӽ ޶ 9S۸%.c8#h Fbr--\'"|;.Ϙ!GZ3Ѹ'4V80=ױDxƛ wIu1.oRM 4qpqyOǦg ʭnMZc+GuʯK>)~F OF&nVM_6x8) e_c0 YeySM%yς z)_S;$Moߗw]l[qzⰻDmo#ޯk>HtqaQ0g)p=sKˠpC#NGd ^ $RI}{[#SٳLΩ襃Ou8rRjPk5Z7pT2;rν0C6E3~iC*ּh4Ц$1qE+=cduʒ7Tc{'v 2Ob)GtxcyS-5-d윩s A`?o9F*Yအc&u0]?SwQɣ1klHy97nAw'Y"hC][\%eiZ I BF$J̀3ΉUe ٩q7U*,La$|Dú+vg$ALpE^@>}wpQrʥVi3OkNΫicZ-n2vh}da bۭxըK!(-yfwsA ;`z FN;B/CC xr1AWJcm>pmpf? ʌJ/dqDzofr%ˣA4 |nF3mbwQTQ|Qo}vt dgU=v-\&3dԗ;Ž:65P,AgI|=尶![pi BN*Iם6L0}ƐyH^ .mw5g 5g-=p܉" .6k٨'.7"C".@y[%<Ԣ?} pqw=UX!oE 3}U$ONZ-nPf邹%DGu8()ꑴ/6GKUvdB2adc\vIN N 4Ixm `R.-.~iü'R{9w/!4nY(sCNq6߰URF @7Q(Ol^n|cY*X}=Y 8`-Ȟ1,zq1ȦN>gm ptT7Rz=[5L"mQj#!A9_!Z]Gy~ߢ+y4D*-wwVo0[Q|B_ 7}Sl.  ތtTNAr2{-U!k!PrWqZTnV)wS*Qks%5GA?-EgZ5LJ͡{!2[X[=wHUk#/\DvꯕC* ï]_[%wO.?΋vtOu-NpxI}ѡ? }ƮފkXK 'Pn>o<-ĈÂ^T'ex$ m6O* $eo7E~5@%:{좆I'{m1<&(~x|d͍WNn2Ttiw!,ڣ&엱R+!3t2c8֕[!9;9Mkx3N+; 0#)Ax&#$ìS6x.- =u D' 1㱬rcD&Wtx\*_UAQ+sl'XĒl6&PpX1:P#rm9#qO4DNJ3O(/p9<=Xz c%"5]] I_KeЉS}J;*AQD2A]E1TI xhbQ'㬆c,+c7?d(鍫 j@ g^s!8KOJ"ӚdSOI~*Uv\푟ŃժHO Q#՚= f2$垨u>vt3X<T]O30IUP!u]aAMV./AD25Q U(5Ŗ'yBNՊ:䵉1/,!&aozӉѤCm0Qq&ؔ~Ty.ktKǩYc AB$4hy:SPIEQ-iLYi~,p%ȽlZ4g2Aϔ/݇^Yr{Tݕ-wZ83˄;ZOND,K:%M@J5BӄjU!KᶉQ}]rèYOP_SюɿoדPbjv4+c=/v[qF#́kOs &*uiOQKvw}MĖ/uH"fL9ܢGu!XwYݩ)O&S܎mBmSZ{^7O{WpJ+dUh,`;DûO%u ,3KS#opĞQ(NK2%n zY*]HsaόX wܰXWQ?1lEZb|'G4\aϬ֩[_?5){O<<ҰHN;R~#w2Xnԅ_WH$ND݈.VMDA&m޵ b:>wOr1~{PR]8e۞&fF}vinB]t yoE}nO [¹krΰw;G6o3T2P y{iíSq]k߽sCj8}Ya:e6%g^oh=vI-@S@ܐv '1grtO(qmO#w%uY]8=ol05+J٘LR[w< <%TRA@\; ,;ov(u{]׍ {Y/Wowz"d0I?PvTh"x &R-UEd̻&iC0E-ok#|') 3H `'Chu[qoʙBpOJ7s2z s ~Ҁ.kP\ Ho(I\6-.TMdsiE n0^9ae)ڬv,a0`*-7q6p< q{jޞE&lz$Wl Uok[pSZf9ށ9ctEd}g^Iq%aJ3"N%X݌_eSxZ!V`0wLބr>/B5=2o 3_bC!~KGP!OQZ;|JTWo8Tst%f+,\L~Њi'xgyi @t &KI]BM\5ȥNb߬ ,Eug2E H"Y?×l?(V_HW`lvٛ$QOP#z]lVsHm=,aVvЦTMw"9aq+"lY6:cfjQyg[,cLpz02eliLh7Oa lzx4#1V7oiRĠA"h̜ LIȑbkh2F AkP{ 0Ya&jyhrĆH_ڨIO/ A,Óa Ё?AD6 Q'`)&jLޫ;Feszx$d! DD/t,[;!7݁5{BOm|Wl/`lQwxv򠳌DRcx}+10IJS?j -)2Rb<hI` 5xT ST}uzUT(aN<=!&I .?$ Pbnv]:*|ؓn d~j o k# 3ܘI^_IY?YL1/V_M!#?jm x@-$V, (GIoZN%@I& sS?A65%_Ldf}%pXn|m4&-/b*jϣe/Pӥ_ fv Uʵ̙Qzٕ쯿hF|BѪp cb>иn\v|F9h qp^^ai ZB$`x8mfr+wgh&&ipn {R9 TO0u9kLz$lb-?Vx.Нn- IŊSy(b_UzAGb1Ns{Ӓz &7f)ix=X0x@]~(~xħE3U]]oN`(h-B6jMyhXy=Nip9%o4=Q?H)xm5(4țV]fT9 4P aF S*۲W£x2CWyãkV[iՍ }C0/|j5(|&DݸI!=DuK\z=C頒+w߻i؉_m#:Y-z<%{6=Iќ!U-k%õk="G3㊓% *\uIE t#]TNnXN!T8T̝NELFS5aJݦ ֟Jc͚|m8Tze;3 _A?XBNB4[*-Ujݴ 6ćLuepXc"w Zi±pvR6Ruw-jo5XR'V)ԜE(k6Op]cenSPu);Z)jYTZV{MxQTEJkb~ھ[#t5@c48溒Zr4?ԏ4RUbn)~k0xm}NXm#/aj[ׂ$_*Jp-q]?U?|Ky4x+g Fn(P"hјhU*kj#e>x+M'?TX =n 4Na^R3{Çrl;ٶNFq@Bʞɡk{08#pt=y(=v[wN86 McY>DV+07\5nV7ne&@IWK}f0:Wpn$ c"p6V' {Hz섲qO*N?Ē r /!Ț9Me$YmK˅]]nZ:#UڳOCmv\?̆hIceƢ_y)Q.Tk GZ6BK+8-9;bsL)bw[-Nr~= lUf- A ٱQJUS!rSuLhxN1Ćm7)q)ROD?PE9PdBSJF.voP9y_҃ϛCL7 _DD\3>?͹<% >>3=&άmM_6W]ȳI=:7$(V8Zs|T֌v*R,*: #;:*p)3ѯKAL Xwdq-fr\mY-G==>KuQZ">MG6 3tXwM)H;g4%9rnΩ-oyuAZ ²794fM"X1Sx hiM]Խ߲Ua;@2k~֭_|AiSYkq@L1ʫ:q6ಬ*Y>.3@拦\=Q;a}ءAT`7P+yi=EXyɗ5uWوRtQ N$)tmXQjf/D'qCp>%$?S:އ%¨`kv xt8Y6b0)~w}lA6_gR,Ԥ-e$BǍ)cBø2^뻢{3NII`XٔhZ z]9T_%WMNM1s]z{[{M =0nGˍnڀ\@zjq>W86v[hk<2-K/$n5F0<Ҹ٪N0vloSɽVPlkcG.y~,+|u_.{Z[rM|}rK!Kcx0q]i^[m5 bc'Խ9OIqZt,(3: ҌV5=$Pn֣ك!4(5e̺6W(e!\iu!ި02kh%*|dc^3Ӎ [H*ML zQS!"DqP!6Mp#jrn/X"YwU,@@beRT((J* 9 r)$X{)*OB_ ^#K*SU" qzIk[ϓ"MԢ|N`l!;hmS_tosGѻ&fӕ镹FQO3ţ(jl+`Xi!cQmл~zΘYR}J|Ǧĥ\(֫i[u''F餇~+߹3\@R[Zv͸m>{ߴ#axPY<G'4sLH߬q&CL3_/~!b⺇$K]pv6趯pN"-CQA+)xYhe+J˷Hͭ|O+/` 2#wqȐjx%Xo`̹kh;RR>~+_R%ͣ).bĮsRṶ C@"=Q΂209"4,w6$5 b A8E9f3Y<ø2C Rb7\zKd5Xޓ6~`z6l~"6s!U>vWW[3yd#3;0뒴 o]Yb%\9#(Sͯyn u+DQde,_rE?9-gw'{Ip NSzS$BnT yẸA\CKB:?}HU#ARbJzN7CR0+j7dSǯVKc2" 0CF; W~lv ]xRbo=S$vQJ'Gha!/oHYvbr{]"MrZN(wC䟃,[a+r<֧lv0olАW V.h'y"A.Bz?L +wM;>lknv'6V71J8yc:Ds>Q~TCZ8W'E1d6~ߚKG&b?xn4'rD>.pGX4mDĵqlNTDd^wj4Yp5o5JtP6 Kv2R ܢv ׶A.t}"+gwGaԋdo&"zu$}6"1ۍav+h y`8U.#E?F%{) JlIa2 iT Vc"Iqh#um^.}]Q$ՂoGSK"fu؅bHns#rTV-2'Y[)tAO([՟wK+-E֏$V8bM" Z0 Rq1l;r>STq| `7Eqm8=1٩g_>ij|/ڄ]EL z9Ѽ35K=]l27.>fe&U#ag#Vw)= 1x-8_Dیˡɯ0f>OpM=9㯏؟*&Y;T]rS2l3D |* k/7T}.$paa̫:1KtFXfe*n2$<#nMEZ $'U\sk'cX DaR`K-!תzGЅ*^Ƶ># 6 o Zɖa-t$!Y GK :ҨG|IJ5tW󃔪=3 ـbx/swf1uMUiU2PFg}bƜg`/=$%vm\;jr ^cjI,60QHWJgN#pV(24GhA'jO9if!:j՟U07T]hE9kvCcS|MъVi&λ 6fIu1Ww)3fN E4I&SH4 qyLfB7εU .=8*Zu7F[@.daAx,CcJ2Kf򦢊CiQ0k#^bl 1xٮ\{ r^'_=o/ݥ|Kt8[G7-[#2]a iKgtogZOy(itۯW8 OsFsO}s+{'17xZ[ ”JoW.mOl  [F|FE(Q@@6e1bBt"_&Z;VޭK{wCkB8!e'PJ*c;uJ=]~G>XykߕmZKE 큝*i-B3e*\$8k?tFxa h {y,Քrc)J +K JƏ43ֈ<WGKr%(KA'U@G7I QgE,J|kSF+E55F}6MNFD&LZZ[ *U^`ZbŨ~,Er'f|{:Sؓ VDez,'*QE~dyG0֍v6IEծ^.b)%vcTk"%KyZdcOpvE&q B)`:VVmR,O{4xu:j(5ja;"v PlhylT \/aud޲nz;|κb}j -S[-E1(jruc йI#8=:Mn_'Ӵ|,-XN3eڲ?Vڸw5rrSϤ<*ಱr36*<[,:+.ڽe5HQV\QS~a`F;\ b(ԁ#w UcF2Ms-)j-M%"6spuzR_z H*O5Ї ^Fȯ~+YFos" ?-#u(A!UtxM7Ffql2\a"z>eebfPI?H,M24 Q*'a;,,l~=>]`b+!1I̠Lx,XǷu 1i4V~Y,KiyRjnW)z NDaӚ:Z,`ÊӍi MG~*ĝiĤxma%yu[HQ4A4҇ub XV4OtSq:A 4X1Sr]^p#N_ =0{ ⽙类;7oiLyYfa.PH[@|Ff!H+y ԕ(q8SDL(z@O[L\7ZlD$elg"5J ŦH@TT!I3xnw!ʩ[_3u++8Ů>Y}^གྷGHVca_VS'Ѿs.k d'zs)A-Bf|H:f_`<:!"p+԰2J,b3S mBL eH9#U\T洒Q6A{~sA{}6gɣ ʰs6>Yȧs93.QVw2#=Eۄ,ζC 7!J7v)ڽҢ8ՙOLb8{̲oe:?#nVoN@jkbe 5)=z5X< ʐHnHs0V(2#9ds]˫^W$SȤ`PF93d=,_̤, #\A45. ej"Z}3%,og q/ {|(ĵ};i`o"5WUo:|Sͅ7^|UO@ ln4՟x]6a|^8H?7ۡw 7m]}wSTpe7y;N aT\83*,ULپNs@hNA]Ygbh΍{yMp\o$1WpZ˜3ms{F#NZ} 0z/@D~)]&վ}EPQYV@R55?6:jF%`խ?Y&JBZN=졨!(]8' %90+Q5ehԖn?٬Wɚ$2j[!k}wkjytH=ZLtX7ne!>ʼn_YB^>5Sw>eA;9B>GzR^1|0}A ?q ЙVm0k\x$W$ۍr.bLW3qr?; S΅Sn0K%IX)ZtCɰP[R.Mr,G\L!]|N=,'됨b9Cpi K錒3* zp(s=+N뫽1 $xT0s57G ֣}l4 CMI)x%aXp5K\Xᦗp O#+Ӌ?> U!s+< R\47q!!E_x.>b"fʴ乻7{V~HAco"EKX& '*…ڕiRX(Ho6]U[B3Y/.̓EUo-h!VfuL 0&nƅ*c'i<v(p̽oI^INhEg.]ߊ"ե[ V[c}Nl :ԁ@?}l!Hi9.azrG{biGWs)Rv?BXUSɽSA{O][!ݙRRþ uWnHoN|a2|"_~ QdgFH3V,MšrLZ?6Vd ۶h4O*^(qv;Ҧ΋##yM+-Xá?jSr2Ӗ+ٲ_RG 3,l-6Ozc[udrvFϙxU;ACy!:![E׫ jID[1i#o Vocg6utZC^KmTUʲuלN2t6OFNFh+='JoG*OtnǴUe~g//Z 9la)yY u>?GʆnEt|!u0Ա׏#BGWEtY J>],#/!9o0 F(O]+(`!m/"O*N/ 㺝hL[%})_ Mрݾ3x; _Uufے[oE>h-Y7D,0KMɢv#Ȫ{Eoc ݶ G4j)"~IoXP)d%r eŴvPp UDΆ7Xl r?`I( ϹDsND*F>B w) "E51m\q  ѶuaK)H/Y1K3'LOp<%#6KB _zjҴr{oKo8WH BSQ膈A[cs<O@)gpf4'(j8!t,tb幛5WOh AP:}2R*|gi`^F.2qzZ)0=#q 9]3p^6 ⷈ?($"{?x{:]{JBϗ2J l Gӱ9"VCR#D8ha8f 0©8U0;͓fP6gJSa~YNiDDFQIgj{ƎgB,(L\%FdA.C"l\>ުL-{̽3J[m=S(" DP/2*;m5~ܱ,[g~_ad$(%Ȩ̂QG6q^<36C:Fm}J&z8Cۧ6_F^sO~SsP ;,nH:0}F>t-&8Rjfezeg. KPXF{Za:ؼw1x,`gU$j*!:~qS $ ԢD C[:Mշ.vV~mdbOQ#@4l^qྞ?b8go+F DAka̖g*p2]~7@&kkbޛ(YsfEÒFAA9x>>~ZI.K٨ר*)U/ 9$ca|zI%Ezf}#V6!g-4;r4wbNvKDn`*R]@7a6K]7:w+lv|?Ԍ-!+߭0f$,jU촵]~t s4`ȨOFzYO<%Jdg]70eu޼MWz!Clxrfm{b:=b3Pei6,>Ւ(*bnHb@zi5IScl pԚ+qxI<),;z7hawzfù}mªXb)N:Lo%luOy^9P HN˭CɑY,G>(Zp`ilq Yn 'R[A{9_ڔIK\9 {eyU|V )Bk׷$dsGxkZHQG @4%,!ڝV凎 :[-!&M<i+Dm9PGi~o,#8mwBe4-HޠxVG>' SV 0Ďfc_wڗmaMZ0@u[XHaPl2-s-FӰxm1,au Ue~iXT+,vek5d߼?qa9 Das»]WztvMh{JAn"yB(_}ARX]?o~@?HbUn68&v,j*=%/߶e \=ÆdfIgWVᇋ6'S$3w m~h \īS1;toi%2,ZcnfveT?̎SOw3;6cO%Y'낑I*(O<Ǹl;xLʜeeq+_~mvX)>bJs0f0`f1WO!LTe$0ffsP#w5%E YllIPW%:P.{d5habTşwЉbeجIg52 ]d?Pl^]o=إkFw+One>& ̩ީICd_!v]@Nm?d -挄8ᦩzګC&fP+bxLid|p[%VAZ_oty51J\ u#J4f\MݵTʗnM[2YDHtm2᩟Vg_Vh`\5o^ z`DњC#├cZ,k0lbgriWX%Ӹ\ВFQtj#rݸ^o)|z*!-=L E#TS|h'׮:?3`/,nު'F +<,ceS{nH |R-Qhiƚm:hu0I4cl @q=p|k8',h!NWUn?L{e9,M- Ƣ;hb~Feϱ* J82+mwEg@#hv2-Ԧsd| ,,i(;}`r(B9ϐ8Mbi*:'_3(!ۀ.Q,Pf/GֳUO/b ;@:Du[0 _ku'3 $3TS@vl '[tZ;z&nxmoَx![y| r{I#牢Ѣ<]vBgϓk7v]'$pm,kR@Ft6s5rP2uPrQpc{l@GS ҜY/Om=Zz(Bڇiz*.@4cӴY#BfJcΘ-tU:Zf6 )57,+WG:}>ˆ5`M)K-g}_W}+~ڔcYin2MFDţblbu1&_຦`o L6FksXD3AsvL9jNw3$7)aԣ+jׂhck$tp͡0#f`1f,e5avh(ƹ`޶f;:Lf,'il!9zP\Te, KnD+In -X@o͖OGYN Ԍw53c_7I erMk{k7nZ\ҏR|v4ΩhUS'Q)&,,YJGV{H0Uwdr(G 9UɕUأb4`Wl] 3  9[Žn!W C,gf5,0nFq\A1 NOcQC {C'4΢5rߥX).jb oa]J)hʄX39h8vX\iD~ VmDiFuā+W,Tף@^DC Agj,+1 ;/AOE%}i/>3m,mBbw.KAbsCv DR߳#~] UqOQ)F=|5t$; iHMpFY<ʇ?;a)7 لrP"͔:ft6Y,{BSDlxfZ?j[[R8a 6kߡEBev|2k\wʵ:''|G[ %X#gR 8҅+WAV~2c?0.oʉ`W3^EH 2:%?o:u!O(a}5S`3uy i V}~CԷ邙 / iȷl\>g4Z=(Q,~oŦ̺φet)"tE)(i]p|dGq$\ kTAZ)W1ѭ?R^X3S'{|!7 7WKEEWI Ky?N ui1#T1ZBi.)% JJ4Ĉg@`B,m.Gw~ ᨏ,lf럵4 'a9?LzTCku ǃ|sm 7WfA)iI[)EvYS1_|AC>!03¾("[%ŅЍ쭪u%x=ݝߞIPAPY:)OlԄ|h$MaXtL(Dtʽ̋3gƛoy|dzWg$%r ?4xL;h:ɿ|4gokG:#y&x%vM NDsiS LlsJmLY9A~\cE qС[H!Cu9T&ڈ C N2A9zEMQHtme zi.U餬%A,\x&0veȽeU_wOd# pbt|˫*݉o /&W'y i3]u$vͪ*(t"u̵1j/K6Ooa|I@d.ѱoQJ4N=ǭA`rV!=N!#Sb i݄zU26AB|B*4mf XSB!LH;_iyr:q^Ʈ݄L=Er^ǯ@j"4!oDxck& dnu yn*Zux3q}lh登E pVL" il/>Dy`{] {tZߝUZ>"3'} I N%]$i)f_^Hj0`܉xcga ȓ<6`ѵ Bbt.н.C:p'ov[-;bXAת;pyQ]~B{;;b -/RJ?D%ݙG (IdT d~Vl;, ?1hy\:3s >kH¼K-mGԄffYQ@ÐAz;AʇuZ}mk@ٚx /4i)rjf BrQ6J6X?A p K4 "5[);?Zh1Yd5grNd Z#|C<*4BZMH9=.{{G]pBCAۗzC|46rQh~pH/m5pyKiO/ڧ~4:Bzw-S ̽Tf3'm~LBMo[;t#F$s/y|CPR-0Q 5k1U;ǤdCۢsַ5%Bm eVlz'eRLt2?L41+dݯ p9(_~JD`z̈́ %k-z( waT(=8۞"~ffT؎kPt0_"Pay @Cɂ|w$}BakRe]ǰ"~~75Сqygl`rC&=y|9=+!2[%&2%G=#*|ERMuo=8Ӕ4󒵉sb?zg,6ݍ&D1l*n6nSJד3}9PP/xhWXI .CWI*Ĥ&D]| bxDG';M8 +kuc/ObD|t6dP!eLxG&(i(~eUuxQN9~c\h4uHx:`& V/Bf`ϖ3{OFfH:LzXIh)%bvb+8GE/f=ogpGj$e0T{`GϾmsq e[i,]eFJq6LKtJ; d5U^Pu׳`^d}@sb鿐qֈ m~+788c]kǗfeUM!`P68n+ʤm"/g@'G952zw^ӰԞK xR`4 y [ڳ<)Vɘg=Cpr `̛oG~<6.߾|>qQ~mM&@tO5~r' .G7ĝcKJ~)7DƧa 2޾"LG`(ǙGZc*^ !] -e. ~!aBWܽgx釳RnOيP5H@7e^lBXdb2G2(l"ODŪ aTƢ# N2jX,*|qF=;+[-b'0}űXd[5 V 44_el'շ(g0* bS", hu\mF ߦPܶt,Gg\򗃼~σCŽT x+,|97i^gsr{L4TM۱ξzp`V3(rA9+VpQl'-TOXz`4#WQ" sOΆdU_9rB^0T:CU4bwAtܘbȿuof->)NQy"[٥HLt8Fq<8g#c UT)c*u  #yPUAWr@+-**Xkrj HgDemq@rL>DN8;Z.KZ{n ox$^/iDS~t{afE<4[yPفKpwRvܬ=&s.! }qدuA/ $toqxfq3 œ(7$9t_(,xicۙϩ{wgdp@C7X64Êŕ/thU<%Y/A_^zcg f9(+GնWN0|*ȑ 0!9?)&$Xj-V50ڭҨ${=~A (n PK]LJT"aF^<m"]=l8š&UFUsνRJ:Sr xe2JG_I=wR؄W&8Q.A֥{3(VZ@/Vv}],\<󭦜\~iEcدIc}j/XYde^Қ:3DJ)ȞΆ1t9$p&.R,xeIO׼5$`BQRNS E1GvugrGB=rJ]A}vW +BYLTvԑ/`Qz'MK"4& !mՕ-Keʨr.;..|/`T^M%sꡮ O!1d!㚬V0Y-Yp]`*yE;AѾbPo,_ş!~ݝ42 z&7(bOOu>[ Fe"fks<&guBO0eȭj[瞍&O2@ϲY|%aPKcNPA nDbU 05H}ŪtĂntssF5 <4#\j1y&> XDO.;zԖ55 qb!DB.!v'g_MVO\?q ʷr %}Q~!B)$rP4=U$mpzRdCXBmSw@JdFO@,Mv_,3"\RmV~JySᄙ[Mc(3 ~ȇlGzm,qB7yı)h) !QM_g<&^zQ ͧmq^nc'v.fĶ^ <UQi>͓@eg]%?M~y#0`RHQbՀic. !)X0 < Zd 5 +iwP`EF;-gN~\; tp JlR8Bp6ۑ^A)P![{ mxI(G*yt2P &dΪ%r(3OG P3XOuf*oo8d;l p )dz ~6,*V2cTaq {2K;׀>@ TM8N>]; nT:O^Bd$-W F0fVK$JB(ך>S(cّ?@Uቘ3͍p[OQvYf'LGL.ZYlfBa~[ɘ=ԛjiF͜x|#6XyPZζ(`&ZSRovi-t`N 2~S_:Z!VDslbdQ:IPm|LE-Ƚ.MfI/_uQ(3sOlGK4{ gt.bz#V/NyywqD'K$[gˬ 8zF FOre6;WSno@Alc㭰p9*-oz#ڋzwfBM=N#lma؇AFYMqvE> X",|jOIG_0Xo :{wDv9 +/CQ`ڸuy 2.v$;n#>"A(PW$8HVzr+n4گ䕂[3o*3Kb~as(*}5,Vy=@]b,mSgdl:?3M0֊F2= /Awm{[Hs5n>GIYqsxsЈ5օ8vљ|y$,pdIDe!l;h=xC[銢718NbZ>uOAf&СuQ<NA*tʝ'oz͆By \# IC*Rm:<TT_um(!= MS M> H-Ql1eHQ=RIM~hFa$ZPsյf_z#舞>zϊ݂Hؽ5#C 7^|@=u1[}YpEpC~% /Iex?k.s=ZKh=5T\=+^x/*cGܾj,f|0| u¤5CXP^%T2lnVcz28񐯩p~ISG@IP1?3 4=%xaɥ'rt!4®y;g`om M9JmmJ*jW1ղ+Q5fHΏ{ us4edt4HƎ>퍧ɕΉg#_l w,DOZs'׫Cs *AaJ=ۯf!; XI&4=xM_D/Lplh^>PFݟ8|%0sÙrebdhcT۪p3x7^*Th\ñ7f<TGpPZ)-XI+Pwps8q5XQma 3CzH!h'5#a1S٭pYeu DÒB]Xz 5OĽm K3$W0y=s}I`5l8 L+W'6}=8Ò}kx~`C'Aغ&-b?(ߥYU~boP$ Q.| 1Z&^)e&:,3P>H?%!7i8NGY![u##KpZbvLk!^`@!*/+ ʐgC30nDUv,3P`O1h۠};S#$aG. ع}|pzpIj|IUtcLi* '_X˔n=T^Ry(d`; `n2*Z}y i"55Jw`(M;4k  9Q8#^ڼm7ir ~M5thZXMVBLF@"4gƼ7A78CUf@%]^V*;e0Y:0ѿfdnFh6^wd\/ぬ'z޸3Gм>]>,vpo!2D ,p|]'`A0+?;"*"|D*9Njv+.jpbX7 ߳R/tbgHSNMEi*J<s^n|3FRwvԵv; ƔZd - Ŭ] 9)+XXyWR#Y{Ulʒt^F?=D:;i\n}  S!J%iJ](]htPg4=A+F[bc~CjZgS݇,;48[th#~_$–N_Gm : I8W9jw)/ 2$$fS%̽%_b[|8@&̤FI+M[^l ZPhp*+{[u[*,cYHey>VM-Z3ۇ=?:wDBeN)l/Lqh _uohd$1ȱIs{:3,\F[189Wrߩm{*? b2 չGSIhiXu<Y9e4l5O(,[7qPBghFC5 ׇŐpsu""2gU zCثSЬyB3&6 $Nj#V|Aַ2sDYr\at? %8}a㣻6+d8>5WvR,43) cWx;1d `huW::\>ĄH!QhJo||s~:ٝ]&)~Y0UQz@o/DZ[ʰ爷:2u\q{^42,΀^n+s>c SV?nKzkQ.=vc(8lTL=;-{6`>&N<&Z%FRlgm@qo8${؈grCUYbd;|0`MYN=q'"^BUjIѹHvjD-9Hl{vcV?O zB^H`CWE|@%zTdS-+2}Ȧs8ukG+24%e.r~2TcXW[Y8L.1jZC".alN2ƚѐ ee4jDTcu?t sӆ>8IY+HfX ;m_'ᒩ_ȡQj 'ctFirDp-F7tu Zˑ>1)]4iNTcgTq?D! c׍y8y*X-=Bm%@LYR<9^ENvz}Nhq:ٕ~ zCOF=r>U$ƹԣRRݙYotɬa|'Ibx^Z&NB;;@όurU}Ɂq5)}'KWcj)ayJr. JzDXp8RnawrÒFd-77J-c&UazGGt[iQ]i0} ^ِ/ߣ¢C5D lgO,hlf.gM_:1=5oX+g,o~2 G] EZ·.VJѶi]= `uf|%!f̓ 8\<Ԅ]O$K٩>uϪpGw}:1~](lҲhQ>!@_Pjkul%>0H^{VidN@.xٓ:2h].v+ h_"cF[{M菤.ޯbB\?uI[lUlU0fh貕Tqsɕ[n*Wt4U~Qki"ڑ 'c(iWI|`A1^ `+qv+.{AP-;,i+j]9ͬ>G4w,#,r4Nܓ u=cLJP+.,έjyT!=X J:6XMlYGL-]!F> ]fKZ[(|*MBQvShʵni'JZPL9ۮGAOyM@P GjsڬJST(DJ0;ۈ/NR[b o]if˒ ҇ /f󧖇̙]*hC]-R~22VEюC_rZ^nLu7f1IWoߛ( ; +fRsQ*wZ4c@\8[,(#C|,+E\O4' RzT{B F0҅GJOɬf.0-bf6gC|'0(FE9I[9#ˋ tan4bq?فr$ܔJ׃(awZi\ef ؃dݣkd12im=8Pd"!il%ajSsjL4@82X6E k1t-e3pa"i60KlZr/0:vŷ쁤waaQn٭1C-`n {\}BE^zw~ 6( JM0Z3f" ÑUIԿz'ԯ4_BDu$B_6 xnPdg|ח P 8-N Y;eQ8nJ^Jay~zؒ> 3OK]s( [ño2(J6.@5'*bJ߽Ѯ"O =  -b^_5gN/u1kA;~U&`=nZa>>sqX92cʓQ87BpX[D"r@xZL2;#(, SilY~:+8 P; l+sM05訣3 Rtɴxc]_ 11YpUn36-2F:?ϤNa-IXLI^J|D0=1?16r M?V(fݐ 5z%PTNG3C_ۼ`> N:'Qo 1xly ۏ7FڥxLԘP!LTJz%B`#x@g7[̴<9a`H" Yv .+,{Fn0|AUPJF&(BHX*!DC 5=ɘE/kĚ 'WOHhԛrњ!X, -//}B~S@ jcL6uJJYN>i-˜4u1Q|HI~N>|qV|Ia?nbm:7 9NeoR98~v/qN"QG49iͩ.<0rc̹&̑W˙:?dqP5ޞ : C܄pZhpcuαŸzۜ<;F+rgZJ\puɟ\/1J2Ln52"F < M °|`<_B1V^G,&3QU2- Rgyf~} #{D7JGjLvP14>Cf jD+珌ApMd3m EwفJhw?R!o|" -zlڕnE]:$^_;mfOc@K'>2E 5J>[8 7(qy.o}X_.>Akv"A kͮf<#eK_YY1/77̞%aqy }&(U HCfosy_5K)ůx̩;WHQpÁk24_wɟNY]9ʱUvlɽ@S$MŸqs:ɧT# d c&'VRE0H_ %=&(7E.s)ZI7w:Z g=yPqlG'X!!7~~l"#n 'E[+1JÚx:d|'ߗ_ ȄrC"[ՖZvz'$I^jlPNXӷE۵7*KZZ_"}Lyb.mn͊?(^`fui߶,]Iɨc62ϋ=\7.ӪqZhTרDwё k|/k^ N'x?( CUEo둪(/mU $Rm~tOS w7[d9R2xˤH n\q[#Q 7]`ݙ"ErKJcU8\20unRĂ^Jdf;0ᠬeaj{&_N>XsԜ1Uo'CqbYaJA2epɒ.g쮞$k+ʰլoc,&NoSZ7b 2S&-N*=ᜦObv srg 9^ZM]?2\ɲ%ʝJ6-\|0k&TFNOy HL}S$W  Feڈļhu61Yi=d} ՗n9vf$M9~ ܙU3O/|)f"jw2] uJj?yԶ"1.?&ʛ6'&b}t^E bH+uЙݼ9h?^WpCj۱ 9 e\-LQD"UcFP5\Rt?˕CLωTMj/[X=ʝ;U%YG}4/oAVD͝2?iO{wBzcz(/[\p6N\)br.J\TRM&ogk$.MjL7u2Qr;i)lK[/n0Zt3$0/1)Fx?x^ѽ?d~HޗEnݐ/ЧYWn ˣ5-_}TNmq-m^۫J sU` [2=sulnJAxhmdgs*ߗP]W˙FW ?7.s m>=X&$fXwn=Q*1r>Qn! ݹ1Қu/ӵ*J 1NI 'a&<:܊lf tLb .}55; ];NqKD(+o0deÇ֣ VeQ d~"y\)I.!WWjΞ=[ʙ:"HJtX6yشX6r,$lz0'@NȦR8*Y>ݜD 2x'-д;\.= ^\Zl\l^P1e1 H 12"v<'0*NԈ؈u6'S_O g %p}YPY@>4V)'92YL`j[oȽ;KCsG=j҂t,`1IKAk}kyyӐ[owk/J`KMLN- V2:됈>:I޲lh]]NiD 0\F4~X6zaة+k@[p؍Hč\-^x뗊GkP`^N'Z'Fu+&XX eYl@$j=4z[Jm8W6lPɴؕyMp8[] /lf(DXPWags$`f*fO+"@΁!G_V83#NB^0SQKƗG&jh.yyYe)3¯ԮGW&n-KE?'QvWmzJ,3;.Y4ewM=g.X}vVm[WK*q"L;oAZ0yǛ$UjADqLFuef4v8nbEr \> O4@hHsíҗ9ֳ) Tm~Qܑ@of!٠ kL6=H<\WHG\tsޫ0}JA(a?gO!h&Fl1`&Pۦ\̾2/Aduq;{}`T4-{k`wIG o= ܡH,|ͮMEׄo* 'j@[b&0=8`ժhvr2Zh~'Q_BACR3qV,7F&+A\( qÕl2 8a,ꆁ- 89uMϗi"~f7Rkоvɏ*MP :+tŷjI'[5+#ӟm, CMaNRG%rSjdfL~1YA <[`pOy<=,,yt䐕#?*D֬b^H1g iGHS #[7k.!H<[̑Wq7nṼ_avNlǍ2[r\nDgQYx3tF Sdڞ:I/@EƧ;HuG  N/2k rPcO`.ayHZBeL'T%v)D7E< J`Yd @ykyߕ~Wyfޫ~99Կ=oP+aK"hOޒ mS_`o gYxȈyMra!oSac&6BIZ:Y3H+o i#VaMlhxp0_Jx?WDf@f{"@qGÖ?iIKEy*Wdʆ4TWD+{}LnD6]d肟k2y4BͪSomۈs:l }MdM2x+\wiX5ljȿ9#\@K{Uɸz:D^d8bH6.Q>9RVAБ!b2RH*fT`~Jw"%KCNO"[Nkp7Eȅ*FNl!y:>'5&0㻒10?w G;в6{k6 ۝ U˸ 0r|Z0N+]I'xz*hH5명yL#>lGZxj!&qт#EFk_n"^b%1W].AH39?Oc#Y >'d/O5K&$WӌIV`zb r$( c7ψYLQ[3 Et.#) 1qQvz&*R<4 b~j&A4:j`Ԅ4q@$*bJuL|T0z4,I@s{w I ~jhAoHH0Rc&8{3HD_Z*x;((סN&uIrcW3SHfLؖuݾ!0RU.cnX?ѯy;ax/Hku:뗒CrDDeApV6SGO ?c@%.L|^yG3p 5SW !bҔbx?J[ɪOت̳Y}nx T;kYrG 8VFIHHs!kR߇K4ɂ#x ]'XAEm4@\ aWZ=lALeoAX\IWt1wP Ewȗ꡻3껉^e@!&ZI9V/,& oǷ{ްhFn ǔRT%6?9j8@qYufA8 zRU(Y&ujDA2|؏}d͂Komb>?,-P+.ւ`yOsA:QҫdZ 2A"AA> qrM$+2Y>_yv4iÏY5uQznTSɺZ;kQ|,@ָpLj:B1Q_AzZlmYIbK ')AAT]( #"C3`80fG${S(YO^3cIԝ6e*,=*!|;TӷFq:!;N-~77հUVo&Vs33I0[wNR9p>-]S&pW \`򞫥 Wy)ѹNq ?"Ū6YU*bԹ MqS#̾]//GG]FQ*+K= %ò ^#OZs[·4έؘluH%uƛJ:H[=dgkA7-cy)2r)\!*G\:FҾ»|O;=tG)Af+ M( Zku]PDLta_@nMFn/:ZT)$( S;:P9A#FZPSUbwq&,zjHб/{$W<=^^]Y\-o)#MrU\Šխ=2!)|aRh8^rt76"Ӛ(A(c,k!*sX>BFuVS^Vc0hCREQ6y=1WU2ޒO]1ʺDbP *CbX&ͫhO{ i)>]`Q:D:bM3ղF:=C $Yvv?OM/Dڹn1I.c ~kX!ee:*u.k=UgRG5JGR#8!(Zdd[5 G@MX/0u RxwRq.Z24x (;04,OP8I#o:AEP[9dIbВ{2ݯ~5|9lr}cTXxA[ Ern}HsRpnϹR$nH#˛ 6TJRU $4܀APGqqmp(!Q_45 4ϱaHWI1 9:17^2q!9P-yNF.j.0t]Lo#"T?6hmGLm. M}3~C(!RU"m_T NT }o(TLEOvRg?J6S5b ^q omu4w1ԀO֍^`F7$˒$+ജ',0Jܜ_D]UeDJ!IR4*A.4c zS|dOU=7I&7 IJW\a< ӆm(Gq,i¥u4xpR[wEJVs3bȉ{/_J#CI#0t,kgqy@xߛ0>RxhTIȃ'=ךNWL 4%T]43؃:^M6P'uzejJpUVDcP',G6(L52V0¶1!ef5 ;WF\gdD((){2Cla]#lI=*VTռ?@Z,ܳ}/l{ӗ(7J0?Wvk}ʗ)hcIº*.Us:oredc> $ KյyǾtZ_ ج<|ˢᙜq>΀.wk'^p>>gLFK50 8I9bA):(97Cƒ-ff2i,/z᝽K8!bkŕ#X(3׻ګhg4jXn92n. z lRfx% KHԜ(<}0h[J+h'q,2p]1G$!)|jX/xqρ5S[YYTop% -b4nGvM(/ |`f}'ZE⃡)3r{8 t+0 @~\MmٔQt$8?$Op7x|m3~?0D+Y7␆?BCFЪ-fcI+-ybI#!x%6wߩ{ƛ5nDy 0ۣ!d-ʵ(jKNV)Q7&B.= F n'$];H03;7Vȩ4O~N-vb06(yGw(pTRr(i8 e`g-;67s.̩,CXܢx|zda 9(aҸ'~k*@β8CBBjxp:|d {&ߨѶb9[5Eմc]})Ϻv#L(xh}4ׅhhiP2q*sbZv8FgI8vEӴtd5bO uk:ײ"V#,&Ȍe9e[_KZNkFM܉c9<*䯚J,i^o!c3UHˆ0OTK 4) 0t98VJMlf2е+\(VW#Btv |d]\kԛo 3$tپ\^V2iSh}c3?5R?ҢYV2})$*z:!;{$)btxl~2gkN9i8`P8hLbې jIyp1~>`.G#4$D]:;*7q\@Kw ol-l[̙IZX:K2z!A$2rMKb|SIH%L3/Pe ‚AǶ\ٺ,SO1>Kb/;K}elU?p)X.gQdFhqA 9_rUf$Ev4$ȡ*ț oqi支pdAxpVz $> 4kY¹WTT/G|7(?1K^VvYVT~o$(}O_?.y DL?DeC}TtA=WvYIH K iwGJϥ%m`fީ]l1N` {Hu)ڤOtpoQ[n{R <yRL:,YgMAi,޻TˀazjI Qv^CXhs:qko&ۤ=݀4cOHR(n"Hzfk\?@R +W_PG.KEGYuѨ+܏HYmk|8"iO{؃feG|+wTl& I[u$0AT[ЮB`E[o7F@yi?#+A@[%>tѾA>{Ygo-#H^5BoGnXCuYE'TƗt^AvI^oę>O9kׅ]oڨn Io39e٨WvlJY@=Eȶ,;K9NKbxU faU4-#Rql 8鿳Uͱ++b_p Q^Z]AΧ ߱2 IMi KEap|E!ͰA7Itht¾43dP6#,OsM.kqKm?F~ne?um#Qڈ($_7T)Dh#()9%ښ2qJ[Li,2+~7C9oxO,/n" vѢR_ze"1'UĄlLRR"pT9!F_GY ԴҘ6=,W&2տxZK@Re)ҋ(Ǿt\f;@gE'Z#ɑ=זHid&qi؀r攤Ӈ]O0\M{ ^CI7b;һTz572]zxml*CAQg˛+(3so;OªG&oc̤")nH۸`Ca 2tI!OiC[6KnyEW-?v ݘtyu;S G9YCYt6/BHmeu`4qNz&>84WW B1ʻ|IBbk7&ky?eux4E^TMm Ti&uݕp4q$#b6/Љ.# Xבc.W^ۥ5OgePyd+\? ARⴛ-ymnۛD~ᨼ:tu ElE`8t{ CƒzM6&?S?jdEHc@Q,Z$}`-Cn'0cIleQ(,U^ t h<K3J-WL+ƶ/-c0 r| 0OCSҍQNΚ>Bb^|7csK9Ss( %_~gpv ;+o&ƗZhj5d>Bpr o}LPl D;G&*jXY&AF(N бŀ-#@idz6|3(T_1et 4‹/X6V('®ne>pL8AIds.>|#V?y ?Ru)bPv 9`m2쓾Q&:ly=y w*8,.ޔm'tIX磹)a\G9cL4ޕ%k7fZ\j'xsz{`<A$FIz9-v" NX??G3t'=\ o S "W2$(Pd'`>L> ~H@ T_9}A8 JBp$Dvx?iq=ӬwxKQPe('[0.u9lk8ݥ`,Ka/No6 iejn6?T_K'gCzܡ Z !-;aYg2:Q5,RrR!]ꫵ|M~bMCaԀΘP>Qi.f⼟$LA#:夈mf1f8+;V9hf&OvQ'Rfs2af߮o,!W%0Skmo%XŇ2M-Q&R!x͊&_>-%RåCaP'm3pLd1-HEcoOlޠ`@jw_cj<\!ue|)eX̽ ,RTVt_3m%*r[Jzx BRzP 3X;DWJ ҃=pXꍵ5y_NXg2 ZHp;MZ`0 Fw✿~[ RZhI}47O&gw,ҌM=Nnq"gI -݆|̀-'hofLD ӓY¾nYޔ>.l|r%-:uēigoxjӘ6Q]Mtkߗ \r;1 ͏pص2Yޠ#mcvN;gz%|NXժOil;ejʈ ںyVmVLGtuӮ}1a`1\# 4e CmR`ג:l}{lDP`a`}LJ*ȥB 5K$>4 Y>e BdRvi3hQS][7?YTI:|ϔ,eqH2OcQ[G'7Дтl1e8, /etq?Zb>@w2N|j2t2?hQٲ<9V_`{{[ {|9BI+"Q/0.i74ZSXu:Xt*$'փA;9vf&R8#}? prq^A2 3Jz>uU1k644K%)N+qLN {ci9go L90u@+z Wyx y^v;7Ae@dpTl,$ߘgv\tP|Ā$5vH`[|{ҺXu&OCu NR&j(f&z}Rxar0iGu%!8q\٢Ǻ4g8s+;b4Hl8M_rURUҲiUIlW+#2ž%TWۻK(%,& }wC=[GьN pɼ0}?p !؆_B!"zARYXOZ=l b؟bg J.DnjC>LP8iO~rzz˘Mdi{ I!hSqlp2kűf>9BgvIQ]K r*R2%a!fv߿A,uæ;x8"'T $KSYǞmHᆐSԟI˩;+V,i_ KJ3YC`c U,Gapp[fsh(Fee2Nl&E w4%+E~frJ_ ^ew ,s8V*&_BAN'X &3%` ԛs\p74%Mǟw%fFsq8(SK]r%( rMu'鼳t+ {u"0K8.K3/Or YSc!DmIh7%^ȣ ;Nz`):ѝ֒wO ww🲮7$R6Ϧ/Ǝ~BՏu^:js'.a+޼a`Qdgkw᠁QUT.%KPUڟ!*u!2b&[RfKbP8I@- Q95%? \mhmxwM>*7u?ٸ"{SZ8 R#;74j p5 ]#JRnuB5,І eU#nړa]2OuT<(E^y]VJ1-w|6yWp.jnᴩÄQ-zT$ |D AXx̩]SW?GZ|IE}yaퟭڮsfnri4pi14Z 9iH a. 7?uV,g>'=̾ DhtjPFTqͤ7+bD_3 `=쥽dU'f;/C]c.AW|^=Plu!xT(Svx Ƕ8kl/%F :~=:֏\MXZ,AWU3'rAxLx>^SZCX .#bZOtUDx`sQj#i@g< XV@mjMu3p#)x(-[hɋ)[ϋ'僬y\uJ\io.+"GyQ&L\ PTaJ4 ߑ.<1caO[鼣$m2{1D^!>xlr_|nH5;B_$LX[UJiw٧CDϼ=0*xkLLq¹' LPZXMX} ڗ00<X>^Y*8AθK/pHe=Qk讎7^faBq7j1 fx%PKRtPd"|{LdW\ni+Þ}љ 4NOZj-=N擌 COG|؀zT?uRG" 1DTkKpa${S%e{ 4PЃ"ɇC *.CXaw29h'$M)(v0gY]gf`5-Y@>VYRaJ2T7,3ɒj+ EЉ_+cۑyhOU(C,'bk nݴfAA`Te}d&ֱ;4뛷3n+ ~Uqvr>~ג\xm~{8h|@\z ]i).;;4NItN Zn!:C(".Pae5*9]|zQ)]_#/72'sAO<*J|>Q!q>R_X^uԜqlO|? QG- @i4)Y5pCnX#/_mL_ϴf΍ TkG4cb֋,-&4理jBJ Aܰ}!'}-2eHZY@]X8]1i>pKSű3pL%/ڎe?PD]oŀAmٮ\80ރ&8-j]>5с)`&"c^}&D/㑖Aw})Z2h;Z5AF_C_ݜŖ6lbح=^)z(te"2./(9{Coʽ>a {ntʇv{"(CI;gLOyWi w2a+uYaH+(IXaW'$q1nHeGp0k <+G/Z{0P1H*tq:펫{<1 (7Lu Wߞ3sw58ɷ~' {kJQD&47T[1V1>:{SlEAjA[TofLvpIJjYl~:nLІ<" i-t8P vEwƙ`i_&h|aWDPR%}+ݷ }ӧǞsfh1|@R|[>%'ty Y)Z4QV|`e<ܐG׮;RRQ,JyJ#{ ":0d't.0+~*u2eHӁ-W]sw t{E8L?9ZN\v8Y~:1)tp`(+ڧ6 vMa8 \rhhi x i3tp&]zp2-ZqKFyTЗ{v![ #](Z5xX jN=y"%m{DR'Z9PGpce5ՓhCxסiwn=Y4ׅII C sj&\57e:%WLI>a6GeϣGHqO;WQݣkB_!*V"I;raKl"h)* ~zlxd68Gab"6à nxH݋ۘw Kvj]쿶 ְQSrǚ{jUJ"8 [P$pUpʮ@8B{+,ӱ+#:3% gL,s?\bE56G p̼y{|IO=|iX9tc!$: QKGq%oU}|"s>]N#l5$UpJc/^-[*Kany,>Y4xRf9YW[gnܩ7>_QD`bEZAHŇaF 8Hvl^;:+'v͚k4h& r\#tkHR;j"\\[Ug &c/\P#zoAy"[_7ovz%Hb鲷mdpq<ˋp/}$~O$+gNl ˡtbU#x.ȟ13׊NP1}A#ȗ@}]zK+o7)VT+NX [Ӟo3ͷcNɆ\f{M\}%A]q:^`WCA3"}Q84ڪYtIj7lUkujVDA[mrtpybnPG TloGajn \˅;#F$Sإ G>5&[2|Z; )?$M sWa,Y3,Ns!.u`٨KD=>}6_rϦRwg\W @@wJȂ&WhU_!B?4 T#{c2D qs'MѺbZC\.M "S0kM+-[w+fݽIAx42 R= 6 /aՊcӆ]UB}4Ȏ9B/N Oߔer } SOR4~j*\,?ԛ_O醔j\m%*6\x [/ozK[%-,b\8JA70ϔ_ )!qһw]h?t;X4l 6[ Qoͬ[)f.vK O6 Rjj]7}a$t%Ѭ8+ SOvd,% ,Zd !?̹-#`bw4d9u&P5is{"K\%JK$mV>Jvt1L ?߬_JUbj/8/h76 myG 1RB/xl]\-?0ћ"GwI  ''rʙB>D$c|,T.vdpJ|&ygl+?wsws3j-/Ud`1AG岓7֧UR:H!UГaN"X 2 dR'K.۪';8]C;+*8-IրKW/(!$cH\4P|hf&t(@Y5jӳy1QbHd9ƼT3$` 7j^m۪ëmJx@_˅E$ŠFk!ZFiqdэe"Gcy S,Zk}bn5 1؊H6/{-@mX"8}} K*@÷<&)FSc l4>PT^7m4G:`uI3F}Ë/:NAeq1)QUlGٯ+(_K6ҹ>z>M֠vLUr٩~L.ogK`gg|p|:B\ USYT1Ao9*Do' kUq*W2yLCubZSPm|R>:W<. D3kZ$qk_C9ymxںŮe@1Xy]r^j-0 GL7uԾTfٛn1nȪ{5#J1Yh@JϹ`hlV'%2ڇviI1Y7\k,8X/-u1'.DxDe˯>wuH+ӈ{)ѹY [cp-&s"a E.)C" Yg4jdf|9.'bsꪲjwjݟ}*C-nݱ_]9I%5nn|sGi+~=LQBҘ 淜_KiY@.QCڈ9`9bx,ӨHDeyӋNW@(f5\?:t{yXS?`Z}KؖlJ`gm%ݜyA_}즵Jc?PHxi{n!]3R"YZrRlDrt\TGY^t4FdLx0ϖ"#MOTV.rνq<׊)S^u ϑ6(fӁmowZ+aCT4 x4ī B 9GI.="-?VqtŘS5EG>5g 38? g.?`5|%NL|(-PMz# ̩J\*mB9rq0u'BvR7xP:7⳪JQ vCR}d!Ie1o̳0G8WBI/GxuW _c jkFCqgZoUZ/ B1 @(df0NZx 3dz*u0o;PGWe!hul"B?{D <џ;H~ 裬'"13"{^,%p/r p\,.OQ# Bi*ծqAiOMr>bo {#jG੽vC.prזFaC 5=8 `l>Q5 ߱ڼMB! +nj`jWAFFv2ߏA:H'޲j,굼+ů~( 5ꃳ;СPrm#]L$d zqwrҶcdy+n/L7ղI KOw\zFӤ)LǮJq#S*s׺hQz "^;!$ '|=qm9K^㖳F{٤KM׸RdDGK4)W "=ŘYщ'MkRg.,q8@=?, CGДdNVm$קUn $T?T |X|4B 9Œ/*Y'% 5g *l,M-]T*𵚄 sSP$x@Ajۣkdm4D?}~qC{ßl9d˴K1ZLƏL34 +&3dMC$ sQgIk#g~ 跒Ku(Jgk"L>Ƙ$4A]`(}":@K r,iWeiH~ˑ~H瀊q mQXT )?נZ{Z_ĽoF+1C6Oܚ5426L:ùv^0DcAݡ uNAc,#r%db1°rz5ϊC\W͊]ML E$\yU]h>էt4yxJKUó6LphVd)J7)=lh[I̛IY -;e;C\7B>;hCݲ n4IF1V:G!*OpyWxM߫9q@lgADHƫnwd0С<*J19y e!ۋ 'Z<'MI%a 7jKe!'N#dn{$oH+i26.1-S򟉟YbggojHFfE.w8rf*@|2u Á\7C,S[r,Pn@v~C" zH9DXV[7Qmwѯp獦[K5}vc 8mXvnV}ъuZ^: ޞ%>cd61h|)F€Iz$Xl+ͤ Z'e]Z O0S(p #P [_B8,eF,-Hj^΀" r|(;&~I։VрGU [[#icIQX/&9AYثB F0qH?$Wu?N /P_)̠j5 E~vlØF -a#NNJRG:cA> D[V)O ~*>9_ ;Kӊl= AC;n楥TR#A2Axm-M5OYo!݈bE~Ji5XY0n |T/o)QjT58G{{( r8ϲ^F)&訒zc2e~Wsﷰ=Tk}3\> Q, Ҽ{эQbk)t"J. cĨO)Ƀ2|e5wNi?ۑܗA0A|P^Ƃ"*K\-)˘}nbb5`ȟV` J9lpPL\н3̺|1^R=}G\q1EW+|J-il5NEdĕ̋ȸR2;ec5$ $uy3+(zҩ$~u4F(_V+&f턾F'P&'M,9C! ]5QP~ֺ-trSCzp FxM0{7 6GCy>Ch ͘BV;Ω-fWg?gܣr\Wk7yV4ї]x;',x _W^,jmHw: Pt(FKvXXi!;דߵ% :tP6!ŏԢLƈnXp'g} n9a7Iӆ|) 4 $ߟr[nXDO/Qa{-`; OA 7 X!?nc35O.U=3)eݩ تU89Am:|?9[ϨbF c!c u (xPtJռ3Z#~'(e`C,Ef~cHy(m!q];ڧݜ.=H P驶5pi@¸BPr wdv3R g@Pf|Q6VM57} :5uP!gy^uvvvvij 0\x:s6蚬=%U: |i)~_t<幄 m5=*8S&Y;x;b +InVcX W-([=Uz;oHyfr F4RjGKl+70q/7@lrXx8V9f96ix'vA)š+ A{le"Ͻe>$܋]Ed4r:iRb#qѨd̀劫3 h̆#=s.uw2#hϱ!Y"AC?ǽhjvvH 6VDވȖd ]4pi~ގ7ָN&K"Sz/Μ.a~&̄lwI<1RVBTv̝v 𶝗~c">Zkl 6(TTC> V7g:\ѣveh>lʋVDSp\+J7~A[wY(8!(֓b}v1'BLz" }\ƒɪm'/@O yxAm񷸕}6y(Oiw ݐU w я7g@nS) Cjw܌sq){d%*k_QKUS t=IE>q`/,borB̄_t< SݒUQp!yIIbnQ8Gcy`ODf @sSs?&T%BwN({T '>Cu*NXf֗X.znJoqC~c;eni|t , (l2C JsW5(!A GHzRMoҝ%y#JyDb"#jd;X%Md%lK2fH^w)uoR Bḓ!Mӫ.sy ,i? PcuNt2;!aVt9鱽!  U3 2\u"kʔ #\}vP=(x(+p  ]e..BkYao J憖*U dzy `5ԔAud殴P#ox>PrWʘ=*8lb:sxKc;-Ay,sα72NIՈAV~g'pB[]kr *xݙ$BySgpFP%n ^BȾ c.aq[^7v=b}0ێ*떦̒SyD *w _L|Έjs؃fh=.D^=3~UW崱{JyonQ׾{7c!%b"!`^.qa9+2׎l8D؝u O>9qBxhR¯PbYcsuN[\T>$1=, Pe^58Ʃ'qN:+%v!"r~2  LMYaUti i.W4Rr&>ڼf6TǢ!x5 SY؈k;W Ijތ8-4ñ%[~g>*sC _J2ԋ\SN|u5$Á{S*Y! [shRdU취'eyD'*28M&+EIiTHud#Ќ^:X02H2|}=z1RDZY,H~TXghL<0[Z`%υ3TnJKm5vĆC[Sߥ2Rp>r A G7]Ns;zQ0ͬ'8r?hv ;Yc@'jIiNxaѿ$p0Vx$e  v̼tٶ :mԣK !HS >Zővop ׽-\=b+~p {)1΢!ĂlPպ];cI~]BUbT;4`,W6hjvy)]Z|ٻJipϝF!Kx#ZIj`hJj['-vUqNhGMr.4ց8EN4}M!NC޵٦l a: #iְҞm|<79>+Q)ųu.iUP.(j`u=o1 8Ih7Nm=[RV1{$DA#y鞗=O>Q7r mܓGp}GmwEбn=+Fv6IwJs[ף l>=y@ 4bOrtҊw;'TCq4׻;A6e@˄fty܅_&r@+|^|VSnFZuolp/NusPY-Lh'շ˗ZÂx_WQL| Ԓ72<M)Z6זkqA˨T톎 z A2FUz*AVjгЗUk1oiclX3䑮SPÙxq|x_ZVd oX{vR;}T7dp*9 L<&N$с9+K e\SS!kv\AyqzƪOG k#ͶefЮ19ArZ.ʼف+95gZhT*l"eEnh>טYvzB©^K*byQ}A !CE;T.JƩ?~Dak+fW{?KMN ygY!QWvR2ҝn웈$F%Ypa`% d# OSH{$J S_9v`#<ظ@keJRʹl(zz92>3g5'a\kgX8/S칾1t,Xpw9\Lޘ'2!iWs؍9#>Z(l:bw+%3;@=YRQPxAlsCYq\Qbn /%43L&]` XȇR<&cy'9ujF~KvX{U^鱻ƴ6H!6@6F"ګ5AzsGdhm;B]`YOsXGgbymUSsfɇ$"MobJXT7Pg5u9ͿR1jMm~:*础Sհ+OkPxICѴwn"ml=^iKcow Xbˎ!`nn$S[f No6%)َ8#<*9_7;߰mWe0Vf+-}ylWR%#ob301)s@ wa(PlV( oHWJy9fcm&jy &5=[y%'c*;%%RBn1;}ǚ{2V(Gz$J|h!B;3nJQn᠟~.2܇7}@94ze6˺Աxֆ=Zl90 Atہ`h9`Hفj@ Zs<;]l<; .v,XT쮫#ox ͼvdt V(UquqϖT7rwvmئw㰶ҬK͒ z6\㵹+ \9qgY*8%c@*ob2PHsNc?nB z'AGkV:grJ+&Ino(K2"\ $|'2(nnOĵ[' B :n0vB!eRbtu7Sl$εFH#b_{ jtSF$!N;~ 9`4> 9ЕwDpJD;@>+L) /-2%6N+τawu9ZuE=?Wސc λWQxEYW*Q)q^Tjy1(u )c>QASўQh Rr;iA_ 13{=}lp.`˟,sawHFL 8\9ݞ\oMb-y*b懹U8SѦoŤ$>n lDߘ]5 @v> I"\}Gk} _%DJxPV"#[*ZF55@vi}k?IY6 v'nCZ mK-4Ԓ{ĿB _*^$*d܍pЭC`;S3gKpKGq5ECj[ (B6R;q-3B?3NT-X~CS RQְvP!W-hщМޠ=c:Ɣ:rPfb7r;8s-2r =x~(|mbZNJ,;//amg;幱Yؠ?zMwY'1bXҢ-'=O+9( 5( Х^7mր# rSFzt%5va>TiPCJะ _cMgUv1Çܸhv!yg|uB | 0\umt ɦcHN;U'7.#K XHzJM#ғLLç\4 ئ"E3-{$`(pJ|ZRj AlA&i wti/&(ke rtVڎ nMuY{kFNVK;\SҾﴴVF@Uk}"eK֛OY}YĤGݪ;EQʕY}m@R ] 3Wԋ9N!F|4mbh 0 &, (͓~owpr0n@ujSۤ,$pΒ^ nN5} j:GɳAt"}l\ʷlDY*}0~77*\<0e*fBd .PzX*{I}ҵǕ:֜ x'6M3btxaWf%Rb""vgWzLV޶_q;~oX%8Z&O VfƪĴNL< Nv{]pkF[yϑ) V@M~be=$Eo#6k!F]5]˔vm "k`6E)iVjzk19h"o+ 4ۉNxi鋳 "żl0-Nн|r<+~d.ZxQ2dd#e u婾zJ9M`fh\{U d0M{LseQl,3:X]ISb_7!p5۾0}1?sk v =1AnF2 Lj͝; fqAWPxLLsD=fqb=7S۵`x.e"F$*,+] *QpѶ?dL^ W޲W6\ikQ=}&BF.i/ (LB#%Jjh+ل&*<#RQ5Z:B#3K6ḱ1d9=q!hF`ʿkLjPY(Ν.s$aM3XxvR|z;'>l*@z(e{bUGMqw;L;1h_v'@Y'lc-=gìgXS3Js瓻]9(`; v}:̕[TSyzhޗx[϶Uk;}TaP+a~+ x $7$ 4L9Oif*v%1F?+h΋2;0Ffhz .>i$SW*D aD&X!1Z3C f]pl1ŃZL NrUc*tg-d aL2(V zEwb=G+4 EC禆0n^Ǣe bgdZG4Ei?S-F &RJ=d1tz_+gWzݥB+}.h#0GdZ-B5 ;Gfa2UJ;*uݏ%,#-|۞x8Y(~;.1򝦾ZCqEe&{.;5XjGXK{+n-ָpEͶ^ǻZԙDc{Y4xXB޷}~ɸwX>%A+`RInT&"R5 UcvSbP$rvS@->eɀ=ϫEIuT+[ˁ:Nw)scn.jHzԞy}v78'9⭈.OO`V#Toz-eEÕF!pfpO/:M{@?C~1JR(~996䈿Ed^P < QæQjbON+`C+@ 4Qᡢ[fRUk6pwhF9j@@| ml-T!u d-?xXUʍ@Osru"|R<'q73Mu%7[Ǘ`}SWGK3ɓ+𬀹T?D܅olVe':KߵRNg~Gna%ETKw,0PBeA* t3T!Ft&D慳){Էvv5_yEGءgD`6xR?-~~'9o~ !9p/:9.P"2DeZ`lZ'fҽ̭NUTpvopR2 kTsf 22W2r?(4Eo<Հ/cpЩK>T|m}izך%X>n&sSZq;֛EuCXв2Upp7P/LJ@ViX(g ە AU}I1 |E_8j#'ORtn0~I?rhR 3Kh/wUS'jLc=I hRBЈfW?5ǭA|~פsm8YJxZ#& dkv%7B6IE'8E&B[S Q%U H}p;76GxUnl%W~quŻ򿇙)I-YI@ S\Uv]X!QπSՓkg]Yџd5i@W8l*DJ}L=H}P"b|/yW2_}6z(kD]#RٳrC"XP!)N4q ¿Vb]{Uty!4KvA Sn+5׊G TkTlJ)xsehtʷ )$.h#F_4\J8^"G<;U0 _jsdt /䙲P1;20lyq>2Cv,\l4&#i?CWD(m FcqB^/jY+',ϧjөPO&|ig[ E6N#42Xi-yڵ(Xe-~aalk+X%Բ|+6Iiܪ Ȏ̶4EXbևcWyJQ:+5[ZgێߍE-qށk-]LYtT-pA o.=՝}Wmu`t)|=ƀH dD+3\w=hnE–HY ژR#r9ӳԫǕf=<lAzۺ%51W颾;{ևywP?"gF)!?, MZGVHL*e{UJKҠ?ۏgwuy{ІW% eM0WP8K=~T9pFXB.sGՄv,lV)1(!#;7] 62B }>[OiI+ +p1Jc ; ~Ҩ:W|Fr>}٠&":65"=s D>qXZBWKp!qe=)̡zb^3QC(>BPk8cA=3 }l*<39&z퇠a~O8 ~uۚSߤLxV*cnO3 ։S\&!D[g 5ILn$O:z[!*Y ņշGFhL@ gcu%2僓`JqO[+~G(tg ah>{XL[hPSZ0PNj>s$st%x3ḰĿ7 SǗ8ޒ|R_PB{I_ VCV?tn܍i9BE:]lwpB8 CGRH xnUZ-wy l* t / D]Hvg( ZWpCl3;BSL- 7cWvץZ Mݨ=ŝJ-B"ngMfqhgWځgu%`,=1$ݭGJBQž-Z#lD,bթ8eC)ԝb؎I'O~ J,@m1E/a+{zO#qBT$>%Ήxp ?לCwϬf bRBQe4 6*- 'c'9v"b7aH"a g)tOmFiL1t2X˱? dnu T۹oGKP]jQT< ,I=&OT @ 'b5A;9&CBp\F٠ mRpNo.rfPCa ot.`Ocu4r I0cykp}Aq=xfa^74< VJt(|m@U ꉌe3 _:ˣt@I 5ptHy'΢mv:}@l = /J97udh~ Rp@tSyR7F 8 n Ryu( 5]QhSo%8y?Cѽ~FKDÙ+T^|qגWm s`^U2*]@M6oj:@Xj/{9,aEZ~j k3"sLCvw;2ސh5zuXQ5 0=\̗“gUXN2hx"'H{=hd/C]8*gQ EHhfpV6/ !$~z9u_>R#Ҹ=M=ȯ&Q%&6 ]jΌ8T^ mEW2Fy^WmVr2 :_Py ˤHRt 1tͣz#x0v=j(zuf댞K{&؝=F[?ښZbC(!h2OСs"h-JjFK2GkK1ĺY@K(&σ,ɕb@+;?zK79FZVݮ\f!c! 9~?RWA҉7M*8R'%>_pJP˵6! ~'F:a~$o\rV~-z 6J×}L-dE= qOz425nw,Df+nkkV#W"im;a'pҪEwȌ}3arz2̤i2q(XRЇYK?hC2K~؞ygzc+3Ch1:?Fn9oկ+>hs'"1]a0fC S&e^kHG.T j z"N7tءJ,Z=Zb)qvyw"3?hLZNMKUKqWJCtI?jHGT̰5ׯ{teul;l{P?rA=|qDZ|( 1ջ4h)c:gt1,"Lh|,CʂQq1^¯/ :((k@zN6LYX._qa~8RgR(sܰx('!NE1 f3z||] qv~Y4T>Jbqdq_<2S=/Ș]&~zgw>Zv{()1y]r% .HfByMgjapA z8L4^L~a0U;8LL%@I 4uǡ4_Ikݦ?#M~NMb1&wYө$v$ Q<%Mm0[:ވ] ,@.kĝX⺌]}mp}TZ eߜm_&?r(}FZm`]Tᬐ^\Y4PM1HEG'ذ\^>?$4;BpI`bPA<}H *')fq hM|=,'_ծgB*fU7wP>,[ϰ|W~}׮C2 ƚv ݑWpMM"OŃi?UGzO H$`)۽x6]o% o6fVR~^3iAN1Wi-$ :7G_8N]V_OI(`8g, bmJD3|ٿnT_$NuEdj͖]6>sD^̣=Q:J8: Cпˍ7n Rqeq_-^RXR`;QmEuhm[Ч[*uJ6V|ݡt n*мCZ1\XCuxçGG[ Q]1"kPf| A_TDdur쇾%v*3O=Zg5\c)}>R_˼~tn)FdX!WP`+`y7+uXdSW/)i%vlm@jXc,©k:ړE5 j]&;vѢd4mj6TQLjVN{R*sMJї$"}nmD;YrA챬C !*1~pH4(zb"]*c7 >5i}2jAۍV;AAƉpF,? ȥp7~?rWW4 (+OoO@-bFAY?Sj:R8bi_NE@NMKK%flC\?pMV9C"o!F)BKNXZbBmx<uNb сRLBё_~ 3KMѳymrҖʋin*>HEاX4@Zs(^}7tN!ե"IjX1 <>s'CYNt}D$-olx6^ѩm봉̀q5QZ^ca&H !*EëEđژw_ΤX 9lb?+b~7vMJw iebiZгo[Mig{ϒ%#^QuyJd-8c ΚGB&XE]bĺ_/N]"6EIefMkљL߂iM1{SĀIZb0R 8ӥqnr0203ɴc~3{'!濫m0Z{^Qki璣઺>LтݘeVF|x#"gO#pnCZ<9@o@dlg ?.9N$7%ޒd!b-ܠ!iڴ'ç.Yy_͔M+&˘R)O$WShq2=ܑ!s 59U4nx^# ED\k)$wVFH> <y79 ez$d[rI)X$bUԜW ;di$` d˷~C񴠏{Վi?"-p)qV%.-G.Q6V+KasƩ`T | Y`mP'^@Iw"JS^v<3)"W}MVg._(X#beTSf1rس[_sd (lPÞvAv^%hMmT$\UXm! :(@M濳E:}~'.2_/U]ր1iȨA Cul[z)aD-s%q23'95, 玩{o/N*ML"<{r0 x)Df |,)O*|aY+S˩=P$:D`bj]L OT h&c6tkǀJMZLoM̹;bod^Aygi9^ϑV}8W! yB+fPQv_0:&ЏDr@EoB<×nHJcPFl^@=DurrW W%[_M<0F-n3hmD`]WwۂRF~ߤo:ADbBKmؐLue#Q!r "Яߘ"#((V" {.T畉gaN88]Y' aR bzW]t>`Хfx]mZVm @OGY&tƁ֐;z9ë)KF74=A.'Y7 e.BmiA14guem?I,LI:f>7bp; q\>(T[^'@ɛb~iXwLJ#QZRQW!B!Q{j7<*H`]/sV^t4T–-Y fS ;:4w%ۈH0E8sOmiRH:*h9ҜE64$$@c."̓`n@R┴s7-V16?&D[Z̋}E{FX)]=ށv<{XO'{Z1D\:Z4ANIIT"K}˰(Zvzf]@w/u!D-{G,%_05[v&u#d ^M dӋc.Tװ97vO@`e(BI8||Z52Oz})n3?& 8H2yiZOqmf)W݇tەvT萵6\.Sc,u?,ʎ6˷]̞j3%Ic5-p1P"%8-vcO8/CүJ#Dei+^&~e;$а,{YE츁o"ʈIPXO.#P ?c8IGyǘj iGdH.IZEӨV{YNR?65/U&H4eAh%fG-L{Md1.)DQSvu.+gU\t1~nT{ڜ eSjn'2/~!8.ʸh%ݵx/Ohy Yqb\y^ 44;X o_=< My XK i̧@ηx7~hB?^tKё8_42Y*U|P2N]y?M`pp!@<Mħ(@)9lhJ Ao0ŗ+}L,/ucqX2kA2@h#֗83Y|=  꽝`?'N@-TvzUm4]ݫ e!*Ȁ =)53OoΞbduk?P]]ԡsu&@C6w!vA dxqB<&#);y'ev*؆qIh߿1z"#cTs2@B*yZ cs[o1?o鹭O @_`|[EI};->O8Xr_ =v.[Pӣra9s%rܛy+GA-GD.F``pZN>.fsz"υU-*8'QұM:o \Z44KjiN py_Nhlg'VK=%.; j>",L#pҊz% +&j{.#Pgacx쭓ɶqu[F:o5rPo2Y\qu;'m\EwlHϫZգ'a2st 5b찓C6u]'ǗQTAg^ֽxi]^"jUPo< WU{#bp$ss.Y$XfUU,sd%?y`  D􆔃E˛iC?xåJf&&*\JBZ˭T!و R1o"0:T22;!#(- "s|+]'XWHT 7Sřm]}hx:^2";x:eOň.9] ? XQm`O1Un!"p3΂nhLoBv{B4ۺ%ɩ+jIawsenD|-Ð}*͂DDL֒cU2 r,ȃyY.S>+rǺ=a(.MK[4݈ռ:,$b8ŎL82܆$܌T<31ے%b`$C'Z$'6J7k@Yk/m1;< 9c і?,)q٠qlw(?2 0؞|Iı9{nb7 $3͇yr6{>fj[f^p[8CcT 2^LܼUI> 饓xϑּ^chԾ$zxP~< 8(.xݲuCB,o0}rX3yM-C qâH-D=cĆA͈{%YvRO%ˇkjf@]q14@(csa+_Fݮ9C@CD4 Z!!B/O}؛oCK.?f oE?v:X;Toܯhz殳\X~O|ܢQxX cV tf-_y(⊠/4o4 >ְSAZX D7ՍH5PoܺYYEW//h}Ģee$& h(%.4`NR sD.F`hH܌o 3jEecS-o볢' 8An C;ǯ'KΖ͡ËxA= kW={Dt,k(GַJ\xЌ8ϊKh !V h~bmH5 5j~k |]vpL?i}YnH_䨎 jwpny;Z^b`TΑU45Z@#ūQ{A+hdCܜ,Nf3WMvbIߥׇMCůtw92le3;W0%X62#Sn,ͭp]RAqr9qHx g{}Cx3qZ[;&{; -Pܝ2/q2+$I+_&',ooV3[Dʥ_͈+*47aUm# Ys3_Na@̔.Ct ;cf>KG*'u 5Z8|8c7YE|Vb>Kܟw⍉ O.0|GwwT<ڇ6DHa&4%?z+ٍ4z_Yk~GW湦~A"`vDMm`q71/]s +*H0~dT %Y^6a/[1ϴ2J9f3&:DЇA^Gqyg.þ4F gjT-K}\?&_ՀXTA kq z TЫ&ͲnTH@ȥ!n{RLAVթ*x*m⮍R+{ \f3^`f\2_O)pt,#l۶Q+7FOKo9(PP<2hVT'EN\2ru9̽W?ģѵ/#LJ.D`]mg.8=u$8fW=fa\̢ݻ amI =cÝ~R{P1X!`ra#3Li.% xg'[׌rT_:\:s*.BŕCWt{gk=Y7!>IP㤕 虆98E_zN!nCd OPL@+x[H3Y!)qplZ?..^/Vp`ߒ9Aj7+] FzjbVU& vdqXa4KZOt 277)zQJ1@Ntlx*>igH4QSx584ێ&0}?x~أ22DpOr=qfu\le`@[JA .d(8J#A+{ $+ۭg*D O˺TR+xxM ,  !]Q8yu |3hc6Mco E$[BݴٜF "GGbb L-~VbMi-[#c7:|7.\75KX{5YTZ{} ^ͦfFx%=kN芯ӷ_]bUGvW #z:56 p*I)!W`Ėmtma@ cs .~0{CB2:VIX|L^^+&mcXG[7U^y ]*_>{`.+Hsuw[yhqktgE_#qדz!حL _TRPr=Pդ= ֜yPbxZ;e~U-JƉta!aQ-:nxX ? SgsF$(2z_W#.9:g-w-Ron3 ͷiTu _ug+Y}[uq , C2HYkRG INt ?c,e\=óm!v]rKQ9Т:zN`՛+hįJ 5Bxᓥ(.l jͷ6cU^L__dJξẤIПUr] T0U`k꟣ڣdmșQ3"5 Â>үV{4'CS㶱|v}R2PGrZztU!P@ks"WEw,jmXDC G=ھʧ6cFi@{<N3ʓul?|2/\AcKya A)<"@-*֬dVXW0CJD8*zn.[VjLh_P^9[kMX̗6/%QjЋQ,٭L:_bMOVz1.$m wƸ[(3="Ws;^0Uq3't!/QD &kȦueuw8:GI(7rxE 870 q>T۞;~GSki\&N%)MGl8<9A($m!MxYVD5?+1F$JX|eOU@8aZGop,%vR&٠ u2 9&%lu<_T^d|l(jJt=Ynss$贍1$7s)KiŤz \OEB WB:"fQoLExtOġɷJ13V%z~rmmEAmLjc%5*H!TlD?j s9cO_hȁ8q\Yesh'[KKy"6t91rB>fz ̰ 6"AC;|.M1p1 2-ƧiN @{q s= <([fD^Pf tg*P$NP<Dh/[NF3{;;W'< Yf߻V.3NN&WBHڤ}աJrN3P/_?-m)i⽫brmVfu,%۠~ᥧ .;bߟς&OJ} |VXFxG+XpPu> ,up;FY~Fx6MkmhDN A$2x2 M5Nlc?A.6-?,v`wo5D$=}aQirPfϊm{AQϸ B_4$PۗBT%+$\ ^CR os,ؐ&%0oXL\\hyx:k9';g8Cv1*t/74 c  OH`E˝ e1J0V`i>n\G :䐱Ы^v}?Tآ.Op*_Dr7J_@]qh1R[+qi6V[/9r]2I(+O38 4b/Y,-.lx כ u>;xY\YmMJFEM{{dhRʧ{j v%F % OSFA3[o9p8}IT# JGϱ+N5:_~LcGz F?WWvZ(P ?}NLb>vDc,)+7K-V2yLJcj3RæWF 0h~we逳||y1 ڵs rjd.6y y׽GZ Ux41^J>h>j2M X TA#{u ?(H!{I`'G#A!7ۇw/1Ol}*[hJjQBM;-wloz0|n"gDvWzFƁgd[{B]o*d,S&8N/R4/=9}GSܯ8X}+:IZԋdBY:ь9kh&#v/_I|i n`qHqw9(8ZW e^8=갩6za9tk|ZץC[Y '.ǐ@ϥ;qŖ1Oiv`Z)y+m@AJXk0~}9oZ%FdoÅou Bx̏OStũU lyIv=0g)wQ}~ Fmh[g}c{E _/M E}$k3•W6ye0(6HXgȠ\EL^ 7Y.K'>FOEE5$^ov1m<81]u@(E"&,UK5I](ӯц>PL>^vzEw$h0,%+hO䔈Gi?࿔R WC+8uLyNE+2X,gDE,E^(%<4NFR2ftR ,iR^|Qp#in {Q˃OY4a~⓲ՑT#o'1 Ȝܠ=`*Jv?>HRp4+誜Iwؘm%x@:vŦTǓHp3]A];tB``ʜY~ՠ":*]")P{qg4@apnhye#:q,%R ЀSdI HRa{G {N,$(ܟ[oqi,AE73(iFV|ttBQ~= 9QO06$YlMUN 8APPv@vR^": zDz`Z(>#4O2@RGK 7On^NT<XwUQ z-Slm/m/ -42|!y:.<$ F**2 L_>@5/RFUSHgHm1v#BpBƝF6Bt]Rҋ$yB0jXE|8goje<Ŕ-DG. l> ;T4wt]Cܜi!3Nko,rn~`_HB+9z_=G͜5_*W  &oVb~9L7}auT?󨏇"c\m 5rP?Ȁo2Ham_ZQnҟ}_FTz"*3@2<n{w^L/d%iqP`]^J˂┒ZQFT^ ഭWm PtOQ _6Aǚ&Y%sh2V"tKt3ё쭁gw,2m1a_efw$*^L܋1AbmAs}+ rۏV<""*~NU|}(wlB٠M٬p(7"B?u^ziKqk{A{+ddid?cZjC[a^'EHp̨l_n^F_TuHА=d{dnlnaxikuz,{~Q(nQ (wW"NW P1+)^Y~gA^fҩǶnj_eb6MvqTzl=_H`B@`cC73g-pD(=Oω8-vGRQG׮RWSy @nvH{Y603m/m f5B'10|ሷFߕjqPӚi3{r A"#KTX&< ])ègӻrdӐyt-K\D3uaCp1aft ./FImq"̛E7ڹ>Lf($Q_\S̫8^P+DJy^p",#qHV95C:[M|CEtf-#1&3vE@7yCi`kF_*/sГҔ[GqW e b?>xvEmv`Nd"6X f}y*ʓq :):`dvtr}w] Y@Z2_/uҎ+`=ڣGL7KM ӆ!0% "mxU 1f5(!z0@ HJf/,HN"0{PE3Q[2*"5ci-2fglui\1<@Sk08&5KXӷ3O~ldzqD1˫<1~ցy<-z()5!-QXrY= QNGE_ZswXNyHJIev~nɋT`#$kN]n?~l~w-V)$r>x2i$"*XHF8mq ^vJs;\1L. 1к_5Y3:џ5aM!p%^>>\/2Br55yc@f>[IV&~90a<'4Q NN].DB!98C35/} +d^-WF,DGy D$J8ɐ6K}/6!cfy"IUDEck;xώ ;|]5VhFHOC1%+휊ÑB=90iMpa4 IϴX}Kʹ<0nj_'HtGyh;B:Z]kK6Kk )q=˞$RѬhY IvU,ObW6΋":D 3@Suטw0^* +&ht3HPoL&10&lT-5,i3_`Fzwv-oٿ6^-* ehZS/͍ueMYɛc:W`ҠchT7}@nS !`vU._)J $ר2s MZRszH梻~,4p }\b[ ix`{P9 `9 4O6\{b9ҟ 7d`>Q@؝ !޶@QJW(OD";)Mg w΃D;Cg I @/ ނ+ Q WV @mf0J4yKϋ9ޡ?X'>'X+UDoRƦ>3%? dyq #A~ |e /TY0(̽meĻr\c6,:bVnh%"upTmj1m}%&>]\ w n9ъ we Ltx3VW}'*60[J P[rt_:ԑvMA>)߾X׶f{e9|ϻbA R6\giG`|%%ZA#ŋe /l<&| b~Bץ{ynB*;%ł q98'[)]t{$Nq9i6N7{7f⋄D-n EJ+ݑ9b6p.E])63 \N 3fʯ"̕ #r7QBФ- EF }91Lme$-1:atVtt J]#G*!{QYmziw Ѵl:[맊OALбzS' ؟ YA&lyqE(L0?d4m4TU6qvOCbcجaMM'-$ Pۅʍ<{7'Pi#r, 2, S('1I,iR^ˡFxƝ%/SQ]Z@H%4fcBcy:p_8M=ZZ`q?aά3A{c|l0)ne۵T%eB(ARBa{Dyp5kxQv\[ RqYvk XØ[T^ܕG$9%3n A e!҉җ*+q0cAx;&})0̌td~2u bHL0%82hueGb.} uMɸiϭoNG7^'v,}P|\&浉"\*$RS8&'"$(k3ƿB"^];spʇ̆&0ga{>]Gwjj\( ,_x53T:zU/q۳PB23'bqɻqA4-lPPCkMKsT{0g{yx繨3+! p^] .a *,->lU#{0tdu:[wA"f{!%O$;ll[@ou0R_ s[>ͺ,݆o-`̢֟wP ߽][P 1œYUwx/%(=a  )&8)Rt`%G mK;(4eKw8̛INr-Yw^rx)kjY8ƆUH&)87ʐdz;pѶ7] H:b?vh?-"">Z,jx}HEQl|>AdO=QA-ƴO!rb|ح7Jïb%IޗJRZT/_T5P[w~#(wY \"10vdN^:\"~2wtP&O]Y"5oP $6 )U+-lW [&!, nT*s*?MqqhJ6M\zQ@Darzk!L :U;XHgZ<%7!Ƶʽ%*6hbK4< YxǦ}P>ha{M6b .BZ+EcBos̋zCÜC|\K<&> ҄tK&!8}jg ?aֿN:竌eB $-/Pq/g„+׿g'M8Яux?AJ*[2R#[4rTbkZ]q;Jz=ODȇ޹؝.IoSJLw+ 7 ^'qɸW?@NX/E%1JMQ-<fՂ2|ǿ^lH ylji}GU\@D$ŵ !8 fG9N4ac_AQ4PE HtuY6Xd ?( 4>VFUmDq퀻9VjnG.AP iw Wi Ό#D^}~Pq")S0ӓ66-5RZ]_O1xetJV_,N 'fTk*h^X;; U}T/ڵߑ/ !,1W'd?$szƇZ 1% ʾ*$J^2s5J$1 % IK\Q '1|;)1Ço[ա#~I/ 4FK,+\iF'quWj<``o!6d<`L08XwDI]tbjM_(R\|c$][XQmAռV3(y3 kW}ŻS%4@4ay܀-eU;V9E@ JgJK~׌xw*2<E,x '_৯SRb3onq2/=;aHQ1)Ef?c%htDox=1†8x/%.,Aӑxb?)^4 tQgί[۞*Jm̾Uʱf)?DŽSOin'4mQ/R:^h/T~t!7Cn$vyfM* ~,p4Aܤ(u=_G#/G;Q@}"nAOxDF{m7~zGvd{Wg*?oZ=#.wX)b.G'Xʖf{,ne{ }*Pvpq()7Ȫ.pnF'm!$UwŒ\^QyW϶wrfg]hf͋A Y*c5#7K絇<2,FM ݇wƞoϘ5zlwé죹gF_6 evЕ>K;:Rn~)XsHj5L( [OMfcl!Pp&#^]D*Pq 5Hg $D>!0c46l=] 9:[mɅ.8Ej7G,f7UP8[Rl>Mu@H~,r2 zhS!{H̋aܩ,r V,x,F av.qWT1yV*Tsp;ψv `wqɶO(u NԜ)qX\󟐓cgǏHgRƷπ.9*}Sȳy[_+?;X|{`d[@~FJdJQ!pڝ"n_PXr?F4z2SbnM0Z >5>m%?I`.z\!'xPC+M,go||_j,:,ᱽ+Zpao7I[.zrOȥK*":ۭpWwP֨ bguU%7㔔jR%l5ZI²JHf2ֆlIwa۹Z4}x[-׍bZPU v͖}Z^Iv0;*lf>t}"F FK}pI)(3&q AW9eA~(Y,;Ll"μ`?Ips& ZLCS*.ݴ`ڠTRڧB4 \ haK0hw(ty~i2"! .Yh aG+Iv],4=*w }O6ef--MѣjQZkV}»F&Snc9"aFa/嬛?YM5h9R=Ib2>m pϡ0EKa.Zb!a n`g'V%Lp3aAaHO{cT P+iqq ;'?]!$R+Bv3Ţz#wy(d3Oi#t(\0RosKnjG$5,41 |f+4m%dOK[҂|Gmj7wE~ǥʹvj+.  0H_ڮ&jЛF]z{YVl~:2U0?zjêӸIoVn$RgJyUMpȧOG|in=u,ءPWxE)co$PFWcJ,?`)e%.>G&[EEuM@HB|ߘvuT ĉ|BtE(hv^pr9&xyG| ɕq}\k { >i%p%;u4 [9 &sLKFF&nȱif "Zʃev&(Zq 3JSgKtqS;<ٙ2 1.кv@tS 8< /IQ`)UIjd<5r{0d9{tZNh?\~+InT&UOq$ly.h֯ \{z2xHdj>KɺbޅL]Kf5}CTL :Ӳ\ x%}>eV{s-E094>t/&!:m <3Fx 3`N}G'a<K0rdPb-7Xuo>]N|ZS^gQ+oRnf mC| %GK?ȶF0QRC34΋3e pƿFx$]CNXm򕉾eF{|6"oچfKufo'>J=zU#pZ@MY۠[BF7bC "A}+5 _1)D^&Rbp@4 I3p32\>L-HY_\_cƷRiaxp٦ ]X %rX4MR E%L &P _vm!XM{B!5KS(+JG/ s1*y/s)K"{">M?Uճ06Ä_d(kaQ(ϡ=#΢/9oMuG @O?8'u~EggQY'?.G%3NU X_+ y*׃n:-RC?]}Qր@no~c 4.bIʍj"AI{l0" s% бAx%_ML5]Od>݀\}M4 'd߬gRtVXSD0Y}4(}꠾ ɛ "?]&=`w{(klJ9>U 7*~oDzVT%k$ xx/<ދzz֍A3W5G=vbwm^ ĴH&K2Ig]qEBУ3%|;$5?2MuiUguF6VJjV(VhP&8\܈r"~gK;+HRxQ5'TdF![ 7aGm怊 {NA%-(2p8"՟5sE7`.1k 3Ԧ >9j-vtIXB5B|bƘL\;htbQWZ|C~Ck?NFs5+yRbWZ_Ul\P]~ L/Ƿ 0 @R)yc T :OtxJ@֡j Uq2ł{i&NRXu΢fm{% M?E+ZSZD:sX<=ZAp{$uu!MYg5o.Y|r<,?#H><6+%m劍`~Q(.OT=iG$2D$O"Lmf>v_V<1Gg;efƲ6:ULό Ɯ/o|$)-_{KsR/JOB#hf 56چڠ<tr(s׎>r3|ADWd@}V-6wVw!liv 1>&mp](56U a,G<́oOn#RUNY-V+NT-{7#qmZ4HK$-yDF(XK]uySEfj ؎xY.gT2&7 À޵@rX %Y&BBO$]TZQ?b^VsV&^Gypmw;bðGpꛎuӵP %ak.$P|!t} 1WKiR}"]ͬ.Ͳ/a+f bўx.q5qK*dABHJBۻHJt,[k2?/N8IFtne#pZP/ 1*ɬ:㉸.E{GU\Wt;Rx}w}`:2=6)BS 6aO6HrvP? $uZ0;\/ 0 ʒ^@@ބ % A m*{ivXݨ[+a+ֲAɾ~Gv5*#߽@C6. AX]k;ovm'#iL'WNEjtk..(u} ,bV㴴66>Y 1sm)h'%&UL +$UJ2UeĠW Q ܽ;wx:iSJt+<@m&zDžp9f]v2![ S?+'~_k`G+Eԟ̤1!X__A 14۵4a!탍pgG_W f<$6ͽ0&j|OaS"pq I ~vuǐu?!5^Tsî@NΎQ7_nda]y}?,M!^ frH'Ƽ2Fc_n &AQ';ꋬYρ|a Ps%}EysLyX ]2Zro{_lTkCXՏ(ī *N* s5V0~)Prr 2)ކ!=NkS!̴I-32tш)XZ uh5\ԭEQ&L߮ %']&|,bna7u%ykWCM n= N=Ȏqؔd򢺼9WH6=i?5T/,:LXv[.D0m]B3M%)(nF'( (sNC{"e*E_ JvP/Lsv@~̈꩔<͔ٖc* 7 [H +aRw`_m!QAEj!BFu>95C n1h2MW8y-yL^஫=96Fĉ9+9m=cҹUɡNu[@@(Zlputgwk?}Z;i"ryursJsI$՞6#F ,a|}4ikzp)Z0*8Aӌ=R,\D-dv0m1%/ߧG\QF(Pn}Q 9KuZѴ#%$gIXNBox}ګR&3O$lK\5N<Oˁ^a˃)^4gthk\({3V[k }4/ƙj ü-}zxF3_-=cXwViل=;^ܝXM3Pbcr(>ϟކu.K!/hF%aHN~iGIWlFόԃ VLfC#7qჵ˵}eRDN9#k#Ֆy#MPssSw$AQ㖹) 􊠹HLfdOU5c:X3s j#/,ҔXX; cܕ@cvV>"գVX1~L;8ޫ&8Nb"a0-TqG+*)3&w@;5=uZK0T\o Nz ુ̠?֮.49m s}aRj}sꂥ5Dt}V~M)T̬L*I %A͎\74$7-QshSqХ JQBT'1tݝ\[ rVWk;^[w#YL0[U)rBwߜ*@ΎS??yvAeWS8}#7:0+W̍m+it8SThP|Q%ݶ1d7"GN!%i@,᳈s 虱C twB+;v1݆SíۈsQsq^l!=3`/wH|RF{!Ƭ^T޲FӦ> +[:zFY-}r7XO.DZh!Ohh%g.<8ҡkY<(X`ዽ~ޫFT#xdp2G"//{e],. ,Tm=61qx2+ ~} g)x˰YeKMS1kd$&jtom º`B&ԼQsp .%$ /[jKg^<~.KH[6vtn2`&VWmZtԵz8kdmEY90n'KҡExʪ7S.0ƽ ^&j6SB$|D oϤ0s)IK%<> Π b,[aɨ1_ |[m,;hQ(DQU!b,!iGWzjA7eӾ0"{:Utު:y$JT>RLl.G`L6nH@_YL=(8,qv|0̝1g,kYd `вI?MFjP+Y5#wv,8'!-j,{F?)EiQѐQjm<-iU83CAK=8sp]vSJ9:"Lk+V ScϼPCIc@FHr3SC6(!](IǚAAI\ 1oйTK?8pit@ Jή^(TXVY7#yĈĎFC+$mx܉h(V:! t4^ZTH x/`x=S/HU q:ߚV xKDF|V\tJnWV ZSm ߝS u jeUEOlb':ZL!NC9-䑴 Aҥԁ+& m_uGTN0MjȤJ;E,c̕@ПY@.Soz pkQj=qC'5iEDSG !|E=\"5o-/#dޱfL=o-7fj&1b-@_gah9'8 Ɨ{/3dՉ 'Ug_Ş},nm7^--(IvzS$jѠJט Y{e/WGK%A| G1χ鲿nQ1{B^5: VAu,!ѩ'ۿ2/2r, }6F]n4Wb[A|-aΒA7Q^3]{ҍjocC*GYou 7$nrT!@&0 EՅ 1Rץj"FN$ tJXd*r:1~ۛ؃.b<7Zsݍ+,~ G[uo"-MߕF`qQ}|ܪ G>obVxv" [WNwq~s-G[] '/$G8/1/&ezD&#wP^ bdZ0O4Q7sڭ 4 W/= Y [݆9t [].'ᕐ3ء<$ >C 93)%2[G Ucx]K /Zqgkv{>`c~)u\qr-,}Z`rd>%"K87ڜUϏf_187Qyi_HW)YJlFvvgH崩$Ha}ZkakسeL'0s⁇ۢw]q655ǚ'P]y L戽֊=_S k.JHN7M\~\BJ-)v@(X;"b0_J!lGM[On31z $a:WwW0~s  XJ[|IPwrWέA5ZNc=%;@~SINUXR9pbZk9u= =86$X":$b32yigmbW^mkA`;H$++ί" _k>ͱ*-GN$y`+[ A; c2WV:?uEsZ6tDC@^bE7zYhȧC&-4T:h٭UgܷcD*MbI-AHn,^8S8_TJ ~5W(HV(ksG{ F7+߈iƱAKLTf7FM 4^%!IxK] H3ДwB3Qw33b<}5.`M}ޅr.Lh诧".jiړ`W08)vH(s=nCKHC44tm|ߖ-^.NKO-_TsI0UBYq@~vx[ -d( XƸ39&ez(8s)-]qfH`gX[--.Ԟ[e2Hؖv66@}֏WT!euh?L3g5vy~ <&2.'uf|-8AD⬋qCV#G֎8G_0YWb\gM!Exπbt߰<bKo`$qsSILzqCS Z˯6:<>nP9N0/czV'O;Qgc&`Ġb0LʼnŽ- fODiĖ] =RtKrBg,c"- rL?/3~ -"(J~; \qYnT"=h^pQf # ӄq qn BÄO9ͯQE|gosEv- Alu7'$LC, FDԝ4_ѧD[Rb~=C`/eD6>F|f7!H@,1h ,>e5$)S(9{-c $ mN,f Srܻb_;t!@gMg:C %=f]G1v75J/<EY^ƦشѨs4p5dGql_k8*G6T\-xbpc{R+)/=G'*d2̊Ji3UjMގBH8(:!{55nAI[K~J -6SÏ)q\R6$ؓEvuFutfRSƙkN@zc(n79xX; `2׸o]*B$߇)Vm1o;:6f Ӗ86x+֭.j${ ,8iK+E|J9E~lANeB8$7A1S[>elGw%b(grQ3uC'H`%xYiS bj֥a^/F}7--gz%ui9cjJenWj5 VZU VMDxYV(;h#c529)êFd\4>ct]'M\oMc%3jzp 7~ݧ]ŧA&2Y$ł.{44^b$87xE6Ü*ue֒A'Mm(X>o^Pl~8$/mq7\d~WL[1?jJ$=mBU{rεHa2]zgJ%cX "q@LGŇwQ$7HD]SiCxkŊSuVw8"JM<9#dD낍QN@\r%tO1ǖJֶ': tH=LtLNpd#_~L)3^hjLltGpj1p)tjj3ZRX]p5'p%,,%^bGQY+O ^ٽgVMˆGsKC%=qܗYqXAҞ0]oV]M=="G+6LyVȠs7㡄|;6;z%VQ)lqS: -C/CnKF㘄fQ!EiXeQVb.uĸ꬜l>FL e LJ`?s @ nuw?D{Dž`~*ZU+d$ W̵;0SG"uc<&L)4D[ScTw,wD;ďl1EAR@$6b8Z3.mf')8n\sx:h$%vJYqfLI:cZΥ C A5Qk<ˣv)uF sqm~f1} a#J XKTmv=v1@`[#Mٺ_w!Ǹx-eG<fn!3rr L`H8j4艀6#"MI3Խ"5 #8ޘ ҏ:yrnSiHK܊Z8 A1}MM'lNv.'M6'[X6c jR2rYY 6GbפWfܨ)I6jZ1!UvqwA9<2po _jONZ { K}V<E4[RkCkqni- 'sN^w\̯ <Xa)~8au JK~ oq{rwSTlxjͫ$%Ǯz4A$F?r!%/B 40ؼ6S>Q*w_׈] ~>F8MWH[E؉0ݢazW`i koM(Q)y+H)fcy(-jw41 Ayy샸;Rm\b0\S% gCl{lDB,Xsd* iV;U]>?rU/A֑'fc|Dw潏›+E.Zt);X鷡rFl6 XhSP v#D˹9̫_GONY4-1S7ӤE.婢ʖn+lG*3!PK kWbu`gAX%rJC. g_EG4Å麠u9"< }qvEbPv)krorIm0qBh\ЍQ B̎^w⋼S3#>E/$4!{~{f1&N3o@7\DѬlH`T4\D$'8(%>)@ݸϦ75 a=4F>ܩe 磖d,zQϓ >{<:ss׶18oa3{|G6scݪ/kjH<.kbIY0I,#b鼮TQBJ*" z|T>be.6Хybj ?Bݨ#QKIf2k.,3;"&q0H!WmViqxΦx*(*KTaXNIJ oیA e _ Ԃ7J!z1DUq=$ɫfB.:ztk橗̋\pLEP0oW+he <[WsdQel] Ad3{P:yآ+>S Q`ɊW,eݎV>"z)Rt/>,}fI?Lϡ#$^M+CItU]@].*Q$߻տRD1@Uvf Kihp9 ؾ2iCN?jXBwv2Pe@[2$ cx]Vqq Im7M#G}=q1W+ `᥃u=PeޏXARb!H2Xm;L夿4 &`.نuΔiOܽUzH:V&^\ȭEFxPL.L""+Rf S'Նf),/7`36:s\dx)%-^o ɫu/g%,Nc ?JMbCDc1=;,`Ѽ잟R,qe jq\ ܘ (rIzE-;E'I 1+MEOUV~<&yIF UG"I@b@fƁD9u?>:cízN}~qH:.6]i @ێ*7?mpEP+ݎ ]wH'[EPDQdiR3LmcQN *:Oܓɕ<&lmXrD~Zt>bkgS\"GVR10a+la"[ؑP]2`徸p/:/ &NKwPf$"CX5d?9bMl)4HŽP&*-؊n޵R~hs\d_mPa⼻l6,E5 ]CNU0fi 5+\Aq S])Mp ]`W^5-lOQAמP/(7.*t?}"NQay.Sk[C;La}O)AhQѤQձ %6>VˆkLS@k>iSN=uTGHy'#';YFE/KER{$IX$CotiRW#$|){2RanV.R*A8j/x 5';oP̞ lQE+GSUH0idРR7\9[ٰx8c^Qvۏ-*W+У}Y҄`SPPe/\/Ȼ0lݕb5Wqu3kgh%#HC,[_&NGy*|[ބd(\8&8ED/@WHCQ\3Gklt]J<Ƒ1 J{y>_)$G86 o6;e[M]^eV &FX5 ToS-"3}S^bnhK8 36eW+:(Gg"/e>Bʽ]F(ݟUFYY-j^@Dyv?j,e"yO'YP$Xlre6_o^pW~ȔM睰ufÄ|!\2_0^#ZI |\իJ&yg}{TƒRq$%EE'_%gv c4JޝP|mToB=$[X@Jg DC9rmrΠxx{"x>D,˗ #to9(Jb[Ul528W迒].u+ X;GNu|K^CP͏-!2^왆|gw-ޒ `3Ƣ f 8y WEqwGf: l|9F]VjeQQ ECAk-wzJgL-jX6~-ת_ ] Vreu-=iP.ܱArͰ]eȯts=1%3~m_ Ï蘄 \FArz95'mgQCL0Jl>&x"#*'hpn=;=TA6ą0j8A(3OpnٲY`21?V[AB|F{},׮5+l]z=C[鮮K`4"\{:h+6K >D:ϭ[6at3L5H ;65,B h4R&fꤠ4Zoib46Z( uаCDRU\ BCc۝i.m@c?jn3aRž) LDZ@T󯺣<{X?\7̚l5&siR\_]D>ɋ7Bx]KƓxkWrh01<8W-*}~4:4{rV HE4x)Ms-@Ԣ=4 <8 |E '4WFݰK9p|iG2~Ο>o|<,ԷT(wae5%핈>>دr -(qNDEoLޠR~OxI 18ybz]lvRi 3rUfk)Kxo4)u\H؁Ry'눆='W(ͦ% nV9+Rɺ@yUWD֨yeFҀ&JlrR0]GD֮/cdV!_ IG\ K3I8MrHyYYc=GœD-\u?V{j!G[Ӣ'v}aBl*ܻR6crӢo^Vjf%qfgo\0BFYpѕJFS~a/-5H5$Ezt>&f^g=l\~Ð1p7vH%u*3 vSv7<^ݼ;~,j)9b:NTZZk Mu>ڸNKAOP&ȐqX7Z{ 5c!_Q+#>) ~k-ΛrZ#N#Ԩk,04O t7_YP4%8p("{H Zm,۲k6 ,"hAv7:Yn+LXOɐK(]\y Yh= !={" pձo5>6Yv [J5|F7'Te5Tڰ@Vdk w@db$*Ԙ>|*  TfQtgxʝc0dQ وp Y9r/ P-5̆ĒsKaR\|G#=; S?iG&,G|Zp}] Ɇaؠ ZwnKd2Trq;$&*OipoeUlC?@) E7~> Zxv]n5ibq w{6jm%kܡWF(ٛJ~4F˟,_~Sj*$_w'*C8U{k*ӊ6cKεɢkt(j5FqsFW,]>|?]"x|oqZQ"l^?@i,ZJrp?j )^w!U2 "gV`F穽Pv.E8!u(`1A#lp N3gXn*^/:uZD*2I8 }|}F4UBmySd10-\-s)m%&Z6vQ{6P}q>.+8`,ux\2bsӟ逅ޥ~e~iZD/(8aZ>D b:/Fdqƪ#:N( n6jJoڮ[?&vq3GӜE;=#"KtA)uN76FйNM)tEcsGQHY2(۠t9s(#bEf V_⩫$ZQXFԵ)jviIqn V!ނ扗K0ftʮ2C_8e-e4*A{XA dwC@9猧Z[QT.Het@4;^F~Eb뽽=: ߝm3;gbaJ 20hdi,a]IHkdb\DQw6}l,wTBXK_n勔iYԒ2b]\7z1V ]Rיim/<]AqO*P=`{,?+G|E0}(GŝӁA-jju-npCqUߔ԰RE>σ\ŐPnE^7(^y|%hԥ]N`}=TJBy6íy1viXXT3E"\<5D|En7y3a KCpx}qTeHn+~}K@JDꞤ}}U1{YE%E-AZ \k.i~17JC\q8_%T}"޿` 5liB3Q9dHn=CÕHI\[&txq<@[|9tqd5:y.WQ5/(晞r;C Q)m.U|* 8NCCC%6IԹ R8ʧ U m:ו#hEj@_Hh3li7H+!q f'^8zSgъ]_يךن%\Eh#}79ոtP[^1r[XpM.rف^1&xʎ匬e Z-N|eWՐy􈬘[_ Q5hn֯-ոmFHU`~ mQ2oܭH bqf1D1뉱ZUQL$t ,dˣ(ͷD>3 U'rLB zf#BuMy(SiDxȣ-]C1˱r7Zf )ǤH 0@"^bS|un߄QzplbM$s1nBÑ~HMN8I 56SA*.5_U)-VZP9|iGc|pUm!^;1;_oMVo|o%Mxl@}q}߰tݥRwqpj>{wJBMXpbi [C. ֹ2tyM& I햇o{)oxH,gQץw=y=]98:e_pC0"tJFd@^f%Ce^Qf9zOSH>&ZݪW^bZ+1X NB9 *>\",*:ۋ~4ܛ"'T@5}'y9 ue(H.yʈVFhއ t>`fcB[-.1lP"Tm6Sv ģךx$5ҋU \tJ*+⇬7zSI吮C'-"#=-?CskTsQ4&C);{HjRGcGơh-q0E."j_*kH;XHZ{(٣>Q\iw`U|Ǭ%6J^U =j}3 ].`NՕpX˴:}1qˊT|mu<Bqb.|9OB3UyXN/ bM #lMz2pf28y0^JJAPK dE|T=rLmhCw,4;*lOwk5L}TuClH˵uNh=a9pAʚbm ,U=AT<1:~<9iL|) ٚ:}?BajE<>=T 6I }[ %+ߥ5oǎI}Tb'3y(EEM=9l.DPwU13 *3K-_j7R 4&;1i0j|;;a?`AQh!BXςYّxZ0 MqPYJ$m'aHޅpzQZc5\Q6מ?`cwny݂誄/S|b\(<}qbVV'mrdE;Vǖ]ӕ_od8ck;.!^.tgZRQ -Vh8>zM-%OwN ;b?ڻE+D}C %'I]S'}2 J.hIfA=[V0 ,2¯(q>yK?lt0zS).zHIœy<"C?HpX*n^-9zz܁=czvZQDt.2vWvD~Pme|muSTܓovUVlG*'w8=Agw>s/jiM0XB|\"/#vҷUv$=X{JMg'Ɇ,0pY [Ex*~|E0΋ +ʕOnrx ;*F)Y(BBճ4UiE3Z[p$$UKnI@zzlЁX!% $JhuCS+ rK=}~rez cdo¬L-@fͷ; /;tOl"y%{,2ZlV}"Xfu[Iy S7{,q~ZnkoHZuﰴ|y35u' 溬{p!R.Sa`GyEa%jtSV^K)w7Rg#wC:)""EAc1̒rq3fT#|Jއegx(&BMDG4`Kd,˽^4+7ʱؽpYu*F .߁w]\N~-EB\Ӓ~HmQǀ(Lfޟo&#[yhz܂ Pt贍#Eeb\O1aӹv[DIY |hj%P5"+cZg"e_9??Շ~Uw8Lt6-} +u'^ejCirTòVEoGyn՟vvqdUmq5>Hd?. ->Yr^%pi&c}7A |%2$|ޫۥLM_-(w^) m}dJRV.-~ažPƻF,gqtAJɖl"p8kfP]yOкWYfJH߇S|. 9xܗAA|PaCz1 %Inx/`X\>X9ZMJ9z& 6!ͧPGoVojw)4$HW,[_`Ti)(&Sa|E[k+]8ό8Teˎ&>[=+x1OƇ-JN!y]*k[T ٚɐKsw۾BݾyV6b͖$IՉ7np1g <[ 3FŇa VH+)UKi"RX{i{x9}_Q'( cCtR|(7󸞛Gn>2&֋({L {7z{*_}rRދ?V5-a߶_{[1!"#?/ Gʔ9b׳!:`*Vl;vpNAŃ/ȅ"̛\v_<9J%Ecf5Qnn >X:n^`GOpW;FⷙFc YGJG;wYԏOq|#X׃7mQ&ֈccC/@7.38%V9^b8?hBKMY`sD>V9 )_>Wٔrj˨jcwDyGf3+X(WM]SSmc3Yi6S3ѓdq_"lp~{h}j:-FxJ)[P#F^ѝ5_o԰M I㥠 Q2eᙺA%(X<]7*cx1*煃oqP yB.`lz8'XR?̮mHy7'H<a4Pqo%n~JCZyh9[[!K]rj7nD<:?o"ΓufѴ?u 2̥+FYcknlvy$J}) +q]<2-*TK _6_bz -9r S N"6 >A:l'61Ց52ɺ۝uK4z-P(3njCG7Ϣ5ek~g|a]M\~H.]BYT=?lMŒl1ŏ%Zb##k֎n8/g6-oػrH£ A7CA;MQ /;@q տ`$~ฟ$2ji৯w9"QN2i]G3e2LWsJ]٘NËX nih9L^Da9$W%,&.O:n `4 $I 4~q!єu:$]--=4~^GBc0X/J`Ziz}WNQs~fˢl2O {c/ ͭ-ɕ޻*u| kIP k9ٴLku.k?Hs ,1h@v=q;)*ȴcP]oqj"AD`I3hͰs^-4`"iFߞ5d]wE1 zZy܂D^E1"r{S;/tC;XoZY.m<3ܫ:{ 9HM5:S` 뻟lnAr I_CK<>KbCH7d!!hB˱L .GEÕ %'%*vI kRu<)p@x9;MڃyRޱDͯ\"N XF\S;dp_&濈Q=yk 'V>b5g^ڙ+Ar"LLyY%t<pp 7/~d$P]w.\[Wv!Dy y߈}ugIAQW4tsIBFؽ< 湸 跊 HK-K)7"f`ob ASExtuOk=[]MaVI2ϭFbisA݈yKVq%[UAqWXJ'^7,:䍨1|(g3^f#*YK1ĸ%& PaMnn=CG 'E偒5|p h-EJzܝ+{=CdXVqF]㒤'9웯0>ʨ kǯu]IhY}30EU0pь)hsXGp_TVRd-dm>WнcnD(@ erm$HkYAH'Î01}uyЅ=~YC`J,JsMK]+`~g80@ nK~pjɦv jdeqV빭)((3}{n%n8v"@)E+Sx@ŅPq[BXxD ;UF(QwtŶm軖:4TRi~!-jYRt].][sRL.F%2zE7!{jtx2f2;֊?;2nBn;!~(R}Yxʑ7/du@ qYP-rQXU)(84JA֢SP:rL?_nIVȎ0q#E^PtdĺhXLjo"x}奷bJ 4=,!1#S/=בXιc65Nh mNzNMwa2n50秗rٔݬ*YtEPKmd sq_yt#1+ ĥW:%UH:ۯo~T8E[*l"xpeHH݂5wna1܁nV7.pTƌOe}J)ϥo}n#+AanlXX%V:'cœ䂭L ,@Cn1a5=l1pYXCoY=+0 %Hɑ>5)a d٫2Ll6~W2c?5; v(3J؀4ߖJFu:E‚mN~ eRǙgtxMW~Nz+}}@IFCU\f@4pBy PhlǘZyo.Qҟ͔Z?_`v]Z+Ņjuֳ̐tP,H=? ]G\}ot>q>Z),7ݹTѺ( ͳ/lR)ER0(#yoCcN [Th ћ2xa (bdEwg֡>YU*G: = @M6ijoW_G6C?6BW#sO^h v-]j%"3sDf!O^oKk1sIBMIBRnzL?Υ="u\E3O3:BM{7"V-z%8wZ{tOV%44$=5呸PC mR5j'k ."EES13l0_nfni9E׻u9dZc*xkIx(b}LlTcV%cazvD0fh8x末J +adOOW'[ wX$zqpxVסz%.'7%_zyǃ3Kʉ ki0$%TOK $uū-q&#uyCa%i\L qF8a M/ eḶf>h.'01ZtbxdGMBHmX1j2݈@/*Zx"A 3W\;w NRu +=VVΥ8Ej4=ruB2fܭs}7*$1)jG+Yp兆rsW n ~~{-4(.o٪^3P!4og, 7U;7=~,ь*1,JXQЭx ] *dTM)4 !.y)JP' 6wOP6/\ ĤS\^]*#-Y\{O6%#&5ZlH%p\b1`d U׃tX$c}qCC jBRq͝_RFX4o6[[2WqV2/mw-hOL}0$l`F,v]0Hh?=UINE5Z"z̖\\j<%P1 ~.eB+%t̗"WY,чo01v12%P1G]a+2RVP9pۓrxNg*gqzM O._Ṱdo!DAۯ~3r& zc%ع끂F}q7kVťl96G{^.cl>fgC>Tn8}~o|V\kKn(Ї dyun7ؠ&W5ǐ/=IS Z4~Uį  |_;LSVT}ʏ%n7Z>.I`hyf[1χ8hB" Òzlr( ;G.l_ꢚMu(l)X}$AiH+3l. lYƞ%2J%sP*m5mR @ .>4IUXuˣsYhnݎT QEx#`FZ*Numn}4Aq#d3eP2M:u3lݬւ"KOȂ0&̒dU>tfz:4Ex׌=j}=T, u|`K >pW(ЫD?FTpuD j5h?߹6]T{,&F q>1c6d$(;tF0pj>Tt8jxe+&~ A7yOpv0k:ZI ZAQp\$^c =790.JGЂ9,"}Y0(ed bvG)I Gl=ۧq65i ".;Ϳѹi%ВKG;k8f#+1trY/FV7ù-xE؃Y]vtD=#ZEjy0 'ύ]:u咉 3Q9Y1&Ԕ9|ݒE~(wI-;KւɘHu);m#?C vv?7f$z>pT ^VmQ;hNQ@ J)'6z?.7:G\}ÎC}wN(c_wl~z>]d&^Ԛ o**B-Z>5|7(A`ks춿徖/Q45*;A:~)}DwT O_M:,)i9'%&݃#:T*]3 _׾[d6e  AE3$UdVV\!)oς3yf'8dl=ez&3[">K24O{+;$heϷCM ^]BۮX^v,+:6IThK`13Px):N'ʡ"<r{XWOGEbyjs+,.2X)TLo@hxC'aKcAOXpVF/}J`nTR}o\ɵ1Ŝ%RB* ]I BoS;^^nq0^a:K|Q[B#ͧ@`ļUTWADI cԈD 89Z+";q]/ƅKO m_|7 2ӏ P{YCO.U3wDxn+R/}ʌ1!zQOs*N`H wj.r!sѺ{C)5U^W 3k/C0_,,zd6t&-5w֥T? W wvWsf8ojY}A("``!Uv~p2~'ݲD;)inpHj\|t3*i|.U{ 9K6}|st<0ǘqTyYz2rW%qN{!nA&J[rʣ+e">O=Y\B 9oş^ v$,l)m< (*nr ܄\y @{5gq{MWyDdWbuOEfș~~V;{E)^Uum'&>]`^7R!V?tm;O/@p5m T .mp-bsK"K-iO};1*}q5kОr( ߅ (YR[ԌFse=U(ȱ>]״- rDxuXmѮ0\B D4TwVH1WuiWR, e> q/~z EƝL ܽ۬Zé)b;"%v[+I;.x3n7ZE#ײx,*\I9ifnWnŻ [20QQ4H~ˎ 9,ŗ~8ƏEy<pA7+)!K.;긺pݒmVwέ&3!v~i,L{Y{` fa`N2R<:,i{Wl6XkpNiFHY2m"S`A$WdwMن؞] i(8A fhuQ]q,X*5@i3S`fkNAB<ƶN+y]iC  SR((Gd,gtׇDjHFf J^G,];4+;p~!&CRdWI](SUY/l(\ō..ƲLtP!K $;y&QK.ŷ? .'Mt2Aڟmg1 Jh7|*`b} M 2Rhk_+1jͰ.7j;` &?"b:gN\v6vN*E+z :3r vw'!<\Uߢ86`qM\^KC%.5v&8T *Z6w*򥭆fT[=Cdt eVTP:ln6[S.tR_@EHj!t5Ɏ2+W$+qSTYK|$9a%☄~7k+0N{'vyQ 뫉D"gRY"C _N9]I0>>ׄ6d+ʵ%"aӪ1s\c wgͶ[%uxW-N}ěD%:陉I-}g?PEj[gT`NMݭ x,XЏ9-1¢EVJNpE m|R]LM[&l'Z=X2vf:% qɛ_[`tQF1>!G/D'[cD G`<O^ z DÝ ՜nOܐ+ԄA hmѷ:ϣQy⋗qH[ /zYhӡc9fc1B V|MDI5EC.ؒeh~u{^*Jѧ3Iukt˙y9_2u 8fa@NΠ1zPL"%0t ?E/|ZB5&t>Č2at?xڑtbfLmzaYi?,; J l%Yv($Dmi[.܆%uT]d\*>ƞc@%uw-bЅ&Y?A l D!Zɕ=YT[ULb{pX(0H]Z~D,ޖ" ᱼ:IFDk'rؿuJV?69}($" h [t/x%r&s3񷲁 H×誥 XEUSNxq}3 Ý^ x@ԸLW~[ii<¾B:;_qt]]Zr _HWm=[FMRI$ٵ;<j*XJu@>uT=zI1mHЙ3V:o6wYucqrf5JX1x{g0/mU2%#4c} KlD[^ҩ{1dA7Ns/&0:ueı<`KzqS٠@%DV aC(kݦK˶:fxf$^$p1׍far 3ve. rH lNq蜐Ai*MxnNDѦK'غ)3nHOX\{d=G5\}T{|So n߹ HE#!b.нJ*B "]hsDX#q/"'|g;IcC%0ol#jXeVOWZx71qQϿ$P?x_O}Fxo,;dL^@Et0$@5Xss|B!<\!l ݼNh(0sY1HV97J"T(qK+|bЦwENJgeѼ5 G%+pr9$MS#7y5RMw˲GbO( zB1S ؘ[2*%N3(;Ϣ 5n(d+;O$Fv[!OGɥڋǙXre ~gy ~K Hh^\|B#QhXa}r#%@ƶʮ~bᑉ(xn6HL=Pevn.˻0I1ENًZە%% ܽZSf;V_0id {*D[4\+_AٌEahq73숚٩Z ɁT&d/Ĵ>0$H)CfX 9e~GOW3ckj;$/XC!pq 4L-%38`Ne}$z-hngRj^Ck y23tH&hTLJ.#w)1fډ`kSmC)5V\5@LӊǷu_ќ2U wHٮ?N0ã;t?;& ߗ,'/nA0Y&=nYDHE{9ca7=Kє:@L֍±Qj@=5 9#0 N' %;SMGGR+C'MotONԗ"4M] q@RÞ.f)fE}Z%-w6V\@UL AeId 3)I/WQU3M|<2h9'C˻5Lok'RK/-D,,YIEC2QQP7.絜&*-sldJ ^ds~xפbZQ ʱ0/>qXKMm|Ax_6H /+D,EBoZVs.Ątw{b9yҢ¬J[ P͛jsFb$M\PcHSztzӤ kFJIv̶1 &rJA ,'`ܵG¶yL'B,%ύatDU/jHL @%2ᅴeczW4!Sqhs1YK=4~6S`^oGhyT)dHixdw]iBŞ*]+Uz:ض #ы~8)pZz,9N)= x^&"pT:Ӈ `Dd;) HzuՖ&{o=Iu8g} DN,\ceFpoqk|١t_rƣP߳.k^fݳw#n zBEV768͘_mo"U*?3Rtfԓ 7Z^ zM^fnRo,/`qiXg9MȏO,J&Ɯ& k呑Qn4>5]Хl+}S*12O+sTAc/S1x.ȵ?MN5 d}9I[' z9*bp)x&$,S>+sx{x1z̎<TZr^>rFv" |\EY0),/Ba,^ Zd"ø۱ƅn8,̥zDye50zobYb[FmVˣw(#XmJS6s4 **g& ANaB,/ 0Vv$8êj#,[$ G)ru*7ӜG(8?e|Ʃ wl@ۊ>@##4Fެb( J qYȼf[_nPxdZ>ơQM%\hʿ^mC֣)\|.+G)ewdz0&*vMWQoZHpU"F{_J:]l9)R5iF}&oa6bjr{L{Oʶ4TBe?:q䁣l/H zF)F8kee!w8~8WPڀ-W\O;qzf<^6S{L8ȥ9PR6Qd ئy=`7Q^ kEO 4LͭTu%X)XޑϨj14ͩ&-_6&%a';rnD:^݅mA(VRDLXᦈVR6tW:9ѣ`/ A*! aAը&g>%_ws֦:~J4~-A\V J6XVSN1L< J%kt6AX?JHq>ђnx;: u45[DMuDE_Vd4A{}?C8ф,ӳV{\ŮW^¿l wgEPē|1]E ':CK'\qFuiW`:EA%8k,Mk#QIVQ#N>G?D"'e)ŦL4{!ɇqE"ƽv#^ o QĠʭڼFaA/A暊U-މ^b,Z?Y?| O˦nvD(aVр6TՊGG}>IUFN0І&@4?*m*"":[8I-i繏{(-l]Eډ",4bN*ꌩNB9%c]HoVǺZ؄kx-%U1yv]Mj}pE_vvSFuO:N)_A2 O>_wLWd[Ei&gZNd10ϱnCL CiƷddgn . =@yߍi}'&= o蔶{~2݉EUC``3Hjci6[KE0%wT};&Okט}P5w@"6e Ж< UĐW7珐.DDZv3hW%@a/e[jѬryjHNn5cc!1*_K*)T#6vWa*bf8d&83Y@IShi{gW %;bqOoOI0‡"e ߃(-W{Uo ~lń9:bAfƜ_b`z?/bmwn>lU^ax9'Qp-3!zﻟ*@1\a TUmRvEi3˲wN`Mu_#~G\|&-^tO);#T 'S^ǹ⏻>\;_'A(p7vP䤉n lFQ&,'!:%]UQتT]u/L FЁ^j?竞;uz7ndX_ ٣δ,Wa@EceΕg ⳤpgȱ{i%ZZgC٩cy1 px崱n2RM  w[Tg!fN}_˨6di*Ȗe/|DMbrhzY5m-ۅk$ͳos[ATcjKjdSWL{c˧ EҰ~y1O.)Jk8tAZ8g>9_d{[bQ &ΟDcy?mw,֠#bs֭&PȐNhR˦Tjѹˈojr:Qa(hT.Rh^%B~Q1 pyhԞIDQ‰Tm4}3dЩ.*kʹ_BQmg4 G:Jc6: /otL. 1׸Tj&9dl=QW_ zMį-lC^>?"xAnU,]%Iɪ*75KB8cWEAXh=Ƀ)l}RhNdΧG|u݄d3<B?!ڢ|^[B[]a z+.s5u%WNoP+}M1?7 хa0a͛: [jb\lq,cYz ?")2MzwX_$$9xJy4O#w,MtYYj9"ʀRn%Zm˿rżұݪh7+I9Ʋ\+vヨ2.YnX&~ p+^ߦ_ّdaqNT&iU?fw U ҫ eQ_y0?xU#Zӎ[bEpE>-"qxh;mDgA/ݹ_Tޤ3y)\8X:HE̴H g_$ g֖qg 3 C]5}eP,t7# z2)Q('B6pYs!ofx2ӀeiKyaP,yUjK13ЛgRhʎ"V 2KPwh'fo S$FOuE3/akz *HM_z|2·z\zLA Ru} r+6!/]ߓ׷GV_4KU41HnۄpU9,hB_4 WRԃV*7sUIޯ`0 ћ  m$w7tGUru-$T<,!/4pJ0((Ͳ;2s&N=%;e&ōqrSKh}Q=rRZU| ƕAR` FVl$M >w6p7~#F /{XyϑnYasN}OHċFu ?w ?p77)sͲ &h8_\Rٹw0RG詮Dž.=5S#s`h?\i8}m9[tOƁOȐά> W@Y4PG PXFqk@tGɕy׸SZ>y{DېcEVwdu†?-w#['7Kʄ*+\lm1Qjq~ Vm@ɺmLUh.3$jKi *h%=37oM}H&Ay: nMfB[a?>Ϯr~VwQ|Ϗ蔌e$]v6fbF f>{ paBemJsAsҴ9Xuv&&G#t`&Z*Œ&6+*5ȤJXȿc⒎Y␍V0MV?Z|Ek6QW cdTSZ @9gns9s_8,17et\l"h] $E:P,]fw)~A %Kbaĉ2Y xJ,gʳԮ8yW_{VKhu)mr [MĺlbW6 C5 yW/Wd߼ufT)vJAsv&B8)h8 kp<8h"]lÑdt @~+h %=~ʩWg~뫼تRcTJ\#䨼02\mEB퍏T ŜlGϺNI-s`=IfS7GavT06WM\Q݁v:i!|?#FSe{ 7pI#)SW V|~vrYb@=O`*f"*F= u8"M%hG 48 Ѩ Uz;˩$t+e6tJOmDvLz0  šIxsHP20B,* jEm %@*_  F9RN,A* HP cvxVbIG#o+/RByHd҄sV_ʵ,Һ1xUMA# e|Ԣ -sPW]tPS"Z -(e&78-y0TSHhk_#8 QKQ(ބVDaGV.Jh.>~*}}d`$INN2Yc`o;A@{q}T1yMTp_uVoop1"KZxE'\Vd H %#7hb9(^+o(d%p(9[CQi2nq<:׽mJۈcЌ8d``6x-''T < :"FR;g3&S"V.wӉK|oXi?<< A.;J}gEo[ <NB`7_}EVv7(Ɓi#88O;KS OSRNH \g.j㍦.'mws9O&MQbyB01*<ni9A$jAy 6LwB+Ȑs4Q-<<u𸖢9 phޢ&`"ČJ)T8X]+U9/:&=1yyh׾𖚧}'$ ߼d-,ɣ^jX[XũS?FBcw`{b$!,Ztl09(L +$f(qެSH@ ,0 7?h6rkcEgx<,Eʼnbe7rlG3 ϛ+5!ٰG,!mV@8 G,L7M(wNFn%~dmuқw^ʫIf"wx檬*˝\'o;;еInP6 3 7w cmn`k,Tr. s Lbs CbG"åT 9PsM]#@gh|:΢@$NhHiLSHޅct%$1[A{jJVӜFXYHQ҂. 7-afJw+m~9҄RPNԢZg\\(0Qr"A~XKHa|sŔZ[E Kn,]PzP-ebx[2@P&ƄB߁tlpc &θ*<|&Á7td6jJU̒יU;MG˦A^dxJ/靜֜m0KC@z?Fp_Ԁ#i&TZ=x5AHz$9bb6D@ $E4MaJF]lޠU_&GfE\[2\nEdO'f&GSPdE&JBm=,HneeZSN3JfRbypscM{D_8]Z#sH}&;mG\}Mҽ /_Y PvgFa#h uJqR3%wV4)۸]C@>§E8s?lU;lrw…TiQ[h8^./͕:-/+zd^$!ɎaM7o)eW,J 7|ǥקpdfZd("'9%N$3Z ,{)邸 Wj_jE5Ӟ,f,n #dܶJ+q&rlɍQA|8p5G_`dL~^IzD [#Gc^ك +/ קּ8rVU̍i5璙rÂ6` hB퇥ߝzn42?S.p;orܛ-l>a=-8su0Mx2=e4v [] Σ>MvvцV3iD:o>3K"gLh3@IN.5X8#1ե+Lu}BUWaN{yV6%Q6xSVQ}}8oxb01J7@(%D{]1~#ˈ& 2дxo.zDŗ}ރLէ(3[Ψ^?>ANmO"1÷Ԁ6G-3VjB⎆LpCiDpU@Uқxc`]E100҆m Yp٬T?^ `e#xޒ?{~:{,ZS(}y6GN\=ZF<㗅+MϧpJ[V]PA?*yI4* "1]AXZHG^M-(^dæx-s03ǮiުaS7MpkEfiI/}뻟OrЍmxJrR.>.$v<~pGoH8ZXB-bL*g:z~5{kG&,poQw:)ݥފFT:ptFh5t$v^ ҏX-dzz&Y5QCi~5WLr {y>D3j=NRTq'] UwRg2yr] VèbUomBE "/{\v$!h}^)xrȎv'i0< zr\u}(zf4=؋@O脥:4/b.{5J Ur3Hd[ /RU8$q8GElS+|Y|[SԂum[ە( Ibr2g!MhNvs4B7U cl7&4-Q {PT,Q9_+C%+*"/ѭ/8?_$_%f:;sY:-Ol,~Õ~s#&A;pel {,^GQy{m7Rd>iX;mK0f9u6ɦ略61 ;slҼO `0rC?%NI?O7ԆKYܰ{+9 #d&t~dtm'%!cqn1P0"Gɔv9…hpiD PΌI'iňq;ZFϐPWPS`/W /Ϙ܁pq'^YdߔJVB,M(6|N>ùr's,}}E҃vzϝ@CURg"VcUwk l"4z+h `"("?>!lCᠷsh*t쎺/YyM°F})~rP;e;%; 協45,Uo`!nj}G)[xB .yb(yI栢&u2}t渃8t`&Wvŵ-!$h6w$<כ%syZ_R8ŬOal#9BfUk'FhrYUq-AjPa9Nx4TD:$x1(&yC贑},F[;5w !"X$sJO-rܔ6bp',~mK};.}5*Cδy)TXӎ).>V|( BF࡜`쫫 K5ZDbwU} X2 ƮF3ApJs df}+bɝj|#i'!󕻛;Ύ2cLu-pfi_gd. % ?Ӵ!%iʜ_C6Mtoua50W|^!Ra-1ecY7sāՄ35EFY)*6x=x{eV;slauFR3 .DL7RӋboiz=ԧzЀpoNs>^Vx(=;սSʅ "(Vd̲᭭~~Y "k񭀅jtK:0A Q A{@:x`YGd&t ӻٓX7gQzrXF~̸PI!We;iG:94,>4R,+eoآJORjmlW6{Vttv%c."`u.J<U*eOC׉LNM:+9 |5N1e#/350c= mv8TEoN<>οjaA.G摳&Q3bO6A&jV ڻ/ɛko0|O9^frBa5&mvME mfPkse2veVfhsϛhA[UZ$^!ڥo^Yœzg"A_j$\yϜa{UHx 0gnއFa3gN -kHD3ύWhVU}1=/3max @#T/{܉u!R jFٍ2#Eݐ.1 3u>ּj-6^+b0u"p~8$rδ1Ϊo%WiI<b;JP^ *Z"6›:/N}?=⛨j%SA&?]1E>JйWPG) 9,B%hggꕰ(@S- _Vӎ .:R K(ӝV| ?qZqwF?PE't`1$jg~VvgϋA H-V_P}x}zQUIʛ6nH´OtivGkNW2yZ_jlP' TqZճbhVL?#D^1| NNUɴ"rN'A9^]Rrըp= 'Qec<3ٕ́.thEȳPKI0Ǝ8_#`RqWd>e_V$ [.Hڤ(\5ذڨ7?^#2'YwL2uUl."C9o]+S Qc+qz 0Bͻ1Q1-?ѫFy3h= DCNG|s[۬cjذ/$J   X c|1 U 50e):}[ȱhk0s %K=2̼A^nWKHKl87Y~Q K0ː<:K|*07B7+_; JXtbG>gu.(5OAK, |FTjR>2tqp|X|ie#+-2˗/9cG0 ̕H\&-V+gտQS'h-s̡jWeǏ";gWbfi%l$ JG}9O ِe=7RcU E%?W z-%ڻ5 ,A5B_p p*= 0 fWq2b!uGZ_t']~KZoP#_ ,)ca۹Aҥ~*V2OVX?"Q6c zV$o0u5-pܜG MiK4Ro3x{-DS $Rxm}߭$t\vIa*oj!P 4(Rsg~Nau5ӇH!Ьe}ńQcB % vHtpYfV;uDq=d# (qY+OƍXQ\(M'+K@1/=Kȳ1FE.^9YMhx=IZip&(-(3u =ھ~f1'=6{m,V" db K-KG>5CcFjNx?wmq+[#-z^lJ+"ZsKR[8E$u W #HG&*<[ҾXSbH6nZ@ gV$ w BU zqt*E^Y^8:n1-wj*=3}ե9PŜL2Rl-$WcجI`"43^ k(X:.]hbR $ Q,0D` Y@Xi e}$vxiMYy2ql[@}GƟG![bb !mekS*D `-aۚU PXk4J:p,o)8Jt[dI;UrU unQ#&Y7$rakGy#n/!PDW@OSnLs2k CCéY?Pڧso4mz]FR+伂H(Afc\F Y5b= 8eHKy"G2/O9 dzJ:@aݫs>ڏM,~XJ4 "BeCB}:._l;[ ~"MSS}s}]ʮJjJVr6OVJD~̜ys[{v$ O=@Mq2b6"^.3,Dz?X[`2:=1U`i'\.siP'}8 RA.Y(hs Ԇ8`Հ#n s]ppO4$cËaLmȣ^Wo[MS`zPA$~ügVv6U/ڪ1-; ߣc)aqLLCC*S|[dR©OuZ8X.o)>@K8b{LSA G鍖Moogy!73 fj`. lc8qfC"ѵUr_1kji[N2E13i.z=w9 [}< .Ҷo p;լؿ 8`>ܪ[O;4yغz>a!((ak}IWAg.K%4dM$+lMfps=M+Ɗlc"+l`U`$y[k1!AZWsE-to;)kAwU4޲_lV`ȤWl1P* eA/ n/8vn۶c8,epZ|dRdmv+[km}|\84 pKoSZ7=ץXgw$̨b0ѺQf\ /6kX#kH}? (E˭2Xbae.*} H.#A& 53e3RmIHveo \m.%kT!a:o#,DFL0;@bfAsG'cs1g7;Οў=jRVcC\C Zjz' ^Sݤ N9[]%0PVԥ|I90{7˲Lb4@$ ^s 5Q (Ւ擙M2#g>sc`"N읜[֠qM2M TFC-f$╽hiՖpo*آpb$}=x;k(W\V^ˍW 'QSAqkӭ: YD,9ߓ@RLa"I| ''Pz\d8N.wĉZL`yj{* 9hdw?̖75-kXپ #e}LolulK46·;`[7{V(ms7d,?w*B;,rM;u@b~PKfp1A%^aYCrQ#Wb_Oih0/?4ְm,ݲH'4yoҥ-N/wkyܝC&ߑ\/1@qrt(oVX[>F#DD]k_rOvpI 7?< bPTJ5ttF:;Jʄ*J~ &IYNr1zl Ź3- @>$6ɬ,j힆N9~Nlf\רg3΋w:[ѾžJݳ_a?~:UoyM2,NTU;e|1o 1L~8.B[_\x/kHDL}PQ(nǗm׏*s w@M\PƆ_'!ґ]}l~2Ν-20eI7X,+  mxW)*ЪWM"\Ξ}9EY I˺>O2_dUrO_tc<;{ЏzS,Q3R2V&o℥ؚ (60|:r_;^g3Pcy]37M&LO=#r0~>dwӜXVMxFrf[M3cHX*89S%+졶 /lr/kyyӗG4{iǰhc٦oo~d~A&?dl]KT;MXlAuw#闋pG n;,eQ 루,r#E$B%Dr7rK`JaY{t:2͘Bh,U]? {y CB~4&h9b3b8^g" Kx5=iq*5Xh "ܔ@j$Y(YD\oЅ,o zHbHD_Q2UDjf2yŒl 0RRjJe<5X~5&n \4Aqq߱D"igb>8W*D["􅊎86jB}X%ɯ},gJ;u\hnyT!P-h&CE쓲D *3ŧxڜ1LDAQ{~-xr| UlyedJk]@`45]kiŬlC,܄׍oÈnV(-T>L I\YNv?ՙXcEQ;+{/>v"⍖frҭVӦ(ǎ[[t=F Oep$W;47 3(MmHGJiij‚U&#"T^9;)Jgvރ9})gLAk6T"a6X98&fLjvA/Qd˦w;W{bFz;"HHW㣱YBnK1zm;OH,Y^ݡe;gcuOuf [hĸKn/XPUNq]0/T+Bb 4{ rNy-haMM4C1-=ףpi= Z@65Fx(7JE艿(HYі,PtߡM[wR/0}9Z'ȡ./|6a+tvɋ)ayDfzXe+x$ -e.m ϶V^#GTNX7x ru0~%sfb^`)+BP,pL^!E EJKL# R\tƭ7:AӇٌzUCAJ AT[>:^ǵFpvj4j 3>} 3}D)IN*[WrZdCے,FX3-/8;{@v,)!3%\$Z:'wpf>V^u9]"`hWFZh f=g8ba%YoMľ6h\eqߥf7I}ۃMSF8c3:@1*ێN/0z>Ӱ%XK*9:Ja~#(x'?ʷ?)㋫̞%FR4`A8"L*Rhs5*zuL`xtdߚ6ŤDrMųqjJ4܂7PzS aU'jp{Q ߷K1U 8꟟Y+ϭPDs\xZ Z#5Pj5x_ő?^XĴ(g,{ l]Ievy ݇ eUxĞz0cFAbiMK)S]Iq*_Kl-OZGuo)A, un|RW&-nlKE]Z;ƉHDU:&3Ʋ]3@z$Q;8pQs,OEp̝ȕ4\0fGP382kC?q鲹 q8sXMZ4N]mVݗA%/7g$Uja&cEcn 3YV42/xymF bd!> R7uXHu^k P녧v3ޥ^X6sɌ 9k0jCWr:x 8,GʿKYc^Cߴ0}RF%_ߍ0˜4"ٷX[7a`G_ps bE?6rDbLͰ{c0X}'ԧho^R/h]ByjzA_bu}&P׳ a 6$% CܚF;M5FnLHE%,v)rvڎs!M3P+Rg<-ڶ44lH!3^0w!#T@W]ٴ& ڠw**AgTPNZY./S@q 5fdހ>g9~*6,fTBBD;v>"Ш 5rQ8_rZJķ_ YosOq-+it3 =^mD&7A;d3n?Zhy-{a۽K+}NG"6']ڬUFOC~i&g̃K#{-nAun!ޤOUNc U퍕(VL38e^fm|՟`Ya"7z66UВ<8W _:*itZ#8,_>H]oIJjٹA/Ke_x5@m^@ЎLCbS514<d@GKԻYCpZY;1{RnX2#U%ƫby,k㜎Bo6h8hHToc`j|Bj0ovɾuR~5~|#HMA paupG5Z@뮊z\$Ǽ4஠Ww3@(od .M`Uy$ԉф$ZNJJ"@GZ=RElQ^-)Ҷڭ-|{  HԐPN=|Ɲ#kg _>[o!0"6gہ̦<"Æ Y3yL"&oM6y@R5eWN6JIVEFA|'$hc!䠈:Kn} "/*ɷߧvF%I5j=dt vx='vY4[ R̈p|PRv fk(PHkViX;Qk젪 o,CFy3gTɺ̲Ы4-43/'ZR>peLVa)b綦uVoCG B,Ca/?f'PN+f֢3Ӹ7Ѱzp]BVq`#]e3n#E --StdsXh}߳-a VoXpZ5S;ۉIy+wipGwGbeAȰT'RueC3 x,Q+f(Ur+v$=!@{]t/̳8QAc7MI$h^ݶbdpIGkR PF3ƐPEХp MaRUmB~ E"zoU '-3'ע"@u 9, UATgJNa" :K+/5]k#O(okg"n~=nl,Xa6Ltλp="QsTxvqqfr#%SVNkeoHtX>_Ľ0QWPhQ۴ bEn0bU8 7!! 1fgK3?1JW}I>v`,ӻw,Ow:rm+TAVwv'1o9i{4у0 ik`' nEO!cޫ/Ml˹ җrWlD [c ZU= 'o);+Gb@_;H II/t.I*"` Pռ^I3{)& }ˍp_>?49вztfSWx$=W'SrG.7O0Ug╅Lj-R(zj"ݾ~0 N kz (q3#ۭap<5͜p6psp"(gTUqrR$c.µzY=Z@yw&v*$񍙵9 ˭sCtLbō_W>X}8FHl+!mgo.kĜt~x|5 c H] TX B %2qhu#6\դ:;\ۇIltraA}cKIyXRױ|@kDnub.Wi0thpzP3\b&@Anev(Y%MF 1q!khD=4ۇNY- 1+hBUj3a6ey KFޣI5?־Dz/QQx,+z({`"`cNA/t h-!eC:,bvݲ=2 ^A~|T+)ĆZ_f;v+:-SJgtl*BB决 ZMkAOїk\rR+99FΈB86=:/ $UBO픪LR?W\( j3FkˢLXk_.a<ֶ*d"*Ii\f=8q;eyNnw:%vPzWc 7~39\ ,><-L?_ D j3֒sdjAg i OƬ  !&nTVC~-WLz6!h(b:0=@^^zո^dyiBޱzSɥimy"XDJRv :\v"A_IѩO[Dd::lbϝlLe fdh.4Z,:hTh AشFe>PyJk(EE:x<`fLrf6j1kr鯅TIhOShWAuE( 40ɱYRa%S+M3Uj׵A\g:ӹ̔QoB8}悼D 0NJjD 䳝2DvEF%KoQ Omdp?%z(cY4@. }maԖ7Lnt;#K u*ﷃ2:*M}3ۚjgF, xI =F@xj-v7FDr^aޯZZ$&H!2OHs[t]R.5|Ȟ2;?g跃~yY˽hKOeSjQz)J1%%>D 1h4 '[}(#y>k/CpC)kEjU5ΗTZM&5 J9Q#Os4/{TƏ;e~6KvBfg%+zZMm8*n[tybNِ3ΫqkӅXi FSukcTey゗Oo'H:T:ҷP|zluk֤ӝs fa,%ZgSYM6y4B&;!+AT܁U:^z3+bq  ; 4Ѧp^|{iIU`?ꉸE-fDC$0)\ xL >}g?PO`<b:!o d&kAʚ '@FD~Bw!4$%fݲ~5%P(Z E(q6T.yPZ=R>@`sH|_';OؖvLlh|YB\z&,{y[+ԃ(͛"rҏ؀GL' hx6::>I9w,,X"֬>{6tc71pmacBU#x` s 5+1_I=OQ5s-g2˕q(p;2Rf%|ewsh!HֽY9d*R%.)VM}jJhT :!}ث]R5{SX㡆Cyܖ7z[ 8uB#k_s Z1 NWo>3a!xBRWr#YX*ۣ G` w٩>>YjlSpzl,:ƃ۠PW7H`|0O q9mYTxjދhhZ:fHm XZL& &qgSFgΨ]vj2JO-LȐݠzE8%V_dDj|Uu',&,Ѡq WVJ1|3ظ@|ȱ0-PM&.x(Li ,T`SY(*e@ /;,okq_#PwscѠX%C.*LtJ\ t5yKT(Hǥv%&[iT:3d5pA8&8#f;tpM<,ZB#(:jˆ֭zgΙ0vRh+ n˪##n1XY*:O%'[._b1Q;<]2\M8S y( \;egY4whUmU=\˨4BA+#qTBwz^PZFtK, V|oaˌ^?W'j5@oS%7sY<>aKYې#:vJ5@&^t"Yd 4e]݊ DɚS6SqmK[Cvo r{ywZY=!o3%J8F>Pª*4;kX. 1#COxp"0'Bnr1.)޹W7M ˭9԰\آk\0m73JmbDF@ne'c@@Cz,kqS؄/"#"u2Tjy8ʚu׀n2s|/vK`SRHp%L/uر#{=H c)٣*RFƘp|:E@ihU _uE=5: ^6V`s*-?U@ObEJmDfԤ7ǙOWf2 /%y5 <@&SԬJu>^&s{dcpPF`R.;e8ov )U%7,U .D;0s4֌ܦ(!{? M޿N|x?L9J /d:4:+/aX_HV[ʏ]&77*/C5,N JS/UXacü`M4gKcuF^c܊Zy;#?P5yq nv´s5V_ V,Xoc( (zTub䔂ȁrOtl[PXPW1$[u~*? C&  VP7Borm%K4Tt_p/coN?0Kzq!__ґEԥxؘP ] 5h]EtHKSMI6)֡bMiȰl a;7+ozFO|o-BF북u2@$y4Hf]U2uj7k4{L֚2O_Y<78lҦqPm+(r˭V7`X$cbedv2Oܲ Ӱ[@ ydvW1霳kԮ(D&Y/eW\<QdEA0)~r| =x'rҵo)H< q3PPZUB$oo`CVuzch'a&2NMpt (c 7w#/4,} -iPYQz'ۦMJ$J)vq7&-[5??+ੌ˕2Ȳ 4Cc'H,4s 2JTљ|\"M&>. =DE0оSR-fSV»hlj; |"\Z Gm)"Qs1+̃s,EIr?s$eli=숉wmp?>Љ_n?+V2$زnd %'BEEP_Ed!d#>gzY^cM(E5¬xnjXz(0ZXgvVhR쪈UBof!tNph(iE-ֽ-?8vSzGUp:իrua[ѢxfY5L͂*"_CvEz,{+(^/,+C5۬mEGXXaԌkBܔ^CtQs4kw}`cbGhؙioi_rDmW.T?,m!ܔ3 `'=δPR݉}$A/cϳMUC̪&ҲKzW`;io&}qSҀǙ|Q=ܒc9M/2S0iH`x oogjيw!AI F]¦1N wnP#"?멜]XD8.bˡüki:Qoԍ~ۏd1M>~w9`lѲE箝;U&_%!4样/aGeַJkmZѕ%1hes*=Sxp|Ӄ;;Ѡ@dXߎ=J$W^hBLMlHZ ac!$y׼|>ضۯGm5Y;G*9`l?/SԠf2$͘~XEF⫘QxznqBtNʔ= Ub!rZ]"a6Ϊil s %cߧ_Ji9罈DI WyʉY~pK_5^U !ӗӺOߩ)lͦ.4~=Fx&EoO4t&?Bl<_a zsr;Ÿ(3 gvS+5G+=~ )ܡG?ЊÖIQ$6t()Oh`r͡%HiFzBXVcT^o:f)-itÑ G!:)u7WPtoAfPMm`2P1\KbWiOpIy)]8=(i3°r}g2b&>'FHl)+zpIlʥ:?sՃKT)h)j|+@j!\ʉOJ%@?1% ;4Nȿ!JEt/5Uŕw ^ '3\.r( )3葟)·=>tƘUI:#䁱o,.{M;e?N ?KunMN$:KhQFrG'G?*oop[~/d"- ΏBd ́NuCz12*pHS A/7{83+7օM 9WFsglgx!2V64J3YUj5UC^/%R_b չC;(6#AMq_ _-N&$! 8t< $,5pnϲĕ"8u/|Wp>FFؼwҺ:TSON9yQ2+N4O鷱&2=e\0ʅ|mZ KrDy}Dq}WNRn Dg/}H^ԆrbmBNJsxĹF`;Ěʁ&/tfpGjAT-g5U2Jb~_@@ط>{: f}u~1F:R1yi|358׾fd=_>_3M4EשFF[]Ne|[iIVe)'GpZM$vZ3(FRF/Ĥ)+xk"]]`dzՁ@6NP쥄 Y8ɸk= q /WC@9vb,$AR++{sNdU{P/,P{!,NvG@n@ b*vUK}=F5ԙd~sSN IÜYIw/go?flsm)rIes*-̭WV0Eip\[K wBi"7r?PoSd1-Ii|c2(22@ Yg=/JBe.X<5^[L%/jJ{Ti3~6 t-N?j>0"l}_z1ܼQsP$*\Xx x(O 49Bv9$(!]=[TR)J$:HEX{N @د*5 iҧ@;K!Vx( ,LUSh D\Hn}ooR] f5۫MOG| \Hn"(zWT8+@ŧSjr8g#v{ZZѾjUDk ,[ԿpH3ԇj{P "h&x;LI#H鞥9-eٸH s=mV(qR *+)߃*疮ȚE@1 ctߛlT$VT(rGzڥ3^Β|Kr%iqqkNR3oeRx v{._u,rò$2 !(<11ZN~7\J!NvXrzwN 'DQUʡ}om1mOSƂ/57:L(OÂ^UbEI>,0 $w}x'{ѴLi-x1Z8!7UƇD_ˇjς3[~8Hj 2l|fj|ܭ ?7 K1 _ KECKR^ckU:B_?pϬb!%%CE ܥ_l(b6jSd2ĺPr'/ s+C9#CKB.8Ag Ra2qwi:s։B\e+XǯF0lPQ\'~VmȳJR5M-* (j_P`=O4LV ˆcPps"(7 '>:*I̍ZC0k3V nN,SqcA F&ɖF.^g=r13ސw9̖~Y+HQQtl{3,BN)|J&s5r>|A 2B,YEɡ&%/$D ?U2s|5,pvF KB723-; f97 Ul5oeo.2u6-:%ÍH'Fd/]jJƓgK@BK:씳SG?}kۙ(bߞ JbweϷkޞ"bM@wK<0%`#"yQ@N1Jet\+K-V8w&|yYb"S `h`CEA$TW> QE!ބfuƉyTX$ĕsznlMƸ  6" pU8j!z#tz{#kI%5LDH.ؘ[V8,*>h&b?Dʼiܐm>#Ą%፽H4.3sPOTc-b!`xY2O૊2VgpBPͣiG`zMdoHK]b)CO/%T_g}ժժK+_K(?J ာlSY*%vro~0647ٛ%ΎGӻ|,, igt"SWfR9õ6Sw5phuP8mӲ2 CX52Τf)m~No §H7aGZ;, >9@ "ѯsIn1 E\oMRwA%qZ 2~` * 4T^>[Y2ý@3B⩋ Ǣzu/?UF'7V=JMXfn}d0| o}ViL)E,kFZޱzZα!RzwKqH^i1Iq^iZ q|dcᐭ@;o[tF `F[щT|ٍK,}c`ԧ6!BdIM7Q@~Y.#GƴiXq!EiD]I{Gʋ#4nIIA=u"dbOˇ 5Β \vZJ= <`n!ŗ;f3_A F8:l__ϋx(D7;ֆȪ,@K6-:~[BYoKQfmc8F? H磄̊䷃ދp2:m (=Q0UX\Ùټ)6C_nFbA ˝Je*f2 o^EU)tpoaJ<X= y~W6$;$S,?˞8P؜ uC˕ژ{uzE4|0$"*T# Fpcїu7IIoG)J{ѡ̃lq5`!qa&UHRO8PmQk#0@Svmr1u6#US7{.Z-Tͻd9tNypXۖ^>? .]_àp'. GʳhvkO17UU^5܏s8bAGwv4D*q>P806q 9k:w;I˛њO '>`;dy pZ^pq5І5pz"yLVچ7qaF~~3HQ}Bӽ(aLJw{ 5ٞ#ݔyȗ(:6!?:L[6G7MF΃C諾FچckMaȿc %xIgCkT?hȞQvc ^@tOY3!XOd_'bIzh?Zz Yn$/*KԎHITDJpHKP֚_?vh1굪< ż{VHdTwD e@ĵ,4KjٽFz{c.7AtP OE~4I#L@fPi0>0$B1> I K ~IOL`F ?3OM3Y4vl}RC EAo}Dgŏu}*))5?/ !Ah2눚/9¼aܤ2(ѠHE+,xjd~sP DXdM?ك}KaVId{*0ROضC86~Y Sͼ,h+rpϪ?z8 '.8y٤y.֢맭*7߷KHbP<9+(xXe6x#+0C 3,foݞI,MD4[&k-h?bG;Z,G] ?FQK@ᤛb88ٯ׹q#mG#@2䁜<)%}(҄2Y2&m/=)u n!_&Uj/f{Ae8 c1 ۔K@*BaTGKXG]_3gGɮ!l^q閁\@v^7ft|1vSҺpFuc#f0QlVapp9@XPpi2jR(Cڪ#.|mrUU5':4yC\t{yv>Eс#G%;0IGcWɅ5Ҿܷ>$F:TЀ5oO0)uENʉbkVQw﷣ױ1OIm׹ )+ 2n匑Ρ#wDZ(pcu9 YS\|M@RX5d4$/`s:-Fw+* ț9b ZSM !hp]ح~t?9EaɗeAv}ͪXf?H[ aٕUFLv8vM :ѶUYv'`<~|{"N$p sKYIߝs"nӿ w )S? 6w-7oқz57Sj׬[]9G b)`/D=>Hݞ3PsLP)Q }d kwavVc^Dʋ[> zݵ"5#A:/RTymY:mMYD ?0 A 99L1+C^ݿ368sv( ѓ&Atϐg R0ɴW/:R6*E<kksXkO7 :ڝfJw( H`1s@N7~׀FjFGe/QFoܫ.BY*JlvS.%iq$j tq0!Ę$}E T@5>wfqEfb3)6nNs!PwZqL} (Kp+ ٗ0l.)Qfa1bfP_p1c㥜/8' fEY![ PZj gf~ycly?Ur~x0,"Țhn%sÆdQ\u-ah j7&IƴokWT4g[S &.;v_x*sG]CLp,qp$F--ȎwνW8C*4|߄/ml^:||40Q(p"V+Ůؚqtstdϓ^ȗ;H8MDaC-}_Y{Ǜ2)v)(S "ܚubyV%9B`'T`V7[K,]nуrf6a^o)Z TG#xf{$V]flL)'6%=J*0 np-KsnaMZvN@krTUnr@q ۖoV(̟0Iww+hhX=o͐g6F<Kvd Nd<"dbo O[od(=H%8^0=SuZ]PHE(2E 9fa(NOF{nOS)__ֵݪ3>%ц897$1l?Ǖ@焪{[dbs\x6r]ctWUW 䨚q T>6 ZP۶%/IlY2169ZDŜR66~ߣ[}^p Nץ3v{H_6Di%^陎e$az4`c8NQǼԼ1KsxdzjWX0W }”Lwkr8Вsf:$'6kO j"KVVJq=OHD-l^PhTHX 9>S_*0czzK(i?ȩvEm|TZiT=sq - 2%z9̳N)) o}&9"/PsouscbB詥☺i|_C!.uT=‡=g$Uŏ3qI/R [N( 0v.ce0?jLÃJIĥ5$m)\ú]vV6+"loݩU.g]Z>Vfq^cuCl{d;cڶ作Qx7 b! K`Bס3m;'9REH5ACYgF$-IѼ84_dN>%^y*EAIM _ [x3</HCp.Z:/|ɝ yVK*ChI۞赯Z_wLK"{ oe=EBuI0U h o$Igs*qs,(x52oor\QU rD5^QuX,ʎaX{2F'Ƭ !Տ֧wZ%zc7(! ÔV'uqq(xtWɆCr[_znjVGfz{߻賈o?N>7)PՁ `Vy+ބkIJp+"곻;M" ,i2TśyO8O(zZv0)EFWY+>y?8pQks^IE5Q= g(jx,p[191Ar𭲒?_x q3+jy[*{=$qX@l'sb2n\^9w՘:~EK֒/ Wx͏:fEV)2GIYA'Ŝq|7>º@0 ‘<=7z,`eU\`V°;qVµdIP>a^@6(tx|zŃ!.XɷXrASTjʍ^mH-T }p?6M?c2ŪKecQRɸc[0O`Iw&s͠0*pa A+|wMJ:lsrVgX.]S{~8vSaz -ZtĚ뽹0?GĽg\5*_ns"F ·~.Ο]To S4 P)[1”3߉: D@(m0q9F 畇e ";:K6`)P9䋓4}!a%>W(5dF,TH /g#q:zTޘ7J. ,Xf!dr&GW@fv̛x^g !wbxj/+q8/DlB&z0 N|I[GxՐ4ٕˠl:c`ҩ ^fqsO +N GV%H4;_#i'sDzB~߹Qͽ22jZ=0c}EwrBrKOoR9\LͺZNXF O:UZ 7ilp(V8:j35 *:}]"p8br#ٮ\ bW{܈9l(QVt: {y1Eu V~WmlZ(N ME3b nHrP_.lZbhEa瑆=7:W h|djSZ&Q&UIz#<sL8k`uGr&065 ^ %*=!YD z kũt+x^4֕_n 3)>s:{ <AIU=!3}*pr.4/I.Ys;YڰYtf#ɀ*6-C5He ew!McGl#$z҃Ʒ8@h< "J}:"0*fJ7z~N4]_7yy^|FIyYUEr=:~^t3+[D&t^0 ҴN! x<8Q/Wf/p([`J1c1,N6&9+IU{yEu:]7:Vv-e c*w\~v\o=MgnGdB\l#ub+֞d==ik*+W8 |]aIpo ~lI꼚ɤ.*^eH+ZP+Z51}yS)q ~(뉆֛q3k8HSY<}<"zj.)RF~2|k%xStفQZ5++a`"\[[˺6Ay5&=6*z*w͘P%ɮ7@F/{r2"FWVRRs%X?dƎY{vS`> lJ3wFh/E'kY) v+lWPB6߁{myRREjS6>.GθG_mSl < VAuuhj_],ȐlpRj҉!ٓ<%̣RFv_|P`BX+. 1PH"ЀI-3OI9RzC֗Eh}Nߕ{Fy:Gf  Il5#v;w Ҝ. ?陹͘2Yf{mE3 9Ι#DNhZ:Z^6PCml~9҃'Dˊq P)r!Dv2w"fye%^>^xԝ6]zˉylPH 5ފBӯXx3ZCY` B@5 ? #Ep}NТ!ўyM WwH!-!['?:km2P;ׯ] ˬ[ ΀D=sʹp:?+7-QbrÿuG-e1|Ǯ#sE&k?_^F/S;ß~v#Zm3rn`fDHC:H0ԍ `-k紽ndV)ݕe0nNltɝR#9cY51銏w'=_ ? H rF螯;/6À׶ߙnQ!^3̿OuqyYE#hVeN f~0"Cvɏ@'W;zcU^@]GD~-V0r_>X% m;;Ƕw/}nR(G ":݅q0 B)J(fy朻J*3Y2,uQ^r}wM]e\G]Sj_ {d:H='IgI#A >Z1ŘZJ\ߖp/0 *%qONeIYAQ(dJB/pv0}+sSr~&|Pۋ1߀$r#$}VgyuHmʏ66G%\oMdzۄ͎tYMsuB޽}K/Iaaq+"I0f}H[:6]¢3صB? ~yfMd?xqՆ?f-WBWȚ{T)$6_j(t"[IwOh'ytV;5-OČY^X<vZB\XYɵ l8'1-1C ~BᏘe WF "N= %LIͬ`Ekbz <%yLj9/pޓ.`'r]Y:!V甲?Vʤ`X"@gahQ<RՌ?cvLŶgF/)Iťغ/.L94 ZKg&cX^!kLq*hx; `+Vl1 5T5`v 7 ĸCߚ;r ડNDyxz*RQ7S6{0|-XRTɿ UHDz?IiͷgA:U¬|R,8M ھR~x[S~$SSyw&Rih'Am@ɃHl3,$ط_&)7 ߜ `dK*m%U .0 {6(ZϬ0H74Ԓ9{ŋVޣR1j|y_^y}?l[eҜޭpG=; rW My\(>.yВK*%t,;i*MS/9aSqi}͊L@uʜ"|4՜N-@@ EOlxjR6/} D.}c6C9Աj8EZ"l#s& ?H 44I;g@4܂_ :YQ.OۼRan0cX ut`f\g29 I i|[RUჅR2{T[u΀鞫VN Lw0VeH|iowkn[2R!p{{KH(qoG:|#.΀vfMG=z?>t57O5.g-Qty:G(mW^7ZNs٭KUc ‚ˀ"Ꞌ%peq 4qQaFk@)JftuæߤHN'2_gC'O} T+aD6D2DZLr6&o>8J݆+ãdL cID=nX;&Eg>uMR34iU)qR}9ѭco|d4`Ƙ .vP~W}'BPrPp(q(J!Ħ+0E!d|VQ.1\<5.\bDA٤d..3g9sKПRT3+^lP\G#n:EUP;m ;4vy6#0fZ7h@-k_d-ru m+2*P+`b Co/Z ~Uaeb}GI qatrDxGrWžX)_j~>VvO';ao{^ϟb" HY5^Z6n=q[bW/*Ұ^^HquGȫ*x ^8]e%=_F"r{tсbg 6ޏ g9T9 ).bZ6! ?I&0qomvMw(}TĨÂZ)f.ȚWՏRmـ:>gN̺EG2McL$ִq2CHbۑ'l!uvX.xf3lO LbTȦ _se7Vle)^Pܙ'Qԩ"laSA 9|ue1D,$F+ZmQC8L++Fo>R9'8@zW.0"a4Jd'ex%"Т4E)[`ǿg WZP 2;KG[RQLrޖa?Vy^U{LD"mٷ3ǰHkU}; >IżnaGS-d>\9f(p!fj~'-t6s:;\2W+ugu w_g^}p"mo0 /rVmvqDŽjHpܫxŶxcA37:kQ=f4=$^ΊiX~˻IhY.{ʰ=k6J~ר'ELH# 5Ӯz~ZkC2e<1!Py'(#k˔l-Xyu='1m"16N'NALVjйv闳D38xI\Ld#=9c\tr];{y¸¨l:,Y"'UϒyTl5Xe@@JѮtxse3w) [{ 0뎸(uy'N=%UFvPbb 84w"Eb@}W^_l᜜=$krDgF{dNYxB蚉`ʃb̗_tm,JV 3f Жf/Y32v-lU +{}4ȇo> l)QK(TCZaڐq8|_sFC"Ssku'[8e~=V[=5{*a>[-߱g2n1ؘj#Ucx2%w"_=X3u61K_`ڥ-A B=o_+PWs&+-_%8`Y:?z} mljv|ĦO+aV^LtĂ7IUSzsW׎F8NYZ H N`blu5j(+|QE]HlՓs8K6˥J3]&"]j8B6lq#xD_%C(KOxIhTj$0PT|IE&WqpE#ٟ* WM\=V}6zRcF^`AZ/Aޤ2=%oQyPRv#bM3ID=iP'&c[ȵ̏B821e rDq[ 3Tq2⭓4H~4,-ļ/&lM, 5psK-ŗ|9;FpgW|-/^j:PӗA݅ S=Rny^Ƅ(Sc\#7W1o{:o ߎ@tʂo_5sBek#U)tNoyV6ڑ9a&9P Oxw+Vߪ7ki biDWWq@gC496L͞%;Tn8"qpH^r 02_{iODZ5YX9߼H`/\ZLM8',J/}..€h8j]C*C"_q - C4TRʯ;&|w:'eEb:`K/[TĪIA 4gRB@\ _AN\I.ceML,&VN~qnEŷKM-F0x S̫e3qR@I92\C97Kx;Иe8';EKЈ + V ?ЈAR|x:k =djFqL8֨Q+|?@ﻉOk3in)`mيv\s `\xD |TCwrP~@b\ʉ.<֝2IY@<+3vr'.7/fsiR!ks"g1̴'h,JuvlL"9K>1+#qQw}E| ='"kVYXRS9x*e S1;9<8V4y?썰G MOi2?5YKjLG1pǒ'[#;s)3$ʚB)Sm\&bHCfwF+/VXh fꍆĨt 6 Oνmפ60k*2d [@>귒"J:ʾxb񅝌Y-I\Uဦ)hքEix)l*|D l<|/\!vjh ۛ̏du(i+9q~8YnM<Yk>Ch8ajr-s_l\440Et\-qgj֪kGaZ:=G`:)͢B`U{uuGً^(rhMeJ 1ɇegI%=:g[w\ٓڙǛjX32Lؚ#H\nMxYgU_ Ѵzy^ # yۖ. W_r%6ɋ5l'Mo>F]m%?Βy^NЖρ M\/k#x‘霙Ͽ3D&I/:=xn7V 2x_6"نmsQX:'Y:B.mX:yZmſ@ruAեyse֮ۤ ~f@PLGh.|FoB?<()u,9{le [Z:0(QLpgx?zv6&hëGD%kwB+@(&LXQɶFBt4ci۽e胾u'"ڷ%5xԹs\abxw |r+@c eǏxMEDsVmPBu"M3-ۛ4EFfMo4srWY96ׄ=9G('!8hhq?e?7O( -/ZĈ RJx@ S(Zl2ay=j30,2!BqR[:K %*X)27?5`4{94\k9k(&60pgoH(9U7vhlC$?ndf!~#8l[qEqd]H?8RܢaP|Í3Rh8GM4qvgr:L iENzxNͲ&ݡ|n)A8_z4tɱ@Oڸ~4~5VnIA a/ץC;HCay)0IQ7sͮ?>![En+_7-9":V--l:Z0 `ˡ0NtՎo(K!dbR! ^nVZ "SHTq5|;)Zhpz7F uE*D}PrdQ]Rx1]0e#QYLJmF.w~]Bm0ɷ.GB XsOt8]̤ŠUV.^S\*F3w]z"d',RߝR7?]jVf `݈>04޸%wJX x(3CBʣN>!#)[jZEj'1~,҂,}ܢϼGVs:fvx7|s9pK}%mB )T1?z{AԮdlpX/q$-oi+~QB^S0j t.FFd ͠?v/Sx &o[9ce֥"4W2qD4562\v-btĴ w؂džAfJe;kNlR{2'6ƌ*erc]ZvhS <{|[|25H8 bI 5&P|X`ͳTQ^>Φ߮;^MyuV(DŽ/I7G8\Zqp&(]_H}M v)r}ALʧ{)28CJ1, QJgZ1=r~io?q'4T l:b1rZ|yx L~ -8 qTAK?Ia#0u) Pm!8;o޵˫#yђlc~ԦbSٷafTGV֊=X5m>@LYcq鈖kG+E CȞ`ˋDlOҒT\ӍtZ f(>-?G=]TQ{۶JI1t%8e-F,#ꥴ01Z$㻼0UZ%fHNp8GnPvːBOg/|z]6gBƂp*M\ K=~5{jT ڮ+x;֌չȷ%.XӖ!RHI ³ K6!I#s=bSm?LZľqjPI2'OKwl\.kD^E[;uȡ&hJRSkKm68聴a+VQ--|xv&!-{6Gc^I.w|>ǔB 1 I=B(ڶ-^gэ)}:%"4Μo>;?:}Kip(>DL-`:0$\͵]#zVR38 Ϻ_}x8hDn[,蒢axy=Q״ִ'٦0RL,>V␎ k!u#'JWwIvQS(ɝP٠2U-/;,]t*dAz:D;mxIv)Rlܝ>I*kvEG>()#/T;&E},cv|'a"#ʽ>9Dm*6R/fg`ԒhWu֪C җmV<ނfh,^8XɊ#Q]jLj\\hߗ,pMؖ @^MvVc5Q?3~tP*` 2krZO =0R ʇ.V+QŗÇ柀X !ߩxO?&к$qz\h>KJ5gv[J(TÑr$qݴNBN˝s"U(w&@r>pZy1!_6erglӘ Po:pq4Ͱ6˓O?Wm|ǏKVM"sn1-W|9펳Aٰ.T#a9,n\i1fXFkG~/Ĺ͞ mG[(㾁)}M LňՙAVqFi}(2,׶1 qB1H,CvLPw5PÂ/+>x"HU,SjVoc@4*ˏB|36wY#~Fh\ՙʘLiz`GM@(胲_6 7yH,8C.8tE1.LuyWpZjis.Ap>_DRXxr2)馆A%ބ-I}l1SC(RF6jbJkyJaH8 _<PP FK}y}a]mj0 'Q H.\SyZ*3`aqe)J}HG3ԤxvkĔ&8潽-9qhtKޛp?Lyu`T}My,wbЎImT9atAV#&ʭBj}~=NϤ&~b傓A`/׷:Bܭ|s:"NsRVMI1l@>("I]GFQoD)pKꥪgK\[wcÈ`化~ۆLo/~YV-#CuĻͳ ٔ; |-CZ\8L?lĤăD4ޜØe|(R[!徃ߋM-b*CS{<݁2CI[{d+2?u?;y}nO1_PTF]+<+O|0Q~2έp9n "eР![u6iؖjdiP||% cltͺifk c*BbɤRӲ(oދӒ!BʏGSc -ԉI.}z1zֺD2^9sR}&ykY3Յg3 Gj!p19NeN1WTd*˜`сZwG ^y4kCq .cHgigT mJDXI] {D#Fqm" ?FhX)yGy^Yt5nRPc$*:Gtrdxmry2$6e6re(pգlNc*|p=J,N \D 9<E/-C'us6g5/PH}iC_Yxcœ{gWOb.q\J}jby|r ;7@!e٫ub&.{Z[gx>JF`uI |E$U4s<9E7j|[cݖ(8]"N(\ 5~-4ņ(JTi =/fJ6NX vz ueF3ԓ~%*FLf'vFǞx%I)Y:Xx L>#,7l%>:GRR4gzei=+coCQ=_{;~)Bn[Tl̋E[`\IZ6?R_G23ѤxUndrQ l#2M`)ejԸߤ@ܠQQ}ڠl|qwyK`\ψeAHjfy#^b&:"`ਲ8*񩅘U:irL)64*UyHUQQ ,Q;$ ~+zuaQ=R*_=jۨb@D].鏽Czo+nsҟJ?ڧdɚy<\OOpG<`ޘZ"Ϩ>ys&q!D8)}8'{EFѺ^ O:W,7GvX5ML*KqӬCҔ*l%%s3݋HH9RCR-$vȉ?J'hƯ?::3`- %Dr.h>S.TpEn_Hy5L)jXNVuD$]}$^wwѼQ5FP0s-tVkP%ji-3 k(>[Z]Iн!ҖxW/x06٣X)FRpZlI3(>dup+ 4~FR$c^ 7UXݏO6R|cĞXFB!4"N˚"nt9rOVN:^Kׇ T۵9FM\yf*3")A >'hhM`D&@mJ]fp΢ӱ e" .h^R_7}GM2X^p~e5Ԭ>kTlwB&fp;EބvB:Ls7vad0! amxo._(rL.XGBzx4#`s)&QqnlˍRW6 Xd`95Gfv2;ھ OgPh_/ x`ӼThqMݽN#g/B<ހ&tɋbݵF*vC$ *XML[b1 ljP)!|{;&1)?j>M#$x1!D`P&tJd mb pd+5V@V( +|[5ц- ^k/O@S\~!]tӫ,"k7*3r:l]#q2wO,H@}\-͋!Dß0X]/PhjKsj`kSM~ci[e Smԑ<]ФGzlC0CνXʉ"Z#?coۋώ,Un:Lw8qFAu!Bմkfeq +*{TrIo/cӖ v~ocI>*pu5$/9h/l.JFtkLCͺE6-b\n LFeA74\H5W>m6X`&XCӗ^W b 2izl,*nԯ|(8DLpm^z7DC`@?[Yzvp"" Z*QK D>Gi21po `` D5uSGb(2g~ H_Q5 INo>gйuyyl{==!u5K.蠮;}؝=|[Gsaq"ɱ4js2ycQQ=SWSTɰzMFjeo=<Vi!$;ˊNM%T>z4-c+FS|o?ΌH&ꮚӲ>YLAugQ(\@"𶚺H2M[@e3pgz9m'KQ~99:!.櫞+P޹rs Sr< ys=q'uGވ9M:? f$ڨvLc.bōH<1ڶgv%<?nr]3M!E[ͥ/wY u?SE|қg:\F0Κ bk@'?akXRc%\rM NwwL@M97/x>E5=^'ФL#e 㵭3;ʍs qBm7_cM,X}z '=†k0IjV~yoǬn~v&ʏN^MnIaa9-LJˁVp}FGAQ&J01g ;cE dYqmO)''H=<k)ʾoj2m;ONm-E7`sEt꾵Yd`#;IHYf7QsHAtuOQ;gѿ6eЋ>3fnhw> !U: A1K #WN#;^.D6.C@zEѓ2Sm9͇bĵM$F.**YNVM">3L#e"mc_6E8/\X,walZeǩhT5حяp;zoWFn$~p7X[}I+,4Z7"oڿYBVg?︟Y=ڊr,)XofYS7ob8rx4rXuZжӞXef]5k٪:QeKc3$] 駷BUwHg޴U]4,SE꫑(GfjQoi6')z*~t&< -Ɯˆkae Qw&(3ȑ#[72FˑoR@}2Uޠ'dcK;=9r&diʨ!CLy?ܢǑ; бޱ/Ô/K߻t+ʦTz>Lo%Nv{toHKΎ {Z=},xxl"=%T!&e`ZIp\QS<%un 8!`Z6uge( w#h̥5\ЄވU(4b1Ky0aگj"ѐ84n+ L 5 IA1LKsd%d43dwr 4r@8t ~E9PEJ~ů}͎f3p&6lR%fd/ǯ_H3 䉲nT>i̇Gf1e.Z<ۄNk5F,|oy4/ :ۿh$g'c&ڝyʪT*m9KNu3HvN|/Zd@!q=2Yi@K? S +U&Pm^СaVȟ ettz \LI"Qz4XG^\{"V@7ْ \bPYv5Ͳ!VFpO &M|شtS"P~9 ;'Lc<{V{#ERt|ì]Zq (q}a EWEd+BR 0188PIFra3 E]OBՏSZ3OG^`a.{7|:2T-r1#SVegh'ވ\ %)g42 Ab3R:rY<e4lM)P w')7[}(0ͤEB2̦ ;JG[ӲGw@&D~!3ᖹvMDKr ~aEN>'H,^͛c׈ K!a\CcWW>iAjtXE?:!zG՜zȻ@p$4IZ/auo{âm _A^װZ hܢT \+`!%Z̉v yPv#1,HDs?ut:%:3x$cQYj~Ero7jRy"G UM6=`P6O0xst@y~I@U Nʺ*XXC@KmMJ^W__ͧNF(~k_3ƙI0L"䷓.芙A8W r;vio":(k,_6- YdNH%6D2OBd`Cwh`[Sev@qSP}ޱѯ)\'_''Y@HRi.[G]-[&hEÊ;SP{=) IӼcб˥6iI^AdUnOhm=ao4N4XqQ鑶B&CLF'մz@Fqe۬QqBk+D-lsSKm]'R+!>8 ‹/n6ou eS7"ZQ N|ll,AW۝%Vݮir ^Vb)7=]d>.ٗB4)Ӏޭ߅]Į#&g#/B #qW83;A~_eBe-ڟx+NaŌ*_:B3g<؛gj2d!Xԅw 伙B^PDS]^Y6R:w9Xt"ǴV!b#iUzaYF-_=*R>fG(:Alײ=) EkG,r0'7i7lӅ巆ZR ~>wTe(䯂 ^AG ŝ% :HE~:9lF;/nCt\9RF=ʈbf?}c 뵋*74Ez Te99' `Ϧc,vk@ vJСf Bn !1~h 3ʢ \D<=gW Ὃa| ҙ/=<ܛ1VE$`Ջ} ɜ y+Y@F s޵FzFb]SvAyU 5omTM7҈I/E\}4h(a"bsxzʃ7߂^FoiF2f5ɺt>#8c3q@$I͟avRdTB?~i4.y+"ѽ1Ԥ7ExHLbA#kTؕ놹M,ۂh"KF2cxb (O[ m@sNi)g)$ YjJn1,/*IazosjT1'ԑzx3,mҹ?n%\/%SCEH&YK:=TPQW5Dc6"ӽ宱/bB_zn ~7.Lye J4)֜/XXsk]O ?B jg oJ'nu7a[T貦aAoD8,k@Fv.F}4!TLA> ^nc ؐ2.giK#bzi?6\{giV!^4uʛŤ4wWLRi B?r #DЌe_$ KI_] h yj1@ڭǵ %B>e.#@"Iq&}5!@YGQ:qI5iɝT+ٯ=\PbnB|bc2iӶ,@ݻJwA?B^V Vz`JMboAA5DpɄ{v]ik.M(k63Է_  ]M5vn$j̓'('s=AӍěMM;jqҸ_ǽ!Y|;<&rGD~S,rU^| ؄L  xBv10~Z/,8; BLw]'tb0%MYe_1jy_MTf)dx KϢl2 ~iȪz ,Ɓqߚ=$OAD VU*[juØĦ2ח_r7q}(n X/c5dCG`&e.MRנAo}E0K`8Ta=IW1M2Bc!=4Y6P?$ﰀ\@B3~U޿-"SINXuf}R+"#A"؈:~ J% =dˏX+4[/ج%;t Uk&lwO, Ƽ`csk4s =酜KCS're'M}*E]@\ƳeYp|? i닣^y24d(+L!Wh*YWD hu(7/֣åy#{ .#mӂސ/#<8:%4h-Lxg |[W!pd23]iS=]oM"&U Zh?OcI-Noc ~cH¶?N_L8! ~~ iyUgXo:O:nJca>\4{7 kȦ!70!#/U/>s8L!gT  ^)dQ*y&U&1 oQص?`:=jqet6vue202nKjIr`hv@$316sx{5d镒遜Qv%B\& vL+1";t=2iNA2{.& x1hMtcm5,?7~p7$܋|{WkSO]lukq8j/E-XjٖFaP-[Q,o+bhd]S'~a7rϠZ?x@62j˅4P;{Fi8nu 'O^ϴ6í`A#b<^~\xdm2}nmD>ɶJfq>Zb3;߲Ҋ)f frA<Ѱ[c["+TVpvɇz lz3F /iTǁ0hY,?;`Q(H8TVz UMw6h@;w祋\gj!Նi}Nb%\%҃D`3f+?2rU # z0tNAsrBe,T2So}a=pXvKPBUʦ_Im}m& F~(f| ? i^(@"$|A|}P@5]4͋нDah,ڐh@;~p7arˡ!Q?>z*#^?Dˇ?UdFc~L8If$޽sQ_0~f}IΠK@7.C T)?ĬӒV'9lƃ(/S ahA/;;OELڃƛh&GcHM %. _-~ݞ/!=FNpÃfH/-W-qūel|[~oJWe RP7ӯ4'+P٥ČJ.~nn2Fpj#_C&^wZcߞR}k`:JW< ي"jyZi/ %j}u*7"Jϛ?x:f-=Iu*Bg=m:g#(4V|CG'ta0ƾ<6jp*tM4W(F=}ELTrLel}n`aN8nX;ű}5C# uw##>GwqT yk/ݩ z2qZr<F r&MW`ɵ|I Qs¼_<-`_y.h?U Z3oѝ(xB2IN濑+>֘_EE yi? OSUJoݦUNH"@QֵcmSDcmhg\K'XBỲhAXJϝ](};^]׹Whԝs8&*SA;So=`"dZC 7fU\͟>RhjWHk) Ej kJʉ FMtQqr7CTE9LTq3TVGEHHV&W;GсC<9J1DY)%mЫ~r<*agy@443Qdmi09p3Pm!"53!CWeV c bpJI7Hv9vL.SQp5wxi`s|&R-&NYO-:ȮLޅ0Է87]l`5%UjڹԊaH]%YmO3q3%諳qW d #L3cĮ[^" :zxd\=yo ²+\o0EZL |Q}S;uu$AۣfT+Ȫ;ĺeR*g9f[]pd8pxN@'r2 qB  fN#konLSLb 8hm ;D5 ={H!=Mbdbz= rMm67:>"7'Ppѵ}àBs ەX'^9BVw5uDݦ`;󮀬ݜuR*viiYcel1旘`fr0z%ZE0Q1[3&O8AMMDz"P{A tֵ&VllWĺ>4i?_+/[[$e0WevCl¡/!3ٛLLӵ62hQbf?os^UKJrNBj.ocViM#qT°vB9=.]}HNĬ0tkzVʜHN3*7ligGtYGu}S9o1 nD/@,X6бwyC/ג5Ũ%H?M~n;S>֙0Kv nij;^֞ \aO׹O-Tc9a6G .- uW;OcADXF@Z0<&[j{z P"h c#Ts^M2}rZKO1ǩ)%;-C~aVwG""t%M69L|nl q&J#ےok`Q{GT;-+T@m8{7@qP>|6=Gz;Hצq*RrTÃKaK *b~noc~hSJJD p8!QE؎r",̷.߹l5EF H_$^)5s'm1cY9o%]q_v#čgANd  :il5aꏣ'&㲖*|%y 8gxhN"VUodt u}_EU0хL&Q:;XPMWu*#ӹCMp#QFFyk4I}=Y _X?26W.[vGt:j<+(tl I^nw/,Y-G%W/;Զ/#(ߕ]9šy>:[#߂3{ymw&Sއ#ZifB<(<.Z7%KJ9݋9gCH> cieMtna'A|{vЛws$n>0-KVcy>g\I(!g݂~G2FC9Ⴕ'ZKbInv4gzy^rHyV;=FNYUob=M:a ^Dʙ/Ĭ}&PXpCp=pJ=Svw۩xhn1(}_ΕjD %hfÎm&pmvVRB?#IGQYԣ&Cw@E0F^c`\^A΀Bm3} D=0W^00=vƺ=EO[(CF @u9ߌfjI;;,PA+EYGwB\P.^5{j`r؞0M޸frIn\-U/5cf@yc~'0*wrݹh0@q[@̰ Hu4 ͋:) V5?/Mۉ#U^}ao!ұҦb=B 9Ԣ( I zC:~ӜZunxY ~U|)x$lqǠuzS%[W<ƃ%eUC2$eG h .ك$MwBaR)mYyLPG[ t(ÎV]Fs="W;!5,=U4:bNS-[-'Nz/ɯ-(%dq^iuM ^Wzi{TuO>%m魪(҇:dECwēqTOy]8~uRvP6C~ڟdVy}n.c4̳gԊ<@ρ^ TH{w vh#d^`nY.>8EP5^7Q_jn~<0-oKn6^5V|1/w. s]z(y1yJ^ f+H|qYk83=g$eKu =%#Z7|RÝ2<̖pܥf1¢]zW+[p]Lh'sS^8?\&:]6\T){"yְ ^"o=LlS,54i 6<a\pQO\;s iu $\UQVCv( @X/[4!5p;l5R`] FI\6rVOD 'DLeco70*؊\(1'avmWE|hyN޻`*.qQဲ^|^陖[>)e^BVPY{%wm:mƙj!5Gp5bP+FeZH`/JW *JxEb;Qd)2S%Nޡ/LhjERӪi~Aiٱ!ae PFfIK({ 'z(z(1GB*P@j 'F`Hr%;YH\m~֡#V#~XmP߾EAH;}UG:eK~} 뚞D/(Tc;\lJY(:)HA7ͭLQ6쥶kIb$q)|F=9ln#oV -,Lpߦ L"-x@Iac0A&8m䠜 Ty%YQA7(X8|JA|L >^ øM!d/0V&dܞ.e =}WJ[nBl(ThGzHOfp@Gx7sH,\V\^ѷS?.Hx40: rP=Jd} ݗj)AaoWYR1pɟ3!"`7QfkՏ0ѽS!2IRw%_1l*o#?0%4=?l6JY;aM,$|/m7%g49E;hN>%M }Os@XFe^;&JQ&ܾϫ[pfWѝr } s)(Fc``ᾓGM5H_.R٧"{wAib =( .?=N~7&٪s>ʭJPL J) ^mBMeILs*1ж@:I/+itLqcᱨL]W!B3-ٟJF'KcP*6렓~G0\l*=HAu%FHf28u@uw 2`m)V>s3qU0NP2\ϧڦ<>B r/Yl^46&@wKC뚟Ht{UAa9jfΰѪ%e@!5A("k!Y9 ]p;I_a`TC(爹CM A|Ugn889AYF{2RېNVR*H0a#c;2Nڎm7tHk^Lc^ p~bv"`o'v& @yV|pCV*5rBȌYSyDqӜ`\HQk\1`rʤtO jvu"[Ώ础Ʊ* r^fN-+[%JΉVXtv*P:ξ@i~Yi_Au_JyBͷ3NPKd3|ӺxTo)lW1/Tm T3cR jMꁼ}>3)Y3v}Za7*-eSf) ތk_>KB"xOCd-~I'K {]43Dzs?xhʘ%5l/pqmO0?F(3Y<& Z'?R~cuJSѬ_<eCXU\2*~pC9|ബt^|Beҥ<(%0ۍNg:G^*P_I*#W ie-Ӓ[u,'M,ڌ|8/< *m/N&NpiyvG7x6=/Ǎ_KF>6=ۛHYB4]eJ`+mv"c٫M4?:2p<^ >t̓,u_A5jS6EGƽph;gYZqt0'֫bO,FK/oK [ť\M΍WL ZCMPZN|T]JE%#/#褐.Xztc\cQ& Q֨ fnRIJ2Ob'I2:>ih_۫¨m&nqlu1hvsٕ_v,-eqйWέ = .Y8h4Jaؗ|?@fwa(8<:g/v;iEw$z=Js#rϯPڕ̮$m}Yh-H b3_wڊ?B(} Px^L092 }]G.?h1GV9wrÕKEc|>lg˼FEof›`195^D¯^Z‰I¨e,݄EO:{l.o@5/! `:2N(T+&`|.0W $X"o |3ܗjaz0|ֻϫ_1(hX8E}?LGaq(4uǞNFi9"f)R9p;1 w\}耭}X^;1-4w,wB,R@UvsAoߖ/%gr+;s2_a^ 62Z_2 gaة[VGI=/M~zh:}A֛a$ΌAO&.$Xgb^::AӨ`!=>? 'Pա`+46 O&O_vS/b ?M?%kwL`zIox\F֐Z[jk8ReX&Mً^R LSOoUcT?z5Mh4V|j+B~uR|L=ThpvkJ5ʴ2TѥmuW[(h?eS\@#|9TeLɧ'G hI 4-7w*B2 vZT).*#Z_ݥ^'hi {*DS&Fl^@buQ&#xI.[\gHZ4v0sn؋ @g!Ac՚PFgh2a0wyh7X[ó}-Cvuq h=68r.Pz6m uF0Ɉ 1ZӡϷ߀Rz^jMA{(4Ccj PFA @<Ɂif>-=?/}'OC)y+ fFg2#4AЌ4٧wJ|<[x:IIi+R_ABUT褩KM<4v]))~Pe0-{'+kCW_3x4X[7¸B=IapuB8b{_$z6Qq!P8Ǣ|>mB提-U7S)] 3L) Ye>b"aa1]tw>#';<(E4<]h^^mJ:qkբ|H91߁m14jWA:rNQm~ }ǒ]$ĩՅ[=#uE=_d.&|"!f=1xjީ-HV%c%!ue31cD\&+B%dMZisU3ia5o[fmX^SE9ĝvPqµ~"WwE e('?%!}YF)љݍj_BV? q;E.=rᾯ)ݟ$l Imi YZnFoHkUl-E=$vʆJ81 LKeMVx;+%UB]:g& A*~˪B)K]SHQ)?`ad l̵`]Pu>J9{:KO}N w]pc}cp}$5Fgn+wl5ߚ Fjz Fz&̺pj:rcعn)gqM7(Xެa?Zg8J88EPB">c(ϫMRѼQ0٨B .?Ҵa=e1r}M7}ZKh~U6\kM@}]mKT":{P_hJ@hRՙO7n2xAQU*gCZ8?\yWGL@'=* 8 >t Vo\(Y lmx2 NP>X$u!Hia w!뗅PgH=&gk[E~FP 35%Rff-Q |Q+s040 ~$QsC0p,˩M %;'Q KR^kGІ<#y[|D۵r|WGKMͨrʬ h'2uR[ʵ'?N.S5a-VL Ov} рX0Tจ$nwRLżSު[1='FVliT2y`AGeѬaک T/C6*7Mn~@FjaPrm yPQЀIgVz?J+ryJF/IlIxarfj31#lyf%:}xn*Mnj aʼnh`U @e CϵW}Lu rd]߰3lQ-aK#Qsn SCc'53)Q`BmЈYC!E` 桩DžӟVɋl2ؒ}kUqRGJsZg!܋lV$P#Ƭ<$:,,htD$i3+xF.qO9>@}}[Z^¸8C}4bŢA-@R +0ǜhލTOY\YzHlĚQ/c&kO0ac~,ĬtQT|RȬSk2.?K>7;Ӽ<^~*_G'Fbl^'dN)Y5 lؠMmçKبH@!,xd g0| *׶tA\4 t.hV(D*Ygkz;V jK8^Zǵog7qo>#]Q}/ _"}6z 3=ЫR(!z*:L7Da^IBxژӐj8Ad*qM,dV>?MR3\]F $SVjxQiec{C2 Rk%لeR\Ax(R{-=]oϔJd' 쬋fl[tZ.%ə=ٮU.S#qC1S$|PIl%aIlGTQO/xދ9`P)4igK./òk$6eŌW!f>cԳ_Oˎnw2OO|ԯxǝU @ **u6OfhBa՛ r297WIVt[̤f-=E{R(RbڒkSz`L78#ϯ K(KKZŶr+(@n)T ]jZG1ۤcI pxM}2Ӵ1a3McfW6'1^nM]|o͑O!-->,e iΈ\ۇl6轐́b26[X7.ZK@=b4N.ΈߡphX[*憃'g?k 폿)Äp|X)&^ -dn+1bIS5,Yq/>!22JF ^ Ax)G8ݷ NȦ B"Dũuљ֬s|5WO.yѡz&1^!!+Cg_Ys/eL ,Ӕg2/j B2hiEVۙ;,wTH:+3.kOw~KsPz+ps!n!%wGY<>c] ^J@4QA F.3tE^Nn8OYEKHᣄKZi,P?e OaiDc}u.|?F2i)9vniI#x]E8٤_KB5{w{]W#,/Z5GI1B!X9))ڶ:*,dM4xkmZ #ѧ7㶽=um])ԕGnd{^2tkEq)`]_s oe0םbeh(H\O|)@&)u4;uɦԋ+;18T DUp&Y_ySȂPCu%-=`}ԥt- @欅2Rba)Jp;u*4*IV x^F"8ϱ_N",p(qemAI} v99Sk`Aw1=\{ 4ucVq!q.FlFzY"@kwe\W@&b+X "o·DZ` ZdHO3LVњ\1uLZ8,1ɀĠPޖe ?, 'Njb&wu9!ee%3E{| %M`%8[ng߼ّg\hvr,fUBCdl7ReSӅ53u}UFXUҍј1]x\m[17)-c0oW徭 _ѡ?[MSbqNf4&jT:@P_pS`K\+9 #B3 v8B\Eiُ4[X!* KJ C"Lg1nLU ad+kd6t#QiQpj4 p |}L(~RC*2U7oG#| "zGfcZ"CU˴&@dQbNo8̤ Y yuvDht/, ^$vp/CS%F E xicK l|Z4ݤ: ps= xd(* +M9Hb-:Z|G񌬨ST樭"s@;!<\toj[1Aoyu 2dhC:]!-<(RA ̱wِgqww|7ah3$oV| N RM `#LA[@\йf[F%A\GY娟B@a7owڕ `gH*-v|}խIpq!e#qⅪ{ܜ6 5! 50CH*.5uc{^yR*NWbYRcL>/c.;^f"*;9{oJIMtՄ#ݕC;-%vަs%6jIvtVniur7;Lya8H < bh _ /m6Q"VHS>۔kH: cӪ-ǀg# @xrͲ`/G+l]irN"lk4pZ,/M;i-mAUKqû*X 2rm,LѺStLSگ<}p81]os:Tpv ۫pd'>d 9U^]avo&D-f74\#g}P*$rM>8_O ([jbJpڴ `mm sտ|͆k?} 6*eZ}5cq3& 콫WĚЬI]iR Q" U>]Zݫ=:vHܛ4s `OKR D'Η| oviŎ2G.BOiేY+ H _vòOE󱄹B52BZ1*1> [# G3ք1E=zG45),$C7 RӕhYshCMqF`S}%gjZ8ľ*(QbcܶZM "2_hnmh<l1 6FnVc#Yvz/Ww Nh-DF5^ZwkxLs΀a9n`{E7C|_D@bFj$칳m?A -Zѯ7|v$C&Vd2>d&@Mfxâ 1Kg_9jP^ _i ]JJ>Xqi^0_Yo`4:W+qíy46FF]p::'7ԚHN}3mƓI͜߇"nwV4,7E a 5Cyf&%R`*k9cl5{+鲙r  'HlO+U@2cOw2 ?xl"wF*[yO?  Ǿ*4BRrKD,}Pd+ ׁmrҾli@7D(%YҬD-A62vcul[r1Ha㨜]Z?Ϳxum %JnE_&py{"UAR#|Ƽ%orn5NHac>g|WGe4 Or a#H{1!22>Ttc4 ;3 q҄3R=Tw|"\'+a=?J-I/zJ$| ^ 6VnC]vv|: eA> -"S2[1b 9 r( | Π g\|IVq]?:' ˡD5<4Pl>5a,&<Nѻ#3gt$GvQڅtoٗkk*X*Q8`&m%K5t WS ^!wȅ c=ݜŮT)Ԓ@Wۈ[N5D5~%ӊfĿh6.Y}x(rZS=^԰Dm>C۩NFk^$܎3Fɘ^t\69P}w̆G_7&MṸe ˕廆.Qw57ztZW {q0` _eãv_6 Jdy?:5_z)XޖRQk! )ަ3qzPs_l[8Sd2ao&5C3sNpΑKÌ tƄ4wfv,OSPxb]ߑzSv~'qǦD㎊J1ZС[\"=Tol$;ڒ3D&a@5a%{rO&V-j+-Өw0CȊI@樋WZ#'٣W**[<\&Pх:46x ,dbb.:u2;^ya҃$,xmm^c a؝AU= '*LQdjL6> r͚pޚ 98 dΡ`<֤'!)\G&vڳ@AMh+*VKKi/ c.Hp7-*X[Ih!J^zGQ=+MCtZ'Q!B;,r+$F_4SQQs93$f̯vfDNS`/soAuj3T'V}h[F؃df|w,mIL:iIX%]q;er+$ XF7M3$uEUze Y?l <4X7dsclC2xbƜq^‚HgLV8'@yrtmkd pԢ\i6au> d{܈NWRUfyDF͎M6ꯘ`T2?މc8۶{ Y2%T>L,XL`dž~f zyC7D܅@mpͦTکUy5Rq$0$41 _\3?N3{'{]>rŠ=Rw0b j ]95^)]DmGAG"E\ -I̈́IerW|Fo\=fג1ͪ܁O \F`ogI..Pge.!4d3IMPU|x&=MI@𦲑})D/ (13|#Z<0~Ly,h!L0d6@?ō:Ր-ç`0jzBoTR4wzYG2Ѻh*e‡K=1Ұ k~ gd7nyCN'$2eb yFV__^coSD[Z_\ի|-Q2A|䝶[ 6]X"a"rx\8\؇NE-!c$xPvy&r"`\-μ*8VoZ"wv,"S}F8ܫwF}4zmuv͖C:HzbCdgYԎ!->tDĄ8!NUO|Eu}Eh09@nX&|Ț~~W`|AL2*C Gn_>F,6}@[QlEfrr=Dvt!ZЙs;20ԯ" NdV<|5S^B?[mjYU؏r5%*|^W8SYl%iLL#VA]U0/qc~C8Par۰Ni4 bƥ*=qz|`֠|%2g>BƁ/Æح6Q߉mTI{,X#WC13@60ϵ'RI#t 0\^B̅|x `Ƕ@;xx7" XHPxPQO[EYd̖=Plӵ(s*Aѽ.Cܜ)ZdԍO,ަ|:_'pY+@[G== Bh`.>3O$y<&]+5\j~ϺlK,(+ zm.^m 5\^0KұwVTk1:rHi@cLÜjP8O|_H*1aKs:UBS֙tOcgջT$|l`-+5(َ^)e4ex1Hhi0 ZC_]Ux+nD@ݖTeCYŞ#cJQ}zBPJ\FPZs 27T4`4i oYOjf9䑗C//x)X켼ݭ#..?k)P)Q/B?ⷎ. Zluz 61-Ury͈aFvI %^Xū_΅%yٔ7pW;ot6ɰ(߈wW`v8E"L"(xX О G ;)D9*4"$T#E\ԛN٬-2@GB@[͕k wF;h2BV !?'NulC*U_o(ώ#Tr}LxF{("@UwN-Dd0L[LwK4c2Nѵ9޷sE^i_b';)ތڗ#NܴůxRӔlvN+5.@E[W?r+c6O9CK2Hr[-3q{p'}r( KUa{0|_j\Gc[-5 ir=Nճ:f#.f[͸6 hb=6ñh0ӕzNSIDz[PœW\2 d?J[d%f†v H1֔䥊 Tvl٭޷W:&X\eS[[~0u0E0Qݸbᮙֹܭ09ޢ$нrn~9gd`X Du"_ձ RI`Zi/;pVW£ҷ4}K$C|%{)Dmwf}c6k SK E.?LM*X`=qJS7}#j/'RMZ'^whj톣4&Qgͣ YXj!2V3 jӍ/ "2 UoHd0%?^ZRf"AmKpXe[N6P O׃}TQ?kK<_dar,I1At7eb߮N hÙŨtRk K{uILE c] 7UDr!Wi{KCFj 6}\>4fmroSќ?ZBvl!X;@xrKGu.dq4 ؋&pcc[!O4U _yb4}E9&6`)ߏU^_F!D3δr~EzGoFQ@;Y`5=c8xX a e=*7'Ly%ud-k]KLGP7³]>-QkH*PӪ3A2uj$ҬQ$ ۦb@WtSUqvx9|*jqaX&!-C#(g^~!+v^ڬ M-࿦.fzkVñ䪶6X,2'Hm1ҡ$!5T7+y~)V^v4o. ZB=frѓi {V# !дY=+&}lcC?]ܸpꂤWʖ@ ]h)XQ'e\fp !6$ ߩu⭢{*ﯷˢr½"*D+,5t 2xƛ0!G ('XR3/D#kQ)n1"id,`]ѽq+?wٽ_{ץ!zXc;> k@ΦNWn|%65-#QX@:yF<\I3E+Cb[~ң&ldWSNrcGKBc;+LCY?J62u<,].Z}1 ´n:d)Y$efp|`ȥW:Ez;Gla"Ĝ`4_H2`zcNm.{W2EP%>Ocz)VziI97h֌C@?аE,FZ8JoMaF{7#S^mN|AzaNxt_NYcO(7C,F(jo^TMkSjbP8PaewFFI-3,HČ$/@VT,{<A7^V68;9XJ젿# f@ &%NdX>0@?,B|ӆ[~d5bE)AEoৠRz7]Q8CW>u $Z: աPKQ,}^uجRx"ie>zzyK~3}:kNK;NO1$eIK")bBH5u@W;`>KK,D17a#xfaa19-u Xt.mhK7/i vT 24I8f ǜa?& s.{kc)8Ub0pLKT#D}pYqϱ ~zuVk~G_?91o+ڝNAĤu ӊ.T rH *N 1|_сpad4x[ /1S\$ nQlA7BR3Hs$w(8%<U[  e;5@2\@,8]H&:t&51l%#8E~ϸ@&GFF5!k$ȝLl(M,(kk~B;JOG OZMߟ )euzUa?NRhhRӨ%kTtq/Η RloMaf,\@[H?_(<(cbLa %r: k{A"̛,"8a0+m* =~_Ǖe]z}>:؅džgoEђkn! J즥7g%ۛJ+wCN/Ǧ n e߳˂ߩ_uXO˩!sNS=4Z׌olikm&㖟T0Ϟ8EԢ{p8uT1c0tcuDo\2˹ %HZ $FZ{2E/jPOE>ۃyMҐ )?XaR %n犣5Ω#Kp?w eF)cu{Oum&;eerB^SعyOWx C%FWu7BtV`ٴarXًAxA-a*_{PQv=ww6dlZc6%Y+4tScNb_<ˁwk,݄$&EUՍM4='W$8n)h-:HrSMi&dvfMyf0R)1NzŲ:N^֊Yf.|h! ^<( {꺩YM|rIhh횫E4]fY(?d]̳Y P0r;2LO8XyxD mejV$aW8?yu!ӻQ# reaCQc9p~6z$R90_m\Q1(Ŭ|b'MsAOm, qQ}vO*8GpVXh#g#ȥ-A-MtPX Pu$g45 =|Vt87VهHYO;cxl7ŬGc{-y>9HY#43!0W;T$>î Ζ4u)A8YsY#()9zgwՃ^$;'vy3FaKgr|I J qbrF9{WBܑ:ec[dЛyt4ܘc1h; qvv^FYlfpm݁w?}[rW%l^`Nq2UUcc-G޲2 V\M* MJNaM8#M5SYVrW$F۲HeI~oϦfN:E2'ٴj_.A&Ђ-bȸݙ,Rhŀjbt^l5C724 G nVBF堥eȓ4WR~ @_jGlfϦtFr#qj4DC%%3:vX5q6խɄJeNƊҩ;uI$!jݼA"Hi!$h'շꏈt۷KWf!y[d^V/G?X<@==FQ1 xv& b_5?之^֤i"my^S 筚d P"L4 8Hh955Ȃ􇭻.MaBtKJxq =p(4  6ymf(I[TR ̮d(K!` ;xF˽2}rRJ&RdPpqJinonvMSҩa/bm;BZ$%BDkoMr ~9v1 ϴB*L5]Q~Wt񂨌soUV#5sĕYG :Q!CP!/quhm}ޡx1YfA:.Efo2^?r9֯:T٬Wz|h>xd3Y$OIʄS&~c-*mYIKKgOz$5պgqLM\XJ$eL(ɝxiҞsSx1YYybm``Gu֐7*5JxiCM.݌lwfcd#Yfw3ڞQ4hAԭGmiϦkĺ?S٤k3 zKk&~@vdoecѫPB)g]'8t$>A11y٬5wS)Rb [P+F ,xWCلLҧ#>8A幬%z[ӳbFB<wޙȹ@fƒх3ǹz=3[/x='ϓsŒ~\KēC> 3pj |磔@Bژ# #70h$ūz +,Jm6=V[p)ϸ'1abBc!:cv[$宼‌m?ظbQT2G )ʫOUn]\hbnnX26tW>|,RzdLzĈ $D$+xAm}/(ܻkDEOxS8fLjg?a{/msPN%/0@B4 'WHc2!vLHd%uK'NNv20巂;3Fmsc<|tE .'db%LB/]g<'Ozյk``<֓bG(ۉZ /N'hCS[b0$-2Lbj(Iթ˨;J~ph+HCuCEG—<Ϝ s+uMslz"}2,OPuП)VRϽ8.&G% |?Y ;wG o}AX3"+=XGk0un˚ Yk8[}퇣&K,15'p-/y`=E@Jmc v#χglCgQ1%PoX?9 b=zKK'w7ňZ22Ò뫟{KK/bF|O3"oMZץʘs79~GЭr4.LR* Z YO'>+fr*k se1M79]}= %%s;,;Xq]O dȣ:1+*'s$fq\7ao0sFVXۇn^c9P?p0fQ:$F(|;s$al.X)4ђ_j&~A8oh.rHP6"U %+=U~Ѓ$$},6/;-1Z0_4H }HQm`Fx=]q}[^,B DYc$hC_P/ ؈H9͡&@JC*ń;+{(3@zj[_|8Nȣ_[jdVL]ё%Qg+dF,-?#b𫟨y}O{!4,6pQsVNVִ76esHW8)ub|ߚZsn7/jsv;!B&~z.Ӥh- є$i coIȬ3B(X o+@Kc ldyuQQAQy!>K;xZ()uwdNlts&/$Q,&=یl8խN'?Pb׋;jN ;b ڠ(rZ#^_0t;fx,jY{31H>0&$0sO&6;VccPZݛ`Vo\ŏLr)A%xN[ĥ69"|r2t.m''Ӻ|0MnZk=44z*n*\YkU6u0s*p Km4HA0Ee9ybaO5̃["#ľOf}}>YM=yjJO{ONZ$/w$/361OE9)A+?' (UH4_}(½%ihS߮zbC _*:adorarsjjdګ p;#lը/5T300nAw]ߢR D 1G}ojy+# !`"Qw[eUTX坍Y8GZKBYQ?) T7L.2?ZnYK L)]WW9B[*EP NaW,YI\E>5jHg^ySN]Mӧ35e'䪊*s~vkp#6FF;wNHV2!|y3Νt71Rf|R]tkԍa#D_CVB7UشdUhZ_@Xamd&'ˉn@4*rLj(@*JJ*Opzl&0(#ՊVqp Vf ~ʇ:< LYpGk|Z+$Aely% #LZ^b !4GӢ7dyX&yͧFSOHtqlU@'`6ќRЄţ@)X̡% <Ø˝OʝoQo1Gk&|Z5]jq$:jbCeWrŚq 1yYXzm말9cuRYhe?PZ%|bB 3mZ(n,'}]P{dsc{QSJs1bj7.c2=F$ޜAdPތ*A" &x0P|Qf$U-:l :aN2\r wp'Ӂ.ޘō1sETΫaOƈ"0@tMi=v¬s͔Սv8\ezSipM Xl(nAJBqPzM}Nq3mР>&̬5+{#j=Ib 7mHtn"d,_F>;1_e1)6v]qœC/@ls n~;FS(\HO2JiSɶ\:mGa4IkVrf@tZse Lkwm([t"P.Ez]#,*œK\uLW`\2"–]>{ L;Xjd]QMSV5ޛ?o׏%FO}tptx|Ï`O*=U+B&I=Y[C€{Ûw$[tWuSJ}ݖjܤ uEk}S̺++| {W7 R!O<m:"1< h vM&b{AAȳo^nc=kOg90=w|rѰbo#7'Pm !+7_ \.E TiN";bmޕ 9ǍuLݜv{>IϘ.9Ї]04$bշڲT62wH23*kd#y( 09-Ң>4Ș\:9M<&X8\\Pi!??$%9m N̰dCj-`kNVdysv҉#Ч!ө"u~/$呔AN@4{W(kJO|5@I༑}ݎȶ  @;S\M @13liVq/]-OL-=ԫciH6tLT4{e*!ylq-tP,H0-)Om=5,sLj*o$hJO(53A =<ʒ`1#+wHY){ Po;Gfs}6V' n~ꅤ0 GCau$DЭS(w.HD\!/c+do8q' KU=:XLʓ7ߚ9:( e閻o=sHoqUtr N|I`96K8y*un26~ QB^}vJT09 %"c/G#]4]H<QS_Cn#-*H['H/dٟ/~I/qD6EZR^s≕@TdyoQR5`-(ݮ-ډ1?u2QeuNq֣w5+I9mקҺ'0uӡ cA(Mu4o Aǫ1j9B1 ܹM0ӑ;4LZ%Ҏ̮G)Phӡ\(i.lQ &LLܿ\PV(&]sj1D`٩岕K Jd]JYiEJ=saCAZlT'\AXR~ @\?fzpb3}j<,}?Wsa4)3N8ݾ5˖n% jnEv(qBXHH0մcrTf'ە0d&>Îld}1&YդZU\jL*-_}J6>\'=ԩH?gO ˘n-n7N*55)͉Qk(4t_*ز8YL[WU(T]ɔghN Ԣ}(H8ZAqy1PyʈёدVmM2x "k;d90')@cpt&u^ AwJV155F I,'DF~9'gN#8_PN5  Ҝ&fZ8]PF߄AqpQ+Dʺn8bH8#  b$}M.RI\-—维 A[|/HX;Yc(#Žf|t(PV?fwVNE4ęg~=dm$ oWUIeZ!KCCA#Bjz3 |tg԰$`{qihXE!0=>{ v}69& \ "TÏ\Gr4$\x( }$>s'7h/hn);(i1KZ28tW㻃X=rÆs`ݲ`J`eGHV ,PL٭3Bj\yx%qf5X cl0~Ѽ"YPiS-Z;(!B Oz`Ƽ] I ]Ү(2&_[ׂh H6w%J`iZj^ph-7 i o1XksFT kH9hf 2E#aX#wU!fNhxe9CrxxEǁ3& RiZd:қe<0-NDd0'H/1B+͓pO k`' {Ra'm±Ŗ:nYi\/|Xp+'0H[ ,JScI 2[} <^ >pVK4F޶·*͖ݸSiP"'|@g$Em$+E-!g tN(].L=[gx0rIЊ+̊{BK'oW.Ge M56ߐ[䍤}*#$V<%6,d?QnJ}"@:3mO+VQP: @.r#1W'zhۤқC\ܰp%Bz 6LղӾpIc ѳ ]~wY~a`QaPٝˆ _l#&S(*^& r5Y5Gw'74tǦD/2`eskCo<HT(7\ m7爻+4k4/StEd5"pnu g:W|^j4?Ѝx 6䪃5kH.Ln~o]*|8_:dѓ;4b׆ @iE3BZ` A!}Όzɮ3^v@~YF$O{<ChI~~Bi?0}ZzCD.?'lC ll }ĕdf~U\RYUGABW_1*2_I/gЙ?Ki59n=jyj$f+D (d ao3;ECp>"TEܞ0h!-?3Wt RSQ%PEw9|7Z@:|EfW^7}{ʀN|L)#ۻb&ԙs#9α]ɾ~0|Fv_` au7u.ιC&*|+Tp KQt(aB;hLwb;bhdtP7F`”t}"Cdl]Cp>bC.ZF,$pQ_!UP\e`0 OlϏg$f^ə >P19#|2%].[{jD@P_"C)4=i([)J!H$dI3>d_DOU fwr&j! i17zbl2)\WWmb=#1J߲Qe ?B$·V 6&`%K ;_4PH Hta*r4 Ϋ$ 82tPXۮ!̳ܲm^EwX?\| (}. 'zd]x, -"m;*p[!+PE~HLlh#q>;XpSeLlz{^BH5(y`ekRa,coisT~N^xFRߗBB0<>ug#IDSEZYam.w竵К #%ʏhy6:ЂC IqѶO!28Dg#D&2'=ym V )AkXגYhc7 }_h_(;FY"8 NlMy35^kթdŖZyZm]H5i06O)W+O|q{d t3.>[Pe|G}p-J\rB[#u wG4˂#3?pU5!BV=t ,id 'h ~(jח#Hs{u4& ~}=ﺚ}!`rYlေ SB|V"S| ٸy^|o1׮dtLNݐ JPW M*E@)6BPR葴iH3`BT'r*F(;C8ăMZ#"t|E5.O_0ڲ=<۶vƎOm5? w($JFRE}H@MmqL{ 9>ösxL;L3g-r󡭻4v[JtϽ65X6Uȶ'7CX 1B>[@ʴ ZL&ùIC #&ֿN3Ab bZcv OԎGকee+6і躃IvO\G}Aб 5烪6E8Fo.(`20 #L+_Ԫ(RyHX!.q9 vة$iw|U{7K2Ue`*gIoh8u~dz+vާQc$=/h$hJevHW4̤ /C<H}9)Ke+>K}[^ 'ã y0~{&*xGX@4H I_~Btk7tz2)1ʏNˁYba;w4k3@"RW_Y#!D,1">dB jdVi>R=uDv';FY{68sO{ M !7}B1͋F9ùpוԘDlןrUt≵XNb/e1B˲%`w;΁]` dsj Ť眉Bl [CDA6j80ό?01\8ml([ɍ2˻HpwvMER+<6˾#WZX PMUesyjF#9ܷM2Ƈ we0OC,^#z,+1г">z ]2-{DQ 註L;"Db&ÃNʗxS=yo]"s8) _(B 2bbq&Uޚ-lBkY\Lŗjo S#]&͟sH2)e)XzEQ*u’Y-z- 6Wŵ>}zf\<#@Jwx[lsĦtj+Ҝ. / K~>2(W}La[6:Wj{*4zFR՟FuebȎWڬcf[@jD7VC/5TnZ^(`m%4|sF5&ޟxrj== D %73c`%MB&K1- f#a>Z qA~yJ)Ce]x"ѻu i0uY1('0n* "@1%z%\|K4 .@ׄȓiYAN|`Ե0%b=8D  7\aCgQod)QǁNƩCF&yǐ^F2?V|%[Ɨ~"H녾R$2Hqsz^a__&yE2=ɥ b&}H 9n9 .aA:Ct#\K?yٻl!(GtV:)7? H⛲j.!4qOm}[x8z|GsW"ɪ6e}`Y >K#>Yq-B_MG2+@a݂gd~i]frk/#m fp/W9W5 <:;+Npjғ@PVUGB7 3^#h*||Zz5Al꟢!Übw_?t.g4u5Z-?|k=γ_+YU'/##&sf Zf$]q=5V:hw = IKn pM/%J@ըp|0ٜbӽ-qfE;pwb0D;/#IΗsKӇ{ZR`g})^plgFL#roPA%1 aI$#wiҤ٬LQ+TJN V3+pE罃+C B4bG&9n6uH-B;s5ox W=0%!Ö9d%KU[eܘL_hDǠGÏ;c Ox(@ lxHie'7q>ݲ-hJEY"\@^O@U^%7_f_v@HX/s]tڼRVꝫK{z;oX5a/s9)[nI!??uwj.{'Yrk*Nǀ`)F́IntE c{*Jȟ(dXjw)$ 3mME*!)R{*+WvC3flF՜ićuHqա g8uG*o۱װ.=^ER%%-?z͠<4{9~-*Lzz\ ;vDJA&Z}(1 ~r<| R[TfaCmŭ'i򷙽,vD۶`ifקę~^ӱ$OLc22.rcju{8.XE3Ƿern&GY6 u/gӚy_> NqƮ{w1kM@I1QS>Oul#wwoli 4[C|/02)D< Hprz"?=ݕH>Q2QsSjd3Q"8c`\j[sYWl@Us eL1o9}BrXKSs)uVC&1FvN_Óe?Ods8UPC^ڗ(c^huS~EʕQIO̡RVWZX7;: ~46Ԯc&ao(~jhQٸ*Mo}!4ƛ_ՁEk>hQJ~9{hIj\JRG-=8m8&z|:nu뚲މq[Yp35GVf;P?ϣiG@m_OTfVoDLؙUѩ1`Em _/4" yIiw3gTxscU!o F+3 *"6aG2?ⶐkk,N[r7 R/8wCR%n3w~u:1 l-V!Ռ9ReՏ!dl\<-Qq3c Q^<0y;$HNW1I%hJ_p f ˙:1h-FwgdDAPEj%\Xq_@%A %*7|1P"nSՏՖg3lYO =٥vϹa#~#EYoH\Dea j3Ek'auvL]-جjr933(XC_s$G;T 'la`ބ2c|.v 83R"jcn^H ě'GbK'&fMY&;#Ϭhbz75-jU(Шe` mm "N#T۵d=(u_#y6$БV|29 L $4pp]M2̉(QP_$ymΑA)"Ƞù,8#vHDTcSNô/1~PAI0*5 p1;BX{a*m[fgiŅ %z$ {X$e %JސB!vC պfYu,n9Z{(q7'Nժ[DVBLLtF7!1.CzСPUp:TǷQ˩؜eгڵ>d9VKk+zWg?̅6>hJ?7}w!:~鄺?k/xL 65W ٟP2Ã&N߲6J/HgJyBQCb (wd|LW@+(} ${d>+E '*<rv!=6DK=˹3nOW-'9x+ &jY5z>Q7-+"w~br' z4rrzVq7=z=4 BT j)JucpǙ&8Fvz'{͕$N* k@uVwGqYҒ˅%AI|gu~ (>#i/,p@KAg P2ZӛdaLH-'XKNeu0%Ѷ|D jRI"* 6J)A6ef"VXxmpԉ亃>,ĿY>/@ֳ!x2&kJSYׯiAa9&ZJN?rig@3[1mˏxХ)2mÙ 1[pi )pS/M:.yf[ᆴ tZ:EF5ƕ1Q 6֔աygk3CXh_zWȨF/ެ!ھ\W_^̃Aږ3PjJ wT{,2.2hJek/c!P^hӐ.Nr̰aN`03P |u/'~LuT p)^pRe[k}bNH0qd$ kHLρeAL ޒIPiY* \; G v8~2SM Zm`3u$og=2L{ⴺ^hl(d N}4T TTjE}1XjukVkzh_X*CF\e6}'=C"݀.M#ժ̩@4JR*SJL$72N8-@ZҶ w(wUTpv79/q(ϪQ:çbf !5!h{&@**l{$f:Ft{\rB"mr8Iz2ӕ1)J$<9 7Nsi ]jve:9Bd;ހ DK~ ^W@k94/wƛ/+G5T )ؖCn$Օ\dp⫥7A dy)4:MNBA@  ;=D5\mLڗBVAL'.^I*)5Y k@4ݯ24e1\$y ^F-}g.:&* HD;Pd.Ύqɞ.㡣e5ӆ&4N(,` lL y^G 1e~D~_ kM$B |\)pv9-]^K<*$l{Gl81bZM͊w^!vqnn S5~xڿH?}o~ m钁ћLx-` lt261܋AF$Ǟ,2;q}6z]Svvsp˧%$GhmeLv!`u> E\TbT>So +t0MSY.<=ږ]j gIӬ!7J֞3v|0=C .y9xQ_ө5qo)1kLPI\Fä{N̕tџ0msY#= {)Uyٻ}ٛTVhg\!c[AEbrwo_ol76Ն"P8@5tm87vj&\λL䎦< NUtfU@2ik؏ <˶i &CC~>_If_@:*V D(Vs 8o6L2ʩꙃګDΗtS׸۷c'P9lrGNXI[ctɻ :oG6B [髿 Q4=}Yx HXq䒩F_@ vnrnN753fS烆zG]X/:?nJp#%r%ދ.4+'ཡpJf-R?Eܦ5–כݨ&Jy=x?חP~CXrߘ'>P5p!mX#1,zCjË|pҸܤ?l<0<vdMG9m^qS/u:ۍJ^)o?0Ӣ8}Q>xo`lf!h0~CÅ#A$1hP>'ՒXE.n/^bIAX`_dSSw"v,Yf0T0`b9. EXUPOݬ~=*mJĆO"Ȋx 2hzӟ4qk\DdNZG|%UVY4ŭo9>PŴJ3MJ;_àv!HpIQK R8ApްS2 p2jOvIG%aYa*yEzLͤ۳_wY0%97 5dqۻСS/yד"㶱W :g4cB}ZRw+]n_ś)`-v/Ez#6~r2ԥg&*j҂LF`@9;}ry%׾I#Gᇺ4Tyr!N LJUxG|[:61C@KI Dܭ/dp"%S' VNKJF* *Иh\ރZ,ͨF3cĺ^ThV?1f W5?3^hGtW VBD,,e)éoWJb OHЊ֝PD<޶X]vJT|8,<+Q ХC,'~J\h9x͐Gɽ^cyLrKg{5ځWHW2'epr7SQX1@O+}ȹ>>!<SuɍM J[d2ᛨ)|(|,+3 ЉjzYDeqM.%-/V=-ԃw6B_S^b"I0"[!o>s~Gb`dc'MJ-~.z H 9^E;&#z_&/gh3moxQq ^wd.M\,i԰%[DZy|jy: 5KӸ 9>5!8O‡|%8\&hPQW:Pfg" )>`Xp1[Qm![q% *'Gt$;YҒHDUWI8 ta٩2m>x/![MEI(e CNo[lvTUgӐߕBh UCCRQ^Yl."%NnTsc疃q*Ey1Ke!ޔZ}QѨ Zeun'2;k&9ʄk)QQ5MS'Bjeg#_ gK&fㅥn4 յ9*C|ZI!i6HݛYvz^0 ]N=nB>,35og?.3[ o|\%j@/ ȊDE"} XG,[V}D@Q,d&Tq ۧL%(K qeFc2ѦSpۡ`p!m_R~??T*pRǖ2~*nBÐO1pbNLt|2?q\"|3`wBf1:ʭ21-3NHJbd*9pU$2yZg֍\IKI׋"`3chO)|\ue|yߍ!ٔTe}KR鵬x2}nJzEΒ5ib&TSK@]ܿ$T1/"ԀK#1Ep4z`@Ƒl= -|'Udvi./gt?҈Zo{紨Z@;oE#A6Bۖ0jo Mk,ܝa 3h=N*Q/l_Y0%BA3A#sİ؟CKSq Vb2'cdZI$\QJa^{ _ڣn&g(T8QWK?v9bu\F]w7c4Q/{mĢ?I48HC#GbvO(`#u #}q-+_Nvm&|(ՙeb: ccat* Vy0< o)6ืa3UxWFopK gyUiO67Sʃ:j)*oXmu7JMɬXf'j7BbZ4yPĴ%Gb,B( ƣJK `+{MR `MmT59TĽ$Y(*=X $~217}_>88,p$2$p/ oLCp_ݧ$< v)RQix4ukV |.VnؕG.T'!&Ssgh025Z`_mEcB JLC,8ygv~\3m:Jnq|TWvl7e1;Ӳuoo:[ѷE "Ž#]#XU|$k㿉Krp'{7c%u^m*_.,6h+;7j̬E-ۤz}ՐmeWUlDZ<̗V.~t~x8V<{ShҞU5i3-4[Hnڸ8P~5|7*<1Vl{#>^_{7$72_qq^weo$ \ԧ(!GG ',a(nwiww,a"p)H:/[㷿UIs[UBϚgFA[qbcR-:.AdцjR&}[_7Ⱦeqm_+hihY#&b=$Kv szdnU5j$0e0[eRO6JwdZ0:0ɻQȍq67n]0%cZcpҩn1e1}(K=C}4y m$ Wjמ-M0ې"Uu;՞нϪ]_U60Ǻ{ufLJQ5ʋ}=F~2J1ؿBsBX wwD@o3l| <<@_]kS'|eÝC+w2 }&~6E][H[;L|ϗ f_aq&eB6TuwVyA -#Vn$,֟Y):.,!?f'È_w)j6>Ix"qHV0Lo?ZZ=Yڹ(~ш a;2,/]u' k_"EQΖhv*$KoΗx!lI"hy 9rp@&N>>,p:CY >%Q#RKYb^ 8:P0X̌B ԏ:7CrQOPC&*߉XNvг}=3*slInLޯcprأ-ڧe:jy{7t} Բ̞ n ,n >S,{qrpdX(悊tRpAU*+b76;U1'D 6ɣpr / 8l}gl#Db=1saaN+qܳuñtZkR-TkUG_0xSJT s򵅲X?^zHًmar$ G47bb=]l=>{^{]uc&SniBv, _ QI]IPqke8`Kde?+g{iYA%9pIA!uYPeFv-]Vz`z6Hka*| <4Y!z)3::. kJ7Y퀺+R_s&t8F_16/J8ZTyB۫ 'h VY@CƷj:UR9TbH*ƒG2Po^mQ'dVB ΄كcr(r6RBC"eA5 ^1(8qO%NK`dv{5_(!- %-xk4[d6:o.SL|4zsހP> Kw ^B 7EE9;#M,ZtV'4g]J, ]1:I9k[!=-u$v`P,yr`53)Ҧ``m_7deOY"Li>gdheB')4EsMu#i٨-`}bT `LI?48qhQR?~܅ Cs=D|#M.H/ɘ ɯ!o{F^V o (!7E%bؙ/+Tz[TbZ1oɍ"f~`3;X կ&IuW p~Bx:Na>eK(:x5[b wiPTªvLTw'^@b)t}35]`+Кwܭ~maYzw1 vM.0L`$r1]H C(HS=J/Myi;}ep# 7$X?}h.䞄Fȳm+PA0.>X Mx$@yf"խFN0p8D7o.N/!"2KOղu +a5v TXR%.Uw5K;(֖eGuF@/M j_*ʹ*O΄4HV |y7rW__9aRC0!g١Ql}WЈ32xT0y }T<)G|Mjϫ9g[|#;Aܕ:pi 7:uR{SwІF9f-wslΠCH蛁_W.(RF>( yL*,C;YYdܐ¦??Yu; g̜n:'I-_ %7to;/%e(feK-nP"voY]kH>`*_]aQARwX9RIJ4lI[ 1MQ ] ѻ:+DV=C =spo'@}<^n@~_Y OCPy8C/ߤ 뎊gnmo;djf?ed:B^xnm!L"HGv@CF[.} )8 4`?¿'f95 47e=ӫɫmeࠍvNH"-j4C 6f[$mR'tTgoѓ~ukUoZ6 \"eQ/:oXZqGx6Jz9!fO,LT9v{^ 3>>>ɘtFu!GXF~A /$Ksr7tFdSqbgz>>IO [*m(gdGo 68 H&c~.BLE~xԙ[|RXAq_J ͧf*aUҬf?Њ;w}hGvī~wKřEclp܂9#)0y?>Z|G"(h8ᣖbđ3@H(,- TsKU=HpωޒZHe .g*˗*|X(Y$ipϓO=iv,Qv-7!oYyOOWM{f]Mbܠb,EF.bri s;^1 7v~NN H#jё2 iqBw@%PrD>u6L193Se^ǧK[s)i]#WEL/6HpS!|;{00vfڀJ7r;PC qd6bUl3`ҳab䘘""j@&. o\{Ѐ,8`lC(9\ò3n#$D<3d<,WC!$YYzj6?U#V&!`Y1҇` m )̌AT-kS-݌ <}OeawH {I{pǐ=AC3cC<\ɖ+Jy>Tgף:Ʊ^")F1UM٬Yz"})úh$ˎ`/7'QV~Ўn[Wa?w]vśGk`A(n@Ia@U,$I ]yNI#U "ɰVdp#?^خ{[٬W ^JDt4/LM5w#u+iy$0,))Q/:B,]ٓCZP}'#l:J2_~ɸ'9Jz7Os+ByAyI,dȚPt"pDՇE44b"58=H鶤Up!'PRDB-j;0ޒJO@?q ۅ1%0}oP mu"-w4i G 'ŹE+n!,z{"Į&!42=P5A*40#kZnuc=> O\8NRx Ho#UX}XJdRR8< wSWmX.o&^* D}pJe,?Z\Zs3%` M,^w@7[fZtd{%.R#)dX6:#qT_aUv5U]+EڐGYTWG4ȟ_I,4I›]G(-uWXLH.6^,lJxiG{œwtPxaUfeyy2 ?1>oV-+ޮ. *hp{ 헚Nk dL, [v60O}֖F  ae盎ɺYwם/lʐJ2q[c1o!;fϽh$!?]6?g،:J 㻞?%) 0&`N[C09|MpXNx-̹=c{:g;9L\&?YCXɦ -\:d?Lua%K`"{vSVEzi#$XI[Dș:ۓ][[O:?@>&䋙>IC'pk! BW>$h %T_ԭ',U^g7/ c#‹ {A8,d%̞:=eX6dKbQb.UF+'[M2(6{ +5sXBrp "ɓ5拋_Xd*97coGKZAH-swZ R.5*:񪶯fYe,Vr27&TrtJq'l+J%4(.K|RG0G뢓vy8)+ P m95p B)v♦+uUudߴCT*-c3$6!u^R>,w]/\xDqy4iyLC7]5jޣS+ 2J*+J,rfY|=c#<."̉\ u^W{9ug%Z2+ş~ڣ& /"dѴm!ffxDQzSL&2i z$Na||Z\"[Zp/rNLJkL7JpAs=ֆ84JH^U4ܞ#AszVQDS*&K^t0~5~^dŠ( "4՗ף@ 7P1_AC" oTߜ*/4hGvf*Lw1Ch0zh0Bމۯ #VIj gQ~vE5sE4ً{I(i9"* )菂 NY:JAkUvBHb]Ä*zF|t\FbOB~$O.o+"Z nFUj7^t2*NE$(B&.x~!3`D63[Mh<紪E%q{7 EЃjt IKn_UM^s{h,*L(BX-Ľ 5&,z :93)ݩ|E[ L>F_o)=m-6#f^I+aU#,{)Xz'r~Os2YjOjuZKV%UЊ>[j־eqDhnRbΞi3G<2EI- gq-͜18^c+sLap)$XO]NK$*s5l-^03Xh$NbTBb'qթqN֊OuU (L ۀp 饁L$ʹ3C] fl;X36`K5 !.9 TLj6x,ñ$@4EfR~{x(JՔii[4r>O3,O)% 5S3\6~Uw0Pg"(_'#ukQji{PW“Nsˠm E:ֈuL&fLc^1}4f-HùuM?bYR^2EAϣm:%+VqجF%B\n8=ȉx.hۜkV+9/"ʑ4P"`0 T3a()s`9S̆Y)x^!¾IOcGhUgs5oۿCL9z#>Ux+K@"n/gtB#%L\PTġ^غz](d;Wip-TWe_vLNܰ rG(VH`>gE`\PA+7p%&w$\*xcYt#7mEiJ#G"@=# ͂tvYZJ"y,62 D)kp 4)q!Z]T. ?rL_kWH ("u7Pz ,Ϥ ʉR8^*d|j}^:Z/qUG4@jF%;f-^Ђ~zr  ;$dIQ=Ӫ/غ4NSnAE[ *OlI0=@SgD^IKY(Uz};?Э%,Z:LHqLfz`A o`8N.33*iH,ItU4gr@YQ)6uۉo.oxk.fa ~`\ٿEbǶ`H+EvzXA4iKδb3383ֺNۆ}1R#@0-v]T!HaL+X@s[Oe٣~"~&됟(1#HoŶsj k ݌^qTi'!7 @ZqEk{H EW<>iO1FtuRsi/ FIB {{yq) D> 5Nn6EAzաOy$< l9䡋7iJbI̖:lݶޞQZH:#RL+-vYs wW\^Ti-օs/_8Ⱦ*R˟GiNfKi\`k`N 1JA o Hڳgz8@.PĘ\\-E뽏o޵86IEr:kFOKPJ:-hƎZO:f /cK}0`U}kU\|c^ 6mp'x̝1+rxIgdR#ձnf*Eh!'}P '9`,Asy|ଜ|$e6`@o03cu>e7@W.b, jQ f10R@t4ziW$q~M,"9mȝt6JktPcʐ /Hv*>X%ŝ GL`tϪ;J 0L* -X6s) 8D$͎r&ec/F%joU=4affj)Ô~DV9ٚ,џ\"]eko u3D(|:Kq-Dm75QbBr:ml@Mṯp)xg{ƺ7 4 ;^:m`Rc{Vo\oLY*=|!V1B&[$ҝuuZ؄jolaN6CbWr!{{uа+յ^Ù(5ƥyz썄8D)5_ dTm[N%zVï<}[iն q_“P] ;P|+V\:`FGJS(aEt"(|5w'J]26Tq-Xp) x ~bG hF$?.ʘP 6VLLRU"~+V0핗]Qv~ZI&yW=Te+B$ W(@'>SuF ',‚\Y@pW9r?r__:.d1o\Vw;H<=9kuh: g3]R!i8LzCƝ>5-"k *5eL A픉eHhh0 :̛Pi`Ib49)G7R> @q ;n>1U2Q`~wǪƁFaǣT(sTwɗ+T@8D .߈SSۺaͫVmmwhʮBCSfi L&*ܩ%W +l8}gîZD ^ڀI٫ҺP a^w4锣w2932qx+NLbXaE!.I5K~g%ķb=r4VrhG#EfDuV!ް`xQNi1= l#h`h!t/ܗ|l˵bYjy+0 N+6Li갧5drRbxR&ۡ -׈=Tqly[XCumۍ! ɽ*K-!5< eCK*8/ z|P"Ve'.T{rNTn_7ݟ\5 É:,~XֲE /B t>.m5%IfKl7lqsoR~ЊL >jѝ=}:mA YT %9&>99}c284t{쮖b4@RG&6E^&0$&7T7[ RrS.r䤰k2!_@ܫ2I$] 勠)h@UքCpQk@OhE&ۺN4B`60~&AHOhS 3"AFJ`p_$ 3]OO a~wnnؤRUIGi.gvٟD*7O̠vxӵ‘2>K;pQ% ͻqڒV+d&E>`UxI駻,qvi{ӎ *L&I, r+qH*@,a Abd`}ҙ̍hgUuhFBD|~)Bt[ၼ^>< be諶 n~1]dxHMuB0Oy'Ѝ Oӫ" IJ-=r|#F h]MOψ%uDEk#il7Un!HEA0=ɑȪ~m Kkaw2 q$uPEV`)}Pm(}&Ah%sA 0=cV+:XذRJ̔!w2HmȀd2 BU%' ?,~nP3;RdI]RY.fC~~& K}}͘X|kTar(!-d3u;X>F9 .59Lu`-Imz[CsL9Y!Ja*h\Ik*9:VQv 0 qdhxP)VrD/Aa`FݕVL(={PSzjNSazf(ro >qsXRBPP݌f3gU ?tȜlKr,r޻/> C<4o6zN⓪OO NR>|t_GŅ9m9Aۣ>aej>|ʸgF=ۋM>[k- TILc7Kڸw+6 ,w -^hI+ 58$7e08Ӵm7-8ohJBt?& 5(;uSY`Wݜ::Dhc@6RHo׌0DŮOEcɸ<ލVVob hp.Zq;΋^.^alu[̹?rV-N !ɆD6[뼬Q!l7&. TIz'A,sk):韛 .FT55.h`i+0A2Z[P24/@(ѤSMnifޒ .nGuϺ˭;Pƈns+EyoloVZ3*{g V<0ɽd7+?מiUXyȠYR0o Dֻk󄄯e|2(T,C7J܍@mV rd*՜6َHuqkja/T` t=]aX0AG:rn851Olv 3D;toU[/iNiIKс$ޜi[}L[-وn( oC[_kx`v9Ϲϭ|<0zqEOޖF}0-aFN *oƍ'sPk[)o>U% QNҟ*HRv:wj#£QKuFqCCƹiAǗ'M`j)1fmb#`;8VGj¿E8v` `䃐@=IDo'Ȼ}3"Ot@G:S—B6h^&e ^\D+dVP7G$vҀ57(c az`NjHmjvbmJy~agj ^Z8  5~ J؂zߥI5~WP5zm5|=r֥:+p}_$J.Q7 7! 3-@}iD$aP`nll4gK4)_'d6`@K)y-QUq@Iÿ<ȅZY fе 'n4LJDD%X %U :'2҄ hsKB1A&No"=ߚcE*f'`vũ>t_ierEI+-^ 99ϴd\]4_sFlCQ:R* un4@QRY^*d~Ngw2mqN2\łjg*gbOY-KGdЧ*=l|Wn*Pl, +to6@EMcӵ/G:*f>t=OeX+P -ljm{ oZ<cߧmaϫ;'NJ‘s 33֧:#dAIzl-kpp?b#`/.pSҷ"n_?sj% B!.=R"NzLx{0OiyZԔ;>Am|&+ЩG Os-ߞ^_т 6N0eFϠY<r ou t ٹ*\J0,"b8J0LERW*{h^q{NԕhvJd  _?o ;j(hï-RAX&(Q8Lj2U^lJ nA{ILGڃ"vԘSQX}41[͇HzS=-AMW$K{'s^WHb4r4ZLt,QD0omwÄ wtMLdbxhҀ[3IfSQGڨsTVS>&]v&8 vad|.b+K< 3OPxo 8kC-BHd.sdaW\Dm=6#Jm4]]YeaCCBm Jnf&l0l/:pB؉ge] )p@YwpJܗ}J=݇wwIz4^P D'bX۟\YV雪5;,(_k ے 9aEGE:v; ݔ@m/FCI$_d͐Q؂כPPmH.*/)^X/3W)[UOFϲOhu6*%)d+3 W~ɚFA_{k"~]oM*zͳB̊08fFgSi.-`s^}U$oUe1RO㪷VZB.m⹗΀>$x1N>09v?t!xs|U^b_{i9O&|+(m~뼆7DXyNZ1 + S6ȌBLC0Ȳ0#ryY((yO?@Ƥz{WhҽozeV7 A໵-qyW&RA,utrhQI_;|7L2t~9-B𼪍_Dg4~5M.k6+ @ F wVd)Gc ϑ(b_zUH`Y9)<_a_Q3ZKl%^k8JDE ɐӓPFkp] PQ"kVfPocu{(ce1&CZ!EaǷVӯFJY=(G}|+D8 qH8UT8O1MXcn%)S&u Q6Y2G0+NUZgsT7]q֍^ Ag E x".u 6_qi }of9lz06$n_!H>2AZ+=Cˡ;R7BB Q4hSI{3$?ԐlގyQA|0RisQǗ/yU>,|{Txܠ/&ܓh8DKBTRLߟYlMiTr3JbMպngS0}̖}3wy(@r%IKnS}CB/NO‚uj,lXkeY;Yw\PObo-b'z7֣|xw=󮇎"δ„z$ƅDӰz#PⲠ Fn n,^x*m$#ieѸH0Zf-tqBvg#Zlߎ8FK>*V@k#7fIhW=Nb45{2I<И902M|ȽrXUFOž£l ,|iNf3 k6  a(9 IBk5TXxvwۂ.:ZovoNx.mħ9hKÄ+ arf~qFd9MWqnQk:Cy6lYCMdk#ibB6,ᮂFQٵI#PT8.5{5&ӅPDkPgc%x?-wMm<*'O'a4\{0I&xvWGr3N;SO2E3R  Sp)SA<~ P~Q1/{a Rˌ(p=b/L4]cp|mcqEco.d4~|oeD_lI2sYWH,mYƆq{sJ5:NLm{Xxd{?H2}F/y8Z{"/ 4o Dj}V;2ݼ;xbJNG,o )}U/ tɰMZe+ݷA_!JA<>k\~(&g=AUm7DQZve?eXiY+4n(=_y[zX3HdzϜi!wT5pۢ^VGksmkG#[_tٕp*w7; (MvU*yAg}RwR^I%G.fsO;F_B_ `',#DP\Qͻuyn֬PyieiJI"AN/+8V;%˨HFMp}iᚽ:1du׭ßvk8 0n*:_]Zִ_=BUzcpv_,CW .i\gc/=6͟-8ˁej *qgoc؛sij󰕎9d}!mzcx%PUdJ}ۂs' =pS15=9 h۱ofK0yI~`w8mRxi U|\OoXdbxsLjX}.m@kl4&8*s<شuyM&I`-A>ї\yNÝąGxQ5p+wz0+=IX9XO食55~g Yz{A$F FE r>N$+2) pzmI+}@IeQ=<43./J[.O',WVIXrO' YҦNu^Utj0g*9VWQj17ƍmu5kXE]AV<.kk1"[Cftl6TOՎ6@sZ@fV<_,"m 7۳:oYF,YyGӛU1T(yPu?TQr5&֞J& E6cST(Q d?L(dƫv c˟bIp8KI^D^C(M:g=d،_d<{~T(zҬy;B( TX$,)q3\6 +Q0}CyAb Rs6C̓6#jy!98ηf+t׬, 7Νl.[m U Y5[8A]ۜx@\A2'҅G˂'l"5,##u:Ac2|(CD=0ZVRd`6fHH%r/DYYI2Φ.T җOմ*Q5ǤǼ;ɾg>K遁뷠M9dҁV\绹>uW&GhNLx7uw ^D%Wٜ~rVp,*V"q+Q^0+^*nz&Yߪp>b!eW]$W㻦פjԫV^މ 4Ama7:@Bb 9Y˴-xh.y=~[/N%k% ޶ەq  eWN!I%6{=+xPllG,=}D1( @S.(@vXUG.ntS8hxȯuE& 6F P1XCX٧[R ]ysop⣚#SW _-l.j=`^W6$"5wŜ,^ p?9"H{٥ltxry6"gdЦ5NahjeZL@ LJެ_SV¿5lky#M/#֍ze]2C+i˅7`T+ɡ9@` 9FTJSbV7Pvx| p`Y3Yy:A5xc{ nNdEB22WaMwUF/ɚ6X71/!c Y;3ve$//|s '[Ø:b$ⶇMW 7EcIQ)}!g!^嫛RFi%;2a2lچ3hT%y}͛d']?Z)B [BବBLίa/K^r b/q(mP:T.VAD@ӓ_=GcMԷ}E͢e *J"`3q ${}L M"EҨq xA+DPinƑ #ߺ{l&"Ʃ&Oqj0["g)_P:Ɠ; 6tIT鴌1zlLrŒVO٩"BA,ggk>gؠ:͢'f鱲Vl]g2rϛCDmwBn3d"+okUͫ9 asǯ|<њ*-f+12Լ|:5P1Z8z+x [,6ur.?H(F\ܨGHAo/}Pr-4(#^}o[㫟R!fqE+jGIUW4E=(xE3Β!]Ʒ4k2Zk$WOj|Lc=TU@eMUхT5U"a.zF+|ss+yaھg^ 04۲!"ʴ ^n%:XYQ6c(^^R9{_Fzu Eݗ Dm!n &|:J`ᅍ];MĞ-XC:'7H#9 i" cCE`5^wD4t&)H ӨG|A~[iԶ.*s-q,BpKr"X Dϐ8Xϭ3wbaT(a*a(aބH*wDM v-Yր]eepJpPꇶ~/j}ܑK7&9qCd'HT|Qނ+XA~񰣍 E,]Aڗ*R޻m3z a݊jYjfj,~hH_*qʼn]{"k·zA+&ҲUD8C),U+y*+$};n) '2rU1jڲxS2hD."20;,Bn(s@{T-@U -}ݫN %;8#1Oo&v֔&_o\b_?JP0ץ"4;wxivIcMj8@o ԓi3LJDW,K$Bq}DwfZ,ۨf5.̂M5jȟ5K' ̳FP}[]4QJߍp/ M,1Cb-chWM:֡mRzU'59}&`ƂAZܗ:(O#''!:*L D!6Ӕ6m_yVܝ}7D)RJ$,Ukym Y<z(+|PQe:0(ޒ.xLn~,kq?Bne ˸q8`/0ZjZ׽}hM1 y'zcRT7_M8Q$ 4:_o_%}vܫQL7FW6ܘmoqpHZumj!O]dW7nca0ᵳ:lW*,W闑ޏ>/VfQJ.w NC%J >; hj٤AgJҴE {/V2VoRc& f3kW:$yz;^az:RdrpIvǐ7YB>طCSw[ԩì<5A$g\m5 eKQGJ7WiJs3 dozQ k A`cHQSF@qNHe^m8GCuZ$FGj2|k2!p:Pe#5"DL&yjyE@3C=r )=_5:r u|8^x)q՝Xb=pzZ?,}^xqFcYԘ ƇΘ/2 .ss$٨PKT6sVyhKBiyΛhNyhCG%ty7C=]U=ep@!dKT2™m>;+ckֲ <jy7̷_`&o Yul.rT^a-no <N1e[7EsNv)G"A5fpZ=kgjv:祇 G}S<* jkۏo;`u3do?NvR-c8ONHDHP:8f!흆Ge&Xc֨?iSӤۺenH*ك~?>_|d9@!25^wb|qS l, 6T>O&Lt'>%L1f!I;]p*NSiU*訞U}Kt '?g*5oσ#UY"ĝI7&= ⪥ mS',.b.'tsy!G$F+yAGLG`jjWh؛>x+q( bRy6tUi$߆xndd?ZG׋mNRs8OQ Ju$+NHDzD2u& pQ|N DgH=)%d#fu)!ºR؟wC3,oG&=@<ғC.`D|Q#e7AL[,V]e23r(nM!9Xo~Ďu]_ w S5\qbam> Z\crKdY zs q&ZI27:M$Qϯ+)x"Px0Lch\@By|mW#3ΓgDXO7`nރ.HG)އȺ$Fo؞- Va~Wt-IGbb$PD vO娆~9taaԌx`Ҩ d7.t X(]_+G(;+̞I@{d@ǪxÝqa96dG k埃/F/6e|%z*OUHBy(joV5n1'QBb,zK5Dv')(Ͳx!=pa`71?#M8D_o<+.=aA>8i6N[ӫ(v͑<}C'R;[+l3ḇ9Gx҄F?N’҈&THт,^g9]A{j;Qjyoظ{.$79ʪ)e&0^&G;3,"%1TTjێaiӔnK L4wDe0 x60mlUXXJz9fnTʈ 77.<" (Q<:|,$2:bvi/N [ŝׁzֺM-eF̯ nA:(DfMx-fOtKw2@7O>L| 8q QH4,~kVFCYJ"z8Bt9n6w!JۡpV6C.>^+ 7,[Y`rۭD5J îEgᒙ JK.?jvB[ڠвmt?%pK*:n&qGjGgtgwIGӤPNL&{Yy?"Ɔ(ǔCq8txp6') R RN6D4*e,xl#̹ZHA 4c2KYĄ)N4" \ Qz 6STb_Xi C0Pzm1&[+ƃ=- ,.e.ǕGZj$:n uv n?1ZoB>[p1{7@wpR3#<ԞLm` /^Œ=.njG5˛BM5aߠ<YR! |TLPRc>QF%eBI_EOۧ';2ktj6Oq_gx7;RHH)GIr\Csn$h ?_Zxjavj͵:'aFw EŠL++N:1# 4N&Ea%]=K΀g7-\l)"YZ@/τxOepc6}mos? QvL'Y3{r+&BүCŮ>CjķU?P<:&E}Ip`j0'9 jrybM斔gZb[=cc8HhP8zB3m +!$„p|'>p/~xEL\=;Ox4nHrJAjE;#9aBHG>Qa|>B~;3S[lrgVIQAw5xr9s.!@ ]}毊(8~O!^xOf8)R&F7~"忪ZD6c$W(U&> P%|SPŷ9ȉdLᆀp2~BejLX&X^i=S4f^ Z;jP~< Уq2dduf{SY8~& KS"ў8ӌ=ksʐ@fBgH vUBTxjmImb:$P(N$ziGc;^( L8!jn@ s;ҷ Uf5i PZ(U=Ҵ4-[Ĉ҄;LҌ8rưκQLJ5ZQAΫ˙Y%o+蜎2S 43j> ]D3'<_Fi yqb{sᾎ:1k ] gfD;F [:+#H FwYt #z0w5'ͦ6'a/TuEnC! -1 %XvQ撎šg{fsP h$k 䄳ZoY?*p`jYƇ{ 9k|nI?p=VaCMvYrz>m1V%TňTx3_RG(wcSBXsHV=} v75xƣiue2/}!;mEkjY)&I'D@Ζ)(2zK*™'v%Ir9p!eEL3X`ih GOA7 fK8K0On2؍ҭ᫇KX*N(W(E$b<(DmG[Wg(j9Q%I֒L#/o~nHgQ(Ofz3m=费eY)r 1egU$dp ueuiXjٶUO2?nNTqi:MUܔ|FA~ʾ:Ʒx2W)YoѷB*E3㺄3& BI7@=c4a@f?nԖI;~g=F5. lΑnyN'/;#S|I7XmHHOȻ29Wb ^YJ~ ]V@w)0H؄F0^dͧEelQ -MoV [[m']`2~>cCۤ(BeH1ljE+)3$mb$WNd aH@oA^oJUj0bt ]D¶hHΚ++GDeG7-θ@%~7`Udo7lg% ?3F'7Ȃf1jIyxݕQ? 'mOTҦ8O<yz PTCpx2 `#q |2u[r#r#jCeCրQ.lsO`)mHyYm!s! A<2{oOj"9,N2 Ӟ58T8b;\&@e 7N3mlT`kۦJԎ\^iGɭuq *kaP 4U_#i6,@#18:QP o\"r]l1 qW &B>G-.d+ 8׸6OA0ԾUԂӤ0垫?E4 -WTǂ_R/9JD>gm$"[>G[U-''S>o7RE& ~m/ f~P!ݱ5}!ηF\|$ ?RwkMP[MAɕ6~s5ӭkR&r/'h4eɷ_[m"4pn]!&WeChGĜ?Ы fWW Q-~ܱ&-p+ZVͦ @`"5{$ޕi Me|aF=~#~oӎؚQLL+Ii\L&S,> (1A/X8knEPhATr㠢m!`"QU/X5TM()BG@tsƘ: X2w"4,cyeibqLUK"c4w~#e%U?n#5x׾u!{K _{kqQhi;#j44qt)Y b*l#SZ%)15 =Oc\Պ௱:hz@yC MLv=acVB}/L-_G/(7`!ok,< Tc=x  ElF.n4:7RoI սvsZnZX|I4MMbNV ($ <4nӸ+Y t?^/"|QlKnLEqp7nzb>j<|%wC`>7X u'l؋FѠL.^O ?[*ވhKf # ! ɟv\ Di4\\57⠞o0>d8ȸx`h^4L/"%nl>8Mۓ>CV ߄ 7, 89$ڷEBTĵSc@`+CY;Vk!AJ"Yh?;F"Г_N1#}X6_LM>m;]jw ӞcMZ68t7SRxt#I1ه:C2u2 /3wyda)æfѣ2CHKuzrBy5ʱ Gx1eYz7J&Lt5YcGc߰WZ }L//yc="'**r6I+Z@\Ĕ‡t ٷlD0Хsp48rFi$p1=?6 /]]>yhkډP:DQjH7Q6/I5YNiVZ+3qe~Q6x-|F3_XWp?aEN&;RfŻlXB K31dܱm~*Gyre)% ~Ǚq79W<7L5zD6" 'ԩ9uS2M^n6Ie8f D 1{>4~^ַG;qQ~2Ք⌻8Sz{'8:ɐE)~U=kAtc,Q(v';BHSPk*;,I.mgKӡ8YcٹH p-"BZS+Wl[L_0:zt{5/8N&ؐYJV4!<@܌ wrzܭNU>ʺ-hkoyҿ VB6RxS/ʕYH=*`d@ }c)+^Ji&,"pEq搇Ν®K^w\%ropl/Mn69(ʨ@3D[WQASv"@9Q@9=&RX S<'ޗn RMJh-jAk\W0/Y'fi6z1ᅵ& f e,C{qg+P(BxznRC+?8gmXӽz\OZmA)8o\{/!4^q $?6jyq+x. 7L;C`iQh :+?5B(JO*Ztg ]9f@~U+%Ka5*y4Q)2S?GcNSbE~:`e,HY8#IY6d k&ŹLW vwhPd jCsi +ȶyr/_Zlr4P+m=x|A17I\[1I)y L%[WQ'x]{=)8Bcb`3(Fm)B,' ̗֭5uw A, aj5_-GRNsmt =3'Kr"+-'5z3a,aor`4N)ӵ JFKW9Bҍx8ՍA3g=&K2fn>{"J{Qen}_iQkh,g}ڶ&z$hƚ6 ȭ:/A e_iPZ9Prꘂ@ŭ\Z:S'ɭ֮(t@퉽+SۋF(heO /$)13z<:sOD\'flY1i`e$0vRՌMMT| fPt;VvX\B#i:d_$wQ<.zS~'2+ YkǞ}mUM{ZǪDz fjCҮ NY R4RӫD2Qr$^Nƽn3øEwLǬ!f5M=+w7*$E|}שfm?@%&d#S =mҋI C *t:ı]e?K)F #{ ֏XN)NVoq Sft\V@K2L_rT2/yih3ZX|g޽ʛl`1C GNާ9o V-2}AW%mRöNU؂V6nW¯ޅ6"ɭ$b HGx_]=iY]iF7aU '@W8TѹDj9+pߨ2y,geÈ#)wa(f; "xR0EŽ%SkAm\d}ސDmnf#~a3|yMI'_r~9nym>G- Dtk2=BS8J)1L4N~$?rt[mh8::)َ&T, )A\tK#q'>᥃ҏic2ɇE=n7*ҨFuIŰ_N 컨 ɐX-*^LiTb96CB #qvZNq9}dp}㑱7j;XD4*8D*Gs}_@g*r2noɨtZGwsn.{ټZ#cHՏ6(F݋š8+Rv_"x_Au=Lb-G&zmߌ$Hum8bIvÂ䒑Bvi>CQ,ȷG,uiB!{G_WoyG \fBo!SeV%уwTa©.KVˉ#؏4(85[HAwDT%V A|KCa/Y2xw#}hC ȍYM>~CΧ&/2ͣK;MI3ѻ*Qr(Ʊ(a4DXgkaz>L *ݘn5q.36  _rSW;:`/ˤ+ K}$ޢDG8ӷ֥JHѬYQ)2k' U@۳HjW#*y/+ )Z>x\yi I$ CUHjqأ0CNZ %HQޑå7KU C(A{'q[4DyĐqwb i zl^lB7Z58NO}h* {7$wPL-oҎsE\n`)êuʹad紸;PX"i'X0D_&cZfUiN K2i~_Jhʡ$mvO֔9Q(){Io}xx8ֆo@Gl4^hm:sC6ϔ6 aSM)p:56za9@֒d%b/L4a3 >՛'60ɋd{",!ډpԧF!?߱ٺu (uA6sĞc9S>`IcQH|t0#܃h ىHnࡢiփ=YQzUS܃`'t 4ߛ8dbCkH%PHx;N?4x>:-w\fzl: ᢍ āS!a} 58 $c w TBgj4]duSr7l:nDg>Uѱnlym2<1qmZ>45LVM$(G!da5xѷR-K#$KjK<V"T%6}]v$)x`7;ݤL6$|'ʜHv%F@<^\Y*=LuLU!ٗXYejPfG`d^#"En:|LN0gfjW4 `;;?O[U5v)ډJ3i!D }a ;{*.Bj3+B01ZQMwO^Kf^ =p2r5XQ4oX":z g>,1VY3OmqN'H(jlsʵ<]F]LK )Z`%P -4ͭwPA/ELx`F%] T)"?p"?ioXcP֫evEutL$tܕZuDƣG>]M% {9j{x<M7yHijc,,7Y{!TO[-CQٍ&_aew:J1㾙&cEUKqTqQTIqJ4(3Ud*Y~ O)s/g/fQ*j$](/Gؕ@ʚ^Tf%5Ͱ'VTkƷǃԆWBܖö'naybgOp`¯kSd BVEX֮陉G|5&]Xe1=:JW1ֈWXهm}IAgt^eXs,Xqd `Ty 2lKAI8Zۗ1Z$Wگ9.|S7PktsY F ~t~Ot(-jQP6TzZbxcC7z8f:CćRHM#n7ӥͲ%Q{\_mGWKck,/by?u@k]En&g8=߸J͏ki+L}G|y74J27Cxھ.1;Ӛny&5TI7ԉU(f4*򹮹e;ODk?eQ"}9`$4y΢}$m O3MQUt06@/7衈P`\*kGBV?#HH$/k4 ;55Ay:$ܟ``bWlGwԋc%EƩ6NqrtZ(#D'_v|uh 8a#xlBZR@;< =<Pz@zz2AMj}BM\w;LmOûx_*z3tBi l!eB\k;< oJi\ })hX 9Cް ВHWbɷr+W Vbؙȗ4ʽ+@5Lojݒ?ܠͼ'LSj)Pnw!hmfREڴjaa8DPXi+#X`Na#oOZ7F>4PeT|଑%c|]K&_$&Zd7iq((Y`P0&PEw^c>X #Yfey?#^}#E{iMt$,*0gn)ne,Ţs~lK^#N( ߨH?Oe߮]y_M! U\rcd6~ԒM.eyPEU` L*n^OQfG(Q1<߳z,FeŗWEǷ% \ym-EfD,~ρ*nbU`ؓOW8oR)mEjbW&5ʈS50( c8ҝK`á獂)ŕBx)G35vg\sh!e!oqmd *w7M_!+]H:hF~ 65BNM"U*7)p*/RA2-i a=kO&n00#e;,𩜾V͔ nPeDŽMj Q"{D|j>x`y?kJRe_`.9|I44kxwA'QL8 58xh)2ݩU,Y/rWcD$74Ѻv#u/~kլ[ 3 .](C̓;,-GM-Vh\+228}=Ou|.;\i%4\'z'Fղ?e*O4u񚤡YH)pȎ5*ل`.yFE|D='Axb.΋QįMp1S:ۢ'k?4~R0&!L4-P"C57^d=^Cc}-z9pqr6H۟!րڃ&/ D –t26uÚьUׯ"o")1F#hivv0}n2bl&)$H>1ymw|9E&&\\Ks-BuHDE- 3G0;Gew/J=FWZB-j{L#a|\ xC,ܴLS9$Y}ٚFw|M&ejC:J A_̣Ĵ9ŚXtO!D b֨xPR-=k1aB]5:A A6 1pRf$I2rێ^(!d&}dzo㰟lԘWLK5ή)/##c*GvၗbMhm,z ~n? =`v"OzKg" [y$6ϫ.HB^ k`eC0{;DP,> o3Jn~PxO$yU9&_t?W-F AHv}p#B "&|L2Ɛ&-y1'Љ xG|.5CK[(tHw[v삅&6Xw 5hܠ۷O8-$3:J's ,\r8Rt{QG39LA/Y]3\PS\V gI!&S%!Mv[3Hz eP03hY a]zG ٧%_@&ۜTyCj5Mکt!8OyF߹p!f3 T)>sE펨 JBG隨])UT`bW6n6$h@Jod[T.2Q&B"& !FZS}3EBr ^NS]n]ceairVQ°&a9UV'w`"I1hZsz;x]׏Fk[}-Zo<@]Su֭B IH  aKZa $kq!8p15e1B^Ğb[zϞ'/);o1(((>/-XS>U0ǩyǻR >DL?Vfkt˨pͲEzTj7xA%%:RQW/(=`ރES"M{î/u q={yO֠Lw~=^3uh[@B4P@8 y5Xr1~ SB A2ԾKMaspଝ;dWk?GK֣)=S l1AE%DIl^uy>Sp,=`)4 9:tqPK"RP0N#99"VX<"L)w8זCS]DqBnk(*8'Idk!nk Ohw*t35)\|D)YVk>*93"Ew iBkY.;ԫ^2;:p2̊ %ވ(!M⣦iފŁR?9|B[S7X^i=JeXTBVs2 Աt[*^ RxTLyeu[ɩٽ aLCN7^m;~T M\7On+=tb?qR[w!Am.J*d/ꤨ`gpߔ\޸]d/ŧxaLj 7<0ˡ#~ @N/f MQդB1 r!j [YjkָHc22yQ C2=_N[1m=KOt3Ԯ8Ҽ ך0 cVZV{I^L=biA3OG9Mf],B]RK"O|e;Lp.Ne: MQsp 1xS5V9ҕH_f~|X#, KU4zMgt5 W԰ -Ӂ.@oey>:PV;$V5uFzG}f,"[du_N~>G$+U ry1T%4)<)g.΢XyU<EmS;;p\wW`_u`m g1Oߐ8ԓ"q` X#= =Rms;DW,XSKwDR'NKq$tsHklw?JꮶMhv\:==&Г &W{>BA-*:ۛ-;-'TqGlᎰ2"ߠ;8>:wZgrmFvB Y SGp4p[L*Э~=i^!Ml"JN`II/ҺZ-uT F)IX ^#y%$Jޏ͏U榇{ a@5 v Aifz:_G)je< hcJD ''=8&',@H:x6}ƢD3 hɛ+&LZoǐ2kqX̘U(Ԩeߠ]jIڟr+;R Iatݸx]|zUͱw1/ p@-e{b*(5)G&!ɠ=d30.B&,d9vip!96U+]#F `Dq?&ˀ#`$i @iY.hIhR?,*4`njqew_St?g7<٪(,äU"ɠ\p^nK05>*B՝y7Ia IUT N' Jk0a MmVFm^Y\Fbrbs~A'nU`DU71!v ׉Tk85{ʂZKpyC}w@qА/XsٲGm(`~ޟcd2Ή_J8 (Ʌ&[a'./LݰY,{&H{974|kiwg/ ܾ# (m7< ) B:@O﫸.~ S^wbIn"jj?5&LZ[TݼϸDu"I}f GM Olzl|>> sW SERP"1襒-3O ܜ` ɔ`Ig%i QgJQj-㼾!nlCq+%zu2RH=if˜6mb^O$6HCe4I vU09 QbRq歩"pLC ~dU, [B:o k*O:Ys\AIzO@8+~A\1ay&aG(+>0-#1ټeb64 VZB*.%AC5FBIEo^z`z,z,v6 ,H5}@ [TEL3i)f#{XW0ɲ$di00>E732ʖ ~i@.tXCiANohS f naۨIK,ed\t^0t4ݲz}tY6E!\sS sYj, nÆzl"^ JԝzF~@ݵW|4‘ 7CLZА=S;[u`4XU 52V#seEL ++ThڹC b8/AG.wMfwSZo}ht:!">C`3y[rAo0~#oc8fϓc˗ l(!(2s: Y>C#o#&\v%OOԞdVS*&=QH\ᴹA&a cDE;cB:zXL_$ETU+JJ~H=PePu*#*=Lȶ]z4 D@(5eڹƅ `WZsF׮:x3~ d ޜ5v7KaJ$ovm) 'iL[pbo$Ot=7Y} Ϊ^%t쾈G|:ȹ@oQ yd ĭA*`Z^껟%d vHay\Fi jB-:.}!"ϒKkI656W vCğ(WNz8!>m8fpq:o} >wX{XĄO_7ţG:lq,iQl{܏Ap C6\ 7r"RJq27_לEp*U٥BQp[sP{O aQi/ы vwFl^1nN(?b)A{E}("D3EUm1>A7rs뭬w dA*;<5z%K:ď4@Ry1?9ttuhI\y}{gSeK 0I#e'AW ǔQvʴrH}(A0ZVPdWVze}8|,DLs<]H `{~;+GjYhʣ叔&I+"vɘ1@f:` 0񂔭`B:Aeߑڿs`xe~i=gG߇B7WŜٝi% \" {w10D5nq;E=G5 RğfnJ03N.F+ئInN\vW ĖSR=@ɴ{[QSoK g)ZL,JAT)&ԂnR观/TFazZ楹+'yՙ9cw9tID2jCimş1y:!ހKyһ/w98ync`&2ʅbr}šWzrۋ]d/wuG3UmjpJc>#A 8| }V)GebuL`!İS0`O]"ܗ`r!1ΕT$UmP}oZ1 Lw"IwIT!OL<%Z=opҭc g8Tb/2]Y֔ v @jjۤZ=zw@ nbZ+9O#7xmv+5x4KԹ3q7h掌 \>ã;|?lTFIt/b%-fX/76 0W?>OG >7 [sd $q+yk| rϷN[{YLk!?F~%L.–d/e&Pl~DAVШIb:w d8ce IaB~Elj@` 2;O_ԝޛ9SZ]ܿ_"W'!2F(q%Ѱcy|wDx}o8 !@SdD⁗| 7kaZf Ne;c•I, VOO/{rrrVMc2g4!Z# T{3{bTF'6 fA$0qc(K1iLc;gyy:1ftYe V?F*y"c$AdI(U`&J(4<)ʕR=E /E SX>JFr!)u-32f ~JηJLaeEn¥iԽl0?˼P NJ5"p*ØXd4^f&KsњL2-?ޚA,ul/[5'[7ȅpɽ|+Y ғb6a-Wmߐd+B=u I,&ZXrkDʜZox61=D[&0t}ip '!<;i{|_@srRN^pv?` L^nMN9؊Z:?<0[ΟB#y V (ޖ.zYaDJzOüjBn9*NUnz\XEh)Yt=$j2u"Ɇ 1iІ c^gwG #B[ V(E Rxv&iY1^_QWT`%GS.+xi6;'QN6&i ^H fj7^եf:={>FbI5~~Hled"2 h@c7.aCԑ/_]ļ*``B8#S֣B'}qU-&)x3]oءSCKSqw5f {H~nҩ_Q2Ĩoa)dn@w81?jԗ|֌^RȨRYsaZT ,y.ScقNM)Vlt{;[ԵŔf+JOHOOonftn 6Rwb>Of޿, 3\p+4m=ju{7g?CtwwpWU"n 7/ TH&T X˒vfXʳRtY-ó sWpϳ|@jFV( 4[pXYkdi;'/\FNjRsE2mʡk*/^9.T8-p1qp0GF]IUMz'q1P\{Wo*c[B3!%MR?42Od6\Ac)6gVZ;{[ǩY;<6N .|0VMAex(<7M5k\d+'pvː.GVA| !:MJ@]F7,Ļn { kV }9[CDZ$ [}gzS4 ؈B2Z?wHf `37آxT-s`;@Fd2W8yM-}I E0i{/]Ա;#!\A{Ë`T"~ыuUj+6yὅ3grwri0؊6[پ})kG4(DD .q5,;c^QԪ9X}KD\2O!mLβ1yoG%9Fi(jj b|zcb~R7?u2/#A]IXهXxtOOeb*^x^O 9 l.M 0g4\sjnm?)o]iJaؽ 짵B O?|S2wUzW!-.do/-a|6Xi9Z!dck\sQBs~]h5H+- Hd&ΕQ6Ե|K~! vJQ{x7'U(K-vX?=zNFJFɤѸ˶"OPŰ <~-+6ws̃6hw0|sA+wc>E`Yau+F5g M=н@!jgoz-fa6[-"&pZ8fiXr%n:X7E7P?(wNACa$_z:ne8؉ hv Dgq_6{̷r;uxLΩ0#΂2;Kqw](Cr:xT 3WЭy9W}^(r1,J=䂜O<1_p^"zYnd%^IOi!t]kF9e:5AI38Sz,zPœYga"+N387j#/\dy9( rYV[6b?^V$kL_ G!Ht/& [PeȮC"wϲv'CŐDeSNP!'|Nvw6dڐ /K8,? , _@ZS# ~`f,YDi'5Kdt0T(ڧъ қB=+$w. U;'>+{vn8}+0B1cAi,)vo^_|5 ߸e Uư# 59*PW3c5NTQ۾晶}.dS1~WMdSHv^s,1ř"*#zȘlk(xd()vD]u˜E0;.#<'O>c?1޸_l ҍVph|^[~BsUn$@ aaי>|[08bPɽU̫)<o}Fή"ٛ;GƄ e$FmXq6Q3^ X3i-|ĉ(r[Ar:d ѝ5@TD| \3Mf2%ȅ*><V; 1a>,^{)KX "|_7QC=KA}NΡp=?w1q /DBZkH(;qԤ}) YOط 2qs`gkgECLK1N5Pܽ]%$,Άj@:ֈQƙЇ aǻIGV-nͬa&QL[_fGBcnG~(eCZ28D#zL֟dž*8g#RˬM< +4< gQGaP'* ,I,΋-{|bo{5ٟ^le| Ͽ?9a[a4]+Lؽ@%U9Pqm0hI a oFX%pk @R\ @;$(TsS Yy`sU\9ji~9嬓3\)Mg"'K`$1JW#閇|Ġ"yN'-; A,SrtɟkF-ܾ!z؅s-SoDUFݪYN5@_ .,Q.Íz%i{J2(_9&=%#`uL!&I@ FkcvL3#3\[whn` "tqjػM|aУWD'0=ny !MH1jUԕg~;8_& 'jO%^D&i` ].p;p6DT ֏"\? 'RYTG92 iҰ-٧U^{l&9˚n<(uՖ?0OUODxx| JM4Wk2(-ҜnjTmlG\FA^rGP`Ԅkn'O}Qư<61'KXث*5P`ê0V-ˏtW[1=)+mR ́lhTڝŒP|SIROwy1V2W뤺*1cJ ;FM'cAN;P㱲!bȶj-~6ӯVHI3;>:a"hh8Kٮ`ٟc; lr^t]PܳFķ7&r RJȴ.K3}HUWbe3bSJ(ny]B豵S*Ep{ >: ͓ X튯v8x-3g=1}sw†0F(Md|B& RڔԽSY9voDA#K8 -{j(#=u0ZGIŹ@=$8t@2"}+, ~rȭHV՘dc0n9;l\~ `X}D\PfQի6h$8co׮Of*3Ou'!'i]bvv vBğ K]]utEڦ=4.eDd6a[ 4%x14 @aZ]q'j*bw6{}koCB}XݘX[?%5x7/*_Pc烪! ֳg1[gpP }nnΣ=UԊ[~FV:{u+dآNqٕg3SBp2]y*wÖM݃4UiF";V:ߤ2eVɞ¡w0 *)#JڼbO/ⱊy.]`X*}5ͷSѝ&5q&e`Qn\)UhQ7C ;ϻ;}DUj.N'VW݁J XH'&|6:@)@jBM#໮_$~k='Bea_|܉4-XɨzӸN$>#7=mĘW0E¡F:~g2;-i6`RD>iaXxu_YW_r1?8(\-j:+|),>ó,greF׭٥J5")tk6.vW/̨53#4L6}alN殀ctbaet49zgO$-jB:pcj|fDļk1î;Zj?>!;tx6hx*DhEU.-yzW5϶a}/U0 ޷x+5cSνe4c5 )RɁf.ҁ y`YmMPBWS!MX ^bH\wJJi*.JDlG86q rZE I}J3ʌlE@^as8:.&AQmI;mDv A4eJ|J2d24z:Vɬ fӼq, *%ycenp+-6cF FRIp0\dU`dCu46w C%D\s }I_do٩RV@s͔·x#1T#0ԈPP,;Rk72)­HUsaz7~h ,t)7{f $%b0Ɋޓ22 $z Ɏ}~F!R[?|1B7 tI_KPeM랽g]ɰAx_{2}`<,V cV{ĵhkX*MD f>s(VW9 U9%Wt@_CFrZ&0^0O?ՓD6ɣ ρ;t\`!/,L4''z$z#q%rC(m=4}cZW^r/H7CC~b^{p<]пb>TtcwlM7q8܆Rk3 ZbcofgD_̓c.*[.naM?gi&=!LnńE~lГH1d0<(n.OCceE/-c^u@b&jzQh~㗊]K_Wc_v'MxNdu._@2H@ DhO0YAI4C% ht,Nf!XV?#BъѬ`YFXK$Rie{+?#`NF}]&qUsНCrL'О`{|&;︌%?w}3:FZ[j|K7rOaё~C3Xή Q|i0_7AZCUC9?+.ɯhko?B+ EBU'g2xpt)J$ 7iCV8,eKhK0H L^8j0{ 6U-s[ރ=*S@'_^`Z(LQ@_UZ ^1ضo70#)O"j@ok[+H$ҡ&Ica>@rjz6=_:Xu2u144F.DX<#T31y5@u!-=%4vyHgh8 T1Fsk&IɚΣSʦʾ`z^%Tq /zq0 [J .Oi:@ ×:Թn/O?Ǒ+6/5[b8yE5";Bq+B>éc\aVdhNݧ'׸xThXiD;WZ&qQ*8ˡ4݈R?n|$t߆Yݹavģ\w?tO \kYwn=jΎ钺sw /8ᔰs9M#q1[/c}i%R]&&LfTdB?.xh12\ b[r:RhKBñAV=G|Yg/=XlNpbe()lHze@|I4Fy6MN8Rd3tѡIOؿJbei-N]?41/ 0tX좆.lڙ_mD@5 Ry\Us,_ Et8!Gs|yNe竇qyG|lFo(RG"=sc=_#$R(.B>D y]nl;OJ?fפ%)jYYzdB:zˡ&2-_ F.A3I6Zx(BVZ^ŏX~jRXx,>C#%(J`{]h^g rfU gC<G߆N\+-1#]qE4?3> -.Zٺ >%͆x}mww5paݍojqEl-HČ}>+3 lnD١\?N3!5Cgi4ߒ7O3̮~4wWw6BtK7/&OxYRO{9WNKK:_Bp & v5i~C[Ђ҉)T;L.QgjcF`G&[ VgA&;==8ZdɨؾMNW,@Mu(F]9"DO)OT@y-^]UCp+kp/udMeVV@:MG֞mP&b!ssϣPz vq@x܍)>:Pr4]Jx P(_mg>Pb8R5⍻#G1U|u4w0쮬2\&-J&]a5uIz_**X6|6%Q7(|=Xɒdˎc+# &Y;"0yOM1 {l\ ii a"Gk•)^>Hs&?pBTX<;a歉3qߋ4Agu&uʱ sHQ?;nX/s%Q[BIUn\eImֹ_0A,ZX]Ix\7QAH ;#j76'k4?Y0T߽)7--ziBsO\MU @8xAN*>cYVea9͕a?x&"MW8~um*trl!XC]f9r*:8Z K e)-ͻBܸ͂zS] F[ ;9$2 C|$Dr]CHH#` 9 Lm[.{]NH PWCO*P:GA tzXL4;neb9RtF+q{]޻LWĿ7F'T?>=@j > 3AocGQ-<2[ΥVj;vBe~g5gaM&A+Ǐ&Ok?Ut"6(]ZE`[6ؠ l۽|Z"Hܱ3x#cڨN3oPEXpЃQdI5X3xg.DoLc!?A]XX飫Oxbg9@|3nR~#Zݕcp T̾|-Af#&gY䖃"=TyO{\IKwbH|h,FHI_[#߄a#5b^$'pV)KD IJ:>ʝ`,-؅Cج|@>L$DGʪWZ륥[@ʉļNl>Ӿ˼Hi'YWw}Cp+ᰌZΞ[M2Sc Y`>G=ܗgWJb z(B-[N+'2:zW! ')Qݤ h슮jVMFGV; [)ـzܚ =S_ۄ3'pzv+ibÇ/Thn,6&%֘B`ȓBa#pTe3s})~F|;gT$Cэb[  8;x/ O8 L pxg%f!Gnsk JI+]GF}d)eA *4ŶblSɃ}+6'>4;ffk\v3=;{٤86Z)o@&3 OEںCpijqEam"!|[3jڶ v,a=Sbڿ|֦ " ~l\{=I2،%Y?G=.M= bpCRyz찊pǶ m7 fTeg_^N|imO/8DYIaenL'M(\NmzC8*Ve~E)ߜw:$o{LrRu 'N:ARg8V17xN pYnWxTxQGH@?0+cOJEbӒg R׷YXL mtNͭtV`uv \NYQse1W' <$a `UB̕;0ҫxrm'I$0ԽLpdx$e7DC5/~U:6=_hGNlU^9E6$/; %F*i]9ߨH6YsY:,F#%R*MnX7=TzgGJ K&sn\|>sz" NͩL61LJg2ጨ>j 8Yߏ o_vdiD·K]yȢYqPK yL^Rrۛ"1G] t[5ٮat9#N>ǞeG#wsWYJW#)j{2" y=Dko? uG*U:zWii"-m`Yo͏wz=q([Mtvv`T8FCSj@b`觹7=Bb;,>W~X}O&2hCj#gpK̢[P w{^}6ꐰi*5zY<Mǁ`B9#:{bg+5dfZ)p uـȏ` gQ*Ē6>1[luָcءEga 6T$I: @\=Lxzi.:ץ,3+sksm}ĕR?} 駔-67 aWC)5r$^ef0sU&RmVτuF2O[_ljMAJőO᪈RP} n&rʺqX_kwq<Kfd!L>S%Rutk1N TL~_ʶď")#mkn dùhH79:-,hErMGı{.89YJO\Ow\0=ُYg.xqm,e.o6 ^lvľ^OUk8EC% ![@,wX5j>lXp0.(~bappngZItnjw{NIDb`dbz 2 zGX 兟Rt 9(Mm$%>lz\~AylU>WZ̏08d3ŎE/7=9Qo']) SgҲ/汃 ؕf4wDi_S֗oKnm(Ut3}zw1f=1+`T j!O'MH)CL*C _#y 0g1X;+'Vر_s{m!'9/|Jq{idZrhT $"_m} e0&f(6)+os7/ w ſjxluU" wy1 Mt XG9Ө94-?ܩr|qmPzxd>()ACJ8VШ(E-0l׏{X\ I/8hqS_].!IoI' aSŪPHx"[+Jw44&Mq"^du;9߷"[꘣G*'bp.y{KFo6,R(aҨ-P#-!6MX>xB , }Tk#Bbn 9 ;hfq~b78=Q^sXƩ4j%_ӯ iVXBU}Ļ$a”;Tں8P4W.V 9l:gκ^dk1q64%RK,Bڪ>PrT uCLqi_ Ht,hԌkM$$5ar%a_ 2O6W<@>4m>vw?/G(bqq"nQtkOu 34 8>(_N<"ڬzygh&(OLEl~!a,}s9^t\{No=y㍍Fr@@'*]udmA黴(x/lC{oϺ#?QTҸ0q Ty!d9[~TA= ! Gv"5B3USMwoђ["Q2)ы)n`?!1GUE㫓MI.]\fek[ =੩\=i8׵ȕ |m!h9.%U:ʆDH’al)}<nq6l/#8mka7'=V Ҙ*!owP'Eݕ%{  sr~4alIV[VHthz-NdA%]n~lπ6r-ie/skOɲmkcEYwǃ{ZҍxHTeX0 R0n\f(.z׺j2=ݨ dE Y.Lgf8 +شMo&1>Mu$8K"9R̬aꙐG`hF<5niph/ rخ427j$OɡrZ# +?׋aXktE3ALG2Pq^/wVIXnಸ6<E&9r".(ƿNd腴C@u g5oԆ@@5+oW4`o#^avS- xFC]exP!+r/7VsG^'sqґNo`]Ʃ43fnS79‹Kp!-˜APVSTgNRNiWN61"U/Y`}ؚ{yY!ߕAu񚺚o=1 -gb@#%WA@yh)|LK>6dM%0 $$WU_NBtDz\ ]Qy~u*MZ ]u87J5Z@Ouvh@DW뼜HPF)xKH0n4O!OJuشhHx[e9Lͮ92vFVuHpe{j $ dKpiSss t=CbDZ {'Hl7>Aĥ:@B !VSqrEAw2 ;Tv G=3wCF"x%@ċY_z9ہs$H/ߴ4#4r L={,)Um Ы<ٟ@yT/!z"9cm }Bbfvb4:"s>CsVSDM!>ѳILȕS@KqS{Ty[(#<c,:"w,$rxDb6C~ 0 i  7ZY ﵓC i+dž`}I&>HjaýD4Ai"~QjWmٺ Y%C-iDda3=LɡL{uԛ0Y6>X9ȵgV:NBdyabre~jc:R"ڧ/CFr=u UV.| =pEi~3=RYv.sIPe"vv ̃YwiHT^^} Mí$mJoa:hq"biM`2tG/cORhI<θjo^'-F S lE jz;?x|2,S74/4_r(NNnb>x?ZVǬ,\3Dւo+en* |?Eu =y@w 8^мx00>`i!,6oHy;z@YԚS5B֩W 8'$σ2mGq دS?Z#ᬏ 7z96:Y ,,O5IIFS-uR }UEsB,s)<5u24xm'GdF6P! #D<(l'3E 'ԢVJ-ky k/rUض(RZPfDОP˱/~CF+EUN ؕu8XM]H~I/G8'>XBچV0y=c=T=LOEw lWӟK+b̪9P37. ޴އd1JH q0rh{2שz< PpiEs8 œ\iⓓ^9mXRfXى1WES7#Tx||gHt,7_u#3UWc*rQmҤ*z/^+,NBc܃ê&q6)Û&Q ZRb];20Yw5͓_a,uMƬK&:WlmGLa4KWVi肙C]tR *?j2s/zYē7)Yn2LPg9(bX Qp4XGj ~oPy *a%okľU==+uTmKBn u0Z:ңid6.#HvpQS&7 *֕ruUG;E3jb "_Ec@'beYՐ?p/ߪہ,.~@:T|' y7x``GȞrz7Br+rE>̳qnz=H>aiW ˶e"Mt8Pfϣ}|HȖ5pM{ͻtAֲe!Eg>풨!gh;#5mpⅱ2T@KVf Usj_BK7PhS|u`MÖIY6J􀱎q_opZlQ x|$Lm/OA0!x ҖߋӬFȋ-I**ߝ u:0I#3e㪣F jc]4.yؐ?ۜ|Ǚ@7x$ߒ"2}ݻ#"2'5$GdhsJ^̳lR `Z}cg^ &uXƽ)ĭg|=D&ბ( 0ؐXR<a7X}`n=X"pE_^LS 'V#Y0{ )eJi.Z#BEg鿢4 vr^X4iyX y(em) |]9#HwVqckd 4/ giJNBC& ""x-) KZ|ib uG5{eZ{>s[2pX|`@x2tt5cc IHH6ӝ̿<ʊuC][֏L(9ni+ަ.#R2[Uj/2-aɔ?tR:,Y e*t+9Ư :WIKr#Gwά5y5Zx7Nk1y\RWm.>7Zf,N)P?IjzNٮ$ᙈg w/4|/uxS{Ji6Miu`ۊ(6]/jǝR:[05i+E %߇jPg*i74QRk;T!"R-z/Qԝ1Fl`dž9gXIq0lQecYwRbEaRd*LN'゚bMW\( S|9D)]uEm4wG9/n-{4$ف#]ɑ$مL$b:I ѥ7{~e /-I6Y*>c{1 7QH,;8\G"q~Ȍ*uvAJJ6`;_d6Gcbo8mgҤG:S.eAo2'L H ,JbJluw26Zp,k)uP3uXp1$ i iM ӡئX~YACt;:{yɆ ꯡ~ bR[  B,'KN8<C'49͟*|_u]IbN#$tSM3󮳢H Á1QBw%{ IA>+W!;= 6țNIdJ3N >'?'W>mɉ[+F3ҡ觇&ƻj-!r x0)`E9Jf Zv.q- 6AM摆hGUw10ET;;:d;  RɎ oKSK(`j#1ZqZruJԴ~'U"%9D vKgAzɧC/xT,!oRD3sKS$)?VV ,_[M:*/^AXyIe4$:j$}[4:fTpCTH&&dyҾvih9Q3b*lΧw! \NJr중i3-cOls/%՜%u""IL{wZ53dd,{Uo+z89u,{6뺌^yPZ`xó:",1)rw(e}b>X^M qX44 F<aE'şw喰_ϐ<]S&m %6`eit"Ĝȥ[}iS1hLDX/ꜜomP_ xa6ekoEKbro/nD(4 ~ʮ_ͨEmNljZdK?8ztFK|Fm{h3qzjeO 6DBlrG< 3Q# dAh(+|J7g r< Nꟹ别{<$jRߟ瓽+a⢮#])j`y!}'D;Pw{Ru|8P˅Ur_dFz'C׸!jԳ*lmw(}h~u"+56bW'p@> /9LX,,mӜ^E,R<_5dnx.#,1Oo>X rŒIUyh]Į!v&{6xvY̥& `;&{`y"j;@k]6>UiN3Qد>ֳp9OiNbۚpπ=?xF3/KJ&$ i' 6&ʹzP&!J !ٸ]Dc ~3d_$8Sv[gaec>YG#Ƨ]rw Nȇh5N~n-QZvl$J0DiRˮS؝|BhڳӁ+ X>/Լe !p.yeS3-ͥDdS+ ֚:җ_ytg Cx0Zw6 19sTl+nZhBsL*[X%I\X{hOM".L0w|. fK цƯ%{ LChĬMwo 24ŕc6ӱbA#=KY%.RL+K WuWD,D7 >JR"ZHB0OI[W#D31QKPXFZ[bZa= ҫ`vgq;Qc' 6c;-E yꞖږlV,YM6ni}.-UpM@m"#uT$1&q>u#!t'Ih\Gcʱ Q/n'Ys=zAJ? X`>UA[!.zB4vXI2XuEp䄾60i]N2^E3F*U{^gTSa@/Ö??=0[m|N7-[\'@8;ɠ|Li߰kʒ8 ŀJYڑ@j_OCi`d@Nވ׎/:W2jL*:s1^4[ԝBt0i7[}}3(Eœ~j0:9ocȟ9׭A #>B =Hp.fc] yHd|H+-II$^I҉glN'eD.}(Xib0 U(zϳ,mA!H6XyIYZr>Vh=4lZKK H]\Tl =ifLA7_\4)Ȳ+q"c{Nhw%@h^%,Y%pg:)Ӕ9'A0_S`](Nd`ꍊ-7VBKQG]I@E<mG[FزGP?,RUXFA{ .k6 n ϑ֐'a(hS\~$ohS'`pbF3"UZf_Cx"e Y5>|?׭f,k\ i%ѯ"lV.Yt3LaU#4Ψ5Qŗ7т vkiu5pFds'&Rn!ךDoF6o#XHB3_QZp7);C%؛M>7Ѯzl:si0=#^0R}aæg'ʶ ef{wNl^YPfD-4Of?󬃕fUk(;nS'X?4DTsJLz-BQӹ`9 [mΦ^R.UGӓl}6'ha땕 $[ihhq\r!^ծMЬOi+olɳu) X#aaj%@}H8eOaxZوS{s4iI}KŬ|MDϋ*hﳤy(LZXt@8Bgxcu>1aQZO"(L:3+E|i ZsjQq\DK]/<]9>)G&# M9*oA3b Luhr"YITKIxt[~>B24>1+oR&]ˆ94hpdOOsn)=WrV@DflU&w1@qyV[esM߼y^2Km.÷jҗyrѼ1RYH`#V25`ev ('{Er.@F򭭒F:=w&z &XR´jՍ7m!==A\Zo+&Tī\#0uYRU8ФbK- J 8RllH7%j/xL /&Tz3GAKxI,qBxAC\8eItbDV7F}NJ23k܅2 W6Df>(%Y,r1I\89*9i 'K=~xs[5tSEhndٷjL|%+yqzZj*Qɔ06.S%ދD0q I 2cqH; (/Kwk15LV-j ^Xp^_/NOѡ;9cU$i]5G· `I7yYA\!HAZ<,vOĥXGAs;m՝{#pu+ٶ1458YYhZ\a]OjsRGsD~uݜZe_xz ŽkvjY$Oy&9W\bad|\ؘq*%=EQ@|96Ei3>Gen2'z?oV(>(JlH1PEp9Nfft7yb3Ϊvg1-SfVs ;ge ͞E@@ QJo^2Vj+.Bρi}̃7Pw(H讨,>uU8huA'u:meΏ8Dk4:{}>/zx5q^׿~p*6I쏢gZ>{fH2K`5zC} )5Ɍm\ +Pb1HCPefe#lHR oT,iGWcă[ZΚqCo̓JU\a5 kL(2Fź*;UKWR0-ؘV٭wY>؂9W#S 9F/wSx~T@HpGO 7aYb#-!D%ZNAOx%뙁FiJ؃ۘqJqfSaPƌαbSAL}vG͆@.A\4 Ѣƈ,URY xf iK?eYσJ3ye EA'tWN!D9,o**ׅMRSui.N$Ł IT܂ztwe{B,0Sp@LѽbNpd53NwK6KC9Iul% /kH_e͚Ja"Dݪ<J[Q"] @2m>ʥLlIc@Ww0#S_n_**#]Cq=u=ÔT"E}xȯ&0P>ބ~>NSW<`8ύkvUCB\5͓.z_@`IA+x9B:xG5$O7gqlv5|GT]c.zLU~xQƤQXZwb}B}+[WT< fsQr4l{lnj,( _kVgI/Jгa۰*%DE"pҏV7$gpMxy_3? (29Dɩ:CI;W`faN?4R(_̫Nƶ͸j#f>1wup`hK*ն~`^Hcb,L09 QDvLO:?8 La{"alK)GAdQO7c Bav k%/ iFhǦz v쟣\~fi`I*otģU.V;0AH}t(H!~#-/YMɏI301qE*I|/ B?|h]F.ŸuVDX*|2o0 TA~HK Ng7},i[3>fk-BVV5 ,?[YP+CͥzdUyl|hW(27EDZ`V.0%}4p#`=vﺸuuІQS[Lc[p*i,:%jZ[G[]5o.Jkc`5*۪PG~ncfA}ϟ‚X&X=:.\TSf!FYCӊ b-3XNekA;A@kאXNn_ިҏ)WG o9 iN*’W(,>Ez6UY$GS?o *>K; ĴMB\<4`mv3륉U+RP)*>5ѱZ+Lp m'ץ2/\#}/7a4ݼ /hh h iO]X۪RݚUͳt9Q]"g:,a++CxQ,"rXE ,ӠqK1u+ED<4hs`:& Q=4fߣ_)':]d>:F_@*0gF~j*S YnIFK`:bycʊpxIE ?Qu:6fs-ks>%l'60py=ݯ/F aB|'ƊZJWy>+[Q]s8~j] #HôC5]`3(K<jJa57Pϓ9*V ;0/"kCfNsO2@K9-"}Л~I!"FR:zy煛u社j|`L7# ů.(umBND $󶂉S H=g(]WQ?zd%?4"4h3P^\osG< 4}_}vy߳?V=)wVΘbBYdbqл;j2¶0dBK(d rNҩk' L-0}B$֚aP&_7׊y֦|26LG* i} g~^7+M{W?'#sЮ'ݣ$r6M{AJa.T6G+BT(eewҢR["SR\SZ2}.+)WhHJ^ 4cDH^"V$op"{jK&Уj ~b$ludi<UW$G)z) hzBo3.BAaþd1x|bG}>3+8_`mhj^>&iXx\,+bhq"~/R^1gHݻN,S7ӻMٲZB?"A6$ nUJ[>iX*C=S~V֦!J9R*ۈ96WpfqUR V` 6YpªX[,_6%hdUj.jz %Q7.Џb=->0@z/UnYr?'-_HD sd6S&> o8AA ExB4]0D⻍ՃqQ8[K?1cALl6A_a߯lP1DN~WRc #4=~vMrqᙖɮJ88/>f"RJ_YhJ-r}I};u\|WSY[/ ;mPGjoyswݚWxbЉ~%"GzX<l2 G`x,וYk_Y.ݻ- 2= bn+9 ojXŕ&LŚbnCd8RP򺭧S>sfxGs2HwDlB2TlwwnP* ^S}X K(H|C%C7't{}03>Oitk'g$9>Dc8m guʼ`.jM5~. Wol'9yF#ϗX+wmb`F"8(Ϡ*ujH"/eӆyq@qu{rj/@ )ש5M¡8 X{9:@bB)ڠv|Fd'^FM'm)@X]TZ&lu8.iYA~}@U{Ϛ dsl9M ? 4Ba.{ /Zi[zjCTȶ}KP0̒bu@VE `8%xii$KҮA8 B W^2䃞\TK(E,{A,F~g [0&`0 I,0k1wg\NtiHF Zr#kQn>iMl>ꑬ4)C͟9(}UBK2Fkr}s,x3l"kȢZd[[v"/,nDR>z @2cL qemwV@-D+N;I%B>Q2[FaC]N:%Rk*# %L*~_6vkH7623B+57t`)fXilu<ܯ̙M!^05{%ja2VTcC9hF@xA,qv6hQ3EM$x3* vh|/_#~ -{Euuڒ1opD4# oc5"D J*rH6(ĠjwaTGifU`H)@'2Һ}ȓs/Dʣ9`Q6~ t6z ޠ|VM0_W6./;רo#N }ؘ\bꭜB7ӬV'4s{SEN%+7]2XUy/'Q~{;b'[njϴ5pԨ̖ ٯ0&H#~l5ͩΧXFQzA&oĝ(>/DqD'I\Qmx4.\n^T/;Az-'_it#xXB W1~F@cuy$\~]l[0Űn, ^e":i qal=)C }6es.6ot mKq=%\{tcDR?'%hhH4w5dw,O.$OVZ@xh]6Uq##Ĩ}1 La @B,13yENFBҾ_yR^4,H@q+cyU$UMEi4ŁnAe,;D  W®SI\U-_U 8),O+Pb2DIb8ǻݴYpΙDʉgqcu0!3&R8 -T.FgO($^QtֹB6 8>Qm5s cKkfi 3auHʁqzL?-jrmo&fXTpӟ._Jk, 7@=YnE?ՃOm]ߚd E"i({_}%) p 5 {flدx>0Dh$-"óiXIb_u$֫sWe&4<{g56N{~9+ bƳGjzjFNx.ޓ'G6J{˱)QuT23oyi&PDYoUP͂Eh)^QI[-Qf_q~~/k[`ɶ1$ĥ-Md 4U1`ݞUX3tz@G/g,RѮܳ]>wݥugc+]v$U1)1nR&XC=)ud ѫ(jpv`xKtH{-_[nBiz QLXa %H5՚ayϏ c[Yt.NfmG{^[|Щ|;ؽS0EU8Y|&ݻCbO!%VF!+48.V0CK{MO3U` Ψ(ፒ uqsT6y'i=lHeFvN(--Xt=x !!"ja2e#78BmH ֔f U(/r&^fT|%,?IyNu_>sξ Տpp0] y0;\+=#c[بNY'J!YgQ+Ld:!gk_gֻr\%w`![%vFڢomAVLM_-B][9"nUYO 5*':QI&Pn4 rwJ)=NͶH~ ݶQzPuf^?OHpr5ogZ4w;_ uE OZ(]wCnt'ʨ>#Hh}8( A Ek{tgr?6GErm+dN3r/O s݌EPض%. |*3[K3uM6}dSd2"9䔑[gQ q 2{y1/sVIǓ4j( -ݕ-g(N|'0bݡJ:~0{Q-^8ۉku`jWͼgx7WM˂/՛qqQ1vK"[f+m݂O_.Y/`Ehlzl^ʙڿenDhps٪q+Pr|1 YpZ{\|,nHZ'#E7<spyc>q&7dRCw!$z$\y ?fWDvJ4Pn-l-CK䧠()j,?=S( FzS#RّpvC;JЍ* I]^}SMcD*! #8 _bo\p(9PH # Ial@nS sD`}Gh8 9cȜƿҙ2 6P`9GClKF.`)38c]ܙCQԈ5$!`w7{*mG.:^vpc䆳,](:eHEgsL!_r\I%nU$z( ?uR3ڏ_b.`VRCPS< za<;[i;U r ߻G%zUo[?xCLvQwsrUHr-"|qG7DYgˈ3L(tV*x8IL[?ڟ-nlMr~͖pߣau)FS@E(Wq@N 4o-q_?Ʈ\Y'j]=.4/m樻nb}o^IGS uC1IըMW$wa͙JMgLGjyM][a0f)%#Wfc矋%t ;p+ɭbב./4 5D->I$r+@4H+MØ=z*p, ~^V{Fe,{WVXj¶\ 1j tN@WSZL S-X;c םO;S4B 'G߳g܊]lܷbqߣ&O:sFt$6+; peר" &YnQs'n<ŞX}z lagwDvrVj1C"Yrmo rE|X1i<9hzcȞFRᔤON{vu5oGRyں4lٜ|TZW(ʙb~|h; tmrW33Y7a=MTѥ4|;H>tuTm늃J5 VfOH,踘e|dtD-լ䩏/z#YbH\h!ޏm?A=/tY5[N9'}: 0{f'{+ǀE}tfk;pH}L'u]67Cx7$h=kcA?Ens4Fػ :(i/hb &qNN7[*i5Xw>al|F")$rkpe^O[: cL%o4w|Wbۮb2 ?=lb;|}WU25 75bmG~VQ poǾ Piw~jVvEcG;5ywb~=LF< =AcA~i5ew[u sXD!m4HS.& iI5k byTcsrDU`C"U۫~.%ݷBKExt{(Sa_eGVH86 wEy݈rbAFAf(>QV@l9C({"@yBhnC_}4䃾&Lu]dPGT=+⬔l (k,@!L.R JSFȄ=EclL=8ڟ#HՀ4!uq .wր+a,_T1slx {]ѻCCi<.2Dk3=0NYhYgڅwo=踘(=p.Ryx!7<)+hh84H]uKP5mYH.WD4`ˬ47ձ9a Ҟ3ɺDT)^3uEIoKH2g~ 9@NZ%S!Ɍt64|ŮiAdW"zbw`ÖhpԠ24q>a=Z|Ee&#+4դ_VB#fwl 748-#ۺU?'ZѶkm)WJHؗYT)e`ޕWpe\K6zBe2ܓ[ +6.6`G =wU + x MEt+C11,"_D8`uIep뫨KuI;.kSb% ]=A19|cm ʱVt,#/ln5Y SzjY{ ={<Q`h՗GX}y+@ >;).eQ#"uСhI;IhZ[6ǿRvVIю&-u @ʉ1!qR=?\!xU@tw| T-=ME9لW8,R|Z_]}_l,5q5hS uE"#$Dxf0_B*u!c`QHqSi 5HGL34cRMBbM;I'vEb!rnk>1H-{0s"8/™mSE;/gAV2hM'եQ$h2 SDFiQ+rQ8g29cdI;%.m8I@aa_m^t]qJz|%FDJnrٟ+fo>H /g~T |P9V2dj@kRsP] @t0B N"+WzbݨY)+n-0:މ1l KO~ZNxk@T ۏ*XCQJ5\&@pW^ژރ'hViMҐM)v$7 kJ)]V:-sHX:ZGF>=4yzS7 ƮU{~?Чܧrb7$^m|s*he2ְ.rUR)?Jۤ 6vxv0,tsMJ+eZD\>JFW o:A~A+6h Z>!b^o^pm9SL|5༬誧3w0pKz)w.#gOc`HvgƸi⸄)S%5&T#j9CiV{P]8s-7y=;oB}d 0]④)^5z;֚>KYm`whA+;J$pG puB0g.#utK(ؒ.rw#m:GL:v͝>@kP8NH*>?oq^+_>ݵ79'Zp5 A5/i2f95f4P1mM Ԏ묦{\\t YQd=lyGI~pKn "1{Y}/]2cB=Vt툏b8zw fMzG&'<*㷖Ṅ+,x!zs7eӨqYMd }]cK J%Tg(ck0 !rPTTԷSϭmVb2RM2X?OpR"@:\]\#{] KH?鹪EnT ˶ukpx UΕo`QkWi!2XU{]:,TC\3!mRTh}w,{HKC -¢!6K9nIeH.JkdfUKN] BsUkl8Bf{u zvYu:P Jr2L͹c^uʑ>[JPn4NW@#>:mpR=#E$Bm-$,2%>9ɞgnVK[*gW}Ghÿ,01!Fٕ%xz0*) Y)(\ 2-XDGVy&_o(k`|RNܟ&W̔|?#r 4[p~f7u( }tǯ/?5lU#/Vbӊv^1!YE(%u I#QѤrjPD.4)\y{r$e†Gأ-aH/;(}ަHNFEF¼<"FG+ $FSTQAKIf{"7_Ѳ9+s9ОARC)֠δuL3?;EW#z@ֻboC>al3s˪2=\5J#q'l[?GǒsdqF).0>C<J`ffjP&~w6{S0q;ID4ҴͮYdCo5F@|0y1]S,a<1pl2|IȷҼF~6p"RK(ʧJr>8pe菸Mmpa+{H܀ր@RSR۽U\߫٪C(?I^9,n;\-HY}gtlqZ &^UBfqcK精dF(. ȑkXL+[I{+GPl<*f68%~!OU"ڿTV ;muM&ޝ81ͷItg5}ֻlqXC%MzQAkPttY_Kf.O=b^w/]o[m½ 5npH2wX|7#L$M}qC=&`'9aM$+66:o_xe6,mq^,Ւ5Y;?Ka#P)ӥ=-෸T.cstR U@k*(nd YXzǽA dcxƣ[P&W.*V+YLsbޟpI@4\}x"ݭsmp.{!{YQJ+s4'>0qY)#ayۃPvZ(1*@㷒`\= D:u3qb} u *M ;t%ڹX}*Qgy 1v%oeE\+xH _OJHô9%ҤU&ͶYV^/rwLbVa98V xm^AQծ2TtL1O~lކsue6@᭳ w:7~EkDOPl!=lWl#g-igq} %2(AM-V9CJإDc8 @5%CqufzT!/iq;ۇ)Y19J1'&` ܩ:D,֥ 6 q@)hw4|3(@s%`~5tvSeN;P[RQ 'I;UxafϩkooӖY&ib^NgPPB}E|8ah Si#vxݗN?"[b06՗=xcs- zcH0EjUW ~ quť-h~8z([×1@޸Կdf^ ~m@4V&Rkq_aԑ6Ti'm-Y>6iN9ȩ8kUn#FݻiBT/aiBRWB"3<*:(r]m,7gF$$_r1b0]' ;q B^dGM.O![uָe 1]恧c9„B¬U3`[0u^Cđԁqd*XGdYI~ch=K&JRiT,dg[Xcz(- zJV@%i\!Y&ѯ[^[N^3JoT}žH7G:o*c k-x1&Kis?h痲Ͳj9O9ܾȐpd"q VS*Q"h9M#9/H2(jIv&%>۫J7TPBc &WF$"f6i23 ˇq|ɐ=AOm 0.w&5Ӓ-5=:qPu#:K<%Ѭ$q'겛֯')u5ohaձy7ޡbfSƇɎOUMȍP罒z8)*D*俱H h0<`ꈅ$QƨT!c4sQB2?q)NsV^kWirz,,gw4}-= Du {IkSuPI_/J > n%iG OSh|^*#sQ}->$. Q3K1wSHAhƋzXU$x@$t_O-/|QSbHjHv ~[nr *'AY݁L#zR9' _ ۭH!tΤk:S>VW3H @j#b7* y'_ {CMFjދlxp7~tPmre44P~Qdxw1Ux O-w>G/~4^׏i9G5Q ۪gx)1C1E42@"s=U4F̨xV:^ xkb> )`gd-PCFG`8o?usqCwF 2Ϸ9rZUpUș]q& UHz1EO!d=S>6B9Ưwp×Ik=p!j1O nCGTn`&&(i-2;eSw'vK8m]. n5E^I"6ӫΤsx ?1'tfS56qvTǦ֕c=c^?B'_HqYXfܑrlB+5t{^qE !ێD6G2zt gm:C~6ͨw?ۥ*Mlb7MեIH%1ȱ!TN7fd+oUUESErEn)ϼC[W-P"p+ [XP!£D.IE4jw<5+tC=0\eVd8[y͐lٌ !InDEM 89V9/PDs H߂ah_e$Ѯߧ})d>?Ct;8l4dhϢGFSuTozgw}%%q*K~bjk9\t #) ~k4~+6De ϷVRr RDw[]HX2=!75ؽ!2 ~YcՄ WEMrbo  .%im4(1*cNY'7c3黼AEZ7yyc0U%'kW,^q1}ü#Mqv2ʱ> UD?b}QɊ,}G)6ʔ TotJ^Met:kQ(1p/a1 tGPYX )j}ˀq2dKnq1ګ,V w+IRlld~xIq V ڷ$k,Z&㙭бtz =f:XN t0XsDy I"+zاv׮ѣx67sj멏Ix~V=W4O5O0KIx~# j15|+E=ԆeyRAIGnT1)16X̎I>ȨˡS)aӂk !^Yk*KkL2:Af"d:KBOEZ3 )$?[x=l'|iztZB"֫L wLj?HҀ웉0W*f'P'K'oq^p䁔|kiK<ا77EF`(unHvfw vF3&x,H'iW5rȠb!JH"T²ϸ;:ˆņu#)/_c$[.+Da\Q.?`UT-'u,rw)8H|Mb9vw!(0Sj&]%ie6P-/27e4oͣg+-dvȁwN'QvWe.]lhZߣ0ϔs/4]j{m{[h0Jp5*P1}ؚ][YҁݞP*sQ`sQhė].3/c꧉t1 800[ҐFK\6|[ ufʘ.^FѹPrb̥=y._ԫeRS)l{R--~iW~{d.6te]O[/go2AVM qpi7̢  % 98<k/4q f]()?e"M\\˃]fS *Q->_'Lǥt}Z!ԍ@c8c"T;^!R$d34䝑hD\HbƬe/:XMy eXxh+!o3lan1n'K\^d6kHa,gT0Xw?ALĀ%@{tȁ^(d"mxeLi&O@\t}[ $ŷpɄy3x`?3_~ű^u sb C} KP%O@ 2A~`(97-?U*,MX~K_3axe"O~튨}~Z0 hO|yyⱣ|6B?#iXgd5> uՆݸ`ՌY$V#f5K̅N9yE3˵m/I'q(U`3;xXPyq_Y㨐ur#WE f)Hj1T e>1ωY6َZRƌm'j* \T7҇2B1lFJ%H0I4Id^hi0l1C2=caUnegL&md&lAN1"';W>nie,%8n8OBpa͙]sCGҵ&" 9cdn|np*~`DnY5O1O)r42蒲[5ֿb[.X G(Fl +1m\9O҈+>][.>0R+R>OZ_"ђ_|[PNznt_㪽nʇYW} R!ܹv':=ee 8FE(iyiWFk K,I C~20J6{А2Ϭ+s'e}tJr)oCuADu|SN=xG8zO%J?~2~ōܛqW+ 7MQ6&T[6\ҠyP9H$kz3Yh})~S<)n턋(qe_nJ#gc0/$7'RuK_kK Z1gw0k^rLcUi( !\r8,Jv;U"Sͅ;^yeTWEڐmWahT3~.B?3" CW7Hfۦ)DNjg+/1܃فzs"seSu_ =[2>MK@t`t}`Ls  x>U,Jچ4̄WpJtlAYѵ!=p;]tmDr1=ElMdƈ f&!?KƄ MJbW< .BW5JxnDH\ @K˹gRZ3 hoi1ZP-{ջno D99YX{1|(0 ϶Z\0Kv)$ 42T}NJKJ\>7i/BMp.sm?H+;WeJ(7Ш~քt&g>q%Y kjSyX(淃q2ٔEuqgF KFPK)J6&Fw(ƱI!R>jl{,%Yr|W+8Ɠ wS} ~&=Z@Pi;G}y_I DuI?I VqAzg@I?ƣ|yQIXFh6tb;ҝ}.%i)j2{Pq",]"t866ڤ5b%K}r_"!qzjnTZxdԙŝZ}w ^bnN&HP(WgٍA [ Mm ZoD0*. r*bJ`8;<6=1! .9{&f}IdAMm>z߹ydw/s*oK7#$mHH佄K]Sq[9aؗA7+~ yu:$jr{P=iل%FbO Q%-$= ˏ@ 6Cwhd_`FsӖ@ka.oߔ$y~Gѥ\d?1wB۵GX 0Sd(6+ֳ,q*i)F| 㣗NQDvCNU3$)aD˝HE%sјy1y1ͦCQ 7[Jszs%]CnL2BK86 I:qMOrӌ9옾,^46 .1\AQmp87;3HL"|mrpBwc'JW*Lʾ̯GE|jmœ! yb'7h#?KcMo ےWÿ-B;}և{R\ueSUAe^198?Egr=~q8Sj;CJOrAMSXa]Ԕcvm6+ yЛL2(IM {|ƈ8k^'&^>%-Jf28%s6g(Jxqv2XmK=QL.sY w t)u|?D,'w8RZ7R_|rҮʗaZP: *ȆZs:P޵}·T!y_7]&BXznI-tD) 球i0ϧ'67-y fy|Xo`ƒ$ֿ-C`Ya + +rHHLs&N;Y  Igg>Gzv4p9 1[ h/a0ȩ.K,jsV!18-֦^cvS 0p?K$a[]nRZ?͹2 ܚnϹLҹpg0}M{"w [$\Ģ'd 6Ӑ-q29^wZަ4Y/;]X鍧HrGQ/\ƣf^|܇d G1%tnZ|Ʊ9 :]HMsBoKI*or7`_s&g?B%*R8HeM~mQODHos-:2hDF12yee;e/왝SfUvE!0C DbF7~}_LJ.+ʅm#G0`nw=p O|B!UΦtgޭLR& p998{f>!hJ @#<O8Yi;H mFh;GMlš@GWe.!HԀ#/4l\5Mwgxwe%#9!3ΕocI$wwyҒJ=PdV8 ojP++Maz 9;(\ $t!?N k>V: 6re\l}ض_.q>@բD#_i%b+pS!/[;y H*'Ÿ b.K վ]js& xNj)hTQ^h 3e¬͑!Di ?1bl%=iڳQ?"L "ggHM?}ow-=CPzI^< yh^h**csH\/3J>F^' +W]6=EA+N%\43f5tfF 5sgyRn_5QTGNrYF!0$h$ߝ=w_]wyY;%A/PtT1Q6z i4Y   7;m67kU=t(oB)ZRF 7@D0Z9J׿Vs'zouu}N6)]wDޜ]]Wk!} M@J-;Ljʈ3B9:G vPi%їPy19HMҭbwČ8d?z,4g ;T~lo*>TV Qiw}3pT楉scx0I 3L/{chA_V5Zx6J' &(s$_0Mr#vTbj^bƒKQ*L %H8fXjڙ zo7sKpi0xB)`zJ/Wv<$EEA`Dcq_ҿn/ˈ0߈yfxP Vrsmiި^]eq8Fdê ^M 5{ i)NPs"e1#N0+rH+,׉Q[,)ӵbKvdH2fC>X6ZFHԛK*Z= #裤@%C=uQ%Oʚ-7iqή|MP\^35WTyUga&CM)sY>amZ?aۘu94`]g`HlB6ڭo]0j]cZc #JlUYu*ji 4`ER,(Kׇ\e%RP-aJ1تϮ3*tM5Ʀ^Wd̔nv}2_y5Z*5JK`U&c2r(ހW9.ү*MpLڏ!eA[F:b4)XJQw }D~CU:YlDU.=Rՙ˵800A^R0e¦w PxHjwÁt+>8pUL򱷊  `MuB/~gXy v d^m/<%p-|I7oA˲0Xr :v2}'3X_6u5` eb5yFT q ~D0ᵐ%ۇdكC!hBz:ETf"*?X&6ثV0rG[ ٟM"ǼEr8/< ?+VtO?"ԋtA>>uz[%ͩ?n=*ʆk V+>RVj;o>sg̴l5ddMqߎ~312"yH>dHHN&v:"YCeptEdn7lՑf]%>N20meqAI>62 DႊRB UbHˇ8Cx]*{CkHoք*o#?,2;V:}]ɰ_e/!Z}&o\#$ġr+MyBnnEd~!h@B F5xuNTM`A}%1S+ύvh l+6p _U[vi]r/|ǦEM4QugM !M(j+h4j9w.o` vS 31(Z`_ede1rnA_J7ޜCܾNn(Fۖj#BIBy%"7gN;o̶X3ǿ, `HϐUj7/B}1 p;/|"=s)T9:QFH$͒6L~\85in%%*Z&|_de0STq警,o/&c&>"ɨg1 ȐjԆ9=DCJ,!0RQm9qI5\?G^H/W"\S]HH(fݴwKD j4i Pk{\sOY|ز]Uj*&;8Z\ZB64eTA9@[ڻO*  87{'@E~ܔFڧ=:d:P0;mi.q#l 4Kp雰Y[xN \#Q8[2pI5("Zp'Ϙ"ӵ)EmbDC'N :- ޹**׊2F3YPYZHԌ.PY1[XK9U-@jA!x|1s2I)(Z{,q.Y.֪HZvYȢa1'$)qIUNJ!_8yqioS8Oڠs~P3?,-A)>FP}x{2Q{Klۉ5|jwZEۊY@:Vmgh&8y&O5\=(d{5w(;s!*b zkw 8QժLd—W"mVhKDLjƐY?쇕_'dD;tGGDGqnd=(k쵖 z ?M2'nڐCU^)]d@ 6 ;u,;MԵ<ώ5cU`u> _DViIN];:̝Vﰥf bEs & OzΚPmd?:>v+{Rڪ?}5^\Xݍc:H\?LX&yGu qFtJ/:;I3<~LOj5{$GQf ј@:mII?}5HAiid6C1ݡQX%lqB>×Y~J? ʹzZ?:F:Qv" lcګ٣[V5\N1Tu|,t<+74Sb3N; Iu7} w5%_1PwSj 3G@Vע鏲uym SBeŠK 6E.SN]7iJf1uk(:qNfΗx pEE^?yIv^ ~*KE$"H^nObŗ?2Kӈ`f7[_@KP3 cJ*Ec({qXʐi Vù}ȴtrÎ)'8wwJm]B>G[kw cNbs+o=PNahu;[AqD6XXAcP0@E9p. }*( ( (pQw\[Yv\2xlBYys&eTOԑ8݇&X8ٛlʢPX4ٹq,$u''w^<7qU{rኇӥUz(ӡ~ C(/np!LK;b 8q+dLEc|ـo}itSij © 7x$D߾q3[VDˬP ,2n[OocR%̻EkujyN[NJXJ8Fj۪þݣ?.ԇ\U+3ڢ$3LD:/h6J~b(c7Bv䍸 v~ݷDTL73 }nT@b9b~W=Qh2p&t}d ۆCNWm2l8|Ǎ >&%Rdqջ֝uDb<ȧv#BIn?䤒}C5줉R]p6 ?g4P5yCozvz%e<"ԥ/UTʰ'-́$70ߥֲ?H'0R E< L2$6 xnk'^=p 3Px.#`(ח ("ĵbIlC/ls_kvt Pq_ji45k 6ao g!dY@$B y$brD' ~ѓH s>q-!yo݈6J䲮C!- 4&>̪qP.e}+sF  &)@]n^p7,Vh 8@ሚtԫqtVG?K2X!FH?&T*elͳa&#i?=u7J퀡|m4? mD$X"G9, VaK4Φ !l%aԂgJ<ņ>aGnV\vM+VЪz6]m$lD0KsHg?t઀P!MO2_55wT?Lr "TF8˾Czlbվ$QLHV5N_!L[)Pܼ}8Du$pS6ge=,K-j7ύ؁ kWtdj7+(*2#[HcIS]@Ԯ66,)5-Dcä<-{Oe@;si\:es5sV?ry/Taϓ Οwޯ?Vmz&ƵZ;eJT[X8N'y-n>f^?23ӆ)Lgyv]cn~*wrܣc,x]r+ʡv!W[4X%LK/F3xs 7öZQQes\J(~ ]&̗:y\e6C3DI9tT:yj55ɘ_zV+VM> ۤ<쏑o2|gK7 r7kܶO4JS|uan-gY@^µ<ΊtKeɿƛk[}ꝕ6u&4M!-'[@CT\y,h 䒟ӈW3Q;$,F+1Ab}$fz%iʔDoKs:u>/+J}>|aTӚ @* .+nSІxk &T6 sx4?XʣJt B@!J AO-q Dkav`{e19cJN֫70$$zV@OO'B4ӑfR%~ Bzf+M*_t /=2žp~6'ԕP{=)jg tvY47lFܸ.ܱWC|9r)T ӂ?I4ZL~xqE-+֗8rw*].9~(KX$l-xfv7f*_5Ҡ4xs} C+R+?eG4?rihl$}a@ Q<=P :a96Yf|m$Ķ뒷Z|@F+R ?Ӷ Mea-K߀{ĥ)0);R'9nnV/iIc)_"?!%w*ΩKi:B0 Ds̺ z ;0f N)usW~`CvMѝ P1Pc+_}؝VMf yL-1o7l }橌FHk *;^@{*ꇋ QX~ _*uv4S3'6eپRaϖMcn<bf/x2æS39["QvܚN9_;K$ K!0ǖq23z4\f?R&2J[*<63nir3`ҎO\c+Y#sՒ#2V)Ⱥ-(ξRl!rC?&U4ק#3Um¶VDh\;aW aJ?k=۽γor Q$eKFp2sCx8ӌ;=T&O!C5@}0Ka)^zGOY(};y/8=$|:.+T,T {ܔ7DQڏA^]UEKdi"!'^$^:T_HHZOν&הt2bx +<Ed=4(;z #ZciF!eEe:Ϙxl ?6g8c<:xz/koAmٮAiӃ|: ̉_pc6Jl5w ˈb.G%@/}~ ,p?` Ϥ$%ײb%ZCh&럸9QsQ\UVLl95>5=h =&R)Ds"(%q#jLwfjmE')mF h) ş@/g9j4t́;YtH ,J?w&ZG[*kbA.Y(D:޿ <2_`˭pf.ȀО" 8Ux#Y&7%3sk}CqGeb D%_GI5=+ԩ'4Jx =#]R~00*zmo9 2YI8Yƒu-$cǖoy#܁{4Seb#:,•|ҐU _'}gNEkwfC1S-:]HK,B8XSeѐgv,\p.`Q6aT1 (.j|3nWpۑX;Ђ+uE>w[r;hU8ǚn4v>z =j ;FG7D[`;WBQ l)S{Zt/AND m !8l HeB/v0܀o3뭼'S9:'{J.ɳ+F>?Dc`>C5sz8o 7V-f}x_v FߐRc \)6Rh|S BW["9>\ ڇKL72;*zxZ^}I"- +hC'آϪw,?TqpMQj4Ab#G .Ţ^ P `G} #*A7% +טw߸RNHQ 9צIf*2&tB&~ߕ9eMqPYV &  Yf(]6F^Ƥbg,5؍<aWMLiyu1M2>ASfMu?:ڌϟzXZ^A+!%*z-KHAF-hb臤ca"2O9ׁ:U0Dm Mo QnVR-_2=4zx#[XQlmOemk!Ur^$<9O87֝ݙ]Z+12Wd [{ɛɆaFO0b:c\|785x7Yc7a/*2b?I8nnDineZӼ&-ܷx;e fN]:z_pKoU5O\y[J$DKA#Gp^j} :;u&=\F~GGM:(^nvfSTSƻ D#kZ)k94k̢Xɾʏ9V4)Zw2eyXyWsuE*,>ҟ)&̤} ($GRGaLl(D@ %1$5 R?W,`"u"a3._Kx\8?.$pNɴG5*g7-ddX6f|Q EPuY~>yrclgůtj xŘ! ~Ώ̌ߞ~; -AcKg惆* 'F\hи=DѨ+O}3@ b_ ^k귃(X;E}6_Ϻ)$3cԌ +D[yag@)O,.Nh13oBrb+UhS5ɞ˕, }FMT VG0J.g-?zT(2RVB55ZMi$Bۤ(p7A"ZճX)_B]R)/@ƴռ˳;R!INnx5=>kJ,Z2ߧNomk>0_֞B6^~cvJ(A =)Nx[L 䋘&o+,βL1f Ϧ9By"(/_e~MSB}:<(H8/~EѸ[^5 ,t&YG+q- 9qÇV=PyAVilGB89V7)Bz`_;:3JԹ]A{]CX{(iAm+l*nQe}8!t t5 J+!SD7f. 2aVwŬXGڌ hIWю|\34֪Ӓ*O'3)Knwaϙ@1q@>UAd_,2FOsyҷe_|F# *4cФ uFu5 ]ƕhj̮uNcTgܝCۻ>Qri e$ٗď7a1=Y,Iq[`1mvdf"|prDp +H*lVpRpyόO6Z"`Sɽ,%:k#ʦ4=z(4l0wQQL7-VKM3rY4gSC,Cq!¦gcbi@2ā#YMB=`_ډ6}drMa 2=-*FwVXb,;2@'9K##$ߚ,5BY[6Wb~R꯵<̾ivu1\y o5=clr(L62G:]")b(3`Pt.eM]+I%k(qq H?uĞe Fx{/#,|B9J{&lsb;űZ:-Zb{S~VŪE F׃PX#U6`j'g?WOm&fql6ͅ S[U^+J$Ac`m$QU *Bù&GyHӍ;#b) UACu*XZJӇ((-pXbx̅2gޚKd;N". <Z +ͯĘarqL &r~H4Hp /Ѩ  3Ɲsb)556Ąm}-^ZenZ'",`p։}0&@,U,X>]|ǔQᴿEJ]is"6!5zxyTv u9,4 >`?4==oZVU%ZhSQEBe6`ՀӮNO6s8gHsTî6._Hg²dRv$vNr4_Ɋ3,6 Br\1*ekeCtjB*_u7α;$KN{ 5j5+N92?Ljwxg~(Q^/R0.7&-`E޲>]c:m0e;T(-WiQ8l* qeyG(G&B~/Uwg}?uP,77;Ȭͬ{D4d<%R7|=vQ\qga 0CjFtJ~*<:* A4`;g(Ǥ 9~o)MB8(EhWB^j'ׂ†:^ yu],-ʄ>c `bU1'[9 9aݓbk0 o8]|t@)C7y;HHa_sO9f'ՏذI@A6bշB9ͻ$mH4IUPlήKxoeI ZZ2]lP;qe-DzM˽~"nP,fvclHj̐@x9Җ%zMr-;uӸeaKҕ=e$6q^ADLѷ|Mn=.^Eg%ݢz Uk7TqkӶQ=BFyZQݰ}H?ӟwV|ہh(}%gT/GeɃ p*)aY%T k*onIeM#;XXWO0VBbEW#/N.A&gA]Ϻ˾dZѸOceVnpn$qe9}w0k7.Uj?DIWe i@5Y:KB^}n;~P[9d8C}5%c(Pmf!c3UƔMJVI}kpoAI}ũ7# CT'mɩxu6YC= [{ؽy;Prtd>ѽF'l}ʣA tSP~{Jpg|6<)bwF;_b_}kt"^imƚ' p]O91hNsHBpX0ܞr]\ͪ-.GQwBD@Ȏ5?g:0?(J = ƃ^xNOOϼg/¸02d$ -~M;9_ 5t V`ٵr,꣱ PxR Ԃ6gV6d@ 8=kvIL_[x }'y! P(2$%l̠u˭S,w" @ID>rޏJvqe8gCbUg:B!hlirĤ>ZS~xYs%ͮN ]UStN<^c}g]reiZfC.Hچt0OGn+cNj#4B{J3͵S~ɝ(|$aP3eņc;^vE=7JfI5&?4"|Δ# !4Jσ׀>q}YB\_5Qj ,#ϒ|%-hwX) _LdOr?u>(Ј:}@&&]Ny3H1(DMеr1Ay4U W)$n\BH6I^tL]o[qsSkсϱhM1K@F"Ҷپ6rt@Xcf fX{^eո2$ɄT,xg\;ܺs!8f} ^ɖQB[D0HƏdʸgn/'i6.j`cھFcOj.E3SU&o.?]+_UE"M;88:3IV(:K-ٓL:XxM&}?ZmWɘt#^8W K)I¬1;bdŒT@ Fǡ[cfd})1VA~\2KJ|qM OsC- !&Tsdc'2} tZP%'O7Ji1&xM{Sm.m7s(][^&TŃh> kLUlMBu˗=vrNI (%g%]mXq{x7+]zUBJW< {]ɕ˞ &Zη4K1~z9藓 xY3|8C*Y#[&L#*1ŧx{u CpPrg`nO{i,! 2lC]6VtIIH#8KjUP_~"@GS c?|Jsᯮ!W=aA U\W`VSv.ՋR @6$VرbWe^Ns{^̶PΏ{mWēE Sa,k7[,b.e*FT&CIr?͗Qna^>"P /Ju 4I흵Yf'] (GZWdߏUfw*R~5V=zXagh N~py!53o1i5E\w ^+ V!/Дc@P^~ *O3r2wύՌ^=KH:LzUuĥ \ '`/6 o%B,4PۗΏv͗q&bnQK9IH0 si *Φu8hlYlV6<圠+sŲkHT8J&l*^3On _'W +,wCO>Eg pV~5ѯl=%aXphn>;(IEZn+к ^xp(<uSZ,"o8<;a(ks$<CO /̢GMܢmo;QȲ]#LK0 yrq(8Jޘծ9^|V7 6 ,4Za]'6y4u6&H,)[[2;)ԛ#ɥ۰+ڬS΂zqtOċm߇̇1d1cmPlmR ֥vKYvOpdXV/J[r\ ¤jn9~bZԸ{E'uSV^q\UxPK;YqX Jʋ5⸢ Z[nCKLV\.%kM.A5E/0p!S% ~ɀY`@X1qaI(n_6G#:]0|`xac[AX"!wԿX YH]@'@y=WҹPfk/ EcI/,jЕ|'$-){)Զʬzx>Z.qp"4IY;ф\Bm"+\-,Xb5!N(A9rE,ؗb5 B:T$;4\]Jz^]C$7h-9G$9 Eâ#]J!UK([A11QG#'|&H&Kz"dΊ!u ~i~&`;%"Dk"4Y 6h}w>F--bMj5.I~ 4y>|}ltUUT4"}Yt4<0u?o|"OOz'@bf!"oLf )qP7en;4~_Vמ1~"w>X*AgǠe%'˚2ܻh!VCL(WDY).uH lhX"ykc\(VoSt}9}OxfE=Nx - mb'i{,.YLٜ9o0|ƜH[LU۝t۪h)z-vy\⼟=ي,h^/_$]3Dk9 շH,VVe) n> ܚkC0xHʬbSR;ՖW-ƒՁ*pܵf8k@5EtNMxm6{jG.+ +>h!φAM(],(Ν^̯ۨof}hťzh"q}NrUw 8Oԏ0?3 ;4@눎0S#Ӛv巃Si 4 'XCa@ P|;`uTԏ.]QT7jcH;,V&B׆}#qe6~MMQVwp\ΩteQ޵7!x yLTj#RRʍ<{C-͎kD\:%y2BF_ShezR_T1PTOgY ˕x> ju`٩ɒi߹Rz\|hWJ^I逊 258;'l($>8l3n2*u#1Y* w~‡M9UW窚e [Yc F!qLh,0\0K"P:b,Mb,d#>P0&ÍYm*SA ,5,'@PaKG%bh<( 6Qt=fz0Vuj0?_wu DSbMMH/A!IS;,_07 H::iQRs5 و7qhS]GM0JNj8ēf".ȥ`ɐHp?w4l\ Ո2*L[,1r2G.)~#H}>ѕT2Hmu8 4Pn=4/ ~-PNb0'"x.ugm*QђG{eF^@6b0 ] !͐@:ȃCՋ}x mO00&UzkG[* JrQ޶"{6) jkE?ҺFR5\Pd&u|L-v&}es! s(%+0;fa۲N@+mxZW?<+=QK&s#avK<>n"# t]Ar+5Ciok+Q &rLe: 20z/ LbLe]Fr dR4M%sI5:apD){{Fk|'6SRq IQ·҄ kdyxN_ HD7W$6*c(C2 1DSnw?(e Ƹճ: >|U).vI>>UIx+3/42D#E2~`ӕo*nڶF9ŧ-0=;Ȳ8G}3Sʻ8~y\*bCaa5U) ֪,OJEhYbQƎ4{^1HݖrS9u-jQUG.TKdYDj1\_Ӂlk+؂Ds8vZGK.l~FCC j5o>1lȉ([M 7G PХ((R=hZ#!<7b§ fߘZm^#2sRWg']lwTe)tO6]ǁ[LkOE\r]" ՍZ@=Be}R. w}KL#eIQumn/,3KϥT=+wN,Cf]aT 9/.y Uȥ,_%݋꾫5g8)3PV!RJƮB&I*K_$`6iʰ\ꔁiK#'B?R<FKqF+Z-tv'J|p<],R`OA~}^ FCPiCP=O>}SԴd{`씅<|^ B! UnEFe%26wg~ؽ~۪HLP⭇;#9P!~ L-}[~cӴқ,S Ng\?@zM8ؽ}$7H@RQ pB誡DA"l_ \Tx";EtR^Fp؍h!]v 쏈}< MZ%=k-8-g&ulW /\΢+7YhKiME U&XV$be$q dY*< U(^}y xs0aΨr B+q1}e +DŽ7QȨ',͓&$J˿;F |?$$Xڂ뜚)(s x;1ow)ur ~s@@s\drmVysBJX7hXLE+LWħ_E nc!% xu"WEq*afZG, Ls($'}-z\zu.+$+0f,z*.}yh F-p}*hgRjx,E4RP/"҈B"[k\cf v5աhVwd煱wﰸ `s5ѶH"CEܺn18184E%HOD=J9Rtb?Q>%!ot]Y˃.ǚ&yTO9a '|_l-ZTB+D/4s$Ņ+xP4"#zpYe3aA?^ Ǭ:协/pfPő<.Z"cG`[K紙ꩈ{dy[lN5kܰ,+j,; q15۠qA1l8`BCO7 0qm]+/@<2q路8.A/vDBH)،E坳ځ *2H鬮~;RtNك`ck8ү8Y㌗:M~C\!܊,f \/:jPpPKR&U>(Hm ˎˮT UxKI|9\AM+d~_ WjCNpw/XX6=rhd7)7th<3ZE 'F0O8^%*&L'󄼢wX\VVrR,8Kz!6@֮:C+8pEU )-A )83SƖ]=+ Os"krcp/ !*AVu{n{Ā3V&0^埰x;.'&!cC1RE%m)]+$2WPxЉ|hr> ioo.6k|eZYQlJ |(3$4H\Pcxm,`^vhqR!t$fY01z)7eѺ0́$4>gѰfBY KNbbg= 5S}(wk0,etgױO ` th1ܦY[RJRDQ,:kޖ(7/ӹ#ƾ YRk\?Mc}ԶZ7`]jƾg ui'<魝xwnL)1);^̥%{^`1+P 7+093!G&$ǁS~O\ H;6n ( 5W.oDw)xYf>r' 0B1n4`/~1ьO0B(9(_,Ug0tD}UEN7WWf9+|(`'VR45Vj%d>Ә 0:YbQh6txNл6l2PGʒB.GܵB <4&Q'L8%km# 95}MSZwq񜞕 YkT˴ bpjS:Uyn#هg>HWfgkB>(o2tH'kaS eîjcI)^i|R7)]Z* 'ʬa˳RwzwJK2\; 6TZE};6 %T*E՝M^|*jhϭRX]0\KT;֯ڍ`b8I2vKܻx@탇/Ik+?$>AUS Om"f6ý0/ajN=<ٱ Z_HԩB&@ޓtl0$!PgAߎseLNe `@_YnNj(vи}`%)r{c%կBJTYcGH8 [޽ $w'bѤ UVX4s"ė*M0w`k #/‚+[{|N4蜜vɒͶT5XOxM,Rcde`L h`N&ZQ1X- V :>,18wD β''o\єH=8԰WDj$`p?`LXIu(j F*RczT"Tx/h.&k\aKTFk˄Um||1ˢdvɭ|YU=4̈́vP_Wn2Ph$ar - 0toK@vJ9SllG4؎h^S 5/ 5:Q`'1'!| +b~ PgvE] 6Ԫ'љ{۠ ̼a*+S*X Y0MJ|"V%ZQݤ vɖƅGHP{aczcYreu WϮ62N]K_aX p|@ ZMx< 內¿AXWG=?hќLH ̣as9: nft 3 ƗލXZR!ٮft a!\}P-#'1L"sz}㙖POz ֆ/( =2aV͗hIԷTgvD`J% ;Ú5S0񎡃Hxf^K$|PcOc]?è7&E l4.&X+(b<7صZ 6znJvVqq)o[4تw#]0 ,PFz%sY1.<@PE#3Nx-`X*)|z|It5OPI%-YK{i,4k^,aA/0жMH^T<n?6!zy8waL_lS,w*BM cPO2[ì0\\{IyM:f!M;LaE{l/Bb8ә P >I,9V <yz|IyyvwD5[ah;\E-ձ^84 ÚlNkwb9b{8!A0Pk(W i&7g49w_o>M)fuE^n#bxT(=P(= AC1(H6Lkw,6PG=U``̸}T Ll]o#!ו5e@4ڽG=0YI_vzQ/3N3]IJӻP*lH_gYN\x?iMN~^* C@wTʕ"`'Hڗ+l *GoҸ}Um5Z@ܕs3*B)޺.zcȫhn- w0&"s[:Qc G1{bW8c^ xN8֨yÑG42m~af_n|fimq{?R3C;^`GhC]f? o~쩃c.߲.ڢ7Vۓr~uUvp}UH/wLIƴ85uYZL_UeܴA~{CPE9gq$=0xo%6 `vw?dfi?]Gz*͙w5|3BVe+ H%Zji`9*(T"=C|Jg6oKȳWf#-ANvNwuTи~u}[PxA∠cKM/2t[rm)BJt\!ܿ`pRՑR*mPb \'~ ¤9cwVGtUmwuc:3APLQ8 cqCn`KF/4kVG`'Úz?p&nD%O --+ H5K@UN b;ez>"f.opfA=.Y*(]DzoSm3_vbwJVgs9zj[ƍ1$&vg(}Z7ruhyg9\jBias܊y jPϹQgdg='YZ̮Z,2:;v3;/R*sWKGڌfX$I2y2|wjSxuv+noQ=|nPʦx3P5 ڢE.O:bl7uҫ_=k,CӾekt+(niug'W,!X1m#':'E8bI-OoU,QnEԜhN2Y݉I[0>gx=XGi\| 'FqMQ-l+E) ¼# ,z]#z#? >y*xxN͊e\-'\\ `T x+(vgS&r3EgpG^&R[lml:[R8͗Sm~^Kjĺ!`|g; i oiNguBIF(. & 3!$d^#}SdP,7 JX{z[$^?~vT$}gG5GI'ce)?ܺ*EVaQ~~6tDfGgVxW/!yȥgqЦ-۬Pq̭;_ 2Z-WUնOny=IciʉY.eՐ˚ּaySTi/9HJ Me[cax~Qe9zJ@CbF݌e`yYDlt%~Zo:(m[l㦄I݄ (6r:Q@6YϢWh=RD{.kh]*IO%w Z,N*NS4\!?GnC:)J <YG>Dv>Ռ6',+3K'=qۍ;d2Dͽk{ 'P 7YS>D'N.%TB4dX]O樣!-?0oc H8 "uI/R-L 9;uٓgNbw>(]yVX}^mޙ"uߙz?%:]ހ`-dke{OezIti hq/u|B"PzCPQt~-X$h$%D^9)rrkyi#>SA S)[EIC~?ko;IuՑ)R,*Y؍,&E+fq£Yg,dGuG37ϸBHdTrMS ىę.g$P~X ;9)VWx{76c\ &0E5吵= Hlȑߍ*Kq =Qw횙 Y*|mŠf-{K |+w%DK9?C~ިRsoP(({ |>-d>l^[ox%`rC[3ޡR$S'8u6ѕQ/)V~:Z4,UXz5WoRcBTst.h<f3Ęci:N XSI?Ȉ35WSDUO|bD'Ֆ'q nKˤOkI9 VN߱8?IZ>(H[R/s g=r[K ;ju.j IodBQrKLeofߝZ͛mh$@hLB7 HHKr+j6p@Eᅣ$EXu,r@o*ش 4#f^lmFڬc7ܱ"~;dPSˢҁ*>7՛*F̢:ifo.x2_q7Jw{;*,p04ec$1fgrιx>=5`$`(Y̠i:Wƽ\8r8v+jZR&xC ?޲~`f4m#jޞTM{{D;٬Մeǚ tUzHEF&ʫ,]F}s#Cxedx[)+kc ֮7) jŧH aV\/Qo^VFM@b~ܻe_hz@@%磸Hc9"N͐{sˊZ#n=ƗRN6_I (Q A`ltgaLF|X9v|Ɨ41$owo0"u4D^w͐8@} xYG;P $W[3b U0n%O,[A{KX'Z]otYkPBY$5iJin; Nxo/n0T g h1qÃN6j7O}ɛ#+-I$şCFnFYc JC*ٵSecHir m fֹ(|zg?ֳIIzS]8#!ٹU_o)nv[b)OH,ZyS죖x)ΪTG 11ީfs˟l 2c$C?4 pQrR"fe?Avm(&J 6@֑4Gb O.1fH\6~M78W MEJyGqr`Hsm >( .'+BW@u,Ÿ&dST2$ zanj<R p)uMӇ4RZE[oKR+v]ԤlP0ѭꦺ;d)Y0rd#W]qG\Xt* w~=qޣ۠MZ><ˀ6P"V?IhVJ"]0!CW5թUY ?㶋Ä廙S9٣*~DYW9Oδ㧝BFN/S`bH)lGk7\Ʃ [q+e Jf^f /'^]&vTfND.(+!Dv^iâ G$g3$8 } 8N ęx|¸+qdA]ZP/8DDIFa6zLM= ne{aMic9NϠ#XUw3jZ#JūԻwg W<&IڟA}^U0ns]0Z-V͇"?RRס}Ƹ 2 !dzZ }hΒK LyvJ[-U1+j*DRIa^@f CRRPuL=3 ksF]XD`b—f`H!mw5vM"^ND/jro\B/{Q oS1筪5 W4n㼂MuƢ[T$WHYǁVMOu/A1 VtTxzd<ˏkHHZ$:b?Z6B|XaxhhHZ<Ϋ$ AҪ4*h ?S-k5W9Ƌ\$Gmv?'6|#nxo8]umU׺xޘreﱭX")Q|jƛtr$8{s oY!j.? ēb\"M~dKcV~;;|iQb73Qǥfa C'; #=Y^9a6<{+(ARKFA%d7͸o8d5eyOVKx?zw]Ud&sX24g h&$?˷_E UVsJ2i<"ȆKxfXwfo,MHp%MعIOsjQkx#fv+3mA>U v83 HCOF9ٿe6[tP[nNU ^}&?c>%Pm`ɺ-Ait>t@x !4g\{D#;gC!*Xbc;<hMxedž߮x~1j<ωѸY%"5PBw%k9PP@Bc@+<},)p^reuW9nk[W(C$ŋ rN6 jhli9~WtqȀƲ`ȃJh 2ps~"A~` y_*qiOn+rK˅O⯈TRx Jg%'`n t&q?w`M RϡaC"d\c*ߙEr0:qc,'2$AgPW[xiuQ!Y,~#7tN@8JT'߈cr| \F*Ø~-{,36#҄4h[ H=>:ޠs6TE0n1mZMk)QMn&n!BmΉS5VT}0XX 'uA<%3 Fƶ뺆pJyF6Ĝz_:]I#5s9nޘ:1N'@=BSP8~i2+iWɂiUcLgChu#: ~gMCQݒoz!/Ǒf vA<uVw:Zjr찀n|;pd~Dp7[Gy)8>(UY-]߇^> T$KecRX-D&U4auTަigYF2d4u Cj!cWnZRPA<_g~4J;=ƣA`=dMH`.[ (~[X_9 #Ke .-Z 2CLB>;EhRwb&|pq_sg:Jsǔx.j! u {z )4QY5y@W%eW7<2 sj: ^ H,ljK)ϬIA-QJI,]dD'ћc{"dCz?%5klq|c}h]ݼ[)(ԕ\%//cp( %6Q77'c("ְ][EU6b+ug%x~ңrdl`l`YDm@,=[dm9"O ~\j䎁FPf\d3-AjT L']};$7Q k&)2s/8KS%8P\ |Я] ᢹb%BF(#uzj*վ{t>=e=,AlΥĽ=)#a ke$jgz%+> ƁIsbPk`]K.VɚΊw*`CNaUuuk߱N/H>j6ZEhAfH.y3*JBu 3T3*o 3!‰7iwۂ~T5!XL sVq}he \ Wü/Zg c p'5n'W4u9b%J}936!Zo;y5o9iM5B[DN#|m8E#a?7|S|a9Yw'"698԰[l.UŁ)fl2TZvKHAԹwv\ӅTOwCçl\i&G 5,jt+RU7KۋMH*կ xZ.fwS]>6 jivbvxGQZSm0qm H1Rf//N=)CIQKRwaAdpSJOU_oP6>=aӄ),ѴR̃I|S1^HǕ =Bﺝ5Q&:W5EݓO@`'{cԫyȲ5l>v4]@ MHgZɓ PUNy "Q41gWcV?ΞC4Z`3h!  m3AFo<`ohwq RꬁD " Jf2oKx-kmQC_ 'uʾM ) naTeRŸCK=.XwRT5x@BRk9I敉B۠b7.8V[tXesvs) S .u$ c;Jxo/0&~&BRۋ 3O'0=_C,𖔎SxZ|Q+ݩO="e@zS4rz\&8â6W7ʘ2+QL]8gڞyr׷E `/MeA8E.,8A=uϵz3j &e@'4M#Z|C+V)+%3COlv& F<)wFrð!"qs G{f! )CH5*dtf(KjVܐw/(P9 f^& 5egE"zIn)pnl(,KYۛB([&oMDg&%BD$xSd\$JŽ9 (ƆsiE/!L}$ThHDx/X/ vcaB > q4`-[NI nx Un u ό "]cc۴ݝ -d'Cm GzϘSQ4KStf[BG8 j_;1v~^%)bI(;C4(\ aliIͳe4u!/ `@5}\@oפC:!cy[Fo$}}6=&iOlrWUgQ&]G9 BDjO!vjclbבV8GHH^材&Q9P_:/d ~֢+@)?cc\pziILy[}>D1 cȢ:SIxlDiavɅm@4۪-'O\v)=3419/s(X-QhNqճN ζoqT]t0j d"o\:<[Qg([" 1o쎱-G͞v?g KH;=lTI 1`q "qAw/yB}Z ~{y/eg,9`GP|vjDփ>2uj/1=b)41Q)[9BI`ĦThJ+t`ÂT70&檭/(LbK3KlO(]g qr+PDj0CStjء,ƽ>_J -K<%\ɎWֿ.G?Y:犤aO57.Sfgыfi9NPI27r/?.6= N;?dQԜjdu,!5|L/$':f loLHUS4@0&M!':%#÷Bd*4> 6[sx=.p@r4EׁhEӎT^o%gQ0 yWq2f7^Y$[Q7JTLt \ Ji*+W.DX8 LffN&ShKnrH(bԥ}[ePl箥c[ra}7'0p(Z2bۥE%(IYbR^م@4xً7PY lvI tL!Z1(tN"Blϕ43V"zaQciVM7<Jw`Zż_AҷkMR`ϊ?!X_g^bM W_Q:Pq#$HQj<2=e/R9Mnǭ2PC$YWSR:8-:2I GUSךMWQ&ݶSgJ-oY])#xKHB2;ͳ Oe9G2%!O6=%bi:^L_%L\̾rRvpԌJ3IktЦ5dr<'zQ?=H(uH~ eJWw&nJO #g._i%ulf#aE|3zPikdUlѷA3ޒܐC(?8d"WIw]PSAv5f^Xv'[ʴK i ?Vi Cf_UE*"ЬOMuH=V&x#o"n4\);o?ۋr8`3F%˗/pp0]q oK帞P`~?>xVWib^ 4S4H] %Qk*xV/19HGs;W(#c3d[a}hSq7@Igr6*6]~حj|dm /<iA]LtDZp`K#mݿ.%$ed5" Ú`,3/{TmMR `$6LҤG2ciYɖ!tA}D^$EE•̉}o!X9$>t\Lh[PBi`#')pQeMnzr Zb-=fۈpäI&cJ&5ox*࣏ԋgBI/G?:B>r+Rg3 bx>1>[vϜͲJ껂R}1 )MߺVqa:~G]mUG8Y#DƼ9&6G@5+,=Cnܔ}w_5vBx6̢Vz{j+ 3ibEĽ#R!Φd/婖v,&] ?o-&IDYj6< ߨ G+}BZh1&kpRr;N WxP!BWF=Hqv24k`>b,$7{fVvӷUTqIz 97h;τo׹=L ?gXΙ.lw8r4 K#ёHÒuVv5*ҪCꩧDͿTX뾔7DIyKi|l6ߝ vwm:h3tW&Sd&t" v]"JEy7B\N`|SYY p$Ma ŶZ $}v=Kq;QRk}[P!g`sZR II&HÖv/|iub*~ TSSgo,5~ᥟ:F>ܤܫ).02wQHbIc~׫E. o{Г wߌw<`oIX7!)}u^J 6㱥;I;AUjEx=mI#Sob@l?Hl93 ±j)Mۡk#יLЍr3Lj,Y;4&[#n{꫾PI!Y`űQBMA ĊFezMHn-|c,^erd8d3TS G*++f>!1+e€iU&zh8l-BbYoʄ*h/ʱ:}kk>I<*.u_^7PN EȄz=Z+J43Jʍ"ф#:iUC 4o$]ˎ(6S~_!!WA5;rV c_}JK5o5&]}JW}9Ē07]/ɬ@[8NfZS97 %/g"Vj\"vڢB@뻠]nyxWBm0Q#mP ; bAkiK<>tLs 8x6#'Xu|T "-%n>/Mt zڻ"@rV$Y1?CCNI8϶G%w#ceQF&eW@FNY*_ 2$eB9qB(9T/!l76_[b>S[c%-V?&2co+-osThD{xP`9qҙ-/k;^?WULޭOc 2u|Rhץ+,{TDu|I>1 @h7hW)ux12XP#jˉ R2V%4\:^f(+y`Ε-*bBz~׎8ؕ$uH»J?0}48I@)^00 B\"JdG?3/bXd^gR@}7w'3!jps g1 M>}! w2N6WQCX\4r\HwhtdMi.:Xi3C ^ i3 Is6zR>xj #{LW_UayODhϹ',Ao%PPRfRE':b-Y:΄#9w2D ͍rhvF#.wQzQH|J9%HW,TX5h;8?7܁v&:r,?GTVx>nfmj$gqW1u:3AԊ;k=?vgd5ʚ|'FIW}sIk>YNU<1O<6|{YU<:WZ=Th rPLdѲn87p5ĕ} G[3(YCȃJԧpbqTFE}\N/x=0̉R3~e\* ]CDo+Sb\E 9_{x4wd"9$t[anmׅ/!س$I@nLP%SlsO$MGwNb`};va ~QgqT[yC+- B[Yz2( H`?6m9eLK\6쵸]?yGpȠCxkV7KW}H;~xsIcJ )EeҖ:ԯ; <_FD98(7 ,l5|!׉j O#. bٮhlT>kM*$ZAsޟ_âz9[|s"$h?'?(ۻ 9"a(P16NBjXd%Clvîjef'zXR,0xxZPDt{?0OĴ)ZIIUFI{7φjD2(zE=_eѨ`2]TFǭK6Ϡ8 IAo71_m&?xpxvˢ?$J%m7l*^ TQ_x_[70\JBliD-ZdDCnG   hh @o ͪA^/UaEuH.2_*{UԷ@fǮhiqevRtk<_ fjdӋw< {"e."Ţar)_16bRե=X%v i1+j7%z_ X)͵Id3 ;.'2 *tr>Kz0XV} pqא9.Xݻmhp} {v&}ѩb;Eȋ}'\jt v8Ή5#*Xlc-qFAmDx\ gCDg+fPaT3 W:,Ojf+?p> ^\"rܖ_M_A3Tc dCozC"w,a@Xr(""iO*;^ = #&ɱK$7&NH'NYڹF' /@8]7I/YƜդ;ZPͮzId#cI9Ѿ~cI6' w93&Ɏ]Y[-&3RiuT+ӵ)@2(]^9~˷MQ/>SE{( ؆f :@a#$ڪ*Y 0,F fUdɇxW<$HNgT w42P$rӊ7}E5!ae~Nܛ-> XZ}>QG-j%+9Kw['E}gJx{i"FCK㵇$?>\,{˰Ddј41?n݄\ȧ,և$"<͘'ԕβۦ=Tg#2Cz8wCDvW5cx*ǀKtpƣr-^Qބ&# e3KK!ЖE'.WgXS' CɑXzag0=IFw,a̰6Ӻ2QieHJ3wB p BRmsЫYD˲`bؓ GXΗwRkaMA|)ͱMzg-8Bnٟ8|;3l<$: y71o;JHEJ ݰ_@V'Q 7⃖:4=!l$s.)XdV:R* 8hrp[ǯ?bGA)D4zAynZ#*sB#w[zoE,ÍR^lON8 nqT/ '(t{ꑣb MƘ 3qi$-#IYycaX12-b9jB.y$ JdxKF/¼.!lZ<{-c|isvN{'\R]g7{Sm/WSdUkʯHѐB%!|h̵?`nXzwNP-Ut^:0p}a bL>|?jJ/͡_}j[ٻM8n 'MQϟۄn>^KLW-F_C!PsPXN *>:5ޕfS5 d0XMpkSɎgJ繿=oϙ[xВvr t7@?O|u/'&Dcq3n%:#節pe^DlVϗOĪv%C] {s!!$ݵOZgG i H"w\I|ҿ1Ճ ž8ctdžrhIǒRǖGQ5#_bM]9+.'#L13"?k.T{̙I/k!z5*Wj[&& 2)feG@9-U$S־qdW9a;R@!Ђ Io] ~)U*kb KZ$ {d!{!lkRY@W\L6!W+  -p`%Swj[y^h\-@;x,bҞځV~+#$6vعh:zj0 Ih"mRgy{e{posq{%0(ݏD5rSpu*h Pʏ1P7;HbBmz=(>=46{cz ;~:}s6<>Tȹ&>ؕh[q}<1˕9GPHot.;aA~0W:ƣ{Cڮ2+E '$\':ĥ}#C|gCRb2"bz$A`3O =ޚjc<+S\f<"C/ƥ~;ids 3EVY QFcǹ8U1 ~0VdD@Jrfh+HN[hiVKi>NR߹-m?}[g]a̧mxg}%<Օh%r08ݻjFF&_Sc~[&vrAYz Y2Ekn8 ߳~T%%:bW˵e'+ }2^#N%X9V2cCRc1(K' C3Oțenv#[>O EAM-BnTY)ojFE4^ JrCT!ۋ0i$(Yv#%n̆a!${H:Q*gxgfjZפEws?I/(_g?Rcp~ k"8FO:Ět`ͼ3uXLW&^ۄ R'N(1ڲPcv\upS#Vc'.P"*$>Z7ѐF]_[4E_}q|]ۆgǐK_g,=͠G\)%:`I6O(l6^ %UAƂ=G|ܢ(ܸ@R M83Yoޣjݡll$&lW&m%Hj bZr:crMpwie"⟠~Or9Bqqu7;7e F?Q$LFʝ1aꀭB7>-Dpp43VH7$?A裪Gw3kpӜ>"%$M.&L mڪvu'p@.HgۨK:uA( MLT {1$=q]> 8H5Lh׾U{ +onZQ !) pj'9}LJ .zo~1 /Яi( ,#(mfmpS{|h;}t˖^E!Dc޵X ]]1;Ho7 ܟ68:$܁ ~l1Ue>rrE#TI. 6g4+s&0 1>xL)#۳} )-x?fQQjZCspceμOm*uJ;IZXȺrc~c{20GJćPAro_PDCԷ"zVLKORY`|ʻ88ZtmҿKL="^:$%P# Eן?zvM8< Ɏh ) |#O]8FqH{9aCrH۳^j:L^6&Ì,lWAsBW L  y,e'?q~+7P GF*4RXL{ҥ1%@|ȧ!(hS[ƏoV;qRt"*jCl 0,~w@IȡpSO-?s^E1;ߐn?NO=iOvH :xg619<D'I\:xG9l=Ajv.L9=z6N2+M b: B1Rp7Bbh*}Wңm.N(v,2aaP+ &XgEAt OPU&d:Qd,?N5wK YwDG6T X{##g)|^!O If});g#*9J@v!NjҗsRlDhޯT799*h.U!|euYĎ`lZ2Z *q x6%!Ҧb a+"~\'tK;_BW4 c aJh.kݬ[sQ6ӄFXq5=sS&*]!=ȌY1D Πʋ69 Uqp>heFY6h0AvUI\[yQ[nլ0: /?_A]W^yi rsQA6J0)iL{q$O%X"Ŵ"IhL7?DV.nCэD H]uPbʋ%΃njvmv%L$).)5QhYâBE[pYBkJFd[?8H)ׄGbD6tek=TmhM]5ȁn*^LC8aqѳ@aXSsVg@\<ȩn@@(%.)ˠa}aZ^[X2[$!Ƭ E:$2hۚ' d~%m98*Bil[يJ& E"zFZ lA'6TF*Y1IW>t/3܃Na*Jʙ %>}8L7PXu$-z[UA-|)x' 4S|U(oqc!Y[DTs,#Q*2>Zl7dBw"S*]ug^(A*ԏJKR6Cwۭ]R(ۖJd2+U*QA!fHLm˝j2~Tyါ,4/>+rhG0 |rUv5ͽf'a $! uX173\s֦ОCU-f`:-}Im?"ŝ^cT&;(n0zۤ cQ0r;' Ɲ `:i#-IU*L~+ac M+-N+)Qp !+f; }eƗwx@ml)fhu gf2ևN<缢GG>a靅<8 g'n*rju˚w07[U~ds <4bgJ~L}爱Ņz2ɢr͟e[!/EFR85pw1Y 14]ݣ<ٍm{ Iv&ֱYq)y"F_-H뺳[5IYWvƵɍڤ:sz7f/6Y%`8VTq 626FI"&rܙ W,LDVN-V[7^?Ľ>bD~y^JYU0BO>akimLXiX-I#A AVŭCťɈK&5;ezcrQ[֫\|U?T0˳ {<`dr8_kMx';kPƜ_L eThv#}wEX[l,i:+Bw%HxnXLh?hX6TVWgੲୗ@]4lO0bv P<5Q$ޙ)C|j0BAfsѨ8U7ӎ]5P9F%L%pBp': 5Q&J֟:?eOdiS _:)yy.aD=X߯-fn)!,PA$#O74)^I,AQ_`JghS$]>,6hҕ%MȞ?|U82_˶[c"R+j˹AzܶUx ^?/GG{ZSWq/3[6AV<{DͻCKK4!ܐnB s93WDu X_jڻ0 v?CA@igc⬟[ۘ}.ȼ?ؘ$نc%p]O;C&6@4$hnEƂ A6ۘCX1#{ս~oCGʕONArlZgd)a:) y{@vVVX&ڻ0k@C+O 68RVO׏_<ȤmuOG5c ˎ:D +d[f򔔻{-<*]IJQ7@t_#po.j¦Q4r4Q#z?0>W|YH rXH W#࿆o2ReK0 9B"|_7ȰQs{Lɨo<;},שH WxM#Rl+آOzl*ⷡi+U)gEqOhq=B4xƼ3L:clӯ1e:QvrCBѯ RBD;L=T G&H:0㫎sjRN W^ETtS55 i .t-0 d´'g] \ G$i21Gaa\JRp.~,ZHjo*p~pkyZ2 (U+#6[ AEr'-34Q #ѯk?3M:0 \_)Jve˝ŸYrnu-%c̵ ğ5wphqӡ\O e{`G(( wAˊ8.IBC6t?VXD6U|=\iJ1Lખ@{V1%PMJ{*{&nLY6û?kW$Nں[Lb'b>1[R8IJ*\'9~d[ICL22C`m?]ypOY@@#ǒWZк u,X/ ji(UTv_3~YSg dD:= %xNTIտq.+dG({` w`DdF-`k@詛I0~i;`'d=q 3ftM67aaAEf|-&(zګd&UbbJ:y9;zGt&SZfo: &#Qb.e>/@# 8W?{ۖ2KY^sl NF뾌D-qZgϕqFM[֗ [9.Τ7#:0=F=oO(]91u`_Gq4\:/c[ sҜI 0^҇ /_ZQ~t2. 4%~C SPР~vS'w=Y N. g6o|=včBCisQR=;eZWV z̸g[[$꣇"?Ds,W*=.1d \!Z4W. ;չ 9B4@lOnIrsY˙`w )sL(}8).^6kA {VgT knZI;䡚VtX@1HU~xCa&gNpM B<-g!446\SM<",b)W7 [ 0r]ɧ>uPB b\+%fW[YҾCIă(='T-{QQHZl.Ck([-)=b*R;ڏKo %}]'[ @1wnw4z9W^Iᆬuh&Cٍ W[,au[~8~ܳxߣbf~G,`H΄T4T?gxBA  EaQC<8ԧ?|s\2N͒DkWi$E. .CDEfli4|uESĢA\QOy)^^Ƣ !AC QDF;(>([6sBD' N X5PN31ЄZ zDJd(ʂ_ItYFu` *v32N'd)F(e;|”ڽTpޅG ajfUgqtO!c`4 "@MnD6>/J%5,@'~3ppZr㦼bBq!E^闫ֿ`ؒ!2rBA=a+aJ@Kyӵ̌r/,k\Y@69P_aqpYкTM(0zJe3|>6]`A Ok̢C1#ϣE {`YȦm 1˨.6Yk?zi4?R eEUt:cFQO=;f(.!R`+=Dn`)}4xe 0pXӊأE|Vngcib :>ĥ]A[QQ[9і;KաQȅ'Տ)@Bu04kzo{Q+ca76em[7^c|ӟ4 џ۝X R 8u78ˈ5<ΐ*E,6 'oL}OdVƜˮ-B qPt6|%)w go&?LR޿u 7-7ߙň2nO'R\JH :מjHd)CiTCNwE6$CoIgd n=cw%!4;}Bs!:i6لI\/Z-?Wkx

%}Jn?!'".RA͸HO_]s M.Ynx9;.e'5cEՀ:×r6Bz`ţ@W";=)rb9_koerbRjwU̡ l|5 dzk]s&f 6q ^w!d\q23( AK71(%DB ,N4ǝ#,~z09'Vxe_}nP,@2/ws`ϞW.=B/9ɥ-U#)m'p޽$ݖgӞiQf_my5VZ)6I1v| cdgWnev }7y7k[~86\,4ƻ&ĄU^oZĨ#}Z@N69Okg(nu=al\cr.Hd[Y?@ /BPzF4jJ+Rʉ{$5£27 bApo(D| Iy[)Kt5gWK\8ߌ3_kEe 7]SHD%E qc,$ f0P_dBST8?60N-sKDeidЫi`ȔRۑQ4&&b!FTp~%s} yZ;ִ)q)Β̻ `)q2G3~~ v'mϥáIPLZ&T:2͍1ǿmY%胡 쑇uBቡF,4~"D]V]W USo#W`ue~3[d-_y33=T|[@(EDx#Ì.Wr^履+BM*HzEq4D~I XR-/qHPj9 FrNVL5j# vrRrũJMd߳Ҫby.%~Lj1cl wI%#dPmB_#^$Lx>߅J ?-U31ݍdg?m3(/WgFO%f=4'ϴ@';i K@XxrZibT؂L~:gTsAr(EXIe,5 7Z|Km]ڮQIA#0ްZ[Qp*B?b"7ia&[']U6(vOx"OB-X?$ɫWUj) KʗAM9,BX5](hBl`X(H' ջnpsadB1hϵRWڿ|ބעoB`+-l,YWY"EkO%_|K1̻D[/fSv҄P g"U^IQ{+PD4DBo>$z7`jZ :`[VІR4ٖHQvNKv:5#+?{D2J,C FQT~ʻf/EU~q [ o`Y`j+@l;-#N!˧mnv{+S\ ·aYDc5E5̗W[wAʰGMV;?I YӮPuLͰc)p0 84=Sadr;W4s(KFbe3a ąXV@ˏ:J'=@*?$Ni.̊ w(lÌGق܎x(ҧeYIgLˤ3xUK*ĵLDZH; _I,dNsufVâ>fgy<)E⸼0[I%L;!<Nui\3 IG+ N:JHsq+ :v\mvΐ3 IE{;w@\Z#jf-([I4п`✨:Jzpo M5S-0)0op{*j#[6(0R1[NYcIKc[{bïÅ;}C%·axkѣLqV fm}þN&/.Pn߆N{ [p qM՛KX?Ċw"5v~[jO ?+-XJ>19hsgYS}{_@€7q= 3|TLEθ\w68U q.c6Yz2#,DCfd3eaeEIphOߊխqF+2B7S%G J ^/z{\)wWyj([3`z'X ShJpVqsзr/Pf^U&cFbZ8pkc7 X8:EA0LU `7m?'_#uhtU4'&ֽo^rLU L+\8M}imTNTv —%?w"nY,f8"ɉPD4+YWx7oWDټ?K fрeYh"1~ad\TA+ 445M2_E@هfdj Bs&9qO7 rB%|F 223X=:e ,pɠ+dy?_2֟#(yf})ŌAR+EYi^oV8{cYJb!L{ʔMzno,:=4' S|Ysm #o J澱+-2! !oǁEіL{xbuL1_LY~;g@fkZlB$X|/ `(|P>ĞYw .犚_yW=l1\'T,K|gg]]:^ ΪKv8;dֹym~q%Mh}OAZA37lUnupB< =Lx 9tSMa׋A0GS o{l@JJMp XQ *MɗuET:~!rlk 6fX+WPq4EyIM[G٧D2\*Z`˗ !gh:yPu"d45_읛SUE=O$ U.Ĥ@㚤IItlbp[B:=IOHv, v@׌ )S,$#iu"#g8񔹴<݄q¨TNa\]N_FTN8lo.z'4(SV\8,@t =^;!,j9/q[<$;`qGM,KY,n5Hlt !78N \# 3Zm{a4S‘+w:XtlR m9g)'$s-Y?ƹEǡ% dk @ Vֈ;X>7G5e #u5}WC #\jKhմX1nuwܔ&H..vbwϋ hd_JI@g62-opDSzp`ӡjsZK|.Ckfތfh\+陑PVc_gPL1rB=1dJ!2AHtv%mVnN]B{bKC9 10: *CG[LcR/sI/ ^=@ ۖ_B{Т Yٲ-84U:C~eчZۚ-}JJmӻW?!&%5)o>U; 7Ԝ!Rޙ,gH|lW2ysA39[2Zx:^j~O55w tcWDB%CS鶰Mp $. 9sVTzq@i/032a_ʳӘTٮCF\Q=WZ '"%-0&)pw/%WAoEkUQDOgTF//yA@70nތ@vE_q2X&ۭ=m Mʏһsb!17JTdr rSrX[\AZ?[kAB*VϘY}KHǎ+NkhX9Yz%QpH}3T?a&"^oGYrM,V7rn M_ީHα{/n盧yhD}N:t9^&/lL)wˏ_0Skvtފ~FSd &4`*Hz;zUͣP',f}_q@b u+,_sLM:t%' ۱GOD(?7*sS d B'U})lC@߸i>*Ƙwx{@%襶4$w+Pm:0n~=3|*Z}V‚<4q 7pҒ>~r_ТA.1% ~ 2Bv^8W+:D#8e/9P`a3fgy0xnᅀ.0&N `R{2z X ScSfΚݴ3' u&1Fh]A݅&!雙u)P?aqҭ!Vۤk2{9h%X4\ rLN{ݚOrG|A&jR`c7F:!5Mɟ%hX-%pw3`?.Ng699ϛsb^Ĩӣ7)a'+ٮWFtQn'5˫c75LS], Q);]Lq]Sf309F 75eS Pęeaս1󢅝51QR4rol;om58hh Xh3Kׯ%OvB wffX&8[=jzp|K2`%*3U(oEEP\B(`ޥ HcΦטo |P=n=x0(dQtHQr M![IpVlN"^3 `=t2:1џ=[j􅠩u@m #5ZkMڤ}sӈ9tij/V'+@+_Qg5q`ÆS7&% R䡳ߡUs]~-[!Q8mxt60R%B7#47nh9[bȷj(L"˔4]f͓Pgkꔗ ]%ZmjDwJAci+N\Hv!LV;HMbܑ޻>].4G-jۄ7GOcFKZ&5]9L#dmp{!{iYf, nˣsc; 0taZVQ8`M$6͘_{| m8õ.te4cX<ײ I1_ዎ E04t\up]!-PϤL^v74y2++u!;؇ {w9W7":lưR«]L.xV` v4S$9W\Vv98$ W nWMXkHJ_E0^f'2pn$1,JxpK 9ixw3g3V &K5ۈ!MɥoGeA2j-Krk)Z-.=Hr LOz X_I>&3@ ̹Ö'> 'VkZ4hDW/D#xF18L'r plYG ~4/jMlfծK0(y6;X,XUecyvIxzϯ0HKH0H+wW8o k@GS򹨼hu@tֶu3c?᎐lFo/~Tg=~p*[ۏȨpÂ:;[Je[ [|HAԙ$׼i4\{4+Xg$~b(ytMdc '=t3~R-X[_w/ S<\*ۛF{eOVv]E eU__l N'2 Q#43@dߟ,O.hqh'ns ~%. 7wᨃٌ[HlfdVF@)lxt+n7z_|Eٮ~{p W8P?~b{hy8q [pJ㫖Jz'ʼBbsǫ&v6O5v}Q9N2.kkט5'ܿW'`"ê+kt'ѼrSzM/ɑY_SWqPF!y y1A$ls9}Ajp #&jDh y;9)s<@ %%I4(R.zу!.if(QytxvSfj5ȫCa5-{|FQPsLsдH976.E)Y,ϒ엣Rab[5Y\`ɻ{O7/qnnn9=M_XR'᷊k uI7xnI1쟀KXG}la2p5_^Ktfgoh7twQvSU#eSq!VDd2Rpd+om$ֲ >- _m]ʚOH> ja)"}6Ji-8^`ö#S˥q{>P?]>FT)i[Lh} 4W G7oGݴMY0TB[\)Fc~NR5.`'%lx/NDfp/,;k&%׷H  8qZjnυ!Z`ZyW}A;Ue:vR,]- \iUr*6!y⫊4"xCfލh(PޕbrEE1휧BQ1i3eB)Br$xx n1*$ Kvh]tτ(s&x0$FunY(ZEFzlU4E~77b0[0og eK{QZV95cEαH➖Q+۹rGNBX>4@O1;fs.%mkgTq:,Y=nv4 t88_Ib7T [@ɪkDS"(cvk8`AU Zر $QP\4[9ұ̥)=',5Ci_Έ`U(^8'جe7m%W,MMG 6(݊_fU^rpP?. CExaO.42 t>vITڵAAF=^|3U;0 n}(z~G b+x4ZڛaUG0(Dt@A_8Z{XKB'} pat3xDGlGCpHy4 | k&![+N_J99g`*qK٧ES@ fB&~6=uR*clX1?7]<={њ@Q_i٪pIE#^lB[v@"^F?\wDӨ?R6 O.O;3ixtoobYVCuşF: FrNoץQژ8 q6Ŧ~KݨA:ƒrB|kcBxhh9jw赝w )Ll)&߻N^"AI&S=-};řHR9L7Yזȍ¦Xyy;CK@i Nb1QQ'PgoU{?Pac K:).Js|N#5W >@ղM-k1i-o Yu0E,eYXm ԣ~ !3 CFCŦŬqJ(b$6ɩ@@7 ݆s*-'[s\KT}5eؓH2Np  ZađbH'q9v̞-z^KVYH9sʏ4h Ei TdԼ!ݖo!#@{H4FB>[@4\ ǜ8Gj> BDi}Y9 %Xgkzp߁yOeˆ?ƖӬC3:EC{ GV>TR!)RX Xb2ē*nJw tOdS[t͜%8,PhDmBTȕSMjtEȫY|F̥-S-7E4-CO FWE lj$NT ǟ)+4Lgu[yq4h=ak7SZ,:mhaAh4$A$qsiM䣝rsbz)2Y>ە#r CnV@@ĴWtaI2ǿ^ uB5T2 NCF3'ͰlÉg-&Ř;@`jZI2~#*%k^@~V¦ FĞ(9-(XO#;4}d=qz?ISm:뱟c*7Vb"ԶMF3,L'Ϳ5ؼU|."9§u4UqWPUkYM {jKJesncI5"iVJWo lBgkL'rZ LO.P^R h̻0[ ,vv|?˘PRj) o)v*x`!#MQ -[:YS_nXbrJgkݫ@i۬\t7JTfmGs MUQ rn/3WAi5;6GCs;B&K|/R{;`0U}NakcQndU RqC+<lI}lY>BXz'+a}&mo|d=r8NəvGё}UV)2&"kMO#2H!Ke<v9@z7Uk): [$qUUg2:>وq/ALzєv@~07% ҡxYiOy}/әM[3GlxRo1v}MFT$,j1E[Q`DdU*eA|K/f_%ة]l:F-okJC\3$;^wDp*-|Tͨ .>)S(yP?CClx $AV2ׁawv?EM4){0Y9&L3YO d#[9jwI&;Ot0ox*Yу=ScifcqZHaU[dv9+=^n~ /k /3'>hl ~l^mw6~ZPKDډMXNF j:9k2uddA@&Z‡= ;dI6-zזwu]-~vĦ2 PubiTNقY} ԚsNRd ţӹW4M @*~^[)]3h)*vWF$8ߤRFcvL[1 %HBuV g3*07oN~I ] ; wCn /+!O kIHlF)9pn>; vqk5 I+q—!RJ'SR\Vձbs:^JMw{^t6iQZIuX+R!XK8{Hjxr)8#N"mV &*:d@A2ob*ԻJE lnw푃^ʁfy62E9L h3)UD4W:43PBoN4KKǍq $ ct/V(_eBHn n^"k ۷є4Fly׷%܂hxu7w4^%͢jr]YS[?̮`ZD`tvNx'-Q+Vmj7)V_֟VCn/ T"B.?MLT$i'!Yh.t?] zUy-58l.i|ME+<92u@dzWg]F<ر؄|-G0 E<] o(3;A .D eJg!yՇ EP,]F#Hhat9/# c?Ww cD3 Y?!M[~8,ch+ .}BGO ]P_{E0BIT^;~ VIG :9]˳w,OC@]h *Ar/;(Oa@J‰U3}*wpa6QV&۫0I2"fUo ]MJ# Jj$u4Uz,1ϲm5a;T+!@yd:,`2BW@SoZ3h_#@~k9)TRJһ/lR=WJYU4C{LI;ZQvh=AZgcBd~ _XxF4gM;fgq2)?6%}v(*.Cw3-e`xެ"@Hjp:SY߰tb-$>83֔ cIe%][]7*k8U_Xj9FxaGL9Bs1,bZ6^ƕVhM2bOr5حV D|g_ +ڽL9^CQtIhdȋV^@|`H@R(D&2I!cR ;O1^y킴b!qIԙR';k*-6Zä \AuXBo1Ϣ&Pi78my,, (XwxKKVhOu]:} hjK:)j԰!6}׍1/x) kB=A5GAEdz)aݸ8`[ zPQJvRo&C{rVpQ+țFjC%һp[9,f D)f{M$jKUJ@[ U= S؈DG9AUQXA䦙&xf rWT7wԿjI=V6o_?Fsi q s_ڴ-"ОMM™/,EJ YGU8OyEez)ø*v%h@pN6}^2zpn%EA"? :/g8P0MS W_q/PkPvfullCMJϔ`E[W42*"1<JcJBFf(T{?6;q7ZeFbQX0MLᚬ)8D oDwR'lvw9Z= HYcz{'f}ݬ(gy$0 i6t%߹An pBa@Skao[=A64vZ=ur4mz~WzmaJ]t%?}hPdw(0˻9M{',ڝn%$yĬʔ(Dz·1J@|a; ܴϰX[@ 2~tUaͬ@S|%&dyVTTtx-B͡Smg; zžWu^w|~^W#mpxwPM0OYj;w-52^LiL{n\ *6\"(Wmj!Sz IIЈmֆd?Ltܯ =)~Wx{d(?7vҩDKlkP' )t1B01LFߦřjt$FnY4tѐp>8HÎs+BP#Sj?6$'y&MtK)k rUuw:[Yl.#nE,^D {cxȗ&*%7e_99كAA2U:Vv_e IrJeF3PB.H|zʔo!}a H`:Ҥz Aiڳ36E?3uSĪ oqWcm_Ͽ}kD<5>K_fYos4:78ۀEQѹyj$wtXk~g,ͽCc6t qyӗmj5Xx޽DC N;yJJ=#/:Q"ٴ۵eF(+W8ή8a,R%I!lv:%Zl8Q(h:Jl=DY<0# %bދ<+OS9  pg%{p9o?CIS4疟K n{WrqMlfN&E4~0FXӜuA '{/<^;PZpxBQ=;{FɈo (Dq0mey1Õ|qA_(H{ V-G>:&]ڐc5Wfc^?$a~qHR;pZb0~VI81@>A]Y knZH3 ^OVD޾8M 6Ce7ЂC,Ph֋G1uk0_ײd &8b{O!wnw^_C4 I1?hr6Xh?-,xti϶, (tOHɎ;D.a.7c[#pfY̸q+Nj ^胜Ȥeh1mz&a-FLQ>PR0vOXE'# YdtV؄B"=Nd}14 6+_ M1 <:} JrcoOG3Fx^+m{Go_@zxQD\t p˕ Җީyl -^> 3px=fKEǁ#y~4x$ k2ZXW TcH4pZIwa=8?ԜoIH8rQI# nvF7iFV{l0qr "Ae-Pͩ.O$պLZ]vzE>StG+8ߐD}~Z(T/#4}~.KN_蔓j2P#99&}WY vs-E^->:u+ĘPj&2ёupAZ7t nb ~ #m~z1pK smYIgUЯ-\fފq UJ,8cFBú='2^cgY_ b<%QVV&~ޝb]F8]1k^=m =„WLZwS =t]Ít<+NIVt'PCuG5ߗ2kr/u$uMZOwr13 ($LKAy#9 GKuoVM㝃 Z.DU$ 9rM ۨZ̒\:`5G|=6N(<}G+3h:h,MR]3/@'%\C0; &E'gO,EKo74X8蚃3 XsbRn@_hRXEjMkF}T@nP{r@~^c.36M/eI?t,InTq ˛y iwn5.gmHvo! Ic1œQ#KFI}gjSS0M{_;kp@ efjP,y*2[C]X {PZ䑣qbNʝ3V]F5"&zSJlr|3,@: J7";@6P^?"J$ _pT2". [B^|b$0nW! )m S3?O'a|Ua-;3%#Zw9N;ЁTo5Gz0Xci8NƷ?YoNSޕf3 ԲqͷvWa4p'H lexoo EVvEmQ>oT żDt?BbWz#*a}.5a4@f&6ȫiڶWihP"0E̔+ :j MTp5IDFR㊂1%nt7ۧ"fH#_G=-磒d5r[j`5nհ &T+k3&2dT!}C|1I)u҅`|ߚܭO^4\1K鹃fѫ|/}6O;In6N;C1 GT|`y$Åasd OUI48qu@.ME[O_"8Rdy#yTiׂQmWRPT${57m#Pl~0DqFh9-oӖv  ڊY;3߿nzbV> lk*t;!riܞTѤXɨ"{2цnk4Xr[ȵ6Qn5~jToxBU`r_wk31AuEPQbB/BZ]+@s1|zX^9/Jdh̗Hej6NURa1iԴ-㸮oRRx7),Cq_46⫟B9'Q:Ѭ#c$Y!='?+´~b.tRt^G 0U6$v) ꕲ?$h$dfr8rkdس *7 _ $_7UBZ \ʌ65 n۪(|NW{Y -( e_%a_}SR@iAYm@ea~[(BspGs%|0#N4{r8E({e,H Ɓл/,, k7Xe./6%i\6,63p*C}A3"XG:5Ͻ[+ .Oj PxE~"#"+İH0EPV@,8Ubk0FUƭrl.nr$:^hZ64e_V XEKob6)tF6oAӼvnq 9Vw=_o bה)u݆ʩ 5YptAqBXndH7*3,H,tKXoͲ͢#ކkɲa;iZC~Y@޼ͽ xh]uufOBYhj6FXP­Cb ~2cbXBpflA=[ϲ1B| jQ7/SYIgE#"l$W8ջEnT@0fXHP8|45J&Z,0dlHߢAr{齡͊?+j{B2PX brbl}eʁ֫Ց6XXͅT3OH.v=_;k ,`EU)&p$o\tn"Ң 1EH4FFDݛy K[/|[F@ n-kaR'rT0YAfɑF%4!)`Z"֕Gh4V{ gNaM*!̠;HH!L%ͣSbְҿKےeKHugfl=K8MJScDZK&ug֜}BU7,7 itqzx+{ha^.rv}ɶJ4qT{BЁJUW뮶,TRxmTXDjme^vn䇑 9FtD ?Ī DCl"/`q\_Ӝ0'Wآq2NR Nǎ]N݁': =R^$l(/Vy^0:{'o}b 7~ ]NYzv/#)$OXViNoV *9k*wMCsN%4lAќ{#KG&(yearΗ|+mm@Z/ȫ@dG! /D=F:ՄhsNʘfDY쪃Ks&h|u~1z' ]Sզ&b ;a+N6*y0ьK$MqȌMU1 CUBЃ zjzɏf`㐢^V8LB0!3[Wo/Yr`a4ةz08qqu w}Gio:yvVYjHLע&FupCֳq[Wu=(O U c8{Ғ6o@Pő,Mno|,Ϡ^/v xC8U 6fI(8;fJ ag _{ওW~3:ʂd웽{ewJ;%|bG%o /ӗ? ].&(3܉]0 M ;b<7w#KPE hQfABx%nq3=$r ΢E[AߢRU}ҹYÂ5dY ě;8.'^*X.~N)"%:y풮J^ПElAZWW;tFsJ{u"˧CS:Τo Ou?}ހ VXB< >yO9L0`GAY\C7LmVf=Lc.rCXAz632UMh7û;;6 ,Q}|XxP;H]hJ ?sS ! +v nhCmi٘fx>[Ҡr, t!ׯiz3 I,а/AKe󲅑hF5L#pICxŽxDwǰGΛc&5 T"ù~ۊL!b2G^ d {A?ՎH0Z %̅:.7 cz$ۥ;!#G;9lz6\+_6UdI?Lx$wz™X(8ĠDoGYDu,9Tb6[$CP8.=!.zƸCho`$TO2{fnVtzp ?<0%z;߾hr.T¢W$CBt]ps}{@$|3O"/?`ekA{-x07Hk#rpx/'c2)ɹ&p8R qN26hm~ cNU%|MJ. E[_SV{VgZҔlRn.{eؾڽhE yG'&|\ 8w"iQ+uÏA{cfy o'>9]#[ YA<^/}"BKow^eOZeBvjwF8DȊ~Nk⢭FhR܄X1UvJT;FNm͢g棝롙g~Jͬ)a#¦4@[k?,#'7;ĄS`r2n:ƸIJГ^&n-M~w"A)yc| Rᕻ ^EAJaVt]ׄgdv `&:rT*ِGGxe}=q_ہ5 q\J54XM]'Be4@Pʣd3%50AR%$-">fb|N+g1In ;f#$Y{`V۔9r2 /evN+ak,Z,ė`6Mtۮ{cbl;ߔ|p٧@M#$lCuʈj|Oz9WgMC5 \/"Y&܀=6affkmٌ?7.=WIT :,Y[% +DU# -0SC{]xJ>[xe)V&9r>U^4{LF5r'Ύym]q퐜:O?%-Ck?6ėmhk_+F E%f=7D۞rl:LuU9fyw}€*)rL?~;ݯXA {VB|S( fP(>ckg* b;S_яBA7 \H'_%E)~Zm◀<◵p;Z5+FVi(nI5ʄ'YH)0cy;3-Oz(س8]@g=P6:]Zk}sz,Ƙ*㵀NGۺG愄>I:3h_X΀8ѷ.t˽222̶DO Z[Cy }J4L{W"hO#|Y:VCfjp9)&Y9aHU ¢ű(n<15WmΣ3F .9\܁Wl>=S#-wvk^yu8k8[X?cW'"/jFe-xXh}^:p^W~Ć+Kb>]UB׶@0%Ƨ )A㭯זG\g#ɏ:R5q`%h W.8Q5{+@A8T7"1}~ma & ݆ P\ )6 b'$dz)*؝[K>5N#q-t+Puu}eS pbQ"`>EҲ^{_A;3 ';>%*}< dI"½*x(R WS.oaAݺ> Mn;+Skk0aw#0 uP;ԅhiA=kQ~ H0{"/ Ok' 1<;p?(4y,~4~hù GGW_Aws@BjX pom0'(y@:mu匥%<*^.I_*Tu-]uvKr_k_phl)@iJ͇ oТ?x(:g50fWF>@XH-񵖘zѡ'(Ҟ|Ɩl=F-bג2!= /ymQ> G9=-R& uc],Œ)C4mEa=IK ҥY;zrFd=㌌U8;B!cr@݀PLӛȸFȳ!T;}̓3F7ⳡ!x!BZjZ#-YTx#+5qښ{RjHZ}fb^U:mk`e#{ P_LK5'm@D cpUz@:+{c`$Lۛtx~{޽h.gtF8@ -@ݼ -EhЅl:b$K \0E{ +0 >FB,]c):!FT_0cUI]Aջ\CÂ4ٖ^+ꀋC199x\[*?ݐa|NTQxd%hV]z [ >]A~ovԓǠd@4 RZziYlX*M*ʁ*Ŋ,n赭1< 7^^g' }Zԝg#B<"< gq(ZAWVTllQHP]in/$) e$R&Eahe s/^2? xvqL?6L7C`R^n Z5mO!oAV7 8r>v"v/|oritv<1}%2P ;;|*/t5$3[?1a;،i!EL wܐUb":v]ør:oMր \L^ݿF2 bzx2yxg{mS.p_#ҼͿZq|GC&[OHQ0^5)*سd1|Pv+.9nI.ɅauKlذ^/ tJDE鶤tޑ<qԁ12H96jh dlQvt $dW/r W{Ŧ:X<0x,>7Pv3!u|ɣJ5WbӎPq#b 픏uV+=b;r ZM6/1a"r-Y][6yj S~`( '؂+DN VQя>=h@.`o"tAtupfDb SI$gHǂ!,@ 3 8zg䑨ah6h.@csxog_η$&9XC<z.`>zmiFfO{X59=J;lsDsŅu[l֩\"m鞯KX@,V[)|>W2fEt'j#++gP|Wk% y9TnY_ujR4qZ3"~O펓ҰB]ޖ?~48rǂmR>G }2|Xr@N;Mlqc8(ȲDrIJ>; s4FmɀݣxPș^1ceYv<9 jC~+/WEeva6#t4MLzYX'kU(a;Hu}gY7G:}Z߾i2K0ܓ מM1̈́iZfK+\4])Z Y;ƒ]#Pe6<3wrmo倜i=a:6` xdAlrJ$$HyΐltgG Nyխ+KT@Tj*oqM_Jo98?83DA87<;NJ R9؜akp;KXZȊ+&h+WrRkn"zB°]$_'NbC HUyVuVR[*dlRdܬRr/FE$w9nOm^;,W+}S4X'w}N y Ɔx^kDpsi a>6vW3c[mZlqFmÄ m郱!pڙ "b[V(' &?һ?{txc,&Ϳ7 7b7}z/UKK!T) /" C3#WGbN'D=+E"{V I۫Lᨶ_@.kjc&$n-S1g&o_sɾ;'(э?6=.ˢb8Tg~rd0,~K/;/JfbL嬭/[lBQh9ɓuEs}UyݷEiiv լUh? TSU\/K|pE &Ȣ?0E.Q_0*RtIEٹ@5K565рȬ2jZVigA=߁4wcG TE(޷]Ƃ(]OZ ~͌)"WK bKU47VpW&gd_+ȟTf_s@_jSt!eXe< ںA%rC[A6§&T>nwXu1ddMS 8}˷`2+ﴴ00% ".w%1*$LP=̀i!sa5`] ,XWwQv'w}H*L6<]fRfN^La=qYRJWIEӝ XCuUwq-擻: 6xDY>2s';c MG6P9tILPj;wv!zי/Ď.ajRVL"'$Շ.N܆.C)b'S^>XRvtr۾釐gސ _9145m3*%[ϖW{h= и1pصsm(yϳ^"ݥޞ(ZhN7~Db`Ցa-7$CM7ezWѣ!/w:͍ nYO!8"FbGY5ݲ>8𨪽*Q^<@@ u"u&y5mA=DxHYKjQlwwsTEAFyi&|hP&e-< nPe(]b& %R6> EarU]NRt8x _p!8ľے7nDƫhAZFJw~'vU[)+Qyp %Zr4ſ0Q Co ' M-CY/ҭhܥΆi%s`To$ЩA3L>dW‡ع!{xz:sՆ1FM0 ԋ|ot𣏕Q4ձsR8L*u g!RNL+M/[A!yvqm8b[ ssXjZٹ`M=wZ\^ӨI.WG졙0!Q.򕋯u+_yx=4V85 K]"~&Njoݤ(=ŭvJJr=WdU8o)BY #ڧݹ{|{ 'wvW}c&=i U9LS` >37^$yWL "k` ~/S挤5]rM@Ȧa?PgZ?ASX[m~Sז/xAe9@JX*' ]QLMA%6BIZ)їo aAEb:7ɞ/*bER_cDpUNa!;Vt~IKoƫT,sPs;cZn]nt=<){Te 'U$DMЈm>0]pMsUI1?z%wx[OkKΩ&coҋ]8è 6~ 9Nra5ץXi_TAa ݱiaL8WnI5 ZZz 'Sa敢-)/(MQbt_8}es] θxE|ubI#)/N6G\$C#U:w׭Awm GaYV]~#p0[e9ozHZqV zMrJ}RU!1K[SE0 }› نCӗ9ʋ}ӚP5kצ,lLwI0Knhpg >q]kSmM)sҍa?W`8dKV$b<*DAL Vb&gg ւ4&Q- 쪻^y_0Ɏ J].Wݪl=ѱE%9jY(8t%Vfj& iҁmӿF0=A!Zl޵49g26U&i/vO25*↊2Ad8D`68d^@Al.J}^41?"$T[w̝6vWb7oU醀ۺaED/)SBu@#]sXA 'Hc^!ysJ6P;XI;dABZA~1{Z~C-Q-,@G[%R3O &ƶɝp$ij!['`/XBU&{bN שB5^iq2] NPn?eG 24b|kAH %d:AfuV@-dmbG,~kpldvbyPt E 6o嶧@Ϩt1=6 d_u pR2=BtȶKsod됔39(uÒ8-Z{@ZL=j8no]jfkWF%dNWH9l%2^˳m ףGU!XjY@iUQ\4X LNz4iϓ!!vXsԥ50@B? ;Ztx+^$d1 >("8To{wrpl5WF͐gu]~2ON,6~b*5@z,ޝ؍K|#ᇣ  TMU$A]G3M]wɐYfo$E<\u 5T3XUK^ZS Oո)2({`4ݙbu w87Sx@c6  f,q_ɘі*4u]pQ6[3^BgAsP8D~KozO:|T=Pi+@fdɝܿͰI35*BN$߂S隣5>̵̍+v#Z##q٫bh+ ]B{4}㭿*ܸ)^^Ĩ_1YnCgowOPnxp.aZf%x dtFV >wX(ԧ8tH@ڧ-Ԇ@fPNvgfh?=wԪ^LH*T !)tp>5(h7MDwQwFޠaU3?jv7ә*A6Nf?Ьā~OMWf5F#\89_,IRppݷd;]/ҟ5܆ $箁C7H6'X$;60;\ꓫh+WԫITi ) wTvVk@yIn_] ^nEER-^aYט+5kB)]9V@M~NoA)`|cq MOozh&ҿViq.yMIߦ75&[{|};P7J /i9g8C(bZ9mkYkZéifi,nu3QL#9JdKۇa }߂ 'rDܑRYgtcaCO-KT"'b V"KrZ~YV!ШzJ)7f.{x *v]] . ԊwQc@Dx#dnMq^fQ閏μGDDsWB[{uUq}KWMtL{siW{{daI-pK7fH8\C!EFoToG` 5SÂm(}{/8#C)3Ak>weבwt$d YDRHx̮&E9M ]LqĄ}:-(fɅQst!&HeN[Pw zū-M[]ø77D }}" 4lQR9g8jt}Yu]{1[MBr$lڀy;ګm<2sip붥m[ ^Ŏ#6+ B^=-‰j&R٣&Ns';k0oQY><2!ˌ)xVL26fWR&{#^"xt6p=$-!9ΜKƨI`OOk<Z-]5/QCTul/X@3acN7s 6}df칞0p'*ʌeY a}NsZ!8-"'-+f?"'r S}\CFiԯ$;-NZ1b{Otg-4zMtF'Hw ,V"QIC)]h/DSqq'| -ҎBkky \c[T62`3h$:uKQL# (̉Y-kød{Ipx_XNr2㖳ÖM~#RYEzjԪM9m5H{]9, dfnCGe} 1Tg 2 JNz%~ݙeX?5ξʋO[]yp<f%-eINc\AV7$]$AI<||\'XBizWCJTDk0]sjߡW!t X x4zAc)ݥp'<\Lg\s)5j]CE dmㅌ'#krdyFSbf:bԋ1v=2GضK/OG:smTk(4]O5=O%k4>_-1X.TWg+$=+sFpN6JNfɛA2cq ,-* V+y}'Fm&$ VޏtXĄQ+ ':x f|#ĵ7q~kba2~Zۖ4C.z˫{:'Jz0)R @E 7s~jO]ZЌF5^nػ)g9=Q5KɁϔHE BYQ(R -;a=?'bբS)c w>8řy]o:O(,ptjL/FZ}o2߀F5"7[kgigUb]y`4kQ d%>-q9vn~q vmsȏ|y)[͆3hP bm y[o7`'~]2fuK凵J)CHqS4Wmhޱ:9(۹⛶ ƞpn#Rd.gvpPVqpq(sTJTrZRD(#=qًTp|aZժ"ᙿ\k؟1eհ7,+pRD1nmhGV:VFEVq7]g+XھP2 =Hli|3 |eN^#p`־dšjNm(l#a$|+Q7RTV _~k +U 4&kX8-ƿTcM@HێR0#TAD?hG`dYljd } }ꘈrSGcߚ29CV  9SI$=iF }SuU<󭟶i~=+lu]9R7:&xG+v1ERAp",s:q?QcP"=, ioxS<0$ 8H~䥟R.6b$:`T˻NYƠG(&Z"kYs!˅%3OR ťDOۅ\S&J!'{Ir8pXZy:fgG llk$à_y Q5DDMic(@ ꟢fz㋃j e)7o埰V.)|.'0l0*wGQ !|RP"L[$:F\;n4ΌxUU?.M~.DZ4ڬ.!C[wsg@z< ~y]KQ㮝Y=1!-W+I`KYi5 R~ХA}AD T̨^$any4>z"Shf{zD]QueTJ$ʪE " PYb?>F"wi.K,'̰&Q5 hN&KvC%l@|zֿ`x>` ߏ\r #8l^9^yk.kJ߶êbS0bT0,gY.#!\O>%*k] L%wI-LmxB][ Er4|udKznuUjzxf4jIzZ6YbTܵ6qI+HyTȟ\+(~X:tSj-z9x{cWQ BGv W{߉5FIe~W(ƺ&b4x26dtܶqץ^( [T+Le^@V"W nbcu1E(F$ߊ~|103`)-# Bwj7taL+in0iG"Fc6kͿMO8tA?C릔tq6Ycj%T:dbuA>,hcҭPj=\l nGƀI2&~H V>E* v4[f0r3y㧓/ݺ+@N(8,>r@ k~cA :'kjb,yA"X5J=$:/5+B'lL0 ~IH|\_]yȟ(^:Ög(Z>y׳5JDMcyd%Sov1a􍒞Uq BNf'򈱪qo4 7`iExK-7H=&eЀ" x Ϟ јm/nƠۜ7?ՎBQlKۻwf4Rl~fJ*9( "?y]Q1`& f䎪BTWjq;߰ԥ\{J+k!K/%<)wFږ-"Y%mem0 >wDNK2oTD Q GID {EKs`XdU&1ٶngmA-vI 6K@SwM[kM"oavZ"YW\j;2UGb9yfqy}:Iu۩]9}侮3e />I +U%_Y8[},U鸆E+2_!G|iZ?̹ԧoHo穧<ނDUiWy!('(qX4$=%9r@HTꇯLѵtx1B!&<)QKEeH(.ݤM;vެ0O'- }[lG_Q[PZz!$lKRgApiRo'/!IY\xfG&V ;(d!*wMB!1"gm%Q wۗ ^AVt0*G8#< \ۿz&o-Z-BǸaxU9 mdԵvl ~|="Aȳ)L+XH&[bbJyJh C^> Kf*)՘nU8@rO…y Qd0*t >?Ԙ8IywOŞ [ w-T!SyTQ(HkȧyEqc1#c.Y]XYp /hë5>v\۞>ѫWju*.drWSms"z \_QlC9T4:c盀 m1ֱpop^{ aōRSBIW 6ۖ@* L;>ӸՕmDuV(N 2΂xC'<Lv #e0VHQMݰC5&դj߷T }cPmAmg?clB!ӏK $7/҂.irwJ}W+IͰk-6>]`dv&-2 -z/v\912syOnPKT Ч x TtSzu)Pxd/&g _\3GP'#ezR*ʃ3t7={S}w'e\J]>)HWw%pOq&Jv2d]^cyIބ?hoLf{ Ж.YF^^tӞ+2玪/zkyѶXVbh<<Sx䓓GjLG+N⌳ssn3%)ޒ@84v{4Fb}2ߥ֬eMClX.V2(Fxӌ0Kn׽'vQbڨ= |-(-}-K9^^J!X9b_B96?sBΖgi_`iBKzq 92$d.dq $)Ke$p1q_ZG´w;BM#WVb7Gr4~Q:ބ_Ea>sg bLeOFZ*a-nx} Jb 1]p.5F%kז NCwC*haGDa&濯v`1z杒lc~g4B` SI-)$+^g+390L8 }.KLr]aL;ҲSmÃ$1pd>ytps b 9úyZz9.,Oަ`G8_$QBY7C {U2+Z٢_{>m،  8CwyIp԰>s68onXt"pɟWHj l/g5 U@O?`9m5׋S9s/-~sZE y0'=Isl޼YD/D+ȸV J~oL u6!brڵ2nqPd!V[\w:yX=">ۤݱʋNX7 !e:nՅV7Zv3QXLcJY!V/ݷ,7H @5>JjWD1[Ii_=Zm%5/u p( TCh4; w onޅ޼i:pH%苈vd-~F1Vul^I`B?ou+Eɞ=8B[,16,>N/]Ɗe6|&B$O7Wp1>KN2>i=7{{FXPuWgB\c_AK"kXiJ+$q%I=4[ָùup``DIG}NGr{W }n=\9TGx1ja5]S6&o \>Ҷ$fFw4[.SuX{|3GК:[ԫYU~[xq̏oCvܱ<: T,N2|*n:RARNbέӭtkfN+TtlNK/6uǻ}PQSσ0HAOCqz \h!ߢxq '8ͷvؾYm._k.has$٥8$|k'=,{"},V>P.sW6t/DVy/CJT!Fk2;veLh4F|i}H߅!vR$vF.4Y=*ǃn#Eq4K{acr)JyPlsLHOPu X^Wj}.Bm".E'y$Ɔ~pcvN9#=(&Ώe/ZRoB>9]z1*9L D<@Ϛ8U*~NRH(jl/oin|F!4WU y U&QhcQ ^hJAO?Q G75qR,cuKS.Ȩ$.?o6םͶ~xO~BNXfh8sdꦡf||yz=2%)u^9~u‘Tzq)%?c% O~rNa@jՎg~Jl틣h'4'6#l{.g ,}LM@9!)Z.3,SSff>F|k}c:GfoY}'HTF-37}.ll3 6N&7pQ~sٵ,E<2j@i.pgLNEf`nx]eG.Gȏ,s7c= k$~`LM/DDViM˪ ,}ExM '`EWGp-vQoyDlΰfe ж+3Fx-nQ=P#]=F MVšdJ7M_bLE~G͵LQmv|d"v4O(>F,)R&ɔ aEQ3+ɱn8'EtL0O'(Ս_ۖTm)dlC!fvrQ(%_& ~w0p$}coqVnWZ;Jn8 GyEg[/{M:K Z2ΐ84_?)^O dF{MXc叼>~can"Kg;{啘Vе+.YVOnCk1D87MɍZH0p}=nHe㭒@JaRaˍ ԑo\ď <MwC$PH#ɭvFA.heC58RVV IڱMQ%:-gҟCA#Biu)yĿ-J8Oy``㕸0 H X8 :Z@M4="L#D?2S2N;EYhp( ;Y|qxmaXQߙɩ2ցftKk=,7Mpm*DJtb 3ze˩D^gFI* @o-Q(+jFkGQg{ʾ##WcA@uM?LH Dúԙ=8Nm60ߛo#;5;LXZ<Մ [Cmy7{$SЫ[N? }e<"$B&S?*^cMwAySJx<jo8WډhʌZm7؆4r[ɀy/WF``ieO{do)#ٓ[0Kn,(;{$J吂UN)UFe7P24-,@kA;:iI ,AȦ5'غC5x!Mc?qD["[@}Opj#@)jW߶:*@T,c"G);/7ܧUƋbJv1&!PA_jrp[Ѯr`QbM' k5wFqNX[vƃo-A^UndtAm5X4Fg<Uɗjzf?ʒ%"J)gֹRbEI{ɠ۹, q/,NvdE%ʵ̹YO(d%WU^ew&ݕ3,!Cۍv=$` -9ɩ0J _ -Gg'9g 2&DĤQO+s X<*ިuo?pj:)M !;_µ mg{}rC^c*%5G,VlߑNӒ Rk1Ƶ32)#q0I&U䶠n -: $cR~dʑe_g?* e$&R\&ilgƆ/S2]W@ؘ qMB;zDU'#=O'4E>݆lLe˕ /W.瑅:=όXyBXy[̩e CO3LIi$˝O߱z+BL߶S:2l$Ϳۑԗ0!U@iTIinJd"ELls#`kx|^bQK'TEogK r/$S ynnsK<%99C @0@H uؚ5^_u/`9 j6t\;ҠFRlaq9mP#ؼP:V3C0Du{4^$+[KuL%+1ɳB8Jg{qCtHJ8HH:!XfU_˒wYB OH7g,r BgJ,PcZ?^ӎ R#L=7KNy㾩]EuP6=“^``odΑ. l.jPU RTzD&/?ˑ_ ŜdyҴ43dœW}йb䐬SڋRơKS\a);ԡ׮~[,3“*2lvΗk#9si ׋X>a`IP/D5L WGGn) aIeH,z{< ,1\35pHӅ?I6;.XǟD0&v{PK'i6Fҩ mWcl%wB\gwؔ Z兊qmI FQ\R;c[SβYW$#Яga{}+v*SM1D|VN%%)apF`EK$0lnQ[ߪ,eeRɜ!N#8}XBsuA ꔦGp.,][^I;VAt.v-i ,eg:r{l5axԩ>C^ł)qzٜn֑`Q =,-}2`:$ZΞH.Vq\h0tkR MjdK㛣fZRHE7I¤FH:]BϪk7g ֩MhboBvf|}&BP } ڗnoY{6O'zl`0]J-,t?d/Bմdek ]]05' tW8G+.PCΉehi6_\ ̾{х9+XgHHT$] %%/Չ|:KNmrupMK 'RKq#((.+/N# W:{T2PC _L$/a\°i5 E êa\ll0x0tz8DU siP!8k_f, T$ضnVXi@ HnDenH,C{ Yuu)LKyIJ!xFtoMȣiRz|9ڊIra>uǤϹ!b醏epYxJ>7TFkQ8mXk|΍(^`3I?Yg^N`,$q>h=~E ?p7HV`!Prj9 /v̴dS30$pCOg%tS)1 Ea=|%#HwH^(==MdqdBq7Wi|rܿWKD0vM<*tpu g!H.;9::eO1?!O⸪BfShf7Vd<| U;RWYO^^K@ίQJ],D0[/NT,r"5|]L14+γɔ_EF 傿VZ395O= / HI ?_x42c|~bI:B%ϓ4!*`f z-?W磰>..A,3ƕW9Pjy60Pwc~2$&OEAE⣹ݭbƥ]8n k 3 .hU/ 8\_R'v?4LҾ-8I2G[u!P79 !V hu&W%# V: ,uy=mZ9?w,&p]6A iՌ bXf'yAFv./cE}r'$@&;wy|G?`?IYK/Ii:FL S|D0l{ZԆMkJC GϬ"Ff4,IWDɝU4T&<ɉٖpb7鞨3sy",.Ǯ*@ԙ9:ŧ"ITtՔ w0gt/$u֦]0~*XM(Rsj=J 0XQg; 8On.K=u u9]`:#cfv!2cZr}lT֐{&9&1ER!ӽrg15&%1vȲ,)"_ ,4Gzy6Rx]]d5,~$nb &}D3ZRhp 25B}twht=]Zj:E'#אD.vYG3JS|kzXÀQA)Eip@}`Xh+>7GMh%kLUrIZ̒g}[f{7kjq|<pCiyޟ_]~UTDtD[= s^YԖG$5yCReHK)J/ Ͻ 0Z|&],znwm|8&|Ba]&X*Ys95_!K U D-lCW*wҴY5cΏT.5&*ڷ=~8"ܮre8e2s1w.(".^! Nq>N龺I3DS `.}kGY Inlȣ)0.jnh=iEF6ǰ -i9vqd$bsvwUBk<LҕIUe'$D&/ectwh)ʊWX'k7: ^:nR/ PWB`Rm >?W?V6x9Y}`scB|MpI[j#V<@y0݆Ʉbõ /%Ub#WPAǑ ml_RzgO#0usi.5/`Z}+c1)DӰyrscLs2H0C%LBqDfm9:MK昄Y$D[fd TWr-˸MKkoЌΒ~cz&y_{;LuL{ QZwY(Y:~ջt݇,e\4*gLn#Q ^LhD}AWKp` K̎ b9«#ISE^euu*Nyܵ{ˢvAnҽޖrٱ 7*dt?s jͪ`LEb̴Ze+BunMfh?a.p-e/1m+r2=mjJ:SxIYW҂[0}y(b[d߰TU88Kj*)QzJ`fZgFI=A6mJ1L{՜*@@zLXV鶔\#䙿趡N=qJ˹L]d UjOXK*3@W?3~9؆}qe5Q59x^T#ĩ/fZUkNʻ;+Wt=qPA'1XAl;9ZZ'T@l&~K2->r=}k9@q2` p:! 3 A`BLO.>a/ mKm#Q PX1c /ݦH *iD2 G+ܣMjt^t%!!aO@ qރ]Zn<!J[jJt,S_}\ KQ\? ^B0~TbQ#šVVĪI F;[v씘A@ŶˊtXռ3e([cL4Cmsib$wKZ%"#:t89yZW@4NL1z3W}4-~K[8T|X-Ar8nu2 Tx|NZPJ0Ė֏jqCݦ(I~\bEKVw깡6:0cд YʐzSybĩ՗Mat ,DmZ3xP?얿Ǔm3 ;e;V A@^v2.r~[nq]d&eWafR{$٬EoIf)=RXy[@q:!7J ڷPFI4N7v_LcJuĘKOwJ2CzK:n&1)&Zei1htu5PD)QY*Q'"WBI?*$uX/(ːgni8'8MQY~4(VIu% oVT֖ |P C)/cZQOVMNho{rѪ&]Cn5^FoX.zZwnДl 2-E-u`m*<m~儭 9h?wk9tӨ:g(k8Mmoꜞ:-|`Iw&ߺ*jfurZʽ?w[ 4ZPRO g`ה#*{N Qz^TH2`qY+zR[>` oܙ,#%IC86J¤4I p6=䐻 p*: !b ޸| w_07\2f:quXSw^klNoQf|IhHyl2ʹ/{nm(K_CvDt*Ol˪sh$K7 k-AXoEc>FhWKEa<\Cp`ՆM?NTlEj -4mV"kix&DRCbWW TzMgG,0oҏK\QzU`#ӸLr)f끗E#cYQ (/IαAw_5>-n`&DHSQ/*Š_#hچ2tXIu 4;1 Ybjl)bx,&2Iv63~LN$ߤU␠ W|rlV R%-c ӑZa*DwP9m]./b{$<>{iTFRLQCD.ʜ `x(M]LR9(ZUU-O'ߍ/}剁IV%0گa鳍 ~ë(:Shoe/So/X旫l3,GsH}D9'_'O{PWpj P|!.UI!nAJsSܷʩXL"Oyf*+F&5!B4^: BD-N.\'.zQV)l oi%JD\?ZhݕΠ+B,=xޮEtp Ql;@ꍲّUClcEUuq*Үq;&{=|0irO˿x+>׊Mܡ GS!uk>R"-6pfXO/}i ߖ{FЪ?ۆ^a<)$;z]yPb@n^IIzM b_&=nU,ȓnMy4VIipH^IԦ?BF և }%ext"Z;Y1d)-yh?Sעaƅ zek!U(c_]V\=ag͆ Jt쥹ja2`cr=gHWr*-t;.|23,Y#(~WlvML籩2fLX΁Y19U>y"Fޭ'B#PmՁiRjVk,8J*}g(រ*\.8Z.QNZY,Otw#L9/2SoAEs$u'1NB.罬aYF ׵KaCnϸv۫-=[ Nt^ĕg ]3ˤ4M>qKrjMx+k`@JHT+=mo27I^ vQ4gAC%6a˵v& R&tfJvc'mS Py$3ڈkzZr񠝇SZ K/M^x#MxW) V=ibw܀ǶrQ)`A ei͋˷b_ZDdޚU佃qw8{Z d] 4۟*-cro)#f&ʗ"H\_7PLE$Zz+@MިXYg[&ݔ 'Sxa[w82D#c3ߡ8%iBRmʹs41v~/jl&ϼ!D ^:@ոJ$wcUYcw k+2OV|nNW\ΟW)ڝ(cD|k%'ZX{@&Pv@Uj.򻅌=N%L4If^KM\ƯgBdjS;sll.I@K0Bje ߴy͈W#Tj̩0a$к 8V|aΠJ@D,~pqĸ\m qϊ7y9蒮Qw!@#N_'櫽eik* ȭ!>O nɗiU/5y qJu$)D{f=ozIpfdI z@@dYv348;+ig8]rD  [7 Te@s`ux43dxƒ"b<Ӂa,2RZM  OE P/tP%`{ 2zDz,]R}j&/":,?k#y槼@H1-i ;ZIċ~au^ 'U&a4~Woc eVҕ2&=Pf WWiat';wI0!pqW~th-A@i6$EtU$/Pvc_Qi*vA;Lᮯ @B* s([gShf9^_+&`3@"-cKjo9 .""濘q|d<$*&!( FF 43D_L#3Xtx4[Egr$9F~yƦnT\&[dv]38ވqzTT=OA-hnN֍|,-#V_^qӯs l4}ڈ^S_ൟLW3r(WȇڿeHi:&Du:l܈>ލ;v٫~FWY` Vo}D?,V;(n*퇉pZwISt.[>Bq.Ő 70M[z܋AkIS}òg/[jU:/*@r01*`@4&]mSLNᾗrϚ3 V`B2*QU;W05.$cSPMu$xBzt>CGuD;=C e8ZyU s۹`gxIWτ %EqH=$K+tDj\mn 5KQSضq oP rR5#AKcӂ"{IPA@g{FJE4YWqҿe34O6.=Db&:[ DgSePZ e4Uq ׹Z-vi%GX&E%T!n¨r`Q0{na(J5(6?,Px W1݉Jڍi|1лo+]&FCY'Bȏ\᾿׆?ءԱ-TH t9Lj Hhg%݉ 6ʦq[Ze$zsjJ&6Iby\ᗦonG!% fQ;j y+q}i^oR0?:4ƛG<,a}Ppk8[7fEN'_* ]VEW{\;^yJlY ":rJoByҽ%7+_7_IfkL=mT]L:e'޺՞3CJ/Ƥt m͒.Tvݪ:;2Ðv!| jv0@w}2O-IT)zX0)x ͅ+_0C7dk2}#(Υ^6d>KB!J:=qQCʜs/'41&X&Av67e*5⚣@dm;qc]UgtϾDy8+jZPG[ufUtx#UjDzIH G&b*hZ䒔(=ٟ1T^X0W5в4BlWwQlzF! 7sVpd4Ƴ,Grɉuv(t/O;FcU |G7EL2-PrqKASfh2^ʳƒLQ(+~ΏS[nWUQ2[@Fref׵S!rXA7OH5Wh`5f+ُI2Ce(gżI0̟WhJ$6⎢;% #@6F晅OfHg(Yg%ENNZEg~ZW>$kff;h|\Tlpr-e9Y y<jaKxA~ٮ|hp]Gl5ojP~bF.?O PŦTbg*z9'@?ra/wP&t\Scҭіn9?XIyb/tR NF~i ۙ5|r:=ke{Kx ZUؑNهKSPIE8^%YIBri+:ǔͱKK2|"׸l9(b!hE_p) wa9䖐а3k9x$d•5A M=P9 z1]}ߍ$i(K\Men+ ղb (=&Wױ@*3Uӟ4:iMlv"[&e`_83=W+Dd{jA5~c2)JmC=QT feyZ(6:9-,]-14#N(P6(lYnZ|0Bcv7;Y}gn"1 t;-vN4,]ݺHAR-"moW2:Qc~BH>^)|þxEHJl2Da}!09 ĮxX/E:DKkJ0', Dez[t̯n)qP @~klG_@g8 + ow!YyųJ0E8:Ȅԙ~Eu*)]bAV0Rh2+?I +v,]*YpGh_A:?V`-J¡/fNmX)}Ɏ#ohW׌"_Odžf2 |RFp؞Ju# X[_e*J(+DbME.GMK|Mf)riWyW?,l_PxPuYɄhi@o0&A*b 4`*ˠ냁k։3.xF)-'_X47`3KO*`vc+QpCU !DSw UxV /"#k{qV&Lq~קKlz%dvIWۣJl,1CZ愄` %!*sbWny}vmGL=^">#a(/] PΎz3ѡ4ߴ<,TWnI^vtnmgCz. ] wlcI ljəMg|A -@&l}ho.b^D{eINRJrbʔ#VEX2cvh^"ھt־^$\56=#ZϮ@=^CCs{UZT6^Qj`Ca)F| U!t= E`1U918kﶋD Hy(K{acގ=i!jѺϯ"~e wG 5 ޟq8S!Ed&ft"`%zM3e`YԱ 1dOkTGjJ\voX/d&!8O-6Ƞj];x0$3}/.j%!s) *)\,0JDŽd#<ndssS%zCÆզgM", #@ <2S]vsJIj`\@GɥfQSڕ[J=ܦ8Op.i $ g&BtRa٧{OI-qV8R6ߙ=21PQ]AVӵ$T@ٓ\4i^B3_ROIP^d˞jA{%XQ=R"j}gS񞋋4Cٰ̻B#+tY!_j-_ L8]\!|$H6!wdfbqRtWe P8٪7W}Ϩ Y]<׉dʝ:fq\%1`ued:c_].QKM9ZC(X29s^DXv3bMVQ0C2xϑdS@ ::!\)B놉+Q rYW&mjEIYTOL1yT<1&bրT  IpOOjhVל'WBomU ^=8tHa-g83cFM onNRZPmؾqqKoMZpncAa5+|B``gCoC2N E$Us c8q<u;y䅉h<0L gm' q g`VE^Tmоuj􋲋X29 "JJ qVjHkVC#FāQ |ZŨ0H#Md/Ul|vY:ȭW;qXƥS`BDxbRN(Po Ώbt ooRyalҋl<6NNo/ ד/hUepED޽1V4%Pl%*A>鏟b~]QӅ YRx nosC =/J8m.P5;G]i1|4#Ȏ $3X# oU>$Ufi^w]Y)?me_<&\Ve7ĮI G*zoIjs0a]I‚[z3dR\9OwwF©q9 ی"".rB*Q! ZA.Qbf㯒VJIOŶ~wJl-}kXxYVu3Q&d(JPէ]A>ZI͌E1y/#mfNC\ & 悧 +ꯧW4ȹ) 1\,L'jQ~ i#LxeqWlY (oP|6;q{]쨏̄cD!劍ȌA\G>jM'ϤLVT ߐ,^+;,9H.Ӱ%=$L;\AFV4OkÜ0f{9sim~+ Tut4n[#%)) aK*He`h텰{άZnOt-=#ްw5sfs: $;t89oԇW/(ooP UG)fX:lj?ӂ =rCPx*D$bbs%]>:-񓣎5/LE'v`wt BBd>U.C \HAH ]m; gƹD3롼|Y n K;/:n.nn_CSEp2g?ǂҠ}|UiKJfvo#v(y] qH2W A׊*ޔ,*LbȤFsÛ,x{1A& ݖV)>6WN>+L0o2+O)]61BuЄFs#5gS"G' |<E`c鳢ƤѲN)^ vH\{ GPx< ia>CR߃||[?d౦xO1š[< ? P]b\4"k3F2;n5"9:׫`Lz{Q*x\"8Wb2\ g zVFvc\;hPfTvc7O.*0$R`!-睎Y9»;P;! h-aNTtTlMAB(e&E6P#ESJF(SǹkZ›M!*G፝+Nj8 avt;Y,=Z|ycÃyiӽ`;3#)V,fĎf6^,ƈ/^{W3u#AwiC:P]"oV9;y`|6,(V#11K?_kwk(4X{oot3p\}D2 IL2dWoNWFV͛,6lKJ{g8iuʴsxI> Wm#~ /Ff 6vt%e`rp*4dP{TZ<@i?c 4a5\Pc@[%%Y` 6 ՛pNlj4 hYw /MYT]>Ef0 qcA֥ZS9@+?+v6Z?n3:E!9ULMCLį,Ӫ]9sތN:+;b@8i[L+S1uWK)T|\[d#$8fq/J$jU#.U;Ffd+8f,=[Y0q).(Et HǎR >^)-dgĦ8 JRUarՆܧ|DUcq r64>iH 8F+6%!fmcvR*O*Zm ')9o뵒IZ.mRNh۱o͗X2 B >hL1N-E3;i,SI\ͷ\}PaXJ$q"5aG735 o JXi)["Vo ePT=Y/ T=7t>^Cj FYشK+hs||%r^*W;(~ ʫ3q>V$'0,BQ]5˳NʊAe~> ,lv IEut@8G/]}G Q+5:`6/'f.eFx(]` PPKK9?o4k<mAv*ܟv.%>le8ѕR.P XID/ s8Q^\Bi>tœ폞nkt8 9w7q&} M|k+޶Py\i번8W՟o/dWpq{_N7NJ_jirrCP0F|7lk+s8zECS[t:S KGP [DFەU@vM3\ۭOҤ^/;9ƥMrẋ^mKqKj+ǒVIB@%9)!QtTV+P (q;1K@=~JwH;R1ǘ=W+ںY+ 5$5KƸҁg:%߷!J]\( U  ]MӪxcey=w.qMKa8\1#l~ f0B9禯)Nh9[3+1|[G@G5~|;_(Hԑ[l8eyBk黤؂]UHiPokuba/=Dv IxNň=WєJʘ CmV! qg2{*ox.Ve(Zq#~$& kҙ̪~+D޷g1mEXź?#PfŰTď_b{줫blQuqyDI/rDZ3Y(82|YmC :pf t#*sXRSd EuW{ɭ)_yPhzKІE<݌;T&5|xBI`eZj BCTeIߍ{r+:'8L)qix<WqPy|Yz/U/zj nVp' J$',SWwnd!Ʉ|-Oa-O ;3JaP7hTjΈ(.xrҬQ=}f-EYbS=gqߨ\Y_Б3z6O' [QxsbC'8UFҪH6ފXs{%" $3 n*G ?sf Έ A;l< eQ-Gm5&tYAY4EQam5gYyY]>uI݆ #z%|ՙvk/4&,Wkths6dx0mbRəLׁV:iIwe}Jn8v`NBҤ+}Q:\T1Ԅ5 Yóa'Z=зy).U ԜMlO('7^"XP I 2 {[u5x%VޝG9w*ilɝ TA_}Pap#A]w6mg] Me:KTyh* \=a' 1\0AxCC<.4$s*SZG/Y<Վ+2ᄸ(87?xdn1Zo5ED 9)ӡĒh;c2 "\>Baz$.ոȺd~E\W"bFi>R!;!\̞K8F iuFĸII:=WT:>g) 4g>{.?~'퉴]u}Y 4,eFWk#}7sb3SWo*'Poeģ~{0E6LSE$@u¶!} :D-1i&3ktV;bő2rd3ܒ .k_ex`ۧt ya= " otdRUF~C-߾M~ XeJ<>nCI]hJBr`y?5y-pP?m2\ 4t`m}2IBHGZTH@- >DABS-=@m?0ŵ e,JLVO5p׮yhEkt^&Hwr#yEn;'1`Ԙ` PoF/Rp4?yX!īdYGP, jle6HcIiP%!JlV鈕OF'2~(6F> OcNzld98iw_?F%&4@|FNA%7n؍Q5^&.CGW(2^gMOXI[u ɞW,^PCsqz գi%@f@#"]Y%Z"(CV?>wiwL0q P\ۅMlAv#E|4vPV lo 3BD0Pg r;udcΔh ؘD*e ^ߧ,rlzȟ*8F6~ -m-cܿ*?wH$q! 0>KXcq5"&AߩH/}wuezB<@Z#K9HmIypw[Y貂|(S K4u: 0 c%#GkIyٿ8 =Zt_I0o浛@aJV0!Nqk qe 6mm8#_?R!tԼk?5ah ߖKluؼ??i<➽tOW굔dzzP}%ԎX%Y4IKvٵLM lj0[wS=Jݸ=)ƣwPkS$MXW u_m>c%>8: ,) `X |/ŏn9Mxפq`STyAp6>ˋ.'Wky94E=;o@uV#C?X$lYkG.x6\20bBvUp H$(A8RD9,A[ u ͳ% 4$@y\5=1q8&Ea5%GXlĭ?@Y]v߸mFd*EQ dL]CQ @YZC1{FJRP&#: cac$:)/aOAdꄐwX@ $` }xq0F)Rz75Zvic*y|NvK ꈤMWGW2dζdP e'Fz^J C~ehﵵI#cP^t*(l*5]TvPZJ=^ Z;CHpU'ѧOFHܔ~\+u@~(  Q(ΦKFg(P\]#N :\^N9.!KH+C x>/X$d+rUFWLiYN?u&zure;R88Zj>*t);ކ%_6FLmu}u,i!>;jAٹVݴ<4[D͈kc*9m 78=T 1W.tCЗqG`Os7U7K}MnA2긫m9j섞jf)CȖ@ 0!^|יmcT '\$ЫΚ!8x=bm.*7x1g݉jY 7H׋9% -|Խr?Yb dzX\~-\N }n<5 ~O0Ʉ"yT )ʰ.3_5WezT<[/''ostبZ5V]n ,qtM?vfQ2g#: Ǭ]qO148oŃULDǤWȦ0&UZYz8ªnkR)ҵEtMo<|aj$&?fg1]1 C mڪ|fUh;SVL]a=y bAP~4fNYzߛsªwq϶뮤I|]?LBVgNʡ,jV-~j E+ޕ%GAؗ J Q0gaBt͔3]z S#.Y; *N!pc}*P3 N!}I:.0忤M/YsmA2t#Ǟ'Fj:ILJrFy߳yEUPR649^!TSˌ<#Q d[?+Yop]qc-Nzcaqv3P.$sbYzzHa+󧴂;:кEwriՆʙ ilM*H.߄֕DuќY^G?Hqc-T8Pؠ1kĥ>{eZO툤KlQ53b>MsY-M OU۷>KԆv16 Tǯ]3M05&T` o;~Bcevq8|jPj'yؔL\QA!;J\65!Jʼ W򯦖Q2N@{/VpƛX-qfn_n,Am7Ƈ1C+{!j[Y]Jp7[3{-2juG ]W(d. | ڻ&VOD.*~)"|Q3(pd0)B87&ߙ%kj82UgN t7R@U=E[:^ecX4d\HX\TN6>VP(T5VzK\5qe:I:|ChhG:J:3ŦR#yۅl_gZU8!hI=ݏ畧uvsP94`^acUi}͢>|p Qvey*BRvq?dSo,qI ~.sD.UFL>c <ޫ\ |xL9&&u˱-$zDkDkcw_a)pax]G!vЏ^ I}-}W`%:n?;. *{?*dmWxJ-~Sa wIvG-"@OM93t %d! ;$;Yq)A5}Hgz:Pw!}u@9)}XLL5N3\؞4W)g`d[\B¨Q{&`C'Oњ;?H/kS+V8gG C 6#Izj{et/[H6`&6@ɘ~%>}ƒQb^N-Vhdd*d-smXGH:6F jٴW૽$|-!QjL% +$8˰}PeWRlY|/KzYc$+%9GX4] V 󕠾tO 8Ƌ2ׇ6]: j1WG7 %㹪ǫ#IX'Ԥi&'u*g594aQd9V}R.Zm~%8%y,bvA(4pᮆT;⏇O|g?a8ot9-53)0 \~RU=}*!Z\fpte??C\we[QA032tLՏAޖut>"eL:-ouQ+Ej9dpVW+/-}h 3>LzKZJQ\7dn&1H1HXKd`r>yI!Kz'LD ܌ݯIHC:+9*2 fԑp ¾cE'X_'~y\ k[7!FF%g-mKiZ7Z3gH(ȱU[t#{ _؍!K[](x):|dzwCR*ܨjI *k/FL }j\yS9K#$u 3ߐ)P^&#̶'0֧=c\g_DT l%ue t&[.ݫb$FgS6D^-TӺ̌c֫I PhvSic~OQft >W&؁##F/>q8^xd,]9] 5sap)eSeyfralĕB1HD3 :H8"MPZS kGGf'XNxoO_ҹP=G0Ы @<*JL?&'Q6/=ӵuO>0 ⤔YlwzI^]2C7aֆВ+4;L [U"p4ȿ{wόIF&6?\؄o,r* Ei-1Wⲧݙ wIv[\{M'Qkʟ*8d{H6\h-J-L(l0nՀjPz}DdMsZ75uLn`MF7-M4` 9jЊ4ѕq'"7uq%jN1ozU/X.$T"i P]fyjq+.[?8 +8?%b7eRtLh1[C~[K6 cܱ&]N8 yx펥''&FU[ĉ O+d^LuS3AP"M Q2>D ȜKwCw>u֬@b\P3AIR tJ'alYUwzpb&%(cɰ,L֪P{++GQ0 oC;&kp(~v*_nmot}!HW@k`$C>>,](+(Dsfs;+v s<+=z)޸(k쏥"{j&F=ri&yL5Y\UX;W &nBCVPp9oMP[e=16@j45iL-c1EC&wx[AUtcz ,NMJ9V"~ ~j6C' 2CԔW3KS0̵PTvnR4v#@?4J=%[y#6hR{ߏޘ@p]j?v+(okY8 HVWQ:~w/Tb6` u?鴙/0z tc x&%~j:Y\m#s݈ÿ lLdJj^k7HUnt(I\\ec r_Tmm{OxFW*Z~w%7m֦zXhcʈ;ޝ囍 p쩺uJrOߩW 5&$$~A60)7_>'4(g" 鵴UY;.+2U 9`l@^ڼL4]@@!USWhM6Oj\7(Ҍc8 YƢ^M&eTV&!)PawOjJ[7CrN_Fíb>(v}v|Y4{NOJfbHВ+cTtmƝfW4ܢWoa> +'u1j3?nLr\u򫹂Mޡc"Rlδ71qA[Œ*dd/TXŰ:X`ddm:叱p>؈UUA= Xp{?=GY#8Җ.׃bځ JñGE2Jabiz@"zF$:9@.ݍ~ ڨRWjմh~yI6#~fVpȿ+EwZs lDyG\.g~A_RJRT58f/xUH1kj nO[T;e6 (íF>`6iPM& jReg# cߌ p2Z&$X4Qohڤ^:UwJ٣Ub$0li.5UҎfrgV仔3aRRYՆIkZB~ \|,i=끴WA ч+P7μu!۫AI SGƇ-QgqPsOux2@? ڃ!ų#2@7+珯_v3;c[%+Ǟ+2pH6ߟfaҧPq `Xxю7h3EV&?՚ +YD]w=d1gꇼdYyJb=Z,nَynR*r`p).ׇUe%,-C2PxJ&ʹefLZfy %22H鈲A#YOh9A(C2ǶW ]m)܋]VJPS40AЍ.7qQ5yUW7 W!{BXZ^srۡz6kU Wxr5^+h!u5t9 V  Gxr*'OaP_! |>~^`fMQەS?WΔ\^zj# 'Fix!]Էpb{QId 4`d!Xh'62 EJVExqo'zq4?iiHFUBaJ3,X;7Wdho,=T1O@w}gTҦ\q[쓓Hwq?#Ia_9?ku@$:dutaRivdS%#MP*ܛ[=z\X?TX*+epY&\D|˧\mVc-@J%w1*qp-^jZt2U]6%QX50O#Fv8G",5?cEW>o5,D v^[=[uM,c#C;c 8 Ҹ4ezOF 8rMP")m!97tt~6*EF =ꖾ>lORZi`'PP\b=PˀGH>q\DdPlL(J>d>X\2i{H\!ZX2L=40{b(?Y`)CǓ9q9`$aoDB]Bf,2 fWv5EZ sVSgIPtʀ YXPdwmdm"k9v3Efxb#+Kd棂?Vxi,89bѽbpAyl ` sXEU,Y)9:<j"W6ed3Gc,i5"3J[F\EP\ E^ځ͠?`f'J7_sU.\A)&s mNz>v᳑y3[+KHb(*^?7 \;&FK#6,Bk6sB*MT÷UdB8 ؾT݂!뾚M.hڽy ;50ȓiW'D9(@)OF_mSNճ:+(k[.}lҒYVDM`P=f=#y!kq~6{?YhI>~@$ &R?2P,O01Es*q3.A1JtYD,y$>@E}P1uWD5C

&n,"΄ZŠ?,)>;*JZܛ%YeJ{1J5?^sLu Vˬz7HL\NH%0fծ$e50צZB1Lm!?m+TZ;a0Pk#<[[DaǴZޒ.%;FXsz%[`rnQcjIdqX=R1*T'TK'Sʥze:Z k]$M@qլkB pY+b<S@W0bux@&j@ ^9Y Ɂn^8}}Wl }B81ֆwDS7h-fsPK)2jg \{oI͍]v_DTVKj)ΣXT:Uʡ]~yϸ;+~]6ߋW/+'U2 vz,4`=Q K_8~ >vnij:oJTF腏ӒΪUDNz}J꒹ m/k/Sbœzpgc,:gUHlL$!aOTfgi$BBvƹ6h' &K6Pw~M7o48r"P^1ΣW2W/^4WE|V~SG}~gZ4pru=IZtjTR0 CTY4_'+-)SЈ:l'c@#î9jMe,z Hc?edMEc숓PC1idlS̿tc87޴:!|r*uNGGDeLSi {AٳC!T!qJԭ5qKa"pfuMԏ_L`|,o4Ά[| J`]WPzR>$7;Ez&SX3_gWn-NkqVH6Cj[/PmN!]]G: IE’-l$0S{ PMAA.OqT"Z >: sc]`cUmTQJ̄?o.w ȲCJ zQ$@(K$Mh./倹l L[4Ovm~s1]+XU:䐏},".JrU5 gSKޞjBgKVSCC6txsb CK+`%)԰ze5%ֱ3Y|0F.)cf<;H]#\wBސhM%1ofӑ(Y~7<y?]wg 7 ࣄL>q3>S-N* Qc- |KEb^x#-W|Pi3 X518>|W8V͖G/r-#S|ODH`Ɓt3qhR aذkyH _3NCVdY`94+?"34%XAnq%#A3\4!?QH(5*vq#<\ln'aXޑrTv6c() M01KGX.Lj>°±ӢI;~r D\nHe뱐ҊtFUJ 7ci Zz 4`{o`է~̕Ks "+.#qtXP){")*r$qd^ FAEip,.@{ U+Α? a DȐ]õ)Q:\1ȀEɁyK`:Q\J}Rh=P}Rݙ_E+u?#)6 QW Pe-VezbLG͂9LOˆ^Y|2+\7w<㷎}/ ȋ`E=AnWKg+gDnh$&YPgnScI6Jr}@ApL{$|_1KvxHB*>ϐSc&ݝFt=^?I]~|v\5N29\,wma ʦ Iy64.YU׬) 05HEQn+=5wacgk\/M)KZCgi| U^kmihp)=ƔWLWBQ}&;SO8(&nDnjЕTA5?jT)h[ #?hy`>w~,V֚4;(rҒV,a׭&>;s\>:7AuJf+G^ (A5/ jMP07h#uմ@aˬ[R~LvA{~\5t ?c6_VP bĨ^^h?r{M-9=m}”j>}?)d%{ B%V B_g+z]ϝ]d LX@W〬 N/3 玍7w]-[4o.E%tʞ^3&Y􂸲̙Zղjư(xug`a9K vzp6`\F=r"B< qb;bL8C-Lo7bt Nf#+v.\: ՐH08y[w=HAcU0% Yԍ564tM"-Wc8V0AZM_1,% ]^߄H˜^ tra\rxסTAr^3]?p?_tVTtI|aj;V]g8jTKVhMDuej:tgd(NìeYB#;[d37 fX5`ɰ'ԕwGE|ƥxK/ޞzkhl}j3wFAќٰ-D![{sM3YO1SG6,qX3,23m-tGS MO$$d)1EYi[=()9Gͽ2 cC] rf#k'|4r\# &cP ^ yk:rYjwcH,f<Їa!tFQW]z^XA}CGpMS I1lnq"V$_Hn2 PF"<G m6WkV;qVK)z鷍]me8jp%K:Z:z4Bp/OFݤf :(,Do0aSq'X$'|%Iy8hH$L#Y{];Z`XO\rr1Mq-s@ɬ}DNB `tѦ1_7z)I.0WP:#ͦqTN)OFx4oT3"R3:x䜳q`2M΄63qP46PۼE;`gȖk_e" D0 F*umnHk;g٥D_ {l,t]Ϫ^`3-' Uhߵ㍦Hu|uݳ)Jx(qλa+,eoX>)f,\$u6 5+z*:Yh^T1Ta*,*,W.tXZb&\J%OS/KkXS]h-4\(\~N!jDXIsQ\G )KwEc= YJ&o;xm)HpFΞ[}StދBp kmDj\3c_e˭pD1FɌwUD >;lI1ZMf\pkO+y@By{i^J!NmsjPnɈ }̯-X-CR13_v,M@ցZU-+5&R#z${>Զ-[\H`ډ yiKYn_WH~"`)mJ]3pKkH&Kv}c]c@f5v|^9sn^^am\> PbM>6#>Ղ;Ii^ٟ!cw sY c[82+0 G9Q\J,)`3#؂W4SI8Li uK>kz#xU~V@H:P/GC7,`~^.Pl|*dR\<]f\ĚthhZ]'=az1h;dbWW8Fg|L:zGLcOchT ak>'h;ey58pWQ _c/ˆ={I<AB BR༆6䋀R’xYd*CG<9J2*̤xwp3VjmJ=뭾5y6(4J~9DmU粕5|ui* "u>`f K͔{>pr}#Y)ˡ>׺ nXtMv}3):?R7W[0tT W뢹C|h'HpV/.3&@Id] $qyolOtX#\$MUVY/Vl[et /C7iVPr'AK3RouP&,ѳC6ʆd bu+.iI< 70rH*or5&hWF,ոk_nM=coXQϩ =ݚ 1pO}8ISI86VkJ`Me9d ,į=+=ߛOR$aNYYevtm"LGg+赊N뾎}NZɤ0+[*ʩ.ƘؖE2{U6] aT~Zz{ф96s{wP kf !&C X RّҴ^x~0SA&o; Zf4W*RcJ62[F"~YQ\_"e<-E?cJ̈́G>(W!(z};]ή Ɗhv37"H}.-!* \#N!D8>AqIM!*LI};C5Č;a s4-)I<^"4ܔoͨߩt^죟#Ve;q =DI+S`1Ž4K# 4>i6heYVZY͕۬ӎ] ocb6A2T'J$'CVz4?%:wbm>fxS vs{D%v'rWV?$bky3/1E qc/W.[;񝩐䥨| ~FP" ӥH ʶQ´+XMxj 43K9~E)Y@ܐ;Tut4=j2v(zb}q_9bQWo و[ֽt猢9y(/E2:Z8 {}o af:D3b|zljfwgޗiHh0ۚV:E܈jڋ:%بj0SSP WK&6QʊRfIG¾?DzWZ uwäuYvs]1o]f'R(:Ir\:yH/qQsA\C;;KTjܥYo["E^CON =K> h8SK`n]zNaYP]K07&a E^9u;tz &)*uk,}>ܕ^HXC]5hTip/H.Gomk3q'Ш M#!RL @UeSxx2yJO"A`nѿT h1.G| mƏb.=G,+댌3pq|k0sԫ@mn zxi GX3"A1mZHfj_N#ծɢRoX.jqN#)dPcA1ff*bdo()钛eO%c|3BɊ.:=6po}gqؿ;7&QT7 XAYn2 cGIBM$"E=bȗ[ D7f=ݞz ZzsBtGN9wqd6-+L=١V*L-)w q^2Ն5ʙq#Sdr11TJ: o$=QwI-c1EkJ]F3$囟tl^ <ب" }?7)t9$[2=L: -?TΪY)WRYX:Fg{fWBHg(0MAo?y ^ ͩ CN#:o6nKZ%V.0C)io0o>rz< #u {,dC-?Ƣp"1"UiRT g}}X}pO祻V]˞υ.mth#0_ne &KzndDYXHarΓ,O 6h |xp wesˢۨp-R(;`=sa-un*v0?b'_4qstUPiCY!ANϬ!DeHW>瑂vBm`cvǽߋ$sCbU#ϞD ' r1ZT(,.mv 6QA3v{I},dH${4roH}][APvO&r\!zm_Њ@\Ch-1͛$áQ U\T4X"|- Dv'o >'"L_}P+Fנ^P2NT=AEY=Dl])ߣB Wu9x1MR3AB˪^_l}D_ӾteStQ_%(,  (T5)KURfۛW;AUܚhɃY&T%&ZP$,Q/<# 7( 7_;sJ fT?gk{}(ӴMSchu)FIASz1Gy+A=Dy=/)_p x}=gҽct[֡1 }]'"F;20kN^VA_ w']o{K24' :^fQ ɚ^ si4;pNB_MO=ZIWȄ€S@@TjH1&\mWdZ(pBkQxtiȾ~(ֵ] ~4cb[1>U||)n^<߽?I^YJT[RUҒbؔ+>&7.E=[``t?hDF;])C5Q`BraZ/ػ/1K/<>zL2VV=?,W./R t 2"Hv] Rsw H[-BT&T$wEpݕ|][=odA,jqÄj\ #W&U\W23[L0=UsJOBJr ` /zrɐ0# TX7lODN D~]w{pĸfogҲREU'| Fj8ڞMο(lfߛ ͦVWE蘾^rB=~ mtdx` )ǵ)yNA=>¬H@\u_ JjfsF\_z!|/i+Y.`4 '86cyTX~,E=K#JQ6Ԙ25+QTERa[8F#FۜبЍX]MJwݛiK3/^ :2ǕXY-M+4OyNeyo#Ddq-֢]*Gۣuan E+]ީRjG 9h Y%CxWk: ],GH2lIشje8mWOzOϕR]Gk,ZtQLKC,_gv{Z56odcړKo]n{6zSh)~6glI_{Ø~"25iUXR~ lilR!Ha[oLR_Ga91֤w Bh+:.6}_5Emt*ps7$ O #Nf*UASELوg!H@J$y ͹+l^$I@> &Օ_4Ni=nnS| Y{hd!v] {Z{@J 8?XW-ҳ_'ŃOL c@5@Q*C-Î{"x^l"+=p{4&(sr\۪FFAb:מ8)^)c{&6w + ^ C#RLJG׊*xL͕l n:EcfpHRYm(X?Ŝ3gdnAV;@4T)v@:fL͊ }:SVn6==۷MzűA㟄M?r?՗4+OHN< Q=N]U,Ӳ$=b;|o5,ozX[= }C9"%Cۀ7M S%R^W^ fg" ݍ'zs k(\jcaXpbߡa'Wm\iF;XOC+~88#R \#l'mD|;a m/ čX,1By?/kأyܭKF?92_H3~W ۖ`t/gH -wv|Tq=y?w_pl2]9LMGBdX1Xeycs{HZ2ф!3b5@A4M!O|KZI-jfE\,H IC^&FRfhř_,PEK8}|S\~s#q^)ͻ]t??ˍgVyɋ׮QiH\DB5-ƺRfÂ?Co6e g8g4jZPRwJYWa{#;c=,3 ]+>vNN0Lܞ((01ZT&AE . {ANpk *= 0wsD8q+kWE.xr A/m !Nq,[z"Y[O!ka.N?Nu3$4,٠#ԗf*$ȡN8RRK_{"I`",RS<:gXYC\ o&uDN?G}G U*Up\͘?i #9UcV3^08YeQ*ԄP$Uf#w8Պ0@f5ۦ-4VȜFh/R 4!U ̊> *?&RHi–[ͯ^WamoQR;m;JD荚{eZ֣$HEYM?#=*8U9-In1!f NO_~948˽N\fj4<9u4"v|5GÝxR+ <`iVHu @c4U4]v4#FV87=_k>O8,ͩD >k19V,ܐq[ zpxUzU)Z8&fOI=$|}3p+J_*3Xy5UI")L4ɋȊUvZ9Bq.N$V=>O Fy.5(+ng9niեvNXA¨Ҩ MN+ -3jRH>QBHc_Ê_}/g;os&ʲκMKH6?n${ -݅-f{.CDF$eT-Pi/R@xr)>*E琮AweE*H<䮐A7x$)RPd8}bWgk6ȏ})y)1lnDu|ckؓ$Xhdp4h>]z *)|Xi9DռT2H%Ϗ+cnلa ]\ nP424zF7hw^;q+=ct4 <̏y&5xEyР.9sZ.979ɚȡB:4UBbA[2 ֩ ϓyŅ/_ºO@G[{)Q&`vc#U \whΥ [yM:º)8 TfӒ6 !1h- ʿCT5jʪK[nƮՎj$hes7BQZ@V`4PR"wu#3צF% g[˫zv0?9E|Ʋ)RqiG݉dXkJNг㴺u翈gslJQy dGzl͠3s$1đyjH 5 Hj9;&?vZ_N黣w>$M Zj:HD/Vޖv #Tx|es@ Nq|=i#4Jz '"0 >|#6?pRGk1Tw"%l\Z'.sc7vS3r}S[S ;Tqt*>qG cLXL%7gJ3[ th*795Y=iPZI2G[M8^QXVmRSl4(V4+Xkd˵Xj:?.30{柅3oGT\v Nܽ0mDOIPDII hIZwmKa9JŠ~(#s 'ڥuZ1o4=z?gdAm`p,Wlt1%ǒ=îo+FB1v8n>5BHu cc\u+|S3J++(yZGʑ,@~]roHoz.X?pqrlIY$tRj['eL߄!sSN?|JFq*?QP^Y} 7NHFv¶a?1fvjHsN$i*s1ܒUkDL <7x̂n"zf 9qYǟK/S/\ 'p@ެs\0^BieX=^!QXMhxѕ>}kGrDATjbB=+svBIQt7#w<5Nnj?Er˨$N?lmߧHK?p,_˺h@D@ϊwꅇz|Z;* v9uI, ;ZLXk_v1@+! ly#~/kfF4OkM;z)"N;OL# ͮM "$[зOuڰ%bMJc"b+O?$d )|_n;:DôX0ۨxȥAnniمk q'޶g+ysH/6x{cM;xOA)NxHzO ,w :lHj¯jiZԸ5,@1%/ ][&.UHBĸnX' (FE7 oxq#ަHAkx]`FU>Yb]qN)dvp?F5/~a=*jxgBiD?D}v\ba1[UD}eCW;ēN &=ǏHN G^Beag+3=x11bV'h4\$2p:9 9 NDA(mu=%s 1R"F1zrVO#w# lD ogIJ,>!&Aے5͙{iHd֠dc3 (v=c ,r ;(]\~mP)Ԗk̩}[s :h p GiQ(҅U^2~_">}Raxx'2ĎWOsG#J r4f6L#S0eO=Ǧ>UjκWm׺R4ysr|^:V|'43 ݂zuw*%UOչNIbU`oƑtRiG#,g_a' BΡ\kF [x5QIPF;V7<PH <(uM;ϒ+4 g)a{9}A9d?s瑩-9V gv'soڌ!rn -E; trYt`AS_KuS6uriEr>sA8 \ޯQҍٜ:*^Vx3IQm gQ\tS;M^Q3 &9_['r][HwF%fbHG[0UL|"x7gP94%P*u^iX|2BG4VOS{>E}B~QML-Pr\}gZȣl")#ȥ ZzXYI-M!Vb\2l=!!L9SmȞDZv|E8-(Lm\+xKw^Ӓ~}M.W` fVwD)-:׈ XK1ZOk'n=fjN/Ei| 2ZyMv+5jev3kB(?k|=Dn;9s*C0V|kgJ Zn˂;ZIwQzzLT̪vs).wk_w;aw~vXR$k_?pNKw|S 9l~hO]Xr30^ -aMPpy39V,Yl䘽ad ANif(E H-4C9JZx ˠ.Ti#$O4rSY:жWmAAo³a.ؑ7%[C!W˷DZrI5h!4ޓ>h >3XQ!.!cZc*.ᩂ;oz!~GrR$59_"&P*;6dYIDl5FY22??4D-6wwfB:$6X3F:6G7wU"{MF#)O)^jD eW~fYn+'S\ړxṮ>Fu"ň @ܛTm?ɤUIr^?28XVSE!B\= =0&K>܊XuNפD-+L |3]3 Q* 9A 9y`EhLCQjFx|[TWtzdu\!QzS?^XqAY2c~i3J8g!(ɀRN#c҅oBASEeY[ 9<# g\G[XX`h4E҈~0#3m3 ~쩦=Vmaה릑MRwkb(=zhjg;R9jJ%q" )w8+5\I)Ői+ryEu=G]>98NE=jrĮ8frjmHHXuXws 1XV:$< 4#KyHET=hYjH齜+[AGD}OL=,TK_&׼ z`$khõ)C:&5q:aڕ=b".7 0c8H59hIoY)])Ӄeဢ!Cg >hŒcZhDA*X,llko[ѱp6<*!n7Q`]R#ƞB. j?5]|q -F[hۄ7mʺgJD 8Y+Qhl)>՝tG\qݺR~nڏOY"o5k"ZT2ѳ Bb,3@@yn^+q?.iWpEevw{Ԋ%V 9'd(eBK5(Z-ˤ%cm `, Mz>Tܾxz_Vu46 *f(KDk7rUc˅Uy#ۑ ԯH4Wǐk G{~s->5D^v3;6ۛUoו4 G.S/nZ!?y4B|\dqVn/e껔 .]S4?}9"/O`(kh1iL! VM{{EMkbFMvhB;ֻAp/C9ռS iAnL\QE~`f@Ȋ})b& dA~x78.V4a4֮zU3G✠]DaL%@ 5;5 E>[e ޾2h毤|Yehƪ0#TϧiԞŐRZ? 4}f>`1r*[H#^7oJVweRl5$V:ܞ(ntD+<тB(F^߃nv}`!A'3K/&BɷX(  ~GARo&!ҩNYj[s6.>ڏAU ]aՉ ۱3OHˣ~fZ.׃+"#ׂ"d7BMMi:Oz¤z??XfRB.l9YQq% 6j_B3fĘ 'OQx=7yQF\Fۖ8}wg`W\,[Oķۧ2I i\'&jc%.M" [4&UpVqҽfT5-ͻpք"l ǒ#+~g:0a.,뮽w.h?g#!7ԵRa$XJG6a=tzkH$جr ?@ؽюgDmŵH PaC\Мg u=A]]Wn%Fo_ɻ fEJI)mwT^+%Y$ͰM@4SU)Aa+#EX<5\ao)V)`ٓe^Qv&G;])bƑPB:g2 UJL5be=gZ+֢7Jn:u\sQω|fC@؍#&CGZ }3Dd܃Jg 5&`}XH9=U0LӝǑ9~stƗUGI]Wֱ;8'<$&zvw&`&پH;K1\Ѓ);Rk˿m]gt3#W]p;v56ʣV<h/lK|p$5E Nl$ 0 ,+K37doԎ9BR*ѿEJIBҶIbLV6+(AY:E~_a.p"40f\2rźۨC^d4 heث)6ގޗ^&N9/萾/ ⋫+X3[aקQ!ȡ`}GtpZ]u&(ߛHf/QR@Nk[|%V%aegե5C«]DJ߱uz9=kՐrƘX֠es0PM7Gma7:ZHZ5b-BGw>*giBA&4G|ȦA[I+6lS-OovMzn Ub?ůJJ@MpV_m [jzde`%%~_\W+# Jj/Q) +uad|n tC~wY;Ir⫴9~z'ő2fݢr19J7;xTW-pMSLuJ-n8O eN.w]^PzeS "Ders O\!#o'G*Z#K?VzHl@ nZ;&&zpD 0ny^O)DdY4ܣaϪH͐j.u%5x ;ۿMIK,flB?X$KIH:=X& $'4-o5xhQ-:h L~xj /"g֩ԦxE/vy[ٸŲH/ˍEqUwVD;QJ})ZmXpUdNz}3'پN&0NRd`K{4J+OSKxlu9>o+՗n:q(}Q:~6TaſwKc;QDarJ uuIЬk3| 4ա`* q6%Z *tߊ5% Y D򎤴[qy߽|BPYll2"7GNDTXk7CzmTXES(la.!XvWv8Mmpb,T6❰yI 4R_|}̹c jN?:m4LNhs:Rp2@do3\Q5U*'hOܡa{ե'jA]퇐^YvW\<'\rӕkIP ;.k} R xrȻhdOn_?ZUx!oA5ZaU^\dŲ/!-Ltv5W|֣Iս̑lPTK;e}QRbuiN,K*ޣ^=1N^20ZƇ%BY$D#؅qza̴.^OZAtƑ5ue̒`~<Kρ^gzU >6HL7` @Zo,MNVX3t݃U&:JX5ӗl#7 Ɋ7=O ~9lQAMBQi -ыC8}&زTò~ ~$t#Qb"*mX h*DE/7r]٢kAV@V4@0eFڻp\/7b a,hpF-6w<dQ[,o~ez̎IU s 5Ͻ&YqE 2^Vd(k $C`͡ @ѭjW^, 3ES9.EUObl'e0WJ%Dyܞqy.%ހX(lU^MoVšP4QF;<;/*Eg,7w:}1u_"a5=3l9Gp&mhؠ+{ =L= 87I@7n!l=}i6 Fl:R*bU3TqC- g{78{k~ߥ .0pvl, 윛)>+KcA l?e/HLVM6 ֪Z4VP *KOΦV@ $6sؕB˗^`4?Vb~LJEоP [ǁ-An'v=-R1~5)%}_/_2@(! e=xGP*]B!pIV?B^o]+Y^8mo:Q1n6i7I%dt ».+#PY\A8މicRξn\̥7U洄S#0]t%GgJS^v6m+^^=qẞ`Ȟ@l?vsAydۊc5[3/%Y0_d8»L:_T0te?J+֣If/g_V^wbްd&\UͫꞙlQWG{FB !A#^4aщjJM +hK5O,RoN9 9Mt^tܘs(?y%-@eV` a(+)(&BgpQJh˷̓oZͺS885xx!z t&a` n'DQk,H 4u(V`ϳ $jþpY: vE_JZJ8meʩݤdP%hwTnMY@rd_΄8z ^HM:I!@qzT8Oes W~;)8yL h_cXôͼu1I+'j{cΕnj[&/,-F1 gW™EatP+!p@Q""ٓ#C]xJB)Vy-[IIJ晫BwLp瀹@s:zN<']83AQ[S)XVKXM#}^KCS9;r7 t7p@:X8ldj֘/KUR^Uw[EANcXpOˮo"*Tw " (YWџ%*Bɓ冔l1nܱW2yC[f"Ez?[׼JTxmٕfNHХ;|0- :}kB4HN;nDvI#2"~~d}0)$Veq~3yja:/YNCĽ\ej(|W_SNϧTJ7 sfӽ1V[h{nkr'PV#g.}WWkVht_Կ3nVӪ'|(SG-x lopn`W a`'Al폩jp0JWmUUCn1 rf؛åS0+bsm4\'pi9տ4W~cJ y|53h84w+ !\<_P7实b_"u Q ') P _:I-#`1JL XBm6mHN/bsa\ d o/}ѣ<~ nZь\'\DA$F c WS] {-R ӱW(3k]&*sCXm:֖tύP aVRݪp)rR^.Lp^?pFRr {g n^'; Ϳ Eh;[=t1ZmԷ['}vٔ$[CjWE<.p0Jh3˧2AA!,0z$g&E\Kb`*#1O6LmԆ#,u]W0*BwVGB@r41_WuڋS^9OBm}G)}( SfMe5/촁Nv]Ƈ2L6ZQ68&6ad\.Cc2)}XR1=>.AK›` >|FÑn:SvCqP %ž~fV%7p? ħOƹ )` ?X2QW(u|%~#u4ML:) c4M6*G0)NNQؕ8q(&V&7zttb0,jo;ʎ,5a!EjbUU.ߟ87R$KaG(n1-4p^7x=A`Ypmj}8 Elezܖ2I-I?~![fgیN"p"2eE9:V 6 ^n#gLo]* Bװf,Ne%y}?K=J:YDZЫz r5QkWa y&.ZQg-o' BI.1||dXld _[*h#ߏ<װ畵sX 2d^{;B4M=K A#C~9-R )b Zcq.ϗnS]q>:KdcӪYEԯFm(R$_㸬%28)8ǍȔT"vJlu,4-/-b A5^E4?SZ0qr弎;ߜ#/uR2Lm0>д2RZ_ ޹LsAP홷Fq72&Nl6:"gnBm s+~ 6OXV@f&[s,X xGDKz+9*x;0 F~8,z-K+:3<<-Kj짷`RC*4vP ]+|p/yJ &BtO7jx{dvPRŦj`lTQI~i]7:I1׉L=᫷C5R;HѩF3! #lD1L~k {h0:디f7 c2D4 ЊvdY!]5e%% uX9mw bPגMb꒜Mrݞsait/"iyeA'Z8NNAz5gT, iLa<Ý*x`%F7im]HR0T# {89Y-P5[v.Th-` g{8M{/1 $:XGI}uuVVJ#*j,(zPE ~(zhkcd[M (zcG3mMd)!ɧ(&Y=eQmO Fܔ=1f]zƞq9yCrXCn తy}N @ ц+' ȪDŬؙpK99@g $X]?ዎR>t˸E1O;1@wDt硷9鞏 ώlWo$_&sryvno[DK :3Wf`x6g 6GG&DqlnoB*kxtl3_YZۃH+$-gF"(7UIhM Ym:cȕ,əX\Fe(Op1ҶfPp sw pɈqN5μ *B/ қa SsS) _M`0Ш[#=l|szDBC΢7&vį{Q>)D@}7L?݃סUfiv~-q7Tec b+P N*;u=9Y}ek㊢nL_0۪*o/7ptI7a2xTt\; dEɺO_s2C|\m?jQEpq1Ŗ7 Ρj4NRAէ*'35rwvz"'6['Q|QFM@]H3UJ,fc?ƌh{Ԯ2C0,e8SU6)Ni22nP8l.*؊~jvݟ>K3RtC$eAJM7/Vu0G>t}$7M'^G,@5C\,oz8|Ţ`8H4\>҆R5d@sb[b']09lQ!-LmLQjhRH̰uXbU>!^+a,fi iOWu RUZ0xzc Y-'mTso"2? CDs<"x]c-f!\`ED+ipLM{;/?vFf#UϐkFnJiƝғ,# )/;Wl{A)J'W-]x?Po J!o]ֵU -jr,0x\%-d#'fcTzJVc$ƎfTk͵r4t9Ү3Y:\JzM1"88v%YV5LcM+Ď$=dak z, ZwUcTdXIeh3 ;hZԏ1&=.lZ[/À`іeFm9Ҁa- ͒T@1caPi` s['`T[d#rhTbv?N@MlaևTNg dD{%5 Xa]QFH)נiTS"sv>E:rgaJz,O\f./" <4~= &Qs]`RKCt{^>פ3a`}TJAа㱻V 0Ts{k Vxb0ffEiARt'0JK 2V35If3ᒾeCVm(DQ1^JBz6w$GB7RM4Ȕchd;ɚ<\s9Cv<̟k 6++oFZX~K~ՒgԿ>^"? >0$`c8C֩}7P #Z{)qPCx׼gr5O;8p[;6F|C.>Jm#z-{PyC\cg5jqcnpw fdκ7'-*S]%@Qo'g4tznq t 8R!ІɶGFcLN틭8&$w5h$\j1,Ysdu7iR3C@,eW]ВhYv%1d eB%mNĉeXCT뜔8̺#s&АZkDKe6NN'zc-o-83}#'L?3Wq΋ V*Ba",t}JB+={uH si<ެ:21^$"fm&ЌJz;r mg)N.@TݢzJnwTRN>u`kyW#,?߾#B uE11 HEωs8̵qQƆJzds2y/n"|N :*tWګ"99/33xVS*$<.~\ź6&HRW7bsk| @oݓi=D|v5j/%kqNq_DڴD'6OLeu-b»y7邩|.] ˟=#7Q^M's`mvS=-_/fylW0]U3a(a޷)}Oۆf+FI&V :']#[s2 gK U*ǝb5A$wf 7#yvj k2XO,z}0պ.0-UP_~8R^M}Iȡ1/ټ&[88Y`j έRg?[ R +4ۗG/Ϭ^ȣ@ߝM hOJ_u9Z/Ԃ|PR~؅nk&I-NӳA hYuҫFXJ>B1Bkt6l>>w|tYLXM-B NobQ4<]TYJvGp^u”hCJ㣩RBdċ>z9P\Q.=1[<4=GgihPÐcF %=}!HAu 6aTDhu]*{e.H<~Ϩ/9"\ ,ᢏ@[<Fl#SXSX\KdH]7}{Hi+UaJB?1R>}WRTm sl/o$RoTmCCE|/]xQ+Wgoq^ vRE77IG|>ÅD!,tEGGh Uu@V [jJ^ Tǟ S(wcn>'/!}pF;pMYS8,=^dܭv<=O7[gOnV eYwTrEG=*>#e I@|AyPǣ9h:G9fc =Yо %"UMI4nq 3HDVH$ HZm5Iy6?LY.'?ŵ`XÿD: Q0et"s0I }@-DZ+ܺ2HV~]aH\'sZODǣrG8A^ Z5,[GW#<23gGhVYE ]0:eǺDf:/vk+npyW<-ID5z ˮMwk3GW L?7u R( ^J\T"+[Y<=g!U<ᶝ@r\R0u^S!BBb:*TS #zOɑf Okz% J1a*YV-Q 2))thsIqLV#>/48_#EA Z訖9-&wl0-ҽm!q)=?x&=Kl34d=$hXOL"ĂiޱreYtd)gD+0GBl^bҞ~)ksuw*םZ{VeFNǮ`RAO4ҙZ.JeTю덕$J+g#bɀ3!,& [b:[HB'E8G# s]ʄVul%N]L(hS_c§,Mjb^l[[E7T}:&x"a-UTo6E~5(*U k!4UֺZGv#hѣs!p)v$M0clz KOwMPV #OIjwDs?e wVف'ȣ$6pnAC}@Ui18.z8гovd!w}]gdk|K!\~C"4hh\g5jb6%G߮iokͪ,Z(e؈ǁ9|W@ i*±jtt, eL :E"i.±[mU=]u[A[_n_JpkO2S7F-`9"?ƒwGluzrҼt`.agY/_޴mFȮ'ΐ[;qrXC_4N—v>a'i{m v m`%`T_ ~g ëPq>A9u#ԍ=_hU_3&,VK C]0lN#O/OM^jz>e5 (dr.ӄV7̆a08-@v*;Enm g"-WԟMV38*xAkFLP~ % |mvEɦR&J `"֡qGw 뒎#R.O}YDla/Ɇw{d"1EޒeaJHi smUāiS:;CbhNUgp`1jpM[]㷀Z*"{+ 'kJ3#K7611xԐnm3O- !ΤMlO` ܯ{k T $ܪ?KO {]d7:N!Gi}2zmIU{sM`yt Rn7f8Kk^^:VֹWM ^wMm2,%("X O |`**'ul㎞ j3|h2 f\ ZOũuxZkg˰GKQٙӽX^ 5c>* C%kڒ&CǟqQ3c;z, ([`զe)+vl qLd'9t=ktJY̘2o}}xlbEV)dX@i4 WU^&}*HNFC6z.H--̖kY?CP:蕟gTd,I 7 X/懕YId "h>l4z>И1 7wKCQj//H TD(2 XS7DSP(]}u vP`지ιvE NEF(3d+--IN=6G)vAaqZ}L0kcR &iFOSҲ7»*/C|u"=.9Adw<^R*Y<}uA sk*lN;_QmQZ wk;KE1H_hx2Օh\3i+J?~ pL]?|&Np4BÉnNqӬ/Ę26^|y"Q:U=qؼN-Б$%mdqBm4w7<n4fF5rƕ5QC@0,V`Z1'AMw[F 3˂]p8k$~~JEp؇> ^>ZH 8;&OL=p4s/'+ZtZɝBS/\l` 3r\#[+]6uz+PU~S?q ȑ#t/d%kmAsV^Syd<4ꈜE@fҥ<[t#su Vy5SP04|{pK.AtRFE=NʓD#j{9 q;pHP'k?nF[E1|g:M#Ӥ3QK,dPliEg?NP}ӵiIYWyR!+H7ht{\d:aJKaw^*I"ĭXb nH# \x:sL@_[|Y/xC^hM+RH(SA EA_BBt%,&!> |!Ij@`[$9sr qu0/ݹ&I2; eUlOHnBuIK6o<\ rbd-ZKp=e}o1vc v=5 \x:k6fh9  #Lbv0때lGv|Wנ2cprOt7v>q469şw;1i3K_^(׵?Ifv932<:Ǥfd7KY\M6DQ7qz_M0c%m?*BϑMpwM'4 *)}"74 :Ds8NrLl5. ~cm 5L+a>YKFXm"-ffn4RЇҔA3s<*zȡAbCC~/ #.Eu$~Cf}16T.挫!ܶ JM.MS]KzS+I s mJ^ U2eYWA%H D3{dF!-=n3vO^y6AR܃h1yg-*,L\׷Y^r mm\W{yYI IB=iBAYhU"׆=y^cU WsΌrykTwP^ƞC~WFmA>k%Ozuwʚ1vGziZn*7\< bOJy{˸9˹ͳMauno٤G6x@xvHiK;DD3 x?9rYy-y fMķyD*oAfT{%]oǹ7 {峨6B64I7UcJlXH|͊PTE=Gt&q JU`^<^^]ˀR+_WzFn;Y^o5v :0vU~oϡ]#4ʞaP,A;'Ǯueְņp6aw\JlmHM:~LE2@:[Jq-1»WB^ kŹU5* >А.΍mʲßHDk4 ,~G_#wem'"R$͎`p v osp?'XE :DQkEjRUVf.\/j2| 2x:DXj=_:YZ x9tU[gQ|4zo?8=Q>ONp_2Pܤy.F|&D;v_ u lQTS]#r~J۶8mkW!Q|u:WT1ڈ("䓝34S1}>Y:jbȏ0.a9LnH LfA+ $5IK Hut&t$P(H°:NW6Q9sqO> =Tۘp͈l 9T@?;v!oXe'\)vO˅y' +,')KNh`\,afٸ5;i*f$}^3DgR?$k,LnOBA#NI~ȭOY)^ֽNIA@%}i[ -WZ'*8/ԡ~]#VЄקKף Ar#쉋PI_fz{ ʎ"D2 ށ e_#oj޲JзuBUfV7N;/| D3ի=_[ BvKUmCKau?W|&ͨ3@aJ^+cʭ_q !~R--=}.FDl#ٙh#,qmB١H9jTQIϧ` cc"B/#QODRaHVJ=w7˖>o d鯐gv aD`S?7֠\%ɚRc>Rjf܌)3.웮jm˛Ӟ *?JC,I{s[?\ퟐf]|X:%}b =w?g1 '*ri:G!Z5se9M`̧JEӓu_Ш,F "TG4V-R[j-$4_Y z_/7nGVҢ HZU-3ߚVXHC=E/p`O7)=6 i!`5 '4*u1س,\z<[ӥ˽Zت3vRJqqrkٳu=#fL녑db +2ߢX8s#h d3A۬>Ja3pܷI}O{@a*,̝xOd/%1 nMO70FY~&lQ4K@P壔^x-nd]B)^ra~b `ͻCqE\^ mUL0PtzPP.0;HV?shUel:},l}wwu3OۗZn!Hm_9]*i-w]" <g[n|,"5BSB>\jTrUxËP 0\R37 y]JөLD74p|ȚtEtSXp/g.n4B]ETh 4okKnXM!"$ K7<@ٽ#rls.TsfH)mkZ I %>y"@H׫LTG 2$Da^ v1aA+ OL~;xNx/N~S5|??UHQ:qѬTۼʨ<ބWʁg<"ԋ}m೜{ktJ[$TeKKho9@6Lۑ+yKY<:g*szYgK`Dhu.͔KDdU:.Md6穙N[jԶUS#ťn N }IBBE_qR^ :8̈́~3 狀 #NP%hV&ΌsJkCHenC3i?VǨUr߻@&N(wv6sg4s NX! ՛^67t۠$PJ`ᣂHw :~-L;Q%ff^.Q:&חZW3gPW:/\[9­bϫR <} 9t;?dž˔JEJS\ :d=2:%^\9.ST3i]rf(,K]XBGw^  5YSo[,iya䌞!`  `iTf방j#î9 !z4r@ <ijp>c#{!ݽwT##*nFD N5'D[?2p]ϊI29$ϗݛ_/ðhaCшl.nRFξZ Fu 2ʗ͢E5s")II?#4&d?CF Ӑ`q.-ucfeb!;}8JkG&=A2L=cCt꬘eZ;,^ԉ 3*m2@d)֘YEjUݟƪoC44|y^m JOga>,WՃh( պ fjh# /oqr]tZV'ב' Vw"?`˃Q4VMvVkk6K{4l:rKSA(|wqaj2R ~bOr ^^А:PޞB} z@xJd垅$!L$ڧYߒMGlVC79L+39&QptD>9yyn70-Iq.(ꗭg cBXևk8+r2ZMش> EY*a !Xi?Z,uɟQFW0N,vɆ;RW6 VL??".Ѿ@5q6m r )ļ tO8[^eb䤑Z!)a:Rφgكe'32d̚/B ֒!)kՀblm_\GxqU!dDe;R!מw9_/67D>*`Dwݩ׉Z [)+q.B٫(b~qW+^_>S<&:)7u*W{a? Nt%(xT_(؟!ޱ.= 4%5ӹVv.bzhcjUJc`F0ۺk6F-2䰂XX`;i ? A|Kd}.!'tx'YÌM5sLm}O1N ObUPͫEs=b3~Q^(dC{7H1?C~`ǭv#o8@kA$aGN Aݿ^!J*B6D >tN⣈[Nu<@;LY*¿nKr90'hHӨ_7˽s>9D'a{BzWyS!: :C0kP BvG t6z0<,9"y}3RڣiFRlۗq7]#ͲRlRìd2jt"f3Y' *^^ƒ0M PMbb ++ܛĝv}Foa]AÆ#N[Z p~O[(@~T#@b!x^51ϩ @%;-nV#I|./JL1Jbji/ahcO׊"a/=q)0}ؼ>oW!cPڗ" ԣuM9]ŭW-+lxnpZ'$Poֆེ0?֑%Fݮ4NzD8`ݠk PIFi 4)NZy169?%N03ܞ[bGVU EllvuhX [So{3C${qs1So$QBۑ- ZLVC*+\Vkt?ЇV!W(%&4]1Gre?0x&WvceW?c2vEbr$4g!}kbw> IJ]֠OLP!}%KN֒<} EQ{DEd1%4ߵB}}jfpR5+g e^QX{:9;qo<W%eI)oohB"Vb."͓B Vo+HJqsteSLTx쿜5l`"_С,'eX䣨D؅uϺH<|Ү${K#瞧}tqbr ~,8{{죌Nbf)_OXG70 Vx' hoQ맔jvTQEgj]2RO/kD5վDL"`C, ,MG[;I'kg._C9 R~b+uGA+~/etmURG}8lBN:{|Q ΗF`tK8_qX$U]9{*4Y붲 ң& }z/E9}T*P?m1ΐ3m"ʀ>wnR`oǢxm V.F@0wqMދEgoMDl閝"mJx2&oNA@3?YmLLү%hOP,j1ҁ O UImY@'@E2ozXL#JK3hQi2 }b(whoR @} 0N2Qyn$xU5/]uʨ"FU]&P&\܈|v* f~`qգ?}G(p?Ib2WnǛ=c0_]IHC?p[:meaAԐ/@ҫڣ4IW:dq yC FLlYѻ 5rh-G!j): Ą?ZY1Һra& ʄ:zi?jz ~Îat֑rpA?,0HTwG;X0B"W/G\u[ a]B{9kyhU8>nX|fZeۯ\?=Inߙeg)^ ;ʬRP;f@>>+(QFއf'JȋlGse  @ wtAT 2mS "ڒx okhG = '*qڤnmb'X= RX{ؔGLV 59zv̞oF2|\|2 9ty)/d eZA_(ݰgaXV\>/e7b}p?>k|g,ov 4E{ǘ,|<[x#3B09pɠ%)x2!)Ŕ0%+i7dƫ6qD@V6$(%ц7RT῀I29 ;d K۪)ͥr̕8ciK6 i'2G_2԰xxFn9S|p3%h`FVuUr*ø,!⌤'8y*K4cJn"B(RpS4c:ߦi+,G9VNkciA2tʼn{YlgZk-wlٙ9TG*b+OĄ*~;}\^Gfwg ;Y}MV$^ZaV/;"ɞ)^oCQR9AA5ugo5M)PA X=f1=6XlFp4dZ ~yaDODWZTZZLjbNQBE1{-O!a xEݟaiShF#W8!憑E\y'h84"{oy#΄50ayM82qOB!]uEທidJn]?M|y+p cF *~)LonMw;DgW>f.t#Yl::; RNM9k,q|ӖXX>lpj%1!2Gչp|ϢW'g^ooVr9+n? ACJd+m- ]^N}ͮKN'<<ƣ/:o]Q6H@XP z{9\3G9H߻`6t{&=ʽӇFYC .03Jw FnRAyS\#cIɼ00 . LDW״=3~ a7{Aeﱂ@C Jkjbѯ@,K#%s u) vA b]~넹=-1#~~ൌ榌ʇAqxE<9_\PHu~W"&n|ɥ?M1)XSY ~B`dӽ /w3 _@(0-ރ!FιW+۝l*[ u>s!6ɿU ?)d/DX˽N*N+. ziY`耮2ҵXSZ{jq)E;\pV`5 sAkQmǚUwf G|p Ƈo͖ˠ,Gu 𔅬'] {x軙_9)bIJ.[I|yC~Z~^T6_/Ob#>FtikH㡛Dݾvwc()ĵ#y{jz3 62ki8lfJU-@zM):P53hP^n# s%혥zLB;:jinGwlp4u)]Xqqs\2Y-GrډUNeia2G65,֕vo+J=}Ќ&IX;L!h$!;XC>>nf9^ gP ef*:1#{eV jNj0Hkh@X9GNOp0% Hlq Q\QķIW5P-/RE4ߋ$}ecNcr8sH֤Tf/: ¿QWt;~Ρygm ;?0ZFxbcke@_nlkk1Z|lu?.hav;(!H+mӔq6|DGϪ.fle)Y^4ᕵu_Q(V^v9xߺe&v.w;CݤȈK|Jn@{ X ;X*`i۔eYޗTf*.xqZӎgmA%nŷ\ٿUNrI1[ao SԈrZ[ߎ@R m 8JI=PmϺxABԢ27Ydg?5p5t34ZIazHϣDv[9n๶Zv\~g\Sc𺊍e>h!sf$Q3Mr-@9εphveUO]s/&"j }6pRmUb9﹠TEl}0W`EyZH %"դ̘Lf!{yKt$уظ[=7e~7G׆ߟ+~%@^YkT܀Qe1JCeGkރ>\PqƧrv}o Vƅ5!+6 #UJM!Az/eS42k *8[]姨vE#(>oWKόrclZ5H/hߝG|UJ%u䯲I,Lt=y΁3 K)R?'fa&/h#q1$)v4SQ(VxqD2;}G:^v^os>7nВu^ֆqrO>z/KW7B"W1#빞&m\qfL';lͼ1i3:bƴ󜃀r%XKT̟s 1l̋'U6Icp+Fo=h(G*6}6Ѡl}-5dojy׼aĦݦsc-6S!kѫ( Ն!`CEfd2]}.Jakf*W/Q?*uRC)h|E3WJLؽ|Ԩ2NtH-~kwH}w4ӒNB8ܼ۴ x'))9fDe'ֻ1h?7)۴C7k+ٛeJa5PŢ̶1 q:`ȶ)M9RC8$I;ߺ)YӤXϖ4a# 1*#y# AMCV5pWР:Q7Stww>R3&æ=e)1F8lkzX)6>Ikd>.SH :bu56 e7)+Rť\bKDWV[meZ1\Nat*.|e[tdzǎ˘R8DP] e$H]󒡅UU9ӛ/}*N"S^! J\ &^4Ѧk"<cIaY$v'&/D6"ZC50.zrFѹK XtpDop Nee_^sW,`$EGZwX&r|f㙺ٸi×F~}"ۙgދHgu\ oU\~N| ¼U<~&P’taiiz]#2^#?ѫJW2#2O:kEhyEt]sridu4O٤fho,2Zxk8x&G<HF -: xbiuOZ< n4oh9Ĺen椶Ol=kj3daqǓoW,88ӼSk鵶q I!cAZ[W:&qX ֋D|q͞8erC=*} *x:)콩]k+[kO m ac^zae#d]]s`(D8R' *^JUKK%psi d{>+tT^g՘v#Hnw`1~,ؕc\@Fr^h&~+/?( ,Jf8[m ٛf~@s }} (mtCQ `w8Y35lYSzU(~$1. ca2hŏ35MA=)zpt*uaM>[v"H:_:< (\ḰTT+Q'eP8JijY#{!xt# ׅg)̇5T .(VE+v h$6`Ràd{-y}%4ꮆ5+z-w ^P3k$s5^CݐLq?EH"dIaE6 Ek^~EZ8 Cu> Y#{?T9q7r+`J_Ҍ BiD CWK!xp< Pۚ}pTw_G0x1H4SruijAL\t,n״.h~wYwytɆ=9ӳVw_:b L̎P) h-[:F_ܶl҄8/tY6y:TΏ1,]*w7Oi,Cq*/PM=P:iNeoUHNE1+п[OcTz-4]G!;G|#6m'ҕt='TӎfjO[^ JH' Ar༇Mˆ#8"ddq M'IϧcМp14;62W6HC󚣝_|%n0xe3)rlKkfbPyX}ܲ'ˁ#7#>(e5*tܺ@\Ϻʺ}r,i٬M~GN.Ĉ<|+ߪIky%S}'B_!ۣ0:OqxN{3Z,k}G%&4|7)w[ qˀeLuO}3 =OJ^'}L.ۼ mdf?Kܵ P3VE^0SyE7v1U=me ktd v{OӳQ f0Tz]vWO Ef GܑrQV<5j`HQ&8M@4yX9Gќ' A;zOfY(VJ^U߻$ẃH{UMA|c݃TS>aqJ#)@Yg Λ{j$QQv: xfJ4QN6)ye("ǶE6;Rt+lx9hϋb.dSl\T  ,dеXeni{[L>Еp]ߜmȏBó#k˖ 9כQwqʉ= >ű>4PlZݽ'GZ-ɰKݎ<OCbw43rJd+hk<0?`9nI]3zn";a?k X:H{ ;6jB>B1BSU:48}lĠPBvr%aۭc1myXLA#FdI-({BNgi>dcJv\8L[M VqE % \P% )X -}4H &2 DZ/3Rªj:WuVD'Ba|C-slXSv σ gN'Acے?LV ՘); D[-zi'e&νRo[4|ggwLK BX(9:>fLi`0e7Ķݵ2*LI$fD`߇xq&N/УD xjKux U{#MJE[|_DaJM(=)jF^26X dL+yf)Er\qo߀ؘ8q dj%)""5a~N\<[BEIuM?[4r# Ԙ[j[#pՎ5ǶFw?]aYK`c&|PQG6tW@٘:N[,KP[Ppjm90=I{ !hv Բ.D,)={Mt6.YUSYc]iv6!:GkK1øȆ7Wicn8j݇wq09XubCX~ N>qlT!A΃!k_*P0T;eeg{8 s6ϴ`js#7 =Ҥ@J('MK| =''#m,POI +1e oLc KPP!*Gr :>?|TJt&Y8Q-p^֡*3.vGuS g<|곱 ߠ_4\d>,4fJ@(1 f=|a '$J 7_]rPteݟu R>bj-~eh =Mޝ]g`CU^p d +.V%DAp:LQ47w^3l8+ƚdOґ_>~|Gi|ܢWm JZHw@_HKnF\;ZЈ5xg , pmTwNcto I8j!4KnPϯqt #8Quj{&RV|C뿞V>nOwD{M:7hgHnEώ/JԆP1-SUњR@8B'y:5%`c(.t?bzݍkl2uPƹ鶠8_3QZ]V|,h8A .YUwAXq 2cSSgb To3ɀw`/03{4!2~saNs00uo(7JãN}:u'Ѯ+zjg"* vnP~0a 3,iXߟ t  ڜr] j*O,5Ԡ)Xk;..'N^zOF4ڇoVVTd`L\KOfsl)#g7אX`}GfR;?ϯՔp0V)T5v_7)u}PhpXŌ& lS5_P4mYDԞvZGQ*uvhCk+2I) M=rwldyQAx s<:lRW&6åO1އ @o( mAgWoFh+^릋՗ ޔj ϙ#i WefPW|px(=Z􎹰U \$فj,Ɔ1O{ZE h` ;2tN#7`Y$J}9643+SK" @8*SB}_^""^Yj~Y2`_Rr r=n-ob0D䚪Y {:ķITe+Ҙ"kD\\+ED%fNF_d\0"d- j (Nғ$c) 0SI([{QJf sZH1gxN5^V{>־.uqv(o o &'*VNxdzh_nG!գEc ^=!8[O񟯫#F3W|\.ㅠ898w4QK$5`qm}yWJ073yKeЎf].6be(ݢCITB^SQG:.Ī%/r +}?@ܜ) _d$gQ!asCI])k-t7&+D≗sS; NY,-EW^1rC,b*t"ҿ+`{"gJ~z}/wYG9g/.Gt Nb -HjDȚ3~Qh /!QO/U_='+o(ssq[LU^2ε&nA+d)P}9C;8ֿzR/^~9nJ[BiquaT +#l>Ԋ˰Ud,XftN5S'0kzm@Aڡ9Eoj]4(Xa4iB+,y%XĈu}JK6jf`rڞ':p"+OZ(C[~1+g! -(& o^ɱ+1xIÏ"3!WS 9XW?ʑp x `rGa Uu]Jf17wa?`S5e(2@ѳmooDM] EQTd> ί2nJoӚ3vv[ c̈́N$R;Cig8O7"KxK01deNؑ1i?}x,<* jĚsȒɻT&oˈX}ی愫H0Ǜ4|x71 + #%g@ FFO?;Dplk>z`^uqsqW/sE΄gR=5LVr:BLڷn z©8f\--.1-rZ,3f@Y)DAsAjlpa1Js;iݞUɊV+JmEpUpzz`yi-`.o_hN@=>z_xVljB:qkmATCp]%8N(R{:fC"P.Qc~NZ$EZs]ؾ'\PQ{AsuTC(+n}w%צC>H UWpk&!lgE[k>ZL8{5xdlHr30o E$g\G"hAL6U_EjPTHm^["|o F@Z"Il:l^P. 2J: @I&*:kpHx p|Gb32Ʒ,tU^{qJ/szYD1[%@Ѥ{ f*ZW_?ҹk szG1Vt(lmOIT,cGGyx'ߔ^B7x+% ɨcUxSI9.P޺j@'q_wU{}wЪN0&Zz!4xr K#;L%OcvXpYns!TLtD VLQW!:k$ 3YH;({"4L@6K#$WF?v]#R7 mn񳂯&hxKA |h;V*F6"|+BڧIt t?1Ftb8Zd@*1Wt[2αm- ѿgNX? Exɿʌ|.qcyڌ,*j[g1/e0xvu08Ρ#<.4 ^qj}/3, Aq=d%2Ɇӕf`,iy`k2MԖxI Exm VJ:nuҿLٺ\\7>`HUvE?œ,}^bx2пǐ4e_8+@ݡ-*-KJ][5% 'Svgn% s2}1|}Ճ77#/ !'4 F'5zr`6E}7/#jMxJ@~gToCqbfNTexm{Dϣ@U3`LA16;4,P삚[n-Oe\c ҅?:8޽-SUs!oPJ`U;"(ڋ3QB[!w 0]ӃGA+ai4.}¹pZV"gQQg[ĞfreyѨdsgmU6a6 $z9",qG2ч8;~5;ϓ'w^̀:-cdͬl*Ra{3c9j .D>֎ly^GO;k0 syaAp{fuv1ԲiC-b*:7'8p/sZ4/9^;MР=~,`3bC6r-FS?lmCxM.6wB,~˭_zaI@1@$Z\UNTqCG^L Q63 +2c9JDB‰uiX X]%ǚ~9nP58)ǨЏwؓYx p/v@UZϔީaI^ ! t6Kt-)I@l%!wH6L{'ؔ}:%keJ[fNK_MU0ȋ'0[hDn;:R鉊Vms>ݏ^Jw/yk\իL0d{uBbCڒD K.\>SzG*oР"IqdU )C3f d]/_>*״!G.bfm|Nߌ<ㄦ1c;Ok B[x\ L4Y4L/s7=-D->i\{ L&…Gf&:Pą X9a|dz |BxbotIؕCqb"2=EJJ6X>=UX6 |02 ț$"=޽E/4 cztvҷt$㭃z G)E&&{$b ~O3ņ"e)a ē <% jQ?W+S3{`RunV%_ ؈M4q׵I l;kjl+MϚC|.-+3[|tqLracb>(6so)x4Ɍ!>#!# I4_E&-9z/{o֔aPʳpXam % D&9/ ?g'9KtPn!䉖||KjH\ M{ rQmX]@ Թl.(Z%sij3Ľ ` /&1a1ސ"ғLLf`2{q0 lΐLmҡ H@~3z'f0f 8j ͗F3SPZLOx@O5$^F'mxZ̽$O}Pp}۱s@A\60fX3(YUT 6{c7j^p2UGS|(aw^ +LWx,} ۀF0YWʚ5F4H]:/Yt;y6KDq-l^°B"::DPouۆǥӾ( }ik lW9kxsJNCՀ[˧y~J 1eCBjD*tv2*3\Z#QWOo]Zy^ M ^8bID F S.c4zqz>&} : Dʃ|\ Eq:(e .(Ԑ ( c>4];tq]G]$\0Ȱl9tj4)$92)̀EQV\?!vVSXRxHP?iU%L# j0ߎY+Lisj=~Xt!؉䥯VB \X]b%a \ t%X_*c,ʿ:5_6!gZIBziGkYrdo6bEmWHT09 nrlAMEJIugX>V{j1̃8t1|lIr> KI=esF.BJu){lP&`1u,Aښg8(Asb}$(B1; ygW/˴1Up,I-_ ]H_Nu!)0E!:!+Wm]PNU#|Ak$Af/hFƄ"Ŧ4{NUE'&fYX?-Ct_U+PVN1_$d2钌G3}2BG߆Bi,gkY92 PwU=#lM[{$l5Z3Y,p(plQ4u#^/l ݐR*AZstZ~폅!$ks'NhWJ+AioW鈲)B,CI7ӡRo`l{_W5n5Qrp =bs#J'SH6MCoÈ>RL0;ьuUy4J>8JC{gX%/" @"Ƶ3X m),~ΦT7=+B:32/j2yS3ea~K&(Ӵ[YyvVW<OzU vlA35ⶨJK kMcI1!=sWXS%a x7u9:w-ɞ΅]c Pa* :qvyHEj19& _/3dӻg"?MXL|,,DiP5ow6yCKb+fZʯDEA|| BBr?7*!5x%fgR_RAIҵPj~R,ߴƜ]=Q-%^КlJi8`Kk4E)|2 $5*η;1W]k>bRȮMДÏ)HJSDtjteuE}|<[-qU\VyZ= ܭo"].''51mPbڲ2\X8"KZ8V@<,.3ԓrTg+8&˹zcpO5zAK&(T]>@'CI'ΎFxU'!\i0%Nznj 9AGz0^a8kaw0B.@jt!Dx46D*=ذ:OMA]'uL5o h7jdP&ZK2u^hNZ]7T ߿W?Aδ5LƾeXRL bĦrŸH pojP%]_'PvxT?Tߑ{\ .S!J#W$r0VYeENbO&+*/yJ*XDNGU-"sZ̀:h3k<\JW/0wM7i ~4f25$ǯΎfJ~z/9j2RT|YRj^._~\8T8Ň8? 0e$s nǝfntYPPƗ851#9 H"4z|?SmL?]E%-F/cX1n$-z+ MC؎~5ĞF;25Y"npBŻ/'&&x!) M5Q kE\lY@90#|/v^[읈.7E g{]R_(z50F3_igWVPw94[gQd[o'E-}E{kĜ%FrY3T"=R傤O? xgG8{x--u7`8'Wu1-.Bn%[UHwA1-/ݻcAapöW&f|ysqxA67ҽά=O BwrSTUŤh}2fEq:B}C5#s I٠<ٙ?q-c_  kQWo1"1tbv?q?$m>:};MB9=WXV,[NJM3HQvTEI$geIiJ.)Tژ?$Zz[0l'XII'|~]] )G 0=J3-,1LPcc'3F2{ -V& 4۷ZE}Qpٓk[lV) [z%UHde"*vp`8lL?<$X{_M\x]_ ObR9nab(_G=fƗ2 ZJʉ+;_W}eGyFROÀ{[K6VQ*REnH"Mb7HJC eN;ZBJLYYt>}ǂx Ƥ^g=y  &}ٔwWɝs$`o%?%( yW3$.V_J3V`0inlדoqܹ}oD*GQ O%PAҀUB\f@$UܳW;š1se;h& +i3{/&cO!,1WI'iPhg섏<> N^Ȝ$Z7g@5LR?O(o;Zy=܊X.Ҫ[@W_P=IJW0IS[5S_wQuDʤ`s-ZC'!"'_n-/R:7j[n<_EwaoINxꂹE6 ǁnT}xq 2u ȥ hC̹#lM?sُ4r2hGZ&`'%<ͯu-~ɕs7[w:玖d^VLUc8adžɜIɥ˪ w)EAc&Nk!/s($2AHFT~˟nN񉟿 KUjCPoyqh5@sE;cgE@ɕ(cIե1$'Р3`_ TIIƈB^SΡEs @Ԓ0ΈZ0 ccn!QE{"p@7{XAmļbop)W^v>hm b :*9!kXCpD׿%VnI|,NY Z:݌zegC8w ΁1\jQAr5SXTvg(|]= `ZlYg9S0P !^| %Ato,>)Y  5:O~l 6Lˍ$Jth cXY=/sQM>rmlHKgM0'np@܏䙒qO$pm\-S'02!W;ӆVr}jl+@N.T>QgPB!*ۥm/pmBp`j$!K@$<} 2ShR AѾ9#K#רCF)A?No1C)ےa ^v5lL)5׆>hns 8p/tvCm J/~xz ֵd5֛t~?LٔCmH3.$Sp3u'H0 bDŽT"k^Ѣ9` 86JBAy^J+OJ~T긙$cl*.&|1-?<ؠF m$qFi"!zF 0㸾ݤ}r6^}G>*Q/ q%Qldeك6k!u)%z?=.2^-_+N:3#8asj'tGC٠p^ܜ]ZB!ŝ!hQ)2:6QydG|EbP_o1{= n8Mj3I҅O-4?}7A٩Cg Q#JE(q&5g9 @m4=F. QSy6?"2޸HS S'T7Hi h!Xg4jΝVv)Q]"ãᴞͯS!'%a*U|磻W4glfƍAd/'KnvzEK\v&e hԐ|"E9Q=B*:ot\P" ۷x=Jɛ9:/󘔃a{4|(/461%[mOa} _NmsYqXDl!5G"B u ϞzODWA@^0:X28Ҡ>@ H*@V"0UKfMScy),>b.Mut TF p7ar{PtPvZK ,phZɨS!Lw;#>2{J-n9gdѺc`ɻ`uY(8" @&a@Lb=6J<3jE_4K]9a.:ᆊDe]K76ӌpR{ /*]o]jѭSÖ-ڜS^K yX(bdExfxlŎQ)$[fd&E+(xfJ Mt}w Gڑl(aЉ)8 LQNۛ4O$]EAM'/%MkFl :Ê|k8r|*w}Eꃼ96GKWoFn&G%[GPX^uyDږې@Q,sG|+řRUZl+:erR'$*%f:Y Nd+Yh`ٟo>z; 傜Xg@j(b .e" `=4N"L!l\Cb2/=nv]nOsfCYᏹ<5@H*{UpZoyXE*|bJ_ 9<\xvE)Fd-aiFkoWs$;R7Ҧ~O-!ވTX4<jM5ݪv#`Aʐ /0b9 ܻWQl=4z-uueQny3:K/=_>i9H̙F"u¶(BP4TfۣybZyd4I=يVp 9e/ Wl 1}WVđU^G@^[+tM]AE.6]HgrcyE?rKAC{Lr;B^\'oI&!.>joo] /D^95*OKw̟A,W\$l/5-@iNvYg^h6N$ZG.d'ΰ ElxO]R}ȏ)J8q[^ϪxBh>RoN)|NbXe;_:em{;xN5WשI zU/Ki1-|&OLM.cmY0<1 !e0zfNNSKTpKd> |c[/E:81f"; 5wS/>KclQh1mu70_Nɠ*w:}HRMGl-5+t aƾaWs ̛yEY\$x|d݌ϥ l.Yț@pVqp\\enDjB%cBN;n0QF0H4ʝ_ADx8:ٔdHN%HE):<oBL&G_VѨ/FUwo&5`1Kci&="utudlR`@!3֝?= IIUbT yWge>¹>xQѮPE,DYFvTBwԩ2a2@lS3QVr)㬡'QڲrM\Qg$V>%Ij³Z\ '"ʜj1a%b{ Y-ek:ꜟ"^k7\$x=s^v:r5N^efӠE[Gc~BQMS%XrYPj>iRRe!+Ћ 8(꺛0ݾP%*k^8șx ÀXBڳR@WܧOezU2=[NVrEiM+ x RwYΠ935#,,x:v\ɿgY;qʃ{az{\:PV,a"F4AKOJ=bD4/9qj{g 3Aɑm-fI?s]s jLb:E; t;hmɉ9 2 t&:q@Juad/^IGn^_+$##[G_7T[|l3nM7EǃA]|؉T‰2pui-7D4^Y,&4NyR8#=~S@7#5#>y]G4SD8~ wD(&_"7V kU{D}})<"f7gI%[xR^J %'|a}1TEϽ\{>2:9j p @+u<;.E;QS*-`ܭȔx9[7+,%QQ%llbG=D2 QU1}!~E o>̆*5̎vC-Y"(88^.[Th1ç_*OM0gE`+RaKYLaK$:rJPji#aEzu4P釕Ps(KJӼjTڇَ[%۱G߉* K.`ǥz҆`zlW"gh]Dtm'0+qʌX|8#b4]=23CD`NƊepڜ_LO3m|"v\90vפNUt\|ZuI;R8P,F 0ӌ-'* UNEk]+tbyISm(nS ۭq\CIy`w<Ӧ{pt@ɱ]AO< -ޏ?mbـN۬A#(ڳ/G\1†jܾwdU'ZQd@WۥsR&Kr*QF͚L`ضa* Q}a$7Nˍ(M$A t:eiy$H-l}9OVksNQj(VΟ{S)V7qv $.cÃb)DO֣ͯMZ2[%46B9,Y(qE/*xȏTGl>" xy@,DzHsԤ1dF!rI>+P|d5LC$ Q 7Δ4h*Yo `VL#;y`Mn5 ew( ^W]B9A<[iFciv>'$(44Q}QȶgQ/r)թ`%QV __X #+m )i&[› PJ t݋呧T@}h>lΜ/ұq٘dтLqUU'SToW hڼ9Ioqz|Â)Fl{8wۙ.P$C0sR %dؼ֙N6M=JF*9\Ju[2_z9`c_p\Y_ݎ/L qn"@;fyOym(W 8+wHÈʻK4q2MSCK. LT7< d>An=hֵ񥨽S 2AhvJm Q_ 4 /ed@y cf7Wq| /GNR)+p6_]//_'4`(!l[h0m+dvk}6_4К??9"؊l#ZPkp3"SAV4'Y n:eW3+73e_<{I8F!"V|[DO|ӪaZF yХzwj+:\+. 3%$v;8R2sq.z"ɯ䛿x}NHE6[yQ*lR O|~`(BQi2╜Z%mr4/S\ K=.+3nh=u3iA[4a]t75n/C6f&11bMg}/X9Tn'1a =N*11-;' c4M6HRJE7V ^(b?k_e“A=?<mʅw(mTc*Ap\Z.+$JԿ*۠rU2iC(1gW\/#ފ1SςevCTx/X $*H,=8Kx삌 sN;[-=_!kS>:iٜ Ńu3+PVRLVz)TI% eKXx6Mm*C.,xoms0R$W$.64w/t2UEsvohDҖ _ Bi;:Y.`M4H 8vQ,p$+4AE_I8CyuhTc|g{X:,.=ֹI ODRIA8s}H]c ^N& hK!'9O<{N8c8PVʣAR ⒝-gݿFSK{s,aZP6>Hڎe›97Ha^:r`Hf1FųtFwvw\a=L5>WtU7n(5>M5b߶-Y1c!N>P[]M%\ٮڴae ~k8E쫷 g~@ĉvyt=,8Zj| >YgV=x`5 ZbX0{@A[ʂkS4d 4Ǟ"to5^0pJ~[p0?9V'^üXiT8}tl1!@]'CGND>kg ~#WazyuL!sD\0\"[(xp+zQG b}$\dq4UgFloK[¯;K3Q=3OE[w`˅{^mpewx@@ʊ*Yx "m?>=866;aeznBjy?*1 @:_T`YgqnY7/J(MI[|؋+NŦ7\/*;p<^|Wʡ(vsXch !5sA)xc%vϛҔ0{H.9+'NJedIS}l=8J5I ē 犠=cf1dZ7z-uZt6Q zSS Em9] =}docF.UMEmD;a"5,m2>G 8=&`ղh"޹ `RU?CɖeyuzlƘS9&agӭ´CEcUo<|L+SB:pp~1VmH criW 9SF:btEds2!ẋLkBc^ Х<~U^ gtI}9P\'곜?!8 яRJC?L37`5ו8!tlGWxҺS5G9nr^zw[4c%K^e%>n&ߦ+VGy.vImL:̔ڨ wJAG5Q2,N+죩cѫXBk|Y$q'!AF^rSDI{+POv)CBk(Ba^&2QSh@HK8 @׋ A0FN ?>4Hzsz_z 7c* J:'mUoz'ClȮ޵mͧ~kў|A1Uog"d \ċCXޖ6(͛ x̄/2! JK5 d*ūvr`F%H<~#j-\h1 {g{ pN!kZ~7]E-kMwӔS;fBgBϛHXP3x h_v\;ך"`5όm Su7i#TgVDyq‚]icu.4.bj&o !6"+AWWLW;@.scY:m=_> i> i-ɆBKMiX4v %=To |CLjn_B֊ģ7_B~&~XJ/-NqLI] LqN4"5U)@ /X˘qLCmZ+ EjVDef8_&h"+O_+bBA֛ZP~3v+Wzj&Y&T:7EjyoMuF)dIO&a 7Dy+n*T޽N$:b$Dj!F˜FmCÃZlbp;-^dqUn#:b?=gYn}>g ooKɵA'W\hhdrpPjpKi1驗Pn'O?1ZXy.B9LS{w]xÑuudœIDvc&:0t,~/~j}$~IhbK7 i]r) / O'0 J<'RQmNVl\ʩaEA9H"r/"J {~sof`%1};1t|_Y<Vl^3-!ǎhwUA:vBD\Kf aڼxOU{ aP\Sڼ%'_*HOdcͮt7+DZ|va\pÞ, LwB\w?~kބ1b*^-` $c^̸XAIdD'_S 3=bU_:; ҳGBz#@b&9WT\1)Ŧew!A!ݤO0uoT{|N5+OIg.Gjn $j 5U!fG"#Ʋ4aR7f4X;#F 祠&%$u>mH cu2Lp9t"4lAKk] jJ0AU`C Mۥ #58zFɶ8.Jc3]gF@xa!WʘM΋ꕊ WpQVdc2X2;;T 'sMvXZ:)&bs^7 wxG\!7ݚRЍJ}^KCѰYer!.cO_ލ-UGK:,T!t#͗5= 3;m8ςwg!E?9aրb"yz.DW#/"}^Х1P6'Q ޞJ \ySVl{,B/3̣Sf:J?wV`"φUc0 џ (T:fw0n*?v.9Y4;Qc2y&V$$4*bܓc]ўr Q|׷364#10vgk{ɵAj7VjtP㢇D?t"\zgC2e~eЁi/jRZ~:Hg.Wy48re36Vf-![k.UBzSM)T4xAż6L#tTL~KX Z j*{|_~tibRz/ǙFt/oݎ2_> z@j*ꈞe+Z*T$-c1dX+Pۧꘐ9h]WLI %zw KsmmY+ H ,( 3a|Sl,y&C?aRgIqC7۾/ 1beP=eÕ8b;l>ʄr܉iqx_46!Մ LN',QLNJGݏת8{d GRzH*6;dpD-a\k"x?ZONEz鮡&J=W AUd޹*ʺH5v7,OMJH}".&߽r>9Eo!P|pD"WW N 'z(C fn0)Wx7)iĕSҿCAcXb|Ek =;eynǛɘ,~YSϻZb5g'몑0T۹cA@y WM&+)=x\,H,G ) &wlO{RYo&|0Jq>_D *F%Yطԧ}(* )%v-{ښ~akc.ca-M0JI9ZUOloQr3UkI`# HYWH3ÔڢwNZ~z@40}[q\+R[*W_5d<>jsጰ~ C_~D ? Fs dV ch[^SH?'1g(my-&Ɩ{LU7G{5 tdȐ_> "z0G;Yv,ݶH=5Z<1"Eu;JE@x2QB[%3WA>V%‹j"3&K69*.[ߨQ)^Kw]EﷄGodMWW5-v;6C.ȧ<1 ]k,2uw{Q"F~XLT!} 2]"ã|GyoۍVDzZ >hÌCZs~iyRd],fj@d|t!7QҚn^M_ϊ{n.&<՝<_`d^SEG/̹(ʘ,߅yt0%82kQ޷{tv,mw5ma"iy G6)δ@%crG +6~<+MZRu},y k=Qε[ ߞ0HuzQC1|65FIq]*Z^fpf`8W{&08W~ٞR­0Di_,O\ X<,nsknPw5C+%TGC} e!QђxGuMu#g+GyDzPVntŸ#)d /b|7['@7j'Ng+! ݁QU&C^ma+uWc;QFSȠ(X'lǢ;G2?ݚZW8eָ]>l;ܡ(f>b!Eނ'z_&:Ī]_x *([lڇ'dݗBsb\Z0M OӾM/@(m)w>#%!.f(XԐLSuHd( {l_-n %}t=]bWhE@aN9b-Z+agR'3ž:Lsiy7ǿ}Mr~IJf&UW)쾀5=",S@8QrX1,8; CH/߯g)B}Lox|"I۞/bGR=17JpK&EG -G2تngaIj7=Ik8Ľy,v}Z,ON.K^Tq#iɾ@֜@)4rۼ"-CuJvkS *=k\ko~|Ro=(мi3 i9Ltz/bQ7{nd4wuZ\;9z#΋25vI|\<2F "sX9j<Ѥhe~meǗWW ܎V[>'./ׅէBY&VNYE%ʉ¡]{/e*]s5@#G 5 JJU#)v-: iw1/ourQgc X_^c3?:elr 9+TIaAkI) T0:Y"`Q2"){4Q>v=ھ^ݐd_#}?H'O v&ç֗AGѬ餆y^l;H"'&3q,gM,tYD"B A6*?Qn(uo2^Zf :1UX3Onʩ_*u(MϓP-}v^EK2} y6߮2-ӉKr_R&A f/=W_,0vQ73+P" T!yQ>F9_dxpX<#1]báqϐ4Y^ђ߄EeZXN%_ͯkPnn 2fկ4" RcS'ʱ׿zaqSA`q3gνߊ% A\Z23ٱl⳦91 d0 uzed121uXf)2Z)]?"9[%Ot=3c|j[aj0td'űOߏV#pxR+yV d54U꫓^/s0GJZj}343}5엄߶iA p!5bMv}iU]7qF? ,!I0ֈ)dJNa57?$? 8[0d!)k76 n' e7]b0>JT ZP#ќ+nfHR*YIO#Uā@)醋!g.pP:zF" B}AiwW&](OȘlE46 $!+ ֡pOd#qa- 'C$d,p':`V%ܴ@gK c3R] w;FB Qw_l0E DoVa_7i MegS] σQS3gmZlo7a+&iEJ+LmsWP r@D䉦*DAxk̽p"@l^<@\}ހqI{dr:eo)ck2B"(a/vJ~rKهN 7;UMNP<N}ύl$ z.7?(茁(g>TZX'+8J0.У%3K)mE| qbq xt[$~޵ ^BՊ:"~$*r Ͽ@"5]$Ho,'_Pf-?ވsU fkհ` g} |MQoz^C:Vb9A,ߩ>g.VȹK@T^w=\ǿU7V?b̜F:Z1KN $\gia|m)$44 @~!wqCHlc5+8n{Hry;=6W?kC[ᎌi!! # [Vɕs=n;\{N×$6Ev2ӝP vLj47iWe/\PbMWd6RGt(j$a3ސ%y:W;O~R-ywuAMGVJcò52D] ΦH<y$kH;Ru$hxjNDAUw"344jED@lo SV 0y@IB7@ŻK!t6[P_HNCgfz%"fU=_UtXc# Lr&ꓜ?/@>H4#p"7k 77ԋ:c"wTA6c%p\ճT u}oV>!]/q&%#aq67w#2aإv`o[Bf8H*mXOT=rD骽=Nx]t$ c5Οp)sbSYnԗsR_Q: $EBk 0r=-&%M *>^›v #C1NzT;bꊐUJs -c]ڈ@$27&kk`󴒏e8Eo vao{Y)jOyUۯ"Q 1\<Ϯ˞ܒUSvTuoA 9/6g8ldGxII7@"lisZlmNɧdĘBLUEi\xMz} VO?E@wnQN|&\cjA8d˄MrbR_פh4)'t~qHLa a&cKkY߼Eǜ/zdZnŲ?>z>3 :- @"4oF8B^E|AF]D=e `8E=̐ݚDU)zaBO^+EaZfu&MoɒW M^AcY솨>(IR╦nlQ{M7y%N*DGRI'@C (ni |Ck1ڀ! ~QEriy֯ ;r BẸnROjW{医P|>4`8b?x*&lhgJi5{)@1Z1/ jֿQD, ^jdc7_Z0kƣ&՞Ce|*jo_@nˢV5cؼņfq Ik30h2{jQQ!=-b])0[`a2w=킚TQ Xꅷl]|[9hFqb _D$|Dՙ6s6لc`@ASLaGetaYks'ɬmD! avyd%V.ŇMdGzCgPSVzq.t(&֧sҕ&S2_q.񔨪N]Ejc}@f=Z²/k^k2IoEy"eS 8 d|`XȈ\uj^ Z3R7`SyPo z0ayO@_nɘ_CQ"T>3/üLBC;jE} D'H?'6 B W9u$_>fz+~j@˺ '9F畨^'4r/HCUSuxAv}ȿZmQa9=,fB2f\?yĆhI;`| tHFKYlmq;-NMe?VV*(xC^k]~bu uHD27a0^p*&k.zpΊ~~zGX ڼQ 8(Fs&-Z',GÞ2q5֟:&[c7@3.M= i GUVu6 ۽ ;f(*O2O0n> KBP{cnD(y`;%"}xCXaHq݀aDdYKD"wVvk xkIPb iBŠvNX\ ` a^k=n/ZE`uX%8I=P}|c6QX%&Kfۯ%HQ񞢹2mWWT;􁭬5,ooP{slS3V,vemRqA.dyRT8 "B:V 5ɽܢ3*dafɰ0V;$݁~#lk/c{>ELgWx}Oڑ d! 7S˛+5uV?*I>iIGU9_聒z! ֖ҵ!XCkT+̩F M Jw Kgk>5?AkSyԦUz4ʌ$ JkE 3<}#Lw[eoLOjrŸ$.؋3M7[l qKUKZjbx\䙻.'1#k@5 y"$v<LD"̉9gLMS1(8UҎ`sosCR;s[H ؆{-_ď%)6BimlrN`%g|5ysEcBn,\>z)kt@oT;Ei8Cc㣼0=D塔2msa}bU;|/S/ b&6F Tʆ{T`TDZ5^l~F_g]~xy9RBC``lIO'K$M4\6X.iMI]ٕ4\HE[e *"+1DćyzQ(t"kEoG?BuUli)),ygeyEg-{ Y;Ql|Z "½%H0K\C1O-d=R/,n)(إZq'E;R|>8&Bz.Te(eP D&W9]v|F6ձ*O}VvprGZ_SdX א ]OUh8pՙF 9_x[-n]EM Ms-_ ^sYe*C-('2qD=^b,ESٮ؋mФr!yTIxEA1*ɭieAW \@2z#e ]?MDKhHi(RpḚA0iJu.N;d2fdjid1=7Mns\eZoKUYA08w2.M7'P(6*x;}ӦwL\^g\tibvJܰ!/sꋃ5\h'f&TFO9MNvd0M.Ir]W[?o[)< >- L^BZmQUYDK܎>d{DE__u"F ̷1J3ybON#2i[L[(_*|[<`݈b.^aH<΄{d6%&Grojh"gFi0VcbMf8\"GRLnsxRǻ^:TS h.^ 8*@lh!Z&m!E KO8]IGb,6@hdFI3k `--C|hRajKX7KS7k1؇S{`_V0W.Ȁ㤰^q S1l8cPFEiCD|6"ABt^K ]5bf_JeBqԗAVi 6ȚF0T{3LVH(r?50ET#m[j'q#i!m-=_(1m.t(eS+e3/%dN-oCy~QWT "fBY'(ЮAoh [!2pD>Z$naw~ 8hMJ=L+%Δ~m}  ER1)fDꆅtƬ/l|^)~hyYI˸ֹgB3X&IK`>dSV^Wz6.F#'^tfϑaa;^x:@~q0O覯 ,JȲ>Q߁MSNxvzatGB)ռg]7$++VzxY5/!PMߝq06 kx[(]VԷE k: Wp*wA7f wV^珿8-4]YR"ygSI8"^g?6%4B3siQ$"PhdV8RvW2|U!z9[̯\Nq<&s̷<d鑷G~0pJv-fuIşnqWj-pq2LS -05aY{e4NJ멜$Pn仙xdT&u4҇6Z/E"T3a!!Bj '=p3Ŋq۰?-~ܥ0]Z_:0r KPPsa)5y S F!0'a LxߜOuj(Dy?=ZH%n֜lBݳl?ɴ T,# lc?ӈ'vF6@dOf(ؘ>:>f쑕 W|uf`ooЃ7%,Y%1JTDTHDNb4eah4;hns_n&Ŧ@YHz ^Zvi'O {L&/5UҜBꙐLK~yVcS?͔=72s:Rt&,S}s݇_%#АV%" [ U('FC. IA(FfzN&5To%bgpz>ƌƚI;~ro (#%Ɔ4tjjx=] sNS +z{!Y Zz^Y!_X|.DfjHtڈk)H7Ug{0žOI?jEaTbNj ؕlJYaR!A i'6bwb2KI+)\;.ziPrhĢ1.p[Bm[4蓨znx6W|1㇫!Ƿ5b1}\ƔxŊ\`*\:BVYUVKXfZ}b朷@4v=<ޟ6Ad9`]pbz%3#mu pSnMQ1 0ܶ1~4<>ۘn#+5E F] 8@4qo[R+4`_W@T "5`{3OWmeRYIk+2:#:*o8s\ݭBmtw}+OZ#j! ^l?8yﻰ\ÊHN. iK>m]'qd8k pz{I Kت,]'^hkhݰPPęO=nSfp< ߃0a器dl:m{ɊVQ\οu2+!$)uܬC4~S[a1[q]; 2H1>{do`ϊ<FBfɢbf׭aYrgyϪ<S*=9&Zz`dtZl޺|`]gepD*\A(|iaA􂈣]oU1]dDMnP-Pe8O K9A(p 0gk]kwK:(fy%/Uʏ9rmޱ8<>{q{,dӻ.qKߛTUZV{<`{3"GJl{ 3(9$VX K/TsW) 6R?8LEb<~@ :2#l—_ ]lmUvxx7MGvk:QU쫱 q֮RA4C{ZQ!Cavg 5jSaUŒw]JVE m; yV:1)"xrIԯ5QQ/A6 @*o?%'y}Hm'<Ye]Q<p#QF:3Oc՞?v8h2փߺY{[h٭G)[R$wE eRU<)׬4f= Y]ZRq:c0 LΡ0H!O8_W)2NuueZ,LY 7>V舟7YxdfTSe%fcX"niW'[T,n”&Xiv|ls;lߗ4DFR۩]MAEe gixj.A:Yu=R7iXm@ BqaNHAө Vbiovʌ<,UJ{3,VJɜLg |}$ۧ1NSא}Y9_޴x M.zg`xs_z806"b& t%}H,^:R plg?Q&;TazVv=m%wƠ*SK|BSįY u3zg%zZ61 C(F';G,k¦q?X21,T) GA ?'sо{sלFP"ԿŜwcP~CN}Y]ẀVMh\r}ex"2 R&-\^e) j:H "-yLQ&/=y `Q lL\`sqC]CL4`=wVճxIBjJBqVLi+]68N,9i'V2y?atR{cm!p>':_oQN}* 0X&% NhH̩]AA2th]@SZG6۹TR2Zn[{]3"S˻Spz˛ @ XK%m[t 4,mݏ`AV@gB϶/"')!"D_} 3P"EJ+fke寉!msF. 7 Ei}8pX0 qc/>V@V*9MřF؆S .F3Ea PxK*h#36 ]ԭKT98Q0r+3*AJk& 7z^#ts._)AO^^hS 6n499P`|d|G ӿ Q* `'Pe5{oT[ʅ) E!`yReG;Hn[|FTإr y 'R IF# X֞:T@B  S 0feY~ @ʦVҳLW:,s2zRYmH;5{ů5D@"2U "Z"\k.$CB<">9{p2=)]am:%Ȇ+,Da.EcML|Q] )fTv +[1%bD;$4O#!LhVźV9we 0(ڳѴq|\ 3=MMŕ'gɭCa-D>=j"y/Liա\ZhxNȂ~V*{-e{kSAr>hg{4$Ȼ-Q_uAŪd!Ķr(uO·=ʸM(Yj^aH~^777wX"ס7j13b$ʆk+~u懏9ۮAbTE4[Եw0bvSTKH$\Udžd7ӄiL'Pj/ Ok?q0ؘ<Όs&u%J+'xm$94a_ zB$!P,k\%( ~kKq&w#5 p6޻f* ̯<@?o>yɮ: fO%7=~aBۥa~gg 'm!31GfWEND) V}{*QO=Q0sECwś_! $}(Ȏ}3s1R<=X|':˴o_Rާ/"NݶrEMfo֠@3JbLw9B%NGI/59j8n߬'VIf80N<~O f+P+ڢV޺/vCۈr_Ⴀ 1_<4WlJtϳn,G:F5,܈X7 8Jd{}{ڬ~W&3ߚz @GQ<:ܪE"!'wyx̧o|%裂ǘ'?@|A&k"ϰm LsijV-nCEcQ(Գ.x]QZ䟕&K2:o7BّE66Jqȇ( iHdJހK`()eqA+$?EviRpP!fatzVG]j4ʪ="J^yكsBi_t:(o@WZjIERtŰ%ygfAѽrD%yNҔ> dX+8$ ؒ>?-Tt\6f]nz s"L_7nbNRBFӍ0 -PE-AkZ2m&Mfa.'/*$(@`9ḍ {j}ؖ82H9v0 ;)PqƶvN)2D膄8ꐴ?EaQTS8YP터d֜x2laSéjk;vÑMlR JCȠ,WC)Wq6Fr!W 1ȍ']#jޞ bHV:} Af?x_ /#UcLY|eDK()ިԙ1{~9lMu8(F՚ï%B6s0\ h)n""f|8_b.[Άd( 3m'Dru%C] X8Ϯg*HȻA],Y>84ML_M' c~PDa2M _Sk+L:*4Ly,c ցgqcy#_ sSw]joߗm謒wq=fA@xhb޸6^mt@y`;+T;!w(pE}]ẃK8|֌a7}o7lWوm"1EO'`tQ!;% 86eⴋwo#Iuyh7?DvBdENvӱ~qp$'tG163ϿnuBB8;l 4mLbEKTOeY@.٘ d*fG~5PΔ";Ri)m9(r.kΑų 7DV5O \ftwf%頫,`‘λdĘ|3 ڑ ېkz.)VykRs_ٳ8AJ1qXT-]Nbk l2+;~WK7,ԎROw؁Rf@OswFdEh%1ABPZDA@5h,8ޅ=¼!w|K05 I+pZ/M{F,^Hwۅ>Dʕ%W&]_eWȻ'yVٍ+i-}: f5N2Ӊ8d3xQcاM 3!婠i]BKχbLy|G@q `a|E!hH;v!Bh拺 ]u._:R5cI7E.O1Lcmx2̜d8b&}!SIGmǹ?3kXpprҬ g_]}Z*v~v"tbc$ŐdGҔGV1N T7Qvj,`݂ BHH˰ D) {E}ɀA%30k僡36JYYlLZVH.2稈#fSN9wT:Vt@~q"L,*{1%a}+wY9 |SeVtNmPĶɯ టn^Ly@.-lbE3/ÜP 8.FJUd|N &M5~E$+٨ }['G2I;j'#}@hkuGİi X6'%\b0hg *_fW\GkNJvEgkMoS}Z2 st#}Y$܍9: JFJ+EݱBZk&٥HΟٚr.mTB7dM lWH̾ʍBA55%,II sxq_TPc'D'jpНQ- B3tr%yơjڛ) YvfZK>FFi1~]ܪ^8fA;+r,lV|`8aBUZ,of|z Ryߴ,P11;R?@9q3"ec%Z3&E[fᣬG߲RQ ,%9GS x@nxߣ'ˣu j`zu,_R9`Ќ!ݖ ဢ}LGeS.1TlNYWiY[Q[*TˉXHPq[(!2`1.Гގ',m|8-PAlA<~%=7oq~$J Juk[  ^Ƣj^5V(+}>Jn!pL# QvuT$H?x6',P?g *lgM)f*fYCoQ` (~Xl Y׷UaEpޙmRAP^-N ͈Ǫ?L%}ю {6v*d$REuyd@i|șB85jc_>d#WXQi6HhSZJW|fZ0KS e ZQ(s"d3bWiA&Qoz\TW6r:ˑedd )Kòs?k {QˮTtyc%r6׵oh?^mϔ#MаJ^, ؼ'Ii&a1tt joC zflj$S-au ޜY @lt.wf!T3D0 jIý<\$ <-EѾIvd1TN`{xJ"wag5 gB19&/I9ðUMAI37 v`˝ϷpmE?eoy88-:(QHdVDrV>d{LgZ>t=e̊$YݬDBI-Dmp{jZq8Y*ew #!"T-Ć]v^ I=0$< 9^:M8*9ܩ' ֆlTrF>\QPgX&c[l "%N38K&t:?O4/7Pt#C=wNLKg m~u]N7Ժ\ұً=dP32$md̍n*S᦭5]S|)jZZ+QoSInaGW  (O<*ٿRh#.R[IN+Q;Ԯ@*,(>[O'JSrz7>10Uy3Y&O=\^XN<\RBXaP7gf3w~KU顜r.7a*S6N 0$b{gh*$hd#ш5iqg4!P%\kg>,Ϟ};ofl V}M3,vƗ_ %:δ8/lϬ0L>H]I/ {ʪ*| Ы&kqc6oLTp_#9,#m=.qYb JHlb\HWpفWҟ%^d%ä~6|TgTz`?k[);}KUZoq[s2otȺxoA-ݧeA(Kh:?rLjj䷼S;6`H+6V,F*Oa-$*8ݒtR]NI B}TA`+*}nR-߂'!7i.4";ɠ^|m*lM}怜焧S[ TDOهw]z(,)ttAIIZ&E⸿i 2ZIS߳xa袯rLXU^Y12tپZtFArYf L ZFB&O}^ů6.!O8(j{ސ x}h[5yfS.m*֨R@4McġNzχ)0r.HjaJ. 7Ta@~ɀE^jNG$ؔd% /LIa4ҸKL>dT$Y8t'|9W4Sf1V!soSkRmqlB*hkZb<"l5 e5EQ\zp8 a=Ív4Pдm1L A^CEWm^ _Lto4JBX~GYZ;DjKLQ٪*VણDD!SboGJ]3RieZ;K]^u~ot<{dy@q sMg AWZ$>hKfW.筴f>F:KŒPOR:sc;dٸW+%,Jːkě.mƇit8.E0XGRxR)rP{y3rxR",, S}}hiW&<[W cҫ]u ze!w%ՅΐQ0_+NV}?5ZuLv66NV ‰ZQr{ڟFm0tcl+Ƈ ˿!I9˘dn5l$uOlS3ڥW#ck8 +DָoShZR%chrJ0Rhq~mѠK㿱3dfIJk^)Pp9e˄BmZ&,UԎqU5+.>[]cK.eKkI&Δ` cOLЦ+~pn_5TKFLGvˉ(Ļ_b9 I@*x4 ]cv,5@RQ5j9y&j)K u KZ~f:t J6U1Qڧqpz|\#jaAbcvwj1Mwb䖠\=~entG扔>ib10*vD:xZVSAX5ZfgnaCS,UT0f=Ҟs(kS;!,~J u?aqh|n2OwPp1 zl)7p;JĴY%p|DH 3 .lA ??gF}"Lcasĉ07jVjF.$`k/~ 23YEh;s _lft8`W7=fW741C|6o'4U0P.̸`K|öCP8S8p=5:tyULQKp%4z+fy|[gejс6,jϿ"SGEq&;z}#ݥ&&\IZ߲wwiXr12!@mKq.(pjFs:hb!$ĴZ%zyyU"l0)&_DsZVgSֈ o 2*7x}Tuh&5[KP6c'1|!5hXë;v̜% Z/5hZ5nKW+sI` + M'MX-6"qdXYHu!@3?.$JI͸)Hw34o͠#$sp"3rХA4"p-+9ك\vu`)!Ѓpkbl,\ϦjUTQD9ok5z U('"3̗k8jŒLϊCgVm@g5]7 eG*<@O'h2aݘȳꄻ7nM'epx$g&#(Ը%rF=r-Y(  ʜp16Z߳Z5WЪ|(Qxƕu]z4^}. XEنYdYL4i)hㄛ^F`ˑswt6h Q&߀ Lf v@SB2;Ѐokwp6)5r6+:13K0GVqܩ_H1jc ͦrF{[Kڒkk@Z -m0=;vtȳBo$\?Bx!@ I 3owcG`Zc(YkS5޼cr~ 7SK S\8TФ~NqC- }A U3Tg8M2_d#i'?c#&~5`=0EcXƦ$OMёZj#)N*uii/Nb&8_  I,tcGmoO5J?2ٌΓ|F>bCpQD WJy;W~S,oE)h-NI(v:ܨFq!2OCњE2M ڇ:10 ӇU,{8ЅEoYs>Q &\ZfMNQtt3S]ˊN k?MK\Āv&Rkp5'dj'!=gK=ٌvv- TWpOl?yVV4eOb[ :z '[qn}ɐ׷;ǦJ \?QL#R@9SK1kJ'f);8ǿ2oqS%l?:iUN9#~\#(Q"1w#P_NlVc'd~8GN „7zlU[se (AtśJ ~X#  o59m`o>+ĭWc$޳ ܅DOtԨ˟VՁ&,@jPug)|BJruSwB6s/_CQQDg dAR5#\(s`ޯe~rᇯ4 fs}#`G'@q\TX{8@,#t,k"}^pʘq7t^g WMsv+u.-)x*~+X9>56.\I 6ou*ue梈 ,pK;V"3_7^8~/k ߥ(^8/{X:14:'i/C`5Kxg?XO^Z_b4䕳6 !/>oBVW0h:?kFFI! dy \*`1(J;D҆"fdrb:u8^r8¼b˰NGsq*22zxQ@ۄ7y qMm塉kK (,jcpZhc~jIDNπ/vX {|gHIn׍BWIU~޻!#9۠,~ Ϯ/a-׸3?aEۏ#0^U4%0`x'C˓}IMV"/,jkO_]*>IyIxTN0GE@bA, GN[TEcMf c^/.cΊtL6u) ʶn;˖ 6.خNs+8+mz=})NԔ뛃[< pm1pQ]`8#8]a-M $gvB3`\_utldJ.X1@]] `F\j(ߞ+G%¦*m* r`Ȝ'mUIO[,x X8G>>5 WW ^ Z`ϕpǪ-$j}jUٓOk a$W)0?7v 轂cXfͼ-|m"=oj&)9F禼,6U23Rw -:cStĩT7,40uOb?0J OYslXciy2KC˜A{Ѱw{mz&͉s.N{2YJoEׯ~QClA*Yb-;ۍiZOI,PT ='hFЗs*r%*+wo]%L ԄgIy:ŋ+5Q3  &_h-fݳo >~8TJ!\xfinY2 g~nwנY B(o8 #(z5e2y@DLGֹ## Xj[Kؔ'I[]1Բ}VNqh"Ra-KCj/mh-yѥi.H9:'9=>3_;4/BF;ܡsGԓm'Cg# ϗucj& 6z ؐ~!DA &[ņc6x[ӦYB+u f @Eicoy9[&?>,F\!FU:ZVvSed1鷌e]tQ')0E } ws@̫kw6c<:x˿|噝ۙ8!y5|R dB'<)n) )6 <_8&Zki_wV*Sp=OtfS"l97LACyepY o]@tA ,A#KDo1 w둬GrGv 5x>NtՀ$Ѭ&M͹/uv!,r\0w|ڪ_Hv3 a{́AEux3VaȱwzG[/u$zegQ${' sCJ5dV舦sㄌ&#ja9}H W.2 KIE!$m"2/b)7  RrqKuZnGCtcsa1jsLzZߟL\ŷf.ӧN! ; x%g̍y4I8"JR [Y()Q4̍I$xch\,5@jEUT`q7Zur tn{jXז@Caּc67P (")}x!}4󇐺ޑKmˎn\eqC"9pB' Au%S@vfuSk5o/]AdϽ[2sX3|3 ijYMo'  jS D.k bt7BtolZaC)ƢNr, gY؂9Wn8C@UtC2[wu3Ҝx@[\r ~ ǐ+܄F꽻< 1m]p%"*EI|B;,~2 R| 9,H 8$m(a<(KL\,2Wq=L|z#)Y)diPLd40RNllI YsP1N&a50)-Jܜ-zKIS P0kv-Xd}v{ .JwAKڗg#ZVZK;$OcC_;#Ŏ7*58-jzA;\qȭז ?7Kdf8" r֒QO8m͙.XFr-3gDžrR&mB~o51 `|? dft$5S9Xhtk'aꑈN&vw]R0!ѱ* "bwLk򂽼qoA"+r-;^j˾ xS ˓![0U08)51U=3jr^MQ:^w!>!w)'-DCJYߤ%$#^Q6A(5CN aLmMFULz#_JLG,ox5.utA+)"l6q&XnjSˍg=":B%vֱ;PNiVw !9p\}nfdRV*y^ֱj635HLe(l} V|)#JU?-km VD|V#zTs|L(XCN1M{jxь ě81Fh!atJUQ3}K;1rjyqFZΨ˰~ $druBrQF,ԣt{{l%cTvg! ɓ.TZgpu$s.`#_]XAwudu],RIh_ Dx[0/'F$X @Ĩ6OJ0B~qx=zN9c5要wb9ΌAǯ8';qj% O l$Ѱb>"> em_f&fu@ipxFF)=|c:+m9@#nGvS<6 ݝo5Iss[`!-^ս趪lP ߟ!8] ky8eE1jddp̐Qw],kNӋ lϨLMkw/,{r`T~[ޱP<+,yp`#>5Kj<A_D)bX&:m!lk'ݚͣJr&) 69i#O)cun>Ό(bjGk.NۡO,lEӲR(P72e2R2;O9@nĵ E0&YþuyШI0DVE+5o^{az'äo?k4å3&<8)\v(¾sgU @p1h3io&3&.Fq~醄ʣy)Д?]^af8g^a1&C <<Òe"ߛuUWG 3U5 !'g3@]p{#﨎%U ϕx1N5XSҁ (Nx uclsI>0ԃ Y3"u i"@'PGmaM-9Z߱Ã(F޵e^r(> ApK`v{l[-0%-X:%hcmQޜ2CEgwxN/9.ĵb8.]9x `EFvbٓעE4xI+Ct{2b9&T^3 x̭Sl;ָ Zּfq=OҒ(cT&0`9b=R٥O&|+4BK}nS9B̑h,mwx, Wn IDu)Vx Z踩9Kt.rdK,OL57smE,ʒ7k2N`BQnr"4oUof,^|"}uI4_]A VK! ]#$ Y%[ߥrIo z]ZY+ʢQG߱qY_A 7FBJ(3jCd7$$g%Y- 5J0} 3WH uJRg? 8./xԖ?*;s|QH<5;v˥`Ջr.+PS5>[YB1R6>̳L%Ev[9oBkP`e{ZVKܧprܩyR:HB Rb@KӏơTZ~*B:fny%bg S_}E-\=7 OFMTgq>6(ה&vD8g#Jqcl# t-Wo^Ƞ%m<[HI= +˼-v=&So]P;'RKf3CGF=E.#Wy"_'&x {+r7f70cgPq㫌 , GO ԑjyҢo]f`՗P!C;q K z]E`u}JОD/uV*^65nNWzT3{J Ei&S-G| UZF\^/i{GЦ:"mwPPF2Nv&؝< ڳ]NW@?0ؓ]z2zNV5#uXʹ?#L.i<{m;DE"BRFokOsSE'>mHuD72bТ:id0W÷Ku$*bnXR0h59pO4܎ eѤ2\GQEE\eե!)'1&R%O ^G=Z'7Г"x͕ouڂA|,93E9B8MJWs1-MK FRrzi ~mP$:bs2o"h*:$U{x")0n{OfP#D J Lcڤ˞e\B MgפPAs{[4 5!Gok6dIK>C7,` 7ƚSƜg%J͹K?z 㶷ߥrgk(ԌB:TCg>HB=OZ C%ĕ3QR˄Jע֒r8,)-g녟/M=?Uw+ET0IЮ8TfHL=DRzag6OP Dƨ3޲.s3QH$A,!gZ|zCq n n,?j$0EO/7OQ97a$FP8$3R`|ZBxKYG)Խ_c6jTY/*:Oy״{,Nv?5F# @hoafeHw2:7v|r6ItC+,xȻ-?CDk8;?h<\:{)Ge(` 9;Z`t|e@U?ZmJ[_A2¯*<ڃJA~aq FQ_f(5ÝI>H1vW%K^\|# b . Hx3X7bNW:cqsvP#;"$_ AQ.: ;=ù6+os@fIȭ:"4]Lŵ;Kw0H?!՞ҏ&3$uD[.V+8-NQ@H L9CKeWh| /BNj8?3W# *z2Ο?O4陠::aC'_?R0?53Vߚ=4̺T.,x)ul֚(JW+h1NL Mӗg6Aw{NIhĕc{8:\Ba䅂qJ/bޚ~LTuL9?M6gАB}7e C/rOxS72$!^gIUs d~FK)ҵ@@i0(8i^BV.H\%k桂ikG1[7!8N`kQ8z %%s* O& !D^4R/W %Yqꏁ_~XׄTzD34wOI+?z7rgo}r#MA/jS'Y6U-"4!iյ Uh3H[fʻ~| #3QnT<MN! F'@vqk#M^bYmFfێi7H,)&0JȷC){`yi5)!'BkAUL856d&D@ڵfgTf&ZiSUp!6xi"%r;MRXD&g6k M.}Ug_P07rqxAu+zp&)iNu*[H77%sK 7knebàpޟ$/b og)RE+8r6Y^L9hr_9yT dUA`;SƎ@48K;(;@wdoysPg]qTMsw1S3αQ {J2Yq>Ү9ל3Yf /\p! ~ l^5] (;V9iH/\Mg ,Fؒ?Ʒ.&걁XE,yFшK8I2ǀeՆ8ދw3瀨D)-a} ^(|k{I;@r @&{V7n`:,?8%Ǿͧf2Pv#=W}0|PbG"Xt1(qhr#,i1g S؂?-6>X9j 202_8݈Q:.iE$gC(Yc]hͷNOG%IV٤%L L1(-^rv5AnЮA eH$P$3O+ eTu:3ŕeeس>ȵHx!_ƭWЂzQV,gk(֋G:"OW_a}xFApX$W5lqbnKkF bPIi@Ƃ@]bK +ߛ,`%ohO~L%#Ip,ʋ¤ [s×`9pƶc󟌓M>\pFJ;ʼWc031lKJvsqR6'@~-5jp'WM/,au.{//Spg {I"Ͼ^REGQF`%ڇTs]oB-EAu`Zi6qF1ӄ<ܻ z$Ϳi;/AxL2h)BNԥؓj'P:uǫ?d`Ka|l٥9xߡj R Ӹ*L.힃Y䥱{KB{\m}Z 4Ҭx._3X֘@϶76)RP;#(ſ!OD=ه6L1hϝґ V$E&<)tc t'yC=JrQFZ13ovbx˶O5xZ0 :U o/d))1UˡyJ Mꭧt#(:)z |)$+QZq42U*o=v-Ybqn,2xLclDA4ӻ&04wZ+1I*teB5WOy 1MԊb*^]m\L#TbE _vҰO+>Mj)mU%SAEE(„vS]!Za6Ii8S 5kt|]_-W/p9ٗ9LB COaN:<6[>MBn;}Ȟ]ӯ<תX$]Psw\ ߢEPv/8g'-p 6#)(@)x ֮|X{J>~k1=9Šk;lvamM#p# jw'EƊPVK XZf!Rlqe%mwy3ޤͫ/*W1kϼQIe صVJ]5g#gD1e➲Og[ gN׊yM醙y]ﰎ1j#y\! 4:>5Mns__Ym:ؑEdW@l]tctKa (K컸 yyn_4.S;Y$:˂ 8?Q *o#5Ajc-BJ,'+8{vG0EkӬw%oFX.[ztߖmf.Z^jZGAg1 T*-єuٵ;\U_hM^S۴ gKȿ/v/dm4+f"@Rc[i.dCCHk&\I\gCO%Qhũf$7+e$8< KrzEJȘGBʨ|?Lсgey "uYI _aY []XbL)9<XLw9F1Bd` )%-{.bդ%$[Iq'IQS= 8o5n&,KW-ґ릓TN p_팚ia=̏|j%6`eWmcw"Z2ZKnDU6rñ=<Mr+$|3H(r &.h$.$\Y'\C]q^N,5x #rx/<nu_Am`ndsPVd4 ).7Kqhe/uC{}Dmd9] BC`7,71`N=q XVW~5(7U r &[KmnWWzbm"JI4c%e39,?wD*jǬtv'7G/%! ñN=j$SFM[ч]v-<$ %W $iFzoeBc( ṧNwK0O$̂_:^NCkC ]QF&ZPշj-J,R[1h7xwHx3"ݸvn>fóNS#WE?)]34Scz8ݍUO3(1_9øfj[L/M|Cqz넇lq9eIeD/O2 cZ *24 {~fs:@^ De,wn+Vb,ԩ&P;$ท4&Se={UCt#xٞ)D#r [5db#Ա\4ϓ&t|4wO@ZtDZi5nΣ^-F=]A b.VL+/u$~r&[ArOHnLLGf; N=Q u O#7V\ !]BnONˍqY^ove1eTj)>|J9~/0EpQb_ϸ֫C%}{R͑yp172WN ϡ@ZV_0]مvfP0\HCݩ#e5IZe }q8U[/'4<)a;lYdG4V.*5KS͢8+UX驐~ZC )Un # jb6e- >1f(yBHQVB@VHv3A*F8a Cq TqC8TȍE}+qi=z?qg5Ojު;RXx:CER.T *g6ηg9w Y8 8xB變k!?fPuJa*|fތ[3+n_fw&y|kb^YFb{cYCfd98|"BD;}| bl0/f<1U(ab}R ]niGdLSj_FaEt9WsL]#ca~"gFc\JƠm Rkx`vD0 <-U9u=1H _Y9;-u|x0满bsKNi}Q c8x(Tq}=MF#oL%fuǕ$`mbC`Nflojh{B˂~Rrek- JL 6ZS9 "H )$Qpӈ@3?dX,4*"qi;jvaq#[gA:2Ic;u$ **6Q9bndLn2ySΑPa,&b ~pA,Ԕx" ]zw} ILy .eV[@̳>6Ն'Hw_J>|U#O<)߲73M(UJdjKKĒ{..Pdf0c(>5<^UQ:R&pҙprJG}~|LF\5:27]!AbTk,LP҉ZuwʢAܻRpyunXKe!} L`QZͱmEE;dpt0:]?d-WO[$7@U-j6ѭVؤv1"҈o򽩠QRmd^x ޅy}#CM:نJHDjɩ3wTRy :;F tAOqI!8S|13pFlo /9g tywK]X*kU3։5f}t~jnά]F+JZ3u Wbz zO7LV%YO^ᝤ2`'B7??YuvL!%7?9|nNB44Q'Ycj|Jn-ݩ:PDjNQ;Ym:5A.5T(l~iUD-uhY˩@ck`k*+KDz% U A 4[.[@qˡ\Gu:>s'F\:NBs?EMf9@d!N޶Z9g;5m3!ST>XgIBLTF'4h=)1ҬcS@#sS;11__ 8 O5̰6(pBbEяL[{Q%H:Z2@BtNSgh(e˿-`ya)#ЙiP9x?Vpm҆ǡíu, @Dhu GuBm3K{%ӌ Dǻ:-T5ZFn=Ncgc@8ffrLQ]@/_"˲+5z }V+B1Qجntͯ@XCu))!=c{0 %.pY+~f  w)RDCDlrFr!1=m2etx::I x- Il};FV-DftMfiYՐ^Hc#xu vvEfO2 ۂW^ ?#zF|vDY1kf2{dYcg'+e; VcfJqĤfy}aУA<~.T8.]-!GKoiDyւX==3f`^5>]_' )Tp`w6^@oc!:"=, vF :4UȦgwKI[F8F܆nE7@W^~lZYqW7']Q[ Jh;xHSύn# G ʢCX^Ⱦ۷}?H *,pKrXbԇ?q h%D5Jld#/*xfEًIkjq:m -Jrҙ!(3VHB$(1֡!rmi+>O穰AJ-6#*ؕ`Μ .MwSn+ y~_鑽Rs<1|]m dLRxGݻImڬ  bΘ=48=qԁӢ1^8 i>hz]Ljb:|~߱z6di)$)3eu\|򻇾BQ g'|zY9!h,z7l$jlNce6q C335";;~nqm^]pb29«hש!$OF1Y`0R 4A͚xh'uS,$6spO tM0\9~[> n I܂8( cDl<6Gb\isWa8h~s#Doqy[,@^q9)Gtވ_@;ELcr8N$X:_L :> bhxIC:|z;KԤⴙɂmT>̃iIwNoXa9p2\FywZg /aqb>8B( ֢ K+,l`١6;E$;PilxrZo@R ( Ĝs%.MN? &j3&x 6 }'~F"df6}-\+/Ih T3.%>ƄIyFseʊi7p޵_CH@c1RҚO%S])62dYLX+MqVJJޭU[[ y9Dc' '2>&IM_ }"Ncxpm}PU\ZdA۴trA('yNlm|!8W,kIbY`Mm({a~!P_ :F~qקDP}Y+;MXj{G+qX\n+D#{ms?~ {h1/%4|:5 eR#NR5NIX? bq8 6ܹYErk;QeQez Rhݥ]uΠ^>8 }@ p-j)Mn2Ol r4yD$b(ˤvWw\Mj4\{$ͻx:g0*?2ek:y8 b\ơΒ}p"LV7.q4(*KcCACXp6&̎U1 l JnRmx3$Pn;yF(:faT]'pUUqP1v(j9p6P>@+ë6LNHP]Tezs5 r>]JC}<+s&s#yVJHgDx_v4۳]s F1}W?dCe49;bcQ}Qfca9w5^ǂN=WiCJLmhڕ o9h+dzj4 aIQ c{ ef!r gb̳n\GA E"ħ?θi^4  a\/|HpWZwfM|k7 xS}Tt8AX&5(O2M͔wtZ'mOU^/ ߁;Iei*>dO>DvvR>{yɋsU>7`2Y f(tqҀ(lzb,8 4] ݨsviJ !I9;ԤMUr01c5D=JyX*IRռ#ؼJ0~lj7uEVܑr1sT[BF" fժf7Cmfv2>Xr)IOur\R/t#xKoi54Ys_f0l)XmIqܾ<8 ~|%PvW)ѮEMXOϜp7.ıa8\R^C?wDM⬡\ʌŀcx筤U=->y90PxN/3R8֙X` fA Vsp}(XlW1$ER[yUv!7S$Bo`DBƭ%bP[p;b^^&g ޟ8 UР,07jpqHJ2r:]&8w}:蚶<']Vh QAc3|+]-BfmKbXɶ(QJnH,,Ń~TOЊn߸te-;Y8(GcgǂG&|6uώK/kwH|>M%K@*;fd軟?Οl!T6 { ࣀp3|~֊q=evmi`^ ]a Apɜ62^'`4!Wk Q=-f+C i engjF !}E䜁52v~"8\Gi-{;ϾtKxt i&H5a5Y"XR %RYcԴPql"*Un|\ Xt|{qc*c? XBk.s 've2ZKgw4/*',i2˟@ 8P:͡fXGh}mOp&8,=su2 = ̘H3 ,L1imWlϪ^&J^-jl-)?Ԗl΢ =@0uo +"v]dAp#nOr0j!N)<;cv%R@ k9N5Zqws#6tȟd-U>siVX,z{-{e`Y>Ӥ9dj0r6}NPU&})sFtq{v8|-N%@Џ+%[!TK&zęc \2\vF8٨L3=9OZ5rҭD&S ~a;lp$6o'Ȓ a?kyV`ʋJ`8wB.M0?]i(XpM'.¨&rFbeKpԔy׌%ObblkU i!*vԇpC Z$=aߘ~hlԠ-R`5D*_m .XR5GHگ)oWۯ'X86d; ZD&IIeJRaUč:v&s/uDxɖ*aX݂ܬ>5?(2nd6`eJ&#ޥF8)>0E-*1m.R X=-Bvx3B'yC jsͨ]@S45Kd,8zkjYFv=ԇ㐿OQ*vo^9\}-<:[ /e ^$mxi'e b.EfyJ w⭭cƩ]oϝ@&K_!qDžSK- Xճ"e<.꺏Q $p]m ],ci_Wц]>Q#~6s AK3ყ&B,aH Io~}2''J *k-/';KJܕX?UEwpX (]lkg~(>p&\ bсGduEW!/to 荓 *zc/ʚWv<hlhfjh@Yʝ f͙hTדjm[{LN6i&PdOmb<0v4B0#ƤB.,:''mY̊6Ly"vVB(9 ɧI§_o ]_t-$:9nGe4k~#BlZ}!*#CV2+N}Og hWh%ϖ$U+*D XLRq;ώX,ƇhiFRt֍ -Ǫ@LD&j%![Ml= =Xd{~DjKV>BǍ¿M%0 FŠb/2mbG]ulEl2ʉ8BvQ>’՚~/{W*[`vsဘr͒Pχ=sPT-7Ʈ"Mw^?i\b"H24lȫT9%pV9ەSQ̞ZYER; Ų_9Q\IC+9a+5ה޴,0Z)F `y찠 ?0VC,Ĝ605sj;8Sk12i*О]MQYkC/07. 7'b]6-[ܪfUM 2, ΜG ؕ֌}Y]GSa?#S PN{ 2d☽hm%=в3e+P&Gw#T qⰀ:ۃiƄab8UFVʻ-u7X: kIJ :2d&YeO^5`ܘlsp1XݟeI!Nwupc*Ŏw{j TXLJWYWu1SyHġeT2?d4Z8!x֪ lʭI z3bPz^ǂW%ҢX K:)r <p@-bJ;Y;SV[]Q? w {g/0; `4UL0^itp*.Ę3J]?1(}]- 9^d͚CubgV3 - -8TUwUiUe9b2Ify|mbj2R" @`qUpnNs9-Ll-H̵̠RK> 2yZQ;%ջ*iě\DH:z^K {E?_ ;$ܔ'+졿] 1Cқ,D!&b 6߱j&eՃT9Sc)NN[/dZVL3IZNҊ ަlN;Pg{g y^ud^+[>"=Yv,gU(0vP 0NfG޲Yr :YٱѦoq6ɸsRv5O3fOХT`f8-QA !fҥHap?.:0 ;@2\b=/{$5jFbU݊Z%]VKu@PL I&&*p=>L!91#6C%c .gsV E6g.֚?,Zkw7J ~֮ pC0gW)];>'j{:w2a1"Fb 'cBDžMV!-pO LeB,S<9QuO$pr)hSOwYNZ? 5a3H.K`V{R_Ls_r\aJ>v\+j@*(K6*c.ekPʊk2jS["K|p_,P/8qDnH@ysaƏ$@vx?Ev.%M]ox)#1wUzx#[]~,~BW]ƟIH*t4+B倓]`K7F׀m7:f݊7ekZ壪`djX)xO¯?۞+cJg!Q2h芺Fu?*Ol>7PґsTM%@Z!үTc9Hq6pxv,6L@n`#@W-Z$tvr >mI- s K"Ռ=UPdmV={z"N+.6$aFVdN|- 4$C ;S@1Z Uh;? oH~|S[xo_pHZ`z \a+څ#NVR{zY-%u o< _xl x4k ˛;! j qy.s3"gqYZxnwEd 檵ȫ䐟śNgLu"EE0l5Nj(_uPxP[I[ZB:wd`: D|-Du934KZ:_d|PVLh)Yr+d `m\B+,G8o{ͧz^V2;A}nz&J&!*z>C٧K5Wm l儴KE#Z6npr%H : 0!Lθe%Dք׃kDiD1T]~[c0qOӹHT!VKYӕ/G(n$mwkJuI¹f/vύ(8w#?dYha{hq<7Pu}ܸ6uU&l?!+ $g'ޥ߈cd)KJz:vF4d҇ tjܮX~ۧ-H=˘l'oZ՘歯xVGH ܈ t"qxcAU/FTe6n!չ,;I}cGf?cv:*t#GpV'Zt4WnH4 u4{-p*]]oC; vse*-}ӬAz Y Ś, 쥭U~ɶ#ϜXfP|"Ydl;|XE|8K?Fŭ%yyzI"LD.llMr"['X&NEwWG4iO5 !FK7Da>a$>Emgc p\7 5^.<E8b8bY8Y૤a9$SY}:B` O6σu1Aׂ+wYrZ80m tǃ❥Dvܠ*澐qRU8yN-Rfish1{ZȈ3)zwCתdLUWѐUÏ-zϗyǰl=)^DDo3^mN}g:(5aȰ!NY㴰I}Ƽi?9^vU"+!ich~FeM*`y%F\'no-lr@Yih% _;i; ;wיzI K01^:*ꋓv\c&HVF> }4°{26u9'PҘ!XQDkt(IjL0G\PzUrhf

hQt,H.\ps 06aS?zyՋyGCEN=;I"ks1,'w}t4aҒY&{:uQxskC/Hwl4ݗ+=Jr[Dt4SgtKڄ H! 5vlɽL˸Aܾhڝ{/f ۭܕ4x$Qhx~bQt*<) T:,C@DfZ r1wAy$2??^S؜#Gl2꟪ihDnWu1ˀ c:L9p ~MtYZh3=j7>ӖI\`wQϪҹiƦ{`;K}%3Q10W}`/*~SV<{ȏ`d3}L4j섕Y BaE,e49υ!9de\ٮ=B ]]? `FN -[x a-/My) ϘM -" Ƨ /n ~=B$T)?bk& nl!5$i f6\~{:__(,b (SU!ԺGxXQ"r+2eY t"{ \ fBF=hR\@<4g_`dU?v^LOMs>s7tBgzuUpq:ʛΡ.qknR8Lu' CZ MUXZ@\vDygչg\4jiE4gh3> 곇wi/lj Y9 ^['D,u}x/hKՇTyl, 'r+I챆=FnVW58:SRλ;(ojgVMSTK EqM-V+$m\Pe #7hC=&ԫ2#,cↀ=R2J"gb*N,=Q"qf5y7Lϵ=9>+}>hG+#ZyTmK; 4-½'Fy¯1-~,10#.$^KHhr:ǩo-n-w>~xs^FWݐ !c'~r$㓠fwX& pϔ-uQڤwѠ;//h ɠNELjl5bm+Ξ=:E'UNJv! |FiTlJar;8ܷ1HƨϕT۴6tڠwDxmZڄ4A H-} RĝZE=xT΍Gf : xٍL>;5 @em~_V kgKT>wĎR`3W4Jwsdl>n9Y+տ3f1<Kk|&д\ ZG"bz"uWQ[mŵKR~Қ],ᛘcxjfᢼlZ g[>&yc%ދvi6lM熲QB1Ɏ U[+~-pSѻ=g}nCn@몄*utU`Ec?-Vݺسh ^v|< 9nOĜN(]guϒ ?v~6rzhRVoS$r)Ue_ B!P#O$2CDXdbR/`W Vf4,ӣ!\w`ڂV"Sͳ9rO8=:p鞑^>1МG`jxx,x]mi=JxWPd3[CJsM<6} vĎ|20ޭ1cl}4/ԗ'T}A,JM<9{6YԽpsޜJSYo&"n|Ҿ=rqh Ar>ǣ[gW Mcz<p8yFNRi@Gw'Zn=RO#c[#iujs(v״'L͊cA4!j>_ٶbS#Mh84ОBX<ח{~v8|4K‚m(7 ]t(Y?5tImc XEa%kP ",:mw>G\7Cڣ_G\%X g_ eo!iyp .TN}8+:,`Kt69pB+j6hհpYQOb Xn(Sje%X*+&FFWgEyFĝ)qxʒKӐ2(8ɉ`mē|3;p?h{_;'H[Wsmt=agtϒ1D NH@7l+J! ձZvgTqe /Y୊m7EQKa9F$17,tkoOs^>OFD=}:벃P= ^GFf~.B5$STt}U(lRkb˩ܕ9n{|YE7o&8mNmJ's/n},n{b=dowpvrl tE|Dձ5P1FNڗ؁mnKfyoͶԫ2yCx(ҍ+Y'PLɠ=/yj<BL"y) !iR!z]Ɖ{?De-1ͨ/CbI<>1#b(X4ƞy ^}셂Ռ!J9#dぱM>a*"ivIGb&,14ǀidzR-Τ(J2}.Jnrx7 J,t:_:oT:zxA(.{5|Q@81ÀuUB.};Ĩ/p[eQ^ǕRJ!o0{B. ׷mzz":<.6ϔ>wIc E?p"-&U"v0͋C꾗xYI* N܍!9*D[sld ,Voq'! ,aV\=̔5PL3–&ef{Ϛ$ӗ?y JN0~YP5nyyH`CH}:QIKU {$jD;J⎂9{~2$OI=ZFBg MV M}4юBJΨ5]ID#&,c ff#?efz2rOEƳ`ʤd\0kTL8PY.Q* Oz24@z~D!E2uSdEcH50/{0BR90AJ,mz{GJ"y5h,/VB%k/O@ixogUփM4u-d'"KcaP mk=[=); _hv=`9< #eONuNTmy19 L8հu4^O.{֙0#Cl]׮hUkq'&Y [I|kҝUw>k,: si*a Ihj66 IdŴt}϶fتy[#*x"]64"ҦO&uBR ƿn~%5 g,T-cX(衚6Pp;gUZ$"$sO'j7&(֚dvFK8zL*8ٰ[Qnl{twGV:&B+}TݲMV]ڋB3 蘬:%/:O# mss[ Tbm$q$BzNN$52Ul{5o WnPXtYk'ؓ#;h:T*,*=A o0Ewj Pd,fXC,6r\*#)o.BأʜrYDŽ 4)U%ATR'Z]_v}ax7wߞ6j=ѓy}'&6Dl[;o!O{oVrERmk9y#|MN Nwx* >ʣj?`~y0_+2퓷s5BX!J6%LT&O"i|q$r p)1Zzsz\TšA/p?X :T^9:?DĮm&娽==0'A)V/Ɲ]it'UtG|^t% Qsr;PQSYu$dy>i}@E8Ykir5V7)6qMX>|#-v,/`SbuRiț L!Ar3%( O*?Pw3w:7QaEŞlDq%9a_;ʚSAސ'R`ƄS؏eEf2ZoGln0!s)*f&LL ( 5ӆ`֖ .NCQuFbkJm0F9F"=6=8$Wo9TYbmEׇ>:{Mw1J;rYMiFcz$Pqhfl9:\5NjDH/k*_cY;8 Z`Ub&^t߆M0 y ' F/c8Z踙_bwɭf貑{yiŠpKT?g}U:Dў94|[OnrxؚN+À05E> LGa$ND=Զw^30FWɼiC)+c_"& [{߽,{:FRTϒmWڶѼ6zC-GcKvj1"Gm?X}foY90:JEo =Y//Ƿϭ8-mjԟt/)k@y&?W27 킳f+R/½#5Dw!(?hfw/2VC]RࣾPh&@HYm-k+<j⣇z:X]$XSa nkR&P^Gmw @Uu˱Cvc:"a0u3EhE- .o^4A/?<>Q<+LrUHN+`*SM=g۲t)|d7(& "M[HKkS o_<%~8F ! ݴm^cᛕOO:|UZ#|>|F@OI 5v,fIwpVF[TWx4^7ojpE]kQK䔠6!5jM$F!D 'n p46a};6.~t9 MDž\7q2Fwgyؽ鿩|(PuYp6!/֤XZhks](M:t6G<@Db5k$]0Bwd=pၴ#_܆Tהe$TpiJ4% zmIWǗ==fja ڿDQ"Q˞탬8ג{!tf^V!l.'^m(޷|BAѭߐtK]8T1Svue#I*?'L90hɲ2+!LB~>.RQrbœ9ЇM5)M},l Dn;QYvWV~' !x 0_]B ן4ҡB?a)v4ӟsqHjP^.o#g=&wsqFYlt3?XPŧsp 0J&%yaݲ|QV}2Fxs槛0$ƍnTa䖯z[b>s Gv zm @U@*A԰wh#9KV$,CSЇ=9H`}BU4C&<ȶ2X7XnY^fTgKq r!>'\t{5~I?mor5fo[ޛ·`+ŷD "oOFwX=|DŶ@,]'|$k8jೢY~?wdicz]pwwR83ܠtYswu4ak_@%fj{ F?^!dUrXnYjzG޶/yCD4IgH1zܱDD~V-S|k }^såAvQ-_\k+;(pSD9pņغ,  xl؇M:r~zc]Qcr98`?5H(lƱDI9yޟ!.1*!o5Y/z~@1}0ʡ-ʑ^,9=ZKis|;D(qH.G@He{.\KHnMNAKоuC_oNP+FS>N i~XHXz*:7ØQt-6srҴTaD+If;IDS2^m*܉=ҁ.'tFfW)_ő.a`ug7+BoTȬU4kNI^rơc qbaf3f ӿ.LcqifgfP{URe|\hO}$T{\z̳o/\\D}NHvN)nv{:~S1@6_a;0 \y7%IB"L|M z[~_$N{>?8.m(c]}?T^mNU0me˒n?Q-l-g֚.yd3nk Y7/fld]ajsjE+iʲX~&iBԆ ~fO(!C-p 2-xm,߄Xݹ;5i,]}A<)8,# 6o<!u>CM'8S6%ZIVCƾ]|N %[vhAn3C_[wOgYzsPv8s--ԡB yggΞ/~KM).)6X\L`v9Cӱnwl괡E-/#>{֥oܖLՍU҉ZMޙAL.!4v7u^fVsFiƤ+~֨PE0v>NE ڀy :4P*v5VWN3gC9mõd69\gbzSǢfĦc7 (b|Ќ*} əsw#'׸ܰpgb!ڠjm|KK ԛH0W'd.N{%Jys'\G*nW\'dj_y \1( b4xR]"~fy,pVlgy1Hy$,? \x*d5iY ~{ʐ'Ӿ [ւNéB)S>ndyW9|T|hIϼr3\s}t\J_jnhnol-*K%k|QN*A8]8@޵v6KKX@̊@[؁B, 㱿h8q GvV{ ~3T˫/F7iڴzKapC`ROFa~B d"Tk.rVJ=8~}'x_ŧ^:c\5+COnՋ7feDx*Jψb aiD.q puS櫰GbN'VߜK•D1X/3nj9R&pKvxsN@a_aoBy6 ujE;PΤF]rcBQZ;80, ( "R-)^9mB7W)N+ }ʪwږ7խu@{`(`fZ٘5ϓr]qrGoz7i$w 5 鄅@õ %!; |B(ʸeXȃ;+!遠-" Oڱ^U=A"_<쒈x)fZ8f{b WlR$B=u uLö倷N'9l9R{ iZK _;h!I+AQ/)h>zG.$1"TY;ՙ܏C5 2WRa$5:V%.q67^~ M|~_i#Fn}N{3/6 ́ƊXH@Oإ%SRnPg8sƱ96%egX}#BPV|\S _O D6qX! -zZy2i87ʁZJ7a>nNY"{gǹ/ pn5w셴{=)Ìl잔̋'2~@;O>~vy,bЮ#i[>ecRyş!hbE'+O.MFw ݍ"q:{m ~DiX)Dpf2pԼY1&pR/|Ep˿xt,u?n9pD )* ZcIZqh-Ug8[lnc NpbRP[SmoL jg[ +ӆ1Xcrs~p30XT'r{brsgUr1e*7JOG :Y2"HQvUNUt}8 p8cWԛug^y&i1k'alY#s9< MWC ӄmsz:{>=~N,Vf7[5tl6s^-(B&Ѧr76NCBTJPi~pJv5ف $n#;> ])K>+FZ:m*/p ݹlDkPmDWfnb!Xm&MR%G܋צ|<-4UX'MşN Q=1u.]/ g)b]w^(b[A76BN-K&#ҺgN%vn1Z0e){Lj=x8u:Rw6`P7L18AM!$k1;Ȍ|a=-g xg$tǹ"t:+3H]\A*g#EN~ Q%?:y -FpO)C&+OUiChemC\Kr&'~)2 Pp{L!w 28oEPMWv]; Z@' MkNg};qbp~-ykT5c? QdSvk.QIp7u`^2l a=kwsAε;hE=oƟWW :Nn_>I /0eYͺ~h ap5#yEnv WTS"ʹJ6UH^驟3cxzT|0(ٶgѥ=A^h̘jf|i++}X#WN-k`}RءYĈ&ESe|ZI]E}7 rZ0:xj60 ֥#_~+ǂ1kBM %\ `ِB֪t$*}%*kGqW7o$ݶ @r,qb>ÿ3c]!yFn.^2CJ^/= mY+Zݑx),}/>rܱL&w` /o&Rx盖!og9H_s8NcSY༼̚aeZ N?NQn:8٢l!e[yZ&rwIb#[6n,-luejwJBS!5Ed+A?~v ?ȄHy>{-{[1Er$Af ?i$S1R` ; @:ym);K&'mhy``/}4/QWC>:'F#t=9@,1G_YdO'ɛ7X%io!3{I5ޟk2IqF(hw>*L9ܪt_WM^Rj6Q~MaUJg_>ӻgk>JM-_,1TH5Za~""* djMUQ9YAt_h[YoQ E݇6vN<1L%O.D7d.f,';9_H_hd!X(5_&(GE "0CP7X޶6˞{P4 ̶"1{ c*xmhZrm(@k׀c>p.;aZ>7m-V ΂Ȅʢr4aLid +#gADH\Hg._xa): [jɱ\I"IZ &kɜ}>Hƶ)}mB+1rkv*ALr67'+:=nio:J$f8QPOn%ڭ>W`R!Gi%E<|7Gh}ۈP" P ̒2scپ"BH"G7sc)?y gdUrSI4Yx/>I,,\A~--XJGG!h4gdz RzUV;m8\mԜGu 1`OG^ˇhqQӵ,*AT,^n2S 3ħfr%Sn e'W*{,RȺE4^{")m^~e'@{Ss~3֏U*v""IӟJs$fpi'c?M$(3&w++K;̘1iםcVQ)Ѽ v"\ၗ NhGn<Q[O*'e'&Et8/y!#(6ep,&9~惥D ?V;w 7~fT<ˍpa*g|)k1j>Pÿ́BÁX@ٓO@M:н amah4"j,̬| AZ b!tAP&Ǯ`Օ`p-VImAG: Nbp~XpZ {9BbɉU(h|#s+\iiTPݢgdRdí({=xW8e$o pOȚMy̟PYpY c.w{i=hͼPB(mdY.uJg][6+k?]mxG0Ǧk vv7b' 6qnNPx:{(M8 x?uˉOq/Ƹ5 `5}(="IؚJ*Dʗ_a@ˣi]{}&+*17)z^#FjaMQ3p&%23 GU 1hY'}`Pf"5݂tyQ٬SBX30'2׈^rZCkk Xq*]>,rtAw5< ^)P@3lJR\!qP(mYAO@}^ڛ?5 6H+߼eU]J b[~O2\@eK6N"wF%hﵔe܂y:l 1 D*<ܡ6ն ʫ#m|X3bZ$V(7т$4{30󡙄_`xչgYxF0PUZw ;Gl%"AaW.t" qaſO^*O=3clGթ[7q< #;A80Y\&rqoP}dӜӖ٢ Nv'hpe2O|{ 1Mu]ywx}g\o^BtJ- ]7(=d.f6R>VP6{}Ј7o_ܖ*J.4 䄏 vpȹy£]}Bڿ qp܀XIotT>I%_P:- 4w!z4jSu<hk^v,7e$WRPuڐ? (.gW9R4$p? T tZ= }c3_oV"w~׷c+1@Sḑ%Ԇ]<~ {'X2'R,+&ff夺k>di幉{EDLjᡐ58(ko;Z {i=¬Q%L:Xq$+Xנ,yvͧR!l1t c#( :[X?Xci.a*{{7lo;EMcӅ`ۋ,&:yVJRF\rT؈` #ۑV Uj**Hc`Sr'8lfJfgGrB 'N#wS rKiډfE謀vj0~@~׵<+u֢ǽ[֎eо"[ % {c;SH]Grj@n `9rzssl=?Q9LdCI`gfzc3U~7,W+n Q"&yž ΓHl&^e1sunх:XEWLQ5*\#Iva;1ܴ@nG_%qjL L4.l4$tCsWwuH| On" jmF {eF&jat<$h:G ͸ d`#\Ej'g0\^T?' ;JC~ZN~!D>r pZ~oc^oE<'Y3*$Ww. 6"?b n%F$eх\>+Jr U5#qJ!_I &NN{C]bdQcE)Ҙ@W QxZff7*{~uڷbi4ވkLT  <kƘ ;dp2\N>ϤVp9-BLTw`p;bhԜi Iqi,r M  !e?Df>leY%{.Dcu 1 12^ ='%#吊8YZ f|P(ћQ/OqD7Ē<^nDA392^ ]-ڥxM6?<b {y8cP4-NPf_ GtM@x*B偞s.;xtDї9cҲx߼4-Zړ'af;|U{AOV%z%Iߤ@|%O.HH^' d7F8R$^ ON򻽥D*fpeIv:̐7Fkb<"%y#_vA#H! EM=2jĤ6TD|ڀ~)/2jk+/Dra_}&kcNt„:˘FDW-[a_p!fΊU9h4˭/$5?YuQ/azm~1'5@ 5t Ҏ2 { )и2m40@ /l!ΤR_n[a w!eC/ q"Ѻ V5*E(|M.v8 Mi"$:8LlS@&>eDx~fс8U f-w[ 7B1l**K^%_7R6>J1k 4"x'84[Oɧ'um6xK!z&@S|\SxLڜjHEvZy1?H!p?[C:pq(&]n4nQvPpv)@NZ}E(S ,O_,۹JEaA :B`U?4e7|e)e)1rG(D!H18ܻ&:a'Kwȸ_KЮ?Z/(gPS(ۉw=tnd_RP4Zz뀺  |R\cijin$л*i_xA *w@ʘx]zdjݚ@3VzH/hƢ<>xjYv+Ǝ,ԗR< v, 4Y#@_1(hF('{ze\jp)$DW`l8Ϋ-<܀^y4*D.F/zqbvfLilZxbfز;'!]^GR*6m]LVEgxt#S. xe;.í+Fw/zfL|Z6'cg %x~>8CU|2L1\t<)Eʏ)ϫ%s4@ wd<(AK,*xZ_xgu[-J8m;WW HUqXm8 N, P U=c2RtZ=6S̈GS܏+SBku/y-2D,sNYs0 Q 'Xv',+'=PW;wSr։IYDd,lY1sFܓ$ `nN;auj4?e֡rPΦ?NIEA<NAVf5'>y=d/Д3DFE` ~>Jl 27$7mo}SUa>1w `Ab{׿Cqw6`u.vzQ:nFܰwW3O&wq8NI<-ZPo/2gB`"KJZTч/c෈8.)L)~|k @._!߿@NfP,! I}n y{A@ )yToaL#GPGF^H ydX )׉EgiL彛-_[}06~M*0U G=:iy 1gji-L͇߀hhv]r{+Pۣ`.G^Ȩ,}xĿUk_Kw4 !m'Rk+3=v0T? "YY^64H/\g 31q#̱ff}HLNr1@ْtzm2Q&3C׿7:k\ c!R'wbMz򛯯sR-g1+TǪ&y V޲TD`rR&yKyjI~EevLOTȆs }mSmCoU ZʕR-o[R? &7Um4˸ḁ-Aj\%w`_LtWz '  &J^-"Jr@IqONIq30 [$?%y qf&{`Jtqmr2Ԁt- X+pTFSL"4^DL90RNIVR'lHϨԱc$X&]6 |@ۼ[~GP)+._w8_$`;(nv"KМS1M}| B*Os׼4oiBޔ8 }@7[P4ZPdGԣmA G.P(/˯}}g }|Pnq޼)ζ sRa=b*"uz";,JT0CrYJ_[-bUJE\ĒGEuN[Sc{Xg:QS#Kf}])O@5BX[Ocͥx2QQ#dw*f67hjf ;vt8Ti&JyR&peQ7>r?.;Fzg$Zה[Rk֖D_nw{'MDKEK6ӓUw(s w_` kV!}jY3eڶ4#cy xeh&\Z^K4=IJ3fTPx"dz8?}0$Y$陵LvkgB/ qw!/E:wtʉQۗi_cE+zSG<In LnbX{sR#yK2FDj;ʇڡ!G\ǩTnS@%kayu%RX⸇AU!bSi#bVvT_DCQUkXYYEycTdYLŸ X3WߖyP=ի,jM:;Dk.d~!_}kQbM>S1JCp|8E^oݜmz>};H|·ap0z0I=956)sA3OdYw Ƙ!r~1X'%Uvݩ2P)CK z&o$IAnJܵ/?S#WD&HN̶z"i4}P? rI,%c;39| (|5ZϘWXT% vPVr+6>Ԣޏܩs/}hxŧĭ(&,)סF!2o[M1$*MCdfғeQ3bXWP 08?W~pIPQ2esf0c[b|@ݢ +m\ jfH][^vR ksG^tFnf]m RZC] z#zIF=[NE4 3A`,M ,S}1sC=,|9@P(Aykq(c&>}e˿̮fӌx쐴n|c[PW'Jsgv[Gb y\(7Dh504)<5fqW]r ҕpPuQ'38[e SJ<胟1}&aK^4:T4/%ey޽Z;EdGQRq;\5ƿ2iVu ;2hBsviicv[dɠgk JyqEGhF(~laFx<͗-jϖF+i ⟾X._R,z_yMPRޖƓ~9Uz~Ϟ}X9uVw:3 qJ͖V/;2dلNMR"H0܋ TFm@84޴tAWAcW(h =R^s3r1qGs|b=746SE/ 3`JGOlv7D헜) ֱ+rٙ$?"j| &[=EBG؆>]nUDQXϤzhK'd%ό"+s;w^Vh<"(=@ۥn ^E %4nqC\bG1Ȉ{ry0:~U" Q_N]x*{ܵ*b? +{7.zD* - yˮ @=NNXbD'+|3Q#_ط%tkؿTu^uS[63nE{ {ܱ5a?5] o*9? JJ‰1;>/+|w(p0+#sKpw.}5Ud$!<xSl$R9g~'K>sXLnA/z-WCbpآ f#b9Ktܠ#X ,1YB :+o~̣]&Uf KOn& L"&{A@^WOfu3u)!\GӀTr-{?&C\WmD8n N+#ȗf>7@1[.>u&-R[h&r5I/]`;H2#꒡8oǡZ, ".+ΆlUduDn\4J*|%􌕓,Tq>l\Uoec:>yKEiCy$3Txha 圪P&ӦR§ G3o*[o0'?g<(ɦ3ݚO t.gReK:0/kd~;~ jx^z&lU&扉'b:-4^Gpw7GϧF7ݷWE]֡ k6SJtJ8yOimacu+wEA˙˭‚y:w 8 2f~%u oì|8Ǵ2Fit#+O.937ڼ10lPGS@y7 ߢ7\Y_3WH6O)].؛x3=r~6Gsa^Ϙ yy`Wy9TdOro5*팝Xe8Ud0!bQkok 0o|o)ݤK/l>6g!-"b1B Hf蔹(6:nfx740U!)SzFeoɝ|,z[|¤0uo1G/+NE:ɕ$s:KGZ & ‰G| }M |:3E鮏Nq!)@ço-n"^$;,&j!dXo .֙%3ʃQד8CzS͞&}`P~]x!ؚ\ oG1F\OKsZyER2KZTE\iPtOrxH_$(R8~T-;|c+7__36!48n&{;w>UK3Րr=(WzUW: ke%X?(U[34e g.R>:3\!Ѫ#`3zԳglAOc.3` ,;jKt1 Na0&?PWȧ&~Z@rj%wkzctj51\RN?m,s[AJf03яpQMQ=mG5e}RddQ#fP%ۑ!-|3 e~Cn\l+|. Ԍ'j rhfUI=gz iy=9 N'['4_tQPn8 @4SKp|WWT ONNaF>*(H\TJ%~d\%!! C‰wWO;~kiC2yX p23g O  Zub/kOQ/vՕA:$юiU4}6 /dO٣ 9ƾPcHn>L֐"nq+0a g[e?Bosi`Af 78کXX" v$z 90S(VN==.!lހ?*ZDZݗLJO` /t&0k4$GK/QY] ',ב$[h$I9)[t^ {­_ebҧB~0#s̚`cd w⨅PMц!@1laQӎP?Azg?Qcbp=R&a Dqhe;ك9k٠Z\r5DУcJ^Ēsgo٭f?uDnco_PR@P{YWq|TE`25\+5d7H;GQaU=RwG Jbn0515DYO F4faHH.U__7ZiTeyBE:ޞ:f!!fc?虣'8r@ mTqa:>^LҲ7V/1:p.kTE ZD`z@T$j!< Ur9bUxlLqsG=Ubvq,^'I`a'r>Mٍ0O:B;"PkC_94@kfy _TKlf!.iU>"_ 3T>h<Z38N oaXrb!pƵ|d+n>o_f}ufdՌ"jsn9 gIA7]Q6 +*!t1)(w_>:+VJYGXw$N7lrQ>{|?kJGU;l.2da\"FS\Q8+34(U'e16W~wB g#/ "1<}qQaua&Hjf ؀>b mhǭҠfuv["Oi>jRێ񧝬9n9nX( K/t-43a}8B #<5XafT4"eN'Q "1 @dcVP嫎-1Ɍ|&bPwʍ3Ǒ.H {S復-lBfF'~Ϡ%oH&Hr?15)t:+ÂssUKB S$xA)dK)\J8390R 2<}hlj;;@ɛ"TLbe5 B-ZJ{V? LyW̮+?;cAyBx '*(z,܌KH$mQ^ٸncCCI!8Zh8"SBc+ 6ר)]RC4h ꎐ LMS fV9uиT"11C̜eӽ^5Nt/Q>o{3$_N" Z uOMCχwށНW=gmm4K 0kieUvOadenwY?X]|y&תZ}iyb;y(]<:cHgϡ%Wek 8í,]o<8 Rz#J520vأc%܀IHUY#iߝ Bȩ=h]3K(mcvMZ*ox2j(~/9#*JKR*6XG :lHK-nS6ʄf jbPD6U|H;?]YJ:I c?2e\Y1#Wž }65ݼL[r442=Oxڭ'\h؜\Aa/$@@pd "w#-x#E+@9U͎bPՐaY(;afQηTx:ץD06ה`H(8ۯ+dEʿqCNwvo v(CdjhN8l/!@,HmqXy- 5͔HNkHnYZjRHd#B͕`Hg!6z˞h^16s\:#)޷ Dl9]d2u ;^I\EgHuڥ^-,'U&ugUjH G;6_e?~ޡ6h(#6y9=N6ut  x&U ~Kߢ%6WeQB<:46朆Lži|lUr1lj*MX`ko;[WeN9LS]^!"C WصwyQ5.xpK&ba0h)& U)44]7X 214ie1ffU&Bj@@6͢P3ʧ~|s,גּU@6D-oVM~F 85Ǵ u$F{j#R]44\üA }ox"M ;pBen lɋ$>:-ٰGUv%!KBzjiH$۾MAdCS:;@3/BOҧ[oyM=|G`|v=0Mf;X+~lyْt 6+E9Z~[ޙ뢛U{Iay/l O?Ӓ+"ۨ$]6Sד##7OH aDe'_fc>%H{<=i98Uj Mhs{| ,̓ 8҂I: AZz|_ڿ2E߆'lF+ >L:eّ"y*"NbrLi}Ɇ5ښE9jVO2[2(D@VCKם\F@d!"^F6TuZXO~A%?"5ԬUvg̈Qfeb,?Y|-pҤȧ1hJVvAT/=-;$]bA>;=U%9X ÑI!8l,/l ?p=}~]B} [U^-Q\yf[JV)-ʦ,KFZ 6EMN6yG"\lFN`3Gљ3@oNbՖޯz'Z˓DOY5|o5;l(69NWUͷPy⒬~-#"H}=Mc;wC7Unm୦,OnaQDN%7{2u.wqf@hh$I]n, "t=ѐ !(0]U#JÃz"yN}6C .K3G/ ^]12&Y;}4,PGep@Yބ=F795z["B}h⫵K+K1/Xuj "ע> XPd4RU稻Ar<ڢ!6_Qz 0էۼ#,̟8A J0Xى%.D{u+F._°~tiz{?^OOpȡVw0g^*ӝ]Sї=gF7O *ہ:y'qXJ^v yBSa4( ~݊7"E]gp>5#<[2VAu9)FvNEϳնFp|Lnt%sOlN\Nf`OJ"^3 b{휔)ߘs3M4M7dgT wd_3FBi(Ȉk&ݹ@ cb&&(#SBx@6uI`84sH1~]:ХY@Օ_;8wA߿[;:!`;-^VM_Sqܦ$usnFʫC8hD 7G]ZGOQX!x D?͜4慠і'ڪ2[&t-M,X通(}6LnV;u&@M1_*5 ořpKDKμpDSWZޞ4q1S`aKK:>dYiD(3;~9ޅʴ𦃌ņk_fSJuQr~hc:Ţ3|"xm`Gf3pz}ï(rO `"Zj?T6tD3>=v%~oGTp%A2)Jmr[q2H'FxCWG| $xZ!8O2{7;xA`/Bo$9hk>LсӼ({TGtPծ{9 AfMUHes~YPAzl6!Od7v96_%UJF 2L58<4_b{ sRފU>> 0_[~2Z' 8%.gd{İ.L^N.-L+B,ou"U\\Á>zdҵHսP0/B>9JΪ5qV  EE(j-KP|F\:/j˴XC|^3OcNL~o2Sfެ;CAc +b CT!7;xǙo]qÏg %z]X,&hZZ M) C_S.nӘ]Ȉ6bl0Vx- %Vlq`[,ǀK*p>0.W۬`b|m>N9 +C.1N j!++ۛ뵨2ǎdB4B%gzX_גDL̨l]]q @չw:ięfXVut 6>K̋U7᫬lH㫴hg0ʑNy5p8^w(Z5R(kPJ|DwtOh%s?Ŗ)!&kuxڦ D}9;4KAFmTu G@ajEfWiìb}{0),ZH+'J `.Pf򳑳f$Gq.Ǡg %N\A+`3qdPb 9:vw`u!U9c`{sNW/!׀@F4YYI>K&M9ThyBd jy[amQFww6>l6PuҟJ!+:~ZN: L uHa%~Z2I\gl/ f8Ta@巚abBjvpë[ 8Bg\%p\@T-ssnPນ ecSM9z՚pK$QhX?|'К:O]KY7A^e]wsa/n؉eo";PB)AA"mWOBV yX`51MQэrpEUYB|[2zi;n{-o}SI8k u/9aZ򂮎:ЁZ2UhA2 N>>?tOmJxBxJfO~L{{sEh9 gbƆ8[z_4>Nz>egAzcpP1'8u`ӭ.0 ܦ C^;H`p?ӵj%x-v@;]LFe֢%ةQTvfc 5v^pC?fwR a`plmyBsS}$*K`:y>%Onu߃\aYl.bd%6Z#QKSins:qDg3Q,aųPn>uf< G'֏/izuS@=Q()AA<sL_w@jZO O\j*Uid'5jxׅ=.njU;^)3ۏ&{'ti ؄>EйD4=Xwha \X " ̴L2n{ӳBp*0?SuT,p`x~ P+`C~䒝 01'si |o% msȄ#\o>9*i3&16]r##R`"M%znZKP!yLij8}^,+Cˢdd 4%Jx,1PӻWiTCWZyvap,Vܽ*V²V"hJBLxrk(ձCIm OA]GYېQ#lE\o I8`PU{\#kPFnk|K'QHgXNG]Mt^tnyH62vtЋ+j-jyz@Du?QCCthw\cԖ{Ms=Vw+r xնǃx5si6$p`!Q@ .;ggS#L.u{VѥMw=5[T 6m#d{w=Y1[]7B|}J/ΐ Ta۔ f 4>]@bmW$ٿ%J)ؚ̟ vk ruȶu'󁌡)$;vF-fFgN|ڰ/ĝrF|S"0 i s%ٸw $hZ4Y-3 F8')^6mкFd{=ҙ˸S? #+Պ^l=+mʺ`!8Se T2()|o-^>e5)r Р쳍h^MymbMdXkhCn^Fpߵ2sݖ+ll%,E*p;As=ty "tԵ{ UnrQmؓ֍,}.]zze#(F-d2lIrf#{ șFZ& =?+ 8_G>Q\N ;ɺ3'7n-.tao` ^~v7.j:^lWW wpB?^ 9@VLy l 4;%T":·]RLӬHMύiUvMۺ!vkT[(p#.c-̞E w߯:i i͜gZZ"=ʮ6464< 밟p "ߪ=|B=tڲG:USOfI9(1Hߩ!#cJv߂ƥ\.Q-֍"wyWț\|RjʢIֲ>4p}b6 aFh҉ /UA6-JsLΈ & iIT,+(Q]ZNC3} } 'T>8>\dU=y K_EeBnAJ@|3cmW maƉ8JG3Ô fT*T=/'hkuh= ot5=ժ8p /R~-}g25M'HE%pnru]uڭcMN&ZSqezT\ 0MU"ip 7Cܚ.- s}v D,1ОA9j'^ЌolRJdK~JmpCo2^r㼘rW(@ɥs1yv߈au$ sP @e3k8h2Msd.l?z㵋ȋTX ߠ;]cb&QMLb 1-U-3^ {W>+U<>*I;ɣ0?j J@*\ICQ0QDa7Ոđ. Tc*BD57 C^hsUGliD)# QO/xT m;%9SqѷnoE&zDC+֝Y4TӪ-?#@IA{;HXL.I%<}&bҹ˜ CzsRYc?ߋCq}ԝ׏GB9XMQ@7y'7'xޗ|ynЬ%ʹ,e68$BޙsYsYmp`jAbL*ҠtIqҙ]yZ9IPɄ|˓.cRԨ0} nB0bb 蓣:C)Jܴ Tk ^ZčC D\XײN?W f+,g`Y\ai-Va/K{TN[I.,f G{Qp;Y%Q6J š z}&BprXӊ B!}ObV0k+(;?zHٮ%PO,?0-hX/5S2&Ըr-?B9z맥a!e>$XY鍭lه.,AOP.@r0wP}Ŭ/3]#%k<x+Y, "7Z)/hsR>>6;!i{ IދTSSVenZ6m$ -q̓8#޸AT"nLY̙qʌX, CEV&}Q Q,o%m0& :Fݴbe0k]_J,u o6ڮBCvZM}҉$]Q]@=ES)&z4*G~n0 h\xY, `A2Ϩ0^HG6j ~$J)xXޏ[5[dm!v*ULS;9ofj[Nw]ETh&smGSiUS /C;6p R$d\R;G8%+.K,w Igޅf vsNZ's<}cV3 Mh,[{p 6GLyYŖBX[G͋K5*߸oZrguR{$Z,yp/v2E4!tC?}7-$D"-ϑK?ܭ0!TFf >^.76h}wH:5En z4|đۈiZGu ٩$Aqau,-:e>)Iكvsec0؉`ns[7=v.6YzG 'Y>l7C6JZ:D $k}O v4"4x9qݓIf|7SR$#3w}^|lFGs?tܒ˞MhKTTp4wy0Pz _C4ԫp\.!..J'^m*{W~"Ke'Q).EX w[fIO#K2dQ޸OhH%`5+!&"lG ?c\z`O }-Üs9cP,螆*[PE*DbXl3e݃fHbF&Pƙ?{[)2/`ALUywp[vEKߔwoRΒln]|n "EGʑkGK9.6*QyRَOju㶇0; v8 *4 4؂5bXt#hw42 {Ҁo)G&gg\ =NLLߚDS,#`lȉÍx`ڵ1pZRYo{>U uxGU#yMAvX[87ȂܚvTw_3kWfHpZaQD }AXwzӰy_muCވ;K?)KB-hR8VicvM;q)`xJ_S6hE>VS򨫬^0F_EC ,.[>g)[Փ769kj$+,!H(ko[5''Xo:U*O֯8#py]'ĽmsyEmB|۟ 8l1+jGYwuhZv᎓GP1GswHf}5/i' `/ϱ  s0OT<(a%-G0@w@ZiB%<g ],rpzrpV#Y=BS0.7mfwy/ ;E.@zyyS/~i|fYZû3]:Cܑa,wkK$IUi7Yo8ըdfl9lPg]ESITj%͇ףIX4HF{&6xἇ-upxb]MY_nۍ<0 I(a7+K=L[|U[W* \$XZ5H*ә&Ftj:~mMQM=QJ4 @2<cOK'~}s$Mk2RrC"t_yv q5wa#gԮU svOrwTc./!ݲ1|AbkcaIdλfm6t?jªmGk1[;9Y1'Kas.d;t~x.T~Niq$È߄ds"vrQtvDZzBnqgLMO08:D5n 5v9_fu̓C;t Q$m[j[qK_p㳵o XGʞȭu4kUYv~bO4ϲ^s)_ (6}mCr۔Dj<QWwUMxL":` mbS͊Eq\%o9X"ټ06b[HW,ô"VcS6s .%*,Tb#H]7*qS VQXuU'u֋EXۧKPQ ")lT"æ)mX:lh|lOJgEK..,OH4Q4&ދe6(uMN=$x9W|JwHp wSS66ׂ݈sHRW^ ZmS "7͡8ԏtmv.N!8Į$8Ct)5>.Hxt uYxwC6"uhwMLqE^=SyH_ckD{ǝXKU"}mXEif7Jb=* P|Kd ֬s˿s=O>z_-D >֌| %uͪ99t6Pʼ\ŲǸ=5Qdp#?snnz +UOu&_Wx8S\szGUVD$ȿſr4=m_Qg FI/>V].o!{бUMhO@oZƯ9m`%u WH2럜_p][HHS1OQkQٳ D3B:$~d(__YNAG(5*<`/*k/աiyBS~>6=<PKSM452i6!vDV 4W-N_BXX inP+H_QuҥkLQ8Nlcȴ-Ks|քd7E&)&5%t.61B~ǵEFcy;xTȞuu~y>+w*P=mV^jkz.ⲊGdb.;+!xgpwϟѹy_p 1I'գ'P[#X)MAF '6k8@{yX}LQ8S} FRhG/mkEF>B-'#!CjuЃ6/1E@w.ޢS%/Y8 7p}o5UQ'rJO6hxXɋ(/*qcBLY)漜OW41ZlYv_Ee5l=:|Q*ىLkhҲ߶^.A/D=Gu)>51n!hwH4TϐQm]6HKPQHiiE#'m`򄏖A2N ]˅. .3ȻLJj䕨:2.p3l{xn۪HW ŷZS,YY:6𖶘/12Tpbt=U/5huUj"n4&9.̧oq|[2fawZoNX*ʛC)H6m !nҠO./kRkkj+_;d{M 2byP]g6 K PzT՛V& 'Q2iZV]\V"D)Mt;{m mtHբk,Uҿykۅ3@G6 TO 8dǬG_ eE^[oi#IiRR?>JnVB>sRq b';2Ĺ4GϛU C̪ .RS)|GQfZ3$>K  w1t/|Z8v64'm6rP g77aQ 1- Qp qZ•|a6ޤqѰ+~P]GY;픹)d5QM_/lPC1M34DvdUT2P4)?*L+3l^e  {ܽMyOНL0U5&̷#\.lx;Z[H]Y<m$,^5}47~SVt Bt~9=Ahd.ztc7 (lM]M[1G餁]f,͙Ldw/z˫oo4GL YJϘ7m~5s w ]DLc yI5a shb3鵭^@|x(d`E{&zT>Vw;/<Ө8r̩?xg'+ R`R]=Չn+KO 2RkL (>.Q6m\f&*5L(rH [;tOroY:,%ԤT ENwuQ%LTHaUBb!B>e @0x5ܰ ahfFBKA5vPU 7BW>Uii$^ZgtcW /ǡbK| ,H~s6HFa8`i8Ti#ʭwC)H:ZN~MEyޘ"O*e1)K\ĉd5ɸ@)rq`gr{.3SA8ˇ\:fbԹ1SZ7IֳhBSÝ: O_/?P-h+ TQkB x 04j"oPKp5ulM7g 3yF[VPkcrBb`* Rү.Sr-ڞ(hAܚhKf0{\}`KgAoBӿ+P JuH4Iv# ZU"[LTa+_]0Dp=AP0= 6Db51֋cwڦ7GA\|+1г+PYF<6hBdM6ӕ=Em؃ִ^}ȶ̌r-0 S 4>LBvd3 NkO_U)1MsQ|mWFj*!UξqFaRL¯-0#s\Ǧ?`虓hUBI(rF&Tϭ-f-4"KTaA1[ :CRUpYfistVk0٦8rѐ1)"=%՟O?'w RRi.r]fhXDnITcNn -yX k8W :jru]ԇG;.6nX`,$ބ]7j =MOޙAipk] D=$ ~MM%A pI!_S w̿Ax6K!C4@N, sOål7 hL懊ouUuvzu\Z-gqӎB~$1 N=vJJ,r\rr)})ٙQq68hjE jp-|V8F*4fmc>0U9:'e,90raWX`Uhzu \Hpw-Aiy@, d dViGQF}n(,EB2XMܵSLؾӞ ŏHlٷ 8HIBq<՘e~>YF _ \_\!r0 7í^[/p;͑N.tz!\TvF.'DB\DŽ,2qubM5)Qӿ5[Crb;{ y`vwt 0_*s*q/e0/4ht Z<~=NAF:֌#RL26Omjw4M`>09]$@\=Rw{Wؤ0/W(ɭ5#!n/)%DIrC9*Edz^% ۸vZEcYyM:l0: kA$t~4C4B=p~9/Pm*S^GV2Zm y@~]"ka뮂⵴G.( `Ykm"t.]ڋk`NΥ̨* q+S!u~La`j3GHS0a?:tх)G!= 1nfGA>`E VɹB W nK6x+ݓ8c^KZ5ku^˥u}&g%w3#0wj5ۀ~~I 9KD̀8 Ys+(&*36N5RyM"J03H:q;b $5vf8UCudtnd&:Pd ʶN+K9ykC˄u̪3.^~}% z;#YzG 8,l6LEnXΠ!]g /'6 w r{ di;̱hѩ D;} #ߎi`59uk49ĵ #a3֨觱F:/ߎ`~j1\/Vp.Iٶ3H7q/,υ&=cg6^d9'wbc-ŗ l`rM3M9Nc8IkCӴL6T~NjG1]tCw]؂Uҧ!8#Fz7Xy+7>T XA,^6V&u)|=s)Gg65;.#x]Hanb`K\3"y9s&y=+C }wf'<X5p91̈BIXb ds[|\xnQ Nމ,9 RlGbm3O=Iݼ L. |"@1NU<HՂY>#.m6Ў/i֣x+4"flna-Zm]v3-Q"u>u^$kadAqAt߱`red!ul67XpX;ߣ+4ږF 6GVT:qFr1BҐSgȪ(Vk!DU8_c:O0K>4;4f[h_Q+XE([Sذ7:*B[<|w`g`SPlH\`cUV/4a,n Fb%+v;6ziZdQ >=.٭gL_dB#]0G@rC)'htmMu"A o5eN:^cPѭ7 A~1p=WPo-0Z[R:Y?;OtԌerť#gNy6%wmT2H '}/BQ6+ ~Ǔ w-% 2,ScqT`ʸ{C} "*'SyU)!!~ ߐc}F+ ( tbvE;s@yLXsp)웷N(>z%%Ћ!D~:G] (bڪgKpi氡r+n~QveE~dr7.r੩ݹwÑ1[5ÁE3z,[d$j;v+ԘG U!9|91ct4X'{$.΁7- usX7jK V6h^r9w"fH ՖႺ1y|JA_U F4y#)Ɋpq>Xe><@v;x0˹.!qWn x;pqh%E9kJ8G<\J/4R-1ь ^\ua%;߶K0 juJ<#N>h_JbZ% ZwڙYg&\:ODfdF ZϪi0cٮ9=u4ՎU{'8^jNYLsҫ`hOBErJ2xa9Xoi;q}$W1b+1҆1{Gi xVjh ^GדR1ʾR>%PmGzʉHt5n")!|2xJڜ JA^ U?cΜlsgO6;6;n[ @=  |V+oNHTpvotjWV|N@PN4Ausv.@BB::Mf.*hq,϶\2"rB1];6,SOs ,zJxTwGO=>M~H֪KӞ!۔e`˭\+H#^֦<`9H fq` ]r 9lBE3J}HtWjfdp6DTBawrH?`+'%8a;*M.GhpF+ uP=$8BGb282dn[N+Nv .w 9Y@OQZTO4eP'6WLPf,zTl{'ӧ6ARh 6P 2@ ^{q OTݬfb4-G[@ n˜ɲZ6[ǂe95prrʘnJ|~(_'c\E$%^!W)C\$ *Ny޼E:I4D k q2 X}3f甡ǰ? M=M^\˞$7Ɋy[|9Ĝ₃aRKbd-f\LnΞ?bqϥVX"VR6jjwk2-< ЛZdy82z*:K8 rbɢm3䣓(oS]Zy~L1[ě"^}W9 Mt.lWz׍a;W, : OSHXú:3DѕIF,D;rZ;0bZ@P!LkguzʃVs:md f\ -RkWz.[L:fZB٘Va J%es<I`iAC!6Eq;'PX =Gfk |7jV-iVZ_G q ,c+ǿ= E!Z8$5ML~2|}ҮS-cK^,j"s9*$Au8|:opC2;K85>h\Ֆ%-mLkT}^Qp◶M0dIQ._K!E!Y #BAoȅ V&ML5F6:lB՝ >#x i7Kn sd逎[UUo0"ZR0Ւ.گ%Mbp,%KJ۱\@/qp=eFgC2dy`jn[cާ-f!zZqz;|p.@.9n%yzײTtjҕVKRY4D&QC{JFM~"QCr6&jEX%vkuUPX$ {,*kٛ^Xpu>r8'. VȚ}/zUQhCh0ik98jd-g}<Hq4 Qm)N󗇵f}vDo4%5+? [Jٜe F45A\`rUyB΄~ʾMBnQJc4Ujum oxLt:o/σW ^O@}gzno~3EIA:']G p*OTSplPߦkЦbcQZ }dɇ*v-Iu;rN#o}?Q<+f;+ؑ #S{pwv:buf}k領3ؒw[_Vfь L7ZLmCXK_NL.\k7WR].dž2[Sl8$/TݍW.l%p4e?‡=L#+R/Mg/7'Q$PENQ&GzF1aHdأWOBвfX;~ylLQq~UwuעWT(xH|ʔ!|[$OmVn@ӠfeɃC~ձ/貰J .T!ΔRfVA=_\~Ы|rPU@84gW_U~ns8F?>.-.Qk1&>p>>q)RDYUUSt|ҕSV(ngث?-^2`+#}K~vH=Mf@1(P*{{g D[6%~5KjepVfE,My 횳N>-\g%9:;5kj+Kc}A:j}~bI-aBNJ<߮\Ȉ"dc`[+83BlJH;d'ߺDa/@ 篟|\ӫ滋.Q hJ>Bԥ}]Ɨ0oF8x)MYǕWp27UTGW8 yIG3GM*qCgF@ϓ6r5Quن~֬=쟄ӈ@"z ^GI1%V z3IpnbOҙS&hDROͽC a{l^8LU&[x~FɟTVX-ΌI2 t`*0 ȿ(Y\qE3-&<ڛD%`{υ&?N,Elx{| .?A!Al9l&d {Y\G˚Pm7z4Z͕:J\Fؤv^Uk1 %|Q7 6tCI8#a0->B2f~5W4|޾B9't'pí-S7*Kں¯Vwvs#"7T8Q<^P>yyj@BisUǴ0pCaVw=xCp,)6<.':G d{CЉNt:G0> 4MUd@[GY94.FȱX_V/on{،1Bx= B&H\Yu}}o"q- SۧH3^BW,4wApUDKiI=Nl~2m,S*[(} PE[M1l7wp/gE+<w3秝00[r`LfB5^EW_yZWFg 2NW]+-#4\it g+r)2_c{{dz| $K^29M G$xa_$HVB SNlZ-l*Lc @,p baje45ՍK.6r(dbjT*Ss(.<6:+cbb 7άty␬;UWFJl ͎qezL;fz2=" .:T ē-VVn(h#BTlk@֒}Kݬ Ȝ^> p]maХۍ@箔nKRlWcWWgխ&)p-qKB/t'Mj|iXcj$`;0]_a7+v܁8IuO2$hR.g W155+YjV-66tF0ǚ,ٗߐV`l;d@qŌX0Pp|Z!e`><Ύ K>Ba6bo#6%=_qehֺ\jDxaL^ ã멼27ZL_6-rFX }1I8p{;d}7"m"4]|~)@$E<61WЦx7`́Z^c͙E)H~'C1PLSf^0f_%Gx瞹ir܌w|XZ\?K 䓛rO"Ctw{ܾCG$* b4LIMR'zƥ ηJ''bIC+F{bT2"y3ڗ)h#-3IF:@ה SslGW˥bYMnK. !\;ʏT0@ UzcIwn@Ty.Yn*nˎEV;.qn6_2w.1G#AT62h' TPWMR;nO9v`==K3N S#cfpv O>ywL11d5z Z}-UFCuǜrb.܊n ^Mln|Fi+?]vl )K wX[}`~^o.2d82MNٜ\݈X Iw@/>FײŤp2݊!ZzhR||O1/#\s(vt2ŃT*>+bf c\_Yٍ^}biO\NVލ<fJrS~(j@yOÉ-ܒQgIؐtx6Nxum~*Rp#Mc}-Rʻåco-`eEt#_YI* 4OW)i {Z߳7NyM}t5,nwZȷMo ɵۮQnݡeW`ʋ(Zh%Ӂ[78,gxs0o])2aa\͓jl*,]e'C8$Z~G=W~Z)54ke{K2, XdQԹ SK?ƻ8!`~// GI:r D O'2;hb wE[h\ιYʃ~̯nu\J_$^=W9 gť#-3=>]p K\ }Ѻ7U9bZ'ǎR~rp2jVRN~4wlqɝ2i-pݫa x9kfe^4V:3 k qIs%~ Yr߼һG$PH`Qb%"?jeÔU(4秊W8dMf8f@_L0YK۽ܫ|2Y&qt_qc( Gx8G ֔Y‚t}; gȦ1Mx%k&YTg&됗o*=-hgiK;QxPU:jH%ȝ0NgמGwN0N)”/WL XL@R{$Jɕ,]ӱe d^ijTRV$OM,݊kDMq辠X̛ϐtyVD`^!̥eo{xO( dCiB oZ2Wކ4<ɑ0Α=i.'IYT q@"V f>@\>Z[kxN/cift#2|&spMn-¬di!EO ևmzsފV"ElMtAىz.GeW5WZP% $׆+[Б32d۱wBךv $ Pvɾ7 N1,j t'V2[0gP JxTʤE #IYjh|Mn#3#6WW hWMlJL2edoP?fS``gm뱸(|a3)jF7 bB+!lY/ؘ]~!"MqNuɵCoV<ԧxKCR rȱ*ƩvCzM.ZC8;R7owH:5VX(暑#PPЫl"s,^.du5kbݔz0]IBGwndq8Vs|T/#E"4K8tcDY,g7~Gs뀗zC.:$_8Ŗ$ߜc.GǨ՚3Hdi}Ԧ:9Y֘)Ӻ8E$.M!s/!!Q*x S.mM;q1BbG45_iRKo=Bڍ[d \Akcj=f,@oD9o(qxA*K7% !^2W*g GLE`B\F{HgfݻurΣ/Zq DRB\""#4 )l^O甞#wA.]g4 z3F)}0;Y TN0>MIc0Koi傤r*Ti1&9:də ? \#$7R72'7 䋲 (j">һl-.˲Z Plb*oJVRyVδw q|> ,kScdy# dMn V;׏ Z܄e!W#J=NQ韞3CqΦyd,nTݙ{&.>nlc5yB0(nWAk\, HɗXMc\T {:ى2%R@5"½/k8jy0'Jbu1b 1&IC ~uI}\#4"7MZX$kCP PEZ^jC-}EHSHlɕar^$ԡH1&]p[BwcuBxȎw[b49&%p1:Giuhe{^he,ubdh7o muiy*4*-[1=. ^-θ$Oij󘙇\Fjр2tđCl 7n@feJq'mc[n7Hvp ưQH6#lP+ NTihH{\mSo"쨩^‰K 28is \ 4-]ѱKS/R%|4 gհڶb{嶉%5.:˷c-M⠍ چ6Sv$TrVj`6Qy hCx0(sN5Fv&#zçCԙ@) 1vRh.;{c 1yV-$V=b'}+g7֔P2DkCHq$Q Mb J05l+x9GC%ߘl%dP]5\y.aZAnPm Iǩ.([7:$oȅ|ptNErsPh ]K,'r 2d">yvJH+[5C]e-`p-)U6-PM6O 5ަ| w},<&zŨ0UrsxYk X}5BjH z 񻼭O=:ۖӇ/>va0l;5=x 7gxVIx=6jG ͢63BK?y[h9o髒5L;/.;%#:9:UtD*Y^;ҜX;>\63)mO`ixrS;@~(rp7d5=԰?rAH3*̧KP -bn$b"&k(jҜz'b/*P`[ڶ+EcMUPkc/! ?Au"\dGX8j!^vT#rLOL*< @o~;xQjqO;uA[:M0{z]ud*rٳ0F?? bZ3HIsBFXX+e_XQ%%Õ&01c8x)\i"oҚ]=/θPɭB =J! lD Oq(PF[]~r,QD8<=_V#nvC/k }Js<יL|ܦ*{rE;  m8v3N_b?@&VյdQS( :?!(4ϖfE['|G9rQΐ/gw8a5vM#dN* @ߣCo$^ׄRLJ)g ,o37̃@[}L"BS@:SK<Z{W [8E؏X.C=Ѧ-opqz 7V]rEѶg>f5_^YFS@bdcȷ"\UW 寭Q+2nM(dT[~6nFؙ8SQ4ck Xt\77H!4]-bg8\igJSĿcfo:RO0ܝ/y$*+Rngk(#F*:+͌ a^/۷^v|)|R:AGD[6yNHg&b], M[5 gGq<WUuoǵpj7;D2Okdo;TvLj`gAZvc={J/Vɿ"i5DIw>l| Bjtj ѐDȾ'@(##:M|T!4͌Sܻem]Z@=[Kax1=JeBxX,}V^eSTkmShrj}Jԍ($AJpx=bnWEfڸ/Qp)<9STPul,oEr>╙rt)qߪaGN=<*e Յ䆝Ha7>j5ku'JbP9tiRm;5ZDB4r<c/F*LIEwAfbKxO~prjS)h<㬄|ܯ쏉q1 4@ z>bw1R:Uo{GwmA4g= +$w1\lE%"+/fK읨RY)f- TYMV0V`G# pdP e.5p xUkネ oٶy0f'ݬPMs>+{"R~*K)b`{!Fr&eXV-D_QRT5'l qW/5T]TmpVAi(ЏxR5Rd4}EKrp\|S\o7;554?Z6',ISRU-i|H~>6@Y@j=J歶"hF3k)j֖[HÌ{"֦P6sT Y19n-wӕ&|-0vePoۇE4 l)ܲ~8]%D.yb,SB?|2Boâ$[zͅ6KRـU%$K`_kk { s.#S}p-@"e R&lF&n&HZy4JHO)-_)x PYQMGs$V"a/ sP\ Xj"ϣV~$̣V}舛եs"Qm9PK?Ha'č`8:1S026ÀyePq 14$" Gr s+%=Zo/*:!s^`1w&NT'tL@NX*1{9|nStAN:1vd nW|)$Flбvo꾦☏57OWN/rAgC)9:%.a[~!U.VƎ`kzZ(G [%?^y,)at@!'u._'3AR|_?BDC3c6=!Nu> .؏R*63iNf`s`_= JLѲiĪ*;5#mٲ`nJd Mxh3QMy Wsޘ/-04Cd< 'Q嬡1p}cs :, `QKy wݨ_g&w(j^lrYbrԂץիU ؕK;q]at/_U0.k1hzV_֪R'#aZ8_0p@0kL5fXQzpH^,)^[m&P5ıEygǻw Mghr $[ 0w6pa?p`:zjāwCsGo#f ˍCz} ܯ}C}@L15qGqC*-Fll"XK VU< }HPkURy&l˹7bnDֽL*ى|^X7C$w ٮ3a?pml QM½AAǪjBLk?l%ܢr9Ϻ QCM¬xՈ[_VGOX pi1ܚxIa@'@NMUJ1CLےA*$zb=atL @9TZ7uaq[-:-ގPO՚"q/I}\3azI aUkA|HGC4VY򾇶X~tir✶7/#FKV, 䋏[P\B7}NBMR3qw&?+E2SDx`3]اR9X&t@FbE7L CUبAnɇMɘ"}Oҽ4C)Fr+tk>Uw><%7?j #]O ԗѥȏBQTnxw٧N*VMХ;?Izq Jy3Q }Wga+>WF(x7u>c2R%-aft}6$Yr*?6 ??q& 2:k Za6 V4Ò*Ds\ͩ&_^k 3s.&0onM, ́syL>{;"+ e#@NMp4e|òG]|Ao/)̣:B#?eHR*w%]J5%1Ocڧ(`gO N-юILetF>ftRt<9I<+8}mXWսKg0z ʿxGa[p^$WԻ1ԔN^7+Y=곞 6y2OI[!wK-QXu/s] {:|^BWVNGj kUKNȶT_{X3q~Jp *Ò{,AV]^@2yI1L0|k ?e|Gn\gi 1J0K|XJAD]<;i Kn@+}C2_wo8{w%ɞ(\ \5 »)SPJE˸"#mlH4!Ae%7gK VHJQsѦC v!~*S|_sMw\a)A4qޠ,[α8XN]5uujQ#4f 0ۧP@N*r2QfŬ6(_Y5Prht %kM.d'tf2Řȥӆ¦otm6|)}=1ʵ5 \T AFF3[- gN>;2 ܞr\<=f X'5Z(醢Τ^6 RCe);~.NJdiVTzihb> Me2VcJ敔: HſNQ_%޵V) _('ܶggD1obP9=ƝRqWD )Igs*ֺƘ&y}`ْ_ lrƖm髗xtj9Ҍgd`ˌ"/ ] Mt{WȔ 't%&":>)UY#Ɂ&+p ݼ@#9Ѱ9w'7rql u_yb2$ܰG\n5OxHqUW4i'w#46A*3~ƠiADf[LrʛjuLL~ݽj^|܃jQ8>=ՏoHqFV,rDݸi᪳HSpgg1eu>gyjb Eq/dl-e.H{B5[s4_43@ ĶO!v Xm=TZVA`ۜ#XX,1{>ёVN|Ap]!KEA]ImI2jW3K#8>շ'JF 4S&U(btj읹0s<7܈N2F0$D,t] _C{3̈n( R$ln+Nqm[ߪp2:i9Nܘ=jD\`١Frb9bd*t< ,4SA0?CEŘ`栁q6.kѵJgKnh OfFݖE!,l0 d4$?>ډEwո_ FE-}YVQ,3 );ډ)`KP&#{qV0 ‡ 80x?6jBhNWwlO&k\z~1}fPӯ'lZgJp鉤#%cj$(Qu!s[~& s``PJ1ح'tRb 2 PzM/n$YVU_?u5b`6uߥwxdD:άug\K dV Ƀ:_l tM:PpJA\]Z G߿qnRк+dLjn,z}B+|ŌX⺟q @ Ox }ϗwMܞS-A!pJ,4T#ЏHMirloNvPg,x~$~ QA?Q9@ e:pRCSe% a{s3n+/kÖ?ö^عjF{1M[[%uBʀ:.uR̲0Mtf[LS;-=xl&X; ˷!삇Lt=%;}chmf!*'>'E}O J oJ Zat\Sz1#iJPn3wA 2q{/AsP>el?ZOG?USC]5:s8[Uߣ8gpDe]Ji؉B#ut"㑡#^@E7?94c_{ GJrl7"}6Heb~gMkcsoMFB/!GmA\\Hnj~; n%=yFτ"&gd0:9&쏤vC#Kz[Rί&͘\wTVm9@ՅtRI`}*rGHĩγeB0% {tD/k9`tLd/z /ؿ5:Xryd,LI7w(/Tȑ$T GwҞ)iC)Z:_GtsgB0m8ΟYhvT '< ߲Rkd lGRPg7rzGSS ^W@NFp[ 8NyDsP\Jj] nq[ p j/2 Dw1Q}N~ynBJSۭ\ZhW-f܁=E*b*;y";nlG+0tH%"5cj82/.K=V01wi!4dC[@*\ Y+#S(~Q]TӁp2.sJaj-JFnCEМ]Q7/OIP pa}EF?kN"kܟ [IھqgE#t2jtQH]e2s:n~tg/bNw)a<jMWzpuyUA1ٝS\浢,go[iߒ' q( ܹoD3*xLk.!|B|h~Фy8Mֱt~zӗ:l M. +B-%T_İ(BF +8ǖoȬ#9(Ƞ?Α78KHX|%M@|U=-,;rjlf6 b%a;Nv3'9w\ |Cj>qw^V~ f~!-c""8>;20=Q]"BޚXI6!l􁯁P8̑xՕ I\&31 (/EQ { .ɤԽJ%5ՉKAҮn;0 wy4uT&:x@ դwI 4f)71ETC wSfr.OQ=[.[2 c[$|ܯ yG~wDōU)Ǽ9^ J! .{*u;6 W^ ouAț!6#hZ3v0ypJ7raޫ&7ξ)n#ߎn\ ON0 x'KSE<57S`;"[)!Ǭ?˕$}Vꬸ oA?ӯy\٦ML=dr*&=8vr(Hkfh'(1q|(NcmqT,c48|NpO>yu32օTQNH,d2lU, ht^5R^eVbb2QƑ<X㲛T^tJ$-Q)_4)ݹx 0-*ۊ=߈m1YA׽Gkz!NGNա_?|0wK^KiN%"D{3;"tK}}W f 9ZG C /Nu<Շٺ1}WPrQN<&j%gv 'xR|fO'+Kk0%يgp BG+Q ,+$+"4m&|]XEtQ4*@+C|kt<[ר&AdHi?ISXaYa(*jTx:*Ʀf[el?Q`/Usg@# zcp<[3t =p"7Iý[E2 ,hRtr ڰR.ЗJh&ӾAtKY;hoB?B2JtN1]9M rNYuςjRM?L-V J$%ӏ>:-@ڪhI xLGrXykeп=Ɯ]4&ql-CX 4:+c??6oE;Cuh}Wfx/.RuY;OBҗ pWJ)q;p;YQe2r)R&l\&K,JO JQi?bN π3>fpPL{\& wUfSIrLoݘmLnv0efw*aI èHʁ9ؖu "D{,歎w|'?Ş~k;O:-8|jЮ$r/艇-'yJ$P _C?µT,? 4= \xYT՟msw0U7Ѿ]i[X)2#V=XT$ْ&V9`j3 !蘪$y)(FקP2{E`CuOP?{jU|SP.6fwmϪoXg 5Ebj|K12J7$Wg;lοPbdHV$5Q'ˮ0ec<Ÿ0yaX;5ɢ SdsƵ\rrKUcՙFx][ 0ZL7wH=hR:m{r]~ҕdEMCiAn6!EMb@H&5^Q giG[ kKk86b]2N;*.e0ս ~H'F-I~w{rqWtbK71*DҦ?r4uȶ4rvovsuI6u﹆L+*|\ '+شq"}yL9jg}W2~hO1$yd{QE]Ē+S緾$͜虾B? :%f_/2&>땐4Lja54HL??=Tgۣ51N]OyD)Yaduڮ|phl-:c׾5/Z$1%65Da*i»wdٛA#Z\V6|]ThlGA]|eT -L6j":1EJducmon:fO*y'*Om{g5[ _.hE두W)E"78woC ;/< ľ O NhL?:6MUP@ I9ޞcdƞN#ºUgn̨1e ǣp~:_kp˱F H ye^Di/ jwR /rƶſMO_Q{o% ˃v"$?ua Fp^Oٷ1~GcݢšS:o<H8\!vM ja$iUK :\hkI?=bCN_^:Eo~9pzZv]%Gd=>Ggv}t6F }IC5JLeK1$XvMgg@mc 3jQZu{kyx1z91xoߑ<}Z_I6N*zf,)4 *rzZu U#(Q?zdX/,Q!٭yRmo6G ѶF5 ]-ΗFV P-*3Wȵ~64:P/oS2);yg# HoߊxFd()Py r[ů m+۾ihqQ&˿éBrn >eUnDeY&%g܊e Vp2nNwHhQ9 iUHe~͡ a>Y,6Fp+lf%ƔF=5r [C'!q4U.(Hk3xojpKl 6ms{3VnK[+ \/*.ɠ"x"':M,i|;.ImDyFoH~`#&Funk`Gt!d))A8D6lG(.!h+lԨTT Nx]<.ٛacnȞ1al i>jc Z~[/MFyw}?J2fV{?!l`R ~.]4nAqbEV&N 0C` whe̲m[DCkG&WڬĆggniif1$]e 90A(HqdkRNkYTCrYɃGyL PFjϡb*lk (I*KClVi8CvKpU@bo'r<_/ 4h0\"QA=P{'oP15Y/34J(Q"x wn_pGou'=\0(Fr~Bx!qE~W[T-x6?^azGF!&2=LImnmCN!w4-D>jvf-?7فBp_-? k9H 0c"mTYPOQ> 5bX V|oh Å '~d*WSNVl{"C@V iD8+( %7p.HFAL^ʤP9JSZct [zRUu_ϳ^*8m2!;l׀ʴyǹ4?/",)Z`_Dc `(upb6j1 v g,T+hXlS0Ofg_eK+BB \7B.,'1|RuY[4(H{Wlu[ WdqY+0|f3^ hbw.mpu&Y 2ϐ*EY x)`ѫ Swk TM/$r:XĽO"%SJUphE/?0pJz'ڇͣD&wy\xie:#)Ld7͈+{rI2kBye\YmnњަVб#>481ʾ~D8az) rqf7/ 6JKJoy1hc^Ǣl/F}uT+CqؙTr+л`+ up͌ Yl2Yc'W ɘRP<| J=(:nCI8:=S3չF (BSz'}VQ ߓ+@^7rjTt|ap'%eŪ7\NtmLUQw(rWM73% h*1M>6D1b<.hђD@9n1##ȦFoLU1犓iNxvy5uz>Ͼfejk+u^4B%:jD{N|#M^/"lT@j3Iq:~_X<,c'B/ly)}`Xln,7mJѩQë&AyM/ǢGб,U;Շdw#lc8\dJ>)S@thRq\ y`baRMe1)TgTEvnpFfYL7ĕlV &z Ʒ1qA3pwX0 Ob7) VVM/?4iس-Kw:HĒ[(_Dz]`-v ֡o)!((]m@?L=|GDgo]tƗ훯/Οbz9'.4eUǼ+gș*UXG|É>8B0Vc,R in~m qMpN?LgFs҄d6I5,ǔӸ`痹 A"0RJyqk<9&Z\15ey*ci63h̩b$+%B3Az)AcLRB^ZzQ$-U 2"^:Uj9|-l"c?'R:0+Z@1LTR9PN`I\uV!5`ﷅF%lj'8=1"MjנmDy>WEIp֫R[;ìn{?6JA3A[&C+Hk'ڕHlq3 t$6F4^Sl a"Iq&>SvPner˦%hXduf0ŁՓ gϗ#iۀC.>5~mf5Xh\nvnT4t>N#[uWȉ܃OwY2$r9c*rҰ@N_x?8bmo JPNwOy+bWt6 \ %3:dđKEcGz glp`@GB|u(G6P^l{6F;}pWJ}vW9B:`;obP}}` rH,h#P*k>ȸ 7=ne[z(HE(|P /-w76 =]q Rz ;*8.ʋHF֨QX56^g^+Oь'a7ԗh+ͤFY M|CVfvd M2Z @%0jDfnFǗuJ=Iۿ^fn"®ڬvqd٤"vL;Fɇ,P0w lQMl8fKV{ܠ(>LsέGA ֤ '1˺;UX) o:/p43pv+ZR"jQ^h%O~T[j+ѕ*[4Lg`n4:IEDCe!mK,Q!1w sR ,E+9#8!'^BPZ/ibd\ \ ?*KP=8KYAഫ\|NpDڸ%P"͘snzv RE_B=@ZNtn@5t'-IN@pͧPmgex-=s,/s3%_^(h;,B1lR<+Pd—.~=ξCl @+C_#m%զ@|7^ Os^h\/z@iYPݗ`٥qd>so}é3=crIS]ݨ8`AP/~u U>;):f+!F.;)Ux˽2ƪZ =D*Cx&akXl| 'JX}^?al5#RqHbVܢǕb7=hqQĐ#Mј᱒/cƃ >-l6 ~Zx0 s7FjM ZB[ KG<0>Pǰwgr $nt6╏mLa5J+)'rKnM}"6L& v0!ݮ%~R)tR-N1J'H51f90#HWHliPCB6]r8êfb{0xy6NGS/1i!|gYB[ȓ?7u4I 1bg;c/~fO`rQ0b9bt[+dT©A ʯ*I"-apJri0[Ur]Q4Dp6bUIZ2*VZk޿Y]GwCV`cE~d/7ϙWwYdtXh^ f8/n$ T!(VmqQ7_␺Ot$+h-U  gV"?hQY9F2}D#MEfck' W(ϣC~8ʙݞ4({- Ȕ]-o0p"H74ڷ!*f{{ԙ [^d$v7CG5_ <߉x[%;--R.8g S##'5 : \ӅW'aEL;?]t";@P2NySor(wS[`RI~dY:/=*X,JH =u],򫨛paގT7 28.I_D STg"<lb$,7~˲%_Vm9FkcX}$dXBHRP9lR<3?sBrs,w K%R)+ i#E@ ${ow$1];2kP+L3C kϓ#jPreq8/qĜ0VI< 6HB\ݭ nb7K!0Jg(d$r G)i =c8כ.'ئPߣ54b" |L^ͤǃ=;N9B@Ȧ1]ƀbWv*W{įc 5 dL'cuX/zQ"S_trLF<PA;(S冩Zw% Z݅DUiA>۬WG,3dD/"32f@4p,3=[J?3AՍؼ :_9+ЀB-L]J* O"*N>b6e#?l]|_"z./Ykѳx ͡,/"IKI&-`ѿƅub!SxRrŽ*' \(,a@Si6HozLg_=XsljZԦ,Kv_;?3 oUҍs?`͉M%(kW>[nJ^#]ᇧ5 f0K(Z;@|+s,'{~]rbI(aO RR!QBY]6./fONCGgU&!c̯!%)CM/c;pw~ iǻxKQCy\V2Sz:kI rմΛCULsJ_?SoӞz+dYxV6>f>۰QCKQp5*^^vCj 9v E~(q& k"wB]Tof.x;3u1BsϢ "p<䟯/MJ=g*_ '=<^ 4ck01Ul\cAۋ%䳨҉6F1˩@@24c֑>>U$h%GQMp~C"ْ-6qHxv?$" I`8ȹl{Q*Б?~nU-su%[TlvG!d/" 5K%CJ@*W嫠j`Xl*Ldq\)>\"LChY'JXԁ\ZF)h[%u{PlÉ=@)F]PO.Us:/0Ny3%Iӧ'5O%1p`/g b$F]0L6F NJLa08QHV1z5vx N_ 0gEv Y*e/=k!y2UgW\ q^Lf̝:C6=rW5_ vM R@钕ƬJ0M~mZd#s<[/?F\L+igj\eg~gGQWV^GS$ S1*_/<&]xw{l5ٱ <*J(͏ Z?#qCs7o,!^|y[ :|>2eXiAf /o0fsʓ<uӦFuX?.LI~yqlX3yB`O q-ǙA\a{I$i-Q{ry!I p yu@ۢ0oa"mdtrBxcH'E`r[p 5 1_LYPUmOº51 O=a\D9R -Tzߛ7Xj!_4RދWJej<a5Z>K!4jPt[QJs.Q|qebt`?/RJmvV4ir ҿ'kyHyY! aC,R {Vd};3ud?}mudb uWUkhl˩*xx0Av7 ar9sp8pF:Ny Qi[7ru~U['MoV@R +9%GX+߶ʶ/fkld*6ҝ 'ѷ&5oslc \nda+[鱃_ 0ᣩ ^mEޑLٸy N$t90d4-YƎ?ndr {Gy-jtAQ;FJе0N\ZJl& z>uLMGKy /*e>ӿ3ZiQgn0}㆔H-~Fm&VYH?k_BObit3?<Tnyfz7Be%ӗ)oAȷq{Jf{&Ĵ +&G'P_z .@;0YzqLΡO+<Y}UObaB5,; ڔL,kFpVa zUF]szjv$ڡ4tgaM|\ٺ8Օ`HqRS:mc_Ez84Լxya!S$a( 9}◫S<@|9_>y>u;]CDGyӺ2un{4gh/dSb04yUL$m3!ԉJQtB\9;W'4AK0kL@DwI&todz7o99'-ե3,Xo*N2w*ؤ 8 Yۮߧ(v}Sv;\Qjv4μ˰9,PuKAu0G5oyx3-Nua/8w?y'?܌TpKNdcV&<2GvW$drn̴"CJ]w?^RZ82fnxQnJt0cG1sI.@BpWCOhu='u18(~ xi#&f\MpLYm|D\?%rA..+Dl2a :$@;)XjqSha8*<} uzKjrETbZK'1J<+% O,ɊCznwpo 3tYL}=W߂Ȍ3@ߩoԾJGFs/5Ѭ-;b sL?R s>n#..W<=z.I߾HI=[d׵=/ U?_`:HL<`Wj+ Qv('4(VuCS|fQf>hm"}DsS XD~W,>{89u^}V CBp~YG, [>dȼ|*UQ 0WG>e؆9CBmI Dqo7p7&ήx{tt1 @)JqG p5lv8u|KBc!1="?1ű{5=rdrwR:vPBUqbAP}O EB}J3I+GX/ Zp8Zib3)t-gՂgȆuݑSO2[*eN}ȴK2k2{88(Q^uEDᒆ; @4;KN_Rw`-85T#Ǫ{ٺ2Y.5"LQ{Mm 1OIjlaTK*t.0Kg5B YIET3ת5XGM7;Nd+f?q2YK@s.[~ {2E*է /使"eC|!9!y;;Aam">OIbҋRo;/đ MN'/ DDמUmHNw|Q}]0V1W~O$0 ˛ѐd.+LM|RZ>|O1_ ^eq;S&TKx6dy?z_{qx`W,۟A0rr0 iO]E,VGar׮K.H1yxSenM\ daʭķ@8xg1rƇׁɭlUA7!OJZ= Dd>9p+b>fqQZ@gzⒶepy+}J ndOH^ݜ<Cl?x`wϖBlzђ/鳈\bLl(d1Z̳ Zz=/_f' .YXC @Vϋ=kV8i#T{s92M\?,FѤbd].+?dҀMN`pluՇ}t:Řb!.σ78+L^E/ /$UG?]u*Vyl%LI.dzT&qUSy_v.mZ';iZN4nփ&LFm^fz^ vE 2I >/# r42?hAܸ4?#w.Jr_a#j!hiy߾2<{uwOl4<%茊ոlL}񖭡/+}1Hk"k |)kɣwɁ՝T /am6njWSkw5g}2^lh8NXu:px)XZfȫ)"VF*-$äо!ݔt=ѧ-y-gLX8)He Ac3]%I#$Zny+K+w@א5.9tN6zg?[qcT7]}[A|ҤB:/FݜϮREapGGB޴ {qw=@_pr!! +4[-4u.p Wf1!*>5 YvJ7T/vMn:G[n^ExEgD\;`#<^ $W rxyt.n~6%!'fay&\EdN`t{iPpY?h;^7U DҠcY4%j:.] SuR ơүv[M3OsW"M3+FF+ST^o3lB:ҹv+Z5͔~@;R+j%)ɼ#H3 :uHw@2i3:m0E~ SzT.5$ZR*v V3U^y1BP܇q7.D~{zj-R|4YSFFU^IgIs?UJ.R. j%*MJBA x&v7s'tE2y[E, -D Y\]rvfH8zȧ[!矒:&^{h}~ޡC\ZAY%곳/Oh5U\_2 e ±i!kAW S *cc6 7F92'K,%7C+HAޢ/)YV&LƂjVC/\d"hYz%8Qs)wtp -WYJá..+&;vSqM)(Cf'`.Cu<>}7B>ť%#[J:ہSh&Rj'uuRB}a9x\s璋A[I]aVY'aJ_HK~wxoUm?n:;zA׊` ZG"Ήlcy!=DHоpCFD|W2tq*Aߧ4~Wk(f*[qsHpG2ow-(&V8ǎ0<9F D5{ð=4qҀ?hh`ތOfP#CB6$I}6­(a"KrL L/S=E!U0NŽnDfӪ¡I$o 9kR]asermQ4F8VnDxL\<i4ȇwN&{/r 3N"Y ;a䧘]-Wִ b:^z5Vk$B}dkѶ: ?(m+ƹ-FՇzFll'@ta+0̭%JeUگ߈`Hpu(^k2p>V8 '|'mKba:%MxhD=LDT x1S:٨6(k:Nƍ4XWn_k_/]4OެƘ`8>_iNHN Þ:h^ċH%cy"+N]IࣉU6E/E!\r~tUQN[˕U_&AdxBGf' HRGasqcOЇF`U uK7z%~p_'8 4˨ĀZ ș?5֎^ +G"XuWqOYijy{Ђ$̤OW#L6!@Ah A gMSQY@ <}6GR;nZ CP""X71 ,q̴AFmi0XiI@ Z8 bLt_P'!/7}kvN>lbl!#HzԁD9#=Ɇr.haE>LjbH/ uljѯڰ`pc:<|ӜFOntۦ\1'VR P^Sɣc⮹eJN_VyZ(`{yY晙ü߉5a 8]/|ZIc'j[vI8p2lfO)ڻ7# !t49booSN L8ny[>ko*߸!~|KkG& ۥ)˪5$yeT!6XW7Q/^GL. 1PH7 ;[N m~9w ZF~J Ѱ~.C'5@CrȿQp!>&Yyw]' B5T!b/DYB@n7GqbH_x!Ir_hfD~i; nJEUЩӠ=\]Bjl79˂zA`pؽ?97^_Yq:H2.K LoU1ҫRi3: »O#@ ҩb$-E(݋k% GD.ibd^EPDf,VLſă'uzWGԄjgïT9 ZEf"M_ϱ-)nS]{0 ؔ*@"sx{mI_Ajɘ^0c*=C$տlNʠ<^ϲ.i(v6Q{ WJq$csx׌ڇ/%qX}k]y>\+~74U 蹭<ʅ* ,ۖ8ҟp=D?kTS2Mxŵۋ"5<9UӦw^_ ?pHbwsa.Mc rn0b0N8sC* 6@.52: <{yаM5UYAXX{ߺyUg !Oҁ2hآ‘";Ċ ڥ`?;FǵXgEsU0)mҷ3\ڹ>x`>- Vgvkž +Kz!;iy?vdZ3?wglco #a E9jN 1 ʯ }:i9ȪOtypʩJ|S<%p?~Fh+0dᡄD$Svj ?c׸"[Nb1rEE(n704(l zE |& (p=,=Cq/7}%z> kmߺŷS?䔜..?!qX|ݢ ho@҃Ɩ8lned=揮#&O'4wadi_jX?Ehw,GD5bFkʆ Iwd !/ꀣiM?ίl죋LT]FpC17,e-+}$\k4pQS֮CHf% ~n yܗ,o /2γ5sʶ}əCC01EBu"//hݔBd(WF=&YrF+fS%*c x| ɘ>BbJˠ5n/'Hǽv>rGh;}h8 ?T͠h^+Y\R&ZqqOn(C?u 6_{1sxWX0d]HMr3O~2LВ5(`>%`=XM$}臲g`bGFmsM]IȦ KCj+JDԇқ{_lS$`#>_Q 6 Χ(Sr`8F}wCA)A( BΟQz4 ykl,#]:oC<^Do&17 c2V-Koϣh}ł*;Zyk,oMR;*S@&r1"w\Fؾd RwBF4piGy$ɪ*͒<3R՞Ϭ> 'RN'}ҽ >s~moa2@DSr0 a;wX-3*5Ax#vN dZ_+мdWsJ?>e(/v1|ҽ`뱣{(ܷݠt*ckπLab^4!@7ڡ}YLqjUV$tRG> $h#@Pt,;ť6 AB]5$`{1B;V_6˴ I*xv#>C:ƅAciV' 8>dFb1olbF̋oNc*-ee˙GMtЂ-lC崰dXiL?$ar忆Sj*%(+ZJâJz=1R-B$ߐsqJȱk+{.K;s!NŲh"R5- _|NIy<5l$(>,4193 PxSz;~DSTmHڞ-=c4q3:vUan)J );iLU _ADYL𧎜5F:O벃熞*%*4|L,VE7k.n @τ%&EZ0 [-M32n8ЙiAb.ēZPglliQ%f&S.yy*+. q{gfnuFaYJŁQqg\GS+:zNT>>n/;o!O<&޺e*hTAg'r\lΓ 6]PZ@ip{FDs>O5C̽2UxSaMgs4fBݲU5}z%݌LnT}c+7h`Lul`)/3:29xg7Pї̺;#6x9܆4mOhk) e#h|,:kkBzJTg(3X ŭo*0X@!@Ѓiy~Kv(ǃ+!ʢh)|NĢ鞷k9n|-\8IJaUWShFwYULVn #LZ2 t÷qbESX5 bcw;3-&,醨H"V({J5݌ 9?]W8cT*r?[0RqO< 0Ttzi)-Zc=nCr"Տ Di1z+iݚ;HyxlO7iv.hnDQT0Y9Wtik6aAy@ E_vYnpwXo<Ng`8{IuQmʧ10iXpvm#a?.9) hF!y2g 7bUGűd\&/~V2YV:kޛ9uB ' 8xqggK{nyA1%n-Y6C;;iӹYT!N\~+rpq%ƕx=͘ey3m+j ᯸Qriװ2cwxWL}U,t: ")-9 TC4!]&(ET"Zb5n3E|2!Yo:#U;։ti$Ȃ1q)JoˋG8z67{"u;Uݸ- 50;T[}lCm q_ ƢcD6v|rR 98xݏzq Eyt IKB"!JГ0Je" a)1]GK:W}_},q7RvGHKF,X&0>8 ZCYt]EgRbzEznN$? u+ i7IC-@Ά?ѫ9$1Ο"bWdF7~mk~%`EO+4*~h6"4}08[ /08(Fɹ-FbhVX%; uz| E//5-< 6'EOzK#8" ngMF<Čj`a_d%sWj}gdg%2382{!bīPK,UњkUbUe:8/U"Z^!M7`,E OwuBxo`wjkY$|kel| ݵE!_OhM$sݔ8^K^܈>sBkϤZyS_ ml43!&㥓>IuvM_WD |u9TWz C!fC>U7VD3oҲs%>Csn)ULgcЁGI%sH^Htm7 ߼cH8fgppSvZ iI)s Kk&ߎ?gY9',\3ުA`|$:a Dt˨e =n<(S_JUT; K2ОMS='!W{64S+!Є.bqx9 zATؔʤ3܇G1!r.:钇fQiӂX[ӪH?ejN_^B"tAn:Snb#%ǐu܎*mCf kֆA!Zv94GyX{% 1bR]ٍgnUԇrIE չ:27E peOg6,TvvSm혏Cm,-Mp~|ļ 9K֤T*NM4 $5}㱪`78D߲PQAMTUPF\!FޑS ADG}bZM,=HnawsƑu('U i yxYLdǶ1z_O{#;̣n1Cy WL]\8A%JGN~&+N+ք{vi_,l]0Oĉ[ZQ3t,W5[E\쓎:wL>z,)#Z$H+F(]Ө/`g:sBum zbhE .5ImMŬ gU{~(m)yS!0Yn&$IqcbH3TF;t(TYǺ# #\\xG"8TŧnJ'zI~t̳xb O'60(|6;&vR9D;jjϗe,vC, hpR]akS/w]\^n(06| `k۬0` D#8>+}3ɰZ JóU0#CHT[!NUogeREo%f,3-كgCP'rĶnq&=_h,De$qkPx5KbӃMDܕyp. pz_if&}]ֻܗ? .F%:#\[Ͳ6ݶUkD"'7*uoyF&;+5fD.tDފd12O/U]ivC`up*!I mKkD;6ޞUl[5(W\~*y}6o}e\ȹ ,?7rIAztٻƖu.M^@J*Wpoorc3z`9SA; ug4)*? 0oS횁ߢ}2:qɆAlu M|ǽР>N}73_:iBWvE^ѾZYIsN麴'mw=-}4+Hu:yQ_[o`ܭxUu/t%3M{n(z"ňvF~#\ְ|  )AD3/aC6_ѧU eFGa:ګJnxY q q kh`8pGGm@g&V%1xS^7)ZumLuNKlR?fҧõdv[C ? l~{*1^y)7LOffN1OT(n'f}8E.o4DVXĒ u4F+O0' -xQߝ'鷰ñI +mɞɼNꟻ '[E~Mx@Z}MjeWgخ͒M7Mh@jwHSבR3 _ow 5d"ﵵ[Z>kw v lI: y8X sZio_7>!w{85BÐxz;P,w3 _\djݎ|Z5*ʕUul!qvtC*_f LoGsQғ7eqD_mOyiqdne+G7MG䊻m;:A; $y/g^q3LMf&^QXUO}%z^ l4jbXk=zשoO?-rf\➯$cеg➍~L&Lw+ n%T!-";Ṕ# Q<e(Lcu ΃]Nok?[v/EeK^T\?hSOFvX+`~w~&/ءŗL3 ab[66>LG|-@@wZMCa\ %SKMp1°k#{ )G n̡l5~j.6|@mYaOpgP2e Oα $CIB00M] ȢBTxx' " {6yB7k̤K+Q7uB}Ae^q_h /g/5nk%~DŽhSx+.w [H4+HӉL(2y)Ӑnam: ա!bw4@fÁ赖˦RĬv i1 M2QNaQr}CP<{f…Ac.̚oR ZӫU{EQ)#gkh>\,Dkn|~g(̌0swľ[µr<8Km0  )[ky GI`BDn ]0߹i*{=.oИ\;&.gqGQ 8d{tȍ>nstk0*?Hmy1O` 'ŶX>))I05oBRHC NcnkB%ax*}R:@ ,Z'QFfed) '4lD5|JLDjc"e1D΃O O$d{Ԡ?HBpfL.}f>LG_UޓD^/$/cӸIaE߂nO0لe&905@1/<~iCbjA@@ 3:\N hҹ{jtyvDA rG;c9ŲxٛH8M+X4\ƅZM#:ᾎp}7 v*y:}0Ex:pߡN (X_Ei$ϊKwd1`;i&H@ai0\њ@hKnxЇcKg;ߝsrD"c$K"9]=+m y _"q;8@Ubi?؛%Bߡ _~ ,ate{{2ڒKLI7/cFd%VX|+քgm\Eⴋrx !Xc%YѭJNՃp`gjFZg/[KcB5qo̒еoS]%U'b\]5wA\72E>by຦ $CoDW'd\C:PWA)N hӓ}-k"tJz̿g)Hj%kHu1t$yMFԚ3(*w.V8OC`K=;e5|Q]6^9EV-AzVyyz m[ͦ S6-)vNTŌ'iX 6++͸i'A! ]ϖ+Nf0Bب@9H+IlBRt#jSU=aY]a\x\Hץ"(8ZcR]*qjjSJYG"3 >@_9,Ѯ i/W>^W=-d8Njڙ~&q5Z$ #0oXK xoU/r1k;N\l_ 0VruN!MLIᬠ=Hjf&TL9.]i񐊜<*ͬłµ•`4-bBfyO3=`I^}ҫꗇn;g,B' PYD{Đ)1~7!;σf#zqRR TERop4*ޗp+h7{@u9`]Ef:VQKj}k8A=Bc\7(vSHްT+oY9-C{[VUc[X iSr~w]Rag~< "f -kŎ+6g! ) TtvdLN>T.ۨT= Ebyf7 ,%!EUݥ|2migN"yN/`A[aʇQtɁ\gm^?͚!|@ wA7X7% 9}v&`z ς9l&˥qi#|Zri{~Mg&i`=N 2 5(_7 on_I zmι;TjW浹DG9ư+Pjv}).^?ExTK,/`p:x;-!$oXąs0+QtӤAsFSȩ_heܮ-{<͝^j=05Nc;mm8PȄBeFhn]A ];v,0&AyjkM>0߁l[VhJGs{ΐy$=Ch7|h7`эO ` sDN9 8Z@zl=46!JkGZ%gc_xZI۴j[P0k÷MrڳOm"]V<|y^կ@1@gy-ͫ!ɵ=v&,P:"gE9[j)v QM1lnȯ;{k>`gw%i:ӟ2kב9*1uzsۼr`<U+CqtnK[Az\;% }j?p2Ž3AUqks7YGp<Vr7iwPB>E@R>Kr]ahc*@]9z~-׫>uk es;GwKFFfp'/Φr"h}m;z/yw䤏IW4q JV<Rwћ?Q"gdEZm#PF յ!Dli!/ 3$ z iq:FyE[!):?0EMང@]6S~bZ̷(]/3u{R2RԗfNDwGg*y FdH'+OUHwϞ1?]0XܼI-ˀV9=H+'gM(FFv_P g؋‰&vFN8G\,\t ץgF üx'}2͛׵*U&8hD4%b]|e C80e@+:h%n6Kv@#ڋm4rtsEp)PpDf̻-c9%?K oe5%26ހOP+<ۃ8me}&>)'+"Wf؏8Y\CLEb)e᧐`3V?uP(Ój-=!vwVE6ipvK·6W۱(W2T@yObs2_~EJ FcJ_=aЏDaUSC)R?[yZf 7 A\bM^N^؏SD]>%b%^HҨGuT鹲7e&h=rN3׌j0Yq>#&@ -"L*th>s[PO}_f^}LUv|WEן',B J%ZxА^;Z(Pz-jk+8I>ɵ,Ew*-*\Qk$RtD>eY2 )g`ّD6Gk;hƼĪ%u|'F'@W ;(9T {cx>W R#+Oh\neH`:oԯ2#h#H.2i@*{7N l0*nF#c͔]I1.Zz*y 3 Ur )–K~>@71+ mu;ekN;޼ }jO1'0{mH%'XEvjn,֊ IXJbnþZm ~ Rk&u%i9"@ǰdXEXPi+?qhNHbʒrmɘ-{j QIFdgMml'h>/9`6s1]4AA-3EwF7 iLS jmtSX\gW`#m|sǾA~?m+a=bcw^mfWX#lɩcPeg޶7Gt$8/IngC'hr=[{ P_\=ʉNPE{ڼkS~~cBy]ADO-.cjCp5DW/^#77U+ݘR$*G7b7:Kj<fh_s}y5^cZ]Y"6;޹Bx'*=kͅڶޞ'1D99sbZZT-Tpt_2dC0͟mQ+ "͇)wTIL6 IH:LjqPYp cZLV,AȞ, ,x`Pcc5&Sޕy6AĢjA^U9s t538w O}TL\ |3VaQq`h: MMDN~y1$ϓA}P]A'270Eh[e>_$8º} ^TaɦGiqZly!7&l[-_GgX7^/$AmRs]Mm XVN`OJdvro<~ }S ~ NL9Vu-7:nqX ((yrQ*8co J<$~q$]C,NFw^ZD#vuB|YKYpߒx瓲vC𮝅r={hFR -7MX,f~) )T͉v}xCym 9NC kIwȪWnk~.(N!aA7IX+ ֔13bT(nfwӲ9 Eu#<.~F`GYFN>0 XԻ}:zSG"aC4 UH>ffZ |c6p~?69l ˫R-;Y%o@cQ/\d^ (P@}<6*%h& CqPKVy z;: 4*_ 2$E2ebc4FǑg{c'pO@!s/ D-  Mͪ uu;ޑe>|KUF}R9n|}gCüsn>%sq?RǏt)Nre :و"V#K-avWOՖ*Qkd5.ܞL;PjV=7c .wI>W_vҠg&^!Rd*HH'Y4_03 9* D12bq:~ gJ}풂Fu:Uet78J!dc uH`7#*Q`eٟ.h)=ɀN0S# {*/R<ȴ2yX:{ "F .DRͯ{XݓZ7 /P[t=サ\Z޿&6*&*ϼ]ڤ6eK-\ )]Mk h;IPyT>lN>~BKǧT J3ncB-MkuQ&;Zy9ƅַt;K wO:=̰-Ŀ](B%9O}qcpAvrGRJŲ(}(8tE0gnM5b^Yj%7^g 0t)hU]f%Л7a/NCF&SԖ}S$CC!A5)7GIl OFs 4wm+M y,0H#4vԣ|; 2>K7l7&DSɷ d=5AtMX| DғI{0.S~(hpJlfX7Hc^2-(كQK/w^(n;s`l0P&|ʍTgi(MOY!^o9s(-{< hKlIbqAV]<P!ܨ =A̙q!y ;QrXe.y zliH$ܔcGx : <|2=[T~puW/ao{ ) jlK_Sq"/Z"~&b߂3 ~Qn%" r !DcB_a?u/gcDKyQ1 4ޗm'"7>22:GHt $X<Ĕ6br-/JQ ٥3:\ٞi;.l RN^jMEBeU{;M@T$/Jvo4T98U|U:y2:ƪVu)$r].-|/|RhbW~AQxk#i-G)[j{Ʌʞ~R7Eˎn)5D { xilOqjq$E%`#K]Jf_s(y18a*Y`t6ZXq#8H6  A.8]ɗ<uKSS,HP"6 [H&/S+MۭݏpbT_=ge r t1F;ܭp)Y>F7wi_qţ~jWDƱ:c[)-^ %>Rj'尮W ĦYNO_Ƽf'ߡ^#;)WVCeA/iCТpk( 5υ[; V_2`SZ$9r(h vˠ/؈=[Vffjx1{ mMԬ6n*ͤZskFTW?Itɼq[EXޕ@_6bέ,G#<oGx²_Y,hZmiwwy7H;#,頻Ղg6N̬! L(`uvGXa҄AnM`ȵIeyP\f7(oUF͝HQьOwa9T鑱&$h)à h=˼f\3gsٮKTWlYsS{6ӫmkOm9Ugq•Oecqm3U4cK?Pwzyl0C ;SRX֦3_bKz@NjdO5 `D>~ŁC~:Gm^m[eE%ei+nTx܊ks;a2L>#.2>.Š  mHcv;{&^ϿHz [jqtw=! ٠qi`%z<ōH\cr>/|M?vbA| i^ A! -(Q"/}|a Wp gs:6ѷm=p3ptVt@&4ǽFZMr" Ja n:+,>jWM;fV)1I%SUgZ1*K7霭R( a(Ĝrn2xW88`N4C%䴖,Rmgf{ʞv *6JH7-4.dFi9ݗ| H}ij}]ӥDPxN 'B6H;B*V6L|ކ}L@]~B3[*_bY{x[$Wb+xUTT}ZkGfE.dcRuT"x ŗpiHelwIq˯(3GάV Ps,I~ߡ>JLpcGL[.L~Sq(9<$ڋ/H=W0ٛ{s]Bs NzEΗ3&c ^_껲 /̻B QRt9[gPNݖmۧ B땗jajFMxc=k_<0Sb4}HX,%, )v姣R;*o|4"'GT:_0@,A,T]8uBkE̺f4AYg.i' m7aclߢ97πVO-\)q:d~c Et_fG672B!,%m<ʟ赾<@*xg띟gx9BVTW(Uw0lY2$#?c,w O8A% hI%lzOK`|`L|5Y0WloK#g-6O^ VBW1t $+',Ad#֢GLC2>afgYU$yc3V`^G_ieFi)&tËc !Me-f1ղmK^ | P uUhȥ&PA+=M m lݦ6\i-<-4wif$mud&C5@Ump [un:UZMVnoX'mVt0%eo(2:{`l GW߯f@Fҙĩ7B8TXqyt(0ږ9c:1GեQ5jk*/^m P4+ {uuco>Fg)H*G$rw_Lm⨬葙AboFD9?T`YInj0n)*^㳼X apBM@襚C Ai4i1`2O_-'"2xFcySI[@"\۠~(óx2 缭; dP 1MٲX9K-lG }gox+_LqHux4#VXD?YN}/wؖK7>/L,aDQa sDڱGp.@2xɸ ,^~\j|ʲDݫgY`d$FW)E5Oŕ?!dB0*Z\},}IH4LO: _ JPZUis g~4J}'NO4b %FD00O;'-.(B<.U]3'rBf;p tuZ1=Ȉ:O39>xBƖ"SX͖ 8k9_pCaYMM)/l8QJPquVXqv,-3f^Y3㢄'7! Šij+ˆ ؓ#+xxHsg<:ߜEK踡 ZH %]2yڿJ @[:ϗuXoƠ$gT>aTNQ~J5o+_:Isu*P< %ш {}`f=Ϊ*ݪ/{ 3^h~u8ci]u_6AWQv2ou?*u2 ^:6mgvQoc'VL `} M=>d1A9dꍽsTͺވq % n1Y^%X@e $[49˓q#&4AJrJAYG"0;#w&N[Y ́nrޅ[ h}:Jk-LNчRpB{?IOhהy ;Kmݓ'@7(gEЦ?V2q2jdZDG.աJټ|Jr-hC n0j@S`_Mf"HbۡjfI6&yҝj3'+kA"xӖ/$Y2ﭿ ß&KO[qR !4EL;n_<߀aQ|5ƕHux ZS'im@^H+JfB]B c1Fw?5hb-57;X &6ΓUCSFo|JvKYF; $^둧+v$$6)n"/h-$[lO4QT~i'V2JB{>;H:Xk!(GFZQ< ɧX%]–xD[7SqB,bݾrNSP"Nn%yX› ?C7p?/=tJ==B{wqJ!=dtʝ}=Z~yW\qBUq~BcjwgsMkOg}z^Xk %"]WE՞PBdi%l΂ik? \#_ %*ӘA[[FƊ!PXl/.RP2<_)?.듄AC8~ƔJE#y{\UZ]i/=SUp [%13XbHt#iFuk zW`0O= yڂy5qX]q0C+D{c)ē-r`/#׌QkO 3ꛚYuv!*26nK3Vl}njbaӁI 4Cn`XzcCnrUa'}(9׏m&\Ie$e'-FS;`epa=xԮ~BAw;h{vBV^1JZN|kYaTN`S%Gl /Yg:#H< 4ݟo/Hq ޡy9\0tXlߨ/`,[o ~h'x"+ xɮyLx,fwOS-oyڼ/wz7no[O{?ۡlak12"$h#Gd-ap?K Ԩdxd7;Mn}։3Y~IS᣼{/j h4S*4/YϺFz;zWdڙВYv٨g^T[R~:J ,>_l˦zWo0%!Ûl8boka7Gi%˱+6@ȷ_HY76Y2W>~Ht[dMت$ w)BiGCBr$ ̌eqkD0gVf掑 I.0dh= ? Ý Fݙ ?/A2Pdӵ}I8j]V=$}}^|&bXQdo5)SJ&,U%m6a)[& gpzYVԭbM_>u9mKB`x!s=R>T̗4\7uYn h` гϢlWC< 5IN z>JфA>+AYG$"YE!-9U7&u=Dl72#Fm"M|n8Fb2ߢ7;֡߷ ʐԝ $kP # AČK6ۨ/kasf}iX !68olˤ.Y r S` #uHg3]JQ7i_(Ktq%HJV](8Z|Bu(ۢn8'×!, |$'N(z)J-gR69&yJz!x݁aթuQIEQ@hJi< 51X ?X_ѪOf/6 RZ04K1F a`b53Rү=?R4ӎ-ކ9dR;7y*[:L P܂3E`[;}ݤmA:ܹŭ5X,гcopǞd z+Qv#sm8>Q9B+}4xlS ^3ϝ(J( pw_`¸g,aGC) ck!@P1qg~A\ק g}I2;()Ѐ>1:۞oxfk+'r-Dr*[4=x$0&n$U9l}JFe _dYVGg13b+I%0̻hE˂x VS?8 5 Ym5(w=#q3a7cciَ}8.ȈJ?~uV.3@ږeD\>dGg@ P1~t Dt0R^er.H򤆾|>R#!jcE*&gВDU)6:nOv[UUrݳ NeOZ0*چ\$!O'~)x8\ş~/[u-`;UD^7怖_!Rejp6c̭sĠ\w;.!#*i n *hc0O=\[ޙ)3(\p\Nqt b_+S:Mh{хQFfG]Xui5:p_+ G{ck|MDT2rEfW:fۥ5Pshͬee oڥZB?vM0]a/ժ zK˼: Djf򶏱^<g!xmOa H+xn(*T*J`dnւa$lP-YDl֔r$%*O$N#YCb;ϖYJXU,ivÒx%N7-͎#lDǃRBnaCsXpC%>&6R8*|oE>z@29{9ؚiVF/Yuhwh%ySW|RU+WDW`׽I4Q8Hp͐Ti3c27w߼V*\c(~gyaȠD`\;/ ?.Omh$ GBq8% k)r~]C!mT|,(]6> ˇ*Xq7өAq"FT &'yץ1VDe顕mr`3:fSCJ͵wǤsVQnaͰXz&:޸NviC`Kn$;˕1 |R,M44H%]d龙a4Z~+::PeWxl:RYlu'4|TucL ퟡ]wv :s=_,uF:A+VZfވZ:!:kBL)Ė.3[BY˘!rFl4b(pv-JXa&&l)}+Z֐D~=cmr>gf gFQ݄Rh+!nsJ/NS4ˮ8v0?whڹz(].,mԴ`(z4!c]=(fb^.:}E"?a ;F.[~iv MvXIBeUkM Zo/cSWa.Jma/e9jrlr'HFcml1!m PoEEմwXvnB p 6:\q!wX4(Fu|]AtB4ٔs ǿAAYEB -_2-QZ3db+#Ֆǜ>H1<)C-v+WP$U(.8xtE5:`f1F8{ jdvP93w 3u9Xfkw#a!Lխ4r{Zq!/#nظ/U @='H5x p$^e$KI>^{ )CK.v/2NQzƨq8@8F,w$6G)wF܂mb6,~j(/D3TejiSZ ] UiFi0dFC2*ŲAWC.yQ;3/ $$8KLjJ}Zj*^gY9Ji(EwoE ĉ"L1/ywLz!Wo8Gt EVHqÿPD-09nK >d~ޠt ?kd<Ek'4I#:^,Nw,fۿ4 )g|Wݺ|@k+|J㈞q♭ wsupy} v<h4![ZTp?D`o #-l,O7d{sNVdp$r_B L'.0AU ^w$*:9] ;5 ]gmFg26[76^_>Aܚiǿq*bB_fKOyg:Ǎ1ݭ1ՕG^!k SDuuHQI:扚UQ"hd"t p,H>W^P?-C]چ /ek+.M&;1˓ëK$h o5cӇb%E">qU8;$;94=%Wܮ3qE)eYS\"rQ90sw*8O.^V&<\`Hny[q୯I mOeƊNR% qyMjO1|v 'bݍՍHnyG]e*>?p?OT C<+E"U0^k~( M(op(I;%*ʌF,ٗ]d\||(];]$Ê-Z{Uor *-(+KoU p.TDQ$S>c\$Dltz 崸HNn6.'ghF/Ffi Aĭc^;gХaȟ&"L>SnsJ%Z)\6怑 5& zayj+$^hM\WЭ㒀pj w}t."f?+nFJJRn};5r̖3Rtz,zWT%`Ί@bOi@+7/aku%;ÿ7JbBQҲ hpTFɤ=Һ̬ploH:fkHtbH5 1(_ؘnQl΅ $H#,D6'+LAwzm  ;DX Ic[hw[Gy7cz`)]$ڃnr6DŽߏCѨ|%!48<Ռ}%\mL; j%BKϛuz/2j[q+T RR:X歽 ]m)qP*rWzgy\U\l]3#[fÚ |UWw8nƈGK_0v*)rot];2A*ؿY- I#}C=%M-xc!NED(,֯E/mB%kf)ɚ1dFzM/(f`j$=c0QZ~Y(Ʈ}{ԑ+UADZ7׷q_ 7*DZ&d\ztpUw@[kZw\z+pzo7^z~*" QsFٲ}9]X@ \^y4~͔GņNa&oD٫>s#+^*CmUo&_5vQm&_#}gًl~lh]Z<Ko$'mnk\IИ1YA볳Pgsmͮ Y9£.Ȓj j暐Dw]P?hr<+뾀O}txE0% JǸn=aG\"vE WLm;DO[ɩB :ua Mn y Opz(*烅#@w Aט-|fgHyUÈ+wÁg&<{Lu~_[e9ًQ44 6 w]uR)@æ!)AzWbHvE>E\Qr4QS0L"mR3L +g (`5no3PeZII  pq d&wh4>OB|]NىWR-l^Ư`cg9N}e OcU<"K$7D?zBo<˫ѐas\ k?L$ڨCila ށ.;}aO*)gɔ{TYRbkڰ<A6I=1;"#Bj;T1pђ_!2dM6#OFAIW%Qp(79V 68F xZWfݪz9lٵ.= cZeg',a^:N\ c)6FF'JeI"fgig^*k=\.FRw;N=/v(ylhVZœŅ156{H~.DFlSgzw`yiZw-&.d:bZfAc !T4oX|hơȭw:Wupk>BDl;u"?O= ɤH)Wk)n;jQ \6j_Dh^:]Sv93ػE%-$2W2gF.o#'G*$oi3;UuUҡlZ߲ ,rdD}YD?XTҁ!?#s?q0?nƅ6|fߓs< y&XܔO Xri-Mv>5`.p=W.Ạ^5DAN+p1! WDRo2w>1y_rSch4阳HOt7Dԫ&u|d46v^v}d0_iqTwh1`<6"m}ܒ]l @&C#3p/ҕL K BznUD,CA>%DQ3 /M KGHOD; ;>/fnމc@[荿Qq\K|ާsX7\hb**"KDu^ԜT=by!ڒ‘i~Cɳ?PfY̳2L0Q3H&<<0 %pMԤ^Ku瓙ݓVЌeBL"O^zOMSkfggWڌMϿXs9g2 < !Al(o&g0n2C IS3J}֥[ɂ]cYZ- M~$ukprWStB=¾8ÛQj9iQ@[pKy3B6-&=BU䓣.EhI*ؒz)Gl~8l4!sM7*̰͛%'Fh8 xf:c_K }D2;B"sq{"̚E,ժ PLzd5u2#4.9C,A+ݒI sO/`ߧ wF[q⎉NySxoM0QtyTbhlFkT:+:\ZJj\2ZBGu7,׽-IHd(9l-˽ l M JR篘Ί*L,e ojEgCc M͉2s-~z;ޝL*;C= 34=?5H0k٤'[xխ9K\m7hi V" EC-5vfy)q[ؿb62Q lYoj.߳И8k(6W &N_C%vC`"kG534˞߀dVLGC?9ΣW1~hzgXv1Re ân[64#:hhw-o`Jwe+KLOhR7dmo~N5V0mȏ06j0&`… ۻ7Z}/ %83`q ۍ] a2?If?ɉh#kl nG!?xC D֏$zReQ2HnV,p 47XQ퀲4J-Yw%U^T|SnJ.ܱߘ˂%i&GU崗;N;;jq,)p $Rڪ9YjV) Sb䅈X;Yݳ0{}O&KJp/D4K&St&Co͕f.tO&2 <4xYUvuK dW;ײK(Z%%M D|;/S)sN.s4pnFux2C^7S}0uh{EsȈ[_8a^4#zs9-PMtJzz*HP2t|SMp4 ŌDtWe 3'ɰYcm!e?U:3*E95.6(ނYY$-6m.h2ÑԖ4zyz mvLVdZoPQlX[Ӎ+#\bf,$d[DZP%J)e FjEuМ܊?oalʎ`NnG!<)C]D1Nh|'ZA5DW[*V$/'-DbxwN:qLۙZA:\U qrpa9qE<)MqbVl*k^ nD$J\i꼓],mg0hxt~,:r{Cgvr F$R{JM$o(Xa$n/y=df2Ix'N`ݞZ2 pFȺV8 \4ȡN+DJ+B|o`e_bd(璒sЄemEvUJ#I%u;DX'UQ냃҂;aZb5BqJ7H-Fq mЈsZ<-xesg_-痗 ͏i\IjrHVsiZqi21 Pf% NC'E%fz06v[^o#%Ue)@Cl93p־HF֛vgA+drQJtY0Gzz\,z'%%#gLz74+!Zo^}KuO!HᐏSM"PK6OÑM Wz; =AɀU$,Y#d?^ ++7lInb2' FTyqmx-H@^7$;g_1{= o9,@0io '%zU{~ jr0>AL$Y)yv#\=3l 7N4hwF[Qe_ɶ08fO!@<yz:3I0zu4:z0kc";,_b#9J1&jiN0+6*Q\<SOmTQ ^|ozvQݔzgm %#ih[0䊱e{O p=׽yOsmgK"慙^T+e4NذMЫ/4;00Ұc!@~}m%'U~gђJ%w̎P7և:W R!aApe#ƀ?uoomU6 •Kڭt5?wkDJ3a|^ͅs4~0g.g0#A2,-lCh{H)a@>I}-5${j6gnWXLժvvϒ;O-s7"\@eҌr(ޕ!G )DhB֓{Y}<-ƹ$!L%c/cF#NڜWXeCwd_~aL2RPwKx_JM[/r\\=,)1FW*,~a[4^vrRRaoțqSei\ÚT50"Ĵ>t(u !#l8~ sV#5[77D")oj VUQ^(d4 &c9D"Dq=_La)O6 P oL=@jp;|X9cwIYixY':eT2gĴ&KY׵^?l!mq}m*J1Ή|AiSsg,  Gu78,~P9\ iQc8}%O^G]QKtRnL%]:i2+_ӥ $S2..C <@(G}|r$%HEh@Dʇ*M%X GjD\A4.sViW0RUbcasSfa5ܘp|/#HwQld[G Ǔ QimbvnZC ,UqH~:elz@XDôQE KNOjc2%(&i:+Bj|jzQІ! JkeoG{dfZm\(mtgFE"fBYt#^m*g\F!P^xt*-waõSJ%|>U6Gߺ^FA<77$h.8ugcIE:|I!B !N^+ԹEQw ֣JT\տsޞKes5C޳V ]ttALXl(sMʁ 02TT:ք)+^kKCܣv#@!fW1P W{b5h0-^*}$; Q<B~7-|v = jMHL /SƋ[RC^ߕ_*"묿F}Q}rhێdy[58ȓBmE]3Xtoqy|H8p_r۳B93'qosX|v3% F]z<)I>2l k憹M+:—5>i1UvZC1_A") aBƤ57U'@M!DܽTpc;XZq>`CJ(Zy2"mGN}7*/i0z(5t2Hʣu6Iȿn-q44)wrZ:e<| XN^Q1Ǝi;mj]Q=c&7{|lb΀;px? 9rLPPxDؠ\ ƶK $$КH.xBFV f<}XIAR8*NCm@wEXܙ(ˊDJrOwwI7%(8xJ@4m>l$j,{F0:^vNgʙ-LN7`U*!e^ŲHbc[tA<Pwɾx@UFe~J0lp02K}jGjBw&b9CVj~jD5t9,af>ysEĵA14HEQRKvl׎}R8:ysAQҜQseX7P<&e4sx wW]Qb4ߺqr:`* -L M?AXuBv='PXٯçΕ '7E=R? l^(F3{GvD[籧DZBh1\'ҭVAа(h<].,$+6ZXXCzu( /Yš~F%O&K`}e7?1$9gKh7༉WW!}iu!±[}2 /&%jz.ϔw9"eu$cg(GJ]4D.@=,y0r,?bpEm˵2uc9bI5s^)} ”} ?VWs_B Rf\]$Jêq3 ɗ鲏Zģ(gEb('rTD rҜ 1vr̓%t?ұ\4@Cd֖֯~cey,+ wm)NWp>a."K/Qjk>Drq͹eנTL"\DML]8miid ^*yR9>U8Ď31^/G9\RD`) ZTv~d7zۛAF5& =2zLm+Aiey ?w3@#.aG \<6F!SmFMu{q|A㔴,xl.}1-R䊼=&;$dL _Y¿@P 0ܲym61VJSkbTh~l>M`˙Q,dS%Kēo9̴oH5  E,˫qDth9 9~I' 'QBIy3TAwCo}Q0![=BШ m.kl5Jn0s~b=K 4׷z\"Qcin?'y0"-&ԉz]JѤ_Q2>3$'@uA,Lt1ԗ;\#-e(ՑkT{Ӝn]~_mx!lq+p8)p&Y<\ѝG7\ohhdX4~x'#:I u&[7 lȦV+l#ga&J4+Ӊ!tER3Lep2^iEZz›DF?CmeKj@gu EۅCvڮ7k4|%pu;eIgb_V(G8p"MQ os!apgj[oՉ y~DBCۄ>Gw>#L+R4Νyṩ(fB5⥵%"LGv𬓊Sœp ARC vKVc5yQ0R!)l{F!7rU 4Ll5G<0ߩsoıW)~n_ћQS22+Yh{Rw%smSUr˽$g7P B?}9N.zxFfF=v|p`997^.D}k݃ۆHHJmVītJD@:OavBd-m i.K(eBtvEt,'VPR1TS"{#"j'Һ{S]¶=no #⯁ 0$6?/\E z oqO8BE})7"U1*J ՝~eR3 <&MD-p5;Jy^LV@5'CD4m?J-.G/x=8tTtp6rů\|w/?s-zF]tv=B6h>aY:ܹ*gb401QU(vؗ?cBn:9?'~4.y,r癬T#vjelAޟu&[HTei0}z1VUm>Zj4pGh\I >ɔ6X }1 9([ŧuos[ }?"&;"sH~56$-s* &>_Bz αJ1ݑžt|:ٕ^6CZ|7UrИFӓ.n4:Ҵ+)^7*euzOC. . i3nv$˰LK@ {p䲥5Lg:%6B>Y[*~ uZsajQ_8_ o3{xOE/guN '¡d _ꕽo.cA'fd=۰^d *^&C%g*4>Iji?!ݙ}{KQYta}N糑ʍDdA]Ր[IYt@"dˀnkCx`xT5cCe՝nc1FAjA%brw}4 B2+PR)pLh$rۇq< &rYV=Lz,.`?J۞a3VpJetT| mI cꃜҒ!}G:E݊nL?gꮂ!xT Uu`D@X0Wǐ0k~6ۍejF9w*"JDhG؅MgaYD9,Z)CL*AGaɒLo[W*EY.;gIg9|>*lG~%˃A2A3}*It =^lbCKƒe~h .1'l9O_&D @I(剷CTNsdXc-,պ%S`чxH ;@Ѣ2p#B "`Cl9>؎F)?>筅e)9x{aҦ U盪c[(?%a ?CTePUۉ+.Rͥ~`mdȰ`pOs 2[vQ,bC<#WTC}Tf@k(#&SZ`pp5(N5ðU55WSR;ezUjV3ŀ~@Îheu?+A[U ҭc`{ˌ0%m!\>Jl ÏvSZLL  ڗkp\6~B^)M`A*>FEV4> c|q Yd+P4Oׁ=7kN V[0zߖhMiJ'>xwbF} mqha^09Yof dUYi&G%Kx3q@rKWw.ۄ3&>|9,Phmyo5F'9֌q}$u+Փ 6Ji`ɑЇ0lS.ՔbYswNri1X"hSlYeoZzv.<<ؾ K[5;%0"ZxktUwR樫mĦ2ǰ 7\iY-6C+ PmEvO,heK-Fa&zUF糷ɓL{{ؙyIW*3yȟ1حrK]O}짰3X!k1l`PF8-C1YplՉ)@.큢$E_`SES5LҬ]kj _VD'UL;hoQS"+GE?R56*.&;BOx=3d`#֖눗>H~֚ +;SYSƠ8Shr1 I I~%TzNbl OါP[6|i HvdYs.$.U+e2d䔰HP Tj04TNt寲Sw%|$[|[;Xz+/EZo_:vXԌ{!qQ|mZٕv jȕ'*Yʹ #v^y\ɝ*r5R ybCi-lu3 3ߑIJM\؍ޯ8BG+-|wQ[n46"'{mMl6w 5K@EHRQHBKD.7Z$Xpn3qBpH@Җ̉ϵ&GEkJU(!!ij%L'F}DH3zfo+~]s;f4S}v|=NIJ#=!#3#h+YUX%ō;JU'TK d9hwVʒtAG)5N2?vM=e|¥$/=Nլ*%&9Cc#x!rUH~ƲAloX )X@^M);\rkCdY ;aNw=W鵈zCq*f 'Dt + &sogzS+&='Aמ<+jdD \u}FM.K~ԑq]CpNZ-B&\B&iEY:f–O'?6zf,gm^Y mM1cf,BUA%VŀGiQ}+髂R]g;IRY!zՐqs8Kj@x S1u$*ttm-r]C|XLedytOWc:9ϧ,fs~Gc΃:q[C]fxM%lκ3ӈ 4jk r5[?U6n(gl$=۵>_/kWo4>~z~qW+E(U2 *g1atJR׋eA }z}||;Zhp&t굱}VY'C]#2sΌ_yXs8SV UfHX, hY \| z{,zY豸G[$v>䮻 @gBC5vWau^"9%f8+IeLW s:33p?^~r}3=M+&}Q~MСB}̨ L#~ڟ:lGٽQ3 kaQ>]?Fߛ #QOr0 xT!7yS݃T0(uW}d) 6/caXkǖ]e=&[{PpNj<:' c/ W_0 Ӎ=^=9R]p|W-54ojHM!SeAGO}(:r BOL~ BƏi ء;}ܓV߅svL bJԱ?ݗIʕkRHb (Y^tzx63ļ F8"tFD+Fm>*)Z"0|^WR$OR"~S &=OV;}̖dhpߩޤkڝB)D,C+_\6h1? KW_06yU?B.HzCiÓ.Yc}G~k^1Mp{ٺ |HAN/&F\f%FKE8|Fϐ78|IG?P6oo:%l nvD-UBX*MܙR+&3E?d?H AQK>^r]V}nIaJQ=y4~1Wj2S$H &(wZ,xbaaw{EY&,Vkgآ "߃0E:a=e<ܟ!f%{F^ӌ>@ Bl"WiM6C( R׳'n&!:B7Q')3#F5Tt?X[*er5j7Gm5qfXjeo~ZKBmMg߻Ui7,C\f(2D2MC`}R+)~3RR90_{IZYe[âkL{R)؝[wVJi-{eF 8aC?*yE}-H N%&nW bIm[A޼}W "Mt47m0hddHތM:*GC2uHL$WP`:X>`jF2 .˾# %nNJ}P =6fV"#V%N_K:–K\!nu]5Sw~[osdskPGՠPRVq34qMA ԀC1Yp#ɻ5{pڄDّ ȥb#yNяo. MV8JnKlB2}bJGLWT\abT }"{+r0Ɵ%TrD/T <ПI=ϭgS^g_)O L}ʚ/2^̵!W|1H>{rnwgS^]Q(&9'WDSah#e6 -;sc/)tWXALܚm ykjVʲޞ X QjEweTQHl=ף8 "/C[.K"ft6Fbmp>;6ڵ B\/;v6*fhD.Zo LRѰOU [$͘oWSWZ3Y5pI:ռ46+ڧQ&1D&]H47h| EiT(F~D0R oqWcg#wQFيJ4"s#FNtGS+4IJ|`N'z B5UI@Uf{LHl靻(|Ho.A`E2h ~_^kN@^g$T;u8heÉk/yB>qW Րe?1`!]Ou|+va^A"钒 Mk?WM;!@ĵ1pJȳ#[7.dIԇ Ȃ8`\YF"8 nȪ%T%5n3!pNwJ.<9RȻtZ~6*@Wgu},F܏,0Ga,\hhJl+!(b>.bsuEM1xXthk߆wH0VYPx}جb6ޞ|w4ϔҾg;pp_+2 ZpH4rpyxN@\éeNhtL+2n@ o !~uγu]7U1| S^bpǖ'&~5?ǻȳ.^O=-U-@cÆmW8_[WBuk'ԙKW^+ˈʏBd TX4RvD3`*C {rՑ;`U2@V/%qmsLVpDC.ALE'5\Sp`}!*WNmFzllZOA _s"whfya͢X%}j_f4ztQD-§hvlflaR];r6Kd[}GnVp Wa6Ilʔ#7O^bt1{#o*)9 Wte~t7,2Oc/z-~QW)g<5lD7Y* s8= %uOJ;we}f&$#Z-}a\ %cڧmpJr⨜=X0DJN :~H~ :qj ކu xT!7݉Fބ3S/;&"ZǮGM6E,Ap!$@y ~Jt(W,#\SX{N͠ʖm߫3Ow9ĿϩW՚g>Pwa0 c:^2#ka J) #6)ܵzjpmvdшeQ*,%WWJz:gYy85": G@F½ڌW-rHbدOJ&'fa-GULxITi0Y[6`[*6[5͗nMQ>!3HL$a ^@UtLq!i2 .hv[^D$c߱\@i1hr_Q/`.5؉-ZXv~#>66.qb.%،v@ 5TNh vʚݍ =\DaYZ#aJ)a4~G 'x԰7-n^<9y eAIշ+U {ꟐSlPT!DdVMEw*Ic%'V(}Kچ8Fmn?,);ٚ Kp΁uKtIĜK\X9_!GGze4$vOޜ'9? !=0 q&Lt9Z\l &Z ]utUSf$Lihw:K U R]oԣDciɾկj.!}|'qUONX(h(x~Ps?Q;B k[<7Yw<> ]8ڐ(6pe]:g:<3 ںQ ?nl- SW0uc6<ОU,X{:<ԓRYeъ:]nsymVF_"&&_6.԰<6|sPg1l"Nĉ+xٶy+ }M [Ηfqڼ}+;="3osiB Jt)I֋ZY=bMLP[Heq P: D%X_ %9oֹ±kWgh]_IO.6 NbH;\^tZd:[4A zQgv.o*v賷8Gld_Rv"(,ȧ-|QL`wV lX]n'K,4 5LBw[r..f ?$ZXM$mixӪSj~DǞ:UwK8sK(J-`Q9s[!}~y )BA);gJLgbK%A Z`L̆) D]F^+Bv1]m DP}mH:V8Wq׏6_>#Ż_:aY3jh}מ,ޟgײ7VީKacUyH1C{U0N*FЈK/>{qYr(lٻC٥W7Q&eUEq +J'Ze쉨xx%"ݯO9I̾ Ç?Yx\*FW',bG?@V$}?}^f;N^g/ΩcS$1˯w C;Wj?@yH^ӧoE j@h8WHC%wſLXitj#sEdkʱ*#N N:& 4``z%`:׏'wVM|!qlQ pS4՟;k"@CG;yDV96{_#LW7xʚgq$=+_2.ӕhlzP\47 %pj=߆K l'cQUij:mbP7yŊÅۄZ]w˲ҕz5ngcO 屵7Ϳ2t;[Xs^,oȕmiԘ3Oz_ʝV.]CP5re' Xx0_fYH!YvMӑ+S794)";- K TYmU~z'== to9a_ `Iբ!W$9ҬΙ<|þ7pmu11G+*ogP!PTVS( Z,+.f}y ck$=dU' A3L~ 8rc6TGCB;߱l;pХ?0Q#Jz=?h2Ap =Nl``2Up(jiUӓ ڭn M^)dP@XR8 ACϋ"qɳy Fh=5S$/|SZ e54~Tv`'LP,Ԅ^L!n"/uE#$'!=rY_nWQaQXacd!7eTdXԋ >>_+ DzΙ hT6vY1lM a2vIg>qΓ 5)Ķ. !=>tnÑְHiu6G.2b*:| 7{S*ÑRl wkS<P^Xmr)N lFc'p 5#*֔KvW5u1& )F$2ª/uD ftg3̸FBHk$LiUwg+JlxTs{(9"&jrISsV6"kٙKC\*2@5 (}jL;VaQol#$~4yA=9$Ze,e :_-WԷv$/sC@/Sg) GTT蜤(|W'lwSZ㝱oq⬢0r1n*S>,bCf n,GAN-^ ~-k_ͅD(Aн@[Pr\w^#YTN:J`4[e;e},E MSՙ`6 -KθK\? bGVE(o/ߘO`#:34Z0M $|?Syp#9׉8ָZ1/n.iE٥ʹ+)aX[0'֬ 誶^xw}Eiyy4ge}V^W)w_7&&QtlX%z=g=> m6vB1* zfKjR09kB)+-JrS=]UwޟO  )ԱTWN4T ^|qH,FSbi9Goh͌Akunk~02VVR\JlI>?+|?pR\&;[vYăJ;("7s2CjMٿ b&y:$+,!$8, PLJ XD-3:GzzF9a?Ґ~50eƨMME (^dnlh[Xso5 H;^*•1+k@t=^SBf'*G'A}֋xNX[ kWig=mkfŌ=>8cM5mԙ t+JH5"tfQ:E,U+gi4@»%!Z _۳-ۍc.V8%Mͩ4I u#v}fClmxƬ)>^C`,i_&8}~fY\,Vz-@~խOY^E62|d55Atn!Mي7{po3a+ղV,V&}YyU_b$<){}zme &oΡb}A"6Hƌl% N$6@T>7L})G|&aj)]Pդʡ7#76f:LdhYS|nyQLy*GiNd^h%բ'|asl -`im:.l14ZRpUtw;VrVr}F=>%;qGGiHâ›%2J]JI#=6CJ lL?T+*5-(SYޅ25bl"Y^.0~H#CD9\Zk'_knq.l {Ds0 b)ZANC$-K;bO36'倰y1s8 {6Ǎ٪IU cfeOj]<1`jK`jGHDfװ}3ta.,`X'wKb7rF9$h|=r3񓂬X$^U~pHIg  HgYnogLQ<;H© Z|`7nE-xVWW`ƆX aRhkY`Hr (5iULz7Ӳ3bbBy-JS~ 5z,Q.nQjT%= TW<L&sM^sy\Z5WBX?o\0FԯD"MpC+e®W(zVF,ȁ +Y6$EX \:`H-Ml2< ]e`BI6ʡ#&*۹YC^ąoaQ`PfBbB5g>) z`?™肵C)L`]EcV7TsB{~%+]ףd8dޙd9:ppMO8-ζNIeXmm 3vS.n$5HnMW͖52;9l.jWR]XV+Ttܒ$ )_ml[93cc^z)S3B֍i$d; \# ͊Vf?c8r`~<.-D-xCx LU<ߌtm _J:EL*[lQ`Z@1&9hےe)\lI zN [.kk-YaU|2cXUO{ݛ4i9E0>y^")KٿL6ľ]"X(}:B%]]Y\' _<=tcAuw2cξ42 |Zx-Y>ݍz0Qc_pnz=cp\O|F>4BZvg7ZL1;՛!T`髄M^PmM^BM_Ux_'D jGQ~GV"Ϋͪަ`ѪeuV.*s&"<õn=iP0y|LG'"'; ?@ϕA׾E˫vmL iJ?YRBvGfhGҏ>[*6mPoNq֪Rڗj/Qs;!*;}|߿7US7sGʽԺ7B}>l5f}U1S{X`{">r5┺yf׉MDv?B藰} JK{SX۴^l1-A!͇\ Qg5ay9d>oӪa%3q8m^~h_GFfYhsFLosmӽ!0%>7aOkۿJq+00{(rbdV&?ᰲg" ߯xFǢaK'sn2iyʂIl;޹Es{=[Exy/ŸPB+FD9Ab˶6ǎZT/d؟gvu"/Z+7FίL%td‚m]ny&$nrӻ%]MOitdNU;f -d˨Caa]lR-i,Q;,ՇVLJ>K_vyU%d$anТjk!܄?L5Q<.ȍJ]8]{Kt`2@a4 aF|҈pyɏaGu4 A1@%iqd#حdU7 ZyPJa\f٤{Qw8NaA*"3A4D 6qwbylD娻o-S3RbhpJS<5ަIbJL*JNabsFĵLe)F, AI8еm= T,ZNP)ČC.8Is˽y7qrI|ևvoqNT>~l(tj[]Y]5!v-(3[ E+;h}.45&VD0 ;8- s5ۋf')ܑg bO6qjiwWYnӮ1)V CY:T2.KIG&0rv03jGO~Jp aMh֎qp+]w8^,0x]<ҥ/+q`NfKmm^Un嗫f0%Jf]7LcƒͪC&j5ԑ%WG˔Ui?IypRhGJfZ"$MvU,3Up,~ rJZ=00e%nUK١aQDMqX}qj~7,[,Y8v0LyVoj ` >8=Җ΁iS`-^} #2_PXu* Ue - /vGb `VoA*8OE NSb,4g(J|,`]ěv !:wk l=忎ɥ3T2JIlh„ j, YX;;T0.U: z BT۞-^^])w?Gq,w=Giͥ>(/b ڴ_N>թ@1%6,9=Ir\Ž;{ 'J36GT6ǬO}NΌ܅J뫱aMԉ@rUR xڒsf)pˀA͠Gt:Ct:GxK|󧔦§)ޗdU=PTWMxlM!/0+Q ټ[}WL| ,NgD?-Y=xFikJa7yzΝrycA91uߡZ5Kcd2,8rRE /[%|N LjMlG/t9WdfQrքС!\|p0Sr w#P>v/ (_[$\=@}ɽ]%ٲу$)|zsHg<u,u3?=P%uXnB{W.:ٽ68.Qf:AҷimN86=4Fysǖ;մض)::=Q R9nS؉:;Bɓo@MA@4p2;/m$A%X13*\MI6RQ#.^Dcj~<' (Y1t`SE԰]s*؂uћ#o$lI"ɑP[Nu֞KE%;$3w4$hrEޅ{UDŦIoGd3uZJ^x|jVr矛c!;ʃ0U%p6 $݌gLLY($\8yCU.mno9GrWSPf_qNGMf&i1RBqwj?x+тPpQON2^m^A#zgwq(4ExOjֽdki ."=o47C%,:v ^)T6ky:f~>keTnM9ؖwP11)pCxI0o@ *G#2I.4=ԽwV%"rfyap<}*"^RVi"EwVxSEvy1a/WkwNz<wJ& uXcw >M`FeݕypR} 64Ւ;Z=CB sCVS-=]3lG/&`r̮]VɎA8Q5@'M<#֙ct8YF7g" IdjLopjVS7݊&V=KmasM*P6 \cXӏ DƘPɾP-l|g>o$zŲQ3uKJшpdaP 2(4-TW@:Z{R rG9a97f~YQRY[xPf7O˹E5h8䉎e@n>𙫫`F`qh I=a~|R׸[`|CvftkDCjjtRR?6:,"ϒ5v~U(F5U=~p[;:Y39ΜR;D7`e !Y_tAQl[0j3f砋<܊@7iu>۹ʅx`ua3(Qs[^R:C5h,~}P8շ=</BhRgλ"ѢœU^QR:sV,m}L=xmiqdNVP\Eavz!a|kvVsr_SΩy.ps7 Vw&4m$ǜ2<oܜ` O/ RJ}='r!DL2CkѴoPp$=-%ej^#/Yr c橖gRZ0aA3u RTGrL=FaUE.=He[#52SŸ_)7lld7/)=D˳,3/vSIR75QU$ ]gV.ܳL.6olט v [ܜ!8#l]vXMjԵ~6M3MR(k&`ЕϹBJgT}Pefj5Ý EagO)@h]6E1„@Y4"8s@dUd_+ǖCK; ZKBݜ"$uob¼^2J/{yHXq^˃VeDcVE9YU1uCkۺZs*G\tz%*vC2|o<7tpIy׀KD,RP>*п|+"u W(a"ZgÚ4L<##=@:N?nF*zc_Y- 9= ^iuuJ I b'kmO58f9P?B'Bd4[s~2La.^WX=\#:!b.X ?bH뇒du2_׮>OtL |g8~>Bu-^-J%Ȼe]n&7/LJQ$2i *dPuh 8IIZVpi$@aTa_sEe nۓ.Kgs'Y>|xNz^ʎ' Dn>ʶDǿ^Lc4J6cT>3x5«?ue]^OI:kj-g~jJm1>Yw?Kҏ`,$ )e wi_G|Ig胀l/ৌ. xƜ{+| qT0!&w0P,m Qz6s|v|*+=r"G>7m$}o}vmZ1Q2,.W}Ne0exꮼ~??5" t|ENOwb۞Cztq[_WG\ߟU^j͚;`=&-70r{E{5w!jeYpx͏J1'D#MV:VDۗcEX|ňYo voGlTs*~;0{eKbsH<޼ JYDxb=R<٠km}\.پݶ,Y0e%|ԼxfTvpr>E֍Fy>)y߬mYioFS&B2uͶ D"#4*t*>1 ܑa;$ *zn0?yOE4WLٔ"HBqdU6 r.W2j ~[Qq˩(_o٧{Q 3uȼ9]kYnp8?˘|l{j>JbJye;z|8*O:81c+x0ʓ^꽺}XGS pQw?$XSf?wc!ՔeTqfB'in ~^\T]G<]z@l #oTs0jGeP  :)5D\Nbt9[j}^vF 9ɌXs+(l;Uy*~aVi@ Au2{^E[YY]:{踧b@ (BPޥQ(K,3 EiQAZ#@FȺ^'1^ʎ) /*L_V{V9a: JEÈsQdz{v\Y,?҃;y<%Sd`UzNU|Rr)Iyugڒ# L"Y::ZH+iSܲAH$OHL88pW}?We pWDHBC0#QDz,COζf* *+lŴGe6]=Z׽G8_ ?fީ,l; .9WZzuw-!#y1#q'fqJhx3' ǦFHUΠ1j@HzE^ޞ/WƍI~1qR|nQ.@WDԀQc+&'7]2R$35J?/͈DZ&a,k̓},zv ki NœrER~UYӟ1K gYBߴGuJ+tS~ٞU+%>-̿Z <ej?|'ZmԿid B̂ݺ_?׫w."Uy%M\&i(֐W%t"㝚br 4smGQp:fh|G ˎZ^i@H/BD@>MS,B!ڠ,ﰅ5ӂ0Z4A*ɨq֨iN[\3sql5"'<[ŸDmYBd) Vcx\jR|?8*9F|մԎYY|ټ\jR{^`87INe! aO2o&e'>_3!QJ&TwY@($V$ Gʳ ȮКpYAP 2UAYG*Mt[tkjAM1ړβ*)_*`y@&PR\>"(x9U.޶0!:QsL{#hƐdP򨃅˃m8t۵ɦjPU"0';$^l3D="|6К+e%̳ӥ>S1(z7tH/*: \zz [\+!;&_;7&^_I)ˬH[Z,oG\9OPBk_+G4^VdWdvOuF>FF1Uܩ!q6vLvj=^X QIrDp:SSߩ&U <]SoL@˿DiKe?TS2-8eG:|a֓^NZfɚX(æ8 K Yti1"Qu2+Aya l+XH1\R&k s|v>qLbMYU_fl xH\KPS^Tx h4Hr4bn)z!E@ >q?&kRmeQ4ZL :ɯ-nHv޿ZUy̱Bi9X3Gs.xc1ާ_PeV0~jNR〮F,\3O+)!Уob0s,'{}Y e˧;o/!g@N!gؖE R1)_q"m02-Jde)$}IDֲnKD>GWL3H8c~l2 s^Xt(-,n 93X\,&VW " +~<' b+!]0,ʛ3հBa^3R-D;4k:u5;]@P7~>GU}Letj>ͽJmOb2}4^:A*]$f?u:W)7rYG٭W:Ye:2͑%8|^49ymGKTؙ@=_I+qrhW 3 2I0v㟣RC<;"FKϚIZM:N[Ybf2- ?K[ZM$_GED-jBv64[ִGDMRLez2PADB7Ea0mm{,bBqcY Y+CْfD*ŪL{7P|n KBMMBxfF0#ڀ7\/OJ\V* Aʋ,q:80ɌN9<E-׻c~TFC(r55,P ]x'o-GJ:/'/gby#+dhQkl"o,2V;]Ea9*Ňy"$D*V7 :f:'j&Zt0S`),Z(iI6{akTVmד:4QGc7U6۬4 ",p!*nXv{5u{Ї!ZyrTѪ؇ǫgtٟŧcZ~C۾+w38! ]Ci> D @4aCeuWGƊgфެYTQ27?U¹@GnN zyc-W}-%!;#q eC( T\Is 2qÌ/|.2]_t.o0xk*32-o݇c]KR#E#SeW6CBaqym֋ו8XĻcs=a,jS.e [7u#Ǿ^h6t|z-Ue-!@?ڷ!H/r!T-{2.m%R ۄB0%rň] fe\ҩbek,N n3XG> ?elv` Vr^4ì*)^ͨt!6VQ9 TV9}} oڶHӀQ}UI,])wW?̓ynp\=GYi—TUe0aM™$0ƛb 77U4w8O## ՑFY9u&fGf%|Üo#Yyd " OgWx1{W高ղdN;Eؠr.ox݌]3[@X%@ F~$=k\;G--tQL͹(G,Yj=H 9qv>c_eSfh1?K]=6hWXR6V &C_ QtA/*o0b~JzFW#g !54m_IȎ2}GĵNɔH*3Ѭds| BSօHCRZ!!qs*5nr!%KLMY~~ 75j*OBZ}wr WR>neDucf%!Ԏcv4Xv&xڢ,n&z=DC[A:\ٿ'YG6@ PV{7&E}5 di?+秔#g @ ႫtAB%Z'FHJ*;TTz!5C^!Ip7#0sN%dGC5ق۰R7XᖁZxG(ҽ'lxcm:W7v0-zNYzM{'sYk#NljqQG ?ۃ,Q:Mkd2ɱYyD-Q} YM5/mkPxy|m~xjè+G"Lm4GxUqoyjr̡֡_kǯP,<=[uLzEE㓑Iup={棲-0)܈NTk$C r{p+>Hwse6 QLSډ+n9h`|99;%ɂ]%hœ2ch*)R~$l+^窧ܜ3q-9ux٭5Y@a:v2/pz5֫-|$*R?ǒ~ (H}@+;՞s- 5^ c.Lz?(l5go-Qw rqrWRi`p$-S9#ȜdaV,mbZ3Vo=N[}&,bx/\ iCG_H%a[Zɦt}̉g|t>_~^'qw3+>):T:OT_qH9/A/[w˒z4,+zE?@X҇v6>봴lB/@@ɬC|abjo״2*C7xKʎ_T8.w!;"A] bϖϴgx=ApŴv*GJr-bLKT3-q3+xIُWF~WEBql#B.#1l޶ޞRsllr (q6%210 a\W n\9skjf>mn# JAiW}=YTm'+dd;<ٌ{&(XyTc31P1@D37DTMҍ ϾK;6di [: gLOwt X7(~]JJ&b-VL} rNv"i[Gn%]%3Bv'*Q=!ٮ:c,B}9TBUb.}gtj_˖_[OZOM<0_ lJna#6DBQfiu b|)B'ПC'"+T{[|jT#鐆K")IPA?.-5q&-z)} N{|c'FF4]'4)G¯d5 9fcD#uRX"FZe `od5 K |wT"s*]Ot#3}_ԢxI 2i"8|t ^^ l 3 h ꉸ['Jժm % կA6E`ȰgaMY1 k\128yPSlɼ -,W$PlM z-Yϋ:=ځ=eڲ2qOn7N=ϻlۇb\Q4S $$<2Q6gZ| J>Ĉ)q^4/;t0AyIm ls]1 Fn<.a<9ѝkI(L'BP/cp&)b+P[>^)xR4~>Հbxdw_:Q>_}Z*@~׎;ݾ@h@J4zK0x)&)k6-N2#',X/H'@8_^Myw%+Q߹HDb嫑zIW+m'>pƀ!SQ9 %[ ÊƎ,ABoTT ܼ4ܗ(JDJ$49ABh1:['KOgT]j{2_͙u?O5:ڸ̙NN:S2GOrE-rt@/pQ~v {_%xf+*bJh1]hA)!#jr"I|;ȗqE!nxâb _SIw+bBSD=+8ϔi3sf"9BBkh\94gb?c[!bS8J'N(@ 1( k8a+ bfsDž 7)Im^@#@ 0BGw`Vʅq/yEFv=$fɩSnRer"FbaQFSpdX[3ylסnA47קM/)"ѷ;,0fO›jf ny't..!Ŷ^?j^رږʄZgoemQ^x1"xe\]ԝ+zˋALγ{k~Jݫ~R;l(UWНw_̃e":XҊ%K%/=!d@aX3~]K\-,v?je:ҿRd]ӑ>ɗ'mG wzDjy/$ co o.Xl4㛽%>EG5wpk;$0lc "o;` 'Аi2H(8UŮ~:t/ ,:3HWOWcPS2 45rDAz2}^rt ;F@h-2.nHoE/Nny%s`jt\5kehzUcMn3۪ N u2$m F3 2FG) ~GC=~W7fNZ`2҄8ڷ>sVJZX>Wd}$?r ~b9lm?/1L8B: bhuU{Jo I:81br2QX ~2 -5OBjOLxʇ Q RI{%{ _J+eWioV$"S+B AkO"HN8ӈ0,7&sْG;vgS(A]0$HT"iN8R_ Z SySR6d\j,mE^Nƽ^/)?em$A 6NDT+8qk5+Ewɱ `ŝ8ܶ[3@*ЍrݘJ!n ^ nwxqAc{PT&AM㱸Ҷݍd&TQߊȮƛVSR /FLA!A ,/6 (ȅ!.N$]vu$Ty3QPazj*ac3/g?zُ4 eМk&z]4CƥUD3aa/&W]܀0]GG eNJ6KmeGm%a4=s@nyv-=XG+PU9$I|tGSfUN_~A7jL4}yAA^,(O ܙQ t@Еb2|૆D0Gz>O} z( \; SגoqE a;|8*C˒+6.׸\o M.Y#U‘+S{ݹ@l%еIirC:O+5K%߳8 I`6`?$:?qZRzP !LàzZ&|jJ_Sdh5U7炋IAhI _? ;X 9 J;ͣ:^uk*¦QyTUuҐpgCnOIL# n-Q(k-x J'pꆄ"?-z:,?LPޚyy$ėəm"uPJ|jZTг$![ת̋vxʘ6̜ZpcL20ktho7*%dH{ Op(1;fZE^>-)_e5tW&L#ǞӨKmnps}&ِ"(jCokL N|p$04B&it]9!Sx)z,|6YA΁6?< 3q.wQ:I䩾j2՜a'R"~}~.`\p rja+P])x)جQy_L9CĦkNJPɑIZ<Uf>:$ juNȱm VFDu5/&&E\5:/SqQV Xo}S>M$ 8(P 2d;Orn1-#ܻn.m12wzBj_EՊ@CaQJI V! &\z Ĩ8anC j,A!{nbY[)+r"1Z5h/r' _s-[e-#]>mV䀗so dž({ėnu024MsE=^ʆl1z O&#\>^uo"4)X$\E] (:ۖ,}o6A}S9,0+zpsz].iȸ)mĮ4zbV8C74 @Pk8`rCbZqh-B]nWy\ 1=kyR~dEѻڕĘ a27XL' N07tqcb\T: +@Q= QE`B$Y=!Q[Ir>*P ;ӛz.~u?բ.KRqXs0~1:]ܞ -pNM&kh*hy[h;hP77}oX~IMs`U$~KG-pf\,GhX:  u\d줧6>A⟍ 2qFiD. 9B+baq̊ӕA/!h*o]lkvhL p8"92o[{V4SM=>˫Jo{([y*Ow}>p^- u!QR[y/[h2 {p<^]L"~@/OU>76.\ #j޹waj|c$vڤrQԠC,X!Dg3i"(@H4p I3.:Yo”.`h֗ oĆ3; ɁL@ڋ>)a靠9؝Hn4O֫&LG ގ&\2yb^z /`tIYhUHT=/15},RW'E#oz6[_)hcMk{Kg)=&LDȧ1@*ٱOǑE]iΝNj&lS?WqQ[ {[Ld$_ZZ$Q =8v@ȩz >9u)@eXO j#p@>ҒɱGgK,FlkRDFhKnwN%vvq!Aq G+Q ~g\V\"4lu0kVϣm=C˅7J Z{0bЅg̼4\H1'c='Mqu?6e һR-]*1ހ܎zZPO:<`dx$NH\oI h2O˿?JIGQfEǧs.Cp S(enk&H,W7]&u!rL}.P)i+C?B8nǙJy⇝_UVǥik$.d3ܵNf5<YE6{UX›su5Ő<TO>I ^ztL[fƅ4(G!gKZi9[ .g/n4NK zh=K wsk_x 5,]F%G*+\1Ԇ6"vȷ=+0/@mF[ / ߠ{}JC.;_B xDUעzǟiy6ELe,W64iv7IyE-;p?'5w@c{fK,#*]VƱAD:1?ou sփה {g#O^ȡkȢjਧ_ԜeܬuvڈL*w<^&e_ &})9*Hd;p[m%RG-S yVo9`|&f^:JޒU*?6-Ёh1H=O>^X\+4qοiޔ*Lw8>O+;LFlNm=YV„)IzC:CK7n*U{Zc& *Q n> UaŌj 96AMhK#-&pCKJ'KCzWyg);c BS4I-"=\Y'S?# *5}{6XPNѷ:0Tj.wˆ=cvq_oAE3-UV@B]B0Ciz}z@Ce*7Jl&攚c=â%-q>GwIXx-",k,sйS඘ؖ2h\QP扽S?P'}, z*66` LXav=.Mvd@؏k.CjUZT."E+dְEtVjSDx3~[JSl(*>?hAp.O{x݁j8V5DZ"a5:d!q:? @W|5Uةs + 4Uƅ^"] !w~=#IMSJ9Uj{_ቈbZ[^_3dZۢF0 ٢6M'B}VSJl&\m 7MoL3Tnmsύ9Šl$Lo,hx@]W'Cb!*rmw ?Xe nSK.iXPϊIձH1dU}$H$)dtOV%|vB#eԶ=qڕ< HE?)ф]4W/ARu}~nrg/˷Ψ5P1I ).{=r{YhIryY!H)ns>8:o!h~z ,(;W$'j9Y-ҟ<낛mwu5&BjA$C,F80"C4|3̒,! [)hDZ-/La?سHv܃^\̿. p@ -oUclj:?l֚5'y@bA*ahٝhkJ_^ jWv[8.AE V>^fec*GGR,WseC]0x:o 4L"] LgDXRB[F~,8~cx՛i\;bT ZφQN$~2q^pxhoLcr;v0QBCjjdݾ~lᄽRpi:;}/6jtSǢ~S(QčMO_,ԄN>x5mCC?;!? C{r}nDZGZo 'qOO;]KQx˔N fsGIdF%%Yk ,%c"D'hx&YW=/JT11-S x;p שw$N1,L렍 o͢>c1$8H#yDkŬϮ]z;c5>Kg8b(`L86/ MTJz By $ )$+^wʐz(}^Ypҙ|\qOvArS_;Օ6INWݜZҎ0xN朹'뫃1-O Q5"j3 8RhAhbͷ4kB1p|ɕI!lrVt(ܟ~OM&xź+ P#Ӄ[@o4EO:ŀ_y(ST@HVЫ$%M,b&OEn4P| EaYݹ@[G xvF%+1҃S.^wgDYrťIa_iCkwBH4|ڟñT+9t NaufOQ+V/~|6dɣ5 #m.lP<Ų!~w˒A?J¬8KB`Dշc$AzjΓrV yO+qSDe*Dhu¾@6V: ~%}9Z^}̐%Lb+^Q5<;;/c.:uFѺ5) oƒ}.%x&?'"A(T f ic^B=kK*i#rab`4ϩmԼҸn8( xIJe{ c80Sϡ?^YM;mpGO1iŎ)\K%az&r4׍Q# Zq9Zᡪr+ከ[N$ d ~*}裷g4Ȱ.Gф*+3Wqn6 !:IN{mm*jb~-s7 s%1P_aoK8pMr9R-(B_$2*@>O%^)ob ҧޤMOqfȡaP{bmfCwyew9`HEe$'1~\MH=᎕itbjgUޅ 8iJR#ŀcSc(ЎX$Hhfsjfxcr(X8OIEjyОD6ݯ,Ifb&8cуzSdE_WTE@>=cp AjG?mdk,j|h+>1- Ƥ 3ɨ丢.yL# W.Jnj2죒=51E䀕B ^ޖp<\r[ɨfo7XM3Us%a4Cmr椷~5^+jVVw=8-h w|I`DĄ hw[٦4q{;Ȓv!1HV ,?P'Uz7WM;SKg ,hPh~s+Ñ D6{tY6Xp"n_Fdͬ<@Q@:X0- # %2/CQU&̔ vcjЭꙍ|TFT&nܞu!?GOnYh>r7)m Qm7"Y*>"=ޙнK͐UϡK3;L(. qiwmU3/wotDT2Tx 5%\Ƌa9:q{,irfa0jdkp|Ccd~WfnQUrIkomtVp݊f5QKF`၍'_S&XcÜ(Ѳb0 9dn ~Csx2STNPNO!u@Lr*j4mGm[L<&{,Qi@BRBPoj1ac4NEOԷív|E"'xǥ)[#ׯėG:a˜Rp .5Ǔ )0QR+`Hހ OL;?Ω/oUZO]aF*d/Q=%uF"VN8lijk6f1'2fBD g4 F?=YRo7 N 4fL ū@Fh$[G00U Ə]2lrC0U!y 6)$JU.6jkXiͥ(=" ^6[B(tD=OVFc->44+F; ˙ns1ݩ%}dhf✗NQ:5^ZF=-i{?w#.%~NOGDS/Ul/+TbTB̯2f N"8gI:PiOP[c/DvyI {@>ɗ&yfZAPSсi2]].#ӄ`WTVbϡ5)Fu%F 7FsUuW_M AA]]3Ja=}} 6V3犨fis_l7h-A v8r$pZ#AvHx7] 4{B1!GA.|c(W@Ɂ+`7N!o (u^RX{E湟G$?*'@hC-oOeMx7LZ)c}i!\cij5%3L'dJ\6B}\P<4!bb(}-MjjjڌHṔZ>Y4fNV/kqQ6 %l3th;Q*A:uȯCUO=`W%vkSRtҠQ4Ev_K,KqG1Bʁ*j v^&_'X #!Cٻ=?~a*Dws;I˞9S$5눘I-gy 1E |Y$4z/m143h>RΒIwov4L=1q_lº>~>vNkZ!oem#/*j6}zm|=-~%2V~M~_\*H8NPRTڄŸz2)x=FAݥFk-JX@0d6hEžrj1Bi!>& &x M^,F$F7&Pb֐Ȏ8PwR\"F=G/>uGO6[@s$`aq YL)s xc* J$fz t'8&?Be;Ov+p 8my%;G?%$_Xo"j &{G`Re2Z{_h^K&oyNb }U.7Xw[yA2P4CbI*һE╒6JīIB/o~|əZk^;U4 4_ͮAu蟧r3Gcdl1^S 810I2Fy[kV;#&rwS F “86 β?8r&M_]PBLۧlAޟEpyî`Um\:-n9b y xmocIeZҸɠ|:gK>8) 1.6)@0xluL5OQ1S}#m ^ˏ(ݐ^Z^aK*ǿ{-ߗEHbsSRuRH᜽u{Z ~q/j$k&U B6a})=)' 8%.oZ>,btj}ŌUɧ/"8GaX,K!toGPŁ\YtZh|uӔPXJȝ$D_Q7J`K4@pUbv.@giߣ48zD#U?iv}i/]*T Va[ĩW1-S&8kXD_ڸ c*pq$nž/'"n#2r$I9&~2_|סZ{PT2NCuBR*[Cp|KYǚp i2^fmF*/=bl?d~/5m9^ohyU~Othz(_ge:qzק\gm.UzD/X]e{KQA}e}x8ip)=UJ{ % ܵٽ)K;8u7zO-l/C.<&{{,m{Aч+'Ww&^ܙч]ߓjUW })[LYaA>JpYFA,hOBJuCOr Y. nf-&tXzC*X| &gHhy >T)eB.϶Ӻ[7y8e 9OzwM zug蟴,( AJQ<^7~ 8gx\GG~$Q:dX!!ƀ8> Zi4a{)`zm@3.d_Q eeNYGb}_nbXZqt0A]yMU3ƿ`Q"푒%֏u/!=mP%zE *mSWZmVʏKÂF;3U[%G[ח%V,Tcֺ^r7ӽ64ŗkfU4,w&O^-NNq!3oI_, xv;w ky<1.xWy}mB9S+rnu-@zS%mǑsJbd̗ڜo5N$kco^sXA~()Iը9T;m{ Qk6fn\~\1Oyhk &(\GeO`?צф`πW/? > S̡ܐ@YLk iد.?-<l1K>$҇\Տc㦻JW9E9ѥ Hǵ꙯]؎=F zI4-#6axJT\ "lg:du ;䡍 ˷RX4UZ V &L]>'L&-Twa1.b)/Bf hqu{tUFk_{t`,9;- *zYF Ӛ[0Ox#FI'q*tyCL@ GX%CƋ*V;@t,ώ's>Y|qtP{ZX#XG lͪC`egze߹ ɍRgY)&;/S*oJs唑LX%K/A|Q[C;{x^Sh*q-H{"PsaPc}|{Ŕ5Ix bsmjzDwɃb.S?Ӧp 82d{)T~B%}Rq-l3jc BwU f`:k_ϡYMv83vR0>z>RDުO']B-lFeOIŬ$t:},L0X!5i?Yϖ6xP#i95Gx:"p.4bLd8l;rS}ů2:sgaIh:lM$\{Bkk6*Wʓ e7h ;;{N]9dƧ`u,:1 /vL'^q¿t8u%\]2"@tɒq6=%j(UD\1"7Ր\D=} ]oSmtO0-'evi?o*mjM > i y(Z{ֽ|Bk=k슚qov?*uKӳ_iLGMBevT*C)VVu*UӝQp'|&=>#rd[5My (}V95N!Nxr2d% J #@7!FY^?hicIR Üi X'0)uZoW]mxH{C/1U:z +#_WĹF+C]RH@=F0V>{aPG8XWxmqfZBAh/l g"cֳ|>aL}N.xU:eZJݡ>P3}Ӓ-\dTF{yP381F,ǭi/5^۴֗)'8gWPͳ_="w,`CENA<(xl [:8']1{xTa\>BW+!/4Eh9!;,Q ٗiQd~.RXVY ^j 67֢3@ q\f'!(;-_[fN\I]\WwK-H p xIx;/ 4"3AJb6T8brfRIz eF,ٝx5b+c_,Zy}ěmsX]5 փm 98z-Fqh;ϑWhY@g~mT]?$aeV }cv&y&ܝl`tQb̬/` Џş֝͟)i^OJn+)-G LyGDt]zܥe`J+vk.Y$_l{ţRfw7\df(-#CҦhZh_bUT_sݽCΧGq ݖp8ܳ{/'y,Ӣ3#݋DruɔG^+?_'h m>Rꬃd 7O*G}=^vqʴ3bGڑˌ=;V2][:]nx3^F>?!-B+z\ic3a~5xvx@$/1[_;~Ѹ}HotfsAv VAMJP:,º%{YOZ>t ~y"!ّnn`mpۙx](}|5cç+ЮqbxD[)0ޟp \߷R/MRV$C7M'66m1ް&$va"hAqS ؟?0"*MtvB"5 /yƁ 1*sb;5њv3k #qn۞b$],H=}/K9ء_.]Xv,h\<׻ LTr[Fsz9>2i׹++㙏ދn'ACC#h ?m )Pо]νJ,2h\@N:$plIPw0j Sq@ޥ9S>)خ4_a,7tR T-'k1ZCzX@cuכL 춷>Њuf* 5$P`"i!s5#bDg1QjtCV#_ӣD=GZ R'ٳˆ/4g׾ Z}cUo!_9b71އh;(ߤ=6Zw9'܍kIMsgp.!m5R:aI $k>`yh?&c:=씛Oq ߵ sVyB0q"+_i]#zah6GQL=ƺ#F:bVǂ/-@<)V2Hfk$%0Z4(F}Ĩ*ԗzօpoS6&B՞Lh`ZƔj{&Trc ˦9Jv ނ+.&t>b-0ط)@6Ku-nd$!4);΢mm΀<7` E޴<_CY jDo #5Z\  7 i'wdVjuXUm;y63M;UYFjiA4%#9+'6hN Cx;w$T8UG<,v"UQ>$'{<@ʴ'I+fZz!v5p'{'ir"C^lf3 xs}qЕ+LC edath*Z,G^;|8*Bw=92T.d`ƀ _7NyoET$ XT+[)jN]{g$ȌƷ+hZXG5۴>vP]JP_l(]bߓ@Nh!M?(vYCIHhw+R?%lne@|~֨klb&Fyz LS(1z5}<{LWy* FB3+;&SrHɏ9ȈZ`aLIz5}X{DV$Y5R;ЭPN.xd7=ѻ sJ{=l'σW 9yhBӎmXiXr[wڣn3'zETzMⵔOY.&b|a)|`HTR8+diOvs(7ɧ~ԄM_,9jP.A;Qɣv|I -f#ܲ >D7lnbC#2P@>yn_ZsiooFpwW9:rh}>gݬ^=NBV[)ckE(dk99pC\h&S-=]TfbM>&"/i8+ApA/k#jӶ)OLȊt9)m!0؁˲^@V|j@$on "1M8R!6 "}ݩo jfC}ATAXE'BCa:}[ma{^.;Ļo$DE5CmF!d5^wdHO; Ey+m%BS {]<R[vwL)D>o m~͜f*x:JU$*“O:cǟ4nӞf. jReEr5:n$]pXwoJv3D2bo^(svEvvn!]ع`|s鵨N;nƲ@gE[f` [ꃦX4]cҋ)т ^~>1RH!R}0S %FcHv: Jb?W] {+[ J2|?v|&t+ZI-Xڧ%0 Ԥn!$UY0gׯh]@Rkn$2O+j;+) _qjoIA&֦n#lCbq=6Xse~. NՁ(-e#mA :QS{e8^ ҵdn-b1Ni&#zHnFƯTPvV)9UA_C Y/cQ--k㴃-{3BJs.W1˨vh~fM^ RG1Gq̲B6@{Li.Ϋ+;V*'"% `@St/))GJ85O#(`3 Oi=R 35aN$Sw+VC1%wdn*T$l%Ntx{ BgGf4`z9LNKdiQA4)r AG7_<ܦ'1kB2jdEd㻀y8'g}6LӬh>f+_b>U wG7ѵVTr]urjōV=85vXYaD/%zOфyցɰ|r2SGmy&=~'-LiY嬕Mt¢wzM& g}T[0.W}E(2ݥP)oT#z[PtL7#`Ij.{*D]v_=RCdZGı(F[Te@`g2ЂBoʼ}E#&XS%*Q(L{?`BLFD~oSn UL?SQi& mB%5f!(= vsRe7cU;Y,F!" I1Ҏi!2!L"f&Bb4nG\k$*⑨<߼u 7Ɯ [ K\U+1oi;QWrXslrqۨD. 0uV9hWJz&+VMO!†{<7g b%=!cҟ{R7N_{q$yʶF^;Crh {:2Ds_pI8H/yOG3 zԚ)܀]_8NaU.΃F˨1aqQ_]z&i8bO][2< xُ1Mb%xy<?'^{Q$Y.ߵ}.6+9h4Ns8-'ͥ~(vvcBvwsϑ8澎i ڟf(;Wͨ][wN}Qױ+4 =af51I5)fO^AD<cr./_Cds<%)Paz8]8ʿnM&8[ `!G;3||*s8 56%ت3/ #v b4znYHj,{(K$#eL]_@G"\o 6۳73#Mɞ-2i !Nb|)GlBkU@p)ѽYC[9NcbO/9 O*``|׺J'P(^wv|(qvHZXĬקr31H-څy`+;l“$ޟd,T:ò`lן?!QL(>Y*_n>Y袕x"tᢓKb HZ \ތ6t \ _#4Yw rf+ٵ6j^Up:8\.d8HnMP^"xޟ[4)M"9)$V5rmt-=Tkyėԋ.>j=iSS=Ć^ B|a?;70S W6BGjnkeȼ>&^i Rg*y V@VwdM/VUJѻ}W$^x7#(1o&F 5KqL+ulZ;jfk| gxb씌@2GwCv ԰#l'f!GKQ\@T]la[**Dk4m0Z&lE] Q>m 9"FOo{1`'fbm[Z:N}i.R˃X_g#в€ytn"潆ypvyQtg3<@9*A7r8ză110>b3IYJ%%03'&$FK؇-D s?80KSjW o=32kv'_kG#eu?}(.=PqPa \d*!N؍ j(A+r!h&q"ݮ*DJ.EJ ,KX{k{oxTѵjkuqY ' VY.Tx*Ejoј@C2V-iw6g vwu6ׇ:a7EU9;t 4Ovohe("픢,sPr=>ֹNMZ$4jC-&(ċX2C c t1h?RAQ\roD)0( Nux3[ˁ1)=I5B;d- bp+6jfD(H83'nͦFFӼ]M4Gg3ylxNg5sr>ibmCj:^g`]2DlY9g)~77~o1ʽdtK|ϯ9[)f7 3BG:p" vQR70clΐu3Sq$!tp|W!?.Es&M`mL]cNG0ޛ8C_fOt(M#l­ }QbJillB]I6y0,vS?x4 }8+o b t H\]F5d(D{<1O4N,<$/6 Ɨ!+ú%})jaLaS{wq+!8:鳺#rڣnߚJ֢;9-Q)x}8Dݖ|ԹP8/ͮ҆Eógb1`]6̓&4݊G6J%tD1UFW5Aje(Cu{gײRy&t4sev,G^m"+k::ٕcm<'[ BOƞ{tXo26.}tMJpNǦ0G W0$gV Y^~#پw{;:'gyq,/b>W;Ntbz۔B{5|7\k(@/3rJoj~jP8pa-_'sh,nY`LcpSȊM-l+8lcq*?[+p"Fp;0eПX;8{ )=aDKA ؝oN 6퀟pV r9NjwDd&b"]D R~]%n5cWT |&  GՁ[ffiW|Q~>,p4IFí'q1{gBf1ʠD#!-D/j|NkPξhF)Lު=w_MKL׭ӫ ձMa'e }0lty A calV"ܞuĭk9s'zma%A,3@cnL!yNp ڣ*-}BKm u)([p b2I4ATSK'x:=7R?y(43heT GJVw8 60ּw1N'A>~).79pL073晛J!*ᯁӭqv.3W>Ɖ%S}¶*r5S7y@kITlx뜖}εPQMv*&lQ %&*NٚϘL#Ƥ=9ByA6* mZlٸΫVTr )/Jcm%j * z;q(jwAxCtZ(v"%Ӡ^ Z{3=(R"sgKͿ Nr>ܫQ~ HU\%Xmpשt4|?I⸙qM+Q\N9ƗNQLAgӪ7Rm$}&rɵFAج |mr=I7ט=~K9OHkLֶQ"lɪbMr4I[b-1K[;t7)*J֙@Ω^od؝JL"f.wf-ވQ(&嗤ڴO z qg`\!? i VZѴ|o 0Mј?i$0*Y)~^ZBȰ۱εT+T8ޏp =DeĢYr%2vgV_ʊ|0>TpFI< Juō~w3(&\s/ꮑLYBk\_nvǤcTe;wv}nDW3eCNS>]Zжgq&n.~mמ/0ކ\!i\\Yzn RcTx[1$ylX PK P^7~,1 +\HM Vbw"f&9V#MBZ~}@>pב(AeйOrF֬ʋ;Ö`L40{?] NC(k }7P2_C{}n'3YDY` Jt&E׬%A<fz ;6LN3 dRN-RPͮ` 0":S0q㙲A _# XN5vEJ Jb|׵yf[9ںl $aˆm|79RVkr(| {!7}ߍqy$UC6R.X@ JVSs(3Rns ox&'+ uy@G!}" oԮd]_pjghKK.Ų?2@cb9,DV"6æ(-ۆZRX.~9w| f?WҒ:sֳO ^?ÄĎ'E.N Jc}-PeIɖE$XR;V?5H$;顆{#d?KGġ=h?hF*":F%٢wͪt>C`|[X$@ޭ6fE|s9s,r\=*eAuZODQpՋF#^ UKf>O8s8]N~ b0Yaձ#jtU/1ekU8D#tNBbӊJ ߮Om1bRȨQ4*'"|) b(^|Qh!_rܑ~!tg^s͍/}BT٫7|4gv!ƧZ="N|]q?W-Tq,Z[r<:[[ Br1;qtwe'v#QJ^a}Z?dxXBv<$VkSrNM72C3 9&;"xT ,L3&#$++k HXKLDO>pG,WE$R:DUaI-厁ݞ)q@7&a |J6NJ%+ &6]KBYeH<\4@tκ)_˦aK@ N(X&y9NwL e1Ef(׋MXJ4n.Zr 4Ua)\ŝY^ՊZyOaO'qyOiW]C;>(1z/:^a#+;viHPSJO?T]%e̓V!LsS*{,uqǦzDEAh}du c(A98) ^0ƔNP`kؕ*uMl 2=zZc.sZp ߗǗDm=j)}r?4z[j:2!EX&b?hniU[U Dkƞ)ܤEipe쭟'Z4¢q !s- t^K'(SxZm1]8B?Qޑ:ɂu: w?K|;i#ТQADM0tzW5Yˉ2FD!)fŎj]ݫ5aW:͉8]h \Ek4@˪21""^a5r.ND_U܍c@܀9A+ٰ$R"B Oݮ #{JX?!ֹ3M4p\2qJ3m8& [n}*V DZHdp@θaEB 0\"-|澥@`,D]:nW^pa[PN+G]O09ؔGZo'Q]wN+^#4*Cȴ0BqpzS%&ghrףb$޼OsGSo6c/ R].Lаޒ_LE1O~&T.I~%L9pnF */Zonߡr?RN=ATXܺ o7 /N<,WZfN~1XMbzd>7Z>nGkb) )Δ╱.1% v7@~?^9 / r1P:Р.=S~=6CCz]0VG *m#84r!t F듃M_$d!)´;GdSƶAmM0‹6 0ld@A)h/atkɞ< TSJw[4K~ZP-yAVz7y c} ,4kgwFK)A57yb) "xq=rJ@i.gGɘT.u͆ 5= p*رٹ@&ƨKKFSj,&:ᠩU%@|[Ѐ~EM2 $^/01z"=:6H~30Z,TbXñݏ+_IYx;ՐD4q7;mMݾژ-b9؅ rz 6QHX(߽Ϣ/lYI#,t`f{deY4X'w2)-cSMik(-3߻xDEPipL YSN 8ut?J8,9͊RSyO'!Fgm]uR kGVgGl/̨z92.hKaVi|኿PeU;28$G.xIpkЕ*&A0n@PCp͊wo{tBsm$aEWf$5WDǽ!+No,L=;nk%B^j_uY t3_(9`R@gY˝<i%)K KBkojPEցc|Њߩp\|:'lis;A,GȳZr KPSB^'&ny2f8 *K#f(6!sr5c~1"0n#.jBУB ȆCǵÃʬCΙRqI*?Ǒ/.%ȏƊqF-X"|Sf7Țp\FCgdѱſ;֧h7jHFA+HC7 % &Ў)dhU>]ը&{2FH Qx+2Eaku*:P-KҥEHDGX M  P24mpѧV1e6V.Jnjo&I%:ձ0OM}9Ҙps 1/ʝ !S d/ugNY]*pn53c{h}qymp- FG oԇQFq>N iC\nr;<plkc)syELk,?Gt t HYciƑl/cHaHq~(*qB&W`;Ğ Џ 1R/{ETN9ZZ7F3wt?|Ru K *Pb+M (j9R mh}pa b45`KM`LPtM,ݻb- ]xU#ӀPa>h}IZ Y+RElz (˿L 90QNe3,YBEIĠـHAMe7MLh>P0L퀱]P7rK sbj2C}g_ɝR DGdqEei`OtYi4Gm^h^l@ΕZL# k BQ Bva(a5?<ߔސE֒ڙJZsdh@ySb+e Ū`ز&_ GׯiZ!fs2"apJ[Ƿ#G5k+*bha*M`V&z'ŜVF 4%#fT?%0S O"/#HD"r SpAfRK+@uN!>/=C >ſW@pA X?OV\Ik6uըCW?OIWRglbU~:fWFrV"Dl1[W'<#kƋ, g .x858yQer,hZ65KJB)Ԝ;~Psp*"i /r> bUjQ])0~GovDU|I'2b6O~ s`z`2S/ZrV 4c٢_9t-v Z)]*tMgɱ:YpZ 2qǴ`r*A~6"qY&q^uBo4S2ļ|8_@ d`kmUBi%ėw5 PĦӯ`f܏]{Pq>@9 '59 h ~~n6 D;W ҹOq xT)+K&2 ;y _ʹM)9, ƶjɴ 8:_ZVwa5MxSX%vo"[up❻NQ0J/ ):X#RUSݷo\ ;,s(:=0J[b!hH\Vgm ʌ0ÿE@'?% YE'24 o#[ QFArώpx|UzĐ( P݌`9 3|u6_ Y[1 Ppthq])7\zLPJkd=)a'i3M/xUzpV"bR_ @BaZlqwW/8e翨S{l䥙X|v6rj[}(1X._U`j(QdYGU^sWB](XO>O6JHh1ixTn[{l_̰WI7Nv%} ήdc'jt3Lx0,B"AKFs,)@zWJ$S670]`Ss'ȃߗ<'g׽nWɐ\t>+WM>Y9&%]TԯoOlbf͹ǹE weX;Ώd}YFCcaE7L'gLlUPVQ%B5#gYL;ĉӘυWH?HOBtW1{1h[eD(평P O/mT@eR:xpSGL Օ122[ap 240;C!y 6zMeN$M+Erir3n=X4ע](2rsR[d7Od&~7 B?"=Y-Q}qd^ ^A0cM:~Y müAv"0Cp];\6Ou5kS~-zl55o&gIWVɒlM-{^=ZlSRp0fJT)! 2 K뵔޸`YjU97(tizu [=mZrOSjdP.^1p,՛,almJW\`kd>h[F0: ), r*A7ITs9Mhq)10? :H~[rJXE9ȱ vGk͓&mpn샅K|Galǣ¢EE07+Q Ĉrm0y b!1A;%sE~R pQ%.Fe]R ^؎orKDmwc'R]껨MQTe>iM$v>AZYQw_KAt DMՂYQ&x08)5|  %*!2a20_>BRKn> =#}!ƶ3eS_']->OYէqy T[,C.t{A(z}HnߺUYʁ ̣ӑrWa,T.@=x X?RBeu~ B-WN KSUxUٲ"jd ^,9DeZ'߼xY;cv/P9KmQsqĺ$)޶FZvwdd/`C/ ĸ`QwQb<l2K;ba]t@k}lfiԿPv(5 !"2C6 N[L[NN_.s\$&bˠvϞJ=09Aቝ4aY&z҄ 6YЅW&mX6Im*ŵ_d-׿Xb:9,ruD9f;o;fcLpb o n!vra.'Dg,UD3/5=U(eV6heUֈ*ˎ0uŁXbmf2̰k_304a>DWW nj Z`TJ eDLDtЛ]3zIJn*uE Bu jȟ} ^p"(+QqTN7g ^^_>;97&`FքEqb[Fla5Yv~ȦM aizF]ٌzY,gqb`f!9ڂyJˮRWev'~}}cKC;aL4%d emEa|Y/T 8^Oi?Hn 0H1Y;ǽc:"sfr;RAqژ݆MY*>)4U&uk0A*Lr="nC訽SlLy'f %2YFV z8wef0F7) FخӜ9EnL4莌 [C(N4e}Iqm&{\kB.lSibu %l_O:Ɍ "g*8ЋsfR#?4AN'l:"K3TCdWލa<ey@zwW?CaXRM7oN@rI6_f2&*]DX!OBiu9Po<\ -JrM# Yt @gz21;ܴVVxBxFtŝŋhC$itr(5*16ZT7\0uh`x~rvi 6k%=&*.Ue1p0haʴ:l:YI\-O"!U&l8,)gCwZ= . LR`/@&=TNNh (O@J E(mM؝ϨR0K*#WQ^5`qL!9pc8"pN >Q)O-b1-. =;m=۞-~ueH(wicg?#V{=3W4҃nH ;isim&۴E,dw?! )c%')v kQ})Ӷ/,QUܾBm#ޡђpr^sTʹ{j{A-*ESÛ x0QV(ǐͥNu(KĊ)1#L\k]%?CQ': %hU0)R%Z\I6B˽K@;&_rV$ xsEtiiΑ爴q+ =~0f}ᝑ N-uBW/HpӌV.Ku/p`pi1Eσpz/wV5]DaFHñT]hƊ`yNUgUf6wxP$ 0(I 1a3T7z`4nb-3Ч,w*h\!"GIs%I_Iu=N5H$t+ 90RȻKXCZe p2.$}C[0m ۢ7Fs͝VВzS+aD'*Jԁ]vD"h6-7SB!z/ߡxB!Cz-;Q 5cM"BWNn3,@|H赋"szN8$Len7"I@lcHkt?[D]f|A݌i4 l^H-lYeK^{9d9QgXuBPN<yV 6)ɻStUʜV 6HRXhLsS:ZN]Qr#(tۊ ۆdcH|.]OĪh$](zܳ689b$fƨJ-,t"c2x9.*)η)_lpz}{9xѕnySV ᔸ|!)aчR?钩82ˮ:_/zQq.? G d_1nN32=qI/<z$R'7l37Q}2? #Q0I`U,@/6LivR@Matڤ{drs-&f,18Y2Jj}y0Mq?yxbZR}= C~8E\eQa(sr#jaU tL[B#/1&Upx:wj][N0 ȫSJir9]i8Ԍ-..ר̤kC;dS&Mن7egJ#elo'Kk<8%P/BQP+iUՈٕRS&[8Q/0]neS8Q`ƾ)z"3Kt;<ɡߌH+]i[bիK#(́Dd;|f97s<*yˑ :۷t(,YqHEl&&#gZS]۲sy6xP24[$Yblݾ<\~ {S 6Ck(ޑ.>L|\^*oOTy_ ~ǫ#>SOLXj(ΞeWnu6!d}qQ0^^`:mX3t~4ϰ&W2W1/߭Aчeʍ[U@օՒOlZzug54A4Zď6/}-wi 6:2Rdgk {\~o;8\/*M)#.Q AI u,uͽ}|pRQփ3]޿4QO6ƜM0NIjX 늍ƾ]Xe͌ Ѹ|#FZ h^Rl',XJRUlq>u-m&ܢU}+4Z`w3(L-51bœ}AL%e$ BeÆb?&Oojg!cLoغ-ck?nLKڑ.hzfy:ĥa fX>XTd&!/-.bbϖw@kЃ. P?hD,0pP4dtRy:X!Yl:Qp\qS:.. %%#?8 8앵"nj>Q\#ԕƵA_lhWU?JѼ'y>;T`^_0Ld`qʿ)5f^mCTέJ:tQ~A0( FE6B?"xL:A 41&pGN}@vM_vIAxcx_ ;Bc6@0$-ӿ!:pR3bcm-D*þ̨2bʂAo p:73% @nsMP*xWʼnd ױ`$3{uPCy;wmjQW.^ZZ["9s6_/ʄ[UҖ G%dY&}X$3ϭma0 ꅅ"bm5w"䪢AAiuQ=\%Oz"<,]mr-Gê :>sQӽ7Ls ޭa!GjpVir 7^E VYl#870|ѷMfGIG$yR2^(PU\c4oS=pJ@8wX2,eOU ,reCc}WY3jebF-q n|d[K)/_n۞O3CA5.z>EYó_P&yyo#xa|pL).-Z*8xCOHWZ܆GFi<]!ggUtߑ5tt3Ibx^Wԛ#K-_YեZ@(1+H%|еיs[b&v,\:eI!GJFDlsҝB ( I)W@ދ~3%/vm". ?<5L+_BeV}Ncܒnw1fDw;##yzVlxc~/AKVPwy#4h4] \HC'`G"Yt^0UWA5Ա'i{$(B#]$`M#W|Se*h}Ae q/xȚh7iaRqX3 p&.F4媮  iSapp}˚7 nBtz/Vv$r{xYDkЬ<Y\^ HC%عW֣XMHGkJX򐌝_ÿ<7ΰ- (z*vDw>`]pS9 10Pg@4p &>%ԟV|ǻwޏRKC%|Ԭ0kY@m0(-M23kF+X 1|")P0efƫ_17r RX`PYݑ7^ݚɽ-IZdoq&R]LleӟTwℴ.~,+VdgqV=ǁ*l\L5K94vVUf׆,f'уf}rqю$^L׳]]yyWaԡ͙v^o"PQA0åіPT#"vR &Qc!&Jw~63Z92{C, ?w]^{,6`39`s;kApiz+HF>`MNwWG@'@^f!"_g $XWDh0]vkw5FѰtF^9 } ߞnV1%6fCÈGYgpY V=Ǩ-A OW`vcF-w"Ed6JϺ4^Kc0aJ8VW S2Xh ^T-etVv˪'Ks8ivi4$P˱CX=/8<n B}=U"gx|#&ӌ^ rĵjԲPI$S@W: 8/'C:kZTچꭇ۝h=vZ!(R^1$ImlZJ&FΙW{|EccݙniUA``pB )4I7S7qr9nIx`^*j~k5p  -YZVhOϓI茬mw$*IL!" ?(<'˪ԼI]Gj>=s/µI)8wa[`-Hi2$O Xc` a+oR ڌGe3:B>[>z ޮQ,o׋TgÂ!5bs/ҧ> wKP"26Uޞopc7Ո>+=*"v".\֎ݱ̽H,3U:ËQ/ Ԧ Wg[a$ҁd )Ε#+U,2c7 Jm'ѡFfVB9[9RDǻj ^%W]u cqm?SI 2[P )3 O{4N4Ahf"V~}h3peB@q ApegBs5 pnG&bY{2 o`?.XT19bvVqFSؤXʷTI ~g2i6<)kWf ,ѱdl_f:&Ȓ;] |{]3:g E@,+9>+)@T"HG~lCjǖ0$,Xl|!.=)xH0u(oMtxFj4USUU[G@(#)8I#Ln?l^%r8E3 <ӑw bqZ+rcWOwR܈%ic7,*\7?F9 @^#ʼnt׻X{ø쨹K% vXi/980gj²p3Z{#|>PN'q$5I>C0SA,2\|o|`M=bAkn%kq5uDJI vՂ4vǵO`͐~P%doi-Y'vr>/̯48xQHfb֖2?<.h2%lvo.'vl;_ηۧ;}w;PbXQE>`x h-ҢdBFܖ)*TfpEҬ$]a87r%vzg9$K>N n'21HinVi=.b0TC˽2(p⵷*xQB .Ƨ Q0`oxcw \M\ҋZH BSO`@ 3IM}g`n^F~cH 8Ňg)Cs;{ fזW,]GIeLk]7PBA2la(|>j0=QiEk7(/4-zL\FzA1ֵ㘠/^ctoHtX5dڧ5C]Fq#|ȒlOkqpiy/frF6zL䯞<^ HKFjnpHG.85@z~g}J2GG-|mLŎ--4Ll@FIK}\($3XV]LON-i~kҲ/q_6'ɷAnaɥb"T 4O*P ]q0l5\e(UhFXNћ`z`a\6RH_+pl3rSR>쎋L(HI,(|lQE{VxrdAj9FN6'+w틕klfXyU7X$ ̹FҖAywY\n 6s{~O) =Q tZi `L! ypdub%^ n m倷Dk90Dzf&_l& 8v*`xM2J,[;(8aYO h}0e]7Y,%WbQq! 5qZ&Vcs> fS1Ic ਸP|ZTǸܻYr}i(1*|3=#oAqhB˿,Z-<zP5BH/%̆`8cpTx$vNxi9(#3l~4TÇX&W>w\SOY#4Wog On rpD*1}7ی5g9΄VwCjoꉓ=,޷Ex2Fz=NmP 1-#Yjxӄ +ܝyοӔ;† K7k[R@yhvct9V_q [)8+ﳒHۊi)w}3bNUcv<+u\KqeA;Dd5z}_<=34VqQ䅑y6fȀV06'ĕ%O| ,2X{xTՠ̄ᢠDlM9-Y[X]^~f𛪿3mZX\\ |ףDfY<+`ME ,|ߐNӻ^ L M%|uȩ:E ?"vN9ri09q ~|$1+ѣ$\*6#qJ$07_0^$_0Xc$^.31aY?bO5xB8- -n [V&ہtI}v@so*Ph}kQ8!R+*.(RyMj.\eVpE{b+祽b\B)Da)Չ[Nkכ}jIb/qPzPN l>{c2ts9HL~$}_A33ЎDlzb-룜Z11EHnPβ_,qԚ v.\.Og=U&)|6LC؉~Y1Yٔ7f;="^>UǶn0Լ`dX@bB0\+:qbZ,e^\P^t{ppap?{Sg[_%|}x)˾%mfoڪHYFt:sUEZL6TC0Bz7w[4ⰮDvĹ.;17糋j2Pz3DDjmD$Wa2t WtA^Oؑg2n[qU)~1P$v rI =-+NNw&OiO=nmKdk1]@T$$˴$`׺:M*J 3R9% /R朏S3j\L`Xf^ÊX֊\g/)rz[.ivOY,-QLNŠz$w`֢x*յLdnV(;RF6DU? AߙRyړYda"t\i@]iC—O&UkP|:S&TZT W ;uO3|Eq%q{pu Ќ@̕琺UNt֦? eն|" q G;)a mi앯ʿrDbǢd%/@Q;pKS)m䛀*J_H֐:A/drl}gR_wqS/#YeVAaeDrW-?Vl-a4*a[\:uŶӈ_^) ࡢ^oV3k ;":<KԳm[a40mqwםd .1ךc~)Ғ%23z+XI mI 0 JJJ:-('': {C; &EՎ(z`\SëFXǬ=Ny[?Yځԓ}"e`C;З~.oZE|Pd@ȁDmV _5U hruB fL}N9'W:X: 3DJ)p[~kKgٹt;,a^^Z<{s xejq2YplG/&jhW+ܕ5 aJ́wq-;@<|@]&h 챛8g>Iv<-t\SRD31SlzQ@TFGfW).E^_cP[ՋnN, wn0hZiM 8 )jd߅`C=vP\KYÝWW<}a&/{#$*W=skCd%R"Âga0|'Zkb?]tYTYS.4E"Y0^Ԟ%t=<ϜBk4vk=BF ʞ&w{J=G^ am~TU^NW dp}5D*¾fA$p8۟+; ΅ :$ X&гn3s?~j,&p ..qD!?fܒ vֱ]@a]uZroPڿWwZ{RIjZ_`z4 f*`\Hw#?e5#C@ǧ@4Jt,o+ngdv8|NB^5% ?B녃fE%MѶ^XD/Gh*Y~4J(~FVi(a&گ_xXi+4rlS"Cr\6e|Ѵʻ{6j\=fC.*R9ۃl\Oa˭k>)0*.hG8O niTF-o5HrSyفL)u}wŨ6ިGmz"L%o!)K\Ml~loO'"K~NRm>Qw@ЃcُBi43T|5up_hvFi͎on^塢ŊVc!~T<*ɡ<`˓C}-c'$7#X=@?w}3?DaUטB=wo0֓ @ dOv=nA>ZJ۳"/2;K%G.~Zm $1ڂzF>w;gHpij~O gr[vZ;_LG^wr>=4V |D8^$[y#4N|3X:#Z-y;fjQ&#R6C~Jr 4/5 L1Olj1֋รpa/pΉ 㾗d8UAVth3&u!AWv|ˍUȕfͮIQ&|h;c^I%UB%-'[ۤ@%@3-AmO?UƊrykGpUV/d]8ZTa3v|Rԍj+:/O;H-6s;'N!^N=Gn fMSQ*Q^9/F%6!iap~jg[jD%OW9C@./w+_I/)@AiMH/ . U {aqxsUaA;PhDxLݐ .YϤW/vdhrv `?? P~9V8 t%/.Nٻ$r7xKo5 T} +/l9ٕ|RX 8يh ^DZ+LX pfag8ާF_̩|~-XwӽO/NUCZp팮4T.$bd !cm |ZóJ#ި\xOd۫WUy:[1y@o@7!ն&ڙξzۮZ{)mQf2\?ՠ8[sb_Ac`p&$jpFssJ0g^Eқ;{Opܴz7bs`z&Q#8%Xi[? 9ZU᩺q0?@mw g)KBOhN){_ ۬Nѱ)M !׏#.Ԟ~c4Vcsw>Q:lzfD[i z+iCG: > 1@fJ[nt׉E(M2q*jܨlq;eq[Ū@o } y ISL[-z2P-퍷޺F̌JR׍qjIT!jz٥5@;1詚B"j<_hޚ [Q.GK.cJ\ SЬg3. ݒ\c?iw%߭Ʒ޽gym.~ӣ&FSbϓ{B} >bd|g0(\# y*4 `pLC4iw[‹I4%s3O˿g^_cƷ{F'p,eGef"< ,1YiTv 81Y=#fd§,U-tz<:,7 P}VNl/ԛ|[)zᆏڳ&bqO܈g t>ʇG;yMH3Ff7YQz:+>C#^^FU={wK8PF}$ rGj{ڟ 0;gxơ\Qe|0MS]RI͂bjxMX,4{lNބn^HI eŶPUcQ ΂O ¼%:Jgx }mw[٥VkbΦԎI U`]̜ld(=u走&ٕf-/V V3=^S!x poոD/m;:5_ $]~![(F*P.׿.w_ IWT{SI^q:O0TR"v T?(i:Ū# k&Wuw/s\EU\g2@4 &])4^oY^;[҄~Ekp}욆 $`س`!m/*j ;-Vr/G}jp|Ϸfs烑ˠ+Z'Acz%{yv~U"S׌nL& L4ƙLЯI9(BqG%WfT̆j9:žI;0H v]eLRI ]U2Bc_ 2רX_GK$X+P<2/ᏹ Y_$ϟ׉@q l+SQqC>q(Hãԋq|&s-|}p;367KǬʞU^;tmƹ,|Y.$XɍH_d<ڷaz8lXI~g# V˵XTՄ&ZO+p6T{Є&qx0TY]m?|P : #ƓeD\4 䉄 D|W2Ļ }vYb ]n!A; ѣ+nۯ^M;k!РܒN)KC%/? h$u"EN(шŋkKK։).@{9Dj[ \"ռ{(jgX[X`3L}{v"c)X4c k,Fzl=0E i'*< œtX%?=F(H0GVfgy __ wP!~SO0=LTqs $oT+Ղl۶2ȼ\GTWwq|)sz&FlGa8WmM~_Qn%IG}oVr7(,dd>V%+Q{r=oy{OpaѕcV ÏV=<[XQ=Wʂ{vjYvឯ֯ u O9{ȁ+az-|Ft:a]4;<c  6 0v׈^'ze##2nM=x(:0g?8p$″${J INKZ{9t>\]ʌ>doĻT [0ĕcυ (.[GkV((nO4 bv8 m\nQVoi RR g!BL6ZhL\ )8QJ+}_=뾧am! T۔#e_anx-!0ٕW8P{X.84>Ob6cE"a[T8mM!y d |F]$XDp cczp计 0-b +%r50x{!bKᑕ*(Vi C̳ͅB! -=EMW 2~y)j.+=A\b@u-}cL"^0kps&8 "#DڽPJr}&>=#;caH/ę%so.f}~7 y;o_#h}#- J0;5$]rGp-vE e8CKJ\eF݂Є.A2&5eYfzä wy>V.Ėw{6C$Ha5d/DpS]>UC3Aʺ@Ϟ#g vQGzG^@?pSa~vpFĞW{o;&ݞp]V޹FPrڧq\fni( M\f^>P.b`F?mDQIT1oFppqq~ 7L_ؾz[o ;Qk(mrz jCp5^U,BC j_}Gu[7+i:-'?Ƥ7 tB}5$} }:&ׯ%A'DlLZr%NRs {T/nCCI>ÈBXMuQ^;#9)$m ;{Bl;ӫ\&vY2|vb>(hbQf~!g(K9ӎ=5՘%;U@W?6enTvZ/1\Zˈ^LzA_s]!7Źg5(:˯|QCJ5 g=Kts{vx}jtvv.$j;7G$0&,i!q߰ŤGtkuXnVNLq&+{ePUnT &]+^SEPdֶC GJ1y4fq#O¤ܕti66-^O~qy:$>&}RctF 0e!ֆ 7ux-i-(o\DВx`zl*Z߇E.'_,]yTa E [\~\pxnڡ-elr=p K2- 9%P?D@QI-uٟofax?3MhiqXtjv7^6EߩU9KAv,ط^]'0vgGi?@g$WNpsJHRnf1`c&7ec~JΝ]Kq-E@*DεTbcri,Eg2p8o 7(L&Di)֠m6A֤CkEL^:se7ohV;oMh`z~dh2{5cSV[/u+B}/z[%|<jDǨ 7Ϭ#YbomªO y+7:@)GIIV!j9y^#Qh;皵f"xFaHqaU_ĞVԲ_rqʗ(\k(,ۏOӼɲuH)v\V-X|&^autۼ%%|[+;>Km'siZ͝gƒd|Yr2Aϒ{`0$z'b)tFzQCpi*s~[5;,V9-x^ݢifx_С x2dIs YuQlHJEs2l++/ѭZXc‘Zt*ONڅFMϜ v,9͔Ԃf!`re:WPG5z&[i߁@GH"h~YP\6"_gU6 >}7.8N|{073׮ó1@&fpy!oٺK^TB!s#{5P:~G>6vpE?!>lHطN_y \h^p/mXۤ.x5]Qu(J#<KKJs)*#tD ĹtxTM+/& qh($ZQU .OL"/ *ъd2yn| G-_Hi|í{'Ͱoަ\u9t^ =0B<2#TB)Kub|קWĕ#g 9 % »O߁Ro_9'N&_ oh+WxIW/>moES%f8bN>4չ`zx줲1AZsH͊U4n`a6vy0|WO(B,dV%&TuF`$׀~ej˗jףܝ7 ,s'z,[y\"g𖱻]d&UdXFDݠV~+{nӨ/ӗO. GfHnimwU}2tJ/zXm,/ I>GA/s 0T"1g'e\hTL Bbj>ɃPt9ƻ PFקq)D d:𵳞׶nz`bsZL=K8e"=HO <Ҿ\)ۄ5S}g<.9Oj)JaAj _o"!Be=g1L %9R-IYᦰ0S5:^Wǀ?'˄O/ چrǻb9ѻq?``!G 9USwC8(hlI~cdo C6N@Pɟ-'<= AiAlz4s`إ'JpЃ "b&aXE_Y p'!1}#h,5 ^,Y\ {h [qfњ=,m/ٚkΎڐ*^wHkO-D4;\3~e1!2~6W,`h-?`Y48mE(r|3IbYqÁTh=W'ѓ]|8_37TU oS] @X|u€<~UUvZ)*_=,1솯4Ya|('Z $sZ˅${W CDy 6cIk0;C ͦVc(Tsr]#S}[ EsDf')&d*!^ʢ];/;)~G4#kG+H[Uw='e֋SW\_]NV G~UVd# ([)|RtjTɭ,5#]A:^Q21M`f^/i6sgc _U672K ,ԛ?e)Ro/2[3SbZ"'`m 9c9D*v^F7]-i vhAv# G;T(#eu 4<8LpQ 5/qH2y,+Al6?-ƺ6f$No_:]ktέOUJAR~0w!tZO 錹rc):?lfwDA!1on>@FnDTF0,*ӭ]%<:ayn?g9(1§STge =F\qc{Xb9ڟ%+5F$u!yvb:7(aul!5rF51OD!D?cډ12k(Tm7?}`Ubі ATQ+PU!ɲEj.d񀣖C4ꇰE}p8TPs0>wzslfXU 4skEF:&|G+%U_7#GAf;BmA4 ḻWpXڜ<fy p~"i)!12Kt8$ {_Ol2L >X2V7Mn{}$2l%KC8\5-b<2v˕$ ]wY1PPex%5e${L"=ƮCHC$Oz{!.^mr Cב3Il<5˥Ѫ(1[MD_Fx``uMtA,rfp:?|W+~`Dj=}e΄TVqEl\J>. KpϡZmlI} c]Lj u_ n"J\"E{h1d=g,SuDrr Nկ<>D|`nd#~uq"~@4`sz>l:%zQ{>Yi@dv oMϼ<,nIx([ew@~R2ƃ*.YW]4霖\{: %$xc_wqJÓV =$;_Ck X]vkT["dV.eb"eZ_dV@A$1SK32-C|"D]D^ʹɕ02~boɊgu,F"&m*dC$"j>b5A܆ջv6 ZmIB1moz=J^I!EFF g%E߀嚹"!zLiE{"˖zt!0Qm3EaΔ"N<]H0N'{l_+_۸b [3oy u~)MlwkRh6 >c"7z)LY8Ol"ك П˹ P veX RzKCq#5x7a4C6I2ctX/K}l*rA=0!|݈5|0 w13{MS37A/8'jCq ḾW^$T=l6㯴mȗ+lݽU#GF $'9HvS9%%QX,Zv7zOw+|NBEH"&*%ɪBql7JZ_]Y|it ql:$gl lb8|GHC9хH{SM]3ԉD w)\C?Zf,.?x(0oO5P+K;)r Nw,g%Qyԇ9Q-[~z ?QU͢-8&"7PϚղ"kF݄{[׶띍b"rm+mқ};(Lvx uo[$nҤ`ɷC} CQA ?00JotA$4<2 ୺*<2jI:&_Y&v~С,ZI)3^N$шGlǙ7rBAu=K,rFBTJ/W7 Y0J/˼nIPM68`U1]4≀}OPY)-x!P[cP|S+Xk2vrO(SF 7#3UA8 .?q0컪݌Ĵ[;QKxp?wvUѧ=kdNgƟ6b+b;a-z$e/뤈RoȎ3QE[㕺ЖN#پ)}2ͬ<dP͚nJ3SV0*%44:]jmǔNξ򫨎2H$QO d \D Sq qj*3LԎޟ3QmaT~ p*MӾW#ͼ*"G^/0}bDo~e6G2)ztox7:0o!Jz?,4V\#[%dET)qH=U(5 9OtJErˈ0h YgD .K`8r&y -CZԇdWj\(7&y&VNrҹ#PRUK% [Y-Хya[o_G q6P5RV/%# C * ,5 YI<"'%r 3+DnMXOA#l;OT׆OOA*8˘@וh &)W*~{7VzlDm̵-!E>ɂC=`s@>>u h#ҭ؀X%[dUg"z$SL 585@RELVy/Tu,.t!djqF67Ȯ!BS%J~嶥j!vnQ`+"=\Mɱ5fC% V#חẊڷ;DcrNL#-Osjs N¬M1oȧIxaLb-/c"ܿݛ`V$ 褊n:yd d$kvnIHH5i1Rq'[YP Q>#wZ)2p@eag4G)R ~4N`9t3l)x,%,f @=;qc;j70 my~EAk^:33@>ҏ=Z!adu[xbZ_rt>TH 5@}COFFyjiP"??LFG!8ݲ1*;gZ%UtbKV)Fo.'X_"N>2ȍ1S3a]!UBDiฃdfZ-ك{%cP `~Y EX"uxŨm2K=9f}Bs9ubFe t0>CM.A`,tA4UK9l);s,F~$B)z,9]+lRz9`4hYb}ƒqXKWsť;K[e֓I6EJLn.Ul Yo0OU˜ZfrAYQ}%!ruu10;xsHYag/8IТg"pÍ=9F6GY+XQYJuѪBgJ8M#+ IbdCAAhKA{*h95ST@fw:۱J*pv pi"eUKBnc/dG$X%Y$jgDEZL?/4tZ@(3c#6Q|ǶpJu6N߯@/ڷm;~ njVC| ř^Ʉu>Jr{#* !Zw+GZ9Aw8x~ /# Ή#j/~cvN |cFKηh0>DsO3\h@cKB( (G1|rl(fw'8h˚Bg2 UPLZ F%Ѽ3:5Y-!‰G~!L 9凥E":8DLm;_{~V/Z1d%UlWB8c捘/lIl9!"###saK_9uCS*8 %O0[ḞP{>jPh:Iʃ9&}D/M5-KJЗ%DWisZ+{#$j# 5 dUoz3"L`,[oϴsF,|RL/:7H^4tbKB\@TIHD\W;y\ek(L]tolč\(t-o"dq{ێ^SEy]/ )6QC>GjjjԠJwe-CZ{)+Y+_2/v}p- 5Aa&7,)em(_N`CW͵KgPe,e񬉣0uGN>ZrOҥ̮H-eqRڣS6Tv d—u;Ajbvѧ0kN \$}vUEIo"W._ri* <AdCR~H1 c QtRsxz(}$=zq6t}!cs/k H! @?d,lw\zWЊH`;kݎ~eо,~5 y]Q%S霯R0,7Dd0 z;՞ t]P+O"Ja5 H{Nnq~Z,<.vPvP6_2z{9YOr]oY0nՙDKSBLTAzB_~WlIv[vyHmW,ZI)cՍ}M4l ]䢺2X.>@h#a _t)-br}WY~hUphR+&Dkpk){biՀ>A`쯊Dy%ҵ cB`=/=Vj'֑KvpTo:> N9.dxp|s7-އ?kL>YN7dWf!rhZ8@iPu·ĢA2"ߦ? ia1y`/64ɓ]Nh^ٕW^U֡\S{ʿ~>x^ yznfm<-::gѭYv)h'l;t`M$_AZsv+,[a4`!0J|W>!cq pTǑQMJ)qnAΗyy J P:#nf+ {]1V {޹ޥe(4I\fNUD1B /l?Z_ *u?ͱbe] Rmv)mEsa9yrsS.\`0܊̴yY9>e(U> C+$j'Dˑ Nh772? PL 2 A>@tI V$`-΁QA?Sp*L집9`@S<2e6x.F^CjEj,3+Ġ'è 63.Mi mGVtggR8~\PՕXMԔh8OG$PF9((upmC\{+I0a=GiZ`?;L_C&98*aR;f00>|"aK,:)XnE{_(}DU+,Y~kI\nw_">pfNX^;(vK3<8>g"X6-5F_W&,>p9ՏK-.lT!2^~i]b@ sIoͳ,vw4RMGWk (*;/h ܽqKYzfG噍lP/fY+=<Р4aZ,%5A]]p"ճ F|v &6B~Tq $$;OK|ihpgւ\|A;g>6uX=)]g1jwԺ@|U~}|赥UD}ygkBioY~>\CUab%PU7uep[ (eBY/Ks)="m JJSĠcv|9> pRӽv"sdq_8Cxq/% 1TQgWIkY-a]S+31eaAn`H'(,L鯡W*?_m= 6u1ZNt8*: 8Cmҷ7 |=;?_~TϩDwg!ܿhh/rX|wU9GNw'kǺ^y׳VG սIJ|cze;7z6B84A1DI'ej6-;YR'Y ֆxdY$kydXq :)p " +?zVɢ&UXڼĢB =i`f3RJMd@r[H ˠ[#ӥϷ;9B$:*S!4lMf1M+JF8 ;@ь}KgbTiSW +=QIvP~+|fCr$}Cr>Ç 8CP9<$Yg\f'O mi7LlxXȠAg9bY ::rgt4Ϣ?>r{v"ai7{c*պUap&Ȗ=&6M/DBlZ׀ە{a(t<ؑGX݈Dqs0f~Gqxƥ6aN9^xP{xNO P- [}ޏ(G3`t!g=)*Nv{\S^ũ3FԚ %YX~z+۪,;YuYV`fsϱk$–6߬H4jɢ!qkyxY xZ{ Gr>W-!X $bW]j.hmfd ؔPt) ug7% ت\{Gf qCIˡ>,W([av0M9<~2Dd ႆ-DWfߠ>\٣:KPTEsgv ${2 HWuʻ|;q`*b` {r?^U^3Ej,abb'!s!Z;o}f|WaBL;m `& zI=b^]a||P< ԟ 﨑=_0%oJߟru÷5sKg'* -@iJ V6"u6ðlHdr_,nTL,d9 ?dpqx,Y JgV  ) Nsu@\˪ss[)GoF'pc7 Re7G0l=Y  r9A9C3|]~7\L9Fi +JȮ*PWmئ`PC Ǻ]^A28pu`Tdm>xx >z*F:}Qi-lFjNaQM',W9mN)2DNhqn;k@1dUuW9N2*ὁ6h&`DUY+|tprz-TED@6RW[ҖgKAM١=gI[ÏOP&̾$*NDs^l"/ˍ.8YwtrXKORT?BC\R[ܵ5mJ7 ʹU:gUBϛR@4HEpWMd!HJ'?@)U+ڒ!Z"su$ǞuN- z \-r^A~nH tyސe.ơ{90 `*8NHx$}tߣ!ddeJѹm;)sS9S=+ K |7(%̀V7zC'߀S}P * ޜ pwOQ4ʋ)vc,X teݾ&h+Uv] Yw2L]ᇋ0"J<Cux~2v>Ta8)?!$U hUj<[U/7ڌ #S$O|{]OX(qQs\Ik< WQfc`dLǬ9x_G ZXD9\M"X|1OH"YC}78+4 :Dq3jZѳurjՈۉj?|Z>7lCoȊq4\'TO"St:)3l#~5i$S=U6xM}Z@EemZ׊ Db?cqv.(S(CFol-߂ۛIQ|3ܩԂOt8INF;.w41Q!x 鲸mpk kUS^ eI?z̝ŕѣWiX_å"22C0r77;.Eo]L5*{(N&ۤjᲞ[`PB_b ,@H4J--#f~M[M@=ɀbHY)Su&dy/|pu&R™wP 4^!%kJ(τWbYbe\@ ѤB;r'"cv" r7{gfcyX)C;졳H(2cSk?ZQD N*scߏh 5ri0"~MWM|#8)a}F=N%ʙczl?2J{\GƀL;%7%O3; ]i%l%Ht:6td0v⩐A9 [QC_z <*#&%+2x75QI&gNu__腟grΰ].; !ԌyFiBl'>.΄Ṡ5+,y8-aOɡ*/ ^Ӡ#zƃjqEj#4g`bdynj?οA΄H2=L_Қ*'K:aI(oѿD3R;S< 5 Ri.AЛ̀aܜDr[T@yܜ73dBM]!F_C(Fy|K[.ީ.ׁ`v̪E{h{u~ 2!"E-߲ dP(ELȱn~7 xqA m0YsBXt_ >ig'x1o[ʪk!Q|>q%X T:JBnD8Z u'jTmK9Z ʶ4I614͙He'$Gq2笽1ǃӁ]ԅD;`(H("8Þ(|KM4_R30/5)-.͖G68V0J'jkKpuJ -A=}mWyuFtO&`R&ϔom杈4@K S7&\č ݺgǿ͂Xhk&`TLr O1 7,ʌ9)o}sraϝ& W&s|z%BƇztj{ӭV@QǢA%$ͭngҤȆF"9b&"WyGSDh:hӤW=[YLF|'E`פ^tVxj{T6L=RPn9ɲ{N6( ~s>7GMZ3 \Hcu8@.qejtPA|[F1Tvz Q ѝ@>YsuBZbq8HoVz hKI7CD܊N+JYTU ަ,Ո+<'Z=(Cj3)mQ_hpv<øj|- {;3ज़Pq=VϽFV8w0 P/F9Օ$JgB3BP@|e^ƂS泮!skeNŒ\ c 8%?R/w`a#tӲ Dž`T5i/b`1?vǎF0:  ,)PX*?)̴ dnHA:&|\\`4ϣ)a~~^EUcDv$GEp3.;ƯؓsiLu.ԉ]gʹl_՞,T,},R"胸iȩ J a=<g(?$j&57Zl"e{~9 (@%̄1v$'>ŗq#W O}WNr?vِEn5ؠx7[oFS#¥aԠE!:TBº h?,"A㼤h#uf ^*/iy5{BoBg}ovLҿvUF% l;~QFFV%~p% ?Et<*V}dvG+kVzvj2薈'_bL\ۆT C-ՂY+%9 Y(Q?/8sIS6V[y_^$q@\(x2gB4Y\D $ ;A (. A;BqbA7|'x5iN6\IR:~Fiy8K֗h_73Kot:; ^=P|;o4XkѾ36ti$_q?&T4H~ig?y8aWSY;b[/ 'b>3XT^HY4iM%Go'whbI~gG$ʙ lxIhtE.LB 3Ř:p`mf*y: k:Ө&.F?2Z^T?7=`+H5y-}0sŌ@ Yaa"Y ^Qq$}}8jG >n+uf.K1hp4 7so_ǦcꋟK~Z!|Ç'SuLD@t*eNńz+.މmFTaѦ/6^KmeW6 !%QHS 1hFExY?98^FjƸ`1Wt"eWf2?t]ĝ ]&:8 y*R7KUNp+XnɯA"R]a<cLk<j p^džLv)#rC_ 9hah-FhU/CoǛCZ$Uxe_%&&˨"eٍ̿cOR9B ]j3 Ě'z@Kk\RtG-lȩUّ~󡿷qNNGiK"n +Kܦpc=ŕoxC["Ps6ya:*{n,F"B#?{g`:W?>F9P"uaȞ#l&KٝƩŠK(IETCӞ sKZǢ*RNH.M!Lv pd&)o-E.t;kx^<ǩ+9V3 檺$_hb>1cD(fd?g D>Kb7j# Āe&<+xʫ[fi<6;s|: e6j?}%:eIRI)D r* ]Qhu9};7w|9Oڛj队R$O.?+PЅ9U9)FRڱ3~%HntwM.tLCZ]܌٦:!IuvA-)ըl SvzI*UŸSajGKWGplӓݺ5Jb e=ࡁ {0@E(/3Pkᇠ7oBUtsP՞aN]H7e8/{aGG5EFJ{\C'p"Z>mN(pio%;~E( R (U)Y -=^X9@D:fh6|GjGYK}ɞ bYK݀]TR0wi:{!ѴzAC ^ZA3u 0{Df[jORE^gٛ 4.}lù3FJ5rI9btJ"7򜿖pV#u*4{68${xs03/gⷂ<;$nxAE#Qp75}6~(ƒP79֝ay⽜WFLw# ?x։O>ƍhSvyy+v9Osc+.p[  q!&= X9a6EXUss~HH*X8Hbp rY֝?aMGy) X T:~hݬ^RX+ظg^yAoOLF>0&sWUw!Srw.`ldp*N^R n\ wUYYH>G]-C 2 6.iSz@^{"D%c^ apѬW=99NIjyc~9˹:ENz5E x=u]*\+#r3XcrOɝYK 3Wp\TOK,dXUี'S` \Ev> [-^N-ڭl熿3E sp i5(T^b;>4o:sAen}$ ? @p_y1~<>SIK(ʢґ]2=/M+L6Co5^ns;Ee$,ZbE&UmSY S\o֍)0Nr^p*,~^ρ˜|5|8KeX+o yG#ѨkԐPO^Y&Oa J4' {܏-C_gQ#`g' :o?5pg `j<>|F([H;>U[JRX|m<0bwB,5LD/Ond8xp{KuWR*G漿GZd+&bj-kth*+OK$sp&?ČͶDT}|͸+Ut 6xwfz3$_V 1P32+v7}jpA%z9eT.5|Ο/#].۠M9ViOŕNL3(}1qšaZ䤔 uaG4 ~4sF6~akOFcU`ZiVN4nT﬷ď`BQfAQE l&ۿnƈJTu癬^؏MEY܉+2搰A(LƾUUn,_eޒr,EnjLOa>p|G 8a9_tLFeAi2t8}0{[YnN`E3gf;{R%Xq]_KkF1A)"~e#t-,>]zҮ aJ R;f%<,3+d2t?)/bY-Ɋ@R3Aߩ! qs 2 2%ۜO V(O?ߍ OQ /"`9=է%ҍr>7.v^&dI?s:X^lcCs9{jѭX5RC#F\buCJ|]d[9'&/zd_3͒@#|╕l1NGg#(.áК%W9$-gf혥^!~'~?NR9uۢRcYݼ?cQY'OO ?E~ 2 1|0~O[}+_C Ed+;Mםԙ~WO Y,z.e%@@[vP-mx&q`&i*DɕpOcę `*ɋBt GZ§~{6 5SG+b+pO]Ryc܏bb%6t]Z蕾v(:!m@.| 532ZČ8 zhiKiL1e=5?؀HevAVc2 (lMryrs5 u @K>@nl( 1%WPψ+tKI5nui\Q~dg0S a* w%J<7㣱 r0 >HI*v?ОRR*Ոl!wq;pg $/!o@SC\|ݫ纽,ӽkSEy)â?`pd H.@ryV1bćY v/\oPo u츁,|dQ޾u] 76r؊~܊]Ab :ՓZ+P$Uewp~ۭtyO쨳OM~cz8p`-ۼ%L " gKk#nm/&;p ; .^g+2ZEtOEks~ч/_\MiΫcxy0QC:M#T"1[i!OPhfepRk0R\,c_bK|MV+ KQ sH~m'kTQ3Q pi`zPQӁTR6UGK>ol_`23TXU `вC{gAY(ObxVe.n53=#Y-HKC'?딨"qoZa]qB/ hpkP>yHeIڧEmPM[n0.AEZ!6R;*{5xya# @wU=ƿdX/1W7pE>=E1}I R|9LewLımP}t Htٹv8Mm7`?]`!r;,<~3@;ϵLxź5e`"bxB׋M犽بJd`lv:74 f"y=:U(0g9lKt==*j!5͟EP#"s[Q \@E)XSrS9EKS!RJO=Z ~օbm g;n3:DrNWv3E/M/M"w0O +L"Os)m҆UXfF&m{Zp]WF"g˭;t+T\)օ7fNÖ^8DK45q\ 8MAڤ;hLw<[7!GCD;~hfxC8:'-U}Uӊ|`b:V8vDV+&6z+N^Ve<\2d+g*?[Hp]8H(,_Έ&#&$ԳeUé <ݸ zBFzwb#ݡLr <\s7wg=ښ$π—={uLc4Aޗ+YHf>6`瓐@ \*Ci0Bc͋d +juak3P^|GUIAU:=Y>fX.=ғ)^ܽcLM{SBMV|"4 nVeJƓ>}^M >}~Y 0:w:B/Az>eY-QLb19#HUgn3?,N19nN q@d'Te|)߻2?w N&l5,>١LgՊǥڪά ^t` YCl(=wfCU%^i sx(j餼-z Ҟ ј/vqa`v#Ή%o.)PU32Xkr1Kk!KJV:s~ ?T-؁X!t1$-gk\m0uP@f;ro>003f&IT<,$0J]yKn7s1,:X)3Ptemx/norOj^SlSҿ't`֠Wxζ'J- V,8,< wJiiݽX?*Ufґ"vUx؇l3Ԗ[ 89ÅFxw/;Aj٣-f]Tg42&^g/#pd@WSp+X8t{,n)]-aϩ0»9|إAxpj*³9yx` )KcCHX0-)e&/1Ӑ֕|TIHZ1 XR`ZtRP[7K`Qt1iF x`(V9T?Q)Y Bтl>+3=05e"1_h`ޯ!U{}?[D(pJ),FO!a6mX;JpE m930\{ɳÚWRxJl]I~8_{j`l̬e1pn:Pxcoa&k:mR,g1&k &d2}s(}Z#+q!񍐸>ŋTU. ^a{WyJiXE+-ff׀x8X" 7`TpȸAl_-@&Q޽xRq&”$]Lؠ}En^t7~G@{,=HZ߀y[pxO O & o<߈Р3CRkWa8F>ӛL'<.xo*uZH.WE0eо_3 ] a&tڤ>1SS䘐o3M0/ٵ.sawG3|>A[{'+g;JH`пw)=H1`6H(f kY`U] 鹤 H %$>Uo.,PIe2-X9ĉBiU ҆wK>AGrW=dg^_g* iY!q.McsH=TSr"O5DW\UILD%[J! 'Ǵ#]ޟ:JS纮HB qCv0]s㞙^hBW,/@Y|jtM"3u!U1wFw`XԝMML.+]|(5C]fBE, \`NxצSV%:=푭|@+DEUGPc0 %WQk9r{F}%j(엵2`ֆ `5 vKj,m3q~[mԫ;j0?.yTsF@U(4R{=Q.*. ZU";,:uV=\.&fYnL7hyf摄V)/ڄҧ5sfȰ/Xaw@\Jw(OP~*x)z11 w:Feb}Hֽ\t%U$QnqdPMڷՇAŤ,C)x nIt`4":>aenEسQǷK*–NW+ M`Si׻1Y]x:?Xغˣ0'>)AA 旨?68:mh>D 0\ $iO><9/ILSs,|C`MeX>W31#NmDmEo*p>ШZקS-Uk{3oyRm L`zZfB[M}|?ghjߨ)yOBC1 y_G䬗 iyKmdrt+i W~cuZE묡һ8.[wS@0#"}` $dtV,pP+4u"p s`du@9@x8L ]=.ύJ&+17fr*#,>wSOV'|qsg$[O9oQ)#]'5|`ӛ<…ז2b@>Fd5cw%r??Nv:Oa@3VǤЏ9-羮J9D Qs"~7ײv=u{P/=&f{f8΢ !ʉu0ȿ%$ZV /W%pW^nֺ_B"?Z94GUn9ˉ7I~I];Sg/ rI:2Т.iuyn|z|NzCl`2\k??o aJ".5[,8ŖxUqk4lo Pv89cTDn5x ɼ$UTA#</A#)+osYKO+ƅ̭@z* t2l\U- `,*cUU>xlRzh'Yaz) &rAsAT7=m@8@UҠl14A8_I_@ʉ8.oUסBI}W3Չ mp`S#z- D2쥤Y)|d~{K_o8.ZY.w`+1dÔ̽E%x>Q!PZ!{ٯX] ,Lb٫͢˹52 N\Ik{kuy{ "OJVĞ|Y ; .|);{꣔ѱK>?m(AqXMhG6&)ʟbJ|X ma DW̳*%ti?HYͦ[ sB*σA׋1vV-[gې.5>Di'S@r?؃LCc,Z+"l7)sB$!yN v5{%⚔>Փ=syr/j Br9yu,ʛ#]Qv1 IpxE|F>\;{lȞuþ~0')@aفg 7Hjm/ 'Z;F`rk,4m[b IG?FL$kqˌeӁؐ"=*GsD~<=q Y[ԵRLNUӅvwmfn֭vm8*'|WhDK ޲4;~K<ák/, ק"^z^1S; 4  bs sCBH~ɿ[q2#=t c^Zυ61F@unԹTRGf54HW9Kd_OF>./fQJP? d7'՝ .V2KA/}].Eo.3m3JnA>ߴ_XkVB ,0`&7 { N E˦mR^Hhad66|;*&Rt^7 |L⠞A\kB8\9<>]ОjR[ DM`;e")6Hw:vK[OK.qbS=' >O\Q r2 6 2f86-N;b+:K cq}oD܋;0_hFZΔtc*.ʔp|I K4M:K"k,x1@﯒}{qe'PhbHۢ: 7GīG8?Oo($ LͿ^/g,ʱ7U*$L ZR'b<.. ɽ"dW%/˚1b]Ak{M\J^Jk*ى2y"y5,H~}&5MdbH1# ]<[[N~a]0fIb GGOW>U+ s0+; íjB>@A5jCAmvш]RZk@qnpo0b@GwA}^Gu&53pE6 HrUwB%ǖ.c{"ԧ =&kE @ԌJi3IѼ]smG(FXSS"9/:VeК>rE;֝T㩺XU~ѤmAyC(z[`1 OàAy (_GCv\6JlqAHQ}Gx/c/vop+^*۪#BPb;QxZOf`8Ki8R.jec^jy2ѰGSYNҦil 2{%%gcC8kJ&Mţ$*@!sN\Mbა9O|@IWiZU.4Vp>><%Qs]]շKUnnUQv#vQOX^ǎp{[T50!|U`F_F%)*k .?\z};FX xY 7QziIhr63eaԤ}p`Tє ޡ[wYcLHn!b-D@#3W&dZd&) #tlbJ A ?S͎GBѤIp{k $v!E:*0MlQ8gy꪿E}˓HX{xm*; v ' 0"y~̝z⎭6[!0/y6<黃ѓ4l8{e)96,&/yTA;;qdCV [`O'n5 XE}lt&U UE!^M *OB<&KRWl赇=OXtQɥ)kJdw"qjRkNM;7t5bBf)< 93 '=teR,OI"˕mK,i fX)a _DP:z9#7l? #o [OH#}Е@ MQ֢OFћL>ò!^?/Ht(93eU܃+WE+Gǀ[0|Sۺ;8s"t8@t#$ aX 4ܺ}bMEhS4 m\aLšݙ6ܾe멆.(?t]%/&Qֆ)˨F6XH=* qjj^.i~(^9[׫Kn_TH7.xMZ>zF͛KRݣjƆLLp'ȹyӮVk\N £9u۝9Mׅ9R8rե=vl69p#hU*Z ސ*c1u_%~L=9YXޛG[0..0g贰Nb (IHx!AEV8,H&2y]jvV`iJcٜlSRU7:<ƈ^F˴3 OQ wԓuFq̎L!tEkX7N?ݺJwAshT"f ;e[T.54.g79e1y@7Z+ Ad ϟfK@Ǥv2{H491KB,{ϻvvh[2w y.aRC˧vտG!w[rsK&_ 5YdzZh32V0kOܾ?7*w}HဦVҕIoA>0Vy;u@nтtnKtp0.Sf9y7IRgC &bOI69Jk Se K² tKei(qW䭈J`YhEQo^׾}ςe-U$Sw:BKnh(E9!6yʁLP{iQ~~[ xxԟ]Ai&?WѼ \ Z[۟Ŏ#v`ׇ=W&ʴc}_=nW2mY&Tr#j~d( }d`B-1ŏ6!a';gF nOgٓ1ķ\pOE{_ߺ! fZMwY JPZb6)@@>w6^vL^!;?G5=?ē+똇vU9Dپw}fP CYL V5,a~,^C 2'HW}6_j) J‹oZlm[PӢ3xMVmVK5д/zQVGhX(v,$Dg;=3b'Ԧfq&kuvYɑ0²xH }DÈosk}_BQlk4\;FDT6L/ĺCEOUrJOJZe=\mf.cs:}8"JORk~%{fCq aΜ'lR v?Θ?ȼaVv]9/zϐgS7*%:{:fKcJ̕ 1Y{nsJfI{k_5+HIz'Vu& ;jUaX<~K~f91bRwm4(>sw;X@`^!fq.1{ Edt)V\4r# ZAX5#MfxS@PI}2\(M0tg7+Ndkj!hBIG8nt}LA}^/KN(<&T0neHn֧aO Z ?67x~f.Z+WZ12<#@vHP9*Xԓx _: ^.е(fOne~0cz|R4YȚZz0뀍*W3]xd=x!?L( f趸_ȯq ]dfҚOn.W/9Q .z6ۣ&6p>/Ѽ%@Oר o/l< ,iE bQdʠGG!FpdIn*[k#žOcvMk0?ߥ6A5g $#F#Pz"ڢx ni"a ]wF#[\cK7MQiiVNHi>_1f4}=_RiqG:H:nOtcip"; 56ayntn9 ^PtGCL.GbrJȦJX/4hu >i'gfiE*uJy LtI@yD_?[\fP0Kf}`ʔ9\& `%S He5-Peeo<6(#M7;f ȈƯs( .9vòޙ~ϐ^5p5e5Ĥ&'t.ٚ9}t9"Zi.IPfyi)hi\ձ+CZ:(4~AGk̃@ !sTچ_CR OP'>e ,Ks-̵#Xw>ZxCx8 Iz7,fZc7dd'}) E; G?56,8dݮ $bmjF¿'em3~ªKkxh}Ӂ)z'^~g!kh{/LpHw7TE iZtzKTz@Ls? # yj"4Hi5/D5Vz 帍nb>y &DCjHK6lDkvПK+F}mWMwV1m(0 !6>kd @M#a2;UjRT:y0wpsN-v7Ia'|rr#⏾kc3+`HЪ5?ܸ 5(-r*po`|h83X?aΣP{Q6nXP`y>*ۿUlz gCE0:3{#Asa|gW+ؤbyS0GQ@j^73G66:}5?[ 3Q])FM2 GRd3H~;5%ˋTv5z6%X?C1OԋpF4DO ^l֘39g{4r(HrLN;{^6~85:xn!*L)ZB ڊ0s)(\ƿO<ۏDxƚr\8Jw gƏ0WC6s逺^F Oeo~BA=gk|Y˗7k.1}37%^.ŋX 7vpE*8-$5;1' ƽ,p:BWք#~(5jk!1vϤZ; UZ^7֜Sᱦsj%]8^΁'W:D'a:R޿}"ff&;Loj+;@0gP) UB!/9eQdĺЍZo^ RdI)ITnj`Mz1Mg¸7|T{ XfV, 09Ut\sw ̖4y܋_XkI-0K6~9~UV#qJx-ħwhUt0kP}xOsoh!{WA"Y7s޾V?!޴簷9ViB 2|b TeHqm$K<r-T DJ͌9Jc?ϕ Hu'iHîD`CXWmcRjKظQe0. A7X ō~ZĎ+YBCSqmzZ6wMjN~%>'<:{%Poeq/b4w`n 99Fٙi(]|OFJk}S"c:QHX9\ -` 2TQoK90g–l 6͑A&Q@;(ӷL*Nx} Q̞t(䏪bELX{vx? ,c|)]?}MKXx,L{c3;1a~gyT4*aCGl4shCsYfٍ`a,y8Pӝ~Q|QܼVTwnr sU"Yڤ]4tǝ\ G9U6:egk^M1o`O~@n2ydy-KcdvRgN kyRuZ_@a>fnќ6k7⏦M3%2Y85S0џ3Q7-d\0ׇtI%wOo ;ghW~rWExY+HM}BqcˤsdAA{Mc筀j]W]d` }%x,3K!u=\hƙOgc65uf$fW翣 ظ;,{zP J_ElyMc H`i=*48IU_:qKdh+hzG3;w%#"A{@|D`Íy:{\nIgBlǽe|ka]jl*\כ+M!La$Te`Ax2qj:C.!B͌j i)]jLdldc@W>}]'Ƶy')ҭ}; YM4295eT$gᶛʐdr_2:pC R8)ġo ZMdō[ HB4ٚPzעGI"b|[Ò`);; p5^Go_ĉvٕv-o3𰗺Z\|/\q U NT&놰חPUp@Aa-Aͽ+ ܵTv_1w\q`ԑ|!2f~Ʉ[溞FG^jUt譫Je"^lB{sh!wyWJR|RGHզGr ?x_gUcFlJR,ۮ;WŎk䤰$kE{Yk *LkXƷ0"`9^GojkI/E/VQ6%kR3H3~䛁)r.B!`v*R.R ;Y鿞Ħ^!ge)DF=Ҫ`G.J͓,4e)= ҢFEnյ%µ:9.{[1œ RĝGrjn^ꕀ8 ;k<.rL 0YU5CN 0Os7Gk7MH"bǃKDޜ׺_pI]m`(!$+56n 4Yt-&u s87 g[Ucp,%Y{'6 W1Q5dB|Fp^?gc隡o?|}LM7OJXMm2L^򋡘qFT'ޠ*6#xgi?E_V/HCKP buXƟrљA4r3j6ƤV/MLL׭%O甚SLN5gvjW\'g,7}"?koaۙpM'Y`53O k[Y>&/ǘ/. a̡iG {6W'~P/x0۵SuѻMbhszo5·@VEJlwn}#ٖ>67o$6;~p =9dmG\?|<S}dWB"(ki+2Y ;F,y!7wӳ@,#ys7qPZ$׻@ bWOz+јJjdBۡ6IL?SJG;mfIqaA; JLF@6_8IPF2S @B\[c~fd͒HM&" }αP# zI\{ƍneKg_iNb}=v; A_Ňȏ-_Q&Nݬy #q?̄A.I96N|3rTf@2OMEўo-˄V a7Q-5)5>P/2>ۚuzVLZ-ggOԸrasRmF W7wD0/ i$V} =?-L2KCYǪ}Eb?J7[iT}DsYhze>#7sÁ 7Nu~y 9v}BdA*E.b{W3VÕ0#iG {j#ȭ֚: NkO'-Ob;UZٓ ⶰ+EBc|RCkT |o]ZuPnC7/ڬy)Ž C d0ۛˢNݱ8B5'a_ E@ = rD4Mfs«:, ''r5d$@|`fPK s46ʅ@6GۖJXNǦ8E{%FKF!jQ d-+aġ sӇfIK:{# HbR/VP/]wYe) N@jLLc)ɦ7@<# ޭ%wEA')NEN=in;Lc=0nRh^.h!ulFijHt߾9'4i&k `MM<2o3)/)-:<$’ U$bߗ}"So,6dxKy搃D԰ۙ eS"F$wCsXbmL>IpKoQgueJPnoȉ?pEzh擎k2f5D5AG䑅 I 9%NjpFP~ VܞMG˲iֽ#ʛ|&Q։E$)4AzKU|Ky&y Bob޼j ]޽LO5v7`eyBYkIԲ#@ HZcX zDWQHeG/ a<cE+B.<#K D\+mm\pidB*~ਮLW>sܻ7T]!/TB[L ZQ1Yܻ۷JQ+^)жry!qV!Ih;HЮY\AߙQS6$[qvXTל[Icꢟ3 ռ]kxZۈTU a\Hmz'xߍ YiRc5jViy5s#`}{jMXVS>P,°j6@0hYۂl8gߜ79'qhk8i&Qa\ /4tĎt+9,h~%!h^/$ɁLȚˡ,lMDħ4T0A `rM۳{+#T$_٠f- HlhA%rz0fi_MjpB?i ?K>Q1@\7Cs$m'Tr)l!Ž_KRJBb9pB8diWNZ~-,59kf~A~p뎍$ܗ,n1<;bq7JҔj]3-/d>QMx) B 6YmHT=2{$cDEz;ggZT4BO\LtzAvp Lo.Hځ= SE4pwps cTkm_!4\u\i!Aqdiǯ9eKjڑq~DG";RuQ3эS;. Z؀2و >?㸤fN:#Y[={LœmNmb{R;@/nRdRO6*}Nb-YZ# q5֍?)ܭINޒ˛>B6mj4wNon2efJd[16r#i\L\Cl-GAb$}T#Ԭ!e۞ʾxhy28T74MSՊ brMjƽZ*M93Úa`zx22+\ dvlmCtu6פꋶ,t]g})8Z.A{យrTA$Zo[~fg(+imd ƟlD by شL$BKo^ )3WhjίWQDاvnbݖ/I@PYzeEo 4)4?ČxXݮ?(2Lì6P9d$$kgbk5z1~Ey'!Ӽr9@BCO@}J(09 Ʉ )U7BPl,[N7 9o/(^|ґ')|k]r_lbS!ʾ!> jTXȁ7vxbO(T`s`-3@X֝$pf~cxR`>ke Zڣ&FB״Wo76,$Ƣ'*bTBG bR֫dDa[٘X啕  9Ap͎{1[hbp%J[fy3Rjs(Boq}h?8'Yc:T]B9" v}H/i¥NbK> 1'9&c&G^op8' %D<܆ir࢑rf}F%|ѳvMڤh8 yJ!F,ex[]F$-G9P~^ۆ< +kVcz}&T< Uja-ߕнkòS?uNDZ=pUҸch޼׻䷩HSMЈ* DPP`p@rB{h]I7l:Dv8ƏU:u&ג;5h iph<)D('{i?(mQ˧mέ1 gUm`cXRaHZL)WJAӌ1 ']tԉ]fLs$Hb)ZlX2fBWDmS`I/e!YEpgdžK9 |)'vvFa1T\k}Fq2}[Mp @=㐆&ᦙڅ+QM]lɐ[Q LOEWUVp<m#֒Ĕ1QP\Tɠ}3*ŭQ\ rf`t+dc+cNʔe 9g}yx|n= f ͩ,I`SaQUx$r Z79Vfg=LEt]K"zP/VβskS=''Jk61 &c&`Qp lS2iOg&?$\_q쬛c\Hf0nu׺G{$b&-Vġvw$ t[~^WN-s94E,ʏB .ϩT[rso އ}""2k&v3Ǩ@ؖZE0o%K?ji>NA5qRVrrtAp4(+ZQf{{ ZƎIMC%IypX*U(o9R > [=CnâAi9-!W(b+FsXfV,٭8z=[}bB*7_ Ef0av߬ߐg)nn-{i"bl`v۸,$/}a@Իoop_ q*PvI}GI+tor#p/dgKi4}t4sٯ۵"]Rx[B6a@z@0?\r+C5F\FUAEZS0DT㲎wr'Č?hOԎW+Idfs(ĨEt¼e̾?:uu>JUSx}sgS r\=}8 GSySFL×]$L6"\RIcbI?O(.%1Ҧ^+ ҳ) - ~~"s" ѨK*bymo'NHg:!]G,e`x)@;?[;j^5{q]wҢ&F"e$2)`#/鰒+s8ᶴ6YNr@Dbɹ'uNWzXf8|@6$NZb $mu -_lLr}.YvK Z &tt<"?YŞ&(+ru N@7P3aqtHL@z#\{07Qz-="Z*>ϮF5p.ᘮ1i d1+wоڻiSV\\_0uw!| 6 %-䀓,PFje+[3or[ŲR~M%PT/*,C`S_{ugZO07h&è4 ~WM*ftV"wZ9*zuU2xG>jVsM y9cs?V]NMH I_盏[*m!Y|ލ[QvGh52?d[s; osvYX_޷cbb~ZRl0(ۏgzIbRhex\ ؠ 3TX| *Okő.XK wπ6u^'@%*I`Hf ̨!*÷e4@md<)>,% Ҁ"W]‚cAwT0p[bna = M~2&ܗ(uF{i/k}R?WaO(t*Kxmfl>9'}]?bs<7]ŧ[KR=F$\3/e9g3IaSA ű$p*1yb~ ߡyqЉ<`IQz!cZ{9.Q, /aN|<ۤBJ0S0⧯z gU0v*m0ȴ=$U*BaU*38%&·s/[ vfׇLb"61+iN ˍBD9a #E;TC1dyHQjO&&Jி 'J7:?2z,=Sy!}4<.C-+vӋ 2( ;@~w߄sip;3 ]7򴮮fͩ1+wUg-8/g>0OpIº`ӥ˧koa"ua`+SaP=1dVՙJx8G]iׇO͈cK>axcpF 7Ĉf#_`,2B5Y} uJaRJֹJI "7eb8M,̌ MR{3pSUpE_xHx莫%OQ-ˮ&4%~#82#daTt7\X'k;=,M{mNG;%B+1 'Q] ḽVwd;M kDrT)V6(6٢P-wYy}Lybl"jٚBcm0XNnl/Cy6$Fo!zN34PKRpp /O$%Xro ?Tpfrgr$e_o1Waas^ayq"heZFnz$Z,L;%8qWB0raF<;X%mW^PRqcU0 a:˞e.mbDdT.׼Pk'K{"fC8|/0g(@G{Ņl|yh(\Zl2+]$GjXE AvT Z4R!-x#;51ƤDQfD<9Qk}FT.0a (0m#uD !vH-nűs^t,.%ٴLئ"~fgwuBWm{EXR:9}~.$if| >w#_JihQtBdBŢ5SJ`ơ8He1n~_`kkŔlH鵜m7*mFH-PGj6ݽ>Emy2af]u8Ǩje'*}C%|V#>A+RkRzm*)~c1W1HRzUWH6D5"xlց"q$~84+7zU IW7׎(鱤$V> 2_NU]ĒS~ax s}sv5u#`ɡGn-I e@l7DžcԭBv/56>~#e/2Z[ OOJ~k-~&׋hv7܌5'X QimJYimNW@v<_ǓքƊvD˔.?-a P4UяIͺrxC}1 LUg; nR$l@^;ט@s'NLR7p_~3) CBoDD\5oahPÀU rTi hP%W\YJ_B Hi,z REw\ʨE^H ﷾@q\dOhHѓ#OG UN|ET+߹=ZNI6?,}O#Mo?fTA6Z/ğftWv BFσ{gwa)^x)R-.)eY[,S1fd澋^% 5:|N"lkLX"'Uh£6/Eōs|Sxd{ࠀ"Ƴ߀)D&Lsٹ)#1´"ucWgb|B㠝 :^7[O+E]݆La)1,L~LK]IDvL'َhHjhlp *̀&O._,e* &Jβb߉QZuf|!2zUF]EQ.CQ%WpW|@wgB0; zr}lUd-@8]+0Iv}ҥ|i7\d׶j 3p;rKTf?X,)G`t _bK1?Dy'Ix@ 7E;(#xSFt#>cKHo_j̓ƇJH?>+e^e[Y{ErH{,򽓔kG݉*V|pjE U*89WwI}iT,[}f졑ĮV\zoN>]4ɚ68R[8()a?zv2m5%{ "Q5wp#L>r{0T]4I": .L=ѡ뙛N!~Eн{</,x.aԟ "G5_>3)5N%,k' 5|uЍ@jyszG3jAIi8;,ݤG|ƯE҂rwQW)2Gkky?gXb}͸alnM͂`CW<R\,|S}u´UkV] Q,xyQ{5- 6ڣ?4㤺DRl rgkj!AeNXR˥6*?H>;2M/Ig2C7ho  N~\|p7@p+*"~&mVlAI _v+X8ǯSIJ3ak;8 Bۧ~ʺ )CS!2l;v,GmP0|d(J˜!sdwHąi35Gc<|>|Ge/ lecN{"Hpһn^y\$L89nӆB `k8b:$(?'3kί%q1ӎEdGgrS~( #Q HIv/J$bySy`_/:QS5:rk5<<&Xǖ.r,d0apV#݈.~t\C9u%N^@Qbef ,B>,. 6X Q+"6\+E!ػd80 aC.Ҥ~g gޘܔJ'F4FN*=(E{1m1KOI MVY[AKqmXWf Q Er. `FXD(_$`M EWk9&;ƣ!tN@vibFm%:w5\29)} 0?7c2"+}v0}I8_+>4+L_˰|:I֑4]|] /}8p옚}}=59+|NH <">Ei#/x:״bgy<7CW0e| qs~-Fy=S+Dx@>gii2I3NMy.c*[ |fa5 ꛗqY0\< ]g1ҡD^)Pn>˹ vQPu4p#Kz? 6-Хr-M& W:ю9:fT? ,/딓yUGyΌX K2H pHH_@Zbd`{i ɢӛ`9S*? K3|r8&kRB~L|1KgfoTvT^ iZl6H3sĞFvH".@`2(g&zSk!wG>)@62"o| zl~|VT3lk3[3N2ZGx0v !1})HGU+w˚8d|+!F ąLцNT=+ƒnR"]Hm߾yf"HaA%kZ5Ga +Y)q3 gʔj>4Лi~e pSҌOQ%Յޫ @d%o>z2XH gaV=+hcp Sj<U;Z ~ KF` ld{ Q$!@]" ǒгo/FV$~GY0$MO?ۄ: yFG* lH_Z}Kcp99iy3!C2͟- Y' ONr`x5}P>G a "{ ˽*ϲ ;S l" jYQf6;~QRskKFZ1ݸIM,Rm+=+Θosci2oͼ|# TuQJQy =ˇZXLI0=P am*0[Cg2"IZée߾P&Ud纣ߠfHϷu!gJVM^|m3Muyܼn Pҗӆ Q1ĵ Zl,k|1|EYG_4ZVuW?Uҫ$#q`Pr'C>l8aw>y4*\@l{gjjw1(oШ9 ɨ.&^r%O uDsA@Hv=jGM ` 1V5 pۡHX^н;;eC6MdG?OEe[W`JjM\6ݞ:s hdITqG= pj~X|6fY}j|8h>Q1!W*(w O Y,xirf 0g cbXY{5 L00䋇^͍f[1hEGd*tWa$C$w"?Hg.1 #APkĚjޕN sUjACbϹZmty\RGuXj2'z;<ъ_:ȑF>q竺 9 K`$u_,L3s!E! `/&5*#mܐ9;,>^nGԆCL;Xb~ K6 ܂[{ix͛ ƄnR$[f`k8YĵѰA+!MKeꯐm@/䖕^of8`Z(lުlD2%Q\lVdBJN]< A%,Xʧ:nS\{ 0QK8wY] BG&ѸB]ͨ*ʱ`za^ʃ;p4 !],Q, 2C53.Q̧y?S޴=Mz6y,#vO)$"`ڱn+eM))ڃ}b J! 9̵){4؃t!5:~ 5#*^> l%PPJa'?ovw*vd20ݮpN 8dN ZOAIt:ܦJi+P1g[2wmbkY,>H `#7xG]Kü6OYeCjv al(Z %9a8H8q$g{`.S #C9,U8U{ݚ?t1<$h zBۃ:?raQ{ήJ#[FUPʹ}-?%E&`P4u$ix婄a_?4s!P޸Q8d-3#*Ds,_\Ienv`O^isOh5)G Iڀbt Hwhg6?( ųQCe=a ;~=vTKy[H!"٭h_X\RyGV/&~.{S >CyW[?l爾׽bt~*/DA泬 t߄_~t"..g~CP|лZ,N8b2 ;PS^bfa4 ux^yrWqs_+#V{[bDw=$⿔F*}WP}9Pn^|.-W2c@(6eme)b-)*IrЙIy[>$A,Kixq4[׌cBVSUGAtoY-pDIqR<@ƨ6~J,$oդa<evE4 @DTl ƴ@\DAd6sXE C]Y9]n~[ 7X(\*JNc0e?3 Pjd}oU=yAwѨ֓ԍ G}\/Ja44a/$:[+w>S/,HEK,,>gPt#n,.y+J $P,Y+G&yg@y05Q)w"FjSyy?Y<6zo!\_ gog%-d\;A=cjY<)ҝI A8r>.bԧrP2y M"lˌA+TЃE ?sÌYSi.N) zV4қGCTq>gGg1Ş>@`Iz`2gP3b P8XбPIk`0ڤ@B%:oop[7tdQٮSU17lQn|)^]x 2׬uwz>l3Ngs[yl2P5r٨T僳Er eR Es!-nU0e}#Vg1ck0z>OII1 hMrt0AScViVM |E5uQ7کz?Hw\m,0䠶ĻSp;ly-yRv"8.'l7^Wʕ!o" +ZL懢 Lm qW+y"jiGKHP/[ŧU'6f 4H[pt>94Lg|nҸc:ꔸd`C=bHD} Zt ,lg4kr !l/R#j[Dv(fUƽlWXgvJ%)di;~ TAgfmk9]WC#jpfy 5bQQ eзNq~QdT4f8^ݵS ʑrj?Tpy ӷsuݰEc:#Ŕ|BuB\Uↇ/evy7+]om%Z~\. n q-p )@KDکu d&i>/iv ǡ|,u.V ()iez*q(v'DHط7zPo!7wkW;!]gJf️MHɴH#QWOļO:gY@܉Mq sUD; z;a6 x@Zqsv䯡 O2RTІ2cs`ڲwڧA-z^J]o$[Ăݸ/y1Ϣ^dca̤d| Y)R#]_ ̓o-Y~8`A6 %Hp)"{AgzolxNXR#9yúaa 4^.#_÷ jR/kǙ 6@ٛ.mr!l >~ۖ $u! ҊN qb0 tŴ4ol.Q\6 ?Iʖ|@C2xϛӝkifXB->,{tDE8 Qj̙QkiG_tBÆ+t*UㇴT '}Ʋjp\b+=y#Tpga->,V )t$Ov1xT\|xHxnmhISjMI5u+j2|U_"{޸EGI,#>\W$ό]Alfz8+Pvu{9E/F=/N$ E3M+^h̳450H%M/.`v`5~&MgT ]Y&U}ԓO S'zF\O2 :y$%N k'܉)]ԮVis`s3jc\sr@FUb^%]Sr#>veJnJoqƕoB2w00Wjb DȊVOmq "hwiesB ked`M)b:s_dWV掱!Cێ'bSfmuWn*]ypuH~^>{pS&ai6x <̱[W~[D:*B.L|aW q9 1#v%;3sVECh e$)'z)ozcv|zCWq6_xj>=Ep>E]:}BBF3Bgk . ?6w;¤"oOu!`&(Za}z찫\T1*C( eHʎA? =tg~^Jd V;`ڝ{X6hq&G6oЅ*W#)dl`A+/('kM E{=#8 vx^4 <_Lp=D2!Z`[{@"ޡqPSZj6yCFj䥚7;8["./`xS j\w‡PC59ҵ~y-NOE1r\nh-CtWr#Y"@a-鐂m.L]vezĩ T)>_DtpI"I9i#NF& d0m0y3"ԫG8`3Zڵh{c\D&'e EQLzVi܏CYjC4|6S7^ :T}JRp0sp}#Z8،RF".}=dxdC JJ%['D.HB2fux֜ ;Rެwa٩|ǫkjz-Hi'3VjO5G&ä%bD?gd`9Qcz᭎~bĠ/!0j"grNna(ؔ9I1 X!au'5J3#YsVmuIx+ M`PS231AU?,B$ 0>d>o15&]Kxm _q'x~O ZV( OтT0r)GtQe~KJB>h+^:9397]mo 禞eV}Cwss(XM5p}KU!06\"0K`X*-yxͲzRlT$o'؏2SgiGcв.ڸoI[m'z.>8W&FdxZ'+A~ȏ+gf"ib6ONi)]=9`$ldQbƧψ5ˎr^zQ!Q[rc2py!K^]: m uMܾߎ(gd@GӥG ]Lě0jc +9uzvwtgnEV*"&*㱁QrMYmK` Hq7L\b^*.dDN$7]7$qtS4j+ILy Ϡ &MvN7 h^wAXGK0@`#~f-"(iycvby=oHݟsx\mΣ_nu|qv#0P~y5.Y̌ [|p ,& d,m>ÓAv ?8F-BO<& +қs\]h ~07sdXy@W.kly*kMl 3 iS}yA^Q=}kWW)XkxZ_Cܾ>YrQl0O4] |zB1o=1q;5ǸOc]b TA 8ӃexHR lŚʉ62payhHNa؉"}l X_G"g`4`ԯ뾭ø6n1N:a[_H߬ə$5*gJ0&?OޢCtK[1>5SAQ-=vӬ/Nʳ[W8n;DypF2 <q ђU: rY _fc?Ոrٴ9(cs1v9xQ83t„ut`E8H9?֭hSWms[s,<Эs\s}o}%-[@F7L7/c/ Q:7M3썚NQqD.\U]9dpA7#kI B"ڵ/\E9FQ.ox gq;SXI$[6bej0)F#x~,?gD<,]-[RWN Ө=@ccz{shDXDS]i.:z@ŷp;z/bf ɞk,u`}BΞ5 ,YSӟTi)oQ'#?9J Ƞ[i\jJKKELd93P4p#AŞ ηdx^b"1D٘B -Vڴ%o 22)XԁmcʥUPZS#]z7TK13 k6sR:9##7H(#wc.3R٠c~\1S.SW!b׎9JZiY" yg=Zlkwѹ3T:AUtLo>B *i_y'P+VVZ$*;(Kod$. abXH4zzazP߾Yzge L0̵C/PaT٭ˆ||̓PaV"{@ `u:hA5):}$ r=Gi @Nϲl+B'fq EЙ1Tf[y6C%uh 6 :=gȉD I.v~3;A) PXgAӂŵhkd: T?͠>aޔ4U{dK_= !WE/5fRn7J.?boRQ ˔]ɭ8偠)e,GTm(]Jy@/C؃>A7z|T m@؆Zp@~34&8טؚ9r4[I1,R 7 A()U3'Uveh,QbW`[j"| s8'y ʫ:s|x Yu틫b5`ӏdOC2 Sϰtj @UT`}sq?y^AƥP$]Q p=FM&23M~9Xb^PAILҳ{Wd Fʏ`̀)+ F)=skS독B"1wGAտZz 17xFV\J-B #wg'ݳ yP|VWCrZwY|%ɫA5 )&?ez69&tӲ{ I*ݫV?yֆVM8L%On^jT z_颢0n<f-3W J>[0d.}SWٹŘ4)+^;">gIGݣۭ;EL)y+ǵqRh(>u;z3}sJ)ә zX*VY 2SvrwųBG }{8v֜(KG]VOWt,+/@#5u\yϨU"kp~yZϥ`qYj@K%`PdժYp^;A8x=VL|t⸅qɞũ)hҫCN'9[c軑䆨8iCU S zq oi <`ekxl|Y_z&P@-pt#bHV_~!(䑁%ߝE:ؾ1 ΁ I1]*)9ąSnO@GO1)2aiI+1##q^Ga'1oP-bYHs7B-( /ɦf3^ɥ(=X(BELJb y3zZ[&7P Rc8kty eYhR|;³"C*Mf'HlOl332΃t(Zh(*M\!+t vyہcNjI;t;=f+`{hcID$g>Si w 9RR)oY_ ~18[l@T|k7wiH/}OJ X1# 6ͦ$dmv{?9zw{Ct[ xAvd5\ĴH D; ))Y 䦓fΉ8E %āLEOQDP=BksC."!un[_Ż7}TxHoV g(DtD]P|Z}Dz%)GTh/@}^'P$,iؠF|HޏdvcP.Y쑭d5ya*}0_6A o-u!l[a]KԎLL}t-\- Mo ZqtLjK1?C`<htbDɹ: 3u.c>.o/.'@~|FItƷgX&} l]-,N~bkLKoߙ J&+SFC^%;y6ͱtܲLV 0_/[Il9ǃ/ho=6at (jV=T&?\)A\- z@QFPx"PFƪ5X/'~Kr~Jͮ Bq2Ë|Yrg׶tA3IY5oN+q&ѲYMw Ĕ]p'~vJJG!BuN@e6F23yC5/Vx@tRY st¬ktAbKfYHpm@tKokt5p9`OzYtRZͱnUs`ب Wcڤwy^{ڪn˭n .D/\=CpC}G0>9cD;9QƠ֑O6%*-b,!N|BK k^l/lT+u@# &~<2OƟtqº(u_7 =Ds\]{CJgaJz3z>%<ҲdjQI7Z遳 ΋db2Ok%}kG V 8;VcQC "%WlH_PC/ǓU{͝cL[0J3P l4_4MFrekYjVvJ=GM8#:lJˢ}LX'*vW@SM7IPH}~m.Ҟfsެ04n(g^ 4maFVv6QA8 UWu;i~ǻyRUcT`!LLw$_Qp#-3/߻rqin5U/?jKܾFR!%F, ':f -E>$1DmPGU1V9&QYZ6zS(ő8KiЀԒQ"'y\:޷r:l˱joygsWBx s hρֱc*{ L${vĺ`@3([qsE z=,&Y ;a {SPۧBfv€M)gJWW_!-JKT-T/?13$˯.@ wKq[${țxo,HzHawyS,"Jݶ6~6)6=.Ɂ /kr{v^dP2Et$赡(\kƪ.C*=4Q3BsbOFb6khRWX2,砣an'n k<@Ns͌d ZzMRU0K~;tJ'G?{'HIQ_Y,0'vab6waM)ZYpFCr:0^".9`XpW'I9Y~'gΜf=)TD Q+o/3~J] IWT>@NwI"1ef^-˞ϭߖldNN g{5Sd(\^ x/A@PaH.ZANJSL24<_Gzy?{T@Ȁs̳zv W($IP 9)ϐz\0+ۜsrTY0v.5OU`p(ۯBT!M.݅?_\7=LVώSvڅ]]Xܯ4:xJkZ!Ջ娤r/6kfzIj>QZHl ]+,3w"ډ`JWUr13}ZsjNgpPj~DnA5SӢaYyڌr 6e~%jKp%ړ&Zp)%g5)ohroSm}]Ug$MT>We OZ1H7/= ɽ#QiKB j Fs[з*jq24 IKat>!\]}m6gt;l ߭/[N)Y>~D{+3K=G YVLE#+^7.*:i֓"߸STCХ*P,dnJjzn Ks?/wϓBm^f/l',Aٽ=Q{Uz\vVa+ 2 V8ɥTdZEDc|8 sc}oG=XtMG4Y|/FJ.f"͓.ɸx.~3)FAN">k\t}o7&X񅵻AE5u11ς͍|䨹h1#RZmGW2B-  BHM ;:>;*\2bmQL =fL 関@6v6MW9}Z ")HH44<[ ,!y:C gDn2j|-5qL6zYU 4n7I%620v%("vhlhe._BA$z$JћY-Tnߚ/!m<l aem_]ТU괅#pеY#hn` -*9X#vLEľ;^܇Iy[%g$)GLO 2gNhR Pxշ}uyԮ 3v\E+O,*p5c2bUkBL$"@' Oyۀpi[5GZ{Tk! mۥZdUқZ@u ~k/m[@"Pa~9΃oi(ϥg\_BHL~#W5΁ jf^xβXu [+ϙpuR^-ZP`=#9$ `w4A&i 2Ao7_8 0H;c$DȾr:YxqU1`hCL:i^vzF|/KPb4BL VJkP[)=☿*^gQqx?ͧuU؏pR-ZiۤJ{xT;]\"@Xa7AkXp _腿 HoOYBtuYOyl=J>aa)Thl'h Rkb)XCÒx(k 5%Xw}xB[L.paB$ I]ݨ u!e)J#7 gYkŔ9@`ywo`$`Dw]@Qy"cD$$Db m;Ut i:zCsj8MpW-ߎ@cmxs.S'&ko@$$-0"$0i0k gDҡ:ؿ_mJ%Zc5BR2g!cݰ}PĠz/ I9AVcx{ NK czDdPu NeG4HՆ(XWz̙w$8Wv[⇄ary؂RY=}=ÕpPgRWupNީVl-!:7ON  :ifmeChRbesxG$%@QBxB@&eȿ/P \y?ޯw2PJ3 ҍ*#i*`;5HV=duN|/=ЄgMsԜM9A J?;F$k fLHK7 `MtFiGmPPV3`#HnUNV**۽-C([ T-Xh"{Z E 0C!ߋ),+ Cn#"Xÿ7ʹt@sNE;ݶ֛dzHj ԪB[/.*-Ɓ\ HBN|xzw9am癠Nl! * ayvz~((sǃdѪu_eqbmd0^ljL0rT!e[k c%`#&Y K>>t J1:A5;j(.2{7Ggtg7˃fvqo;եXe]4/-ZX3k4xȞhzi:#+:H+/ @haw0>K~qs :zZ`w6M!)ɑT%ޖO S%}n[ڤޟ>:<Ȫ33+B@G $JU p1VL;sziO}|\@gvPczX'5;oNx' m歊gJ[嶿 8;jꦂH7.ER[^շdY_սcMw';;J@y0QUfUT{ !29IIߘrjL *%e.@Wě|jIAnk6WĞ蘳:Fbl 4DyxnO#F48'r;Hxr‘Bk~(ݓs Ȃy\/Q%`3^lġ3g_Aym,y87?/Շ KJ4(~J)u74[(gWCeK`Ϊz=oʚc7%.cDlgU-Gn&gRrrO],}͏ݘ}®{ ,o{o5Ng^QwP%O뻲&һL=gy^SbB{^b'؆ X޺VΫ*eB偩:I-3-[#ەviu sFuEl` 76"]u̙2ugU[˜T9T6gv#|܇@3~.8zi#nHhz2Wt`Gk,&drͧ!s2i zBm~_T1+ɾt壔G{\peGT_y唢]}^JґO >ʶ$A|U> /0u"@p@;5Hv6,.*5([T3dSj%%@.W7l lyt?RT:ƻͳ2mj|CBo|L'WS&`@#-DŽ{,F /?dZg)e{I5M@S̡_^x;#shӳY3y;#r^;I9féf].Hdg!I8c\߾sǻغCllcQ?5= l[ ;/Cm\&z꺋! Z|l[< Kh8)F*tH;A-_u 7T\/C1cq~*T l{xTF$A'ӊY sPZs?EIZ1m -`3wA[܉KD7X_sծ)pܭFmW^VEsή ejUjhى9|rk1۴y醘i逢3pFEɭi}&P.dba(I+OQJ (Dò `@ WhuWF/ ૲RogEZ&yJk(ܲIܠnRaO Se2 >+^IɲQ)'3#fQ[PGyh(aG{@)*YO|}Csc9 $욺JA*78QA EWzck,I*&0:2i,5{v -6 ǨЯ/J5)+(/UT8a1F)QzXڷ髝 !C7Z:~g/FVޖO#1f hM{2({Ɩ)\ 2\5#gUAe5 ]6S 3\ ?Jb>/5QoCEJL!K`]aB:UZuC<R{5gzx̓*[&J/a"!S>YVFN2Kǜ>\J񊱰y[r w0seIs_Vױ*P;MFu50p@LrCZjg%}[]"o-olz]wiErMJCudb¶Cŭa^JFk0Z@dې.E&Q<5\ƶFTV@e$~gM3"Ne* "[)Ј 3Ժ{{ G#HEY$*f)uwDD 6J԰b.n4oV9%U1)Z, 7 7e[ ihKs)~F[ ;ds*Wo‰ o'zr?#W,hU'4QAuҩA]gУ&sM=ћ(fX[ga1k*L.⯵$wt/O=L3Kuo4rǎxONdtaӇ'\c !KBܘɡ2m% ۈ`Չ&l3h*؝_C)`,iHH Yr+P6keT&]"jtO&+AT'HWչӳe8zi;%c5֮|kc!ӾQ[Le㾳GB>"X,.k-_W rʉbRraLo/Mj\Lmg1gl{*ޚsPp*7S^u$c Kx%Z op9]' ci['a|7ڒyX|ѷ DUsNgaf&⼷&gw@\?l0kfl9':W6hU~\ k~'.^FRH$v0}~x^B0RG,ɡ%Ҩ h6_A?Ǔ?\`Yaw! %TJH7C+U,Ad@ۏ$7M%kŖB[UiT%y"푣EG5 :+dNR$P#ED]aigNI};*ϑ/ն\M7xkr]HkmнZ%WmXymY@wr{D_DA30lpR{e_)3Mr}bEWKwۆkrW#box7ԝN *ślHx4uF_wXB)_%{i@Ӓ^ej8EpmmYG@Vx `{foH(&zHCo f(P T>h!Ӊ(پ$_snn7*pP-3g*D*UD #ȗ7I7Oq^˓(eiXf!W`Fh⑂%]eT|}['9}a C3= }B[Vv>uQ}Ma܊ǎyRI,mBP q -e*{)ChÆɃb:9#*XC[خ:`N3{>[7%lnb:WaJӛPmņ(] Dzz"qN2=^}qhCfqDPv5i}^?e`g< v[Fb] ۗLq `2i!A o.eDW$1 &,XX=NZ^C]Qo {JQyLbm]C N_*~dS?ws n*TRPS*Yto@VΠ O&@`[U!Bccfnmo8`I,\FDxwg(oy$D4Pv@vq]p^u P+_M}T7onL KyM)al}$Rw[b ʤ>U&d] w$sugա< lضk[^V3k-Se_0IYUm#P&e} *P.>7}BW~چ 6Zowgbl-[v42:ZhCפ ˫eV_mQ-% tt,KCsPז:7QvA;^@0Ͱ xtJ?o V{0+kj]MA#$Bk'hrsƛyup Ϯda&#~nީgRMc8I;n8T%E/Wf( q;&[K7\^B!|"+bs؍665:K8q6ڇz:|@:^!2>x 6~J,? vp" +vz1v_mօoWxdň t.3"|bjS `SvD_zsHħc>~dyk { k#-.+\Mr 8HC֐$M[1N|ֶwJ{a(GZh ]~Qh{LZ*ѥsf2md3r^>2~Ւ9!gWM&VS)@{M?6XKT~xK0G.M 'V uIWAo;:dbLY>Zg  J GicW&"f{[րe^[s,? ^P4fR7|Zq/U4cyC,'(m{a%I/j/@BI>$羅Ǝ᳇;8LKhx[g~L1uZw5d)s졙cG)҅["4, C}wv~\R"Y#CX i@яyaaRZ-P`&`pBmTSOca8^A;׶<Gh֪9公Ug?sۇu3# ڙ^zW5Պt_Mi5Ciqq˸IL^XL[APGwx۷LrH=*ggȕ<'k " }6gO1=6p E"(.sչB VtU&R65{w "XYzM d+toڻj[vh 8D} |3PȄVf$d>8(+s!J` $hM䜸3LrYg<'?EwNd/]AZ_CE1T 羰ɛ&r`KAQ@s5D Ļ=qD*h7sF3MYZor}&)LtXB_ }5h:*wҠ#eA c"h\{h&%dDU_y:ԇO/I tIm,d.&!S5P'iַruFsRÂ8c*A<35=)pcg_nqZm&_H _#?{U w#s;eYbcC%NP(Rj8C9@JD yQ*ƥuBаKUo8ꇕ'qZ.5%y{?*F*UWVa$Jdl= Wa6:x&c.wqWVD1kZ҃U0 Yٞ)n/:Kd"ѦF7~ ރPG;6ϊ"Eo97]N"yuZ6l1K:وjB{y77\xfɰ8r%NRĪ^FJK;CՕfv>ݎ=~(N2ɚ]^*:/Xw3 Rq3) SYp"uX 0ѝX$y2kspQE5KFE qdrS3b}ӛ5jHl4,9(|ZಹN=VP.yn^i)Y[t y?  1 m,EmbxPJ"8e>&2*>#?L$&Qp6vUz*-ZyB BWf-O:5?r3s?>١^hRV4{dPHÎY\*uBbH^wj#6w GUτ^F@i|v?*LO[+e#"2U qK6ڠM'6b)5MǾYƗV k`3)BvqihTqp]˔v &LoK0lg%1BhiV鿦$ާx!ܮS/G ta87vǔmk)@c5A/.>kɘm[XMƓ/!Ŧ=d>"tU3PеqGt4'Ud.>ɩm#2b2=uմlHAKWoVI72~[FI^ǟSFW%㶞/&ڰl.")e#X\%Q0h!!\_vi S~Gi H 8osUCX"79 {5Vf+PKFZaGOjf EOur"jpX}LDA빚@&`mW%l"ҳ<{ SSn\g͑NUbUƠW ;E~B=f,(jp?") L!a:Gzx"S 鑍-kdבO :2!;I By{ƯJί ߕnt?_?8T{!G#c-9}QTpuØL;<7MtJAE@a˃ `$& 9A"ڡ,)7hڴ [JF:qO.0&U?#g#C!\"o&G6ſ_0 :jn 5OFT s_dESo{L9O*:E0nZɬGGSZ.큝 Һv4S'WKK㜿0 0qOi:;_2Ja^Sf\<%"aZ7j)dȑUi {bV1(_`vgk|BhzK xW-_~Գ;;=Aumdkͻ4jdm3xGۢ 0iW]?H (ޥ*d-6m17sqBbC`fHt靥%Mn#nP +ɺҋ1 OLKM ?7 hڮo a.(,O{vRZB WLa׳ >si^_$hc}ЩŽp36{vzDȅKc]wLmBL pr752Oһ:GKw8kft2$1Wc/ 8Wǂl9Iv+@8IM "{a#6@h`19ppIk -rJז+fG;?7(5o@?8{ڹ3?b=OE-2 #=5jv*P0r`2rH$mi=Kڇr1atyZ$7nMKq23Aw@1<|ϱ 2cd.#%GeaZ_nʴ)(|O7v/"m#r=70ys#4lEJuav*~; o޴- |:!SSU?X?? CRvjk}ʹh PP !o$bw"t?$o+bC&Lkoqw}=KtӠLmv 0{ wQ /vD~åJe M0=c阱%zщ欶Of 0.c2'vcx8?P7E *sݛQ }@|gB|>"QʦpwM][A7xjf)t&.XƺR$AS4F;~YqE >-?XΗ4 .~qv4:Ågs_V\02=6G+mF^-tKhF!S⧫O1pr-Fn?NAxofw}mm1K3tAn*#]/E[F61L:&1O[m\19HMfT&mPPcboBl6 53̡drO2kЯT,DHoKip?׫8$i $ RjBf6 h#/0ZE9|F۱BZ7MXA)Q,Ĝ?/RX|┭;:0y i~T,i|`} |Ϊ {̷u|L+S3z20 09t;8ZY y@I @mN+)c0x"R9?W03]r1dT[>K WHv*P*&Fl;R.",Jܰ>%?i-tX~ZQېo+`鉘sN6tdgk2m=yU]A>}f_wB883.h*RMWPF \NdSpT[dA=a02Vylh+xo;XT\vA,VzY)CybG<# BQvp xQؖ[->u5zqLIvD# W,ȝibeoc&Xpcգ;Gyn4^9> oX]GK_`{M*됹M?&6a |,reَXp+=}%x ʈu@zZ oM?6]s7xA}cJT.y51.Q9|C㡟/X`%ITQa'v8t!Yqz=a&J.0/q& DN+AG^VFxJ9<,Sl7"ctRV 8Ӥ\ܿ /jM \ѕo.v֫ WQw;IgB;ɂ|v},`U[9Kt ڙhRzzb2c /*>ևTvOKQ銶ea/B,uqbr%Ȉy≚@9R\FifBj$?|h-#xVcm3!%`Bۀ=fZ[1rӽ~]%F0#6C:3%I1A+B}Ǝ ^qA~\?{O{fÚO )9nqmeJďȣ0FTaH\K'omVvb)r,6_(muDqՋb/@clk|,fZxղ߭#oc`Wt@x6%J|pg\`.sO?ޙZbqtI)5:WGNٔ~_{&\7L&qtЌ|?~8Q}{{'2{w eFp⨒I5qG70fo^bA'9J+wUd⛧PY% CZ.H{`rD8uۉX?+f'HDǀMoA+r){9[[M)v S?@>yKsmcޔҙ 4kULWO,U7gyݗԤ?{P,,{ue0YQ--AfoΊ׺MXO_Ct w?qYujLmgé8O.OʢӱY_X>0LGb .D}@8W{X+|7qVoayV>R{ltL'_gVlU}Z^X IYL+s#+A J#Bt`k<d rh85`ovY3‰̘sKYHjo -vŜ-q#"#=l" qd2N_[Do#ԏC=C6'RFJ)3cQwAQݣL(,ajgVH;wUr(]Szi 9U[`"e1\4E"2In$WJc, 4h {8~w8՞ >!7W p`pm<Ya0tcQg/մk?I~O2?a(dY)s (9,|zXvq1:z7+СWwWu@ DoN)qzŸ́#nҥ܈6nQX*#mY)wdFJ緓#[҉LCMrgY0Xs+DL`2r\ĺQZu>(㗎j|v.wca5g}z$A^G@F_zGE˻I:LJZ!aQΒئFζw\w@r:x}gd_Fv tZ8s`#EruPHLN?'7.V\"ͅ4/e&ZTBQ?g'gb+guƥ5(XdpZhЃ2-p ?JƭPq'I|*Wfe(-YlZy8Z\%N dpr`}$#(9~֋DX_N_?+5`Yeawa3@Ü4t-HB$Oa (s7Kvj(Ij70jvfrws`[Ty6Mrtl! qvsF szS8'`󀠸=b1>i&|0/NJ .  {' ̙^P۔ dF ߬YcL)W,A=[ffz#H?JY&~ 'ИLHǁL)ٙ &*x"\yhs6O<,yG1r^KbS|CEHip[ Hep`VZrGH3IEfV9-Cd/ 5]bewYe %n<މ9N)PH=U(BF>l*|dw*^Nw 8kKA! RM!z=Pvub w,p0"| (!WT(P[u| tc1iyțtؚ~ -즡!3RxRi'ҏVE!Лվ"~oGzDd4:B=) #6bm$,N a5ܦ =-ڙFd'|$_( ,Gt2.T~ ba&޶wa?\F亨FyDWQضsJ"P]y%9V4^iМ@]!돯:w.SǤ\vnQ2K~S"߬Tatp":΢k$v(-̲ V>Dt֮Q״z,iu^L6V6;sߦo| (r)_uh؏H禱|ЅyYJ_ /1YZx\l(,S-܂ɰomB<Aa5ع4YiЈJ~ҳ <#4|p+֛(g & yXA(SF`YۏYĚ@:wM_ b J9.2x <{O]E b2sw2Nmj>׋'ᑖ(܌C}&\*d#5_Cʫs!5^4{khA?tAזښOm{VZ;Xlq۞`VY*zy_`kÑpϣ䯴s)9*m:)K끻)I齐պ,e\"΂sQCDp:p1Qp |`VBJ)*VǯHMy%Cujc9Z!E؁ cedXP蹵w^o(/்yyvF1^Uo;l8!q5RT~?U0?p/Ď5"Ե@ͳllw5S7Znl/ Ups 8reymKs'.¼ߪ?IN痽ۇR5kuG.vVfGvVNFp;澑ã>LF3]\*^IMeP uV`: >gb2ClES%2i XWg ={B4ܘ㣗f{b ҜCx b%PqFR5{Q$qZ *mJ b=!(mjw*Q;T*σk8`QwhEq'ɴʗeؒ-o&iqٹ0~m!aDV|h7a'Jd[V+VDv=؅]>S~BB0X̲u'P'eɦ*qUO/mwE*;niYN+qOc_ml@k`އgD ubnf )ʣۮ)x=1SI2ϸ*q6xci;wTnyHmb</6Q>Z%+XbZXv<SeZ\2,uMuQNZ"lL6G+r&R-AfCvnƬ  BϗJ91H" p0ǩ0ՍQwUқ!п>ꎜ6 k@h{߾kK4F>lIlrTgdb׶'k^gs7[+qgBACѴGORN"駸%(Wڐg *>"ſKp;gF;:kC,+l HMD57h?nQb$!q!.45c[M y3}c!RcϚ䥥MoAuBBaq Xm YFOi2}07U/,! } 7f6$bj\x&!dlϊ[GwTaYUe᥀6׈x+aQ!)Ww;K<о Vqmg(CvPׄ8l?h*˂,}k_TvZjP29Ƃ=ڵVZ֧ulĀ#\8FyA>k>rU&AV9O1u+Kj{ϒ/ })O^ rk.-[KT,QT-B=WE$S NC`iܯ+c7^Qr@* J|vºS- MD8$bDk4T7 鲥4~჈[Q쬦8Y*I-d[;{AV@t5)KGmXM0JU(O)r:II&ܚ0DzDžִ.yveD[Ll4@J nN2Hڞ#Φ*TX g)(}1Fff<ڠwT7-q=g @3b0!iz=d'G|%3AqOE4(k Mk[͏vù}Wiv)xX}Rl٦?(~=ԯם8z smSEI昰,qJwxOqEm+$HX GGƛ=Vbf>sPUdA#i&Lf@D,(;"VR1O ~\64Z̿,Sm뀡Abnɻ3l@o$T} < \g&1K(se`&2=M/Y?dՌX AN5cJ{öSQyFI&WTE6"IM@}> :B vWvl0.&nT;^SLfޘv=:"? ɦ,v)0}dLRԁ3Sw(0^Yo{W8e+A%v[ Ur5HRƜ͂mSDbX L FMH*P"5/XT$12l.Bҫ\mEs@¸X&(MN1ۧȦNs}XB{':aOnF?Ӥ &[s `Ć!z!XzlnX7  ^N095!mr3ռڇ[s接@8fk ,ZHf43}vH}5s+aGŋJP«\؁*IEG2 }EC )6۬50tnwGF8v?4N,ah rj84ɩrJEK}Gej4ձYs^[WtPkVׁ{F2V9rM w : Fo,ލ I<Rʹ_w7AjGYn Kx>Q[|f[ƻsnZ~c_mʄl'P9sZj|Ek:!x-EB؆ 1Th\9+>`*heo$ H°])̓dIU}Vz.HR>K̴ W3a- DUHIcy"26ۓ@ۤBnfDh"Ұm ״p'ABpBC6%x}ge';qvt7]IMu^N}֖D!Bd,h́fE7xvC[V$F*I"9EqXx<ih# r` t0ώg_GXA\gqD}ɄoB(2/йr44:.wtf׿2DV~|Q: H~)_oq2~C_VnR39q m19){p!ZW ŵ" nx BcuکlC@uא~Nҗ`lN fhx+sbp N'+3mtc#P'F{wnKS35SyVՔGi"oIؑR1Qg {ch5@werV%Fmc#anȘ1bp 4rPJFN+jk#o,C`{Rm"3v!ĕةȘ*7%E~UNF~xr[I@3 ߲jc5}jʒxHy˗S LU'"3?I#2Bσ;f:6΋"q^\JrcXi|e]4ޕܔ!=t)]4z+|<5([JִH4]!{AiVC*R(!Ӌk: #: [,6 i c冐!v'y:c0WZfMk/POLp,M%9J6}VIi:V=I=/z&قt%RS"Q'Yz•m+RT9Br y?_Roch'\ -LldhVRmTM|i&IqRK;o*`ImR4m H=GUu㽰)!]WX @ m\UWhQM bESH 9<` ծ!O!9ӏ-m M%;MݖZDIјQ:YnCCĖmv.oV>u x3.~9~eY-VR+z4wf7Wi!^6'1fi]"߫{Mpaʛug[~Aڏj9K@$BUlHHG=v}*V!(鵦IJWY L/2؉,RC4Ï;x%6\@r${[ tc/.gGՅ`ވĽW" _5m!_3">-_hQ ^HU~ ,?Ds:`YS3wp `w38MY1-0q~5u;gw_wZ&\p~ƵN 17$c˰' ])7Cv`|zFâƔgqG X^-Du# IhSnC~[wn^u(P8RbfP\Sd/Σ^K]N8AA<!T?p7k?s`%.L72a|W#uPuc40sg}3'VfRl'&jqu)f" BìfcM@vV>qDeLԆҩn_jX\ I 0$q}A^Ln/f/9Ҫ?ZW ;`쁔~:Wٹ~ՈTNxfvԆil&>/4>LȎD03c)j:b}8o Vl܍אOFW(,[{egğ,BQ%&j]PN >ލy6}0z#39L9W^ZOof=Mw]wVX03_J:dlWڡ`]Z0IHp?b/m%EH+_fZ-Rth?!fwNzP76լ_M]} jC;:1$f4Alb>^tKk}JW uq#ޮ s~"3MJȕR/n13kJnK{9Fi.#fGh6N/4 (͉q2:l6iHrIS q 7bJ!3EJcbUkqb9/=U`w R})"ڹ0 T= 9I#ckh-j%~fH1|ZWWՔbg˄ɼ Mq+a8K\z783{ +VtD@溒b}) }VMU!e;%vs w|Uk>PJF"6/XIq A+m)vs;J$4|g&yE%)Aߘ\(Mj.FZqO}+%5ZXa< L8P $M9x<({$\9{^o-JBPV]hCݨ NV\/00u=*Dńj*W(&x^ TҥboFnDy ӰjQ<lhtղr,N^?W.{.n.uRmMyȃvt8ȞD-/Y-+*'ֽc Ը.ͱ.Erfsu\>Y•ltfN(ty@ܬϑjkm }bKh{-ed=͑DB}QƩP_Â2*<a*PѪ̹v1Yb$Z[22ogoJ}W:8@\wy4ۑT/oaG ̛[{D~]iZ-ZkbnR:E_Nj;_b.5.LtUU>H\ΧSnĶezFv)V&>7+%rٟ,%ۓ-Ik dȊ׃Y)3yiiEbT^x(2v+^^XN)+,RZ}7@9z4Az'|:h0vcK՛" B1nCW!!sK67IZV/].}̥,ɃDw%`b ڜ^_XNE=bЖeBwшBip/>O2k&(9V-_|Wo1F֍+g=Q i9d]O8bM6WPCZq ( MI]pq^`U>ЯxFQ*J8펳97>5K߱JZՅ,i%np! uZt#AY#n N1Q'Qk+`'5MI$`Jր1νmqPBl5~kR'r?g\o7FJᵎ|ҋ OF0ߨ%&QEJ @G,!J)-._bQD DH p<;m}0ffƂ29nLvE'rg<=7eݗ8^HT: N疚鑝x-c?"vtJ). (3 T_9iwM%t"Kyjz~pi3{x%(k,$|o]8T"K_]pV3{d4>2P)p*z^8,e<$铵IzF:ٖB0EKnJaِJ,w'}KEyܟ8-S*_9<55GUP޺ z|)~?=)>舴m|Mxݙ`mj<D#6%^a,#a)M}׽zZ:T >Eןtva,e[i '+iI(ڵ~҂sh^}l3(nK`ރmv:e6c!/$_K"*_N7q^L`(iIMh@Q9rIC@.7ɵ[OSrn O*i7:4,mo3Sgh|iE}k2l*k,„CoӁ(Sոgrw٪ ΅C𛊥 !2\K`yXd}BRȁ Q%r.Usb>Ncs $$:0(V0ch +vyBҮd2l2ǤA?{i':sas (*7Cd~)qXJ ]8V]nF7ߠ"`}J'^kԚ}; IX2K1CbVk$S2Znx|VWHZ?hZ2Mp~%&Xt P6K[`yeduyޫj%6`wa]pG Ɋ,`xpoeq[=B7d~^l-7`@$Q9X cJ"58^+>CWebLJth31\*&y2r$mt0T$JO y96v Cpubg[$Z&:{p;F()K1O9O v9i&> ̝;eΘM#։:ޫS-~'г;j)Ǧ1 }/h7j61UBʲscLtq6zW{' G>ܨn=p.jե묝ڶX P_Į#Iަа+Ǯ$WvL +e~1X0[[<.J(BC Αfs~w#guQ#ZAt#6/X\Ŝ̿A.2 Bxmp$' n@>z֎*$Ap#aR dj;:#DZaC$M>SK@7"'4gy\OJl84nU.#F{xP?]H]8+ 1樛x =.Q9 nqp]\XKK\!uSHN`x2G\evX C&i _c $ZYWM.`:g#c hwAQtZ5 (%ج@9FyoJ"l*?J ,QGGU)ž"41%4 FvܝiDŒ_JJbZPbEV`Wyvo*p.XO9I $,DhY3tMQS 偼eR&@ѧ |ZXņ|vN\Ç3ϙ' I؂%g'1¸XA>{A  &|~MwVvRەיT fNA>ó~ M{~Z/V+]c.Mg"k1gMۍ˺mG Jpխ%*]!Tj 0˴Ik5y;HЋz!Wc*3Ht{Bvr%j.PF)kɴI {os/ :Jt왆c'^vrso :/ ܷz[Ϋ<BJʥ3z䷼8}y*Τ\b cWFaقH\178C8gF 45eZϡ/zg/ǩr=w)E+@|,2~j G1 o$Qk^Ml9L`\t%LH@IJ1X SM$Er$+ٞGSuFycɷ{R FK n?}!d4- Y?Zol?z{_#OQҸ{749arĢ~qkߧ4`f0wQ>'69Kd**#d1*NMՍ\4I:_:,/j&e .xZIQp~Yo M`X3fiuf`{ҬײQhF6ݹ ;2y'$p=%Qϟ>eƍXs;(f?Gm1 6)ڝ㝆l5Fk׵yq" EO[[-n+xq2gTFwռ9c/;=k p" xVG EWf7w('0K#c$iJ N{ ҟ3\ ̞r#L:d\r6e/SS++6:(O&F&wj=jJxJH*w> 7Ebs0 !M,<>E>g۸וG\{nA7 =!㉟zkpFU#v/G*F.Yd leW0SO3y\I!Zl-)4i'rJ cTl0<@vb+q=<ۑ\@'% @ṫ6[ LMy5'^^=FF],}[I59_߲j_ĖlԞ, y6蟠v+ ĨViF05 $Yr/T 2A/wLQzDWX=mҽd  MG ,rVVző rP G8S'GDH^${ h3<\EB☶(&(tlmu|ɧ)z1.''iL& qմTE>lEj<'FA_g^Y .r\iv>F]7eЮ\V |\Tqmp B} ybXFf>rke }V%d}{'{.3[㾋/xO{](6pNugV$(65W7 %YDAO X:(MPJiҜ7י`:*n m^@X/f/ELS$ȍ4jϰ ]c3>T{'w^qh(qq ?" ck4;"&HB=8\P1#>NŽ,"VCiKR%FQZ#5lUЧh!p_za FlC*p+KI {9&nb¾%?A^'*Qv!Y; aW< =9Y_-G/s X{!4mZ *^ODRYNJg@l6ˑgUE"~ڀ4oKyP% / `IO6mQ)69o#8J3 Q/ H.&&;_߰Ep`ZBwI:1ٯ|ӢǀCh:[DHU*<<48D y! >^oD "7qGU/AOZX5(ѡ$}A".{쌢=o#MbKщ€ !ˇ$kL4k, tD_X;e3̨݁t3'W/Sq^5>*BUQ@644}/|x8( 16xAHDͥ\$j_hv5&p3dG.9꬝Q8LjZc!R_aX;7O ! ʃ=%آ?(1-o-D\1I[v"ؼAβə2$Jq7 odt#FB[]g؎Yh;=N!_Lu8H%?qQ_Vea+x4c[&m2Oe*r9ڲ*sE]E?klF "Wi)7 >43]_ƏuMcf|(}%Eom|ZI$jF6q1 :Q+TMǧQ.hVde5wʂgtѫ\—*<'v1h/}%Evo+ӀVC-|^l5~ !ل Dvߝ0TZ#J};yG3~_(&T]{YO|ɤ<0bbZ;hL5%.}t_Fy?xsc9,ׅwf032L`t3`=Sn¯fj['6l (4(.y+~I]Q10j=kS+m 3Sa,e_:2`HOn"G24XD .!d(*~1pNOq,-ZMß@6V4Aܤ -MZj GTcR\[մ9` 3M4rF!T?}fC^ &'yIs#(ҡp*Ox2 H[Xj"9 M&,,+` :2& +pp8N lxe_YM  ;M2gX]n >y+]UDڴA h-eXy4yɴO^/|z&!:q t$k>LQWQLE"FOv3%A=A ɱrG8+u48ݻ!F6KLMyj[;c?^PkMo5VMQPֵL=?ՓS3b)RdF(KQ(&lπZU@aƢ{Ò| 4з1#4d_|]z9>۲/=;6lL8^vTȺPYDq -B1\5hf.NI:CVnD dWs=n d:T^J2LN%v"q <*LDr$BdGrizˢ0FWA°QSE]22 x]ftEM=JPL]iQҖf / Ñ+cVy:`~@pq_ҮTlڭ`=ݜu#P PIN=>6y ef!hI/8hMQ"f8/%U!V Ga6ю$Ofu( Or^PD(7*<`_2F=|d*?];5#h;J޸ɭ[Der9/'$V](/ .!wCʆrF(Ƕqil{K,>hVք́= =L\\[yoBL^Iba.1!(*FAW]*Ur6@j #u{j"o-T-Ș~*Y474_nPRz(T. 4SwL[uu:G9Ow2šĤowYc J3kWIm4"RB^X*#lJI}UKRm~Q%OE}Ō8$FN E%s6*N8A_c3W%k! %_)"PTa'YKGz]"2^6Z^D/@oԛbV!C/cCѐғaML |[\l7m8PB֯8XiSWp\A K@ ~ #}^l4ɅjFw@5tߔ; 2ܑ},ӱd-nb nI' j-9| hc-GZ8v%ˡm3\/8"Y%GZ8l_/7z%a=0*=p2*uxnܽ?/ PY@MFv$j`ү j}xٝȒKTowz.jr7OGP+U*'(wa2|va; yi Hv90Fˀh;zf$t%fbNU=Lk3eδK 1'C=͈("/aMfnZϭ6pSv*lr1,ơY7(GwtIەD]PbCTJEr y: ,s]upÝUM v,ax<{7l+|af ܋M6Xxby|h|_jnicuL3!.l۳ApF+-|xYn#y S0>QsbPDTg)o+61M} BFqTx<`gGnT롎ͿŘ{<(AzQZ8{rQ#m#Im;K7E7B@nm7kmcmOH}'8O 5,enK]Zn&/n.šщ{"#RՕ?e]gQDvp2ہ/GY?aX&\,14"=~;n $KLq,Sʾ $^$07#]F8Mn |WKDc^ 78-QI @#ɥ>.+rAT"5CfHҒ!0}q#n/B0d5x+~ Sugح ]S@m-ꗅ5asC(pI{oFA/LQ1g. #uOI5KNlBɱz5F\J,X &=t=,>Ν~wbrgJ7H$*:[S6I'_?Sݣ;u T s#p=4NZ9^U%2P~`_JzxN&d2s$ #@ey-"oB~!%!?^&#lNׁa/0I. *2LѢO3z· D5HAIK`v"{O6h>6(B1\o BٞW\27TC*|BPȪh({) %8^'-|h&cfz*<SuPKרz̹j>ϟy|e%=h`[T| ⿈~)3GV[O|n!I,j1oƯ(L 4,q&Kap5VHՖ P})J^QXc>ymS+P#k NT4t}.cGRT BV<]- ^AN% H{!!yf9coÆql ;1CN{:TF4ki8QFg>JNDENBD9PWn2.,!Ou E^MRj}q<ĤV_m#n,^Sw-ASMiKa2e̦`}F)"v@q?t>  Eoq&<~D YZ Y9Ou܀ϔՌBSMy6}?^WД],/%[5 \Zf*d [`ueivQl{/0]!$CI=c1 ,{wjU"'q؇Wv>ZAQj'{Y%64ðσ<X7].nC^Rru%JEa]nYي<**s RԙtxCk/Ik(=iAu 5+>M1wApͰ'Ƚm15Y NdPD3Q߉[Y9+}yi͂ ṫdaȓW({|ѿi^`XȥŹVY} %v2O90,󇗼RL*"G$ыgkkk{%dwrnVlxj 8gI[xbQ# }Ev΢;D"|)+)6S}~3MYpP9il(T֩/sxBҤu=>d'R;XqX<eQoIy/4U9$T:tT!X*u%_3(9QZ8(uxmqPTX`/ Ieu&nxR5,N Q51LyJA~߄!%) ^ ?x7^O b[7ּKJZ#t!$[sI4"rvn^jvavJ&/E+sM }%MdʼnMFY, _³ސPJ5yIl ]+IN<}FG.g<`@^$Hq[w%A~OH3$xbƐyϏ 8Yb~n4H5ڏ J]Q"~, R3i7_'bM DɡF"ctӬOƩz}yL6MkO w)*79!Ǽ9xWxNID: ^{tA}ݥ\rcHXuS/C[u۶+F(rRwKY(l-*' n|+Hoq0m<ۧz D_Us=jT Fa7cH4+i/""W#:ޢ`G> $Gr{Տ*p Qw!lv[xo_e܆?-lS߾\6 ?'JF\U˨1%?{55KEt.(.s_wgvמ3AMjB]kٙL[TAD>Я |PLSVE0 W;ouQWx'+5$ӡi$[*@oRW E*_TSw]:w#߿i#_f_8rsYfAVZw Yo4K+Eo..)[ U:s%.ʙ4 qwD4+֪e<1 bm` íve*H *%e{KxvRrZy ~#tQD H9YV=>g k<A]XI;"֋uLU1ykxbpx>~pBp_`5Z@R)-ԞfR->s8Z#už@`/ 8TQ\yYt9*+v-_@t5[THQ@ >Ss KZ4'<ij9$y!63ǣPik)#{ 2Ԇq H\}J|sotR_xhrK1tGE .GCu^-P4 2Bkm-a\=Tv@L{~L6Ug@OAAq d[>mB! i7")VbWG^Fgk.W8n%Rw|KfW Ɯq.0@FX i_ؽ*eaS` &~#=+=(eMHQ݀ ձ0 0"p9~v&e=)_|5W޼ZDtLԳ<!RF!*+}J~Qo&VP'v j%TvwbTQ)=1@drt[ O9?liۚcR s9a%涊$rbxZ #iJ"QY;u nLRď)Yh}"5|.s%\V3Aod7ymE ~ղ{8e'WoᘃQn2;{M !EYK@&4u}f0N e-0vBg9oԄ7ӭŐi+c UPrZzJ];u_ӷ`p}Cь[P`QB.fljʁr旋,{QAb&[%9Ÿfȁw ,L2^6ϺsˠJeqL~R KH(dq/d?ݱȣCmA>f7]Ly701ixm>{o!K3tȅ& ۤ SmF&3w 9VG6A$aح=JSȞo&ksFiU6_`OB*oqu#ןwB0TkQWL }%)UN).KqZGHzK uqKB\gVs2i{FQIZL7c:gh좒 lI+0b2_HڢV(ԤIm zG0p{!MM8(||q]MdƑEQtّ=^0*hۥ_)Shy}*4j`FExQr}(Ee/*nybLG*; 혩d;Ї,;^(go@ǘ?U8L3H5Ϭk'ӲۿWyҲ\ab>/r*%Jhmlv!c/E'$cmo)URRyxp J/am{|nٽ6zf5Oty .|B́|iZµ#|vB]q-s0D ~2`cL@~h]ǛxsP"ChjpG F,%(Tie6廌Rj^O݁yj'20(?3 M&&6THunHQ6k4xߎuHE;"ӴZHZt9,ohńŨ͌?'S.m>q G L +Qb Q<-=R$@\ǚ)\!-"6rr,ʸgP7G8LVu3{2|o 汫Ɖ=:qJɀ[iCL)|!^;|?$/O]2G? ?ӹ /ћ/<)ٚm,㣽ͧ{9,NTG-ORfŔH4Z:xڨq@ :$@WjuK*skJ i`Za 7d0cC-9S@Ճo&B]8ɴؿ-Yڎx߉n:Ib$6;:kFk+NlCdE6j[蛕"Sr,v4V&\UQdž:7 s]~ /85[80*=L,@+K,' +6^O1Um ɳ=nڳذ;O[b!B0~4{6!S~Yr gLTKq&n5q%윚%.""/̣(q'rLU\MG44T_F6HO$ze;Fj/Dcvӱ`bsŀI9x8J8}>C/pmC4~D'M T ‡SJhq ӿc;(R-j%f'+FsH0n-1-Xq0Ac9&-Fzx]fa4 갿 r3x ^8iF|9wiyF&n?ZkmBʰ3 0z{4su@9DtPe6:fKuT]]k+kpe{.#ܚn(jVcNx'd oJo5q9OA#= ë=Q=vek\$kU᳞nz[aCܜזqG 6?[LJ{ ")0Sy>9@ZN{gJ=)_<l4/%hsSHkh`"Zt-c9R6ZG*?|.dњY==l}_RC5am(h^9dMr+_Z}Tҳ޾"Sqee^FN+o"7ߛ>U%[ JftQ k~cQ6RSoF'Ct}| 'ف LE=$ 1SҽA- ϰRzAgsdALI\OYvrW隸z ʇ5.[S#!xh#UTWƬ0f{Aԩ>}殤ܐjgJm֪.Sqc8Ի4Hun=Qkӭ ۬5N=+6HVp%ܟ@ȣ_ލ}RۀۑˎUréXP8;wHdhuMвi*:5B^#۲XK$7+ocJŠ6,-h#V(120Gꄡjw%$/^"X=9PU?vjH@"LV ˗~b4VDwRqVk@Lu!, VAe&SE(Kۣko=-[H$(4*X֜K5>LLiQWK9;HVðt |e4ڋR|L(wia>if7p>P.%,/OQ|.ӼcCi [%tDR{m8P"`NuQ/w}] LϦulڙRX #ۆ!%rvˍ:>/3qx( F6YF 'rFdO->L‘y'y25jG/R1wEw6;/^I5 DN~› M,H t8ab s5]EMdͯCm,}NvL Kh2>?fB}R>^3$}%RO? Oo#*z[:+#mM .f?弖`@Wr7,4 :x|6fs 1qc3Wl<+YrDž &B^JL-^qf/6NQ럗< J}ۻ1w~2GѾ\}2Y7tB~X}V Ax): EtFYB ڂrP`,ڭrAn_2mcn,W}v E?gwkL4!`A XXVU!ZN-k9#ɰ1~LW%U jJWU!5^]"@NIeAa%%Q8$bOѲgy<>ܦ r,Ʊ G'dLZ?j|WDX?-<ȨQ[#-()NdGZL|ۿBZv1'ӎG\m3eԳ]|C>٭ ך]RƼM]+%}@$scM~R(qU4f!|0}#5Q\1%~kv!x\:*\*ڢ5iJJ &0&:ь{ݻZ3'I@Yrgթ.f t ^$ǣ3B;DB4=1G=ʾŨ.: ޱ@ ު"pxNK+$CU@fir\@dRFakƣ Ab^$f Y !uGre7sGA"fIC`sxqkq#A,O$fvf.|PֿP`\}78 m<.yQP,9UT7WZP?ol1d[pXwiZ&*vj׷ 7Tpz(-qK,?<aiGv Z\_@{!Cwm6lM/d%CŘEh4+`t,4lxBZGQ|`0 "B}/ךSfpnIɰ- Iu&s Z S?TN?D{I+g|?vzT+j61/ݸI x& >G.]j`ǻLMofAW[{Mi))`^ԯd (97|^aԶ'jro{t4+FmĜG@jUuqG _[e^cf*|MYmen׿&Q3'52+P {!xtes1o^-!;'VHHsq=gmhʷv,TTtPJh?EU_'`|9G DQq i=%v'#=Gе̡ћ2GҀ%?ϏdrY8̽y w^LF܃n;@ ʤS6H.T;̺Y-I -G4a]N.H4 uEk'IB X\qkJmpHu{\ETAQMw"oAvzQ"]B;=ԕn6h;*941CHV7#3e\ytQJw`iNsͭCAyƄrܰ (ّW/EhEʉ*%y28c\h=&AXa|P\ Wl~ۖVf< t aNlQf'd}7ъ¨errl[G}CCWD'V!0!^ ›I5 |k5L׾30 ` ^C37ԨPwWoaB,dwuoDZ ɜj_0Gi#ɩ%v5bv{2UCYrjpī,Ԟhdfӛs{I%L?,_(r4:` Ux ~GX:\c`V@M2.Y H)_MwbAyoN]OOtn^I>7t;^3!ID+𼚊Q y60b tNdH&}^7y_"F^Y|l|~3+L{'n 7I=&N$+;Bl{ǯś/f G<2 *|3n `t&tQsI|$`E$1?9(t/*8ݪ)sZK̹umļu1v(ZMӛa|%K5 U䈂o#+ P]yV3)iSNr'}%f=n L3l?ƗXHHC4I*CϱW8tզVH.3PdmeМ a EkD}m.AsB5mm眸 ~B p$94Mm#4ʪ&,\G6)}u%0= XL/ 33vI-tS<3Q,{EK$ @oÿ"EAۗ*T&I )(N q:ƴH7 MԫdC6X% n ʡb>ݘ15H5ِ6#֊/`B<4=Ji;lM^a') m7[-L5^MNX]mO[7ϡz0g'E >^J}R<Јn~Ǐ4&ƐjFϕ%iaϠX4EOrwGDw"rOP^V{.`5f".fOqSx1À9 +]9[˱nҤN@t]D)Zp+1?;32&y?K TdHPtQ۪熈"v|ʖhɜӮ:RGcjǡ%L ;pҭ BTRu n8xu.vm˿ŀ˺!>67!<f*&O95{ "h |m(J_`H&8"~E0ԡ%A!uPF*;w{aK' &zG lP8`E?ZFE$ Ѓ{T!ŀ+*Xt)]{9qlVf_3s׏H}{5AosEp sqNI#'aʝ; i9yջ -Ue9"2;Npi)( ug^oB`qRa5}Ny,cQH~"{m$SAb0i-%MIrSȨFT=e!P-? IO3oX7dґZfk,i՚h-]4x0 ~}tM+[R n#W0p@q2e`Pjs12{ c$bAB? h[X+~33[dDOn%[~Gzp|rz-{JC"ân)vLJ;`2xDw$.cƿgJDİ+ҮwpJF͐|1w-tN {~bXIGjj+S.TS1)TJvH6 gL1Whka h+.KSk.Hr-: ڵT^?+BNo/%2kTYIϽe Ȃ%# N~ݸ7[eVtEDPI@id`V1000}+Mr!Jwu,lJn?pB^ UdH䬗# |wr#/fanMY؝w]5(h3tQ&(vh" fGU3 gf8KMu-KO x Rܚ%7yK71-[b\\Sd<4 t1&JdxvXx{|~~;#R!xO^0䳍lOfu\un$-K:y\{71:[iM+{x:x;:'-=2^t.vhӮ<hb`hI+y렛yҰkaN<2}8U["se1@n] cbVl޲!%J ҁY7Ĭwt)#0䚰& "1Ӭ9^koݩ -N5,uGct--qiHl?Kc7F5y V;MsLgCa/ȵ0RL"C/;p| ڳ{{cngNZV u -D`жH8ܑ?IsI]j7%7G@*mq 4bϽ?Wl#/pY2 dNz^yf,jӛ)CjfL(&gLہqǴIE׶8OeE=.aB_ $ØF-`j&Љ|SSW@ K}QVY*Ιi`Xs3Ω3+^~^UehYڵŸAikeno`;o.LǠMavDEa; '2~(I+>@Ȭ1(w34a`GrƙS̓x%{r*#d0?|rmFfM6kO1QY7bD jp&6RY9{ TEdrCP Yٗ]k>@ՕOGمrio 4Ⱥد͈/Ơ𙖛g[Cw>3"^'VjGVҴ&*W ՠ]o9L]LS9gб V)4 jinHF]lSS˘{07y:.=d8wNiJ"fT# " /1AHFw^H6ԍ7lV_h-?p]I*v߻=֢d4Y)559ZmǺ!ZFwiZUpG0N+!A/O--GxN ٸ K+0raH~2Zi1|yi N-G Y^UQAerӒQY$Cw 4~e%RV!ي$ 'k_ ۚ+pЎQG{dW(gՍef ƒ9ZjoBͅB'MD傪\rp=Z N5Xׁ^|mt޿qTKLqh8W4/z俹b.X49z(Z! y![| ;.-*ӶzD2}[-bi.0&TŢvL(r|WZ-'~#B溬#"SfiTAZN]`U䉇g܍by^<39&SP֧QLIT;i%UܟnyRV)xaV}D&K}V=k\ʰ^fXV1gx[ FQҝE5ه=9AXFv {-d7:4paۢt `IHk\|qX¬ǡD Xw+| Px B (kƄz={Uw< H;`O21/0Eq/x 9 *2ݏ[y'CΒF/~5#+  Y7n,4Q~6KBYegVJyj!D\^t +hnpD#|:!BHPnVr@<Ӝ*ɑZܗS/˻د4lq)>bC[>~&7-7Tdk ;R/TfPz\8W.Eaj@Nmpa$Y 8 NM0p8uS3s{&ٙ]İhvrKk~jZ.\#՝FD*7ל ķx::4woüP_~{t|-e (F+F$4_jFr@r[iNgT7qE\dL'ZQH)iɓ hXkZ_x(e[Ch R,>Uj&:"J Y g0כ|炉U\X. 'wvV)T-e փ<ΛD!1)G}',OS u< Iֵ4x-!MѹX_)Ol79X|wB&9سYaeSX0utXnSh֒Zƈ _uRT[ v hN~.4Kh7}}/36m? omB]i߼rl}-|S/Mg>)ؿ7ox F%hXg;BZ2zn z%sqPe2N#RnծXJ}}cv>b@r j}HSyj4 y?\(QE,Ʋ(Y dPkQD1Sp#j8lUxKßݩ|wU(< yo+=HwysIxDNS} hKOټ7Z)Foda/a-l|v\0I@#A%pGs4Gm"aaM'f}skN7Rf /Úl>ѳNʟT[7tC]_Ӹԯx#?7 WVӟ_ZW1UABK8]tǐ,VlI.vɯ©J@@LǬ,  !>yXTfvGI'7 NƧ jtN{GZ=*wX!bfձ8`__J J,VEnMn:?sHkA+Y;^l%$dhY yhrH7#=M/la8ʘʒ?BĎ=fcv n ]鬔@"phOa7lC{#ȴˁs efO:[NK V7jFet(Ev-FȅL(B -yE78r¿C?bl<-a ˆohph 4jHocU_NKAv-j_w!%S2 !c_x7$ ``Y}WC>2bش.m@;iц|sJctvNe.Et CRG:&t=v(`cmWq=FQFGۤ|];Te#l?Uz;+F>SnM(aFU&RLuCi)TOv3a?Xͧ7B!blj̹4Z:5+eH5BI̗F0ߜYIB TRA{t޿b9=jF/6)_F&51%a4ŜB8|(>zv%IdLW6>Xq71hpqsa~;!gVWeъX3$$E}^JS%woᙑE`?nB6+*Ԕgq\l~=ЂʝRets)?a /Cb0q[)4y:QBw= ~݈^ݛAX.DxbvMO#*!MRԪӦ!${f$i?f$Yѳ"Lo%,2F쫲\O `4,u|{\O]M)}( U\~5-iN+?:s}7aUJZ=+`-*O/VT7#OFYi.E2+Tu=m(%ehbDu OWfP1)?Q,>^o߂27F3e&yh4 j#FH..QXazJcR4w5FPqluvz(M+oPYm4>C3M:A/X`_UI:ݲc1FM*ŽkB;_a4f`Ob4!Jp' yf苚j}M'3?xHZ՛A3`4 /֐5l\),HQ+34l?BW*0[("EuU^;jXn.!uv%24RX81oMGBP7a/Kb`YήK{Ѐ"$J뷱 )ͥ ,Ƅz 1G+}JS|K]Sj{.wLc"eu` #;2ɢTF/\]DX}P<\ 0W>^ 4( QdVa@=^aTb2"g\[QiI'YBL_Z^Pm!#u?-J5DobK]2ބ!9׿phд QSV3JrR\O(Dœs!u &&bhM1y\.m3|C4fp2O~v e6Dͺa"&DVdp$}!xpk "xR~DpM͛ EV?&Ot@T</˶#!^:t")?PZ|u~ 'c`v?r(hjQw-aeJ( 'x n|xd1,P.ׄv<|P"2#HYTab7-awWk!3?`A]cWcߋ}gpm/нIbdAgA*JC7bb%ښ9%TS%0%=#Z\Ň]A)#~D(Z,G,Dօy2N)@}xh5DV˜NvTAygҕ]|г۟C;/1. pϒwT(w|cp=)-ި}wאN⼟BMI(&ѳaJ |`Xz)ptk#/-L50\Eu7 l`vHM%/͚5'w4uONcَ hܩ`bl~$P񋞛f4x+S 5q v7u4VbۺnX7>|!pxp5qAqBy:"moHO[D:D=ѡvv:cV*Zmj`殌Ǣ<.|0n2>g / x)[_V=jȞB`#%\*P =^7fFwݐ:]ʼnpnLl#^4 tnΜr?܍-ahx3Ǚc%z/ ,ξy8@(Gx48em2{vszZ,@K4:8DV#G݉&֌S+qM>5擓7D6Sf Y7 rmyꐨ$Eݔ!AeԤ̹P7m0\ЎD69TNsBwDW^; whPǩdCV*p2DU5Y9>yd)$u Lc:٤TЉ;ANxr 5@U+2쐲f%zR76O-; oZ|<ڙ̑NM.l!rcDup<:eqA-Q &Q{ӷe 6MH5j tg_*?&O| ?<=I~3\740(fy4DJݾo!_EdM/E|F\X!4]UGCsa&zvV{MB7ZJKh^x‰KɴfWe'jo8DT}}}`,_=~g_ rM*/(4͖`e>dTV[ sF粫Gc3qUq d'~=G:ꭻN a!~˘HŎ9.bJ 4S&LQϗ!MR\EiM#if@޿L$VkQ,urAfVٷ$>5{;[jGDkZ&*Hh y9Lo@T $2Mgw#TsRTpvR` u(.~v5̬2D9 ?q2f"BEwj1ө;f eU8- $|T-(Ct케aB t hB{αr; ywߥlG7_e  ]J_z8LEЯ9u@tZvHaSS5&UϖL LU=.$5;\᝜F&T g2<3gh*nɧV9Tqc,3L#}aa.gAf[;3*1ki =&Xڴtiq{9N !|J-qdF0ah=`^\S# ,y mw\B.+ m&,'=C5T*,/P% eg)7J~IlnU^]f6O]2 gAʅ)V\3y)ڄUcca2|5l 7)m7Tp)T4+dD (QEZs%KOv&֫cf扐J'P PZMS)|Cg*_K_s/Q'YJ n^qZ}ᅜOܦU<ÕYKqLw[J?$@h7w[aVefYlqn3u.ХKqUn-wT\~& H'V#ZYH"~c7wW :4o<=x{/*YX֪/]>/XA㾄G\Ee0HxKNg& bYFK1]WX*T09QR!P*kn/g##(([5"ᝲ0$ͅEb0*PMTiq:g ̶13E *91,5Րv:zBvTO1j7n9ur}{:Im);+>. "GB - Klȴd^Q%_73%ghCrlkAٲ/?تe*b*m%Ѝc ܔzXHfF~j `N1 ~JymܙB +eww&Q7J;m!h+ӏ΃cHD;>HA.db_&^&U"=U(i \"\P.# {ēt0H VIU檢ݯbuV`@]~Vhk|(ӃegCcy>jܵ{|c.D9#0n[ 8:xbߕipoʉD×ƙ zeIJ->Xsm.{V>7A)@DY`'lmflzS+~>Ԓrն sڭ5LS4< |tʮwWXZ;6ӛ8zZH mOz*dФ-zj~gوSWԻ:%7Y 1ԉZ\NhGB%:|Jv:,="\&8?? ͔4L!@@Z)ED."ON_]xyrJRsNvj'0A7c3d1#NZc bF{$b"i3 9+"j#ʟtZhْ0gO;N@Evq.< G{k h*{q"!SȦn_Б6QWH Bdr]`q7/&sfXOd.ʠ[|/JȆI鿊nB&vUh n S=7(|ᜈTǍ Fm>>^,R^_:rT" M"tdPe  $.bԩtVw3hoE2Hh~7|_?Q^ZoT"+&+TlE%7+W7H0.䐮Xl;~@ѲЕgj"9SI~LTGNJH.9?vdcCƄQl*HziD:K|;qfiޡk%!ٳ4-Ib doB(Jk# nm,q/9l>jCZm;pT B; Wvp;g:Y\_ۊΦ%޺ Sl.f#m NM6tޓ`B}@xCp2?\9ߗ3k!I.i>6җ4:01HkYjM0sJSM"|6},r(W'ꚿ2#G@aO{Vuq[pCpC_D1kЉz[/#2xއCb?VF?0 B_36pz*Aq< OlzȪl` XpY.F~A=[EY~lf*;?2_`=7} MCo G=Ҧܷތ,"+S=hl!MF!#pY#~UWcHr3k[."C)s>ÝMY3! :S[ Fv\<9=W͂,đLk (.~.BäĺNg^GuAaLn8:v: |Xiq=|vAg~@u5 r;B˪> l{DgQwjp~JH ߎTE6uEt|0*SmԆVy]i Uld:n}eO:P5jӭ& śq-><E0I :3a֖`IX韘$okRV猿mt'T$sWɪt<Z 'kѣ^P-wF(6mMr/6op  ).*i6"^%EVE?"WdXJ v33 /b73up+2}M>:n K]{P1L 0i7K&Q&ұ@\ot7Ԯ1*v@g8;|؃Bk=O ˞ `xF)߱ƃA9UHMӊGkMp+e\11MN4W(& V#Tbmg:@K(vőr;7gS,}BNFhf$24:QT3#B)(bíOԨ'F놉s EM6m7ҸpqwAYԳC:!h+]vQ&wT,(vh.<` Q]R5o"mK)^q_3Ѡ+`N-fS8h0 }F+dYձ-f  Fi֧ڶG݃|Z&ƶYDz޿y]'eur0k ?!W4Q](Œ͈+iKDP1v7 CSp'mv:<KۉT:J|}';lCP?8)徐*yM"DZ>59ҠGVAY5s Z}&]9Nj oHg0i_'6'Q.m)"|$FO3wziWtaG{UH|o쮊KJ`̷y6Vrukev_qov!w;n58S^6ٿS = %?ø\d}!B OvJ+A҇?J31'$:15O r/νXRqg%v̭}ѯޢ|KeAAd\&Fscg_ WOx*\)bcD3[᬴_;&9"MEd3w"wKJI[UT&/ QzWF7ӅrM9 $3M1z4E6D8< tȘggpӈ2u($~l$e55{*=;zrkܐ0behYrJՊ3E)' !ҰR$}Lc6x)14z\q-&Ph<WԌRN{DZq%RpGɊ´V#vJla]Z2| BcM#{y\D"c8cp@`L: < l?L(7wZr񚵇pz +^'?sHxox߅\pp%Ȓ]x4O{h'Kp~xo0%~[T)0_ҕb!~2Ԯ譠C:R_cMثCr-Nմ֟A;Gdq<~4*8s !q daQs=/N >kpOОo0nE^h2bVVRmCBZ"OHѴk*ESr&_#﯋_ofL P8Lrܟ2n34XɨLa7WQ8n"8j FBvfN}WU}E1XS_‚MBevޏ~@TOvƽ3w7} 8k P :QJ-g#x|w&}`ܥ(Ha&3""Z/qۙ F)iy-Gd9 Y,( E͂9D+K2~ $o0 Z^^2IԎEC3i 5j]k;vbT_ 6s$:C܅v ]3m]ḩ?^ZB*^7%bJ>M܅>Y~x)s)mևV%;_*Ub[٠$Gw&v{}~ [! 8صoZXV}Vlk/TD oʦ^1拭]JM?p(J UZ]~͉+活'CؐᠮmZn>=L6+pXkK#$6I3uYS?%(!x,ruiFUs{XWYʾ8V}+O/=1^& WNoe`(HB FٶȆ]6YkѼHo1v 0 &)/f#kkn ZhԲ~pun𧟴v>1|g.-Ūsi;fG34Ȩm; v ?!"q`"y7> >JZxaxMs'b LeG K6֤z@oU_Ҝ9 8+A30QݹS u5,jD0O5LN~NJm1w2&QTN@R A/ * Yθ'U-(2d'Gʰ`Jt,7sɐaҲĜ>Gg7il5d0ܸÈ|A R1RRgd1EK>lVcbGVKѧg+5_9H|x㨗ZwM`XDTG;1$B#=:CYk]M Ic\O;x)>xj,3C<558J3b#Vx1뿀T쬣g ?c>Dk̍C Qv1JhV85NDn8 Pytؗt,FQ=Kˑ|2ڱ+EcYTiee1]D`$IK(9M4u8UL߾b(Ť)mJEXxVurD= _#O˗@U-Wwk_i.>BGLJx6BXU<@J:mࢠ=δi*)Sk=emF՜!O%66zpTR,?{5DzG6ڮpLh p#wE-l,%B7|][);/w&r?L%)g%ӝ@]X @z!Ébd$Jv2x1xm=+0~moZGbFtPǏQ,G"h׋!ܧ۬#ϳ;}P/ET#)}M>V 5}MΣ,exx.ǯ%g` A1)oDڲL/IG̫"./@Ԟç.\•Ģ]^^\2fFL%g/^`\:ͯ_DNC M`Qe{(0ԛ䱸n$l}='z*u>K]%^d)?;O*U/F9[kjJ'ak׌b}(?YS{1LϔD2KP*%AQSzCKLR=%\_ Ĵ8~4r(RB"H?C>w![ mh/=9)K=5"o ug#BK4lܤ洽qks͹1 ;)3=6pXC~ˤhgT2#A,>=9s0BpZ޷Y aK9ӷO؝NaizMZtH |E+_Q6rP/UP:UaǰnPM_}VgOۼ͔4 6icGc;E 9k (.[Bw&YhL5nQ+3W!ZOgǎ/5nrNsl{CxkgaU^pA ̇MB`иR9 = i0bs qX⻱bǽItD~.fIHC6QԋKu Ol<4 0eLˀq9atjaĐʬ5 ũ%PF!r b_.AH!LgiRХY51x5\˚4|Ovg=yV Q1ӂm+'zˈoJn@te%P^k3NWȯog 2҉kHaĆ+UvQC$=THF]6O2J LR-~ NQNǰcȝX:%G6|F{s%g9Rd=^9cS ˧23O(⼅C^PbRl23[K 6\A[Whr(dpqȏAw/>KzFF ,-,ü4Z s=eV{7ɒؽܳ4Bǚh"X|al0ɂc[HN`BI[cPV _{kGSYܒ.qk|NU|ӧ-O$':&*!l{\#@oNռ&,6'IeYYH إId 4h*[r>Dd)IMLM-aemGjT HcUq%U.E^=2'(I!f9dsʝO+M^ju0KO}(Ή@oѢM73([\ Ie<0~"4N`gM׏X:cXGq'kĢ yS}R+Ai2 lGBFJ=t709Ġo/J;㓑4B7ii(>sGKFp@~p<4^9?*ryg UVБ\Bɍ(5NyVJ4Q@)%J8RĎBp\r%Qwlغ[H;A0\*'h<.&x5ծU-_'mtȌ4)00>g`%0] [  ya)Yu3YtcPY<`W lxPczgVXpq6%5>:rE/ư{"gd$R1 wyWuBVU]nW(t=ض1|d FLU|P5_9~ݩS+aylc=@XD<zj00w EZ. +PgPgT AfN`]r@"o! C bZ!t'*)U|eF(z3%Twv] O->D#2OKu*`bu'Z'Lut~!{\JͭD0uL2~ &8./70GI/KJ|nvc3t9;Ge8HHsMCwN'JX 89mW6E\,C '2-ۍ Aͥ88ptSύXHX"g_KEvVܲ-@hzn k-$"܉3BpwGNe-JEqr2>xк)ŷ} s}uJ+R%HԳжc$aL^sEFQ5~ X$SڠەL>מ^*9$s%f׷X$zHF휐h ԞwJi]6 N%\޹QAx&5YOe~}=7yZ hdI-/׬J rn)qO=,U!|C߆ @0 =mwUn7>x'kf5/֮`@9ldYڎu_^)`#uU,^yk?*7A]"XY@0>NЪuucWt˧+Kzb)Q_O8ڟZTֳX`7Kaݹ*7!BƯ )EFAn]Ojuǰ86 <.؈nAd66.7Ÿ ˬ&0["+a?-& 뫀Y',`̉R G'3Z^=ԇ2ӰuF_X\&Vh_W“6D]8;v\R qƧ^#"y"g3: )o[^wg> #aF4Oz_.!U0U"ZN1; Y2#7mz^}H~1*j|x`V0+.t?QwZ+nS~o*Kd1472ߦ}Lϕ2^>i"*]peǕ=f5CЎë; mMٞg[ocx߻ņO I2Խ\ Ƙ02V?3}iw< 0x馪K;iiPP(X |dyJ_:ѼTߜ̄|Vp4zĚe_}F%udyb]PL,iЃL<"-hіlJ^%Fp?DxD+&pw:lGZEql , A*F_㷒B&KL;]~dk?WX5Sxоy/"",{H%CvJs(^w\¢)$"mz?ðyB&0CT@p1Z˳.7}zIkP0u}Hγ е>-dy&F޳DXC--y"R$"BJ(2y ^BtsPiwϩg{_{N5[96n/FJJS.!Ki◲DRvC=I֙Okw|P\ھ9inKDF\ /rBKʺ|8#&HVZ[ (3<>#P1h Ac'Z~eJa,~A3!XoET npPJ(m,GAZ$7~?, cIǬTvip*6ۚQ03K\<@̩NЊA:$4QVuk @+X_s̽g}2&h;3u^ S'=sQ |s+3-ʠ~̯I+'q-K &{xg^_GmGNaR -$Gv;XEW8m»HK}5D鼝6O]M ܧho;g8+ZXcВOiM&`//xZÏ4 v"~LHN '<]<6gZUNSR{MTx%Tak5NDP+&Ћ4 RO|Π23l!)%n5Vu?BfM$l]rAaU,|Jb׉>&lҕӪM葼4+ҶZ)~5Fx6#I6WRv(ؠΦLFv-FV( v vI>ihԐDAӨ#uf1^[ЬϺ qޮ2!+LOT/b(Eɑn~9rѬ織;'기" &QdtjﻫΧ6P(lAk悃E@ҭ(5 8C :գVf [z~"cWo&պݴN4L4w8J]fLϔ|ggc@?`<&L*2j\g?S E ({q~f` 'C5zI^ 8RIuEKr QXres\] )0jDSBf"$)9'P/юu Ed.1blkglM͐ 5c`7yM^IA*{u>^+"$Hz=o1~?:a*{ZsySiNp tZ:-hٶ0Jlvl&nOS3E(R*`1~˶:(:4l3Bd5,ܦ:/hw/fa13jV݄ -bPSTK^6#/KVtۈkwR7-.;v}R5 (T7JW*sz(݂lhpey:d q??~Yi i|ubErwޜ]|xiYNwp" 7ٰ3a5c"]LNܤx?JK[5&Hl3uq˂LTS_Rfn.A™u#}''E՗~Ss7O.=;!qxI-i` I)rØ p2$Q$ !cE Pˎ,sCUͮ0YTXZ?FjZ!VFV=.:jF]Spr# %XnSm) Re?gm؀Ys|0EU;UƖh?K/G9'k}$:́ qbw^['6Q>AEkm:9_TGW'-ʔKCѵ>@!aРy,P` 6GVɀٓ*bb0Uڰ^ZɿYF뺋EȨGvqh$Z9";oZ2}rDش*@} ј u$@[q7yOS³UΥbOM`?4ovRڙb L[4]7 zs= B@sS24<͓\z=%^Iiv61Y',vgX]%p+(k&!hB9xRQr#}:F9QBD{9*濨>`",}LL0VϜ6d{a_B~U7y;ŌQ_Jԍ%g`m?@\O`5n]SRXϑ,5??8]$Cwj`5^Emŏ_Sx -ƍ޻Ѵ7kNz$IZ,n $z+,gX#2DF6q1x0WPsS,ڢJ;xp]r%]o90ƝM+_ < vy/|M\f^2o }<^RnDr7l@?r+SrUW #Qde@s'}>DٚwB8iF9uqz_1aM4-(Tfmhsξ}!z8DwQ%ZTH5bœ c%J]״~KK?~[ ;aWx2' <:REBe.eE9x0R :Swk'/9Q3=jV0 ӈd52HT~!;vzǁKo.r[(Gl$q/'YLR?/' ǁ*ڳ5ar&k-fpܝ\b Dº)p[!oMn~y|GC^Sylɸq#EvF!Zj6F8߫މݞ8%1X?{ptrĕ*JlRz?B3`9DƁ.kǣKnҽdDc_pYmΠLH![1ZB Gv-l4rZ#Y?& 9kZ/sd@Q*=D۽!*AREpCݫaC(.,qJ'7\l@8lP>! o~?wQK>L+K/;Kwu~bˊZ<\yU3 FÕ5 ]⯬!6He4 >_AtiV8`McNx% }I9wrz0ojfkͺlowp 0&ri+ <: Cqjy쇂B&#牆-QB&VavD w1mt G@ѹtڪUSYNZ" iw r!CO2ؤ͹cU wnp5s1b24)mToa4X/MۍU[YVGκ^x" L$J3VcD'1,BxޑhW3};qRC>JVaY|wAkyOi>r̝b(M6\E>+BB+wx Yv8<kzƐ| DZ^vMsԩv {YV-[SG?ŗc}}Qc:E?J>jurJpco~S`=pyfܪ 4 RNNƘp`F}TUI"TYȑ&ރ䕒|H\֝"@;~8}sɚ,U] IQCޯjLaO- 0w;zic޳y_?h$4y;{2I$N2h@Xe!iy]Q|2v!@v`9+SWbIԺFIN݌Axh[DŽ« Edj6OQ=| QXE&ێ:jខ!/Ov0Wݩk^7&Ar&>K[d .BpQv?O.5Gqc@Sj 6>~M~[˹Gafw 2W('߷IVF 'AYBۏȀd%m;>0-UWJ,4[J,@=LGP,hC:}7 >ye;pǀwKx u~_ UWCRť8t žk owcJőY@f- H9ӀCj }&.~Rw2j6+$*aL}19| $ 6g?rVJ{bG>,C&6L\,!ւ{5Ey$:D|ՠ-@Dh/UNe(2APdcīkA&/z4IYwD3E#$brjNEh=d|/W|aV)x;S) qȀȌݣ> Ok1,U/ :+&o,z*鷎U;D;)U +{% "Qҟȷɟ&MQרkKjh|VHLOt5nׅq8᭗<_6i.{R*oN31.88dO$hSl_rjuI\k G!gX!E[.c<>V}\ ~$Lb_}Kײuwhpa~GQۍ4LwS2,yÝ2ЋWPߑ4m6aR7*ר ʹu/`^bD \=9R ޯ1J &g.4X4²ЍNފ; 8hp!+(T fvJy{2LNx RȬvΎ`zqi>ͨ3R!-2]bo2EI[sq zP;3ՃG8Y#*%i IB*5sPkh߶ (i0~^+Vmw3FfW*hJ\ih64D?4bV H`uǣ?Kb0Ћ}]oQ{]7K>ڑJd_ XW[61tb{k\?Jv+Uڕ.QF 8QҒף@o\3 ,z a%jEGMJ(R#2JŵFʛ1a(8,^\05S]Olw;lm7pl! RS&xA&V6աv<=KEJ}Pkk$SǍy6fFC@a㑬MAUE۫ -8+T5L9 ɹ+=! #PzUDz0{yT`KC-xH;@?ݰ3OLJwBBhi^/RLOb/\p,C"gh w/"X_4_/w yfGeʶ@Sgy=8Ԣl' wI(%J.̌\iC*m̾.P >sqgzހuj$`s)aCH֠+(/.wj=R4}xvv].D  6|x"SU*)R3 m+ *ߔ:m_*~zgmB k'87#K&"&nSD3Nf %DhB\涣̋,iM Ƙ!0`@{J.j87pw5-ï5~Ew}*Mi(pu\>1?I+Y<_6<@89.W~glP!>UBp[ Z7o7q4a¦"/H"TIjiCvڄ=K턶GQk qט \fyS ɧ ļkcV;@J+Od4l`:Sb3[1֚AmR}ׄk=^rj+I;z=WV@z  ?Of6f{t&GV: \x##gSHQ@$cPH[!Gm_41rdjsU&lOd\IT/R\w\Pa!ߣ?ת!_ Jĺ?OHW{U?mgė7r6& i{"nacISOyH,$ms%6TnvګLQn0eʽ7 WڟDy)r)ͻL{m_GfK]k97BV?½n|{. qmE?y'P8V:r|3H,TJ }˜b:%ŗx{#B-f2IqI\fC~/V8SUu=<h>G:ij Z+=Tíͽ 1492K &u.Fo6=a@B-@9YB^ !e!Gl¦HBF:JCl6^l}]Kp̛rrL"{xakMRDC֬}L/rJhtx4*t =}{ڡ88-ZD5X]4Dck^/FY͙aF|Uzeof.w? ] R7u dK1:LXqng&/.RR7e!Y@kЭ+T2 0W%5चvRc!3d%Ey EufY9N@^JPTcړFCq1guɲ4g?s | 0#6Jk֋Ա f"rï>Kl]¨۝(SJ,9Ӷu!n=?ޤ(0}UH7Oof7@aʚK+t]D J)!@ 8N ydk>x,P>B243A 9[eΫFJ M%*sLPGԤ9Eu6*^͔V# um˓IV뿭{fdEcups@j0ZtnR A_ } ML O9K 1/l.(|aqf)Sc@u`:%UNiH-Wы[>j~&j\{+Gį\@\8Tie?iIIiw%\p\g}#NJkpݨнz5,ǘ66Έ/,dJr3{v;Bd|6uYU?4ɭ?E[?7S,?m DX<)}2o"}ac'ixYwo1M+n[b*K%^$:|bP$⃵-n,W~m5vEo[tnC+"[tY=v7ktV'*D-8s 8ྦvRNY6*M5),0aKZ ,3ig ؂~jye:FHߐD խ YGP'\{<ؗH7{bu5Wh`Ed9uOOӳR֣YhmtQwt qC3R fWzh; D7֌ aD{8Z5Ya]{ay;0"(m\bKSB{kKMXR!5]kL)(M'k|mg1{ɒQ~(;̨|tP3F@PD\"VRi~F=P_vV1 Q[] z QkHChۮrն,4Am_'_GfЉKھ(1geZy7uR0ԛ$ݡ>;Y(Mڧ8$w|8g4^{k|ga'g*]&h d/Zɡmog(?:dMOxG.~J3-aw:,dj\r+1I5WaoȤljGC %o{Q#$#ué,m$SO!wC{7Sy_[>OO:rg.N=q}6nE;.-6O 8.E{^*3 p 6eke6OoDWfGaaL'c;ˡYƊ/ˁzfuǭ ~Gɖ $6"\~~87Qy R'j-W b/dت脙!bKgM wO?IHƹIeAEj[(V<}7؅眏zb43$+L ˜‡٭5cIXd& "]jok X^lV4QCËyzxG8aCؖ5 g|K4Fu}Jl慁o un{W}HPPnΦj *㥜/TD"xU# 7P3Zu2ҟ &[%0hW2gDe2[+W5Cݾuwl[HU6%:B@W}APR"'ryi˘3!% U1a/+~@PIVo !EPr"/S^EIKX]vVL>mIo@<Q-;D~IFQjm67`"^n-=A_h% H9Ѣ.Jy/HM̿Y>;J=kd^s|д怋y!Tډcppp Ԃs/m?+ǩ=aDk'hۄ?AӤvђQPNu{BoZ I vH^gWo6A} %R.I/…гk_Wt&LjiF"{nEQ1%X3E+0̶R,XNFT,YS 6| @FGګ5-zo+FJavrnQmwX.HS.]EoR?m1vԓYLtUbe0ϰK;5Y3 yֶ=gB-J E] F`=ww[ʾħi ɝՓWRKRUv3?i6Oe:t֘ '̌!{5YyR$,%IWʅ g1, P:"RSZqOT"ƼʺV|i^ */㵉u",%_M81(؃C&N# (p{RH@MnF,}{ XNP~XPy pW7}']؃|3>w"#X0: ? (i|#a|~&47\O*}}HB3?bD)L`{eaO!}'pMo7 >T7īk]%tJ>^B(w{V-䏄Lr]զcVf"X:6b2ݡ](~}ɠ{ϽY\d@b.nS_>v#cLWSk%P)E)hyy WUPIJQ<$)-0$'ί1wOsUg;e6M85Qƹa ,IY>ԋ)aKi'Odkkޭx.;6X)`I(*6+Jcؖ-REx)!!ɱ8EX TDkH@Z2Ƭv):zQzȶ}q/2z+(ԂA8(S1$wrYtA۵U'ZWE6䕊0#FX%M]X&J#%=@klhNt kwrvR$ALN$ O8a" <۱Vm!"셾C47+=zajUՖhâuiHDױe0⪰޽e17%@jC5f(tx41P,&!~Z9K6F,W8(^l5UC63Юz{eRKV:&p!9*V+rVMwgJw s huBٶV`#vq ؕ+Y(( $<3kUf2V>dRUX[ `,1,=qbMqIs@kGI8"91/7VkEg];p;ho/Cg2ϽWHLg+ر]=6><5r v: eP?--6&ݽߓd}"'N:̰̇; J)U*Vi6!d"_ 5Ry`z61^sp,!-< іYV%\^ ǜmU3[$ѾM;OJf p 5% f ?}&idm);@Lt<pNҪ&WVOJݞn2'qAwK*%49a'&Z?֋E:tRr2ؽ Sv;|lh2<;w/Pbà G-&^SI6_y)GITz:<\Qܑ2\2.xD›D?DAi _팜FII[@Ä-et@ge9u~=zܳQkL:袋~YsdtA[oYT'{8_u?Y<ئHҽGYގ}x&vdN"?[FRj('RC\ڗItĵ248k6:BܞONr7k-^ "@8W@+a苩[ Y=E~A~iJ 8l|Kj0e,@[G2;Dް3]}4N`!5qTj..7<*+:u55c;CLoEXq Z*& jwbS a hrd Oy/:JrWѰn䷁A": pOaё3+vY k 2"۠cV%:+&ij,'{x'ƱX?XBvYES럫h5[æ!=&s9Yp3|d/ a\,FGgl͟ Jol>Y rnNIw=-ڹ6QA);'&MR  3D R%;2 0 ˂Nkml"Gϖ+xA,k~\ۤ=iNK;ĨRE\:ݫzļVg)ʩzO>`qvkčH-\$3<WS*!p22kEu'c*dݪ g8z:%_mt3pi*MbZUsTt[<>;tlηb,f-局8M3w=KUw#A*0GZNiKth`tU㡝u;?BɃ=4,y|`@QoS1D')A麠sac6\i=C" H;~s$_܂+5 ַ|gИ}{/'Zx5(x4: #7`^"Uu: Zy&\ciI)U %|~e_O1'[~_& @ɧx .~ Q XbͰ;~$e:~eV Uut@z5y<]Iٻ)[9ܘEIJY45== TexGbvuUȆC`=q=Ww`tJp/<8Vdӌo>bEi|OxY! ʩz ^08utgq?4L}eeuNnO s@BXhN))5s#LYt33FٷqkhGnB }nY*&Me!Gf# h2 M/l}5o8m(7ni`ACJ{w(m ^ tA0{R;O # tYEKߏ@ydgu -DFeW\g3Zћa Os9DWIgN)ns<gQy> |ү1@;*/Wޣux oُ+OKdD<AfqvXFbL3LXV×~=a44 !=$B=Q\L[ՠKas!s̭8g x ^"U&8Ŵ}]i҂`Q@):f",5S?>8幬pojL壨L_Ѷms ج"Naz#?MG¯YTbr| ia\ץU!>+uCߢ+--8FU'x71^W`fΗ,*薷}0".YW\dXv}?QzUd`4 䌘^G*d_DB~𨩡09]qTM!+.}ot6=-hjƨͩ;$|ްW',vcwOfe7 xETO{EaFZ,K$iwbi+K"S,bblrF:Vv%/5A,z,; ވEXW#"t/(vf2`% yر]#R}7ֲv<B4Qi c^S^zlc6dh'= OBV-1>of;3 Οb?RԄP^|խᡁ kTO|.6jB4& a^ѶVbʠ%27p^(@CZHщ's`L.ة6ɜ2UpIrw1[|ghjD]H徰 jn{kAHa̒$TB . TKandVKz_{q0X.ɮTBWUJ` zD=r\їmCrX. $Xa '}"3GԷ!`3@yf<"1a]=*l@[nğ7\my$L-ܶLXGT\ҰRG|&zLAiqx=mAwr7wiNhq15R[pCVlumv ;ҟ8QՄ@@BϘ tV/}PkЎѧe-MkP/01]{b(3OVgϝG_Yq{ߍri`ԵUt|!=HrnS*qND{ZO)E1A`n<1@LM TދJ idż":>o.t>J)F> <_FˠN?2f5buЬfĕm558hLI\]$Ŏ+I<ڛ ֻ>, flJ6&V.(a Ry.ipzZU΋K#$Q-3!{^BewAK +MJU1LM:h''rJfkqZHQ&vshIt S?0C㣶))S.[3+5yy5V5ذt`≅h #nΫH Hhp:vRF8kAEލR *i 1n뾦Sʝ!Cdp'/뇱O EV֓;PGaq>|o}r5}klK7[E׏ Fou|H͈z~)s.@ : T}e]7/ҋ2E8O Y4H cQKt鈸",-1Msc;P0{Ghcmy;.Iljg@{)65tD1o;pȇmv^#gGͻTM.cE$t>ﮕVeTLpXpa'̈FRSn]eDodc{B^OޯnZ5h0S!;2g5[d7@/QQ "ifqӲ4}۵7Uw]$^h|;>Tf4)FNz2e=RnU.>?=6^n5JDƧwwy?, OMsQ MCa/b^ ]l6-FkD:6}tDmO'-XWWD!cNrѵB3ZUK`,`y_r298ei^Vm&[:} /}M 3p⇐4ӂ dCc˱)OSR$ ђ^■H]?[vqU1K@<2UR=-`Gֹ`kr8,k@B|]%Zi]ʒQ8aH s7V\4̩54qBN7uvΪ0I$^DnχH >o~v|@^}ֺV$eWvxĪ*9+)^`/}'C5r.p!xa"ØB! 2M 1'>pi)LW(\Ԗ|Ӊ5̹]˞`0hΩT2=I4zzl2UsCOhDڇύ8ă#KІ(ӫםStL$u˚ QHva*RFd T4d0?BCE jf4ф@U b6hW4/cζ6khGms,Զ.\\$R_P7]qAP)F(@^ܲ6P4qsZI>+GIOG!;@žLV[ͭ!v(6>MxBDc g@{Ү?}=N*obчjR>\zLnH5VE4 ,L5N&霮4i=9~_؃D.F@j_){u̳R&Mt.9X>u^4LM-ES0u1W>BpN8Wu;=—kQ#cGL$HDYϙpxa! aH$1I c兼1'NHV٘ʼn0͚qk;?roїy Sݮ<V=L@2K,S;Y+调LӋj 돮R-EwmdvXZԩ72 bh>&: TK7Y2SW 6@V5jŐIb [D\I j-$\ iB. Z)f#Wk%R8XHޝRO"΄P,^IRtn6|yz5?V99YnEw%½K[`*Nw'ndpXcR(2ȌoEƓ!a\hoGfx6 /y<u2`}e}07;w~TPC).2s'1/{oh_18YQde8EȠT(y^BV<&焭qO[TZ#| ' 諁-|υKn+*}_ȴsJA]%>^+_%U__>>a  _WWi=ힿv3aԟq}A\4S9 B((ZZ%[atl+;:jB|uX'sB w·io-pFRrF32p˻ʱ'[\{5ܒcGHn.vsZDOÅ)xt  ݨ;gFvQ`}ÍΡzkS'7Z?Q>hMWvaߏm%y` m&%[9z> H-|U,d(J{mW8%.eh@4D/9}ޘՖL+l%9fwd^w(l6>K`=i')K+D# \'d<0 0`{0OcB\Yhʏ.+iLc)i>5v!I8RyQf#}Md(ViFW,[85 蘑>BϥVf4WLgѶ.jVOӵWË@~ExwA} bu~ GgWN`^eՏN֓$<(ɃApӚf'I-CE|M`pǽ'0쌖!(V!1EyZpa@?*b6,W29Uej8 I.$V`aҊ(/g :cu..<27  #Q°7vKDAuP>X,d2Dđ}Wi?*N{L79Ңs).$Yշ5V֔33vx쪶&'yxFIdK7ޠWĊT%:JO[HBӜ3K 2 efz5HWRxc뉟4>*ԏ!)zB˪J&!.+W vMOb>-=wzoBkQ͇2hԾ@ϊj7? ;8܀59ߐRJ_#A%r֒P@RT@XQ6|[ hKim(>NIwG&4uhͪF #`K~!_e0Ruh(QlHsB0iSBS]R FiO5Aq)dVkm=XgM{cy>Mf"cz|RaޅD]!1XCOW%L-٭x}cBaʉhi I$e߯'eJ?P|a9^tKUdP;) ,b%ȱ U5Z4QY8R[58ra}˵`!`ˮO~~_ZǢ1EDI^bHhW [ڿ3s`a;~|ֲgŹOLjYSZdbs}Cf/GV5uG9"xFN8GiYHD+ӺZEjxZO<#'k&Jzr#0wc= oZIEl !>&)4 R9Q:t ? [Bayʥm/Cz H  $ ?z?X> zzo@˽`ZC-_Y*;#b#]JYf+AvJi|Ј)h<+vsLkP<^j|amVvM $&/i#i@C1\to' \d:Ј8$⣱boؙUΘZ 0~ޘ KM g'Y<tD*> ^2g^_;B²CJϢ TT|θ]E;d#<~֥@嗴pd\G±18C+XR @X8P>$L]`RPi6!?j4pb4yh_>?ɈU)Xl|\z}eQ20AI)}}׼GHRݯz$.'͎fPfvƱη 9hKOT  $5A%+4\Iz.>OH&Ni&V%׀⢻LN0WqS3Ex%yn64k' $A ҅gE4SPFs(XN*.7s/}>Kh#a-ky3MƮn_?HY^dӷaq X3 Msj_ln)$it1fZ{$d'B(cPQ5=ET,00V\G̊JN{S 8 f';7 ";G1H`PF `̸Z9X=m҄bʷ(kOu x}yowu[FtdFIhMR oYd_̘A PI$ hTqaL73yJ mvp`4X Â'\f,N\$Vq<<$AjzsRxqƤZNq/EAJ&^H%Y 2ј3")_~0P$+5w>>B׾v'l:hT8R~J3wMP%AlWg ,U4m͘+)G,%vYf)m 0hS8&=jϳQdK5e+y~ֲJv8FHHiVzժw2ٛhXcڣC,UB1J %˭RbjiXGCPSa1P[o!B֔k.Z\ tFNk`Β\ѣeMAc!| Hū~g45Z=) ]剿'GE.|-{T).[r;a<ʫK4*|1PnUD \ 2yk. o>M8b|hgIБNdž1r8M{07W!PD:"҉U 00s)R؇b7ےʄfv۫S]X*˧zHS, -ȗʒ!ni.ov>U!&g8qk=.(6f:_Fzy;t' 튈2ȾiN ݍ/"Ӊ Sh\}GH+؉{P85q_]R|_IӦ$D0w0g+B<,F{Ql%6_Ʌ?҈Rb+RNMLlm4<)?AXk{QgZN6>M(a "aƆyE& E֩^F%z* Tk%1lsA@MGp@!7Ñ$h@fk;bdTʱO6(ʻ1.Sip0bJ9w`+`d{haFzB"Q r-zAx}HU* "֙=v~2e M7C~Sh=Z@֍F3i9Y?JDcc`L$%Mi!>1mwәS1̎}V[.{o$&D°GJ,DD[j}AVI_y (֨jOc:k& 8`a3F'S;|sݸeSK3+ {qV _irhLR\,26U]uA@~4 Dl ծ)=9:b] Rǰhd1p#?|x\ө{o\K=-7@V!mVPX2Ra} c Uǝ\-\_WYvl׼}GfUx@d7Xh^Wp_XPÎiaKp%jga49kNKnK">݋DN3Z!TU!"0C RZ; vun[d;)Y7l3VeR=g(g<7@]d1 RjsT S{*^N'NG,P^c %]6:e[aq9 Cjޥ|:̏J^3d^ qݦf입LY gqAa[Lz iTE fB m^tq,D7ԹGؑ;o<\X`6ZHbn-#a6v5!+3A[ %0\}17E![1bTO^1̬ik~as7kRo]ʒH0;,8wАFΤK( ; ɻKJBe6 OV,4fEI[%Orͺcc]9Rv #\)ެ;6;Al(j=ARlcjlѪD`tH%pĸ =KIV5E~iz!k2$fw'XbR"/BqH_?'gkRޒ@MO>cvhW¦~H;O$+M lڗluldm;ś& fޭψpV >zB3GpsB^yN/yvw iequm>`t*`Z6J~/*am86nmDWµ~Wcڈ3\ C=OO!צm6Km'{S3If1Ѫ,(z9S ,E;ȾPrbtV58GDR7]QdLn*|U;u)hˉ{*uj9 48; JW4 - c(h@@{4 ZCYG*JfJF}[^)29 zr,aɸm0&WɠNWIòdg2^(.LH`KVn͡IuǾ?1,AW*7G8y^nb/>S՗@ wcW#ȏPІ^*NUt"*/≳$$;n!3yw&ݬb|tڣ \|̦i6e<^2Fh}g ^ݶBQꂊNX{g>rz}K2z;;[PC:gENi5q/.gjyoAX'߬G{&QRX/B^4l-'2/х;~6EǏpCY阻Q]Lxa -JO)~~JKߒdI $M$Z3C|n69 N(XR15l9eWQbV-{wR7 kIJD_: `E&[hv˗gbD&UAj%܀+܂XN'@eگtNp+FFt%⮆~M!"{҄8; s' \jx?Oe~9[PyP2-Q(rr\T@LpH N%n^<|({69ʨ᮹UB">ÑA "iPujMA{&dF˳q̀^!T!J`xX!own,oCԋ \VO}d>άjDt>J:8s4z`)i7)q*VH_uz{>}t0#h Α[v// 2Q J.]g#MҐo:]u' 3kKY Gk_B/#e nYQqx{ohq^)Igi Lutk|Sl4Ξ i1vGJY)h%ĵ*5$M.9 2c}RAZ)V8O<T$z4J ` 5mLBfڃlvJzm9bI2hx+ܝe/%xk:iCө*iPOnsxfн~S;K@3WG,MI5,T~kjQJH}5j+7/Zk9 rIIor8 6 Rd b-2}+w%QIwrTx潚2eO)B@bLBbM0|ZiM#ꦫNhܭݥ78Zj$KA;r<6 Z&$abUBKtlD˜{oVa4W*xSM=dc d@g;H1 ïs8G _DѮuZ摊b$r#4z5о*}ײN-HAҔYP鍔5blD_Nw(:׽bv.H^}!/3 f H}3Cfݞ}۲P%sGJo'[zNeݥ5(2u{ k}0r2Dx=PEkuKw?TƫuyfYEY&|q=EN6ze{IQx+phc~tjNd@dVR/Bl LzMc |BT ʁ]/]j:F?KFoO$@,-+1OSq(oD86}+(@Uc2Qw|JY c/Չi|Ȥɣ='ޡٛ͟[l!y$k!'6-KC| ϼC'up/֜sٛ-v7ךo<6g3+Z#=j"9g<ċٹT+{dV(H]A 71/zDa` 9ܭ(6C}ăuF`oi(Ƒ /=t1?ǵùҼ[7|;D@Ao~CGv6-Bv76%zIkL&1"2۩:`ߢ5a!gpB+cɝ>J/r"sUVAUA\pբ7dS5͒Z}Bv4!Rar!Dk"l$ 1)a}ʮu۾VX U5Wl& F*fL\υgnXJIĦh/#!dfd q~Zcxl.Vlъ+XoA?j+5^A־-ڨ.70$AeޒUm<bhp+<*Dush9Ht&k ._"|(vq@p2.KBR?V->>pQiJTN~33.|/ckk LMlinUi_wj x=C-@8s5"uhC ՚E(X/*ZEB_6A牡+Sa}uɴswLA_~>qd9kٟd=Ab<4#6U*}ǩ'6峆$ZoU/POG x^6^ڄ8NJw>{~9> _Qr+1y%v HRcMٝOCFLX7'oLpB,61$j/GXF‡!zi BU{ Ռpy X7ǖMd ']P9SɰOBp*PS9Bo,{P Rjj~\o'uw;wm&s5BF?y,Da2S=~sQZKزԹ禙M*?ڍSa0`Ȥe rE9=?Du.aնbyE 1H1~[ߘ&( bJH@ tKs9hCPaPVVm7fYMp;EByz01pRe@Tm PW_iUDii_R>j֡.ɶoł6*6?NaU ^Å}fuA/Wϰr^k̀/$~yi^ 2k[M DG: mW575[hBola!62DD$jҭ쀺T=y%_~ z30_lid ֆ`GzZ+G_;\XbvZ< t(~q4.JlXy(-PX&sHuh"4e cDu1ע5#&HyAZ?Vd$)q yE#Ƅ3qI[xJWo6RȪ"O~bIPf|zTOQDń9>ZùtU`"R5O$vαK^Y' J&{="vB A']q~ SwPMIb+(b淍S:$ʭb`xAqpR`y猥¸' Y5l;Zfm&zUSsTGfbV*<+!u fwk~,q =SHM4d1B܌RTS0Odz5~R@{Qԥ"M;5IgDlT7h$n8AK5{ BbvUʹZN\ODMLRLz@/7}"yRCZ]4-,5UEFr\|H2'lmu)qt?jX*U74 ք Yu]S#aOȜ6NW{IDt'|H++=_x1F@z ħus|K <#9ϰ4SL\JaDNQThS]+kwX#zqeM >'&&Xjs c=e;0O<>)2"݀Z?KlkrB@M;-TdPOH`Dܵح#><L*By*MXݷ"S\a!i\&#Tww!$i$wDߚ"i`*%a{v2nP|IY}7EK"RWao"jLF"tY\^Em ' } Ngo9j8{7[ή ~rp%ݭh6Y$ ?({)cDK1Z pF@檜#xpNvl$+;s?(>1h ϴd?6QNӥ@l&eS6kbr+ R=d U ڶ9mKgkw@Tqp ں {ɦh厙CPDjT=Q\gyC#5lye,'O5&%F7 ?Z"2g`l9o62a V$,NP[_ [GEY JA19Gε`] Vrdt+[5:x}sG%V $̍?tgY `D#zͪ/УB7&A85 3b~}?Ў0犲.ړ{0T#*w4X a|.ij|M<> d9PeV/+9Pɤ# ΛU\ C{X[Ys{7 )H@4\'U/_%4ѷ+WENYg%tn"! ɰ<-/%]hYQ.HکMg }h336r89"+5ROPOZ|Z~>.gBĖz`iX;4uKT268xץB@[S fMR "N8GӦy T jpY Q6>ۮ?ӄ}M1 M-hf`"vÆ0[PEPyS3UfBK 9>q1d:7URM1Ö:E62GiWS[vLVA*y?4ƻ<ڷyp˹}rZ׆n l`7G;Ǯ@#NaJװ? ]CksuH´It4ÓkX䜚>_1=Nۋ{gfsO{H; 7 Uo*SR4} fbϪI 'F-XD:y+,03 $'*C|/kM]Ϋq׈?Jը'hP8;e1n|ʺw'b9?bwK]n{"8V-+Ȕ,&.:ZapvUyNT҅ՄwPr"PS^Ŝ"O>}v7+B)"eZU%rzxDFIzM3˚Euׁ5kk]20$z`k8Y|WMr**݌tx؇1c:aopF>lD; n.5͛ccxCqՌ评rzw2=lDaNRA J[B8ҠE')Ԟ(/H@A$ !^g)t}e%폜{cV*^&8{Bw)rS!l-~/LTCXz5zvS gU!&wKR2DP^4_-tkΏ''y"y>NwIN+yK2Ӽ/ڀ_" ɔXzAXKe4S'_mE6'1ɓ_.xGX|[_6GPn>pʥa?~ƕ /ggLJDmɹ߈XGɄ6]جR@ZEd9ۣM?G,Xɑ`@*J7WBMCNib BJa(Fc8܌~fIBֶ4ƴx%c5%obt%Oa)d_@TSǡgj(V`f#+8-3tu2uOG FBL^S076XV(Gn6%b"WU1phLYE Z:7 K32rZ; JfQ|ڒ Z7l6Z&['"9w ;+.~32?K!si*%C2Ne:e[փ֣߳Q i9a*;tMS>E; 4>FeWD,ڳ ? ./QBb !1Z``cW/UԗMw(j4._5b#0Դ1g87:kqn5,2JߊpJiO !x DTs>p;*$c։ƀh1t,}c<#)YU]JT xJ N_b7k#Td> hQ<#:_  H 5d`ܾ2 M6މՃ@9_ֱ+M+"2im̽=mFڝ.v\!}صu0,ԇkGjH`}.nG]0l7}%-`mɫ6a@:E}!(Tb,a#*4J蛿0 IH2rY#I$cA Í Y=]2V$6,8RX Q'{aN~4]YZt4m@{OxsZIlw",Ԋ`>-`02O[׭60,K5GGg;陯VAz' *%ܾVRb ځrnڠF6 5IG6]|9\[kVA/^BOd_zy͙bté{fdl Ц쾞Cϯ^r KG0w[JE J`Chjn,Ώ S0=[qWκK-=<"PXh9o!'JhSvPO, oq9$:tV5;P9޻/=>}sXa 򼜞0U }_HvP(Ac~d9D46Y[GMM@V\i+B^9țP9u?(%sXtEB.hd워RyxTCuy6}ie9e"17vͽ|niy# pzc22̎i"}¹I)'d<عGOc q=Μ+L}Q ?,Q;.0s? ©υ+0H!nѱuA4o)j:r2ؼqP^n{U}aAT!գeS~ׁA4 b 5~u$ANK=$":K<Ysv7#-=֌sUk0>:Yvv]=/؀,:^zcb#{}Д?дy͢ʠ~N[ H$@nM5ю%("~ۻ|>",%r3#URȆ6; daih؁N,=FJt}L$JIpNٳ9дWƐ*fчtrSR'Fb0a2ف a :N'-82g?^ߜv_]1㬷ۃqNa8߿zo'ӌőQ/\bY @s{)#BS)>9(a8[%wԕs=xgm0mwi.R |gKi>v^VEEfM [D.KB%\x Cm䭑°0>ۆFմҎ Ia}HV8Z0tV4b ru%G&̶$!hJ(Tl UB~~JMO*WR[(͐3ߟ\%=؆=e_("I' ȑLm(cMZl$i%nɻCXivن HÆ.~iHCqNSf6WѬXƒO׾z^1ƼJ_v=6A 0xo1K΅>I]ڞ}lKC[q6>5&vѠ475( ,]ENL(Ty G$oHB+Id/?hT#,' A|]fV=UÚ(M ,FrEuCF9Ѝ*88">(,MdV>}W.JNj;꟮64C%kE3_PZah<8i<$L]+ZQ678vcC[ n:loV-Rd XTJq[Ǎ.(#L^R*N_@jWsZU%ޕhA#+իoF|vͳ7Pxodص 2*99-PY$ݛQdxܘm}K1OqNFXOaT}K_@Et\5/\ٕ4;XQ'4-E ?W8^6$& =Q2nZzML\A+A'-:0\PqLҵx곢6=A _8C޾4ɖ>K_/1VkSYQ6LMpv)V=6Tzr\CdIG!I܆"sV JlRx﹩vKq[Kn<҄hosԺ{duZF4n1Fx_Cc+h'U7}P,}g2u)EyY9f喴(ք*{ +Aw[*MlO$zSo6|N]fpN5z(5dJkSOmϪ]Q4'H\'`vRvVIC<2t j\~$+h^H@OanM \&u] V!sb#@?,!wG;.0$l <¥>Ly͖Er;#6m\/*KC B$..:RDS,`ɏK*XK JyT{##9^fS ſxZW[m"K"qĢ O|ĺh1RM%$#<]!= N=Y0APq6m\u"Ho\0ć:`h; ,|㠮}ݲ5}R"i9 I6R-U,Σ5#9|':,7=_Ȫīd*vֹ&ER,+&_ڛp; ;?Gm7g}ͯ9{ `om26;QwR5ϹFn4 fBK a'Pv,WMqR},S1e\ ֡e%Z.(n/476 bĎd")^I.=rDaFhX:r0=2 pv6|_ڹtDvZ]l 0.H:|K94d%VoV[w'Dۈ?Ӏ&z;դ< @i\jZ=t}?!6i|2$ |f ~V`7]$hX^yG E0mJC[9\کx8S`#RVLĔ|EeZWͮ{q(F_prn05/L^|=473D(UZ8lYgAіZW<Jnv$u-d砜 oBasz#=.i,Eg=Ud~VIRѢ9vu{($WAl L~$n (,ja nV>TY,~cpw):+DQpi1>2Ȗbbuchrw6#E}7JnP@uy[jDܑT~4O}a) x")}M( KVo]%qk{܋ac.?tb.`ZHUG܇ ckK"ۏQ-מWu#OɝzKՓ)0q'Yto]1й7*AǍﯿ.W9wZX?k/pE^}4vD7PM7 5- ~PǧbmaX音)%?af BH}b:ɘ 26]^NS0&[} k2+Gv΄:#6uVҶ)~f3ٿWjtg4n$th%ЬMS!BKa.*'xib.-9`' ߰V l;RSs\')|\sv1l!*`vZqUnP;2UQ rBF_tރH}ȦS z*zsʟ孀u-OaOBYz[@!TJT#( !TKz1oPB,@TIxX 6\ S%>7 %}$M"8)Xg/JަY}t~ʺő:4ۡ=jW#Y#0o؈ex ^D󧿗:¾z3/Qϋ QdPO> .eJtr#Sv Z*wb|g,lwhp{Mֲ wuw)m!|swہ@8jԳQI~։of['7cILؚl6 ju4Mp1Eђ6D(^ńAq錰BF3&'h( G7%Cגowd3Y%imҢCZ ɦT3(,mξdSmQ=l^hf'UNK8 'JgTJǦ#PؽCleXidxxإ򂢇M ))|fxEBcOlWk]+2^(jTmKBK|^^@j?<]@hnݒ'zu\,D߆Eu(_hJ  /aV溘"0a1sƇ۸\x#6QSaup!&beP|AQRD8`ɱ4*i( | BZ nqXHwn3rZQl}<$/^y/w7@ kVV nff$<@A)&RO6e?9%dGrCxK3{~ʻ`8'yOĕFJK ]#~J B猩+\o#J*7 lQ>^eaɦI$ux:E5gG\$"%c`L|[7ea#˄nRJJ+!n#DĪf;0ngudSbdyoܻbkN&!ӄ3ZoC:̕e'8F cX3uQu2*1ʠd[U$0ץnw,4T*5z'7> MxG#sLVB BֺX*rMRf93`jxg MМz.ǒc|7DO/z#ך}OGjfrʑP%zU0%]MJ*yarٺ3lq L|9ɯϦ06VpqR|'Jn{VGL@q}SglyI{y"z>ȼF>ѹ TmdMeY4Q3(Sh6"lCbC4,?$NlcQR48}@8+[[EZ'i . TH6*Xݙ3-`޲_3HGQT tۂ45nF/S:_- 1"u=3 \EŹ뀑ZB3(BѼʠ sp3K?-Hg8Qv? yJdY;?Ec(K85lXY7OX׈swzVNhueDC+ \E)EE"ҲǾ3ja^Slݱ?J^JrI9~@zx糴3f*`).fԮoJV3wR\ "ߖ3Ǿ^g )#ƹ8z'!y>Y彏mLfJ@&]](M8_⛙iŐk> 1ē)k1oO}--"qN4LE>GDkI֓1Òǧ`VNvC5K E_; MRyW0-'t'2_Ȗmj CAЊdmfEa\?uJ[0pPSLEݕ}+#ۮquˏ.Qܙ˃Ch:'# %XØ#ɭ5T!O,РLӎ>lSA^ K'-(vYĴs>m˱T!  y85dDlo{1MlrRpZq? #E YuMrY%Е }tb-RP_WE(]mjm-s_|KCQtp:n^+.p胙Ȝ_(]3@yV1a4 k+{9HAkD?tA϶5Ui°/ rDKִ(d=0)yhCqZ6=9w͂ Ş=XQ$ه`fc!FZoYQG7ay\$H7fl!\Xtg͞_d?4ľQa(WzrX,-B"/졽Qgd.S,_ԬeS0&=iIS>Qb1]X(^+tFHNs> *)? RtHTwohfuRQ6Tw {AzF]?xď pʢg7 Ra;x]Ķ5j0US!, d}\RML]"XLM^q|#գvDW}8z>`={׃&כȗ.uԇo'U4ZYJ 5+4bO]m^\`. _b$quG5U ?fR"J RÞ{8&nk6˱XT$ׅC-Sl5v' |OΚsUO 4$!̜Un@cИSpIOnV_$K@* j'6^qByHͫ)pI4k*FR,,Xf̥ơҾgً`u'KF?.Ǽ -x\\Dz_4qƅ6$:JE8a/YEZ[OL` dH]جFD+͇c]=.8Vt& ZNE+%<צPnxowlgt3j5+>m< npy Ln) ƭ V3r 9-yoۊwG$@vX Y!:e+`7诗bL eCj|FKG X\qz83Ae۱`v(TtKuuT SkلK*;3%. X^Oُ ?7ˬpmBuizcuېαf' ?:OXe:$>1HrYҼI=-%l<KQwGތ-jx.4n CȨ@ L5ԗ {3 _J] C_;K'G9dpm>٪ytj(ԙXJ{2 ~elgdmOsCW0T8&6fk׆qUׇrwa]H }ZWDu.zu E͜ܟha:o#<%s>orN/ھJiӚnKҟt]VB ~fRa+C\|zXF],!4g  Q䇙JCJ#n?qi@i&nP*^U4i?tx|~ p)} OtS E/o5 0(,D Mx %-V{\ `zPyzrҧ6fɣ@sņֆK#@3l*μhm@JnМoS FqQ 1@=zšY|[U}_"im'Uڜ5 X/8xV7,sccבP ز\[Z>=|t2E&PQ ڏM*EԸkó'󋡣e(مl>OI7BNCWKyDDtb͸cm8٥ܱR_X+IM5ӿ >kTzw4V]04qX4ED#}ZWթ_%+F~sP\XBڌv~d1)E0Zc TP<;B{H)<9S[䤊W:})yʕ9]F-e!7f :wR$czU>a ,g[={%2Q5['fqoNJZ})ÂԺ6c*\\bU71\u?2H(&z:AeAS'Sp8r30 5poA)ݬ ¬4 mroT,) rHp*W ?5V(рS&ёb9܉@MjތQEϰ2@gWQ~$CT<h&`:ZF-/_bM< ftUY9>nɂvKX'[i:#dw4%iحl;X_[&4ѴN=tzuܰgӇOD旙sO(фRYP-& ;gEG,V-!8T'BfM)ߍSMZNe]jIr96'K:$b hڭH> okLuWD6}JYA]=>߳4O">f*=e(uǦcv~ +>'e  Mi"X-YqU+Nˡ5c+y,V=orT'{A4uT0jDgE PCu#jNxMK90[ ۞J?lgaE^{Kusp迧;}>8p2un۴A=RՌ>",$m(]rU $sRs˚0l}F q[He ٚ)jF:7'}7uHa#{#4mNI2՝Qw q\(Jޏ=W{w*:ר CNO^яZ&Q [C<̰"ҮmO2` NSԩ tv@҅+mBlr8xN9\~Su)B5~if1>Gᢀ{\`hh1WVq-emFr񣻵G F'nXʡe!\y̜ "!&$|\\v?!G C2~S%l X𮫲{$+4n &=OxbUy`oK$ėbw+lIP 6Ó%È/]1 wFo{i~MLp2]жؕF\|2;3eGceIYs nrlz'pK.XA+󳗠t=n}Dh.Z4`m6Iɹ PoBGi7 gÀ!B}mZwb>d܅j)yI]tn* T[YbaRq(/AF3O<60c(?u!Ct7S^ `@& _,i2W7A$ E{Bݪ?S&樑s?s`@ U?I.[D6CJ=Y&Ʒsb #Wr ^߈RzH.8⣧B8c!r_VO,GkӈI'J?0IpNOp,mBGZ.5 uM+j&ۨQ+-;"iP@?]'(r\Y?LEj" TI"Aakq׬>T,XrxIc,S ?MO;XR(MͳbJ`վ&x?ƿFg XPs/1-}vCɂBJ7h"4F%޾H(#wIjUif3:} r  (F@yJ'982h[8~axw}Zq?\27L A)z1lT':lG0Ը5 g^WωebsM={),;?1Dz fcy~KP’1$|/3`r ~&#.Vbe_NXwOuocTWs̜bN^ZZtLjߺ%/cUeεć6 $l0F}i r:0\q= }xvukO/vGJl\8w5dԘ%R܏v \86%! W҄$P?6r?~{m-Y ml[o?xT6ح"K#?⮴zu%kVQzllbptQpɥ;O@d^!"KE3ó7ϒ67=3iTT)ZkvANBX'MV< #"DR7l7P:-Tl<|ç %>w%7]=DoG#Eޒ~s~krbonE*~/mՠEr_Xzk ^\FÝ˯g=t;DVDO7t|“XhH8U,עw5}3Gi}2J9c͆Ll$&c>0v\W#BHJlI.S-߫ X`Z%7s؂V^ź//Ub !5I óG$hJbFT GS!Q,O1@Ihq)V|ٽ`R4u5j$Rz{2C^K'2܋3ɗ L^ȫoε7'6(hsAoQ(8Q?jo R*^c]B=nK>:UIz'v5NT+sofѧPXWK4X? ZXLX򷇖{:)4?ڰ#`FzEZ(ijeW%VX~JYm3磕LcZ4hmy ϣ]~RiKDjň1҅2#Fd)āM ̳!՘9>E*c5䩹<{P K|[9O&vO1:k!@,zf믧dN LsK)"pbIl.uBd̔ 8|C.GMIycZIoAỉaxe ~5Q`ߐOyHQ{G[-ƒDAH|d!W&mnBo= !l;.[lHW01ck[<ZnoQg FpaC-ma-r<0.j䟪<#u<yڢ((GX vHOşB3?ͦmmR+Vf3lwP٩E( }h ZJ:(V1o-pj[`-1n ֭ \vMk6W$F9PFwvݢm!0%(Sa!o5*Sbs甍ߏ`b!;D{,1=H`.vgďo$ jw3r504|T98R=݆M73>kt^1FWa)/RiI׭r)Y)5ٟR 0#ighe('WC%eW&2 ϳ$?@68fNZKϏ9K)`q> /q4i^qGk;Ӽ ~ %IjR-lQ;˖7}%wף&1XI2tzlȳimn Ffs .b)pFʸw굲Y cluN_gG육gC6vN$$֌Ùl<^2 4:<En]dFl%i&΄i$W7vX~bb@g/tj}" 8zh!nuߵrq1kI_V1nWVr 2 p MÛ//H¼oNvB_ee3BS K= &L`{Y`9%Y y4,0@[:u[^ {!V/ºl=EzN,~sUN6W3p$>WƐw"r.vōh DZԜ@R0Xiܦ edpu$ 9RG >Pm+|Q*uVSw~J9T45?[#eVXlf7P*Gړ*c _SA P  FaSb g<ל˼x;Lk|TMpT0vbevUMH~3rd)h`5iEk2}>Y}\jh5 $nʰggP+A){<Nld1]hA.+ú&!{ӫWLj`VSؠ kG'tl?źBAۂj[eϷ^fCv1 fEPfJ,DjΟTԞ"Wza vtL^|˃̸?:9|]7QR1;Rk$s9|k>;ddwLnnƓFt7j+l/2Wۭϗ<7ȹF ~B+cVrl$)%GW̭+ 2X[^ (u0 #OW%G,Љ,RB2F8 ⿀ـr.LAQjE_jn)4Xs-`l1YR07rQ} Qg8c$8@_,IjWkL8-_6%3 0M[ T/hx(?uO-) +cS)N$ 4 x {P-da`ڕ\.1 t:~Y9"$ 1o:Ď s#4Q+a %.G&OUL !ZFЋ(pcaJ]]q1QKn* 5 M^wկVr0n}&jѼP3 ҵb.T 2LNW ri} 3}N>0c¿G0n=XCn)Kva Xz0+㿙]S)xs€gZmesGRt ToU!6>7nyb絮$T)YǴ#Bh/2bHv.,AKu_0uW'卮},nHr[;]V]\A:; LD߶^Ex%;݂KWk( s!B䗦aL?ttP|ǐcʹ[ea"ڔߊvfŰSj5YJyPӥ= 4Padysqb>TC8Vwu5G.Z|U]!oiOw(b9KewJFƕd]zqӫm)k68^4wUQXm4]Q"C՛Ӱi N6bC{|Ep[vź!ն@KS3b>@֑C-jN5D07ieD:<tJS?;흥Bh>^C8, {VOgzfA- @p.!cxK>sqs4Fav &ޢ0k"䓔t VX(Z:e6"АGF +!6%̢#O6)A柣!6`ڥ\HG+GI|ϯT1|;g_z*tʟ:ݑ 8'6 QAMs+ٱ )Hy,8NFsc~RX+h&BX}6Z}Jx(T]$`rY_s)R\l/͆9f]T8V/ʽql ,A>{ izɍȇT{uL\2W0|xUĜ%*H@%Uo(r\1FyMꀎz~]g] =4$;+NE2?cH5^fy]iq e=ŞWf̡R&?{Nv A(DdoXY_9qob3<-i]wE{Lxcep&9_ vWKh3:jyo3|v^^fNJW>9v =JIߍWJŸ&Emi2ib f,/b8:w0`G e (S\_ib67 -[P9+8>\`5H>Zi׉aNaD11 0_0sS,'0q&ne68)CB ]WQڏ[2 eiOb+{?#/)jR5,o! {Yyeq۶C>FAvjḶ*-},LDyE]"Չz{x)\U $-I0rIOn|؎՜N&'q׽4 oz2=OJF,ҷ m~֎3,b {jM.g1Њ[|'SfQczUe5N41.\7:@` K_qxWI(*-V93: g;H2VÂa<,3o045>*rv+Ӽ:w HNJ.kꑿN$#,1:GD_ Sӄښvf>gV 'Rf;+?G!A yafqFza=uʿ"`$ %%M[%uUNVaSy> auId!j2CS9BNu_:0ֆ5^Ti-L(|u8‚WekQыf%#;cė@kʹJc$\65q'E ^ h j;B!CUW^Ҭ40ծZc)?! \jSub,Ps%I@O6Qnn.5doRHd@2 Q4;Yz_Bm9#pj%їDw¶D\^>U9Aoo0$\iU.*gyyd9\i:"~[':{"-҃XV{`XE@DWGN7w?4 UW3]&m:"~c'k/vo !L+2# ZPhb/0~_nl6]69>#{-L8Szƀ g_N!JFvC9dm>D*ߖz`O.Vqlu{ǢL qm{(L~Y B&e.+F_P%m,\~~\HI@j (/>.Wnx4o9ttEqhoJÞM6`UiRl8XtUB+l |f-m.E.7߻F21Tb1.$NDFIe]A!et9! Jlǩ(Bi9|&YQq I U얹5$Ҵ2˭>y+K.T:;c)Dܾۢ{65^H#ga#[_⒈5ᇹygg 4cEnsF%)/:xg/H ȹJnٹ=a_{j #0znƒ/tiL`崕 4&kۄ5SݿelL)ϵSr>/]W8|񐠖[#d^[jj~ly7 !3j'Drv-[`Mإ{8Dj?;9%-_c-˗; BT)|2K`+TaBf[}7է[',$_{ 1 ^bk+kGl f kvٲQN`*ҫWi/R5w@kF,znU+c'6L椞Q! %v,u1'[a hnALRF +^ʰ<9r'0W4tvݽ P|؀N\A;+]PfXtCt?"˥p!uc=_PFd`}zcq}<$! OI1mdc21| N,䶡lt)gҚ.>P0*/‹Glَ8Vs2[ 1F^38?@Š @6Vwdr){ffƲ ;gh3/[b3@0c,{& zzF=- aH]C. fQT?O=uX]]ؐȷ}'F{lXȇK2Ljeh/8F:?BYT"1pN} >'RCrwafW (6 j$OۤH,ny٤/"-#Va'0@#"@ʲ dD )Y]BLjEA ᅑc[*,00L˄؁'p! R)k9ۜGvBۧ%͇m1)- mc$piWi?=sBDh,J}eC[gB$5A.?rm*;bJwwN<O }y]z3MuTQf-|EޘHR O j ڄ3nƝiMԵiDnJ;O҄5蛼WØ Є/qg65FiF]֔lro\z, H6C XrtW碋 pJE WVpHX? 70Md_ccߴ0))h2| h'C11vH51yk?$ O&,OdS:ФH.8H*p#FbzZI\2 J!/eDoފ+#P*T|dAև13V.򂀌jxG\UeBHAIw\S׸k)Jualb-@u`&UnbQG2Gsyƻp4AcfnȘo!yrqiG?+l GMV&B$ )2#"lVj%X?I/4$%0'#_ǦED?Q<gH%hHg br͆tj,rHfna[ ؖҚEn%jmGF! P"Cqu T \뾈#dڸŪî$I>>jH)vDX$0vm˦BDg&";tϷykjt`)lP%ʙ #V \ռ97 ˎ5Yk}"g Obӟ>z {+ >ܳesA83$?TV13`^#hNyդل{ZMm@>&:2yKOA5z B0jR%!7Zo+Jyx  mpi2G= (R_DA(X5:,Af_h^eZ7 3 jSϾN#I3;>ũJ$Pwe{oiEks}[+K2T}]TH`ݚE#ĩ=3~9LG_eSĆ<.~ldrVo:6 붫b8x/:lKcT5,4&0%~ojtl2v IW3\ 8~bM<:+/+ ju/^91=xPzB>8[3 l_v0<5{*SUoV!>s\Y3JM`FY f$vtɒ׉40WP\L& cF,TŒ#ehZ`-l:t -4e\i~@C3Ê9sm?5 ֊qf,IttXՉN;L!JHk~\4/fҊˣ!e;Zgy̋h 6BP˛qIAΆ5> S T܀aL&A bb`?e-Va_& 3~⼢Ǭ=5]"2"@@ڽ55(Z=^O Qҩ/;/Ɇ"P42wz_HRAPյ{Fi]a}"pEe#>~u8nOuy*S *B}e$#;,И hX?P`Y3qyɖg2^W9QuH6ŵ`R)RøMO7U*+hRG G8ئbxhe!Jo) k(Z5@vjW+1$v Vj4umv'Lq)xFj64U @H֤;M0~wm(Dx4%A"o;I5e)#5[V_g\? pEޗJG6x;FhBS"PLPrgE);szd[WgU`a ҡVXCbCeVBTvˉ'u)9_<8 "0C'ƈuMF=]~M:@m("c"wAPMBYP1ՐsׅWj5 O"1̡c֠9O d^;3.a,! qc?t)e~gpXG!?%ie‘րt +;֒u[狎=zQt l;a/WfVJ_Tm@~DS}J\< pYp]'{65?dKo> OAdh8[G_ڬ#KE}0D "Yadb$8fd\hUrex-x\yUP[vA\ôо!i ӎ kTqE)m| 4{ƬDZ-d*z (yJAeh:I>mbIx)a?b÷%a *1N+.edcӶ9]/h1HÍ~IiRIW[7**ܾn'%|91˳z%+wk"Y0WCԶ,ː_j|@ b\4Eye ts&|wG+E,U9(r\kcAY.T_MViOȈP"x])kG]_m@b=GUy>xSfbcx>Q= Z XUxLtGX)ܽ/*4ZxD#k7qV독ExcySC?_jF!A> qm~Hf 30%/J7Yc@+}1 ]lobdI+1IL XwJDruSd4j>!"ZbeU9Eovn ڇVi7y&/}|&*#gԖ&u9zEĻ;cӈMio$6=0pto)noQJcXz#W13:AD4T3|d!u6U 0{FH'i.~|C׊OGz~h;¹}o_h :+91>:YQ།gA~.*pR c@֌.6m#aKW 22RΞ}t慔R|9R (Y/B4 aCiF%6.Un~lFoupKp"o*7csnd,L n2`udֶ0gmߵk8XLuvׄ/Æ Rǥ*V<:@6ٮu[&5P2U(ߙnAA ]F70zhqsZ !dzA89;9*byҍ{Q 7&O!E@⌨׆cU0I:DpO2 r^[_W>3qj޵KܮvaO )K}{F+#kIgj(X-U`{MŶW,# _-(?+zqDBT+ݮE6_mZ.ɲ?M\Ҩ!x^dgˀ7x(dvGL1긔#{POHR,D>:{VPEN)^j3o XP6Uc:R1VΘ(h PTM| ;_?#5f$ %Ȣc "NF ׾ 3+fiO &-f+g"bQ% YG@Q1D(s1k?Qj8J{O:V܇+7uq̕4lhJKu.1/jp2r):pF-uT95#xHTQ~JyW3~LrÓT? 4!H^FRU|`)+{n`#R/#VykA75Ҟ]J}$OmN,AB޸-[O_~]l3U Hdo*WNw͐MM9`;;W %'r/_>idӐpx,(eZ0xؐkG l@c 3&clTX feGDƪeI؝ ȮeX^ٯVќ ~{6?"Ji-vKzX_鷃wuI K7\3Ipd!9Z1ˠYǂLtqRG9fS'=Aʷ4.ky܂jP>ktMfLԪ 7%GG&H_> TK?:ɤy shy6Bt.>mز2%8#~]9Ae%Qh3NP0yw2,KU#n a  gr#QJj6d1 f` o X^v/*j._VtޅFNTP<([O۞. I'GuL.Q\-fԼCVQdl"v/ %IqN W] @"ֺj060MLM vvf(aZXp 7)!OPٺ8|Q1VLr՘^W  *I 0{:1g.!KGSD AX?Q[ۃx .lS!Z tؚ^R )7GcII|C8\Ze3Rh"~ d/2Fe4tB ԃpɾ3 'vuef9~F2Cy]Weĺ}nevwVǺ`35ơڒ4";SNJ|xOW ?ik?%ڌ+a?u}7\XoUG^GH!)trQx >̍h@ @TA.,<QRo灄g [^'"Be$>ִNyfQ1&<r4ꏩY_гy)_u V јed7{.O>m[\U}XAڒFQXneWJD} >\WJ˅AR bsfP|j!*=.I1%fxxrcf`縊Ϗ ғg)OmH'b{2#|V\<;qpk%-8"@i|+ E4mɏ 2{ 3NT?ER۶؀ p:4LYS^ &Tt?4pDCY;yTr04+MwI4'v}JԨ<XA ߋy 1]B^_%`ۻ͔B˫s_h?y`K< "Tkq>P8<}ͭۖ/t&څ[Eb8,+9A77iᵡ:c]bp ǴcoĻV@ё-S$1;"ysNu/lX޾d"]W2Ln7  $.: X!ֹ|SBVs&l;' \j?4Hh0]@@२I7:] TEr4k)R:w熠4Z a-FOu@!;3c{]IiUrfk/fQwYNG0&aF),7kV}"ZXCNXx9٭c% ?0>)LU]t3rHJes Rõ1Lm sfwܬ2.I@8 6H|\eX}h%ѧlyÕ#Ll;[(茓+'`$T(0 …۱VԎŀ(oEV[w=1%bvHH0/-ω2k~OK0,2TNC8-6I_ؠxG 9ư͸HF;!~Tz6:rEPT|MGfT{r.9mo2]!%lE0J}u/y죏8uMWYyݱ׻&Y3H8c&b i֍~]J@KbIqgTG-V= ^K ̜ ْ{v~i\`߼8*8Ȗp5ݩfg1 'j{z3멅bՕ {֣$m);ĺяa2}!}*|hRkM$y/mdaJ".lRb$ 4e[ZQ5%Sܓ I`lxg Kׅ }(j\O2AEU,>+__sN3UoGHPTv8NKʪd译AnT3aLK򊫍k(W+\Ue)jMYs $K l{Azќw%0!-2 كXKB`=X*v'h7ሥ~ZK: XRSY{Q \2v#S:ay{!‹W˖g86f:px<&8HBwnF8%ڎc'{l05J8[\yN>#W%6k dw>v J /uN:^ @-[m (}'JZ2L`2e8:kehM6};;ّz(PLTbwX\:?Yas=CE8L8X#?u+Qwޞy "-ǯrVnRgHBTL%|pUa{0tA5~&q܆JPۺ+|\#O6/*y,'jInU}c6 ` 7wEZ=jHgV|x9SbRmŨ m#;k6P;rUr5Dj4"̥o I2f~)5Ȏ-u\WLJaK'"${jAQ/Ppp94l zԼ $.Lo5.}B~1z`5ڋ__d_[S'A>\qJ܇6u6S S05Wa;S掕 ??o惈$o@% %M@C6G+RGY~؞4уYg4F ̓*M$TW%Š2va'v/1k-ߧ@- |F`-~@%[/{1J%✬<]2mcNmpnjLX +-Pd{mxz\Ӭ寣"Ai=?&kV-@E4 Ato0U^%\K!'L:u"v- A̙a'zw;zOfcW }'=W;ۍ9&1:NWB(D3і6쳩Nwl }ε1pd0A VAč}1jX 17[xnifNw1:(Чo NZ5cEߛ޸.E_!V:yE\'T|3N-)2anь(rH1¬1ZWD}۰y#L-l p00L*ecM7"H:>IL>s+μYyډ㢍 _y'Y>S@~(,OۨxfF>yGWQ6[6*zS:|$mr93jȴCĨ*K D5 -w!9hJ] "`-KBqʝY1C0V:qr %R2燸Ygz'tSTe guhz`՜V`wMgQ6vm:P^X0@M$18xA˙FR+Џ8;\g1Y>oςFܸ:&X8ZnF xhv+D YcM@32+q焵5%3COIux9~S/9>Z/;*STT߳H::޺dOɷ/@[` xA_><ӹr[&h. mB =Kx?vɜaYb{|T^HGO1I@.IHb&%FD=,31BuRz^(~7RCR6nCLu.ͣ./c/  ESJ۵_>nIDm8Qdv'5gB`qzICvw3&A Txw8s7~Q:渍䣶hЄh"fHV G_W ;i ?,8 Q$Ct)FP LFrliG<.*(]Cp6Z1nAFXfEA邢 eْXmn33F@|W#1<~t˩TqD  ^:2eS0EKks]mʯZ;rJosmUF*-nRgŁ c`\Nuݓ85^Kfr@d΍jˈmGB8,\B { ta }DZ?6ħEs,sOYmJ έRgiwg#d16T+E;>dA)Ȭv.Չ@XN_&d A=` 0$Xl)w[ZF0Tm8LOc݊YTVYZ"]y#򅖦L=Оb0*Kӌxͷ*w-M(cp~eW~,uL5,緆tנ J_v6Žo'ٟ}*9CtiOɔtғg3p!!ŠA CX@ia؝0_6m1`"ʭ$,n6́hx`TkR [ 27-p3uq[x|>.xk a&VW)h ;xί6Tp)8 ;'N"&]NOf4Fg/r%4FYHhRZƤ]#I0uFsLBynB$l)'֟/Uס[̯R^Ȫ߈* #v9CӸ)5;d&7q77i01??edmP'W,(KqL|(2kw("BUd"Jm\KN~sksL_We@ gE O;iIS[9:rs]l$O|~_FXqmgH]S2-1E5j\dIIk-𸹤|H.C }C{JE_R0;OәGfo>%<|8e= :X4Z^lAjg)^[>-odϞupmlՅ"SFm.>)ZzX_'2AjMv"Lb:TEuWa &L]ɸ=%zq!bxy`ΪIߚhIAn%ˆ 4's.$;7vx 'jF2ꗈŻ+7'H D;j)ږrA'BHqq>UEgcr>sKa|E"cao*ZTݺJr$S$V{uA /i,>*P>x*RR <V ʗIÎ5ySBhEzvo' bnpA }KIХPx.xN@=j?/K>FpF۷x+e5CL أkyW`KQo~כB]KzU nOL= ("AѮ=SH;Q=pyJ#Gei#EiiW#,1\;v@[S$(++xfd;D aN{fE7b;kB'E6u4J0󚼾@ EbXx!5jm+dp,KOa} ] Bq6wyU'WKYiu3rTR,]$ š܄bRӳOOL|Yϐ+j+/#K!16%DPK P\*\͉KLLVt}A L劆ʗBw"n4d^VSoDO!2UpQmwHEe;:YbKy|ge7^w0( <۝UG=5u_8uqǢ&n CZÆ(8g&bU5;H,-6otRWt V瀵jl^JŔAxgn}huJZtB_vϭz#1D}w,5ǍC jvazaRwM\FE5ޑu /:#]O2 "s/Ġk=[y&|.o ?/\,kIb]Wz;8݆nQ*qw]I;*I-y;tV-N-S;Zq"ggSY͗~l)4QȡFU{yQđz58Zh4(2nR {昫ň'`]8$U4wMJWh9D $׳1Zi~*DO\KH"aD_fm[^y+Kkz' _HfTz*K3|#IQɤæncWU~\;= hq\wBKH,qFh_<i܏yNzDM?}^"`SSqojEx (-Z .!N>Oe'p(9vAhVET5*L{AP,ĔvZN1ޡ,!ԵĔ *yܧ=P*R8Küu{mcǕäU[c%z391vǎp7OsJ86r>mt1H4/֔ ؆!Of5d8r?YRN_({Tvtwr@io ϋ};֡o]_![_SՍ }Q3(\uIz7u1• ~D͠NҖY#,1ҨPklb5e;Tc72r({)f躰" uԅ cW^_-aı\b`忥@39% y 3Ex(~R2ǶNaM)EH F4OMiJ'T:{o9B#19ĀŒNAo?zMeN7b|{*փ%+Os< D!؎k+H_+rCĈo,gj{&r~ձ Sm䳻C Q=そvY+1c؎bڊ2C:lA勯D^QPHx[n>.vދWvoS- 9|7޴4e֠Pu) {,YDSXHX J%%+-~b 9`BIZ$Rc2QF*\Uπƣp D斚~bĿݤ@S,^'U<-M@}|?RDSuFJU~()9.۲nOeY&WA~hjϦ d4nMO7W6<th?=b0K")˓q>p͟lHzd(qA"H`H(oka6}md5ug(:ݬŬ ~吕 PC ztX9mOEg*_pfN_"XmOx1*r'l;WP) t dь$ץຽ5WhGp`k MP௞*c"} *LIK7Ayz0n-%d_>_̵^?r~页:s=SCEJfV]^ /'2-%{#%7l_j| ὄiZwp~M!#^^ȡuB`~tԠZ4Xvvӂy]%BGCQc4ǪO Tk֯FM W×h}1f`SD*iraR 96]QZl-?h7n P66Xk"|.Y"z'b7${ !/ړBg\4+K*'"kĮ)"]MG)+6lRWWW\ʹnm`EoR,Mw/;^CxSJ ^FѴ^珁+-,k!mm*%pHScaޖ[4{_eǻҚOEsM/p2uu~\6+qMO_Η_Jz?~A|cAmNC/R GQ:a7aDo!?{CW$,fkְNae{CV6)iU\G(.U5"[=iZ?!d9E_YAE/Ǣ뻉*}X 9o4N.0r$/ ҕgn'VQEmqDn$rنmňf C"vz{͇1[z=/BK?.Om,[P vdAo+1|+ƑW8Z7s8RhTQ  !"wyT%bg4eEB8l"?+[1~A1|ɦW׾:2tZ+ؗ\DD K@5X^ d%͊X 牱64˒P H/+OpBs m( 2;gy]Mii:`J4{H_N"# {vH+ϙgjx1r;'> {WZ/8a+ll(_q̯N*^H4 s&pq6h vV1K _D㻺!`iɪcʾKǏ}Ncv*產^ƶD'U>/ ~ݹ8A* |p M߆T%(w܈LجTympB?ZUFIpk /Fy"^@+g ᗧaޔh[0di0L^ JdN b*]s ]j#'[n&Qd$YŦ&S 36Ya Qsc*8bDgcĚ?m_BQ/Iu1UFEbبɍ7!g_'ǘӃmvN!HJDc k3\߄EHQX! }۸^G>roy(\~j6iWc^ fQ]`jjeԗ"Jh#=7 @u-l\)E7.\¶&GEY檀60 zeH2JptrD=g5f jAmJņ~QΦ:_;Su7aO@C#5sʷNܙs*ny( 8do"FT /nuOw,BiuHcάzH?Z6bfMsTOs(qm^z-}PRjy}sCR:o/Etk+`+TA>~d%E氖RZA+ux8/w_04D׆xyZ,C-AKE.H uGկƶ(4j)"34e$_֛C)89;=Ò4 8u !2h#GdI=B2,#v0O :^Yaѕ75v[1S &ZT$\s[߄i6?'%~[.ё?ٸAt>ޫXz" ݘi}odt0L4L6fUC_Si3&IHs$S͜8tɳP 9 pO;4N"Wز;PNeF0ׁiNz܊ִ9L="^&?l"E6'B,-Ia/T5MZ[ ڒH4& OAm@C"RG ˋg"$M '[׬ğlPɲ#ШxLx]9$>#Ws|AhzO 6 Vْ~?EᴠR/ej0u}OƯ#$`E..V$IRĭ{g"Pi 3z_,v\yvú-zw`! Y}sճų_d&!rh(_Lҥ+0yօMJ$va-bcbrQMm){@7C,z~[ _z,Z+fB V*?k`ɶMɢl+xF/һb+IU1&I;ۥ7/+ eHFx;FP>giz8:!BiPK3$_z!f[TCq)GjiLJ=Y3$NCj%<9. k"0rmJ*&ZkV$1Q{QID3Akf9 ̻glǁ5o4{GB 4uLEmquc|f5=?`j7tlGg8^˓!q&ϚsDF葂)( nG61SX Oz%ʪ>aȡ/8{ ~Oُ4lh(\4~VKu-=em!a{ʢ8>8bShV kJBvKWL-D;yݮX_ f'R 6/cxV]p/֞Ϙ[N 8c]x4(1H^Lc|oXs&sx34G`,YB% 2"b3pVDF!Ye {M'o=4X/C= -)LSV6ZzfZ+CO˼\\N0=;wވ3uSpN/>Z4~6u BV>2~7RkB'ZLWL=bN":+ ohPLԟKEZM4Ni/pkv`ukf8,Pbj-NдCAvR&XGLv@OUY:W$j{wfUDGf ocu ĪpPD8d_\ zt g< 5Ow,跊0 {G g==$jL2d57`=) ,:[;>%n(єt,9*jx?R1wߙ> bG]'|&\[}[#J~؉ʂзKn[:3G)"񠀪BX2{9鸑> [ pcf{+g/2rC#zϩYwp Wu0\D72-8.QRtʽ\QMG'?x{5]J B3 *=GÁOsH|/E,5~2@GN pf,t[?o2L NY}Q%s-F1u:x;F,#]v~Eja'<^!7&C$K pz !XIDR^3RS1yj2$'-Oˮ΂UL&X,M7|Jt *ή|uߖujY-pF^/Ty@kƒ 8tm7 tu/sŸVUY~7fp3&ʆO;p[AKk2ܪ%O%ډ[TK;K)yln#3!/e+D07t~\HأdRN'A=BвOЪokx1$b68vX'lgA6~Z)$~@b'zMơ^|ggcMWErYM܉eqNoM8W s~+x4 o`'0?p_7r)>wb1L4qc*e6ZOp-OwR9uViGJi2\ykmz +1A(2(4 I m``en$h/l E(JBSj&z:(_%䙬%ɋ%'C$ jt֫O|=gP 0=lL4f{%JFrCߎ= K]|xN> mYXĤr-2jnJs.я;BApe_^col-4'VBSaOYD{}7ԯW1gZyW*$;W9/k2Cc>03t@Up(w+mr 5N^a\ѕ*O'4lާ4[m '1([z"\ _}Te:5!bUzc} eIV=d/]#fVCqu@JfC{@ξ+-Sɸ2ԏd1/T-!*tTi7W~GY;Vъw փ$wεC뛠Ȳw>@&$3 ebf2&I8v儜&8s6Z`:+`lA>kirHkjCei0%,kBS%gxcI~RxRnXGnev/%R[`9t%}; !jˡ η0`1`?(߱8B{2xsяxF[?n~jIPs\!LQBʞ{rJnN<ȡlD瓕 h?XjH3R,lVtPOtPpL$Oڮg kSFjj}Z^w-_EXݿW?9ٴW_Y.۫]:BEr}`)>؜\Zr֦ 54I.bSOsq<# kP뿮`C_]dRl芎z_U_}\zx5Yںg 0sI2+/.V`E^`'d{CY?,n+8+ʧYbwr߮]EשB0e`?U-մ9waQٲV-a!I,D4wAkAx%QDsAT@>A$H/8&1 !4g ȪsZ '`+:$uc%5D\x;vF,㰈;6`u1L@7F2e'xWu/qSFw Km9wa6"UzEYW$GЉ z%_,ǕTSLWd*smDZO~|E3VI&t? E0?{ @ܺ|V}Hi!3u5m--bњ3ԅtUCk'maoTr (VORN"H:m}_tQrII"=61 M%ȫ5)p,쬖ͲQ iϽTplz\ԉ减8]vw{Bqvv a>093YaNNBXAdI!H`хf0Jn/]XY , s)hL5MڕݖnhWs7$/Lg?hQ&A%PV$oYއ(0PKىp *(g4xJLi07 8ҦWZ28q)5j2{'9k dY9Xi\"W L_8@1{gݴ;8?vt?GG\9V*} ?ԧ?fT@P ՙg(NEc?v$=ҹoDPt6& WC&܆5k !y(7otKOR<嬥3>H!ZFq{ZGX ]τؔ&ۻ}~B o~@[*XH,8xe;hډ;ΑWC|9H|(fG&_d P>Ep"VD^e"t^yDz ob1=_6pJ:+LivXꤒyz9!M?zO_hK!mO`S*hOX=机db}ֵ+)ya4fj`o2{pt[|XYؗȕ~΁[\nϕKـ Q~#B~\I{HPϰ,48v`P9dH0"P#'e_%nʌG>:!ܢ."Oʕ*ޝx!tb\ >\:PW;?63`~)0 g&)Vu'Pp!H|`r>_qdIO}?7JIޠɋ ޠUA5h N4p%2mմ2n)?5NMfD^Mf=FpK77 KCPukmTI"뗻hj idSR0䚔9YB[<4Ή"kbL?2I^yOK>wyZRͽ:߸IqR4JQ<<>.IEQΝ4h 1T[`OS.~7/o?] /A/`T&q,m>f/2FwcqZ?CV ?lY!_[{u-,m$y_Ek`GFTYȧ''i՞yɛ'çUbF8V J$ KIjQɲe۰YW܁랡SR}a٩4`:We>O gw712!;(7*Dt2_Ab~!0 ?͜MfՔWVuJg8!32Evd.$h 3.3z2>F6֮[5L\k'G:]4zǂ&kC_mae۰ jF[|Ni>n( kuvJ_G9M4~3[q{KA3ha(rѡ#+{Pa"FkQ0 lW"n % ?GtVn!L llvVn(iJ(̈́x@$.BA ՛$O|:+ڊPONz+L}ek?=#V(~wD.K٣[썮֪5J2xUe3.^;  4nJ2X`588Xy 99b'z;9BG5^9\^ |&'m*ҝ-'x9mx{5O%\ pQSNfZ8j ՐL~*cp1թpgĔ?ۅh~O=Uؿ'T!ȉvPƂ]b n@7T2e <.'Ex@m OΜtmgZqⲋL 2X`6Kolmz `gm mm6ةѝ7u%L2|xX&< qӱq93 Z 5V&ofdm\Zâu|T)0ܖCv9 n}†~(I@#:~5N9 A0> gEWf|{bܔb{ 'PVȯ?ɤh8Rё@.9]مPq5 aJt'ҏ(JϪ`}GqümbP.D 9k_\6UWG +qߡodIzfUѦa^A=lv,H=OsςgG諼]Ϟ*^u׆@Xk.LUOORҭSk6A5yw;mܴKLjnz)M`K;` VKTD)?BG,r%Bt|C?36"LLioȉ^I[]<| oJ`bkRugIE *֧.('1RBsSkf_ \lGb 0Mޥ1hb "E  "b1vXZg5+B3qBGsgC !}üj5aO <vκ Jn~ӊɅǯ$t[ihЎv07Z[G)_V[N'@-r(p:))z 1C=֫ek GN+Eςƽj0G +@*d&ϓ0Nj 헞1dF1vg6uج,Eq<ȱGH^xf"hFnMʼԐ!r|}IGtv_G06"Ӧ"@ՒaC)CdYXG6k:B=Oi,G `f GT9t+7ھNpxK=tc`T"ҔYu~Ph 4EGW20hd[/ _(_]T[#j̱0Z 1v秄jl];sl3rֆRȓ j);_K DuWAFRП?ǹ;H4^tƘu?.џKLj/`8 {rXAƩ":>Tn@7Sٓ4edŠA5S6wɴ HܾQ>9.ha`v7b:)-jsU?;k-+f1ULEU@òu;PE;d]3+t^ J8-=hjP.ڳ' Db =@Th;9ܠ#y/y7WCgqpD[9mċ.tm1RG/~Ivcpe^obۙt&:Lt-֐:Q4!<~WKW5>Nqޔ҉"z\cC%q. ifMYVf1vpuL9$679d_g653WЀ׷D b*2_$ɩ9w%[*@a06ׯx&ϲ+xCu4qɏ7']RVPʸIo58YcuLFZ= zdZ(ʥ0冚\EmY:c&PJ@r&wTCEsŸ? #6x \u1xo«J%2{,j7= ~}WEyEk! hxgOai_m'aQH_2͝WZba߽єwA9BO70$b'm <*N,Ыv]#B[2joLfs*ʤXvt^s4̮ҕ-N!8 I_փhtg-0\F+#=aW Gj7 З^4t&;E)Lʈ_Fgξ+^Ć8usẓ P[*Aƺ$[Y#NNXk|M>hG@V3ꣻ6?*Fg8'΃b8ky%4L XcD!1ĄjNL]im&08ЪÔPT28n"`-_>tǗ;_ruvw$ ^~6+DvtG8,#?Ȣ͘wڄ UۿaMƆ]C Vq9ZY]Fvg1ҡgSbZ!oSqٸ{,|) Bϗl/.CE eA^!'R]*soHS(]{gӺ,\I6yIU|:r5V<]4>3"{jsM/SoJgk \%*GJs_7)g'],q,pAZA]{ITU&\:ٯR,.q{Y^XsY vVCC/qϱ,XJ+qON8^j.ل+w[#Mu$0鎢piG( 4|hIܧ;.j20y[as^ ҹ]CO80?z[3~f!nX nmuLO()uhXp. . = !x`{v͇LR018dZLAd|`(.dWX;!Tot)w/3gr|Ux4v">PWWЂJwTZҠ$6yI)[؝/ƿ1 {<C}\MjΫs;hi" 8;lsp8mȺ{ `=|.w;C[@eLDT%rQf ɉ#Vq:<7E3.A]CQ<T6Ĩ$[&=t"r$Vu;u+ϋ:eY ƫDQ&d3*Eҷ7is<r3FI)DRy**#+`JIw*xo'8VҪq^m&&m1/ 9aTsx+>idZѓ1?=w YG2hgɪY*°ՆG$vE:9k}DrżdCƵ8',RI @]dQ} p7|hπs%?L;K~XTb$x{K:feYS0NZ<ŗf؋hWt#?Mdy40uN}{j /fdR 9'}豣/u'AѝI ^81AعKc{^X7jM@ ~a $\/\74,S5iwZ鉷F*[P̅CŌW\Mʆ9}=4s#4u{܆ inJ*5-$؇ОbwX$V@ZۭD`^A_O[Z\tI Nm)uLpXvvrEr@>O$S?f e 83H@>k6@>o"HsT4\`d5 Seδ?zfCEVa:]tgIcIv ҵC;W|6z"%I}k#/v&nR8+B:C_`EAjHϥ\(ŧlH~dD! ߹@)>y$Њx˺"E%p?&ffR9mƟwjeG)i(ێ1 ވZxfVY2 Q[Sq"1^I^/K kDɰ H;as;X6˗&ra7,u߃AffwmB|^^+Tguw`@ߍ56~C#&bt@ OtvVe" m͝I-8BiWO{7~CD~pBa+f` Pbmt8IA~d'b<(Sy} Mӕ݁9 旄}߯{3L@Lm_p)qWx /@!ًev;"[(35Zc.)䭈R7d߰ƴdž;VU} oF>B(Z5iL>`ă1!tβA9:UF)noeF ϚtC'Kb6mA;w7nVR7sK]ZHFi[N;oʧU^Y!Ws<&&rt(ʑGzatҏ@ ~2k8EAex̥];C inϞb{H P QIrJ!Gu}|\]rn:dyѷ0NՠݖwCk; Y-P*Sj'⁼nXʍ~{4KH)D+@TfiCIYJfkm5>~\/~9 ߶Kyϲe$1BhHթ> }B=J~ˍntEOӃP-cC>t~o  [[.Z`ȘD桗iI1NcC<ĮeZO<|)܎:DL~X"4J]ȗ{d6BYT:!NܢB"eA4e@ɍ 2;8?(Mj&1o`W0##[;TVr-PRu0up`0LR_gN'*aBx,MpӸdla1ne } (a_L./~4vdxԜn:jŕ3T4^U tNsקb&%v ЫKֽ ~Xvi &sOb PO.slՄT]cT3g|??xÿz'I :3i\؇_]wwYQ ?zLsj^C]J{Tгx_FZ_I>oU\b%NzgòҦJ9[v*O24fG@e,"mrLއW}:ro$z[VgЇM*EJUk!.ޅX=+}?gKo8["ZBn_{޳W*\JG3<>fYgGzdv=%i8i DQx)y"tq4pƻ/x*iו[ ) ?2.__2 #v!G2 IH)"ǰG(F: rqAf*7jT.Fy_OWD;e|֑,`flnwB`0sD^4_h?!:.tq~@y`ICer6[Yvv_\1Q|^3kjD>Gp@Z^y@ⷅɋvDr$8$r|Y`n945()V:79&!dW`q8Z0/x*+ ݇̂lЩgF8|h`Dx+Cz2gef#6(|76ypT/ncZh؊v5 i{D|8ϖ]p?Q2ԮRXzDhTp}?d\c%Bc`y )9/?v7bP;i볻57Tzoϐ5SǔjK68wؘÒ!sjL"WSH"wdڔ͞<,Qm+tq@7ߊmb.M%̢ wGLQ@ ²ۑŚiw~YRSJ!aODUl1+նw3퀳n wpk?[=H Xy"1P! Ǐ?#\ %{`u6&s7JpM<[y }0ɡn#\0O_cA~Z$I`)z\buۏ(iY+ ]/&mmRgSxR+ofγ\*꺂pk?yq1Hv^cx˭Fѹӈ1Tvb][,n_glQ>*jAN;[]f%(u|̉#3z :^0Qb>\Tjׯp߫%o:jELO>AFWjMO|REH0gR::_ޤzy@Td GL{9b6WImŅ;OoRW~Le[+NjZ(~p}{v.: |% 0.]zT >lE: :dGp.Y4bt < l*fX*N`'?a|-d7.M±;7SefG_$Fo %C2aaM7yj,XNk~yoJS2-CH1|NTY*AHT\j9 tB q),0Z8JxaE";rV_-SZqP=7d%gy5?!f-&؈I$hxy'hj0䛿DǏB>^F>Eeӂ6!*h(JZyR>]A1;]j^SdT6i4a A?.s;Ϲ"TAj&--/JJG|"irZcZr)[ AEг˾[)k?(-=cLJX*Al#Pdt};?Ț;8:9^a#a bm K*S.ײ6-6k, I5*ʖf:ث/*YPQ/e:DM"mrMǀlZqJ@Yɴ*\8>E8N^1z!+9ؚ>یc,s<vA|cqqϩ~FupRcu,{kO:-gJX;PyPQJq fJ;D:6C6XPK [uͪ~YB!UҞ'ڨJ~Ap\4|h1A:RRaBp:򉢣J+7Ȣ+m}<:/IeN#DӥNC0zF7Ǝ>x!&k2sS%g)w>*zڣM"ki$̒^$Яue y=idŴSquZK{Ì \s XqS$h{rW2#}P-BJi s3R)hUBK,u )A&zz[ ]3AHNb 159[Ճ:eֺ#e@sU9L!*ƅoxYO {rkOCBtfGyb<~wF֪)J1C("F-[FJXMVNUfȪ FaN[f\X?A6 7+`߄s]w?^9˓^`N/x[oCß3^;EXYdZdѮ=z987{̩E]Y%`5:3v+Q>C̀2/EH&lG\ ˄'Q&ɬd#FšU'(n={D`u)̕w9- 48cES_2CWu|[M[>0dGWiw0\.M} 8r_;~|G٘ {RQ?Gg )fR0U, hb04=nz_HM潻z1 [=}̏^)d$Uw ]Q߅ed-r2n27'VC jT;z ⁚cLOgX ۛRTS77wyo޽4o*]exw-$w`fJPۡeP@w)TE>#N1%ց[EoHb+,"Mtػ& _,;v8b j]-sgGcRq' 8%J(~DBմՈQFx2 ޥ+i(lѶho&ofQb.,,d$3jw-J5(^yAt&P:is-;5R^GB *v0pO#': 6b9B|B*iR{~>"OC- KMv xS|q>!`ĺOƓ'Y[yEEָ 4Ĺ75-ez7j7oAKΉmzG܃#0nΗ%3BskR>?Czs/ceUAWoϙ{wXwSԶ>ٟl5#<"Jvj3>/Lhy+{$@Y#$x4ݤD[#<0$qz K5c(:bB^2c=Ԕ @ҴN#Cj#qMsǿ)oчV+7\O [<8Hj$r IXI׹7nsqe<"$so@.e*T!ύ{\Ԩ8ETI&h oJ!w8R)(Hv-w`w}LP ({A+Y0]2B C`^ %k4ՔտrP<6JPkle]Tџ=xdODHvIeh@dR%møoFI1$8T~k/FE (M>BbycάNw|!kB\޿۟M$h>_kãuF%; ͖o8\J!l0^LJrF2:v'hSy^f{[UR/XzlHjz;< (͢Z4^7}2R];ME[AwС×}GRCȼ x_ͻѺq^iiV&3V90⭭qzJn%tot!oT1ˋm(S⍘yS@K UNԲGU4N~ơW|F2*x7 k&U*M+X}}@>;R0Vr *[ecJ_wԬ^,nk/srˈW'Fr-.S NլH[e j5GnF]bf^#c/E V_Ic~ ^s̭::eUɾIAԼARKL`V w7`"K R (=}O3G3s *x|d9pmGȚ>K}c[4O;h gYN-ƣ :M,4{Mח#5Ǖ)^}"w>SOfSVX @ 䤂&3-a-Jq=t\qb,b{6%pv.u1; =},׿slb DSR($6F@װ% giB\;ѭ+^s%;9d[ȀGIt)`xm]5&Q}|TWl1Ӊ ЍNLRnN*h;U[&=LK.GH}χEP7gs @X@P]rfkh IYkZ RS%Y/ǶIILbd c=8SfyIuqW oٞ W۳}muj|މMoM"x@,dZKd%GpQ0EJʯ}2p0m}gR%MQ H2!ы@Y*h '3Qk6ZD`2sA"7':S  ah_u*Z 7yK1xN am4'蟂+E˸#GܒmϢ|p"$Q'Nhu馀j0*#<n 3(bM|pΓ˵650Q}}W*;@Ȓ.pRa_Tb%7s} fMYzuq3ݥ1az<0 bcil=)pZ=5rQw`Axu~\8B(ֺlQ@}-Fi_`SA+|wJ^O眗~Z8/Oy>9POiE-؊޸dܼOCbN]C!QϺHRXjͶon`AoՎqUQh}/;<u;_'<+'KE hmA1L~eH%K7Tiqod`㕉gwf^0 .a.o뽸MO/|ˍ.1/7ФKS(W8&pfg mGԛ['M-80ғa6 d@*vmj!$)jCo=t+X kH=Xԓܮ<;'a~E1PzVT y*eݡ 6#Q=UMtm]WLcVODiէvܮPŲ^=JKC 8' eQt:j/,`MWoΥ\rbq--%M {{{!#$ tds= {֥ zվAiS'T}U3hi9CA9 ~:NkЪ8䍦XG/$׶ XWy^*J)f  w4ֱ)A@ZJgM4¸>* #Py :QqN*bҜc7Ȫi阮[z vݧş?[YL]ٱ\PnaHXlɉ?7qq.m,1>]Au@`'-ȇiȾjӍ&X(};~\,#6x) K]S:Z?W>> L#d2NAj=f.5rZͻHXl jRM5ܹuuvic|ǿp, $h ɩG +lr]oV n\\qq48>im/u27%Kj-]^L&7f{Hs!WR|H{;d q߱gw4owZRt_/mqWlmZK`~԰GLkaeDJ 5 ,0[ċN̤>>x~SR藤u.% ,{u%^¤o w|x3I?8>tNQA:yqnmZgţW@[J5]zvK[+1 (i}tWWv/|tﮬ8n1t7 YYbdjC_IgY/\|'+}U#Oܹhk e;ݰc{VD%miᑺ081 G \S8$j<4Ǝ6WXBn1EPNec/ %l!s~}kc{‚=^Af҈ά服P6' VԌ/KtB`(JSdh~t%avi6ٞ?<ί{Z׀?uU<\R1S@xsC/P`7BIh^Li®]tڙvqFVeE[`[Us}i.B<OS[V`ڊfIw5 輂Jp#]POz%Jܣg jf>jAumȶ lEw'I"qN#X0y0?0c.VȎ?J=: ^8iEHQ@-z˧b.oxPhd/BSZrϱo}t(B{E*c^ mI}$M'w XvtyTd\_[[7"^sp=ߣe?MZsPAc = Ŷ;Oy轢Hqv{VxxTuK7C-X)|>" ? iuBQ^ ~`m'ŒkC\AGff옓<zE;4Q 7sAd Mj`8@zJ^R1 .3Aqw=fPf 76|pIW>z6ɐ=`lM5Il!rӀ3͵3ڲ!vL\gAyMn#bz?C93&rޚ'Ku(̥+Ҡ)ٛd'JO7T2 " z_ZYX=B Q#l-!=I/tw Y3K뜾(-nD9)^[9lS Kь?bOr]pLS)h((•FHp*OEDaʐKJXm>P 0N?0#X=&wW& &jGA6S=~@*vrrӃX!uto"s]~W`oN$UFFUƼ/Sl҉/XVjbO >NiG,s;mgвPC[H'[w;vpܸDiu0@.1iLfTva9Zq˖-(}=%G@ײ#n,7HG XBCj /3x I*|>l2V <OU:]="t"%7bE?ECtL`6(%~g~j r/֩ Q1qϵf" :\p*ia{X'01T%-0@VՆ 8\\c,w)/t`>+z&=pG_WX+=v#K%WM^$gf^cu -0M(=Z ,E0 =ׇ#F ddyM[ӱo~EgZxP/fo%QXn\Mx,sg5P'2:`̹c\5J,=gѫX5pyPd[Ѽ"(H.t+sn?oZuO@uA֪ ֚!Ė9趈ToZѬ8]H& (_- js9z\J6~3[-I*>7XiN|odqa_r暯+{& qG 7&{ɂxcz%evX4WVK'p^As5<:hm~>dȷX2wz5l,S#d|_=s:y҂!mwQ !(HR9*e&|`gSØ #M |3CFi*A.rƒ<1֟cu&Tc wq$z` wZD(e۾ 妜*qia::\S* d6K<7h<͹M6 /(%n?‰#V`=Q1"ﲤ3͑05SJ]Ģuv36&*/mX`-ܢ/ۊ>ӥ[WtrP-poZ%/\.$? Ũ+| .5-_ЉX}y$ 9c#)U } {VTF`\ Y62ik>t!R:pjjJqFRڟ+^GpOGGRhD?ϟǹz}M]1ˤ峃cM"&eHE:3qLim"}^5aԷ̏IɚU6t,UhK"%{N$MntpߪR>'8k: &;~=~M:ٵo_3m45[^֕tv< }}$FU!(dЖum&?A-ڹfSp8N/]$T=8g 1)B`iLzY؜{=ի^t,_&O4'Vn Y6# kϹfrJNA' |9qv {|yz=5N VZ7ӇɕBIrw4: B<*`Z DjxX/7yȉGwcK2EcOFN$;;RhyS} {m0YA V=)TI-TnWEu"gK>k-H|,*&%yG]zBk"J]ǻ?t,PA؉BNZC9VI|C:.iycKv5׻!9da Dˮz#1OAU*1#5GgxlSh]e<_`J>h1*ͯFR,w0z2=2J+WY9@tѧsRH,AxQM.~1&wd:*̙~G;aZl2BْKr'"}8Ǘnjęȯe.nĚ`N9х\Ci0"k%t]||S5Io"Q%'zFD@PEQ4E]K|S"56Q9)JBӘ%Ku2M$cn5Q ,DZu f{]B-Ĩ5V<I&`7=wzXq'8mr5ɋc??rV]HZwNV 96 wu)K{Do.%ѩ2CYd`{Cda1IAu5T]IF_"`;%hKPB${ھׯf0ؿ1{/cU2$~Zb=8{uϲGv |Dཉ4IzV15tЃvIf%);tֽeE F;%'g >ß_tƒf=!퍡R+I 6nZJ!I(nj;Q9/0Pk2?IҠcoPRdYHcokUvyM ؚ/d/Ix]&_joWAC J<2-'P*:|f]-}}@JW/,'b"Z?rc%R(-uJefc2Ix(l}S-gliq&pjم%c΍Vʪ9AG>Sn{5o?h;[pN :yL{𷷛]j0H16 d ⒝N~H*IS1eQ2ƥ 6HnI$Z} U"s@R YTW-eXnߺ}#qJ): rV%8ѹ^O9[c2 ܨk@0罹os޹P61?|/k<ҔO@xvA|ƷF"[7B Y;q{K'KR0~K`ʨca/ji(5cR"1G gӞsN :bА)3/'yq[3ZC#Ñ`t3޼@szcqIjKb(wUY/S(7)zN doLEi7< z(0"v$g}4f AG WóL;fp#nj:-HnB&u قL/%VAҁm/K*h7mz4B0@6lŁg Xm`ըgڿsO.Ymum{a*ʑiy$ǵk)C7x ƀYr ,]:HtE$S?a sh{= %-2"vP]|۶wg&) Xؙ %rIW$_ \BOرtʧu=,ɾ稀Еf0r ًK祊dFv up8Uq{'NY7G9@l|Tc"$o ֐ U1:p7x!mF=V<}O)emz./2ni%tza~4كlzwvAAg0OƲ8ɒ n6:V hyC5 `{˱:ˆ($8 ǃ0(fޥ ,mC3ǎMt 1٬$ڃBAW6 3iJK)' Xlp6׶,%K[~KvsU]Rrޔx ߳bRd"a_Qj}Dt*Uܻ|ak,|?>F6h'y$A*&7!6Z]@cA^8K8tf}\}S/rQ# $ AQDža,EgF@/V ,\9OQk%f_m\0C2֣X0̈Xp#nz4s\o8!VNI3Q j$uO?,oAήя&:eG+ߧrx0|a6KdKմlYlSRed!nrpO5ܱgߢM]/n$̃+@s@|uM̘2{Dr%·šcMGN"57ʐ`Ha.&Y~{ՍPP`)Wv/Π+bL2iJaFf|Zy9utH"l#u2N)QA#B4}ZA}|6:Z( 3pM~H{-TjY铵;wm |U=n5(š!DM#qkWnS5wwP1=͠eb:18PLTqr: _p%ßBU>ŴLį_>ɀqL6ZDEM@QK6 g KXؑ(!o&Z Wx:4TZ&(qYG,&pdE|ȱ:ŪP'< `H(Sы ! DY)[w'Dkmnm  =t(%ƙ8N}?2qe"/Td`8O]qd`FFؑ@fͩsoc%oňR:y0{fvyX:3$c2 L]2H TS9#Ͳz(Jeu.v! .A/&V<[I>Z$X3 ޤk H{)yiʦ!EkX+P}uӜS%DUX nl<,_1sKQ3S? GvazZF a"Lg庉?<3Ǻ9I'Oi[bX,L44#o+H8;1ψ'6],+9[ Ӻ #!;$N!o Oh6 0Í,՛jtk Wԧ}<վZ-$n02OntI fT/./Bdwpl\~}*M'`.mW=t: L,efAL{{qTh(4l٨uX O&riŏY>heӥ4YahrC\;{x5ErǛ|x axQ?tf2  3} {̓ܥaKx̾hP[fXO?ϵ35'᭲LHk;ۧdh:;3y/I?MÛ:BqR#xrSЙ9H'Stl*[#8ףP@Ʀv&Z0 6uG6[Pwl`=ѹMw0E vqw<䕚=u%@r/YПߏ 7Zc+Ojޣrq@x^!b,((mN%/SI~;~6F3dg}-ycEu๑ʼnXw&Hqqrp RleAfwfbg,ڶ-ߡUɒH6 !_kLX+aM$\jK 9gaU0_ ;YeXNȈq:h*idkS~M SwyAt.޷J Ѵud ]HXzm/<,gs*qXCt%0/0FG/c!{&ώl,ⲐZN2&=5?ooI/oWs (Щ(yfD+&fTsVOSU)S-[[yqÐ+no]S_4w@2j_ L[ !]&*c|DH(O#! @)ii޽ԅNΜMEUR_Q#r=+ K1@jA1;Udx-w]TYv&Gn"jd +熰 .M89u0W<=Aqq9@FCs2 jo!K9~ת*$! #V`/ |ÃSn |Teߗ[1"!`qBf"16m1IU,x  l P歜iƘU0xܟ/߭W[ϐphݍ/qQ %tr}t1!}ʴ)u+V2S&BX|3%| Y>XN?1zM>(e0?LJ&' A/J[~,\a֧KaF!9΄5!Jj'̯շ1S[\3MoS%Fp1 {Z8% ܝJRǖl" <n{u Sp$ WSI[]?Mۯ`׼lBG2|lYk_f 1z()E@6J~o!!:(ۗĪzDoZ."HׄLG_YQ Hc8@m+U$7boDAY^rzAѕ𪨚4Z3%HPk@d/{Ria_'w]}SVR.g-A,t n o$KEY[5EuVT$[&mt..gC&%IXƝ1H +6Nl?#:dKoRw#MYx`?GOЎK+;4F \5x@vFLkjd9;ǴA.V& a+yy)+R =_YjQ6^|38.هL͙Jh9 azdҬ/[OMJA:a/Y<_R | 81yVԓK)N9a<-"~* `_4 !\}݇E PA™ĔͅyCpWGl_ gk:kg]]Ї3 tXf[mEn=)dX ( hp>HSpf kA?g;m GI>2BA=tPQ>Jwf\V%Dʱ.dGԉm h(""z4 {&_aܗ;uu55('6pm؆ۛCW`JC+ |GRtzv,Nd#TH!`-g=8+$9>p+"A+펥NJG A{ ;RZl~dx$ēR6fYEEf 3}R4Ej }/:K 2g u9 AJ6(=I[;aNhaB.#Ϲ %"b# a4 ڠ[ ZRx˷xA~#g[,K}Fɔ_@EX"يah ʌs|6Y/KqfpߠF3T^es?vn_D%V2yoGE|~q{7ԍxZmߜ|!]B7G'kypw)ROĀjC0xoZQUP` FFc+D@WF꧷^Ȥ~Ԛ`%$/axca;>wx7Fܞ|μ$,3;M#E9|^ҭSK G#Vڿ@, !$&Gu=+s֤-mبLP138(=87^ʯ1#$MPtUC\|zsU:!f+{k^Q=#qn]Cu@fOaZ]D;%2ޓ5Ke}lF$` y#ԶI}_ ,8s.ō>a>UpHT_!E 0 Yi{ny@‡+/1ZVb+ oI*#ǑٰFGNCHAa8Nգ2/(x"f ̛\1Ѝ#5 <{T|piEZ\Yx "l#9ꈧC*wY˘drXP;`]Ij٫>R&q=\·]Ȱ.Ҝl##|yJD(S@yI. ILׂohww4nItu8?QyLk[9')Kbu^7t1,µsncpM]ν㗖邃" 7ܢaC}dw^P,PćcY- /w^}5Nq>\&%x<9;^O0vF5" geHvs[~*EeE`!q7|ݢKWG¨ XY@˸ F XV5sw?`VZM`W4}byr^&" ֫ E091 v_GyC?6|)e9) bS[h`n#2c-PĎtbK--$%1 :̨ɗL麙@9 q@Lf??$}v%džʮڊ03$ G+o&7 ~s hL938FEBigh=Sxn]O(c{z3A4<tP-^Rhsk%:Ȃ5Bm}E|AuгڢKS\|+`iT5rA8Yd/2j.k"[x[g>ڳ׸#Cz eDv1۝q,Tc2W2-٢^Mݝ<Ց(-2Rn$/V-Ȏ(`4S~CQˍN"[6G P(veb2c݈)Ԏt^z?磍>9iG^dnCjîŭ47dE2;Ycl<wVvY+^˸eG-Nk| @spH:Jpdw^,;\! 7cwUtU]gpYm*LS璂xTd민Ca'G#`tIW%L7o cCh~a3:PgZ>O'UU'. 3d!Vߒ;C*Ƹֹ.p9xd5\h! \c(sHr&`C i *d:1n%.6*-J=m~BdzbVgf˅ֈ _R]/ *a`(my0,%Y.y`+Ū%OZ=": (qϻƳ,L&=eʾlmGuDk0uw~5kuMvTD}!i=FYJU۴W'oВp(j5<ń 7A?%3G~wit:ty1Fn 7պ*9kr:,C bǎ͠^bVbSSַ{ kQ+w0;c8k6DD*V?0s}Slv8kS^P{.=GB霼[FLz[&路v:.b.?ÿ@?5Ƨ<̃XOȎ/ (t$icUYNV#OdS/o%bgx}eE̒,pKM8a>"朂+LCx}CS)1d"XU9qtⳕ1U $9GwdpXW==r T󇵅?ķYsΈ<2谥r]Bif)} W[ p_VC1HMLw^=td#a9?l2aQXIjP{ :=`6_dH|vm(֨ha.cY20FY!YZM >Ϸ2UJ X9c>!l&эSl_ u[PK>I '~lpP?kcUaw^$ɽA35I$ 'HqP(f g'3Mo.V](M3[М,lN1NCVex[5 )NP(/~I]5bKq4FjjgJb6Ꮣza`򑅔|d!Z=<_sǚw޾ᛑAKu4V*ޖvޗdt9:Ël?p%z]1WcI: 2i !i> %n3IuBAX'QVmaR/ FR90ߩk3FmMM0m/n bֺŚ',w$zMw){j8qH0ƫ G^k-v%09x2hCmtCL~tCQ ߱/:DT}_Kv\-Jf") 0s6L'[UIr&u<)(5~4j"W$k2*~jR'! aY[4`FU9,4 |{;?=uf" El0@->穹DO{mg>و˰&EbSlpL 0p$;B+%_`4ؽڦvkLν8߱ܣwq+ r6E#mͯ=~lQhaA 8a*drLWDy1KaЎb@[ ,|~q* }S c_#AK0jr]׽>;U~Is;׌0;|i"[Z*@G#Z(0V- @* {Es-NWaI:O\nxbSa3zgg|6ahmS?'&"p&(Shgǧ  &\H`"x5 Hlh-guY(E\Л%W. S|'.}맑.458 vԱ#@&[o2/ݣ$[Mm |LͦKZ|QžWvoTjKNЬM'>f!xU׹b@ D),Ƭe$.YbJW2'殝:,I`gI(GB˗ShȤ#Wk1 ,OH{MKdܑj@#އ}rv0 [C0QTHys#]v 9Y84:s k.*z(E] J*@fͥ!&+Y뤊q~}.GbEQG~t࿦kC' WtY@wn#+mS7M`4EMx뎼sr }„ov Km^{8;;5b/1 )˖gG66P=e#@a^]L.V^UΤ{5U;D:O'w@<&j)ώ dXd%/,×ks _sc4E[( jHӧX|g,ą˖TEC#f((ExR!{ hN,9ȃYu_qt *ڙˠije\GYgj0sWnS1∋"(<θdE"_+i;\ *lT$.N2Eh5kE%*: (wDQ\p90/`Itv ;0$̅M1}wp6~~p;L33!jtZ ^i+ܠoLwfVtDEÅ!U˄(bJ"%ph~ԑ] 7@]/sn~CS:)U: %`A}҅Zg\LgCOԌgF nq#1=;I7P cƚ󇷌@jτBFQ&f&)͉Vh T( 2q.Sj9_;:DA6 Sw4U$ZI$N2L޻7?;Yfo=YDƜzHe~$}b6^qE9KAgKi;3L^փ +sߢPZX*zҁVP򏉊%.3M* UEaNMfʆOo\ ﭕ8Q-{pzOb?$>v%,-IG2tCV3:LfW6з%).*h֬-]TsROYxHyw5"YgyV=/}PԐq%ݲ#j\v3 `q[Yoi˰&”&sxt줮Blmx܌纃~.6f=xzSR弄Y @"dQ9XWYU"S5)/,|濦w׸^ _S.$3 Ir. mW‡vw3h,UM: %XfW4يYO_ƔS{7Zyw I}ߜ*[}l埁SWtôiBtsxM[ i5vNDž*_ Hx̼f0كtn,Xݒk5p­>mŠ- 1z(S& vZ7H鍇mܖ%2CmNTV?'#3Z̡7d5L,[/ŋawe{cC}lnu@18M.r;^<Ꮥ^)/@F]ل 4M~% U!4VA9|{[>Y{oE{<̃TLڅ )>Sa7ilCuf|1BVT.Szj(vTCh6!`h )ߨ]Z~A.}#2nP;yV;H?Igϻ35ˤ2u Zt]FGyMõMJ!7>):ZLte} $Km84ryI_Q N>tTQ5?hHA8exqT̴[p# ޮ j:PWX|ӵm_9lEq D {_5z[ge sAJ^[,ը HLJFAn"ݷjjB}a(F>^ԄuXg=!-ao:;ٙҙ_81ű@tOۛ>#.P}E)s~}|b|_*Srvw$Ze_Pk}F"r(LO 31)̀*VO6P.7<&iK=< 6NC_"NdEH.L9z,Xb 󛩳|0 ~Qx_nم2sͤ'ZO!w{ ڵDXi,*B}ita†T-oK2ΐ+m;>+nc{6KZ|MSNyJ  -0˥Q:ď(OE~qPTdlv&A\|Uv32C- ND ŻWKO{Fe 鄥 ?bf+ֈmK*|> b-1 ^.+;9@*[1z{E ?IgvFDM#kIUnF s<|+2KXPArsPKy ӓ1}ׯBg syf`0%SYx*%,2[b?hv Q㐫Ŭ @Ab9:K2}o[V3\5A"|оNߜ Ju.>5Fum]'{2E~OvA#ൺ6%\խv,P!!XJĶ:ˌmCi2[mQzdk$0<10Knn]ݤ:-%J2YR{\֪{ K#]ӕ{2T%mC$@8B7:(-rr4/<-_)M$e0N0<_2>Lz6{o|bw!|zUPϺ# O{6ˉ{VdW8J+G_YsR?&le\-X^0b|OQJWHT |X "TpFt4pFsXI=>>B-uUxdwIea}])$ާtt/2/̗zz/}=̊. 2>zÓq, Uw-#j[aCs_Nt]x'sB1FWщc-~zrZwO;ƠbKڔog)*;̈wظeL0ci-# ̌sjP%_?yJ|:Dרs$5PZ b~GhY7Z:Iz`l#4G˭.eKh[b0nn/d* /T7CpP 4}mG -gY<ήLk^wڲ!* 'Hc-Yו>Ꮥp`Ļw71V*G}B q1 'J^q!XGY<Ⱥx5! mm7IG;s|O "i4_)Sp=,`5ӿux) :⑃J+G( ^۳΍ X5ܝq]YȱԼo{ˌ2EnoAr{/9;fvl}Pٌ0yl/ &] |n~4|3j~ߥ `/KseS{rwIST;}w ++S;8E6CaR8 ]Ȁ@> ;pY" )^;^!O-!0}Е k&î5A%t vo|='K?" bsQpD"*>8ul;qTp+ORB?u@~i0ۀ"nfIc]74ʁ3B9u~PkKB*T(R0L&2%cFNPlV)mi'Ԃ/b'x ojQQ_D4+'zߡ't*c~x _c! _۫4QHᰈIsiogW^ʴXC"4SE\Mq_֋Qj҈c#=D(ais9↙PU^|0|n3xQr nk(_ '\Y Ɉ-܃9! hiGNB#0cK+^>h㖱{l?-]c9H[,2 8¯f^6GZH%CGҿ}C}oV`r|?HXxp} UvkI"{\936ظʗ{f $2ofU=Ҟ~WFaDhζ JScH`M߆ 9W@3NO\?jz=? I͠Y>cM|lJ׿D~ru@:|,c圬Qsa*:>i`w{JPw> Ϊ8 ѝ5e!.1IC"%Z/섥P"! ,إEqëu̬`JGXߵEr+6A K+4 e/ygG@f _w l,DGB,c~+7Y x(j}.\Ne]Ć7MI꿧-T8E ?+GdH0_$rFE}h.dc=`ۉNL9-īs3ZwM36TZA3O  eWKdD\y&; NRކҲ}i=:}Tjf#ll*n鲠a^2BS|aEml/Nh [4l'!/0{(+'q6 t<ˤ{5>ӥ-m΃ T0fb9_hV혅c Cd%qg%!@}:RN唃ΒI폤J =?#V6E$ezifBV93cO[@2 >=;; eR3evASPOXwZ,ks k7sϩgg"%>ɏ@w'!YmsP2Olwnҁ s:Q By%!#??tgD y{ԂJ9|iյز{ZRs̭SXrB|*2$!Aa j>`Tñ46{E>]Yʳ+L+Q|f܁hT jlx mD*d I֐d)_= q/ʄm=S8 "0c6%eWK쉯鍅L?ZE_J=xF,xxRlS]%~dZrB~Ց1y!CYc\nj c [#f黎<*]ߗNCu3 W`ĕp0{,fM a^ETLMbٲچ3&Aɜsi\p2b5%'; ^5T RP%]ѡ_o^cqsbߙ/4gk@Rq3lMG-A: 8WeF5+ ULȸi[T#΁e4*?"ʺܲ{e~4oA+cBj2EẩWnJ^ ~ɭ<0*W2ݱy zmmoI͗R0JyQU5) 2٫_3?Ϝ85FRzEwCMmw^>a'{2SVG#g趑5zlNzBIA}bʀtA2;Z LBs?Q Dh]DD$F: zOnwTaZs-֖zbv`Hm$[oDQwΚɺRfowyQ6 Ep(۸+ h`8d؁~=}>-Jm3~GH;4FƸhᱱu㱖ƪ3+/< =QHCw2:TdCBavT TB$&Z\eՅUҟO| YbEaA3(*TpQƭyˌe撆{\ned!Y0gRȅ#6dH3ūJr,U="ƚw>V6OҀN w~֣?E\csJS B%bY3wEnoRt3)vG$(>-J= zmjo34T3MX#̟#[ juWp7K㗣_I׊>xT~B*ONmluҘaẹcQTbM^P#I)9Wc%;B½pTMޚ{?K>%UWRRk ?|X ΁_Jxidt Dk2?}CDv:o?PywI( -? *œχK,ܔtF Deh?c1GtX]~Ȇ#5IFlWAku ^[콪t]-RnpU+l돛w~ʮuĝh'}E@gkc2a>.b\`7Z4VFPi ^*EjV{NJ]榹h&DE|&}S-UhZa!&| -ʆ&+k0.Q^##0Wp\2޻ۖE5zg1w 8W9RD`h%XILa@:EEO-i R͠0ʤ2{Ͷt(ϡfowtM/禆K[itp0zMGG)yr28./6-ۘ"VlpR2ڻk3%LFVJQHPUޭNN #W ݃'MSֹb,< \rv7@K]庐dVD8m-5}-ƀS%$1 CԔ&.YV|>60#ҞfJlܨۓ3pzZ^#P &EֿM|>Ev@VJh(w6w]&|Ώ7(!𠂏@nJdw$FWQpQT'Vb }pwRй4 Gc|>aNY`T¯un+],ġ DO Ө^l`Ǧp_&tɗ)RQig_9VS >٦ L`UؔJW/:8Wo`~Ei0s O2OS:=%"]Y @M]:oAg8dFo>Lw:3:kIvz7Zu @ҹۘv@,CFrМ̀ FCrR};nP0\ {XyeKen.//A!%w[ȣ"~檍i胉~e-CG5䰫7]FE$"glDlsOR|J4yrXhT(}F2!(Sz~0Eol}3_vIr8ŸxLP!t6N 0 xv%,TIX{@읞o 赉_,r*%uȬ{?!)ji#ʠT:rw^76-Em ]V~vje.W3.UhwNA-ˏɸ 1J={%@ud38M^01RF8h\tLP#NQ ԯ L1[H3s<;'g x8p m?j ٜx|2dS-&Ձ_`*&0E|aYb(C/~0tFdi.JԒ`*h։):\˶9;{8ݡ-ԾT_&lڡE} >rP\`e2x/7|ș{oij SϏ֥Vd,ope)%iZYt' ,8$ œfb,'D nXU9ln9 N++Qs#(S*RY[eQ  C]I:&(f25D|!H.jdG @cG_h+=! L,A pEHq/U#;j )dN7>3$nEg J:m80VuI<ؿ3P[p従 &_e'JTגl(#?2tW%=*Bʴ>kyj 5?FJ)ָa?t1s;Bw 6TP&n^xk /6!x`ĩS !3h\O3[s0}Z nNTH(][o<53D϶\]W}$8`Toc7`I*>E1 j3Xth4>Eo¤10x5;Ԍ [o;d'g5&POQ㔇gZb)?TH:Bk4A/Bxэ#򴕽-}޽Tyj^R'%[[6?}w:P#T Wa E*3?PEjp\D2mP0E=1Fqals#q@{ZQfv\+ʷ9h A\ZfXɯ 0sH\̞+ y$G>`xFEs<ᵈUT6N3vZtbPsq|)iZ4|cx,ruHbJN77I(tǀ ſqܱ55fpT=.E»Ct 9F@x=3ZoN?rugq 6\Ғ4iwI.+v+-HeHtwD `Ltz`@m /H,f!6Uo2U1-F326{B"N7WΡ*:U+B,_3ր:Ɓ=ܧpK!ٛR-<}g:CCDYD@@{HqyA6}硯&J%:qF^-0OhFCjHH*!*)bql,H=,еN}XpnK=uO=銂idpCUWh`)'f֑`nI$|FI$K,+T4vemJq fb "pa1V"M%\RA0 kf(Ι?ėBv"M3g: `6;gN-r3Y#c^MCp_/M ~}M'G KN5O%JG^b~Q=~'qV<< Oc_k`.VD@S@bC{e.E6^@_J Xct/`WǬJ< 1}W=`>t`lBGjsb{ TKvaaq *7_|IQ,4r^gj!~-μ:X^EOzV2 H|-LJ7ƚ%rR*5+GecekM\4_*UW][).H_`ci]SYh'ƒG$XUz')DK.s0WrZJuB6}M B1lx$8^H 6xW7I/V_1L·E#&p|*?W1SL#%z{5wRZsIDˊ*L卣d!:UM-"h&o&m07>Ba)bs`_ zYzkvb>0zN ?c ,`Z8>;ci/ul)q8 M~]( z7wE<(vrfbOz0Y NAmus;ڈHhWѽQHHEIp[Bl@^K`uq.N(2~YOjQqҰ )XGtژUj ؞,}T~` &:|TZ e ZLiX*;!ţm,wqkL,+e.S%27+o/#`²b|%lqIM'*p4 ʻF*nV\=(R!h%:`ZrU!QnXtbnxM5G-,(Ym|i&Gzr#\GaQr6v<]WcyX劐-$cTq:>S#1NӔEcbvǡcm^qfZ2K$lⲘue?b*ni2oo"Yuٯ PR֋ךyTp0Iw_ݤ3DZ=d$<_w] ڈu]Z4c7&+#/9, ۲z;tw:`^UTHY;\ N婝y86dENh^'baYuWK"n/ںZ >f>Ƽ S)A"Ń9g] h1쑕O2-͗zV$Rn˥M=ӕҲ@BZ,Y[*㲶7] zrXME^n>OO=pEcjhJاB ڌĞT/86Zx+Gi1aZڅYpt\# ? d~Eq6RxfN]!h9j'A\S0k`=)H$XTzEi| ,`Wm-' {O ~&=wσ"@[JsyB5˛>|o>LAmQ}1,DnhX.!CјX}gSP{@d.X}38B'HNH MZʎ0<|{LmMn Vvpb:}t*@n=x6,6ZEч>ظ͔l5_6R)P#ɰ+3p 7ƶטVa{d2nXJ$N֌3?789>2*$C%y#?:"2:oj%9J_G2z0p0&H `Ӝ8q}'HМn&MH9x|`gqR_y{8)gs:I3N^36¡dT7ajAʓջ5dʪ|Aʼ(vD<yߩ/ j fWᕶ/ Fgbεx D9x#BثvX=v+Q@G Fi)&d+ mJ(sҫC~ж!Wc(XN<悓hsE$@ha K_V= DnuD #*ZfT^1,b/)GWl ~ h<~6I4׭mWbS_Qۂ3u+<֣ aeQKϼy]J0 ZEf*}?HKy2c,2XjP*:ziٞ!Vb?X\~{wʝ zRD=މnyN}\[d y0/"M5|f'!FT{aU*@j_nյ*eF8v梢^-9Mr#E}#o̚&k򶬆$2s3' s,dq넊=]u<ċ'!@ҿٻ^0YJ)"$`LUgάxQ$-IPWW6stY#e 堔a$Ucz9J܏0|V*wKtO;!Mde VUZ0xZ:Vx :d?Gʱl0h0rKG{}؄Η|7Ib;Z[Bi[@6ͶhjRD7n9 ӎ?F٨K,T4ݕ i$9WFG&Nђ"逪 HbZiq*bA^Ioue5@6ʴ{~`<T2oeMO+qIODP,.acg<-|0/dZƣeq,ȑu):3PQn+'}b ߣcA,JǕ4=G.(J8e o>^xOZ1fMķ} Qu 6`keX~7LM+dQ"jo\yX ƺ/kK*-N 9q9505GaG,&Fև+Yj%/5)fóe׶,zއ9^2Bˈ{gBѐfդ A߁Ҋ Z$1owQtrVܔ&2?WÕZ ֪.v "(޻8*E&5;s/]rPNH$>V{F_v7rاw$9%|{Y1CJ _O0`sOℽr|P)Gq8Xvo5gɻeIj\ Uyn1ȿ菼$A1q:[(![:/-[BȚǓd,[|*~AЭJDQ"2UFJl^@(B0\wI;: !7&`s_>|X|2-NDOA,Jcg,Y]2^uM1A~PC7RE2rY/D4EUIJPWi@ZY1s5M*f?cM{e=.OH('@&X-^\`0|i IT}wWY51,^JiRI/.%ÂvH!L1m >d Jd麊Vӝ<! ~M;C#ShWY>-_9HXaݔ׫ Bjo-֚MZy\x 7+3X,2E!q<0o&B rI-"T{Ui ԣ6HaGsQA0 Me_;*}z-"WL/WH@_*8ZVp OUaĻ\%LK"_i;GRBZuT;Y !VDoo w[Pis~sECl2Bdc,H0bE+)!TAh itY8" HE..͊m2K#Jԃƙ#C~\KJ^Rm( M Џ%my ^4ˢd:|pцP iT1tE0@hI%2/%lӶIm#eZdLVnc_ W w@bK8Kn0b5ڤ1 gvsӃV=Ei2@I8?/"(X#96 o\Wi~|JO_?:v,IeEI*cJ^p|,}7" NED]RѯwbOV lE$5KDe>D >KYO4GeB‚Ohi94yFs>ϜQZSpFѳnKk Ke~R _aCTe.y'0K#vW&>{5+ȟOǾ F6舍޸#0{\el").OJj(Q6ANܶ-U  )(6s`0ki r -qˮ L[էšt[a'&Jx|N Drif ^WP '\vPExӝ+U͢'0Dxj}2r7s ;3nXWW4^ut(8񌡣a$+/x^/[%ɒF{7;_:hy, c.L]2w9Z)Лlt,fe=,7.^(4;<`[Z4k l ៊zc&cIWEȘV&> ئ,HPBԕO!@@x2LDcɟml}r s0b'^V׆1KdϯӍZx&""!.FgJ?/Jn]r˘qa3-B0['{ ~ni9U=UŲ/ (^)AyQBlLcMdߍ&>#m"'MVD5%1lᖎRF:dIN;*9$+"qCuq޺9 nF֎c}AD9ׁYW'qy'1&[tW~E5 SAB[Y{Z^/90W%ȁ{4ˆ;9u&EdֻYKz\"( Q.xE Mܲ +{&^ DYD5h1f\X4@T9S39*+]R v}(x^%H)9Fyy"h !7 (Z 4F4?mWe=)]agc/X>v>X-,%w(%IW< x')'0= A #]rP%^;}F*Z&)xX7T1M;+pU m'8,֖j\%]O%`1evه+ߗb d-U5G09iPJwtI>;?6g O&P?ϡnv*)˳ V TɞP[YC_pَ<ٕv\T5acɌWc+ OZ%z[+Q)ł, j9 MUJH ׎"e4 1]Ċ(u$㕐lqwc=W;"5& j O<.?8, 2P2x9`mty<) M<Y{xK@67 5LB@t>|oҔGie~~DOZt-)3(Q).O=@✕#Ʉ&aבfx,٬(o|ǁolɃгY Dt@F&ɥB=[uݡ ?nX R:~9-_!tQ" $UQb BrawvJ Fm6LS7' h&ջxb@. ~Csp@!dR[UnZa Y/U*Lyh}%^iF 7O:$ͣALDU=UȿyŢj. =Uy|%j ?4Vtir 1f?d@4խ#PPĤ|t>FH7voAt,(҇ϋ''t:G\{'AYNV do>gcINgBHfЪwpOY | ۣ"˓c7ЁDжO vff8On)Fp /-bn!t= lDV]L V(S d%:U zyH0sZwer`qkPF*gm gԯJ;diA:/Xl3$ZTY力vLoQ Ϧv0L..OcreZgzT[l);` r ɋƌ JjʯtR`w-1UhhzƱ;j骔~'{CoURDY/K͐,~~qjt^l9 )_M y֗`;J f{Y>C:5m",f/G ujQdbܡa_CZTZ2Kx.)IuJ6p $WC2z_pRJ]Sӗ+Je&ʥӎG.lD 3K 6z9$Ƭlɀ w-7زDFpӰڅJ{W?TtP .P/FogB'hqD-KƊ\vg܂' 0 rh!yӱP(YIn_~Z.lQEّ/ȵ,T@y.I`4|/ם^6X^9(&"C^~(]G(OUh{:-\!ɱ 7G% >.kW+m2ϼ#dxE p0%Hɩ0ܠՀYKPCVS“E!&6r%?=wocm POH!p1! .d? 8vƴadEOllL6 \3w "_;o8D!W(X%5J0l\Gmg>3#xdbtϘ ulR?^3^ @>g_ߖP<|{>JjZfwɌ^?e} ҴOmq!pۆ@[ŀHr ޜCК<0P$"`sC̸"pi8);Sdx, NObj`v>o1|FyZرmJr IV Q׆ 6sW$G5t #@ljw]y܁ 8MDۊ".T-A>11,vi ZKh">c;tʵ:U:Mc`H"LdtY]vӺ }:ONFˈZA@²;Q[g-B 'ZY֯,JcZ Ӗj] ",6c/uaлȇe"ğ:?FsН/ sŁKة5nlF~w?Ta _]b[,5,cNV/(ָn`|$VXqON 3`K٠u vK.t[y7B-TtՓkloJ48{v9#b4b iEtZSظc:L4"ә>Yf*׉GN}d! h ĢPy&m*s{d}ğk~\e -dPxxJaй]ʍ6us[}qL4zC1cTM#Fb_?/]=mk[-Q-U yL)~1b݅@O: /M!AY,'T‘#?AXJ0Kqc[=i@< i?2!.ϕ+c9#T$NU q*l&եF>9^婣d>jC}&y"-=R/I ![(#E ݼ;|[{JM׊f(b[Qy'Ymj~բ*ƦGLl1 ar%B( i NiG5xQ$bY Nm!lz]+HOMw|ߒ%$"BGHխ~_nfW>ʞ{w1S[FZe{=d6 g@(ޏ"%XpnԢKjd"6 ی} zuwys`Ք͠%?xeU9ALѲP7\bh۲A 7y O˃z;Vfٮœxְ;;<ˎfOVJMNA?9Bd"C'_&] /=hn2>rG) Q5Dӹ4O0&IgP\AX! L}0vݗ iGFĆ؏y(;ƏG0oYz+F:\O:)VeF u)s =K lpmgSƢ|-CRQ[/f TDNg; 0 tyj;? #f%d)'w>~O'8.Gd%? a=Vfƫ 5yvmY7u5L2"71]satk 7ǭc=H,sM"ފaj !-biWϓ~f ƛJQ2fdȓ_Fkrr"~'(a8Y ~ |JԴq@@k"fEoEA RV=~bi! "Lbkx<j#F\[D2jFAP.$>Flf|q/T5Uj}PfQ <*:v hrn`Rd n BOޙ4V;OԷHǐpRmSB@$%ɩ9 31 br&%AH+(εs%dL*4Ix+)^F΀(\D}κjy?Oix˒ g>:A6WOM$qt>5Ņ}9]\ ԗIt.U.=kK3^1EMh/9Qk%w# QUuv d!leSf\F]v#iGJzfZm,8MF9L^3;u ѱ>y2崙\ԏ.SB m<&S$wLs,dbj߇l=uiH-BH+5, ʍY^@אR W8p5ϝ[酀*A _$+mM9#$3jZJ f2lIC XZ"AEgmJ]à DdtUk m͞n!M_CҐ0<٣ wU{alPv-@mT'ⴞp۳؍:SwjʹNf8k a& ~Y[Oz Loݯz yQ $k2PR@p,l!$mILHm,߬oS_dpG֐\V b:zٝsr' Q-Gw.z/=iF;ǼUi/RqhjŃjXynOLeLֳHZC}Fp!rP69L\>^H95tIkdlʹѻI+o*j{j\q\a2z\[{ [ts팫|>&i FpG֬u_JүV~TBTheRВHt[-Zzn*1e~ ~1 2otLlm!{)IUj bA/;TGB`NX NwӓBEN~PܣQk(=SsO( ϱ{dDx, Jn>G\K~qxO~i;]Wg?'u2JF2a7h3rP+O hZ>ͽhrD@ zˣnc1K-V|]c[jśdD"L+,DrUO@45Ƭ&[c(?{q0SA +`Kv"-g˱%\Wv&nbyM2nƎ/v1zÄZ}ۈq-eqg *A+׎wXʮ_VҎ௢ֲ+ 퓾k%#i\Iķ>Pի79prtLȷqJ1i\ Q<T>Y$Iq'Q0DZ Yh.qMHTjdwj}x̖`sB4;VΒܴT9@Α}7=ؽ%t|F]!ͺ\~qrK HN&r#CrW-"4;;Kuu-2:Br{xJ@J@prѬ[zxkD#*.nZ"6e)4QF*^L1O?=lA7{BWst3b-p姂-az4mHd[ma01u2Mf9痚>"o&ERP ?/^'B93L;zΞUyڲxbr1o2 O=otoG]+CrqfKlaS>+YRS*kCޓw{[=Pٹ+p,P:~3I.|C7YU\d,pC8첈 LJdҊPI2DvdFĜ A1=X;|csOɝ2}"XpPRu"%5}?p2*8Z!x+ 1 ZV-n]o*GȊEyӮG"B LCs.5ϭ{4~ݸp289QWړ̭kg4Pzz12=-KȂkavo#wF݉,=o Z`Q+Qx.LT9< p+M [p]0&R' nZ &*2[U)kK'~a LΎQ x^B+e  pk`DOal!=]0Dٙs6[[ 6(d܏U&,;9TFWh> U,䅛'qC ةvüP:M ~3hd-mJohE#qdj!e9֯<:/b*!2sPOW9#? KnbNQA*δ3l~=[ak)˷<B$AKBׁlNeb,ɸojʻ8aqB95 @ Z? 3 =i٥IUYJ=* Rq/~GFcJ  NK!,cY^1O\Qj~HYDaO_9d\B@)/=e'fk݃} w|/!{k3;(?fҵtYq^ A֨%X9B*W|bÌx3ZSŬPk bK":7w{ڋl}矕D1O3%LVjEMuoA4Kt&ƟJ*;"2e?#4̮͂ùF-Ody8Xm-nGFs2}[E{Y'^מOWmz>r2da{:ƴm]w$ߢ7r=&š)KE*}^'/k,`SE)hJ[wT@cCҘ\}0q{ RI)ބS˚UAڗ)aGeNfn]b+psSr[LPnŭUn!%VBQE{&au>l Q".Q(M[ƞbסrd{~Rga4m4'H4@ߘV ]}~TZMG;!+w z&nU}F^V:ciˇ%1 ! wXE͡*t@vF85-5p6h.iK Pg _d* 1@tvuS[C}PmC\<KAZҹ졻e̎#U*.G@6.~͙f^Rx#Cu >a3jF9JB$-g Kd=taɄIzMQ?͊yvF4O犿xZڦC3r0ʭnfFdKB 6P=<ٹ3oѤDY/Jxֹ ?ɻH@Sn_ERg=d {b~XR4ߣBpdX5rk |-/{>+ ylVK 3D;7E]Xݡ 234CJq>[l[B{䎿5pGѧWOT/?6YHιA.?TP*nKuL!/lۈuO~pz6Sz"cE`=mAo0%`AӲ~0QWy89۷4E#;roz^qIז&a_ \gmjvGLװ76ms Z.܃^xٗ>ͶW/c^Ά4qNz-o_IJR5 I4R\>kY,bD7*4Sw7AbgG>2`vho\Bi/{{t?ː^SbN7dhgIkJgȮ<֒_0JI$CWރ˻s~sE`XuHaPC|5\1[T#,9r2qh細Ҝ#1[=Q? qΙ64ֺپ|~R(T # ,, :YA ~w&6P9퇘Gvju l*%/ɽHXh&VɁnzj?I{%#V9h^?^](ʓaҹ^>5VL-tD A4yIs`$ m.`:\-g<J3aM-5ו U* N [l|v1Z>D!fQ%G l޴L`)dܚ2KwOM>bϴteǛu \?KI[A-?_YYsPY?r?fa.~NB6Mƛ.>{5ViiZC]h$ z]*~U!j`MW|O[%?v l,oD Dmp3쳛 ۿ0AT{В^ǣ4bE\=~1?"BKT=h:<հۊ C/3o2W~odH̀!c!ku+AFwG@Ċޫ|]8*R*zi.?W$u,m4_8+(m@зn:CGo|7]aPQZ,/h QΙ{{vrr^ٛzW\@p]/L嘸QBlѯᔈdّ8 )- <9&5R3\XA8!9b"ާXRBe."qsAd.mGK} W??Sccrwgnlў ӛ\ ”>iujEʟ_]j,6ĩ^؊QG2@xzHڌ-<+VxoѪHCV@e2r[PyCGn7fE= (F108t='ޯMD.2~sn%Ξ|n#o-a=s2͹ s hVTLu=mLjЬBBέɑ$BO^$o&T`oUwYF&c,Y|YEGYZWXSۜ_ ɝU)i)B]7{imeUT"x[X'$P-:rGz0+NKdUװ/XQ$[~wRBA-[͑kXn4Y&^gEr>7p\A}hM2&Yv|L#NKcq3jqYtg} $ģpz#%4/J>6U)C#<8h i1@H<VS 0WpQVqlbX7WIN3w_6ǃ2^ſ!(TS1u3F\pdƐ ?S( Zp0 e(]NxPJv.;`E 7Nw-a 0rbRcE>]`{O&PyBضB 0Nʳko-;d)>Rreeji{W,czJSLwsinX̗/iO Շ!`JWGQd;ф+!X#VNۊ*FD?v\UypomJ/,)'v"k@$? PE7|`ԀlŒG"mQz[p4頋)2M3I+CFi!L]Q%" 4̐k*Ss&~M7ǼjԡrNj^X!J7NDk{)FUk0:j,{jvwS>F>z'S, ey i)RFvs3f|b p(h#/CqMIXyݦ!.SlJ] uзѧ9SC` (%4x w=L w]=oyجDuDN!XީyZ78fv.9\FSoe0@Оk0\x%_ԥ)(-r;AW%t틤EߚѮӛS[j0`+Jk !E 2!NTY=48۫RnT gv20/iWdTnИfV*, ڸc-?N Y۩dՎevzɖռހ=ƨѤeHBu6^x\Pla.]aPړ>4rmѥ 1ǣHo+9֜h4gEmseqrvjyr?}1*Gq/wjyXhdXnxezs6sk2tU Z%XKnZ*HtTz NAkC6P[$_#c^,ю\afԁor SorwIy0VE QAʭ D>^m54VdsGo]Y0Ő х.ڮ{>E~jA&+nG"^G+'S3Qn޺{w$2ҕd)ݼPzJwǣ/&8 AѠ5W#N#`o^ڈIa {2a@e.FX}!Օi"A^r>,0a&r+o50ZI|VcAެx4aцnB7תQ{ ]'oTEcqK?}ٚr%&*Qŵh3QƟPrWaҔikǘB]T I0@tӟBm?: m1Eʅw>QwN"몄LƥFd ˧ƉCm]*al;p1~Kܾ)&猚ڄVo޽;(G`BY+cX%RPn]7U!5Q eN=C+Y?,Ju 6,"5UUYU, 8)QtMg wO$Gw ٻS={-b7B+W6sCd\~fm:(%DZνMU?AUWXpn VP'rX"=f afNu ] UOXmv !fǫݒ,̀x8@WO֗flw,RtN+~uh%Ԟ7eE[dx7`QWrY&Lus?[$7΃ځndM\5{ Ğ`[c<0q8%bԄ.'r| ^D"E'폵򊥻hy4ȑsVBVcku_4R"!Ә3n0<] us@a{F=o|۳xyߕB7y͟Dt`"'ZլRAk#lKD`D=T,Un.>*:V8$LeIw)MWau98 mVkiRw"0sH~x+ n PFavr^>GB>Ԣ,}Ei4qs d{,$HZ1hlWnƖjeyɞĖ(}:5/Mm6"T.t{XHtԀp6tŎɢQE?dAQR8}k(1 /klP"! G q0V-޹]$ Z xM4Ni!e#=5OFxw-MG ͖`ʚYOYO00clDM\' x4_xb糍8#@] z{CdL[^YKJ+ `/~\Ӵ^n ʉ^5P$?jd5{yyH g \{ޯiEC9- ɗQGv9jۅ|{(^Pp=,oiY Ӆ?" cZlc_8jHua:RVX$-##ڻDīotUo-:ױi=Z`V|+®ND١Ga{5@W" rjMD㧓HD-kw,)`Z'vĩ~ :^kBχP"'EUR5s#j&aD4;t l"ʀw$-;èv;__VMQuP*aXf݇ΥԝOét6/c 5uV ke* /U֫ȸ,#&_Ƣ񶫁*/>,` x?c5:͋KZ+@NPE \6WӠW<ƍ;2#z=\okSxy&{󭵤ܕJ<:EPcz㮣/,hأ@ ZD?N RY+_c.UIPR혻ޞ-bqoSNP&y>\Kxz=sUD~o.{hZQ@jyvrJJ|<=CZEZ`^c\-ư壑/5< Iu)aKebV7:h|Gxz)5.)V懲V$QtzNO(aOAJcuv250Z 2󵺜}~3% Ie\'9UahTG 9[Iw&ؖC߻QT^^1zc](qkd%40V_# 7@6b-]r^Idq 8XfYehXHl xrY$xZĕ%4(܅I5]*jw(෪XDЄǥrE2]8Zcq؊Wc*UȆ+/BVbJBzϏ֖8L6>:PkVpYUN wl!ě)Ύ VHwtʊ#m#PCXD֒KZ>FC3 ? rhr`SRg  2hEQIֆ_&H#ˡEYyN#(do>2\ /?D5?:VZE㚟1k3jC*n˯[?dqD L$Fq_黆;Yp`D-U6"'q}wtu߰NH4(eNUax!P~6X˞r`H^]tRB:*zCr<4npX*T>Ym 3?(( Aw !&p,e@#=XGO·iSڰl~IGR"x{Tۀ1Mz[/7êx^:E 3qg/#vKhTL}​u^1`ڑe ~'58E3W$h;/[gBl;1,F/bM῏9lCikܕYV[\ѓgƔ' b&X|y\Z-S鰗(W]n!-恈Ov IW 9buEIx-/fO6 s0R.?%RAr 5|)1̜TtN/F]*,Keo^A]l!߬_IN_d69=?JIWd֘}2 9bq?=hl0b}^X=Hٮ:ECKWsV)%GW}f7fH/@f wfmɥHJ"ۗ6n}cmǍ_o/uεsGIrrp6ӼHFmU@xcO ͗/f:>9$H{/n?xq:DteJ֎iۛh1 o, \& PH3^~q3^*`2qd,-`^vXPl XhHD5"ܾF`Q?Mڪec6rpHHCl]U4nlUv0vP[Bz&Z${3%qRIi1w?d:]L(#bUWUw.N>Ӟ<6 (U2M6oE*6R \&XJwJQOC<5K Ef3-M%+!  u<-ά&–Uj`n IFT2@r>&]nv^'}h^{2ْu8.\.A$uG6vEsO,vS扵wyw@i77#NXzԛ49TjʘҐA=U-z8eHw4IϗYx{G\h\:ݚZZi*FlykfꫜHݢ8R}kd&;tew i/WdW9Sd1zBb@G3$~n˄D)KbS?)0I;r-9ܷ;~`]t;+o`2sk*tZ[EƮVvgfG㊧e17pnWwS ֍&ϟ3m␳^rJH)Ssf2'TT4)=M#gKOz>#h)_L:LPn=}04cloJuv(}M؁}il~?, p;Կ5A< FPQ\@QU_5J%L'-l`ڥv[f#|z1Q a6;$N a9d@<'5fs~~ `S%qhM9?6 A MG֡IdG{G NjC"^qsжmbɗ^"_WhhUv0tyFd6)zdh=m9>e婐Tgh2v}fPX8rل;I,aP}S.6|; rmk!m~ISY0]\/r|eV^"XcAIp݊ZzY$^ƴ#4,J/*2DrhWbkX#| W(&ve\ҟyI熜Rkj]~rr)n>8sdGMG`&օWUyy>s{ .dx>aHݦSܴ $V:e\8*FZjʐ|)ŘpEf;&nesaeR~r#X'@ƨEwҀh~2#dY:vѓ_f̪q&Z69Rх+pEˠuP*6@BzS:sz6Zp0PKh፣gJr%ZӜ5^fD g_Wd@t RQ˘xufE" DWM2-cSJxWFh*V2^wjL]F9AtAD7`8jncf<\<^[ &nJuUl} Y|T~Gӂx.rE0WP6$zda%K^B L׉ݬ5Q"0)Uŷ3#{ E'o*X쁐Xu @0UaM >;K.N;̥Lug#^`]!B-7%JNqB)LY@tSR9Ǡr-L%(R-z` "ľK}c~[qw*>pwȡMHdcUGe+T[ih Ռ5m;N(уjOzֽr0!EyʶPHQ$K*<@$DNՌ ]0> IcE;$ą~6aٳ?U,">;B*dL!vPBpXRTr*n5b*W)LIi0\{~/XEn r~.#,[ZGqcq: ~QX:芤**]OOg)C#?B ٴ^aMheQW;qd4)G O:-""1-?|~׶!NKf{em|FF/AGD:b\E~/柌[H3O &c_[4pk˦~h~sҳRuJ]07/ᠨR]]j,r! UYY&ru42q,3˜S\طR ޘ\Աͥ>cXvRסljd\上6)2hBkG_cJM<1Zރ!@lѾ O"`&< 8Dֱ%B`c4FӰ+:?Lljv3E2!0NΣvk_ h fBҀQ9W`ugPՙpaʂ?JoH:/iRu vH"#ɯsJMm?N% Cծ> {Ƶf\I`q_iXhحDtjf-_>J=Q)cpٶ]7C>vD~<=eL@пxiQoR`*- V fȳ$3 cf`XțHK^Рe8Ln@'ȧBӝEJU ߧ@4EGI+,0)JcROKx0 EBcd١C) %_Vq>4قGij浩D_JWa 9g7njG EoV+a *eA%;[a#ucBPFf=dRk~jDAo$zaw}R'eB-mŵ'jm+ #[S5kf i_˂}/#wȉ8oWq CϽ&KZ50G ތY9-HKy'Z/tx78}cϳB,Luy M? zgg<= %T0Cc y&lS^=qMQm%gEm!A_=AwU{gX?`B)XKUct- teAm ڝ$],AZa2a Nf"W G},3Cn|$f^+Ma|_{ju>YKC9or~ ND>{2+Ab:r08:%]l9=;C gOO6崉V.WetA%A|κ'>ڟOm0OZ $Cʎ"PJRd)Cd>\zZ b2NSQlQ"/"m YKhw((Ϡ{v8fʫx"<_'}k2YCFʹ_,'zS<&x^Bw Z rH]B,t&0yːqlIQg x#r?oVy]F j,*cƌ~p'r'L aFPa5i.5Z+oPi !M1Ɲ=$]Ĝ J\|`#C&{w tTO^!r_RuBkkOm;j6|*RSRJ3:A5@8-7`61Uа707[Aml6Ç֦k Qi#m,zG>KwrӲI謊 ~c<跑V;~'{.+;{k00Rp'|zk#|k 'j{wbv5m&,t|/3~xU&,`h-E0hŸNCdӪ#Q!mM)d3gִ^vE_S ̑+QYdɞoԦԵ%50"XRgʘObƆ8SemjT]N#;zr{QsKr"|-9LhXI8Cr*8r7ՀG(EߕSg+$@!$ TͳqS5NXzn|3#bpFl1Zo$ dŶxaYpMr{ ۳r! <Gh:\{b]ё֟n_ZY cAh& ]G4d_*պ uќ$HW +n-Õt;;aɲ"_R?y7⥏R{`3\ oTr.?Ӧ2dЎ/0ʧj'sJ0ao0@/4D~z<ɘ'8BGsu)Rab={0;)he[ZNgdK!7`B ZOl[V!l۞D}{e{h[n02qit3Tbiɰ&- VـםӔhE0oT$# Nq?¨dG?-`2b~G8!mY:r{I7\$i1rr2^|mʂ:RdqQ8Xc{u1ørƐ3i~X5;@2އ9]FWAU^\kAhA9; u@sI8Yy )^&7r<(Om6Z8uG:)ϸŽZĐDdƾŜ(^#YHЋR\Ds?#w؃d9ى{I:3[L}" *&^:~y!if =>FE죾U* m(v"N)9f:Єc.Wws+l*h62U ˷< ȾvFHv⚎,&Va)Χp~=܆vx"jJƞ#!d@~Ev3qS8SxM`Y~Eȍdl^8#-"2'1I_>AžK "]:v?Y&`sw@PdSK4PJA-viԙ8 6avr=MMiz^rٓ۩"gD(3u]rsL{}vATg-?= CiEj +D$hM )H^ܵ_k2 3N| ?, ,.o,#zeW")mN<B;a!p 5٨ݐ4\caW߻$f++jK‘ $9}mЖ0Iu`2D5pj:Ps,`\r|V$Fc.euE@ a K((B- Ъ^$X*@J\C^_7QU=fiHP ?uQf' Q πmoHڡ!ЗAѰ+/Suk޵"ٷ/?a{e$+|ɣPZǵVշth9. w'9;O7f DMq1Q go86PUmG zMο#7vYT%)tP;ը.Z{M$. [Qm~7VJgޏf0F]q햇@S9{+𳇥 !uƛN*wqyVPr{v%GuAϬgI\ TJ,g>[m#`[|c/l6Py]DcTS.e'dLh4LOn5YZD +Y#)WisƙLz?pǟ>/ȞC KT 8h}w xO\diȉx児v!u #|IkLe D{y5eޯ(SW7:kV+-uJ@6eSi8mXͅ0I0i< 5˄?J:7- nP8GewD/h5( ߆58Z޶n+d;yOf9ֹ}3pv%,Uz˓}Zm9Ek }6%H̎A|Xۍ_zK}zx6AL#'s g6$DYEw-rOB=c- H Tgg!Tne'`$N2\fSJDaNu~t zq SkYJZ\HGٹ CAKCdg!jsDA䂝ksl L㨘轆Ϋ`ϫCm;2{-gC:Y4irhY.@+Kf;^bo>=^?Joy.E (R$K>n RD|$%dekǴ&(w0{*:{'齭A+>5:$Q>!!˥0Zh݋P?=~"6 G?Ku#gzYJ\bw/lפ졺GG4. :R\Og#4595f-Y^ fB>_&_@D;2>]< ?7hnXb~tw9Dn%1#-}$7?bIy ZFtR*j U+`{b@En/D?}^*w$cj$xi A%Tl^_{RK\WO XJɞ| ޘ#"_ \rG ȶ_/{Jf@uhG:KtYL·1ܗn4#I4N)k+W}yevZ 7exjL|)/}8|-#FVg(t%`]ٻbvx<EF#.ff!*Qː-JBs~6ٱg[d<,JpTa 1xG3C3498wGw./hDŽ!+gk̦"Ҭœ$GaAIA͂Xg Q$o,QtS!~s_0>  Z*4;uy8g{vǝo+1I,tu>4* qE:߆ }Wn/BmӹfģW3IGF4! e1JbCz)Y|{6Z*qs&uXz {WVc @ v.bh *'rW,h *`]`akQL-`FR2=FF-@ٍ0~0Y19Ʈ=JħӦS5B맪n[FFCNT;O~-¤:TI*?]l${?""z }SnvQHcfzNڲ@M@`|4Dr3m$@ESFo՜Aɉ#?}-PJwxDpukN;%Vl9:B/Nu5= IDА}jѡ:ըF09]4^Fkxy|#+zP$>?lr͛ǚ 4o::m<)*6ƱO=H Q/w29=SdH©Zꃻ2fA}t6'\fՑͼiӭ{MzpNw}{:Pc)@ܫjbYW52f ыk X*Τ@HGy(1xo] RѰ <𢃂_O;C4ڴ?@ۖq^ݑrc=~{lGwXq5әjlϯiMjF8ӴymCFUwѳ\&s,*= 5ƅ`s` FCNڍ4Èﵥ\Â}ᚍ<>M'pS*$,eNNF_2F6CrݯZReEQh`HRգ|g;?ad_d42kr.į4 Av٥qvUEUQ*54%bܓ3',m O!C[gk:ɩx<0c*W`N7D:ɪ9jL=Y O w@k46H ȬQo߾Ϭ4rVuDYafoK~uF?I^M貇Y}'y~`bzP@9ZVTEou3`2aib- ԂfУTꈎi.^" &7FS*  e0%{O"2N]G3&CkN5"FњCpD(-˜&į:ھ!-4Lo Wk>kԱNT$15Iٻ|l}%(24m1S@!XP*ǽ;VXt1T{uHDT#iS)]@-<N2o#ABA?P _u/.,Gao*_WӥPC]dX6)1{ȫns1vlWQ vC < g.JB}Wpl~R|Xw17KC`a˽tMXtXV'}ê/tа]uYkА-tv=ˌ.*"AԖUT[Y4m xnీ*:+2 u+mk@Gm& _^їϹf%-Ȑ*ܤl CNr^+un^C#8ҲtR\CZпx^Vٰ9X 0 R@iU!ebbQG9Mt-p b-&ÆxuG?*ZB&w6*"@gcKyL54{QNGrɼ} MJx+M./+N'(w>'8I2HfehBp<(yhUwͷ*I^(1}zԢoL8:~}DrW4X \<5I3Oi Cɖv & Ht?47^n3vx5I L 9-ڶhbBzA<#%==3d^EGD.Jʼn/yǬ,LBXA8\1ʫmݰ628٧.j+$# AY0{ވ8F TƕZ&s58]$n1t60h8?mL=y$^,gst;l%ydEH-f'}g~go!ے>h K.KK aiQ?ڎk0 IOi ϱ:VU`ᶷ-w,)0&i(6l2 Mm]ޥ*WF.v s\W!cҎ`al)㦊#g^J@;A a~$t37{唛Q'Wg\ȓl|+a+IevnД9zDk>-ôL$y"Hd̍tNerfy4 ZʱS1/,ا{ʍU9C}cvdC*h*b ٚӄ- 9γC+ҵYOJ-^?.YP]0L*Y Ǵ)w8$V}?DhRpUx3-_Rjh(n g^ҨbGWxJpF^<{Mƅ=|3ov=KcЉ$rjS:+lbvw~g D5T]y "XH; )*  6x&I$y:]|,X>Pdja# Fu~ǂ_< =a0/[n6复-aSwjm|󨘟d`*i0Y7JZleR>m|bR*hq^-nYڮ9&RvK@Qj"ѵ_T2bof|oS$YąL]2VEizg1 E8cNxm>.ȁG5|acI{=Š2L$s^ࡹ+nVG,:Peؼ>-Jvҟ4(RIGRo\eU~oe~7/UTr aƳgY¨k0?y{* 4X %x2J'I9SN;3g6>Pvٲ , \|ɋ2.U_F'(#;T 5ܹFѦMPz&@+.5.x/*;/g$"b*W%U.M&3ϻ =.AY{vM:aWP2wAկ[xptT'Jhb;7*90/ GKnITpeyh%  l>VG]溿PsԞ jϗc(g@,`Q P`N5O>縱D $(\QJU1)lsƞ5/)7O"ݭ ͷ敍v{l%6Ryo֍;S]pրqDoV3f_n3F|m>[LYͥY(TlwlR>{'m)MI?䇭_Q; .;s7rsYӞ"9¶o%o5;L:~C6cp<,%ƂpG;=kNYcR {[uSγJw"a(B^+iđR+E)Z(п)gݸ(9oYApBh>$'# U!C^nJ8sj[X4R\쬃@TS F6%$g'nvTX,="믪MU-d_y4?7\.n/M_#ߞ:G\E7mJٌJ$(S\Bg(6 -igyyJt KԬd='9>@ hP䬩nhygpd0Jg&]H"K kh֨+o..Ӵ)9:0i^Zu /u^b&1%BEOaE1o*oFIn17qR.,Oc a7}?23xħV$h֒9T'0XLdKva]h8ݥob$[g,E!kWt\O+-3~.jg| f}ja#+q^ 3YvJerԐ[20n_QIIpxȉ1zI2$ڙlO ,nLAJ7A8dJژO`=v+BYkS8; .»):p %DmyQ:zoM`?m^qא ukOD^QJu`sj9dUu$렁{iLOیehVFumf3gn[}رYq O_Zp7X{SB|A]h}O) UƎzh3FHz=*σ2y;Wc˰V"{3^:YNH/Aq00t2C򍹾 ,‹/*KryI>ΝͯX$/R%e4QT 4c'YZ=*~dwn1 $:ͮ[: WnM°Ij%w6Y'C"hjpUND4=hbzaw?`6yA$qQ!nӲ#d<[2JS8$3Oͫҥw&Frȁ z*]}isC2h| )@K7`4j{%D$`F^[}\ʯbh=( m'Y8 flu_ m ?+@SFtD֚R{9 YX>j<%bh6#Q9mx\RoBZFa aE^c 9yVJL%Kq5]/#ǐV(Y pvGAD;ڨzmۛ.$`,EF5Wx՜Op84ߍ BuI*o];qO? q= _OUr:b$6[Jv@8c Ig}N^n.:ZAG憆hwݥg\z6`P*ig9V̈́o-d moco~vK˗VHVV57t%,DZ7 yjʎğtNqQ]:Ǐ5LzշL~6W}of .QW×BLy%$*.KʉJ"=1 :1WŤ2jZJgo@ zr_ <`w q7xLm& #@W^!~Şmg/ÂwUEކLƭҠdl7Uy)V "B7 ~fD9Ӹq*^ qHPr0LS Mk#Xjd$Q:aheuaX-ߔH1^ s%M&+ֳef'N@СeͯU6DU4܎Hpي DU){`>1 ގ7W8 IMO;PN!0,Σp\A>SH>KQH(=D \Ms:׬ƤʜC>W/fWf-Zx,OMH͂zÒ?iLKbfu2unx1 Yտ|Jad0m)e]lztx^qd%"f')t֞Ź F9P?>휧#TKȎD9 ɜy(ͽ0Ϗ&z6G.puo-qF78nݻeю2FS|x}llh%Wtx7-byZ){#]Cp~]:]7۷J<"BiO囯 0 OT)NNd^?&yt2MٮP%.':oIM#ܭ«9tkXd5յ -EKUҖAazd o=QYVƎ71oݟ7׳2a 'HIAc*Կcy aV}0najL ]FРT2cP54PponIOE"D¾s Ϳ3npcwΨڪ8Ȥek+NJI~,k opPZREz@5 -ut4+NCK@~GsvlU}J 1rKHuNq-5#cgG*O w'!}Y_Q8!Tm&W5+N5hY"jiPK[;`^oa%=J؛Vn\4W{r,gnKm[|TFO›}BHúP(''Cg|N}37qa3z B}xF"]_e}TXp}2yt =)tKu8 9${|̏֔`5[5t G)}䩇A&N dOlz%p LJVebNֳݭK9>a a p9gN)a9[TBK|,,uSѬaRNڻ^,TӞ%kxGw98PkDXْi+iy8+åD&8W ;otx~: ;۬#_LMvnj98s:d*>|ӤLT `y59d{L dN8on/3lZ a~X "-zZEi~EpͅDRx6ΤB]7ECK[ZkcW].c25 \WTe1|7Tftnqf]mA#ڊa\D4:ݞM ;0OHik2K aʲJfwUsL/QL 8hkEutFKFqQ̻A. 'aڹ(PVaC0M8͇V2ay%RIl DMzN`o_Zh?%O A!&2 Hhpp>CJzF;߭N,&ɩ9oU\T`.HI^9\9--`ݎy+rOPnQO F,{2zgf""L?Թ'";uu} k҅-Fh`φP5UCh%Նd盰 p.'K '|‘tf[͌9FfK摆 *m5tMJfĢ MDX_o oR4n;P~)%_ϖ~8Q4Z*T֖ՂE2줇A[.Qַ>utJR-#)]5ҍ0CR#158v7 L eQxL PB 뷧GFKpͶFO W8Y9q o ]Ka@sg|X]}Ǝ ſLH/VʑtXS\{SMc})‚ aMKHZ>)v:4" deܵѤ+x5^׿ |pZG>APS^PTxt*e[1w)#bEݢ3f-2٥;JVqD #oܚl+v\9Fߚ"HtrmpV7:AL9c]6MxbG˷e7_N`:5D½8zAWv]~@fz7Ew*;7:cTkχ"Y\]o;?|b{fh4} 9x}֩ۘ*~?|;~bTTQ9(iYًg7d6Սo58da)XKkoΨ }iyF5l5Í1FҦ/6s I0Lhr‘ 28haT2%O|Gv*OW^l|}S8r'X T|I0k$՗8,Ne Fj!nܯ0 aopr2z0z("`j㠴o{~kl΂ߓ}C"0(\I0g/ ñE*.h|­5BA)xۄ:MM19HPz;^76†hf=yˆT:X}7>'*YF.s[3kbA&b>PiF5lyC!10I6> Ihleմ.ÌكS+&ou-}!#7xe6G,\˱Z.oy5펩L Veˣ[VЊYiMYaÔH $ UQ8$ϟ֑"f{((ZQ9>R5<9f-IFï۟\|-VQ؝17m:l昌Հ %ʞ7IDD%693q!?O86* g Pu.3͵jd4d;f1N2}oZU(<mE aīnq?ָ_x*$֒.}Oq'\\XoϓO^9_Cl1 Ig0C`½& q|AzM(6Jv[0} 7|*PQ5ud_vu A>ZVE*&kЛE5zRCܐ@&XnjtL}M)я|jC81+/EJ8=l\8tWE*,_Ajrۂ_̑a.eVVJ'VX*J@LJa>n2]z{8XF(A ]T eQO= 2)G̖ Yg },2jiAj6@{XkJpbIp@(#/ h?37sp #AN+`ks] ~Eu\Z. _UM A}$5jcG#u !|{:sR)hF2xh~:X.*&"5qv`W6{=O+5 5 V@.Jxؒ: M: t)>;p 1Ic|ν wēTRX>WEujarge@Q}'6gZւr{nl:ta8c,Ydnry뉸V]Գ ݇4ᙗu%[>ŲS<֑1?L_Mˎ֗2h(9+ngJn3!k@1CWxK% UС̛yfT[/B6|sC"=;vKDm9voqVcp; Lza⢟Z oh$%ȓw`*xv+mX7Ig1Y |U;7)wLcyQ7D=Q лdf=,RRMy!ց7dD+>Xl;u_#BM}H5#T(\{#ANǛA=>e=X8`*t߄ZEҁ&X@1e+Llt[n0%*~OcN#f<$VFm>6l2.V PdfoF‚U'ÞqRoxS-EXg4H{|R]"Xŏlp "/S 3j_80 [W83m-|F ԁc6|ܾjQ$A?̝Mr2ͧ\IZU=qSrw$nСĠ1QV7h ҾCgM#kr5}ϩvک֯vJvVrO:9 4k`4Ic( / +#0S5^6.B曬\q%'ho0zƆu|6rOjZ5lNlES# U~=b)(>{ <Zf&}eWp WlAQ,trbLLnOh ͟Uq,' 50b5u_ኣ?Uxgg9T[vb\!hjCW}`d\'hIDLOdWoDr\P^g 38sCHm-ƆsA9 Ȭ'ڵFÀ例G+Î&Gy@ed|R@pǞ1wDsYCBlAT`k\O`81>A"aFy*A9sUU۝xio|PB -~h뗟/0?hO2񪳛qo4@'Z+˹qucDJ*;R3Oà68ZL:!4VS jg%%znHtEB\JQ!o>8ټ" }^=;wH>R JT٬TC>&h=&ard{z:Bs4@[9#3c /ګdŻ2Њ{ Dɳ6 { kc.JrT2|@G\OeqΟ΀eI3=ZkHmUB5ڇ.+m}{Ws\U%&sV{XH=8%}.t 35Z^PL(RD†=f`5ۧԿ.m1lYFl4Nun*E "î@GyLyj=S1K\A;\ >43x`%b*\ 5K]^,&\U(YxKiX٦` y3k%:* LG#gP E~޲WoqlN}AJ4m o͆F.FYWǐ]n>WĚFC|ZeTDS).!E[ƥֶ+q&$FE F Q1>u}G2X=䐀jD5qͷW{ <nXC7m8ʪo,)2j"A.(՝ t$㡶9D ybCHfХ |Tс@r5Z9 6 F P<4wي䓦_Tlyͨ55.QH{j|54|*GЁwWЕoX>?eJBAx jxC曉w/8'GR ֽJ HB2Og_eC,ga 5-|, GX]a5vݬ:_D7(Vy"LfkXHM&p~fA||fB lڔ*`@sC30U*|EBP=97W[>Z:=(#Sy`@XؑM**a|JF5dYQ=" z1m./)ӈd^X+ۏׂ/+swLGq{dZ5[(,[HہEgC)-HB+=9wUT&Rzn7$ּ gҜ̛}\h/S1lv˚>̄E.F+]V~c 49q8`Wm/kwXb,P0 u96` iX s"* @kYРI)l;;[:6HV~zx`8hG*IkgT]i|zD3YGQdute\J"\y3>VT> NNc[u/][cm{/IivRD9 OdZk\V+cToymIg'6}NF&#}r"ٹ:{ *ՙn…B`);mjH#`3yAU}4'p(IY?OI`D ٶG2䍄FY.QqT6+&,R#,! ޳f|wޯ|jAݠ+yԟzYP#w:tmg쳭!k߽^ty _7h#/~ ʭ1=ь·c#ǒ?p)*D `gqǝ2\Y m%ˎ;7 H*!1gDIIy; џ] c;bwߩaEc#G&^=Ykg)Gw` .eWgV5"3JtcuS݉e>k7I kM&,LN.|x, `0+ö!̖]kc-3ذ tE<|6s#)6X3f1U].X!8ujM*hl>Q "T$i:qt u}Rܷn [$r$ӠZ9E뷯WLuzfYU3/瘙>ti.̒Ԫ~PbDRܑ.]9NҮ)nBIi4n닕QŠΨDnZ&zsW(wj`jfg{-9O,g|:f0P[n x*ۗYX/@ÊeCN*lC2S '߶b} u5`:!ϨN=4^w7/p%%8[wq9+\$?BLreS#'~FXgѡA.ݘN8ZB+!asd+뫨jwj7ŗhPd~(.Qy@c8nÙXhGU;`]{<}w W ۏ4c'H&Y%ۧ־3iy z~Vʷ~yw]P $!',=A.Ow9+:@n$m*㵼)颛c ӜXY xd'`@<-p=ɥ @FevC_@^ԴiZӜ8z|zYD |=1}("Ko{eEa!D<>Զ .j "Ís7\Z -A5+ 9x?))"$fcbI$:wJw {|M LZ<+b嚊)* t~7A&U&My*X&ȢU\SH+6/Yѓw/7HmZ)* 83Ե({:!P>[Lo1ۥGv\:t)re}4U*ܱJ?7s@/(U^b&<(Ug&9qCD`7,gCI^*Y|إO0['#>t$|Z7. Zr= ^\@F,F9K̽qԋ:Ñ/:bu\ ẵ5i|,IJiʅh/l&#eB|6, 0{S yq +#86U^#*%m" "Gj5ˮܚOr^+(jfLwj._rewͷկدQb׿0"3VfuZ|I&5+krJƺ:Z^J0X'(K ܟ| Ĕ*xnsN6N6s[,,Oɚ1A !=%b[ۅ0WtP u݂9kJRLtUg<֨"B;ƃଡ-7rCf-[wv2u"l6%O^ ZhuI{ۡ d=تS: t'.5w0yupDl^s7Vլ(%uQM!Ҳ' 6#S?x%O΅ R %lG埌wtc|Xr35O~I,${s'zXH9\z;BpA`R1Ẏ:g椝 Kn8CpKszw ۞-Q{F* hm֛ h"Kx˂CEl Q;ń9β#X0A+CFcHv$~ 羓ʕl|)0 BV v.|_>RE7`5F:3i9doY~(p $x)*zmڙ؞9c?/~ "ky ^ǸvԊqiwhĐvχ^$NbrU4k=XJe|h_&4#h-Exi^u3)6.Ҙ2nzDp:PFLOh?*q8kQƟS $uj\$1I+XF^}\ qw7/;L>|vOwa0AF.1)z:'B6{&"1x4.%r]ixw23He?:O] x9?}dG@eXQh}8zn;ZӈZƊߞeȨ&Wj̺M:a&L$bRZ,I/'i!T_ Ҡ2aٟ%{?(]s!n%#u8)C@V )\&;jnD$.Y 4iQZl(/q?}w$ǣKٯ✌'40zm q?M6Sٛ:Fi]YDc BpH 7`f7B曤YR/R۶p^t:0efLLSZe\  u{}WS)!i&eau9;4#6 =>v<+w?~sĺ`& ̭?)'XtMv_% b>PAdBn/|. ꚾlZ? Lc @KHM4԰ّ聉OH5-?"ʂ,$~n/G.JN4?^͝0`ǽv*%ZnyB}Rt}?FΣWØ *r߈Yh=8v:i0웟]F0zq1S "BRGA8}Z2H0o!A0t %%yUAVvx]ywKh}ɴ$[q l逅*DmE./wϖfh+4}ݏ:wb#! _ۤ6 'W]!W ̽WDثM!Ebfn[DPU FUj2]t[pbH;?1#ZA 96F#D*ZI{2e2k1˰́<)V/,?KYJP̳æ56e,@jE9\ /a2 *ҏ_e>ۦgA+\e`pv"=ajHvSoof"ß_N`bjDJ|-9 ¿/@.Clv )8h90I4-(>-kÉe(}VCb^6RSݴGa|7NC j-j\e |6yҚ7H/UJp<o&(.LX܉^4 he`}'ir )-gp7"/H!SM*, o#xw]@4@$0DlT`W>\@|,wCHn{rgAnaUn-ő"跠Fzu{0 [L~E"aik`EQJl%#ߣ%TB}2~̓M_1e]sA4{dTGԑm{{z^x;L.'Vꫩ8V![@pE1c̠.1;dpf}#yXW(tFxnygh2 n:TV 1I̫EmiAHE6ps˖ȆHee[L8(${pu 2[kY^3*yw [ёNVȭZ\0F/W/=c3 .]"oQ3N"f۹B4 aE}(>z'Q8w); ng"rJóf6i[!IIzSU(j]0֟?0$,+w0'P".>VE e 'mnq#ڪہCI58_[Ϋ./X. kԉLM H]9džL\f&ĨqQV)88pu ~a";t d mMi<-fXٷ$l](EI9ߢbe @keIFa~m$c#(EgUb@#VpJgy*=s;8c&_m̝6`M:5Xj4sl&jcd0c DوP0㖚kW*TE(䚟r'1I{ 0fKլX)" O'ӕ 7h隵k(JHήupﮅx +e %ЀGPwDr55}%¼ah&Ȃ+Bu>; , 2_F&$("iyχsx`B Ef|[s+Xi PQ4Bց&"uf8,~[!4`hI6&QQ߶&O@\FLܡ`4ʗG(n Ӑ3\t~( Iɖb9zoKѲm:B2Tk&viNBT4ٕ y?~;4mΞA 7-ج}:/L-ƥjhpM̡SJgzCdRAuΤs;ccOcBPq+ZY) hWh68q#^.U`G-;px=XoYD:iU~S̎&Dzs_JYIKDE3}fTV3(K<قOz t|I/yk~Sм,%b>Rz'iEJ- V[{TډTO x0h9)]D: p!rCM h0vx?1X՞6@FMo Bqu + .GDpE`?+ !7' 2a a;MwI<7%L5ٷ>%GL-AT^X O83ݝ9vӦq]?'1Y;hplBs8+ZiAC1_Ch:keBR|%'t_uK7Uy@|!Wzn=]7R>Ro-ZG5W)2JQAQ"Pk\3OɩEu-B,%-(N\ ax]F{`gz[1c(9?ﰀWp'ɖJ6`C`k!V'Duo/\⠻3EDIVɖ$j֋@yQj$? A9S"w29*j:m;:"6AV%KDE>lcR bRR>i_|#Rdjߍ4!5D$%&nܵ$|GlեbQg,trf:Ns(M7ɦo:I4Ͷ%}葎4*Sru.M<]CJaSB2!4QvaiȲ+3|J" mtQ)FHҕPorהw\Ŷe ּY5Ws PYVաQ~" ͎8$lXC ]zEShҚvG$oUbo3ZQvSD_ )Ч]ک|B2x$hat@i]t:kI/̓ѧoXY~7)%>IH߈@+Z^GLP/4L>@ b_ap0}ձA/-rEU}j 2P.]9S&=sڔ~vnGs2#S klp$.'JsjQٿ /Ԗwxi\!/^,.;>|eCWd9򣷝oרIn}ۼsӠ[Xc6>u+/ﴞ p@9@Ū/>LT7$MyYfWl]-V$WJ5׻S(Cgήo' ͨ29I߰"=օlCMA17` .vF/|0^1|&m)PK᳧:݈4`D;8ldVӕB)Ȧ,&QL61u 4mt, vIk$l\(@H]r~^cɦ2|.kn)/QHq;'}vw魜:L;N2KnF1]^xQRxb'2*Ӻ[ $b0W3!{5k=_>y*X !;vAB 0KeIք2b); u/Jv2q"Bqy|~ A2 n¬r.+z\'6짘ǑlUqx%͙E-}S߾Ã{mU]v:r'#Be?n=z^ie 93 TʡC-B-#<; o;7'*P%x-U вkp "q,S[U񴠂Aa2iMDň5b'6-ZնwV3O>T-[}Vb-ԼBK64/g:ɚ7>gtNN1vFQL]Tw<MÆE2oGnKZ/?aq!̙>-dk*2^6啕m?@SBv( UTI;#>1fl]m<[ɜ0kqjFU0Ț|0'Z/M~|TQbVxg^ĿTS!#\Vae<*2T :q3>P\E b΄~4$OqռvkwƑӰ,Tbk`>8!!3ҍ1汑FFMI=3xݪgp=m> KĥrW P!#.V8)c?" 5"]*L%zQЯR2U1΢[Q6~FSyՌ%&tf-Kg>_l~L>QRd3fڂ=oRl7 x+ZZQ (~d0aS&s3"Ti@O> @cZjzX,u1u5ҜtmklIbZ̐i+oφڠI^q28T0T´O5-$|/em\]"R4sgJn %;)X,u ) s6SQW%%oMLvAquu*qzћ9 s.ql1Ib5v.rZ_xE >phuC|C}vS Do UTFf:fʔc.B>֕˅`ƮڍC'7H`a[_)X΄`GgT4lOenT/}?OkU= [L*1Sd㪨_̚$gd,;ZirlQ gDr] FH 82 Ty]ӌ}-S&뇨V,dYcq-˛ fDv>KH .F+TRa"ZGh'feiCBwGbM+Ά&ZSi Xߓ ^ѥߡsA c  fE: & fU 1c_L(oP㝠L M ~&OՎ|ӚϲF(ג񦈉BhPk`3 ^\h Q;4Grb*?KAؼ!#b^o^-V11;>N:Y1Ҥbnorpsdr ;|<>= Q9 R⚺%-}&yCbV\h B>c:@wvΦwW!ly2EI4Ll;Z^5w_nX_o-y-)(ѷ<)T}E𐑬ϊpgtE]̝}߅r/y) )ߎP2ҖwLRXPɱ"|C[_)%{_,7-)dKZ[\Z4svjwgޞis}Sh .͑ŮeU |csbFǕ֖"E>\AO¹wug%/Pj@p%aF( odpT8ӿ7 6!OD)qy3{*=mcdi*Íh1EGS͓/bbYY 3ǬӼ}%l2'68'`b,4VhzJG+ P3^P卩 fz%v{$2a"=O:ˑIޭr'b}\`BXF!\\,emH5UR ]nS6`l!ׂ[xYPanv蔃ʿ9` ,멩(bw<$mVkfPŵTh u a?nU4_ˊ^`#ޗ2֢e m )Uu^4gjYqbJQ{>up`d~̌DNܡ8n>k0J&M7 L\mӌ jrY4W,`c{aB.49h+G_v(1n/ Ȇfx-[kul r.>=xItēF84g$K/ڔ3"cF G.ac:hTAArޓ~6n|{wI[V| g n__wHb~LbWO#hR&F-TD!;Z^2ؑkkA)ۍs+> CY,I#st.۫鳫H/ ПYuVbuj72^(Sj/zqżDܞI|%R TeemPl+78a=Ak˚]77dP%HX2C 95ƒG;᧛i,a']?A+U ր1!Fjw,w~߅@,^{5$ɼ:Z`SK}8c+mc;$SG;f'ﯷvvZ4ƁrnA@lFyo/ kMl[DP T)ڂCm!w_A~$qK~DƴəΧ׏URyaZthGk.iuhl\%Sn8f'zW`Mbj WD3r1ƨULc+a(3]R۰Y9 QR]Bl?(QG8hߊaa]UUXo;F*_;$}vIIV-eCbN-6%WӃIR?nV,9%ߪxr7tشdD27Hi C ?z&ʄEG #"]4b] )Z7몝@R!xhdՉ!R$NqܿI-\97ΔprqQZuqAR4bӽ.LSͼ@+r]WvByΟB<75ۊa Y A3V$qpcaø_trF[,;-ɮx6KxC6퉚\4dPB3&C jGvM~B(i߷A} K6mD]̗+6ز GyeĹ@{ 遖 U@3\yY`49 X@%AST9fD28Xr(Fݶ׏w0\3E[dt"Ĝ֨r kyMIZ//0z xӹxDDž3QՃWp'^1DD+ܚYg򫴁j*-J(&:H8)3lH{6!DtoW~ {#B, &;N48TcJ@/q3a&*O%']إOb9]Α@(P.)%9<-rGa郎SQeh|ИȫYE@DH0ؾPi7'#k\lݥMuK)R īqcwč ~^ g@G$] GC'\́2o!ìceM^xYjΏɁJg=^UL[̮ݔdr鴭YʈP84^j6Y|,#_\쀟*hWl8mj&vDՋDif@0HlU =>!5J['/RMin zI$M-$ H4nC(wk'孋-Aj2:Ou«N3U}mSZat'Y",x8x)og֡),6e9켚QGSp19<YJrbظ+SSBÓ*=rug cVCEez/=mN-ɯO3 Oʙv"^psS0N?ʢSKX&qXX?qo<y-۰ÈwuZ awf[?Q<9@# B)huaR HmI (bɛ&s}=&º%׳.7co1d'sFY§_ M$Nfhes(8Yݓ_,̋o2qēt!G%6fDd<JU-Nbc8+x ܫ xkV|$opAlb\Nx|}|OY'-˺l>B0y>9k<a=BGe |Ή/uWW1> jw)*Ԝjco?xUKꅈr'hp:KbMG:SQmްcEwR:֕zB?qq~8S9MCksW#V:>. C+¥ⱍnV Lw7ymM1ĝ3RC"c2$}_y'~SGɐSFBѼh= QB'h JJ^,㌘ p( {Czܖ * { Ta!\}z^p2@0 ZVR8^pgZxA3 K7 qrMx &6>jܕ_k|VDVS;Jw#35[Y}fKP9$t lv9pBM&V^([+ƏᤂH~tom|]8v~1i#A/es}/=zI(l[PK7N'5Nv,mmCI< RH٧u9sF[>Lcڻ;W! wLf&\/My@ÕB _]7JfoEoF*+hh'my)Iu&Ģ?0K.]a\elRNU &ݞ֩4`;fxS6߾1A)Z~{6PED$D^T[{`y7 ړ:yC9D(]IP/%w:+FdKgs?9Qx0Ͳ /#lT7RgaZ099,<ձ&~A.Juys/|&tb"3BĿ\OJ={go@]EwaTt^4Ev}[IX2ZįZ в^DE;-2b 3lsGdS}[`*NPN CHU'-X;VvjpwzEtc-!7fā" oy<̳wă0?]])dbiTCUlRƌe\VP B]UuE^LBB3v6PT~Yu4^jp`50k yB>p L,XƓA'~ uj+l}ʍ"|DMkr4j%ReRV=c2|B..kN΂\xqin)Gl>ZmQ%5wySYqzoxv)?ejXmd)01.e|l:= Z pƈْLWw2'MH_,v|D!x:eJ7LZM@ 1j]fQdlR tͅ6$/ǔFA;Mdݝ|/w}jij_}|LF:%'܂(| pVvwhSUDbBխ 4jmeZSC]X0-'3Z&^ %X5}0n6hSĩPd)Z d&09zݬŮM9cV WU1r4HR&5?qB~/dMqY 8'<) vY魧55֦ˣ<@_ ;7ǝ1FN92FU8F qb0]tVڣtRO4DdvB6%]ԢUgÈ1:<9(h&=Fsv0Jw mTkKZI&]x Ag($!7KZRqx o"V2F#p *۽Ktd<^rH+ R,$%rb3Tb|pYTdKWLyeɐ5kIOIx~nI(; 2}E?"t^Y܃4fs vYB8OcS8(jS.1B@X~zfivd/N R :aZ G&4a5r([52|q46ɭQ h dkzV5F,A* `QS')Ͽ8KΥzrfJWCvML,jêlku(j)Ԑ)~%d}cQRpkl r2v 'TK 92sZ["#ِO}RՄ{;Žg|y菭Dtr1>(~k? l JOv[Xw P.~̲:"Vȅ@^ZѩeQ;Y\GME ԂLv.A1>C0ԙ0Eǀ}Kl>b8fqQs#*alt}B´gx]U-㾉x @BN+!. y!1=t/z[EiS%5APB"]N;h/=j6YTq~j"3T@n%^jFwGuksz(iJ*gC̨n.dH4D=P;Df#t wK7kY}5Cݦ<N$u:N DK|iVMn]TY[,ިK_{ʒZZp UtXbkJKW|PFҽB NNȠ`tʄ8Z|bH~x H-#?/_~}6fs4> ,kk ['[ʣ%–FXJ 7/y#sS;8oMu%Wm\Fڦ`|v (Mym*q9<# <_bG VLʣ𧒰o?F] 'hw@mڇHqSbpo3@Zb5v# D\ǰI2OQ+o¹Up]:o*)ZU%jWt\cDTo,ĸV#!噃6ȭH +vrcy:2+dWptx[~b7|ѨIl%螆2ƕuS`jxkёZ>lT-Lb#~dҼslN~Y}v'(.9Ӊ=ߜ17ӱH}{wqओѯxywE om׮'$}&}q6qiQ[L8e`UL}/taw>!?ms Ep܊-C 9*RlY.Nmz.fvDi0}0"2VM~숣-p axtnjC4>p;5BIMn_ E_Xxf,$L.^x;3ci aɘ굮\ .|aF%x X)G[&j$}ZO:q˂$+O9U4hjsAVDP ;ef4ĥ\L,^&Eݧ=7lö;a"uStf3\sO綰*S⅒s!騯Pʩk->!uE}A"<Rx%<\YfZu[ 4x[iLPX`ةpZ̉h3I a#EGଭdaYg-{f:^^Gn3 (6Q¿(^ܾMS[)3 u/;mUDrްgVr{GZYշ=XCNK@2"fK9x׌]h3Wl@~#ǻqx@a66"ګp/zN9p _ -9V~,|uSڈ?\{NQ..114Vʵ4Za'n*ǃĘA[SH|+5GgH[u[grO^|qH6nMz.$ƧƯ ;gb;L?;H.;9TS>:Ӣ4c5ZU?~T}zDgP6FIZ/b=\D}Q,2 Ic .͓"& nP_ 1)DNʞD@Tp~e(Sy,N@-=uَ2[ޅy0:7!*,p~Sޚ[ XeQ'6vM5j[7UCUhIAp";|$J)+/bQF2H[/ȩwfj~d8$:ni:Ng; s̙A\ѬU k=<7-5|=2Rח4t |fRl4Lm,LvLR =O{-]@#%,mI{ 40PY,;O=܌R2QmUiioOdNv#S#%'n`J:/e]kvDAmHpH^^kJ C3:KL6nCDtwiavN`Pg3o݀*y@3Tq/Ql*Ltu_F/&1TB֖?h3BLBQj_|v6+'Yx7+3 k/9lI,Cݽ&{n,w ;Vp:K0Ǹ@)QX4( ^61rrRC%l^CqxԼѾvJ$RNo\ Avow::q|{שGd0pu]fYA-9e#nSɖWn/Y>cIJ6f dxcxm^}F/G{ŷW?AzMثOv]1+H& ,vl3d<1u[cSfǪ[F@ ̜^oM 'W` J$ֵ>'۩ u慾y<2 uaWVkE{ V >v8:GB0T:QHAAs$\T{o[y7&XQo(;cHoJh?{,`5vT[6M1 JJ͕T~xƧ%r伆 2blD%5XRخ|;Vhg}Ό+BkD]@#<ڳ@ԣި,8% !_Q]hyBdec2/GFEvP>;n7 ݓb^ILQ$?wG,$&y$LM¬Y7^$, Ff,P>SB]&'-?vA#H1X[~w]]i{F|)oXKy RcڃvDP^:+L]-ۅ\q7? i&-E刁̚#m;L;vl&:2b#+3ՉZrH54IK 9y.FQ@ I4R4L;=`n%= &pGŔ\#_5D 7ᘈz3nij=VvA,OC{٨ٲ羧!HW,ۗ9J:&=g#꒓j@esxHxu-gMI7U_5KlKf|_BB= pя ݈eL 2 fd-j kuW[vS2zXrD4u4eє8ԖCa}Vkl|_Y ~ۀ?qkV6Uռv}݂̓OnH}zq* loSh,Xb<-w jdS}[ Ҩ"r ~u]R)`hwA/^v"w"mw54%͸@r q9_E1aٵ@}Qq&a}ՓC(izxdJR~7:RD.5'?r!p2hnry&.w~K'husL̙Z9$<-aj۾b6S1w7U,VTy)."ON2cI.KGn8]SYdK$^s;zݻ3z ×_dz|BY8xW}y"aDj+` <9ֺsL>Q ^nfNA5dfHY6Zhw9W&!4j@YeleHE U ą0h&^xz=K5rUPԸ4y(dG+V?@"I$Cq EZ-b1Mӓ`L>6K0ͅ)MZM+ ŭ.S &g՚ByU28@W]#!4/=ϔ|8M5N§䈨=r1 b .jBւnm[ƌ BZiv(#TT8> ƣn*8j҉P[1˻|dvu}I !k*,nT.Z8YG|in~ U"3)]XѲz,ODicJ '#Y53.˙zR 5P+%ObZRd3)hD 'R^3tljtq̟NYG}9P|ϕeJRzF^)0ދaeouuB y5a`W0zd#qi/ 57Ϸ4fx2ٹ[7rĮ2G1$K{SD szUCRs24)̗š,ͨ " (q]&38)Zz4(P\ iPHF#0亻F_ CjzJ&ՒyNFK&iKb1,Ҝ \ŴӢAHxI[B \{kN:*.A,Z2זYa<%siꂄz}V2dz1V#%"r`b?ܔs&k;bRyr,{}eҷ׾Ѻ1=\e $cW be3:CNNSx̜m U05vrv6lГCѼ;;䫩&5fZ\J%6ZIXF'k)zMj(GL \2I O.̼{9G [Wy4~݃D) ꉝr!AYIHU3͏$2xJ eeb3Xo:H!+*Ё2&xf9.Hq(>%-CEs6>Rs q/|؝t̞ ܖ{>Z79B΢w.'K 5ٲw9UB{`wXut ^_ia2?^RV0TLѷ(=5scW*@\ILV:DW&#FE/ild%=NU [bQg?xM،t}Huai)I][Dnik>g.RV*{QH k~wŵAʞĚ\HPbaxmx#-]q)۷WĴr^R f3:r{XK U cOʄ[6^ƈsco|*pS#}~tb;b/?G֟HO^Xyb78K@% I;4d0a䅝osa 3hcz&VCOR|:nQn>hM(Uij'̅@tu>j=\^N "{ p\hj2 1ϙdΕ]7s#5H)UH9[h%~9*hنsnCd&g) ӷ+aS}G:8zY(>gnf{g>gG."g00}GKtdv~m=]l@QJ#d ڳg#gև"qƥ{*,`Bb+Z&%r<|J\n=@cj Wdʡ7mD7n룿HpeSQ}^dqum3YWp`y0.!QL{Iy:k @fY,lEA g0"xBFdz` #C#s#B'-۵⾠b)@+`fA * |Q|NJŶ 0_`.X Fj[V Qo}-qgI>6` bCFg1y$W{Hm&p ND4U*"3\H)[m`BoT}X3xp5) !o=yEvL982Gg{b[#Kg=~c^\;aou]|o`iFݣWII7F'zT%RwlֿK"(èrl )1-휭o=HUͫPev 잓}Zl=ޖ=-gq?c^ Nߊ/ь_4! nB J/9fuHb?DjnӤjho L#PLB'۽2[9qeÞtm ~Bơ.^Yjܝ"o;r"kQ#9WM lS E1SkΨaR70K!rfч?T/hnI?d5y4 "nla H.c^bRK(e׽?O3AMK hvJf^YHkCCx6{v桹_R=VM)wλ#65y@ڿ!JRV;Hj=_&T{D.TD4 !3}y8n]bt 6p{35FBRTsU 9DHev.e*ن0YuC""9hA`V7oQ ^4#?; \Wz;3uФ8J&a7#VKkXKǒgn9.">Gpc>IΣS35Y (VQ%O [ twCȤ[Q!v謾0n_`6'}kal<^( B!'~y&nVO9fKCd㹰[{݁傂sQ}Z@ Ysk_aU+>d-ޘJŞtǖ3X&0a+REz| L0JtdаJds,dzWU\bs)&$򗵟 ;]z{<ʦڶe ~nᐂM̟ >s:̲4y"Ñҕ, [w<'~t!籠0^u.,$d'ZvH.P~u&x^ZSV|TX=M+ uzZ^,Ijj. 1f Y8]?K/0˺ژ#(nI,@"~MuFQR?dDC3Je^KN}l[O<4UY7LRzh%B{*&%r`dTĎgёߖ6 C@FǂٹO g *Ry^,j)fesfϮFX0ő)n|_b5A*yr\°Oˎu$07}aՑtI]㇏$)u fVcsQIr%JPV,DrAssr ";X`iRLaJŽ^S)^> `J&VtO Vu$TN:g'B.?`Jt˫z찡#'CǮ7)wv o\G* ƭɤ{TmT=0zs|.!j \W$k p*ooK?m{P3mh|-ɒ$'05rFs =?#a(aN@6rbIJ3W`J~Fղ~Q,b&CT&DZTH;;:3Kb G'фUn-ǡ/3 & wq3 C[d>cjuk45oɢ!h[ :K\lmmHz)F۸ Ïd˷:h*! eTS4Y&5 w hQol*b㝵l$wcf|#ؿ0?LkqIN[HfQ~mw"Z|Slzقw6㢌%T`mNi >ط> ƩKu4y.D *D7%rnvNWY٫1x=F*vBB`@ͩС!ߍJO)yn㚚/t渙RI<0'`Yכ<~^SڭC0Nbze)İiUYiIB朿koNڣJWN_#E/1,bF#1;q`fP RѵX>*t䝳Q<>3ռ<)7؈ԬR*94ӀgiHsF1Œ& FSi8`/ReǴGۿi._'Uw1m c`DH&7 fS Ќg=**b m4/Wf`bWfkEVfQ^c!^59lKBgg\\7MA/$> Y#Xܑ^1X֒r221/ﯩ8n?ܓI|`E1y>qKPWW7Q#~Nx/LsnYCEvs]w'Gs}aĥGHXlI>#Kn^~ۀG,:ΤRFqU`%Ͼë*fz9ejtЗkQ/c: @zI #.+v67~-SU%]s[[YX+=5hh?oZ-K`)̥E½ kD xߟV6>e͖{)M-ˍ0Eͽ,Qin&ó孱Vs/ЗcHU'uLoYSE a+GlיqXFEzKGgIgVEE`&#XtǍIsMsfl㦂 Mz޽Vʫ|Sw49! S2X \Ц2_8@[ /XDs>#~=l+KyM#\kT^#_2IzĂ"8uB8 9=@tL<V-\ąfEc :7jtf>i?N=mO/TIjΙJK<٣*uH~qy, #nz1LP (; bv0vl_#ވL ǟ>R8;e6ns~ mA!?HCM[0\`fۗN <˓ces J5pڡRì!8z~Ts?Z.;krt%i86/n,nH;m>Y׬A]]/:y[(4&ǗHe6%dd!fEWQ_1Yu $^m MUݲ3w hvs`x6zt [0hn"?JRjZ#zn26=n2 }x~5uY.c\f[PPa3 " zr B%]M|$Jh/@έg&9bΓDҖΟhi XڭC?%m 2'z7*hL$[Hz;ҁOFsޙ8.$+jϮx96?y_bFiB,q80kw oFLYFj= u::H&q.ѡghb^nppͭco|ٙHШ,8_J؇i'anĒL z^u͟dh>1ހ =(<" &n!'SDر N Ǿ>X٪?GB 6zh1aᔒTߓ\BP|Qk:dںCivo] +ީ#52q ? 8KAhOLW^^\e)3º3.B0khiLhĭvc޺[kN&C~b QZ+~3Fn,U;9(>xʮ(weuC7^a0 9ˆvoz¥屳xKJ>% +. ΤA#U=k~.xg59C5٣Avz|bo}=7=n d˚m(m2,e+C|E*CHP0lB x3K%FAIe 95bao}b36ڛ&*;~η\혆70;3-i4ee3uU-Hp?xX 'QcJDk3)kW)wVH.LA7JB+Z@~dM-Un"( +ck=P &yNE,\D̋)⨪$%iE)Cv* T-E}T'XTY=ۚ|w9bL.^Td6p~0y~yPg]G;<6A=׈f+ #Պp8JxzBSUs?̊(Y9b3BvUيʎN,M$~m5LfLέAQ,OQ-> o^.wB+W7> K]ۓ< fBq{sMoeTcd%Uvk(ǵJ`e-zaw'K%b 8cy%JTyjŧ\)=Ns7;< 5ތtONlrHiyqֆo*RR3/ 쓀o* X{ g;9;&xr ) .AFP++Z Ptے#j.SBaTx 61Ɉ{ +\Ujݘ\`u)9ٗhile [fo&4Gx ]wNZ(EP}D er-}_{h ~i;\{m)@ƌj㖕eM9?hl(&oq/y&ON1<(ΏU2jDs*,?FPJ{iNN\^ Pj1n$4?o0ew$.҅B/9.N&ԥ qH @bF;juHFT|={N ^dS2|,aӍ؁j6T !y|ͧJ4V}}ɖQ [l6BPE5*o*EŸ! %q`X̀}zʖP} 8IX&V 9i]ɴ8#F~-Ȁ%2` CKg?UInX8h+C&뮏0)9p=ۀQ-zᒀs1_ǫ`Sg7-[6A5WDp ֜$H8 TdU%,?&TN ΍K4D=.FQ)@𽚔>̠iOdCm򈳺{&^vexVtmZyX/IVT2XOp9m =(TR٭EE\B1{C iZMZ>4La2~1ͩaDsSjIShX>x`f3-j7tC&OaÉ'@˖.;ĸe}ԯr0qg{WXGsiգg}r_!2=g@JA.ٹ`ָ8*?jΧ4xR h`x1hכ-a3+&hyĵ Ft&&9G \@w6e8bKA, zD|c^$qA Ou#|]M; 0{!RT`mr-_p\ X8a)&uo$?(: > pӣ'k0 {Bi|IZR]m%IMb]z807H/g֔V][ ZOӃ_8Qy_~="9k(KyŐZP@< HrR)˽ogJ[:˱";JQC߸U{n/(Ӭ'<)汻FBeA>Mt!ɾk(<ͤ ckU#zCq\UJ?juJ.Yk!_w*+^"|v!ڑ\Bow$ۉI;,L" *BKQsℷKkU PW/aqu(X&]B9:c#!XG =S7'׻TkcI8^b";̤΅ִg3}7*ʉN'pۺ{> Z Ъ␊+hC?%VPN {=nmxVBS\#b6}k1%t}ӿ5h8Nf118TkgxBi&uKK4۔w q=Ipt@r-3BD0UǿXQLG&25(&9 D's.Nay{gd_"y&|u$dQ*pB KBXqgG`9-fWxjPU{r<+=cѶ ǩ?]&ߒ%-:nJ)QJeBkuC31-OTVg'i>)$wI[f sGdN^PݜPBlMAllM^%z/Qe'va>=Ng5O0>XD#fwu -]S]ccCזS Uv|Lv%?}uEY} 6W?_lAiPBs f>La[o{zπI!S +y؄Z(%eMb^ `vp67cyib\$D7B]ԽpEnswwpRd#>*.K!D@E59NXo(tfP2Zw tt_Zv ^c<]ȕ7:jJ?|% ;&a٭.Rxk/c'@:[~]\|e+>!Tf"6ZJaֺO>$WM*!!He`Mz@"NJ/ g^XR𞫈 uOr㉖Sp˶nq=%"5RX䉳`(\Qe&Oֹ+.W{]Xs :/D![ !(6]v/gTKD{wh7M/3}*چakll?@qZKi\,P K,%1)j@A+ˤCIawX<:##H<4y:cS3b&K:%O:,&R%k9.t)T\;frT/|;LZznОHlE]a!c"IrRATFv>&~ԍ)83r:z` ,o9,J-f6k6}`.8+:ۀ֗%;Xʃ{Bc*BC9 n'Tȷ"+e g l9 0~`ZdƄ r o d )$/ɩiP)0@wb҅=%"Js֖9aa"\Ք}s' & 7Bнl ,+5%Z$h.J @u9W%Odf̼ |B[rdBnLz8KY:/-} |GhsN'yk79 >,FX;Zܒ^;H[uw{3>[<3КXw0c(JC_t_%T h.J@lr~ZtqBVF"/ƕ"G ٪NB@!\ wY;T an;_K4n#!W; (jv.)alPO}jz(|5[Yr꾯-"|yX?BY)1o587Ŝ XJ WgEq{)Sԓ]8'?AsnS+IƃYwӲ8z֢Upq4b ?|*_Z3i"A?7\R1Bky֐&r{{Aa@üՔQh;£ ]xi"yʤj,v0ܾ7d@%w?gpۀN>/jѿ(_ ~K=%&(8]Ȃ˟jWx.EH0!!x=0#tj`MX(M'~ftaImQ8\$cE |[dhCvK4FcE9h|*QC4-/V$`kkvk<<9۶yZQ%4N g鶧vF{/]Böv! K΍.K4<"U 6Dk:$Er#xhzN_)L۞Qƺ=-1uGҿjT=IElH->k=_t: IdH<剁:i\{F rwwb+f ,ҐI\W-JqN"e8.bSbV!_JlvpV�CcZ;ʼnpX~3dQlVۜ^`\#ˁ0Pk*A>zݟ|}R$?<8v4XWy9Ry[60#zk+ Nr#EMq1dX|* bRJ;|wM ǪgZvί$tʼR3I15`#8paW7ff(] lk4*.eE,~b[OOilw >g\+:ئ,],+r.)X%sn @ ^ `:"6sְQZvCĽ KڿbP=î AsCy$@02K xZ1 s| Ver$T,vk@ ]>[3| gG]ԫS:ֳ&^I+ktl)b*2rG c.F.pvku!E(xs )og`/Ⳉat炩f֒iN{=^}wJrttIa:p/sv4P9%hq*}/i.NW$Mi‹-+&"rb3(س QHEEdJ1A 4o(PT܉xcXA(HRce Hi,Pm,bNoJ9s4xCӒb$MLD>s 84e587R˩~H@jsg(C>IU"Ƌa\YkqCekhB%3ֺ֕WUSOT>WCD"mdnɯkĕRp|8uăɌy0(_ ͇Q0MAA"%6E'SOJ6D[+oҾG2-ArÖlQU}55"+1xRKt`#L?Gض&e#[@Z𲏾fPjֆPf}*e#'ogITn-?Rȓh [zk.BV -#9,}"L'2[^U5fܫ1ymǵ%_IbAG7w[՝FIV bFפ;d4|>w:o mm@ٕx4A4k襤__.xD8ka`!١pU] 8j\83g[(b&ӓEͅ>W30x2"~]%zpL*$q%RR-ˣO3Hք"`Y .Jf,?x8ґk).R:%`S; @f[R4yDm|<N\W E;յ_XqݭatR`Go~ )m"aJr- \KВ7A"eQCkǁietbh7t禶%Zѡt҂wb Ä&80swfG<ݜ"z?';EPZdg`nrDxGJJzasE qSn%]LR [{oH|:%'T^+π hv$pdڧg҃Ꙗ> lM Q+:~KhsIH0}jgc:u,P7:1JiLl ˔ld(:89)[>gbUY f`yIyX؂ r@ @[&^*2v3P* $ Ʈ?BvVqҪYd xÚ1`:b]nCmBw3Bٛ8pղ6Jia7H$f`P .Ɇ00`[ ,dv'wg*m/LxӀjCM،tPҪ Bȣ?£ JoC5Crֲ}-L"ԍTkj9b)Vk]8dVTwΉhs^oK64K~U8.CC|yҊ6?)b[M%\xg Z^6[N *ŚXz'nxna} i6RF|]:dhfy-s朼Z$MQ z-ӊ jakqa+&ԋy +{]w `Y B7ȬBrZ L+c 8.y1fH@SȬ4kl+,[L+݂Fj#R Eax}U}Vm}1[4_Mp-+?,< ) T$oU!"g )#/t,.RU[՟]1$2q<(tMIwƙf3~@Zc7]j 'rm8gL-{r?9*IknIׇxϑ۪$3YjP;Ŏ6׬1@$oQ3R萇MiC_YgRO;-ƬmnC>W8%9%z<s qnP(&W1~g, _Z7}>U[̽VpNA_A.u*bmKCEGH33//OJ" Zfkk <4vXb*CW2n57 V*4 9: TSɄy3[L +1)o,j/ɉM'Vf:s&\HrIS󾡆yG~bvV Xn& ti̿b{ёs\}slʤ?x3ƓAUu<^kH6/3,f-`mZl˵ꬳ%a;?x['z L.}i'6H{j0n=[XtlF,얾ۿPt~nB%'M# -ALPZmeJ ٝ _wtqS.̨nU.'6n}]On!œ<}aǾKDIOyQ`"Іk:OyM'9 eU+cYIF\n%@] { $jVj @j7I:'X/~,J#`vC;Xt-ݛ%BH@G;yqՀHrZ|N.fBEL&R@abo7CRm#\sqxw!vUTBXP/"իg!" [B͏5sZp%fA`˃\%0'@a.VܖZק=:[~F*,[yKFm/Xs!8Ƀ @6Vz/^i%.,`;̝fKE0H",FHnc"!04wܦ/L<}P,M2p]-\b@.H%2fV;qzd[PJl窛OA+k5n'货RN=ծYi t,{n^CD%H) ڙ6"i=|Ita%VrԙYj@a@b0 qYb~Y}j)I1wʄ%2ͤ(IE'}UX"hvT鏩^4isU S銍y0ˆ [1el55x4p䎔;U \R& S$4(o7]J_CYG3:x3-WD8ݿ2Zp3t:oYrS#$H;ծ :jQ 7ڝvad/ضy{=V"'-'eaяie4 +S}-hra}#2Ƕ_hN5?'tJRMS9 `Vˆ HM` uȟfi4Kaʉ_rmOߜPTΣdM'B2Ĵ!3v!HE)]:A]guү0?0~͸<7(Qb|GOt?:+,ֵPmu.^nOޏ!~k9lA6CiR Q4'Lt 'yȃv4,…}Đ-⧳躐5:i]T@<׎98V[&w'QQL[jCL7r}Iy,xҷBdbUu%m.$֞M즶vsBc+]έ*_/0Wlwu=hT.4,Ϸ?{f8W 8pC;,90S5+BKa^I*?iKrG\PI;B.#;†{J`|K!4﹩ ~ߐ-~_nD .azg\;ŏIKqSU5 ~H- U)gH n,`VWHV)TuYh#KyDm]*i>+}, !G݈l͡ N0kΝ6\¨>p \R;RT/:dJd.mא DKn!]jl7|v!1c/g$jpR&OtD@i UdgDQ[(Q1hs>NP;KMCP-vhvo^&ܻ"(V"vws)n=di u00IP7kV0IsͪY٨,6Gh[&1?׳F)CLB8m%w>f$OѴh+K"yzM-^O@2JCڳC+S-nGWbc;+E[d!e{Ԭ&X.n]67yDXgk%Q/L\_q]C2s\ʆQHܘzNߧ&:_Mr5&p 5~5W?McpYw; BQF_)S;pfSL- ADG& Nl#U]VAJi ]P["BFw4+U}LG; CI.',Ay⃯.'0)ꭶ|h5Dz X=}BMh˸iygKg8 V JiK/75'OIQJLY]—*OreĕLt㸐Υܡ.@qL-iARöϕjmQ+ Db,?&Е??$J=1"jL"ۅ z9讬2U+kGOf-W59rMLPpIpbfh # +5Cpfy_MEXC񻓊!zbkG{ 8?$,vU虗6-wb)bHκ %} iLGXM8HLe{`ѝ!v]1h1ָ1~w}Yƅn97D^{ߥak)dk9*F0YGzHʵ ڼ%U-6Eӱ6߳)E׆+鳠[믔H9?ؚԫ7Y!2L8 a]8L 9bg:񰍯(je*YT7݈:Tb}IYX1Ɇu!EZHdY Xy%~ ;ΰ8Ysuυk݉A¡aaqZٯI &64ŠiYH@9C[ѳc Yk<0d0fͱ5e?mo~9 @1\fE"^REW4pRr!צXM*fZ c9g"/e6#?JS쓃`L!l (5swV&/ez.MXՎߴ%WGfJXS c:qGg #EF;RԧM|Ak03EzFrfWDH*P M7vOTHëv-qip0Dۍ ;;:valͶN*(H-e-ǵ…8C <BzP af> 5xCE18 {Cmus^S*Gx׋B( bf֘/(4θ.5Hփkf%9۸qV7d}¤CјD=}Ę7 t 8gh;_Q{H܍?5 UvN}L5Xg'~#YyRʲА-Cb[  {MC.yTק/PLR3&g0˽蚨(9h27L- Yi%H%[DLg cWSȄTŮԠE̾z L}},͎.!co@@y|9gAd:`X~27ⵐW斍ߴdvUx |zD~)!>!t ?f4 +.tꉝ"N\i"~2F3N>EUm3]틜 rrr?ܞD8,qzFj@XXѾy{WvAupb/+T7GHE Ę46l2>UZ'4؋aKEvIR*+lv W+KG =m\/rCwd "qZD]rh&L,hnP*4ъLUp}AkJ?һmlu:\ a/L燆k%qEg-DeBjqP O4rd 1hqs'n4"6pWHkya7ĬP6+C}3<{URzfLCEMb'묳%S8QYf>ZY NM hYxQӓЙݕ96jIJgQɏ_Bej\+,B}B+T%>4ssn8WlK8TlXM;7tS`L~w_%XàRcUZԨ1 Rl®ˉvCN3ЩrIM>D f$)4Zu&= 8@DJY|63UOg; X^J{qur_B8AF3k4"\ؐrs?l Ħ{⎉_tazJ8Fݖx%jǬIA}uaZsaQɤ-{~rs:X|{m~0l.;BmTT^S.ۃlH]eՠwWwu:G`y9 *+#p YTԙdU~4.NJXR8vFhd(i;Kug8ziECHF4Y HW=fvCIZ.Qgؼ~[0o~ _<,/ۗ"f|F'> ,Ћ bdi>I*gN3t#jG̀)\Ȣ@: CrПǸ!9kHIƒtO:KXnkZso\b8ݯ\7k) ?h4k|bg ] !+'ގHhqF>t%ŇS>Kwj`;Sy84W&~i`4>Q JEz3߼}Ҹ^#zzO/@|Dw!EH<ō~v83*"a@yYCd+:㨚[_亂n?jkB׭ROC^DM/eG |VsWO):MQq5ÞJߴCRaNDfx8<.e$MƗ!Uy| ND %3zCԬSsqn*Q&HC oafDDø`*JAh#y6~p;!Ճ}c@зm>n9A'_7RCbe ]]"ew4jb$JhSݐmbwu螖t%A0-Ȓ낎aGhٮJ71KmQL]µUH4sX3$%J2ڜ PJu |[<~i e;lJK\\;!-[ fq8xp,͡q"$?9NMKֆ%Gltk,>XCj -LmYa[ԸX7%HFIfi{*9=gdEq&f\0 ё@<\>#'MeKB3l-p=j:H}_)y~YZ]it$lUԸp7ĠKW ҅Qf\m562jhX6zxep~N7ש@MMo8]e"j2 qtS^/ %Cme| LDŽFYM_GՊ Hy(n:.Jf3k#-T2MZ; r0hzYwj !kz*x'=b#,l$d c9]iT[kOɎMMΤ.lO Ȟ*i{.-~0 佫Uk\D蘦xjN]!׎Çby_⻴&a6%bˊd|]"h=eac3q S |a6|;wL'Ha\/ә /#9 J`Ѡ.N~9";tNSá^W@,g5P/8zUS &[ E=|0!"-4#amaPlD!KZNVH,Ě4۝,;m7p||4'iFlhRLЄ2)J$`EN{U_!Òyda8-P l%6׭{Ea>Ot\u@@⠧gFj2+ϩGDτv %׀֘qEWB7z iOv*Ů K*ЗDWDàPƇ\N>mJE%.-_G"9ۿXlǞ/tIC8?mLEפhU]DȵbیY[n !]=?欬9KU>?CWP f}7s1GmF`=s}շޑ\lΟ0HXR;䜟/hEI[ly92{_l:i:ˌkY.'{}ia  _8k?s,GTwP<s̙gd_Q0T9P>ƕ6@^+ُni8pƜ ˛,J g9:/8-_*hɠLR"ܙ\+؈b27B4I?gưcJr4Xhd4Sl ?݊bϓAmDͪ$K@#B"&} %5RóR)XR 6;azT4COHY7qHo*q#E;Q b9D; [bQI+i".4 {MMj1[a ( In%Vгc/Adw,g_W}#W=2ghvcT/Bu6r*o~t˭pgY#|GWcrf`X-,X/jǀ{|>:U _Sh,R]m˭"P"5+8;!rYGZU5@2yaj\! IzWnCm\uRjz|CE!ppߵSy,hM(@قz4謨<&u£J6GW!AEnA/uJFMf#.ԷjZ}9qvv |9 gP#>*g.TFݬ#>V֎L |RkgɒrB3dNj1ʴ X佃Z*`.5ipuhLSDb h!@ Rb7\!Fat3pk 1N8|K:fMykS "FJ?Y2]S/;3N=L6Sc ص9JTn{PBZIZZ)AihLx:TNo[я&a=T oTAdP$#`ZX9j=m&U(T+YCl\/.~`PXwp|ln'Vi2\1?ZlMXa>G7'v-\⻖_(Qu%NdeM g ȹg~8Z73-=Hm5u<]ڴIO3l ^iP4,8p=c;㜖inSaev 趠:zmwܐߴI/1,Eo:-dCf"ɚ| ˼laWo0Tth.;wMWsD:5azJ9ӌ"]|~q"Oӣ<+tA~4cwf+p6_ v^3n^'XJ!7E­3)&Tnv#^-RPm^ڨ\*>bKk])]4ǟl[f,=QgE_)+rUdHYՓMM@xphTkNrG)վU!΄dѥ" 2[ 1 ڌ(gjPsWHpCRc.bĕBwNvEwMǪP5ÏdSs;ў-4 jRO ."44y>[:6+({!^rxՒLhfA(XPs_+T,j Հϴ=h Glᳪ) z;b҄;Vy/ #A{ b3֣m,sM n$(?F~ 󀮲͍0z+|ոPYk qsRgYvc:(-&F8#zb&{v-yk GY -a `,"ɠezB ZTn!<W^%Mp 6[Cu 4>pONgdZcdAWQyWO\ٿ~t.d^)4Qj]p׽Տ\SʨFMjwҏg /x3$Ҝ?ɳ O}ZG\Bs i' ZSY2RZ(J 'k("ߦ&TPm+:*مptמ,f6y"(zd'Ѐ. ?Ȯ 4 6q ujU !L9mvM1Dw$I `nN:w~<.F&,wİo,YNÉ3_bHS-4_T`!ᜪ;PKu/NdBUhGޞ7nBb MU`̐k.3)=y`6-<6B"F *x 0s x٘1P+>yqlh˦T1SPKT4-}prdkN ;Y/NHjOeiC(Ķ2P"XT}?hHOkiި ;Uz)Ы^pPL;DS“P1Nмe{cx)X5E2:^8"p_nd*rx𓿍`!}l 22<^*EG5-ʻ`Mň6+\yL ~ Rי)tK7O_ze"߬<;4C rc]ZC:Yg{n%jJR-?2 6d"$]'iӍꮞũ^WơlvJ|eC:Y6hS4i媖V8VִՂ-Xf [*j<;`oN;EM_z !FO ӵ^XvǶ9zZfܔ6Ɏ}HD3ynKL(kO@5NA; ]YsK^hЛIm]{A!BC<'5,h +#m|\Q Ŏl%2U}e[Sl T Jiyr3JTfD#R|Oi)f Qg@Wڣ(ʎ/|J?n 2< 5PSY>ha+懺º`2ө'] %nTEK( 톌lFyL ڭPSֈgia8Nl Cči;Dv거B^e3uS<+f8A8z{5q*R#'z_07EuR qϭŔ\U|Apƴݤ 8VDGRhaֶہe X]y4AMl Qc@ԏ\ v zՔa=R*M߭ 9Oe/Nֳ;􋘟]Gj2UߍJ 8{-DveHS!j"#|SfeZ,p@#IGaZDk3;vsxU.DoTHt:I7{K݈T@6s䛈EȵW~ϱ$0Ȝ>+Nr{4Dk" ]^kKLIG&w!I8nVm% ;0ٶ5C̵U;Jհ&qidr& ʹӬNo($@Dϔ]iLs].\f𶓉.Q.Z9]~K6}B?2hxy kX*]G850:F_œZ8q/;KKdL݁L;ZυvK]mf\vC5o0:fI)wosb77XPjG}bFhڧ]} `p*8 T s#480Kp,#+ *8Ag5Ne nȰ|hD)3Z.s\s՞ePa6G>_;kfIOHz]'ySA˨m+"h"fƞ$&̮! Z{5Fn=zi.wLX ,<3)ы1DCԾCi"WN|yZ[&B7No)wV*9 $!h ӰiM`~/q~ "\6X`QZO6;oDڀP@(~4*834q-qb]ĥ5]!| s oJak7.9vZ .ȫRA&Uq[(wIr+,E& _ukR"ō mpJ܏խ7XU\-/,yCoBąF0Cc$}qzJeO7eX$>O5OĒ 8 +ỷ68bjGC˜`QhyosD˞E$qE_ ЇzfR9p6?%ޗP{OPumP8oVnH&"C剕uE.HyV?{b9+Y8`÷LK ĪBKS[?,NRD:IU>6pǴ2'ԮȪFTzpŅnKH+!1[bq⍬gKçAο(hAHRihPTW}Z|Q?zxgwq3Eڸ"oٿ^A nRK~ZuAEiEr쨎ߘ$Ѕ h;MUc#cn ] pb$@`Y6x UJSωfЧ|Izb DŽ9䈱bSs""Q \S&4~؝A5Xsp&|6I I $#%dHiws+,z䎏9w aww2t36-! /9~YĀǡ]{#jzٿHKs6U!+nwn8Qަ{Xxk1v:(q_bkm \)Ctkniu79„}[O^_2!Sw9Onҏ r2{/5_ޖBRsѱ myEl{?CWlOU;P7\ FOmK5Nbb|62Y D\u2ńIS#j}c VD2N61;k+^lKl}!fn5?J oVHNGc{RƍرIX]܊)pj9bғUbc }TM,%3J ]h<%9 7۱xg& #50]؇fNWΌ6ɖ"10!U\>1J/$CNͫAؘ >'rInf6";TD/.TC9ЀG%86sxGQg9s(,oTM(eK9t#x Qo \J+% ^ӭw:FvsjVe:!`U: $ф~zveQx HN:?h~+zpE_]D$/%( 5oGX;GQp8Te <맦5M5SrF 來j}  > bH{@x FU@{QWcn-k.^kB /30h񣐝LvH]ho \DBW?X>qE5$dptW1S"ca[nsC*̒V)KTs`oʐb>ǔSi6ম! l7h+hxcIZipFe o%`U`=ݽXS %?_GN rrB* Ph.xJ+MI< )W4#|ؓg[2LN,mI;VB%T:sdbWx\5~Ƀ1uW9J1s1i8IJ,~8(ι'TX if5sy`Xf7;;@D$ףIP0{=zMc)z?L@V,knm-"蟂2 u LXm}Y╆ePF.Aćp{Z% 'o戍aY}cfrF sH N2d=O;u*sΩ*kar69Z$쵇nZIcӪ4P~JLjߪ#.M njI˥N`̭nHP}o%ook:柲'PӾ5Q/Vg;ӧ:]z*Q-'VqGP uz3|d Ўw4TWW9ohlujta`~71) nQj*(>I@M _R2A\~AKٰr ޕcҤsxRu)3`8TBGTH 1KH"r'S2My1 0bkIX]kv7hawbZGT͹DR9;hDkp5ÃH1)c< Dꀜj,cICy<=|A?ce 5Zի_%s1Ь lKU:jj|:2)nnE򚛰[w *}2jh 0PKp/WTa3zRpF6 XJQռ^1a@ 4`ؔ& 9F9_NsƳ/{Mڨ81(g(ԳEP@%Y]~vlC)Ms`,s#H.?t==\~MH_@/i31%F֟NJ`9[ N/HZwPq*a&Zs & >eCL'vHtY|ºJYw"i)ڛ%gvdQL'B:,QWnC"wW<$Mw,}H#3iqQ]t)ET˶r[4tb5['[~) 4PG%oװGlu D?;LNљ&^2g<;͠džCϕwYۆͶ31^%wR~j#h |kzU]L!P{Q:6qzԴ8*raMGcU=:4ϕ~SHƊv5hJb\_e FG")gECHiFҾ8N  gVk~K.q̐`( [pth~zXwzʂ޷(Oi|T(3Ŋ6%*@) t}-.ť?Gr/ Ay5Kv6;jB$ 9׿/iK  Lǻ}'qq挫*^Qׯ[Nx}71XP?hTx-Z2 }5C +J*{`RSqDhy*\qJPҧ9:l@KfMǀLHBwgzU;U.Բhi~ԛ!Rg 'L9e4к3ϸm$G?}+kz,#_Oj/DBrjgT>ntE?U @KM<tƈuOΉMd9}Wܩ71m~gwy@ߑk0 C{Oܟ&̂aG֕V$W5*LE^%{\&2,e9:5lFqiRA J^,<\4{N뉕JPˣ\f9cK%rR"\j{tP` gSbal0Lv!r=}zt6 q)-CIag5 i͐Y_ :<"[tZMͤ'zRr[!o*y^Cn((_NP 3J ̿٭'K-`heI,Ȧ迍W\;Ǧ*)]4+֖<=X>Bi*2ܵ\DZk˕,.H^v៊z=G8r@YZaV-b]Ԡ_>XEVZַze~>x߱{Bi[ X U=Z1c &$>u n/a1iv߄aJ†}eu-,>@VLy@f_ޏp\nK%ewN=AuS׉V!_U@UmY-Xjs/U{ bq 4{DEV?%DC-'BmdS&pciw .ip,nB02ޞ;{CXU8gU2LO*;B>y~u jgE} OZۂЦx: 1f uT='= O fd:{ %W$ CR~g(Ǔq M#ؘtuPг=z d#ۆFB8 +,) u2.Y4) &S w8y * >Ԧ44C8~wW, &\Na|}5v@<\XE'J:?RѬdW?-UbgLb63!5r>[]|I{v!{ UXl\@pWzauAjE+l.4?/_!30BvQ(3:lJ{&w"QWeߤ20/ykܞ 쓻#t ȥ81(dӨ>EaL= `Q& Ű%jy?eGZR)'5F&K^ բ\qCCX;_(ڦq'B @-0WW gݝF38n׍l"Itat ?MGRI$ě%|Sj-z[,}Z`Gܓcr^נ)l!-t_Pj4ļf4O{: lsϝY.b6,t!t |/'^d Q|yTr >J#Yy F=~j#[f&Un'rVT&egqߠ1OyiR1BHMrlNZڰf6}+MV,+$ 1*c.^ܞ iв/u z3^5kw8}s~#/O T1'ʟwb\a=0a)D]-bc Mo6y ~V% Bu׸pٛIeϸn˼AB9pwdyn:ʢ/>e~?YFdMJW$o>XowBB8sܧMvؒ[Ô~JVC" W"`B ]:M[ E5ϡL.nhgp֠1!.In;xn/d,_8qE8Tt"/q[*rI!AF8FLm2Pӳ$ h;B6L1FW,RCfboZEB{}eHIcZuLMP>a0 1СCkb_r;˙FK+&^D(;yOQ1ctfl.xoߣ,>t7 xd,K/d(91 M/9c 9XMx_6{sѾZh PL9f-\.k%EyO"Mfa(Fl)ywl/s a5ОU9Rҕ‰^ajaΰ;:;-{\'YCiuN'6&"9gb#˳UU%`%*EY-&5KLg> 3@QD҆LoQϴ^ 67pG͒9"<. YhzSa,pD'㎺|Ͼv`(^VՂDF9…d!ԗ-,%@9"IʁǿM SS,[J`}{G&0]k[=ȟʂuAfn !3Fc x *Ә,l~Ov!ZjI h /ۛ?eNl7ˋ*}1wئ=8I_f) u^J6f m칺|3)Pa2[]n 1-0mZP'i\vnq/LfM$7ؓsB'((H;kچ,x)S(vuR"Y:ܺt( ,dy~{Z?5*,êBhY6As;0kĮG̍LA,z@D-p)BcշlHEi4(Mk9QlVم<~<Qfc~ƒj?͘!stYDOWe6Hu=;tȰ_X|絭Y2̇}bΆw¨$ G+s\P3  l:)^GC{||'&%Ώ4D;'ƂZr- W_ dmk\r}C #)ߦ'#5GN/ *9lo!!v(7}0Ia*xsh7s9kn[@A}׎v-]4Tc}Vqƛ#LV pX=C5 =bݼErVG/\XX;se 24k!kEI KāSd Vج NNClQ ! Zq,lF 5Ddڲ%` ];ϫ60hʱ*DSyr‾` `f[`'G<Nkl.j a5%O> 2 I6ܭ h3: s'j$sNok`ߨ1#>QdEfk5xavm+qi{:?s6*pѐ@+40p53ܿa$ƻtNWa'P]*i!pժCD͈ꛙ)/A:7af/`%#6SݖH]bf,"A% [񜺻p҉bҷԆwq+豼`M1qw/ BS?HO[w!ׇCkˆ Lr^ bˮ?Goۆ?)C&2(㘣[p0oP `_M{4/㌷- >^+^p|k˪N4AvbOI!vʨirg:͢j5Ъcgc/!DEFϥ,ռ1=쳴?74#lV[]&k,|NC4B_#Ø61*wKxq)Eg]vL聂3+-TU!pӔ|z[NShDz]iY=IRDz2 )C@}#ŝߣWbZOzm% XsBbMȷWD}4@xS=vQu+⣖S{+ɣ1@#K[ƱKA~?m%`Gu[Tb(auѲvLnF|gL"&6;Zy? hm)tsid-l8&ּbPmS>sV+"Ta覟ꌧl3ə+ 6^|8.&Q9ȻtC 2}^rA`3Vvl1ā(Di?Smut or6ʷ*Tʖ~Ac)ߋ7BZ6!a7?1>x[j^Hv)%:5 f Mz64eUBezD0P`ʳp\l}L)߾2p V$4x"W)VABX\Ϯ@G6׸`=lA`/ƨn|2Qԣ;o&jCc)a,oTsl꓉o0mlH@=êω͙x^M:ǵhTI\Ay{P$+D58TR3품Lsgk; hyk!0AwD;M{:~j7>+w9 "L,!o =Yԯ苪+.oɺq|-G;&aoK</5%+GE5!9Dt_H8D l Ý`[`ճ[͸ڬ [1mrCZ~z_ oUПr `91,u0fNh}5 a*Y}q(sCB.0rvFZItq*ZZJ* 7+ zky-0ȞC v}s)T:&zzC\6|a` PĤrluF 9/=ʢ <̏%vpAm ^ p0 mwLIͽG0W|% xfAױW<Nvb߾,R:d틪MMQGO,56IooY;*/O(! R9 /Vw=U m_ۀ&$g;A4t=<YpUEOgxoTeXiLIџVTtmZdkx맮ℂwCryTk. )J:C:o~uSϒےQ5!RlET&n.v.OP["dz .Q/}_/T?@N*,7Q"cR 4-t"?W\̷ !> # 虼p)I˓Rxsb:*Ap@)=J_;;5cӜSft)lwCO`9H&Vԥ~炍2]3{Hu1%4f i7kǬF~. lnľ,ٹE.eo/6_K7F%t OCn^~Zf(u #u`^g01-lX5^}bj.28;15k8I,U3=is`xlkA,NqM\Gwg ź e4RN0H^&C&+U}Y^)d\+_*y11^Iޭ1` YG*KLtT=ϐ$l^fo3޼m(a%Ux)q#o@G_jBuYaj!wͭ<RU}eZL-QANTd(duKI2";e A"$UZt踃̬lGd_ɗJa؞LR,$!0+!LνNYkb1~ĜVj6Z)WlSgQ~P]W8I!y|A7$iRp`W]K|aa87:[,̛fSg0vq (3ndGnVlyǭeaiRcտ-3Oʥ#42 ]ԛ1Oe"rU,4cyNª]&rlBԠ\w]1]a-\)+eM; FiJ HJW2(L #DֺۧA7?$Kw-G)Le2roa( hRrPuTXoIzW#cTh(bvJ(;e]c|xԉ_/^qFa[KWsjFvKQwH1Y /S 138ґ<C3׫sy_rCEhXwAjخHT(Zۢps,:.Ag7XW*gc92bpn(֚U9uC\GUNeQ2xv_ %٣32Ixt ʩpoNO: Ok\L vx#sn 5L Rr4Ac7Q+GHl@?IkY3l|\{U+!szjVLNgG((N@cGuk{$}!7ݣM,4Fz =-֋EpՄ8+f,ܤF*9 z!B9sz>O*m! ;1ZuP/xd>01{7*Վ^Cvo fϹ(^z8guWi4Gx sugotʠId@onkfJF)g6yR㧳yLT^T-xyC.Ōȣs !,z+M )/F[U(unK%TnZd8_E(NO%P~hrHn&\B˨lO;0ҹX|yHX!lG33bg7)Mdg'UۆM!Nɟl KܠJ=xK-."&Rf/Tpb|gBflh ޔC() 4Or! !.7mMG\;#z~ˈM_:')͹M=EDpҠThme$򍳇Ez2TM(1? 8.ؤȗb$ Ju`}%fYLۈI>0Vj z*,# ^`(LAǑhl'2i{$ )Uq޿!a*]yYҖ444&S."QIQZl<.vH@>tRRv]纎#2!%z&C]]|*Hܪ[]RsRo؎; 2.m kaCx^ vۺ'{3x#76eQpph2&ݏQVSޠqkF`7(z&}C> s$,::6y`ί$K`C:C";*,|# ~Q2/u-Zdz[ڤAzIY1.[7ڏ(9%ٙ7f=SĔﲵDbH_MN޷\ y;pm`9rqmb;tH }Ҁ{1aB hV ?ǫPN8e2٠qi;KT;q+̋SIYixktIO%U5_޸L.K8"'+El'_v䳕'P`d,r&9 ẃ#j9C6lOBv VF'{XhrsqeHi (݄u󬲺d%" #X,v^?ynl;/b,E N=m`QxycN96ֵ`"y:W&}p)JFBYKMmF'A}NE4q~Bu]w=b+idl^QL9q0#_5_SP gψ4j&_!&?wH#0\hVc"`yYq@‘EhDr^5><) 6j/)e#Mzj6oR *NB x<ObF˧*#TS`&]rClcmo{ R.ڡ"( {AfFlS# TYjx&A]/#{4',*R.U) 6)}t3l5q-1?pS5u$۱):wRIl'r%TKȭ8\SsF^\ޤi,IWp ݊&@Q3]qq72+&Ѫȇ{dST[ׇ/z`oq &%hWKq:ΨL>%PՉ;,FT}XUxփvT!(! mOetՖ{אd_i9c^ѺQ)`kCPգї9 r𨶾x|KVxdSsFӃ4mjmCcojHr֪\n:O#rF=M`m5)_ fL i{[9ci3~X~}n2_ W2jTϲC= +K}.!RCXNhO<#f&RT3+|)NR 0v;~dtŬLHL"+C?.qq2E/i~ *XO7pm*s]lŦ_aL8|6I&F<On{o20damIZWjd:辣+X1ѥ׷ 7vOrL ai!'-ʍjgpةrj)>~Lj-gib|Do^u+F)նTq9ɸb%^|Q'q4Ax{^INec 1.FGgCOh͓-zX#H /{fzK: e״ǣ#T i(m*>. ,?%sy7-R4 :Y:Khì뭬.uj3Z9@-9P]]ib}TwYeƀe :?1tbXX)ΐ#4_3N1kK~ژ0IQ+f Y%Df]HFAVN9 vֹsޭ\+yO {#??[j,絳q&)?gQBa Wa7s epE.7@Ha%W\ub73.c5YiPOW q .TP~<%Wo@ė@W3Zi lo' @ _*'(~t4(9^acLPOt/#c2aLh0%37DHwn Δ6۶@1XVx-~{AOCiSdB6ȘpfpVSF#+PIxq;sTD1#Q)V}Gj?G ;mcf֙jS(VGNv0jT<0sK.%UA~6K6 CE&`i1Xns~o?4th#\Jܨ]/p-/\GEl mcplUL 6H&߆e0عSQ':Ugcw ֝4eKUV,7R̬ +ۤ~IٌЃ!OQ"|Y`⨩^S jIfo_5{3cV]P +-'Ou˯L `+ē)nqȒI^8#ʭ v 栛[m!u}yls􌾸2K(w^o֑zKGZ΅hAsx)z#!p|WԳت:v jGϵ7F)"7:E9^ OU_& gJl c5*JBb F^=\~bqWxJA|XIqJTO ۺ_d9.o0XJ/01{{,BVpw dإv&Ec0o}\Fpj"w^[vHMɺ{ Շbvl29q Uܠ~&)bւ{A|s0`oڛi^3͝r0 ]ߌU,nuKd^%ВI}2}ŽLdae8O}n6VΌd@P˭n⼤De땆Ͻ>JD; Exqp/fE9n,rxûzG(V ܔ6j#+IzRP6YLy9`m\A/TM1!m o)/=J7kDIOA?o8CiBV&X<>`_*#fY;lV![ܰ"".bz*R a{(85 R3 ф/sxHpAax|[b.6 SD :f~ Z+ Hܳhު z!WgJė`eK&EP|{!Sb]WJ0> 0I85YcC5}7weLbsݯv q))(P ^;\~0*3}&p Wgc3F]H^ͼ(=B"ոyD@D,Й$ч͓fe'L2zYQwZϭ,ɿŨ,[xjXc΋CAPgl@~RAt-w~ v0QX!|x~?k큕JČx0Ş`Jc__tasU5Uhv ԥ1,ޚPNE#%,яPCE_j5pȃd[Λ0ofGfGOPg lwmM0}Wmr^&OE]/d%ZPܵ`_A@m/D<Atk8lpތE:/yQNO~m4i O 9UWԁvp'6CGP*5AFwq.#}E ǴA\KA?#Lrʴ`,Ls ܵjX$ 5LRW3,FXAZ*|" ҡ9kN4dpξZ V5u9Ds(ykש^%N0O݈=|ۓsp`(JkZf4SFZZK=tmg`7&&Hn0cFV4^r]Oa.QQoߋQp?lI{M:™ƘΒgB'H>H@K=+<3l1ǖPvgY'%E`P֌@@ߑ r_ ; {Tʳ 8KAc>Zl3IX?]5y!u3Ǭb<>K[ yF40m 󟼼.:8Ŀ;z1\(ԋ|A+ݽ9vAug}M6H[d4s'pLvIH@W`HdLJYwKT/5Π)cwӧ{,)ȼ^QW(Fk92 L'CR)64~朏9KF9MTsf9iW-MQpTΩ{YMX=<ݻ@ P(LPqfhNỉ`?G+L0)n+QfM]EW\P`v:k M}_D-W(<)VNkWϽ@#4!Sit1?n;cSEm@e7|gSÓXxT(&]wpꔟ^r/V\CutL{-Wmw W HJ@it֠|۹WЫI({h^T #K/}Qg*@{{{oݭFg|j4"jhmрz3r.i;%[OS23DmAEdT MHM0bI_]*)t;B%.+=:C%e7U&ˆGr3YAC{qW3rx>S+FZ5:kۦ=hҺ\NCB{ȩ{AdE s`h`REbVT.ƒƺSvnN6I%ʄ`,]X2Wixud'`K3aLap2ΐi5:h~SЪ3Р>S}} M%Z~f`wSh%un` o't|\xB3e"}Œ]uT!QݹiIfA٣iLy(6' /%ۣ'Qߜ Wr* JʫټZGϨ~i0YV 8qBro++B]Ym=F@PD̑ƹRkߊAe") na-]Eo5wus/ (`+3F{`/9݌NPZ[%݉ё"QEDjܓ!YtP(L^Z9'n-J iP,/4=K(9͢ځn'(DI! ۤВel:opj}c7(b/bxnTkpnNrMC 8}SlŒͣs˅Zp)0B>ZNwe&߶(Y 9;qr? Jcq4?N$ܡ]gΚUlf>"x'rwWBoltCQqXwqaPö(V{@-mz?%ߖ,esJpn:k'DE516 Ů]Iȟ)/Q =Ăޜ. x/sWUoB)[į>3_/iUx#pǙːcM87ݴŹg.(rdڨ6&dG5PͿ'uD:/}_[L+(!~NXw Ke|pL,yB+dE>ZSPލy{5d=ip6Q2 SD6xXY{9*U3Q#*KP-eYV# [uBbfrT‹ptT] #?'$`n$sx`U&q+BD_|SZu(4׏XEL^Ǝs1 fR(Q51jLM5L-\7zZZZF (i0kUuyxl e#Z*tBLiy1#s>ܮ ۿ|%3Z{,A0c8R^9d;B.aaHQ</VO'QAW|9Zy4WsW g~A 揟:2_ >+ZWR^\ldtG_/Ŏ6q;=1r jӑgᬚq-NQ uלӸ1u~v=;^B_WmL0̱tqmLSj/Q ~oA,-QWo͠}U^H5`T [f%p[B; 1 s$-,宾f :L0'Abuw47,Ne|nw!Qr ijzTB015Pq7fj"KPɘFӀ^R*1il3:$.aOUG GGѳu ̊:и}AaF캚1F)weD`MN. lc*U([cudOh0'3*q@da\\UJː Pۤ,Y9n4*Nf^q=Wyƿ+<ڇs½;x:>  ZP OLih'e`HK=]GQ&>a-SM133ЂW<"#41`=D_&Wc; GE˵&d5G"Ui(֥d/ r_J5L[)gC;*!Ѐ٘CQPQH]f/SkBZj>˛I)OНk#7_NH!>)k#dN~1$AoOu-B!ød AsN ^KYwBN]vx$"q5(^CmUFUy Sv[`+`As lZSwtFh!uUTZQ"lw:?S(1/2ݢ y.BkIۗscwo g&;C6_Ь2_j5!_L.VO )G~ :B޼wU.])!?aev hO~!Puu%'g7,@Rq(WtπTWn @~$uFiV/,J\G{IF6>mh|\E [%O(t>@s|ى{'4o>4F|ʨ)0urې?ok{Buu"B?3b4hʀr@[62Aʮ 2c= OG 'Z`KlI"l1I" ܒc4+ťkUs{Ė}P^h.E(6U|q*qGU  t(|nK1G߀ LF_/|͏6L1Z6DGքewo`1"^HreE Kj84/e`M Vjv C}dD~<ꖪ O:tJ l;?UajLZNJ zp`#8 +I3LP?;B$ian [S.:`9B> |##lk lD(Rʪ%:a!we3~"yx8MVc0|h+mrR2qjfTi鼋 NTXR%4]'Jk(eX:x/":j9Uw= ~˲kh{kNuYBDzO\n{RF^iNKPymXv[@i hpcd]*e=4ҬPZ *pUc/Or ol\MNb7=t"f⚷-U R<]FKJ2_#w`\Cn9\prt gDcXq$:FyfWDi$!"ڢuOiሲZp^]~/R'uK熕s]h34]~X˶uCk͜1N Iv06شцi©e +gQpH ژ5kGsf3h VĒE*c\uuf?eAJ'.vh]cR^hFDG~Yp~1(÷/40ww1!g!a(msbieIX)0= ӬGliפŽFV)G\5^ =,Y |^՚d+N%̍)WB" F3 i&]4>djU#rQT[:S^>iu;`U o?ڠ!,f:S:H$bA#*M0}|L MTYzJXKbp`s"ޯ4>^7pW,w?:>UרvM8UI_Yk2yBi1"Ty4k50yHygIA΁!NjNR) W6u"LΙpІ"dm[PP` xͻO꠼G)'6>\"Cbд)#4+@k sa(P8vV몌ye>2My0R@^c; ;Nr<^tHJ4wKSt}S:͗ g=pi;nc@ڗg=͢/xh A2YSynVj;H1>u݇`S.l]'eZ+*JKuoOM1(;p Iv_y͒jQJе+~p:"z6~l)=lg*-5&K"k0Rcϖj'G1Ş/a;(=1F!8L/˰_Ȣ3hg-+x,h0wBϙ22Qnu`-Tz*dW,ju8u{'\Uʹ[c|LxT\)Ge+Վ)WQe?FjH HϬc@o;NX)!Dd 8 ⾾hXא5_R8VNK?$VS' /Eh586c"@oD@Xg[_}zb'WJ]Ner;[{w@s$eK/q)j,x@u#ª9֪h|L}Uȃ,A:9Bt '=RiשW;0H<$OJ*,}OpyZxfM:1Xk& hS~wUj-4y[QH 꺏^{gn8{٘\I~7(1`iEeaNQ')89SƉsR:uV+=z9oLj"]$z~(AF#nB8JrkxE6`~hح.ߛ:/PLD ӪP%X \QK=2A(ꃴkk?#b A%/nGCz a\奄Xm0kiuuOZ8}R|_#+Өx+b ~FC)' ѿw޸ᄆS8]/\ sf g9KD9~XYs?t5h-x KjO p&%ʨmk^1?xuzV އp,.eok~TJʐ 3Ms-CPS+"4`oY=}f lnDزTl$NW& glnQ 3yBGeHOkˊ*y JQ٣ĊCd_-D)`?\D>#&p=] Nft&BOt@G({Ĉ<ztsKf D_s۽/}$e:9֚& Q`K}WoW_px\!%QR,Hvr%yÞ"2/>Wwgv|}9cQqF!_뒍s$0PAh(Fv Bj㷀"ʃCͮ.Vsځ0,H_B˫֧S?,R?ۏU4e[,GS '11m;Pf@W~ۧ5O/@/3ײZQ7 #㰭S2Z@RvldWCLM|bM=WQI Z|Uq! S6-c0vkZJ>\"2li;d~vv<ŕ Ԛ ZEq;; #5/\\ii3~X_|ڤb2{uJso)TvK\dR?Iza t63 7Rlkŷmx /*Tl#i΄ X|fVu6X|lkZ' `P4Z8ۛܮv(5:/8ȸ3ۜWZ%úɞG"u^ɸS-$w%?&X^#g G"5:_ PjCr$hA1h*=sXvH[mD2*WS/-; 9{OB 6&bw@z#dtc> =CFʍ8"@g͞lڂG5LZ>6mmmBD3Ou1CHЛၯEn?>j1X~?[6dhV"8ba&TSnY~47rx]>m^J9ͼywY~6%kwB%aiFͰ ^9.4L^7h;r-ל:"\n#NSxYZ->nihFT\ιU "0! {g mHQB(K #?WǷ*(iYu8OP,E\gܛ`VLj& BOh ܫv1kG>xs|;7Dw(V˼|LU}XȢÑ Z};Dzm!dQ)U]8pXa3SjN1pU@qbs(G;71¬D)+"M ,(PKr䅬#vu_`K\Vʀx~!C`X9Ӱao.܆%W RF"x-&H".qĽ20Toy4Ч4gxv.9-}WQuRijhS!3Y/15W1ڹs"%=<.dOkߦVatAaQ#D3)mGj:M'Ź5؜fjW{]VĿKPVOE,(@W!F5 Xvy/%ABl8*Cr\4h$N Sn]Ѣ46˘"Jsj,'!ӮtC޽f `pK#2>1]sqU|R r:\!rOhr#jUݴUFa{C|wM.t)&i+bX]ys8dx?Ws߇;xWjsHd^ O4gec<]8sX{Zfa|7XLG\<2{Cbabܤ3KY̿WҎS>/> &4BqӲ:7o1SQ%P3Vǚ1TGи f#l ֗7zn\ZL[10EMÑ|qW*&Hf@q'sy *C=douqp qqm{8aGPO\7i%jK79| ga줐dq9|^ŽN0Níxfm buR&Bҭ~+3Ě9%jL3}3aٹ5n.\•wGELR'?L>%3õyds3%;/IPҵMZ@e`-+A,SS\&~eOS&|d }Ph0ڒ^(.p%fp ;2# yNx$OB-kߎ8K%*zC9%ڶ0{J:$V w:҆eF`P3PDd4$oQXϰ _Ati!f4Ämr !xm?)w7{5 Ugx^ˌX~YZ,^K>Ze@_Ax JM!Zd}d6ZR͊*SR)L[rgfS/ȑq0uJ@:^"7gϢvw ו <[ʌש㐬 |׾僾D8ݸ UЊ+&e1a}cb,Y-UM߿|x*n'_E9 {BD:nΤgԲG&]AuФB,.\D+#{3 Qcn(V@P]ݢCaط=kvoXS}s8wIo6]-/m6EO?{>gv6;.FLU:M c$F=Pv빬c@;'bfXT<1Ȱܦːc絆~]!aD&ts OԌu'h2p+v{ޞSҼtns-ƌSVd]g/ Ŏ \^=I93 ;f]+AO`Y]euȢͣq"ȝ{h} (p3Rf? ?w/y[\(Vϟk~hmߜÐa)~ /0-$WVk<+&T"WQcCf[J$wY4ui|DRON8ջ&[SbyQH s|RMLUД-Ȍm+NG,{۷pα.s9)⤜Mҧ/Y%H- zuL[Jy[dK`S!EF:f9T6C8p+: zE:=u5svʟ+!'?򼼇l PS Pl s(bNoD@s|+PlEJtsgL1{=(5tdNM X?,>vP,pVs(b;Zo.2}y9BzCuSV 9k1wF\ĸɽcJF 6H)0B'1[gL x&N2Zc}¦;@+ U7Ib?'BoSTr0%wGna|9uO $V+87x w-_2'∅&Nx%-3SGݻJ5mx`U!/~}\lUAVa/|n@ij y89Zp YJx'#O.Hϒ1&^Vsˉsļjʹg& Gʀ+/[TB.qpmKRbrv)c.gQ8u/Me $J|QkS^HJ͂ry[;!tpԲxL)n/fH@!02p̼mhw<*Kl*xAԢg N6h}|~\8א,+z\\$]ނ+=o< Xb$1i,YE L,w@]Jpp 7[siyQS+hJEY!+ &f!^='6p[ײ _[AkYr$|ZbYpnj/hx-y EvvBކ0l8OUo g o!}ic82"U;aG`, EhTgT+@*a-Шt`gN3 Y;a[ %y>"ߌ_t5t(eꮱs0 Y`|6E nC^*eAdjo^ColA/qZ~&TW4>b{}9.h Tӄ">/W,ޠixo{@4X} ΨcH9s$/HCdN-Z?PP`$_j⩱2c( ]sSaP#\qM Jwhw)6;/,TGj%s.ƺ—uwi-+CFALE"P뢦_}ۿnp9*ʴUs\:2ZA`[e X" 2hϩK2*S'3|t#`w$m-wqqm4ǗzilE ysdjR+,8\SYV^tb^B鹵il~Wi"Fx_X\.%@ӖS!wޣ`PeTvw4[hCs0^b=i GP 1[ u֐Rh:4/T=ĭc٠&λQm ƭNF .e l%ڰ_A%$4iۀw-9*$K 0ОL$-֚@ CDz* [kqNj6 Rb)* *~7Yi ء$Ն|D<%ɿ0]VvMѼ΍VzaB8vs;oaǣ&e {g}cW4 XJX;xh0Fv` L ;9a@; 0lt>CqJBs*7*3%Jm||E:iL.Pd~G,TMG";h*a}DFϧj+T#B'X!?ult}={Po&jֈ&)pF(2UFnb:V&v8'cr% JP08F_tJN[::v'FX1+AVDfbTN@J[NAa:SbYo?%`Dh}4EvTbίLK~1܌8B8$~$-UlVE"^K%V/` K|a prtͭ%`L$T# ={"͕'9z"3aXkgS&j6~4P(>dz5t2heiA~ihJvIߏA kp u q:P l q4uso(䔦?]a0T#%`5_d1ŠKˁ7ՔlѹS\EAapRP7:ڮMptFC:_~n_*i3=8fsFц׵=C6o7:/9(r> r WsNt]z)eU_lg' /Rʌ giY{tل'(u by ܂čh񁫏_ &`mqTGI# 6&}_^pJ?>|}Qw3Tw6P\Qۨ^o9wa67&UV`@OysbX_L;l8qD fx5wtҬ@ J Y,\Lc&/Ap|u X8M J6]{`)xv1(~!SQ`^Ҵ_E=)u̓ca^m/섦o2Us 8= _9{/t"DFi+Ha{FEݽr#6+K{ݏnk4ެ=f-+.qj֗M~q" RÈ[Q&W0vQ"?~k6;|?mȑnhM|'{-.JO5$j\=C'~S%Q."äZ/W) hZ Ƅ`eV0찻z"AyҬr}^ACTjBHMLi s=O!sD\_)*̠%cIj '9Wq1GX /cKn7މ^As@*|b<m+֙h:>з!ڦ>Ճvւ}'a |U-|i.Ķ"ٓw'SLcr|?M6JJ9VÇ~^; j=SM*O bϝb5G4y쮃28 i@R%͍oH4 G7~"0æKv DmC\Wxַn&¨Add,}qۻ$_9iGYʀ= h0;3| ::f EVr>)7_~wϵ<Z3 k dJ77dyڋg5o),fpuRsݫm*L (D!^hT*JB"H;$C%O^7 $͔.ƹB+mM NlFtyZ.d>GDdHyA%T=UUK5Im{g0ߚџmM{$Qƽ_ahE=(nr0M\bIJs}$t,Ʊ ~bde m')#,qUW"v֭Ȣ6,f3bJ.M3NRA'$e">y}[VbS ;ZX:ȟb"C_#^5ر']U_~2UZl@_0O ]աY d~EyOS'@xk04RHp}0Z L qWkyuj\ PM .\ hPzr#UYx84v<y0o!>z]VBmjֵ˥3vb5zR^$V2M͑0(IoڼW/ l+1@JO™-sy#얃XK [{G\(_qG&O+01"o*d}ݳc&]ȳ-.E-Rhi3ɐqgAcsFT 9Wfpq]7,[g';ݨ*;}2Z\VrgC Ī]a,s  ̿mG"Y[5/%Eo7~HºyDrЩ&H:%l_ג(p ;s(sOu(ĩ%pKL) )-d& U;7EkǨ,䂿MF *v5uvB5dSզJb]'q"L0RDeCO>lXl;/{:wꘆW6 ׹t0~ ъs-R4!2~uU:: Ȗb#:ZH7;m;;zp53i4 1u Ğ۝LXsb/FUz[j7@TS69KŸ¯sޛ|9v2H)ī_h LՆE2,oZ: e+˸9wߎ?]`VLZ1a]"[M[ܨ/alI8n&< T Ō,Xgˆ ?c<_^|qӧ}/7h}oLhH*oVlZAۚfρv8? <0< 1'X]eNef,;k$UgsUqDՑh"8QoTt0 N$J`)kZ[PLN}.~\~#6HV V; "b)swF3 S8 }$}t! =qdQo(lA`FdgWU@|fSR-$vv3 y'wuNȺFv c nw{WL̾!L.4I~~EiT1ےx#Bls]9naD c)2x/%3iY٧%4>tE`wG*8EN؃T؊Qé3HH+?S `{[fD<͚2/zzCn\*TAfvkf(ͩY$J.vϢֺ*nLF 3 f. F]#wN&y#8WelKS2}1UMf1 1:ݬP1UM44.s Ցߨ#{~dN-S"F.xH֩1m5,r5=\u1eY4KR%hV 5b7{I2pm6e,k)؄ n )Tc5cL=$q]ewNJ|HԝcМmh6B=pgo9X{@]{TyG$#6 W_!k%)iTڅVV* BF,]]>Fտ&yO Ę7Zky$6Fjq8i҇6uV1xz0"}WLQu{)\"oo4(C#lXY/PvhVğ@#x<;0ztge:Vi/GQw4ṵg\Q`xIAm.\^kE.T49Φb#;d*M4 ORU^nP A(Ӯl;6GssONV]1M+?+fV%թSJe-Re'ݳMobqVXjRo@+S$ pэM0iu1mOV> kٍ͋5wSj&w\s*\Kj"wT=y]}ÜZ(P=qg$jk#|Pk964SK-q8fbH|(g6 8 곔A/q}?'Dc.TƎ i15sui<Yq˨%cqu"Z: x ? dyqmIQXw-ЂL|JLX .]t7< a_f:kdS+LZqG[IHݠ>bMFzf-Ȱ\ _a5{B#WC]FRXHSԌG>Anzl#>a4#rhnhմ")܉M$2[)hiQ6e+'5?ٟ[ϖ‘^R=:unV8 \@Ψv41E!qV7?CƴV |\^Բ粗*hHOoycB;Me` Z?hKXmY"+HH`ϫxQn"+8 3<"ϗċ{-nj]u9Re츷xSoaSF79Æ"zm/gRqvɡ}qR5q3T(v{)3-:XWIZȫf_h0'!i+cC9TӃ2h;F]SN1Ė8(,GQċt:ىeJ2d%L݄j+/GK.)l-lTce#ʢQNH3LӄnRYIDS+d&iuh9e$[}Cc93Z*?s}8$Ifh3/[oΥmUl3ρM/\ -ϑT}> %O#"*fЪ{h#֮%kSPV-h(Af=.6n )@a}7p O_4o*y0J+"`K@ԈM&=qAY\Cƫidv簢#KSr"y EĽB$v±&QY/@AEUL-b4"}'"9 㠘!eθN$`zj6lpg|Yfξ?I\mbcTǟ,:|'dY$zu~vs<_pai2?QsWfǗFK!kQG$؅,:C;BN G,edh5p Y' yە>'6?P}RN׏|Ğȓ^ݙ}tzv: ^Co]K.C.#oNNGfK+\)»7bd[Stgf)I{GQ#c7d԰J,hHIZ-]e|84j^Û!1Jc]c!S~§,+,9Ĵܐ <' L&tg!jc 1w=A獞|2; fZȎ.: lhΆs {R76z~cMBw/nGe8kj+ncؚdVA@6\哒6]HCI̪h!UC}g8yv2Mӕ`H }[R^^Pzk7L|UA!=ir s8 @5WF*oe,>{oK ~}'ζ7qۜ0cƃ♱R-T:]jjDc&pu.}2aWӿ`!ޥO7g0Sko 7-~@[;$6?5k,|=2 \ \1egq]tjdYF{~Wm7oMEb(S7Ѱ:&{-%MS)ihi}dk1#Iy?,Ћ{Y >`?K<3~Q1@N&{) ZGe=_i5 g9TԭSz>];nu hk^PpE0^\fqǤ)\R8O~Ւl޺% *)JcBy~AvٛF0jEtԟJy׸Ou ڋ0D\|`>Hϕ1+|l0'!={i%n&o)f~LlH 9`/!ݽ2.*ʚhpБjI$z[pѠ dfw<d%YVbO` cYʙ%+}Ώ 9[HPi6nMk@F Og`:j9:#qR /Kߩqgüԓvh$P1\`9Fﳃ%>Qn{5#9_'dഌJIGst:NM֬i2/>x21 ͸׳ʽ};*"gz8pêwO6ZhmQ;37: =|: kX-.>Gpܲe${%־KGnPWbݜ,2&?Gx/{KG:XM0^)"4B'ÂlS"%RvҮv`nW IH=Z 2j$^NL^y hBNY](W5LG"Ij_w#Zknr ﴀA8D E<S5|CYdcwL[HyJJs\+j.k*HTMBc_jTke5bЏI 0VyFì5(-C1Jz8GS˂.4Q) ;o X>M!!A՟p:MU>s/QqB~9R;e3W/5j oc'7h%>T)&5/bEFe:FREe,xÐu4 0%L=C'.>%0B`XPdq$P Ǡu˗X7E9Z͈? tIVd͏뼻7袤4UHE]!]4%<DH d2x_M/ldS @B n^EE Na,YT0MF3i(uԵ {BO%1)er`E=+ ˧5k%QBDӇb~7&EpV%]85gO-,"F}BcvI;uS͐{~*1Xk~FWX 6([)G=x9lKI}/OdSR@n&PO(]-jX2(`y'x[(XM礙ŕ l;!Nm[mb4PDjaL6)>@$aY>5xv5dR1„Y7AfMA= jsS6-/TJ]0Z3WkKјp-XYGl({YE 0̭5a.ҽ7s>ӷ6[盡3c|#_-Șğ\)M65aHhڧVv8DdN9ӳ̈{٪[CXNQq3C@B sXr{n4y@E?#&,790eLI>}ۻɋxTUPhX5n\dX=0p'X;PgE,U6+:f |ǥ  ċB"y\q4.ae֟ތ^Eďil|~l sـӶD&3=s3P0Č]rU0SE/D[dBcBo)i"!<0]4E8C tClu$(EG0o".HMKudi:q#] l~'1m-^豏O)צ`T/6n5ÀVg*`1پflewp#Pu)/ XO˳,@ mJY7H/kӒۘ5ۢ U@XmN =>>z``n%T:`]&]cm\(͛56=dA*vAߋ93^-': `ndp@޴nK 3 0Uw[Nl} C-V ܉ɻ>!W>;+,:'k=PG.Wzj[y6`Y?W"J](v-H|vsYYsHF0i"ͽ Hл=΅~SWAED(o$aӠǼ$_/}+ JDt*qʪ anj.DNEҐA^P*S殂h_+09Jl904MrOc^J+Ri^ԨB4w4]Fnaݙ)֊I4pڠSa:FOya}IPTΧ{ʆس@8 =^W=b%2僎c.}XXrŎ7W*GH}Qz Ѩli|} $jH6+ZƷ)Egb:3%eK+>A 9l|~m4YV=k,_ HHbT\Céײ$Yh!gtۂ. %#%p Gcpb ],N),z[d&v w[js5?)|#l3d]Z=1e0uLsIXft2(< b RPƎuI p##?oYIk^:Ǎ$i0JGcgUG< #Zzϰ,+|uXk!1Rsp%-Nc"$畈7ڇx?q/C 1!ܫLA԰ fq)\֘aY 7ZҭޤrC6;{ 57H`3&RYX.WmEԊʌI%P؛ tlLx%)߂w1c"lzLx^~ayJC»a7qVai0(łzyrDbGNrvdxY(?qoP4f;"F|٪eyt Ff{+"(xn9 4`$^s"|%cC~KXAEpje cfe|gFj n3|Zl 'k b"W&7.$ HG?d0-J(0 k%l$3DSt@T>PdV.1<w8.b^MXN4 ,Vj^|אP4>sVe -2+:=íbl,vڟY[kF\(çlHzߡ_KW VMȫ t6kF^XtFhm09rmh#V=)qz{Ror)0=ep`T !wUdן@նȯ4BLda~JDMa/e\G@,_`<׵KC &vqw/c5g3 N G љV@qV-,F.9 㙭[k^A:/-s-w:«䱆yQՐ5N2bBϥIZRËl*,i>PD'q>Yw+HFN @&NPǷLaP*Bwj&^I [*KFSbQp(g}HaZ]7wDiw~ SGw(  RPȤegEKsZztEEj1r C@6HػF  ڑGy:T[S &wCtϛٕӆowdWO!xAr0 .뒝?,($*oi%?=EX*%U$ݪ`j[M>@MٸA.)د`y[c_62|DTSV4Ozqۮ-K*6O rVkxU&ң9CSe=̈pr6…tY ȝ`vɕ&x ƟR&`"\:YޚSe<`y+a<M`@ {E״Έ TA1n[ ~HR],ȸbd+8,cYJV| 7|q8@͆5S:ymwYsahɦb/a%emʘc 4cwS%60e^S1鬤ԏ^O<+fϖ5DT"|~a\@Tbux_ 95]' XıJca@8KhvEx;aޖȷ=9zFZ,ȣ޳dIyn@<^_#Df7w_Lj̢eӬ[I3Nd*ML矣`u)<#fT% J*2Xd7ȳ6l1R)݋H[jes# |jt*}Et0@>ϫ`lP&ޑM?n719?Ő5<TpЪ!=M؏DTݳՆ\rF"y6@ZGT(cZSeN+0(`' 9x%]}fLU!jSP\kŠ2#jNweB3 B\Za-9c"زX~P@-wD8#s&]{u6?+ 8u%jQ+˴3nU*C ~tP)Chˉwtmv6FyHI$R\'HgNz{N1y92r@@ixFsAU_gYP# 3Y{c9/thDQejVD Eb0uҽe`Y(+熞Ln-`{E7 'A ?-hRDKPE̡ 2wNJ&kElZ9[ V{dEɑm:&,u]_LQ%զZ/qrM_,vMWJzf2čj !GLcBkU'UT `w4&G1& Efy6O D,&=ȯlmO#9N.9Z3߃YG:ힷ ߲}2r=E<?H€GVoD<,t g-u$^sUd Vu7^V$mU Ї˘Id5:m6͸rP}Yg SC? NŖ&AIC$=kYH c>]i&8TʥAL@& {0^x Տ9zG9O8]qy* jF]Kp$]1VlpgDSs<9tJq\s{L#( h kR$|-zVjPrT[o(\4BZ|'KNbJPva#2S]A^x*@m+ @TxS ttRLn/|{"mty@{̧k,J$ 袂'`/l"ʣkHhaSmF;L~`M]%Uʂiл^uL]cL~QsMH }=[gkGk*+u06-g0q&h]b#ߔ\'?tZ潷g)IuTc{ K<ѵ=ɭvI+g'!@00 遃 2>eֻ%?fTzFb>?| ZY!4Rk?ws,q4sun_;c Vn%ozK1|W}B6#8d]V(1/ Zaعl}b(CQh*ṷqRvBu:^@1xN~?ӉFGgN2#(@ 6uhɡO{ki? zbQFA-0*ܠZaak=_bs$>•Gξ+ݵbG9UwmY}"%tAdl=<&]t3ݽGN^IBC9c'k! :VydvK"[1D]| x94CmR\geD{aAEt֝0^"j~糍cK}.Vlf]ꘞ´t<9:]k/Vؔk:-blJG N jЈ|@p^L{p)ڦV^Ҷ}zuWA4xr1MQ;2賮CK?2q),7xc|+\VeWb]hwܦg;i?̞J?r7ui}Gr§1I4ukq ih7mn^EaQ=i!溷a'@H3m1!aw1ᑘSeb^G`ӽ̀à19E2{},˜mD҅Z9~Y XMHy٦;Wax&!L^j񗞡~kv Zn8kLpj,rH k8=y2(a|AO&h>|UYdop# Օ er &)bFf$u fkNK+fVQ@|f۞d-[{ZeM7#PFs}pDBV0o=hF;ֵ䜈aB 1Y U$Ҏ7,"I6tǙUH)ᐽVF_7O g(f18+~QJ}|'"ɘ͛W@Σ%0^pƱ'p6S~Ԣ?)Ͷ$yſBTi#UU] <~랗g͜׹r~>rͨf[(+l5gQ.eʹEtO{UU i1KhQD.!e|!4;S}ʝI 9;2k])bPvq[_ .yn-O! ӎ/LUĴ#A"s**`gTVh9u#~M3F>u0-Ti\D1}?h`f?^~} 9B?> e0 Z/Wbs@C_;eW.*ofٲAKwnYB#XP;Jƻ/AdC{sia^/@D@u:pfoX>}|eX7 tŎ=/Ƙu \bcdOIlDUmNAe_L_AI$ׁɵTZNAr==e;0Z dӭC-Y,w' Ud[ fsk\eNPhq,gca"@:XEֈ2g hR%TU^y~IqwU ~ Fe*= "9EoҭuD JZngr@E..3*OP! +w끞]41fv0U< ,`$$s%w7xeU?Ժ4mKyŮ<ޫl=\4~HM\t :T*3DKJZDZ@<2 Heͽ#^xTM3ͨvSi~0gIl8 g̑JPk~kgF-JoQ锧ŗi_=r@+zU0Vd]G!&ꇘV= #bh͹Kt*sV/NjcCmes9, WSf ˭CQHN3xYsƂ!*J:A k+[ LmlanXJX"(%m/}|TML_UzV1z!w 7gہƝ?ݻ̜!ċ%dͤ{ae{b , gqhZa#чr5%_k'j 32+n{ kZOi2'%uqRpoHhBP@JwɣiCR#m iJkOS¾ªT,0-ܙ>6.w:E0||\1bαR@{ŪMxTɮ=om>^2ބ1H&"+wUiLp) irus ;hRw&DJGQB<-Pzy50N-EQI&|iG !kr"K/ O3uO\= I)nͦDs1ukO/OK0XKΕwܦ:.W& d1U.9g*d \LFOAD2[r/HK>4 RU%Q5Kbp-`Y48s_F7ƌ1\.k>]@ҲQ"8PA#YYL%+PjZ?儵`V&g'B_qpLµ:`~B؊Qyg{w!sLvw~.I63Kr!oFm%Z+ ?%t.:'s֝u_q!d|K*|fx^VHڤkږjMZ9 a~P5lX JÔڅ\}PkbjycO i.1% HNcځW;4:ZM.\ypy/7 tۗ`rV0VxXcƨ 먶88#إ5ƛM)=hIR@]5}L p EoSLR'1:Sgd01&#0Ɔy #[Lsn(v w+{ZnlPHAU8C `deoF19ƶ6n/{gig'\SKrÐ^=Q,umܛ <+G?qm2{\O-?6:p[-P.- lW=SO]؈t^[hz0S2Yl-_?løi)- XdH/"S&mzv+=Wo=)aɐ!ue%f;7fBM O^{D~zR=g}.O7=XN3k7f.xZDKj_Q";'EeĴ78kvM!Ozp)C 3{/4*ids *y ;`*ΦV^|u.js;Ju Mo8[ D+'٣k77Cg~[iwF1L{]y?8\(v(-ҕ'[' 9LO}Wyt3 jyaT/Z!T[2e1rJmbQcb2#.Ci).8dΕS$-Mw;iBVq)$9Mq'Qsnr0w1TRbW} τSR`J߻N%:t 2*F\H0ИǍ}ښ [h*e= EB \~$7LTZ6 Uܾ _:hI&3@_iy&7Nw>%J*ĮqX}DJ77OfR46Cl9DDG3t*F;N$1>HՁc#Z%G^ Z>-A1eE"$a3]$vU 9BbV"cW?<83/$3 )ԡ4VĐaXVia\@C7T["e1u#N*YȉƐ _dmT[ܵr!&ف16TCdJ^a ,;_4dRΞGZR=vmaedF'R߸4Ebjm܎bҎ_SvrNR?S%Cx;Sb"1oOSTv@C=4GJtkg/87W}K_8=MlƅíUAq <8s4Z)J[Gx* MA!R!,AxLWn`|\Bkqtzش>BFj-\w{@XozE9U :af3YIjZ/cI\~f|r}PīXNFo*O' ԟS>kL*l!a:o_[y[KTAW0 e/=FߴwJ˜gonN2M%Vb+Mr'PgAŁ`7'2O|dZ U,ɲ1#ZnlGJyhl3|؇-n˽n|;3GYiYsLsC =ԍ;vZ{XĹ {his@-iٻ ~k i_g^'RHm sNU|P \?%J=v?>A'IN]ƞ/U 9棷JLo_΂k S7KE}Qh#L}r͋w !^ȇ,vQ N6ߜ_$njFâ+Y=L9 PMɮڕL,9n>{7׏yd4w6u${#K%jODhytU@U̼Zo.- 풝ByWyuq>w! 1(;F= &ԚL[8~ij[*Ox>:1/EE1E(8$!R{ yŗ< 勇j:"9y?,C1*SԾϸS {PėD)fb-^5a˩{ɀ.hdiWW#%+z]]~*x @{f6xrrgc| . -I M$%o; 5 ( ԥ-;cAQNؼgT!M Rם-H sjJg `ُB@;f J1cT LLv3\@] ?t:q*] >{XUO&/X^٪˘KNO6fo&#_Ш+m- ӵ{/Ο8jᎻ[s h㧘ʻ @VQ7(Nq)ۿР:J(iIoH%uǵt1Q?flYW^a*s툍*6*RZގߛAGCښ]ʷP]gK,'~]MHp5bPyEk""{2-;JA8!AT>ȷF@FB`,qD+sftߨp TmSJ kp䄌)~rg` _2 |3.ٮ0f/^>Ѽ JCYrtA&–IIGʣDhX{m nEHfn6!ltp_'Ub Ѥ#aD }E~Ű':ў[E2U az#Q O1Yn"E^qY TN8oBuASй1HJ# __kթd5 7u dB޳H;{v.ws\ګnAbOb.3hhM&u7NوQW`CHr]XQ+/a1(C+N9 KG*u%9 p"PhppVOܭY.#2YD[(G˿Vq"BkDz]9yw1o6Qo-pFew"rSH<0+tV>j:`"Sbp" <6WBMa*3$T_ G} ,5,;-mBVwuk7&ws\Umf  )R誝JWY#;r3W@̎=<?)FMa]HV&M.t@H&;f0hNKzYbLX~.w݀c·d1~#GRpxorh'"WO-$pEgJu7#SA4pKGDë "fc{0ǺUmet%&礻($&ۅ *j0 .A/2ۄV$aޅ J |>*wx:TglR.f̩sT㬉B[a7Ueb[Lٝg|"S6yyQiC!mA.lv\%л3D`}=>nɥ|x Ȑӡk\mQ.Ŷ85_1*+.. ]:mbY?NqTv ~|7@(i)0]*ڂV|tF!͍=EHQHm(Uh"'|ձ9:h`N;Qz `Z=#XMPoh,,(bQwvw#OSqS}D5hrԩ)>.Pǘ~Jݚ'7= `Tէ8]Ǝ.!wV`\.w:FX@f7I"j^Ҹ0E?]W(5 %>jYt؂(b;xK>=ѽl|٣Wݓcgu,~n9ZqJ-~JEA "ߧx`k H#d_0DpNnjvq3,ȠsДxB,RZ=mTLlGR¬ڶ}YUu긿#=}lQҋN8I'ImV18I>eTZ1V1ȥ9Q X| 9E]|| e=~6]u꽽񪸹`px$L0"4QI8s9Z>#NUbN;G+8@.ol}1}efoX𓓸f#ww(DP}v$;WAJNS(:[&s礬#Z~L߿E"j!|v#m#42`XEDMP)Iq8_Nh ;FrDu'G{;~v,XC,͂_c!}BojXݸUD'|0V'p>RiVQ &bZ߁7[ͻENVX^`8=ӿjFwAM]\0%t5 @nν~ӝ1Uy>V(SZQȹ䥷\q0燙0cb+A)+Իb,dcJaԠ*<3ahjI#/mbER'X9<$}HGK9^w8d4'pz."SzE*=`:zU'l_䵍uWߋaH hf&Gq!u-j_O8Wmƃ匫B FsM[D k\`u &d7ftQ"Ȗ<,貣̒xJPj{ˊEEw<4jrN8J\Y8*^[g,9I4ܴZӇ"(_NԋL:"+%kRsA报.iyi֬yg/M KQv0-p0bv[$>T>K1<`A,9CZėv(^hݐgBI }6NwQXF/BJw S̀+&||z$bݭ1BndEf̯/i-:Q;Dz% ,!$m+@pGm1s|H@ ( k1|llLxMk@"&47*gbNQQK2|\@~{VYUeG7B,tZlt`އ9Ze]:2@3f s|Su]X{6.{Hm HYF痏lXk$LSpj3+^؁cvd\ނ:Z)-CMNm=2}C+2y?9צl9;j"CEѶ`"HT3tSN;yH |T,f _U4V;8o5"mjMKK%|],~\42Z4PX@yic9͋4ܟӐxYag5PT-]!*jB7פ}yҾ 6}-`At4m\}r`h[xdZuxĹOvq m K +i/3{trSQ}Qgnl=?@KG0va8LIzJfYHWb~J]Q  t&fpuwC>.gsXm~1Tgy/.F36{MWaO2 h$`qV7Z,}I@3SăADNfgw kC(tQ!:[;7fv?gĩiQZ+caiݲT=͔鱖*ɀO6 xrI^'<ν)w_+FL2Jp{S!h( ?[դ)|rvh.n7CQMعH Lۿ&Тǝ-x({Pd{Sq0B4UWS.ط9B̞襁S::zj;&.R`(妊W,`iMc=7y-+Ӹn'mS颔$@ma'*9Hq>H+0vZC׫fS2MkMXc~/"fOa2icOJEBwtit#Tzk2kiF>dw]6gXG[߬pogz8_HOR1>  %=y+ؑR Q7Pk?¾\@?k^*K|'^7h)senO2~⨤75ڇͫԤ9ob}ӱ;\=K( N'I_<Ӕ9RSoQr.Y᭳H3 STPu3 8]˨iō{5X<n!NaA ryktEc^54"l&>ۦv2zm]L?|[(Y@%yd&>vH5Խ.~G$Uy+:Fn$ɮOD iUӃ`GPHY@(O M_,lBS\N1X?@H9[T}<`tRKĀ:ɶ%_-!ʊGmf*IDxšHs.5LOpެX\|"_6f5m=y ESkVzL6a97TRU%:ƒRdX ~izeQ*FZ"HndBjNR~Sϭd}K#6\0sBôԜ5`";fkty!iH/7y5;ugs2l[ Z%*r V>JO-5[j2@Yh rBЁc/ (( T(wL{khL ]6R ⭋W=<AZY,](oUD՛3Y;NY=&>9<SQӒlz|,+p GrɲASvC0|Q[(D!<]\ɚzp>fuoyXv5! ˵ JBboי[1̤{Ku< $^U]sS(4J|1HT=&sTE4tY)ϞClm$Oʔݿϙ˦r*2(0!ܷMj-}Ov:>R &_l`jau5`(uԥ QX1H_ardTF#=@[8}Ic@䕞W@V: wyxZ0!n7!eOyd97?smE!L;Ɲa%bDE>0^ue7""ܵsBKT [&INNQY4 <ĻdpwQU2nb KZK!{9PxGF]=%!NRZ/r .yF|>U'Z)v"t6'>>>ˑsBj#?r1P˹ܧ,nnѸ/>D|-5ruuZjj8uI'|[cixWGiAd Dd{ 73p|輧;W4aqHS_[=s,¾a61h7ZݍMBbzG$#p3=aNl~[¯2N/srg^*tZ)"1!gboh(DhCkۢ=(ڄi;XVX$p h3b/::!@t=bV޽]ܳaA@pmXpb 3̡3OȌ1:ĝYj i bv l{-}HE^e^RK<9 g ;4V} P]!qeBsx`oҸoxcnN Ti(WT-'5 GcTd[ႊ@E9]xv XD5ycTf:,D0 ?%Y*Ҵ4V`+ K!13=-r}ĴD'1Nuo>]F%flR˶6Ar5\(Q7x; A)o#vB[)Nc澋f$*.U@ RwuLc(J2]{bqfyn8n9VZ?0l-ȍ`h -t|r\nit$Rdv/$\l+ %*:&(oU&L_ i[+l(HIqQ–Kk=("<>=x iȎJ <vd&wbJoHvX@ w'۾^ &\e.(?10KyЩxR9t>Zހ"ϭƒ5~g4]xt #mb%{Ͱ5Xmg$gzd:ghр-w+3W{[AЬg+BՐ]TxsH7M_l#y1?$(-7XYlrﷳjbjKU6^j{$`la8,?ToC虢;~j) 2E%Θ /8~hܤ*Ķsncr瑛69n/m|Rt*88ɁҼɯ*otgZVzJƤu)ɷm KΓRu׺UO^dW _18eT r{}ZAJl.8W($}i fj(d[תFsV($Zp[ċBvɚa>̡CHQV7AB-^2v@S/,X]HVY0ֆUfgq!_VWĥ>#F]фQI2AofCL`4Pž Pm •sՕG-Āz;sT Jx w^ї;?@qqP%(Em>n1'xҺp2[my.G( ObXjП6PuPf+NeǏ _ :c-˩`<e̐I`"A{HPtQ3u͕{ϑE4`='팤7C>Ԅ䥘 J!jP,2ߢzv{$ §[V.^\1!FR1սC5 P&'C7p[ XNsbʳ\p LRf"Ru߱uZ@F&}.Wp X͗cD)@]`z4~c0F=_ޑjĵ@_4P]3_A(mxR_(p+t m蓔5B,+E.ZSO<9 (+~?0JG<1mB$wyD0뮭|$6V^JX/Rukv6d?˹'m݋zűߩe+g7V*:S؏8H_>+TYRK9djKBKo/sztTshXqwW;5mG8fiݚ/ 8Sp/lr[xq={O7{ ޔK(A>!.GR}bc-c!Lt͑NUb.*@S"ࣉh})3O&ں%fULǪ4?}VkO:N2v1Tcs),/xOh")2}ë'%M3'Նj0$h!jAo]~mJHp`əP^_FS\ܶWJ~z'GN nD^X?$XbH ]fj~ڲœ TrQlBǪZNnA8ygg^y9ytB<߶W)[Vj-4O%t'qc =N o8|֮r.+^Ws N ]< vFrk-/)W Q2̅^fjx$`YkrT^68/m$4xm?5hQ72ljTN;{z#w  <ggʰlw_eE3 ;Ysa:DPvYEqyD쓁ɶyDofdKىw99##]_KVbÌb8l&.Be) ?yX\5);Я{Hq}d=9J'xCT1uhRkҩ®N`PS'P:F_!I Hj7ߕGcvm bt 鰨1>=n[ :L ޸ZjȐrvR% S&>/K}CziAUoޜjI[ْNwOpDN. Wbo!:tu=ĘϿCy}b0X-d#<JE.ebuC}09WœE H2˔pu{,b H O`#/<5c!/ݠ 2E#Â(̽޲V4AI%3i@T:F⯾;b mÄR0+)K%AM,5fRl"'[(gZx9Y+P[c{*DҰ e]$G.S<)ݣ2i^qS04pYOz }z C|ҭ*ߐ0WOpxkJݢ.xIjNYD>L\,/ٟiFd"C>-VPƶa(uw. $.hbIJɶj֟z?IE܎uy^5_pڢLCJ&2";iWkдaq`@jjmeWA91[^J¼Bj3SRW~-QZo(* 2N>79 c:'`Hvu;ApNhT(3hPw1s UT J#-YFzE@P׋QvYBWZ^P[2fh6pL4l @-K'wdѠˌ|,f gS~zsc9<rODt8%*Ӛ/{t=|S3: UىB"ճ}h2 q7bw1VYOZ)ױ4ARčYѷK͑9JʻŠ.Rx(:?*IMcѣZYᩣøeיS ͢ e K~ŵSCzScrV DC[JwHEݳCTر(F}_ y,z PLJҭt{U&xĦD_CL-xԗy^Hf6i!$ LΒuFH;Ѻ}‡(r`g 8|7YO gSJ[tlkR@,wH g=!z.QЬ#(ֻv~gU/_}ܸor Z`2zx!'q$ |+Gge%\C{i1xNv(W( Mf S]nM.<ٔÈs1;HN"lI[I'r@3FUͿxWM𮹭Q6E\&s@gͤԩRk26U [9Z$Ĭ1L^G%xJm苑4!8۪˩ٱnm&hlqm ,r]JZ?.u/OQѳl 0{^e=[jc\KG5)RqCH^bY> !(QdڟǠc\3PR«#Uq oR*UrOeKxzK@]'D<'C*^Q4a ٢# H<R#6Tܸ6+}jM7|%SA#ھ `n+V|EߖsRt-bNNl.;@ZK O߻Î#o Q9豩IݪE|%[MWb*Kd yHTT$M}Am"'蛺/' u5{ >fJ:?h_ȠO DZa)pOĢ LK36~A]_RV7"޵W&]h5h^xw4,WEBf^D+k3t0tGcYT+33Յ=+D&`ETd{!'u:3㪂0!7wx#SJ!圅N*j]pbr5p~*Ȋܭq+˗ƫTE8ؗ$Q8S]Jg (e K_׃G!8WJj%$&CV\ h+`?{=C21$4+L=AB> dw#զHl/_|Upɗ0{ua#¥GG,mn5N ]c2Ue"zK`p` e :RYoj'ٚl|n&L|T.V KinCK+3Ճ V玟 VCu6/7Cs\:Sil-}ʛ":>?㵺+ɓߐ3QL\e_t( 0ۄbe#8~CEՑyǹcFE3 eWDk?] }g r@ڔ`Pw~9NUs2>GS`a6<8AR\l.߸D2f$48% (CX1ktH'^%?URD_%-ٲif[ 1< *wKc<꥓$̭WWq:ښ'&~>܁)2dxRKxnK QGmy掙،@bapjHl߯mnb㮁m8Yhe"٤09vI_ux| z4ܡ#Lޛժ-ydWpHtTBK =y99,eS+yMz2E0]bm6ʫjd,WNgˏ Cu* ĪVDkp [پ+d.kޓOOF3:vB3p۫LMUIW]ѿ:ECeb##:;I5tصp+gҔ/MsAP$Mxwtֶ^xӼzo/V9RZAx}-)q yH+%(9ULH?e=cU5[jX}!fxyCuӢ6l *I^g0XZQdv?XiQQįޘOsn%:.瓦C(xHxj}3&~ Əd~6XW%;K2~JDL2Ji?#Pn&KzCG-H$FMjqL?;KPPjw2-Y HToU-A&?8Qu֮n !e4 Ȇż>Rtɫ6yZL}U_>(55M)ctOm#>;[UO hkZ&Է6RЭA fQws†^UW M9 Rw :]bI1@2L"#ўz|[*:qK)}.9Tgӹ8 %$++--N5җkLYuܮ}I>|oZ N^ =,߭Z%A sV؞A.b&:Jf+ r]mtHvBj̭{ƽd&@c&n6>M-s9iͥN<N#'c؁44s6DP~b%}3$[Rt~PXյIbVe|4x+sMP#CЗz@1PŁs`z|h/7X~и;=^Bg NDeNݵo"'_.JIwIzyor>Y: žݶޏ!xwKFy6om\Z9\/fvCVC2Q3XArNd-L1AShzfE%;4DL69:!ZDʿWƏz};t2,{;C*.wkFbe`;dzZ~64YsbO$tdknOȷ|w;ŌK ;P}aK76JSP؃UN1O$mgp dQA=HG2F4`&gsySHW gJ(|5YH릍mh|ЂAit`(p+E.nv [b*ѥsaFYB9&h}6%!&z!7EZӒ%x'Z8Pw%%#=t{L}l%]i*[-C2!w\OOiBSK,c+|>ɴx~ }p:Jk-D`6X]X5t텮>Iem Orؑml'uai4|FOs9Ҟk<|]ă ׮#3n %<*\/`6lqV nl { #.={xL?:\7~{ٍ]IvU`bZqF ེ: +䝐O^Lӛ0G.9Գ 0 h& ḆyQ d;#00 +{-։ȵ8% SsʛD.B)|v~7ӷ(RjO|X+> oyzB<QF`}/1~3QyM&T449W63 ;iAY]` 6Ѝv^° bMл=ĸaH⹦+ Zv%SW2\RyXѣx}cZ3^3g U/ݛecD: }ixav/|$۵RbF8mX |_$y5 $a.0Ei{u*_Kė ѺF x&_gT\ U3TTBC$%^o>OXܡiZc]뚂NX՝L [E CoP mQx):9QK9_dZ8B7?jsÞ; k/?[6- M\θʋw܃C  a(*t$]t5:XaoZ Nɧ}( qKnsIMVEb}btyPɺ7zuEY3ܭ{`Yiq4uM\N0AtyN?A[ޕ*k֥] 1$RG.m g9YCK'4Э =:c_#+6VI52/tGY+k*qȪ:RI-^BN\ ,ՅcRqϪaOdl+sB[dȧ u8\(W]ҲF-q#;pv']`9w\S!\Rn~AM&cЩ AcېԔtjOBd`TEJlOn&6d.Jw  r{&pfe؄}x*2P3hVԎ/J1ȺhBYV׻\^ǥrYhex~U/Q { d S5yVY|tG"]z>')ɺ>e8kzrS[7!+8*uY#{ADTIo_s*cm0A%^? hM5?ZaC ڭ&[(la\4EҞV:|zB*-&#̓0>Zr4 Tti{A2G;eEeɕ [$+EtLƾJ>[o#9}cM0ED|%CsF h-G0z^kIJBLҺ } }Sa*RxQ@#q\fH,)Bllȸ`TxCFnNC}}(gg'-γɺDڢP`ц BF2E(\Sʎ[=4(X7ڗV9~b1ق,GfEJ W>Ωlk~BI-r4T>uv X$4|<:-< #(Bj~Ww(&znBy<ƟH^3!hv6@3^9̎xDJLcxm~ pj+τVΑP*f.;@Å~!6i YM(׿AJ;۲Kv | y Vew]4^ GbϜ3TzY{)$}8OW#J _` PtJ"uiY3j輳!d8*S't8 8&_W zF1ffxO#5FOm(%nU22>12^$z %躙Nt  *w ڢOW[q| XVwx.IX&?PrLKEHµbf(r&Gr, !>Z1GvC0EBIʞ α[+|>>|'s`6sV~b1°Te`m©EnDbXn!8_sP(!ZN :PQ>3Br-I2zۜ!Qt HS_l^2sNpRbRTٮc"&otnCmf^ ϲZS^d2N{ݘFl?Ik?U@fS8]%>Y#&L{8t KkK= pyH{*v1Ÿ\DʐdW3r MC@ e5o-}`V5®w&qԢm:$L2w< fG@o*Q撳m/P.#Vic_^N~X@s"uC:S\+K%=g-y83/D\VSd+ir\ 񴱒U itEޟan|/u_ 8Vր;꽉 r5\K- b^r7m@C)1@buC[暨^F,|Mk_30*޿;5SA;>|eJCMnSĩThf݁6>;/1Pd#`Z ;4_m1gT$Pga/,"+%",lc9ߙW y0" S(Y@*As?{IrX3j.b:Tm⽙LKEygӔVP5#zN@B oMo|;$U xpNݩ[FDzGDVYr FSŜ&vV~C SUMY#ܓ7# $/7tmGm$~ S92;O93v0C4]s/!M!;6d}y,̪zâ"D\ؖ:*?GYy5 F>- H=SFYH'c;z"ps[2S6C(N$\٫naAۃX׏rL=a5mhǹMuC fF"$\M[*nq*HiMo%#c5Ef"q3 +jtxm'n1`7'/xJdN>wѴ,AQm;i9XOdU5-l%B8%[*ۿh vyRqjsV'FÕz_#*BLDRGޝ DnMy8Y.S;QDJVdN ,f±pC7!3="b?n+9RpӎPp$#E vez s]KU) &>j%)^׃<ZK:$ylJ|C1,Cc9+ /NNLx~;!k$MΒkRSG*({,A/'ATQե\2 F#Kc&=t(c n{,fMd_md,㹥K_993̝gvh8%R Yl8[ŗ=BK|V^B en/zY6ޒ>$)XzۉWR*.9\ԩM*ʞǭ}` ڤ+E\c@eeY s||zV)ޡ|ܜe#DF*챈Kn9–jٙ!R2ӇaV-f1BˋܐbԽ`o.7>:2;d`m,Af XzoZ]c #1yՐlU%Cqh YQVR+j1Ӎ}Dbh9-tdТA ڪ# M5b"Lϯ[-RT=#w0Qa2[J]d&:v^76|Gۙj]K.]"@\]|y bot,& YTe\";Չ8J)Lƒ]㼷Lكʻ31fGmϫypqU6OBCLAJhb|ܐ,7xeclA~ :v :[}l@7u'Vz}ԜEs%]ca w6"V\ׅO8lnĖ׎MLDDꌴ`8̡<Ĉj^'7Dq&Xd;&lnfi^C.H\ЁSGxH5&ՊKł5vHC1'Jm2o"q`8>Y V-xSCQ\T +RhO%VU\{YW|FF+RA`([x0(1h}f\NEC \n97AmAzMM_ _拥kA#msLFqM̵wq`LϪPO19RXƋQy"2sD~ŗ^G^W5ZNS. 'o}JY^@ԙ+⍆U8M%v3=(iמtm҇ޏ- uwNµExz̻Q%z%:!|oרn ɨ*QH.FwRc֜1?]hQFuˇpNY*?sj>ԫv;"U⌡iv|?:JY0^|6ӏ9`Z5]]2$M=-6}MJ4XkfctQz`͜'o&)o]JS}.Py6F)l@_tO^V``CYFVYm=-W C5C;qA|lyc2 A/Z/VG)`w7Ov{E"pFcECe5 3^]Gr>7IhPhI}1+zBeҟ!87Q%OtK A) I򇎈raTst0ޘkGDVUG[MN6b}`WIrh'ʚgOmϋK{\p'#1Dxz>Mj{M˱@~5 u)T!5݊ʦi]Ha`+ sƴ%~eWq%Z>nR*g~rVRٲˤY-,`Jؖ:s;x? €z6ZoyX%gޢZ@%N DM,0υ.P4}#DMfV33TBz?vd hQේ=}&;`9Z.mPЯmocsUz \l:\UX+N3$q|iGȐA͇sHB ͠L,(/{OAN&YWDpL{f) Tr*["L|D 8V$㎢D϶/?~I7Yb Pgma5 ! q X;APWa;fCWʷ}I}u7Za’(4V^bP2.#o>Z%=4@gw{MMsIV\l -߅8&0J;&!_Lm?rʵEֲ7)'ڜZ6H$0Svן-f#GY4<2@;Usь~1`iW%&XѶXeiUZJ ʳ" f?FQ>2}net2 ? > /+'L#PWU0xI( x2iͷ cV1\p)kpF-"Ǜ:b7 %<7_氼F 8YQo4rs<#e [GD/l "vcXPe#tg.l P_+t>-WHLh4s "r[*AFy= HN`0 NTh$]ӟ9׏˶,=W2q!/\\G2 Bɿ977ͷ{1\F6&vH}_ >'PDnQ!qO.`J)@xv~giP\A\dwNGЭ9 |NFDLwu$ZPbc*,u {bEʩ"f5T0nԋ|r$uH6@ TE€ (Mo80np^0l)f`w\/RW E!k$n^`VZ8s{ゼXZ!-0j;-UU|욜ey)-kqg0)ayxb1CqR! ?!IC.r9HۣB(B>lsbB<7ȥJqPC ;eÀPХR=dOCG}33F7 o4bhEj tzu;ukWܵFf!ţHбLBD ܊'Q=]xL`;6u(H#Kys^s3-[K?Rnl%m6kij1t0{tKXHQ2il'(W2g 齔@_ulEG{2d,pg\K ufG l؟_.vrMTI_~i/SY+E$ ,8Jg)fzv2)2Oo1[k'r,AНN!e4a *vMR83Cl3-.V 21dnQ-81ĄtYW.\{8Z%2.O^YA7c4Uǣ Xt*5VعK{ǽec舫|$c!nFJO@i 7ɀNŒ}opEN6bqt*?uFT]ƧEů珐=I7$ڱ\ ;{? RD5[HrD|k6>C]}K`73;zn3e8b@AO:_ʞ5ӮTFg+blL5[/ZHa4Ӳ=?"1"I)(TJCaϲ066W{"<]ʮƠĸ J>~\tnzyyu{+f<+_\ZxZqd=onӈ? W@IivوBȗ5оHǀOD-?Zk9J,J;DHԽ1{1JVj@gSݚ%pGH1#?CGbb |nQfX8ʴpBI`"VN&_!ER}Ql de  1+qnv)+^(cvDaST@[<!^*$Mhe( &'TsѤH" *ܽTQ1c=|Tpzn\gt@rnLp="Kku,dXSxKL=O"jDIHw"'-=v(n!M=%+yĩ5R꜔MҸD*hR$0k9n@NS$ 3"eaQ]|Ep QhW!cZ Cw`Ψ~5Pр_PگKjWk/@wiq#b(uA#x4?b)"}_ٕ:,w{ce4t+Qo8XW=QJ߸9 K[7޶JZ@J=*xc5/~i z[j0#.uy$fļg3(u]OY̚_y 2C"47,##/]Qި>bg7'tv̹ki{IWz |{T,P~^*~a,IW/bE+8hޏ$&Yciir3} SlJcB1m_v֚po@&q5MLBD.ꌡ&Gr~ | HIpħ2K|=#q uv Sw[(3@^aW4pm_8̙΋.lX6h՗0_psdĀwpD( %}6xkapO"U{v"tT׽Fr5Z!olLmͣSOͨ} V@qv6}S,\5~9̄~~ ,v.=jqMVPsoO9fskmB:3?$]8b?SZKA.Vs9/:WnRKM @ey=7<-dAJ $jP貐T^XK~Hg!Vj 5rBX\}Q MXyt[7 2V!_%$v1q(Wuyu&/tXD(FaIS7"}F/шQ÷ӴVARv*c$d{y'钧-.POv*rj< IX9}?Vb?xj. *gciLN10*Uߨ,~7egc޹eq bmŚн遽I<PܠָfaER43׵UeYͺ>T,GVoW.Z.0OM$MшҌG)9J8Z`P],MvZӯ[>[MfFإrR/mټ Oifuk&#-/o|Z(UIT67A҉&n_"@_`jjveYWB4eas 54t̳(Pև%y׽ U{jBZGùYO #_?.x7řQ( x[Q%rDjr0yI{?[oãQo;]! .(0w (L??lܹq( q!ĺ" T_rQ3440-<ۉ#K H+?Tђ2$/F8-ڦ}ȤVsCb5(#->bL',ko0ll9P[n`b(6=jayqZamM' T⃽M Y^ 4PgQ < a~ 5<ŪTVLP5 @ܿXڨi0cb'J,r쪽bCVZ@ˊ]borG.jW\=xf}I;O١_\r-(s91#gN?5 h L;lR:z5 |~ N)^Vb"+<^_5Qܒ\*e)_P/_+48M,&4>P9 %ػ+[B'c[7CCY S'e>D; .rƿu}ʏ L N%*t\ S?ܾ?葧8cD{ЧڛB𒪤ˎ dzŰ-1W4/M"JiIE=&JA2sr?>LmA?uqh5iᠼUm۟0/]$M ǹ QX6ZW4s9O5ꕄWT&2ب'|DD=lC|Wͣ0X x(UNBB=gLt4^R+*(*UY|]/>5WWpי6Nĕ%SӓOnbiHYTM\“;X@zVE3ţWF+$3 VX\2i}ܒ! IN(7Ȼl+ǨJgMs?f9Mj!WH4 fJm=y Mp^#"*H=ӧ.}!a  gqKJC0j֠ƲՇTK !N~-H Q`0Zr%J1UAǡBڑ: vI?y!ܣ^?\ lk?^C Y4Sbsy]˜δak:!G!\9?K h?jBNPBv`񥛥dn}C MD=buj؈pNNlDsӱn=6/xhOIMD㲏zZdg>TሲLO,r7 {jLȊlg3^ 2 SiP}ɿtrԺ,B@ #0ytF3f 9jJMqyKK|5$KƎ/gx>]ƗyhuD~* \_F)ǪK=pu@{VjRu fn~UR BoX׊sܟGs>NW?6:#J>9 [#8HaX:4?}H$xyw~7X{c-`n^.$lM KtҴhi%{k,䃂cbvap{T&Dž',xXV=یơ:ܧS =kvj"h. $pпE|-wvu! ⻂@|L@m*)N Qf nmE5|˹٩V&"Zj$`_q?j&IHy[AG_dT*xw07rxӦY5RtC*(aUK: z+I Rb^KٴU&I\(#B&#,_I"8I+#CӰh0&=|T`Z 2sZ7opMaGLL^*Q,RL LP9"=GGX@+qjZ I)2=+'VXp\`j4?Ww-3rpCW CՉGM25u*_ed83s'IPYh2MTBl6놋:d-9'PP n^Mǡ E]q/PS@W? B!4]ȧ2m o)~MMj9|r)T,z9TyHV߭VP*m*wTBNx]_dbrC4%i ++\=$/M6s8 }o^FhG~4TI{e!ӥ3%IEq\Hs~c tBSU#r?^8[Acٗ$Q[RpJQlHjߌ :FJH3Mp:m:fRrĊ#66;kEu3M[eewuO˴Zҁ0gC%&]/G`#7-xJBlz]|"=W+4Uxcc*C ɛٖwȊB 5nT4u WY6sҐw@0CkXw5iuАk͟M@B 3^1oǤocxDXf+ <,T{ S1*mO9gYz ՠ#vWvLF4z`<̏MF{7 -]Rsmo|B Xݨ,sAe\m0`@+aZC fnS(:%ۮ4XRf͐=l5JA醗IAtW}岼r1}kw jJƧJS/rdNA]koi얓t 0BX/`Ro'Kճ﨩^w=uxF') vNPm(>p]KT5r[bx5^.")j C)%yrkI;[XJԱ S`C& ]!j^o"4czczl p)(&n|IO.^U/%|A|uT@9oZyiF&:󁷝!.,ATst@QW 8#%jMpR8_,~.y+ ##ʮ3}iSn%Q0R{2iȡl A"PEDG=-t`Jx>cnOQEk:q;wdrg~6|RKiLƲªCvAQ, R'J8O=tAݩKo);[dQ[ͺu:5`Ã!`WZ;l_C|9W[RR}WL}@-KdV-"OxkW+Di|xK}딱59e9|QDf;:p;⹣/(֮{W-TxVbtl\L[xsToQ:-S0sv{*En]\@BvfPѩL:,LNԭ~8aL=Iz0RcJĥD$VF v+TF;PɅz/WqB&r84-+NdHovyw\IU+>Ѕf&/W;Z>D`~P}PcE`Her94җT۰e"p}\59P̾꺑 T#o"P"#;)VdzQ;ݿAQPeUiJ#㎃+/Vј t@*arwg2KJ'wSַZ` =B bQpB{^\x(%*%P|^\)^Kəlsdd>>ӤCW$jچVi XU >#G3 uecm ڼZ>&=+J;IS!l<}SA/|OgPz*j.xMlxÿܶuZƱtȶ] aVFOāȌG'Tݤoޔ700dk\P^?ړ;\1:'Ϧ%iR@.x:X \mX/Q "[$lWoyFud3J.@;;h8,Ds l%q}`Fz}wɭ.!Q7ڦvyg[GkBoepr0ddd5n n^J[ Ŭ!a&~ԆHfoW*אvrYMSi<%EB=VDnms~ s{HI1i <5.=shbyyAmR5@ꪓ;:l)z+`ݢ$<)$; xd9{3NXϥ[B"lns95h_Ѫ-K9~LwJ#a(Ax fVy<)9'(Iz5LY7:F\g6v)Q S,z|ղo ڪrbP 8Jau;/'vӛ־??e:\ 6[}sy?uvXdg^l W+vi3r@Q[_P̵d zކIb*y{ڷYx{/C%oV 3!'w㬖|W^,ّu+*[9ӥkDڅ:K׵L 2rR[jQ,hq/ je\N҄MY]=Z5&V"tMv>5óWd9 mި®^{,A)=L#۴tɇM`D,/憈k ~yfd,{f:ߑ,ݴXW[ϩszU{w˸`9 -czPQ @>1˜S%a/\vOtLZ%8bJ}RobM`;NsT'tLBP">dgihGP [_Yr Bj)p`eZ78(ܓfy%6FȈfg H0KUi+KM3evbU/ڷiZ!zo =6XFجޞ JI4x_X4W] +IK.MZ(?y4?{YglQ-Rqkʉ*1GZ姳MǯxELqN(G1N{a-S%g:K IĄም m '}}RxT*a)Uɱh -Cz%O̦ Gq)W}.l]H[OWޮVJo/'"Χ̄[J+z/Έ"`n-Δj^=l޽Vf Y>/C,Y!YtgC1T?RCƸɩ$򾉉ks7LgUb{; 9TAt3&W:DҎlSr? }Gs&盨 U7_I&aD@k⚛poJQx9z4HA-mPpt[Ya[)ά{)]LRsfĬ>y[_3 &Ӳɑ Ij4X6>y RJՓ$<;/YZ# #XHS@xIŠku1m e33z'uNT/9Dh9u؃A1 vzحqO%^DP+i"li`Q 2p"sckNI`^x5(jo`.3Myzx,W#*tP6Fb]=Dz&NOOM !L%m)-u| ZP[J(՛u3  K¤n+a."a lV &QOQ]Ф[E,4JʥJ(hmV)՜6$#PO7|:zKɉղW SN4%UwSyX$V|*|GiU71s~SVprߦLt G#\PŴ;jZ@:'-%??:=OILሿPߩ;qt}-C Vb7$ uP?b U*h:T Bg[3i8G06u6ng`ϸ;ghce ȨxN=JcɘLHU_ddap\}ǖ+fp.0Hg f&B ןK侦sxUU 7Q%'Z2K#^oXA,2Lk{"qRеk˃d(F[-5QRE^AV={_găzؓO/(wIĮSWR^؀>Kvק <̎S{܅tpoj#g26D3.k$;VKDV]G9gmVDem!֔OF~uϘ$4w^Xܫ0:|@Ə%RB>y `7(/oƱiS>e)7枺ߞg;=K> "{=)]XLw%LWnbp{idK PI&!$0Fr3 бnݩQPnV]:,(gU-<5mIh1J_wr76BG޶R^v3STx,~߷=^̸*ֺ&NoبG"ݴXY|=f .\32pj͚3vmfFC_S`C6*C'2utIaWe7l$ΚwVe0DeLg) sanLRҁT^p^\_PL=:{DrE(qAX*ɽP۪8bdpQl3ɋX^tgyU(_kY܏wqr܋D\Bj U;SJyN9#uX8FrE^EN21gXr-ՉK}}P +h UED{v7FHvw|j.*u58ݸ*.Sr`B^H2f[eU, vj'wԪP7iPЯC?@4Mo31B q OQ#kS2RX)˄v;2m^bre>xHxn_A}[h3ab:Koj*ߏjSۙ!a=V1sOT1R]Cpo&SflST'dK̻& j+Ʉ%419MYJ,[h3c<.Pk ȤK>xM &BOą.  Wˈ5v' M{ueP[e#Z}*`PS.y\Ka Xи< C{8ݶZXj.wz9W NALоoZytw?׷4aa |rk_gӐ19;rtodGGxט*## #OV5gh,]s4zo2ͯXa q 2Qi.lWfi$@Ay @r2O f7K$5&Yul0$1;h;0aʻZr*ڡj,fPQ.N_ccџK25gYuȴ97*~A25\=;b֤L´iEov*q,-Š+?蚙nӒewњ+m,Op%z'ZIiq?߬mƺ+aY%]s̋胇swζ+cj]̀dyX7@\QWT)Xy, O"[ gH{K"IVOf  Ѝ760yf/#꡸~ҫfߜ<`ZW JpKcٙnTt?u*}9sP 3lBIݯK6 D;"~u pw} 6;!_ Otrb.nav%\1Jy5 >)vG)un҄-ӭ"7W+DAI_ANJ /x~Lo/4lc 1͢0JwGm|ʪoBȘ|&MߟX[k7b $ 9+F,ZS,P{Ts#-5ñ8)Q17ryk6M[ԱO{?:/4%(TY`Ǽ CCܝ_ֹ90߷u'n vF)Lx)e Ndʹԛ(Xdž 5@=#Z'gpf%񔝷>kߠ0%GfE<ap<43dڴWorj5l\?b wMiW*8~9vL9e#tտqmZmLЃ C̬M!ϲY!ln!Wf;[KG:VP\UUtJv+Ro۽3wvP(H_[aI|J$OD3FbືNƔl7@@ Wuje2JCRsm/EEο pc^xwQVM񴓛† NHz5m^+r^ۊYE5Tڃ<)FoN =PN$sNjU]8>QSZۭd?0a`GXkI0J ȠՅ! 6vKΏ{RE̒e~PĹP87Ǡmd:|No?ήau yILv7z‡ba1܀_M'5$u⌽ W]=R[0e =XD왋5\ăN3>[A ,=jPO}hQExJE`Ts=C}s:>x~N~͞aku>FDȔbaFR`;/ ͸dv55y"Rz,!G'vF?E5}shϵ:̩DZ[LON/*w{>Y'Lp!Fa:=㒁ճM@`# YnD3Yʞz#(,O܌qAT6-?LׁTPAcuHU  z""`oS`W~¹;}q!^x]RڂCJ ~&c${\jT@g_N"+*FՏ9*v6 &?fS-K'[ʥӹ7FfDy;\"+\7C&/e1SObW)/)9D*l@qIAToe u?&**;^ Ĉq'6̭xL 9kZW%ϕ?/9&94a`ψk()Y& A^VAEnOs'Hd hqiY+F;dCz#܍{w3ΒDUJd؍d\xJŭ<,ŮpNV9=E/@68ciݣ")Q<1(7 ?w y'VMVK#W0t#,}=R'ЭEۚ})g|*(-58#(. m)VQJb-eBwC:F]2`%*I_7$B'~&HU|Kma)`A o%TMbǖB<>fLuo2&_iJd"7 $Bu]FN>,tuEI/Qwe`0[KU1R'M9o'7S5MAl->=?yi*I~"Ìf 2G^fw)jtg(+ˬJ*"ӎ2*NգF:J0EH#h8s D6y_Ea3A@{x۫<^{~PHZ &bet~_v0;Xl+J͙|A%IJV/YO3i8@Dp84LJ҈ĕUjN%ᣘSX!ݳjy`$Vm _* xU23d({24{Z2ES,A`ؓ Xa8ryFǽ^B\#?wtEdY;!T_h A2-G)x]"gi G2~uq5 ZHd_LyeZU PX2)Ҋ8A 3@ ȩP^`Buհ%IP"1Gw [6^-p ^C;'4OxEjf@ɓU?yߑ&Ԝ(R_3TyRS%u9hŝ#S^KiT鿕9ٯcFDKĒb(xh 3 .zTIWwFWGkzA,ڮޓ EF4jDwq#)@Bn4h¼X<稗-#aHE-Sߏ;ȗȹVxu_"٩DSHIS,%~SF/aCL߽VеX7LT$h s凫lZ_:mq`1EiV [_w%rˣy '\!гwEjfg7IuX5~jQ(TDd;Qk"z3-hIl)T(ao5b?ä2g`6fMQk\MQח5k' Gdw >x%ew^2_/wpZ5ZLsw8䑤/qam3AfkRU?b~QkEPE F[|F`Qd4E2r&k8b _kk5FT]uQyEG-^MBWhM6if"R' "tq[]YhYzKȤREUCuZӧY'GV6B X`j8*!G {WA@Edk qqdjJ<%>:Em=)FQ#Ύ?}WMp]̟n}_KůFR"@bV̂'{ e&Slt^Xs3Z*ՑC єw>Ǜq2}Kt;#VRG Ure,H!JNANEd:v'4ƍ}i80|) ՔaOfq0ˢU/^ L's ~w[YIn 3db &A `LU/m;c[5Q'>Z-=;S˃ o,˰3׋E ۚ>(w OghSlZ7B@"`q V9rF$z̈dLf.19bIۨzbO`b} <=ROYbkM `B5lcca0!1UVn^h)kz(̕) ˚k0c@-cgY[䑧r@l34F75Y;n~&q|J5 ciPZxL-܎ͮTB "l`2!B7`\?$Tă4,@?0;I&lo&{%cO*G @OC!QY..05z4 JŚRe÷RZ"GQuP!'A[DPd<84r ^!909sF1v>6&SVڙ%yaiXپp wEUԒz`0+[g=]k4J>rzuԘdˏj1ɔ7t׎^'EJ'gp(>eo>Cf*Jo:=NAoĭ'{? 8s l*:f#D1I") Zdg66Ef)Hy㪙>>+lXP Z3*t!WͻͿ`Wx5 U5=P̶o?}UPlT\_ |&!KɂDufzW|̥ 7S!O|;ĬN#u]B|R ^ګF'.!޹[c\dkdWd-+T^_+NG'l}'Z],drQ&QVUKHSH VԷn_OWyB|,Qrv\ 'kS ;r{aφk^'aBT1te>v5Yr:AY.VGIٿjB>e hڕ݉Cv9B'^`;7ِs2\QE:~HC(^~_5ErU{YѕF&k;hvJS6E.1E5mvit% t sT\vPUCuq}-g9$%i{?޼{fnl([܋jYZܿ^Aw#1RUd,=g;"^M,/Ħ*5i9U"`8q,5;a{[~<AR9<e0 =6'DdWF҈үD^ ~I uO:aP]Unċ؇]hslVSݸ)ʤCp _e}Ata40uM8r ';5Uatg)-ck:tϚz18͢v׏ʛQaҳi58z^BK@E.M>UR-e4xKz0Yve͢Qu*%gtr~#YN!#hI*8eloRt Ϝ(6`:SNgބ3h31b\+_J@",:4Cj8T{ ؕuC+>fDҘm}` tp2Ƣ#5hj;HyXj̏;rJ}?hX ^`6 =95=BU)ȏ]Hu#ѯ5 SWi |H5L&BGđ6%2``tHF}cXoSgqu3?'Sg=Sʾzq1y-&vqhPW6 !OC.h>4| C>-qQpd#Mj.$̛K/6)i6q+5JyᄴeH]F6-v̰Jec'w_b ,kBF[ nʂKu U_ jClMbWZ8v*cqEz*qɱpI/eGA=.2,[0s\L+ 9ܡ3Yv{$L 71_$t`ZVOfvwf|z*Q?M&_|ݘ6VB!u" ^7rAn#]@ͤvBd}#x^=Yyv}縓FVz. #22_T*I[.;KYK(UcuV8)Ĉnpaj$ Qr?#Htݗ(rzuwPpAsM7P&2};zj*ȧfDwD6rT4kl YfFZhHneǮnS}ͻ(IEnȃxTVH$PS"cXTڻaK,ڝTޛb֠?DϏ'LLw)2/fƁ S422C`-M07|37q[[ϴ8N~H) "Bo#2tO@O>:# ur>WCXx;znJr/m5{ w1֔.yo8mʟ^`{XLɂE#J-+a+]GkfJڟ&9sRҏ7 Mn5Ꮑ\:gٯhq`){?rgNaXzBx! XlDGKm%^bzߺ]]q2OzIEjB//L-^r{%< 'ZlI1kmb0xOmy\OJj(Nu tDęe@nT FWej[YuF(X>eˇI3EC5G kR7S$ Я<]kU>(٭m:¾`PĜda `hW&0p( 65TȶFlҕM b]jwo4{~Hw`*-:"6]4G].>lgM 3bB=s&⻽8,GsNU;uţX&/yk wճU1Z ZLeÐ݀ ̃$g_H1kugv|ٺ lj!MpWr!AW2h V"Z[[!ZKAŻx xH!y{ Tȉ{nz*cVoӷ-#^'qYŠݡEzv3GavI.)rմx?[< NcX.\j+rpb0…ŗ~@!EH![u]dK ! U=-M!! p~:B1}#҂QxVrbUjǃ|֪ jIZO 96CwityU@F[gs" >*ЈJ56-K}8)U7EMۡN:ϋ0AQ[n%·OY Irwۚs:DS,'jg%Cy5%ӎ \VmC:+D6+Dϥ -Z3f72- T7N)DyDOvEiXL_oas{]]cjvyEDpu_N~l*+O5˒#HwpPD=6DKpIaoOs1|SUHa*<+w9#^O6Ev6B_qN_&śDlwd:T>>h{?\TO$AQti])e-fح*ʝkkTcy*d첍b{"o4, obEF0hh\Fr35Wk57/H41'ѹ3{69#m~{~냬6]|yV8M) g}W-6yʧ/-ׄ b5 0)%6zA7ydrA;'QX~HC,-ҹ-0A6L&eu]SOʃ[T=;m p; @0>6 R?HmC<Ɖi\NpҀm "{̜ik-r)#3)L[8^ƼQ7ڼ T-+T{6SsVFk=A{6FȨz#~ʝܹ0Aag?-yN^sn_sCj{d|*`f6A 8+u^ߛ;IPws_|\^(~( \ ,+xڤ抻JE:PnTVSmK4 Xh^Ko$}LoPku ֫bXÑ٬\L/?=ȫ`~r0̼aD9m_пLYal%^W7Vx"j֡qƗ)w{%*ZKauPU6PwلZ-@p -DZ|q9&zz2tr /Ev EֹMxA凳㰜~V1*'|g>-lOMγ5݁P\ؗ4S(1Ľ>)&aTi@(5mܟ([8ty$=7+>DzO& jl5&@M 8noi cΗӭ}{lKBp^u"sqH! gkQ8oBdM,tyJiјFip)1UX{R.r/4qO~`~{"ȃhUdfҢB{>zM^Ck Y5fܨ),c(iiuh{V{}J ، lܜjőG!CʳcCs %b>%/̀x3mƽnT\NO0`H'?; iV':W6n=كЬβt9$ƖfXu73Bxqb몚TpU|>HL *Yպ/i=Yaiy3ȻY_'yZkMHb 㩦/5&8 G큸>¡/^CW *g$Ck'Iל/AجYPi0^9Ӷu|> (ãr2Vo4&j1rB@" M`͐ 38VE/|‚PsB𨘕ܽkԥP՘Ɇ+EQlY ]XmUvlȌ9} ?rw=T hu1gmHP [%Yx7񥟉g`Q@XPH6谗P[#jCNjI0*=^:lG>*_,Jd:Au*O57;-E[ 5..ĥ$G^'pjS.x Oa%%:c!03K"WWch/sk '4t|q'iב3u!IT#ܰŻn8zQm쬠:fs_v*ӈ0/|IJW"6\7\ce-&AWF-,we/ꚣ@MֲIQsy4Zgꗪ~և@шҜG'H^MbƩ'\?h[a,(N+g3?5n "#g|?C0),25#x9Gcr'^-<  4s䬶!hfb6 2:(gk{w<͵gߓG^y5ǜ(qȏ0o*vߟ(X~troqm&#Os`b/pl7 ̳vZDGs`A0b=dunRAb_UR&WQbR`GӁv \q-9y@z*_0qN.lHH6jjxL\\nG>x z\!ZЯG[x_f\wF \O3ʅmvtTo@ OktbU]PG?4Afɀ@Auh$Ao^hۦX Olc_ 22M sM_y9y&>)Zkb\yT/hIUC?LPKr:SrT$ cArJ>ʴ2qe$KC4m.+9Ik…]Mh+p2#::\Gڐ(lk=Ġg,r ^NW;k7o%p˗mŎXe>G3a_[Ec!jo &Y--jڪ7&kV\p5O)}_FҜ+IY.<0jꁕ3F .Cvt iI%*buY1i!!MͿ\:vGFUUrriD~B҇dE4 ҌRVSxCoI3Z~Õbͽ/XakWN'YC~:rZnXUn?(菠d)MzIJ|~Cʐ/eL@[Xd w0*3tgyFD`y@@` *wQw:!26>T&'< bu<A{ +&E8O=*5  ﯞ' Z{x'אVk_E UIj]͡)y42b&߃TkQLڣG8SOwSye|7sj NmKX }n!gרa8c%C1dS壤[rgkŞ^ {5z^"KU$zC{t 0`$2t \yDZ\ݯnD*ȑ:_{Rj կM8xVߤ[j@sjʒik\ǴoH[8fK2r+ ˧0)TH8\Ls0zoQ|7&=3$2.|"i!xe%[!hL sB %w[dة "taeFV=a.څYjqKyZ%y9Vm{.fX*b BII΀QwE̗Vw6.בWr?jtd;.0_s".Yv'W!}:E3}У+aSUiZ OݘW3e!xo5N|)s%Vto2}M~Ռۻ>sLz ER(/>4,?NDEm;hWO_~}:^O,W4bݡ2_i񗝍Q"y :SqD#1ù}BG'DQܙbwxq%LZZEOCqo_{Gd\tZܛ!2Pp]\͖8/@6WSGQb,,*y!=2gKVf}=  "*zx?n$U w-x b9͵2QVKEGhЁMrϤ\5V IkzW2׬W]r^+PAH+O4'oĨe3'?D?T `ȘFܡ4Ī~)z~puq y=HNOfz܉]r82yb8= .z: Pڪ?WBOh J~}ҿ&0>"Pw&2y"HWoTcdawF!/\7̀T|#>7|39~f]|] |9o/6Ɵrzlׇw%t7H\&75'ƁO?0WwG"_L>p[@nHNB[@/H43O甕-N>uvO1U< 2.RuXGɅ{ Ȁe@DFVFQ5o$7yg}~nm>DFǀU>K0h8ݯ!lRUtXZSp?-Yn5SG?I%~*q-Nacyjb] Eޅ(*Y j{Mz)J6סNmYzp2v2b}ђA]r^H*~7댣VDk}8B $F"m]s?>LzPh my[ 5&u,<8\;FqZ}GS4D)Nl "2.M37BJˏeH$o-F!48~!\iUGkNP@3T2+kD.(‚-N҅o"4JfferUP-L$yIԕ4R$O9I{WW<-iQ%&0:oZTHSEav;j.vqQ7[*~df8}$Z^{"$GҮ~b?Ђ68J]N`!V j>.áN>M}F !ckI kzV*!. ᘋmQۓNݡHs^KB\G4mzp&燲pY27?T-t*MQ|W5gYQi4 {} 2H2_UY؈$*+ZL\|!)j0*-Uɏ?ƀmdi"k1#`愦s)m"D;_͞O.̒DɴP6pŐ "xE4wRЄ㫛' vX#?ދ-Ղ5xiej)*p)4w2sQ{rla9f#_M #F7xGѢd]w<ȵ vbȗV;OpT-7c9_~ז3ݿ}A{Bq7f klOGNoJ!%<P3"}l}Ib%(AK*hT 燛G=X7pX 8tovC\xd!G> $ 8NUpZ!ax@_.& @_ Ԛ`:^X8zv t\,0k @_.= ;DT!uCa!r[2%L_ G~bZ_D?lAUڨ1xERiVz[ UsI VbxG_(< /GYkL{Nhfέ.v@-V {bz/ݤwP'Eq&,) H {*5|Eְr*b|mK>fc5 8@D<6⬽`SXR{S{|sB=v|h&*w#;Eո`Ac!eqgΉox4HF.!EJ-n4oEƌQt 24&x -gX̾)u&˗5̫.`BEA|YU-HE퍉G?% mKMK{ZT#rCo"ՠ|ɯMnpx-GJUbhusQ03VӧՎ&Gيw~#~,g1[zMgaB"dÛJϥIbwS(|N?"2Ytf[J?Bzw ©,OeG#rlC(t^wCWqZuN^&'tZLB ' Md d6Vb3;"cAbJf߮da޽nnZ$5+]ӑgS~2s=8Ҝ!%ӊ:{jjg//P, }V:T6ߢP K8,P e<>h piMl4'bdS]]q7tBSF}a@"06 '1qh2PkCF}̮Ƹ!Y!3荹dU㜏-}rO?zH_tI+%E冷E36[BZ'Ӡ ǭwAU֗wt]'qTAkݣ ]l_9*8oM^~*"arFB*RV=iWZKY<Ἢ0uIJOT,6Qqzɼ\rH)Iwyi^c|йGEx@$cRH6amH^Ȣ=EDEG4!$Y^<(2@X ې{!}(Gձ 2u@]YOvS]࢛#xOঘ69Y>D");YbnaQӹ.6Ў2U X YH60' WH ]w j7]vdT9_?HM!mO͉[ 실ƁFf>ܝ mm3E s}t\3XAyaxB?Ӳb& NI p/shO0[BYyTNB2>:VRiGqڿO*vIszIu+ @*R¹F<\2ޞdѫK& }cjH^^C{Gws`):XX;~\DnO 0gN~ pg;q@uT5O@ DIû5X@ }U MJ"g}u4 D1 F 'C`S98PvwPOLE&!fZmcG; C.SvT40G|^+)Ld_x,qS Zy!H5\ lJ4B*3'3*b=*CaT$_+W5B!;,ӿ#ȍ2y~!^J9t!lL,Ewp,g>?FLc,'1TtR١D,fgǃƺ܅%ա\@Fj!4{bκs@{2ΩYBf#8*|kLkQ9m MTV<m2rK y!dc=RnpY8mNIN6ueNlj93MhRJd4W0A:01\xFPM"=wȕ=}j<%\MjFp"7;ADŔ3'ft'rc]3q,.RICjRe9<nV:"o6eϲ_4=WCf D9Oi`UQxDW;~}i̐#o/O%HGyIyn1) +VA0 DW9'%Ol:^m&=eͰѩAl{bf)g_Tgǧ>фhK2~*>ߔҫĐ_`RLJviX8(d O)} Zq>+%U{It`Tzdy,hE%׉zm'+I! Yk?xyb}.Y0b3dqYџX ..et!oQH@4.5||3)Ҏ~Ox%CVd5Vwtؑ^Fn婐X~ĮX2Zh^SY "Y x{.8UaHap\2O] G`IA*55aox# WI%;Y $WsEc46Vȸ(Y5#{CP\/' ݺZ( ,ՙ pg9Kp"8y{Έc:*nE*g7Q,J5J/hVtzs;Xr/N令iodUŊgU) 4 r4Kh9yڹ!s.TpTgЛ?vSAqUZʐ =B Ѫl@_Η#M$`@iޥOTkJT,"8c1}uTXh "K#{р)2|F .cpq-l}J4PZҬe6 ToKt aLFb(v =, v5B#C6*E H&Ƶ2J]a(;!DYfKr";,-x:/CJA&1rM'q3"Bea {(-WFw*S .]E]d੠Ly尊]Х{!?4*E>Ne^vϼPo=p9. b^fP^p6a #a9~WNhJ3en^WP!!=PLI:ޢ!ld8pV0ET==(d\ 9 zʺݎsB]V7~H UJp%\~#Oy6aX ySb}W "- 0 ({֐ވVpWo.=Q^Ya9w"lQ^sЂ<{j\xg"˅u1SD1p8S5:O0؟<zꋤN G}W՞q2/CES;?ƽ_WTxX*.Ø9kIA0\գ(P5,+Ft-4A;J_C7fsŲ>͹̪!4MkRʋLrN*Jʶ3R|,2(=f+y:7U97ӱlLLI@ԭ v*4k{&zzGh_pvƽy^[M a6F0E4, ,o ft!{B$ީư|;АBVa,LV ~[)0k˛Dkc6j(,VcqcNaWi ȧ2n>X%82/FiCoYV1Y9:Ub`oXQ &pxfۙt_,B"=\]pufq+M^l*jzkXl\+ƌ#zVUSۑC $8 (8q\]%[@&&<ߌ3Z4J!(:B$E^}^i3lĊH403(9 1f>#X? mm+J1mk:I1?o/~'/6V*TU>av>Xs0hmS/Q,\ iB:$3zvQ[Cϛtv[qBe4bE5Y!aE M@;`-u)>!>˪R+-B pea~mx=B)nYu?/5nmk=nMY2kĮRTkO/\-?4G]U֎X"D=ʌ~'; Jtw֓G&Yrǩ|FO p5 xy)sVzBҿ[rL"B Xϼ;嘊%ٵ%~ _W^C|7+՗ɳSPe.+W]4VgRk!2]8@CT '9qx C Q'YI'.sїN{5]!77.9p[l 8WMO!]>.=} -;3α m{ 9 4u]sbg-:HOr  usPS>m0b$ ήbGYRWU3bM8V_>02} iGΜ֤콃oi͝ɚE9$F6)u(ru;yeJ^*jˁȹo =l?x)FS8E}yF_Xߌ±MYCo&/1q6pC[Fw|q-l}ȵYsmDf*>=$?bLV9Sg3#K!;LsA r6A_Dijˊȑ̘BԈgMG EMz튃Mq~C񉌅d./Č},l]Pg*5_4_W5JѫGymC:,dR-$&.]8b`&Xo}rk7HBvV7fyURR _k -}$hL -GGQ+YG,]k7g]Urj\~h;rO-s-O #CKD2(P{= [hwU*V5b<)d4ec"#2}Ն^ Fԟ4!!cߐ/^ bCj'LM /:+^zsmu _a iDdHKKe? 2ëd+:YqD]c"|I=Wkq?x$a_ \{m2/u]0[k- *pѱ.6JkHw#gM>kC~YnkKqQaX}NؽhS3oLz|#\>Y,+oQj%sXt.嚕yj0/7, y8xtLw.jB1pW0jh1s`CCt%]X}k݉p@>kE;8>Ԗ?/[aVL"9BTrҮi{`u H|/Кڕnڏ\K#~_H@%vIzVvHvIt ROO}IκS&,yhQ~"+t)b}r:ׇp00SNP<7blB^8fb 4"D5sO|1k@ ^1/jP/ymS u46٘͐l1k 178.d2l`M$Wc$j%B;#L6mgj]jFx}F{YϣeN' !BӰBo<8J 1 +[<_bYGiY:_5Pݞd *_BdUFkc:G"2 L,ڋC눿 &8jBchZX5~!91a3q-%BV0lcZ)J=y@fML\soS4uڸF%0781^QnfRRsB, n 6FK`vIy1>p ZGlw|ay]`ev1;'*3o^E1TYaAurl݊E'"fxy_B0? @vL_P=r 2f:*n/{/Ӭ4G]?3prfenSJ'2%Z'*T}׈mHjsXkw85 Z&a=7]Ѥ 7~g#W(KxF+ӎ+?Ԛ [ p tU憑@圲  }W(K8LP:2E&LZACtDR 3h72L=SCscE.TK3 ¯4^!M5]O `WOg /?"k1%n  kS\ylS Ӝ]C6(PQȩtQN>&!;sIHwr;eDRO-:Xlɾ1ku$Rv U :mq055seM70n'fk~[Z !gkyΡjKb~^ɗϺ_ବPZ^!AG!1)_x0%WD/`Aqm .n=vL1>#ɚĸ'^M+;|9}h&1H.UFͭ:u>kCyyre%,j m V܄Fhcz#E.6`V2zʎL QG09FWO8@ѻT{"œ5KI|DӕԪ pc`&V\gxJS!,xK+"X#!J 7ǘ'~.S"–<څfH"2Ӌ쪴IZv7Rq_TES˕i{`K4MCj D _BJ5dDLpOyG$U!ėx Av`Y_זȼ wcb\v ﴯQ-B$" `@oY#/ymߞ,+xmwߠH`r-'.'wG"!.- _^Nv`.)zm )k$yOE?U2t4!rX/|< kkG/R^kvN$e1 / j|C۽700wLK<_6m{Z6]pmBXHyCG Eh'' ΐ-$?mHh\f&b(7J'ա/ i6)y{ /#[6icZ߱;&_P0̿CAKI[8:_B>SP-Etl~U^ u4d318kfԸ,̊TK}T_w/CAu 19 ˏHQxO4[{>K&C*_u9`Mk=Quژ0ٱ܇ġpFs&Mu~率FYr_lT~tRKdSw^*j8ݞ-t/ xR,=+/)юH1WSyJ)v$Cao_bRu"B)M1XԇF2C"Mڿ*dM1;F,萫#(B#ꤔ[<&^odV5p3 \U@w0w/x0rӽlY_QSdQS 2OW!'9+}=3, Q>seRZg3HqԄ%(_d^5 _s :(!77"wN@'{O@p~)t[K?{dJxhȺxe~v5]2:5m`^*Lz{[VIanYQR,gx<DLw{AO\ >s m^ {Ono@M1c*/skNLza/t܃Hx1ʄН7\ Yg$*[7̴MݏMzG r~2(_0_/pek~`"Oa'eo::J.xnej۹6K6oWIsv@ՓJi'qBHnn ?H0$h]B?`ǓƚaߔE6FwuBIi=U␔ CFb\׻4=om| 'ܹ؏k]Xh 0_.4F 6ju_~sE'Y E6P3 ] 3_=NJ+Oz2pMk"DC6 >U ~h >%K҃jSvYH`*G~vH*bUyPuaòr%P)_m ׷lGxߨhh3V-|y4`o&v  TrDL<K*3}g{ɮQcGGo7= -ȢNevsCcudv&vwcƸ$5ǕVwPDEPۮ6G' vb2Rnˑ JA$ Ju^Gݾ69 -A2ON(r5'jyݕ MLfБ'*оW2 Y>a827C/0gsGZ\f*Ո)ĵ[W~Vι#WeM d(wBk g{o2V&_XkB6Țs1y\xiG?:('E'wD0GPx@ ^x6&p Jmx5^5+iy8)'Q~N;;KX檕 (ܡOe2W#]o7,%% cIlGF(^}5m0 y~qLWH=L*j)wZi.2&YM:'V’8,5t[_ )N ^&n?;U*&Y_R'j]?nNFa[6U Oj0[ae9oJxMΌٶOKjL91ž=JkIaT]NBnT3{S8QWso3 n8fq#~e ,/;`A"9?F^x.E}pj֪Opȁe->3gw'X?^؋(-lFj_0Rag]h(\|NEmO~ (#Ad.7V^ر__E>Zc gۯ;p< ܈͊ڜDg.5OQO (DS?'m "3LaŃXsiǖ9ЈYgH_ΰ %@7 MWXHwtV&ҡS= M6|E5R!g2zc$%G@ hk!q3%DOB4+uwbFLRG@״G3p=U j2>pr *{jU֖F*yYOW.hv]a[QK?t*TX|G9U($WJˍؕ'rX Xws=0h@o@qJl|=ݑ&nafG ʜmoIQ97PR/pX]1.~EOp6~UiR4_s{e|NژRR~Yv.Fp4e*ȮsZ]ym=5 {{} ej0|>J$kN}z SfkuG˘֪߲_/9 ]'ףNXu"cςSRDzB(<`1Nt̯tDy* VK:=m#,PJ;8+F^4 C^zے;cW|vLepM%4Z(FZ~7 &m0iiM2ϖNب0㶅4`UԴ=R_V k]=s\ zmsO,K]$B4r媈]pU Y-}xi6p@I5} #c*Q8,wP׎Pd)B6+iO lk,%=Qq %(ftTڟڕgBVhVJ/~\VE™/n&)*s5`2d^ʳt={Tl%tTꎦSV Aۈx`}{`m#8mÊmvnBt5e{:Ć~Y(YCUEKfzwJ3˚ ȡj߸wUq>}i"YFpBU`ApHreu|M,V;zތ7`:mCT(!-ISA[w' qq( LKIns1Ȕ7lⷔ(m-2 ,?WaKA}vQys B "fo3{}"BPةR@ןfl_+ YN+!l58l<.Nq噈(3=NXnA,Fxk2M7'j['5t*#DVk&TOV,*No{$/iJUiNy(ud+ XHLtP/[f`lGV'jsD4V T^m(|rndC#ǹy|`#cDK=` jn;\|҃)') GmNԩFmL'\Q A2l _A Tg0ZC9da_hoǙNs 3=aj=̕*9 7ÎFֱe+CZ (yce}lAIf,DuOR!iSE8{}@"7`hHPnIH[\4D! 9SI`q:yJn>>߭Yi!]k4pC >N`auU5E+XəU xMLxWE |ZvpP`?O97k~U+#ܟQVa#'lWȕamll"tT;d\D:)X^]f-lJns;Dڶ+v;ΙLQ &)1~ oFpg# ڨEՊKt;&kr1wuͶl I*sMc@_A.ao_on_#G3KyzY,L8r>=F'N "~D|s[7yb9 /׈ėgepHE!_AŪ7\ГMdi";J/D>]Um);%?1wgIk*%W:H9vh(?@r-n%+uR3>r|+QS@L Y%G/ޫ`ɬP8pKZE膖@,M=,\'0oHy?bœR=9C-SG]0#/|k E75JN-% tc`Iun!_a]pN)7N8, 'S31t" j@"sa;^ҽ |z@)wa#]ϺՐc\X{@?bYCՊ)tDw.o? L&J3S0f20ڒ&-Q~Y)tϤ8pj~ʹ2+& (܀^>P{h$?ONJGl,띒d  yL}q4T4Ѩ|aBi͎ؒ??k7MDBX Z~RԨBuC8 ;g㪇Me® NM|o ;+&+#4G3Pt5Z5ne:bna"~z/1J wE5އ::ǝa]N|ň𵝩LGZ̓)ܬ 鷍.i!AP!AoGhe:8%¡>_xQLJ( IT)ݱG>`J9>:l6^a ؓO P+f9A69"~QɪʡED~~ȟ6+ϝ?_Oƕ4E*Y}=qjf$Y8kO$bPY{:0-һ.|{ɢ21>Ԋ׿E)2K}kmL0WBm7i)@Zu$|n1B ǃ}DEr32AY,IucYfǙ))R;4⁇6錠,ޑLvK^*s K"]]t~!,@b82?W]LA?cO)l$MQ\.z(IPũd +Ѝ1BXU˕ӭ=c4ѳDTHm6RB;0*xkq}nc c/H\a h'"{qT m!dqUHFn~@$nqJ zTg\Fnҿ v1ZbX1Rhr6oci6l2zLm !P*aWb`:֗s̎ڶo޳AeN88Ůn.wjqp`x|RIA<k#1E |27E5ìW6!&p5ʌ>s~@Ze NRL,K:TNCb ۳gM -gBuEDכՄ4{q`OHSs8-1b`2F%gڍ4IVJb9EV2 `T)=Ol#//?sZD}UZH %ج3qQ3|2VDl$1çNT/Q1 (#PFߓ\ՕkJftsص8y[Ђ>o~;sLEĜ3;"5ZK]rbUC\E*P4c8˪8ʾͼ*9;#V`xDொlFW:DY4W`53;ۺwd%JPDxl˿5%׺\(qOԳB"c/A I;M\P?wBFn0/wŁ1-b]_jJ(iĨObKâ{bnt Ÿ5J-3[ȣb1#34{yTe;y77jg$J7|3 < L`o~;0gd>dmnLZE5:Nt!pCJ寛>?)3UWo/ OWYɶ"ϼ ( &)%o)ikho̮vF®>KsM\bHEI_t pۣ^>V4Nަczv޺r_}d)[AXvſc]RQ_,B^Օ s/6i ~~P2>>[)rˉ;n8DvyEsbmGaDKw8@c~@g{fzBTF&кyuC_o6zӤ!6_^@ꏦ/{Ǧ{,xx[h} Eҷ*x:f@j&(03NjxӎsgJ'HѫU\6- DcCdֺ2E?aSY۹ԃl`ƐaY;Ju *\)!TBrU QܾXJJA?!7|S5P ((kIS1uWr B&H񅝶k_X"8?e N[7Qg:gT v'3nPZ~̺ԗ$ITZA^*%f6?[gs3О:6mQ $7$`'?/ՋX8Vg'/Q)/B)]L nfMҡ㾤ۯʡ[>G%9 Zדi 4 $(qH8RxH8рGي0i_SQ4L͋ `cbvܓQBU>ܵ2NW$.oG$DžZ kIL%2 qo!1hwC-%BH5?T 4jtx@5CbnQi3Q .de*sa (>UgV1`dz&;{%j{]NtʂdT\b!um8k jFؼRO&2n-T-cgx;yduQ[2Ɖ;_~c 깆""V.?"\/,P]RTrlĽ}%G[jx~o+) uVy8(D1S7κ$>Y166/n!fPA|w c?OOU  _7/ʸz [-uKojnm)CaC;'7.g7S:3oC􄝫 `3{c'(6Ÿg0 Ri8d{bή'>-Bg<=#OʐFrEc_;{% tӽk.t!V?+p&M~IxT@FAV +8vFn+ە-!ĨtNI+ZW#iBS9kz4*t^z9HIy2汥 H;]aPwXWlsq0Vc+ON(?QEB`,zi/K:LWasO.O Ʊ>~zw?Pyb: _~\ |}'?D$(nگaKI0ڡHD,Vxa8KNz0ǭP߼Tv&]\$օr' AN:o~/U_A>[)9*uKb2l8ʋanmk-6MrȳhiH^)KsY~^~ܘ~?MqBܝtyF?I{qVra9\N9|IQ₮$+Zk} c /@`C#C`]oΌ7@7oZ:vD΅ln o IwPڲ,)$ql}Cw6bw6.XL!]9ˠmH |no5,[I)XJ(Ej0`' z䖗,${*L銛eSV ,^DZIsON..e~B+lzw6zxEӵa4^}y8:2AAyjqWqzI6̉m~F WQ#|# rkwd)x1 9L7swKi[!0$Oh贾"Oj5bOfŷڻZI?6!s.I<8hޕp7. EwXH]5 ݷQg>[m'|Mf /|t-#rq~GPnwN)?I,8r\ #!Oh[lK;㣧A㒘B )eoc!VVspvwMol\l1ep9O$q}?+SS͒'Q|!}Yk"xf1s/l\LR*oX Np"ƿ lB7F DZFE9}%*/D&SwU?ẽ*!sP1jFʀNvNV#37fP5+1" lRƨFV*rlܴtF>s^Xj#F%^  ntʮYVM)ajQOsQAs-dƮB6сevp~Jc)cz/P+P)YJ{ ٓ1sg O&a}-WDR/9l Q?ؗH:gE7L3j[UVꕳ'gͦií3BʞjM+R<6nz:]5֍Q2T*jSR#KD7aWsA(K!:y lEDI 9^c 4q4(Ύ.:Ϋ3Dt<1>}Etku!L؅[2_+9xr-r9I:U2W8]:g*(T_IyY3sF)`J}H'[Xg[b {[wgX2؃FMuǞutu=D Xʥ?$9`^Nh'$F'^M{K Fa%9;m@-!ӂD{X6ss|:O9 ^'4.#3!⠻}sa\1G Ԍl;1i}ߥSbTWފ+m\>I0_܃5F$KEDw#mxO59:(hd=<nl9_N^A4MW2?loB~є8 xh?o*Ҡq"P;'Q} w9u%"xjI!1f7h8i]+@^w"tK&e5z/q2~P#;*/5+NPz ]Duq ?$c+{mC%tp z=#OcK}O1Ȗ*DZƚxP8.$\67IsQiQ!A:m7튶o2_Zq-I} t? ,@E\BDDm"eUMV^``!@b=BӯXu'S΋O>Io4m%w.·`=Rq Wpm`e`J0vZs.j=Lf!3_}|rTvIh,"Z]NcF 'ԩZuzTeǑ'-E!Ar13V >V夦⴫?tׇNi:NǏm^Q1,fyo=l[Wt8b:BU =o$\_|h❝^"(8f +󋀤¼=]mnkqe+ȸN#G7&ڌڱ4m\9GN=ԤEm K~3;>Thh# bU4ădM?4þ%x̨b11h!1b.r$а/W 7fڜxsC(f٦,6!nEs%RlFxTiقHMpH|"9 f.H2hEG:zKAz#Y^}?? ĵ!dxB*ilXND} ͧ*M?ʳ B%}x1H0Stm?|Q?ejTV*Ƕcmm0u.JPlrGi.<7`En ڶWۡRf(j$3*!x41@'=F @`/=74|P?y5(kum JGLo ,Lܴ :521tZn޵O њ9(^0\%?o" ^SG7Ӡ@'*FgvyIS,5~%^I-Kܙ͒VSRD8m  pϊjy^Ǹs*L)ʿFАJ xH_u7Peh(8M;1B>>hcNT`o5ck"!Bjaׯx-yhLTiBΘ2*!ɲ̮!`̿(&pr. ;(5gn2M4*Y\"a![EV4,6arW`5,q ?0K,[)L!hJRsA4SKK,3Ozk yռ/-~bt$+nϥj];;΄5`'jٵY%H'BH@,U"!YFI;-w695uBoB i1o(8><⮉dIשd= 8 i3/RL^&g@g3W/VfC`[G6}D`Ft ܵxcTSg()%׵*Bcr:Onpg)# Y:^2M`>9fWY%oCg^"5h zBZp#*7 a1צ@ Ghe5VaRԂY j^­%h["q#^9Zg]َ)V[ς|WyZ)*;pxtYԭ(1d.]kpVg}(&?ί67 v >Lj[gbʀ)n%Mc:{om+=h-ἜpjikSLmk}.$2 8b{IcA oFdne厷g ÷!A167-&Fi[͠GYOܙ0^ _h ҵ>O<}8< ahY;#Pt2I[ ( lܱ̰l`,7D7w[@);km\Z+BeǴ3 ْWSjki7=SAs>ҹktz8|X$$S!g#NoǏAЊy|( ցяJT"$3h3T_< :eo ~NйpwZZ7|(1ՈmUJ. oוڅ(*볥}IR/u kMbӷN?F'L4/><.RVae_tȃhs&mDⓚJk֖Hiys2#M|#S@[Sp}S"ucFwW ˘ݽgG v g{ˆD.%kн+fb3Sc 9{6q8>Si;uF 1՚4 qiUK +-o ;7j*H2SUM:Xjo*5Y>v vI+5ͬF " h떐Ewp<ӍVcmgnUƄ.[DZH)^t4du3'{]JsMlCu>,2:ǢsR\R3_5ȉ ,@hZ @sY TED"V[鍉?Y2믢G[]j |4o5&[wu ǚmf@h[(/fL)gb.!gG*!}2Ue }WT]Λo dogJ^n5eq xK֘:e\˟Ez]2w\@@jqyt5yrL)xdnxS qgEWt*J{BO 9]sogբ Azfby}U}&]!sktA @ ЕsCH&{BH>m+R,0BQeY;RS>I$?6Y(zIqC)Ǖ,+S9/uV;qh[6, F"Mlo:m^ʭCIf1W ]bk6Ti'*%B>d>@ؠ=W[.WwC7s3#83%), Muwޢ$)MbgV#~:y>>d肗J'+pk  _,vNH7˩X K [Q!X[ 7vlzQZC*-oybt ~Gb'#pt?v39'l(]"w-GQ*T٦ޔp-[h?>nBSyDYI˦M/nԨy@oqAv 5VyFd<"Xov7 Ef~QMdjuhP Qؚ;cG6ov'9`#?,~F#~vIMtK4WİJ`m}/̽ia$܍*-g&ʖ@ȕ))h 9XX“[M xWn)#4 a)]\;>탃*f\?rAߥ/KP,ߥXȨd mp5e'r'y3&xAO;u|S- r^zZX>~Rdv>{&%㴣RΨ\Mg?iMTfEgG)#bDOBnyS[ U^蹽Z8Y/ 9{^nASl (7k-yZmHP8t. j6t',VXܝÛtGU,ĕBTG3%|:l-9)%254xt'"Lw#!0q̖~J8Y[ q}B*&Dѥ}_g,Ub[\m4Ui=z/&jsI'<_8<F(E yn5nXB KZ7DC?ĸuV:P1eC)R[l7f4;qTFhRvGHk|7͛"$2c6" >5Q*)B(hEF(9{NUE:=MΩM0l/TpC3:(ʍn)m/IYruPrIk)/ED)799"i\D;_Q>z] ^S6QE۴gÆ pXGɍH=t5 FNƶzk8T1$=*ܠ(V7 ڐh07-%8~. GM,.A™m;Ex%TA8ݟDw}BOv>Tz șz4Vjժ5Q՜=FBI; 1@0[eҕ8x.K )rksHSQ~alrgΞX"I'm D99Vi-M}}azHᙕ-F ̌֊4/SibZTScImA  Ll%# cB|o_ގt=CʹX9׎S]se@1&bNEFkQZbV՞GF 'S'td2x 'ydH*MD%_֜RC ٶ_QDN hf !n$eVOQ9u]˵˵Mh=Gq9~ْ c:30~MТ^>yB+V=!?ھዔ'w!SB)5Ui5 "w`MvKR@AMѨ s(IB`!&Ȼ {F56." *1Jkzحvֵ޻D ޫv4vFyz5B+K_t-Ҩ@I&aBļ>hXg~j~msg<>ɪNYxm g!#$SL1{ Jfp"tB$Kacݩ_l \ 5Π֨5mtv]iy,\86J"g7goRjivn[_{o"?&E~Ex#1M0wIļQyL M cTɆFC@ҧ/ 3Y tLe2Yb2MKJl̟d頱ϜL`>S]א3PBxUFf Z&$O"SKˌC~XF\<`1KQ,DjWkP Ȟmva`7 @b+ }COT%':J0t% |GX"SuVsvWyw Ie`X#v(@0'G(܆120E/?i!&)rBE-5[gWX+@=[kJ|]ӷ(Oɀ1Ѿ,t50WH&l)T@l|?1pW"A*!ސCぐ@t, pS@?(VDW Pdo|\Ye<>?)4|}/rAYIm ֠#QJ;ʶ/2{9u4+N7r%\,@#5VP 1xecPtS"c[͸y2O`EVs0$iC/Y7,wmlXr2dnηoi ?3Ofeh(+5UQz@ y]AQzJ^K{0%L%` !XX ~+[ylJ)kyRf=GŒ7Wgz뀶u嫬?N^K('yC^8mm[_ q:EΚ8똄PtՈ/Q8㗕|tjKxBO )XOۯ 7zYhhw`g"2'#]ZQ o_A Np9RA5GoS 0u99/2\`8rDd'H~9'xkIlp?O"}eA -YW܃9ҽLܪXj-hS~.5F+_llLO5[:sX,ա :?-z A+%8MkI@j5X}#)#wZ*v$6ڊI+msҜz[8^l6a$#ل1SV[yrwegmdvp-.Wa{PhQrƊ L0˸% 0TFvP?h9Ux]Q'=v5O|+]z?A_(/*_؎ªoquWNfoN): CԢ{ p+[ ׹C epʕa2Z|B T}7gy/ $]Gp^DzZp!偅0X&oA"Xw l62JIoqk_3&'}M۶i<9L2^[bmݫWcBJ)uv58jMr2N]P1`\),xQ*R= ёr^yޡ ZoRloy-4:-j0:>p 1rsmfHn+WF" hvqiQܓ`,R'5&z8gde4&3dtsu~t[Ix^rg w/W~Cl`IbčmNz&!u\!$Si k'2)q/_;lj \_:%+\~Îʬ%h@S90tf_PTf[] ^p~jsKej{tͪl>PZU8jX#2u|qQù.(253^kmsSw~$e^ShrQCbjxT8|ޠ͋Rqsƴ|X0踘dښ2>?0XƏUWanhqpKJ)6oꂤ'u߯0鹇V08L+,ˡ. ޚ'ʓ6>w-֋YXid䥏sq y08~`vî ٺ1SWZ;xw9xR&dnNie*WAĔF0i/œq?hZ8clOZ ي -&@ R$>^^"ⷆYE~9祵ГKԄ}e1q!Ođ˂=fR|m#_'"q\ H27rd-ⳅLWVIC 0D=fI _vEѸ.CjuS<ŨtSE%I ru qGH:cF0)K|Yǜ)W'GQXLV0 2 ˰)#3ϸt|vona'ʫX3S!zO>3v-!+?-Į2aD &7ޥD(/4 6 |cj)BCb+<+*em4E nCÅiפ)ͨj~L 1-n} 'ϰBV!3 E)4:I5‘H^Ҩ&mPqBʩP`ḷ 1`I=op癃EB,-u^P)'JH|9 Xz  A2W*K~'"4*ӋJ* ~68Xa6/a:^A&M,Pv*E;Rm*$qDwe%c'GFUH[<>),"zj,Po:UǨ..q)mnqETl*s('fOjK.gĭMF~ʧ[;h/a70!M2fוi~d /_.|{j՗d c/Eqr}t[dO| Nl4W!'2N|oŁezzd~ &n)Ȗvʒd_[KqMr*>vxݺ# X}&LA]=Tk-l^*?TxS ǿJbY䷍7E)I^JI1s0:Ts&{N`oԡDt3q1O P,PnRd [a2Vw [e LЃxt f>ʸDt{1^[W,j!rF 'd,fҿi}73JYA^Y| =ujj<+pii.{XtvYJH 1QDF׼H}Xϼ2krcek[7 &{^I^=“j[x .ە0$2KwE> 8\ |/k<42Y1K%"H_Oq->46_ykU*|Dk9@PlGRYrt0BG.7Ɇu"'߻DZSW'ⳬak Gmꥳe g`vS-[Ոi0rS(f[bXoZ`DӞI6v#w~Ś)Y?> =,e.l9Yڌ~g?$;^B,Jxj%lW !JVL+_ q)T,~{F\al2kcDP3KN>3=gDZgbw)tӏg,R/e8^|\gsnM5dV_|j"܍%G;f(Vlp S%\2,dV:bYoE @6qVLB$l8 lٷ?<ꁋasmG{G]%%a8BOUL3:,G }:f%ʵ%BIӖuS8v׾bIas-om;l{q6Ѯ@~ qg5Yz+LF{x̺ 7ʒѷ*5mvZ;%cGfy\$ClKқ~w :GD)WlAPi+I (Ӝ2ʕvtmH,'}־{ =a(z`Uv7_ܚwug`@ZZjX?8Fǵl`|33c1uM *q#+Zɨx%.VYV=F5pm-%0OT |`}8bo;T8+TI`@KztNj 3eW|,`(hoqU`׳{Nq)a$;x]\Q._΋6޹ G13v4*WGa 8z1/RF+gYRi䈼ml 艼p7y(VXhMwa\@Fu,5B B`X^u.S37W>w}fTrD=_("x~4QEޜ<=R%:TQT_vxab31{0ee|f80 %(ik<ϬNLRVvpJ7W1MM7?tJN 8^hUdoW?NSI$9J12J?)U_ [\ޑFyNƃ\|Cw&t,VI~F1| ?j^ܗ3IQn);JMzl"gl=+iLT0^aI|wAr!̕KsK*4Ecxq/DEYؓavjU`_ XAVZPeKYm @U]}Zjv]7kv]10k+Mq3a#}>K,O|f*tEVd9-F&oiJ!NMH'[JŀF*J',>=YL)**tRdVRJ t| ԭpQM!!f/x_]3Q&p8!EΔNӟCŊh\Ⓕ5+6 ,%S eXǞaYb6DAh'2"'TmW5JpEU LAmBv4A{W4LS# NM)"u'QqL.Gb/7}'a2leD5=NN딤)vn*p5l)|>`b+Ϧߒӎe]W|Y/  ]Uf U=&a=#ez&Ffq^ B51e{ka?ݣf`1|?PczWyvA=V`˺4kJ5ńZ/".SЌΙ(%C!3>3z~Jaƍ]я!vKe#fYI2)`rXEny(D}q[gl,.T/- [Vu#%bkϾFx Yjx5i}"XybB1‡'1l?LtFD"2\{9$H2,GSîQ{][ބ}<&J Q; ׷1Q1õFe&GqN<9A1U$x#u(/=̱zrb^&m(|1.Ky1 -°Π8 Ĭ"E@8W=g^Т;qi Ia} "BKӈqfƒ,3 ӫG-͔x$%s~&[ˑ>.pP\ZžT50){+z um#r1,w9an6' 2.-I: tԇ(aZyC-s5XD(eu|`޷ ; NؖXCy4ij̠n06.8w]#ZFWk(2< i^߫oXi@fjm'~Y/^H4 (Ww>B\)%1 A=DҹxB@El^L!,#EyKB_B`Oz&pɺS}M͕R5Ar@!9XOTZ1Bl"`ωq`"s/]Mď!ٷs*F0_Fm 0w 1?F+q4ޑ҉=6?Gq?5>zu\#}n⽸f3{2Ўιs( ]O7i|󹜅YFhi8RT6?K CQG"̙v ƟI|6>*:m.tSJpl >Zy%N řNqS14-(DO~>󆅗y hioA Nce8_WǬ[B:gc~O@Ve__ѝs1n-lWb:ݸIN v32&Z*:<ÄjH昵JB8nc@ʷ"BRk $:"9 p "͙2hT hiz@pA} 9:} ~-Ԓ0^l.pX5:w.1{& 9+JL^)2b~W.#%Ş ?O| $4  bT 9TC;Qөc %m)B|_5daпH\D̩֭1QFWə&]>Ȝ'[sEL%x;Rcw|sHSfBKZ,dXT' &%_|r^} Ӡg9v4x;͘?o33|_fo:v*~D:ZJ TI>WpuxlKhIJOIBm^UN2T1PdÇA 9D awЅ`G+z=t`lCn!(]`R&Qf9WRko\i.ghr-(OV*9q$jy%ujr?6[w.iiR5 i9Ma:f>Z%hrq&u~>>h\~,%UoSi U$_㓇eD1b?ވV׳rɄɦ1#u>R6>X5ґFO~7+0~@-۵p>o&ը(-RGq!zpròWC(:NjwCsd mYyxN"zaxk[R s66.dLeC.F|6 2J<,i yǟ d)Ae+\ҥ gyZ,N n0* 5jNc"?h|BkmSA+hpK|yrzh ~}xGZW \eY h0M&1q˛""ƞz2]LJx'øLRit!0(l`0nƩۯ T\[ 5|'w>S8O)fǔ"~ q5CvkTo+$Hg'.,vU0ՒLah%א+--C+gҋk #B(3[lKXrTP&0mCRioLzc-\52v or^HENp?PX_=206Qolpá[ aHJt3ʖoMdžLjCE߈-$Fp6>G_V~#WvHXOҚwBUHGT}Fυjr >p/W'`cGɇs/7^S`⏣ϖ+sNqX)Td UJp(7gual)XE8<X5 +t'ەO\pP9UIu%hOkٻ|r\Ց׆J5QN y LgAIT=v4׿b;~3*DL4O-!'ɣ2sh۲}&MIjtBĽ/\{C:Ř AczepUa8d5"|lm t Z)vnMe"Jz `\'-ru6w͚:# 60 z~D,䱻#01T$ø/չ#T6>zJn 8\pQq >JH7Gy$KM[B|\@ ˼ޭ^79`\Dta %oI@{%zb*ј%/h-θ.tU`ii1%;M;ISS g5J'`V 6zB2w=wO1Y>$߃xrfVYrM"ݧ<SD.#l~mP9\(Խ zefCUƢU OT;u)Qr]bBY?T&N-=8KPNJ?DGꀸ*r(-ߩi G!O/b2VADQs"#u9"frHQb \YH0TN=60es/xhgXc0Zlfsk jHys,d CI.Y^- 1Qjc7ݚ3^B-lu*<ֿƒDn1}jp`W.ޟM'Ăl篶f±_9 _퓈(C_].n22_T.8`"׼f./n#o'j-`έc $' @jRExX[.Δ .$u]wuozbn)Tސ0ھe޿"ˀ1)Pac# 1'}rfą?C|^.yKk$j ɓOɒlbBzr E<ʀG W)yw,gъV[bNa ^0 ALb 4oVQ[+塋ӯ 降VT[q,]!5q0i]zǘ5R~DS O"bp(ki<}K|/ecBj\>b8 0%U\yxF!r7Gp ^Mđ" S,F.sGLL2X ruvr5uo:>+|JCpKa:ۼP_\ YĻҺ&-j ܺ`1Pws,fʢe9{'& b)f;>a+95+UU(Dp,*ipXp.!`{QZeA|M A4P|bu=Xv{_׹ʅhInJ"+ƒHarИef!( 7y<uJ:欋ג!A jQ2UPVHW2IןSV !||OΉ02$*K[ٽwkoYPQ|`]+5m=Ӆ37((5kڜ5#[:bFϏ_S so˽Yp-JnZib#`CG\Zbeð$*VTcKCN)IG yr=Ooo0L'W>tNLD:yw'ʎϊSm1o@-y9oKIlPiiF&8F#vwC9攱{#VG῿I֝&G2mA00ɣQJ:[v|s$ pO .-/R~ՔhX@'DڿUڬteˁuջł>h+u'`8鿠X-1Q2\b'ͱC!s% 0ЄrKe1Stuj4-& Ӻ}WŚg\ɗvh$&Ze`a$ ~T}4l$ pޜɼ1Y8#^ t~ڇ IoX2 _*SʁJz!|UibP&60k;Eڤ}S>謮Z YDSCeixR+Hz s斻D3H/}.wג֘J/%MogIw?n?\";s֔6s9UN:[bBwqK/7vLd既YBCiƶmqIQBm%!n)L|BߞS.x-2c?=.>nS#5#q4A */Agk8|U6:dHƆ#6bc3fu@)Wq˺ڀ/0 dƞJ?rDWϚj&XLV=ķLTp|p.PIU.¿0I*OB$rXhb)Π,}Ή)u =]g>E8s1V BR22-*{SW\-QI -;=J$rZ&TGjaݣdּjo>4 'Yd3&6HRYEEo;Œ{e`22?@vgv(ɬhɕfpʬ՞[pIQe 2-E6_V5;*$jj;p[]Zozfd)qRIi2ٙX|irCaB(З!4Q=|VYZѵ|EkwpͷI ƌ8:wY?5&bIӠ+|+1Xve9;'v݌5.9񺯌`ΐ =ݜl op{ZU[kw=Quk=JE2^^։2 LϒɳRU,= 5VuB,C.msAnmoO^ 1*BW! ݣ:0D>2:VbrBJI(ysP2w,-{)(J5ɶbS)v<~Lgǡơ%'mta& >v3} 8y}vmhL( R|?Նzm/˖z#r\aQ=zml$:$2oYч2}E`P5B`lQt|[OoL=qsjO9} -ؓ #>1S:CGC_3劜%6RٙF{ v.9M(Z'}mM"8G %͜A #E)W榸iJ[(guhlODڈF!}\o 'c)Cn ?FEz4F+ KӒe%A Byxn-}EFL=`W+mrmxmSleo½y@0bd_a1J@T,oqQ8R|79:@|"x`FS\;D + mLB^t֪/+vp @-KrKpS j5T(ѢL2iQiQ3,.RZ"GQdAmL7IBb©y|ä|@q@Ygv/`m)'zpS7aIB"g6G֦qۈX ,Kfjps)5W7ѷxlRDmIH5QK S4؏S[ʗUU3<>aRV L<~yDֵj~[$hJE9زThm2 ši-*#ξU `_]Z&)*:Ef]2-UtU!{5 k`1+.cFůW k|㛔ӕ3LM.P?Zi٧OTjhc7=Q{ VyZKP(ҙ>0ih>2N(f_ySrg>#R[:QMˉEsmOR2!~3nؚӢ/Go@8[[D|"LES >ۖM>=ntXWP@mU&v0';n*hIuv6#[XN S!MMÎlJQ"| gmqZFwqʼnN<^2իDxg~+؄fK뤘ݫu>L f>d*3aN`{ YT2)]-16:Oz7^ܞSWZ:ZTf}C/Qt$n3m.T/V@3jp&LcP2O@GJ.tˣDdVK@9{DL vyhTg>]Ǫ6blwÔp2ׅ+o̫ C!H\%JIVFb$dww!<$N4MN%B5vx`P>l^ar !Å?#G}LnV߱ԫl8`$䏍Ohm\ d\m^_[ :ˤ]1]rLXCyaZn*\*@o}.׻pGou#Ny,xIk*0|I >R}ȩXIaݰtդC`P^pJIRW.8n4MDo(;'U~"z!+L%v0lH_u+z7@$'7Nj>`$_ҿᯀ/n.Ɔ[0qs[-Q J  ޘC|bG9z"w8fHa[a ;$TGnD'kxjػe`u:;ˎ`QMi#fw71 d'7`bZL)fWNB4rg02hL}* r5: MhV~#M(ͮܮ<2Aڒ;`Sʀx2O֕|,SZ!3(my k&لGX۷AE2DNо9hHŮV^~) t|YqD!BlΌubH/V#86;C`,-`zV@0TŎTe"T c@AA" ð=VւPFFz;YF ]Rn#jawEd>S>gw A}*{=w|IFJf߷lY_^<ƣ rbShyf%^:G_AAV*xDz`T1dێn?+fJ# l B'/'v8 s%` TcaP} cPe.P x9VnusWŗБnk`zRfJfgNUו^BWR%0mf\=2RiS`#fi=$8Qp:#\-cePYUNgEuw\v`ݧUquu[/)XFˆU8]߈$F8#XZ*OjKdQdqx֪$A= >A化oE;op~*#?7dݸMqhg(+ќݙwto[ڒ%<[ؿ@yQ^޴ⅰF'V\(ũNJ 1ŚZ*Gi8VO#f^UtҊ,D֍Lɪ~ǢƐ7z?Qr$]XJ9?vY,]c1DaR "N+ivY; W<]t-$EpHvfQpFGY_X:_k0᠎ά#p۟T{<hZ>Yaiyyʞ7䗹U;V 7o2onzZeWy:U'MwrC?N%]p'SO5;`Ė S=J")Uk:]":YQi]odBȶ1b<*KT\kUkW* BAGN:^洳H aBeVV9ÙHP1QDݖXٗ/ovGE'+| Ӵ- 5ކ+si B܍׾Kw,~̅ZܫB<5Y+fB˾`A. ~>qm^nd{$v:JPi^MydEUBqFx$%gKdOMZW$>GUWHk&@bI91C{BsPǎEl&cneJY`!TzwTzړmP:s|#gXy8"*_B!f[T _TS)3iwK(P̸3$WϢ4{-D>,:ۏGF8kPcSni8K7r}(.PO>E<[dd=5;۬G͆Rߏ-roxH+XK5l L[PyXMwa"g8ׄhA0}Urw!~b4f1?c7P<}\.bmi e#{͎zՈqEbS}"5&@>SjtCǢ@DMo<fkCL>jsÑv01DPȻYEulT<]0[r0_py#ۤ5/ Wv|r`\dYm]ި VP3]e?yJKKO?uI-8sV-C/xZX4*d:8ҖN ӊ0CԔ3yfZ' >Br) ./ښPul /-7hksӖSm,|%Y/O IVvކQ sZ#}BØ~FkьX|LU8ˤx4=Żk[QB5aDw5Da x£Wcṟ6]1 ѡA88ŢϱkP+KǍY_c\ZWۏ:K9Kfj¦#sGgt+IzdyN|# h=lT|J~H"&b[V[گ/ԊDsE]'M"nHSdi,Q[9Ƒh;o-fDI[ˮ>?TU}Ji!/hjrxR^RjnqNi!JGƖ5B?0t5hC;< rEw;FN"&%wG 9ɣKѴS>dHnr?vxiCoS%]\r8dwXVZBV W@z2z1>w W:fiG~1#݈9}23A%rץ^:%X,L5K\R5#qC^)ISr?=;B 1/"kXnV[tmf6#8)峀Xk'`UեP?!b<֠)!?g1 j{RowC>Wb\B0<>ɇ;*G)0;^}iwXO(SY.A|OxT!VLW]Jc'*#aD]Z(%A,m|mH$p:/s ]ޜ}>2 x~›v0NGV1V@RLWsp%!g,b@ѽAd&r5Z~vD un&M!]IqX}Y{\[Lpf[ m1yQTOt( =0&Bw_|aWy~INN 5ZfFy*w3Bckl/8Nt@͙[(1-FkX,AE㥚/=v% z{J :<ҟk 9r=K"氳,T%XJhS%'Ng ).m tȨxPV&TF)ɀ+I aaF: KL5gJ=8uG ؚ"nY 8 !EA0G ʻ{ NCuKmųL(o-AP͛Tr9"1/r }Pm/2 m&I/jsȸV|e៣Aj3m{ٓ4&7-I^Xg 3(J`7M'l i/0}L,JNlH{Conu^] urs]Pt^bT<~%PXujq9is)|o5 q'׸ze-'S{`tD:..bΫH6=ҋ -Lq2+gGәHv@¸T wo]*HA=nuȎ.}Aԋܾe7LP0G?IuFvedI0?n~R"yB"er; (eV[(AOp]Љۏ0?߅-hŁ66J.$:0;:A'DP-ujf\Uw?} L9Qc.jYzC-G 'ݡT7Y6 f2s" ~ЛHȧ+H@uNfG81Y9fhƫӴɰgp`$Tdc "|1J7C^ugwUG%(~n'@yfd"?8-t>%je1_X0֔ 8i,g}ze0lb̫X~|\͊C0δjbXVj05F}Y15S/N@zgyx͉/}Elyl-;%buesjပVKwFjM:K,i>>C&?I$`3pFkyJ OI vz7,ZcOKzG L+f2R xB1꽏?nwɩiߐHP LV^޸ H.qN3Ant!9s0?R#t*iaXfwƄ6H5,пvlݰs|mIii#y ہznyo3(ʍ SX"iv7YM1X/;H1?<%ӕ*@IRZʌA$\:%yY5dP]T+NkuCH(fU R?^*DιD:ƚ=k,3-SjI蝅34H|5JO@QEd}@jZ``wf<*# W!NYQc, dRL-GdbZ&tͻw& ŽHՋ:AkH=s/qt5[\ґvQ,Y69@Ir37 Z-s= !4ۢ8Ok^+6, l%ʂ(謘):!/N}h'U'޳f@DKڼXAq luԽ!z 03!8k&ޙW!@!\V3vߤDV=Rvf܋6kFT;QMMWP 4iMio SRfq) _'-2(}r~h=ӼAځmBdW|Y4 N!7!I7EM=U-?{{F/3:V0cL1Mx,Q1:T %_XNB7'*BImզol/| '0&iQljb@dٶU0AnZI;U-el &諾)Ğa vm9eZ1'ȏhrt%6h!Ks\oZ"?L`5@!;uXxX"mJ9) i[DN[FUǔ>Gɒd) J^dT@jұ؝g5Į{,>! &$h\"jk*E%3*xic0 i n(wBF|;W߿?U1/OjkBSȲâH~ĕ_UC\/D]؀ǚ&d{=>=r`Q7¢Zs2fN˓PfCF;.;]ݦ@J;\:Yqob3b-X*N䟔ia̠N$KjEV#5&[qI跙E"t.z.~IѿW\{KOB=y(V]?-pJt[{<?S}șM?BߐCi(nVVqLl 5Yfvü"QKQ ٲj4Cql>7ōu61RZ&Z sbz?$RV!ЭR?| j`8X{O@ep=x~qG:m=))`Yݰy4'E&r*é-+T^FOcfP]p%/ rB'` Tmئ[Nsx e`uȋ(X[9qOR.MY/CMs%f T;R9*etmBNQcĊ(&t;B46biWmUD夝>{W0-<uf-4yQV-] i:T5ZNaJp'D꼂Dw$}NZa%$U5oq8g9}ɜϓ2+ AmCRx1u-Mu6, 3g_@O=0&wQQb1J?)8#=$Xr%5/:Zq?:F']X*&$a\@kE1j<护jo&z@=(qIG9Y܎z)JaqR. {vFZ+s\+t'խwnd]c-?a fe|PH1<rV,?k{/9ɚ'e;pȰo!t3"73\7/$I3 W1 wbf>Hޢi%#ٙҼn-|i [X̱yfEDn R.cE>O7m*өmdu3 q5&LXN}z} zͅ1H'!HgT=ж|}3I/9KgS |h٧X8P'ӽ89cTeG)iP}^8\S2reriTv-xJ;$;•OeUCq)Ρ@]* ջd W>{N@"w2..!#̟_7; /],!~}"@FJriW"Ga]MJ0k@WwK4pJ9jGd` B"$͌w'xG^ڔeݺ %fg$ӱl9Y(d\2:3r6'0hƜ%yEG.O%3ۜn.]8dy|tm]Y >yGۧ[_8{% .\F "z!a<?$N+z;fRdç eR*ӭƖ29{ׂB"H &LD=?yQL_. '{T/) d)my.fS:en ȀQ eI|'HD07{Fqmt/n7ũbgkƮECd%x TǝX΅d?pRP* .P9=\_9(2 @it{-U F诂;"M+3٢=PA`Go_AL!o4u _񣩲ָILd8' C-}>>hyYsьR ^RA:hVC C2dR-`q֮sCM]w%ӎބA M8kGv،R}b8:l2 *VR П $tVN,Ϟ\WS3}A~bU6!ՠ@`uE>mr΃u#m*y=bAq۩rzHE}i&fB ]3.#I%!2{\LAf&eJ(*<(mk2 ] `ɻ7,?[CkKMroh;SE2|$6{|ȥ:yS(?7Nwn}lǺT>i-''2=6NY2pMZ7Iπ%*O Rcp$2;9@x90_6!Z>3pHoq`fnb!"4J8 1`#gFP'%J)sq3XQio tXa=o?vL+=RyLrL(ϼ;l7DUmL ylьD0R#Jtr(/R1oph.֮.^3ɧ,WJ|Cb$ &`d[WB#$a*mS+FQR4PbI?blmj/JHGn{dU~A=CďA2{plvռ4ͤGBʢjE]N<aV;9s.Z 7GI g7.U')XlA_g^sOLܦ“>s'tTp=*'p%^RԦӐ.[Pf A6Ʊ@J>;/?'5GJ&FI1.ەNp/TT2IpMw 2Pj[}@61 3|L<_uDGIiaswHyf(W>鼇DvMNnWh [+5,[Еp zCB[2fNJ{/&Whb XOIf>gx<>h5as~&_DUu&dѣ& .lM$GR*ɤλ=v\blP īB_2#7KS[ 4>Q 9u~" eQ}eMFKۖcOŖi wzg&ka8Q%oJ?=JΧ3y5D?͹1֥PmHH7RCxaNȸ"ӷEcR$uKģ{4Pth4ܸT^Ji$ ?};C2- 9׽3/ ˹q#j+kl= o#1XR$FSƷ;0+$ `3 Bx> ч&ۻP#^:"wiWJ-5m(cg& TuWlezo߃M!%ʮZU V34Ή1Z)fŴu%Eծ̞+ HJ1ȭ f<9%.R !+FnJ:VkWǪR %==|ʴyP?]pŹ*/ǠvMz(n\awFu&Rv`b47~m@\}{]v/0%̕!VJՃ1 P>E?U<7EA| yΊ2ׇ=(b 3[Xr^Ql(te5R?boUI*í3f{I|$Dh%bf y=cwELxI!o?胗zZk|a/ |sCf逯גZn]ܵЧ8VsW9 G~Ӫ#)Za}Pn+-YؠAEi67b&xڥZ(͂_>OLbS$)ެ2F?[ʁR= +Mؔ%FHo_&0O~t YpbyΖ@9e*h1% p.csPıkye,~PAcP$2re4jC֘IӠBɨ3_7ҀȤNKFARв;r[Ӿ#jOV+wI}6A!:+zw.O|SZw[ExwTk=b Ё9&NCzYڅddf 7Hb%asd ~sf𿇳c6ohaPDmvׂ ݩka;PI TJz+x0$1[3!1yG&jDvRJZ6Y\n 9Ј{P,}jQ1_=@ZYe|c[~M-Ǚ2/C ,YJV'k1A (8m~b k}3|?98璗hIBzb 5l"ܺVvLlU:iⷢWZt?QtMVv# Zq9mYG'|ֿ$yM 8RϛFќJu;Ibk޴cT Ãr2e|"DS&g 3UqfhD8'HZqjesχ(})<ʼՅp8vBeў|ļ-uȀ_~Xv,TG+Π6^D-5#u^PS {Ffe>`Ts"e 9hJYÙ:Ri'iH[ 'Njbr;Ȃ]'+_[zF?Ѝm(Pݨ֚i^s>pjPB nzd `0d0%6!NosoD],mPhR81F  X۽`88g k2:@OFg"GvJ!ߤUc4m_ЧWu0]vkUrٸff\XQH`XFIi3XC~4ԵA)g^+4ڒ)=UߌV=} t><c[a̺s&id8ԌJ&akH߰Pr[,e!fYP02(wCJ((T |+ jT#PL/^\Iپ~]!2P cǷ] 8J'?ů`13.@ ԓA<+r,U=_Uc]_%ͅsB -g_!1lRH ,a|rC%1"~QMRgLv#$70d^*TES!Bۓ+ \rgHzl \iAd+ԧodV-b;vO] ꢐGR 'yr[4vlކ(.WјoT;mߨl4iO YRZ+(EvqNp?1"!6t/rȟ(\`}vt܅2g[@ ?-ꊙKl;%I _!…:-Lt\߹wav3>bm9mzQ? buUo!I7 ,⇳Ps Id5mb;J +]Oû%3<gdVo.nzJN{Bg,@iQ/o/hШU }1f9U"kWZ\0l◐Eοs-VWҿ~ meꡂ7D>bl>(2b ~9y2K~Sgs{]/m!GθqpF`UgT)fnnÌ"gFr-3$o-tua73.M&^^By+M?HBnr-kOuk¦Ty ,a4`u;m_BnCa ECƝ(XKVHe>+ M *­+U8J5(CJ[.5u Ŧ3V$mhsB -#+1bI˫q TU +NJENERꞠw,ZDgfmV#^UqAֵqbve 뇗;вǍ ?_Y'OOBO2yu*tӤ-Bn>`,>LB*,g# r29&m$N(z*T@m ]U\#kQ|n⭓!ݔH!<1յEpuVPʕAS!0x ѝrmgXKc*gQ~H*%J>86CpB;0^4(E%^߾NE)tzuc 0N[-tOҼ UXx3.s"8xs3hy5~:/S:b8=.hSM5kLXJV}Bo2U^uM#ȭkGuZ7]0ZBp}?׸Q"؞OML.Mbn:Hv'lE㫠2߁ubkSs-Ģ|m{x&es f"9Z#^cWsjGr(nF#hcze|k5=^S+i{5c$!\oV9w^nt:cPSDF]Ks^D +[V󓰵W@|5whki͒89p5! BHHʝdYkݬs }w't6A˲#QXLgsƫ1p^ Q<٥6ΆȲ뱾 v88eK9S(X*JϺDX|0mަ¨||Y鱜l-Yހyër{&5N!\Y$KŃc[{ЛHL efh4Vz{aphl:ccľ_Ⱥ~]21*9r5/s,-Oi"§_4HrwomoN4uamύ3w -DW7 {G<`M>YQẽ[g5B>şя7Am|j=ejU"0s^H-#nQ ua*Л-9&; Kš ^-?% nK% >{X-(]m82jZMOwV!(YCK}sݠqG"jFM?T!+B{,(ߠOR]0SkbkX92<5J F*h%蠾SˏDH!~xw2@i׮H`cqmwJM"<' 8<$WO j )LϤ(xiāFhv氋snvEĕSpgⱎWkWWzZG@WTxPuq^l+6̺Z`׈,e!ݵX1# !rݕ$mfT?Ed2 AZ=a0O`絀ڔee*XZI+*U͢)>[U|槭4 OrdRf/<֊͕Fs C`M"a bX|mu{R/03Ùww?#BN7~YGMN`;Hu_0a:Dnq stg,՝nzذ]Z!uءCND7PpdU=C]tH(SdžN}I}?b;:?eErE<@|^e F;F$[iwQ_2Ø RsN&Q|.}c],4G9l-}TSEo:u[x` 8A剔_'eI+%էܦ=gu@+fLΞ RɁ:\y!OK#X:y}2s5\r*cs%躄2Eϴ $깅ujtAE½Mq7,hPt]b v3twI u_ƒ!` &窗3}, [1Ұ%-qN㮿m6ޝ~A0v2"2&Fz04N=su/әqьiY6 ZQ*ʶjJT'K 8{Im!~tz 7m)XMAD]_U`!65[-hS74N/]+Szs0֚qmis=4'+gSKrO({EM@vѸ. j\%e16C곈 yz)>տM\q31'*7?pXwkjRQd;e| {5'j#`s3}JVv .ƳHdg&K?hZFshihkQyE;>G(,"!xkvgKw/lP^⟟nU\e%n ~=dRFs6PLOg,,ign=D+~\ct?-Y0CM ,ڈFæ ``hΪ3YzclA~ՙi[H.Eok,M)wl?? `UC o `:SjNKu Y) :9xۛǟ=nxfS9̦öI9|XW! AyۺauZYeɗv`_MP Tf-<3(j73@Q*{;7/OYBlw͠oGuT^ l svG%k1 ɉvIǀ+.Wa%l:Pɗ0^b7JJW~H O 7l[[eF29Щ*. mKjm%|=xHdA\oBzW1y#y wl,wX F73CLoz6{M41Agde9X$DZU9kʑc)"V*y4"}>G7fW_1t/llhYPVrpNJzmTmݾ}wѱwp@dԆTn9P v6Nalq朥cd[p%_Z-vשjLug[Ec2ZW$ 7/eqN,#]9H?O-™zr^k+_6`F'xx5߽HgkWv&j뻂c|(2sE9kdr}4pH{[ qDc?d4<} U+B[1’|$,t}h9mg('UYq6G<NfۇnYשXdkt%b;R@P]  LO@eީ4[Įv"(]dL߄,1 X< iׯgAJIMi6[l MXQcsH*ώ8,jtbeaI@W)RO3~|d;2>ψNF֨nd"drMXjo zB;)ޤPrFͯ宣;c%_\ ק67Z!C%M  %jbCwsIF:877t|r H6Kte| E[|hpMR}YK+^np& .&؟N}>7'ˑrߧ|Z5826>ACTIDÃ9v&inV<|ig6֘IJ=S@QrSTT5_0vd\^+/K\d( F6+q 7LlR&[Ŭy ZjΪsRӅ';5.fdv}ԉrLԏc(p\`g`[%)3Qv&kmq.rU=9 p%/EГ8|-;L:hJ-E:8tɞ6hU4娓RІXmDm;ރIVblf#Uѯo~*z\8ŜDgug =:ŪKI^dtmZa{aa4/I7:E-ℙ#VGVEn#>wbָ īINDCNx0M !~1k zoOr p,GyԚhdb$g}7.i3ߝhF) ] kvQwz8XGЄqtTq ͎U%Tc~%Hmx^}WKA@43mc9 6|WR4ױqHūNhWFb*/[(lS#yz^' 4i˒1c|NGxZOfB)ONq3u8PҚXp&:5GGTd)#nmwSdFLk >Geb?82r]Ur!2ŭc߇[:=7>;_>/_u|B|<:Z&(액&e$2b~\n9}f4VX< (uC7a!šJ7֡XfK{Ͳ%6Azsxnf1N,9?YGo22m5'_0/юL}&<$N"bQTOՠjWY}7n}34+ ܤ/Ubvپ1ɳ~\OZi 5/9| P{UDVy LUZGQ ZNJ0rF^Xf1V7}!cTv#H8X$\q<53lե u'jRTȣYnV^ƏY|hi7[݇E㜄w?-z,.ʥj6ZS%aD@ l[&-jb*Jq_r+J-CYq :oA?%~Xe|%6%C$1n͟aϻ.LʌۿM)#iְiCvj֤,Kro® _gp eH~;/]:?oV& /F&kiX߶9]~M#^~R ߛ``vM2?ze8}>{hR%‚'F%و#OpªR7Bt5u?0xz84ݏ,f5iD!T2F sz.Pc} Elva|xa<m?FQ9t֣ah)*cPeC 7[3y_b=3SV q9xvFqQE!۲~KrqP_qJ:u7qVaxc &(Xt{]C4Q GAVF*ara>/^,$ U[qJtZMlᇮ-n): ?5X⃒_T:Z4B= h0oihkMڒZ @j ,[9EX"5|+1dv|E$۲*b8b %ހ12qƝ*k7,BYE]?n)\R~E^<\e< 0GšLc;e.ɈZ ( ySnGkzr4}RN1ﻹNaF^fE[v7oON/6Me'3J+D X/@ mܯa%!g\FJ,.ƫb?g2DE~}Q@&o``o1AN u)5.2 }({ZȾZ?}K QA,>.g9]Ӈ^ADUb^Ŧ%. _(,Wˎ0n{9uu)/óJ }r}X 2#P#XZ Zp_'ZGf&e" ^Tu17|o:܊QUz m-&I3xpUK2o^6i*rjBs3a-:4ϢlARJނu܇/tk֕,{8( ypdN GnQ1@JisqrE{f[9iG}v栤CRENRVݘ <.:h8Х av}ƞ1*^N/dVuyKg%>UL.PV|ɩvo&HCGLc4 GZ@,6C;T봸!6>T@gm.s]FHq C!Ƀ-zmy&]،L5g&l{ք^J{*#}%é}[CRֺ&hMhj=[?^D#9:'*lu`L ݃ ntX!I"nX2T(N%{X YFR&&uN6CEysE4]9܉ί;PS@\ O^9ϓ-۲# 3ʬr5ٿ{REtF~8PwŎ/^\9wyo`Goca<3GzCU_8&b+_D!.f5Nx$[ H շeu!5Vp4Wlo0~S3ȟ䀪sld]4>qcC 'yEx6д~%Ij.G+~T#4c@0Fiɭ2sUPӜԫb)ibJ՗+|qFomi3%cD ؓZSU+#qoiI6y64xF  $.f˗vQ\'^q:qz QYU Ây9tZ1 mΎK1^+l`#5䴝2(s'c>/XtU#BGv7s3լY{Zwl0~dzR1H3" ٹO[S;j~C_n^x^ύ$<𯮎WxD@s Γfh|K=QztRk-SمlpͭE~ 6ͱ[7 ZbgdT{:LSe+D&rZ%!ETa{>l4=LA$Ua!ePx5p dlVif!M.A!{;97to=CoאLa{2 ɢ_GW'Rڷyʳ]5Լt*PYfC#}upU2*(tjFgYv\foN~#Dd%-C|YmKg2qԝ2 %p:6%pZ~Ns4l4եp2\Ɨãz/!#d1 i=KКsb*HeHymVDh6(-[IfX_O2ݐ*~ )G"Y$[##'Si)\[Fb8k1z̈́xA,S4ɇlm+=OJYi)S(b:d7X3ьFc0R?y8aQ7Y_1MB͋~ae ߊbЍ7ZKPz}xo֥ ]P#2JS8[Ћ4C3oNI@xm:|u9zwhӟ؍!;Yު ԤJ\`pu)rJQ6#m>0J)$ #暮.u4Z"LopfTXA'MoN'2J jm ?S |GCK QGV'5C~/ZXQq "ȇU OvASZ/ΡsL_k-1bDLDBc'u~HO_ϻIqĚY.)7AGZR)u$'NX^une2*kɎSpBn5uw'/6Lz;if\pUwЍO^x7 9 3DM]bA3V 9$X;:˦͖G],u.~KI% +k{Fux=uNmng=D[gK嬦 AnMBs(V B \\PWZYSzځ}Ouc J%Ta%FpVhtM/Ҫwy$l§gM'!k%ܚ}eC$E& %V]w?t^@MS`ӂŇʺY*ε&%T5Ta[%sA"?do_TR GIs=Yppw ,dHdcGm^xK}aG'TC/cƛ9t7Cu<.L*1uKVn'"IIJLٻ֩pCU5i|)u$7?"p%򝳗\@Z=ɛ~@U!#?~STm-D*= gKʉqCkQ3Qb$EUM:Ƿy؆畹'YGLd 05(ʴ7h0~6uj[4c0)!Ң]Дomʅ21C; ӍݾJ"KB0(Hp ⿅iz܃9:(i gvy0-" ndO1 3az~|KE*0XfXb7TMNpEʴcG 0I1g$bR\S͛ 2Sޯ!*yO[h#$$ǿWMϺ, a1}l -)[CxLk:i Q"2J9I 'FzPql9C+ָ7t.+˄0 /YTW{!,O6J 6 unr|E7y,D`u-Lzd?Esb91qEla1yG,O: ~Ǿs3či$$Ffmg2p5͛_Ř,56.+Fm#~fH@ztC[Y( D﫷4dͥT9ig3~٦ Dg_bk-nv!Ν:F`dQ dc\B"Çk+Q[ *xp1Z$5SމGiW"X'nOK\'?vUpBVMP(-Z T蛣殶|s0B߭\k TsK_Z;L6Q0|l$u%/Vz^tUG'8$re I kUɐ4 L@oD? t#>Mf&xzէ0E %idxU jye<806,xXt4oā5ypȀD٠HT *4n&Xe3^i%t)ibC4{"6$4n+U+M2?mMM'2oG/לG@6/]B퉤[?Ws2>5,43&HV*T ͗$%t9) ц O^˧~OTN v7<7\e'ԧK".e5?ؽ_W:<2d5|kx^Ո-#vԾrb} /)Xi q$D-#m\o٤~M!X|&Yx!R$gͺ,7eN:=sFJyK$bgSz(}S*%YtbPkSJr!hŝ؈HY0P!e:|<Ί:Hk~Hˏ >õ4O6D!2lCX%MW$0mf(~{q1b?a5߬_5A+ ;Oc%H\FV1`Y(Aw IxDjAlQQS3rbW:7p3@mD[n]:TZ{hR?|ُj]r˃1 =o*/k"YZxKxnwO`FAumGѝ]=&>ΩIUTr/[v2#1m[:A<=_$YO$PBfa9oIgQ+ⷬD߆TI׃j 1S/uyVD!ՠPsb!Myø[ Tu}{RRG΄J<<>OԶN)G CSc*HWVd C#ATܐ@.%7";m2x՚꽷wM<؉4j9_yq cݓ){_Ë #FdK\6vHc8JT蘻GS$"1&ȰB5aX; O'cA,&̅M[7l^[.ӬyYzitɢ^'h**᎘ 򖂰mtk;BeM6 cƙb͸*V[<4^}x#ӑ ny!:؈f"whIIϱYb|˹q(¸UܘzGXRXk`҃M2 2]$H X䃁J("쯫pfϤb׆Qnq.%B'".Gģ-rW;$GiEN$&p P Lq0e/_΢@f :Gw ̦m~岪p`EwT򑷏^7M<3x!DP{.N)]h:,[ ?S#o\.Ş ++g"-An$`Z}^a {ܝMuJ͓[Ԫ\{@c>JC{Y4Ȭ9a1aNFMJ`<鮾M)fC %k51)`2uwG͡poL>r0,bBIEN6{dvG>nP1&~ IGr$w}Sjxǭ=qdg+s3Y׉c>yiZM7oa])!{YtxLW4YDe\5vRΤLȌ<¶ xpvwC$ȶ~lk.>!09<:BTw$%=uO}֟WLˀ]?Sw{6ȿK[psg3ݤuD3{̚lgK/[ǟALHAR[qIygAE\>E&MVbaCURņv,ϕGkyh$дlt;O{S{nޭJܪ|:KƐԠ}GKCSgLb-%j`V)z3n3;F.AJC M i`;aIg[J`'S|.In-! ySR=̀ *|6qH'162>Fsl#K8kWnb iYP| M^ٵ45\ }W0L$nu^<G/ztDAڥ@RICl_N^+#"WJ.ٖzJ {ylZ|ƒH.f" t;l3dS+#k3br`XY=6zVx[~m/Ml9jN%]7/C=& J9|, d"*RL,ֿD6=Lqq֞uVzM3R8F:<|b)2hlDL-O!dڻH>ՙW[1)p˛ѣQ^ӜB8Hv G`4JY5_|"j fSXF Y8hƊtlῃґܤOJ!Ƭ5x_Dytq2&/ 9{ŮGǬ^=:$5ʭ N#ghƦl2 n$G\+&u o[j. Nf9t,(^P2q >~izDCS¹4;BJK$hhۅF>zwv{"z^Xx)wTk>Ke%_|mN1 ,6_ӰD*4,|HUQ_W(ıHv -t(nb_zMj"&9}@ˣ6 Xi.KBL 0}V%}CO僻r|؆g,Iv>7 Ϛ dl2%\6 42_lė1X`Jq-#.3oPi@om,u͠ߤ_ Uqmsp0#? T 4 Z}ar\b܁DE <aa3ᡪZӶ1!~"m_|FlN7ȍ]$5t%0v?FzJϸ4g0 q n&_3h}M^ᓛ4}ˈVFtRmr?it# e& D^`ź IP D{٫ em~1L6^N$5B6bZXK]B-CSNw]~ۑT22>ҸEϲ$OC{XBwp[_ o,zDN o{aC;ӺW)ǧ%ZSUy!Ƿb8;TTs &oׁDVt{.],gs_=An'u۠)9H7_AB}!h\Gm]7wS?Pͫ7KEP`RO#Xy\rG-&H7U`{;`yϘo^ ."C7Xf*(ͿsHN"{=ե3&T)>۲(gW2 `xM`湧[K7'st NΔ}!yvtJcA21u+Bzij\-HSq ,3kO9:UCߚ7'q/{`I}20w` #Uuꘌ8Y̨xߛp:=.y-fa56w#X̃㼴w߂}+R~e‹Lc^YY;s%V:K]0&hc)A|ξxj 5+9>"-W o~󷭡Y2b!Cptx`)01Y. 1%8O-ط7,!5\+Ki+׃~FpnH|on~hct`ұ&1DN15[ZHTX/Ty\)$miwAk.&v)>بRg7/SL9't=3py=\nT k8lj"G2ݦ`QXBb,R p< ,Q~́A(7v+$'*3 |0% &8q[zl;V Kژ9>Y!]_bb4U,ەM!ZSN' }E.ܴ̍p~l߳|iOaIɩĠ>vv_fv- U;ҥѸ*Q @.Oqٺlk(-Lzc(Bw5g3{&I`1ڹJx:s{'zpwdt"es^ ɾ\m{fJ7ۆo9Md_ ZrmN3cȄʆ]8 w@,3(D@MIUsu }w '{(فG'o|[cEkBs%m(u4#Xg]tޤ 'YK%83W  S@ 5t8KCki-}&2++0lˇUZ1S&14 3-e v!EU[z֙UyD6XΝY5AV%V.+pK-bļˤ'l#U% $(n\3Q47PuRG&0خ*wu x'WP[| W@YnbvW6{qf:Ƒ#k'Ăhi?}q9ΛC%ƽ9 {CGR]6=;jWIG1etӪB"*0=TZ i1>LLqgZp&+VR'Lu`os-[uuiKA+ #m-3 {hQ6]P^ ՜4 8"y.onT"=}@S r Dl%*a1~GBbqTbܢԾo=rAbAp5t\m:%jRWVCOҳ(,\P W }SPb QRYNlMD?H"8a^/dRIʉWvH@A HFdhM(\= r 4;YoCev;g@w6 ~U/ /kOw丰 k7?aV/;G_<,$ b57&H]3 :|WAh~RJL\X[nߊo8I"VTk[-m[jBҶx_r'D'_CF$1uʍo-2ZRccKlI±9̗ 07zث]ز5m=H4Ug׼>2qб3u5Q*F8#Ws$<~GcɼU#ZLr)$M86 0%M GQ <-nd{%493K.M`w!p' ^쏎ff,!Gm9EZ~ if[zN&#\za℃g tCzE; K!BXUGh+q'޲d}dnI#?̽R)4 kHxtsp6ګX/jlRNm1eD% ؿ΋.r"t1󲆜Ұ MDX}y`StnTF@V̀iwXC=}W1ڍׁ`z(lb"sǝ}H,N+\+Sq {y(`䇧19-㍑Iz墨N1Dk8ŔfW>-k-oG-*g=ǦTc}'W^&ipUwT/;/8c.I:$K휕zwXa/DS@ɗV4*bD#?x ?e= m#+ᥩR\TRqP#%PF'B(w+ >ZoY9]UY5*AP"s(SXrKh}nbgˇW'#ry į7,wO|ЙO?M5kqbXwn~Ǘ~g gtAJbej:22#Z4T˚z#>,rm4@ eB_#pnL<G/n!dPF.kzZ(2{y@X0f&>{p1R(] bҖ8DJyK+Tt:˼%Hɨ\O;s'kRruH!C I\J@7*D(b9q)8SDNfm a_tKX7dH$dOк67ա&Zھ!Rh*cͻ^ S]^Aay',uWgTzS8vޭ^PZϧ?ֳU.O' ̯Q(npC?m3p䛿f ,ߤ%V(P2!?\B5^[?65>(~NixIw EfTn/ܧCpKߝ$Ax˴T17Z/{$ 5x 2')Mp ^3)I;=IJӯﲦ8Z;J*Fy 2/ˊȝ%F;/e8)c BѱӴL͟-j4Gn*r*rNՍdաy%z?,/@# >&5!mb@fd[Ҳq/JDM]x.MU&1]RsG|n{MuKe9`^Tiĉ(7RϮvyq5U7^wn޾}KZx*Vpu_IBa1<)d#QEOY5Ii7oG>ncCX_m B1ỈD Q[t{^)gH[0U]/m/NmB]id pn:SXa)b,n~V茆 yVմp|@OF9Z2np,+Hk"n #S:2UW4$l_F_*R!ɐP6t {?ԭKRˆIF@/Rwxh.C?TJ}c7|ңc1̤#x7V~p} c 9b&3 ۴oaIIGi6;.AC'dDi&'~+X18,!p P߰ G}y\K_aAw^Ie` l.] 0zVc(+» yH;w[ZPK>Z](h,k^E͑D˶5; 4D2v\qQ5oςç3lSW7hR:8iKArѥX(!R`?]?_:.֑uWgۀ02L1&9G&tEu% |;5jWs 0C+b׷SxR,F_ u?8o (L @?%.T*B)&¦yu-9&e"@e^~F1H"lqP 9!eNWնp.#Yh3?PhO^V+B~cCfY<3 *y2$.q HN_xjJ!0g!oE"T?%o VJ: $Ȩ{C3#x$ xwMd8k ISz0 *<4cHj yu7 3P:F VmHy(X琻:v}򲜶 hE/uح/76}}?QuV:}캪ͯAOac^{?`UVy.BUu p5 "{ö uIO߽i(@^5ƨ'&JPj*\Ƹ mǟ:l#Q=AGh+'apt4!sa8c;T7(hnCźz2]|z~^]QT(BaE'(f<ߊNv W?AN~.rʫnw ʩwSo&/aJgt&fcPt$tg:+M~vghpVD~wV0^ނP5վ-zCH K,e(K>̜# n2ȗ¨m)2+6PjYG681"xq`'܌xxJCl?(2iHr-U[Is,\+7?Hb/jDD۞d?)wblnfXbdpEE'| mS{Oǵ >j{`Lte)ElO4 14=awI>3J{0RJ g*w-alzOiVy4 NE) lbc~qbq$CIؙӈ˰3mlQ#|tYz\r~Y_ `:T^{FA,%$I'E*5QO}ڕ V3mZًL;w<%K9Qʑ7o6]\mn-ӶUB>?;o/DYZ2+J-"4 E1K 9q>ɳ=ȭ`&<(!x8!r, PiHȥ?Zl a&xq\\dä<1/'|e/Iv_sfM|ouQ$YcJ~vsq1Xr-t5rdzb 9q('BAu!._{GA m񆰂h;_^9bhaIW(r$|KK|y$=05qYԄfD@;Ǝ7-UdeDmx🦘rNyamCEǶ^}A{S2a&;XxJ{R~ k{O;_h= ^Zci5 0 E>D3$ :THOa݁]sRAwh`Xen &4p|4!!{6]Mgȕ&ڹ0tg#ZIx!}oDT3)23'U'VG0&E9&`n&:NjRcF 7i"^;0=ec4qB@.)O\jk߿{ژVЛg:e^l٦cn~RgXpTRQ RsJ1ƅp5ՎG^ŃN+{>T0s,8Wإ_[r *U<۫)`3#e]*i/L`mרη49u6$ZGe7Oެo:` #x'.Z&\'N–논JxH&Qc 02r2LוL-4.v$2C JsR 'kj#H2>ɋ/{MSL2%+sCR#jg5_R=ь:>9m ".@Rn( v+eю1 H;v {9ϫ -4)n=gsc$diM}˵|7hhpKy_ #͟rFմ( )@i7u+X)rAX۷uWI$:yF۵Z묠"bCFL'q>ωV"y2b"sIߗ>`\Z7i?Ilh-u?gNKF~ 1b_DC+YqN IՐ2YUaVvh:̜ؽd>2i.eˮ4u2ҌP ߱g×Щ<<#nUMFXkFϓ YUYP RItnko,\V S`UQ"1uhq`8I\;/=k[vpG\ʐCRݽIH,&LtlZ%[JXX7k7]ZNo&)8F3',aKn7#BXrȕ&{FqX-U786fbXG:gR=#O NffKŊfC4/u ϬIu/>*~]f`{p'P(} ˰{>]ʲC8A'B/֪,e]H2%>c1O2X+ڬ;SL5czʚ/ZW{£AX2_~& o<eF{J{AqAv`"HCx ^@GH;ϣ0)Z Dh{q$u=A~G]tF{E le/~ v.F])١b;M,݀,=UZ(WUP۟~5`_Rߣ f|;~l`{ؒ[#jq}U.:Aj,.UPTc6CM]$4YQ氉)}ԣwŖ۵-eXNLHz,eGB*Y'`̾A2#"W^?胛/ tvyFN(no&K$ɾn@2 3F9  iOO3Yu+Hฮ+:,z٭)ڳ ARc=C豌/_3P27v(>a&4S=R3m$c4&^ i[ߩ 筴bsfz⩚X6Ր˜]ߍ@0NliݙICȨh.c9yD|p(š4>s% wseZT;SN + `5uT/Z)ZFL_g{HaA|&Tg6kDn =Z=!6 5c{o55y? ĐaECĘa}ҥd` V*T,~/o:2zW!7#:r1&J71ХT)<R1FfF"yݒ iypV6,KϲҽN7ekz_φ̐X(QYhs.ʔl J>luK$%0 A{֪'ٔ"O 㠅ehΖ9O=|9Aɦ:$8>Wm;,dj6!J;i&r#x?xQ[ e4qݍμ>.Y Jb[u{S DZP .xSf)ya'1Ai҈@BΪ 0@!2EuCcX)Z-D/5h ɥWME⛹dgg{ u<7##ɧ WS삇;( YI b5 :Vެ`RnB '^W JyHU>WVIM<5ds_R_m~0utq25 7ʙu˥N_ܹǯ7\'n⸶cŔl- kUM$dWG2Xa/\fP!\U2$H+0LR3/Q&Pi  nGLEϊ%7$ m(#f`8ythvT/JX8]3rZA6sGrC$T= dJ┃s:B.v' 1;Yh+v1)T<ʱ) qx mo Bˠ ] `]2W$&x*'us/h'ĔRW{50l{HnceJ,'ď$̨G3q1+(Ԝ֟P,E.P:5BB]FZ A `%k KEROyGR B3)$3#Q0x*д@Wgev?1j^G`%(Yӛ漖cc2"..QwZxj~'EI*VEJ{V[5rR`)N eѡH^Y~y??ũO=/⒚̡F[V*S!v 9, ˿Tup'Y"(yƆ `^Ɉ9G;a8vM=ck['pX#o9X`wC%! !_tF0L@<$\isERRyTl'."chi4]`V*[X4՝j}&9 ,Qfa%><5#ܟ2RCP{,}O&yס8(%dxp,&x'ʳ\8˰h%U@}WԂǷ;X gǷ; CDBR%RYC&n_tzI| Q~4$ М~ttAr%rP˶ƆqCʋp1A!tkr6%u^bEmEd2+ ;! -rɕ:cЊ]xp^Gѥau,n:}L"]9=s,ߨl<'SNћnM_LYeIEhr*!-b({ԍW⾵(|I!Z凛| Aj`+i-_!t+*Eƪ2AJp ~mv-z۠qf@#wW|Ӽq ^\]?&Yqz{H}Q>ZWȀ.'Nиjhr(]ԍ޾1᫂Fr5b⻬/o/g*slkDKxFaVr(㹎Æy3ң)H^!=kafGߡ>ed7%^o^]nK5틑۫1NS_y-=PXw(96uP8J TpT][kmҾg:xt@Q:2srDSV3Y]Ӂhj>."خ,$޺.Sly-k|&~6H!g`;zy7:@ _9i-ؚ" l3'xAO LuGU)wwn -g]1~=vQwUn8qQoCc[ 5|0~,u DB-؛Dtt*x=&+e:5'nNĻ-8[FO*N2i5? "sv? $i^`1˜f\b<|ۛQ3 L6{ۀ{_ٸ"IUaX5@&Xx\.gnk|UYoBaD+} H2fCJt ~QRwRD:{ut4dYL"]O"PuQ b((+[)I~:,?,g>rJdVUx$ֱF2pɳ5Lygiչ Nے" Gڭû(i{/CUH0(ШCbH*sF6a`Hx\/b\If4)r#gFY/' Jp{@7q'z -鎚rqfg/.T9I_9R@% io}r-< =PUֳE*lkRhnm Z^Ȟi35ArJs2d`@-o;cvH%g$SRJ?4 q?cDOjk"M <&Ջ$}qѫw_qD||{)7!b0@o3.:RXjm\8# E 0utf>G(wBN-+P€TX)%00.&Z{TvH vF/1C[tn};ߒ7/^}gt&%r` yv&9e{3j7P5\u3z ۠-t\-%Ҭ%QC\SNyx0G}1c#cǞ( ={Z9eڗJl^|8A4?=붆6p?C/H uv޼fg:ɖ22da p/}rdkGmal(8Ct-kƅmV9 g"֒tJ;R 9е=ΞD&~!D 䝮Ux x$ޓz5j9~&9fLώ`R|x߸09q;72KZM'=}l 7a A/PػϚpeP"%r27 I'aVg |xmZD+TFԲp'א ,%:IEoʀTe/n"3aY Ɵsll| w4p41Ez#o7HDF nFD^O*6\F!.0-j ѵQ>Rm2G;'6d3#<\&l/! gq}^ EC6~P iq[82:8"FU5qP^hv ArMɶaZ҄Ʃ|Xnz֪MJV(z ɹkdQO6|4>CC^At%x̂KOdڔVHt@0;O_3t>%_j17Bh(h.j(a{Z7'35Sq2!<ϡP86 fӑ%IF|WǓB4]{_@Q==w~k&heV]* $қI}`*Y,3o;;X`q\3lb JїRJ"s>0jT2aG~dWSJL蒔"!UOfQ:@:nTUpN [Dp=7<gCT!7K%+rVο,ɨ/UDݵ|ԃ^/V2kovDž\߭$Y"%g$";8Iy@S1ZFOM]?j1|DJ|5qN$aă4[|i986RSΜ\M|jv8͵(_1rƟ׃ɱuv2MϣQU֨` #POےme1' h*VElnֽ7刨uZx`⢚͙ut$93CCL8p"пHa??|{tRuscmk+2we(F?B"k3qh6n Y[IwhPڗjK{ߵTel\?ëcXv$QW.d`",-{?>{`MV0aE,у'vި넪^ /Rv9t}X.7SӄܑY:e3)Z^]]|SKPCjE`:*fI-Oյ7w/ :Ank"q{U {;+;+ t"7˜qΊhdns %p٣C5FM|_|_`L+M8D0(] t<x5T0itYA˿8mcAiWy-`/̆4*psmi@3R5x&*rK :%&)O4M拎IxWޝ®zws]_ KɻQukYqw1EwXQtjd4̠&Z܇X,uiaKZuIɟɂ&@ )q9<4\"!MJwg҂QKw# W|#{H`1XHrVQk3's:7E*XfĬg /#%4hly>D-@ 3a@Ohqmb}'9^Hϒ5|thNyeIdcJԖ[A{8 m 8Cu9O('i;ӧpVJo9L"s$VS"=AH qٯACPg~~h/>>и]Emo::ٮFχd=ws)1AzArT ;P>K䤛=s{.BE2Rcقjz/}loDZjc-rw=<q:`XoNؒg½OXw$h֛W81F E&E㉵%2ʿ4%}2K|wӃ0RӬkZB=0O$`&8j8hyNp|rIFΦZL bDYR[)RGEgLHxQ-m#B3C&וK7ruWLp`]~#!lj|;g2nA*jאn~*C!__˓~(80駐7riXmŒͬ5EPau:꘷nYySIz-.k♍/F6^NXh$}1ptYN!Y u@X|8O!A7 P3 ͯA2+pm=mbC#Vm+@Ee1:ȼDw9OB)[fG8NXJٵ5\\u֛;VbNhDZ?.pIOQrjA{?;u]5G^+\aD cjJ>evi-m*{+yYDǟ/aęmәbŒ96*q~ CE_#Iw]\4sp/ w;7S <^\S\j,[{LNni4njklӟ&QPC"%Pdeo PDC죲G6l&{eVi4#F_"gFD{#GVATyi2j.(, `"GL;iMsj )Rvəj7;Djy$OJ\\V8j@G<O - .::A  hvѧclLS'Rv5]ZE6El2)on+omut|VۈL$:2yt 5~'# (̸& + H?N<X(8[h@1ʘ`: OQЧaG8ҧuz+do( u4-V"ttؑnxK}.%Hc4 #N)RDCSထv(ɽol7Q9x7$MX|mg-u5 v՚ߤC6w^84s Cb*L! 8#Nƚ{>u̙YX [lFOvȆwN@б]͏h>Z/ϲC/+ ׿Zs;")umצexgS6)^Tjj'v;Iz]eгlEWnk8uc͡K0li÷8X{<+ ߐQ~V5 `wvl#ݷc[G#/ oޞE$6*w-ْa/ W݋EOQtk>L#ͥ\sZl(%BH$P#D^\\Ƽ5}OwFP'@U~ؙ. }_nb>-뀍^_vT1_1XS =RSF8pmZIxHRUwܓ \Ly:i P3'U۴r>l[m%sur%&*HsO zHFqkJ ~mفX=dQhDK:Vo 8o+SNűS@ iw~u4cꜴyЍ{``P…] 906mіdYǐ%ꋠs$VSxCP{ G!zN0 d%xZ0ڋh[ ,QHiԢ?(% ^|zwS(1## * }~yh>?Ҍ$a'@T8cgu`M) eʑw8]! DdAZI F|O(0%aFvF}L: 1Iqhh]PO:mhOOwEb-9bj A[33-fZdQ9%yYQoĢ^+9zd2%+3XUpN7Vo仇ScCIa`Yk +޳Q(~LkrV,mqc֫\k.Q̰k9xfBD|+J/T7Mzuf0&L7{j΢pz.],G i${]UauvxVT`p 1( ʱGsgvrB/*p<~ 8yBՌw ךwyj ;2"y;kK3lNj] e30gߠV d\ f4!˅ E"P&.lF[;㖯 ؎f`Fcoq9z Gl:N#?BDG'k;1aTEo|#uo倡h¯F燗FQ0 1 PP0(U!f UF]8׳ L KkOXE9&?$'y)%_svs>l屈 ߞ$$$#3~,el3͚F0o+I4 fOtjd|gb&ru4o*-Pim%ϯE 2 fs4A9S}Oid4?Zl%Y|-RӖ8kW"[`~,5vȋ-ۊczep 77'vXywoI cjv8j^.po}iX ts3:G%Y>WG~@XW7{,#փ<:QTp B^eb/&%c +Ӄ'rFs26<gVuz 97OEh7xǙC9_y R~19G }*|9S=K$iW{L)p}r>+ ]+nWgq(~yPmm+@=ʐfls g>M߰Y◿ ? MYtgP?ȤeNg ,Bws\ rop6}, wm_~ЮQhD &#Eq=QnXVXLOd:6 Lq!&fPPQk H!V76 beb N.oJ[ 0@#y}Ue"zٸ/I#D̙L@Pfё MH$$C1S,GBaQ+_Ap댼Ź A+F`Y/@7l}񽰚=HcG u< P\[QR,Fۯ5"a\|-V=M׬6MyYo򰐤wF8ŔRdV8[մA4.b $O`M=K5G'C-+s $_2.c; CLX;f+_mH=*3P;^)VG*NVZiϧ&7>%uiT2EA@dc.b26j8 . 6:k׳S;;xBFb]v)(lEY夐xw_>Kbs{A6g*Gn ")q Ƙre-#ŽJ2OPj,;Nس NS$3]!~?dI p.¢Sf~Ӗ퓎^͐7=wJ1ʳ2"kx \ kcE#7a<(RW}Ш|M\&ނ(x%}od_z &ݶlAwg[oXy{RE. }N^&(rjFpQۗ9+L*fn7~Լtiq]YgiXtZ YÄt;ĊM#[icy_ H3$!MXbT9%3L= JQ&ng)Txuc xMN5&QEW*N\#mt Ƣg 4=mгN4O^њ4Y'I |VBl!k&>N b/|^E<UJl@X% GFT>Tz+v$)JCm) Ӥ9~[+?s-D[9L[MڐSּ] 8ΘgJ(kD z Gj S#4ac$zk%n\N7n@b}p v8>y#](Jc7ӶðM.4)қD>`!*A$e1*NoӨ`62B}b2ڜ<~[Np͕!ꄈ-jyw7@Z9X+N3%"!. 0MG; BZ,U<@,m6*gN*L/^SU/OjWO&+IP)l5lT'_kb^~VhQYwNPY3׭113sBZװؽ04:0^H&\9揌7>'QT{ N+  u3$ic8`3{ݻET V%R^]Ę]L93Kzw: y%X]I8 IK˯[~6sG7̎espIDe,=ƥU'WhT@ms h5rxPU?>>b'~a>r jy nr |0.I]ywZ㡁" Uw#f$P)0[.Wꫝrko ;i Ykf8@ 49a5Y <yu'lÕ9.]s{ŠGH]6jwQg!?cM`9C}_e-Hg3~:ÎaC#7b\eLYa@]&ƞD@J&;+R)V( re?thd#R-l.'˟"?MgRǿkI3xe.l g$z)[uUA:^F9ª[|bŒ s]Ig!}]H7z;hzCc1+~-G'{u}ʔ+骬%AK^v:@/W5koS IgX#}gw3 j?X:WX4t\d ZV9S]:qQ,F1d[G$(3$v]*3<?WR>M8ɡ2Q9I["3}Kp:cjS y hư~EA}) >iǭύ[@ptڔZ=xPmh+\ba&>=&F{40sjVY?0NP\9rѯHקL7kj ~ǧWS2Ew&H,<>;4L-4UbQ-N9*ΠǪj騝w ۭts)ť̘z{[ܖ=5e0* ^ ,&eԣj 6c'u5F6,^)~%uK=wnb'v){*%F+g9?[Y#pl)"F8Xr?[UJZ/ U>N?(h; #!}H= Нm^ ׅ'Hzo堰|Y2RKj,1B ~Cr+PIBot-aȣ$W֕):8)m/P (r^(nCAn3%sq/xZEnvrUe NtG/s&W nq̄BJ!{WÐ[gt|<3 NugMQIY[F;ZAVi xQ5))Q[WªiȜf3R~7O,ǒK$WSZ{se+t-8Oz?:uЌk I4b[Z8bgi %RTlWCcba54Umz6:ӶU?6bO/A\6ZLDEɸʕ' piFܷ1 'o/ 7{@SqZ^[)Q$|>ZJrZq %zt~%y $O)nr:sC`lTQZL! Cbړ9`lg/Q8W)fؽa g/Bl+[AYyMO1#ܙ:u\+"jcTmZ;֎LM>ʌz SsPo?1wθ#+Jauٖ@oD+o(Q}|W;A>m`&7Πc.8 -θg燑+D@m!arc,\ZՖ"e9~ՃDr'8 -R ٬? ԓp9i}21{yKb nJ>TڧDc3ѯ ԥ}>"Z?#4427%)`7ҿW|)qK@(M(赆$sqظ^`hh񋚊ͺ&\zY>c3Jyb-\v*e~O m5PufP)o KF$3aM9Soo@`! ꈑZgs⩖ ^╃rtwü1Jo_"SUfl^@7~AC3VN֛K6x@*gS]6MWzu"Ӿh DhM0 : Lt"ٽ`DJ#3;Ơzsvךk:(eDD6KxnIr79=`Q>ʫ{se(4? Ɛ^ pKŔ"h>O\!2%P ]Hano,E0zʀ{Qt~4#pE 6#JiYp.(;델;8hgoN r SHfɷWx'L3vS &D?˔(wE&R&5VM"17)fnu$ *Z2.li7z Z6rq9CJ}4+GYA{9{f (V\"@cL7GQ>0b< nɲ9{3HFb~Rrɴ G& Hogh1ሼŝfX7|y5OtD;rS~3H ~9.7D hrz-%t5o{#_Pht5?uȬ\;Ϲn+j9oMuGe]Q/KeP;W= #e2ͼ=PT=S;RI55 3,Of`![*Df6Er7 x?^ hm_i)aK{列jiw d+Ή 7J " _Frʜ^m7]`m+ݷvʐWt!E(fPy^=QՂrև+:-RZü53(44/Hّ gn\Ågz1B,Х3ΎS5BJ'b4}k6h#l mĻ@Z e.B7;ng꬀o l5^PKn⻹l7Kd4gdFRa] >o<3"*CdC2x|C\v^~: 9qYd=gZ2QsHϪVEЈB]2\ĺa0j2\#"fdzڈs+$| ]X-̜a$WvsV *;]C9e[ERE$-|9a 6leW6M;Ĉ4i.6)e„NW2$p(fS# R mvxH{Ů԰ߐYgmцpb@_YF*tF6 ~r~b8tNY"#HM>=]u'D-g@:z#?ŵ>8pM7,Х ѧTtR]B{5QoTÔ_SisC+ 76'bɌ|^q,c' /Vea+*Q$7J2HD,DuKVD8[)剜P ֩Z4`2,rm]{ULI`DwMCzig"v5)ճvI)}3Zֈ5©2h l`p\(F/p[!KEV5JMn3E ="R+NP|YyJiW9ڟ(fFdx^"pR&>%;|AJ=)j)G%~[u<~UC7|{ /-7C0xlvqyL-djU |zߪ>f튿ЬŜz Kd XФꊭҙWԑ [q[CACFxބΘn9*)H|Mg;.hXn(C[,:|MQ6:ٸqK!Vt)wqLrZY,i%4x+Soh9 jS1̝ǭCPk3CUe r,n gno%vG*>OT[]3w,mɯd?R8SŚV1E(PL>HKh^W"NOWI*=mF-H*3f'{Ԩ4玎9ԋGs3B {\)(Q'^,:[ƷUr7n=ێd 2#9\>rbR%>U;(g6lr@'ד [z0#ءٶ]]X%71;j.[jn}IP>TI[U bIߤ_ Xc5uY Q Dub^QLs@aOJ cOTD6$n?,H}0M$;^]r.3nLi.@FsWAךhbC.r` p⅝@e(2M3su(p^#*B (}>YW@iD+X?+j6#OFrUuZUnUN`Uxo38Nd!nR0dQADgf'~{ /7oyzM5TF?cMgEb &cih"w-kχR)@'{4S-;+fnxQ-kk4p$ZGmV/;K}_#g%0i+sX9\CG7{mQ=.h{;cKSoi,!ME7MG K; PC6ktr;l3YWFTD+R:y7+ %Cި* @n)y>qZkxKN;+pKa:4q_2$]3al#ܰ6}|vS눦1^|)Y|;0i8,?!*Gp̠~PWe\!qcʰ2x0Xkp c$=Rl"syk{ߺ Ij DxwZ% `7^#GM~((,0DUbHuQ$/L 1B9RBŋVHM ],P}Gqt;CW1@Zΰoc=6)Ho((+u+DzEN@gƯ`lXslg F4pY89LY?oջ?z5,)a.fl:ÙB'rL|Iʐ>ЧI[s3NWXD0܈Cdry@HL}`|4rANR=>oU.}zz֕ )zJCY-d e4b#,lCh7!7ߎUmKO}>]p u2ma?7X20{az z60ywrp{ӥ!tAC~_BbH%6vxlfi}ߥ`g8K [k%)?hG (LszC81kZrfz;?_+hH?[F4[zG*h&#Y=kPԦy}'-|F3 r7zzz dا s$nuLMdStgR8m͑ ^ԇ 6zTF6_\6i/yG'. HNj XgEm>K+Ydk;a'tz{ۀgympSU_ooOsccJQ_dAy 8#:Ĕ\OnK>FUdv4&^jե+Yѡ+ :AK}#9n8;;uy*'/vî&́W{U0b2+}u@?O$Ef蔪e^T hi쯵5 2IΤ+U8> lA<߃/hy(2Q5 ;k/tkCn T 'LFr8l9z WZ$ q|&5p$l]fjQX^(qiJcrYX|uU T'& ھ<‡VXD+GR[iotuLlybѵ!.hئf $X\Oć-c91jô B;eKE'aqe7b\ƪ/oKU5hEP6I|J|+9%qK@mNt+`!Vb%{h38`J-UU䝫zDܱ!zo|l{"ul_za6ߎLv|J Dq-66H\,ۡlwLHP@Y%˹ey% DEJNE*$ݡ)"_7ePPhx߰NwQ*/o.f2#wϟX|IQ,ESv8Z}o )\SMnė3Ӎ4 ~2p|l;4܅L&Vpug ӯ1 [t5a zHQy8Eȼ;88).v"|5qވom-k/QCɐpl\ Z}hF-H_)uƇ'^=>IQc ;0`7 #V-+:$,6\$xP̖tIZ+amg+o_<=q1"/Aim 2M?υǵQ.`T 2&| ~+Reڝjzah =a5Vd>q$&ǒ:LzplNQLRybr>\QpckY}1gyx~b7'_qMd(uρQb]n )rXŊ*q(^[ST0bCPrR{6թo!cyq]/J O zBF(G^%5!d=rgM΅: E|Ɖ!Qѳ$o gE\@eiᣪ1'*q Axz/ƀ.kD䴓DhA#Ci2[Sr,-`֖Umf/4~X ] <3i)Eu{k@.A ռqObL)08 BS rLu G%<R0ba7lzؖ9SqicUʧ86'󍝥KOsCC :6] \Sn^)sP=~[A!&E Z9r?+ ~d@EGXn77Q#<Q%{a*7d`&d/ր_5ȂQ7$‘Ux R*cL+ybD:kF{ 1>c4ǒ?c/=+Sw9`4ntR= [.n1W8`Ȁ9@k Ye؄d- =b"Cd9T/}&XZ҈b- EXeВu^:}H{fNsd;0 v("z APŎ;N(t_o/pQtU@QwzxjCal X}F Fr:a oyzё)֝V/ lPVf[(S y=0Ġ5P'&w:p~@c1g#Tr#UU|URdx)k6vYt $)=c7,LvJ(Fr.^fz8\[AȖX%Ț 3HvFoVeI{݆$wWѼz1)o&5Ec/HoiNY>vwgQ8^璓M>T̔,Ls,P!JL"2Юԣr/p <H[BiyVGi ЋIxg]qsr]>q6VMpuU[Tw"g9ǰ6M:6?X&!yʒ`o }iנllŶwVLV_6hC_¥ӻL/$Xp/3Z"Wx_%",MPft/ 'nm J%Jb{Dq&C3Ch_ hE cQ5(vt /4q7Tr&'VKŵQ:١dHnzpȎ 'W.*c|V$F6"sg;`̜_p &}:L6M 2^jZD2 $1=WIm6 .bGvr;苻|OƎ  ^t{86+\⿗/:y#O|Hb!v͸ tĬ9V ]uaȿ+'&Ý2lv_7]ܹEq^`>[ Hh+O>Ir6DmlqQuΉ5xV5ֳKO TTuUz7`<,5?@.2nL@K$ԧ1z/n-p-v*7œ٥Q^:Z{&\ҪnpGN4Ǡ;Uєi[SN}3Q[t][ pI~, OsIOR~1E 9&Q1  ~$L['8m0+zB 8kc :~-W/4Z|`qlIT e+M` wI /Pq5WƫC=]SZn~IJ+n= 46. m sAz}Z~6_ Xl#}q[=6/vpq.qsЭvy-6!QWڈPn1Ie? [Q==|['QݽSYe@e1W |TztU*1g!S,^Ň4pdUuDxuf"&zUU%ϡi8ЄUTU7DH~\3G:EfԕX*h `q M9qm^C[`Գ6Zˢlޚ3zcG2 W{^%"S7: 8UpOcGTHR3 =: d<%5Wܶ/ 4A8ZH_=p3ٶmԠVqD@BstMp䜾6Fl9 us2LpمըT+8ܣD0$d @A64n0d yE*LNHmЖ, ZL$?C)5p#U;Gx'1v²LGcխ0>"#Q:sg8]*8V9hCq$E*tz8:w3iSkBy۱88Wkgamц[Hѝ/KbA2ColvY{՟SZtGb"}hfq++ )W$ Gy]ˇ<*8O U*8q\W"PKZAhÍl,S+?uWcfa,;v_'\8t@fޢY$6MU[a .-#qJT]ŀb,5sȣ~gIVQom=H\ŃzD:qU-jêW^w(ə|F-//pA.Au'by uXrfK}Y~fo~$wDfejF61.qIM[[W7-Y aq %w]?Ml/]%pƧf[#?Է}g"N8ܺnスk/B~o~9& xH > 1i0m`N&eEDb[ `3 րȝaj?pDtZ&?+<^:_{qee؁UH$ grG² /T[UTW~:~PH~B 0^)Ö=/񟤻C>?W_jm`ǫ!4۟1j[2KH}b{F*ܫ c-^ =x^t#k*ˣsk<*q { nG97LO} uzlQDD y0`~X,.&H^$< V^-cubFF[Lgۯp"f?㿜qUG,1d@rƶ$:mϐ$8a[Jvײ40 ^/K*l@7v;x.i)2Ffަa%Q#SNjg~6Lds 뫻-M=٦/8 &iU%X(v#a10 V5Ǡe l4YuE(c%csRle) 8ҋIiun`<T$Z11!qFi,YuH^Fgצ*8W G!Y NGj# S2:1lVòצnxYR4(}eUS qt[hQB[= C ~xS}MHԔ< @Ҋ~PY ~PqFZ= HaEi`xNj{u+:HfIDUwf YjJZ::ޭ/Jb{gM C9|T|3%g.,:D9-\Ш ?N! m`Ɓ;&cȐEzt,܂H6xggjLTXw?5 kd_t&.vT~z܌n&6AuPي5f'kz7y(u{]| ,Csͭ-U3C*?~ޓ6]4hq܊, Ҹ$ӬL3ʚh|my1\HEȱ&f_E} 7dGV6rHE {X9La}g)Ѥ>wK=vS[3y}5["A܃P2ۙjyyV߉7ߥ@¯S)3{o#DRoȁY}V*[L]'kGMCl{3n| %(yh1$-S~L{G/w\׶gqPeee$tpKCs97UKshپay畓7`{ Q*W ȡ=)8QlDF^i!&3m%ޔhX[Y¥HRv^t'Ciɘ zPE G잽zwx 5REuP4CFK1i;XteyK֯ş(fΛ3nd&ߜ,^:h-ƨu` ";;H,7,MQ{6B^xwF qǗ@2J8q m?BbJʛ[=5UA*2Ё j~fNr!-cV0Ua#G qk뛏-';˫JԱ9%V w?}%~L?O#˄x6K.MY\,f n$zpu]k?XyJVQA'͵"5h+"`"=0y7O0̐"EJwLbR*eꍔY9}:HQH6|T<~"eL1G3]lx< 5K1Nq[AehE˴NaWU `O,|亶Hܾ{944 G$p].΅:,vwB@|ժu{aL7fQ33q I+^0Z-69!cQcX6 p+Sx6j50Ճ3YnDW6e*,닾}Pߨw kӵXY)$]ڸ_ṣe~E9Eg> LK+JoЅrZ FpJQ|ؤsSg3q@sٸ/+^y ]φm*|茛+U|YE<ߴ֔=́e%Z+DW$GdlPV$S)a2[MS^\ Lvg3S:G@عC+):jxטG7-MO~Qs~vC#x '~<*_pGS~mp)p[ӎyshUfL3{~j wVf2˧$lsp UߦKzis_=۷ pUf3.20~LԲ6 r(=OR[LJWVf(1g`K;REs}YeH"d{c[3sT=Nݎ|nH"Qo"?73N֐~y 2+3/A|Քnk P&Nh q .MDxxԦL8׸-sYzߧc5Ʒ_s; ~5,fzuTc$P'[Ncr-oRq^>JD-pY`j |%Õ#yBs]hf1,mqJ97%*{7h5KB"v s%lWZdO*DSa >S02Q&6WŊ)zȒii'pnWg X!]X9W-5G9,5͸u cմ{ONdlOzMRI~Ś -_m%hW> ӌz20o-ѯ<d?1EU^Ei-)Du5 LO*H*C$Wjg <=8An:1 - ]Ć+ݯN05Dۗq*>3#-V bK |>Xqcb~X$wgeZ&ZopY@Zy˟k|F"Ѹ7KL#șxbV1Z5tF"BIJTkAԚgvdlr\yӾݱ^${ZʊR!*M@iH8c[BXF) ޢwo6pP\ƌc5iaۧ^|vp{httv\PT!}/sv4yC듉ǥJ%EkfZ;5G<)XEk_(Z cpEΟ?}¡~s}O~ ̳+(4艫 `Ja ݳHZeo~qȠ+O4>#)k;+3T~"m{_*(:Vz~~̙~CDI1 dPŮ tIkN3IX#9us7\_kv%+ vݝKj'O,--Amn?'9'o`4h8gbBLYz''ƌUg$ߺnm(e Mw!Q_&x!棽jloI8mo>И\r}@ʦ !k8n:[H2i6~iv(|sxaf)KaNԺ{05WR^K7M-1ݤ`<\ŵ4:x_~3{XJBd.!dW&rs|w^Rܐg(%ӏ_ #)A9416/7Hx#Jr0H>Y 7i+w?|֞FnKu  -,ۚV/7FoCT.r A*+Jn'h J.8x,5|8[!  {ZPo-o֣[G[ݦ`I !P-#>)C{,qcrԆTbfeYC j%2ÌI޼q2_狥>&k"qadp DŽļ >m_9s j&ڄ0Zil|]6P+Ԯ\jrsmr G؁x>pRKٱR󦡢waV2[4 I?\Ș3:T+6 Pݯ/awYЅ@~qߵH)zږ(#{Y\_gµن:]]Dnmb}>2bN\(L|%-Y W *>"ޛH5&?Lrd̨Rpy HWX32JȑZ35i݊ Ll/Zb/V;׋'ReðE80מ+ iC0n:dymV)Ƞ"3*Hhڇ3oGY6C]{9Ys+ B(fs'G k9ڬj W5oP,]pA҄[ʍ޷n2CU3Uే;ey9V0`ٿӺۯ郤vy%Iǥ< v|LSatʡ"DS4Yoc eZdL@=S$ ?V6|FO yU}e8hmf->~ . g>wu Ă`Ed54Σ5z%rm^~ɨ^d(,HCqiċӡwk!u0ôA6N~e"(`̛F>@ރ L0tf~呒)?!E"0 ' %@V 1RĴTtqkϢdž XZ'5ЄƢ6(KWd.?3Li-Mqfϯț5 ~-:g%9p73d4vpb~.f?#/⿙G?%A\@ҠRJfN5ei&eFF9zrw3q<6F?&0Kw^C0I}J*2*5xZ&D!X@̕Aiir'\G|Q7}]h:Zqm\ d> f L]%qA9o I.ZǓ(B †Lin]؂W߽G̏gP:Zau$nS 1~=?'砶Lpm\o>G+]xAp+C8㤆7r+ޟj&[5)}0"&_.YP| 9y;El;i^a (ǡom kΣ./}]QuxU'zAIdS ]haP+'p֮~4[>wz1\ו! Lkw]F0

)cYa/ehi`dg֐;GC57[v ř- R?y'yvѭ k!@_yc_h.ٖy֐j K oCqdz 5 &tS C,H>iHI N6W+ ldNI [VWӄ%\4ȅFk*k|(3zh C~a7+XDs-خƸKC2ӊѮ|R\|ZfC%V>rOf.R%*&ibh BvfŠvx7'.>>edSSL| S-ϳl*!9 r?gpæ-QTyi;;~6t`#Y8ɱMLH" G~s?@Q9}ŔcwH>b6 c4BGʅ;Pr4Zr*@V b6B9گFح[~|%Y5`4Fwos.ӫZ]l=mskP7Qg~6J M>fQ!,HH .R&sעS ) `sz^lTqsaט{ T-,XR)?:⣟i$/Ё`DO5OenU"j8 ~h_rXF2-W(gB%[ P3m,G/]ĺxȾ[PHos,f?JAo%_cY@"|V \7ATA)))L\|f1(e0i[3 ) {SLqt 7GDƼߘ<) Ӣ6v Jsk 2cL 'Ll ?lUl-Y%F̊O/OaeLj.羘`#Y-ƌPɩK)k%1S/DNhFй!EC$#>VR)i(gՙ͇":YRNԬ|(;wXb5$\d2G-PM#9%> }{q]@֛WsP;?ev2'cT <8ñ(Dl:.25='E,&s҆>NҀϯaw]𝳞?lҕah4ZDeyVz -qI BoKHC[ 3G=|Η HKS}o ;@6-5|'k~ 3bz#Z(jDgT+ ;pSux&0ɛ2Hh2;^~|=}-C {AT}3).d(Dh-oH+չ6]w,@a1ez,yV5^ͦZD@|D]fɢ#O@ %CW"NFX=X "/Ajǻ>5ڧǪwZ7[NC$]u^-):ooo;S1ؽ[VXh݊ 6*{b]C,B8qerbvf0.gЀダdqz44^Mv|:Hꅕb4^W &[zɦԀ ,O$[1xȕʫ|ULBvCPr$]\R[:4F0``_ѫ yAGJ:!e)zP:]7zzy܍O#pBErXF*gC:7~C n}qnH-yo'ӽM@&m!N\f8_0 QVuR;Z. ҟwN IamVp?ov<Е ЈXts6vZQ~Jf%Ԍ)f9WYx%vf.o{6]`~; ͿֆDs53!8bc{ /d9^M)>0E.[V哖⏯je~Yn&H(7*~34?0k7@RkJk5"=d n+N"+KN+Wr?C2xf 罼"I1s?~cLc72ͅl Ft:eLef'o fVe4(KGwJ趕?_ u%T_ǞET䬖ĨWl^H:r`T^jt51k$C٘{QT/L1f`XnNs zRr\Q7 aٳ,kgԋUD뼾I+unf@6o5 1p0S 9f{ófNEbb܀BST11]!dpN ɕءjęan<>\dr3@o9S;<2i  lr\Q6e(*#5HH0}հ `+rך /AQDxu2'w?v!X=AUKANi4 ^N֤M ?q<-,isl/zǞ"Ԓ.J̘\roS!hӍ9nh׸1-ib|5V`L(;1.3Jm3Ғi>NzPG(ӭ՝HdqK܁Hb{O*7VZ +<4(d TU. R>6ՠ+#Zx/;|cĂҩJ?j"Vڊ>j=CWSgk%HpG2~b uʰӤ ]Oijڏ)vл׌.Ƙ ɑ{߹´_>H ȰAdD$_pWrԟAǢϞqt8 Q*ʧZRa/{y  +wcJz  qŠQ/NqrDAQruQ]K˞P3^/G)ϲ'.N}֫Z@A1JR^+d~SuxA6Ith})M3.#jP:npkGMMky_f#$@V >? 3jפWXxz\oIV`Dk U'/=ו["1uGW̖ .Rn2OZ)+;#iTpI;i8KͳezUm+PB\u[5bށrru !zPGx }[Y 7[ci艆G`d8JCyM?-s%UanɁҥNWTF#Gc_1 G*{>ؿ_", 9{z3 vOÑ6-ĒӢ .EaāRI9_)rc.*X\1:1kg|oϩ1ܠZH'3 rI{جE@0 Ͽ{k+TR.Q!jq^>dͦrA5o*I?[_Qsj7 MʔzνsŒގr[i 1l߁u!PR;pcz{WRcoH[`5"a}kxS-leesf:}$>L>6h:`jod5#e˻ BMy¥=3Q4=ic+5'oq@X`@Nr4Cn%uUn B! ԁywQ)T0"8uLGMpP͕Q>+3YXpt !!On$8{@Z4Kb]Kݹ~*#yARp0MMo'KEABx`ֹwf?e_W7vmN@Տ7K:CK!h L"+I ] ӝQrB5h7\?;Fn'0h"M봗<FR!<2u`rV;;āKhH}voe4O.d)Jfeqr4]b(UOMtgMnG;`CM}᧫t LW O:A:CWP1%PJ\ErS}"bAҬq9駥THX2% Sͪqi8*V$? qKehwb4.T'XH9ecYjs"L}@h2rX1Du)}ܘ|,v_@3B!Ûנhj*ڊ7eoZB?E \sz'Ve/F""KD)Υ!T!4gAT6+dᑱ*sR%KĢCt,;u8ynpMh^tHsGP/hHLI:x:nkg<(brc;<*@ Tfҧ==;?Ia*YDgS'= Ӎ;%Y3>'T~M sxs,FѵL΋t/Y zߑD~1ܛ rEPތY~GV<x%V#?QwGCMElM^;__H""4TKя9bI.etH r>_ȕMoZjcKΕkJ4{>d/Cwp\Y& ΍k,h%1.X*vu]a $+BDUE0t%l}HV8,{ɂsD`Q[r#W@~:UaB Sv=rYKȿhۙ X3M*˄IX? 69F#+'%(u-?lpo~ls +HMx-6UxIteʜa$J{3Cj$~wmZMe]V6,b?wdWs{;Џm5bp=KB6d:'A;,% VydžCx%,] (WKw2=~DH躸OCjsPFOKx6?%ȭ3cS2 fѬ {/5X3d^hmTCKbcI9Q ̚.J4ꓶKZ$> d?,Rk|´/Y)| +<%hH lM|W3͉t?t<>fA*r*g"*ߺׅqsֱ^&X X%DNi`z3|LA f90bK"Z_J8V X6:,Q3i`\_d3xrw+Qܥ Vm_w܄qS!j! dTFtx-fPO>w2`ZT_ O;o9bM܌G؁+;L&/a,-*#ԅgsB.8l,?Eyuν.CS$jdu-) ,r|(@J \Z]ͧ7΅\׮(5PXwtsb&}ɎkɉV.vS].b[U}`Zq48ekqGm\ЂUH. qx-W 65yqԶ7+[nyͶ9]gKQ - ̈:٢A|?HҼF~`u>Syy}tbq?996x6XAׇ9#J7W{HwrB`d]چe[c)@41^ĺ,FdZi8΄ hq3^BCp߀NpDegQͿ*՜Ue&aiʐW_q /-b UWB*wn@2oR2g~pCWaOcɱG} KC.BM:9hJإ5/!ph* 3{7V^fW߻O*2a<Ə/t[}dhi ~{)#mfĻ#%^D6TLx;.40fG3GURєgxHSfȣE'gi<|)m^s^;V3ao:pԶr_{)oofYN>F8-$.Za*!0RcH뺅.o8o!^HԒ'-K"XLaD21N>md>sjvҀiQ\K֏3e=Kk~YKgTuA9[> 6l Eٮ]5c|ةcŵ7cv;Τg10ԶDcUHvke0GbͺQM= s6D"i0tSxl^;xV{EǺ$\ËwOk#xPĈnFw겺Byjp>ȗ"45 q7xN{L جTY ZYMj#?xX=6 fa a Vu%WLď3\ߗp~/qY7f&%-UcsEngULXu"(a# m/E^Zsj)LXآE9 *w}iC;{^~oI*kHFIy){w'0T}7Zj":-ch>,{oJLLt5umna>PD"H`p EL_/>5W~T  ߃j~V6?vvN%3kWl'Zyt= ܠ~!`@ٸ'/kɷUĠk'h ![DXId~H9vߡN ͸]rO4z9ȋ-x`wRen޳ רI  X8ԧMRCzγ:66r#IW*:n3AVtM` Jn U̒}Y-uL'W]|K Y*qgPC i}Q8xnU ׺Q+眢Vq &d_-]cVZ> YW60-'{_uwl^7;/e1j 1~],(rK!+l؞.@u6!ݟ6 +mw$c˦'0[ݱcex,wUBEfwDŃnk3T=Q(T2X~/5Eh ذߵ_KշhtFۛ`g1qGdZ"*}qgIEi$}E[Wڮ Cw&uC虫-  ވ&EPY5ߵ9{Ɯ_YK=gfq3t6UU2g?QKqO=+Nttjp>3HNUCRC=J%vA&T>u+˵<*qCaN"4FƸ>X{-+ @fwru<׽fWFo肪RƶtMpK~ ;khZҗ-CH{g2Ѕ , z:#njj{ZDq!cΡ3`s?2<" l2/р*HF\ ZEJs }3$tSQrcTNa*AT"~EoMyKvv 9\1ukUWPWt `c9"Zq84f=}/(]~?AlYJdRm=W̝ ke%24_ǽ[zǽǬvVJ)\T%)a4)^!b)82ġzatM2QDcz)""$Vq^]bOq$n{%bsq3r5 Ifٍ/B쿎iQtI8EDc(>= 1y#?ҹ|M`%H(KFEkE TD49ƓگUx5bӹH~V-b4ws.Pgmh_24 _puiչWd!˯ :4 *Arv77i\PkEz},8J|%vNAJ,HH#n+6kFEa d~JyHd7"N0/姷1Òf)%5~z AV'~kd{ѻڥʺ\tZe-}SEwjw:,w`9lpUپ`5}ofqĂs,J_uQ|zw­:\-dV&"m`& rUNW 8q|@o (Ÿ'A@/%j_@#+n<’dh2?3G} -E5r)@?N!8#O6Ȭ^%(fq,R%wi{mP&:śH UfXwA¼r䳜.",beܨHT{8*,wOpHYvmAD ^l3DK7jT1Zv;OZ}lbóLąiNM,jUY0{*AkGڱ!!$DBOJV,j=;N 1υK&`j%kUt4uh_'2uugp:1HNasKv찕((7JğSAc-MxN5Gn`kjb{qm4w?r,Q92z<УYMw$sf\5 ~݂jh+z; iN[-k~[[s3L2cYd(kb:Wa% 6粜-;Ulx mʘC¬i0YOWf`xͼg;TA[ ]G_/ #$nycxm4$0:1P'kJErəd%a)Ȭa'hQ9:ɢir]ǔ{銩ٚyHNn8jv7R 9TBwK>Nm]\W`ky|$#捧~51yȟYeނn3u_^ߢ{Mq Q_bS<s} V`v 3f,fb'V} WN_ > +RB_!YO 4i-NI*R^\Ady'6czg,'YQR ϔNq/fOR!jvOXLʋ\e `z2KbB6bBy1t%SB(ߞ@(;ωDxA_qЪzh] F49cT}*`p12qyNN !-~7G {ILM[^V>*J!-5O7Uk M.3=~PƗkc5hȔV@U|7ZD$1ۘEwia+ȐY sY.0-oMIrk@(ׯU*P8e:;d+^&  줕Q:瘙p[Jޙ[JOR7勂`d*aƼ"?{ Jj;cOW3(4t8 ~Rz0fܱ́CsBN'70u?BR@t ̋?6qj[@!( Y T=@76{,ŗ:N3뀇/j>˗]꟒J?{ɈbDN:yLNYG6IFp9=hYG sFŨJ;l#g^l*ȘaٱdbQyTR1sNa0/V>g:F;RGkxOIg20%H6(_ s.}U]' p2pwU;$72Jվsi\Zo4w*9m[g5_7g׸/y%dڕ)itG!IDɂ[ƣ$Bע69&do9Hrލeim~GS665nYO^\4^AeUǽ-Tm|Zb\O!̘aMȂ') ;w6kN+,1z5g/]rByVO[m`U:ή1 Fm}Q)~v[!x.Sn)@DR"s 髫c')$'IAF+iGsgl_01j]n~TaGL,[1&ٟfV$A@tl&rb-J=mVC.Jhjبgd6Ah}+7LFЗ͝^HBvVң?vZ BZns p]CwY+ @ !^gPӝkR}HeDY!9?wld 53],7=^[sIBh{}9Fn"sـT Ye9;#_"sޘW)mĖ ]~D)ʥW(6[iGw|Lc+Y ږGJ", EYIBm| LADǬ/r ") >D:8UyAP L3[Bh9"Ay |:W 90h6pUhWrՅ>JZc^?S1BATڼp;wQZEjrlT>ϑ%K'D]|TC鿘ȒN9s*Cc )ײJ`#GʬzWlqo`T H A0F/,MfrvH`QBRc!J4Ӱ|u~/KcfV(+P_::JhN^cy"$y-\l13Bȧ/m;"=Z42K vƫ>ouHB+&x,O9gU sm$l 4 ۶9F S}Oyf[ >x>FX8qwUAG 7 Ejvrڋ@{S\WzʢrK\Ke>qҫT8A+i&)4Y4W-ũ-u؛lN\uDeWɉ?Mه7aWq"6?łY{ݦΠ^&W{m& 'y]d\Eʋ4dCcWh$n2)}*6XxJtĈsXtc=3vzs;#G\kIH48bsZaCA~&:uڰ_;K`CCNGbc \PJx6'/q2MTVG$ѕ.vZ$&,{ ͗K.HslI2{geSޓX~]5IJ0aJ8:+}TIf \C |UB\k2\_5QP%d䞖M HIhT>5A=`HذY˸T#͐Vf?=Sjo䦁U~>#w(/ FyՊT>2j@^VTQ5A#HԵZD 9ldʆ7ȩ6|A~ifM UU':w-m C2&R%v>< Z/'g%46Dq(SSsGd&;V䕌+O֥9KuOqu_ 8mOvKhaDZ͟Rp0>}z }&' YYShJ> zw`Y]YG#n5|~[{?=Tbetςa#bt]Ka 9rc-#~gF134oWmٺk&KECQN1>(dg2r꟧&p5kdؗn p!:a2DfeƸ5"c=[nZJ=Uiqt`gL> x{1c>#j\<9p߸_bcQlg}, B0k;͝4DQu8 ~-Bƽwʀ1PC7lkHHQsN (pdD6|ϭaW.Ղcۏ:0iEMZߦu̦L+CKNl(_T]/&,;'[?QRf]ى|q@vGV|U=<Я B-u[XykW VW/ʷ*#k6q?2,R s+\΅ąNjʖuIխ 24@H~IgۇCV Z%eDhMa:hi[mBĽIz%{V{!wϹ]9U>e17d6!*NJ`!D&(<-E t6ZRu Ԥr∯0@#18֬ͺ8~1l)Z{|\~LJZ ?#!CysE0&|aT1ِ:3۠cq!ִ܉FYxW(E>թg\@YU~k8MwG;o4]}XEkrQ,Su 0ÈWa AЬ$ :t-ˉ΍!q<fVxMS*\xgt h(%I@j1NeWmq Cv'*X\| V55>" 3p$W|ަI{%AZ/o>I0L\ FJv'!wC9*Au-GD%w#K+O)_rWU53xCd:HvAP^z@_#ݼb}莌'xHzrrpC? xʆ.NW_|Sr'dtԯk%ꟲ1^e gz)9tq63ԨϭBqRpS\ h!#}Ai?dh_TiÜś\+2՜-fHU /H6:5 q]/r,l !b`-1_C ")3á?6X:@:K'(:,hINd~0)l SgLY_[zDrΣ824MsB *~؞A7"7s$ֱᘌ޸ZR)DQ=*ۇls/eTslZ%U?*[n"LXMÌq>ԝI<'Ro(8$tJ GwRI!'#4lA-^Ȓд1ۉmL͓:o; H[?LPTc֏ER# E-ֱj fW?9<k6cFaqq ]dP,F=|ylJUr}]}9>S Bqt7Kւ -/AnB^9YZ:eR[1]692Ɖ<Ъ #q-30OO61ԎDV/&F~Sნk+{qV_`^_LG0Gj|Xˮ5)W%մTGܩԄ^,wAd1hL9w%S+ivô#֖u\ /\/Kr3V2 I7b{weCaٸۍO4 »XЍOCLSL0A4wSlSE?ɨw7vߩϐK7w Ѷ\(K[Z歰Ud@ӒRzL[Px(4dgq} 8@IW"$/PΝ[{;w&XGpg B1cv!Vz2ns$ݞ7i_ф,yO)GPi܇55NuSz6Pa lp#hӘN]'N;aFSN再 gynhI{rh20V;\R8ٵ2o[vU̬Ia/& GEXB;:Mcм|T,Ֆ^/&Kxip7H97TE46Es뢹c9]{Cʛlvĕv{@{@~ίZت ~ p 4i& =rN^ʫy a%f`uçdh3 %+aa87vBЪlˢ;J9 ,cy7Cl8B3pj#E'j?QSolOԁA|v0^w?~H-҈0~ۋYcGү4h`*-񭆯Ѣ4&8$"|]=fy aUƀL[VcHlm"/#;C`N8(, |]msLލ"@r-"[1twJya[l֊2E Ӑc|PvTz*^[ AnvaVt=7DB-A}B;lkץX] (aPG3.Pb7n5 X@a )^BYs|C;g5]r"gFgdV+O{m `zHRB\\t@zd $xjtU=KKn!~=}J%D ;^l côʲ~ϴ US yZ!r`m|djW5X{:5Xniϕ9ΰ|@ZM?m%bu¬*n#j8J H-8e#*2[l6'К赵c%?[ER-tgR!R)+563dy(ѸnF3锷M6^A~n53H&Ҷ2j1/Jt~W[74Kn!ff@>sbGv?|$N ^ zzWQ`MjD1ZjN_0TJO4N95'q؜ եU)?N镉GEG`{ 8VEOɶTEeB^MGX/} XSbxAps \P>TGM:i_?†kHZ|VAg,g^l,a;o"-)W ʚqÃhM{ ҄5P>O,˧˞o/s[ Y,I8ЌY.LLjx)ħlqpX01u~؅ˈ-߽즕㼧Agj347F*ԗ] d98S6V7.$ʷ1#`AU VjM^-8q[rГvT豏/mgosӇ\)Scf(M21y0:@\ vl@~dn ll7gKq[ [%f`>Ԓ 5iH'lsXs/ X|,DoZPp/&' ѮU3.Jh5PN-{I20s]fF5?1qDN3d-W+RnN.#?(V96Q2w5ZHV#5xMJ!zJ?$ l.(JdMIjy&"gFj8g@Gc~kZxH4%FoRcwq*AlTr-b}N n+e4z$F_eca$B=}%NoҨ>M}ir.`-8KWv2!ge ݭ֩VWڼnez™" %N2(E vpka`gAVP-$P\, }!5ʱo(f7 .2wg2?oIiO,r;KoTMQ'O{0XBX^hKkE@ G ˿d얣2`qB޲r Ɖ0.AsC:%4gq۞qetsT&k.ؒ{D~"=BqcVz zZ>`u+Gv=I5sXzl{gK?hv)\lё@dC6c2U}~Ϸ!sxb_Zrztg8G0~m GֽؐYͳ0tر ۩nz;wInG*(4&7v}ܶ@4A'MQdC{cElT JKlxۡ30UU*VkfmxoЌRwł5HIc 3_FYWg:29 M( N`m,L=%tܹo%#ȱu]0vZ凹 @ }x=;|tQtϘ._J+\,{{z@U*iZu k\ :M6* MB5p\ Ɲm;,ڨ3+l5nQֳEp*!%7cȫŜ-h"cE᛻<24R؊(!eDvEl0ԙőJ7 FA= =0|}iJj Xi %n +D' ^38b9l~{3ʲzyT;dܣڍ&skD|yJI΍Wo=;kw=HJ;^뙓ACsJauSnO,ё_ Ps\> .~Rt(fXl3Cz ΈN~uQS`R'+ {e ÉSь3xhG'V=ѦJhqE˿tspZl.$*Biպc> B:« D(|*:/-q):(U*p ס&ϩ$*JX9E|8z('F ^K#~+8#FjVJX*#N%isunۣC*HNTʵ^D6(-!$qitI僣D7K0mnD?VlI](L9p.u `p"|ʓa#@A) q`qVbl4 fN+P$ !l[$Q/f,o1" ?f3"jRR[]{nX}H@1q˛Kݜ0 tƒ_(Oz$H:͘uE!W >Η/y x_ BIxBM%Z,Y|U6Pmn(pI{mPOza$jٺUC.Hǚ+tO&g[ٍFL>_Hr/lCٝlp͚Kzr{>+A'A^|gxKPDMĆWiֿc403)-)̔Mk2K'v<3G$uNY4IOX<؀Gr#t}tQ= A{NV۰ǰ..X -=]ߵ[J [} 0zq҈ ޙ^JJ@z2k9Abb =7ny֨cƁ\ZI_G%YL3V_4ě u; 6d XS{| aph7}!9?؍yުiJ#>b@5[L&~ H\gl)sBd !IPW)%X$ -RC?4C1[)0wTwWDVPY]ƛÍxCwZĬ+_93 Pћ{J, P$iӞ}b\f>M Jo IiimeƝYqʙy[nCi$YZyDJ>AOQep>Z_oE|BLdn.v A1u bXS)d.)``0RA,]06|Y<D۳]<:OZ ХY\xckBOZK[r:L[&G(O5fY5nqЕɭe Ⱥ5BK>׀QiWVDM]sE j: ^LaHf ?H˭ұ!Y4w`a?ϸ.~Gv5moΫ58V^-\6>ofd~Q&2}&f%mѸU9&DM]Zp ϱ&2ڷʡ6›R#;13fz\ !|<^U:_i<ǍC=R,PSr\K,Vi %QN"8/7EŔ{9{o|>} xz[ˑg`҃Rze{w!9H+q@;.eFK%|ٮCRAROGK gd4hwNDl4棗۴} S\&̥UU'{͒EB᧏1։] hQP"늬)w tH>|0^bm_UСэ \*K WtvRRgx'%g撁ҏҸjȝJ {CcQvt3Y+g(]]4RF?& m-CUKH]L]#z&7X^MdݘrzT䢲X!EXbb -I9<rR=-RTblPdĦgLL17s=uD8#icKqlE@Inxpx`ѦY 2}&v53W{PŶ*D's=V2q "tR`-כ{ ZdyP{A?'~u8tfUcyv l>3TS6x9Soher-눥]XauԪd<N{y` KwUo1`-}#PWxC.F>[1S YK& LZg㒤RZx?:wtI@a !)kFkJ%VSv.ט/ѥTU]ܠ4~=/<iQbFaA#wt_m v~毈x=/IUyUd@@Yg?3P˴#MUN5nO-cto^R S\z%}>/d`KNf;jךY{]B TD)vRUu,)9l_r!H|x K-OŜk.t&&an@7K19Eiマ<ٌ]P@YfWǧ,\"ɀ2ZOCRv py7ɹmH(s2]M<ܛ6i-IcsUB.Hu%Kq7%x3e4B}'+RaHFF)bK6&pgyK6G믤 zO9d ,y(=|uD`W?M`/#8F(p)[(YcJE,ƥ.1o 3+i&@[>N&--Pbh t5e_OW.xse!E \5n@*Js9O|]>o:Z  {[y/s/%@_c7b=5m({Q0Qu:rZ€y@ATn3íEߋ4E ;GmnBf,Ԫ43*Ewꫩ&V/qvEX9i<-1\&7xZE5bh& Ojl8_CJOd~đGExՍ@#Yպ1'ɃDx4/[FJsBCXْN΢NRҁ|/r4*zW?\3B2uΑimkJ} )_ېi@ 2UbJޟg$VqWZY^h wRڙT܊I G9ĥLed~IF,4=kmp"yxkZM \$6LvO)ךtܟZVGM; i)͹ {{C+Wu 6+ވJL#t'TrOk~MЖZX硫uf𰄣AacDl;Ljf{GSw4%D&1B$X05TÖrkQKE  Kh[9( ;Kn5'hf\ƽ eZ$-P}e*?=B0,OqA_:XcC”ÂMUO.=&'dR29>ź^[}:}絝HTh͛R) l2$΂J $rַz]6JU0 GyZ&HZY& P۱Aگyr8㕜d)Pyb#<':X( T܇͉X3x1E F,apmMz3iM<0%Tp|$ŁS5b?"  _VqƆ}bcUvjE,Hnk OLGp^F+}_*.+{u,)xȺ9nm8b?i[jng4LC[_Xh_#L@ Rq#ݔQHDE9GNl!W=IهRa)P FA0o,Gj#cNX$'@ /%g:񄬤':*>W+sӀڡ=G0fFNUs= E1Rl6ĚBG1,g;iz8NTeJBw,p}]lVp#. gm9:eәryΛzjaLz{ڙ P=j(j#J!ɨO E|Sf9Vl6|.ZHٜ =$7Hj1BI*Si‰){mtɃ5"KUnjpGy_cP=FΙzuSHȚr&3t'߹A}hE nPyRCd^pc <~n$%QoYઅ*^,!:Qc (:/FiڳUGBjSR 354';F'GfجT(sB uY~n eǂ4lH-_z3@0rt#nʡ>g);h0F]Vnwi|*0ٿ'ή8.؝k~)~LYΠ–NRǏ0 u_\Efy=4;T<ޯkȦ 3ZI"e@A3m%YY^g59{Չ0 σ3Tҹ<<{詍 BfCTG}/pôy\ jf}ţӄl |x͎R7]z^ X Cdo­D|f'BL}@Cpѫ(qMS)L;mӯ5R)Ѐ#Jt%%'MVt5*O^\ ֏IC5xi >W#"Aa&R6âX%ʐ>'hN'˜RrС?%nW,Ӌ$*bSfQHߵ]"qloCОGaG`ag1H(4z>xy#N>+ѝ3XF_lc\ū +4]MglqbL%;+=Y (ST V|V[WiK.峈Ԧ#m-,'Ჷ4>0L4T  :L;8 @*cߋu`Xn)=m̢˛] 5%lX^ 5-h1wgƟ xuqA^Jm&9TSߘak*!Vr⅓AdTM\:cjOBt,X:/z_OwkQ QWaϐȺِqoCQ uG% =%kݧ cL[*e]H 'mG.S!C^ɝDjG5*@TRC+9BMz'͟a3j Hm}iK( PJڽ%21hM+h׎jB^\;C\R 8WM (c~juhx%n"V12FN$Dr#"Yq1BPЦmw#`SP&:/4V?uLN&D Ƃ x{mh(%@U.)RL`dчK2초AA: #j:`k􏴴S-<g?sgYl3ہ Q\X(@laDQ!?&+̔9,Y[]^zwBvc?/?nqݯյDŽO;nS$ FCQD $p"U{ r Ķ= {#Lc,—e2gNT.b0A%EG&`[iN-S][_R԰[?tzw)!;:U/u}U0&gsl "'K¹!wt\o7YAώ[{:_`/jU׺UzͅRf&n.9z4./'3sw.}>LnpCpR%ki75vOɑpQ+"|O@3eߛ 41wbwZmX\NgQZ ְhF2m_F_nm;*"w_h(3@"5o|j0oĕDв %зגDdOƕyD4!~b쳂/pFBM&mGP`q^uqNcrKG8UW mQ dNnoa4V229ތ<$j,ןZ-cFɃb Ob\EHucԘf)b2Ã\%\jbgEh-DӒ; s+\4DsaQncЛT\j޵Iǘ#pariWh9ʡxU=6 _n6qtȷO> 2oNh9/ƙN9:"ϸo/A ʅjZr>PѐdA=WJg&\I4@ ZgվzTG<#&}p5!=s\yh^'S p{~ T!(9.L0ѡaPD3/4Ň[QP0_3;}>bP|hrnmJg./Ӻ}'9GAI|j4OϪ؅Lq lf63t Z V>JstJtLYuiD9J!nsDk(1oiwon T#CDKC9gdR!Xt ~BH-]z_' H&̡|$DF%@N\unGQ-t18|{ZB3>^2VmgXQwAt`@}rh'\]LB1-~֌o0h QRۘK[g*F>‚#%TؼH74!_=.Q_!_e&evYՕUǤq;/h<ǮکXA&ES$_v}沢Dxr~m\fLT"; Hz7Pξ;N.ʪ$Vas8+Za!P^c_J_z)y*  U)рXtG`QƲ絤)+f0ƌP[YPD,P7FZڿo!1t`x  F@)h"jb*ݓofo{i: Sw"̪{e!-8iwxH-zخ*,%6#λg \< DiCJm[TXMth3Lɯ E~mKI5zB5_N~a'_pRnbEhgК""+~!_:r RN~•`W }INwn奏- (~dIr8-HхdX~pUN͍o]86'K馞}xІ{8-Xa_d(`&iTHS_"z"!!>l|/lj2rg%qACϬ4mUIabqcF"(c^z~N5%%1)Pk߇˻XJh-sUR;EiApwݣKW5f7ODd/IohcaV n3XBr6f'ZhGtahE꒩1nޝ"!2>Z@'b,$MW+6Km v& MX*3qy#{<:A(+xNb9{!Ԭh/̢.?{ww@d:{OBDf}w.F,w'lǾ8PB1ޱW x^ӭJp<3`w%EⱭ n#qW\A&r' >-Pq&K*Ǿ-/7X 1ԓK61D:^ƺp 87%;ϒ 頣NnmBR>BY8]f e=|g7KcC˙ڠ42]~rԯն,ʡVkLj2/zUe$WyFuF]+=^t:W+,b/:X)`T<諏u7a8 n 8rnKKBdw6|ē[ g*He0v&R pF~:ϓ&e]##e\LnPm+`;34et.9SN@#7 's1*d1nI8m%{@*t?н(BfWO`Xl]H 9vPe+hZ&z:%I#IoS?-6 X)&׍5#1GؕiߍAI=5v7XZ?}Х~ P*]@V#&ѧjkݻ-Wdo=Ɋo݊nI?GBu`LAfcWw["a5ZXV\4qo鑂4pI.:w+L"lP^[cP)"ʘDǹ!lzzAbo qиPL}/C5STe`eEuy,"$3zRַZjTMw[^&ZLe,y{ܵ@LOSƜbvpjE6guu.W h`asz]AU>|mΤAOrAPك:I(ߒCrݳM1:IeJy}ųK# \k?~B D }S y#0" ʽ["ܔ]-81!Pkӥ.SVӕa vzXK;ZBA>ejLMQ_O :5doTd(*s901tI:F 8Z-hX[H)9Ud2ܖt""':"keXADO"=~a Wp0K@ɐ)=XML !'R!XJݕuAmib<|`..p`k3F-Y&EmPӖpOQ6m,3<5~OGh5]_ g B688H$f?CRFB)b/y)tBGF}ǁQǟ__aL y6LPBߠّH]!U7཭R;Ȗ#եz,*q|M)h@kҏ5"$CCmpƬF姵_ق)e4 3aFRnn^k&2J2)]gy&ڠl~!Jľ$VM!A" DXa9,a-sbr7L5!f A&+rd.=sB eVT"u$y匇1cIne2z; pʃHe>LY@׽mr_'I  "BQM$C۹AYB{p쎳b[_[Æ僙Py^2˝*9i-vkQ)0^ㄻJ< ˯}02~4c-j|Y$$i|)n1iqU@ 5 Ƀ8X?fzME04$T/YlHFyS+o*c*atzgC {K+Az Q,wIhkc/g:7{Uq,K/r2cTx6Wd3'n"S6ڮ2*g'ᡄIY*&xz{ !G?Wa8s9?88goWՎGw @*tO֜2a!ěp)fd(}HQ+r,_dVepӆscIթ^TnCiKv5tK8ZyQګ= }E+;X4UI;7(-VCk(@= 6nQ8Q}ck ӂCIqAFRntÉoɉY/Dk \t.>ePneȲ?0 C2){!@\gk\֛𖤙+Ly6ǜW.vy[N&g̘ܵ>6*:[7'X}7 ܽm&Ux~^f);.jC(^͏dXO읻f0)NJk#3D-ZTcCeI0g5K50{Oh(*5`]#4?'w4ǫC3ML1+{@h:w٣}|#شLbɬC&#xkL^LTOn̓YL+:D m#k8{< 챑ev2`?oZ|qkKwJbg?(4bؓ^nVX!0 >w- $kJN%;U^K&ns8ЂȆ敏f*w#K/ Yr?y=/ĸdXGh5){Ϡ &a/UѼ# xA^rvMʹЇ=C-+;RO_qetI$piM[äJE'T5¾j hUZudWK 2"j@|uONwu 巠$pF7|1Cގc_>mcWjC3jpe< Qj'+[k3ư,.iCi1;r{cم]lV1W1ދ0ZxO;g6 6N65<6eřb:@#v)\A2ase픰bRTy:S.{Zw$q(@ĻaDƞh̳Q^P\1ꀓ^)F|GW4`8"({m>򿈫q=[ifrI*wF6}Utn JΌ ~$Bnq0KH@nS2MsGP#=QNeb;7}C)>+@啻GzF+V;"e=7ĢI;NTwZiM.$ܢ "No)2LM?CCRy5`K(YcMe@e8y36>9p]6uq6i>2.M6jDPˤ{z~w TR!#.b咙/ >Fr;~$RΛ!;4-?~}YCW %qM:Af -n pI)9WC}T:;H+APfӭ`I3<1<@:3el&IY( w_S=<iyǔ9U6B.{ Q۶}kk\/۠5ܠhSkzl/Q[~YHD$fN9BɎWiBD[7W,q}a< u鰡.ydЎ3( ; db>a#(-0if?_w\.@L3VwZS5w}~93K&5IJ&ԧ(r W,6Y&ڝcPE;Ϭxᄽ(ȫtVRѷO >F 7I EiZl7sqbI?ۂ wx>j*_vՊ1g$@mE-!{+A@tRu%<繐]9/<DBM\?4NĀ0UNuv% 9 * ow1ۛW>L`鉆T_^֮F)ӍgBgQ r~o_?d$ٗ&=}>:x99R+s\c{[U-?>.6r Q#Q7,G04z4m XpliV3*M.#Zͣj-aE N:)i/1SE4ْg`$-MbC~͹(dGXiO̓S%}:Qby |l-oYZ%Pvv}$ILitT/7z KUv]-mSMe̴kS,vAV?gZ jq ;l78U7:%0Bc5ѥxz[MC# B]p>HOCڪ6Jêb`d/q@>e}iª!ۛ7Y!4|i{.*͌7߶7N*?JE .c+éE$C;m ǿC`;ujy~vP3DŽ871J".B.ƺm $!ʤW%&w'4HvK^x\M> 2Dwۍ90q cSϰ*55-&oZDI'*sDj™ #A$pT.>VsVU/N*N,,&Y֚ʦ3w)*7h_T&,Ëݹ }Tl&OA,\ѵѷ@{ Yf_ kG\hNű5=)_ؑ]t\]lkGRik>O/s+fz u$Tf<@a:I&s10=)2굅ڕTcZF*UjխD~ G+}'óI00 xToށF1tkDw9hu@jiKLQ #aĿh'k +$%b+vb=elLm4:M6P[FS-CƦQNǐ5I PMqe8oL}?\ +g:]T֡1GbWN|-ˁ&33?JW;r AXqᕰ cP-Њ-!53F3DxVhSGӃs08VBY4:%%ĬSury1p,a{.(u>prpAz>3'`h ./|PW 8}LbhL{8EJ A[ْ>yrG/!uDE"˙$no @j5NzN4[2Z6427 phM8~)Mĥt"4`IC[F0 l!mAz 3uf-yM 舁%c"۵]Uc$ũ5xe8Տv 7YKJYdMG̫"Šڃr@8 h獶 S$58)޾U/;߼8t >5Ctd |r4A@ 0EH=[>ǕF F7~ n>eREN|FF40]_ $ kg6p_vShMFrg8LI5%'w)$B뚒b^LӭCץyEʳTG}:P-'GbP*+|2zҶC؍C u73ol wyDγO-:Sub2nB &Adq^o_>N5O(./l Vh:[r|~9qc3'^Jrs:fī3p0~%IdjȤ͂D2hH*k9R)ؤ(M o0]!q@LX"v+HFaIA[)A8?RHmhnD0)'ײw[DI?% rt;'N+Pޙ#,lFQN\.uP~6quLcCs^$M$ߘKwθ)A-?>>v=)k+ytD?lPOm]Pt$%oHCivZ)M@4P9T1,\]Bɾ.y>bI O ǽHJ81:g2Pu.GxU *YX_UP:ҨH5-t,S=d_m vlziLҖz*WDx)ᶗ?YmbE+3;ek N+1OPBEQGϻ^W6@NzRnp"[WEDC8HZG{2^ t> bZhl;%#\ 5{~SSG敯oǟ!aMߑB)PJ}^z61IOSW-#|Q=j ] ? 3Y^n#c˚HkBX"x́:d)Z5Tg͓8fJ8Š/v!.vT } CIᅼulA1on!gG3RHBmY4NN.~9D~NWˋ7Vuz>t;kCpVFTh#(()1 L),ZWߡ0N̦̋A!޴}K{V \*|u`)kaK(Ffa Ov +n' XȑI&0 XMj#BMH _ {U8r1x$\@~" ( mr$e[ #ﱫ./Y2Ł5 B, ߭{i7Aho15^#;Fy^(Of!č7vTM=g84sEV]ן摟@I#&̷Ͱ쫗I.LDǿ8˵N?E=PLڪQKR(ʣJ{( Ƀ?H%T!EcgTW}pz ¤T Vfvq)&C[XzjcH8FdPX= J|pF,4gu \ *.(#|.a$D6Pj0s/FW%k#>-ABw:&BpF@`A$N/*=,逖Nxũq̾|ry HVuaB_ג^[d>ׅVGieR>W.rc /eF(&F_ѫ~OXF"ib!Y tṱč+ LEI۾jk6%n:Gk뭆7_<0P#T~"%4 St^*1~U;k{dsѠڿ^cٛcI};uYq.0ZU‘i)xVlZ)^Fe |B!5wh0C)XGܿf1<|h8.tg}@+)p3"or}dn.aϲTsw724=ը^% =(\Ӕ)9c&3y$b}96,xw l|*RDMVD_^[lɀؚ/&@ϲNhk6U?yB̬ }Ocd("UTi>( F)(]ɺ)>Z @k7mit2~<|GIhvCm =0w@ځs !\bm)󵤣[zx`=mX7ҟ K.dyɇ90XMsqذ~WFWO$D ]&)Z]'xT=%B- y )I-ұen_WKG \PRZmۺgxڻL5B߈`+N zq=`bjhݩP u4>!1+W YGǙf됗h$M( ݐ()H5A"*Ph!3KmfD٫K 4JA G9.G vd=߁Ͽ]2T.?d.L3 (es"uT R IWfc7Z%aMRҦе~䜁{Z!5ؔ&XӮ/3Ï(Ѫ5OdrWw!$신¸չn~=U, 5ZFUq-$vVr+apYR T>3Y4C!\{@ر(%7H0o)5U^#ʛYeǶSay?CA3'g2s!2 sfVW!1b7*gf1ǔVkےTYȽ !^Gw2W;vNqaH[l5XJt#5F|FDEq,-bL4&*Wu{x}GV %_T 8N7If †q7 rRpk<$h<*m1sL3j ot8c`Wib|豖E/ 3 %~ف͚ ~7Z1.qTk~:qJONHFh{R1D}vx`O"MMѳ7%\8Q>Nī̫L˸gC\xd)~N$ &mQ3$PqL1@ c{˰dŬ 8OQ6%Ͷ/5[ۨ9XLQ216ě8 젊 iz.f.*(9.+K)Bf߿=npG 䔴}ڽM|Ž@ K(s%'!qՋC~&*g $75Vq nP0LsSҲ9HD]ZJ6Nzw&y@=YbZLA7f¯~_w'L$O0P@ #M]̽r{8s(4҃Iq~ *MSch"wg9hp)X*T*j[ !ڵ*++MaZ1s[P*4q Y]`:}>xEXW4eD;HPlj#DpEmXfWw߇,q.R dž~W+#3syZl#;dQLWU_y2QBOrokUs:cJ~T 1`] ZFxdO=/,#!ݵ=񞼖7q.O d*tchu Iq hYlp{]~ӔJf'|6}gҚ73LsՉח_|cm?;@ ס_Iz K:"?7PFC*?mk0Oոegr$RQ/ݝƧlc\nC1jX ;p&9%/qZePyb' 2^<6ЄgW>}n{140 kk%}G{LN?Jj&8}ʽ>`^{/RYlqUC^!/K9eАio B3)np⥩V]{IUUP@Z# GVJyd,и)xFr嘞NmD̬ӓ/,s> d[g>:`|Y7;4{1 LP RsIJڝ `-f_GVT}+QϖItU79ia xފKWGƩ/DjvbgkqIv2J.Y1݀y?HNjQ@$F\E}, NL_pmJ_@5[t+T;[M6jZ6iAl̹8y`|iJJ`9!f '"!4峒c  5۫}KYc5Ly\(Ŧ4U' P6 }%_͝ `27(q+VpwYͶpC&a]z\"(mA˩Zcw%[ZƜR_tHN*bRaqpTvbik^bK;UCJ \g 9M==-IǘX/iϗ%R9 Pu7ir)#;F<. Ï:SݪK0Xl:fMaoz`7*51IadyΣ*nhSZ+nAkO:M\XYw8*'˝:q!2DTAnW @ߚ fu`&pHAmlvZi׆"}w"PI7@):>j /c կ $׶cp 0N/E@ XtFVMWb~.ZЕDP[4Dha~ScoOHeM(Kڼ"h B;2/n@$Oi;S J,}1I:|l2I<iDy5m% cit$>bY\լwޱ _4OL5%KNhT塥2;5Bdgϳ.ֲ׃awIUSF"Ylv#CVgh{gWUf;Faz赬 ogރ6Ly(wX~~džTgOp7YzzOc3V28c.\@{I6rj?OSc[ Tl-у1rSO eJHy݆O6cg |篪t&pODnޙomS>ok^%> L},[]VAgyfC^b2m"]KVzDfݕȵzǍ:4Y G?UR *W-q@-x6JgJ63}EF,e3MjTi=KU}1tZb&3rg^e߉ϵ*y1Uf[gTm^}bوо|c&AL^De aMBo~_*dfg_{54F>yYuB"<ǸB#Vs#X8.lEWm@SC:'%$n$ϖ+%9h\GC~#y7u\>}%ʯe˿ gzƢ*4{3mNWfKH6OJzo0*椠i^lG)bj>l *PbPk&trze~J?Ӈ[ ra;TWZ#KB3مqL >1XStp2YR '~xJmILt2| 强^,t*Pw3[7j:_ >c-^8Uk vW 6 s>Aa*)%j=íb!޲4hFj7 >vQX~L,ZP=Xf굸2T8d]E{f[ňόԤ*nG~0*0 *B ravp>!a7P7Q EpuVI _R2z1YrAfU)Gg3!gTIwߙluud~Ch /hc`0T5Lujl|^8ryg\;Tm;M'MF-rkZy%dI6PF 3TVA`G}ş) Dfzκ O=P8#=%(T ^[>Bt f]1Yhy][4D^l7LAOMgZyc n-[]."}bJJ@r1P=ږo߹>ݸuѕ4߾ՕuISNW>"CEHvbDN$>, Kck.1:}Mo?# Fþ(NZh:T^w'㥧nBPH-Li슥{фȂh"2ԩah-a>w_0؍W>E4eLϊ҇__Tp.L_B?hTi9yWQ {pܐh#kdxBB1y<B=YV)7@.' Q86*':~x:AMێʎ?neOP[}` /x6;V3袘+y?a):lFvqK6]g{Tz|ִlGNQ{t+V7P\9 G:*j7ڡv < :4Ɓ۴ϵ3i#vtu" UE0~VKo!ZVQ'gsQ-tX=w ;)eț^t4n;2.T(Kn{%$+YOIHEszWf|zhH/JlfFl=Mݖ2AhwaJ(u?khiUVa@ X[Hǻ peRTk"n:7Y& ;4 l( qF l_[U }`Z2(9e=M@EE)^ݹZ 1jy/s<? "b'A zv|2C:| D!n)h`PR}Uv5v*mbkcy>@tH6b7ڂ^l+Pi#&H2i zcjY0}YY_(D_?~r "FxMFAz_yKS?63xoFN#P.cF/!~Q`3:I7Rx\d7Ky>lه47gᆇV"(tGk wHs؊ \t|Ӵax'/iiJAc%z8TLo|?&h7Pf,#veg5_Cfrr\K$ll{?F5~{e}Ln( RNs1܇*|fWKjZ0s灶ce/pQ**^KWWBl7:(nqf``YHg˘sȪ/]Ό^_iݨxW)O؞eHIֈy@kh[ ?#+oktebI +li]{K8UdjGYvfKqoj 9m*x,e,Å%18ON+? uQO(_C: jR[J|J0_c~5KI/xԣa::-lWfA}0+6n ._$ANftɪm' $UThџufnc#aKҼ_zqczj r*zPtofd+ 挪ϙ ;ej-FvOyܟ4.HF&ˢU˿fBՇ"'g &پMx %3ś[ɜ'"HwzT,~f";*h> 7IfC:s6ZXjGmqө*[WJdGwst'M0wK?(ѭ6 SgSŸ  fȬu3`Sk6K/򱇵R/$TlOk_Ff[[p7:l[h?e V4r-W-93[1\ɮF(эx`Y`ĕ=+k;Iϋw[J[%n @a}n\ܤL AUn^NOAD\k[,ٓ?&Ǣ#n>,>lrgt%~y5njFj3T޷!or=4% ./>wp؍VKKN]@LKNa6([,=-ZBD42k1"^=T2Ug7N0J.E!/nm^$jg b}E_gutsˊӕ D4Vlv#wrv՞SR0%D87R"Aڔ@iTNBf뮿(ݘPq-S ]g,Xa}wa6hcac`le8b`U@j{c~ UF H#=9ih {,jbKK_ȗ^7djcDK5 i^l42>8x]D;3aXh-XtpkCB\bЀ@Jb(}ǐ f}e:u( =Φ' fMRd;ud ~h]֗{tc|d]qv/f4zwxwv˟cWz(=L:daܺWFcKZ3~r~\'! 맷^<.5ҬFQܓ J=11UiGf2o Ժ=x7Qޜ!Puz6-;z5E{pζ-f9J|]@zvr_If%UR0}$$p 9*igPLQͽ3]ΧdRy+DTSh`.i\lukP>K6i}͏uKGP=PSxo|دEXi9o]mFSiӰn+4a)i.Š7# _B}=Л>Vgo`ʳŇw`Ut9-\0pҐ&"[ٰ7:ܣեWlOc pj`5~tu ((a&S:8%$At$slwRu6n.#/k"L)H2Vean ElV\dW^+ԡ;E[Y lZ^OaĊå$[=fͧ E" {o5Z󒋲xU\֥}௛;n,Ǎ8A"u|} V1a('FP|(60kM.ñqN<+o=2k_wѿ|ǝޘ@A< BٷSa6xzD^uիl Ԟ֯+-+<VـMŬYu 8ùlǏM_G(ׅ (JXMf4ݪ .>s{ZU NH7"%#oNWy '5#HF|sMz~p6LsEk0²)Pn$ KY4Rؿw.ټ\Ÿe=3+ Du\i&hR1LS l  j!p ..EGAl着 bk8!/dM7!4S3k {?ZQ PfDԌ!~=#U&]pryW"(pn a$~i]Eue6LG$Ńܮ_%xmPN{bF'S17 |" Vg-Ȱz40T4,tkeL1 6Z0c+9{l\vn(n&'M}AJպ8HʃkOkA,IFOӺB[@@p C p!/r:7`t XQP9; *!:P" f$A=l* ǝ*m|ֆ. S6o&}~R[:\ot 2rBU? 1`I 0NX!U&3 VvDpťgmdvh7wnJpG+ۊOLDwy,ɕ8D𐯘{*i`:GF֘xxYڄQΈ@GOU8ޡRKy꼼j$s9.nH_f AUpSI AZtO!u(J&c+fת"爡 k.E2 V*qJ)4r^Dj*T>A-E+guݕ/9RQx&%H8*+l};.<8gq!k ĶR.0ϦZ]Ysא51{6#5Ep'w}Ohsqoʲǟz"}/l6C< %jJ4y`zuI*2ת q"iHoUs *Xfzx@WgCah)HFj[`H=HNC"_6g?C2ˎŀ(HJXLdU~Nlxwf~{Ţ"Yz7M.+Kf䞑%6jmnNnZkrT86H:IL6`?Yt^j)ˀC9|2* ba&WGtQJpvh#ĭDLx{]<#>F-PTJ+TN }D5M$";,=3=իF*7˯ 7FJ`j.U:țAjf5Yh^8(Թ^+C>aL +=.%xW4.=UG4̣nA'/˨;čm|k[}QX~=1Х 1.BjO{@r<(Gq!//ۈDdvqF/jXUd6$^F91 c'7#?0*7jX6[tZ'm63~K ۹A& ~ee*X:VIG7H<.L [ahQme#yq.](8+pDc$%h!Ε ?2xIgd2FO_\{m; /jto+R0Pt=]1tخ5(c ȢʼnkJK2RZ`03_#us+|<ƊzoŇޓ/},O D  i/ϭ=Y뿢ӳXڀ)r6fН,/P_0%X[d#Maj#'JLR? s,}\,99dF^oz_`,/K004!mpl{MVu>7G$qථ0Ƿ}0 v2*A2aiA}\&Vh%pϢ r\LssX)K{Q)M>kcdh+e{'6m/]#Lڝ6Ͽ RܱEZxt߭JA!zQ`f9Λ8+nszOƐaMC භif@>m*29doBRwx'yӼWo7%#luDOI*V P@:ܖcsdkoo-0 mxACknA Ί#$YH'O}$?hr9,Mtq)T ,d}XFsc\F2vD&&dn7]1%f$'vļJ;j7? -qO_ xd*Lzx{PF":z;?|swn0Ťl8#mofG*x}2{@3ҭ~&gF?[\& (+5nd e|=,.!c>Ni䶻qBҟA+ UQP6 lVw }0)l[/( POWucߖIzL%%8Cf@Չ|ONؐ!~eV}Jԟ>ҬDcݪHW:[5߿An8Î8gj}64"ob``q16VevF9q(#6yrrR0\f ̈́l#MQ} Qric KGSTY6B[` Kr*N D)O^J20f`u^SP"CmiW71x(G~R0;),x8l-72iqKF; D@ݻUӔ$V!,8'>bDk)lI @\Uz9(#d9렋9ox{NB "> PG5[caF=4Aߤr)p=<ޛ?Tun B8Fhn"2AcWC?j%-MnSG¬'6.{3G,t&$<,u3!QR]+#AAT#`ȫQ%s#F+3[u#!&4WUbjOu T.)EڐXj8#*Nkr*3r\lIWr^p ҩe1|`4޹G9Dy{ܔm52X" Fޢ)$5fP]=P8"U0nAѮ /tTHڕOiqPP l-6z)(&~^/Ⴕ2`ۙ!£9.㣤GCJ2L[UχX ׁξx?I#@x,VNX 21j[CnC=9ҭµB{ n@`Qo%7Tđ afOOR94jy˗@(0$ut9\mB9]93[de:\֚^(>ђ]G?~tX"J/E`[OUhQ2AE|w7,'GM"{Xo8*nD&S T8$g;U(id!Rw'N)HFG2몞G$ƒY?7{΍$Kl_?l}~RXکIRkXv_j7Z*s]ƌ/=)J50HƶK+=Ԝs+#)K583_1KkSi󨁄TW{= v {r `~wM9Ji|hґ%H:lT B̷SA1Nʖ7 VgG$֣K|ofωr-Pu!Ű6MFϞ[=ds-,\~Rs'Nf\~`!~<'WsQI FWr E\K:E=Qm om Gdh@Q+|/&˴I1B9˰PZNL.DoEg<{tP䟛f /7Xm&6X2 lQ~ڎp)Zi Ʉ.c t$Xrzb\5x0ڄiq!%@Q ~ }ڙ~ KӴ_%S{[y?ohO5:x5t0s&&YwaP_0%8%yOb3ֆqz Z[ս\jiI_>6r/AydGNųC.\g:ȉƶ$EV "$rJ6%Cؿ'I(}3s伉%7?(xGvMָ` *`"&H4GL#hhGC g -(]VڰŅB=2 b$.=9!}b-܇HX"Gk ^i&h1' ky04L&y Ei2(zNj2KɈvP^ Ӆcxj-C?$ɣ6xU0‚ws=o` &&Wͻ P.s̩g<^kӅa$@L/6+}«0\4KQ6BYV+wR|`f-Z1߲f^`;nyM~W0<` V$Б3W^Ű"aO>ͭۥK" sQ"\K罧頁8ѣ: YxQN'}?GKZZ'ֵ[k?"dɅ" ^s0w_hx//~uHҠ"ECV!Ǘ45`r=d]Tdm]΍ kq7FJf"՗!GVoqq^1ٗRf K g'~MmrK^ijg­ D=@8[6)b*OrF.٠MՓp@c^{z M,-kZʿ7͹NףnB6M)f'T}>ᚿ="} 뤋Xv#_:&}1R~7@JsQ~a5͔?oa 9VwMt`$~g #¥]~Q/qәacH<+LY?nZPވ,=RgBeGL]׬HhCl* N?EȐ$E29G}k"UBpMXE A;1L±D"݈WRÎD^7]} ¿ma \TNHiIs^a Gp,~t<#ՔbNN)i8@|/=l)OtM|X~!?%}!϶?|z \Zn;6NUEED{@hɭ1l^W L$ _q=~$Hw+~6CPJ`yR1/W!É/zWT&*:Z-|oJk ltrw䇾,V-\MvImE]ҥ:CQ$ xoRt(z`q $x:uIJvb_ځhKrmO۲ȀHH,^$hJGaz蟀V\pUth"54g2v0iҴtjhe/kwq)*H98g .%le*=UP2{<6?Kje)옫8 b3 D5WFl8frO0Cghy-r7G*T.TN䗪"!섇%_8O2KgH#ջ*7|$9=KـYp`>j^)-Sܼ'li)-yRhd=Nc/8*k2AXŒ>s(uJpUjdtEwxQ;܎쵸n <hg "6== Ӥ-}WBA)PM#y]R4󏙶WL? 2#Dfj ֲu!{mi @D@lgb+}W0]PƈSNpuP˾G5Feܘ~d3Qau;*6FOxh7Qҳ$%s^Vc7k`ιln0sHoe~y}x]1 fX] ~,z"CtO) Encٿ n`s N (V-/O23KVrݿ re fk̖=NxnT>γhjosC\ò ,5yxݦfރӨj{2Mn 7O [NwR ikU ݹ|,Tl#چuAMcDVHsŷ4+:|xR4'&4nN(NG񦪪8.~T_8Vp FցQ|wD΋R.:x"GQtcc9秒:] XaDC$W~C(w7jv-JֹC,SXSmIgS5zW`s^' #vt|pp$6:H lҍ4ﵛ$th0_q6:#YO( Bd*/71Ag p z˒91e|4Mrjxtlz_b8>wiAe}!L"nuOH )M.&\#Ҝ..x}(H)G{6QpT #ݭ^I8wê$،a8d//e)2@002oQ٦zdAɷaJ>BGXu&Uht0W&Yi˧I둟Y,ta z:1@i q+t3q2G"1zQIn֔3 U*eͪtj& l|8~wC֌42T ЃQ]>s(J9][K]!F1I>SӄCS󨯡##")9A>E;_~H JB┈E\?7YuƄ+wjb5W[JN }DTn4',6RWf-D"˘Spގ^ik52쳳sx-ܥoރدG%}:Jͳ\e_5b%,̑wtOܠ`U.8+h$9ť2"ΉzKk!o⥈xL$%VsJ{Mn:[myK#@8}cm1P,Xҭnscp\Ac918 Zrp9p53G7$vfE2IaL`t++%' #TQ,,r?7h;\d6bQn_>SJ[`yKv#g W$1&Cp" +Goffýgv8ty5֜W9)7ҽtDOĺN6kzcY!4aYyKɇn諲j8h2pG`+q+ҳFs;^m}fk;8z>3)qhLDd.0(sMf{t S s;*i䛣(>Uû.}*Yvj. q #YWb*n,]j$sW>z5PQOsi Ì'l~}O%^ux>Ëmo`U8rtO1m|; ^G*9 L}"0=px6^ X#~tnrc|DjiN77X`kcv #Yl3jQ+ ņ&n=7Twye+k :a`ӿP^A!! /vWGY} ʵUd rL-K yAg-\zTiLpEQ(mlP܉־8l S'|6 u8tgḼ Jtl$tК꫑R#k'@w3QWt99`p#k 1)Mz( $QbHt.a\7;W/O:OL;zU |JSQ 4_@Iy(<ӕߡGݗS!}D^h L"Y @g*'B⪪fMti;-kc$koW4zž4n> h x;S*TM$.BpG{K oH27c[$ ]1д(0ņ4t?up5tb0e[tVRjX[|Ye[jQFϚ"W;\- fG_w"#L 9\I?f">@!kU쌁73v:}\e0t@>f{Ŀ> n.+!{ 2'Mo5$^ X׼m Ꚅ{[. EX-6ѧas"@:@Gp?iw8IO=Iz2fuH&SRF׎ƈs3Ӭ T+&_S}Xp4#C91vGřJkD$}q3ro1'3֪YٴS^nq%^4pO+Fv u)]j.#kFDʹkGyqT_b&r2AM﵈Ab>if3DVE̫['Ly=fӺ<_K5"SYصb~,kj&(pJ7Hlr*l*N=Idu,b;3Pe;*}?8 J}v2˜JQE+C9:l:Ï(_d*gv-Q-Wp#z=d8/'[G'y-r*`0:=n@;3=kqlˑ1s*So) ɭ7ū?D*Rܫb蠚_b|Bm.DrF^%2A־, z_xu8DzӠZ{ wAkip}ϟf{CXP) 2q9?LͣdfZ?a1VecяdU;U 1)k \K;m<> +'N%z'VQ=Fw#B yvb^EyvCF<27+ɥ-%魌e/ah32&4(dU裛FΦ^Q|\ /ډ(cܑ :NBc9 +}dFQQUS|Fw71Gqp@t- 4|Di+y 2?Lڊx_tip+/\wu^nz!ja4f4^["+)~ C,O1M*ۧb/*,mp+Gpv/&up'G|EӡS7v)9t !D*"?Zο:ݞ{'%Ri+u\YVNU9PŖ-%X?ae[ daW'JNڵ| h.Bs<WW!'FHO_v`[Uo)x1 U)yX'5-'MO8LÇdDޤ_.i@O.uOAH~{)WƆсt#/8Jiְٍ:v3΅?v-7}@'uQlUf8kjLao=` l}Y k4&YۙhމaKHm ҅14l]J@k(P'q3S`Lztr0ZhTXxp^"|SY8fj8+".az O+EB;D@~ѫE@;@!a]/rLI / /5=R?J*X 5 ҦxRϮx?~H_S  ޑ2įhLuy!6"3eIX*ftIG) -~[ݖ .7K,Xmܪ2 ٺmDc=>d۾:4fy'9 90lCWqxJJ"ev=AJUgئ'xNn=ႼAω{z8L4vhQ81hHpZil.,Z)?*S\qm4HSmOr!/5 *uPVO^b$5ɵnwtFjeX;;V&Y&qVQLAԱnANNnK:&:J(HabW7-i!1>j |Ƣq^aИ]DpQΒaWr0_>w}p,Dk"m,LZ:$/vI";'tSvr CBUTsv͒Ҵ'?vI nLmٓM~ `:Շؚ'o0O:IN@>LkUJEGs*«r))Sz|1-ƶj d@pdZhPföw] o33ŎNĐ{Kn*nM.1)i!{d<2h$ G_%C0{EP;0i$+ l"eBYZIت=T\[=ީr%ruCߟ.=TEQĩj4[C-?,̝Fϙ ׋++8z$@$~i,d<>[jPd9{N68Y@&Y'.t1z<6ؕ̐ϽM ޚOR< ; t*Y|0wF#w>ͰO|#V<8Pì&b߬ݝ:N3rs#/%" \w(Qoa) [R԰i4Q*ذb ݗC@=hR,f~P*R"jdENM-𴹽K_>E/LoTFY_^-?.iPdY jZwW(@N,B y~cW\mBeb fP83*B[ 0uj![9r(`{$?f NӰs`u܉ͥ__\iX_Bt=Go_ѮIFp w,򩐃:;瑺##ir!u&Tw 䃷(;efRFzUa} 7^bB^Հ!!BқOlet}IB.qX5'aMWe>qA"!15<Ґ۩Տ|rx$!#Yr:>e lO`7XR|)Ss:bIF< wtFbRRvM@VС(U+a-ت/}6b~VCLUM͕bb5m MR/w|xeԒ.=HBxcGC>qlYS"٨z('N?)wX&LRpZ2Ж\2LOю|ܶ c%(F[*qџyқ"PI4 Ċߛ.΋U#}=0P%s^> XV2D`MgMŝȧ}E7iLpIW)Qa7Hnfkj}"l9MmeRiH q}F@!dA怌Fh.y[I_`òHF1vFGK}5y cnh B:tsk][iuݿP5B9k7g -J{bCߙ}msq $hH, -d%;i>;) }۠Y4b[X)y[R?=u< %kG-mEwS.pNm'Mj.9ӈjqm#5%Il?%sDfBy9c|+w{_tE0:yMCh0=H_(llq2q?v7=+jzV=>ell=jQV- 7>%WT~C?P[k d0Yyz[/%8/$ n!'.t^T=烞kڎ `NSzPE)"𱔵o.6Ȕ]-2>ɡHv2$T0^->ghGaah#(R_XuNJ\!Rgѷ&Z'Pb)eCwx" Xn~Jɝxy8heuxZ@q>I\):\.hꑉ8zVA_&%`nr:__ R4kYrp8 f2c&P ȩK|&hHnTAxV2gaH!EĦIc~BBL"jNW՝x[fB*cg_P^i*7B%p_sÛzc#5 Q{.F͙v!I%}e% "GW6ˋd:}~Xc1Μ\5KY)j|@&rgB99>#`PN9B6F˜)});˿l0SՉ来DC"rᰯ£JS8S:1L=@`5m3gn0c΄E٪>-ڵTV4i `|5&5'm~EtTEod Oп iWW|kpjѯ9Tr܀}񼋦Co) vU?= cc+{0ay؇,/k!Dh_V$ltbtpē񑻆vYЋ'sOZq# ?4e$fDh؏ȶJ$&X8b*n5]e/op BFa$Pt4 htSN \^ !hZHH?:ׇt'_or1(X?acj+1BusKk?gο,fLɔ丄 {VIR;gmA }\ j[QQ/{{EuN7-I`Zw{Y׈  c 3f 1HB`y7ךu̬6ᶨ@,$Bp}`09XF4n[0Z[EsJK$;ND0VUE׳3oY5 ҵ<\=̌.,2Fcf$]vsfT:MQcЗZ5Y̧?jK>2EĨEmLKhW ‰tHe^S 3^³J>}Wu85`[ަ(EAXKNӥpo&P[nV0dU03M\3n,S3iP<ܘ;ѤT5薠bɦoC(x/Кʒs=mB̷S!M{[ WA1')|3毚 `npB`S[nhtV3:`ٴ[O &@}#]8ά 8Jo:e2|3@t!<6YQ[ hA:0w!?KK»3K=6"WMM-}fBKP<YL; aAN6*)t=@zOxH對,t:wfz`GFVrZ,C c? VĂC{@ŧP 7<8jE-{T7 3R2@Ї9IvgnNo/f`Jv!臿},1XP;cS?ZUD&a&v2ݭ61$%vM^uXϜhy8E; onJbísO2ojD°TD }[γЃeDŤܼ:Dড়i] Ew>4~eOJ<3I#TK&+.-Vܒ͠}˙(%?L鎁YAr'_<4= vgyr>T |WuoОn=$Ċ~?OR0J* !%nomUϫ,\taZ@<6g-J;$? nxH .W=d!n|=ՂqTNGNcJOCuvHAݳҒ`(Ae/m$dEks4R kNbg8\o2Z/Uʀbk݈f]pJ_3 }i?(m5 @!͢8ݎո@Sly ̱O'ь,2oչf@d {G|\Ň%gWx9qY+:(⤗OE 0 &})8e~{!JX\WzBJY6&W'SAQl# fLRnkD22р b #lW-K&t{[qM;v3[=;,~m ǿpل,e(#9ipPc{(3R Bs3^[RtAF NhV3rٸpW2( ۵HUu ^ϔ18G"q %` բ)E$p6[OZktZl9N~fJx+auNa(*w*J='."4j* 3=5K!dxZu %Q젧SԊ 6&&fFw#8ka {$2r^m!&TeT0kyWmYMĻM&Ϥ#τ#ķz;+cB}n)q$Ϧg9=ym`F̊L4?/E?J_` ۡjMΦ\\nVER e~![+M@*X)cqbkQdIwX޳{CLo%⦉ڟ3ϊL2icA57K*o `ҥr_ǬӘirWvme7bXם>~a9Z- "[#v @%'{/ (߱nKPr0RxS̬Ars9aoI4c.ny\"Y=O+<3e-ѷ@#/.?[fsX_oXf_1Xw"x7s{ C(3;-Ŕ0,B{~ vSשF^ M%r, EtQ},>s../h,s嵕@7U6lrKxׯfy"PtYa%g-m`\~qc4ɶ0Y9oTBE&f%jYlf>֎oL_H42٦gYG>ʃi.Շ6n,~' T)I۪r>f/cq,J9A;.oה R<lQÄE-q*{-i.uC()vuvS豋jp .F)o%mnAnK :?;DS@ԫf9HGB\+]%MX(FG!KNB\%&1ģO2k>dYEiȺi"z8fLf8qJI\g+q1Xv#2|I]v\is ^gEfo$;LCHzIi72aeG=&uZF~ʭ'$J!P=MEb7K{')h`6#2Xo\t}WC?1oM527VIƊ*kѶCS9 V=+*ҝjbW,L_'cGoflCS׽S/R v1tk?9/'$pʳYn37[vDaFb´nBkqQ5Pgx5bmii&a?<6[ ({Lk 4Hu(r,@3Px"΄G T< Ai떬HǮd5wq j{ɇ3P`F}`;MP4C`y4u5Ӝ_$}#{e.sK½c VbGD%c P~!.{ Di(|en;WͻId,lY؇ WPvv IBHEBDBдQpCy`BuJ2 Ozt@KAT DE֎nU>CO:Z'4UVl̘u^UN{tď%w")( E{{vɊ]sD >Y:QR-VΘjq8;& e QA&Ճoq֕i{Q`~8>oUxpQ >p=)Țc0[2LDOW9Ip^I N3?=S,7ؘ{4e %+o'Ιg"r}fۊdxٺ.Rnvv\CO4vj1^VTD;Gc+T{TJ|x+k.x]GxoNIƳNs$). We_m:7+B}7/S;gVbmRenpbzyӾw 0Uƃ qv J־zbE(;:ZsHLKˬsw3$Ĩ޹Tj kh=HЭ`ӹ㿦7}n`ZhR)/J@( ׂTQd+#r [W 9{$XaNU^䚶P8=/w> Db.XRH>OJ|jb3&5TӆJR"!!^n2z3DbZnC=JQDnSP=(xs3s^W82Oa3-#Ds;nS]U(9{{ɖ#Fl3O 2\9 4[l8Kf3<M/*Uw3kpN!]54/6K1T!܂> t8*e쯖ӹԃt0 Ռ0~g>J-ܢ]٫6C9޷hÜXk(h=$  t?U߆ϱuߵAw$iG&$ +/kԾ ]shkgBlzdiʈSz$?{inߗL_DizƦ$Vdʨ=R e4:-le=\;T3,F}OcuXXi%@`EhnRʳEtS9zBN`Ӊ}|sX }#Mo"@jnM?c\{7b#h\p+%\klP:DWbXsO&b*S5>>|~_̆l~%LT0c; ;7V!(ق_cEo0ٝȴ,Vsi5BD c )G_o&p?"Л >@r^VqLp\3Q\LL(3 BlЌS!gay%kfKf S"){I x/1'e=i~\AjaU)/zM <*j@Qfl3hZ*0_dPkDuqȷ/oj6c/^zGW K&cva& h3gСI,i $Gh m|ޖIܚM .R?Vuu5L3."@I sɪ 9VcéSv\CYddp T(U= u Hq ӺK/5ըn^nPo9^€NeB~Ů'tub>KKf ; ?h[*;! m B"(as8S_{)٢fዩJū88M:Wgލ5P m):b|b?|`1!UA3a PQհA֤?Ҩo9W3zʈ``S2hB )wm!.|8-edŅr1$Sa|.|/)F\VQ ~wf]"4Gy+ +)q Y:Ơt;|\y¼/ʊ+# X. j ߾ d%r7OwZ05ܐ03nL5UO5+tFY>帵.3o˔jLtZT\}ܠcR\/9|?Q*yA@>˂3}%;+;2(=SQf )%c +LY,!;'3GCܠaA%1eSg]ɦ[A7ʞxsfڶ,N;~q{Ij(D[ChYkѕvbk盇0J!q[F1Pdx+e帕d^߬eL-"kP{n|9ƉduM4,VQMPdIW+Ix5[.DWYRIYr]Eޫ1+:}R2/yB7N߸Q|L+.k&kh18U2$ /%Jq7 n{:åYY&!u%RE!lZ1mbmnZ&" <:'egʋx~@^*X W~ +*PN/] aa"dіO8Lvj@|RbqtW^r5Yȿ՟[9sH dM~&ށJK 槒8GњN 8-(_[s$ޟSB?,E͹@#b~N)~fhPx lnxjpmvtIL-9tg7}j%OE|USxDlʣsT a}R1LjW2y( I-DRÈNiYӨ$"fqCハ;f6={  ֭ɊbI:/>}54#rܸG,_&\M 1Gd*dO"ϼxo>y$4 \H&EG= M1yZ^'5%x YU J^AmfRζUohEH?yod8EAXM|M\µ*i]Bfz=mzv(C6(O=,zR*̫4FVS nl rDE\08ܲ{JB[Y>k*E Zy` 3V+dF&*QbҖeN 4L:иqÈAWz|Қ[Sv8`Gl~\ m ItPҮ;6#Ԡr)l^}n3KC6!wq}'Mܛ8o"ȲB1iuBٔ o<ނe:E#Bosaæәkq`qP73+D:1MÕzţG|MxP༮dG8' ▖ib:LǒyaOnpCJ .sZX_Dk̆~pޜG᯹súʛo <ͪ+,nѼ6 j[*ˌ9n0e3mZig#12V 9Yĺ֘IΘ͸lcdw&R ТhX"g 0\]z"ϾNF*,"K]P jO@g Q9 L(tįX[nt?$|5'bQ~7:kԀab# {EƠ 2r!9~UWMZDwAShW]ɡ} i-.EKO1XMMb8v?/Tү9yWDg)X(I&#䍡1Ey<ڣIԠRGaè]{eP Q~ yD)_R5/@3(з8JGaCWe'?=F=&vi@t/Pr<8 Ei} $|Ց 64^3h 7U,)ƞ .ZO_1Сqc1 1EXzkaZjq ^}+a`vXRS24*q(X@oj:̣<],^]Uq.`~@ ]31ўgVYM]*84.rU LsAƅ(Qԅ6+9zw+kZ2?1$"r~0 ӊ.}W[074Y!Xq>}wBk 2 8ۡ<ե06U675-lmk;Qp7tC$ :D`oA4ʕvwc?/|p3>?/CW_Y#7T 4zf`^=3ui_rK;T7E)]PSXEg?h#Vfϻj D {.Ow1H^O _FbPTy͚-z>yAQ,;'^C j8g !z3zQ\*$|0cx8f!*r-q[IJF[+Q7.\]C1Yra4@R`"DGE(\jx4|cw2Q/pSݐc廥0މ~/lvyK} ;XjṢECyxFԦ/#E5 sF0Z|v4 ] \>NӁθ}gce{aGOrS{򟎊>qJ% :|Y{#Y:J8 䧇r_ $ *+h0$HO%jXў"wwy%7su =fKӢ@HBBgm5]dr㿊u_0@2j#i!cW*zȈӎ삼%oBrVIFbA7'/V/c" dQLA5{Ț&_}xK~+pz!]7^^/'m9fp6S"1oCĴ -`N"L z`D[1sodf.Џ)a)GI/Dt1`䏔˓Jݢ0g`58YG~_'9d+#=!|(gJ'*9k}n,Y{~WKHgH],#$`9ukiNsI1ƐBTBY-Iiﭞ?'2aJ}C-LH\{)5-)խ X'(u v0[x@iLStfQT~n8`7kI~-eBgކ|Hକܢ6S}w]ӝF+@tǝ8;QMdN p>؈EHsr_+PScÄȫv`KO3b;ĹF QTpzHVI5c 5C_> }#4_&'RˡY^R^)fG"#d% *JIl棳QC'@xy4HS1ȣδt)IqwezjUij)֘_XP۾[/*E r4[1XuKQpQۤLzquY L#-TnPN6tEQ.Q&,Z  d'h 8Ҕ޵Vax4E_ (ݟF$\a.ijTg;%@3|0lڞ!qX T~+c=/?+`zb2`V@Iרka>x*0MȖNf !yp-1e $?g9 VrpQa+[mU9\[ r{( G oMoX1 }k!;3(YW{ӣ+_R=t!"~: $` }p85FZ$~|XDmg_^>M=`r cFQnU &HdZh\ŔMm%ˊ1InxhZ`|AQ'A4qHߜ@w~1z,>O=$S8^~ȃ*/\X¨\wXE9U%ոBa< m 1sƞ֊"#}gW&`63—] o@i:Iq 7tGxe)Y ^FRjH<И3KҩݟcƮ4J۬I& UAԠ].,r$Ӄ ˥ &xqCxZ%#_^z;ja]%miЌB "= $6Lz5$fhJnWBΞiJ mNߝuGmb |$efac:MMa<#8WJU I!Qg@`4+A3'9l}#ϬYDuPorYo_^%L|s|vQPMZY f)෯HB#)p]~ EdEu6ỈPF ]ftM!{ڇQjFcQ!/D2 Kxwϵda[((.uJ<"/ydQ(g2k$m܎E3V. 4ݧQZy-ܒ(V]A:1vJ + ?@~r_`jgQozV˅{}wm#>Cv!{DBA•Iu¯ @*8)kOJKj"TuK2p Xj77{K2_ӊ92.0~_~uGq#M Z켰'G8wۼdU{5iEZxJ5;܇|cO ~*\: w]PqI5T:օ8|CMT͢b-Qmos> Fy4^CrcBb}"wnՋ~NFO*%I]rt )&;qK¹KC )9 9D#[?tT]cnXО}Gf;7БVʵV~0Gj"djުtw$ݝa/ealןri"5|d uV)C<.KK/m:E"[\@oRm:cmRzo%0A51U1&M[( [oIȞxH:{JP&6cKLq#jgDhrIs\} ,Q:jbzpGb$%X!sTȿf\GA_($zR%'bF"tx;ZA r1ͳb:Fd} T_zBADҭw3֭3oTm6&Թ8dBR³o/zKbil0گ<ݘ7RHjz V<.!S+wNL{\?Ȯ~+7@0F+_%.0`}uUDҰ.yI⊩8 3q> {;IudUnzӵ(e7c{ANI?X1]w7 %*uVv5KK}4oE!BcixJPmrv_Am$Vz,]!g ^BbnIg3d8hҘz`OJxK&kj9ыq /?q^?cQl7snClO+&[t9.ߥHl@5&:NԔ)+2E'XC*٦Lbfqf&}U3ᰟ Q6:|;m+3;UGÍvO~6}Wyi(l{IZWcitdC,Bo uڠ<$io9ty14R9&`oS]hN=)Rd |iMwA$.!lI-"x1`40JQ@+21BŎ|;tZ$^V!r,WBRge~( '|"Xw&pb8~ \Yԡy_R}0A( ͼ7V\`A)r_l-] E0gԌ^"8yZ.GoG]+g|y۸ڵ VJo8Oбb5㛞퀊 ~K3dyx,n#ˀJXX ԰Sl>Qf_էzvz/TNSJr|@9VT+Sr =eb*GŊʉEmk.b-ܯ~K:'*) h?)$c0p&GPZ_*}6ʅRוThL%>u<'s2fb#Ktٻ8ӄɒ>U=!P H0T,栣(!-p깲:>q3 ƒݎj} xAIq%OAJzA vK (?I2KE'8[ᕍ)vu`^k54EaO12\ҊjcdY!I#`JBtc hG;ِb9,;jX[#hXA 2@}ay;W J)xyT:cyh!X Zpoվz't);?dW::§Ǧ"rk6PdcD@VŮAoQkZxCЂ40]F nh|`})x6JdZ#2Y#kͭ**g4~{Wx3 ڑxE~rLq6Y^:6ӲV[53qü-

5iӂas~OOƫ Un *kR1bɦ/*ĭ(ʤ<#iy֜ء1b`]?|p@Zpnz>P-+eMu1ry^j9ďnT{.bXD6̹Z)u{m1Xfq}\78 Q|I5&MJVH P\JSlɲ4c+] ,l顚1"E/p}CdY=%0et )ol:a]Rv;OKuaDK}7ʼ[_Acز< SNlgsW*B%(' +4D_p(|f_ЦK0ZLK@;d6.H8e>my?5²^01[6&^$ [, nD1y16u6I^Þz^NCJ|^JO]kVrY4>%pl6:4i]f @4)E@MRnjz+S{58e)0YW|}pV,O 3r.43hYR_{z}`TougoXJ5>+'{D=XjW%g%*|2CXV:IIYlO0y6h~z@ZRATp{g^aUZI1롴p82B5\ةW.,'_yuDдQkpq|/ЄAfwө<;d:]"\چJANtJT˅#dmnfz&L18't(>Lqje5)K٢45Y…cz0e8ДXdhhhQGRE #oe,iv*d8dᶦܑb0劋JZީ*4ZZx9~w2>U|^bߡ)0UuU`o^\F$䂊9X$@{V\n% Fᕻd}IpD )x~rN^g_Vy dՏ{ʃ?c5LhI*`Njr O1cxA3Lj͐0J00]mRˠVdIdu6knP]i>N ^똽[,qMS;jOWvLͰ[:&.cCoJ{IYD "F.3m]P"%5i'B&+K o@n qEq &{$UXDk>'$ɽʨ7^ocmi@NpUjNp|WB8VsSP-=g͂VCW}-Qvp܌{qɡvAF~ٶ9:]:f<^Gj!_d օc+Uy^cZ~%N$+?zl5=jhr +ey*AǗkF{;Jj {4IGGAY=Q )펗-0d$ʫ (PZKT:vA V5 l3P<.H ȻNmqߋf:6gy4?a:;m ͹ zh׻{:D&ږNx+N`?2DqQF`-AQE8v Ն 4_FWIKE.X v3~PD (yK%@0$&cs*wK9\+ls2txaUM|jj1M9ٹj,9 )?ok$?,OP;ӯ9DOuq^b,ίй6t~\5ɇ k`ڥ)0SFy(= Q'<@:L+b^&Fwy__U ƽ$v]Vx[jhnv|:c)b)U=m5>*M\9 zbCd* h&BeN# imtGytD>LH^qEߺ+eAݮeMO( ?hDSn2'ޠASyhx;4T:T`uW@e`AÃTᬟealHaNiYKl\YE,| X9!$hl bJҒr"K 5,ip<prL~ 1(;苐9p){4!Im Pw1_٫`χ~-nf^jJuMj(5KEwco,=XL>@`lU7 vp'Ե֝rԏbvdQVk)Nn;6u'βxb18X-DXgz&E31QyWʮGxMT![O0>$Վ`=gJ 9" w9%bsqp4+]//X}$$2T9 ^ʒRB ]@k^rﲖ'/?cC%fQ@4MV^ 'J1MGO .dM=;/8ȅ\@ x[5 ~y) !(DcOJ³ǙX%Ӆs<"w؄wڵ\ǶgL.3☨3~zLFйFo@ҙ Zq\G<3*Y L gҐ޶,b{rɻ:1Cf?[o<Ր4;]Vv(f|!ݮou}Yw(VE{_ؗB (iPߒ><~cAL֔b͖S^;RYT`)aƊq_wO1a9|Dxx+~t= T9ѓػN֠F )it>G.W|INq6.O\7+G~|t>W`ֿoA/7q溂@z2MMiQPXs{H$ Q&}(0אbT s#`AzqKQ HW~UwI++e+ҷ[Dz8ш_u[R$f,Jo ؞<ܼ/+0e''LјNUjvV^>>45^x"(**#{zeϽM#4ZϞ2^'7sh1dS+`"RMCCcR2US@\/ )[3}2c,!ҭZJסaomw$b;fobc1E۳WQR`Zvڠ%j:#@Y2w*05}dGŭ1.j$\39 FN\cϪ`,tp ҡXflrĒgw&#d5*?KͱCtIɄ^z1/h_'*_E<ԐGs"Lˍd|R;+xeD@jC&y֌.9]Z~i'`4N`^tFf]byf<~N*v~y*P Sޥ\xH;i`2z5 7́e7Z 8ABE\k\ݽֲVgi$FO?D>}ɖvp2-rP;f5d{}iஔsrŷqW<mfp4+JZ!LNxQEKGZ&z*4_=֪bjdyiآڴa_8s(́|mX}4 ZW@?5+u (/.[oo*%bܫ`n0C-Ziрj@@љ`?w_AqORx3jJf zZ,{hb CsRsmޢY}!n.$|yJhTgqKxlMzNevԄ̑*ST}i@@S3 L@r 91L(ndʡ԰ xQH |p03j iX yZֹ棔ao>~"6>_,N\mF'ۏlz)WvP7Q1}{֭ ?\r Ypo? +bnQdj׃lAzZ33ڱǡlS[\, vr KWh皗͍M(^[̑T9UY`xqeLM> 5N5, MxDIͺ;q }B>qGfUs|#Q( tVfdwj̟;əau^* jsEhC+PK69|ᣙ^I{d*:KQP/iO֣ev_(l@&j 7"xʷ@Hd0rJ7 *.QI>knouѦYnK>r b,YAhJ4{sXh)tT~'O[۽!!YCJy㰕9䵳JD$O+&bZCpժMlbAQ{US-hk׹Ag~(QƱx "K"(g6 U^fGC<_|^S~x8 Kyf7qhmV^he-< L-dz۝ $_51~Ю7C>2)Bv17H ,ҔT#zj pdwժ<|-dH~]f)R:k51jM%|Qڽ'jO+yry׼/k-HPwDZ+l#9;15Nڱ?d6Jȥi>ubB(Ekd 84v1'9|!v-޶ g*i7awWB ˆ_*E ?ܶ{坞XFIUKka~ ^iu e&=&>,d妦P,@4BYlzt6x!i)- //+flt9iz7 id)>&\xv 9DO$@;riFˌ/?\8 eHTzzCT ̪07P|#LL)+f9wvT0!N#}p\q,]{烯LhI! 5S#dpǔohNj#KJai?pĒgJ.s8bIdM,٫ #Q2mq^jE8c*Lu'.MtpYSv/CVc( X&@DyԿDžJFri#̧Oʸ[tT.wt ^vH.Paz&zQsZ/=E?g}ؒ7J&3|~T~xi:Qm);T6YP8eJD( C_,R̭VM,-JP|UxA4zW/P*b+C)4#ro><"u=A2R3h1sj"Emywk[;dW5=l g2 yuF]fZpVk63y\_J# C0\8eb(uXơͧp_ݗɆ-4"#YM ?IM{] '=+ǖ4r&"Dt a&`iVWu˳/V߉3(1{HK'z+w>qcmjwnaJ0տ?Sgy'4%6 n?Cύcun!-M>d3:4-I:6UqU1~X.ߨM$!+AB~"[mrEA&a)o#8ö":^NCSbŏePeZO1䚞tPRO(t{[ {3b% pH.Cc䍭⿒! 3i*c_NH]FJfoYT3r24$η49߇7M'VWp*3|Dž sètР19V+Jy Tyѷe]pX `py7IǷN1WW=菧h҆j\(h%#2b|BXxN}jdGFNc4\{L.y xνQ(O;Ԓi`b|So93P痺@QsYz~D}ɸI1-RA@r-xD@]dH_La6/u9q~}!;hkO}͒>(_цȞf.(\'x5SgI)Sd =oL7vg`}o*DQ6!Kzk&1&UC:#H߄}=V!#f$,2yn.Xg;w>R,cI 6MZE?,'KQoqgmd4YlhRCDU1".i A%gkLJ%d^ (p%[~-,dPXo,QL5mnEw%A5>D_-ι$wi%%ZVQvl?a\@_IoHn#4'11~*uyt_UR(]V+@aZ,qy~GbiUNb!GCw/.5 V{VӬdXyScAZ\bְ/WaեGA8R|:\xtJ:eӪ(/2T;OzT !*A,ߖ0GV-$9Dүp(@os=oK.g| :L60Y찖{ N9V^ݥ3ilC6M~ B$aΨj h+J&j%cC)-Jڡ!$6pq9#HX^'0y2yäiK}Kuj;r a# x>N;r<C9~-k 1c|T4, * wֵ[P&(p24 ^nBiSH[jkbN0W1jrbp&tK #1V { 䓟o&3<\R@Yt$K/{osZd^ ) p&p862rd]lr^B R`_6u}e\f_3V{6ڮ̡Mfi 'p\TcJ?H5ߢxp>6B D}o :Ҙ+WF|9_<靲YF/4ry]7j+8n,{1 19(xc%xr"' )]HfYŮ82ȀtI)=0of8;1Te^MmLxٺj XMY|o) %iH[+ mf9Jȧ/G K`Y'Od#Xojym+)>Nd 瞬G"*"^GwJxe'o7_{ixuGqD0TX b .M O{+);2k)TSlt`AB3$>?G$kQFzKu_3}:9KHvX~i۔|wn/,^[?͹*n9f#&y94\⮝R˱k5q :VL( ut )r%%c #&& .(&a GO 0X:|OnL2Ғ,]1w$0^F VfLP$ /u,T(úGۛU#yN j ~ l%:}/l!\ Ѯ?3H˳K|l%*Z{q@=A<] c[)ړ Py(2S}S+^4@؇g3ߎeJrlifn 1sYkA$G4Y8i68k3(Ch`[^\=4YqcxHA \d`T0 hhLU[ {[锁V|KtK"o:)Rބ TRQهK ~mˣDē^ypㅐxEzpp;!dzzk:\l8yQ*E`nt=Qnd92:zT0y(w/,yuf)[ޖ/|P,^o+#z&\[{U[ ~U l,{@ȏq;yqse4Nx!˗1 ڟcȍXL!?+K[Du & ļh{jKBag \ʛW2(D\ܾfSO4*Jd#ppM꿲:3YI7!a 6/二*a53v2ZqFeE67{Ԇ畕lu[s$Kʟt- J6j{9uU3d[DDXRFGĘ*;L)lne(ۢe}C/ʠc^~1vXCaF|~jTzcm SI0ɂJtiؼ)vNj'hSQ́2\H\J7$胐ιK1|X RZ3άH$(!qѣ 1rmZ'U*%Sq;Յf0=pǯ4셺޾$$P7A>JЯM/ܛfc'zr6sUG8!|Q02~U})/vq߅Kjosb堜Y, |'NSƆʭ ҕzhf d9qݙA6\:Sc:lb;{Q(m!j5IH-U@:مA Շ9Dk7Ľ7K[Cʍ60ПanNU]! h), ^pR$OMܹwhjCgs2[7"3bpDz,@4Di":#^qEOYp'|qt\nL71̺F%FbY),ԇYnp{v{d}`(P|P3yH0'$F|J[xO1o(⪹l"v#a skAckro@#hcSx*?& i /4U.;>jS]X1kvUGz~&a;j֖ f.)vV $ @Ûn } sXw2Z#^2? ͹ń̦ l _QvS z/Pqdg(Y58%l2#bT;f) %P~Œ}iS Qlqb#B'Pi"`MDI4$G -W5ߙT&*(U9A2>p HQTG@,2gτ-$ y,Xȿ-%)WH~5y)jx\_/-` p;.Fݿ[-_뮦 LRңD,&TzDcXCA"J z\;_ m\R輯$.͢uko6'KV}K\vqMEc# rҐ>ӱC[}ҏF_5\sԗaoW] ^:=lø>8d{5ۆ&ޤaWUl&bN]3WI!fGU)7Ÿ=~6J*iJkSH)B ]k|W: GaYS%2TM_.ێr+__. 60`^*/'=|-Lkޟ4zz#RbZ}r7M\VXUhA# gFOYp89f${CV#?d)kk\/`еI: γjGНZf{~^*eOUșrvu,zL=4GN/([.> jY٧Pd qk r7Β}G\g-d}>qhD-'ְlvE9WKXAMBtuRT^> OO4 ]$)4F< uI)F*3dzEou&X?kQɳ HPg*=IK2TA_Cw/Ei+V4V2Lh$|ao"ȪnllPqF5ڲՁdSEK ]u:\ش:{ `k s*opF2~trxBcog2Yp*:\<*kLEzscLv)4 K} 7CR-zJ=^$'T!B[J@{ ^=6أۛǥ?ck~L@YJ|l2nc )EH*U4" =nN5Nd5@dQ;y1k"8Y׿y Y2|PkedNZ EuU2OTbI7ǕV_q𘒢я.\,~Œ53WijNj&fMnHcbI&Şh4ZYHڤ,_ b!ͥ ^=y9;逨4X{ ; $y+Q_U28nb)"Su`89 ;>|\/AVXP?I_swk2@$SM9қ=7cv1b)]?NbYԽG"tm<:@^G0?:CTXKm@G |~lcg PR^_z~21erb&|P_*PxPp*Gt{ #vIgX+m/~H)5c[E37g*$SUzp讑*ˇ^I7]_2(P٭`$e g7Aݫ).b@[NczozN * *R=DJD>g6aYB7[2n;WH0 VjȦ[CEw&q#3’^X~?yS^]ErJΘh[ΛФ2_R%1xM(qic)54XgEĉa9{hkKq|tqtӝ,x. r#/ e o0frG3`j͓5_t6V`i9BlHQ%L*w"Zq⿣ ԩ| M gi,9\sp7` ǀ'šu*Oso< [ݐp34/U {Ip9xp!ps֝xnU_ɕ_p9u +%hϹ"ՁVcn=e?3/$^R A`wUy 9F&¿<$2eT}Zh:vDaiaKu}5 AU~nUT?Atax|zsW9IǻT@EFVZAJ[~e\FSûGZ:BdQ)DCsSAX cqb~f? ; '=ɓRBhE,_nM{~{/pe,]Kbk$? ;nRKR˺7qg0rxDQWS/-kU4CřPLH3^!EaM5oEsuEηj[UNQIC!`mk@bSlP6TU'$< vkXܺJťS-%a--l^SNh(q:;tQTx[JҦV!b![=ˍ̷5w;uH$fΗqa0F݂A5 noAżu5\It;-Y 3л4>8({]!"CH;rݵ "V&AX}iPǹWͺ&_w57C4k a:)j & |pΡ)nu>*0o|L/YN˼aMdj{/F޽CٖD#Bzkbt-CCd/v\\_ڑ Խč!_T9:m +SHNEp^vo7pU19I]b ,E`DV+<HaFtM$:8?OlG\${C$4l 7>tc]4&XT$5[fڞ'+|~űx|LӪs(~~"ZfoAd,בzCS+*\JӆoGoϮ0zpiix{+,-@p F#ϔx1:7265_S,nV`BƴډC;.u. RsH6M#J-&'C׃bqM/9`ߩ~a.&W{<<]$#Z[VpSK><[ ٥?a+!]*9aU$ƼKMZY|G;% ]Ǣ5r%kEA4݀ x\|6rU\ ؄ȮNTxaU,{`乮[$?SW6N7ze.tR; B=8NAgn]禤=w350rCΟ?M(QߌlD2]rEkpܗe8 EAOp<֗i܅u" ]>ByzUVmX&Lo+?e&N lG|<ʱv By8 ;3B?\J =<,Cv4s7-gp_X%>+D(ШJ=GS:U^JJB vÈA)*$y>޹&auPu'coqBBLݞo쾳Φ?EC\)Z8M M$/-U\=Ə1˰}5.`_q+s8-}j/\xNp&CH*+a@ZXe@ZRG.WeM[I0KUhLq "o8 3a=DF߳op^U:eI5t=ы[^.6+A#m.v*HCiBy,%mi:Sp\݌?ѠtHA@>kɪF5;_IyoII35Yl.Oq+\ؤW|fumѝŵf̆) ónVȆ2쏸`B(;2z[\C>n.b"֖cljQP28cXHc~i= S(+fwr%.&δtWAy̨A( ,U˗5U^A[Zqo7P/6X]&QeD7F0K!PƉ4Kr&'mRۏ) 2-˼]f3R6*,Bz;|0vIvQ /+s\5S[ʶ-@N1gʚ>Fh7hra`B2"gw;dP̶[;.Z*!Rs;KȐRNl2!emiT"PTVfJhӳtekRk[35okm}EeDr :G?ǫEt.yn8hT7sqUeˆrF ^ z"3Hjd|³NooU7cCq9rП:FTP;/#Ŭ'djfѼC%8mO32rp q҂oCw -bZ_BJ~JhmØt4Ol'=obi<|77Bl˴\ FׁRc3̲7g-ӥnH,@IvedZ7<SE?k7x%.fn zWF@PQ %X- +y s|z`KLopZ/Aw[iM)P78֙Mw1B5U9{ڐȡ4m>A3Yt$\:L|XkU,k> cu(:*»x+%9J#~ QFopg|.Ut=>cyAZbwL\YMLPK3VG97lQt 79aXE!EOZuT׿Cl׆hSq̒Yry~ تa㍝k6@3s(O˝.2e-G:Xu/fZǍ ËAoN3F ()!HϑT%nۙ3 \ J "3FoUn!EJX1J]ՕE m-liPص%q]m"QL ׹IJ]D:+EYekt{hM2xx'oar*nTdr@P7%C#$ϛ»}/DRew]{|+*0u2ݚiO3fEaM1p<@aZot3.;y8XeZ՜Ϧ`?>VcnT]vSc+ͷh[[`VPO(w C&&mCѧ>IQujI/\,KT#M㲖bvɇC10 vSj.Pho(fccZzEgPhPBg|"`.Vȭ5m1R*ki5DN7[u@dB|w|An4>i:UI' ѽ%`n':}.HIUX$: _Ā"Rة;U?^Gs K:g16ı`8LDtG|r- SKF/'`DFGMx&TMWяR6ȁ_ TZmu Gu]˥ב7A, -~U[NV}^6ΉvKV 8BIE33b|dsWwtmUkYgR. 7^Mr6?yC6o<'¤S0E YZXԜz @EZl6:)S7{q4}ߍY\W 7&se1v]oa/z4p0[Ӌ %lo C-6rm<12jb ;@oP;hg]8bő[PX$l)"]ޒDzd,!!.ľeސ+r:$|?_QNx)WՏ:|z~4=HQ |[gu~̯J6"ث&w(jG"$ ,>+|]O+MsV!SSc 8$k|=cfe WWo!.K-~tQ7{t4ίae[ 1^*G=5KȬ Va3v%.ݧ~ijjx`i3DF "9|6T R7>,Bk2OO;it-T9^2z]<_Î0?k nyasKS @ fu괌zz&s:wR%5`ƥG µ!}lxy^%Ey Gk MOL"Byu0"v6XӁk=ZHnV@GɿVKΘl:lT~1sNȖ-fޙ{ͩ:YXܥi)SfEdkۺ,ލ#_أKqH2a$[}R{DUqƗﭪ6~C j;z`QZ>:I󒽠{͏OiN5!: :zRl7 'Q7FXgB:|Q싸6'GL9};MR34J@g$`W>{ZJW~ewГ(*!Za?Lz 0=xZq019䫅5>}o@L+[I l +J~o18%Sry4c'CNXXQǓ LX4ssȪkeoE3*,frg2>\OⓁM:I]aCPkNpCdN.a<Վ 0%))wũ`a:L2FqL 0Uk |PM9 Z["ЖPN"A~x ȥ3Wu7H(GM<28Ț/ț{5_3l!0N^6w1g v ]=׵5aۙ:/I$-"U傌C}9I"dӇ1Y|тs{SI{nZ;{ 0nvLI!ޯlZ a\KlPlcQSYꚇt$oVqμ} H)(.޼NKrB4;mjw|yN6>p_}oP$v\ IcpBoynNxFC ڝC}-*N TzwOp-N[?R~֙H/dC +ì}( vMs;pZ3pK!׸#AՈx)Y|?|O2|kgT3GU%=I`a.ZY 3T> JpМz<;zxQr]>ƁkUa_a 2Q2ޖΠ*uwY7?-B1?$*X3= i%szZJE9i0e3E@c.-_% EZczT"]^ue]#{'` ou`.qҘ%M+ːsGLo.Hu\8UZ/$?2G{4ZtהSyI0דR A`p0 Vk t8(!o#.LbTʢV={[vwdLcCaєxA2ؚK>t80(BA}_ܢz66{J 밌Qިemo xg; ޖ/-? )=+c7e')b^ӿLI>ݺIeчju0PFѶLZ6OV_z [s(L,7ך]a`0Na [DA XM}㟶7Y9^WoQ.8DSǘv,3V-|$,@;Sщ<"#wd蚃!/y-]Z6ڻƝb.16C2hlȗ9bӨu|ZVp*G>L&OEyk۳.]/e m&d˩\fWbUٓɱ8dkou ~ȉSoq#eaV]M+%H\DHp| l>YwVLsǛ_-]~b|lg1fH'øT/e)u(t= )ԙ/ie4?+͢cD0(#(Wtۼ+#/_dݾ+zpYѶʀ,j2ىu)kwstN:+Af"~3>DqԢ߰1|ZNۚ0V24RAAuF$>(m9,[C ,8УKpw[?)aɄSiX7#a'.徫3(|wuz j0X}Ҿ5έ6!ܹD5nٷwvSN[<FXO5k85qy`z4P133^W=bZ[=. nT V΢>~ -K$ucID;m'؆#&#rFki-bPj$yر "+ڙ_yTJ(MkڍG,xl&z9#SP;IBә|_0A|UAηՈ ٞ+,r&w0%.kr@vZZM91䔐RgM@ꓙÅːV/tV#J|n{෸wqh954XF.;̐eMwp?KS0(٭|9erCך(&w\OV2ޜ 7 fĻm/Дi\^fKMqR!s||ӌj%ؐRfs:eS#Zi4& u>ܻ.DE_ 8Jf '-)e /KzMϠX\ԠڦRyRPU/ƴ;Y“N鼥/.0Cl8lXoX7kV0vcET! NAI}G-g00/:-3}a񢝁 >fqB1aV`8x@V.iLc; 7o$.e8QMS)P!sMXPQ v xk? FAcE10WSiQz-w+D=Tt3WXSp },Lqн|2wv]5mI+J#8.B A5 ӣ!H}Mu4`C:\кr\U'Vhpz}3 gs qMdR уm֒?&Cg&~ּuy[3mOLC hp ^$iA◣TLI]L "lщ߁߼K߼#&JuƟ6י-gOT~ XVXxW7whJDe5+uחw>'^`j^Ij(+Y+w݉ajwSQe:_ұ3Q9FZBkwy6b8|z蜅~#;90nZ*"DETt8p?.dlzpL53ckpp~A Vl sxnDgʜo#2h|t=y WYsVe4$Qzڳ/]^>uDxN b᫛9R_Qtq+2O_԰5Y_N~mIY̵I4WǮhiߜ#XW6Bbw!]_۪y# ,$3ͼ5S.i!t. S9Ozvق @ j S ?ʼ܌WAlԑHbAIM=tc$ɝr-rZbiR}DFQ/AYco, r'~1vq"jte>DM(Z~4GΚ_Gdr5O$y7墘$vBAS7>y")T>DI `ַ c,វh@A5%L%WiO.JӻK.D}+]_vzU0,|<9,n8$8T%gWTe}oG Riie"g3-^`LY/  $j=.r(M@Ǧf3N.`m+cٓiDϰ 8hK|b?G)wS"0& 0z:Ji5}KC8Hy$_~ȑE%#FCW.Aӎ'ǿɣA׵jxvj#3z"cÛ?z?CnȍIM9UUGE$nsdJvOLh Kքyx~8*%r_y|p%#d=voѫm)AYa1kJ̽xfkG\CJнz WeaM{@ڿK[9vYX`hMO ,&>,ut@emFWBvu Zw;¬]6a$^қA%ՉLuǬb4{u2MvהK!ēq#_N!qW)؞' r;^7{)J񗚆(+U?/ne̤8+t6v} S@mSϤC\#P7:3 r$V3,(T:A$>jFT1nw 5v7ذ}y ! TjRhy fB}xxx ruvn{1Sӫr 2K8͎ͥIVO;^2dLȾpoyQ]4-44#\ :Q ѩ00n$#1>9'4˥;H\Tzp`lS*|W71ӄt?<=fJ?!V^Rj#ݓA xҳ8?1떵|'-(D;K,2=W@5 S'vwfW}~7v\ZJ\x~ 9 ,BΒ[oWuu`8c]-4_ wܟˇPߖTY@dXEZ+xY.xSh"o>x e[54/gCZu`/hvU^\A47ՙ}u>SĬq[qhv34k$*""Bn40')6! / F Nvpe^Ŧ@S}!OmuIhӺ'h|X `l?C4WÆ];)>68~A"+.˯g&kԌ{ۼY-9÷;'bq4ZRLjKdͥղuJ9q=Űc ݝV^ȺÉvJ #W{A2j^!<32C+rk20;([>KM)o.VF(vES^'ey4V@ 覄٪He#L 10h 5hFD&RR5^ax0Hgvˣb5=Kż*4(?V꽂8[^͍=D۞IRU~CR/wŜ-YE~ A'\; s2=¯̍zFlh|4vB_k(L!g'B !./Mzn괊Dўy %Zcmu)0ns"7k^“zGU][8 XvAmEu0)vs%wiQ(XyGy<wTv@3Oc<\$ӈj,^FX=?]/Tm=S$k6>4? TCNyx`@;PWwi*RyJ'm5޸m0 j7CNX=oQߞq#KMq>X1?Et4fpF\1/ǃ%ֱZX {jB@ݛAӤVO8.2Lv-2mD}D<#KWPB*>>'ԍPH8lϮz NӉ=?[5W szt)MdAf%dJ\(MNXpYG8TGβ#> UkIS!A|>۷DmElw.;mp]CED+/n@9H.V?.ґ"Ga>k l3*;)$ z sـuߗMv-U]6mI]= .9; el9h̋,V1 V!'QɈȢh|N o1p!~c彵1U(_O"C7VV֕k㻐;9~B>b|E ?%ňu? 8N2DY f4GKN롤2]9=(eQЄۗ|YS0<(}MMGb℅Mkk~rPQ-iѨ%$IV Tݶ "ۑg)F$d瓁 fp`|f 09Qt ARZST#7NK'Uh=,@ChZ?DbPbO/4i)J'rb5eDs87i 2)+Xh+Ѥa?p>A>79ηpS q6 `Wnm -:x 단m` _g\UArM+<Ex)|]Niqǘ~)5(@&*"+23 >?S0ζ@3plc}z/A,e̩+.O5՛4~+ ni7 % @!swh[G֘A@[E`~ q~^Vx!l |8(oP@: |6QMc֜zI%J7$a" oC(ȓ \oJ كJc m€mV x#`_aff̏SJ-Z+mЌkWR *a3I.Tބmia#Ix r(@imc1m|rm+I X~+ĬXQjb I.3tnAzOs gd-Pk{bQo46c|beY X o2;d Utae,j\iWYBTD6ܞ2m[ wIJp{7_G'0]D\|^TD[^j6ў{}X˫HG\z&zoX%,1!U#%P ԍ"NY]k@_R%gds=e4[gAvN@dU fFY&F֛'oG(z5o̧ RѧV4䋯ggLM^@yAlNtStmt52 k-3)K0\)zKIsP6D&I5-a$S[_@_<7 />F gc_879O;pŖ긡2ҫ KR62aҸ4V_O…,,.' 6jܾeFnZqL|dZ2jO,eCϲ?,"5:'qPnb|9eܣ-S~h/%gFD "$xnpǿ/Ј|loljY"ףc|7@]y-o5G8wYD%ګ'8Q@bF+Lqo}2=0Rn%qkXS[brd) igw ax}oGiv~ǜJ&48@ fɀ3 h%d0=L;b Rܤ*WKdV6fA%Չ}@ Pԇbp%-դ }qqb5:E)gdg}Lǵ\/=Y#Ggk$Pyz W|wMf'QEHLv. ERM"rGA5aUS3܏|Iòƴ C+ZH=lNydw FЅrفX\'T4%B:ˣ˹g fVA1y:PO5ʺ؏V2|ҋzVq=\mNkV\!'F{@PN^$j!ݧy2e~!s6*L)!=@``q^'rytwMĽA0 ,_n gi{Gr4Ƀa'?WoVIzԭXeFǾsi}-k%JH5FjFTɼ=H+KGC9\m"OEP}ю YT =6HtT"HGvh&`]퍴ˈ'ZD3:*{Ky@D,0/B6K/,X i܄Ox%Rs]) K`_h|8g:AS&#QƀO1y]V1Ѯ53# s/] C-jp2_YG(uzB}uUOc,-l0$,HW/pC c}Йz}zK{v!*u{h9+(RpiE/5A=ٺ>Jasu=?qMsI܅°|2>YYc ڦ|;eo+N,1*pI$ {aL-T?@giG[XH*M` v*p)B@촫D^hk?*h+&! L':6HI IJ<MLG9 G͞ҏ_H5Wܔ+eιAYAtݧT`}@ P'_S+hcb€+9VwEf,\*}nؾ9!]cO<|_jH^kW?NFB9M\W#A\PYoQYhhbl^Us{8KwyDxK  Z7]]yfq`2i0$*ry|zfs@l4+m{]/  8-PXf@J0;G3JVϗ4Qð9c_nz)Dy/.uY'b>O%g2g"26=$nLt[.[+G]zGԋ2tho<\2tj+Um^?(v3붩3B'D`n@*Ozw+ 9)F8%A#pL^'6<ͱi)v}1lb>pHQ៎M<A$H;NaB#S}ڰX m~3/H!44LF{XrdƍV/"N{hQ1 @00NߤO4(W~T¬Y7b-%Tb5JZLSSN U4nR !B{$%ke'0So$^-PG{q "!A)dŦŤj@i|POX-v]h=*6^WG$`Ef|潛{cv~ u_#uV+>?.4gͼIMս聼#4کޞ$CM&Bݘ}nhWqd1*}1Ĝ@7-͇shF hFj-@YHO^@p3'4} =65>W\3;L#q q:I\(ru!p=,ZwRYٮ~!GGi,,i=t~!R`v/ky˹4qn/d췼@N ؠ7 G u/JW&u0}G\iؚ?+dw;9J "J`ܕ*¯<.wkYiyv p[c՞l5e[d<ϚT{䣗 V@ζ=3.޹>3>l Y‰w\78T$ܚ6!EGzuA$r]8}xaw(56q>sw1H'5 zhT6 f?^Z5N[8-HtUz/~<0i /SypEg TPc&uԇұ3xI\qExB^-ni^2/ⷫya|OdHǩ1|<9A y@0k̆[KB'Ltsx5+ɕّ zjij}^ ׌8UOߍ_/гh]@RaQ1s 6eba.L>)3HfϵoZÍ~Op*k h"CxZ xrDj9Q7!}ʒ1 $śP1FT W':gH7t TJD@L v/.m֎GMYNN|ῄ~U%!LuD4KWO]"j<Ӆw8;RA nt?[:sl1}P>hL' ˑdeojMEvJG= 5D0=0M-0]ˆU/S97t+ Z]z51cZȏd!o%3z"$ N*" ]@FMs+(! ȜD9t;k'3e pWU*=qhS_\["r 'u'd``a e} VCئE2xO?} >ȫt 1N}6W"AG8],MzO/i.EgUAέ9:(ailN~;20CjUL{W]4M\eMCШkJΞMnViHiK0d;{1He_`cIL/ao#ZXy^XSyٶw&s5| $k_\_~ \,v ln6[.ݗGCla-NiKwD?ȾW_ ݹ>&yEicy/U 4kwwJV  *3ooU1=b9}byyM šFTSq?BؕRc*g>T!$o*N+3;o~}3u rP#x؜)M5s%(U|s`8oharTL{<\r.dW:ڮRƥo8 s\y-Č%LlRbfYk fA"tn1^&SefVs5'fBG qkdjVW0䤐%cA(N_Q t`ߏNͨ7Uv]Bl<5֪[,pˏ:bAΫZ|Q_gf m9XhҡSZټBy¼4QQ <)w$M\(ι]eP)° Ȕ\]\𬜥s~΃@4+ )5igJbҨb*< f n;}&kEF d  G#Z2y*$wTeT3APyK<{3v85I ףO#`]c4kr* G$1m;U%>'NZ-TPd?)ׄ N8̳FhyH/ѱEf,,&_x 7/syq1'dzߩKZH1~"X#;\{'PeQm.dQ9>"\ssƄ=̽i:'qb磪p(Z+i_n-!X$ޚ_L#߉Pˡ/m#+^ETݽ\c{au{*8a;]@W; S"`!h´e8NLULDuB5"0K* ɤS `Hf&.6~%"`FU9J (I ANron- l!vC x r\acV!9(?P1 qaeTyX)æ$$rB*#?wW`ܭHi:?5! PCxgޘ'^_#RFVM1gub"\>p@ִiQ$XYq,Tl HÏrnhu.(TFX&)Ąf9U掮:nZNOl@ O> 8ZBY@Qd⿑j~_Cs? Cj-픓fЩLE '4е>e]t}@z`s¨lDb :4TMm׫;Du. Kg!} {$XSrmP /P`=&"#jEkm@ U8":pd{o6UGxy`|ۃ֠~//پk2e\cڦd±9M=7 *<ڽz .Ď (r{>1j!j bq 3=!W -|)J|{˗}%KZ&T 6}%*=KU&fO5A/6 dAHb(5$hn5P=v@&h4+U>_Ƈ?]G10f1P Y~_%zEh|H$hMKMI&@Iܬ%ӡѿJ. Nk CcZ0kMJn p|Ҥ"AaBZړ~劳0F$2{v?1h o79;O>bZ(Tnޖ,y1%ܟ?!.Se $)^nxpb[R~Wy>ڞE6N _ AksH 0u:)UC^nzӽjNvP'ǠNa6h2ϥ"lO᧼1Tű~wTsG+hZکA})LyC-IXpp,PpͶhȨ7=U @ fM"Af@;M8S" ,9x#K&SUH};Ykct (&K{)-*u{o[rO?JPV Evļ!a!w-VJBeRrQqޞ︖_1o0LBTټ2ߗ,cHw"3IqIx[TA.G9'ac[@[Sѣ*)ٚi [mȔnT̖&[I`y_rEўǩú+c{7I_I~C+k3DnVI<4 *TkW~'VQ'H55Q=Ea5I.7r'=3~)!A20"쉠f.O ؠ<܊I1AWCY pA"i '.x+m^1R?٠wYwu̜K^6da)S[[R fq?v`.N]A}4`Y{&~-boZ:q>xBDZhoC\\] W|=QH:\M1xEGlC}",[t`u@;!ZmkL!-@ -8e*2}v̽3c}[ϝ2{'1cɜh!#S'q;׭jW8 NRT W1vN9kg$N?'\&PH XDͶm-|hr=oY.l#<4$NӲ%_1.hi I 3Nd=zfv?h+Z8b(}w-k"PZL=D>O:N].ūJ]~ǧ_x7aQ s= WBBҬWf{͡&J{SA97I>mY€`e*5kl%I_ݫ",޳*өBA]"!S>wɡk}/]GeܥuѮ?J4*Z i%k]qgq\k -oKyTb< xEp:惡rbc 7BPԟo {ptYgBIla]:uz#ZvW JR9ӸF,Thsd2i2O!۝TyBE_fMZqA:Y+v[ofqx琌On $UOYmp*}ʅNX>s_^k8>uhΝ =V}ԐX́^(-g>|ldK\o|#=]CB fc 8K]I]lf0mc{~B)I!~JzAfW`JYȄd(9Me@;.yj0<0D:7ՙZO݈?=fdZ٥aG726 ПY^<|XQ/J-N~|E۵${SR *gSj kHsRЋDT'Hd +& %I+29^>kGp6i&WͭՕ<\gS2#@r2[3  㝢D))$c`񟤕Ӭg0/3~%ia[R#!\;(I.x\1~xnMfPs,Шհm>w&N_lwHKj_ 𾇸<7ܴ*_+p tI+%F<4g^0Κ^QTb+"dQAP7̓H7nDRONmwåׂCb!Bh_:>"5|ެ̳~;{7xnDG >)y1jUk8]Wbe %յvBRm/s :境!kyu3cŀ^!Hc=y\< ,*Pߊ=/TtIz$V~ * " DP?ܓI"Fpo\o1wz@N}gbVyX+t?ski3% eymE;d|PQu'<V)$dx䩅HmSQ<`a NP1Z6Hj[ϏH^~AdVm O3un DY52Q>pG kw(.@h4hia"=@qFD6%i^:Slzmd]Sq&(oZƱ[k' =rO40qKzSoׄ)͈(g@~WHޡFӨ%IH|y>u]ۏci2g906F] ?n($/=@U^,pDCmzqBu绣*5`0 <,ZJO oΓL>B+&9F(Y@|RQY "naZz=.Iniv> bd.V9p TC/ ?Br"5' Y#<]Z} \>AU-}B}R?(a&ԉdk90\i}KHa3z#2@^МXKZu0ئ!\=?6{c¯D+:/Ɓ(p_wĆ:8Cj|("^Q< j26wZgh>a9~-q2Q #|v9f8!cɜw_?,b0+ 1Jɒf]oSv/cŶ 66ҁAk/Jyj-g>_]%B&j~۔fcH M..CJtDž2\0}FЍ5e8 ل'hik5.QwÐz'}StΔ[ZfmgjS|1+f K:,ᖪ +݃5hJUטwzpMMpk54Ev j ~RAWχKqyo 1bal|b2Z,6dJ$Y\Q' :$ jbD 9'oVtGB׵N_{2~qi.fqsS/sC`)M4wl)="A{f)S )z0ܣ^(>Ω`t)tAD[k*>f_+%Ai`IpsůSUt{&zTyhzahBٔC^ ;dByѣx8j!#Gq(UxwW4˺σf==Yq%';QF ۏDwI~8ӊ2ͺN>K[S%Kaws(oJӣ<s)Eܖ$3o-+)W1o3?:.Ba͖r^2˟ Դ׃0lF:Sf> עe4mBd:U"b%A;;C>UeA hpn! ui.@Q/YjͭV)Gj$g_oRL}q;|7o3 ﰤ"]'[u_&Jk_#X /KdԪp d5V]b; pK8*a9^le2𴜛F홊R7;F_%ͮX&GB09ʽCHG}" gŠS魉Txpf' rѼ[j^;,c|vrhR @Zi(B{3ԔwՄMJ&(/穩G DW&5dc{kOTWlb5dSfAđX_JKR0G,3PSvm8| "DH/5Jq95~cf bUKx1Pc +."iUܢ:өkb]fk7ɟmg f|+4[O NPWU oUPe\9qA̿)[\o!NZkQ*pLx Dzh"(Jcaw9?qmL8V.-%\3_Yc1EUM .& l@…}QMfr|[9${脾-k|i3Ѽ ѱˑj"Aa5"XCf|W|>dFQΛjdr;0T;&X))92)X Ih[A+gE'&7YZp3DFt0"j9E|ɱ=7)LøG|DbR2oyvq?vrvTس2{5FMVi_qm'@FӤ諉Z.G!}E?OM rx*ԡKloQI']b&5ݫј.3=:3sd,E2K,/:eq+%CGzmE\P^e5 ?mO3 4[l3C~dzOgߍ5(3>& P6&|) p-`QY*ïWh*[IQN=҄{y&}CUgF7Xg֒%Dqc잴+|@DPT7a5dAe](I8Ha0qa2&]:rW^E9,fiV-sx##9vXo(g' menߚM:Xmv| *:"r_"BBN:esK u*Y glatK%dBw;VV u俎ZSHoIj_ +wɉ4&M4zOFk!ޖsLLrN䟠*F</#ҥľ)w0^'HӋSR͞|g1cd6>-?wc=1"7 %ƀ zK3F{[= QN 1@ U ;jS/.aGQ״V{.>e$q5s/d-V=S[HX8u\d)뽚kcANTZ> E{>2P"ZtZ |fE @ֽFB??7ah+< ΛkəAcd^|,KFC83|7 SMwq0p4նq?{6nr`1?qbL[B`lf ^p9MKeP6 $s~ײPNvVY[ /i1"qr%2q+Xy)$H/CBOEB@mG,[uc)C4RM' |ݙjןPK2]ZACS/-"Sk*ypgȓ:gǐ }F=v l>)Xt5f>w((٫Tr#ֺmK;$qZ |yIdքzܜE6$=Ѯbe^ٺ'iǼ]v5o#rL|65ErKMţ(cIZ\:drn0_֠8c]*6RjCLoxSj dH}z0A"wB5OKe7j4m0\iyٰXoAoC> lid(짟`//584i9)8 qxkuOj^EPet1L L w֬1G68 Ɩx|q۲D HbfԚ5]*TiPYaA$fPRZ8eyh fL Qn 4h5B܉0'z0Q@8+YkvӖ2Aj/YHSV 5'X (F8鑗(emyuW yϚ>㬰Q^)Z`SN8'נѿ"zoŴW4Sob̢hrmcnO0Vk QIM[ ޣ&X;{z{:U̖pZ(nn^VjΨwmp7-  쟏n Aߍv³L420$)Kz{ZCC{aAnb(t;Ysu\'\R %?mT'R%B}=>;YR4HfMiЎDMQD>&֝(lHcΖH3Rz13ZgȾX]k8vKٷs5U qd?w؜ YmP`?jSug/Rۛ,o&;3,xVό\n#p4pJ=+WGELt2u1J3a8ON.)z МQ S0YgK$ yX)ޏ2,EdJ2};Ym4d'b6"Ų~TaI<dZ(&KLA\.(#{Nf MyAb:Hߠ]"N^^>|Е/k/;WpB -vfm39,*OQ44f%9/=jvV_7JCX޽7~hչd(j]2 X8W(3p6<̄$;2k"\^=Q'2?rӣ&L ؾ&:B֬.EmDHRyJm`om0YY% h+)\q [&m%'i-u8 mOd"Q.PYVwt ʮܱNĂr dzJAӘ2à:r`UV]{,1i~;K4א:Վ&oýŲ.Žҽ O+Gu)BYF8YJ2Ca8/UnGjl7^F#&\gd\wD*ZZ2L!nɝvtX_=TB^b7 !t/{a8 ߈dj.ptʉ9( 6AfbKXP*T޽h|9.)fjQ_1bSYg [|LN7!C"oˀ [5})V:UPS'k<>Y9ߖ |;&LZA r T9P{lS؍ՠ <[pI4k"_DpTΦ4YH^S9{=BzȥWdy㏟6'- 46Ͱ߯m`ӆr8Flؼ sh$ԣi$R+8ŽmZ p\[S'&L$Ć?Rڑ#B)xE~pQ$gmaSx^&  g-B-3F66*T+N/pMH|jqӲ,^MV1{xJj|/n]4әޘ##3?sVGedmSQeOwz.i[9q0&g1[WsN%ҵ'[r=Na $\ҵF[)@R `!YwǦ[dS@D@å6eU1ҲıbF=oʹjZ&X4g Q: ]׽iO5Q c)`1;qŎRc׭.Le<GG+CG5$aR["62銡h(u,t+މu-m8+>k,jhV'6G SJE少h5į ΂TǷ z\ݦ$K>!P !_5(0,eeҳ*{Lـ#8:ea`~/!Ň6 cevA(sX?K߾<>&9.mم-I?Ear7_icHKmQ`\{ l?X|lzbE1`<2*\g)Xx'}eQå+0cx(RB {asx栿X/qDiY  r!m;4vpSI>9!ýbiƆّ54c2/)|[DaW=:(bq@\Nfθm3 NW{HڐK3Q.d>N[N쩰O.Ve9ȁzov羕8q꾌>t L*JV*m3g4X1TsPw^vޤ_ue vol^7x{W8aFC[D zTy Hʅiĩ}$*sw'9)кi,[6ZeKꀶz*4M?*B`Iڹ4o+)W6Yڳ,wCaY~"۶u*`Ӳ8 6y=A _?4We:n*:W|l͇7l Zy?].B_3Uh~(\ |Ť[9A,i{ Pu$6%R (jjobԗ .LTJ&G{SiWP^,h8q^,$RE7u#")  *WڢJ)yj?g"c}"b,oBL2֠}6ckeU+IG 3BQqڬðjTH-!&7+8cC>-Ç\<>eEJ> ҥpW~g N+H<ݫM?;e.ưljΓs Jk Z[T(z/H9Oś?U\~hTYLA_dmUy5Ij]}jZ1 sv]z%U*-bZҳbɽAfՎWds6B=7|mZp&'fWBO3['rV) ' t4OCVvP{}w]o X5i < 0/ >xΖy ҇"7<?\h1*`$}`LvcI ѝrVɽ!Jk$ 3',Q7O#6.1 Y-TrT B&5J@[y`٣WDPKgnppUـ/sIYICz pP;ɗo{}?QA23v?4WzaxS_GƦ֡|J|*‹gya4rb4k>{qdlFAKwW{@< 57VxFV `F'qOâ719Z w># 2p.;{o+SnSwZ7-4&0I&&L{\ %QU\K{"܋kNjb&o-JxWZ<(P YqP@D[')zj3d#iWc2-{ t~k^Gt34)}{Dd.coB"E+0f83ڎ`%%I"y?^u qxXQC( `| O#BUUėSDġ]bˌD(C`#|r'<3T&Dml5lU~kFJ׳ 1&7Eak}ݻD1Z D/+ {$v@ [ZxsrE18~z}ZC_muL^X |q|,"9c3SQf7)-;EQntksP-q[հMvm=2kOm'fL(癏ow[kS't(w^aG  2l\kwaOy ~\i&xDe[w1̓']G?ש-4 '"L$$\mǀY%wϬXBjUi-AJ ބԻ䭪{IbCQV Nfd3D4p7R/Gz]&iN&e*f {2 l.$Z_$[|T"ᅨ̓E M?NċHƘO6(N@ni(mA#2d1qj ^݊B P!1Rޠ:h<C}˭޵+gei?ZO)v7e`s@ nIFQT%/NDt+#+St兘EV=w^AqǩW_R4>Wy{;eҝ><'@fMOwLkԝ}?_]X _H9 ( 1+:W{pFO0Tvդ:|Jjsv(G:ݰ2F>P|oRIΒ}ӧ34-f_ ge*;{2-v,^Ə | )`*EDL^  R yh(e9)3Q&:-^Kt[+|{JJ?l3kVP[Ymj\/  q:S-D#ٯ-Z)K#Lo#_jZ*z:\55mO! ɇ݂eAj¹ H D`dqYNflw' _O~9 {YDžTS98џXBR'YkӜX)o(t }+۞*(+Qq9Zi&VKlyrgzYi~!<;As% 8OoE[M$NXte@;9!|bR_&ʺntݬX}~jJ?LM}Z f6D>.$.Wk*>+A~*uV,)so-]^ף  @3PDؗ{Q7UC Y`:LhW3fY]h'KQtهhH>;k`]Է=躡"F;Uӯp4z*g=2#s9'ծ-.0b50K5M;7 ukCH)֓ś_ ZRl%[$ܮ_Gtۛh47̸9!z%hyuyD EG7}Ҫ͕ߣ,J8z{0vVƝiR~ ۵9m9ݠgTGjZWF1 ф?ߚ?pͣέ55|f ] 4G#O>H4(7a,<~Jٽ'½?0!]Mƚ0HΦ1qoVt܊V8?pѳmPI5~8=ξ%L&gW5dXZIg@i^0V H+Ze`ǹ^}# v>$H)  W&Z`; ,O|UO/,QflxZ {\a>6(>z&xJ8SLy3KM1;p#T+Q*{݌8Ȯ皼ò"w ]e2X2DMMSE=Nn`p']c!2w<=,r[1s}M)E1}H^DF՚&D7BpVMD3^VMd( |d멇l9*,InA9sn"LIhHy{l|;ZW!ܕwFJPxL!GN{ M:;D[}\4hަ]KF>]QɡuN-[X{Ѻw#qk1w΃?ҹMmW}sy1mG?O6h͞劥nH ج;F$vuBC`NQlXE@3Õ 6rُ_-bi%A最ELؠTKc7zdp?/+ABKs* 6>4拏81<|sRƫW_AJye<`U.]A79i<&6e(I jA(1n<*6(U[.sm꾫o-YF ?-;EV  V?؂n||{ Bz¢J#$j>`'Ѫ[!u2NR46$ p bG035#r5{ee/+zXE 6`8[+\GHzNRmFa.v̦"hе ʜUJRfY6~~>VGp i=N,P S둸ǰ_3M5J$Y7~L/ JmSz;*%ЫQo\j5NΚ\Mp޲''ۑ 5WDtXFäk Y 1,avg53 RܚNq>%n䤅fLsJ>;:kiQ~] IS}|\CS-\fB'| S> zѢzm9{mSuQ%4{,gxĭDmeUKp-'v~4Z&zfnG{r#;F\ T̼wl#_cDmW!ո4M?^pa&#=?^N'G@cT`@Rtq(y7M0 )AesD| a1j3!x*lA Ve8vt+\Iph-ܹFzct=^友GLWOk?[a#;~^tC"9vRE`X֚~ф+ W%aG٣s2 DV׺lA-Yh!*J~^/s4cDa7b0.B@AC{PYOƈD7%ΜɛzWbF9L4jXnf`,\"$㮀DIS &镨kGqqW?@~W]_d5žxDXO0v^mI{lZ[#z`~6`[a@/J!ݴiφ !Mv+ Iƨsc$祇b7N}}SLNlGJCa#`; 9>i|Iaቬ=Z k9|56|nUֈfףKl頾Wxhws sMoJp2Ef.Ɲ;s_J֘rX  {qA<,{x:e#|P1734 |3V|b'lU>~,w4&JT DupFj֪j&@E|@<Z{Ϭ%d;՜Ê/*ÎFrI(on B6yhs(@6])iң5_BځT՛2G__ @Vy6#p9o ]>,n`*Τܬy '/9v<`h$Pкp$l=O0zI?Ӵ<ă|a5rJC]L֞r$E?ӿ򭭿Rim^&cU;|0) &#'a"F u@|mH lr!Exi,r/7:pg6!Yjl9&qzG/ea^|^T̫(!iye]Q?nxr>-U_4"c A):s"VJ~2LfJigif&!p~\ɟvkWѸn/ž>}4IJ}}7@v{Uzudm/8+}'Xnv Ou W&A1]IS(Yfc9edn=.͒1Է\ BY25\oMs~"J惵 Z}ts3yĖ._% JHa/C9WSk-R0+ID JK΃X`ݙ 6@mԉ؃d@ (eQ=RNH(QUt \ABp ,Ew>ޢ9^QHO*1}]BdMu+͙2޵P޳:zfrt.o \^AMR,:v\gG 5R\T?Hdb*U$Jh.]o)13S͗_6-5'UbmQ+}Fs&rϽ2Ua BAZi!F,H}3u?&\02Vs . ZL!r}I ]yeTJ g4RVmCjxDHPB$/J\D(meYMKE]+VEh2?Jkj`! pЏdCwWF2- 1Ni)O zbRQ]~*7b}>NvJRmN2іs)ϑC v'U9&-QoḐr M$ﯮ3 8cIߕix14wk | {u4{ZfL5>3)XUBq>}I(.l(YcVȡzi6 䚊9ZV<`iU|31!ENňPkI9@C{(wϬ$ _i!#-[<P+CKNڝVt=ml=tMeeլSRc☐_h {=HФMlreȵc0ba+mN7p"{L|.hk%ye*VЃfr)Y9||!;,q;dVkZs*NH[jo="SΔY֎Z TaVf^p[=.[KI\XCx(v` u'9QvR&+s 5GC7H R/BM3a5>zv'CP&?+ʛ?2D#_صJk,X{(!EI PZ溘[;YʬΏ1>P]nH;J}yǃ5m N&f5wWy0.ɸe}k$4BxYWaB][΍OM{1mURpWb+ItV(&.hA¾;VDC.[6Lh*ʣ履ܦܫ6fFmJXziL~k/Hs2h;ξ& ,r` mh |q9yY]} c,Y+C4$k tP"N=ncIl܍ #R5 3IDw.5ITfzM*"GDwƋQnƅgre2\M>ْJ(xν&u1VufP J-T<1<Hk_ ?FN4 "Ѣ4Ʊg}]WBgȮě)@ KµGz~Z-6,I2X ss;=⽥ϝܾ=0"%urylDR;w ¢D-J1d_8? hM$;243&^ZW϶._fх&[%jz4=)^SgD_m1"8*%i JhhFh[AS!gJl 27qgB"=Ei3r؉k*3p#O8$w|8A>瑍0fN2*>Ы#ڛvWw9psNIYwUlOAٸ=`r -WzNck3iLN]Ϲ7P״x*Ew{x6wywTܐҬSt&d,K8̵1N7A9Oʳ3lÂCIJ <"D~<"B6Qr߈}i"YƽőD99 nC"ց]Y6c+A I)!Uӵ +!;gSwR/OrA5ZmHX(.ΔNҤҨY!}t/~{`eP:\2J3-5r0gЁ yyQ=d9k\{Z ؔ#I_hviVjF.a s1"W)&@$RL*zՒD~FF ҷQf|unvE'pM'*va7s8Jaҗ*q"oօk\C>zTbmWȕ*qM^ 799-nh) .Ա=uLr׍X>{We T` P ɡtgT}oa}F*3TX`}0 74kZٹ%Bq Ly1W6w9Q1n A;D~xk_҄  ;A~j:^oܒoK 9S4 fabdsȭd;]M\ۖ,bq!GE|@L;(Ή&ݪ`H6eЫ@6lce~ap0󆐹ZgŒ}dYq,mu\h-.[].erxy<5glt|XT*GN -h"eTE bv,r?QDB 657~ xh;&o$lQ~ Kk(9Lj컫AB 5bQȳpA j7[5TuE7oQbZg?OƼl&TN] Nh7[+f]Q:I{91cvrIJ}mZ{$bCTIrNM\@O$l|(b~5FʖEǑ 5|$㎤lzְ?O?T쫖voX&w2{rhO~Ds4 [UTT*'~w2T*U*)91ӕf?B~n+cc ]h,kղ;Ðp.9d@V>I;AxT9&eL6!P LYlQ*6,ûub{=GM$gX۲JWF=8!ZhW,N'&:0@.RdKj ]ŪKDDKzrR~xAqk1RD 8ըV6f *3)HE׹3HCOd@N\:ԥ6e" XV+1ɱʆ4N.?'+xX"T aXJ1R]}/tAsx[QЪFdUvI>*z<-2μAX)~I :ވi1HYT2 -rn@UܲiLlciۏröNY^zN1% :<&JT:OVC0$/<ûL+춢kՔl`9#>C՗#o=0&RθhX$ cȴPl\h=rM$I X=Q).E!{G/uG%21>ujH>%Z {MMrI+ A(L+DiXӾkye8"ތ6yY- @vŤ; )5@i5RcSR\%͕:JKjoUe,HNK.³Ơ(4;ٱ;WvKAK`Ά·?.svLG83QjF.SG aX=ʇ_]w}B"xpaK PxAmɅFTx!ƟϺF_rCH |uͽe4ų\h_4=]y_aav~ VzQ*<>L$ɧ6 Yh~Bo}A]94NIkکɗ:r<Zcu|:=2D~d0 LY &`*2c(sƆ~xzE@R;w-#Ji0D dTIfVip팡۳DY9OJ7=@(nHNx'L-jq6:- A6S1s|:Hb_78faFБr'絢 sO[6LS>L,SO~4F>z08ؑǩ 18LSV:g"dE1F]ʉ{#g7-զބ8~ETv$׷cVKw2HAsPL٥E5sO!X +ñC89JuWWQj"I-9)vJDm1s겢.|)u2q1{!)7P 7wԺyfJk:V^" Kt4piCKH_ZD)]-_rD׍kH"y͖7'Ʈ-`fʌ W30aEykujm57^%lKZM?2cYL{@k]15iXD?!Z:Saj= fq4Mf$LG"D\~o;kd xx̼}UT*{71`;R#=!!7P1-}|ȯY0k[)ʱ.BEW/Xb*3enE.PD:G8Жr@]Y+GSshVe<_}i 9=:[ (0-`!`DrD=%teP ~S* <Zp|oY!JaQ)/~brB,s(9Ԁ2\;M,AӖH&u!xX?I\ 96%X}G)+Q2ۭGN<¸e>3$h(}`uW(jU Dg[*ɝ x;54Tgǎ1Vxe[oP#x HOp* ?&eҹ_R[i%zE\דZi}uYZXTOOA.oIliU"o3p|W ^bGm*s'Amf'יk0j_+-ǻ1UhuԀ4|`0delb$GOф>њF*gIN,yŕ]󈮥a ̉Ǔ;CZ>xo@+تYf*1)m]AM|&16qƋjxαFcXb6,c;?\)aƬI_\5gd(1)bGi1XWbyP 3ۑ+5ҶmWƀm)pWg]]mIU +]1p;ݽ 56MҨ |W|fJcc08}U,>($.e0=͇ѯ,Hs-V(:@--[O(8_\ghn#F΋BJ/Y>^76nHĽ13{{`]"R3P }5D63k` ; eL2c5$)vqjw50t63jcYrzwZXh ,{ܯFH|hyYe3auuwh4'6.}?ƒw5 ;De,<~ ._'|SYEDmQgH / ^veI4dA'PbK4?ߗxs&l5"ѣg?*VaX|6ԌjσWX{.9,ee -- CwQ7*Eod] ]twLh$ϽkŝA+QgEVf9;D Hk*^X5dߵ^u cr6ii\ϥnl:@<818 1gJ[TLF`WL7u{Tx*́F-!z:ZV +n*;bY%FPd%I_dT&Ebq+8}d6y+W(Ft돂ƭlj5Pğ|=i~/Vɱ$2>UH#![R{W;?OG fq _^^ jR}op϶dB$ދQ/u'!0l.x(sԐ[G@ +4»Wҫ.*lKZ:# >J7]ޚV1t_e#uh8v<϶}nspZd1-l:DޣAPhr)K&Qb3!2k,ȄE"'J* stdʴ C >[wqՁ+}gy {#Rf\k(i$׭VN'PQ.zH}?uL)Ako'4umEUhd/z#5>wmSe4qfBmie /E48A<]aP&l b)dJ1(.rjEǦϯxwW =۠(byIؘVA5UNhRIש*ܻ1z@1!]特ٿcDNOGizta|-kݣ=) é&E&!XҌcЧgxGiP`2F6(~PMr`;˚I{AdHivq-T|wўquB8SY7W6(9(ڿWгXèhn''^x Ȱ ʑ)dCx]R܎ $o*i:XgKf-D=xL8<%k{j+Iq[ ,-)#A_"l88ςO)wpe* n=R}Pk3#Rm/Z~@Tf :/S#8}ngF3tw;`ҍ`jU69^@2 :'Fh16E1r$tTdih82$)O8y38q+#p*oܻ"<5ty(Gf3;*V]6}!#^2K=6NVz!6Qɻ -~67.u Fe`ꮒWA^u!xE!A!C"F3g*)o\S@@ߎ\a\g;YzNvV0Kԩ˭SF@"=\뎅q+ y9y] 3/_Vo_Ytn9oV8O'u xz__˯QU֨j3`);qq2.&ذGb:HI;!rӛx qtyLOŧxӏZdj!%3 * ! kVƆt)',nGqØ0BmV^O`ѨKV߀}){^HV6]T>P^F`` #gշTʟH{[б8>j4Ya{mtdW;WY…洱# <&B;a ɉO|y Ci\mCK}YQH|.l²k*( B ֬'.&ԏFEn1S>0]r mVOPjw wNUx>~:G+3ԡ(uJIfs])=H*~'݂,= *"O_X}L; GĎsZ5jC {8z:K,kqjDOg=o.ڄgFfcQ̦Nvof#aF'R\>e.M4t ǒ5PAǿDX'/];;pmE?`RnHS]ġ~O ւ5ׂz֝~ kdT~aĩx@o״χ,u~?]sX6wx["zWxZ5oKOZgmDo` e9 wc )jB8:[u!0eu@//_Dm>9. Un*u k +&2ߞt>abD=]ɪ|xW~SwǂF\!*))Ȗt6K<Ӱ3^EdAR4Kh4w8ˣVy*q%~RJfwAr,gT K753+:*&t46)gd+!xВi"S-)KY<߅Lؒ jiǘ6١-wu8wDxam(".4:0 o%Aj< #8)3 A3u~Ff["X 涢7ş7NVp:3 o |v(J5 ˁ;p&4Ⰴ/GM;x*|mq 3U»ʺ~%W B6E/\R,mFKFsNC_ 8)t(zŻ = &/|*ݱg9?>ἢ.-Pm9/LFs͜YY5b5?NqݬL0 J>.Y&dkEwc`sX8$@,Cl]3TW u/ P[uF_-6qTpyꉃHT&*Zä"s 0z9n`뤦PD^lފÏ覼8䥓U%*(`gn% z[], TD u(}/|;#*Z05ߚؗo? cc*S4ԒPzޞ& ώP*dKߛO8 @|P(a| 'It5^KwVoHb0ǀD(q!+%@e*7sF~R vQ!k6m][_=A7NJHl5@?Z LL7.pS,)zgo[%TѲYF"q~\X0=X3c O0yh]7ZYaUsҘKzɈ}% 6tS!#Ց^ {$_kګ1XȒiQLBj *n(5O'}ךo%H(m657mT6%"O&9FݿM0Z>tïd>Rg@۴ԆzKĦV5iji{V}H`g'6 kn ljC/3_̕ \C{%/6zW53Ðews^EXfjia n m'lY{-6Ad 2arrh]DV؅?˝f F' 1d|ofDoh늉&ADtofL]`lIfӦkc}pFۇ_u-N"{ WOBǏRB-*)S5?h[Y7)KUkp{YVaGUl\/DKs8B)K󼉂+|R8j ߮؎JǵԎW#ۜwOmZP Aȝ2aiAXG㸽4_ ).ݣxM&zSN?{MG% r{9Y>boVTE HW AlIwɜk=I]BmJ֐Î!JXeyq5"JFN`Cl+TE%t4M,d7m>j[rVxFLtN!CBMӖ:vν-wv>Yƒ5TjT>tɥ8܄[8-|wVj@Ow8@<` 0Se ]aE{L;)P(Wh+O{͓pSΫӋs Q/L̈ ;hٟqR.HQ}ma7ؓ˼^Ѝ{T*_Yѿگ@;>~LBO[o4t.e|8, mߞAJ ]FIϚ Oݧqi4R;xfQ5P1jqFs&ܻzlaUdRRJ{]>D%=5yuA#ϲq QSBa.Y5l Q v5lnf}΋T>eQ6%N:|'"X!Iu' D!-hOmhHLM[/P6B+z`(xV{,PXYs q݂L+`_0k&Pwa r{?˹Ɗ{i#!z缭{t +%c[\<Ljϱ릻fCGe+O˟to`[(kMfYcu0^~Fi$?MMǶc$^u::dҠ i'S!Sq3=_l<-le4.-IJs~0CɆ+IDbSOH4%m/HETGp6[?}E)&a !PʷwxkWyM( )-tD2ѸT#+P gz0PX۾}ՒYYLZZf< 3EZ0_4]ϥG۾0w$|9P֦G9I@ ='L/D|9(h`E"5geП"iY nIYPgh!&A+@omB!:rc]ve]q; =C~h4[b+{&ysnC@nXMcgMy_Pf`}Y̑k5&Q<֬AS-tL99J)+!kzHU/[T2aJa?!,sE9a/q[h}%ÈًT:u@E"\bϐ_.GZ榥sӸ yv#8˔> 38,Pϫ>*ʽ*ǻ[LpxİT[| dWZr( &r->A|dNI.5B% ߇V+#z~i+twhӅ>fX5c2*:mEOi!+!w pRmya] |7ndpj壪ևV& Ǧ%O!Oŗ(2$b *ҷQLj@nqLz[٤ݴ `IT sqyygo#Fu (˅fdZ[ra@Tً3DI,ܨկ1|:LPZh=7u{b1њw4I z.B/nRr:1(fUw8^ NrWF]S{@`*3,d*Ai|nN*3@m0z)PW؀1Rx{[qXAقd *Tg}aDfy5KBŵZ0 U3Fk83FM^iJ,:K- BRmn^3x0$K.`)wN|0dN$uQɎ{QpXt (Y!iW^PMJIc K>'L~wǀiglv84}XG=@P$7.^x,emw6 &wT^jcdSH̘{݅|z)DEels6zc˥|X.! [CZ>cS΀;PD 3#*I/*U/BG `7_~?f\ggl,) I{a\ya {4~Р>1FI;9w0^r}ub.'iYރM9iS2Opg#oezX"5 ]N!,5'Xe`!sأQ1CBՊs}שv$*.}s6ʔO3#K$h)zH5K\,ɭڌ@(ntWĮAIMk].ojd.W{yNK;a&+Vx#i4D0Gv +2^Qae!Q%%ڗzzԶ} 4$[6KR N?y_D w@4THF6ExJ)'OD|TUڜ蒦öG!VHe8wmʩ1)A\vJU. ¼K b-ے$},-3_*aYr.P yWߤ"/ 143WwSyӔkV#ZOGK21]wMkF˱>S; 2%RClL9Q,}^*mid{-_r*I P=PCp}Glg:eiNKte>?1;o,"wxXF̫W~vL)/ ) ]hE^Og3E-;A?^|H7azQ@%~,O(~y } TK@8)n.^>SܑWqbA!:ބo8׷\ xM+DP?!!R8C0rlV˫2>[ٟx0h*'V.Ld:e?g͘ k ]joHⵗ\aj('3;OqS!vP8`~b7G-GEMEoWZ1[0Q/(Tא+Vy G~Aىy(bOTXdL{_ ӦcХpKÎŻ4Glf``y5@.ƴpv9Qa“s9hKGWϢj6]If̷LHc{ؽCdNK.=܊,ܨ/7 :dR{+(sKs-sd3P9) ZԎW#{f4J{,{[ ߮\" 'gP# +Cbwf?NԲD,(S vBJxw_8 inP%WirpuƵIVj"{u=QA$TӼSCDZ[C)R\Z UyaDʧg:Yte仩W:9*; Lt] +lhG)2dMC*xaBKfKrQ^r;sz4~ؠ_{[I.D^+={NĉZ9"D*u3Xwyg+VUNU*\rK1;?¹wB<i E[<=3Q-ri &:߄-_מ.u~f8UsILd>tܬv}p-44*b7K"zCX@/,EoF(i#|e ]ۖc\9*6t;a;t5v(n-`4R_bExc674|A`. c3mƒ=t^}}n40n[[ۻr)}*{}$V'!wqB/$%I$_h SG 9';^' & 8EzEwTXQIWe + 0}AM5V$^. *ݑPF䮐ش7z]hJzAv6WcjGd錨z4Ǎ/u\8,2;Fgrs}2 n?!;pz'%VO&S4e Gsɏ1t"x,.p"(Oc0Bb*] `TO1Ggݵ@M&f !"Y`P^,k vSݿ:ћӖyu _hk$_;]lkb5'Qmt<reekJ$>@{5.VPjfa" zgL^5S 4l^oׁsfPqE>H]zRV%UDqAGoup=~g٤ZqHRDY|F|VW#K UoeTh ZՌWf]}c` HӴXyw[&se$TV^"62_DB$ݠQQRZµ *Vu2qryZԾgJ\<h@HL[cРHگ7 [Z#B\.Vz751 `AmEI@d:n}'S68%ż|kN$MpϿr,'2匢o>Ζt95'~F^j%p)(Ψtz<3Sؗ=UM smsdz$+K"uy @Y?vcA2'~4L Nc}I3"H_ 4I {l^l7=A l]'5T֜ |qA bʫYtTz#ڟ{П0;-!pHy5MLoDU JiL=ne!w,(L- 4*"14\ka-K5x-[ .v͠YQ:EmA{a M<ʓ Wi 12X!(p&6!Eiy)(7̓3kY;Fo*|tnsenB]Y@nb\M>rG:0ݳcʮ^z@u&B~}S9͈;ӛ|}NdJIe=9b $=Ȋ 30uɛ Y8Y5ܥ)c=69PKu` *UevY$0Dr]Lܿӳ~烺{|Q/{VNF;JpĜPw2E9Sbq[[3`:KD)E:-q.R9'K RgrG Rz#mf_DLA%,K(ef?eeMH.}q]( 6SVvۼ90bɈvy}L\A:Z f4jv>N"м٧OI-gsÿ-_RФYRaAHc[D] 8(.Xt/ŎQj!Ktfk齹Ͻ܊-;7f^]V9Zp7XG7%6EN dm{X?X$ͺ;Z-sP$Y>^뱐DG 4ӫV:~ ~RðפvT|T$fs&c|5ڗϲt_z`xwgiy1F/#O U^8 ̜or4vk`gAT!zΩګPh?Iv&.2H*`0QG$.%F뷟| g#iM&ԃpTӷR rIJV r{5L:fQQV }N[地kFc-AUkȱ$/ु$dBR`)%`Cr'>{L)sOtuS˴:oVRh, A;v7, Sn#(F0\24sիt xƗ89 =l3tX}RӉ55ЅZ䕉yFamٔʩ[}psVsN8XfcpOsǠ*Bh??;(W4,ACoņ:vE)˘_ܰ~y@ns?( %JUUY_ف*ݪdM3k4ql_hoXKO e{Pt%9drj vryE'3ͧZ=?% ?mm ;"V (l`vr"7f]:Í ,]*ۥC/7 J%KYTz7BÆ#! YpZ- H +gssig䁘圹,˅L5|捜BFʽT㤕izâz?i]wVnw~/PiK\}KG<ҙ2[=jp 'V4yI{C8[C)Ë#ýӒpFvc_wx@ITӿf. HcJ!1Ȃ')k7ha*G)?cRńĂoU~=O UDf=8ccGㅘ(MYE4g JY#~Zdխ-m E$5PDGK>0hUgEG~jҔ`XX@7p'F\h4;]І"_*y Ʀ8Mg3.1ɥy;.LpS=r'~]CǮy-WMu}2;aSG.ܚf`_~CR=K@M wK/T/` 7}AxWXc٪h$ =mʈ)W?0:xFޛAskzX4s* ^R#2?:COtCXg*vW'f̘USg8 ~~L9SݡoA?}H7`+@hC#騂u U⥚tUUgZ;  \. Z}sxO " ؇,p=\ 3p{Umtv}] o+(2T:@HWs"DyİFvn *S[3 p< a56Q ,?" >gԜvskF UKϐMa%svos:v0np>Ю=h6?><4TTMggTU{ m \T]饞4yPH86]sީ*|~A@޹*VW"W3U-UNm=8` PNMTg08Y"$Z-2rn ʲfm9,:v0Kb OC,{DAjw5]jv 7zZpPh|?h?O+5V_4cs'eg*,\MDzWX.W;gL9@{w = €]doDy27Od>ts){;wU]yǭSs9v-Y|E"o{/Ydk4&nkSm|EsKgx-'ϵ' fa)#Y/#E:XEDL! G&e+[V>bau:lxI# QF\]Lc{QCʺ1.j#!Yе&cK=I]֥}i 7HcC6ͫla߃e `޲_]kCR VK-$qCL.&sݡ6A|kZ! H#&8ͨ~qsڒk> t`}h\ԑNlfLz"S)V Q՟9|[>@MzBvn(G-:'cIPXXX+Ñ_;ƛ ڄ>mm-n#mo d 5InmJ_GN "O,M@TeQ!UX|'n|`:seTv#"od݋gLEE#ĝE OR#[\m@*4Gkc~qB⑥kI:]ü)P3;[柪J ht 5m`[M)' Zt(kj/P~4jOF5 XjOG \s1'x9yXժ_? _Y[XlƁMr1nߒ W~xxMkSQـ ښ@V%9~0>p,?T M*o >إx8XxBs9ULkɺ {v%UQb"<%́U|8sPSp'@epT=}FH2w-4$$%#>2fI#(ꚐХW~{"Kdlò0 8%:Ą>B%rF¤J>W|YIX!Ǿ6ˆzc4Fh(:"ڪtR̷MEE? k_YZGN/ B}@IzX iH,bkrTmwa/Vƕ#B$ yBbVUp[iT%śnXb#=.㈃F7.bm[t5xO#9ⴋz :J ѠQ>ݍ> _eTcF>TKN%mB,OG1n -HE~gԊ`j&`#Rk٫Lr*r^5FB6 ÞB֔+s"}S4{&f*̹MT‰xl腸ѧKS8qu"z0:iTYq$u:A5U: .3,X EČDb6`!^NLEY9_og5[m=WFM oa#O"< TD5KmO34ugX9R?ۗ8U+墨сlA|9˙q=)2YLI{h&l[54FnT.FTv:mnGXa,85So>zoҎqW,^T*xo!ddn=ƶnr,`4JJ8ͻ$IDa·3Ƨbj蝈"^$) aQ&CY>y׽[v4L7~ܿu+5r$[dbCژ["g"9_3XˌᴮTw b߄}$<ۘr@t)-2|SS⾥NvnРvGTěM&_Ukد`%븿"3efˀ]577apg|ǔ~7i^ɹBt. l)6 R*:Q {5se bۀƳJߨIj))f£O>h ʧ6WO3=Hlrr{i!|B8ub~nЖ&ft/ ad4QYlH*GaK]H}߆oCɖ=PX@$Ҹ櫇^j W9&S'&lI6:D/8ơ /Ik@#ח]r&(%cs p{ev}̸vZZP؋.<7Ûv՟O:r%v@US }icAc"w1uKWgr(F g/D G6z tDywd9#dm2 Tph7Vu'-~AZk{\5$T*"lKG%ȕkjz15Boʉ짃 rF)2ºUZ919' LyNAWk)ZTg3%>뙭M..3eC|/W<~:=O^DžxOE #!(5r-C|y~i$~0rsTmG$TACK"cm~t 7b|AK׃RO O ؔw<-Jwe?Uhė'O=Ψ-rNz.A)L2A# s:p3p61 FBR'8?Rӎ;5iw<)?r &&K{v[,ny8eqU~cFG0yri,ϠXew(\HK>o'Ahs۱W# oX>++' =gw\:5% T1ӱa&^m>swŮ!EZ|m\r쌰»^rq8^ܪ dSY|4]tJU}7ZB5f#کq;0)H78W\!="sZrpY+~Gjutn!pCW=?B$~pTb.VO٢n9R~nVGD[q~jY1?sD49_ ж6g !lv8sEAm7WKUD@LR1m+È2l >Y;r5iQӨr uaH_r2]aq=F~Vn;XqCy=.>5{nZ$$ssm&ZZbz dn@oÏpD7&ovY g*L &ִp%$wps<{ԧNQg"2-mfcO-sqoeK>~TޱAE'[1^|Ѥ|TK|;>ךB8N=3֣dZWvT-oF8tQGY/bƯ%h'&]W.eS:]YMp's 뙢q7,P {[.1cH蒋 _,+8'77HBU8 `BF~> ji5FԺ^ޗ{ʉX"|G(|~ o;W1f!ETZ Sơ c#nնCԎ sÒpbViSkl`01lPD}nw݀M>B@cW$'ǜɍ g*E`q> DTnk]ƶlL1,'I@<ԧWj(ð-O b"L^v΅rVOy ̟{.70;3D02_ QUBP^4:E#[$SQ21p׸3S"g 0'چ +|T+ {[Ouh+ߍ2v ?a?B5gtvz?h?ua0t]#يKOI{uM8ǴL ʮä7]Oz3V=zPKUeN̾'snli;8R҄JY"hqG:{ELQ3Cdȏh:/@M9&U~5L{zqyBAɆmCc~ =gie!O_-WIn 0I~(0w̢Ga rKOg[mIXU(^Qpdo$E4(૞Rc`2[,U!j9Q8H*ܬJaD˿qQ>xף,P-Qn 4&[Z9%}9WDL:64 R|ӅH]2 WJ. YS-+ n_m\Q^oLEk`ٮ95"@c Ms}mWT b|, EPC A>ƥpf D2:5F gT\לQ`Mnˆ6רJv8We+&똖n\x/4?Mݘ{3uU(g\׌2IM ey ZkEpSj@ F}Wή z$ҵ77ƹ*$<-R[-íͯ%V]>%QʙRVêc G ]ESfnyޝ:Aj~83gnյh:d8cP7W d#2Du{2 E4jĺ9WѮ5 8 7!v dy>xC4"9mob4톐n \>F|epeTWZ΁~(} nAR&SNfO3n(@/mEojajpsloPFO&VeV,DiPrv_ʰ!u!jy\;o'j 0bZt3>7o0j`;GtC]e!? -|V 3=hЂwϧbT:#}'y#* y6۱UƲx9p1=Lpt$.jJM UL$YrڕRE _* >H  @;҉884rхϠzdY|Zk㎠j"Eͦzq i;Osy1Ƣ= 9EoMi|#YDS S!nv-١=bU`qk`ㆄtdg%OUJvxH*hc3i2f}dy+kcDUh~F6AxOꢜk3ZW$Ȟd?y@i,8*(/4:Ô_IL0@e" z&Ǎ_D~{O֞>Tip|Ъc2ML[x#]22;)nM `֊>yEFW:~fLg\Q${?`z>iC@GA"岏J`f7H_FDGm(! fS^JE [dy`ޕROF۪•12Fx}e!ywj@!|2銛Z_cݧb]k  ErY`<*ȇ0+v0pP혴J0Riz%?ҕ:Bxv..08*FI#RnKO[[aG2ma@;2xط-$j 0&&W4uJb&j{8gyW~{DHQ᳌,i2b+PӴ+Nֳ +"HCdGp] k`pT~!WkM\hJpZmb c_"Ǟ TE/Oxx3?PO4rnfO] . VB-v-о/jkgF3sSa26)yupךsY>/[&%>#_ (pfc,[mw#Z? \ õ/Vr+/P* A3-S+(?ֆVl@gL6)1nބ\@Cl#դ o8e{U_YZO80>8mЄi! R= TIo߭k 7{§l?m8zNJ?_1Qv 9-nDަq.E.P~89rz}[Pn⪩v  ™H4IYIKO< a>Fm%vF~|/kZOJ|͓l+= ص-ώP?=p  .( .}PE7HQ dLDOvܻ}OD|I*s(7Ϙu5ސS~8"%'pvϔsrSl`9OgKV_m@M8 ZMx"ĻxC5n٢L "x&iߚ 1faiFV}yaw2h`alZ})k4 wzqAY>۳o.LZל/pqiO e&p5 sĕ*]{霫g#5qJ1y#k63cC ż')`|[?>+?̼,w٥3"`g+( i:9+XƝ?a33d"aF{ `8y$UG oƒD_$6S7vG<,ٿ46R}q4O Yf0aҜuP,}d~kooe:U&{-P^&2x dKM@ir'}8\MZgH2^ 7 A=/I N",PzzGI ra(e_]A'uRgegQABE 5TC;BKl>p[ 5}Xr7A;~#&JZgdC*VOU 7Izj#AO .d`ӎirݸ0#wb׸g~D=?ŶYINUC'L7T|+ء+k{{ZaΜ۵Hb1[4L8'"MV|y)eU ׀^'\ .͖崟"P2uM,t}5r&_V쓘';ancc&8 bPI[rUEB0Gp0^Qu8q6^/8ffb?]p J4wy#[zsclfJgNpKS`dmdx܀w8YힼZ/1z.un/S{Ⱦg,/Y_od"\H/t3OsL쓦Swb.@nJ#w`Bd?d3t0q[&ȱg*CJ&.$@F[3;,&NZ~TZ!s;cZSJ }Suqׁ/`Y_q-!|rBүjfwŰj@v*N0pX+=H #u5%㼖ǦJDd7uܩLa?jeݩ {#l率DfD+l Y/TW5o`?Z#:9=I.糧 N-Q9=-9~^dV mvVAsQnQ6އ( Ii#H>IdA['x9$Q$ap/oDZuYRX^Ѳ?nr s(kE0"=tbǃbQz{2̈́MlPC(J}L:^f>d@ޣ%C,B2'Hbp+6kds2ӶC!y< F1Tv|w'vQ|! t䐯[."4e}l<RlA=LG0 +6-^ѫ)pyEb4l? "޺ GxHU$ixy'{>)ޭ P2,zZO€X]K_kS~?\n0p E :|^rXR A$H} Mx`꺎B%Mպ(2d;%o -͢ȗ~;}rcUNTwM*O|z-zj ;PНf*\q!x fQƵQ+ڬvxGlEcRB͊7g$iAwI"?yhZT}>U$FS9sc3^Xdy>ٴhwB{7}w? wYK&m+8b83!zj qn?3QD??IYJŏz1M0av_?=1BٙeCA;R'ϮxDM5&~M w}hIU9uCA!Ycf{&?*P~wt(K6gDKhb7/S& ]]AzsCɺۏoFE^4|IfP K4]"c#TA´dk $ڠ /XZX_h!.1TS2o8aՒ7*P4v}4h kjKDmWω i^߾g!8-M3\|_DՋ΢ae9nlɕH7М{Ž/G՜7Eۼ BMri(sepfo itb_S47!kPќ[BUI dG|ISTD:ҪbƯw]֪Z䧵a56on#}% 5mdF|Џ)S]h M^TρCX ׈WrByq?G 2`Oyb/O}3#H)jޞn'Â"y6RcT1Lu|]үסzu5eT_e#=k*{TJ!@[gM{} };~tK~`6!:::h2IFZ7N2eAb0Ź%jV"Ο߂1JE|%iʚ$_tz@{,( 2wH˭ %>>|TnLvg#0^S@F!Qޅwx.[Ԇer*a-LS1v_gPȼ[ 4syTr O]PK3 bVLsVaNFIIܟL"5 ʡ+l&QN+aQY'WoWD.q#'ͣܳKhUa:ș Y]!k]q:F(5 -_Q@xĭ}q{ E'{2*pm@PU@ 1/Jծncux6bmfn|ywJ28r zT2%c|r~wzm<:;n@秆Z㒧M\Hq,S0\}X'xG4[i^̕aM3Maxwz1Z+SAhT=PE:+[ $a +Af`in4Qa5iڽ/3/n;[mB/wEd?ofH"Fh)d5&cy⊨Ďg ˊFT`߯&e+I ?>y焅'vM捉h灇0a 7Ovˊ093%49گ9\M-M삼Cs|I]eG&2yz3O.5…qojp=%ȅ}O$yo;c} {ձOpV?DFs{˱/jNL|W"(ﺊ ' L0)^j,+Ŋ Ϣg n0]wxiL\Cfv=ןEI5cFSzG߂r8Ep9(\ ?4H2=0>fB02GC֎Kjl`%(K{:8 "C^ HY6aG9z5z#OamIUF Vդ1lS{ $ҭx٥aH'-j}?T>RLPaۈY4TZf }hOK{džZ-6cɮ?IG9da|4 I 94lUn% .~>UC^UYKAVl̖p@#Y㐑6?1`U`a%dkǭߓٍwW  dnvHT^%Gk&)PoP.  A5ĺ}ƶ0& #}J:Lhe+=wނB=%wM܊$9*c 8FmQD$H.QR]eOC5ۤwsr(ش*X6 1;1L+c/Ƒ/@VRo0xȗ ޖ@kf<)`Ѯ߇v\LjBz >J3b[;~U^i?*܇2(&—Y/ƻ˩G} j JK9:_^LvH(%gX(xu: 7+aUլ sҢ9G)ȓCC((ϫH K{Kdʃm/m:/.PMhH7>א.mz tl >iy^ENU,.|1[;2s.㻫̃woA;KQ%ReL[t-]NӐAd}+MIYur?LAF S.5m%wN^A{BP,/y>_ol Pt ތYdHu>ւIh+ޘ{7ف*og +:A,/5VS݇^#WRإ-wUk/%ʾV"gFgW ART.K R$v8w6klET{A*ޗgDl=tcÆ$a|cZfEʔQ&=O|F/eDI\DgF*t쭐f:er_4׌"TUh:.HcgQЮavXLXnnB\e"ЋTbuh9.)+^֊ 7,p-41z*V#,,•]w٠ _l[RbA~ѕNz8y]Ͻjh ?`_ m2/M֢Z'ᐔ5h*:R7/S;r}/ROn_+C>TBN{%2"Rkо B O :hã{ L'9}bDyd~ SI g)Lm}|RBƸMC,RṂz@dBnkSHZ'h|2\{--tdLQ̩4ѹ>QPw%[RA.6\6q48=#\VlMN6 bvw.)UJܛot C$IbOf/57h[3& (8y'3T<\N?Y-(mfI骨_ Cɚ3ezM3Ů=JF~B Y̲.퉇bw󴛟"ר;y .A}?`+2 H}szmml2VDVN5N`{E~1hs7}n IE零( GFsjQI ?IX9ƗpUJ/a ZTMC.NSd+jOt RueqQ*>y766=(S&9~M}ʚWK_X})xg:SX|@`]XWg /]rgL[wnⓍҞZIX0NZ8|ƀx1m{<%A9\*8rWbN='^'Rٙ=/N?T'UҶb=1>\)Ng=|ChsWW3mJ&YkԨEp)ÉZFdj}K.ofE>Zk"GGgӐ*;gwA>" ]JtIq2V.@wcT58q==~Q?!*Jld| .H8w6H4 d1!)V,dv꺷ȑ >eqyb|/r3X{IA7 Õi8V5LCDpRWRXؖ- ,Drt+Izݿӭ8rSpoNO`զ_wϷ"R`%'/Wx 9AiiCP^dJ;+~Bޒ('dS8fxf%Ew@>ΕM)å] rj\+Ck~YI!E%gt h%knub97qnIRw7_pz>%lz$A>0eUߏ^+yϸkY?"y.+_<ɃS1WKFuٕ6h*ɬH9 ߏ&Wq)o.Oũ:RGA)#Q2?oc;B),%h.*-\GtPXr0 dwC~晗=xt#'|6\ |h0}^ D # IY/w:J"ǽ˗)7;/C('uեId3B؋NVgfUضiZ uh_-fi+ye_\(( Wq~}%G]9ǒ)APr>dp]q9UzCǸU>`WIߍr_/:3|J-`c n h0r=q2"K+8d:CBRU;瘢؜R|:Ոp`f`___~: CtޞRAfHq~8_c^Nufr|,c !?[/bjNBPw55U4+Hl~y`|6V؎dƣ5 @95R#AE[R]wUrd]?ʣQsC~V~J "3i{#?7_hY@y( '?tp}E*ٱ >P1ORJ@N[;7IT4z}QRCƸI ƻay0!2uwm:5J8_B/scʙԎG ج @%p7mb.; ;ivK{[eH'] I/-1?1+H"`٦Ts{P:~=z+fÎԖ`ye%*H0tltqhA~`ñMteoB:Q(k 1#Yoq2W[Am=88ŷnxNBur|U"x6=.| 6*tw tJPx;W{$ ޒjuck 9A`ms"΁iѱ7k2**>LY9Ps/y}~P\<4ߌɨrul'7oɥx ĺ 㿑M]")ipٓnmetAtE?TN;t 1z9Kmp.o5h!XmTxxU`MHfDiiSwOLd/J}q׫i/w\5GdA_9m^!YBTDgw^wJlx =hV&ؼ|{1zԐ.͹ R6ٽM %g5Kгzs%s$%=k?L+D!V'@ݟ`ϭ(ȩ6`dROq^DPVRL>St 26ꉦ[48ji'7ca)Ym瓄"T:~I{`P_d%')GuYd]z_fHESo0) čVV[d-;vI5t|=85Dn^bD@ (߸!%tQFfxm +}rR~Fz \JxPk?`)%n"1Ai!+ TR uR'Y7> jo19!G)E4z&28U$el_;P^FCmV!VV`'luZ [0bӽm.9r+m2^W~ CHT4nz8XzdCF=%ű )^;c器"8[I&{ w V,a>Q.HETM _AU3ۼoD6BEun`=vo1Zsv]JdM˒T1HزWJj)Q4FI夼ޙ65|?1UF.XR?hJ E,Mk_xǹ*rͯlby`gSrīL_flg:+kN??2Pޝ:xvc L!9>Y0 Ɗ}uh)i_;qAQQ\IdxWֱ~|^Ȩ NVHd;V՘f{hINcQzbYP(qԤI}aǓ@OՈ6X(藣9K}#rhJ#ܚB*4\ 5S@a$X Tzt@ Լ59J&mpj  bxs˩HA6CM;j: ԳWbwDPYpf$V\ rft3EDGP? &|($'{i|ybDGNK!4 yܺr_sزS{l~Ui\uzjgŽyk.;E,=C.o5;LpF-moѿV=_\xu ~[[ZB:6xhᅂkc@v ./V0=R= ck⮤]v%\v&O H)\g g|W'Sf@Ro/( 2p9sm m1Cq+ER = :t g*U +$xk,~#W&jH 1gd1ǃTs+$ 1ezsx[ )}&+6*ȞP5NuĹM YsWZl=KDF6I% &%YH,,zƐ lk.+bZ9?w7c}WqÀ}4ܫ @KwXKQ5|0/p$j[ [@;864xT9(%;??QOY0P ca%zd-k -bCUO>' NJ̠XdFVȖDI/xHÏU5ǟQ[{?Q) 8^0m10(*Ph"uq曔$GXT#z(=}f K)\Ti`Tc)jٿ`QCG |[Y%Z[GtQ#p m$x|4UIo1E-޶ clf5[(v |&Y]x~1)!M1"\!v%MdR+ELo&[y 䉳iq*maX5)Z,tNĪtBC u%;%cn3!/B*+xƣO,u`q 87:Ƃ$1zuL׏ݶ"Z7^FXS~Ja6Mk\߸_oqucX'd#s>_uJ]PrUr m߂߯fOv%2S}!TɅ",VsuĨJ0П:IdK>m QpoAoݺf<\= Wʉv-/F7hYba`3g4^pdGfeq`-3~0*!S{PN1:t ԁ zivTFOVfI 54rqKQ8}n 7-vnU S?vQbٸ"E{ogkoK*+Τ$IYfs2JjOK@٧'0)ᚖ3騒 JX%Z)XLDC@L&F9bt{l@ř΃(%*A1S0ȀK1/8\A8^{i0BsPRc^5XI3~L͇zv 񒙧ҥa>mqknݏZǨ[nZ$rgpFN37n-g/yk~v9H?l<7$|* y)(.I1i=oU/+&R$9n\\X29tbY7+iXv aۉ_' zLjw#}3:nJ𑖆WڔWH͒ĀxrP“H $(@\NVI27-",}n@ Cj`{Jc"f3Yqj6FޝkFg+Z2 jX2bL[g|(8|Rq^WAJDnzk#'dCaqdQ#|e$y[`'v%$mmi̫yޫ6n0W6;!W UIL,<5ΫtMB =xjOsBʼbD@!l7& 匚F E *6Cyf)W<6x )Ik DÅXwf{)¯`~u{^:Iw1:CAі2ݢ-dQŮrJpqe՜_P Kcpn;*$'{E* O%%y،~Wxr;.mJ_e4!8\?P_xrl/UQ&Hox4ԔY9:xNt2%63B4uD(f8Sezk-ͬNt :bbX&˛]'pgJaϘǾƂgQc NԀ۪vid^.TT%Qn>$o(ƂjHH8w{K#ykdN&Y\㌃l%?yr 5t;c),Z|;vvǴh_$)+<(*sTo Ti#%;&Pux4bMhd}(JF]оaMyNy eZ;!MqӇ oN )aD)I{WvCj}F^g-V|<-+S I.z?E5=4<;Ej{E)K6Rmۃ%(<|^MjDhTj&9~M'~ -Q`nOjT0V?xk6n4ޣVgXKA{XV]`1c +ٛJ4#leQsV|Ҁ({N8NRתUM:H_Z^R켊~2#r`$dz]/(3pUKDaO`{xB # Cgﳗ\sIsۀ)QϘ 4AvP]5$,&ו<$8w`03dt3{}N$vj`'q⮺0bpGws6B w|4lI1P -11 3W .TM)ˤhuF!?ѽ/:jSͻ=6U6LΤ^(6^쒄 5m ( $B]@^&`8i Ѽ1) s!i4GaVU#z" lư d6PGzpD B va(X`/!E%ÁUTŖ۲x>zeo yĆ<4_% ]ߎtv ly+:/EL݄iwW:LSsX'_hĚ5R[ ؒɠTfMjrkϮbΆ~Z+n+>Y쟿uzVh,Q˫NtpD7s[Xdʗ{M~K G\5w]"ޛiY&GuSet?YmWymp\&!wf7 LݹKueZdHAɫ8 [8$*,#7F/KGV:wcyDdvÂJ-?ZF\.n_Jȭ̺4UIsUѯgL؂u3@/>j&vͨ2h)]w?!}mwN c՞BL]U]RQ:EUˮFm`(xhJX:d)QK$) ؖ?G [Ȇ)NRA*-V?ʻzy&뻪姱 cr FCdMwԉ>E" +R;>:Cܛ(JR%03s-Ρ6d"e6UD] 7㎕?Lk?ؗSPOK$$ l]2%g"k7ohD} 'KcFJbKJ )L3a [˹0]5?7Pިԕ+#rLo^7M !ף3OBi`?e8M(a2s<@EC?''W ekpL\2ʙ=ʴ0[vF~ +x|wo%cz n03B8CNn!~>h2|;y}ԄJ8IdNX4%Ey?(=c,qMaVhIA^@&vӋȶs&zbJ<ŅMD+=H3EHD(S3}< ڠmw6څq`4j1M>dHX_uKgrۍϿbe%p>罹!ʑ՜Ls7C^hfFY|d^5}'R 7#fdͶIx aF~> Y;GTz{ϻ,k%bwE`J`>*Oۀ/.}c>o貏Co' ^B,Zo5 syxq  $^l@3)Y`djPJB:VA̴AiQ "&Dp~Z&A\[b⼦ݔ2:Ӣie"ө;uxz!b Ѡ&JDI}}@c^ϰ>} %ru9 5b{7t0DW('r:n%ȠxȨ_F" żkbT ep3ڡ7e)_~-2$HwTZHE](\F$>֩6/#+Z ΎEdrh64z&kN13c/ZNJc Tya&w96)vVQ&9!W ,+]!_DcH a1բOŻ%CM&!KVZNX6n\iC,4J]Raˊ@fb ؍EVC:' jڏ6ENj~<Nr=C[n~.刲5 5:a"#m]q#z@,;&ib%gO~H#~S)6SzhN\5iap `(&0x_+Z)nnm\0L[?Q#̤Y*7xz5տt 嗦CƊ 9~+"5TTE?רl>|nS`[)]KL4cj˿ 3W縜 U|j SC r˘Y8FYc:Jz  CuMa@J ^BQDԜ w8Ǎj%,U{ iˌG8~YN*;nS`<-%8↜ $2BڏˤY c BƄO t"j5q;%Fd0$M?uCp(Bfʕ;wc8;C,)QvM[+}%H"Z~js:%fǯB\=hމSQTS + SB9Lj$4bH՗ُUۍWeU6!N9ܯlE0fޣ!ֈSH>m&s&J*QK+_h@}҃o=)rϋ׈#^C /L+%gyOl䤽\Qy2kYUTMR$rB &xC~虔nwid:޸vDtHJAkfTsYYEے2vD i` 6J dF067AEKX1}~eDi@]D#rZp;6tktJ[! FVÖù&fo5dEcJΏ,%L pݧ<%mm͵ghV(khq [dFqV^upB"Z3V"]Oɷ0.zphl=ud9s Tq);%f~P܋:NkQɸ>࿥im}%z٠_AWJ=qW  a J{ .\N8%ߝu$,~4+BA Šl}]IG$4$EW1xo{jUMGu\QZbߖVW:Hy}-wX y]&cdD E?V:6 pşj|jRY@a~սhV :$ӏ{cJU]{%GCRJӒ^>FZRV{ ŸZGPJR9èέԿ<ԾΊ,%.8#Jl77vBK4g i+G.@[U@".…5k35! \m!uU8=QW/ܪ4G==T%yIN-U@u<u;7Rrw QZpe< /'0t+a3YT2;_ٿbߘC 3!RJNUt^,9⸍,UNڗ-= ^=x}ZC xrgл} GHtOGF^~Fb+0L> X'A%w97׈KtE-3A!2 ?>Q[K=I"3RA#ڹL _Ap(}z-jaA>R9/i$w"fc-|hpÈa  ^xflK2ֶlG)Qu#6;D<_QIûNf%`WՐbT8f" _&J .O3NkSLkG Y0hM6RH̯2,UD?aJMvq3,es7pYk拺G 3fG9] qb <q MBff-cl'*/y@Jm|JP?Z9`Kvs>7 z$#EJ~CryB*@)TF} ԓxءƇu,ywU f9 !Iϝ֘ %7_SzgOUNi}"ɞbF¢PzU6y_ O_&N?+eoGL3}Z•f+?9|[9 hrrt1i[Gc7ҤW?:=3ze82yl Ж5Or$LU?ܫ`Chnw­kן Ϸ)C"J5&8 Fw@,\O ̯ɎN(݂'lvSpS&7/vUM_o gy"q85P;Ϳ-0E>-y*[1C򵣏Ȯ$\pq) v"2%$"+Sm棖ul`!r/gd)D)%&DX1s,!㦞uÌ"$,NB&:7Ԑ3K^+&V\W'o@ee_&[~%BmS_j6UD2c*1DMJ)rbt (OA5Osޑ5HH 2s*6eʩɦ?o{@Q:) Uڹv~ZiJwzk /gedQE"Bl3|)REdh2|L\VrkKu̜\$ [T؜0.f**:FIF't%=(ӳSPi-Tᕫ_$%L5I2#- Il}?:)4lR@6_1>r' eu`ݞ&W*/IϓrMFx<>[Vbv$Z߫ *#'-Ǔ]!bQ%La_E'HW X?tը蕆aacW NhX4Til&r$i*O4O4C"C;sRHCaLSpf qɏaC|-e{jB\^ Qʙ $$#HnP*  Ͼ`9bl&#MtQ)1}bUj.d|zSPE#Ս׬7MRsI6 Oy/hyR`qDʥS.eN$fm*PkI#HZd? {JP` 49I4K8_r4ضmPnIdd1b|64 VSoDr]4Q>zaB^]%a|nIܭjJnc\JRN)k3N=L4xhUWk?cyh~#(DV*  ~*z5T1..'n,!r0sIeq})b{4wM{Attrx#fQ-꤄jӘWs˗%#. _{s|{> tBA _t/?2i)2;#.er'E􆦗s,h4:'aE@O^ʟmS}AA K$YDm$œgyVs I6WΰE|JALA(aYՋYg <2~= ;@՛J6H?:Qhd v0,:|a@&qW)Jd6#A sY~¶q%o90\$^L egi:oD ,wŸ?8;qbUNk aiVailp|Z- Rpit>-rлcsQl_YJLyJ}b7d񭂡3&qYQ"_l`yPo墊vQexFaz7V*ġ7#!^FG[,*Ńk; 扚ڤ)jb|}HSzdsA.K6l۰:-~͕EE8-! KA2D|tz|hhq`m0D5?6^xB/ (Q? |Q4;Nyۇ _0Qd]Taew+aoPWрJAfY2/Ņgy3kEֶ!2:̫Oh:4cOum]Q~+")Ӎ-Ui#IW?s X6h]ApC y&hr-s5ƣmID?/̓; p_~"6ONFUp#Ž w,^dd]96NRvHKO@ UK=aB" 'SAI=([;)D $/g C蹛 k/!Do UhN* 5'1ToN1sDli'}ɝ'ƸvC-(suS:Nl[ӑVqt9ԂH/IH^ k(Z .)P@˓)~]J$]CH`=LO7J2o갯҂P ;L.ޑ)@۟]E~{%;O@dn긔B/llr(W7A R<&T4 C3ǫ:fr.3yNN^T|؎=^yDƿ+B{738+fN@m)hY.FptƇІE~Љ> 1?K2gjއ M3KrR^ƹ?0Lh*/le߳Ǝf҈!=N&QDI[qmt]oS<',Mh0"i}45,h_lqJwZ/AzSʑDfv=;Qw(ddFae߮]AsNߕ$`ݿ$6_0T %Yߖ; 5:;l3U7rxdsGT-6W2d4|0@~m09 k-mG=t4l~L?w(͜eh3-AWTg!}4QC .xC6oH1H>YQߔBq8C,c/PZH^\@6r|5Nѓk6?i<@ '(&`{2Jcf=,Cc {LBms8_zQ:~#mC^B#\Fݲ.l󈒔{~OŘ `3P`` w!DkPN+2Vj=+>fSsq1<&wέ^;KqB3n  wXyi. IbD1?Hm[qYA_mqm-ХpS)zu5,3+tfk)dZ,-DnDJd[1}@֎QiR{#P#C1gDs[N5_NZ,vmͯ5яo%~V}Xвxqdu!4vk?,M+Tpvm򛍚?YI>:6,D}u&!B岧nՐrcD?Z"MAm6PnYp8=/nr}ϼpOioaKh~)n^c# ].K\fUuvXrb~27y͔kyjgspS `WgeQ{0±[~OAv_1ţ㴀$èW=a Μ9+hezH;)񎌔7p1 댭i@Ή7-.s.mj*`v) 28 5u[YdWeXي74%~PA g+MaR}٥saDVpciV B(TfZi_)&> \Dl4+gûqPՅ !"jf<%IfZӤfDŃlRO4o)#y}%tHGL*~Ā~E8_OB!ff9/cMԀɞhGkn"ŵ㹕|9=2% oOHߣ@\)Ȉc0[\.\bVO8O̠4[x]*F]s! l=\owimqJmNmc6M,#Ϙ^@oD­plg'Uĉ~zf~ WyFhF2)R}v\ͫȻoa&lMpYt)x7X,I<]}Se\ rZs`/y`^x^>8?lFc1 8ɓh \B6P pC:>aԇ&Uϼ%$lU(\%^,,ɳ{׮{+UUmWOg6@5Τۙҳs"˒U64FFy4Q[Zy#6Tm `.^62IJ&;{J^/"5 %E"ڴEo./0$}Xj}v ax.|ljb9~7VDc?Vǒkc-45wp\ 2 nצGn^ 6JRМ6=r{3ml7XM{qi@pІ J~`}_ } Ȣ'2T\GqR^c`~\_@3 ia.IG>\/T{|> /2cGǷo^T5Ϟ߻yv a/iF>JL}GMqpVrwb=Z r( XݲX!Q^?Յ8:;hΤS">:u([!r+0JG'/Ke _'.b,30z9_tl*T 9@cz켘 Dum$G?[['A%Nj֣<{^`0]UV`"uݵԄ}, ^\O |Jk~ro.MG*9EKE'*Ktj" d>z?W?4) 5h 8?޷FnF9DOFiK_t?ne7̠ )'wh-?0G$o_eČěHy[a(-y VS[dOc '*]dn 7!лHa90QK s dpz#%"c=M3vSU$r&nm1Ai+f׷v-bB=m _ nбyQQ2zE\L$cU~LROؑ O(tQ4Kd$sh4y \θG; Ag&!=+%YMڃY}-GWc];2ByZXYd]0JmM| ͹Eݝg$/跬v2@־K#nv{bKRb K@=@|?_ϟ_} 1X5z'x.=#A] :Rm7d Ϊ5|e a)m ̉)L: jg<6?#ZRˆ}\tOf͞6e Cua^X~օVJ9 ͚syѕ`x8|MBXJANO#IuKeƍnCE}%(=X'8*p=?LF>|݃jgG 5L-4e^LOe1Br =Ɏ3m</ 1EZew4:T /NXaêL4W} Pq>+ xLZ8@Bnp}x*#( |+ cZ DG.}u>}!N1 f4?kDNt!2#h;kE3&{%ҕ%z՟ꞺF"B`w_ kp76."YDžHfW3syEU(n%:\v S"w&./xdI5 :2 %`p du13+wAfwJa?ЗI] y6[  x}d6*=wTVpIG|z$xrGHDZ1Q>Sz՝3"xMB^CqngKB2 %2;zGZ%8Uj̘o6xAQ ,/6kVI`ٍsXb&ȢGWISӫLo\ 2aԝ8GMHmb[햸'c"ҀrOl8.mizHw$L.}B\KC ~dr ^' s4e "W襁>~EضHsi7Q23#X#Cl IʶttIJ+/wжC^ FlOofVAr("N†qo+9n2pO-ljK2*D|BJIbnmC%|1sU+Sct] nֳp#7қoZs|, kv_$C|WnUCo߱y/  H`,Ħ k,7ܕ?D˂9RPHE3Z ,=ޙўhuo"qU};)<8~'4G+Rni> uP% \λ徊IYMXwlj]ƪa|$󓭇e:J7*J!bm=o#k_ no3`'Lb@Ř<Y?&K{H'i7m}ԢH7$cDpc2u;^PDߘBK)/l eFd[.oGQvn7p`ڰABno10 Hc_6U֙վLv虯tK#rT7_Z&Ogvs4eǞЍ'3LBioU2}#LeEo—EJY?޶),ad&OENu ?q4}#_`;> HKTP1aUvZ1\"$Kn[k "t,=e6/s=v k|#R|H ɓW=+ź?+t5z\-&yC= N\EG-),JO Ρ$f *=tLO[WvCW݀{0%8L joo2%sv9OɄ"| 9#Aj-XPy2`xON8Ҏ+C Up "xI`|~$dy ɛhE1C:u)hm'8z Gf'ӄUI}[{g7R:I؆T.S/C>P+)2Fx5?6 , 0Tdp|[ea}ݠtPm ,Eg^2TKӫC\TA~?n<*X%?-n S,]y OYg@c);.5& $o! xd"!FYe`̨Iݸ팆۱o{i} :e*70ARn f:@RTB %pPI88Қc@_enʐ:śN9$p` v&h/y+Ez]xFg&dV=Ӯ COr:#TnXA[cTu _uk-1 2 8CsN[7?I{p/ D{X0iuh%M91TH Ej4nE՘d"BP` 1u%k}-~q8r8_?HUhzOeȌ@yQ7]#"> JQ4]^!Z2.ܞR7yَ\Kn\:m[Bxt9x?M}324,xem0caa {<>:Z]MCɕ^_# ҋb%_MrSەe>?;YU:7y#SxDT\8kz%;OjKԗ`%3*x+ϣbτ+gՁ*E?IVinxCBh `BJHve!c";_k* iW멌x]ϊjر47~%$kGPy)w`)D>ȍrI7UXpf>S8dSyNml{O~T56c")c3FE6F$}WJv p]/DIؓw8et,H?5;PLU5eAS1%oΩ}y|4I HgSӔT'9xzM*xen-p// V4jfo$090Zxj+q` {(AYPŬV9G %*w>98&CۜglP,\ }c&ol I#ꖴzNjRM\1g v𬪈\KW,s ov鬑! ̛S|yY %KA'@:1{ .ЃC 1"ȿb=~5]&^vIQTcT:nw6V>H󪒭AD̐am*Uܠp#|7jo>ԜF̂REF' ݳZ˳->H$T|/q^AM 9DhBAL1Uֵ:l=O{w4FYqa<"ns!_{gc(k$^A+*wJjOzsXٍ".>q)bu@gV6pZHN|:#Sކj! 6o@)jQxj/̘ 5e2#k9P nT7ڛYjbQ Cȳ։0eNjQxagO hPޢRb{m zbX)g j_ŝ7?0nD$´ObfoRKP&0m'*YDȅoWѸ ИV`D '7^p8y ڜˎ(o0H:YQ an5ֵS3űS/a >p-q>v@%'Kelé4ȴ;AwS"y4-!ᙾ%i)*% W6DԺ9_07p" YF02p]AnmV9gߗ6^WQh)bWV݌#!fAJO|5=m? LF|wMFK8'CU#j&gEnXޥ5d.;4:ي4aSB")'dZa|OmQ+F4__m.ބseCMpBA~8P+ʒp9%DfZ~ƙLѲN{i\G8d{.cl-^|LM}x8Ur-)sLhIig((]$/qx_Yv 콂 Eg~ކ~݊K_v"=Z =Usbwe4}V}}46*ۡ ! (P(Fԅ KB]5m/\]W]ii,wbǁ[:_ݸD6 !jv]IF_F<\^Nby1d'f%C\LI ,h5@]9bhxׄ*Pd<BW*~hD9P=V#mɬ 죒/t Ph P9Fj> XoA4f a}F5fX%~׏ڀYYr[Î4K៹(z^Q⸪ N`tx;m~yR &cmg'~*"M%r\kJ*i=t0= V h\3҄ &5jRk9(Pu&@`$:kAdI AkS*1y4U%fE?3}L2bNl ߦZ al㊦YcD*JlYt^W9*wI%DgJii}k>/js}.Y {~GOWy87 1%ļb_ř0V),ϯhT*:‹Y*Ci EO,M|HseG//뚞$Tcw|3'1N\l4 6"lV6adbI5P%f=nFr6hL?=~Mw!5(,3Ϙu]!_^<s[ Nx2 %dܖXkv J;Oxۂ:,R3WSA2rNp9bs&+k+F0\S GCe!(`&b  7 BMno$hzɂ'WF]K5| T&, D10B=[ 7)N('\,>ack[>LT ڽ$\-//U7WsmUc.ޝ\T:cтRjbځ _g>JĪJeH_bq nUj Wq]0sڬ|inx=fc|&7}~0 E7ֳ1 84f;OOs&K{|r}!h:]@"-]۴MW93l$~E^rvV<={>R/$VR‫Rʮ~`sXZXYfN]&[o3'Gw> 6c ԺBǩCϡ & iҦ}=d ǝvOPpڹP5QQxsj7\A`L*vh}SwI #[4rޢhjZ-?]>3kE'USȡ?mǗ!ntR6ڊZbWD߭}0|AڻGkJ^ g,p+@Z NTMW 7 gxVr7nB4*DЇtbspsbڍ*r9ۿ͎|d]KXj`7!3*ƋDE(} RVH _>YbyToZ6kv4u[t)u;!JYENm m֙>!mjmTog"tS{H@FqwebJ\y/(eȴh ?,g˶fYg,/'Zѿ`v63.x3T(DJnἄTm99/& 5<*rOdy4Ơ3HS7l`|~(N`HAPw&IkcءU#d$~%ʀ [-#s1v0dM%}+h2q6׈VLNd@,D\Wc͛:9%<^ސpD<91S> =^4,&r^qm{ꌢ{Idd[WwOU}3:XutYLz>0@}5iTz*#2,;H>zɛ;;S; %g_! e14ugBDH\ ڕry}gsw۷)( $^xĬ@kmYAFQl'ɩ7mz)^= iv= AQ^,W!u £SQ)Iܛk,N5rh'a5YpQ!Dپ!B/D^MZ5אf`ӂo%!DŽ"&4 dc[b4cYIЕ4GMC"0|d&7M Iiez9,:[k8zXg,7eǜ0QYh-(JTI>ƽ@|42;m7U֐ҠIXBA.`Hq" $ȖrN46J{]#hNW.KXK~p?(m~v1A $ ݼ*WtpKgԂ#К`8>RG3*`C2| ;̤8ir1g|Jv;c<o _QQS`Rqhr_^L"21 ?=It>3)%:oVo kW]P^AKW31CK1sJ 04m,=44ú]['(­ F?FM:Í; ;͖\ ,ѲoȂ&'ɚ , @6bd߰e.@UNArR5 _܂'g Oѯ==r?']"`|g %#D7 r0'n@R'O8JE={B6F|,>Lw)}3/;9:]QszZ:2RMkV ֊.2u3}LYn$DEX{@-NN,}Q+W  $ArdUj?6uRl:\żB-z$@6u.? R3lx|CE$5 *JVrж^E$DlGg¥P !} cPd5}uU7;Lz"k伫)3WT3HBrz''!P`~BFSXwo'ɻ1d1~8Q5 R;d≏"djTU T^b̞0##4Nȇ b/uw dH5|!,hFyE9~My'ٕgAP`s3 4(&oS=o_ҕ3,p\J+fs3rJBE JY[R5ԇ9~t ƽ"|IQ67஌o}ŋ俥\ 4//8_/wUĄy=89GEV%~љ3 B6i2= @u'TIJ0ߌhɅK>~%La_I" 3ڧ5hpL =` f ]3>Գ~990*`i,b|z+@1 pdgJ J_~}BƷ{~B<^n@Ir9!ːP#I Nbm#WL:r#Ǎ_>vK٠} Hhs'%^:J-3x-<,W -h$p6ԬuiyWQpxi^y^߳k}>VC+7RfdO^I6{XpM :{v<]á0C*Y|Q\S·F0O6ָWF."༌>Viؘ8b6<鐆)NUluh4#0Np%g4ɼ%(|=1Ѿ1d 1-|@Zͥ{M:t t11ΚgFr馥DAn;OLO,ĕ(8DF õM񫟶(E+?o' $r緿IVVy/9<d#Dwڐ쀏RUO:h(6Ja N*ADCϧZ9$.D0ܝVByduC9.>ma`XfνK#%{ zHd oJ)޹AKavMcqD\G^eՀZwkߖ,R4\$9n'GSm狼Vt Gk(Ikf#G NzאF[]XE6lò2j9mIlpe4^)c ?~ɽ L)vc0`3#lK 0t[)pr mq7,Tje = RT&]ͼijOVߏW#;EkގhzK6Ey IH.[1@x%?@H 6=zQx \ 3!뇅7(ZEf2&+خ %H$S$ ŴFg&-<2>ӁZy4AfQ_Xc=f>kA>#ОH#ɐLK(8*t=;$p'С-z @6 9 zЫKEq"e/Qw4E @czNת&J^`A [oEdscCOGiiLFLr=pJr ɶ ŔM0"zcc:D-@cvĝUP% +iE81%+y0`NjN^Ilw+Β /F7 }P80c(aŤ1r>6=xYn='I$ӱF*PdWEPcǟG6z aL`$1RcMPuAD `\g7in:pll v)kL²kE1`~W?o8Wʃr8-+7o"9l ,IpI'(taQlajV7ឈsL+|b{34S9W!$P.dy7Bz rQ' pR8%Ao 4;@3L/{FĐ&Bʤy lrJF8XNv{w~$V(b3_Yy\ T߲Hn(5AAyӄ?O^Fմ_߸NHpD\A|hߺַT kDLж6MW,rԸo{`(Mm>#x0tI+xko2ydt5aWq)+X 藓Sc26Ua PsEFVf+}->r~>N_#6~MÏ^TW=Wd|\V`¦5ͥ(e[`ְtƊ ?!cJbޗ?+t`[OF' v Ŗ'nZ1G,4Y֫+Hi|G!b\ms 0A $rFx6Ni0c[^W pa̛9dU8V n1p|a#@{cs$ 5@Oi O<^9DXJIVaqe@Q%?_HnwgRL!2p!/cS%>}NLtP,`O^>(6[cQ$5$GM?x )Q (Ql|)ݱEoW-;I25~e}T;xFicWƐQg!`~7؎E1*:ف+-3oEؖRLtD on#P{M,~+|CC/+ܘpwf$PI!D p? K),{e,Nƞw(/#1Aց&3cDq^ã($˫uߙeAq+C+8aM,-)Bbg|ġ)jJkjжٜSFK v"J*U{ЌC"j~]c2Hej@ׯ^ Zi74u2ƭ$ҺTN/C^Auw]s _Hc |XS7:a@Qevh,8>ڝHzc^gcxҽl`̬XROٕת9Rw}oLWG^-T@ Ekq0}*0ڏ(cctEy&?Ǭkhz[5Ws(Z@(= @oJZWGc*Z1G FsBuDתIF޳F'xЮH/MY+9fW\GXG;ʴC);?A3vT_PۑJ ꒤hKg`z&.Sx7Kaki]3ߊL-̸iV8 Ƭ{_b+Eڪ/o&Iwj䉅L~YpiiP Vu]X|#S)dI܃([vnh&n``e#A3;qoܷ$:rɣJ825L?95<:jn7;F+  ͟&Rf '=W#\1mSh6.!a:*1E5nzM+ \t}H1ڍt0Xi#ʙyEv]7hV evQՑqu'z,J8  ^Wmp9xl~ +Mٯv]dې)wX(z$yL_ktruT)8|u% )}T= veCR/u`e\87ԗX'{ ,Is+::8 { Y[HK IedV\|%naH⏡b#=pb13[hL Sqŕw rTfJe{x?w!yaG*8)v/!5ͧ:CC[T{P#ԛuLza ;j)%ivE&68C*_L0**+Xݻqk9|Qepf{S} YdiR )~+aֽսn"0Z{ke |#=2q.L" 7D靡 (]HI-ޟ]t#h/VIc)٩ _j5lT5i^z&b(ޚs4v̉1_.1sغE%HŽ^ 㵙Y]˯2UI,>w_[ 2=Q0s݋$Yɋ8rsʷ:*Z}pO@N-Ԉ}^f)#X}W*"׽y!qnl5nE%%4_OMSR 낢|E7kydc?oʚٮl n-7(]FB=v R V{A1[ C=Y$JkA,a\\g6{@Cѣ ^2$QH7Dѧ-TJ8{tZR`.v/_h~\_"O k6}:zr!V(=5ώӄMOԁ2KAqФӄs$9Syu/{C4 wN'L*F蝅f_k E7Fp*`dc(SPaÓdJҀ ioztl:rb?!) zS $905Oi2.貪O PS-|/7N >KbP]D:T $*y_C90ײ4B5-pͦC}3 p'w^3d8tܳ'ʱh_\;A)xI<gKL' Xa,r4ɱ$ft9DMl>BGVxm Y2$SďsZw軇Ě/oPg`(Fx5L\Oq%p梚/œ߷3>'@Q{*mwLC]EX]hDET( 2X=؜sDTd6n] B"/v7fĠ8[o+|gV7}Bڂc- <*>d1Nm(ppS^gxM5't^"49EEZ)qWe'^d s7ݑ W4B5"z)N۫vSП^ϠT% 34R=2&AЎKljY{ɭy{iȃH>7Og,ft挿"Th'V% `fDqG4&dlePb§=|`v4F5}i0vtEzREE[v5pJVsQY^PIdoe fK)p{.Vny'لڋzYE˷U;DT [3JL9Fd/o}X[#CDž&}-{{2'\Yb9BKT2;]a_N+Wqv}rgq 8 z4+ͦ*wDe\h+wߝOȐa"݌䙥![I@u: =7hx؜J*JLӣ 165Řҡwauc5QAdKqa ^Ҁ^_jC]85IrF@U1sي88-?J媈Y; δd(Re !kNԢb z4IWJx`]ٟ'~sMW =9pZT&p8Z$ S#F!)Qty|B(e i2o`|C!0 5Pe݀SVohgi_*>Xd)S;B #:`T}hr-Ȕ[lzFZurT2gGJ^ʠc8zAԮ- LIeBe KbO{ !)XQdc|4"?džSE0 &])yʿ38<iJ xw "iUZAZ_x r/CZSOQ&P-J`?l#^vǷ ms'O3| U˔g4!޽?aC2lhھEO Gt*-2ޥbawfh V 3 Ɇ7lo;z|%GP9j5>J:41Rd(YijU³nL)ND8Q'&z~/ Uɻ7-/N2s秃sX>ӛ0#]n&2WeT[xwF&xbuc* &h&:R5R\yQvׇY)gD <:85)jag>nNcLWa=KEߏ` 3,޿sßu\-$0Zsf]c:͡tl9|\wTmӱEuc)ll#V'w:+BxǞQ: BB~sfXoAg7LRmeP%a_xbϥI-o#Im0I#"H(WT~K4G=[$?ZQ2wߒ4HY򖪍 d?^qv,QiYa?:i4O+Ϧ;G|B֑fwq:2ex`sǁSjwDƋ㌯gC" i׹)pm>{!!gNK[he ;|52׮ Z1kcaaB\oםޕ*pShF&R'Ŕt\:tg22#jx|d3RaK?3L8HU]O8)!?#3 #J&_Xkn 1ҵ++8#/!<{~og:(;pſ}$G̠;:UZ/pA4.C~& lu@]28f/(*Te"Tnj}{CweF YVFqj~ ௫`3AanEj'V'c*ݞj"Fp<(9i@c-PFǾvtցQun_MshYP<~`几ʔa9V:aiv0CE)N6ǻ+J a v\6qɣKk.5V3 "!Tst4A5wm=(GEUZ0mQ{gkzP#-e|(+Vq"u/f -,|ʃ|]A §?D)QnlApfUNY:!ieLjj3$_gI(r|1]עlBkԀdY՝>Xɱ9 !F77}YF2Ӛ1ʣŒĚs 6yն2HMac*q&7^epf6wZ_idj2N-s[xѡO{#ċ;c: ,5X2g$i \k YS,+'K$9!lC'@n !T:"F|d~LJC[-2 8BRo(@G#k9|d}xh:3d6ʝ=Mnͨ*vɳu|]u=Ҧp Mc^ZY#\ܜwkzL,_0uK0f=˭drȏOh(֞%MP=b;QfQ؃Lk*~CElHr&[=|33mٿ5?9^No35/q:l(Nl=-v1Ë&Q{]xm KAJ|Qȥ*(M*j+K8Ƽ.Zѿzӕ|vn !r*YKi=sqp?b]O?]|mvkŮth 5@8 k}X}uGWxgׁiφIX<"^YM8,v~ $e>k/vZ3OB`Lq@CdjJ$s) `],;(&DEf+J]jD- #LjhG,QM#骮Svo!*WX XP;+U.+=xrC"רߊX´SzATML^ߔ4QESZBYz = QcGQC+'$U-ԅ?߮U|䛦mysZ0P0C,G,mVsF")xώݫdre9#̅b^}1P[`Π?p4m  QI *nvK!V:NCkI=AO]x_)^ >;wֿ?tYk,Me&l6s chu⿶y{|g#Pa:P:C~oe (ٹug|$Nr5:$P߀A*@8&f)P8(K<>eKE֦ cx歖z#lwcXZZHw]FIqv*'~$DVPXn@y[ړ`uxZQwlUZ^j-e,II3b<3J;~fd#iOCYnZ C[ j )6/dN߀9KX(SқNȥB:i#1͎&*!j3L7҂*5'B+In=ӗoĨW%0G_X@|m&La_D]z |_䁊̳UmQ ,9pD}C5G98a(iQ Pkm ̝{)mkG}"F=QD(q4!Qه 驣76~#]"çb/n̷v)v9XrܴVw64e꾄v3[i &nV6&:B8N'Cm7Rt4cG^ Hƌߣ#"ñ~K;NW!|70O,rCU}v{D#ʸ7sm!_}BS MoElD kZzzm _ [l9}Y(z|h>O6UQY@.H+-==-"#ppV#D֭W5:Tl2O]9cj> e1cT{P.$\Zըt?4lHSJ:+#P>03'm\EB G6k)="*a~86b-54 :@!uy(Zycu@0@ч@jN -oH| _Ձ [vX9B+H3.BIír0Fx`vBʞSns "t1+N4)79$"P4N,Eb6V[̫.\'f))`oTr;#KP搄.X';P5oq$|Wb ʚ| DeO% {v|Psں|,B~BI*f?Ekrc$Y/~p9PY=~mt6{rף9R0~fp!!8ҩH2jηwT]ZR4!!JE6-( jy;6XCf|Éȍ֖|6G54Wte>,3DeMBNFr:l&qd!/au)K&rE&?r9BG)R O!5fXĚyTg'+W5` 1Ž(p&W݇vԥj~AEY --KWw+sKŢ";(pPHJ@aihDZj |jC:S}9Ajn;ߑHh絿X~݆:Pru-p4Ż AМݫD3^-!d29K7tdkySo,zz?H?\ u5شM8 @]9fY-pn;QZnTe0^cky%k2FsJR=7D:X_˜a1()֠0LWǽX-05)mplg1w5eo<21 XYIІ+*^x:z DE`Rם EAQ؎ɸi B\(Y=(4P:5)vؕ2XbHe ?Ed\ӜeDPk`ۄA^c#ߍ6eO02' u lz/9umR19(2e?ZV+n74^b V;ɉB)j7|v ڇ`oֶ\?*'uĴqV` ?#7[8Ou+xJ;xNtsz#T޸)8ŵErZWP(?!dUDsu p" k‡ kv^ ?I&vgW`6(q•iŷdYNց}x #dD?J+=Ms*#K냥b'guܾdN>رH/BMj#8)6VliPz bHW+5iwQ,ZԎФ ۔7L9).o eWX]hWO'+/FDs5btzE_KMƭ%)4 [R(b" SCғ^5W.uHvx[gEϑ,N+W3P^D&0F%Z}YpQ_{r\_@=m EZDOo&6\o.˫.F+6->J Kf/u$PO1GGGdsYXefi,Q:g_N,!~\57C%uC ϥ݋L X|Sr L ;ۑ>Y)6 T0ݦI9-JPCU ņ^쮏bMAB^^s%h҄l~{-t/gP?Fl!r'\49?C",ynC5XGIhH9? B`&=\őM kf\d )#?Xj-~\tR+r-̫<چv˲%gL+܅Ri'^"OUV pqёu~RJc( 9Ȥ ԚmB"~H&uXHhszW~bM{mcXx8=?,6Xa?и^D.hE{ξ;x5eQ2L1+$dZU@ -BG^CI0XyPj߾i^c Be%g/PBXJˑ.u62:2 !~^ ExqU˲]/OE>PĘr 稱K7_7V)$z*ktC)δA6a:!jttGo.bhbm#I}LMיp!GYړRyr*L_z*-9GPp~?Aj={+LSmvBOar'u1Lֹ=ⲽ~m(B#f^~>\&͌ކ:Y|nvc|է-LYE%:ZsG1:5zVv*.9~|Ʋ ѻtл2N's2yE zDa+$qULyCC JS/*q( ('t,cI`k !*^)١&wXL1&0 9e7] _zΖMM!{U$[3GO.JYxNe86B2Ɣ U+7ц'dp/f;#WAͺÓ;)r 3<6g|M{7hec$6o-GBQ j7M;)ZCj7ύ\vq&sc֔ _+]MVa(%ү;E\6Y+FOXùKٗ#Ac.^-4 JZt>ѻ{&dJ9K< zذc!)rG;=1v\BIV%4^~;'(=.Q9I4d}~S{t 处1@ЕwMsoٳ mc<Â{yC*AIJX׆"'g4rARO6K{v.DmbCrl ŋKg~nNush$:^6pi;^>j h^rhUAnż5?r76nc*2u~\ cIs6=$*IP'J9|e=9^QePHx#n,"ш/ve4?{~4,v8ڣH 9"YU$E5(AM=W:ۆ?[q wH uoNL\Nx6S" foүPOT"dZ%'л#3M Ӝ'LB&x)|;3[kw+1tO?aIlC zMm-隬pƝT̕,s|ǻ4r4Ap2hFq7 $3f[BQJD+"l?RPgfd,3.Hk?cro. 7 ˫䕫;kr\Aʐ(n/_ete0xO9hB H}ev0a{HYR1sуed=0RGeD)Dye\eٗ~R@9ɶtYOl,ǛEɠ7Нc$Tnȕ>pc#hW ʽxχY쵧ix%l SeF1<T p! agoR@lD0P#`v Y.ig6Dola K$byknҪg%Ax|Tl$- m/w^#7ox .0;+}P5]#Y M$EHyo.}y NQy>zgV ،q-#>T {I`Nw./4cBfov}9V; cxC%RSl_2Pewy4nxwz=ͶaKz 7k~LtQ2;%N>BUEP9v.@ j\YAv{.f%×#x8Lk?Kp~T8pUWTդt X 0d6{Mu pHk!%E D{慤Gr~Upf (vri&[FPp{Dd챒6uz^8S+fP85>;ˉS?ȳ0qF2GvfR @{NyY|4$xvJ5Ov>[xB2C밽ufI +ƓbYREX>/4 |MnRMqTeL؈]_s٢~U+KW#WCPkD$Y LsIu>qm/B0_THo%(}ʨ Hס*hlDڷR}WHewhy{aP-v5 `h* U*fh .)}93)K<-js$ g`Z n nÒ,@`Ȗ4otR@UL[g46b=:a\Xq"vHR/m_QԔmW_zSUQp1N\05­>$IGA9-TC1=f?PZ˅Wy*"EtMzpeo{ V![*.N) doob&PX*%ZTP 6'x;A ilhPB9珀7 \ƮFS>$nC J;;ߠ'͗2 9OËѠ27Hl ΑY#hSS#^#bDaQ s($fÒæ19Q)F^Ŋz}ZrC*q[1bЄ-cZ'sA(Gקavŕ|_^č{q n7bn1 Ll2)*Cи. &b@jA=T@vEyb]3n QS_W'( / 1y*sĔyi0k1X4ո2:f b`FQQ~8O֬'5XkG<1+QYe:l]͈˭+6j*USEe6V{!:)<O92Kc'&5BgL5, HZ$jeR5'bjQIo֔U{)h mpuF.2pto !B˧:. :#9_"0oR75LWnBvvS*zNh#<,"L3oX`\TMpx -:VzwcpવEQ7^it<ZDF&/ko,YuFh@1?iAr'9YٝQTِ YF _``zCt2.??qM0I rʴUiqɯEJ =EH8c&,~AFJOZQ*9S-g 邸l sZj!MG*ŏV@+ݣ`> P$}jOˑn1" OIsXY |)ˇKG0)7yJ㞝[h<׎ǘSy&j2ABG V^Q4ԁKD1:~l6<-۔,Tv.,f [vZ%]F/odnL |g2Vj Dm hӠ| I%vOٍyi1 NIؙƥ3^&BSbq!5J)r:ٿs+23OԶߍcC]'BHҜeKjQ((qs̪H'*e8c/_,JYΤwas 88nx|-^M yz{zw3$Hp:h|@wrh1)C B^1-O9 yִzTKܙJLwk^`r:`(71EF o:K̠c-^aKۦqwJ` cAU~Ru1[\'$.?0ڲrwpI_cN~zO$1ɍ Z3Dsˮ_Uph9ڑ͓795Da>o,J>zHD4Wyf:Ц.054ȜńGn)e[3!@#x`*)8Yҏ {FK-]ZLZ4սxN!??@>#J]̚(LSf)*WJ{H>+fpÉ Si8aO+}pgC-yt8pD1L$Gnxw4Joq1TUǰۛJ@@q%8g2f' !ȪQN>e>+1 0nlG%Ȣ^۳x5Ïݽ9BQ^J*ystTh/b5lG>aSFPyRJb|93_n.dN,yfRu\# wS?'K9e0Njg\JCݲ4/3[44<1g.կ$i$x!0UqUYNUU>E"qzcSDW CN}R@HMvA AKg%U/KSg%Eiⷕ⳨ISS< _L\|lB[3LLN1U'op!喸ldZprGUplVdQ8_7'o"%Śz`ۆӤ6w6ptC10apywomRx'qrps\\c+i5_YWqX^7[h%xkzJ2[hFI+u# Bч7 YzXB)SEkzE+fsPCq[P-]qkjPƚ?7–Q'SNp__/^cD8-xYpj͂ Ƶ

Qu?}.j|@*nږCC'f]5/LD-G}B"ƽ%hߙϢ)@\hOd؜PktAFXտ_8Ǝ_ 2pN2ʟv"6EsL`n3PO)^ݨn.J-M TG)̰;#4%sS$`{ٙ(P\tBzݦqUKl{L*3Q@nK1tvn 5ڡ7$vp^KgmsoNNg Djr~@<ƘwdǪB &ɀHaCwbg9+ ׿J3Bv-' ry8>H`'f(KGFnc</ORi ȅƪoeMҡ]d^?N>qQkf2!mWt! "R +&H̃&2WZjOt?ai:< a \#23E?a+HpMD89߸4e|>)GyW`"枙F{KY+v*׻[/R@J̟';қ׭e }s?Qȫ@h0|] 2=!SMڡN# { zb5^,}cDKGOʆDu+25&|.3tRz,ݬ'4:ۉ@ n[7җ$5Pbόr[r +?!'@׼FÿNbBM)0 M@z]+_zX ∰rSl_E5I@S '^pEk$bBL,Ƥ! )M8>[}^ !~׉8D.LA4mOF,ۗP;} ڄĚMJQe? ID@@Ҡ Rj1Ǽ\)~o\#ׁN4jaeeբm[GQļE-jvog"60 .ֻDrgTGx>D.{W-*[V:)˪92U0O,ɹ2TaW Ŧt'._ FpPM"yCpW̴*{a(X:V 4T&x;a9xMh ځwFP)y}V_Ę"VzŸ7fYJ,p'3 N G °Lj{c`=s^;v.wj5ϰv7M_nY9ȇ"ӶK {:3ڠ.ҙ efdˣQ˷0EK_6arQ`OdlfcWKŸ~F1IS:gPypCRƞe;XT=Y=dr9ej.X1legA^aAGkF<ɽJ6 xo)CFr`.r+EAeGfg 1=v>]w4\{Hs`)KBzVwgg:3^l@Ymbj u=|} p0f:G'N|ԾNjԸq&UB2a}oHKRcD.<`V0$$Ѻ8n \YJ;GzL7wzN2Hأ۳8j,0}K ѽ*ZcDD dx:ȹde/ ի& kFno(^ypa r>`CBͯRֽ QbcUP+ݠf YJBHߩ]{?yMRIF+WYp);//PEa&gnMC*h(NEe,f#F&ݵ%xyF{n5UUAziNi{U;"ʡ y ToPuX۶b/J q r+tsP-b%BDnc|٦+l㜲~S%.9{ry$b[hIbg֭co[sZ^͚L92^}6.k s]+cٙRmպ ޕ4*"Rį+<ѷ !vKP?[.p!Pc_eB"o_V/[*/LJρUzuy4zڐPۋ5"qv_K0sx1h.3N-.})ma481 E|Ooƹ-{|)t%[ԗGWK`C:K)5#؜r71ٚ@ ]C0,Af=#USӨ%LY#8HA!Wd!tP{ 3UvvdpTn1RLp+Bo?z0\<6(S*is  ]a_.ʄ+-}c^W]e{Icd$cE-/ ﱎ"6Ts!yS m0! Q=y"-U|31J{ RJlfY?&zR<'cet v+n8Pwn\2rQc@q\:tHƷ^"4oƠ8+!EF?RW.Vw&;6i'eob\`5>'J]/zGu]脔6.G^hf—.n %1.[(y9P+Z :wV|AB䛠Z)(_{o2 YX3拕ckB-ip@5rbJĀu1Y-0ahn`\0 M`I(G|L QO8teV`K1(VZA_VdWٶeNbnɹd<2 MԲBFY)RfهﰸB ղ*,}I|gWn[(QճeϿ*7V*Z.&F!U 獹j33X: :lj~sd1(90닾h"!u²݌;Dca 6%.x+g95V91ʁ))J} M=/^aF5o]Pڷc+ %Fo(mÂS%d$7𩪱s~e^rIf!wc<ӳX4YJ@'W_'?f=Y"#d4~ؙX]cuKAF n%Pbϕn~ã}G [!t+šcv(ae4[pW!MDyxylj+:;XmvҴ €,⚮yTG 2\$׫Y"^vcGKTT%Ԍ8inVTtlQE\ēE8>ZEbKN#4K: [8kWMa Ɏ K)%Nd!Ed%O?2nY!BoNNNAsA<',4 (ٟ ʒjFګ-ϱ/aM' wZHnhjh|iB.Nj 0Ddk Ac+S d_hkTY"R}R'sjLc'֖1TP/zX,{]Ńo-޻xVQ~&qI ԵY;Ʉ]΄,sxS&`j60H^Kg"㱂nRZ6BEO!=5EcNcAb &rW#'f:|ox&%ieK &=4,4~@q \Bj5f#v(n+{O/A4c\w3Tdyu,XZ)/xcB{,o ^ ̱Q.J?ݱ%[l#dÀYS . ɭPI fs ݢyLg9L1SR.6f ?h&t?Ml`IbtX pً'4#ռUS|^+Q-"A%Չ2Z,gbC5Bp6Ϫu$ŋɈ +k />zX! >N#⯐K9e 1PסGҫS[//_U ܺJOf.f}"cW/p3X#K0}휆V>YemSo GAzzS *> Vu2T| >3k_P|Lߢ9q9A&dZrNYNj/ߑiJ5k]%}>MltyK dα'o${Ms\qϡƗ%@`rJAٺ7?1 1NύH ħg^;_zdi;-+&yBLQ'zQc!חPK;d/ 2B\҉5vKXjpu#r)4(h"OgN(Х՟0Fˊe+Gb͌&`cRɥKtR1bMbH0uAPfc2JlB5na5>ÛtO>n{:};rǖR✁yTn",AFBSe3CzTqgHMS?ό<ɌWDӕVϲ|q`A` (7嘸ap' :+.~KT&OzQ\S[t$O~Fō)ƨP2yjIv=w.GA.@BkNv/`[Ԅuo1ja_Uwg ] ui0[".mO$@ܿuyVbύXOPj>'Žh'zܴ'qJvŔV J WP襻S}1Ar"o0U47H $N#и49OT<.D/K Mp䋣?tjNߋWsٸ޲rIBp|={9Y- B_~;LKb)X7A6p^ ᝁ8oa:sFLIL "e]- ?#0qh`HܭDKv~RUҩ Ӯ+7ʍvzo kݼ^lOʇŲKT*P3r - lА. Q|a+G>~I6P@5IU$;?70|Sg-=}Idy(_jz3 73(aW %BiVDVI8|`[EB<}]|;p0ܚӵ<"0q97'*pSEz% z_*b73q8BT{J=N~IKAJ[{#tțLgk9"I?ΞrqȃCu߰#f8xU WmsteY4%,sdu )kQ8I9/v5`74;9fKW^]i`ɮǰ nSXL]"Ps W̲)(ߑ׳CeLƥP A)[Wu7\Rdr0(4ϳYʉEQqG8VEžKfSHSjDc/8OT[R]M!YU' gnu-CPsdp/&7r-@cTі+et+HJJ+!3+ !üvNbD!xX9?}i9 < Eo{5Ɠay&8_g7=\BPYQ6`#Sϒa&h 5c"r#ļ=TtO }COF|~npO1uq=xi#Is@Y[o3vv@oG08m4h#|jg\uUӤ)JgH5F$W¿tKꢇPW/ J )L8!enzTFdJjl8Hc|8GĘDxLd"Le˵ԑ#.l.f!3 *|3۴ faHߍ"e2K+gpΒ?,n-À~D氇q)u8XMTla&ei.L(#>!۬/p`5Eҥ&E +@D7EaN/Y],g-c[Xm(;H2U5FZQIODHYmD6pDOWL5\M7n{|nHwTI{T/mE[zuSmE4_ːMR#eSP°oj!MX6|##ܟizܲ%0S=%p 78Mjm..K+lV7:tDoNaz([ݰ}LnAb|6 l%h7 xQy=-^]"f_i6|I9 !^ '"{{9ƹ9hRN EC{kZ_Iwxf:ts;E E|fG/ lSCK:{F|ETASݶ[03&a)վ º"ue\9|EC%n#V@jխADx^GֶFz]/Fq+ϮiOݚ$k\ Ǚq!eNA#)$zG{شV-J'c̮]VgXpOnj>HFDU60 h#v'uڝ:#q,}l'xVm;0tn1}|UM83˨cv9T#U&f&AD.ңV\ʓs9sDLm}Vp:~{dB;Uq'9Ab= > {Հs| TsriV2Fc梧İg1վmT~s_/\S$*؇F!<П蘀kCiBLcLD4b#G?}ănnx~~Ii5QT`OږGmFԥÔҽH0<1`A.|-QѺ' ;рwpMoto_6lffzHlq`Z MSlr6fc1;=m;@ s0ϳ5mFf|xA 3~I`3wIK7D%{1w줵,zu`r_&e2$3N5][ #^T5%}sx钲rqV1/wc'i줙#T3TosFDDҍ {Mm hiMTw{KYH㴎etΑlvX͆q00 TfJ*":ws NϠl"Nrje O56zׁ h<>fȹ9 j *2SC( 7?7N.xjgpNqJ7')Fk%[tFN.kh> E2&ړJYڞx:} <慯Z].~.|Fny_c^~O:ZXIm^a -lo}9:# k :sxԁ,F+C>2<3wicMaDdӮ8u@<(Y.W%f!jĈ^:1h`Ab4zB( ~^aV#ob MS ˟5Ѣ #%m"= "ѴmLrlsnO Bꐧ m$$G2FB<l<f}$hmg| $ZMX69~MФ,ldb&'1+f?64*0'"'+⸓2 ]Cx>9/켦 ڸw.`zk3U~Cㄊj)>;"+,Co`;[RUɕUMǀUͪNGԊ1CG 7_XOetD<@P#iC1{ n;(s%+mNy@()kkh,"UZDK95wCw>fJH7a(&R8ëb⻋9;GM7|߰01da_YAP ːvB}ŷa$""5%PClQMB8#tT 9 rYG>/;&LmE0t;["U4#PҎ5 WQ!Cb|.!|/bHw>`qeMख़/iCd*O8p+O]_`]ߦM9Db{V  s_-w RK MЃQ %caP[񡑁?;~pD1FFJRSѱ/D!埗rq=[cȱXz)i 8w5_7*UY.[veNCX{1-o?㯹pAa e~s--}*d: _K8B|(&+9#8k I~X-kS4`W(>)7E%>GT@,UPNlYchةӂ bsx_j+IϾJXI4t`",ƍ݅Cxe#)P&RNR*1w":_dޏYk𬤞JJ:azC~h ET138׏m_Nh<53?=Ɯ_Vp.27򹛳D^_.dD &S=|n; !6B2z!Fu=GIr3x)nǟl]~ϭK'gUZ݇8Q Ls8 =VlyƍFԲ,K# -4΂·%r&I8KrAO)6i ѬП~ڥ?uE~k\qlZ3[Sܓr)?K8'O/F48`KdO{tb U,mˡjC!~䤒Sci/K+au%#r .H?ܩ˂:\jf\{Z I<{xܥ:nHNosM w Q Wh)[rP!l%@:`}Y~+Gv ~U-2W.1Eޢ,-oF;A?Ǭ@k)EgžÀ2gprsœft4nhfnG';cX.AacEQ##أcQ]"F iNQ]R(>B6,ayL'uA+IvPId7=ZVX qw(m&f )Fgoٸ%@~#Defy!_}(wf*5g9 5G%r\ݨhVm^*J D?ԭfcshXVE~kS.ϴ"on@ӄ =n#"iMqCzWlm03AHhm v8i> r5rχ0q[K]ՄhQ) @o&O4m*?:D('vnՁ8](myBgi0lObC&m+Vp ^tc1%[-0X:qW41%q>c\j/eX٨ax~ۈ FЊ7-\Y4@X( Qr", 困z2[[uo:w{"G[NRQz|t]r 0 GBD% PbWO6Uq%-'ev6#(gV"&+ ȝ+3Hؒň  b܄*:׃6|Z'CQ7e8P#\N)=B ˊ܅`|?fWsgrՋ/Lc ]Sgi[M. o%cH*>ߋTM< +Ӟևk[qbkG#뀮zɦb6URڢ^3mZ݋b+ qHіtf@g06C^h/njeMſໞĒaMbl!5G=.U,Q=.mkak蘒&6I3*۴M̈́}q>\(pkdgϗl]XS3؛ u#hK9ZU}n[Ix@ N޿n)3cz F yS"3nkRņQTJND]k-J pGT*ɡٴxR@Gm-X; ~Jens4Jwak";E51X잯Uƥ" OӳQX$xuT`'ŋ(+oIP+g fw+/ m2{sis@ ǎJA>n4nm6VWųYq嗲BC s! ` țc`Dw]%wٔpn[l324 :%!m<|x%O$3[)$@ybxv-_B󏵯oYF\iړg3\~K{#Ӫf7J3g,BDM)xW^ͳ\h"OqteЭ> i4z8wj:aտ_\]>z[0 UHJ7ݺ]ex9P׾U0G{o^uӟ'+Kuzhe^/?q<#{d{>0vxo*oMuNu:ik/-9c ̨R>>ZVPљ-R3qbYp!8HWr,{*^P+:p’ϲЦPo]8p]Vk9> 6\ `4kߤu!Za4ق٠2Ѭ Uӆ,Kdn=JyrvX:LcUX=;ګKn/]k*2:u#MU2M^ >ౙeO 2цhYv誐qM0_4`x:&]t1@RZts(1B]J+D`ysZ\).%a驗d*^VJ(f2M51Kv}CA%X԰1\:l: X`iϋa;Za5N)nT _!Z?3]xZL+3BM BcZ7~tSJ(Y,!3E8G#\ a뀳Q6b*?*гZshG R K {b8ӘJ%"NAG3nJ]XZT>X%ϠWM- \h-% rbY1.;ӷvP;z0*TvA0h)9rhQJxJ3nHA8+ r̀D| ; %1zMGX`(KnK@`0yTC]]$p Zg $cD) r@(5U9&wEK׹ mGkfHJXpԕDf}V|$@̡ !Rj5 h3-bуAH1Ms2 qqvu!\\"+3D Z {Ri=`CS}֦"MjV@W5d1{'y>3AeW5+LbRRF:dr1"]Xik%3jƒYK./֋`تT8QDVs α;h&nch@ǝщM[]s놎a1}͌ҌB1F)b~z!JHJ.VıWGK>$ݪ-?%øCq}oFz;:ܑSA|CL4VNK?}P"Ho\H-H!&ŧ}1qxnR6eW\P&X=LG%Nb,kdQ7QR#*(>xLET"JP@g31׋㖩XSH}/]n ;nV[Ҙ; nj04sRakVozl2dc%4q OOЮWקfv'm v5{#z0I;Ue49t>IFՕy v, =ҽzar:4Vi*ݞ;eymkf9E}7:Qv/_!^BR[ڎAU]?qꖽ ݷ6 =ZHE_ I?Rt;\N|4?ܺ%j#1X]fgi.|h"YE=O ~^nj,cx*?_(o֪,>GzbV7Aw3Dq!e,id^^:# 8 =SDڞO L LI"e *ԟc3/e^c2Z N19RK$gǔ4%ajpsk/kx>r>D BqCg61!8e)˟N kz2Pt+02r؆dKOx{}.B@ g ~zs'C:@2 ˌLa͸=Q4cjy6z]%E::sN)&c~Ri rOonB^¤1Ub,4g2a_yGB \B_wCVf6=Su-; i/C.x[d[JP1,g|^[ mH<Ԃ;V6JKlDX߅hcbD;%+8?ݶ7'.>IRP/ԵLƪb3um@DC3jZ3)M!nճ~|eޢ pf&Faazwu.Ogc<`Y)ľp?X abpj#i t琹r~#C~~/(#I{q/ʓXyk873߱e|NJ14?i52!-W :Zָ4[Q«%;ބ<&+KG1zyR <#@ܜ%U7DBhLX\le$㚽 :(_b@gB( vwYnr_cp*ػXWgS" —ہ kY#bє2݆PPK5!)ޚx=l *)'N2X#u^aKYFW pIl7s FWH8ȹZ?̠8(Rѧc/8YzS lHPE!Zk~A|~b&Yc;:F[ܰ&"kՇ DXNTgW Sk|pڼ s( PO0jfh&.'u _z {#qCB[O ]W5\) 1?Y[M+a]VHi^'lטּ`pxWC`K'"TO; ,_g_\oicE%l4ZRy:# [gpIDJwm礈ߧst9\ %bާTiS&ef8f4yWl$\^PQ.#Rsr䆋9=gN@-X'E՝#ZFVk]>GɢZݱOij7]{"аv'W\8(jxQw -Hkbrn/\8'OHli9lwDpI  [WC0#?,)P[_ORTR7$YU;>ۣEFEJ3$Zσ'Zhagg(OxeW=d,[x5}9xMeY eZ\ʍ@|DJ2*O׉vlxma:,5\[:PDȭL30_Vk\ZΛ;:u'FzZ)`8̈́b?N>v*:L}c2ۃp]f=1e9,$ Z?A-֎6.Zpq8 ΄8]1f8.2 HO 3`'>ܼT9u8s׋n-#E$:/;Yu9>K*$ĚLY6jbv~_7чrx"i]'<iʮDHN!tB3E9oSWֹsoyW Sl)8: 38:i/#SРc1=-9I6( CnJeȽ4oG/QR,Ohn=flS}Od{/ 5?,OuM0u\ٛu;š{!2Y VQ:*b/HF%3\Q%âNDv`I3jD8 ?qel[ v(KRs#=5?!6(fH,գۇ\6ɧAWSNj z3Bӟ1" g<+VMg4 ױ4a ծnr\M|rvyNe࿀9ڙxgV9 j T&;-z޵ƒ0^gϞAg #~a/yL0͆!w3Bgӯ\kF~5Pjmq%,ED\=݁c)D-e%O󝾀E@Y}!^?*2]0Wk-d A:wvqbݹ5v. Ƃr>r!Kȿ.}hgC/p@ہ͂ oW&kyk W+R/ I}J+1kGRzh('j n pb%Dͱ??yJaKvNշɳKN$'{Ԗ M]") {Rˢ 8s  KX"eêN}Y6\ 4Ɇܯw<=]Eڧ cׄq od%Ii]XX %,cgD92A_fA{G"Sr˪t4]`wWbג,[>) ׀e,A :& ]aH*`Ld+JRCAW8qiJ~{N]hHd&C u[z?qU׾!1=nuj$d能'4ȆFAN<$j6*AVrJ c>b=j/< f-1Uו?`S*6@ۀ|)QhII1D Uf9uBΑǯz6fazz\gȄ/}}lM"hvdIaXXoKrA'h@:0صS^cI<T[Ek;Snr a֟8hkAA}R~:K5Vtbijv-Ua= AD` nI6ʪe R&)aL#b kjɄY@)~DWarAR0Sas 3]=1ilqe'(Se@yq5^hUo̖]hPE/p:WSNS*ˇTSprAl1,:XV!0=84N FufDxnk9` a2~~LeMP 4L9l:MmMzr ȲH| Ѻ_y)uO0Oypܜ7^ZNq^yТn;#D^>5Vw^WqD-yU'@U=|iWP-N3>ײhu,/ЁW&25IPH)}ZK!;#4PsBG%x84r!jLBfkdYX*༃=uCcyO?Aχ{v*ݜ@ Dgj.u4?%]LѸYċrԶN#%)axI@K|w|Ӳ>%.p< 5x dC2{@GA5ž;̣6쎪֛>:į1ruW{8cxhTO?:/2?wMJ p)'- ו'c¥>${۪4?>rFFgȚxl`h]H\Q%Q^x]>$ihJcn{lg\6 IL靗CC 6;CHyg Nol[R[00#MM/H">4$ Ԡ:]nZ. "w%*DZĪM F,C4$N̳&.ƟFH~%*}0+n!;ɺ,D?x5"/v ڳGVZDK^9i&)!cqz(v]OrJ~ˇ&J 㜘zD!ċ4lk)~ϰC|1FBX= ﶠ!Gy627bu8p,fZ.%U3V:4{OURli Ò?Qiͅ:eC͵uȼ/F{h=uI)? ɱ->ЋFoK Zq%Zy/>gҽۦ3U'/&?-{umrg*^O;4o%=O x૖5p}_9]A &pTgoŊٹcNߝvkPQU`LkN1tOS(/tջXoLޣzZ(J *fŀ@֭lQ*ndD:b L +(f}]S!c! ȏ5_NMy$:|3yjyQd&l9/@ ,3ws(R`ύۥt{&B3 (l~({f`ɺd I3@Id#cĩ^(z$t#q`BgLdzxW3N:?4N}h_N>`D]HxGQSalJO8VX2K^,I|uN;m=8gb2sZ$3}>@Gk?y"'(SOO-WWwBʑNicj( fGm{;i S f=yȤ:a{$xby(<F-Լ5WP n7& `#doАJ4o~lIG;l,@34.҉w%C[Uْ]6w:#U5i_>Qsh?փc7=?i"׋.y;@r>em;Q۴Vv7!ubg"0K168Z f6?QLDa˫Z?e$7J!4 qa Zkd{8El+WכV[iKdv 8,ou3 83f5_a0({9*2׻Pa" +3 Nf[Ir{ږ&J~mC%~"9] 30;U5q \kVBΩZ-8aLs<?A!S?{,+"M}6A[&Z bm)".Тx'O)>Pk~U]d>7/O'z<.EŹuߥm)˾v ڊ\ h" $sv+ OZIOF!kVL#i]Z *᷁CV#&NdHшV¥W rq`'A ŎDj)][mvǍ?ބWTjOFha7c^vkW^Uejp@55!5J{ϭs 1UЇ?^2@;~[ ILnC,Cb`&lkhSgd.6n`Y9b^AaSIu*(gHkXo5y6n[֨ѾZt% Y? U 4ʛ ZP{UQG7EeR|Qa,퇜5SMѶ@İ\j=rK  6QQeQN{9m!MPMŒrmc/wTIaϒji $hd >:;;fzj.2`I&epg X<֩0ȕH`J{ϐ޼vd#ckw(}_#aui?Z#!srW$n]MHFT;A~ ;NrZ-C;4D( ep eKA0Qop_Y﷟) '^Ja#[ǫ@ҿq㩼ExB);t١u'nk,iᗊR KGۛ{9#b uz~yVr ޔ oޜc1 `돡Zby6{n? ,ʞx2Es4sY 4ةeAbb.̫6۰c$]iŽ>]VyHW֋.6θdX7iX^7O#|@f|E"-QvNlz01V6Ug) myŗ%ornV @G ݥvRܫQmXh(̹T$QoKU/AAy=<(l3T>"opWt_ joY_5-u}y)-ti ?z\g1]RW`BChBDpr2D 'gbjrNSp&b$v`̇Yn&+tn?";Ql_r,z'Q:$!FLvUo}6/7w˖IĽgO䫲hδ,hjSs Z+|_ 3.o2ErTFyظ 9 Ɇjeϴ㷖!H()6  yȱ,M^X$OG=xvCx-qYEgY ϰE-N;wINU_N-2?!^V8ָ~.'uYYw+x'Gz)]l$GW?8;a5^o֪MN jFҭ_dbŮ|%ZC5 >oviYô@Ժ[0)%tK0Ƌn5YJ_!Y6Qid4KNkޫR]߲BKv4fKOcGUk|qZd=:#^"j<9MY(K L\4B[إvr2 \4xdXk-b WiŽoW%Ba ]L|w?kNV&(37|[d)݃;xo:aγC{ NE3GP:x H[}~;%}ьYktOs*GE}C2R870%˜OGd $HBv~#Tаʧ_ kg3<!J=umǿ\*~)Dy 46^k(&.YVZ>bTmYZɠz&ъ. 抙MHvNdx վ&/,T(8:^g;lݑS[O J?GT.}o'x kG7gOamNBQ֝$Ѻء]T-|fTu.yȓ¢\'J]TKLrȠI4(VkLBWI7{3rYDbNsLT!GSU>< YlE~ ^HUEHVW7hE뎿-H;75ATq~^w9Z䲹K>3swO O=%k5Yi4WM>kHpz_^ e(C+x ȇ(B AaDad_ފF`{`kK[5S{ oӛ[ޏD%2h)oĤi0KrkEަ+3錞t jAu_cNqlKW1<;{WJ%Bon_icx1\xgY,o6U4x*紿c,R=(ˏsJҏ<~⠊fVvN$R1oTj%d CH¬'l:pDXnȱ)up7G386([==(ECB] Uޛi 1|)%VYz*}+HNKq]C)jy /̛⒢97Y@B+.E,/A__#ቁssET,kN0]aUJזL0lQE.7F]RͤJ #COu4-Walpj;Gc9Hl`G=$$sW9)C_!g j00tr0 :yXFqoZRN?G7 L{ ]kMq&U;U\zZW^i.] *284WȽIoشE>Oy shbiOJiolܑ#Љ&w3& ,1~#QYo:R}76/]g/lO feG5{ {f, N{e waA~M[#j{%;B]"w|婺0,.ڎ尦ڂ{0O={}b*xEsl_]t޺ +pWQ>(6MTkԎJ9Ʃ틿Hi Ez5R |?d& Bfn]ǯ3 ڪ+qe䁛 ?m չ.knG1S ٖFqMdhIf"x uf'OewR^dTobex jBD-y+GR|!g7 _ѬiF#%i}cgchĸN^&I\4߀?Tʣ>8ۥa8sr]*l(%`u 4Bguot,rn'6_==cXyHcBqc{c.@#\WE1Wo o6j Bܮf^qFBeó$=h}2p /Zf dSMRU'il[tGӬ Dh%<ﺻ>PK7biI:])XTZ:4 -o~zS: r^&R1#~vţȔ!rkLc!wA?-[2|ry#Z C:vGYt|ĢDhغj-8fq2ϻ9*6/3 6+O=*#ȚCT!aZQdY_7\z8%@XcӐb+HA5|fQ -~1+lHcA\QޚԄyz F 1P߄a`6섙z خft>B}s65g%ӟ)s"!Ws&lJE,~E3}ӭCt>+@+g]jcYM޿4iGvqB gYfb }eV}WL\%9[ ѻu:'X+1:D+W}2Kt2*ox9 xw4/?:ƼT~"Јz5 6 Nk@@1|&64+L{.9uΪ}!@ uiFsVv%]1^QdS]pIsHL&>78sUD `Z(y JGb<ʙes^+jPx_ 'fp;+,? ٸ_Wv}AcB5@щř:j`."K8}u.gUUiW恡eĦgEVx/m*9.`E j_ oNlyfI`^!n]/7Jz;ZW*ɖ֓s{vxEQk@˕v4&Y*dBKn T#sK /Wb8B-J;G(Il*Z˺eZbti>@ }3S7$Uj5Txyr[=hɽ4VnTV{گP2qۃ[2>{>8KƥxOMhw|?qNwH?ͯiq@Q^$txMb̾z3<)pU6\Ƥ=i53?UlDߘu bŖufgH4|$ }mj8;6Skc'ؗ^y^U\$0c16Neww& K=_IQ^suTǙ'ǃ"OƫS.=z8Z^;g;$1IQR<#Iu3"M +eq/ޔY~F.R<9crl's:ۑ}A+J*fcgÁ O8'9~[=٩c4RM45ڲiCXVYH9^tR8{XS}TEs >hXQ17np0ۈ8ѰN faOf730'k3\x,X}͹pM~tJԎֻ⨺-,L)5!MazVCs9)c *aIҝxCjզq1Tmzo;h V*; ԝ)+ w9!]=LMg^G$̤Xw&S  ef3SW|aIbO.ƹ~] nW9quq̑Rf ]cuм5ypDyȂlxY[hA$g1?U k.]CyCKS zvY 3 iniAEwdr '4?#`-QxQe<*ﭑyw.](K}uF|ᣓ[Q?.K &Dc9(Z[YjWZ0iqyA !C!,q|KA2IPQᖩ7:pHvjQ/sԴ47 yYVTx$sQB<=sV7`;$ f+ di$3`40ڼX^ Blx~,IYB+PJmD>9om ݽf%1̦q5jv`> Ny18"S'Tpx.w`z`T 0ſO=:"h14!a⇯V~'l/L{ A}~2Kմ|\X~@Lw.!LLwp03!zdAt.vI bg(þ@ Xl[(C/$@?Nn))}01҄Idzaj(D1ҝw8ߡL=nyg>BMnZ+5q9~KŹGFڂb}F#23y > ^b_7Td;U%p=_pw[ikns`6  Tz":*-H|v3mmO#'dwʗӉmԫ]sakR/1f3k w7yhPonROaTw[4Meu; ??]Wm_n]Eʔ6a2K9o؜ MYC5db,kOfC" hvmn"*C*/9&!,Cd)[5KJLn1>T7ʖ_Ei41T:Շ}W` PE{,S>$8:!$mq$RHChKi]Ru F ^ 4/c0N9QNTs6t \˥݆$%Ts&QcOy@G3rRaO/6A[_ $ U PXR6} ;Kj{0؋Vc3~NGt[) ,x4T&J\'EPEex-y"^LFZXN\IϢǒ/FKfV f܁?B}(~zY@v&om QGlPxѺmNNoXU+l١?v0nS /ё.˼1WXJ*ν33s ;oiv0QL|v/Uw!&;w~L%mT !VԆp̖ҳh)%D,^C@I7W2<)u^wOC(IrqPCn٭E@?7RCֳ QY~8.4O-Ptkk%a{ YtO?y!܂h6v^v'Ꮾ9/aOZ|GDIj+Sab^KRezxS-c-yg3bR@jCft&J&V'v\r${8ʵP>z50A-~DʆP[R*sfj|6v!qbm1>;Z vSG#0`%L=pf6:c` QMz!o`(qãbg K,YRPNmIaTL<_V)s,tmA 75+l:'6NРPˏRV~z]|5}K_⿺񒝑 qy`>!b{FJWEܨ엘 fم(.Tukb-.!=\I8nZ>G-_*H7z7wnã oMg`S`bba(dሉ\kiӳݷJ5JІ(a*63`8uxaV^M \)Rol؀_ k,WrUHrm:#rH57 k6cOфh}TE G:&/(7d۶zU[=apr&+粛p.ARrF[E_A|ò ;uG$i>Xnz@0CC * SWCXd_Nx^7_(w] ~@$21q̬ۼ7Ct'Өr˗|gF`Q,88hƮO1LF+3hwj `aYeHdn?5 Jm bc6FI`JzP3}/o=pe_YM;S*a>DgA g"to $cYy\ϝO[n2l'/- ~E*c^ R}lxshlba%µ8!ޡd5H UtQk}/\3"c:Q,n ;'=8|bGfۓ2] h{dnK~~,Zz%p@a:\g;p@gas7̑UВe ± 8AO׀uڑ5`c hvb^ \ˏ/' p$DBOs`>i^!2޹ʕ{:!\6 A $:E6!;Y?(lqqR IrH7r952y!J+~݁n'Pd\WT#2XPr,'\ʁL>VZ%m Kboe #嫙/nֶOd38:VQQ_k D.?EFHfR>!>E" eiC.>P+ZrOK8 r٣X'lUu׾蠜H]Z2t&zKږ}{`\ꆨ@ecb&6^n՞jM*@>.. _RiF"!tqҗ_NV97=YfZCEc!")ԩGy7C1f?GN `qY+y(2]#~I˔EީڐK }KW8'=+̿$5U!0"04a" \cUI?2Ǎtʀ!,?/m-J!MI `xf8k1R :r,| 2ъUV"cš)>7< ~/kNgz^H'J8 s4ZwB#F*UgQRnCbxAXxF A_Y˞%y(ͅzb9iEc MIlIoKλn(g +oƧaQ8Bć@yDGV 'G >ndZX.w$Zw&gB^:ƆrKk1WQ{{%9Jw .gG1tBwk5Iͳ"@Y!:-T@/bUK,OE-jV}3)_ET1sac>Q!-QĪa^P]puCjdw3nNt=rc%`(k :cɣl(XC [ULν|/)Ezҳu =₌| aşPp^K)nzuM<+#z,$f8?VY>cA?Ȗ}}T|k(ErE* HrItH~%[a?Z䶠GywIWߺḱ=4u{)4ԓ\@z]Ue$ !񜪜8^Ap|6r6+Crg?kj{ɒ fy ^;>M,Lo-.~-{#N@){I|>H~/T;j\rS,6ja(am~070=c}b'hu\/֞ c<P0%neB0p4Udc-0ߠbY)|OLW*Lo0WYB(Ⱥ7|r}|CѓQetgù_W(cgJ$j+6͇Κ83rG*:ZóRcIN!dD)u% H}g=l8ezLef#/_<3}ܖ~enDCd1"8ҵ2%0U83l oT=XЯ3r}Jf[u\)yvB!l+1 Mh XCi2UjU/]#?5 ww0^,=cVoŮyUbD_(o΂F"&ߓ|BZb})XFi i9'D,䩪ƁP$!h6m&,`H Km`˯vO 4kO2ܭ`  GH`fxJ"tNՆX< 4˒2q3g޻DI¬11_cb:λҗ&V׸R?ja̺)z7.4 ``w,#["8.Eﺙ= Y%#:D#Ѻ8O{ny9=|g.ؽ>UF'9;0.8ezץ"暒QOQOaǾH5 X+4i?Xy<XSN2ZBK%HU4 s:˛sMN/#bywWeՄ3G:{ihlfV3՞SDTiKI-hw{[9߂ J27m1NTzLj }&C[ s-ZmCAxQ@@}oE/eMVxZB z6 boe=LmVKE3ɈݯvǯV 怞eh@:xU%axNAJ[$j2o*F vV?ɚ҈2FҟHB~qǴ#7tx'}v_CM뙇@)t'sjj:6! lQkh&ko.07F*(F~U3a;Ihg%{㉚掆ᮿ*5t%fj:~_Z65Pz`>8UeƉ()vY`0՝$s|Pq!*EߊMq.Rg>7gpɵ5‰ M)vxr x,ܗ:IJ?,\e.D)Rw@l8L]Z>oƧ@GqbT b9\1/ 1}AqzZwxT6ݺiu1#3$oER'pGc(X(e(I.%" c+DƓA?]*f{-Åj ?7tØS->ByRݿLN'pKGDFkҙ.4,M~U;IUIܩ!c*ʷpuu +:9fy% oǿ\{ӐC΄HVn1v+ejCme,T8Jjc;#Б# Gal\>τxFO~l7Y,35S{>,yX%[z-BNxA_JGb VIf_K{ϰuG (8Vt㦿AQz[!h]D,إ&GW.~dXh yeyzFZ/$7:bc|˱zL'}[?Y|ң_:Mk2 qP yPe f:PҸٰR!'^$Mh](*=y Td[/@PӆHEųl#Y3ھ749[@>,U2yFA fi!0G3^wn)yu?nBc7f=>)W?2|7$rI,*sERT-wv~a/˰%9ڟ݈rf. Ϡ6pv4>%ƵAPvC&0B"S fynckUf',ec8@Joa,)I*1 ܄bbm-.0RW >B#}LyB=ai`_" ^@Tz*2c1YЋ<=M$UOUQБ 7Z;VhIIekQ$SՈ.@-Pfq.jƵ(CC~]3w^&;og]Ph{=gGS;8Z5{jjVo~Z`2Wikǵz7X1o)n*A>65}a-#|EnxbFT*\EKqe{hI8 hɂ!.h FN2TR2#](ajR~ :|4!Dٌ= -5F r%J^taGē X5Z#VY:mb2JU.x߅W0홗#kb.Df>2` HRVUg LsÒ cE| 5bXz]eFJKd'עhHg(9>{-,&5LJ3ãAYP`vݤ8>P $`F>/x(W)Eդ PQ? xk/S,=/'x=^j9AU^Ӿ^{D~ZIaƭ72̗u+y3~#4+_C/3x"ՉAFI kiW[P1*rP5}m[J;kJ+"D4i6:-MnzLKh5ĉiv3Y2C>d"JE#2%tޱ$h1s$b!fJzg FRK8zMKb W:ν}I&R<=tY >Tvy5G]%*JPyR>Mv=u[,uUb]2.g="w~BL, B~m,Z^9{/b@eA~c?%j6(FpQ5ڜ(()Yt*aم!,=MH!o3:9ͭFk22جHIm3 HժRPmBDpM95h0+ %g5˫Zql䏉aJ۾ ѫ"^&'n/^j"tLO HkƁ,l@uu`P곓̓L(\,e|Z}[Bz~^Qȃk(< ǀ$G݃_BErۢ;7t*)_єI8őc fjj s;DSƇ > ov o5iؘTsK *1\\ /Had44P?G)TmiR_\%M0֮g5طȶc HEz9}/wKj:ƍ%ـ\z!e*8{636bWz龲X?,6F[ <7+;\}JI*REYњ "] zYzN j#vJX\Zݧ! dk1m1]!km+!hC8z~O^^p l OtP{V}lWMO7j;"M"ɸ$q&ViiaC{8sV ")AA?Ifڬ;D[ }ks\ǁ3|\& C V(1}ڋs]j/s[{+Xl6%;O&UM!F3):P4;!f; mg|R%MiLtYwL¶|'I[Jwa/kή`l4~o9eͮ'_D>$KI%BF`q׌}v %,0Z$xZLQ\[&JbLBbx0ђ[m`.UY9Jke'SuC3}s7yԮ`#nA DR pFzswBpZ-7&3FĵnŨ 9൲\>fKan~WF\F[fGIi`/zw*~+`C$t.PQ+\GEy~;NIp!nj/;K$L節ƈq\ݗ'b}+YbԑO%qꆍ?5_lfCq k1g GH}2LR Y9_sΓoAmg`өRN7;F&4DކU:"?) hszʟ beM A6xt0[+b(e8gX`cJ1Hp]\v&ULf\j_$ZC3`Tae>BljvV5!8&ǎߑAd?t 0 br}L'L40(+n:ӦU'9ԡTUH5ap 5Se@TBEȰn/,+J[O{ƍPW E:lg&r9ܪ՟gJLVS%O ǩ8XQmWkxP0W;ݫ(:۫/xLN eK}HLmLk@bMhwaK35RK]FNOGi.U/??!mڕU4wi wjCqWy*vn1JG,yO*{tgZZg&vN ) 3^޲^R ZrxoCٯ7vMY}SCZӦoh&!~j12pE)\MZ:Ԇ@\Fjdq%^!_[X撗ig}fXRU,m8:<ЃGe_0VǸ:W,gsH|wWd0yКM".:.e El DDՎAi2&$KoڻRAz[ ++bRvpQG]k*C.T"4q8)G>Dxs4Fʻ8maM\ýyc#]F,l'p(+Ǘb c3Zi5!ԅxGrXM!}GZO[ex''?'r bDmd=1k`ƨDTGYv~u]DHǮ{&#e 쟌HzeJ:ԎEDunP+E ;pĦ#D/gGv !)\QKXV$w[<֊23EM"_c?B-&\xbTuRqC}KU׀)Af#4S\  Mq"> ^=ƹTV1 I+{m158P3_`'Ezbl670@5kJ#O/yy}! FE(Rg.P(1YXی?iD!'eR{K'L|DzE@CTn뷊~K $CsFBj:VHpb NKR0_{w*# ^Np~|IS[>E"8Ee:&>xRP=c#Ҏ?G\Af s eBC[X4 d"|Z^[ 5 QB q35ч}? _TX^gl~YJ.X_nv2z}0ࢄ&Ӧn2hE/8tnDFED=>qVj1<-0![:)G-n*~~8 !DaɃe^PVS<)|=Fb1VTJ5?9=~?Bq듮hvd@P z@ q(FH*JU- D2Nt(NMԕ7aۺ4{VU Tp?`6 Ѐh.'(= rөt4Xcϐ_j7\Vq Ì(܊0*_~G@2G'Ym' YpHrW! (-l{'R散Q߽{][U'n+m!O,nJbBiϙ=3ɱ׈zTqk̰۫5ϡ= TnD,i4f[kuKle@' ~mcF1|㱲z'qRNݓjXE^ _VLN)ǟfJ bblGqeGHYaM1ptzv 6銮}5N s]<1{p!4M~M8˧Gr[ |`j:% aVqĠrPvz5Ws*\1,d ~ 9E"Ykfu[s^̾GdS޿:|CBK &[-NӇXKdQ UQm,v.|g%q@E¬j[_ h8s0F*^h5i"-P,8ŸS\ˢ鎵'aoZ|hpVH$l]l+K!jt1u!2 GO)s5`=tj=*sE'<=;TB{յGX+e^:<}Y> 8lM#7f`5i]|&o[3sw>Ggn{.ebgNRO8yRB50og!w81>S= fGU1׌Mc'@VNxuiRK~s" ֈ{D!I}4X^xbˀ2밌XYc%acxI$\vh9MqtZt@|Ϥ*oDc AK?}_?[pb) ,0KjUU?.:[,%)$q?Յ0ɩ\q'zQm>lu@)b_irQ&Ζ-o'!U}(a{f$mmj%/ej҃~G*[)p4aPhiFXYmhr Q߼XrU%9pwKOMnP9D_ke4-XtheioPxu(ѧR JڈC3KArz8=j_g4G 6O8JY6W^vv_&cq [YH+%30gǣ~̐h%ɀOt3ފgC;F\H *e^Ϟs<=3 t0|ҡ q~U=C/,O7'K-?<(6y&)B{@Po[߄8{;E)YwӍaXFaVi1~1|BVlلKN.uҌtxYo<J'fb>͉[GIŅ ?QfWz F 74GCem@ώ\p''Dڧ)줧# 1q,l~{HÝ{X7(l#JסL+Yf~>Q`ދ =Z0A;`$+̋k\åxYIwJ ebl׬A(Gp>ſ0>aL~"i"#"|~v,lMTn o;횖`Bw`׭K߼s}%SҊ"#LŐ;`[mZ#%q[~(}{b\}f14,xwEO] &bW&_E]z?|r37p2`WHV, aWݻo3%\<G.4h<U7mttf+eD2Ⱦ m@]|/E,.z$8G\)"b aQtSkZ=$p򪮓zE" \(>.Q5rW"N -6L T|ӭx Qt,#4b=ŕCn9-h Unh RQ a:'d̈ƼT5\=4uw_fi+37!dm`\ aEBѵ:c)* /!~(7f`/dZDygW|hcjEK@gf0Â)9qF0(xi/ 9B"%mTnנP&W7ef6SRl/ڦwY,c#,o#d^>KiĂR b HnSm[fOm5G 8+; Cβ9X/ )oΎe1)I?xeXfȈ]zuy xu ݨ^4Ӣ4G˒4-J t\(tg}~E CFMJ 'J"rޯki~?R)`7JIqP|\ϥ69Y'ra&@u|[R3<,c|tZ4WASh& d`8RG=s]+SB1! ĬZk53ۭty܄w].Yjk(Ns-\4W_82ݣȋ z _ =ߙp=Y䁓J?64-H땢DSV[nf_ a_!f-]3b.ĠMF٫E(_ !S;CiS-&$`jF|}N62c,7s0>KDe s聛:Fߪ.IS\/*F,"@Q, Y*,s}D7`L 꿎l&o)%D֎E4qZh%&ք;UzU(=Q&{ t|H!l'˵ڕf.7|7d^TA4myP# Q2%PuM" 1eJL%-3ZfPC`b#TQd'q{s} Sǭ˫߇?W{9^^J\xXw NgoC Zv!Nn.ac}s k[ҎoOCXcv㭖N}sIN0RH,ҨiCdUת"r:qpFݣNF džȬ'Ҁ ={{>ЊAu"l$գLr7A$L-cz;.PP:.PopKLd2z 仓K3L.;>w /,/Og K^q*죈+VCx׶l . MG4FJ.S8%*7G}a8Z`o`u\VTp'Ҿ FKQRHum#b^2I'$ЊbӃzU BjrEY Y`TC[^B/ZBcI/QP Mz&~K+hh_ M2bj1L2έƭ/F6$ rY ffVl#'1iNBA*YhTpb"nD[h)ommf@yW< M pI+(ty5-Q$4_64Q{Cuv{?5&J9"\T >M ~T=LoGez OjJ!V/jx!+` 8ڕMaβ2LWn$tQ9jWNꋄA~\Qd] ܩ"e)cnG͕d;8fJ7komǺi"BF64uBz+*,Z?G3?k$ q IهG1x$dm(5U.ki|FL24᤭Om|ZJ`W.+'zF'7ɓT[ ]5&X>rqw?@ElPsN^ɠ'x& @}9IF;{QPZ/x4 @O綩in`/F+xNc{hԛ_,<0,V.jQ߮TKg6+&]{ 'ۍ" DfZ(a4xjNv-*|ag>˾ͩ1Oem&>(JAIn^F#jwK c_?E&5'{b!7gkOkY(d`En}:UMpxm00yqՎX( C7K-bk%WbDKA2G,uǷuv!/>8d-O_Z!:e5'=?eڝHK5K❗B8g_|3ĐF?fWK;8h,EuO6b7|UxX\}CQ6LY&iY< rEo>CǠzvS~?V_±Ţm]^7G Lo13J¾&X-#?ҵhM] XEm:&RQ4vA}2";Ә읉!rE$"1IYv=!g۬o+yСըzyg0=ݗй _lDHq@emL)K d^܅Ne(F)ĻVG{ .nkPNIZ+$Gg(O5qųnFK `,n=t|5! dLhiW<%Hc]k5j{8L_21 STV @G`&El6߁0ɮ֛?=ADb_{S&iueEvNh;#6 3@ #&Ԯ?[z1[9/ E"qbѳHeNj􆌫&:5oWuBB,R+SV'*%f 1Ѳ]>ޖu1)ض$]_CPo,sb)4 AtIHoAd̏P gqt ߓYͭb*Q7cE}`ǪQ3m+7|3p v{]kmvN(W\bRLC&X/u_UgljFu"} 9&˾2tVi!Sd5oTژ7HtCSk 9gQ`*ЄHxO'A-h_Y,Mi 'Ӂټ{7P*Lt ,h)GѲD5ܿeD쮏2=׼~AM5H Q`5 O NVz{ߊ`eJa&ڌa9O܆0s͈k@*?w2Em} 6  s@ 3O-|<PLtl&< GL}uW$u"&Zh@fu={P>N3bO.;)D,]a$˄L]EgUz| Eqf=;j Je#fV$:IҼ~&Y^ [' : ]LD;<7Ccޤo>_4۪"Aa,? zhey쒣J2l8o_\sQE%əeڈ".5XHBVDˮJ1Z7Q2)f^脅Y{ wGg[AFHDD@}o1:AGq.P4Y:Y`T ?ʓ^ѐ8"4Y{>^/ٕ?9v ՟ ~JLB{aevk4)mJE6h>8tKu7\\h9#hLIc56y2gO`uQ I *Ɍ>'NRu P'Ḯc:7bKj(P{SZ<"K_uĝrj0S>}K~(pv`((p)ÿ6"ȃgR/E\|9 Ұ#x۵]YǟTrUτZV S[oja bgH;JU;j _a: E澱 Ҷ+o]GUǛU4 @EuBvhSa\!}MݠIX G3x c)&eV*~o?'2C\/#MH*1yL ̣)<fIFd#hQXRJN,6XC^yk6!f~D`U8\сiNW1Rmy:A eIl5o8]Y ^xַDx0 "_ [1ɎeG_Cc[;|bqt-F5Zuyxlc =]na5zK؆&U7ܽG?A k:2 z\YRK'$9pky σ4_ٴ3rj֫V[ޓ4 E7˄&@+pO m쬱? s3š^w5m/0ȟCoX9o\&]D#7jhCzq qCa9h풣@re YvMo$ϖ#P]Cvɩh4-!DYh*Ho4)*CH Q=ܜU mx.\m*$5c{4b{5N3Ngw36TOY#rʸru>_t<>qعA,pAMCB-Ȟ#C{͙2E)D8C{:va'"C14 /@^-f&eTxQCr^#Qj}\a'8Ox* UyKL.Qѹ$ݓ3Ƀ2=^q"k,\ QH}d-`l[xx_תă/#c͇ޮ>>mm_qOeaοsXmLqW4a,Yc[zP۱2 QjwmFye*IAxφϝX$n|&]j;/j7hVy|Òc.wǹHM2o*1a}X F=iަ18$a(n֍{[ՉNO{+ˋdĚfV2:<..KN)`'IݡAS?#){t!3к81O=n3g 1mS| 8"^Pص16N@U{5V$%+ؤm4+,H $4*_=+mLnЉ><-qZzܢz.(B>MvAAo՗UpzBQfT#8 W8PBi#,WDHOj[ y+ctYսbr ^PT}.+kh4o`L#9OsEڅ؈-䑎)3+UFc:toa:6%DgH*El1@\;{n2!:~*29DJ2VWVd0o$+Miޗ/g*M7j{N剾>Cl3bFiˎug62^b;9՘EY8'cEa|IZKd$f=w0"jӼHSPl8iIXy紳bj޳/EKpwHF[c (hIs8YTv ժx)?ONM@HX>F'^栣F͚M{s=! 45tv._ZM id*[\[ ȧ3ⴳLKsr.Cl_o³h-Pl2w3[f|%*5bϲ>ПQMGo{l$dý4*&bz%/܊/t5\B7,)0/,0_nf[P^vCFإ˃&`_+ sSEͧNjER Z7˵ u4% d@!Z0 4[':/,I.Y J(*By"uG;,s*]dz\i:#Me08MaއSK[=+:κxpcKXwV\; .~!MÄ?F{+7kD{Gv׬Ѭ142}NN8ٵ(E BU!C08Q>~F,/d%)7ئ;һI0j+6N f9bFg ͸KHIT>n2p1e.2`i\A\Kv-TnNA֠Qa=}.^4F4AB~fS{`iQ{vdɇbo4z-D p`C"x~y-Q $b wO\m@Y=-Ƀ1%~yXSx}kI@^6`˝ ,6 o:)vWŲ]ܾC |䓱& 6Osp]Ԗg'oe;qd Sʚi䤑>$W(N0UzeN)8X>ײrYKP^TGc؞x_^^oԊRpșG/ׅ=Pk?^Wayxѹ{ 72D?+QHaHx)"lݧbm l͏- +wz PwTIǖRSZ݇`sD:-bZK{1v JG50Ӏ`{b:7Nyvxs)*lNVȉLPv*DxT:4&h< nr>̨֡wZ{U׫jt=,[<. Ufr5vx&l%\g 5S%bb4S"u̻ +~Huc-wӱ35Gs0XC%Hzezo~Uޠ\^p!@HkLևC+d U_i(I9- x gHpDLV0ݞ=+*_]mqm!dU:D'ƔXBaSyh/Iiw s$Ψu&w8^_;af72<$[SE1x2gI@_E&c~! U('6YO>:7yߓAJ` =1uLAki v: VKԪ v=1CM A |7IZaG uCS9nOYLk-R(C#pj̛mTv=yc"CX$.,-bu mKsC]h7a))dEφiԳ .μoEWJMcdCsb5_* 7e34nx> E,:יv-?KQƾzt/&7:lWOU^PMpT-p/gB˫siX];fzҊyr XKC+u rMd%2` ݣ , pWaS>PKճ8#,4-4:`79yp܂\"5\Y!"M߻).$`_'PkgHe|J/P\O4U˿欸j#)߳(,"\ޏ`Q tN ؃f6Lm">cxyU ,] w6ٮ+ax|DcZ&6`f-)ka#2X!{K՟/.gV` .t>iԤy%cq:F}'j^rf`hpQɔTGsF6/l 5>r] XƦ*%رxu`\yr&K&Kp݉7ڤ;OvgMB#4bXJ]iZJYة#w`׎/kJD_3*B$|(pv͐I>gqt͎:egri D %i <5E8#MAhu|ı#.-0akгP#7 $|J@ɕ07Ώ2vyqZЈbIGA/rUQW[BU谑"wH!WGZ|A>X H RfSvUzK]V߱<L-wܵ,|6 )kG[>U ꊂN˥ahEuȤ:bq!5dG[{EImMk0-.f$ ӲbW vpr1ꉷ!]^` ܧ>pU ܿš =I)(#Ƕ;!W]}jע6٭NHakV4z7_Ɵ$6&a.M-7Vc\qLAiҌӖ}Sֻ?oxDo 84bhj5;I2v֭'Ǵ =QQJiY)Q13 Δ k% !3 k˩@Q`ъw7کP`(ݗl*LU(2qK -DJYa8:NA_FY1 #IA9}|`\#m7 okWqA*Rt ySY&ۙ;Gd{ʻοL&* |Q:Fm?&&X"^`KJX$u]J`0]ݣ#x%%W"[!5ƚXkanl"Ămt- .Ƕ/^NMi>/M[JҤ&L7(SE>g7Yy*ם B5;Opj%0! ʝOtm^[t }<ϵ֩}abr 8Ib19!퓇e)N$4E;؝gouPsh}D0^@C H 0ͲX#Xbv 4UeօN?T,{r{yD'AH?Lj-xgr+=V}Z7ǘX}\kx A3&<ٝ$&іO cսc aql&9Cyy@JIEL̡/gT!1 -ģU] 5jGL~[K:w~-= YvwUQAV4x3[7ުG6]TJoArA_]8G=h_ qyǡ&fccdVO%Ȭ\.Kv89HͥDJٞKC1)(vT#Lsbm9 )O9z]*j@֍l]ٶX{Deg+êw6]83TmxEA~%QW 7kF,ko v^=I>n+TαMR[e .D;PHFӚ{;Z#xZ18}#S3KFkv<BY5UK&=ypUrÛ:a2@|= @QH=D;r* TMSamܳwW^nL%h-E_hDȶz `8H `_"q d۩"Qy;mK#GesVoy18^|'B}IXY hѢTT*YmZ6]ՀYȥq$&,^ %* R&@>Fl[6_UM;V4ai &Mw%MJKU'̗RL-^n$߾d[5wǯL:z+ de[xe7][ŞlX6_25GuW( !IaE| T/eR oWIj&=O٬CzBC1k2X\DA+d׭4˛Ю'ۈlV]NhtF=<+=yyLW7U5dpN$۲ǁu~q Ej#86F>Wv*)!Ljc.X1xKRu W6κӷ&k.t'5lַbn`i;J(umVO~kW!3֦ %K hK`/ӯaf|C}feU"+pD4U=9`\" qŐ|GsJ?Sþ%%d6ד*٫cz?!{2b =\:s5S>ݥN(GzvvGbHe_lY b@sv]!-,GVn*!W/N*)z(,3zV=!oBQ·7˛Kc^4B7spsBFڗb-[M,Lt* &;.D^k=ޢ\Ajiƃ%p2j|EۘcW58˂'vpPl@tfr7TdzĐ#{_E BgހoFmȮ:~x1^5zl7ws5v6Jar5 |n1:YQЏF՚׾, \S[P`S%,.o"PA9N\ lה9)Ǩϣ_cqtdBa4__+S`Mޟ #Jnݵy}lgƮFJU]X!jڵ.wT\6IejӋ}[5RA)!Sy\lOY.=XugwP p1w$ۇEd ~ d@ 0(Γ +"P IXLFȭSbM‚@̈́`pf=>"{yx&[zyxZ3>klKWEi.r @ p^ش@Jb 5f ){XR ÐdvA: RS9X<:X|+pb&U%AQԽy^bQZ6Da8B)UZt Aqq$+/ӕUi H3"[- σ4|:7u*;%HPlvÒZ>ozK;$FZJ!M4LM($ ?n4vf ,jo޸%)[1X/y2Ɗxa,tX̨:q \D2z#_ ,HrjMbԃkw&5ixզ{`8ZFSlLc ;K|EN]ZV TY?}jY~4iS'b;Tƽ{,>nEvc0 ]LSB|r_]P֏Q}W,:\ xHll5( R!dB!Pø68d¤jr6Z=!8 hE>(}u&p9D'Ȟ~8ο>KC:(jǒݮ°Qڔ2_*[ ]޼w eSk2*ֻq6CoWmy@~3>ݣEm%Ud.Kqyg,2MϚi|!w97oY_Œ5{w=h*wD V3sF h[Eup? P3x[uЎQ[Q㱳Tg=$ʂHJ@^P*%cB xܕ-h+/,Vһ iϏ*.<"wf!>E宒 f^̸,ID LnNDc3$:s)q4m-+z1)ZԒt pbh]YC@ooJH@LI !) /}kga DY ._̊+|`C\އ˫uJ'M&`ۇ2m&wz-զ8} ]3xÈv ؆}!q*٢C^< kirDurtCK\R9I;DZ{DP~J`TSK bc^{ORЈ^o& t&پxV'扑фue2WV)3{*3KA(Nz)zmAc@!UUa)~=i5WGsf QXwg-۩h~hNe M>$f䬁{MVv bN'D.9*mE5|;3PƩ¸ČSRrЍc{|xˋlf!J?ێ ݧ(R<ʋbDz_ъN DڂCmfS!oN/ePF)a99VŗBL9:8Eח~.A@9) km8^]Y1 ;R5'؏nj\DўC܄pq$R1˃1NGtVBY9KAT[g֏Ta!$yTg8YoO%6S1?`؝dhF%ZKoLWf~<ųX.7\Q9Weت\3G:x(̡c~L $4Bq[ShQLމg8~vkׄ’Sw&g{@Jͬqk="wO^/]c&|!D>xs-'7Gk4ou*f1Ac־'BLִJaR&:t%]MA*F~zބܷQ'@&vd*FLV!qv\U {ل..:?ve6:T'K\-W~6D:8wӢ pii?-LTpȠ0#Xg3'"]Oo $Eӥ_ |t -y eGoy[ѝ&.l󚜀C`|OIEq˲؆*$~ɕT-V JTt^ 5:r" 6[iJ w lAP㬳x ǾM2Z܍x(1aQ4&+OElzמNUzЌt aqȵKD`E;4{퇋 ( ,nj5w_rk>͑倧b)5vɬآå%Ac64m0WXQuIoUL,DӅM5ܮB2Q䦳 ˾n7P^kr`ȅ1#:v]#)p7#H$: ߑu\b-\i= $9(!p}P7UPO-m̃oxK⇿d}ΒujpH$L6 Ow]KxC'Ȝ--)t^djpHjWuzIqO;Nm;)C}x]*gE* Av.C'5%Q2#n9{u2~/;6Wx`Oۓ_[`2w FXiXZ9JPP +¦%כX#\k蚅٣qaNg9Y1Bv .S$<66 vC먏O` sqMMA;;XGcjzT s(zN<[ԒwCբmð=t+*?OA$ OcTݘ5\^AscEh6@dm#n4FExTKjc7d?7?%n8Xax@gʱ6Р-N 6R|= PDa]Agb]3,< Wi)@ped=|Yx3mש'`wLA#dgO#"2.̬|Ŗ$bajUs2:MX<.Z/A*{?'Wgoȕ xik#Q㫺z YLP‹[e"1G+NPd!$sũ (XR^ rv%kY~\u[~lY`{؂2{gB'Y/@IgxwAt%O wjnW ? dE3>k+!ӫEx3*Y3ϔWZ_=t>jWgx`#_1]MIt7Cn ͸ioh t;/&E?=%}NܕU8 yp5ϵ=JfvUvcH}x1#V(sp(G>3'*':Ix3 #ءJM-$~3N(GFNL)F;H~@dGk0Yuwoj ^&J:qK7wƒrxm (83[Y C߻U*u"b VAjߨy?G툧^Jϋ>1G bNZODKիa39";qu&NdT%b<(aIM q))ҵЊ8p-ĂO Ҥ @#h7x9l?FQ{!* 4ipݹ^GtiمR<]e^fX22Bv9t%y 4 Y_`1,QEV0c,X:M$z'Md*; MnTs)&&wDLrɆ'k~agZ6k=ݱ#gG_)n˟ZjjzXՑg'A}{Ca[,K/bgM L$;&|A}q&="7RmZ Mtpџ9CMGoPM 6VG&H@,X[j :/z1hB`B(q5x5ɯd@ja3&qTfDW: 7]@5A5;dCP/9՟]C+DcE=ICT2,]S$)y۵*e@U'QRVk[DK._ SSWf q^5B[jxcR ǣ*947gqN9,A;kD"` %Ryx [h2M|^CJQJF}]Tv*V9 A6D},[5"~sX!ĪQkZY^.}%K>1FwV^f]ƚjZu(N,j BEދ#ļRPU/Wau$}!G3ʸN\}crL>hmXhO3a:܏K%_ rsYlH5f. Vxؗާ9 8Ozd"Y,epJPT9̼O[%:Uγ| yοOj#|, yajv j-2Ba2ጎD1+ 6kA&gy7|yvvxӤ<ńZn"jZ?LхKMKڹ2Zs!A5 C4MAwT͒x( U$Ka=9idǯaپ+ɜ0`%E5GZInI؋x"!WH~]N3tx% g ܱ+m.DNv&b3~0T7؎FZ [\ފև1P7&RJqNX2s˱>!058, Jeh@󷙲DP˞[K4/.h6~邾1 {#2F>ȵVZ>)=fMJtixzGu#WJGW bP웜r氫'vL'ް8+aFR%v/'``!:Y-{#bsͩ]]$2¥_8XV֧ ٚq p,4cJ 5 2C*]}rEWE=~źҠ) fy^l(]8l,18dr띘T?wl>4N2VeJ:ۻ}j83Wğwu'r%M]0T6S"o6[pw7و6)[̯.Kp]a=ko|go]c/3r݇!)ܯNG[y710qݮ1%_XG%^^yx]?ZZhR㹨tXro=Tz5xAFce8# J@7ԕL[f9$V v|h !k_!^Vvo*Oߪ`OYbzV['āōR㴓`R @:bT+ئ<#ZG$K'/x ?`~0gnV0zK6[ڊ+{l$T۪(}+ ok zy|zdBؖB k#1+ImNA<{1[ZV. pݕdE.2{YieRo#jpuah Rl>Yœpj*< ^:IVLh)m3@Q7=~p6I(454ٖ#f@XKB|M83Eߘsm6L͂]dp:!ln]]e*Fp>RJ'Jto $R959*CCSbDmFI]wx9L9}g&ʀUby||?zIcFl Ŀŕk.붳8*8S/i f 9Zm;ױ6ۅAo~h_fyKVQ¨¸F} >̾|Ain11fE`P"@5 KOZ LgJc/'jA<]/Vvvb1cS\Se%eD_ˮNfwo>.!&K<f lݔbq<(z-QkS.Ć> >A i%=HL >Ս4W2v|6z~ N &}6G?'Ez1緡Lia\O)yW ,QcAɲ=j+[?SI MBJ#C:6ȢPz;q n;Pu:tv^Sv{i7)2ĕ> 99+Z & _<7N!I#I@+rڌ/ 392ċJxߓ3i',w'(nBQy;d!Qd ׿@r8|RsEE-|XLRx ^$8Sާ\n̍sLaMq m- M,,& =g oè':g jheVK ☁a{0d ?ߑĬA Ջ[s ݏOXAW'zfH k*t! R{{|DKbmq ,;.R Oh&t}7jq)8*%kYu*% _ 6QG ( v?MW\Bl#YγKsGr~ze@6ϣ,8󚹢uuL%hXg!'1حH{OpbKa5n'e83 KA @$[ 5 V{P=RA2 P,N.2hOu@Iq,Vtj|"o|'_2Sxxեy=> JtӮ"eqYeV6u^e@(0w $pca<'3}shHatޛmz@wGE}ѴvvN'(1쿽5L$.Pw(+W6}o)Ka ě$i}0?Y#W@k]tH}\7q=? vxYNԠd=r{ 8 ׹3 lhX?adPAJSZ-{wjl"ueȒ4dUg[ %x^u:B]8oxʔM[gHR8k/KmZ] .2f4/ y9tǽrc ?u{9^z'ҖZvL+ ~tプN{3`-`^PZC^}-:6SQx_v4dƀrsGP6-0Ȟ؊s҉F1,lM̷R8/w is!n>$~N|{Th)mX2PZfΩ{{s0'iBaKx8RZ8@ks.m:)*j=(u?~'D6@&T9^o0wy5Or2o8܈1ZI"ӬHW_]ldt{鵼hᥠ5mܷ ;^L>9hW1$Z㞹-a~GvA*~ \JPJvlnl+ qu_Dg]ԠDD>>6y{9`!DU ,BWI^Ivs0In GNXf݆ԭAMx)dZ^9{28A?ɛI3FiM ޭaruIUӝz ~ j}[ QijQpg k$ _b{]\e<<-{O&T7P,k_E)P ׀h ,R'^eT-698ޢv`~cw þq7KElEBG9Oa4d qhw(&js,R|/)9_ibZ~r ^_=j+ȦTU!u,.h(}|P! 6$& +Vg;o׳)2sQ琚aN@̪؉{DTy>2qsIऩ̻OlUsXJ s>S̹+3I#"Gul}|'tʄ݄'֑(38A#k3ʊߢtM=+=N#<,YVd'sԜnm:Os[bJp׀э'޿ݪHH.=jj'\'z;<ƥ)Y;.98t-8+'A J /s$-'Q`EgT}c}A&&s%5LA)%`'/dݫvԥʦΨhz 'q,vKm<񧌟IW"?~Ž=GfzWߔ(CT'fg)ҋ%00p}KE-a?صQg% oϏnBi5 U 3buhIBʼn R66'/~&KDϠSӽqzhA.yWqqCNPbKI)D~^KC>}|K }k%nq?JO3k7{ Ք).P}GGB}Do|f!id5,U$5Q7}=%rz;OSd8$O䀭]-cſ]$+K17.׭J*E')-,U0Ͼ8W f|2(Bhw-Yf 弩Z.F,Zl֔fk%`<jĮLNqR,.&ݙ,LFURz~Q㝐*6);jXޡևfqdKݓ*\wU+X2V@Yqo/ 78o1p4ïBqyˉ ܃ߜa#rz8|ⱅWX!Hc*5ks‘Ңպ8 OtH+>vK|Puu)輔K_.snXH !SH\K˾@$[y8A>nUx-i]fe<_ջP QnaNз%dK;1\[Y^VZgNaɔ9Bd?Y]/\)# Q4QFأxȐt,ӑBu_'GOM 5l^\ǂ߬zS؄CtbN96s} xF _ϥw#bYP ^6oSp=LK,c@O;ʱNu_!3[+ޔL}w v`^5 AK%j$-:9 1cFonv^-p<<mä6_x061$\جK) LܣyS?YH8[%F_VJ2R "eS*×B;?uʸm^fN gxlۇ7+ GT#חEd|՚x&JFS?y̕z@ej$֠(, Dk|]Ş(Iy// TDl۷, wl&b5݉"T5"V={nUFugYx!8uDM3ad3z4$,(AScپL,^lemgch`1j\ԛ7dݏOzI#>ՀNEH31?3Sa6+eø{='œo)`Cq63MpEs熹 \5g9˰lГxSq>A|yak .}mO[gXb=' WV6ō͋ q+K]hWqO R. +8IJcxgԑ7awѽEN.5ndeK$H]$O{PELأ$Q%%Ow.URL*@#OǏE,j37ZXہs8u"dS(WǼMw1x'"t`n/vx`xhW-%OV f%ˇ_G7< Q͹`% m*;X1G] lxeJ8N:)| m b1%E t\b0ۘ&sw hy-o㐋àĸJnO6MĶz#Hs?ւP둙aOc)"xٲ:&=G7r$yvm8Yh{U'4R5p:[5wv$ =2>'ظ.1H&"3w9(0.@и㋦2$p?-dFǁǓٵb,7M R8UoCp[a<$,V@'Xa[:QҴNk^~?#A6q+7vJViܞV@q[1L9݊O}"܋}wbwCe'.k )ޡ2RЂ0һ3E=D\/:J(dCa𞧝=l?3@kΗ Ѵl3ГeUi {Pۑ奶B![hUOq%a\oh͸@dԊGl\=pϐYNJ߷  GpqjRXҲFT}Yח)n5_Qݰ?D^ɛ孄N.'%Yx4d"A$rO% :_θh`|F`'3BUb#@r'R'̳u$/XcH-@l*ݫ/Ǿs*d W T_A}^=1ȧn=?* jWUS4'VU7ldM](W"ij?[:klLBs}Ї[Rw;+dqT#R mN #n4('gsUׄgRXqq*db TFOCX۰؛xϗw:Vc]i;o,Ϡc0yɨ_Ni0;QnKp#K0ʽ b ֓p#cg]+缴Q1%[;r?Fhm(cBzA@KL05Jphv~6V N M{$m=g@ ]OӓdWko>05|y(]nĤEןU? I^~1ϖٯTTLI-7滺>[+I$׼yo4Gb= 1XD7R0׉DEq>F|:+ꢠ.SvY1M}[2@D\L LQLߪ@o}MãB埼 LOa7hAQfG/di>1`}l6`;.A?q T۲^*M^$m /{Le7\PCb>]ƙ< 0/S'w+QXnNu'Ro1&1u!`)NmMˊ',_Lj)%Cd2[5_q qb ^t3;=LQ۞Z/w?\s1Qr#i"}!39J)~}R7{Gqe(SKߢZ2fRCr͠Ï]m=3v]+atqϻLG6k'2GPŠRQ2.,[XyT5sh'+*/f&7 Sl hͳGza5$wfwBGua1"j{WpF3eȘvi/Y}I ("MmET*8 =rT){LqHA- J#`͌;M8?#\?"ӻ:mo5wбѮ>!L{\/k]QMg6LVe8_#> 7ҡs W)lt&v*XsG͊K&}-ž8y:E6-">KF zlv.gpOj$_'.jqV0iC7Ղ`pۚu@ Rx|AdHeOgm2B1hNP <HϓYsepP:Ξ#f`ű}g ǥһ{?`SsuIcmZE3zN1@63'3YJT2m:waU_ uNI=~OOfw(i(K=h+"Q&&q W?(ts!C싲Fݡ7yM"M's~^x 9ZFhVT)'M$/ߟ_֗24Ӹ7w2x,lagE80K![yhF-#j]^Gȏhf)u,J#9Am=BJH4 ,WcخW/µxgO8؜!.,q#ډڨ\6}>0Ic'};At)qG 33u kitk<ΈH)Zji> 0z|#Y +`j:wBjf('Kc]}?FƜqOR5g.v1w1{>Z//Q;NZ n2o#4>8upev3ʛ{B[/.y=׉Xb|@\4O[cG4NɒYII'zxdX0gxΞohE@NNBVjʉދsū'6=5@YyBҡ1ˣɪ0ֲ[wb$6%O{쭝=Cu<=}8%fL8/K|XYU+>i4M#-LRQ ?9lmS6eVQv:>r7ҏJfϘ#_Tdet8ڳ QsNd 8quV| pji}i7ka MMzGcN[b=;j%=fg,~|Y:5w}t&Z >._Xң"O^OV45z>فxw;^CX[Ts 1֕1r3rLER61iCY?-`"L'w>ϥ:yY $RIOSh[JQ鉣̸wPl mߊ 1 crf)_G n.T=^S}vRliL[_8/>{-14~Hd#*nC{}¸1 eHF  }5Z% h|qLmCa()|3p{j捧U|Zwrr ӭ~0$.'NcK8I+l-8Dzjk1]Cm5HVPARV^5CK46ǝ$3g)6ן̤#Myj٪sEu#QNZxP8lfufƘNΚWg++}62i/;Ow'\ Flz:*@`-t`E K>F#z*iB$UZS4[* }SnEjM9-!ʪF.=t`/A/ {a.+n +BOc)׽ ѕLxFƖe>;+*3\w}5t+Wh$ y[{Z0su}}ovyf~ cֺn,බqe?0C[{aK+Ն X_mNVW2x* &9k!ŁkY_8nFJU]Iݪ\ut2K~kzLy9Y^-@O}dN@neTSٍ'Q>>#dRK|:xnoHQ>icwq4*оj@j.Z[)a(a=֪!ܢnbn4SpT;mpEx)KFuh=2n2~BP`FQEQy%촿*m>Mv]D9QL~~|ezt\GI0{2\n])˒i˷,x,;"z U/D\|G=dr87 >7(we߼A @0 CtÖ$'6'>ftТtQЛIĒCȎH%-t.E'Ə_0*nqB@uzBB:u}, ȵ#ʬ}.|>}%B[qW8)u`#43oQx#2FË:NHlt ׬|)kk-ݽZNjeiD-1CrZ)yH y/Ht7aG,*;!U`;i*U1۱:xhA)t&== O $m'm9ӕ;L.pH@r u|/&גtcs_+q %2P,EU0kL\ޠe1c4Fp]D^ZipQ* DfwB x `;WekTy)JRn>"I=q.Jt?k:F>(gBE:֕1q o  ;Kg8Ĥ t de݂6S_Ƌ1o;x5haTO ea= óy) Qh!mR8g3F ؚ$13~CQ#:}_d+'@Z{CpW~EŴ ]̨g{(ٓãY7.CR7uZh_b{Q8fG a2Xd^`:H\"3 s;yS,;/7z*ݞaإƴU&I)CZu},pĘ ~w2wNPg1 ,|Fx'JXu?a΋ͫV#;e#"(w%75{D!S\SY}Ӄc +{kfeqs@MlXh_o:!v,{Te>bOBƧxw2#[`=F!lsTr *76f`C%|$a/w,ͦ ٯ}{J(|[ >3<{%۝бf9Y9^g%\=7u[ gET9Y FR 9D㏳ yW@ Z=FHqY<|`xWG đ*(D?bx橢a {DSם=bVY>[K 4tp%ƍ,'{YozqpJ5z!X_hSW_Z+q,#~C'm)R!|jI`DgQh@Wrm]f;(l:<&qaMFwIuc_~Kh!wҤaI(Zݤw׶Ok?uQ6Vq}J*rx~Yioؕ-+4N? %w!. +-zL6L86SEԷ 2라{bVb:sY!+$ujȆB,vɷEUy8LN9po05Nܖ(EV7ρs(K;E729SԐ TnFY'3=cs0yfo)|P,:duG>D EͧȒ/mo>wA|&}W|P{f,ZZ'o8]xVVH(/9"r*`,hǫyrqA|QuO_i^]H]pj҈sDGxgt"wD)@S[s'wB׋װLB ҟ\ΰ*Ȅb~U=:a"VqoM0DT8twxiw{?z_E~l&H7g2Aw7 n'rNyD{ L5d+j* Ώ bJKQP ZKb4jt}xn\rZΜy2Z`Z9nʩn"U>_$nzJ \[0$e*Ð`X,ڨ~`Zv'tU`gIx׸Xsoc (1ۥa!F  9}%De,^c i4F[m@e4Wuk3DҞ"b~e E-snR"E_5~'C,Dz j lk TP'vsjO`=95Z^fȉM$t@%nkÉtyϏ5[F0TFR9Xn< o\;:.PjחcS__%R߅orWfcB}7W{BMtdWBR|}`X%_6 $Za=,L8GL7YB͂%/J,sGgbZ"%IVq@* pxE 9̸)&>aԸl2%,]#ͤi:6Z |`$($>(l?7} /}^֝=s?՝LS9Hsaٽϧ&fǝwVڿ4pE2c g>䭈/X#!Ct ?DɐL[ÿΌ~ |)J5ud@չsxTL6Oi/ &` ɘKN[`\a)̞}@.im&,`胀 gekUGDG KJ2F?7ax@oz04.IAWrA<᷂6|gw 8H{ rM :YӺahC u!P"Bod9Zߧ:.j,;R :mC2鏾3wz5xՈYIzuV|7Eb +ٰVOK?GFDv$xRlOݱ xcs&}*{_0ALtƒÁ 9ع7f<0r0; 0I/^+LE;NJ3z/M]JyTibuoask.oxp"Gxp[Jhm^at]_d4յ=SHOp&;ձߔJ̄U;bLԅ}rʑoWGlHC8jAz*Dg[eElKB\z gbd.rr ^y/rX7 _@4ք zޠ(ֳL 2u FfݺtmH,QtC`/Ȝ%c~dKt f@Xkh +TP0sUpqD:*?鏱-Rdvrti؟1"v`TN8)%3> 5l#|:hAAQֿ%TD&%TpjOOvs/Vݺ ;> [{@UbϧCsi}A6I51@a1Ň_XGZJ޸o55gLQKN }&PHB+“鐴/4Uzv\q&z %=9 Qk,Dj&JbEB/։b1ЈbG̐"}7 nIYMUNt҇\(ΓyqI\a$7= Bߜt*\<Ճz5l*nUIhml~B^aֹ;izz_7T%>#j đ.i&{2AB#Q&Xi\+نBk ql+SeRx NWtK=/O`6O4ўR&ߔ<`TfP@#|HKQ#pdI{G1}FhUlUcBhA~w @CJSK~+G}A2>#L:c3%u$] $9D,o8&0/{#YU7Fl:Ϳ&GG7iPQsDF\d+슪G#pKYIoOE՞Ա75'ZWc?QcWׄ:| aF84[ZݦN֑VkFykZ>. `ٯߖ0Ă<"ÀG"Dފ'b]S'b̺p^+ON, .cSr41}V"e 6rDзz^kYۅ|pݴ#srF!ש Խi X&?ypZŚӉb ]d P5>OY` )ᇀnz$){xΫb󒼙lPq 7޳}I됹3_)!O6N}`q@sH !qnB$rS9,U:+uN]0/**0xY!I!?'r7͢h3pbJR>|Ȣ1iVS\)ifA@ߙ65M?A 8f9 gcg=Gf/g&Yffnu$;nH:Sk͹B{lțz&M8RHz݀M}BCc>i7v9gMx_j@&&\5.q9&?KcX,5&?K~S P5IP@HrYsTpv6݃ yF$e >dv$uQI9$g\8JWr'r4py0=]*@y_9裏ZXQ;] ,,YBNL3+m%%xZ߭ƨ^!ՙMfx[i,aR*hLO3%C1Wp;\_k !E/ 6%5Ɠ7hRBmm7Z"mblGY8m 0JRPyżs Bt# Eѹt;,_hV F =?Q;'sȝ$,phf|uƨ6$)OΤ?V5tK؅AaL <+)Y| \,@G!ɇO$^go2ahoPUq6ը "pD"y$6I-q-<%ܸP^L|}4}`Ѩ4l~9+-[2<%3'9*M P! ?cP #r*Ӏ1ܤ} Xu!3Ldh-=:Tt0||ǔe>`5d-RŝNKS+^J׍q|$WMPW5>f+gZ6Jr4q/^`3Ưh(Z?<(XBItKWyɧyXM$0_xԬ1yrh"*a,l--aHQd^ObZ{10(R"Y0ҽ۶c:/{Sr}`qf1\QoDo 3Fq#*!$%La6J@վV!mC~N8jWh~}|.l:Ǯ栝[) bQ.΅Y@Zve .!ZTLRfc[W؛vVi7 &}bGHo\[ܑ^G&+C+YY**a٬F30l{* -f#ҮW_@>*|v(k=zs k~rPA}Rf7ԎZpKC ѩdN(` ) eY k=7 f %!2?w{]T`$ujz{ˬ(8{A/,1;Cqh :6n/6İkw|`4z1g(a0$~I&l!`I}.T3ҧj4UUkT/=B~5K* Cxs(Bjt_Jem%9\׺xS ^t{Zewuӽ:9-n kD|ԤZKUvCƿhTYX44Mg{$[ēnvbLƾ 2 E+km:IZ>d|,X7}GsMr"2# Ӷ8܌l²t|w-SAdD6Fpyxc+@Zx'w|[O=ר©C&pmL#X#.k;a‹ k=)nkৌ Q5,Xl]ci6>϶ `Nv{$t<[ NY%H@>GR*Dh$_ڱhv  Tmj7>W !; 皝4)Z bիN/qj3#y5x@ou%t'4>57X/"hn.I^' 7 F5[ό%~R\հJfJ/@@p d@t&s!Z$;D`]T> ]^;d P}bz8*^O~Z+ឋ^X=|G`uiVJgm\ *R|C}bh7S2#05q0#U2ۭ=BSCP9&u]O-s{IACN?AP2Xuab;YI2ИT r|xWG9/ALԿAdKByD]S^FͰEZ++\7)!ieLj?AK#xNZ] 0mAh< f,cl5)9<%՞Ֆ2^^aVWHO16t^` hbm&[L{R99@QZE|vȬd.DB5/w> |l8ufi9WR!: j*urXk='/`ѧ Y J@翢Dt Ԟcy?I%ƾcҨ- {3uHG-GԊ*z'jks~2mi D]Z#N&B'i}>,UQ'RxH/hQgٿ<3"´$hB{10g;@e 7%4gޓٔo$"ָrdnPtR6Z5FݻfwTeyk.c%!%kOSJv' RݶZf!a&b+x^Cn( E Jt3W+0(7ij87l8(+S| ,Rp! z(.'u= ^{p d^GoFcm(S9R|?ܳt*! !F8*6UHXslg:ssV~$Hp4nXb]>\5nc VpPDTzgNYl QD j~۔{8ޚY36Wq䱉xrZ e^(3 4(eX?_R,wgD\5p1c?tŏC !I 螱|Ûq0|3 |Nm*$|iN?Uv-UK)Rptahļ`9/%tԭ˫&u/O.k!-Z oޟ!@r^bՍ^흩9Q""ť@wt"9f!\:9!9]+/%x,vL[e|x.ąJX `}\r>#la\QԌR2~z+"k y,g YKN3t]ẍdEuc+a 4.&yNK lztA[j׶כWN] a gv0IlsљoI2#8rˏY('J#-`}&!mʙ un~U#s ydk_v Y-5H{?{Oߏ zf:rVv1&Xbi1i͡{UmD QhJIÄ. 3h.HEw6Dx&cbiE;NG2o=M1gͺZq7`A#aTN5i ,2/)zO3X] ]Kpsssw?cwLFxn8_Ǵ2Y$F0%v9iuL4slM Szp<x;SC,wgz`QK5gtt( b0yt4^ F^j(PobFJ+ZHN% g p9^V9P6FWwѸF&G3E=goJKӳd}G2ASwu-}rZM%ny )H6}3`=bar9wpHOF6 Vo4:׀:rDݴc]?5V6]7F\0`/H)g>r CuKu慬M>YhOJPs87Nfzp7'BP $:K5^Њߑ9li| 4,*ggL/\Xm<MC΀&Ш7[A_gc-g {m7*PA@|Ps":tpYǔaW@AG?=\#/ d+N{Yy*l 5A% Ӥ{q;:*`_`lk\Sp!:gGIuXխ)P9;$zuHNKFP&t'ޥ@!0T܅|i"t#"* i+2@)&mJJf<hQeT)`H ζLnڞg/3Ci< Ph|IKOEIl9<צ[E5_`3^5ʚsO2!]';=Wy`:}ԩ)[=mz'yC'4s;M2CT@g=rZ=y5C3ǰdQw90컐u;9,{GV>秥!IZ2}PK%#GBŠ~Tu!F,?uuqI GY<4kAnAmS!l*ig&OBߒ=1Ү4VrY:y^ܕUR:l덓R6%}(БQ# NqUŀ$ŋQP6a׍R櫖Ю~4ϝpl_7jE3i/.b1:O` Ri צ~ lIg >Of\h>8tR?3hQ SCvQBvs<1TB 1yxd1>78#-\` q7\2Rcu3iʳ7ߜ@H ST掌n$a :}Qnl,&KY r8} 0oЈocđx?ttHc:j܏F%cZLІED_Go?Uø2l4OZ g8/-H"]gW;q?-wxM%Ƀ).-zy@z?rD"b?r-X:k6rVzf4B:-&aE?d6w ] {]LQ)aù9*]eB.Lo;ٱ#`&X1@f9G(-k"N3B.X3YO!՘|s-=qNL,F.:|bTT/C5X!WѾ5lBMbN]Ȉ,"ŻY!oZ svS7x&^}d|e8({&,!ůn3yqֹebb6e o`C D94\&qvҡYWPR&Itgr#p\͎ R)bS  1gS:'ƀlg}#kOlͻ>>/sYS窪팘}X{!cؼrC9 J$MU4\&`x;Mpbyعq]un~G`1&) 8bcu@{c&3\1T38xcV';IwXYWs}2!kī3!Hh}o1-r*7:cfTƇE[ s)WgZƌ1gA NcVf+pfO7ˍic-DzZv{N6 R mӇiRD@O&)M8riq2;(NX`]1[ؿ>/kf? k|4(;+ͫDı:&u aAS!L+`ңj Uj&aybHڦ;R(o蔂 KThd[6KOCPi-%hM:M:\P9.TAjoeg9| 6:c@ˬxn3L:apU*ɾ2砝62<,ףIY"HW Q]5Hc+=+vDfBǧoY]GRԠƸ'6]]YL?\Eפyf>DȶLpWOn] CO.'6Yy^]c-_=SZj,F qO޴bRzq>K4#~~*uөE/y;1*bb0CwLw5mj6>Ŷ71|Z a8]Vʐlvc dkD|6l-0l#LpҿzE6,zxa58/Q<ך~:'M/k5Vdےr9ɣ M}r+>pI}]~xO]d~#lj"~TXF Q W6*8!w<7uwHs=i(L: }],/'Y; :_~cWz˫gm"ցOlqu!k1q ўbnt}4?w&<t~*ca:.Ɲn{Oflܭ0ha Fk^x9KOHVQͨshxyC:L؂*1FFNSͯD ͤЇRcojmc_3=[_XB% \-ÜS?wo;:;`"0?Б "ۘ5 8Ɛ7Ոy;9NȞf}q_wL6wTz.t6Yeb\5AGV~h\!>B"!~,]xh!|f_(0K%?4TOg5%rҕ(~S4Ty8yDOp:{=+N,H°KXe,aH2FK>я3{߼iG*iU!]&iKN鲵(Jk+ %" Qj&V [8Lo;@3[x!B[4X:)mz] ;D(;гsԸy9[7D/.ѦLyEp^=+ϭ1\vAh>Qٌ#(NHU"i\z5H޳I2'>+heRiuٸnKcjCפNtĿ^w-so ;W.o3?oC|{bkm*-uT| Mvtrm[Zm|z?cݮL=|A\8 *8$ON*Et$ >7mo%l,{BMk04ED@\P6e'p"&ʖK xN @GkoPzm=äåZEu5#I~]_k@ٌM*֗\D>w -r^TB+s7mY[~AJKWDvЇEFQoFߜrRa(pWr:nX|;m/dp1Vi ]J?NY ̭~Zb๹=].*v:'\`Ȗg;9=o,e@QAʗ$?9]r ;sKʮJ:e $n G _Zcip{A(Ɖf>Ûe2FZ 0?{k. Sw. EɊ"ZŹ\Ym,:_Tv=iR0kE/Ⳟ;,t"QnD05ٱQ (bPYp VZђinޙ(bS '`Cΰ/ I)4Hϔ`ȬLɷ65b%u xr2N§!tG@3X0$a'xNEq/36Y@ d|)S%/?g=0w}n41%nQNB3^ȿ)1-d6XZy8V^.<7kwG/'/yeڡg8xe5]!6W7;poaȪű;JI!ܻ +Pb/G~cOصѴt1hXJdYl2ԾEf׋J%EP -$>L}85`Ocl4>CіsV"8=&vd;&"%ۥud|F{̪AΚY_jkQ6|Z!OY+eMܓq?oU(!\O3e|*yUt͛`,} F5cwlx+Bu)[5L$"LStҷ&1/UyԹ{'KEYs|A@;!@߇:a}Dۛf~Kt!9—"%.H[5+95+V3dlH60BmV ,c@(qm)}f'%+*sҍrQAL@R:ng;gϱbv% lꉛY輦PN}k1CG]-奞X@Ujw hʱ>Bt/&F4+-e8$O9^Ĭ*"1>r6TN_~}$mXc{ˢo+:J ۸hs?'ٳ O|T#;qvTuҭ/BؒHF=Cm6]lA8BFL8%ŽLc, az4H%hQwjX LxqK͢[-Z_ ǣǤ(/ou2ңocacC iѡ@-?s\)Q Wc $Ӎ g˷;Бo_񟖽/-Sjrm?YӲT\rTU5rzۼF$`Dۅ3{ܐT7CoWXWO]\_H.αJ5qqrʽJ)+kРzd F)+ߌU6 6i+1$M 'd㢁685{R"LxR]$Gjh|dn{WHp2X|\qU3(*NƎF(Fn,A!4~M|-Gלj*=AA Z>w wR#*HߩuF OCNğܹ ĕj29qVsPe qĐٻ%sMwo;+-DGo,ؑVH {:B;[\iۋ:wM?>8=Is*Eމ$ 2mwllZ ?EUYoAFdZ%źHM[/yI: zr[@7لoϤ!;1V3U6lSה@GR3cFp[}]G3o l "O T-ץ3M=qŘ {0ʦlSTH~37; ~p$W߱JR-^ND)f.LɜsQ Q/ VBG1cztb $ȎV Ha:GŁ?N/h/2| GNxeOz E=~h $'6& ?QQ/"!F;1}l~b}'m0pi|nF]Ly=`fv ^*Cg4$rnl:]J'BUҶ Hs9uӚܾs"S,,`֦|Ls3wo"=oI7eCooKgH^ߵFk)"r CT"EqhB67vŜZ+-,TbcWК2=ƢPA޵n@Bb?@OMBq3U5Q=!bR^K9 nn]kآa1] k;iPdf҈J٫Ypүh9tkV r\}^ rܡV4SY"ކd"9lGԙ5Ġ5 Iy@=J[ҍM[3Y^ V˭G46vH`w[ HZC=Zw}iO{ <ǡ8} @hi<6'AGVXn~VE=)G$Pߊ)0 ;IêCsl4]Ѱw#u4lŖ$~Ƹl*,C)*1?P[WKX)GraE0hExbGQJ \${+Gֹco:7[٬8+ ݂?]7+DUS+̈́ne6zְY뺞2rΪӟT=;UGFQ0e V8h ɺ/ϲi#$3);u$4'3Lw@W2\3B/59dB"Czalb\XV ['o@%cԭ6mz[OSCN qzV?I׭ۨyNDZ^QJ웄@X%R"z&,{Br֛KIy#mܬP&vZʟvU &DfnJ K[\nhPDD_.H3 vſw/#F(䩈m_#L*sã&B"Xv^zM),OCo#@GnT'Y2I\-ۤجS- j^[d=9nfխ K"]By&,J/Q@]]]d{"]ܺ,}P9~6.8sL.GWIHIs^] *XFͼ RL^m.(nHtУ0sZg?7;Hp tǝ,1)_NeLF=RZ mTP0-p >|HluKHjoI/dz }V⼣:×rR~r,r~=Ru:Hu2R wnq7S|,VQlH>ɢesg8;?tew$3:-Y4#X͜ ŕ &dRU)5CbGrGA=2*aTѿ3',C X0тJ48 E"F\s4{BB`-#d1lGi;$5Uyc(ev-㺬fe >y<s3Bܮ6#GBT3[ %<(xA 2n1xb9b7WYP{Ǩbڳ^'XLњ2?u'bYi1^P&DhLBҴکj(Zn*#6>qv$Ɓ'H(vѷ9jj!-i p5b?5{2 @3Զu1ֺK\=} %ޘKۇOȁLd t=4&|s턟ƒ'&k3% ^lMK{Gŧk:J-XzN^H$Wf)-aulr p^\?:MAiQ9 P 2qFh#Cw{Tl]?V9ve1DN+$n'0g.]Ѣ}\=ޥVƑwbuprN:'m(e{J@a^FW !oR, SyˁKSV@oui#Pd$6MXgr,V3 ("9vViP/ƶ:K%S`ztPKySj.)ݶId7xlԮKeӔg¶XpEkc(EvD'7mНC[ m-IZ71؞}7Xb;@d_5YxU]C-]hmk[v_R ֋\JR[9cS,='C. Ze0S6b)3uɮ-gc*\V\Ea}AZ%(Ndw]XxtM9u_ѩ̈5wudVߦY :NRSYހU/6eV} IQE0&\]5F- ׿AE͓0:Z!LS$ga+ DgfEIl/\p!^GJVi-<FLe:s>H>͜ni?=⡀"6} hiZ\iC~kNǷxcF4`a8!ܕuDZWu+8@A$e$K%(>N2E@" 7IA<776bm7 "[> K`%+Zk@)<-UBM;z*Níq%_vKc|z<ch|uˇ(pq}eFlwt攓j*'RLPTCp5iS ɵ K-ԆAm1\4 f H9ٓ+RV!#hL07rCb"ǞiG Lj#qyݦ|Hq0C58M!] l ȿbA&74%%z(d"w0~ӤЦd5Cы\?3|y< R QAWQRz#E>edo|uك(w`5wTv\:Zx{gՀ#LY] )]txǃmQ@: v%`ihz Qu0xIvHw-Pq!; E?)[kC=}F/9S%3d9zE.rCmͨRZT&9 z,c xLp[–ꇊdORblbK3g׹ v(DM=wzo ad4=ho"ݐV9gV 3ϛQ^SkacBՓqK(ЏK'+PZ2@=bHX$gK61": v|Ly3ꮜ]]c,A2SWꊢ/ G[rGzn?0I\} GJyfz$8lH^r7#;)4Qy.ܵT8_%qA%p!_wBC)0;V@[MqH)-q0\Ű7xf81z=ܺ~>v $Wŀ3x#D9`=~6I rc׎ǀ a>x;/>9[5[a/9IZ!k;d"!ù0TDN:M2"4(s+J"=>`L4R aF)t P_&gׅW_b6Aa菷h Sn+WcJ<&뻽 WcGLSPW#VLIfq%Wzy6*w Z3^ 2o0}e01Yyz#/0 Q<ΉihnT͡r9ۀ#eVas*ah(]w@ͻ,eYT#4(s{g_8X9zjSe;!X[I?FKUj8|? Օz=~nķ0BODT'`kKY_MoH,#2n[u=.-q8';I7.H>GG_ Xm-V=tbHÌ;X.[i싕-o$Y&N746HS@M Ÿm LQZ27\idE\= _Y_K@%XC=Y,T+{L*0>/+ OxeIyRpv\n,̯`jK,5~e[Kcna%#Pn *GkGځc9  {qU$6,Pk%ѥ~zkhug>T0V}_`/&%~Prƺy.v\UgVD*Yuݣ?CHĵ^ p 7 r׬G?_ $BtҿO]F ydV9^OHӔ7rfd!uZGtwɱQ0}4oBz6}[2Ms3zkx` M`lz*PMi_`v?׾$Th{I Bfd95; VFdb00H!j/)/ rhMWpC ǹӢbx2=5g jvbeMڑoL;ܔM*?bW ;>C*T^([%j6F@o[ĀH8Z;0‰=dw6О5A0oԳESɨ\0Ѳ ['<@e7͇9cQo"ZoU!?Xn\;8*F󨴬o_PG4g8 9^]tO)qnc 'aŗ^։QhOa|,9ڶ✘iӶ65,QP_Cو?4v l tݟ-'3{ZEE!?3Փs(T_zTN&@-kt@o|ֳD3"rSU6j K5}EK$͈<^Yi!-Ikpni#= ~ MjF `^՘) c<~OR'fNDChDyz*0H'X[[8U&,+P7c7?^߁`#svk%RRP X-4o9*+SYb9FTѨ  ]ؼ*َiح qX$|i}Vz!C\6_ rc4(v^Qq݇]$m^L\whMNֶF'7~GGOk1]޽Z.{>/ŃQ|\2t!r{痢kXi|Whohew].;-d6Q lW!C? Ky Ej)J1n&dJ@ ݓudxe˛4Y >({Ţ`xoaGk.E<}P- غƒ`=[CPO=ɶW,aQ_tM s+b46n|,}!'P_-x׈GE( itX=3Zr/䕯h9 C>_ٔ=@蚍V^/u\ԉg *Q[:|ixLSlӳR4kҖWқl|\|1#ϵAPĔq ?"(h`k@s$}a@ m^S@CW38[Q,⮵@O{*{)d7a,{7 _l@tx=ZSL7⓮޽HCgyȊlnW=N{qfqIMF%ǔ{wɼ37 ^bdopY wH-HXQQų;(ڗ4G Ja9*I{X¬eH̆Z\1+xT#=9;|Uje0'} cl,ZY1Xś. T6359J@.&MuF'JY=t}Z6x.QPӫ!̭15 P;4X옘b+Q9BKBlXFA* ~9-":qƾpHPO0&[2:XzK;A5<<J~e./F`|SZB|tD)YxT> ]Z K+qDUOM|YIJu 4I)e( j7@Vo*߶P݄DQ9]Q֘_SNz&f Ms.a'(VN}P.`}=(Fy31IҬHfIz ׈%FNoLvG.+p>BzX[t]I]\[ܹytDc>u#M$iW1|d`+/5C*t c)V_!Bڶi r+ǍxX¶@Z:/4,xqOK}L),B!b6{uf+Cp9ie&;<Ưqkɫ%#"E:8!ڇ:J+x{;Jr_8+8$,s+20_.vv(ޓ,P(j7Y87i2 dD*|ư2j< o_0G@UÄc%c%]WDsPO#@S[SFXx4$&F&&nI볳 ß'T?a-x/|-Xl{0 izHN8kK<&> 𴙴A]o|3#m-nk\\'6 " NHFI˒- Tſwn=䠀Dx]qJF h–g>>GattN`2iIHwW;j:+OM:]7x b a^>Pյ"FCl_9]`(]H9ϺU?OPkXf_A@o.22Wg2&/LdOaI0ht?_^hN,ڙvٟPӴNt}<`{?-t"KI95 gT/2̰IMqz31nb|7Mjp~ :bY:sD%]c_Z3K!jXwB;C&^]ny^)nmpFiHl: " 5l!=ֶ1W!4Sέ O+톰=d&f:˰A2H.U@q2>Jq+ƦnD>` v+A ұ۱wqzP&t..2ު)>yYMOE#SvtK~o=Y1pw'k)Po6w2NsC.(>K!hGQmx D^\Od);v4GA~XV[Bŕz#,T ?N !s)a{'Jd1{wgNGкc?V2@cg8 2A18s/%y7}Cf߄S.<Pcm-[ZխwAg#sOBYi6r@bP 1v@/q=ȩy Q\ޚSm+'s~.QE}1LCOφ$%;YV#VBaD{u~=U B#WiѝHeU)w<k}j 8@.W[YLm./mӬb4 e LzLTV`+cKXIdKUǴ{ C]ʌ[͞H"9g'&..GВƮFWpM615w=ee- hv2T3JV)F-O.[YKq}EKq1)8[Ls4/')*"בXۯ $r~}/IpUpb ħprE`,MM#Y0yP[#v{V+C]$VC^\qe''!]S#@EYU_[[a -zM%exG0cE@SO&T;g:5$=%LvNl4I'ވs(ĝ-Wc1(Yb!Es8c~C4:r~gBGFm.~a/8FEC C7w6Rjzdv0y?BMKniXJ:T56/MƚCF@Xud@_z_{]u9Ou{ÄVIMh0bG^Sg-W6<WG2:U`1bdÔ=F_qnH@|*Z)vgQbZQ`1I׈C6WmeD6(ùUp[c( @Ւyw/;[# .LԍtTD.,r:GFH `h"|H[) _x_A} t`)j!5 L bmW-=.͎X4 k;Zt5zb靤3:QcbWI9n 9ޘ0݂b(3JùX!U `Gf3SDSnˆ*/^zsVe-p;Dir+-V@-F ԡ滻zgĽB9UZ+û a RWzD^CcB;aҔc>X^hk`(+Xy,0YظayaAl}moV3$Ű1`s/s~NV 5u=e,JnBu8OOnNsg>J~N!*ڪȅ2Z/^F4~ ϟJi*nAVA-E./0Yʀ_!/˴x܈SDa1I{3{єH7 Xx~ؔx;:DWG:Ϝ7jUz l .2ȁbbC< Z, Kʄ<\.fﯜx l80 {' S,gE.ޕ`%p_u@nP,fYSopyM0|22h О+,!W6U+}]Tv)X/:[4T,{>D2Ff6/Ƭn.YFİRJHڭ5 i^HyGDCR+(=)iI8TU/Ʌ.?/| o~=1 k= Xncaj GhV²]I,Hi =)2Ea MT1 F"b{ sa?[}<v> G&PC`t2֢i UdAxpEY8 n9-im) Or=֮kiFA~؈ b51u-u H ޣΫ 9梩eќMOy/]5u \ݑ/n 00 r7Y,]{hs t.P԰`z+O8OZȼ*/:mh*&U/Q'nZqhu&`H@P9J0:Z/e`Ԝ܉g~D=Y)}]@@'9&LJ) Q2%mCLk^ppWxQžW/BFGȪ;"[M]Ls8Kc geǖ7hóJ3#Ga:s(ǥX:al}Ql7`3*8D\ˡЍ.GiN1|R!Ȥ rdU78v }u^ Qk ++p~W٤GC2Qz#a SsMZejn/#'-v_ہ}koX3j%{p]?cf̺-BCP%$t[L>9?r~ًkYb+YNZ\-@wm-0.IP_Cӗ lwVi, /zVK;/CuΕ U=qmtT'2u kg!Z <3VXS9/vuwBfuЙ )IcQ{'Y7-{Wejs$M6 *a*_++E|^frT6k`v>P,c|; Ac f2m{˟gdLS I0/Ft`HwF)K+bGGYvǨZ[EC|}J B>cVv9#ުM0=K)lTG,#`.W788UQrCA#ۿ~!6[17bkV%IŻքB3MdDjT0W9;f9%Q ˪8ЦV^;5C}AzA.A`i; vqZ7hK*K\T0V$BwEsNF(&աxsGdlt&NeV^w2l>~dn#Z>ށ67Y-[ll95~t~h( L,DA"3yL }Ju(+2@zK sy΂l*i) ̍k(F:B$%23<e9Ng&^㚆~:( 1G M ,.gXbwU5Aܠ;{7繡ԹFn]eޥr[vvoIn z<aa\rXN:/C+4(˔vV] -I"&qn,"?Cq Wfq9iZl~czVj*z]6mNO_F",q[$BjuS7Z} M>νVUlm?5ѮJ.aјZ4Qz,gAuq֫cvHn:hG#۝d p.:KFU{Ubʋaɳ5=eHY*pfNljoʹrOhi{J+";vXN{#qiEѳ]ۥh 0*9TJ*PțA !T5utˁʉ ' El]@$\]s-% A.6wK EFkSqKWl}l&ؾxO'KH/NFYS)VĄc*$G"a5e"6c$W鼿sjNp*1N\ "+hUY1GE>D1vHkWWۦ$mEofc\8$H"%Fʵ59~<u~:L1/a.Ԉ1^-(ptEvJ;7cj6%Fgb7F$1oYVD3!ٜWh_U%*mHG>,]u de^ފV܇KN[oeTtބܾE>?<"!(Yar΃bAy;&$%厧8 نu Mnb mTY(E?@0AbUVQP@slWhgu4FI; VLJ#R-3DFZEo6g3=]a-q-5.q]Sjy(!X\〻*A/avCg(HvV% ] @B8-.n<-ۤMΓ Fu|&z˧ة鴑gP.:KKa|/rŗ^OIsPMx{bhNx@V>6WVM _A{w4< n/Juh'uTZo@k`tm{G"@WSޛ ˪N}ЉJ/a@U;-ߊ2E_snr@y8S q331/7}}f-w&@|b5SH$1LȴUr! F.:A,z5n6N.Q]`ⴼc~P#0#xMάQmfG2^=\/TV GrJ.XOSN˸=bab:5-zcn=K7-Ϣ_> U nkb y,kT` >&ܬTq/= >cO~o{DJgj?4 qK?$Fׄt}h}yWY.qaRiC*Nnh\O*RHNǺ B#N4"rqKD_b`V;a$ ULz`V]򖕻{dd4γ?J $p򦛔pWkDlNS9AI5 vcj:{9BDBi s@1V3٫aEx NY(q]ڼw]"ִfi (‰P Ʃ:?8uI2@&P>/+LBWSW,&P\5q=<2`=L9NcpxM_g7,`)vDoCUl_7gȨqp2yM̪ϢcؑkW[Y0_L,Djh*rLګI&ͽGn~@,De?ѨiLPz8JpYn 7i?x0.T[ʓ+nL'vW?ICB~Uܴ]mUĖ7Յ2 MLR{ڭ*)doKշ;K9f<;Z+9=Ve+NqފHQ;Fx+ȜƎi (Lx2Iջsmr-bekM7VV)Q? w/Ҝ1vD!F~MOZ^Ɏy@^k6hC fw5<.w˽J.⪉TѮ vG勅`/ڭfxyէk* 'I?,jys30 yf<R&tJMLRBRK~h`UWxNˀ[`#R:SIl'=1Jߏ VYuͯ?nLϞ15dJJNJI_4T\'7,~8>9ln%` t 1[o)B5r;=^Z*G IG&%`nũ4_eVSDk0$tI|J #!f" ̔ R_|ސ}ˀpzׅjp=Y˒h~N'm~Ǯic 8\NjG&;l h`;hlzڋ!Xk"uo ^TuJȘY\#/*@crLPHO"^>t]YsKJ_S7 *~ x2ZPbCAU*U3uuINf|D ~CcDQ\!Opb#P[`Ԁ4u,禷")zl An Lq8I0LmAZ?+%*4vz-@C;}9jn NjQxQކ e DܧA6._ O䋉[x)X~fm+Mm LYE8:" pɧQFPxش,ҊMm*)Gt@HB_ 92+jxu+7#W벞}ڳk\kg\syܽ.Upd=POi:@`&ƛzX%2`>Uo%2/oSc\_Nn94>s`f)F̈MOg3D4Lr>)j r*{3)L'-֚qy]{ÇɸS|yqVMP':Y.o@J4u=|zFvLzi6mv(t|)ql=zw/\_iNj*?,|l>M bV}ELcp E\;&rLO`wȵ8G)-?脌-'af.Og1874?t1es(sMr?݋4̳UNs@;0?;FZ鄢Sk'^25>KwNL*X p=pPc׏Is;a:FIht|o5FG<Ӱ\ !o׼_QT#+ѩpl$4)-Quvڌoww3C ܧhA` 8_DFԚLDtޥmE"XF=`&;8"`v(EH?  hopȲi˃؞mP~",  w}c$E `{pqEqo ^#{UԞI O\R A/-w=1Tt%=}OqMd/ !D`a0NH7 49W|B ?0=sv8d?KTRm^qѷ~6$ Ʋ3 I' ub`n35Pޥ$ߏGPzg-b.-=-&O7Zn@MA{g|J聋W(j' JV`9n}8}5`G_$`ns| *k;Eaov2mΉ~*>*Kc;#!Y1g.?-- iJB'⠲e <Y0\R?(28|*\HߜyC,tqkԉMA/9[o_k%@WLbWqxxdPppq,ޤ~~h! .h--7BfI 46}6 @`-%C7Ņα^n;&,/<΁}(]F@eOz9*޼tuγǰ%'[|1PRSRi,8cڬXTۚn<%$4-M])_0_PO/Jf2w+"F!,1ӁI$R #v:#=wД1DVvvC<$I[ k0m̜C`ޣwj7z;z!*L{5hf"Q$zegĝRG}b(B^.eU}4u*0&h ]{0 d<ю*#['}35!9@=P-GYM;%z…bD7CL>?\rKB|nrnEbG$lq>$$oJD?m3 tC/Ԋbo,w:C:*r2݋ctMGh>M^vDq w|㦐r;R`fчp0/URbUU4б67!`|#J,SK‹5G/2k_VZ%sN%E0{mJ\ ܂|aL:cIʀE(U_ad,}bBD%76o7M@L1K&y&74z&Uc߸x]FZqͫ3Ng>Rk6lWm"Ups09c*6D>X^;VYyUJ Zϱ/2a;Xb?ҤW KbV /NhZ~qۋ ZPd<{H,=jXXD[n`Q 2ϯ é'Zz#r ܆fi>w4~|-8Zb8" <}QG,[Ep>N&CA wSVRIY鍈g тAQj0/(ɽ=Jކ:{M \[Y7o^=@upLiW_~1a|(Z83ϭM~ Czigf?4?R/t剥ȴj5o KT7/PɶG8U#yZH,yU" *dq22V"IDB3y־13-E0\=9,j /5J>kwOO%Goʌ#>O\k yqYD;a27ʑpv d-4|l1P) k˻YVkduy#xr$vG?ȝJ[':qQ,pZ4(/<9&4kyH *n={.ӪRp 㡀~)$>1@(UB^ |CsTF;Wx1Ą- g" )ۓG7"pϞR-(qyᡃMy7381$TZv`'0#O^ȱ|m6ceo'ќ4f~icF<%~:iqwH~&~L!fC C̹9cwĥN:iK?)ćA kueC?:&U@YӵK?M(J(vWՑ S^"rx *d_$q&p59ޯP"l ZlB-ክ"d9Ӟp)2 WZt !GsB yz/75_oڥ(2 pξĜV2zJeC$EGQY ኩy]]BM UL?!B%20i?ʴM$oϻ ~u3S=ө_@y˱18Ј&-δz,uś9яg7T٪P*= Ey`DGEx5:粠>p$ha?&ήA!|̴ck]'6eC*ՙ?eR̷&d&nF\H3 M;A&.I:?~{Q 6b}aJ/4xf o BٝLDYkoJ]?%{}σoz-\6F>vO^t( S fj \m#h&[n6g!@QɬLިM-;XiǴ"/eiɺ!*  28hd$B6CTjg ~siP8mmwHϠΧ C13z6?e@OGLL| VcAEk#EӐ v4d4tIy [|YI^p%j|A{H@s-Ķ-sP:Y AeOSύw:An1?B]o8_X'{?eY2o#4@д#{LW覴(F>;ty ;#%Dm*mʒ(2{j_hjb{kwGmRW(oQOӗ}<ؗtF) HTڡW#`5qV} ^w{YWuEdp^R9Qzmo]1D&y IN &M7%=\ģᦨ{x ɖsq WՊW{X,8G5c׫ SGr4H~e.D|(|&cPȸQtit6Z(6ljUtTg1Ɖu'+ +56nOա1jF'.q t?.ݪ&0cq59 4O&&q7Q;P 㜋o֢[Үq.Se:},䣿דDFJi$n+W H 50Xg݅%zom<9S# .9˲ZWT *ytoqx'N8Ƭ罃.'>C.6YM#}pK5~LEg 2FSOr)Z6̌~+$H>5]rBa8s׈*z=MsT3,LR>0 HA(ς Gs?9ԢPPv8ð~|r0%gkRE ^S;]qh'Z9 Bv$ _x5:&TԵ=oI^rr.:V%G2v(#114c U?b$r7_s|hwk %p_':MʔxK PTt15DQ/gaBV31߭V}UbKaSpq`WigDAݡ G"*ndv5C R)Ϯ./J/GSj9|>$ o,<zu\gJQTA` Kh8:atmyi-Y<]p#H>hB[sx""FOT^8z쥲갯A XGfQ;G%&ȤͯDo^Kn5^7}qa`!-TU Ja-HUq5-wSVv:cSN|e⫰^Ρ] 2ю G;q rP5lYlj܇=V,b8}/EӢ#/pt[ִblâ :uOw֟cɉ)GQbaΏAϠ}EpY@6nwUHly2* ȳ^5^R,w ^CFg<WȎދ=A=և^ps=Ec?NC; rI. lEp K̟ j Aѓ-y,۴YvRHK[84vn&xp+ტͽH\ɂ%k[W_xe! N=o'Zl_4eyֵ][G:KW#⽐PDjFf%o<-Y`" .K.;?i)lݓAUk`v7/+Ēe [OuFhm irZc:3Kƴ.X2ËP cw祲@G3:wxK.跗5Œ %즣QL=܄ K$׀G|$ Bx/eOF|j,w4XuhMZ(CHmp,f[wJ~ *g TZ!t'^F >,|=K3ɇhw֒{VEϮZfVZ\ 5JvVΆF!ρQm{)$ MK |S5Qe'3\&?N>xXL,./D:b(_9ZAvx,gA`z"tCʤPE|0JcV!E}~#TMk<$'u8TFdj5\@ : k\p%==Ѩ@\NzMuLJvAQ:kYkV;qO>Ȑn9Iν& ^SxSrLU90Ɉ0/e"#9T6^[K¤wӎ;T}ߤbsC`z891g!q&q(xޱ@pnzQXrL,F**j'J:߀?ud/TwuY4#'G-W]<^e֍`(ZoL1Q㶎*,bzg 0uJ_yqrM 4>gj5 +΅dƩ߉߭}i[ǙJS[]g?_Ѿ6xw@pü5i [Y[I8Sp.rQF+qFt"un,&+dd(ݺ\-x mk䜡П ~hx"˲qʶ"ǘC)Y@#&žsgg~(Ͷ=GƨܓP9b)Hg8h'Oװ{ˑ 0&er)˥]|W3;s;qeCXami3CJ0"D9z7 VA8hI]@D@pLC؊@P#"X"pʝ8Q0ޯM+'}`JEM@Y`S3یV5W3ڏc+$ݸ$QA&ıҌApM*`]f64qO D>Dz 2@ʣ7j# ]Q2&'u8b_s8 %7{O \8 ⎽Hq7Y7^=SUFԓPPw4>{/Ću@zRҤ:;QUKs|%@O]6[K!{GW8^&^m _xZ9ȉ*ǾjTӭ>mfn!&t7&?Kc%M<MJrUʕCGloB6C&d÷9P芔58Guz^ iAt( 4$2Bѳ:*IdT_^2BԀ]* uWhQ*)/ a=NgLS@uF%4˗)ϓ<4+gV_9{i޵xLyEv`&iLٽ0W!jmhJJR~E+x8u9ey$*DdJv{1xv¸|ۈRMa$F䜱m=&ޚ♢tll.ѭx]Q*}{# }uR6 ˶Yxba#aW@aBsO` ]ݸz:(;DSrꛊ׹ù (2.BI <kb٣f3A i%11"<-Xkȝle!rxd!"籕bHJQ6/5r-gFmK߆+{wE1=S2tSs"ɭJcyNsF|JރW  1N*ADԹg -=d'6 nԬWq6 Kƀ_,~?`"}3 cA#)O-E1%T(?kzԆ2BT֦UrzգyzWY9Խ LoRyUaS0LB21<ߴy%0~;PA^Cއ1{uJݵ8@Z2*)\_ksYP0=t*NB! ?mzOcOW1u̠_~]f6pp$ݰkcȾ@I5-sk4$?T \q .?z lkNFp6fd}J,Y%;ҍf1!IR>y9LWsmZv fdveO6ǥe)Ý%t;ٙV-LdDZX @StYJ+ V 3F<{HF|Gx dF:ZB}%5ȁD02\:g<[Ԅf"^_VXV1tw}}Cz UC{G@ɿˤ:*0Ȁ$dрX>y SqFk pwP{<֔LR] _1.ċ!zD_0Bxy@viz5W'Dg#h%\qf4CKt+ؼX{7wMbK0nG3B`'=]KO.`e29/Z; Ur0{d57\!oU.s̩t^`aGЃ$s6xTMhMټv!kS~Xh<&=HY_{*mbWh.G,]Ёy^#8 6gIXy )IP5w1^+A ZbU{'![*K t?rqLG *1c 3e"gs*:HGc1~5ȯuȣ=+r.P8\M֣TD9ARho8ݽt]bjL)re>vD#Q1m;X׿ohlzDwqKjވۇ+N_X AN@/`5$q9Hy]tBf-Rw߇ }xt=Ϣ0K߻jϡt?}/ _:3޵& ˉʊg;q9D3 ~7H쐷;G f!?>p찑1k?Bp94bJ7XeflY&MFde{,*$l-~ \ʗaH֋dFJ|aFƝI$݇F 9@:(WN AX%JZ˰NMi`ƒ۹,CA!OfàdI!Ej[x,=$N߻ .9?miɊeX[>Q9W9c2!"pzD`1.I4kawl ~7W!%|`*yGU'VۣO={wg2kV.3t eugr-^m4?yxʴtWf 1UNu.曕's%r'Q\'(7vKeS= O i3LD@usi vwZ])t((f簲yy/pJbP]jm^,d;?}x.gȘXhnߚQ+R D h:#.KFC{֧ՍHXB vHKYwDv089W" [E8Ow/`3īm,c4GEtvO "cD u(nm7U[Tq}4Ԫ|.3CtqX(?P+6 -j0]сu.`kc'nv^ǰ}iN4]Sm0.4*[uY-qFscBd9tV『h|5_= -[^!>U6]~ I?TW/֠f~:aK Ô)4>@y6E.9=yB)֐s?^R f= LCI72s0/*EAf!(`(K>^V9&nlzc^߮huu EW%+;OEλ&WHOGMN0Ov #w(":I$6JˍbIwi-'Ek6νrzh;-{"|{>yOkhFn"+LyU7JSjnq"r1,T]6 g&͖ ͏mb2%z"(yglY= 2.6F-B=p 'ȑ~ Ԗ2LVg|h8ȣ o@#jydT$J$̖ʍt ajCT:;t,mHa],<ɛ8i⯜-?e,TNф>ȣHG@+_,pzKV䶽Yg[٠H[;顦ZkG`;X܃õBͷ (ɶv~f9C Uav/S T&ls'6Gl+~?\rȊc_)eƞKl08Բ2ҟE˔4.% Tcv WT*ȯGڨw21`l+tuxUL%Ll"?Q>jD53BMt_#oL6lqy(y_?4B`(*E7lio#/p﷙X6Uwl)ΚUI.A4udʟgWI9fڰ)S!x)|ء(DK@j$仗URWnLVx(%]벽eUQ$jڣ-Y|be]3<).=smZA'55N)"{Qb!utgǜ *VΪޒH$ dz{U-u `Qc(8UkQ-`2X!: .Z>#eOy0u9't0J4*mZ*<6,!Yuֲ/*D y)ZBa>*@EtE֟6lCf^< R-qdeExK7b ;Pa NwFNy!!Z}*z;XL $$/q,k1}.?cܷR RL3$NS*o&Ȁctcԥ*7oUj(6P|_Ue!o[۰MLҊjSy;i T]e.RN_Hu81} FJ}3} GNsQWp|BmI`<$u!^l+oG=1 qNJ$ܥ3W.:8}.py٘PHswD7#{MJZ~Y΄LolAZ'R8OBIQ8ßyJoX?6PO}C~g6rC56sسB7DlR1F"[h'pǗ3Z}7nBp/k)5$dByx)aTS$-R%CF/Zxס1ABZ!0'k"&0Ys .zbs0tg^UIs}8^fRgE?'S4ѿ=ˏgȢ .p@z@뭲r,_,K,SF 9]`{0 L싎=U P(˩5'8h~U.(+=dČ@[}`YQHf/ȬB&_jw\) Y5tBv0(僂C磛{ˬ˖?2lGgJzߣ :AyHaQ @pN4i(4oqm0{E}v2 +t ̝|IeZVɲ]j,MYlM!^n5 ~2Ez;)7Įh, ~7;HbO_}_ݖ$mCrb8t}뮭/gݍ%mRЄ)>Dz)f@{(ʹT,֋B Wn!3i)3BLw. Me0!)] {;=$Tf%;M{y+'=ZxsƇ+8{[F!)$Uc{'1.(Q(_$;aM ړ?_ؔ+CuI7RQ)~H1F0rg<{G%deR#ugoOiN_ +T}Yw-E*#[AsM9FJFwؤ x% ;b:9'R.dYθᩨjAڋ"݀L{[-l"XUv>+@$w󶚑Z!ɔ1NbQKɳdY 6#0âBȥo Uc'iz5,R 4x)HvLYt!!=StbpN8@Vy3"_z}) RCjj ]~AV.tIީ#@>_7;:`]#a=Ą1k_WY:*=*7W2b8>0HO4?መMrԾL\yURۈW|b=b,їp6`ɹ [IKh[9>eU r^ee껗ZY%]ۉ=iF/%Chl;L ?0]5/HU\ h=r_ F&!ˀPA؏K5%%#?޹ǻjJ[˳#1K:OJx͝N(Ft-Rc] 4eؑ |\ġOIU+E蚬Cp1^AL_c>/#M.;|3P[Id¯+ʆ[J@6!@S_X FQd:QAԮzcpo?0:5ed* p5D!H4UW$}yj(KhHF4m*\Isv\cE6iװ\p%ha 0QBvqٍh􀩋w"T~c@f;8aQʨ֊\{|sȶ ;hpM)j'mo@v.^~| {b?{\:DrżQ 2a:JJ"[(}C#fv۽A w`9 䊟~3"AUÐ&@$<-}ͱ=|j.Yo+qE)UlFfV{]6zJ[kX@\/4n(XCO/-svY{ 㔻L=$sWٔ/f?֍I2V0Wߐ -,7b86EXq۾z;ZKN?zx16ɸ+)\ ;Yɍo^Y.ڲ-yd79+YH4C5˦EO "-cQuO>W1 g<=K\>%1mlLODFPlv+R: w1OD3$ң.)Jps|rMS[6ZN|`ygR3m w1gYT;1nj147.RiorW[mtU;11OΙCuoU:pAczݠ#$[>&sdq*\KHI616l"UF3"CH-zH|Aגdt%(@$ #7ooT#S Pa*(Ei*:$@EH:k;ȘrKm-|ĈGFO BA '!W3s%"Rv0rwEOfȳ1=d5o^q,ncVm7NWڗxMA (6zJm,A bwO֭jK\2ty4=*eDqELkN(,P%7y`}2*_̞)xnyC'qdHбL M8J*1-?Ռ GV 0oE%\%;2XRHX'6ׅ*ImJRIeJx,Q+mHf25,7ߣz6%8#r JFGYV+xUHaޮ,F"O܈B䮤GSK.S]SW4͐䌌T]eX=FW}uLIW|3̓p^b1{lUm|ѺETLbo"dϰh˥98|aҪt杦bSRtqoPbt`xSx:u^0 8)I&&Sz`G حmj'68& #9vAaDuXRRL%^;&BDd>$隒wOSNs>ޓM9O^Eܶ@N|J7UyGMZ 3IT;|fQn"yY>_W(Y;cB N׉"vO(cߌW"nGW[=yN]q29/]:R\u$Ԏj?s:cJj[v"&՘=Oiż=gKO7NC^!BGk@WUA7UFL2S@Ep ;ȧgȾP\yB=jd6<+СC*˓aK0y,Zh/|A~ YL0CCNL$1[N*GzQzv HbI#b5BbyšCں \nZB:gxRegÙچ-nY/._e0% ~$\α]1lIHq>)r;N ^Gab>"2). ݑyDs&/ȴ = ͔NsQKz%0`G#urH!dkPT+JÙZA)_ @L7"lpW,/O%N+GfY7>kI)4ر,ḃOԝ]Ԁcßk?!QC}۟7WUL נO ;gʠ3)hk'_O+RӃPQQ)cэrqŸ ^ j4d~H ҆e$XbB2}ZJCi it҉kRGUb]@0-j1z#GX\I#&Oas%||+dTz":[oӼ^(p90iIuRhp

&jm ;Y2Zt": ʓO.xv|$-,YJiu.(2zǞRϦ'au9y8 "0m V. ;3#M}'f'Lbv!݈>R%/-Gf)w^UD~Oh`?Fc'whlX:%˨{Suaٯ/^ypuliW2 `$T _Fq8'VXq2O.?Qp5UaP_Wwj @Bk.v ::XmKNF^{,ke~6:1 reZVI=4gI1s)bŢ\xZWt_V" ffhk{'z< ͧ02\g ~=_'D`'nc`q|S̳̽ TۮAN^˸+m`S=W"]فE<(3:}aJI?tTyRϙj)4UE[1>kwN̚YڗsQ 0p)l{GйliWA80P3U d[FRU30Z+$ڒډs#3xpCqFUǖZikd"O2KGR^474 p} .S؜YCܑOR,7eoSwmWDy<*Ñ4,e߿TF%k*GiUAWM'X0DWQdK:s󁞨G ŝ6)z3[]==~涖"wΙi-j N4i=rm}Nd+8ua|2%t0Ǚjg!6x|ei:wό>[K;._D ݙ}A8ףZ$K.c‰ѹ S?R [v՜lxEwÇcLbC\΃ ?cWP,QMy:^zdPdE|G|+9x{ORg _eBz:ZGWp65pD{e:(}׳H+j650Scif\~.ts1%`ul]}>j-ouYЃȩ4c,s6m"Lˡ`MA? O#I;/m/ ⣰n-"Q ~ ii-Gh]zձ&/"i F[>\泬k`ß^/3]R"N.zl[IbÉq(qo*(y:RUR.5%,$WHPyR8̂˂~ؔSs/i/?Ҷ1cY6V ne.:=+ih0* 젧it-ٲBUJ(FqR0'ݣo!?d@'w!\Ij,U=OHTpH&eV7*Z0 ^ !tpUx1 cwA{7TJ?йIJ<>H.NykpyqÐy<,g[1YQYkW[TbpA Y̩6 /"x:a~hY\h;P u[˳t.ŋ e?WXFO`{Gn%*tq+iZZ;=hRhh'*tjk]+.ÒШx,cԺ|8׽7UyO o*!"^Uf<xK4B5j8QenD5y߮>FB .㞬dCZlMˍmS,IEϐSmA㏱ ,{|2;MvGYιY^X5pT']TmAE+|k@ppQe$^q[HkFg'@Aqҷj,*:ۊdy! pۤ'&g~pS\Ut*; XA?| i]75o>ч>8#'v/*L1g|@h#5 ){Y;!\vqyC2`%)7l![*0a.s/RxF [[Chlb_2]( '#iDK[n$o8}y}uyh,Y7I6.7.;?t.W$#wvh豌 LZ:'=ob o[(h{3ǒU%0unj:*(Bw&>b )7l(;X1Cp*8$ô~bǘi9 z  zuŊUB8`g+bCH('bBm7mZK~O[<L^*1W} ?_.g)|;U$hG:WxI$j"HAXT-S%<.2+^K\X03TV2`1x4<@] HVϪdŬn7W-R{lh{]j"s{t&S[RJ[rUKHگIS,@r[@[ds9͝P@gR,I0G0XQוRnklZ W$ Zuq e*.ϻKYTDPT"h~lx>k؛~ u{h#qO@XtW"Hz7u=7G Z 8Dq3cU({b1[ש[tJnRjNYof1R!ZG@,3c,RO9i2%V5#|/FsEwqmlw2BU2)U? tO}rrd, j7nx}XZ;_YB4Z(h5-0";=h9iFm3ozo0ѺR]uus}жONf{HXiϚύ 9ў#k+IN+&neẺ8b4jc[cm̛I8YOPj@lt^AnQ,5E[O$-1tlc(5r:3cK5㑀0 xx_hmQm1SDwnϾ( d6}e\jgʹ(&p5 ^DIf$4wHk`QU{(9LVFdmnR䪾[Q_*q͗[/ 1y k~+sMQ~  +pT4(]"S6֤zdu(p7XY'9t,4XQ29 |Kd>WXW=]d- 2>>Aʤk`'&*٨~c޴>^۵m ݤPԱ=QALK"%gP`=nxI{4'y`m0qh2OB#(͉aq2O|S1Z`sl.}TNj67ˈNG>A9)d0nâ:;|厧$T8Lwmz\u3ZuQMp`! ftwƚ!Z/9+ΡyZ))IՌUH}xՃ")!rnC`X몳/zCV&c#ܥOiV< Krʸ1/4- oj<dLZf|aNjcFYIJFKRs\n%YTo=83Xs pnc0( Nv<Ap\% #,\x?G!BKc`' "8^Iƛe'#,A>Cm+2(h6'PoO4wg1([Q<@mEYvG uX2V Zk$(+,咜mo\4.շu1pL6gk .fGz~(܍#ʔPIl(A]YZSf(5vAU;LgFX;wиiֵ O?{ɦ6H0a4|/`\w#YRtN@NL^N^uӭzOJHs]..UQRL+damo`H|ue6fd.oڂ N1;oSkt@egԔ͍9e#tk8%5'˘b \9 :_"Ƈ *14P #`U)elxY*mXEQ{2nu:Q\Π*Sǭ\Κ@=I? 7qW' ݯ감@7Ә6 7%{1+H+W0d2y⾿N|D͛m<]FWD+?6 NZ, 2klOlllHl.@^1{I% sʭ4Df%k(X\$8g'!M5ZĆ|tL}j̸͞w xW+$l`h{cM >}]l&O(Q64LxO&K`Yң>8'2O0;@gfCXy'"G+ݽqNMz*,&fsDeAxV=[j>g2hfh$zb #Kic37̓U&QDfT]" 4+%ڷ+=渳N0MdVqon-**/~W:-5qcaP?p}d}zTOΙYOH޷Æe,g@ cSBK%:kh;uc|g(& > kE$jqy+ :Mނ|l4C_0tM  ;ȉeWg^mRDN7=h89v~o;;VYCSڧTfjD?37$EbZG]%AՎU_rAB?0VY8z5|P"USGhl#jf P-Y7=`.gdL ўfar]Wd)0<>E|ϧHLʈiEx\!U/7$P4/$ ")rodYX')pc5de@\5]9JVbp_t9Fܲ|Ac ߙ#0wɘ2z b TIנϥBw/鐺2|Xeh`6\3=s!% ps ?'wb~ fP_P/VD_8 <{Vt_17C4@1T|~()^}ySieW?W@ZY50!l2밐%f i#Ѩˎ0LaP%*T:Z2[ [.9[i=%' a%ny702|&>f! l}`en!_q: 4u5GId#:G 'H;s9t]h"g)Z=L}Ey3JÊ.f=O1Ϥ26>[X4WWUkZW Λ!N|Ε+h-핷+4槻kǸ#StldB@<,?]P,x y针e,)26_iQ7B䌃{ajؓp f|h| ׭UĽ7#d~Zgj%$wΑOV$$BM ZIUUFHsŠ#(V[TAN}F4S /q?Y.[/n8ئϭ͛'ά=Ip-У,?o2K#K1g\UkS-Ϥ蘧&?1]thv Y)gj^$<{ b D,|PS:;wB~%G?~ژ?#y*dȻ+4 W-d?=X{N-oww1x 2'*ioT͞ѧT&}{>Q[ވG߰Ny$/_`ɖ2hQ -tw#*B2|)?7cA+*qnDӚg(y"gj7-lFzc 9yϑ|-W'Oed( _&Z_(;s'gskXgju(c*Y eDE_1jn^O&g! ?#xZ"a[͘DDVur[i{wQ:H_E} 5ېadqwR2hoe.J[U%+ifV:^8;F(5m\Ck_dЗX[!-iB {>귥eG#dTe*yn[C[@ᶌ"IXy?u;YunxlkmxC/+g\YRc|zD{[c덐JQzQwI̋B)+bhKxS(6I5z7:A.zwV>FJ]3}'MBE<ڕEO+ޏ*BJ)ՓP?^w0`/H],NxP#%אgIEX>~yd)?)m8S@F N$tI_(KGRy+pI aX= kS#k2}&Y m hK9m%D|33Gn6.J9OX)EL"E[.Ȣl|t_O,S tre4܂Ijs:huZαэܢP:t`D,";BY]"8õ-Gg7cOM 6ɫ\ ! ''[D^d?LJ7^TFgoznA _r|RB/L'̪d<NŲ5JI0[oX@X~ܪ$4ΊK  *^?~&O/v؉Q|LQGyx`xت5!r C+}_jRCOm}Ѡy:bKDCѳ{J+p2ѝbd=3BjP n#5](!U#QPK͟^4~QL?kRNZL 8`z{L&tІX%4V3Rqx dp<ǜ8W`5U#KCv g9#Q`ڟh򉚄oFڥ#*¨ F{G1SE||YӖuZR~xܜr{~ `Mcs毟DX쾣M!{:>:/wm#5GpevE> U-R8=2$i0;Lj6КiQ~ c7ov;&|tw=IAoiȺKpWݛ/-bp=}6uѼʙ씩6_'/)I )mpQ &VUudOՋ\/sCg.>'%yx2H(x<ź-`?ͱY9'|o,̔HbaY]P_aW=A.#{d&ŅzɛKܗ獝@/}Im'k O/j17U= VKp0Lg0ii2_J@uI] bЉ+7$ܱ8BȷAmc#)y)B!!z齦8^#p$%yXZ?z6Q@tҸUOFeP nmi|'gf/q#|smM? bZUy3yfwIaN*1h,{y- kM(K:8R?C vq ]MO 7!܏;:}gԻ.GQЦIY&iIߗF;rW?W'U3|_>Eʪns-ޮl>Eܻ:@vQc`=jǴ2UUݐP)9"a*:2H/UpNJ +@g!";y1*|5Uq=8qacKja ٰ;d}wEh?c8 6ǚ4gKY5!)`d""0,!y柮u0QXE1G:F3On>[oj>wŧrLjrZ_{:ԖZHO-]T?fX~y&Ƿ \@}vG<2cܷ9<ܩ)#)UCfG";C}YAбl"FNIمj}U.WbKui87GQ{[c+†e,= t̀_G *ïؚ_+?p<~>Qkͼpa9י2ҧE~lo@ Y^ 7QUqy1Q USak2 20hyRI٫~T&ŅY!R좼4=X!pY;9ś]kHJux3 t4->᳴vL1ӷB/gAg2L ] k`_3/syNZpnbɋZAcڣ_jfO< 1L9yxVE^Ic큱uH>VVs_ Jx-Yr)%)dmyiZ["cO;) e(IrZ ge𢡄Ng>YpY\ vd6DB!3Dw~0mU6 _QNg?]˺8t^ 8W߽gۘGPs ~tQQYrVx{&[Qw5wSpzp7y|?$E{g@2[{[KLPBi5 _~ L9$z)ZCjpM+ U 9Z 4R=\0.NJʹljjf9}&~RNŎ+h^ѥ|C֣b32bVڛKc\jdbfI78 }ܜ '5'f WsBPknJ/tDT3f8xP8Õ.1UIHGC+T&~1*M;aF4۪8o!>׳KL$ki]e\ >7ڿ`0ڡYe.]J'biy@ČrS^3,{xHPYu)jLB)h/(H~g+}[Ej+Li/=𮅥CJR ;3SbʣYS"c6D^#~Q)Ec۪<ǻٵfv]Dl6d k4fzNtBF1g ZOlގXi;uY\{'UZFH\]'1zeYnEX5?9K ߇R~MjjSU=1 YIku "UFd?#,Kc qxbWEٝ\BsR1TA+,n6'`Ng/EL15sX9ȫ:NI7uQ,GvJ%8Aֿ w4d=#8%asmpi:]F?fZG3AԈD.b]pG Vw9Wkl~$߸N0!fmb uqgzڧHe>?@ȱJn`owtbÖ..-IRۂ7Co+9٢/ҥ!zldNfR\O4x34?Æk+4󤿫"i{ot|Š\bMm"E,u3lSO3mR1Y2T%>Wg@awW OXzER[,+`ZHqYmB7R/d 9I6ިu目iML{3)lQs*C`ٻ#Bƿ~d _xzWrTG=i*׭ Ĭ5Fz7 j3A:$i9~E;> ݃{K*epy%.,IMw?M ( ~lT@p4B>ڻ}0#&9HH]qQa\Ȼ_8O{C4Z%\z!'ב{SbD] &wKrtR oD kl?iC,YwAg2i9Λ'qy+\>Yan wY+k tFfDJg1Ύx{x^ZWffTX8D d{Z}q,0d0*ڥ]v$gX;0[w΄+?s܌$}T 4f{g("n|m]|[Rb,0:*fo VET `&NV#2]N|*]ƩkY{So&;[I5ƄxYvFYݖ[ F (&5|t N[Lrh#)ҷ-8h_ZdK3@ry"!,dJyC:_'= R_F=/\IUȏO& 0v& []ZޒVDz l׃eZΠ^vOIњa3PɃj=xy%hU4=qSF"u,凵!'=SiO :_e(?B@0$Lu]max+UZr~_H|k:d0NY1i0OVYۮ1ظ7UfaPYsVKcO^XҘ95Onݏs^;O@$g Xru=g[]Ĉ7P,fX$%d +rn_lLd"DۧJc)ژܻ6l.|bO_PbpOCEܵK_qZ! $|)$>v"{-KAʭ";rS{ m\ӓBhq(a90/Et+Q&@#ڢ}c'{6Iw5Z'f"MF{k;;5NVe_Qj>Kyr!W#x-T.cSr5ą]j9>&_o2I5`;!g\FIjX*˷uE&z-yZ}h=Dz74mE^W#k:KU3Uh~6db7x>pY]8Bn6S u\uf:Gj9|9RQzciwufm_;{d >U'H[7kԫ tԻXNDcj3r^Qvnb;T Vq&eٻ kjķFâR$VUA u .gFYa~4bNf~gv O°‰ȹի hK2W#ļI@߱%F"[#Y08Z}<~ꐲHv&5յx: ,Gh3 Ƀ3α#]k'IzbǼ <$%6R8TQR[) }0y n([ !X7mߨHT\N1zM"J ZN~9a1,d/ÜV>e1L=0-ejGD{Λ\m9 NfE#.D_=%WxH q*ɓUŚ=)e0f`s;AX <H$OI)OBoS!2_Mi]d DAz/jKBrXN=%}vs eՄPO;O<:l90Nz v9 ӝMCv2֌taBJY~RD)(xQwn_5|z A ھ[l 4~wʢIg"$R-뭝`UtGFML7w3;bJeZ O$jþ3]Ñnim%@g rB ̉UgJoH5d<@,57֥>jxC8+DO-rGe[|ny*g+?UI4xC' Z+l#3,f۬ȟbĘha[^p$) Zl)'eHm? + c5[\$_'(XR1y hluV:[30 >A]o:Z%g`pza3:q3I'ROiK6IjD8RϤ庘No8oxfX ;q{@s&*Ԅ -#ݰ0"+v(uN" ٦/;4Z4rbD6j+SR `ڡ Fu AS˪VbDS@–xi3iA(b9"*C8&aiF:".אfOPM1$kCJV󢤢}kj䀥rL7XP6@plê2zwY37p${X~ R{Pֵ,OZuSdsM2 bNFqQ&ёr_(gS@IhM!77!e,}#/|F KauB7ŞԳĝ7Z=7M%CEb@7@&JQΤdGrQQ iĵBFM9`PD]3<ɡ[3RD;S1Uצ4li4Y]G0:7Lg_BJmߟ~*n"ME|7.di$`BVTӉ HOr,e7w3/@kH,ETߞ~a`r)Q(ƙ\(@EMAds6H ΢01l? ! VMDIcSCϬjۣvQ;HE6v_ln֬rd(Hm]_;U_L3EFXr"?^&:QR t&RX3jG2[cBavV`LmZWus'#Bre-%H?p䣜U Їav|3 hv>$cA^Tn^mr."h͊gyx` I8n .HeY?F/n ln@O}3t5'C2 ·=~nP"١| Krrg4 +6Iї |b\BnjI"dg-7y@4գEJȵVvId]} -aN!"y1C|h:FcS1)g+W盠D7]hP}=&6p8s &w,Gu6:0Ϙѡ=2uJj F eaX?bftj(4=J{RtGƤDo\z&{iY]Ł/4q7@nՕ:w<>C~Gkb1k}/ʧN&׮ ߖvvȕnsl$Kw07E`fp.)yOų. C KDh=m_JʀCf&"? bi>RL]kFB^CX_6W w C$2>JtÝqXMdzSZW{H?`3Gٞ_XPǜЏ'Xy~jn0M h1@F*kA%\NVhy[g!g6l9eFL$*koB2&~h)q:B@BWǀ+JfmOiYc<62{34Zn_oiqyĎ g`M:yBR\ !gK] ⓦp.2}ﰓlhS+dp4VHс[ƽT1E^=Tڜt`*Z>CNBNv D&?a`Ś]dlc ʬSP]P >Wra1?FÙyLeim =\ޡ X5ܟ4~ʬdFqό9 bYL`7:# g:@:!h;䴹1I Ɩ]a-+Bj1ҩVد$]wt0,:HΌbTXp{|sn×sGPfNc%wRnMkEJK%;w- 6rV1&oxĆnZF?oK*h\C+Cn+[h+bla?gj. ٬*as1B-^_j`6}Vr:O#3\3>\U 4wqKu;Y*9?3.PW9Q gNp"%lΕ[5فO>ЪbWWv-%tTe-_')G|%HImK~_6H&nAa\AsEy9[8ۮFP_2f }kM) 08*Ee,fÔmKad+g@+1(K홵3 TP{^M?o;H ׊n\t!g렑DG<JzNg$]&&VڳzƈܸȾe(DJ%U+/έRjZH٧kxiQepyyaP)ѿ3Ċq.ӬbC95e N~1ЄD0x5| )0I|{^V-k5?:NG˯ {7:(nEuDIheGD_)THv8(*x  .udKI{h9;hF`zu/an&Jŷ$ 3*ܰ,ٷ|Fu#Y_fM>&'%hgw q:YΰyNp*D\]䧝թ`In͎GWY]f{#Wl_b`to &·̍ ~Alz\,Gzk99Y&Rdx0<'b0TBb]GȲ@LnH2o;5~RmCBq xFޕ *5,`~^ k[ny"})'};uīj2-KsL f[IR1C9hR`4WgyV?P,i:~-ZF#6BUC먚+[9[,H ˰Y^vAq;1 QLn%##a2蕺9|<ڤ"&-)nm^/vW6ݣ{h o~*\-CǍg07vIOHc,s -tP2SXt^cXm~m ˹Y~QixBܗAezO;gͱM#ㄟ3D0g~T7ً EyŖ Qi_c;EJ3-3 gzJ~+oLt))_!dg*qӉAWf*%}o7/F$!4h* 錭*4yN#ajs_/"8P/z4N =o7FM $ ҙqQ^^l뾈Ty Ұ-8DX_Fs(8+"6"ZWœgd~&Oh9zk!UQdꢃiEIOۡV֕dl *58D>jF~\&k3k]ՙPf>8 &5^Гׄ7)-nWhF R&{0"M;yHc(n5pKh'?i} 0DVoii# [u wH`YKvZUX(|6aB6T4 IdNZh{ܝ4 FЬA夊ţ)6=Q-qkEf2 ~Ej԰R995+)/>ZU1]y[5oDR.D/jv*X|x!(-dF#f 0. M#4MޞlCGo{Ӆ)_t I8-^)%k2k7zK};?CWS ,ʠY ߋʢGU0 2]O6}KbzgH%s#ٞ6.en#ƒ8m9?`7( "(SY--4$hmA)F(`ܢn|\w'TSV;1ND%@\r: K8SX_J! %¾7e>ޞ_)CU.7IAA8te91kiV;QsP?෶bLKs %rR3qWSJ1K$59вQZea8,l"2 DW:Tmӂ7%J8Q1~n^)rUPM8]Вvۗ5/b^=1vO9-GagˬM3b*Ug^)}@N:Y#1;Ts-ìp510:ʍfӱUX"h`Rf"n<|WːE{-ʱS{z=q' i5wYgZN ; [Ǎ(@pK*<=zV4TeUhYr8vfR($B>ٚvƟmIx[b=uu0w"ZN :S e *S$࿽u+,lx%PCkѼz Qc{6g׀=?*@E׫ryOυ>b*!Mů󣹌:hu<ӗĘ["BUP0 ¥;&fN(IfbշCC7TƆSr9xYm/^CnIqVq\fnK q"j?Z+ʥ/S{h6fD[QS;!Y<Δ'G| ;x4U=,j:SUƕ|~^5ά|@oɰؠ'*wnS~cN6zރ[[R2ImFie#,%~H*>8O @jZl}`Ͼ9%7 ⷞAՔĔ x0Y/ ~.kf KMP%,o\f8iR}1M:?uH4C:6(}b]* AwME>\e* h+/@rSKiÒvR:r7b"'.rKCl#*k) ?t"WÂ[^k~=Ff286 G?YWZsIEzVd]FvI8oZw Wg=J-Im EK_])=I ʓv 9"I" ]{$@;XE43Z98 n- E"8}$@(}7g@x B֕?kNڬ3<-F _JlmchD ),̺[czIL?jbmZ= -4$J(qmJxZֿEu)2a=]t׏Oԇksg#fy>tXg< 'n1yY]= ظ>g%-xkB&P-QTGՊqM>U0ɛe1wFAb [*8lPH*@)URdT+ fm:zjCƓGv_0;*r *2y2 M({Ml7VQ%_@\;1!?3Knr+,? ??Zlӆ3K˵dU;A>īiJIΫV]DAf_L&XLm?XG_HY n5#8¨s_cڵ8; لd\fu@RK1Ԡ"*W`;x ֯ 2&ڐJD`@޶]WFpյkbqr*935<Υؙ_zƃrj26;_n [hʔ׆z& 8'8 I L}V]JK/$cK&T0sjQ Όl=mZx2j6>p *P)a˯c8%ʬlPn( /qV%7_@T-k3퇾<BcC9v|/|c4@%'Ig5ǍyOw*xu)tD෯蟨js2e30d )*qIh;EV2LQoiH!] &,yC9vA?aDݒ.k'qW*1f)p-)k$7EnS+t(-AnBrGld1@"f8ϱ87 "?mTRZs .&Fs,}c%.l\~aF\tN2>8Sa`4R7}bNcG8yg~*!?=.wn/˯a A 4Chn1MO/ KIo\85U=ߟvxʱ}%ԅ؄.?U-omz:ƓhX}=0/6cM7]?1E%M{/E#TVz mׄU|\Ȏ'fǑtW1uUn`,C;f5QpG$-gChBiїg AyVDoI>y`_,M ks2aĂJ=q`dA?1Q$d49Uhz}΅44 :ߡaP 6^x0bcX] zHw^*`32]8\T 5s@t]{B%):^pI^*ЖS3[6P㒓v!r a9l6Z1DVa oE<~;{ n=jvޑ ݋ͽ4rgHAJ2LJ+--sN-?B<ȐB|w^{}ܩ)te6Oyb60rZgzg^w>AEog"BSdYm 7_|ÿ`OY;5$aA>l;{ɴ{Mnj*=?ގA\#\6`k6vG硽YJJƅ{UWxܩCȒA0,G|~Z%HIĄ;|cd@[cʝ0:IC/DtZmp'&(Ϭit2p֧[XM= j W{?,Tv+զU nBǧ//@LL|U)G-zV s݋A"C\&АMA:j_If ]+2th";lfGp)@["JpyĂ?fOʼ^]X #3X}$qc9HKߡܔmc誙! p:ݾD8ߦU|E/ p8$j#9Ii, )6r T]&UBIC~djq"yG] Û!tZS*NxJ"[MJyKl؞t]MD7sޮp㧕+pgDQUϣ?\cQ8&.: ~ߌ41/uƴ3 K>ƩbrC=G̯0Ϊ5e@9Ux8|ݽK5?~߽^C}&ki E-Y)K%7 WteHlk5~K\5C-RwZRrq*@RvIsڸt1,Ma/ӣ::j՛ʷlorf& 0s΍F wt;< .k&2= /xlvԆ$$_cz q@4G['߇["' 򚒗/"I ecx(ú:;=ߖϣB,~uʶwwA9PmW0#Lic)aTcodR>~+ ƣ{d߉.)f_f"ԘVa!M`xI ,0Dl!T’'}DRˁA\lABg'"NC_J: (ڍMYI/zս@˗*9`N>;Ĭ.5-S8+#؊= G8RF'M4q5"`F<11S [gE+ ݆#bBE~P(m\LA@ɷke!)l9ͪSiIQ\shڙe[5Rлq]sȣh:bVZR' FuмvMz6 [{ hRО6ӏ4p3,ɒW4s.%'5;OCyBZ,գiQ):Ӎ\Px9 0wnm r6*K`j|HRlY*ϊP‵f9P9F#@Iq[wO肇6hk~?dgD'JwiEM[މg7Q@8cO޺T4$0`:ɊXbYl+%8}#tͶ %}IH =6Bw(wwK,є槠nA66k%$lɈ'3QFj#$Pat+zWxϏ H1b)[TL )=Y_1~ nw)V6JYᾮ1)zu-&}0鰤i B?Uus}OKrRmm#G65P}Q a|oKiҁ3 ,߳%y[%קwO269݉XfFs8H |bpk[P)svg62OԌJ;bWFA2AS.4<3};xZESJY"1WD49ʏ&.d囦62}r!]iʰ2&N>o-yښfq4e*32M -*)W$@U}1d"dTBD$IH{ &N/ŎFY ECS&ߕcÜysj,U#IT)־- 4R#JsmGsh &O~[MTɮh}O_Ф< $]7;) 펷*t<bVmŌ/OH3Xޱ|7&ҵvڪxV]> > qEJOBȑyleg' V7]hlF9(  O`Y)--\w ehҊ»[焕YC7z)NO_ ^'I0}-NA$WoyR*2v=+>F,Jb--`~Buo~0ҠT)I[ias)c#W1lQr(F! <"0ODeM+xCџHژ("MϽY@Lu}e#ZA͵qoE v7}#M[$gh bC'+@zSN}/ͪj_,a81D%fzrMM)mkU/7!&^meIpm-y`r[˜7÷ 62u9nhfΖQM>U m@ 99-FHY VhD<Ҹ.3`yy)xB6` 4,be,pRѼU3M ER3 DǖYOآY]l-H  Iw͏ݣ gGg+lOk\= n)ԠhU#^M2J`dKP Ez:}~qz~.f`UAa kX7#O\N/`l*DhsP +{d["8B&xNmSbMh0 | -sCOepjP?s'dF[Y3^-zK$3H< c"v2pǪbPfOͺi" %Ɠ!(F!E S[RAPkDёya5>WN[)0PL-/dC<[,[ ¹+c sn$MjN۞"wm(,5cOb{H]׈!/$<ϩ >OWguTy3VDxgL~ƽIIrid~92J0w >fpY pE:#WڶggB=a/$}(,ۇ{ֱBd&'͊Nwe BsXZObg[U8)I6ndr*5u3i:x?uQ cCTb^6Y6S%X:ފHTնPlO$CVlӜ/Qg?[s؁$L9(RBp,0c/q4FL&-3^az⊏@PN_nD3_k#*~Ֆy/?5V͒ha؍kڙ-ns' {+Z*L+WT\~zKk6A4j*E ç!آvCQFעn~E;ߞ|`#XXٯ/TT5X)[,+ 3h '5lwRi߁`mQ43@Gx8i{Mr!O6bV67Hf& id[(0ҶN#1f1a&!oR8t#8%q5I~VlJv?d F X Y h4hِJ@ۉSΉ(y Y EE61^UXv$u&Sr*U▄֕.3*Ɯ̧ƈf ̛9_M`R)`, qdmuQ9ǓC6C\@G>Vx[p! ސƕUH1m9@ejOcǗK[ѕL[__s DA7^PH)UJ{T$Q/< ㎧E '12ɡeɆ$NYM3 SmvtA=XCddX@f\6qrZ>OjCբh6Q^ !8L3D9 θ4 _^-E#/].»rҡl8>Ofgϗ7"ujl5=H|n$Yk^'q7j_0YKFgscQC߇鐷#~0xۮy[%{! m;,- - @?ˀm u 4Wm><+XYY fFJY C~x 5VSt+9ab|Aw0Ŋj7.ǭĄTGMA`]eHezjӨuR5~3ƓGGVLbRZ_0t)$ ^ӯI P.iH 'AfëáPX~ QDs]#di.5+ 'B9ʩRa[ c8/@@'ʞ;&vNh}f" ۺV*ѩӔ5ש^j>f[yOZˈ()MDIny>'1 '7@ѩƀ u7lYWR2E&WT2ځG1AWDM2k)~Y7<RNـłvY);:2˸aá`Q5 x劋5ZN8@'ˀ5eǟnV3_ë́q׿ XfA0K-SX/Tf:Pm.m |\9wk CjLk+;8XVnjMH;ڲ(1tZ4u3h裯b;c_YBD=хD"Ƽ !~4smL@65 k]斄ӹnšӟgfwj`W*i  fCjVYk$d7|i%eO*0pQ!H5b8Q{$(^ƑMuڋ2!GAQΩݲf6Hl㒼J&FE8Ѭ|o|DN~s rsR [6[|;dhP_ް(9<`rv3=s,/௥{36k K ш—D']$)nPEk.#]dEOR*D>{DBnmlc{5LirmvZ : [[h)4_T+vn'I R[+IlpC2Kk1`Y&YmcbB=ʉNVW6z`*hghrI"Ӣ!N8+T %2t~oY_|5! 3[,|ū8WM'q5g)2pbOi_]N2JbL۶H|5C=א.RMUtKW.E_zwx"B͛&tϷoYHWٺF}QA: Ы3f;v_!#KalMG5k{w``-wGJ-MfDz"4Gjx/L=M7kv`.-Y7fV]C?$z,_/i J،F/Q@*?҉Mc,aogar~:ڎuOu[{0]5y߄;mE2Po3AqVa6JЁof<4\^Cw \g-xO5%U8Ur#.|;ALTOq?^_PiXbQB-hiHaz|ވkFgvn/9Tњ'ֶxnt~u|?H c+_Jo/ymAr4Q|nЫk{?CiS7K]~0+ U6&Q96mqэky~ SM,F/PN׏䖓2Hmt7$q]zU7 Ni e51J8~N׶f3k7ՠw9+^~z~1șXPܺT81!s> 6r=W܁aNwEFNGsBuwb:}ݿM-񪶁W'(պbB.`aMⱏS!izCY >MzNl9W<>jI;)"EBh9= o\j"[2(#PO Ϯ3pΫ@^L9 >[.a"%H?[-w=[ 7 !eP+˷`wd[OM}~Xs+J$DJ@+' !oH$.R,$r!OWTUYd(7 "ĝw^/k%X *25ת! xqi7t6Vs_xcbIM/ 5R+%7'z}LzJ}Y&8hF8Ƙ\#"o2鏚Z U0#v? %,B1꓆IH_.?' Ja*\t{7Oz~^i6gU,hbIJEjS1H?1s !AAq%r] t x]H-γ"ßc?$/Xhu|D}w@cI9BMCrr" g EV ~Wd`%;)e$N,o'U匓+O =$ԇM _h&5o_,}4S޵6ft,qT!&( A٦H[zf``hY vG)7 EY* Z>F*,>ϫx=NXI3\m'ѻhqwV/ 3bYAgWׅHyW=|AVH4 ;8sgh8+)3j-'x,^׻=虭G܀ §m-g(=_wb x [_:!69㚖<]0RP˳9"BKz Ÿc?֦Ir9 FWtDCu$:ׂ2 nIw*d@DԲ-gZWh_N}k^74'Iڥ }oQX4#~*R"+=׆s"dIX}2 7ҲӐEJ !^*n똆D|qqp:r*|{.uR3Mt0ADK&1\rM  ~^Ć~&>QBT ՜`EFICt]4B[:OVA\.R9!7FcFPVsM<ԁu)}r s0c@(#abL tKHâߥ _^.di@hԸ "X0Ş3kxN} qqUX~J,_.gX f .&cM3*8p9^x3(M*}w=z)5Y޼Ыj}#gro]>@R9'!4M$Hzs~ تK$iY6rH=,̋xش&Fô,7xEݦ8sz5zݫw"z=1+*N$PX_eh ȅy z-N 0x7{Yml9J9mĩ2;p%WMd&>{.VJ1N^A"m~po߄e}FQa1 EIBѴtoF_,%ߐ X{**s#/g a-:<|gi*=nB߶Et`=u%KUJX);Iv#C(nZJ")B"6]f"7yb P>HC="yD {,YQྫ3\oy?ZH[DGrt[A%{^>И '`$3 Qܬ#+$?k, <h5̴/?9 -XJi׵\̤򵶫z[/ާe\/X߭3X\hnJA]r QvT6rQtС4q+\#7C^߻&F%FŊ9=@?Jz%g yAKh$2~[gYUk]d1 wyEv^h²ܤ|h*Eu'DƯ k$HGmc0< [w=<l5'3z/1jrlW+iqQB&TrdՖ#J*'j$'gZwT0l;ffjbˏTاM.^mms<7D=byB5"~*lBXo$O#%N*kgQ~OOn_SJ C._E WTHgeJJ)&sUDv/xWQ^h.D9VȄ\ѳ(Zn,k*ıjob0mU0 JʻޡZ\~VELz&:AI Wfg]Rv /q]57P X ֣5:&krCNUR>S$n24|qxc%\3n\wl\b:R8qmi+LVԨK)K}Iyryaޑ,",\Do4U[E <,FS2s/ZU,NOk8Ӌs4z- [@0L0\r9/32"4|]֜ _Ý-I2F213 4fQo$ {Kc?o& d"8-'aZ&7/- &h.[j}ĿH:"I֝2GC{ ͐>Bk:w!h -;HM*%x&f}p݉LE?SI"hB,*E6/?Q'-7ZwR5&pM.@Sk ,s/%Ky [/%Tp鲃{]$IszTMJ%g~2ДҁS1`\g^yʎkBi43<6_p@1W8gnvR B5|-ޚyֺ|/<6[ەRHWZS,R QK6$12\U\ec޷\oEi# %Rz43ܬ )Г! ,jBq4uhZk7Ho`cJE1y'0-G93|/@ /eXM{=Ѐ |@.-pn6yBzEܿ}4^QIR[r2eBw:Zg7C)!k N\ 2`| Z'q C[(1~e3T ~g -<=`jL$qTz]dB 搏ºUqjh)STvܥPlZY|SY*a܉4UC؎f .~{JBSI+#håH+krվ6 y˾pBTVŘUJps|*HuTK_ߓ7U0FU7\5򘂈̛^1)kNT宭L$R^|v<%.6&P&Dt|3=W|Q#\ (v> rq,(@҇rK]|ä܉}w.˷ 60&oaDU9~7 tGU%޿K~_rXfG8 -4w)X>Wu-L+{4nJ9i,]R;n:qZmV \tҢ ȭ]ǥlQ_;U. E&rZS4rj2cU6rz]t l!+|5;A a`vݷEj]=9_1|(v2m_"N H6cgw-ԩ--dV= ~i''Ќ=0M$M̘C *(@bVO|-X@Rm#g3cTn4[p7Y%٬b[(IOmޱ}AUl^Rqi/q.*ѽAouUe撙S.txVJz#b^by) /ѱ5~ f _ஹSB3dޏI=&5ek^C-&b?:(7~|E+BPA_p@pJ?!"zZꭿB9|&jA+ɤYaֽHQQN6 +o [c $/QDN cNǮE˩mX7LJ`KҺegו*J fa0IIP\͙es_Q'0fOh=11u}IU7v/*F[V9vgYB߁ b.fg! 1µ)Ӥ:I=Շ\J~z7:fx(Rڝշ}cL+UҾ.oۥ_2g!p32ڤiN̂3p =&In~ 81WT gDfP/6Z*#Gܨny쁭ZMl<#(O &t NWsJ0RSჇur] 8Й6q}lYh;+'{QLc#Jz}9_w+ǹcuť0]O)wm4/,:zXyzXXNףvZ]l†4 jk" J,5\#XP҂ete1dM(V*|ڱTP(2.óQYW t y.,RBn$"#RQzB+K?h#X#__vib[yPӑPYhOiQzHN)N6t*mtpP*ب:޵c|DѸRBGXcov O;z2[|eRD^ 8 %FB`QG焘jr,#"E32}.&yaJ t&vUb0}nRY{?ۼ\VpcϜֱRm2 Z9W AaےTEpu=>H* kYjd6{N\GgFL V oJVj7Hs@b1ׯx3y}\QH$h꒠@P ܺU]Vh)\ydq e"2uJ2UWN5Y-?|qcb񭅝%k00 ŗtYz#U FpBٽu׉29[5x<4JlB2,#(e^9yIT+υCwu3x= HG0&E989#vޤ{en^)2e3ys}~ [ښ~D0'w+J(BDP2c+.uD2m=AX%j $/$ҴYxʛM"?31+O Č*:'rM.'`NxIJd!룻'K,~/e^7(+]#StqUg[zz"">ΟNeV_/NdRT;#S 2ZW"p_"U5]U9b(` mZ4ۚSW})# K,<n^m飷(><ߝWOLHE¥O@ԓPSBR_8c5bpz<ǝ*u>u#Iz=B&?$XX޵" NBMǧ29Jr9twG{9 nc|?hzy\r3K)Dfc ܨaKnϺ yg\`NK}JΊZ#8ZG`˅FN@%vθIOopȧ;[mfRLsY‚řQNN$}d: Sd%Z3T\tcƉwdɵ(f|7hh59Q؃&7,ZbPXŋ].vH曥K$ȪKmADAXj:Zhãbmɓ s G] -X9!EFظ+@\ba&9՞\U7'g+Ôp)T&Cs~pmހJgmo#ce3ȖBj%ּf9{+ЫUtS٭'Y; pUňp^ԉ8dqX:C6M6za9ٳZ'Il66cXBB40uui0q٦8>m&eFsJ_N1ŏ+O𖣴=i*KUVa3ES1+Sԇ>$ZS"Dĩ%X,ۘ!k k{]Rŭ& 09Ur$5 l/Z~'xJ\|NVK\/4yc,H&&b(u劾fYmFhwBRb[$&24y'Q>iFD9!H~lh<վF(`sCn7TAB1-%e ^ Whò+Fq6:;!w~ѹꉔ"R Stf$ i1pKb IJ z}$Rҿ[S Wrdwd83d@FP7{t,]+*I}poupY2&'s 5G͕ 7(o* LT_{;&Sur  S"WxB-B?* (̹6Xj9?bqQm)L`l:= "mJm)f׾u]o 4|kMq' `f&?^qvRĭL<&(D˕f]B}rnqؓ [Ћ{J@ةeڃD2Y,E^ xeOiJsd ڑD?*$voB{L& Fj,f<[+H۽;T_4w/;fHl\~ơ4Ǐ@ļ8rKIq{&'-4NhBg.v|%K-v: -B iknQgZx=#`W (g3g |g|+0pPMM3Lޝ'۰fl9]t53 ? AU#\D= ܊B͙#bEH9ZUvM MHcWlF՞S$Gr/C0XihqW(Wnܑ40d!5.I1D*(eO@tuHǢ~D9۪̽0- ¶f@sSLk!=V1x1|ɲ~2,ὲI y fVMq T`e,\{}CCTsqAk>Y5sN3X-RbR)Ԯ0-JPPY3y0a?2G)_:P4,g4eJ6%t/ o$^NJk6޷e2Wegf )bo1$JϠtu2AS)]tTLl L&SHԕJbG?"H$y[$ ofq00,m=P?YhÝh9";NZj Jɠ.L>kI)2ooVڨ;xq?%=X[uNsYw#O*NZ &ntɹ=DJs(D*tDB̈w5V*RoP:UTsjk%avrc0I!N)P&6])joH!S|n0I'mVA6\c4R+u5+D OW^]UNH~"dcisЧmcUA#$qyjlf</, Q|>U QC;TtF39?=kc,`RwĮȘ%11+W@͎,X|h q%HOi!Jӝkos} %vZ|Md}$lRG5+ZsRT=oQqan5>KGqO/Y4 PyޔsJ!`Ͱ^ӕ$"[оEGQXWGaN4O$r-2UJvQ 0za*no|?ЎO%A0?'֑\m{Un݅{Z UA}|#թs@Z}y{35n\Hha\&q\7E>/+<8h9&)oTSR`l37ԇ܊KCPܔJD5. $6heNM'K_b_~%MAP:yv ߦSnI:$D6BptQo#>jn"@38YGh nYG3*s"۳E}].LBض<%{0H4 Ln jPh6e7 RKx[`ԬWлwfg#:O T4eh#q,+(gD[߱o >Lȃn 4\[@ lBw +ګ9jN6q)(|, |'Rv`PNW.T=o[=ٲ~3 AHM䛟LGhxhG6p 0&IB?ۨ{yo6mڃ;͌"ZZG%BHdґu9rҞswiSLn;:]Rl,-Pr `M/R$[*yz<5 :H%HgI< 7hF|5&OT" -",S17DA܆ſ0̌v+:17}UOx%T]P(+b"*1I v}37rNn[;nJfKaFH2UŹTDTmM!mL9YerjsuމQ)jP3Y? |e 0[[M믜oS?]o[QuPکPn8L?&O}ڑ 9s:1fx-)omD@pl~H"jEdeXm%:nZn(3Ox@2<,J!Lzc׷Y< jVB`Ls 𽽤ubT v(".qR$? "Zl+R&>A}&llrpD]z4{'LpPmH1 ~IaHv|GÙ`ӔЂ=0Z0U+hmwv1.Hb/DFw#l GLO,l V-QjxZ +Nz.46ѧM5G3DNeDFWⷞL6DWg9V Z/7^?澵b/0ܬ.Na'>hG [PSD? VZpj+s̋ fPx8KT nCoڅ%0_!bC >U@ A4iBp_ ,#r5r -IH)/iSWsM ʻK0j5Y6_!kK%!Q~{"M̦:lgTr$lu_G%Ho JպQ]6bC֘ݛ>ʋyoKEqщ%etA!:mFEϊ( Fq(<v JĘe(cr?}cZ!87 F#Z\_A=+m=KNg2R>y좭y}LAU'L#F "zTkDڠ]ue-ѫzPYpŕeoYU>YUϡ*:ٵ:#^s(<5bOLW_]~ uN%NَXuSiL~fw:=A'Ty{|2-iYQ=ۻlxvQs|,]|25l0Ĵk mB1pqTjg.؂WZsvkSτ>"Oɮb**̋tWjAp̆O[\Y)|u'E1*^`+گdr[/T2R o|X"痝Hl6SI4nM^p&[>Yrԇ({,u |蘩 njPҽ920F&a%߂ Kרo(VZl\d ih*۲kyJ> sT/xHVe{M ,C(y /zoNBHɶ025QwuG BNY4ypoj-YAlȽ.GU:s띯o0|D*D`P/fаaNcrz~U]و1S1N2̔)`0[d?snOQu*a$s dh`:'&BTuINE qrRihq u4 Yo 쬍`RIn'ђjl˻9?g*;]6i/xe6KU&"ql)I'7@Z4hR_Q29T\TM:5^{OHK/3Տz?E/ڊ-:ZL OF<ڴɦ@ i'O6 몪 nwTOi:_NSxx1[=:mnsRr|2[|6b3 殏9͓A(, AzTL^CDmDjеnk~y=v3@<[ qdy\>e* 6^-sJ騋k0 ^MI}(_[eRq#?&[gKZߒji~~Cj0Yx$T??K˛ylͱ)bT 5WJ!$$&Q YY!<'i@CA+*vPACκ0C,X4 Ҁ.)D 2P~ 2/I{KZێf ,^7;2A!GBwW yCENۮM>;k.4BYWPVB6Fp]C8le=WG.We4!^94"u?^!'?OFe5ekQȴl87.'!IoWB0=iuIϒxJImG_d(fS[US5R=pht0CU|XrM ("xcS!|YaRJE(ʦpf;cwMݞ50%8"IR[z9u&ʉ CWc@P8 iB7Q_B\ʳ;!9̢ט݋;܆"` R 캄#:7+ 4v˚x[U"KioJ;l/1vifz"`oT3M;q)Ӽud!G zMen\^,3^F`.UԃgU{ؤ1amie_ BmQv{xRD%,6w {q;2S@R  3 6knzLLs٘(L`B +(y5|{,.l',ͣk`bIX2P=ncrher;uc3eGס5/<Ֆw)UܣgN|ˍ۹<+e#꯫Ұ_}#@ @vx+;J 4 ap3Tn"Hܧ`k5=4J%Zv t"#̣湼@‹|HlU!L>fl82q sog$mT燒YIA i]e;_{>*ʈ1eMAx6]WjPF jLcIT>j\74=j_bS ^_sG'.R^ԋD+0qҼ ʋXz F2or6Hg"s %ØK:jq̂lCވ(ޱH_ܝ9f t--^E,H>,htc5}ج$WWP_ Hmk՝nJhϹ{`V2Jy5r6~A%0iR|Dɤg;IB|G+7zR /Ųdw*)5%W\{\f$ײc`|u4Հof6VE] wm F"fq-}-A\ʔC͐eCW%e3RLߴGJXW80|XoFrõ߄y(\ẩfY5㷇,}6HDfh/14oԹO&]RK_'3ziaxe(OZkiͶT]Fb5.٧جY.@:)<+FY\S &&*8,s{'Xfn@ʇ\P;neݠR^ќQ˳1^9X s5lMd:jl$qC}EMjPYjӧRhVޯ La+/3 .ep}jhp9GyXR%i nZ&ӝ= ;ojZEg"]m4UXtixoA~Bo]3ҪKFIUTmA< % , +;,+8UImB/jnAeLi&c&/qV)K\x|T)`f)1c:N*%Lv~k5}䨥?IcbE/[3o`jLHqsf(v}/A#_{ԔTC45Q:0e}YM 's7U"I"Aes<h^& ."cҶ?ZI7PMqO`w15uYz@ W(\XMĆbn0|޸MfN3ʡtC̍ɀco+ʅʔ*uv9Fi?QZXѳn.ײPO'{5eB!_eY$WW A&%RX9MoJE;n6Px%lW f[^;vA߃ӶsFF'!ihHz#sVUvP7r ΋rHƩW(ϴk Ed wFN;] tx߁TB}țӲ9!a(2nSzysf'H)ڴO+A_@Ko{:_]qvJFJ[B^@8 ,+yAk~X"=hLp$'-nN? !AWH >;WdէG>_ȶSYLbaM|#/CH:me&E#R唣FX.mb/~lw`:&q nz!Q#Qh"_);֭g>צ05 HY5$[؊R~cL$*}XPr0'6i!Gj? a'5+NB$-RonOluX 6Z{!(߆ QgƩ[᩻xF| Iyԗpb#HKxLy^gԡ7NU:peEi|IK6 ?(mӐǂCHT P>׽#[O5QdߐΘilb haG EYOq/>j/A穦cWc+YCeamsF(s&Ή{tJ |dW NM!ց>`6nWAFn/=`;G\9SajDgAS݊&\$<'Uٶe3u؀z(7)0 {7p_"T~) ?v)k@v6C<{&Ab'8o_|3q`?acL?%[\VVܺ#}z2 ]׿d@6RE@$bQ$TПp%.Q_''SՖJi 3D6j"A52΢9$>;*sHA"``~2 a 0;4tA'N^ѫRH.ҭT,bsntቢ.e;掍c{=TWk4Ϟ[A6эwXuРuX2.@ yjEؼ鶐ckYOZg!O]ú%m3 ٔ Je8(U)y̺F(Ȉ53 PINP0G;"_|I :eiE)">>1O\_I_$o=вsU*&<4r~RdC_&:c:foh&Jm[ru[s=O-F1W"r_1GE pں0Ј7@1fU(j#rie6C?:4@4BvFp}?%Rϋ.b*i<^5ɼby9xh|lM~ëq!1d\I猙1s'- P6*iݼ]n5D˧(o3\[/&. p+Ql-ͥsN1@N,['aP`Uj~CJ&vCMxs;m%ηƴ{P9~:Sg?I !pY‰W'VyA=RPN¢UiY(v)wCeˠi8BmtF^ZI;5&Wsnig@vO[ZP -VL>?Ӡ=nQ\tfV EVjgyyݐM*`IKc4t'ob0t$|'zrm\@=uzT7P NV2 6¹;`ITŸTNS~ny4-A?HNe:3;JiuVۺO3^w"ᵊ;?_E~WgH1ئ ɪ BV+S+Z9DL;4 L0+eK__1d7_O7F@RXtCQ {4"S \d_a &'q4adD߉BU-9q̓d픡I>#>`\Nh; Sh.}f.n( R7 q]K5|'- ԲqਏAW4;k [u\R2{q p}o\\}*I`Y>i:5W?J;]!_&cى7"i4{lfNW_?>P/PD$KA*?9 FYaV-AAA`qz_Cw7܇IfZ%S{J[Ҙ~RՕo^U!i< XeW ES >Ws3{~m4!ctc>;jPIjogm*7ǦmJGW:ӹ̽\'%D?h3IV@fĊ nr>dQf 835\>X7d EBWYK׫ '=A[}vhn^LESyXUg2@lTIĖOkw`=yftY3a\M$"YwG6Jz g:Z2eLq^rQ!2](aEmTyrKACQF?ٳQE5d#lUVjD4;J^:OXީc-q1wԓ*-X#8Ooʑ &9"+N\*˱jɀ$rJAUWLnTe*-: 4:] eFqR9NZߴ;&&ݝi 2[TnMvM|ֶn[9H!RQzYd(B#D%5:$h~ N1P'I*W.qx.KfЫ#!s0cT $^W?fg1ד 4M8? 03aJǬ{A1[R#%ex֝6kt8 \i%3~F,,M=g3 줌*as@ #:7Stx-5|kdžp@Q፯ ;OX3j1&„\z?!eS ":nTuHF!ip,7,,~xr IcG  mrTCz~Q~\M2h,=k=>Jo0J{. %c#`)c3(ϫ Q<}&XW/WR 4PBP39>Uv O,T34ZQiRg;Lqi*#T]Ts?0[d۲({m^3mh&؆QuWaTz]z{cipߟԱ8)%Rciv9,2 A]N& 5S^u{Ȝ?]G 4n&Cy*eN]y|Emg*rN2?N҂,u}-΄XTe;^BI%? ڵvuǤܰɚbܭ :PĭFfE8 9,Y#;[L—XdKb3r;!Hy.Ƀlea8: QT#6F آ#9'/Ib/FoY]߸_wيw1CPel ZR _qcb%敄$i(w%&[uFy?95h ld+?Džٛhvxbܴ5]Sy 08('w/3mQ.@xOD׳ ;8)L+I;V5@s$'0`7f=0y:r+״NٹWF4.|ihĄH$nMȬ&UVxvBPe[w %X\&KJz t1p> A 8 *aܶsتJ4d|fal~5O&Nx$;4Yԭ1Ʉ8Cl*_pjV!ZS֧ 8u|Kι̅n0ȧeءKDǜN6yP08>*+}^i-L%,ŝJ4  ,/c'L2ۙY̳Nb~fhN*%oPw~T E6Е3z Ee?Q$]}|ՠizY jl"B,݋cEeUbWX\_WEr={f};G|^823"&1XF+8^K[Rwysxu',fFNhh$]Kc2{7}w1#AHټ"<:o 'MTJ"*PT`Tn+9:[05ha?p/]yojGCPXц ;% rce(h F35eZlyF2A` t7eʡ~c{o xKӆ9]lM~#g(q#tUhM? l:lNcnۈa{+u4OJ @Jx&``L6Q!BI[pK/a@LV?ٔSk4lHw5Z<ȫV ƅR84;`xǵFj9E]@lVzQJ=I.]#asu8h=;GjיAV98E8C^ ln"}kl62frMSH +ƐP|9C1SD&rRMiq}hT~_7eQfTo$-as`ec|.-\l$I!lH tڿG6}(hI{ fQi|}03y^7sGJ:Vn`u#rӄ9t=ƻz )1p& (&(IcZA|:LvkC ?{1 j80-i;U"+ ଡ଼Lh}}:b w|,oJd~1Zk;̫fpu(`KPV38a-<Z-;Ȥ%b . ` J b}i?Þ?<뛺po{:ncT~G%/'+U7Y٨Q -FZwXⶵ,D;3bߦє̯MRet?ŧtk{RΖ|#V+@?1}x|)խo+U/B| F?5RC&\bcc+ |X{?R6~bp¡rNIE2u%}; js[gg>qy6k`ÉqySxkf m`f6zbMrO2iצY:oG q=z+-XWnZ*Xlp[t zRe| @[_lm iM9BPqV;&\xKfD"*{&QUדXeSUZkЕΤWj^'m2}DQ.{roLu/QBS^;}QtmPҭ4}5;0G)1֯&?4*sN*-odJv*/k;̍W [I7w%? 1ׂ曮kgRd&!`\S;]fCx.J/5&C(3fo;J+hv =aB'L)d)3r@K].)jx 4^\ҭ$;_O̭c_ijYD 0Pz)t ."++ SG-qCHE2wOm+g.ʷ2uԨ9#f\jKv6-cF{mlXMցfp]9 )jo2B=WyC [6ϡqI,^ͩZ_ O>i]RbSԶ>1蘊Ln$x)DŪ>Ta"[srem {NMNgR3pꥪP5ޓnmgn(a W \0"xFɄeszʏc~Y0jВV^LWMI\&yIV/_^v: K0B.'aScGo]k7 &i뱠W Hj*R(/.'0y msN$aV@OMDjbiQy]$0t˗$zz`tea/[(~-P D^/pSȮ4Mk O kswG(Dʂ2LO\p%Z:A>l#35+N/?[@\h";̪dvRie8 qĎx2-21UCjڍiuWKs;.d.}N[ALok_1mђzWkقalvvZ-!CML,j!Շ4IL [ߌc0W=~/ĕC*8`ߎn =3?\W %wNЗ|j8iB&gkcR<9X, )3%{L`y(2Ϭ"1ٚ@fWu@H4a#@Dz+jX*?K\‰/F#< /diƤ#`} ˰ƴKd=Y#ډ[s!wWCB?P~B"} &oϰ3(~jx=Elv u/rv6aV"[ WZx.I4G^Th v]GLq&1Z#2ON6ۭ'@9@g"EY[پmW]ݭVfRA *L.:nj"l1p6NNt:aK94ОլW, ~;.O%Ǧ ǜuwZǘt(܉4($& 9*а>CטPUİPj0NV1QNӊQk!G[X}u̯m@9OY1ޟs0iAIim5qyd@G=D+kv8-cǰk tqlp _oR?u9d*, :msoS =#}msmC_~wZ>E`(pKpЃI S2 Ž uAgP-ci~;ꡬZKfzώ(MJgnA<@0B+ X|Xr^=;&0+^lw{-"\3;cVjIB`lFA8N󕵻}=I#{ V~zR&JkB5٦ZZ4p iSi/tbn(l}'PA$ ׯ 4 ՟aLr)Q2p(.2"$4tO<*ْ;Ңo&ReQ/Cփ kK'$y ܥk*K󀼠ymߞIڽ _v\6I~#3s2F-w'طj"(smIY>2e' bYSB!"kuC~!/X,=\Av17R,IR2[j$n[G, [mT oτ!|742ATy6uB,vΌ?DEҗd&24ξgԊsmyZ'w! [!tv+yr3JCz&0:땩Ty^H|&̺~t=#<-x{[h\VZ#/0!V<7!`^j$ݱ{/ples5J} , ^*.w^VqH(.DcIV*LIDL_WK91&e_4fOB@.U!-מygOJB9l(!$VC}uJ!0ꎤEŊo(s+`wϝ@L˳CmU@@Ůp# o'}ޭXBTR.9qr%IE{G3oQpgW> w/8D[mNʌ~޶4 D#CO=D75ܿusTAHC=[NB:];xzQS%v9cwxJdE]'bПbSUθRA3z\Q`?&{}/jqಓ*T,4_Gv1o6<7Y^>jW:t$`ݵXB9s{Z5ڿ l 2Q,A1Q?8VE "^eAy̆D|#h"ne4wJ)*) qh}yͰEP8/*j.wQOJA/^DFmǠK1ёAYeOA& ,T$o"]|F;;dBj FRm-jMwJAPlw֦%[]#_{v5# tbs[.*dq /gtӣԒl]ubtLSܕ_uP4ȱ"/jJNh54KBaYj(d޸E3x9`A<>3ZS9hm"-շΧDMKWBH'9%228zfh^Ѱ7FCMhr+=(%K p،J>Ex1Մ(W>i+Nb.B]f8럈:ѯFT*udj)oě6f<=m,Pe„BƄlHL^l);p .6bj'!BCxeOZS̥Y. r|@{*owӘ;SZ[ x$?X =y}@LS&)NS*,/m^Y*t}!ƌdX_helq.[#5T01Z3;W@wv^m >ꀛ~YS01|2+Qn7%bȀe;񹢤FQqX` 3gf/$ 6[r<%7my/uk *u@_jQ{7^S?9 "}!,1,_QsIJaq&o3Š~y' dO7{CP8f.z6Z :On;bm.ꢺ_"k Xsdɮţmo\ݛT^ vf k>,~I1_j5 GFq\Rɒ'NDD2,#qdeDEndp?hnXl^"ȽDvE"z;h"S#qxc0"~tp@UV0VRueRÅIB]mִ6 pfR'摞^(8z,m.Z nwȿZX@Gr滾qDt%&_4T0y++o69F\GoPؒdd g-3A/oup)A㴄lG^ic=6ybdD-l}~[jWk Fu$jFWoL~bMVgo-*Umq&փ(D̗6:s9JkʩB~@gc_.G\%lV6Ž&~[*DBohgĥL h$P1]9Xi1H8}`):z`O7(~LAlbF1fe+޷e-~ׯ|@Y*|I[U8h+n{,.V_D~po3lw:`tf֗L@OY168}󝡌Vn$Y{@EKm;P:HE[R$%ݞu$+Q+{Zܭ\e{*+h(ERӲ[HfÎG;|:"0Xu/`kmV@4$-.p$̦{ʹ?K1B%Ɠu YW*%Z-5R`2bxsWJ阯wDd{X{୔ќJ%qQOg%CZ (lPʟr⤒y,[R"(mߍӞd˙Bp|,"&rWC|s"کu 0siof,_vFDU;ϙ@roK &l] ydneZ`P!=scUӢ/1&4 Nx]Go[XavHTj2fMfn #'Ke@FP†xjH8o}IM2oC`kTM@ͼ䕅υ`VzIQ8x;K<56U4,R^N< ##\@t9L(%&s:J~šOs^y`VX0zzxx(tX!0{Mva߇IU1Ϛ{>`vĦOܡ>D1;H|L6D!ptõF[?*y&{$>"v6dUx O︜S 5 3;K~2ŁO9f3ͱf\M`._DĤQyQ,U{O`  S|u!l߱Q7{DĘu"/Fx; ?4ቁI Dlʣ$|߇1ݝlxa ]~3;O.H_|]+}70rN/WŜHbf'2Fdq\zA.ˏdz=wt-b h8xF`0-Wj#,rPᲜ -E"XL(k0;\*@rR+@>dcw9~Y\gm44SM@!w7؟ЂUH9{Hpf_ ʍo㇨ݹya2PYJz{'c1'\ܸrQۜ i<]6qiiP6 `"#1v^8?aG}zxc$\H#<0+gZ$:/av0+A?AeuM;ֵZd. ~^2dbK\,t4fQ1(=sZ12RG*ؙ,̀n PNYv`bTQl#y;]qEvȰT=3#ڠvщT h|f%s Mx"ǹl%̂2~Fl(y2fc,&BpnV}JP~EQ^WPUlX7:teezD|#GPSjCsB-fWW'xnPp,-蕫M1>`UgO<31 u HrF}NU8BX\ Ҹ˦Ե ?4lj#nQ+1 7qQjj{R*{AгޤȪtE|zZ,=֊EhqMo…jyIzo#L42b:!M(/`v+M[.ًl{F#V]Rǯ]aG 'awފn?5u J%-J>J1 ڠ,L^.q9ŋRs2D;XZ9>Fq(_ƸhgYc8wV,udژNTE#d:}荻\W,DP,&k:ZZ v,li'@+%,R? FX:MN I(}wk,3t)$8#W1.`bԧ d1AiO`0I0#TY0IgpeC!ffG%'|ix=ZL H)AcbQL8ݖp._ .\pݬ:Iwgo+/dBt}ߕY|d|@G4D9I촧ݨ' 0g#c!-[?F4ۑ1 f+d d}dU7QR~c+mT9_ yf@H!YRY;~ Vx HȲPZSi?UvAUiyf(,3H*J*_?fk2lJG]A7[JOk5TJ~t3\?p5zsvK͛ lӉ3jaB I >V4Fʞծ>^:i[e$q1\QfR (v9t"6nֺ*$!f\øɌωP4~mz.nmb>k# GԬzT+V5WlNoQ 74@<ޮn`a@eDqϵ)rq=_ ]H9Clt81|R[ڒk_B*ŷۦ*|YUZ 4I'@.br4@jتP-^ L5NwMr⒟Dc#]! ז gB u֫#c!u̩^Dź8l7`Ԁj+ 2.sR8#0?7egqPM\E{#8x)7Z7҄*j|o-LF.ؓH)H|dF[vyJ]/"J}]؟@˧ص1Iuv;L!S+>ۯUeEn%'l@)J:'b&&|:XKl1k_WA ^2𣁜) UCqAܯm|S `}">ŦBݱ 8J|tB@ϻLzMD!U &PU袂BeCxEٌb s"oґvhۆ5e' n_t]RDcdVA~.^Ւڝfj][Pƃ:}'sYHJҏJ*qG4"p窄a-Sl/~q%Xu rz`ErzSb0_Vv xi#T_Ҙ̋*&-73@ R&}gD[Ӗ}jhXx\8i\/ $\;'yL[DNM> p31VmupWBUk]OxȨ q3"I?l]`a<ɈKsi)fX8:m$`< !|H=B!E.wcNq >6%m܃_ڏQ3ڧ8kkZyvJn{ϬjavB40'4wq"=xl~V/K8z3[⬇j3&Lp~MPuJ&݄.%0=j 9ԮS0ۊLDDtu+ %A)Whڊ֌X~W(uzΗ؅G0YOAhcⓧ.ܼv(5SN Ul\&,"_srd0r/&3}_&ZB̖^3X'D wL9N Ѻ}FUL"zĒ+guD8[ X ;;B s5ذRCb CM~?[ʳ'jᥲ@-=Đ}ڙ}OF92ʘ-;67mdj%X1t~=VRLA}yEO0& ]t A 'UM+ Fgsc׉3%bU!si $_;LT[c Zwuc=`[_% '21:f3`N>z}SBw&]t xd܅Pfrяau[}I?mbH8ɥk̇*=v@7nR"EU Ƴxw=/ۼs/:h˹|(H,Q([ؔ&4ށ[X :+s$@JS<"L]Ӊs MXRq,yFLB1є|o,/' g7q1Y/DJ+_LOp6ڒB>1S{ Q/rhbJ_Xg,67&NyO, ҨNu-t1tg<ߡ4=|]b"AiV|NW;[x $Gothyig_Bbckb&CsY+|h|{4b7#v[rKڗo - }wNU>?_#% &_W~sI1rG>ʝJCa|ʽu"E\/[w5 ^g^}w;ǸO#`J%`(Ev:f~o?"ABYMJqciL%L|k4&nS\QELRx3u# Q Eς7v=[ݾGdt}o.$r4Wp2, j暘i:sy>;>3̫HfƛÚגxPhK, O`uZ8jevvS@d%@'CQ Oa?I)sS,@qP{꿄5SYŮYTr*;~M;FcH<ЄchgNݧ o,ƾ+N M$Lb|Ys?BE1#`^[Gjw_"vbWwKYT[|I9Y,-Ԛ\GHvO`i_as_7<;*H|\ .ѹbbfx*{:'"x)xR%noK3 .Zio+^%iߍ:|DO ܯ!pp/[f{-f~˖`^]V>l(V ŹY= 9Yf~y Ĉq&}q[*AYg̿8[N 4 F?.yxc-_zɐmLiiv\f(P X˔Ҡ7D`=af2_ۊ}a }8ix_ޠ_![BCL'@lo)8L/,>Z-@w;'%l3E׏SD8ZlBPUm\Ǭ)q xCO\%&/3^=7oL5JbG !]x-)KKb]I6]J 5V0KSC8ٟCif r8!? Ho˦d\pיhv1Y"Ta~+= 3V{!'4^1l'Ug\ $~g蹝g@"k< #h+F=OX&dSĮ+ݗsS(*iƪnfi-<)o8TjF;|'K:/hht-PR uU7ף8`jH;Kﱍe@OVr9yFnhPAhs۞>N#n)a\DƋ_j,_wy0{s{GcSMz&\"Sז ypwl b71?tK3evUp I#od_6jQNmu坭=[!].RLC^ͳ7R7`)˛@J27%{Pb.e?)V+Un>3Gb+`z< WݴluX[ZCYN;| q=T j'^_1 վp `l|X۩8t< , NВx#8-7GX`J *ZU HPkZS?SE$Wr5Cc5ܟ]'Q@Xm\9`i )ɷtJJ:g; hΖqG-o0Jd'k( x?s{JyMA/DKdJjsC@֫inJNZd˰{w/Dw" l vB]b;2dn/3,|xW1ds^l!j9ʅH4zbrqK!u$`7X[ ?Ɍ4m׌"s[GC#PsEuϽN1;_ax3gIow<Ձm]߮J# x.?Uf^r&mY  x94(s,G /B6W0/b,>%X<2^ќͱLH .|y\F?$R/+W:< ;"O Pf+ou vkd@Uaӽm$n۵|P@d[x_|i,rz=8"렃/ F0 _dج;.-Y+W `s DHIVƵjN/IϹ_ڶmshMf&8D%^(d6⦪q9g k}b)K_ QU%ӣZz/ah?9xg[9Cbh}%ᡘzc(k붪܃ث"OM0ڀø .. J6n >o.eR@$XN"ϫ,G;r|u!"OK=C"O^}hhR9WuYxldfDS.VLCMU94m3S*@"3Md\G }!ɜ. FQϢ1C+NoCࡌaDPߖ ,0'͆@[u06߅qxiTW<ը~HICrD`ϲ֘atތ[ik>XoH$qڑ]B8 eb.Eg`(b|PYSQ ֥Mw'x=|y-ՓOz!fP"e I~D/F#<Q&P)CPj#6ё^ӿCqDKJRs% [i_2vY*ԆEsji}#!e/LP Kt dܑ) 6Di.]ţGd89yڿ=HWKLk^ѓ|Mt3u6մc63v8@rXi,ۮMN u+9v^%ԺrmX )څN0l999 ) ߆'㱱 VAK}&7T8plM7HDG2 &]㽘ܱM{0[vhHmÕWc ` :YF #6p6bUУ]GZ"u,™Uw!2 9VkS-R k ?o\|GThCVL߅!qD9fی(-tKKi Zr~_gLc q]R^2hL筸wxlʽ1f0$"@4q+Bޤ\4Q]v&Ɏ?aB:Ƥ&CS#ýr!,;뿆s8 2lr/igc߯ V2Bf bWq;UGfGbɃ,? G`c=r'OG[P$ց'UK&A} 6:pݙ1+ :>lm &m `RA+D_olVoaSn[?mc/ dɇBV̬åbc3YgU+֦i"*?ZvTO4/ (MDbo}#Q8T|RUf0L__R"~fWpLqx oŃ;B*,wQUa4d;:wkb:70rm:H%#}qyhr4k"C7LJȑ~:r"sDQ0iŗt b-SZm3QR}k`ly.<>YzAs' Ғhw Lx~&Lv\L.0# eu< ׬H3+Y 4 $Aau|g;bR?ͪq7PKZt4G"n6eͥkh,rWw:[Qv 0~ FBBaH%eCr {FיUR>y7.]݇[,%}tVy[ Ǒ'VD tY-9^sF"p; L$5% 0r)gB۵)`r+QPB 0{=q1mVrD^Kyb4M~oҷ_9o{-QIaA=\pWx,d. ׂnvS]Ֆf .n{Lr譟ͧadK.Czi-Bd!pӎRRu&zW:V2XZ܅)<ስ%ƾ(䠶y=*npw$Xh@r%x^(|2u|}{]W.rP?kr*g N-?3.4Q[J>pyZNfJF90=R<՗/^=EoQ;Hxb^棜طI@eO㓅{@ 4׏ZrfsC=)Z]#†{xYa.יfET{.6+|Ά!3$RvQ65ߝZuӕh|'nb1TlŠ H 8|7q,?r` dm/WwoHFs0Hc;@_o'^MS=W4r* pk- cOTR.J ,k?oEՈ;`rۼlKcs _Qo/)7@F1}C:X}\hP*@Dv$.S$1]K>Iv*p8B~B;1!H' gPs3]ZNd%vϱGΣkWb2fxq- 7y7!Az=_۔ p yh2x b 7B"?#6[g9e{lEbW:ܷ- {2I~NUڮ"c<=J`v'$R?6,1=W}w5L#ER'AUh;n0 aШ's_O6Z n_B3U#˚?K E}',KPDOCph̍\%0 =݇3=Et[ vΐeF9WdtW2VZ l_u:TrCS\i3Ö]~Puyo-_ 95ofwܾ,GؕYjwmYm/p9gAz1a UZ7寳]qĒKR$^y΄ŝGQ%-3#Wӯb{6ȚQiND-nVL QF/mӚ3$T;~IWHI-t!bu~0"F!y"7o}0K`W.ab{4$qS$bio?~(J 1paYgwqª<#d=br.8tF=ھAڭ&!中T3 V$7Ծh1tfV6n򡾮_ >>c,4<1" % GȽ0Zhlspy!JKrq⚇Vj6z]04 B$Q;<Mt"!6#M888*l"b+0dvO˘[{Y >H܈\1A "׼IMUMf?$i3qH>}5zDPmvʅhꥩNLS^}?! 1)ڮmRa\m9ڴŏE pb?>~o}&*yox&@ၴ@>Qgg`mie+2ǯ0ݢ_J1e4ůwUy(DHB:%4b/s;:A Ďsk19!RR<ⱪ]/Z\ry8ٹY+ra{IɚBK(qZ"s3Pd-vN簃wkG%L(Het*nf\*z""`#8@mF=f3sK\B.O,{3+OM/TdDK\=kTA4o2gPw6XoP=QS7u8^?gyDtDv ؈Re.3n&ʞ;P2$hHgIjlKLBa+*{>Ɖ0B{x7ZɣL `,[3gu8p߲8z&5/%Lz{B0Q%kW vGnu."Z~Sfre}F9[F(KDdW:?W%tOO({3ܑ aF&Κ 3pbxkD3 @6`}{W:ɕlIx{j}0 \h4m 6=ŀPVgisSA&GFw$zx/g|X]sKA{RIإQb\n%dodC5Cش πܴ 2"]SPZoc7Naۅ٨{k2$-g8UOqtv?" 4aґMZ¦|ճ\!ߞOWsfT|ZgLqJ u,#fv嚌V-EmVPPtfZJ\P63nw3M X lL l.e=4q"fyt T ;puxfyjf糓4P „e@iX9lFC eL.AĘoA#ث1ʬDUo*f{7ޤ 0y"SRyBzwʜ}LbJȅʡ>)V0"&]hLYԲ4!$%kJ:h;OĭN{:\r:{}m3z 2A3 3a ;3Z89JrQu?nQ%lJ !} vGSJW7(8XI9oL(7z >X1I:j٥C+%I8={!k]Y6ح_ Eŏ_`emWf=GQ%M}OOKԙʐWQ9N;\EXLU1է3LZ#u[Ǻ_Gr(3N];39ۂX#9)q'.x w?|l a/q8|08y_xB=>NoJ2^7*^:YЭLq6Gv#N,7}r=zMUݼ658|ǟ2 >$kն~3&AC+47U*Rѻlf0)Rhz=:5|*Y-Mz89JDUSiњ#rηSHq4sm>ݒ3_o@łcAp׽ıZ9e%E-*)OQ{lu},;fyB,i ؁.{e'=.K0TLHoR@$Yr0tF2,)MUWvb)Y)|;SֲcĉAu&H+8huAMVOm`Z'V6h eF返M%S gc-K_\MBMF gW! 4'KiP j~!` ,F?xD9V+յ?0B`P4p6fOJP|P 3t@TC=1/\K#7Ҝ ,f9O6܆qMТaXw5r,Kzzl>oy Rb{Xc)KCHX6ig0z-p=1h(0:Y-;{p @@тhAayC-A$GD'}(*I'\|/-gw0[v7}b ˜%:q 64 發 :&gsp. D)>DAwSM=k엿FW0 6J }֣5oaqru[PEL-^o1Կ~n%8>uSZ&!{M2A`jU3@H1>|fLĆ>AY.xc1KPɪ 2Lo,V%vgݿX3zܗFR K$u'PXf$W4_JB 4wfU/뭸?Úl&wh ɮK {DenrȒE;* y;lEwCSN Jeq0ȅ2 V/FUly40f#ƪ.l#rXT&t:pJ0ME Fu̚Ƀ=8.0|@qt>HwƔҦƙ֊9Oa <Ȗ޴UXRzNSU13wi?kEiJ6up8Sx&RU!BDIJR &Qw+wmzC|༡ Ƈ6zU|! q /gQb=$CY8K[yèFM~!\uSG(f)h)4H1]$4X'-oU蔹]h~4>ih8vzhQ${>#E0f'-\ƤA.aM(AZx?io΄?\:' >T-m.c33 \UU ¶%z+Ӭ0eiZ&w#sXv|[ɢI&ӔP+ts_fug;F)u3 :fJ^ťJ`THު6Kx~{k=&nA;긞] p||e fdk <~ksokBfDXHg}yc+9:*LMS̐׍˥SwJPǥy:aEY}ߌs7|Zjx" z CQ?֍C)DGԣ AΰPE i2=jˤ- xU/ t`HTlj%o\1zk/0T%᫔yG"6R"4 >%n*J]INVqɿ X?@}R5 cxS[{Iց.Aة5e']GT5'? Yr3y%A*vsqIc$/PLʡRX=dk7Fuzhv;vΎDa5ǂJVU>.\If?&s}'9nH@6=l7D/=4PM|f92?Ue9-^@?Ԣs"ݦ#noއi 2Q#5⩉ rPxDv)W;D0;Jebo ہMmq9L74kH{SNIF\{+Zy?gif3CGݖ^%KK0M">(ĂTM)d@ʲ ִTraãFU!%n;FʱKD,01ć =ahޘ~6'/2%MD۲W wasN0QBǸY8[mc\d"F[/)㪄e-ah5_[hy Cu:~OY6ifLr>B؀M[>I>z5NWkWL2 2'u1 S0Ŝ6`Mw`(sJ|WlOjv.>,uF7Q^e-r;J&MݕTP?<_MC@HjE{2L73[(BfcTQ(+M-b1_[kbQ@4\Q $A&oD스ǰ3ᕰ-+_5FcNVXsuBx'qOCԸX^ʗx,+,Sy<e"t%CIV[?}I]*.K+ZPFF=F:2hМsQܯ+[? BR+94w- $A*$ ;N*xV<&TșgdJc^Rf4&nsMϭ[3H w#f1"8Ff1= fQr!yܤ=0[&h*xt PC`]#a: ⳳPTzaٷc W p,9 0:1:I`Ćkrq+&? Pn8NXfM lE1X '(PlW$U|ps PGլG8:(YCBh;z2J?q~̓F[uZsXybϒaTR*K/ِjМdfjz8loQ?ě_jSo!!CeSh05>WMS3nL(8 .c2 djޓ-Z2PnϏ:餳FLdI}k6ǮQbŻ4>HG}~RV!?*nI |2'➿㼿 !#ۚ4{F [G>1vyAv7"Gr;U[::Sb?h]&m[mD߷CV=CGrz39R{VN>:l(VkZDR@TBI{6筅6Z cLj|s e/aaAy88V@C棱3y}˔>UwX0J^Wb=̡F:ۈEX!hjVUYn&ޣz lУ75pe>Y&o%#Mpط,8T3qʮ7^0=ҊlOϳO^L)ۣN|c,?Aھc ->8"oi;^.LXwڕ?G"Qi :.0,dPj }\}'v'(ˊ} [#S,b.m;(͡?R f *Uy3%;? z_v^f'`œ-g-xxfaȦFۑ?iaqʼw~]-Z]O5c, ,I.YgH3?j5/AL+=[tEx;+IRY+sr6U0]B05^1Kiؒ;e[U4V(npyDE\\K @s_P'E GKjs8i d𞓌$G6_it%շ"~,Y=ʚfb1貐P  Or b8{T7r@h锱* 2yݴGuGp$nIbsu C4r]1\a"%n@&8dZҺw߲鋓d| !EFYsJ 2u8gvLi trscz.N2)4`Dfq#K+۪שJ,o>wq _5Kv}V=?`.]g|t+Rp3p0ݺ||pE;X_yaJۻRcQNR]C$ei B4 _'zT%p Zz'sX ނW~+a h:הPųqVn@Q??TMKc+=y@7_?Oیj*|" QR=BQ$ _2l C1iI4"$!Cy>r g1Q" O8>iln HaȰve&ewQ%%)žc!cҞ =lq2VkMaJ.'m*%=eb ua@_MW hjєz:%s_3 j2B41k8ˏZ4*%OA]d/qFQ彚!LW 1x@ -w qwnL{Ph%'sofE#¢@k&M "1W>HZ\,zDMN&N^E#F@["zpu`;`^ UCbᱚ@=ǽҕk&37:@ξD1SOQ: nǥW^A#%sdYOR(v;)Xn&~ ^1$1Y){SS+j&^gyMk]bvʲTEh%ndew< ?gITf([2*}q*/QkҔIf ts:\(Pqǣ{.^{DL m rVv]A!U1hA6YKY,i@l܁9`'^0Y)74Ո,PʆWq NdG23Ǖ1jD3ʾ(_+Fh.#Ŕ:cPKЮ;msDW !+34R C"7QQm[,'o~-]ꑣ|[hZuXӶR)+/ECY PM-eB2ۆзʕƬKJL_~;zI+_u $@aq+Bh65aeb񏍊/BsbjJ)^QnB9)n|\4_cUh ʘΫWUDׅ|6rGI ,0HF_W9i9ɼ^DeIKW㣢# h^#cO4DgXu͙cD࿿r>E8^w+AA#R*D;;F$,TL\(#ś]sn(qc!S3"af|\eyCa=V`'9u6!/MBP7Wb<0ZФz'=sMeԄKdgGa5GړtegZ !N= لkC1^89r~ۂ iOoݿ.ҙLQ يph :^-#lxku:8[ A'k=Δ,I#HTWYP(8҂˞Bg$ cwtT0N |*s1k{p_]G(&wB>63[ЧR$3ï*`3HD%j?}9R~s0族dh9_@8,pjg fnyV!%n^R!6"[;۬ y \P>ȟ N3NvBlMjH]ϙ\Y( (F}5&[-Iwm;;m7($7X*tr1rOM`1.lGh,C^qsˆTVQ.}$8q&7! =m 1w~xGB Ja89']=M2bn.G 2R񍚼!dUeH ×O@r̹6G~ KY4߲勭GZ1w?w#clJ)! h㗂Ӎ@LUXNʚ=LÙU8t;fNP#@}XD jSL5F`ۂsbSQPyu99UJv!kP b ˵?I>4jQL,̠`|ي`dMKT@Ńyi q&\Hr"CJӤ&nV|o _jEcgC@g&ՂfB)䞻Py>J&Gsk|0 SQat/e'+h 4v!N]; ,\-P͟JrЍdq.IcGx\:B=,1DL QB<&¼-e-L9'*]]g;]kq Cndί'gB+RЁ2nTIz]ŗ;(sj !޽թ/@H9}(ҝat Pڱgj6l<1Uԋ],9JnV;inv< 򣒭*w6:tbbglJ3&MIs"CM(z[گ0yXoDSčzM ctW֐ {(1_D1.H!2mbz>6HFzEȱ1 bĻbMlCBd _Ozss(lN2 :}8H5XY;=MU2;G_qX%rKn7Ț).鱰J&8a_$pw}uBǰN]ΎӔ%H O6 A })H+9qa)~.ቔdǎF IcrM*u\V#/Ǡ:c;g.sM# jnlл~8LzzY\9Sk@ij禅~nKrZB5\Bزɬ}pmd2L^+]p O'~L+ @#)`o$Ш+`- u qa1 Tյ8_k}5ȹ|tj\M@Ŷѫ1e܋ɱh5srą]}14%r#l&O9!LD<*żMK|;4MbcyKxV1>MptJmcCAMLqͥ bR7tQv2+%CNMntt]@{|V? +Ӿ,9DV rYg ڦt"΀R5h\L}j31p8*RA;8 (q" @[جZY.3=CyR xˮNQ(T56Yy6OdV%KrKL\Nl,xal8w/f3u_'W&$ah#y uQ1M[_ )/Vŕa0`HY")Sqzc7il+(~Mм#@w>خLQ_dvp %O5wI>9D̯Lgsa`[v i3VDҾ0+Q & 6FEuS 57ׅɒoUs;)JYsԵ?mTHɇ|Jo^/=ͪr}'ThbpH@5[nE Ag9n`PZ@Nc-&"s&PQVD)']3=drېarP4D ;AӤtL]hrmrOoMoc *!=c=,„Mpsw0Tx:%/K^8}-Kn'_*MmJȃCvxFmq/ ]A#ju$D2؎Hcu"lbnޛZ=^d =9Mʗe1 0C1pt.f*L  >=zl˝ @y=5*oS(0zU6v^,% 4Gjb͕\p `Cx93zre6c޿ 2c+78,P AܨHyxUnOwv!/֢|"?{6R^Wv&:Q<2o% xX6Y op+ׇxak!|4 3UngMIퟐj)O32ÖZm:OU ze9 pch WKt7 j.E)YV`W EQ/pY|VRx_bn W_c^Z`gRu(0L#>%T.)NcPgBfklef^k/t|f9 h2C1܃:z\(v !$&ՍJ>Pxj2WS Д| QuC~F4y<ЋdSIG "%Y{OzhWw;SlXSbawqh~V:<4/aÜ_s7vt}&`chP8f+\>(N3˝*@.yh]!R $t}_δWAb:ߒFf ꅁi@zi|*BdMpoRƌ`-` +aœW9D6ZF^C7YP"nC[8k0:m8gt0pl{m/Qp)PTx?4񫳂_,YqŖYoAcOҙ {1]5U ճV(qp.w>tsodb/`2JIs=Ah|d{}DpG}| qu a0VԤ&ŝP8Hsbow]_BbR^dF6سx0`|qxEL Enh}.-p0ғ~X%<²sp,%4ه *1ʒP͘2'];1boϙIw?q)tADWE8{D7نʫ][35;LWc cPK֑hi wݛR̩w3[U-u RS`!f ]~sZLo?p |m9csYf<ͯ@!_Tl:PeϐksVުeF<<5jڤ%5ٌHC cȱ09 튫楾LARb}%7'AdzeiHo57cv`V!NNMR_RB!0+1;JA0(8Ř =\'rc66;^IRBn.~B;L v+@U|S&g=32uI2E8!}zSOrO(Ⱥu9F =]_=m}Z;xf_}ɇ"ho:y5.VÙ%sqv!$& 32e'KWyRly$6.,ř@M8F偒'*At&H+Uq15Anh4F;AhL|=]]vdS9Yo\H2aG<%Lv!}]U5ҎR^Y4Yv`,Sij\YY'&MKy3RʙʰI9RtPF%- PGS%Sʵ CeA ޘpp[eog##nԮT"AT#[!qS\/vc;AWp4VGLäb;>i@I):|ˢ\<:Uߎ?RYLYSdX!3O>aXެ !xvMr30d2 G17CP˼k!2T_>?G&;`hE:^fdUBͿȵ#X(Xl_*96̓sY6/D lhNVc,QU]OE~t`IO*o( {u[՝BJ΢Pe>Cidv^O63ibױxϴmULyKH@9u;G FK*t4$n&= e Ũ,HN6&m`)c9VPя)`HfX'Xngl{f3,~RS \Gx#.#Z@ 0ƎZWiZ\"g;d nH) 騱꓇9,k8&bb15M$ܧW-ӧ?8W@/<|h㨧RH)g40%P?ذi?Fx.Lub/e?6hj!epت/9t ?x-mOn,"d'. "`laewH{2Ҙmvkg&j@s pkGj M[ن_:iϙs ‡;,M7MdVCXͼ؛Wl V*#W BTd^"HB>ǣnCM?4|-@79?.T;*Y"P6O pջl [J1y$W霄(&R/I,Mnu͛D_CEeTc#FٰZئ)69}#>_LJD:ð맾/ ps>a0P1j_3Qm!<1,; Ҍ ;;S„6GeȃXV+7>u}4JErz;MDH8lvWIr1Ghl% dô~ ";l߾nM*/*71g{m~|4"t rnQOKMP%C\̖S lܐpU@Wd"}ę$m$rHO|w>TF~ݜ)5EpΛ5<.yW) JrFbpUQڨ^[>Rͤ zJ~T.<}L[н@'UK'W9'ON QAON]pǽRHI'iTVGB68>TH8L5kٗxrի}{uuAjMrp(N$23mٖ u{z:'֏/MLML}H 6惘.*c}t-o>U=8Otף0zֺz-ٲIO+&mnz5e|x] Zv8DL;*EVL-9РM7O8,pصf<إ6nl ZhwJ[5= iim x$D4ڪUي@ L0X 퉄\gMv D_ [MkgB[Ibр)(Jmjׇ:主Ө^GsM2<)f_H$ϣ {UEGMi4AFiuV nj>\KXgaeH NEeUE{_٦B*l"ɟ,hʘћ p̊0aJC #vU|:WHMDPm &&אPmWwcZgɺQ 9DiI&&adDxB˹H0;_e&vq;dLa(}CڱeCarw`tFLeVϛHp1 !HnA61=Q,kD,̈xlw嶾 w1Go=j.D|y=K4X=h]Vl7xIK5rֆ7%6;TVA}kc 3%Hc> WC[3O _Y3_.uA?H"#bR ,H[(CaQdEPIڦ]<zAUs [Yַg|%%ӂEHh䕱W`bmgy/c;#.Re2Kːc qƟ3[d&zưK anzv{x2 Bad &-&?}o>$vҷtLRAk/G:,-)ѷKX'! g|mTlSSq'!oB KS[Gjy|ڋ^ݷdaX;@eW5-+r6Vd6v8*k m{4-Y jZjOT?& @gFxAΰfj:[nk/#H%rMjr/u/iM kږ$!^0Iȓ ~֟Y~!Xd U#\D2/-m@̵X hw3*+$/[! iȤxboQ+9rEݲ'oC425[/}rS1XsUIn%ќ{C8|*F5pw4aYL*fĶ wH ?-n~m#@o$^j-uj}`;n;Vlb\@yj9yj3Fo9x7o3 ֋Zd7< < 3:Z쮯Z$~Q|I_/QT& 3le]0b0_ዌvė%i8ygWL}y]ike,RAZeMˆ25{]'\M]2\c g4on$SfH//9rr NYM{:׷S"Zvq z2'`Ƶ(NT#p邙ՂȜ7RwO)Lj{Ef Z9 ɺk e`ovk8=,dhvs&3dn?yGm4[Hy0dok=$ wi Y\UsQ ٦-+—4_A8{bD@ X^^VU !1-ZmW,B*稧ٴWu 0e*b}+uxܡ FuXۗJ+:9LZ?!wt4KAyEKbI%ީgPZ8:KWǷmOTs /aylHlE7p7#M-ihD4RYuy6˖ӢEN %g2Nag2v >=X'Y6CyҖO\Ss;RM[ï/$Z 2>˅&.e]a$xmp NRu GWFĨW6}Hܪ\NUr6::H /Fl ZUǒK ?S-&,~0i˨rxpgUE}q%LЏ =h |CU3Ρ>'yVA&5GLNU+XKc Fw3TvXB'6] Ư>I֮4rئ[T?@@ YR#~(VD6T+mVSTe(˰Qz0 9>kKzn"!LupyRnRl2 rcقwL**'BWBxį#άmڹmwe8t +iP%W=>h_ aA'd׽]g~}VN-[~k%)X{䮨1sO wlrf@Vii")lŽA syK| !=.& n(\#`Lv6zHe+LE@}@%~f!XpKF6=*5>٦eޢ7OQ9}DKa>O,˱xQZ-k{Qnp\D:$ΙҾ EoLk|U! 7F݉UWmi6,Jx[SAuǍUL/gKr.̮p`> [s]j8ğU3C1/`52 zӼ)$\[p`q)̌\Ǯ2IL5oiMJr#Y/,hMqr9:䷅nKJh?e<گܕ>LMr\6K'Ō jѬT)OtUky2}JtBYKAaONL}Lqjl6Q74ޯf2v)WTb1MN? @p"/2 7w:{dע_!y85qD1 |@+ 9*ubmE#fMՈtEn)px Xsȼ ύ6. ]G 6=(Xx\/kDW̪lIGqj#M!LSODu,P3ps(;4HFqs4ŝA0fʰwS|60{u'H['7ވPCtب[L+Շ[,71](^QG{ / {U߮%LwG'W )H_mS7cƚ<NK~u*@ג́"20BUc+x<3.!9Y)y7񽰓\vRarJTc:չ]OrLzNCDN翙Kb+ ?%*YoFvE}(NCӳ Qfb|"æ D`4vlUyx@4K Le.R#p%˨B0L?-X%2~ ΋ۏ=[;Kzk/C 5 YDt6 F"?k[ȐNt(I; # XNP WX?`4?=t]$nzYjJgYMjO f`8ןK{\>T^kgƍsR%x@*RN0E<N%FshfvO|02n}'$0 fPAy|[n-SRg71mLo_$uC߬ qOj񔄫^*m5X!%J  uPW6nj[mZ̜ڻ<[6<ѹ0{N[jxmTdױQq&/yS'r<_tnSr:k r-1؃KsQ}rKM4hjA7Bd) R=^khSC m2>q< aVI"K msDŽ{'zD4wr'F~=/jh7L W+=}}P2fJ1Re$Oq_ ) &.EOΛOi-NߜI2V,}$R[ҁ["єښ@|SBp4i{(V"iX `oO0rU"ǹr;A3>m4 t5/k-ލ`+9i/>/P %N CRgdЩʔ-4 \}z'6"Fݭ• !!kנ!'{#jbXwJ'u-#uR󘨿20…DL4 *PKr'N,V?M_}.s}"cC5L~V>Βӌ"]ܰPG+)$RyFl\rDaF2<)3zn NraLB T̘L&H+D6oϊ+(*qpj9P#ucy5D\5xn/Bg=#yjs1q{Hy?*dT*Y9Ydbmy.9SSjh/&w,NvxQ鐴DdFVoّZ77_нdL %rO);{7X حߓWdB )~_ 6 vÄi ~~>rc@#p oq`a''ia޼^W j9;3ZoLqj! !q6^'7y w˯d_H$^D /, &NNFp*'3M|ĩv?9eLvgDq˞KS_R~vVԜeżA3U&.0|0s-㌅R*h =+m>0#J8u).LzÎlZ AS#t^Ur@&4mj axч42;+wԐ_tga_+ΚS I'* T꿫2G2`iOhWХʤꖴ,!L[k>NGiz;ƫ_ [$1mC]d$kH* #:U$sAK2ۓ_YryL^P0L0PtHkA[U2^{м}:RɗeYmy ƧD)BLPCM9~tDu㛦y3Xj3kEP'p Ia%䉏TNxy@qzpPKDoUZis0= @ O;)|>/.KXrDKɥ밇~O_ٌ]ι!DUBXDM`$>dD-cXq/TIwOY079![؛gwɽ_Ïˇ8ϫh`4,zxO o7 dk"Mȩ" P B.Ϸbߏ9y7k ejxU?SO3alNoͩ+Ia߷!H.sY^ `3 H!D \g?lrc"\S}:$!zo\~IUPxU-%dIvi&}j Sb`C$hIΟ|32n+AO>a4+P2jTYeE/&ތ\vg"[wѽNC^'RA(M/~[=um|rvmqoWPiD>6aw%Fվ1ua`$ȚEjbׇhoX楐!7cfzπL}P=;rӼc&:q [:9Ŋk)-ԒKS}tek ?lN;+>=1C'p4\U\.ӛ{weW:) q/ImLKL_klJs-|kM99 C%JUD 0' h Yh=N|2Nm.g2vJ~dQT` ?P'W"/@K' ^^bU)Ch)fn#+.2q{J$(H gm<.Rw97T%آ;\8QcVvt$a!?pg`!q-c6U9Թ2?r^+Ռ/B8Lhi٪)N6T"SXS*qjY`s[Y)d"mִ18^ڃv$a: l ~FeNʹ~Z#~[VRšIS% I,hJezFا%_&qh{[>g'G2sw&9]=koH׽, <1}`xl:RŶS/13Pf-++Đΰ}x׻şo)Aw}0-9* paٿIĶ"Uz7GF 2LPؒL6rmUBUc 6ߌb$c4d"r+l0O:Jm$ql3')fö́:ATm\'~f&-6cu]%qC<&Eb26iZeJ;qԿ(VfZ!(W2e_1]6Zjo^9=^hN< vu9rGm=~lc@אm=e3) eS}):7=xċ OuJYS!eh> Tsh͙RZZ b, y!~n\qw=D#yHO ߀X{2^,z!~ɍ yAXa؋^sJvKL WD@jKҋ}VV~d)7ʹ^غ`^{QYuѕ)/[$6d _!0 &`Btҫ~C S.OBΆ/#gy>ƥfV &V1\8W~Jr{8b,jd㴃"_8L9bJyT*Shz4{VXn57IoJȝ/Zpy]Ӟ:.k0W;i~ : V aR:bӳ |&O7yM>{;^*m`y|mb#=jʘ{Lk3:g `:Cq+ 燖C {%DG )ɲzZNݎ>DMߴa3藻A&a`!ľ>wv(K'~ΨH1lTqݠ=_HH߮CO @\3B@B*-W>sӜsb,Ƅ)O=9CsR q࢒q.njAy2kSaDвs3nDx3c5EOht&p.]τ^)3]Ã!匓Tpbp!m{XhO!`2ѣG(ې%1q>ȜemEAmBîH[}{ml ѹQv0䎻 Pb;oHW6_K 凵J?V.y.JJo{}a)Z((vLQ^vO5|鉛2kSwt聓_T }8uŻ{t4AJ4 $09S>BVR=Bsnr&+R/eAhLo~Y˨KLw\`{M.2||NE[{s OdǙyiuLK/M6^_mO.QʇL>U B&p!>SntnfaK$~P|s w}&郯NRjzlw8$/"8VEۣ\ tV تގ[! 3s un!]]ic ,aESE2?12'ycԇ:3'9ko*bҐlo7KSK bC-5d1ր~v^}[!Mk\8ɠtbeW*@m .#|}7:;<8l Lkm30`@JeK>7jŠmLOs6"K߅?#*{6}Hc\jKmOiCN_Җ=6 /H0` O1+jt.QɅ͢q=tcl\*yn4-\[9g34$kzbqQȏX"l߲=F6Z"NR"9u)lj3FJP87%0/˃lK /l\ЩPYr\qs2*|ۉ_&В'Λ Np8F'Y=Ma\]sE[wd#{ZD C͐r5mQ~ԥaZw1FrP<8fom<;W &'3Uxb5S6R/s(K0̛KY/ۢnC@\:kwv{wcNIl Kewq.9YJJe!lKDOE$z3u2;pl ΝDTj%H`CٹBGFSxyHwGr'rA?~/av_#2eU)42T*p EUT/hPlymo2U ⩵e`UY[X`mȄ:Wtk ︫?]^E!]$(Xg D{1ia4mH:@@Ă4L$מ3|Ӗ, "#{7gؐN9%{S__JUY#9c&Qؑ:1\Jt:cn3z0Y ˰ݱOc!tyn vHѫlРzL-Ϳ|Nc 7 LғK+JH8;+Vb7"?#ai!F phq tR{jc-ˤUgqlb3&!`F慹pװ[Ap-}?Y}v3݊>I;X%p\, Iz0ROB$(><#y} PKzז ڎ-@zI'_cKB@q+p$,1¤e9+n534[̼}ݟNRW`Ts܉.z0? L'%@VɯvCo,  nn/Io^Ԥ;Z7BƝ}}t*'U㣡FdO%W1U2oBVdm.C^:e-ɵjʞ'XpƎaFRus@F&08#-vM[!˟.fXv}Xw_HJe"uXqG:R4nV1"N[ fiH8][KR~ڭQkY37dD'%zHħtƫˮ!"8B:^m2CPYozЧt~ז7=DuX,h4!jNЦSM($J\~/M(r BЧ zS=?}Vyp^: 8SըZB g6<3|fŹ WYoz!.pjty2 ;ͳGN %ziS+"A"~d4 Q* 3l՞ cH?uD$$-uYHZ푕wO[yHp*f: ʈ H{L'\^eSd&C;s"A9(mb,) ĒPg'Q6DU86\<*$g,_O =cRw%GZ 6wO ?t ~i^@6P(۩KtTg~wGQ&a"WB]zO 1;}}GQM^83OYO;U%J2a'B_qtk6 aMENbqA5lĄiv5FC2Z[Bvt*aC2ȗYGp3kF#pUC-l#agL ȅT{ q t !Ii-{< M> DŽqX~88Z)* R}մ\@;",c"&;F͕Ҁt%5li_ VI5Y;av[CN7F[*ۣ9R0d9Eϡyρ ;Iބ"k1#Rq-$LF~(8]_3sܒ+*o(&@&7H2p UlG7 (8VzD7RxP6|-}4 b~^ۊKy{w3ݶ́pŶ¢i\XУ[ɰN( 0'5P:OLf̈<]E; #yUI`EMP2lN",=9z2!,bc{놪gF*5Fp=3O͢:-\g86?͏nVaٰщaz2]|L>xǰL,SF ;(;]~̧gN8:/6dLiYp-g=fdt^Fvk5jY>1]MǢg6`Mi Z\M:*T垱dpA4(t V_[97dǍnT. 1mj7n%!$[oW0G1f悲ߵvWwKCOv@8:@${:J^qP@( 2ݍsL۔7[Թ5 |p3j"Filbx%o6p@W4Hj{! PD~;%ʰAotCEs.O%,5*|\e Zy:NPP7 rEC"+=n N05C?;N7\ۀq@Y ^ݪ٥K{A %gG6Yt fn/6Hla$0.2L:߉ج,`%Ƅ{~Ů'5Ix <樋T ip(.ذS8tqm2OHWǹ^Y׼Xt뀀j\ԵR։=`۳ ϶!Dr;֡y^C`ncu6ژuL)j^ s?G#ԫg0Ӑsc>JroQ5>C|\[R CISIm]%e9uU-2Uyp[}*P91#e|omЀjkf؂CWʈf:6 ̝mU}Z| vq1zj|=w;$bsl)H>4*QRVsfhE@q00Qͷ*d^O>9ی]㊭6Hy߆-[-;w!wTA^^w񇋍<*~X;ƔPݍNCZ6` `UXY΃QxS+i4>E>Hup5Nb .M0Ծlgzm gڒXP 9Y=I!(#R9׏d]BV3wbEI̚߾[6?8^lh譽 OGf}∄ɷ,ן:e[&NiXLIpI:ޛ"EIalwf`$?uvJJQ"hePNkZP Mc܍*#}e#UM(Uʲ֬OKmـM:_s_O }fcv1^khܤN\CpBzޕ܍e0bt<ۓ Pm rȏESt!aGvlNݦ*Pê֋aC$[hQ0 C6YQ5y[ݜõZ+SǀguV)YS}DU^{z5\7&fuw9^ CDLYboѻf%^&zo- CV*ojfͣ`[$/`c%'=#=Q>*]ǵSf \[響R D!*$pn2`!K=+\no?*_3vw@io/N11G oE۪v-I!`l8”ov%E/x@Bz{oݭzϚD >fB Z%,GZ&ibO#}MT=sl߆{c#F>0J"g!Ӓ. ͤ!Wzw]nGNIPl]j*hF&񬗰~ݱL,/ǿĈ$LwJMŰӖCAwت,;o\- E6G6"GF%\{xG5嚆`HIx;fYkED>I l]kp1^WnUԌ- T'o$O" 2@Ϥ!:+b֛Sg3T"ep-DK$B z{5YMą̐CQh5R")kقR,p{)%T]Jz4mgx7x(f'#vWY~O:[js4^ŕ`$](E]Vq<d[TcފHRem.K< #װC]anfhXw7%_tX n 1xY{$? %Iyp?!hՊzj >kX!8\ox'At!Q >`6nn58ư5(BX:qDdk_1XTg طnl ip&[{P#왮 q6(]*C)r V^]5T4r䴨5ZqK?=n Et-J>yFDE듷|p*Vl RJLRa͂)̟45Zճ]6zƎĀ|7qH<0U*ѭty?U(qDWNţ<|dcӒ=T*S-LU;N}J{۱$-$OT>bi r`Sry q!Ҷ 3t20%aD]z>Owƿ:vMtݣngbUA+&SS ldc'BVtt|ߘ/iRH9m#@Ȑ bW,V"3C`3s}iLu5X@jD"EL 2lhƚ?Pf5eNj+ljgfqA2|F<@o?pgoex\41?d!ySR.up))gZ1z\)/UDQU=9,t:<7‚Tp“69lxsWшIjcE%91-:=̣Ô3bk'jxy45DŽC԰>deiC\IWٯhXđζxΞȢ%r4|!x|LQ\Y/_"Tſ`:ilfy2ȰGbqa5G'xN&) j/bKA=с(VN!i_vGVBo8oUt|w?յ GstˏCMώf&miZ|0d-*o*| N=^E|8R5409Okv) (rm["UFqSz!A.-5 { =5 P\7[݅ w\~b{J/պ8kU̓]u6b=E|=㓸rx kRZoduqtSRzJ g7Vgr$cʀ]U#~QDbf8HXa>2tB:fX"e{bU5н"f(H)>{2QۮfzΉsgX@[ S5 /r/H(Ao,hr֏,|YHBI)N_r'rm#|,;2i.z-H$9:V(Znr #x`Z1|9`C߮\ zBJ|y!=,CxчI.># qf?Wb`12w#-T<0[d@rυV=)+6sNJZ<@έTTbspq/_Ke>ɐch T^*>h3j$2}8/φbNU;+o,x9>fA`YL?+ 0ƅF`|&9M$'grݙ钍"Wh-㌑!3<4Hr&3Ǭ 鷊L}L$ ({Bx'u3ߥ7X"Nwr86 UUB΄Ch\p9p䥩F}TKrIG& qG>©~=c\9\zͺF<"D5h9JIpYڄ UJ ־.|GҖ@;̖uLT쬄#cV{èMs@f0#~b -^ְ[{8$SRHUW v:j/'^*hwD5'KؒBo:$gqyW:"p~4z_sP+_␄Ua2-d>{I&#K=F3ܖ$ݬcӊ6Ay =0a])H!wz3\X1PcJB4.ţ%ͮa.OT-$ ܅ޘ6u`] G~XN}󾪑tNǼeVt>zٓ4 8 d,ĉYַrV,D}., 75ZTF(,O(v%B+G&z%i%& ظFTnSCTUCn@rIM'`X JiH3@Ό#] BuD6ݦ9\7ǦEpM,GӚ!^QޘMJmXp$ef hɛ?MiB[E]?+DEu ]/EYz«7-pe)Kj;uRՓ[\zh5Rd4 )k`?2&T+^@Kæōw u\WܽVzE-՝ץp`^-`"U fG1?P&ܲ;,o2]L+t-E˲JTAbb"-ZѫO_T_!ēL -u,Y;W"; \=0l2'^k'<šA;L[If;Ohm>rņjt֙4kh=C%X Oms}.Z<A6疸Q6e}S&kGQlh6TޜxEMhq^s; Q `6J0pS*21g7 ݬI uLRT Zh-Z j#f΂ᕃQc3^/S&*po [ZO+736Nn0Nם5vĠV:a'{+YO/|.ck*dśJ0 37 _ZuYÌHl?-BHR Oۉv;i̫ϰK 5 ny}~M30ýG9c1 KbTjI6_C`ּWJT]9Wf5j(hXW>Y If#:uԺ%2:7z[MD>n|T5#aYmБNLXrf1:ʧ/NU1ϏMQ8i+D"nүcUg0*-63]+|吐Cv>dB kRk&L!4ElQz(V/]v [=^%w .\Aڻfq3\vm=N{ol{InRQiBO[DY$7卤T4+RlGi%G %JSq-6>2`4& )倝QgJ;tnF<R} mE:Dx8I2x<\if>-_x]˻10*Hg+=0ܺd˂T|; yWyД0ό m٩p ]yI%R |Vɀ!SeQBؖ? Tvy5|UI[y]\5 6|HzM/m_ٶP l[ sZsLߟҴ0i6,6-L:.# ӁA>|Q=IHn3B[: N 1)?uMoi`pZMwCUT+Ip4ڕ0DxL嵑Se;GB_5mw*ÙQlkp/16)*P Kd^2k{\2rFLD*-ʃ|UXS&+CјWG) +`^MZ 2Ը!leר2ʮdo~iH',W9 e1<.>2%$gտZМz"X]&bV9&﫻Wkh&0u0bQepe4XMl?k~ Y3lO-9mj[]%i`p8Ug9Rn*;yu5ߕ+~?ז Cc(4a9xԣϷ~?6k_GkU)*IytNYJ-%3jhmCơ[7cFFgm+;}tK2^a~8< D⑸OU4Cϋ;?R愀zbl*eo|WTDݴ+sI3nOJ fd9RltV)Sc ˙we=MLDq̯29e$H_i$B%SnTh*21]]pɆ Ҋ,Nbܞ*f%yrtw Bdh]0_k<"{+SM3  Q%mNzց;/E.''~qjUTkh6yX !RkT̕TvN[9,3}s:>;bwxGF(NqkO:y #]zɍ QG.+5EB kfA_\jqcn5/8 8fR}Æ')5ν1Z;r3TmoOqעHV3 Ԡu]gr HeѥZn{m9ugTce8ǭ)R ߪ'ɅL8ˆ*GR/g39kn$ G}d_U! e T?dW?}ϡ6 n7b%&Oz(5q_E uMYIADk d dC6uP"qp(y(s2쐊P1~h/ϒMxW._*ۡ.Ab xEyc|?E yիdo"Hp(Pޢȫ7J*wsI݇<:>%#i ]} vg7t?C(Gr`&  S}2YÄ ҹT!?Ս3$4nDAW*~ٴʪe1E!~7$Si>g@q5+:'x' w%8+.͌`&>8 5ƘyWbQȊѠ+0ZA5;9j@Av'AwdjZ!EՖ>݀PWYfueyh2a}`P\SKem[4Kj-Y?ס:\o}2ŚfZuDe65Jtb(>o*ձ5⨇%c QWm8:>z,g,u1i/Sè``4CB$=CCR}u^SYsX>y}(/s,#I̕SwMnleh]'%Q 3?1rvD+CO*)d͂H>9~l'a% LtCS}b;Nr)eti &js*EeLjT6;N6;=NQUO~~u%9jBd4s \p!&ȳ 2)oE?*g&?jm:čPuV4^g(8a`xZfDT\ܤDGS:/xL?%:I7! 6˼#Rs"=)N^x!-{wi2InU~PjʵDqla@>2]yڑ-FiǴdX@4]ߩ/@xS&V;TW6nXuMs,דEmsJ8{u7Yʸ%K|oIH"4DįkPTh= DiLU1 vw&65ЖaՆs },X5de8<٩dmjNr.GT="›ku6w>BęP '0&'7{TS|֋;)gF];;8I<Ǩ㽔, XVTɬOG\,H\ ]Vŵb} Kp:wU^P Q3~(0 W=J>oN?~}abXR%AvnJ;L7;8 Wkj MLjIgpBB|O\Z޳Cck22~*iYh,4fqZ\G IY\㘪>͍sBRiYVb!(WBy_Eu m@\?N >>Vy#A'jm ^HzGo}~lxgٖ`gY̙25'-iLޢՊNY! Low273ȭbp=-37?$dܸ?$ kM[.չFO U_ԧRZ$w釿\/(1s-5*)ꅊǩ8ٴS W?sH(2gUD!ЦKlA2Q9?B /t"f>' c9v$\7n) 6ijk‹25F`tp ;(̪O>t9 rFŋki=}lyEla,0cN3Ы Tֆ4ÖyMbxkC12?oS/ɖ2' UQ ֟Sv;@qѥbVyFjgd' (DFI֊`},W i9]5J: <;lG p l{qA4s GAhh\ >#kQ;4Tn,M8? nٖ=9}+!'@b-l}Ql߰`j͙/{Zjib )l+I{,_C@ 'm KY7s+-0Z:pDFlG; ΥjY*AsL]AThwܷ?x:N'w,4d"_* XC<όa׋DD}CBTQ-%H'Ru _#VQ=I g68=~sDko<&ygb0EZs־;z VbS@Ū(Fg] 9 Uy2Jaf5SmJQӹ]:rⱛ`b45-:#Y+/D nV]]nVX%mﻯ)kHvlqOSNT4x` {מ5{wue@NC<#$W jPb _U KIQ$[WwqG* aKb גA@rt"w7H. R،l3#?E0/9"qk{ZZ~3vBP7G%:qFlH< <1`+'Umt4XZFR?96F8\ Am!mu~#β'._f]~Q&PBNq&FAU ٍ'pc9\^8IhW{a ԭ@FAMku 1츄rgq+ \-X5k?9x8zRHe5 .,7\w4Sؾ4=6F LG+ϧG ,?:N!qX<@ ׇd|5hkҤ>YϬ1?ՊO m}|_gjRKitf9K6hˍe6],TYz͐DA횊$woD0/ QeHN? jWׇʍ!Zim'7*0C-z`A2R~WLӷ(Xs.xzh)K/ixg$.P\1#r؉>w`#GoW>a5&MۺtcLϊIƒ)c ;XT}DE7 fT׽ ;HGbmʻ8cl nB.y\0ܟ̓*FE}بJX]؎"ƒ\С2t%NI}:c1`F(B,SC;P. BDG'uu=輓/|:XHD:k27NׯBZ,6KJb㫤 6PM×g]Ire)].?"7y+lc>O{,18lM\bdJAQt[!aSڔYe{ْ˔+;]Rmmpܲ>"UB^k?οNdM}NCjI"zg" l*:j+DO-ck?%K,3T&+C~=K`(1f.uc| wnfG:y"؀Wgf7O)fـY_10>J+H!@QɀC@S?[;2bơ6wy+q}\bU9.Ό,Ty~qs i"i:oϸg*"yB|19$<1D.5iBvPM b@G~JHಌjY*/B## g#OۏⴾZ>lwlN{ '`FE=M'GdQW ouQi M:ǯkK/d ӠxۯxUqqx㳤7=a{oַ(QbtOBUCl!T`[,,V$ rGoncX> gihCYdMݳ*L?(b @j-طQV"naq6^8Q3(c-pNxUQh'sw҅xP>8Q$F4ɣ|-Ű rUr'IcޥĸswFe/t>%$lƬRv>>}4[mO*Wι$݋B]A/t~%HD*1$1_+F\9J4W#OpX9\%Zx86~rGx|ضOf[Jh[}5"QbҎa'4;s{8{|Zg"`ļ‚X.!z[9S;Bj ٖ&lܺ踙\ѕ5$[ք/ENF^IdX( {!#1-DV :E肠[߯|߱Ժ7QV[_1IVftYRMX HR|\);~sՉ!p#LcF!ØTl('Ux(4&Jծ.!BZ#ZL :⠕ Og?q#F WV\/tmoa`VrRZ2X΍w&{ ھ-;!GXJ+Qj +6:;.i/oBp 5K*S9L0anб~Oԙ Z][[<1',#}=K kgvmr9Ux3E]b (N*cct8D9̡3S C'ϕ'´˳lw"p/[y?ratlH ֹ1]aX^lb3+r^_So1gK7y7DHn:D:P-옇E}Be36_@e> QWegmL4^:V9٧`o?T yC)Qɚ73ISM/[Z*':*ݳ8RU 3NFMmj*DsUydە&`qKh&EEypz-\.uf,F!>6QHlG_>q\_aX ;C6/ `:Wn>ls"|Ik%ѳUne'h[w N2gеv5=62}>DU1VOXM@u'͚wSddec>ކ>)kD^HcG.5~p_u3˂.FwqM  Oi]ԋ(s6du8<  LE&)B+^{HbJ`- XYGa:(W=e#5s_Ι4(43,Oŀr2ٖ<6{]gm$~(4SԒ1z^]<~sDl⟔ͻԟZ`p_֎GkH"rƑէDrW ͼC, wHg,qiefXa֜eE؂eM;v= nQ%*r/69$'G<=YRhehO琾L7ԕ;-Y.d}s F޸%<|_~Q v! N 8JkQB4l6Ym,ױ[ 9Mˊ_@ #fZuq J"J7X`Iw_Ubj6s끾Xj~VnډV\ *hR |Iz^j7"I[2_67]lM*V# W&?Ȕ Dp8@U]n&7nDJ}`/=},ܕx d+2LvO7pU˺W;̫I`g̟̊+wRMLkCvRߧOйd',6O|=DS1 !}MU哷 xe\2[/Wk^-nf%ce@EhAO=?SŬ_^?] q^VN5UgAVyQxkYs/"[n`FqBNaѼY+m+/UnZc⦗Z*l. wQro+,fK>"ğQC/K{$E3MJĕE!m)_{coJW"AhCTM}r;ji!pP ddU 9Ew@ڒNN ~-n.aޤN k sJ@ԙ_L7M=yrDʉ{yՂԥ}EHnK{CABA %6Ջ/4#F\NTfw]&B,~F {VD{dZݡ8ϮL;G:PilP>]8kOڌops} y#gvgd3D<.o!甹Ϩ W3!`0T_Ù܎@39YBw1 JS{-Rj<02~#Ed΂ T{s v Z([C֚%gbᬀݯ߬Șu#)HB]4X}Tl9SPɎy(zt'0ٵH*p5r*.n-ӠF!c`*/KZmk58#;ؓaG.N?zCY|~=״]~pIboFw{'F0i OMt*?n鵭YG`CnY#U&eAtʔR>4<>\ː" B~FIG@B&>#rmL!9݅%h*叜JKJjTD#Ǚ}h 8YQG`Vl|4h)ܹ3s#zD_x sc#O* ,m[PlVHj&2s-٨k7zR.`1d:D Z!ں~/w%Ÿ)Hh܉ a ~XoJ=f\LFZ6)wśCDMĈ6WrЮ\^- V[=%g ׶OStIȡsN1IG-fr~ H?-rCH- T|4^>1DY\R(0I'Y;Ʉ]7S3*XʑBɻ$=x%&K*Ŋ_frU 6F})F#Z\ XQ{o05QhyӂĕՍt^ܵ Rs \ &Doܷq {  WtxpYTT.>xxL{Now9l4?Vn,*ur~q]A +M3˼s25}tLatxS;U2;_oHd? ,i}Jh59bW.ft Ҡ}l,}u Sָw?DBE劉%!'!Ǒ[F5cWʓqg}W!;ƢI"=>HydQH &CS,_8wm t{  K_Ch>(l T/e)Ck>Mڝ':몯/&*}uV zBJ2x~uSbeҧH8h>'2 )uwv۽RUN f,'}Qcc0/87k;r>+Rr`ҁi _36< ZB(˱݌t;~>ğ"OT(Zo(FibnG >Nh|aPrqMA˹iv7{t_ӛPc,.Xm ,:ޅ/$|. ՞ "s`A83:jrXTf},ؔ2~IMU{ccW73u8w((i˒@q!vm=pTbJӅ1\MUQ k#-N~6AƲ9!;,5Cy[?K,Hj5/TvX$qd'-jZ_.!dk"v"4 FIQ>A,0>9 U欳'_eS:c/w|f1}u'Dl<+Rk4&E}+V1Rʛ}e>Šy72Q$+'0W ށv@oɤ$Z梑ݡRjex}b`1lm1c`Q/+z-ݪ 1/ɤ}t9zߘh9) E&96SS0})#kg NKU3Zp5$ᷭeT#Pl@/.姯XTW vYv'{x߯d.O TX)8IUmjM@4A|zs*͝كb' YxCL;i ՐJP~L1cc6mʠSFAQgnE kсíwhsO g~^b`[4^7 e=?$ܙi+ُwQ)ϷXb.fEyzl[S8T' oRHf\ Rc͸5/l#0]~DCcxSI?F ':ݨ0%$mtcӸOuxdiDJ36{T1 _ YȧXLnxկ{Iy.h€JT&?K.$Wڔg@e~>s/M=/}amv*}A]wE6$ɹndIC n)nLIfX"FgMrtd}[+-}R<x T}@(Xx*T*!OyVۀ9ji84C]G``GgD)V *gbJXM!Xv0;'VlE%Z0qXbhn`-&kѝwL6XD྄az'~i]S[mٶz X6On)uoho\"|b8%3*w,a#^{7ׯyrB-LI?|@3MI};#f$~OX*ʲ!xr-cL f^{ C{hq4MIa%}5z&Xe3J.P Y=-MSeڗA6(3clu cK4qN?#4LF7̷r%u:n>ق]1#GD2YH-`F:CV?֤[lg&R1 WbJD,:JlڦCo''k(]w _wۉo>3<o}6@^#[oe%RCes.l匝E ߶3NF1$uU0u F A)^[FUX{ڰA4 .,<\_Wo`yn޲R!&T;'[tQ>5m])#X4|u%O]M?lƾ`BCe|kgne'c0&WuG, hˬbUk3ZJ}=~6)g[b 횠]>_q3֝N./#Lb5d>g؃4nN'kgkB\T83Kq~GK;5PdCmfcm `B(I B[\HCa_8yAqDKA_G|p ~gv=&N "ܑKjWfyFNbƀh3Wgv 5K6[YW/=Y|Rjǘz?\:DZ]+WL|VUf3^ ~l|TOQ i@چ} 2muܯ |$Vß%Ϳ8$'x5CCϋ8l^L碸?%)=ŏz2yQ=ۿ/@c%߁ t[g Gߊ6~8/{P\Bh;[se4"jEϚԦ9~d4R&N >#Y/%b4kO 'Bӽ},QW)YH٥ o$1[>jτ]R@vUςt [CѬ!^?o@*.B-iO^h m;&3WӾ6hm)iDӡg5dć̶0 t$t^C1eQq>S<%FЉɘpxc'r$I`;&Ӧ.:?պW>:(fymJ{) =ѿ2[&"?% ζJ@2h̍mGnаj㟱j4n+'RMM^~%Ǖo+F>-7( 8kh&ij1WM = QW.j4Gd)P.!竉QV`&E끁ۯ~r\=q [Tw7![x1WYpdovM!LdJ<΃i5[.88g k`0m]gcLڈ2K$D~D-=8'{f^^|QR3nXYT3!E6ܻ|{[C%塥@eʘ-{7$#O=hoh3"#vM@&]LTS9k4eL̑~4.!)h URjc]ʏu.o!{*}5!{DeEۨAX~jU.hE"E48Kq(LkrX>LRh!#Jl? 5*(y(q`%nIlGlib3]حnc}}C&5Y`gUbq9wHۜϭ7*4[XxITC4vZPcFXt-`}#8IT#(.{`S}tz{y}VjbdG}u.צ4Ž фBS/; F &2pJY~AF_^zIjӲlõ[MFdb 𞒃I0"N/.؋ģgx@ӣU9:%Ʋ2M;ou6b Zyi*:($y>;iٰ9s'r%g?)u<[M\s\^u8>tjQb44̧^uTZ#4c)urTČ*S+lRAlua<7*qISʅB2ܧt-ٟoFc%_8R aɔNoHx @)2=\zJKU9 [&딌xtd)~?:0xesoo6\ns@ꭄHcͮφ6]֗N̫oNLd*|> ]y&W's`Ϭ#jfx?3<#߱bwa XtB3|w{`z |#_UBVw쫉®c/B{7Rp=W`rHM9V^C)7L/YỬۯD)֡NuJm%`t3?a̮n f{x_)-ZiD,d6ʃWj܊$R?{(Z n}ŭӹBdể(W>]} 3_,5]Jp9Z^(MGb&ޔ"9CAIGH|1y98֜ C\ »Q!tǼ1_v>'f)MYpGt(MDS֮:)\v6vƦ2 ˄lV"HT"X QmNbr>e'8&"GC"x ]þ>FO|E!il/otAndSwYUW Ϟq05P3f\dI)@ixq7Pv|T 6 ,':3tI r`]*ܼ*TNϱ%9Lq৤-96b/i8HOR~0@x!;|C |$;{>s ̐,BmYf=I)4%[+vS #-?f%u'o5czW$8n8P1nFq!WzGhR00El|r a8-5Yn[7Hw@‡ΧЗg9 \تAG- zk/MuڱQ#=J,evGN*RlU)n鸣HlS#`)RrqNbi6Ȟri'Zh:m|wS\(xn08ڙL> NC&4%"POgD#o4b@帙rkԌ_L(Jk,Ңk&?L/$I̳~j:wCeZESqtWYǭS8j<7'U~728ZK_Jz^wWnv}N%N4ȹx~znS*]_ or$}fXњ2Vqo}ͷ0߇ar[ ~Hn#:74(WRXZЃ)X`]`+T<4D!W=b[FߠP]5џל^f)m7e**P`M[_-F͖,UioA2\Qt&{_Op.)<c4J:O+whZt#̸Rٜn^5U0%RklDf^|zEb6uc=ޢb؇ب.9K؋u6AHM/B\;; _.;u?T> ЕOw pp)<K}'yN/)RV{)X%M"a@E3Fψ& #bA/+Vt IʵMА 34Uj$˦bfRqV)g @O2g9jt2{VLKEq;IެqV7uDO4!3PV@#)MZl 뿤ħq78"\$"uy@Sڗ5N ,*QS;׵Uk]*׎ f3y4Ej6*᭦϶ myHmjԊ调)S, :הrKx{e5` Kλ*vVe0Mrrf NՄp(-j /I[U7i /RNفvB+:P[[ ta/ϻQ <k΄vVٌ1 @C<9nm=Tpr%aȫweH_ߪ9A7߹&"ȋ3*8'֋˺oœaz4յ1mt-Wzג|uG̲`&m~{V-:w^+a'ګ}r+D#{8e$-Yr'^EZ.` }(LM`*eIYJNSL_U0j F%U  9^*Zp8c Aw3Vrv#5>8ѳ} ucWEB mk+R4[)Z%Dg!1pfH۬UJdVN>#OLǎćQ%R]ǵoBZ-%t^M3qݾm)-e>ʱIjCgqρ7o")(,ml+t.fKyM1r2J=}Zɐ]GJv<8=vo5)'7Y۱ =3.&}+˭5>T梔B+zk-9L7kr⯈7ca,SR2="dsrPa-3掰?E<ˮY Lo{EVE*R xq|lGHh8%W]EU*ʾ'|#AzDm8t$KG%W}-V8KA@nb\f!una`9eG_Hu_$u?e eM/C̡y' ̒G|:vWDw!-o6$jӨEG)qSr`IR ;-b9AټK[wZd SCvas/(K2,oQ'ѢA[`["aa ,f-# j3NαPЛu-N4{lB*ٱޖwwx R^z}zvLN3R ҀfjKXZ16\ȟ6pVtFD##q4$n/.1h'T%x=5;= ـoEYN}TIXk~z1Ue~1&\dv?տS @ 8nNG׾%V`dXB"d |"w[@Ōڤ^%@>$ŸM*R7u2 7oN Y(OeMG8'Ve\{n4p~DSWu'_J5ʹ [Uh;)F@289-,2VM˜u#qn-rJ $73g6_6  C?NT["MRCѽ0T ԭP7ܲm|ARjKn`r~ j@\yd|w!J1Vf>J>ϙT((}@e0#hn֓Y-¡9";gN/ܛfoR0:`dY"ek/q[]-`hm6 dg6ncD?z}˂=x }Y(z*u:4jvDC80\t b /[Cޱ`+H?c)ÂUqU1|խO\Z1Bߕd%= Vv9w2`g*Dҵ.pDo/ Y2]c^?և~#TJ]*BJ?͂퓏%oaMn %Sb_"em4tf&'cI_Ō/a"9 4لSo>:W(7f3Ѳ1pR) y$X9|uv$##7+OInuLRCKӀ[V&-P|)E~)\Q9y;z {k[5cR<'| q DXORO Ўf۫6;d,caP;FM%˰ucqk-fycS-H%Ps=UQINzM1 jIЬNi\b1ÑLT z*w]0k! V._:"=4*X?uN|d"~OB*Y#t:F։ɾ..ߒ vKRam-yg YWڦn4d! ETI<{h/|^2;'ͼUWB1eQpr Z[77\vbi D8TWʯ.Yp"TS}C&dŭDA9hfwN(k C2:w[t-mѦ xk]6^II*> x)or6aST)TIO W8<6HR_#=_gK/xӟ*S11`~|1ņ\rհLn8NzꊺS_3*()2/Qͩc4?)VՏpDج,Du]) \gc #&t˴1rM{G¥!.?kwGGLL)(DW3a T}oL5מP<%v ֓ Gcx Erf~9}XO8|ޏ;ؿgoUNuJ L -גSOsʳ<*#L,i6y@goddzuRUdW=6bx'<7c1 tE Vflݏ%'rfTERtjAJ[(*xFs˞iyjqZoHV]-aF!P.7bL݌(8#š^) ʾZ T>P¦[⋩jΤ][G}2pLxV+ JQ2a쟝@/b)}LQ+Zh;D"ȺU8jLd꘨M vcfSXi'XEXx71^K85b5ҺXpJyRʮ@.O@û .Pޘio~s} :#De3Wߐ 36;%3"C_}ٮV"Wz|{}|ǰC|=ՠ  L[ egC*2BiP"IA/Z%I;ļ7ʲ7IpluT-\ɴ9&07$jT5jΏVtDO<ボ1`~:kAtdi-Uh5YKOPRL}J,hDbcH`6g*ÈY`n>h:w=PG^{w\ c}eHk~ փ\Lv@zN[2p3M m淅B W^t٠Ks8u L7 .y( ˃J::d}dA }r% q0iаBpX yڮ1+# \X4+BF"~(yJf=T-]Vu#\a4-ˏRwRwSzْ?}*&z/"vſ024TXbɎ7&CkL.6ίܩs55Y!3>E+[S_ I3 ,<,]6DHe/vKsV=܍s74g&]YhtGc{u5!!G +]4']^OZ^oB܀&>bMjm)/` n_G( [.O4{:piH5* '/ȑ'&ڽ `>3(ePYS2EtRh3GcYX*ݙ9r15].S1ziu񴆿8ܾd8՝Zxb`nBbP I;4wj Lu3_Ƞ`|OޛK>΀ `a+W:y n$v%hr(>#J)JzN]:>-+Ʒw'ګ8^h3sֳ=58c9)HrJSQ}D MIZ亮 ΎmfB*hkdaz@F5@\uHYUMq[t3E_2㺙 m'r&*Upk2=c|Qpu?NNjsM>TmLϒtW[嘚ք._o'oGPM1K<{&-MjP}}3MrC]B_hB~]P4xP9媯b״j,dtKx9uj;xjTU 2}ox3 ao<ۻXAȆُ=,3;܇lauԉ-T?hD/ӄd$odh-bg^YJ6ވ u̢ևi:eN>ƿe֣KX%( ~]4y4%fƥ^:kXSlP*(^JJBG%ф3QlbGnlq&e?<es3D؋N??$:="+D GgafU1[tn{ R0t&p|Ca3{~4o齌s6, B)ݖ dC#\~^cV..Kzp\eXJ QO4]e>ovr*oGb jc|d=:45'SEp6A+&W i +8Qf2 u4VyƲ@:hzaZDl`+k4Oeo_ $S\/CJu1'sTSA;i65Y‡Oe:s7G'-x|j"#u򞮲I;uc V`CE?"Ү@TN kx'v]"õo3k$6' E{Pe4,Hu@qNѓ-}E]fD 7fѧ?ؐ0JٹGtŻ`ڧ9te;?:HJR_}}uupEpAOz0L>Z "Y"dNH 5'¸+.S!\:[/5>k J_Ab^< g-P/&A}&=WF&"T ޏ̴#ca0|&U`㘕k#O9XJF7 {ɃZciruz_Ĉ0+إ5P xqn3[J+CSdx9ir> RS@1Ω} _G_\(bq8X&}<{nSS,yZz}wX*(vOF{ow*Puk5{H[XU#/t@J=,ñ'a]A 꺑b&wCڿ2}igTKgZ@ JgT}[tY1M(`dCLQ䛕je+i&҇ lkv$tzBGJ(obʹ8RQ'jI j<8;'.uߺZ1E=Z3Ou\# ֩GJOg% /W)BfZꕞ,cӪ'uxrp ߪuyZ_+S L {)P&"bz+zp,('|"r΅P#N__zl.%HBy T6q[z7?+.Q^㭒{H^,8d2XȒ)BeӁ9&QJ+o(Gt-S'(0U= ;1t[iu#@9[롤* XUƢ m3fs]y4:VdX{;lyB?%LaHCk@oJsq$(i.9枘Ӭp%y`chrOHIT%k~x/)N?sWBMb;ڦ^8~cH v8-B r;7ݥlz0-Y$[L=bWek$x!)݉I,ϨjyL,ռ<2o!.e4PKxw -qU`918MV@ݴ\JfO%TErd q8녽ʫO^W.U0fpGy"8pm=Ҫ8GaA8e0Wu$$ޯ+Y]+J#t;%}NelP%ֆpF5u,XJ)OFnR9;0zP l4I=Vóit,v Rd`迯9;H(ƼF`%a]}+n\HX舵ZAbgxB"isTy ge h_l#\`Ry/kshNig#0ӇF2P5:THR^䎩DPs;ZKrs:斗`P:}î 3 0N֬SߊqBњs 5]Ei PzpYev^:IxL|km4nol+c07].In3 #9GK3+j-Rd"qG3IY^-Ì(+1{ʙQH7y=PHaqa' Ps`'P@"&  hqVh}{E 2!c'CXȹ~U #9N o/V!͒+A(+I& 7B ͆q҈f*פeXTwAg.خ$j׈ADWeۮir28A:gKס4Uj:tIkTX;*T}(2?Kir\̛|Cj ʘ֩ۼX YL:,P)XΩ_&~q4R3k.E@qJ6+,ƀLpO9ydF wTMT/J.zMLa˄ywU{MusM-6?SN_;$ʨC2j>Uevl<ٛ4@e$/+9omT +"?ý64K+6(MM{@<1n%bC*Hh *A`Ukk ΦGX' )4 M=dhxb +%Uq+2m5@/%Gozqkzt/.,g=rԴ^9j n2NȥIW,L5JtH'FbI_Q@qu=x5T$$Tެ]:1ޔ8q9Дy#weFӻT(a.Qn8ҏf^dTfRAr+ ƨbB@aݛ_Q=#6U ԹX8Su͑X_E a0L,I]l*uW|IrIw,VbEBֺVFa_H%l\rש.Q,!,pls՗+g Ѱ'9m3A^-L(>N):*='B[`Cf@u@4c6r)YHng)6up2#N86Iɸ^$MMًYYMPٳ_BN;|9$~w64Xx(kNȯ'\zBmxИ|YG?UL-Z<BI QrfpA.Y1>g\ZZđKMr{R+|y17Ѵq[-٦a1hnlLn@IiI4 7+lxk=;"jcÁڠq )4U~Z܍վ$k1we2识,vVг+ ۤ9˩|xOvw(mJ~Tr7TwqoYo(D9C6̫!ے* Cc@-C` p^,:fhO( ` q0r}r `&΀ZAsb9૒\ X۷2s̪BJa!Q1H,/zR䰯%p!S* t =;+=)jx~{#!|.OfAcioVLՁtA@&T E*xk!ECBov8eZ*_ae69:/ѤMZ N. QGDš_*^h+v!YIU1 (-.ܳPA\ҨZ=Gk\+4ƽ"]Yjd_zA*!n1IpLg%rK9b/Ḱ֧8lY>lgslV3ym^)  hDx S n> ʅP*g;q (+@uq%;g#gr#7`mqz/ϷrG v3 yr8!xC0jSwlǨW"D.>]ܚoYܓwkv58o/9Q9KQ])O@f  t؅VO#К;Xb94`Ƨㆎu۵Y&y="cRB2 <bsbAa&u;/cJN9"Ûߩ $xR:߫xcB{ .;(%tt-)zN&P}{!K+ }AA 91WTotٞ9|E)(>z.4#hߢP5uJʚ]g-EaY0 N,#)^~!3C %-r5 e?%NrPН P0}Cu7ȉ{;߄2)fVm3P"}we?bЬ-#Ad)<@;Ph"8-_tky#_21;%I$AWD殳n\dmqŕ`^/<{Wf,;5(TvWncIWU7㧓j*󂸇ftxA}ݣ亻bZ:L%_h:LMϗ6J0.+ (JomjkqkCkw17/M\g(sQ4sχ(b =6_VՀ=$x(`$J0xˤ/?D~;tXƪqF?/ws;Č5͡j\x~k4\eFCr1uBDQe84$;lxI]@o$EFxNbϦReN3l%6:0]SIK~*e!Emjiᰘ"C1b""ܔo?mL($4l*!8a5a;Ǝm#8 Uz2T7rZ*?7O!vHBI3~X`84:$3VElS --~Yll$r'פ߼$=s:hi>2#KAJ:u\dt,tNWa zCV6m4*>"L4(72Cl0+"(j%7JokM^GS 1zd?x=b;*ld@$K/ O&tc#>a۾~+K=" ^x~ѱ(˄䅉~y7DX-5>R <)~%`{Ѧ 1;HEܝIpy"8ٽ<u6S7 a=7ӃT.kKOQ+Zc,̉2wS,:Ӑ CĴɛRYml_*sp:}\kqk+a'Fe)Ƕ@iO0 QF@\t `7ejJGpj)KI_J51!{@(HJ]]0T8}xjpeNxk1jZn>R#יϨY/:Ă#Z$N aԎDBƐC/(ۅ5\_7j R\:ˠ[8IC^{uh*@uJ H#sn_.lÞEjEEDPJ oXҡq#S+3U`:@[(n 3s2 QeĶ#de_- Ǡg:qWyV!*86q>]rӫ5KOHMRL kKBx.phv9 e>가QOD+>HӘJWJ0$5-gSUeܭ(%0zf1{oUO*՛/L&.mLdN .0M< y-jX'Qǿ`vde{|8_x:{-{G"~+1]ey.7Cs.qOO9]o8RvB^+_*~ebo豉կk@'Ir*0$F77ɸēXLƢ,hԁ)sv*+ s %]_1Ws]:CR'-,c*aݪ[ìt)!_BkM7DFѶЌ } Nِm9)$I2&L5May*IRA$0nv:z]d1 L#'^V~J[57됧qa?1'( ^,Xjj͒]݊O֕buMYNFIBRbFͬA`f<=ޭJEzC*E7 em-.0҈!Ms`s}Q!.M\,puc^lr<6 ," k˽6Mܐs3DTVβAϖx㘔Ɣ{3)dV@+2(G&b#14n1ZYƷdD|W՝SVy(1Dd޽|ddG82&6҄kIgi?TuVϜ*MllE2OMsU6NvpbLeFͱ(HryNCMIDҰ[ig|.uǶCE &dm`[5_?WE衠8X=mc"FCZclQvmuamxp dwv~a 0cϏW @bMmCT(* uP%`sp5#ZH"L_181Նe/cq&R!5R-O£FNiȀff) 8V9i蚡TQ/<`=iX>Nf䠊S$ 8rkO̶ljӅqa~ыʨ(ǫR)@ +(֟4&sFYQQ~u} YkK.߂Cj5-zy5I,ŏ~\&(.{x^I{o!mzj{TE¿-'[Yc Tcwd YS,BlqPz|(CM"K? 4`o>:9|0ae2DW?@ TfT;^dqw]i?kO?Q;F4Uw;]@tT*:du{i)oe;TXSVOBӋtKg`IIpXg8f_ѩǰxD!:@8>%-*A.Z~R&^K {QPB5݉Pu 塑\F\@.\HbVC4AJ)si9naֽO]&6^,$J_ >R|#bnl748%\dCSL"m> ;*=os: M`m;Z{P8TtochEWGJߛZYv‡JI96A{,ý(SZ 4R_6.`9ͽiwmLZ+e/\%6r#57~+"9ф Bi X>,D,;e! ʉ}FutykM??KjㅖWX_iX(uP" {Ou4'w|/k9v3#c,hF I[PxrmnEwAM/y$D?@vşY!vYd£֎_4la4Vm8~qyIO':o|]'2o#C]C{I_E灘Z1P16)29v wkTﬤ4R la)2EP)iYa2Y}(L3!p!B65?|vQ:4*64u m!9'0qO3zdj&FN ǔ3X3Y;%sղxqP#mj#[1Y]5/j'%J5ڼ4pG)Yi?L?O/w.iam|tfw<- z*^ )ejjh}mׇt:bi%!|yWZYx{:dBrڞƫs&Y ͸62d6$wP_Q? B02yeQ1fHp]|-@Z6&fo8?ϐi%PԘ;񃣽F/uk>pf=1\ NkL.BNx% ֝>;f tyO]mh8ꎐ<ߪ:-0+շ^hbNsRv73Q)9 ezdqWM@^g.`K1*jM\T烔uaEVMFr̵dչiɭNv<QChCJGfNH@@ $s;u/(@\IuIv~7P>n`-}HІx`c.X{W#/2Gx84*l &zu3Jh*԰Ď[aw_ %DIoHop3qZ2Ɠacwi9f;} <%k#mG(sH/HwetEMR:lOF)3wlw<܊ Bәn7NKFdWWZ*ju7*לCsQjYؾk?"F|f-A!* ߇/6\;x5tNxg $ǩAKgC0rWy4oQ IGG!djI›D2 |,$Σe {MnZ.ţ%@>xkE)0L8L4fH-W5͘FAV#-/a@'ե峛Z/i]V`*[]P޿muEɗt4xys`Iί2 h$Y?*e,o቞Qힲ[ˢW֛> ޤ *9* ?␢3v}KBhHMi.lu`R"(<2jx.qZ4JIJz ĮJ5$-X0KNlQ|AIKPOtP IS*ţr]-h=0V_RMEyGo;gٞÞawg`SG^>=&웭]LT[\ya]R8uo2yckpɌI.^xQB/v&/Y-pwϡ#. '8l>Ks{ x 4VR B&7AÝ~@6]j oقy'ߡnA738`׬P SPdWzS|TO;Q;WMLiik f~})߮()]p3e9ϸdN'5wh~w ADiei3!1)h2=O_0w{5M G.ؐj&)Cc'ٯ3t-4 51)sTx_.!iQiƍQ?&LzKa@f ]va:n*ֺ L%= %~eByE *9np! lmK3v"45(vk1kV.fpwELZ_iyh:ujUdJ>N`y;񋫄io] ژlDL7SqCDxT !y>|M LFX,>2*⵴L Rd.=fj>2*> DeMҷ{ڮjnGE%CpXC\dmN8sޝ ce|vz'R>Ugh<hJWj:W}T>E BuPt^cE)8[1dM͙€qlS{oL4ٷ L$!2[a,wK*𿘖h.Z\վ.OOW(#ꙸj E/ G Qx*Qڱ]Q3QMǺDrY %68~7a7^c~dWo(my`&CAgƑ[Io5LDw n;AH3=+۳vȍ A1+Pp Z,@=KE$d;߸]A8_#Tj=kN"%2ÊT~T]ۑyXl:>|֘{ {PدM2c@F]?ps;2*k8rZW. r;ʤ%؁h8 41r$%> hn~/R%~Rf v@*TFCpؼoo%Laloٿ?/ǵMGAc :3,hZ=K*҈xrIGY)jksz=ϥ r ątT+y5pNPJгL$Y9Vbϱx?{ W]cOդdn*9{Zڙ\9 e\u!*Ydy5uV$,t\DŢ=`f\w?"ym rԚI hS{ƀpkpG'x G PF 3P @Fi3YVdŖO<֣Ob8IҊi*LCV1LVe$ #IX޷sb:^+pVivx .2]ʘ=h6nj ʆaJu(A=1oÏ[ 4la)I25*O\lZb~ɑ0x|X*i>P\d90lRP]<0U9+?n)#(^ve֮ΝoԻO轱JQdS0WG` spGU$ ^ )B&`(mɪDGPjx(Μ 7*vP엉r [NX_97;c5}pV3V'{yЦ| Aජ϶ŬKU tiƳ.eq:ZXe=@C+ o&ge̢PI6yZ>_tV(!M&c:n')Nsў%PH?,)UW19}rǂp5ۿ~ٞ2sW9$Nm-^G$CUA?Y+u$%A#o!ooynpϚ>O:=|^6Mi 䕨.#$;AH5AB}X `?@,ѮIn99ki@ jЭ{47>2LMb=X8ifoX_Cw]:+64y5hz3'*E,XB-M8M8/spfŐZT~]g+R!8X=f2Eֻ<JU5B^bYLklTkl|t w6p:(pc!}SGcx`p@GQ4Qzu_BJ;7o"8E1JEfRiںn $ QD/%ҮǀE$-i]~˰Y!8D$ 1}[3:`}]􀬔Zk~4Y}PYN}(fZP:֡Z*Xt,e-/1,Fۆ݌8 0M#EO0K~ú갲8ڋequٸ:pOFaN֝M㓫lҸ >iʅSˍdzɘ 0EE~#v|k\crc_mi]ևL6y^Q`bpyB+su; *PRu.#Q'`7f:<覼(" #pX= Xanפ XUp ɐR ?r Vw+'Oh ?; $@ )v> &<,}i|!5=Kg%SX"Ҏɻ]_u5 BCȹ_Sl|Be*24Htܝ4foIhЪEU P'#%=_t68% W۩@D5HlMN36ùtNt=D(L]ia;wl MtGCRR& n*Y:~ =h8~IO.YHT40ϟ%r3|2j &XC`/s2ǯDoj? o+Vp;&ν)u*ͪtӣ 8fn3ʵ I3Hakdǂ;v hqc"#qgJe 6nW3,#5*tsސ=1 &뿿J1;˭Hh2ծ0Xcm0hcRn؎D}j_&oڌM@a|X\'^3'+md1~IPg`W{0w]֜Һ[0Zzh4 3jf܀!|^C8]N8XfJ]FE[0S=ҳ[lna^,683sp=O^Gw@1TӮpZ4^#VPV2y**=;[ #X3Mdr?Cǽ=EgUq RR/N#1&c'^\g~͗8aK"&T9 u6hc}nD >kJNuT]j' 3,-Q#JC}9z\FBhtr\:Q6-7&Ù~:Ӻ |GNEn5sE,iB Ѳ5+ㅿdwY9Kz9{:T)$nE7H5G^+*Xͷ]^L*`SXBǡSCl i+:SJ>Ri"a?[y3RRBԫ,;`5`>3 b[M/{&#$O:&y.("[ t`khSūOM(vքs)4$rºX%ooNqp" *$T1$DYP 1w*iEHCL_Jm W3{ye5 Ie 3ŵ!sS.OPܪ amByr^gպi:?LC 3(?RWt/N+*| bD牢{z& "9}h=l-A9c 1خᘍȸ2|n"D ^ &/}ƙJ7׳4 1n"*zכy⬆X9TIaAA%!܋zc!7;O;V f6LE`Ji8ΟXm~:3(n3rl>pߨ#5övr"Ӹ|7C?˗y d p#.zY^m=gz%"t L{ vm]j7bxILB%^RYVͦy픒0BND&eZкȏoȣ>zK !L.,Um)1L|.Lre@Oς/8^л'ny @ix)dqY9~%6 HC=(O4yufyA2+z{}UD$sEYNr*kOo3x mBߵ͎`sр_4kfU_B;,rT.sٲ\bSOQ=RLZr ~@ V:KҼU1=^Zbm !k>ry~l!0 !uGQAd׎`kxYqo|IS܋9c~ZMUڦ5'ѫ;1Ǽf27{D"t@Y%wOG@{Zx8]|Rg}gw n|3(~XƘNci,@EbqԵ0օp2A Pt)mh+H#n Kʼn%\Ğ lkw@x:`,X7xaRAPba *68-6ldAGSlҙu!~mA ?JQnJs|>[%i%%TCy2J?"$N/XK OiQ \ͥ:Q}~0Z*|CxtK:+[4=b{$xT>Xk)6çкCU=/ %|#[; VwPMu]M!&CWJV-i !g6&Fa÷9s5{/ O_2i(ZL>Z*jcav_5QCT0HG)H aZ]":&\ŸzqpcBQ5A]@3WQl9 &+}T\^!bUS g|ʦiPe@!MeR_#ayJR.S(CK?AμrGX>.h4q?B]蓕D͐躞KoYM%=W/ġ Bb !qZIU*Y'@Ghz%Jpq K|cCP}[U/D{~E~Ouþ,Ćˡ[pY:U2Gf3 Zb~܆ q,>KywF,8k-#w;}iI= tߨ[M ɚm2 T-يKZo"`9~~DW%줘v>"~2x`ajRAO7Tm4?!*ėuO)΍);AC>fFy(\tC:&UUq;w!ڨ$(v6~cD;˸T]©!:z=[`Ię Ae[eiwSŶKYj 3 @X`(;/GtFV.AJ7D#4)bl5rѱ{R/4'b$]Wkfiqp%ŦP%UtۢWs YnW\ Yzo>؝!čǗ7Ӑw͋fc|Ք颹e TJ.WOHmkmUY. <9aAܭ UXYIVm6$|Ԁqƒ @Pa%f q C1wZUQ`xş;"Pgi햂3KocZtK3y&ENދ-s JBGVOOTWCIi'Da=bBjtSRne3#n\79(H,BT#?;.1nq1/[ū_N)jQi;H{MLuZ)@VHOnnjGSwDJʏجmF;Ѝp8=׈ߔ/,f:㋴S7Бfش:U1"pXp}<͂WYIv^!~Pt]p:6u:>Y8ȲmA,f~~]L1tXw;ҷ"ݽRǓM<s6+5Nb \G Kd"Yq}Zmnh?Ձs+|B8Bw83H1[H`xpG-"כ"jLVvB^h$9Y| *}Zz%>]ڜ%(D9^!x paL&4NYEA\nW t:dϳ( V8;Rd#VrЩ&kMO0sy)~u,2$;jOP V7=eIKO܎0:-2ױҋJtz(4O^jH#LԛB0v+`n!ɪ QkzFi?HYEgxr62Nߗfbeš<$y]pXbg+ݾ-!/bd$8yJO] [By kwQ5$%&}LuB\oV<r^76( TQj GW- t4t7t* mGN`vOᬕ_Ҵ%#݌ofoVѠ6Q=!.mBJEZjAԷ( W?'Cc=Yqa8uaqPIpk+z Zq`>1Ի {W Piư KՐwk$jp dAӃBYBm1r4`0Mc B]yFKZ?ڸa@#;JB \HZqXб*ni!( hwѸB"0/}[Tcyepg`ayIef+b;;PSe2> |om1b̂Jd CkLZ{W>FK @$ ;-%2#n{Ͽ ;d'ה +@x?G.!i'3ָsR\ח=<2MU$$APH-{8~&F-x&к_*U^z>ieM;HveB? CrD>7LP40[N{,BcC؎ A94U>sy!:bҴT\=c>s,E2  fIne^"MrLظ\ytRh:USNɅc?{9=qM4׾s#vGYȐ C^ȒJq!{=ZO4,a;&*wT>Mn59z*zl;]䒌v"΂dyRa$CLؙo_Dtd; y_5^4@ ^ibOJJ¬IwVȓ-et,?1 8]6Ý`9Wh96a)Qqs,K% [^5ee Hw(%&hejd3H >rJZ)Squ{X/ហXwU扎*- _='oFuSWӆוpL;a}~0r6ˆۓLu9¶uf!'tIb&sT budM c}]#ÉtSW4>I| Ț "ȗZooQ﯐b2y.nߚSN$UXVCMmNFSO dBzek! !6C)ah 5:4$h1;Vqh E0;a.q$)cI>(mq]O234 EcaiNW@{m%3+U}쐻/08hrXx0zWnQ|ly;ȫ(Jy#%Lk@b$w1DW䔲缬s,GXmss(@;[H_m?%8P;<u]ݱs(|X %.";;Rs>0i1DɎ=1ux⽂=j2mX1ʇ.$qXzl3\:s;z,-DE= %2y18n&iu$cH}<oHqii>k8JO sD,I;e~EHkĦ߁@C H,)L:vh>x/kp\,P^\} TڳŢ^6m:S4:&/$VQ%A$' 0t 7]k^ʀMI*Jm@F]@ (3#:ka'%u8彾8 oJYSN=J'ޑp(Kkkv0*?n45yl|}:LG4R1XmSL̥gI վ'g@ahGIeffe/_ ?1uzG|R"kը߂Ok^KoK8E9vZa*^!>uh9{[I䩤V,Y$mQ ,-dͥ g?l&#'Ce3`D\q b%۴ 9=ԫ$GBYCڏL SA+$Zl6: PIщ!&M(P/aLO^X&g M>PkanAbe.B&9یx4@cɐ&f};CA)"uͩ8b3ɘOp F~w)WЋFSݙuvSzN ޙEW/u04yd9RƋV#ia{O^_MJ!W[ǽ]W-Qh]Nɦv`Ѡq YëS0jZRR_?xbW٩!z%SD Z~xVN X0X[q+)@JZD.Ssٝ.E* J=؇"_'!"_Yؤ*> UK>cI AwYdqP~A2^f׷\MUᮦ@]Z[ϔ=.]*H6:` h̼8%gJbͭٶAH7 pσǸa0ǼWر|emf2~T#P gwѠ"Geϒ " [EBwLmJdG ëNE8`Y6M ѱH9YDfSyL[7 ) U-]٫xIEgfc%m 49N۱5)6BZ!4GSS'uHGgR{DH3_F(M>$rmC=v5b+Sͦ{ 1}dtįpv|A-tuwG򾬨`ben1:xYw e0LIPmy2Ĩ=n> '0ߏHqNYbi{ eߍԞ~?O:3HBp)+Gd+g / طJB%E} CZMv"MvR=I}&-{5oн]}H"OtԲl*8lzip!6HXK>4 +4)ǥ/ҁ6Ȋr1`~3Ncѵ&bd7v%P#F{,EzWMWy|[(泎tRHܝ!ZtcXP&O/ ̳NJҷLlzNl !AaٛQ-D׊6{C; tdxifo,O0KAaF͌8c3nm0>jTnޤ ɂL] }Asa_/ӛۆqg ?Pŷ."רV,&DYCW ?n4g)NFB(N#<iq .zr*tٌj S6HB22'Y=cwIPK<׏甽#tH7ZaâVgm^.;ux|{|=,o$,1[7N8&lS^B |œ7X//&Ih9(;r[8xEn'T2n={Ţ)ԫ-V$t:G\aӄ6x]Gu(OQϘd"[=zX$pr- Uшyuy @[WyDF۟.;0-yr8gADyG݌,$eŸt/Sup㍈J[{j6-LwiY*J9Ou080#_(э{i3c1~1a0E3ԠXZ:tPMak!hnj"%{{UI~},Su>Kkgb6A͖1Z\'k vσo咲 cd( Zx2f=kQps6}U!"elEhEWt4'7x@0R3K,Tx b7I=4YUTd]!xqO'E1 uk8%26"Cd ~ S~F|ɣ T9x-" rF`46Z_Yx 2X@Z|=ޡEd{loM̱H~V4U%:uHy*m0\ĖE bD(}(0 ~(d FogCS/%b6!$X7}7g~f*(1B]V)y^Eh<GQescC"]#@z7X rb=0 ʃZr91#l:ߊy kJʝ-b"%k5|f~`DY}#'ڷLf-Y<S õz5'xEETb[ԭh_i|OX5![ D-L0!8e혐 nS4hZ&uq u ;tO&g(gcQ=QRJ=_KBF:>:4]Nl̢)x(bGt] В4U?l?FeoFmqzI_w^(SC/ƾf|{!zh-AAڥy?f)bQ_i,q9Yd3[ڲҞi>zΣ^Zf:MHǘ$嬂0OU*?p|(XS2+~"hMweI^Fhz[>RyzR]&{ci23Cs963Sɐ(q,IXr' a)@:-")&bZ6{xڂvAaLX4Dc}fMo(("6%&*Njߥ*(p_ݼ4+Ң%5'Y<#]]^MNTH KBBG!!TM$YMLXmfZBaf3կ1;ƺT6; cC4"?p? A%5_ޞί?VW eT58VA{'Hɽ:3zwDH 9B:i uiJUqչ-T#=LA=ZRHΎ1{}2_8gtNh%Ɉ,V2_ݦU2xhr+J@PE4,#j@ol拷aMϝS^3Ny'BYmWG :bz+&pzҡN\LLR9iHjBdE(Gc%*L ,zǫ%5Iq] T >0/3BфLYuХ2@Qڄ߃gk V–ϱO ĝJ~Bནޏp\V CHStu bjJ\ e#]Z vx`*S8;+yUE[=dbā/W8,zhdLS4n&CSkBzt:;2ӣ6VE)"F} $ [Fkl(5 K:FߝrRZ3 67%b[S~/u@RK .Avf{ _ՔPա4h3D@zG (AYpcv yCP$ 5\rΉ :SQ[ž_u2mÂŊ#b &W@ڕ/Q!u)B9P WDPfoaՆ[0%u0:O!:4[|k8ΓЗFpSƺkU'0\yKx75v iޫmXBV͆ls5 kG&ҋZ5ж;峨)rkfmr;m:VreͺoM1#ӹLzSp3= f I5YlPӉa̝ea#"#V0q30'1.vzHRiڵD_SgD YE" {G2^j)XEr] &+[s".I6&|H4ʙqbSj[+-Tv=צӌdRpԐ>0k]z A\ocI3E@d-tJLfC\I r]6HMY%_WVLn\aGUkR!IiܺTD3й{~R 쥵ϿYt22mPq>P !00Ag<׶Z6EjC YS3˽WZZ!4} ll8A6 4q$ ˼nqj#3*m3 ؃O)[H1cUp&}.ۣ-Uߜ?ݏFvPr<GHKWU ANqT:@O n+0É$ixќƒ2 /eOsJ,^R&kj}({Ld OY)aWkuˉI*݄- {2u׼zR$*B\VNxGG?)Ɍw9$N*Co ד<9 & #J~B\DSuG' ̦:PŁYD; 0] 9l܉PC(9X(p+p7s8r\;[pI!amm ^'jbdNr.嵋S/Z%=ĎPPڞ$f ;ɼ$!M/4Ga _nr{G'q#0`?-0R׆mpW>0Nm޳|)ɚhx ;ne3pAoHۂCF2Uғ/l.Ԫ]gwC(aE:3]5k뿓ԕ҇C}_~,TF&(&:ea-zѣ. Pvb, =GRÖ,}y!S[^ʷ#f*U('UZF85 WSvGBPCQD\3 s asQðн7LҒWzĚfBuیwS[Ml0z)Cu*I?\dA=e݇߄cldZaߦ d7st$-G,P<~YU:7Pma 1дda5 .*f؉l C$H>V2 $.&\\bbKۨ=P3җpW%o^TXLH*~-֪;ͯ߮ c]%:(Q'PV=w"!֞-^tZ[jQ$Լ狲_H@ER`3^UK?v+a #[TQ3#Lx2f?3U78w;4$+nϰf$ -#V*)VV5cl,{JU!^46vJld/ _2{D:kl7qWhOC] l,3_@_ 2\\ݮeаʩMP"YdHDu\S/gKD*=c+/;LTC(#X=x@ tSipѦggvQ kpPyCII qI\pKM!+0&X;兇]pN)O/Drdzqx>aW}N&k117* a[XX\p&l=bXNF=w31N}`)OW 0xg&0ll[-yiA_]hXb:r`7V7 .1 6)pQ邲Dɧ7~>;erjABr7LX)6~ ~V܄(To06:Ҭh- {03l8SG">ӛ]9H,d=rO#|_l9TX֍9--Sq1(5~#ʼ |La>Mo,O_lD=;H1rx2F0=M:qM5 κݗ =V1WcE%[D`پV_ P@kHRs| GU3 1oǃA\qW(YO FU6G.jɤנ$鷯ȠmZ -)ã=i; ;ĉӫWI#JYnO[IHQH) 9=Oˉ(PvˆESr50e2ڽg:'SMyFM&y28 *=Ϻ:n /{Ai|=L_zqYLi "Ԩ%;~s[1F_-Igjq{C5x>Nd33!q8F{h=PH`~;_,r@Gkk"yDVA9N(S ]F{&Z< >WERJH;(J-ZK ͨ 0xs%5'ԹwB^8]9E󤌡K#@.QS蝶5BS?o+~C MHT'C? J{- K' }9F~8!gz،Xu(wR>QUWuj]ُADZk~|$[T'ʆ SМH](&6pŴ~ lBmsu7|!6%_AjD2I&oT. HED`?iT5@3klt7(Kn,rQ(V@OZ\;ZMLE3MMtm=\Ù$p!: ^s2_ohg/5ڹvyZ7kݿjT ;b e"$RA8Nj-Hq8Iz-! Ky>l`ј&#%iiP662\?>ADҸ[!:" tCkuz vI|O>^3_@S캝VBHo[0)|{h>VD# pl?Q0͈SUT[JΦu)tvO:zDM5pXRpwj~ ~BEaoRgZ@|,70tb'MP,ThD@rõ4UvEXw֠DԌiװ5`h]Vj5 ܑ L&ab}39^MCakm-47Dd0Y츳BECc㑥BwE2g|&a V(~JoQoeS h~vP KdP hu  PֿCg12JFSCp8L[ g] \z.p-4=[5٭i+d0 RhcAlLP勽^|9ȝzpHغSH1dI.dM֪$PC5Q:r@+e$I8?~q{p8H( 2'Sdh( b$J]QJj"]5(QJ[>uH=?1=5~OoXEJ;\>F$Lė1z1{ y2~D`u=b|4 Ko5FEɬ4)_%eP眅-nWlj&:l.NE?\@HdyV}0ٷLN:z_ #dp[bm婄@}nyA$~6JwG*n;I'G] F|ꝡx}&eݱ8ʯ(qrp}w\&/PE/\u"hoQ0Дۢm֧+h`k`"ZeEQӫ'Uwljj,$ɛG4B>d I7V h޶[Q >WЉ mƽU'm./PR=byV)\-\FmLQA+SKعȮ(k2fQ_J ߓ^n  t*Sj͔rsdNv]UU PFpt+@ڤ̠R[{ `F}A 9_;őin:4˴f(byՐäw3v6Mw+EٙrDn}a{<b` & dH#Օ,RAz enCj%ڂ&Ճ? aWp^{eIzT~dlGúF 'uug: F ti_ܦeVè TbȐ!/̫g!KM-')p!5{ z(C8!w"hLy"oofE4+TmN9l1bZ/C8=OyA2:\ kOEK{$טJ>St$=gӪa(-R+9WjyOW[<璈L E:\I[خ'UH K>#- :(ҧݲEUdhz6i03 /ㆇ1fAP0g`߂1TsHIͤ:wq ~+fتX}+ ?&8}u˛-6Ewkޚdsa S?QupZ#z4 ZtYlO4af\ 8aݤH!X h{ 齨38H͕0 ީQUWh&4甪mTv% c-!R@~^k֪ÂX6hd_G#.}YSط& ȮEXݓXܓ#)uyby7YRIm{dѢ[o#'ܹCmR۫X󽈤LW&'L$%wղFW+v3_Z9-]w~E/CӃ "!HYgF3e}G,lk˵"g-ݒH癣:*?mQ6`&^|Tl I$;EsXBjHɝWAp`֙XIݸZ nn 4ѱ0D[Fb^Zn]22rxL"Zj>܆*D u<0 ėf-Y$}&S>]x,=m| 6E'+2e:re#ᖉlusDvuo'I|~": ݋hpϛ@yDbt$7ժm4f8'@$#/Ŗ_08@Cƒеi1Qh5g fxYLjoY},dM]"]Q!B+Egh6g;5YtN}]c{)gCOվkD6w*g.I%T8 4LRhܱ,>-|#aA~g9S9a4coAU5@6g _:Y{7t#p蛏aZCWfqhs+sD9Y$xcV8oDp'.!%1DV [Sg(|⤩ /ʹjո] >0:PHYrbܳz&gœ]1Π&P ) yLղghr߉ nj @ VHKCe|Lh[oD?YCW P̪GF,'|NsM [<Tvob5fV:?ԇ&E㧜:Jm<'x}Z1$'^5s_Y3 `Ȣ?& 34"t} qC,Y@l..!ә!gXT ƹ2׏>)Ko*4,@T~F Sq$}=WJ5fʡ>j>ZOm\NfL͞bɧ1>-A;|({sHߍ#COs(1;Mo` ľ<i"b5 %AJ:w h }Bّ⍢BfPn:Ίݦ.db/4j@쐜:CH9q)ӫ}bci)t$4x[y}= +"g&o0_~t`JO>9y1P3eDϺpEjR|(P-DJ-qU$O;)*vBU"HCTR箅%E1Ylv*&&cO*C0ANJ(uɒ9=|H6vĨE”y'3`ܯCR#$k>.%mXФjZ&{N+,RTť/2brXsc+Ӝ)bXDWI:DfF q;KcklE Dc3.kzhEng/ ,`Y=M[=Dy0S9魤b&1DܷXN;$U7;hƽ`SuO|67e;jʀ}J\C-٢_ؙ2 V!}wRy)ld߯Z5J~XcESkߋ2Z D) 8Ҁ!Y94> )];szX2)gnEv@оA1]כl?J<%A9WɊv0jOˀ@{J8۶ۦߕ/Y5{b h,.@hP?]۬/R`n&*/ 0wˣX| i#CZTW򟽵c$*r^h`6^{n>p6yzxd"EyhWt-%{݀[^lx&]xVocHsyHPJ@I~0,sXj}h"3ۻI'p@}G*7tQ%P7WXPSsg@ % :rj4$__ݗކ/P#34 ,fw &ĥ5XAX=b?RszAWƂn2gn^T-# OOc m'dot4 ruYqm&6KL}J ݝn]b r'\-Tk:jQ]ػ[җe#,iHWD2pqf٢bRn1%˝λ+R>_] JUtF _ca_k odO#z<.:i70!^ˋK<< "Sk#*n:ꤨux(v \pvTUR0s|g8/c2uLcOxw4U,jGmc߬ 5a, @"*FxFBr(JAWfp\HUa'<&/ae_(hKsP̸ m𙝿Ʀx_Ιd^YMBud' M=]] D+g\d|T2Lĕ㎖G#VjhdOGamhDө_m=QhPdIf2*TX???h +ScnzӊN区%#G@[惿4y_QZz7m-'B_{<9aG7[g?=-yx@"GǤNL]Kaskzѯ\Rp%I=#\YYWhv=BN8=Rɜ 2$#>hG e /&xNURHxBɠ"AظD`&̳[~`qM!7BVڝPףķI߰%-MUZ 3#N4BqOv/P`ž%8+}H!m^zpin;Rv?nz,mꐤrȴ 'VBQV b{GrY.ҌX*}oHA?~u/ pTևnj~華6=['rAUʣoبvH t~akr[f oYLbբJMR0-GZnpﲭdcŠ 1* PiN'Z?- ׸Ρ| 8U( Ȥ9-f(N(>vc3F!"Xy]z [~3JP:p:֣ \L7/=BTlj*J9exY.Aq%ć pV&<ɱvq1\ڤ2]W*\S*Ʋ_`6ű&VMU%Π%ı (\T F[)#"M)h8UO9hm&0/qT2:%Ӌ3%ŐX.:v>KRl;qշCF<Ao|^/I:LJ!a=}xTyv*0ݪ/ciML)Y8;\fDOAkӔ!~RBE/8+£Ψz (ԵWa=*s-c٢*3!5R1j<ϸl4t\ 9^x}ϬHsG@N> ~1Z R_&^s{GjZ*"8&SE7Q{g"͆[:,"S`N:J)+6TbXu{9Db8hH."O niHBq+08mB ye8ː&<'yfr-'Ih7&$m'i:hcC: /֕19`1Zc7B`r$}=P2Kq@mQOdھ\LkIA`Iړ¸o%2ioC"ŋ^.)dqRft'#1qq<#;}7Qm2}<3\P囨$ \iR. ),d10ǂO;@47C;޴]&|́5s-l1kuI,F4ԫ (#XTw.%qZekU*ToL*F$79YDs%ړלCIZ$F2^ AV弬vϜ-=]ӂ*vxQMF%Gg/~P=؜hmqi2kӕcz9EQ)rQq OlYKYN| X_4}s--S}3ZYGM#hEl?gx9\b\9fak/Yŀߣk'-y3o#vMUB O8#ÅG\tg{71a-ՊԄs΂?Sgt[1i" \K-r)1a^_b1*K|e`đ狌jr̭ؖ QMG찏a"-EFxGSj8ڰgڟ4kϧ߃ 2ાFX&5+;>bM| P(]\CsAZ.DKW JyW'!ctȂD+,vuzE͌?@Ts Ҷg}eQnQ)Фgg1ysg]] V{4֛X? 1!Dǰ>}Rg=ɥ,e:܆\à L$eH|]!I9v2q':-0&'0\Y/n(d@B@`+ˏ4<&GBrh{ބU.(q8ZEb xD L[Xd%5O 6U+"68A]GJߗЙҭ.ciK >{еgLuH0bãলtPqhFuSrӽZ2O$؞xf0Canxv=9i-14QVywzUBD;9xm ?7YRg#~#cldťR?u ~8]|;%ٺm-7//)HfX"0I/ʼEerao$fq'Q)*&vs .'DN՞?m)$q\B_ x3nClD§F3N|'ֻr{9bxŝ0mXP|vx&MW.{D;'S5j9"w>oBw[һ%gc2[K߱r.TwSA]z9]7>^2ZN*l`N&t2[PKu; :6mh^zCd$*OM`vb Y WCfSoK; 4ū4ٞm=սpCVz2v(y;Eƒ- x~-Wd.U'12=9' gwH'+vhc$O)5h&(6/kzcؠIu^jUx3N T{\ {@0aX ϡg`_Ƞ XE`AJ$`ZwZЃFGӜ(1,䄈P$/M|ה\C"ګ2yC^*w h*7Aķ,Az+OYU:$oU|Ffo sqܖi1JH:0#44wMpK9SФM`[vڛߤ)TFV@ztCA]I뛛nkk >jXm٬ .yNaٌZ$gD\DFhY7%أp۫c3S:=FHVm.bo@&TKۭ. ,^qh6ϡk%Mwk*6VMXxO,j|Ę?@{:or7SZPvטrLͭ?4KpOW?KdC25# p"(Ȍ2h(h@K~!_)P/է8$LvnL"-1Ǜdh2Ӝ-7-v+d3׾ @]1,9S%akǓf-NEFBċqt$.kr~^v9~HioJl ``^4>#r)DkdgʆX5_J,sjZ@h=qn݁I:?Go2^د'U i&n|ގLduÆqF39)MFI;Jްp$.NNPjm6PJPX~˃d-:": (72-[WdShx}OjxErz< Vrdvl'JX%"q5rd3]fQ$5PN:`beEkv,h5S6 0#[xc/d\ji6޲CjL{(#sG@}>f>t{VP7譙?z!C@&hS9G*JX:PeM &}|'8!3Xq!@9+~p2%,TcPcy D{+y9ʞ1"8W| I"3۹hMS+EF-ߘ6 ~a@=f4γf56's jhsMD̽V&R}aͮC|Q͓@wJOȱp;B*?waB-GsZol훠f(N|5uX}E_Ҟ>{ XBz$[bMPUcs)\DJM5q^COnHxlٷXC[5/v=xKY^H؋5fNJ~\5HX7"ےܜ4ǘT7߅_W؃gGr|{8? )Z_YwVM]#ct{e|anZioS9lmK+p<ʵ$A~c0e!- CԊ,Z2Uim.x~x%f,I- dղ53K}hAL@" _(B2D03,`WUrƛYۂibU>@q,#Ksԃ,DVPGn]ЇARrV 1ć0Kq ed{euǔ?2|UwQDK[g[BMȶar\u?0 qحqe/ 5NQ*"6KTL\e(33Ҋ_VOu#8Z^2kP6K6$Iɼi"pI_l~\̢"kA9#,BZƉY|\$Zu[Ѭ9c7d䡤ݨQPh#&9ۗVRĺjS9 ޘƵ6jۃܯ U>7>dWj^ p13*'GZB~cLǴn;n]ZD/g׉s> N]C6I{/=5AB/!_q"r)0a ,~{C&"A\ `jխJo|)9Yv]5-ޘSsm+mCjw_f36|K)lH3N\2IwV"*mԁV9(9Qh+Ȧj0O+ *4g7&:27>u ۢ<wUVNX9^Pʍ(ol' i5+:Euk8>!~a} ȀIetI(BNFn@Ka,hQ;3`*`\[?j+TpR +faa\#m Tf2<~#'|/QP(41yU?ppk%^Shx}4u)*-K(lC1Y~շ#\ `)R29Jwzx=Ml[1NHLHO 0ǫ^104kK34L/R*tg77v 6xaӊ8{wW_d{mZaˏ@# {3’$Y}s.L ;Mthb_ÄR[49E=<5:|9:ZAlY](ZnIo*`)9ګHE+;j$q1iVCcKVV*貜[, %;&]:~q&W%if' y53nTb:Bt;&w^tQ(Nam3w(B {n&DbnRPG- ӵi[^<--ϐ #ۼlttژ4MknnBj$@1?TUl h3H!՜r9tl(.E-Pp~3EA]|pf"?eߺ=g.4ۻo(ƼygϚ`AN W#\#QձbeWy&ܞ7!|oQʭƸ(Be!2tTW|4KW;${1֔eJ;` =9cE맫ݜxo;jN-Ҋ;  e'RI׼8BL(l2HٚXrѳq3.p:? `'Ty&p~-7KgpY%INps,kbqG~o,j7FQQ,|gK EgUv5No +*|"ϐ:8[ Uv rUk6&)Sp 7ޢ f ͣ2>|k?_R5fX*jڌnWnk\>'D%PɁv8Nf Ķ7)jYꑪz݅]+W"OIP3ĚY?@/ Y(>LBCazD&GL<0Ô%\r2/vr Of0¥DO> HbeyHZ^ɀ _ij z0)q 蔉 iEbi&#nJov⟚HdvI>BsNU@~;u>"k.OMygUˉ; Nt*&NFlSjBEjN ,=:v <]qMZ07~ U!q +RyN+mf*ޛjBH$jA@95{[?@2/ :;=fN3ڄ-/1JrUwFdwaMwrl`߳7azBEO5ECHQBZ|փݙ_s=ooff Ꞝ0C6䎳]ONASx گ5(}O(h s:8V _,!ݽH Oc!8Κ׶U ;GgDdxn);mw?gi&ZoVB_v#~YU*s1DF+=g'A-.(~w;|׆hR$hCSuƟ0%oB5ޑ -]WI XovܷڹۅIB ˴Nu~GTշ`9l %x9-YMJ~pr8(6|+6?ӆ5$ڛM)E@(7VF:S`4rVŠyCw7I*vCbOH)umk .G[ }z,rARiM3{fux܎GwcÉ階 'v#jp Hߓ1 "Na P\^ BghL Fzp^5 5[Ǎ/|*rQhv3M]>1PKg>Rrm*Ci<^Wy|{C7ٛ38 0Shsy 2g_g=d|M"J;;,V=Ow$fnQUӰ4LJޱD|[6N}s,xguˍ!w= Clx<|r;Cu4)U$}f7Bd~ȎZjK :T)~ɋ9p{FxTղA s=a =4iq f;D6j_?4N\DݨDApܑܷA-{o:qqԒ1(0̟[j=5)".gY~'Ues3RQZkd2'I<Ь/J'osiQnǖR47;,뮇p,HS:Ҋq)<..=[swb8T_4Ab4b{^hE..{MA bI#ehꔠ Y)CyަK%^^rx2|>BP_YNj|6S-;,狴2TxhTo-XU'VG4L T)Z9e=qE+,gCw#4Q4T㺍.bdEk' +p8͟UR"8fR~~Ky$ߠB+"7KR $JKӨ*-$jstϞGfcF>$bpN龜 /@z_Y6R 0NJba-ʎ.;aB,Pvs˝;B`{ǜj$3-8hh k݈3M!D{sYa4M/ljfd(lc ?[bI@ɥP ɠ] &ߗoEEֲN /@$82!TPf ݇S@̬Gˆf5 6.șVN;{sx]FBHegEŽ!Qy&rvAG4\S@3 $@B++' .~)%^~Q\˹TߘMH2\[)*#tŒS>1';frZ*N'-u`ѵwz6ԧQ=hH2:`=[nōq~@;!N.;zKK]^b^|o>֢m(uC=nF-_C%PTQ-o8COaN+ Cuhu60Et<h>!w;Z Q\wk o1P(,^AQ+s^]='Ij  pMF[8}F>qMA'۱Tci^G% '3'|fypew#ؔMx/ J }hxZ_δ*mg0c.!P"Rx9a>X_HI4~9q[`B}R;s?y@q sݰCbRYvPm;-{Tb"`E'^a8ZEr'n6,ʮ%iS!`g QF9=sg=(oxVye}xoN)>yPN( 0xp5^.Y\@T?]:͈rS  ҡthsIS!hd&D.DfC[$/Jd\5;{wx _x|"VaB`1F?}s7N, D[@ԟ2 5*T$Z{g( Cft PxᅱvbA%qgݏж)ikmڱL+q~xw?XGTsol3b]F5$Ufs-+\ƹX3f@X/gRw^ؾw(fksTʖhƲ(+""~3).{:0qBTDzڵV/i&ų?HU+Gie0=\.a֭2LD>S M^+azuDA~r~zPpl})Ֆ?u`qOWn: "7a61FG*R%k?`r 9 iud}Hv/;yP [Ez`^v @|cno4ld_l`JESv[ɼudktZ06YSSh ߢµʧAQpK ՅaT+A,<=e0U7xeN1+g)c2d*+tbnAq_PNFk`z$+`%[4kxuXJrZY8CZ2W-ʂi,ldeb sfRV`U#bO٦r"zBrGKj&4[io P٩pbIG.18B׌mڅexJJ`BَDiZ/dՊTJwjWXlG2}5gRMsy[5?u%Xssigܟ\63ARs@K#];АNKN`鸸Ph0Q l-ܛ*Hg<z1>KnXȖ"%Υ5,"Eo w/Vx/D)R%u1ÊE`vV p9N~vMv_jaPMN\d8pfA Z@bש sZ)r:q5t~LȀ`dtJOYK`+*7E bC1wDE}BT\t?f&/Pr vqkOaلyyoLqqLeZjЊ0Wb--M J5D-^ ׉^lތ/I8͙s%ސU,q-7VXU;" sc4c?YOCG@pmgL(Ty_Qhvx JH\$G W 7-%t,v`aj+ 8Wg;0˷fFuwk E9%k1,ֿpxԅ) ݦ!V4q@`O $FA=Vئݧ7\ËiC^# ^BvZ`] p?w! RYag7 gxQNBwF/oN D(05ny8S34Hp/VRȜ)eaž>RUICdž$Eĺ*U1) fr7#P% Y$+תPoq%1'RD$v ,[JmYQMǁx\ZG(]i_^ggM>UOf; nO M&,BPfU*7PKhC\6I({c[Z"k# CVi<\oWR 9Yqv-'[+[g͂ K[8ӢD `&RGdI|nb .`SħB+ГBo;usԋgV{$ǴK`jUiA 4h`ٗ?u>Tm7ߢR&#{q%:{~k0t›0-A ]bN[T4uSA+ vDfhad,h+Im75 Nv%w(.zXۉQF㙕k5$+۬L-f:R05LH%0]:ەa1:JJQ0@?z@krg[E:Z`қSאHe 5ވlb(g@NOO= ̥WDz+eoEZ`3yTe+7uO}iĤTKC w mIP)edܦ(5g'۠R$9EΩt*ڷouFï2Zƴ@w޷=n|}i>XK@ ;zEED쯠&H#.1^OW`F663L-ܫǚܜ|tRmw59H59"‰ Ǩt%mJcr@n/痺e&T#*hoߥɂ:n /VPAnv(/h2;Ǩd_l= (wNB+"#H9CSCrZx' ?{(VbX6Y3m 1V.or$lLve;&Γ^ Ii;iEgS|!3kJR@Tqo%xrc;BYq) ׯ9Hfj9ӓ!+Y,F,j$iB_b(u.MS61sUH xf7 4imWf:!RfWՒ#gl$pif*+*b`ڏ?>-׼fϯmkrR;LPʲmˈ!"U=rQM>a/Y8v##)\,E b'%q8K~pfY'k-W.jt=l* .n$4py >^`LtdZ,Y[Pו3ay_fw0#u/U{D)ïS\=qPR NX&`cOI +aM˶lvƑVef/X'fYsܝ%䙌˃GT3Em.b/A鶛<,aD!RSu}B^t@ Jۙ1Ӽ $Cw`pv.+xMU ٩sK $\M: Kz[c"Udԇ/lޢOR!.!/MzrAs\A.rkdr=!d!ΪgUT5g,hҗ !+ dd4F(yqkR |~-5 !bR;N2I!HwÐ$?H>C5q*6 U,1O\e@j:.nI>o`9۱%gɚBmu{G%\#\ /ys߸!\ǘ Ldږ&+F3_i R?؊9e87gOu|䢓WJ/<7@>pe7{(ߴ:`ەk_RZs;oFZJ6htpnWaVb 1#W2C"1d^U‹OfsM2i?r]gQ{=lw= 웍1Y3oNm2L6\USZ V U n=AP ^[rE赗c Dfq'yzX\Ī/No(hЖqN4|ST&Fe j4pC9Qbm33351/F@jqW.Wy>(?輛S?9g"UjքIVѬJܦg/'ⰵ Qb9^e5dɟrV5guZH? i;~T ('%n"+ޮj WX78id>a Jˮw9 Y_-.aS+qWx_q1;{sZ4YItvGAZ$˜Di_UHɨ^D)}uCޥ->J4x$zu/ X7;]QF[uu&լt~J)5:-[k\~KJ,.R(XmU&G%41e@˰6mc*oMپpU+{ _Yorq `lOtEgQZX [۸V{Ѽ.ižZ::Ƭ`d{:4X.e$ebm*mG yX3"ȕeĢD~q.I ʞ=2I>rKwA5a>2` X!aлv,SAț@q^Hc]b dCA2B,empqXK% nP}䬣 _1Y,QG=f*V303`K5 B3|<րFvy-eP?k!QdHdqIsC2QE`&1qV2Zğ̠qL -gfj1aA2<>*TV]Ցȴ8'2+;YK:%B>DD_(%↝i#oi ͪ^s h?tO]ϚRhia1%y)F1ㄩWgw#r6 VInr pRC\],h/PBL'8SiФ,,<<43u7mʭGb2»Fh$I:Š̄?H|R=.k~(4X) ׭m[?YhL;.[]mj$J\PVm?5߮q]74z/n}|W )@K7)BM}<@ b8;MNٜ˦jB[OR&%z=U3^}RaC~2vCo{l'hrgeuZL [ؒB /p‡I>Wꔇm*C7 8r"G -YSyRNSmVV*@ͼK) ri#c7tNUloFcH)H?)7i-F3Oj,/*BbT+ooe5Ѳ'mc &s 5: laK(@mt/t?Gz9 xNq1)҄I2M(Z>Vz~ XE)z]s%L{/'d [l@跅˱K$ ..@Z] t-v <<Е~>7_w 25m>j ( .fQu\r4( '#Cs+䵑}%G)}UrlV oM4La Ƭv2%Tl4"p\t0PlZ9pmښ*Oȵa Mфӳx357ޖIF꯰|[VZ{ĸ #3Oē)SXN=& :[NlZ IK{*2ɵ'.IoQ*WDuKs{bl3MӥO?)݌Jg5 z% )H.3Oa>oŕ) 0Ιm`HnfOv@Obc5e, ï?H4NL?ORfxyW c4q(h$ԡ[k˿2^k͙ ~O@-jepRzRlR#+) ŝ^^$F3SFM*op{!`HB7ڝtFβ{)RLRө-ɴw-PwpalҮ􄎒a%-(Q(DH<|Ԃ豲<޾P.{X-Tvy#H6ȺL ֱ#CMI[W?B+z몮zãr1D-RO]Ax$&iX )-jN` ~}.N xe;`Oҽ9Q SJ^rcI=Pfh˒KdxOYI=~Z 4сyN&I[5HXiٖeNҢ#$;_CgR#Vl* vQ5G9[w'ϧ hT dI%xW݅ltoo~F3A\X=K`US6]\A (0[jSj,(55}p:mq7rpC 1np 3\_ vn#kJnsj04t9ꑒ8LJ]y-{2TŖ5` ۙc z;߽ZP'>k-1F, ,IQ4 m9IYd7YH|ц B?ގSoBMw++oZvy#T(W~&M9hοSތ~)ȬK07$lr#JIMe$E`h?d{B\BB"=| (R;4c@9x,C qzDeD\V?\X9) Rror^"hImk^^|v=zfk*Pl%u`OV ?z"?v|9bT{~)"TZw.C׭bD/ivb\V@+ Q\Qt~)3m(ں1%8:kǓ[Y-(M@v' /0f=ě%|b|k\Xݗ=̅TVD șIPR0@ѣ#."Y8Q([KiM%,y~jxr=KϚ㳉녚ъFaAJIfXn+0]aOFF 3CbT&#ۈ$+#hoc嘵mllNk E!_v)~iAǢuحt :5i揋n;kܷ_wٍRWR 0-(![P%|Hg1(] Ӈ!$QZZW.R7VMMoޕ򠛚bV>'SԈH[D3V@M"=Sٙr#ن"XҚ.ܲ-$#3tBǑJi>] kʼn쓺^L /-n? z(z%M_&܂ PY D_6ū4 Nztob߿EGщ9>r?OPkb\\ C^&;;BM :VlY m>:<,Knh큪{ԃ-;Q3h&Bj0\э 5hֹi^)b*CZJޯhiɉ_kKkOz-JM,~MsD;{dCLaK0QM$>:2PY%Mt`-pm6v\SMzYw["n{̙cSZq _;rH<pEف`"ի7=L>*C鞆Kk(u[h=01hY?y@$4i6WsZt 7ʒTqi#Mg֓AanA|qB/O'o?B&cC Q%Üns!oGbvLqf1(7s+gZy#^0I')LKD:ހ$4|pvl;E( 1MBbFP[4YNVL9a T&5ݛﵰS{kIySn#%12GVf&fó!k5Z݌Md!s0A3QJnSgw:G(9Ô\VͪD/ 𱇓7I2?y 0&tTcItq`fŹ7;MnS@ƒ4h-+_f:B9c <YJI3CQwQ9'FcGͳm)RcE_ez᾿A(l(swQAtmC1!ASb:c)x>uܩA@g+XáQ֔FbIw$1H!u[o((8Ⱥ·T|.OChd"IJ5~L_BjDQ |QcږO2(Vg:X7461 ݪ~POmr }K "hfz; F3SP$S#:kxR˥VF٢yXˤk\ AٙQ#ވ ƪLsc,O%YCrȯ#X"7UqNBꝐq|￶y[N<51"n)) F=pOOᾃE.ZqmŚ" -zY6Xk̠Fg],P`?-^|p& w4Vջ3ӆk6Mc8!.r|H%5HԱsû^89SfgxAoS4d!uRuI|M,r]&;4qN;6JBvfoN|*`]IY#D/o)aKbBTf*T- q~8iܠRUE}N*06ޑ..EzGl9-kW( ';?|j,5F=`@~<^hM38*ܴCF4^~"R(BGUaBw%8j|>}~_ Z: eSLJnWT:mA ~dk>Dڱ{}i}SWU>'x"`ZzDnz|>Wz90*m3{QC)MCti9cKrm!)|wҽUmiO`e ;;( wAY =c Ug.@kV*ӷ eu)y0+D'9*Nf 9-^Aʺd鬤 SԹ\VFV#c5ݓ\~_snĵȏ`u}6˯>~$dNܠ,M,=|>zgS٧;؄i%s~A7]hoy6U*Y$-O$d]Qmer{{:Zswywi_B Zh>"h}Zr? \lƻlU' )ڌF˶Ro{]"4.U ċD^DDŽk5T%нZыA&fc^Ҍ$,aLv0H͇b3Rp,+ 3zv3BžMiel>v 6G4qYjvM:CvfU"%?l\AĎ I$7v-H']RGoFD;=x*wRa;|9K+Q-HxkO@Rb-< ٟǘ}^9x›y~fmJ8f98} ڛΠUa*"|Z @TG^!ƎiΆyJ7#c7 *xfIp~r|W 'i7/\`yy ЬC[#[mo_G\-e@/5Dcq j,ḡNq#[vGLd!),T;4i'QGxy+N%=T]BCǐ"n>d|>ORUU)g5N(#\^zķϷjpJ[(^tqgNɾ7ˤx1b/eB~u0+v'x9MK^I1/RK?GPۅE r戃IoP=/C:5O.OQIh`A  9fS5 XHp ~W,5:fEA 40sFKz2m)gaf_ Wq8$^8:qMB/r;J@J~2qAqUK5ŝ5y_>w}Z@gU'6uLE봂j{3T٭s(1g% / )庳]dZ\0ώYt:\P^3oKJGpa6zv_6{W!b._7<] `gI}F'ۗf$  rͻx&fiA5Y @pRqm8Ved F|:ygUwQNZ& Eu!@菮*AAP("9a21`赿<}o[؆ ՠ]0G-,889I#/ Z^$V˳|Vòf8eܡl{E 䅀1F,Րm$bUQ̢ޢ9 i%Kj`{|> aXDd{RR¥=mWhpP:ie ܢ dl.ԏv?jiXe2.Ž3;U(:/PA q1Ԫ% u5 ~ԋK'X;Tb쥩1Y{A"ҟAi̶ (6u.qW 4/U5 < GTST6& {_ Luހ2! r >G-GP.6=9O #Ǥj`D h[ryM VLe"!4L+Z|o্bʐt[Ws `p` RBG ,™H^R\rgs{O{kԜ˲Զ#2AP,YClXkbfS@d YQ)wRپjNBbih6O^0?+!}GO=lpXb`7]/+"#GC)5S3S :.k='ayVNR8fb+LS\}J@Vrc@|:҃ȦUI, O%Tz% L C_V]j9?\>P(ϻ).W cG> }m_{ d i`0πo|R3 G::9+-S@!DR!P5b|\!%%89sJU"I0W#a*/8g t6M j9e^.X O:MI8 2Ƙ~}ӉO8WM#c%0*$qUO6WdGAgᖽ _׻^duj#<"- =#^LFY^d(/3Bv: :$$y9AWw` ew/-zvmtc=ߧz6T'\? t}k֙̀ i$8U- QN=\O)|E2hXETc4"TDuôx(n9.t?X侮MZtˬn #jɫH CD:/DKV>iѢ $յ[6E:?K) Fj)gTcV6h-qGX |ҰmfVRycuEu |5 (]3ٟBE()|[L`ib"oǗ⨓l|{8O'}RH)EUkcpJQs~<੩kc` 3 U[MΡEF} [XZ#eH.Gt 9=3-gA5^KWYK2_|negF+ mkq=#ͥzpB4 _N`ضqz&#\hR:pVL4n uR˸C );b+M f[nhL,2_]'Di?ś'&UuV _Rܜ|iQ4Sob)S%1<݅l%ŃxO&!d03PiWoW֙NRIqX5ǣ{p t&ab+G4'ڱ| Nݏ^[8=R}Od*C5CK_ArPȞYKNT?;bp. 3gC5+3%"-^UZ, J]P/-~:tĪzc0wz >I:@~ÁGby3v_J#Lag8# RVyz.w߳ˎ8x^ SX}T0o&Z(lr wo($[^P$C6}mB^TADhB}I6vhjnGݭ%j23Tۉpz:$'Scz׍bɴQBvDShbp[*vgfa9Vq1ﺮmV1+v 3!>`TI W/l% a/6c :H\䫫2D[04hZt`%Ǣr^AL`S;a"x~=-b(Iu,nE>븋`ĖηAK_e(juñx\7?,;GwԌ Kΐ H 56hxK˯VL}In3!"-sÓ]r:!UX?Pd%S7{MūGDnDrP![:--'*?ȭg"#y[$ z=!wYظWTJ,z ^¨P4#;-4@U~]$_TG3XaχFi>h5uo3poF̈V.fEW,kdw=ZRm^ů漫?e{PUzJgp湡펮U287 #a telRu \;ı_Yd ;m lbN ^ QJ:n]K9Wʒ72Ms]4S,%/],1a 0NK5նמQޗQclB- 6&h fwW.fعQfx`?Wd-bpz69xrj јx~4Ed_q9d۷M:`K C=?/jc^r 7FYV;a F n}7u>Ě?'X&ɇ)tZ2>EOpXOIo,"@} eu;ӴCe#HOڟ{?Y]"~`E~/ ٟk,cd›svz`n/fx:'ƫ{-7i5[$ V6EItSڧWTBVk9ݼ:~s#+bw%%Z7e6h~fۄ`Ǿb =p~by>Kh5̑CO-DW*sŨMk6o? \ńJ%:a5t@\ZM4"!' ~a":Jk}XǺjӄ S10*C q-$!-OqVtŒK+(obXA_VE. %91DۭQUigP7$^ru`3EP ~xQ֠{[Pa᳏AS o{/FP݈ )/ź.h3.1=)!C1u%ˠ$*el ^Q.+%ct+e:3~ ʯlS5Bv.ݝ)Xf"=Cz׈XJ3 Cj~8RΝC'IRq>F9U 7XWao!LGW؞ %& 'dEdN[:*K;߸#B"c)HIQni<ĥp%n~Nt]{Ln//ok1D2F Zk1i*7S;g i:D6 z7dFtR:L⥯Ie]#,(}8q:M5_Hm7`T&6%S\5Y`@sq)2Oɶtygy/ǽQ أwM<c3sIK =9_ԨDYp8Tj^m\AP's|iwkxփFA[*:x5`]o3a1l50 ~=HNN=^D?o9|Y1ДFZuCK`3]P 8Ob +(\~u|!).`+uqǍ *vM]B P *؅ltcxMW<Ԑ!41=2R$kա"bt_f8ifb4h`TA+{s}*]·,@DSs\Z>}z  a綅rj̶1rjh}̂');Ȣ5=)f 3^rhM.9'W'kƗ" [Hv~Zk}ȅrBukD Գ>gh||Are>N*iW! #@ ">hJʝυ8燤/ $p_nZQsh ;$ j[xG挗@؊y \D]w䉻"MD3PTP0nt7{A_Oy8p_OߋvפэE0c{26klζ/J꼳-c/y;'T mܐcy;pݾMd +\+%xsG,4iqH~&8ԑRΝ(gҁSd}=A-g~dvsa7xY?.iKo]߶S|cDbcZ/l:/(W;_+OlݣTP%YX  BkpjlK@Drhpy=- wDJ qË Ϭ.{Tghm-KWH|mS^38:b}(B0#w݀]'@n^mC9cj*MtlR0jT Cdr:5 O u|bVg,iQomTQVQxyA$-hXO$#h'uOjϥ4( ','+HT Fux~4()s͌,ɻLIɑ&s;7uj v/}) N̶P4Wtڎ@?ɜ1I0U}?;{1cR:_Rq=dЛꈷK]$'*6;1},,<[T#<V p@fJ7~ݹ̃ f[B[&MR.4#r 4q"<Ԯ)J:a/RG4-Rd@I)/ B5Wj-V\ ^VZ]S3l4;[\≠d|r|QVcՄmDG~F?BVlkz}VhW7_ y `Xb.J?zG¥f1NwVl{|吏BeqnS¢\jurR02NG}\s Vr6j[mqҶr : `_/2 p=? =̦8HH4;H?3:YQ9ԟ;ʭ R–=Zv&e0t 1 8SN#9~Rƹ+;)}z}duT,/Ԏ;ƶ'DYjGcJHkWgQZg*F9+"(1XإNZEW}t8a$uj47eQVY=N&9Q}g 4 b9q'B8ppBҊNV%+0=wZXˎW;Z(W8o{n󲘘OO@˩]6,3fy/(f.N 9:]ۤ٢0w۪'!o>&"S6~&(" |xt1l$"<"kAA7QGLٔktЇ 繃Oq[_l;X[vp`sڷ\ Vi/E#7&QSѿ ӜVz;5)z= %D‘o[)[j1NKT(EK js9OG^}%TU7D' ;u$rLҰJt$&Lȩn<"G2>{~^=M<^hȬ[x4$]a`|0 ,͘Y=F1gv`( R>8^tqX| xU tϦEGi#}W,ߠ ͠ R3V'џ3m!px٢5c9<-. 7D|lMROjrQnw/tgp pȽ|[  |x6A Sy_NrՃMF8TiUn!4/73ӡ屢,ɼNgO&luӧ) /*F^S?^0'5$0O ekrR|rll4Nƪ' ?:<.g=yd待_MQoR`'"J;w!ÛeL%t٘@eV P/O4u;rW /~Lы݆&8`NnklQ&W1`$GtlHoWt>cs}-#݌A/}P}ݒMmR3Ea [<R-l 7⨉[=i蒐uܥ.y$pn/*HZJ 3 "> ur"H5Vk02-RMk* "5{/A:"AkIHD M8Ԁz_Ė9܉L_+QE/w.&P͒TǗ[l߲Iuc \Hm[O4`q>(} ecnPY}wKhn2x_*R`2q;??GI9"Bx+xE#:R`g9OYuU LO SCMS*v+Dh*w%oSj h @~Qx@SU~ {MLKx;[\TN"ªnE8|wBvwKαF!Ӛ-YK**~UJ;^C ν^!qLE)CkpJy)L 9.hZ!c4ƿ./bn aSA&%61t{eaŶݞd'Il6"pOzH^#E9?P XVc_]&'`3a8رCW 0H2ߕZ1*))w4nN v6$Xm`4Uu(*scr6`se퐇*J%N>6;aq!vW}vn~zcJ6{2IaEAvP)P,{M$^ӿ8K*kAL !za8R&ex Zw|n7V)\fwS/lo`O k%#-wJ]y$uʂ"ɏs͌5XLѺξ 訜q`@c6X߆NƦ%H~L%+ń竏&Գ96 fw>ȟދu\쀚]x#,f!-O7?b+cGg_Adž"XixDTE#jQiX6K0J?%ӯ+b%gY=m|DWEEf9$t!WaHr7Mt,bъyjMǧOVv6~֪ZK6Cʃyz*mpX#%&l`,Gb}R{Z"Jn]2vlJ1,' A P1D NA`'і` <¼By푱#".p$iAH?õ)Nq"xPOMS :^m,# 5 ySoA]R%ұP]hpp)?$]{1st T،6|wPgj"V$6+kqΞW6jp +K7^X"ڀu2. g HvSٛۆebU|ܙENuBGngÀa aXxbt`R>-|ʵe gQ(oG)1u@mnb_qKicˇ7UcSs/̀ 5P $vhO%Zd^-Kl3 '5Mʚ Ze5v7%ɬG5ٿ#h]vdx~)nAֱv7 sRr|MD؆p_sizԈ+ .D }?&(֩LKoi'x%g uGa6 8jq29Y(]#H\h(:jArza܆$k#tMD;Vw/QFw !FF[ ۀ2ǷƩ(L۾_h-}ZC pڞ oʿӸ}[w a:ǢCN2[d͝z7E D// F_hA$D*" 5aJ18:Y~S<'B=ͅjW0 lL+bo Zá?%&aV…vE3QߌBZƋp 2v3/y 1KFc1"$~Lͺȝܝ[r͑a=UMϙZY<)Ёq.nt<9;HwZeF_k:0ҊltU2;xz&'$ v l @Q*Bp彫XEc⢳PORc{RĀNCcW]5E^Yd֩g@ ,LY2l {x\Y-0pI:=&TrG=ۥuFv2cy?=iWrQn,y8.^?<.@B~FT#C"~ݶ2Сo@^fSμ4qEBNӌn31Jp^e6V3 aM|cq\7BYhRMNU-,s$_JP%7)ˋ;=#6e.9 3'E_FYש"M[RTwxKz%hS'[md;"{6>mʝ=T6]ҰҦ!p 5: ;bR~FC%>U§Ք6+Qb9jFքlnʳ2S]\ۊ]]Uc(MOQ\W%AE1W/} IܯI\y|l△vvaΘ`!MKVY՗z?dG_vqf6KWsXۓx: m)&׶5Y| -p`>XrϾ[L"zշ( И`_^F G9\: zU`t %B\w($V D$##v.7#ws8Xh};uV|>.X<%LaL}E<<^W3Y=Uš5Adab/?te jt>ܓ>b_9M̘Q7AP7]>>,,ppb[9-D\. /dncTZM.-uL&rʩ렱y_-5?Chfm5`3I{B73*,z`PdZR6Zc\P}U:Stt1yeRUwS&vjC%LLoP8xvlg!NxB`>bR`{B~gk|%ɡ] 65-UZ\[wq73`N\p}n "Ë@Lw! sx{D|;SNcS4Lihrj"7aIزD17>W:,o;똶H׻Zw?2CRk}],J\]Bc3 L6vcWG9@8B%Ey<-瞘N1PE10<б/h|RywϋUpI5Iox2 `wX۝,#Da090c`Lq&̐իEڢ/xx._D?k)" K'6> .}b6F4p.t~`O2# ]ӧJ?dm?Y[9i>IEǪUh,P#":H+20m7ɖB{ȑ3WgZ&h&9ĕqwu:X_O%LDz% M=7M|S ց>I=Wx0T+f[@7xir)n/ҿ ;"<2Kᱟ3/nf\՟ ]s]q)T =f|esηF7oW=baz:R ҄BgM'[rq.>O8nІf7t;_I&Gr/Y:%w}tqW4ч)sBpiҿގN >ߺg^@\lD\ba)j[fXKue^<dGu 4w9 KwYlzݝOk3vS<۪`ݥǮ M:nGF uM\=(+ }0v2o4'z3y̩WZ-FG9F{&ģ8暴pqkw`d]o|d͖ QT&pΪt <ʭؙj͛"]}K㮗أI: h==Q"TpoKNY[#PW6|JZVR~>trN. E(V:Aun=K X>.rK/sMӛ7VGwsaku+6*qiFwR֖My)NճX#s㬴Ƌ1fLr啸)> 8JsI-Y׍~\5*g%K,Z5=b9H\ s)4l+WXѢqFG<|6~JRMwl=> +(h<0'fr: (_8H֊ʛ,>Jw+7U8Nca_Kz'θ4-KmҨ*L,HQr-Ql! MUy)tM:k>ZʯjFI~Rk> Fo/};6zKq%aOIb- ;p>|W8+ü'pozY䭐v.mzoMdWYce+v c\A2 ̭ytq[~~tlr&2[ڵu&>PB^d]BWuI1~BkTy@N{d.%%PBzI!C]į덓3fR%?7h68Bϴ_S[.3 %<r C1H@<]X^dAP4T'ni ({g n!x!fK9S"TC>R]Rwb2_|s 芨hfĿw0ě)B!QzUμ_ /<~6 F^rkV}7G"ֱ@W6+;Sp9JfZ7y ;@O@wbQ>ub1)+Snre:?)EؘFʤ'zC-N(gٳ?XaY4}Ϟj"\xs KMǮAQ6YRͤqwZ'遺G' VQ|e[͚WSǒ}*i^|JΘ_mOsF[*d_pΝ较I!DY(% ZdX$`Xz5>2dr>L_pB/o 2)c18_h[0cx /3t.+޵D$mwS ,(.M>ǣhv,ׇh}3BX־/{' dLT˾i-,8][Dmˀ{i)#NRɹS.j:@ď˫( P,mǮ)E+㎡&AͲVtYEP7M2){cZErZ -7U+cA˹t?3(o>jGlq)(" *@P"`r&0! tMBD6m?[z A7 [r<,8URKţݡ\qmAmDS"}^mY{Ŵfi28xF ,qI$̑]Dr9z0|7Xt!Ye#a~1]֜iF?۬ AV'VmdN`*CDik%!}GxFtRs8)x[*Hڡ s""Ƭ s2}d[ PIдD0zRw@,G9+ 3 R"4qosɷR"㻢mICy'鍢ur#46nKւE-xR&l3Gy-uDhj#Ԑp"$o d{iёOV/]h*wM,,uu-_Z_b2ꊺih_Զ4>bEW#?N"-3XqTCE -H.R9utE;wD5JVw%M4 1\y bFǰXjdR$[Iaz]KGL^ynF3]^DWPzD\+[kr$2ԚTPLpn`uD7Wqfɋw$d\XmA'S:f%Cߪ*[)R0]jPDb=]ZrpRLs0e\Ctqd5t/َ'6w#y N=yÔ+e BڕQ5l@"[?յ3H8U[ԚOUqDMuک(%`x {vVT/%t.JsX~28] ? \[=(֌_گ}[r#ք^Dg3۵B$DA"2$"z2P[efrd/,YAHchH3&Y(P֎9MVnQ2K ;/j/ch]g'iQ 2GNpDžlP.ghq"fA`e XSʤZ}3AOQqp> d(A4x.v /^DZ18Gx6jt=iK;SL;I_ƈ#k'!z\0:\j+Eid=$nO!6Zf}00H<~70C dPUXNWv7)!DG`Cy!BՕkuP8E; JE)7aK?A|1~t}% -qqeTDGqB6NEY.0c %& iވ1L5S"it}*ő#^?$N4sO@/n),~=O$,/ ĨglO=f;.rHh jf/X՚_ N1!xѠF*xf> /lƒ5co!vW|$T~'ꎖIa0xҚOk#)(;vK昼V)Q@v% -MZo;z4whz5Jt6ΖAr*+VCr<I#7[occ09r^T텊'a{] ncHf/V!#P}zRv$/Y~m4:`zQy/`[f\syTDf)).P(HDu[8Q' =+=uTB:®ynXp v@)1Ȗ?5s-,AYۼL R+p?crpM=/BDeS$aVf0k30_o?z\ D%zm6RaZwrG?Lvk,VQ@+z@ [YmIu{(4, +D`ip \p_^^Q:GޞHC#Jp+A"}Ҳ&@G}_TGyxN1u<䣀9iqi g(뚲07tՊ1[G6aL}[wj2뉅8s_hKXrx8I8}( h=[JZ1*-uq, Fuấ'yt/#SksY_>95o?gpxBVzڦ,Z5;d, \j]fq@䢘S ݟ\iL(S gBڬ>ȸNxщ^|C7S|& zN1-*x&)V"ҿrzs*=-a ӷ\"yc| aflJ<-q@Jհ2za[0rxwxw6G o`]kuLɕspDS^~Mcܯq,ON97ZDwYc7YXM2='ʹ`v]) a\uoy\4aL!%%7"B@L&bcJx` xp#CS\Haozck㘿(V9j5-Lw)5v S8МD)qh #zM?m"D_wyZa7w{7RQJՂ00d}іMLfFk]r}1A֘0AE.v;@`yũ*§sَ0[(CfH1rvD26ZKLFTaŇC"re=cR$ Mj)!>DՂiNc(߀V^Wrh0+a}~b+%?nBQkE&P,oL8 ]_ۉ)?cpyN%EKHDp  qkSW˾Fu6sEh>d+&QSc;tJ R7A&(eTy~Q];OƧM w{ $wuar< z 0cK ٓA񖮸HN?2.p?Щ@?NKAnsz[ < ~\YPB*D͢_lZy'ǭ@ZQnMM!劺Ib䤫+RKCA)e04qKJnڏ]>䂎S 8(%`"mJR4(f;wo2Bwmo*rNvݨՇꒌ0*OY*%S?{YFfuyzL[ R>f;(Q=J*gٖMӛp9JҫVR3H ύ7z0_.Sp%h:5~sP<`%<t5Tl:(ZL+m Ω_Ac`&ȟ}X'P۠i4_ n~cYui๰g |jۭ >".^BH9DS 6_ OW {>IV`ꑶp7g1TDRgXi.6%6&y[I7#&)Ζ*+25MC+/!! hd8`6X`;ٜ,dжuKF*&X~kPfӇ2|^[TSp /Jl ge5u 2 -vlಹ7x%4:e;fgQ2;K !iڧ4%ȇ%BokYOC-ckgozp?р$CMJ㘄bٱw& ox.K[N&@#F\TmvUշCJ&/z ҌsjZOŃ:%B%+Jf[+bCi5 j03ѹXN[mBvi_}ʕ[ؓep.9LgSxJ#vў܁P)1 ?^i.'&UlZ0I-5{pFU*}/JQ"J%/Qm 1Njf/o;.b% x8 Fa °^cTps~yR$QO(֝*ohXL*aCS*ኤK$=gF=&[7Mn,G4JMD#7Cq݀g"ۢr`IJRi9 &.Ļ<6h*4Aɑ*KFz8}0HT1 u74Edkq&VLAB[‹ ig$`\zu?' UL[ePoxc`r RC|Y}9>R]u!«za8#4NWgspqY>1f*g$wtۿ&J/M$*+:Y5m<+[TTOm޶~One[X/uVXH@'G_+ϛq\l ЙelGx!f"©/m#CӌOj,䉮0b$oft߻V)J߹`vtQ'-v-:y&Ļp*aʑ BN=]|JvtDHxvvDDב;vC*W4rnXxbKvbʃ^L2ڶr~BDF3eTr HJA~yK8 fg1Pz=$fuEt1ǣ8>6];1 q+WLԍ6=jXhet0{ 5YqM4ѷPjPXl,i`a眯0wi!%JD7L#eXotsE(1lO*0mY>%i>҉7F2e H9;ʏĚd;^84Ľ*ڶ|NO)|kcVe$fmqJDb;LZZ/<>XC@1 `./.;["ho'q&11$_6s^BَūV2aZY'!wD4ӊ.hWȩ!lPo5M3w }L`e =!޵GGDtn/0 e'߶ GX-wd]~i5?2WC~NU9}df}N$mŃe1:.\ ލdo\.ƈ%WL7oRyT.yQO8ڶ~06lß~ ic`ts)kvSz0l k HqL,0aV!95&w<Dj8D(/}*]?hOn@՛^K8A:'s4ki0T4ʸ( J֨嗅w2tAPq ONM_ WvȕYjf W*p }ڵ"_p &w2 dQgwGYrzTѰ2H> y[7x"%ЀM(^8g5˱`M+JW. T%l3Xu y7cTuqN }-"sL[7cjߋKVac)q@2Fw=GCmu[h}*Py-]ZbJIX}l^y{1P+xc\ԙ[1 4ݥ&6[j+Iun'|2oB(=ӌ9f*01F!H\OF"P汝NpI7>VsMQ~lMi@Sc$\T-vԷ^eKWkz`\%xoks@~ ( !>HZ~W|OG =Ӱ0Xi{]ɬSiA(Y j{gapLK.}D"McǖːzRgwSݧyRjToi 2ٞ{}8'y3Vq#O*"*B"*HlʇbsI&&W# bT_Bİ.WxpAp43ߙ:1 -YWhoAtnѤeB\ Fj*,*elca?HCt RF|1@1x]!+5G:EX9 (2U%K jvb${ S O4i‹qV6Q͝ _}*ɨ/muXіBoc2pY TRfrh߬p G'XQ@D+ؠ3^q\r#u1e;eL{5ZSsBMwe7L6* Q.[ǐV-jzܕZ-p>:*6QTc@Sޑ|RQ5ۓCgl›*H4D"IU[OaE"DH/k{  ȵ&A㞦e*h+-\u}-WN6塞>8nlHOQX^p*A bš[a}Xamžfusi <㾠|d:p::Jie2^@\yO`:Ɏ/9f3"]6pĕTJT 9u"ј߯*\=8&x?k`s\;?B;" c1?)uxtGԆg%E-jr_s5=ebRs4Zd_Q_qOIKǚC2dN FmSoبhYG7\{^a|-)25u= ~bWq1з͵@!-ʮFBؘ&`g,C `**+=G]hlKi.::<2*":8} QJBꯣx1)iȷWaճPkC]!3J՛!_V5qtb)--+2w6D<Ȃ Kɏh-*B $Ĉ\z`C5J(ѱDt sWg)p̵9pS;Rvܭ3 V:!9@ŵ ?c 6 mUQP7&u ̡÷>#dL?xA2˧LtUe'RBؽ혰ޙyĶR&ɗJ4y"nC)?A1(Dș:MPׁSϾ'#3xk$}JPzlkqr] Z1JBbӮ3Y1!-+J mOO3f~2Tݛ}S_a'I\cCX:w!LaXd?"ЬMocEMr bHYf3yѡ P?R2Ї,]OxL"MLaqC/M'љ450=U?op˘&n)ՕYxNO^|^^zζ x9_͔=۵],U3lTY?dP|,r搢{g* +f;c߫zN<~io`VN bn8`jtoS{dt(xzU?fk]c`}9 4t459EHMCw}&Pz5Z(KU^]wHN#iaЄ͒?rqyP }'J;ʇ*ߴ-E˪c{ 'UNЇL{醊E6ԥT4o9?-ia,hV{^~Y7!Ѹ| Vqc B1N>b0W]۪wOцgui* r*tB, vEI+jB7vohc ١KLnNX v[$\sה}a _Oؕՙw换jX.eVe'~e(ǣۏn(Kq?V?oFKx7e#_\_7\t߂ db"Δ;_w6K~ݯK$fynjO a$A8M8VG:ԭCС2tMh<?%YNBɶ!Ӥ0M)$}@YRVw7(L/0F7a=cԢ ?ӱj@8:NC;D\PD-Ca J҅[OJwA&orIž Z݋ch "?\>ќl~7i!hG,t;Da /LSdp ؏=h} Ό˦ 4|F&WZI'US݁8|l{YTw;|3QZhE6o,viz}ZvW2yE;&[d- ߆F0 c200ZQ>0yPC1%<+`}9{E3Cw/ٌ2,1@km~jzt$@βЙ{!jՓ[n|WE9Gz^D`:h6ƬyuDhhS{]. w/e/H `V dSgܴvvOG.+qyWIoTTOo54 S #/ь֒gZ2ү<9@ Ra¤W`̥}lt~t0=4{*07hUc*ߜsq,DEg;̄}{`o$b?2 !@Jzur!2zW'16l#kb=gfi{06mϊԎb?uT84n1w] q}0x39qXτuZ '8?|3C}N/,|1۔>̵͍F#5itnPmY;¨:#6'^Q^բTznUx&ա5d0"XӄQ/Ee93?CCh[>^d=8u}H@DS髭1§̷OSJ%X'F p͈,qSŃ6Ќ:@"ТXZg"ϛhA)QU2o J8hUY,v TweKJY *[,1/";۾e8%@1!\ l9lx_w ^Іy!/as1W tWqQyU$iŬ~7aSOcaQSWV_u#mj^ACO0'O)?kbgpΛ1uZx=ET14^5ugX K@IsfɄ_~Ǩp+NA(g ľA N"=&Jҵ):KVvnSϚb@s;ja)r HhJﺅm\9.`ZAʔaߔ5NGkQ['\0!A"x}(hLu2 ^ zJ7OzE±Jbg"&b' m b\+Is:).:,c[Taկh> ) +hDQ1G7?xmn4Q*P[VOɢv`ZfY=WNt*ϥYmxH?@Q%Gʹc鯫hj3Wc^P+\/46u y(cXz&:aas쾔p4C8oUW47N7PC= ӎGXWg]ޠVԚq֬An*dj=Rй ň&w|5vƠ{| Jy+_:)1i"Я9Mu[1LLpa=r7B_JNTWA(_8jj՛dfXvT*Jf4I@4#IyQު`A Py'c_;\S(;ooVvBu+nU9֢Mw(-|"zWr^(Q&ƱP8gӊ)ht:\K sum sMMK;܈jktn.mncqRVШ}wg"w&yiǑ\3mPAvsRj[O#{907*a)nQ eV=R#]Qs\I)-CۚZF%:W\1xә aŧtgZXi@@mw1;bѸ (äPWu6%-HqpS2"VccX/DDBs_ Y-"Mk릻*Hyw\#C m[L~b/&8_(.pwZJI#Oo.5!ܳu[ =I%D)4l%{Wg6$^V5䈢Ma{Gb 󢏏\! dy bwv=CÇg/aDwNa>ZZ/,R} g7)XL^P4甋lZs*r \SPyUy>lc/fݹs:~0O'%hw92x!<<9~yYUqsX8@}X~a^w9t#/tėz欔,R{13`ݡd*}\6-e8 T$͊ɐ~5VRYahI4)=+h6\J%HV= d*\v Dn^I?#s<=S_BbZE7Ps> ȽWmDWEZ%B&F}8:%8OR 8 GYd-}[qjLOC _ ^}LZ"p?}jQhq¯YrL"'!hai]s@Қtqxut"tV3 Cpz9&nHYiefWݤ0xbwUSS_x?}ypZd_kڪ5ȷ7@zC 9 zK3ح $iT_]8]K*^S҇8`<4oi3*ײ@ Z~®ؽ,5N7Aw0wpaV&·oKpӊ x~p̜Up ,2?fU.~YHM3+rȆ9;7dОl`n[P6dp7ygxDwPC0.uq):hfBgs%@|Sz"Ci1(jX7 ڦ%E9 q #c 4r"Bi^d17>E; Kފ`i\ՈIdh~ŹҨc#FzX ĐƠ x!6*4R@#DYs]ǴR* t= 2 '{jߓyfi5ʉN4cDrК ]yǜgkL3L\,FgGZO[y-Rwu\Qo051sꗃqW"%T~׫OQ!r mv Y!  E9WԴ'#djkg X;,]4J&PƟfKʰS ^}vi,m#MgaNҔHxmSr\jM즰; q܊M3iXp[K iYnކYzOTT len=q XU41ҒK .;ZROZa]GW4}Op6v,xtNk-Ӑe=`2~K,sJx̗) ٤"#'=e{ nr{W~tI=UʛreUìFd-s,BV`#k&eJzQ7ëּMnݜ{EkqMaot8+~EڍAJ JY]~3Fpgɻ=:Vw6""iǁ,$<'E"Bd=wCG0aq[3Cnʧ+jAmRvn3zmqv+bC7;ӀV!fMd|Q&|Ɨ4rĉim뽾tb3C)3'8{D~"jH6y2"AL) oEj;{rkHrWVPu'7ɧ-aW% AZWc:F!1ھT_eBZk9=wct^*H OFk N$MRKli,("D7$m q(]oў {aTBsQW Oduud<̤Am{gТpd[Z[ʦnڶ`O{QzkRq1YK]"d-񏪻t$Cտ{-QmkLΛS49qZʤ ]N}'#$*nF/.ړh\4i2绫ZɘbT7Yf"z{6rIy9}><*i2ǵ?y!UMWz ᴜmԠyax}9y?ɱ@3K $WW浮9镽qqGEy.s5/7vj>d)#|-xBISHJZkz9>u:Bn !LKD+Y s!śmw=m;s) JтzAs̄ةyMCPϞ/7w7xө3 7T-b팛*<|PV??]/:Q4 ɢ3XDG//X?ayHV-MYZ~\6n%Rfd~B$ὨMkpy-m\s. ~Z69=1WžJ/\^ 'z,XOńzp)C~|ViNg̒B#%&)ZnvB-)RB N7nJAC~ 5-e4ZKԼ|ҶUY\JZn:LD{U{_~:t(O$3qh*F{ӫҴ& Up៯i~NG(;7Xe{BFҹ/wA$W,mNYþa^3ʵCM7kt/1.4f xݸh ~+{:;Ơ4,YKWKOV}1fxC`LaL8Ǧo yg=4Qm2)jt!KL A`–mgٖE4AdG9hvH?H9W k8':MF씀0Er溽9FjǑid%Śr]x͟2@FڟV{ ȅ`V=^_f,zذJ; ֈHOu{ !n\N5"vY/oDk {,u={5~:z <8Aid@m -tjS^O~#zT} 7T}J%O6A5΃>p*Laje'ÉY4?+_Udߊav;\P0$U8y4iYYoE`*)bkJsu_>|GDL&sj嗳c3 q!{ pt$wLj5IieӁo0uClًtlp&rE$O{k.&h֢@r1 23R\`dAU :\VAۿ?+L@OR,AF|dD֠> ŀnU[v/0& ^D|SO+@Wূ~sk}Snw'w#Zv<0.m;t}-h6xW]9ōyK{Q`{uddfdL_iVtMBn(! ;҃ R G.b@>Xw-sKJ^&֡ADpm*}SHKFZEW(sC,5HXuH ޲٧VK]}=_D+zt@wtT*AO}Is3qPc*եWȳ?wrz0m0 "6$־3"190+ck|t療%<]}o]IIu]2.~=M JвU˷:Xy?I)^5EY>G<t܏UNi$H& ƑC8lbW9>k)y^ zox;Hubˌg½RO`7 ?=ٶJS xN Z "{ B,ch1^j~nQ'8%QSyS~hktO -wP;":nGwZ^"]ۥ5UBf Mw$ZfLk&haClO0HϼOOca 6왍XC~ERl%]J˂ޯP$(ѻB9mo4kHÆObQI%S^yfm!Xyųml7"THݰ<" ;z.)'䤅'Mj@QuRG5\L_> ~-b!']tp?s3t|- >8A@Pc:~`ש;'l*b̖_&`RY'8]ZC[(!n~FYU ɴqYM{"kQRNR0 {m1¥i eɗ'\Tm_vO8DU䦄%Ӆ&R\6y(hjwΥarj$-ym(E# _uzF|?d֙ʺ#w+FF<#g^?c=lÛR3Ǖ=pPpzb݃ b ,t9b'濳R$/~ U{p+L;yh ՆI!5<$g3;GOE';8QIa`(9oqa+xgmgC 0Vn gyX/ Gx9+>w7buUbIkHb_֦[/iG(_&&Q'ܩ#U%wf\z2z0ꭘ%ƃJ@CJ?<K},6 e.`QPwLHt9/RJw#?KNb6U m,,qa aڥJUR`5zөSGc y*+IQ~7$DFuu3 h$gdp9rkSؖ}$%쫝Xo!嗝UòEk3UR#`+=%ۼal"@Mɯat6 Xw:jئ0X 8{ rPk [ (x@n4ނ'c]ɏ3" CC^*&^|LC-Θᵩ74aONnik5}] jHv.fB2Sdc~,-.a ^G<: 't'qOLa+mpԇ_he)D"V&>DrTakAѱuHAzq-{!XyH@6>tx;.# {r^Z!NXUy## :Kݼk2{b;OrqqB 11zcZ g>2 i4z^Hw~ * zhogCgȿ dsBa< :l +t}`B&&hq.)[%xN|>T$t N FQT\cy*my8сA`Pcb 铃]PbVXـ73 -pBAh,~DLYHP!Jm\qh|D;v飞"^QH6 `b3|leaT81J^ [@^lQV9EQ#7φP*hT*}ADBOH`I9w'Rk J{{/=;y"'`H? a&׿Q|KV5է2\}ș{v'G] Xfl"U͋*po6ҩ~Kn`=I-uG,a萳PG~2rANhrO3aE4'):(+ ++uͶ|4Ɓ.;鸺6O:&Kg6)?>6G=vK<3䲃@!p[wR(z~(lۉw;#I 1k=-[!^"YWcR:SŚqŖ[#uͺeg Og>3cr%AXVh6Y81ap3`zx-&цnylKw*_Hj .lHS1 o1TncȰ4E6cާjDE!٪w xYpIt.”8P ]6xHǞ`"RO[Q;:pbb|c Wm 0vYVʐ4|={-@_+b cBȕ5do^]G_3U~VEB5'ϰj,bLf`:WCp/TDih&hKC[Q$6<1Jyҝv8|;eJW\q02s2UG5g}@{<> BVBCbmk؝mUFFTSٞZi{QkqF,ɱ*'obxNP>RA}v7;leY |QJGe*C@#]Wo!3A!~W?6B(&:.|``H={]h<́Hא I?oyfaQV {[`Neq# ":qq(6NvefNNť-?v8Uf;p2L@`i3k:F2j`ʶzLoҿNkJjhy 9#%<ɚϩH2.m8t4&rop+u[C$ NbiQQfm-Y!'p#5/PXAWӱ$}Z32~F&oQ H qfɳ;s?7EE]}{0]xVhKa($1DI?~)Y`A'cIv}^D;K?V?PayCOev.Tlդ)8nK pVFaHOs% ]L.L}h PB…esV|?>|3 :p4 ַ]?6灮s~{2>UpPwb4־z[#H x)LV}b٬_>+YhRh0If{/VAR$4P>zlH9ϥlo), (r}gb.LydoE?dM< !w%Qs{PX7y>o4Nn69(.D0ݱ b\u_3"Nꑿ[O x*;9O yX%Bdn-Ng@~QcP՘q 67xV rP+$>|jGn^lQ(rE(E\`m%.`8ǀ[sfn?pr#^4.5%WԸq @?;.ԅc.'!B]Yjˬ(k$ ˠFMTH;2Rb]ޅo36!DP#yNɱo(nC{/L5i{yʮj\Q51`a80 =Zgz!khN}}n#x2*<\ɢcՌb٢n_< a$ݹ#Fcߘ  \n(X%vzHn``*l`6I {x(Z9L4)okZuմN:@ ŗ-][u\_T eco5} vgp!'NrnqcM׻ צn֋@!iydX dP7]>%_j +,'"y:I:lya'y!!jG=x 99.8(Ԭsxwbޞ60^zSʙmXO)iM3Y)h”2 d/_wĀQخ:.BԄ,#Y&ݑ(bqL4;w5*3Tg-he)*﯉aisPFOɜ"n5Df,_WÞm@vPv¥=:NnahO|N% ժzOL:hX M# WZ|)߶ǎ~9 H&YTSOΜO;^pKS Q1 w[zB\;.r!:vӰ]ϙZWWUcq;dNn=Ny~DI-MxW-6d˃$gxӱ8aSQ.F#'!-y;|jH .$Tiׂ!oo˺(!k|KMZ4*`茜~(G u)"I+3#ٔbwkvmOQvE{#uTu#W9΋OW|_,P\Q4†zn8'/҆=j*^gAYriܴAr={_2Μw6^^H?] 6A; jȴ\8r"e"`olu;J2ו@}x`@dzՐP8B!es'Fo"TMt͢a֚ǀ_S^6̣rf"Hs@386w-HVyU} R>" ? %\#uk&#PMz- GOHIjhބw]Yl430[ 1hfUVdpE[Q!ZmQFo[SCrprNǖ.W2;Jg?%DԫLPڴhf㥟c׭[aLhG2ˆO݋W:0.˖DazPsr4f}PS!݇21U"YHMbQ0#7ΛVkFe 閠=Knsj/}9P dCڞ 2Z0딑(7c z'ш#wcuS#8lԁN ΨȈD:mW:w 8"0}! ~!k+P0p&)ut>{,xuߕ&6 BbꚱdJ#uAp{^W@)N &8׮"}7oCa-c oWVCQ`"?p%.=c%$ڷ·nXuT̡̤\u"LFh&˘l#4MJ{fcR bgK砍:"4 ]QD# DhDek!ZH Sƾ3;<.̲l7;%* ϝy d4SlF VA5IW}o獴AEX<@"qYKqe"8{ u{3X&@ Nf9dz{S-gXSE୥&*<*g0nZ툽 O}b0*etȑ_CRƣ|i E[r[FsagrS[jj3#k /DGi (Ua; gB\>%8^GJ~|.I*Br_mB KUwj UzJ$A"o]dڀ}b$T_`, _&r;KƃVȐhJ)d8RhK;Ud4Օ.͔K(`%c;?5y\ uIC5n` ݵMcloX6&u8Η ӓ״"SeY3Κ s(8NiczW,$@Ƅnao;SrwyRA}hYr R`potdw) *(OK*?{V#ͧEAܯ JQ k @fQ {p~/DQqW%ZTW5OwX:ݖ[i틫s_›Rj˫)Me5+b 6sՑuǝ㩜*AӸ)5ZTFԑ/'QU?/Iޜ?QKV",$uN?l~{g-h`t:(GQC<Ō$q%!bԾv 4o[|VI|HRQԣcQm<%H¢p-,=Jv\"FT^lsYnH=yPX >VYr$Y#W'78 opءǍ:9|1orw5\Qސ?ٙxU"`DvDPN|q`(_܈見Y''@̡?xr AIl&/0m biYYD2W=хWɧ zI!& 'hwm*/l(*LPSO'm@Yo#M_̞tfy=/%By9.U? {$DW=[X~@ZMz R+BL3f mM}L%۝D>Bn@ΟL(3U&"E9&$|AP4⟝ǭufgtXHgwJ:^a7}+fe%| \Zo;*YZiOv~cCI1" DCˎD rӟ}ӱOe!۲h2YGٸbZZwm$`oTR!|Z.qr" bI/W??X#bdδsvYOw/.."0P'ޒ_Ѫ>T.P;W'jjm s+Ov]rO:lqlAıca:YE?_*TECn;n֭Bb O5>LOA.TI!Z㑘"~ʍ_{p[ cu~oDf4h}ΔѤh`t#`X x-$]Ȕ`5 );| TjN(| {SdccK"p-yu)8r}v/}.ayk$}Tz:fW PG+uBfJs6% UXjNA(o7^Ol=D&6A1x5R{jչDh!&d).B3 SxQ]vwr&V-5=(-= o&%Iߌ<&Aʵ .rZ쏑P=0#S {t' : ]9[d7K>Yc{S[:PAߏ9\=aըA2R;З%;NZcN똁(#'U2uS &|Q"`ApoLCfX =OЉ4-l? yiW'PO8"-.7*~kԪ[kp%mdrF_Az*䗰XHOm^p_)Bt;f˴3 Nɽަ6uZ<1,\_W +gVs`IB!"!I|OmҚ L B BFDͨ-b^pJ|Cv|.+Hֽ};pvRFieguc(oդ+5-D><m\ " L"0"+e5{s(5B"Xʺ}>至!@qr~gl0^/ ,umqoruuMց%)拻D2iIUAu&(0GU-䊇5oRU>x$2@Dy]թ?y9= :lqPO,Ƙ 0=MO̺GK8hH~L%H}j ӥfÔF/kkdM#gBޡBW6pmSrC`}ODS)MԈ!$mm?mb? ޶|#QVÞ^~r-Ay% " [oXA%ZrT4 WHڠw_ag:{˓sذR.`y(䬂8 I@cxDОzCcR4+ժ`^f8nU_n=P7fRu ‰<)}" G@=(;,"Y1 a$-,K;% C;xGIs[&h yqKȪ#i^J][yĐh}Ui;+ MiHx2uI#4 I 9A7$ú ⽀OqJj9hA>2Hv}:OW`SRߛ5V>DG;Bj4e+BQЈ6-yʢAtخw/V6(T[V9.+R;dQSaۆ]@ /7}o+vIP?CKK@<,SFڐ<4^ޯݕ>넅K)I6zY4y%SܼQ8/ pTv€>U_ E$J#G]弽#؜.Q$Jṗ9\d;:*YR3uo2c'H;! dYWïi12}?)d5Sx=%h"Sm*I*ߥ7/Viuh =0GdF>ty^`"埗ԤP E "|axjB ) k~=L†vڨaBa8(+H>^mz igF#[YU4M l[/RWD?c2 3E L|&?5sxltr?Y`}\y5 ]tFJ'd77[|rrJ-fLW4NodS|VH<`Hr1e'}8 O\00\wD7A?2étFWIZhaQU<uoiL t/o-)`cw^mcΜoGEm!8iVB3k-OCt˃G6rO,jLsmԮ?3.*nI;`^BJÜ5=ŕPyTVşM˜s+N򗾶 bUr:*9cP  sڤqK^&0Bv_cz>]Č2!7> |s6cPu{enI|_{`*޳AwdYٔ5:鬮TcXjq=P]I$-gG0ky"u '~* Q D?M$ +K$K-؄Q} QyoFC/O>`0z"/xh>wSUaNy7{%vDV?XYkSu2to!Sk clkJA8tIj'bzC ں{LJQz$VHuZq W#1{ni,DƜ3%sDu Gxx<"7(%d.S{ 4p [h?;oxt59<)}Ug& 9 c؍N zbuKhz<|9T8]>n&O. !;ؑ}}Ձ&.#P@2(}4bHO:L 8$d ʲyCH7N 쒲[Aı ψc]1:,D`AKwqE4KU*ɇkDvhx=߸T0Da+(@ӔB? z6/3V(;xpaDzn!=[MPM7*`r-E"(`]l k4O2e5CCoOR[ޜ53y}RrZ!=GO,~;#FURS>7b!zzFX]cPu)3?DQ)_}QCޯ:bЙA暝_[CbJzҌu Ry'(XL <םI& W9VH~.l,}j69$&[TG&f_wh]ݛ,XZO.faN6buRoY;uQ1yAw5a=]2Q 3T[~n!(MR][Xĩ-dCpC^ːZn h 3'q#BBaẎjMLo$󻰋6Jz 6U|}6< g/T1Bc],osmmC(<^SlV&nTc-v`q2Dhop?B۞6K{XB8@&F ĈIY:Cz.&MsP7* x?fwAz*dKWgSȽFVivA-%0Jߩ-,}Q 9a<0m8qaOslR|Ip90 gvd-f1pd!W,nFm~.ꉡϦp:&K"j@.$*BߪCܳ$3n|#VZ[=SqY|2qgha WD@Ji<ACkyB\eɔ4* ܕ̺NgQI}NOSϣW҈ J%l\- ^/0кz!baxsTvG7@ ;R aM#;V\wsr2@vYeE4b b35d=S:(J`˛ٱ3&Ax' +ג>w8)MTSt6Z}@:6(QNkȨXkрTpG>e{[1?ŧSue*7ROIo(,H "0*v]dLPx'YNznk6AZdH'A[ 1UEBnh0Q,=ZQMfWb7=3-1VO)?(lSI-T9{ؕKr,9sӞ _=v2[!/6) qʄѧSJ9FMN貃RI+>hhf p!y0 AR!TM{@S^+٭,O2Q!gRI{]JMêɝF×2J/^wnJui9MZ Z0fV.9χC$/97QڰLf'.U$fKn P~4d;˅^'qu AJ]d+zcJyPyZJ|.V`b0>NEqr*`yWd.g֘׽s,ieHlwgC7^vXlqEY0&9Ln66/Gȅ+\LKҨtNWibͲQV$5anЕn/iW TtcCE 8xx+YܕʨMPAE`;jf0ORܠeMEHLLRFD.dAgC:8@虛6.pS[lSR&r+tD!C#N9-Hsϯ+YB:~gaԨNfSk\Zو_FZ?2aKͦgrbUZvYbPtksVF\$pq=GA6 [ @ve4f=-6픚dӆ׫ߒ2$!nsiF#ғ5k¾0WvT31RRq9i3daC< %n̻z+3\FrJA1\JZeCb[1fi*Id')U lYia2[4W" [7CQpTKۘiyksMn~y (DR(qQX/a8 =g|zK5iZdO- o i~lVZ#'R pPM5Qgn}8^hTIЊEUV"Ec۩=ݥC l@e7]:X@hY6Hsi ,s$ r3ɳcu SS;eM(!1@>Gg0n ?$(rAڵwp%iRN`DHa~;#cf$aݴTVg 'qmr$%Vi.+"M @;Axáɹ Y.Xk5C%J -#P-ʩ`2V ţvO-2\wEdA7!0i LoEjEZ 9h/vj+`E-7CtPv_`Ϙf< 殅 +CTg=Co%ެF]C,w]""FmύI+*5^p" 3>LABoIawG@͐_0\a=,eS^18zse?-zY{D`Ci 9$Db/@؋&$8%9uc2#T'7P-.W4]d}@p[e\uUIW7-Ow`&:1+@`+"PsG$$}9u@I{rŞ@ ˡS7%!b- GZl,.X4[DlQ} M 3 ,VW`i&"x+&chE,%ԓ0y_ ^t,{B998'H3-`üG"#vM _#:%A!ӎc;6kvq5ɥbYjK$On-|pןڶG ssЖږٸ5X /2(H &:{yx5Zy^KƢ|tiKY/3ANW]k&+8Ұ%L58^OLQ sK1fxnk͵D5Pw]L՜Oc.*WX3zZTMJu2d)vntͷV|Pb_eV+Bpc\jǟzd&Vll9UK>!~XhvXK-tjMΌN 쌇;Ń j2 LAEZη9+jnu U>pU qm2\o*b[.3oSēf1'X0cG`BVYt6O_"S U%aZPj|^?[X[\g#.˜27:N69Ȟ\zzq9UE.(gLSx>:$:]^.6"^] @O%p9e]DGv ynn\d!%h$!njdYD7HYIR$DP]@!LbY$ڬm nT?5'ȍtiFz=1P~1aXC=߃sLUGxU&r؈|2>b#)97Pf^ 玄󑉼1_$-{kհ Q="SzYYKۨitBw& L$R#fJVHopo6dy8|=AM"s-SMP/6 {6nаBT͠M|\JtM >y&:m:^)Cc8,멖GyTE ,+LN yf~X4 ͨDtcw-:VgA@Z`AGטU >0[ WHז>ߜHL|7H}[Ie+7ݴÖ`!^-QNg%yKכ〓 $|ƣ\+Xj+("9g3aj)~g9/wER\$WBF0MYAW<,Edg[u }9%RxK{bPIύ-31Vb&ً 7B`ݽ9a` 4`b2Ǝ%=hPA)։fbHCəԫ/ _jkVifqcMWAÙPC| 1)Gg 0ߵH#ʦ:yt7ꄁyŖP& $D2rۑ!r901jOH|3ƭGeb*2A`i7qW+zQ#]i~X &_8sçuτq+;6VG$R-Y-l&*w$g Eߒ0'VMSkUw}[RvpU;17ҙ÷Mj͏:* ,z ?>/()B=kPS  uwpje ?@/xLs/&s(]F mֆRW<-i}jQ!ln{Pi=hwzROuH  :J^TNG|Ȭx]AZaD@Fhc8[Du*>OAK،sZ@pf:Jm.ݝg<||ufIt\AmqJnKے0|Q,Ymn`1_j6+񡡯|Fo9/'< &LޏsuS|YG72IA߃e8hΤ-a[v!L/wFgRaiD;< fZ}nOb"֯Z#{/~TD +-> !H`GǪl,6qheP#%3jq|#K$ t (2\mt[HRY>0]hCJ ]&sԺahX”~}dZ' 5R[$?3 &$mГpO(!{-&;)4RmOƛ(qʉL`bG7mXo/BbQ:9dJբJUGFܑe?#臘oB`s80A7f E8JhS۹{oce2 ʗb.؄ hK#;u+i-ǓEE+&떝 }c<9 5K.lsZ$\#2d*vzC}M=FmfQ8C wj͔z2[`*ɎjBbVi 91c;4m 3YOm>j֩T(p1F< W8@)@p.F9L9a1mva)ߖҜN*@BYyB.D/ג .Kc950n}Lw^+ÑAFMNÞl'n+Uŭ0bg0DbSHUf/"}Ψ)MϿmru&[Nu2!;~6Jkbf2yxir+ :͌@0Zzi>Jv7;W@٪Aq,Q>iu|XGq&9B|':ܷ)dAS -6ѣYEpr^N{NDc3氹yCy,V`1$\jJ)Us檽Xj~pf]` و[HCYLy"UkaLG;t(iN]I|Ķ#pmwc}̄Ba[pf NBGYdmIXIfƵ8g?FB;-)|=n N,Z*ϥs>|0XY:3^K6k M:4 B%MዟU}2!?ܵcHV>ϵݖF$ +V`qLf)Fswm?-rk,: {.ˬr7vV ^3o-ɼ#)߁"c}T !620N  4y!'J#JJ C7'DΪ5.%XD9fH. e4BJ3's=iLb-LJ%_Mo?^p젘AntR.,Z'ɶngO7Im&}r'uɪaTR8G?w'g-2g qU0%wEyUɕVP(pn^F8μc/+Shk۵Ex߶V~f9Uфo&y)P'@'dCG1T߯}J5PL*Oic5qPհpЇx*3#A oLfy>C\Í9BІ$'pDFZ"&̲\:^ '[ykwlOa**\GeerXsԉ[g_LoF.bӨ)2X@;U*rlfX2 hVW\R8 X ?ϣ ҞqU2=Q_;g3 ܏T_i,INN걁Ha-Wг8tȚ2 )6]d2cT^1k 0FB]2h97y/>&N*%D. {3"(,w*WbK=)7~eb ? R+e%*l(%Ϳ=3Ј:xj✂ep#jkZD{9&xd;̓S Ob|f`hX&YgFk[|7L>gز1wpY%&֝6ה5Y߼pxrzk'%`W]^25..vߎIp-:ZSi>Fe1ތ.@sp]"W%{?dJsrKdf4pȮAuH%d+ưAFpO=(~&et_GզMHd$qCr(D :s46}ޕx5ؤU`4cVjz[:˩e H'BHPD.i,ދAF^i:|nGyDMEc 6E a:"ϘJR$G=}!+.svs3>ډFQ >aQ:y.7#?QtɁƞ2{#c? GMǵٳtycL+GݑZ\tC, |<5֮rh4i [Nsr^IZv0:Ɉz5*t/AGyv&| uWr['rl+U~XrUT-z:8(pl!k4Vn~If t *O .)>* bJ$t$Y(?5>cG+m3ZĜ(0_ )c(ghjѿƦImɴ7vh)_Kq+.F/ \k.'?qXв_-%fTU9|=&{h(g·Uޔ\ ΪR#!7@ރCdm,A:;rL{nc"#&D/C_ZG(bIoieV"Ɨ'|G:0H |S>qx`kD(UOUIkc}/8polC$ThPP&YYz4|17d4lX˳)"yqEcڃg5ʗ(R'~( 1I-o!mgsn::A (|*Lr0ڈ `}'Ж"H=͹݀aJV:olܷ#ܩToPcGƪmB=9|f`fD lJpPUQɑ3o TIS Ce i飓V=C7m8fuтOP&љkrm?Dž=v| @FR0a "< d\ f}W"':hsAJK7 aGg56ziO/Ke8Ld`*T߸D,n뗾*Z s3|x($`z6733XnG""k}4@7oeXA1Rzq¦G"!nHt痻sq Q651)Pi;~ w\7pb* _[9tժFٕ&aay~\k ?ѳӹo^IJVv%?:@яթ[T-Ѩo%a'|)o v8硒FUHE: >"`_Z|aF<97K(Ynn`4P>D4!}_+PfggZe4;9,9C4~f)v((9_?!#G9`oRvgwςtɜ)2qWkYISWG Wdi}c&Gy__),%> ƛ}c׳ޖ]Ȭ^s#{͂F/ܰbMd;3`K>8Dg)R=tv;j 2v3y%N+{QW#C9")UVK̞gK?%l*JE 4>xd:_SwT@LHL v-ElwYQ_%["L14h`ȴ{JeeleãR%f[۵V{S ND3Vseὺ5HSgRW*drLD`I}]_2 k4p2B5AzU!+@RkIm3A0r}9%H9 wBlgu2?#FhN'Gg,g IN( .# (qrMx|CR)D>Ó EuEB-_5nGԅ:Ԥآc͟ b@.4x>-Vlw$9z[Z;~U$&`bQ7ka\nh=ɠ2dnbp6AvKXMCjiL^0暙su[DPTVa$+ +"騜q$%D")umW!^M͝hd1Ò.jlRS, 8aCmt&zٛ_0L!ku&SNv ca W˲Zɖ<" ,p+[ #*lإ5BC{Vbx #`  y@0gۙT Eb^( v(ĆObѫńqV_jwm҉R\ ~.>Ŀ?rcrt<%MPCAitނHThOgv&a&YQJ*E BYtK]ԇQ|D m@2a c3~vOVk~\bU\ NQmINBhHm6L'쩖V Pȉ,~Su`dʕP.3wW6J bm_F -EőYd ; X RvS6be6#+{4Kj%5`&l0΅_.rYN.C1U=G5d/Rxlfݳn r.Rcd;HB/}FVA \r& 8CXa]Qo)J!PWY:֪O*bA ܶ?>~?~JP|B#"I@A(ӘJ3m'e{tg2Cr71^'&/ e5k0HWe퇇|:oa!8s^  {MLoWC&IhIΠf -5xl Ĩۺl5Lm L>+FSh }JP}d&D1mX4p } 7v~Z4+_ff04 ̼L79zt!Yg`0HX­1*pWdDvEh:Jמ;DV(wzeܺߒNrM%nA!a;.oI޽a \[~L=Ɨ(a7%d=\"e36=}dR)2n˥.>e heJ_F19J+nQ,e?+Բcdsf픓vfaGkgfH2so>FL>hLjMhjBߛ|Ikc| Lxt1(3|vagA:`[LYg1hVwf>ںO7{<ԸoSކBSaPT90rB~R|hXi($8f ec'BxkbH;#^f̱,Ģ|xB/^c;{*?@82  VfeUc\˪f)N_FT@m%s"G-:n1!A{utCiٍ%\EHc2$l ^t [Zt }^yd=o/aߋK*RU2v=ŏELk {T_3%P0kŸp\;wF'ud҄،S 5Bf ~[υ ;"5|,<@%HaR>ob,9?!RЈa\ЫZ]$ Y$__x'NLjy }ڱm'wЯ%$x-@QHj[?BQKɼ +Q-}E1 ަ>0wOGIIѺ F+G ƿ``rξ~`jL?'[G8Lz ^#iR 1/Dmؕtam%C 9Vg).& gݷb,H 1[x2 &7í]/z{D˰i(m?}mR%J=UC-n+ց8OlN74B6+׺~ʰ&F+A߸R4N_y.u,MxEhHOVxZ.,.YyR1t0ZЬAbt;q 03R%Z6 ⌀zoC`-\(} $xK|k 6IqC-YA[ZS@=8gXRh'EPa*E7'uS3,sh 4PS~uUFI%r~8(+|`^ J0pobJ]Jk%I\yŠgƂە[uie{`w˓HW:@MUiZ07hN^:AfwUp5;E +x%$ehg/iM)'-MyBZ(u(͘?i/6r N6,N-n^8sm #BVp]|@F5_Jz߆T4~9%jNGcg YiE,N27Zuڢ檮z%|Bam?Yϝ *q+n!,&4mԓe|M##C) հp _3dj63[D3w~w3jqY=q Иua nQ`4]JqHYٞg"fUJl㩌kNL JUcz} K#` ōDHκVWrohCLe71ED%, x8hx6G5{V.yuTд$!\J1qW٘DB7%*vM#fed7[ј0 &{bz~ormY/̮‰2lB1HWnj=V5AFr@SN|9ɬtwk/$S |A !!0/Z(O^S)Cg\h(ǔ ] ahxM!u rYT@ 1J=%R5Ǯ< 7|=GV 25d1"TaGm&grݗ9NKL9]uD s6ٍE %ʈNTФy1T2T<Vq֛! tWShaOpb"M'& 7;4#cy\:-b^j_v铠Ӄ+pK@Q78yʣt?-[}VlZ{\ЎB[x7SlWo.s3 Xm Owmc̮$:])g5N% b:H7kS/k's\ٞL,(h/P=$cԧV6&jsS.{{b:C 1&u[EF<.X=qQ$"siP|#ֳ?OmRj)2YÕ&1`&rL*-Nm roq2yǹkW:„"nNAM9̠)_-VI.D C>z^LY4&C@>ԀHA)9EPÖC-ӌQ{ưǯ4q 3`4Ջm0{akbdp{lZ7}˾)r EmuI zBJbuXJG܌Jʪ1pNOѹ[>r* O6F-')w`?1&IWQ{J6W\.Fף*Sn1ij%6{Rx.TfwrXnopL ?oMZgoSI`,(=yo?jnvZ qb_&νVe(*5it7^!s`=, m ]~j]9҅=mB1sn'=xpxE5 5$PWЏu{2lEnm wZrmX`% 8& f9]0XZ(l7EpezUKlzr~6hYO& ;EtS{QMOY1ݵ}̻?ϦH"_!pR`҆߮'gFQk/MqK`JLdGO3JIhU{],ǤFZ91ץ0S,a6̚ hQ|B3ޕ {.ˡid@!@S#OB`6BVfX;츴 J jxkF& l8:GZ"( ~-kعwvVԇoYlg)=LEI m B F~9 N͉Fwx$l*UTre6VK"ABrꥲw.:A9=U3p#P&p6=SwFmeMZ97,NZzZ !⬃N8 .oRT ,Z"뛡0ܭ51wT؆=p$,%)'L'Q;/-& NXbMJ@+X9;O,`cc۲^ND6qt`ǒr0tQ1k4RR.${ζȳh-9s4)&fQjM4B&'8-׵K1'`{r#+ܽ2u(u]۠3hWf?sXEr>f{w[*D'dY=Rf+>G;33/Z"~W.rmP b|7/Nޯp]_uO4o='/^M#dYPg(mLcV ?p&]o||O%k@cp݉[=vD2d 9}]1 [(y?}LrPr2Db{2L`qw(D|CQ!:g%6O5:v_mVO,R<}S UT!B5ۏKJ[ע[pXǎ%W)(?h6㎒ -eVA6II4i*@>X±ȐޮIO4:Տf?X=6Nk%J* 5>؟=tע?l) BFS%+'43!͆6̗l8(>n yiC)'nq:) KUyAn.FJI]] ԖB3*v"~uʾn5q94=^I+{*%kddzf&cdÖ́!*}mG[4Dniqd{*@_s~UrQ$LfϪ2:4픫7B 9ӆB ɦG`Â(0<%o!+(YAr;9:vkH)KO SFnc6 VF3i0Q-WC\%z2|+0R5Yc92<[@Î|`7l`L-@|_>Vg[k?a^u J:)) Bˡ-_/Ggi?}& GBaKܮjIou]Ԇv4.BW 4\ܢnb)s*[4ٞ5РR 5h$v+M*wMi|5 N1xu>ה7bhJeI:Vƴ3Ҋ]լ;leu]SNbfL 9{hdaFZ|R8\zLOؕh1FZ$^,q=1ְSѣ%,ِ G;<};ꘚG.Ob+}+Q; bػ\19Byc(Ρ4Vq "bӠbA9}xcTRu\!uѵBʎmpN*Xn+`k->]mB,!TwNCͪ WQp$~=i#U<`!&7?9b9Q:c0WmMn9D񽭌ڡ\R:nsө.tkFY` ߀OTMM68Ӕu(b?j !Cؽ^랊`L,cWX6h ܲ*)R~=^ټDDfy]b blx48 6jAJ{[X%[>PV^Iv #8G+I[F4q%!Იy;Ja9SbP+yW SxkH4Jd.Dni:/Jz5!C)$?CyC29hId0@0(2q6b&>.LO[:j:wlB|.oic":*[#8Qgf*25)QjKn S`26)ȲkcCjh*#$FXFi#2kp~ +[:q(E_ȫ}B#c<t a$ǪګG CͻrcH\ *ϗu3J'Qtm=Mxuʅ%5ԎrZ6x?aVȹho\/VhY.x$8K ceMC(}͝VV u/Ԙ^DJrj?N>7.k&WR|'IzW'wwb s|e)2/,/ 8k:r6Xp{Z5< eip{B0AcmH$B1}|ށ']ɴZdU7'ߙ*NȮ6w]ll^**2 ^' 3.a}4hu !pCCÌQs\d=jr6(\!8 _y' %Cf&/X;QOŚ$~jo*{D4P$Ž]}t=$3fMt{\ժ^[s W.&h%EgXЮJΗ;un"Y Fvܙ22J1$4['vQ{$=UG/i΅i?y% I.dqP*?BE[<Q=9tfѹ^k 2zAlqL&0,QyeP?\_ZTŶ@V!_ʥ?Ra72)8>f+&3.ENH=[G1SULq8ivc~Q@Wfݫ€B%m]U E1wcj\^82(LW%GV8bv9<qDeP?t};Ը@*m$<0cSП,_+w-/fԑ6q~1vopZ ~Zcрt$ #<[X ;^ٰEMBvQ9b3ZNBh/y_VT\.uQ@Зf5r᛼=&$u]80{שءAe/I]Ž=F7rllXɳY"r(*lO41pO=np'ǩ9iVslA|P6htE|ߚ&J\ٻ4fjۢQ4"Tń~P+~vٌY|A*#v 8_|s8Tka_$X߶!*&;d< }txb;ˍ$wqOd/#! 2w AW7"("=/彿.:[>v@-( o OH`@T<!p]u X/۸.ݹ5ZvȅFZÈJT:|0#:J6{bWMkܶ)Z}[zmg^39-BJCf=H"E2GbrD?dޙ.*3dzvسMvwD{^]6&XLLF,BmuS\GkT7A7ƗF6x}TwtL߹se[}QN76nSrj'ݵDR3Zuˎl%Vm+l%z.[3*͓`wBCXlH ]߶~=+%n3Sb|B"`QgU Eo`*6j<, XvwmZ%AH:ZC)N*k"xm& DȇwJG֣oI?~$p]&pU;&o rO'g_ᬳ]d cL9 w!K+H,FrE'+,_2(jS:2^IƑ7'PPNsH{n0'L ]61˅Heir1t= ֱfMۘx)Bd(ƳEgL&8J[B `^m߮_lX]fh.V51H za_ť{V+45ʹtヂܽ?48p@w7뀓~[iÝX>eȗ1zg*(uuox{T8 9e63&icd5>_37f(<5&탡S2R#Xk&}i2="oEˣn+6rz+8VCgaJ帥2 ;!C&s k pqp=;YEȅSx58Xjn"1TEJ ޟNqgjføer?C [48m,~Fʭ!4&^cW΍֧*rayڏ}9A#EtY0g6.U{,_ꥶ] Fβ*ftHfAnX/5^z+,7N'O7&ϳ h2x2ǍoU{d5aY_U]dqWqtdr"owx-^Tz(ƽ|,f1Ϡ!V]Y)e_H;´PꈐJ&Lɷiz6o#g0g!7Ö{~ GeLY+@^sU#x"qq1#\]@x;^X{A~:\hwolX8䗂{@ G38:2;ٞ=O y/}xaA^rX] mY;E6 StJJ +26*VAܦ(A Rk wPR+h%\r]up 7L' 0#KCOZ٫iDgM {ZF9Otr~*TFӌO4('*K ͉%E65ų]j4~.0ݓcdA=ȶ7om3 t׆CٛMusZª.?s+.W:dkd+\彌+=ݪbDƔ8?qwM/;A4r7DE0O)ST>8oTLDpKQdI:-b%'$/nXy2ӐrG3gVriOTٸHne$q+ˬs֑FJZ^8#}B f^k)P3Kv 97dc4 *.~gfa-ޒ5zGU*՞\'bƭ.bAJ~?n\>*R1fp9?#7äaXɯ+ΤJ(bڸzOsS jZV%xnŀ(k:~ I32v`5.W*qb T*W6z5K,IS[b n5v[4|V0z"jkd$6e>}#ޥ]ىu=Q'42`~8d\m e)@=4tdZׂ6}JdLR#/uH:@@RLp߲>6bAP?%Tcb.ӱ)w]ޔTvڑtzm l :)dwt@ꦭxkHJfFQ d<ߨ9ـ!D}\wF R6pD-TsaƱGS& b.Ӈ!ʪ4Az񤿘 E ghȅ#!Eĵ^| 4&4Ol&N&({ܞG,mM(X$5ph\; ,TQqVoa04kT5LEl7!^ "HQ\JevL ~Y|76(p&7Rӧ="*GB@ `<"0_5\HKLTT)!Ujc"@j) d%[olCU=1qLAkDV>ISn(Mwe6 jLE}f\ڛqDu(/}rH~ [G vqhl=w^W6w L -hzxBNC:7 ={<;0 D)]3jUuι0iAQngt:Wq(pQpm՘<7Bg:NY JYb M1"wgya 2nf9Y`{|D1 `]^/IJO4xqMS-k %l$DEsjrd$࿦mWat0$hX%ilU:kwJK2CpA y5舎͚.)|.z6Wuv_Ǵa^eWi&+{鿈mpKHi'jw~"qm@thǖ˕L '{t\&xNVG"L8xkhM?y]TF3ԖDkI3Iܕ?I{ IYuXtb՜@yB]r˰TM# wvc}D/;46/K'?&܈51PӅ"z#Yα8[ٯFs8k uOZmeڬYy褚)/z1 Mn&`\u @ow'򨉽` epI Eϛ;M[è3AVk(՟jq7L FpyFY#4)HuKkD79yW(K̓dxL\L/N<5ϭ+:7KPHqK#\fABAowcwo6DC/TcTx:(Y]?#5"ƥZncvGym!sf'.Kng%ܩ<8^Gk2uO$ݶ, _Ý|횜+$J\7y;IvY=aB)]6e/y-z+uJM2Mֈή@ݷY@`Xu $ h;a$oui/&*C hnUhL,;!yNv&Z| ?6{}Å'Cl}v4b&Րj_;dcuTJ ;#huhaʵa{cMK h U ̯lu2a9!y$jPw1q7Y*H m[q!w r =ie/5rgǔc,a)@n+θ(!zQk5\jOh[)f^4?u֞fFj% a!\0o)y aOG\0r!`yPZ왙`Ƅ׃(Ep[SIÐ{՟$V]&FXBVEO)XUSQ P֐(,`xu]w-F g Pq'Rɱ@S_-jE¡e؅] gp!.eX 6NB}qrVPD&Ũ6T FAbdr,TzGJ$QTa4}R1*ˎ=[zW؜ 7 ^hsI)# 4.8MbhcW[L<Qbh s!BX:rv=]<1qdQݳYi_ϋ'o/^aF4D`:Eg[ ,0Er뇂vDZvUZX돵g:'s!~'cJ@ 4phL9;WZ;7u/qDn|b_zw:wx 'Qy96)HiͻŬwr {hÀŠP#!bc0i*}z/JcSD#JO9'˪ XDG sJr%2$[&j[?YQ ٲƞN $㸚X< :YA 퓅oPQ~lALF 28cו%}7n:ѥ:w\}-]Q~W pli?{ 50zʼn=4*}o^V:G[J#ɘkt?ψ0gL!j3{VXPpC-gd>Xp؅klM&dvt "ȣ7!p NjaPMS I5د({W}YcS`繾]Xh**y +WYJׅteyP?)x#bLt͙ͱK,5DL kԨS=0VuΡ_jD N^"{f ?ݵP|΅q tڸ=N Hp>׌(a\E=W*tVZ OjQ !iC4:%Z6Y)\~Be G6a~`ÉNGrPBݑ"ɕ`/c '6Oj*e/WG9EB)!R^kPjPJV _Ni~0P /Ǔ/w%GR/RգWuߌ {6"6['g`pIVH N.:q978Cs]/3W=GUkg~/}Mu((ڗ(%-4Kݯۤ_}x/䓕_ZDpw߱eɾo},[F]aheIZ5%ӓ$,PY|C;d[}tWYj&btqRjz~ PXdX`wmj;Ȋ;ʼn9ٷH/a|$mULVu %\:w/ﺤq4qC}|Z "_s24uGw;ÍDRyk2X"b+KdjMrT0Nuvs\wuƥk K x c)$q( YTRX`CV|SAkY!}?%l>kQU+yC⹚=HdIK qC@zݕ!,^'1 ?K)iV65)T'ғ;3[.e!hN7z\[x`kgR$D:պ M/ðҡNx,EwdLjTrٟ b#X(*E"GUn,:';o[xQ,.r]5%eaXRr|1t"RX-]+vԶҩ% {Zn"󕪏MǕ\죲ьENTWLPM|Žkb[+Vl;(M̀0[ڿ;~ԥ0A`Ng;C?e ˿Ӱ}VkӴvML n[A1hK^7疕me5 H`[NߚCp^)9p1=Û>NX`̒eZ{F bo{ܾ jS||k sp9{Q9H9W=&bx7!ם n&ˢ[QXh^P-:oIKA6U>Qe)+E.vyy7նVӎY>V'W(KtOfK#x0&1+x#ڸ*OyyU~%@R8,F vN߫UrGӚ̚l~Flr\1yn,tAFj%mVTUӭ+xr' Z5l*mU *璟J5Ls#HQ9k5cQX(P>yۥe#V%o]f9J["k^sZZz?LeI]Ț^_B <ʸBvj*o*SRb4?c kN/j )8 GXf3k l+K[!&JdcȈ'$n@ʃ IK, NM 6{w j)n&c#Np44%F3SP[`j@O;ĘY)^o/Kkc< dyF6ؗb" D?{j ØK1141yK l j*Жa^W{IM-\#(J9b*&8j3!+ԞIJ06g\&YL´MjuV$&PzFo}[\}di:GE.Ƒ7W4wԻN0A"#H3Dr9 -S)뒞,aKn2bVe8wVǡNtc%}b3mAtۆW*; ca: X<_qs?Na.a#o 0Y|uEU|tdN|\~"Y-̩Q1k8&]1T`BTl>ԕ]v7 s $[ԥp Jp;xnE'jO9x9"~eX6ܹ%c 5xiQU}jc^]P`-LoM]p)Gɏj!F%?/dK!" Oc&L>>ɯ ,{sR0>g FbC;R4Ou񓣓kpUbm +hG> X,-۝ḓKmvpӾ1CR\eqK4W4׃m̲uB>XyP$UՈ _v6\WO|Tm(&r͚ mj&-#'^U]0ӠNր@"b.Y&"hRBnC9)IRtuM %՗)z$Moh1:3oſ{[-⃫O"s1]ciPgA0kh#KU'|hFADrc0JvXUW@cНD|r 6L?|< H8J}l9LD^[TUT(E\'NrvFpH2j3Yۣ>,>{DHʵ*"n8n4w#yATO\/[}˱K͌A_p3b5i+Z3U,x8lV=!)mnlU﫫?'o op=]KuFr'µ ?.*WdݱWޭ`墐)Ĥd25_~vqj'{/C^thbIa:1P?A¦|lsyM[) ˙,=7j/opHsq2Bb1?kXAshg'dщ]wY4~;FaX >s=h4@9{iF0E܆e[}Afjpu并j"Ҋp[C}\~V`"Ƃ(@Kχ6kΐʝԋȮY!4&AU TlU$8~%LzXZAR}T74*zHL\ݭy57DU-qnੜt3I, M3ֺE&?1狗{aXp"rٽׂw/AYY^(笀Qchƾ 3^^3giנþrsH**I-{FduI[뼫\ȿZ|SODByD Nx & u:G7B^,HpM޸`VLĹB-$g\eeF@-|T} @)=bpoe](eW)=:wgs0y\ - ۭ،t,dշbcC=>1n2MjGj>I^4rȵ !qX}Ѐ PլzՋn|8MAEu kz}ٳ.)vTP8AbDܙ]nJɯ~9ɒe\l*--hZ܃#/n/}@CzB@dCP[,2~M"}N}5\YJr3?7)`VcP羕.B 51}7qlkހl8{GKb.a2-9wgHR;tj ^/CP~i}\;N1~l&O] 0?*G8`ͦp֬MnIUL@h  :͛ujr_tJ`}h&tAr0VKL=cL!ǼOZu舒R%3pwAҔ~gQqDӜx G" aیeч#bݛJPyGX#\p'NL,WL xYᓕ#bVl"PfqJ l]M-:e)KdkY>MV&ZQրOIM2ϙS=Ģ@#qKp@JUpɉ/^fjqSp4O_ansMd6: e' B?c(^ o5h4zF\5%ػɤq?7Ϊwm9Edu|LN2al5+D D/vJҠf A󓦉 {tP}'d-O5(lZH{~Uv:9Eug|B6rA8'5=m fQ]P.TK՞?-`-5h4`ɪ]u0\K2jj )*v`@#PJr؞rK%}Rn9/Z6N'ۼnsG0 =J\*0|b#+oԿfyfa@m@jl$xiÚh_i] Hܳ Q>&vdngI)E-ɬ2 G&qp7-7.$H(2g]Fw ;5dUr){&hInCܥvW,(Z9x9dZMu LpѬP!jV+ry3.* |m4\t oQ%[eI4U=V6浼>EfءH(0 A|"Mqm6[ p٦DJp2Xu"Ur.U.+ml 9yքlD4 o 6`{#. ЄF1%A f/sJjrGz@S{oVڿ95Only8K䉘rfr8dlCTqb?,q &0r|.U3bBNU6˪PTM'6 :*tǕv s!siӘ!sy%I0TW_f"%~:ISI63RoߤӣZsKmܽ 3$$/,~5%;z^7-r#ְ5ccǑ@t! 2[z H"Fb;~೺sΎCMY0919q!:vJB23l0=*S@xƣ:-ƱBMFIF;h(`1 da c5OtAQ~wo/8q/Wwdǧ"Cf*׊-Iwe4`?ӶEI, jٮ)3HK':Ca?<>Ad8whg\/Fͥ| |t5뚹Gpn2gPIjƚ23KdK .>D3=%-"(jxfAcI(0h*S@j2r>$|XtfB4$YQi,>hu#y&䚿Z,)>,*I^'o]Y7&to 9]IA^~5TȭE ۷(]?]6_[٨Z1 oT?ޟSy}'wzWl$4|Bj^s<#r[Mo7qGcF.ˌO‹ME i $ꕑb*Z,͞Wt??OE1$?J^D g!>P{Vnƨ:ŒѨr~ܖnrzQ q~# J,fh|n ʼnV)Lx㧌ArOXzt'4,_;PY5njX*#Of3K:5mu=/3ɃW2[ȟy=/BNnlem1SdL<80&شm)h~=jS67 eˇ q;+Mhؗ.1g &T:C+چ B.gk!X7O#Gָ3z[Κ@W֑TR=ҩ`o֎^~  V$t;p0?2l6%r.P?{8d : FyVtz" 7Qm3--鉮EV!nP#%l὏F)_aNº };,c32nBiKaD*}މԞp) ǃǕBɁF6{=?S 5j"`]+>b~%yH_,Fϛ)-EUʔM(I2HEǵ%LY ԪDUpVP@hx Qbf̮x 9+p5A2W0&?'^&j\R)l:cC,C?(J5%egxԞ~7gll>ۄBqJ&e&ռpD(e=/x` ع܈0ԯYTۗP:Y߇F|}Li }bsF ƻtJ<@ AN¨Թl2mqZ:ֆyX'+9y(S%Dd)KT'(0;8=||m7a|Ork- w8 zEƍ3;ȝ"91MmT!L AkR$4l@q LV^T+K)(7s&ΊGEg,RNF= |~e 2 rEGԋDEyjQW\Iy$GoWұ9n_ JAM٘A*w&°MwrJ6F}P[R7))~Rm9մ%=gy=/l'%)*,J {'?JP8-1y5RWGA8TyikBHxZtdp?PXh\1b#=X)[lB868to9B׻e~S*Cfh:6טN֡PJHGU |qK+}Vâm)~ƅgbKi21TrreHjf:; #mv!dEFp-|0Q|4GPyjH< _f5Q~NQ3w\Jyb̹MD*t,>:ZetE(!܅]u#ZAv]A,%_a.,NxJ9Ѿɰ,0P8T0,Ũ .[w[;9jovDS?f\X=ĤJɺ  ̲$xxP~LwlY7+R䡛]h)|hq/S_bo[_7>A Y91z&C\cyVnouAaOV$w4^O NÓ>ܹ$&E3L@]!PjRS{F=~ay͵F %n\NX$ xM©Ю/֦I]Uhn Tn&C_]K1 \{9YƙS/eB7-bsaXw ._#ls= ij>V*ڔY(D8BEj:rP^S>Jյw8(չgz/_]6%dN9L3q|F5(o> ;.bfyR`9>D<9K!vͷmT(ˠV!$ P 'S%ᘝN΢Pi%WQEf}kNCXέ0جӘFG` _XC<2!^!^oȦ$??z@TODA+V@@:XV#-jPPvI[mڱۯ цpVܖX(Rmo꧷Bz, f50Sߓ ڱ~ێDs#o-Gt"JJ6gs>,x um_)G;hI5E#'WQc ~:,9uH)o4|֣*_ΜH0 kGGC~yG;c0tRtΦ'!챂73s$q6x,ORQd岶.JbE]ˢ(]̲oZQHlGԚnn$H',vںofD8`-(9HBo7hQ@Ybm/vA^uǘ_G->W~ҿ;Q]g=[iJG $; JЇTb-ׅU _+ѸhʥIkѽ*4!-~NsK~ 2>v4 Nģ䯃wr4 Bi*۴Lo_F3ݔh-P4A˄OhV9lzS 0-~rכ)݄mu أ_Y/bdz4@6}b({pO1o>N/̣: ؼMA·L͕:jz|9ԾCp)_1K$^iA\,%OmKqNϡ m8b?!e 5ЄBA|5\b<)No5:e540 ~AV-9а|QRwS" \yL*W}"qq K=ldե0ڞLS/e|S#V{Ȅs_}[ݦ;9 .`[@j*?n}zS?bDjo4x ^ E&nh{;7g8R3S^p%d}1;$j;YB~1!`uDZA7loyc|Ha&5 /aSdUP;j#]2(3֨[KN ~ܽ$! SN'Lخ.*.mj RT61qTЉ=fb@(@YYZ?qp:a-٣bvqpMLLt#OS 9"eaԇHdzy @yOW/.7HCOEBc#ŢW(7lqP Zϸg/?E~ 4 A!2P_Oe`T.Q'1p2Zbۖ`A:!i1 .usm]nh!@Zq/8!rW@'XM]yD g0k VDv(of3c z <;^58ӣB'℣N~ #ЂB<ŇvnDwPVK>"D;T L^:c:KKc+[w /GŽO}ɡ'h(1[/ km` '%BCd†p<&nUC}86duպyqFFΔ %O7yIRwXJo9 /,˓"UEa7t^?/vO)O֖Zlex~ux3c}`ljwEQ_-X&?vۛܜńA7(e ˷h{?'|9Gj7k`"-KI5lqWɠz#G罯'GW<ݬ jG.yb4.^{ȘE:mЈѨ|0ڽ!r'rL~Fy;C%' 28LAveP<U@ `7_K Լ6 0x4&Ѕd7&XKl8q/kۑœp(nh&YQ0Y V#06RQnaF58rṶ ZMoYؼkT޻8A@P%۪q68hBvkFt3hЀ߈#sp^J~OBܦX{\fk$}/Y.*Jek'=Ȁq&u!gón-Obip{$0AVtizg}؄k// O^v[YBDNg`B8o@У!REhMT}!4줕b-4MO0ËQWjDNj<Ű`,9c#JtR%)sj v2ִ.dnw,L(V̎8QψCy,܅q q , NnQ-(hfѷcx鳎Gƈ *`O_$tΩpWN:u9y ,w{Ǫ#E5}vh\݇o034m_~_/V EU`CNu@waeVcr]BlE`_} 3a+;&ޒ%U@43Zy'"yB!Y:-'*z}" mQ KsX_o z>?)O?+(;sOwߎ%8EJʘh$΁Rw)琸J ^}W1CW'cj%f <^ӌV5.7ρI%w` C*3-a7ԼI#u##4scsiX HQl[ ᰪ /8 K9Q=GCm ~1:M ˉhzr,VBX_c!Źl;DVIypX1$/e+m bBBS;qVF`^ph<>L 瀙v躘#zYft:~36O&(жh:|g`p'TO%jӐ->F]=r p,Ci+<"1nU) żwŽU"}™yuDp1 cL*b@m"Ri n: CuYѱJfUB:H_?Ӝ'fC{؄x}%…eYP q8_nr xXd2[\2˩V?;BIǠh1^ObRv6̩s8kH.ԷKSa}*IK`tlk)u mFU† M/ڦ TNQұQy'QQBi9>LDyR4?kT sF2LпȅO8h*~ O齤ڼlJ6m,# bYFU6pP/=1~"xA)1& ^z 3=q톆\;}9U6PVhmӔ1Z1"FuP b: Tx8N z\۔J$ߡn&|AۓNa"EcdSǠ;M.,2D$?|쪵"qDPR/򝿥0rPS^58J*pshX*.~|;I<hmT#E`"&Bku :qzacj-4LO_)ꇍ|5[-J9~G9' %BNXa|oxp"LAT? LS zA t{ִ͌C!e-~7bL@U.{-y3pK?v@GV5~,_zMAqFi[Y'^xM$/+;x+!yyRq%EAX?Dήǹg<Z_['U/ K5{[@761.7~8'uSj#AmoȪח4u3DBf-n4?TYNEj7 =yȚbxK U5p+*G: AX!WzJ&#}ؠ#8HCwҳ/u:U_Z Vn"nQ@izch\ zxبv5G@L<̛h M3KJ a^w!. Ҵ}IK7YU\6͎#UzRYߺ^$^+f({@f<&exۨI,Z<&5U))oUbC3Eo:4l$giJ0 J¹T&re$H9n E_qݔըA$ bgEfr?kai5Fd`? \SmTq7w1X!hT i?.߂. ꯟ )ݙU¬z_TҢ<^BBs7G@y?JHlO>}:Pc{J04\JWJ1lK ,EԦ|2,rɥ̟9a+5&el/ u-D+*7my8Ds6%;W+*IZzyj @xNfzQ;@V@caWr񇰡,Y|4޼Ui'6]}CJ r6{A(eq'ܚs_WdȵdRb9;;SSO`d;;!+Q۱~(~{yhb>j$@ds e}[n<@fuv[~T5! d@Lܞ";1; g,M=8,hi妝Ⱦ(;Pɰf"o)nnDB bs!:@=-E9Sޯa u+_ a-.U>B:Yr.e. c~t蝵89 遷S kP?`3G-gFL9^6m[M77!=_ ?ДxCΚՅỞ1`; a/BB9.I10vZ1mPFX>.Ly! gxI7b f*;=s7vU`U-Cӷ'n֡iD?cs&=X1C(jSQdil"$'ڬ;{eTPbޯJOC^넇y9hDa&9(tɦ|$tc,P.Kapp ثkQ>LFd 9mF+Sȍ[e)]Ol c F'J2|=3IVl2w{`9` E}Ҋ#qkꮧĄk Z> 9$f]Ie;L_qS+[7R^HFݨτ;[8bG51%<"=7|qQh&Wbb$:j?K뇭u$/aLo GL1r>8Ipz1`AS,#)ՇxVa1<;/ 1HPhkݳCK[|!N  cP 1$~w;4{dtyIt2:{>8TzH EޘGI3Nj~L}O>qVM5q(;=r\`=g¯î^%69"uoA -f݂XK\8ĆeKs`囹!G@vH4VWfniD{m͍y>Ft ||?)v!krN'\)3$7^g\l^{8MU9un^@G6Y `Mb|9V%Il)!yV@M5~-,L504 d&:Bv9@nYǜ\g!*@OYl7p;,dy0l F1aQ v:ε,Yȼ/eDu'J)B@|W g 3(Bo#\.M Nl2;pY1~ޥ%u拺(~N7\>yڍΠ S3xⲜVI-g^_\/\uc 1+"XzJsD䯢5Y5ojm{S8l*5(F#z*'G=AT:O!sqT݉ݗ oI +Nꝣ6TIhtӥStA٦aԙ6ˮw6fK7:@Xŏ:tkߩ~K=+s<C)$qu8%!smBoNJ$"`ְF3WަS4TPPף RמNBA/FF(Ttm[~Ʈ3%#>ME;@::je^XH{tbW-rݳڬx`Ny)`3{]e=BB'gzUѮu)_rS R]}45?n&H&E(U =~+Zu"g{߹},iB$^ﭺf.ZѰVh`+ l$" 8YtE7('%bE2n3:pHl(:&{o, IF<(W6M&^m^ 'u7j } ~X>VհPP\f..5qԼly6]^ܢUh> /.6WҭEi_ 8M26oiQƆ_7ftsr!2Ee`,Ej#4S[d D6$MWd(Lm8QOqeW05lr0Icu1V5WEQcm]?'PPA񨰍D0߄fϞE'U-ۘ]?: t%FWJHS *٥ɳ0,1PCuwfN~jwy Rd1a.y:(&8yŠϲSt>K.FV7hGrLIƒR0<F&-G U6BdPBVl\dt\;wղny[R ƼxQo붃o2dsfCPs4 e%ijcE|_ atTFdDU`4GQ{-g (_+weqz?ǿp R5!5u;O[_>k#sׄf AAb#p'KkiE>JK$'kJ߭O F| 7px>i3Iar}gB #;?H#c`T;P)a*kHi?4!*2[MQ5X} [ 79l{~N)&nPt9kS!pQaepG-Ԥ'C}2 ;m ]Xy,غ\ߐX1Bfj2ߞa)/ԀcDEC 3#i@i"G5Xx x TT?ПANh< 9eI,qSܼhhJ}$P_Ӄ 0Núoə;]Nqͭ( p[1K0hlXj#[ P4y,:>ʈ71aO P4$<Ό֘܊Q%c!Z 0в1՗\13k,naϬ?k 0ڲ@nJiPMѫ0Z8e!P:0UYoa㽗Ӷ[v/[VT L աxO]| Z*B 4A!h-I5פGY(Bm(B=AmOK*7nuD: ͦ.&QX_q}رw"XeÒtŽr19^$3XXXYr ʫCJD~y_kF1 S)*:@AkrQ˹D7 vfm=P~ NqlSH(xs,򼐶9c]w u+[E>^OBڈ˚ixLTy4*+@pG0{@L`Ept{%顓L-EOg.X3$sZ';p+cԜ;4Wg]3?m9xmF43[4a$"RnD2mu3_Z>o}m6\'PD\V*\Ks}ح+ Y5S;|κ$A Gc>8uGa;hӘ@ -wi%lv2D:Ēr5M(-W}@Ί v!<ـ^@,)+kD"d@zFrsjl0(PQ!D 9 l}G /o[ED=4R ",t*;!ޡCa?"A`ȍN{j}[Z "KFE~ nKfnOlrgڭ&Wo]NE.&wj-V)z\G/$ImO34d A5n^FĴ?F l̟O^3S^^VITbX&nzA U[~r 0k:òeSɇi17zI.o,В+1:Y1gNS]J *MjLt]lvI=giEgg'9-Dt\j&q>.qxd>^@ŢUU*ף+Fj(DU\\'5gl9橂΂VsivC' S&X#2H1t?AU6 \[)⧣ֹ,,MD 4{nZ8_DtPѬV&P$Gjd?Gt֔su@Ahأ;Ǘ4cŭ0\`HD drKXc)kS*Irb#wU!e)'^2($LwA$~|8sa:͞eKBmt܆xfDr~ΐv7<.A*:[ሧBCɞ!+Fg\:),ka)䦥3OPX& Pv|E,FJtk,Ek%R6饥u8'gHP]i;r"tiS7/t3dV 4`%ALP|i-y,7$Q/r_8ϗ c^T"_w{H,Zid>Stra{H> tFt^tch+讹Cɡ/ 5΂Peoi7b)NNV܆۠XoR ǹӰcd\P蓹1wg]>qaSC6@i _d_"v/d̿z L~ SqhϔXpw"\}wdhXY! 㲮ڵ:郝qPtN3,搩-FC2IÚ=sZT3PI#aB( 4r9G_iof_%g &݉18V^\6;Lm ˀ[9UbUϳqh s xJ1B&R ڛ8 =xG5Bi1M *xCu5-}~uTb4:/<:l,t(3+,IO0YA}$[I#QKotV2S(ى4Xnt\Dsø? >a獞^W429J$:Zy(KIoٔ9:S`ݥljkeɥHiə+i `a%09#LΨxI<)ЗI=+:ǶS>c7ɰlӾ?s?g߱1N)ʝ6O.&Hn! MT)/.ui@vS៌Y'j{FnY)`tY?Ő>K;EqA3)QBpx|\BU:CXxj5a*  G`*)eᗬu& :UO >7as.f IjJLуz C ̗ pxˏsMN/N$ǃWϑ]+ʪ`9ʂI1G @$)?jABJ`9"q8fC*Y {q<#xܥ& l>h+K9s.t~sH?Wg h1=dr| f ~3mE%kE*!x ;`"YYo=A^yDw-#'fsuy{9Aͻ黔2-; H@ J"-eȩ$M$s1GR,n1X\O 6\_Osc U $ 0#LѹBSgB_RpU '$>Sɭv2Rz2(\z C1 fDiK$aM6.-bق9,\2IÐp 7.o'[U~j&r{ 29<ΓkDjX5L0F&p7U\ /҄&OY0kǂL_+eH us{i+:Gk4?{)e&rK FR*/ kr%ERma(HM< on=OLdZgyL ;5S̭U32ڤێϚv\](D|ă8h'DyMd*}=#ly Ic)A݈C6ۇuq9|@RIVOeYbHR@=&<أ:FQIy:!TR] febx̀wA3Z0Bs.?Sud(%[߽0.+oy z:cjGۨCt-9{*^FxS\?bpqiJq.κȲUWHAfL(* kSjmbMEgYxhGY8v(sdeegt72UY)>VÌk)!^&5b'B\4s忝=;SrC sgoDm#TK7skܘQ^* j#גdsZVkȒJt.jM.cU%kB+Um77i܂yJe1CJe&h,L<8 +p2.>7w9t~o Lj)wIxp4zr7;/}lckc`;|?3%I,a-c# HG)SW?G+c!2v },btߜنVSVb[a Q85b]rgynFg:!gYFH>w,5`f31Pܼiv1f" x?S58>vuD7`+nu$IG,%.o+Y&?ٷ]D z7|SEyJ9YfHwDWgk)9NW=mSʖ*6PU5cwSPlpx)i)O!mUS18Ͽ DquEys )8*ZqjzlPˤ8Dg\ߵptx.RSZdR] $5s9 ?Ɲh-S-67t;/ݰW pAYȬn+\2"Yg!7r:gYM.ПC/ ͼ:$Ro,?Ykay#'GDž~@t-%ylٌ AfĨnWM?ԏge'^M9 ZȈBdnls+T!U~ǽ F +!@ˊP12̱IՐFq"2$pTA3¹tECF;9G!G T6u-֊u8ҏU. 8A\XWEN6A*>A XA,miz{;TJLXKM KtvMyՖ05choq1#qEy#(=/x1tFJpۓvI>![輺у秡u}R) |dkzm0Kx[}j:X=ۧR/ ![aINHSO7 YV蜰hH$cR 3/LIjExl9:ϏE1)dzN`hCnowHǕrӫ&I6'zl2b^%tmcNbI6FIZqZUԳ3PF ;-aG󑓀(@ 6pԪ8on] Rnm)BbƙylBЙJ ˘ڌ<9cAki,b\sxԾÆiCmWy OGよ\`F={7EQ?p;R}j,).“V5]Hۀb!86u@<`K:bq+ͱJB72hcDch}-# b`L@ƎB[&;0rr< +1{o;eяĪ|s@/lѢMU$˧79>/:r s67}g)N~8MT95w_/HܤO'~a_-y} ,T])b}+Ks;gLR)GY$yhqW׸_#|a) U#fR L1KF*A oa/` ?EI wc%!hV \|pL'Bz|J_bƑYJ?`4r1rm$_"X0=4L;B% KQ \ȰȅlR56Rm+F%1L$n6cLi8JEdq=6KP_Wid֣gC,J㇇@yp:q82u2X嵕~ÊNO-SD]$>meQu[v&Lw9Tp#98P+bXy='VI@RiO#etP7+H7uBAeahv%DTd a\8c>:?HHuϝah>]0T@i5+{ & !7(DO?<~ 60̸>p\+-|[LܖC A4 s}h^su`ԀO7(޺>iبNqEU$1p;UG$U[0nܱu䶜ӺvlXJڅ~0kZWqV KgD*PvF_WYou׻, 65:X gNuI{\j{wW 'R% _ >$B~֋hh]z%,tqtjk]H ._#-~1~ľ<>fmJW(Y`>1vx ";1ؤAfMd!AGJdY:+B03L~S8m^7mE@r\Wl* Wţ?3m24%G1]ut? >%Q٣uBTɝ>zJzԽJ}?(>I8P7].?';ssl+_ei hL@6nvMN6y%)Z(j$Vz2>xeCn|87uR%e/o# U2 KKӟ[xLCtNq(+ C} ^Os!ļPuY:HG@=kH4jP蹟+b!Ir?K'Қ}%USn=MB^s{4,&8uoȦ,,}[m~1@\v!!$OA,1n!xb=iJulݝ&}iUqv V3oPEHN  =4~NY~jbYD BEFaZRPeLKw0@V`.Y)'x۩x""Iyо|L@K}x(Z)Jv[z䁀m\M=_DV֍Jȭ4NrGu`6mQDs i^:'Нwl&*wkhPmz.%\,aDQn;W񯃼no Ƅ]q:)|I~Nb+pf^ y&F:噖X^qyH;im_Sl1=i@ěXr(Ŋ$B6 Qb" ddPOjT;Y~II |~"Lw͏<^eq$L$ך6m[T7ᓩoR'l zkO5-iʈ[RÚ$L,(DA ɵju> h,G5:?HgH;'EWiɔn{6G:^`5 4=sIz6?N. R\8a\@o=ثAy_+A,> !uܖ{}Ne8D;чvXTKj) ]Geז|ˢXqh~QMK- xIGa G|s95SEzف"YzfG@$fTa!j+A;T.\CGw|%xבOk[J?Gav+'c)ތ{N܍,VD9E3Rha6r.rw@u,H"9a9Z;] 'aKJ)Ӧ4~ B#><НS3ݡD7EuF5q:[e_P,moڡܟԈ%t;s}[w~StMxt }{9 ۶GԥD|ڡ3R]j!bK֏ O8y]_޵a}}RJi/я OH*bu:Rjw(BڑN|z̐v,H~=r t|9F3GTHU}f7(\"5 ֹhbIT#`Z2.3y#'V9@ګt0"x/n\vr~Dp`S&q׺]{\8B~ Мf3۰Wd`C2}saxbْM"  &5iu7 8fΆw͡M~_  -l ,'u6UrP5uml"j@I%ߕ1N fGMیG"tE,  "g\ AjsXT*q~b+yǰ _FK߽Rw%_ xݮv.Gyg9Byț\cYr 8up5 "O &pB=}5c-FawpQ Gn:Ru|:rL^RS$S.۽ףnlaopβ#;Q{l:mq(1&CYD oC*D w751NjCf(h#y.n;:2cYNl}~Md҂L-whJ)ᄲo07.V,`Z6蟦S!*R񳢊p(uq@bϳ fI[H1gřIkqdQ<4M[UA,痔s0lh]Vl+sZƋUV+eIGr1bc(/+jmōin)U?)Yl)R-4M02/#xa 2Ģ OVaWeئE_stwjËG,&l*U8M,W[[άPpq,5ƛ 9[y#. -zϕ+ wЌb'|E3f @L ~?)cȜq2I3=2T ^[,aˬR,̊/^C _of6<%lG kmWY~Ui|y%;Hi["%{3}1tV~?^Ph IH{w{˯)JTB6аHdm:f\'Ό ^$#P [H.8E&rJw}/B16Ռ\a7M =wCfυ]B#>G8%ρzYM Ea3TjhZƉ8 ̽:?(E 5K[͉͕7)&vVr|@WEhW< iev\ n&xz\4hͬPLK*BgI =2:.[10=J5Ƙeu޵ЗZ-Hj * %V7uFIV(䖍mЧU>W93[0Gqt~K)'i ?pYhknҙyv; AaS<ҿb(b@jYU GPvl"sv9g>/{nxRn)JQESbxG>JA#WOH'ӳa:-)%Cx+-DC!zS:|[q z;bE b""pɋcCQCpu( @EiUMFFM)] u Bȑ6Y#֎%~A#p%hUm5."WG9#%k; P"orϾ(K>oS<_!YNswoUrVf~ gDmɑhV=7?C]Hzҝ[)%~#ՖeMe>yJ!vSi*mOo#;xtg0> ZmFPo TA P(̤;g"6L}O3$.O˃ `iccxJ&5oY" &4ƌ Ǯ1U][}Ɲo/''>;ʽty^mCy娇nj\!nl}mmoZ}A7ch_]@%":lm fmVUe˪ku.4[s*Գ[;9ig*lbI Wjfe|-m,̖C<&1Ud+ G,2q`x EP fVsV#SܕgxNEԳQoG9Nࢀ|Eo+ `cJ=j h8?2s 0y 봆䇳-nKxzq2C8%H -:(#SUL4g&1Ӿ+Ҏ$+! (-QTw=A1#)sk; ԲE 04@tE M09Ժm^;o9x_kjl3Az])j@{/a 8%EJ=ߦca⋧b=_- цY \ݭ{q:dƇ ǜȱ*Xjf'**`H!iY?Gι!LqgF DyaZXΤ/wʀt 6˹pyDɠV|-kIG%A[:'}j[|N[IZ# ܾϟ8Ø z]HO+߈{6Vzo%p'Z6/qW^jUl~m"t$ ȪtGh-E@_ZY_"!XJ% -w|{&etBs",1 Q-E)L-V\E1 It%nҸslʌGHM&>JqK7TBMiC$LmH`0T`pv)h+ⲍ+G܈YQ[+ht*'g p_Bre,IrDD w󯃹j޲8nvp=aȎ>\ؗ:ִ;,I5{+᪎\[oqu h4 kK4[MCJ`=ͷBbWaa#)Uн$1Sw3ŗc ~n3ܛ~5e5;VLOi&%O7,vcLh-Gnkpn shC^ h5Oр⒅V{}?<:>oU0=@{õ*Nʽsqn42}1j M0R2sk{6PG;a _(N;؅-k!oqH4DaW"Q%|,zuDNysbҡN8v~5Zy|B4@0Ko]W_zv@aՒZ#^.}!+ajh!.&Ovi}ilF(w(!2aW\.'0$n8r.D1}c76?ybuH[99ɂJ.%҂B͖t} Zo怌Tb..ckn[Arl)ːm2?Qes"BU8+8M-wγmoU~j0,lQP8C#3hr9'{ڒf@|_KaM 39A6ej}7%9$%`A;"CTӶF)"1 _O\V`|V(LNx63"5!, *@CRa.E:ҋi}liЁ$,{z e~bn22IZ⿟~p:i[Pv k2nvO$dDuFmC^xIP&emdENI&ޫL)FAzRtJ AU&̍fW%26lj*3V Aq_tyCY%( !jḷ!Ni+jLc Ut"=\\a;;Nbu1Cq1ݾl Dԃxf}R ik l#͑4W$$mIĖ!e^b+{>7 ('6qEg>,m^/0y[.o/E"`}-y-Y*aUXMt R~|*D1qWgGՂ9i|5\kL),n(?5`XvQ u/{S?#nR ?kuO(6>͙Oiʲ{U (VnǕ}1(㴖XŃseBC(yg=P# ։51S~l}ﭳ ;7CTz>_.㈅]$*[4@_0(]&gž Fr|>^fDIVlp3G-},̟ۘ⟋ *2ni6 ;+}W"N.jv1k>@i\,Xӂ,EWCPMC%.I߈\vg;NOQG tb߬oW-ft)I6-7]7D ?$;tH2'1z=QVOvE쥽Ow2!7Ai1P8JXb;O놄8+餅FW%ڽ&zEϦ*<{, ]. ꍛ3g#+C ǯF{'ʃ|P i/MU ѧ׷2vیeDlK-x-MknP菱oUaHRn00ϑS+ ]Ip7y|b- U+\3t e#wzA; W%:V.]dOFCÌesrh?-f>4nP'195c(&}R?>#E*['>i9YZO!V1gGa>/ڀV:X֣y%5T6g*@~ /SRL]#/+,6қApr8'2ëB0\/wXk DMu8AzCBhua`gl͠hEKU^<#v 2uDž7SzJ:N~{smjvzX'IŒG]Xع20I%˧Gs*ĕl*|q+Xam&aʆpض4u#vj;s&S==:ng._P~k=ٯ6AB*:XqiXOjbӡ>3X'wPh⺻3JquWJ=%"ܸ@wk" >>8'ardyGֈ6V18yUbM!Mx>׆be.]o?o.U{[n>@ l,DWּe7D eW JPV"&Ám0?S'A?07"g&A12`?nr,p%/3yB@RUft$ oU'E~tJw:Ep_-[1I4Y)8G 9`V)# |'t`'\V4>׌ ,8__<8gtNz#",N/[%/7[~aևK -2DJ$ niMcA4UmFbIpV#i=Jϲ;P$3N¢_rB$ϰJǧA?HU~äcXLMbQ}L~ǰz_~/_9v&]h,X*\} I}dX'D 7~:q"iD#Iw]L]Xb:rT@N$BK;M4Ju\ ۘmD3>h(Ԉ,t5ݞ)Lmv'tQI,m&3hEl@R$]_BT!1fث#q©a cJEwN{p; 0;eG&vX,tϟKYb Ѯ;v&^e" u+H'# o-.D!o^{4}F"BIl"b:y(/ޱ}؜YK`!!YKam]MmN_%q'jBbV \L#>V(B3' Bܐ>ZR,/v#& a]} bZI 3==]Wux" &) 978<\Mcwhp~ዢ_6U B VtllYKbBhJpX"XKq\0#? h[+$4֬ӝev؊,KH;!Cy:é\!WkO9w9Aм.}k\P\o1cV [3&7w 0w?u78-q9+`{Ԉ0~D  aK8Q{i,b"n'uAq9iYDfdsZ51Բ1=EuIV,x~";Mq }AFMuƒbhj8_4[pNAl]=߹OPaNzM`.ym_ l7Mu\̒qL9Q:b2FĹMKHRMڝw^1/C P$Pՙ]Wcf >q_rӊRX塼-F}5BPA$ˢ.z",o0NVj4`-bަƫa)blf:eNl:UDuv!{z g{]DJ5 ,ϲltrCc: $oJ ˗jD"F{5N^afũjEQ7|4ݏu1W|eW|3li&7yhi4,Mc|y̗+߃ p 2;qx1~5MK+u,'->mPMa+NdSxҡ'8J'[#-jm̾xݘUʷrĻ ?Dd客ݓRD J|v$>SAV_{'! $;ʝ QuŮzv.Σ ԹIxACrChOo#Vvo}yC?91 ŒZxGOvYKsݶlPm>_5T h;ڳEX#l=zu?j@FM ڤL Ms <b`ߌ(S9c13ֻo[gWLγt;{7̛2qİ2$\.0-wk #)vŖT4SKȺtzN⃫/%/;tnbF\ ͤHhn}(y[#bngIIdp1\/ wh@9w죒)6ic<D# `FZ?1,;?t2͜BMc;6S!ɓf<$z-IYb: IMnՉ09BRWr9Z͵UvOM&CR@EJԁIybsU9dV>ܥ}]E%gQMTo<֭ͼX^ [+sk %! O7p#?iàemK"fZKfaώYV9 d\=+ḏcrDUz<<}PF*țfǃ50( o]CY$ n:R,Kꦠ-Gx;J?rsg=3!3 +7e}ST *bv[BJ ({p@iY ]nGnHptB9/o.bzdVGD&)/Ҽ }~ K~W1i[-ޗ,ITt+'nyTGU2YFI<^Έ)3޿j?3H2bPS_6c]xZnpr^} Јp;^JE5[BBgRnCp95I3\R`8< ?^%1b4)si-~D%|MdaHY DM闟! ^ XP @#[nz#Xk$/8yN[]$/~c#Z,}ubǷ-RE>^b3g4׬6ZZ}HÛuni#23!O+uO^|^t:Qo;&\wmys t+5=uQw|OԭF o%T=킙 9Xd v 0VxP\aL_segao1rv/*k6[vQz$ spD˸=]m@Տ9\{4ĉEXcݣV e&4nծtNOF;3!Ȼ+l^BakGNy\sʙ RҏPy>~2lIZs=_mQ4^lֵt=Rrn"F(2syͰAMo-`Ҥ⊕rBguW)hk(w 2cce?2/f./@"V\5^&eT*,ݹj[-o:5L$sW+A:ہx$d>&РL=–dǮ\c,xM ߷g6=9W-ѫO1CɦUgH_|jۍR.02fE~)E<<;@tZj}Z.݊SYb~ò Ci/+'Dï9;i1wdȢy_dIiR=~ ظ -UIik9LL#ʦ }o!3&nB)>D]av+!އѣRp/?Mw7W=R ݹMJ,Ц싞}jG30rfFsQ<`0EX*Lz+ eV=Hؐ4ps+exZ?o#yP:H0Gᆭwv}a@ʲ89.& LWsDUIe%oQ("dPnwYFY<5Wm+9G1R@`BYݱiLC躢%E¸0'l44@G*;K/߄ӽr˅~YRJOS uEVfYQ gY8sCQ|CIs%6:u7+zrv?=4"9Z.A-zU@lqU .t3QDpsL"`>o ]a1B_GZm`Ua,7m7#+>Vfɬ @!KZh%zb$5݌`ьin<,D^T3,'w8M-};dȵWHeJkX|\(6H`\˂0S/`܅c',@p az^&~n՘4-UK<̲ױw7)O&YZ+pW&Pv0Sq] o׷cS{ejY.R)RTad85k"zbN[5 /IV [{%LP橏mtxZ1Нb,^˃UQ4Vwo-9=de#HV ܿe2侴r"s}(rjDV@:| B>v'ey.|ku[u[.Vm:#<BwA2[6[8u nFI|+Bh-XqTf&fZ+[DL%!*7=كP`X6EXD*\  &8o遶or4rXtP:o],(d0ލ:W~fFj^%9XwTw`AFA'.X{w=<&@!eE{IչفC{Y8u6T"16Kі⧟Cj*TѦfԙXNb//[:90) rm&eKTvMO*F)M{ߴٛN6j֧(}b|#4Ԇ 6Hg)`cDrr/wBFlջc-YCH􏹄pfhFF5Rq,9L-.]R \,p (c/TS 96Q5ȵqN{+ ˫ dKqIy0S~ S`_`^{O#ERۮVxnNgӟrHVQV;dļ w<)UX}JdzrFu+ C j\e:7~eqVճT{c\hIDH~U$Q)Sfh/^@Ŏ\JA 6.zkI Vy%TXCA0 4m煚gCd dZA}6ֻ-E/U< '0)iwjbo,BEA{Wؿ|B^>jqŹRSN5k .B*}E cWnOU'sʍYqL 33!5O} ҵ*euęYF۬h qY[}FLgߎ &_X=ɲbJ)]qDq^ * ѸO^|#B߄dƝVPC* 1M]Yf0V vpa1hD tnXPѲ>ʡ_6$ȘHmrHʧW;6O@ew}|7RHbEArNV__e (SװX״B z?.-~(ԥF&13 2qm.χ-N2#LӐ ade#'818iDtw$VHhX"$ol7n Wy fe[+6*ie BۉEa2T!΢%gŒJ2o y( ), p* OWX$|Ǭʦ`ORօ?S=](XP¾!ڸ~x{5uO[Xˑ3bkCUbPqc _f)5P9溌4o[M]kbݕHS)wK"ʭ1hC,+nh[ '*.I7Cff)z"XrAv !SSU6eDNڣRW0SԶTnu*ilEREȭvoW#.-P 0и:g2 Q$Tz 9YclnЛ'|5#XKC~D7uyJ &{.GwWI5U^7aF֎h6qr^LaZxM|L!+W=hiP\sȗ^iGLܨ'c92J#/RX YVOAGmz* f̫NGD.\Q$M zLmNN78 #LR%WDu+> 7dKBW.R6JW`FU~ErHpb+ M7^?ٴ\>_RfB*S -6Ed)&eQ0]ɲm]CbEeMF+bfFOe\VR5 1 #|$Ҝ,V η;r #c"]~a }*峯Y5Ϡ|W-%TUÉ[#2xzɩ1W" - ^0"kB⃋HNH!ej<Gl,>]p5&$t1ݻh"Y㬬mmugZ7}3Tm"4+Vpե SӲH-E<8#|8ǜgbJt38Yݏ,8J*׾]l4TcQ44>d mt!xJq!u9sX2]#6ζ:Is~D9{3{~+G)uO5p@ndž,?Wjsj<Q|n?tpe!Y ~3! 3+7t`Wv86([:lOH[D=1Q--nInRǵ)[ScARK3+|LU`X>__g3 wǫwKk**ŧ`JIc^{[yXįzo,Mb=oi^"f&GkyF{g^URZZLaUt\8AͲWp>Nܶ.O;@CP-]HSˣ0X:FI%op 6A9eBL{~>EsȲod|yk-~@ɧ,ʗBaT|: #:xy ғέCD0&x 86lTt0 >3n|Ɂkkvh5}Gj8t"B*Ԛ _Tp|}R0cZ)Dj* z;w?eN$1!g.5 ܱ} QZk*l df=y ]P‚b AұCM*$\VXe8 ܷ6Ae~K8W>)HO3:) =exӮHf5PDe-@p ^\< )_*ZDOz#UAr`o|/>}j !l bY&z"X">4< eº‹1Ǔn$hD \GTөX R9xbC8߉qWa2Upt}5 Lo4j=I J'US3?keZ쪧ÿn5Wb.;z7+l 6yIt[fnx| kQ=.zT<@ҽ /Tnϒ&~wQbIs?.&('4/.[柷8YE2aG0Ei=kyWdd*Bx 7S2e.x8I \ސUV iCǬ\ F,+:$lE<  LHMAV?J▸ڧ dPZ:a{_v 繱 N;]׾y뫸shk=!\)8rxMem#)W|?b;Tηʺ|ŕq4zJC9ٜ `WH_UgBt\,>[BLG,z+Ӓ}|t me`Eq!z8N M ju{XF;>fɈ S֌5(57P{.2<"UCQ=?Ϻ(R B >A0LY{iU󞕣31Ǒ RuJ`A/w%+܋ГACm~ `^l GCc \nI=I-  ">NddSzAm4Q>>F~}OӭmRAW9t?92(EX@4Qr5SUAm^'Spg+gj&}DNpiXavQ*u#~TiZGDwW" ż/rA}" *K{Sw.^rLků驻*sOZ%g}i~w:, P*%zT^HU I~(yR4ZܔI^% HM=d&t|Y6Ή4/FK!f EU-.OD'!Њ˱Ҟu}]N=W։k@=(b3L)j QIWX]Z*2,l\ ^WYpsշEkwM :Գάb8Nuk% .)--шG9HL!@p '=~MkГ;E??+CHy 72*n]L- :f:?mHK~'Oܷu͵;>"=T|<)Yi~QLʝc/lm>DBbd:w^F%QV,aLN;^\Ǧ]Wāȫ$SHr(!BIdfoW `EL$%k kF$hsFULOi.􅶐V.^℃_ErU}j,'6z 4 rñ+.xKT]WU4{.;[Cv~<*tJ ƲBR<ݿWvzvX>)9FYo-X4YEr&v0|86I; ݝo̬-pʕ2ќpT91|od dv]Fբ Q:舖ւVg  5\a᫢ &h fPƲm}O1OڿBTį i}5䳄E)ԝ1ӓ'>3]KI[3d X)[rw㢝후g?kj-v)d'}(O2 5pݨ2GGCǰf<70h<ȕoQuO.CoI_o=R{.ϯ**䁑oC" =*Vb{jg!ނЖX!Oƹ^EԿWOOhA(}ALȼ8 '_  &Ճ {uڛA%ia~wPx^BC0Uq\P0zR|]36C|PỀ@Η̽UܢBV7΄VKγ~'5_i@g0%cP4j?q,[JxW/\Hs ā1+W:wPq&9oESm府32~ Ŗi/.5ji[ L)*GE?4d\C+~цmt U[L'72M2`CPpRNYpM4zX&"&- (ݦԶ,*[[e*h@5˄`٤gC.z:4H&rqPe ߄hƎ ȘviWd)+ qzҲ3P\:*×Ne u"٢dAr5ŲHòB7qMלąu=)!Hn1Zi]S\ @] qFDgǥDI yݬ"ՉwL,4 09z\NlO%Q[8*3jmM.)I1] t9Ny0xfrV!lv 92PJݘai.L_l,d.?.ˬn F(,uaC[MǿV <#5FȽXn,ػ@ll(~}Q?N?*JN P<Fԟr%&?Qn4KY֯Df~B>(B"u_1rf7S3ItmKdI":, QQ[Ss8l74!YD` V0o? a~4>Ѩ4MЏhk!QZD۰dsVh͟ɒ@tH*eSy96)#ߎ1QdBL5j^z㊤ TEV1tq@P\Cu oNjKyK۔M[[d˾:r}2SYn鲂rp'B-'mryb/ad(KH$ZM+mYyXX-nE$8{ZtTEMHSx0>*nvTjx2A|:6Ʀj TF\ U*9ཀྵiIپ,Gڬ7ԛ.'n ؁G隻'г&E٠b@/ڱ'͠v^Cc3YyVȌJw@ =Xk?(ւt,HUI^aԈoP<زܽtoWb DpuwmR )RE5}XQJzfmaJFBY)1#> Sk59I)ZƔ36 O`t:5죛m*C6lWlw3|X1Hs>D Ci9X1nBX~F|$m0I:+ *1%=].÷룁֌bPDujKnM9!s,3l- x-\89Cq" ^MP>κQ!_JDFnHG ُ3g c% FRZ8>.;PA”{ %65g#Atk`o%y?{6D|~ wjW_1sѫn':j"_:C~x=A%b|Z]s$L  8 3D||YB@'n_KgR`Vo")H\{!S+ ;COVi{MRFD^rGoaq|<"55G|@$7 fEBi WW 1\tDJ|Cq-AZRQݣb~̆oOHB=F58EJC| H/Fi(Q΢mݶa]yntݿZkYl<a#b>ܟH' ҂ć _b0xf.qx;+3Q9Ġl, 2ؗB%JmK[w>h(y_VԝNT XYq ǂ$ͥG/[Yxa4J*f v(F$S*]}]^2:MN5n ;Y@j'=za_Tӣ󓠧+?h юA;7ؗB֒.ꅨ-r6}uJ|QA\'4>:S5˹JxLe?5) KbXAw*OA JI>QjUJAlj4sfMXDWoEf2 ؛oN=e{lCJjyM 0YDd?$+5FzO9ٻ=M256-Ǣ0cX_pEns/>52>#%o(f rJgXŌ1ZߕI;B](5TxV0א;7&ɯ˓ѭSvF0=CviU L1,6/ҫ{̿}D"t$|4#VQЗ&2 ]L K C>Nٟn B{2ow/dXA !fh%AЕ-obᏰKfq@&i)ުQSZ*4ȒC[N 8mȽo/7kܖ+XKX^Vw # {iڸ6\fN՜ : L ۇ+$KXLVyDxQji6v "7_gq"}T)H+CC^~nױL݉TN1^gZmQ&[oOꍌ4`Om [X(:i+~^b ,uV&W<]-7 &Q 7q R:cumSFήRƭ1x:.ZB5#[v[٢EW3^]$ Bv2ճyE"8rڃgԠd53-￯ nL *T%h`$)$@ȷ-(8IW#TIJ&8Y 9&O G> pe^/i̛Bie9b.ᕆ**/G<'S XiJC1٢%̔b``=ō/nJjmԻkDҡ*Nwg S%vC>eYVPƳ/ ; z nrojtXTH&jTcC4%j1m L`kڥ^2,A\݂N U&\%ܥ$-RݖATR/4d, =&5n.A j'EZPE6Q<> vi4~G 9I#}-WG 3j/@R/c]==E$yUC\/C[˄~ޥB@dK XBW|KjuS¼qDe;cSoJ% 63qA:BĘ浺j|qU|)5u!}?c[P]v2gAa) 13܉ xG%lcay͗_] .'ST X$x@@S6q#Y #{JU3)+9: 9aDakpÚů$iM 8 0ֆҥkM+#H;X+.BI^ VJ[*zW{=Wm13v 9s-mkI(w] o1s/r**E:}JK{N֭?.ѝS$Oݲ,Cfٕ\q)t 9=4kmeASN"h,s]ḧ́^Xs{!q\F^E47*A1z?=Idd#Ɏ_keW/~H!IE8%i 9 TǨrwӃcpebw/]lsz,`?$>=j"<4>Me聬=bC#M+εUw!_Ȅ*IAg9R-,H3껭87UM4 T!ɪWq+h-vKtW@II[V7۳ G0g4:]z* RYKd*ؐNs$E|1VyTaP2*o*KѠGs= uX(eo Hn 5p)!/yiP-|&8#i\Ne]CYᶩol_>U UުnĨ+K7^6OPYINE,Ms}bcek#$s?+2>hQ^Ej+Th5\峛6Ϡ>z;WܾeH ŨhZ12eh=(Q hM' u `i+V^OeZ ljP=m"I`![Fu sj.6:?v^!&화*nܲ pcIu=e-*%D]>ʑDugҏ2[DR:uwR3xoHOW~'2} -х8ſes;wȜnz|tkhEJ'xKu[;MI5 +(ELF:6JƸ6#bN=Ղ o;)ǓW<5 ڈ3c,)fc*sJI7xraz7ߪ0%h2:5d4t2|BLm.aQ&s r[.Qcx=L`|yR|wtb0=oMU3ȂO"N j>X/^AD.;#x415n˷ xjgMC5| O}8!LY$ s NqĻ)ѻLGI,"s~Ⱥ]gw|;3l/jK MYԪ]X)+',Q>ݝC}D( d :,yUЎJ/SN⨷@ 8@lL0ougɻ'"Pת|8dTk.E=ZFTQ֦t1ܕ{𝕏JKnݗ#Zvzi8u ;D:c5=EÉR?[b @Pއt\7lznwMR_T;"I.5O"tNE9483H&@Ή.|FcS9S(*K *d:=Xjv4]+ )ʅ'CY~qzk>=@v*$0]EDIT&s-ⴘ$PojSIb>̧^֪` a56;I+DoYUugPoe:G N #رLYjF;ݨ _ɱ sp$9UiZ5v,<}r!4 vGe_l2%֠j1D﯑(<kSL=s謣VGO =VE;'>Rab5F~U`*pkm[:Le}^;v0.e.&I1X=nJP@%.+A\0'p2yfszk;F(,Zx'^ׄXB)nŶӺp6ek!Z6Qu[_8{A]>i[fq꽺,uJl.^N+_ z57ǹU _!Acs\S%Fhg\ ZSInE4&ݘjӶ,W$ I^<~o9)yjbY†qP& YC\N`B0ÜPHÂۈg,7a*K6A./ZӌWFr 0t}o4BN# TD Ү3M"vE8.k"'8Uxq"MCѽ5ӐJAr/6HTW!K !bw& :hTօ?z$@5y.28| İ%ᇄ&Ŕyϩxfy]@,7Hm֎FHjcQ _{`XCH%W޾{%7#,Dj5gAG-"n&a3;qٺ ʲd@j+'͋95};}d6ccil͛FW<1WٲË"&P!5; 8%1F|Q0ϒ7d [q(ߞS=+`( w)jFE9V/Т9#s{Əc/b W&u$f3b,6A Ij9 "vk"C啡 ~v"+5E_W@]Nq򚻇Bq[RW@(SKNJxכIB_%{;p/3 xyr#m$txiW{t3d'M{6Uf\}9_bfSf럕/,%eCi1s V É,6b @N^J 0`0čVqib@ci /"qżIp~Ċ,×(Jw0*g3H3>{OCdw֭IIIw*ߋ:wO.|D<|d9m`ˡfENQtg&|2Ⱅ_H XI ED,]8D łQH % 8:d0X g0nR~u%N<En]Ckuu|S4ۿ|e[Dğn:F G1b`Bid?\ZEt38f]6mMe<؆ _m@jH4sn*( K&@NOAU.. pzWʢ#!.;í.}?m1Ǚ"fx{Jo'#6,Exc`7=ld 1xUǧ~Pj&oX!y2;y\R}(T'>KI 1=t_LzT Ӱ&"4%k$D$>r#8jn"E&wovND1udB[;O\כ-[ 1#ĻOYo ´ML`aY )500Ϭ &34IH=,3r鯸[[HZKcYg~k*Mta iFL2`SI'oDUݍr)Mgj}*!=P.TB G~SlqH&X́v|z׊XTlhqh= y%r+5_ԃ5QwȲEX _L?9le_Lt)(ƃvfL6tɒbZԻ"A {G?%4lZď)8pܻPHྦ5eNH^=I(: ̞٪-?Pi|]|mpd| ?sS_$kB~u+"3FOdlG-Jߵ՛xO#҃@)yT;R|9 doW鬒 &B pCwSG}X1Ϡ|$yΧ7]LeV oCNiK4۶5l`&O3nmdl>$B_vh +Ⱥ43=Y+\:kƲ딑^t = z4R%ACE^?\p6U1Q¬.r!<jy+^R=&b`Ov@:Pd_ޑ7=6xP<Fw;&!N]&"s?5] {xs4+PYs|7dz&-!|d!yC5vW$}.6*1RR5ow_dngw$>YBꉸy촥rϦeBneT, LO= l+nX_R]}K! ҍI5u(%v*s+A`>qȅlvpp /1%'Fz]7f2@~:ԊG*䣢K~G/4% ѽDU%ǙRQr]Du =oI]m՜ak%ͣfa,\KǴKܝD~̑$"6r&͓sAōawݍF{ȧ &-iTp6G>ѵ(G#qJQqX4/_k +ab"]y̧2eܟLOq?1[ V/JmСfmTDasn'H;uɻՓ1Rʗ6F7? V h 7g91 mVw/?^W+2Cپ8.)eUȨt^p!bg5<.` tS؎!`dNƮԮM~E)Se%^r˯]Q B8U(D& ʴR X)H *8ԅ^.l\9 c"-G #QY&wg;4z()lE>!׼D]1' ">:U)$BfP_Z?{%tD yR@;!7޹&eGQգ[c8o=Ufh(MgKI?M4( ս:9k}`_[>ĝ=|f'4A:)bT .v, \uE%" άlp )Y;^L ;rh D m>%ob\"#6S ᷿^Vgn!q0]8VNJ.K4s%6@1FwfrZ6@j!8 O׬2]1Q.j +^ˎ34:xKXnNn#; Uϙ24ԿV(y+TXetBO|B!,{JY[$㾫[d;`fg?M*ݲ{!>Q6c\ kwmC8fyw C).u;b;!s6I"<X8'wAR:";>_ X,)x|9r=ʏ!+ŸZJ0ytF`7.,/˫45P1H-wuG~c>u(]7@> .<#Sy;/l[hE<].I*kB=s>"tl0"nRSѵmjy^ D ?^$/Ta:sx`qxj-Uh5sWDգn/gV^!{ \\l o]j A]5ݡD[r;{ixhrBr?((%?c_GU%m|MyLc"x|V9ا6g#yof~Qspi|1ݿ,{.B܀w<=~=o]],|eY#_5Ood[]$';D̀ (;ݭdr@mNaӊ ՌS>x}|X5ƈ3DnbLC>Ý\j_SĮA9kv[q66§ g=`%QWq%Hw< ?_&x%lmM v3i.ܑI0>v otm [IO!S!E\op, I*FAhr2_ّwb9u4ax1 9"ɩm-rDZH*s=xhh[P*k}؍g aukӄ1B0UΚh1ꅙ[>d5rUkCb#s!ċg7dRjػC݈'[QmKU9T*kAeP<йq4YU; <>&=;HL r(-9@[bE/̦ݞ8R7c6LrHf<<_f6E<4/PDpiѯ&..Dh08,i(7$tD8n\ߺ!**`ㄆH~eUUouVfBMW:4DV)+U^;H: 溗B,'~ q.!]qLt#L|[irڎrލQ7LY{x 8Kıw+{ZR?QF + $7gftPIUHJl<ծJ:=Vۦh$#QJï^(Bp ydlsH/^$~ ua:kQ]ss@a[1SP6t\(m/u^9/傱-0e p5Öy 3 M7݅ի W('6z@|Gqr PcPޣ_hv`S:S,KFF’ )T{x>zt(V*4 Ɇw)cK,KLwvl<'_{8ഹ-fchu ɥd1pJC,:F)Dw(&rJ$媅gUN/t}446 S1ظ%N* ˵)wU m{ [olnTw%y,(q̿.5 !wnѫ.,ѥ7*Y`*BӠ/ q %Tg=L*J0䆙5>rbdH(fkZ 8 h"l8 Dd{ìGO;{+ z- h}n$@ý+[֢@ad KuKlr5/%TFGZ.1ƽG~BͶsyƐG QDns$m¬4u^ `Z S*.!Uzͽ'-SGRAj{2jn8 %k޳_5_EmƕMq 0OʨM U>[bR ~9x[u$Jao0p4hT{Ln:-Q.;?^ @孲*A^k^2^e]mUKrKp0H!BrV,6шW T ,hmbV E x{`Y[ЃDAra G$4C7F t93"DcD Bc=aըtƼ;ԪľbZ"m=xR+/5sfOD|9dK-kcD !xke +ò"̮[FܹݕX|8 vuc=+G(ǡ ]7J}M䲭Qýɐqt$T~ajtĉɋS'9_SB`t:?59jF'pP642{23cd >UyR<%S~8 s$0q`+!JX$"7k>o+F"?RŜйԌ#L@u po$jۣDkeL{0C{fݪ͓:jNOC]2LyIb?OuR!w2P1KLHV;D@yV|W_Ũ h+Hu x> > )[oO3m%7H1eof/ED͙Nh隕qeO8ބU$ضw{ Rjd#vQ Rsپ.dg udɖ -[?5΅^2 K>s/tX<|yj2YX=;TRtqӾ"}AߩelbYYN3jQA:Cr˭,s='WӱCDcPDUStux- %cZӊƧa$G-,r8vw 7e 2>R1KǢ\n}w75Sh(i%ȵ|4۠s?14`]"UJvЯ)K;ǂ\3v=% y%u3`_Bot2/~hed,6 CѰ%uyf^YD<9enR 3?mK3l8 ^B^Dl4DɃo9?Q9罪4]#Ҧ"ȟB9z䦛hxzҼꗦ0)g7h@ /bX p}~"e+#Cw"AE}>@gsg%T .Cc dAԱ|Ή5ߤa_O"2L +Yǫ-VXrpk>S~4 9XIāMeyH9ECP 61ɨZ= db.2<sr3.}̟M160!s~*>۷'۷_pֳso yI>@SEf;ZhUKHi*x}K;nJ~? T!(G>V[h jcj#M I@Vyb44yHU]KS"R&ȗL?WQ]b<$2dH/xݣmi"$??:RExh˥nט)Wvb<$/B`#cה&>bl~4ZM9? d"AR j; ҷv墲?ӓZ`FHKlLUX}L:O=A@4\etOuU0Ny"Lv\NoFnC!#14`$/դtlҎ)$"Њb;BǴNv $eȖ$:eRʷgQ,eWu<&a OO'5q99rli);CSmzkOjw(L[s~04/lK}SF̓)p;t3rH' qBq+r/ފRvB+4>5wYI ą`Dy[mM ryceL"kjIMuq2 D֞o$ƶAHiIM4f|4P%G?Zǰ"wFQ)vJep @)NIf12et +BU\͘?)xw!eDc97%7h%]!3[{Ǎ&-$aCW*iJOH}0Jgtp. 5O葹PgwylJoݰv]bS4"ZKy! Q'iVR dx|< 2Rwkh^M9o avp (l#HpU)*)ؙ;-~ ­Q޾8M<)}/dr"m5xZ-4 EKQcb 3Ϫx!> :f5;sˀZ"\4!% ӵlʛGCAQdhho#U(<&>m7̊T|` N =*F `5:Ƞ?l W ?T! d̒ p. `shg#*Vۈ\G[#,JbZ\Fs' lgXںb:[/$ чM S&Tž H=$4p'Kv?DאC3RxA3hE(X fKCf]+p2SjE<υ5hwQcyA l`<8jM.q)1x属q>Y(ky?Cz^r:dw蔟ƱYCA1^9V9" m3J|ZTu#?+z}3p %Gx,tX.SF3PJWFETR i.\lGK-l` ~#3/Qe/ZYJ1ߎ##{r`ȭ4_t%ZoƦwE/WabK'o @Rtp%#.wTU?iu?H-h-k@7Q[_1gzDmN(h_HI2VkI4ꕎ~pwˉ<ǎb@|^u {J*m(xQ Tf\r5.%aTӨ,gՌY3}U8 O>k3MoaY֝(Òjsl:2S!E^f6ߌ']Q;!yUEGOrytm'Xȱ(h_p6&/R>J6I:7xh m߇g1'$' @v'HQO]"'-n*2 t]WVxv/MP]=9@%iqpDɃ_eY H/ǖkE~[<8[zq0z~#ׇ 8ZȃU8@g(友*X~ٛ:lX f;tC?m鸊>mE%e^@ ,mૣX1.c$G4/6$c(ji XSm# aVGeC10/=FRE i^vJ% Eg?) B7_ЏYsbExSd|W;uF1RvZ^,ԨעLVy==Ku!j+F|I)BA#_0sn,`!tQ0Fn{xtLT;΍0,R [z8u<˒ŋ CQMP2o.p| 8)!:<1`k-}hՂR86#0g17v1Td @b&$;-mіieyQoD 9L׵YCjQ;% x$`71&2xY˭-G .l "Z'# :CS N>Ҁe6e 87'MV~ExfO>d* b;HgZR\dvkNfRuKK\o̅iPdP3K@< [X<%4jݼ>lXeb1E۷7ng9lu{F!~䟱;"1 woUlg*R~$9U_Aju7e}#hQo(>TuQr@tߍ{P?`OXn b {v*`AlDY{b_hVj}f%OajOOoNZSzw}u)`K<pmocn-3fNfw1ThT9S9/,"XL?)_7O}IZ3ڍ=PZ SԹ?ea5Ĥv{i}8d#tj0?8*@T\1(0''bV4 $+$ i6PUAA^:|O+R]2AעM$ 3ʊ;K}y[~ʬ34اtX]pĮUz r!Pw{އi3-NvT\q;By'j0M~{6xu \s"hYT`H  ax*m#;rWeѦ\H$GUM4U5ޕ2;#!WƯ)1;쾉 ڬb)`}@4$ &>ƴb&*ӛ!f A@Qph*ka.; _5140- rFxjb25AF%ݴ#-+ &_%F}71t[ HƘ|\po1p@zCHлۅ[(tgNy&[9 WIe$ɡ4]Q=[:iCR}v{0QSsQ+hM]D RΓ-Wݏ]u@ke!%> 4HBc.>"iϺUUu$J#8* BJx#($rWʩo"i4&c.୲جLW7.= OiNĴ>X@o1%&d?Yξ^RgCd_=EeXunE*/ Lc:aDX-B{/u%E텤A"ԉ ~g(:9B1c+P>Wb 4c1C"0E[h"ܔ,w $GP5|_oçkg.N'΀ǘ .dH>AFVГ"[j$2.T1#t'KYI4YO%Etޚ19;JtO7VLFHQxtݬL`ͮ&0Idžpky:>?Tؖ0%bJer~qd;LɆkRS+ vBc3aK5'ځ`C9nb%VM:K)4-]; Ztli㠞<ضՠFK.js3`qc,oG`Ҟ< Kkq`>Uf.Ͱ/E2a[})V79G7spƩU,}1] <) d'eB7,%H&ה3GX+Gᅹϝ2G;BOD띳sDׁ@bY~0z*I\$5Bߓ)'Qco; Ǔ忳rNIEg:W*L'B;yCIyGwOC>[vXd~b=#5t|KMy :GIV跪X:Egŏvc>ڇ2,w*81|02%tn|^ q"ۜ68BWP_6%_s ˘1YpofM;g70H_1c1Ѹ%9)lJ1<.]hpW'B޶i<:L XJ-TleM0kZܛ " VYA +l{&Uz[6HRxzT+-ʞOSd'WcZ[sE5*UQg&_@ jN} >/nz^rUZ:CZδPHzTm_yFLy L2* d,Et=%Ba(Q:|hb8?ifSO 4zļOn1Ψ}o"=UK˕6b=:ߎO@wWk:%4ߕ /jN.5'wvtv<vL6]FʰւSxq0n}>R/TC5qUe90{6G\C Gx<( e=t ]/ E\{N= ]WHr^(XIɛb?#H|6$1W8ep\ؖsR6UOC&AR?PK7cTAoN[pȞNwxI2$?r#*3]5xsF@ 973tKsga\0MJjF4bx2:5$~Vi]a|1b>zosD~r5M2x"T3f=-[84 ւCA"Tv-B5|'R7Fou;¿U fe=*z($HdM! ,{xlxXd]4*zߚ8P>G291h|A,o7KZ";wbV"60D+ WZG'y#?ns#}ޒ d[o.SEAz#sr LQA,CLѻXeΰ4YD@U)FN5OsܗF2`w' O_[mhZL9t1dI';)T<ܜs8l\u[(XowL Vo|B<\pE]"dsU v̀+1Ɠ/KZ[xO0Q@H3߰[te}UC˯"-ukpB`Y6wJ褒|F # ff꤯SmϏ;}'s1ɣd fL3BXX \Ě)wR;懶c3)̤6gZ.2t&-0<^./DN go75r9S-s79v,J}ó/iD7K"\:wDh04ij.X8_&0˴F$EEprgv;KBR.<0N^ˢD[y"?z+ |Az'83(x?RX=S ;d ͎X{_Uvz蟷-$O* 95am8цug"a=o4'fF1- enNuܣ:1J^zx&75-Mܖ+v{k.V.xqLbWJuʹ{"!dP8a΅5nnrl런 Ud\(a?sEb`%K4`Yrlht8v~ɻW5Kd^uCf 0'-]%wbJri f>/)$,hM@c 7bĵ|_$ QeyձXe0]bg( H.8O5-ln*=nW6h g4F]x | U:hʽd8&0A]YNzSxc4y/8,vX Mp8Q:7 ?}2v&)j6Boݬ*wBz6*`` -cv(*/؊?/4?)vHIam1FHF: 6g@?j&?fZbZ@"Wڑmމk *T,UUbp?{k[A-jWJtoŻ* K~75ly]_mLh07}ѻp1u=292FrgT"Iѡ;*fC8F4ɑ&}MÌ4;qogߒ]u݀Qj):"BlX΅Z9hmtF&[dtf7} I]>!_- "bFGXR}njk:B=S2'$qkKpa:q1ѓ%hd-=ĤeTtxnrWl#UA/=UG ƞ}Ɇc''a=޺d`1[<,c_g&OҌ Z:Y1SeM=Lrpy-b-SAʭ?v? ;8JRE~ Q e)mRĿ/hn Hy2.18B!5LMid(uΗi63]eFvkjpwGnu& Zs6t9{q>J"6 RrxیYLopN-#s!ifz=;zһ2qHiA15?E6:Cbn(t}# ާJ~YoZDCP>ms{ܘz) zEΜ֦(c!0tx|:4^\bE ӟp깂†Ft\`b7%k*hwD|ŷ㱍7~&}qABE!0| 1g Fm-wiR7KI - f\3M1@1i7D{lv|=K㰱wjQuw'c3cmJ<K70CM=h*| @U(@Б-j7!Q_:*msmc{"$*|mֲcX+N`e$iRysFy"4/v(hOe.eYӼD}.1tf 嗻`EA+R y| а.{O@ 78HZ~mppM;wSXQ{lD3=U.u+Y$73urqk֋3& O7d32\Dhqt:y_ySq_dZwtYxfMm ȲL^p=zU,o,w[[܂wr7s \SlW蒸Oc=D#IOpGV~ƒ TI{):~#/h9tƂE%J+P5syEգgh8S J1h,}[mNΙ'[+v;LbބvN3fқ ) tv0*ⓔ1ŦG$:L[#%'~Kd)e䔡`Y~}A߭ j,Ww-"h*p9m-)G{0dA ('nP8mg%3GE0]^)xbԦL<>L#y9bxg]RHdtrW 1vb9T~f"#!_g?ut":w6٥izK]EK:@#M5Zpߕ8iY 'o.NtDD&qf\J{[4\򃽤nJMR˝@qV/s0L5B`lo+wW]^KHPyhTAByd86 z !)9gZg.-[6@7m{-ilj@4(G{Icb^ic/ 5'n҉T8y2Apb!UIϑ$u e,Sk!1 XP4QR~<_Rr<}dW$Sa2\6j,,f#6mkBt?Лd߁%_Mư׫/~ڢҺ ${\Tk^y_@zyIF0"|7 !INTZXl O̜GpDW>Y{F֙0/C?_d]]5Ui Es4ELUON p3c^TR_c,69J=DMR>.}`~ i]B;v9}NjX+ׇ.0sҗ@}'m}׼K6ƕ {!3>Cy灲L֤4r)qWKAPzNpjPd 4yn[ #ጠj#ޢ^J!6 {Kψ[qfQu2rD5Aj=^pǠݗ~.{a\zI, UZ`Ѵ1GRD(ޅG/__`($H'{\)MNJUIVZIָ{ |}~o?Xbo˜VQZ=z0`A)6n40Da_@U1JO \P/*!=t V4h'x'Cqk}rbxMZ*ԏxZ-߿zE3aPti;\ktlW.?uT зKbh<,r)s\2݈W!ceJGHj~aeF~ǒ0IdϮ/);Oduo 婘LDcFo7yPƪ]mSw@ S7bՒRza" !ޑk^tBՠ DE33ĄC:46д:[[}`'G* %)y1~{A"Q(,xkL>,Wi`Y: szjL۔(һf Pf^v_nRIwi GlggͭEUw"Z:# O*-Iki *N~+a`ݹĂe >0?شn74;зg9akț6hR*R^ M\$2#]!А~ +': ["X Ft^Tg7K]2#IyRIi^SQː UφM& 8V0QR#^!26d~b*U#:eN;i'h̡aҴ10jy ȔiQ+9d7"dLE~A[ЏW=D3\VkA{ɜKZx*̫WЇٖלa?A-ubSOl{)}i Zח޲?6T / c֝-D0y| Ktcw җxpᴻd뱖"u+Obg^&k7_=uw Pѽ ,zm &0|vjFomTYe{\J!px&"@ݟ@rQ=R*XrgQt]h6 t@H;)̥BO'h0`WܘF[E=fqEjN7G .+: j ˼Cx08w,C|5Bjciv;HN ]CBetXVe$"7RHoVW]W-: -<.A+EÍb?)1ɚ|iΐ%ܖ;U؛Ht)@`t7Zp福= &Mʊ''9%uRGG(DDEN폛L Grc 5"ڐòDJ}8.\;fc"磟5-,mÅ0tƗUiM[Ur=`w~3ǽO#3-~N“02^(x5K X9brx9@޸@05ͳiiIAE8ɐk !Ab/=x,=tG*5>rBDn9ҪŬ uoa?IM"Ze;{qBQt&~5lhH>#\եm\b(\څ8}pBB8OUm͐2.\O0\D唫e2ZgqN_}2lCEOx{魨.mA-rg,B1?#hrco=@0%x_ ضͮ5֖rn:x.UCF-oxK`?,;4`o$!QGs~H6  sdQ:]^IPp%,KVX,b>ީk|t_[ 6 ,).R+0@-bSjhkd.h[QR>@ϰ :Yl#]d@_ҒS[S.aWX|]^#2Cd٬\xܺ.lBlTßoέ(54'ժv/- ܕWjr8*d xuNʄtz.*}5N egڑ'B0:nYYsSj4) `GHdhV]u~]E/w#b\N&Iq5te٥) y~ĽI 1K֠ҁ,Ѿ.8NtݭLw%f˚,Ѧ(~VH5H|F:7<Rhli!f^4z. %;΁ՄA@< ˨͌lO"CeaTHY DpNeF|{nX? mz5a5n8 f::sth*G/g`:hQdm`v5Lvbn A'Cfrռ;2*Šj+~̹(Ʈj'Vt 4Bȸlzu{ه | ?SBBHqs3)7#f f%RdvH0d ٛ%C>܃H(NrֳEU!T AlDi+ѻy%XTn%+Գy\6QWCn>GV̀$n]R'g<֭{C@ШH)=s݂aA 湾!IO܂=ʾ2?vy'=B:as\]Ýb஋"䨏$n`>0l),@Zܕ`OU[5_]ޅ^AxV =}mŢ+,q+'bΛ-ߪEWٺSuhלVzx~3;wvaq(ΤeX 1l2J{럄@eҵ;kv ht"  D-%eE7oծUZLw_ o['Pڦ 0'|P,z7?R)Jn+ЌLlOd&jBdBβ1-yn Z, #hwLDKVKdhtv,j?MW)a\မ ݎ.3VE:mDF¯[B>TU7V"[I[Ptn|&['A}`l=1d$L13m'0/Z-ph]NA#Wn4x SXja(kC,- 2kvTC?(@ eBq<+߉e>Ad rfcV6TW>iȚٔ &z~ *HyrW fAJF:}= pAo슻u.tYVF!Q/h}'Gy3I.%BkZ#ncp)xTGѫQKT:Bi '23BRp2:0%{۸"hԕ231PU!ݝ},Y$U^@YlL9 $"gyV.1xCbT>B[lcSRx'HŨfulubA'(\8OP:7 YUqa5#q;LmCd7՚ia,ޗb'qƒ`D߷] Cjde㦀rtS("M\Q rהQ)KOhpBOl߼gЉ[BeS;`XOtYLD2-7Ge'ˬ 7x̠ p_͝R:|AtcfSԹe1svmq/ Hþ})L0tعSғ{",gFIdBZĩts[QԾ¶TghYă2#^K<@m5i/lz=/Kzf{`&acT1@k5[Az *g"bVD3)`cqY_`FZmqu"8ueah CkK%urՊ !ȼH"aCDI%.852:tbЋMSBp>/uR/()[b^QKӶ%㐟]29uR{J%Arm{:HE/12~Osj5$mŊhL͟H Y>|:BH&I&>]OQ!D_KdLb|mdzbD0b %Kp(H;·4KktrkHw7o|(=gk=f+¯ ̋/a׹>SDB Vl-.I!9!J3L]:Ѩi3AQ"c߈C7p3ʑk,H(}] ǚvNχG(uBnV)nutX}S~ѨF"; G]lϦFYU3{Rǵ*^BnD:N 8#:l~ ]pkm? ?|{yɕ Hi)ۨh7|c db7Q %н1&DzI {Ow_ "ǁԎB CGbF]~\6$q λD# F9>dT}NH O!:QqE\Y@{ܒ".gu]9|/:#snExҬHSAnH'&-b06ͯhZ#pLқY sEC0G̛v;L[~`DavҰ(dX~}־ޓeƒ ;VFPi:>Fo,0L1+MvnLzqB``'+ϠGqWWᜎ#EɆ^۩LlРņΫpXfncļWL zbR~8PW B(%}s&%j'#L[շ~.+ `LF#@}r A번DNn)=ߔ:ܿз环jsX- P=s{ՍLyl.L ]dO 4Wo{SOB2Xj!h UP# GT) h:||CUm.AečծzIz. Pʆ< 2ThFKRYME4RZ8%+@ +\V~(L,a/ik'5}v\HHg)-3s ek`QaN%\`9vT4TzV^k%oR0B0C omΩ6 /n*>V݂"6ю%?' shοUCu嘀qp]wf69R&cF=y 9MTk~i4g]XUَ \k>qM'L0;*M3}/@U@I.WQzS-˺IJAi6~աֈU4FNȁ1!q3V^ɶhq.@lQ$1U$! QHű۱}LNl[M-Uf]Y-;od$禡oB֠9\a׌YTkVZt|?(T~ 5˒A\;zNqŒxٮ{cVr^ND8:ڈn qX$e}(g%/.\^qѨlsTYw,d8~rw`L*j4ܖ%*#;5 <-/a[Bslpҳj8(#dKǬVem-#|UODEzlH>2ۛFCrѹ/txܠ?5t pRO ݛ}P`ـgI8z^CfgcP:#b`?jin@ܫz vs%ߨ|Ɛݘ]BL(/BukP4f~uS KP(e2/6H%fbpar, MCkpK v$&Dyf+0EQ`q5{ܶf&}o5-Ew!w,jݵm5 aK0l}.tb4}Q#&d]ksY}Ik##tYZ"S`{UxR_A4њOu?Pk&PMU6;VBo\nxV81|C>gK:'\DM36p D{}GY]H 3'Ep !SZ47&vCxmB.`TXSފ"&DBj;vЪ1[L{֩Xk [(vǝ"[<^q$cV!J pu4-N#mF,~^d#OM]Q=pT@1$$Uyv[^}T+":fk $˰Wև 8[/P&% "riUg~sn8v??_ JS!Դȧ_ ծ\:uWxjjCh. dfI]anhqpGЄ`h*5Ӵ"E(ρYg4q]S5WU k0n̽P":0}eYD'B-`M B $?;4gEC0RHy=6so&r r j0Q,ıΎsk%ѢvkxQ͋u6.y-L*DWH(}Q^>qՍڦNoX{_P NΏg離Qn'D qTОvŚt3jPxgE ҵ'[Astz`gԟ=0W; ҺxFEJX*[TW(jn:viڬg)os{3j[Oej?񨠿ISAP영TΝ՞TjTX#jHk27pM "mj:as5*ҶGGC` +e2֕@Įu$f)Nb޵{b٥vBo{Y3F)E"9${F,h ]mۣrpLg2q|txlǁgF7+ =''49?[ zTeth:dwlq2]uد뢿_h F;Kjmp;q⇉toP;8(rV7g{]ߏ><%@J6ai캛bwUߤ ipSaksK |NM2y51ՎVϦ~pZRQA O`tMamkZXȊ3a{L|$(_JjOY=;t{kph NwӪɓq.H{(ނ'@XdR:F`(i:e ̌~һL"S<҇"0:3i QHHayf#!D /S\[&~KWb6<@|)H_ئ:q(n=i5ᄈ9qR3A,AO|M7C=.?A%"s%V@˜A6@Jy.:a ~+׏ԠoE;H: ؐxL@9~cϪ9% 1`l~k+E-ȉp?+uGPO[0SȮRֈkWvA޼{xJ,tH3z=qJeK$C0 2ϐPhuf "y&pVCCP(GLceQI SuՃ84-@pM|uTWkך8ҳ 2? *Ȍ^o4j!\j؝Bk ̡7{r,HVhkf&]]Н54aoѮ>gt X7 MeYMnVM~CQ=:hctGѝ}%el5Mo*٢X:B̽Py=T4{Zqu/. "e1;DWh<\P8 -h *=U'> 2*!eUUp$ipĸp$/[e?z'-e̾SZI= R (!zIlV_L@On3a%V!rkwy0ݗm٘ZCrDa[QZ hbRTsbZt(q[;`G uaCTM7׵I\&_Xb3pWRE𿎦}m`j7t7!G 7h_JX--=ΨE&xd1MnXFj@\?F6_e2ENL/ 5~i`{9φU'E/ <\+FK8\_ !?[QݷoW׹-ڲJic̹@ֆb|nSH!}u|v:>б02@Vt @Qdl"HIpurâZ>[/ ~2kcjc~nv0FAp25Ap\ٿms} `J[UMm we(MPI F: l"ԭCL-o?L47 +P ^]K'>TI/]t?UPKB'*0ì;uU  q)]O!zo{Ud\onpnF0;b7ޠa8IvgV3>!nːEm$R eSX!qfHʦ6Ҹsl:Wr) SZ)wHx7}fP$^w0_X楟G3ui]ock_~Gof8wchOFyRp q;2ԯS C%V$yEN v5H*:x&ã M{_S` $%l.c$S ,1lxKBo:$>r?]9&uhfks#"$(e*]-GsYMmApͭfS e_\HɃ.K)/'R l_IƦ0+H\EMS$2Ƨ:fece hWs*7uBt UKеNn]V&QO;B(qZ@v|)W9>!y6A9띷LYTfq tKnq>`dI~LsWs*ho{ Nͤ Np;I7k[A@ԤioݢkN\YѲln=v{-x:Bh@JNq*;ؖ1c|uWXr >&[`*6Xp")_ID6 \&v2K`Cm:Zd'8?9Ovsr}5td*]sp]o +jc13ҙIy8-  dƒd_-jsWrz(ՒśP$5ʐW1)Nr[i$k&U G:蔻Z_r2tD9^;e У@i1Kbv)g`pnԨ(R#,U^# `ߍEY ?jCGpI8a&0AG7DM,yc(L]? Ā0r="ѭSG@>:s[)s9RUAC\,lʷgF nW׸Ҟ{J3Rg>GoY:)7D~zo`>63_GP=2#7*p/j(<3^pIb j, ?dnihÒpycΛ&48ĒY0Xējhظ:03+AN@1(a [#ٿċ{P (c쩤zzn=BY?Ə<Ѩh9hFhXM/W#Ǿns]ʾ_e7G䶨9оD1)-Fb*iGԃ!%Cug,IDNa ^Gf~lJ~]iLQ<ԲO%vo !fxqt&WKHZޜjJ\|]AVru9 V(T%$&͏"@7H T_ pG+k^>FPGj]>@~%n\n∿40Fs`%?ĹJG2"ZSjSWUb!/K<>BWCN]}m ;Z~JK\ׯi< ˹3bS!ezG?M0R# X| AҰ'(CT#"NQ4yf9U!VVXj,S~ -p0%13g%)^e Q;1G$10A!`cp><*o$|,ߵ{(n؊顜ˌ!'7 _ʗa8NM6Vĝ^zHn>MH $՜('D/p3h| QMwHJܨQo$?lR}`:Cs#2Jkp"&^6qrP!+fkM{. 2Wd+ZrxhȷԵ" T< _q@T/Ya _,yi Z+hX1(J(:vqlLI8&<īҔa }O=M DL cuBQE$ZU<5N/Lso%p60g>83xp'pm2Nu"›$V&zRb616a'W`1:]s{~l6e V /nb| %3#2Zxx\֍H0)-tZ|c)mhA'ImW`m%,O ZFT)$ O1Hi(_$Ol4.W; Fr؜(eE".m"Y:P9P{')n+Ȟ=бds+*ҁԸ2Y{rz`ux_jfX,=U1?:FGgO l |4_FDXaUX}(d[RN`.#[z{>xvr 2)%~ C/}|(ꃼzPq1C3 )qsEDLxB4S}ÙB $\2cfGZuh >v=;g+#.jP9nR7{2tqyh8iH;g jMܶcJӷO:.eS߉dH^k0uYRYq3FXatUΆ`pN3f]/+`6ԑl%9*9 e0;ɭڢ&.̈́1q #} u%͞p][:z| ?6Ǎ~oo5_d|r!7be AZKpr{>PXCD}eTO<w%uE=&wjl-W;IՁ4#4+E=vg"胓I#|| Ѓ}=vhӀ2~u />,#נ?A&_Z;`[f ,Y=^+~uey@r5`#?njD",ȼ_r-žRg"jqkJ զJ]r@c$or#J91 oM+T6H)H#4Ⱥ'!F; ; 6j~b)./ g蟔GG.C+> YiXzFnc;5hViȺN !o-y7e0OhS땢DPXMgraXv`6$F 5U?۪n*R@렟XwOe=(-ȀT㢠.=*(~s$ճ[nVl*ײc]9=3g(ˣCV tI,{jbxȚb9 ,J9", ÆEc ips/BcI]((FB9PUsXhcvEKXhx) tEg:+TH| X JPbRX4y!qALDl[J@ӻ%,;rAPk 1L쪚TvL4à 23EwJjMc%={swgqQ_0#i2v:YqlI wsC/EDi+6P]`%ɜ]cusK%u@mQp0d+.Bo(hL$P[`FYE$/$l)}v4z/D~;oLd#D%pѦ092E%!D/89mw*,>۰d0}?D&TV|m1o1m;zQAm;҂̒N} FG8Ë6ji4WD np ?'a!~DΉ#4$ͶnG½\R^ q#$:PUA1w0Q{܎NZ`O+#T!p$3[('RJ^1ϡ5 к>$XL=9&R*׏_e>Ŗ{g:m>P4)S7jjMÐX{ofVZflHqiTL;JZoL֗;#ƠTXj=I"yLٷ*$ p{'4:UMw˒`7iER%^nc?y3yX?W!K!k) $3d9Þ%Ilݱ$Rڥvv݅,X1g`srjCzop7_܂=7D5-t{>^p_>HpHh]9`Ѭ2rwuLG(ͰL+>H,Z$eAz*HGwQ㭈FwahS\=M_WpntUxE$ 1 qe 9>ry͌zB1!?5˕\Yo%&t9"aeUL*$~л}㲇b)3$;.!}^N<5J{'AHBu>fDﵻ5#lDdd5E!wxjsd*6oĂM4q7&;-z`їd̏23iBSw–T*v =e< hQc"ne.ynht)CQ99b10@$ Jev3eoQ2t0Km-@]F`dU.L(:DˤkdQ*Gj)Mv40^9kK=bFg&.̎p fv[a&=݅ !ǗQƿ buFe(' ȭ H4+)7GcT*Ҥ@jHұD|]!0 9JBdRT M0:"AUMtQwL8ZQYhӓ/3)J1׸ 5 5wEes4k4I0ymgS>aS}ͺ49) ].مYٞz5Z%?R^hO^e7T1W(;lc#s2sJX q*MJJr 66NW0{fVp#dmj߶BkO@KЀMp_I3 hRudR4:Mdڋkz_#ޕ5{V֡OߺEUO#Pv*JnwSGMKr_Wv@֫Ѝ%I.Ǡ$;f.F,[V1fn~7VѵGv,KͽPWu*bQ7GE4Ks-s5hMdv3z$$\{e6116u 3Kx%yRs漝rg2X^{oģMZ!ټ/l>tlH+ܯp :9H?%pL ;'jrжc&1m# K?^$t^5 qrq[p8y0'ȴ"e-jJQtL43ê-KvY$/j [0ȃ$O4 =8 n- ?&֦k3rwzzl(攕(f5[.UJa%^I7h<{6P|A lH&dD5ʅL A aI"y^1@@1!0hl` f8k#OVft[j,IdK~`(! s)bܶzQ}w;7q{UtMlx' R<De37L]6NNiMf1@֢^\]dԤ?~!~;(X^*݊@c1 .=zo |ڥBBqCE="OhǴյfȦR25¦t`^1_Ⱦ"旡%Wvm{r#RR=?"Ƈmg{f7ӰpRpVLl!,h`;2 Z_2^hc}ō Ekt'کԖMs16cG5eRZlk(í`K'DA*+ )uCTIn0n1eDՓk/.,=԰yͪ@ Ƒ; ^[6u|Bmw"?;G+Ϧm[.eF ){Og VtXB 'ಘ'vO]w(Ҧ$ yG<4> gúhS}˴.ZQFHXI}ikHgxR胵!3W|S)q\2%+)5wF( 9mҿi:r `}HǠ(މƣr:'ಞaKP &iɸ%CNjcIu?̺/fWDܣ~7e$ZBs#<|*PG|88vy*Ot}UoV0ڋ?-*X?2zQ&ض$\2K1<(y]mxH[į~!´Q0;rA3TCg͙NNM5sp.# j-s%N v 8oT\w![Fю=&Fd2+W]=̦ˆLCٞZ\"Nآ?2q&: Gr#(UVoq|\.g_mփ9ύ*z4RȪ82ƕ Lr{, e/GLg*Z>ڵq0B$29s03F R=il7=%bb!k؄#;*yH mU_} a3FI?9q2uȨ>!%8|CpddLjQF&eN]cVnȩ/=O'wRY)qCF)KnԅGxҜ[$hWr*rX*Us趔TBdc:=NU~`۰lhr^x_ڰH!6i;R>¯:NYk&4] 9?]DX+k<z>NТ˩XC` 6?( f }w&zq`o slznժ_ ;g^ &q ne;BQXq E7o#=3bey;͕뤹=ĕaq;2x$IՌ5s*heBoM)\yϖrv~ 'MR2_E z,udYhG‡XGI[zl M X9l}G2#SմCMӇ@N񒇇 tnq&O"h6P2: m@*0vV{Wu`&$e*Ǔ;̯^6Ifu@t˽Sկv[F5BP.E&6[R[vw8cao\מ>\d~I#w+wso;zJ9p~> j5ݤ>OsnXٓYkYy\9S h=i{t?#. TΜڏ](Z?MHי$Fx{&dׄտ%W]r) I>MD3IUU۷7I^ A+#'!^F[7}0A,v##>O8b^?P}>\6P3*M" S#ѻC6L6(s@}׿t)Tu)AW@G砐&گ" ZIhаts?p71FM'JgZNٗr^'U)4J!^AwWj9^I,#9g('(F> }9p; lokn~@;UFn'} aM=m2 ߍ i":!AX};Q9CோW_s6"θ#z`E bsX!ӽbA^Z#؝i n@V%8m者5o n1bR*v5=b׊=.un.G"c> 0\§ rIdoBc%m3m vHֵ>ʩ'@I3pRi_: [֏*y #(ovM" /ZvKX{mCb3\3\wQ*Вd(N>c5Py/Z6ha4)/7\7elkzqɘZkͅ9+kI^^IL~VVʄ`%,k5sAe(=< Y${F[pi*8$g\J~'0>'D]yBIYM6@Jm!Ps n7K; VŕtW/# ]Hf Y)Os ,&g,ÖZ~@:Z\~f0ܻ 4 됦 H@Suyk@t.`:)U|3]kVB3UY'`=Q86(R4LzjѲ$Vs;v$ZU-:iϽ|YPel?_9'j[E&1[9 3ȽE,@hWV.)4JVR[ۡni<ʑv~ѲZ"a4x-hِ!<@HEA2ȶ\ެHhhħneL3;cz*?FxFߩr\jG"Аz:pO[zbT "l {$jTy`k,_TF5sMyrʀ#^ID>5n5a)i ;RZ.j_,oS* ҙ^YH)76Ɣ}&Qܖd-&cgUrܴƫj޴c@.ی|>69ӯ>LćrYXZt\&^H5OIUapDtǡG|.]t̿ڗʖQWbO>я]# ݨx~xzպsr0MҐ:pj:<`>%ԣY'ǼVDEgò&SRTŧ}No_q]"@}ŸAٷ qt:q0EمBMJMCPG"ilcjMzxUJY ~lVJ=!4QP/uKwҡ' |.;~&t2&A{|LcG7{i> k#͂䚜aBiYE*_ܞF~ry  P .Y?vEW&_9;KI ԣHs +t#)Zf4{q):3_aB7ۜڪ".[-pGj|kr(&и|; "5].dnvrl)8{.{/-?G*IQ7R~bp]/ւvUyP;l0,ݬRz5Q2µʾsr7/88rQ>>:{3ծb[oyMlj\~;5fウ6qn 2WFOK4Xr<_ׅZذQ <&4=yd;K.&=]#,aC2s૷}h^֨jcP_Y9N5"GYƩ`" o"^F[6x/TA(ee-#af%%?(2.bd!aWmh=>4]8XYnCqHW޸~]o[qO}dxSh&$)y7![1H_GMJrE vAO5`+;Cʈ^`V?YN`, Jz%rv "'*[΍=cD5No+CQ}P0I6v!ʙcjDVM5W K®c|tep(F#4HaMP)g񙤆`!TJ|_@t۬* 5O'deh+#Uj4:JmI);Xs:z!! ^␒|;kmHmfihWu4w#~a&$(׭'= YF'UW7lgzu} 1_D3DLVxS0?q7F+_QwH˃0BH9bŲim~2!c!TyYtVHxe![`4 =@ '8{KmOa;نWX #l랯!lM`pMN-pwX/asEDuCq%mhi#ۘAdC KTcOcMmݡ].L))>am;KtEs'"ymzAE)&EQygar"Dw)9vvPqD bAyg׉FM;am;tǧ|H+q[:R >+rނeE=zR zu;Ɯhet8 la*Sp"q5IrJ=IBQcL^v, uBI~:6Ǩrgңl1h[e[`S2#!.yrpb?D\ͷj 0z?0Vh }m~ҳħtM8V}eVGP 2[eRUm߅?8}<|;:AF8h >6!9UFwGxC=<.6#~}KM9k]>Ze-)B)aURaWaťSb*]Q -xXx3+*=;÷>|a%y= Mx۫:3-9 -Mח3]cPg9S %_Z!3}8v߲*Y~VYza|;lLG7{N&H|}ߘ#UBO*L(毁W+e=RCMEwPvLJpc1ߐ1n5KqJq0R߂egA2T&XrM Ʌ#vZ8DD(u<0A1Fmh,rrTIdaPBvKBq𷱣/At%c)sS"9ht׹`,-\;Y. L}`UXS3FnN t3ƚ bΜom^:kNDA{^kډe:>@C٥&Al܊Sn꿷VͰ 08yÌ'D9@=&F u,?[ҵÊ-z0i>}5%Eܝe _Pu*0X`4њ1Nf\Am|-V百s(0W&N+J+fcu^$JBMmhik,fkSi dD|{ $:OP`Cǵt' &t (s't5̰:^>BpsN YB-Z|6[^T_7kel7.ٌ|:h6eBgwFuEh |_کx0IQVV:3O.bU%b=M)e&Ѽ: DGIl,UL5fg.p{׌ěG~ ҽ;)CsAUMH ->r}B|YV}{n&r)((F1fa3xC fCF{͉Y? ԸPAѽ^qxoE ޓkvgCһurs /zXuQY̬R[Yem5to֩?k!V:ߞGSMX‘Th _9Hf_W[3ܤ͒c(0R)}ᔍ1g@ @ r$#*< {m[D`aI֋z0*#Q^Ђ=yaE6[rFQc痨xhf W> ʯ64a1/YS1)to/Y.,;Q_JҌxjH٭&ٮ8$> vPjo ^G[XqwA<]r ͎)5RC32S *ݖrGqT<.JJŜ{(*pyrDMzi{@9WqT{ $% z(fz"@3&\ (!W<- Wġ 5bpu*ǤV|I jiGԋ) v01|62\\\Μ;i`A&bW[a*|;u6oTvS5pR[S!QR |¤y쒚:, ڽdW@#3 ֖h-(ZD~`g HLEȌ&]B|ZJ뫤rrr{}R R C2?}Хu2S<;)}0C/BPsXVqwd(:W@KT4vl<[UIۈbzU9Bf#} >!x6BvrFY q7Ѐ{t4o[܂"0zMA?",l5-Vb&+kWG˜3d9V%ُmT WN lR拕<l#I7OZt*QpMO{\+f q{@,BFh L1pFݛBZcK8dKvFb2y'"3Om]R` _4?1W)%"m,Bְq`<)%O&׎Ǿ[^\4l0-igȭ:&l}8UPh&J40숽<>>~?fPn e:>[r1hcnj]mZ/I,-°]]b9΋ {8I4=L)5̑(`wKo(qŲ|1614Oʼ؃ Vғ1kCT c|򙊚Bw9hu'E$}iVGb,pS)uy ?Su)btzJ 6@ Bpc sn~r-=iZ^QEiΓaN)Iġtj63ʈ50_E"r/6M8VMR(*C|'s}gEU)!hw.!jdAHVg>ω\x`8Jvċ-)E=tʠv,irO&@) GkpNR%BXy=KLVX3xSRۤSU<IhKX GŅDeۻBF3nE8doȱDءv: 9opcaƼ~\ ,^QSD]\>XLԵ,qgb LU(FBkX໇>oML~d5P5Zuo6pF~)+,c ?z7[k(B(bT;_CzjHa/pRP_|zoxv[ASDx)[/Sqx%AM(y|@[ 8.]ѧVOUY/5LWk;{c`pvN_%XN?5 z}E_߯b1wޣ8c=}u~ELO曱b#sD9"7,YW@Dhk&hLXD~*V~d&| isT#|KB4bܐk++"<>e=ui<~tFdrӧ5@Zƍ$rfp\7) c(%K<\ɻh-pc#hnk|HE F8ȳՌoGKE r L:uիM8LbœVZT䕍BŐV%u)Yzc6 ~ 8^o(xna^9Pr[D@\:cd`H wJc5GLx.zO)9P"|~Ȳ#Ű-C:Zd71q8;<1.rd#qVAg&n`m3CܾD0 N^_ Oŀ{~X GeR)ykbPWUh,% d}Q!lAL?_ ;<5]fqKCD.7yLo~g C,t#rJ}Ky!U{L։$}Qb? sp'zm՝Nv¿aˆB0,O䀘+EWga|W`#KL#~Sr״WVZfɗ^b<>^,=l9>iZ7x+Ko#@+>TTJ2+m CƟu)FKž ~8Y97 <kƌ(烟{+ }#xU.er<` e890YK E ,n\=\dX Af-h_WLn]F|kD!nJ(6\ uyk~pN4 Ԝ8BJ48ՋPj{2 `SMT}xOѶji(9̌? EU%,P %U^ |AE2tä*K4!0CR;I=u(MWe 3 ?Lr8S4-&Q!TlIb}s*r*"xO'h$`-#+VSw:om؄ة LggpP5Xc67.f mFjO:mt1{oY*x3|o`?`Z2 1~?(̶&;X/2O9 /<qy(EWs*| 'K"$҈$jWv)d39ZEOA#yl6pt.%<TZg}[!S17yok*}S F[(>$30ae=lʣr'9HxD88ˆhu?1I@`*(2f8R""r>'爘¶ipY Xxէ$-a\@eF$2qE^b5`-DQ 4B)YH?/+>Y"S:ڱ_Y Zn=(g2~ҧxIٹ&%?^o*o4@S~'-w6` f[;klμ4>!6 Q 1Jv-#/)VOL,]~և$ Cm"n.Acy1]E>(j=5V3UQǚpyȹLdʑgjPWj%!N 7NŃTo4IdJ%(8y(w="2~&4rp(ux y$@Ђ=U zt .ߟAHZuY _]G$)cQ[قz6a*BJ|F]dSgO=*SFSIgY$09S_32FǏӍB+d?8ϳiο@^SE骵|f>щbh?Eha~y|gU^EH4=Sr :P"raB:&u#h}i92s&Ba)H2 R=&bĹhlhK*aɍihi>jZ?#??QWSukn܊~ ]D M$3Ʒ]zAzƈO4aq~F5V[+Hmu$Pf4B&p$ԕ(siWJfCx.)|A)?OP [#Y%S6JhͿTD.KCu_"$#DUFsG6!c^s5ёldȼInYH0vȟqԷp |Ts) !s 0%> l?C%2+WѢSv,nX,|&#_U10 Sl/Ϸ=)kνa4UTn);Kp;JMC3,~pMze Y";t]#+qI|DMfg n l~*~C+|6h7ZV1m5P҇yO-1ܺ0ш +ZI4RU^ߋFP :3!2&ieS$ h%X}ș!)Zj`}0m^{alwj̡UmDfQQ d!:.[0HTĮwmN<۵ ?<^qWmZ upj+:_5W BFoyMIJ0R*TS4K"CjJ^d S̰`8XŽt=v;U.Q`?pH=㣂nǘb95{>r \`"c;|vflM 4IWaflNνMr%-v#aOM;ǏNoyUo625<ȸ\xmӼKJMr-񩉦xC+ȇ w۹u)b(|\Kmv^Psmb]>\1sP#0.#l!m7P? 5k!$4ӗRθzؘ~.KOf53ϬBxtAt6ez>CM5zbxbkX=2J _̈L5/^V_l,} Үa{an*KysGa: %]0JZg>bu=k:ѷxYI30iR쨵A*ͨn#V"~36P]/NRzzr306,Ҵ0Vo-72ď s&q}OO0M,ec<[|7`˲azsM' xtv3)S-xs+K3 n}YKaqc<ǔV3>u2 FZ)ٓ ו+ axpG|&r^MI6 K\{d7iڂvKS(@*8ЂRt.)F˙V(xTyz!ZXzfY F138f*0rB)- oQLm1O޹I?-m <)c+ihH,׏vu[^K8IM"UWDFqQMTX(IXY"NTW_߮ekݮ~k<-ۡ:yBm`fV v_y ($~* ґ06c~ 5ҦX  (zSryPv?(0Vj&qge߱)BH9D͒3碇G+K!T>V%$ST^5-kQ z FHr=vݧyVX`'r)M vF2&m,MNJ R>x3T\$uRU3K`zu,XѪhjg-rG2p̧-[fbchQc Zω]zkDQӏP=)A{a{R@ڂ*s~#œhWl :2rVS}B{Y$ǘ͛X%mElQ Η\5" iJi>4]wYOl+BòI:8beS20_^{R^@:i)uJ͓0r[Ëk#L.N !B2yQIN6zըLўuo.F9gdZW|"JFEbiR7>8рY~}IgKuAg1 A$A\W5@IVOS`=&+׿|)Ql5N=DFwڭ1 z%h{K}^h߮z$z/ֈR56] ֝1)XC$Kn  q =eQ>FmsA22g5q'S6Q2F_g#GD$gQњ9֨wFk]NtP?n"xx8Hwn[aM_7컕RT.)M }eE$}kϮoߤd:]|{޿1ƫf")~Gth Q7ްZ0drdǀCcm9=;6w8ͅ-f CSǏ0@9X}z0kk%r⯴,WTp/),u75@^p4Y^`"lBzڜ\o8 3`r $:w^&>|@,eű+Ra\/sRJjaN W^e' ȒyϺt-!GV4*gofW%w%+)gm+Gs3bG| fc Dw 5މRMN:Bvy∂tg'EEw^hr4,?sŮ:n#$A!`Ә:{;ͽSQp:;O*'!L,i}0՟!8׵LKzJ2U+̶J/YJ1AmYrM +h\]nn8T؎Ň_СhqWElڔ x$vcWb7-$(]<$$W]0dghU'I3p,1j0a}! 3q.aBg #Nv .jg$bc n,JO3 d.s{VY@smrQ[I3hSI t@s>׈g0ƝYb8/ltf9@dq-R;2lNT2-XcձOS~7}Us~( Bn #0&MWQX%ݛ1c#fQqdX͜өuW2]G{2[mBQLJv:Y#VCzۨ ōiIO7>7li\S6IevDR1]?rBId6p[JW ws_oʉbF7+ sP~J: I[6~:F&/ct<3rc%p!LfF9C}Qyڶlv ȭRܞ0mŻkOy!8 j32R/ՇJC"KǕ )[+q5Y!XrѮw{2*7a. -|?uS—6D`MB(1)140U* o6дh'1b Dp3i ]"r3:˹Mqy!E)Xi(kI,т)hieBâH2$Pˋ>;;OIo6ܬ.>GtM8aiBz%.j.|YNsF^MBc](Nt{򭿩M5OgbΫQU'!+%yi|E >Aÿ/Œ߽-)xLؔoqNbJQѾm" g\Km"xeV 7y irERH0䚀JǗa\-8=| >ZMqBP/H {\KN{ Z0eU~aׄEkbAv|~RE +sfE =n[QLt)W*pyjGk,< _~ ?/X+ (ٙz3hɸ][>as3N#m/u1*tZ UP0|<~k8}$.@H;Q7*b#݊dr:Tt֬naL-2ɜ "pMduDjrlUGK8tP[:e"TFƠ-0 Xl-2%dsY:<9֜g#oZ |PF90;4)'8S#.숮ܘV @!<VzZ׺m,{把7e$ƹVBaĽpǣ<[k߲h%ӡIo2㏎véSۑQڭCaӞiBVPi䄢qLTDen4+ nC++c,mM8Ӧ;W'LET8.ꑷ) b;#NX<'ש#rH:E%}e51QēiPTl6Y2ZQHa,#W1~R3}n=ɋ'H#ge—ufS,tLJdq]P[7VV\d)3"ݝy)#\kdt\ħxt9>Ԇ'v7&,B2e]79}O#l}^_s|Z٬8nc=apͅ0HyHdLyGP 5B9i}M`2Ot6&,g\.2ݢ/i'!F]іH6XPDWL^0wV{SM/*)6m~Wڐ8>!jH , *K@hn?Q;> 1c)X33|ivBصS"t#2<baBFrU /ܳu3Fv<#M{r׋3#9=}Jx]J|@2|TLuQXD\݇/ȍi$Vj%3V>1RP tJ%n)Ĭ YJUy3 Jþ|3-i{9o5ZUA~PdiQ; JF?\q| iK @w4˩[T߾s$G2 JG7n,vZΗDvB_n!Wsc[7s\jsf) y-Yd#Qi";6OhEd58u78l)GJT_~VM[/kؓGeع wJkX~f=4PPrrW$ArU=>tW6ʢ'"(cKVڐ&,l^H*r0.>AjP.ǡuċ;q6Ev{pדCYO$o).qr8vƖݓt&-:l+59zS|e@a`<A@TL*y aX9‰t3Qe;^5 v VPjkX )71glҷv)xx2 0 X:HS*H$XMi,ٽOC6WzfGH)–3KFފ M-]sFwƍ2Hrj&hwqcN-lЀkgYb `-#QCz'\T*^qGس}o&ӗVTzN5n/_8lNzj?8eR@RU Q1W|YI&30_g8F|C8ggK+46ȼUɶ32NdN{n(=YN/KϏY`I=UiOrldiG+am"*$:g-K̐~3rw<.&ȸNhvTz`V H{U a9 K!\-戰Tg/S/(8^T4+[`WH0I'1>52?YT<{nTnNȽP"DE|3 3CuUL㲟y1f7=c`W= y|q3ǂkzg+U]>v c$K&kA 0ZLr`S7Yl^U:y;x}"ѵ~N!>0̼VR |02O^wFSk[XQstp`qeI"n~5<3-4$p ˇ uCGθhI;AB˚U`[(V+Ʒz#N/Ncbݻ0fPQ8юB5 v8?,&M-g(}ݓ [@BZ?lA~ۜV $@.lʁ0`afZ%eݘ>$#vWBrlg _E%"<(X bכF5f , Ks$GYGF⡐Xv)zl!.\2 O)-KLWfT~P~<qY>B %nMd.esֱXRL>8;tUG=gv (t'd=a"U KDdG_u#Jw(۟灳mS90t%"=|X^ڔ~6YAPLx~r*tYV&PvfU7TJ:Xwκ=nRVS !| 0ٌp7e_saȖR/H~oEq6)%.l͝ W C-SP@n87u $=bq :qz"$dhLF:m@ׂ E a*LIaF5'dk|3J-SP8 `qm)Z=o̍m#ZՓ,a._JJvّ)aL* SOC/Wڽ]XqcqHS7ت[ѵ0q.Z2JDF.!2bpSGv?G[`ջMﶶLͅ6iw^0$MtDqQ"nrЁoPJ"pDOGbMga-*ݠ M'A(&{El4%rxOOTNҔ#YDɢ+SC}U5*5aK #ʱRO(˛3gPZ]AEOb3>?E |sʈD`[cֱT>$:dGg.yojVSH~ mehSM& _t鐃Oy(Ƴs3#{.DlLQoIEzq9- {n_XG2$[DY,_9yV{ppe W]@]h5#nF Xf`r*+=]fup1a}$ɍG]:}azYuHYq$Ќ;)X B -yt~u7Tr{ X--z ?O$w5{vq ڬUjj$j REI>ucVPGJuY?yY<6ЮG+mKcgR6dvy֎uO "5QC͘ؠCl5 `,Y>%oU{rW^AVoɑ|{#WY]j޽ޗ%B7\gmcHBuuL.B'dRA'uCwoʱ&JB-nC"ԵROInRU_Ax3{EⒺ|cb|i"&6RUgq9LV&j$KPҐ{53A\j崑aU0/+m ?7)]m5v;YD$K;L&NF'eTʉF-J$ݕIl Q8dj2 'h?rFw~ar:j?jNPT.> 1YYVc("pѮ7(SN/+ TyhQY}; _[b@'cSzɪ|p&PbXsi[ߊ/v?7KuʴzAχbk[緟q㚃 5/ ZVBIsp}z]i&HQ 2@k9?mjTxs2,W~qq½s j΀hh5"G#w]}p"WCaVk)`cM4hO:+31~Lc)d"-_"uuQ6^ӯSWy=WkE>~%Y6]\n5h{XǸoe;"o({IQH*R_i c)tw_0 TFn^59NSVٔ!M\4@+;޴GppE]w8>߮ eJMEmI%vNIˣ%DL_v(m%Gjϫ!B;}2h_+d3-l|E5HywV d@QG |ehײD}6 ` &~2~q^l0Ij!ߤِw-,xTy@yFG̷0zdxm{-(ġ+ _hvϱڪo 3Ola%N+o lldftv9>a+[K/V:& @hba?@mb?^4ag%P:qe|6YvCF_ 4H+;neƎ{ B?ٔf*,8qņϫmc(SS bV7]7`@6};p|$D \*< Td!{>i36HŗtAX8*:TXӎ~(y IAI~V_BAd_.+Cٴʒ5{pۉs羼ip❻  R|2a o7eEb8E!2ؚZƲnI{k K m*a%;0}\E>{7kBmh{(m,WbE*u \|^VE(pfhj靻A[MOiڍ \ڂ{>V^?gQa6Hpn--f᱀:/Uҁ;H ř4R3XlESo1>P*F'& TtL* dHL,uZoHrҊE+V^|mUۑ{V_P-yH] _9"DNޢ_7PbAH,"@-L26HT{ z|uSR&ܺ!h?*̜Ipnpz'iG1yF:D6!oc z<m5*V♧$fi\ ٿ,wV]40Mi&) {l 庱vUdwB6KpeVHԶ -Ss qg8a^2 욒fAVjNvc gW|D~\} e'BNc"iI\. Bn9M7j7MJcѥL-7@#;wk<5hlL_pFs~$J9~''2V}O⍨DtcZԮ]bMy)GEk3%eiY&Q؊"H5⩸ن4K+a6yE[4,7U kiiGq+)6,;y.xa1k1(h 9 ^,1pr(H30B̀I`9,5B24Pgԓh*R^FZ"m\:,Q%/.-䒭܏qg/\T폿]k)zaERO(}IO":FXΏ-MHe:zVjx 2`_@3ĝEa`m7^ڡW*(-"c'Pҽ;]1?)*jcK9{>f UUT b>.SdT?l :r̯"F9#i$g6EB@'Ա9IoKfauz;0/>VL/yAe݀ ! e9 - {KoܫZb_x_*Sz@~6$m8rV\CyӸL|Y-V@߈ ʶ: zX xԿYTҨBUAd'X08ڜ{smm S|U˷d2ꯞbLKowRXZKz8*$]ӚļܱTvhVG~ug\=5M,2p\,ֶ8A%zhZ#)s04hsOcoe7}` y ٌ'ˎ62n!ъ3qlK 'R=t0E.]˟I$C6` ؖ澏##bmY^難wsѻMెIBzZJ)6IG6_Rk(80LI+wÔ] erfH,*(*:t'jͣͤg%,y,5.+wA=`3( ty%%=EFA?Y2gHs]\T}ʎ\نb;)9ڒϹtgM=[) )gOWkpl;4tkɽ{֯yީ7CVCuYhNºJp9d$CR)=F#$Ջ0+"5k;*y%vr|PT4XVhA6@ Ύ5PxJX[,Fz]+N=sas*s]^j7T9ʘ%I ;j^h mEz) fc3%{߂Nje!dcHMB+S!mRR@^}|D AY8U?e﬇Y()'Խf[R+ EW(*oByn2~5=)ҍ#F`\(5!* pA7e&GȘR#^1hrZZĊoF`xn Mh3[奇gFTp?^IDVX SG<#zB"*@!Zjd C`:c7T+\^s 4OPaHb1w>EaT@DQ-1#) 9 A{͡kLrn? ,-sLW2v~fc? q__:1{sԒtkcNFb~E/G؍ ~ w [K*,@:-d Op98x`@=>!"s qh%76iyEe`.X[xlU8s!:T-rspz2. ,-jO^k7ӗ>vY ըrzuw8ٰuC@ΓחCPwd%\Юi+[gmed Id'CZs((Ъ8T,mz;O߮oUbRnk *}S:#O`;vX󉈪B9=chF@A ڮqiъ/M-1n61T7:N;LGr塀E=FpSԴ1\Ps.M4f}ڰ&ETDnmdQUo2=}~ɜ*tk7,ϱ"&QBm MDMaje9j"%[ed!9AmzFb![U p %lr51Ipb~}hGz8$Y1bݠ0ɜ,o"] %*,]͘ybjU3o"x8.?ޥJ2d*Ԟꒀ<h]st/KsZ[b&ts$1m+;GJ}'ȈJ52*!d);?a4.xψDW4R ;` QdCC,đfZ ;t #N+h #B{31]d5Ț?9s%<:H (bbTOj&<񁰦R%L_43*Ϣ{[ˊ)ELU$"ܾWhmiX L*U9Ο DEBv lٍѺa?D[zҕǟB VR)@CՇAmzf|N?==0Qz L8Oze#Ld)*ҰlI >K$jf՟ +hv:M I Ncx2,R"Nĉ`#ۧ EY.|~2=Xv a;([AH7(caCOF(e\2ťY~ jeա2~7.ORHzDgXV>>ͳHz;"ZoiU3 |DS0 ,=yJE/_g燫yYf;^"L0О:8H~?rpIbtʒ.=Z9BoGJG)<5L*pV]4V3kԨ)( n?| {?aL$3.P|۽­M+WI:NaZ#zs"ػ>t$4,ִY&>_z`~f'(KKOc&*^@Ox3([@"3N}z̈b(ϩ jrT/P*D\=򐍆jU_~: ༡ͪt)}za>I4[Zc }{E5N{xI^ck3u 6gT`|-n? 2A!~fYhCRGx'-4ջn?^q:qC7$U(3r wݐkƍ褅F[Z_[(E!5Vӆ"@WS E"dy(0%ɫMB嶴z!/%q05Zm>dHD񨡲4&0yq d2\BbLOnf0ģcdZpȯ)BR1ivyø^v{4m!2|! w2hf) 0Pc 7:MJꖅPhMɛ =Qj௧k[a@bk` *D;x-:Ѹ*Dx4uPNM ҆06/i394 ͨa!`$hf3u~ctÚAQ |G҅/2w8# W,Se6iSVbXFՋpJ+gADgJoAq^"&H$RP"DEH`4q[_,یuY, iqNH+w'k4t3LJޯ.bWUAY&{L!5 tzC 9)%tqJG5>#= wi9fw 83U9N\2s.%|E;m5GGCTjϪlN"Tݵ!ODre53TrFYt~},RL!ѻM#9{)iN*vQBeJest~j!۠X9-[$-hU1#OKP;U[RL9R{#dQOo>{*Vss>|6#la]%)鮧\pj1[9 -EO̓C[r=نW3SxkO:?mI{MeW^\Hs:mCp#Jg 6BO L`+Xa& -3)ѨX>)@!_2ߐ_͖3-2h ۤ, "T<+Le1WWqdg.n_3PP*?pF @w%gS4p( 8٤"+~];&P{[ȧP]Of0Â<2"B phl)?ECO88Mxg-p"$PUQD晽Hv|)R( ֥8*Xn.)Ox}QD{WK&RCxShUʖP S&+ 9G?kבm/,;T1q"ng\|^u_se b:մ&I7bZsir@ZWD<`2fESը4[:4r8\d1j >8@^e'h:W!o87|3 Y >&U cS=_`"x+ dS 9ytl"/t7c2I J 冷IDtCJ}ju=;8_P nM6dv"qD A#աg V`]m*?v'mlI=@g ;z(~c@2ƴQ18^xe#] K3V!—)yV|_nf̏+>,e*׀)sF򍬌1aRyp{y 0l9!3'B~}9{Îӝ6>pEJ);H@6ʒeHV02>Ÿ+ʜX^+R]`yd^3_B &u;qOG&v:#ADzk [kћɶW_0;owGY6I\Jk8"@xG :&>7fD4:}dПlumKk:Q̽ȥ=']Xكה{XSUD|{j+݉ZD{FZo lYa&t&#zLBg*$^(j )EgbNzvљ[uYQ{ЋJٙ]i8gsf. ST2Kt NR!*7a7 g&{?0I)kh7FZn]܄&p*7d* ǫ9e;bj ِ7Aț4a 5~ӵjy=\ԑaRm",̮vht_O/6$Xeɡ_yHǥŶsΖFpLk>+e)2Bu4N:xKqbsXlI'ZԶe!iޥ_qd\∕ͮ&mO|? C\|5YHz_GT[g-+WX=b0s;*XǢ6O"zG8]㈿XگC,e,i}Ma>N,,t>T5 z7Nx͎P@XBܤϩ67ns[%׿)!:BU1Bzކ?}Ш!||mnư|o0S#ޘ6g/mIdAg@F'#%CLjjڕ,sJF?2 8~柈65To3(U&1*;YiLV*:`}#Ôo,Wn߮qrTm[E#aD>)SV s}O8*\]A2zx3d{rM^_qH2PGNMhZ]`!Zښe%"^ύ-'|Mbϝ!Q!5l AuȚNyo*a ?5RP7D1%xW7#2E4E~gXj3?ohM[G\ d W25v I`O F1YAMLk,iW #Ψ;?~p|~9N~{t~W)AhI!?EZoP-bi+|bv.rАdPm}j*gh"x.pK{U9ZJ¦jhXӽcTqOkv4E ;ϨY诼iX]p/β&i $LOBj ]`- lٷ@i8] )=/I?ٞ]`f؄O23<0${xd[ǡ"W#$XȸMK&:FjbۻbfTFoejSg!,ohҭ[5#z\luv/&In7vBELEIy 퀴􆌏XHK1)c'oj_ D 4;+M p!)< GJ)cS57< I(Ŋ;b7#ʱ* 5xt;br6lxVb(桃^*g[}bušߚbfunSjb5HƋ /CIEcmdܬ=j>Cqw@2Y϶>HTUAdr+hM /ML׹%Scbx{Ҽ&bbF^N >%<~w'jVfF,&I۸s^~Ī< RoSK*OVx`angS*"]k*+yXwФXd0G7O2j9A}819&p#F{ N<?9u|Q-.uO5R2g-p&]>YlJJHM?B󎮛VL4k9߁ډdo'L6 ೛&x3zp$xεZqy$ce"Qwի3䮛|jQHPyքtԪvW!j ,wnTJ ۳;zץ"5Th$QI변m箣PbMÛ<(Ia6F:1[OņŮhB8//)J?#3G@Ձ4ѷtwW.}p[ P ꦬ^h (3@+8 쭗;a6Joꜜ]Km{  3n yirK:6]G@9Hx$V #~oȼl-ps[j-ۦ lhU,Rǖ;a$=E Xf]d#ǥH#We923t- xuh8%}$h`mwg݌wOl50@ȫK) +Ry, -$Icy2He  GtpTFk=[ ELr*CJФtij-4;"gѾvU"w{&z۔\CJ(UsNY\hڦ,N2ܡ L^Qȭje=i0AG%02fu8q4 ]㣲%{ 6 :6d*<͈ͮia.y)P2uMkٱ(CԄ7vQϫ4/8'CD=wJCVm1J iPυk\/%=)tVTUXCvQbܷl^L$ у7YI=>nI qxw6PU-6B(]-1b yO*~\ ZH]vG(abG8Ǜ5͝%qOԏoV  Sphr:LqWg'm۫R0_oF֩qg5b#ԣ5@ρ hX d".G=cժ,̱xz6쳇q?4"r1G6{t>qӹXx7~z]Q\!R _\m@N LV]^y# <-7z$U 73dӍagpM(֔xsBEyNRf8^6▋`!a_ЏG%\}쪿rjl5Bg@'T%u1 uwvD MWl&ʛxIi͆b%-c/Vyf d1`5+Ve{Neh%aN)sl5j{y̱'8(ۦή gAHqf- &"N%z{˘*fFbʉx^8(:Rӂz韔( M7+?v{+V릔}: 0%ur.\^;8`0k鬢fk6cz:9 %uRP)< U)nsts#IsC~ y\9wd8El9UCKAP'%E$9Da4ԫ7E0M]e=&:`RKps 2Hv#lޜ"AM<SnهXU}i;pMl>ϥC@R(PX0ճCE]8 sORg[qݣÿq Gpt6R2ʑBeJ݀D"DJ 'Reg5h\et[m{{ngF)y~*UNНm(@)y &lE)|*!r6NIv_S!9|ѲTv\:CTU%6^EW _.|>ywe!2F&Qi[K6'"Q el޻۳QntFG80 4$_]!ɺKc0)L+wwGNOKisKW;xcARLթ8P2 hv[ όa4$3W߬/p La9m`vH$}q'rpyIeFrn;jem`hU<)hq~&Gtkְ߫eaEb= ě?Sam E7Xzd`Wӭ%k҇?(}3{a[k(_D-dt A 6> 2pOJs_s yPlSDBzf ~4|¡Z}}zUG%Qzy#`B ߬mV]95m:(T 7q3$y7N ;l-])Z53dJ%8t)Bj>2),q 0:JFK]0v𷳣s̃+No QנsS8sO7{1|MZwlE?j%.( aXpM @n#I,ap>qLh)"^1;q5%'P@ϛa*tmNJOvC,, N݌"@-:.?,)X inDO [DB(՛ׇ]id|]3NE{ V3;4yr>G=LTH<d07j̿9v,01\ M9A5Ð\.<ݾю_ܷs{}-3;Fie.:g46Y;qu radGi1P쨽_{Tg/Fs޺3jWGfB0ާA\Y-W{aK{蝢ro?pEeYth "6+5Cȶ_s>Ћȧ"qXVqJWq|ĸ4rF|[v` y =~^ zkSbp հWstLC1?@ěb3{PgRĻ=D#mW{Z;Y0||N9bhAX[I4h?(3/.*(s'.N(,t7o+,ꙗC88X-hN4#S03զ@ou8תAReR!+9O57kF(wHXh6ܜBzB0^.IC/HIL!.S R8`6i.mkg/$ldwk ;JP+5)2=۷5StJuGbX9QJ8BƢ.`p| խsW#TEpS$/@^)` 7'S>+fV*X!Mb>@J cH7Z*ӲQxgFcP{l]J_M .F '%0%cum*P=pa`UB)嵏A w@+4e؃?)14]*aSpo - W/ͭõ/#GkܥzRm]G //*ɋ%% k/760ߘw>J$T i~sFhW]~qN5~P݄C(ن^pQ ѴŴ Èoo^*:A ߑKf*aR cW [>Jִ[IFHPڨ;~Z9vEǖZDžj}@2^x3W^BE(v$ng3b}djBu adH_Jx*V=vG&֫5=9VvjҒfgo` vӔD2&.ĕhUXO|ݹ/_ShΗioY&ki[p ZST )Scdk(Am8Rq_ ]$>2;:f)\F;ӤD@M2VuǝG8(#>_wUCVNKRn9*sAo9_*pʊ, °:U]TN(+B՚fǭ% 3k~|X.7';^T, Wm.GF'tiȡ-9ciF{r:&U1Bj=3" ė<`=ciMN~7])=gyxeb7 j/,qxr/t\+D- Vm;Ys2oU;LSPҼ׶pˏ92+F%w.1x 0wH* $.k"-i?ռN rBp)2CZlhI0c%ڿNE"SIL?SϾxOHʶ#ަW\&of;~gJ!uO (mh1pmu+Kd?}CbO1t%ݹ\xcA;7C z ,!n2R ]x*j;:\ Q8jMBD 2>PhCEBuoG+Lǚ=NW0&џb&%|b홛GZ>鐙H'j:!GrH[)LaoW(GBrA~C'jv͜Zf/vS,9Ѹڵ^Q"`kj;;6/\2QiXvXHu>!33Ü2EɔMe%Tqx-HtBߒIU@K":@<&䣎6GCk'ӊm$4k6%` 2_ }цY3U-%U7j".E0 ]/$;ܗXt K1~]; _H;*gHID.35Q":"J*Z%al UF k;I;Z xXE u l(zG TّQ]v7$ ΓpOτҺ^>l Va|qH6b j:/oMʏ.hTD,3F[t҈j$㔳˱e_ʣ:Z֘S *wb՛yyu8ZsOޗiԩ?JBnc#H gOS# 5гM+bMSFav[ Y]d`uؼOZ^xNNFO$nʇW+K<pQ!(:}LH"#*մ 9稯n2z ḭ|A0@ >zm/ ':DF:q2uRREru[^c b xKI?ؒRcnFEs 7uRz&1 .%H$1>ݖ!c ,h(vfDd upWhߚwgBހ}z*jȐ-K.GBP0REQ>P_\_MRZ鈃XH?SuI9c 5wo@ҳGp*fCQ/ؘr ^O5~+fZxwߋL\.>Het)d𢋼8X<}.yWe%,N<54*8EջW6E=7$de M&tm={4L:ӝ8Sykr|ez˕mM %76UJS˨"GO_u@0ǭ/5`4BP[nWW4t3S;E)8%zrAؽf,Im]#_X)%!7M d'~ $& :~D42ԫA NU!W @PC,rg>(OD4Hy ǼP Sɍ6{g@E`)iD+#@: -e. ۠d͗Cϼmy9Ck];bmX i*u'm?+^@:3g~X9Y Gho, }'ŋ}\$cMT>{s:]W][s(w21 9RI=ՙk1'8Is~{ O'0KK,-U iَV3>MX+CfY}>IպX}lSuQ݇WK?IK;K*` A{13rQ}WA3&_F,t6q~Qk:.U u%j"b}(vq^v||`_p_NTf֩dS|\ОHYPya>JA>|+p NҜ:Plgs2OKRQ t ̐*MPv# PSIeB EZ@l-L ]_phi2s+ Fi,› ,2 l"bġZl-A4ɠǞ;J ѩ ,%BA7╇UlZ;wL" (HĒtFQ.r@ QY^H!A <(j&r܂n|1}0O~!yi~*H-}5f[C2)[Tkm!)-.*♕QLw`̌Q1+nV3~1eki`Dr!g˰i{W` >:"t)h@Xj&<MJnY=dytϐ:U? ?&3 B>FXcfd(pɹͷi:*sV+[t *˼Xe.iɽF%)?# o'.^xl'si40ֵ3\u jbƴpeT9/{6E^D Lm:hUoJl1bRUbN$/-Êf%=pqq -!62Fy6U6A_ϖAV ?!-,1kJpQ<=DBz>ӹTrt|5B$eG/} j=-9Fw^Jmjҧ/JӞ6: b0Cӹlq#Ɯ|w*"0*:eGgu nדcې$"֖qI Nzԙpʇ\|N*q~k56hcQ]P_ @ܬ'i}'$G.iѽջ,e)ȳI})_<`T8fpgBjtcF&ɼB,1i4ݯr=P1@]1R{!Aּ'yJ;*k7mn6Ä ;^OaTC7VzvVWHYĉv2\<:蜠 *F22/gssNTI9{єCZ4S`zo7yvaf@Ov݃B,{(zS)ߝw_(-/Z2ӎ8vcb{3.j<:W Nx%m1*S0iu1X+)}7XڑLHPN>h]CWn7l>RYeӖIêM)<'7_@${L dOr1Q^Va,F bꝄ"~cWH Zz "@'#E.s;eI,Fڦ.OfBDoΔa4.b9Tz;"s*h?khaBtx`)G bhT4ɲ1f&{f CzjW{MiY3tN;‚47LuhK0/'Zu 3v_߇j5p ݼ$L ,$WO-[72Q>Kǭ*_x}节cmgcGrǿIB UT4=|HH7EOʐK z"cݢ2qFg@宭z2#3GOe])<|7tx'\kc81|b] l~$|BhSbny6rrG6'G֪Od;Is܇Es$&S~jOHO-Rjz2;fܞ#̗XO0.Q8Vc ^*?}ezb;@LAi`5'%8T҉,}BϜˇ2T~!7nr94GHnꀣv!YJ2[!qDD.xC#JY&A:P z*Ŋ+1LGg~K-md!ZuU lY2|W=pBHk]n/z?'LP^lk@s^WtNQՠt>t|U!JrǔݴɁgU렅RUChyego>ht򱗷u5阐߻|_aH=Ev:M'*3d;cuCSXzXi4KќAl,rwۅ652 E% + :o^col,a+mt$2T ]j PԜ!48(p&(ىMMMC:BQjHWM踟q ׹PF-\EΜ 7IO#.Ws -12Cd& 1#tRwR B?3v]WIDžR^ŸqM?[fD03]5!u`*㾗q45=%i>w/dI(ȿ߫Gy)jJiݏii pHűu7 }+L6X@.y9,0@:_$Ydscxvu4Pg,]lQnDOx;`|*6ҚE̅%)ԥ*GoJaҎYPKe#Η ni`}M!H[17E0'ų*lKc*$ d񨂺Ygx1+oz@n$ ix$8iҌOACX@xqAgg:'Hm~`q  D"=ӧR8HC%τsD4[VV)z QWc*IE5gߧ0x%]Hɬ lJ9ƀ槬R`{BMa2ϥ%O=wahvP]ZJ}!>l./!y?u% v)e%G.R:߾myf< I@!GZ?9G]70ou[19WV5/x0.`q^ɖꡟb(Ob*0jRVoQ%f7.lj}h\-T5p*L cǷyU͛zSaC?=y?٭;FOXGYr@S( Fތpo/Z9R`w2vr:~ߨ!=غB |KmTpP8퓽A!Uo|um+eCYWV$1 nչo\4p*]D[8?YU&H?ڂ+yТ|/A;¢;6U/l T(WW\Us5΃rn%mZ YMNBتPOR A|B7?f fw_̰*?{i|j+X]k_5C2ܟJ 8mֆ61>KY(!-,T[ۨlE#7bfq:=/ZT++Mr[Z{" [Xp5)Hr>X`{"]`@#*侉E0OAapdtKT+50wA 9MSL@KWR X3i(].$'ɝ;nٲOSGr޴?Ŭ Y&5 a)ZO)fBfmݶ\l:ǖТ9YVqLۍAZq$!:S@T3Cei"s}ʷI6(..Gsy&4q, g1[+D*a(1jqy)$%_lK9QR܄ڰ-0)WH<7>ŻXFBt#%Z@3]!Y@DK߯7TTF"z#/QBԪXZzQ|eQ]p'Tcw Fװ_e̒>, 1>oжF^)ڻ(70}Ї5#:BZ2%ș"q):Wa2AE]cZ8N^UX'iώЬ"Q`S6{-7JCYTrE;=}t馭8+?2y#K!x'qY[<2z]]JDN&WDa-7S.a*;$}+*x}ȋVxV?.Zztc%ܕ CJZy< ItdcgP.r4mσ?|ƽDQ5**R|IE%㒾w#1oƉd?e < כj5gn'R@iqMjʸdwle\gx=2_V_ d/Qbr$}F"n=!5 :Mp"yզZ𲁈 Bh6*S+h=Nd I؅ !{Gl0*lWԣ$ GO]قpc6'l96b[sJKGӂ5Ŋ\as TURm5KMɨ:{gPv3K7#zއ`Dt0Js5’LQ A stD{AZD^j_K,b Kw8*ulBm>y(ǝj܁aR1^lCJw1X_Ww3ݟsb/U nB zrG4Gc>iynYy| Tk偾:.ڝ%xUJ:t2Ժ3)ɴC을ck0z=Ti%Jv-hUBp}LRbs?:tliI] AH[@YF׫3"1 nSXŞ3fOz(A,7Lx& ?Όsn&c",އ"Q)r %"+olufoKyW fO+Hߋ۳㩱Or{)fas2oCO r6- f >Z>>auVqy<zZ6rǨܥLŊ4}+̮0r%.*`D.6h 05`׳Rɓ".H}A6$LuᏂhYGY9iYzQ%eޢ^>g7>p|I3Մ ҳm-_$%*:*$RZhi%2@m_XDHmit#a_vt@@?{O[[ip:GT`:aJmQbCZ7MN߄N Y]V\0v/LI^>G_a a׿SU%oZ+Zg ,#`LKpu4r$98!Z65jv%b/+U`zbfŸ.n&1e&.tM,2\ܵǕyTlE{;Au3;/\^7M<|H b{|~qB0}^ X#qyʀRfGMʕVAh|W~b1;v3yMcGxZG|1M6kaeL$Bth"#CE3yCs%?> Iv *v 'pOп [L? OtK"Z?vI`} I>M_PQ^ז'e@){zՂ"҇iI{kR{$^$H0G9)Kqb ElxıpZ0 95dT{Jd^ zޗzxRCaы,aZnzqai Z(- ˀ,! + \:.ӸiLaՂ]Tb?x?#J>vܚ 3jvl1nL&J)+ROx#!du"Rq6@P'Jo._悲'u{he6\E@NӢY LO?:L rFW;慾Έ]% 52d4]i)2d\~+c`yƺ(`̈Ep&ӚcUNLL!ڒ^2cx N'JAl|MR5<"ޢ-QǍAK69n /#WtG %n ժ?7C`JXAݻ5mןӧ6&[NmruK ЌN/xucZu޶a딣\3Ov&P1msr6/<:Z,bb!ѝSN,ێQ=f^֍ڸĿW cQHqLFP! 9џ%nnjJx%~L:[ =?O!|ݳG hςAc<8T{9dp]ԜSVD TP>VBwBt"~fawGBnc/xD'<~2#;+hҤn0)EhZlPð4~wG-TO{R\7cQHa{6QfvDUڵszã_"?]] 1f~~[ #C; j5reH*8ۄ) dm?Vժt-mb\Hjr^ّ .npx/+>SEHqY$ {bt׵_ytGyf[[ʑ?QnX%}?.|Kf7TH/r +csOoS :C_zxvKyL5<΍ ?/Š I(q8 )}ȫ .,^RX 437By[eބAۛ;p^ف@Pmk[ 6*mQ ߙ-H,hufB{4g<ZGa.J80a'~C Glnd˙\~4x} :tH`3Tpae>QCtSX˖W0ްdQ3 :\)YAIGz5PS|LN[jvSܞ>lY jy}Spjk+vy.+mNlpJlGl1Cp5D4 3nȜ6ˡlr]G[y&kQXckɢ<7ٝ;Ɏ : B*۠{͗: R it79EZu_ -żxBdd2 9O"lɠL@8/!A 8E0ў3.D&] pـ[%*brdKR؋تUQ63㤧26~Cv׃==QX6bg'<&>㞰F}tb\Y4}T rg/C4oSQQ` ,Wzo~zi@%“^Ʌ}Y6nxҤӰqE1_/kCrx+,BXiɻ@ЇVD|ocvd Dlvpms|v\姶  ]B,'?Jٛ۳тݏngr|tC1KRz*vTl, drn! m-KF}r"TTk0I;!M5fc|29ru{ MjpSru\, cЩrVӊcy5,gfw =N{ܹ'%o5o3 V&P 6Lu)դу}A7cd9Xcۿۄls _2)fd~L2HW\OБDSߵay(@[4Nf# hU|2Q Yv W G _q&a{g#F)P5Ddi" 0ẗ́XqmFhmU%TAxT$'> /º^L9%ժ` 9&U߉އ͋i{ӋE֋Bw&CDԉn`bN&#ڣ;A+NRZD*Eo2cD۳Hfvy!XizzH%q3B1̇~Jm)u2) ΅# 7i!KX :U\15d, D23% CYEGsglbT{FriBR(ȭ3zuA Qg/K-A:go9ӔVFZ=PƵi.\M 5S},7Kpރxiϥd|d?LD}MRz;7[?[i W7@\ :Cж?.NYH/?|]܍uV:S)ON`/ψ?Ƌ[q[ppiolcψ1!#F "<(X(Еxڮo3ua|N&R/e6Y-t3oSXU'i::J=)Rlgv"Q8Ծ=P/FM.oc;QT\VgEƂW_X-,=P^V28 "dGT>@AY)df \ԟ&w)Ht HW=p9)JE )MaXu%`2iߙ06jYh~ jls +N #b_@ l+!k*iƦ*:;޾&M<]#5${{ NGu5:c{Z% V_eWHvX\N%')*`xe##4,ApP )Ɩi~S l4 5c'-tQ]wCxO/>гJT>n-9[ػ [nnK+$ {w BU)$zk@0?jj ]YAGl':I(jE1[Yʑ q K 6uheyRfزʇlxqw/@̷n${k:x#¹+,kTw[й|"IJ-3[WPJ#^ڹiŃEklJ:c 5n{8bO֒G#CNg P,G_葎!p33۲Q'ĴX%RZev]yH`ְҶp )lfnZyzC3le_9XCxH~Hȋނ6}zW8g~kX+sTD̬ѳ3~yD9 X<(2w`sX';SC6j/ӡ7 hGveDYֲ^+#04I.0ڟu:bB4|wx {+f֎gӮ 6V  SX_KEu:7ȇWX+;Q ֵ`6Ew,ofZX 0Ј鿔<>NieN,BBJ#!Чgi Nz=%P/T+e0+YVZ,8c@Nde'p@H~X!tڃ)\;ж3\nI ?'cF [eu Ki9ZF|l~F[^p1Pmu)$|vn'R ,Y^xO)cwJ! tSbUɸ&DuQ-bk9d؁0֝`s*틛sV.?i ScŜ͞Qa@[rG8ۑ 8| w ˚׉Zk2N&k\ Mdg<E$M<%""jβ`ELdo{܌W)H)=[79h-j -k! [gG Ŏ/nMÆ೷#lkI#/BoKzC.0}܊ZMj s 2ȅ겾TBWwQ -}r~S޾#Mjar)ȟt?1(8V"ZhNl ǀ8l 븢x×|FK#E"=Rdq`O.%QnHsv VWz KP{ >RDkljm; ݊V~w(BCi(_d2w͇]4x 1QS0枠yRsRCPǚCrԙ]t1zV=t{q.*\8>XGɢ!ck]-axCMţZpȘyDVGmw/'u(̓$mrќzRd}(2#Mb dW7CX%32nC죂 gS8Cl|ʯnٲ P.YE]騄?,/Psw%tcM}iϗ: }q4U*<bKoyiy~ '+?޾4%/%.RX Qɍ%Ȧx{e&);yJƉ9B; [SelHLgazXw71J.瑺 BI& >,2%|d#m߲2c>4cM\bNpy(bǧsrkê^*Y`0$zF qLP|Ko¯^#@^6rtFҎ5o q}U3ANop;[Q xt#4'E.ћUSD l]e#8gcM(\W.5Jhl ۄ6XVɕyD79Kn"sC١FZƮXް`=+ѧך(yN8]]g E^6EH tE盪{F zfʹďiii#$-qhwO1f& qMKk/;2oXupvg$Hk)m܁"%)Ejg;pm;8S(۟#70ՀVжx[UV7?}Gs=' bI+?Ӳ >31ָd|GԱzȸMoIR>YWB{\\igO4tˑT4w祑U6WA#H-w$#__[۹w}d59w";zfÌ/%+(=K8`?8zىY̓y,)=1ׂR#M9r+ &r(=%i%t&?dg$HID< 仡4-N!qVcƗײI)_ h+1w ж#Ծ"H~6zr+; v{p»MSk"2:r}DN ~\MDW V~r̆+<%c;_ ㍌O{sջtۓ\{@ԉW8}(SۉܼD2c[)6'Pm`w`=I p]h%:b}jL"6Ն6?{L~ J")PdYzxQ+\SY<#.d$#7ʆcWE衯Ct)|68eYTW*7̮1xeMnܛ2eZ1)TuOyyX4MvԱWdi2dvP$n‚ڸHX1'_2U!+4i{;'L+gVm o0NVY_^EX96mEá4n_D4s04pڇ]q?^@uPys{|־iw?Zn-4gH]U90gak.!鷺BÙ%Q.JÞR8RG r6]K!nZ: u f܂.cô2hB2_:X)tHZvkһ<ݾ:͕sUJy 1+\c-9K!2h|h4`1 B^1>~&b/-Zwi)_ՓM^e@ ֱErnI΋šԶdNȸFo"CY oSO߲O%D`L8rEjo:t'H,AR?BDc0x| V~?b ֫A8fkr& s94D~L EgDׂC9qfu:7Wʼn>B}àjp6({ %&hxE 9j\`2~/*W= id0W*9 ,^Rtyd<T} PJ{{:Z=o)"̽}5(uUH|&+/a)k7yB\$˞E';빺`{&)"?͉mڍ׬;wE/,*8HwaNdJ\Y^rh7NrEDZ"[}b?s>^z9h,]pΏ| k <3;h"v پ<avU p3|YA4 s+ʋu(x7~庶3_%Zanf ˌ>ˡLNw՗@U:+Elno@{q|mمjXDqb5%ї_D:*O]jm0Ʋ B zJ3‹K29M!~/[v7s'qx͵2ʙ~4x|%섺N6)j-9-L Cv 2Kditonb,X#bfEA5ؘ Å x6Ƞ25ւ 3ul$֝S MدG@<ُ2ƥ_WE'e{Lg>/WJ"1V'нz>9 TO*x%wQ-,I p1|`CGvGkݖ3ksii7;.";c]Zbq8W,_n$H'0 ̸~ 72|Κu jȒiH张 p#!py9t,:Ih4a1C2dm} l.syjGv9=UIKqbw zpAҌ;DA(z =p@L;^)D(pF(dfG.^c7\ :Sn(>$7h 9ˆ-kO Z,|:08Ǧb{8s*x 3\|Ug2IF?nu(`h_Bd\ţnHVR'{'ճk8Tє2c`m;%NhӦE2S`HB쓀LK'0@b}j+@`_jYW7;_VY+L(=gi#'e.aoox$Hb"ϐ?_>M}^V&] [w5^(4s#M؂D|կRDvWL,Gn0!4{3Ù2-9 =rRGpl;_X{݄Jf$Y6yF޳{K_F͟yE&>S2lH¯ EJGBsnfSV'x@xDMN)\*n`:=4-S//C ݊f _Mes(Aޑ#0bj\t]_Xݽhmz!mOtI9nK@3(oҚEoÀN::q:WF41 ]xZU}Z]>,=A;L\gmWT|6YՏ #M.Qչ^ÚQbޏE*ոpɆ\j"VyǪ-OV*~GJ՗k,0}zEu_14LѠ!ʡF '~Lv忷iIwdt1b>KW`lQ'LCĄTsh<RBInw"+dW n6mz=p(jz\ /'FaļR{%9:g[%ﶳS;Es)nܦWrPHLoHbҴcFjizL#{RPiGF2Vm( >d]:p>l5z$tp"ԑJʐ_B@mJnqK! !7Ӹk|Q)â}n_-)N,xuxꍻ{&5r3CS臜p4ݨwbѿN,=`d[9Ö^贱|NdKUS" W$XE$.䈬oZs'؍'hr\p-Ӽj;t)m֘/ZkAY6S4h~C#2'l+Av]̑V~8BGf[poY9;0PgO ,HGݿ?sc;J2h~u bAhn74[)OQi N^\TSO6YKWrȪCUeco6 _  ` 4XOxȘ#B$1u<=Nn.Mrꥭd5b11kG3cvI~hCʳ4@eB;z؈17N遖4lӅ2w,ϨG*Dzd?5oYKd86ɩ^Q71b&E ] ZT_A#FGq}Q}mYy>2qXݩO+gȨ|N VePX{'qj6u`_pfMP8^$ix=V-LJ085Mѳ(So)"RjT`ߗܥᶔK#3]ڟnL]n/I_nOsd\>@|Mj?!,bKN3]7/-h-E;s =SpPxumEM1Rs2ewE'8[]Is`Jh 1ļY_ *]_| r`a㐌1!>oEMJ 800E`vHi9ja'>%|ڬ@̫XM"+9mm.7⤀:7#4FDi +A[:ƨ;vI;68D\o> TPzKC H4E35`f_1S*.Yqt. J%9àS@ aH TF[O:}'iBf곟tۈm.cu/ƟaN杧8"ŭpV/vq_~<ũ"4ࡇh$2@ k7!_\|- ?e-tjicOc.1 cŦ2Gf#Ooˆq03H SpAǩA7 p򘘨; zʤX?*STjw-\ h-oC }ӨO/C1Q}%Ӆ»E&f0T㧪-Iq{^q-3ڽ:NBy&kau"$S&KZr|({Fۢ 3WtІ}ͺ"FV1E_'Dz%K U#7Zglj+Oa,K#$h'Ě͍BBcK4`|g{lbgaswŃX[aۈQ]1,xh@ݒQϐGq"dV+U$>T|#T|tQAF2ڜՓpBhcl BOm_rK95nnᵩ S>& S9=N=d^h!ٌh.6EfjH>;_"m^62Aql\#AiU{rm"grlư2a^8NbT{]uJ2((rR|(K3I}WZ|L^]q 'P4dW35b\h+1eOu.0-*칣!GgZѤ,gWjB>5:([0x'*9IPo'|žuX%a6|&h,uSr9W?Av0baqaO1LO3aB ` o84֓u go0XHŻc-*7d Cc؛JuLb:$-)hˀ̖4%q2)v3Av8 .֖6[^71W3L4,06&_M* ;xpރU؇u<Ȧce]s6P o0Vm,LS&lHXN؏^My7g+tt\9<ўô_-76Y+gaѬ!}d=Rr 'Pu4ͬ"R4 hr USۭpG"ހvm"PCJ_a 0鲻J*24IoV2"̈́Eu6OaTARHH{ @4-&Ij\}MJ88"QU= xDWgԕ:vFMR30>BLc\u@94א=$i@>r<"X]\-݆'(IKbET5 }_IZw_;C+ٚJ- rl|f<]*ʳ)jSO)_W0kVCLZg W8`[=*~\[/(Av|97 As4}Ysi6Рj?Bґ0 xEv]71ba"v>xQ1wW:bʨb% ~ORAG:_XX Io/QGv<&[  J];G xg]O C),׌uy.Zт>b-V*hc=+T"`ݻI^nFX7@6Aֿ1A}#Τ++kEՄLS08 0NzQUp)\o? WTJ4֟ ; WrԏVUgp7>w|3Tߑ̛,Y&-ëg~h~і Wmj;7]]CzC4<&X$9[0^gXOb?T M/bu1IK}>emIQ{v0:u $$d3ÍQ}Δ;t@vDZ\]aN |UnKw˃v]TQ*={H1J'VfXw Ɵy&&:1nwD]y&,* x*_n>p9\SJBT #sdRV5jw D^_+&QVh֋Y2)zRKkV_"K`5 ;pZj:';2 52Tk/=?վ!K] Qnf2Ea*0w~_ j0ûc&rOA]Pc2-duu jse5 ~ű( 5tn{^XiϞvzo t[%Ŏʼn|b,s @F<mm OkiC=\]V^wK'@D_{~6sUɌ0 Wv^;g׵ Th*=d=`?`< SyPCo;p/p-lΓG߰ernTLf7gde;ɌF vPo7/ m( XIUtU̸~d&ę'1  Y ) 6xBiEoȀZivi;x%Si'Օ &U~Ж;ړ Y=+>pTR C:~ɦ,` i;^Å+NhKJldT.U1Dt.]Thvɱȶݍ΋6-l7)tՄB&ZOlG!D:.wqzP3N{` tn{,o/~ߕFYJOR=eGO0,*b@ҝ;rЃĒB=v <@Bگ:}nQ>:*2"oo4cm;D$/28QU1@#* r:^)N>JeciҀ%RĈ|_3Y㋴]K% JlVopzyjs*j7 8>B0opw%I%R-GqG5]2.6hpUKA o?`CF{I(l3&N--W7K;'n+Pok&ɧktS~(!]o3?xݻMd;}LͻulZ+zUAW@z$ 6!IUEs+&:OAWG ]3#s_\gO?]VNZ=]W1~ ߛ3+hB[e #aIДw 3H4#gQTv UM *z`q5s:ºQ1O㊁zԨEtyd_EPN|11zK}4(y\+鋢6-ij[qWRlWjLr˄dB=dy'#(p;DTMRH;OmzAWqi-}PVk mn -ɠRϘVkDKb&]ENG26ȱ]w,obCIy$5dUѢku֒JEf<5j v*3%M-E7kfK\}}!?TRV"ثXsg ȋ6NҎM<> 횳Ŏ s9ۗFE"h6Z)qC&qKUz轶E 6q<ҤmEW!#T{fj|yyu~&e$Lަ!fs]<'8Wm ~uUYg$y8Ytg ?CM ,-*{qGM9YiS,V4pi4%q~30?mkfGe HEqsc AsMs0INjGa@;VqGzDP;7ڃ#,x@H5рHW{gvH-w݄ P9D`R_tTƿƘ0}x,=bHG^杜7Ēd79Ѯ-0aD}箈L,5 R a9.D1*tK\u/ۏȒ!Ǒjxc,(m<߼~QHGHwLgu7TBQechM|?S$cg*mqgؼ6ߓsLb;DV0x$PTȫ7UId aۛXp|I0M!GMM'Bj2_8UWq1R҄"|'ۦ0Ѱ{¶8bj:IL8߸ǯJ||4$^/=RD t2,"a]+߸ac~GCGW޳P;I#Yz C( مDCu{6iS[Weg`X(PqJ)&Aۿ3y͝PZ'#Ad]UtP(, =p2ENhNq˿<*\padX^-b DFQ4ǮYmf 2"8Z|qM 糧%KRO<2jfG6+v# ΍Mnp05yR?ׇ J)xZ}ǐh$$R5iEkokeJOoO/0A 5[ΫM'bBPq{d؞-7Z V/Bs =jwaJ {~4\XmY#B޾iAdrOde+?MXZH? qT=ߎf{ tLI-f&4 skDނO8kC8۷[hb[Eԋo/g l팮Nj {x~Zpz>f},#xyp;DRMy&zlZE;~4/!NŊǾj)V@z}ģrVuhJ?P]Uw[!((z}8SHE31^&GjT3搟 eDJO&9~b^bnL F ʣBRDƮ_E5Ivߗ5լ %Ӌ~ꕁ:d w$ė"0iɽCQ/gDڬ̿KO[n =} ]=%Bz% آbatMH9vV¯K/As7Ms}5)h{gEǽF5K[[o3|4W]ћ8I?i٪AdU{ȝ/ ^ɞB#(Ҏ;f!5A]fS[eΔp @,l+ZR6~ϥ>Y,ũҁxYG!V=QAƨcMzi_9ս^W k$˕IRI &55\o77Jl)y݄w&WL %Ayan>o+E~u+QJނiR'"bXޜ`m.?QEw8ePKI g Pt&E?Q`YP-Cz )odf蠚w|t1"XIA{2t\<6ll';"ozO00aki?ov\xz?ÆwBd*+~pn+BqKU6璇$}:K$“gvϽ}ؙU} gh  2&JNMa8bM^$}KUװGZ (M4ɡHb,KG% f*k$YesNH9'id7FzҽYYq]KSpD|SW9IohcIm1삊/?pj1ɪkTx9.bi!Dgg^}V^xbY:3l T'm }}7dJ~riV^%[ct6HqbQZrOopw~2_d2c5igɱV;B8X TV" ?TL('"{ ?%j F~ssȄ1b qoN B?48XQ-9ULZ~v=fI&/6Z%X!C/G|!֣X5ك\9\<\H=ˍ+QN ZG:2+ M$|r_~eG1cZ8[J#&ΕK 2|3-FhΌTSI(*Jgdͥ\eÒ9LuaRlGΜ,@/ ABFt& xKUmt ZUs)x3zvKNE1HȒ&2JݱV8֟\ųTdiԱm-| c[93x^[h:9A,ohPG(^PkQt-72\r1nȽ ]aP$nܞL-aSggtnXjLb&R|Yh.vxF 0\jŏgSv@$(%U'2N^y 2c;*IB/8,_ "%%xҸHTzDؑ=a[sY9 $07b~{Df-,QN>%pa6}OҐΔsֳѡЯRR)br"JW,&2>GkYWO{h<Խ.G_>Q/'LsLTbxE&:]ڹNmX]f:-Lޯw ~"1\zR SLB6'>lJvxyG]%u kh=7vjH'2ajhVв0ͳ(؟@Ot@3 L8-I)'IO| Ԣ_VBZ8;(OjC({x׹'>ː2ѝ5;&?*pJm oS'+i x5[tkEٸpևGN26bw5i*<V1\5^⸺ܿ_\Hiu޺E 4 HzcYMt*j,GrKS}0 Jjy*hUv5yb.[Baܲvb|y`KAVvf" ˓hC9m[ܓM*_g|GAFm闢eE@M4=ЌS]#+0~ 5}Y"Laa[$Ca'tD%F5ww nTǩ3ͻ"Y d(ʾ.?yI>ZoR)r7`\H 7鉞ُy`1Jok~²q@fv3lu*ӊ$ M bk#V @G߆bzbET0TyR8hb#^a2:*wbX_JR1tm9Ő anK:zT:]{X 7G pz?:?9shOY<;g/yiPnFo=\{2KKP9XtGռڑ͌7EP@)~!v4JjIF]tCf/rAd Yt^nxbbu/6_whM[&~t*>;XU!J-q'EC[+bEP(PVw?*$IgBEkQaӑJzcG땝IW47=OҰ)Ĝ#@=8ә)28˳V(e(`ϭ'?mLH ز9hMK/Xm\]͗_;|høiu&ъnea]a. =F(MDAx11 ;$HVߪ4$X6E ӛ ܫd!PƳȧyMQry) ߮Ž_Po҈Wq9?t$`;7(3/XE8YF4gVtdn {?x6GQ2a'*FX>tzG"i_6`qH,quH@w.`Jr \6?n!ZPA3!c.!MŶjahߣӃɶԓ|sě}&ZYa뭈F%1vK d<2`l7ۯ4 Ω>&>Q{NZ7?m/y0AZW/T]Ulh\ _&{qy25-4M6\VW遭 ϯZ; 6 oXWi/X]axFiI'9V`’G8=*ͮ;*@-"IϤXZŰOkZs(".8UdOC,"<52Nj_h/ H{_cc5А˕;W5␻/44He[9 u8Ktp扊x;%o&:>jU5Xla}NM3W[V#;M]ayc3? 3(;h2~(Δ91O }`Ԗt1FQ:̭tڷ.@|Ɣ!wwN)ӫ ܾN ڿ ́o?T2<Ԕ\yR89` ۳!O( ِIw./=I;X*):Y,\e!iv*O{4yC7i Tڮ7兜Z˺%ɰYr)e&;;}%"X qDx}gVknޯ?%M]TzTD[ (" ~Xk_kHϞpuB/ E3:9?exp| dA-Pc!rò훞KV[/OYa_}}OG|VpOmP% 4uCtț{Y-I휄4*gw e4diJ\x\pIl-OAQOǟT &d f*LYoN^ «~ SN( dgM+b鍭+ղLPݙJ0L Zy&"=Vb0$92P}},Qcyǘ<|ӓ3@܂EK0ѓ^ZDIo+ަ*9OI:t4${:*5`5#a<1?C$kyEl碟{hO]@O. /AHqܠIwv#mZ!&ҠT0CޛdK1F܆_w Ar?A2>#I?(X1:s^^j|\zv D;1\t3+y'@fLS=xmo ėz.OuW;]|)bمKԲa N3GcATʥyCkb>)&zqb.ΔV{qLR f=95 (yGI~+pY>. 7#Jb96M%t]%^PWt,}0d`x,ihTJ-j7}tRSڪXOgj ?+h& Hԡ$g'OږwZKJa&"SdW@w ʟ%2ɈʂqaOus\jYF^?8nb1q.Rč3RPjBxGWVaW+ Uّ *g'N$>Ѝa,-F'iG|x)syl>ڝ>2WL1Rc)(R% h =/"31Gœ6[vU_[^ޓUmS^yYcӂeQ& m1ԞAh͞*J-.ǣ*(Xq ff 8XL:xzN7)*}/kT'(_wB*j@6 j?4Ԑv} |/ӯS 튦 5[_adYaO\r/NH5蒢eZP본{'t_섅;1/s[;Kw-ʢ ܬ{<3+eR~tUҺ|fMUw^EA`3MC髢Y :,C)Bɺ>y&8?mY>…*C7FLݹ_B*fpL?9 p餄]fꩇTgIy}I'_dxQ@L7 ;fW9W|>CJ e-;}d-Ӯ7=]}ܕ&R@vd>eI(I5M_(tiJY4|Gs-5o 3*q|Nl._/g ? {>sD|/MQr9 [Nd޴n텣T反 P =hHѨby#DsɿEVPbi=Æl." @:&j'L*6Ms|[8<}mM mZ}{{3>=pdCU[kbixJD\% ;Px~~CxK<#"*K0AӟT}xoPԀf,v0)b-vzv' vp#dJsXa anw6'TY*T޼,gkl/?K<$q=)6l/mHH,a<ף߅'Q8JfjTR8]Sޱ9Ct5EB o™E7{ĮP!~YKMK#aH8Wc??VgMT6pv@-^4̳> 0ye@Pv) [00}اp*2qf?6 L>P 5vO"ep9һӣ{i7+4'{-)Π_@~"!3m/xH~S.|l[4Q)!ʧ~%Tolu,>"d%X4˯з PFd66#}0[.U靖LzH'HI&_HS*Ձ=AuTgMh d@Ytܶ~bG0pl!7o"%%פWH45e* Ӕy-ֲWHH ca5>+91I&é4̈́bX`yC<-J~]ͳ QGF2 }n񎁓2む@BO {$Y[=Uh|ȟJl?|$|Fr o>`o#FV,(+@Ud\f=Cp-qVmw߂JU(h 1q's J<! b_j_?~.~=$+@QhZ~a0dtFϝ8G1p)@p%{cB-d :$Rxg&pqᴵdsh8ɋUJåD;iCVK6֖0?a'Kn8,ExBs!#ip$k-,@B-M$zڿu*F}/6֮`  ,,%_/_Y\&=qL#(eX[.͋5_|AbQ|PoahdW^7gL("1CK3^IDt ֶ ԕsb7>LGG5.UJ P4ţ z :w'4BTFE4\*#Ap'FNpaA ڨhSQU]w\Y)ej#KQAkZ6d|Fa_|ȇjemqP#ЎogVn+QC?{{?\Qsq/MRnҎQ\y~&!0RYݨ W8wDqq^YEo|FN9N,,A%/3g€ :${F#Q׸e3ZveZVޒpϽ0 IYOZjLKQ.%䫀2 coz[R֠0NNn<*Y{31q6oŲ]75kryVagfR8z~Fٍ6{+׋DXE\hUwL?MG S>Pj,RAdڮ!HL: ek1- '4׼;+d?bqЧ\/JmxOk=A>җTٖ?M׌nwlA5|ޟVpLFL.A܅b Ŏ:ѵ41TuW.1u~*< 5|G]~| [W|#},8F ҿu˥/ސ]%؝W *ܠKn!c r>K Ϫ d[W.6!1`md>-4lP*u"d{OA3%;l(&7E$p~"3t@' &5`Y"(|Eh<6L5Uzy4髇 sm{v|&z72Z1 “<. ; Coo=pXK~`V" 8d9X-DD82h*p.6G4g.4rٷ*?mA EO[6~(VSlӌTmmU -Han}tZM{d@c萂'Ȋ.v2g\E]n+@t )i@2`4p77ٓÛ6+RApo- OIaI}{?>Da=@#K^X*Kx*w3^tBe.7dZ#0xU*+oak\&CT JSG"mc' ~22[9Iadxǵ)B*D!Rm8tY'ew\='ꂄF#(ϘR7,VO E{$"S>wz'! 0Xfg8`L}[3v7ym8C!?ZIda)*54U#2>9rSp9G (l!_ E tymxI]X:_ b0Q:KC˴;DN{؎;4lO l֔egz7V ƽP'9{$oxGr5Ux[m9Lx4`@bADQFҠ&k:w%BfG0ٜm3rwdXo0lAuYm{+ ]vT_-ௗ:vH FGY–NL xW!F2_:K|m1}HjK {1} isFsffd2i7$ j/9_cwNyt#?|c4hnG.DbB|ve_zRXHIMu_vy= ;}CFPr+IF#)зQp;u}Iq> *f fkSΩ3T;lp2>E8 84L= *|) όr11@P=}VX=)D =y/.z Po7vRj<ذ[?]?ټSǿ$ǷJEԼgnhAbjqN)}8  ;p7PX=_&,;oD`R#ے.dZ3܎1dSM{ 璂VHb'pEg,G-d&ݯt[ ezS5F{@Met 0<|>0 Fp Y19kԻ _ptD)]mOAݬ|D7b FzmU7׌^ykH!OǗl2]J _&yٸrM$]ud44.NZxQs*0$F :6'_8@}\k<L3bIFwT,jDI |9#V܄^K.Re"NX+~-eK*KIs0cew=xgEΉ䂥5{9zWju w];s}@IB{[Ŭ}1ARȭH' $7=q,*;kk u,*e X&Ξqю7ap7ՀͅSZf]E] U4[ɡ^wPBk3)n˓i:<"aGB$8bދZNx݇ ЀdOH ih_3ZV \6 L.=C2Ké8¦CH--pڢw #4;"U'#c w(BY9GV6JoPR_rE-);VLrqJ*%bAKA>9]4,w>Ijan0"HbzY1tZDJ09.[lP#v嫀@XRS~x[ aWgV?r-V, 2pWϸ_ۃΙ-D#ݩ&ڪDC4-߫l{IΞcb/}$,%i[! (F6TFƈ"0")(RFr'ZdHTP]}Lx7ۺ <2v;=DPo[=GX׸L 0HaM,(PQn ({(RyGI e [+q$)ck*B* FEU6d\bAr:L*)?OȖCZ#]`t4r.jbzk(=YW[[4)| _-5 m=٘iv U'(W#BqM SVI!@sg)%놥nRxS̶5׼x/I9rB}[N  %J7:g9jT=xvX8;b/D䉬͂t`'p+D쾳kwY&UI fzi2JA><6X>{YN=bٮcIE3o) nqWoك,3[2xBPѽh\ ϧ5J9;ii ^vN>g ָ&A)(T9Gk"iS>0OZBTG@#LN(fS1dZ2$|muz Ǫv Cx&T6K n?ZW8.NP1W}f75f #SE7qi ik%4>l; شa SYbƕ 4Y;*DYZO1mULD7侀d ] _A˳ ߂D4[j#,*;)>1bl2Nc1D Yr-}Y+咈kcԜk=m!qKXؓVIN65eBcZM:'}rC_"6; 됽,ΟBYXYok)3*,n {ln37@;FJ{x>o7>=MByܑس#r^@2a]9oH20{q#:Q>K38LQ/B䇨BcMu2Gk&@Bx*3fP'*UmTh)Vxrx߉Z yai<]L7-&Eݥ$C_}t8vnńzñF]%ZB*,WjD$O9WtBI6j_T66u ,Kk[f 1FZlSs,,N5r{۫ɯDæjtY2L1ɍxTla/֛/7{f!}`maT m$CW4kc-jP# ).AwyeyUx*"/{ O4()xgKuŸJ %0|`n{)cntr, CH)xU.s Ew;뉽\S|knaaKu04xpQ; Ѱ g$Flt9)Lhkz㺩, 0`֞{HJC]1Ն\x>i՝t8Spevf`(Fp蓼 2-a#O;כ'}ϔTҥ"[-nA}tw %C}_s>ƜW!'OV&ȥKp_m9FU&ɚOBSh\zȦIThzS=DXMYLY'Y\ڨbi^+5HF"&cʞM0X<)2xQIbRiUfꐖɭU5F2v&cʋUӫpǕ<10DHPS\戎} tј>TRK6PKח] iH!G~Rf2t4"**gOEeo 2EZ9deϒzڵS({qI <pս'%3N^y0k(5t\M.Zo)bo GDH?*ejTJ: Z֪o> 71:h4f<^4;*sOuЭG7)t`9;EkwP46> =*>zP~CT%s6H;w²\r^ȷtSGao<{nfLb(Wr˜UԆ7&mfâ0\I ڣ8Rʅ ܋"Nb?l'YNgЎWA=IYi-Q{*y8{j. ``7rc΍ јuWj7ʯqw`W- z=<#"jΆ̈]nvly>)~5DO_ qZSra;ۢDP-xxznh3 3jzfKxngH RՎy##xXU dn҈X9bB>&1 "M\R^Ӓ;`/s\%]9ImfШ*7}ji3?SrNɝ_;aZt&vVkZ' gv򆩵)FPYDWW{jL>C@[P:grHC-x*>ҹ?P07y@I+rYw洞uثWTbе »9~LdOjJ=d`l"I.EEj;:B): "B} t"ٱߍ?>9Hf=N1o[9Zt-C7[T,뿞 .S &k8SP W@\M]!o.(fUJ'8+;&)p Ő/Y=RNě tCfM4j>Bw+q+P3p(@Y]DĕTfR$RY= 6_Drס)oX;5,&⓽{f\SӋi^k#P3,2Nr"q(B l)c!p\ QH8V;xЊ{cchL@z̮Z˶/=!{͜KZ1wm" +1,A\ O/ =e\p(5gA䶐\̵I x7r5ON,}enm|,\zƎe[Yο"?:!s6!/n]. oU]-8?Y;tJT8kh|@0hO1yN>XK$s׻;iX: ;ɨs/VH}ӥs>z@Vd W]ŏ!O;u mU,gHD~: g9~+g).en3?ĺˣ:Czâ<;|K@_ŏz4q^?3Cx .B1f'o rf X ꪥ)Y4 9t8HVK5<.&D,pLmA@.?eb;%{^8^)4iki#<nϝ['-ߺOX}%, 2蟋rg# T~ϟJ ƮB XRCQ$кWUަ[."^:#w$ےT2/7HρjK^ڱEIrY# Gi!T;ŇDJf1TQ6;GuU;wcyapVR0 p!S0"lA+{?Lּi EqY !>L&Dz!%L okgCNA1y{X!ĉc"'RדX>]M$dw.؍\ d93U.d[Žp۲LG|IQ=cT8<<=תn:e3=MIѩ +(Լ늈)s_"[i]PD@VVIEK'2 )7K[X\f>ˀ$JzOʽr%ge_:d"X1 1bܳ'3 ߝ:@+LՂ;Ôs, d///j[<@Y `W֖R ("!pnnM6+A ޻g 5p>*_&[; NL/'nu2p捘qٚ}Bi8aCmP--SJ-{uXӬ;EG-.br+.k\SN?HyPT 7+G} 1*s0iq7%AA4%J,O0?MQ~qp:A "APGSq7&Dt}.~kUJHk"fE`q4 T׹ĻLvJxOÖ4)bHBD+06A0g#W>2DyJ>0W=tXf\jilu`'>`ZٍuύLXFc*d$tԏ/y ihM&Wi珻jh e3Q$寚{"EVХ u00W.A# G(=\\.؀iLe_1dPW:녔>'!xpze .K0b pSw+2Mf;aչ^T2O36˶M!oK6 󰫚~8l7ipCQt[o)^m~ jLhe6XеB9l\N&ﮱSikĮDsb,In/)=z9l7!:v6eg|CiHE3rp4ʂ3-GGQD/jA:[h,ݞ;auK*Hnه=6D0Ͻ(I;^Ÿ:@aVE=9l/@H8ҳ%2$aQxo-DTa݉}aV Q6@u,ίlFe mPa 9}*C# 5njs8͠k%>Uձ:ڶkj3H:bU\l\rKVnV러؞LT3q~WYBe[#~Shb{9ϞstiMc1XQx`JJ /g2 =0/:uHbaEK K;W+zH }z\D'kqtt`&)q6=/w)%*|W,K]y(I\ wD}]H}:ݥsDkwU^x/'C{a9*BTDXR C#!|}qTx^#؟Ѐ Gcs4Y[ PBNH"[Ys)ҙM,d\MXr]f& WP>U bGCDE")P1Du"#;q$5Ck N(ǵ܊=-RcO3m%eLi~0̶KM@85="`W*О{o74 F3:4f#(3ŸZUAY mx~l^g 1\^AC[/~h ob'C֏֨X}ljձؐE=p6}}EOcxq{ <'lڵ8[ЅF? :Zx8ld 湂t_2y^ KH{E42"pX/WD'ACXt&ӧ2D\J0/FЫ{L]MeВ᥈f5R#&7.C #;uȩpzLوl |PSa,A>#:WqNOm\~ߍD$0^>4ѧV?ߩA ǿzrsd,F[};Y"'[=x&Jrl]neu->]-iTj_4&֙?R(Rک'B…-X1Deаk𧴁-Oy:4&SM**'&Kb{u^g^ o !MA ‡ A*Yj#>#2ZLq-C%\/|AzTufnI">8f۪;5ܝxr`) h]}Pt-_` (*շ~Lӟ=r5Dz1eQpT_˕Z=ُ5:ЎA{E*e KW-(o,qǨy?"ZOD=̵HZ>SE*\_<04l-bxAdl-.\6$9/T1&6V(zw9%@샚mΰ~W˔_ Up7ɱA@:+P1鬯 "ƷgX?G\P o( 6iCrbc0W|;]`itU'<8PcD61DD2zYIAd!R̦ $a=دUiy &8!xzǍGCҚx'xvK@KdS":׏,(oevu(HUN;iuFh(ԡ1p-d7EmpedOZ!@I/z/wϤ"#9@@> ՏB=X6\{ v#ܥE) E?0 aTWMMGQ喍:H@&iig`C|+1UZ/26xP氩wzM cIfZSq5@m*)8`TbޟT n~i% 8{sVLAH&jj <$oU0ƟJNb_J+`Yr, kT7[ױ#G\[e џ(ɽUq*5 XСpa9`v_Q.b--[\X3Fr֫$G7jJ>Xh6 Ğʽ4#"^) ޖt9YOOԽq08r]'`{!#`b饓/m*裒D \SL1&2tV {ht Fey O4L z4Mu[FPDWzc "brjq͇AAM^5PH7qW}#|γYcŒUaE\0,Fx d$7uE"+`t^۝N? ؆u>E5"9 `lehN[HeRɖ))qP75jTq #q.$NEH `SfM"!m[pPRR g|;~rHcZQD2f R> ::[caܯoX^$B0\}lJ8q⊙Po:\Gu7no\S2Mx6]6@YSsLu%WJ6O:X FƏIɾ0 u<]qOO.&mgk@NhT4O,>Ω4kYD"`XɎT4n O52GۂujyKt&,702 b|;rIIy4@Ⱦ Dn^QK9ٲp>D.zΠmfebKh^/JpE*дJΘ(#F5oPbs=pR|X%V^i@n&Gj }wAGA {; :WԶ( G|$e|^IR%H c) A7"?DLl0A$}F{ٴz(j ȸ򥦬]@h lx >!~>%wWZgը#U!DqŚ{J4tۡ<%UM*d"fkKdvqAo@QUY$ ;*Kgsvl+R`jR V)|C|4H ap }=3d<4x1$5f_&X @Ф729U_!kz_xΡvlX}|Xc:ũ͋E{;^Dkc}4/!|J~HS~fo*pyܛl{V(cq}j|waئ,U7*܃wJ3{&TcƹK8@}N H}hQ 1{,[ƤsnB1K~#Hꥠ Ca-fww"y(*^-Zg %Xlp H x BDDW$ 4JCw43]r:ϷDǞIR |@6:CyLv`$4f36r8hUtL[ P*wcdI K/[:dJG+Mů(?tJ,-Qs8+"ZUh V "YNv29BUJOɜ &ڰڵi{FUm8A,GkP4 I3XnD{ͯ~ wIiQ ̒6ÇBt뫬4n"S<͢b :ro+~-(=HlT0zSdn⌹9}Ʉ\ +v)K=;ul-6 OՕ;@KLoW0CAgd.ݤId钳dk_x$^2<&`Fa#jVCI%5nדp4M }xʔy՗V:ǘAA$Q$weQTW?d|!zS \ #g%@@2Nh@AϏgsYƕCKhR:H"T1$eo5 OUdD]m7ics2Aӈ3Ak! tNqM X]NMթԈ}|o SR0 10{EUNSZQwkpkO`LKDH-M4.-65U[zְU%2}n<2.^kЙ{dj65*~8uE!1RDA0kn,$6+-C' ر{[lԇMoч Qou,tحL@Ə$j)P?~,ɍ儃.9t}2n?*ULߵj\ο+kEWn BO؇T-Xo?6W%GT>Ӭ\O_60 4K0HeK M5|ponՔeoQQ1%<ݴC1Z`xA$ͅW[uA!캳'#|sm<9'E̮TBqϧEyπy9kjv )t\6qQC<˒ZeHO]/t,LS yc!?Є(8:1=mg.#)BlߪHl(]._={Њ0k|i楼jIG@ϾtG/h0 oUeo'|lԂ^@__Wm7t`kS͟|.<^9;dpcINI &M6얾}֏KaY;2Q N^"PFDxir Dv,;˹UX10'W KMá ҚZhCLdճW=^*wm"  `GPy4>5>?OdjPq$3t4@^S̥A;8rvZmX^{ B[* <.ót=" .I?Ud?MW%FBb 6X^Im/0't+7_l° ~ro!^PdTL^~yk# .`>]9ա2CN{̈́q~rhr,tѻd!v=1y]ୃ0iա!":RM1حĘxB3UL8iEH `G-Pd1+O 7$v֓ªkuE e` 0UVS/>mG'nɉ՞3H>mn> #3XsК0j'NzXq6f[$+lݯHt KšHVzv{LQvt3Â~G֣0aH !2&ez[#6@T +==wU8Ffᨵ85''Hݍot]B46dz=|IAY%oJFi_ɐ] !i@e &V4Xƒo$r@}[a5::=tGEAdQ@}ǔ<ؙM;uVa1~۫རϜJU }il-Z4NEV# ܫ[(X,RI_1PA.BK~V_G  MВk(N׶J&#^0E}ZdL 'UcB Wu`YNC" m ^_댶u~جB]!\}\ ̫rGr@ ^"<0b K01ښEoᗎCA<(~S/)ϦU04j[/ i[)׭~Ƃ<j}@`gC,}Y|#&b$ČzxgE^,jJgA,kz)Y(V[c~ke \F`V'$-S9ndRw*8c?ExmcRR{"Wg4ċ`9<<] vY6@l]+ރg2b_a|ݾjR֒ ( ;w }? [q?@ c꒯Fb>I0#H"2AȒ@^%+0LAL]Q#;g?Tw7("!payȏ8'b`A48lYYE_jJI!5U9)ӀTH{$^p[̻KQ˻IX֤a)e4f){z!߀KdF9]~ y!ue< "fod8P)j"{oЉrnl0 ҧmW SG-'Yד^/` g[8cWę&<~&oͤ0R|`;YGd r-hYYX V.5K,GBwJԀo\e}A{/ko+A/+UCώ=QDdqej-4݀@o)azX@]2GS܄INAH k%a۷xŶN|aFûHa" t4hw}տ: [9H+W vNFDr+aaNG eű-V걅swdjS+XaiQ"Ϯ8-[ ;V>@{=}rв$v>AgN-( xn ?&5M*}̥ߝ'~dy]YTI9]YO?~4^ݖd|,T"/)I7O>,'`?+VSқPr!Y9?Izg%ʯ?!M,H 릷#b0e'dȲ|Σޡ(cTA+5=Hѷ%ctKCwΟ?NseK uo&S|ɀC)+]93IIa{N.wֶ]/FC]许n2~QNvO)zeIn#qj@P 8w07(25&h0u& |7+ S# W4 ;j+ցSfUh&#ɺmFM0 (Pw>%BS\IFmbO[뗦/d*tk(<R+rygJ?/_t 0`A[{ڬq!'$f6{]L=[*;EƺѶD[!8r:Lr$=P:SgR8t=/.2A1Hfzck\0QXwpG$E×:\BIQRpG}=!Yuu`nsMl^w5+Ye>߁o߹4 A,8!v\+ڒ~ghم0|sqHp¶?=H~%my0}{P`?9X%{ME@;J U9ns'ؼ[q>-ڀuEv?p'=rVU~dYmdzpGTMi1Ge t+:ey;lx]% ăJpSX5]O6K\Y?i iEZEZ6%H$T>O̭zd<fZ "\ ˮn34QG^lF]dP}N!_;PhⷰS1ppNio٢KԬB kP5Չf\PT6 fC"-CXwK1uܥB]1e`wCYLNhOZ.mǡmS)PUw,H8D. >Бj:fkuӚqR(rF?Ίb>?I {ħjL`8Bq O#>1..$ϻx^,I*gw9O=9)N]LukL/YPn?t3T b>M^oOe }1Rv~ųx%`V&6sX'CXr4.s'ZZ=M)7[%V|ϔmkoƽwHiާoqZ sCT Мz79PgJϕ ^J}UW9{b04S "j&QGi@.$[1}(+P:jwn(:ne_>D1) U02$k?wi{^65Tn#wcWa{ Xͧ;=<*DJTTN-9a~km⿃q܆],SJDo4<mNf|C+Zn$_D{wz=I&p|Yp %\ID4 l<퓚oB;WBFH΄ߞ] wxSAYH^a } $0>s.Ji_/Ȣoڋ6D&d[˼tyoV1bqo^'~Yy8qD#2*n W/W{xL՟|ͤ(f *P8C'6͘^-m"0;nq'eFA]IE=e/we]N]$蚗 !G S3`/ovJSf ՘{Η,x2VzNJ~HT6b#ouBM'k[O-cPS oGRR , 2E]js2 Bҕ0iU3*6gubXz!89{W ust1I IE bq Z7H3ܔ45:*y\R4Wn?^aN"dmD͜6n9D˻ŕgrfD)5#iDVL)y <16駔EL=oNEV}mɚ#fr'PGQ{G ݂M*N-$BپNl•*lltf Jq\W5w{(C?V;osh\;[Fz<.z9gJ~Xy(nγDZHD*ӱhN9K'gG[zoc ;XuTSͯp(ʋ"&&`vlM~q%ILCWNT'glz̄l$j8XwȅŶJ5Ýbn(MO1-_Ě ,y=Q__p$}]1:R~N:-n7M+)mœ.[Zw(.6jݵ vfת?6kJQ& WQ%06ds`rnTrvHElrHg!c=0d(vNbQ9&C@S BRVWX}J_3%9S4߻]hbP^K瓘@=TuԞ tRLGE+δaaxm4[/POI 4+)؅!MT"^:DL2sQ @~x\{Ӏ>2 cqWnŕ %CHVK B Y#dd!i4' WSXZbݕVҗٱ8DC9 s#ueNQ37eYKa0`Cs3aA,U,|yՂfl0, 4,xoK CwpPr񥂕T4[ݵ5 /p+.h?QLّs1+Mt3wB UNEƴ%h]X?% GeDc13,"?u__"CuL+<$iô*C$͠j ,Xq>ś/2'TT{fadFi9{wcǜj|DBJaeuz;5fݬIč*8v2$V&oghO);aj%Rͅ~ Lu&`y'KЫ#w#O+| \( +} a5P"NБB.'%ULO$VyLuva=_UļNC\OAAsBau |v.ky&JD_lE"nLЇvI۽K)2GzWť}Vx9[:l+a|DnU+* vVd\eGX:TL!P [ }'gx$byp0e)>փß0UE I#+D&/ %sI;jfxz̏/@qkΓ/wwQr!}_E_LM-+?o!Mҡ X=;<E% 5sIei8Ɂ|J4&&^V,v F*@$. r߳",/qdz\/'sWeXh6ܐ6P4²+wB OS"i8# hK jQ#?qVO\$Q鎗,vZq#eύ+-Y[҂ +@!"{k7fyV>#y?D~qGZ.f2YKC&CKZ+١ie7?;[c*nW=}UlW$d1xVN]I,XYs Va}s2PAE"!N&cGA L-{4bE)j[K\j>`0x' O)ԙn}r$qw^\:;aY߃B2xr)hj O}wߪ'Vy 蚨/XacDtZfE+v ={~Ĥ<]{kCIMj3c͔|@rck:8Z&b28 Rpl>g*y+Q^X6_\6#Mh13}ͨf6O{U8H9!6;Juٍ5, `յiJagL(Ya 5ܽVB`3W~0Nd;6r&(MR SBSne211-].AlCR10rqݷqbܬ-AH'p⭛cy혧."`qQsnZ6h'5/&7%NIʞn=O^tu|?xO;APp or `~_~_.(6i!‰vO>HOʔ NoDv& %3ݛChcI,1|SLc](Ņ9j=Ty!;K,SpY5y 3W1mfq˪U"C b$:Q׊N֤6%-}m5r;eK+ GAr^x@:ʯoWlX6.f+#uUQ6OWN(۴y-f4uHm.z [sE5)\'BHWƇ)$$ uX^CNy/M4w|lTY9}u4cT"N  :{5cXC]}z~/N%P6Is}ƺi G֚PVǪK?M{\ce/D<$GE;tEXCjƂD#:REkO$fLYl= d;mE;6T|&rAJ 5$Ew9eQ3k *Ttl"ׇ֚a7\ԲA2ɁMqf|3*[caNôV;dǾ5b>҆4Cop؟dD)~U’dwP!5rI"pNV#[RA 1K98Sz2gm(2 }~ Tz,y9$`78u]ݵ`!uN{- B3 gx.=gS2|pjDֵ :yћ>'>B$)8.aR'&$JʁiF|^pdgD{XLŲ:ҽpuv}SDBAϤ:@;!Dqg2,$+ڮC ,tr3 Uǩk{ޔb0c\,.pzO+Exg`@E;.C1]0z8K\$F,¬߁"Hl0-r9>np|x$b=N*_z`$_VvC3HH0PE/ZU Q~m{8Ҕ>H[*Lc6ʆ=zl7妺,Sؾ6V"%)d@̙`l.VK>> ̓/}>.` #oCgpc**Shϡڔlpc m׶<[zyUel1UIֳ 6P&۞ǝ\8iuwj]5S+S8wۦ[Xޅ%Ȩy.\"ӻf $a9E[xmS|pH{`pXVb$m* ZR4'e&ݞNgvk^9?hAˆ]vdRc'rD}pAUu6G{2Jcfƍq lY@Tc ba6}FaDJ4FR`"T ?Bֻ:BȮS&^`oIj^PSPΒhsդt1a<ɭ ՌRFjXkW5L2 g:sTI&oI~5 hʹcE`47;a ԉYGr>pcT3W˄0L#܆AIfM娎$Twdln @/Z>VJi}c{# CpXuOKBEaK$`<:H2eېw]J$y Y(vI,8h僚SS|wnݹnG-Dߕ$ޤ7tJEʞOnƻD $Ry<#۔ /[*fJj ;gJ˯.] 8qHyۜ7Ԕ.O9ond(ӣF7[.8ϔw~e Luu!tr~lHھ~RoZhc 8U=L0ξQ4ԃq/| s!I[3~2-5_{VR>(y&\Pw9u 6FB1[^ L'EC7p!^FO#[_*g0ؕp+_]ǜC\Va>xn ?X5*C܄=9 @ PEF>v/RL=K. +5[4ߑ[ypՐw.#AO 0/-S9H3  b8#QBQ$I.$'k9yH:?l;z1CzC#yRS+u_>*&E-d4s3<ԡpXz[6 !9*(irEp9yo=mRB= Xq2pKY=/2H 2:` AH0jFQTYDP N `8c|8ml P^vr~v,MeM}Uʽj "MdOHa8]"ϙLr~7-m-gLR<&;W_E`ǡ=:e2z- H)iU+wwQ+{QO*I!v҃3̽:H/~JW}^U=4),9Moc~b|| #5ODo+ɩkriD#wp./kL1vmWoњq_-{ )<:RbwZ)";]ߥS w!^@uB: VXq( m~\oU. O0} i%f: kU1zU BLocV {KoY-V5!=Դo@:΅?=xtRi]4Lp f4jDaAqH&o eY.^IXT-aŶȀ;3w[P@J|f${$ , )vԫtWH&\Z|tXdZmhC׫ǯw^P)?iǂeSGKm1M7ӫY-93qވ~ốCQ-F X+-m_4'^%Xj[9߻]&*_ CU], _/Jd \v{*6g ,_-cw~"FwK-,!: ޜr>PN!FNJpR x CUB7|C̡ة4uNYE0 O6e͉%lQɲ/ 0D)yiw9L6lY|JHux_2V|w-& F#wx!@C`f ^yeC`E>S\IGh > K (u)YAG9^YfVZFK"~A(X 1uL91dAF%plx%+"YX6+0yU-b—RItq.VcYנll#p8 h.$Oo&6Og.aiPñ 9k2[<~&wcdgXHۺ3{$P P Ҥ.qߘڦn],{npɁD8OwE4ݹQ^?M! ڛ.|"d܌qBE3'K=>`T+=ю^>XK$nRb|g3iL!Zei<(RL GėXE)C>;ɉĖ_apqOďt ɈQѷP$opQyL4\LWX jG:^qw* :W$6Gse;Dлx`ri&/+e?eA Zv>F$rӷUӽ)c7L#o؆7sԔ ovbIcLXj)LY.2^-bξd`n%K&`JA /Ѝ֢Va?Į0y*ǜ@ Q/uEtU~ v2ۙbhN(`^=&;wH1:7utiJSLěrn*pN[Ej\,< $E 6JCZ Þ+m3XX¦rԴ)/:@y|`h6dBET:ItSd% Z~iQfd/׀0 .m93?+FY!FfcrNi'l967rD|wfzҗ9&2eщ_G)H-~[KTIGWc|ƎIw|HY=̟~['V!C}T<)$%+uL#!5R۱!6*gzPZ׳!Mr8K+^-s=M0Kq@c ]ڹDLb_ 郈 %+f)I_Vg1(]qBYV>ۡ^7C13;Y@!_пDO#"u߰9ZST.x'*P3-;ЙE|Zq/eXQ._:D 'QSMu]Π}UD1@2QqV= $J>D}kIhUbfd/dܥ6˪zRX%kbtʋ2)ž`Ej*լs3 L;P  FbbpQj:##eX2'bEeߍ$ACZP.-kCM+C GazyC[\-S#"릐ʷ/cta} r<~m؅v_ac&Y9G_݋$fcҝi˪١7{=C獧rHF}qH)fG.P?+=/ȣ%7[LKhyfګ^.:%(xt?B]63bOuq-즺@T'cN}'}Up@i\R_ɋsweu$35@ZJEu@sHHY  R@4t{rDTvl<-GQ30CS\T \8(DGE&gWrЦGE xd> ͨ,xz\B$&)_m+iSqG3 o)M\,s̑5͗%|rl2n`0/ʥXA$;J{ͮ7nlMay6EPRY9Ū F[ܦujys&w37f`[݁ A bk''ΈzyFLn)f-IXg(V~ޯ D4@!@+ⰩݮdbtX[1aw \"H;wve=gY0no:27Q'i3QUFZ?85+N)C1B<⢳5ʆ+#`Pس{W5c)}r6 z"γ 5򅫤)0XMF5TOήR{%T`AU@,zbfoj E I? QD1h7eQ1oJoi 0.mndE}sWK1Oh 7DZ+j! hCAw@=A$ӉF&oI7Ha&&( F d?AլJhkHHd莍|]lkkX!i-% A UoN::ܛ.3vFz @UXƠvW`"&[ Mf$ ܮoXc!ݚť'v?p}coTC#]ye2":h=1ryʔh}1'ۑr*.S>V{܆~޽B32 2ݔ$Y!(,4XzpYpL[j5ЩȈ3U\Tf IrS>s8?=jM/=o9̏QDנO]wIE¾ ʈe/*1U|E^jgǸGȱIH wyuꉌDq@2ynG7v[@8}O>M"Y qƾ) Q-&CpAtqIL+x}C]̳k1$Ei]ܱ/5{M*3onn_ >fD[R`aolw_]UcĞG{2JnUahIvy3#l:S#7ZRCO~Fso+5jM~,&T"L҃Pvp%m/+I[Q`i*Ew8Ɓ #zY ]=ӑzo;&pp6ی,Ѫƻf5e@M62R?3[IW 3:oCVMN(tx|R{j/KVj->_8rGBF(Aԭ54μݓ n}9C FɷL`_ Vå,`AH)3ov(9˜aeki "ߠB@BQyՇ$;6iM%a)Imp…kҤ!" \Fn:Y0daEGi5MX"#xJC\l0XsDXSVj2G!~DJPiUo-m<_&+L098w=khc$]:gGًiʴ5/7\jT|5'HO =D@һ^ GKel#yv|:OS;a-J 7h>O "KV8X5DnĿܢ;DxB9ޗ3>xm5VzX[Ouӵ4eV㐙-i3fY6~IǓeu%n#2_ݤpHN#FR )*?d[9[z!n4"RǕNI҃`SkEq)Yjl@Xxܻ;n1h HC9EZd R>R: -)Ր*Y$<в[i|C Rc (I8 \ .Qc_@ɻ1N<"abT7^xh:aG7(I^62@|S RiY,D``Ƭvsků#/e 48_`Ai",C]}(q5x383?@ح(Cr0جhfg&I=jSd6.;/AjDC_ \?Ᵹػ|PP=NWz4Ī+b =;~tkQUI_(}c*!il7@_ۮ~ٲioîc.Ta5&PxPLv,ɿ YɽsG&0 L/~`4%R Ua@ǩF/]h0=nAbƨJZ}3+_Ar¼_'w~{ Z=d=,㰵gplճ{A>Jh GxIhu/q-!AwaP4* " Y Lo+'R&jhmBǺrRy "J%ԢVOה`T!TCUUr'ok?daH $5 o|!Ӭ8'<-*΋VFt *A9jsBFcl}E#Ie2}Sr[3OJ( `wHwt|; E"0ESGWeNFHyo*QSy;oqTW%ɳ)Met"Bk(-Rvk eZ/. EקT+pͯ~|`voVy$ױ GU)eWHҟ 3_(G!`A:pGm flɌ O ~kWfs 'ӽ$S P»ܬjw TUfJ4:lh8cAZ`P"g/ߤ#Z&ON:)=믄5 sDE0 ';Lj:]G"F7y`DIx*wE0z`#2IL,%Z'lOpV)3'iUkkDgĽBa\3jN=S8$ ]M%t-f{̰j)& _p]p+J]k̖, K=^9Ҏl% l%9& c J!Xi)[O]=1Ͽdܜ'=<{ HudXW9c}-`\M51nJԬt 5|QhRKCw$!}枑d%햂(' 3yz騰UkZб$kBu5ÿӷ42gTlr #lށE!QtGI&Js7uxCOE&*$AYt ~̕|MT"sXfl[nS߈.TNc]dWy zۆI;3 x22?߭1!uNhuDv>0+'_ge THVN݅s"S,NdqmJRe#anC@."淶^l=kɖ(im_SHw4|έH˲q ,V#tuvR;([S:r_+$g}Kpo91ionZ Wam3k4(l y2f23 d'_d=ȴjYa_;8 *??(Ε ӵӤDuʜ&'gi)rQg6}Oq*Iw mB9Fk}G`99v?<%Zr*ݹLg=IS~g}ZNKG6 f7#C :g]^4IU\D%zςF`v^[s*%Aϱӎ<aWNܧE.Rh}ú6ha1\s+DɁL?5ݭt=KhārhY]cwOc~7Z>R\ DqL):v6$CYb9>EDQՂNľuIokCc!lpZ CLxwţ(yBeMZs瞡.sBqDi"49&r~E{$!gGR2ՇQ?PzB䩱C^Yx6?q ;~m8}Ȭ!6Dɿ_З ϗ`$n f'Ptma{F"~)Fćq"^ٞat'gl;_0^i!Xt~fP1pLlK1[}3K۟g@Ia5ؖ$ڏaj])|3zraEPdAZeiw5o@T$L!uؤpuN=.F*dwʪD v L;û_ֹ)w?|,>[mDl&R^_(EXr_CD;Uڅe~P W֡'^=OlKN5gYu*, `EA&7tH D+ֶ'ZA8q3uMh\ 4ZŻ?Bnon;?^O5Ehߩ(M^qbo37U-lh=^5Zh%&I3{-OcEJp0)i0؜֋3+17VAwy&\r.C=i3 $Uj~ 5Q]!eB+HZqneT?u kKZ0^ؔw` 5gۨ灕ԑ:fA0ϣ5rVMg8=( L+f𠃦\e>8ҐmOát%:p wMׁ{ʛo14Pzb)mI^] b\Ì#+i[/_q!~28~W{X@AN [1nͻ<,藪Ry!/lRAҏ s??P5)J}"Lts<!nA* Jr0yl`1`e&zOq@WD*i hߔ>'Hpxm ^uZqe, at;@;=VK% "W{6Iz<m4Xh~#ؔ0d0*6wZO4*ՃzXq "{~tW;jgk&{+T=!&iT!o%p/ӒD&sǃ0»T)lo7x^OMxW3yI(Ԟn›`de: BwX?`,O hE ׬5WFgZ2jONlaTYߓ8_q FAT젻v O__j''TZm0:Ga^n!b='Ug&B(ER8O +LЄII׾Ypjwkb6>dzzN8N_ ZX&eym }V)Q?* &iZ'=/SB5ȉwpyukCXA/Gb(3g)duzILnYNpPHAQ.D`B3X˰t 7ہ6 $;EuH}M6&bzmtP͂P`/ꮘ[W~O ԐѩU^Π@U`eAv?0\ zd> lT4j,[Ayډ ~`Ny F֏FV9*]]G>VgٸxhdT{=^iՓ9퟈څ@4+s:-ݞ>Yy,"@FS:8 JC}{JN:jo Y@-;k'XV~-:yPfSzNr'U)M` <„lDj͢y~£|ix,|\LW{[O+5F8;쮪Fd{,* {6>)Nc |ݳ4޸1\nڌ}EW6cրgWϷ X'o6rbDq &by 9h8} : bª}!}uͻGvrl>8D37aCu˛v0,k"zdR 5ev[t%ͅtފT3`?RU9ۈ?tpGcwM#QX9Q{B_+'*!e硴?2S BϻѪM S_ƀ]KQ bɿ 'C/b)]@/ uld68BTpǪ@; [*}mԋ m  W X4\/g/6K֦4`ހ򝦹r;@| ~sb,n(;\ٖV'vEBNt1ac઒?x9o% !_\5aÂqwHE<Kw3YOqT80<)*oQ`mVK?"M?!<2z0ihƃ?CWWCdP0$iWiL9^?Y*6Qׂ'*lHU.;%׈٢+=A`%XX䕷l !XG8m/{urwPDwB"SMj);2!}˰:Pճ&k2B\ B [#4 ZԘZgW mEa¼/`{|wǢr8vHݥ&uw 每Ba9yA]:v\96WMx X`sXO?Ϳt)_7؉ a=3t7a&te̜Q(iN- jT:wZSIHN;~ux.Ѿ(kDx^EڝJV[jĦH7E·1\If0-9 Cy3 ٽU n2F^:B?f[lrl4f(Mt#;LtԈDM8u>`tG^Lb}*K(lW'RG,ڬ8. {mD.b`5=]1F:#DN&_XȆw!t{2Yߊǎ99cr!);?t?<_TGH]q%|H ,rC`nliYjAK #m>س~-f7b%a Ĉ9hnq~{m2yvt֑(x`L_rsu楘Td2#;Ԓ::"Ir1j% +\lڤW[qxjRdy[qۛlK.2 -m×!H8ۄ>V.;|Ty;pwRik4]%{ThWm`͕Υ| }$wtFˆx;lkvw_=e*]ÖɗvZE$K.u|v˛Ý$'vx,-i eh|dŞg"~!Gܬ[GTp_ iq|GY~dTϸ{CT!Œ#fٜO-#5Фܳ 1?ޅkfCW"OnG >4u3 X2XVLE^R+x5OU!PwR %LpsPIA7ٔgt R}lZtq`pRYa Ө F8>u:~ ![c\Ўo"4*eJ!e>A"t!\CH4 YRkn] i1*zNcm?p"BcE3 6UܥN}-֛2e'N"pݳ;JH*vË%9s}0(o gnksE)u=.22`tr) wN.=T: md"QAo +juɩbsl^ k..E,"{8gI93*ǫ;ʙ!A/)(SJjC؀p$Ld2E]Ÿ1hWT]_oߴ> 62]U>8 (H|fQu'j7y\vXʋfGKڗ`I,yU7@:3k}[Pj Vc~?Jʸܴ(6Ҷs,vT0zqD0|z#2k>o^T ւ&[kɇ+HT({BLV#<|Y)szf8ab,&|6{'}7o"h|;v%ҋ؁ rLbmEK#$9EB,W%ާhBffgX_A7ٯL*Aҗ7JWO?Jy둗A&Dmg/-9wĿ5Ogxar^=!btsR!_GOu!0 w4h^9oJnstnD-G&/% 1$CG:GwN{`,$] ZpԦ)U`d  ;dcK +]|B(NZi}QyF/h!P1ɁS2IlmIpMuz_G|4" JdY,AVbxqڦ'&HMb&B$h puƗNLTsʇ"=a5ef"AJhA3;CQ7!<³ɲK"&FP .Vi=P17.$A ESP峒5u(3'Fx71NtaL qR:RTr8$J3G92h}͑UB-.!({I#БmAV_RBi6Ex`Tţ(w!'wC>O#\M4$݉1ܢՍCg%'nxUCDQE Ճy͙xTJ^gH`iNƎĎ·wp{:[8kAx:7GgXxV{ ~ge)ɜ?*VQm#*{'ţ ֭HR~YJڄvN"veWF׉7e8)H,?LG8^0QJ=3+نs&(hJrŢ]'lRGUpGtpo3qIv+Xc {!DNd񏴼}@uZVDj˜{֢|h0+:&rV>aYy̤q!Xb_8{d@Ňam6Iq:B~7=ufJ;mgSQkS$c]twGu˸}Qђ|V׽2g 19%ԄI"X 7VUT(PX'{7~D'D1v9.N`ȁܤe&oꮞ?TcqحD 3hm98 ݙI L+GTAO+U\ R_0vՎmP{PP(=Y&g)_Zgw'6ESrt( coļ@y~Ë=t-C"imm8*dhͷmWL]"}zVѥo cm{˅BZEgc}@ŸU4 (zQEE֢$RYx ~x@{eQPoSr,է4ΌM>9n/7->ɘz8LC% /5yMB8T\'¨X+^X >Pጨ%,myRm(h[ٿm<$,hbpR~IE{o';*{CS1kܹ"B 69aUX(kEw$K!<,2(ֽ%LK;Ëj9rɕm{r8Эu9ttB]+̳,df)OPetgrr'ȫi;AOcFu$_}i;!U4 vئDOAra, ,aHfHbt5 #y@āT)vj/#6>n2ɢ[QY9W"> {J 3+%J}P`o:ąk&RM!nӖz Ɂ>{Nvϣm/,~ gBcsn5Vʒ# *<yR&qLF2Njg:}g9JBĕtX<2V2B}þJOZbpQs$3TTFilaq9tK]k8}\7`e=|1uO mكb_Aʣb[]V:-x!`W`]\(S&|ɔxn@T$hDfz\α窙4strDS4`ݙ,8I;n9!6 u_*ugB:\j 8]LIX>!k5o:۫?!o{z?S-I$W55(e||p̢7"t~o/﬩*G(=^YfQ(cnً#\H̖aF$"8aF-/%P[X'k]n j%o5:0[ntxF^Pox)[9JE*wZ~gqh@YpJ.o4Q:/U33p:yF8^x!JڍM#tyԴ`UK":X`GvI`5nNЏHH5WjK0$u79xX;˝$>q,:9d nՖorǚ?\5R,K4FTŻwͭ IZ܋;w[RkPg {C6X+홷̽:iE~q>+'?D4lNj۷*s9l>aţC* w B8o7Q6n/ Y>3}*sD{zWD8_,fi㶥yj6fu\4IGn7e)(WOGk*\YWIko]{sq)k XrisVړEۑhqvz_dmXtxQ2]?ADxiZ%?a7=[/N9ň[O%4fL'9ZZږ-boUN!ԬGBKʉjզ;58JDT延UzCl;0U9/ុ$ǒ+^/y@k@cNc-hۀ 8 #y蜱biLnO+$0I"ډe7iԺ==r#EGs3(3o=xiL*"?NR3Ƒߌ_b*I1^%BG a6@t<).x LV7dJG2khPEIwoXVt7n9عgTq`!K]IvhRm$D2G*IpJLfr[ra4:>s{E6cVfњw 7/ҘAr+C<`N`)b^cA(Au'UĆ*<@KA(HKd.àڡi )x xgcJ B>i#gi[">U{Δ`Q.a:UqBe%)CJ5s^k.Ҥ55!q !ú$5j9b3;~⏸kiq)nXAqV*f2ֲYTwe =x&~(Ų!3&=Fcq؁4GZilHN i^oZȐ+j<h{ dbAՍJKDS)_黫٢(%:yp'w~|B|j_hdՏ pGygϏN ji1'5[M`&hqj|~p^fxo=N|̴3(*=}t^Y1Q_)5Ml M(9\+ڡ#6~0}N)6"˹ &ۊs. {?z,6Sx ܙAΗ)(zl^B)@:3W7DwBdI$XnKD|M;ªSW4j%\Ězމ)Z|~UAwS=4K[MʀV2&ˉ@].@3Ms9˼hyhiEn3igb{?qxYE*KaQea|Tg+{IBZR7 L\Z90:Sma s,7.Le^?+,#n{̼Z@qFy]ӢV:v3W댶릍l =1O cIߠr}nx ˉ_.}U,G/3&[sjPX. \;dKE K+tZ8ۊ\.kTZemjl5e`u`5ŘY,:SWtL1K tRu]NN4ɠUaZ9湚iF+B! _Ph ZwOVC咽'29OE\pL6iײV BfaiۦU8.vse/aC\}B5`Z KNwv7"Ir>rC(&x5ɝK9)'@nmq9vMeV6:yپBm _,/tkv}~6趡9?inZ``[_SIhDad:aŸ>ZzMv6R,Do>u{leaI'/ϛeUCBJ k1"dl! R(#C8tF2?j})`%GaEz!\>*A Yf޺}#d4GY.M}sRQ 7yQ,ټtx]W 3r$6dJܖEn}6lQ׎ /x*ӊ 8{Tqΰ%DON9_pE.2vvo4rDNa$вF2xpӥwlKF'_8E+򑫃Vgjsjh .ŕ{H<,sS[O]Z&o(Q 7n9Rޏf>>s;p/﫢V4jN,'ib hYsSwEj7 񫓝9ccuE(8c8`}[R< )H7/zKl"]pxr<M)>>Wɯ2Xz!54ٜZ>[T!fJ|¡Zm3x'a~){$)Y *\&2z+/[Jri3E4⾮.7A%@{ՊeJCoN}|FKw*O02>5QyBcmھ1J?jđ%DB0Ҕ'6LWD4Qq)yQ(_ cyQ䆛ǼۭwG?Tǚ^%d5X8U@ 㲩6CH>}ї?Xm+@{g zi|)c.hqDŃka>T&ӿo,.8eh]׆kCE&d;jE9/"h!خ~DnxL[-nI6/V [Cm ux;-l5 CwS3_f,TgfmPe{] Ux9pdF 9$(t9 >IY%"ez?|I~~u_i5ʇ!8xr=a{"Ii]PT&dBkpr_|k= `x]f<?j{M+XVu֣K_ Fu.g"D7ӭ&n=ť}C9CҖ>Bͺw>l4X>u,/rdX3WjT/uޕ~X;fU ^p--sܮ E <,ux-)gPi{u ۮhH S}XZ]A=b6SHWf9cTrr1ވh7 {'Ջ*zbl):24kVP9 vT?AV)(>ETHcLQ2Šn-;FߘVķ-'+םZn'(Mp;ȥa9y |c9]g΀ȡ9GL{TngO hF }}|δaz7,Ңt+M<;'0[\Oy'4Dbg`28a%cD<>7f/Ușȁ׭SôW0zI"ɧ J5rL{hk`O{sKNVr2pAO-GDl]:s6{tgbRÿȴ~SEAHb&I굶zI<HUJȃxa|H, -2dчui2%sDkDbpNK'aFG/~%]:d7rʮ$݈ '>mv. 8!r2j|9$w[&r.ۥ:Hy2(;Ogmz3WL"0snioaLq#LߦpsXjTdӰft*0&2g>nXnڎ8"Jl6(#~bϗVhXVU!<?=[??`U9VDRĠ}S(.+TK= ^xθۯ--ǻE.",`Y2ʷy#S֪(boV/e`<]oܒKk~$CL81IeF&Jj ljLaGs wPfC{NrekSk ƾȗ9X !SuCQXRL痻 g$ :PGy՞SkZ0W$[efw6<l(wioѿKEPGX\ӟAw%R-1>2]s 1Ě]KOb*T'ťD+Q(}&Yx1}%]GV?w@c힇 4R &ߨLEoΝW]"ʲSP37d}DYx̒v{X^H b >$k$""?%S{Cln#Ȟ#RW*ݹH9FDn;Җg?|!,N :fc}5J]VqO}gOD;2.1"i&H(9&_n5]Yk1M`d!gQ쮝e{;D)$%HB+v]9'gL tKvWv1 ^tB4Rz9%3݉Szg۪PO1@LJ1m&kN%мY]6skaϵ (0=FxUaCԃDzijGޜrR ց>sXMCW?y,UaX/v.R ҵot{sA*}}6V?^U1 mY}r9>QTȣ&AZiIi\Q۞л|/?$L(yojfSEAiۨFb"#^)[+sN[XJEu`%Q2HXRnsE%lbCC,^s_JCB_ 90D -^#^#BETY _&]} ؓH3$R*c l24}6E/\ 5?&o{jOCP5 n@Ǫ^D/3+ {mDžx69y/hyƑt4HgDuhfE1+<'%lC*[bXl;C'+ |lҫd7^)-Hlfhv] Ծ5BZK=\7 3Ư=$.)Xx#|7(u9+C@a;&@œb7<WZo(?m;O_C# K3oe+30cHTn_:]wWI^Ь˟_u&LvڽĪ# (' k?O`򊓅)V7Kz"A2E|3uXn#1dʐRaٚ W݂(a*̃/K;02XvgMݢbp};ay ~W=p dJy@6DL4|H(nBV 9 \?dF:pl(HKUj~NykOBҊjm-L 0<fb̂4lL5 Ccʀ$OB&'0TGlo)L!{-u7m6k0>4~e 5Sɡjf<@ވRsѐwJ~]xhr;ȓ=]dgw_U-,1aPVߞFWM:hzH! ;7o8owҐ>wkx䘋^]OVBVa rSS'0;B?oVSn:k R͊ԜOZC/yΌ@nyܲ1P(FD“%=/De:/#}T'c V7#DX5b1)LۮⲠj yNDP0d9N5d|T|v5_52Эidkb;\^HN]?~DW[ŗbZHZ`ZԈ,.L e:V[vL(] 0#D8(]&I)-3r}mE^'M`}W9zd$_,7i|C tk+D_\ XOh w! /L֞X=iOS O#Uo $ߣ`yB5U]V#XJTH8Lf>G"V6sOz_rm$=ZSЧ eTҹVM.ޫqH8_ T "\F0&-c(ٍ\w>  V', Y׉*^!貕9MƦěȗllkcM$  4A/@8$Ym;i8ӆ=KQ5VmqcRٲ~(QwkWǾUYo;)Եh]E VQs\K"Er{&*SÍ9wk)>},ּ&,~+u|H~Q*~C0e"y,!,A`H(3,Zxjbnl=C7B:lUE lf&W}՟;(fO \_PAQlcO pp>&c){Xo^cУb5̽0JAd@R;D-0I$& #~pۗ#H+Hv{Je)#}7%VկQ\LWȡxk^ڸXv\}ʒ Y}fqCuWσcYC!2>ZJD6H#¸_6=,Y2=hYݡF'eL1jeɄ͕#}J9{oHQuP!LPO87K[5 70t H"Uh^DC ?Ra͙cJMM:Q)+xtp{(=? z.E4Ij$CwOØ% iK0"+ 5oh%͐ Ee[ra]=JCim~cV ,?NԮ:cd*tnpj;7n&o -WB28XrV"B̤5,>҆̉|y=Qbh,mR^Ǿ ]p/M$b^5moA\iܯ0描#\I5hG<u}4h9Yu|'\wI ˣ/7?dQ]2eOFw+xh5X|?'hh.zw5({*ߩ~~!A?)EJn|:cHW/$#zcsxkn "X_*.;V6']-i1$hǭi |սrB`R=rFjj *2n1)4`·UtLA dFABY3se5[ȯ@bae4:(haFY\C݇pev()VfjS\Ӿ# yU">7Bm] aLaILсמtĎrf3eô{C h!"}JvqutLҒ[I0Jdĸ⑱ADmyq;<#Ԏ–ss0Jp{|,K`_b%X*xI+m qCDfM+27y(Ӧe`@˚!e+[Xk"C<*I\8|xXRR2oj(nSW5cK=+ɝ'ݯ`dّ]E#ˊ=[!Jl#ۨAؐFs2*+'6 ʭָW~; ȋ(ܵ?JJ\RmK}Z % C)8}~lkX8IN}m6zZc8ImywK1Di„m(<́{SWNP^!A=e{3`I'й7]ԉ==XQj/8ybna|Cw˧UBղ.Z5 [mȺ…g@;Tu#!?;x0l*&)5Τي5GTn-.ED/e?,2c-ނ;. qwWuIK",B%8rr Her^̪05:HLO4 'Y 5Ix`eU^jhZVI6fD]9ޒf7T y9 3=ktfᐫ1)諸 ,'8#uVi P>̯s_CϷOy2e LS`?W{qƴ_]ue\!u*;̋e jྭ y \͚z4xRv&i13m=.E0p 1P7nGvY/yEk7=9,J,\Ad vW3FXMx/0H,H"“ p3=)Lw37ʊ!H9v+|Xdճ1':5'+^ (7ao9BضtCgKྺ+fWw~y.f-MjU7sı[ljr];88C1Bh3('V v$Q"7:iDйp"Ìr؟v%",gknC8|M.B{ (&6:A7o6ǝBE>lqtv*pDtfl۽` T]f<^_!QWHo r/iY3Mwu(~]e=)t|?%Ҽݟxϸ-q9 vnGUdԚ o7=hr0|^ Y\ In{RB"0C0d[Ug6 *hͼu>Sxǔz#e&|t>跹e Dl1Ii)mS#l=ġBiv[|H( g,C^S;1 D\] VQ~kӄСcy^է3]ғY'L83ߴE9j R}H%g*cf;>+i_pFWݤԣc_ ZwYl:".8lb?CCA:?b`Res24Eb.+'g\K.ZOjn/ .ja( TΈϏr &PElg4@*UE > SReK#HDb+CTFQI(nPgQ:@>D('BD]%hs:qD}Ȇnv|9jc]9'zzswM(!;d+Y.w`25᳓P$׃)B)$U4jNP+o(p4ֿOգ< fڼ49HyTowRsj."[7f.A9EHP5BRCrn~~O}5E}g R ˄D%\ųR$ hf ) 2b\]}E*Iv[v{a`UWU2-B,uœȣrv*A.o_t}pȯf@ c?۠Ai079AP6f9'Ӿvݪ) A (ev;?Uk?.I邁 ,7*VsUNVLzW з|×؞ [xUlɹ(YBr&]7eF :yr1Rk0GipA}f:#).b8`.Sndm\-e:p 3G?,4$5]s~ĕZ鐠/ Ps/Jƾ啻trb1iIqW+xwhu<M8] (|@ pB!^ F(1U6Dhx/10#4UK=bJ 1}Z5 yX <1vXt>A+`k+<KΞqkF@酪gtہY~*z=e# Ho@Ʀ>ʰLg\=<2-)/v+wqbyD*wQĠoـYd͵wZΔ)X7W1DarAw;9y1kj=;H?0yO _(t= bn[mſī_0096CHHvD}|~E)di;J),2cc lSўwn?ΣHtr,1 Rj_̄ƦiN?/Rs4sj[k V ˺,ث{w7 V43V?f`AIMo-a Iv;yЌuJ/\X'P;#]OhlGe}vGfD/)\78fÃG˽GߺX>{]Cf tapJK%qjJ3ˏ`-M\3Zd_b佞9'0T٨jLêT|gz$̵›SJ<7"*1ST& | 5pݕ8n֓ӄ8iAevP+cﴨOkQ2;mD$`pTB&Ն\{]3f6IGg*ohcz{ f1["Ӻ^Qo芔f+GIƙ_~V@ Q-[9㑐s$RGL>30$,+Z}XV_3&<`W2a{Gٚ,@\s-xz\\5 S30{C @=>;9ȴx<=}LC5BWB跥~D_o'V( E\eJ_+(6u/:_Z(u(l>Q^95$ B`) OxZ%ή?ZG4GO}a3*"Zrrb : ӵɔs$:`%1s>BV3t#? |d}`CP:Cq SS6ῆqk,37Yڡj8,^{NZmQ,Fͷ:*[1td Ɍ钭hk[K@1L2Ɗ=j͆ue5z>P5gE* t>Izl] PX\^Xt`#\5LjiPL|.0\sHDdY={#vz<6t[yp%H L ]̲j)/q&5U=TXY*G$'@G%9_a߄iV?y12NDi5 sl Ӽ U#MeȿVbHב6Q1ys*3 5 Œii =3`#VydAÊ3+Yo䞆 Z-P+¥axX ɖ$d~&^}y x1E- j \cB_$]ur;?B fcxy4_XKnxL@a qK?P;=.M!+cV])$ k:Q_{<,ͧeZ׀ foP]ђIxlx]j`یbҜvź_i?5; l̶ ؃6rbT1R B_T -7NW~Tf:NB:aGE\cY۵%ߤ1ɛm,X'^uфd,x|҄SL#s_+$s :J݇;>S[axɔ܌PM- !`L!wHbɔ8 e"+DcAOAWj(fE쓃 t9י=>D5f['K w]_a/Og24þ菺~}~Q;6gu 3C&)\ Xϗ9T$ JTx lЇrrv\NrEUH}hMS5 QL66 SyR5L :gŦuW)N}^Mݧ? !-R HPM+:Fͳk%!ys^-~{Wv&߇ÎfyM,@9\/pl&s6xag;t6%aw+zQ|bIMfe7&A*?:MͲla== hr>Jт|UI1uGF1Aޕn;Bt˓QCӜ5!GbAPlI .>Eo~QD}/Ei)K,^BpΌ$۬IհxPآ  3_鞴bX emvZI;B1_cu,5: _υ#)~oPMkW< f qT/xmZ@f)K6|{tnY+eV$}ן'l2 x9jn)-oD%7}_&DhAV;A9* g0(Qv&i2.m+z%<e&WRJ 7ւY[M6E*V͠dizwJ;YU2xgSэ*FGy{ 0Q[9F$Qi+ۢ;T~@ KtMoR ll CN]4O~O,|Wy]zz op0s%Hr"tIٮbX_@ :,],zMGO -75͚Vnoщ1m&zO/@I`N(, z3w M3~KuO?D3 Z f m3ӯL1R.вfT e\ Ө3EXyu49KW!\;5}A pn#*$ߺ2ܯ‰8~$!f 4xMUŻ.-^&Q+^*mOQn3iFJ;[_ֵ^N;2XNGMd8_D U5Y'WbͼK>E.?ŷrV/Ozv鎺n>C-[eZcun{6M[rJ )H7V\5O(9OT̢G_Hs&TZ ֖]*z 0Ip6inq/eD# ŇY$ 뱸& ݆ځ3hjd]7́n߬ [p}qN`E.m/$nwl*V%ԓeÀM%q\TR`yi,W8%TX5?dZ̑Q>]ރaMqHۈ3s'׸2:GfKNY$, '(Hvhqm_76ED +jmZ.:tZ?f+;"MHcVF>9'֡O.B + ۠D~k;t63|k`\edJE~^J>ZElY:'c{x1s_55-r= W9iXL@ށ?jHeS(C߱ĐDJ.ZKuh0NqtI}[c![vNڜ\-GxlAQ*v6xgЇ1BLvq1rFx1rgxG{$M~[|R m3v Թhp+."4࿍^ʖ:IGt Oc҇*K+7iL}^C-2qۙvP%MBz:q0/ۆd@cjDAkhkHjvS۵j=O'gJGHW&r~JQ_؈ZC;p}QU g4X5eI!ց#Oj;[8'-!~hB8`]{}s|Mjc`ΦR'I#nIl)GBs9zH4<&^m$CP.ѭt^PyWb_,Sﷆm>7ڬdMq#%7Ǻ&+qэBs1tq@ڿ(#„kD4 >Mjΐ&|K2,l'0u[ c[a:bh7E>J.ws[o!S,yxa w"',Zǖzå2C>>ޡx1S.79fԩ=`\z*$\Pߵ2llړ<{H1hެ\S^'\(U#у4Q%3HWH4~lo$OM\ȉLœɂ ZA8Clog]rzΚ[󐬒 bNjW8lҋ;!Z2𿑩̰ W5H {Oyn/Nu7LfE4<(rAAgf>6w} h䐰B0,#AP |&@ F*Bpߊl-I̟Mj1GT)_!{cX:z$w].>xGmY r?KMgI oZ ߟ(uaru5S24„@$!9_*I٪Ў w T'ֲ˩ ߏ?(FPėTԁT.[$(Ɵ:~+}9{H0|x>R؈SOE ES ?8MvL9n1O=a"X^{mIdV^A+V?f&rݕc4YupqAir. R˘ώ׼S@ڈ=aS4g7u_k#vRڱKjN[i.>-3yHRP1>zt`IwEfspw.N[Uv$@E Rӻ{3qF+CBiA/1$O4joD&-8{'027yFq0E-^4g rbe?OjvU)!b];K˝ZwQ} gߋ67o Ňi4MY tELЈR9@mN|QiG?)f`ZjaZA׸ƌMAe0Q#e [_f"|.K%= PtWFtr:պsN:7[2(|2ˍR1)>i%KGCG8"Q!@z*%^gN'=l\U}p$ZbJʲCԆ,F"Q"je*~c T,QlCd|ƶϣ#TFR#1L俊oٹw8Fp%U\ l"Oݓ H c8TN{|.K_+dΟo^:փiŸ|?6ώ{+p_ևVz|sǪz zB |i4&/?%$QКHש0rS2[uZ Abw(Z|uL H jd:\QBX2=4ÔIRm%jR9WT6Ե5Fuc0-'Xhf͵c?GO|xG&Y( x..3=ezo_=i&zûBpH,_1nrP8KKz2yԂW ^Ѓ1  NH(df歷t{࣬$EGe #LDfTHJIẢȧtߘ}e҂{hz~۪90|7x98u*i34h> >($Q*,M?0sFȜDD_jsP7>_ӭ_-B)Q3z[]A/VQQnY o%Q6T)1RP!s4pۮ蠚b <C d7!Y<_tI&*Hb@7oߡ*cMwbƐϽAOyzm'c.ХDuq-VJ-xM8һM|A1;K[X@z;2 vz&%`Wf%wOHgl>Chh&`kb f Ȟ59v*j>_*y=M\[`sA^#ik3?iv'HHʏ9[rEc) Zݹ Kž{{,}ׂ)RʼnS\`ye8""Bf[Eog2(CsWR1ޙ!7gwpK6&ɰdPܻk*lF'#Ǚ*EsBpK-44)U߭s4ClKuDvv=9֑nUGEun8?eh/@S$~/:PB{7 ε 7p{2RG %Pp'\_Xcp`0(;Ό9'n,BP$ @C~R-jzotZ;Lv!BA?|5AŪ*.EA#%y{?@`hz|H!fF'@1ۇ5 Q&HGDCx"ϻ<~`~6$/q^`-p0( 5$$ʨV~ui#  TyxTK,]2|Eg[|Ri=89pl%k΀ݭe T|i#k͉T)MDܷ2dQaթ C8u,(:ΣAg}l4H{Amb _r̘A^,(UbHd-nN=>7챰M5uZ6HC4`M) DaQM2!7^Vk)Ha1v5=>V7Y=қ_:V\bީ;Ҧ'BMf 1?e]n R 47d3Y7<0](ɕo= ng>E'Ud>T*|gj_A`̍/x 2gi*YБRwF˱׻q0оp,5&ʼn\o :?eCFK{VUx)rZ~'F˼D!y^=խku+|[T%+0W[kf_I, XRĞւ95 ͷxh"Ĵ#3 I< }̑VfXa.21L]M5[7?‰NZ1o-f2 uT9#!Pe 4eޖ'(wa` 8HUއ!ZZ,̀ 9&ev+?@E'x9iJWR" 1enۭ;pL`d[Y 6&~p;2MNycTWԭ`)fFH(JAZFȪ ؏mW7X{RSWSTl r$ 6ycuH \,]мXxV(尠A oZJh] i_sF$o^_5V9[zG?Ok^6a6~6G mbH')g=.fyrMֽ= rU\/FX_F>VLϒ[g_o,WMyC\rCoA7ơݻN^)^-tCUB2ݨa(^ѢߠWWOK"ޖLz_Tt0RIjɫDГL?ag ^aL%0* 4D ބRb5V0x']@W] $h299>_j\Mq\cd1"zS,Hry:z8{^\BbF- $+j\A9]TjrÂ3GhiY&\ NxG(\gv=* F`1CR>̢ er2WVzϝ;r>uq[r ˓iw4!EG#FNiY8 "I8H[a L:n 1́S2&@unZgHJ`D})ߐ+h^Nq=8R-[Y.Q*5 {hJ2 [sƞRUT\< /;{'A+\e{{7,n|P1T5`/U탆@W8*r1 6@  ֯)cnE_3#M*B! *3T %Z[(89NrQ jۃ^̱T^Vt3/'%NwmJӂtUyjNȳ=d%UkFM1\O$,µx<.(h`Y'f X-8]@>w$[t2c՟҉E)^ډy$,%yWН߰}8igY$kvQ#}+'*xCb-0Vq 7&!ϹsQi銶͆lt*iwDcXu<.!:Fw&K"E<$*Rak5 xz銾A:g=# *ZQ/ 2GXGI Zւ8HWyHWJ+V&*f/Rb5b*^G&_t)HD' {34"m$̦uG XmklI+ev$ݕb [/P'u8pWBV$|}`T~ bK%$ul ǁV㛦C2枚(5}HsMIEy-K_N-c!QpFogbuF@-{cOYַe?%><ր`}M[T hj.Сހg}]7VlrwUJ&FaHukߥx>1"3TEmfwha8G yPI@ $7֩ڼ1\mJP<dpV$' rW}c{@1kHFnܙ>3͌J]AG~t0?zp #ϧ2ҠI%imh?yx8,U}6ir?91K<#=k N_r<[?$me# AMKf܉CN}L26$\c#{QoM;" a ε"t,*w)7&yf S5"ۀs,D bDwMy`p,dYTr^dq$XZ |!Z j:҉nH+ÆXwn ,o1lbpEvqor1q8VGT ƍ5g̦ᚡ$"ٶÈuum:~]>֛Ub#ds63?tkgf䏋J9%8RՁ,'O`-s?f=j ]%2V "-)|1H+Z;X?KYk̀.GJoخ̀]x; > l]t_y_ y&w*ᜍ >ʼn|5`(gu,ǺSHjkvlj kXgSO-LrA+=[eIIpMJ{_DXcoubm볇 .&`]^C_Ofhw۠`,F<<\W); n`p&YI3s\K+Ij'_)^6`ErޡMcXB?t+}b.¶8>5;K!/\U6'L5v]JS9j>=!dQT4O.bPmb_4w|%]{s2Lq'DR^4eC|f}J)eQ5¤ͅVGA n%Vy:g%.=7 n0iKo<3v EL1ߦ:&PoAKeƋm43.'|4^:hV^rS|/`@]#ׂǀ,/6bDSK-onWڊz?Q\ `մs,*Վ?W:$U]Nx.|52R<h 5YUs!i!Ƶј'nx ^ nQ5 'kly^y^ބܧ\|L{uah]BQAԨ`NJ( ŊuŚ/c>vb: TqlSr~nnr9Zߧss35Y- HNcU,gO(`5.ƙJLP#xo]M|o+ _+O<ڝ ;dIY~'LJ6nAI ༸gоqmŃQEiQj*H-):uP OdA_4>K.(9P:Jp-wuWC U*JQ ZQ'Y =r2qġ.>uAoL@Q/H5@Qep>H[Pg}#glJ,_b7OC'fa6H+(-77Ec0ܢ@Zwj_T^d{r`w  [XVǽ $ޠ̛罋XP|ߤ. `$E1nFKx= %/]Z8$+dJUunt)}<5d's;+0F ' 3v+fAA tͺSkb,Tv-6iI:/dWhܖN=f#8/9[Dw|ҷgշ)3 㞜]1ia!3oq@/m_ۉ{]0xa푟=:}Kʃ.:צּIT/,-:cOS$闋Fհ/w?vSkQO*&EEp4Q5^@54 tH!5_#&h"0kUrzD6W C5^Ƅ.o:ä7D0b ƛg Υ2t{ M,B-I(Z'R&f Qe MU& W )vSia{9֨`F7vx9Rc}{bX5(.,Բڭ1y"{s_NQR+S" )9|5&K/ )j LglIc֍;+@ɤO[]l} JT= VZ*R ;nJuMZFk]y¡7NpZ58 @[I_ԝMI[ Н*27Ǩ;LI]Γ4V6;@2Iv9]gb:s@yXf Ja(u}땘k`XӖZA F9,ͫb#&ͥJL:GB |TXt.z 1L¯ɉg&\Ax*q˶0 E]|9 ɔ fЮTdA'Ck䝆Bzs"h:cjC_鐗M:vn»o{dx)TU¾[,U$t;eqgFJT7=,'rݮ{Ψwz<ױ}JT$،c{&>pMRZ%@E&\&>M6W9  V+;6wڄ)BSa;5u64'?{ 5x:~J:c9Y<#Z8Resx7/g?`itjNGk J½wث>/q64ݩ;3nٺlDvR72YOs+I*徛yۉDR%+36jıvP u"Ȍ -FsҵiFj~hȋ1 )-BEJ2 Ø.f2fYdQ @wTV}hr V. SX~<piG&i{TF Sq&K ]*Y9ȥ (lIiVL:b2YI{"HڵL F^\FjR&R"(?g fho 8oeNn$Dya:dV(V=S`W^UKjC Ct\ʡ9H*2}z&L<!.'c;v3HnL׀oɊ6Ʈh4$KM{@}m=B(9"<;ql,j`N BQR'^y2,};؋(0! >b\1ܡH~NFE8,s؀{Y{+w$nWI1~Q p1؞xmqz4V[&Tڤ\)m 4SqߌpmV16~/(2C.dR[u?H"YBL:۪3z_ j-ʬίAiB<&gYfdڳO X~" Z##J16Gc:-j5H@3?^BqJXf0lUTVgOygJ/nV%{DiopָeL ҕ~LCKcns,bf^ /PUb*VD f=5" ٟRMw/G^c2+t|xp>:RW-H<-yp bSlᬌ,SuX{$%;˕&Ftx~}OUJ"<3gzJgI`L>{lэd^hFq0 >_wM$ZܯOAGzKtMf;k.(0$# nlY`03^+ڔ}_OT׏g<1ncfz_NEeTè dOb 26,j[v:Pڈx:qmJIwsm!s"Ev;!):߫7V/-$k.nAl׹k)]:fA:$qj3MSZU5_ VC³Q|(1Z*vAPeQSIϙ0 d 2b!s4PZ/ -9hGPw8`aQ!dyãM]̓j H>΀]/!!L ="kRwZ}0n6 }i' ^k*/M6yCeHjZc,ՙJNZUKRfJ Z|6TN7ŞeTLs YG0U}֞&] rVqA+:# oB>b1ߡ!\L䇨\`vla[%xE#TFW!nݱC97-m@FuCJxsI[Zy8!CM|9'=.V60ט3:4ش,c%5gR7.Jd(/r(-fNp6c/q͏_qQ)?q S h:/A! dqс ]4Ԛ Kw5 7 SeOrgCt:k dwL~VYao+kj?.J T'Ž*aA6cjvkªXl*Rg" 9#J']@޲)R[∽pފi[H _rk]q,pd8D64ro\!?nrnDL$ː;4wtzQ"B4ջ%B'B-= mamU3)(vjրN Ԇ>XT>QET #U=s0*A[VMfh]lzU4 "aZd/| #'f±g1ANKkfû2=GrmWzH_lW৉{޿Ķ-nrNw+>™0Ӻt0/'*T)R NnE~ 2ot.Ӈq3~dL'_-SBVviTYx˕:"xu-]S;?F'.:ήſ,X+`2'r侵+10-[J2:1qV]>.q#*|X2RmnN6"^b  䔷KcH ( `Hh+)#z c݅kKzK<)62,㷥VТQ#Unp{{T]]H%R-!Ѽw?)6 $| } 8͹O'oni;8e!,{i>zaܳm"Yzɦ%2RX۾뚧 F#_WF9u9u-d3oA{Nhv} ;%Ɔ1߻F 4guH5[=PlBX%oGx[-M'صXNELP# #̎a^1toš ,3- QPh5$X&ٷ P8 ^Sԅ:2ii2JTЏ{?U!cfPS7/e:zz2uzXL UG낭~m0taSJ 0<ζnZX~&' r[zL+H㥘'6)>H^|!itI33( 7):àb0D"BHy.~__7G0̟RxCĶq--ta蕕`F|FSyaQ ZOJ%t*=h_+qQ—ʨ}NQ\iBj&AwK4ֳiYȋ)~ؿ-al뀏v?dw? Dv2ArQNZ-#dMRdӱD2A-@a Mzw-='v ;ĊK]i5PFɎFzЬ^ƒ (x0 eی(v$DhRcw_*O8,rI/CzX#)'P02yVi3V~ps6Ob+Ɯ1ühW4JIզK=AVآ;.m_/; a:rכ2X7D.BüIsi@: #=PbiO&/۬w8Rʺ:!"{}!R/<9]~aYYSG1w o_y8YN3aX3NBN(V%?{׵Py\>T'X3}1QzJxDp+q`[o&\)&ѿ]yng+̻{ǒYg4~3E|ևaC ؞acML^~qF(lwt)P[rXrZ/Qp^znFʡ… `^W:_h[\}f+GЫ?R>2Ι sN@20= !Lϡ.'ULLVۏd $&^NX`Q,uղTfrdP2jDFG墙1kJp $S{Z`T}B-P 7Ù [I\:p1Kb3"+mdk|}ZtD``5#?'xlܭ^Uߙ-#Gra"λq,'8Mh/|B%3wZ|X(jB; aP{KWF !\g! 8X:ukB6e2ݘw~Ֆrz=5u!fsԢg'#@C+>ժj ӥaGtrl{D&I– = _0Tdj~%uh'W n(DZ 89psS I3aY׫e'(zZS=&zW5 o 8C_>#p$~ii"dP2"=uS1sr(3TFgVfϦ h~B JC?hGdD{־/ gMus]OhLU ;k a6@Z`9VhM4!U2Wbw`ÏxoϿX\YݝH5y )p7rWȸF޳vSG[~,D |xmXiqa?6rIvohWz@/JFfuLTϝ#o5(@î'k2Q60oghr;R>:Sb?\ίgYqS( ]=m;$T40xLRBW5&rv8h=qIr{>=̴14h1 3~=<%P=[nsx0d[?Dz'~[rC{:s'hJ7ćCmGl`lEb^'7V1vMٮۺ>ܜ|QZ1Βs3l$#Fd5؍OD9Š A.W{l\efo{Qja09N WA 'dښ[Y s.+Aw=(„|bucZl3J OWJEDD1k H[P*/fkZrr'J}X0iG%cϾ`!6R]dw Ƕq k@\I7[Y*,F:xf,ȢhxMo ]ox3a{{FjTҬqʷ֭bUwEjdjw10ƠmbY9]C`ZD}uRmuyiK`AV\u-.g T4mJR+b\JBl]0&Mވ`[Eҩ{˕=xE>H} 덥H&vxfڥ4YG4w?kAgfX[Ǎ`dǨcT[Y3k.LJJk7Z^pA@ɔF,XpDs[r@(,reC ovž ԉgۡ\|@r}-A7ɠOJ[#zDb|Z4|OF{+?rY-$r^}>reY{8^ ƂЀT^Uam/cE#vND !=m@r~׿-Rrt^.*Xl~FPMܸq e="$ꖄkJnԺ^.\$aZB5xg,ywm`8XISu#n"dBvUo\R8y`CQ=ztb3Y5a8f#C%3*}g'xY; vO-V &N) 2 ‘V Z/6IXsήfy.06@!?z 飁w=.N_ؑg,Tf儋(LȆ X٦#%3 tAvawJГú|҂ _|CT `'j4>JtB`hrw` 3nWdìȤ$鞏̃*PO3U7dfW0;GjWGORPqB7+dQ| ;JO^dgD˟N,' &l)U ]s=]>6FuіExvOV (bgekL&'y}G(+TNgIzƄ reƟ ˺h+ bE+zAŻXq֝Н[g+SSNG;{Yօe,?Y,5_e&c.y2 *yt*#eHJzJ=k9x,qTԯ&s?kItA,~Q渾z%w C¶P Rqט#s bKM~ᡞf}n{Wkb# V bI֖{x'%GKS2K+'e}yvCr覌ٗ#Tv$~..T^ϙKe3S۹-<#: U2bEKhO?n7 "PR*%뉒G˯j)YMedIZ_& "/`4O:ڕ7F yXܧanva2w8 \\LwٴhGkqWUIP OXkmK?|\iz0OIgl5f 8k9">~uR)Kl3dOhwˢV$@ʎ^:߽bOr l`Q -_W`o]>'Toq Jjܰpu]qz~T{.͗VjㄛQBaW6%|t+pBXQFͱ!t\#,ϏQC7;³;R<ǻmu"> wlpל9QBW7XsbNDIǑPiAo+)*wc#H$5z?ܰ o51wԪd-NowjC`Ӕ_(ES "baiugchVf[m[(2@FX^"e:D_mK b Dq<aDZm$d[Z2P{D?RhG+A΄5qWuRea?@/`P>ԭH+m&0rX4Z+*/n??xM"ñZFvز,9MMb;iO ٩:RښWtiz{Ǔ6g @V4$;S-5r[z#gxu91KM<9ڼ6*UKV={wyIo}Y:.`=;{.NMF?Tdk puTX߻n :vΏtnɷJ./B 9gmBlS=WԴ~5"0uGYr7<~T/GB1}W 1&.ſøgɕeNÚL)ṵ'[h%"pq͞zHn8ty,N<SmsƩB|}N86 ڹNvR)ֱ{poe;16')vۗxUFQM;Z-Ӵo SeEu: 6AOyL[i][߰JXiXB7B3Nnlwo{yc=~qE>6k; IZu 9+h9r[y&b“@8Np+ޚGA '-SNX5oG$FPZA:̺^VZ{mژh٣ޣ?'!ݯet̨4bX2z%EGgl {3zpQbLV[癐ޡ;L}ڿ'nU)sR;'ꕾ. c>&wCjCw5ޚ}Eֻ qKIA 3)-LQ#9zX05C_hԋ}Ϙ[(4jY:Pc @@t cE ENIAߐ=;c]Po0l+x"h 2XX2Hrˣ Q|!\̍ k v'*CъW& }MqB %&q۰H{VR`zhH7!6 *+ԏuS.IqO}APd-r>i`҄1f3%rxTan38}&ê#kf?l̹jsU$& pD\+ALi8` M`a0_jPs%Ha#A1i:&P}~ 8! | <_P~DnؙRS9>^Sd̀9n13E4":6j>vK'\q:`uz{D/q^Cnsz&aȏT0#rqMc'w-EmtDzr^8R8L+_æ7!,S1C->ꄮuz]rx4CS|ߺe/>F.<۲ aȹ7]bgB(.)45H+HmHZ?%:L6Ou y^6\1Q/κOnD!5ⴊzC/9v%ç7T}2 #ׅ}XTXYrJDF0`OtER|2qJ*j7@OfS|X>a({xUrB>V2]<W9mto3?hEeTx9mJ]#~{>r'YVFx}it_fW<0k4S ca `%^f5tzԐn@e_I gHwA*..O/{4AZ]PG.2|bí=~Y6H6/;s eLX hL~7>̤_0@h!0\.[fHW?b˓J_@h^%R0 ( '5_tE=()r-+QvogOz;)`ungeA)ۥH 8|I'FPeďڏߏK>IBF@"3O!!0}:Q8ď8=lf]!x5{HNP7rzZTzuv&L X7hk\e;(gP>Ҿ.G:?eT#T( ZP;%|OqPG̫Y骡Op$N5j$tz +C<5B _-]`[&^ + !"v.Wm6jgΩdhߛqvyvO;*j KpxO'|+I4xhFv Xd/ۿ 8*኷$^apW0M=ܦ$kGK+IXM[Qࢠkxv"E{OTnUj*ddB?Sxji1?Uث %=cH#xڧ(0QD p[!.T1(&I*Ou|LoUNP3M0`WA_D8`?Pvw?W* fASz>J{̗z in`L q'O5F(dyP'xnv` 0cS7 Ej遲հ{SN2I{P'Bߙ~F_&S;SJ}YuA͜$Wg2=RSe66qGTeIHcʑ6rP-z[&3l&W/׈_hqwۘ[44 #w/O@^70%!pSܘZz%Ӕ|46`﫳@c$f^P /? b.ű!!ۢTZ0!=@JWhiOzp^8/qvmic*KF;Y/V^sMzP*ڭvG?m%"0ӳ}E}M^OҶJ Ǟ- Iv)U$j"ͯu章)OA݄uD/ v^']e v "[6Eh KШaÅ|#VNZr=ۦW\J5[eڲo~h^lɘ3#߾R2.{SۘEߩWx5tw<mh~$c""GZhͤ]˺@> hvV-d:-[V3GJй#7Stc=dtqA +MLySГ*pxG150f)W C8PLQM6 o8)اYs'$F|6hñsoX0܏._߅hw%@>#d]髌>(Zvo:$dF6 "m!>CF%'C_^G!]0U腩\'? x}fAًRat:˚ HSK9;1N Ӕ'4xvRW hUt/=4r@kCƗ.E8Xb>}ԝw+i]XA7)P%mIi&0{>T xv]E@*POlC;gJLf#>Tf +xG:Mu$k892nd:2Pʠݞ_E-hEdӵ}sHq2͔^n .~ o[lkcj 90S6/: Mv_ &3#]H8 P~n>1 { V2u{XI?j'5}wC[S.K1,Gc{*`v~*c[/DBy֝4faJTJ>Sp99ʹ۾`,{{"tcFTI42j#'erKCct\rveuhv Bwt򥌛h5Bf}DkHk+)Ȥ﯂ D41rLx-Fc+&B`(eSd5lfעx[j"wvPBQDe*Ts;z/E9#j8*ƕQ#ЄYhCW+@{h.(?%B@阱(nopLAyَ$lhgp ՙtJzO$в5hd[C_A X\T'e/ʏ)s["=zPF:ߊnh&(Ș;/.773 r]lyv-vVE "'3%J>-('8f_8dߞt Hq\khפ+xʞK+tU LYg~q~?-qOg6ބ8Pq -q'm W[|ĵVY QwIPL,Tӯ_.J r.T E]̜ȁ>a^RBAk4S+sFu@s2ra`Dthw9Ã|;4-H|3tۻ^+8@NC#a"ޖa-3}:c2mIR 3,9q05]nE}8x.xt<2=Яka;(V'άӁeh2}[rvi x@zy䵂:`^8!9X<\t.A?4f㿀bP1fXta_~WK?1l+W9Gω)}HO~Am4L8~y MOdzϳA9]'- +9U1Գ 72Ŕ7nZ4YmSv BJ<#.lߐg3s.P*p cŔQ4bJbt,':ЀgɴWz5t7DGtCgL mT^=TBSf6[~`J,Eq el0_Ar6_^+r[f(U4WWD[ҔArG- s;!-l[0K{R ٫Q iD?Ge~g!4-TEha>w ]_8A/'\Mc@[!3fֺ}1.`0v/aE:L/. }mae#/Kir,I馚[LEU"{P-?~·[3Zy9`i*^W|q%ۙYKÖʟe$.uꮃNzt|̜&׋xBq <[vӞ&WW(̬ mll;1<.xR^ %=|,;fD+?л(q&rQC+Q7QKcYqɖ1yOf0]9k\ݶ ,2 z5fL)Si'1`!Inf|m>Y"=ސK11/0yFխ3Un|Sp9lB'#R~;9iњ]ODr΄`cK N+V^67GO+Qk͋Ճ;o-AF\OO DŽjMʰ$n}En٪ȑ_3MB&ne,z4< 0"D5-C$Gy(P]lG{h ngb;*S:K5L9T)\=T7'aɜA穟bDp*|)ϽUMħ8FmJ"6cP8N էb?s}y8B:\9~\gIgqx?=ֿ:9;sfH`*msk#8єԾ<:P(CUT?HM~,ABmч=TJ%==-C ӗ,2M'!O]qi8NGݒIs]Eأio+%p0, \cQMOG*14!N5OvYM +P-Jǂ e?|q`!RZ.,!3~ל^گHz>ֳ]:{qf|Jl:ӵ-G:螹BOiPmK̟F臄Wp6>Hn\g `w{i#H(NqfL_ |y:%Cr$bP^1 ŬD۹͆hF+M'KcY|ӳLϦq_/"Uz`4q: <#sQW1%`8TF!1Siګ @u+[ZOԷyEr`Wn'DO+O eGv2gz p𒵗TgD{%d͌,=4No#35o`/r*v5nԬrS;HJC|Je/,І zH',J8bБ(M3gGKEYWݶrAK+`4%hhQpb4ͻ߅Sنg ـ IRWppxum?0csSA+kQ%lIכg(#zG@`#bJ3Ӏ?5Q/MڂNsZVReS%dKv?ǚ2)"˝ 甫cׅL6a<j o51]C"-o)5-|EU7P[] xi mg' Ɓ{RFi TD\uqȒ=YnE +|'Èҹ(5Hu k JGc- fuϚ,ΎNeoR 3eWhWPFI af&}Y4yX6ܯ,.ϊirse3qWc#)RoV Dxa3Ti{sތzyGW#/P*ƹ$)b6h=@Z@Qe˒+.Uo+bn^g SK=lP>;3jbٟi ލ.9u}i%zHRi#E8ӟ:׸$a%5ؘzv*W>p 34c; Tp<]h2JNFR!8fN>UȖ dۜp ͈$[>%w r'Yщ= ECA #2UO{{ r@ڼD`'&ϔS1`|b#Q0R˥ ;@$ž֌z"-h8* Cj@vh R(i^- ٙ`LTF,(2FꃖН|wBC)祍c2GմM$/&Qf. Ѥ/j&^u/CAћc=.ߙŃDÃgo"tٌ+AĹobc 9᭙S1#N:HY78k/,Yɘ+9KW3bdreE;BokFSSFc7[j/tw(dW >k %wKiԴ5i/ФPfl}}V<7QTCw5<h1R9-(hu+> h;sQ/dW1ޘh*{e鳣I=NzlCҙ<{gP)` XlKxqemdzt=5L%EE(](MnʸBj͙^Ǵ¨̊XQmR39Qy9Mq?i)zQׄEsǂSQX\== C䮘;U>}䜼)z }~;4n("ٻ>8*=oH0q]|)@4^1ɄnLB2r Q O^ݕstPoc'ZӜ+T;VP#t󭌚,նdBx~O:x^ ^7 <4LDe3FU:LPI4 -ZםZPXri$kJ4Ȗ$o' V:aXђir61։zy%?c+s(5)J6 MC)''Q5BeurMp'֤oLE^%҉\P hm߃(])Hb^6 kTyˍy+3u)'\=mwd3;t$OkȞ֛KPcO$ %,Cx\{&qr-2Hy+gZg ,5i!j0xwrcT+3y|uRGN *1޼?c K8fC1RE o:k9CYd@IY`#P'2&Eě*YSy(6?4"Ԍ@ +5dZ:ŀ/ErpG]{ . 忪,.;iܷȬZ}NO^ g҇E;,2f]Ԃ?3[E1suA2+ !.B.r waB(> 6*oR$(q;p\b/566xгw%1+~[D`&va &aPk6y:<<)/ T-?"j(;kP&E5aB 5,Z*,z@-Oj8)ҡ8S([f Q}GѢ$oXu>_|VBC&K/()fKcGNVxa\^.ԁ3fb f _LnO,:_5l`dٔIXX'nq[8~_=eI/,<jR;N륑,l űژ!,iwb3DA pREK':iU+,ئ,ط }G>)§Sˤ'x]K&JeV>ih ~iOAze09UM]#\ac%1u1G5?.jȲw)ȕ[WU>\HW,MT˪IΪs>Q@=v–%ftM&w1Vljib9n9 X-wl/e`֩r̎UTM\v cΣQQe\ӂJر1́쪴p~ G{Rԩ%xNyALnV dkx,ol7!vjemFc%SrHK4/L7x;9zf\j8Yr;7?ReoJ_nX 6 Gؙ'EQEZEY3>!6`HAUqnM[֥]4)2"֜Ymb7YtEi MDcp 8Y.dvO L c= IL $Vs=k +-Eh!$23Vj\`)N eTǮ &8KUF|)6$&3 i B' Pքk%,L&CFS$woLe7:>/VUyQՙV:7|#L{- e0| u1H5GLNz f릺x6"rYO\2Р/nrݵI`r*d7c_\-i ?]3e W@lxV㿴8y^KI_e+$Q+0IjǬq`OV=x2G|Q]r!%h[ïY@|ة+$"}Femʉ0BL#xE'C}ep̣[e]}C\\^m^mW8񢈟/̭qr35{|P禘ҡY3emĦ (|Ԝ=mjxT)cS^L 4j# gwm\Mo',aFM&n1S53ڮ[Uhjag$ӛڑ8_'Zd v}La vFĎ`kW5~{}4Z}52m̤ۺS+za2=yt홍Vllm/ j-]@yRg) L of1ώq?V .5y2k~hy+Rzwi?P->N FCtsPO_T0O\c#͉O@w k2变e_7P(>>ʙ X>˽ dg0N\:v?FKcg3yvì 7*ueƚuG7խCqSu{E\ZjbCm;!e14s[ 0 +a蕼vnÃJ߁}ʺ@׉KB3Z:O4{:(?N n&KTPS#Lv"]Aq$Awd@U(wngW-մ$40C%;^hk;C\z`.6p0djhlϪKi-J.+eY|P3q&=xCDo7=>pKu16{YM[-1Gڶ7!Q3=)ki9oTC- R.1.R}V+,^u(-?>yAA>V(Ń8Nkq-`<^qPth ~c$Y}dCdD*}"O(JU#n2ܒwrN}rU|Ew#F@œ]|AO7J 0,B{qG#kQ)~X]Z x\w("-Y~) cyћTjf/B:?tq`iF[jODsU}&2Vp&ܑ EN DQz=cp"<NGF%8º<|2Y(.XE\./P]m, ๅkeJjDTBxV+ Yj: O+ 7 R읙A +%=P]^!TkBPQzƏMh#f ڴ6Z'qI{"> T!_ ?-G#΃#\I|LTqkivaGHHH| LZQjoãQ K 80̥x/;ieS=dg os"ҹ؇#o-LmZ1ST " I;V}^YPͼ;ܴAO%?<&UEQA[[f.Ow,G n]1?PEGO ,hWBxDg4R&g JxeV ]ۈiEP2&ě@M2`yԅYDؔ'V^Vӳ`օҘÊPQ[v d2_-~tgTO~OUGVPj  34B&Jc)bys*LDkWP'h0 =Қf\j&WOLRǍ%eQGYaKUUU(O7iwбq}@}DfJuU+_:kTA7%I,Wp'ԹwRCvpʎaOOć N$d/&/#v@#&``Aۗ,_Ik5ɀs!W 4R1ɴ$*[`鋅akF eRB= }ElOtjYb?BY7q D ~#F;|> ~ ?C^c>ya1QuwwK9wz_J-q 3 *wBoes%v` f[]f#!_*%pB[\4d'9LR#&0_B j ^f񣄦CԍpVˋR-a{2oVDN=+ \k =|IkW5t@t2yd,T>-un$b%bD)}k_| ([ʐ6!0K ]X]x?7G!T}5J9!a'# ۠v_M/,w.^1(=wbӳ!S~ߨ .0"@Mec^v]^Ee>Mͧ$2dBns{wN {K--N1 VF `WWwD̛pbHٌ+y!1TJݾ Xތ_^z!1"O{N DTb8`h3wawDjhHg_Eq:,Y'xw❉TA+!Rfm2*Oj>b"_?M**RMn]<,mIc~R;W-A&}!Z-"$ޘDrT-]V^՜vz>`'2XO9GiV:nE@*9ؖK 1/ev^?~ BzW{؞OM*ݲ=}ŦzuCɁ$Ф_L `e<ܴ|$ca'. IY4y YFnZb0(&XUm7Q ME yxN HlZwgo}UhQ C/&?CU#~n@iMKK2 /jnb%`.䦷 7*vl; &L̈́|u1.fQ`o\A>&TX!pvK S(+KLRk):Qu-2>ktD#pN|Wrw2yq} նK_aOh {&6kTRhI&|]`D:^xCtAlZEbf5P͚ p[VzDaFa$oނd^uJhhfXDs5ΒyU.IřV1ޮ'e4euyPX좑;>{"FV*4i$jbR >mnax%4l@ Ǯm+(iuޞ(v0EHٰohTOt>o%Zz@"+/$'6",YU%e]T)`]NW:+Xc$ɃݣckDoJ=U8X MY̯,V9Ǎk+KU{G`pMpV脰CFezpOn_/: -ef$Ndb~jq"پ1 EY$tIa|ECEiJ6~EUrY5Tgf'yug=oCKg;:$8C-`np^JizړD͞ns="Y418f2H=3}G^GJls@YmeCU੄|EX䃔f)l&LɕlҬ=:X\ . {q'wՁNkc f?Tw6h`YmDslnuoe+P%P'xP@#ݞ[ %i*]\ ǚ>TߝrxlP%T$CcBKԱ5O8q2p pR+A ǚ<57 OSR^=fxvl-ݯ+PB+ QJWGV=9:!07[Nl#6g[Q_kMDŜ9ުt/}gLW@pV jϠռۭ:a(p{C 3GXhOYcg3Hsq8n4X:&%DƸ;CƇ8D7q OhJh[RkA-:bv͵6WV53=cߧFpXjDb -鈕,GS'klrf_k:i%(ڲR Oh;,ʦSfVU8m=A|.m:tC/*ԇf7M^iAIQd Qt)vR^hn4!yZVJL ,}D$R-2_{l.FGUa$F BqW@r{c$bH  ~ F=l( \ۨh| PͲ s8$fR:n]C6B~ݖt*+\KH/G|[Rfh")4w?mP2W f >-Ջg^pPFzʔeӞR1ED-KXVPTGB@Nz?iGKhQ%M:-K5U4S8kB ??^=UUZ%,PVpW G\n[&qA1xc$~(J'BK3ܥ$m \2kAžWȒtEG)C9(CizXDƛ_$ +NYP_.*mŷ }Oeٌoi\+M*? 4 &kņ7"dx6@26I\ ^փ%wNyIO kwDB#Y쟪O>v):`CB@ 7bwAF'X I^E<Mk_k5 UOn|ᇻ.&nh{YU4Dg" <*\@c1\DU,&kJ]K$Lf۔./2Jo8ʗ,jcvs^G<y3ߺ́Ziabgy#d(c:%WVDZ~?iUz"xzo%3ԕf4\|Ǘ V,io֏O }p6mh鿯*<Ƚzʣ yT, .p i ߿ѝZOG_4,L֤PE+>y,ORq{4ㅢc0ǒy-v> dԜh@YuwqTIHu]7Nxtc}A0dT;47aQ`! i.#{4)`2i0J5n?;ae&Mh3X:FA֔jwPNhnxeP)@tT]#{6IA3eN%n]HQB~fukxغ!]uXWjUTl[8v#4Hah5$P@GS_w8;KIlGoC7L8|g`u3D;L EsԄrl|7^))['mϩOb09C*.tPkغ &ujBTiIvw4Rax|b˹pVءg:Aq#BIܠN~ ָgu,n7FT V2w Hs'XJ0IUBܡ>Ӆ߯9K`ijZ,r8>Vd \7JNA|͍hs_\#N]᡻K,2K(hce`.ҘZ\q3 {KvSg:j0L!."8h1t2kyS{dY! ? k[J{"^TC Πh>d^hKז@ z)X3oIw[]`$ZR 'Wޱj17~ Wc2}|Cs@7m ;бyKֿcTO)=ݶC=(؀E<:Ũ)HqBHUdu;Ʊd#yf5gj%ƽV-6\^-!fj`:`bMңbm~H_#_B@\ͦo7[(p^nG["[$&zKT(P2mx+FMQ%pV;%Wמ@Dà.E;O3{@Oޣl.N* n>R;_U͙2غ9dltE;+vL`JkOES$]WP\YWLNP$abmm 0?}Pw)b p(^U,w4`VRև*q:|NJÌV$H $(H97No=>DEM[eB5N5mbHWNTܦ_uJfEP$ϳ\~Lѩ>N5P-'1 l1 F*yoԸXF+[:m|g~P:vLQ e'Ec8miri~砬Cқx+*=88;EP n^xbg0bJR}R<(j,tIWz)k?aMm*K ΄1O9.JoC&WTQMazB>f së>zG UCd~ :L_abKť嫈 EMn? ê%Y-']Q#'b/gZ)7l u+Xo?:4*k^."$G)pϖ*';V>*kJqÑCCuUpg j] K,ՈE|Ua[ ua]e2"y3jFٰ,KRWx9^H,O|yaP#dgtAf4oMcYšI! o2--W'V8 㣌_~3+1Ff>D4׺ U/jx#Qa4OÜ@8Q쪢!FV^WdPMNJ4vz k+;Y_<Odx0 Hڜ f8 FġKR)LhI/ x#EtP,] h9ꫯ8+AuO$_*|.268dx.2ЬF=w<'y" t>]ID|ԩ' 3M.1V #6ugRHN₋ۢYdJ[Ft̥Gmq썖Fg,DKa^^x*;C T@/7`p.9ѥ )+cx`4IhHT6נH] Gz?5?M><ݪ(<c2tWC'1+6p+Q:k~lȅL|d'|{y"864yo&p@ڞx)$j7QrVivA:MN;Эh*[縂~N5T6r]۩tufEMhWኮcɀ(m<(Tϣ+8iՏY$ys8 ƕcYu8l3e_;Cx֔Lg % r!^Eضx&\yr.I: 9xiԨ+~4 9G2.N=fI9Y޵"Zwh:FObőqٌrK;}ڙJ ~;K;33j+Cr ^Ĩ ;umnYZ;۾C(k(GyTRɓOXʖ .Q9n:5y;^ύ/ĻF[q(֟Iazi56B_AVO*QؗSJn].d?<vJ^""8|jHg! #h*`WDfULNt]^ˠ@ FyAgΤMu]Q;՝x]XNErn>|A0=p{ybӼ 'vK85 uH*8MqAu$ϺKTD@o&_^LьP氞^{b1a-$"8!7FecJ-}uEg.bxZU}]?X88+)Еv)aIu-OO=4 ђzFT޿Ӄ1zj_)7yM#y˺SB=UӴdl]fܝc [Tz6 WZg4'ُ5odY4qӚh#S|/>BҰt; ]/h9"^! ^N<¾?)~kRSmE/GS!j){g/XL c}AbA~Tv Q3 R-0E(LZ6:./2T ov7]R*+M6g8 zبHis,Qs>gHXC& ΂|GSl_ӻomZK:VRi"2L_"㹹 ӪlUz 8CYڔ5S섕&i櫍1mpؾVw@dM֗J&wu qfܬl.dKzB\6?I)=ï7~hӂfS^ _=-2Vʷ MWr.X!"y+6ܣuvԳ-)H͔Še2qA)DލD#.,K G`j2 Ə}U,2r9v ejC̒^mK~Vp>,a}t! %'|5,׊p5>X#CB)|C51>u3;7-)8T}ULt'Oel ~WlV);‡tdϥo[WNmÜň4IlOAmm/CgNu Mh+fRB .\eh6$S yH'nYB#3a7 Y:*Mgץ\XO5$nOF-/o{"۵,U\ wsS2_$,(ѹu|T=5sݯȴ%ؖ?nw<]YU1KxSB*:?y66Iw|Fa)*C&H}IZ#a&"Gzx<-Wiv|X.#`8^w&\fH>!YUMݤH/U4?w_iҞ,rQN'o[\4W(;i94GX(;.e LYDc D.r40|qV^Q58=KǒA` ^"֨95UջWYCJFO{IT"u6+4ANn*4΄(B51Y?]!ґ|7Fqdt ut4m ' Z-5kt)I:?ºݹu6l|kTe\BdPsFCo:1>;LIi4@r.ބƗnhT0Tl ^k_2E6x>+3!VdX5^*T@})j( [_H+0_rqg[0OV-~؇{Lz7߭ѤpO $5EP5(ꛈTP$zz7!=(v5C ;A?cXr>THϩR|̆!d^X=rߡ`Zフ'CLq%zj.!1y0JFGub*v~yЦ2kZPZ۶$ܑM%Z#wK ()Rx`vTU2Gb33 fPC\- ^~9IP\YjŁLw.l?r w. l"<%AӶo&;lv`$~aHX |0#BAWu2.:=ZAN( jT}(b;"膘{ϜSgh̿#L2 =Wۡ;I ~.k+C-ik @qI )&c[j)$hK`3Zݮble{uhH"@(He%gk<НЅnc _vV;sյZ]7R%hryx.r?7'+ĘK[f/Ώ&푄uJR /Rnyֹ^ՠ;;^B-|H~̯(Rlӭ7T;=2ş?59h\c]W^nz P.i1{`XOѬ+ }TFHE-YV(SCy;+p;&ըš)oqyVL Ngʣ斍nfÀgCqt&\"t'7S`f5VRJ0k\{M!RJTa#O߂YC$bфǰ羘-DDk;Je:=pVݎh+1lܰ$A8mTk`]!:%^t7LJuUfV\>2OĺwiaKUh`4BH<{B +F')N;g[te2 &$o-If/xL%GyXg%$2<UoKOpc3/-5TJ6cT_ eJ,~Ig-Բ}q6b(|al:Gn{%?bΕPNb.b3)ū@ScD싼Z2. ZS!_Gp-mT6>gl.,Q-usvlY>PK橔+ey0YMؼ{㴎X]ȴ7] iarQAŽv={ד&c-,|:Hw~`s&@>~r_cKF;1eSw`s = NFitnv(JZd$2 &<]J`PAac˓\=yEi~~McX9Ty>Urw/yث +7YTF5|KM7LRt]52F8S12#뉨vե a ?9hncg,+Pjj$p)ݪ6ʙio@K}~M|.߷xKJ)MA]:.^@anb͹OB`br={i;Ss@qMcRX ٘uzl}vd@*A=ŕ?q z0_|XBf^Wn~ 1K1"m% &=esܙQYsDGk~6Cn04Ӧ>A?4 Q8xtKV[rz&i#n'aӨdw"S6?-w}B.j/ɳã@'%.jta>.$SI}LUHr"M%̌mk(l+ @>tVntRԨIO.@l@AHNp݁"$8m-UޗGeP w7@w/hńʣ3!2+ KNGhE WDRkDZKRwq|s_Nn7/ɓEI4>wv$vG!#Vo}N<32'YunMFR4(حN#HCZB'g{L9>I7bL!|LDA 6LZӌ4PÚ}?]п0ͦ(F/3\ӔwXE=nkJla(3b2l9)SKAj;ţN":g[;gzl-{跄i""6 PCQx]d 6+O++։|2"Bri \mc: ˅Rx^Z0'״kfh.\zy*[W`rw1 k&}Zӕ2GUJ7`fo=qE[y𜽪 FeZ.>ds 8))^ix'K컗,|32L+w8##A{ pTu-&YMU3Et3`T,MhA^9 2;kČclɅJa[QHz~h͗a<߼H7:ܰ;vɱ4&ڮж\T뽘] C/ (l%g Aui<'\ no5Odߛ xn"hҽp~,v*2+3% |}P-Jδ2@_fYT`jӆ1{kNFV2( @+[VoamfR: "mB:@X4@C^ՃnclZ|+6~iA<׾s 5f({ !&x[q"x%E\iY*Ox# vOMȞEL2}}AIuS*a2ϑ'3}d­r99Kk;-l 9ʃLCnDg%\ "^D٥H'O+-0#+..R#oϡB2lykzGrD\ѶĹGQx]NT9!}[(a)8q |e+5W'c+3 1@Yz]7r' ,{dr*}h3:]xmSyֽƆ5H.#:I/BO&eo :1GT*V+ME=03;# ,)o"@RA93"p2 xꖻ.ݓ[hg/&6q>xOP%B01mO=>|sTB.WS0;wPɀlZ8 q7>9(DkC"7k@;:6Y8TxBVXQŀA&Ud(pɉw"D64 vG e6 t1||Vng!ƥ lW"@_kd7G勽S^'SaDۦODRo=x*=g%Hm 7ŠZIO2 Y9M<׶y"Vo1Xu"닠+uPD,|ΥtO $-|6SJS!A7-_̺iw1l7M_FOmjeKQ1C)#Gay6Q5!i8#Tsi N`.]1= PA/_t܍%6 %5XNB*\8W5ϰ7,x|M oP.GT67!q#W?X\=.yvr oez &z K;r=Gv\]DGWCڧ9&#`S|qߒ) wDB,7 u=YEMz7x-2'U8Ik)bMMPiW.HJ+5 w/կ窑†De~(D{}:@* w*4AU"TO\C7Ԭ n2ӈt`mJ vhrzA64'+H0!:70vJ3?C,SlajH{eо.&\X$?74ͬ8|!5, Hɵy;gEV]8V3#ȣt߾Q) $H,-Z"i*YDO>sLBvAkʌ[rtlwYZ'<#@$'tVib B*SP^Z' ,gL!b;hݻXSGԽB2lg.c̣lzb ]#.‹Rtn`vuy955XN)+\)mOSM99RֱZSIʻF)󼼪Y8bW,aܛKHlقLTS=h-+ނ|:jY 4d٦G!ۆ>F#>Zj\SߧiԖ\p&M!w1׆ً-,Wj)!VZ_+,lI*e\Ju FWeO0_ :[Zi'3!߿mmH$}(v[k2xsR [Q_!pd>'>FrS.TSf#П^?K!}n;٧PDBGT'?ӊ9}j篅3ZK }G 2C0G+.8_UP#w?%j[]h g;f8IY0AR,F܏2Yta2wC$9?>"Uvo?fH HGnϡCzVyUڦrlѩKg'jD*A":_ڷM{ $+۷}<:m#-HYuF_LcfY<(2Ko WHs*Q-ONQ] V$`K<[O ey ?Ȯa:w~h•)WNZ4ץ2Abħ0ty3/A]&Rj_Ȫi\bʖ"!+<$0bRɊUWLҧ搴Bc$=U>8\`\1ŎlMj`8TfLX{f^Eۂ&g! #3O^'17 KԿ,L,ϷNjggXhK VOuԭɣ ,cp~n +9}.uG J 1v0yn#On_nfRΫp%R 5}=X M oqi%_]&y(PlNY07 _,'^Eauf25j.C 'GhF\mW1`Ow/-Ór81#aIĘfXN. -(AGcO ݓm2ÿ&2 [ѭ k b I(`ED/s$<n!UY7ĆT>|Xыu:5\v^); ҝaY! ZJ 읞U4km_Ӫ%6l6xfJx?}hg$RG>ΣJQ͉ii%dTNU( .%52Q ,if[HZifq'BP|fчKIA/ynW\f. r8Sv1UDfdu8':?4d'r)--|?OԾЃp?1$cboQy?3uRrNb6"iT`^j'BҚZ>ӝF~W q͵|u5 `^f𢡄z ԘG{k e)&.jaZ҃Dmr72C9Ph0s-A5dFμ׿e6rIB4(M5M;Pi0d A@W,ܺSaYC^F$_~:.JAG~kPyx4҇ZSْFZ.c;/'g]đz%NלZGgMEW'HӁ’kH›F|an `F0MxW '/jy7BxּifOk͋@i-y ] sߊ W>IxX5ɛo";Ok{(0|a Է(PfC `I*+ɭw&7ug׶eWYz@p_,̠nP;B3I­- ծN٫$! mIFP}T)-> O*uj ,#vƬ Lo1T{_[}EHx3*l P$;Ipu:`Tp] ];I><&7W}75] ͕N_߂ $e~Ptw@~7@%sE] e0r-~~!-(o!?7龃g.n?2 ~&'f&u)=1n=*狣 CHHnЅg}+7l2d<$k7amy]+ /w]Gnx!Pݘ3_,7x5Ok\IۄY٬$F6 =[TМN"#ZJtxUPG*?Hcr䘡7>Y@oAK|,v7um Ipw*K<״}2& #X|`p6uO H\pѠC~rϽt2MRI}fj$jj/w9&9ew vӡy6'høH~8!rojʗNw[3?L?Ү0~s E[̢2`E قfJɫ$>Od`-ѭc4sp+#8guZ816M:zl5Z (~%M9 >,~tds1m!ijKLɁCKs} \x{C 30DPd΅VXk˭eq,x\;zs7dxgnZY;&eOMҙՅdfÖ|ʢbkŨ9-;]G TA:PsI:M;ݍ{׸=AŖMK%S 5&{ Nt\|^$AYU(jv8rW5H9\QU7~wxi߆(J~kNByEes3Ӟ(h2uv4 x 0-.w7 ij():,N8erF#b@\ L!3ʒh/=#:4 5ĝ:% Fذ0]ޡ9c5uxT`llB/, 8c6JI*\K]&e $4 Xcx+SOrwy^]'IP |FI(B9Di‘NO%X~ #e -0J 9Jzu{шKn=d b.K V,&"o$&*(3|]N5# rx`aJJ7SAb̽q|X%} yخaWA4H L{P"u͓rm "*$8*P4k\t>ڐ' whˢ8~pY)k)O $h4*Q@r'ꛐ.=rS1tt*f];(,-W>bכAJ"A_բ-6apIPtG2s%A&f;Lk֚IDŶ1M `l 9yow8:3)Eȫ~iF=rjI>vM?ed^^}nQ1W/=cTU;0fZoWQW2V,k1|Et`aDBayR^WDE p)_N*mQƛó` lbfj fy 8" oV6-XMNj8Rʊ7?u{}c= S2fcߢ"b:؜|+xJ26-KrH0xq@m^ 1y G|~9:2! >יI{JY]6$h<>#>A9tnZL=u˴ԨfZaHq2v4jVW) &9AɳY]^zy# LBX$_εsnڒDiN"CFh­@古>ď<% O>RTO$_J/i[5=gљmw塣Y+^o-q?_]Z53 {VkWdI0^iH6zH,(6|'h>W.D̄옦xn]T,H* No0fq2}|j9Rd%\vFm*0JƤ$,7e¼؍,%!gYcCRNAe ; !c|--LN8bXBGg8|ƋiF?eğ,=!lU"-DŽи)Dz3E~Gz">4xZNZk+H4>ʕWLɸ*XEj sx6)K:<[#t*B?T& @( 9o>JilUiK8ߙ纼+Goц'˛[bDG&h\.zWAY)}} QG&Y쾇TWJ8Zw?YH,'62e ~,QϜEӱH2x,HZfz^c8,4JK3ăQCm?Yr5G ܫ"of(W)x*+. Na&LAIߵ͆uf3Svz hW/LRs$eo$wAN_s xTXuˑ-5s`]6_%?T[ MQ$7;qo> Y5٫T ߭lL*P7c=ͦ`i=x.'̹pkx7{vDgfHqBd R6K[5qO#Uӳw*|5t;4=3JXמvz3/9#mM$ib"pR}'߈gb $]#΀N434& 캰wÚߥroÆkd^͆` *_ueMeNL݁3yn] {31-ƍ30,BN1LeЕfrRY{gトtZt`Fz21l*ΒN8!zrn_ױ!2Ԏc"4@c:x-ٟ:O-xp[b{z<{aUdpͥ [Y> CxDb .΍ ؂yX%;*msl5X[/PmSNAOz(G.~k'`у< 3xj ?iGWt= MG8_d jha$k#A!r@4dG!*Ƚ(`٧YT=ȨH+2a#ꃬ}jDǙ@5Sڤ'#9uAI. y/=\+Y1氅T23G1[oRm?w#ЏsY*t֦`x" [R:^,:='֦Fm`is@(}}'+"@< B gIm\߃jHq笞32௷^K E%p*'nϮQuEB [-Xi_'A ]pRE֙qhmX8a i,g™87O^[='DIZk'5z{Iz VLG"ڡ[˟qĈg;Kyj<)EyIMA}X]j5h<"1Qa22)t;q)zIG[@\\MډOGD=fu&H5<;ZLw&hvRCmD!IN]{'bv.*%?n ];aû)D<@hk3),v.%pRB}:^; X)Fkڋ\N5 (k .9 YMG&7ʢ8e_NĵtZc*ߓ=~nm3V ɍ)%-qM:o{;qNd]wv$nkTU~z{pm_Y?Us) Jmg1 sA@wͬ2Ϯ;xN|_RQ{Iʛ9&jhMxڒ%Qڎg9''(:gz,[k}RDCbgnw8p4΍t_~8 J)#A95Rr͊`4LQ*;VIi/0]J{mQRKY̧K$p۔“}MDS Sߦ&3JRZ8_mc!N$7k| m@&T:nBeooF=h3)15^ HSͿY6-Ell|ޕE2q`0%\9~nc{UטnCO3=Ly@6F&-n`ԡ>A&Mi2oKi-JVJ#u evOd^e=4jLlIbKhn.;clƛغ[_p:j׼ ;YkO8aE~C Up+[=;.7FŖ34RXdZh41\ W@OFKwd_wGaFKiSv?mcЇ!1PZ%kLpC,Peܣ%c!)0#Cd*y[2u} oړ+%(#LI/+zJof3hbA&|G~i vbK UKuf%4o#'iȦ N/!C4,a 8d*cW:-_8 &鿥`[ ^XeKl`_m8?U hf*FʨAK;@T~C1˰" \uJa,M˞>=iS_j /@VgU˕jY?p>cC?i~AF$ rՇohy5oU9s$+zӊ0s ovF3(iGp OKEIЎ ~A#N41F_sHA^/9 M#ZN4/seݤ-&PB*4@x Q鵝^B DV\8[xZC5s*9>CJƦ,s0?YL߭n Qnzy7.*LɒDeYOE`挶#nMi{d8FPY=߾EK$@k})F0_ җ*5{,`0Hɏ1ۅ.K58M1J́-QJRR*yB7HafΎ]6 ICQ2DcK2`T VuGx!f|&%9Ty4tCbYhPtBfJKل . bLAdFxԎIGx OR_;O o%»J_PP8equPHmfq"g=P J^Wh?g/ߵsO]da-,>g1 6K #Jw(ຨ+k*dٞNqʬ7r 6Z>Ŀ=/T~/ڎS;bz t'Am ],d{rڶ)D65hL󼄭K0>3-|)6_m)2TJ{/Lf u5OmRS= D[ BMXaBHL*Bi5&cbb/&r@hǨR#o-2>t{={  nI?`q>P_[!#+64RYn*=3H "Sqs L}xyK:b]͵[YÃ8:,I 2`'N\y(b#;##ij=s0R|JzX,Y=c` D. KSKY r`c 2xGn%E<.S #V P :gN[_0މ|tm4}xAfﱧs]3)n^`5N?FHWLWkٗj6 3I:ԯ-7"HJdR<^fmNcE^=<ΑQdբ9[I]% e6Vy9|u5d?bSh)2 |ulT)˅ \¡yF^1Y,;ʻ YR*{t/;赆QNp= iY[z /`LM,iiI\A-v>trY_mC'.unqg_A2a(z;`aɮTrbk,%ɧ$BG!dWB|a֙8f`mu4KS6{LBI./BBB6*1 BA>&y'|8H%Kj_wi`@8ҧ )]Ȕ` zP0]SfG` UG@{sGG6p!-}z"6嵙HW{5p WF֕N_o2 zT- %@:\]R4Sgd/ISO.]}] ,\uY!XVEHnci {a"n B^)nU_qV[Ol& c!qpTI/@X0U M 3ZsZ ܽK?:OJp9)`E(wbs($rܜ  (дޢ}7lvԞA G^]bv OmQ@3T\iVnpUekw&E˞҇Bw s3NMcuZu]\l2o&Qn,"'jQ}~Ut[yx%$9/[3bb`$p^|Y֐CP+Tz]ш9x't䅬EQ/e*7-JL|尋eNʇLtZg4UG?V\3"˝R05lM%C9sU/C8y-qEO"g9(ҏ0bCl$|R8CEfLE/wP.)So 蒻.ConVI=/ۦ@GpPN0&;)hڱq"TE?Zz ^V>'0/}u"=[p. xUYldezEjqvk@S&&ua=2CȞ+N%Z 9R^s$b*F! MKuZh闱Hc .Hk|/jd Ox2ߗ{#z-#yB:l;=9V# DҷX?te$Vds1zTGiQzzi?Dv |N@Gy%PbhwcⓅU8 Z眧#6/k* o\oxSq{6&Zqo'_oelyb_]F4 ,R%*n>;@䃊]XHrG.QqC1nG'eae[. LM{Y7ؔ8GBë`5pChK;@@,ؠ/#QbUYS#iO|Wa2Rq+p mm$# xp mKV1mDbjb>JaeDsK a`(U#B:9X ތ+YI,VS,ݖEY0kx"q:Hᆱ2*N2lhCd#5 Ь>ζgQk(ʫhgG<\Üh(=jd#MnMq8X Z=t`Q(F߻o5R1MYrѥRM%qXsdg=BeZ|n!'/$3]ilP~S~^l3 Af|gTR`C pBԟuȹzR<>ֳ/OʾR,hE'۶cZ3 v)?Dڭ} Iڟ B w  UfeJ]$v\ҙ\nsDU{iב< T$Roĸ Y՘s0\$xV'/ ~w.ֽJ׳Ar>WBpGT4mܟ $-Sz7J 'ĞZl Ǵ2HF?Z`e{v VT[ 8+|* K0E`XeՃ?R0;a=̰8<_iDv0y rsXU1]e!01Q?3e1-mO%}+aˮB#FKH oR(W4kva-sHNU#br?.)Q=tU3ǽ6@1qM[kLWUk;{@IӠߒ(XD?9Fm7؂S;Bȕb} >]a˴1Mʼ@96f4~kؽݑ4䇰TkȖ@jGxt_W9k ݠ-,\4Mx,=ʓV[7,*pYթ0;tdoPO1`6sDtgCo[!e%pk}iPF@Łe!UDuzu2]6Bdkn?ng^ľ}5LG=˯DQ 3,_9gk<= ƁDOr53%:V).9!w`PI@8rx0w'yhb? '޼t"OrJ 3Yگ=߱.Set)݁2O;1 5$zl ZO1¶_RMl _F`$|G4|ctp-VG DV;7W})!&"oq?hbr ;:n\*F ?jαrgqڱk[3)`s<9>4D\L %ga@m`U'ZR" rEǒKa\NvvώF$d;ckK4es`x˽S&(qݗe5oX+3Hc!MWգ {@qGciX7,u1+ 0{ BÉ}k3CPu|,n bm[<:S kI2_'/;ԥE {ċ4BEhYӪ@ǐ9H7=Sݍ&Agzq}3bӥjKO-p= )R4`gT];4B;5T,hCpy=% \Ѝ!z))8`{q߲u#P{k _F - (3ο| dcKIifΝr[tn!>$*33Զms˘jԟU:€)VUb'EkR١˙}l\ɖ$w?unOZj:A4=X8$dfHL#Xg8@e sH)ϛT1qeA#șc#3 FܦWi}lx:cʌ{٭t0oBz!v}k B(@ 4,sT mn\v5lCan]G Z*]P .pfʵ֗2<ЧsaPNCޕQ/9c6Xxs^wcFC(!*}ɢԮ BZQ>6?{&A!.!ԫeY[6^8!r) j;J% Єz>;<I!6ޱƊ'NAy`!E&ug8)*:YuҌԇm|ysś"6gMs+yԔ1.'DfSF%Cr);2?q]ۉdXʙW+bm:%!"[R$N^I5 Y"3L/yA\WXofN;wϓ$4i?S2$jvT2I3EryjR759c.}_2qx*L#G.e{፞F-9Q)%vZ|:`󝒧u| xUfg$ `GxndY)ٔYrt}%5ehNO9 c_lԶ @z,6hBXtS=9P2Iq mYIE y{ e[&{uPq7 1OH~#^_$id &K"J(Tr gipYEoNkk |vCvPDHB?UYhDkgma ܫ[ݺWEЌ-`jIE5vO6pF@_ &cY&y~}8$TZ_kːFZS*kGq'#h|9`_xQϳ6U?ߌ{ irȠgHPYyMȚrPN\(7fC`8chѱ~B`0SSr"tO~7E,nĈYp"dx&v `(Nْ9^]|vSF5Qqˡv_o )yk1Sa[+|z8 /%c bY/r" 5{ՆoES]D(9f/I <G dX[uܚUIw9˦NUF@dg5$7xJ=;:A4&C51ZjTNYArNHB&]{ \$)tf >խJdB}(=IPQqroic5uC0mtĮ-2ؤ&>sy@B5.tra!J l>[Rޗk25Zd ic5/4mգE 3!FpJ.ϱTyI$F. t"`|j/DvXs |5[(dްFߛaMJURHzMۤқMK(fD|Wz윐 QO}8^^D\7N{nc樫9$gUZ a?"4]eLQ{Brlꥩ|ؼ -܃H]Tm't懖k=:u-CL>9$J0=m7ՎVRi[#Jn^o)ihӗ$q[a.d?>mff!ęQSF;IM]j +&(g) v'Ja`<:GT q.aVjSI2eITU*RKw6A3F3Pڻ0tQ뙕"3dÑQZ}p - wBѣ5A 4G]Vz1 ,o&MȖ1Oueߚ;-HVxͮOPíM]\}m0c~:#igoSx\(|7XiȠ#4xHuo>-C,Pn O\ʋ-֦R!IgC{&1l]{32y ;v'a&M$dԟ.j%(Ėwi qjnvec{o!Dd?-@/_ Ob 5Þ, q+0;SJn"uDN>c)'F'BMO6^|aM.rb%QF).:I0KH}Flۦ":r;X>t7Ex*W7`!T(NkA@䄕)M>S]6[͚zX$q[Id %prV+l_Yx1`Ih8;A6"c7}tsiՠeLMR%$ jWq/\:F'sK/x~ :ܺcQIm;98 ÃrD+Q& +~ܐU0`JG{ʅ?F)ljsGѰAtDs^G6q.J#zr9 t-3 ;Mhj&}}Ի!ٹxY<tţߦ&!îe*:kqoO^+F8Y67tbɬ0hoF;dy_,-<k)^HUz.81Nœb0d x~SNqoOz$I\À9.vxB?:T 5p5OtL z-KၗWXXkk 9~~VX[o|.O$}M\G,xJ<m} ~跐9E[N@P:W@A>s vwc6F[2V^Br#} ::6[=t9Bܳ쎄Η~ͭUq)4]ϛn}Т_ێ/|g K-Ko6*WIA^vF#| usOOcB 6 zMa]~,QQ&1p`w;SPw {#p|:>j6®Wjr ȒTu'M8**$T_4 &ՆD,LBhn(m@/<%0aʏNد+'f_d#!uƅ53(%`Dgz5qEW:15H47R8k%Cd<,L[G JKYvQh;BˀL g9.5dlmo]>to}S^ "Z|y>D4|:dz>S&%@I,df~32!]7PqL{E +GΖLYjl4%%RvȚ!25l3.1Kܓ s "J;4ǟPP} 7-T-I U"j[ j ~VC#XEA8F~ʓ u3:a![\&_\&қN z5Yhmf }F|4Zu⳯v>L*q[\B-}GW';4~wd] uo^ЕNǖ) lM-^!1.0akVcL!i| LL| _SeMS=$;lǵebBiU`]u+xI-q@ۮeFNOmID^:ҘZ@I$WL,V_fRu6gwuv +MSYK|t-'W3yvE,̳aA~Lyj^-9ݼ''t{TEyԷ|B[o܊8j |eg.pUb!qXsY(J/D2ԧx;q~N4sUA|åycGOQOT9ןXTÓU=DBM߰~ְAC:&-vck} 7tY@›5 %&,mٓ2497%4hN5n,mF:yax^DJUx;SXu&qUT>:A,7O55xROK,K5MCf +\ ij;Sֺq-s ˟Ʋr?%F73](Zv q = 6%UgvVX '0c:!&uC ب"ڀO\m +9t|#Mj0-t~";Xyײnjdk#"]z?a >}t( RXA&j$Oym[Wo"6R(oF٪ҽ5 S>GN<=qY{͏iun+b>^ERKFv.v=r7, V*cp,! i4׭"1l~&~t9V+$m9:5つх|xx}痛[W4%K4( D AdYu}dl&ml8×e-cd袔G]e =CSA$V ,glQ;yad'+[8QX 𶮦 m8뻅3f=7Iz[HGyƼW5 26sm3Nk:M iXGrN7 &C'0/ ,Z8K)Ru<#TPmۼ(xV#!e_F6ޑә2#& /GAFR/~ hLB/h^~OC1G)dk! R]OYœ' #;{uG_ k>ql A#i^}>lb~yR[pPДf9Vqzǡ6gwy~e3~-۲M--[3",Ph)&R8M26F~ysWKB)hOfr|UwmR9 ),AX:*1# Pj7[ǖS\ΒkB~6mu7ceߍ[ Zӂ/']ܱ-2i5^`EY)U1:˴ђWq"J5GJ֐շX4fxwB Qw~ϛ3àAUXLߴ̌A2ӆWX 9?S+Qg s$״ hY"<_Oഅ.zJ怃(S6ui7(t@\|UNX`vQp]&L8gr8|ٔ!Ɂ5F '8Ċpy}ViåWizAsKzS /lL[1<3j9вf[`c_AR΅FvIjJx.LmIA;F"q&էP9+ZzwifGوL 6:!>C~)Xo/{^˓avgcϳ/~g6m෨O0~ˠFTγs<:#9S>S-]˚\j7$݌"Z: 뀃_WPkH&*n8Ԙ{=91uYGxpɷ]LgEqc9{D .ᨃzwH5 d~zP/lŪ ])#WŀO_[nS١$VgOyN u#kM͈< rP"" &7=F?L!d,Qawp Cѝ Xgmcܻ]izg;6Ot;zQ'v׶|H% w fC7]s7]~0]Wq;Pb' Ր"߉ x; XFPGx M)וPKzn mD NSh 6D^;>Ӵ&TM r&)n(jsS):-^p#x 2RZEƃCKaQ) JB ;>#?lٮb&qM@R/l`K9k=EI2wpCB~5V4pEf׹;.e~׈ HZ 5`~ޙ±C$hΟ[42n Ŋ<3 MrXXiia6ܳ=;Ǹ>w#orcs|X-F L,,f eY>aiQp7ᷔ\$=F9e#OPr\&:BÔl4lH_R|`hjޟ?)STЋ_G%ڻ³h_ͫQ?\b[J .IdY|[ B',gM@lהwXXFdIޤēTlƬek4w@ri"u XZ7q,D(+AfntK'Μ .Pd""ۉ<)B-/ޱ}vILfwCPEć f;Ӑ!J恵[G™U+ zV %y/&]Ci/F+S_%ڔtg߻F8qĶy.Q {-+d/H3S T-.Ë7N WnpTŻ ݱ1۞BW};n'3$VӁ2wY~e9H"ӺI *{a_?p"CiH3bUZE, SP:5(_'y*zM1xFtFo=8ա֤w#mY̢jXFE}2B=H)@Ic6)?`QDZo#- @PjR`^ E'# ƛQlǍ#7B.]q'_Ry6*H|D5W/Py(^7Qcnc uo紾Y}e48ޘE杰 E sW ;( Űc]UrSҜqrZWkI\-eѴZң KK+jؒI?8 ,a^QmiJmH xC-= BN^"I]a ƓKuq QzjPHVg;K !R|"g(&pGsUx.(q/&v9#Gj[YVq%8Jbz}I3F ^pQȍ0<`$!uEH>wKW 2 k$g*n=ДEمiǩ(@ z"uKp 9 +ؠn`Ik=R;.hQ=%*bCAiG }(^Jb6hiF 2h(f]@ [&|EՖs<\i\A{?K깈TBƁ _8_ڿ26+oIFȰSU>(RpIlA>eD}wOzSpTUm`!bg= fq5(1&vծa8>KfNƪ0-h/4=g4Dχ +'-*sJ)~uw9|z9a=Bx"Rjذ߭_N!SU܄O2b{ed!ԓ{*93~hH:l=O[8oyi; c/ x]E1+[#Á3eE\=h?)#|b2P5ںQI; fH@xmr[-CVeYS] 叢O5e[3_ϳރ0zN.lQo򪊿&?6TyR5@c_gOf4BiSNĮ06GEtF頟?gt*FV7cV*N(}SmeŸ~ N]t Pgf䟇wМ-/2"P^TLCb7#r,k &B+F[D~ z$>V_ØT tdᄅ)ta1` I*8M.ڵAr7+Iuxm q*tJ0!}ʂ:"d"meGT&eo>"W#dNΈ01o0$ɣ5b$# tB,9*Y- &!?pm\[":36VyqH'@䗨]("^9JPOj%oۀԦ23<Z&xTXl)ƎB- XpCux  e'4ǜ$c,V86m'U~rмGu {KVAFh2}Tyk9]*:ݭSHm'Xϧ0o3e˭x ;Obs%_YqPݘ]}m:F)g/zB@tH&j ГvMH9gWw |؁*-Vc٦Ƹo.S<+gMy=NRaiZ/o jt'~{[44Ec#E]mr]MT}\%/>7ȬmUnCWnHP1~v)h"Ta{j(To,߲ş3qd"p2=PVI)ưVuo씆DF &;=1:VZ(4٣3gs-X2 xq(k!_&`yR+ q9ƌY1xF!ƽ֯>?T:r$xjG(t8#@9AkC Z$ M (?A6;[d?pp7R[wٔؕl$RV߬YO!-d؜Vɚ^,"UJKk#hUƔMg^iHu>3bwM;Eq(Jp: ,J@ oψAZ+ChmkB1Tb~/"ÉXj`}'7~þxK[]/bE ٬94{пz;djx`Rb-B% O'#B)e0¹BBMtJ8|L췠Nosg`KY6P I Hy5~d7#w,sGl6>/$$Զ9Bܡpv*oO iY% o`Ψe﫰9mp!R&ZGm3wbZ5{C'oA0PH P;ݛf`^[ExSDJFZާ:5Ï5H&hǛUULA"-VL @柝9N\8Z"p 痩&.T!Q)^ۗ.Ğ 9tAaY9k> dGcic+҉Ni=1Xb!> G&_gI9}. ?:QՒFB %ޖ_ E p[Zt5,Cї'B O |oyeK l} A(v筵"3mM* 1ɻ:BҐt@pc=p-ղ0́ˢf?xmD6jvo(={BVꏽ77#:t%].qܿ{%M#FP3Ep;W> ؞% xIx{/ÒkvDK N_Q@*|_ MRV (/v+7 * i }d'Xӵ\Eą^ O ,d?~ㄯV߆_!LtAmauh9ˁ Ewqw(6duieb)˗+XYXXse=~wͽ{\PlB%ב&F-6GZK QuŦߋri+#.5 D 'S*\  斖̐F;xJ^,}c0[wnE %|C@<_(UAI${=3p];½Z#.#4fؚX,f-qR}? 9CۺB%ud3ޟ:HA0()$kzesȺk$p̄~H*A T.\t'IvPl?9߹P|Pcgd$, r~RvAqW ~IJ1'ܪb0Yo@,.RuW/G\aIë`6oﴽG:ze5vUQ5FǠ :=}{"ƻu?.Dm (yd[}hi 5[H{5Ia̝/)u VO^oސWlTq΀+]:BX+dAA7$v@%*#">Ce{e8P82`bJ!}oZ"4R7]pNVl\.맃! m.e@e<<";s}Vb8`}ʖ+۪r));OϟwB2{Vb鹨,5l,/زHc ქBNAmdi͙~?*)?I04 9E\9ӖFUI yU4 ,@:Gy60jnvz$v#Κ=īW~I$rxu=&irމ4puef LY* JGvLz$" U/aKGn1wqe=y&`_ӜƜći/=  :yưkY[7΀"K *1 >P ۇ MJ\aMBٵֻ |y|yދK(TA1 0!3EݔTHo( +*kB/w/IHwSSu89d`F`9->*U]Ì^)4N5/1;Pq͗2J!|_4w XpK2nwӺLeֿp!̮ r٤и*Y{t+jh9asA鵵i5Xpa'`_0_̪ևB}Ċ-+6B>csxոVT^h[ qӺPZ0EzfJ, Il$pӢ?b1Og }HR$wʸ%UKw'rZ_s 'N8xO+ծ)-ng,:< kkG4Y GsFo]_on-ZQ?rz :RH)/-VhQU$6L͓1VdjpωeG_tZJ=08lC@ = bT]f0A+!1APd[7k਒7MxVWj{ZD8/ϕ~6r>W3>`mMpHU4~EQM @C̝?NI̹Jz@a.63L ê®RhPϡ٫vdEQn$*P c =PsLd]>,t&fK@8yNSl;Kao[/,ޙ7U3NiI[a Ntt2¸Pm:IHٞz|i} 1cۗ"ӹ}l쇲s.ƋY] 6`T`S*ϴ*eⴷDm@O I0N'hb#eYC *S6)$NI'ux7u GRS_ N+At E䱭X !yj^Y O+Ϗ:)+s Y.M۪X iWt'@}JKG'zk==$(wwTíf!jG a9xr`O^+^DNʘ"%h&,*([-=zaYK*1q"t?-q7{h86I.[RRF]~mVN D q<IY32jDja},xͧ(U qގ(as||00‹@1V!{ ] cIE\<ե'+iXboPc ylI1VL$[ Mu ^7&03i(+W^+;82'|}ylh"N3so 0bg4_Mzִg)dӂpdMyg}DlEGSs^W2[FGBY슮fcTkQP ύn3}~x [r.)Wt[\y9 ;oJ.lStO{FHf(ԫ" m]ժ.VjЂP!Jt{z4 [-v(Iża:@OIK`iK]A8(+,-֗v')whJ r}O5:gfQKKL߽bjK VD"hs@ڞm8b9~ŴX^ ֤Xs\  vg0 ~Kr٫9ZddT?m,7Cg}@&=i;!R `E.a#?Vzv|LJ,܍:MdEsc .J;@] Ajaiy/8+u6X_c*vlMIRbូ1M;Ug%5ӝqmzù J?sl^J`kBjVF CsƵF#4ZGXыbSΛF7x/P=Mژ42 S)A1Q9t5/, faK[;`\%o^˻ZF~O2 OYSu/'_᪘8Yg͹j M_Ɍ/9: c昱ʕd|:JG"IŒCw$XeJ6/ Q$,!tfl2] Ѿ)W?AM?p.P]MV2F2F=wsXB~{pzpOgvӲm!*-tPcZ ggR5e0?1y\(CWweX !xoUN;.|Hqdx xjVQG7mw$xǷ"cE x|I5ww(W-@bǨd*?SxO2;Vyήlh\SLs0` GO(QXOĤCtanu9ޞ<.$Q5HD-"6)Id.6>'ߠ2eFʒ Er+e J<,C.k_lUQ˸FSn]);W̍K[&Ґ"ΏqmAwDN?MT$-\0jJ?u|ʊߛKqVr$gЪ4sj]!Ά>]O< ;wp1/^TG86K@;rٶ^ K݃ Q)$Gٲke:emV!w"DA7C|J7+G+.L&b-]70#d1XHv 1I#=&ݏޚlYb6c/Vz9  Ek d : XX ~<'貫~{2ٻ,mRz7_a0 $bo0Xr9r@h, h赪r;쾬* #~V$>g"JN6*r tD#{4+'0Z<+(Z(Is2$:]!1ŀFXrfЉS4U #K ~9'@eXkS7 Bϙ_@{*.~kѦjuuS@QII@n{vo@%t+=|$Wfu2o- ! #%,q+cRxX|µ ~۝}=>ha[#Pey./u/[~bJGּGGmVp- w-{sԊl}ު};HA险\Av"g쇽ePk{7,9{X8)Ӯ`Nd,z~ecAJ uk-ji(4hۢ\>:9oRҵt"HK!8вS"!ې2:o}nYU!Og'7Xsom.&1u6scISO[0rv(Κ˰G=eC*) +P+ g ǫ>Cs% EΦps.|Ikrm]$GuYD}B1ܽpZt͖I#^:)3V9أiBG~Y-xc̚-磦tPr!)׳e^♼RƎRFڍ.`S5kp>窛:1h9hA4Es0>FK^rIbw0Cp'Kx_XT Gu2/7X-T?FwXX@68+fJh&6wt G3\a`q\tL4:9,C?fs-p~yTl%-;IqB]-0[@A<4b`!]J0tWxzk~] O Tntp&d'wx[t!|hSl>5x0Z 'aKĿh&YETÁ CJ x!zl+멌,ѳ/D~3IE6#g $9ZfkLs -R2Ą7zf!ǢHOцᢒ6p()#a]/%3wx%R!pm<?=Q\9SsRo%v$! Jh}@Q:F|,ja-k &A:-d%!_e|Ucn 2m8FJoTN8 3(,ӊDW1O&+EրfB%/9CQnhmT?98j;<ɨ< ]zK \߅kj;, u;PA}RWD- HvYjeS_ވǚiޯM88$KVqr!4 9;(!H<0x_̶zU}"nr̈́8y z|Ryt\ՕUYںbv=\!5Osˉ=5'Ǧ'-XYKO#V>/lGNW&բfVͷb&w:sdȦ fjV"xe6|'d7Sr9N469D PtNO_UiLojY{Q?s }s/j|UGvPoĬF Y{[Jj3۝Úg3UF$^N{z;/N\0# L!Owػ`yC:0W]ezĭM36Ki6~X7 &Pťomi5,]LDM|ʙ5|^jTf^.pX4`#AkL;?&ƾچ1ThYX%4Y:}b+Nt;i1WP ƌ iͤL آ|3l-2]ks2 BdIF[f&6{j9+XSYW/WJB\ cK*PܟofUb'5b5 6 F2NT4)b|)D-dg@2֧kl#cKe_n僛8_Uu0lȷ+;*))j9{lMJ/ ZA@َ%SXFwi GQg;v4 C([, r!>y\S9Ip{#z$ZyţV"^ep}C؏?kkAm.4PCa3{+9YVR{d\^ 8 ;)ZePo |q9J馦cP=QuG6T +nGfgn ~|]̦@*m3>-H mHH\ |w>pb]sS{zk弪'Q~JŐǜlmD5ffJC-&S.+J^Y( {&MX2-o[Pt=-ņM=sf! lDF^-/8q,.}ԘnU ׷Cb:Όm@]_ilW/c;ш 'XTAP i^e8$C7OmIC\85A?e_"QUfu R|RR%ey5 d2DX;#Qv-}ȦȌj?>9<^Gov9jx {s&#Φrh #]_?GLc gq-@:1R<_`9^-lҗ7q+8uEe7!O@8_,n'kAZ7<sQl ʫiwt:Gd]FV?U[e^(M)c{?NoPo?4zD.oSؓX=˼>՛V$Vi*z4͟ڸP 3 #6>-Onˎ&GNpM bU~)/nôdAʗw |ʹL27BG:_ P1K* d8!;R_ }VP(,Sut=!?鉜9uv95k`L 5a-98jKaAL5W 4>ə9%u(z|/wsȽ/ -ja(XoyU 63'.)uޔPp, "#t^MB-՚CyUcvLȵ1ܔ#>MĮ|K*ie_#t'^Et[i:)}O> ;}D+eaaw'QÉXcϵАԒ0@7_C)0,,yN9\: ?+KCc{tEt{;CJ&yX 4VR¸q,׳43 HY~D%i]c@99FhO|fFd mKXLEB5TUDCqF |HWBG]CIOXֹ!z \u~R9o=ܸw#9IôN_/@x?z?>d.[S ҌgvUp: gOCAoA2^G+S[L4ꄶxje[6M8\EWE\ ; xV3K=w(3/ 1EZOxyE$;:&t[ܷ|𲥻 "}x:6R-&mń'Ҷq!zRO֑Pv3jD)}<:;z-EmS~[G-G?𫋑ЀwǍsN-nR%NXK.^G'Z<&G<f#ΆP7"0w%;:Y= M,,Y~& %! 9WM*S+\Mm,i- cR|Dy%Ϡ8˽}a;SF&gJZ+b.Y K2ƍ<$LJ}nHoCܖv% \Tɽ&k0 tMN,4m$5OhZ Nd_z&'| YmpLQ5P8oCjuSnp]&p%E # ڃٶ9uŴnlؙ-2; ^9ijY>gGH\ɣ@߰]27Ͻ)#:@5 ڤm&`t q.w5+nSk܀6z}%;bjKPS7K#\ { ]"B`ܮ7ɉnhp%XC*R,-R5J93e%ߏZB46mZv gAAg}B3_ Jj<,Zy^DQuŶ\A*HXڪU=[GǜlZ^|^kqRo<¢|Sh<> &~U< BP" vE4eH(+9q[N~o*('/cFkfR.;ևT/Wv{4$u|؊3 KAHcY ;VVE:EXXG#R=+p/r7EUwՙL/@\tiK|K@Q|a\V9m`@~W=&[\*"Y졢K-% YۖaJW>{GM_}torK]Vȫar7Y،8/iyHHNߝ=Glh: eYzz:[ֱv2|("#%_(Na/ r$,B,~ 6|LVҩc\8Ąc s5 ҍӭg4k\;#~'qQV!2l `y;D3~W $S]Osnw؃aSS<0`'&QEV"a*2˭I6?Ox@?E:pZ#?iP!!ViWxf jmk}:-7lxIJR> 3 yHunV \_>s]y-G#gY{M"=XhWQΪcHs[D66ʮ/>bpOl ]~-(͸5-^=>SwFhYu %$_:Dn5Y9+?& WÏ` `f( o,S~tZ,?=h$Ϭ\up%ЇyF9.%'ȟ5R0B"HKv$5 <~NXT\xԻACR['̄t˂b^n. Q[̄ ?,e+pyjI -^,naW!( e#$vPl0kr186ɚQM0J/jɽD]~*.SOT]-z]NiuU))1f8TNy$eڟ="{y-(84mQmd9Eg+\r%Kf6{eo l kơoۿ!- h(ٴؑT"k Aeq2ȝn[_Qj-TOPwv:Ȱž4[5QBh~M޴<9n}IT*nwҚ#.!mw6kpQ~&6L 4`#@[G83zsJ_emOXrt0;1q؂`rXԅ|D?wF~ fWmm*tDԽ"v樳rwךSW(qg`:(zǣ݁J Č8Si]9 '&z#˕ mߒAXw^)>2R[>Ѩ+.˖kGL EJZ"cۨ_٩SMI{_zy~t C&O}χ v'0yzZK"Ny$i=]FV*гe/sG嵮婮7&nd "1whUV:Pre0hBC+#&qk`{>K< )?CG:FJg'< TD$̖Xo  lwe苑{NdxtK=􏭅y5Y'yJ gG E( p[[V~>SGxG^FDǓXU4 ֒!Vwq;g̦U [ o!5ipUҕqUb%hQ6l|Nx9 nRZe4N ǽ<_ީv%)ե\Zk/Km}4Q'Yt^ -/( $ x\2<ʅAyЫ]C*|| ʸ䜔k8Q]wCBhKb!9;~nBsi"U^Q=˔~r$|#*s =8&j^߳(i?t8. ){?vo}~pAz*R練6(`WqGP|FqVCF` әP<i操b[be/-?:3*5Ήӽ3f̡EaQSмss5v&hK¥Y=ʉ5; Le*Y]8dKT iTdFPmyi< |hX9dl0赵^ dMM[ǮNTS:qb p'RC\W<di ! O.J7%ZtWrg>t;lܳxU7lͥh;pqu4K?Wh"ZB)ꬩ~am?YHs4gdV ;ZYWjpoY-T3mAc!KۧPl&Ls$Ј&<b-ݢ< ꭭&5/Xhk =F+*k"w[A 8"kmTCċci+%> ^+u|wSn㱎#gN϶TIb(\ Ԣ]`EM>I̢ [ez}E>vm osxXf  ZHiEЩI`.nx5bjnQOu*b.i`]Yff5=!.EzkM#MP%Ey/DrvQD`TeBs){?XOrO=P͸ l*e DSN("- O^B,. {kxDž/B'8W?ەndk{7B];S'#u<}&iQ1ku뻗$kTAdeYE9:UpfJ~|%Z6Fy#Dss) #T:g.A/cߍw͔PEonhu$:|B*8X8-muT+'SQ' XfUf an +ŝ b>r,)d$ۺGx[$qoH'R $GE\v/ Ǯ L^"2Զ_?̫"XjpH=#䆁g%6 ÁCR+aڴZz CHIYU{+ۥ"xve!^<#0PY^XD)&qcq3=q }w|hxhv#ėm Ru_z7 M'YxHF|? HDʑV=f;Z\U6} h.DNA^3 l:H&  T{u}"qnE {@'j>CLp(eE^Q'$3 lN&̻qC 2T\m1~t-!B mjTc]qOxD$. U+YuD*Slڑc -5bԌl3. NcӉ>CqFҨER!F϶g~ W 8hc6tL[XFn!2u0zݎ~mK*wn?O1~}09Jg Ԣ)")伵a[/TuH$C|:h")9TM/TZ/s(_i~H+3H2:zJxk[Fsx+ {y#(%sZw}2t4|ij&J ֧enn>9 ?l7X`p/G \O}Gcͷ+? PZ}a+!i81nS,jC wf0@G'=tG-@c%)H-Lߩ:`s ^c' H'.bDT$~D8ק؜0yfNH@z} ikS$ZեjiEbGlx8E:CEݑn3~bml:6_dx49N`\ݜYW:L\#y_~Cmɘ&halPS!_~>56Ss {PCB~4ay~9&?C6\i`*G[জǀIݧ=֤'4Dq5/ɰ:] M6w^/dJ0%ΰM. u(Z 7OmhV5~hyTAQ AI޲rρ&):>r^BI`I4F[JW?o = 1 T(gH9[WU%"e㥿z.(߄ȽkͮDSK+{{c. 6EH&%#fJ3妙G[̶rZ䒝DLxgA7 vO/O y+ U;c8mEEULA`D(7tB2ˈ73 { 3Q%v3JcL I ˭g+<aG D_/Fec{~Z(-U{4.H)"1-i^M7n} %Nkg~Sw_7)ٰ3b!WqjKߙ&2z u%&\й3(i0 ^W)Wj?8ZGn5gMvm22<|QV{1M}MB11{k)!Y Nk5 /` PĢK(,b:@sAcҊ$vBY6"dZo{^)CduJ0|Ԗ^ ĠvĴZo59VEfNܽbM.a8_'PC^‚D8!)SKmB"0a㭑};&mۻTț% u7&wl\- $k Y`.sdrs`$IlLfӌ$ f6h9/r"$v 7 VM`}e}\Dpd.vbMrxwQB$ǭCĀ37`Hz6H)|njTc-`6=Vj8 Cg~#w8nE"40@ r4_N>(Z/whZ|E3( O%AC;0!USԂY E*)bU}ޙ[|C^_Yyk!,UK\hCjJ1X)HFB?flunuobrh80atMh bW}Qt-?۸%W`h1/ h?=]Jۘ[2GQA0 :Bx+ߌG[/"0vߗֹа51X6 S(1zv<H9JucsHH\jv`eTD4L66 he& /Im'|zNHV"FtRt| :B],.*ѹStO"I=k!FGդI*~Hl_#P&ʹx25hk,q!H1wJ |ꎔ&&|4BB"ܔ?D#9WW5"b>`- Ew[N\(4hDj%eI`"ha(K{J@g{G[vɶ<`'K=P}IBIRR]Xm\ѽRH}$0(\ɾ*6nfRxLJj:x$٦0 Z D*}$Pϯ6ʠ) ڢ Ԑc"Jsl#ᇑ b&WoJaKmdu|}f&%W-Ԁ۟H4)M0ܱ>;^ TkǥC;<yXŽ`<; 3i|`; auF[#Cne卄+3qXidPJ!w+õ좖94Цu 7 C-灢:Uξ=*#ؙp47ۀ֦Θ8. 3ެA˛ (pW Բam*Kf/IG(*-+IO-w&7J_>%4@s/MWJP [t9.ֽ`Q'>-adLlxJ.=t_4%D}@@|f!?XU峅')NmVʭ7!n bQB%ɶ apT9"xOR`!l xE{OڕR̀r>v,b?mwx&H)@L<-B҇5jiFe ݲmQMgDvMVkv+'7颔ߠ`0U5 'e7RXN.GG &e ~r>H)—!kƎ=F.';O BCԕTa|ht p0샜[ns=u&p_ A=7lwWSo}87YZ"oEsVYC5 )~8 7eӐ)=`L%&"BHzhݿ3 wq*F'<ڂx |_6k!#_fE,O;L0`zO{J0x7ESOiX8,K^|:-#K/bhRXo}oݴf6FQMuх34N~Z˽yN'i6c@}5O6E,Ff~[hDggYԌU\5@Dt%ސzRw[5H헜C޾

ͬR? 1EH 1`[xc2Q0V3*wpBkB0FG[>H0qX4 +׻ʛrAScCf hXnPi{xGEYT ;)TwJE_u述~V#nbmISv(OMg6D13rѶ R"c|:r‹Ԇz4+籥k4e9:p +08r' *nd}=ш4ra {uSduߕRVY_UUnөqV|*ְK&pඬejU`56S.h7]ʯ]͌="JIa"ܴE6}?$8",Q;Zgs}~csdIk6Y+}Bۊu  wdPtmUi][.Cꯪm$}lr'z&t+"$8h%mGv̢`_*q-XWltǙcu誷Ơu% >ې.lp:B[G[B׏Kpu"ៀi&zu0JMRZ%Y]Wt=ֽO&G]5hզ`YU1M@mSG"ڭ bC9_0`P|'jY/54k0+rh&=,zP>23ܰ(' abL!.#XeY=SRX iFz C7X8$A%Bvߦ)I|:9=4f}I|]e!@S;(ZG5p~޲Ԥ+81-xSzC R.w7/"D$j:u]4 ĤLh(HYh1w?ssE>oZ1#^oM=h~?+~? Lܫ4>({)d1 ISu!g)4n {]ȋ:U+Cd`JW5HT0[d~= )/j )?V 2]$:K%?_uj#??a A,l]KÔ I;<>:};{ŏ fjO%jsGoC޳4>q, il?W)~q,k8o6Kv";CsBekkX_! Qed_'Z;QҸ嘵ˠc}!R\μ[5BuȂ< vj6ePNsN3J F5GyqԒ7T7c#g igC $5N4 G! gMO𧳁EZWlN!:{?bMuJkjApñ/ 6 , $ \ȰWF kq ?f>5#! w̯A0!>FVA0M#'s!V.c=N ֯,PX5W @.*?q'@1WM!UIOUI4kx8DgiѤ з ҰbNAEdW[h|/r42PGXC}MjK 5,`ѿA-)[lYL2w78ژ,nz ]@*,u|DjBj[8n7V ؄elll؂{w&mjΒN*i.CĚoo͂Oͷ@e.6A{o 08ļjG+b !QW܁/#8TKmVbTAoĈѣ oVS //4N ?Ob AXw]F #Hx/n )MvQp}fޯMlox@Ι{H/2>]!@elz+=(X$sbfSX[Ӵ2:z$vgD VUJK[R/k $N{s Tǣ{m@ɓR"װf hf_չ. 4\c``PBZTG|}Ir.02D}sVBRlزH~5 H9BN57$EZ⌗ҠxGfC>#<7$SYڇe ڰh9 ¡L$;%^AE6Ow0~w,,i@0Vw@꿖 [U|l0-nLHqR#=rfxQvaw0ٷ't[m#5uU)^8dw֖ZM,w̷ #bwݓHuQO '*52+Hnw:6}'gtS䃱ʼS>cfPr8'5 oOQtqJUņ:mz)]nq 8*==T)e+M⎔f iOvv ? HA]3_r,:T!zor 4/%otr{d3KjZ¢ iXYOp ?G[wEqNܖH艛O$hƽy!Izh !# n6܍g[ g2;}og0t4![C|Q*i8fbWXzas3&d>diWv{Wxpݏa!ޥik_0'i+AQOErッxٖXqPx=c )lg'rA?^LeI&/#eR#ߨw_,Ocd6U>O)+R(eƭ}D2kkbDyB0Q=@ /fQ)΃y8#e'5/G붢o6 $ˎomZǪ}CsC)Ȟ*T0wJu@?v,[%hEԫKN >QfZlкEl/ K&L16<[#›|usUf}yj857VWN~ZlލX VF,e,i8}vOHU:z`IĘg?DrjSoHu &%T)y ,/JWݒu J@&%Ş4;MPj3G>_ߏ1 5s CFeL 1n?kr+-f%Q*9"Q-lp ]5BűraOrSTnv=CbWx&n*u'@yc,]T.,bOX<~1>a1H. 6!snZA!j;l*3@]ybJJۜTkL zib`qRL豨پz_Yb1J lAdܜOKݬQ@J#%}LCSٍJ4^TTƊ<]nus`;XF3J[D1 BQ^>~7pa@Ll>htYũ\* |=mI[~K tJeSl7 ͢^Nǚ{*UGP6et⬮so Et0"25bhPiXS۬>)w9-aRbNB:EQ zd^}kׯCXSȣ |m$etoRnIj XYA6~4 CprAUx׽ޮ6'RO QAVvU*3֦q"՗L~$5Vг[^]Q WZ[SnjY320 Ўl @/bhdCV#/,fz+6,=ˆ`/9C OЄ/ڀ'b#>$Ҳ~j3n]ęH^M>kjQ[VG~\Q+TVŰh22YoJfd!z/pUSF5^,x!?n0#5X'؏GXϏEDұ*_84A `/:RTޤHba\ZtHOYd:e+?ҟ=iu^Kai͑@0ݸ>c$ ~xU LZܗD3+*9b;V}E4#9n_*jZnept,: Ff1q \K} KR y҇CR[w.I@MnSe]@7lӄ@lkVϴ_L8ME TeκċS:U)K?)R`fsB1[r?׀9"0~*1-ܖ _A6h~os<=3;o,7|~>ٹ,(b*wGO$nեŖa]rNSj~R.9]I,tX̡ٶ1Zbey.'ֵERa+s_w)\?#{ߓ*>D[AekobII=Qfͥ7p\ryJ:gV{|O w w/F`*+ "l me6]Y+$N-w?G~Tr 9Ik`!*~E1> ~_;f贋OS/ <҅R͎je=0dKM@LՄ+04ӷnGΆUjL֕<Yz@'y@yadme"ѧJ }{Re7-+zwO1|w0QhF7+?w'LGbʎRirS:/-X 25X{fW'~BY*.;"wƋ:g?P!kOV2Ee8(7Joxkp*\oqx/^QpÏjkՔJ{ c.2TcP`dpwhrgJ@U{USǿKE"Q #C_@ ɵ//Sd]`m"T[=h8 PoB`%w}|gmO'J1Cj.nuF)~7_1#MUs<2ʳ_{I4=-+caHZQ?;.g4wGU5]~J`Kx>fq|r$-l<Po,T{XL@SWg9ȕ7(qmxwЖG㱉&RHwl|4Wb\߃eʧ݄'.۳㾀{*m mf#zC6m"[MnyF+v㋾8dٯ7AQ~Ġ#s60ʔesDD-7(&#[Ǧtq: ?=;F lr趚ɢX{13k-fߡϓx9ą%߹ɿa=ۚ)btsL$#هcE֩gy.A˝rNȈѽ[ 42@v&2~2PKy/`\Bd83\ZZT \f/9lsJWvztWҥjb a! W|MXy ̄]sV%oФ~g/:mL;KD<,^ pH@6,ojQMT r]5[W>K?_̓k޿qg\Zj1!ǗWгVYv7dKAѸ8R5uqucfZ'j-$<ωi"doyܴĐ*v%RDV]Ec 4~ #J\fu23[?n`vs]pL}5^8c">S*cXn+=fj%'p˶f=7 &w^B3f#j=c 6{vF.Z(SfGyʘt~ؿ4 > dd<Ҹ\:SOPTz3 .B%6<RR\ ]F&0>rFҵ(Y2e5bW|xEYW2"=c/Z*_ܭ:~ R,^uG#4OV_WX>ڲ} 0r[F5o2 mX݅$,Rlc-eW{$Gp!4FX'%t/;EAn/!(jv)?_=48! ]WZ':e efr@xDߛaD/?sіC#rSZ`8x΢M><>5w=pOJ^d@O:_&k ·~!06· S.W%O#AP%Wܼ6D)boڦrCN|M1jwL,ά;*L8T'j 0{sjE;DhSAzCjwUxǑu*qj!mG0vR9n1 -'ԶN=~}E׎Yy~y:!"Lm_5v'#N| 5X5xѧFW7ojv6&C@8ՄZBGI q;\i&a cEU4C!܈̓R1;NamKR`Q'pK3NEtA1kDe^'QfL/[\S,!0eI Wy|GNY.R$-y?PX׍9&L0ςZ_aA~x*aqer/E xǭ8yН֋d2qf"twScbT&N !B3S81McpKj}%M_ëَZHLDE C,nS|SX52 _ : "&M<|;Nh @VJ6vGU`U &].qB\)X8Sa:+W s' !E )i -g=z78Z7!bC>=ˈ8};jM*:~ )GGP[e*\jQ%Zq4`9rf' Lm Pՙ*>|ݦ)HOOpd[!tVͻ,|?(ڳ5o&J'x^#-?3;G=ݕٻ[j\v!pSNXvZ-G_-0aRc_v73__6Kδ8lw<79փhl~g6w:T)[D2% b6P;RRCqam]|チg%FNEzWXD~]Pc@LET7d`nvpA3Ւ,eP@lZ0t5@`]2%N %blaez9 |ނЌQ-HSg|+MwwHE ޥMH%/3v!4p e||0h!HKa7wm*"nl:y.;?S8ōOE9Indv[4$IWJr 8h m/h {Dw٢ñn'3NJA;霢7 &>y0^ʧh"}gD:|(Y}PY2SCj8oIB'x1(El.NT"ᶙ7D^,lY()&hqpq11;_QMEb .p3]{n Y3Keɋ^A^LW$'^F 6M !lR]j dIfA/v5!(Daxnڧw?o(ޙJ<(.LDSK 猗oLj'D"AZlϒIܢźh lS.xRw[ Iًw,[" 5uQ-raULW!Y"=&"V:ټe R&q0z>GP7CDu;L ӏ - <٥΂4O/P6O#i B_ >+;`n8(;f^҈.}n\P0ލ*I$FmdF]z`D|8ְchN5XyYL4Vw)Oi/v`L <.Kޯw{2X(~m*~UWi1e}ƋG~~,(euy6+I⭿E e7RֽIKqoeXeuU$uQ\ĞMj(Sֹ 05~_MxO1\TE/XNA.{&Ի%F8Y+~-+i ;de> Q٦-Os JUs;U.͒\mr6K&@1l d/=0{tmer Vj | Mk^l㺄=,NW.p#v<"$A4)¿&.XEOGag %L! vq~ tHlM8b s?yhїŰ$yY%}XƗhYěW$/U4P"MnwIYiClqھ_j y*UG^Z`|O!k_W#Яh<ʆ fjkdK ĉ2QP\mI۬ݽFBaS%NF;y٪tA7SKL!MWڹܥl L x:^:xMIuiǂc>qy >cקF V ?oˀ*7^a?P/.Um1.6N4L "a}VmSO9Q WP2Q-Lic=z}nfo2PaF#6}`N4gv/EGj_`"wyХ\R&4W,ҙ\FǐS t&x*~}O<;*rmMyf{ 9ˁq6~xŵ$Vn2vy'߹Ĺ/P3߂Zf1i2ن2^h/;2K#@闞 :dzOPܩF8`jr^)T/2#'2Y%ɍ (鋰ZV7iyʴ5og' `N.$Qhhw -i$Ct&ۙF\6kjavop3 C{**}0ab&3Υszi~L= h 2cw2ݝrmLy80"7/qf08 <P`'ջNYJ ϴBSjJQgqZf*s(擓'y|zݿ5׉{ grdž+dQK#}ǜ/K;ciP!9oCg&iαADߑ|IK@(duvS~:鸓B(ฒppQ'y^S;vʌyƈϫGS"2^~ˆ<˃YwGj 3z?*-ɞFdiN&vcfmILr&!ݓEA=FUV9 8% >X)QCJ<2I!K=2 2<:; 8ݽWTޝR-+^_דZH%"j)^>lyUS"mjn-Wdb3D)WX=Z$60 Qs+IS$lk".Q(m Vd䃽$0 F7գ,Hoކ#Z!FKS8Zęfnە8SLd>)~#}F6$ 0ø4̵`8GpVU0nR_B}Ns@--h#S]&f *VJK.A~sxxȂ{uM(3⽖7m] tÝ{.'qo9#t#mbiؐdmD'Wsى뮂HKy_᛼B.C@EF¸6"6&v ";b|'"%`A8"N)fX^`A)9pX2VJRVux_nNۅ>g!?Yv(V;LɊt[Ts R_o$˖Ng1o3êg.3c3&xsV0QE&-XV쀥Bbq$Pp/ SaxT9RpzD+GfM=Fq7wÈnKgu7fWck^$2Q)cs ]b@l0 *O~@P*Jڥqy&wr1j*?"vkaM)( !#_TZ;F< *N`oBѳΈ+ yY3U*(ۥD, xH> ͫbTZ1~>/Ѧyz [O ̈/kxHC+oLA[!lȩ!e^ݷJ%l*xǹ=D jۺg!ʱsz͜H貅M$w$<^d!4 xP +125yÇp Bޏ1ۼxbnՓ9OLAyF!@Nlԛ<.7'xxP!".%%)B\Ńωg9n2:x-a 4Q/w1|UDnz!}&ITf`ͽ7Cmtkx@[)#G,mg+]G)R#9:Rp5((>;Jƪ繬‰۷ ,[G-y@GX ڼjbߗg SNdH0dˡLE>!ƿ.H|_T(=̠Y4XY7 㻩b.4^F悷aٰL+Y2x{'u oUHf'CFA߼FZj BM&c= Zy2ecеAH1I |o4 b  G×L_I2uy`CPNb |I0-bR,<&BRfe@l oBCE_u8Y/9ؗș}~1[RrV5Z(¸uk*(.XSE#cOTZ QQgEPtv^ Yή^9K+@5*/'֮Le}c8O6+E?R^QUc5]&Ғ0"+My(\sH*ZybH-%G0MMݎ E ;@gvt ruܰQP#_j^ 8^:6A'6 $za$~ɮ#I$y<o}p枎isQHQ@0- *k3˓:JH0M+m Nxit+ͽӛ l#9X`wkwjȏ0շes;,6,5T ga9ɤ髷*AZMWno =ܯCkjiZ|e%0^P=WCC0'^vw:ќ-#)e,t-*R-"6(uZbHv{.듆Ƽ4E Фpy o:Of1 5q^IHX.xTtl4Dnq˂zĞvc ȲֈKJBu;@bQ402N· ݄$#a,]{R: odQfUXw l$MH*Gnr=Oa^-{UV}3U&"w@[ǘR@Zu5&ެb_WDfLz [#GGC)jCfhQyz 0䝪0SMf^}sS8mٸV*̓4:bQ V"(o87nK|K2-HU0m$K¾BI S"|cG#j .Ȗ guvL.#垠N ,:x7ﱨ(zuA:yb{I ]Ϩ!d*oա[T63fեpxǫ6I =zF>!YeVjWu';I!3I TbbmZA|B?c(Y #Iڙ"0X+h-}U56RdɈ籾eaZw{xPqϺdCC &3 Z ]\ F(Wr߷>xlh6uPۚtiE̻}՘_gGr J eQbJ驡УLԉ%@@m޹PƦqwdU:*Y?.JĮCx``x\uj%d "p[i^H/3x\%ٲiCciuzH.;:4}N)ʡk2dv ;,w)$7Yf@<<و@}=I%li*䏇>+i/'a>Xub4'_kՃb<[[j\M8kȚ>^ 2a=%Iik$TsDr $9~xF3;lZxD @ã|J .>7ӛc"@<{FTd% s{wM#xtX'+~̼98|Iyoe@?ZKJw d;zh)h|j_f7EWj3Lf\ )7CTV"p,+׍1PAqKqJN`Tk?0ZA-[)3H^iվ|_{Wv{.n7osmH s1Yo]]^Cӈ|th^Q(MA7W䤞aEV\Zk:"NZO3Kk̏%/2KPC(C)m΋w8$fOENb@ѻckUmFa#ks$R[BKJwSǘy0ds<9 ^!IJ7,*<#h*˪fK8 Kbr4ԃ9QSz^iS>*hB&;rȲOR%bvuD%Kis!>KU; C*{ݍU"1~&fR'*e*vY̚n=zָ4~] lc0Ӈ@W(B k jKa34Ql)̪ݲ32kP[=Hyl z5"[{Ga/Hre 'o~tD4XS"YkwKf^!t{Oڠ&onwHs ?]1L3> ׸.Rڲt"X$g FJ٠95AzPJI2i[eg-~psiBg20fΰFSE0NS߮ΦS8x9d5)yeI$ǔ4%YaHdφ-mp~&K,nA?B^YI; 9UKV+ScpUi[0BGak;P h?]LqpP~*:XCX ŵ]8Z ˚-6p[Һ8LEJWH|Yy x^z*$ZPZcRfI(L_XQ? c;`LwI7L e~n𺙘Ye焳-DgF@?-KnҙhDr b¼cvJm\ ږx7 Ü. lA EZn.P^m!OvZ-I#,^NtEF _2~QϾ:ґيؓ"Vm3vԫP)nuA5QQ6=* IQf40=F57n0s%K?6ft>g>CZ;W&XWRw*epej637ŀZ DO57<tk+n{Yww(b |w'(?I~ON~fWx N`υ%zhd`7MZHSpBS8LUΆvQoW)aM!]ܤ3| ?S"T-"8`yҢ'!tY{6Q!5UH-F(kސ{36*^^I64B?' Gיv97ۘWzT<^AJCN\B ?Wp `:8nshvbs˗*S vUT,4CLzvEૹ_ ̕\AYhGLk lUoO9v&ĴsO4GTʤ^ \<2TD$Ҝ4ZX s߬G'JKKh"͍;[J9'T/a$@SO}AvaRv4 1m|=TP.Tv3o'K[a 3: rNu }Dj;YmALgL5;AA4UOLlɎOw/`^o~ez^Y5 +YdڀhS2nzZH `4(?ώVJ47W wZ4Vo''@.LGX]C Wj)ZWir >82{^p = ;p/U;?.dA>@ "y":u"uA|XR%!n)chظ!Ql\~QMU>ыak;$ ;1njw՗Ǭ>C'"<F]Y$uU!穇_ʁNFt2'`ٷ'OB-:T qS1Na=7A:B`I7KaLw)8cz[?r! |d>u{ԕCf l>IEgƝî碞Gj$CJdacu*d[rϋ~ؾ r._.%IUoH>ӳ;g>8^Gkуwе'Zt`b4"glzdYۘ16PpuDkN+ 4$Wjcd2}Pm,TvV]Ū^` rh7:Y (~_3|2{EEgqtme雥 db;F-YizmNvFbs8ZCžv_N.A 'gԀOjto҂ O\/A QQ\["g s.ҎBVS+;g3>ꈁx>SxgԒ+Ef( +'9C5c;kMZ%jk\RaE;$;11^LĴӱ~UBw0}UR^;U!NEn > YW^<۶g)Ta͞e[ &5 ō^3vb($ Lg{=T)^p(4Iņ/2MQ,>C9ŧMSp, ~̌vf@o|Hm RMtX S=Ȯ&"%I).̕[$o@陼1o}z6C"lhhcC9qTQL,exfu̼l+( $ka輪9QFD`s}K|L/yKHJqMkqm-\^aWJdc|v +z!46鵥ܨ3;iu8 O*َjޚV͡Z#r@ġ0yOhr0>"u5L;20JR$"Ls-v(a4/:9 JЗAӷ`  +E?3uhA\הgVE0lY_aHko` 4L(=opƢƽL|vhxj,IW &w?r"$7?=f.],S#L*OiC<0@YB3~]9L4T[;.a*^NXr%FumKoQK/eLjr53j[*X oj PFWuc1`6b~:\[(Fp xEA[anJ;vEӐucBsj|*߁q UrCz=ȅ\ICg6å}`}2_&7kQۈg <)o;" Mтߩ#-邎wWū[/4'=ҕ͒u!cϕa-Sx[ ,vѨ KG|WA2KkgY>>ܞ׍&@JINyGYF /(x 2K qNڴ3̋h (*V] ,v7ZLKM_.&EljL}՛bHi|]L%s{y'YI sRk@5d,@Ǹk;!Rni.28sm†fr@tLBʺ[K~Ǟ+i،'g HSM5Böx1]hZ8+sʯdt rp%Xh֦_6Fnؗ2nl7˝@$-GH MɠV3Է`PdBd߬hx[_6Ws"u}tjLϙDA(ED1٘?h:biZ/1#6tDԍʲ$;?㲣t\'WiIZ 7N"${VQz\HR3 E uh`Whϋn4}(v{<&?e}_<}ա:i)4"zEO鲤 y毚w:s;+4-gbA[R:id,]4?C҃'& oS( Dˡ'yCkLqrLGr^s(h2wvH bd'('v;DfcEe.T;_FD %P:UyGZw'ٸHUOj@ǻaߧB@g3\ޚΏ4%%8Dx yS7 ͑Xl. |0+Ew{FZw[䵀%/6Ǯ$P{AFR; wqGl 4TkUںkEziyZrY) FЏm!DEl5<)] b WmLrnCOCʆVDQ+v6D ۾]-1FjF@ U|?c20L4̋nu_ZiqO4qfp?!#t'"`PHDSฤn띺CϏ҅IT:09"_N;,|184):űN%ΛYvloP`}>t@ Uw˻PAjFn`H -za}9â}%aǶ}`@:%{R|uE`!$~YqZ.u"_`%ӳ(إ?14k2Y])h]sCu|NP[~ZsgM<%Ő]lWL}3΂}gx NʍK6d"WRaIڟov8V8'z( Qf}S;ueئ &N1R,mtilZInk=e V)0&6s^as4f$蛍FzihoaY[9z٩'sG5V%Ya4* ?q{B0iq"!߰貔X3^f_ ȂA WCy|0ҦH v;ȉc"&LlQǩDhZŗ&Zr-z/-vְ [ypJ;ii.I <[ˈΒTֱ~Nly֘L$Hk-DwS/HZ߿蟮s}S"`+I+;@za tvWYu;Z`Syh!*JST 3nldTnr!n|X#3#VZC4Z|DRo/z#pi ,Fo-,|y^ '[>P`fX2 )ZJ}<dY #ώN>ݻ V 5!3C)^Vs?S+3>4QF1;c뉚#5gZPb-7뺖 oh""e'2)ǟ:c\C7TbJ=GH4Cb9\JL!BN 7.d[?gtnh_Z1Q@ދh31c9@sƍr2a3>J悬s "y,T!f\x>l4Yy3f&@a$HV4 ^>s~KޕVf)Ρp\ Ǡ(6ya~Tr0đǻYjg(Tq ^sTFR>sW]>y6M9ot43CG. =/)s?-4u%iy }tmhF$1x(So=Uz!&'0{BS-i2#?AFK@Kb^<+7,ઌac#L9}BQ拚u7wxLqbDF 6Ny8\`CXdfP>&esrb?P0xx=\]nWbeI R(lMo81/CW* %UW~CN4h諞J0Qkj[\g" yRƵ;̴7% Eto__z d C$$3]ҊVJJzkC@T9LXnO__G5K U]B%z |ZmzO(\==yU^ oAlzڀўJ 6LI$'\y\#\sTUv0@,Bf|fz.auQ<:nTFJ؟hWX8d20m7f؋(tB8A7E)@lY'MhW80x2Aթ#0q\$[֌%1\LSVHDvŊ=@*Uz^/q/k$=TFȰgTnUcT'Ditq[PM&qC^X J4>LJ C!2h% * AIN< Yg@p" "lnŹ-Ivx<5dO>xToΘ~晧]R>K E.a4yN0(Z񌥎tTҬ88.(Y2 `A%P[#h4\*bl~`ݰE[Pĭ%D&Ni`މQ:/, 1 Y<0 QP7Vc? ]D`qV24>\=G+s2]Rds,z`Faځ)w̐j<_ou`RRU8p"W|u*m2൴:>*޻Uiy&Vu`8z|Nm&$ 9#͈Q~LXK>̫TX]RznAw6ȳ!|D]6meS=n>~ z,,5*Wc鵧33OA{r._HeuNqde}n?q{a-췵YYgH26VlWBGVֽa?@I:J*|3l$^^CVPr86{2[@%wg>:lV9{gq6&tّ6F.2+ J6L}Ɉo9QQ./[<3+ʙG G(Yc1*,::&t)-*@%CU/jpeR ?25K!zv8^b??$YA2 n3IULQB8`K[)mU>,??xOz;EDKh6okn(j̈XxlGLc+GaQ# W\"5bE*/dՑ_ߟR*7~u HcyKn ᅐ "GFDQ"8b_>;#kE`bmk엣7 )+x4DX֛jtE|K#J:pKDiey a FPJ7_FQTFxPt9QX=A}Q[:kkkJo*T)rXm ?'cZ4~xWz;&(U4R*FzRX>ײrOƑ>) pݡ]Cҽh(sO? p-SSlr)a T궬R6E](u)=d}Ge=^ف\vhP Gj-ĝzS]/YqDY>x ~ˍ"*TQʘ{&a|@ۋ UNu&kH#*8zGf<55uVEbk'?VvSIAwK*GQI<"4zK/7y4t̀   ѐ Ytb 6"p,|Gr<}r'0U:2 E,LڿetwU]j/PJٰf1bɇ!=Y󃲷\DZGQzRME6 ?]$kq EE!mg'`30(!?g6:3C-}^ue:XvKBJ$wP(XGI<ӝ5%v6ia-Vp@4&Hߚ !״5U2qRB )`~y賌pi20bY~Ы>hDH` f- \ýS08ESÛѮYChw?%z*qYi(D?~?jPY5_=,O)"+}K9 >>#u0(â:y7bOؐ>幇s&VɅ6o*75j 5-U gLb20g Ɠ˿؟zw>fFyLO2(rw:oA%a@l=ޭ-@98RXoR1@LxZuW.@&Qc6sMɣ4)t~Xa2ե JS "i o)*Š1h>6=DT"kHKlX)ZT]iߑuVd(꾹%|“[d 0^rץ;::&r꤅0,C]PU*w?(a (ˁhAڳt1mxIL[ v]FB0<` uKlq:{)Y:!#xf_)$n']jr,LI Xs`A_/2۰t!? ٹnRwyf4u}vKzNa+2!8r 9uY2K5wtXNzla[Pe" 'KsQtiX2xic A:.]8.qzLSH4 @Jʠ6c-!+C,hO&!(xI'S0eUY-35ĩ(#$Sud;Ejj_e t![89pjԕ쐰f3  τUz]GWN!wtˮ}0 VYZD?"n:_(!jd_yVMqJ }7{ph2$5EA 1d/Z/5rV!xĴd '-}nО$8]"@5t7l(ؾ 8íKOE9dnR%SZVW*t b} d^J慄ރq@b^@l͢ڹ)ߩݚ{OMכŏ~fğ5@c{<7LAvHԳr4wڹ{Tncu^WagXIIec#DH ̚dXF23K^1l 2xYטo f7tJ)'b3Ϳ6zp:\5ެx[R'إ5@!kom;tAJ󋥎&YĴoÂ󫗖vxvklE IWf. w? ꏋxsrߔkH滺*Urq%1&ouXAC(Qg俴9oy6s5&ON)_*)x&!sI-v MB@OWQITwTk~ % QǶ iwp^`&2.u#J%4!@_ny|``iMaB#'V}:@lF%/|,z PTT?侮K8,aϻNmF9) .L rE8+y|ߵ˲dhڝCz 9)Alx6X{FT֨+%G4h;4#5Ӿg|^'yauxNP`I6M3zFf#zOZ9d}*u~^qECV/TH{[/T,:Ğ+)$X)l?NIQ _( lҜ @MkOfEqU8_ԀNɗ#g{W1Xe ʚh={{zfG7}㇍V-=0gIVqhCy搡;X#8UDf󗡊LNdі [Bn[I^X;E}{G-\:T'XĂ+Whד%!)#R#X]A['5f ]n9B=p "ȜCs "L+,uj㽛MCK1^4#WA[3 Mjr,/Az04@7fl!Y 5>ّ"I T}@I*?~ R3>!ʗ- 'k]4/BxmHݽ`pcLuoRmFt;Nϱ>,=n9/C̱ |HF^CpNjl0cz3pp2K;n1kmNjf"A\w<'kI,MֿRy5i?|3^3)Wg>!bSErIB2 r*>vobV|i7$Tm$>K!@εhzˌ=Ǝlb ( 'G Ӊ7pNLjMe/@G uO)H,=a-.+9(O$%{xщ2k'&y}{K19<%qS„> U~2Q.Mci$=qM+A"8#Gx;1(mތt`r*߁Q(drZ{|WrEND!a~}}3ޅ_uߔE(%R(xVjNR )[Z'\SbJ*kNS+My şS1SЌ+'8سan 2wNZWxXR0i:`ǭ[C SnA|ފDc®3+>aeq"l!|%Op?m;{84tָ[ڟ]pe[/ b~Q^qfdi {ryXg^U7:VX#8*l4Q?4ĝ3^+$ ~wvl 2h{lH:Ϧ#G} y/$m[{.pp4ɿ̑+\I;yG2sXʜ=d8-pn#Z 7V /WSw%KNu6#|xVd(AYީ]K 1cI HoF03^O>_O ̹X ej]%^x̍6DX~<PN`7u1Th|w64%'cD"~[>Ihw&R*q)"O+'x+Y7(ok_:5lƌ -'Ag5rU@o)CQ6$@gE)'=@s[Gzml|j߭tOMPB<.{5~kǀ[Ї a{+Q|hwDoGg3_GMI ^^v+ =80oit![Uz>ؒ,KnXD@{ŲtJPu LqܑgB'FK\x߇"Zǽ`10)qZM O)uFk71bږNFygJ?P</SXؙǦ<[ڶ~ \r uepS>UlgX5o7AAKDOa7N(Tz@˒/|"iUlZ0%exeoզgpk.#oMYj+ Ӟ4=:TKE^oωkvKMi *u9QEYw~;6jZb!q;X0x>,'iu 4QNب`T>2sx W 5K%@4bۦDM9_QLrh6>qS ?99bnh*ew%{,ѯ,Pfڍx؍(/ "v F&n")a/2D{ݫM BV9l!V ЦTa>#DJ*>Ș7<+q2$w-O@%Xr9 D^="mX|b3Q[ܵϖ!a(.bH<@3~ MuWퟃ.KUBX -,e3=6=<2OuudR@oOR  GG "i\Os\ JF+z1W1 сDQ"oH8dOP&{ ϝ>$tCizr{ :F @`1g.yqORr䵛DaJQ+UmHr;9W.+_3HKxLnk+NI!xTK~A:=a%}܃G?Zfq| DUaM]N#T%SsnƧA|YVSP'Jo°ebYƆ* R!-"ȣwÿVm=p|A֑$"1IHHf;b*t?zCiTg}?_~W*;nJOwGI*U mvjqBhhc&^H~ \ YH5#fZ崻WNBSñCM~/cVVV$"=]aը@{ &M/ETkr[XI gezcF$MTOicqfIps06o dzrޑ_Yk[/>aݛJ v0@ E>^9{jՒg`; $;.v@þO^HuJ-olpi5b0vJ0HQ).u㺨W!K>lъ%@=>v>Q>w6lͫ܈^|2Om6U Qu2j<Dl[0uҩ[5cA?j9 MXۡ` u&8ꆀgX!~߲wn ֫Z}`z3=EۅD]JAy#ަO[P_ȶP07u7Y~* e,GsNf&lZ|Ik^o"葸?6ƓgSZP_ ?;  ZkLF3OD~H1;D?&& Dk8oϱeiR&»:xw%=$3hyp\`PWX0*yqFP"JXo%L9,1y-v(B ~ɫpB=/GS|rȳ#p$Q[=]%2`QM:$P5ROWq!:B<,…SBեaA3|(?-HAy TE]5r鎔3Sms7o!_H>\&ڱ8+/h5?17o:I~I oX_&o6jQfMPEZcGʜqQLQ:>hqLpDB9[s&SFS^ } $뗌mF;#<>;֞ߨ )@uR~LB{Ha%V (;5Kb 7,y8`l׈>1iG?!5wh9<,,=Fm) ֑ i-#XNZMnT-l n#Z1-l~Fcu3ILd.r@^! pZ?UmV#IiU=7:yd]V6~ K̐R-+E^F }dƬV2ˡm@f6r'6*wl=En}y.eH"qwł)*9%du#QzD&r* GFZpXPx@-B qcԮT.aI>X{C[JQZ/&ژ4HU-t,xbTvd1\' -6Td{v"w3DWɼ+8PpŦ@tECD26(;gHcjdS#PT^n:Ckhx-@HZwݒIp9w0c>GN^Phy, RMrъ}L^N^hPs2xANo>9_[AbhJXiw?y.RJEh!/NFY 06a`8p[~y,Vx _.'As}x &gWfn!gƖ;դTD\K(ߕΐ>ӼĕDG'jgzb efLHUH{ [Y(%71[olf b`Em+`6X@WPgӚJD$o@J1e$}y!Eݼ1=1`v2{Z#p *l>AK9+f&1v"9xjjִhiw5$P/*M> 96*6}XW=v(b ޡG]zB@AZ62:wΓ 6'"mk :6#3a]kg}o@yFFKu Vqf"9'<cY37џ94C' !|d0 ~£=OUTЇI( who/V6"0t:̈́PF^N SfmEdU |<ȧ[ӡK 1",k̤K1o,10bͼx}y +ycD[QH~tT^P+IKfRʜHB`d~;-NQUZ,' j9a_<*dIU;AZIܥ HT1OpvnWt-gi⍒Bnړ})%v ka:*/]usc~MI]:̊K+YS7AHpu0U9E\>LOoE/(.n_a;%;|Rkl,];ƨ'6?6N9VU9io}4``*NX|R?wZSmA +hxV`[Ӣ ? (YZ:bO ùRF܎*0=A׊H5o&TM{ROǶKϽ3sZb 4{iU#Xޮ̴>tޢݫ@q1ۮLqٿ0D~;0` 6ZhFi3y賸 F}~F1%Qm:f3w6bz;IdYne1Dhqӥ5/[;FjĶǫz;Xk%5Kr!Cߏn3|(׽]v5F}6~Σ9OB/g O`J^y85&\pOo:H<QcTopU}7hx%mBPidk%r `&1fpDs`Yw*tanV kj>~r?2="̏ؾpa^ӛ-!6xpyh6EcѤyN0ڵ&=tJAkV=,CY?#\!>Mf L vy|aϟ*4R'ub^VUML Ж"Qc|QmNk,r#:a ^4@,Ƚ*599l>/7t^+Ҙ7bŁ O71p.\bZ갌evP&a Hl5TPxMzXcoWNglPZw'c`T2dg.E::fcQuTdӯY^]e0i_9\taއo:كOłz%cH)+$&.} >Q0Hcmt2>QC' 'pt.2j5 Ai $$$YՕN$֫Gbt",MUL5"Cߋ{ N#}S[ MwJgvɩ>٢0>j)򁟴,]49:K,ـÛ Nڡ"<:f#[Gs<}rD\ylfsFe7B;v=qԅwQ 1U}:And`kBRMoLGYMH6rp$sel$aٮ,W1IL;-tTQH/*3o! .9^q鮺]U _"= Z)w%#rm[ITJpRH=P(q2YT#3!d/[B,$GDsIiۺ+F?^. ;!@d^9M̿T-Ru.6;PAěkP0wnS܁s>4l0a.eƉVW\Bjh3fbWġxx z7!I6D7+e6*ÊYM?H[}_wiUpu[®\P}#9l(N12`&ķ B[-a!iFFih֧_& ن&px3wo`2Jjp:bVas tM* dǣ+@ƘUon%h^BbufUü䌝@~ୈ}O% < _aVhI5u=gUDKGxHzKdή:8Tˌuw8 %g!r}K=e߁1dTp'A`%vD\@-H P3B~POՊzK,$yЂO -eTؗ2#7:걞ݮdk]mmCR(/0 O>8=T\;jǃ~ ^k8raA?)]/V n°3c *>e-᷐= &!>6JN ZNdN,]eڔ 8YLfƽ$ C]4"edw\mj{ZN yih R5]UO[i!%|o$:Cj#߄H=p]=4 .9)-:3JO}Z=\Fm]_P:~d:.im?zy/mK#F . Jj 5x]oм|c?D? 4/!ڻ&9⍇miVvu˦[9%U,:\גQA &tMx:n,ã5&L"̑$cKɥӒM0evIu6T13HU4ق G+DCG 9ݻK6 ؍CW82d7[ec>YǍo|^ r x>|aWlUr[.1"k'XIM_ h9Rɇc[L=<*ga]JkI wE/qiOOH,P/DtWXJ;H,Nt5_'Wz]8W;&ݟri~ٮv&ܜn3QQ K8)@ 72 {)_i1l IiPېt2U1"5 m.}S?-'2"}Z긳qF #J0Y=&|c ?CE(QV.$<.rʃ.NЃCW4gO| RM6e|n棽k>d2E;wxcF[B3D.披aɲSGa~.`9(8L$vL!-a eTD򚃌(- p2zO+ 95-ID(zx "˴ 23R+*T?d)P f+xnNўvjWCu2ގIx}rh^Er6E*dE7Y"+}UmJpP)_?UYW`\3ZnU'We<|_ \vg@њnҎ&p@нF,\;=Xm3f͈ blzwAR'O-VOLuK'OQjAqjKN: *Ebۋ]M$V'Nb0 x\&% `i}O!Bl X{I/c)=Pw fvW:c\Zr~|Y遧jzoEG űMj/*?Q)wjQБ1X?@׃ DWb\glm(#H6ٕY an<%:؋5ZCRYekUYu='g1+H 7f1[Bz4GBs@zm"Gv.]#Fg+;tdl+_cQ mʧjХ)wu,cHE ?`p.GPo]FCIgZtR%DrOh%\)V;qNDŚ5[ýt# r& 5NشyIׂ26M$4J /O|TJSq8_\#&k r,wmbb9\5V:k_Ti:eM95 +e2E}7X}r[^S֪+2%(?[;PZl׫斳A) Ag*R,'& WҘg(GnދDS0j"(}ᄏ*{X 5Tyw}f5ɻ0dQCkDT)K@ 0ޗ7$$ڿ{%fpT$*O/J!-.++|cxY]d hYO],J'7-jDe42Nt$<9d+6jkjle/tU=?KHmFҘYRTI8P ԎQ"@ƛn%\ HE1 5G;0[HupbgH2+RC.I)I3WY*xoQoHiim+P[fmJI#je .8F]V{Uu_Zy9Wbalip J'҃BOǹv} E_ުo// ,RCL3Jo( 76ZzI}~ U!éa[D} KV4iiz} ;=)ypF3,|޾zk[ʘ?X?JdBkz8D@Jl6<%q&G o=*(ݤK $\o_Ղzv9զHdMEna)uEr`7ϊl>8.& xZUH (؄n#TğX[ U8,GR5 dz< ]u0)Mo/USA{%0MO0T'ZX `I,xZ G :ovE(Y@v̯|ԄL%=1 @bN !su?[ ;.! ع5,[Os0 ++#6o?*i!y1gz9\, !O;^\zD@^U6 r\пҦcl[ЅcCsgf_q 5 &8nY|]$~&HbAۊz3[!Ϋv6Z:yZMpܵէC 2Yκ;.DlXsG]nyIJA80ɯ$ ?a  Bܶ ~yكX}vcw |bֵn ,$V LC?}f|?@EE\[+B#Tl4P1aKihh\Y±8baxKQ2|!zz2-3QI -쁈~TՈ8Po6w2y5ׄKf%*O5"EoóI (9yEޠmxXr|7v:RMa6:AXx(PypSS}Zw*GIm:a~I RdZi{7w;LeJ@j|> XfV)Bz`yr:Ÿ2Ϟ&O|7ѭқ4QI@ƠB %/k?!|t",Yݴ+f`=H: ډ֝RkW7h{"_(0>1rvFCD?`?#{ck1-dִL i4a Q+6ۥ4`Z@IxGqX;J#cmզ;?~'m nJ cN m~9wH}*(]Z$PXWP!ES8u[raa;AF`E;h$ZuPQA5J̃^cq⨂NH3g^|?b/(Ȓȏ3^q tBxw˝iC$""xj5ȳsLUiy4 ̖W-#DE@Cg.SlCwꚧ0iC K沜eԪ^:nΎ=ovk%v^"t, cIfQc.֑=Iq{ R=W /0(v=n;]-46⿐q^V_L<HAOɶ-؇Γvy|ȾӰZ4R M`zO5?eW ;KM(V,.@͞3MLH_/˵:LKkņOARğ=lFM~NdM/:)]ެ6.xU#bc 8[ri*p+:be:R5D3z 4V ee˯pb)1(ɘg/(I6Oh.7r7,[íVt r13H5):h UB5FX3# kei612eX6F6W:[q``q9NRr1f)mA'zy2xnA|F[ ƙ;=m077 ݻh~p{ euJnJ<215P^EEo\)|jsRMReݢ?Mܫ˲N}om<:Lqj-Eտ"EPcLұ-!ct顚,E3uYKC 7q#}ɍ^_|ͯ H掻8~2aO;"Jxe #R^*kO0z >2ݓEfYcL@d'ř_4~֧ TÎ$#`WC{Ǽe(Si`EI='N m'i F_k3D:8#\jm \f+>?ڑX,K(¡1ZB[Qy+["y1!ˀYPo9D1vU/!-s#B<۾溫d V 6?,ʳ1]i!`Ч9dž1o,b~ Cퟤ?&rm[x-ۏAQIx1ה#GOUVA;g$;5?"_ss :}+1s:JBG;D/7M{75uy7L9IN]4Ԧn+FX*IDtEy@*Jh:рU&M[O'2nD=#:M{sz{{ANĮ"Sz?wNͅ`A 9QY%gm{4A0w 7jQrv D2JP 5E{e [c3){Ek?|"Wźv27(v5!'Vn,ImnyUe9JC]ױ #j"votAҰD_'5Pt1xy} k2q@ҌDIɲ[}egÆ/lAʱi5f;qXMF !I.Y ] h9}Fs.9?'cq#.=F:B" X-ᮊM@bۅ/S;tQJ͊jo "nWx1%@<\`}э/-?zimI\Vydfx\p&@ ~ s5ם(w4pG41ڷ+3'OeߡH _RUOُA7{]MϕISs"Nퟬ!лUi 48 ޚoU͎KZJܯ.neGv\Jx'A9`Y/A*t?h}iY } t0K.#Nm+48WTɾM:B)6#_IZ]baMdEslwSdqqPIifi(ҢC+a̡il;-,9oTIM,K{:NW_(!b%2(I'=ÄLi "=>d.e UqGGǐDŽw=sctDHݙ'94 B&M ,R*'"- 2KDsevz7Ic^t馴ẃNsݨzcg0a[,b&)cU̒VHVOQbv0Pcw^^<i@B}>[*5yeyzJk9>Arwޡ+tT}?xTHļ3=/:D&ׄjf2q@?xB v.AE.ӵJ>#>!Nm/ !#4C܁ V [A3ט4"?!Ȏh%DfRԗU۸fpZc!KaS_eL-wD³xϭF:R]氾v=Uj8oRrao@kvLdkzPޝ?kp>r(>̀~'t6r譢J0o4ϥ 7.QwJF jn#bAi~ڼu:SLU4f 0\+wjZ䟬яPP x0 bY`WW*[+_Ǜ-d7ܑ3NCCT$$MyΔıW=0N8)yB [82,Rxg9Y{Sٝ&T+`HvUg ~691{ӊAFl,3i#-8Ӄa3a/~?W}}!jx,Vw8.ǑP}f"dU5MB~\IEz3eBa:8 -2nXYJM1eprlxYA 1u#Uk2SThcb \%a/ĹE=!n;TEC!jj jbmZ,y:R_K<9l&'TZUAy@?F|W"YkTwURZIQkwӽ ?OBG;KؤdqMn9&Z8X 9?`) <YDV D6op|ryӂ0$}'=SꦖҨ :64&;,  lCi04Qy&uVdV?YJFNCm^B"O)a3|>=+[CR>[?l0h-Lͺ;Mulok+Ƹ-&S> d&w*"&o<WFϫ݊;9 t4I}_';J(F@X4I#9+d.ݫ94 <Y)F·]x,ی[?R=>Cmn秷  ճž~`Mm%3x;!sSA5<*Z=Q)Mx&=?VEC®Z Gyݔ8%bh|ߌ\@A7BB/XU(Iѓ}6Bܾ8U*cnB zF6^)@|4 &oq#Op_z,PKc xk$6fmY.JO?IjǤmt PXjmrlwbn= M3+L-a!vMp},26ڮrHdbޝ`wO$̃~m]GٰGib7- ?ϥ"қ6H ۝vܸ8!6U]j_#NBxFVO 0b]`*P? |I&oC .%ˌSVYPh2Vf`;>a4kHZ.t[oVKgLƓ<&n" N=&XSr?$d873R 8;, 45/RVgeRcd0o׊}VTa*]nhWA ywB`K~8 t9@UF)as%A.+tF̄4 Eq_!pm4}}qlpANjV1*~r4PVp:j aM[Eì8vq[([aD=ׅio&Bo.pFLx\$(Ejи1./Pqn}xqH{Aqea"Aq(3i0>2\v#1ϞP[svpP nZ7nP^`8H bņ0f_M:DzȠW%"Q@?t ֠ x l? 9ȳgǚ8j]U͎ B'䋼;}$[_Jdk=\Ov=wb"+kc*o/@[JI%4cJC#/#8cJcStL5nF;NcnEhUxR[ɠeӦ0 2vI`vE!=z8QU('K(yk;z袭E"Z/h9ȽnlSJq)6yL5ȸo ʛ6.H`XyVxvyܘ)~H98FyFOGve'IfNS)p'v0 ߜ\Klhrn`tuxd#=U<%oS|/\[O!v ֝as2zpp{MOhH 8O sޫ iR&w8 a4#w:sr uݷ>ϫf(FSsյO(t9Nb-1R#+0:R׬;Y 1X٨Qܱ@OFmRdpkVMƱsJ}\1{C =8|UElYD5I@~K/RuEz{U6K cxҳƵd{l$EQh=b'`E7#3Gla3-֙35"0 @^rtE¸q)hNARL:_Ap՞@֡ h\!^uQZFjZD8|-h5Bcca8k]:Ρ>Tn|U#j׵Ȋ;{B9\B_!'>69Ill%,2,-AH I2\GNI9=[_iO$TvN'/OC)]Lpd&,5|ʧ!}p U43qGXǻ1,L _xa,gWKi;&GD fp۩+Ti?Z`nԈ췮Cϼ}r YD,³Q\%m|*|e'SęҦvPay/V]?Ofɘ}&^aNP=DWq(-*_-k|ry*tt =p6sFnN3 ^H>;s2}{-pLFXT] /1Q:(툡0AؐcU{!ȬomU Y!`\uKBf >! KkʞQ}BL¿chڲldƋ#ODK4:e=DN(ɛw)Vگ=RUorٚ7_*%J;NT?œұ"PΛfCɃIsͭY9t!LJy-!NaؒT|Sjko:Y04tEdFoRGiye.ZO4̡`րxM<.E '..<طFi%SVQ7đg}}n6(p@ c'|*ozf3ԈeE5 ;=Zh0Q=tnRa딵$ eg:-!aQܳGox'=ayh}gQ@V]~vAP%!A:Ȃ$B^Ɗt&{9xQ%נ\[ِ@u_P膼ra\lP$; o 4 C3.ivOR)i`HҖ#3)aPD)UjmWZΔ_{zh.o$ú,t'qŇ@khڲ*p)e>aW \` V`Tk*ѳCh[v2 Xn\~URnc2XtkֳUں@|s#ymao|J)s9;m@[!4RvyIyS=K"J18ckl( QjqΩE'I^fW"/Lkj0 AYF9LWOA>ct\zݷŐMi`o,xъY nG_gKucŞ } 8ú/;hמRbkyeuvu01Q8@AW}t͗K$/UIYBмz_?/x *QKaGQ$i"׋ʻ)SLHdɲ}V 5.@ɝnqRy+9QRm1?g^zѩF/" o nlS ח +1l7H$(%j]t݃cZ%v]eʏ 7`Z(c Ԏmd{T'rvB%6$V²L$DrEUdž=隷}tbK tg+T] m4Vu7Aen2$˒oݿ }N m E{RI#e=BJUzp9pވ4NX^W8ZtKx* |!3pxI)*\7AέEOy:1! ]]%5/lBS}5f˕KygS$]Nk.F @rB~a=,S*?1?&,ܘ_W]fk,+ܟrY!u_؉4gk"88QAλ?xm&R[kySKg=8d8#x D0-#@u[M3 W *#%;%c 2YIntKѮz iЍ#)X#T{W3+[SYyatUN5J}8 5_*yxz5~#qЭs2,<"S@.ϩeUCg51dme;Ѡ%2L$TJLQ=!ЎU8afFɛAzQ"`>FyZ)eհ)K;~MiYbGpCQY;]FXO۲Q^y߅3ng&)٦78B7ko<uZĴAؐ;y:Cϗ8L6R6+>Y}e|:DS +c8LOoYo6:v!nk^FPMyL$E7-yR,١g.&}#}܌'7#-+`x!\sI֮Ӫy?հ'ns"tfu6}:s|SRnr_6+pT' tU([ـ)#8rwmGbb08 Ho OqdG`z*P qH4J_b`a'CMS%qy Rgp6:Ҍ~lpg&H4諠Uwn-"ZwV b'%m1Q0g&#_ ~5]e!3:G@"*/N˾bcd25HkWcWFZ pFd|BYi4%$:/T/x8ZaڑtM h2"^/l𒭎b~lJ,R۠2A)癩xdj5-#4cJ'xDI ULuYzj7;7_aaw`_vDh̕s=\NF#W^)9nVλn؏ZVϧOR[ce koj8\inl:pDn~((B3LR ~7q,_"SU6' t0l :HBֶ-ӽn~FVaGZ\\f@#,^wE vC=.kخ-v slU MT%"m~&Uq +.ote%t\VFH&قbDq~ gB#sCcFQO\;lo=S,eL.Ɔ@`i&$O, 0;%1jr'ٕ9e]{ {uCz%|& $8DIЪlF@3_ ֶ>-x/l7@ڊ3XPve @-i[ feާ/#c)yj[/~trg81Uˇ"ō6 N4׊^\֧|sʍ@XK͜d%Y d椈6hpo[!dM{\)`!qpRXv8`Wj!)d_n#$| <&8w05バ 6Hª]_El*, Bžm!RE?q\R(Y'vZ9*fum-£x2ܜ) JeFqZoeY?zٸTg*g#<1䬑2..i8cJJ#XGVń L:Īfw34^7),>  g- Eh7 3aSDd`7DhPCt!x;U9*X;̻)s{%F i31ZRux ]юDfF]UXr 񬷶PGfVbx"8/Yoe{\fiIsDbQnY[Jņv1G+[MH=h )&[Bnq?߷]W&A&zGE`YZ2@ ,̀Xn' ZPc},Aw|I/zЙ Up K?~9䝝enic- 2aD7]!SуЊ&|(n9[>R_5D9;*'KT7Z|>Âi>MG +6͞HY gR_ٗQګ 9 \GpfT0=% K& 3(OM~> dņeZaotȸnJ<nKRPG(TrXxHnXFf_04uS'4B>xBVGn%YDjZX܀* k 8RiF('t FRf!13s9;Lan32Y %4*YT;U#Dh״/7gb~yXbou T^7a}PѝAGO)J\~y&n~nf R/dv'r(o~zPr3Շ&h&b{;0>rYIS; x1rK'hb"yJg{و+=l9BG+Znzl: o;\l#(}tN bFQ /MSZ|5!8\HϿh3' Urp,2 _Ojnk$e"cdŖ :ßmk5{  1j9gq}CZPRؤ=?˓DIgΞL^1sO+=h< [ߥ%@mE֌EN5-ng\dƈ ŒB?㇋ɐWG)/@kc 5(5^3uc2Ȕ| =kX'9^v 'vC5T^qr __SBT8,nIFT#D7{ޛ?]\LcH"MoO5sgмNvZLU޽i@vB2:;ap,"dkg~ ]8T[)oF[9-* .q iӭkSP @jLBr- )9!n9*2K)Ѥi5b@do]vpSF"k+ inP !vkkoW?/@#֪U}େgs-/i؀ާeRd>↙qv" 1M|<vtիO/7ٶ3mW̔(DR2wgM;ylD:bxޫm:~u~.ZzזA;Bk(?K :h]m6þ1ӳ3tzeQ#Zœ č1~1fp/^|&#7|w=c<&Ԍ׼FX2T3i $%e˿NHoF(\2~|mv4i\şx3jbS*/N],W#)YmeΖI,?xbV"p1 t.Ѝ#|$M̌\_D;U@5t4v4uG%Aft[>%S>.͆ TUyK'≓~~Ixfg>?aP嬼vNIYD.iMnʠ~L5ިzD5 X^5kM7O& {Kl,NmJaRF"&Z[R+֓4+NH{2Tڤ=ymJ{g? ?]Ư.7<:-ߺix8pҊ-̗(q@1㲍Sx}.*AY7 jK$B8~|˭1+]~/Iۘ {c5ϳ~!O?*C~8m?,*12U^ Mh oQ'ʯ9뙒~ Bx:djq*?Q*s]ɷFND$bV{d}W2Jd3|/#9O(Bޞ=9lg'5\|TQi`բ R\֚XYd"UyR+jqD-lL B4$DE`6Vfs3(OWF_ y * 1 Ϳ"/U"hM+,#S53VLTB LɄ&f恞9v75Zי5f 7ѪipCg4wFX &ZKVO=S n)0.ZҌ+e/Ժ;_lq*9f9@% 𯜶&k=93AbQ0 0xik?˓Zf!5 n&3Bܮ eal PjU![IDmR`*_TYC+Qc ]V)<$GrJsRt⧋=W3Ō}/;|^<Ŷf *5b߹n=[C76 yq)Eqyٵƾm6z7w~78z Q0'- D\ܙ QF:a sG'fmzO80vs,=LՓ9^'9N&h$&D^u+](1J%@L!?om)f.P f hM+=a;CBZ-ǙkTu?[2T4b= uL0;(%M  RibOvA,ʄViId[[c}1FpD &بjy>AwAgŕ7R}ƛڧJ Z@l.,wA;)96 3ͼwX)!~|pO~ oSlz kJGVTV阧uɾ7/=~>]zY:l!PHN4(&%)xxZ~hUg.^W0۠'EXsb mt|9v%5!hƑq2OڤȐ1@u5ѨI*jxm68B;)r-|TvbU>  3[OkG0}=ËA\Y#wBtctDŜΙ`͸'ӝ)BDŢڭd9dPl ؓ*c%:4@cFўFys];^RZ /nMB̖:+Y}q-4P%jq3Eت#pm 㕮@[FM³nZ! y.v- s;TnlBs1Tsi>2!Fj5C_Lk2!~632BY62ʤ`,]srکOW|.)CS;pJE矹: x!/5:]\nG0r'& ГX:cXTKuG{=f y{Ą|ƤqUovY "`fpzL-e9=\)z+PrcB1 61:D(F#~ɿ#nu^B&qH dz/ޜdg@GYȀp[6*pifV |DhTǑXi`QLo+|ŊQzO]l̰nrEd8.KugYW5\uet` EYV=Pqٓ/pRR4"ĩH] ׊ID͈H^E+hkK!`P/" dDU;SJ1| +qPᄾ![Fܾ; E/z6Q!ްUJG1] s )@wYaO:0T"P)aݛZL=pLWDg| xzZTnQ ; ]!c }25_?}0zl߻!~~BW878r,͛}N>cVo)ߎzRNihFR\:d (_K4n)/eH8%}9)OT5$$]aLW bڷ2r,e=`z!D W%R3Q vSj!BzK5Kdi)v M3Ml9HYLj?gc9˧~Ey ڮ,aNNjsT/yc~j:EprwMP׏78裣PZ/rJ[ `v;9o&o&oJBh/$/qA RU&U"v-ޙ<-7rhlXuy@¿DP4ǂ9TW-@&/u@57TX; ̄ EeEG'=;N3. zůWXf,U>MƄ%Suw\Yv򨦲Giԧ+'Ta鐈:ך7`*sbS[DzT9GJq3<gÃg'Ceh<}C?U TIafdGeBT<_{2-:㒁u#&=r`R*ӧ$1Vu.&$pV@)^wbo\fnRU&$N) kSL# ]:c}p{"UKy %vdSL=RTƳY΄TՓ(hsXƋTR S5gZY$g7(2VGS|\e5$\R _b5`ޔOB#fNپoP7~@sB"lX4=/YYo3^{!t|jej>$eb*+66_SKaM l-0[^ HPW vVlΝdYV(BZ&cK)cC]jlTlBLc{L-evcKSi9!Xu `2.rrۊhR17c "$!H#{\Y)黬5Iq(S M˄8TAC>L@?z z<2Cؔ ?s4lKD DUnw\M,&OMq3!BdžkЁVbnRZ> P|npM2EX "Rs(Oo&Ofq2quY P?1H&eaTנXJB{ZVQU#wz )/m0&:}?{n-t;KX\4_:PGDJ,jRMҶp1@$Bnſ]$}7zH[:43|l:ъHƥ]hP8LPE25nJ/3 \׎&.w3}w) / ND_DZۧ Q_4B>61t*ZW=;;J41^ *9s&Ƌ`*b eֺA/DI(]mtQ'J#k9Z!ܡ/3bF1vOѮ LКB] (":ؔܦ1 $i5>qz # S2jU@k@Q’6<4y}G W! B9wfv:YS ’quu_.>(&TH2Te?R*OqL9&KƥgJ8C'AGAMtg i\/2E[n{<,[z)v3}M)J\'i¡.*ńx)5@J_;x* H~?>J宯p-W܆H{{2HFOǏ0P4EZL]"E_(Ea/t)'~$%_߃?ŧN1'Dty}ΛNzcj^~+jpUr"ɹ=ȟTƜW|1wB>Lb،g4@1 /6]?bP)R:Mfx;e %_<9B47\bgL!Mu>[*q [Jf{5䣿y= >VFG#OwWom!#NܐS3]p„E\r鈞AVzv!Ҝ ڪ%8VvgU~W~O!Oąʼna 4# .LGy//؂XƸd2k4i7z`my2M_vE\Ւ”Su85[QPM g-26x?h>Zg~2Sf}5\;,i![|Az daFؔP%lzE8Z(q O,e@Du/'6,}5 2yԔGk ¸ /I_-݋'^gaRJ}UB5J#w H\Sӎ9`-p973(URRTηB,-M_mJ5B\j-Т:oրiQMFE$E vcؾLX%xتJlndt i:϶Y7!> .DžYzQm\6y9  귱Ȅr ?|¢DDܠ}ŋ $EI"ڌ-6B|°% S6 !r`GbM.SHbLI(l;(!0{ZY` -G4.~DBr1܂GE ,\JHڣr}&)2l\>I?dVJ214 OΔ6'zyG:w?B>=Go~0 %GE,U4&j&)"NeX?sʞC7jq}Ж#P+VdFT'2НE#jGsʬЮ+;$t D q"/o.3g0UaLyzmerxY/zf =Uwc׸ fo&5,LtmkZq@3^N/ǝo)Y Y)Bwl+7Qr\Zgol=<|~Thtc p\ϗ~qpBQ4-DF{MzQƫvu›)PL c-?A0@(6gQ Gq[oFq̮dWAfkS\yaZǷ+Ele<Z%/|y:y {{Kű݂FYpU>rm^|,E3 {{1GYa f.W3@-|}tgcN}m;2XZpBXf5|3"oj>CS_SDF[:\Ei_dlwʿR+zk=Umﴬ61חl[vtBo ^X9_;w;k\`ž ily࿡(Ϳ|Giiu^6#f `>ЖnF*'Ώ/PdSg0(]'Ա֮6${S"c]@)];%I$ J?M% 5Kuy:o {g*M>$qCF ysoff.|aI֔S gTw6j;pz%Xzt2ǛVxĐВ`!nScTԸUBzF*2@Jڕʲ8Ӓ)3#y |[MokS!кR-؏˪r\Y8#~J#Q83M%f ,5`/^1&Mе/QđJ!*zcVn{> R\Z4x=4/C?Q>p`K銅ԍуA]Fg4NFsfhv"g|7AiQYz+č<0 t>I-ڃ:~``ʃ ŜPڀQ et xf$\lZ 'u8߃mҨxп~>ȓey h:RZ*/E1MJPJ*"NFX|i:b'jwV]|[awؗ'ȱ5n*MFm'+<L]@P֩l$9::6 ƪ8_\~:~U?R56g 3UB͠˴^b%c z[? CZVpj` 9b"'Z)4˶uٍEtUsW >:*?bffͨDgkv]zYH$E˴|>ON@k_eɏ?,,VBL0b +RTPxy p?/^Ё]s5mI'WWSHVHFТ8ѓ5/"|qURLӽ+`-Rb`ΑS[&F߉diaF:f95]wr0*Phϥ;PasoG۠q@Ҩ0aH99dK g -Ŵ-Hɣ߀zrɚ[OxeL끔cta%2AD%uԼy H*Z61Uɖ6"⨂{O.kP KDts1zbxGV6 ǯof V,{R񇱶} PM\!cV;4dڀJ)tFkˊuHLA2PH͢]}x F#w x 5iy1x>]]M^ڞ?|s%Wrm$]0!-C2aTo+@v+0U:GxFUXg,_Yu(fjH3O\ل#pz#1s^Cℱ"Ԅ:p2r@~,.)mM|R>(z<7= 6GZ R󭝫qV R`)c2J {ȣ bK:5".-IessVCO.@ :j2tDoJC.tbz{p7vuBLv^&4fHQ:"J9~.~.TI /]󕬒(NsfzPX1 =~ot̾OH?bDyX "\4FzQӆeu!@qP?D [v@&um=4=)ccsbu;Sl`KLJ(<{B4ih%s땑i9s|3٦][Yi쌈%qC1Z{Gb׫9=DP{X ˣ4ѺgӴ3PZ|=h^jqxDmۆAvR +;pc*>S̥ՎO/*1edKAESo sib6n)X+7N >UO,4bj$uA`r^7R=֫ˇcEeJ)jCVNG.z@*;1a2-> ,b,z?n`>oxd*1_^;Qap L$-xS6Av MٛLK']汮hMbdvG,cjrXۖ ޤn٩/DI!Z rb E@9'{>NSQ#;ݱrܟga1Qm%4#=D'"t/S,b`h e*4ڇ͓ЍBԓmM犾/k8@w}Cm}P, Lr\L1+w}sM0̚uȍqZ =8ųH$?ɼcK]Χ{g?A=0RdS. XP&8ڙSc^SqKN߿*Dx \=xP=읢`q|C~ucxaex NtRW*VskNNڤk(Boq@NV1`>*E@VG1ysBOⶆLv Q7rVkhz0}FG?+""YQxOUyp0+] R*SϦҔ7dwsS1'j3\TERje|󁖌IޞȉhhrYT!nN/RU]ߛrGܰM|=ͣB)GxSFSc?T#U>Qެq"))1ݛ^ͷVK_>p3,!fA O:8XE$B,9o T 6(R⇀3S%vӑKIXmKkƭε=䊽tpVYɣگއ5(j2jBxw7iÈK[c߷ ^¿+)2gfjc?Bib,V\3Vm@Pu/v:* q _מ\_0 "a f޳%a@tL@5_D7\3ž0tUt=|zqvɼDUǠTP:irfWwM H2 Vψ/%x85VZ (-H x5T1Vn>~ ȴGZ3`KDl6 ^v$)M4EئǙnstakn_-Yp`γCޕ _ Jۛ}~hC}\Gn7|oؘDO+C-b- Tq/<;U $vi9Cy̟UBjͳ pp{M_ ɠiKImvl 3>w!WF p'Q&8Ulg\WF 94gTcwMNb=uyd5 R-r lLH:X;sD-$D˽(P9XqMz,W17Ej딹OK?gOS1_C\@N-I]vfkN vYr?3LՃϺ"0L|\5=j¬Tcw^@de,e%FY-n̒x1gZvcxB1ޑYQ f OlArFU(B[$QβPEʻnH0qey]TLv=i6kqOF>gs(sL]Es2~K7!6 bnGVFߊN\e,_F~oAz3UYO{JΙ&|aH=/nTI( ωd9Q7јb7+vAX{֦c^]qMpAeRS3O^ҹ/gܗv)*G `n9x͘cMam'D6^DviFti%7Ÿ&Gԧ?^~abhQ,It[GfĆK r!d=Q=LkT+/L*bAZ&$J룴=5Ufҁc._lg֨{ieG v=*43=2otdtE7#.xc@Οĺ'93m?yeKӔw"FrM7E3?jG=Z4]$S^CuB/s0AxP%:g !_)&E\[(RjЊp֔#$v4 l2oW)`JE76Jq0S+6 ȹkٲRv1O#ڻإIm!`ÒGEs[coa4[t^(gsN\fB'8}Iލ7N_7؁TsZ6fD[X21P[fYoD<1*k$Tp9ԄQ0~Jg-tWdSHK{oa@z[&K%(:kOSd P5:]?yKZ/ weHTczL'3J 5ɐh͋ENЁ̱|^q_o*:W'0sc/brk~t 2'PdtR"ʲc,@(>Iu[] _ 9.f8x.k]6 ]KHRGJfU{ H.np+xy<[osJ2֒oxInVZ; 􎒸F 9Q=:Ah$^s?o(KUʁ#ٴ̷?Ö6EL"rz:G2#VU(B|ֽHP 4 ,XFR}6,߀X.So$d*y_p!TCZ9{FALɻ a!R9i(At|sjpX8Ix׋qU ~ΊTA|%Ϡ4Q1NJFPj ӽG#%i2Kj$Xadz 3D¤ʸ*1TŶ 0 KҰ wk$Lp[!"Q4N*@3!/OEb4+k\tӚ~蟴brCI`a~J/PBh%W6l*ǯ<=[Za.|IOW|$-ɆUxNH i^ T.]JtYb~7W ]l~ %.,X H ҭ]b?=$"%c>W3 vM:1{;Mƻ#tL,@W| p*aZ[ӓ zöM˶&2`ҙW(P1_J݃۽cϭ [d[T`v/낞'XNEnuXny(gk`衔V]?A.cɦ}|t9-/:\UtW֙umN%Ph0`mh.yf Wm[V S!,RlO\JTʺ^1{jI֞Q4{Eg)a\ k0M-MƱr,\Ƅ+o(- .Y{xO6pWq,hNQxuS6٢C`M6qdͿ@d TFvg~rGP^;A>4"Eeș~HC*ߓ\p6#9]һ3DZ=Ie 寇L=;^$߄z_4ȃ |C{m]竬mw=!/M :kWa?4dpruԒ iy=uI8UL[g%фj?D ˦H!>hwӔBF^^75 .<-^֊X*4C~H)d<6u%JJmKa5|uudQ9.(V3XC8_x3$8qB0qlcP`B-_d2Z?>H"%cg;N)M%V4b1Gqa ELx![D%;֭|HHiz?9,Ƃаs:^@õE.hQ=~knC%AVۦIrSn(p'MeADlxRKlmb|퉜ѷ .(fgP*<3"3$Qj(N(%#Tg A"QOל~_{LA}ufXFXvHvIvTA4PB |A.L{w ԔXiT sL!{6TvJq+@s#B^f dRQ[mVe 5/[nq <ƫZXi Ѝj@ 3'EP.iuFc貇I~{UjjQ8αε,6η Ou%58iId'ioЃ hlp>/纁:vȭ~qEڬ=MnGj;р.^ZфZ Ny .=D_]5HYa6$ @PvuV6تd؜A bEQm;2t6G2v i>gDJ-V4,}r9V^.1p>7 aP-AO_{XQ'Y$iV_5'7}au 1?Ƣ./HRG]lZJY$a/s(uu`Y.}AR Hg~ri[k.-BxB0CUCs_5R(q!Yq5nKU{-Tbpe"_`CcW/%_ q%UƙWW@:UiX_ _T8RTcOyʣBll؟BX ˓Cv×B@A{&9~4Pɡڶ&ep[>`Q%k}S?>z2RQ~X`.;>38*(Em~݂-!h[90#cjS 9df{<4% !Ct䘄zXqeJO + kѢHm%_>݄ĀjEM_Y !F#5cܓODM߷b$-VgQ8Nb%n^&S^;Y"D91R4YbL3(Ĭ<ذdj~1UldA4]f]2mecl5r6<1@$WRx|(3aufw/T| !bGFbx坃'ֈ'kW s2یC; m4fBi'ic[:tD*|7Yd벯,x:};"'c_enPzi]Jf GR41zZ n^H 9f?"R'x~whӫjMeu[h~N -=: O!Ĵygr".ؽFT|C%Fگ#@eC=30,[Ϡ |tc(`~5J >#wWHoLJXҥFӤͱ5ib-~N+xcP|;53%6<~/xͦ; JǦ~jϦ&4ߎ;d#pr^) $q1\_p恂#rPq/ M_˲,5d |Px%KtnX|zh`pBe"hC$?]-[GI.~M_X:4r\t(l5V0WS.N" Н;_9Bp;+AGR6pn2s\:͉Čp xє[OTsQ_(@?k c%͐0G'2xDI+0pTXŕg~JUrt_&3@`=rz&a">rݽvғø|}@JFL_195Ƌ+E? &]<6 ;_/$V5iGƖ>pj_)y:$KyG7H5l55bmٸʓvt <*'j>oеϒ—O?B2!`#ݯfw.x^ K64h{A :;a`-,Q&vƬܧ($X~BJ} $mŎڒ*#x1uلFScNxԧWgB^lr ?e OH,yi)>`c hB3C/8zWе~lwM}*ZƏz*f-ؑe[lP`gF>x0]Wh %up~ +x ů# l.BAni''Q(vbAgVs/3z4Z#ES`b4%?RMU8t`x.au9\#i `QJ<Ċ65a9^ot*7 jpEK!M2K}j}-x* 7ZHpwUeݑ#巟>1'r xv;3w)p%ώWrNwe NW<Ư~gw{2RMEhv.@]}@&`X& $8/iT4;38"#G۰zQ8vŰw4z#z ա÷Ώ pfDOn@v,LZK$~G*3wS5vr ߒ[/H󡎓RkϾ+:/FS`j蚽w )ܻE8ݮ- q c%#7/xisRml/4n +]O*t; ERF8!6jۏrZU\W(Ѱcčad=ŐsTC@Ǘp{y@'7qMY+{IZٷ*j<p3E;(^1:K!#I0EʏVRP-H[w"6T;ڟOŏwͅF#8bOTmi:gzò,iIҶn6ǫUKq vԡ_~m+_;]C qRt/Xgf?c:W#@2rBqɆnL5ڗfUϐ25մi@":"鷧VKM献J|$tZF2&\8 橀Ml06BOU|SӬ7EFXѢg4O*3DZ4}Vgv7C)fc dG܅%p?](٥D@ZsdT?rV"I{sK MBآP#r)A5 *-{xxi&}Γ G@s7>4Gl8fCiU[Ç˯aJ(HxӮsۦkyP!;1L<%|?[XrN W(wЯyJoL Rg`a g\ XXҀ,-[4;#6aEAxKS8TXtBu՛2dZbND{Z@`ͣ.LGBȠ5ܹ5&d3(Ek&JҘHSV M J h.|UBQ <(ZmL"%N<4Vza=Wj@^:kjnZR+hyy@{v0MsN{ZE&i՝׋~P ¬݄e+lC&vН a9I5M1?VL[м55v}^縏}BrgYC)ḡ|JLU'0Egd,Vh;%H"el&I5SSsAos{;MbA*xO Y[V5^X1ws3>"6,& $Z`ÃcWW_B+c!3>\f9'A.47A on°ⱖCS]Ȟp݆-NЅ@]˙I a~N+c7LIe+OF@Bײad2ɣo(# 2b3k+,+UB--6a>N0aqw-Ia]uDk^G.c'9'Iq"梵N0}8dFAoHhF#^g[Z$üN].ݕYUcQJmOY)'O\9ѯDcn"ƒR* X}n/[`pIu7VC|n^dNLk[9`EĭH%8ϱjb:8]kR\:zr`- F``,$5aaSL]IмzjU-ۅ6 @ Dz' p@;v36OSNa8G!sYd?di!R3# !:Hm$[лҼ،,/ 0~x o2" Lx6JʂCoi*wAhS%J5UP"FsvƄjWi?5,` -'Y&!eF\* D{teP&?r)@$Uͭʙt~h(Y'";U4q :~Zw_љaO@};HR'46sлUakF-;G"D ;!'MiѼYg# -fK~v{Ԁmfx:n (i,EU> 9H 3p<~}Etm'g~fFN)]/Xh?1" jH:wn}h$C`=2I#Z|]DJ:ˮ,5WC(C`(y~Bm<}RD _Bp?qaq8|XOK%X>mNE-?XnB J51+ަ ;A~S Ė؜ ڬmπ EQ7r72^(ph 1m''*郎5,ŭ#%_㉐8;ln*ZFsBJ I;vTʗ&sH(FS`L Hg]{tz2ZI6IPX,(ᕇ$(dDJit80Tmͧ&>hB5nzaMwGpӹr! +d4jpn4-N,tq v\U)(-S}]Qٝ%8)xWa9L@>. K/ah۪[C 6O> i:I,)/:Ta 䅄$_]c.I@P*|HiP`JE3s9e>!+ܟ#6֜ö!Bdv wr,rr$\Χ744ΫpBr1t ?\77RrnH Q. hфɺic1~KcF[ǤW!:+J%e @q0H74jɡh:Og hQ}=E7:kE)39iLG%x=z.bZXAeNrNEwDϴ 7KTV/aU KfH֣L7f"-r-Hy4mjfxc]q#[?lH)Xs?`P8VN4Nכ]$CEV0>gPa-:0?GhE}¨C1 \ ' :PJ \wbW}pI WK([*Rgh۞~dghpkꝋ3Yҡ'6n ɕQLC$:A{Þ7O)95p%wy:;ˋ]pĝ9r`-ྐ}R.mjJv5 z:L|^psǪ]o)3p~OpG摠/kKSiCp7~U[3/g$wh͢BGHy$ b椮~04wٿQ6gt@ɹ`'uN\_k~dc a1J?IrNPuj5W$ EaHiD-e2/@Wъ9O\=D2X V▭frlOvBI%`ъ REV}lg-.iwr O_{OZ+aGț)͠f0 F# h{8 ҘUelh4xBl+IzQY[3`ܾ "nQ15:12^b=xjqQ,6tt^fI(~ \J=9`p Qg6GߞT؄hiuT4󋮿>q''u6e,ym>߿/)3z2aG,궛aF"ȲWز3 ˤŞpR:YP4]'&Z toQ1>]cr160EòVOK5 K`:O=+ȟZDr&h6k @6DjҸ*NtKUO/6`/\6(9sU' Iig㗵]'e(%{,jl-cZC~x\32c᪔p $qTIeg5dLڈ{h{(`G*͏2a2>&|4-一8:W DBuJ%r,N8cbNHfa&c; t:_,ӑn2Z3C(C6Ia ofrG-9&5 5"؀7ISazzOPb䞄Uv@bLvb;_{bDYnRZ#̇갛iѧkτEj}${G_,rGlJt`Kp7sp_iRVΒMhkxzwb_/,$Q( #USqO76=F3OY8TiZo1,!ť4ž%sMoWm]g %AD:9#k2b^oLjo,#]uM":`#‘԰DV"kMH-UZod>N`0RMJ*iCIŧ))U$E ] EP8.) 7MD7)Z_̆הJT|MhadW`E'}lyX858廎لƝ~5lQѶݽ&Dpk+Em*~T M‡m)}LuPl==y9>Y:7<ꈘӢoMQif%0Aފ9*;nĖ%[䎾1<̡:P&{ !>GZPz,^v%ce&PZm6[kvGƲGw u=6@"M_] hC%@j&Ĭ%dHX¹Re_5=-vo'ߓ3z\qf_|+A@/3|2tB CcN:NMLݻF1fW~tأF-vmue2si\%L`N C%H<ĴN.Yh\=~11 X(k!/1@|8E:7W")pr@JNL! 5W1V+1K`֔# %$DqÈ~}"4 )V?7 ӡfZJc:"}G#a[圄/鶴Ki&=9(5ЖpMN g/]Yo D>#oPӾ]xB b&G km*N;X#S;$ 0䛣6v kqu]u4DP s{gVLHί{a_}*9OՄԦ]n ;T4b4՗)fsاq0JE^B4450xkŜAE;Z]pLtʹл~G"JkaVa~ӨbiDqR2 g8{ 272'R|8L0]˙O9/ >Oajn\Ouut |f&ϸE~ː#°޶YPֲBj$OV[n_^ 2mWL5Y TANqװVey_sў2u grej>hG9*$&V 2̶. ve3(NG5|L%u&pAF \ܞIYWiۥGwefбIr* `h봲w D>#,g3oj{[4L/2iCN!6릔of mmwM!PC|ހw^IÔIh:~U[i'h` }x$NI re.mu쵟o Ћ[)J\>s.h !kNل mԲԟ51uhMf(Q$0hK$h ߼sh ~oE" il#nxGy :PS&kY>X_jeP ėoSirA[(M9Da[CH/iq@P POO`-Tz1u dTB1GWb**B{VHh욯@3iڝ=)eK8F1.E,Ȕ={6z#܄):PwuQ ͬmܡX1O E߹չE'j`VDT0hi.OoqnI?QW/u்7al@%83XU F WŜ<L;4旪Gp4m9̖˰ug0G @j,;=oE{tߩ T)6AL( $u .&78 ReU}%0_u{uè?Ia~Ws,?C`*fLk_~Tʁan:S{&MK4$@p6 R&VƐwx= \S0N^t)/8tZT! 0>v6pC"Yez'Tvdb6w<1M>2ɓDi{>8 L]T)坳 )b՟ ?otIsQz/fcI֝{,8Ҥ 0f҉h=3|ATOI .Rߌ皲Um^#]CQа;h7C6e@(e&ۡE*`a*1i&|gO20 oTza5m(ڙΌ7v7)m6_bп W#^ i=VNeՒdZo Ԛ}#WC`>]B׽xF/NsvIrmUIHI@">p0H|mU3},,fD|wg۰Xm=>Tr6w3uCr\*h1 Z<)_Vq&HS7|'4|&S6Q 6i^I􀄈WFb(>~r hEI!V:Ub !*r5WAOD3*bqATgMȽbKzO7<ޘ2 tuBhtKjQUڋ{V6ǵ]\@H:BE)N\\MM(&$ps;iңc >BqX ﶃI4B`vߎ-O.1MY Dz#2scځC=B}n!XVyoFc>ݬ&]䪘%͸{5l`b&@hN31zm _T,д|@8l_7,#W[K KC䈶,6wCrp*a(˥pMJj1LisE YrEǢd]\ S#= bCB1%_ڐNb3 ^O¿0/pӦ/#>]aXQ2:hٔrh;9]aH9BAFҜ$tAy5EXo|u#.'#F \"[|z<;R+CH v ,t5 /~RsHDoѶa? "P+*kU qĦjzOTE3dYrm&oD o%~$ž'/4ڭVX _߿K e'ڑ:4h+ާ čy)zUE S،p0L$Sty9BBl'RPJG1ldVSg(΋6cL&ˇB"aNTq=PA eK)ܺS$e=i .Q݂ -c X:(˼*ȭl='8}?g񚑛P<|KY>eJ}{pTcw'h[fE_!9 fF#Ū@@3zKfD[4t/?@Ka3Us FT#}.~S :z8TǙZF.?kU VR. -9?reNccTNyG$o_ B>(t$Dlh|"愝yvZQeVAb$r|5^´7 _9gdi&hPy?z=|ed}i!rate#ҭ8_ l;'Xlgwu\ !shs60)ݾH{>ә3'+r" r m%ӭr50q{he!\<:Xo}$` $=\1smdkLZ,-s|-wލeP8 @2< O6#Z?=>d||űZGSWĩiw#aT,@lѿTO9/H8Ȳ&XLY[-aPp@fcLq@IvCӢuu)Nܢڹfؚ~_0T'LDKq2C~I^=SɓU:NWTTRcY mw{6a|`})wp_a!U myɳU wb;'v?6IZ\gu=?s`W8w"[o^SFN"`8_zKS'3ӐǙEgOdW+ vS箾:P5}lbQe)7uW9]&X-<6CSg|tsG*vǿ~Q C ǁBd3b?\s-&Ժ$bGRbUyq5;݁0voޞ^O7+j}G $)z=H)zc[5 { 9T 4QPfD"ZnR >MKomȗo}q5iWB`Bs'&+vs6*hތύ`{{[.1d=:#L2?'r6ٶ+BM,=E ޞ0-S-NwUCٗ4 p@)&$m3酘;.OrHA\4<Jwq)=L &DĆjm+[)(d7LWǥQq⃱k7(4d6DYӑP5”gr3.,P@^>7>YpʌҠ(xD7êq},6~8F|W*|߯G'lg`V%fnb3_›2}K_f7Q,};=]eʰ y#?16LUh\!|Qɥ7%fA^eǤf} H`*m1D!@T因e@IYAن!aOcNnhzyY5HVQPf|n#7mÀ1;IvZ JV-Eui yڥV탺Ehn *9yt SA(?]Jd8!z6fLV26۔|-vYy>s߯cwK x ZxRqu^ӄ6ߕXFO!{)~K?%dmW,o7};gs瓥tHQG,*1_X(¨q-$ߓQ-en dk%|Vo!"^lkJOEq^v{ 4R n\C ] .E"x k()^cI_,UHl14lMO#ˠAەi30%/F1$L@]3F%z(q6c<+LBXG4+~}panr Prp*\f.cc0q G{4<>W3OoAgU(\?^`*̍2 U5ha@/w}KgALbfL,S>H&{g,DvY RW`;/g2Pl 0YTpM~=ithJ#KPߏT~0E~kH,KBmK4}ͨE%AdOp.$Q? 5굿dsNW>ڸP/(׫tX7K9_kY~r'.5܉EVbԙj!([v3g^Exs2o8Edw}2%`hm4,P(u~74n-`8VWmfiW_q܂#? lΨfν 5jbÔؼ5ѧJ!԰&V<}1P;t}!ʛhRGIb(%U&j,o$x>߅h aY T' H wճY{;mZ(͔j5q;ve]ZEo^?Zd} /)bqHNZ(/yj=#3@ƣX3as31/1A`eǜ@厏2Fec*XЫJ-Y1BhwG)N>O9"?)c|]k(%i܌%8cc`Ên[K $`ѿJb~77QcHcd|g-1iQ_g9}cO]n#ԉ~A+lIFi eQ&c܃dt1t ך Qi$,mun5MF]0M(䰢%z˶N3ԂzbDL`'- ;4aW}X+䫌'y0[o8^B=;3o>:AD(.9e'rռeE3y(搾;.D2? x+:9p:g zU;` 3'8rce" 2SHDU+b|qE {ΛۋBopy+lKdH5o"7dаL`j{Yt[xF]tm|{2IXUOWK{ٛQ=\GCG:(̈́U. .B_Kd(LZ.s^&kru?o3CGXb0q[5ǤM#تx*)T*+X:A^'A8c-\pǻ= 5mAhؓsɮOX~>z^I{f,'ag1}bi sr(+s,&4HE{eӵ5AJR!PpqFةgRi'q~#qM+Db@mH~{Z>NRE!.BU+f qѬL|=\.0sŜuWMwtRИx:i̿l zǁns8#7Tv2S6YBZYLo[OXXm`GX|FOPL +:O@IivvMñQj.T_xvVm,_:Ӂ, Dl5QGE+N__oxy\n#sp-zH3ƣvBJ}.&B-E wQB eQ lmT^Mu\ a*}V@Q֡b=، .4ZJOK6zoQugBhw)pLzڄ^:K쇱etPnLd*|ˌ\ AöEץ dn>"x ݿIeReTN5ʼn&"~bth4w V5[lUWډ 1Xx|řkjJ"fdS$ GǤB+k4w~.Lj(3-gkFFb %nI2|*N<O`љ!^rrslpT 1fk3ZR4c"P)>d[NtQ$@K%I.K# }kԘ~o$&{HCm]ֵ@V$gkq3.7B]W#S|a C$Eq"іtUŽQp'.ڬ{O7C6IJ8'CjtuRnM2zCLxZKV]Zd'WrP0N"C|zZ#q98ZSa4K]3&cd`җi9]xH@i8p:?m옻JU:#5Yñsإ1ʟB$%3}= DuRLl5]ˤzT+R1C{ jT!aq9^RO޷Dx!vV+$ˮK1þJy ~(ѣ='MʹV_0CP0 Wl9o@R)ɨSbe4*ɱev ] =᭜ߒ9$ 0toV/_h-@oWC!~)i=(Ͼ,o:=HO`͇ |> ߟa!ʽ|cFBP!Q߃GenЌyIw>@8֋)Q^(ჲ͵J =.ciI5EyL ['F Ezc>NĪ>knJt/@ 2=<$"H.(PV-vRʇ[Tnp8+!9vpYwR5*ʋ\0%[{ty66{Y- %ʿƉۈ 1{=6hh`"^v * 8y3grl^bK;5_BG6'O{8>c)o3<&5@ D c9?jO8.H 2sW6i,\L\M[bO4Isdb뵅Iw)!CϗvAN4dS}P|h&P,yk:?mVaL8+]/B<'CS}t%C\TC Wn64(e j'kLMoOA2YE!6>in6 5ё JF՛zF=Џ?ƕڱ $HWrݣ}gS V K50Fem'io>7&QP ?Sa(f`!~wri'ƛ${s$S}ͨv/]w&}5 1r]wsUWL*֟B8|:6^[7Z"Ki]2&'N4N\yq~Nvpl'a.Oȵŭ f&LN4 yc((UfQޥ! 7Ufd`S-/Ŝdg GBpyA^!DSݾҌ)c7:眰4}E[;QLU4|WҀu-ekߨkآω'An'ڶS3XD±ER)m u/!:D ^#mRҏ4L%z'UC! 2Yl%-nL0,#PղD1WDvewwv\vgn2.ǃ78 X^ moOǙ]\au&P}nsѷwTOX*_:r#~#J &9hZjH'QDMTpPΌItȿs@3$  $)>BhX1'xeOyyΨtC1uP4$[+&YHzv١UV9h#a!d& /]hXu0w e.X,q#R^KL=T9!֎Ow?qEBIP2NL\Jc\.FW\qǸ3z[pm5J(|$7>K&K@q29ЄzƬMl&Feظ 1)\HUE=,i"⻹Mb+gQυ'Mn0Gd1qPO(R)}qٟ |D:J4=[gq8vHKD0O r &uXAQ-gP`Po2FܩlzdwaطFXP-?|^ X\K}}? v`ll( Nޫe/]lwH7 {z4[l-1%ĭW˧ֺk+>.k+D@aIr?7*blA|__^ s79ѨRۡ-}Pm N.n 8qŃ߸k*BD]a4[1`; ! ЖQ%SsYuoX~XQvs~0 v%c'yiV[&/ܷp}g"nW,.zI@% !PR!h0,.Mɉω3\PH`2ES؉ ^;:~ ,B:VkaF2Wo-Qavvba[TI=- r,۠ hc,R+SQЈFp4&F&"P7C7xPuٓ6nYGzS5myB\Uozr{5p|hdO9>0QpJPEq*ݠJYpy7Rn~#0e:-X_+ -0bvb'̪I_@JhUaǷJ*`Kv+ Ew/4˱KS,fBvx2mXIj ARpڎ;Z$ h88:6HC{e[iC>S[X%($xȯ5ʙrNWD-'3\!:{-g4@c'0P$ZJQz5:Gð&q̫ɫ\&4sݠ_ra_Twx`{fwwnp}#B\-ucu9 ǁ]R51\6;Ch5SXg-)w۶_3Љ׆ m21bn(V}0w:HQ׎kW<Ƈ^d,&'&Pn{kRTU1k"E#SiQh>>b5ZG h(;9l4jchX)낚:PuDthݚJDM&;a3fk$#B8*"cF\!B ԃ)F бd̅?|h]GLQZQˈBm*xpvӄp69%@Đ~T6/Į.=Sw)3zƾ*W(t\2.ҩ8(͘l1㻷l]uPeIE7Ŋ!jxSo"c!t ExyO'\ܽ_1N| -"4yy(10`D =H< _[gB6 p%5*T9}1IU\+:0}vOjOF%:uO %M_ (D}VC(XǾ)ZkL?r2Xˤ]M(; jjk}a6f9 `ťꓡXD "L9MQ)BzFTGV $i 2a "Yez=Bcڸ^ܨ]O6LC^xwORNMm XT[m!< elj[707JtoyT?ڨw.K:BK?lyCr f{27߂Bca%fC=/.0-ŝrtw|e-+|\||Y"#yTt,s)5tj"u~^ZחS@h0l1Z{h񩹺]5x6gӈ_ai b"ID͵uknC6fQ)qT ~pkNjJ <-?Â_mxթdro7IQ6 K%65gFr]RFʉ>)lbP7+o #$©, ~bऌw1N?n:jr/h?¿r |GFfVbȥ74C˝(Wn+=Z!=Q$}pQۤg!OkvO3v^@F&kh-PsvyWp3,{ ՗:@6sZ{H߬щ0tVM4!0;'#CjIс"/;X[4@#o6"}kԔT{Әiۨq ֧5=s$ѧH-e0;z@ĥ4Jw2 ziaSRPZT!aL @œy"gV~ #+#:i.>giپ ~jB aJw-xSDqp1)0DȹV7wAJvZ=o;P`@'7FGvwnP?uŎt vݏIĄNQ;QWEme~\ge~VG<}R`d}붰:Pgбc̄5k yLΜ0=^{~V1 6j?g2T%Ǿq& 0S:/rUh~Bʺ~MgM[]t95IQ&~nj} s|ZetȲ,Q\-'J?Io2dϔiH`   fif_'.)NlT)cGN`0*qiG=(P])cDՏaV13;Nu$H)?7 :`fv ś+F_!K`*'P[8خgEy~q0s@CŦ›$1kC&JyQL.~b,mdN,%'bCԋd&OnB˲aS*;JLpk_T?n yBfsDu=W'[!NtG I農}⾪_ <bZX1H߷*g6ۧl`4rӘRLaEܫ) sz9NZ[pbP3:F0f;z|rq{)[wGnMYW#rg֋\ aiBo H zmȠO\ N0 }Jۼo,o"U}bɀ4o"I@* 3v7@4b.SuIb쮑H`*>׭puv-D?`ANuO-#EY "q9h3C*lǷ\| X(+KTk+ad WwRѠYC rG {Ņ6)96!o0lVUk.NX_˜ӱ̩5I3i"!xs7IAjlqq!(F??/|H¾sUڳH\CĴk=&?@Xȁ  ^ gija$L 0dHMF裐[+~n1YeҍKАd(lZoJH\ta!slp:R-$C%ё nIORDMă}W}FwNjgKm97L+N.P=#|tk}0Ғ,;loUk;Iޝ{lh\r) QZ> y?m8]/j^gPHl *`!RRhrM2oT-Y`v%+p=W)1ooͥĝZsLJ唘)m8 ( Xjط+:I6πE2˽4:{G#CX$ U=l~Hp QX*LO[e3k+ U_Wr;p5͂O~ze]I_.]9Sa2>SRph]JqvV&a#86?j JKdgA̲ ^vW zCx{-qMxd7њ˸K=A9duʩt q/;<|M4 !YD`(guky;GҊeP{UwDP^,IUHy{5I h~n*KpyT k3W 8!w =?|vq] įݛ"&j0bO*+ȡɖ0n62M+IXE) d!oy_UiQgTZņ)jzӪn |{'153p@.yBL~T"z9+ %3"): ʇTi _+˔t7]9#Uwc}%lN_ ˗z_2@`rV/|YX]ɸKMQ hh[=㔷"S EP\iZ):|M&r_mr~h$ص*Dʓb85oYҌѺ~Wm!gIu1q3B& 5L;DJ@A>ĺFO|U& BPEewwd(7&Fs}.vBfY@~!Kp&Wʟu>~H@v' B±6!%-'H8>|ȧ+}跷c0 7[pUS*D8H@w .EA|=^CVԭ:@ x!!(lH^1w~F2(J/ X:N\,?j89u"!:{Yx]hV<7Qfb׏$P&C)'cy>%K)i|_wte212d{>= V 4Re:վ8 +)L `N bۚ)#g~P^4@HLMyVA҆*_Qln Crٔf]XN/\u#~ !bx! '!N`C<|4V09Ouۣme]M |[xs:sܡCfsN.d^ {/;rT.q[wB` G3{ia?Yld%lo|dj"{D Y\AN/JLlYtĔ200foӏ`}Ek55̦K0ζDWHXRۆ$4MUi67,D"pHzW}}1W2g` |RIi$z\R|D 07P͓$٭B +u_#1n/atRy޸;s!K($qR+Ȏ2v4kFԫt~O3#AV/'*Z*А;1DN5@Qz'm3:.~_/pJ5ԫW{oݵ[U,5f[8=\cN^J3I|RXOۍPWc )GJX W<(q@oAIݡ m|@eS.4IQ m ݩ@ָ݅(}p֛ޓq=EqΜ9M>)$Jn_*;BoR_Yl:c63>ljFUо<6EAL$t< Rqe1e£A+ IzsL. RIX,T $ަY .PGc")ٿn|l-#,LyQhZ',LX~OA+ҁC`<ݭ5s iu_bzG$, ynBAͮGzm۳8MP?`|=u~Puo|^pVXz[z_^bD.z҉Ԑ/v=_#Gbq,zPBqT$.(tlGL7‡/"Zȑ#j 1 Ty@]%d@sdA]NCjHXCj?[Lt\{% &2|0TA:$ǵBbؒd⳾HU櫅[k,e7WuuIYp/}4@OW8.2C{,@[ǘ2ŤĐb24ɲ J Q_' Ai#w`bFt1i7i8 UQ+N]|lnZʆ!<.F2avd]6xIܻ߰|z5422hDR]l;\cQnH_juUǾBDBºcfnOC?Ȏdmi;SԚ% $=oanRw@M3\e'I`)EowVR0X(ji%*n ldv*3| L[2':FC!BsFq"'ѽ3iⳳU0!ۋcKϔ[+GST7lgM oiUroL9-@Ҡ_% 䈔mH [S%;#CՂϰ*a;K_u"uFޟuB{RJ ړI/j0f%DZ}v04+w lP ޜ/кr փmMg2srp ԟHuxZaf_F.*0hk,~u?LLR@>ZB_+'oGPQWa~2CCԝz$$!Q169s2qHmaOme lZjhچ3 7Uer8e a@1Su3K}l*43|B4hvnȽ,M9IVΔ¨I;s `04\E6n緰۠gV4Ӧ/V+;s+6Nwm5L 77F>FCSƥos~K`[$Ŕ̐rrVg]#0!g}9y@[<7m İOP[{3k/\mw28Vm< 0NJiiui:J^.sfH@%!ƿL3)]De?,\8Uk%,բs m4I{Y.n:lx,Q/@1C{S-֢e HE:; w;`(0:mRAg>DaYKŐG(P5&O<ۄ B"rB}>Yg}DϠNkro3gp <}#=X|&w5~kF=Vi2svɌ\ %nX{3_hۋt̍vrV^w.)yU1tX;2v8V& :yJzg^( b-`OՀ*cWu>khi3<a<3Hn-K3 4:"t^Zo3_E1< 9YTg/aupӄ>i=D 'Diun}n8dGp_i#:*`1/CM:Nph܌MJ#݃5ulr5 c}2V2Rj 7ϲ <1k_n".ˀ#3Q NtDqHh.qKMljkf# i )MĉaPd +J 8k~NV?vACEN4ߊVB'5"Ͼk- 7<*;3# ` S ,Fw(ШJeP;i¯w-. (؅%lr>c#ǺjSlj0K^KvآE%n=~_̽;EBq?/${9iF8a'A^]ɇ\Uk(.'.yH5ټmv}g{9`ψRswgu'מڃ-0= <òbհpC +͐Wvg:Q QɄv8l+T6텧X$  4h cGU>"ͣOF<(ZC522Vc7^(l(C=;S%WrsdL&[#Rvq)KQy.@>d06S+MvD2 ?HѤWq!ay[} bqsYDD=xH8g͐&x$wmLg8TNiF+瞗>>C'ь..LEJ<KX/HEY8rDH597'|)?~ $1r:U^5UĦ&^F5TBb|Odm!E zq^ 18b;sb당eGeMFTc@7>IF“<xBp6r!U9X\@"{!P߱\"TLϯBLf&!׃9m]mf;4rVT?{L<*)m],۠s'TﲡhǞ.OuEDŽy tVIO:^OFz !џw҈^ќ-?7T.~Ĕ379bփR7!2b%&:3 '.;ȣ |ZY\e$-7N:&8d=Rirر:/ AyKQ+^81.:W\fKMzޯލx<Nzv pK58b;A31PimIԼ@ӄv',}雿j+ DE:XD`s6>5,bʄoѱ[۫p}ɢ!$KPH K15-vypy*@ .ءKʶ/ e|=Fw EϓQȁuk &tT57O%_PH 3 \ ZB0 3sb1 c,F Om4RmюDŽ$bϴ4Zd:_tКaμ.+Ȭz5#;([ZgeTVv'gl^q\)[ ^qDg7*ĪDOI䩠76CCn/JRa~nqP"҆bchDÜ ‡Nl\-+3ZT40mkdKKprGʾC7e h">s9#SWڸ?_=I7Dd2} +&yPaP$}d-5GaxQ&bzhU:7m)%5 b&f'.27dA 4W2~p: j)e\ &a&Xs"WoYWK[6JqS'Lf)y4ttb 8&Mw=CeՊyŷVC65^lCgPsQ{0>M:x$k&$[HrxACQ %έEEX!pP%\z$3== StW^N rlZ+ދ*ow;d ޳J'${yB. CbG:3D͕I fCb"T{g>`qQ w ]q=tlJ`t܆cfbޮkpA%R{!yKT| l5 In/'J4$;:Fv@g,y'Wu(H "Z>%l03WkXݖm&߯Lb;x%+Gg j41keWde|dYTߪ>].\|nBjF:1FJ=M3Y}.RH3NGs\kxFxUw,e9n7H;8ñ4K*Y#-_f}Y2-GfxA~af.QJ Q0IQQP<5LZVs4T\ C,u23OjQ!z@ u',CϚ/UE ?./,`AFږǫ*?/Ov Zn޲SPl.3o*C]yC&ibB+lIE,8{Z}O{C eydR 6@dNn4R²J;^Rԧ 01/u;ߗ~QkgaOTgrFQ"i³MSkcO]j6t:v7{W("ቝUXK-BVSI Laػ~Z˩u]MTτ=+tgSe ­5Np藓38JhKz+CZ0HûR~&$%6\QhjT(5,NT;|$sJ38c[ 9ϊ;VԞq/>\Zʕ=} d/!HA`DB)mJ)QcTeHh2?Qn`i"νaxE+JC ] ly8Y_лUIC<˥y?xtQ B!Y8t^*|mnL}Ytqsua(ӓ5TEZeTr zðU֛ 0?9 42QCDyPMLCeep\POr`wDlaT!J4j y8rU6`[ghJXuf_P4alziv1rI㚬Q+ž~hkY .kbѷ+xy1Φn[%l}scxK&ix,%j\%7rlW>R!6nHaǭ/a(MRQуvd1F$bώTxƿd@Dz4u|ELlq.@^8 {>WrxUjhG\4ZX-R0qYaЭ S{cneek!O]+a^RO@)IN '!'0eEs8)૆eGVH¶A3<J1[fӨ{1K1s&<5m^|c<^oUY[XRgC, }/)Gu]un_AϺC$gXəYN0ov-h!_^Ea Gi4ABL vbzwfwm ܻlc0EPc>Ɉ8(+қhlD3&8xcMEkL?@;Lۣ&O䛨dX!% `3PM_g:4HѩtE=VpYU)kqAP$Me@mOǵ(sWb9xhbrrV;!>@"w-9uoAt8ivT0p%Zc%\B2.fA{|?ϩq>3@B16Uq4u>qnS~f yޙJ8 zF4XQutzgYE-_x^R>ЉY TBz)\|}Tl8ɧQ2'&|አ!FC'KmT'?9Jt-C%f6uIέ->K-זܽ+)N*ʨ9j^F tÔ[uU KlP@8*]3"&dJ;*xhؾ9wF;7%j'.7y;kpeUR" M35~8gWEd&D!ӯiF'_c}٢r 9n ab:c9bc>β?FQ($fY> R6>}&B)WnkL!o1.Gz[020)>SLt9-d&$y@}|8lׂ <>6hIkVݼ&瞞g*m5P*EDSU"D__>ņ)Z5GDfޘѰ.$*=d?lM QNLCt*9p0CWm8o;'OL qnMuOC Q&IL˫;G!Zx}9se)}v8`En$6:2_*6ϮefCFņ(%~|颅X_~"`@ܻR6n#˳")7*{[p%ʬ:u*yò0dXQŚMxX j 4lနlUkڮ[8 "d&+E[ƦCN0%8FtaԸ1nEX;0xYe" ל^)a3F@,=o:4q'|)HGϗu`Snjj,=x%r֭AE̗yKzʶWP|[Iخ=لd]w8SJi&Ԙ; >=XHG`1Gꩬw%Ƞ-+γ~9m$&iZ7ʔ.5PF0[\-7>y~;]Y#` E "\&9C^,#2NA\.^"bÏ~Noc(*G ]|W"ؕؑ[W]7&7D"M)f= ` J4hG#61PIAU_2Yi}uMlEוS+XHqцWթ#|_:^!:p}{؁ҋ;qJ,Lz(R?nE,ҍUuZe>KzpϏೳF+v/IA< oq'ΡS]ehD.4E홀MWc,d/dfj'ֈ3id&2KsSaBk VD/V.! *cQBĞISh轜lwt-`>SKׁǩ9w\~6| _ՁN"jOr| IVНs`l9!,3VжM5KV=?i禲4"hs D,$Cm%r|ZcnB)]hABy6~@4VDv #cuɡy;& 6ݰWNZȐ;i jPwQ3$Ew2g(%gyeSٔt&Xeqͼa0Omr 3TP޼1Ry2RC33ZWO"`BZ>@~&i&f2@BOH]UG^4uX3KiðΔGņt!+#B$qy>&HuI&< kkA-@TkCA7r]{򠉏pt{e?'\bk=gZc8>1лC;:b}B/NRF@s1&>pa7WjA{o=MʛfӍosi_yopevR'g<8!ֈq![HhN6Βq/kgϞ*A[~"*ʖЎv2mx']!sWۯ BRZ0;-tGB\i_To҄(nFk/~KM\|i7C)};Xeŋ4ـN;%YqSPw@ T)s2?y/UL)Q >iiW. MK`u 6<@N/?. k[Lfp8 ܙ\.V?BN$L O$_^;lbS.K9Svb"C7Td!n9Tu+(I*,e[ymNPdoa(E˱ecPv%#q9!S ʠ:}|u 3 pQlHO=r:~vC|>FjnSz!eYהSV!B;  tzd; 2RY{ozzg DHʈtYR=tet} fB"(K_ 3-}y/YDsQU] #rPrzDTnnMyٷw]ts/@<ӝH 8.hYD/@d \@?azAXW1 KԬhQ7^D}9>5Z _}$w ]ye\!tnvr@nmn3+ʥˉJ% ٞk4+ Iiuϧ Zo)X =ˣV# (֔.ܗ͕D?`Ij=>J̳-nk*;L~l}Ұ}k=eb,26^BG0bB2 :nc |hpyEm=tF|VeAG(D lԮ^.! ,B7AKeTmk-p ,E\9FBlt_bO!O0^Y(JWGr҆BqZ e(qe7y&{zk"@h4&)ۨ8U SK"PLr"twp$ V05%1|@wG'\[>+={W$Wj Ao5u4%վy AnbH2Et9#4ckE,Yvڄ ,suћLYH,)ލՇ%SO =rRfA buM9,Q eF5R:;FΰjNݣv9-ePCVm5 \/^I8/},ߤ=ݭIf JO`Kw9y@SZ6}~,H8`v=!0/q-Aꎌ50Wksm bhws֮Z#Ld=o{iHM}7&~:X?%s[b1D\CLpbwuϢ\#dQM6wۍOC"OsдУT&MƉei?GB<;KwM!NC>~΋U)$Rxu-O˜CY;69.]ʝ[QC ѵQ`*P LB՛ R&D"ZSDu {b\FVk ß&,럿je`AWs񝂝׫wK~2a0+Fm xǕo vKX7+r Շ$|f{VQ?إdJXS6E_5QT*m &D+ٳ;/SU."YIDk52sJE‰u R(w-27LlDxM^$98QMP3(6+-*Rfф7,vj;#SЙ˷7,4X Otz5ŋmͺ^#hXc/ :5NB-:Sfsh ;Sm [+n ,oquZv K?[f~س%5`f6:#ߴ)Q8=~#cM"=5UayHj`CF}5h=*s&, /sLB}z7*l> 10r2m6ݞ8:ߦ_szbYhΉDpgV̳_Q0d@{$:iUY#6T}t5( z01-0ŸҰn`uc~E^DS.ѳI>nԳ3Kw um ?e/8:q-`F4V^~;>4MnnUtdL>aWQ׽x/$kkji`Qʍ^7BHVۏ~uhxmjR*T;aD5K܁G0Ӭ|0 A ˏeztn)DCU\,h ;n78FS|XʈpQa۝5IU mBK&FGo^ODR EcAFɇd@Ǧτ::1p!(P}`QEYe%G2UOpu]=HOFj58U0Qz'w w{T%.mF0d {Rk$'}(+Q̛-> n[ZP jI& ;(ɇ߈yGgg& `ﶧ ,Wt lI#A)nv9)a6JF}fRjNVf-$rגs2;Cbx.[-tz.B؞2_/Dd`_Uk¤73Ft\2gKpkHfS?̙)t>qsDG4k64 |OydNѺj "MNJ0Vڥlfbs,U<Ȥp{C'}BF&v/-؆^$B8ҋ]k =* "unrc%k+\U t30 4AYȂ4[7S?x}.CMuC#6G^[^US9i--dlyWY 9QњDb~MSvP*G-Ǡ"buKz-ZCKϔ#ha n;q+LwR@],ˍH"W&"/HIjUAqyEV$z.zЊ `/H8g>-=dwTP!-Ý.U<=vF$S?-j0gsIUwPC$n?e]}Goɲ4.Nڒߥ vv7fˎB6 xNa#>%؛ytO'qQ=\V+L+2:5=u/ݡAKS!N?@ uCۻ[IG^!߬Yn3hu)yUB& >LALu+=䶠QH^P7W;vpy8 ia@Ϲ]qt/V+}ӷ2{zƇпm1`P/^niZrwyῑr^E`~PA-QEΐn Ne wg ҥk{S_~0C.~ B0<@.S[ٷ- ʌ-0īF@&BVe7@SNj 5 1]8k鱲3@hyV]ロzUhHduv22U"/-My6UR4+0lOV\QK/mFlkN k̫q?Bǃ7t%$/?8a.1,Cm\BT@NRG#~E(P `EQ}24e`<৵IŵPYؘWɎkr xdٟ=:o;nK[̚H9KfP1xh?;bXbݭx eli-,ù){UY`޼'Eg.*K(:]Xs;%*^# >C|U]b"{ >q@Ph+A Y <\gg6kxdق_|f`4m>wkygbu#Jxz主uk`,{XjB@7.041d$7߶J*u=7q?5SR81 zh@Xθ0ʖ52ՌBv#.|6)éqoŚDbQ/qA_U $:C듡 9yʕ8׿:Li86"mާY8bk`"e6q'tSh肟 gv;: }Sn oQ*l7eMnW6;nT; rhS&iY eZ64%܆A A^$z̓B ZxfdUOsL6mCqo*^\i]g@Du(7 W" *!ҵo]Əgh`n'\aW8 ;|Z:pMnصM/+6`փ0<ԙUYPh{kZIT[("xdd +R`9Xt T۾Դ45C:~VD`[Cã. Mڲ1Ʋac`Շ\D_Eۭ 26 \ JLM; vMNq:Džv {K]/}9`OHI]ɀ|C[5)PKޅ{<*5,)hD;` XArf$!qj'FJU8^K~*.׭9 aOn5@+\pdbCNK^X֐GKt{X?w _ N<c='Ey*~׀m*_f43d5FLVȣ\y ZAș[znn6'm€^g".0Ej{VPk6}WƗb<: 5Lm >Kq @L}QK10>HX^4.BN, C7~Y{PR8gP2Z 6=gץf_&B9XW; 9oe Z+Xbq8o1n?$ioq4yfԿgй|fcwhzQVc +*L][y­Pv64S9OXh!Xi=;ÞdK_;̋1e]N+qV19 M\H,ɉzQ)L]+[.k$|leg-17L)AFEMzZ €QVcY΃k/0Rݩ* Y!Ku!2_JSSZzilE0:w6qDLrVqi :%9(nrf`SO+,ƿ#FYrnzN[֞a2X[-<'aZJtf2zc`UN$'7L@{'.|ʵ"m!YeY#E]0bݩe} <|mRrߎ{! 6<{@s!=T F ָEzn~=$2kϏ8D^0'XԹ%b}=#F5>-2%=t㽧ي#tx/^B2mKr`##s?9S.bKBd –ˌ?"=W孓u"]{ ^V8{C p Jф#Zcb Ț y= |^p"%lgO Ι'&$ ZC`ut%XeUDVีb}D<n?"XN ),T5Dw+knJ5)5WhhG+"KEâO:/=mpڡ˟vŲB pwVc}۹(eƆKs&Ax8DQƵS|^5ȓ.mO j, 56/YF)APLĠWl9Rv,'Oe-E j%aN7n? g?ʁ /saz˜8): WӴU£cfCI((O6"Z:E/<{1 -i wY:U Χ%7aWRyI , =\iiv̄볥\LW&rz9) uj.6EN |I?Y,%}QWdhp D[T]ʪ mNae(mSI⋔4*1C1xK=tQ8"M|FwGԸ a#@reˀdp_44y}~U'1U5at_>jrb/ D;V]v`yYzhn]kagW%ll.Rݗ됰]H:TJ-@6^r gzף*ko?޿URdF*1 =V+!ł5>\.Y+C+NEOmAPaP]IoQةdF" .r]@q1-ӊU-T|kĻtҀ53{oe|Augm'ᶡ<^}HW1}ɴu>Β$f3 "k*JC 474-\K8(:쇍n*͏P/3Eޤj RB'OOt4U|@bgy^X1|Ů<[XWЫ٣+CqTItx:+s7.%bs1TSHOoAKgr坵kjoxխr]˝Pfٙd.>* t`w+FFE1X /1C|CKԽeG}Z )9݅KZgV7t&٢PQ011&KhSɿz0̘NDSJLd`m\$t*J̊xDEu6}[OVF:SsjIxY=ƨi'ϭB-LCK(R` >|ZhR̺4מG=Ư+U:^+BIkV}de~ψ CMSUdxʲmMڑ[o?IX6.e|:ࠋ{9ǮkU~QwOCVd-u]9is CXgf0YƴO0yaao6 rڶ> [D*A.^cdR_`\נ@4lPcCȴxйso߃@a&7^u# 1c"x!'DynG"}椠Q5.iY9|$ŵm\Ț!5+083sJC2c:z-Ħܴ?JϘYQKg d`">!/nyOK4@t0^+i/ZskE)tvuA/'H^(=?QY<Ų6IFX9i-ݥW42 OS6s @oBD[DFᢠ4H@S !qJprKstB4cT'boga,%ffnD^ijG g!ʜA5FXW.-sX@y+d:u[4K+\2Kmc!o ]riеԢpxeu#t _-c׫TSP _-cdlď-uYx4O֛-LqJKIޝ) wDi=>}&.tpnbck5F:I w+~G£$ ]%rYf[Gz@<"aJ׬6WMl˨AĩmCS7}KM7bۢ^' VI)tu Z(juAR"~ܭOtMj.!qX!K)z E8 `hae;eWMz ЏxqsyݢiAN1*V:E! q+JM-:"Ę+ix>_͝hCkBǜ7A[72kU1~\]`/Dwk]k_F,es1[ݽ; aRsȈQLue2u^=~h m_ zߕ|js!SZXĉ5Uh^N%, ~fǟ!t#<N/R!T"c3 i%_'ɋBNVko}%1JM~2# a1R˧[,Jm28Qo0D͓K2l݀iCm5.T~R&1>JZ<>H_kG7=&5S=sGW >o&'^2' )pRB$"%{_H h5qӁ+rɡy>pS*v3꓄9Lb7xpM!w.ӷ7l[Xs>AaׅЄ2bPEyER>e:B/rez-= Q9,' rg /fmUi^LHK*_wy F.e Uc?_O|fM$e%O*ӓA7 M@_;x҉Z]{_J֍6}h5ź#xlk=J{+ϕ*Τa+4s*Փe5B[r4m1V {Id0Ihyau l[P/M;D?ӥUKp N KCث $}KP{! ʉϢwׇ"fbVuHe&A &LC+(so>M9 i쨿]H͡Rkm7%KI?+EFεoݜ'o욁&'e^==;6$V2Phٓ%Fp` A{N" *pe - 1w(U MEeS^ipU9c]lwp HBIzsvsvl0/W'y G *\i5F1 XoÕ;UU;KPGy!Fȧ8A5΄%7248@0 '>J5o1:hK%¹B OXF4 {_]Q})A7X- !.<Cry̒*νV*wa"Ew΢VĊR-J_H!"R az=B[]ٯAA1#Up5|ϠOtuxې[fkӺgH򝥅"6O+\-8)&u=_he^vmA|wLmԯ]^<4HmHmJ A N3!flyo?GM;DY[Ii(_b ;G~@nĻ/hG1=-Xեr|$]o|XБX{`UNNՋyrZJA)])/u/쪍Rz=9!%"w Xf{?$dJl h5@Ui?/#Jh 0o`sW`ZIEow>iE:ܝx=}#T3"U-tXzAy6AGͿ Lރ}8Npf!&d}]${uՍ0cB6 W&HrPHuNC G_+/P]9/V\՘||[1~ozϷpϳ6 gLYH|uq%BȻ !y4) "prM(G=my5hpmOγr ;(l(fjBJjA&ͷqjiH|nS碳a"E?[iuYQ F T/gT(tJԷ4HSrRi>QJ9%ǯ^@=H("\Z 5C|Q1D.{8 ,.pz҈nCxBe2Tr#]xa4@F=k(2XL)zH(w$&k7ƒ#%j-2B'$6 ҡ<Hۈv@G2b*5))v$mx|Wg.Yn0"} Z^ ttSn|W"Lv! #S_+ڿ!RE"-bYcOdVLfbf: +9d5l?70kh*?GSQn:  Y/Z)n⏰MjqZ悧t_'nS}-Bx_íU{au14sD"Fr 7hLˡN^[h&`;֞!0&lW&m_1T~7MuI&q&8^<%5EcVj ԦjYOLG_z [XU0ⳗWi[uŒ>vzGNfd'<@'>BxNCKSY;w iyVu ceCz8NKlc9A0¨3+݅u5++T"6jm,?7/ͤ@4 ;Kat h,8`i=c9jeI~C^׶`vE04XT)= ]VIC5+U2>"=[fi0ORi"it+>B(Ef )>y !+fs1}ԁi QC0Hk4LJxi2n/ny(9CATxLR\Ӱ:>,CwzSi?nA higfEm 9ŚӟBF$ ꠲;UPvrޮ)TB:p1>ld˓KۛUwW|1"2كڼ;xv_l`())ܐ AP\^өlBsX`1خ$K9}4Qk7? &ꄩk-,\YTW(nuj TxeOȋKD.aI3z' "Kn_­4Y̺p%;^ܿ~V  pU(\Lgծfp._P;fkxlܮN(L:~i]:[o+#Ns789O3ܚkje>51d_s4~! oƂ/5dbӌc,҅d6f-uUyB4$a?Cp i8(I?  5?O~I+=y8]<:Qd|۴_YscHedоަX8?vp>]Af*вǁ"jlpK&7 x 8Bۜ 'rH_jŚV'c +7@,l}?[NxM{/ skSڿw8U/CjX >\ӇGas; òG.x@&n7j5oI.3SiȽq<=A7V0dWs]45Vren> C}93V ?Y;T<nAuI%maHgxCfN,1ol22'+ӝSa3 aQy~oʼn#5lB@ppkNX' T0IEoD3<ڸBǓ v}ǵԀ7+w#M3|j[ҟH-ضH덀IP6WL*#pZ{p7юSۮ"+~l.31 P(zgFktDyEyj#aG>d(YKK.m\QF@BqVJ 0{}Q;6˭"?:.h#3 oy W6X::qnVUS [ o]|sp3l%w VH@70sw5G:$=6Ƶy(&:+CȕTYO~.Jz xuěZh$ WʈiMljT~!"d(w.! oB-&e-rܭ(GEt3t6E?pȂ[=0#hOv8V9C>fbw!ł8\t走$O в3 ~ H:_ ͙/QD$YGttOr;4Sf{2$3U-F׏vUF:y'F#US̀ [Y+Ґp5,@ ֗J0?!- oNHI ޸p$gxa0(qf]/uG4k ͢nG̬:kQPh9uIQZw{+飹)-6.W*ư $j]7`9I^nW1l7[; f#$s求e]Fy$!;&Q{0{mKZA_ yHyHl7e#˓򛐋G T]C=JX8grzI +Pgrءx7}f5 1L6èTdzWak%nIOd k\i?;9C{@jL\ml|4f{ӨaGf+(qKlbRw I5Zt.B/>8J>#o 0_ Ar̊_bfDB 0҈AxyxQ1/ 's&g Lk<@ oki:ٗ*\ ;*H}wob=}alKIn%К#t7ؒdjg٩m&.K;;c?`X'r;q{}@PeC^BX-c-[\l]mZ)Q]{acsm1WjCGzLϷfVPuԔr ?b3j|E{V1m7 o+!G˒K8z-#65`(r$OI-X>E]o"q/rP!_@&Eizˮ\kcȶIB}zq&Z?!0_^],JeV } yeVi*7zu6FqF;$D5ZA0Y {mۺL85AHfjrF2̏( OH | Y~E&#\5 ha6,woTmw\3c9I咐udاk|NwYEmJO&s4b  U(aRA:DqI|iZZgt2IWȂ|iLf} dډ`ޮ FF[& wg`޹ oE0 aLf&`VAl+ $jڕzߑq1 =NLWy$nNLW/Dm \ \]nl|3Wl.Wlv:?}]U7opN ͅhtJ%?"\ʬN@uLe`g6!KˤM`/Fg%pjhLnYXF;_c+)xל+qe)gaR3F",Ump9Ef&pJxl^Ek\B0+Tsб,Wj*M>d v3G-p4珌"E܎8Il_1G^JIUӡ'd5h6Fwy{ *. # 3J>fmKx؂&Dx6;rVX"hO?h%yG6QQn4)5T6~Cjnюn<#\+3¸Χ^SeZő({vAJBKIyޕBy5zXEgގ6+Љ~#?㋦ Jbjxw0m -+3BTR_}xJ4~Ef~,V5zaƮrF="{g(@u"H~:jy;_Q4 خBp,2U%I#7U5]= B t20p/}lb*xsBNx:?S#X_Yxd86"RϠN&!Ό>Ɉŵ2<{dS p)AN{?uN(kOѨT vLpb1-*#vT6|XL)X 'F qB(5C#0QL=llǺ{QhTڳ\}uVб9ER'qbAJLIZ^y <T^R$WÏeF,T<jY ."5lFSkDĿelP4T(&d6rl0WLex~`JP4@٭U]w#`,L'aF^GZ9W݊ ' PB *4t#_+DoxX˪kZs+;B2'x] #" RەəLX0ȡаLP/=wh%pAsKއo-b jמKVqs/$e3U۩?|}~Jc>V+԰Q'(L]W/|qawm>կ#n'GMF5E <iP 4de{DY$r+.loޭhVs4H sT@íGp07Q[3t#@BPt̽w^ݐODM+:aS!!i,g['R3(xL a "a\>bNRUWy[mCx]/[۴s"7M+ nmS§fJֺl;%~aϛAo<ȜuJJjvnl+N)&p - 9$ ״GN gS-ـmem OvwŠMe9-\vR'fm}ӟf)(p \Λ9tS wfavZ[$|3T9ݩF6^-^P\9~ھ3 SMsOؙ;1πy\+,H wGN@`vß`׋C`@9!&T'E7 9BЭq1M/3OHN5Qv]v[k]m& 㻉 Q2Q_|?M DB2N%3?跾+dP W  H;k2HǏ".W0L 1yd )V<%FijgjM\%bs͙S_]9hַZ7>&\ t y p,cc{[0c+@0-@ }k=Y1#!7lEۜzrV)q$M,"r@hJԵKqN"g6\*FK-2Ofe7'CfF<|}:!Ri|6"CmXeoP{s㱥zCdc_.yU;XP<O3!ȔG&AV/-T/յ>(j/-hEp!0RM&Qnf?b,\la4}$#(yu{) v+y;A(.5RmN}85c/Z A;~;(z'!n=9 b8Gr'fDho |!CѡxaycVyn"+1Qj8:Q7(.-'1]}͆OwԀx!7IuxZ  l`*}$x P)V.x&SG09NjRUڍ\BrEPgJnH8@0(_c &#W]HI+WUo=8=kXoTT o:9H!inս($E>5|*zpexP)P3!&^?-y][J*k~崁!5}A͠EFd @5: :Kr@Qgj~\V2H˹-떃C=j,cSʍFS~ ;]@b{u)r1>Aq~,?txŒ.p[7,/)Ωz}v6p@f)Qsa &.Czq0|sSYly,R&XW?,3-,9X"|K UQ#g-|i>L S9yϥj}y'.IR9x</l.Sm:NMZ2DE h(rHj~,(5fO KTf{PBtRQ=~kn S:׬I@K)co^ML2fTX>.ۆ4GV >ޖuiqTn3+=uQ;m m^iè)hlƬl|'Y~[jqs+ [IC;!cl !bvy޿1?%<"f\-F-J&")V_73r~JR-Un.5Z]>ɺ1& t0+2dN.֕`;) 5{DP SCǿ('sU*I1ͭT),WJ'-^o24sc}3 EF|EwiGp:%kt?[?X &o$ԥ2gq[厲Y8jNya;$_b 4sN3$m7z[p$)7'Fxw~~~}M+h,`D` $Ґ4&IkllCЮ5pAmZ3[p8#]Op؝_;{l˨1q2oil6p/oV81o:^;l`.[.{UbGbdFCv z{@b$cgvMn4&FbNXs=Ka?,2JѼn%-u(ULI\ .b,x?H+2t\Q/w T v&G2z.epL5;XX >DKB·hWrU!`Kh`1{&1ڱ =sxF1Y{``0JbNSU|تD1TFYJŧS.g6H[HRGFtg)E2+fpUZ>UiFE ]yft5<GNƱZX==LC78q#C.VQ@/ƱԜ90]#5f :^o)GCjku!x`dkE?q<;|x93qCQ$(yM+BMEx"R BDc%F*DŽQ&0S[TI3vg{ :UņV =#|y`THʆ9ө) [Dn'ͤC܏Xekh )^nX[2|wCģI#~I[[>TUDntLmQ'ݮ eb'c`%o?ّ#WM7 ;˚t?"JRYJ]4aTBk}vnɈGO雲q<;(qu@omz˄Jyhɻ˻u*+jׅ6Ψ)1  FN7N ;"믹_<370JEo2=q+>d1Wh/0 QG۲)}k=Q\_' W/ Wk,rS ЕnN'?YW|FfQY"ƒZęcq+~m3ûC<$J\Fы˟>EX%"SNhI&!{4'~l[05لxB6U&\]="",s (xJQ> aFxbGb*rZn8=ي!?O$-osy"-7o:(K*Kew&^Տ=yr{>8!`qD5m+~Ł>$do&g?oCZj1b6u.k*IϻR3Ԅ( mg=ԸXQÂYx^轘hbJm=A kY=]HGYjp˽UؘdtzFj2u&a*ICb_Qpv^VzHڕEȯ$P/xzC77$*fB4q#R&s{];YVE}ZH oWtm1Sz*]ecB$ū *A_,dEptشk. H9sIsTAR:AH׋Mubo& s z)]?b?n~@a!$A?ux:_ ȴ8 DdZE&S璶^py"?vpu=' ˗xMGhl%i:XÉ+ҾA*@#> M@:-nCd^iMVо\FM-p&=v8!*\T"@JC < X5U:1hXd,Yj܈umK#QZ2T) D9F/_͎)8yݕ1giiCfrECpgVmٱ"*X*}bi9*tFM^Ҹx\gG Lo!ĝ*dlrZg$Y+ mNhHTaTe,W~p7ms0>}cB>Ӂ%oL+Fl^HPugNZ'!D8)dªsgN:PWmVM13n#uekp羉>fUq1Ȝ>:+z&b-1x#Q<.C08EJS>XoA@rwSc4Qt  FsߞnA'8ư0{+FbTj) %FEX55M2ѵ SBR ؈FƝ^̭TC >IfJT׹}/r6FQm%#."MD#y1A;Cˠɣ @gMIP3;/k^|0{6SN̪gʚИ#~≹lp/~F!w @g8XA5ȅ4dBn- _{LZ?Jǔ Y~ޟbc4Ur1|2L>̌@Fjߗna׸uc9Ҋ(֬wQf%MW%3WNY w#&@^q*[k6d M}t D"Amta,ZոQF*,":qzأڅ "TVv=.5A]l}&TLy[[5).T!iȻ&hguqmmR;!? x‡;w.._m{A7M%Scv3?Ewе/vM+Tk+d&X B$L I^-ȡ(_Lʊ*5|Űor͓ &鞧ED,2MJp[l EP }umUD*4_א3}gXyFy + 2t.Vi_JS%K|sNt Ʌk®d.vpѬqp)HZ&"SkcvnWî.HztAuXB2_Sχ6GوBL0ӯբ]i *.vHZa@y[~Yu*8r(fQy(WlŦIh0^OəX^-VۡrTn_~9:.-ޘ؝PGZKPŗ?XWͻh2eF]w!p~Hnn$2B5zS=K]v)j]GXpge5d(_Ar#D7mΌ*AZeT()޶mχ=o?{bosHr2+̲Px칬4EF 0b_Spʐ r l;91UQuh,&yѫEX~}7aZk?"]-.u~hY2/JLW|Rb0;oFO)TDr\1Uۜ'e7Q` C0B$ja}jk0aʈg2ސ :XW3VFϢ1FQJR:t ޘH#Wd/n;64R9ٙ+(|?S}k/_Q/MX QYS7uw&r)%2HiPJPR+7lY0-W\zVڷ~!rY7uXH,=ginQ3oG`/Ψ?-0Y:bk9\>$Iо QaѻYŸ( xd쑘\&_K'9g:j3P \iMhw7C Üs; Or34EYq2(rDo aT)ȏANȸWdk+,*P0cw{Z`=lt 0K Tھh}{YDTuZ|sy |D1_oEYHcYقu\rVNvd 7J|s3Y(>zP%b!Jf BdX6? >3}4zśRY:/aGN`םȦ]1]afTwm!nnf&@6BxΪRbT9 zQ}vʌ$u_d+;6VOxC{fqXޓ ;hjN7@HD%7=#1xpc<޿-߿Vퟵtm?RײF|ULm/D)u }8]i-/ rd*yE7RzB-F\(/uMHkh{tO[UͲr>;]qݒC{~$.6 BNHG;Wtt)@5$Dhl~Jr]לEb̍呠f gT}t!7d;ʠ"iY%"\&p'Y_szW64I^{d/c!8[hKF7#e ,0A7 0(VD Gʰd!R!XQ؍NpεpeKP^ࡪgum@,3MF[C%{99=,g.{-" T .w߭f8-)ɡ/k֥tJ<]Ƥ ¸ }KɃ*=IM)/3)dr[˦,wiϠ@]&Acc43:=\uBgHJ~QygVvc>8e t1%fH0/v?!y`ˎ)˧a7ɾ=]j99$$Lp)uxlfHuSh& >kj~O{Up"+,6 HX%Wʚ̕cmqh,AGR)y.8]*̎u(mMTg/X$Q=LHx$AKӇӱC`0sWޠ+0Ej# oB7:5($8%.MCrt2 ifp˹`EVrUۣob-S3 c|}46]a@㋴DbЯ.dm٨~W6:(bbQLάTX2iJm]B+脁7r Yj^-JX."]Z5H?Zj.~4r Ux1$2셪+ܝ^?4!QvF_;}f9ꐆ-$@(:8nN4B ;_O[H!Z"ɪ5%9Md:lI,m8Q֤JzPRI H7ponP*!CdgnzC۷>ؓnмCEujӸHo$]T $1)ǒc-ႻR~^%JQPԪ4+`mCԓ כ+5aɱ~#*hÃDLp(`jNq;-)pjQ.] 53gRja?OS} )aDzT뤵qub"(5#R܆vJ^{3؁ T}E葧ϥ#fS現8k\0O:&^NE;oX׈RVV?욭4ko׍S*rjX2D}RG;0-5JLqo 0cb8Pp9Pd?"Sj16|.K4_Qk]]Ncϱu?T742ĺӝ[Hw l[#..-=fOBP|骴l-Z.$t UoT#@f.`i.oԂ9u!evƐDk|ȋ+e0ac7ut"^S˱G~Wk?b~&' le{`XCz-[og'Hkz5H7(ʖD:t`0KJY ͏LೝU-K5Xo#eR}O:8&m#ۢk/NlׂDb=ﷁ?xnǼ2[@xǧNs1K2:Qߞ"@]߰AMC{歏i< 9NhMQ,g\/;RɝF LEM'Go_Aq*iM @$nu׏e^O41F! "(O9~V@^JC`aQj Gs'>,ǹJyyp ]T ͫ5d5Ǹ],A?묨y83 (tƦED *=o xucUM u>xCGھפgol+]Ɛ0l&M ݇$Z`A*M,73 JϨkGP(0v٨4)ەhU}Y!Y nRo Q/&;{|. 33P lAƗOzēPx2dUL@r/[wPzϞ"lhup8F7+GM5Ϙ%/##5iyl "20*rȓ2k^.z[hBk0e2fS2q9@4C'a*y,@M,.LVq0N'ͺ,!S<"r}>7=DNNlYۊ57܏k0 dtTV9R<(~Nhgw礞;{W\P]^ ] :z3:~ 5Ɣ*OK}Ë!6G$; ^S :[[08ysGOl-!V]b$bylI jeSjȾۀ`)Mob#E+6?_nT''Xo i>}Հ בV }lUlJ&e *!T}€ ڽ2O[Qw`aW$N 8/\ĕ|Gh8.s GAZtCfjIt]G+@(cj~c*eb6WwT컮<])jspM+[+,%w%)%H?j8@ vJUrKW >WuN`6_ìiKdĸj4)$_דeK6lYt*fvc+G7u RJOdlښxNNX}/bW~\vcyAs+V} p*YҊ|%GJ?D{=7H}+5y[P k[74 䧩y7N󦆊(ko -_,"ȴF0(6Ip] N* ϔU^X3jZDh9iNzX*BՃ| svrRQK]͐oorXA'̜&$|îiq D?A3E %U} Pny=qYOI54 bJj"ORj$Ht(O K>Z^P'O8f=/83'D N&z |TA+$Fr-3orzwtui>ib\[UT &_Ye6:2{t U& ]x}KyC_etP{q`IL*.y62F쩋zBDJghO_WT"_+e.6Jm >@hDkh'AU4c m2E~XM13mq5&JΈ_>”t[?;KyŧtUݧwL\zAKEʃWHm8nP-#*j ga1{IG#]:.YۗI(Le.M1{,zL^Yl_]vAYY4bm@YGGL0_Dڪ'8Rhl(2 /Ke \kuNT grM^5Q؁Iw^Y*\yww/kl*mnQ-i6˝"#HrXzYqoJtZyxP9/$iC &yl\I32g{'>Ea,kz =YGKj9,}GmF6!6};g0jd|uU#jydGr)CH''RjoKyROp=R21ǤBtUטz G9 ~;a[pE>GX..A/ 0?@M&vȕ q{e|kEEK^?F`)MΒő{͖Y91{`[[7hrY9sk+ޮ cT(xAnY`ctP?U.!iD9a&W 9KC+ pVЁ r~Zqp O+͔b_< ǎG'H7o:/o3Qm:"M} TE99Ae|&л=Z7zGBCanHE[zO?нBpvqezKǵ#M#&,՞ZM6- HrVڃ~5OʎJĤ铃U\j,$Y(D.nD6vf{jq2;WK@eV_f"d+r/'<7w >⹸MMRj 8+nˠAH6{%v қYƫ!%$6lҵfRw<33E=x4Un>D1U]SAWVGƲ>T[" ߫cC1OqZ

QOyKdؓƐj4d~n)CJ+_#Fa\&:r}hT0+TH"|eo9;d2y6/ ,)Gf9>jlui{ [)"P}8 y#^TAOT윯wp̰͖j#&]$/>apeiA) ĸKUʰ_!<7LQ~b~տ&[2vŎx|3M2:;@&!ugOEpu8a_ǘsp ZS҃:/3ɯPQgj}-Ow|&ݩo@syJd3/" WWjqs';M]P&5$3NX?VRE: UƁMHWG6}52)iB9)r\XП yQx8Iԩ/V彷 )U3y{~|+el?PDMw ? Z/Z>~!ϯ9>$)1GF kw3>+J՘$;)wNIqҊls8:5L'BކqF(i*3?UL=g;+ChQ^3ߣNP9m_PTB6֠qsdU)b̺ip*1`َHo-D_6V+tXeyrB$?n/7B悠c?ĸ_;:7b^E .Jg34J=Ku4K E}z%r}b?LV5".WBK2Bso'jT>nt7 de2[aںfۙ)cJЈ@I`P94 < o‚궻:ٓTwrϱUqIaDBS_]kU1?h;K$nx3Z꘽K=*)PcVp"&Y =#d :m+@uPewOM&6M=EWZ tJ6ņ_.eM< hekBG ɐԳV{E`}7p.'L{|N5a\a`q'$:n|DJI %2G3wƎTkw[̈I>D ½0T"3Vۃ?$(>U_u܂ZuS]IVpn_P" !̱i^W֘i XVO>ڷl[ȳn#/gYhKLo!Ù{Zݞ. 5aز_wB[sX^)f;0%Ǿ+uxbt>c\Vr۵:}}ysl98(t[ +9  #oA7mP Jڥ]0mk&V4j,Sn]IqM.ua; q"6M"ڪKӚ 7!oSTH't{~V i:q?r+1CC 'Qѭ~2ʙFa\# \4iA&9-"d>;ѕ'5,nQ)QԻԡvXFS^5R_^w Q)$i$nJz$'J 45[,SbޝTr(._zM?Y [/k[~q:?H69;g>E:߾YjU%e[R} ÷~F(WR?(fh<}B"_i<iO][^eF9wmpEFѯՍ \N7Ot<$dhnR5l{$ט7\|>?>HMIG`o_5J Q%W^>¨<Ynis& d7%I?)gizQ0"W/J.U9K9eZT]M"`͋S5pu662Nq_8oFzO{,r?rJ F{?X1Y }X%9QSOɠPT-*dP]4.&l.x{&m^e}926FY R~x~뗽eLNj.s2e|+\I Ѯc˜7aLDžWe|.6`P5);uFiՌ4! uP ShAVvq[@8c!c7i^.e+'>®s%bsb/9Jx+|T^&Zp}N FDOMGR$po2 #,՜2*\,#ޅBɁg:9J X]BKZ|yAP .;~UIl\w r[9F+賅h:X ^𜾃< C '%##ֻ(S^߆`"j8 z4sfJ/NfOU<؎wb k]H *>%q-a H'&ŀQ' lzD)ҭ!1tCCsO*{dfBcm C(4kz6j_&<ixK1 du556uzCRvR;ֻ}XyR)1jDՎ1 nUv UfQ3ę׃l30WQu߸"X!:+v4D#ZTbhĊ~B30e-€[a>N8' M x?1^??d,=B/9[?/I|i\M)9Jx2d`UqGbH{@Vk"z7 LO a>bkeXy <zf0ac^~*p;x1bUjgk7)se85`N/dpf`69d źr0qފnA Y颛B$>ϑ\&Z,J~DAᠣ^_\;JKw\$3'j+KwHQZqx󲨾(G1%kSoJ22SX7^TZr0A7a59^Z@'ʾnS1n! \8`n )Yx\p3^1[wKw|J3 SB,նu&%5O(uGI|& _` Il>?I"_nXr*=6]^Z,;vɋsx["7Dv\g fF!`n !yd O&3>9MDE Ϛ/1L;'CnG J珫7ؾ̽d ({h)20XBXߦU$no2_6E_jlR~s>sl1aq>ϫ<&]+(w4E_g۬5 _bì̑X͘x8WdE+B~@%oOɛͬ; 2U T>?.ɿh\_vxj[T4^bI"F*YNzWlK |:<N?{B^rUxt2$uRmXZ~)՝̫u~^I %HdI>թ *6qZ#\HXm˗!uQ 0yT[a}<=f2;AV7Rvgѳɒm; t3DRUYG1h۟tEg'(T܎Tjҩ#r-z1s d1Bj^< 0ԡ͐kRp̻Ghoffi"0nn V(! ?gzOIZ̞ŀ#M C~WULQlG ^8 Ù!*EP/xx0Ac(l5,gb?b/O7ffkkzԦ3tj 4gF1OFх%826a/OxuG7Hg2][턌Ef K]4e*; K=oGFdԈ`gYyՃT(2ynqKTE2C(g.)Z.=aؔNЩ)ЖA/uЋVXWׄg#=_*}ho'Mض頛ƥb*)_k +=k8CK `Uw;I,)NpK̫X]lG*j y}X4~Sk$IY@O}eJ*Gc[ '=g ?3YV#q 4[J؄?c~fEJːD6hhmAS+'_,zaM%8n\}X07d+GN˾M^U/ ֌gBC [\2"Ҷ>:ثˠRAz{A9 #ԧl +`=^&c¡=&SD oW+1{Q2MLL^nlR!SP n^I\"BtrKƆ|v~w,kfM._;>~fI3VD/% ć>QB[\TրM&"5sܮ4lVI\j*؈*z2&Y{X7D\y̹50x>d9%q>y&]Ȫe_zJV7l5 jR;?mK>\jwKcwar3d$ G̙Z*+|oc6g\!.F`N)cE? J_n3? Κ``zH3h3IR]%JƒVzBSXv?nN`@+b̽teA У酯ckp/CFj$EPϓ {/1|Dw@|?OX2@$zNmf[mI ~q_s{$XkWA̻ko_fg;"}E󰶹,'8J! wXС\vߨX9#J̮i#YU {y/ .V>PpK:{fx>aP̬r _5,9csJ[]23T.{'q^pm[XTtXki$*Пaz~^nC)sj)1h~S?podƵ o<3%q`ʂ{?["?ѵE@e >L zJ:GyK (Bg;D8kuf]pv%BK;6|>z\+R V3梊X[VPwaXM/rc-ZPKNI93 OSBO07ͬeEnjٸ)qӗfh-8vff<4faًF1BIh{#H[y5 ab [׍SDRNɤZc|Q#~?=͝t)1gsqKGMfn,Hc5?q:w6R&7e^nvC?^~vYzv ۙBծoE)5"ؑXOvCu.k茶([,Oua$+B|h pp%vۦD$TOC㨜k_ D@/7 c,ȑ͝KΘSu3I-s,+IQ[2V?G[22=-MuBָ(:I]~$T0cT¡AR=xh';WgH2tq~|twQcȃDw3M,#?$SbaI9tp|S!q3= /Ӻ=p8yug kΡCx'N 1PCz$T %@m"|tX!AiMq2 ύ\jZpV'zAhyz$ya ^5#R;w=5j&|E慴Maz@J*jO hQr'$)q4T\gb-!IHZC2|2Ol,3Ўi; Ь'h [q׈]<%[??`Ljx?r g^]UZhR+9V&bEϖaRY1_p "\ΔZS%u4Qe 5~OØ"x@$'ut .HN@f dϖN^Wz !kߗձxxgJp\xl!ɔNl:+qpQ\LҸ,~9"+Y9KTeQkd]X,S0z&&,Ę9dL=<Ђ2zN򛈏n">JN(5.քTwNu8rt73RQfjoHŏ6~<.LM#⩘G6  \7"HuV4FW֞"{O7.TΑ=jpTi2ꤞ3d@Q*>) $En}2DbĚBuT-w";z\e:| Tʎl+m{($߯ ZwIX$Y'Lj@ΔmaEgBۦг^/{)1ۉiZuBD82na^@g|'{N Of}0,Լ˃C楨B)ڨ,o=1v(6U%d_@CThnFiG-ֳΙ0M㩚L$\GrcDOQi ZrcDbԋ-b\Ӏk!v|QTR)+Qs>[ ZeG-pep^Ch^bOXiҼ&sMXd\1^QAkMǾ+"/iLK軐HCqPiS/XFpi֩KH(zU˨w~RGՔPJ=COV2W30]n»cάoF+籏;b B2mۣU蝹&mׂ=IDyNT!?痺5Aa60O9,x Mٳ+/,eH*,DZөg'|t e*/3:ąJo( lӽQʶaWFrDQ ĸ[gVuT{Bx(k:|r#ֵWn8}q)&mqI1ܝsXMs2ZkpKuM)}{sFJ,s?جj7CU|2H͓KosE/gD?Wc# xMbg' ؼpw'<ڢB0brF#^UZt">3-P|[quXh붐^bpLkH\W6)i5>d6"p%L%o9:O}FA@8!f~c9?q4uP:I=_x -ȟD%1=(ݞJ'BYm#Ur\%PY8DU̺D3N&$ޅF 󕹈ᝓR/N(}p򬲯I\ih"Z1gҞe w2iΏ #(淥HqۨQ¤9l^?ŌL?Hz[0&k1JAPd҄dfAiRRjEoo?ܾz3WZ9Z'[}\[?ޮdt2A QuWyɛᵀM![wf+~קoFRKo eSMSºXq EoPl[-AI7šoV<w@4d 9F eX;CY*~7S{Ms# aYCsdfESk !Eɔ=NI8 +\ wr1㍶or)C̃jH򍑰q~F9>7z<2t݅$7 K}#VKe +렔ں*{ oi3kjF|wT@PMԜ{@|9[4F3 0ПAE&xcP ݓZ&U"b ke+DhW3yV˒.&dn z &BR )Z[g v!k ,I%>%/ lW=3a=mXN6X[XW;E`7dɻdZKK%OVoN֞um"JyQ# l"CNo#UHG5Z:NfC _-JI*ȻxXg:*m"Ǔ.m Q;TxH[Α64d{W@BsB.ڸ pblT+>H&-fkFzB{.K Vpm~>-w ¢ZM;D2v`}Fl0Ks|}fCgK%$֙{g[àLkCWteJJ W_p8G&y[1-ٜ_o|YLu.죙RhθRAF's,L+(惡b7 "Bk Uq b4\NL(LS Q,~ۆծ$,HxzkֆiOdЙLKLiVA, G+858uybtϙޞd}Cz]==Z96ieB2m*kX-~^%栖UVFelj("JWJ35pkX!%8*/n|Ѓ(;ΫE9jSIuЄ}E8Ol~lOC)a#ڵOUhGd.L̏܁FZB -ਟj7׀3Pڤ:G!8\6 a k1C?$  jr^M>o6$=6 _A ` YԔ&%Ҍu F"db% "*;E&J_7BߩuF?'a1䤦o `WE/щ>d0HQI,C E#aNUu.| x/O Wպ> LJ?!x tj:ST*W[bh,ɉϢnei떒nE+H*j`nnp#eSɞ7Sp(O28 ZX j8 5`C: Eұt9Vd_n8I:KB`*bRT^pewzaD t,KQ߮dfi"Eo4wiSd+ {2//D*=W-Do ցP&`U!c{`n_I[Au W:gXv=^=?:tژ{@0E8E7aUm^o'.&9'#a䔲'&v:K9 7lzy)_TkomIj-ӑ8[8 V#3!s(Hb>1ouj4qʠ4jӀ8>7<~:{bi*J8(T>H4].6 ƓJÒOA x_EaOvh+Q6#_6t4`*D|_O?Xf|C= osι^%myn [i幘$Zss'Wx. I-iP0bAaÙwD=:E|!*kRr6@q|vU9 $^/N PS[xgBF7p=]FW7u 節xC=-q{uXՄ;<>&mc2h8"q㐚/ *Nq"Un4tv+)ߔZ~LġR&&q>@ s,@bD`2M,!ǎ8xd-k=[W)%.kwƸIj.#k7?Z`aWz= BThʰ݃l)(LALͥ,6{g5uكL&JvX>ݒ|3R*l G$'ŵ)=ރSO$E@R,tS!*{>Z :D خY8 1ǺNS) > tk6$w PR5J21mHkAnW_b엊[t%Hy|l-;)1l/]64qQ.zڤ MV جf\#ItE0UUO#.@zMDfS{}u+Ԩ&s4d|c J%I/eux( j(6!\FF;&zw94 LDłKRnze8PCwLW CKfpT*ڮmj д+#Ձ8Uioƺ^rіq1HKK߀ɔW\r^%->N^b)Ќ['{0@Ӏ_JM߅*r:5k`:4sS.9p6k.BcV:\zcm{/ |Õ'+fV_׮/Tw;/G;b9O"d5)u<=-owɾ # L{t/`8}F+-0;j}zekVzO-=._$O=3""`qbqZ֙-Bs|e 8fk8_7U7=Žl<'l9V_ix돿 _%:˴ ʷ siPzk39tA|ұf[w#Z[V>S*b J)ſJ~GD&.1ֺo±?)Ȇ/!2%E ' ΪiJ$y%ʕ+=2쥕߲?P!v0(vz'@_9eZ^2.ܩ[ V|}DD!qO8  3aڃ "BO_m;wj0WEAB#.%8I̥l'GMyz۞4]) ʼd@O-Ah8@pq[1PrAg;j<ؒQ$ 1^:޻?mЈ?,"myOLJN0'Ҕx3FyDH^޺ Bc._C`5 Ю y8a(:ʰCvl`?Ιl^7+&tpǗcwLtw]>J*h=[h*#nqZ/PW|8vOd@ '.N"SNh#<7SFҵCtܠ&\7X tB5ɚ^:%~m.mW.v;G>O]^:߇&VĆr^FOy<|{Ϝq GHJxq eAOڡ9~FI8В\a Ĉu*7j]Z2j;pDb( ,(oUy6'ADcޭmBW`rBĆort? It1[z싑!ɩASZҿ;r{#nAZfs٧₶g67B~*9x4:uۆL nuʧAJ&,D(ؑth+! OFx4؟9  и 쯮<}T+r׆5.h)$.1L٫ჯC ؀TJmf.tr[J.M\KB@$ȁrԹjyCL4x #Yթ3@VFv{LHRG0uR+#S.RivjAR1Ҝwyw'ɺ@}cO5 {bGɴW-E&H2vS k"3]90Ge|Z+Vy`imV&APS9zU ڤx: AH?| М?{5s lpKiԙ)6IALor_BSDYYTHho|ȇ*Tny 81Q~2 T5@E4jj//#Nl[;' }d.D9qJ*[%Ghiʅwմ~/6mMm*Ϫ^nj%~짴YdQZ'a0^I̧h!>HERL$ϰS ,n, ~5pgu }od1h1vYt]o?iQ(᷾HӕD˿l^(.w&'Y9>0O豿7aCpVgDBb.zdD3M6̴0BGNһ F:& J7 Kk#l%@maM(jWhDl(4p>T|0[4. ư!fMo-O! V}Ӹ}bRЖ-P84urlu.%_Yՠ@guߥMz i)G{$'J >W _hXi'E?+⦾A>A ߢ n2:8㌓GS [D ?9|h^xМ )=Ra-5ka}`V) UՏީ >&a`reG 4@I]?2F,davs0@m#.r[[K+aLjS+.S.L&,‚ `/˻s S%09@azX |iu9@5T )Af~m xJK3t0OO(|) ɸOa^ ,i s\6A^DZuA=e'd9O^pr݈\űx* /Mڮ_޺:9 S$Wddx؋9?*n9 LOBaиCT)̡- bN }21I3CYVFШ`?Fhb^:f.a9Z e>y-}_  ]ji"II TCX .oe0\ѩ1!TnյUj+/͌Ͻ59qc-|0ha"qwAd83lކ*< 5Ԇy] [%rQq=st1l9XO}A,*}'_HOxvrE#8++.B}6<Ed4S"tSHW\Bq&P7!72&m-Gt6{ns,]dq >3tƀFй*rnRcP*Dh_X*hcO{Ҷ,4M(g V;m)] ROp^ vsذSwAdXҁrǘi8fIOHx=KHliRZ:u=Z{R׀9 74iCB+Ĩ&*|+)Q#>}9aŜRU9 5WTAǓH雼7+ZX|1t/#}%ѪˋPMz̈́V,7d|lŁK_>׸X(FSh}hV8.qԕ[;UȨ&QVA|{]K7wgL fμ.TyM*1@4q4T/^M򀾁IwMUB.\ԝ# C~ ,7茶P J<ܘl*^/h5ȐcFtZ d'K)|Y,貺nnm3-.p1UVRtl t<_W&.vV/C2SGUcZ1`H:[9XOAY0`ezaP}ւ //1'ĈCHc'Xgt64`W)#9NmB502ûxҚd`kRA]Ҕ,,[VE`*謚52'lsD0ނG;&-B|Hl^MfdP .+ ]2T2ʟ4N8̛QxW>`=+hߓQP*xө'6(6w Z{a4aTx}"sV]耍od_fE" 6 ӆ gӢPؤr]־ҢHlؙ>רv:= QOz{m"O(m*mIssy3# _P\R'}?pIa6; e5Pf=A\䗫$pKʬ%T.|e [Zp`&sI@^H"ae^Hyvm*ƛ 1sB,$+6"7:jCARR'Yt+%%( ˒ -BPJ Bnږ*YW:JUjR4?~.{SyZJҗm2ZT#vʑ@ EZѮ-Gl`2&:M. Ñ}a\uupMJ,+hQS%U,ȞQ +A/VW8~ҟsq $\qxDu.e\vB³}ɪ^Ӑ$S -'Qz׏)sRHROs!fpRUWy<:W󳠳c[?(nO,*1udԤ u53ˬ7cekHso4Ad|"% w:K(΢uiժޯ؎ꂙKulR[t-8+p-4 1lQ)Q@w}|N7^lXc1\-པ25zLk(zkÛ|rxCX)xpPSQ|sJ߇^ȩ0~ҙ6"ppdW|$}t*?W],Qje":S ]l :fY`3"Y8|1@ERJ^|Bp{| `L xA2>-odF@HyPHNa={\:RR}̃׀02OLz~th1ʜ^9\? X~ _gCՙ+#9Y$Y[wBij52`~Τ࿪wtZ5e-6[/d*gA GSt&XNqg5+[Aίo8G#u]}!&KڀCeZhHtK YYx8H5ɡ5va 8p  (=!A!l ކl4<ٰWD9$)cða[[uL+B֔Euxr#F_)k~ҿB`3v%ڼʈ .Fd&WO?fA ЀDR]wrNJkKC"P4S5BjuuIP @}Ȧm,1iHb$]h>=K]#udb2獐(2gJYCc豞Jzl9e(Ŝ-L${;uIM$z D\]F _w( ։PBSVN8k&w9%p W$>i\峏/3vn9T+>e{ps\0Aگz o)?Ay%-E׆~SJ4d! a,RL)[Xrt0oSϊZKpb5_HU"b1Ltrv:طHt* 9ң9Lļ)yI 43KiUt繮Ro`fmSM6uWo!gMmwᙸՂJ1+D^֣fr'n\Қ2>юvLm^T"}/_0MSUog!-XE{i>p p{}Pzl7Fk~#:xZ9x.5n=j{SW]&9sp-n lIeAH˻?;"4Uzk*zH4%E* 'LzP~ xhH}HTv6-lzM'fH[n, C o3,^qky@h?$wCp,T˰|OigTI"h)uYsmX'Fg (J\)&jik|+]*|O +1)-J/h 8T/[H[`o.k\Ry끺n~`e*P<_J-,aG{WHL^*œixNʮJ6q3+]>aRZ ?a; d)ڕw/NKoRy}Ʀ l0Idd}ZEY_b!lN=- ] {G04b _ugb\9̎7nLYlE޹*OUw glPlK’k)`|Ș1yHk dAXWX #,SʗR-).ZV bgɘVŭt4`mkƈV3Ǧ.y'1^QCAۨ61e0NoCɒ{wV~oH$@N{^tti\%tvu^-rո'ps=vֵKП 3{yV5% TnlBޓBcg zz>&>~I>Yyl2= QltK1Wfw예c7uOXvE2ZzxAg0W8 Tub@Bb-6_J5IUeY*g7t@i:|JH: miגYu3\vٚM ި &:)}:-Q*{gP][s3(ñj֓j_pYAG{ 3hnJMpasƠ6NVI:lWE0>kIE3"]hBRϦNj~*lXI}<X齕|q/]pky~`@$ʐ-$6S5pk1z,RdST}ljAױ"?Ijq.Λ@#8DrݰQfqKN"NgÀ}iAVI0|% ApX88LOa,CkK- KL:#K^\Yq'xS);FkP<2:!.Fɶu/IEbzr u^$jf1)ŝјhm,C3*}:]qTz YtcvooW"Ԓ>BVo儦3ɐrYMdzyUj6i d#+N6Kݓ:8u'{&sC&Ӫ_e9ZeӎbHY9@+kΩhKP)nJm"VKr^ HRh`I\B|R> 3{ 7֤ P Qf|ާx"CbgQ=̗kSV%|5{6Bmw p]B#ZYjVC޳',n/9)*6jf?hm5;OhJXv?kCT.6Mj7fIxc~ZMj7+WU H]ˣ[EJä%wF"Ss~UǗKjХx_8pƒAml8SfEltis>G}tr  d5#r$&D0 Kz:A6Q~v%!IF{.p3es[mX.I 6g{ ݆'$%o(VBE=G۩A5!#:$>Dz{4$"Lk7ζSE3סڷwQ 0)HH ,J9EE!-lY͎eIZ`CMVzq/}4I@e@AΠWi׬tT[RdOɗwC.0*(85(bMŤWS)̀-{ z 4 <Hpߡ}" "Z deL*l8d%2y Jsv.x+~Dtll$U^)0Q 0ޕU*[@gww:Às;HJOG] X~_5pe4JT)j|pYBEpt+9rf^ZOmؑJVm7ݪZwfhxo0n,QYS<5}ټO %[:U}1Q#Saۥoc%?*Czvu +GnnBnDyPK1JsLc=Y[QI!d4qbs bJG1fekBaa~c̜3L铐G8,߽@TFvԼZҲ4fٮ'+pd<BBә#RQ$,jzĮ L];E ϊ T.-f٬-_210X*R$N rha;_0ǐt8ˉl%[{ %bh 'k5װ!KFh'z Dm< 7ARaБh/Emg.`:%f:Н*|lm,\ fcXG@UYfR ⓾f.uS冬IN2͢ILJebNgJt/>Y)A =l'$gmHᎢϢrT1dA/$2Vo]/ӊvi9(%Dl-c~R"Qp,j-ȖS8 /X!fF 'eFcRB$rߍpJGQ5t uV1Xu\w~ˆ$mq|DmHI3Hͳ'q"('Ut>w`:PB3mmP^LD vl*ꤩ/zۃ~]SQe³)U[rk%TzuK"?-QW%8+'Ќrd{ ׺mV¯Z@FKWݯP|;4j,75;䅼Txlէ^eo:VN:Z3NL%hb) 'k! iM7,*OߝI0*dDZ}CTim:׀+p(įYOd$m!6JU"ge *)?X };[!Zl_0#B=df5'YSV;Z" EKDh}ųLY+{AbdyLՍX;0SvcHZm ~&(by1 8>\vۆNs@\u-ԓ ۉEq-c8ᨎi(A+J+^[Wߜ U lv>]'7jv O>u=ⴭ_]f?qjTU5& WKG{e $.ͺxUjLptFQxll77#iݻ7NY=CՂ?H`w%ʿs\UGZa~VȔ_6o"pYo貋pc\P^(& Bܫ}n`{ݩA$; խYyU(-];ۛ)7\ȡh6z:jceD`ڵ. WnnQv}wbu^,u@{t+faCͳ'ɍ~ ]/kŚQۓGk:AlՈB]H ҥE+֠,emV)9AG ,u#YU&FrHP4$ޏ89YHq< ٌF^Sqk~Րb o_b j:C0AeCH|a 0!MRrTy5Wط Ha=h7gGcHla̛P=tz:RbXC/(#7(E-cPFVX'":ҩeq.; 92O&C4oYo**5ꋳH8~6az 8d">O.KSǧW֍X'͌9awP^ܤHf[YZ`= T( f;?#9D]NTċTP3)Hcx@z)6Ee6?#M3O"LdVSt) ;bo#fǕ]Vr/?O,Lp6hg@w6L_zrn4>Ќ଎p;"J7패X¶5ٷ!w݅q~H4Mͪ9F9+6'g#r*c+) x+ui5:pfST\S6V/j%U ύmUDѐ1<\'&oS X!̇.ZSG+;:Q6"Zey4PO4R?;NjՍ݄>󩳜8A^Eb̍%80 `̼h:Wb h6H[_>> z뤒a~oXVaH23k0&9+H" ]%N4;\UV R!] T(^}8)8X{ { 14҈]/gzNy 4tuzm49J , ?wK9xۿ`-exHsJhlqrk9nn8J ^H0ԶJCezz RZ6b{QḄq,p=ƬT c+~ 8$XpECɺ-A<)Kî-Bs#k)FQ3Ʉ{'@hlWlwB^-3?ɾrocɄ*bX83|mz`h`BK:F P ER5奝(<#Ը݉\ ZmeErgmC/Oׇd95L%G!= ޑh[:,i]L|\&ik(Vx!fKke"AJ[RmfjD^@J NC(n$1͏L"KP|Ꝥ&yOes7sctT!miUx*WvO&ӥrpS͠\,Rq\(Dvg訚Gʏa/_'{bL|2n3r]>(9ŸZ$%q՘ 󑢳䪻d,'m{ceFc =D:MEh㡜>gGUv6 fw\/.Z}a0hvC\_˿qɔ *h7pgU3j(&/ jۋ~l π,H@)gz$ Q~ -D6и|m!ьJ*FZoƟP+EOGtU9ϭ '+b:@:[X !E ~VF0l!G%6 Ews`t_|\%TŤ1Ts\5qx8@л py.㐎 9~9bH^K4,c%XCEff`B$0kbEev}A y$8sfq+VA)$&AJJCnc PTVcahjP.Ynp7P3ِ -Tߒ*sQzKeJ4Ʈ ؓ_NbHL3\H<Zs.u ,ao5Odr PM(@+qn_4i)T$(aE_!@1L=ӧզv&ϊiR|H;JKqE0`T- d%E|ҷ<#M B!!}obK4>16߂-3qtvLcr8L0,C}ly3@4|OprYi/N蜋i:4ü[vCD,c=w׭ ?}@=]9_P#1@ރ^}Y<BE^4>}rR& h'lv?N;OBt^ UO"au8i^~VXnl>o#.}O®!@JZtJ1o%uF ":L A,颼8zy =`Ea%UAmDKn"%-6 p힐,=LY5lt9.$zݨfYQE>7+V>RSieͬi cZSPl#𵿈hRH"fShu{yV,9DqtR3Qհ]J'8e䅓V TQ%_.zTf'fV-p37,_U#rǘ@iu{~]!_:&(U lٷ0W~O߂&-?SH4aou02M$AT|lU {~ Xa:#<o hUQs捡I4CajWJ2ܞ]kDL#^Od -f51Fեc'e|ųCQ8Q %U*]Xoz[{2q~-Qd2;aJ1Q7|cg1I(ZU|0scRSup Vo^Iw|J}zq$bx;mYIws>?({eg$n/ eŞK }Jr%)Yxb/NށRh.yze@!0Y#촖WQTJB:ٰ]Gk`Z[  X|lܻ%iuXm_Pcc7?&iCr'BU޵Xsd}Q 6[y iEY/ԝ#&#B7i~XXo* `e]=zԩ !s_7SmV@/RS }?Z{-Fu~Z-6X:2H?3fbQt0 wj\7μa:mvuRtn #> 6l› rJ2 ]:OC ǚ]067/`_ ŵ*XL.*מۙU6&ny;dE!SP VuK,LWە[љ{SC (fu>:L"w.x:B,@tD *i蘧YS|vpn Lz"G0|)@».{b:зl;% 8muk*]njt&z7jAOe"J̒w[ :j[\kEC@Ю=:;C=(reO$&uL> "I[k= ͭ|VthQĢ]Ak@VuV+C`ȻD.3\' 견-[hIC=YIfZ ;QfJ܌.U3'Au7BxR&r0Ψi]qB}׭Ӷ@*oL,)l_N͓6}FQ&k-}]E['$K1 ]qkv޲3bѐR+p&h膌~ Y)ara{0xN}ؿ2o쿎mobNT:F[Sْ ґH t&ms>!CGۗ5`adS&ZA\Q8sF[1jCADHpPTTRCZSH{n-1B҃]adVou 1jD7d)ġ&}!\:FJMYڮuze6ߌn//&qgסTx]27,E\: S0e^ ܶ/2cpQ]ړ6Syyx 󓶞)j,sHX߰Ec H,lJC{nq;t-q CtRKR^פZz#Yp~%-Sٸx/]l0m^qQa2Ş$ZAFB6>'6GZ_gBb喫&sz]kIǝ N؅6= ʳ- At\ @," e?1-|njL!Ok%_{hvߏ6x0d'ZJ.FYfL,`V ?<ٳkFɠ+l#~җ]a+bA.xK?w&@2m;Y [!O,i @7; mA3/"O CulC_;WozdqLniY=G&D[K oct=KQ& ER$ 1NgkcRU~: g_pBV2@2h+gGjh|KKT_'J$[uPʋzHEiJجv0Y$h LMEdU1Lrj>T bȣK|swbD'⇅r%j &Uʳ9h##Y}m&mh;G7xB ohfC)zK" 6p-ZQ 2P戨v}+IlUYĢ!B[HJbqe݋_EjY{/:63Ƥ tBWrY5rOnܔP=&O#@=}a q` [416~/pءeٔ{{_@>PBavy@L#gNn/ &*! M-`<)Ge<%7Iwjo'6* "rgdgw[$ E%%oB&=4x5E*QPq!lx ɝȨ6.0C>Ct8椃}ϨGwjzHha ~ ]L$fCEmpƜ4T`O6Q:` &c5Q$'NA>,>#@JH 9Qx DjN JҊF`+ WD4,ư\Е=lW浈꡼@dE~6w7!Po"'eоY,8D^GogcnLeFпIBƠƄ)#97oV45>,~rtl`[yNE~^0*7g@/ cu9&f+&mօ7/t=nS?"N9mdHY]y"9]Bq +$a*XQSAddw57LQ을fTim'ɫmت>iNkmm'9P= VTﵬ*J,r0gT355RyGV ME;fCXӬ$KcoRʣjXJ pJuK8oMpyLJҏfjGѧgMz^$w'q5#9Czع&$U, `0ZJ<qy^!$0w`T/lS5HGAXWXҾPq(RQS)EP#.EZZq>A 7@Qu~ps 1k%n#ĕ#fVהM:c#RABd/ 8 ]Q4ZRE6:с|;x?z$ݤSl9~BG tOj'P4VEs*^*pl>W1x _wxV9bVZ3Fܩ?r,#iMO J*6~n3Цǡ$dGg=4.̫}U%=dJhQۖ!v$ * oHv2~T엾fn`JӅ Lj VvC( oYP'nrg4G-2Cco*= lkUGvf} Wjʿ]IݯsXiP!  GF;I( ˦(>WRa.9G* 5 zEiq-[ҐkZ!$ ^%xLS]rر,mG״uD͒\ ^13E(xF$CUWz ې8fw@Xa6l24l_TIL)c2DNt }-^SDn(+Bf<=9mM{*i$Q` $ED[3V7c~R*BFq򈙋zfvoФhdύ ƬR2XT#%UsJKV)ڝHg)/Ma-Vf^SJ&eL2!舛XhLter4QYlKgUꐀx-# l5=gb54 e;|N@zR(k$QRZ As|^C|p;2Lc'.nLMx}vg~x Z.&`_BP@j@+Qy-!|!sk^TQq KG=$ oUhЖ$rq*f־v ڂ~/Z 6GkVz[G_2Ond$]()cܛ±@~lظ?ajAx՟|dslR$]0YщZ ziA-g&RcI/_%E+V[24Rӏ'.ˡ;]=SxSAѧHrPncoX9B4/ҿGaз1jG89!Uv^ jWэ* Zs?:uY:s1qSe_ȋ>+VHi}9*:IG0ƪGfwwgK{C8@xMd'-1YlVC"&N1:kI}ŵ] iXqZX)`vُ%}T22qr :r#ty%G!GvP+kxpL@z`CƝCcUT/(%upK sbQ䯆qH?)0b6f^glF/á~W΢y_JB? e oҺ0m|+K .D~P[ ,~q5ڥcPԏ4F?c73ȁ`2yi/Z/pŴHS=5x5Dx=V1I.4?ۂ~_ڮ6|a_N%4WuYG ' Qm F,$j(ǨĿ.a`T X*qy^.?3zGSNm\ONd}J`Z%;̘dLlZMTjR,\pg.0;AݓB /3Y;LfMU@dUF5{T/CSP\ff!V4>F0WXOOr+k^@@^b 7ah1^Aqx^;>#)fR9vQqWbt͛xi%gLOqj8;ٕhT/,}$n*88 [sTy&J\, 3rPx[ -HA c?`ς>^}Hn䫥jLXeo R ѪRc8^Z/ 9DW;e:uEf.DD9eel\^]Q͒9d]66R*rE;&rnTȄ0fh% TMU\M˳}#ˉ+"cfbi72 bG_.{FA+]v,z1h&> PEybɲߠk1*scMb}&+\> 6v(.ӷNj7W?O%aaVŨ0,[Ӫ" qdeGCc;O+&LI (vϡa}(( P;"2OS-Q:ؔ*>{ҖhnP]Et6 ű#zž[&pc4yV5@=qd185ƯDe^q({X3';Dd0o bׅ;34V+層3F1'UT"n#Eb47N NzP>{˼$U B?$bI$J~d]qqmr D,GOtߛu&a2bcɦ '2DE;x{Ct ÕU1yR:*ې&=hzHwQa! +8ZHe19尗 dӑ{sK12<^%Ë%Mvz[%wkpÊ)A% U" TSb<}r=PFAZgz!zw!Q@MVNߴ:I=Xql%xL*5vgRwkd mU' G'3cEXyc@Rjf80Xg RQ琒&2\EV:XGWs)g2OroG>Gˋ>aE2U <:٨lE6/LEtxTOysCDO5{cb67ώo}%cCe Ϯ(y+"UӇNӐwmvj`V}h.VP8OT}tϗp`^*ˍ(;6S ^`DZJ Y.h7sdMm(pF,_<⍃4 A;+ێ^Am Crhq5.Ȼn8 &#]QYAy$x76""4'a\"_z?xY+76@AvH5F >F, ]Swi|t20;!I(^l'iP^C&s|E;foUZ)bB:j䛼 L9t2n'QwSaY S{7?@Z\p'/S*38#GH!869+BYgrmނne0,( 띶g]'s1+=]O;Nfy!V5~Co7gW䐹L8V<20,zu]%iyYu(9QS{7[#|cN_S(cIMB:m1Lk!Ei~=1!t]D$O Zne&__dԏ>Bȫ}禮J'v8'=# M^ oW*WKړS(m_ *9 r}O(>ŠOtSj8)"488VGm:yTT\ɗ&Τ$!dSۚ+1䗘ͭq! C+S[toZc9}^9;u[Xb5Qv-bh5fJLA-x!\/)/|vlϙ_4P;)Fza\R$:824=8ڇسHKSS7Z*'k[ێअܣ`#y=r|ݚn;p4̝Ú̳У}^v 6|e#b=dzus˔R@,ąT  0{bB;NĜ^M,~M^ՖQypKl-y..|lCC^Fte3gDӴJؖ[ѹlF1v>:mbV[?p3;QAC'A_(nTEuZHOkb{*7}8+aMRxST뙊'IPBTWez5Ry%GǴhRЍ@urB ƹPqcsj|P n.΁J,bǷ!Iwu\0[)o gh^5,5VٲP5p֨eRWcs!6a,t9LM6ήV_`L(pζXAq15ez_eFS  n1sy5*|Ld!x0C=c5Dt0xt3N.Jn,ܩ 9f0Vv>#uz8ǑQ\"U2x]1bUWW+]k^(WsHPXFpW&v1C,Lj[ab~$׼kirL=tWZK+rG,峏~'Ohc( %YBdU(M$֊򵕼|ʚD~9s`qиjI>qiR09ĵDeed< *oH9M'ELN̐eP%$I2}iVgfDuxa󑾛;C=*Nl-/50瞃$b#Oy6;(fEKjVd촋Z^J=u\G}7_ܡuA ACKZ:+ \-LB`$K5Rj зjHOVtO+C@#QHS,M0Jxe*a"f DI, "?|S85c .z%8nhV*uK*ӥkɏsFZҞ{q.C(!8K?T:Î v^)rD 8>l\Jd6;l7*;\xcA:$r9]X؉'ɽkމ~|A kR_kaQ,Mui }IK=ʤR #(LU&TB |ꊠGKT۷(8X(1?qOWם{d)t<ԡY򓤊HB!!77&?QXnA.v4XImRv]XAoQoqY)1`\iv_#yBIc뾇a^`Mq~6-TCaqRNJ SHjP:7C]ʤ.9ܗE& =!?%ªǮ5y@I\mZA5|Meް BK yX _=X{zDqåZ9HpIٴ\G#|H0]KH`/{yD.Nf?de}G-kLE4W|%1RMH&3uMԩBq_LbjLdόcXl7SE%Ve*v]ˎljΜW$ՃeըH]6!|?b 5r _h,#1F,uvu#}1/Tl}c# n'Nmh&2ukB>Oj(JmL'ˀְJ]°ۣƏ6\,N]Zk0?.I0V5@d4aX˿Hne^is ֺcu1@(Ӥ* C‚`L *`^w /?z95w׮!Jk=_sȫ$;Њ$d)Q?c^|G/L{~m&p =puzpIrc0-4T:\W[D>rcm˳-J!TԩtVl&V\~6Uy|O:^G*׃J76@ %l4`2@Tz 1+I>SZFOx`@6xa;g>x7 +.:%>Ժ&AW?OF:6DT8`%TهYUΩŠ zV/ 'H]E1_C4iqp8.jH'w eSBYG(T\l۾2M6ܠ, h6_-%#hAԫviT}qا!t_gZ7g.hkl}%Pp(4k.e-N÷ '&WͭmS0 N8 S-Jiw>"a[i$}!-BhoSH?$؎p9RW*BP/06KOS4rl=jWRe),nT04_h] ~yH실FVdF>҄vފy̳(?DM|՗Kߙ%H(Z4C=HvzVwvi"(y>˥[|YYoq[bf]q}\/PI)cN!xw>tOFpmBD'Z{@3t-eaHzk%AՑ$)d (J| ߐLJi܃f$-]kJ%(z89*픁݄(pP.;s*|Λ{"3AB{_{P Ϣo4zKAnipuȰbB'-(~Y,9ܮ%wȲy-F$Ŋ5EE. r@ɉ+Wn7#qYԳʤ8mήd??Qc/7 y~tĸf$wvbk{:dPn&*[,iƜ=^$Q}'`P aZ1OW.(ɦeBpr-k?#0:˜BLe#]lOsǹ|OU.pDw4Oݴ]?4stM5̓1)a.@ z@K&iiwz,0#@ĚZ͜(*€ߣldiAjW?tTTpbnb{.9Tء1X 7688ڽ !/]:c8|H8*9+P-JAK:V_^LD7g˥Cb^[?7uu\\6ҫ{'3>$,u]~oh*8cȥD6/)_6 |Jt![ir)Y7\zI8Rٟi|/AZn"$ĥ 22$ۼ-5^Ħ*MǺ~8ЭZ|ttL"8? x|YE{zArU ł] ;Þc3g@=L: hoOmte=)%* se`fL&<'M7 65`τhӁ5 cy;xHI:gu`0MmQ'Ven(TWQD-L_yԈv k'̙FP~v[dڄ\qq"do9,O5}5Y18g-)_azğxa j6d-LQВ|uZr$b )(9QCL 2)7!r ]w]ThhWfȰ1_t41 4xDG'1ė{%? Qͮ&%"er p4bQ;4 Cݧd F]R @P?H2RgH,Gjj]51SpceF^A=$:7־QsaUA8~~Y_NY0_?ژ&mAA% {8H`ɖ/ ƨhRA&JV '[|eYD 9P*f;c]DG~ lڟ 8tu;w8w nP]ń03EnʬaUԘ:X< ErCJrw6?AYVX08*=:h Y`-lUp叜b`j4BC-‚?5-W!9wџ]} `WTyjpR#v{Tr+S I҃WՓ77kϖQCyY+ugm$qh#uaUQG62eY+*k "eO4˳QBui0lt)1 Ϊ_n{v+)j(>QBqYTUծZ9~ʻ;G7ϚB^б$wS'1ނu#?T=, X>(1zvBm\"<)DKtbLj= #.. ~rajsxuI~Z(v眵aGtЇIvۜP3h$A [^(+7>t՗'eE}bsLqDI::G~YΙš>0G@y2Ki9źdv9:;_{s%_hX},C\_d_&kZ4JzN4gB %EPJƁ6=Vbr^>]Mj.0b&)I*vvs9Z$:ƝړT1 ̡XFcv1U\W3lm`Ks6{MyqFA ,5RLV>p]YYCd/F:Z] Ayg|te~++:VdL7` 9%^9̚V |!SQٳҀwJМskdrx"{>q2Bs6SoE{SQ!jqOZ61_)ؔN_lp.=/_c˓&Ay*gەǎ3iR8ib_նpጤRne5dbVߩ\B,[Ҏ5}tbsvV[rZ mvmP vd~(#ӨZ%VnVpe'\t|W~kg]e)FLJK9)Lhǵ/ՄBqQN+2\3.hZFx58d{e@*˶N^adlc@3w2 4F ? *Ԡ2X%s;+t(4 ]M1]Q7+#QiH(|q(x>d^?lUʧjԮtOqYmK~$^}wg\ t iؽʚN!@w%>9ih>F?,l~ f,;p천u?^2:R|$)̆S:;w6qhB.4f*u#bP=ɷ\tߴϚ95'ze}gP`+ݮPkX2d2M??y[|Хf]aYk\Śq/Zfun-@w[mu@nSR71>`h _(c\b=Dh  4)2V`ҵI{rÜR0@c\[uOQ>//{D J$! N0oى+'ߏp'%B#Ih6ODP6h;wՏ7. ~PC?F $%Y.ibxl/4칶ɡTC=p ?^֡=N{ i2S`~? hKN:qkr\`PM!7k@H)< *- q0q p@ɺzڏlbm])Zh5iL{lAOz;BCwQ[GدWޒi)3BBRҹl,%:Bu5XlY+Ms+j x`La6%BѾ3ψ jfͣ 4^ )WɀYq @@S*|%\BbGEᢂa|~Q#ۨ*iHU^* ;_gScPdG:5X'uWD ƾd(:,&c>{ED^'*$d x1p`|#6K 3h_$y6ԻE(\쎆7WGYGm UrM~Pgoiv 71{k`~<%I=0dӻ.5Pջo<>"[kTG) g91g|w}V9$8') H*wRDoq?`B_5'l < nv׮EVfIֵF S$JYK9Xtr?d'"jvnIg4jBŁʒ0(&lJ'm5* =wS `{.KWR^TG9ةOu9Trk)K^s `'O 32wZ\C$J+dG:2fmB-{T+|ЌFjz;:`6!φ;1eX Np1;xAd. Î=t{Iu3vGl(k"#Bex`%kٟS!^'uxB›+&vdVDzM#`UvghN[W $ҿߨBK=x I;xb! *nØr,x Jn 9qZKb^ H:!f=ŽrK:ř7NmRO|;MW-f6JdJj/'JQst;497i4rB1&?P`ӕih4wNpȤR||6 5r~c|2zњ史T/`!]=k+U }&@4+&<^IϼC6l. َ.ٜ- @b7^V/8HYFk{kAX1aI.ϰ#ZvXP|P)X=NcsC0 UzjEA* r2rt I11:ڛ҈60 sI' 3PQD:X[xt"d A^@I|<̓דq%pΊcߡ&R'{y. Qp3Il\ VebẏkˍЀc5bvlҜ}/arBM ~aVkVhoύI:lIEƜǃ|""#tMp Ka\DF-fƒ\fh%W g65lizPMZ dy`޵B(&!OT`w$LyYQN-d} ECXT3|mn]R4/Fw%f!eaQ|xeծT E ROoR`rWKvl,Xaq\\}a"/ lK`GRw\qc5B7Nz {6xR!fa):zُGAUuH~@eD O.A-zR< ֵT_A [1(Kot& ?P)Y`Ū,2hQy>CGnǺ*%Nf_7w~jqjZNn/020m%shn?.og&6쨁?!*"vWޙF&pߜp#=s_NdQJ5˛b O *!N(5W7.2+ څ1 [2] $?\;P]_; ߬bf`QL+RPn=rߖaƅoqQ p 4dh7s6m#C0(F=6( ,c@T&>7iY5B̒}by; qYLr#]Gh 7ZSZIƷ*Nʼ3t $0ϕ@Po.-g 1)WGE*<^)Yp@6ܴ3ދ X>Wlωke~lEax6MFpCY0jx"XHZJN]]AlA}-cAȃ_ eF+.w#gsR喷|CC}3}rɀk%쨕ыYLlF+)Q*:Ak޸} P GrB]2ޑVW;aX-ZDYa9KCA/ n'Yz9+]\2Z{V9'#vVi*}Wx"BHݘGhOu\\ +ekJ\nV_:tVmTIUF,(1]ahllcGIADSG,\ wC5w rìCY8R&GUn<.M6Fp%j`\Y~?V O`7F:ej-veeTR)6DSsT|1}PQJm* e0z2ʀ &u㲪+?eI\|lIܚ"g_yicpwG+-v0)aE-c_u (v;u7>LsD;J69.~u\Yh&PW {gE P֫ #k$W᭼(lu5$УzpK.Z,ח->K2E*4䃓F~ 8֠5*SPyg `ׯ>G 2-_`gF  uI'a@VzEPW⭸lKaOq8j˧RU}__S&Sb ƾg5Mi Fş(Ŀظl#RO&:pzDVe[ܣ.~mD 4x%I~R[lּ,H!%5IizIJP]~^x/Go@g͕Y'82Z ;9xzV$GgTu0GΨGH:S @V[_ "`xs&!5;wX5DNX`Z(X0VԒy֝6TuzU&X5&dZE(U͔R_r#NZWrKB=K^$Ugr]n(;4Ez2ӲLyZFH'Ϛ "lL68,^ICT8Yw r$T(.(Y>"FjpT ojV>29 y&Bx%6nv2?F\ w˾hQm>2 '01rI-~/W;:,m7dt:xh 5_I9\퓒NQV=]c~Mdn˲P*5SR˖ OT_urW:(IB=|f .flQmȻwNׇ=fXj3wNg趄żusO܏mCerQdD1y1 XP f!}O7vW825;QV;L=ԥz 邬;*l7x)Ю4;iOZ3 1׬CP@܍yӼ,9Zo/-A7>CkxU3[-;8qRlu=55ܵʀu]5GDGKۀ'pCS>QK= vJ/Qe;50#K4 8X;.zM]qjb{94͍CYCU1np(utťZL疠:yrĠ䪠sA]s?($ga7%ܔji6A^KZ +fϺ̺1!ww_"s:s ]) ΚEg C/R剉lh_*MOi {.Rx߈h7ۋr7<)R鈍z}/![(Ԧq>Dz|Ԝךo\n ޗ/sGx 9kNtm.wS=B6JQ9(I+4u֑i TqR&GbglQCP N:6z0%ew8MAD)lbp()/xBw$S=]㐯Pwm:G~6&БfABE(-19){mi{G |#wg5FB< 6PWHYI}2G8;XCۨĊEN ySz-&= 0E faV1{AVͫ5q-fUwgCh'';XSҖ&'nL&e7Ja8~tX]F[ l_N-TFI ck;¤s%~V-ZEcMr/>_n_=vmocg0oia /196=`M6?H^HOtx^* ʰ{޶~~ۦ'jkX-[>lY 2Ii Avj+9GCA_9NYљGT޼W0( 'I- `]tEAT˷+`oTat!\3c@Ac3V#DrB9#3 ׾}6tgpCCHJ>I:mߩy!믊FhQX5sɍ L.`%{(=. /6Xk_.uJ#yfQJϼHI+Y<) ؂(>)>i5~6I?kWQOZG]ii^̂V T*V:M 8s<^Mթ. lE}+B }Kcwӈl@ !;Kbr;{ѵ؀Hʓ373hݓ)pߠbB뤞)n:LjiL?b3U%gRⅉߔT*G|.u2$͘F1z9 a']$*<5mP`rVUNFdR ze;$J&'u0O{AbZDK久sU!F3w*vD[9b#,Ç>&,Z @2=a Du¦6R&݁ n:mW~`ky} z@y"uQ:KJkN;Cha Уխ:i>bHv8mwE!9=j u/' E>L生tUp̬N2p%B.Rة,7G]䝖ܘ!̘e'XCp@j# PO"#9N2°TнZ7L׳Exf]%8.=x#nJ6:MG<P+{1~ڠ@@Aň(dl,@\C Rz)HcsO[n%۬ŰwJ!@il୭VYT̛bB\u)F^y1; ?SUc<ְ#,^\#C|/DP@ 5is,ٜP0]ySS2^hۦDDg{HsdƩB:~,cavxu-tztzڎwNP6x @5/ohw *:{U7^6VPp-"0zqr`$=ze%4`_sFE恽+\aKcb8c\3O؎aoX!K&Dq43z]ɴa2iGrUAcJXwf#rȫ S=i1ej`:vOJ&^ i3g Yx)6ޘǏ| **`4V$tЯ7V%UYDzj1R%um"MJ@#)/ ɱ+YxƓn1rLJcN\;;;X-qQf]m@Sc2=.C[jg֢:5Z[ *a.V^*RUG`k'qy/N6S.hZ!.h!:aP4M0q+6 ]Tqr8%?ۿBRBݣ]NP[H~bI^m]b.OZ0IB}Zَ߫Hh-HV5]dR9mpABm%rWcmH5W/9xXYsV}`O!W)I 6/$9lw O$gu^~H|Q ߳E,`Y=w,EdRK.-w+؞ '(P71n`syȵgsF6S]]Jy840U@=GH뺜HY1Eh?@[˟2cxl*tT$Ddczie'j岴dd}쀕h9g_`P#k^ʷ1ԍe!O ŸN\X}2<'ޯ;QQ8a1A6~R&Б@Ymd%əb3Z˪\J R C6Χ瞝qAb zkdj_I_pH1L-vtCndAeQN:N"6&.pJ^gB,4mDj>*05Z^((51'7‰ bXݳZ}K}r^̟ԝh޶Om<7%%YecĹ;)O|;7VeVH4yI;T  `{>, oE$yUՓX+S1*M_;=yIaIoD¦Tۜ0tTϟ{$bF1-EzG0L@fm@\I}tG֢}jġne7U!tʼnW W=d$;B_-~PiS@ z3sR%?œ/⧗!$}31f^;ӑ! }&6ґy~ܰY@X\bG,-غN@+Jdi'<`a 0Lye3iʔמn=Slfk잠AE']d<*"^8R9O-Z? A!B/vckiXo j"Dv[ca|RZ;]Ŕ_Ctɠg jf)l'\,۟if2~ԏo{ps<ƝVիɎ 8]ׁxUu,hQiề(Yjc9bsel&E/V+ x[<V0fTǻ  FzF~ ֈSA?$hB,[uN}z@ s@]y WƋC as~[u 삹$#Lܐ Ŏ!* pnVڜ?((Zx4{:H++UL^oOI s&{fSoijIO1R(AZAu0k|70N £ H wS6칔eG:~)^ q K5j2}iJCzDdS0r!w|Sxܖ9[3XGp톶;B ;Q% s| BF- ?r凉,>]vh>fxs_Ivkl ^}E3 oj3 _\ `uчO.Y&BK(76sךKOĩ]wX6yGVJ ?'^k{Ǜ[ß~vܟXn3uQXhwȐ~oS2╮T_=&JKx 84@fXA`a,Jw`e Z:ϻ3'ඍҺX" ؁)S>%wW4>Xhte0_fjC#ru ՒT' Tf #\>6d bU\o'[~aTUҾ; 41 ެ\%:Gmi`RP^$gDե7nx9m5u~P}:Df!Q8vh(Uh 972DЭ-(oʪed-`3N$fg d*,vIikfA+KYU\}iw"LKo>`˷_0L l*Nhſ4C#& ʱPeVŵNtHWWyAwF߳jcQ0An!ql+\|)"oZ; |)@Ldĺƺ} ,S䙲I)rˑY^[aF@-rҞM]qX3YOɱDuZ\f2 Mk^F&"oh2Л0W9 hHw[è $xC IieܷܟsyϦ|(=؜ C]r.TDzboŽcD;'fT+u$>!e߆ڢcT:rH1N+kOK_s8~싏{aRԺ >w7y|tT @R!c}BG^RY΁/?g$UPq۴4%w;#vBkC ¡Chz?<$C6^3#͑U+k+$pq]y2$:_U i7YM &Lka U]@",2to*) !cYQ4S\b*gED^)$clij-3q**_<5vLu7m{c2ew Ӛ5h ?.m(L,m,ؾh s7p3~"PIJV)J}t=ں+=:8[#s |ZBB~! (”_=C\%y+rf2q>Ф+JcHihRYK@ޯ mfe(6ɒlp}RLs(_zӃ-/ /E^'̱O9Nrx4 Q0àGWq 83T>Ɋj ܳnj(f%Gޒ0gFU|ኯ"-j. lE 0a^ZYAypX{ss6$6K,,)CN8VL:fl/^>r't$Q\{g 8P#gдwU[VBCU$Mٗs19SgNhA1~1% ㄉid4h9KI9$r)0Q0 2qDl`,+$8 (l Ι ϧoy9=;12rQ2'/xf->[.58{_3n?aZnN|ЅLn u-_#_Da14 ݫ5g˦!&PvΨQjgb~=^ ℲsVYq0t#&-3UV1_~-8|8v\c>3?{m9ěx.ڴmۅ@10IX1&kGn~+M Os~]h>{yPڤ'!5;Cw1-12hRD! :WY#.AF\ij37Xan40nmeAR|VZc)ISYUGJ4NtHYUBV9sN#5jbT)":Dpf#탵Wbo!iZT$ͷ4v_x5e"HaÂ$qFR  ~'](:cpB+i@w- 1IZ 3ԛoǟOYF-m7Nt SJG ? 9`LVf>Aǟ,H-+Ss%ߣ!m9SEMdKC=1lAR{FY18>Y5称kEZkvW9̵̢#IXN/kR_+1NWy͞~*/8BP9pͭ>oŹtNXd|љCCXg$Mcލ_?2xv쐹#|XРڟaF4qsE+-eM(Ef(OޤDgPFEׅ\.=[Ag؈D\+\(9IG@dN}gp[X6&yth wXhs܅:Y2 jF /p}%ScZt!r&,Kr GUE*ɼ3#dsƪ4I$[*]ȥNx("_)7]yzthe/0x㽣۰+zuDuu*)S{J_VqJwo! ~ei\G`=uXL@hj띀5/D-QGxzw#4l"zO&нΌr#ɛCDGHr[(bEbe=IC˹~UuY} e;7s:Nъw9@4}:'Wwh MYOE毅e eIo4[M[UՑclo9c gcܝlDҲwAL4a#|e75 "^ۅ(c#q?( ޺S|{{PDtw-JNupYPagX?ǜ](x@zMm}.㉍j=2}QlC@! %/[u;b kijwJ7wѦ6rMOL 4H42)ŧ0㫨=`Zzo,:sE.>ce[+B(ϕ`SB[lgĪpռU5I1xftH"

3a}, QBb e rhcƛ@f=Z:Q86]:<5)C(X_!(!2a W0X4YH<; yܓ>orf)0B"Dkw?Gg4^ExөގJ|, [{=OQTh&'rAi =9y+ȿi-Ss|o׶Ô i6+'\0_3p:5Ip Bc7RB.$GsZ']˨:pawGO9E^O5fq ;50jN 2魈`8b *3L3F=`,mW׺'ʔÝv`us ]@jn 1ϸժUjܔg]$C:&Fq(<l`E-: PP!zA Dn匆n~ط[EjzgFZЫ/;xyGؒpO5߫pSg {) ZŒ+hy!i]֢.^Noc%o[ow6'FKʼnpqpIHwB${sA5Y! W K2 Ͼ*l@g}*k|vb OEѓAp"@>rCH2ʷY/QS] ϬJKX!' ,'C|# cYEOHֶqX"Jy> K~/'uI>F_K})/~'[OғVHs<&5`{0k>S1_#SE;Ԗ#Z/10XJD'&窖KYѤ(GLB8 m f!nk;*E]&so-5 0]?C2xSssϾv\G|FE-HLVH0;\Z7x KF 0=*/l"Y֊Ze>xk'#+1vG >x-'wb.{B ɣ#Us6*Ltx=-)YA.A]j-/m.?+:yx(| [Tr M`_čk !.(x*@?m@x bz:aydEF\UZ&yM,DKDc(I ]'u\QQb-K]/M(B5@]C$U.Xc̙d dz`,҂] nS(msZv_X'3ZMUZ-Jk1^:=zlה&#9ޠ\h3F }RWEx$ٓzaȳ|*\]Zs d?hw·mʯ,mzo릜ބ086+srt*8gSD(B&LCնUH\saIXC\ [X&" ^ ۢt0>>5hޥ,Vwny mD53He$$VZUdmU`3󹮮<%x5u\񜠻U=2ǃ%C~.3/AP{)\XEU"9fȮuPf}z!nK/Mf j6gADZ?&8p瞌ُafI$(wiPO(98TW![6ԷHnC (=_%1Xk\>]6AM83 x1jM$#혈2-!'s 4BA2_0(z&/e/(eds`Jxi}$AՑs%rU,E!+%uLQ. Iz ך56w28wϢ޸H9@ct5rIYeóY`0];!$OB_:F뒾4`*]ĉ&nKnYG9v=夊וflXJZ{)"]J Ɖc!Hhumaض M Ӕ Je;]yN9ğG-O IL_Y?vm+iZxsSJwT1nBPRn>a@fFt8;"߅#јy`D(mkД:1@ѐR,j(:r 'Ĵ^OYL[:6#VomqF ~DZ@\앯{l:3Xmlɰ` hW>5O (\yf`Kސۅ5%b4UAM/{e{4۠'s NOÓ+w؅!hPșB$"P7T/*ʃ/&{K#%pT 7hI}X&Cr9s 7keYT#OXnJN5jE ;a{_fTf]~ kNdym)Vcuў ߤ77EۨzܤMĽEh'@ Ե؆ޜ'mHMQ,q L8MB2sO><.!”oٝ(٨u)}`T1 lCf:=F^N)IW*MjO [MIclC.ؕ+Y w9,~.)s] p ]iZx%1Wyj1! !E'ٯ-Q+o2n4aʊa ܶh_ۘO,C4quJz% FIeb"H0%iz7x"2ed#HJDt 8k3NLۢt=!շ!k:opD4[OxHx#$iL~Jn -#4@xY*uZd*&q#osq]I*l vxFz)0tf~XL&S eHֲC]et4Rdo/aJ_s S¼Dz(o#dFkr1fM28go4Ѕk•*$}o~S}liijL֔uH[;;;"EsYKgh{W(pl,+\]EI`i1;^ftTkّ[NUi6mhZWR$ߤA%4'`No/᪛̒Nڳ9m5a Oc$?N]3pHf_34a7b{Ү!1QTBK+G~d 7ULwh!XV ͧ0<'[+8])P5>-+wEHmA1eָ>vȢ+`T#uu/%ر<0k`k b/nNUh I:ej9a!݂@~E}®1&J-"\e_TFu!';Vn}{[js՟L@.C `DA?4MNԟ%ច`ظ֗ ei¡M6fT.OTM#R>q5 >%hBzٌ%䮅.Go ޼'Mfz;鍒0Dd#' 0GTKz9 U|V ߀8x{B# >";I(e j_<5Zm(!lw.-' >N&y:o#';kbByMKVNbUor_gO;t \׈*Ӆ~en峰+zԥU̥\Ax~pJi-%%kAÀu -}ge!EjĆs'va]tFď gjkp2eG[͍H oftz4FYۖ^xzZgJ}̀_,osC%+u!hiE @#7* {_=}>]xT" r*LU4I` 2m;͂ł-n*,Fl, ZᇑՑl(#" ^ud,6L(ETyPalG?:9yqd(:(-,Qv~>_N!] Lw$y%<~xM4_{N[d&U{(w|iuW Q\fk~'!4xJrtfDZ1hAQc:Rpu] R m~}G,?}f53+WC[¤"rRơ{s?-_oOc"h:)W%~sxy8h@PDKTsXLBڬߞrQi^lp9Ѩ bN~yuf9 淼gTՃna[W q@0;na[ϗx&jfVQ'C3`Ĥ4U׼8=*Fth3hij]B6Y%11Fdi<2O_v p@MrwR-ۖQ| sT%ihkʮaMD_l+ufֹҷlߛؑ@Ydg). E뺊KXY.m4k\S9$upƬ`cϵM)Z(TD\aP)1s-Kj2p ER uEYXlm2B _v>G/3eB~M9{Ӥ '4TL{t(o4n< @*۾@i1+d &5o0bYhνqI"s-YE^euāSB||" b;Y7|vM&!GYYw}>ke~w~aƳHYWh>‹MQ~£8`WXo(l[e) k OiտM&64̍kZ t;hg4Y΄YPB޶jS 47b3\86f;cEH4k7PsH9 knj*^"5+4_ l}-.ޖR;6rbo:v]'r(OoU'dw벯̭<=P*g~Y)[$` - w=j(n;q3U1J )3ٲ4o gc3EÌ|@Xlܶ< 6X <_8bb2OCGoS_G`*ј=x D@6Pgu!W\³= {o 3kJ[ kQtf/*c:%i,ȃCJ 4%%:?J~C`|h솘/yv1vEOң%-iIp"MUKUJPNQ^PgT[%Z9 F(;3 d} rMzE.ـʠkhHȗ-}cbi3]n<|(uy3ZC• 7&Ep 5LtkA˯$cE1 /zFLL(l=T@T|lv˚JBJ@ngf;z3F!!HlCHN̂tԷtrpE+b 'R\_WdQj%D<ݬqL;М޾;`J06?1 mŘCRϣ,.YV\A۱;>:wa_9y2qkO#Llo/&64%~Mr>i@?Oʼn"lj7TbVV.>k9ĵo,qXs>eP|߆{!UkTFJMI_x{ޞW(n7wdzU#|A*/I A=) WyʨX׶6y.Z;;Ss1)p0F° Nsv@vZ͘-LCЄh355!;ޅ֕NXkR!_hɹU 9@<Oe A %Ǭ)s04Lxucƺxs'LL -H^vfꃟ|ie4HIN湑v}xQMxYVL\6#2Z#~^ 1EǃɜQ53Va"]kо*&;!iot?$@qE@CLlp*}+o쿜%6tzUO`S,>)9SxwrZdj%ƥ]/x%v5!⻒5!j";ԥtrG$1ihC`ev87e~sr^4VYUz~>`bB>UVhhf'l՗ zNc ro/#B0A_M@!&~L8n<ޤ[wQ\Zv-[p^+ M e$Z!M;])n `1[ZDg64`f+†q.Ղ٣a`ڴ̚bQB=stNz:\n ]S?[kYbV vk0oD `,_ d'Ct@wyq=ơ?ڱ14OY P%cl6a>3iMdb^\kNUWSphcbj۸ve8?inrA|5HNJC HD8ܻ+s›b8yvc&H.tK>w0}5J5qx@&D}JOD;)^KGj&I}n{p@h,kdyNcY)hci95.DcSQۣЪ|X;:RH&~_ַ_2:fyT-׹FVGt ucRq*t=>XAh;CN"7Wo99S65~P/gLZ@57 Հ%*_QL'%\Uȿm?5t] z±_uP-WEט@qoJ]:M0ma-9@,Y!9GhhB?oܫm62賟imZΪ}7hB.:y18Fc*)u曣 pu﯍ *} а2mho2mF /9U{6 0fA$?.ˉO-'nK=Jx%"#d7=.6#pt!LM3Xn&ݜ<ޭis:q__.lP40@FG̲e0zȘQ){ʼn!XxU}$LxM|SelKeZaW&ɅOe`xTJzTKMg5Ֆ;5) @?! 4ʃDt)l~ŵ͵WPVؖq^WWgD7'ݹ01*&B.M|-]&()֎(;'-.W/'"l`(ad3>^MwLa_|<]n5'"<qؤc M$Dòߣ$@2Q!3dT8m5/[9tB߸g(D7F~5fFޘ G/,ַEPbѠ7uj>.ݰ]ټ3Ւr(prO_HFf`Z,j5\u&K9Y!})㣚!myuK!S- @3Rd?PEaP<ۚԈKq58O`?4@4}|+,uul:IOoF <'c# j[HBwާo7(~^v)6q#DQ9N~PVRXv՘3 f{ 1a3G}8y8)\Ԋ Kpi%Ɔ8$UG2[ I.fs*I?-S70J3*?a;F.Yy}]dʰ'2Uz&_60q _XYQeٵE9;%SmQKoN&㦓jGN GFI_ xy;؟~k2rSQ_}nМv#Sseuq/Rt=}FX5׋\j`NognfUw"HjH>Qޑ{ra]*h/P' Aλh3o2R"U} q62>@2s7~kf Yж(qJf46TؐA])ku@S-^̗jzu$Yl &KS޵5];#9Q䥪lU"dws-_qqux9녝|]?vl.nC:],oNkS.W-̮N_ 6?i~ p5k*Gfһ|^ҕrA[^dN{*xͼDo4&H{X8`?FO!dW9U ['Cq:j'!D͟u yלC9T͎(RVb|@r|l@T"FňO D$0=Tp_PZUq -C`XM657WґS䉐 ?Bn$tS-l]tSMg0Wߔ7z!M.9a'lhyw{p.iS\t*O;MY *tdƿ5$ܤW BKq~~XM<w[}l#f\sKHG:|̮H`'yUZWvav6I!L@*aЅ&=oIl RիZ ´Sct]w(ŅtR/ydlbhdplr¾ ~Ʒ.| G缂@+x_] ayqz.@\ieA>r'@=u!aIMBb|wfYsk$0'NS6K<9>Geo#BAtMokiw82xC7-#aKT?$JN%yM0EP?js0ʒQWeO@Ơ6[G#nn kB a#aCIYB2+v^8]!56\^Ұ~V8GI"?%b4[=C]ͭ*Q=,U蘂|2V!n}VJ1@e YrL$uYBB pB ƸJk?P,?սsC VytVU&pfuWZ-#w|Nf>ł _>dm@5fgIWր<2R!&SZq#:н+0[uPːnN4Ymaբm's$KEW wr!JApU^tK6Tq]\ٸc˗?+rb{EݳcKa7C$N[6HX|9T*OK9Lˋ{T@Yv$6LVDw2S(gG1~G#YKߒ X>U}8ΨY!Y c*06^}2ݦ}{ FHa*@{&&p1s/>]áUMl$zzyNu [Wf[+MqQMVi3cY`h':7KT455H2 LaIu8K19< ;|1szmNc,VRH]cĎu?WJNQ!Z)ekd@$Lی`d`J&m Z4^Ӟ%jGr1g!z@0iWʶJ>CDx/qHf9%i:(;T5qy3 O X^AtGK'f\Q~ٝӽБCB+ٗ) #rQEc#^PS|:݄TAdֺD;᮱>7K*U0hrdoʊ/Xt+/D+ڧP>ώ]uS$?nJ)aܙx\M,EaG\xd5@oZ0aI(8opkD+oeGA-i,ԜAٓc⯉ڇX}NBc̔3ָ/Nxdǯ_zi,cOⓛ׆7&Rq<8Xd9K+b&L9sXH5׿бO7Yiodp?Ua,"ߑ|iVkna1ǔƺxΰA#jPUŢ;5e`H%ycv?DTl 1 {Zp/Q#_Y@ߍX8 &6LJDZn!ƀ^RAZm@Ӌ7Ae_,O㤗"Z<.oW̓{`5+iEh|wT3ɣeE?Y^8h}qt|>yx{jVUNIӃd{A&w/E綰>, .,VsLkR[Y#o:gG`b)Mމm_֐]yIOt󕀤.xXު Hl95\F!VHs 8]>EYFDʝdI/vӘ2aOW7!^9$ֻ~H7ës q~]fQ%Tyzl 2BJUwLcۙW}w7?mQahJ$| QG~y@iiGNHWt_}v;'I*xR!"ح(Ge}L^[ULQ EqUL4lߝYRXn 4 V)sH<Џme"yMJ,nn33`|I5Dkc6zdi1#ޜܲDj.:Z )lzr_"3jmK~Q#+h搏cS>à.W[މ*bc6{ ,mGy:x^ӛ$稷'٘; +<Hc@nְ \[kg!9sÇ4X}lXٹZGot.z*_vF]˒h % IhQ Qڕ:DfzE9 r9eoli[G8^2|:kS_UvMGyZ' iUL*) k4HAd˻-P&d<9f4k'i2}-o:#XFl=˫GXaɷM=|Տ2̮u n Z#DEʦ+ȍTd-)@ߌ$^-oJqKuG'% S:W `;(yLOUAEoT!7e;+-&Z'gPGQ B~{dgmEgƤ\to.ԍF6T(ȞpcrJ?/w[\a&j6w,d/ve=ԗpd,Yc/u19ѱY=b)%!HÕ C^W$O ^5/Fͪژ=I7NgqYTdĽNUJH wV$xA=_ehxJSPx7FHrҐr KIolՑ.F^<ϸ[6.۲iڥιf %rC K%ŏ+a.m'#TJ>KDWH2Ф,ʻSmz aV] 2A23NR@,n}tA"?Ib9CU &oaxV/|9ro"bbTrOxf K0$"^[OL;_uYqC1m\[p<ެXT UHۗiEQٳF?۴Hd@sWGg@`$tL!i{ `8_M$y i~5%nS2Ʋ9Y"ɑa `ϣFT Dwp\ 7tʣ7%:8 5 nڴdh_dK6ҷ[e-=P<{9xQ(E-J0^~1+?2 +((0pFA-Mr6d*Brjxyhƿhkɧ&QM-ٶ-eARUxU2 l[g `;o3dxMsՐij!ؕ1;]XM7jɗi82q& j`6F4^vpFf14CZf]NBlB?X:Jڪ*Lf$p} 6Tc7l_%\3JkҖS-LJWgc4 JomuaVLZX0Cz8Y@ {4|/X})}~+Kds37KU/H"A%>v !x[!b2ퟸnFC?2 J8kc*űSqy}Xa1؂KE?*+QTm?J9{[.EgBO*(4!2]dw[&G|TNLKN cPK`e=%;;WYo7c \U4P/-ݵ::Z=B\BCv/1) ()A0L|.^yJɘDiQ/:OjI5Lxehdaf5Vۉs(66= PaӹFa 0l_ʥvV XCсhڀm84-]SQ*s_Oʝ҈ek-ԉ+CeR_*?S0JH~/vvrs,F~`Jt3FItoJyg%:%3J>>QTgo!U73W D%!b' )\Z[KnuO)0yk8eg^YmŅ d$+?}r>o:SyIh [=c8?b3E!xbW*ɂY#&{B)uSAT,Ms=*@Z2ވ/Ϛߢªem<2# ! Ty;Q`Ίn3S#E3/:mJbik2UR[迓78vdoO z!^"Cj'`|o/+ Eجm<0kPfcaR2R{Knd\xJŎ -ًηC>i?*:69#ۙ78̮Nu~(p_VTq};ڱH:ߎr`Hkꅫ#8lqkؾ%+9; qA:ʋ,t 膔 u-ӋOKpNxKFani.o]g!*a8^W-SvO7 3ps؁ 奠e[` !o-{Edf"58pH1y 9JJ>_2#qu[c)c]h Um٭6mtz㒦tq̴ {}yT 8+H uP\!06(?0GH~1ԥY!K*?CN#JK8vݜ{V1<.k"1 0J<\FEר^_~n9hk{&W]"b"P9?DtMeKK ]8 PcCQu05m"'Ff-m$<ӑͤJ8r Ci].CE} ӫPeՑM1ױ٢})dCxYFB/Yo!AWf^k@ H^ gصxmجвlf%pf$L1uހ'}gH_ ӕ \O7W] ~۰%-yTJF/(+g)OOC΀$D c_Uܶ}3`j?Q u3yiE-is@YtӘm z΀1yJ<,#%7y^QfMl|ڿXy=nt_ސf(`R> ݛ$Vu<֋]Rh',} +="E}م%X$!ߵ,),@2ep+{}?NMgC sEnmгi|vMt'p^s':}E'NsIkWlNN,'-ۇ֨hasm$umZȻPFN8Hɜcb6{6?SsPo*r19-6%Gщ~(*]V=FHFx ۆo5[R99|nlw'{s~tejmOMp+we_ZBz022J?iRy7XStDy~A 2v2)aiYqgҧJN ;, -l m \rY@M wToFb6kQ}C) g&-"',O0ŏ>u &O>(Q.6xo)#;h3ҷ^}@J| u{S?h&%]\vQf-Jjwe Xal4;6[.@l2{wKLىgkms0*e9ʥ(1m3-5&< =6VOL'*3p43QQ]D}rIZd'kߢ']:O8oh:ujw 0Q`6WV CD$0&9ݙ `L#!VK2u_Hiv^_̇R( oX}醈)wGjtau4>SQf-rK &ue<Ǝc}t9sY $q,ސ4Q]ՠLB>ߋ4M B'f*%RqaWA hRqw͸+,A1oC& 6؄JV 2~6v{Ed;:]xeFENȎ?q-pY q"MP@2/~?/ÃqQ>B_oE gl#U![;АQ35_~rו.Ow\Vg3pp ,FMe8-ǙqzͥT{g}KSD!4lx8*/; ꅢ k/x Av621E,1,Ls ҕ*gSXz ķ>][G=)0sυ NwFoQp ; _6q<zj7NZ/VQs̩@q+jZÑX,L>jĜ[G34d(1ҥoo3|w;jBHL8s1A5ޤ"Zq o[#Q]Ho-2Щ4SɜBfϔ U͚in]J,X>>"U^ֲ۶YetV1Z Jv迗lJO{B8n/{SIB=}*4' Hp馦˽uw[c}NX͋u(Vrľ)b5\{cet^C_ vn2O瓧h8yЩ|AAEx ZՅuGwF`s^ 6dΉ SP?uR#;Rec=0V\`ɍ"7}utpmCfϽ.pUuVnP"9PݳʴKuE ei6OBq&He80`$rK ڂD<.I d]U07Vh\vIߖىmBN5^ҡ/~-j!=<\@TՒ}h Xfs\mY/8*ъ0rVޕXЂ5>sϻQG^!֋դMZYpi]XgMR'_49ZFڒϘF"–co5MW뫶g\Z *}ӣoEBaa>pYXڞ/q=ЍL4L(l dbȟ'l\҅Ba˃p;*M\>:G<- 4%/yA|mw0`'\MigW犃ZmU(-;suGiV1-!-F5D Llbs Qt\v*1Hک㶢YyݚHHܔ7N^-=VN(u"08kr@ԝ^HsF#+&灹*vmÓp&+εyΟ8aoOĜN7K(.ѽzDl9H^^u ݴ| 8V"oçlx riǮ&K[l+x8Ԫ ͟},00Uv%7 ~Qp@#hpϓ߭ (:N?Q|A#%ٓp u|~R"ïQ34""%$BĹTn&n$AP %r>^4me]$[Ӯ3qd|l"h.B0YO_Ch/?HSR^2C݈29b[`0T< 0[SX2}]O.AVᯒqρ4Jz\ϥۼ oQa2U=uz%(>ِYXx y/ t!lO&H߾k*Nm3Ӌ+!.2XSt DNz"E*My[YOmr_C[A /B1Z z{-2}ok*z9|4=J>".,@k{.k3}ûO YH`aSp,I8cU20G7" qP a,ZHj/ɸB v9ITeHmB4YxND`fUfnęaVZ*M#M` hwߖqs iP{ˠ=FwM|cSDLYQKw9 a1+R"r\3 ~)آK"ԬNޏi1H {@f?kęMTOfFc ,_wȦ\_IT7A5tOd 3QS90W*?څ] >oy:dL\_)4W@J^H= 5΢ӕe" u [[֊9{G%쩲)+,QW3)o‰CJDTrSm SytU'?Fi, B/\H, Ã_oayN>ZP0;=>YS5PO{<0R`yuon%2kaKqo:Ћn,4vgZ2=x- Lh- V[6%AS~ 9M 1W}gԬ3_JܝsYk b*hi VxևMdH0rna-'X^[&J5÷zrbBgIim&Dz^Iӑ1cE: 9-hdvY4be-ﯩ~m+-RJTbFl3i$3TAQ_'6.>t={=JFF :IRZ l{,<$OX'&b?r7'UN51bɯXwIr'xW4G-sblRk嶚TX67L1r@* 6ey^[ڟmqgSRAmވ=aN1$Gv&Τ l^dX/[4LETȊ}D,Ԗ~V[--O;gml?ZBmʹc0w'xg}1EѾE *i 5Tu^L$gQd*RBWF Y5z- +Rw*$ Au.+{Q7@:qOizg星ľI6Y۬C練nwO mtF!Xmi8^t亂UH2[- Og-lL:YqTԀ=wI$iI(bF ؎Zڔ!o!% 7xJ~tC>\|Px+UȤ UPc#%/jY1kS р~DxVj9|c_o{VQ/XJI#:h9 ?7:P]Qo iPzYUx]B^=80!\VόpRmNu:0\8qoJˤa-&>L |~ZtɗB^Q\McqfDIBV%]ou  @0[HJ/&,yVRC`v?|h9ѿY m2T6(Rmn 0y\;-!QiL+{ޏ2 ;`?`9`FV&)F9~8MVcABusg'`؜>2ֳ+^QG9F 2>?v7_fIY*M|ˆhuIup zZuv}DDOV.eO 3d+ `v(AH:,qG.UEK} WI&jU x~HtFPxw.p1} R F *>ټݮ}5pz9i;Bg8> +Xmvd( %e G|UY+d>e\h]G B >hm!df.v*&u+Rsf]%;I\idv͑*J;X6a7էxHQ!Mq\w2[:, Oȏn〮a tw&1<3A: I"UP0t cRr+1C(wh^4^4A7 0:;X_ +UƎGFv^;^OupJ"XQyNEN~LDM%x؈&?v'u{ByBUo7M j,ZƐG)*.1!(~"g!Dnd'_G*p &CmA)a)[Yi]1-xlnVe?])~Jo/a" tDR e6OI9~6l0AM qU}riMy4c[mɔ{C|_Ptbm$hVa֨6&SJfZ*{†K1`֝-Y`wI|BWMXE+>Hƌ'baƴd!ZN+$@>t⨞ +2 C 8459}CvWK5ܖնSGs*ӆc26g&ڃ.۰ 31C81{/>겏2A0KҊShbc!_gy+Z*Ldͼ6B.P @cZ#ωAId`ޡמgrpxm'klX,ʦ $65yaũ5ԑd\x{de':+ 4~q\g]~75W]WOsfs/ `eW+](£ M|YM #Wfbk~rc3#Jܧx@٦ZjI`mث643M^,cXeݬd]$4a#0*<#[V>`e@ો"1Tʃ ãer4,j|QZڞꋠ=VS\ 7IPzl 7 7H|t.V*iwP}'t ^HY8'b(ֲq^꧐c+D%i&ax P' IМ#xbһuڲ=+XyJĭ"+ eLg0v4. bHޞ(XQA4 ,#QU Da>oEM T ZqҧEi;T!~(h~7ͦpE#* =Ypy'90gz.d'v|tCxl,%'o\"{7aܶFZpKi4&@g:*Ynqɘmjje!7\bx04? qi(rqg 9l$S=ӓk55ذBkO.aaȞdxbz|e2E2݃ӡԌ1LbQrC <a_:F$ EVz x\Pn;s^69X5yp*;VO>!}o9 | )bcHbk8P6/dX_wK\0&#v| `q~1eVXy3e,ڭߣxU,IZDp>t1h8yъ_'B4R~uп}nCWfpXlF[cSM97z$FYuQ_&r: 147**}u_c82)Xp5:7lDF2;db0ߖ͉3s#Zq U#s1 7M㸖6E[S\4}ټ]t@kSThv~ItAm[ qB5_0CKHg*eFgw\? ;T4% g'TFfV 6C2#N*xn8\{jOg}rjW$=Ϙ&*Mm^g6gV_ GIr"w!APl>%#`J 7#ӑ_K:m|RIB8DhT)L_"5)5(9Д܀E>Q6նo𪀊]$cХMBݏbª `6&; !N] Ei 2s͝O/2HYE༽߶ ZN97; f8 :[_&a;]0`PʀkbEG 3›aVe9_@Jǚώ,ϘvI'KEH\cƯpgj|uǹjĝqhs4xU;enį 󚴷<?{T߾KA@(6KRVsHatxpFҤR<&J1[lrM4r {0&Z7"ɲr:EjD9eyj"iPΐ`{'PQ*:)(,Blr EGhf~^nCnrv^q+dTWRG eJjc4/{h$|GKR&Ce:MfO,?Ce=^[gKSc r0*!.eSQ΂İ/d_fv#뗴4։F7K!-;wE zAaMCI;EQ&43_-gtslNB'rC=Ȗ⢋|RB(?fWPe$.d^X%Dulv-"ν "71\1WkJ\4ch "0mB}gi΅kI _f)'aaNNOq28Ne_[d)m+gBEhZ/JY. (4hʠTv{apGU7"mhgayC͙i.5% $|fQ)`wl"^ +8-yO;c ƙi`Έi," ~%%mr߲d}B1'\s\_Dc& U%}?2/<'FDϔ==+l^f؏H7Wq/r4:Hк΂cVuYuq\@4.oKIG,s2čєОJ0T<T zs)8+^XTsl;4GSvh%:?@,+!+ib@ڧ[t=/X'S DIxDiҭw1ՋhSSHgqZC^I'h]Q{6ќo9H;Mι ׎똔YPF@F U'5ajlR6lb,_~ڊUu"ث($iƒHFSqIF>k\O5%^-$EPm,|6FUsM.qOtQ ~Y*L? ow!F:*Z@ﯺ?KI4W@I򆙼vy0ӂ4G5R^ Mh7|נ';9}ΙP>vկWc2:"nqT?#RH%%`V_ZUFs1C 뮄 [?⨎9!䁫{x顜h2# AvxssLK]w,i;Ll?]U RrM=LW^>#(F!TC|a7S#vzeܱMd ..L PXf}y)]=ҽԚ/FbzU@WՃgݵ׋WdŀT?96g0?*$`>,6l3eUołGfx3㹶];H{8\AXgekd";ߍ g1Ո+Q7@P&HBd =bAk"8VH ܹ#UV v伝@JL!d.ۢy'0O9㵱Yԓx>x.g_ gȑrg3孆2 _\/f"QF)'(A [E^4>עЕOo$R!7Eq׵В~ፍPQ "~ckpRw[6h0J&SǏ|fjf6NIUpS=pqGߏCAqo Gh"m`c.4U /* SK}ww^ێcvSLkO%JMjGAZ,T@MX@GR?8x : %ں3 X~na>mc6J6z،3o_fɿ~GOIXcɃUgzмD!+0oh .d÷p-< O 8`yuە9 [' 60wH`"?؛G% )8_WS*IE vߎIsF|]=??1rD%[n )'Him2\ s;\Ý;šxCR {I.{+KI cCs]d/W%:oxK9Ϸ+ٺ)զ; z=#C"Hqq :sutҋgI ), %Af9){}vK{x8:AG&I3Dk{E=RN2^l@:TcZ+fC5`ΆPU޻,_)떵q};ۑ穩d;EWsZ uS9_8"Sjp;%D#Vzl!*q3W:GUָ~5YӸ)Yқ}\qIg(+abOoOf֔KH$-EӐ{>n`V04|/^D²]ig W8Ga } 83׵gi}8CE^s6]"m[ieǚ5\@qv%*u76k4ݓɝg@N:D!"&p#oA#Ⱥ;a52Ts󯃵̺͌ peQ猁ٜ[trƒaypuZ#vXM\rK"gruB*j"pY͜۝hmx-yL,Q7x^fuӰ& ?ؔFOϫ~tٔ3bw:\td:*L}㗻k0i14 v%@T~a5iRC˶fTdi_8][-ӧ_tV[v@]AM}{/$2]GW=8pARR̡4~xQɞ)aߜF&9`'KfYa Y?^)7fu -O*;'!ȿq(~=~OՋ h"&tn/6O(7bB5DVaMZp @ͱb[xa-6'ip ozL.((i|~jqWoz8h :t&e=y@5=/TX)#{䀘 ܤENz/Xqɋy7@&ɝ; ^ gq[b`?L0Vj|]:S|.=mu]sQW b no 'O l&L_=Hr>OJ;%SH;(}xMnORt9c'viIM7sc ?Ks?Jd:i6q${@hEa+c֜dabJX2Qbw.f43 #)wTZ5BJQ7MNlɡi/%o?ʩjIN >ә/n'Git=CA v^_ #([oI8^?+:˗Nt5Q2٢JhnYK["&kXbw֫E,QqhwEN4Jlh]!$9et&ӁUZȡ~Rk]٫헂i >^nƓo>\.r6{۷ B8uZY o0\+AN1_mEcVqkaG5ᦨ^}{_3]eE`:e{eܪlrO: *θ[4Ah$\2'hANɇ 0=_1F-?&#rQ2 m2+a锓<ͤ(,h f<=c$K9!V%f;~%he!RrB4ߓLW p6EJU5<0Tdͻ]+$IsMQQX0ɗǮ&h?h *A=4q!6 DjPSigWga["zj\Җ]:WGM#DZ5 9S a(\uF 9{C2Tⱹ/j jt;8>]VX M3}kNRsF (<'`xWN{DۋUf3<@yWbn9q[b;=X8:ߣwVC=\ǹIen,DӤ<+h'c׼585X}Ioh7h@?[)ʣ)dn $;UٵvYdmhU)ME+32`gQ76@ ;WQkbЀYK8t )if3CQCN &ԻeRNdd&6h]|A\9AĐvzr3&Swnu /7Kf,<^>])>SGe][<iRE5ֽc88ѩ7%y3 1U>q)!e{Sp,aPP8zO)= SEPtW^8^&HshXTrԘ徒JX>]h{r@pVOF> Fq4  n=̅. Ռ%H)p:n>\đM?Y*E "iB*cjB \(gpB,dJ Ct4ӏo tҷ1 rڼH {͂Y0LخkaO d]-% wduF7*֙Qıj9 z7bOPH3abCULptJUx 0Ϟl| ?}DH'WI4Dfd@"KW27էLW c\B@P_ƚGM9(i4?qʝ ބjnad똗mx;1[g}ds_*a\x=CAw* F xF#!X 4+0֓2 I3]#>=q0[Jt$xGطU{҉Up(3Xj}De|[AAJtݾ^ty\y` XkMĔ>'`F>rK W 21+Y= ۙ s.\ t@IzZvɫp ].2¹sEgnp1= smJn$6fj}.p)"zw:Ǐ>O d}Z^ G&IGjӁu:&6/FLL,N?! 6V?®y1 Y XV[8,іq}73\~*O+'YFgL<`.v)\U1轫\93kI=KWYVeFwO%o|Ѫr@Mz=R/#f}qwLci?I֭h@?A|64̀;Ӊ^8_FXhn@;\0=$-o[ 0uTИaXj20h)_*~Ngd05to*hN](:jO j-;3}ƖVD QSưdFQm; m,jm|14p'xTfYۗ:x*4U6uDTNFKQ*=$ӄ(aoLw0 ~~Ђ)<L+7j?2bgùP4Mycܾ%M }AW3'MFK %Gwdd%zVHs}b~D:MDo΂"CxZ;{j/@ ȼZ7r;9L19|6$6 Vjch⾫2)v*'jkPiO# Ǹ\Q^IaE~!UQ9diZ5ɯq;R8F!6q EqB$8nj^*@`c%XEYշ:8C ccD{4߆<'m$T_twmY9 5r?;-V\"Ğ&ݧ$?4K}Zt; TXloSCruz<ŅcE~ECg5+;q%$*X''TSͫqC'f+w(+d--JƇ B ob|5Msd\i[ + s~txy-rTi6߻l #b\-,ݱ9$nP먽~;{9NSUbB]ɶWvf:Eź[fM3r‚rB$jMΦqh% :X"K()ĊM5JueK~'&W=,@7$I nm ~A8m0ge:exJu"ҏ4NݓQzU7>F\ *d"UP'*T#3@-5PBJk|D̞j.K\8}+u7޴Rw_΃4/8qlKV0xIWVD!MAp# a-ڟuC qwG"^kקT=Zz\-@9o͏p-U;c@\L#H^pNA&E69v9F\öN*6=*{It3(T6>i g 7~+l1Ս|!KxS2RP{'@N227EZTu||n񥟊G`j~\/3h2Qc7DbW١ V6gOaph^]b8lWgԠmssqXQD+%Ř(me݉"("|T fΉ_YCG-O KGzR|kT|#'nS8*[ޞ+ʼnI1?!ڥ‰,tY%3<ͳG;-{G+~6 #Uo§#<+Ň*b_"am`$LM.Yߔ!@b{s3_x+Rr&oXht<ՒȠZy)zR$fd:sǹFkԛ F/-] LwϽ-Aa+V"n3Nﴓ3;v6슀rkڤ;syz5 R`]VhP{"ׯ!b+L1 2҃;}>:h5հ/jpe rՋvp󿌄p2wfK[C̽HWD86T2MQ/$;} ,,xĺƋ㙆zϬ\fK}Qzpl/A1nP?f/lMWQXZ Ώo`Z|h rP[Qr4"L"~|*}`W_A*.Kww,,_GK bmm1ٯ= @6z`} sO;`!GL4v|D9qa!hmIftm70I:kr4r9Fl̐ʳ $8ji`354\R$! rc)wc(M7 CMV"6mNJaٙ+| SV傫Ǚ<:Zk`WX>_`Ϣg:%#l(˹y. A'?KHTOY*عVL`._VOn,\o+3E"_0V'.~9IR#jC*X&pׂp{llJ+>~g_]{sf d,ާ{}"dO,+"VՈbt'6T,I5<ŴwMQz"9ϒ0V[H#hzO m0&(qY!Fg JTݩL:dQPoڸ4IT*~SK.U@@b^R '7T>of bOeyU"G0zwl&ORn]NjZYګYxpB(VN8T;_;]nBmKefE"bP`u*`)qj)F&j y1a f4z)M /c:IѢb ځ;>OiG!!S,.|SRsM3iC} @k^HtOn} e*+O؆J^v#;,˧uI?T)g >=\4b}r`MJ ,]t (pWgD[5nV)XJ;n4q)G0YoTU[%iY wL=6J(Pgew\)$:7(}JRQ/`uFAdCC/J #gzv+%d+X`k ǘ<RdHLI,ykR[u+ނ%e=~><6x?܋wP;SHV:ıclGl50l`7NFlmHѡzKI <Jxn 8#!cwxxס\MV9/9Ds" wX@`+F%vn\ yAT| &YJ?P4pᦄK-^y,$+0Asq _6ؗE,F1[ yS/W1bZ`F +x{ȹ&⮄WrK)@zwBi "3SplG1 kb oL"0GV:d?_eb1;8X9A1BTF'3\Ea )=[;c`MP)RaUf4w8TZkǭ\"=撿qCؾ U. (Sl,Pya2~,`/]WS="d\jr5v0Sc)Omo&򀦏pٟ~FkN-$ uyH?Usط}N ::_n0dgb##W􆷣H V"Ss')K7@)!i je$#![c*- H\ݙG_g? '6>=Q_OZ'LDzMUuQ$fƤv1iM8at)[GF xUwf5L ǗfV0]lvQ,d)g],=a=[շ$w5$=ʺ^FH=F (o29sHU>>st ܱ'؋-VNRTp^wLUzkl4큚Zxgmhb0.XǹC%ЊW-J&HEX[䆞jd+&o9E:RNtnxq['gFꋎ(|\ iZ)^1>:6vSzSM ^m9]*$݈-ilcߗ9n!oCDnnƊQ! sx0_K<$J%=KoBk) \t} _BdN]`[pʇvQ }ewe'6 WuơcGY0*JoҮ YAu?Ӿ} c޽qhRxwFLGACWT1g9qu0揽=+n@\L=3Ǥ^9SwoձBF JD)%B =LY9ۓi$T wsNN g*/OX]Y^ Ec)jr`؇<^#pE?XCO5-$ G<[K 40^f(Jo*@4N!s}^8 ##fĥ?!F\xh3\}N*%l(zS'koI`}W*.۬Ʉ\>Au L0z!+m o jt&ӯt٫GNz2JVH" 8#0 kvzw`FDy"n5O8 d&n A5pgXSo( KFtYGJN@;WJ_ d0=l$nSX No(ϥeV8Rӎ~yNՎ.4ٚZĄzV)? 7BGf6HXGq/78(D''>o\_RhFnF}<3UrR-s؇!-i! t7%9 DۺlYNڲ{0Op0C5УVp̐1x,17ŷQ>t2zzluTZWM}`du7[i'Ldc]P$v7@ND뱶{ɠqrL']2Զ6"zyЧҡ^8|éPx}'̴ oOu23?nvs>;$ꔪ/#5* @QjD.*Gcb::X›XƱ1[2ZN\Y؟qS?l/vR?nR܊ xђmrZYѽu5V4ۓ`O$u+e!,MkMKTaLT1MtO'$ڢUJv/e`rAp)Nbv=ѩܡBGiS̃ sr ΦZdggV qNAInN~u anTָ"Dw ;8!^tےӉCX]#)8]0vIS ^7v \HMiCo+Ħ!Mr۳{|, C0p=isbs+6z@u$| ` ⊿<9UP߇8{)oӀC0@i )GS39`wkU؟_E餷QS[8ZIX.9iB~F!{acTO qz0c\ʳ ;I7-L\;g2nPhӘZ/y*ƇHGC`z( OmGTv TU ɢlmՌ/;B~nH#4J !|7#(HYgC/5k^[#C"yGݼiDbB|V`"H<=g3QF*ѭXR~H7V-NGxUw$2iRFbV|+˜JعHQm>T!w6zN<PB'p}H LSR;wN:~W1қ.i?Ea#Wih)ڤz2o,Z53_fhZ[8<ο1y!(An8n~wgg}* j13<(=(!'J뜂o@8*}j^S6FY6yWa^c0_0^IZPm거G(hDs盏v'uU`ӫ(\+#8|+(*;W* G-BApC,gXnj䎖ЇC.i\GY*$csbA6kEhW5v8 tDITC+2˖õz݆2Xq[v0{fʫXrvF'![$Z~>h,]K-=Gʠ-cr?m|;He~Ҥtsl"_sb> M6U]~aUo k--p,-?mak썓xljoD|#LOPlD':5$}%?llÚj_-$Q7ɕP K(a2Cd(D2$gzZrm!\ mP>ˈ_k`7 )M:*rt"̾@6ik:xՓY V >f\N;0%GHnA'@Zs}pG,;x7Uxr] \3u /XNo5(7ɋf< IfNp`J6Grƾ؊͝]BPF\[#PM&Wê8p'l~M$dqFY9Ѕ|JqB%q=\\jĦ id;(5AF4 A T rT}'!JibtXw^NU:-^i}o8kr)>/V־:?iOmEא4US{럧ÞaBY@ +k)C菢붘z^(TOjPF[B*0ӧ0=DP7#7^`E>ţ q!ag%읕Ə29fd4#Θ$w"K1"޲ĩ;-yG rN h({,:mP:Hb%갫MҕIuw:he5c|v8de, ۍ%fw"_{zEHKLF z S|eΡpjbVx/TcYx@z2\k,:A;a/!Zi'jiF<2L=BPl5rn13/,`Q@H1z- Ջ}h(Q !/dbٽc2bb(c+KL΍E&YC<,uӫ(d[^lݜuKw鯹?-)CO,7<>?ѧ)*o:Q4F~k*s&{ ȼްvAtIlzіP!zk7HlM7ӫ¯ Oޑy LJm>8)摰Boڝk?HT06=ANeܭ,S=ƍXPC=iLp<;8Q ^ 㴔;O65RֳAV5oHXmHpI\$O`zAR2j'x-llWcx,MS rxoQM1wJّu2[o=Ù"]Adա?a}X+}?v'.f5ЉdnQ.,T'{[iUܕALAk۸P _^WU4HQd(x=+MweX0|@_Qz,ߑ ," ]lOtuHmq +`9?x?rQ9ڎĔm?dTXŎ,!XT|Q#Y+zoV#?$`gJ"TL-Lyz-rٖF $D~BO&2?Cʙ& ~rx`(@:)qq̧JdRs }Hrˣ"ց-l]A0k8XĐ(SXwMp>tUVˇнtXv6`Ъ`шVScʆ:S,m& >g/y8 ܺS((ojUx mL|9%uh[T 2[eFqj6 )^sbte?с7+[y3Ej~j- I pO|pPi.$ki5/5]7Ƃܨ∤1ؔGCl:R?p۬ᴯt@@/9:hOw F@8G4rɭjBp{@)Ư.X.yG$+z]P-=3b`wJϼӎ8>KEIu \V[=`|H .YXgAm+ax˗C*ߖ!^71!MP[zL%&zչnhKʔ=Ɂ M8>//DX >m~*6`4Ms!9,OMVCj-9~ǀ[j2J *5!,NGl{ MZrK=g{vcj=zP ˫WE-_R;H;hL]BG'!hϣx.E{_r@0aoPZ EgkmW"۵kQ4ӓ8_7P^ ^(K41WB^]N?p>cd*niSwΏǛ}h\MzwudZ|%'PEm]x?&&Qr&icuVd57:R$вRΒs@+ZDkx~>:%Uh1T8jo5F\^j@-1jyџ Q[Mp >,ΕaE3v-걷^NjPtqŐ멧{q9 `T.%ԙK`z`\˜62Qy,(!Ь^Tt`̥nj]y[TtNOזSr':v@/U&.f'hˇ6"9;A.󎈆23 8d14QZ eo BnмB8@ݲPbǖ afbWcnuګ/ʕhԪ !,ߗ EQZKvқҸf7fﵰaFmLTlW뭕1or&!P{:E! +TI Q茤9x9w2),C/7~Pw I1x ƣ:BVimvw"[ŕ)hJl%wwe(`4$v:|-d@\dNBD9}J)O-Hz˪^gQpB\NЀm] WyAz[gD.akUo{z/zpo(K/u~(ֶȔqFH =n6JےXҨѵndY4z>%}a~no3$ILִ\zy!GrI*+4@;"t\y4 Ux$?N`)R ŗǎ-vzhצ̏/:GٰZG8ۼv/{!׳*SE,5YJB4gϝ/Wxm늏# E%~jm6SZB3@2+챈)\ٗ_z\JZhR?x:`J?  &.iV34~$ӎc}L7],;`cfދNDۨbcb*J@gŮp_ՊHW)3k2fGRRswb;16hki|A◁zJ Ϗ[ \`nyC1q]~lݓvBUl\bG\eXzoDoթG˽I88XɖTХOeYOVwHJ-G ViJ]fGxgy6;`!V} X`HA|8sReVYf[A``3I:>򀅻I`՞aFBu"YM$YC9 ~T˽D^0+b@Y$N <_KנK.ZیJ"j1i7rb"Ho}Jpd7W)0/Et_oFRTsy9;Ku>AܴWȾE`s<0_rvٰ ]<$s _ L=Ͽsyg؉{6҈;˰5]K>X =+.3T9hwl{ak Aa]j }HFhւjy٬qF.v&{v& ߊbr#|fȯa TЧ6 ϲT ,@&Euk0s]/̨5󯤣7ZŮSQz~`xr1Pҁ\Rd=\L|h,HԲB1?]b{>к"-#cX'sKxzZ$>Z[qX W]CxN]bIʺdpU +#k}m D_/Y,+L+@BXc C3g+: ]Xf~|Lҵ ⟽ #!8THT9Eh$TӶg~G5\u#2jHA>H_ 9OeF GRdwsxU_mQBXyu)=}2L.(]NJGNm'T/2F f!3gӡO+}R H.\X\d#uۖ 0}W=LF`ig,n+ju< 8&MVy?.D3ʇGzJY']Wrf_"$7 S]&Jo]݃(  !C|ϱLlAR4g$0WUQ*&@x}e -QR*V{ͬ9Ho)8W5NhDzΙH헆?鿩m|h܀*։03U(pU.,, 8 \P cB"o%|yAخp IXz ͫ-CX3w_̟:\S#p;>)4G8mdq}v4DG]ʐԀOQ㰨[9 l¦ 衞FroL1a >q#$m1=L~5L3 jjq+NcI"7QƵ1!tc#=vhSnvv#;! Uw~|<6<~((`?TgRbZ%j4 )WTVGp{ܸ9}>hP+!-RKxcQ%XJ̴u|pEɑ֕/,P2 $ c̤ܨHyH6etvZO4fF&G/Ek85~ ˤV؏4a+wl%ϫ:{}8VI *Mҟhi$ĝtt]C_+o=rC_l!hּdMJc8a]O2?ˢF@а^ͷpÒ) ;4ft9N7LdUINcgQKeHvphl*v#D~^}ʌC<.MϸE $*[=;VҪ>MK.lwi\L5ڞc8#J$EU1n Ӈp7geD)Gkњ>M<.ch &ImCNi|9ϳdE/9Oݷ=8"B\'!vhGּZq 0} xY)DD-s~39\Ƕ/ǹ؅%Q@vr]mQl϶PhC,Jʂ<ܶA8jFZ e#HEK2zyۊ6N'-nvsl>ç|~Z[4zoahok ͋k߱= LCE!fb 6lw#x$TQkXjYn1*YY[A#h8~wC'E&w̔-D&Ș#:eKnMV_ByldA{fAtnX"r*k6I$?a#WjA!%ˢ4R@CuO(=`4tr^I@~F=F[ 5Ǵ=Flb&|!oF'I.]s}!KDexo(ӳQV-Cр{ḣZ3m uQ0>wW_jW:Bg{\L=3ͷr QD琷'REUszl PКK=n zW.$~{y7铘Lϩ쯤8DS9: 6k30])'p+,,V:R[! 3/,~X4q?+^ʭz}Q B%~]nL:y_Jl?c=T{)>gP0[6lGM|dgWRcUr`(pO1Aw~lrr2ov/5p7\D/xڙ5/jR&\%i?Oί7%v'`#;4`씐 y*zA%kmU]jQTqݮ?:G:TtV)%&NT/bp 1+ ˆgFxU CE-p{IYx#zt% pe[+Ɍ`È{zU EED=Pqͭmqޞ_PS7`ӂrOy?-:N?Tm2ZL sg=LfA9A{ARyq^Bes۟NҫliWDzWG=b|J4M%;C~oN3=磎\:N[lPc~2m AO]3ܱU(Rq/(VJR̍ɈܘT*P4+2d?h6 ǔ7Uk;&")r5~F乹?_uR'ka+= kT4ՌoK6@5XjWܺ!.#XܱL|/ex;saF7{J1 xty)@cxFl؎biK7Z;KgwA@_UtnlN4ЛUvT<^*!QK ltȣ;xűʯ"@k3 |_rX'8W&>KCz,^M}MCDyłn M4Uu_>ˤ0~koc!]0 j6&_(`5\iieŬP vWMޒUuqR$q?hLR9TfQ᜚íH-w9.g,cuj%^Nϭ*X{!=4 qZgz'`o-"蛬Mlҁ[9dK9&`#5imIr:ˤpZw~23Fe"&aMP8< 'it:hkdG}K;'+vpyFw]x\4Յ]|u)no'wNXE(]mGfa\Vi%/-)Dm }ux7R>X@SQ-v"1jvF׿cқ'Eg BhOkL]hm/D2i,aiBlΡl=gM4"h=Fuq,JD/'kʕOjL04vvj9u@g?*9G*+p=U&~Xհm"4Iux\(Dj轢T9؉`I#$ESq%@x4ÿA^VcU^l8 %I66}& {>GuDն  =XZє싮Tnі?z?j&|4k @G:?P[feeURKuuIyϡ;9)־=(L=J]Z4M/g?P`6PJ3dS{..gS(`s_=ͯ@'嘷!0 w2 fguYZxc2Ao6ͬ^@*BC"N}O\`D1 rN.&66.:Q@`ڌomr uj"`k]XFɦ"3XSnRTe.Ζ߈K K)iQWסM9;8s=z]-}L_$ccO;Sㄥaoo ?F!fJpecm8w4h5E.q!d<!7.aW!051,.bOEsA{u3Ź$tg;pH|Źt# "H9!b@QUpV~EJٶ.j``yeWzpC&ht=xnCf"NL*izdםHۥ XjLc~cIIug}nX1AQ=jO%}=J@ #P>}OR]׶bh7}tDF_0x]+HJdgK-HvV:_$a-̴Me]bBlp59S4|0X$Ǟbjt[Cx<Xc&;qF"3C_yUO%߹ou0_-xؓk \& |K&t ‚)l wj gWL}dvݎGmq%P(i*>Im/Ls ̟ !i'@fklKO{%( z=.k}.Cu8H"+!IQSʶC[|!3W4[9ۙ#qQ C ыw5דZ^_L8jԢ%cVBGH<ߑe1BG4Qf]Ti򽜩0R`) ҆mœqƱIP^86Q.æ.Udz6ж"K4C 7@khD܀AU}ErݒJ 2|qI}{cky_9گ6'G$!͇pja%83HJkdҪ.{[?iu#16|żNwdqHqV׃/|D|UVu,I%um @]JM`OuxLX'-erİE௰I%Hi Cfsf]1L ޤEZIG ӳLsBymk`~I2.]"K}wj0Qy?{(O48`CBV]"gFxQ5ӁeWؕn@}䩠 ܟp@*X+Q ;w!$g[(R?5hM+pDA_7¢Iv@-osU] >JRe5 ;ZHd"nP|ce5 2Im=wd~1.C ’“(Y u W?@.ۺ~ҥ6k.onY9Z WZ;d,,L l!k@V&p].xsݥ͟Zϕb>#a 71oG9 gʴ?&Q_nIrئ);'j~ߛ l$F h:?x#45N)\UGGEA 'A} %2ߜQ.,<5oC%)ȖnB,BOaB `WxY(93-\ C8@uB̥ 7 TѨbƒW-,t!ۻa#1{<%[;U'f7ܕɐ w.k<&AL -"FiǔYAI[.'E2N,N)Zt6. CEPAvxkm QYHmjd!Bf4瓟$#mWe?£7[,!i`@J4|}2d':RxPQƎ,Q %ץׇEhgy^}./0;] {#򖄓3SM5!OIpJd<}K TKggeJ)XA w\)ZSW9mJ5`@lfrJzwm4ٳ${ԷwtS= 'B1MGDRh' >jxXSn{pN6!|^GpMqEvHN43 ؃T a,iPMMȈ'( |C+kkZS 8xGx.^CDպ(+\nY}Y1(/pw U2œ̃I@)ۏG6,[2)9/22Sw FFEơl*"~2Q``['QPٽt̒4C9^0Q"aQ }7( Wj'AmZ(#k;Ϗ+ Ͽ)>hH,բpRz7Ș̀96^N\XBKXH0αP4@QW$ꢋQfНN]nD._-HdO"|?Gߧ,3y.B=I f:(zP:iV> Mu;."#Y%L\yW@>݀g^gG2| [?#lSIX~w›NS Xz+`r o'tcwb h{ :K8%1Sb%/r9; 7Y|v EesA/uK44u( 6zOʑ}l22m')DynD!X1ɔ``ˮHQqZlаzQ elW?nsSˍE38׼pay|kGDrp+'y]/V`,CT%jvҤ"lQKҹLI%,^!, Kƍč(23/+Aş9JĆ'X2,8ZƽdʹN1.e߄]cE?2I'B0FL%iaj*/&Ws9cOa#+)@ }N3@O5+gEgx >l%Eʣ,|`)%w)詞{0oWEtJ]-vHlߏ~Yk S={فFy:s1Y뀴`/aa$Vp![x_^{~,~yB`,!_=җ&*ھWf'i?L,{}Pv!T v] •Ηĥ n@U'^ֺha/;C\'Ylwtƨ_R6c:BɨDl/i.}Cq&FsUHѦ$ ɓs lR;]( w]uD7[jˬ ͏& C:BEXN ~D*lɤqӇP`yU%^8sa~ y (6 ;"RR[;iBkE5E)bT_v^O+IlE&IxلެOGLej1NSDMtXyEj }G䕵ƬSy>Uޗ[-|s`mi~>ςM.zr5z+|DvN,X=SӱI% = aoK<' krOS%IJj}l7 XUh UHrT) #JέaG-Ǚ˚o(H3B?~c8Ou$v3doc>(*c"Vt+4vc8QX6 kbڥLt!yI"v젮7K7S IRhFjKŠq?_mUZBsWiyij*Y$V h0\k3xj FT$Z-ZdoM*B=.Vȸf:dʻ4zۄi9ad޾?w#S `$n(ؼ=P/ R ˩2Cje1N[- W4j0$lG oM->Ā76>3V,}Tw\.1b Bн=I'#TWk11uk'LU ~_ܪR cՇijՏY#;.$?$Xl8W"F\5qm@ttJG+"}Ǜ.?Dm؆cErlHeB/Uk1omYغKj?:P!v8@1>{zw \e4ꡏwkd5 iT˵`h]Xz$KCcszr L\|c@nRnuGīA ޫ4 Mpf'`츗|)f+?vf|+FEӵ{nq-0&m?Jx=Ӧ~P+)F7 ; LN@,}ۄ:'l#&<[ɒ,Oc<tYq7lIj2815#S-aBWĢ~]PHm#&MYYKt"qFukSsw#@\ԿF+Mk[d}[vԒ8.`s+Ø'%[h64ANLy+x cï^* W AȨWoL5F7*jQTn  S^ >76C|,0'tk(*0W+~q x^k 7Q&^K zdUuW=B,)`W3Ll0)J/`%=,APWv#7̘rW,fR)Pq΁ԘwI [_@>/\Lo vacx6bwkC ][6_Kv.c ^RwJ{NRNb_3c|m]pwbvA~\Xc!( 9VDUV A6&&F1:ъ"׈L(1Sǎé( NJ)⒴zu%W|:|9-r`5<ר]V?v__ {I[hS ]|&$XܠVLl0bCk%e, 6Wi~W@/_ t-K)j /*8߈INfr5G7c:tx1-2MYr1 yU/frD#zTZzfV pn`IEO{Ac8H2H]ko3cqQ.Ɖt;1[CA^RZ4{+G=טV?v} *#k '+ъN=QW)rd8戰NJ"|mtu:fyɈp9sIH*5aP`yaIO9]\U`d?0B85KbHVhu2~p׽}({Ձ?ܲll }if-=/.e%(,p`{ƀ.+Uˊ_)Ae@tD*9I4ɗ:_AN,yr8D# 4Yy)u |:̑p+y/R=6ӵOZ6ܓ;ÜcPF-Γ$|N ubeMiJ`_)|*SCY7_Ni a&t*&g Nư2֚vEVG'7zzDPZUH~6|w[Z`FHg4 3@xZ܌:~VXG.Ǔo4qJj7/-&z-dƗ.+y ${N7Uw6Av<~s_6xK `iXZWEk% aM'~#IJYf*vjc<$]Z!ɉ+YMuy(%Χ%޿,* J >}S* \f "6&:F7Z/@W@2zﲛeb|, ,!0;0}:j_q Z8?y/ :ci i5h!ɃL80D%G/:? h?L8m&4{̅l(?kq? fhH].${Nθ_609UO4Sph=9*y gNoOG3dj̫'،TpX`[x (9*{޲`e3}5B]wJ6%s)|'y/m-2Q"-ȴwL负Vmr,x`\ -20o.-%֩]!Eϼ+0h@b!{=R-W7#}ÀȃAPG4n5l(ꎵ`3^"*ud7ܙ)}o&<%-|UV㷄 {r8]<,Dг_ llY3*X꡸c,_WNJ̀A{*:+ fB0Sp‰ijX i,_/P"\V,pNPnOVAMT[F.< ^E4úI(xҳ~,;bx8DeΖQl> !ѕ}7pc6|ނh4Ր{ݞ% ئkħi)h<Gn)k8W<kt#:b/HF?ENqe!REԵF+(9J\6XjV'\shK'$KJztэ Z7;i;32Ad9R& 4nP_7xP}EDŽZ-Ljc~1e2{]DV*߸&YIs0潆qSA]/MöTطGTz L!wL)bXf)m5kT+V"$ Ah"pw-%6̱ 9ÂB pG芣l\_yo4տF◢Rggf[8) F"ry1UĒ1 !0@8$fs&XT[hH"; yH}H2~&ZLvO46֞f0\~L\΁4LL~*! ξx4nQ߈嘄ӗ;ɠܱ`$+O uIwGtKZtQ% hOD]YYC]$w=kѮ]#̒3jn) ;\=uC%Gcxz!N?N?dͨuMbS 7%v_ l` ZSgb00?4~bqt G孾` _>qCj_pyeOU_0HM2IK4aȘJ&gM@̢TJt!) v&FY1w3H+Hl x-c$IO=i^J(t2M5F fHO&)%G4#݅L@=>y72;oI_>~9QƩRvU.|CMHg|eB\-m?|J?`@G/r6Bj؄>v+?-Lj%|;g$XPL >23g9T[t,oLN@+kEJ80A0aX#aH2*@Hve^ލ4YNÇ r2N;j,v+ eFQHk_՟tPv+?6X8HUNn{[8Of IMuox:[h-@WS -oQ%FpdN`T@׆Љ  `} Eϓg:9b^t5M?m*Cz bDg{1tvf+k4v*QprR8gezVfqAS shy)|IQ?aHP VyBq?3*S !C_N`ASAEKB'D쇞e.i{$l8D9J}$a]߼8{Qq6gg,8M9+vΪbyE2Pô"@c L >zπr>vljo +oP黫XqNؠﻙ+@j-2 !~0x9/qYK_\4n-s1'^׶bpO1<ΙN}_?*ij+#[ePCwbIMw 抯2wВ#vuM#a`@Z٩#ewgoV*/*HKב r iϘt=yy`ft+sS<{y'[9 1@eXyRV2P2 ?7UW lgZ2% 7Zjl)s؏hEJ};%=Z4R(E5FTNAZeA' K1 )B]?γ3zZ̾onf"̣$5h7:*T{G8Kf%G O|zq ޑ)'r??Giú@+ˆh, f{|p_ARXكi+O5}ƪ+Nfۆjje,R᪅؄].b:]U!J[f%0"/o!bq\βuBX8ȟi*I#ľdG.<&z\\z\I*@^R_ɧ:52Yj>N_@I n,RW,)AoqUq)MsK ܡQy^)(*4Y[5 %&\%mkj fpzUdRqѱS2g#awa*^ cq!&Ȋ26: *2cLqs(}(0 [_ ,<8L#RE{ZfzJפ l̘CȂi?jm,@܊N臝Le B=(!*4È=I 0wQ369#E8$Ytc '&K2Q߱D{^?&Q5 Dvn& iH-5oY&AMb7=Px}= wSjJ KZ12ojύ:F ,芘}LXba͌,eQq}-k=ڲZdC%uGiE.T fOˆUKLĖ7:T ~ >OGw?x9,^K ۓSt&wx1NfZӌs 0_: Zɪ73?X;JMS6whf(5mJkl:c ,T#}bo\>ji37'kY`A+5'BFtQ"A6 $ZɶSt$'7? &a!Hj9&#t\rFAc,nKjQרּ~w{_J΍X3$\%;RMFpamu`zo>+9d-U}AlX 9 Yj*{?T;Yqc=@Ey')@OepDhGٺԬsmM%%'^s A𼧇75TqKUwL[kK͙tKQ|܆6xGv@H **1{O Y[.9ƙqv2#BsЫB@%wNV Eh\CG{IqBJ#DX#PvHg;1@>* $yn"F54|3a(3ՆD^G9,o)=PZ>X3YSCc:$Ē$ XwhZ&*#>xHZ^H C7.S%}NVߋI }ǃQ~$9&Ƚ28ll;9/萂%8V `^O(7[? ( ˘jΌLHľh*yGw&]ҖVSX,nS^ROC:ɗ򣩼p4;G+ 鎪5ViQ]Gz:À<]#9[y(R\vMF?7~|l.XƔ>ܹ)rrl&#Ʒw(-߫3畂g׳pMcBC%'}Y b2!l{}\? v{ݛ)]q*:f3}2 vTS' YA~wSXhO.cp~-ݦl&8صbW=~o]0=^X6ܱ~VRVRQ(1v_C JYS *~:V]R{,GϽL8aaLF\ ;k T+c Hƪ\!* QRoݵݝ"T }Z%70"ǭXީ YA.:18AHrV z릒莔|iJtxsFc[_0tSr5<EMO)@Cr H3즻Bz9ifr%bU n>H@*yKq/j=l҆AXJ?\H.k%̨3UΑJX٤̗[`l?fZPYw|w2DbA )w&.7gЧ'e*)K`$H <ɤڡ/)b"ciskõV>=~YpfUΔ?kc1Zs !I|(u[`Zh.)gjWY$ l6r] s4ti ɠsYZ`wk!n= ^Fx6Byؙ9< םZ-nbjWsbc5Tܮ/5/+E/[i»"puœ' _%ioh= 8nN/|ys%)eW"bxJs$R4>G*&LC#Z˗SyK^U|UW)pgܫ<4,ѬF: OK߲M 8s'Vy+ˉE~ iDwZz9^roᜂ9l`[GT_pTl.L/̀LsA\ɃIYR+Ӧj/GjO6bE2Et5/M B*)C( P4藈97ҌWdX$,ºX`;hSTP N-YIbX[,0/bjmTOrmVtױ/3Cg^Y3>j%M%ϓUq>3 5PQ^nM*eU6,3['q(3pmi!d9,:|=:yP7b4Լ>|> p.8ذ.ݝV!U4?Ϗ >/5SB^{|N-e+>թ ƴ B^ N{(/#&8X)ϞфI8[WL R&K|U 6L)`Ш )uY;OZj<77J.If&Rs;lJ[L"<+-j@VhbRʪ*&LDNRߎԙWP jݢxi* :" U1Fiש)I.d, *֚>%Fހ݉R]M0N^w(Pv3 `F*%SIw.d͊;CNZ%2B/VLeXUXFDkA4 Vwؕ?,FD:j2j(u7(|8Sss(!99;ȚX/}}nYhB7]rީ)j>"o9\h $ HgjQħw> لYӇ<)jf!F):T. j;VG>9TVF۬{m_l#RFt3 d:z;XW,lB9L=2 ֭8Uv/ cH#RbY1ڥα|rY8F xꃏ 5/Ϟ{e̡xQ="ԷY=$*U*!'q*}Ho y[YsxbWHlZ"*b! 1F!hԃ^ pWz]> $: qAK}>IMSe9)sQhKQ<@xc| !5Ev(+C D}H{=T!ې lr7fSeK;R܂;$ou{4 o]&AOm($2+&s`w4@s_{< Z@Y[B494r)WORK8knCs46nWa5Dk L鄏g̞yU͜/xί<@#c*/وJ7Ս3@ JS㫻$z!!$"k#ӧ+PhUCӐ@965U{azoJrȽ|3X-Y:?m=~<}3!B6=0~z,%М1G}R+`;v#M{,+Fjg;4\q¢eaՁQRmE8V"*)K~^YQ@˔&/ mpE q=@uH/L˅p(cݙ;hB,Ic΁߁(yMtԇ j![ gVI m8א%QJ 9׷`1:dȟдKӾW(PGtT9bScD;~#vf I\STi^Ճ*ЅO-~ cih;0J =(r?劚y d:XgUY"g_rP4cUӃ@##hm2h~(ZTgXa;t/*37ڍCJs&"\G)Iޞdh߼u9ۙ;21naPv|QJl5A#$SWJ)`ѫonI{"fuMAݳ"$iL\ЩգĢf%s}HZk+l/.NQ1: @W3Xnkt?~mk'ݠvE~I"7j@e>y-0JdO`s hj~9NN`9h6]D7Ai~I<&*OZJc4"r.7!_&WTQ((hgNc>R0!ʞB8U4 [LM ˣ[h T!eE(5ۀ;ʁ83ú["UR+e#$P_ȩi;=RNF*\qyh؍M3XzqΚ$B:h;z>{IiL*'B }}q^'@X`!+ DU򾓭-I|=']="z<“LV&xx7uo]$3q|ɣiXSӅ5P'cNWQ]qNa|P~qV𤱧"9^DGA9'ѨBY$pM0$^$ݵf6a-e e>+7 coz}P1_CY{v]dtX/PpcjKDJ^X1[n_C\2KsiÜyQPdr??VshD$*HuDM8PZ_Ļ/)?dMpľB B'Xj͇}t^ WXȠmtQnT4s@HS82~'08%͉ԌN[=!Un t_:i支= T`gm55c;[pgYbXTK SfsIfδ$ Jz]jdcոJ@ :nXͪ`łR"<=یxz%:-nP~E/}]v&`3霴.n Jb2h^,p[񛱷]BH.ZDtN5 :E5r?0lp$D3FO@cv%+ C"=V sKЩٍc*r|9@ogei'6{>HbʻѦ-q}g Y#ىqЇbMrVK{X`(&C+۬=X 3EuƪaQ)Z,nc pԘm!>L`qDgzgQ~=_t FSMΔaJÚ9 H6KaGCJ~b(=ga !Y?;jJԀ[!oI_rI 0Vş[Fp~y6` aw_ڦd;HVa|Z5RAtXm; 5]L{7\*mZ+ <G2_:_`ooax!5QBt,Ө2D+LaAavx~\4]x޼|6OnMz*.=1MY.?AbOۊ!L(jdih} 8\)v$D[s74{u!8UekzhwW&A'J %_6:S3RJ' g=m|٣Dv{a*B:peBJ7̑R^=4bu2+̴0BK؜c+3IB.SaDp::Oya%viBR=x3`g8(my@n8Nc1lTZ;ep^2X28”}Dx#n*C?1hErb!(daDAE̝Fvٲqk\ ~MfXFۈA0Bх:0R yMi+svn["8W>Kxm+qGՕ?|l#n$U9kyLX;NXmo{ hGeQiheg#ٱxɊc>șg5r?*Q[cOktsdLL ^ ;C!='%p[rFbi¡t`B,(VtWV.pѰ4(}; vWO9%E(4My@NE  Hʿni\*o|!e^}#Aҏٴ o$AfO&vDP*f`JZYFm M?C=n>ڶ߿bЋ7܎D'F!Q&B r>"̠{ƨݿ*a3o~n R3rirMWkga-JtRgX`m4nbGkf<ٺ 2cZA:z5g9*)FCQhf{S>j*Km [q;!Y\&+b32S(a|E!WHgc.xnOѼPMRW.+$EXmnz*huMK#aVGnq&FrRVzx@Cq?3Uq?ݙW$fċԜKY1I.==y,`? ȈwgxtȖCe6f')Eb #ǬyDr3[[88L a٥E!~)ۀ>Gi.Ց;e.Mu;):䟒ܓlapvU1`=t*̕JpJkSn]8mxTnMN!k34M6YFO50 42쇂5HtigE~e%u(ꢖ\|>/kQj@(ӯ Xًͥ +RЃǜ?7h|C!chͣ@XBxI=<) T{Օ|)^:Ǚu7vb-0@P.g5Ţn>Km6f~(>ŴұݭZ,+;11K j )FZJ_* "VGxB 8'v_ѡhѬřP>9y1 ݗ{@!4DyL?s#{o .dGT9]2*T$JrEW}ln@B΅zm/>ʰUvrpQ^NMz"zpW\vLT{ԊL#5̷IȠxdk)qΣ 鬃T6 f .쀣4͚ڥRD$r= Jζ72@ʖ'ʼnCd8Lݒp;|ݨmM4tWwg^tES1Rǝ_>6Hb'[aқK@Hj-K1wd< ʙ3jY>% . 'TPo&nWFNķSTC!P *^d}ȋ3:lTw>;rD񀷨wGٜ!Eb2OSK1:J:7RB0=)ǔ8?P|ma;<쇜e?VkY'"],7[ χS-ʒSF"b_Oz$?&Uw@&!:;7vcT C.PNP^כtS{r_裷==,m]<}31=ҡJ d1d=]E:f<FZ3\(1\ ٱ8T@ZՍ Ih\Uz?avly̴x/{9b Z<ԋ(qu8;]qzM$!Ss0jrO 2؍2FhJl43K=;p*[~P2E+%ikyU$-nB(֨ KƔ縃j.R08sk vą7mՍ/ۏ T1Z!5ZGYa N*9M/ʐ>iQ+Q % ̫~}st KYvtT"{t6e+d$\$^~Ups%oWB,;B7ֻ1ɍhwip{_x{cHj{@Jӯx4='k-]aj_S%2?cC'u\=ţZ2˵xmvb%"o6fL# s2DtdƁ@s|RxQθapU5f;0MS+H{-//8rՅm*&l$"vҘuX[gQ=ߜD*zsl"NK&rV!ˇ/Pe~zXJxpBbl;9Gs&taB4BWyy4u4APD%ljsRO]֏OcVj~xPL^)ňW$8pR_x>^6[q<4%W%״38BB%)"觀:Oz`ߤm pH+/-쟤3q[N%20 BKFN S &Q՜'b G<|=Wgi6! :1Xm4o4* :.gzFKyK(иoYǞ28MQ7(lw$jj:;8 &GN(NQI;3}YpWNo(,'2f9rOJwJN9Z[xgsiAZ|fK|^LcOTDg(7AE Cl[%? h U#tSM=hO|m&%p#N7,]/g $X!^d;JGyKyʁVI/)UǓ;*A{B_up4쟎J1K8i_@1b-s[a4#dyL[a;H/MT'l}5q I]'C;f;"z]^vɩb'{ i&RȵTui{=Fv*Į)[lҮJ0Պ>[MAOB_ 4 (2H2b[4.W܁ `BۼD5v|Ɠ Dn_=4EKJ3Om5]1wIp)~.GHrO2I\|V650SnJZQNZhM 1p]h2\@0t JSe50/"P=܅7!1]$ M"i6>wa-?3VøvyZTv a'l!8 6LR=y7@[*R!Wec6*ўnp, nZn1TWq\!$Oh({%o{vFH-4TFnէ="3\|a-.~Q~`qzȣL^(uK뾗e; !BӏFqc<& :!L Ý9[cyΤ4J9܅ml@Юh3)5PrGKPA#Ǡleԧ½ WoB]bDaK3)3 ݝ2h^Xw{\ߏ,'ν 5ʛ`X_ gH+-/}弾z2Qor&;X_ء(_.ڱDA$V_>A_l;Nj FV ZTs΅X:V 6 "xcTx&NUZV. x-tRRӲo w[0qhX3勣d C^ mr5f25$mNT{LJl ﱽ3MDaqR.]DZsYuFH3XiBZ>C{{LJbU_2dqKsWI3:+!΃GU|=nxzKLjΐ،‡ff/_Q NFIBƊucȽ{.:#RoFȝ*\`k9mlFK)+ e\Zi7#{'v`݌})i`LPT>cgd~zIͪ: Sl\pZSTGVcY5ci ) VTVIl=36۞BbLlF{pTN-Y r ݵH1G9 :M pvLTY]|~tj#v`!YPk$cv2Ĉ<֤Z`Jjy3-I=q[ ee[۵0ϾoЎ#[rA>oj^) Y>ٚ?Mt:hm)HQcD8/). Mӆ6-h'Og7HiRUZ/ @ Ȧ!Rua3\Z?Z4&BgQ5 (h'ܟB2W,QsؼWi739&Y15?`ch (0,H3 b{СCxgRܬ!`\NK$潿o-5* uYjdKΰe8[ژO ya\T4( uȟyW  VK%3Z|t4D߯& tm,τDy}HE"E9Irİ8 1#|TVq5 InJ("gRBeWJ+W"m0_ZsޓQ kE$,9|Rq vd4p `OfY0!To’L!$ 국=9d+]㥊$JT,'7 ӊ|tsK{n* vph {:k+]PG {<޲:eIUKށ ^`1t#-IKMip0Wd~`T|Z7~0T#|*~]1T4HI T~H+cCb;иmwrlTB.)Q8>zK{%a`ZA1:NרDT-Do^8Lޝ5Ox׺RQЗ"6z Ix0kɗ`bup!C8*׵|6 ?^kZ4k姚iQf~Nfڇԋ&jg5ЦObrǾvo)QVDJ`yV4MTtKq$٬4u $.osOߟJ,A\<)65`Mӯy P0Ƙ <{lO:k?mD|IL6~ԝPT|7WtŦdG;mmNLQɿUJH 1wfH֯%G}_k_1 W2L]:!ҷVB%7B˱JQaqFP]進p!ߢlg+Qc@ɴ -";,ٱ׬l1Dz{;]cz" ɭٸ`.Ǝ;PDJxED>!PN(?J[SW"`Iahsʋ DtUAQ_Kg-Ύ5k$ИZ43STÀ&Fd8PhnQ][]g~F0[?[@b¹1WuCnDul*&_/P$_3q9{l"*L*FX[.e熶򺹀:}EOEb[(@ōf&ӏDzK̝R W fyM5Wα{ GnsgJDU. ci >dZYI_$ba6209 .?:"tD|bJlAn]44vBq<[k,hĺXds6W_bδkp݃A~hDKprx_go#dJ\Ծ.$e_GAy#LdOK;  VXYQ6eqƀXbġC;_Ife+#N)]>L=hiȻ}reR%tx ""+F;ŁxFL,d,{9e.̈[ꠄw ">Nۂ|[XClg25c<,yF6&]# _ڝD9b , uVu9Ѥ`].9D"b=”CC40ʺ,΄{@$IޚfIXTo PƶgF@^Xce[iCZJ49T%ftrtnYs,{0gMN%? g{z{EU@x i+slcYBʹOA0\S(eqzSa,lYfy %P#/yDKeKAX?ȥ67(9%Z%1p ?D/ʕ"qdߣ>qQl 9{ӔVI- dNgT]UN_1+]bmA0 m-ҪnL'k2 V.]@c˞a(/ǯW"F<]C3)#-}5nt~AFy*Ѿۢ羹nA[I+Pu_KɀrO:ܠ=`m$&VQt.-L+v*j@2`bxQ0(FU"C`@Bu̷%}JX;4CP(嫛uL<oaS0T.$=ʙaN5NA?riJ^`Y> =,SvkvH/ m(Τk봤Rqy)F-lacEr@u42]hT{{E7yn̪0nT;x9sW,*Mwg)}x!(=P$s5nm[Hؑ3ո3e'ay Pq%' >19ṳH?c RXǭؿ@oQ]m Beqy}~zA9JR ጯtH?N3R>D4nK3AJTwy4hWM}C q"|#BtEWX OI\W.x|;pXؿZ(/Ύ[¥D`JWlrY@L2Ҽz8Z鱮·(2$A;9Μ2_ܺzNQ }blZ-ZҍJIxlXKm LoBmӆ>|xG& ^E*à;1K`$hyum >!B vOً) `h)%Ux Lu.6Qw_64gZVb9cp0r7 ]J:*.)v8bӵ:N+刽߬m#!N䴶Ձv6/}u^1σh ]Ѭ,_#ǒZ)G*wB #[~\yP7 +_P:^E@"E,; WM Z"˛܀"CU]0k,y Tq5oS@.f@q2C4v۟x*wΆCˀr^G 뒧!iQ0'V{I,+ Ḩ^Ԙ&6dƹ '_uFoW:.6xvzbɶ=XIH 4D^A>s4 7A5ISȕJI̴SKU˭Ȁ`IE%8Guweu5(q(N^bw24wA\VRb"ݳPt P8URxyӦ3 uև1Sq:-]r &oy2\΄EC7) 6rYnQ|m7u$=؁1 \EuU1!ŝHc1ĚSS^Pk_Q(qBD0s_oF}0Wާ QqW0k%{o[Z톌'ᵮ|Dc7kEP)y?0`:=ϰ7 !V xd [8w2Xc?w?4>3q)( SSq&.P Nygan]@ v'__B]!LA6䋬ڎ&#1sL͜hhreE'm5S05!Ugϛ=E(M*a/#}:sG^wXx1."Gr[ z f{YBy7w7zn̦lב2.wIn@aP+T ) dF֮10jVxW/G+PaYw-:ÁqeL JL|;Mg+60g s* Nl VsXZi,_pY#EAR@IY?C(NADs]?=SC r wrCOvFk;P&\{-S45NocfWi%t`"X׸A(!ۑз/% w~Kv` ^""XD4=|0IP+~qU[9Y- ?ѫ2:"9|sTh[cesPW7fz2$n@>=gS_.C3lҤ\LU/rJVl|yŅvh0JA}@DG!`̖_},3O2J ']N!FU]!C8#<7zp96ҸށFKMEqؿtc14U͕I:y "u\>Fc;"Zd| H-4vոp*_ͳm^"yI2@9RsS޲7V^LOha^ST!DAh{8<4U቏xʙǨ%m}:gu]"_0W͜svmG3at΋EVR0`6o=>vxVk!`St$T=]ȄHc,F뽊˧ ӱ;ČEM SEagUD\oAfsD*lYxU`%\.+qPŭMG#oV8+9;_(?<k'>:7jORce%ƘMWN1I,\ /)6/Z= dMȸxɾI ug-FY>|U fΛVdb+OoRa?”3b(ՔM@lmSs(=a0*Z :@ׂ#'{%/-xdpgg0v0ҨD[VC3!TVɕt^8i}DKX]jGeqIeK\?zE)6YC_`)|<1="z3's_1\_)|b|tgr!=@"91wߋ I:w _z~Q$^jzTQ~`AHJ繬~")jtJޮaPv91>-> .L.UUyX6~˗o~ڗ:.t277y%f@eaBP$Ԗ- (ў X lZυMJ x,kuv`&n^KmaK{-KV riR.eglA=Zb jʺ;RgΥӳ+Ra,Hmѯ`e?Us [j<인~Kd+w(+aI8X37@f X<4a UvIw[2,B7x'ݞ%tޏG91Jh;ua~tBEh2)&񾨚3B#VI_Bkr47M{tOaG+Sks6WP <<up|N<= [ZvUcl%?bc1IqϨr+p|M%0Avמ~g-ˇq p"=nF+9XOl25iZ|,p)݃mD&>`KR8h)E ĩ~*.< \ *w/Q&VS ]zw23Բw-`VwA/9qkmQ>;@~CJx`a0.jp[]tVSQ5Ռ.P"aɢSrD䬫c%|/wH{˾^GvϸLgN^mrn6?yίE?DF-{eSEz0;&uQOM,k*:DAl&1ãwaqPt'Cs[P _T˝7@.N:;fa6)6/UrFmOu#Cmsf5jEr}2o>6GF]P߱nG>zMH8ݛ5 >+5ܻD% Y*re;yoۺbz2ggKQn  ޱ1- i?*6?+Isx+yb߁ Hzag!b;s eY,(ve "Y 6扻KBa!?AAHWkMl7 XDY]^4*:8 Df)vti2z1ьt$B+n cDИ]8[Xk66'^/$BLSW _2IƖcT1Q#ߩʑZtGOPy%pw`Z!1kGd;9%』ď*uoMz+ bŅ _0A3%9R]>Ua]_Z._]Pt\k 'o.ԸeqR!R$M{Rj[A(/:%w1>yK2R*$, ΐ6tJT)c=lMX#j$J P@ nЃ?%U"$7]L݇SD 3uw['m.}MK#&r>q5427k7`PwB钦SyK:<$-CNxYC̈́@yIG@?Pʏ/^ K/43zic,2QǬOT;)\_z l9.'Y&@MNgEtsqѡ@_7B脍Kv $P|BP80ЍeqXΤf?g&қ佄cXFa#ReXU|&7쿀Twvw ^@rؙi_IaU(.hu ;IVQZ}4(='_OD8.,1.`9{+ r/wywi_$i43|T$=cOᨧJ~&^]'>@eP܄Z`Wde9`M18!By6a`${q"]=}'C?YB1~iLo+'V`g\-j^=-Fk M:z3`,!#$zlĉ yMҢx*zY>"1;֢a X5d"rLnS-j8@,3/qڢ17VȅpSx3= ۙSI9 QA0lJա]K[uij,@S=r=fC~a_>iZk.,E}Σ a>^ /6? 0cdWӽƙ FU{BAcAvh#Q|  {"^k<==WY6. { {!r _VpJe!#'1]Ǣϊ&>6JY1vWs͓5^|x `?/\Yʌd3/{g<,p4$4F/ĭK0䅏 1\/|"i{k{N镗٘=%! ?<#»PL0;@V/Nk>+uuN ;eGy&8< s**n#-n-8K!?A`-LBFj Z'C؈Ec|˜77+4XX]Cf0otVG8ωr.Ӓ4o_9x(CwL4Xp ˇ~ͻn׮(q)G1~KHvVf=궀c,s^{O9Eq)1_&j(ifuSOyLW49h^K'z}V(Xl7{FΕDZCi (((fZ )/pO)Ƽ݄xRY$ s>p!J~ID$ƉRnM-r=&wm P s#.ɦZ(*(?i@&t'/f0.K+ɏAQ~3t}ײ!c'.P(AJ!llGbB`0rHspQwJ\9"ko}=ciS M:$" ~ׯ~S4U6]f |>χL[uW8B 4NLJyΨ b2L?Mŝ+M{{&ieebX\q&cuϱ3L:|PMbG$}@4!tk h&W- @c\#^Z?\_C7eUFCP^lu9$ufkQ%jBz:c i૸3|5D3TSgI3:}ΟClOSg>dn'^XҮRQ.vA6ҾjBrެFy=X@^<ӕ9 s9' }NeeLw9 |ք1xJNQ+tgF. 'NkQf׳_1 6Wϰ/ }O++|idunlKaYF0JQ~ sm)gYX[ @I?%S|o] d6Q(t0?0AqԮ-RwFsʷ vX$TgZ9 2YqCD5"&pFL63b`8i#eD"}ŻfkcMEG#~j5.8%_7Rd@WD({{R5U@⽛(`MhV~IDl. q5_^HfCҼQJ|HR:`c*Qȹ3I?i",v.qStȆѢ5'@X+@̜WV L?@غ&E+g |$k8fnN}2z"6㻹։ 85;ARBHBcKbقag,0j# ym}wK/| >9HyUVT*gg2'xɒVvZX~ϛ9?2N 2~ nk$3_ϲʐgA2%K$Ɯr[Bm.+ށ v 3/=ab@VX—4^L5k+I=G6:uy Pl.UhnA1*[yӡ~׷|}:4ؠ P:hG*71þKf"6o-59dUK3Q}00׷oB Z&WH\BSmڼś5ռa#H&4HNɕ~;1hK\36 lk؋&80uV;D#9lw^ش4S1wg7\*|x<Ҳ|[,"L4-<3{dD̓B/hH#);x'IY c鍂 YxYןgy/A 7AI|zL8P v +YHRp $n5z]}^=Ypɠ$N;-٤[a_j E)VQV?D3Ց~77Zys֮w? :t b:"۱Jg^lwax jZjĢ+ď%@9,樧){Cxx8NbJzͰ m ͡T33 +.-Ejc{REH•淗.m_e<+%=B0Q]@DRփf:t"CZ0 m?YGp3 ' gT egx.Ef1Utrxr2P]Z"BZw?5(ntRLWYND}܀)[{{q!Je}*1'jؕ<:&cg_~DkнהܚetU/g'~`*8lbÊbq(z$3)Jcك.y'΃ri˽'V ls+r??oMv*" b [A[ S_b7:DSq2NP9'7N`Q ͷNM &lŇL{Oe =q~p;QQ߫ڝEb6]poLkz*%mE,֦sJ?{y3O`}~u݁aDTa7[Mͽ] JwUַ}YvvҔ\{j\I)A2) OP0qK0CMGKMTVU ւ>ӵjox ;N3瑷{뗯_Ǫ!ӷ-X`_kp:O#x|G52S~Kn &R3kQ)οwѝ[6:-_̻8OmR|*"Op(7&cVw-iG \KV+_)Lf1ºco= (8Fr3nbv>@ČNq|쪱Gfn]km,ffÁ|;scIa97SQDK9h Ŏfװ,,ύ͗ 屩jy̏v7P~[ `֖JyP XSG2c"<~K%n &\܉h& ~a}{ϷwGc"QA>FK' +ɋS|$.T5^PQK_ -m  "ڃKj:^gI#-я}cu!ou<3_m[&AVvgʰ3yT r3}ԎXcE*c9l ޙ JꗽR4ajh@IMT_o1SLe@n_U:۾P=TaLhZ_v+&C5G颕e^L[. O*Vءp#By}ܤ\0z: r{n };{(pIɿ߬ A%htl4@%_XwW!ڤ*l.riM`C980}-)~#y\lĿs:X4!#uoQ? F Lom7S]UxEOp g%,:Sr\g%f4E4bkw@X 9rxX\Ύ\ &Ǩ=n; K~T^(8}ԕhיx,`^Q #H!WG<$/ҦWbTVH7O=DYL2Wsɉp@)6ZbZU}= ˑL] E3Qxc[GYFmw^lՌ袄p9+OEKl7xppkW,"nRF9} xBZnWQw7w}9H4ib| iu99uPP(t< Ru "jg!3]35}#,W;./֛|sV ѴɓO4JpOpfiժ\ 5PpWxl4sX?=LsA(PJM:d~ rmeJrx#喾 OE r Q:.vа!Q7 Jҝ7T]$[ҽPg!a:={DOxԸ8jKcQD`Aps~R L̮*D_ af =XB_e0H*UcBV1J^~c_bhC }Ɩ9_{~hQ7lv@os̻\*JR@3ݎf!a\֌?$`E }"B3Pӳ~SÖ'y阊BOs1lzW4S܆26#Ƣ]Ԟϖ (F.FNT9"D4(hXvCSdXhU1b@@~2b(h6I-`|jqIKf[™ YU^BHwq"kJr!JdW7n jD||`vXPI:j8Z9 ]RމDiMKHl}a wR|λ]c̬)6:6+#g5MeD^H&lۉ#\)KěV6eNI &D .v%>ŴA 2WcwuC:)xD~;mFC ȲnAL'6utSKvD`aGUD0Lu"rĿ E۫2 #[`Ir*OJpܣSnx \( D4xrja _޲|Z5Qxeū|ۭ5o&UF ̧\6q O볱b6nv=@>)h:p2hi ւ~($b.x|G `yύ!pCU՟V ZM.ژű/%xsT. 1;Ƴ@>_x_i}P,`3.utLV.P6lx*Nt' ܕЬکd|8DtB0)JDKJzu_GE)9Jޛ ђ5֓Uu(w3v68hBkjVk;ERL*ud>#=}*Ql0b 3yjjy`V6&WmfwC+I%<޶5:;("ăNy&L@h)Ys?N{{qU]^dq܃a^ vM|Ӻ$ 6;O%L%JA$^C/ 3SrE 7Ye{**(iП ObDvF.]KMTW M)=>< /$a & *71SquZ ю RfpHڹͨ. <G^j~ס_u_.^d3¡Tq JȻ+ .mɆ!TO !)m]ރ[#r5Oj\65hFw_|BnK8e-5ώ5F0wH8 7QCU|E&"eSKv\!2R/G[)"Ģ$3(҃/wp$hnX@\n:A^l3¥8.v+}.hG'~d6aig8:ٛԭ_$ܹDXkAzPA~SQ2NDB @\'i鲻^u \5 e7yzS]rTt`&ܖ.VStA_O1g/ gf{CjVym漬{H59PJO !Ca9=Rj&%8ʻ7#3d6J7  i3t\m_)~FeLq[ΞDڡ(N,Q<|[.Y?gv"D|kĽYF]豂BJǯ; l{l2^ӇB V"S-E! P@靄i$_54/g]ٞ'jkNW -QtIy?AH)q'P3܊-~*QH ˟|ݎNnֱVQEֺG[1)7` %M1(ժ,aPٜe8B9hFL J|Y@X1xm<j]ĝšLkSYO(TPlVi .s0=TD'T Fh <["ԩ>L0 W\Ѳ /f;Lͥ3-U;-05_dtclG[>5jcА0D>jE,z7P}SH,bZ :JO[rPE; @i|mOqdI#k^fǼ7G_姕b㰣(#dÇOk>[71j4av0RSo9PL=I_cFw2_2 C=vfYʑ;h~!:ӰH/^Ew[Mx\8)ixe -$ Qa>AJ XF,E6HHT!Q-s(ZdJ{3) 3PĿfo|d^e 9B _6./X\8ˊY7UץS3L:Xkw8;QS}h^.;f@shʖ'WnO8[d|IdLc`P]q *4 ȞHQҪS+N"gӝE~׎^V;Ij!r]2 v蔩Hjc:7O-~F媑RTzN+J {G F7e[}Uh`eXya>oTF˲Ң]g(L޽SvywVn^>s$)fҧ)M)=qӾqsQI8f1,T[g= .I4L2̀f,|^N@ϗ!YQgRFqJЈ׭ 1DJ] ,LuMâفOnh[Um/ڴPGX_P/*%@So:%F8tе!!枈y [H[4ܣ^;Wϓ04,9B1|@. hLxX$ p }l?\UĂך1{ MRx,TrQ'kTY;i=uXl2_ׅjOR' 9 /q _*JTjѧyId7$)be30zҷ|#I͆N$le~| &z)ahXkZwAp, .[ҭUzd:18P~dA]FQ5,`ErZRs늋XM:NZ3VKNtnAh۔憊-8"sɛm.I"w(S"yEj/f\0Vw+Tu< B6Y M䴞ƭl_z33,Nso1 ς߯A:Ex]=WP_/fiFaic)lNQksAeӱEB ?Mh#[eu&4zG%@Ab>N'XK*Xv r+MB4>l*R:u@BrbpF`)󞀎3|S5H^,w`8d~ƶhDkd,l;mprtB? ޸ o0u.)J`2#@eSkVQb, J=s}8m(*=K2,iJ?~j6K]5CT= }8s$@yJ $`k(P\oϷ[dzbx(@ XRς' wNf7h f!lѠL:(瑹uVz9S$XGޥV/GDMPB* Xd|nz!+!3Ds%%juהߗ~11$@xwqys(@)z2Cwsv+n8[)Q(Y9,pTj\z`c><e"RۤlHR t'KJ<*3p]ä1_\4yuZ儍bq}~=p[K,,RPii=w횑k6g#yubWx,c/=;ԃ$आbvn l^GG8Gp*A0.}jeUMmɟ}5P`sYgU_P%ÅpԹAYlڟoaYf__3H[;U0IAWfڤ1 Ԧ&S o+nh^gn_@lUrWVj(:}9߭Ha3п|s{u %ZJOc[lS+BwY9s=~NV1u]4AM7Y 5$0)wfpO]t1@_^x Ԓ$Nq6 Y[ {?qo!HJ]1#X!NP&!U|hwزpY(?`u߮QZ\z+ZC#&5eOE^(2<Ua&OCOnPNQ䝆gD(V lI؟\L)n)&b`8|):KzW95<['}%~;Un2ֺ]蚰5Ts$z6FD-*;Ljʮ9˶>*<}+3ư^AI݁\Ec;9r|TZeG KϥBOnb;{2MЋFGyz5N<;1i jĄJ!4+u.I2vyo"\XYP p0q+㵲uf>P.bFMJ;|fdݩ@M'H$](V6tLV$zi/[ F8м%vֆՖV7i}sn+//h~j] dʕ}[pFzUPl=V0<4|'dyA׆QJTuшR׭嚼Bde0#"A$7i˰y&&.1`ӏ!H4!gcXԸ > u/|e~X ! Fի hf{a(9gChM@ g*V_E'넬9.02Y֯H@*dxE!ԩWNfU./3Ne7o>-VeN6/>:5\S$Y'-y}jU Nf'F{i#FG ͞ų(O\+!n *!/83w1\_μďb~BWЏ$+,(;ru,>a/|ǝwPA,ԅJv`EWaܦW@{Y7AzW[EV5{Vl~]70NK %3?V'z;+=9 OwrxFn+3oautZ ]SQ~WM ,gKkvQ}";.ђ_`ONqj(nƹӺuLŹZy1;W`_w]y,Pw~YCD_崤..aa]o4 M3#p]rO7Od@ncbL['CZnl5@rߨ7x눧џ WjpŎt-c@qBp,i2oE|YκK sUrI!vw΍V6NBv;OY@$k͊Rk$cso̟T=b? Bh4X%n{Q\Ȓ cIpߌ\= )t0A+ و 0JrVeLSWBo~Ȃ.u;sgԌTr!KtVO~S? o;'͓L4 .޹noU WiLOQ_v~}|:M䙱[vPX>!Xr]$1辇׈,gumsf7P35}VyB@aXc3,+63{oVLgA|~:Yyᷤ%w".`oo+R$ 6=*\.awm\6l&NumTB˓Ȭ^$0TXFx_k<] ߫">Fnʌ>=㯯%fD:dt ɼ"/R%-{y(OX2[>pXG12P-i>4U ~Pܠ㼁a+uĘ-DWp6- Rn[y {`qDj A➨}UD˂ d ڤ }#Y rdN@sUИE\HdhXSFn.J*'1afo>v1o7vzU5<Ë֖ՆD]%!K&L0QҒI+g KdwmA T&nH,< P\O D03V pwm9F[%RֱTNS+Ʈ֧Q}6V%o8y-ѳ?a'M6e0 H+u$0>pLb9ݬŗ]|Yn^w<&F ϭ3,HHBW3Laj QQb#c6Gj)ɘQFohԼk8aN,:\Tg)_?2)JꈴEu\FtcM?afr>2μE;<4[N%^䅑>إzCbcYh1*B 2#1endFB}9jV]XYì :lcm爵d=Lț8N\M1=Ho{ФHRgubuŗ ޻<قluLw?/ߓpR]x'9NTGK礒U^]Ow{ c~Sޡ\tK,ջ<%o/ ;i`tq'$jHqm}@&b1*T_1&NpTr=W[]q;*@5<$&u<1Rq'?T39Vf6\s_.{K\iM>!b:E]n]zkV*vw]x4,J-P% {l6d7< ɰrU!*H+)V[$i<BuC갿2~%e; T`p7sK{ߪ`?Q}h4S_xLy-WO@ŭ(ZzuxƂhY>m貨"Y"ӅlR/JWZknY:e/.W_.xZQm>!L$O 7uxqO,D:)q)Sꝯ RwoWiB$d}!S.Ɨ}`LG6L:+CK7 I]v/X1R& /Cc76?ypM>z>rMf>%#Z H;ɷp^ `>menq'jY,zmJm*wj.RG叢 :GKY&;9=mȡPJF.Ý iﻙprz]M_myLv24D:%nPA HFM٨h=vқ{> P}ȹi_+pW$@q)2k~`-IBMJM'ݦTON ŚiWKA*b2u~ I~p55'%fK>=M'66=GԲ[7*}Ƥ@L+Ka6S{'!/FZ_E~R@ V+[c ?}JB3}U/A(nڄfIbS^4`E3l0 HwIMi9=kT{1G۵WiEzxzB6Y3_[AaxQ:5rƸ7AfSV( )Eqoc;@XÏ^^Qe:^giW^W8" ]- >Yfcsh䎟'&:>K%z-e4rM~g'DrMZoh=ڛGD#w dCBxFhGN Z@;_JWA#Z.OpcJ|ӦY).N;7֯x&:1 JM<ķ x;$Z-rk_eCSvŘg5Lau\M q1?ђnX [.MKdeH(bK?1k>/J]`3 ; {OR;Bm5 bA*UX>:Gi`t^&ϤCReL;K'^*!H66| .{M-\%?gb7i(uBw1<#!Vs _Ǩ0NsYđUF R#EScbZ[ NzM{ؐąT{GxR 2;8ulGe8:(UA&(1t㆗=}whKXj_!p)PXSД Ҭ1DtV?{[wg?mϙ?P&1OjbF~o :2͗VJ-7 ⵓU3}VO>< cJ>GҭY#hz`ٜfk=j* qV; GŶ`Rtglۆh$&C01okN3W, K aQh.S f{9RS[^]!( }ZQ6bfbK'mTVjJq,cV_{pAtMOȹ.$#GەAk-'G4 ~7fƐ+/eSzdTTU;9,|7h%ű%cRb6H3"]fMz K#ufU:"smSF`v6r FuO*][Q75δ2~3 ւ :d%HF$Yڷ4EBI_~cD0Ox ZI=\wD, .tj!ˈ ^幰]ojDl<'gT1^+-OC`NVJ5{ط;&a_)%th #u?=86-'P/XM`~Zy:2Cr틟IY]\Hʉ3=ʞ gQ~ָ p:=PLܼMpn=gaUh<`=27Ws! 5Hʮh(sè3ґ7f,SB"fQ )R"c/ 2`#]tB$k ?q($|5~PaakXZPdsf/4=99lr} ?&=X)Xn } ~صP5v1mT_S1.TŰ;@ٳQT3/5?wp‰'>~y:PG>EZ5 KT XC]Y)>i/ۀf ] [7x_Hzqcm)zÊx1>A 5?%xPRfdHT}#E(z3!ߟ:mٿ@T `RuOv#& ;Q˼fDڒȯid,Uޫe0l{y\"Qznѩ$49B]b]'H 8w ( W0Z9]dJt{5#5f㢏0_|]?o$ґXx";eKGK 9Vɿ2mz$<jpIC!55Xrk,E~k50eyZ('jtܻA\ۓRZÆ&N7bYr?4^;m|5"r(ŋIOw?jw3L܇h7_/9rTKIbHjϰ#Ѳ@䨷犁EKBGhJ~wClϛ† ez*Jl$E:| p" cui['r귺?(EkL@P,?"&j.sܺ|PE!I9XS9?fEB (K*=x_h tXUa-Le0 0~BSߤ[@YZf MV2a^>5› [b: ;-:epء(/9a쯝oV[і <=BxBȉ~BU Ձ׆O0hC(Bj5w[' O$dMWQS$gqؔMDjGyװQ#~i`GݤvعƔÙjL':$OŮa05S"NJ"šU  k++k(Z /!(~ƴ6:eӥ,I Oi'N@Ns X5nL%8 ]n륛޶Yv4c9"喹_o*."I R&͋ ,!>9л]T#kR@G.{PiaR.8*SQ6)`^ڢX,zN}Pd*sdʥw : ؉QcER6]j<f:7ay."H>g LDvPOԇ4$9w*$lSu5u9xƑ+839 mٽvTV*Ϙi7(Dƿ֣Οk֩+Wf.e֪m[4[$` QX seɸ[@X޿'QBh\{0/:D,GQE93Ƃ:.2䮜 *mU[WycKufd'](( RR+JUeWC{0%0b&1$;ĻTo>#CU0u. $Dψ +ۘDan'6'>#BRYPN5XAb ȸ步rea@m KhtM*WhNKqog"rpF (OB5c F"{*(bJx(miaGshT?Ds("5R߿Kt-~M+1@<"€roT .cܭTWGSs#ҿFxfRix!2Y.kLbLRvԪnNn~;,#%Njh;~R5-6/*q4uTy(Qzz}Uu,4*|mzI5nL䦽#PRzXcf5f\{ʩ/Sb_҇nI]W_pqr2Y[(fGȔ.WKuĜ ';s!}N˹ j `(s&4=$T¼R0edUo8v *U #r$ ]ۤG0 8A~!k]fg[8dh0 msX0L/V{'*CNl&`ɹp?Nܼqiz@Ri#XsBZxEzT *Ӈi>#;$|w栓&[]?, \l2,]f9F?csO4"[yisbt|\? m.ָN!t\m$ QTk <2  XKs9zՅzpy|Q\$X/T'\Qh<;&\d]eǞ:sHb]cW0ޛ i\lER4}V81VPsɉX3:wZ ,V*Qmռ 0{+ܪhr?9c狀q!󣜞d,;a2'$1Ls}KplKdo]:PWrUMJie^]6|\ҌKݤ[L7(;єW{KTVc}Ƌs8wuNix)48Im+6~S~J4YGǻdz+EX 2agol*aHC/8:%|@^E4Z[vJW@lP;.Snf貭'iMx_‽"N|a]|BWyo^GkF:˽g@'h/@} SQ\eh{en"z~=KG\3`7l麃uz;CG?ZQ\r0 thYQ7b=$p/^I՝![$4>zҙ(h7 cAW]lӫ ~*5)Zɏ4MLցctQ18F.ks 5~|"I;}֗r+lva rJxw{L[Rd;,8-WL v^XMȈjY䖕1j?#ˬF~ZAt ,qJ:sPX1ݔ{``AtW"r"j`ר L )DUtyŀRz8ˏTfЂRBrx \K),_r ^g#YCIl'V1nukUrQŇ!u,fDJ{9tgk޻֥S#,b f9Ge#vr>JOyqcQs]rP^,1qٞnF""`5K"l35Oj㶡S5]Kg.[4m*zoICFTu5{HRڪT$ifqQz0lJsrb?  \ftN+5*}us?nvO ^[1!>Uwk"?@p ?/E٧+&]N$jT(i္3ٲKg!'*W8+$e٬y+EۖՎ<'}AH߷<D⍁t!f 1Zgbg;WƸ}.vmTpߠ6@^ujZPLoa6n=nE(HɿUn-7_Y#ٷ G0Z ,֗ c;h~+Shɱ-1lJ2Ϟ \~(َ\pPM6|-Hb\ٍ@JCpː=B +B~8ax2\.Ma30g(X2HEBYG3Gr,,wڞҍU㍵#.n @ĻD,y<ird1tyYͧU߾yE_'zV>(jT@[sషM<֒d[MN1с#EKh+=oK|j>kM#M& ?k&RU\RU^8gQ=D!oAhEHۆVXzm4jp!fWı5|b8Ol'n/4ex8v{<ⷂL:Τ$e@̊TѸ+p%܎ DsclZw~T*q2} iu[<oʝ,j?#fO; B:e{{Y6ݠLłPS,QlfCHN ]F~:Yx١d=F#dh -aƚ=ڌ cA? n_{!Á(>F2ˉ BF .X-$(ɣ])1596xRga:8 uNXNBךiHLU9 sE0*mnBOAf9m% ` 2KwN_:I}?'wgX3I|ZWE=kѬfd纵9,pAS+3LmD"W#iT!Xu+A ]l<r:c!GL5[8A2=Czn4c5)+8>w3n?-G: I`_6D4K{;T ǫ)2t$+5|.ad#GևYj.kYts9j~=2Uw.J[A'tއk?jy,S䕽XؐC]J)QqG>jO3Vǩޱ"yɞ9t $n9Α+S{梬QQĘKYm.LěA34 e.i)o^ahf*]; ^Lw2Le`) Y":4 Wʂxh9>!ϓ6(agxbAv5 P)<;rT.ͨE[諱"%^zk){*ykOB4Ȁ[3J >WZ-ku+}&eȺVe~byҖ;{ wẨŐz}N7K~q !Zt^IcqHD$L㤑A'55T% Zơ7qû"Jz@x1}I9ATxKNNo>j}K,/ tA=yww`' &yġGƻ4Ibk2QSN';s&p6qчnv6(ߕ S>,nI/j~tȖSwPcm,w_OzkhNV(3dͦ+nDqVuQcFk~wrv[KLG}q8XQ/t1S'gQdEX?Z~ L rz0-FxIf2̍a.+mJyAyXl~ew#HHu_Q4 g0U$Y{pwu34e}<1 ř\T#LV%?[,ϗv†?+jLB2*IJp&vׅG=n ]%z3~5N,? k$5x_7 kzSk1yژ6rTfKG*/B{HaŒ*%(xIELZ&fxHN*:]*޵ɱ}嶭q3ZiȠ Ax;Tg.L:#6)=BpJ6z\Ǹ^ӯ͔3Jaw?X]/P^UY,'*@{Dk^>U_ki LCFnJ`jr@K=DPZ ݟpGkc;_.׌{,èy;L$Q?4s6[d3X cHű"BmӁ)ubSպ6*%M aHRPJKQߠ˘1!n+=q߯*Ϳ9U)ݾ> +{)I3=&i8BG< `x_ֽ̫6 O*q/Y>7[oi|ѶKܮJ5j)=5,:ik_"h@"kS8ݧ_ DFy1 k%\F>P×;./3SF# gAHL]#"F3=PEo]vO^ăQ>5d{rS7KFe6Y?ṁj.h=nfd}2։FS1ћ:ШR:?Z?'X @zZL[l]:=Q1%#ct$:MB@l7E4u=Jp+.NkB[FfKW0Dm@ ޛ鮓:|nσ":W}2VQn -1 &KCi!^ @A4Eqz\ L-T2OVṿ[Y r{BemJLç@ka@@>ёh _]X6L;@{ips~ȹ -QVWc!K'"E=[P?$R4%r&E=5γrii8+nƺ-΢P_FTm?ܬ5~8}ơw*]u ų8:Z-uN#Ik rvčhֵ_jNn) `FRƭ+pZlO!(^}TVR܎,ac)&N);'HBl/gS vt^=SOFGFoGTѼVS'⢃=&/'4 >tǔ59@ku?eᜟ|";d 1\!f3Z)O:0bɚ,<lq>2w:=W0Xs^B&5ܖME^e6rla=okDyg+BR Mqʍ'xLPJ ̟J41>eL:mTE7;2oAWφsѫJJvmfp{ Љ<&/,_ U(7uG;Qoq.vgFh~1I&Qi%4'BV=K JA.{{!tJ7Zԗ6*߇Yo?Tt4}Ŏ, {_&,ˍgqy5G_[&HTzn鳅V .]XtU +#w`ZE!krS`eaxJxӖ!P6xhYboL8tFΩTX2AH'gf%=#C24;΃=t:"RIne/GzI]iyy jf^!>y0)Tv(^J}T[]1F6!^?M2dZ/2Çؓߦt$̃7ZDlOJHҘMkW)cvWBZK~l_Ҧ_}g;>I'w[Pb< ߇25>de:==G' ݝ'k R[Dp wUD4$7>C:^P,cGՍa~#ewa,COAο鿣n-;" dfәDQX*by} 2$*4inyIvzeGÁ@Upf  (O鴾KPTрy;ZS.Y@mW,IvyJ'd*3sیTOmr''jO06 @t9Hcm㴲? \ Ds&I:c%JL$?4<,i^BfCR[+XXTD ]X+V|ܻ2:ǁ2]\B_blm-X_SFO,|Ĥž Lw'&dK}MʾQacQ,V؄lcA05kc[@m{:C7/-;EF$6>ъs# >.86}!rlSif^/g"UCYUf@4D9⚟?jtl.̮;PrG(񕃗ɰ)%s}*)]OVnnj{TB[G0m4כE4Y=KPyҒd+pKrkX{Oo_iM)6I-J_.mdB=ū+GV$)-CNn5eVR}ҠþĄzMG!"$@Pھޭ@o.'xg3`z?Fdw@rSr`}RY**YGOj npPܟ! ١PSB,N `g7ѫ/Qߺ  v`@MVq]W{;hQ^wc!HZ%Wz9X23>?lKf+ނ7>-ߖ-^% i%#χam,A@Gpr;ʆnjt麮o>z~ OOΧ$e[`84ШٱJ#:7cqiSe4g:$~,^×DT4#sM]eO)ER+f{yE#4mocv=УPc&0=>W~yHwim1["Pڙ.F 0'R$Krh8@;d\w I fվ +s|6.N-N bO_:.HgLgL]СcwYFJM`ui$*U@PR5IUr%y_n˯ƑF ]$=7ӤL'i: y/uh|Q_Eț!x2;}YXHnrz|.d*9͕LFΎ;s(kq?K[0V `-m E7AkuǪQ5W dbQ+y%5yzWV-Gb]QhYطНg`a ) L IqV K`nBW^2MD{MS,/9zUn^U9- -`;!05`(q c.VN'v90DcQBt`rR"Qq$L $kؒz뗿=PbQ}-w^W.,ZD+"ӿl:RѰ%mA!p8(@376(6 Zr5{+Um>U3*v  PNW#Pqن]3eVTYgѓ8'`LӅO$3H܊}.cum[؂: NSP yS*y4':l6~ 'p\8,H! Q2Іi=hA@aB#-J~?8v)9Y7oJmhR驂ߢ̸b<  R#||JI/92&n6\Jp`ĜgWa 8 r[۟ajJl䃩!ٺWkʂk쏗YysvxymkVi1R|Muw4V5mHkИGiiGv&N*d F* YCY9cg)|i`E [datH^$ҒAP|~W$',N$͢@6p& QΛ\s Ƀ=ݞ.g!Vj]Kf2QwX3M 3x=QyñՌ=2hzºtKeCC Bý;%r- 32FcsM47lRi(n#͉A_@΂ "4Bmr\I}0hg5;4wu! A&l[PF0g}?9" g Ǡ_&KqIZ "(' K]9布dj Ia!ߛx2N5DP<qts6zIQYt~(Lq) y)TUaA`)iҐ5Ht1a` 7Ô# P!݉6Tu y,v+Й&{%0Hci'駀@m,;]F7(8ipX,_+2tYj_K(Vyi 9;UBG\L$_Mdr& M:'(5=$HlFnzhPB6u8fEJh_t! ƋEPWw3=ԩRFζT"dVLY;2i;C#T\ r!ܘb4qldz= ٴCsBބ ڔ ,.pA.8j=04֌39}y"<*c? 5м81G4F$L W;1] rW;ED ㉚2~"gibl}Z9`PJqmigXO8^LX0?dcƹ٘/^۶r^i?cŇEwHCFY]K}"&@_;chQ]$X+5Fثs[!c7lA bL28Pl8G"D4cԇ2 )^PIOܨ d. LÑflU? 5~/=>%#kXjC>{Д#.*8Oؿ9n@5hH%D ǡFOan9/JIi|ii-275A`R7KUֽ Al/ָ}^RIzqHМH՞7wK EQCs`wPW DQU ~iañpxd) Q АP t4:/0bӸ۫yR`u:E3=^gz ȻmqX|`fj)rJ #=m!\yw@/EޏJcn'>u}B5tGM8JE3ݳq]G_KO/S-Ǯ 0g~2q=x+%`v: d!}O{Xɖ'V%2He^|X!cxm8xʤbΐ o|jLr&_s-AV60TMՂ5_*B|׆jUϢZZr}>z8ڬl^!@?L~|暃n0?,^M\1kX`tH~xHߠ^'(P@HmΜ0advH+Q =0ވ cģnǶ"fQqk ƭc'"~weFq͢]5*ĖĘ Z=Qȥb_I-q3<'2ah$La&1ksk,KJ(e;&|2ҏ+!}DgBme| h:]yg\&T 5n5N\\g,DmeG||x,[6NwU#@^~1`2Zplm?Lz5[TYZ3yC m vH遣src '0\08sO \hw;-6O/\2k]@6jGSSݲ%> (q,ޖˡ9t,P4?Z0\_"uKQAvҗ bqG]v"fQ)_*. =w`ے#t>S䏼³͝afTke::dXck_|^Hw0 u֓k̎_ywO]>3a},]d-Zƌg Be[ 59Y-Łj'z%.[5F9 ݊NS8.qgMFqM^{>kPiqht9Eߕ<qr UT1i]}0׈9]avpl39: Ak51Ӆ"?F+/yt@2Q[KՎC^*_:[ ϣDT핥FB=㚤:+ۥ+rY#ĵ|*@yFj(#5%Mw0V7Tt%+\y}!";BnP#h9nێ~190^&맆A10誵=;pӓuy{lV<bLNʋLEJf_mN@Ci9P%|Z2Բ;j ַ5{)2*JF*=lsBscaJ/p %6NKW3J$zV!fݥ"Q}GW|kd[X G,>ݒ\lbD\#8iL]+>u^O꧓W3K2Q#P=i[%(g]٩"/LH90?$z W]`j~zGR ;w@4r_i0Tz#Mt4Hwy#$ܱ}0X(7t`,+dGGt PtUZ6`U) mJ9Wp;XV Ҙڻ;@W jy&`ոEIH5Tէp.24(RmYĠeXfP{3v3'2>)YF=2MQYai{NКVd,.bBޑqZpUլF ´ULvKdA> (*m'jBB0Sz;y1vAA`V.}&w!.`0 ₯(4wܮr%lG`sÓ h<7ZmQ\?dwqlyė)<튙)` JX628. hdzP!Hb#c9=ђQD%DQEhkKf| œy^֥+%Ko3H=XB)%p24G!GH(Àdo|ނ#.Ξw^A7bI# "SY̭RDp58TtcXgoyg$iblgww.w%>{ʖMU|WVT ?Oӊ8:y} _vh6;dGGPm}_` rB^vD*;>}/75~7|sbJ4)]!N~jI)bZ|<"D[ԓsf k)E*WT+4.V``י]t3 #TrZVU+;z=g lçWܰ(7 `}^xPeZŜ:eUB=*x@JTu /~4f`1)q;⠈+𰭰TQlNxڪT b [0=sY`D"#( ROceGkApaːS3P|+e2 0'EmaĉթA#t"^9~=dZ8Y՛( -cZ$j/:CI,ˬ,xK܋B9!]&"M2&I S+=*V}:Xy [dH?CGȔ*SSꜰ}k:5ؤ'6n1MBc)WC Ij-_|J~G#D3*[i^5|j <`AoG4 % 2LJo}n1X-iQH#" XTK[\*4-cn\P3o NbYT+[@3U]*|, K:f"QF;!fkwbz2?w {nZ=g;js{|[ŸPӪn=#TxS_kX8sv TzWJXԺ&|Ѯ]R~+\DP/cw{ۤ3hwaSlI79kxNu=yH>4C"2utE,\Oʱ bPr ߎbjjWVEVҾI:݀0@]jbG6vU~F3lR>mx\@.#paƕx+ޢJ-KNmE"FdOPB@ q o lqt9+"}%llU <9z8Ұ _3TQxm(4JgL%=buE4C0˦~3̶qˑܛNRyg.DAjjRCs,mHX to0xb-.Hoo9'`;=sϧq-wi.}3`ڋzm"z*bY.vl?Ȳ02?}+ +ʀMRMS@c885U4:IâvAu0/z(KW[8dOCCɒzD0Y9 c=x1A>o@"(zh, ap(5W wwDRi,n,'a1X="qR`>&݉ +'!-FG[(&Or8) A#L!9_ 'c>Y$;c+ȆGɖ*J٤r M+ӏN Ut/ʁb; \I=nr~CJ9ZHj)l 4.s#]}^WRȯD$!x.7D#{I˷ :20\ኂ5@ BmRO.ZCgú?F?*px * ,,I;{W\K%t^jmvtp\yzAU~'p$Toho"ӈJ<_ZWJ֍]{-,NyA(j7 с į!HDugJJyНm+,7MXڑ^8YUXud31 {zi_*YXQ뵻yD$˹o[>r.spLm9[7"7mqnX~*H>ZRW;~tԽGzŏ󿻽@f,8zIHYYիJ_$9=;Cv.|Y-E6FҎXhJGAPfðZ-/3dD23 LZ::D>Ȟ"j?Ɂ `ŕb|wiDv È_%YzX2) ,c4%doqΚhnOJezI&!A=>jCfL9њ.%SmA A[\i}:kAJiZjequd M?Ear3NcѼ)St3۹bݚ^^_҃2gFg&lE_ CPpv:#g,} i '`酠̘#MYUua1E&q/w%HzK*Ꞿ#NIsI[pn"wfJRm uigË#tGB@L1R% W}3#r%كU4w]~hRsB'wFP#ujLLHێ7…mh!iKϯkK;πחC5mF)TC4vi,= V)rifƕ>YF_exv}jo<s"r!y)rB yu_VW#Ka~@'MVzEDnsY-t}GVa~V= 1&˨Jh#0F=׹9DX̼MLIg}D:YsOULciE6o8/oJ/6h#m Ic(cJj[W$-@$Hr *T縐2x{ĠEb?|c@! uGju ᥍DC" t<㛶ě|D3Q,B>C7=ړ2)H┄hh(ѵ9Kiw:cWGXsߞ)eT &?HddNjS,>(,z)DTIZגŲ㯌(IjEuXRwvfw,XlbcP'zM'JWswTAFHտxQ![olgȆ yyX{Td,^H'DJOh`|of\./KkȋoU L RൕgQf wCήeٕn"bH]!gcòP^{1Y(t/)F'7.}GӶ_]a[llHtJ(e$M'$@ /R8 P*ZE+ɞpżmS[fTlqk#>:LE"DswQF_]Eи 5۞vTAzŤE%說I9|9mʵ9g;"}F'6k_Vj)XAq|im1Aꢕ:Y,ё\=9dMӖL}-$9:|e0+9ƆЎUA$=pt`u"JX^%Q|u}$2ⳝo2sk7['WlYHBP_"˨\* J*Ԍ7@կBS9 s n{(4<6$op`KK/IumyvTͯT67"FΉ$?#64;X^}|a'+;_@PϭY~; O5ae@H6A769ӘNOW=׋IOKÑ̵8o"MKcj +fW#Zp1KeG;(]ڌmAW01m2$!BĬ"d G&lX e:P4lo-s:J,CO c ۧ~m Pr_Q͸$S% q2oԤ8n{lɷ9d2USʒ1\X/XFG? wJA1 4o E=Jp&o_W>i6z)X`NsL[R+>(lu9{Ns`YFgUNGlTbf1#@șvXʞ9Vu PF&%K?e[&xsOi?5W[7AqɌ)g0!%0?FY#~>k]Q\9nQ" בOuznK[R ψL]=i +|k,wML*X}!hM[JE{.̩_$]2< Ѵ=g8C>gf 0zCXڋR`XrSwc>YLEykpuifLW. /[qBeܥaH9P_NObAZͯAZU,Gg ~+[HƜ W:FZaҘ"a/J;K3$X%^{A hKa\!vp\쟌Fu?PA;]H'^QF d u QƘ+:~{.M]&yBq, <.^v%BƱV2P(O 9~-Kiq,#`*n(3z1Cjxe2Tnǎp}Cmq܃ȹwA^ /SM i3Syңg\ JL{rނ!F6΀Ra[ 5@ Bz%lށ)-JtilhJ6RF[+pG=K:Ъ/_:.cyksVNB,se%opiZ j70DĠI hC.\R<5\Bv2iܐ@ ϰ MLc0>;h0,SHbĐ/~؉dwꊤ|rǬ@ԻA),?cJ)Y@&[ay``.hTB T 3{EDxP p5q[\ʘ7Q@5vSH^* $b q35(I`]"`w&T|P ȈBW@ =~4\odxT6:DM0絢׍r5<ډЀRޭ.]=+˦i ͍AZ'#{ZɧXǴi=h֠yN.h'7, CMn|Z@[H_>g^Y91.G;_6Yh6_|j$^K ٚY S- gKw0|e'5ukX} eGOg9I%%0:QۅfAÍ TU0o!wI}4gv?! a,sy ,c$AV"b;guωMQyIùQV[~ݸE_Lqyˣ_B#yzR2ky0N@"=NƊTʱbY'hmM2U5HHWNRf}!Yeg}XLiFDD>}L}CIɾ|Gq|Hà;DbXoȨ˞@ai¨X- 4缾]aAiڍeXY621CthA$\z3r9d ;E0L!җCRx;_H6,p3ϹNb,ռCԿ< e!EP}9aۿۚU6úDg3G W1~ /Uj ~|n=;GsnN a8z77Mz}9QjVYolg8QZ)c%xx2Y9N-qvm~Ƀ6mտi.1`Ł E Y3uJ Nī06kC563 {L :` V{%Fε*X#fB=FӜ)Ю2?t{nB8c X -∓D/ S8Ge ݟ= 0vhP)^2[5o쓑 j ,3x<6'UllWmx2oBԹܥiªշ'ʢRo>c 2ۇqԝ" %m]ladmc}K5|F뽬!Rz-ȼ&@+_HU!^,~`-WdYH6ۣrNܻ6 (tW:=]Npl,qD*, 9l?>"XዝgPr2 HY*՝~ݼDVjS>N6X]!Mˁ 8 м5^ @3}n5%NiXt"g{c RJ/'any3PV]g92vrsOLwYJ%E4,_ͪR5l.jgrsP1UOTi22U*D6 Hd"X\FDF6r>M}K[Qz΢ W(=#^\%+o {Is]'_#JdZ K8.εI $)XdSoGmKi _i ۳-KLk97*B $3dnKUffp̐Q\q#*@vxK-${dbmIɨ:5sA+gܛT@QTgRb%_Sǖe{Uㅒq搟=R!io-+dlɵAM324V0*8b\[)podl?W;tqrS mc ̀^IDHak MtAŠ7ꡤ۞K+{Bu-#kA2z33vĪr,p:?h}߹hgQ|$sshׂ_$:~nXLz:N($to2K~+"4CI` e(^ gA0DDPY^;ZuΨ7us]5vbU9)}"\=cuaı.׫z0YAFFc /֊Ɔ5+is;S`DDTHm[Ԋ9Qʣp! 6h|*;R<˼u'`N,nN '#T!d~t_! ='qA9V;P;JʣWяPk7 ,UPFkݶWyT[] D˜E- /GH1j6LbhjWn|e#fuQ{ B.j;?tSr/']l&cKV 1M ?0K H$CKK?FLjO]5xOlS]4g?sZ'Xee܏M]Z*1jɒEq5xrŸܟ:̋mp]J{ip#WO<~^բ7轝!Ї2 '$Fg uhșR>C4bh߄=xY~ud¾oetƉ8}]x}\YϡjFdw{|Qf֚?LX0l[%_ܨa}ʖ@~Ӭ.c@XW R>X9D 6VC+ /~MzA{Hz{Nb!3i0gV&W-fcmQe&/Eh#4Dhp40zA (,Yڱ0\ObnL{˧2i§ Nj3^9%k˔eCH+IDr;3P2z8ViӸz7e72(`4{igT, >; m1ʲv5ΡHt=-Yi L"c:0ċ?pvSUlC,O4oBq^n HL0JRb`ǻx,_G:6 #jQk > GEzf2G~7MMt|[ǎ]^8 Չ?U *-`BOƐ߽ԙvQAc̞G RC%jCjh*MEyJ%jqL4ٯe\E2ŞZIY0ۓ3ĉds_O "+9sYrޥȜVXgE!H4~NdS<H V G-C3.ph̰m5枢,ӧeIY.ˢzďw+@0C4ҭ+>(ǣ%kOR}Nh9BRz/:hTMPq %|DZ`+IyQZªBo)3dϪ*N$=RxaiaNzIjx*Rp6XdF/]w\0nEm 1VJ.Vd^'Ekg]֟<s'GuG bA`KwP{PSU?7RT W2hjcP#)myXA{p^gոRwC[e>J4_=rckFR`F[.3ӤrC"\Tos+nf1DX7ˆX'01MM+anK{&d)QV\m,&0 {$<':*dI$o?HG#EBdxV{e^f^"ڄdu ٍf'1wQƗg| EpR<˩P+-B *gATsXweliӧ*?"c["^X#o rIqD7Iw8_ ^t־x4=g@bKk4_uY1Eb/>3:F{` [ qԡYZ1JAtR߁R!U[Vf{&3y,ӷPP5?]^KFD2EVmg՝[_ i K=;܆5nD qcBb ǂ?wOEaٶXyWcWIr̽jJ)RO)46z /J[zNF&K ` :+Ji# 1ii,q~*Wz eέgJe ܓL^0ySCd3|,RxftLbw7$M^uUv`VnEĖVwӉ#$ wMŸooJg do=yx.+.[gt">*V)l@x"V:c;%o8wmވ:fPwp%m\'2i(nFMR o;BI ]G!*1EhA9>l ~=YŊ~]x*WSrqT+K[n]V|v3S8?Qͺ0m%?=kRbny64 ,XGGoӜ{2WgV##NO9)LT 4\wCY])J+^~aWbTkOӳUlHuQH1,g `BPDNEk{mѬ xۿB>DS9hR־T_)[nw(_KUWK)ULi+l,ܬrb=|[|<н|X̝9k ;M 7 -v#% cd;2O2CO G~^MFEVGy;?ﵲNȦsrcRT=@}@]49$ $R{\(CLWx: Wׅ.vL$q%CX8RI )-(~16َe f0'YX.9S\+@0DM `Demwq':{A9Cd(, Q[?Lm~3 rnJȄtR8tՇ*o;&9hqixh.+y*FD_X=\B&oZMiMj׎T;FtM[~nzz{[ĐPDuYsĖ4,5W w͟@#0ԝ&fHbS}rrBԳ*ʧB}!4}UJgܖ-{븷I?RF[z=/ u$DB4hQX %u 0KHAa>&.~qO"Rz֓)?KR&Yw~x kԯ`.|1[y!:! 2Rj[a -hv}C*8.}6dqpȹ&zu?nڄV1~W0lT{SB͏*!(*k-:JQN`5NKU$f{ե0/f L~)،m}hoZ'.j#:;6E>y'|*[7aqYˈtgU'wB5x?X{Vn߽ܺ>%(yE?y_>6О%Ҟj>ۻ@nKrG,%D'e7t(/ lgܾjp,h j_REA-Z4mzyOm- '\{Sd>ht?9W1"3NҜ_./IIxQV"C?9L[(F ABj~Vݏh !|;̯YI*S^eW}eWFV=Az"D|KiJw |s眅,.X2uK_Qk{sۧ;+ Z;4 _~_:VPՍZ) M (Z >4-+fUz wL*UstXl&6=l{X[M°f}6v@S`)WEz ~eŠ6|`RGJ91eVͣ}a@?lz;QۑT\?yAg#(rs.Lf,7aq/)> %6'[$jw`zWVp2Ua9ںݽRe9SRM*ݗ~>ᅾW{1a0R1')]IEj}m @mts]K3 (zmTCpc / 3/Gls{B ʴ5fXU"`xVCG.*[`vhp<6rL;V<A5Nbjټ9\NQz̯b+ҷ⛉kj$}P\@ə:~!EC59uePa/tƿ SiRlR 3wݐAIeX˒r$<1gx6*Hޝ4(ap+_T%Jcp}dB-פ[_Zm&`Cb7mR݅zt&M;e5준&ڗPX8֍ʭ$̞cZ)Btn9iOc-6N!caTi#&ڍ6kUp( QXrA5ioӇe&~3ڷ>ADꉩrpudcTlѯց%@g8>m2Q n599uwBq3]!(4&9;3&m(4mS{8of 7B3N.12 dZNw֛ˋ"-Ls)Fvb 6z8v] e7;]JiG#O '́$63?f k2r|X&#x.Yb˅+օ9q^Jlb-ˀ< m2$`C3zH$-w0}j#bBJ{"QukDgsk@{㧏.2lFjםR]t5.K8_)- !_"(`2Ӥ/lUy` nS5?^ˊx>[z~7}|v|,8 rvF=9eð!>ڛ~<R]Y*p4siK||dXPtr}ⶎԒ'svB@ 3t,HSc<}G_vM:AÎ;|OJHXQl=#sq^HZ-Pk飳REMj(K/S+D2Ly{wrm]iK;TMp ÀԶ&xN8"rWQ1^?r4 d;̲ k8H(2w "L/<Zsz;*G-' cB܍_}p`v3 ȣܗBN|8z$g]Eā 8`Rex$[ȎW R(@_y>S C Eg:_Ql[RƞQD8higVJUp݂1`Q5(ѻox[7tКs3 EEHXl=Os8N8\3B:C l~$Zi$ڮyW+l/ήpYӨ"vxf5 ~NXӔAJAipa6$>UI~j8؟)6GDZ6#.vy}2AH"r_, \~tCLu,kO d Ӿ~ dM3X 5.\'%N63-^4… pDz# ĸxB/N!jOPq/@QC񍬴${|=k+|V!)RTCxS|l0ٓ$`%* 36y0f,BE$PIRz7MDo@償uă:;BQ'l%CЁؙQi>@Cع)(zSn u=I5dp׮(Ϛ-=y_ \ ȧl'MPX5{ Ga f,> 6\d4,:KgG\Ň8&י@7]sw>ۆI;%zE؛T~G qx |5?[g\m\JSEw'8>xAln͋`;ۃy,/•vemD QH@@;@V<^+\+Ch"#|geI qehL DRtlz)uG\5|@]悧)ɹl,,| DnQ;(3VsEJ疓/])n&vC *ќk.%MԿ;vTfOXmBo&}zk`.2_a:bQ0A.1[cÖ3OgOgr?KklA)1Ӌ"ڬHpŭ4߷y# 0ФR+.vXQT։1Ϝ狈>O3k3}Oa+Lg3r2+#ϲqi@Y;CEf*1:˼NBMN_thZb`&B 1'ɦ`;.Ȑ1.-ɽ4oN ǕȤ9uM^ٳI : :̄s*ZEb̼bX؝Oe6L 49PɢYgPc^FVm|ے.%n{V8 Ћ^QHZ[Oa1ڷDIMvi7#b^JT!D<ך-ZzlR-)aɨ8U4 U՘m&3-J ܎F?H˿N-7L.8?Gs\'j' e_G7<-P+%Uݙd6ak%"lWpU];Ħobj iqA :[DgOWĩȶi5ʃbb^`m|cyñ3ZÀx0j+z.{DO.ɑÕh/x]aS⛧RBP`d&/Լ``Nԓx.WgC9zUo5q?[~=`~5mYLۧb鉋rm"]T㯯xb7$X#(X ^)fUgx+ IKx-i>ȷCO$_cɹ3 ާC8jh拗$!:Lw`2\%ɟnyԳN_xb-¥oTIvtUZJfc{S*M鮥;Q>-fВk4 Cš^_%k1cLwpQ~cL$4?o#`T΅zjl˲y׬ݩfVk3ꉏ+IBY"uao/7l^_B/5 d;aj^Q[ݲ*ͩW)="L(+#Zq韚T8m!eA6fAHILҭ LӾ,cQweuDt"zDTVIln4 Xw&7%l*kߧ@˟3d&9Ngfrڠ"?.z`.~} j&?G,ȱ3q +T&4EGH/b./eUPu* Ke

Ho3.B\ ~`+xRRP6;i+Tװ6=]Vg?X s \?${gEȳ.]@ptq35,ryÈЬC.cՈ:} רZi$/4WϭdkBȼIwY8Ac7^=uE@!{f +k\߄ǰ[ҧn@9^隉 d̜K نpHOG2G`p)skVXҠ9pI߽@ydDٓՕ(z' \}2g0.a;aJܯ!p]ٖ]gI4VA(5*_v.``w v:Coܢ1#:z.{*RA&}dEO6x3ûOף(,@vuD[4B?/M}3WK)ipavІ29Bdā`ݍ?5qmq~ #$ޣy I<_ vH(`Dy^< 2*-OpgdЕ\K:S'5٤M=VI]2xyv7-뺤RzZ㸩η: ;e;8}ևH(ڞKg}jėj+e//tzMm2lZ h#O}t1 0︀'+$wu3wz,&+vV @=lmp*滛Y-v$2hM^$xx>toOݑ1@flU`dr) Z?\zxC_"_:7JI ęC#iN5&+(sH%š?(m+PSgHaq;^mHY$E0%Izlp {g0(B_K+7uKk)ҩ_rx *'+{bRu0,9>#lK΃Rt.T$NC|e7l+ez6"WG %0Ǽ-,dNy prCxeu$%˧}#5jf#DV.8: 6zQ|}O1_KW#˻F˜kn}Gk|6Tv%v=%_p`.)]p6T+Z4 *%-ah, 8 \P*lP3Xޞ {!9Fmgl@B AQ/3x=RϮT)ccAyt+@0I|7byD=li&Fo~Oխz*qzҸWUֵ 1x#p[0!~&YQ.`;fGgcJyYlѓW8[[i5pn)eˉio\VM$0|Y#VW6XkACY8ޗxC!Â6) h˾VdeF#g.L4%0kuz>'c$E,OA&Ɯ%h/)h }.W).jBlntE:R43&Hh'cz"E@/*>9 +|B&,,9x[T>2pqwH.jVIhWݝ*5X]0-&w?l8Np@|k>tAO]D }&Za(ᛅ]:{ }r@XRcDb}yq V}?yb]Â9X E4;m)AI8p;I5yzd>:Mѹ.WƠ$ McwNl9sn"X>n5 b?4hSmV`.wۙNWDGlFEzoHQBkz)a؁lۥXIs%M ݜ>}s׈ܠe8O(Zr]ІF:$Rv%۸NNb y/"muL|M\w;#j(3YӾ"t-Jq/)& 8 Fv*[{ӑm0WȽG?z\.X}ou67[Y-CEڎ(Y1-߂\OxoBj,=Ax.@6 0*%F]]$[w-#XiFIh@G_&#I<[`ׄMpY@,2#Yz6i*.*7layTBjt: AZq-oLHQ'RElZzёχu E8bO*xchf,cABӤqs!oBw1Zg"@ܢ=D젠Z3e; OΰHiE,aŚÞpcjPD̂K4QJ ҈\[+^iӐGmGMn".PiơS}Aiz8 `/Ios 1b؟=Wk@\ RX&/PR$㔌_P" D~LPcZxXc&%`yNld ohOfdӜLBPv6'Md;lᎽ؝sߩv]h@wGuQ7 ~(& K)r:VD{!1ɼ ׷%c|/g<6OQ;6fu"o_4">sTU]+ތ91p=+l)gU^4&H5}28ZY2˒E_ U'إQ>%_7.7S'/GHyPIfGOpdl W=:j3}ޢVᏡjpfS'8dϘXAuꓯtre*3. }nD7Z'{k$ Eei`yjqX| 0\ʗފ)roP */r4ǎϠXT[Q E  Zr|ۜ آ?h9rT.H´+CA߽s:\GK$bYvמH:+`?^K[.-/iˌ] f3n_kC[[`I>g.W0hXU1{55^Ȉu9?e+;K9EA {@w`g rYXXl ~TbiqB# X>Tv~S39# c4\6fcI]zor$=3H7S6:2"PvvoӧS٠|qΓH:da!ѕ5Ek]Şw /t2~BqA"5Hг_HۮT7ix{zߡvX5nb\b㐙zîMhp#oSI뷳,F$Aۉ6̗Ц-fH- g7L7g?%ڴrݮ6µ]a_.T3D\T"Oj-9rQ6`>-1ڋs PaaoNMz(iU{y3$5fCgYMӗsD1;{G' ,o5t Mj#{Ѣx!`(_^veG5J5G@бܞJVIFp*-Y8TX[?}q:H%FȴIv< ~ޚ4gX[FڄxC" TO`7)!Gqv_[~)QϑF[`qP,5sTh**N/iQ8!6nco$*\&XJ,P-tנ>Qo _8؊ShܸLh$ D?DkUِVSvODbI!jv Bb+ /蠱CHkҸ*[uc'!S1?G# ){n#Y,tĂb!z;8Ǚ|{=x8 Hxp.#=TZ^+,Sg9 !!.rƈ}4/^p W=Zג }M7Z1r7/1vjU d6v#pEݟ fxa3\1mR<|zM0}5 ̮wM_0?ўLowo~`kk{W5J}i0 kTOg/lW-@)2 q@BG@έXO]1 1jbLفO@@8Td/JU-vU5>jgQT`OX' IN)[FT(/Ŀ\aK'dM=c~ mQY)_mkq K1~wpc  >#F ۰8-7V-4$(uRBOBg0ֿy$Ȏ#Vk\ni˛JEAot[ 9gHJ{~9zoe;MYJG<:cx߯){i)]칶B ~8@e1 Ӣ1M+4K -X.|.&" ؑ=Woy@5s\Kx}'8dDtC]'"8~؍Zn?Lo` ų*jU[ЈUjqz}BM,wF قuT*Do1jٶf}|oGp. e{'b@;Vqy\jX5DaAC(eMLk풧Q<.25 b F+STA tbjIh*3 -}Aq?͐,}1PeBtĕ7u41)2\֒w$ns:تd:Ι) Meޓb:E? hD7lo(`1U&8LPǴh(Y8BYcsJzDo6X+NQy )n`%Ka;zVc+6TE?a vw(_v%Nϭ#B+-]d}wЊR[jH'9 {Tg^}\GqzRYMhN?“=(I 0[.aEQq)&`n YLNdiRO {@cr'?ҹCo'*0:H^Lw)rDpώ+i"{EEM*%zCo)({C)SeuV*sĵ5į rHSߐ§c_ : 3qLam#>wYkpwA+ԝh1KYJ16w A'#zr١Qç.,i>b-^{$]ֺm'3_ZYSp'  arŜ9z (5!d#LN酻25FA"cA [>pb]._.n+gy S4!KoŠx=P_ Tk1z |V'3y.Џʺ q 2@AZi4G9a~P:ETc&b5Qh7#q<0s|PJ3C&wf_z?_ k܊dI?V`ḙ֨bѬm U`Уq4{[a/̹ˋY[.")gUSry嫅lp94}k-(r BC?vKĽzF%=Ԡ] B8$Oᔗ2P\ނ#4ru3LSOd|!ʅ1{ӷpS#6E)o_t/Wŧo#X2AYuu~łM /Kl#__=ZOiLֈe=>#$Pmv\.!U%kC-鸲>vY?VҔ7+E3cfi0rf'G W |O"e9C~Z/Q Y"_^=Ӏ::!g/G$ SR̽]ҳ6x9A2[}·M|kO T|Dp]dNt_{&MO2pz"(%l*M˃#Ǟ*U_%6!$̑浜 r8N?. yԿAy,=٢ŎN6X O0L8RgޗPKEGDoA-% e0rJfm5)'8fWvEvGEleaS TD-CBS +\w7瑏J%=xozfV32+t᧾'!z%[tղ Pd24YDط#=[>9C]IyP6>jt d$_:<olĀ+Ty9kހRwjƝNH_DU;Dq%DLjhPwE bry"gkp$\S>N'L3Y0;FeZ@s$uhEv)??gB/ Wb]xՈĆ1\ښ]Aeü8ߢu 4gkUO&r .%> ~k#rsPwhJ@!hj_}O*-G4{Arj{\QMމ4Mx,X׊Ym1zT']~\5iMq+NoK{5ĹLS eh\F @D&҅?3=OgPl`A^EySoa;#}k>8^@W:N`&oaN~XM7F%S>g~j3V/o?Ng Yū#a.0$~<[,8,~= -9ӎwCgBRw N:7gx,\׮МVhoɚ)*8lG~OjFHdܹƟ.5tiUѣn۰ ۂJmmŵV EԡCu[)D* ӌۊ\"j ,FR|EI&}by w7sVpy xK g 7"g'/Qcy*Ϻ;;ƸMG&Zc`ۂUoy'7j&^"p-^4w4۾t)r Vt'&ZڥH5"ǜjb|gni-vdCA*_Vžoac}k_ tlca3{ܼ-=Ӧ!*+)7[EW0LvpTfE w|-D˭wW8Rcq0@1O&HKUY64^$?JF%Yo7%A"`& _Oyif\ ly^}b1I rF<Q8 dDCbuQjEwX!u>X]Z,Ef7sy?hx{XK`uIx鿗() OfÅ S|:R G! Q)pmq!%b`N~gEb R G8.12V>V^ 3my .4LlmjK5VP0_W&Gcvǒz|y3>rO(-<'xCfYڳElP c]Lavݨ8&K8PzMH-J %>t&IYtC!Y5.* M7_= E 6A[-'?[+ynU vz[(qlmЍ z! 'W#xL#PzVy0ˀz הa,hW7-c}oCw_'wPEsR}"`ÃR) (Bj%g=Hd{%Dxjdʾ72u;~e(o0}`e~.(ؼ0FM wP߆vAwh9m2IS;zSMK@Qv7חۥ.Sq~+sFk\@#5O{13;,)}dKE3袨ۃ=?d@0!Z2dl&RGH,N)ee.6p `onR21Fh(v^xDǦԧVWrd$_F$[ԒE5v^gZ@AE"ȩsIo oFnӴO0:bTPr71q ̪~ڍ4߶@tx'܂b(JhB.l.+-h I}jHu=CObv=&ZNa\?=DSln)(SSlq?w7p7 Wdut~``j1ɢD=? iTL:X?7}Dڄ#L,p-yElS6j`/_D)MECv[bT h*pCxA@@+/fǽ/I;4ȳsn{ӧﶍD^`Mq%~k:\1 76e؎S_0V//LDyhk`*M?d$=6Yږ+y SWB5gz &U;EX ꈙ;$Q'kJo2lPsEO-B X$Til&v4J3GKճǷk]_u>o|ʡkD!nnaf>RY~ ~' Es[Ttپʏ,m('“a FMoBjmF {0JU ljpvZ2qքH 7lF^AxlslYSgltdaH0_řy$#03c=e+ &߀cJ2 uȜw g#$TyRvLtsN5q_#۲@y)`*2)! =KH3轰#Q'*!u3<ꫲy&lR) X bOSF _9I7Ǯ)x bB/9̳<5c{mI8Ɓ&^"IE(DcFK24]06,%fJ,N~MfW_L\h0Q%>@OkvڶfʷG~gS*)YmUl w/kN!_Ki\dUD׍[ۿ84ǩP6nxp\{֠a~,ssqKN>4yY|:൓8|(1d:vgf ˯)INxOp.h>r=T(8~<z=C>]53elli=x3<2QU5t MMͪ<}؋nէP32A<)Bb9T!h(i3{gC[j?1cy?Z5|b2}YjYp2u#Ѡ hvH1pƦpO!L^^G2G "SAGZ~v!8+$`#Pi% ]^@+'|_ y|<NbƄ1G/8?V_ʔh5|$x4eB b"x;a;~{H |V#Iܣ:^ZؾDa-Vrw(4YuV6O=v[I׹`"W"_#̅ WuSzUp:hK 4~r;;$}Gm$-z =`}u: -#]!41<ί+.QYc`]z[%@HMCy$z桜8MJY wTܣyH#>EYѴuUJA]Ood2a~@QVSƵZ}oqw 66k®oŝzm9~娍˵ %)}jG#ɞwVY1[IӦ Hk{n7}?BhY?DR%Np̧$ 6:i&_#Hcb8N,Ic\`;Y"z'&UOj+#$}U@&_7?x-`laA@׌,J^y]jAiH~mq+ܯ4w+kY$x+8}q#5vcp 3qwC7l^VMTWGdt7:&xs"X:xpNBjI[@FOV{c2xG.&a d<6' sd z2WtƼp0/,1M;XJGG|z3i4MxzTVu31ׁ ,)*ݯ)Rp"-巊^"be`\;P⸆~WfX6m,= ~\^?EHOFGci @+fE-Urm(sxOObv~P4+nv KQtNhk].rޡ Xad #-2pK)PQ? 8χp̪=japz&i]*tMB28{CsTD}]cz\ \9c(eVJ`j`4f)dxO4R+gj/*HI=\rl.W~BX' kebg#}rS3Em jiS0s3CNgE7A&>*x$  ٔ}i8Ϡ[WCN3&ɗ,SwdJ +CcG M*2l7еK{@[Cf[R6x g;9w8N:3[ΥIe$ܲR_O1QI(滬x!"6 :X;ϩKMP;58X Q'ꍎWru}*>C%oʽ xR{Y]+9",S`tZ2)$-wM]Gȇ T‍nҲ 8y(HIx .Vdž32wG/|foJX>P>52R.&x8eۏ,lY@JgoRxltfbR R'b3wP@]P{+oȨ&_A|>=Lt1fI*LAw&bGϔJ 0aBB2MVņ(IFuU)mT3dvzۨzZ~ #HEfyKmh Ȯg9ѼًaCraKt@s@F.{)*aq Pg¾Ehq1y_--KT&OEԶ5e`1SBmڞByb$6JVTmchpŝnCMwuA\ *ecEs9&4&"v.Q]^ DjfbY{%7XcVK?BG=rO $^έa|)*BߊI ѷ鄚8Sa-4s/ X`%c?`m#0Szjj“]r%-?uB%96(!7 ъ5F=6}lPAKP|n Qf\1-u`{o+iRV˂.~u v5RM_q] s̈(n]X B#@-.7̭22O25b-W"S֫D73tվpsFADV}P2C6 ųKtјS)%\g*M=~Bx]ڮ$`ie>Gc.틩˹HqB(ƈ0#󓰖fΈ7o#= =L/~O_'}qwVy8S]k $&{5ukOX?o%JTIacWJTJ.Y; AC-)ݽޚX5鋘~)ě.UčE-sGƮ.J.ۃɊX'wfrBܨHgfC;I{LuvǼcBB7Cp0DYĉh)KGdQVݭ.T[ 7H\1p-Y8;,~Ҩe pKusS籽4{'*QA@{e嶊6`-xT;OpN^׶ ټ# Mat:7X&\@DaVYXac,G |e`ґw @s T_2ѻZWJk7'bSOtb¯ұmpxg*KH3I͚J=t;&gƠtwa1Mgd ZG3 ߰`7|H`>GNSq/2~%Ģ4]G\(*= U9k@B _?!$ <3.Y -G=3-|RAKie,}Vs/2cH*b+4qR(M1ddf/s4BEˡ@e#i" ^%ֺ֪68.{8t hC[ :̼?İ!5@d!^Nfʒ^|2^ߔN;Gh+Uk`s."~l ,:ܾ,6 sƟL'8p &@.[/bKa kcS*kؓ'`""[RYb Jugb O`~ҁ],> nt x%t~1qBC{K|^wHk ܀y1c)kV3]!XgmA81h3$@-&^1Ԅl 0âFߝ/*9/XaysFсjXnݨE'7f8BY]Qa^m\#Yqb[a>xt>' 9)|E~WO⑲4U[1ȐknR19đP{Ao͏>fi껵ڴۙ_!.Ʊ9+)n/W5t9k`,BUs}oN[HamqGH |;^Vmj)ᆻj`dl!Z#fazJRc⥾&TV$ʞ\!ʰX!4LO+y-A۾&Y[^>C~ǟ:~VYñW(7E7AĬ/\ᩂ $y}py%];'OZ?+)S YI5 X"-=ԶaEy=“}S \vnt4?G?qCʰ j^ld ͷ!䳖h}dCPGVo,'o-| iear6T#.Q v"úԫ د`-TYM_ˠeX@Za V޵ڭ!_ U,5te4s>`H;tZ#ÞC&>&%덤MeP{lx;eC !2&KZ\3|;O-ؗ~߶$–G@lNpHt0'*w]$w[T.E*ڭR)E@:~:0<}Id^:V1*ʸOdQ>"61' ,!Âo>WvsY%IvZ%^>tjhtW0,_VWOuF6e;4f‹0J-O1vB9^ΤB_-%V7dG0iGdf߱xK:͔N;vIi䜜&qz.+;5PR6F*O~MZz:8۪XIVS %z%&D (ي߆rvoc.SV{`( 7V_xح3肊[)J$ݭ43ٟ03 rl8r.:fWks+qN5(Z|DbMr2>Hf )!; &z*EVtQG!IUȎD2MALZzRDGz!mDǻd0Xw@'Q߼51c -QF,dxSt'hHd,wj(0^ispJ;4()<:\7~/ SQc>rMKUd͓D |7>Kzp4/= n1q9"gQmnP(AMq_KVçpAo̠\=j`dC -B8Z!CK13r_cBwq3311WǺ&y0AZ|;}A,Os#kY )aC*D,0|& B/ wIԫm?!&h;`| gMe7/g Oc|>|1 xݑ,FKaXJߌ}%gفh˃ټ:W&!/MeSfUh"Ī ODJ!ZP G*cA\z/*i~eȕzj&ͪC<®WQ(fxm/ؼy\Z~3&F4oBd|\K_`PRtv6nuzzhQK7};QT9Gx)xY#ihlʼn40T//tO`e$J2zhS'շ]4QpQKԦ*<9~8U} !ȼ`I[Όt>W,mKiA D)zx6_ 8=8d`Y]~oxyѸ<ư&.""<K\ ~j9*۱9< V;;92R}ʺ2WSH-Upz- ‡#0hO 6A3khV|, 3oe;J&")}׭R% ص՟+x:Dkʘ(:N 73Nep A =IP񊂛!5ڂ.ݠ[Dls腽SY7^EƩE_ɠLVr J{~;2JKa`blxoI6dK [dDJ!7>f;_Ͻ`BNy 8O\US>OEڥ?,2dSMZu'Bgo[ g0@xVTun:AD6ty{\OI׸%XUWKd-2yRˣ5njneRk62 8)[V+͟;L{ 1*r}6ĎwJY"ar#zahYl*A!o Յ |c~J>_.|G ڱT 9ɏ]6%rpHbs:EǬJ'#c,-t522ftMfDnT;8 LD9 0IcJ+s BkW˶rbg>7F[_׼?_&ԷT.:>q}FT:`@GǢF "Ţ#}?JLJFg;/}-Ţڏ{KU՝^MaAʻl%7k,P>uǻJ]z50zkN2dO1s@mOTAxXu0Q˞62Hsg:ַʝyXr| rxVGB3AL)8b 8X]λfLV ?WƄ`il0F<.uDp`1Ne g^\5j.fVd5J]*|w1-cƬрSZ]8_; +  9fjv4)Jߙ֫c{{vpQYCԚ]AMnm&hk1ϪfBƷcldZ<'NPs͠ 1yK&y\S7Z%ؠY7I$G)/dn Nkym1TLF^WAW v$ b4'oC~?iB6 Cbpz| .#@R(󠍪)֖>5$%$ ^*Cm kP9DY M1 1 :>`@BP[6J9mb?,V8z,9݂r/{˸2!aat=5kBg- 2(3Rk}]3ާW$z G'V\֣qYH[cVKyg0 !t0[*Hu{6G!)10_nGjQ7R$ә)))9Re&b~C|Cc[HTtfj: M.޺-^m ?:`-u8`-qsy7v+o5#vFL U5H\?e`|vy;݄vAٙz_*k,-%(P>@G=OE0\># TD%Ĥ(k^qv`J&ڥpstIW]Pׅ wOC]QY"S NL޴N bvьyWT7{%6!qA$3Pv[V%]x^(x~LfkؠwP6-Y.ga^] 4˯q T,/MQIQD_7ga*:KX!TZhYv^shUj3f]!ȁp [+y)WD0oD,Jۖ޳о-)Q޷‘û:~αjU0SJQ͢gi:7F&͠=Q$Qv8=0H}$t {^ Fg0{=tڳH͗h.n6+czIyDvά,DR+*IHybzZJVO#c -Zu\rY[̓z~f*+XU{Nj0OJhW߱/2H|NUH}FuuDc/A$qCKd2oVYNwݡ /YHV W=NgӞ.T&@liz@ln b6v bVpr{O l1_<ĶH?# Eg'tcvŕ%l-/c,Zz4Pٌ@lm_b_l{܏2.LF^$hxa71U{ѯbJpRhΠ[2X$,< ܼ>wŌqi!XOI o ,Z ڶ'.Z~ѦG:$H9ԛ%F֙U\J*Ya# r 1(y֍LRN\րѱ`^.d.ڰuĒ fr~nت*}Zjҽsj%&Q`4Z 4'^D OTMW]9K9&2_XoI3kih=NH̀Kj 5@+M9}MdЁSU!B;Z0o0 s@u]mcz4&󅷄UA iGsg%ѕoʤu GiW eH֒.iUgH0`;x KUz"P`&4MДPvpy4Cm[.@^wIh8"Һ KsҫCD'ʨ؆1ұtc5+Z?}(8t{*i)7T*9Z&Gi¡w >'VEoPS$|PPa" L (wkDҌb@/,’PC(r3ؿ%M@\8/QL 2Mv$QDJjVrp>cZW eoUZ+Obʅq+'-fos {oKsd;hŴd%╸n(`E 踩:xI#nm k34DK }{΢@K<CHvno,|]ʤ?z S ]?=w(IP}V:Wrkgt519[2iYb7Yn E]c0r(^vV b<=x-: .Hgd*wB4q6@~~pq²?3'r#C<TJ 96޶o170~]aDmˏ.\YVXg]W)AL@w5X4{rs1O@-;҉=5GǛN"=YŗjDZݽ DExif8 :AI# * zBЋJ86tbq5 +Ukh%X= 2/^Pkjn}+e&I21I yǹHy 4(ǚ*𾙣ܣ8ߴȖ:iV?뭪p9Pdw?|g~%Ձ'*;~@&j}XBg`3Ō0Eh49_4݀;Žy}#vjSijAT-Eڪu˘݆Fؼŗnu$EI)7LP!=5fC)Z 6a'p׍I?A9ۈ:b,Fq7Sq} j4,`n ?.;Z *$މ!R99#kdB:cGfC03:~ȃuc>f ȻŠvGn׵W"mZ_x~ _?6" jg4x?y6$D'ř=GđYJkRN: %n7`#xL÷M#S~ "1H4 G<;{FxU^ M4R"NOXM`eђ@f!ShhWlrERV;`F-xjԆ }P?3Om:[%Ϭ *WD8LhbHl`զ<2@ Y n g!)ieeAB?@f6L k{OWi_4xc ^Rтh/ H_efZULGuzAHNG";{s;dDIcWN~`,!7_,% 'x8,`ހsM1JΚƤ'(WMoi Cr3u_96A{}R+eGV@5>o[cSﱹEi=d֧ qMoإ[4&P\-KӒ"ӦO8nnNѮ#ϹM+cps4tЉA6Հ~F" 1~:Nlj#׳Kq- j5F@I*-O!ζ~^uayM*kdDZ8߾`OS-SF+vfֽҭ^9˩'u 'E<-v\s' |h r֪G|IHFp0^y/ BD1qΊ=}^s+N}C1i7IP dR5~,XVwk Esh8eNՔ,D6J^iP_pɩ,LO͌Y 5Ni4?[EaP0S?N*o 4nv` VG[ݸg Kw+zb ϫo+ZK̷x{`TTJN?v2aB4 lk).;%czيiMg4dKҬ;d( 7[Evj}`!t]xO!} Moq#(1w'YpqN3#xܪK3p@{If"D^j1c5b\bVj&DSc;=6%V< \yh=bO3razZ=Aۍ&`9ol+4x'Wj:9 =aՀi MdGw~! px8zIa=73Ii/+^| D뺑cfWA&1D/װAxA>ÒvQ/ A*bj$xO30h5XAfc}NiZU@f{ByM Վ]CҪaQ]OzXDL;)O\ˇ̈6]wM Uy|NVLL0}VDZaX.?^꺳-t|b7Iŋ`:/ 24ƽ(GG?OBE0HB;hKi10 íp&uRA#[a- >Lg;ʇ_ ʞbWm"EF[<Byǘ%TzgsP 43_U~6QQq^C!M{]'h$]0RNh~EF'&2[3MXQˬdU]~$Р㻜avwKȱGxAuLG4hOWrb[lWKM;aVɗdx&.w"'>2t<'۷ ­>%ɍ@!,w7wgŽ8h@]Tf罋 Y>nsFbKzֳNJn"yq=&2gP^d-V;ˠʣ?fMfWTFY ZXMay+UEҤ\pNhLLD8bY'Y[[*?vh7:b^,qj4Qa#@%\%liu5:PEsMr=>7Ӻ 뼒0aoPrt B9Ɛ3yi裪3x\ׯ OD/YߋJ@ ~T1t[ SBK2ۈx*u嫅Ap3/TtLO +6"킹;+nx^ z!TB+B^eDuz3х9FѹM&3}bMUv6HbnIlnwvϱDN@Fq.! 9t: V1hm|(23c2eoDeqƁ]31*P-!܊v im}V>;wc^1U#{bIC(h6?3y$I_F 9$Ќ+>8 b * R+;Bd]Pχ}~p#ZnIk4uu zɓ?a5Mk^>LmWFP,tw>| 'LPvہ\bce1rDUO2PAȓ|Gߜχ ]Al{4<7ծgkf_w1 a l! Up8ثdhAފq[Ӳqe$"p?`Uz>ׯ:sF*=3LwvGЅщIL"l8 [E`jE/,w"K8G bpKťꕅ$N,Ep޲%!sg5Au_LZLF qRyfJXu S"^~=3K\`;s7|yZhrW#v=ӿ8*7C 8[^;uȞTV,sbPUb0wCѪv6@#/j"D0wyf%?8~*9pjJTARcRl׺RLN(mͮICtQ) E>aIFPU:IP.YT8QA{WUD}ѿ(?| I2Hw`<kä;pS5 L/-0*J['6m0XXUujjp깄46G vltqTtrTYwOLKBy{npӽ@kZ'[i9iuݓ%)6:Ҥ؈Qgvf sn_4V~$bON]QCx^^ 'KTFyHwM =f?Vr{zeIDZ-P~>$;6= iT"mar1L6 *CFkd9!DWi=X,Órg:񎄻e'A_X5(\Y>?I ʴ(ˊ Ujƙ"f+p^35(oϬ8'7b?d9ABŁ^g@n3\|(nQ򮎇!''^iNVrY!X tctp "\,nIq#ʀͩTԹ?sEkX3Ђl%*$,ڇ=l[J:32N-I~o3+f/$qNvj{eY(_Ƀ2rL-"oA=SѠu|C` nCr ے2C2N/v0@h] |1UxQ4>F .Jj39{6&ZPR. CI0 )v)mg3ޢIˁ8Ѽbq@Om(gْJ"6+* leyU06q^ܳUQLQzHd:Sgg>_iİkR׿*Ku jtuQRrgr}Bʔ{^oe@5mIRq}ajm"[&Z(`ſlжl1,]쵇Tߪf:x;ٜfQ5;1u8HJrDOʦ}Y*4!.'Q+ӠXhe{;v_ЇZ7)nR]~I{^)F#5Ĝ5LC/*!h"+Bvʊ!۵ 9ERRG%>c2)@#aݥ5BowC&Xb"YGz  ՉC #yRHFVɕTDh&ʕk0Ba ^Hπ PJ;5-C7ňl5SF1]|=fR?onE#5=D'b+;xM^=4m \)VHIek%PB\+G+ 6^# _s}4ީO UnQcPܟ򃙀t|rW?xHW]\xo!+ _NN7~R"~t-:~S S(~(ւ0Xhu+tMg]ThS-28c*CB;XCu} 5͝ s=.i iA{~l[b]ȱc-6Bŏ/&5#cF]!0T'Nqp9̢y^i XQ|/~0!&qL0]̖8ɮcY7pYdz] D񻊲d7{Y}]F璂8xU\`__WS֣$@kF]uhM(r Trt?sꠄ_-uHQz@p9dq\s_v/<J2:M+ d=aU-V|Q=X1lq\rGMkERtzgA(E53`m_XH{c5Gk6 ) vaVS pj#?H_gk*w.fC0PcW߄j:M/xQep\i/>hLjKzLi^!E蕤h9DMeaֹ]*T].ITbͮ2[[XUm y! x@G >76{, BGrg Rdڀ'| \$D By_KchIҽ=Fv3RiaTgV}Y?EnZ jFE]͏ЖWB=<1Ξ*FA&{vVdCo*[{ݨhB.Nv,M)T-ȇBL>un$RZ.Hrh|ۂ:בDAΪY_! Fl*{m6͏-q=bPșW!Lnn^>^mS=-E1:IZ%x.%Q]׶]Xj"HFlq@]HO *G ԡCgd//7ZNI?8R-E`u:} 4DT syMEn ^_ KAxWp805]q{ 9X!O Sb1VQε~ p*0ц0 j#czY|'Eݒ8i㼣UCP4/Ab;{Ұ}gp"XMڙ$_uC[Pg!Μ[a#G ?j ϋ ;aU'SRjqܱܼ$[U֬đUXw* _/Ajk:py!A.{L c# /fSv -qws}D2@˔G$Yܜ"AL'dw\4G@ډfnIZgS.NfCt2;x%QFǖɥH< ]|vGlů+1T9y3Jnv:E/UyU啟b_i]k}ym0}W`J۫ҫ98@*HʟΏcV4o)HcYKlQ9Gh>3%P[6SZdh;yIī*v8'{t )G+WeFO5XK n(j- e)y8eG0c.Hy2ȆňE-"QSvJ+oDv 4⥩G J-=SMKݪ_`aDB}#%67WU;D WS] ~rW+? A5!򗹻Of5 1;?N㱬溨l*} NPj!BGu-ǐk|}܅A zИ+iNf]~h[rt=XiFny!9}!<510N Kd`8^2YeeuѲ*8=z3|[Q[AĤ3jEFDy#zpH4^)gVLT<꯮,"{]\o?3_ĒX+"ꬖ a[[U*Ypm{CTe' 3P-zoTݳhs}xES e~6|]e~$.AJftNE<7Pxő?AWS}:~ }kaF@+Ԫv($^}q>nlľ5· K]zB,+ߖq^d}\MSBVJohuqc+bF"|IxYEyUÜ<\Az̩5'gPce{B@ۂk_Z2kñW~2Ò1̿^5r Q~ՠi(_K=YT%tL1jtKg랅h0BaD9M'~v۲\NyZEfoha=qì$xJ P'2J7i 8=., `_)WI(I Z5";pGa`XI>64b> 3iSHFT6 ,PטPF&^9a<$.a]eyLtm'5|Ⱥg"9/Hƃ4rȾh-E1IrY.uǘ N^DnV!@BJMb)ɢ]:FNGɈ=t JU-ݾ«Y-b}ٵ۫ȜxI~Oz[l.lR`7rG5jt% k ʺC5U$@/]_C_ Nd7t'\150fJ9)#3 Y11}9 k" 0yc;"ߡT#Rm?.Gb Y,*ʗ>aI;wޒg7rrBx <׎n.:=\1gOy9u)KL^`kGߡaɥ^ B7҉[XN yjA\A5VVfqLXMA;|P@Xd4Ԥ5y&^4sS&ԭէI^FHghJ1VW՗R1j%p;s 7 Qnf+}[n"ΫkِTea.Gs-=mVJ:FY[gB*tŧS܆=b,>!z7^o:(ܢ dTz? <5Dd۝<[黖Ǭrƫ--Mj!ifoLδg?+Fmj诘WiAۍd|0Plg>C%X9uX4A>VX1ŢQйвOCKT Am O%?oukVLҔ!4_ J.h4*:RC~{/u;B'3 feZ |죣xvJt<.~/#9h e]MT@ӌI%c, P}FFN1KH)s;DX+|;Jg:m! Xctށ`,!?=kT Ƈӫ.,F`ZV5PKvu*BXVH1>D4 59M(qs֣8mzCHqQŴO51!#Ŋ 8hRO$NyjhDS (7]"Lwj#I)ddM^Ag0عBrݷ_װ <ĽyPHk iEZ eWFqjy@9X}έ7*0 Yx0,Sq+Z#ΏU'M~r$_"FSyz 2*֬~= d X(1-ڣyLc_M^֋iί5 x#(ә0q)(s_bH Ygp%?]:glR->{. Gz$|7[@rGzWM(!=5:Be"!%3 dBuyЯB%Ҿ /Ɲ$ZX$"&=NFX)ERXp$ =*]A'hv#+.Zp}Cmb}|@&r*T-SK}䊏RY[fE(0<ޟnJ.N4W,8e otZ V?-&:&haKǸ36Yfjf(j`l2s\{Fmۥ4lF**dEBx*tzTH%6x-ߡrIrҽ߃rwS\GooZP)z!ZiƫCGlfx* vy16b3x)fνߚܹ+? m{09_ZԥVd f#1zGԲ~[@ԉd1OrJmlX`[M=')1]\דJ6k2^&hy3t‰]LHȺ]c_FofǁRV)?ы Eӎ;ϓ̿&nn^Eό%ޟ]["lPK3ਧ`V+VjB. 05 \; 0-qݰ\bco+o2g[;6bRM._mhv@fc rn+e4?ߚYU'xx-I+ђy*en; s+]V W`zvtۢF7A4[`72.0)ʅ_Y_"î!'hgY%T֌DSp%)`*^+a(@Kj zjnT"/8 [˲ɵܬ8B4Z?n*)Yp|%f&u!@>mt?߫VpY<'"HY[rRN]鄵~12 ?Vm =S@6QԔ=LW@y/ˍ4lS6i/oȑ+9$5j3@t3&J>`F&桒 /1CFEaR47 Ba\еN4~s&nHߙ:]϶a9Ģ{fWʚi^ 'l^}Մ Lui=!δuMKP~  1"3 SXS23\^i-N6ɰM!CeTp<d:uVC霪 5u| /[׍A`;suS9!g٨f! =+$; e*)eNŁűy?)#b(tMn `SO@[y%nY<57aAr8krt4(|"e!媡ar/&7{ Jtx⃹#"S1w߲I賴~R2wF"evat7MNTcw,&| g,ΦۍN=k#LW+gy.BT^h1f.37̗ƭD Cs@T\NAWX/ mX S8Wmm6Ŕ9'rq|^i-[o< CVBxaR '󜛽݀"qE_>Zkl`P ?iҊׄonc\_NgTJ~!$+;4^jB4ol!x4?o?(t7:08PT;$|([¿ǰI6VOdxdc{E('X+@"ay^ήqN@+sѤ^fQaX[-q-< *d\?/8 MX$%|/%?om(Hx x F#hk'w-$ݢvΈl[yVځR9.E,7G[y9701y<@*0Nhf><:1V yg}HxK].;s& d0 NN:,պB 9Uy:..c6L siVDI$K]oXdj2ߘ2oF'@A! y%e%<*{} :5΀M~;<#ž@ x }v9k ,~Uxڮt4oz~…?T,ZB驭,"pTc>i.HH$ &oc͡7bsp0]zAnD4;wmH"5.;Jp+[ߴŗ\*>$dSpux 7ɾ 5pPPNLK˸E)M ŋ)®6JL3eTALYG:<}ginI0p7IiN~Gy Qcxu6؛y\-Dl tgtË2faQGTGUsHj#aq(i$Vb׮i}UE_=G[ru%G}%2͖ ,%^fy 禍*ió*,MYZmR622DhiNUn"PPdv=~bR\EE4!>jtqR#-5T60 J3]Pg|݀ђ7|ly 4d'7tkfh`x&^WZxv_l'Q*@NXGO[=$_nV0G\2P \*d_yhw6Ir[X}{-B.nȧֆg 'w0g>:5T<1%(uN| D͉"W;C%RJ2rfkA-&v}t`|EL7ەS)dGNAi qrx aH݌Bu6d?f9EaA^*# 5r`NI|q:OݲU?r^:9=RcRo_=$!c_`"SV狦bEEvT2k7PP'P/o&^:A2xkuROq9yzFmnfK\Փ'Eqw]SGtA [ր2٬`&4Ll$? gjk^Z !n軑0I򄣆YёPgn̦Ο|a6m:BaXL/曏 b)_311U<:h2֫Ms6"i z#6CO0v42&m+zym.xo !$ А%7ӤCC!H4`wr'6ł;QB%Dr٦I keGcDB49 \1F^ٳ+-,}˟ok;qvv2ۼ\oxkrO⾹2G:g% {=oK0`xilFʽA R|q7>N^δMd*}+Ǭδ*&I7VC Ѳu>p+]LKs\Y(T(MԖ,l= 1Fk cHz) ؞{) iQBTEc+qest5 (*9 xOg.ڐ6!V,d8}ю2cnGS$WR QIwqI&?pE5KT--S vSlU@9%N%Pc.G_L;de~A!'3SBvNӌ,G~,:ŷnQF^QAz*ɾ=ҜU$UH3ӠQ8G.|j=iΫ*|/ 5M 20$0gݮ,1 y3]xX}=8&fc.kGT(a:laW;j#(MCpNSQjvLP)3hs43Ս3WkfW<8 NuP$/wAؙN:r!zFt2/Ql|}V'L}\>0ۃ-5ډ/u}ɩ)86ZsmyIK/"|Zq:2C8nf_ӁAr؎CX &m( ȅEDАþQŵl4UXuQ@^!} ˽OC!! ;4:& ^%Jz RsZ MzPnUWOZy=dz,ZZRi#8A֑%FyG7CX-wlE(KQ\~-Õ 9 CZr`3%wz&f*0)H 2q4Ak3Xk2 ,GPC;)ζ D<BxIڷ(#IDU=@E,1FY,Gu0]~u8l{xӳv 0 ̾ʕ7)b, ܰI9D^/tg%iˈio+%7OeM<;`Ty *.ZJl;lTݏTV5ND c*!_myz m Jryl|PqRwLs^+:%'doMj۟GJSPWY~eUcx<;mnQ;NE# 2oW:$o\T@W;`{ͰnZmo.f-QZh Ug h]١*k"_ ߑl+AU3{須 p7qGX }L}d(Gnc6,5'C]iZwt| D}+_QUZRWE.DUST`eQy󧞰,ԥv5MΎ &~ v ;Pq OHJ'} ccZP #nc n85I'jX=8E3:p iÏj_R'yBbb5{~lf^Y$B/F S޲~nn-oG&(mDh-@y$ *dY89fsך4J@@ Ч}Њwhj6N}6S챈5ZZ`u8N钰.qI%^DI'yFhDbp,Ֆi̬8̻ш=#Sf8^Ԩٕi[~&ap(&4D??_pboX.Cۯ58fki@Bv6L,[G kT5%z`._mgZP9ږHNxuP H `pք6/;W/vBk}J]٤J i>}W5&yŖ .V4शG^f]j#ԗ=%`ϰ0`g݆4h-$}<ĉ+$fZ+vgwaRlPN譯oh %cI8sGm`jg)nzԍCt&^4kk{&EY,o杻wŞ(sB+eYigՕQm^*o^A?JK}n6@wcc)%GtDkPXSWwSw!R&7 ̷'Q#0shAX3B̍M2g;y+l\vtG =^Zt_'XfM9=(dA fdXCf P1@NBYlMm[yig5k S^I;~hQZH#)5_U! O6pݖ/*^t lJ.߯[GI[էEAm,x!Ox ~]?0<2Y/ l9Xr[2K!}X"U6%*%=0M¾߮sp?,}0Ps䶊E%AO=~*;Ķ;D n{FU90Yap"\aș*ɕ9ڷ& Hip<.ҼYܾTy3 $'Ba"mte]}D}D}bAlxVhNVI.K]6a_ |xJϟ[C.vM:OYѦs@~w #'UgÜ-GBV jy?F׺Bεu\D)~?pfڣUљ1ntܡbu:Z0=?~B]G$Uw]p;,lƜTs CxY<ɽ1?,d-L+M9g0()7lx㔏Ϳ!-Mc+jh8*+sU Ȱ2h}o14VzPJç3q7 |=s 5kPAp~mpIHY#& \UX d@JC&(F 9T\L=-n$97Ul;9~EJ΄:CJ6xES) 悲l*v^`)_,ӵ& 5w; w,GνnnR8 AuA96*j 9'm1,~ O՗1RW:lMWBVJ5[φ~{_t-n4U䠂; uFqr`x$ >O&]yǡumyEB\ouy=(<2WV%:cdA'dIR(_/dC @UU/ȭK;he-XXw.sG͘-!ХJ6u~\YL%T:~UJ>Y*knh$'6=)d(WRf#ۙHs!q+,0}]VzI_⣕l-TTXL3'#AlTsJ$E~@Ԧ%r4*z2MTی~/!p܄uXc~?[\# EhNb]Bc1roK 6[\zCOA[ĝ=^bplyptPbm Qߣ Tp1-f1=Ѧ*J!~cpJ_ avy6P$]'q~v 'lCaoNtb|/r~Dv![)ÜaH e/^!>|J.vC_1䬉\߫?yv@/D<:EmR,l8V 'xCw<#M5}9? uGj9SsgV#,b`9b?Vh iOp&E!Ġfsp;eT/R-( *}cW:ă F4MzHn*!~^?{9ä6_m|/OF3 T;8oqv~?#Y޿^;JFxgrM$TP2Zċ+',N:+*{Fч0-ij^_%`#/\ %,Ra ],DvqSWLZWTُ.WAs"fk39zQNTW9~YAhh{JT- O~hn-U59%pAB>!yLgE',fC# uX,."cf\k1pJ>po{6{R2GǷ9s%|t1Ĉ=)IUL.޿PI-8O;ttM%uDxr$h=@fڕ+ _ʗPj"_dt=A7my.QUka /˒&?n2`\7M^U0c@/GW7nZ ꡺[.`= p~4%Kۻح:_5R--y;F9wSpgsSfPA|WV H:+zcRPջ`jiH? _PܾZ`_L1njcu!ڴ1ދ, ky SN-kcاqnqYOfۭ%.>ΗMZ8%(ͯH΍c"6=[&6Rl#j!zqL[m`ig#=tyNtVS0Z/ l8LJĖjY>a^{O۔QK&A{KXcԴOͰ;ggċϰS7H1ڷ%GlP:FeHo+%nF$wwD2 0 @7@_"ܽRB'uβߍB+8uw}[>sQվi%}u*tV.]x2\qZ9QERdi&/΢+)qhmƒqUxᅡ;&K&QaRR@^T.YI/~8rEYa]JDv@J7 gB܉ߑY)h~S!^<:;e44k-4U:^zzC_6ЀiE7쮪biCfx6lHMnd:Jk? юb#L=e?DI(:lZZzj_Zv\/IE?\pY㮜—-3)$,t]e,wa`OF$7{ >W˪Φ'Qʥ0`pGL' = d_2SNF;D˴%F6R]ps_+v^٬F)hw=lū0sUgD]كӔQ~ϞVqb (;:vMcdP[ ^y8Bi5C^V#gTDXMJ Ξ4/8%jsKC~^6λ){PI.EW7Fn``6  2XPmzGL/C|)ڣ, 9v;]8QFw\Fժt%o^b=\3/glм4~p،OJCZV$f̗ZxIsǔ|ypqrs/ 7YD{%qI9w}*.Ef%D2Qč]qQv^:qkDndIvRwzx/:NP >lw !2V l*$1̈́v Lw>eFnŷ򑜊[JԽ4C(MJ ᄣܹ~iN3Sny%,2I (of_2Eyj*[V _JC=@\|l B4h4y/;?cq^2MNg[\!}kSe1>RgD+nBX/[n$QǀuŅ5Sa&Ms c+'--eA&'h5F}1[k)f!`II2L0UGD}FWO#KO(]l|ƥ͓;KIzqgP,frR˿T^P \NsF&NQ}`MbH99F>B?`2˴*w6غWtSd&`\+ם{ErWs,3p?s.X):뻣<1z<1qϡ1z##l4ݎlg_&0̃_V1>; GȦ:"[V-*;&+6M<<ٻ.Z=eUFºh5A1%šg<- 9hl/7;wP箈lux3'~Ô",7f:K(Hqrr*@[{+!ի⋨hx5&kt:R"|4Tc]w}ǣʱS; 9t%W?F[0RFxSF]Q>1=Zi4. qՅ"=+i;Hw1x2Ś'@'CЕ>`gw =qIx<滦upE$s|39)l婻Eبo.fĨn*@3l8F ΔihC_X(&]M+8;B2ybp:O:W 7Բ2B ڏ#H>147"rԦn'-!_o% .?ELx`Hy|xI_;rZyȟ3%Cz=w[ġ@ˢŶꕃ㋘I>m㤧Z@{ e3;4?j*nѾrӊK{.. -|U l~f%搹Vמu1}VeXQF4&+c쥜'\Bo%n͖_MRYjVQ99UF#f5@$d>ǕN0i8ȕo5zVi}2o ?/d{Y\1wL,/o;Udͣ"V4+ՖSu<囱@ M&6" fCIBw6#5~ImPn h@QApxv^311n.Ϗ2t~'f=Oh ,Wn9b |壘G `p3 \gU\0Jҝϟn@F!eQ3ܗctLA8ciaƁPo:bC{NZC('d=2qŽXV~"Z`$^jƮY"T~Q^"ޘ BGhh^W 1#od66ܴ(|Y8B&{ZŤbzfRB=<9AD޵sjgzLM +㶖 *+fOgUxDDz ׇ\~ OXѽ<7-cE\ỏz*Oq+/>΢Ƥs/q:UojD/3Hz$|hb Ȱ پeXtURACVleJȒ뉧_D݇5UL%^S/iWym;/ 9N )PDH{#]qGey/:l5 MNj~2d7͊Qr#j=t|5]\Ō$Dzgυ]%%f6fMH1C   -$eOqYg,2'l5g MEΦ'c0z \-×on黝[5)ش\/k>d3F%8G)h}xZ,t6.w*/fd%-4G!~jeD~N E[jg "7B EMr `WZ/_gǔ)B{LJ36_"p =PA \S|Fvi&~fߗX< 6ip$]#%qzFb;XA\[ZZ3/4z9ƚ"0xbub$!#%搠^/DPr2[K$TKEEףz!T͛{*VB.49*| 2V?E$Zhgl1zO k) tCr:f`m[f&{|*9(1BGXYC\wȔV~*7٦./k'$|ysR9l"*CV(,wDP0kM̜ yUI 6OFUtjΩj@r9*x VXN.jt f;$(5į&1{=țg#8̀KKL"`)$3E4=ԘHmS_[eTkJH!c R<.KϮR,9MA$dq%G'{VIF#2rfx(D?"M-*&x ?y b J޷kaFx#?B >#?7͈Yw`8zS SSxb2_CLUh-)f5|x ӆ'aF81qD&i?'E}VX%I2;do;%"{Y8[O8Zt:|~ } xrS}h|:}ӝeÑ.L;rxwGk$ GLj^aܠ-CANXZ &PGfe:VUXξܨ95O޷# CcG_YwEl[#iCy`_m]oOri hS!BÓr5+ Ygؓ>#eVџxf~@O{;\ӷc9;D,F%jz@qZd&{BP6b<YKu*J7gI۹W"-XO:x袒JӇ<ߝ^c4c[ |f8 d[B1 .jm:YP+k\~RroԞɡADŕV1Joc!x(Q`qW81|c$xjyg<,#EsG%u4ocGn'6_]l`8>L E?)+S-q>KT@ٷXH@|9S8B(R?G v֙Z|4?*7(Jx+b v}N  #|#xN% (qOIKBF)0iQg)8|; (|<4Bki [{Ea8aDzE1Č:VD"""26*bQ8?gwx2:x7OojsכlBC jV2Q4]ǡY+I:u,^vjCI^4_lMq="GNZ!ro_ &qAm19 UE3[e Y2i1ĩd)%N;E d];r*2xt J d ՘ /RHye@.5A״߶+6D 2wȹ{%7B\1 G9M-sd[eyV`qbҍB)dgF {XK-.c{ 3fвJ-.q @(/w>jc g3٫31"{*[!&mŸ㋸ !d]tEc!u %_m=gV!zZgx}Έt4-XnV]ʽfd&ۋO [ <7OK@a(M.oMNtXe7uTT/Y^_\!?n>Lc}pZQa/7nG{j̩=6"J`&Kc'm1 ,ӫ3^{DCMof?P@Mg ! =r6= !gZ8zf^cdg Ȕ ~:Rוt9 %JmNML㯬_rԃ2*3it&2P]ܫsaA􋍒8OpITGq)^V@ PB;10N~]OuiDL1knPƃTZa/'TTmSd\.̒w#}juUY4^U  }$`5O#y =*$,s!Y[YҒlPܫUꜹ'{V[ O|ŸB/=gT}wݯ*Opi8騘ChGIn\KxE|8?]$kIMͯKw'f r]Դ)<] p:ct_5,S;;ΏXyNU\ bjg0/O%L{60-Xޅ KBle~cne xf 1MLo!ƘV+H*%z~φ=92h 9| cI)} +M$ߎ战0ɤͿ%UG.H8Fcl;[[BNd0j=X}!9Pg!w,D4@VY?큆p=-5Nz. &a"!u栗B`-ɥ ^p:gMgLX/_[1?44#vJlޖmmq!}aW.}:Ϗ*c6m@|{U2t֠>wYi$g5h]p}xm*L.'/ +^!A)nT0yQAt g?38[ kʨkMu9Z_>c粸rVj W6-kU.ZLzpP疸de%kֆ~p=>KtliGhoKauܟ(l9j#̪ Xru_ˊʠmz[X8VkI+MI:"2G:* |LtXaiv35wx@9CnV\!M Q3@7&2qSMn?3 OBX\lZ#j㯝'UZ/ؒj/LsѐY<BzqF]ͺ6+`R:7"Ey!RkճLG/GCʱ)Տ>v@z2E(T MG4/Kzf\4YncbߴWԜբ)U,UڳA ue#$&ջ2W;:v977Q-Eݚ$EeZodeȈL2t#.Z6:YGmߒ4 M#^ Mݻ\!) Ɉ&(t JlA أ-mØ+U,5~TU(°qJ2>A}!9LʷB,ZtZ&T!z%0KRN%Z!pU*eG#]jc|%@M# 7V8qv0@o櫜H -Dze\31 6@ .|01p`Ҡdج-.5:E]вX |!F=zfȥSDcɦr^x7fe~W"ND/٠j_WLXK#ݡқJ)0)1*ε߾%"9+׀' a?cy>FϿ %u0wGa~ v]2DU+TE/*C}PC'~oQ\Q ,~ NgW08UCg_ab ҠC~l@95QB0 Jv5T&eZ?a'{[&13;XFȊ(Elѱ%/䓲Yquy1 ϋ.pMq>ᯠ wTֳ,&aO$7pW6e2Lox+=z,.>|?ssFƸv\檦rɐ7].,'8g=Uf  s^cc< υIb|i!>O%l0:Em2`T2U( vR?Z5kH$c[R$'8b:9i2Gg20 HM'?z*[\&v*ڊ2|9l[m%Ƌ繒_Mg|A[о+]YNRޅ@ԕQets8M,3Nkkk7}e7f[B=Y$5[ʴ]WT r{QGnifY/l 9u-#iڌkJ w/;) +$6g#5 >>ezÖ~)u2|žgpMEJ0>O#i]KN&4s &?b 9z)<}, U2Fi?sTBU}F=R4M4Ҷζ ߬V``0RŌ$D-qG7@`{MS^YCyOuiDc|rj7iDIiNϗFXUp9g+{[ a_t+"5QP4]ClС˟OKT+`/} y4)#o>2"7-Y=!'ez|O ՠ=Y4ҭW08Hc/q+`e ;B:[4o^OUso@,Ey#uܥ <,/N=n݈2eI 5Um[16<xk߁r$qB$;. HsL8]Ût!,:xS5݌Օ%SqFmv]DIt, {w\۹AF.QG86)0?/zTp(d%JLvY uZsHF2En #-n7WYhc+gD'xڹ(p;ƨvIҒ1G kuI-toV"ˆR#:?VSIo>Bȿ@bgZ>`P!)rӏhm=4 nehrv9#+0u%h'Kڃ0j ArC!mK?[{zh*EҞ+pVp݂6KH5Ϊ ЅG:u3JTό,ܑ-jz,!ԫo$gnfw؝~Doix~=͈5j> 0Ϭǜo r24x$@߫10Ra. g{bY*c,ԟܟP]հ f]Y*䀊)+Bߠ}3B\`PVbD ׬c}(.KYAkqx_"3(YRgiTo5E@Rꖱfyqk YI *st9awFæNm [岴h֝ ^Dbx^!LD)xP E)#sxn1M59 b]ߏ/K3~ͣ#TڲſOD:qy3ΐ=\;ZH TƷ^ 5hPvV4'Aw!J{ CcP RY _(ѽԀi}_qWGx%32T6&8:ޯ 4_\+/Y@=BO!Żҿ[NOkV!<-&*+ z7NKR3z Wbt0PԜQ$>FFYVӘ0~SC%|)$?O3|?_9s SjLgOR3C lgTP8 GSPLLIm$s3Dk w _]6q|x/ W-P/6o]u$|9̊ʱG`P |ەaWpr)He]nJ5oϒ~uIjNB"c>|-+>oAȞo;1hj }ԣڔcý l`>JVjlk'?M×kzX e^L~,]+YQ،ұg}6]@c_z8"2tiRj[t~1vfiEn65Dr`hJMhI(ي{Y=É Dh*ͱXQIX`PQ}8 3*^N͂1d.WUQI}`I ͸aE$+Э$W]RJDFEJfta6rC\Mgqb`$ywYnڈ7!Aw 4Պ_1xpOd qM(e_Gdy+$ xnYKOъ DX]=\ߥٶӁ."Y >e]6_7.`0,]ZboI~CIa 3 klJȬZ|T);ʳ/e|I5 E5\ b<װ%ƽ{5˫ X\Chvg(-辱rH=snoKUSc|H/8uy0kֳ"ѧSvL[mZnx2U5U`}XPv02`)y};'N/b*:ܦQ 7(ySGV/r@l^ ` 3nX>gwEW=|N="81wj3BZfjpol^ʽ~?w b;3y?)[$ֻ1sxcjB.hzȓ˩&{d5jչZtƯnRcߤv9KI5Bl 6iTeQ jy*OC٭|\Xz;9_~`?>D%g +!ja^C$WaehlpR6[4Aϫ#}<T5"vȼJ%=Q۽ǡ9LsS0[c;K 1>aWaCC%b 4f\mA8/{i8dOf%Ro@].wH t=odجS%,Lh-aMȒW;`1 x|Fe,3 4ʡjC/8>WFS"#i)S*{F>5~Sѩ@ ~+f0d+hF҅f#K;P7/:®˭$E=!^Sv2[W Tqm  j{ {^ͯ)8 UMm# u<b$ZlZ hoyao i]Z?wu<;|'N-I.]μOu,YE@P7 B'e6AlT!乌3݊GSiԵ_Ip&z^1t .[L 'T̚ mo&F>c~TE}d췶gGg0}[VF ~Y JqJhp$3'* v5%rV+\#K=`pQhmS]/{eOoֽ#;O4aWnb{f?@Sߏ&ZdH~,NFcqLl@>"5iz.r|MǙ$"ʷ$4Ŗ2`t?7҆emDꪔDv@oH"-sƭ\B",.$ y&QM'#E݅J|| |LIEe߆DBr}"U&"|]a1#x4+URwnlKRԗ94CiP[&{f% (.m@E>ufzS7̺$P"_9]&&Yg3U"uNuܓ?dl$\HD ̷MM<X 9L.]=s/<ΰ0q$6p^&֥5pͷPjčj[xq3Pw/wwN0Gcgn9[OFlm PC ݆>$CTZCbXTR2 \WKw վ:1`,.%<@XVvC\-'r.ze#.tS6jo{?pne@%4CG͖%B Sp"k.6OB){u hLa _Wk/V@Ҏ*tl+*QB֯yLE&YHĚTC+y^ZNs67~aCbMey芗"$=-A wpTn}SEzZv趄y @UFmds5%t C =0}=3s ӁvAZtP~_qG]_>~VI&e4 a}OJi> = B%rєE׸P :q1Js {jb&~whv[8[^0#̀Ȭ\i?wzݥVܸDEu6^vӜY} dAq abbrJF5U5b$P.x{3He|0FpQjA!gBNսU rW:5ͭ߆pa#IV5vN=аP4z^*e(5C4=۸9h8}cD[~mry83U[k]]TL7B]|/b:Q-x;$k+]Mu.똳@Ns3-W*jR3{ۗۂOg|;]f&g hH#Q)YGȾ/@P8Ľ)*IMҙ,6a햘/o#u.p &p)E)J}~6\"-d\5ݺ6tS%8Y܁׈IabzV]V:VIgTQ;p92ŲV4+]Gq^;NF6߀[~>j/kT#X񡒘\I=@8W"'޽W^\.ʎQ(Uo--u @3/8c:L] (MYϔ)ܗ [}aϋ#pUgSNtT_j͟h䷯ƨݛ)l[%0pcR2X8wًeX`elȀ }kfm1\ f"mq^xfmބvWZ̳yLl." 0S_] ط;o--&Wjj}~c9xS'|f&KX)b(5OȌ՛rjgY`A^1ϟ2^޴flxR>C>q{fS21\aGdhDQ>@fGQ@r*s;tdVÝH\#l$ϴ 7Zc `|t^o]$= E2flv;4Q_6wa_F5`:8`S9 3j鈇:@谸0fZ8#Ocb5 dgb: i%6O84ﻌs%XVA Zx.}{4tB| Z-3 ]c)H^B }כh*}tjX.lj~S&bX߫4#DL~"U}`ĭ*$ @["`藼^1/elԗf}3G#B7Z<-Xs"4mN-AʸW8 {i:z1G B>;C3Y^gG/IseP>qtR2]F(T *]VNE YMڠSx2ɷb{]!J%G\F?Z7"ZeZ) peDd#w!MϪ}.%/b;V6^?FUn~iRwo<)uqEzo˿ nB\UGTw!I[ܜN"qamF=4C鲪G{P*Ӻ% U<6:⎑_%X%H冁iQD}H. "|%jbՂzg 2oU>5u!y6%euEI?ᔑ_#\Nv;mkO X3Oj8X^Ǧ*{׸{xaJr73iG(j'K]^o>Tw$W wU=I_5CN&|MPPT…`ֽ6E]&}τfTXUۈU*O+F{[hv9S&?ߪ*_1^}v 9;.߯?Cu[+ $m1&M$~z5+=I1JI8̏`1ɛF*λp>oϏfWˍAY@eAi&CD3GDSt+=av4M"it2{xn28mU/aTZFݵ ŹMK5%#M٣83pKsY+6K|&2QNWaZ:\_pټ*;ɪsrWK&D1hK#bȟ!PwHW:vh<WZ֪~EP&x7HtNC}S:75QHN^6")dM2Iv܄Ka6?AOqnRm+i(wUcEXyy%)C箋\%٘'+ .KT*H)_ĉēln.y^Evݴ+gИ$\ClSgњ}Z5))Xh)2^^DZ D  >Ɇ ٗ'4rNNEGXu$2bKt*+ lN hq(87KvgrI*8] Vb8GgG|J|6|D 7Ǔ Uu߁8[_Fb,şݾ!2y# ~|m ~MbYҨH_Lhdln?4\.%Ȱ@͚ĆZ*c3`9vu Lmy uu??eS npN)0I{NtHgƗ &Hj#еA'5")K}OdXEJ+TBNy@[$IN%A.#y1͎^Tue.'Q}#-Su.5)Tl"Q4!^wp{S,N˛؂ ; 4G3s"H%Aq\t /fٓ(vҰERL-Ѐ9BAFpXɫHS1&ϩ$nߌRxFObŀøI`F\ԏT"vcFN pd_)=7fa0/Kgy$XϾzc[8œx,]WЩzȷ&Jט;a:&4_;k)3|#ZFa* {6 KZwrqn /xK|η؄ OkW$<}1ʕ塻9@5)9aަ7PZ՜0:Ȋ*SH,ҚHuD⤌vn϶3xuiU[W@~Ak<42U3^-v2;- CБ8h/X> eLYc㌁aD99)Ņt['Gbu-i{nC kY|qZ1 GxxܭK%MvM^~r.ԃboZ7 N[fl&w2 0T]iI4[g^UdПwѱ`䗵o cyFJ&$`Ңg4,BA0 ʟ9Ev,o 5qC&?Uޑh/w=_՟vxvOJ˕H\9zdxHfkzCmCR!ͿOFK 1WX@K{Pi:k _x$/H*IYm#(~:' 8 >QC6S> kgW~LPF~ɕüDP dF%R;r^k Db[M[ W1956~^;OI&P&c0>w'ė\%7{Wǥuto*U< }&売_^Q=(VNK_ !(  &Կ݊LVO*fuDL5=1_KIjrY.Wzub7(Ț'qy|H{|øR\#Sg}-Vк4=y J;l(ۂh[}Pi(7}j4bF< Ft_yXypp 'w,(^W  %ܜB L(Ppɼ()-ZMX( S,MO-(]W1B2 \}6(ҁ㦅wYɚ:A$NW@Vᯭg'J!1Ҙ9r2&6~" YO Քz;d^> 2N󹊙gd{/;Bx),S9 :4)T 86\PU+tT*ԐndȦ_ftb8MKSq>f"~l]X|c@,^yu!%ƀ.U&5I^-8y`D\hFbָ]fjUQd}hֲmvOry`SÄ1 u ,G*㸇R.+-Z!gML=,1s݀% >h\zG؅ 0 WGoz^1*QELG+Rާ^p2/mi WH4rTWN3FP oDVEsDI]1mI?]hEa*}WU#_ ׾cB!ۋ8;nlr>(ͧp=Q.pg qfG [(yw jH[RvCr<=Zt-K:Fkf[b:6m~޺ԛ3 !J&pz'gJQ@Hy+? rGet䋨A$zo"j~wtqМvs5I*_¸Ȼz['jd[{UED@>25:Wؼ(K+WȁHY&fz]e*LFD4UrFxaL ṂdIb8PwnA$m#aa !eD#{VcF0RE,CU:aur) KR9mT e ޝqc[a~hHguLz,*Lw[tNVVƕl(m[& =&wqs^,;NQЮcw 2T) n6 LOMh # &W/w?]A6"Ktg&OQ|@0g0s"LmXb4 8mbCIjMYÖOg]m$,(Q)}ˉBb/lֿoz :'}~L:;rP[ٛjXa1: Ԇpd|ӪBL^}|/*>? 16q#5a W|\W0%޻x[I;6r 9MR*2jūvCFb*|R1ݹ ̜90Zhũc]PsA]䐒?F]i?hftQ$極k4cgt6J$m@(sN;|iqjku<ob?K>ɱyVG C*^ag^Bod3rK;_R y @US|p(<@WY .5[U>9{0odNfV ժAdJgKΐY,7V\G='*B-(?ݐ6fEzaڅYIg|O//lk38_Y;Рl_a! 8h4{H&&2Qö_zYKꩶVH>HKuJi:V~!K3Y)D"?݆CnڤW,A4qRKQ 3@.-z^^>k|Md~sw|l*Pռ*C`JfiWp{B46~ɺg\y4z9%\vltIk[J}VEe_vj<6:'㳛Jh |sui2erS_ȄޕGjv&s]:l*/Q(8%ewoB&dفY$قy?SN/^Q$1JkY( ܵ+5!  7\pn %Ãg#bT,͕~A .Av_G&8asHTF.{!lHD$VìI̼oPZ6]M8e*rv}"+2oNgec,^h_$ թ[9b=42?2q$`.)G=q*6SgDE,FERQSnwXo89YCVh\'o-: ~>P%@ ¼H1Y 'j2.DX>Q5\BpS(R$8/ Wt(#϶[1s!w{TfSowWnFda*]/>k?_;Ib!, 'dr\=[!*3gYAHO_>ۼ|x5KW-)1@|"o/袽{ iJ Iڟe5v\eBVi]KErUB17|8vdZ_ǿJ0Oi@*P[<^S聑_/ K?}$BSvᙑWw95uoz=R$X;f@I#tR3{ź epIs-nÇ0mjfTYVAH8B}(ȁ9*.-f`RK\!3gsHWfT٪,iYuFcO#s44miޚ{]qλXTVajܲi(#غ@pAiˀU&WYpEcAzZMpS.X kt0 PA 2_%;@{.xVtfM㿤Cn3 )'ņ kZ!!aȤ9 J,[U`ȰE٪_#zh8#9vupbܻX`2ZE3Җ`0yi L!m xEƲJ`okBLEN΅Ɵq*+H1e=xbHdY๘I% cAPS$q<$LwH[2CWޙGvNј:ౝۤ/#rZ{]G]Sҩ?gՎ1xYNLKBxO8Pr~@Fh\q6] 1J 8˄:;ccp3qM2w) F|yV Ak K,Z(7Mcm+E u4vH[Y8'x`~o%gRE6&t1%`w dghuV;Շ@@P~F;;1; 6 1t[1K.qKfqw|cK/ .ejVɇkğ$5$[ϑO58y$[;Д6a쌅Ԃ Y>?>`3 L{u kvUq6PVq!+).|T}syXb+I'S YG_"CȾ Wָnu Oy"}f(|j? *dn(=Q1R'͐ t8sl3B!▵?: εt>ȹi37<-4(uhݓ'K [Q'gٝ`+oA21,V8ڞt™Q){_? ۾5 R7"r0NџUkk.\6) cfRX a8 FguFv#3Ǝ›y|1& %V n@xa1y?p ڂsyⳃTRs¼LwR*HkI}~L_CU]$@s8ڄ|Q04[ka揁7{ÝmYIA՟ҊȜ|nƼboxk^V56N:YЃX .r n92-e(QYEI|-%M}Q8Xx;iA~jR˰6@>L$}JٯͱdnmAJ,q\"7(T+;<+ {vDۢ^Oi.84\7bZn%Bbƾ/⮏VEF Kosi_x*5(mlj%zY386>keP~[vjl1Ml66V}>;J8ҝ&r?c2$9ǟ L#Tb'UY&R.梐Ds\QЫ3W>`<]pYޒxW/)-8x 2Vzl>Y)Rp-M|HumA_1&( "2 ,w%<h(u7rN҈ľpC˭N}Ìm5-ː$ ^'X| Ign#h qb=2lվMYu L]K n ޕ(vW݃ۻcGᘨ@Z$&c5Y %\'byM+IFup\2sȋ_- pQO%k ÓB\|ﮱwS}5l*BK5dTUp `٢` _]bSi}3dGQ{`pK"hj=žURf[;y`/_tPag|<`5βwif=PU8- r`%z\*]iQfI6d%bf0yBQfIj v5N6x)Q?$; *s*eȶb*`Xe1ZtxQNq,پr3i008ZβN+bY$~sh{\a\al cD,?%` (sZ X04}j|!+e. ͓;X84qTF.Tz™Pq#wO)u\o9FX#uTZ<7G_sEleLzl-:A!ekܕɳA)WnW'zVBA'D G~^a%ϟhoѸb6DžCIr q&i`þng!_e`9?:pJPQPxW}7tiȄ.j{T=ۀJgq'P3$U)=T ~d;*6DOqʷ]7 `$hz,0=3O'&[MZVGJ"poR(3-ŷP]s g&HԧR1.Y1+Jk 8քڙ@lQcxXV6W? 򣐤<,0#LX-齑pBrpe`(=@ҽsͦRcA{<7sb=p2"uA)TٿQq_`g$G~oRH{-5iy ,MYWflYFuW}I[n]rq8ccT9kC4E˻8>c[}.poFķgFU,1^FOM +-ً!/lt+܅SqZ\ zy+v' !>7臖t%Gx^CXA7̔>KۋnW!ė>jڋs$Y7GU# . %3c꬟?ttuFX$_TKY'~ə;  vѐM.RKZCTY7H&].aۃ:xJ"EQX(khYZߟL -‡yVj=ɹv:,T;kjy+#ź#s=6Uq/FK~j-[[f4âMkX'fQ2&$)FθZm/!NoYGh\if-E/@CMx{;TFHY7bWr<..i$Af\h!Z崆o 2X.:2&Q]fۘ1|ݎh;%\HSlgB <+M_ss*,bf'paPmJkyatC ,,v59%hY kQ1#5eH[9{&~RrSyL̗A?Լrqvf0o1nJh=Zח6߫ET˃_L8 ԭW40^2*`DfOwYhaI1AFF{!e{pB:5] 68,z1 /ÀUג~84.ژp5CDҫ}08C34Nνs۷R`^zQ7"VQ+(Y3Gגm4Cӌ.˓dž9@Z-Žf>*찳JDNo[>y6rt̐1F֋`誊wDDZ\3`tס:[GJ~ڰdGɇ 5ZQRzwq -^NGS #Eh)uwGʔH>ݘ_@pѥxh'|FF:(G?l{@- X:t6mKBҝ*'n%iY[1K۶< 6x9npb LǎrY8.nw:*YorDAEH2 BOr$TviɌe8qd~ӚWVm)뒐>\? cCrNHec0zT\+?{_C 'sw`FB]KUh<}/5yQ|jl.睷|*[&XE9:V'u Q_mFoK "p!Kqt݇"_aB  a ȴ- ܐM#(j_'%A-R" }lք\ŅQ?d^Dm䰇6Rv"$cͪ+ʼ/NO9|,"/kR1!ؚL-)v`?2^!jL>f k,&K<T0p93`Y HѪ.2Sfڕ1ܓof~"hN,tnWױДqJ6v/Fe- [| Vf_rCY=^ѹBRK2=Fuݗ~?|09ֵT[e\dQh`W_"?ܭ/$UjAX^USB flY٢*a^@|'Q* u-%Mkg/ب4S;5" cs\WN-}0rl[K[O%zQu0p+ `xR65YOʇYT (ͺZ;QMNe(@ia k &%Z(>A-LiW >aMi=r`tn(g͇ Yr#DZ!*9|9^7:m(Tt02ĚO16U2ӲmL}gϝl{Ӏ#>H,xGۺg$eTԉr`r YK a3od}\"!-p_˖ 1ʛbF,[YSVa!{3^O%OF߬!Ơ63}wF~H u5eK~BYR7;qQy DZxohEHCC4qʬh+L0}zOB{7XŠS46K,eR .rPr9ԩ|_d3x~?T[eJ7L1Ӹa(]z9YݢdDz'n[CQdF[!?/9=ikR ȝQ%ȶdjP:~15?L5b`nBz;:՝F:,P^2/7x82v7-np ؛k|NWKbG?mjK]&aMk0 ? w^KBƚPn2.u@򚚫r4Z's ѦlŮxay^*#N1M#K|qqM"1ceSNEsk/PT@u4C6gZwꧤE#. ka$]fǕ'ҹC!?Xz +Pw>CR2xr=p Y9GƌIB hN? ^ 8w]{=w;޲(vԀP e*(SƄS eӐz8|jx;E@]BG_XȺ !^M&#.6<Ws'^ײ`}gae% _ z~JkսG yX!N(A`e#}hytFK89X4[O*Ww_f}xAڍNZnH.? OFq:_4XUGC`9/ |H9kmN!$>!-ڷǷR:<ӵGsԖ .BPةpZ_$=H\,8jj62t D!~YǬU HE4alь1VMޚ!vB4'm?#r6/U . 3謏A kIOE.m[ۇroWmw#H5] ]A#&kVdÇaOE@ F|8Xst{R)B҂(/-}!Ov"j%;hݒ Y(Tv h֓J]fV͕ "Hh!|dH#}i$[_Y| Y?9(O s;YʂoPtrmrR$^Ă;'v 7g\[UoSk*qAn??k(BܮÚ,~I/?l>B)Fx{~:pC-cI8 (YiWILivK4'v W2Ѝ;%^b*DEqGjeªg#oǑQB=5H$}o^aY-|[OÖY&"\E8gO!ev>랲lKW}SPܟ֛Az n*i BZ>kdFhY:A'6M,(*mֻw2mVQe6M竀){#Yj0TnA"torl~}"70>AC00Zyj<1g䫴0 vb1QI3{a61q=H0 hb׶6Vi]& { 6V&}ʉJ}3uG`a=jWoTH;_mR!\ }]@V>sƬ-t9Bn<;{%@~Sk`m$ݢۨDs^R_ ]xoQǢ8ŒOxelӲ~s`<@S.=duw͙_5,ؤr@=VfI @ #z>txBCczxLJ覩 ^0և96*N,Qgtп.2P҄_0fecJ~\?+6fXT!WHi.╼1*>* ,ܽ7[80cn]vSIBra=OIQHI].,ٴ vDop0 i?b홫riZUù(56kԓ9ޑHcJDK-^^ @n F(V# m.%2 Rzzl,*@LcPkiZT*A}!@VՕfB{`Oˣ (xҪZ>p`GGƎhϚXU\75c, @qE6* ncGLJy]''xbæn+P,CX 6dI?Cdٹ5.m  b0Le ԅClh5DBt(Jangt ~RyJ5N=;@'وzaׇ khl%`UR Y:oUpoON聪`t;2+N+iygθU)q2V3(2F=Ȏr1Q1:4ȝ ~ +r&l+(%\LC_i }'LoRo;JP@sJ:"U<{=PIdRSmw=-J:#Gsp;b b.>h҃ 9{h(Xؐ3ΎfvSEp[\O :ײ6kfd=sO}69=MD_{TK~v MS|)R3’MbU xРVu'iVβ̤IC5,-X4#_ӌA듈#J5'[9?oF0_^f6бed%$a;Rj)L؃pKÙpѢQx\ma] 28G\-*y$ى^7fF"+1 beऍ$S}a[miX$#ݥ_y6 x=\YWz?Eg%)7uVx^e{7G{1@+ҍ}Jb8z{N:wc-CΜ[sh8-2zWKeJJ}tu^3,*7eo}\Rpw 5zF-54n]nuha |țWOZא#Τzve]Y4 tY;7AuuCYrq9ٳD xHtcӹN",b+5\te> ÂP 'h>c3B8^B]Y7Mi^v^%-IGV#>#RwJi`s9,oxzƯE{ cƑ' e!evEpu9%|HU @͊қn.FZ!(SAJ A_Z3bp\yVF*IgMW1Wǫ[ƐپTuD[2ܙQ,=? ?SާwvhԺׯjq{AXϓyS8>#ﭩSf>XEI[44gyLڭH5Qť#)l.&=qqTU@ @M7WSELTlp`W<fYnb@a{bʕͼ>I YY%_5rg4GdTF(m~jVnAt=83m6سAmY KĭOcH;MemzA $CW9cuij-Òrڀj.Nv㛸{a0|8񼏡qpt#K)4iɷLjgEzo~&+l^7c[;`&U 7yÅ3 H\Z?2`r&0%|Pd728sagՃʘp#YR+OJv,Y@kjT㸓>6ѥCuE!a{eQXUi-%_TLg`2KԮ sS߷3#Knxg@ƾLe a ?8*@)_;`np prdxQkd5?d9IVja֑*&M))ʯ W!;.aiՐqpEZ5lUh3˴Zo[K M pz*F b6ԝï/b̝ B(Q ؐ%i3xvi X>3BA%{s?41謣8 )J^?a8.F_poSna䪵 Z' b?=6BpZW|*, 6A 1SУۣ/}w쿼D))NEf7+̰@c@";f.'p*6wq{PdSK/]3OTjsi"9@ /Ύyj?pzc˅mwSx Iˏ A⟳ t[K 9$ԞYbGJk) ʄ™J™BΪwG"_,$o)~8 p3ǬL@Z O(ҿ{Cq<'rn=yctεǂj,|iwC`tkgFi-ϒ*}ԢhsTĠ ]'I/SLJkz84طN-pɽ98zQ0~ܪ^^~W \7݁Q"# lnNb"scJHst>`ɻ^ X;^ r"X<&$῜Pv@3~6rҭ4fS}Ѱ9<EsV_*{܀_+cvӫ.F%+Ǥ0I3GQQOpJz* y5`؎b$)n5WqyPK 4Eeq`e>ʽ=6\S.Ec!=]²ui Jl,d <lWK5?jA}jg@}R9e0rgENz!'#=hG2*Eatܝz]9 .KxAW2 k(>5_'A7`RqSO)+ ZgT|-P_z6e:}TJ( QIB ޘX?1Wkeݮ ٠8r#cK&]G)JB4D%7 R|ҜUhɰ?P\ L i(bF5@ϬʰYo~.mc{S=UC`Q,!xqCJs]8C0A .6:vn{A){/{kƨQv T,vsP`I*2 q524 Os-eXf Il=@t4,/h?Qc^w7`̬yeg>-q{3hzKC^CJ4x=I<7tL<>z GG=o|9g{~[a JGis҈{Z^AFYϰ^'Rf~MCH6=CA-W~ZD"iϝP]Fj,(#&#L؞߯=Lȴ;) 襊}82TF&^,Pf p&~"D])-9 DYY 7hb*GKK4j@N7Yqs¶e*kZ.Ar0T5?X{ζBWt l®֔tԨ7Rr<يR5{woKl{x(g%?LܘJ}? * o d?@z#?LlEKcx:)268܃粐;CSEpO -/Ey>^}82x$ {i)cu:v yϠԭ362أVlB vES#(5Z{2vp C3وQ?2iX*D/ÄΡErnZr *<TF?C8zj?&s*$*8 טAe u"^"6($vI17J# s9'6-g Ш)0{uQYuX7Nmdw…>ssHQb 7qnc v'HmxoQ PUK .հOsAkܶ7:6MÅw((+nM :fhd6 Q}0|h5*HPJ&wkHޭ^Z ¶Y䟃+0?wQ @} &3(5c,~BnW" i/qd>WWnk 㤀gԠQ۔~Jl)PX* \"=l;j6P0$^_-ZLy˝btUCS *|W$Y%~bƹ$0ae{Qf*º9.x8<ۤ\Rf@!6Bmb4`peUagR⢐L1 FZR^'3#ʑ]6ζul)w4dQ<ݻz˨/ &go??VЁ=x7eflXRr|.BQ"C@js *I<|ku4;* s?&ưv !_Z>bSxT.y:͙,U,.6)r݊9~,5Eϙǘ;Vr`r"pjv`1:û!efdkpT@ě-.^bCtѭ5hStNk 4]HbKS1aHB:udbpCuT`?Y>?IOˆ5zϴs?ts1c@sAvHű{C&X9Bdq.!9׆Ĕcm[COeڅc] 6snMCbbSšAoasڨl0*c;i,On;p*g 61ȣIuCKT\& @VRc\cO%NvoWl@\iۼaIc>yiKa=P8 I;ϒfMp;(ȁ2^?|-0P20ҍL)RnjOW%2rj34B#UOm qMiŪ%Z엺NjEUto}/:a=&Q@?-'4Cv@pQAUt73/)Vhg'KI{$1aM{o_d ą8Cغ}=~? j[iY1KfYۑmCO^bScJjLDa^Gߐ|pƒFrfQv غJz.LrAKnOt%W[oll[dq4"˪(qVԂ~Wߏs iM#-KC7V&5SK{gA` !+k@e}9EoJeikvHPkKo `b8M50_GhcI S/ 9'@?U-UCRz֙LJs[k4 A+'҇漚r{:m~(zG4rՎ.yޭd݃YF`58p]PGBJO}^mN1)6`O:zguلQHP؂E2.:;tsF:& 4ґӹɼdx~J? :E !m bFȭȀ~wc7 j`"_-*"MT%\ݢ&V$rZ[Wl*l,b#멚2sqqFt 7mrrQh[xG owjaPN /l GȹLJӫ!.:UQqrLKO\˺6B#lAEq=l-9o+E鷷PT ' f-3AYQx @|LU͛|\M;؝!{{,̃K F%>xj_-TF3A?Z'&vۜjNYY:f !n\c>":q3hS}{@H\}d#e{鼯B˕!ӊ"Ǽ =h;5(85kZAݓhc$0}}vWvILٔ SjmVG-Im%k8E镐@-0p %a&E6i5CB{h@$ԻA (k\?*M7]hT:K¡uqn*`e@MH́NNu.jƁxp!tK9bd i׬V$ݒ**g5b.KGjP}8+k T⊜Ix۔|AIR):[zb=*b5ѣLQ,"yJ2N)^aJ< l[O?3E`h>6euW2V@VKK:=([nD#M @5`.i=u>2i^jThpcr},mhĨwq67 =O.e dƥz_ .4AcNK0Uc!DֶM=[Sng2kG{㼴8 xn2<6E8L&A$=θ犫" ](밀.nD,˷yZ(]גo,{er4%=}m:(w zp IH7bK;'5p|0*A\ 8/$J7X8\uEn0[0<wʄpi_%oheGcOBQ׷M$526$ZT-S gM&NqNJ7 $bORW~p?!FgOol,&R/x;6v$ O}xvn;"..۷;0+Y>' )3ߢĿ) |ts7/l. .ԤmU %6xrl1YCArӪ2Z.HܖA\ېl2M9}^\:07.5EAvSo  +F I謣·z/65꣹K0ĮVRRY0IrM@5΅{0Mˋ+Ȳ_ 1cCIp awzXA6$.0ޟtM[ij<:?:'p?dekޑ £j67ix$%Il_nʚ$9y|𰰽' T^JR:tI5_܇x6>݆ @&$6W B1~ "jda[7 s6ӍnwiY{H`t H~=CBqY)ᇤgHHHʰKhmgV9ڌT.?Eйz {}A-vL:hxoMͦm;В W  AqU쐞8hg= nI6OU|iXôz O KQ̨OgPЈmfwct)zH4JqfǕS?|;ݙ[QqX~˦ ;d%z\e@4@I4sR5N^ֆF|L.U?be,`%C@rl=>_ ,.݅ }5#r=6[x!P"4_Jh(v@T_ٶGø&n5<ҭ8=ǐ<@o)^9BBF Ouz7Yȧ$׀-w@6`jE;b [@`Fǖ*H-+x=}>]QS5/ovT<}1u dq3qyi^Q>{D(w>tosnVbxh5>9 @nwWw2>D|{P ,{L Ϫ+'!]'t&}F5t3'^<}rlKد#]S'387\"[qM*lɁ4~wy%ZBGz+WORu=Oj~*"b!cAߙr։2Ǵ9F LE66F1A2(MQmc8tG5V>=]7DAtMn6߷BܘQ!!p\3{KNj gT\yɸd-(](-$j,Y?oʶMFJ4 3܌tzr>26#2Bi?uH{j7U5.}q5Y\3gGļ᜻`Lsb}H&8%MeA2+ QaN5P( ě_TضFQunD>U6FZR]mw􀞴;\[>$fŔ%QH`TOŹ0u<h1| tJ|54a£UW:`6Qj5ϿSkGG6F^Nšmr-b!a¤{~Ķ޾_о;M;?Ӿ@a$7[FQvNbEq?q(x) J;!,O:>ї^jpMk S=,~96J4a P*] PU9NqLWA&۪ 9ހ +:h{Έk>@#Nڑ|wF8> 2} Q5ZF'(W`Ǝ")̨DgQ>s*Y u^ƑOORۉ2_I0t&x0j(AehLivBRYD]7àNmzXO=qEȕVvvGSyY@O <7h#XowRvN{=ohP7 qgBLJC Εe?è,+"G&IK?6Ia_&}="צ7ѝ2`75}MJٜQZSޏeb'R0O?.`4a8ADŽgp}N4iiɸa8P"9ѡ'iIn7 nK }.E"|WK&ےH%9_ +\kM-7C5Zgu"_{``C&9S=xO"uMiP.XnPph\~Xqmwի$h붌DwMKɰ]" IbT'(Yg1,4ڡ1bmt0_`LJW_,`KyԼ.t<2Gk.d,Z5$@1[$'!a՜$F#xlC7N1@A'B G>e?gQ9K୧mJLo#X=UQ~#P?%e4(a;NP4 )f [|T=fٮ[B0&M5(|/(R)dc>yYd%sidS`#Pmnp[LץBd_QzJ]$qjFB56Ímͷͻ"7B K 8r:9(=h+WS8W!7[ǹsٷ{U(M+ u#u' gg!_.zP*xdHxL%*o{㛎iBfmjտѴ8uw.|]t1Mt|T {BLMk563*/Ry5%Jl4(Q7 gno//( {Ϫe3plӶݾPQ# Q,"4e^b̆%ȟs^f)hÊcn^.}Jm5ٓ%z#,muӇ IDjyؕR *qsVQ]QÀ i98qQ ،=NW5mmS e!d e5eX4UrVy c#H R&7h+3_jr:C7L 1@y sCLeuu؂t$1Q`LL`_IO^G}E_岂~l{@Q9 E2@;D`3/E6gv k3inr5wXN%B~jK=c!Cd-4~Ig8:V!s߆@dX?il1qQu:5?B}(f%]ws:ֺ#`:=Wĵ j*`yL n\ xĐVfC:i8 OE$ucD)@彞8ps#o$`F_wjX>XG`E^P9l(RVAt>Da20g$\B{S8?2|[uRp5c]VLH D"9Ѿ* h:ddC(kȽ6iN,JkXzSe&]_΀rպI## ڣ_DW(Y^HtʬFzULlFp4aAS@A>0,i***dBh}μ.H}O8ԥ/G3&X%b'b">^]g<=$P$-مeQzJ 3cC.)Ng.-q-C1 b/q0{:I,[Kblo 'ԙ%`of_:!G1 0q_`EW 83/SeH\?&6" B#59TqJrQ KﺅI 5Q! GW}.>̚CiۦqBJg`!z|mNێ#Bdz.Ҝ#9MCl(66 5ilry"Gp&-cNy9qiW2A箾d6ãrO]I pTl\FLVpb?{u"ъ)12 jK61)=]D}|:Zp>~Gч`@'~u~&@,fRI٠!bڅ$KDII=+jB|E*\l]I2F^8|G.ww$f𤟖3+=ˍ+pA)@P~ &`m_v/ORT)'eq{iG}o1&- ~$٨] HAdF'uwgT/E ~_EE~#w 3az59ܯvU *$8./` +2 ^Crz7꿦Ô})TNWlm nՐ`|q/bwW_aj-E:M^8H*HCNXk1j%Gl%teD)S^ҿX;Z&ju58v紾GSGs<{. xG_>#l!zo =3uY!3yيVVI<ϥ6"l!0ᧈ{k&{NEeX,X@$1_)~;#C;}[A j/Н̐7*J![M׽{ƛd}/M!ӠeCB}P^DMWUy"~V1 & U"opbhW(/3xO)n8cZlF0X)3n.]X(tVhK ؗ/E\{p:udKxj~ B?!P7 E ;ҹ}kq_8HY.Ff+anMF鱕 lC? ,W/!b?CWpQr*d!!³E#[铉ZfC&\L:7ެSvיE>R>h??9M=Wa+_ [5`YLm]ϮQӕ݋b5 MYKic0Ʀ,FEGoܤߐ.UBf>+c,?KLiMfR$¨0T2g2*1"t5n6W7'1.t%cAi|}X0hF)6(,n7ឪz j"44H^cB;aP٭;'nZR2o.aReӒ5Cl#n^&iJԛ5>3fsk  BMⱵ(=O`xDvq+Tu|UUe H wG<%=b8QWH%V|xCXoј7Țt<6XQ S : C^$f 6Sx Br(wgNX߷rFX-;% O\jYx Qɖx-CZ 1 DWnTeйIl֭d/͛^'o ¬x?̭efwh0`7_Wf9)~mWr܋TeLj0!'^bU=Dj:j ]ZMq_ޯgq?I>9/rj)!^ `ʐIEG9طR>Sy6c]=yG"5`&~9bG4+_Q>NtѓN,Qoca=3k%)ڶ } t1G FBP^08J|0Ns}Pn tbwaqaWx 7N7)b 4 dFH0ghMEhGJOҚx dF_U͏E;ӇƜ;^d{^~niCc<ŀJz _(;@sPk@(` >K,L<bv_s)T,MY gڱѩvW`b7t;؛PrC^spb(>Y[kbhT.N7xy9TSUy9]wFۍ{߬z4sEa˯BuI ؋\2y%y`%``C0DZo#@4$):3HCz ۬8V! {5w>_m]GOE7D-&_z$܍'IBݢYoy߂ c >Mp1Bdžj_oE#oh|]2n՗xEEMLxO D?!+>O, DBiPzw~*63Tmqi5Y+x@=7姍l?M{c}|㱦LÈge&VgY1`޶RJ,E`\_,B%{ 8M~NO'^bv꓌8ON2Qn/TVð ܐmRx)-n(zjVQwr ^W L̆Da:4&@hgΙ-=÷&Q,pNG Jlj0! 7q;H>(o˰/l('-!@dthKßcH ζ;"1 Р1ޔU{o@AAWEj0e DJs$ *%f2 J2!_YE5ԐTKtP7.4N`-J|GqiD=0 2cPSfW9s6̵"մK{ꜣmoȑ47(zLIyt5 0Un{1 F_lS%KF;8!܂,9{({,-TEj0X36uI,_&,[52 TF4^n@6y>JPble9ZUB7 uRsh!I 㚋/؝2r2%)Uy8%z&^a47I1`ANoZlv%TA{H-Nh ׀&ν74: e6Pl ~3:iO7y[fV|3!W fvۯP: Ɓ=AlDݪ`G:ZJw HII`XK%x%>_C(|{kd8RkJB [d ւHD[s׽gxvo_{w~f=?FլG1Jmu{9E*ʬ$ ;U7BƧ3}1P)/.;a[MQTK & v4Mx%PWL( zrAO`Q¯?珫Y.P0@U ";SU{“;IKT=thĬerzuA/kr"RvD#(Z๥gp4?esp0_$*g+4 23]|T: "]*w(( !^QOϦ\y3+3)o F0SÅ]O ޕ: $U =+!fv (~l!U;o˃"JWFx\}Bp"AQp0nH\kxCTT`do_н]hea% #xNE92.9!,B%蟶]<`. Q]*n|nf`G_ s1@YH-Is?m2}2' >J%o,D. %~*Qybv1k@%e ܤ,۶X^Q ).o`:F:Kl`%EGJϲs~S-MW\Eq8xe:x9g-E&ݠ r±ͥW0E>찻wciZP'SH'(49ȣsg),ڢeTѺPz1Z_X2;zԁa>@Z>A L0&jm_u\De& ηV4(7~:ᓅ2! ѣ0Do[ӻܣ_o{4` nb$| \2w߬[Ҩp,6uj iYqz~YOl]W)%=3GB{IX6=IqM V)|!/xKnC׶EELq; 2?O V_lʷ;Z7g!v_5lL㶻.Z?Y )APQlj(BWJd`寐,*:.'m jT*ŞhTpucP%V%S3; ƻʋ hN&B3ٮZ Zc5|*coH*i$Yb|D9~T@.Or'1\Y 5wmdpA''p<˯oϣw= qX!]^/s6sq-cNP=ʙ(&`lY+FB]' f# 5ax.qwyh H9x .b<47;A $<hSF+˶RུX2;.c4ιO|l/ #nn@8^ $ hۉ]`,&q CȽ5Ǹ&M|t3Z9XW^+fᗺ ⻠ Ɍ1;o%{ˋ,N$br(fB[Uc1vK`} |2vSloe$1.S3ΔW4,~BkT[Сh[f$]Ub4ʛ]>Y:l'I(%o/MWjcx2=Â6cFp6d].;@rL 1d!$Vu)$ׇHldq B۵jE2 bFb6^2UKw|0VlJveV{^p?t,ͮ($ld Yj,rHz@Ie4ei?fmtc gF!+IDc E8TD^H$^Ġ~0ɗo0F˻-k܋x$/G=~XP?>"q]iPdN& =t8&#aK.9EskSGwwbgR$&)WHZgO'fɣw߄/j4TfCNH>:iW[Ib=Y*ԅsIbB$R$'%ʝ$,N 4Kmi~C-0+d(/4-ɂBhsC̫:І6Қ/P4P(W0q1-#0,?U-}W7>M#m Ps~ K(VA!S`tE'XB^lEYWknzۉ4Okϻ|Y^S ?mFExA^w5$V 1I;Biawf]P?{̓ $x# %F!p/=QWirbE @P*Z6x]лic?Z Y&m3Od99Lc ɛ ,)5lKV*&gzQt+M4M*?/ kwo+,Պv*.Jm Xn%3#HfȷGLAwT 1\$_$W9,I~p;hFs)ʑ0歎7>n㠾 OmS*=_%bfc rz8d}sI59 nm"M@"ร,Cf!t2>Yt(OAG-B8uf`R`x"ֈ({dt~ m;(wG8Lb@~C>MT`~֑;\P}kYx-R:xŐ>xiqj_x-+K®eMgT/W;Jr-93X+m@M ;T $AOo-^҉8e3orxTL.Qߍh70dy 6RY c6/L*ʜCm<+'j<؍gtnةFf3!C+G^pTgpʊa?p+tFz`cq+\QC|tq ++bu9aX^$FƯtc vLfT_I!^"7<cb} u`}(±#':ZE_ԭ; <#LmQN:>[a6 [~qM;ތ$\\zM= BA {w 扼ZYϽnv^>+;H]w=}B;͙:v9r6 sBX=PӮgz)JmU~o~C@`o[0, Q8G~jW,o@PͳX-8͉9`2aDo4G, en(1fgۢ,T78.aEMX\"MfOE)ViaNXHыry 3j<醮 B8# ۷`am@R9Rge*[g.5aN4`XOg/BJ zkڹIovBBUfoYbz`-9``X*_VJ7V ̭nP˪~(pfh|SD^e$IhiP8Ѻ  RBB@hP8JjdJNy%%`ʯOH(jx- k!S~0~u{ հ/50}bF[VE3 @(\=]c_g)gĻSӃa$pϲԥw,PRp*C-ؙ,z)~.ݤX!JiR J͸wɸC_Vti0iiG񛆗j$1D,X'0U4}rgr19ELJkJ^9<q^U c| VOpkHs =aAn6IvRwD8a1g~$1yǹ8'lreKׯx%2^}\dplZ4yy_'olbQ"ܠ 񼱇m+ddKL!4ݍ\Bo/’KVo)<+()[i,-ҍS&-06/ m=2VW7rّCJ>|M Yqm5fe^MQ5[g*)cxÉ$R-NR2Dǻ Œ1$jT#^cok[ W15 GD[z$w {{e'udkWKWC~PA#8Rh>ȫ[d"I_CS pOT"M2l%1B"{Rߒ2#a&N8o,sfz%}^dux͐<͟G.!:F:$龺vH]$|J3/$鳍4]_8wP|[;<LP(<(T*,i'#0&%ֳ:_ʾEXW"deNWFXؐ']1ɣ^+ bQ5_Zcщ<7R!9]BDGfDy15Ig=|_ p(ێ%*,9[eզr}<b $ (u X6$K_2he6a;.w* ҅޺* jف[ucI}nLJ>HQɨ)f7_FG!_"D <~p<wř05L.j+ e1̕RLZdW#40'Uu=eH=9C(kͧ~a'P<&ϒJ L%M2 ̝\|`@#?\C|0fU1u.\g),XbΒ-3PS{HqmZu67HwY6{ ):Ѹ-qco^j~HRJݵz΁HM79tK`kduJ)Ɵ0 d/st5uox.m6Vœk5,,/hXpXiXBԞ(CK =JlsMnK\ }LIHK2A|muWn>pkzE.{%~Yп+@;#K2'BIJELC. <wxʯ%:f|(0 }rD&z)2囖K{Fdaj:E/6i'Uh'D%g8coC'fHOd衃lPAvUFb,}rx@H0eVϲ@-(CvsyIU#um&vA6+=&5+lb14waݿffu)0>wJܕxNSFiOIW h3J4yO!߷FNo_YE-Dh>kq#eӳ 2<=d3] /rEݹ7U2j] [HFJN;MC;|~8,E9/ 嗿 yK6ͬ"qt0DlNto xi,}AvjM?[ ߖtah NE9雧"o8R f (V]biu G0SvqƑLcP+:u>t&iDlӗ 4آ,b|,|?} 19rh I~4DìtB硨_/x#Ffkϩi]~P"GE#G({•y-x6 8ĕ8hf ,C?E3Y.8gPJBPmqb"*)ܯlm=sXϷ -a>-6Gb|+}jgk:>$x虎5Nm >]#͇]5IwTNIUW'+9=VUɮoFk*)5ch">l C<}@:.=tEk\_^hEHm/ҙPI4.e-Yש>kvZǭYa4 9()bR._"""voZgxw ̆>=)9?+xDm$f G O'yQag̙E'SnJkj K@p bq4Յ C2fEg \2@o^yI"k]^jrOq&[MF}px3&^ka=|=xd9_n#%⯌W4[Oi]۹ c7,8JQ)zހ`_h_n`#_nsǴݸx[ tK٭ۊP;e"-+7i 5 ^nAp]: /m*p,ǦdF2"G]xَ{b!ǔ.ӈ! :OҾA7j"ol,HH?]`e$ʏ7 T|pa\W>ڤw#wf?\&yν_ޑX8 ][;t!nFE9z!޷c^&kpARy4ҵx1x/$^<߃픫O#1I#*ߴD)9s7ONHGj 8m^0bz|w^?@83%'nTR.Z_㊀\J%$:ϠC"+-sז= H+~@GQ%ηjmb[HRA.P֌d ]'946`rǍom~!ճ_tfxFUtsil\ T@N7ek̆G*8`*z}d50Uۿ>˅wg4 X>~@_Cаف9;.F)txMͼBїj:ھA@u~g{fEzOmο-׌25IB.&%}ԋ!>nCH@!ʓsnE XX#Bt4zM QhtcԌ[[pKyg/8V5U4`ׇ#F(N6*4Ws/Whve>Id@߉iCv M$Jd(vOAgf! KnwA6; _f}hV zboLZɅ<헖0p-TC(H"yNhT{PX8yr Mi BL2fNgG]كgRഩԢ =IClp{fIܭ߁>Efr\ 9@tO]L `KS*l);pDZSD,8zPg :(&D[Rz,=>|o^ޑR+6[\pܥЦ)W Ꞓ#"_ [^hћuv4 ]s3үsR9@O~Ih8"}'wPd,+o".LhV2tXsA[Jh<a+/Iڇ-h+BHP.\?~?/d9y4n3A :yJ$߼~mKs9-Ϻ={z4 ]6}ʘiߍYKs>"gn[cn 4@\[spV: sc~i?q3),3ZeAzxP*Uk.߾rۚn43cz:tʕ2cTAl.*4`JakL|DH3ʓsv#Z-o*?/\-|u moa&?3 zLmTn(!IDuj묿dDDRDvIlA U|CZ噘-g(l(::iw* t7B&dFc 4s"q}ۏ"=ƅy`eǷC nɏV*M"sS4Zy _,Z(YWn!-%r}Vd<>-{~CW Qm% afM7TXr.zkeK&ncMn4sQ$Q7}Q" ]'wwf&hXG/r+PlFIȕITܧ$ +"){>;L;S;^i"~+aPY-o 7#O{6Wu R`` >H0 1q4U9R'8A ?e[>;-:MFܠY3rT؈4A.[$JK #]8o#dcp$2eXwHWjͅMl%T- &4 ;qS+2lRIrU`,( h&Ҫ_.݀V{<ڊB}mbqn 6?w:t-Fڌ *$#ir#f%\8@i|9bDVɐ cPVJ¢\UVUyx{vp2Oc:0w~71:Vt)W4tOVPg6By?Ӂ3C2 ,}#:bu_.8 ݃-O%PNⱩg;ގbjW=YZ!Pp[.)^׿iD7~dīTx#'P> O <+:cp \\n5J%%KS;߿IZz!p(3CTwG-|/r!C$K!g̈qQ!BW闀KQ,Hzu7h#L׋C-~2%nA\Z R`@v,}by+&`[-xyiH@Xo,`#{%KA#1Ҕ[ľq ieY@`}kt^BӅ~e݃i}\b2SlD 2Sgc (uCv6(pͽo BlZ^NK՝9玈YWۻkϷ.i$ ̄pf4 ``w >S㛦~) <4ㄅ3fLtt|u3@JFԎC/^!2:qH:Fۍ/d wQ*o:OjRV:b[dt~Dm(/)5Um>ܡ[v>68׉A%=ԑl.IPl ͈$yXfegBipiO7TGgy>USάWRl\Go5om5X d%ӥj0f\~I6)~_p3 rENceiX q1}וfҀg̟zj_¼1مOra5mcI={Cg52MظrZA+9 w_OJWJS>wx6FWy yWc>ݙGAKnSfSU+Zwqq.OhRAU[< z/%@*%K8ֲQ%Yj8AV[e d @Ef[#I4fGkC }8 2:`JAV)TV@MldWA@g^o. D֦|}с ϳK޿}^IczBz"D>hxʂR>m~{?XuTU W{@2tʬVN +\q`rG"Ed(,%pM*ԇ@!?CB"KCMVK7TSK^r> Gyh;+XSw2J]ie)VJ~Rai/th8Xy#eTaCP>B\h iE yt T|Ȗ=|.um_/v9 8D ` 鯌rh΍HEBΰiP -y67V=%u%.)9 s[.d-z- YJόz}:Nd"}ޕr0әG0ړ'ZɧYZRʼn>=Qs:"?R)ux%K  !@!j3 u$Do0uǮz3\TcyMXN(m^j.R)(K /(?{^Hdb=:eIp ~|ST ezVu{L]| 1w~WKOP8oӮc8 6DA 6Hv ŊZ^>`Nkᤍ7Pޡf&̔0bW̎ )h(&kۜ{;d0B>n}uVY_C iwȊ9 %;:zjMf?<NrЂ& ?$眏.w7~cyjdk&|(ò@7^LRgtDuS̶b?Ҋy^kp$D`=3]Gur*O4L4fk Wa!C([xe${:Qa@}|Fnx/C P7LѺ࠭7]^ .$ս M|5 4 O֪Y(VRU"cm2SVH_ ̌O+K|9r 7t7h?I8G$i]DKNNM>#*1n2 BtTl7zǤ"~~o h4Zgww6Y_a'TJ ȳGgxhC:Z|g].&n<3'Aon]kp9LX.w4Y_24)h,Cp7e#&Ny)l@G\TJ|%zNߞ~%JffHvi3K70LL|![}fȕ>8m+ 'GTE#"f*wǬÁ籒D3uc"ONݬ][An4( {fTlOl+lo_4AC`CliH-,qФwb:,`O#~_ari$/|äb?PyEAMYa9]UoNknJU3uPIAܰ2,p'4/ O :*Nc(ۂ͹"|>&Z9vk-1ۻdqKWpi^Q#.dEkxlϚ|*i1j&WmR;܂f# .;ОQ)Q`~?ne $h9hw57Rr0 C>9MՇZhNPs.ŵ{2{W \Jt5aaS`֋oa׃-Dp 69.79=ho,p*T2DR@'m>9EY۶IÊ !5nvlu}w @TSixaр[>b?Ž, MѸZ.y8 :r;"Kbł+ l}GW40w*+zz("a(k߃zTᠥ\}7)Lc~sWW}m\˦N "JC&Će(k6k7/O1tv?˅9W~hx5 B!L;x'e5ˑ%ig]1SE,,l9 1 Na+yS*k W) K3+LsՖ+`RZXUJT:3'N+߹88t+!ЧDGb$sgahx\Wh)%Ҿ6!P'DJ:Nj)-z̴5j4Tk:lnIRUeF#1ӏL8ǕnŨ{)".nٗҭ-jAR~4CQ(0]-Qr mTn޶恆/vnC-E:JÇA .rx[(l*3Ͻ:ς*ԽX:&$i9_lyb _ 30Z.hT=ndz+F0U>}t0t"Z JeIȹMRX`;ripdCӁy!RHn$3sNF[b' >)q^C>ݪD-ړ鶌7Ab+,SgݘOO4|mqdKD, >X6(h'e[\u;|Gڞt#Sʕm$zܾ m+kw~T7Ӕ!,oAhp6ٙmQcBOu<z<e;TiI5"?}:`c4$.E0hb=r,@dNO bikMJv(CD$/Nasyg>yx\7Hġ=@G[ShUzE|)0 Ӎ;#&86FZkK'ڹ*b3j c_vl?|jig0Y*W99xhp|9;>sM{LZ\h3GF" }c)=Mcm5'lOqN'ot*Vk`Gm )3p\y4Bhz|V~ISYlz#'S୵|21łu f_5`_a;6Ȗ$^p$$(&|Syѹoi8S귝9lc['AHnuB1 yP@JH~ 8 y"_xveh pݪWDn8h}i9PaL[万 <榠Pe /k[[Y.J1.20faU4ˇFwdjtfLDU?4Ÿ΄p BP՟W9$(V/U+|%8$m;dRݸi{c9˲oº(=<=סzm>),`*>:uٷAeLkGW:kZYWUI>|1 JIT;t PI*Kgty<3QUEyˍg_׭b'R:ɾvGS0w5K+ɼ -sݭbz 2: Z"$s⼻,X\ygxh҆[p֊\snr֚`DUex 8dL.EPo.@3R3zL`8Vnq V@zi&SM=f 11ݣR=x,!N{KNk2ܦ2S&/Z̺,$[I\vh _@,C9'Rqп.豒Abjʵv,DBo ߤIO/.!4ny|Q  =8saFa7JG$YKە fFjV!\[.1&Dvs3U#X .2wO[ɯD#>p Zvh Fs֭&<2q4+}.(W-񰗨Ȯv 100$8czR$ QNTp5V -FI8OKӸ>Kc&oLPW/u`X: \]T7aϫ"gi&:Unzc$ͥn8^Sgy;:cH4&,CGt|t|yWB 2C= (^,sSE x_ֆGcčV-F>{-/+9\Ѱ;/X3ZMֺQ4z$F|GGcˆ<<a=ϴfl4B>*xa˾Z>bWלT˦0ę1d03" YJmULXb)uءVif:<=;㺳5)SM4Q xrsJtF<m|ChY}q戜{H: 몱wd^7_fN Sٯtb+}ܧl.'F0 i~#kX؏=Wn}G2D;ʽ;9>)IracB>82GCG7>rFo9ahM*DyHSÅ`#VI Ia j\W?M'$X *s <x7h>?fnBaDMEH=J;A "U# p2}UHKr$7 0yrոJ% qe©39ۭuʗ߻V`,"ig\Ux|0ֱN8=5wa͚BT3`?h!L:oC?HZT'Y_eƭۗњ*ȷcWԑf=;`u Da`r暗!/h67Z~9))u[S<_<~S}i\'@!LZ7gܣM!): So̱f घa0B gP:B_kmXM<-"΁s ֙EH=BleyZO'Q 1bةکBi E%lP,g,}"ڲ ]"''Lxعw{XQA ᫁\ߏ`i-&)1ȓ6N3+@SgqG#;s,КB-|`9]UvxZװ !q&5WUAVt +RC+@q,xBjA*:5.'[b'#24gj;E(V]Y-/=w?0ٻbd4[M\"!/}{cpP\i*K̡PSrBF, ''prA0?r:ݧMq}R@_ EDZIY=mgCQHduwl)3 7 HE {F1P~4ȏ/풤dZm[\QZF,ق17p}UMgW/H1+&TNV2]=lW4 Z޹6G[1铇Z/E$KaX̾j>W8Wu%l&l.{/p-cFp(^ (t;"zEv|);3΄~]T&\#”>Ye$"Q[=e?P{i>`_X4(yV-&'/^~y&lr44v5 aToq ¹lv&m@E!1ip+7;Fvh!cҦlZ?$.[Ld}Y2u癑ᯫNsW CAtWHlc9b2<.r]ILUXv|\RǞonE8a\_SM,a4Xlє+k2SکFkDؖJ#zhasqT6 CCB?_MT>)<Wts*$$H*)m.^𷰘CK|{"2Peh藁 :(_B>_4OLu !;(~l`BT$) :]ؕDR1?Ȑu(t?}A~Y0bGmqR„*S-ѱ/{/YՒ C_bR :N6;`K] N|f䴫 b0KUx +vW38S@m%ڬ:^߿CqJ/=DcF!=פ | 75 _9N%=i[FcUcQ#Pmj[Tg$+$4Չ?~Mg?t{%vat+#O9krkbF,u[sV)/ P~PTӕ' $|PwEJj:R>}7]vχ۲. m[|h!Zz;;ðEN}lQ3㮝SN7( F>>S-7|]PBM,񪖪6{EVj8R ?崤MR+LT [j_ LIKXuIK:Ip#X*e(/߄ErUJs#TmUΒ㾲 R49:;~+νi划Ey d\X )FSxjKB0 1CI <{f''Hehug_/*_;Cx>OH87)(mrZyŅ9qI( tkW͓A+id6YP~>&Ԧe=/17(s̖ImJUM%$=[n1nq]CH )؞c.k6r M'8s nYӘ5ijQ`9[sO.m\%@K==<8>%Cn PJ/StOM/D#veF^/?gHօ3=7Z@ÝG,FsiYw%h9N:J BMq=3gc*'iR5 z$ ^"|VWWۣ1+p&Zq,l (Jxs_sqE(͉>i| &8c-x6pUIg@8H"oeHt/YA1!r2P3;"f% tS)P5aqͶVڈ?[!5\Tr$q6'Y_ Q3[1MN"H0IMm܀IU/7K~`[V m۴ 0^z^:YO; QƵlwZrFZ$S3僘I>s}i;Xz(jP?r@ m|mpzDKNo#I^eT?Ny@aF$m6U6 o/dI`5(qiPv v~o*Hߐw6ğ rȍL!OdW' @Eoebb@[ DoqCUE 8aV MtϜ XhTiv-fVKwUO6&l,ڪAm$zI< , /ALYDҼXo/@H5{닄^pr&P)NS;x0)‘$r/Q/D鼳KuhhN/kOA>W0KOrAѰwH@ qV1tgF;!NG}U|c\.n dm{\@^'/kz `ךWI LaY~gbFk<[DcOEChb'P䦋pW DLt) %)&#B&`Kk^8j ^g3c(?$cHl*4llIbcM' ߬X EcQ\$>իhh`ho!U9?}iXvE؏%i3;܌:e\~)ژ̈́X׼qwUOi <; O?GJ{}PŸ́qaqvDDU<נe׻I~*/>ےECN[ 󌄴6ʮ 75=|0[o'O9O]Ro{5Db*A q|pf1c0 vD'ޘ_~x_a-ư2s. j9ʱM/ͫ6m; u%10B[nu)Ϝ7OOj[ޘPTM.-Z//wv'e@+A)@FuzBqpA!) G&S*AK=YSУڑᷕmEnN^]yKPvz 8H~=A`D*3yurwuy~ OaݨfMpBl&~3[[]RI<}%~4bOBivK5De&!IbNVﱩt8*\nh=NlmPŻkOYcU&u R`Vɯmx8rψ!]h+$+geHTǟP#?#W9uFcNCoR=}>jo7UTvyR>㥕NK:O!pC8dS63*VoZNU;6ʨJozT"xWw ^HNP4&#Јt8<'[`ВC#.NX4>+8pgfo[ɑ’k ->H`ٕV4= [)~@V); ]!j`aLaEY9Ŀ. Ҋ9E];0XHPD-v/Y_sFuH̬#Q Ll.ܳܔ[khMujcz_Q-\:&1#N\<I#OtQc}v ( JդYe oy736‹|/|f lau%v$h;_U]w@N.n SV[mgX[`RTU)iBc—e5f;; &Spϭ+i5 W b᱿Q_*lu`җgwnSh0Of[b.N;jHZ`'XrRB=d2`Q)iV}Ց"Ő;l\c~[ʭ^rDKum{~n <里җSfw=2.2Zϒ $ǻ 9PUTxbGv4 8;"d0+/@# 56aEBPM`TXWiFQ`8x#_Ob\GjڂM1QX)P-|9sM5"(ެ@eMM,zD$&$2%?$ uNE&tC߆)MKJ؛os?$u /=U}8bVvDAY|wpDd}N >hr%AU L2w`.Jtv~UVcQ(f2 Kc}+!թvX5PP8 t Jem1 ^(ichh$7p 1thvn,Y#z:zPaNu=7߮I p;A(!`3ƌ5:dMeongfޡ' =zWi嬭J K޲ǎ蜂fa)WvR$M'ΞFT#wx[s6 䦽-] ݗJD3}:v+;ԂtrW"*[4>`$C*@ばU|3jѮMrhH1T.O[(4`"7tJ^ᳯ7pWѐa;piX[\ɋ c8biQ_o/ a|a-Q LzJa8:k/1V;Hl\/.7hL(w _x O}ZgC3࿳`6O[m"`fܰІN$,[E~mta7p oĴFmn;WKB;n~ڧʕ'fswI9*Z2~20wdXH {y!028$05G{R}^G zq/^A7<ܸHvq QGNM59b%@q2 5uO K:T}kJ V|CP5 e'OdWAQ:)K"Xh%HRhCpapeAGS$@JBQ.2d.8lKf"#IBgv||Jf]XzOΆV2j@w\Gg@bl/KH[Υ'FIf`ck ~+;O4?r$8ˣ1: .jd6Q~-fUqTR-8i.Z}^(9'ٻyUYWMz#^jbC^tg\Z~Lu8QshtAbg9{Noj@0(Bh,.)R0-wfzҹ; EIAzz5fw!}i-5(ВKoPxԜgYF6Z#d)!ͥ$^6$@Bcx#]~ma1#r8ԝ\_+FmRms^F]vV,c$rnG4r{Vb*5?w+ߺäQ/$PUʋ Gkz`ٲTor|q7#my)r] ߋ|j4وFb85 e]-T0jjY>]#̎yy @=s G)&uk;*F\a4O>gN31\ +@툢 O7k`im= r"L}j.7-Twf[7l_~l0P ]t\'18S#ؾV.O1lѝ4Ջ鹙cYFn}HNHo7 ޞciT:4Q05| - -n Kj K6V-Nȗ *{`<^:q|#^FbN3\jQgRA3}%_x@#>!4kr8`mʱkYZx*6y'D7G AkEHZAzrCYʦI[!BF0$ $?K1V_"m) rxk KT9hm#Eyob^,Zصs[<9q: 5O穱7G)+lTzƵڈd $D1*;$ RӢ&$I҇B8+. A#ZTjof6?@!3XI`OAԱH QߌtQ)b'tGN&&]{4MGSc|AɼPЗO `0LFW#Q"⫱ASHoSK ˂U?O_)Hv'Iu#Io&r2,⩘#GkKh(>gC\BKYWjP$@љnO&P]|-[\ `e>:֓@ ?f9pĈP5u G4oK7MO l/⪺U8sWiId[ cf,$gl%CF,Dp諥uSK2_J(]Q "nlNc8 ͟P$iol̮δHDnƵ ;=!!NO^Lszw܏ 췫ye(MӯmCSc,6 V)Uc" Xyc1أT-MSZ+BK켈V>CW"Cc(5;ҼZd֗3&׈q>[ތJ~h.`ѥ̶m0'e 7)4Ib1va_{q@ei"y6RZE;ʉĿ4U<5"L-EI$9m13~u#Uj>G Tajdt:5jm0DkfArm@H<`bpgʴrʽ#)˅,$ݟ. #c8:<2eM3/#cvҲ3m^ ÅG־$\2])25i)9%pj&Y- dO^V )̷F.&rbxEn\1}Vwtg",}zeӸ\2!U4j9WȂOJq8?dWJ:IbsuGHd| #AQ j1m&j~xW~Lȷ">H,8IJwͽ rn^O {}gT?~ٚv'O+B%2R)'MhmV-B>~M;:u'DaF=['wY5w2/?(O˳F)9u@Por ]S|}I>Xs(,sHU9w{4BZeMYE5^n0\OܰV>\ Sf0T#P+Nl8j;֭@!4vޚa'gVe1Nh@ I"4F!Y Xc}o娬SJKg6Ct]?sy?@uh⪈dML~@+1YR~3Rk*bp.Pfpr'% .C"Dan/]ev( eJN^dxsCG{łdw64 nFJ&6Ak i9!¡ɜd^\9XRӷCpޑ&u 5x7[J&Ȁi:<ߎnjEϔm*Hg}jf`Л57[-h:a G aYC`'_FjS\ {Y31EɡuۦTz҄q˗hU/Te :K$3 ;Y @z|8I{{RU$iwmWС}ܓ-Z7!TWu=7Wˌ8+l4zb{ve+]± <ӂbh' E"oMkHeijο%hç^МW1g:3+yAvC.(qQ="vA*{ps;u:}  (@G ڻ&גAJ$s¥g/aAlҐojh ǝ$xQ_!xk7qxS3|lUIKR *79;b5`'c5 n+HهAFIoF1a`^O.uN {7P|wL,޶@dl(< -5Ěbf e&Ov4~Ӟff7z+ec#XD53MifJ7L@L+ˤEčӖ+~6*l2huT ,yY,|[{@gKqi^*'"@ģ7㍌rX7 Ed{'l9ak*F>AFAR!h(.Xr}!URs`w :J1!@53Xjl'3Ѱ44P4w,e5fc㖻w8ABzN^4a$g{g?$QD=ũJj1$g08/#W9_Oh,.IJ Q}nW!?n)ƛ0e8?mSXFցB c+ sJsZ:8g ;e l5f9&0v:̾,nw1]RUoU>fF^ b=D[1Y}B4TOly¥fl-+TxֳȞ'gC] ugЩ)X t5=d'WD7脏K* S`[ٮVdẊ~y&#t(XMυުHMzc7J"ze"S YcO D#>~FOm SUEAz FxSz> F*<x:p dz4}}1S}T0[ LwHv#@7uZTE} غQ"I9I̡s5ƻEi m*^Xzyf>n*',p{a;73A9С*';)X(Q 8y$󉫷žo8M֍;\FbUAJ <~{jVhBM6x~.X4|CT(L&La3h`D:|Φy^b`Ms-X Tz-Le;gftu֨s>2ץzn??n!>0$ẸW͠tYYkXhs-SM,{AO ?U-C䤠])j5!-dE[TJSەI:5˼hR@GPk3.ၢJQ{gn2b՛͜vb>lpx̔bZhxBvs~jl c`&f(|{b MpU5 bҿH"u6򦟣NVI:3,b,ku~2TrP'|hq wȐXb>OHϦVsQ߶ X05=RFޠs_[#&ZLQ|R.ʑ/o<>J'U1cdkZ|ī ř#h9yYǥ1Ŏxg[3 !>{`n쪢M1ʨV-8;*vxͩt("HkD)铹:ZSQER4JY_sz5bE1WASQ)*?E1Scؾ3 4Ǚ)_8wz[2$Y2g F\B"Oq]s Tc͔'Awq[5MEV8 2~9h4yH:]w9@N,Lj #]; R} qOp̖%s^TLqj-n̺Uf7"L;LSqx n) aUw.'I@[Hi 58*^qh!#:rӆKuqN=tbv`,=M ͝t*v>$[>;7sk6L6 :?i?</p;ެ:oA益(vBlA$ަDl2=s>z{#(ƂWM_z y۝xUd~dՔA^GO*]6d'*7@M]P#_4sUqw :b<Mͷ$h\#Og]%j [<.Iͦw+Of׫YΖ.v8C, ;}1[NOYw+v[_:3Ĩ8dwį8N?0wL ق ~a3ixPX>u KԯᦇH':fCLHJL\kv:N5fJr'K/[Q< ěSZh8~eK9 8|-)V6W6*N)@[ _~J!96 & eJAՌz%B,9A N .[ + S?>de?lFʼn"5B2. YSqcSJxWMfhuj2zj,w҉ӱV;&y&lG~oR`LLkd!Z ӥw8/qY;W@B;=(Gس1Io^? îl:sX7s~8f3_V/-Xܖ!JDμVۇΚOԿ0:e "SA &Y$څ2٣12ӝfKR32L7 s_!pBLS IF9ܺ7#էY19ZD;IRU9&HIʻo Ut)֜$`LxkH,f\| Eq5OLe֩7v5d;;z9,/w9GHZi*'??fI{;`~YYO,} .G0WA] 72Kt{њ<"@4spѸNQ, )&kmrd` 1L]c*2 6AX.ghC2y@%p)>)b„Cgv D`Z#*,}MAҌP'R\qAmc?>8LjmEGZ9?J54ʃFWݚ,G` t6h X>N!Md~i,ݑBkj0<&lf=* oN$s\V b^^ Aa4\>j"p^ C: ꤤR FRJ8d67ig1)[L zVdEFboPwۃ<}(No"u, NA)wpk7 eQd2:YiWڋGB HH a̛,'k K}?rlEsOA^ EoPܪtoqbuB_%(83/@ruK3$6򹗘xpD\PS֓ݤTZ'J_i{N`WȫVr T߁Qb,4qܥ+5x]سvdv]Lv/,}xwi)Dv+Q837|q#;U-$!츝#Ǿ qXl~\ILlH :Y+3: RuڌAdGb"V*؝n3G"*mÆbQ4絸V;" ȟƑjjqrϬ݇+fHT"dN~8a8 Ʌ2Ay'>001.Wٔyu7v0.߽s!ntk1>z7{؈20oxQMoIv$69 "=:U+[h{/W >"6xXSi|T;PzyV=PA>m~~H=ӫ`JS?Z췊TVG}-Ѥm:$(3/S<8rW 2ǤVt=q^rVَlJȚwr.@k$%ͰёTDK(xe,%ZL;#c,6u6HO4N,*U~5̅/D+(?,6 %<xcU|lȕͥo-Jҽ! =xn.R"%yjStJ>3 -0Nfd8uJ>X4z Yn8`6jX6ܬ咤)j xATI2&p镥;Zk; u2,JJwӷ̭^y^?bøhߟnub[DIX,2pRJ1e[2]x7"<>;(Zk|u2ewvB<ǸɍבOv6>0q I-U9!@ɷ KBz؈2J[2<Ӎ;w6^jTRf]zx3Pj" acMTbi 0Ԭ`iguƋ&S:V M?B消myf{/f]K],ml9 ݐR_Ѝ5zFK_*:b˹]8`"ա3,dK@HEjsш5k^am4ܿ!QtV(COWeQSvW2amX}j3V{~|gji^ja.9L% 5Ci0vQ¤5JeƝ۸.oNsoYz$sؼBdSO15~>@p?F7V6Z<լ9wQ!]ݠVs@m?Z 9S!LK|7o3a=﹪ҔvgcHIK"{R܇X20O<ط>RTR""-F,iИ6 vSZn9̳UJ=wp,~,(*&WVy|-L&?(gsċB&4[~37CsL@ڽOÝ0yuU)!W48nW1 Q@nlyQbmM0nId5n~Pϰoו@ g`7tB}.O"}̃~Q _T0z3Fp Qѿ17Q9%:,}cg,-zp"ddw%1Bp%B|m ?ھ[±w4fLwlEx)=zaRz-F@*pqY%Sb_2{r V<|x~sAH+;0߃9ضH4~wIkY?r/bs̜"2ȽsNjE9}ГQ*/}"яZWv Y@$)(^Hid,P=7Գ(u ׬ -ZaՒ=tL4/*j:ŤVg]Y  8"6."k}rS[Eg*@s9 LU_xz;l!`@烱lؙ̻çݼoI*"6pRG Ԑ;AԜ8UZ]S|T<&jVܲo*[7ΐ^rWi)uk(eVsKzHk`i!Ϗ&OSWNI W/欚.*PnBW$6zkǑndTHL^)f461[xlq]ӭ.jYjBҟi}˽R6yUmɊV0*] 51)gѤwœBz*`}{RaX;K[ZMP \EDJh'hZn5Ωk`2O4ȅ_yhL{J`L/eEeg9m\5ֱćTʧ0KK!>nEս;wmj60x5֌AӨ*Lqcrg?0?cK+h?8!L\oRF)& `qA{>SDQ2ۨnW)^vڙTjH{p.sw8>`cN<Ě Is,cv2 Ӳ uwéa1|LTf1 _(kR͙ĺd.1ίE7)dF7F͵8]>'\ ^U4жN0b(hR6n7e5S9R5?Sѷ2.=X| ؤ\J< :m4Bh>ޫSyJs+5UQOfOK 3\Psz>z4DU]Ξ@ip Ҫ$!5OTsf.F%D>u1O)eܪ٠6ɞ.>*dnξjڣ,SxK*_;40x,G8paa齺^!N/BC3`o= _ug ,wM{xhzw\+Ul z–D9DoL4uzOlZO#jYЧ!%Үa܈Ͷ@i,',Y+m3\ldBu`ĪM `_ck?2'x%J.9&Y+#ȎE%a8 7/$a4"tf.6jo Ϻ.[dJëT6(Q;Zht Ժ,nM6W* BȒғ;f\y/ ,2*,c0vy踊6D8'd=y P?Ltz1H;X+/|l\̫ aEȾRL5@A|<&c?Wn'!Opq<?Ggt)j#&>bkU6޴"DZʐ􌂯%cN rS G98o*F(O nsH sD"SHEUB.z܈l-!3҄~b n" :!o"- ?%P1%io4ʇ[&┕x@$ugG7/RDࡺ֚Bma`p; ' zEN >n]ry{0[Lcb6oW&ͯ/Kw$i{bT!cM~_vޔǗ+a%BdW ͚84hsS6 cR(=ǎtƮ%"pyb&zt™q91]m  ܜ8`*b&%a) Y^y6yq]k5À긄QGH=6SS+$ Tma˲Fi508a'W_sY|#gw*+jƱ~& &ގv)"[m1_`*?Z)==Ow)>7HXp-T£jR3>t=j)ZYE|^Н]{PhXq$9d:YԠ0oARM06}j_bj%CYJ"QRD04@e33xSHJ乇Y.!7u^Jif0HׄmZOE 0<(sJpi@Oq-3݅|.@PU}:Kk_3Y⽳+@ahJkh1_񆝐8w7{5*& BJ|(pې%jaYK6dڇvueXʫAIO#Ω@ x>kCKKfw;lN~P0/dxbt-UCBnf=zŴrt(/R'4: l>]e``L0T iSW?5wg;F* kd-<60YW*퐚Pr׃s&^wn)PdžUgR\ 47&DPzV5S< hl[L]ٮj%=Z옷HUʩ=)6WqշΖYD윖t?=2J#h`Lj: E܁' !Nw O3~r#5Y9v-F[z=yGJIe՝lrSQ),s?&BOB%f8~I<㲷krd? $5`s*\^cf䷮,"(HΘRr>\ֳfsagvhJؠ4$S|QcL+жF:> N od43$hMMgj ~h> )i`!lyTr*BUSV Va{k r bE3T nP@)}hg번H?2TFa:0ok'tuͱyVŌlB!ӸRPS~H߈|۸M\rݔӘ'Dl,p}G95ɾj%Ol/솆Oĩ%:%"{r\b#j]r~~J2|([2ZY965@@iŬG$nZWj'hs{y$q߼A~$ȸR[Fpnnw[ЁW]>6+&84UW&!EUEHvdZթ lVznJWw*ـȵ/Eq_i۴UklV7pj{&w3Ĝځ0Upk- tZM̑# R:`aOnL  +^ gۄct>I),tԖZkѓgDV:&>'V} >OVx(-4ArřÅO@viɼ:bJsr5 `c's:Pia&#  Pc4P<2I|ݶU$O'p!R䀔Ҷ6kg8sGp=IyJنH O`W9ײA:Lg^őuѐ#L/w>"Cr Gק3vC6n o%ñu倂# r n׈k"$yb!y]X*~“Pda!VԖ᭺4{"ø0KI3xR~ 8gZIÚiCp"1& Zv˿6=Fßkm[H8Z"a *-KE$BeX_8#Uj:K61[$h&!mw(<$OFG`iXQu mm5D?s":N?y; Xh϶EΝj߯ j\ZG  +=G!QGw- wm$i"# l~9ي?1 eҤa!b]`^ :Z'7,焤`N"FJ*rS_I^]-ʊ;&#.xkCHJ~[V?Fȥ௲.Q!)r+* (W}**^N@֕[h&gC*=S6ܷ;q§fu֠AimƼY#= uSV̯5/vj:E{ĸps*dYC㒛n v+;ZhJ /xUZ*(ț7j;s,Em . {*T맳r&T+ݷ!2YN/:"ZxjT:3 寷d}>C~'m0<'y 'AƊ^g ϝZrS/7ga2˙Mvw#H?dXZR&؁[\´BOxDZbuzBDZ%l]:7@ᑡGPCʢxs b^rq)}wߢe's%(PZmǸğ@*`Zł>S̵p\pB:VO֣>[,5﷽0? 8lFʂ.V-"Rpv.`EMxx`}Gw#љB>Xmg ,wH.&V==3}IzWYu0";s]$*䆊g`ڱ ]鸬.a`n LBWYQNk *+UtBk}J㗽M@ r ^+F~75;k*UGll<ʥc&mi1[Og$*. MkK%Hv׼(햤 9*q8Gf򜈃 1gyXؽ\NU|G@(նo>8\fMw!RA؞)*rM4:eaUQKQ 4 h(ni^xqWMo}xuDIc*UJ@)\*˦9Jx׃\!C Eq [d`P>|E6uvlx,R(hx]:uudsY׫Cˬ+x ]3]vQ[JʥH/aųwy4|Է }gr^! ~}(=ėe_sՙ6!Z<9wOEd̕\JQ~N!(3H᳘:c(/OTI]HRKb"/Q;n,r>NbYKƭ{ռXa-+_#C:s&`HBtm-k۬߅mgxR𨦐(X[83;&B.X;ّHt媨Z\f eT+I;x06I zwIr#C0_4 {&JQA}o,)Ip@M\ $񂑬mwI 7rZ.x1ۑ}V-xYy'lP.2Ss"Jil>ţ=ѕrQ Q\+{樵?S^8)ِQ5Sjtϝ]hB7$C 5dۚƒ=dtWh\-*yIBMLtjĥ-,jL兤&h4yC(Eؽ@'i 5ҋ@]2'2w Ϻʘioa*WgBC2.eA5ޘ(Ki8 x߰/cc$,!e*7v㑛R4I3?>tHv]s}H4>JbA4ɬEVcZowȑLeT'bRnN1[ykTQH0?W:L'IPT̗jL&2<#ײ&Y2Ɣ+0ljNHKdz=(9D&JLw(gd˗,"ؚjx&~z蟿w duEר%GT _,g0gL%~,D&E-^ T܀NFvQ9},fl5s7g.'C@85 6JtcQ|0r *ҭ(*2dLfpO?ƻw~wVa(e~'waj(Ci4ׅݓ 7K"=H@Pjy.pqP7/DA\`MG`rjgY"}=F8ļf$Yv(>bbKOp<'؏QNbkK/?? ^yfIC4@ho #HqJ~:s<\økɏ-!3ڟlߵAÿAnLuAN_=(h^7bV1fRveSY. Kˠ%{gg$v3x&*s՗sJ%Odǎ5,: mMmVΒvp.ڂB+%vq&j)/HGz ۽J)J< lƪԉX^8qb0'PG ҵ-'6-P-lA YyWz*WWk'g2Dm0s\!Sg;ɵ5Za=a ʰvKsϡ[|Į% U6+ʒNacQɨ?|fZ8_ãVDw$dG1Y8t ܿ8[;C*>y'! &R_qv `O_ wX"˽)DFRmgk) dBrcy| s/YCƣ&bcfǧ[͎Z8r>8CЖ_\F~!ch|d3ǰ^QUe&%EQ *# gQg~S!xQ~ְm?/'O2VF9#F05>%$Z5B)Ba'/q bN܅Juzxd> 99V@#;7}q"MkEƁI.:T;&>= >ѓG@ 0wgF(~j\ƉʴU ~_|?SI)Oz`ǽT+\"׿ay1j kdnf}N4B~6ꕊ=l#+zY8;-ҷω#F_ű-(@( 7w.UeÓu iA %eu|B`Aw;qpk.ZaAsyN44!"yQ f (!"4Wf\!!1mV5+7YҠ Ws!$rk֘P!QuHgꄢn_23`4!_+іadέ tu(})t~d/929ewG%*'ЎO, *uah"DPCIoeo&zrc-@O{0ٷhUFVkC^J\*Sزf<|H~SZTfoq{ N< fA4)/+7u^[7X Q0Тn]ΚZeo$D]ޱ-keAEK#5A[6]by^ѫ j QlBpp;ibx+ 76cB 'WocFw5Kٻ(_\'C^qEXn6q!p_%տ>yIK ON+e V㒲 :#5td0Gv8W.YF#wPKF@+|XB 9# 3Rh31IIZ"rȞH\ݎ6d5׽ВAT6~O!+v\\D_w8@FH-G@^/qaq ^ o۰1HO{9WDLoBHڼ)wDs4%gM)eU Ϸsh`iیB7:!yʿVzHMPa=$V"5bDbB# m"7"LIf.ՂT٥!ކ[Boo:cZhE@ϩjm;@p, Ϧ;6eGlz-B?2#\~GYA<6qEg! &e]i#вs Nw)ڙT{ "m]e Of}#UŃkLomt&:,V=xG9|-E12 fYHq[X/mMUU""Ҭu[ N{Knj#^-jlm2D㸙WB)ZNokAMB뭦TC];?{b!mZ<:Y֖e,2k6t'N%ĂJ*_WDsp_{o82ck,HdH1HDq#.L5߇8,NCZM88y?lS "z!jw&E,2,Wfe"Jogˋ|~xYM>5Az]IJLOkdR_ЩK _vJ'0FIH$ކӈ!t-BC`rTmS^o|9p$ _YB搎Ͷ.3'a/|L9SSz :;M@?)ɠA!8Gy.;֔Ui5|; VϷ?MikuӆTvӷ%>Vm@4Dlvv>d@еkUlu$'/4܂G }j%`W4O[kJ-^?($P]'y{[6R47zGviue =1>fu1 3\-ɵ~g0-&6AuzMN%о,dsUF `K.X*xHFiVY:v6=}׀ӵcd]b-+ptJ;9ɀkne'sBVҞEa.Uv_>9F_&@%IRUqJdWM#vv9zn@4!RծJT`x;:m_>,7z|b.Yl"z}4SQ`Y`+&~=[}8zP(؀=E#x}"w/Ϳk3pD矻KuCpwD'7%=u}[m`nJM |jݵA-aVOC<,j .4_yڷ'^?ng7L@f… ~kfuJMפ4!fTՖ 'HL]KiE4OJtHS>)zHgMO!ӡ'1aD+Έ?x00oio-{$RקfA9Z/HP1:> '=)_VT.OӉM #B6?63:7pt1A,B xŋ[\! %׫, ~\ubL_<7@_抈97,g١ 򠖐#*kM(7>z< jg7K4&nq˵לi_ƛ~sҋB eY1)&sMk+r@ƨ@Lm] gDZ3CV&tRm G/7-tFio,{.$Y{v$N^Ћ\qNw"'M "[\1r!7UtBȁk$Sqí,XDsmO3'Wtp< ސoY/ǛgߘU'}z _e O l v{ &BsI{:N0t/,iӿ glO7#HA2S,HuB1W֕bEމl^+`C}i >/ID1;&VYoeĜev$H$[0ҁ o379q f;,{9HG[-IYK4i'ϳ9^z4_GqX;ⲴAA-j £Jk@Ku oF#wib0oUeH`R vs(H:d /K 3iƖzEW pyx~Kit%=Lt@h?t5_YPcr\)CdFVwM>"7`To)$ytǍWvRgP!/ɤ4hZ|@_s[kжw8Ꞛ =F/NG{"8X=yD&w5adEo_^ǜ7 _ٲX뢷4R,(pGUkR-M_%>2=㢪j}Pqd N%GW%onyezn$7lIcǜ?IF(s61&8 qF"(.]xAv 0} *ka#IH*f&Ǚ1p XӶr4ū Z%~p "?iQuᡤ}&-KL/}$#3i 7qgSY mLN6PīR<*CurmTL0;D'#=׹9)9rM+U_T]歮Fp伊kqI.˛"Jac_/~9߱ D 83Z?Hћ=BPG|t"}X,?#S%#-Tz0Sr?GeS1SmZ"Ӊ:#Q5)簾#>@ݽr}湚4X16 Ēɲ{dW=wh|SM=ͱ<ۋxl*Ap 0%y~ W;Ie=L.%e$-~cE1{੨@}'p]O *rӻh*F~ jL9>Cq59ZXwOݶOueTX(4vvspNXI|a,`W@o6,,wNU ʾ7i Wlȸ,4"-ը DI6m~%9Ы| Z\΃hLYmжeWu4]@ljtM.tMah(Ӆm</6LZhʩre{lW%S3 H/9`jٕ6Ju*ِ놫' J)5Ÿ# J|jd1!4bϽOPJ=]XOs?e!P9 PJ"@OI9co |uIҡAƺp" ]WM kNݓMP2S1?Ѽq<묅12Geb=}{=09;,e 쌗br+aBػ3?xs19˶^W4b|pdV V"Zl̔}UcZMQ&S$3]v&^DĻD^26l3jn#nNE>݋C8/H{7 9qش_!{7qwߘ}mBqS~#/:+`Ԅ?6A|ELo G/Zpj^ҁko53k}O|^C{]Lo'$,K4$+T^522agnzJȽ %:/usci$QSOU^ƓTZ#!VéP/P:{錬 ΌI تL o &[  Rzn; 4@/5OY;麬_tԾF i1]֯OD`)4c( F9}dק 7]^KvW<8ѮLϓ2JfUp_9*е2}-yF'lzO~.UtϜM%uCz\!O J:2s};c"-b!PRQMpۉvZhKJ0?BGP_rSaS"H Nsb DdTHwz G1Eߛ;M}y^4DSHI7ZUpsׁx]^N}aUCǠpױ8=.m`QBP-ŜHPc=<OtWaT7PfiբsQ4R$)y'VF cIWTe c^FA4 =JőQgEw6q5'*vHL"ƽ@+;mä T=2\'V'%{䐛A]ťp`[bUcɛ"܂pNSLaF?Kl`CPPE\4S[^. CAReIeB(:`Jl{sV&4b4HZgHG x J%~eL>t#u8=vʵ_8,&~,T^$\j=.'4Vc%29,ܕPV\2:xo]}Ä=ή^Hk=c<=6n1zدdhy!Mӕ=dCv- Or~ %ҕa7*˱n>)a~;KrF%&$FI0o1.wJjAUQIh֘nGj  SDVvJuC G?{!3⢊oq3>/pLCI>#{Vxb iX&*'iuY!dAwc6PC,缻1G#[R! Wu1ؗvyih}L@xKpG[1"sez}+-[}ɧBZ^o -tF6ݫaո/oڝәT#K]J"Chߒ1SEECփSZtgssiryH>hQsmfyf3D&Fa0/ eؕDO7 /*WfFI'ʧf52P$5:C/Y!u@Jb.Lu^uky7$>n}e͖ ߞKFbތSwǮZ3܆χ\X> yE XCO̲!BhuQ(=XU޺Qc]87i4asDpC9RQbbak=7– B_9ePja r.O!j#Uf<+h|(_܁p38+h0GQ-V)n6Sy#\Oi uێ#ih1T5?/_;z1 BUi;԰jD+\) " =Ձׄ(tzk*~YOWeJTmhh`Z\&4&o^ڢq>z|o&(vZP+nVo @=oqb!Um%lzvH8DR{Iha1ۮmn‰ӟtJ XAL3d GiMrDymf,Ó,8w~"wnrEcr\WoР7PIH4V"sӔFqw,!̽r :Ѳ "C_mx>7y5f] 'P%Sul#@IΡ~6u y73; CuCTxԊf6NA3) ,Wf A~=3q/~RiE*\?YԅSph2#{;!⇅ܼ9bh@LvMo$_U@ |C>=mO΅ ջyucZNTMS!o}IٞӏP:w qW-<=0Ϳ%]5A29H͒8K;3^KŞ1yΡ5Ql'MK*~ّPO*uRr,2[E0GoLWr9"B@MZ k V#}^rIlILoC/Ϊ*ϒq.;)jѓ{o~N=}ڻaMxWWio|2\! V)U.vfj2, 9NG "`k~Fnzv z͏j3hv/oQEC~4\\/ x9[HBٴ]lZ8؎_Labct_>:.~bm&[uY~[*c)6(6mOgv+R12ANqy/5G&0s7=F$2jz(ҕ\ԲDFGwVޟwz:^sٻjm(|$4Kf2xpż%* n;7Əz2zC`Z fMisVm8Jx`HOyaC[ۉu*N516fh >6)93`u\mSEut QJ̏[if dѭPmvXss'K1bz/PP Hz=tO)̦;;Khb h]58L5&5,ᜓ4t1 4LDɊZ4tuFҒBD%`.j(!EPw"mU'QڸʭN么g1kھ%vB -B܆^ T!B8( MSYbLsFL6.s0L)XYW(b{3[9Dr^g[\Dπ G=Atr B'?^9%dߵoP޳R㙇=uy`.ԧ$q Gދ`>W]ǒ-'cuSR@W+KEGS)pBR^'biZm~f^t / bv k2SCڎ'Z!)D'm&Wv *nt4҃ȶ5i0YIJA7*'æ~-څdh=ۄdƶO[sR-IEt,1ʆ~bEN^Y;ԬW,gSq+AM1ɩ6+֯w3"HE-pY8$qrk}3AQ+\]d̈́!s,ޣW:.8m1ۂ߱2rr U&BESLJU(B|hFсMC"rJ.cD. YoXiQT۵KآUlmTfzkStɘfmnI[xɋ:TU^wsmU_\q )Oj+! ;yQĩ4"h m}~N1^ IOW;[nPH3T.wV%~j 9}hR\((}·8.UqO^ןD=I`@;|`6ڨ.>_?ҚB 1"QV(a[J0R^ȴgmS,c!iAo-Y|0 `6$<M}l.LЖz:# @"j!⁒MAe03bezY;#QzõG]rӦiDsظGb9Aj.\خD25L}7^vX/OʜDʭ#X/2 AlDW`vޞl"w-6BD<@ ojS3Y%y;]!E-oL}9S]R w^5Hv\{pz|EGdK1eYeO7y^0M\%5" .+gX#_%ȠB_JY)L]q8ȝ#/ZC>;<`4.t14#J 7BarͶg-;d\+*~y3=gҴ_R!̒I;#_јtSѝvufUև~el%93vԕOfaհc9“ fY0 h)@y뙭/p2XARnd\~ gd'ccx>vA(wnl?Ql֜UqN1CF~%>8@QR(,빕 3& )W/dlsAfv^cP*Lܲ H6pJpJ*N1ڈC2-tA*W o=6ͥ}9?+V)$1늤O=n^KĎ0as79 3b SIqdTXT#p9}iƶSC Lz) Ie^]#ݶ&&` *\ʒLj,ײpF f겜k5+E9n8p{_3P|řV[ݝ\Xhe2`k%, "E)t%"/ YXaA>n}yoaeVB;Baݮ3 A@7˄zDf"s6`a /DXJe33\e6/>Ww$9{F8܍yM`!:PL$ a|MceFܪVu|iCLK&p /9!4jiT,DV 㷤0^uVe?;|O6%ms6k2 2%x0_$BꝨJA>#FWf6S#Xv*Jw'| a`V; נּL8LzfwwEW ZF()pq:"Z$(ۤRqd =|yhYQz^;oh# x\B#t`L)+JgGaB -3$1QY7rWaE(SnFSFcίvpíTP&6Enk!n^e=_Ty.'yyA(IԤƥY#cuꁤyө]<"ʏJXѩZ$1$y?PD/cNxkw.LQq6 ]- ݌ ҂;Wp2fj3H4~c-s1WfwMV~8 B/* 7SGwPb 8vѤ-[d`&*͝׈ 7`VHm}uH[#(tTf*,DNVZI]ŮknB0t=+)e%]NsyŒr]um:[.5hfB8骋"AG1!o8X.7dB$`<92aS]ح +UMPH"m0̭ej8|J\I=JɭJ`5HiDHZrՁUc{3fjO87vu}@D,thrK9P ~oAzMS 4v `߈bثљp|k,IA_-Ǩ!_pb Y@GsaR,GVvG۾4u|~|'@ӑz,Kyev1 NE,gÄ քܲW-Qd4I|re!dX3.E];|,\= dulߒd8L\ZuP]x4ǯ?Xɟ˓ϥgK(e]s4~HDE0oK>J vD.&2@(* ɒɺ}j vSaGp|"=vlxVTO|%V4Dvɛ^N-akok/cҴi%*a8r<}{J4>Q ǭǏ/L @7~8A5fVdO gasyV젉fG([F޻h^z̭͗Xw އ1u%| M}Ta燔C"}lD/ 7Sқ~ PW,~Xll.ݳS2ظvw ZO񜀉*%h/ss"-s- }rԆ Z_f%P\*hPm= ,LmD#[IyKSz&|J l)ƴWEDl OVxP0mдLG? (]K:rVKxq'H-4[ hJ@((Z ; ckt4ϜdMAJtw}UPX}DgSsA!LX:&Et {z㩴 F킪&S!΄iK㺍"Qd~ >{W7+69+9RN7̅U$ ϧ 2,_?U.$L#y'ٶuRFUEUa|,Ɣ5*6%;r]Ih2bݝ9˱IKA Q2fA&UcXbeL #$? g`1kœb2 w'ŔhEdHXEgl/i]@ď}IEWna(ONbguD QN--D9 (؟vwleަ0srU_/rޔ,JaHԇ sG%-sStqeU;#!H> 6$`w ^^Pyt[>y)f`/!юTk(`n55X1tђ3ۄP W,NU6z/C[7z˱^!UPK kBSu<cۨnj?_1,@i) qpF)yu4< qg2jgv;5էAE7HXS#ZfVMw$p>&ppli0=<2[G6 "EN r?*Yݽ+lM~‡Ԑ)5"@ص ZV֕IJTH!~JLF셻s]t2z~oJ֗_2? MŎc?ΰ%ע; =%/XCAM 쨶5"e:Z|JP s3_P,C9L0՗I"(u?TlwK&[X+E@%:T֕ iKl&n~{Q#jhJ~GIuƀńs9]f2i%rB,wymtH ͬ 0w&g{YIDC6뚱+~cmj~DON(Ut=~t&}2GU Q}K4Ց1B?cj,nÒA²Yvc)| ֈ@)F~#@u,9xO?pZdM(kTzqLˀ 'N =rKط2if1~2vUA]mM8HVH6l!ji:d%D_$s- \ IE=l g]#ճobU2ϤeDz0fJEypnyړ#b'Wܪ(}:}B7J7,{pw\ݡ/Yq\0 yOIc0^+wb*:d\^ĒBD7kT}C,!E4K3Rx\x!$]8hԉ ?[ÿ)5Wlj99?+Cjg< v o~Lg+!#/FZ}BO!zVb!wh*IRWywGrh9(+..,zOL->+]KCc";%_GI%3S7 <۟~7zoˠ (T]EbA\_CaN{%ש_`/nUʞ0f `+,TtMۃj .)`<,caY qwA{.YfB[xcMO1F /{LRs6r4Km4Ūk2¦_ 4wn1ve*Սh>3f?NRp lY,& `s 4b,R۲pdz^S}k&s5{U&FU8DX;6וfzBv:%ME07-1QH<ޓ-=Y3۝rB%=3AQ_+ 㤌i B)*?^[Sl46B#ˁ#zgۺ re5Vodx$'aJw6?I0Ϝuk~]2ANM˘S>IߴZjZǜžPRsVjQ2ȮU!֭59DCe+P<1GD^W.b20lgX9ðt9,[!܈%Dž~_' V" DVr«hIAL|Bi2(ph׾Yw==} cazm,ޮAAOL_e 0)eҟ;a&=D0OI1UDVv^[%_)AE_Y, 29q.]bĂfvL)D_6s/`ƐEhb- IGfuᔛkCc[  y=&[\v4T:{>w'u+˺2OpeҰ !6b"7W++CƳ QRmϑ=ib:Z!|rW NbKry d-MuQ#7a$80,+۝/ޥhGwwЀۛjm o6;~θ58v, +7I)^?~WDmA(*x.oŐ+t/ uTZS _\}p\YXڬ}X((pԞ1>* w')~!g~@lu@@;3ei^,9zGb0uMpMAܲ\l`X@D9P\Ntť,2 rHo9t뿙szE$]'T*MYǸ4, ӲB2$"\C3nv6Fct`b,*T~ɯGg֖١ * Q=""{t䢆*Ymo2 ưPmJI-2Ѽ,^Cr=廇Na=8aJ.Ԭh> ύrRԿCZ \uWc 4¨18X^[>RNQo^ľv_#YHIG0]H~]'Ǥ`f _p@H~0T:+FkAe/v#uÙ-5%@4Mb 43f(1;zȵ k%ys,+HV3F*GSi؁z!:0 ';۩: pHԐgIR%kI9Ш~B;ONt}6J1\pLa>Z6C*y7W~D1F7Yټ;)؞z J7{SP`i~,<( }dVtVDaX ,{=αoV]v2u$007 H`t>Z4#~=J7\އV?#,dό@D!'7lj%}8?MRp1N2=2g0yzCj#7ChcEcz{W |+}J  Wk?7?eŏx.o 0ACO%r]0oU$jF}xFMJ3*x.H] Zܽ.CvVzTQ>D]R&4c'ќ4`. X1z9\Ҽ^DUCPz:)v2k4MluO:Ȉ@'ZSs5Q_[#HƔ\e-i6'2QnT񔥵14Skun^KMbWQ585O(nq̺T>Op?β ZG(B߫|_vV 1XE<@.4{]vf11볊oZ=R;xK 䌅s3^_*o)>Fv u4LmG+3Iۅt&@r%/;m G{&xZeV8Ime I=++[~@Kxfo v8h@2c=#v3uy9]nsWހ "Bom+1\?c ޫOj-o<`z>k[&wbyئ<]ޕiձJk8NtRʶvŠuRᯨ6esc:k';%m컚ר&& X `m3 (cy3(H~PK6ZvAO8=F,ưUb6}M>py,3& RMkm|(;  UR{q+&zJ\݌`c]ݓ`{.A$:w/a 074p̵{M ̪cƀuذMRo@ubfˮeF;ʘ^ƫ~X`dMmA{|7 ls 64a G-+"aɺs-+B4I3et6}2+yF%ظ&C0?-mopؼpγ>?0n'@ 锒s@<鈄jZ2`.OX|IÜ*_wz W>He t4&XUG4,F[Z2.iH{ЮGheulEd ;%9ʠƝ k8˪#d:N>}ii/eYsn_Aڭ74vV'1q"b jE^5*! v?ȅD"1 hx6TR?9γԶ&LXGKSEb&A)w4Gvh^?@].Yq^ے~(WG"tY/ T@ZMԽˉ+M޷[]WKy}#={]/퐉_ٿiN H:[oYA?(Lzv̫E?#?` əM D9{V&LU8C3^aB-Kcoƫ8ä$U=:-BM6m X ! Pky#);6𶕤3q7텥8j :*ݛT.qoX"$E|Ij!T&# k)|#ɽL~OIXG$ snȻucҬ4Ժc}n{gD_K-Hw}V"\h 1ǫ@Cw`$1هZR?JGà!%:yS1 ?+~4b(@n^=p ں?/ck $'0Y|n@.݂1BV:&6:V{ \H<7Q~srIM1-&{i9"02)*cǒKBcGH>idy=ު![$2/xZkSfE$}/ *i=/%4&շYjyYоCQ5=8X1Q>$n2;lo> SGfJ/_q|wčj6q{JdЃAE7XwLmD!#I6|rBjGk@+;sDO6KAu4%+f 0Q(ՀؓhA1ݷr{hZuUٟ LLuFaS-oP<Aӹ־E|LW>I& MXy W|VA(oYnF&d)償 K-})9Mii6g13$6XR45;$,/AR0zvZP٫,xO4j eOYb4rgrI,SA =Zbnԙ k*- bU"$0M ^!˸IqIm8s^=Dvo{I3YgnSAU\I&AeHΊW j]4,!ϪTDҽ6Luw4\6 v:Mqʾ/&=/I)fBNU"Z4C6OiBb{t$iZfD"ىpOfuq'WӢ9c⩱f`h&@4+*D!v7ױ0ʟJMaykbSMcO/p/l1bђb%,]΋Q.ρQ@l(RWk%{4uce!gF&>y^Mkfː{͚ `) }oz @X(\D_HDZD>> ~m3c9V!(x] Ã-;& Ъ/6}r@\ ɮ%ShXY* zhKH?8&ׇUHrV!Cnq:r,`3>^\.soiCB3q3(#M5'P6('iY G R~oHn"'6<4*r|S--z| i!m9@]ZNv~X9z"äۘq㓁CvꞝOFdĹQ_Mbt?uBP,[UfgqS1UqV_V?јj6[#P샮wPK+M #ICZp۫\]eoL20QiSö*T[Z?5PYV0RG}cⱀ2gR2i[)יUjŤr˳kuh\YEs"kRmU]9lʇN*D欒|[zatkx0`ZLX+I M åfȣ'[ -p9 $bz5SwlѝO64Ձi8 _._zjt<;t7o~!)ޞc,PG vu WE7~$.x3mvSgC̄چ/ D^k o'Cf;@yq.\J\?DZqZQJ늤Au~ *]CG<ƗF_  t?(X, %@sE _.ip3'/tM7h i+ū@?܀Hӭ RX[.8/]Cd+ڼ/qGJ] 91@A0@zj iwO,q ΁fR[L?6^|"9"^]1¬sN@Iڇmg&ҀZkUCtD(bO!Vz/JZn??g?}  E*" eշ Sb<_2nLxëm0{sDGU@1QCMXuVG٦n;8J[Sd U1qBHSsv[`E%\5 M1SGZ-N%2+[[?v:gP侲ˏD_Lb&H 5Pʳ&PNzH5I1 Jfv/ qEL1Lgq-Nl&<4cb4*5Xc^+i;yc:Hm>R̻en i1=1kh-Mj-/npZ=1?%bp?,ftdڱ`"nD {P(A "yPD*(kCGn,fDnch55?0et9paD%k: ք3 54W'[]\0d߃Z&Ir@77{^˺nSOgr=omIz">׌M(躳D})QϏ|3@ӸZ~2)䒏0]˛mB{KL_T |-L]dx'Tb\+jKjS2Kzowᑎ $Y#PdD#DkJQwr5{tWĻ}#~5\}wvD䓉D h0,# 3> g(v^zL6W QS-ۣDބr7aM.v:*~yŃ:YM>GgKڱIHfz.ɰnm,Him3Y HdAFwRz .ࡡO#R,´l|}N~RYXxCQLo9wqEOlvC;륮='5/S$jJ$)tTgCIQMjr<_ْ U0?(' 7WG]4*1U=041Ij yykrxǓ1]GE~ :|SʱL@\Odu7d'|b`~0Y'%AY'K CMsR?j5eQ`31#b|e Ad֐uml瘘|/Ko9>{W1IΊ9U[Nư9;["kߡc,8ԗ'46ZC5VΕyx[xͅpфKv{0nm 2/xIbu(R;5c"6]U9T8MY,%xNΥ%2 ~$z7N*}sRm3i38,?-ISli13\qo2Hk98@QʟF Ȓᆼ]1=z3eY8+5?ټ.I;ps,r#7 ɺA OxbFD"n}.x 0aWe6}8ERq{iiN8eAĶ3AQ K]_yۑWLM1AkDKѱiq#^t`_ XJ"m\C@;5vC*4V]:li&eiW-#E! TqcK3\|I/Bd4,IX 5z i]B/Kk;ׯgk }pu>Օkh`Lɗ( `朚%ݾA/n zy,tyܑH,4g̊_P9d_|Xys$RRo;)xI ޹>/#?兌/7+?L"2_z$AwRp=ލJ\-@u%)u GB~3tɾl(ԑ*HBF%}i ];*mT⥧E9O;'{jҴ/k5ô_zY]5)S eFrf0OUӫ[1/ 1 xA@iDwESje)-S]hO۠L$ଦ.P4pWmyfėQ_AARdz *(.!;Mz;Dk'AŽ:\"N,UzVlI!0 u)t~O+aEȷ4+ )_6ˈ!i B+VXۥū.CnVGU:Rq+4߮tF3iQB )(sKLtׯ|)߬( h,z{B{Yb_iЌw mpGMk_\N;iOy7\`(eв2u՝y=ql[od vVxt>zt>dNQ;;>N_wMSCsȠP$3`NI${6*cN}vtZAw6cupG98t[Nъ],POL963/MyY0 CŸ+Фq$wc*N@ÝXCM}F XdZ *MR&m ۹DB=g qXz@ ҏʚʤ+gC"nÃ7iCQc 0E\pk'_@ ̇34=GyNաR( \ 郍O ɏ`?ANNkn fPXă+TH˽8qVǪz(1WRO߫y Q!{mHձ7v{ɇ6~ 'OX?*![f]W`([^,DSPgbZ9[Sab$xۘٷCK5-(uPxs`qɹ4@p-)8dY )C# J^%j-Pئq 3a<j!(3O#fEJD5j>0938tqEPhȨs]fMܗnPi<\;T{iO7FNNE;ұQ^".f\Jj'27PFJӻͱT@N~zNUFǤ?e5rh>Vz}O#Y6hV=CG'SpȎŵk1EjlBs4B'7hN(Tǩ.{_`oyBČX!d[qWruҼ}7&:'ݣ@2t>pf<8*>Sɤ ># Ӷ`Sgv0#X#/0zEL)R97FdfS)! gUثxeps$iZ?$Hi~ոw=Vl9kghu:]j_*faò]XV@cGl$KٛPkVH9xj8Noؙ mIv`wf H6A~L8YUw :ó-~n\ 9Aa&2'Ma5jϟr-@ǜJ# oH"S#\Z+,KnP;ϖGcjqܼjߚc+y?g|Pvm=g()f _p7igr;Vx=8:?PG GQ{j%M0|iCc@wU[0yp& tΫWKq,V߼~ʂm51!ζ l: _4f4i-92b[Aѣʼn@`JԎZޫ(2"ꑲ\)3"@G1- 1ݗVw@U ; DЬZE-;n!W(w!`!5rַF>Y~*^dPF8aGUw@U]ENQ' d% 6?fD_^Ke#濎ʔ+Z4 ٭Ruj ~ E1 3FpgT&w ɋKza+U`6l oOFǑUkz"虄|^( R6C\ P\|6Oс ۜߴU)"{,-}|I>0@qk#KT} >n`Ids1Rlekj2%NL<™k Z} ,1'Xܘ3T`Q4V_I5Uf,?T@-T6x=due8yY)f} ~GRRX%A}HwfaZW!؋ûk gRf~61jwezy~e>{ Kg>ess|Ͱx[(kcdM8ZBoCOuЌFo'b{ hȕY~ 'SZ s$6'ee nα2^m(,քɒFxIC3sXm8O!DƦ"gMk^>E[&?Ω_zΜBG8Kǰ!#OK]r9h,^!?qx =HNelIy*uq> /^IY5a5g԰Zm}Qbe%j@HP1mi|4E/=ٶKxZB.Yh˔r P: s^=ٱǾ]Wk}[PO"zXf4C(L!PdLbG4 vtq\7t+וn`_ {4_mS~@9f$+*63] /N%"xd[MQFl6VϦS&Мꩠ =VYMRq:9X.,a{DO1۱UѠ~:{QY5k@+XMBTi%PϩRȭ%!+ }Ud yM5D`Ц:Q KӀ:Hq3J2]S2?bdiM9] Wq> ."k9_Q|{xj\@v)`Z ^GUG2*_ AzB ֡8u2(k"UyLous/43㥊!dDBzXa<$SVflBI,ȧTо,dPTLsqSj?<*i\8p=&IЈ EbYiIk.:M5R"^îH#veh_x>]IN[jk> ak*]R ̓sn}@{Leh~NWLH>Fv7o C5ҕy=E)zK!v$7x,Ƒ&!lsU8`Sj9mך\iE.ܒZ.z@wOvqM p)>PC.k V<( [qb̸{ + ГaD/;Mvdς.ȜB+TMnq;}ڝS|SCx_aE!q,t3ZseF0"~^>mwQBz^8s;nɗ!TyO[ a"[J.w Rs4By>N ƒܮKoXW0גZvɊm_):}DWn(x$G{n4i=Gh)U1fImUE2@ܪn.I4|5ňi5 [CJfVW#iX-$z*|%S^)6'VĈ0$6k񸯾ˑ`0bW[]ةbpd,Y3p=އ PCU] ZyTUXo\<P}'TҠ od<~7hG % z3̰FKOs/G9 G҄)WnC:P~ec[}LEp.si2PB@(S扅_qE#ŷHs$.W?f=,0Nҁ 1pLSYev?V`=k%{*Rn1/<}IzĭTHٽ> Gq5AY=MAMBr7eg<U% Rp7¬G<_}F[Pۗ޸*'B*YVzH@^&`)lM bZʕ|>-C pU;/*nEb{DTj ^d쬧 5A sy1&0ԉbv7b cRa]Hbkӝ8Z݃cQ@4еZ<}2 @Y|RgL_p~[NH޴p/FŨʳbDhAr)ߘ9do ?R;d$`)h0 se}=,"F,sr> Fwm,!i$PzTySSPi\F:$UQݘ*Ȣ@|>Ss}BoYegg]d?\&A䢤MM 3?86DUb.}%nDt5 "|o3~'`J\V'71Esd {ElhysTQg;_Wwp&R߸f`OOL+̪ D":]w(xt[O^JUq>K7P+RRHqܯt)<"PSsȼڎvo0DI<HIIȨ۳rd ݐa/Bސg8,AϩZ,g匶4c ~$U,1x_wg$aڐǥ6T"E/x.f}t/'ȕ͛,Hv*r'j+d*(!L,8LdP+FFQadrP,"@$,N=S*Uw`~ D f}'uׯ^HyABvYϲ5;b}pr||_y}INn2n'1Q" D&y$T +uֻa#gP7!9 B#^DQSu>xGCZI)Rm)앁5D7%Ĭ7UXs6?`_)@!YXMwaÐ9( JMt n%B(\V;?f~޲v_lAnVZO% V(9ܝ67So̤ݒloG;-װeAGd يtR7OJ8d~ ˞Av",2_qxMX1ԧKfԬ$˩i/΅ Obv753\0]pfm\g!o ,i\Y) +5Uճ +p]MR9?Ȋc?PR81cK'wos2$Efp~^.ARsϱ>TK6Q{}gY;wf 8qgbRO w%HW~99;::%6[^a{c0:rx Z܊'tF:B7kImi1rXwA3P jpW:9foIH06 OߥD'23p^龹]BwP*!f#nx6>!%Jny*~3u:NUEu3Ti 0˓ Lw|=ӆ_G g)Dz_Bd iL}K9 _gΗrjz():dh=ʭH[0n@k}mr`:' $Do!d;SĨIDOJdވ@?՜ BE<+aYe%J##VeM$Ă]JQ}ػ-OP@f`߁DR^^7}nW|ا 7id_gb{Rҹ(.ýT%m.: !75{|3eFf+ P+oM_7HثfI#(ݲdNjLm \^~& L_Xfl Y,b)CsWd2]x:hIh^Ltpoq)]}e'Ls4dnA Ԭ6XX\]DP4hsus_?wwFlIOGQKe4v5 𿷆nsV1*uՅ/PG&Or#RʸQ?'\Xedr%WVnJ |>Җjy+\q'۔>{W?5:]b a Hv'4q'sŶcAf"sIN:$h!h *aB8ţw;fϼy\/UlS~+bxd_INK_3Bթjuɥ,.Tr`2nrOqElTz'iiBQG[4y4:܂SfR :JU}C/hA ݛ/ƗذVe &XSM؋gޮ]|k4" LoWS0 q߉~SوpP<7њgJ"fXj-{r]:IA<>ߙz- P7clM06꘷(dI/J;bB?p@.ֵÅR`s]~GlR$:w&":,!^ VHm@9K1 * e^WMpIk\lbQ%Mef na'r4-q"-)yU7խ-&rjmw2gPFSLLELN$+s& }bo!KzP8Hk/k 6@ϔ;'R!PW'ш^9TNbϰi#Z~5fdf1HoD-:* Oi#4]?U0ց?l`vJ%;P/3Uܬi fcK?G!77xNŠCzJ_ [FuՏVVrNDXP)gfmc3@tH[~>ln `1e}!v^ϺUIw\=]Dv֡6L |x;TpO{}FXu#%8G'P=3'qC^,OV'Ma0ERn7z.1nԼ4ʞOذ*ΪzԾuτ:,*KARF;-}@}Ǭ^LbzA :wl5Nh<gI,". +崖 _ ~;g"CFkw?MChkMUI'bQ꬧X"r :pHmL3m iD^1Tj@qKS8FZt,Tls8m(tU/j#5n^*\{CG2xƮ4*QfY\t$QEfVII҄ulǰ#?w*ffg4KbLKM݁O=#a\ֲc22$*7AA"}'!>RyA+r `_ 24M>~: );+؃߸pJ747zH ˋ˩#6clokKۿ㫗dKǺfo,7PK?DL:Zɽ|ۻ׍*ƑMI^& ,X~}[Os(?GIsa4#& gZ10vDP9~tMF_*ᝇ^p {ði-!faZg<6ABGy]7 ^X|׵kWubk_弱Vң+&VWo5ɤr.LYcd&6#<" }bH|g5KиnQY#E8ŊD $W/mF*1ppglØ[OqkD(XE^a%lQ#?6Vx=`o, (,l{ϫK 4jč=*6ir&q988^L ]Z>ٺ[%Ku(?ޑDs4Qn5?F=nbG.Y71쑇S+ co֭v])r,=SK|q}LnVlXv^,nIl㸆7& n͋Yu.D^B᫙]SJ{kzo~:|1`<7]z'o ۑ`}-]U# \d {˗쫱>)[c XL އb2{:*o$OiP&&ͳZ\=8CmUg*0~Lz8%y/j&J0!'spJlNK $Ȕ װp^9,@4f,<6/vkF6](|{A 1x B TZPJ+H9B}< Te4[CxP΄KC0@P[I_õqG ] 8C*- MQȌQֿLbeFWU0]᯻  ?FbhxTy2w.A$&u2qS?eri u+OBWaeU]qmu`MI gU^԰CC} =@Jd xTV"MaOY.:9=vU:|ޖ6WX7ςB ʢV@_s-1'γ:RE9vZ>y6qKLUA#׫Zgб_sǓ̀ vK ǐ p쾟/mK؎zf~LRٝW?62&VkŘLi.^f'7҃ 1+]i¦ﮓ \b/ly΅OB>ܺAYv 3޿YVto;dwnz1k<գk@WԜD_MEK#fpk$ Sܘ||n,~m&7R;af9 gq8L<#ZoG?8菆XiT_P>)jpn]0y QԯGoW\kͤyUflj2*%eՖj3dש:&H2Y HƿepiV 8Ь}q.i%A nğ!TL{H-D%'/Qx-pfp?OCADud%RTxO_{<AP$(K*Ps/uOe&]%EK?;t2/R"$̳skOs3#N;H$%0HJ"`BfZExlj`]F-2O@:2)p~AoA^Kӻ~HWjєP7Zl>19;vlQ'yW' UH(> ZFF)/o`/& q:tDR7r$*:|( gTAy4.8A 9 t)vhu{UX2$&4CJy_h]m r020 ڇ;ʜEJݬW+DBXK&q1m`Muu*ysjQ+nf7TڜB+X۴ @,Иa2ŨȾAD Zj`)nҳq<; 4Q<~ XLփ!--<'zM[\EG^s(;;ΐ-lvvWk-+bZb ME.nD72N=w%2O%eA &膖!$ )XeE.ͯʭ"2~ǁCBkJ`^/&ld]_xm}Æ*z +lOb>Kᠤo1kڛ#$PX7[Nlz2Tw@tٔH뗓$R ֝ۏ‘&rBҢ}u[y?X9 xB7ԇl;;@f&cvX.{}B8 TTʫKM%#l]tc:̀?n:!.Mޟ@q'o,x0+[1YzNsgP3ѐ%; ~vȦG,͞`t1!sfu//&W>; 6@cZa Mq=%Re|E-Gox͍ CPNK]Oذ~]k\Uy]Pʘ @\9֡QX?+~l6+2X&Π$6D.`>XTe;6$`]YunbŐI IkL<ȑy`Q)sͅ"zrK{ChrI%䲋vl Ì+L!tb`މ[դ ZI iDOzAyq4Rr{ ~_(X~ψ|X#ǘ=4E?T$O'&m>8LGDD9~[j"_Ik=0z}@b Sx9 Rj yrC.$<]H>CW—M~VI92=wj|o$e2leWe;iѷBk:X3o\P{13F\1 IXïyGHB5shdp`l(Ɨ#amֳQ[mk~".hXZÙ`xL Ա#)QBƃ.r`Y< UVfY;RxFnzn697$qj?Jos * "?H1 QoXX1ƦlVЏ$jB:`A 3!& O] y*,@_Yv.Q.CR&*_&H[l%=O`1]F@ʺ3-Dwfo(z :xг' 'o~0dF>K-zmQ #Byqε0+1H?JavqI; Ym`&a0W 2dvWNRD>Ł.' Pjc䘚$s \w:uB1 [^4$o}5e9w8kr](^byոvowQ/W.a_&*;=DCɘ{ "Ol:+fGzhk&ӕԮ$aA_A0z؛mtaQx%2E/ˌ-9npr ,҇2ő=n6˚ApMS2 *O.x8̬oV Fvh^(?$aאmՇrK+͑OS,*Ű nEd*a K !޾5Vxq Y#F5l|@9L9$^\WW dOzKpNQa!M5{(ːUث<ׄ' 'U^9C؄Ă+!P5-kMƦTL00&g[IS|Th<)  EwQX[z'_EGx6,r!O1-5ZSvfYcAD ̓7jIZ܂,`^.m[ .'O5]ڊζݛ-U "]fi!B_DymSbq{xF eKOuMI_M N ϼi~l00F"ðH`NL O)(xg7vb&jV?+z;+IWÈ"j͸!תv2񙔼ckk>$F 7E?/}l-("¹_n:ܜۋ| dR֎x{*)ȼs۔UkOk@}Ǚjڡ.mt "B2BMU  !66:ZDg":)lxHwoM/ q`;s\ ްsT6yp_Z9IhY&xBFOJ}[W,K_nN>o/0nQFRdc$RFSjB^h%ErQXXoG`8Chi (噯dT, ,@*tLQ.qbϾE !\TB?;U|0t`ĜeHF6c){7 c=Y+:BҨ&^@3bN;I||>%U8gRs uQwZyu)fͦ>o)t)Ӽ& ݴx.^Fum}'},RNi/Ib'O+$R!{Sߕ3Ete#՜x*)6ܟ(WPypJVqVկ9s 'Dɋ[b.^dO_ϣgGH;P(=,DɅ8pj##漆}/l˥d,N0F[]5CW iTMRx 0r)NNJD둌U*A  Y z *n#E==ُ Ka9lkќ9E!KmV9 y0UyQc2G-|ʸ燺[IR5vkU`ݍ! 2^JEMhMo= n IT⼍b RQӞ[{Z̲A4+/Hbt)>^d œTd!HPL\}'e*O 9؎tfݟRRt:XHR?S-9ڛc9^d2Phb&$-bh8ǎQh<$WXotW8(Hq&ǝOr/x8b91hi` AgE"uILY'&Ÿ܋zHe #gߋ3Tա%y+p(g2z!E?![WYZuW*Yo}4N00%P2>k¬-oVT]4eOnTD&kpur迿{P(7g@^ZM ʾWrRݲWglKnZZM^ks(J#hm5i ?66FzDM[bӟ|>E@`Cރ׶~/|ҘW'*7>'A1{ { |~ZUܶ@a .J=;p&<ƜN)끵nZ7kG'?6 i">)Kje{pДdxB.$zAiR8[]*F Fg w¾C7gB\ ^"pNZ{K&۔jm/ro?E0xt8aŬ_Tj ). Img1w1ݞƬlQ$wp1b۲?C0VH$N޶;" 6wyShpn K?ROWORXFУ:+;c.e {6)ldlM9j6̲Ť =.3a͎m 5K9?ZGi n [H_Ɖ Ucz}HQsסua2 cf [L2vuZd`lfxzؼ0nNFmDG:Yv t]up@3txdC0bm}pkA 2Zʡ*!f[-+P(%$sb2ɐ yF`D)㤨ۆwڐݘy<:d۫(Vr=hMj_BKT=bbl3H*OQl^4wjbr>V6+ 0Kaqɑ7CJ/<} Ϻ@],YhuAk_S[Hʡ∭}v۸w:ԜFэjBZJYÙ;hF!9A2P=@BfF$4#koS:VfL?"߼v#R?CĘ\[8 D2gސ?]LVt֤Wp!&jr{頕XF+nKy:XS}GM\Gv!aL)oo;?s~ܖL~7ƺ@אlB#)H`#CMd;T!O+fA |+ 6I8L0۲NnrdX@"&gB)C?۽%qDx9_ X+N}%߻5O vW\>k*Sb*3~"( Ӆ%2T%;nrٲ-£V2A,cɆoL t̳&%+,  E.@:)2 V+[wkb:9 3cHN%/Ѓ t5QƊ ŷFU߀{Y* {P@Iq7fnch̐:.g[(jŤ+#t@?DňufTՕ-!+:"LZ ӬqPn1S͜A-AT#3>_<@bzCSRg&t唆E] bQ}(*3t:W,?]Mʀ>t~RvN!_'plE/>mט~/3=zIa ^w ܻq2MsM j鋸~eg%N$uce/%MʀVWǩYJgm^Lbk#7sR*&%sH1/Im-o1hiH՚)Ic#ιhu & ~ ڍ<5q_iǀÔl(5el+Fdzq&:(@B\h,=cܮ!ӱ@9%|QpH^G CIsd[`E@Ү|jG#EU9-785nDG ){Nxk0cY6.CWOLQ??LC8r Yo/gרP[ͫ M!#@MȧK'H緦 y'oC62t"5gph7Og&}i'O.O1󇄎o}E37t$GLڗԨJ 9*0,oysnY@!W X[lqڴS APȕ~9Ȣ;NX0;T\Ku>3ٛ*4J+(Va tK0bԖB*=lУpF&z+-vMpܝ2ԤϱLt;}BE Cgri]{:o ǥ-4Tf2rZIDzdlt'aCY[lR Lky.lm]%5)a˱rnz,$8{VWVJS+@Ϫ;6=+Ҥc IQu1f:ن}|;d#*}(;6tJ}lX\;bGi8W`@碏.搕5V̄;<_k#J"Hڸ]$iiGA~/8X{cUϮD{5ZYI;|og`R_;?=K7hQcAf 5Fxwؼa"{9.<)B09bw] G+L83Q_R{ٖt~$^bv1E$=yK9em6p1hVi[ycsFSiaxzg8ԧL!S1|87b9~3) de@Xv37#'qr]3TJν;/Ʀûdqs6fMAk+ 2K2!|^/4kҋF֬BXt8ulsaY hYu!/ 1q8$iv!o_+$KNMm9LuFloS+Dg \ pvTz])YXVXb#ʖO0]bF4[AKӒP{ C+#p zAj}F=׉ $M5n<N,)>U Xdsd|_BSBy0ٱf<-)T4NX ؄dTD\/4Q̼ᕃ i2bLC<GOZώڱ8T΢j'ؕbu堍w&̣"I1/[ZΉ3"2oaIH Z,ܡK,O&U1Jh/Qɨjb5(o3@4y8\FTЅZ)F]koz ,{ZTRp^cnL]ܡj2U$\?>+"p*jڲ{Q#j R6(W|xY !Biu3X++_<1|l8wˮGZ:T6%h/ld|E}!_#<; ՠ>#EKYBG,6$81I?(:lE$gwbԈC h=Let,kw%=ԯ$Vsl@֯uplrS۔N:evAžE W0zy[6s-'u+n[s`g9\CR>}FqAOWO[AӰތ`o>7/neJ"F] k?C86 Ǜ]1_˾坯S v5;NeYǜͩGaXZHqߜ{ wc i m)|Q<t6;%[`du jHQ-` NJOP6Kc\V0N6\ڷx<}3CŪ#ln!Uk,'6G 194'$NES`YVNNJi kz,*(7[N9NG!=91cTGxӷv[ISM/G%8|k;Qc,XԣE痺-n _ީ- tPu.4[ɷH>u vM ++3sXlȠ`Acj,ҝI]w%= F ^%s*JE'GЇDm$ӇNablV9*5_:B1,,҉7wRE!ϕ`, Z)GVv(CیWՕָ>PIh~!D` zi;%g.鞳 g(5kwj3 O74u9Y#n9$]k~źnr1+v]${sځrtyUjf[sER/_%1/K3&h88OբZO:;@wܥ3]»NRlH_:5s#vux>˚TSH&rjP4ŊlV_p\DсI =Q`7dKB DQ$,kM#kMB tJΪnR5h Frg{SKNy/9G2Ӆ*rz3 8]Q׃*6ЌhRb=įG+}{S2m緸ܝ3aAJ -apoխ35<.NJFOs3Hɷi>~* \"42:UHzc!;2ŘXzs9s Wֺ}I8~}J*{oI܆Bɪ=(Y;yjb?H7? &$%е˯e^g*lDz]CR\OGR꽀-5u6L;9s1y~KJ}<)7q1FGe4,)I_%2' IJuMs<|SWmn+,uwtA ,o%@<- ^8 @5XrTD?@,0 /ώ>|i9$%UU1t oϬ8g1}~q*VOB<ҕY*`w2\P[cz/HWP k.m)qÃB/%_ѓ(C6[~ZA!5]i<~uD5lѐWBú]+8|tMxBnFt/9ӌn7ϸ X2EuuAX7嫔|0v5W~C{ q8_:DrOӞ@!_T,2z}jwpP]]Qfh]|jyq lq^~bDJ*W·- a]9nK k(ș*X`bݺBDHL}X_/L#_ԨwבVv6Mfі2v̧29IOE2x;6ʓs+1+'W,D'H${Ы&b6A!xg3O-5 +,)$΅ kۢLz%@V 9r$)S9*5Cq Ȳ# SXldEs>bj{LdR`@:]%d CmJώT4/J Q4T;;v/?x$&§tˉ3geEF雬"+>,^7&2 -3\c]:W5]\rӋk&)՟Bw*!jbCx-ᇸ}IrA0Sdyr@ [*FHic +9q~G";\i C&z4 !Q. ynE8xz]Qbe,2yC*&)l#ўFNdiQN^ ?]PY͝':[j/BCeɖDs5(.sPWE}x՗c C!qb#ʒz[CGPSFj3ʸ#w!ޅZf;$T8P)1n+dObhk0;G|̡7͞#SlN2=ZOnIFAALړk*Bi}"s6)CǠp/c 5"7#\ވ qKpD2N2EU^ҶS-h[]8 ZpTe2cD897qiqrH 0[td[fm!sjzZ%8OaձX#6HsJTb4ߚq+[m/,0Z#Aoh$D p6!wSڸ83;OU&s5G UmHzMc`FnRx+SpָSN~Ndrl1V;~XxY<39%W\N359ﺧQZo݇d#$/QOMs;mpno FaIz` CQZqݯPnPi @bN_,C'u FnW/Q4XZO,y*:Z5A3cw*$SFՆ_I N/uPXr.-1&vئ- 6XuqO$MZ"+b< tfM3A7|)m?46 e*" XF s=yxA9Xg~`Lf>ʈše1Ppt;eNj򟱠дnPm6;אgոJeÝB ( ;\1F°YAWq3l6c m*^R6~SiI\|1X3^k?UD_4 rU7=|"Ǒ]4o[8 *jA{KkjxMFoi]g1$1Vt*%7MHBȽW\Ys WZYS]ot~%=sƸQ^jwc>Jh농쉑U{O&EFsyfl5Sc5<ܠq "BY/VCmBx4]9z q.JChGzk4F=QwY2b-Dq1A`1DYsCPKpX\1S$먼,%:}fa+z-Vd. 5p8%5QH/<&Ecc Gf߭,fȉVϳ֔%h4-GsϹ r!lMΊXcy]yZGulbdfEQS :"y/%h6fOxZ>Zbpʝ-WQR;}A2eyOT}╀LҚ5((Qw\'=e 3-,H[螴HTp{o E T#D@۔ÈL3g`|행Z<_2/3/>v.S Sx7B@P_,.J2mr"+dkpd0A?ص:`{yIsptd`C8G= b UÌ ؞d._yX!93yGu5Ή.dXe#MZteVQHf2KcSN|L~qrbZ'4Wg'Q^"1/ jPK&]@ '[9;.Dkxqf$޻Tė?'.`g5iT$rB69ޚA7xFRN7W}&}ƨ Btv?)i_}%L)& _'ZTN϶0>{ęo 3A@ -ߟf<sEiYVПKAneĻb Mcb)Q?3XIeb >MqZGgטty|)tj6X^>e" `%ML9} *畮uN0EВOa!9;v .FgQ;4F{Qt00f,H0&M)%_tgw@69{T?o0õZ'׌΅H7ѷ@"Xϰʿ^`j'E->k[M5#мeg> AuiuSa*i( +w {zIa~u Jy7<1s:̮d07 HY8O""7vKF%<ӚYzd-/ښO`$kzӭ.L7NzljUQi;m͢YJ:(0ɴq+EGo잀Z=\Ҿ+n SX z2(2kdxgX9ﴏfMk6sq(\S vpfU e Au !-s@UH,#u peO.U6ʞA6{ B?>k"X9T֑+#: KyIw)-d|yD$~?=)REVDiA"ZܦH˵[>cЗ4LMy bԓ~Y,琗wZAX9bJx/R ćFQH DN$EwyTCT/6\G6:Yz?=ecBoQt5hDߔo^g_,lׂ2h Vޝ9 A"PLͮj%uz|q+ *UC"@ ``Sh' ÎvST)AڳFYXf1d#1ըz^ M'waWT׋=PG)ʼ"$BQ&sqƒ+L( RY\=p欍R@6n"m 9E%w=ydbP9ks`Խg/BYʸ":R;ExP]}0[NH(k74x4hEŘ3 ^JH 09}e2'ݫKIO)`^I]p0P^J*hxJܗKF%#GOߡBsFM{qn"`ӸK D"AduAi]9dGk1I~]iEϓUD&!(| Əd*'Μb @MٹKJUc: PI V䜄$B;:-kݟJ 8LæFM GȋL+~hB3L|'x /K;f6v޺I:vUc+]MjQ_8%D%M̞݉+K@42~c$Fa'r nԳH5>\~\y ,"͓jo5)S/Sŷ\yƸ'Al>lv-x8Gbҿuw: bMӟg[}קԓX \ӠDHWd) H}x]^Xy$ܞ/b{5=L +pvḿAM M0찭1=T>OLozW~{\yQv[6EM;fFRsuk g/aLg|c5'(|GB#,Лjwk7<4!'?~E; ;/{y'{2YD؝n8:X=$"1Ct"7a3vA㴀zW ;OIg$@"]G62Ys7EAN݊sz7I*2#M4\7i\KT$z}@aآb?,G=,騁+^TV6Gɓ4_CB8sE2e.NA!FtfK '/ i]2JkDdHC [?ͮ mWwF5?<'g&rd5JIZsU[ZN-#-?PxzQfE>k :mƧ'U@#DjP& 3}eu_g$3^J呐D2 -+ᛚni(1g%?LCDF5a JAg0:8B;uu4YP6ƛў4 >xBjzhH);sHÿ"w-v迫?=:9\t"{䈍P; ITU_CȘ cܺT9 `(arJF HS֡Z1TM8j8:A]U 50 JZkypՆx%nN7f;D 4/IHt%cHS|gpBg ;gjγ`3Q족+[Ǜ,qbp|+ݢ7OBf66*ލ:rN+?0tH ÜDMt9kV424F.̀3 HϨTJ *ܪ^uU["W @hbRrk!|mIco&œM[%E-")CpR PgM Ct%Q1cWt\,o' ӟs0?!/Ns"4)nnEwFDrI\_TԮ -Ρ'M'+C[Qoի6j7DXnLFm#Jv0yE A|4I.Rgnn\_k=bc~s(|t!Jdwh6t]UΚ8)/1!bQ;b&5/yzK[ \ü2Fڡ٣jvaZLVy%@AT⩁0rc:;aa7r!k%a!~7d7.+rzysA~cg)pHB,\It p쏠nr>?S(=A?gy4߬ $* N5X},ថts3*w_G[>as>Dߤ)uPcwnxNTJm3l_{<#0(DRR\`4]V(p=11e59g;>#PKXx<|sO/t]] }Zٵɓu5#< ?VD7_OԚ"Ѡu-.Tϐ2Նn[i9IH#r~ïdn#pjY z=FTjUE`-FY lenVڰ_qTj"$X`5 S<`[iNM|;y`ËL 2dt(V +_! B8H" =yeŪ#w~&,&VYEũC7Zwyށjմ^n,nsƞ|3vϭzQpT:R_sQJ+KXծ&\I3R/9w3D),KENkeBP2"W7Fp9/pݮ'BqCz޳"L K@z =Ƴ=ֲnϑE)צ F .ʤ3Xւݱp*K*y7c?0bM+MU,p~dl";9RhTz8!k0bt;[]uf <.? x^|3קF&fǑ;ձ! :qy)WLMy(旦ĊvLƜ*$bv>>̞bY zM @vяȈK'mP96oAG.*\Ggi[#J'< l]9 J-H`DXqz[W"|I3jȨ4:o;>y}o+Yi < >*S јl@^!~U6U{P5׽Ϊyfv_]}m޲Ȏ#zR97sa?쟛H-ㅍ.rRR280/]0T,KV8 1x62,)!5uSCewyfgl9"ΰ_G^t<;8LmKUq_9<@xz>W([k0ok{e;i;!P8\Y)\^"/~'jjy:+93=^ԠXE_\#5WX1c;᭞+n1Jއ7m ,u_ⷋCMv<ۃ_.CzΙ_xI=YFX^E]޴SJbh{K@{\>@>5m{=|\ Pf5$qܷŪ衜بuls5d勀HѓM1ar, aGTM2aqi:Z{|e /xWzb88| Iab6*۰Vq<5B7e7<$ubU{_wn.Hyt+^X#X1}n@O{>bܹ ,i\puKH_1C͇*ێCm NTJ/mYhT9k ͿPf~U~ͅg:ك2l x$h>Fb2f0<3X9ouBp%+ăi"א_xmTx_t͝3C6 jص`xw$A͍@%ˮʊM5kdѦ% ʠDFya.@7R/ ݷ_ćĂS:T R|rVFs%AX#o!RּGsܐW15B9=$Xu2n3jG|2`6d V|,0ECjU"q_@AK(NH'2&wl";iN̩0/9Tm6%s{GŧBw뻛Yd*aLGřbA`xݢ´rž܃xX%'d :%j%f5%aU9o}w1~ F1ZHo9W}s&RW&g&[|;xyP a>IHf =\ ԅU~dqwt,JHzγ&kKcZRAԕs6vFٕ՞WZ$ARio>(x7q8cnx31 弲1 N3n>:2riT^K}7S8T]hE!5l "kLt[4_%4^yx^do@ 4]:GrIםdpc9w* Ǹ2&x*|{Tު5F },[@ 4$ͻ/1IY;$=|<8-hvkPe ֡W0[3FM6 }Ȋ͕=5 n5} O{ݍ -/ 69 w#d' 7W:ӈ(TVVߥ@DF+_H=bBI;dw6GӾ_wt}2Sh7DgԢN;J;dH=m2:Q{n_9)KGħ;E˝.>ව+Fe(⭢;9>SvA*$%>; \p #nN,|کe+[Dup:h Bb2yWriswO,D,Os*cuڊH4a&ocohl6אWCA!?ߗ Y^Yw^6n}7qئOtZ _3Ja(dA6BԜC},^ F 0L6hKB.ڑ"_ Ϧ@/~0דEL?ji7}ΐbd :\Tcc`Y-YIYHم^b X,!2#Q04"Zn8K,w+{-N E~=Ytw nR:Ne=[Qd¬-fSU8!벾E>t?UYgY?{zƂV̏;Bt$a;ϠB\^uyӛnA؞{}]wtm `n0h0 r8A,7j iX /4}qwwlGT\+Ȟ ^[Cϡ-[9sdUqiwZ^- 6߆$9 F<7|<SP~a"9Znҕ}nnsbh-z<'pIPF,&`߱g "Vg8z@@BjZBdiv,?~wS>U1p{HEWN@>u)t8(Of7 jB\6̹\0*?듿x R~%l`Ta*{tE!Wa8MkɄNYYh0"Ho/!AC@e{OiiU V|VkYX.أ{uLJo҅Ϛ ^9? k "W62*tqKFߪ|Oӷ-if͢u>Is`=wi@ΒW*x YJVp%}Sk=y~ PAK>y Q] e^V8 3Vqu.pH&Zs+&/4kŜߒ%tH\f8-uհ[Nm\7iF%лBWV3; Y~# Gn0B16u;b;#3U|Y|w޴VpOV_98(39.ϗ@$JL4;:†jRyʯ?Z4HmL^A3o, ÚzܙPeTN!hڪBZ?ȥnnLň(pK]&@Jio:xOұE0N$RIi[dlm-/I phn֨DPT US'fզuE9Npgy.B{I%:{-DBPsl5V@SwV<D3y_GnE!c3ižu7{PN#7 :VR_9Ӻ5m>;k `'hsK5Yfh2qEOs_h!m~I[+z1FS❽o_:ȮoL@~b 0ǑwZ %x[AuNObR͜=g^M+@l_W)"@#!N|ם]A!hYDLV0ӭh % P+ECwn@4-&Lo^Ri+~I|s?)z.xby\ǕC %F<~9 FS5* kܞR?N Oucu ݣ)/j0Jcpdb<Z!T83WgTXd:nXue_]qCv f fXU]CiQy'Ѓ.hCx+eX3U.Y9ڛHa,6QAMXq98_\ObfJjtMlT.0 wnUm )Q>-?]WpPFwN,rӁqqrpf͡ Ǝ "wzr<2^ꌎVޓx兺nTH,I=8 X۴E3_k!(oƝqBKj6>XLnIWA5Ӿ(#2$"Ʀǯ\7>}˻v/ LԙI^AɲZy%_0C*n,m*SEf~oMQxxGHY疇~79A}VBA1g౾9昔NɸFK$2̳3<[Oؙ4\_qn rc%$`/Q&8IIHUb)UD<}X@*5-3Zp8v;-_Hn] FXz 4 ! O `QL$ms}q ӈw tz"QӃt.Wz"̳("gd/'*a5R4cm>rݕ *Q \vF).~$ \c Ό5Og!Xqt|t>,>I[n͓*^KabEE|Vb_&N[-/ ̆(tL !pT)kra3 +ҵw{ ɡRlR h&K&.a^\y7`gUkdceSDeWsgB0[lzGd(S0DWC̏jrfl`ZAOe<6ѡӌE/*#-|A6)26ljrp!+&cw]"iz-${ܨ9w=XٰVv.޽U>P8DDl5.:TgnD*֟1 {yA@BNۼIs| ;oŖAk6ky#zwܓ@Xu@s qK#uZInch-;yhl~et-by 䜵g~g|oTO6Pc 2A @(QFѶLaQ[2}@pbt`K@qi T:u.ʖj0}|7K_b2$׷ܭƜ,63>V%MY. !@3&P6 xPzTEq9{,:uLui]!-?D{) *z`EBʶ<]T>Gxa pގavD)pj\7:bzÄ_vX^K}4ECg'K}2-Q#Un@"MmA x-G%4cc8im!yth~%X[A"wՕWr~G-}.hR~>|(uZEԺUm& TmuskUʖuz !X (ƗQYK.iWHiGoLVg ,_^- IRJL~Ssjki!&Pң {7Wq~[m MD:43Hj͒# Ղv0A2ŝV^lb&fQwyo5 iHԡ:4űY& tb/-_fM:ˊVdTհ}| {fo,%f/E _JXZ@r'"eͣ[qsuRK2صSrG;]9kޫ{}_УF߇l2I1Euh HNnǤ֙ayMrRڄr\OuC<v~ab7{ XZ΍&Sf1mX䟒~5in{ Q W3y-&*m8k%^ ʄˆbp [PkC䅖ߜ8e-9{7ԹWU}A 5^@vq|mjƽcхlh\'-戾򭊉@ 3|!Ȩߨ\ܒv.M~:D$Ve3t{x#} _/h֥d$`ݻzk1pUqqe$^C2 ?NBȈ;םgpZ  <[}'}Agw7=St "YJe, 3 ث̛xKqC,^"[!TϥJh«>Zm äoU|"z~`ϸX"݁^ŽCƸ肔,y$/9ĿeYyC-ә*9vsܥ}ڔ jTe bQ V>Mb 6:3OGgs1@S_~T.5x5OyN !}[mn&AnDWtݚ͊30gS1'„$q 2; An}Nŕa&?>${yVlұ\ʉgE`Woܮ}új:h樻WEFMQʈz>rs!/"cD'#u VZ0*2zwwهIYT̒ܶ7W9TCuKDYTh[8A?^$MI &^7dl)(aԔl Yjz6Wj}/]#854{߅k@iE(DE 6|>R3]&̖ii0'0㚾"Պp٥:@*c;Q?)xK V63vS>bM3ե:a 9u4Mhf/~/L~"CP(Q`χ0hiO'Zw @#5{BZ/s.W9Fu RѺykJȂ< z'wa%2 \i릩 StEJ 3E-`$p,gw_DɘTs ٣rKu-Ʃ& F f;/;Hh{C5VOZ$] ,fw9 @H/T6}i)/˅b&/FvJrB!==C i.xS;5ql ѣзD#.|OfKrnmds9V,smUx4ySp#gG7sMx3~yHQpn0W3P6?Ic@6+p\_\١u s㙈>]-ܖ{Hmr=»<5y%;wUN).YzG?|W)Ftn5̒,t dTc}Yx\ L$ P?rsr+ņCPදvzlxnG:%ﲔ]AJEέ4;<v|.0z/&mR<4TBZ2maL3bkkxq"J'&HF _1y ,&>s4} Mz1™Z[{ 5k}RQ1O{4yS'_)`]$M8>sRQM!̘j)abBꄖĢd fstRc0ޏG$I5pzYPjV)߫Z˓IiOjA,j|SAζ|ОvT̕!ͭ\[%ȑI6lS`y\bhVNnbbJfM1V {k\XT' iFrz Snpٟцh0*dK:򺴋f(&J?Hѥ̘mv7U"WHCY:м5,縖~铰k]H*-(PXOʘZɼ\/Ќ8lD;Eҁ'^Ъ@{"KZ뎠0_OiY'KDsyyY9> [O 5E'!IKȞo-W ;>(bJT'撺 fru2T=JYL 0EP$tc, !Y7e ˆ:A_QU8@s5fcU=SjC ;\ u:@ӓ%*_ꑛHHNv0uqO6@GJ?"=sj684\Ƣdq/$b.]1GSjeYjEtZ(.mw=*S?nhSBi{u&Df>4v@Лe:x) j=O@&l+ސB+ܲp،g"Jj|ӛZdAc= s(ׇY L+>\;unV12nr!0`AW"։dM) ޜ+RX^&q|>c˷ۅf]0ٖ-H~_t6=EG[ &y5W)7p~Sabڒ"$ ]}K_I1~Iz/u{,J1w0 aS1mm@yF$[ZyY`kMzC~ƭDR[,/=fZ;RifLD7 [|&uDCPewDg¨XZĒumӡ4䴍=K<@*9u SR\+j(aMiF"kB ³T& MwjnC%MNN*JTw7 Q;'JZ~,X; 7eG3K:dw*,774: 0'=`b\'F{$j̦E?bμ/.:-ݣlx+PJީ~=L;i n騻>MUI:5(^a:ˌ΂;eKB [딋'8kٓIdeX2x.6UpB\y+ZԪ wT!;2 w&Ik{~N 1rIsNH'k,L^d&߼Or Ŵz0@]3CBLW.]L~/l.P9gICy kmv'iɹN:{JILL]9-Uc ?2,=jHuҝ%\%__+MtCӈqE|l:ItR/%F+N1\e%3x及]ߟ8=CKmӎd5~uf] ML6>녶r:(ިhaq%R9X).3FO̧wR wԢ{w1e/iak | ͨS8z~.Rfex-N1E_VuJrdn *ć)!wɳD2__Lڤ_ yURzmLn`hm]2Y_.%\9Kڶ;bW/x3Q2ńQSgrR:fH%m?IIRP?cD?nZ Wc=l5 ݪ76dzxpgpN Bp&2( m~\E'BD̕y8Zݼ4H1cg` %M.ER,6z{u*_q~bvՎwFbz#l:a^7Juݪ),jSWJNcS D[ka+pU=RD!?)оO{~t]3 &UE|Tװta#:yfECx})ζ TOz2LN\v*o1QWήHם2B.F/:i&VdPx!Nd O` $ >m|0Lku{ʊK:ƴO^pC[V9sL'-".r۽ vh}v/je؊-mvCx+pY YIx6\|"ҝxg)8drJN0$fM[cizt%e28ޖe0UrZ 3DɤΝE앎EYЃЗAx@Hݦ"8b(+vV=Ji~A(CGVu8nGQAp 1e[5s}rT) zRΚSa;!q# W;6EU1Ф; C1KuKܒ!OS#)Mg2pnٜErm PuT`wl4LRozlA!PPjv H>n֢v S!7 qκz800lAohv|-_cne&YzP@c{[>q/(T\GYm+*cqn{o ijng6"4@ɶˤtp5'_;*&BҜB=[F0ZC>|637${bq7ɕq0s{Ѩ)07G{syg_z6Lbd/cz5Xw3;̨ GF1P,q@Ik1?4@O('}zDcB'Rծ1EG<$h3P 5ƙq!פ^ZIJ6<^1|{H5"ޕ6g:{N'd(&RV Dg`YS/ vx;EšZH_oQu>}"L#XH9>l- :>`R`x4W!qqUʾo YgO >} :K]ihU0vx-S*vtBy+_P@b( @5F: [/HP+=hɣh{~3>+@od]*k!c ( E8*J2 )W5g6,Pm%N9~, Ԯ6 fB2 HIq GHG 6 *r5+d+ħ"P{WPTմzrV.l`eCBѓ:3Œ҈%|DÝD_WK`>aN]6]f7ew%|~^ :9ԇ6a7wmI}0ۃb6w@^Y"JtU !K ; Ǧ +ne&dns,솁ptEh%LWr1uOY67 uX g:\4)=I- D}lth4vt2 reRV !Jm:28p*~!WzS0V:|f4eςDvm{AkP~m}3dbۛR`=W JG\0ѻ(|\KOZedJ斎W1pFc=!SjAMQV/;`<֘j JL= We' )^EaLn㑫;rkz9pl/i3YK2Hb.Biy4 %,2y‚U'|Ҹ@v:$t==rW?M{p0}(Hv!d#yDx,XHobAZ9!IjqN/;c\ς@H.d fr%?ub.sm`}}7t:5=6/E,8,w?Tp'ӡ2'{ *9hFd7W]ռ=KlB'`8SzbJ)C}pZk:LaOs˫5r=)?g_ ԃPtriޚ/V@mצHC>0.I@ϐ4yV,{IuPCLg_Q}!2/\̗ [ڸ5"~B,F v6" UdÚ&Ih<Y0gMwvQ4wJ92Y94Q6bԌ)ٻi+U_ĭؚ|aʼ)uPd=Έ l w y V --A1Ec( ʸ.ǒdLuV&5_CԂ5DZƒ?ke{\TJ 3.4PB308:Yqtr_„|ߐ &?vrm\uo!(I>%\Mǧöƞ馢hz"O钬^y9w5Ov`4?G4 2:,.bxh Ѯ 7tN^wʤ1o H̔WshÕ |Nk`";Xe8yir[`eȚ, 1Wm%wj`B3In]|o'q*#}ۊSٍ<0/syD *4DC1F,;`\%} ,bE4w)2'J,O;&TwM*man|m$v?Ui163xP%66!J;u +Dc{B+<|N5HU!cex<N |#ꗣ"'kFQϙ|${F+yֱ!fr"t< Վ=FH1Qd1*u0V]4`HM;#B y{t!dXke^1~HbW8٪Qw 9/'cA?Xy3}s(vv՞;ުvdVY]LaQ[Xu{p8nS0F4+P8q(\GIVPW[?ĕWro@7Z)Чű7%03":vh+_ <`y`RInh[\w/p-!mC47eB5%>` ̖|$țp'J]2Ez)O- f##3]XCI9GcQ~G7" T/Te@[mkMCy%EWjaiˋՋݻduʍo#i4.~ Uᘵ'ܬJ]s@`-[+IYc3x.dFEϯ(aOcra-4]rM*9;e1S&1X(680uJ.ƅؕG9rypuοg8p.u9QW]N~ONnENF:[»,}aKHYc ۧ0jX?z|\ҫ>t#MnW %_g) ?Cu4뇥m L˶,.;,UEx 6 @*h2ҔxcgQ1QsK/`Ѡ$şsr&9la }z\Ks`cD {U#E!\YBgDd ɱHLhphfV$_]ȱ.1Ir?TnQZOFȏf"~|ܷM@;}c1* 5aL4@'N܆gG]o͛o;46OXƼ_ܵ;?qgUL+Qn}8 lq&u uu-(?yzۥ/3Iku[L_e 7,^@Pi64#ov|)25$si3l)3D FhX]hYTg[M_ Oc+Zigaen#hFvǤ8H<(D.޹lEz涽^?0)OQZr_VH1d:{v& ziOkxX=2ƪ] ̣Y2tiHcʙ3Grrxh;n0c+;ࢵ!284&[}]eh`ZA]E+mj) ާfr]]^L`-wbޮ]\+/+T0 jaĐs]r\U_۴G5?3'`:F.Ll\JNXPNaM8$0X rU2 G2ޤNƺ'xߺy-`Rw(FaLq"3c}]ԉ&wlrUE=pLZ'k(xBʭ0n]܈%Z.,!k4A HoGp 0&'kWhe,'Ƒ!E(|Jno;6!~-SPSS"b.Ez nߝu paab,hS4 JV[Wh8Y [w"sK9>NMhJ -Gm?bwF *yrYB*+Cuj iUb2ˆq|>F1$bg*_;*V}<ޭUVxa2V32IomkYV G~2.zPWZVN~3/B6dنP< =(~{MA@ѩlrr; `),ɜf>@+0i=vR1l=In|l 8r!as*iF g *LU*ek$7cJ.rˡ`nr4~I#\0gUvq v/BO K92 Y揑 [Bw"];zM~n"A bS1W,d# 9lO%TD _%3Tgk^c %d"z{v|WOt=i /(senDr'>2٣BXBrӔ1z =B*PiRtO~\q[&\ߘZ| PMk'-,]JzC^SoYKVν@9\^Q ۥEQg(^VqF%忉(8#Sȓ6Q~ N⊡*!mAX΄T%A+\/U8_>2c]TO3@QpAqswF3rnćw"pTl{FK#O5Q "!Xl ;?Q@\p +uoCr%I 4 PG+'}~?l9*jYIqSh aEnoiA/7#5# ?nx= UЕxfӦG_c~ YH4RuZ)*߀o ߙ|ЈklCtz ̰LɅ;[Lߊz[,`Q99:;#!<3A EP2ڹ 6\Í{6IDfVE֤X_ܦ(cY^(HFCX;[ _8;[O}FL#!*n?y*#3]%O:%7^_GL0`@QlލR;JKBٴ%)-Q)<>JG=A:ti>8P SU\h0t`؊0$H7clFrAW@ Xxy_a8CC(=?j^itҋ{5geÛYL?!]xUC@3hc`m$a56:Bq]}uJ%H#,~/s9퇳@Bp0fT"̷&&A:.3J]ǁO#<~%r5!P?drq>~eے҄ rj+#5⏶pZSR\)TN@R7cRڊ\X]No%NIUlپl1fU1bKt9 UY6)8\w|jW2!җh3ƴinVw^sX-fPh 211#vNQ1Qu#hʽGDj#"aP3 ʟ-NX_;tQQa'xkIv#r$NM1'!KʼJcZn-XJ-$X*Y7̝"<<*HfbYoR;IեY) ,|=;憲4GP?F}pHybZS@H-&4_}gm[?|۬* 2F"Q;_8yYءBj{-f=d]<8{wn;N KI+Y6 >L}+/ xd.m H(fHtfh;u fi%=Ux{BrwXDZPV5^U>k,>'bi6Ih,-xm /ӣcm耲*nz15u;*i{vL+r ֫Hx aX|9uۂJ2~aqVNt%^ʋ_t,c nc%,p*"";ʊ'oKʱ>;s_ْ{k}&3K9 ӱ%do޲<v-\).d; ! !cmT9 6&Tk2:?=i\ǟ0uIO&NH2q q|}'r8gH|ټfQ0Ll/N<_NFint@' 1>[\{H6!QېF;Arm2܄%_[Ѣe>s \55p.5-PZB~E8GvJ<0|0 1M!/"eM`hm@a[BS_{B ;u2]Θ,)W53EMb;e+1S`HT+t{vс_4RLiOcxɵ]La7Ai1eq8* WSAn#a$!IM>.^kS1[oރ[7` _s{ٳ(yIWHIIDjo )0](ĉ#uv7Ћwh.BRdnF`L= >] VCXwi-Ud]SivAEop&w7PzYX2$s;|6ZlSN1Y8[EP7L:KܲoR[荓х'y]ȍpx{,"G[JnyPe^RF* bhC#[ HQs#zjTOT1^XڪroE{\ǿ--^˙,ᅩ*e+ UBPUФlvE&n?sbTS ~m_Z]4Mqݺ2lRN$^]jVjlhyНJ@e Ob_3AvM{HBm]V%g*@l'>U0i(#_kM%g@~\KO)k:azsS+7;M'#ԗl=a'sЕ. ~6>]R[J}3 q1EuQ[6;J/эt oIƾaC mVY?Db3n ( 2?|C4 VгldUm?!BPL^;fω>gftknj$/#enלf8{TH ZXqJ:)~?e,?ׇL9+:jBg+1ҌǽX!qeoܡ\*'2ȋUhLc~FNvr$Vj4M KyqS=,b2B K0g#\ d`K =9-XV ^1Qc\wYhێPGy@GY|zHw:[To)Wp*AB,bw(-ho'%ɒSq!!z筥.g%0fSY;AK]ZA10uxZzV*aOyTq_;b[!S_h]=x B&:To|,sE.2EǑB=>m.X3'*eC[{~ :̭!XvN 2R`VѼMnGS%+5HኛqՁ%',9P>WX,$Dp<ٮt5˲.3sXW/ n{ ` %ݨ|Dߪ' | yaKa?Tf3 ?9c9Jk 9X/}\J@hn3t M;; S%مRTf;dɲDog+  Gee%]^NiH)x={L>,)M0gH?ED\ަRÂu72q1}r |ڀKhA?"((C{8ǏpS^e ;LDEF^M9u yH5iJ0C,*n߉f<ĵQS;eA<Ft~w4*b\mDsP iAs ~y+y}[ 2'yI bHw"SS˗@+.H/CLYQ-YyKC#ԶG ExQKbyt<g!cQ0娒,€D+s>rSVUKUsQŗ(d,s 1*Zsye+{V=S%Q܋XYUtcb%R&VLt+">*Ew{N-gjQrX_ \w05u_g+Npbu?W(n!{ L3C*D3mR,N(NJ\Xu/- էa@TIdaT gp,6 ދw~#ϥi\ ϾAZƫ>jƷ\8I MwJ۩rm𠲊&K?$s286rj^wMY%Z>G;{~9Mk`$sbADzGtS|3O/Ǝ:!"SgeBa s*VH-H)m*g5uS䞕0tv!=zCpM\ ] S h3HqV znwlrd4gѺ? ]M٠0tGY'uC%6]K-|,,bbsS@⧅'2gl?7)D (tZvh 1osqQ(zp'IA@’!M̙ۺڣOy,ScLdb'yMoN'~ގ,q0 .cM]P>rwVKj[8r?[$1".DӍJS"8Դ%7j6|[ԗPZj=@>Ӱb7CI^Uy{0_Rpd}1&G3 Q U z8#&؎9]ڇF E_;ٽ^Oi猵M.N=B|Gm8p1V@mjs[>A4VjvFb_B\+W:46sٛlgs4p}C7cb^FDv7/ߥ/PbdbRA JR8 6i ckOw7O&wQyI<Q.t{N.oym$5Y y9>6wt<&U֠A~_?)&2jEj/bC6Lh%ؔC*}L#!Qj\5gѢhJej+Źc%9ӠP"Li\5$!,I~!|Y{H)͋`9 >F{0kBWEE2v-js`^XciABoVd z ǒ5L?0pWfBtqhQ`o/V6rMk x9t8wckQxmD 3-Y{:9ʃkݮ`Ӣ@xIdI㣆mbv,@}sMҷ}-D 䎐R~KӴ.B\-@u.vo);-ÝXg,@1ٱoHtek6㒾J]!m#`c,N)|qە8){d@3BKeu=u;U黃FT %9SX\zjUM>"0?[su pyT b Y:#߳YKCtu>ֺXH%*ޝ~fLJ5$*Fn? j>rx4~Jw6v wp:|$ 0$G T_9`Yme L X CLlrVZZ0%odww[<`VDY擐eQ_ FҴ\ .`;ȦGcU O =)[pK >wo@,^QVLĴ]FA396p6W]@!Als')MY宲t(2]aY[ OqE&*V7_Rh6iW.b[cS"FK\>\yoNC${F1*Cbv"_>@OX Aq߯b$/1JX}=9e'$&ؒ7"(I<8Y-Re4p_K_,{t{ ˮ,*.[s?㶆k\OESSeRi1^ON՞p82AT;!sգw#!i"0c*gt0eZNoD-2dOq\{Py i@( /(˸4.^i+E,";' Co+0Qpz~O!xa,Z? RZ;GTT%ށEl{gAkRlDgP0oT;!H;|UY;.:d$G l 9NM#ИC~jog9yha!\vădB\\P`[z$0(s _08(B?F!71W|+2Hĝ ʵ+`j,;fV tY (_}ѯC֙9%P|8bGYĊō2}L8p즜_wRUi0;W|+J,.E=4칙4;kB]:( %C+ /#b< $x ^Wz[`v";3Xrhjs?ٓuʨni<пß(W艅Nf[ iDq<`Z| S.-n&SG!fvj'xbS'LާOHAߧ+~# se`!A+Hە9/TZ UuJ%Ii%½S%M8}7Fx+pCK}kCT] *)}&;JYGL޺Ӣ2V-X 3;MdJ>yܐHSv{.D} O^4f b:$@&@H͍D8h-gm5b~*'G2οcQ٣ZI|pΝhgLANT0fn*ЯOǟ}*|),T0Di_$ed(j6Cƥ)$:Ƥ8tYq+-!iX"x:dL.K+sъ*_MDRp)bԘ=u) [MiG!VAAqo.pO7d0ފQD-rz>fr !]?%in(=K-]q9lkx |p=^}yd F[bؠCףW)_#%S\Vc*ВK :3lUw)&<|qܘ^I{>@2_U>@}F:ՖŎۮl"6R\1>2n I10w""fwc]a fSCU `Y 80:{nd> D9$lX'|zBX ح*̥mqĴ*416Fx5F(wFkFpA]n;s0);ըBJ+^T3_02Xߞʶ5uJNJ6wa bjwac[n4әVD%aNYx;zVvx[tY&/ je+i$$5J~xaⅦGO*Ŵ.4.C*1j^ y&tc܄8qzi:LfLlp8x'H|W2ܝWwhB,He:r"O^&Nͻ$F)CdveyI/*Ҍ `޸QUDuTwEmmYT-Ga۝w(j)89V̾gWщshEeql*3ڊ6w_6"EH%@tuO2ŀh#R{E.W6B:M'ƫi)QQxH)/_Vl28-C -mGRʄy}dU0M^/+1#(38fgɟSxGNUP:nښ6>vEd6M"u@Fdø:c9+gOդ42U,=BC@ 't6yDC_jEuki)8?.{--`^c"v| -fӭ?&~lgƏZ@d#î*'>\i4vuNV<)?Zu: ѣg_î Rew9E8r*V?1UP?޳'hf8Gk\n?ξu}(y⅂_s:J\P](\p Y3ZIS(^&qUjyFhtwV%nk@+p q[0#r7w)jn-k N]3/#AKbgtArIyTtxwzRa|;W}siGYŖ,F~)^W"~}QvCO^CnU"\9y00fpƻ@)q=dansdMn⧼a 6`)_S#>߮DkDRfMɻxdзğK"kǤs],,A * "Lx,oJAv*-hNrruq8nE3896*̐'5l["@KFhuHTiJ<-a>&C^{LQAo#@䧟UD\sZX$Yز=1/QFٻZA(| n!miŋ*5xUokD轒0s)+]E:2i f[2-qlӐDQtFqwUk! : qj mg "aXA`sj\fU)wl@[ .J]K32Sъ"=d7}HҚƚgFoSXM#YU RaJV0ef_E Qxi0ZD&3MuxXZ_ܻwEܾM/n=B Լ]>Wdb+*?{=xD$]@{ڦ\+Py0TX6G.E[wIIGX!mQ>Cζ5iScRlW(Op:KNi%HqI B-@G&ugIWZCt}zS:dW$ȣWzyD]DD>r")qݟQ/1ȣ:Nhӹz4[ Y=?hJhM[K/۬/{1#\$x T8HX[1X_ʕ͜=Jdp+K 5E].z܏4 ,漤RT^ >v;om>F&~[$gD\U^<ምU/=jkD@# oey0@Q5|"7(%mSH+ PcA)LbwbD90V%4eq a;7We^wT=.9٧#ȱeyL=}~rn{bn4}yxC8WU;%T‚H:N>\?WvIp"14O&η wDϿ$_} C]{_ūhk8z/GA*y•e#[??/1|륇͌4@+c}vMԱY]:NKCb` {p)\G$*I:1uLlR^Ov^0Z)iX*\A3>yn6u"^)D+hh;"DsI"?V`b:7݇WC!9@0Ӷ=3pA^yhN\'CByi $|>X#Îx,?%gx20cP2UhdgUTf0bT dԴ!A$11@Ay30g_YD>];V{ݓxj6/FMݵl[Z1N @8Spy wޔkepߛm u4g>Ƶ]GK%U$dgqmϞ,}% %=Ga#Q)5y=&x eͫ#q%H}:uZPs-cmw:Ꭿ`fQ%Fl4V(YwP~ A3/%<<K<q&]5.XzTlXJkdL*1׷hz>4>-\^BrA=1,q!W.,ߍ `OzCÆ'lk&21ܒ6')G= w\u󳹙&HU]6]KX.%*,!Qn4 `҄h0l}uxd,h'`&9t K6e*w)tOI?8 D#C8QP9N[RkPr`m^ t_n ӈaUKzn/$bMnнoÿIEFRߛ䫰DMFM9jtَjx&-(z8WUtہhm&a:Ph먛M8$Y 9nIGI^tّA*-zgHy|b%*ӻ@Z!NF5P'6z~& 2vRavja6D?DQTbTcGڗfj~"^[JM7^Mv F\Y{9%6Wa}s|TF-AXhRft`9>ո>xfʩ&ұ7f ;{Ւ1Ď  Ay"OJ8mw)O5>,׉ߧ ⾸*5Q(M@8YTr3$ .ȧږ ~tGjҕzw\gdϢ,d5b4?RgTy4s.#.fsHg+,|&w~f Ew]R} [U*EF)1vWt8%eZpwq1TFo[+O6ڮgr(b-/ nw;4o\LP]ykDG=E.h#=M,_3ZI:=.qf* S8ލdti'd@1eWA6䌸М~o cdmH=l~(^Zs962y'"tZ7 vH}U9 oEhq"˃r+v"4[r^~?e&+ 1 zs%+[bĎ+Yݒ]bUNZ:)HHs/.-|PXA%&7@1nƺ?8o<^r* Cms^;je/TcI _NM唲x $MA)[ٷƪ|sF{*~&ّyY2,_sa"O"*ɋ[kNV-<}3xՁGJfG/NH FL&L1K&DƲwߧZ8#qB#$A1D(k>WNn9{qخr:>jeKPz4 )0y;bCBPtxsgᖉyV]2Rrmbvkv+i]Fvܶ2*&Wxk/2T, l?<^nPDYD ?>f's )ˎaF8#Cӽ <3)k0fLjwp>#Sz3>TbaI>, 8rJ6UJe& U<>7I-HQ-֋JgI]1YfI* [emi}Y@+Ӗ ;|C$+p#hXCz^t[嵀O\jR94C%s@ ԽٝiQHA ig qf 2_ T?(= \/JAb~:bϼ>NwAY 躄4/a+GX:fH; i}ksQ~'HMckC޻ @gM7f!_ t5̀St#\aY S\\ٞ -DrTår6=6E3E[LnV/ /Oz4g ǽ'-I;i^hex=)=3U!4 >*awܑv;^x"/&z&N"MB- ϣFJ}gM}d "p|Ȫ hF700Smծf.hA((EVq| uߡ}n03ZzjMݩ{u=ڙ؁ʟWQ z1];~FPֶ]Q =Boyf3AN~A, i0RU8ʚ7B>( 0`8z@ƉSj4hA8[Ψ n==O)KKj4rWiClr oc8!IFVSQu B&6Z^=7~uto@^e0LJ籓ƴK@}TM1MNaEӭnXx8 $o';>@>JR/L3N\+X.yeu*pNS4$sit54 Z\$A97wNjV$DZR:bqoPu~D5܂6vG>&#˕@ ƼTX2q29cɏ^ tY_d?h..cpmqn l{ᨵ,Z>rdR*~-j}0}Q]k:$Uh_ _(Ec?olVU_A#W٥ Tyx޾3-%dEGdБ h]j^{$ &,+мӌ(1_@Uq"8Jr+-?(fO!6lPhn9oE>&BZ#w ^Ї=`-HhN+盲>qۻϪgf˺+e|l;?kz5m=،|H[r!u{;5_hż/_BFND l}mͨdUx*x4ʞ QF0x~_ @BU^G }5/Za1 1jŮf57sֲCdcj f`mܛrj *wȠo l}.g{HNۂMzvKX^Bzd2c"W?.F=w<&>uՀ_X6ЙQ64P[`SxQ;+Nn2ݺ֪yTa[WiCbID /1o;.^X,w_}̞rRBePLn"5&eiW##@O$ 8gK;CiE#*yV<{B?rMuK-,/NqF0lq'Y _M3<d:Ą<^@Y1ޢ쾙Xuʸħ<~E %#@q܉WR/68N"LLHF]~"RExU>Qby<(J̒?aS%&q;pbd(,-d+&ӴDܜ;:{RgwXU9.k!NG%o)nԸISHCq3 9,ܨc絺׷u V1;|nmkDaUg/[%MEApSNh9C63|*Mq7Pe⡳@e֡)wlq>|kDuxY-s"@N_1\-1Dq&3iA SW_|z!r3REswalhG)EkMLϚ ] Nnyl( wcbWdk^ǣVdSyN7%xj}A#ki$\}x n77Y8q\tnwBޟc`HvqpH|*rq+gZyWZlTa{)p3,Q tL=LA~ss8=ؤ[$?j;$HeG^&f$Ve'DީGE1#@A'Qt˗ AQ3 Rp7T՛T~Vka Je 哉Cqe0'<⌉I9tn- !]q`WBy.ȅ@)Y/S@ߏx=?@kDF_nE7#RWkcϾrҳ0h*Q0WJNJفB'l'8ʩ47QM`L&ƙ$;t#U3Gd/7(A? s>=46K?\}z%EP)_Һ` +8?4u402-hx7L0"Fcse\qy GlG 0Qt4JӑBK%`٦RaɐTcsVm (Kvi!T0@]2TUD&82ڣٞPUqn29ת?^vRNcx7ΰT~ \ԅL/@'V>Q_[*j#{|DWe5Sqo\{(цї k~c;mx}H·.PQK J95ᄪ2̒[~i㓑L,s!,E~dxCZX/ָv$缕v~dMuLDHs}CN2n#^pn@J3>|vۑ1}$n0Iw_(,:4G| WS(./rzID^ ;Dg _@|o'QB+W{ͼ;ǎomPb{Mh^CcnܾAOt﷕?!E\~3)᧱$/;r9r,}S4$( qVRh#`*Oڠ=TIȯEzޫJֿ{1-|LϹH|:J3̖c>B8ԩyhG91Glg|e WY( D/xzNAjQKr: n( E Wao71[$hueSh4}-k_rH-NɆs7uKx^R/猐FE^W@5 QܯĨ4A%`iӵsiڂV5fA%<n T#mTLD!HMš *6C7Ge CBj8[ԅ3j6 }x$)A47 I1 n}0'&i((Ӛ%HuT'C:sd//j9 UbE/TDbLr3> {<@1o_>/ЁlGrN|U[!€!`Skt$xY:NtAM`"iV/dXJnxvM)"֋DYj+pG̍' fMN-h`cb4$2r]sONG ', غ@2E>: Qʭv. LO$Љ 2%&_N!!#R}2Y٤I$Đ~RB$}?OwLwaHζeI8+N*YϦyzc#ѿ?uv9źuaCL94<F~]wP7}I0()4s@L783`\RR!92pa G(}A2z;E Q*|4LiJO~ Yh3h]PGHzԣ:YHqo)A˓R;WM?lЮOf< q%{Is3+0 c^FOQ奖˺8-[|-;ųώ~bHs0m} ?AU;iFL,DjWnBEG ZU﬽F{{&<^coWz u-,=6Mg[蟱SC>AlD +'@fh>oV}'5$4te'%Ȗ272]NQa鿺yTQv5E̛N /ǾZWEmB(-Y5rEWm;d]yst5nyh)McI &>k!I4sk F`1{7Ka߂$'A'UϽw[muWAtzߨPJ~Z{zwXJ`scQ|x! g,J#L:` x7cCHQ! jj=,9팾@ֺ:סTu'moү{ؚ~;?+cHz:'&ج<$~*da5]4mǺ#dz\i-%E4o%'*75#Oxv/%"MdA][x) zF4෼=. )mţح)gGA[]>PɊm62^< M>zT$R&^N&¾Ĺdv3U g󽊱߈)?xhٗiYPj=sݮ [_Ixv4E "lnAZ@v,kZi}<~tRܙ~ƊѤXڗ[=ܛH}iнtm<彺= bLHJ}"N{!u5DkYI*} f5զA)7s~o fLh?emL+_0Xk&ؙN+: PbO[etRB *w[FL"B1LwE1 o,|:cz>@r顝{tܱfP#a3q4T>/C\Mˢ*?CD2?I{3q%II3 t{h_3f™$SGs?sA4Hn㴥6(-oʀ:9on1~@:+ B}i?PMSҘӧp.>qd[1Ԙa<@@)H7s]BO>gZmB4tмGdѶ#9y@.hD^u=w;e1VT޹(VOo?TEvPW}zU9 30E@빳,O2HSIWN!L\sG5ɒgp^+{ Ko $~x:F`Խ8H:o++{JP@QX=J\Ѡ .$w]0 DƎJZ'`M_7ΛOLlEغƝ5r3>\Q"J*eR4$R:֨lj_2ȏ)?7)輒`DEP\tvqe%gV}C~;?DlRגR`DhfTj&ŠH1,OtOpP4¼DfFYO&HW {8ꭲdڞtF9m@X@w·P🳊"iAVp'B3sY.CQe;Aug:U5@oZqOQ_ Űu?]O` |0fia.|o5X伭VM2h^߆ev<\"/VOCTە?c)8Ռf6ڤ2~E7! \/y9dNӋCіa3[V޻ &YBJ0X:D*[\[Z#BYE_H,zn _iQ&=YJyآw2"J"gkna3A<~UFQTPdqxh_k۲t}ws1+Et#I镌 4fYt$ [.y3N khZQHc{ue^['=KlhaM/߯4>aDX4-w^Ww66t" h6cc/Yo̞K%xi35}U^G ӭ]5M1䁹 eU`i( '/nsk *LA@j hŊmO(Dאf DwFGjHبAͱ -GhWp,V}eT0cj7éxdS^R?{/,EXubߙ~s?"=!OOomz/~,Aǀ(_K< i( ")>N1#I`z58]u01uhXк,%%|6ɂMF$6!KsXN7mTЄQ!:B-'̛P8s>ܴu}2 ygn|ۮքJ%OXM*!R ,cd[ 3 V^Fa.?x {s{GFQcpj?\@UiUJٷA4A|p.p#s_-VIؾZoY quD\3r/n~V#;!Q|Z }T.;Opeo@X?^kK| y-;"V(275`.FQ+]U+AZHvPi>Ur 5o 9.[(Po/nZa84g!d RM'UHS9ˡ\c I{)DG~AtO0 Qy=KcD]ƻ^¬˅Ea)O_a HeɈftem!,+6 Is$8:l.\ =4䄢"$ץ(xn=tȫƬ%[液רiʒhBj {Inz҃q'{C/gj,8;?VC]z@"U3 o%J4tM[)ĸ3BqS Ү;of7_YkOZM ކmh%W HH+u08]@.<{V (txJY "JDqQ@|)um6 * !td+*!,2pD:7ZQSƫPm0𢤷r"%)Jqšb:'~wt1"7MB&zbi涐-yE6M"6Wyi86.pM5 RWXfhDl™(BYO0 d?8 rxz8 6ͅ&VN_c0瘌=zqq-15?ց"̸ƹ)N 4{#_Q0|8gimck %%\!%:c(Lpx{k vX/w9>d6У@RSK]/'NE'74 6{pVe?=V+{m֕4_WAҖNb{25azo$HLQUI/@'u g4`bw `U ztV&ZQ/X/F4"5.>lr6uŋ9_[>laCqw[25⺺ Q9<މ 6Yq5~3XO)Te>$Фӧ~6mb< kOr0J6\muۆq_kRưx@z%H7&x@5x}7o<}S agcR5 };l&=PR<F⭝ȴ;*Ѵ7ɏ!s[vaXZ䓯LY1l}E#B #/u_:!OAkCd3igD]?NJE퍩 t=2.`\J" */nqv>.O"KoS-434ɫkn|ĵґi؇>صΦ8glj8lN{?L9p|4UEǸ+ﵴKQF0xs2Ȩߔ@S`V6 <83jXD^a|`u~@G_08$W;Dl p7on'%Wcer-bNG{`]Y:U nJS8O6 _W%ѣav^Cna# ՀOrϹ "qٙ1tQ _S22-IږCԟ]^ZxHۅp8G f 71xnC23I;ib f}ˣR"mܩSSdF6whhM4{)JH]fkSxߚ7g;^+է!NrDŐ d90v; UՉxhMtEvWRr&;v27WGo-zqUJ 0ӇꢄKv?zzxjQz)'j2PeX?V[-)(o\y bAM6Ά`'UDZ$P~6ps'vs-e(l@LcBK̅yY|B 8H=׷†M^_M N*j#9/8⁠Cl:ZG@Ԙ^F47ol7Y`L jyabB{/|\Cw|%aLFUu@ fbnHx b "q$vepHropC P}*3nGQNYY0j>+!7*tD8J}/-ޛ& @*'ES;Df8mX`Y<{S 4"Pk:l!'PA*EydAA qJ˾' i&T%62ٔMlootGOpn3Q lعtf!X19vʐ='(KؘwPX ( OspRc~>G?U@]tXP!䦘(_0VLwq!wØJ^wۨ"z;%Il(stbl_r!Tۀ o)>KFjp*#ysBN^lV@˔ N'D=^Œ f ыT헠 ꘌmr9/lja S._^P\?xMH5w2 lJ:_vdɦùc .svkyNA'hЋI(^T1US;F&jޱ2 Ġ<1|(fWgB@\m&gf ɭqj.1|BX3i(~`mnX[nqv^azSXM*\ PGɵ7$4B%w.~U^Ad&a#|>Τ }%E=-]W!1d1]ߛ-RN !W3tkc]HAǝO:7`Գ~jB(Q DYAuqE9k棯h4j!AZh1 ?`ҁ@@,"s}bix J#&?}MNxG̖`(鎭s02 Uc˿0!Y\0oB/rM\x0d=?eɮ)^yl5[ca]RńHY9H9KWD3<3` !s٫^ #hg\X⎊Ҷ՝t4ń} C`GV_(dpOhmOiOkՔjTS?.yW2:[O5l 2J]m=Qk6S6=[G>C0`uj[K r> W IF7s@Tؑ^(Y`kaID FY9E/'nÁWz;NHwZk{ ^!OpA@3#[0犪Y 3: |q{Gogy)<;.¾K0f#XDr#OZ@2S*nO: J[qb_3ړ~|NP{q(Z9'6^v5b#CƘ|b>SKNk''}2xy]^=KG]^$đLhmSՅ}S8$\TQ}e@Z&_U_ny/)axs İfq,.;>Ko?k5CF6f, 2w4lپ1ٲ7ڰɵqa *]'kh-p̀`a:UW'v~d @iHorтcFU$٪$&I+QVɫL5FKؽk+2/e mHShFw9VQ\<<6[ʯVCËT7+?@vg0 1P`{UlDf ݟϹ{|9S[ҍƝE&T&U+캼IYhˬ|pFoȐ?G:W2U3cFm$>_<?h5gO-{Li2Os0;<Y|ځ?Dab,❛fPw*yXꏨ-O4~H*LKsdq.a3Ix 24R~f s>Ps8 a#ޭى+l 9FZ/*g`{**7Sx?{6lAe_F%x3 <{G˯9YSxtB3*"@i70Q S$N;p9.[AQ@ wSف :NYX%LX&"|23Ti"0EaF Rm* $FWعڪn@3z4Zǜ⨂T:gtF͚Mf]<̤t)d7ۺ0,7K։ Wg[k|XEddLCmI'ڇŏL;4Zulj"굅Qޙ  }wTh hp晞WǢN/LS%7.`o<'fz3"i^gQ8kՒd3$㧴KN2ngIDeHmtuγ'L$t'gm&QTMJ䮠.ږl2}%D\qE,W Oӌh,Ѧno~wɤ"ü .{dWiJI;!8xK@W>00/v6vՖV')rL +7MBZ qDM_Ga6ꛐC"D&\-<2CEL1}EƦm0L ^yY*е2\q}o^~p~l0jI'zˮ gվ0@.n0!LPHb_Xnuy{FShI;pk$Ct`l0^lj{ t׭SSe(' j4?5NVBvxP4/z3aTfR7DRf|~D}ݏѴ&Rޯd@sG~MAx~z_|H7Y39E4dDbĔ'ZG!ybnɟyL9cY7KG''4P }9yx?F*~$-ݝԫtw筌M;GݷO$Ђm/Mqm~u[L{H-B:Y"1&"qy(j\У|ƘuJ{P+D]?;dFzce-bOe'[jR3Kg@Qҍ؇a@=jZ1Ay5DKrtf2S4V7 ͹;O*O_[ITqpiGu0=<'r:fWcH+oO 0 =.e4K~ A ~EN b7|䵝" k\;v[V[ f.8q,ԆRy "#-B3M ;訆<2LhZT¥ P+yEG3>-A< ~UP~LtB+`FB$ " =9_CGӸ6+&J21T)6;@e+u5~/evf7m(8-cJEcnV[aAᇠp?7AF ~k?¿n(rqt4qdЛ)& @֘Nj7JT\Z܋j6-ϙoR< *W瀇,.LrN8+(fj+$,p2(]yWUޔ3{ys~bNXW{FGuk] emxYp-vp')âwvBpM!,vBctG_#k߰mغidmV3 QK H3nol1mP?,CMqi>O铜qݱf4ͷJsj ;V1K@O~uc94;O7݂_$aU>> $»C|AFvrPA*Kśb?~ s[2#2f!aQl5v _5ۭM^6pVBtjtRmn"׬څ$Hxe|PH!^mV#c!4'Iٶ]zU@b|_ 2c_hJJNwVqVJ7Z62OW*ԌSҲ=RxyxCVpXkwYƗy¥c 7_E:|֎(5oIӲԝ;(Jr~L7N+c:w*[ zyn=c=BWeZ5ӡ+LdI (,7hUPAށT DP,31*wn ͑Щ9d?B< Bi:VˍJzEH=wVv_5ǰ}PCM&LT9%9 5<>iylY ’a!>䱴 ?!%p JG.#|?a3-1!9>Txq0 |" u.+%]eazܲe$gh`TfiZ#yȤ0,Vٛɷy1,<%?ݐcK&OS3 j4Zo A?m-"e]o`c(􉂃Rx;(HFHaJEhm;]OnK(€~-9m@E)zG-^)Pͧ82/Sp}I65ΩbTvhblBb)z"5@4v񎻯םހWכ,ڡTS9QE:Ni 6 :QjAOzC%QqO^j(cuSC|srw itպvYS`KB7\;]%jiN\G)8P{t>ujƒQ}Ԩy^h\XDH*! n+mʹg|6;D:+Rlh8-[)hWmpre =s2u}gF2i{_QҢX.SdJyNY}ȵ9?vG`A?Ư0yEHmQyI{VM0M`N4"Qs&gLԈHMa$F0M}SWVUYefZ=nTgޞ!U= mt|.ia(3~wmU['?c fn|Q37\E@by>E~"(e-SSHS(nV7p[|TFc%w lrOl{>b2T4vAޜCbDP,J"<*ٍ?pVV(r'bL  WC^_yZk9>]iCr)8C]JNN&Vg?ᑐ&aBQd–-g%P- 2q=ہ#qgԜur dƠ]gp6]sǖtO1\U O-8i]LJozސ3hAd\ ZblZ0DL6ǡK׆τ!A?R;p 쭫l53 c2w>[ꪸ>U+qNX_5Bgynhoox ǢjlGyO QQܭ4@?<ۗzg[b cCM֨j*5F?lynD1o^mӋ7<ew"orфyPɴ '\SR(1YNÖ&oFC?i 0P}/v+3{`4M,=2ZĶ[،(JZtߪ=(w0 m/>PYyΛF"eإqNכUȿmW|8I bje0=M >Be$i޻&:ТI yi"`t">7z¸pmunXG.WZ, 4G4FQzmO-BgF3(L1#=)cbe\Z;yfG9kӢ}v]lAgL?TuO16W#K´P% W0|r>KRΐ./΃^ <}/_Ri8 `|T*DtJz0iBQYX!͖ԵoWFj=-ƍSGq_v7_"n!m Ȇ)QSϤHк+g@rjŨ}B]SʶFѸw#s%Yt3x(djc`s@d)~:2{AFfyl_H nE/$#R]hS=cK{-TB-Uo4@xLD`,QS,sKz'4l鼣_<}DD$&OGfm|~cz,Ť{)OMdf&+Jzq0̐cDg> f+A[Et?tT"l" | {IzDZ.h?7Eha>JjjT)%  a9\fYä7$t{S6n.MiׯVLz8u J 5 ܗ]1To]q6 ϋ\{!)t+M{][wґdms4 ie`ài^rXRYQO2t}q\i?V|N;j^3MK>SK0 3G%nj|S[nS&v#a ACꁭO GA }H_zGFS^ |㬵S4]L]Ju[I"^ʫ9 FpLbJo^8ٸJaeQ8n?1Oוq;XYhl jZiJjXσB7{;ku~%:{Dx ,'pھE4͖ &P6`۵kZ KQ\L_1ǽqiDJcgwzJRM`V8Ԥ|{jZ"<FdHaϓhgX[c娠j2\#,2+oFOG} )ք/.0*et&1K;8c2yu'?c5b"%e@ 1-^*АGr=)*x(8Wp>͚пI7|'eL@Hr9ҝi"K$Uz(܈,y8ts,6Jm( SŰ@MWr;D#b*M-  7i c W"l1d[M >ּTFa/ۘU3] W_G54Ku^z0wR+ ,ƭs}涸z\IK⒳16S_Id2]H9U"C(YEhAjC15ȧ]A)a<nF"-lӁVBJoU5LE"> wno7pm`酱FL趯2AV~>ڪ2٬aoHWK'_b??αvLcoZ?͆h:jL&p``ɇ<HlFA0k;ZC`6QBy"(zx^Ҥ;[&W+pm0׀[U9Xs-&Q-L;0D&S˾Wʤwl9րiуrDAș[)q}딨PD>ǧ;:#b{0k&!1l*OEEɺ*ӔJd_wE V]?{1_ݻs搾ɌtN4P`scF4ayls M@z?]hnxɣQ<{BZ*ih:H霽H YLMv֙b~(koTHlcXh-OTh¤2 B"I˩Б 9k@vY⛛&t̝, JRB]"3ZA.H;%? n #U}f42$`B qURHۚ 4XS 4\-G n7wGir#DFn9s` )QKLꀎR(ҨQ;mUfM™hۦv _顕Z2ʸ@Lb%d/+mEr=gjp0-$nW7jLWqHtW\FoYM ]V\`-4!$F6'AO^9IP:cb7!e"|n!i)?7#Ή4GT7o:{&+MK%[XX_̎wjo2,fPgL.s `wPן 9&Y b4}ttg5@HYK 3 5Ͽ6|+ ة7av^ ΁my@c)N{1  OI(O{JTpNmn!%q}`7+pS[ U %1oo53i T LS_̪5:."\(Z3rϰy,`@9j1ecZ˩)jjD~1|IiO?Ę26i+MKErp~ Gxʞ9Grr}O|.\<hZ\n5!#;E={#C2NSH,DR<\!$_d NOh>cEj7lvYA+-:~4|M^kg a=jcdRc6)OjȗCz -ktmQRgo@QTA1EyUi<|vkiFhzG o,gq3̞*-{NZ옾Uqaޤ10dQ"V-'EdeQ0ꪬ M/d݄=lIV'f-(j:ljd3W[rͭAe xI0ix0b=ʺ-̱"<#n .FG1+{p.M#QBE9-t00%y/#ۗ,lq\=A؀AX 1/WĔ%l900_BQ* sR@}{iKߠeIm9 nIJD]٭BPϷ桟\| |T+*(W^gDs PPVC^$Qh03bꊙ_ shG\W@ 4S(&3 ifXX?p(Mӕ}UJ/u\$K. | VrlNE]$~AvF=f vw-SI?d;Y=0Q^6vI7kIgHirуF`%HP.4ñ60`S MLBhB'Z@%ʸU_%Wt-&[5n2_f8#_"CezTqy%[ Mu;sUim]>ƟEu#"3"ɩ.> 2@=^I :T~$>ax,q'l;Yx";Dp1YyqS3L`o-wW˞C}@cƀ87]z(@bi VL>^L=\@SN-t~&o:Z\{贖MqB|_ä-۹sL"ͣe! Qw8Vs^G㉳xUuE?rQEɑ_+Drsk~0ZD,S kT{!&8Ñⷙ화zvHؖ(;LZ 䢭F }i?p.yKF1!^x#vC<tӁo05#||X$tO{#ۉ,G3HV<ߎ"o,G50YDoF|qrĕGtݕ&r'L\pA ]".鸾)гL t9[k5vOB #*&/<ȤB!ܩA>`k-V}voWXc3͹cL[hJz` Ph^r,]xh߅[2HEmH#T?ipup6"2x(/.1w[m8`$.x0o=eĶ2[ɕT 2C$$,5\H.?_ Pƅ>Q Fzgʹ io_iܟ ~]Ps~47H 2hFYO KO uS &o LN*DLw2 !VaʫE0\)I"YfIҮ ŠNE6'm nz|$T-! -Ma=? n?_?V~w8ЍCT<]ĺOⅨJ_6Xl2C$V=7͉D'Nʏzi{|1_TV󖸲dZH&lڷhRQŊT@.R#` \*^msMa,vGj&G eQ=uQўA;sV6LS5B[k_qo}/x]E >m&^pLU_.M+kY_L"Nכ=a{U+8zizl$·->PdDbKc4 m͚D.oG] x|zDn㐻xv%۵FC# k1àJk,NdP,qI(__f#Ws$#sP=F4-BAwٵ $L²FD A.KnWn_m<q#]σNQ@*O.dVP$O;;H l}OhCCY @yvᐮ]Y_VK%*DJt>S`rcTϊsucmuEB̙첧, mdR./-Rv-h 9bHd{M$U:}o!ʇ݌^crV;sQuۄD v/ E.+vGv驐8S^7.I%BZܷo카J(>s.hb#+o%Q퍇?J?2eS`|E Йtȏ0Ow}i]`T 5Dӫ:{0 Ȃjqݭiw' ټĞνv+TPy١Dz#5(Q*i{4X|?6+W,Ŧo]%Tz[& v/*!9ZYRIpҾR4;N/jdJP_u"3@J* 94cKa >_a?:Y~Ƌd7U{.=b0cv=wvvuAT>x7X"{GggwomB7ǔ2Wj6٬D\8hW8>tI!KPx}^BMy8X}+;>(JaLtsc Iw4<$q R 0YA+?~Cvl>?jI}?]f d |L^?k#VMʇY~. g>1Hu,GoVLF:ȣ/FhǷ Zhˤh U i%jܫI$ܘsGf۶\忷ew֨ZaWAMo%HIQ"rQbwƒo (KcgOr\hVpOJ9wh%22jtZ7J5cQ&j]PwYwaf%!‘ oj̊!RLshaR<ہ ~[\ Pssm_JJ+;r mbXWlwZ$#p 92_% N.˖ٽ 4{ckqj`4&_7v{xd7.99JM4=ҞM!DB9N5v ;jZ2iݰ.}Ӡi=@ Ќѩj!âw9䋋D0<"("&jt@w9ݕL4Ak Cjj1lL +eRNl ѷ"ܨ- lݙd)SNaFLhLZWYg1 pHw 7BC5π9=ӘCcgE("`tOO`_94; |MC*KTbM 0QM(SA<Ɯ!#(QF9rDi9|X,2ص_mwVKj"s"%ꄵDYw̌Q-Hg* S"s!Cf0td'$cweyi*;f1Mp:o&䧳/&亝u>(xE5M19;^/YEaOBaRmrCqv|hnڸ. 59f) >K*BTOG2o5#"6Rqm (0% &S4ھ6g2$qBU+͟O&MzizSIXX|1H?J#jM8itV_"Uu=ӿ1Y];[:c|dӦ4Vr-r8%@j;8l)1$ګ 60xocf;B81Ct\BVuThu&ec<bKvP'QUUR"w`Iwo=nBQqX:ⷰJ!kkǰ6;lD4T.f?&$".udfijV@SLáuYSa4WzA@8VsB}G ϝ`̝*,~H݀ȮtqkHG0"b95\aABn%:rn׶Phq@ tPlhi{7[9! g=#xQ|- \hE]vccw.:'Vŕ O>i7veŪ(sU‘o e_`RsOGk&ge $zQBoՑݭj ^:lLQtG?^ xjĕ$DdFV>nEn"|]b Fc8f j~y$mm8vB@C+Ui(z\vdo@yӳpZ^=9jJ@m4;qBR:-GƋ)V'bqfaYE:VjR2m ͻ@-~0=o7L*4Eק'Q]Z;q =m{Q^-jD[6.DB3>O߀ UOp qbR7 2H0ȧ WB EG!:jxXY=%:}28\bHķC k؂FK-ڤV=9~+ Rk2K+FQX}y>L/nI ~u &"2(Izs(9S:M=~GPqkx;?aZ[)XqfW>JK 0dA=R89li{E0fBy m~zkiZ|eDHU:a;a 0M֬{1ĹEë$j?(\55E aer+.P›3G$vy/4u9Dnт|FYHҷA sQix,"ó#VrIxnl:.o/a?hMu'5 2Kp U *A BBIog!P̆O2`ź<ԙ3,@?` < jTG(0Ph.ކg>;}> l^hܹ_Q+&N*Dw2؛O ;WqMB} !9%5R/en_FbEӯ$-)\*7fv dyG[hmcҗ'8p \2">݉ﶜRhw^H'< vW.eFH}r#ywA&,F jm"8!YOt&t]Tؗߕu٬h%DuXQFu$W+O+}"٠AbuQǕtu LA]]<ȓ+]4,2Ks-u:8nҤFçOg%՗Id{IBI(f}"h|Q:˺l͞E1u%?g令LEpudtR~KX(pE?Hy&CYĎc0FHEoĒEר?g8WaXvÈpMۚj" xfp|mlJoHy=**<[6W$_\Ro_ep6oWޝqgMED|ioefg|l鍢ոiøːܠg̓8E5TRn= M ձaGGZqӁZdY4eIsmoX oiuX틫+A22{alMlI4gu#`f6)vm5|yF (ki -ӕ;T4tm-V%m:*hF7fh/N UW-'~'Wj~`\Ma @?og'xڗϤi;,=zC8VdCwȰ%'gDCc/.tz>2AuLFFTtq/@J8p+t6~ЀN!"H&oh"p3_f ~F3ppƩz6P8z,ʨ2C:3}u,1b' v49]w܂)] c؋=Uz|+`ޖZ-g^o?L{6+j»4s@?38a]y'+9_' ^8U:yQqW΅zcf&ZTyXbo$"ԙ Nش 9^0?Õ/е([BoIj}25veϼ Pz^}G\Ofad:GzuUZ]!^+2}HIv{tv%sWEfy #1'2WBScVp~a+GϕpEQ\kvMvZu6xl' Ȝ3?!^vq@w]G?$twц+9CizcB!!WGHEcFBUT¾GJbG^EE9o'lD΍$ _zS_gwS_-b%%YnϬéEʪ܎{ ӑ'fĄ_}R, XӉg-=pkӕͩy"*gNstFoyWqypj8CBJB{4>7&OoX=M4 B[g9;H/&Vf x(!urCĂl9xxE)ܘa*:zREnT)?!]v4x݆4a-0c坛}6Bn7:O(("^I"\+ؽ>q:NAqKr~% 6)͒NVLy@vԝ`{ =` ^(<( g89y'8kP<4Ϧb[X ʬf涬X}`%(?K2! :>!=}H\nϹ=~*Vk:}c%'˵[/H<ۡG E G fc 9'<,dmXQtxp?UtL_ĠЄVy ^).+$Efdk|PEb̌Hue&XyeS}lÇ.Sbj@L;? b*^1 ݻ .xRvSD]ȴo<웞k8 ȫUS*~%!5@|ۯOkaGmu O\مk݀S6X6تvG*JwAV4nX׃6Lن߇\9-ٵ6G,56DJ; t-NȆ`QO3Ƥ/Aύz7nLHP:/LA)Lp]㾪!6vQ5Ym2uex ()Y ]ʄE~%z|h94L8\oW8܁\prIӪoK$<$<3'A*N԰2]iGBf{-9х!MZP; J)(DSʕ$Aj5CZF-%?1_A]O؃Om+ť3&'`*`ˢc.QԁG1g}q^$4O<: Q{f$tA5>>O9c=vEMfYBbYG Ԁ,_umоggT졎W\\!ERSwT2@fPEi::X?%sDeΧ5 6}57`!n +]#K%_};/'/c a|KnZ-w3X|$І~w+tqTmKL$h;+o"VCPD$OĀ;HQ5b̧y{\bmjLruTϞ}XwL'xAk^xywv )gsKN6BIv@ g69Gćou8WZF?ٹmw6}^j@'Se^gq_̗.ԙjb> {w" <[ YAW\DH>`+u(;?6HeL>j%y7$쾿oP'ĶuRDEW0Q$?q~Ti;:Yo&8^}i !m\P+t􂣯!՞OǪ0 _,`tHv蓝`%7Uiȱc=Gɺ=izH^.f1R*K~X¶sW3af: >:kMw|Z p&jugl[ʍtUe]RVixCkkm:h+K>^| Vr,EQ4|2AUnPJU4k*؋੢,O\VċͭdC% /$}G8yb g}t G[J \|C F5U=yF2ۼǼIBixlEئMJxGwܭD@Nލk]Za`ƙx{6i*+>_QLliWZLba¨= UEQЈN;7C2}]e vHkz |%sW̬14ESQljM) ]"i#JZ.9]ԳWtZ2 pDzLdxmU_J+?c}e1 ]kr!ײ\-!qmS8da`{'w O'2 WGD8,ihJLLg@宠1\⣵m"1e&dwpyS$J;!ۦ,߷p1c„kP1͑o(K>}9s0yʱ-^3l_Hʉ&<-лD,$,MG\#^8hPDJF W`R;ތrkLoƆ!3Ob=1'F D`5ђ<K墒G̪$pxw@=4+ܺ9'I˓:,v\ Q濨ؗ;Q;Vi@DE5R5K3^j9 al|[D.kZ#$8=;xI5k%2Bbe6_a@#;VQni|Ȯ] dx'6ehvG&jCG2@f%)6$f_ɼ3lriY ?# Wi]"RוGߩʮK^]B(USsG{GG0BͶB9w`ôM-\U+,&{L;uˏ"񙧳Wa5t0)t!'ZlUy",(S^Be~(֠Fq5ybš&ԣ?q<'6~/tVxlh#h#onG]@Z zw`l#][v:B]gKP)2Bh۠.(#|^|KW KEu7`aa|*}V,kF޾1|-Ov s»kJ[ J"WtdI$UHw7\GίZkTl zM)%N?Xތ]1؅!"DMe^w*p,yr`zt[H=[DG4d (Jy,(.F嵃Pw0|7¶L؎ kcGO%Ye9,4dR_~s< pˡ5%[BfqSulkDZ)[8@plU&De;ؽ]gKcpdqdFps3G66fAeT fm7q43\kϲ 6D4H/"K03Y&*}%i\u6/*W<[{Ww;\L7 KTk[eT&_>k9:Wy\$4((s#5 鼺o:Y\ p!ʦxA^!p=L}0+pg?lRBf@E&cZ ꕞUqG6!'Gj[gQQp`A %E0mV(gn{uR JV8-80@YNL=jݡV=,GiWbV'/oug̹%J @KHLs J2ྗCA[7Uu✀錃>?entwC9@=9}fN@Cڟێ6%8ςZ~/=.%1Gwo7 `{N^[k掿QbD>-LpwMVt oX3^%QOT\#΁zh>.s $; U1,7U!b}H?Rd IS$`MZLJ߃2l4zG׬kxt`DMGC힖fE!9'Û\7!XŝC97REX. `Dp*ӌ,7 ;1\JoyQO}lGsGn ,E풧n ([x!/=?!*ս_rՐ(Sk3wպc.]u ^jp'Nr|!8qA[1HO uwͮX 7}ڇ.FOZ_pWW5ry!@ߐɭ`0(+rK t}˔AQ) ] :@;5[Z6Z' `X7ű^61APOÖ"7yQ3IrB@@Yg؎H (zA!:BF's^ >nԵQ.pJ-bHYhr%deiv0m5b.J2* $Cf=? !U&-)gsY8lb_R 7v3<+G@v~jWb'.L;g^ \,hf@`'U1bj)c!azn4]j2T☇RGMU =>~(o&\[|\10Ecu#bK Vj_[E<8^NDAϽ;- L)E&19.uiM rFxAy=+ P v4G&=KZ05qLI!SoMJkPҀ@JHWZ4_zpe -|ֹBjr?L;j6{-#b1d5\IDRC22 B06KndM$f\In-& DӮ!D#1] 8o:Lg;բD?bW(d`\yKm_5(dC2} z9"ᗟs.<_j $zV6yB;RU)ߏQډ-g'~o`O@-Ɯ>PR{s2 HG #E Aa"Ow`{)?>"X 'Bg-  F*Z#ĉzpkMj^TQ޶}?iEc*}"6Xشa+I:P5R+J:b?vRɛtH).=<p=$m ˄WIK0%w|,؞ W_bXCkuy%MO1S"V`#1FFaza!w~\=n [I;s+:A +Z$ɕH3 -R!z%-"]@tK(X]C:CZ3|+V{ N]`$r)ݠ\Fmv1n阏Tܧt{pk)A-aik۬ 2'E\Ik|\WѦDIsZ;u9xIYj=/BvFmp-Cx ;`_ 䫢B3"[&][: _.!,&Jp@oɕeAEWjՂ1'> հgYq\+7Rn Va!ށ9ɍGU!uOv9fZG,ҫ0#~blC]N[Z|ɂ,uMC5lN,= =2g{n6k Ad`b |a5J~|[21`QˤdˁL%kMF'MU):L6xI^tbE//AzigED<碪e%~n R]7FkmS>?<  Lyߚ6";*3DFi^Z(D&< Gb&%E|JC[^+E~+ X1B͖`z ȗV'Ax0'Fdxc( Uwv7KkgIk/ FL8!ַX{Jҵ'@7qsIGrvlc<-p% )03x 6XS>Ym tfeyrWb`}L^K$L|zaMƧ'ܜj=dǣRzrR 5rQE?>]RĬ+VљR-,d\RЅ+?hD93Kėϫp… `+4 I&a"_gy;1-"1_X(}s*(;TihEIBBJ$v?T4ϕņUo@iJᖾf(8['S`f|5#tCO=R+$h,dUjl{Yɡ1f;%ff%>nheۏ-w *Ct\#"}k#JTՅSN}My`WjZ3]Đv֞޵ZӉDw ܜ$ԕ_1 J,uP_y]zޑ:pR>'# B^Yeq\=acϬ&U+= 7is~ai6 |Ũ3g6m5wœ0.ֳEjLB~3t eq@OF/&Mw)9`hSn%# ;-p^ȎX풃P1}(4OO"dƝ*ݽdG}=N܇hfΙnsrB}+ckY2P)6H؃-?E;Й̿ɯ otT i\kHj~?(TF-̭C0R\QKb7;q=d9/{ }M` ,DN|hUW|f^𤹨P/\\Rq(0|D֬>#XAշ`P ,L@"SOm/!*SzVѤX0 ٢{P iwp t6f@w̧u٧B`E]5teXi73?xoN2 r:pK85~#A>sNg?oS^ʌ45Atzn.L/fhm)X%4RxrL6m"X7I,fBa}ArB6lO`sr\$,ޗϷ ~ޥ}Pa=֥:Jy,VIIU  n4M߰[}*ZM 0yoɕdҔk{@CI hZ<*X0m(UW1Sx.U)%ֈ96?)dc`AW$4hA]Y{Y/Տkzkx+; Un,XɂC=ѐW%pE$0ݹQ?A]no+E q7c#-4\:HNq(y$q=Uz./2Q[;[Xn9=s;<b[?LFb>o;]Q>9WDc9fqhoK@]y@zwҊ3/9,EaYG{0bM_\ ؚ5gM%%Ez#rVQfgXF1YYU|MSO4䲇l6Njy3>A+/Zn7a}{pQ_wOW8b |`eG^z8Q||e[9>wa}(Wkg. '*uĀv[yqNeb̢(&8m WqX[AYeQ|\$__.f^X8Bn]JrؕځG)Zձf)ž\uֵ&Fȣ hD$zHWPd5cz"#'?+V9"S0NhϒYm=imBF%rڧz:(OG(։cp 3uRw%d0ہnͤ^ꁫe5oS7OgZAVBf ž繌h53)o׃o{I챩'S"%O@<i?WEI#6a]!D+ôf_w\UNV$H~$p>m.\ҸS]VBgq 2 tM.5)VV>c8^E4#5Md/(7 0gGMPf9w Ҕ FPa*K'|)Bb[M'%퉻F?F,c2FjY\ =@*G"TS#Rqp&abOΘҼpK@3eOt=T#_F ~{j8Qb=un-g[rF{ G/VBu]I-$sQL 4pJZWnxIs<47OÓIc`1r (JmV3YѲ(TхՄEp v_LUw B(LDJ)h!;~IMtăFXz|.aLviM+>߰Izx*.w0ۻ6 ɥ)?N|Mc7:xޒz ^j<ӕrYi(̾+aK^7l7$,!_3/ lEaFS ϱ ˋ> >~[f%uo&|j@:,GJ\cՇ˵| '3 k9kA*Sf0)&5LdI"YU f<8qqbOXk|F4tDdҵ*EJ G,`5U>&.Sxxb7+˩|*H,"[g=;~\42 ,fRXֹz-&ޗ/OHA Mb#5spy$R~[>ns玥@\BT(ӾWV;`Fi.iTS=}(7OP37vHEdfK,>y&ћ!#{  /NPƯ|/`2#iv[ A^bKq3y{krs2 ȓ1T/j&0))مԙ`WO4 7\(S8$ tBzL NbǞ*JJJ5X݀9ԹIٶM>Lj8; 8|me&H7k{yf#$2qifCt q>V7|^ؐӁCUߐݓDf$/4IДf?IwaMzSy4ȴ<856:nHO1UEDC-2745l (zXT\,ـ IcBeOi.I m6l0y̲Ÿ )"d\cN߁rB#ܰcKT;dֈfbW:pH2krNƘjJ;ێ=r~WN:.1+n̚ʨv*IaOv7'to yTzn 9r'fY}X)nj هSRYGoΪIK?_lH }(ۀ,zH}eN] #TgKښY7i-d*W?) 'D'a/8Nԗ-3Z}Kzgh\䷁73:m*xm>i;0~2*J-ܪpqʵ }D]Gd/sHnV3iEf:+!$Zc 9|=^z Mpjɚv^4TDrgxJѼsYq{?6wME؅i@Wɕ~cqrkîr4M+n}(8)ʳk>ħ_1\ǣ裸d%>^]c>d+nnQqyg|cKR2٭YEx&͢}7~}R5tuKpYKuvK>F8!;s}SϏ yGq01zjBJKRJ?P1FcoDNW.},,f|5K2N5)VَrK_;W(4N` -Mf.`ۓyN6Z 8F306,[ޜ,yulj!AC\:U"ŏt^[>w-Rߢ^(9=tHAG2a.qdi&&dgE9`|DN?AyȮJ`[ qT*PJGU@x,T-5tS7J)ڗNaZ$UF{ܔm P|pYp0-%E{q[cS^.bś6+oسz>B;ظ?~G@[xZI9Yzj 濏dEeexէ}Fr<8}:YTdEw5A*m=}=Z(l'_f]瀒+9,?%K+=ϕ5J*Au8Զja,ޖVE<}AV86IͻqqΰOp+Zj;udSV M*}D8/MlҨQjX^K~IdM1ǘ9|C2)*7^}'2\z!e4V\ tɨ(uБb+p1q(mVdc -까9h;A7:CKA1uK#pJݚ8Blx_bjӇP~hd k!NC`٬/{q8E.*wa_$Dp}9ak=TZs/}<OVImw7vʵ,iFaFC4|I qW3o#rc$}* I5;[Z;8Bg@9 -:yD_TlJ )Q~vt_*(RǺ:[j2F<LN.nEHPOo7NqBGk@V>i.E˓W_(l/K-MuLkWːƨa,Wtmw1yDG]uc. rut#i'ԘA'~$֫vXt Q"7?耆!$(q4SwTm8{)5적A#A}Q'P↽F! ]q7ESP ('NN0/3:8G dexXv(b> u)-%#Pw:7HlqJIpHP┞; F@bp8ȑFJĹ28#QS>X}ۼZ8-azN@L[M02{o1zs&RE N4:U's}۞dgח?L,,rkl&}ltکlܨ' /2 $<7敖ApjW4g{qqlHeYNj^~Ok;P-!2 W -.笔,4$-{8U\Ƕڒ28^B32ڈ9OS]%eR2E]ԷENW0lBɎã"Dg˭j~h`Z:Gq堓؊6fGhSG^ aDk5BRQߴ֣?FBnwr7tˀ2 Ay;ٗŝ +/>r=d&ev|hf4G,]0k HoV&>GPse`r*#}x6ӈڄBdNXvOFGE@8($g)pXߚ;孭oH&Ҵޢȼw{6 yZ>|7NuUm|u 5go}QhDZ.L>(tw웥(Av+D񿪍Akg)pB`z) m+=`Yz8DqeOzD­%o%/fQKrxzx4C-W!jr9ɨ "ټ~- Dg0Io,߃0h'Y ~U ,cv ?g]E 9qF{6jP?|@/>5fg|,f ܷ /|5E7Y^ḀkSV U}:?t q&,/tolK{a..O'Lq,/+4g#f0kЕ|nKa7"gj@npZQ;p+] `w7*IF ԞAM+8gWn{: :VSF*Lpn@<(}apA] 44}k-;^EsScLZv; F̿Teґl'%u҇W}rbiF &u)+S֓x0#˅ *{ b4"YmMFTCG0?Yް`[5A5C/(S u1ޱ:cc記( < xcw)UJ"1vvO ɏn>s{]<=}9 tB-3s^5@5bPʨeLFk[vw}TKWEtb㪩iǀgXkњM9@d`9m$x2!KddsN45P'̡]ɥ,7B|05 \~04] 9bWipu`ʻ`܇:MucϪyY 8;^+&9i!k; 8tY>.{JW˟;+,@L/{:tB7Az3%)?KOD<;V' ,ܳwlȐضUFP$܍Њ45ksBrhY<)]Mȕ. vdÁQ f fŠ; | 2 Xѻf,b>.6>ukӤ ENb/@oPbc 3[K9rض"CZTc7aiۗ6Ə@4(lT:D{-5-XǣϧCKb }iь|F ZmVԔ17{`ïA+Sь5N^ؗ#Koluw\_5 ^^Cf6pg^oiD͟VbWC&,Hz1S)~9!$; ioA;,naES@Hgx +{ ZQSz0 D2g&OWLE×)b}DOcaX wYm|b%~-щdi։y\IWh.߈Jۭ.n2-ɕ;̈́.5C7x؇Z+Sk]:637ݳE6`7Z ]@rIldJrv6$EVQmX r]?/j".a5*/2D~ *x(@ }(\5oKZ-rQ}Jc)sŽ{ۚbRը>C :r,p:n 'k[9f# 赶\JęYbY|w)/qS#w8B 50>H)Ae,QCLJ92ʤ 5_k9)b%lT.jѧ`oY8ƍ$Wwf2q*o R:hs+^l@IdD􀀄$\ъ״5Pcʎg.'KUiPv򶽊DBTn_\2(Q/xYs>IO#ur,ѥK@X>+$fN%#zpd3Q6?wዹYɼJi~JBH/e:P6=4 vD&jo[DD%- 3"1H R~~~;yH{ϹM~5|iO$t9LX^"eM>o, YyΒЙ/S Ma _:Q?ħm-m~Yޑ@}> 95Z)^^h $hL;:F_{<ԷD2eLN{Pd~o ˤ |Gνviv_W&#O7Qk<#G7 d]eG1քˆXKY3E: A=| C7۔}{װMo_{نe i7F$ZB{=jbZ_6 aw$N?K&oJ5}K=콼t1.M |Nd#I ʜp7 PcV{cmmYn~K O618[00"{ٔ=>9~>=N\2:x\apFBm)͗b=_V#)PJ]~+:`vY,hvu\OeS~ FwM`<9or H4 <[Yl'D gM{ePFGTA[1<+lC R pS'{ ]|m\~T j1sTWN0NjWNh&7 'ȕ%Ύ`A4cHXE"IY~ %I ZbU! (Obvs ma,Dm7ւx}I;8֤FA4}FӂjQhvNiDZ&nӋ|.WBG[uB?G_kxta5 F9E A{zyCACDBѝ8rPT6z,F& k݊Q4]p#K;4%$UӃ7=ɡQ#Y4Ze͸ kK\Hrf/P1f\[b`Բ4lζ-ǐиxcv~=uA%SgJDJۡ.ieL fBb䳥V]ELuXXLb?+Fen';ksFoH#/ h/Gn?_nnuDЩ ,YϚ\ɥDNRubH/;F)#0qDhz`t;LCCpHyT@tՆv+&y}c aqaQfZOm٤1b#<.eY'PCn*8nNe݀'CAt?? GXㅟo*~Rudabî()!3+Z$Uv\ 0Շ |z( ZƮ\-Ɣ Y4üUp&L\ 6yhݗ uag݆ÇBz/' oA{ǦfD],$"BK{GvJ[.佀2q }R2H]%m/4O~M(\eZ4ZQ%-le|b۵lˆ9llTӟ|POSUM$}Jak‚ O~ABk_QtPJ*EQnӼ-6>t; S^tYГNAy._`%Q`dJ|&%C68T vmKPz(`0*7\=Xv$'j )jlMIc/zԺJDAN(P\V=nQM1Ly׵/TD71.ȒK>Fl44SS`{حj1h`lu\ZOޣ9?p0a HZ=< ;V8;\Jdt5PYB@,7DbQ:6s 4ґeLYh)=9 %n\`tTl0_FK$f߆a,bMa"8#2trFF{"3Y9-N* MRFJUWfcvԂg8ωTK?1'aKutۺl^,Xygu&ƫ};I9I.!:cffSD5p +^#<~%:+k"q'L߭ k:;P$r G.2Q0 t:GVRz ]/ 8,%w9^'GmI|dTkj_=H܅It9%pQ@¯ y|)o!}P Dezt O 装C^,6Vs: ^NMhiV(;al1cW]eՃLH%vL+2[$ 9#8d,~Hb?5y3^&_tA TlN?HC@/``jϦW쭖LO` :5Rs~jع5cOg2G9 a)G,lVZ #k,isZxc'{kx/+ZdqF05q`_&$U1[IObH[ppMO_CjNڌ"ћ_Vs-L(.;LHN[+b5NЈNaUdhP_6r,gJ^VޚZhX+s̞,$&G?h1ZC:AYR%XVGƫC7@aoyc;e#'8 i?br s?9ɪm" Ro?Oa0RxJWS-F,6y,.ky l{Ka|!K`q)TҗzxP[[na<(= ˊL3^ıEP/KCH]k+o ځ7 GCy)])>Z6 l08Na<^M2Ӭ67;\pFn;NA]iPI`-YD$R8ı0oIDT9ܓB^_tG`0m%&H1YF^[sr|0'zεym7b&Cùa͔c/JpC&:}KWWOyciY2 uƖADo`쯄oL :U`!z&T^5-2D侀ׯC:T 12>UGg/pfޱ$)[3qL6?V:ݬTܻ}ߊrw'x+zv߬r/Pq.{՘Қ$V RsgYCVYyF7ߛq8Le5}5{_)&j.SvWீC;q"2xRٯx51!JӢN8Mpchp%LN9h%_|r#1e/և.V px24bAؽKl'2/3\1`ڼ w Mrx׵vGc gCDP7W@,퀐 $QtǰvQӉgu=k((H8]:c˃jpPWYR" v0M \'kc+4J?pnۦ5n*!0N/1:kl:puJ 6WܥuPzڄ!j$s odwEiǔ ffE 1QNŒ(hb|~f/巆􊧆}6>g36kڦZ=|tT栠3 _-K-jTŘ/y'Li?Ϟ}:b60\xW!z1p;'aGK' wG-[&i1~ -_p#!⺥snzJZ_DU[ăi~6 i^ItpJ$h^< b 1 B˒cVpyY=X.Zg\WvGp]پ/K Ɗ10f]償Slm<3v0+~vGbgva[ycH⁨FĻf; +L AHO\[41 fik\<{sgQ Z'ȝw˜驼HmGӨCj#DZP"L԰Aw7Еg #)18"YڸT|INR\GBo@6H 1ID5?RE5AR\LєvGAsn &*1wV/Q+eȤip2dng͚wD^G7L^_%Ә@v[uٹM>Qg(mN  )">:}1*EXbC6D'1wNhYW.Fkv OB4^fP:X r ǖ/$|[4{tMe^;O0k| CCCg)F6C>{+{|SۢVeQnV$vEWv9>JM"45'&hIMQ^/''WOP*$iJ13Ƞ85w7uͤf.t69Z9 gUÈw S|9<|I431c0Evx\Ɗ3ʈ N,X̓8@}7&,(&rb9շ}HpYX0T%)N2+59)n$}$fU\,CbguI%#޳ r_ !Jk.8IH#Ls+LtQƕkEdZ>t)VC@c6 ;شR&?mK0fIUZFF#]tclCnǪf X.úćԯr9i:uELPqHf Yמv os9WJYnaJC%١uhRh4ŚwkDV@p3=z D^%/TMF4+ VzcD;~˾iբ!75(%n&{F=f**gƢRtD3#pBऒ~VzTC 淉ÛaawJ ܭ%tڟaa NPz ASM^}bSWEQ2 t8^7:oH4hC@ź&Q૓H7dTtn ǣEhbK^ş|{/>,I9NM)^+46P$wĂE7B4D}. }U3|T-0>l(XJȊe6T1=N;(x^+U':kmOT#Ҟ 77lzԹ3W,E8љ/㋞B0jy;葍4#|9]Q^ 99<4!3A~ߛ,Vs+Gg6YO WG%hU.d(,To ȬR3V+BA֧'%hbi?pFZa-WGI8=Ԙ:Ϣsi)7%#7ǎq ܗ@=k.[ n %bt&_c01gDN00xBZC*x.<>ޗ?. )ɰPůvG}j>Q{5 ~l;^;Iȯpv fC~!]N߳IN0HqT}e`_#-vM'RN'Nxe}i]MB/^@>10B5j~Exp'_)hgqG==0 $A89[1m쪴W8qyN~\1Fg Us,&M׽,¶(!^KͿAc3ǚNg2q Քs yHHj.aBmg=ooD˯,$;l֢'oo.a! ݜ{ƅg~$? 0z*D[1e ;jj&$kpztw  D^,".|騇v1 , ivŕ%Fv?sL"Gp|(Ą"/~0P ¯e},Ia謝MLdٔ{Cny= {{Ƿ`Sާ]'6hK,3x[;.NP*|bKoQAW z/k e7;7B2?5u. D]mȨyzVu~X$%p)LL܋?|BK8Q2p .hJ:bFD kznJ3I"iQW:ϻ- k6#8 6K^!JGM91sh2(GD j#rBdjn!BF[t'K\Gl(&u#'}LZ?C8 s>;67AfwCQ6@DHZ/Ә v(*hNRӍu;uEs7R&e7.y47S8{`:Ff]6lK~h$P۠f6#0i}يE mlhV?ST E)<m;(L=q)O0>0TS@MſSyًfc1qo*RK_1G2c6oPԯJ$'ngp$QT&0çAڬr}{3,5-&d^@Zr`g/ܧmf-,MY_-c͌IP 7QX>1aB`B߫ e_GaY {cBzy%0ȭMW.SEOx4=\kF$dAP5d8“yVTBeD&NA`jfWD Bb|"!|7=bZfak(J< 0o͵QZN*yuNaiMf[ Y]/1J. `xu-kmQ3p 9]\L|Ni:A,XU"eӲ |f& Z3}f“r/E7+U6jzU-Y+j΅*v2~ؘf՚NrD S`tdsM) -KwI'U? 4=/ډ~(iqd_vby:bT)E$(Zqf"7/YjD*5bœͱ"^䷮ `MPTfYuDF"!B>ؖpK{٢DkhyeOiD=l.}DfbH7ca^x?yMB~y~ڲR{au kkAM]U OaSgROZZY 瀴R4rxW^Xz6I=&s{UUfo`oOkH0@o|<ޔ5Id!>XLjXNlI&d 2|KH.hJ P?KwNC]Cezi`kq ya.'mFL ۵PEK:(/z"eA9q̨Pj`wSn&"W4?Ne_&P7X1cZoc`#\3V.1M̪6cѸm_a@bAKݟd`qY[EB]l_l,EN%r|UL)ͳ?n75Mu4ODYjmY rmCRX$Q* ◳o2&Y;Ay-lA?NrGcL߇%;&_{Tq(SOz!]j+- r[ڥFOՍyY&"쳄A]OG%@ȅՋ`; ٚYW`+鋈aOd*B1bd>E6gw:b]cn]Uퟞ \iy+aٗ ^k8))Ϋʈ3iKX9T;1˄6"Z*xt_G!5QS!rc8a_N'a*KoPR`7胪As-=6D"/$\[=\4zgM F"g@neb=+4pn|(e,oBr\șxQ'&V<\#A~In_KḀU3cdx@M@,_HYZKmWHX?Y29msJߪi%s4?]hƔ*0ZM9v mJ(L_H6MT)sWmvN"%+Mcia+ ۏ~PŤeERRuBԂ5"^bw\EFB"Ug3ҶkǍHn'||CVg_r&N/QsL%î9U2ή Ø`!Ȕ<- JLyDL4;P|Xx ]4:>LÐBɬZڌp(Ϟ;1O'8dd.Z8ӫ(|eue Flq,@8/?G.}- 'bKwaJ^1~TUIz͂w{W+4)cMuX'*Spxkf/ʄvN"&Fל4A^{-&g,""ZZ5jnQXna1eQG(47%xus:/=x'%P Z~יoHKjH/(ʐt I{7%rN`H9gq 1{BU&[ؑ#i"X!@68*ʭ )S-%4A3\PC? 7? fDa&4G"͹DmI:aQĭܣam!sAQb;Is|}h*YBEFC$i"@1,Bl99X?t=?.߰EaIvhB7jXbL1jݝѧ})y! ('ّP 6%T3s k[]EB_c}PN9hsƊU'zC5~}ux&m' S#)"Vne5j`B^#ԉMՍ{t pk7!P MqH5>f-}3I[֗U4$(~"zm!cdC8?O&Eu;цܐFAtI͠ !&CޖeTbp.G܏Sn5?XA=r ,3_?A15ȝs6Uzjx]! ;Cj:WFb),ǡ:=KL;RއS/VW}Zѯ1E^وNkzv=|=/qK4|MO%  (0 T+Rqt~uient|ș KѷJ{KC챣g]=ldk%P_Tkڦ6vTh$ZhPRfNpU1NN9ZoUy @g«ק(?#>9EltqoZR]?ﳶы'!%MhkuIѲQ1<7&MGВ: Ŷr+.[*Hrvb׀x(,_DQZѥAYiR'_i25acޘ|O7@sFxAq`x}B`OvC~ |=9#B/xW:UC CԬR{w+AI)a+/nPC n=>o2/ u+Es0Y{"Bz7l<50жM5s.xNSpv8u5aZ)ÃԼf`oմ@O߰q~0/$9`b +߰ Nd,SEX:}hws1 /F;M^Be߇ 8*Q y$~ Pv{G-<گ],?7g5@Pɴ%\VGhVD9uOM~|OţϗMGc (a<ݲ.:PFI%ׄW"q:BC߽1L{Ũw\vؠn]N{XlB-{ʪ4NL3D2 o*sDrQ ^qe~=t5-پtoYisAyޤ+NQ?Sgeˬ ,z/=5lկO2B !YT#5}T| 9ĚE~w֞ܶ?ioֻyv>!6o.ɤɓ E9XÉBČ= k:;6`ŌVR?eʵΕ hA L-3ΎsUGҬL4z4`!0dh9rqY>!k;OKL߬ܿTǾ=on\tA%rD-ǥ4Àh+۹7b]ζ"4?7~š[~R >X9-X E%P8$9mcrҎ%=n3s*ZD*WrG紼Ʈ92sO/hyI>&UTLiG?r9lM4Ji{1!^[2a6G 0Ev3lXv$|}6K٢+O.\ȦHXC tI+$\܄W43b;r[g0˕HP q˟Ã|l[2V EZ0,QLEkA`<W] qMI]~3h]Vh+8Ay#j/uPň,0՝e9TZ}\:ɜҷI p;2g%^mtr^Q9Y4aҡ۹ ? Cڈ\sR~pGxBJ2 @$۶:4<_͎{&>Y|yK-&IHFs |hSiP(>쮤1P26U\+/lvyh_EEt˨F/ ;DFb}ٞ.z9,4V&!7Ӧ Czk7C]X1) e2U];%_Zm1S4-ڌ+ga@@֏g dWL8m`Zt Gѻ͵L4`vμ3V[2f_ko0}JI&4Z%':]3\T J/D }hxNrቫt)``!fP=qi$z;J4'%y*Qj@^4E>$S?-WêiL@V06 EV{x @*L>BxK,KWG#L{ kUCZ>R,2t1L ْK}I`tS7(ԋ-ҨLAKMY3Eq =Ǘ./(I=>^7Ŏ& C0zQ(hO kI͋}! zLeuJpz,kW\Ri;ҫV KAcQIX R} mTFsuf~J;AgT>pCOTo|>Q &abgzԗތY5 Ruo55>aiӥH{ 1R=}K_,!d&k2!QESj!M4OiJ%0Q "fDo Uv0$H] Qf_CTLuL1pqJf^hy`-cJϖLK$s4;Jg*%JiE<H)$N9Y7W60ΐN՞ꨍV˦v3POa 7Rq>s6r= F'ϿHa N0qEkv[ywR! ԇ"W࢘aҷwUq5XGxl^r&s@Cu^?>RI5O!lJDq/"x rrkZ}6rD& V-_et݃Nr76ArXQ;&@'3"v0/+tn?1tv[a((nRF."@Y!`T"gb[n qO 84{Ïb<4z l;&Wkt%?\( Y Ń@WJa"?L/v᫲ Uy3p hiS_Ϙpzz@m"^󫩳yS_ sr`ot<9ZkWקeXUu@(a33*I8v̏ԻI8.n3UgG]E'8r \T&.GX/o +I3&mp>kA+͝SPM˻i!G.91kmĴufJM:?jVkΐnB4HnS_WQr;2rIl\V"5oQԅW"Gǜ$ݖ4sbZR_fw¤CT!=!B.!Y JNI%x!h!j4zN ʚX7Ԛ*U-o+h7P,%`no7v+#6z Kn2'z 3|[skOH* MeYoRBQkΝWEr;b m9HP5EOWc3^7놪CSWvl3et\>;/s,?*Φ4zSeKyXEUUj[ 8SR0|-~pJğ?.~a19M2$n"ͧ,Y_Pl_x[qUkFdmK.jFP>fj2%M8!2uяC5Y3>bCQ4i=8~z>ԍޡ9~ 2=5wLuLSц߬Jw'4]_8}fEʭT"Gpt}nQl4h 4ĵo0bŘNLjz"(^[P ULP3^V_:tO.Bw8E4]Pc"ե:bˠA<`ncU8  氌ۘ}z/5Oe) TWytPmM{OƪCE YaZ|ެQ=5ag ~.-&FNM;pe7f jM2h6*X`Ԟ}hrjͺ= H 2f༷{tD={P:K|ٟdf;Di ÒCOʐ fъafWp7" p_* y4&Տ|Yך5\XlDڋk (HZ'QH' P{XBTCe/ ܿBD%93_(h*`Ҏ1OiVEZ4ay?])`~Sӳ>t/@^ڣ0:4cUU,`ɱr5|h83"\~nL`L"Z ^ӠJ+B^vbYĴ3@B 4r{v ʃϮ n–1 oTdgJ2.dDTXLpI$LeL S*l/)"hN? ɟ^xjƦ)T鸍P}DV?+GwKeP$<Iw8y;ڔ79-3<F/VԌw:9̠'au {~BIdnodM&A:kͣcɛCBB_0df;6+(/aQ}5(cwp:Juy$nWWT]E~3wxw=YG0~#C"S,-xLeW!o~i܏UN8[hTIXޯ;6zq1L'5.0nM  RUQ<2 ]1#Yz~0UEԁ.=^J,_$lMD^5{$fj-]]s j4ty2>Le=F& iywݵ_L.p4H3 S="yp9$*&?|ՀH՟g*4L>WUjIN1zʫ5^YMY\y&UI;c/ TTu|{a»&uǽlS /b{-Q lϥZ$L.ejy,U'FSTE%45`F|֬h\}^E&AwhhoXa#ݍ>hwѺ`r-eYCjSrC;V?w`3 xx )QCFSdk5k0%t:(bRcXt.KVeҨ^ R4OGPH L= "!TbH0#.&}.a8ȎHI⃧0 шPr^5_5%+% \НIg;D׼KZdAéɬ?hp?xWl/E: QźQ%ǍA:?ho7\ ' ,ۺk/?8AR_0XO S͗M,)42jt+JJ<xhh'R;:7Ή[Tp ~Oek0+I4ZG ;;PH5JkJ3#{$8OTDΌ$xljlsHTkKMd'wrZ^'IlkRW[g QE-{{k47x~\u7"&09]aAv`&xgJrɻ}z^zD}CqZZ- 2( 53[kB2x;Pua\as~`L/p-SճoT3@ermG$hK,^x´]m,S|j0L y}ݪiljԽ*1l-F~Z]m@.I v(}|o[10AyIK!WCV8,P'RBIW9#|Y Vsm1_G3aWN=ߧ|H{W7aN'jhЏH17[Kkxsm@U~s:-}23Ss%2\Wy (4# Myr܎>4,AL!e H0({;TnauVgaKŏmbT^P%8 s^5j0.(;GAص5\+~d5>7Ao*Oo׳%v#o=vC*IZaa;)-26>QӲݽok*(s̍O W۪(i4ӷ57d*B1oP(MщuA/~iC;7~CSD4cD:ZPW'A{-fQ%90[\˫${>y8ipڅLKƝx#o"'r+ 籯+\4z%\!=L3CXC$\KTϻ(;=D$m D;TWX1=|,ڂiy_@E-nZ_Xzt|V<;j7v@=dV"'z" 4ǫ¬*tWt檜7E|ԈkR(Vw0+m(k lVrl6ieOϽU;A,6<sd4KAs"3IէEnR}SlqG] ~~E]|`%k_ &*i@j(_tpaAv|N>{}[4=7fb3t&{پSR8LrύeD=,* X@N繖Yx^ߎ;c~zf}x˞S^-X&Lٞ%A֡ гD؄95[n^%q qw!d]6eIJ'/耥nS6")<&8Lo1T"_Y澨kXBX:?m`gga75n&EE1o!XGt* OR+ŀgX7,Sҭ`P;(m9d#B-+?~`%XmK@Vi]& ƽ?(~ۅ1;oP!p FU-p1NR^dRU5zyн1Qh̅-;kQ/4H(EǬPz>BY75־rǾ+fnT5ӝZ%DW o=Q*q_2V~MPzVtΕCa)Z !sk:UT!N9TmߞT{AY9hG<Xˎ[`lvdB0 C @$xM{cc۱(Õw]7!:ldZ@;U~.=ŀ֘᰹O\Mw=lTDJn`ĉ@Um(Zj)9&& GKpv3coiwF^D{]Z5Tf ž^' ֖ %$\̱9@Ee:3pnS!ʚnWx+o"2Y# v{_n݁A*32+l:t$;-佇V9?VvkF,rCiSѳZJN qT݉dAbNORsH s;q\qO!?q:J|26.uOaݿ!'1hXLOG:N(+^:`b{J>zjWj I=㸱o=+(یz,`ԅV Þ+"Mδ7˃{U ׅi*U<@`\|[4@29$BJ'yS @Ջj ![ƭSGR76:cﺱB *J~?<$1}?>(l.F !;3V&c`, 0Je'r;2d)΍5 M3!H-`mwO%TQ|ڧ A8B%g~=*O0\0&^V (O hT ֐KF3یAZMװ~[cFP-s75 _X W`$%~ (#|⧕-+BjiAFD8}yC)ønƭwpcYBR!d&|_WRm1$P<,GڛZW-q-=XO6|RFDqi=}87’cK-8Zy ]bz=E\ZH@nbdddˍ^Xϻ4pJЗ}}=`*KcA[Xr9Ș2K%㆏}9ETnm6vVcߑYؽUArY+|,oz4d,ZJu=KѤx&!ͿNOų)55P*C'}"[S1;?2)Љ1+j,ӻf =D?;~ -vh{ g}!6z:xwXvsV(a}39 Ц6fp|<b7?⃦5gОQmb٫.rf[f=[tz;7:"mb_(qNq7/0dYH~o_YJ2)HJmR~g\Zxeq!X(Op.ؽ& Z3D/,- R{` 6z0xbtP .f ·Ƴ ؀4Tj ߍwAmmOSIaBޛ&j1sx_@=F`+WsRǎQ/< /4_ K&wo.:[ƛ:{$_v_gZB|J6ݷNGmVSLw׶_`FY3ZaTDžh?8 9%4!S6Sj;8Y@wMh@L<qot`QLv7ГO]mY31&k\J%+b%&KJ;x7 6+nc|HLz!0šhLq ul dZw͋\=aΓb9?HK[Ӱ+5a=1C#AtDwGquUOxswؘVCRj,-YħPYRR8}k4y&e A8 Ċl.´Eٹ۟68q"*;5/'}\FF7 t_V0L%jE@\-̶d*ۂPMXݖu 䪞ԔfbpU[MgR3PF<`;SumĎ}w~;çd+XܼOοwP~āGn%P8/05:V3*Xb)z"z'F \̠nnB lǾ+a E0Rf7= Y`EJ^عKLz(iQ<#t,1@ Q{ A֖]L)6h h5d>]}W{=1# LFR٭L Z?NVM=p^S~^y2˟J *G0zMAQ]TD`ϲ'L-^:lH0pX3D \Jg  @@ 5 }xv^T1iق |kdn@֙юzN,օ x҂Rpyɟ=suy ^yO * vERyB㚋DH{Un~ KLaj:ͷ7eedϓP.m/FmayMx(~]`⳨QJc@d)@칹 3AȌ0n-#6@t0KVG/GF&!X\-H[: Qb0x['9t8k3;_Si޹\`G+n]]<4Z7A( Ja d2os(VrE֐ a4]$F~Hr3wH]$?+$*Zpf9KtZ'%fIF߯k `xa+\r W/&PD#@_#6f@' *F}`hPjy#] g+]=G~oø[Pu\Q3b}s/ăw1N@# [Ns.Hek|sjr44֞mO[eZl%垌FȮU⯖B@_ٍqXwRP"AȆ:e.ǩ2׻ b<ۣOQ1ZgL &䘍;>*\ ݍ,-P#JҤgЃ=B,],N/GswЀ?{Q[ힹ1ⷖ $kcs:׾ p~k0yC4(\2Q-I1nY(._l`=Sr;djIO p?;k,vd͈+\w$El:~NL$n|ۛ*DI!e?+ے[%>~R g>+Cjj`6-4it Eof=}#2Zp,Yp dPNCQ˭J72^aO" O'-?YdN%z!҆MxZɽ5qEePM_~Kgߨb?@/<=8rU. =)rspҜ#D*G-+͗[wA%PlqoKhwuYJD|8ԄM ߩc}yɈ]kBXapt\_&>SMᚿ]AXqLIL9{}å+cK}'q("elܘL<)Ve|(._"?<3DL=D)q=wMfgH (@ $D]Xj Z8{ ؎e2kf6Dɟ щG@9RÕۮCjsP_KLct)s7f>5() U"nLAxحT sU*5y|ł h`~~i a.T/ פ*?Z^FdT2;R<Uj)6Qsx5. sh25\T9rV#+7IJKG* drʊ1"ОNUz"9uЇj;tc=SWTYtңծ |WY Irv]4RJB`+n*()ڪ [~_=FQ\tS`4T[#CxUqR=:g#m%#`Xp%@ 2e>3)f)Lf; VoPU`ہ"O~'HI |\BHV6|J ÀVkD>T?CПC#ER&q%#&Y v$ 쎾ì'I ݊$ sszcͤYܘqJG Rd>J.HA]}&[m~&5_w,: AA_yE`/E10N?LfJA\h4[,aHsi~t4od>7Ű^R,}-ͲfWfӡ|ni]{b:V$龨daL";Ey0Ks5ơQ?9~SRFQ|;nQUȰȐ!`1W&bÚ h"LHZl}q*n爹D(%;mq@$(0D߸к~! 0>Uw?UܱL5P4F?gaE$)0Ń. l+{EBhYbrJ@ 46x7zءbs~ZT>Grl1KBz-蘛owˆ!n1͗1 (ܸ%( Ćɏz RZ_} ;wM344 L.,mdޒ/qA+;pA1xVeX+o[ҐSƐ]f:h^uq". MXIl7 4+kkNNZC\9:~Zq츊:ajruw AiM ތ; G"UP1,&>~xp!f:(W'R Au$NOMR 3;ҦALoU}l׮jꈌ;ָm,EcId W&fʕ[%[r@ aE}@:!:CsX ^cn*~}Wb u7$q7ouTHŕF[NN횛Xy_Zڴ 8іZ9ߔ` 㠹mσ_-1ϛJ6 d\3Gӵ;zEd#Va]mmm.< kBOyg7S`$wzps7ȹQ#sPmiV&nl Ոj+y[:Z՚TE>Y4xQAExC3ki-YXOCj;]Ll^9WeObTZ4(=K* #M,Q&9\ LY}uN]FQb* jц/Lv]:bxQC֧,]}JMho>h^d(? ;"tI8tt^2tHm0ɚK$%fd2vLϧ>Hx۷L]- )-u1b,"%Xk P_*wc6NqeI'CPID+unR.%')*.S9W$#:׿ Dd\*p5^dyc ,o-ls'LGԫpʉ OX/8FGjBl06B R)L/u6qaL(q v|_=yQ(J.(.&S}b9eFu)58 6"Rb#B~zFg+ڶ|}Z o5.Krz W4J9Vvnd;9 aLD5^ր\s7785;/FGTUնaWh,ڸ2>oF Z u[гBN)ud?]pQ+v?8$8_ NCمDg6%C'idXWQR/ZI/<\C/2m]c۹0'{ąWD=׸8^>M@zg]5 %WYԶWHXϊkrKW 1SJ hP;Pk\(V5qJ؅MB:QqᜅBE.*:y3 ,\{u8tVW܂].M҇00n/wĄ<>waD|XuUCsᨾa*~סJ 񿏷qKr5&qOʭUАR|TZɠuLD5'O`,]vm9;DϬjI qV;I#RI?m[6fwB¶6Pǽ|rj\xgVŢ6iSEx]ຂ׃?rF bͺnQ7ϙq4.dz}8(V1Ӫ 5*. akQ=Ҷ 7绅i$c.!jcM$\~&YOgC ,"_,~y52]Q 'dpBg:TbA g^{lL:_n81bD %"`@!5Uh/:^8Y~AtO1MYhm͋n Ta/F뒭nKw\:UQ(FQ[6M!^eGa*qF/6X{9Κ1LM4'少sϗTI1YŘg:F7kɻ?Oguk8fi姝M9& -HGoMdQh0|=q\3#mUQkW 7;_(@[ V\w̩4) ]Htwom$aP] ۼ$#-)(ܔmf~$kj&4.uEĒq5C+WAkX*섫/Bj\.:djҪ".n>[ X7붯 ++d>TRLX@қDdo#;"['* ?ښXQ>`AjuNKE->p2PYB"2">c iÛ>6e_8J\W8jߵG>TFσm,\]o+tEJDjn{9RDXa}R@ϒb MHob@po*xWCCTӦ`?;WdBTA l/8SGvRlu-ZghOV)w"[~16q$]9Ĩ}J)np BUi W aiSViQvkQ0+GS#_ٟ8adSjMJJTK\̹o 9 [?=8RΘ bVzJx|GCi)S%n%Kֲ vG+rBd6Vۦr*Oah "eot,:^XmHvg` Նڭ{Uh ,^+O`! ?yѱ@)~7ZzPU<֜Wg#HdWي@nk|bjY mAL{=\T Íw6|D5&z;Z=XKQ dpQ"jtH?TaP}$k`'^c|IWlrIҙhu w؆1/ʢ\PKWq9&@-c| !x y?.PUny1}_7l)6 [XMEMڧ8$l`(z>46ßX,yf<uC'q'B^vĖ@7{|aQSܮiUiN#@vuII&4P"-n3x(K83371|>Vzvbwj. miGV>`3Ь?@%bbL+UãN} xE'Hwӷ72Ht>R[x[,mL~eꎧقM]"+)K-B*ɮE9ʏGt4c7|ҩ%~л/Ee)u1 R5SLFIh0uPDc$^roltjn?&AZ5"/aQ:vq{OnfE>O@~nE޼~^sFAe EG T;Kd (gNu#k vVc|:ǭdñ0g|Gda*g;i9.%6.x&em&-iheaT,lHAJ9 "{}VX mΟH붜H[ʿ*`[{^gX.d2X^v^*ၤYСWzEQz:#S&VNɺF1בq{o :c~PY"$Ӯp0Āo7u8/5";Һ\@A,/S_$'IɌxyy妎f=.Y\;$S1XBCuOgj$¬!Yqe+o{]5/?{~\amv  2`Tޭ ρ[٥ bYESc]lS,ci)Àk[oϗrx wb'93)X*s?`e@υah1$3GQcxfCהHzP̆zQ]Efx4Lr-Rn=A i$jde|ݧhWh܇FI6X?UDZ7ZjYrHףF:n:5:@ П(ٵ-X1&0,|==N(HaL~⃔=g>KBzg ߧ\ ZGdMyxK_+Ԅ5`*m r2^&'ӷ0&3>xRNaԵFJp赓XD̀P6R> mú%3 :s\õUloe4+Zx뚇Oı7_DCC/ZW5{z6>t\vy'3o#2ߋtC4_*;|&Ԓw_`TVEj}.J>w㦧|RfWn=-B<*i~ ku*}[ny ^2Q 3J!6+BGc 9t-*>G" )ǭyČ'k %)ǕiB]P=J\ծxN  qu^bqPxfo#WKe(P-~ R|" SɕOyzJƪ>*R0-7>̫Z 9wMJPFԴ\8fx^JoX'J n e5t:cA4'!2Tp+7!J$9[As8;&puUIğTc@ f&_jAMVǴ;_U͠v b]Amh;J] e,BݡиnYg8+],CU'j|K`+mS-QxݞsUJyڊ)K t~\}Wh[yBw> BQTB. u{u/բXpY1Cr)B{@ /1 |Z=S;,Ps4̸O.Q81߹eو6W'ox6x)ҹ$舝g.F {j:2 tX?9'7\WiR^y,]z9IGq&0ˁ+裏ͨp0}㉘Vcu'A](93N{'yIzuMaC8o`B7]g#_\HW+hP[iKFa^r`Z`Q'Dq*㔝LZ{=2p Ig?LR 3@q} .=0(f*M)vZJgxƖb8-.&5&p^7 D=1*ֈ6,>&dɨBiΔl{-r*I>X9KM׌ElpقS)`|l y͍A5ÁbDUp($m| H|$=ԓ|׵ %`jC[05~֫%AŏD{Eu+2,u]8ҡRQ({zw,,c]QʿtqD%:.`;svYo=,SX귙t8Eg `A1".lNTvf.{eͯ)L,'{=e2wO]_Z1{d/@E#^0Ⱥ'inٷT^JS99WX̺:F wE$Zd!"A:jG\C-K1ĭ·;XVx*^[o8f wQD4]U Nx;eʼY=|My=5h,H d8Ghâ.,9Bߩnܕz SbQH!HWX|i4Đ43ģȱق<.qJTzU--ؓvulLժzXcPאRsFlq~_Ŋs̭`uj2ypKFѥ-p kHL%~QNeZ  pYTw^{( ـ+iju s@u%M@;vB2oZ%8^VگΝc6%nԘye ܖza;JWVӤ=2($F [(BLtΧKCVcawv4JExAG|o<&RݿTԕB$&HH2k%:R[=XO@<40dz 7[7vqFifPrɠ?_,G>b 2;N=RXEgks}~\K]#C͟=塌 fVL_Z ^& p!( gfW(J0;]De1=Y ~ͷPF_q{5(%,99!x4={@Q\f:yƒZp8cygMCJ J ܆ᢛ6-7CUMx vxZ*@mr+ h}@/I7(Y @=go&F+4K 'R%mOWQib,1zHpQam#]lCu€pP %t!0M|F.#o6i?_ͷ,Z m檭'W;lX[8'C|w 7Dgj~(b7ì)dTPd(lC EBF Bm`oe|kzzĝ_so RnxdZMS =. i]&fȺqxee`cngïu"9שMKfO%YwH4!3ym9eBwY6SvAOKd'D|;-|kh0jW hp|-C?s^ B.pk2#CDTHoCnrLJ-1Z9Sk+YͧMP*5e'kcŒ|>/@k)-6Y:@:$8Wü2?‹-VDB%8ؑyȀ]":ϣ&I sJ 2PiFRrͭQHm0 L+L%i{w^d t ]YgΫ@PsoY İU\%?͢к~?HwFmi0WDE&)dWu-5h%t섏"*ˤ'#ʟ i yhf+}hT5]Vycsrc68*}5 f8'Bceac53'hKghѼ4K[PPHlC\SkT|tk[n MYZ׬EH`D>P8NVx30YgNbYbRSVJuD.gGk!dTqDz;ހwiQS04~IOEx %/#o I+Z,NU-7GTC ĊCJ1Kjq=YN$bLfsN}gb~;LLa|_S xB?xN-˧-uD0{4U"cp0^s6C5"KkMZ#_u@(SC<7TZ *!-jRz800ǼU?jA):"}{;`o@^,XcJ]<D7)͓9Hj&:U+p!HLZaUƸi՝qEG:towՒL^=Ҭ\F}ɶ@½Ȯ9bliz9b;SB[zW2Ң3i-cѽZ:זl[ғ_I?a8]ƥ5 nm6Þi sS_ {]!4z}YZ Wd8)` L_#|Vuݞn0Jf1H>/ -pC ~:j۽Ne/Ý|ߟ1T{U%,S5\ ޅ+Nnj6q,M ! $4Tp+GpLUW]pd2G"4`U^[ؙg 5ZHuKxn%/$,ͤln 3_o_?v%}٬ I7/8U!WolZ|B죦;7yƦ^Ds֜zzF MYfR&`f*.Sc"'KE66/aӭ's2",W%N$遃v<(n"QpG_i<$n*]D@GI{P9wvǍ;%\FՆu(p 4EYMPl4eKQA k6W˙x9RiRx몴L̟+mL8|}|i".-Vj$ֳU!>jmUv(>rB? V[,di>lӢ,lX>q [ybmfJuWn!m"*9Yfc:5t,HLIA`& (U"%˔G!d0cfz.fV(ZR-$\W(H'~Xzأ$<$ ~4Vq|=XybH0KuJLQu^֣mM&p5<ժ}YŽ^Q*VHN#IHlB2OTB!zkwB]kQuٷt<ʻ9Mw8vV!rТuXxNu3 r+[RLƬ".)uX?BPB0I :]~mq^fkmAX֬y-(c㶬e"@?Cts<ˎ|nB1ʥ͘_Ub}١{)TO!VFiKR<".?: eSBfbcJ*x1jDښ +h&_=O<.^]\_elTd8-=}Zt91A0Wz&1ȹޚi`*c;'UYV nSK(/885վBK&Wܐ\Q; ϛ=|A8tڥ!pw:V<{<~4!YsY3HzS^A+|C5E '>bWfKp$ |J+_9ZEg Fkt?mʬ Plr=쑵 I0ϋؑC_RSZPp솚L+Cw2 [I*K)5T{WQ ogj~u$0-=򏆜k n _\Z[EṈ.Q^4//Ҧ(Es*Te|~5ӾC2.u(g#|t1zvI dl3!O^ iDVJV_h$j$,]C߆Q\ 06\PT6Ntޖ^uRj4p7;4tWNɈζ}Q F/mY?y[׍8ỏx;|@嵱~ *u3>(WJސLڤno6N ^jMֻxxoiI$.Gg`ԯ{b@GB=$u0/FIb5x12ȭB"sT&`q!y ~uq-2z_fDzP8*YG=@KB#B_˲j֓2${'G]Q#SHЊv޺eyxu&-w?jc_Kxc$Έu#D`>49m Ksh^m?j_p lPBZB~Y ؚc0eoDȊꭅ|aJ3pBDHT!]&^bwKAmGMj #^?ޤ4*IŲa,5SrY]N3vSmc7&3x_ zyQ_Ps ,Wlzk2w] h}UEȐpFW]ADW|+}β\Ac88ڝ%^pEGª8Y36K [P61{sbWx^ 'x!Q{\@ v&ЇJ|v;+U^ sN0Ko6u'oF@ f!=u/:cݬCuD X ͚FOZlFܠtO):鑇aJ l.ÜB8xr~[M VJ(@DZN+$ O$? E2W\neb.nI? YIp[e&^%d{Wॼ6 a5g%B.cKgy#k0b9QܯַmBRCw~+Gm'ƅ{V/gj.]D{co4Rn@Xpd˩؟PU-CՆMr@IxT[hBF۾QBl鮺Ktu5 2hN[2X7;Sr"Y8l w}:>nJWc QT`;Xf]~\3:\293Va| GOd*>\ ִT!_`kӞGUͥwDG5 /I1꽠xi`Уl)W7A^P3(o*UOB߱PfEyJqdhm4$JSCjIC/e-uTa3ޢFn+F?~Tqq[l 'YQ-}RLLp domnl -yìW"L׈<i3 3\F%iR|8K}l*}Gkٷhj}Vk,puC7xNNkrsA0ZCEN,Rp-[uhVgy{m:Q\/LwOI W,\cdZ*OJ{Qyć8Ei}^?uF["m_ ?gLx0ڌɅ3Ekm.5 *E٬Vʉ3yr2fD횕ZP ehoOD,>8Ry0$-la, S݁ǂ]-8;eueQ+:-ZRYqʮ0戰UA nu,U$XmoOYLP}lF(έEmt܁h &{uem,lZI ؍@㚇֊alDfRqeG|MYŜ-+jOsņLZeM:E+d|xNB_wQjR[*!.>Ii Qb@Y6 ĝK;{4*^DeYV#2gytF:=- zɒ,4sEفTE[b~Waz*ŒE]P|ԗ_0"{;1S9XY[ 0"7;%T@ctڄЪ΂l#/$m d?z^]٥ ;IVI<=x/@mI$˅]EmR4cI%+&+x]m-5ZϠrgZ0ar4 LDK,ْ+h{ d?O hlI袆%t0m?~EJ$&n MCYT1ضmV^ HDp}ΫTӍ!@?KѬd&"c>EL|I;P&F:ؽ1 kڋe#6 wf<Iu5BHd0D#v-ܜkXRR媽H=؄ȕxOHc78Ǣ,^l#I:f8 U.qesT /#}0)-tr¸E]# %?uoMlO=Xb>?]~<̷@Tn˘@2KBjHc9oHvC?@gjXq{M !t)ӯ[cᣕ<e*Jz;Kei3.W E^"|:]V; dͅf8k1Ē鐓y*Β;2+jփP@,KcYmJnXY)p uXY/VQYC2 Rfk3a'0_`vep2c:e," h]kM Qs&/apbQvK?gi4P..^# yL9?z܂IF* ㌋V_o:15$ q#gRыC3RYh"tt }&>\WgH0Eʍ?|2Bw^`ja`UoPGObI r V)c{aɄ=`d 0aSaū\l-\?* #UCFgWV)E (o8Uv e8$x$y , Wv[71Aѽ_MrΘ+ߒih9ǗH½|3" W - =󎁾3GUdpݲ-p.BBN(U9Փ:*F .>zSS>Q͝]զ &b.tFUWkٻ .էk7h?/EN&]~C+h(=,e'e}tzcҖʮ䤆~)>O}oʟf_i(q N=940Eunى!*%1x.KjCL@̘l''%6c"E&ՓBK0!b>H~Yd%CT*7KNUHoGkqlcӧMA7pW D@/7f_M )]ȟvo1Wllt`>D[<sr7 tF~_1׋t%eq\ wToX`~B?~Ϻj,/?P5tu(lYn?r:l]|Tji]XǼ\zS 5Xco|0 zx~)\ awFm]-p쮠;"1W=GV~u>ТsQ2՝eʜ|yOq*2^6#; 7vs;@2㋆Hgo$7t,JO!=ԍ:FX* |B{)Ϳ4^#WoJ:3"1?W .~ΆNK  h^E( ǿ&¥aW2cLpX3v!`Wp@]DYѡ(8k)DL, Ϙ'V%|혓%ID(ūǘ'Z?jFAQ^~.!:=Ħ8 ثj\z)ɇ$K.SS ˊ\ԼԭUxda'G-V(N63ciX5%,/r[Y@]#ZX/a15VR'cCmKm'Tz?9HU:w匡*V.v&zMC$"v)#[l"%]ٮ+\|-W_,P3Š}q"{U_XU9vUBO,,!Sqv>ש"%7o~^MP&$k" C׽zB!y&}`Ebq5a%[0/LkEKE5l>q+!YlvV5L!:PUŬwVƂ*PJEE0'_f>f$Nh o:#*|<`~҉"ޥ+꽯**`|q.$˫O,d %CБi;憎v}cD͏ ׳[d^n-\$t|'= k68ArhB+Ҽi!Ļ6 1Kfnm>]wն+~NinG\ITt5tI.E.r(uQP^3$8K4$p ,*WUbYteBs;v/+ɏC B/Vv,K$|~gs}JqHz/2hpe_] Λ6BSvj[ "G(dX圎~jl0,ª#xԟe0 o2A!TB&X5f~[ f/{G;vZ[#gkIUk0x*uԯ w"tp?"Z@ygROk [-oM$*HS;"Z^v=lx(GB׺fE "g8 @#kK9A$/(=Co{P)5'h\.ddJe v=?Yvf\3vreX[.p*shQVeFQ* bWf|~lh+@!\{Ho3?`ms:$vBrX{NHy:>rX^hxu5sfAOC^?@ۚV8ιP"CVS_ё4%:EYL/E'oeFATuO@bft}C}uԥ7kAm')̩k3rzRK:c%}vW4ӄ([]BCjOȸ <*%yKVc9&. ?,Wv/)QJ@ҀY/$$?!ɠOvDQH-9j7~W_qJ"5 :hLxZi 4p.m1y{),!4Bhi`dY\Co:-Gⓣކ{Z^WdlD\Z1pD;)bb.E78piS7 hg<5,ikB8YfG- @;e{?:1esd_qd#UXM&+:zƝ i)zU^AX@468X՞ŴA*CrL/A,%OHCyW.b2iH`h@9-4'wQ\72XCM"܈-S8vI*<a~E&VB@Pڄl]U>ԦVܚզK=Zۚ4DBBt_:xQzq)HGD:x5KfmD zӖ%[-m3iYG+qRsD%Wv^LXxxUGBhzbcwɕ'vBD!VJٗ&D]e:>6dQ]hh&)S[rvxlldpT'-M.NR y^1=J !dm݆E>n?ISB2:<~YCv̫]?߾ΏLt2 @= R -SDHǕ@v(I~[=c=U 4S!{*c-|FBz/ % TBr րf;{_eVCv˸2r;>}פ~6Dz. 6Ͳ, ڌ Tj:f")f{C!> /]񖸇^?1ї2{RE5Css)Ɋ,f›]eKTdv*KpYJ'{̜տ,;L,C0{̦oIJՔ924|D -,D{Rbdxkj}eZqtg?$t( 9jS‘jܦk?;:e .O|UOAƀ/k<.X6b_~lSSjng`-ƨQt tLe.vz$>%ԓ 6 g/Iv]?DN/7a= ]]_snw7ي,-_uٮ xNʆSSU'݂34oaO lQHȔ 2#ϚGmq~J$c^F3fgll,Ӆ捞Ş|ṕc{n 6asC0-2Ӗ" X%d7U/e/'ɦvf+ &xwaG!1|Zt%5Jh356(uJC{$Hr:79øOHL] &c±-xs8=vM:D@naR#\Sy>,+QLy {]䕇&/xXؿRx΍(;JsA!_vvsa+hG N4:lŁw2\V׊k#ߦM4V#g^ o H.DxQ"{]+eN[=VCy1Nvh_5ӶM4Lwp@J @aB f LþrB#`zрu"/Wz6Oba'dXB,: TKuD&cEUiΞv,}")$ _X9)-4-l~ l M:0»E  iZ8g1b]INdE.*^Îj[~EEs2)HYzpʝt#4M˖"T(M9KhFNL GǔR0+%,և")2>Gwg=RdWm9QW``nG)wF!"l'Et'mh`N1.kEފOy 1{KL2чC7tڥ_[*XN U-DD宋A\ ֓gLq=d0?/уhxNrv_OFۿ@o ^8#@r{)B]*5< dH߅[AxϿ jR -*"Ce1x ,ؓF-yȢ=Ev 0]F,V1NS臨n n`_X X%I2M)Oz?m%V//)Q?l՛Ojts ._ r4r'8P'6|L )OY6IkP%3 Րo(_3Mʷ>~ s5WAq'\(YbM?SLqvJ$HO˽>|.Xb[CgHTVk:N0/`Cnm!gލ) Ҧ| i6[Ĭ'êuF^}L;8m<3Cz"[gK+#BB:v>M؈z`MAU"7 ~GolkdorBXKpA(pjR8HZ9҂yR{( ]6 bM#-1 N/>@`>Q =m5qx4(fJ-T ^wM!MSɩ tNPDq{rN^ô8M'r4حC=KC+5֌7m750_grUVw;lh$WLS}*Xv[tϻA.Hhmvg hϟDA0i1$D.aDd7ҦEṧ;K@h<ݵ~O5 ]B7jA u<,q]?`U2NR.&|{?5lMRgWrV}8i.{ҕ~z$x%R`;P hrPሥHkwK{m}&άy ̬qէG5/?&*YLGӼ0-yzae M =Guxi0&,Oªgtƒ@)jؘ -qcO?J%ImҮL+=#Bin+ȋޣD]ta8"z,or)iVYXQ[:='yEzU SqM4uŦ+8Qi49r;.rF9 .L EgYh@Nn%T|ԍ6&(ZvBzۦ]0i,nz=,Vwi ۃğʛ#a 9:MyRa+9L}ZN/> iѲaVҕ(*/wKWSyg@E ?N~6M6w 8tاV{2l2V|lH;*ʨ: d,MMwgl*c`I,/QRHWPχlڨݍ$HRE#+M )1(Q޶c_/X5 TL/e[hA"o$Т?f2=A|v!qFڿQVi~nOf]Ǎiۚ>S˽bfnpa0upf #A 4ߞ :++))f./hE_ZL?u@Xrm"p2xw*y,K@I^Ũ{u wH?0J4ĘIa8 ,.n9}HE[=A=wp]p%CEf޹6H2-}!%zI*[@'9d L;Po6^t-fD2t<ڸnZ$^1% /I8ȺqhScVH"EnW~@ 9]$?b†ǡ6Y%Ml q6/p$0O}[nFr =ܗ%3H>Yx />^uYVl-1{k?+RQ-e{s6ynxd_ܡm{dZIgfH/..Dmh2x\%\N돦³m MFE #-8oiv=1L8zZJWͰٍS\64ç;i e<"?-<hqD8̥Ym 7sfݤs̾4twt1)W{+v'aG}~C3Sc>[!:m%9}Z~b Ca ;3> 1{jO#>B˗x"25bpajO#IVgOSd@ðn|R%`V}6~4/B{qV}.֗Ou]RQ={:J +76WSJZ\-˘eԞVXʧMi16͏j]9kiN޶CˉQo-ʁU3fXъ-䦉lX5\E 1i>Xԏ6@Ee!H>J/)UegZ&ŭen S&:`EӆN3_kPkI@ +Ze<?"y6k3D,Y-p\` O܄#Nm$ut&LAߍZYTZ/N1KuͿ:#F|Gn |@71<)QuP ]/'htd?Jd">|/wՄ#Y3? o*bS';e.a@jN IA }q/)pG5s@Ҋmu3r*cEbv@qy cus#?:ssI4{h,wc@'W˦TZC@h(W!wTDw f,F#uoŹjN%WK w~_Ϟ1+[f4-?D1ZC2bMuliȵI CL1v_톋~ :WpoIL`4}7V`έ vGLc#,ˀToy%.+C~k ҕ_~֓)j,,;RHfj"6tsXM14Kb}D/9>%R.vmQ>!Jj-Y6eQf$/` bLMW 9pрmT ⽠0ǡJ>+R|\#TJ(Ci<.p?c HP x RYkoR4Fs 0/[AitH!W Gfl 8[]zE%PSIeL?-ݏ NYZZ̍S *V}qFS>qd h;]sh?G$ږϓܾ#>JU*#u(;'@tg@Ŗ$(F˜=<"+:@{ 8nia^wm_l seMt1Yoʶ<()6MNNm`ۍ" &VkM 0dG*(37;&]ORWpTj.ܖNWqa cVbB-}eВ#{Mɳ#i6 ' \i>xxەϡHAiq\i_c/7mz^3*ޔg %#L8=?T^eeMRrr"c 0Ot7ҿaL{#@xg&##hrm;/^jٲrI518@9/tzq汅pF;Bnfξψ^1$Ys|0kHt~YHeNvP3ӽ|1I6FLT'1֐tz|X4 #bƍ!zi4֭pCo ̩4o)\!Q'RJcl7Cӑ8yvwwkQ"e8o:TF( 2C< ɘ KƆOIT<[70|]Y{2#gZ`I_9[6ꀨa<+!} Yie_$eX-V""o`/zK#:8lO[iՃ*U@\79m*͑|ǭg@]؛ngr%R|I!NKe뉪H#ǕEu&օ Eџpbߚڐ<l@!EV?!GiOդR 护a. irgk$s[@vgo dGMizYO8/5mHU&]Lx5.π @%^ѭTs{* z!&C uY--iDsġ1;͒ dDJa/wk+y&o]>-:C?T :awpwH7b9!r'?AǮĭ}eE8:euy۰ e;|1Nk.{C+e0MGKv.dGQPF5&0J"¢A^yޙU;h#d7/N8ɹxd3 qc =;فx+g:8C`m~ROo9fsCWqq`BEn5wv}>} /&(:k'NtaȵP՜^Tʻc}xΘFxd ly6ל.S0*jNk 1Բ&FXa@*e?W* q%2.C鋯,t Zc<)l'~Α}A-4WenZŀ˙k%Hm)E}0 .+cj \;3i KP#ՅB҉ЯMX׿"\X_4,O3T+;,Pf>H51\S},$[NA,"g&L7v}d&^*!z_*ȇ|mf^:|o fffYffTs>>Mh'd"DFa:kjQZG:b"}t0QGz T n hcL |GMSՁ袟1 x7SyEJ8DBŘ!++ кItN1E6"-ڛtv5wʏCs \-˼ 0L8̔oE$J6ʸ@h +{IRN1[S:/!TeLv&TdoFHU \Ҹ~ tp6wb[_Fzxjhˀ_+J*@'sʑ8F~04 9Z,g; sC]lb0yypmI&6GBc$(:KO򤷛B׌/"(ՑR\Ϸ3`TsfK =!zI>jb4dQ>Yio$ǔL:ZLXaVt;utBk>"Znb!(Q( 3'I YWN 9m;}:20ڑS$5u:ϟY%Td_O&"*_,uEO*y!L&C5/VvutݏW-Sv[_}멙Q2k {Ri?X#ɔ3QA0' 8bXgr%NgYsܶb\v1X-esPP^FGcsDSO^zg\.;hLyKm5FC+oҵ~.LP }CQ=,xx_Zf֋ΖԧS*c |uъF -EN-Νw 8.{ȸpW'\I ^J>? U؇)zGvIFiU2 l}(=6q: ":3PekL|Q!!JYݑbc'1@v[zG>'ṀU/ iSxrՙj?Ox\FM/M4L# U+Q"$k\c} ٯ4RE H(NPf!LK6L᪔p8Qe q'7Ш)QgtV4L/%uyKF1ޘDwh澓6QN}ngj6naL,[a@LqPP@VKP׳;$CRo\ϚNcX]) >ˏ[CvG^5-:N Ѥ![DtPPa3f5Lo$b2 Q+pBۃJu0'Xz d4e?bw k8`M*|M{"RD^S5ht;N5RE"EPX4]!Lpҁs`l{ HPATa|7}(1F}CgG3ϡ8s@*l)X&k$bbm=W}8'C~xJDQJʗQ=~J'Ur b΅5~" = ~QV1WRBE"D5j];bT"nҀ^D9s4%$lŠ5#Enɛg#5ʢpmTې?x!u{Me3I{7,w [L@o܎aXIKx=֎ Ӧj$^}vY*ԉ?ֳX7Q]'B^ۼA֖?>y<.vL/ȇw ϹenfKLAbA{Eqm#vS:"Nv(XL"GJhDNdJetN!=~6Vd^oYnНd [E d63 v (!W2F* u90\dSъRBK;6FF;'R}:r ,u>Ncj5l?zwZ~|[FRՙU'CW:l k`9 }&Onl=)]})blz,=\rTl !b \PֺjdhOB켦k s [HGub S/*%r[`X'>zb⛚={Y<Y!>vx8|z69\gm@-iMדmr"g"}wt 1IGL ! (^6;)ΖkI\q< $1vDui:\\Q' l\C.GX 3vHɘ}GDŽGN7QSntq1kktτt߆9+bњ ?2mo1ߤ ;yop~F"I#ݡ0i?dsfY%̧Ɯv OPת;sD'ThC@Ɩpcgi!OyjH.*pzL#>Ö*ahUWKc@0e`h\>Vy }tڐhNBg(mMKAr~rh;ɛ_#3ۣQŽj *tLK7aY2U$,A[mōG @SVBkPi4O=T(Q4X 0qb}5:H)_VZ@5ݸgX/W%Uv|d]?UZ)/zo BIoGkkm*6$ ٓ9ͮIlYgt` 2vi>եKlfqqG&Lމi4ſ1'>n$zR͗Jaa?%,){A8-!^UC̹D(@ruk9w򺒗%YWg|hH%qOiBxt N:m;}(^]]h"nV8!f1Ī7) 8x9̰1vMYLM(Kg$ɀ:VX h51_d_**|X8]vfs)aq௰@a "Рv+smh ^2gDW [9VО2[RߘlA6 L{ɫk6Ғa}qJN?B 5w ^P)gʅ>p}BD2^uwNG w"phZE\zdD&Lf:,DQ4 (B#@! n"n_qѠ$c/6j $h"Q+ hZvbߥN5l^$ 8k, Lqc┛ō^:gi :Љ12\-KM%{Cta^T {]l_WlI[K>KIɛu]C mQ/e o&n;w;Ek_xU[8[&Nud")1{vpU-Ys8- Tpq{FZl|Χ5o { I{M夈iB[٪͌[~rc3fv5տ{kѩ aډ̀%wzY!y4y#?j}+=yoo#e]R]Y8;n .}o;dN."J<&[4B)oMEf3no~nsc":RX"PܙI(JXTXŖV(X;pmi5U!v*,RjžPO& b a) pd Q){M4U|%pfOIAޏ.KӢ"":c( K9(@Uܨ8myD{V5yR3xx8hd:L TA̤YvP-Mɪ_lǮpTp =6@SpE'B8}=Be3MƢx=cE^8V B+5 :V0\ekK\Ch9_pn] FÒyP5˽29$rE}DjM-7m̊|WF$Ž" i`U_zFy 1o:J_b7k.)xJ#;D̳a8QX-*lyeȀfc9^8Y-=rT<{)[OΜ|ĐD?t.*؜W5e /N3k=Zvlo@Ȓ ?fγ/qCU}p)zdY<iJ~~ңc^EnCF߹_8FqP \ Q`q|< F!nٙfgwa/srKښ,6OTk%KLFٶrԂk;UvX[8]rl6%;a2節.rTA鶿DPi(6kXק76LB}zww8Q1ߙ<[|Q;V|p?,R9Y/̛A7]W=6]3#/lwWxTGrY܍ SV}F>Fc/^v>w@^GV +|^/"ު%_ӣd{ɬ^G6[+&GIBSTa[vyd_'.̉T 3M+?NDw~E,efP0k_@!a~9ӹ0Y> ;#8g`$b5Sh$_$֠EF+ЕyuRooЀVצ!TƁ'ɶ 2٨F_NU #Emo,T_݁{A)|g92*( $k%(@M6?W!}1M}Rd|S#T>Yb|$U DƱt%$ҫ'  ,+AģWӓ5d I/^q/,-LLjU+@>pwLMtC|kW-k XF Y~xuyOpP ::ICM :ßpfVRc|M8/lV*PŸbD7RseX;sprBß6]tJ#K$'#9B{-xT[Zy Kh,F;may\8] eF3x_RnԮ|Hp%mѾMl. e*f'cg& BoiQ9Btnq-vJLxgwMUv<=rknB'֌A,='~󬾑z0ٜwbz>_"uB`Δ Qe5ڥ܀s+mZL/N*0i9\XbW#o7V~A hVǷW>%}dkHJqy"{Rߑ?ƔTLdH}"`Sjܕ|R"|Luils3..XtnQ[֪yC:ܴլp^{-" }?( 1sƅEqbTE<ܞ f,VT~W_E<#W$ݡAuMooƙ2`(Z]>ahˈ#?m0<RNI9=OOp.A8%+},pm@Nx3u2Nq~ehn\$xDZ/R5Ww ܉Ee|F61{aY8-+ӌykc_eDZ _2pސb1KV;$pJ88" 3ALۤıL%qpIAx͊!N],vu`$ |DdWvefX ufyY W ==DTzt6i[4qA[PSs9Xа-2g!l _Ƴ2DHߐM򋤐$pZN+RRБF*SK;@ÀRcNqΓ _48Hh17-,Jt$ V TNgsu0Q6DjO)-f5دQ)]-LansR[D< So1;冕=N1x)"? ݎW e@̈",g\'#zo'|Mf`IŖչmq%a-MˮC2>k~Lp"+b24.=?s,K:nr3A]%7 QIz^YȠu Kf?8y CΒ ׋kP ڥ8Ʒbx4:XDI^33s,Uf!<$U2CVf:>&ZTS&PtqPla_En qBRuVEvcE̽wbuCe;foxiD~O[VdN `t:5PBʗJ%LqŇX2f!eX¼YUi}*F!AuꭴUұ^k&kerI9AS5mz:9׭@~ȇQ7xyzd@̸=\dL΍.II#gARa%]#H 7%lCiuJ_ؕ53~D,>RX]lvB-K; nsV1~Dw'ryyx{ߟ@yע$.j6aF!&!Jv.柁V{2[Tw݉1>Z#/$}I/fZJd<嚌>`73ELFܗ[A:J_`^C5,Ca6ɞ;" 5{ srVPs2 ʣЊ4yW,I8Pse7ɉfAvfzZ{\oVE916g]V]SV7y3d(.\kd F/FfDE_]/&wJ }M4G{COhˢĦ祫RQIûff `Dl)6y}"ؤ9m?-DglZEV?X(o{(xGtik. F]K{ֿXX^S/ ~1>|0JTĂGI k bDŽj^b3.vܝ6Y ɿj>BuEje;SCOCͲ Nl^Y|&o~)fT8ȴFv}5"2dJGGp zo{İDށů&T̰/^ %kcrt٠ ,@)^(,Ou6`@j=Ք'!|(#W'DKQrIqr2@ <(A=tQC/g, FYb@uFD&cQXQza iwO"rئh㪯SUgXNa2}D\]D>Ə-xm(B {msTE.: jӫb ldvIBJp_g14/}E"¼U6bfluRՀ֓]ͱ1'yh: ?Hv^3>-r;DhFa`FUdG?eG7ٲLrO͚l栲gHSHG@'ȓy՚"@YΖQ#%=w7 )j֊ǝkцS[/tC"S+- Zrqe}1:7wG_l>z쑷{\ݏA=mwbOnrͥhR iTgVg e`˄O5hc=2u^.5Ĥ7UńUf"(9v6 .}b#skqq;Eb͐Coq۸Yj4+21ܿ^/A'Q{$R)@SOlD6D? KW4Q4cᤗ=#Q(K aC}RBi }oK Jfvj WoS-)qqIHżymp SjI/X5Y)&J}S5{OAsn?%j7A2Z7&Zr;m{MoMO8QT]~&{-!3b~k} 69P-m'dtl5hT)jU>lր&]|[$#@+: a+ٸyYː<(^x)Z;h>z");m;',%`h=8usBx\fj@V3ՏK6FuaFS=wg,N#ft]KP@KH?#p j:7΃}F᯲B{Mp >ܛ UF@%1( ,gv<*YiIB'ɉ3Zc ױuƚ.Z/EG z g?0i-h/O- Tƈ[1Q1MB1nĐO1Ŏ6aew )])r/A#ߢpMSO^PlWVEB=ʛ!Ra! $jOQS><`y<,n)Qg冋 _1~'=7ݔ ` &x3gABS~2Xg9P}xJa&q.Ng{kk~Dr=/} ,i;Rm\OTTw;'hy@d]dWL#?1R`DaM$3lP |ZWru,$%0ȝb,BfҜ:1F=kޤQ<5dk(}ս`CΨhi|-rlLxˆ n)`ZƠb g\i 2w5[KiTKNQ Ġ'reFC",w?Nxe+^GjPOoȭ@ !RVm]:ajyXȡ@w}VG>)k8I7n dگh9QK/}GN6VUsQbCu[}{'o$ TIz6oS_5`Kd6A KJ[[n}SV74w?IeŽ0Ol:V{H`= :_r0xzfz?&|-v"?Isk-L.C,`&55=&qv:3<](9}ZSpB`#zl 1 CgJ D !=KqD7Zj2据NLf,^ac9l=uVft9?^xY"ng&v̦}*B8VXI,L1cy*gl ЊMEh W8R3xdN߶F#).i>Ϧ!A)D0Q cֆU7YG+:Vi'.sn `@rvXSZ7)ys![\o5*nd)6s'vTQ&~RMVe. w)k &`u彛(\W4ry՝*8T-Ŷ{ W(tr5&M K:orLUd.kOu@l\G(xKPŮ~?}@qV#? 7RS戙۩,ȃs7Pq>$GwyǚrѩZ]]6Gһ}'D3]k]7dzQ"sպbhՋ3?m_= ^HOQ}X)żH􃈺 YGQ>̰%(aWG:"0XfܩpMֽyǣ->Ub{4`(n%7ZD:ܤHM,yե?ٱC&M s!:f'qj0 DiϾSq׹Lans^= c{%p8WB#>ofdo5QO"v0 I^C+`ZY!\fb|ȘtK:Zz~BKTBOJ?(r30aku;ˢZ:ZԃuR$yaFn\SO{)|MRd J@.rC:1l0ï!%ڛ@GƉ{3'MDg%*3Nn6EXFm'q.>b?qDg WL㉨FډvQcJ=rX˥!73n wGۡ@˘f>9^cY~BZ$?S^EpwY3M8]vBRk6Nmr  ~iQoMOq&KYA) LғKeғ=LwYN`汦@:5'z,ߒIbF)2ܖ2)%RճNISs'K_M?=wrR6˶KKablw\Yt#!Ұ0K0c\˵7lI"{{At>Lk퓷tzn؋&z~jRq']TX P0,OLê}653pOęyԿZ4`!mo2"{*yg!(_C;b>ylq3LaPCkbcDh0n+/m33F6N[i<'ȍ(#b ~>D N qNu>Ed5>ho{^?%DZ= :Y3c _Eg&*3vl M4:! pM$ oвccy*th1OΠg-1I6W'{Ђ9Bǫp@;Z-J=eƦ͆ޒo{IQؽ|H&H e ߭Q@j-Uƨ>5\~@oNk7iӤs/Գ` a8 ZX [^l}A٣h+`+h1m!=EXYZ-#,9[0x2mטCLm=5)%R˫h#էϻ}v[LO;3߄,~\0^x't%>dnV""krPyxMukbs픬Q^>7T4y oBUH:ZFꞧ+-kQ[kXluuxVF-1pM:>!/DH:3?zp>S9f [U Go??\֌$x@!8y>f:!ڠy[e@$Z95,G U7b=@IH$fv# JXB%z9:lļ)Fҕe.Uls360k32pq`SڶE~f.Peb_ߟ> ;$Dx}Y@ް$bひFGsK69vw]9s{ noL^f!1PJG]ۊ:B~Vm-Hh63Y WMCPsEϻ/*u Hjhq(]1nA;Mթ]t<6LS>|WEOQM%յ$_)ʻt4D.VnQ iflXܲ0Q p~7Ofomڱ?DzF",LxnILNGs)ucr\I69؝=VKP .ʕ[q4)|l)pDHs_d$龰 L| HݢiHUKӔzY3¥S_]6H8iVW(Ѯ9Du5vlR PI&2r"| aw5 z̞܅l8ccϹ%/ͱ˪L\lAd+ `A- zei|vޠ<\qd\B g\SdIO@Sf I=.}5\d`W@W{ %l?Z IG_E0fha^gbD \c!lb{0nHFQ/RNH>gthuȠ57W´h% "ZѓzZ7ֳ$jOtϿĠ I-Y!O 4w(uo0S9].@'$'p\eQ2 Kq΁F'[^%#zW@6 9Q,Rp*(@/cn'$7#'Ѐ9N@&+m,vF(a[=4+Bhc˱yn Q}HF)ߎ(+ur54"d ,QŚy9YUq-<* opΪu/_8/\-kTRKZi|6utZq )Z0Kwc y* ym&?hfʼn <; CKŒ˝ Fc I`o~&UESl/c(8ʇ2 N^ |t@@j&;P5d<Ϲ5!=]TzhSڹNȍ~U*ej*`-(oe8^.-]X5@uou_LT9i/ MT~^i]gtp5zp}-1ӝ./pewEּtbK<ɡ'ÙLKCcATtWD:\ע ;CN-ڛ^X1;r&, md,\-+x/_»6hm|?I>_6޹Es3 F%h (񊜛+@La#v0bxDT~*SCY #ljߩ, Suy# <{<Ď!.׊dsZ׵*֣2ETO<aqnHȫ%!D!e1O:ߖhG8u1* $.0m cUruD֬?wvy\GAwlrRW2zFn,0/rx)h[zm7FM71qܪc^uɓo6c$ʡe$$gŲrnyJ$ߞm;w(B. ^%57>$ !c{8F)nOxrNƬ/#YA˶I%AT_;K[ 10:Z{Xܻ<`kXSˋhT P~.T ~OEn[ɟ9Aܵy++qUA^FR_.B߄ZwsӴ((dTX[=fjQ 3WCUs]^ A|'lގ}s>ä9o~q7q9v⏮TBA W%v e阏'm+!ɏşӮK܎r?~69ʼ^> 6Y"cR ўS"m*C%wK8_l{  7EGgCՕam.[WEVȏjGuR%.oֹ. >lҒF*˰"aSyJN":0߄Cٽss\5.m "c~ ZQ~HUcg%f5S GW.H7)_YitӣN'c5HIԃec??;MZ"nEځ#i)drJ oRͧ1ЮOo86s{$m'1jڲ}(c{ @/Gmeg\_#G-'D%/t (12MXѱ? ` 8LB yDцm&mp{{I, ).6Wj]&xϐnw-EvMg\*F+K!}2t9~*[GL9npZ. %M)U DX(5n@w!XԀ aHBQT[gcke2$_15ͳ⠪TR~)fO|7KqiOhӡ~%d*(_LqɤvK7}VON-B{Q0& UG*ze l^6Ι=Xn0Ͱz-{Lޕ Mbs3k:7Yޜr~L]."]CYb?F-.pwP.8$5|& yxO-AŹu&CdWOsڿ\C oLJVI.L!L׽f]}a6⯥iz_/>M).W#<{|&=e4ђ m\[M@)XY_VFiCtuDDUY \xWON8LR+.rtMOMiri@+ܲpw;/HBoѾn3)OݺVyJ-Yj2n%K:|c$3#{mQVx@a6|Z#8'θ'S8zJ5zH+MkJ@)~AM-9̡a|׫[=ϙ92WO,== 4a;y%E)Gȷĕ[me(pʤKX!7FAi6_}s5N6; F&,FHGP_!Tx,pPbbA';g@&ہġI¸.` ΅j0ј>ixx:f\@%cJE5-*ՋߟMmv%O#^LE9ӡL N=߳c!}P▂>zժdSnoԵe3abm#‡0*%)zڜP a%Qv>|*"jG7XR71C\ e.I leDj] TPP'S:Zdc|v`FSÌZ}v5ϟc8%:RL7oa˟E?픘B֌)9$ ^T\xi6Z`JZ.-)/p).PgV&;FP.){I[)ݖ#9E)QZS?'( w{7<yGXdɫy1W+gsEbl>֜O&ߧ(4}Ӗr饟hi{w:T'zOQS2|<),A܀ށM匤dEL+9!X)lN>v`hrJqeWa] E]dӝ䜵 ϹrBѻZԹO 1,Q/GT bg6S(gx w{U|-U'8iM c5?\(ټCG!`-̬ra6!pv1`7]Sj]½Й |Y_f jH+kK=sB?QB.k;A'6a"CdPP'lY3Fq/ݡ뉩n| uTLǜyb \o h{c2_Ƥ==I'`\Yāg\V?ÄN/K>Z#Y5N;Uh͢U^cџm j>^XG%ʭZ4[@;Ay<3S$4`^.4J ~bk½caI)_s:[v?54c>. CM^_Iv~m7,N>u,AX3lA #8Slq>S8 T76۩b;mg9߲$MW9BQ3ɾ+,%Ss$U$![]fs5S$Q inёT,a1$LcQ|ؐ;8N8 dQ#C׉FWMþ_ [,0rh ufcq-\%Q^ U .7:p_/m"rFw SX7qB6'1'iVJ#*$"-w3cfBjJ9 Zq*UOa{P ہ0,H:>HۉVۏ50?fֺ~<*p;h{M6Ǐ/jws?]*CNE~? 'YMV1%7z-CUUI/8KcGz9jc @ 6 ;ȭ: Fʤ-L@S=gT r7,@^yMUܴ==+?SM{줰UC jUMwۦG 1ޑ;/=%*P •O )2+TڲC\/!x9s_*0a,?FG?mY /NɿMII;PI a_/$V\~? _&M܍PN3 oL"M4FOA9HgOhWRWM0ƙީK6dd|q8߉ '`|F,UO Fb5/p`~E;fܖ6iĹI4LBnwYҐdE)l[ꭗPB1S d#Eغ1.>U<;qUb<5.4Ȥ$icGwtGwO.9g-^_JT~9xZ#_]3^VIn9Ӫ] {^ # 9rgDv+) Bru  b@GF)C˼53#g:BS=4PV5FB!܃W/۴1ì`}HEGG֜8=W:-u\ȒaWzge QQU C :X]5]74Z4:()ě9(m= ȁ&TYSJ#x4sFy9 7gj_ Jd{we/::Ð M+kPb[/f6#&BJl=X@(V@fK[Vuƈ_$SKuK3݄7x4UxLu;JKwY0DSMu|SH&͵ğjBxⵀ-q?l8;*Ry ^W4WnqPXJF; 1!=PAaiɎXw4̂I9<"/=oWSw̽aP9,?E$*|3>~M{î6+tϗL*׷5O;錊J#- 7wbV!K؁aFG=0F{^Z-*߿$D\%|Oo>3iZ SZ8SpoM}wU1A;Wd$İQspK-MNˌ](D%Ұ0|hdW`S`G21(\cQ%Ե"a翗Tq[wK4W@uj<5$?CP &?8sA5G0*Zh^>2c43m]&Fߊ? j/cc 7̇%@`PG[hI܅]sf:IYj :E^K2a5DzsbPtiq0 oZu/u&7,a/AD[}ZU kVev9lŇ5-rTN[I ;;~/vkݪN,R%?v(fU!TWա崵:O,IVu/AH=t8Ԑ8c9Ksӷ&ٖHzN!: 5WJk:chb!I5jE3\܏1?_[m2l~aآ&MelrYG#>*C99*%~UZ+|푙NK (#8Jcot>LƁ&&pZ M`sxT_] "*gJ՚^4ldQ<\&JacaLlN4X}sa弿ڒ3KD8e>z6bsG`hSA'K[PVc܅s[kexZjf,#@k9Ui xZ_2y]N3\b)U_*n"8ߏIC p*-y+<S.,ll:W@࠴Xx F"˗ $\8ϐ&L1k(tWm ?CQ|'Ңk' of3G&hwS6 Ho:bz7_净q>s1/ĥ7 {*9?5LQ"h80 m~.ؐ_ZDS#;Tl7'_s%8]援 !n=f70d&vσLnE]~+{jda?,d\ԁ,hY.*v4t)Fᲂ/ԙMYPt*8Zm#욃WP#+;#^Lbؿ;{;WON&8_a|)s' aE9е {?!྄PBez^ E=ٿ-#f^9YAzIr-OxHduK- F[8]U/ŶPM1|2G^)I6e,dAʨ5՜V{JК?/K8r1̾mB6ޥ;)1; 6޺ :jLe3S3-~hp}=$vBj?tb=x[wf I]"AoMՍuaI f`Ըzg*cF^ϡ4r:xBp(S ժ?DAd"M)gI\i|N{4adȿ8Y@y.+2iI0'j 8NBa擬q9k>է.[/5Y:\\#ϗ9ooA ISѪle[ۆU,=a#;F=vH/P3=9p%f4sة1oUw) bi0,LzuS+3RT5*Klc&Amg-+ 3'vyq̴S\8:P,|̐ܙ:?V)Z?{LgVDqp`œw4"O2_$[k $$R 8 V:6 Nfro ɞP^} uhgR;݀o(߆hT')9yRWR 9)3N3Et<s:n mX"Mi~߇J:|9.qc>URxu 8K.9XD98lN)HzGstY?ӿ]vd11-lg"69@,&@ܿnQ 12^*CeϽBєelH`JRҦZXETrlD͋⬛t@UU qxv9 }'N/vYʫ^nBh)(͆K7HIczzMEBR)|M&#jؗo"@ y 9B|wGNrb<Dpr*(SKIA=ő=dncZ-kM :a&(#A翍n 7EͬXGV>Ÿ-*&>l|e\MvAsdx/.&g1N-}M<ԒX(*5#wcq4q ؽ(}z}Y}N 9xN˶ʌFEE>w&b$9Pe(EslPd.cb`i`{SҊj:3;OQܼՐp c`}y+F˭JYCc٪ah݉<ӄPM#QS:voAYGL?~*.x+ѻٴ.cq. nI'*V)bF9~ 7kt!ѽqzCrLL"NE;X=0IvVi0qOh@K藾m䚗*)t룺G;wC2o?!9ŀ :G */#L>\3+wm 87P{J\Cvʸ !wgRD W:C*-vX%2]m!d8Le9aVyRu+=9ZGohHw -h!>Qvӕ?Y_7Fc -xat֢ZKe!Eҭ244um>vCYK%"ܽCNs\h">/';l#4sqkv_÷ [1 E'7YArXϺ(O&AHzl1:Ȳ9?Q[7"s13KWJN_EKYΔ6'ChZ&?,Ȧ6ShAnri9ûۼJh8M43KDߴ1ICʫ\k4Lj OuE'kd2Bdxi᜕sx5߷23.?ڠ¸%PD=X.kO~[l_āNuҖvWQw@wnli),f^q%@ZzLe|Ə{e;;= A8!17N`T͛6%P[µ奿Vtk 9G;mc?,or y4<;n׭G'j'3U˩ArE!!?{Nk/BOttҾ_"9[5cBZxCfo/HHNȩnK*11U^\.tC\\D* qbI;9Pۑ%`'ؕ;Lv Cr{w_z6U+ӭ*9Bw,̉gg'K.Ƅ<"L^yĕ,߻<"i4݆^ހ };eN~kXT¶zERGB!+JIzrжO.oXN\k{ʈ-1zWAz˧dž}!тϝq`Qغ8ʝ}?2yd'&kˍ-pgӑkJaHG#@Ji"ƴRysQU"JXٰİXN=֒~pŖ s̍լi۴(ބWy5l5JD3=҉+S"ǦDH ̷go{Rm4pí5#t]I(ݦ%7kt]KAr8y3֢tz;ŬZG\)1 ٛ <| ^ T?1Z ON0!=dsvY)寛-Nfeeі, 2q^k8g087s@ Z]牛j 2 TfF4# A'RN_[W o0h֌;"hr<ܯ{=DgbWJcLyoDEfllF@<ήXBBQ Q#AxU\7%8,-J@W cHo9Ŷ1\1m6S:oX/XC41zVi_%KQ&Q MjS*^ZA(3eͳpBpO$rNișT>sCť%Ɖ1D|c191)5%UPˁ+H| ̞] G|A%|gp9>2l, UhާXKb+h ə:S 1SzyxL~)L?d`gk@x?gW^xd)'Ut  ڰ6  zw"X|/M`afuhP,KTZ]3l)9}2W7u 1=Ùty1Asѫ1MTpWD$Iy  |!byQ =yaH#\ҢPgؚhv[Qw4CM;%K+s(-^o6yMڟ S`d.?s_"R7"3kDmu\\HqšoHaf缢|inX_Hv4B iC*r%rOۓsvU$V p)\0x1Cwۂ^a%i|ȹmuIdoqL(OCVny,{g,WRP(c F 68(Lw8o4&*J׺S!pQ\^p_!% rVP\Kl=Ro] :KWx+h%ޱ$?4MVe󀲦~x3\h?̯ԁzp5X #kv*[C٭fLg^m VUS 53FrADHjP$G3^mܒJDys p[7UN(N'hrQѤΦwJF[?GCs'vn*gE޻:hñ`8yY͔sʮѡt5L9bY0H/;p#iΆFmlDo\o6 I ˂IT2ٴxj7x>!] 9{CITt0hK> UMrCio~{dz"]ZC;}< C._'-yĀk匉CMҠ5r3@Y߮\#,o{ 1qD|KFJ hhd=’M=D@Aܓ~+ua@+tZ? 3YrWm:>hçEn3kM37f5'R)edEȯK2!1-J'L^;@OyGw/D)g6sRO$f`OkmÇ%5_?7) HێO1-2BDH{MI lSD ;o(@FN lZ9Z'qf @V(s̹Nq̀%;Tdi9 Fhk.d8׏{-Yq4l򬮉v֩#N)\Pc>=f@ 5e/?`ɽvUn%0T{M*VK~%WZ]Kl4JZB@Vl^nt3*7^3в4gS:h4 n$œ1ϡsƨdGd_E6$ ?#گg<$LY@/pBc^[$RFt>^5qojU!7TkXϙsJa~4~px']0̇DCI9Rq)^*=QV"M^H8 kq4.!0]S5@\<~D#+U}g0l}4ueNkͮ/$VU鏐TUb[4֎N;X5cmf:4C&jY!<go{!Zy8YT]2dB|tӊi|etǏ9TXϸG}G8qEd.~A jcUyT3 1+~ @,s:鰼T[ eNZ0.]N u(QgX.VB#a#yPƐ@ H7' M2LoD޴Q{}*lXf >Q{2X}:JǮfu[,щ8YӹcSD ޠK!Gz{&"aJB1 OS>KbXgNWS+rJj3wȝY9;|'Suܰ,>B`JԀuh̓6sXS2[JW[, _wA 샨 W]ۿ+@~#5xvX{/&2:Ι%Lb߇SBȵ 27#J{HRWLa0TZr'1I=8-EĪvJZI*xj`ZA?n81Jҿpi[#`\`dM_BR{#,0aVNT!E})C˽SHA\yu3݋vzLj|xj-Yl?` ‚o?5-HRcz˅'3:W^oS=C^|aJEK3y#`զi?# Pp4Gj c{4-UѴ9 7a M;?|=>5|1] u6X}:Mn;Q!/\jۆ{6'A^ &"sô>ɒ<ߵY;W[tZ0}?F.q&#\u;:Yfe}.fv>:0;-5тJqsȜJ^eҎQ)4urP2=+Lmԣ Y y7l0ljIB= 6OP3՞2b E.|m2Y=F @s 𧴹xBeZ7}cDvgxşUgFhMmLQ˓0WIߣ~;૎VV~c? du8ipKp;~|+*َ4e;M]@ "q7e:v!pIHɕj@*$PYq?lnt p|љ%t3Kڻ8CIh7n/[|,b%OKIQ`ڻ Lt :Wtpb?ϼ,U5M^_ư4SnUrO[?{nZk|C'hvCne?+LhYޤwe]#6\nGASp0=QkUԡYƆ?|m(OO `N[}(^XҢC);e}QȕylqK2>fs  5,`A$ LHz[%(z9M CiK}*c*ƌ*@1W=un`fC vouWr~4:0*)4t1̪7 |EŌwHmu m0~mOYExߏ]?&kSodO!ќ$q',jC E0X*n0Ԟ1o𤯡܊on-TohAfnz~ٮEmTkj3<ݷ]Sw{UM@f(#M{  Ccغf0\>v s|L0lJ#ƟwKgZ !kH3/)ī)>d~ 33DQ]Bje=='Èk Y9WmB<|g?- /.d#kh(9aZzƉG@S{rqHgPƥJНb!lgLX9mؤ5&#6,jX+3JWH8z/rfҋ$-y(ځ@G;eihƊ2\լcLP!\{ )xi FM4_"x"7_6.y.Ֆd8 el,#2e $`f| vYNa ψô77z-ͭt¢S9k2&J8mBU * ER{PxT߽iY3yp"s u\zNG+ 8["؃DGI;#n/33Ŵ_idQ_/% L=V256J&ҮXHAxIaf%9tKJd# Sڙ5Pv`}(>wr_q2Mnx%Pn̈́[F\C׭v}͆npupwfvM9./LGz,~Hm>EP[D(,ٵm-f=Sn 6l'lmc&"#.iMD 7s(zaHXδYȮߢ_l?Ϡt>Fήpi~RHs/ }s~@_O!Y8޾rqĎ H~` ukC\D!\~k$IS.K4I59y,ÎqVw?-f׽DKjOx(CSai.eRbK`Ѹ:1ʫ'%hL?b4>q`%j QfYeH{N%ٜZ-s pdŇ:*W @3[4f5wІw{ݘZ|6L[|P:M8G+tq|LHxJQ{JZTDǡ EMᛞaaF74]Hz9wZ?Ur|VwSFOz &(ݎIkjvX4i&=5?#m"w#KPYzO }!HaCy#^-ƚTef3N|M䛀װDAs#3]Փ=sv_Ky.Sȶ6%xXc}a#mLESi -Jrw\(|IM\?G{!x>/FY53> d?ޠS T_@s.IEL7yj7JR]\g3~UkkOzk-j-^E7aS{AWAz-@La:ڜ%U0oFhз9j%p֞|=#7ݽg-bM)OM҂gޟ&t" ېH nTi9psk +o3(}zgULJքWdNׁDe-(v0`yJT+qur"?XV3ɮ RV`%jn mn@cw̑R`.9:i8xnXi^|p!GGx!c]lĘ*"=Wi=,h07P/DW>)dίuV{KPp; Ou.; 0 &D8-K4W z4>O 2]ҥc$ 5f_D ~m3{~79Α!+lqKB7"/Յ*cq$ZX44~ O>HkW8*k'=k- ,vV~ /RR^vG%,߆o[|!c'zA\ \Ph`Eы#/emPDjX AʮI :穃Wʥb<e! ZUǬ/Gcځ0W=ܦNYP!;eP2M-59|LG5Așk _\mFdFqϚPq%k570^v!w'DfS ftY 4*7_j,=#db-@HOc)hdVEI^-\Fuh~+. q`~5(IqG"W 4=窃 x&{})cB YF}`y42ކm4캮"xSh[u,t0,d ~`Ƣ.1iG,PZՌ}+yЧЍ1ܬ?VѤJ~򸖓 u ct8o3 ̙齜[?|exmg?ahSEf7b "~ w[vKMfCBfP-V)M7:tl& +Q~'dr% &9GtK;A1xrH(ܢx<VB7>4AҖ8H. '񝴻Ϭo"zp펞,dM\C ո{}Qni.A1 ƌYi -l]D a"Cł#'Q/_ý$>'/f":b*0qW72s9ق=/&jTqRvȟ }JrՠNܱ~َ"bSG4]M8UkU*67)]uyp3=T@y\RW=.Ni@#e>|d3^]hjڰݯDLڜ2B*̭w+v_: TZ'nbâ<ؔdL'm2Z,޵Wo@ PC| l%Kˮxw!9Af gT%=CzĒ:S<ڽռ@5=N(GU75dJ_O(v,SXf́HOu3&,Iu<0գLn1e*bɋjb{תr0ҀeYO7f/5 CT̎8ҋ,k^LRgp2=YY$mW+iozfly_` hK-^ L:P}wˣܾ}/&ZS>:C'y썊ﴭJ=&uV-Q'xaq#4.` .#?6@)#w$-#1caZܡ- β2$TY b oEOw)2ocyC2h&ğڰ;cWs/llLH}U&{~fdǕOӂB^~Q\sO,>x}wӠC&w,Ր󊊽[,.t?xxKIAwIǨ⏯/yLSȐ%U2=UD jL[0%^ȓo]f" ؾȻ֑8t;!-Εw{foo DqOR#I::8QW~Wm r@BwM7r x{7_,l,$ ~gq |+g[^q ˬEJh kC"J}̗?̫|QU2~Dc 2 Y{L`""ͥ;P:BtޯdC"bEbO!2NϽ_sd)-7jo ήRN70h7 s=Q3J‡u{bJ50GNuD@5 6oMd!ĀI M >P[i \_QlKhD Կks^KDdtg<5A5="@~V]}m"+MrƁ~/JGG%!#F,A$-'DTVr b=8戓W}{zY4P̛qǫm4{Y+ے Φ݊V7M=P;/GXY3gaؚewBRwXh+=72#o_~~ aBG5이.KpL\k5[sqzYBd 6nG4*>:uJ&gw>ް$ } ֨5v:y M&~(hG%e2tn@큄&[|Ǔ d&c8a*1$'\{ 0>E(=1X$.{]]ָ v"ۿo;ܑTtDvcLlA HɽPJcP1ZEc4Ivjݒ[`BD> Vn`->8m;_bfQ< 7cϗVɲT4qWٽ&Spzu)`aZ>f)/?=EF b߅A{X@;.o(>eKr8DHۀ lLCT}%@Qjx?օՓE@\l鐗1_:p:,Fs:=), ͜ HB B}B!ۦ}i쨖>_$bG.Z-j`ǜ?WF[nۈ}3.$&-c/ʖ⡲aU^̹c0xł 8qyip&U%JudbKQdfmT?TxV W\H^}e.FzcYJb5Gp!fP@9RSD.## %$"(a.w|qDžzZH¶nQfF^'X"(51\|벭B%쩟 ؞*ħ&i8X7119h\Av<qq@IjBǗjUPINY8RUr(K̨i_ 8esr+M"u-%:x{FWm]y'OyQ† eٿ*bBEbEs虴.+ T!Pީ*"y!0nX9xOi;] 8٩5de %?rGr?!^<_C>h8H;Gϯ3!6;-_2McN$*&uS!A2)nw*7>0 QF|E]ZpӱfYDU2l/AO횹Vq'8ȷ½ 3HP(*.*#}%ae>kt@R7j.Bi+ i7_RA=7Q8&>QuS*M$ [H>Y3ik3+42ҽRf,_D籣2$~J@dYM9,n "rBg__WIvaiүG'z|e~*,jt}ʼ25󑲻F9AR$?"M%|j9wU–^bn&9@ ,e1-?~MِHjY#ڡ2znWH)dߋ]c`p$^nBq$OM8Lilm $:YIo2\^V$$3Ƭ!zt^aDAвxQp!>Mn~fh=i04~&b'><ǺV8^A[TOvKfzE>X3j'[ T1Ѹa<bY|_eYx~ 9aP#10] $Cc.\v@OcRr[Y \V$hINb(qDqko /d` AsND4}﫧f 867`ij` vZ  h^ _4lر bg0\yu7ɸd׵a '"hxC%Vx>g-,ome #ٹMi6{$G}O9?*FV*Jݵk+[ʨT*6UMs*GsL,sa3%/*}Oef&w -0Yi[v&J\:Phjh"[ A#e^w #6l'p& Btܲq쩣Rv[j8!?fxH~)sq%IFQQ X` (u axZ:/80+ݏJzlڤJ_ʷM{R@B@K6.xx;lDQԲ<+6+oG e<@Segn#wvb[G51JJz f޴EoVm ',SŻf`_-+/%Kpw$nNQtrYV=iD}xo{I@? vi+U3i{L_'2ό}gILd"ٽP i3A ~ۜQ~ZA3VScYS2N洩R+UKpkjOS~{:h"{͔khj<$m=ARQNUBqO|Id$Nmc*:j)݆*oQp c2*Q v /Tch0 tgd{MfH`.L? 5͍ItNW@P?Z=acgQy;juS]udv&T& cZ6KbEEoKGt[/A{c%7ގtVyQQ7!`n!m;^Q%QR EAR8.y OMhȁ*f잫qqnN.$З.֠ C EPȾ6'"4+{V^vƞj$YZsT%Tt̟&BB94k7壖a@>uMъ%A"('u_[ ǨWWMTb5pƦ4n ~C[>W4~'4qn¦SC䥴ɂ4܅Sht 'N7Q1.ɆYf7/%اoT(wq#('0Sp`Aa刎NNo`mWze\'>VVs<\=H`V}}2$tۋ "`0䖳@2ih͔,vD9̓z6W)o1G>gz|%VJ +ڱɝ^:Q5|(>QJ:Jz'0'H LzG"#dSr' $XwxHC֪'X P27 )v␓ٔ %wcCpXt*\;_GQbctyA9O8\=tq^=ٹ0\&4l䜝꒦S °?Hj^Q [f3,U=l#.9'Fg1 goVK r6Yؾ1glcX~.496Lo!INy&ѢBp=u P=9[JS%hdBkv^ό| +ݑO]Xo j<F27A씾Leܵq_i:mPZRq`n5)):a@kFQn1z_8sNbƐjؒ\E6R/8WK7=7J>wlz7Z(,fHƆxe _'Ҩľk:/LҶEN=gzmP'_ΆGB7%5{2᠉_kؿVwQ-0hs+!%!Y$ZR g!Ԅ kU})uƿoBпhQ@}NҐeD<TeV)wֵ P 339Qmj(qЍ*rRvgewEQX>u&i>A>[[5M&j`Q!A[<|=a#6f U4}3 8Y7>t.\-~H솺 H#ny*R<brH$mZ\W J1Nd<-2}3RMXRE|<KB!O~\-p̦[pU"3>ۉ6 p0la1͝~|<KɄ(۔*ݘII+^Kճ .URXPA+{p.( 'ygb )'t,w%k3n +H_1Ц)(ijD$a#شMqYѢ' A?j}*"$SN(JߎR]#c qפ\ӟfm>jpgywLSA4ܥlEHg3BB|stA X2%`$XwO#䒺q#: [\ lS] he:xoABAYͼÇ-ԌzT~U`=0@^79@"Y\JLꥇjF3/.Tre?3(2Eh7bQǢJ2~[R@|ycEl8btO{+ D5DCd"l7zt\-!E-lk48כxUrb)lD!>/n^hrb K}!S/{ھ_wPC-h |:w.(na^{NѢ@:l1b]  !ƮA/b'~ F{? #: 641ZW8a5ܢ[qx&*mFUi  ?%L!ZI 2O>T?EHVkf*R@!mDJ9ʪYz A4do.Nxg.v~dzEV}],uTBM~-@I2;x㡆 (Z"~F޲L8A +֯ i0&-9B=fڒϦ3VЃ:434 p=i6jM%J~B\xŰY; uyiԕ{]J8b5/@"ȇEX)cNV,OmR3ou4DYСm 0_چ"m[j+UƦדө/ћv"uXKnJ(;;Gzoq<ɰfPH<(rPjHJbEotђ<\)JnDo脢5粱 Աjij/qP{csXS|x#wۀ\;zWaly}ɱ&q;%ulc5:[~ZB6wsD E8ژx-P,盗B #8]CE\C8˕73vS->z^30}II(pY^ͫ$%jvPtXb>> # JZt(gSIEՄShRU!q7Ԁ M[k`}'r%pqg7 >|bap|5؁A%[BW]j@F[ffQn3l2du/T28* 2row䲮J qads!)$RuA{|uNj"kPt4*#rBw|q@*G'ۢgN לIZN:2uմEbuuP+o{1E|~?F=y}K-O9kAa,/3HLr{8#9 Y d$kd%dة–i2N b [mb9/ϯk5G9g3 &l&Yge򀄿D,O_ɢcjצ~$ݮ>@5mJݻѯ΂z+M s`E anwGGpD"`davР9َ tg7cK?3bUPѥ!S7[V5[1.=́{Q'/ ,0bϕgY"$19=KiaOܟQ/H5@!G aG-gJ6P٬[imkł[H󹛸FRH*qB!lH`Lw~,Bѳ2%.zQ]`+/d{MhQPMV}ձ,SٳuܠM4 1MxpS" ^G\ꯜ#dNdj}o#dm.|t Ou}R|~4"^lD{r|@a-AIfMdkm-?AhX;j;6te!D.fd=h jA_tz4AyJt[qYH^ ( mqBc[,>7L9ߎ&`WPrLt(OP&Tbek(|i=n:-N$IPH}_><;e 5O&TZkT}ZJRҽc7*I9rCI1pvxFpAR~{Vl6ʄ/q֛d>FbσMúDr M&@zHma*(xceNW?3$y 1@uBz)av!֊3$xhZ8M# ހ/)hn,X\%EFM{aqCj`?Sr-rxF=Wzx@Po&&VtaPG E#&A>?y0W<4V;p 6Iꡜ>B<) zxR ڥ'70{H%Vf#cks:;VۯKņ1Cd$U~,h,\U; %ds8lٛщ1+g@*8?^!l"Sh1LnxLաF6XѲR1 p(~W bWi0d 2mGGz]ioH-Cf0%XB~dMO M? @VsۈWLh EPMZ=eT!+~ 7޹*Pt4JzŽI0d!>BpI4J&d 7^hTkTm'3| 8ZcŦ݀0Jfe0#!wl**acK~0ި4mz"";7h.3Qޙn91Z\-uys@S)?}~VJUʠ(8Nk黡V^x&&i˨twBܥ1 у>䅢W *x+9cc. tU9\T#>+"}Fz3w'ȃ аѹʴ{q#75"$U.0Xݜ-"ҥ@ B+ϠܦU8bx32o]91I'5]C\7(W1`Ĥb=П&oVe:=kS}Pir,Ft{" ~V1W-{237l*K5x&ڊo7x00HN6 E fq<37v`v&"0rX5G_[zuxFNK|Rmt/#6!t.hKg +$:m-%69ޏ7t/]WFt2x~~(Ԅ&E8ewj$~qic {F*N>r%isrxC-]5ے6F:@w!Խ)1(G؎qT~C4eB [E>7-;E2JS ?UOqovscX> /1)#nYɋ9{DFBz+'<ƚVZ1Upg xr&Q&#Ou'$YNײ7q*ZJVDm/@  qβph3/dOZ_z 2HRq;"L+&;Qf“twA3!z4 pT(_F]]gPx"<\Y>—9t{<<j/0!! <@h\\ Q2D#;HS|Wi- wIL9(2ǫ򕂠a xLX\ۮo{̂IDϵa(?@j+#lOԨ(RC@3&F5'B~uP7Z70yǥE*4 H]7fSfU<_VP[a wkVȅKOJqkPӵn J:mQ7č b0Af(Oj㿞 FYKk%CHZ>B{B")5㢌W{,~+ Q_=g)?X^oX-j.|n XD!FrTlg܇(=Wфfa6~F%̜3ZIQn!w 67oM>XV }9Y4V*:I5DI5Pa4@%23Ճs=Qf#za̹C5d(#CY/l)+U*F$=f6H܁&,m4o7"=]r-ER k+>7^ү]t}=*{wlsK.uԬ}QwzeDq }c4"c@5(m< )w/&"?VHsR|@g흁Cj7̇N&ʈm!&L/ y}c0]Rч|E=ni\31 Y0CjS+":;s",@kmwAeVF]LYܱ8 إȆ2l3Xe$>!fDo\8^5M᜿2ݼ?:i*DiG-$meBK}~5f !7Ҡh ɔdl(=-\=L:#NQ)nac}Jm.lOk?LQ.j},1k$k~=E'6A ~ߗdEr!ӦvrYu#9,1hvyzM_71jS (@*~`Jo{V3N~r$ose:qQ(^VO}N?Ts0kl-8*i!/ HZ'aP[/窍x'lUl2a[ '4'&0CCi-1褒ٹᚺg;ԐExۑp5>z'jb"57gRy_UӠ{#'*#Y,1t*n%_jY(:.K(y3yQ *: ކEz]Ck6s`ʖwvCnjsX!LDάuR1>,0{CP_ɜ̆BJ3vBn*!BF>sBnfPveC%n*R$akn~G(b:WLz$ީ%AE98?Hͽh 6XҨ%*͋ :ׇZJ7EC麿"@ڥx>m'&JC]}WK,w9 ʞļnT=ouh`eZ׺ru9(=ˊI`Ȭŏ@شD܊9(ZMXFjsv0J3~VTf߼x d2h懖 z#tq]N31&Fvfע!R qqԢSz$2*mQl{HhuH{kdzs( rFW92cG؎9ӧ@IȖ\HP/U:AZ\6aj}#Nҭ#Lch3yDqB\P&/rm$Ƅ~?`扚ˤطO/K1;ЍU^DDA3S 5JP@Sj?ԗ^DX{0H+Emupx#/ذuh@lߑxoU2(2gNEcqmlSj3g XB1HdEHBG\uᡝ1)ROb lyF,ROO=yrW#ۻf؇lHCODy0򉁄©$3`]d5Ti> I{Dj7J@Q0SNFN^,8%^U#fsu i Ŷ] fhjR)+/&ஸ$nMu2g&dϙƖty3 g1&zl(_G@y&f5RQɅ`B2`bJpX\oE;PGk ]j38 RN욱1q9ɚva>G(]OPD>N͇yght *0YlyPѸv7SS t"CnڥaEŔr[ I40۳;ćYmf dBfPhg5v,i'?3F5;;-51CQCY _֓9N xomדefA{ -Zh6 \ UlVHC i۟;U$ONs>GUEՍ+Q`=(.W] zs €yOܬ׵_9U|"혶҄3\Ƞz[Kht]"3,:8 @uL]KW,CFAb%8k M ""TεHk.QnSin1/(͆o{ z/^./Dy|dq q4rtOX!l|lv]6i 2>aG{wI& {2iuF*5~f҂ "wC% vhSJ!/.WU(E|?nnݞɵhBaٚ7{_BXGx$jQj']+%|ٱ~nq1ekK4ABBj`VmjPԜLHpl.RDCpAK.g!`ʆl6+9OjN UNNF-9Uze>NH؍8l,5d[_pL*h%݇corZAg{ Aҹi!Q.8U3gdsr\_XT~r*VU~Na;zR΀9`4"m=N`hEE06޼!Әt=xwacvcNs TR^$SA(Lss E pLL<*`F8J.~:;s>(k]UlLb ziO>a֥'A眤T&fWy phWqMNRo?ml@/[7\~Ba(7MpP CLҧ4ES,DnϙH}_ٛ<ieM!@i)w>=L-|^z/ZKz\ů1"w)u-U, BN!RviKeWv`⯑" Ma_*F7Uy>en<ܹ ݰNdkHpf-q&xcEt(0]=g *=;=jYzʙeX`Y#7F !cly6J2fd1j dV6{X fTG續'jxx#֏vOmb֚س!0okDǣռ;26yOR*i] d$YZ%EucmK pe5` JHbZ0pW WD-x7hqN5i܏gKt>;YYTguw-ӃwHM?lw1A# (LrS8" ^!ы-pY1 MA|7:z3$<"07x.#$XΆKZ{C TW_G ϫYUiARW6m\ 1\)9lBoU)qrUm<>VogZ/9ԲEWˊ adrS#n.M5q͓f p,oJ*l4gs yMdRcn6ElY]# /*4qɧ TU*o@NT$_ʐcLzZ`g_ U+FSiTR;#8Ga.Y^6nooqAm gcǬj]9TtTi0('EE!I v@%L7x&wɘPXq}3bkNLךTwp!%Y+ǭ֎ G;^n{gn;gSB G<'Pt҅`-&Zpr(U$dm-Ҭ2xt5T.z[ #PShOlUQ4&@%4(獺AhHS2+t@T^|:'/_=c3n%˙u~ >B0."\oUJr55^ }G#Α ʋpy"tձC/$|1=dAp#m V@ECxP;?CGJ'1./b)Fa_y,w!C>fz895 X K=j- ʌt* H|ZYpcȢWũ}oL#=N\ň5$Mry!x?+cM(#y i50s6 RQp|j;K̠9)2x7z9thq<"9m$.m?hZRgٕXk)8F$FqNeKLo@DC"dW|f4xe43Ɗj#0b \CV]E]'fp)-j&Z8S(jf-D?}>C½%AD.χm"Ʉ, !peO!\^ӛ"t`@*"bD =I'EZR1KJ$|c(Tj|6ri"aGZk qmw06|'bwTl,NS%WBTů@n@e隄a`ewrsflWզ6PSc`u%\FC$+:Z؉iXp;3R:dܦiqT+?!)#)o,MԊrP*_ց5bU}~:tY}Ń.fqKk2 ]P&]E/譞 65F-`5.n*g:R~55;Y ^RIM#5]0$V6bXi']q#L}h] L0OEҴZ 6ü@eIر؝:]** Ľ7II81vGGU>1l73T^1+ ^e*:raqSPn\˒2Sx\hi4p-ޖu˓FRJc/XZL۝7~Rp"dTB eçҖ]gzv䆬]믪Pӛp9 v2$MKFlaU{c];S?ؽ@)KZ*z-p)l~Q8)? o? 6n ;{$)X0'E% yt^ւ`FnaoX5v9rXI}/+kvo;a˯r pbyV b9.7<[l-_JDxLw 0;\wGˉ*I}Csp+5wݭ:&[nyDz[1JwI0 Qd"'>CO{, -^im f^O_YȀmA yd}yT=[zo{Tf?Vu)a魀-4|{}mioݶ}~]5(:@ ߍ>UgTbPbjkjMu*i®9޿_mBBКsҳZK.f-'q\a6ٿYδY+ .܀,1yҷ7CB/T[ah?WS\Nvѡ/-A\ ?`2P\1 +W 9Nfh 1lT:u;7meοf( C1__݃(yLX}M\پ>K0(K4KMF̖Ә?"K?%zގK \·iIreԏJ***en\8;"^8 Pc(.W8ߴȟg:vN+_:cq=ֵ㵘'ܳ*a=],%>og_E~se"}q=)T^C%\H =K80Sró*$τhgrY @~ѿ߯~?Ӗr7 ]eȈNx1x;E(%6!)bއ©~KN8N@O6p0uo3`HEC^I!$-3H7*fPU0#nK0R (^2nhS >^eX2e4t@c fsQVp`6Eqq=X>hJY_.{t>t[gPM^5%{gy"fr17)zGVfE(ΏD9v(Qes;6#,^m&wNlSC"f. M2U3mO@sS\A$X?ka@N$|]>F^fx܆ '(5r%8^]t&Z/ ~v:|{~(`UqQ*cWGN\xjIsqx$~zE(呧j-Wd[IBpqH!0q'dʵ䓶V o#@M]fЛeRhX6[|=2"&$(X"Ԣ(2Wx>"ˆhO% @, ܣ-fN{}2im={ڸRK:WZC4ISEkQl,F`?<䔨 Bx"je'Qr*X-GhF]g?2IZH텆+YK8-l z2fd]ʘ>.YJ\E^S I&]|n*P_'o!Zi=C 8:zpصy–0nPq_p1GI"u$啸mGc%Vx8@XTuQEM2co>o %a6C ޮA3Ъy{z\!zD +qءn=[We:ZZZ2IZ_1iA.{PzL2rSki`8xCFGx"]]*;ȈKěXPb0r\5ǯ'Ӛei6ya63aN@TU˪$p~م<]6r*03{G_9?]<|c蘣IBr vRi>/JxzC9cSb8:yGq1oPe:*ȟ#vo0xww~ϥ[EXλ6‚PHCQ ll1o .*:ťis+Qנe-vrco8l/VF/sdl =^!,+O0@bq`tŬSj<tMA/ ƣZzdzD몧x}OzU!ʙ#8~ f6q|[WdC=mxUW3"\fcVc-njzct O~8@H0ʣ,-7oO8aK\ 8@T{ܙ&Kc%S J]JҨnՉ7JK12e%o_*Xd]JbuPPK}a띃vV @)&o0n4aƪK:&ҩ(Mds="y3UNu9+W-K!j8v][&ŏ{i/wb6|+K3/B$+K`GSp*=:OPHcoT(@W|L&9ڌGАRzpF`2)fmWʟ"k9L䵪,tΣ4&kLӈ%nH?ٶ[p TFVCO^C'@d7 ÷Y":F&ȴS (Z9!W@SaD؎ ΖֆZkvuQ%šw!w9C#E)ɸU5 㹿׬0s%яt%D{!Q{гnGz9Bکs63wI-G,M88NڊʮQuzch穞ZRN 粏F}1,k;3v$HU}pGB 8L-;<}Yq4MK5|10Ið9PbTXBLe$~a9T$] !kk?~ESB>g(sȻ͜!b7a!Ov#h]&&U 11=OS*[p'f+fg0B-֣}v{6vuP}r3@||7Es4"sDCNkF[ԕiɄ^I H`V,G=9ɂm۰6DR<̋At0 E$l2<&@GfOJϢl;pK*J9خxE#v֔+ I+9kF@cr8|RnDzo-E8"E/.&^}?՗.\,Ց\hJòg{QVi^PFVb-ÕxcX)ځOɟm?)XeKy(DI],t26EX|İ5:v1- C,|\d%ܨMku)3Az3; 4~u8-W)z}pڡp\d D]2uu/ČGifd *2zuf$IOo綗(x+Uv%fx{Tc&#J ͤDk㉳_ &?W?-7SP#85iˬZlJ@kI+$U&8FcGSu!2t{s#nI+Ё n3a)/m$8ݙ-KkGFޚ,_wQp.:Cs2=:{1eyVO;3 %%no맡if&]G c̍-&^e89+BFvM- *9d+9ߟf4AlC\LTy s| ecfQP- \Tp Nge8)veu'%28BɀEOq α?炙0t-R ]÷S5Jε AmR^a>1* QtCW[LXx_8!ݫlL-誜zN`uuV)|PohnΠZٸb Ki@k.1 !Dph(Fx8{FLA>uc9Ńx4ʈpN\<04n*QUX۝ZQҏyEQ$@Dl{5(+#- AoföLY=0xGAxB,H]H;IY.{&-κdi~x:a1xCgcv[@ýp&VYgPMo.9,"mÛ7ӮsWOd툸K5?;#W> BxP4Vbepf#-IS.L:wӛF̪S@ "ezɲUr!ZcՕV[f8t-,9G YMu&e6j,b23//vS-)q,z&pt3gԥ( XuǴca0۳Q)RG f3}NR* o')ea3@.(2hU?UuME{OQnfzAtqLrޭD;7/fJy 9Mhqt`j ohlyvob08/❇S}25-Xȶ({fsNT+Ӫ@drssㅊV'W#@2^ =sxY_m~|1a%.#:sd@`"Phh[k +:h+alL읙S #0#٬K,pUYKxeVXZ^xB@GB YtB/\ 6Ҝ,uĂD&a)z9Z3 )ߣ!]Jv-Rx\*4!nс[Q:Mn>ayY֗Rs ?yi%]7 )}LE9;GgX ]9Y\Ճo3^@4+d{םw_!FKSpwh&6HåF3g]]B^/l>)mԌo0rnI蘫CC|OC$IoIp+ xƶSʭ, IcNYGN5zB"O,%?bI =_gߐs72}{owIX.lLpKs+a9 ˦텱TV_dBѹ؋V.9* iOD3,.b+i(Q*T㷇B?h7^y Y)uwE(q ae- 4ܩV (Yգ vm-W9>ZQZ:+_zWښADy+ eW,?cV4cn:ҟ&:Z:wQ+EܣMq:N Nlv@ ȠThufM9nY5U&['YݬaI`Lܓ恵-+U ) {n#O{DXnb"'DPdM2.6EW')1LK p hH4۰ QEmIws^zC=LݎgK@ eh?FK |q/A|ig+M!&eJhmu"pXfӫ*.$ӶQq]Q.˒P>8i?0%iSQ-*``n}@kZ|ڑ~ָl#(nRPOoM y9d̨JON倡{&\N.l1tLvVB3Hz9U2'mDϩ~nznޟyնcd9?n zZ3f~&vڅ6*=ݚLyuj+F@dߕ!aiƴN~eOoU\g6|M^ɰ ! {;g[#>Cսp'@ 鑖:YB~Ui1@eP5Rl̟F 9N=ȤA>Hbr}/tt ӚFS8ǤΨ{KNj.uiWB>R䰧}8M,EֹS0VW LV߉m%u8l<*^TTmn$P_`ѡ;ĵ=PKlD8"YES4(AGwB=`4[Z߆ Gm+ƤRK wJ/c|J1#=`g2jsY9'H,*gl)Ycs+(Е Um47)g ï ?AäYP n=3 k1325^{*90-O#p '{\˫WeCJ/ؘR?/50N6mU" i@ݐ9ypęgGM݅$a* I@$]m0՘3D4jla$5KHaT=Z8!#'0F6 ҄-,VX2XAy+efi>O\J-`5aeCGK?.V Kf `Ϯ! ̮#5*CBr@Q$jj!pu.5A&j)P˧uOUOs| -۬~X`'tx}]1:`~S)614 ЅTo5͸g xu9QZf0+( O b^+Setu6ìUO(( 6+b\)qkLieKaozFYƟ_>{ofG>*ơ_XfX=u$*mߪr.xZڶyDIn#: Ä"Rbax@qu//Xmh`[zPVR҇tY ,@ϯ Αfl~k L#Ck `^ۥ΍{) 'f,!C~TΠ)z&e n5F6ݚ@++еZՈћR;L'UÕo.j9`Evy0#=;4 ٮ~l #B& Cf%3\7&_SSM5|r(blKb}q]1FFֲ)FMɳlL}YxyT?= h(Jx䰰p@)xh;D퍝c _VL ml  QU_X$崇IaaQ ]X 'OI]!o_}÷ \Q݂p]=DY.L06'*~ַ94LdDm*-'u@M#fY4r"voږ|Cχ{a }Th U?Y=3 ڸNAX/G[!5 aqG;%Y'Z _Eto]&X& #ML fiv#&Yi4w <7o֞ 6)NFUNDǍ":hSwU:/"Ae~+JuT(HEČ!]@S `a^*Uڨ5H9{7'M ʛI/K.sb3%Ⴟ- -REnCT!ꋩ e!n:8ޤxkۖ#YָښzBiz{4$b{y F8TᛌoӞ~ }=gXG˓1!n _ز)|s8g^>MdzN{];Wݝ!D:L4"NW ;RHl] Ȭy]܋6%l`HbegMG+ !6}Ehq3 ċa5}csbKsU@S&< -eZ[+}7,"Fx/&[Z 0$\hx4jML> 7Xz(_Zˑ>p<9e$4D0-U}GM[{gvPi"8^̇N,ts}(TF!@ %9#3뎍 1ٸHO5h{ ܽ WM2ahCƯEV?}tIed<;ާvۺTd"*҃t?@)`$gjȹygt vC?GJO(O0FoSLD~_ΩrX.5pc4`"bqiLx?\> QR#UrRAg2~#1pUPz_S)bI5"z^7}@J3nFNt[ pMK0hN-y9qFљգ="G*J_mnf|~DrpS?)y1QJm䳍|?V]zɘ5؂ we:ȿeTq%>KE,HAHk2i,JT/'hlߒsl;L#t.\}Jw|Eg>?.'vJFVMs4JyYp @;몃0F8wxb|D21LZtz h}`0%p7 }9e;/HD]oaxOE /QIcWF4z Wf7ۦ͂3wRnC-9*FKj[nL{mz`rri8g}k纴|;Aٵy 5[F)jc6t NEkj ckDƆagϯ4n'"Olp}[9p8'2,8ޚwFb}ϼ:#x m}|qavo3}n0 ܳ) YO?L6!}sdbJ#2H/eTZk,r}IGJ |ϹDž$יjj QEM_]z^nš6j|_u$'@})M5[k<編dea6P+"g dGEŧ[h4Ef&ShYΝVT@lh'8;7 {fq7R$N&wݨ<@ō(nnWs;< FHa߬J7~u9YQ?k#%8ӿ*%?V|G.<TP,%"zpL 9ؚn5LҬp2kݵ/p^-:r|x3Ukw2Pkj؂D|nȉ]³Ȝmŋ0f+Ur*6p3vEӉA))bNjA*=(6$T md <(y}X&UЅ N&6aVJ·6%?mb/`pUd u'-~A:sTu#Vu{xF⎀oz8jG^|?=_Ne~ I~۬ҿL_o;&@]ùfHB `_w?n1Xb%̳aoNYHTJkD?賒83$Vp$ nW.Ӏf-h3tgR35$w{?e)?`>6u-/Qͽ5gnF:ͿݨL| [ <[i߄0`i)]\]:VX@x<`xFP*yAW I73q.y$i.C" )3,;yύ:xt& ki -1K'[[ǣϑ2ks'C 8cYk j@ NIՄs<2)ݼSW2sRY`#i*ôfJZV]Ҋn-'7 XEa82MذdjXˋ:<=M/\W۰Muy=0)^_~gH,zeu0;{s|'R/K`H7BmQ=83v*`,p&Z.*XNf3e 5|)TL(])=+ԃ-)nur\G?frl1ݘݣπ!Td{bmk3` ѽzmb u*IT)SzE"Bw9i{[Bf9 mR):5czAmo1RP,Ú鐗zfV0 F9TMY 5<(S&g;58.ё4Q5Yp:=oC Ty=î)W|? OvޑKVu!T\/cGG'*./6XL!:t5803jbrS5nѳѡt ,:NBC&PCl}J:'v#و >e01*xPqwۗ>pBBOe-ܟ]2)K8툘J#Ynz-)䃅=lkSS,̈W|`Ojn I8`wG4hdyyRI]$z)w+ A8ı 'v?Mu2 *R(1[!*/7W kx]d~]WqR(lxTH99׾T p9G6qTR1Tf"w{<.ƍ!;qA4XG&8<<՛(Hwi,F NTm2\ 3CoK "p]nzG!ɭ_wg"Z݁λmT2S (so\V BK]l˜/8z^ z(?^~Xog:y8YzdAWMf Kc$ "iSr?MJY5:{PW и tI< Jń[6HpZG!B\`U:!׊wH;nCCm1F4yzKK U{C@aaT|9K}qp'4PUt70fb0Y cβW(N(yvSэdt ʗeӱX31?qmu|0D\pЋ|>Ȁ:ӻꮎ {51qgUrf~N9+:k`u!ens:%ry$<<7!A{`gݏl'.42B|Jѳtm G^&CBL%ٙL/镕Oz@ii0EA@[pH58}Lq_ZgG 8R3.j0*ɌmEuP kA,oj_7ԭ4mlMIZۃdl'!mʦO[/;4!mp?ՙfA}QB6EzJaoNcyX)QNʤW\qq#$]@Ÿ|t}'3TelmJzigqt-c{W-h^ljأ/,gY'?" R/MTB3-v"v.=0:-_fȃtDl3Iu' q'^1#zq~hC]67$b%cH/8ooʉ =뺿KYhO sP6w mń27nH.Hz/u |-hZ^Neő 4 zZHGH =`-b ׎/}[OV5LڝqzޤD`fcYp\$ෛc*0u}%ga] ŮHT%]AbmEhh""g8vt1//+pA6,hPW#_wa'icF߶eIe6:nyJg7+> .xMtr@!%UkO[a\cTn ў$y 4[T--޺;G@j*u* <2ϐܝ/EHkA,à{?uOunr^| MMfHiBSî+6.ƴkɍ=GG3?* 43°-a~EuK\.h[eۇDz7[DqlP]-_'#NJ 8];0=ŊdYpGQhs3PB>XC<37ҷTDkxigi: 4 >q9i>j]w>W W";nhb )턤fLRbজJ@/( ZDlޥ^׆FGX[ 5Q Y IF2Djv?3Lw^~?tlof>y4tAY6NbAG < Hyny5_INFΑ&8֏>_P ,^#R|Wc+9`IN꫹j#ͼ <31[\e.4@+f%~"^ϣPCqe}__o>Ō'](=Avު,#h+~uHeػv(]-ݼ_q1 qYбVVPWqi)R) Pi=?AN[nzZz&|۶?4qĂ$tA@Jn4/ߪdz v¶Ap544Ф7åcsi{fM4:2enSE7ziN33}؍u>+a=G#7oXmoSs::8E5kNv0pŠ'QմwAzB޼LYg5k qELǖ1\ \jEQRSC#Wb[ %:dt^Kz陀> sZ3%jd]\\[96,ZFZ8A>`(ȧ'hBcZIZ;&NȆ 8}'K,ʈMv +U*)0& J<.9ԾVMftC~Y)5sbnQӾ7vϚx&,z7a-Sbik+@=GvAAՉ;;|XdKtk9eJCNI֭𙗄؃A5@8~S[;)Ni%8lɏÈv} )'853^) &}2CF RKJ}Fay3uXZ=6əS<|x#rJ͐:UX_]mE LBȤ ~I0{֮ZyokST,G},឴UhwV2z~z <?q~K) yNc&៲Ak.³&Gr6 }Zv bO<~ntDEÚX*LM2X7/,G.9rF|UpIG"M}?Gs8obN0W!P=]2&Ϸbt7c;ݐ|ܚo/F"ODX. d3vF4e HOa`'):mRŷ"/>Hj tJ)pd;xǦk.̾4R˜>85s`ȴLC9yآ–fUVQ7 =8\H7>[T6k%(?PPZ`y'8]7]]̜g~p ,͘!zһ Ob1z 5 uX%9@ـ^(}V=̾,yp1}` 0{}HW+5ti-2-uj_2}DqPBT(ĿR@m' J1j4ԺmWPiqK փTl3ȷ_$޼E%pf=,dU@APԊ <N!NdԨi!ʽl󫾆;f^oI=C@UfGq9s=Bg&!pDB[X^]&u-p _ưt{>E+g>3v(c>iMq~;ƭFyk@w0<4N$ `O܇9M Q2W[ݩj@8嶋>\"!f3}`hmhycλ/fByJW8/ }<^o@(ǮƺIKѺ,{uv5!ꠔΨ { ۫nI?5n1PC**4jejV1 rẫX_u5+sCk->0Xyg=c 2 D.ىW9A B58 CB1 :d(Q( :|Gi#lh{WېyFbiQ.u9uwSve]omCNxmMn/7+dCߴꢽ+ BEb퐿6< _x$=3ײ7u =0]6/} >+SlȬ}>5AsQP07/h&i\Myσz@KT} qW̹Z.dZvHՄA#_UGZs`:DAfJۺzͽIoSQ%!ϖKe&~VφtEUki˧_$e0ޟxr ԛY!Z d$j9D?J` ?ǜzwq Ys\c;Dz+t-dr:h_ "H;\M%cɥ0*X0܇fɟhX5ĽP}B$ܰ_f(|(r;CӃ{ĝ< hjfl/)CN+ {O >0/An LNd P~J`֐T3F:^Ch c_R 17b3e>s_?uK**hRb8Es:MP=Ѩe"'; 1-ruAEs#C'ZǷpD2ÆN4!j7@p|Px"b* j*O޹L`xFۭ'e,ى~Sjj'Y,~22 6#ZO%y}}K!iʼnLۢߓsg9eM !6m$a;80j~Cyw됤-x#coM<-oVvBnFDk|.oXlEhk8?FhY<2*xC MFԼ\Z-e[DxuTTb])a՝ްxˇ/"9'(/o""8{cbXۏ_7u [~',렁1t٢h[G硶~}Z:?3O~t 9e#1ָѦ{1y8hrE@*(jc!'tE(Ǧ݂ $Oq</L|X74:"nkBHLM6 i?\::!ʟVA]MG3ݼHӘi,f̨!>Tܴt7qG<&ުtb ぅ\L; `^!ڱ"<Yo"|>to?I Ig<Ė9#fxH}\pqn-4J}BpX.@&F <>^9aҋ~P_#-べ6oY=wn#]k2ֽ&Ohc]1msjС-1t G j,.J[i}@q\|{ܺ*_p1;r8ojt/pU^i?0}FƖL4y^;8Op!>d7~t0W%oB.葘`! BiH6t4#WajoVrdz׸6laQַ"Γh.aC+8Ѡ-B{%9C`AU 0x:9 $?db]gbh14,n5!Ѵ4 ۝ݏ+JLMc|v>ڒ7ҸTr[L ԅEP^]" N46}f7l?"yOҎSwl"b!y?qU(p+6*>[ZJI^gdM\#I$&Q+jj 7|v!4N8t vg x_U;ϲ,u7-`$P`v|0uYJ%jBkGAX,m,`nXJOP#;i?݄a/hpOeYes$y` CAQů=C-rΘLN- kC)@뭮AU9# E}ޤz 2P˭6#NM: W kQׁz/xgU9r'|)h5Ȇ\xK eZx|Vʮ24?]}TL𵼱"z5wTT-5!Hxǵbt 0{/AʫmBɲͩ2q[t%E:7%;Ƭ RG2]MrspL'ϨWbZ ySRxxv3{Y-n9V.|L7b1,LCH҆Sbxjd@=5ϒDJQVdO?b}@"$|fxfEz,? ǂOJu` vO䗼meDx-fbѽz~u|(@߆Y'2Ȉx@Aq~+y-UX7xBÐ< 7⻺G*9<.b8ҨX\Qes6e3tZҾkOp:Ww'7@_]Pzy*,$f{h<+#XDLtNuCe/Dg'^]ᔞjƄg m=ig0o.oޖt]2}#&xR=ֳ&u:;bW-D/^1{Hv%nKxڳ1[vk>!~C Gp`,%{>?1eл'#4s Ӿh#ys=#x:Df*;A 2ޅ;P)xAjJ\d}^Č2zo$!U5UfBM"U|2ȴu4͖ɷ2ozMUP$s 8oKn!<6䪼/0 1wC)z?e7b}:Frkzv?V:(5=e~:h5BJYGS,ғ` fat@æmǓ90̎d9{-g"Y!s4FD2^첡UK:| D6m SpƜu7OX <Ы6VL܎M9>W=zQe1&{IDP3hEz沰͏%7nx02d}?5dwn]TUheh&kh9pw{N ߫o#sP}M- 1ܻwg a.z|Uur@Ļp]X\wlM|6Ա!b3#2e+p+ZފAS Fx0-n+b嘺I',MCgW]eDϙ!lc 콈FBuziuM&f϶~ib IJ /5~=@ܻ'Wxaz&m_jOd(K.u|p0-b dzqXWhE>h0n XOjߟi",\PY~חܺs.Kj<+qeCrYH1svˆŽ?C~jJcX-Iևd2cE~䈖No]ʑ@^nZۭ9,ZJ^%u~K愘lye1ee=7ݦ_!Wft)/zHGBG U: &J9Q$Ml!Ac. w6S!_7^Sǭ Uk{Dz%XJ ~nktarjG NZ ߲gؗ-i8x>TEhf+{R0z dP:ǥ&L*7*뷣gxoF [Z(k Iy'#Y n܁%YM;"8bR!Ȼ@WpP?#~B#|эU؛،"AVmIOYP(cN/5952Op7R}z ډL2lP4` {Tݑ直:wME"%H@U(JBa~qV eglEt$%Z` tD_hU4whADT7W?5w.:cj7~ZAx73`ƾҩ6b~m0Ccm>ASycmh: ĉu*')IbE\jI&c"L"Xr_srme<*'Qs~|~s?ɤv41ʇhЀjo}g9kBxկ K/r%@O 9lڑIWrYׇʂ1'-Ѩ.g5{L$BښK@K#+ 艦ayH"dU5:.e'І,0t+HѢƫdpz̼ucީZc M/0 ;6GaYՒc7'U9Wɋjg d`0 dɷ(.2 )kl/1icH;W,9W㚉ɂH(j>q X%B*d vK/ =38Jc&{2*LKB׀ed>Y(Omurԟ%keX.0U`Cj.4(CyyUokA~%;v{':#"'nt?(cVTpss\R$"N)gE];0IS=@HcRN"vxg,P|_poFSmy{夃#6^Őj@*|ܰ9)ݚ՚Sr&f]:"AȾП@v=xۈ4 HIozDl?.0+3LPWLaG1ir0^##>Q> +[UaA\Dj&AcPQU.^@_}n+dg+jf0Q[|X\00t<#1]7qʚ|1=Ԣapm1ąf=EtzL(Mv Ц0Jd{0&%}\D_88<9ľtsr!4s+7b${5=KNНaX!M*+9Jo>'s/R7t)S|@I.KYْA 8{ZSF͖Y~-{e|zYJT)q6{ +ʸN Rz,˩YDZ` ce'0 3FYZ20.7 +S:{f Ee)(E3iSߗ׺˞A+QrT 3~X+ ǁJ5+О9e'$娱Nw8Fl9B@> e8ӰYf3Q(sы>v=ж dJ+aćF)7X|@&-\/nyk,`ضt򧎀QSj:uA݆7kE&01¼-ƩlՕ=3o@a]͊`w6*h9H$HBUuږ;_Tf F*QQfYs| VD;Җ-gB726i|J+YvRUXm yoFTPx]ˡ:rm}-S gR&,ד,)ʁxޥjCkh!'~_;z! b/ᘆq&r$}Y{[CJNS~!P$de/Vs m-X ڍI)7Z&+|Ԃ^Xa&C9ybӒ dC#/*HMF#ExCN_PxKjeY_cf"\THdvq ΟY_@űdj,p_@PK҂|G7brVH޴S$y[rKrI> !j%5hf3]gkK]%(UV]oP`c7Z4?&ygujq(lx%^KU:vQt HG=ŬaQAE5:Qh2n1cPh3p)qOյZF/>n*[fKČt807 `)Zi*kP wg+ Z$n8_c`'mg/ CF_wP_@03,rLEђQ+=Of^,ƁZG]X;=Ukk1LE}ۛjl+X1$Z9sXdCit-Y`heTf\Oҋ8BAf^n;hRePxַn '/<"GtE_UɲRY)ۜjK ls_29DRok ۄ?T:JI2~$yT(gإ,vNk EKt=7{=YI{Fuͳ#v ,/G[dNlͣ_T1a#a>[ &ާ?DUXyc }BQ@M"9Bgv@z±D*^ )z*]d(3Ȯ`6xrl5"@ՓGR2X^&*B*bϸCiy4 CgB>TO CG@.UEGmPʍ\Cx«+ƈRdE!7iנR;+3h ]\ Btg9axӔw]IE|;MI0@7[RmsSm뗒VQ{!ڟjo eTt3 ݜGB/.t%.~j+XSJ1&ay]%YE`>Rp?\Eړc`r9H!ř5I!CBmI=T8g(5R[yVnŭU}6tJ^OH+mWNGV..O]*Ha5f8Αk Ϣ, Ւz'[?7(87qW<>؜_)h0ƶ1"u ]C\T>;ս|v\nLƖ֪i S9BgѠ22UubE:| /7$_wt0EHC7h(,~UUdMV -c]0 X.]Mf媵T-t(!E% nFmN= )hw%wRf!VkFqd_{$ 8X$XjS 38رrB12=~P#N%od2ȝ[=ctxe"j{f|><<3Ch)ULF<9Xrߌ(` JS@f#*`0ŇKo3l쌒t]&ë́Cv|+^X2+h+%ըL8ˆ8-9{8-+e$ S L>@>YBNzS?ED>52'iuWvy%z03~H坺%b`Z4BBLgWoSysY'f6@QЬO( ,*)pɷ.gfG_S}S_>ÅǡOqgӐPv I|q'{wnw?+\ ?4/>D=3Abke0uαlp_lu 4Epl2iމ1x'^9Z5âm׉6#~`K,w\b渺ډޝUE '%ŊAy]K f:Ef:+vؑ 1&%I% ]c@hg븒aw;r,̚߻Z~QW)!QS]}, *NV[mO%d9 ?Gؗ̑Bdꅊx1vȷ Ibb螀]Y7pDM#r'@UBsu Q$%(O؞cs- ҂xsd栾>ib$ElF*ZqY5"Uz+b4 IʂQc?MnL邠Ykwi*Rһty3(HSWW6*ퟕIמ\OHf){ۭ]FCm8HGL' O2@O7Gp1h-$ڟ Iiu?E޻'Cю 7iH`2}mɒj~v\X!9yܠG; OMN$˧!& I7yoH'؁dT߷Y["?+)<(%7#%'*kʬYB p&0]Qy^YFDͯNLED䯗7\MbîF㥯Oߙz؅;hH<77*VM)41I,h|JxqpJ 9eXK3$YZẊ'W\{2nmGtxŔiG= ` 4{^JH$S~|Y6Rk}Z7:qV5_\ˣ}?k٬z:r%\nJΏ&Ip\B: QkN_=e:>uewu9͙G4T s=,+rCpuZb?wD) >/Ub1=!Jjob^SR'\\n V@p C()Uqދmo|]%&5 N?|e a ߤb3hhdmѬ=FX/3o)YQ<\ZtCu _d(驴 czݡfO#wl4zbTf:w&Y ޖ d5 _E߶aWGD5UȈou'ao9ٳ#j y,߰ ]%]|VPBS#bmo^A`h+Lz|&O:zm4leF+WF-Vb^7 s阐$ft~/J"3YUbQcz?>-K5F^ц.|0A2힨#h7<~OH)џ[œ;}еaՋ/iovȭfqF&<.@1 uDFgK@+}ɷ.ڧSZ(ľH v2@fg0!)T_ Z?Izg=#7; U2g܌)4 CL),ymk(fY*xe7Bd6Sw' /q4W'Id=?n,3$c/#*NϷq]h kE٥++A:%ډAOQ2Q) :I`0aW_^ yVARsX]fN8U:NYhr(?{u>{j^*D1Q+V?y~bsۃx%gƟY.Nal1AL褪uEA;#] 98Q'U_W# ೃ աj7 ^UPTzԤE,'<̓,&9ꊱIȣBrkCy&"Rހ=aYJR+#|!ʤ&n!lf+$?.E xҷچnWg m_>+!䱊"Y2qˬ$J DŽUYau)QV kgocŕVN y6F3 U^BʗDZʦg/MAFmKҐ-)&{JywtB5KJ [`͠EgE&Tfgq~b}]mY`)5 +Wm@D:I9-s+tsr u{(4m,{rJF6Zr-k(CU]8i8~#_8'z&;gƽHY A@Hlđ9>Ц3Ȓ FUw@hٲwB9^B+a*ȼU^6h ;{ `D)~i o&=І }V3ݾ2j韺¶Wj֞n=׫Z ?w~ZSgf9@ArVn;鶛䤞( *%y5ƭB0F[>0 s]D>7" X37N,YVDDNh苻NMhʞ@?&'W^1ܟ{AR>5#̑bcTS@Ir#p9\~0 #XmɾLXc#3H/ЍYF-#* ~RxCإ.Ż.1=JEs0[,Ty͍ o] O40}~eK-\ЛD?cz%qĆ|" 8ZR(pTVt}N)B0>yhWf@3V6^ `)٪FË٬i 1$UG^~Ɯ7J ץX#BDj:Tc3 @`mi{ckb1]Fz]k S)y\"v*W }pk۾ 6v<4;_V~80+\޻*S=T*#"k!ϩHbّ}ےM%q6c'p~b־DJ>a #!li40s†CDiY`лw"@l2 I9\H 3JaGeQ(.*Kc޾ί^m6K eX%W)A>oY+dr)q]9J]Y(%YɐWG*] & R$blޕk1 Ӯxrhjf+\ў/]zE&=!M ow"Zj- ATQ [w9PzM-U'g}0#F燤u9ZO9Ja'U*;}y{?R(HiB1읞2CBHkK8D)T\xi0#.j.h5>*9hWx|yAYOJ+Lqo_νEEhȾ#"m@Im݆[$}2Zpe2<7/guyeǺ0ovG|QG/3c^9e] g9aX7_͆}ylBPuz}?|1U-wgE`,% Uk]JB_,c";8¤[^4ҕBG,B Ч@an`[1aՏޞ'e/~IxSIi[^OC/W!tbbG|j1ֲ73Vжڙ,! oņdY*>l[3t#F#8OH`wB.В#pMΙSj~F'0Mdט.BH0NhV[0nB\J ra.oUVHp\KmVJ|ksi_yŭ(7j9r" v/\y⣛*:Bm'.f9ѥAe,*5hVm#KY"[ t1btaÁ4(+OJ_^1k-Y ѣ@kg:(RǓW.V V{-jb,+ WC$bbuära=Uue0o*2-;8 l}HPwo? GfOK4HF3ˠ?,FF̎*RL:Y>_fS19OnkgizE8ۼ/6ũK'&*UjƏ!iݬVs" j֎SRO#hr+-8 `DD)2s¤ rW5\Dh >0YPiL"Ntf#6UL.2 6wb`\1걮ifL`7`IC [ul'#½.p Xs >;0$_ sJ-z]4qQ-k&2KsVt"&&XnKGl,D=Z$[bY8[ڝV 4>ּR3h kV{Tc©Ţ~'k\DYE2(OC蚮br%QIe4sNvN0Ħ1 X+ZU:{P4C-#Oa" 92%^)_u4|e|Z׺_*u],Pf.n{\Oq#i6uGjpV?7%QkIoXcwO&:…R21}A  žmT0:  BD[9 1JN4AyT#u ;X(k!LMPZ,╯>wG"D rIXӗ\'YMBP*nf?4?r}3PF*~$LIW)9wg(b_:Rpv:Cfރ78vBj-3ƭɸv`0@{eojPNv K'~51>}~2yrmTk=;I=p9^2br۵ (xN{E4o4ȧFx/J, <[@‚d%TIM䃢+n`8qF%c?7BIݜWvklbWVKP*6.P]qZtwS(b\QUf"-cfHTZ\ d -LIq>퇒|#3t *Nfi4DJ lVvuaw60gp}LLOc~ Im 2a.w^dF//f0m= bp"o;PkMQ#ze]WQ#cm>cw9iYNV&` %!+wΕ`4v~0=ʩ4=aNBOxf@ {qT!{;!;V^o?uf~yZ:?[}qԶ壉] )Mlf{ctS~R{-!Y9aЄ 439=fHXig*=]|pR.)A Hn +Lng@i߰ڬ6z5C1@gj6'\xCն :DU3D`{t,'} 1T /ݖ酆UXUe/lVԨ2登(󺅟InAnFm$?Z? d>΄^RN]F꧷+6@]к;" =̆h>NfMj妵YU"/☶ BYWRf~W2nJ#eIy+ZR+!Y̅#_M9q6e쵥.{WI*U  ѩf7^m1[xm]U2.`f5ͼ>om7k0v>T4CdbկܧevSytyF 0?]J.D,]핾9'ٛ{ PӨ"^ %IWSRrN_L B)oY@((ZxI%s(OXp;fWF:##ien%)wl,'P9fLC{$TjP]`nONao6ogtI LD651{no#7uc$ˡaXbMSV/zS/d?nò:ߜ[/~5"ϏT׃bdcFz2 [b@Viyra%.:Rҭ!8ҎZ7۰)`m]}6'%_ ơVn+\ ꠠ`{ݢ6+Eᝍi .zi46;F_߸;!ޘM]#R6nmÃTe>~t)n ԅjhҙn ks[~ BuuGu k/ y!]A|l"X9 `)e){pAd"3qv[ c7FPK HFivqؕh}#rƐN<^d7'4'xTbI=9[N96]:^zNH>S+i Fb]tq`@E`&ݖqa#0%6d2X7r?>,XzRV2[ `G]E^]pB@; Wg^S?Dn*KZSg%O_dXj]#jܻz![!̙ɞ\(;o@[_K[݉jiik__lSxex=?!O=dLM^vT1{UMXW'E'ٷnybX/pA&X"j|2\aeubgxP1afݤPJ@3G5\3/ @7,N{9sqz4F0URG秥v7g{}26Z)(W0{mHiySwSĭ *n۟b!-NxYЊ*\W)bа/Lߟ8nY.9_NY9nHN ե5]!դս6ƍErq@4݊3Wlm]ub8iݨ̀0pD 7|&QG7mGReJgp&P)m~Vh-!!_UMQ;^RȤqCS$xŤ*U)n71oZqx@*hy<=<MqoisO{n%}VJ b i<+cG j,,*sN!Hwh!hl_nCٌ;`WY,J>5y6[d-wmۋ5OeGElH#3S[F^O!#85Mhv@y"-JQ@QyQ=_LzDhh|=; Y;U?a7N+Gî.Skv 39Xe ʼ[?H9Q{⼚f2"u!0/䛲""q)ybL{6ă0>/g8/eml-Oʳ6%+3DXdV@Ȏ{ 1bi[byP;^0,u24N]L&n:-;ެng z{sCbck[fs %'Y˼vUɆ3+B<_>dC¦;UrOa2$N<s?p3W:ӴW:!h?޸('ru ㊯p1"e"m%ulÞNVzJp̩bȼJG7+$Qsۨ@0Z]ānxaPC',VS7:WDW<9-e^'H1>iJ41}~{306P55//\~I aQZyS8IxOUгNb#:?zfrLbC3"1qjG&*3غ_;6;X V6<'ӶgՄ{\ICbRq>7~t a6\nHQ=_|e?M%疣#gՈWr7aW;r{˺``ju;P6 +=oG8Qd%4GSLmk~ \,y)sxMwdl\o2M\x6H; hwZQc& ̨V'vk?h/;#'s8i)*1{;;D$,|pAR]hmIBZ|nވ/>:,n>;1>Ġ/{X( 9 -EdG0K~3G<[0ɣƓ!ǴHz)ir t4:YVė9Hc*7;mUEiƄtd:^0nk6D.lB"\s2PO raYʁ [wt, M)z9-Au ~AU0['7¢ +#D4X.2-H9V+)8s󔣯0L`7Yp>ɡF栜>_ Pbin{q^{p'&ЮhbӷNeĿǿZZ sBY{썠A%{9Sr U5*K+1,K8ߌC!jMd Lz+~3yom`u$'7O4dfW3if"5)gG-7_p -0T,Cc*ezLڡAK@^sW3pRHgB>儚È3߻LϬՆ'G331:+dMܴ(C4vQM\FKySg.}n_I,w١z>HBV K7gRS19ܴ` הkW:Ǫ`+cKڀ|Y gzdvyX eF weJ<_ٔcR4M@£3UCl:tcxD߭nc5>i}e^/HYA]NQ7]Xu _Svŷ2f|z \A/!$%1SI:lP:7 뼐^q3Չw @g&(i$Ys&%k߈aSgh=9)@\k9pzċKm'aP"y063…Luz^ lӤަ KϴxaO[x[\#50yE0>7w-v:M>ED.ҕX4Muʪ:kR5 #Do680#{ïJPG˚(fNPyxN֨;I|<=IEYh̡yм\{QCX}1kǭPoi hL}2+z } :;xN@,a+_Y>Y[\ BMs>x.6= u;œk7"OG=(}eȇ(a(v٘Lv&k%T$C`*_<\R 7gW1NZQХt]Lx1KK=ôkKq}ThYYjɢ[K )v#xU+B}9oSqzG]1( TJ Uk%zωG @ /u̮>Nf6X7ڢj^Ed?#P5y :kObUMJ6oM *k#R',FB5^1TeuDD~nFND6Q=yBbȌi^3,sIP+%{ilrc'{.|7zx=+f+Tdu7Ӿ Ǣ[Pc6ZXa9¿۲_USlRR¢Pf8R)7 QVϔ c R0j Tا O= o|ײژ |\]jJ ^'P>:zsq5WaeuvF1U]Up"7s jPhɡ#@]WM3$nA gt/Br14I(`_LX?бXElc<%grVq k9A8_:I3 3qrXzL < PκG)RaJ^U1\9,!@AvĎclwMJ[}fu[(vk̥Q~? d1 bD(`cgJ{8BC{'FDÌז$>7"el0#Ҿȁ(1H=(})N?\`SR [jVT 0X4BC$?GD@lNu9ۇWx؃v 5IRb-[^])zCdel&l$V|8f7Y~:f1⼖~{Gܦ݄hcC ֽdjG0}>8Yt%s1΍)=7^C/Y 2 f}2,.S 9cYyri 2?3K9m]EdX+@APS]CJ]Eo6#MٟJ%͜15>'Շ#:z+xi+%Y9~@1଻mٗu2MSI%XY]GC͢`X2TYP$[Yܠ!f b ~owk㞮 5M`;)1L(y L@jA7KvaE9-vs7mץ(Z#1:gzc{|quYW;cI& )y( \R1pV |7 vKQ͹wp:Dj^mĎx,{ETg#pϙGW1.2o^?Eg(tՕj{ޝtjlwnwpJ\k|_se ' Eh{T f:Z50Q?Q+l6F=pp,pvBK/=T@1R7!<'*9 <:F XibUTp&R?cbp}Qb Q=J/ac1. Q& 47ja;%;TsGsաQ5M,=eƕv7IqAo۰l1|pRٍ[-~_}(D,)/$1lc2 i~>łx-_r^T~+5S#|JX|In&4@,w\?41D (xs\6i,|\%Ve(=oM5iRV`qp* ye [^j^/OH8@D$z*>.5:Z0dXnANtmjjӿ$QXDža-,!Z^#o0^Ո0:t>VT PQ{(x6Qw] -L89jZIdžD<@f.I᠘ID5rwO~%X;,.'|9.) `uTyCSZA[3z9U|x- p\*,v{Y+/EQg[(r7qҲqPq-KKWZs)ܑ%;ivvܬ*!R}|Ђ+7BV[QAfK~-ou}7'|w4sjA,wӳ]f6))OR4+R7+AʕsB *{{'i" "6ş  =(gW̗ >h:J yvD,FvKlstʝү)1)G|V]\ITEjxT. ƴE b/Vr2"FIAcZBn+VmvjۺG+Q^iі(з'2PX' b֤ v>Vz.m'/֡2;sb:> @K@ ug}홐o#i Pfz,,/1q4z!/o=5 .sM $M]X" `9nf5l0a REfǎ,KK 1`@ ! M&4aF FSU(1'Et%2;MhqZ'q)L4{1'l(dB}5Ey~Wm,;RJEAb!ړTJJ%E#T-pl#sz&B ӧH0ƟNKgBYbUcrf野H,',|{BwsZX tbjW*9pψPUrO61^$ D~JM`d~%LeO]Fu?rúsvީWUHP3Vu ?' ÷3듞 ]Y:li;@w)s-D38~FcOΐ=UAc*L%%#ϘlNnQz ʼҏ,Y׼$f#Izqrѧ<q ~8jL0k0vͬ_Ն4Rb)- [9ȵzy9\Ț|p[ g{lSk%}ג7Ow'Gc1 qנ &e`лo"dx+=w$WBD> ƎtAG2$۾FE :i 2퐃 Nyhͻ dlq'_:S=㐷\ vIsGڪ gQc_v p!kLa%jwp3>;z`귿ܡz?f FFzݏ[5D)ƎWOrFp~N )M |]oF`4O}l}嫫ȟvE PzbOS.Ψso% 0OOA~.7ɶM kƢW$8eUOsH򱺎uj>FmD&hUGwμm1-$$<`)'&ĕNP4RwqY[y੩Z vSZW择%e'< l|alrG|`Cȱ (w޼+n7.m\x j&(7p@L3|q9 c7 i.pb2j};+AAQ;%ɽA$BLH |0i2n9Y1Ƣ~p:˫ޠ-bgu[ E봿W-5- fj1iHVhnyZڙK0 Z`A~i`>]05#b+SK [2^d!dYZE1)s:%X z =1(5PCį@@Fq8X|A ſ3M!]W1uv:p3XS OŸN@'`?(a8PF ^hd6u<0:U~FJj.gq^ %n*wEwmkjWLp]79e j="˟¥lpyy.0>[g =Qng)}/]Բ"2F<`LBKh䯗3Ñ;uAU:%7S9[? E8-ޛW'9 샑bU[n.%[S.$-|€84iH._=1lFw2jlC%}5bt\*<2B-(-hJ43Y$qy<.ߚ] I ؇n3A4*{Xǀ@wmJwqADjԈ]܊=_Bq(A"ٞl5w&1ȬGv -:!E]=?deJ$ k4՛xL'衄!fQpMM#[:^=CleK  kMXa%ɉ+&@^[5 wF'2/m\"mXlL>=$@bM2) IyJ&T'W;0S&?/Ipk9E8'[&<>gY0-zo$Nҁ tk, H3V!~dkJQs/TC}\ZmlĽH иW-">Ƒzñik4 $#LO69GI#{F SQDġ]H?W02mGi!U`,},6_'86mXTѻL$'u)rܒ?R {:0|TcPb}a`<חi7-c3 سͷȩ-4ư<`(x|0>ORCMki>F:<Va!IęBQ;UDq>E 9SL8Z[(FbM.'-`su,T&.Q)H_2 .6h\)RԔYs5.IOEa?A 6 ȹ ZV*G+JXcj+#Ϙap{8$aiovٹGI0RW&ئ u߭..^2;p;dDzKJcZ^Fu߫BXOqC᎛-txsrᡝGtBTKm~^5Tpy/{;ؖ@IڶpН $W?*Z7AfiV }l-cxR{M_IhBs]sJ,e&d͂īq4i[D/9EV`Esn¥n{GMNTCA:>֔ixx!&5WȖ uEx[&2_p^~&]u9[_Gts|['rvĊ>(ZDkSaYlvP=uH3OS7l͈.&M'۬ ۂIs 3 fv F%:w#+ c{qX7׹(%&F)A.*V3"SkZZ!/TSߝ$OA0J"wE, "<T&tp@{/׃K~MTfg<]h}-ѪYQ֟#X;#H$)GnÊ>B.(}3o #&:{i*h_#Gy-(+̲c-Uɳm3ϷuARuW P65*yI<8-d>8Rxhhi6;yr'86h2;{ٵɭ5R'%GۓtlɅpqUi#U˄U0X::U 4vOhx.ĵ֘|o@ kձڶۜqg*vgN7:[zX3[lsAѝ3l~կ*u@yޛC+F[P]SGhSYL"9؀;Th~kSlźɢwתrҲ>n 'LMCH2# K}$.NUdI XхG4 xb#A9/sA^$HZ.-֗]\ HzHhSO?=*(v"ze R`* ɦI 0?z{',AL->P)ܴRUþy,Xmm+V^ T!m+ȨdP^] dyA|CGL-Ѐ>Yꋔ|&U8_,6n8 bgQUGc1wUitFflM->: J= q_e_X&i !\ǎJg|v{Tc߷;J9N=Z8{k=y8Q.I~\NB;] ~ʹ,~+DT$q4Y0WqcDDQё>`-@(1~@3Ŏ' 7i@ϸ"F:J" {䄓S&B GٸȁM9zV%hru\;-wOh~lKρPƍ ~p{( 3#NQ%#@] 'EpzE&&LFNX8=F=u7&׭ niw@۸bbkf]C~KB1،G^]&̵Lo{T*jQC0L!|P?o3AMbU0Xd۰u"b^Tұ!>ogdZwō.|10sC~ ٌ;ǀNAnHꥌpm}<+/H;4A1L$ mEb7ɱ5z#nوw!&?MiJ5bT 'Y-s|ZGVȨ9 BD"_V췚 J9L5U# o>K;WBfkۋ x@VFlKFvhU&ҹƅN;j x1 p!'쓩~5HϨ3`xY߲ +wDQ%Bɚ"s1 U,wqZahД\3- nl"+@'6|(pl&ZyPJ7Y&'M˪f?Gjg7!QZ?]e\*'5y2F} mfwhZr4n8!nǡ vL~%MfcĦ?#ᕚ5< <|2'p>*گz7C }scų|lǩ6|ïxG:rM}RT֬e ҵo I'/L#ɜb)P [8_O>QR!DE;['h [9KJ jiq64J"cW+4j ^ɉ~vƼ%[nrßq]RB8ur-ozŊ̸ג6 >/)_ͫ+K[/+ŌX0SM-4u0A 1r,ˊ7`ą0eGk|2xf5(EmI*.;WZqlK?o$U+=r V6ixʮx2hu5lЪhBx"+lK@: إn4M?WNݤloXYIM$}*ϗik7,ay*}]דMaŹ7Qa,buLvM2gfy[ (e2^d)gaU÷,7mϐ~HAkwMl8w*)`_]%mPԩ7*-SmF%:R#iXdN1aZxl@V=3ֆ~84O{@oD]D;,`u?F2(} ,73RҚ'3fP?EpngCSwVyٜ:8kHSccU]YJs+nOV{Ir4BԃV {c@GOj]E8:sn395Pӫ}F3YVD7BtbGY7H_Mr D1 ΦStHZUGqysEpB [==|𯜴I/Lm0R6S _mIFI bvgU,DѮw@X" U ʰ+ؠ $[T`I,?c{Q^! G"5r@0\|I2L"u_]صcTR$y68KmHf% u52l?/?t](p{le%EfxT棽ria"~4;tώH-VH~u/1)TY㔻]w;z#x}{}ƽ6с6qm?n+q.wY*90HIo%V,A,U8+4>UM>1LO6ZM\yg?J- =L|fr7* Dq:j/)"c( 6VMS3&GG.ɁZXufe݀AyӰȰpڶyv4YruqsF%Is]6W 8,}Snk-|V;Um9rH +U+i40'sn_ ;&ۼr4fgU=zL h ձ,8 F?Qb.pP.HJC*%$5# ВϥشφhG>VFjK@yNn&ֳ)z9e`?@v\*Nׄ5s3yeݰR 4@1hph1SUa|"ƃ"~%O![D~OI#?o?B\V&QY$-+YLc}s @Ln;<{{XDy H34xDZiYsKܯI *)vam^LzoG|j"W  aIm0ZJL@\$q}UP(Ί$"LNf%?ҰJ*J%t>rhЖ?hX# 4 b=E!pV{?M`쓹-2L1OT ^"ַEeV>'6KOLp("jZbT[=2X\ob%z dԾ%%dWCbyz0źM\Ƕ,-Lҿ Yܑ'n|^!{\@EVkG\1۾zPyw`)f KeJy?"v[ݟ=ggko>sC{Yhi$FX&g]QPe9vXwB0s_SSɐ*6V:`YRMN7&!эEf@NM shcx 0[r-=tRfVC0=1@8 1ѷ'`կtQO;z*Lķ=B01/:$Uy}S)³B;yœjث[Rhx:Q#``^LF~n<ֳ}?I00Z-F΁a]ay.QMuO>A#^ᛝٞpAc3 ^s`4c#/n]^y ȓ hHc9ز$8pFm{NTYձz tP+͟ CJ g(@#? !=d@Qjb;ݸ>G fn=+X\V:~Ll96 Ck DsR ;!z@p LP4yLw _&dNdԣ Fn{iٕ4^6L\ojYJL #ih5TvLF ]Y:w2dfur3EM lUtPA sLoBYU`ka(n~eYLU'֞rٸ`9$^AŭHQfML"Uݯ庛 *LgHp7P%GXE$W@J/*b*Y؝LA yKu~.?T_[3pYwvzQ1l{aS.FUźpAmvE`衤Xgu*lH -2ђtW/&-\3FNߥp.sX&)Q݁nOB+ҩɆ[|L!.B?sXA->q7醯2PNЅ 4.su$iwGPH1B1ÿkD##a?YDIe j0tf#-bpaci r|IoCF Nhӯ:׃x!a7?X ֖C:T2 f汜|G4haD炨8Gm]W]KcGI?Z(68*5[H{l^p=JF!"RR -gV/8{CKp%o~a囙ĭsF! rhʘJa&Tש @*^wLN{_@^Ӝ壓{I0NS53n][DhA#4~Ǫ|1̽C㱑S|aT* v.̊nHACFfã84vP s*_>^^Z{`%V$.j!`f65i+WrsXy;S'Ib>JEz8XyML62[+sÍݤcRiu H&,簔= * ; qwj ڬ.Cii! W}2i=jq1 2plWq44Wv@sm#.RD_'b&kֱ1Լ\ܢآsCNl+oݡ+F+QjO VE m-ݞu]emsvaF7Uֻ%` $qi38Ebex &0 x۶ )ʜ EY*4WjH9¿\ \֙n|B,mO>J%Ǒngy椉y!aI_GW`J+tk; /3FPvZPł@BԳey4[sA"( +)<< .;BI8_EzJnijHk M>H>RqrbTӥ/DEai~FiwZ[mg)$JV&pk3Ά kxVNU; M`\69x*xYC^7!z DL ڲTW w9ke8i ,Qux7V HF矀6V0-Lk}zwq̳r~tgaNqp۶a`)'2T_O n@vd-]Bہg87ѳ~gk';&*ҴJokڠ 37]q_VVɆRNmq؋wYgC[BUwnd=D-ۇyjPPArjnpt)Xu >ǎ"FɃwC%Zd/Z泴̈/ꈲK3ّpW$ezGoک+9$)ע]~IH֦a% [nRSL.e|sig QF*XVD|BqfJUn' WH01 [Ҩrxx{h4N)h@U=o<|F|5yDt=k<)f(,r }#9Ӯ'AMri_8 Q4W1ȞD u,O k>rsƑ`@.u ,da#\$+[UlA*/yGy(zό7?nM /A,I,zR / L{Q!EqmQ'}ȸC!V8Q:**[c,kz(ف5dy Ђz6oe8|]y= N7yp";9w|a?3LZGfj|d@5la(ύ&5$}.Ea`2RC)J6 _b8퍟6W oJ^T^|E#૵2 -m1¦|BA(\*ևm4 b6Xyb_fYNd%Q)>AŠ{1>,"doaћ כRX]ص;F4 Zanb8׌QveԜǻB L;AGRO;s[УK`9Xm}.\(;=5Q-4*2P3eAbC ,4!D*`Mk3tB'P(0H;T~%t=2bbg\ԝHi*Bk5f>~DLZ,`m:!C':>s6&pӉC?WXx);wހ[N@V 7Dw6[O huƬT8q>P6CB}:!|`i<kۂi}}Еf^?$ zLR#HL=g5#L0oUHʅŒoNw1kЭ21Sr'"1;a5MDN6/20Aa,;&~})wޞlgRsk1'W+>P鬽 :jGJ='^ O4%V"5GYa ?SyD^O$NKRjK M!閌1Cq5fQ?ʔ8޽W6BW`α7{Q+_(2~߬I"Jڍ^=Bҍ`q4?9l$eI7e`mK} #NJYLo ,Ƒ&po#. wL^{!muNroz 6'gSAZv0k/KӸghPV9+T?u6 VO27`I:QzjY1HSQ뻄tâƈWYq˴N:U[<Y[OIql!z_kr]4]ܝc^:( -7 6B -dT>N} VWgDLS]^fol֣ l8Im1t ͛ڭj$ Vb8e6~6uʿv.L6NO8/\^2]XoZ 1 .RfFkC5|'Ft%9^/[TMn`.ôM5Y=TVUG}}+-  jxDiDv%Zٙp7Nn60tL~m"t ξ(&[]w$(e j$m[]j4-hyEmpN {e:1kCA|Mqm}>m=$J)G>Kɠ`eBOp}?EMDe%h䑓QSRwnTh\i)}?ͺ#L)x͒ʡǍi",ʧBȿ4(u*]E`:`Or.+$cOz%o,E[)ΈUA^'Kl # 2Ra4O:>Ϯ_N:1b|Yh,VcƦP=p@ ǺһIY$%2_f$? EęR9 s!'j[MF#Z U=Mi!Ąc,ȧ'}V1.zutt&c4M  I(ZU ;BxA^(41(Y9gf1@$4/ZH-wJ5RzXq<"lbu'lF~2뼒΁嬻h1,|z^덄qeMIv⡚}41yyTaDB=V*~"2b#sGy:>w!u%GBie3lhsGC^ 3#kWцl꯺Il.Z5HD9ɨS%{&a>yiQLk'Tj) &䔶rBܖϘ_l2"8<7 ѮjGu 0f{q ȺfK~-S/fv"fDy#B0>2@XBKةW#9š8HXt`wX4LY$rim`LH ֕EM+HzJ - He B<21/WC Vޑ>Bmϋ"j'kv;e}Rz.@ 04Lc&1-.W >¬=f- Pu KڧC; &< R\m3.얭>b،xcI,Gƒe =?d9,?bg}C|oyu"isq˷(C0YҸz不wyBeSkFM8 k# '\QԻ3 Ƹ^v!c@nC2F|RW(CY4K.m?]Hġ&ZZJf ˷L胿V,$-t]^Ap4ˑp_ϝ$F14؟ ْ{pE!d@NZX$:Ʃ3%i 7#S3X2 у Ce6ZISCFrx&f"K)0!hŻGb.UB) 3^k݁`uN!6#'KrW$Ɇ= tGW:|+*nA2?ۤ~ͫ]@3mѭx7$aS?Yi[U_ZK`RƇZtOoo }y)ܾqPbIBrjZp\-B"*%B%[tܺ>([ƌD3&Lhd )ձk~KteLQ#X`7[tf Jȷ!IRe?ckKdL~sH0_,ae.C {[Ű2;uqW&!N[&FR%)7>wCk%=wJl=ԅ*`/VhP/! &cdإMҲzr!nv^@J(.ąU@8@9ƶ)4y'NIGQ ^qifh^ ɂs?Ct Fi4C{)Am؅I==:3QR@}Rj -松TyHLip< PL(iM7Է;JEKY*}iyHձvTۆ ~.E](1uK7x!WR e/1k7/x-k41(3eccM3ԸFi''͞Y c]_GT&&hQRXEZ!V_ 2~k`K]0uVBM{M/li%؇ӟ)QbyTaS2 ŵ븢5(]njV94`o br%C0hG~p9/bYh?;U9~%Y.lI"n/\ꮥߚJ]<;|/D֛HԔh7zKMλj9R.I!. @[Hݡb:P*YEuw/ 9ْ"7h!.[>Ǒ]<;; Uk`K rPFqh2F%̏]h]ݬVvsb3'j~_-9OL15?|G*w4Յu^{njxk5]gIӌ mB4k 3|7L( :?}"'|b*6AZ,3͑}b` LJTRVvQ7&}q#%ԩ^c7pnpTȵ71旦9[!YymS7%:ū#PJ iLlp{F==wFWM*e/~>0yq2#zQ_Rx!eeӥBgFh-X[!ޫ3BmmCpHj>pFn^Y*.kZ].285AVŏ.(\ T7&+.uc6n-V=[?!U]J!]E5c`Uv;L e58=5!-|7+[;5KCtWdjP7C@}F ed|TF}w-R[x[@ GXN5Nn2߁IckסV jVvm'zN'0Zl3Xn^m, EI3q`rPHjC euj_Q]**GBG諮op$*MҠ(wJ^ړ;Xi<\|n}W@ŝ$vEGK}c})JbIu-㝎O`IlOp"Ζhwc9:m{m 4JԹ>0sW2.ܖ;(% J~0u]R'*Mc";HĶt#M8t:Vߙ&>32 srdSs^a(R=@cz'0@Ω~*oʃQd7P1 u51Y1SO[:Z"A޿qvm^  eP;uiS  nOA'*zEc+-j9o?Dcy!e0<ǓatS'Jْځ?C: <3 MQfWh L䰕ˀ%(~\l9$Jr-ЇW Ͱq'Eu-c#M˻\!;|J?1vRcT܄~̭f 4>-3Ipİ؂-:eJiKIDEgœ]1*"K0W@.U[wp}mI48nOD.L@9u&Eϟc]3eYf@ !vbsm= M%pďhFrf=\ri>u@/,_W͖. @\ڳ=t <Xa$l)A $o ^$1AѽAxNƂJpūnAʾkE`*'<+ ce~#2uy qQoiŧɎ ft %Cا'a PJ3t/nDm!RƲv|ıyhSdq #Yǽ|hDy~ "~kTgVH=҄=}hI4 Шjc11Wx`:\B,? (r& {aɴ%ǴY_4wrlZ G6q akG k{(x;\MXH(!q)p̨-,:E#( :3KU~͢Gա|k/,Zhb6/kGj՝Bf7πķ>D7vDB< p7zCf#j !KJ< dYX!>Y}hG[X6.n?TIRne F!o0i {0dqrm鰉aÍhcou +!$wsANĞ\VLrC`))Ǧ?󆂲mdn h:Lz\4ɀpyǖVfSwjh䃦OۅgoB, q1}UCXA rP:{H4f![w/}?Q+w(@ŦNM:/TT 3cZ,Qʲq&8J?n|ޯxO\ Nk7 j!9B?8 +PBM6~%ƈ_U؏v>'[0oYd׀ɝ~&A{GK@QS'I ތ}7vA-U*G!:"*^Q`q XdX370q^TbBܴ:v0l //4"_3qtVٺ]ZNgmON  D-աCc;ZJYj ^MNMI! % _]*Z!*Y{M^?axKF'bYqY 3QzC4> Nܒ6Cz&.: U7BZ*)=zDk˦PP/7AO'qGd뜫!32_K)4ntZb(v?mj0=)tL/:"}xzZC2gOKNl5Qn冾K9ovu( Zm|7U r6D-;0Xv"2J81t?oH\Eax77<$@&EpYg5c7Dbˀ\^ڏ?e/muk^ZKп!*!ќeQWN;9X_g+/G—Pʙcbc,ң.diJ\IF^j;r6XBKtS(s1 yY=mq-UTT  )T>wc-il0oq :fmLU9z$4GWƸ&8y5yz}HF4dPՋŝKV%m!*!/gK#~Fq;܎Y}5~(oބmk4+Id[hԣYfY:@_Xܛ6QlE(cxq LFqn`̃{DW"OEJ0pR@ΰ 8ϩ*@ٴ?2qϝ.:{{(B`oQ4[8'?%SAc팒 '+Hyߚ  \ ͙1wnj| p4"uќ$ͽE33KũPV^I@M5%7xa@QBˢIH! 7*rY%/kF3 7rnKY8˜mq;RlaW׌p{f-K 9:K&[ǶeBPw\h~a ,;S@zc>Wq' l=:m^%eY'HIǬVwU$Q|SWU_-(ݿadHKܔ{U]AFLEvͥ>+Pm !ᱰv+FXCJwoƺG/J5up4O0cvZ{Xle>]JJZZ/jxСTȤG ё# "Jt"Wt/: ig8gvE|$|\Oj9A9wP &"MCC@PFb"^:Q)q1iCKפ=7 6@OY&]y_UD*U5W#C g*:&jXЗaoV Ou (Y2bUyF5-뀅PĘ~Q"i) Ɗ-Q6n%9g;tkFrBΫai>Km^DDU"ukGet8A;<wR\gKLhXbs?bCD0NZW-hD7QJ"?$k3Tz.*Ci=} Ɨ/Ym(2aƴHE:%0ܕ.Z{ƖkQPl% Y'.l( B63@mي}\IgYNqe]0l jLa,4)X `e7VYoI8'YSe}&I+oP /WֆCs$ )MtyLLf {wMɪho᮱MosZ[-ZU<,P9&2$'cPFu mZGӥ ^Wד0^`]&N^a.)*~.cjTl"ӳB\xC-XXo+F''ukFm wEj?KpųCT+(B {MIBjtdw$+ ?!A\ޘѤDADB7"9-Q4?Cr19XgAYK5A儵SPvH֜҇L't;SS1O8c&u]#fxʖ3{sLuwK-XD#L@>GkHF#9VmkyohG6y)j[, W#;H #{w  T+ӂ9!;iVPGcYI*?,v4Mzܓy+ mN)W0"$0+&d5QHZsWQN[:0̾\}=-KN^ R_Lo 7<6v'C>KdY##(6r6U)޹x.GXضy\)MvKbL!| qw $(k&nFAZm9 ֩HDRk֋զ&88QmQ/@=ۣ'[I Dq= χ81T2\!XII)v`&B%rɩ9a]Rp?citycJ4}rv3+14$/$ ]~!=jjKb}.~K$b}vVD2h/ 0AMmO`7}Sz Y|jP8C;X+s4Y99';r[ޱ[ch)V5vE k'Wn`^S"@?!L1GdS__eG٤=`chyTF*A"1b ;'~Ƌ6K2Z5>CT^ %lEApG*㽮K:%_Cs7Qf#\W%XO]v6|/>gVag~aޖ9ѳ5"C n[Ă=(V.䒇O2&&A^TG (@XEM䔪%uŒ_ 3 H`&s[>#o!)̓)p >V3IѪGwúD? &cuG[vI=8ϲZIzH2̻H!粰LVBXiN&ߙޑ.`/='11 .y:`h >9Q5)A~F,831;ho0OH| ;R(lV jYb"'ixf.$yx1P0\PZrAE>o׵_fsLJЀ"RQ¿x[Gc|!rϊ&:<I0W^7RltxA`4ުfmI-2ʓ5"4FJ,٪Qtj@t͸W.[i*-1 ٻ3G|T5Oy;awXH%8zS^ bc}9/boLjuF{qujcl:{JBBOWpfLmQzB LEHK*乌'~[?G=yNalR+8NZl7eu`9mʼni{sIy-vBJ=j2o-byԮ&B]z/Ϧ!XBvx6 实[4s2̮,) o?ȬG2ђ.(i u\࢑E@%\3˜3[,Rp'[h2tg􆓮4)I;3{#Q-ɐI =_({O=RC#P@e7EnH7,hSeXc=\Le"οb ^l|$prIX_u Y9meHubـ(n}jmZbwe̞*\s<5oxiR&=qYe}42C\f HG?Kȯh2okxvʽ/'V=׀o qP;Al5 zڙ<&i1waC0NEab5%ĞECډ(?9:,1H9dY4!(#ǻqTq7& N4C^/礥a]ڠoءq=@ JR̓- 9" He"?zԓ E /A$h)W=J)VKH>S]ac>\,h|T`i*ޠEw !5U _%GQmPw=[zMsTxx0q%n4v1}<ĉ,96/橽Лq"YO, ߺ̣Q LM#5rtz &\ZmVf8Wtj^_"I//mm դ%-VϾR |XQ|i7?B>91YZHX -]ˮ׊)w }M2zj~zIN{%%|LV+k?TlDue( 剟\$}d1^w$ctVDU$;btNZg<: 䘺Q< 4D:EV&ldq#aĘ&KC-(I_3k ^(4VuQrD-41B 1c;>3I+mp{Z܈m[Qګ,G4z8CVdά]z#Q`6/ b6xQiZⰇ{~xcKzJ((MGMlCq$ 2tOh$ŽD(8",SN/kVj㽄2(_]L oĢƮ; 2IX+|v1w)FI?>$@Ta=g+!=aٯKPCb)c=U7޹G.x.2oZGF,DkA> %̩HgsC'F'}&ʟ`oŮJP07̎(ib<|+q^߻tYY$$Zfnimg6}&b_\Bf5n(o[UtasB;J(kF,xB +ϵPM9a} *\F?Z(jBfR^I#]ҝ3%^-);M I/u{@/+MHq$!:w}^Vh;ZOD>0L3LxpeNbuE{=,:TxX^*J1nMqs2.@bQ`V+:U*9Cb{. -䷃eeնm[yP:FA:}>ַ BHܯl). wYRn{L'DG8\Ct-u].tj9&wy* ' +uQ>c6Yu_v g~9(рemI=@A!pY=z2IAAmm3 hkM' ¬\E $<) t7{!@l.8EJDX8o "biW6+ U풵B6']bT}U^82 H->2gu AT2;xĬ1PuwjjxSO5b-McHS}KbhJ< S$8-wc.kgo[],t^P|jƽ׹j[@96ϓUC?~"$CI\h}W z6nv mM=9+.c h;EjNԁ" /`Cg`* .+6-aQPaM]O|X,sgt"};G'sbauK#DSl[T# 끮}v% +h>V$@5bu "A)zt ih|$Kx?nrr9^Q6Z"." ?c`‘+R[r$Bjۼ[<);t.㤰GLS^zr;WAu2~2[[=t$M 3Pš ۅ= q]i}Qwۜj,0u\s[~aiC=PG@nI$@,-K0Y̖qs5c'CJ ͠󩐸ZdCw&6"wE֊#TV&~>v/R9@y5gl}pX5pZO!"Il@ ݥݮfmvtѷaM0Zr\mf#Fw[U8MZGfmx|1`aS6,0跕Ի=†4io9o1z7I<~'B!igj·7#^hQ*߼=YИ__#J> $wx~, =OYiZYu$Iˑ?iU(MAyљݳےCZ8`U9a- o0e<Ǧ!00]"hߒö鼨[ѥƳRG˴ mV* W5a9qy'XcrR#%§+n,KV<㎚'6ŵCKN m0Z~v JUP߯9T1 yqvʏe<4У[ŝۣ/Ž;Nj; @jBC7i{4anuFTȠn@$=|ԹIURqF$i(i7ris6G#(5.Fu3 먚Xߊp׌z[blr.e BǾ;˝BG{#BOoi B=eHГ0EJ[;SR);/3!⌞\9'aEJNhI'91.$|#5#[-2C3-t0^PEJ|H`Z/e (L4*@M" =_X;G#(4 tn].ý0@4+Vxw S3u`Can]Ӧ(!i]C0yĕ^zm}TK&H; zj3{Z/'$Tt+0h&' DÕ7]ywvss[[mT@T҉rjtNM,UR90tj)=`ܐ k-vXN1W#T>5D(' eʥ/sr%Amf_U~]PY;_x]BUƢ*k˷;;{#pTgrWN3vIV;t*k%7[l}:waI<žDcSvHjL;ue{RXy @e9vc37QޥfԼ.0 XէIiwm6;Hόz9f"_HO=eGx0Ρz !{12W'/VL#n;c]x`` kϧmVPh==a'h3"P|M3Yzb %J7i6xn㳓qՌ򰐻2>I_@ָdb)Xֿo :=îfv{ぜQ+>ij'ÁǝYn|wii!~6zwB"Ħ54TI% 2`/on5(hkծ'j|$ŀd-wCp .vCc`$@nG&f_mԝn/2U9CLX@w,%@v}p[fAPJ~D9- xz~]{?{kxRxnXNYX%fû9'd2@ZYa Fu^c.wUzI!vJ]WO: x4adcuh~dw9 AS/9Ѯ9 ^tWtZ]Ϲh1Jǹj3[%(B}=IϣJktH {uБG&ܩMVA&mk^̡ڀXeښx1RY <=yRSQ\wP[Au 3y^?(QLD5GlY6y}j%/㯊ْ4b:ed$&F+zxƷudׅ \&]qW›d3f:ӛ0 9!r|%]<:jnB.E:r'VPICOVs0|(+Xx0oO2 6rHeďk!]XdtW{qt#'(هt `벗8,q6%zq}} 個 ].m'%lٰd Z])wyX~EXHob'I Ҡzp]0#O-|ϋ߈aNn?)= "砒0U@}T4n M=.9nH,2 G҅t7}bg~gY%; HT7aA7&фCr@ߟn?ZXI19c.~x8U#+D9?ljS0;aO3rm9x Y-v%dU cK\j2)=b9cO䌢H g8w7./F`=;B(ZY{zz/)= Towhz5zz/T4`L=sϢɀ` qx +y1FQIY{f rDG4G>)f{*#eiTT 8-dgzFsB\We6Z%I%ڹT߂`:E(;@kDՕ^ʴіcA!pEa1]q@ ut^uj6 +T&$AdZd;H2 FlmPNKpָܢBx[ oM W]ӴIsX9Mw]rb0yno=Ry?A#LSiAla0>}feVԉz@y[>7Xlw'M\7,*3g]䄶,B@9Mj̡6xkmU/Yk=iKc-RMμ+'_0 nft ,˕Gs1Ǫ;`+҃,l4I<_%&.nٗ=$k䫖/ݣ*]ҁ1lX>EW,ƬQcG1.D *Ed6([ZRZ3IBh5~e%fʫ]#Uh=v84+ZQ1i"|U#گRr ' B=$fvU>9GC 3 _W{wcB]s>뮲/z隵}?zn_yxMN3O @uRXo~UEK7 dTY=$Ha`UоYy Ѣ>f 3as %Trs4AOJ确Dj/'&c }}"]v2{ P)t}: Яx]:팏mFLAuaEّ /Pc^H`DUK5D!KTbpt&/.|NpX"!Kl.Y8D+5n uq^`rƁU)j=dp@m2Qђ@! q QaM_VL`u Тf[,? Ks]!j>n~ ~ήnJk+JLߎ )`"%frOG>K qhvC0X u.Ҭ(:2Gڢ ەtMiÇ;[(.~` O sUOýGAfHס:*7n{~$NݜBt?|Ȱ޽\zʅZCoMN¥,'T_ .j:a+ HٵHD^˹D`Ig[6mM,R'y)t{{6{N \6ƭLCLfȗ^ ߍ_P XdLD$rS0@Y(cmf<%S_d }Z, nØLbSCAGU?Cvi+Ema7V5Zb8S" eB ޟ 8jj}8bD9خ Y8 7ͥE{j]+4$>~埒Ws L8n1 &t\OϿ[b] i}'Kl`8Z#Y yy"^Aŕ׽ \³t銐.Wǂ@f#FGOL;Ʌtby.I@AU|H7w\+оks}! *?Uz}YHKv%DMlTPN7pPFZgW,do7HE;Èh\"+tc@P}'Ojڱh?[3&Ƭ,jΦxHQS7b]wH0émq-rev"N7ZN`,1S/ZA>Y*{iM@`d1_EsTP>,@=甎dp&wD_.A[T/k0M!pͦD|`k0`c[^ӭ^1kڒVZ׽Ý#6V_c-Yg4BQkzr%_ȗB" Md 3{-!):n tqy }N) J DbPeNRo4뫑lkSl~Mo5ivrimE[LGTEA@0H kRS.F6˧/M\? R%I=n6GYNxKܐFVK&F _I=]5jpz;c/k)F`)2"zyB&uc]UG̶Gw y`h#ް',"R^лeb_22D!cD\ U-@a&tJ a&?HcYH Z{rG16x8K+Bk"lD khK wt7w$8I]aU։f)O=_TDW<5^Ihڌ8.H296[=$o" jhQ0xr3ZUьRRk/ZҮr~6~RđvTjk;2`/B6Z.z_0@iw*%ؗ)`-{[>p*n& ᔥyVb[u*PqěfHAG;- JhٴWLN:dEFY X7g/nBA)LtDn>vP{㪥4SƵ)R .+VtaK\v]Wbc1.k ' -יvڹ](c|"Oܸ+ ZkZZ7@7$)-쨏bZa{\cґ@4\b:xe8ѠzyyWZJj m`#>)Ne-/~ӇLx}È!=pimnCV~L"oᨏqT!s.]r8 (jeb:]Fp$,BRCsl (FiQQ̃þ%7i girM )^eloHT`rlȂכA&ɟZbz\Swao)W`sQN\ڠ_N,;'_|>9~Mɻ-sdׂւ\2}qzj,Պ;1d AUX8+BќxIEz  0EnMt|;`NE9*B,p] nl!?!X}8x/~n0yY6#Tx}EԘ~F`$W );]Kڔ=}"~[FG`$tիL|`Dj|Ikԩoi})f (D@j.1қI!nR؃EJ@ ߵ3x2[G;O'XKP_> `R'wե:owX ׊T<!)-3jͱ'0^LYzsF*y_)^Of/ <6K*к!QxTpR>nSHd8BVor:EM&'cmWض`V!ܓ~iMj:jQRɺT-~3p&xy0=koBho6mb>?A` tv80ΜSCoKx@Nt"ΆDwPv_V9D;))mqYjᯝWbb'l"wD}Z?ˈ]ˆGERxNM=-VYPpK3޶ΧFxY3Cg]Nݮwe3mPm"cGhq'^`!ABX.30gO]۟M :MFUݍ#:.2.UM pWA,:"7mM5L|x$h%`U0aGt>x*a r;zZF3Bh#եP\Tkg+?/KDd|{PНsm#5Mx=\ ]1$Y`A:s `ZCT3+uH3-_L"E˟n3@3 )xM:(}4 v.p(5Ui=!F +yp_T]nPVxx0? !O J~`z@Կ^:P_ `%aޟQ̈́5>2![/eDP;Bs'{K "xrZ]'@>܊ 1M=>쎁CLơV^1 N\pRyNhW`O󈐱<~YY Sy<@J3ջtb$$ީɟ8OqS\Ƒ|<_3SH$Kåx*2=/8tc[/G^!N}no+(6U<}#x?vM) Q} f*h^NgmXZ+ r #בi;5U۩E)L~=4SiTsDqUm:pDϸbs<@e疞Z#":Mxf?ٔF-qb(zծ3{N%0S?Xe&  C﯆A]Q%_S)ox+P 5D-}"QQ:fό3-Ո.VJ W*dž;dc[EφN?txXd0N-O[;&(HfvcBi7B8 ]2vDД0T--,}9 b%^UHM ލPǧhԕo%1 I N8zؒmݙ(7Q 1#|LS" 9ſo:^I"' n)l:Ra բ#Q2~dǒpF.}RiN{ٺ#ɝ(!H\ ۚN25Z{*v|{\4$T'Qѽ r1'pyų IUicErZom=ՌE)-2,)SqWU&Aog}?}V%iåݼY]ݨ)rT;Hxx9 A5 a/@10!CP }WK2ݕhwXſf@UHVp+-lGGX0LBwzb@gº}^n:Obߥǣm1>xeZYO+)olpҝu'4j}Fge-HЃOoZzitJ-d{jѐC(4_ kױXD/~< AGΣ7E٤(u+pюW+6OAٙD'#m0L"R~_k{~*tZv<ڕmxS3uK9f#ʒ*nLW~3/hf{Q70HVR=TB `,#~cY/osI2<ZϑB {<5j^ԅUp}i (9F\":'H&-YÜǒ: 9 W/a1G56&,0A0L;+eq+0}sNrPl ` klIvLW˂-|hS>{dLB fMa.hy!5pNnڢ:4KT.bvmx& 9.5=;2Of=ٿ3n֚^L6mQnv-̆|b7'7Y*J3N [nq[Խ1Khbc5^5Ԓˬ:5ެ#!dRA[/ |<{*휀7&% TNgev  [c6e_ 132&@3o#Gh`O.Jof@{\l5'k|%׺G{bvVJ0͵4ayP. oL_2*~͔CcDҟG"+[w( %Lfm=R9rY/]OYQ8pTqs5Td5>O $!H]!063!ovR7ӫ ASn!BQT )WeC` DԍTBYEZ du@$w:M%QdQ TNԜLd ث``UèMo.X!C/VN=v@U#R5stiQ %x^op3Ʒz1`/~6l}T楽OCWo\8^ \o睈)c}I^A3LN%hz޷0Z,=Hz)1-j(A=P1eǜb[2s~&?`$ktWC7|]#`+;I@%UPo am1|m%o¹L/U;QZv-胈BWT_<1[^}'|y\hꕇʨBvfkw4?儿 vox!>`ߞJ ^ZFH3OtK11BF<7XSUz6B./:qƴ=Ӟ#[@􎟡lkAe@'Ή_ȡQi}~*ٺWsUYߵ4LK:rYqnjhT?pP\7G˙CW€οgf_j來|ʴ?NQ\it{k®7AY@P/6ydxRÉYSeH muE}od,"eJ>7ֆqCt:&:7*ŬfoM 2tPúTRsd(* -3.fI3&O>k]+jٕ-c̄ %(wM/?>EytrBr)ژ{V*g^ TpcFOc +t~^Jj78c+Cx,iz7}q0P\/;*'WĄ]B>HK8]N27$i͘4P}s+e5ڭiͅ ~ozvi^fsvX8p#}#Tě$0['*j h i[q,^¾ܬviFcpW_5Yg]à⥴ŐҲsL A\Q"ɋ|YUSǩM%~d`Z=okD]D3x͓};e<, ojzi_0', &-{+*Îno^> xCa`νr+Tѻqe|!CB{bv4{$ӹwV:\;b%`OM "cǐ%~219_J.QiDOFbNf17 yB*ξ Ƿax."viԷLF.OQ.Ró- ]d$y`'C+SԂ^a޳'|vZuf=TJxA $~?u>7 )ֻx,5֕"F 9yIi uP KRmwJjc;`a:@&.[_He8 ,}Y{C>䁃7Q ^ F/.ϗzcB"=kV;6 }8'8~0,p1`y}Uiv|mg )~TV@3^ y+nI5l ͘>+cYd=,a:d\NJi7a 350[1y^jUbB i XLfi泜w)i8r)(mT᧟EMpF温b;{GVM7b'gū{$/Iޭ*?c@z S<qh;ca!2J vBƼں$K\׫J˯?*@| ⴒZ9ZXfB^d;$1Nm0lޡ___DdK/_>ST&˲ֻ~o4?Zt:˝"mfS)s> \"V)xP,mvM.>**RVw` jNH;yD`[cU@pLJ`U>/ wp:7Cv}|@mĶ2rKF5xш2qRS煶~I̐~YsC`y1AO/Ȭ.ժ]deJ nZc鐴Yc^ÆO?⌭*ŭ"㟊G¤R{Qǐ9f҃ec2V.TRלK +|GJ;V}-ro0f9QG 1=fM90NQv|E$'ʯ-B%0XM{HEu^xC:$Ee"ť|,KMOŖ16$սʨ҈6u]Ѝ_ߥ16K[LQC;/t.-Fb ۱^~FAӺs2(DzG Mj:l.) ;=c'Kɓ,,-`X)ޤN"qZ߷Q ϊ7h$3P7 fWI$/*} kJw`Cz S1& ;{D}&F ÕysEJ: .f ƌydl; WjD=2?Ba$:CVfCD²4hRi,Njdl34nqE@ľ:<^0}[3%tI4K'4$K0>`Z;"u]&V'3aoiҞ :Z.Ґ)->K< EF"''+1E-N>G՘#UѴzj!<n+៾Wj_D ךt h$K0>FSckDL"yMXҁ:,/ EwI fdi턖2Q_3$G~zO [_1=zZ;;DCaRAh|"K1.ςNw&wxYSP>IΓ;yPn=;J;zgxprx'ĘW_g\f`PwN( 1-|Z%' @u{~oCnAX K竺r8BtNp|/9~m5!Ѷms0u}5aܒ$(sG0y6a*sljM5]٧Z_AG ˶,F[h^H9==a*fȪela6qץv%]TH3*Gnl "&"g?*\EZd# ka݌Bv#+okRR^'5aӄV9g5Uf5oA^! +%G|{q=vTʝ MIVk>Ly/J!pٙS7cRǜ_!sQj{#Amf$Y47ϐW6/l&P샔0/xɟJG٤й?b`WXsM z5d@ټ*{6cډť:O}pӕH@r <4V'q0/CJ[*-YZ΄:P">K($Ao\5EWzu24&uԓvgLDúEN6akhSyаiqI\ޤ+oFjz&p@dťY( -ꍫrz@NdC( >Z# _])4&(79oFIvõPH4_7a?f:E&e[Aր8w{#n@(AЙ̀76iI5-'/\p8Fqzp“=5É FSI}XH70&ʊd9YۃBG*lJ\"9R1 53fRl<ٓü&'KYZOj3MzͿ!es AL#T^:3Mg2DT) )X2ÐmR+6Qћ9U@,YP3l7)x_.G?mDi Q.#|4k,;}rnri?-ƼfPM{ ۴!7RZ(8Z)$anA!8)k<<]WCA /QQ^d杶vey&sDFoKFJc0skD!1'  B&gu|,ZJ٩ZM묔z_EӘtkXCW:%] :*~ КG;_T$WJs>{@6 qDuCi$.u8tGcS6+W־DS-*YՈhN@e#2 qWqcĖ|gXdV6YgA:.R0Wy5<ʾz / V~Sku !q/ai$Hw\LFC@a/P^rl f NN\n%ZGSVPa[m0p)Ի&y&\E f^jʯc F ?:ZH5|rh /? .]~3d(=~uS Ax >{L2AF4`I=bG0Y"r^)BQ՝`ҢVSٌRdsӺvu,#)> kN`;,Ypb&]uѨPn@e92e~ s>B[ua%IWWޏ78T1 ЮRPLOMAc/6u$ NL(TG> \WniTeGﳛTK*u>Qjͼ&-Ynnɭ`IINg2eJڦ:Tw#v7=î'm ga8YT4bލ Kz1m3Kul$ w|G/( t94lT3u# /@MB]X6FGF{˃\Msp]Z#ʷJ\J 1kڱSH=АDd* ֱ ' R5؀@{:α"kWI x Jk؝OA0"~ ӌg%5w\8*t\a%2L[d%>fqHdrn !U=0;YP󙛜3=\.`}^#+䣢!^5 ¼.dA`sB coKN.IH? :=c)JԴ Hۉ@Ԭ$1H{ }_6؎\F_o}e*."NVo]X!zkƬ{D'07 F9B+r02y$dNƝ2}kV>t˯@֊iVʢ?!>O]U ">r$OQ(JZlWQ^IbtjޑDgUxp -j{4Sõ*30~;.m[; ! 2O;']Edvwd7cxfm5Ԁ|1FRՎ qJ~5V߉'T`)i \ٵ:fZ[= !c#=ԠRЇ@K g‡q5Wq'>Uͺ/HRaTQ955&qƂ|ekv7gբPHU7gԙMH2sd" l!@4~{2R/;cS/ ɑjΔOki%0bZXE2~\UIxZU7{|;_~ ہ"%p7%|~qg fnś1WrlyًosX_(,n]mgy1"_ԼmQ@{*SaU\~ơ#Fma\/jƀFb-fTAIS30,V˛w p'2nO.(( GeqMDۨW3=bZ_rU^Y.QBmҺEb0-?BB\O) 䀴(GDtg4J#GYgOT`*M[Dv?GѺe/ 6j+rsr퉻efWzhH&aD4,S(/v/Wf 4 辨H߅GbHd#mr[jVPZO\ Re-F5 aRSѯv3;وfލGdEsCLy3Oz˒ Yo 6,4yz򋴭ѫ?vJEr%KZ_-`O"ڋH$9`VaDeEun ?q(9Z*3(=N}\x=H=Ly%@ nV| O܍VDS=An6wcI8.z'Dotbz3uxicd_=tB&"qkR+2Gr?Y ocOV"Ad0O{Oi>kxjޢJ=Șxa[u{ÎLHHн+ɅuU9߫۔3DsS>{ 0ݙY3K"| B5JvHL;Y}] &RkeI%JpPKG "kH;'60c i"o$ 5s |WkcIo$)P3Wo̵' E"eSV:.%I،8 * oHQ?㇘Vč)/&X8ĝTE>n\̖}Pm̭ď\3eK2e!D $N59$>xyvdhs9@C/QdcF! i=VyU&8lcKo#ۺ7G^Ubd@ЋXi Lm/n`v*;C總d7 AF,WU[|݈6S2=hylh =6KA#JMpvv p,vYΙvF_@aՒdzXxWe=δ%;##gsJ dn+Vjpff3xZ /k!פ-^)Єޠ|5+aSE)+Y8rno)xVDIE g BGTˉ=֏,E./yn8Re,w_h`G;FL%7Cq\H~Gf]њC#JJ Q3lX0bL=!3ؕmnĹhRܥ6ZxF9?SIZr,iQ\N}5b$7a͏?W۬}02f0`J` 8C Ʈ~Bnd-\gn%8½/JB/ BoEqj*'h`ճ;Pq;h0g՚̻z|KY˙Gk#k]%E R Ulv `Sfrùycm@vP*93Q%mjH8 7ysv@TWrgPǿʓh{Ul؃C4B"U}NE+"+80c-dj'mX8,/P0Mw9cNJ) $D>Ooms't*{8}RETީM!U .0V'Ez4PSx \i巡gՒ*Ɏ &c`vqY9?ʀaH _뀹[˝t$%kpOYc͕Dh_zέdJMԂګbrRR\CW%fGK# **t1j.OrB?lI~GU,Lg(4Ԓ@ yV/7_S\oV)AȚi< |OH`ȇʗqhN:RwnSR^{>W1FP+ SB#ʾJĥ X)"gr7] N4j56PHd6[x̳qt-m24[ +? [Z eX%{dڨ/Kk#Gx.piYQ͟Jv%}^LyebTWZsM[b)䲔-:>ˤ{?bg)>/~fpR+:R%CG7~W`eB[\SW/4H,+*bU6^=y"g"yJ㭎ĹBCBFL,r ٱKL$t[T'A:@"Xhwr Vn$@cvl+ʬ]ad\ {" eM4+<mhaNKߪCqicoUXeu6<`!63 F= #.;,&i7k`-yR4va璚7iiIjŰۏl^ߧ Cz%-1 /$S,Wξ֨$^ 04<Z E'|`gKy0Fq867*KQC" eBZƏl+a6_aܶ3Z}<(]bfW“k7P]5AߗLd;'\ؠ #B<$j݉J'{ۜ4Scļ:~Pgӣx.L;*%Gs":DOirI) r@ jIP[Y)/n4&F+'t-I;N=/ԒRrh$i> [bzKrONo J^23oxv>Pǟoes-y6@2h hUW GawgD,i;h9R>R-LL1WaԨu2$CWڃs̀ݎL5"l/Nx>ԗ;.L }jB|1ZJOVCLز *WsIiB} m^TS8SiP?vѬ:Gr+n*-.޾8IS_-*jV@!gXO9`s62UX N@ Uj>? `]u= iM ;vgPx3r6ʳ>n6&.Քfu`4*[%xiÚS/+.hb`lB1aUZ40~5X4X:<ӺhN5`<8\X!$rP0:`E:{Pc&g@Kiǎn.!!`H,n@*D绕Ӝ:~LN~ljն} GvwjWO%XNEE5jH|IT"J)@V5kz ~io'u&o5ChQ vF#!®{H k#d QH {BipӺ'{'(`78&XIߔ(̻J˩Ydc# +K073 \[o<ydղ:RSs}euy7g CZ>~[- =7OӰTNy\a=?/wLDvM[8wNE]{@:o'S%ow L:zԾm!=[Fa.Ucrt1. xoۀ\lc9-€VQ-#δ³iyL mW$NMA`}Л07>F1'1=RߛB:Pep v)sGNtU'1j$eĽd)x]xTqOLYq#@RhW>E(i$Jk?Msx.P!đ:X!@l2{dDy?GϦ*O4${,!0_UEpe-:XTdX}mBDx3ل%&ndt˛ NN9`FqO1,MnTkN.jԪ X]Y2v5m wz?}FCI۪zCSx< 췋 G0Wɽ20bx+Ds}>"6߁>ftz"<'q`a[JkwN=gN.ԑE\ aဗV;5>QJ櫒SPEU; -tjY%Ǻio/bcɝC3 *Wi~٦3j+,İbJq=\}V<6/ gJtF̝JFPݣJ˖vrd*m/|BDu@bX4WuopK s׍{/Pڕ8K̈ʋ VLq̟P)uߘoiqhRjBu+@,՘֕ ҧ Pͽ3ݜղ^ N|4 %z,{xF{b'!C0@<,lQ@ +;_0E)DYq?slq - =k15ǟmZ\ hpy%+Z6(մ /6RvU~eMt_LQn@ܠ ou?D &w Uђ-tDKTb#j~ )=UUbffD/ '>#CU+~'u0;>d + ZLiK¾;WԔ'<}_:-'N9Y|[m0:zl [K2PZPu 9$쐨hkp+]#{ df;S6QrӨbhhahVe'`wrs#ހ@7A@XT<#|vGΛq[1ƃ26[D,@yJvu{/n.8qa9B]Q U*ws2x]_V%\Rm.1U6+waC` *H_[h!b{/ȞOD0)31 b@g pf~IT0;4|u>gOWkYTR"'S-層mz>*UXJUbR^1Q-lWP <>A{n bLLYԓUO^XHYiҠE@iRʘV*iQ 뮐ﹺ/o@iJ]G_p 'q̴O܉%~sW?pT3TK0*eqҶUx.YZJqW5ztOF*W5 V$c$H|x Ct!_MTڼ=U Getj~~C&2Iu5`:~6'"eݤZS[& (f sjyf(^הyo?{~mo>voŕd$[pg@g I[P.<ۥ;{MӔ>.4kx­l~!ڢ1m@,J8eekP~akKZVzw%M! bvFRSGsvFK+,k:ZTtl68Ct| q CE9'$Mˡyj/% |Y-dT_Hwq0sG YJ}U>\hi8.N % R-%kHɇ25y}3쾊CYA[Sާڪv%EUi=G2. b< nE7 ~Չ =bĨe`Rk'əs@lHsR !09qlQwgA٢ubuBu] 9d5"WZ HMϻ{'{Llu,W2 Da`=8S1 ЊY_۩yuatW.L2L ѻyhCD CW=^ vm,^& qI'Y֝eJmuW5 7ˎ4nƌu5pSfEm'ū86rI8%f3ڽ-LzZpG-b.QQڨ]L+>ϬE`"idjjS*UJN7$|3ah 4Qbn3[ajhf&L^Ql+꽆L"YX5'(҄ !%4 +,Mc;}Z V+s,-PS̢,8Eߠ]e>;mT{P{ `hƞ؆A2\g#3jSd$6 G c#4olnr?^.g5ۭ}.zfMGBp=!ȔGC0^oWSF xTDE(>J*@H^ t x NX!#9_ꕻJY5o$ :ӣ]sck~]4]}LtßEM$ih &ݞ+xQd`(n*fK&3dU,FBO7;4icJdܐF|[A9anwkF,xK 51upגő.;q$ E%6W{⺾z .]|JбAj}|=Ya|[5  ֱLMB{\ [HEGe.7"Xlc%9덮]%ÿ9kX6[mmZat dxRYo[nF+ ǓɮgrDT;qyS `8)GLИN93c P Kr5Oz`#%`Ų3$o=,=Rܢߡ7!5bvGĮb t$yc=C,_ m xNX:|?T͍w~O[ SA"f@]PhDe7@~9\brq7hiwEA)cT]ԔӍJ'`(j%dNaPJݹ{u6A B ² )bhpz`)[)Aaq8d"mD濮pM 2T] >jq$@yOakjt#gi,O@mFp)FC1$JI i&L6#}Oor\ڊ MF榉wywc+0K?8a[_Π@_?^l۵̓/HOC N;JK$R8d}i dBw9"̮6.tzwy[@ZwW C])_"M(ҌuP6>Y"d7Cؠֵ&X;9B2tTҫ'QӢ;`(uزz@R/ 1Mc渿\ յV@jzb#|rpkT. 1  T#aD--4O2$ MQ ^Cx1`LNvTPm><] 5 -XDv{oTboX}4W~mR:TOl@~%_Q;~UGYso!hh@ku]* krb7LD {Puh8_UnXCF>ObVD3 ,*cuA٠ώ]#@H Ƨ2_?:0sԵT=4ZfXg/tb[$cR67;0>nhl a'>K<*71@N@i^dͩ8p 0f2ME:E}8qsR},%%fy32"G;t'T'! ==@6 \2*j^BuC{ݘhEV\%9wV<@1.À3ȘSs=?G'-fY xW 76bYMgIq"߈6X£wn-T&xu֘ 籲oК0N`5䞹mI Ŗݮ *ϔЋB*>CX$\aRUvH;G 2 7䰕ͩԺQҗFb!K/Sl htQ޳/E;8[OmϓMڰx{}V2㔱{ taLgg*处īTe  |}чWoHumPJLO2' C1J[1L6*ɂG!؛.ҍȤM~ MCc8m_Χ^+D^+Iy]DG6W{p3w@X#Zs3ؑ8(%>sv5!$&USdL67wI2@G,13]B;1Cq:Ϙ;o,7[1Q'$9?oIhf `xJePB\-!8A[Lts mS/͊ܬZk {>TɋLx:縱ƙ[F+纓 QkuQSV8mlQ맭[3Y{cs/uEh.Bk|WQTZiQT:Q|1FR.21UHS#>|)ºD^}-)^HbAi_ϊ%!7* ; aj>]ᶍvNJ;3Do\.E2CM"1be#I~4(]~)d[ĝH+ed?"Y+21]~rlSԚ]\OaCW(, jnЋ]LXb*fێeC+~BˍOJ{+(5{Xg KN*~O=\-9S%k4<7xO=I7MЫ`u|Xч*-Ǫ9</CŮչmE\絥[zVZa=v{LzEAqaEJX_]vٟc%kIV䧖אfB,hw7>A pt=^*4%(.Nhw`Rz9IҼR7C"8s=DN8׵<>%`CvFr~nT5Gj`8ShC[My'Vd_zEobOþr`sy|R =L}<UQ@f0锉8!Ւcq="ܫL{;V έ>%ֱK\ o8;"nʡ,ϜQW~ ,Y]o&фl`.E͡ V$ ߎЩs75\N"m0͵?Pn+{0O9.}&i\!L)#-nN%D..-u*pG;5&q0&dGYQo8p+#VԎ0xQ`^ΧU[ ,x8צǟcB5b>Osp36|ّ(;Ǿxm#tO^NjGN&9,?{dP2dB7V-,6 2 Q-'㡣eZ&7`W']_.QN akBXf\ثMhlRj_=€W؎j$,L|Nͭod3aDZ ۏ$'@7=Rrc E6$TR_YliU&HcW_ dE;0ă+l$o*U&'$Sd#c=5ԥG#5$ݢ>hbϿIo .7 DQT_ѱۊG5$d=zvxLe F"j۝Fɉgo &l&Ŷo 5,~⌇<(ѱ>%(DW!oIG-_!o $))!.PV@jcȓX=u<;'Zܜ[B,CߋX͡b_=?|D/TI6Apw.LXAS"`;ުSMSq Wv52 AmKOqZ@'.HkrL)m@Vג E/_2PuH0U `C~Nn)z]6kù3V{l: sP+!E 8T8 xm<ȄBk&.bٔnT ?dBr{^;8c'6nF$^(-D BS_5Il1 * X'nY GI9GA`(,17 WM/`d!8N'I0g6і: |=t4+ |JnޓޟY̑;?l9X@ Fn ˌ& w([rK:$&%akT>xn&/O&Jlj: ,z{;6zo ,v ̌\{*XQHCm-kNJ>0afaK=tfu ⱝI%W6'FCSy1(C%k0ˀޜ p7mUT0?WBs R! ^+.#(m;,Mv~FԠp0u?v."@+hn%0z j>p..Hx+9ug D/<'YwǞ)۝4П=KSt.^lvf+֡A];&Baoqy7׵&ÊlY)U%LpºXK=FhYP ljtBAet6 aҏەGA1gmg)5;Sz[;s3T 'ݸZ Ͳdh؀ou`0Gףlrb?%jW;)MrMn) J4} dUƛVv\ ÆCbI]o|:Ö಼KxW">}}gVQj,`o,QΉxk>JR(&;:@xI:Nׂ9ԚH [Hs|BC'GB*l|̚evrax$ok]_{c6ónt()l0S|8opŠU3n&f \xE0D A(h76 .Ul hF]/zbXo;NkePV c,a0__DOl4,IaZ?Ċ.t]~,_̤#;4Kgo ,{H!1SpŞ?\/C*OSgO(IQ4ɶ'{V,59%-pfP $aRP9;`"" ~I H߶}iQA+^6xW^2a误P#'jnG,CF+!VT@ŨHX2r8^- s5 FtF^;B y$Ix9{s!FO?;G ix٧Hrvdq8LVQb}KD !0(g;+Jr[(j L#lb,KF5'#FGKVM{]!kj\AЈ+ GܘF& MIg͆"u1{>lx ^IݨLM ߛbu>6|yh/K䬢w M SI"5GQvj %V8'4@ČW{@҂,O$y\ڶvWR:N7ɔ:#ZT\-k5'i#0Sj XZ8 6zGx%B?y^HP9UFD |}96՛/ct.gWqhƅpz(m0̯eoI Ѯu}z $_/[jv4g"$rUݖ0^]2JG9gFc^A 2-@ΐخ|tNbh8}vnMKAsmkBi:},̧)uctGULy;,;Y4+[ߐ6ý>^tYx)Zɺ#KisUz> M|ۦGniBvK*c"M7J|eߒ)R׿r lQ3-(To6:z^kH,4tQߴ&UXkW-8gb@6Frj@#&ru1?#BkZY|ao;Is"w*# ].F@Z$מzB/;ʴmgk`YH&5Jz nێ{p ŕDfLsPu)֩Z 5rUj}G$IxP~SJMvO\sˑVr6ى@h QpA\l䑒9A ىl)-Wu6gLQH v58rKxqU1Qf斧ZPLd|G]*vx+{"ɱ=+oHE%y/׶ӠOP7W^R=":[q4踛[eO`<'GV&% >,<HmIj$Ɩ׼*SUh WXetk&o?}$tb a?mV)0uص6jvoUպ>ҏ+T7e%/c&#*\ISq"[[R+nݓY5 yDΒ4q3MԞ{ Dc WK:tkaJWP+ql2v<C,#brid!h,Q _["O7UO"iBX11QScT#8Ʀ84: P[i&2'#f*OAYu}4[qeRO` [o1p-8ܜ[+ͬ 9#/.⽄#9:H32LY7cʱll'Lf3%%P\h6wc6bHg_zo)9]hnnkłV 9) O uk)MQpǻop<3-ɸ}b1*kL'e/m|"FYˣZQ((} 6f=H2@:gܰn۵2oH#%%iH䆧  mOX6PqAn$AM&7u3.*j-bEKX,M6dd+@<]&12L e4@쀸Z25NWl<top-0&ʇJg>4T[$F5$PS}ܣp: 6eA؄e?@ɯbd&SxTÏKat90D}2im%Jsd-)2]=QVO%9pGi]UF ^!.9%Q"xyq}l8JFp#V]0Ln!n"l9&[ cCo b:&7:}ux_?طj݀֏R!  9 VZ7Gጊ\㗽B&\l'Ɖ#Wi)@v+,T 4!v֦gw[9KufM_ÖxQk<yn,:|כ$;Lyuc9]nR$ϼjĤJb5EwB [x AuԜOh̺emVݽ^B3B:gSpPz=^Rϋӄ]1= ߝA)\N3(8TWWb¬GVO׿ e?YBx.ul8YpB5>5ՙZT'MGL| vvܴ/%@Wg[WZ72t;1BIH$A6p4M;i >SKp%4$l" PxxiiE!D8Kӗ+Hu= 75?avP{7W7[Q$eY &0=eڄЁ(6>="vP#nQgs% f6D5#=ߩ2R-sޢ`f`ND`Ud{7摜H5a(Et~HGrTqetQƚpuI#Sc!7Jx\rB^xE7Q3Ohq5%0E/(S@=,ڿ(pz235NQ_l7;]\<;`fƘfAB:#\kR?>-iQ#6-fUng~N)a eToyl'(Ǐ1V_:;øEA#_B1&NHȴI9DQjb[B++#I^A^`{QL%Р." 9Z0}gE j hDQ\/p?y%j_boΎƱP|VH+kp}hg heVh」" $܀To<$&y~䘧1p{~POC =^bS4 +,s[Ai[m?Na[=n7K*TOYO*g2N:huJh+F8}ؕӹ}Rz`۩sDUz,yp;__;r*"⡐r 2\ccB|]J7W*D c)ˋ X֖1TV?[2;+萩FqέOw[Pa0uD W"o"V>`(\oab&E(op ;DHκzի0"qJFj??}'yfYwWzDQ99 OiDk2K֠wͽLAǐ]0}:ՇgZĶIx{Yqbx ^^Ș+EO ƞ_ׂ^xA@7+4AX!h ޘ|UG#, Eߥ?6Ub 8UsP&] 3w}S kl9MR"h} am?"6nE- ^|NVr/CMb߂LypOܧwt9%\PŦI (R[Ы}V{q)L&G&^Q6&+Q->F܌BV,8>n$Mt`AȡӾ1{L [Ȍk-kI+VWSC@s`ԙuT}|W/+Qp/Qa#;}l(d[䨲0N41^hSE߭ v䒭 Ӈ,kYcvs)ǮDJ5<^֋(H}*4g?ptI1/ZڪSYC(-ӜUmhs~'(UZ9YiU/B}4`c 89I>A4_XICkFM?B`%YiJ[s}TŰ &G8Ji+xD ]M RcCCwDGЙ9#၌ 㒹 ʧy\l^7wpY4D56bװy꬧?Sy|X_~,|ös]虫4h,]Ͱaaˋ3TJ # Ō?~Vp2aX.tMK^v v,աHc>a"> U: I{ݐC*vtL|Jby(& 4N^ieV_S-8\;Nb݊`V TԬxwi/)}2 i=۾V55zbo/SƎ~Vb`\[=>͞agHť6/gwpsN _w\foWa;M)%냑xkOg(۪hLWY =7Y4x+)xHW:B}OBDƏᒲ1B(7ydsr9+苉 u侯h\Pɪ7[Lw'F[Whkhʗ]5bzo9', ӣ7p)'$LHT_E=W-{uuQ#@X|oEJVm)UX_۪X\ Sρ!m5(O@+UyC-,) ۄ),q6zz%`i˄H NgP $:nŋOIdP)ASWo\ij͢lgy%S3Ny\4~m> 0.=>7 LOfzE'$edT؂EZV?{׹Ph%C K\#{ulb?5Qpy8S\5yDݱDYBaS`,j`٥4TʺY$o&XJezi%D'1|ZݍK\͢}17`8 LJU?nMn\vF3PV j>6bǰܹLa2X~ Yj/k|e^%G%4ӎ=fv0a#Q$,mfo\k: 89p* C8AHz@Rm{h+Y8vE꨹蛛񇀯,ܫgg:T#ᾟ?g~@<ԧ/AawcW|}Pc NmI=\L<Ŋxc4ug\)Dg2/TVHlpA'v}ʍO{4RIΘTWq|bj`Cw/F*[ޤ[nCYi3rU$ @2&'I^5OwF[F%O^l?Q;D7zBdf-eM6giOTl5.'n"}҇!<‚], @E?QGk @=5ay-{κx:QGR#]őwKA߮wvҰ5/+`֕}+Uӗyx e=vmeg5Ay~2a)Eg\!@^y3&ɕJgmv;E NZ?ceώ9Ӄ%mC5C4~>;SԤ1ܗ9.ɴ LMXNm a/q?Mug`KBn@9!\းB"h au O'0~: 62Ja]={t!+3H#Ow*>5V sWlY\#:#! =COT`ӌG6: F =/|{fQ[6SɇJ,Tgeu+L mH׽Is𘥺+tǔ?3U۳# /B ;N!S?w):h\ ElB[3C[DҤnfGx@"M۝$ՖFdW֦A~+:sXsd8&s u#)[˝b ]oQȼO5Ɲ97ER=@B=?PX#)_N;MpԦ.j֭(,IQVj6 1`Rבps#]͵ܻ[$_u6i>MzԾMwE- V,{c>$c58m $S?U*qcjusS@NmMF/wTnky0M,eȻLXjFBGkMlܭL2 Y Δ^աZS-|r*8EZ;a!+ 6g=Q}4Ryb(n4N+U9a@IMg挄z6 =VPYmłvhHDЛVo98^FyJ;OݎW;o+k>Vw4ZHgV=T; nwu] n>-aDӷYpidS~aba[#PMoaK(G<ۃӽDOU=e!J>a awdIn RawLAxSOH""\_b6SG!2a-nbV%;+f)ʥNFhL|MG"%V*#^ԉ!VX#5`(0߅}[e%>*Ή(5`cQˉ0 KJ솊,l@'gOx6q7Bє9YQe{Du݅@3UR%Tvgqd(xDf]DG}!5$g P+dQd W%4gq]I3X@*ez%Maז$C.Έ9,= ghѿ'p6Z7;> ES8@G AH='M`€{IHNjL#cpU"ywb?ntz -8P2c"{G֊#$:?a#oX_Lw ɑM nT9._FШ,C RuyBpwGl0q0)b!W!y^#pZZAAhtCtI3z; ygI#臖EYM֎h?oXk" ,f=1/ۺ ^1%[}p'i.˫uK pG] 2Ƕ*Fe՝88XKIuڴr3b9?Q)N7hF&^3 ~*կ6#ٖq)kJqG3~.|vBOsչfc 3 h>b]M$,5Ox+'_QS݁LEis~R $GNv3\}.pj',*b_7%Cu98.y'~шE n9py%LSYK23)\ę6` ueo. x ӆjŴbf6ĺ}.V,3`|%ήÝeW:(,MΟ0"x>ho~:zoY4qdkU kS weto):jbxWI+Wŝ˘飴,S%2|)<(:",qNa4PE9O05xYqj_ΨfIvwnKCGOČ=U%R 8sWk[LI[6"ӼeXx<'Vj>^6=We u!#w@J%g)4gխcIP׀)qoR#[<6 {b5?f? }*i )~UW C+q C{I cDjEAxMO&pnz20 XfY.,К,Q }9볾BڏWg<F翻{J|;>ntDK5B_~gqciRֿ z:cfex_ M tfƉ0L,U3]a#*O_Y ڭj[S1^a1 S ]!ED߇3>b_? K)m*GNFǑϔF>*U9XD"6xAfbH$Pa<%-$5s  xN='mkO`Uf'CخRZ6|B|I>B$RIe_ dG\s ^_"j30  @:{ԓT"E:W>RДm{lb2a'v~ .#ȟjw)k?,-O8Bx1VMޏ9wb%\nj- ĎW6w֌ s$S̾Uh%3n;$?v#~M-\rA\=D4nqp&Xom 8הsKqcud4"aUa M_%jooZ3Pg6XV-iSйDiGht4 ; mL<8:h.,^6l5\ʛps #)h!N* TE{i8G 5W$z`صFzWKln:xm>lwyk+avQl*wPe^i ]V0 f9ً}X{PRm&AZcJGoтD㛵v>NQ%'''p9頚=o0 mHa[M^t_SS:j1'ٖLߥS])ͿрlgK'dX"< Az49\3Z'Lk pԒ=kM\[3 ?V()q"6&띝Ezt~s\vJ،3f8ȃA dKNؕi0u/gڰ^K1#wN+=MQb.?11~̦W.tz Ww-Si"5;%sH-6]ѩYi脉A* ;K,|u.;װ~:9>nTT):Z$aؐK{dg{*GRY;ܩrCu"Bt_7q@_Qc,!>DZ_"_?iN lʔWy/#$tqd@j+}*lFN#wQeOG=OJH[eiYr6. Ǥޜ hp5̕4p93%KX{LHUC<*B` ­}CooX:]JA Lo|ۉ48Al( ƿP/Q8ƍnΧYB^2z,Ϙ!3[VQQM, v* iT(g+4>Ӄn S]^)IXXr(ew[ =X>!jb,8_i8L(wY$o};RV.omjtձ &P6ޯk嚑ڐ ,Eins8oi& 䭸A(sbu/=7+]bR gք >ja!rױy;tt sUv6%Qʚ>3z eXz\!_qWN=(\$z%W A+Ib`P[+ AAc,<11I'IJWU^ ee kEJ`v쾧? ңsVM0$5(:e\-hbg֌\oq >_" yJ|wo_6ah8kqpW3bgX6j"HLg*$tƩx#Qᒂ)"ҝA?u\%˲'z-c p!:cײ!wџG];DyYx|i5sQ[!B:W` TIMSr&8m`-s[{MN'''S8[i?g9lhjyEN[̌Y'PW69ЦtL7r#1GC1:<1k hDs1Qs)Y{Lds[$9ncyy;C\i I$ vKTHf@Dx1 ȤDM 9x D M<[J' {Y?R;MK]ދbpwkv@UzV82M'Pc&DOdRfּA(?P$MAbH&ނ" +թ`&Owe]S,m҇8UnInl) T|{[^3^g!]ߥi|g0K_9iG.[p3v&xƯ:fk{H;ʴH#4< <@p/m <*258Ep)#!~1AAVL4"]}hB'sM?Yi?{ؤPc;V(PC&!`0P#I@|ό3.)nU R%B aF{%jrXY 90ܱ_"ݴejMy| w|1J< E`2U]OvoޟG }PMh 60(_ ,No#H$ÝLd^,E-5ۏobi0(6N~* wlg)}w}2LzQG n2n|GJEƟ `loH/,qv =U3);$݄(uWi>L bwAP})K&DyfKxkohLy%k=iPd@g|*3;qR㘡A6 dнZשk Qo)f\cؔf s`a!>>º2˔z~Hf+{%PR^䰮kHRJL]0FstAPwh-5K:ZOų̈́Űjhcoe~Kesq;T/aҶ)cBses&#,m<Hȴ-Xgv#!=f]\6'.rXv\5lgg< -ZU]3~Z\]z8D yj9=˱fTAN6]ֹ!+$2Ʃ(ےo>$q - 5;|UͰ2A ka>`==xͥY t$wf@Vu] ! 'Yb.ZcKR:$l/Q[~!cTE w& YlPV|yzQxRQ K1:B ITޟ' 5rXrnh6X ((&'nK !JvI31saa'LIe^9ZW_K#KkMFT/2]P#4֔*,RՍ ȷlf?_9,:\{EcCCo8a["KM5*=2` Ȓ`[nbϫxb=Cl8I/vݗyaO8e_JRAz0 wcbN p^֎HSFmsjGp6Z67G['l#K6ik∲f\ W/a#Y|-z+`uɈQ?ĉuAϰIҠ]FUo`/tlF.FHgEvjq0pBTivr*ƄfIFc?PO¹[qa[LϋaɆ2jr[;GyZďu>RލD0XGh"p4(pƃ/%Wyz 呐n:[[*!͒(@a"Bd̋*Qd:9_ܳ i-aȠ\$VBLXjI/Tbb)ul½e"bSXQ5aPMl!Z'2-R}aFEl6p'F^\; ;+ N xߍTtv,X<8fA Ā7xp7-eX=cԜ޹jWELGP^76@//f$ai͏ZGҎ,'*d~~^`EFdWM}WGt-Cܫ? ˒N!u'SNi@]V2'"#ذūz ]C9.p3 kWZ޼e.KDPKPb:!SO15\)vP{k 6]HJrV lwbq/.S [b)D3䟃r0W.)Ӆ4WFUdjl92{d& /AU+}Tmt=Afc1JV! [cP)>ݔL%3ԍ;{z/!5g=VxJQSHn[KTarY#(_[]]tPSۂVGzWcaF@8x@3+Yn piS|.v E|y*/}4j^\qճfw@`zр[nbǬUd^c|(kqVw[)KǮabBݫoU(Ԥ# IVd҄UnT6`2(ͧ_4>{cWCYl3Oȸ v/oorv aۿ8~:UB3l'E(ʶOvdI-MGI͝LJc:}k5Ӥ@yV#)As 0@K]eH4b>)E7m)Fbs189T f-DcӤ Ç2P+-Ka"wЍnIqirM~19T`a 5Ax),G"̩A1 Pf9JGΠBgeڠ5#q=6OC856*3O!_)NQєCW I}%^fp] rJk*%D2ʧYnWp(Ȃk.Y2=d_CNSp!xF0Tɱ>?|TA<*ҕ+>:< [8^C-CSQΖSqk G^bj(AuKEo_~ρZO,مp1jĎA:t n~URmwt^{ ayN}aĒ rv{mQ|ǵ:/1yﴽaL10 Te𨴡 ;А.xB|_ uz'gsR br&f@&NN^a PŠ`?5>|Sƌ3㓰u-؋`]gH O$qρ>A5IJ4\5Yd*@B8-ϯ356H;D#P2';@ʥ^<&.f/$ "e!, HUQ sFcy66 fn۰"];TlropPXۅk]5~+ 9zLX{AI,Vd@sʪF'k\m2,3p)RLl+[ꀩfCoV4f"'Rֱ&7u4Z}Re1_H_[ͽHDLo'< #3± (ro3_5LN m+4w1t7<$;$j[ٜRZE <lb ( EF۹i=׆ؓ9Vj%\si%q(Dos ,3oFQY]l.dK֤>r7|,dY&-ɋ&7 e1iYqTku`]]2EӸVrr7Me D6v+GunH0;hQճW [ GC5$ 79wUMlO_$"dUa* J~I V ;n*夰eVk2Hqb jBaYTDL7[k0ϙx%s#!Uffr3qUNt׸e˂UmfI,tCdۘyRy3#Xuz#N+6B!8\bZW?2L~Ѕt9_+roN ݮI %qK=;9Q,|Be'To|=L>Ѯ^7!"gx GFbx=%\놑ԟe2BE*;b8RE$fOMnoU˷yI]ApS',TYepN9ton K '*T 0[CcwE@ƀ]T60ڪy N#-@\|d5"%6X RXX"t?3 w7 љNV..D CU5'3Ï9Ŀkm=@2MG[8 _P@{A]]7O7f.PiGR1h 8K|~bk5aYa nOa ~"%tNRb5\3Ig?$2EMU!#[C0ԮS*~doZ)e/7V1*=+G`FcYI+r̍$'4>Iq% 1lDU&މGL{Τg. \03,DmE!.%L笣' NH@d49gyE{&-#mUH7^BA^AQ@ijW^' ]Ɗ4@pI j"bh$HɖsjW/Fܟ|:a`^eQu{W]4U3K8pd&XTFmVY1`%Sg< $u7Hmp_4wH'RPrI l2Cqar^i`GBs,r&;jC_j9UX3U> G#٦f_̱#Nǒ V(oW/\|`#3EGuvgZc*\B`m>Un^T$!+8XGK=69@<^)HuPofT{Mf e \Þ3^E+n_~)XXV7$z"h*n'و_!ÀS8eltEzV"jsaD̖uN QC,C1>]gqN.R[tW]Bna"GGebT/fWx4G2uLu$~l8S'E 5`G"% C'}Yߍ9֥.8sYi8]("p=d?hSmAq sP"J o=JK6XixDlbBlZu˗O0P`y,dg&3'O]E֥WWrs {M/H1N*q!Cmy>vae{d¯_%/LףdB3ҙN_;bBRCuΦYQdN@|G{z?Gm{#Htp# ViYup3ȡ[1D'{s@2U"knƕzۮ,yJ#u~ rΚa7e tLY&Hq뛳ufuئ^~3uWI0ݧ0Bw1vƺ_0=HUJ??Ռġ c`*)JWDfT1GwOM%ZaXGb^l,D#vv{sГًOj+WJ=a,Zԯ_[ufk!hmxd|lѧ鐬Cʐ:(2\܄g[jo[\ji_Z-p24Ϗ]\2Z.!21Bu`Xmd1(wfOC1rX <I@4{`M-؅oй¤]8DvĮ"Sd &fB e3<(r" ש-uۙ=9CWG(2gE;*2Z|rt"w+H( t!yl1z=-w7}'^Z(VɰWX1iiG*jrE(bmS4Yc謠W6 M0^͙Rm* eaS:QNq:ϛUzsRļ{Q? :Zgg՘ 7^Т2XbCEJ@~%֒F+\&1OtWUcR!kz/V+FhwQ23knqDmVSPtYbHE~d aUO"m_KmƖNjxEv+k/m侀r>^Qϩ(b)89ҡU^# ՠeKzlTN#0k@c ^|ߩc$j! ĄD%0T]He/#V\7XJ>݉ҭMi(n1/h;1ܨсǹ7Jpw4GB9Vo5YtS:\hrsze׾!Ҵ5GٸIvP7;8p)pW]>[ vp2֊P!q jz"0BzO(z33nG!w)<a_ ]v8 = ]Mq:wl-%oԖ)ZJU:PU8B|;Yؑs,ڔ᪃DI6ʝ#Ѥ_jOFg0 ?Na}/O8$RV..գ@j4r?ԎEbԺV65q9->YÓc]0#0GEkY@?2JT1uˁ쬬Ttsu S;QDoLc+ fo0'wfl%[9ZC>#K}S\ _RP~j~z !rt wjuol2M}ƛGMD3 'W=kH hYHP~"a(yBӈ=/hw,M_ð>oґc5K+`e iķ9,)\^Y%A#RtdO,_A+s ^6EP јEߖ*+esbx\:3yQ].[buX PӸ"ZDy, eu릛n&='QNY":(Qѳ>Hksw%+[dq:5tT$mUkW&8ӌ,yuuW~w;;?F]ź:Hu9#ˊzC),VH:"T7C4+ c0cFE򱣓Z ō0*91 =Dst,P+z`^;!m/n"!KӟIwwW^:|{KtqW%y4tA5dz~B0<ڕ^"&wuK+K1'75r]\ov_zZw@`1N(EThj+lE%}0H9pۗ&m}I5RtX]yX͑`'|ԜɆq*Z>94mj@h Ւ?K7gzh+SP "Z~*5ʺӹ8 T+N33K@`q8YL>DJ*~Bl4jZBdJeQ"_vU\üvcBVYt Ɗ_V6osW7hGݨ7q+RkqA!/k!?,~XOeheQ vBCP˓FqN/D<%-*(QBQ5: o:TH1w1j ߤ2Rd(ci?4&X^ReQϦ$\k^ Nn!h˧tf%gSKUodvVgaL]vQ;AzRkX>"]GI!N;f7%b"1Nk3~Y0[@#n Y /;a0hфC;14ZPHUY!ߣ:L?qL R f Qؚ?(6> N _(@>8)c例))Ckb83y{O*-ȱ I_mx GN^8yV+/~v#6EeaHy3m+– XPT [P;^Ick | ;"džP'O-CB,Hsvr<b! ſxzcHY[k[uagd(mԺّQPqԜH`ɜj7X-J8;B?rD112|AjͲ1]M}ngUx0Vk&dYOie*zax({8Cjcpk-!4'kX(*J8歉YOΔ,{+J2[7jW:tKiq?DY;3}ɏ1`)2„VAW/gvF22;JͬK}D-\mbw`4.1i:F{EYN`f#6i^jOѼ,ݛYیӷ#85+$l)U١#zW`ϯgSEsa3ΰfT:Wo1)CT:?^-ѲKBۜc;,脸d]j7V$-YnF d9Zj^h&RV9 j)$v9Y ]e. SLCdkdaq++Y WǰoKڸ-ӴfyP*bp:hN~+BMEd*\u`Xc-VezxiCIÝq rb/*b٫y5|R팬k  >k kϝ,eu[HBOqy+!η_`W8aSv˖?\_qzOĸ,O<ת:K w"i3N`IKND;ǑJ~Y{Ͳz;"F}Gr8%Nw6t~tqӊѢţQgU0Ѷ<@dS`?noiXʇ{&@:—ke~d;@ɧWw,N\C=#[_-}vlḧ&C7ҧ6Qup_a^m[卵] ?$j|՝ǘpB6srlA͟XAFI]OkJEISWf#8P* >COb `z\xmB*#k航:t=mj,n }#nF3E/u~lm-Uql+kP=|YK9q -}>WhÄFkcBXT;?727k)IMK qfO6So9o)4)Ar G~0/J7| FXEyQlPF7˫ :)`mOū2a<҈LkUut}Jd˽Ŋ DUn{BUw.Y yLK1:ZHnC< M~ƵUY*@;m>HcRQg'BToyct..!.*SlU_l뵖7 =MtrW|x4((``aƒJ2*zK FYCfX;LE˶;LR!(+ZoiPk+D@ 9쏠~n7iƻ;XMl,iyLز_#he" ֡b ϡ_K K&BB!q#f5􁱪騡~8ɪ.4`YOYdxW}OTi%V>tM˖O /3 eQo DJCd99l"sp+DHD<6LZs Twor xaND-K5S!EGOah8处8+Q0}5XFjȗ`hk=<"2ώUxꝭ7 'Id([bSgN@}t7[ML;b%jio=BQ'zQnW@θ j9Ǖ14ނ#Q?L- dIOABvQlA2\;.C@Qn Y)\&Z 5acHHzXA@:χSfsy-6Kc^Jaf ͓|ɪ \x9ȭM\mb^i{cA247,M.($6$\EtwR5MC'T>F̅@tMFkHv=ݐoͼΌ =htEZTтյ JdLFrτcN~#LqmxיwVBjMUhʍH Y\ ZJ䈸4#fQa0j]>X2?aaNY_dOH$>겻f3Aw2)\H*vjr Ybw F8' f1R|Z#luyWh>(.Hԧ +lΏR>aiXlNm:RșLʥ_9dX n_HUq91=k+LRq>Ѐ.7ri|aouqe^ohfMiYD9ZqĜ52l?k.oU/}i;}  LtPXfm1 ĞdiPW6Ϻc^L<b@I0hcSyV'%5UN:BZy>6rnv~`AMҵd8FRs__ߖwou'$h^Eo}I5 :~Q4Y0F; loZT tw&~RBn9vRR]2eg8)8-bN IMuh둿Wۄ%.qPf^6i" Xnf G?z RXyxwwz>_qƦ9JCY8)M>a in7# eNiiEe1ÌMh\VAWOQdé3V 6 o /9cq=GGF82%AiD<(e_<.Lߐ]oA*&xׅ:{L @ۥznÇsJh=p Lq]u,R4k1aTNdnvHc55^iJtxmj5D?^G<d ͨk_ܛMySȈT#NW~}e48<'s:.o1*,RtsFq2H0bΧmTet|x~t=1^ DOaGB>M.e,'207sj3֐VMZn ?+ǁ6|/vVRdDhy6^wv2cδw,M kf XW֭Al'Li7ۉiwRW0EJCF{WkmMZliqV㝌11/nq.,%IdF+?Tu{K5UI F$k1fJΞ7,_M15ID]z< ?am]"Vj>@d FCkjx>PcጭݴM4H0mր)Qf~p?:EQi/f~8PDɁjmߵ-=en ]Ϸo]TK<( X,ݨ3<ֈkUi&d׈$!.Rm()6Nͤw1F U(ä1!HAÑU}ԌjJA+!oʒK j -%,fLm50G}K,8[g*՘6Th>WO$-c"^QdLȔ~ "bX* QvYӞv]T,?Fp';kso=U4r5)2xP`zKw83yB~~]̛P_C ڽ/k*z,8ybm[ NNsuC{]/ur#=Л*d4e,I4RrEۛԠe8㮔=PհˣeQs88M%7w>xBv /U4dڔ^gi`eNF5wD@vwtkh`tي >ـw n!J\[KQܶ/eST.c 'F孨l>< {a7?L]C7jӻ<{J3`/YԖСun]}7YYTIͻY9vJkk8̺N0nR Yެ/KXf 4M鈘IN-h2^OT܃bk},5$;FNßΣ.&_TS,2-7?a0~i-Z/ߚQ0 7!KP#"v8 \GZTY^KҝA,fh\38 JXXHCx2#!(ch6RC IaQTxVߞ0`7d%Z00ad!g$``M4q@ycXu?X^%' eT+ʫ'[̢ d'qv*"!  pK^ЃhҖ THx&O]BL#$َ|4u *(!'eɚ8KMCJO<%E0= O*I&qV/n?C|DێʄWZ@?V"St0JsKc6T DN; ɮ#AU}"E^Pbg_62D-(1,Y .un8| &2H%CU@2."`{\*A*s[n&=(:RE @U-e肴3'ؾò-T'b^[ X*me9}E2(CI$ylkTءFـT=ލ\~'ä-& Zg[t* Йa3埧ěL/%aEg͕ S9[ʜm5/V>HqXG,< v!b|eVGv6O`#MkAGԊpEUU@6nB6ڧ~c?;_iHr~wc^CGv{&J*Z5Ѓw]x~3G2cNftL̜Hm\G``[<+2.[#a&X,dN Gpd؛oVV}bצoLG|J1_&S`ÄTǬ8 4VCX~Wr#ѱ;̬UF.#C/6+yHFv3^quA\1,JB[32do:Y|;SZR,ЪߎqԧT@YMՑi, 7!~ljC 7#E3>jށ;OFm:\9nʂrˋAE_Ni&w|Oߪ2#S~B>o #AViCw&"+,pc.'QGS"*=Ю,73YDa sd:';ԭlT4ZWHܡ-B5ɮcg[ʷ}t0 t=H5-"tqJ̯xWgԆ])ҝ W`ShdrOk:p& I7% bFnh]u_| 36&WTkTp4NfIssn+FyEHP7ݭ[76;7#ަ“A7YxJ2i9; #.'{צ'!rxQs D=j#{ }pj/Al:G CݒR#ވ]0oL jLXI^ ٩*@6ah;`[\ #/}~TOZה8V."cDw\'cd|k%8V/ݜ~ƤUJ[wN0E\ fy&@e *n5^HB˕#Oę&D) :Lgʃk iDbzi@U!u^O*{%$J !IZ֐;|VV%~FngF oi\2|Ds՛쬞=qk_[Ŧ:NA@_rB4ȩ-gV7|y_әѼȰ=ge/KeXeKK/+sT#owO유YD %c|݉R+% AHɃVm+1W)"!{p~+}4oGŭJ@qgue/޵*ϛD!솚?S>Mӂ>hN m8,` 1=PGZs]#r:8,8|&nfIڽ6e8 , Cm8NmE]B2fz!Zs EB.M~%Vʶv :iVg{iV C@FEcK|!ꕸhk<׈/:LkIU%H :sQ{rA)J&MA66应쐄KnfQdYh}6f|ț< kb"1HXU+$c++zy#Z/Ra/3[u7Xjƨzv%.Z¢%3! s#]0CHe1AR(ξJQ ԟ1Nbid}RRwvF@K1& D*_FN;]BAgkn"\(ə7fkωmvA@MebG4/Ͱ0جG1Ia*ӛԔS݀P~f}iv j B:"_fS6U\hK;AuK~P{Y#n Mu>_U ѿ/:"p[$u--3ͩKY M{8KI-Cjkxquʃ1Ξzx0\wg2 ثUP_G%DhDV )Un@$Oay!Plȝ`i?Xwڔ:HJi0ٻ,FI uXGOz"Ae~Y=2Fj 鶬F̓O蓟~X3eIujMEW9ٓ$FψՊފ'O^.0رxaz'I =ܽ87o`$ 㖣,3_UDO{qx&w"hdyDu Lol;AR'oӗz5Yٝ/G7Tn1xYsƓog8@fyѫbv,⤧grwwJ.N{0`WDU^yޅ/((g%9/ٝA SǕ?]?cLIs\H8LѳdHRׅ׊UmhV* R ~ql1MotdS~u>r|`\6ywC֟pu8\I;*)>Nf 3Gg%Gq!/՘֦R"1>}TSt3Nk5\1"!?Bj D@iW5NJ9t!_^ (Ylsr};'}sl Pw1ĮbVLw#|ÝC6 2G8v.2\2KY.' (u~HaqU3ũ y܇jMy{2P4 /dU]ݶ9jYVpGCQN h]GQKДojƍ ޕ*JX†yotW0>=JZ/[~V0,;Ua-(pQ,D!Xf`Nན$_t.3!VGR~2(KPfZW9 cL.<kng{mAUlkzy ) 6]ƨq,Xxu?0lhA6+pheDpfo(>c_AaLGXm8\CB}U_'dX N!ii9 ޽kv0T.֠tA{i;㵲a.89O+mCSy%d%R0A(%#?o]XuƙYq9Q{VT-'yOtUwX+yJBrz6^uR/i?AߪOdQn%zßaa0΂ fl>~@$W=\g]r5ɕ}>pk2D @}A|9矀Z~,I}Ҧ8'T(8"86~1T\iѵ꼛x+p;yVQ{'֠s @HSU c'W!P )tI3;縜XE(S@4Nmh3 ǔ[] ,s[}@c2 "UTP7i"IᆩO|}lm~,S_CŇmÌeH-yخBC|l%A?'7\/F-6*KC'5ahuhWSGӶ['"d % 3LcG.q7:Q%܉: Bx #:_Fʰ1_ 0E%(Ģо3|l\l7h<~d HosN;'򈔆^$ƯfUHAQSRVvπhRӺRriy5^"5tEd P RKn!YZla%1j|O}NUXKZ֧^)xW:YEMWj-6*0|t+T0LJيbWSD1!kM?=f@؄SP`I#Wq/Ly .Q(7y1b<~a sg Y,rFpC>Zz)!TNi脏I_IP$p(7xCuҕU: 鋉^A_< &(,>'G:hzZLM1+[ݝ}S ,3NƠQ~Z:O]gY# L y5qAaOQ]G/| AU6r8}HKvS{ǻl}(to}gi;Wj#iW9^= &jR6J~2/  furVL.N*G'ޑIPd mpU|X*̗h hN`zɧcjjM~_x$14\*i(%0shQ?$!R` k<Św OtD^aJv <qF|cwG.Bk;V1e K01f:SZV׍ensrLL93d?1CրGi\*[օOjЅN3NR|"&HÜ",qqR(vtHyQ'' i) R5HD/SV4NuUGtA:lubou]trdP2ק96྘Π_[M&3,Z,+{X4V/s +isy{Q33ALt"Xkǚsa9m/lxAY Jp s>'X!wSFRy-wJ-Gj!ų?ȣ/ 3\U~-GdUm 8 Fh,-VOS*jՙyLFF[cF"Z[w*N;Q]b,0a{8N6ؔT!q̼nt%)OvKT;/2ōϋ魔Kt],.d`ܷz]Ǎ /SL,Jw` EΞʸ7 o^>H(LC?&oM:yS_E+c MlCѽ: M ##@Ydx7@_ yނA+<dHnl·6@a'HʒǙVŬtgHxCj0G!Ir`sJxd~Qs_K5= u},Ļ߬w2Cً1786lr-T Ƚ֥u3ߗ2Fg`fڷdG#$G27Dd=4(XqR|(JߊiA| j/1'+Ms[.޳ج03S=DpQOZ*~}q!E+A8 0)>x("CmrP~ĎZ$G}yNlqF@ͱND<-\S O4Yb*(^I} 'кGW*>]9C`*2.L3`}>*g+ !+,DqZx.z~~`Y_et#۠1, մ0c@dShv}Ɩ pF1` >$œ\Tx.cS\u ԏTo0OsV׹YQЁBgxq2̈́#ԥDbmI;N0 7mӀ[ɣn+,#ʳ",60xBR#܃cܝ^z93Y?2^R%aJq:bd0eUDР~4vw\yY^1֙~*ՎXډu/Uߎ8 -_U.2޺O7D!><', ?f0G j4[& dw4>bwa}dܝQlrzTz.Z cAYa) vIm#b1~96}[^[;&zStY ;cDٚ<qI4D&ԗſ:a0s_L_tǹ,dV+ؽYv` u^/kw~ vRʖ*M?#i 3 6(8:wN!jү-}[wwL+1a r>w#yFJV=űUIGLDz3%$?B_i>4C/O^b-IXɈ m$ `_3 o}Xfѡ9qZ`y Z.n4Nnm嶫 JoBet]#ݕG PC%Lzpх%G6 PMlF9DRC^ᚢ+R\+-rb_f0މъNP d"@d1 qeZ/֡v@FP.K&+fR[;ǡl< ڰ&`k:*D8vntCs58 Cv;?ʌͮ} 7Nw P6,'3@a״yC1w0o,gv.FF><|OeceYjrZ/Rik O"Zγ0tPu6&u>X\V|̺p0Khq{լh/锳2Û(氐D+Rhb/iNe,Dk:D$8rXqq?Vs99Y ڳ4m%X?ŰzMZ^_+h~_϶i^ |kT>7{J/;ʼ;@pCaY$z cdx(5 ]ٔmQق.[}{PvtKcLnKp21c<}{E0~VuPӤdm7Z_^N$cs@r DP2@8}HDd!{7I+OK yPlmM1%'TM], y ~.ӡ*<eA* :#D6ъ+[o lEۭz.+iF}>\%f B",EXC!T.[>By*;t-;B%keP`n4arHPav傮u\RUPfU;1 mLf$$FF57 ơlpݸ7L ;`ܨIJ.Af뫝&2S%̾_v@G}Su:lL`a@l6kTK%55bE@;|{bNj4Iq}]?cs BJW+#_A9j@lʍ5ES=Q ?d Q,R_?}I_goU >z"Hy{|mE Jr嫀$Rm,KTJ\;v&[pLF0}b+bՊjJN4(MsLV>C@Ғ~{ǖ=/Ũ/*^ m], rSڃ-T!^D`rՄuQSDLoT0H0pbq&_fʳd񕉑nÛ_3F $+L)7U^}$? lHܘr%|ZauG?7 oh@)PG]FM#)_a$e3!!,V5-:wq'Wƨ57s5ڳoMy.PJrZαڭ?=+IRI.4~6DWg]>mM*Xtuu<wC)mQsz}T٥8`L lׁh\'RBalGVzP@3'"E@i{(q|O~f;J|Hg/TPb]nDH X Ưv[d+hrEhR]Yp=Zq:>XF7–aSϦi7G1_9]W776m&MٳXk\W5>ZW궪  {oZ/oGaP5o$ߕzE?ү4ɑ@R+t0521֋8]j+T#UQ+RSȱI?Jm_֯^@+IV>F$ŖW`S=d=3tL_7\ڀ{OQ2Q1AS>|dOVw%@ 9uZF=[ dNB';ٹ)Fɭ1ćnmj8ex2N/$Ã)W#ݴT9&0%1 JPuGIuik?y"OB7C۾Ex o $vn g>P$ R :K`Ct>V$|?Q՛R c|(5Oq/M?li== D* ;bR^[;A2$0~_H6C_] 8^޳pVPB}Imҏa;cDЙ,/48U¸Na4Q= qhLt\-m1* 05!˷.d$ešWȕs(:On}-IO4l>x\"gˣ3J3iaX_F9n&xДn/z,ނ5 g1(]ş;#d ;clcf}5D:3X~ ~cu%24 phpR؆-c]> /L Rf*X}K׿PIwoGZd p䕪P~ /hBoV6#Xub^~}vE7m< /fT{:R2rs%E5(P :Qj~9qವo;Y΂)/$}5OhaZާ%sN%<Zڳ,ap{,Yd-mHs v*΍mf79]p.qHR1J̜r" (E;!P uY A87=SOxMZ׾e5W;*rE5TOIR+}O,o0Mr"y^V`Pt*J$8a0Aj NφqxEӬ*(eMնe`Obo]2CZ~Ywэ<IWWf̗K0#pV$p_ f6g zlc"2;;xϵI97´6,Ϛݳ osNG/@y+ܓp KG/ۤRگ` /u:mZ_1 ?HFgf/z`D<#k&{7gAd NQhB@&[#`9 ,hz]JvtQ{N ji@|,UAY-Fs7 C1NŤYvP|WWv&ާq7#?kjc(= >}W(`Ry8:Q n Kc!-|~hq!٧ދtЫ5D5R)w\Ѧ4P2nF.N़rncq9 R#t_T- Q֝mr=7T39R7m@ Pɹ . T9c]e]vlB]_ߏ ~{AE"a,t>ɬ|­Z ZcOm[E:p_yzmO%Tߢ۷Y ex*L=/)zG-s4FfRQ.\tUN=d*B7s@:wYAo)7edRz\o:˂pfr@xrD{xP 0@F#>;S}H~] F֩Zؒ˸9Rrÿe0!OJ褦ku;"fH~p~(!HKFA Ԅe~&3u('dܼ,ʧY0`bQjUU'X`\ S#oGM-PwV~GIպ˝ZpuN*4#'ϡ9n0GR0;4I2 !O:dv 3;szo$sϖˬ kyG%JetLYz}(d$$=q e\J(6|912P7-| = qVv:ژҿDF}mOmS 3l -U3ƽs+rbK QY.+ ڀ(%dSdяa9MMkYnP$}w. 7O#O1"|@ d50rk*Fvzv66TmJ:Eaޅe虵"(vPcnJ^^r]ͽ8pf~ _U9ȿS}9[e8)vӗ4L|[?7+QPF]QvԪBqR󽿓BHh5K%}Gv6$+de |Mj6悡7.;E} >vF˩ ~ 9nde9  BpcG(_[0y=i6 'Aƻːt'$BȽd%7 7Lӈ14 '54ψ(ِ42wY:ܑB2y|0mn5&^5VTȢSS6%1.NbfB&lhʴ;,_wFmQYy{񰔥*&ۥ F^#;Kn;NA0 Yָ~d;8ޚ,ߏP aGurw[OX ޜO߼CVHfoAcW1R6]+wWxb ;%b,$\6qØh mWMgs枮r\q W4Iݿ[]-v:Z&HB{3!B{"'ȑ =sFjVhl'5܌9CeMË҇S*n$@ȶ)6wIP ŀ P ν@0X BW07kG멓,?o9LfcKa5R8lNG_1k>b?ݱ;!v )3+2$Eyم>mw&vWFZ:l疻 SV7,7yQhTR l*ݝб%3l :˒$ %ufF"N]9!dSUB^fn'PPr3{V׀/Z%MAy"5}Zq%o>-U!¡/F80h+H {Ikc.o-p͆$]|X )jx=}_EqHG) Ƣe+U3e iho hĴSNIV$0D0k}Fk&4mF6ga= "IE|/D.kU,CTmJfZ"HQE (ڏ [ ËoA4HpW W:2(=f0&6~l}ɸ%H'c?z޹mZHIf09WŮp21K*Me|ZqX*AߏZflqE5۱dAi10Cbk? 5a&?ⶰ!8'?ڥ=!SCƳj{emy2W0[8屖jGZ/Av<*d- kz6֗Q?BwY$$K| F#41hpOFXAU> n>uHw֖ȔzP>Z;\]lѨv`؄&<ڷʄH$n(FA|uK vNZrܭϗ9 G#6U-1|pcǷ*+ Jg`ɢOVa+0^7Z!\ưv^ B'9,Lri&i3/1i1q/RZyԌl3&t3{NT5ۇ+ 9K_e>5[l:dѢbW4ey}+8n=P83LK](< IL?:bdIE"P^/$jAT,Xdjx9Jgr;3vrW (&;Q]m ̠0&mYm&o7fB|ERJl &Xr m=>Hҟec~H8.b1/@^7ǖto, ,ߕ Mwń&Am"H+^-YďͽWHauƐZӀ4T@E[kTY]`6WW[VKƤ]ohq?a. ;|m2:]J$g[qzsUQz04%4ó$C;TZ'jVJJGKH ؟c H9{y\04^3bY6њL3֚@s ]ޫl>.95ls-ǭB 쯖$E1Y}ep{z wa*Hҡ9L P}Puu6FKk"ZL~y(y8J~0gƸؔ>CC9@%&C0fnimY0; T>ReMBv3cAdg?qg[ID(m6Ni77\.LK9j|wupO(_ƟW0xN'šH?/\*^ϳ3A_ :a$&_29q͟#'F("R-Y AeE&ibβԯ։DҐP1@NlB"j1:t*]Pa Ar;Adqs W4Y`Է=&ך99y߂^Hu }NcZt!gFٺ .1 p1[jJa%m2@`|_msAZ[WޒfꯐkSp&'A %\W)0yv-qs^wxH{4"1p 3Fܔ}C:X $dE*Uċץ(@2=bC Bۥ<,sf3峆q/u[")o7otQyS|sS&6;ѻ88YBrBd ˥ Z5vQ6uC@gYsT ^!35sӄ9hW/C&J;#]{Ƴ+^>vf(i;V ZDވ K'Q;ir)+HBk vEKB"gO4&Pz- dh}`[97^5ް(u5?T*FgmMY NGu9n20wY3!ۋk4[fnۺ6@*tna6#w&-E%2Vbx⦙+_C-[-O; rw.Yb/:.̤tdyOHwV=:;;nc4`i"u 6^;mKs$bz[O yϚ5a]"ҡ`2# {{~̂gEK:L 1\b 3ż2A_)&9~BDX? ! \t'O˨NiЧ6Y3mxMVWCoD3(khjKR8")#~|Cͱ"hЃ=,4^Sk-UP-APwr3F|7d-bQiye!s˫2Ǽ#AcY.Ä"r$ jpM#5ǫP jIÎNƤIq?|.30knFP8Y=ֆOuP*#G=`v;b&QBȲT8UL 'gN}x}6hB85ӗb<4oG"_'UF@^_r{Z<}_\WrW9oף D+& # CcbYZomUB/Jj?Sp-Ek{*5 iZFjs1X[~Hއ 2XO=>\ hׯ+7gDS4ȝƅOb/D",? ,eF5la(+O9ֵjM*peܲEp{מ;>lXZ<" KjPe))Y[Θ0 \3!`).|\lVtža$ڋߐ!Fb=LdS:@ٔX@Vb&z\b$|vBUAsaȢr񚳌,YLؑJLeEz< xwcMa m&DDÙIv@$޹PbUګh!b`z%@^fU8ج THl[Q~_8c$7OaAsQB3˵l0sTMP@9Џi T7h,+n(i0&2F$"{P8K E&Ƒk {Zt<.CWأq+ʟD_L攳l?] z,O|Hf=^T$՜#+k9[r<=#w+pƒ z3@YiHN 477OV~ޘ, *m7|J7:S rXpH\>=U} sBǻC';+- ?" e@aA$C |RsFg^g1.3L#X 2B|M^êjBȎ&Y{w2Iiyc#FXR8-"R}HS0W@5jK sL;(/GzancS_~8oZ @kw .qL C$b''u'w  8q^{7_ (5m# D! hWSyUd[e dECP8"\BOp=A3'4Rj v9ϷBtSz)g{cu*phȁ15N50 &-j`wPM8ʊ=[#\ۃxmͽ. Hqď>vq)Ro^ 'EQHcD8oSKhM'xB&YnEmʃC&m@\T]<ݲorr e y@%r5j$ڝ$8&.Kwyb\mG_V&@?qK/jj H^n\s8S.t[7HխLڐig8qe%j,՘F0sF <$桝8G"\H2|X1)R;3`|"mşC6O "z$ F[bp;c>b]&%8_ ݃gmƬ* LFlz}Qi]Q;:Mbj#΢අMԖ} ʎo,̳ɷh3{_ dnWߕ[%m:LC/ @TJ-iL;ҐΉ!ȰR/_((<8e0mwFid;.ڜY;{*GV&.ЄH$ޠZe[&LH8[^yI3_ZUT^L@n@~rebk1dsG+H^O4B`Ő^r"F]+e(Iܐd+~_i(i@DK{tM@2Ņht s$5}VKCI GaڈgXDElY 7GQ˙,~2L$ʭ4KG~vQ?=^9A6 AD1& Ѳ+Pk6 a詀\ YVͮbkΈk]>:{d3 퍬9Y#4KTojeH9{f@P2뽈^M\? @Ƈѕw<&YsT |[Ź$JyPATҦL'JgP#K|׬W {2oD~OH[u٣}0Yؤߵp)FuH`!K8 PP'}9TxMxN[눚] nZӳj$3"3s ߉DR[˱п-* /nTLi*\pAZ sz[k+5`byf-@H:YZ莤7ss IzT]x(8޵غ߁ncPs"C>;~8Rt|Ųw"Hqs E"YQqXn*0[ D"} }|l%^[nI/+b6I^zG\ '?m <*1edmbp>>if F^;D%BbmՎ.o/5 $忰-wXxF&k(Wr9;p9)sZ!1*Y]7;vFrsEхEtqK|@lWI >>f4ЂNg# 94/x Ic ,ƨlfDps;j {O4JRAJd2_1.V͎CVxXEaZ/>U 6FÆ 3& Ʀ:{({۰c/6+!ă}Sϳ|䚸_--@$b .{iMJW&}KlΙ{:T=?ݶv:p2sN#m+۴Fs5]ӄGG h#[-dh\҄J.&ySGv!^ NgYwf-WB4HB*L.sy=Wԉzٞ[Z?M3H;jtӣW/PX1?"P/R580$QtI+%ҡwDƏǪ)x &݄yMbuWou5z] n=ucHv%䩉))PocRnҰO-<#[Vs5wdIFbMGԆV7bGoejT7_TPyXX҇•H)H?%<|-ʧ4#Xsx-Q @F -i)݈mYJ.DM(eOQвiV4yMr5*_W 3^1oJ:edPaO2lBR {H;:drTT2{pjiiA2sfHX E%ռ߯^ա/&Ǚ<*)Qn&|{-(+HSsZL(JˍQOjaRAf'+oc JסSiz7J&ZM_|iTnZڈ<=y&GmB;Qw!M:D4xX 2PduV|=y{]e0&Pf|[$V GZVΧ~DkiHWB-PX2 SڜMqآ?<4E/}if_m6p>"(nOy<%O+DtiiJr+]\+#|J:l/lF=RQl0>M~L;$_uJ#[]_.OaO3R$mCM6fBÈTV؃^HI"čf"S3afHb\ٯ]߹aä*K.M5c1 C(g %A ;OMs`JAtԸSW 24+ǣ(m1#s&!cJTف]z ' Hw|>>ӖU,}4Hˈ߅(sÌZz "gt+EL@E>8Ӿ$. c-Edh]aaLە|8Crqrvё×N+J1?\MSd8PJ'Oe͡A!3PPVY3Dא}EG]g(!Ǐ:SY*֚Ώx$8^uvUp>~RJlT(}s)iDw" ̂z}r=x?~i]{a2KY4~BvxYܧAEph@^!6-٫`|_dTv&mۮ#p=O@"ITڿ ]0Ȥ el1B0zgTT&gxd(KLF4 WK~6 %aTt)YFU= 3Ud9z}sJzVL_dn=HYh9a7dady8COl8`8)C -)WOd Ԅo rf lGioaA-`$;lè -lJ?!>"!sY^bJe,U?voRL02=rXq~q67{qos]H `jL0#*2jq=(@cR`j[xHy}b OB|Y,glALl$l)=xcR,1Q19L{1@˶@(N8k)nHn|4 t aܡ.۹Nگ 60+ZSzoڊnj bM~u`51iU:6d N$M6U+,5:ft\{:^q  ?|,: + 3P8T~qJ$N;)N|eʈZ9_ W*O ?%MŠGkߨMNB@;2x-;hggAP쥺֎$;*پh?b1.ϔ؃1oѸ=_#fQT FYWHgS I1\&]NiFEt:^CRjQ7xűҠ6.2.RїPa5̉BW!/T^|X7'RCD$EV IQ7 ©.)̍l$Mf_+Mp` %cGd$˕4{U63rvW5zQJ,>׿~Iƕxh_R)r?_fqZh| H ʧ#B/~d.Ivݥ+~uK;E8e9uM*CH&sVH#-jPug5Щ鲺߇N2K[&>߶][5m7jt5,dzRϗKN(kd`\kL/d|͸oxmIfvkpR>hķQjeי.>'W * .5QOtXJOxVՂΙC`T1-`/MaN.C^ӓcSLx,>ck?aQdI.򞔿wC==D⶚Q`{-tZK,ݘV.hBQO/jC`o/Bh:ߌMifխkHrrl=7S=$9+286P8N_Xd دo(+_+=:es O8K2(ndlhY:E@.F +TJ/K-:<6<T_7<5=5o ܅sA̐ <Ҕ/3q FYJֺ"p=BO!zqD΁MZײEishq .RvOjF6|cI&hNY!c#)q?wJ6)K" pa>V90Zd~lCiK? 0ALP蹚,9rAs$`ycǘLẼWvR2;uEyuQR.}6$a(<o5)rD569P7 ВTM1~XMt}ڤ^]w{uv=Q_yqϐvIs681R_cN_"IـR{,xUV~e*r#&ۃ0H$ʴ  =rl{jٴvf j0FDz9jfCL&"F,fSW*711+ugD1X2-.ޜ_oHQَ?,CyÞ>Y9@">vB@:Spq$~"f7hhE~ǩ\e`dSU<}"8h&> ^/¾b]4$1b%aLQpN8' 91mW03+x> _W{7(e]ķ$ٯ*~tW0j&'LDe귅8 Xn}(~sVTsPF\H,8.xݽ@ ճI]vV5]$4kQ=@fW$ Hxqԯ"5_ӕS/&c*!+8dM<T6TzN?J!d?S̝&m%U!tN\n_K) Im19'kGW).ŏ`([[`M d*6-7#ߘ*6B߆3ZzfmbY ^# ˳iדʒSuZ.3 x9KiA\z߅$ ^uZy*%`E =(#igҠ#Q"iq]M˒~|]: +iEOQEuƑWDGҲ+\".q eC,ShQA ZǮw6qK(pݲQx>x-CG?JRPPs渏m{Jq| " $P~܋B?wAu FŅX6О`ف3*zI*B!?C'r ȃs3'%2TP^I'0  c嶡+xGZL-_do>EI4buþA?20>,̀/ƖN*(`XcH Eqe4C+J"]t߭y_飱f QV )s /\\;v}b2%{h0̛[J9%; ~4.HTދ9q)uiMocN!(ZMbM?˾9A9 6jRHC]Y3;81iBaw.FܸӨr ]W̡;biA,NNh}%T%B}N6(܊I(?߰G`DIӾȂ}4CΟח["``7abY 6 Q&wiϲǖV(1 'F2>&nqp%׳O`*@N'Ojw>>+Jc*P28rj88U$ߐmft->uǩ1LQ#;ACv)#P&}6EAB7DwVatE%):I61A.jFe;bh)K7^d&4cF6C ,I 4ɍI\Q0^ָT E7L)\7L> Nr*H 5=߷ck~0Ujؓ\ 7ib=*y{ow5zjP_Ʀ/f<3A'K?2ښY2MY'1YKcih&&TE=QؙGg8 2LX]WP%M+X[[n8I-7XBğ^Qn\:txyw˗ (ܹ`gRA~ZMPvFX+rmᚩu/$.]Bћl<څ)2y=+?zL[7]k -IQh쉓@]rHq02V`br0m|~XZ5̙\[b/]YfM@+3S mF[w&lkDJZ@S{xIQ}:&Ŭ ) iwd&]y.h. x/`&z Բ24U=ӧT|IjVwq[w\HKz Mښy(EZGQSWx~ ?kC"тo+zګgZ6m͜&ݕ=|{_!Ìӭw=$b̻\K$j!0!.q 5 q4.R>Μ֌Ejm\GF{!.ˌS"&~&/h )%vBlVGzqV:J^qշ:Y!  >Ã1MX0^5% G goWo8 ?98H4l 2/é@;9 T@Ӡ<51<;`z5ʮ=]K<x[$eL$, D;zn,Rg"F+Z\P8XOJln="SXfAk$&2l}%W8QS<ْL, ΋^nhYakЯAmP4Kh9[Rڐct+Zux/n_`2M*a7ȌIu&9I>7Q$%F\ZCUЛ9zE%ya |בyQ!pҋCGGu[+̑P!S|x3)'RT V]i>:\Kևz繀daVM &As ]Л4ups>jS¾ʠ$@9qGݪjD05Q<2zg4.&o-55=EB*`Fev1!wpR=kޡ_D*UOjDku*>kREB%kD!^ō `~% 0JvȭYxME)7XD]Ѽ߭kZ4\ ^D)0p߅}| ˪|MBӠ8;NGѼY(bRM-cD'P,W&g ǟB% j,il?$%]s-"*xV;,l:$SCDK $gshzkz<<:mhjB_j@(Yp:/\ #%%A5M T&eI<SI g}]Es;0iѣtDaOG~[u"ՈmK,TZ)x8o{P?%z_rylN2wl9(kXi%EO635*PG6 ,ARbRƐs)bfw#&Ը;iX~)/apE0 '_‘[;J[Pl m=!ߟwtzd.ϼGez{2F 5w'Lh+S;Io8ul̬J9S{u 9b~dF olz7)MSdpw>~$,Jt(-XEz0ǯ:z#^ %ҁQ%sE?ZcO~=r B<~ʈw'0# fP|N)I)(׌z)xpk0/s&gMl,.I!~la\fYû_yBީ%Y"e*dD!@9G0EKz'~c5b]hٯX*h?H DYyz3fxX˵Tsdm%"rhK"~[K@%Kb{EV4e)g GYo!/1n(<]20݇,k S'&%!yz\qaQar 55uɬO(TPު[=ʆ+4[%cs@l1&Z7yz`ɽj U~ӋeZ9l㹮>ςgl3(v8b8lL=,wq 7AJRXgTwAN W]\KXR@0/a: rd47˂aeFW_YO%|&F|qUV aZPZIM6smOFY %0>aśhQo4|n͏硞o029ͫ^ `5jDV2 `i8e]VdɆ3'rYfJb2(mȑ!RYutalx"[ -es1MfqͿt%hK/ܳe$l,M%rr >`p<Ռ->6\8 /Jpc'*Ĉʖ) {H+Y. KuBYy\`A!4`xcͿ28N@GTA!.S(i 豪С\ wz<7Ɩqw~;6Rtl)=Q* Q Hg`A] BxXtM$Cwr# *Bѣj&1@74ғu}Bkw{28y̟0HY@Oẓ)m}|Z$]$!k`$.OwGk`]qGx1g Ia۫-*WdQ3ϣ2-S*Zx }ߦG[3YᢵЬ 8Dry4H b*cCuf jSVkU\t3t2J 7FH-j?v+APvCl8> tqMGw@B Bx` ՜S0>s*gղ!]Wm } xKELWӤ Ә_ ^R}H4s?T;O2&&?Ԩ#ʽ-!$d-ϱ% 5e˽!M?ߒLASy 3䎊8gs.ճpw|UVQ 7fΡ--/UKzGIu]Wɡw)b{BDE㫂W]FٝS=j,=06su~ hI@% DrNDDtM~ .wWN̊o#wirl1keU=[NNo/`-zvt [WT1@q ":.'6ZO;nlCa0^_uoT?{Α /ht3(4#X~V g,] M@ Kl=S懷#.Fi/'CDςW:لO$C=e2|k8E9FhlpgnާpI 3`,t |KMK=\t`nNʔjʼn {],iO3,\\P]jon-&12HzI>Joq6r=ZRgamq(3*ZComϏuKCOuجG:G,EV=ҾlT0ɰ,5]dvHqI _h Ujms+B~&q\',qYJY}]Vha1RTrljrݏA>R2b>׽]̘0MHul*7UO,5WvCYˬ8^%[xώ xk@,جe1]0\ *\;~'Q >SxE sAY6ZtAi<3 K'I┴13ҝzhS2۫נ:.rwXId'Pb4pE1зan"hhR@iO?2gsؚ0MTΤ5eiva e !GnRwj/:"F}-t>҇"܁t}luc+ )v Zʰ"MWxl8Pa@SL!?;ga-<2_TmFV!V xdk7h$I@i=?,[sDD$U[W{58PzWp6S'XiIW ނ֝ 7|To$`JC^g2[}䑚u1fGوay+zs '%:9~rXD/VLbX?W ̈gCG|Řl=h/l~-p b@4.lYkQXHtEL7Q*D[MIЩμUs? 1eTJW`'="x)5;)c[2[6rW-hhR!]ܘE՟z#eK_dǟ/¡iڸPXդZw]T+Mm+≚9Gj f{1 . @/gvRZ\d@'(w\WwƝ>?'fHVib (kkB0 qXs ժu)wS$dKQfB{Wԏɞ96 N#rqD8uJTb%E5H89}<)U3d|j} c۞}]dό \A1@ 1{ \V25й`k1JPy1cw**`\MpY!UybAN?W|޷:;`& LҥWiƔJ5/`D=d|4:]`W$$1?ξی!;<w$(c$z,\Fe>jS<*XN^^QR?H%ӽ,y1Z,VG甜 0oڣLW4'خnbI4PV{(2u &p\dEZD\8VP+VV1|Е޸ ([zA-խD_402D_ ZbY;N=+=="˺cFu|eF_<t , 7DWJېOB~-wi&o㟔`%CYv+ |I Cumh #!pKQ _',+ػa^ ǍXD0Wc^iảj@E URj"<<^([S_h ,IgԶfyUV -&&jW2O|}^,X^.9AombS99 'NnkW$[`U?H=XOɢ+)8 r]L] PQWyqy:GY^2RqknI O8.T6-웨ZErm&6k,5"nSoznqi>^8Oʖ.pZs!T>rz9Þ,HNMfݑe+4`"s9hYNaj>B֋RL j Mj."n7+7i4pp:_'r6'хq! ;4(LdYdg:/kv1٩Z+Ds,xOu@\b-^I[,Ut|ziqy?3MZ[(f3#Ip`n4y H`Ԥfwt+Jw"ϪC<_aloPܚG~[m~)shtpi4COFYV \NiE j*@Z; ~tp-`. 2:LҰuW!cu؉1`ag%`]5չ17ݾNbUrY[O( G+J& <,!sݨK+ڴS ko͉Cbw1 @2Rǥp46N (?z̽(Ϝ"zԓ8 !O8+$@I14q# q3hToױc>О2\;P'VY8y,}] {B™QɨOD:9ب2  aʆ>Bx"ER -}o^CX3)x.ی=yCHqƁ,⓲,*)o.UD']ҋvnɂ>a KB聓!p?GXhw<30-؛I4Z(Kxi wa|wn%1{N Ӿ@{# B`IX[h_lM~C؝7>aˁf r̒ pcU¿5c$\yݟ7g;#N >pG(b62sߣ~T&&*6(Lx$mb_˱q}S?@rRX,02B, =e- ҥD]{h&NQ +TN -˲"&RuPD]-l&M<4+J."Yv8 9ۄLGwυpH=~w@log{ %Ώ3vd ֚Έ7;҇ 7“>e|Q2n8_C__Q/cش~y[J ,ܽI;aN\3G9^\d,(f?%ޣ 74Ye[='o#ڨ႘{+Q4v_KZ$hǟ(9fxOud  E4xsyp<=fw$?0] S X9k!5kPS ehz궿Uy!E蒈Dg/WZ-ѓ["5?ЇN 6m/dD-\ClJJm1:]NI$ۇ&PP&o]:BFm*cKc'v/d ;<=8Oo$@4e5 7Pup, xռ`w;́ngC-`PY2%/`mf}/X'We{l{>U[mu ii* z"7!G,j֯\淕b*w٘T͡VifRYS|06 ?c8["ټ6ͦL&u̝ɔAX1m^K|ѹfSkO|& p;7n2C :,^FG4~=eE]*O5fyy]6m2ΩL$lXH>8U>D>+O2ZwZ #Xe 槃gSpsQZ4yא Mn_-qid-4({+wd[0K[PI˩1޸χMbnFf<;E>GZ`_'67L9wS~VA5<6P6J*{ \9og||(!FIRvLN3rjVʑϿe+C+UN\ W0w@]Q*WhcQ3nD4nb2Y ҧ1I=ܯպO j - xb)o[v\u"D+{n`7˽t#!O(wsgZ42IEM>)0T/i! 1x'>k,6ϋ2z努x;ԝ U01 ݢ]UY"`L.]XmčQ=II!0HUEIX?Yij7h_+LbВc$#W" Di?PZ7*_4;+}=v F_KYSU##3Ds' &ftnNUGg$PDBHܮ5>"@7-Yru0#Iv1A~8=7=`h1.iXgczrhL ;HU;)̮݊g+W[y4v+k˜&~SLыs]k넀/@-= \1ۤ㚦Z)Oˑ%PԍvftS4 cTs2IU ѲD!m!-ex9= >?CX1c }%7aW=5G{~x;&g{:p2bPՈDNTU,5r&gg2[̳?ȝ#RK?5BBy}%WvQ z5U=MMQZVύ4>FVm:< fpPa/o`p鷚xiОe_bWARcdxFp#\AƩeם+Mempt@kw{tQa㏸Ne[M,`_h2L/nV=^쒂CmE1r~u3tƶƣK(@c}"L¯:ʹxv^ 1h_TfPՇzCh ^@p{HNNُH49Z\,2x1XGxkw<֛\|8]dK1b%LлF MF[C*12)QBaOviY<,Z]rwjNNZv*RpQ, '"2-M]g$nxnj۪\Ό9nb?yL^r& r$]K,jB¯بs>k9(^ m] b7UJɬ^ ..N"el9rsJLzGrQʴ iQ*T̪5ZmvXUai[IV_Q';t [^#2Sk}v|M=)C鞘uj$g֦RP[ s؜o;ľʁVgK Lb>A%6pwJ[cU[fΖ:DuL#0 וm{7I5 bQhSX|8'Br-]% .R {jȍ;6zmRTԆ|i?lˋ|(M+˸`P4[YD"  wk!#OE[LSjFTkwe:]]x-?'nF1TCt^}.v|m=AZfTA[Ŕ}6bNq_Tg^x'9/n2KtkcT-w*5dyGkUr2K呞[Xm5Ph^YUЃ{Bt/i6^q֟B-aH ؗ}U*6}+rvckObB r/;(*k%~ZH8_%֨i&ú7EY%*Z{97pEӌdQ-l|8rd pp`|&*u?p vsni3:0gK $5EWMZpuwMƛfMKbkI*:^t ԍO 0(XB-"F2i+ݼL:80 !@ Dĭe13{|p&)>q(Y&Vў4)9;}Ø8gzϓ*Gۑm Y?}0`wty$GU t.`a~KxVXA8[0&E = [Nk.f?3[^c-D 1,8ڴc?_ N.uYZ#YII\ĀLb(= !DXwԐrr*Be'_DEv׈5=DE Re p!C'Ø;c@ 9pT)[ ЍN)zd?o֞̉on(L IK0յpLES|Jl۹4GgHc"ϥ L!25)BstzPAB| zD~TS>RS{Va~glua}BRZg`eNIc E(K U&! ŤCzXMb U5"~ v8THMfh:O ʙ`VifZ "W:_ջ"}nw1q"Ih3gxtQ+u Khio eGxa"H!sA|Iu#6GɸN7㡿j09*iO;8d֛GSqc?do8gq†e,&!-6<~g鞥]/6A:Oޚ8BHяBg)lcYЦCׁFG$XNX WYIj1iWq%֞A]YiS^KQzZȈAN Ea{N IY/g,`GŞ}8гRm0Oq(p,E~ЎQI8Oϼ@C G'Y} %i.bJ^jur|.ppRV}uU9ЍtD"w;ΟU/U (ξЌ>XWrG%R0V-ӴVU~ݳY ZֽY>3N: y1 F wsvdzh -EP]Kkn??!DŽ5_6ՈIC7x2jA1dy\nx:@)UxOClcf B*Z)g96\)S[WRی\#ǡS1ix9j727٩Dӏ- ]!(:܄VQlirW6YR"]y(K#r9rI{FTš'~!vqq~?dogC 4f}9vo}ۭrf'Y2i-@8(爕}_^u2t"`gWM\`P X`0԰Rѱθa$Ä,ƓmmZ+[|/"i8f,aIJ<+qqdC>{rNo,1.Mv}.?CIm3:S@2׬ 2ZqcoԄ|)OXT7oXl2tIG aBULag,NƅF52FȢmowb[>ߊ ;uܸr>(yM!\;639oA]'i:7 %zYE#YrŞK,E4U3'_R6E1ŮVR &m~$2+ #-t*qE z -Qd'3( &ED|8Pii1q&8'!8;Yjޒd- g~$\(fPɁd1C\d eYE)Ԏwz:3 L2t nBp_p48iZYYf+b}ВBV_eLr"$,v'jB wB$]C~i}uh|l/Qv#L Q@[I K]I!)[يkqͻvg] RGZ҅!hA7]w4^XA 4r <*|Dځ[S5zcJYd`1ۙx"E}hB φP^q)aN=~ǂ%ZG[VϮl&^2b#,XcTO2 >Dp58qrl;cs@F})(^d DBBXx}p?dg .}|Osx+6<7t:gKrjǛv{хQ#=a-2vB|u] BwħT5-WM S7sa6|bla- [,T8!OcZ(Y#&,'<غPLIsX[S{ӌ޾Yv'ǐ&rވW9{cC\yr]RE|_xlU;zo}Y|zߒHϾť4v`GUcdpم0!u6[3 ͆>,Y ZME\sFeKiވ}H$F缬>B$ɲ5PcA0v ud_a(}j{W0Ɉ䥕e7̻;Ӱ'Ylǃlwi6e؅w JN#ܴmjN)_7.I*ڏ0),qk^3UȴCp=`+ZEղ}xCSxp/GehE%&L 9Ttp=쭙,P` }ٯ ${-zBMV:ly_{wrՒ:~+(LG$hAgýq%yr)׹&B"xy.`!g¶~~o誱+bAo%z)M?_:(r v8\ݲ<nIk9Cjv|Xi~G-}YLҒﭻG&/ D7 B?d*w)`w(25)S-8[Wxq9EϗW1,zObX8]I=_&m%'3<`q'b-RRB`yzýq=h^L$Ah婵ʴ( MPDIgTIؑӢPAŅg-6,pcǽ7+ ?L|R]'~`ǑL|# 8Jc}E #e$%`Ğ1C~uGV`jbZ0ʥ:d4$Ø\W!MfX[Ҹ# ;<<]J?.PY,w ǭ?%ssQXAq aD}!:vXA̤ņP;<'ߓM3t#P~ig'ίy6.B?%v2ni`"V=H1m,cH4κou{5_Zu| @ku5.`Daԃi 3Yqԉ&á\-{(М\Fm+]s(]nd%)3!++욪"6'3ՔݟQN7` ~O$h/2 6)#Gy ;O#w׈bv6[;k{;CC$ӎuI>-1/yr$f3̹kū?qB}95~8OD6SH[fe",B&<]t!%ܶ~DI::xp+PnY;T<ǪF(Z:) ־ ؅Cc~##Tpz>o{ uĭ,SBj5m]?uaYR}T pvC܆2,CA\YY?c$' &èәhm_ٔ8}IvOLj*c a.鋰Djlw" #ki4rQOZ. X/-'>51Ȉ]ceR"z'\ЙmZd>󷡼26>)՛SC81{daO6% 3c0>LB1Ns!c)Gl`AvKQQV8;j(2Uk]i:[&]?rLH@ 6Q)sy x"::sVX |$"g[2ʖQk(+rVV j.)uf.h1/-]'Fwd;֘N<d3##V9=T򃉈-춌P(|vgK KBJT&|-V6 Kvkzu4*3ND*v'G E?r Guv_õ/dU?Iƛn DsvwI!"Pi]fVr|! +2կBm@"QK |P:7U,hj!z\5 㽳 Q`h,toŷ' 6J/W0fM 2Y"04yi6)h`6P{vu5vFF[\vb 7F4ԫʳk$X*9´bs:ss?[5t^8w vGW><%2$>XTO@'CRm&>l;t o`vPE>ZA,ohX7ʙ%'?pb4SwO<9vְW78uMkW{Xmak>o /#ka6BM{cNb}x#(tZI4S3 -=(PJ3GnP:"6o 9͠`R8^Jei19i5;vq cz?R9_@bJaҷSOf CY'?[slN ahjäqxd(]Xd&1[NTtA}hb[.=f|) T4f@4R}Z}15Ki;2 +,RZBeXL$1yꣂ(r=ʤ[ݭgj8׬/kSMmQIh%h #w,m+)Q1nPu͕ b\qH SԤȊ65UُFV2hfg ;ji@"PWsKդ+n+Th;쿶.BvNGMPM+;TTU LeSftNg4[G;ko0]^23-uNvEߴm$6yp\tqRs֗1E^4ua$ ah8?ʢ q' qq}D3XȫM,MpZ?n;!F I{|5$ȧR@JI:YXAdGJJ{0؊X޹O}lPdbkLzǠl^rrMΕ~y)g# u;tj\M( m_|\1x}ǠV@aطHFs(`' Wkјo͞6[NBqh;T ç+u]+68HY-P)Tw|"p7Vbc>E{vZ~ne$a3j Z v}]ƒ*f9Uz^y gEw#|*"*wُ/u>ԗ<0%Z^o Kd@GeVeJ*Q܂xC/u9XHum5v08uEsEUYJ禼F^:S+ 66g"g$we^2mr_Pʄ#wyCݠiYQ\T. S} oi܈wԕ͛}>D[sUN<ePzubAg70BlPfQ)8 9 Wn̥Vc;Z-.?

ꋢ-,@!q.m5`fH|6]!ܿMBY?wI[)}#jCϫ] 4[:M2"so,pY{1\4y/Mnv-˺Y(;"?ЉLix\jQdZ;64yU q雽;mWhպ6{S5KvS=8T##U }˲qT{ o ́7N&DB3*S?)$>QA_7w?E{lr?;aŁSB E.c큥9grRbW盪rPapmFpt<p_{ƕQۤ\:(WH'sOmKq镞7p*i 揗jD~xbNSHbĂi}:|7@n2t LY "O~r {J HR4}4E0FC)w$VZiF1SAzsgq8˒rS?A6G@ O$]]ȥ,c G2 &8ʘh V!g>rG"sA@V03a'@<@#E|3 .#f'YDNuep/fvDɸ.s,cykG+mb~=*i<<9vWݎ i}A$AR>{A.Ҫxc05F^A `RbBDtZ (a*PM&%JJBj=]|$3-{d6\r4s!/qmRk(XHĹ082= PAJ#P̒`J+4`Tq\D()?V-J\ (x#r27˻`q OHiJ %vN: 47#XL*vhUYPLmXAXuzaRDf987Y qGPUeTeeHeP W8+FAuBvV&W u];%:m6)1X`'/̜N;>ԕÉF j.^`@'~:.% yHIp?3{ST8Y+XĨ+JalM=31 2B򨯼9fQ~\qixiiwQ!-DJH7M~<6Lꩍ$Eu#fR"xeR]Z2'wU6 r>OCq{Q, 5@uSk JܤRjtE?\0 RꑱOja׸ދ)j.{ٷtR;ނ%AMZ~UjUCK^FXN c*eie>$l}F O?+"^P^4{]*M[C9^\ZDr{ ;PxeC/03+F++c)H$п$ \lIwXWᅡU}lp*V\ {6ʘ\ͶA8\ЄЩ㤘?<cߵֺ߱+9^,Ƶc,(u5]Q1ƎR1kb껴sAe6t#H@3Ⱦi[T C8!hU.#Uo6z|A$y ]_7-Xbpm%O" < @?׬˸Fbu>??,c8S-+y-2at~Φ!^B&9F$?2ԪY]\#Jw1El=- 4Ui}%xMJ*`H^MgRC 1;ubI$5yZ+yUe66mIRTdxpzw@HJd"/4s˛?#SW^וݨ+:`w?`a[X mB>yׇmåG)<#- `y?V% ma!ڝP@;y(tWIz\ឤq3JB2K;6oe 74\_uߎ>)cFX)7ڄkK>IIqw8O_L!B~Ӽڐi>8cQ'B3&TR'ۓO?cYsg7dϿ)@T}ʀ¬Lb]vP=[90::~Ԃ+oa3J h3?]TͪbjF~P 3]6iPm| 0IKzTS@ '=P%j` =&Z#DPY&@- ɧ\ܨiDֺ1J='5k8(kNcA;mDdfӥےi(^;sHbGY곾T\!sf=3 Ja2՜lB *bl$)qn]]NEdY3Ȣh}sIBM2OA їNUJ>9ۗ~us`z{0k֪􏇣mĚcSI@>DݮV! #clӊX_*Gbx[5&!=ߍ2vB)0tu8Wi8Psqf3Y^y%z`h)LAcSp?{w]]lN0vʶFcXV`,lg>54d}l6M:kbэ9[`f -EH`lho>Ji-#}A'm3Dn٣Vt/ fr$yw1_ޕF '<8 J]A!p6] 裈=Xd9|9R6I+j_e5ߗ40k$\zT Іj31{JNYF@طd<0R#L z|䫽3%2g@żs&R'=E%4폦)eJ&&)|PkwH`<(9 Dn{5:Ynܫ((Ws}!v3e UȮzd 䐺Q\\?7=AѩY6ۍΒfiz_\wk^ 7Z'Oj5Q"L4rk+3e !MO9|_ʭRdJջϴ MW* Źؾf9r$ͱejqKZr+fM$ o#n4j }{ )c'<k<ٶl,ǰOڳ:'}~&R&}/; >u4T> ?Q=Ό wzώC+8Lg7')pT*Ŋ !ڿTj.2,.hHNoE6CS]^(G#cI˞ @>,:|.*.?lӻYMLF"cm59)y[xPR@FA a m@ͷ> c{YAK62S 1VWQ{WSV %- ?vh #uhRLh,_!g]\J\7Z28fo4it\og2[$Ý֫{%v.D1բQ 4'ViBI;*ݙwt|]$S'$4 OpMօ2@(>j9<,٬/HL(xK yJ(VJNr#Q_n)iiڽw-&g,Sku¶H]Buդ?t0eGƖaZa\恣!@ԯ,w/QngVB(<ۂq('il 0\O{4X@*M'Pcab2_JG\3 #)ӰXns`4)mGlmQ`=KlqeN !V}cv0E]Vpy~ū+\<_ Xu0 d!Gٜ3oDj>5!oaTSPgS9i? 5b 1՚޼{ 1̈́eXidBaH=i!c dΚg_Ųڠ4f*7ҫq+4PP)16#.|?RDAnmd0dNYU(;b""Eu}>kdx0LW)62U8)JnRBR}@V\2xʗj0d ͊hEws(BoЅv|ݟN ȘUg1;Wվ 뎂;Op0:3hշu=Іj-R3Y% (Yb],:K[_E$]CCFkP֍Yl h+J/ɿOk_ t65Je FiF[J\AŠ8e0uOq:xsӃ֔hTږ$We7J= w|1V[px-@>Z^r[->bβ=P~ ,4pVpN{D4++"Б՚ KRtT|7Cip_u9:)$?Wav&]?/Hhe9ITBDeaᡥxZ҆vZ&DTp ]Ee?ʻig?KGk?Z`N&e}oaR2ͅu"Y+[?5u~UgZ;VvcJVW_ hKyp^\'MP@|?Ir6NMk(`< A0*FʐK4Y;{ތ9k);P)96ҙ 2?C) :ڪ0B̎3#j]0/+-Wp캒: t ' ? zQ >_{S.D|[v|;8#1y(}p˼TזcrB<zVku.PNIf:X} nzV5>b ҴX)@B)klRlV"W`rt%JI+Kk6Go{ 3n.<$wLIY`QnӖSL gBUo 7ǂކ}HY_3lշlT2 >Su{yE>c?Ŕtt[WsF*7 k(6 i]/ij9鶊_40f#La[\K< '}tͦh-䂰s_q5W:i^cPݘE ?qFO䄝HOlEqOJ}'@p^H/o &tf["4j/l~XoՕw>QB7cYcmJҏ!:emx_ XҸfXDW49z% x(754DqE{yZ]:ݼG-2ֱxb/AV4.|OL骃J 6F&7M If 5H:px{]Wj821*0Yw\cxc(:#v-bB ?,:K0c# !w3jg갨'(JH8Z 5rlVltL ?@VQĩ|eWb쫏d>[- ~cE0^㙪ag0 WU!pAOm^ݹg.R '9NKƙ{}#5{ {|#\O g(&ihZKwz-OT5 t==\D!LUueEXGOh{yZ!`HREH.#HA8f$EzVl>tz yZas۷0_3arh^v_;_|* P&-pp?3*[RI=m!WdNx. > `G]'xŵÎITqJ PQ=zء[.wX}pFdIV{B܏@7S4Q&{OPP"W ;S)MgLR14`~n&1ct?I$Ov  QX݅|m h!Ҟ3E[N#da$[&ۢ=g,^ pɑt̴ [~ r6PlӷWqDL<#S=osbS΍N g>> KZW L;LΨKj[Vp0ŴC & ~t{xl#1:̧dŇg==N m-y|O6b/F7qvb=]˰BpDw;KQI *Zϼ55F9 0 kiDCTׅ?V2So3 (\-]=]pwQtdzP\owWU(_Œ*A^yφ,}m{QVfQ|G(k%?Oh',6xRlR;eԃi"[we3P܄-_hE !Ɇ`OxSәw*謫tʩ5e`&1r֏t #)$Kx& 9AN__FŞ6t^ruq3&3N>rۡϸp8T$0{}Ȟg2gHn>ޯHH9ii)2~J]N"ytBGz " i^' *y((# @Ve7IA&JMbאyQ 9DM0 Ka$D&JP( ˨s}B]H,l)R^a=eψ3~1{]HBGl_^0Vcst\V ILPŗ^D3Bmۘ - T2n)ԋUww֑sGE;* ȜgHIߣpر-S&DK?? 9(WR(-&Ew?7cr)dpi6iqg I6G-RX6=q p5(#u]:aI1x"Wä-*8+<]d b"@P`,R.]C72vclm[(jNĩk[p;/1>iBٴ v:YZg]tJ(,U02tpzvS#b`bT˻4v(좠{jD80 Tr6Cn֢sa,4~ 5Qk\{.[ed6(U=!f0B=A`D-1>z\B,Cgo^FcZHV-ď {ԷU!nrE.0 ߡH.OZJ۳<"o8;ɖQaP᝺AeTЋ -o`;Sk) $xKnnmw8b3nCk>ReUS[839v `'6G`fZM2ACGapT'c`8,*i?n3N:S>=*FlV Z6BZ_&&"M}7ܣƶ] Rh\% Ay, `Nūr)N"ݕFۂ,Յ|u"zeqڒtXqU 3 :eZ{ &h(,4GX[ɤK _C%=E }aR4g{pܵrŶV hkmX^UصʰQc6_R(Yq;POSߢ*O5hkDawl`(饡Jamay:M`rT(֕ ӓ[_Jigy4,5Փi:](ԷkrVjz^99^ܷ‚pJR{rKx/&Ftn(aiIN.A`/D>55Ci) WM>ק}Z hQ!Rmh7KgAsa5v[D"!-sț MW#ĪOBCf-cR|l켱Qt"RjRYHr5`V?uu͑mu"k؜CQI w-m-NaByN3횷՛1`gQ%(^|8 MvG2!ڈSb4mC A1ӷL.\y YLyuvA{.\ٚˁGw#Y|LA|$:mnyVE)n|m ͔䶹l <.#&-V"sֺhHKE牢Kһco?F(_eəב}Y\!2d79EiHp:9@aYbfYDRVyr%N0BmB1r>)M:8ER(/nZLX uQS3 |ktSo^o:}-%=;/}L$48rwlR8 }x3ǵNAZښ8}/̓!-dY \oȢw~bĎΧQJ|bզǾ4"><>7eM.:Y}(2p:w~3Hp\B=:uwnDdu=* O`~LS034\wnUFFStz? T,j\JQr4]'ThϮ8XG9bY *W)N'Ү;fx/'zt~4G r׊y JV"J =[V,tVd6vVe0||(ꥒ-dX'Z>(q?*3(b?HJIgfShA+a: ,Rol?Jt p$, {*vOJS gFDR"؝GoԸi>` p3=ƚy ;a8 ƔFq%2K!-Z, G#) &^j|瑪]tCՆ humF øMӬR\9[=> L|C|C0fۀrH)!t`t.~-KrB oQC^Znc*O?QC*zpU? E2|&~@ M?-7Ġ)CfV*g}BI reD;l *!.=yBS0a-v$)FӣgM85vl-dA{S@0aM>| $U|)M=xEfOUJ.7JZl"(=ޥ&O0(Qv|`Sg_βKg8B¼Nžަ 4$]ƗêqȳR:Ols6*PG&UBt©s4fW2xf\Jn׸cQ0gȊxُ D󙟁]+놱=u He{A(ScOny aB%HZtyp:贆4@e#lu)u;Ae+bwʉ92*99ӚE7'kmWv(:rC>pM\ozLޣ4|Ĥ!6RbJ-Ko)ΩU~}} *D<$}谤5؄ vQ9 ;G%g77.mh^ycꩴ!3?5 o]ɑEHc*bd!gwďgujZRk0E|q2Uτiă+zBL"CHk(N'_.690*$c(̣NYw]Fm킞1ϼ[- nZ*_%@7wAw&{ZI:` -\ hfEatD<Q|hoCB4ag\V^ $v !޺]_eCuz6r+ Wƻ)$%_b߂oy.ex$E׹^ѯY3i@8yz ?o9)_J7}W` Ij.,.SYyQ׀f+a]> ۯE @-L=U__ 8Hl.g>w.*7UkA!#̜mK3g ^)&}{ @7Ho8tmT C:! ͒@+ app|)x&|,0C*ж̠Fw_k*-SNoq@QҲϑ-8w`oDa4%O&-0*4zHrsP ~f_M52,&ʳ'pI/c+pjM9[ﯾNGٚ_>/'H'>xJޅ[{ǎJiPQ/nizȧDZ'G<1nE?`W0<YÖOOSܵ&n+>ҹhc-Oj/.-oT+ tN7𭭎BHEZMgA{p ~i'(Vh_F CV Vְ \|*Hv8YjdR 3yj 0}Ѭlf$|:kUQ)9fux('X缫fWtx& =+^ pz][k5aCd?Sw:МNOj+&cF3V.i5i1f&$8֡qp^NLaM4p#`dds|}U"u*t2BQϨmHPVS8lZnmYB~v[3/Tb@YÆaXG3;L#et`*:Cӣ|G*=NуQL/d(TûW9E;%;yq M#y>q=))kռ_}8HBBn!zPuXSIBx.PmZ*TW}F본pLVC ׾v'?N4jg]$@<ɪZ }.ť:FTYۡ˲ $ 2\{tk|(2nK&.:2d&;@ bG,qVT'{ Si@ QUDe# XtCeT@ :c.RŘdx GÈti4{.ƉLZ]%5GV˫_HIWI]uԪZAغKuBpVd+b2Gpn%S*GQHjyڴ:X|}- µ kz?F'ݬRa9 O&,b!,~,Óچ}s.? {;bFG`VUaR۸ S]H2 Oh1] 󙱊c7;pYBU9eBԁy伱oIlz/{4I^y;HSX8tVWqTƺL CǤ,Iԁz XO̕_GQc@wK,׍~|ф4T$X4l(yO }z*SAUEdO>ARm G<eӻA324J3%ўU~uE\Bu@F$D<* ) xH_lp8 ҔXW% U/ٓ&g$Ci9 4Z=LDHOzSi4$r0i"Itw%F[⸛^`7 !>?rojWIzK%7'3#6֨H a'L_.&N{+(?6-0Fr*F4y֍#m䔠{:B3ㆤ& QT3(^ A5lSn='א.eD&|ݫ l^aa&^or]7GLw:2!'7O47xZ 3~#UEw<'?Tڶ8oW8mZnr|M? U\!yU n5sk^Yd^7HS욂:"jzGC[N_m^E^n@$c;;m8bn&2ҕ9D !ZM ͵8+9"H,gWLsfr K2K 5/&0ܴmE5m҄dqrihZ3@dSߵCk[P?I*nތ@Kt F| B]+=)p;SG׸*;B9k m%g@6gbܨu.t0-_v 1$Ȕo+vT SQ| X%?7+ nm{eat$U;Sٍ$ȸ:S/,<nxKp~(rqelgD&REaډA48['iK;%v<S::m ;k'LǦgI10=sˌr<؈{|oY9b9teH{7oy9ae.u8׉DZP)P$>gEDt~LAyHpF/F.#Ǟ cfeTx^xK@櫧Zbur MZ㥷'؎12}"~X6m\^J޳U[ ;klyЊJT2XLj{/Z1f|?hhxs ,(g X`0M |++r !x|Jކ3afo&1kp GҬΉG?EzW_Q=kQK aD{Sz XN (' Ӯn[)/IF[uƮn<+ZSuUmtXjda1ۡ4LbqUↄ0i>s4@43܉=*lP@J A>M//i[? :lNE"e">'Nf@04]dt9Qyː|]['P-i5e/2zȷCq|k3O!^eUfi5|B>h~^UFƪ%QCnX.-0[ mb9rb]WĄ??FX;UUCԝC/ٔN㠯={d  o)e=6)zssAt&ҳC]'bGu"ڌ9cާoơ[ Y[CvGdˆp@GrWYQQe*J}iA;qFhy:[) wo4Y1^  f}Bg6FC$`(Sk@Hw9oPժCũ~ΖD0dF3x hMQlpu˙ty{^.XGfx!qC6p3S;V{q숈W(< o:3D{FDӴxt2 2f-һA0 ̂9]UrLDu2_2mfm)[e-+b|% L+l1tsvn$^|eRF ' 1L![,,Hjj?E9T](7aŏrL'f߷Ϣ(&ruP>UHlN(T ^'0@L~{B)%I=2g~As)ZԦqA!Ij;`fj(jlH[z:sOeC8j nqk|6]?C3{m C:Òj.,9jMӒKK{N[_iGG"%;sTY_1`1}Υ:92-&1d9r [ҝ7 [؊K`a+ %P⹪Bغkw'.>񙣯 `@_NZt>K̳ dbRGFyZ'%"bvtg"[,/ lLWtRH:r۝!Ig@$ql\FZdj4O.{ c1a1- jGeLvV]H OYA_^K9#h.H;hc0u%%cg/V/p~y qiG]A(oCr7ѧ0Ҽak:ޜldFIΚ7+}{=wK6Shˈ)?:.xgܛӜmaN%"32)vv}?G^B {h`+$ /ޣȣW2D>xan=gqi=V\!d:; AKr)@6s=`R.Whuy6G^5@naZ:Y{l!upv 1V{~dӒ#g+E}oOT ^HW?) ,"Q85 [+Q &K‹.U B) {mH0~4& b@_ڏc&5d?9ˢګreVq$WWvWʓSC܍¡u>n5D[xzx} ^4x.d%>pLLdZ?)բ(ͺ99+Fm@5ITmNft R=@Na*ڿ|hIH)^ FH/ Ygû4GZ!E[jcdQr} E]>?#z+ygW9ɘY@F'3ӘN~Rt/ < (6etR< Ԡ˩ of`4S a韍=D9Y[$SXEsV.,d(Jjӎ=\Wu"z<:7 R5]mH0Bsמ~|Ss=f.ml`z l͇W 7g| D թ YwB!˭-f Mz2:&2%pbN~r9 y=W*q.ɱ}#6bӤ3 Q(5j+wZs?IxTOxzXIm iR'{2bަٗ4۷E;@ڶGLjeuf)):龺e qzHFhmY% %D7׌DeMWmjM,5m-)wfɄ֊Hܚ7}pzHǼ~r# pU)=[=h逎hI-gIϝ 0[;T9w6ĽU!lRgpz/.[q F1s}D1&~I0/RdwiϮXy)]y{ ~Ƕ yЂ~8>9b_gB{Wz1QߘO׆J^2o\0W>}uGK] gOqڔ@Q;e,.%+HM<$C. !):a K31>Y%Qr!灉dʷpNh^iC}0 <)zmaS{mc܂.1OvGXmҭN$EtWҨ@ Qj/pN?_;}pLVŽFtX6IU'8I<-M2tDxas`>7NjOs|?{, XbO٭!ښ>Z77AŔgں_4mji1ƞp:S*e&QGH\uB']<-c2H8 t -_(OsRLEW}g]L[r$~.1Ģ,M$j; 齎q鞩!'t=`Nx$2pȚF(Na4>qD^ 5\x!{A$̻>;i`=e";*x4ݠ$a|A9|:̰^617DΠ:(l0-8VZ" ={0+-ψ)PAp%/]=2u8=KMydYJ{k_T3Q{޴9}f oَ%x/-jN V F:F e.uW$Xa:KqElBZ(!B[ZU7ѓ,0%lg)@DQl]q:T99چqb RuÍ6xgJ66HH~~xTEK ny3 0)|wkե& :d`E@7`e2'Y`\V㘬eAv28m?ddd?GEEu_S;J wJ$W \I/ sI=@n!CHX=N^V&Ak\>9"*x|\e|66]^-zhrcnZ'4]S#OɆ7VMTڇ;УMИڊD d".Aƭy.9fև.P lAu񄴏|eXEiL]/HY puwR<ҝT}]115zm;{>Z itBc9<⛷6=Pcj}Fr \2/pc 0cOMTb ;+E)GR_(YlIY%\'Q?i`ѕp0$qkkkx"+=+p#ZsKa[ ={T˩'S}oi}T%^W/&9 I"x3;i0~Z,N/1aym%̱x`SU|\v p6Uo$DPSt|^AnA.8HS̨!N`lWB!Y C5N@r»,j1@d&A c٦8mzIېe~"bMqܔD7GܘهԞO?T7)~r {Uc;antu#6kl?=_>m(3RpJҳV%^( PO74JgP;: Hby*Ō.9i%.q @ Xܑ"OO vҳ!ZI"cC$52>VUtܮ2RhNO_O 5zEW#+[`kO dqz) .?%{N- 25u|R!=s? aMI.} 6 R^wP][5 ;J]kZt[|$7nm $M nV)C")*ke ?,ٽg4E5:S}:I𖏆YNpk-oG?_ l "`$Ϭ9?y3z7_AHJ5opT*E8Q!d4X&|j$cȝ;r$ Yly zfs#;"ſ-J5&xliTb-EΠ1K:+#CP&;<8Y(yTM7\85e2$lro&o : KOOWcq XS"=6{MQQ8KF)2Ssᶩ{LQȣ,st6 FdRsWY;rm+h@:~z0#=.0qAu|YTPIܙoI4!S[NY[nWU%28\CϠ]Jgf[r-ϖ(:AM}B|!W`˃19 \3_84t9 ~0dϴUCq\8S!]_G!x9ļ&I+4px_5 ݵ_Iݐ>ߑA[\I5/9ɮK5]\!;8 9C 8"؊Q'ىj䬠q><>'4+InA eHzƀőqHZfKJ^׻1sXpc3x3m>a_MPK@Rl*ԣ~Un4>.0 R.U$ܲ6 dd@ VَW3`>/hr;o2;'Z2u z0qzZbe Y]uXh>pȁӬ'™"ؒ7ޗN5q؈c_X?g֛ߪ6/$]8E`z*C!Im:$2slZC$-x1$d Qq[kklϹa/ 1!-nM/AŤ՚c( ՚1iӷ=DV}.~/6CLF zߓ\ZS)e8ʚ9Jw{QvUeF-`!M!%$!Ga됈‬ v /-8ZĞsjz"P$1q Jib;ϓ?JWٸbQPuZ2q3G:|\@L)@~]%)ByK8*awG? ,3Z(9V)?0tSMD"S@73RjTlA_\Qi]Γ"X}78Ourt7THL62&oqҚc6)! * 4$+1sS*ABp:s3^.TRy:~!qalqTPN!QMplQY𙄯5bY7ԟ^Fj :+.4)L]c#PP 8*ػF0?J@n٭s6Mgq:Y!09\ DF\PZ(` 2HIa|gZk }iVԛkTR?GPTʶ8 D~U̚mZˌBwxJ Q*޼FXU K(z.spap"ucˀ`|lfs1ԋ|EgKS)N)nU`zFT: ҸHnE}I,SC6yMA 2֊4TkfVu#2_|@~耿_䆠ПF> 5kдR)nj+G~. /Tf2EU* eV.,LvG/I'c_rg=ZSYj{ka![oR pM.t`>Jٮ`st6ih)o[$&*V~h*q2BIm AA0Ñy݀G=Ϻ(k=oN/\ .>Kah뻝2c1([f HW[;HUs_O/yLpB^˛B<;UHX2e(ѕy6 ] բ˦S;iWw^k§qœi6hQ 5頢$6r^2K^ / %é@Q{F)b6)1&rg[^/;@Sǩ18.UԹ_UK<_*2X@ dX;lY}D&O.pb-Tq+DdF_fk—yj=_<$ kD!A~O':XxG0ټI56A}MHgsy$>N]K>Ȑ%x/X2mrvz%|H*K;ぉ4~<=%nLzx}{)Zum:#­9P -~PFd`d8~w%uȑj4W~G:9+eŃ'5@\Funo$!>u7j.CϸvmK֒ES5O647K G[TR  MN='6"U_#[ AȷB (3;Դ7c _6{ mړ_u$]8fpdx-rֻd㈙h]Ǎ{~X˟PRj#e&}|0.p r0BFdB]d &l(Iw|z̥ r̐[MOm27[xiHFg̴hC"c*OLpi 9;;*-[|tGٻ7&r>C۶,mum}nUS[H]>*[By->%'ALf^ǖi[6jИSF&#"k{'^يɾJyF[xs@C4ViO/[9R] vQҞM4G!_Xg䈇F;-wćb@bS9\4k\KTm+=u4((Gwx@mE)u)IR'Wff7pxXgVphDgg0Q"@45wD[y$)v׸.C۫WJM= a!84i``~ZyѲzq&K-3{+ip>&"ҔA_/*HL\/qF۫#akEGy gxR>,8אмPdJit=VoζPEtfhS]h\ZSsk`ixE@kMxgʑؖR pXUrw$%^>}̜=11OBsMըFJ_[)~?6ؿ5WHR8w)-pa62n] =?%8tҙJ|bf ]QwW#W*&aBx6:.!Y %?t5 tݯrScvCs/*ZF=nʈHdhqm:$ށyp&ަ~O;{('1RHݐ֕skE*Ad^Z&7z;FM.'D^tG%xqؠA,}m^T/pJH>gR)zqCLe6'@5sj[…"/ !k+ZPݻu@M`+o&Rs-O9<;ɂ&#.*yi>t㣆2tx4k2J95KJOh+d4 գwo4HP}f3AرxL?gB}Ɯ(&ELῺ,5xfZ"+G~ Q*#b $3;$3ӝ#IJw > E𳷺?Mday6(c?OIp`~\ %@_E>?oV_Azڜ6]j'~],!uL {ӱȦB26)q!cTÁIԿ9xN ֨G4cVXY]M)bO|BB֥ពn\bԭwDjyl;4*rth-Q~`vX BՅlxMׅ˚XcYQas<7\U-lxf0 wlS7pЄ ϬGKS_dL0m3&o$!|^l1^;[PϗK}aу@|3j_&YEǽ띤4w@> ΢H B%od|`r[Ss}%8Mc>. }wy9L["A g͢CV80_bh9PV6K$@*~(^T;7 ~ nDF?-vs) bx9Cx\O &zd@O":2\QDq fޗYHgӝ ~jbvBO\"v?wDlbFpb7M}Tq!ǽn c.4s4xʡ K Nb1Lq9'^.no_="gj9J+:_zzN͝HpC*WqXmɻ2 lHD5%;A?+IzמOV<7+YCwe~oCKGDpǾ@eF#k [`ڀR)5[AҔp΁J,v2Z>AdU1m Z"ZOK= xS)ڄW* sǜZ".t3U#ḐSOITI+ƒ{$ `J8l;"spiP*'T Zl[]C*7E+a>QFn7O1v[Tp;}LQB5. ƐTЁfxsm?$>W ċ^yr.;K[qiw-;T';.`M<9ЪytN]߄ ɨK ]Aqeq} kZ|p;)4!, ԻۢR `:q^B)S\\[ƙN~RrDJNEάHX- L-05& (]R+B-˰2L-d6L:AaOI~eHZ§OVW-CS?d,T[jHթ9mvkct o}V>v?u C9zp΢9]RzR֠%)S)wQsgl s"Mz6II:r")ni%{rc%ܑ9J8N9(./W1NuUz` #|*Q)#*>/38-R`JeOBkf hS`2uja,`j}*9`J+0E Fo:`'޵Y /Jg@p1b۷r9ꬴv˰|e[ AI,JS@PNkCB>]e,1YIIa1F}hEϫ 4z] 0@ڗ1/0}Y$נuuI 0f(kbÿ{_&~a vLੳv9'kr)qS,0J K/x" |ii_4 pq|Kǃ߼ ٖ:۞cy;iou1ҿoJBG`P$lIq 5 X/k䘸%wK qG^DOsE So1y#mX'Z?S_Ƈ6Qyd2J(1,R7f愧Wc\J!&0ܥByi)yhFW>,,17!@a`o&T@@kQP9S (Ar u aikZ3==乽\I{QqnF.<WcEFK[q߻_j.l / m;tVaMKg.Ѵn $i7D[?ko{Fp$c3]oH[,C`U9'P@%=Şa!1Gun]ZtXY$)G.oD=5"~=E}vRu nB7ڑ3L3V)uiV)lFc#$E]RTݕzQ믢n%b oю޵-ѩ|Rw5gk:$6+Qx(nφ8F8ybG#o-r3Z7C]BKFg0mE%޲CX؛=8]q v!aCJAoug GD>dj>뫪ЊM8J{i$[EU.*XUb76#͏UlHMX2TK4f{vd/XcnR'+hL_u9Yt1tyzZEyNjm/)UWf;`S~GqXJ_E 6ec'8 t|o^*cf/WPq&/+`OIDoJ"nq=Ed$R%0!|8CkWP G^ކ*g3#xe3rqeJWZw̩:!ʥ;=ɲdV+8:kʶ2{cV,%fپ H 5p8MGWW^N뎯sat˷LJ/vH}IJp Ʋ$:t'ĬFΒzi(b#g}YYBAC],?C=\&F^'A+ 5=hk9e8eS~zjEspl Ϯ)qMn-wOJ>: a>T~#4DFԽa9;E`-GY0"k5dj9!ɯ.No3BW92Xrb?"E?0#,D= E%}c7JsY3W8mApq;~Pʢ џl @On0> HN'| N7Kʂw3\5 QW+2xk>)9 wCo:ԓeO~DG\M@ ̀BJgPo?~ېy-Ԩ!|;zL]tKJ]d@Fޖƫg;M;/H!vdwep?MRal&u: q>⯯O?WCmq^e'iv5l,e(hp=Q,X+'sBkEȗp΂ 4c*aG~Ll|Xw“wgzj|zp:.u/9PL'4_!ׯR˥0q v3%(#Ne11ud=6uxNGPhd$~+usRrwn.Hm q -"RC`=$bU},ZZz#={4'4T\mVZ@/>V؉Ǯ(d'fjK +7ޮĺL/ѴuMňzhEGT3D7o9hX}ǥi#8@ XMD.; xVԋ87Y9a ;uJ;3D$?;+w1_K>9sY5(i-D,ʚ|^?宊m,NE݈ȅSܤE.0۫s{һnʥi;!GMFJv 9SD᫄HoIvyq9;[6g|W5W*Ɏs"<|Ԭxǒ UiIZ(V5*h8G̙Fw.F,򟈰vZ̟F(i:5fCb`˱ mal/WtJ Ԥ4EUGx{Q&JdkjsgM.]@pqj [iDsR~кMb?0}kdBnjV-vhz( %N }qnfjœGõol<ܾ3?V7A*t(rW#D>n 5 %qDE/]Z¿Mʁ¥~Vܭţc {yn?KBSyIՙr@x3ELˈsj 4JZU-.wԩ/Su@ IhAsr)wͯb}{EݻThMbD]p/3qL X2?bUp`wK0L;!ܗue-Qp#UWitCX$j_nAV|QNS9R)wX6h'we"Rym>'<&;ɵ_Lԋbp?^5pDUc=S% D8zGǚL;EZ >Cfɴ`043ڐ }J5zG3J6[hu"-%_P@xc9c$ª$3<ϚPۘghͣyFoNMɍ݂!rjAZ55ҵGugֹoB޳+piE`B;iA&u6_أtFJ$Z^o'Ξu{~5?SUo+Ց^=N6rY0'nm3.$S/9j-ek<7̘8Z7 &b|nހpS`X!Lf0y=<ڒZh:HgUpNTsgn< S$OdJ} WjÝ&;Hl&LrT@w.i[9gwPcZ"QYaW} /plм AaeW^?k>g6s@'vp6+ЎAXɹ.ZKD{}~yr|6sSTҮ^q9-f5W-coUZK vV^^@_"j N>Moɒ ON\ҫ?(Z.Bc`QIՁyYy܎ %'ЋԸlM1\9W6BM)|lؔ`ycMUef:~>C{n1X~Ж]o|=V%-92P+Ө-Ι\$f?+JٹRVJa$s"M {H"ZuF}O8 Nt~41a 6QA3!Bpi8_G-M:$X֙66BP3U4z:nl:ݓnF^J2愺h';o#]Wn5bshI]&'X,QBs1.NAykPWV7UR%А)ӗ΁A7(K'4}?~,%Z[n[nZM41.X;A^3׳/MΜur4h5*Tm«pnLaǩ;@ٔʋY-#NIOa`2~e/bZ‘Olbҝ$ivq9 нO5T%Xe6;| Lg(5'xI08 *ūlvә C]!QšX CKǪƦp˱S邫hRE6NhZ~ +aP1C@ w׽xPCOQsAW}:A2f3]RH>x fH|RajENFK&Tय2|it9iv'Kَǻ&S DxVךdM1)D4"1,g5 ÌяdtI*K䟮SqQs A;þt98IBڅ$(Л<)ɕ\ ,$xj!ixUnVBJO3b(tSԑל#egZK^i&pWjTCgzI (O3J6P0k13S#{B)Ux {5}?$^TӃQ^w7 vH0^}ib6*:O~'Ff0\qa@}1C?jV!>>򦆩W b+þ$tD@{ V Z2G^ί` NuG+63D#: &$KI@~&$s>'Ge$ھ1\~aHd2b0r6nD)u>6Պ}mV@䈃^hF{_3\Y"J/.7$b6@_} 7d%Tf+>mdE8@_I ֔ •`imǦ3!4-Z؝V1;e'v%y<%y hg4aw9޴Xh+ ]6ޯs *iÒ[+^3'Xru悟 }">ϰyhcL>I]?PH`+&Y.g js%uab*Q〣.\ϚmPX1YVЬa]*]coj*n!c?$zה9E%70"!L.x F S&+֨"vP vc; A) "mC. Z#p>1/]A6+Eʦ>ؿ L?$? QSoYֺ7Cn+|oKH^Iqתk~=sP'@|050ɅefI-ucIó{Z8{oSxvV]7S'6滊uO!}OYF}T|\ "2x: /Gx'/7H( #my%&R3\qa{-48c[iy5hFfrG%$ۖtf|b@ lgW >YmPGOYbWz޲hy0zI݈G"rJN^2 g`J )5Ğݾ'-fBASmxS p=|5"-JK{Ώl'AcO2Cވˇq[XB=ClCnyGbk3來C_q qnU*hd[`\bq!!\#rXF=`8A!vSR/uu)թL@lNK)O X`w^GƦ3(}{Z*[o:$.4A}* v+wEA N+$bYp&o;$a;-&Ih#Tj]x+$,>.\|Qª, o. yaƘa&9otS]eEa 0cIyh7(UTxzhd?!&u?瞾pQ쐷Jŀ0tz$+YwlA</〜 Z-:5=|** gʦ2CLE\&S)8N-H W+S1`եLJƟpS%8Q}ֈcl\6bef|Wl%lX&*KI{njERbpܲ@lObjbw|kmhz֜w鯈knA ?Ktbd4ܔUkƣ"5ʼn*ڹh6B%*źv-'y?.\ܣ6ߊ;&ڟ>'*]),jomutk d IuCs|2 D1 _.S&\=H7Bڨt*Q+{ќOo>H\}o?pBEzl/r!sr:Rdy{P~kdsLY -߀FGx5ۚ 0- WX+xy9%GMؾ)V+NEcU:կ<}6BWQeEgdz+jm @e[֚zYANܔ/[h78!Y)M8:3zD[EQ5tmUId͝LQn@ߟ$)CFHxR3<ꏲI '-3b}6RJ/&9'gSDcϩCR# &{koA2MSr1w@ɝI495ڋWpi{IKrI(4 >~`G&vv| j@u44Z9滋%`R`;"b Q,uԚ5Sᖡӕ dA p#{KgeJҕD`,A}cJ8-4Lw>a4UAq,-Ϧ=ׅeZ/g Ҙ$m *sò/ۧ#\!t` YȈjK*{kS<)j۲@RҨ<"D5` Tq,[7Ӭ[YŏI;A}4zq8h_ ,=annDO}4F|qR0{ ?Preli\|H9sA$d5RF<3̨g7gQN,(HTui|wp9Q4\Va~s0Pa؀\3}\KRѧU~ڭ ?npr*XkcUNiQ?kws}:Tn*ԉ <65q 7Lh? &IBOVpuz-a68\vN#{:t4;[` Ȋ֨!EgDͻ7__>2Tɘdm̱=Z~S^֢w-AdJd^@1*ؘ_A,.Hg㫂:nrŵ^ETBUPlEnsf|ajtK"̋fhXD:\E|k-g6m emʼ;^/%ы4 %i_ٯw/[PIfv]e 5R`PgӓQ]g^>%99v>ẇ߱V6XZJ?!C%~<"^pA ׷R9EVdjښfx=+ԶLRًeݮ %5m"tjd>H̠r 9vDZ b 9|mj>ɓB_E9L Q~3& pQIMfF}"nHv"'ϲO\ .(Hyo5oU×:n̋^.S"^4/klU؄Cig{< #/}alƂm\ e4U/SN͝ r}>FBڦkށK^|e̝d%_ 7DTovJbʃM&l` _c|-eHoeZ uWZ?;yq,Ak4ߌZ_F]c {sKMKw]bRmuLG OG7p1tg;2SQZ4M)7 R+ޙi[f;d45 Ze`=(^Ǟ#=LzER=] O}r2MAaUMDۊGةMvif6.#ö*HW{{V!qW+e[Ę)[]!d4jQss= G띄0V3 B) &;9>!hiuy}jH5A6 B| go0c]E7V)/.[mO/$˖(F}0 0$2uJAk,EwZTiU1 &QUJXE7!Qw_a>iExhтSux#M䟂9g3tuT|,(پVt=wWȝ) TPg3"Vl5e?cxVm3`b%}N*l+75hh{t??ɏu@"LQ}< 'Z[ 8X4ua=A\~( ) XSAIjKm( 1;)hNF1N A=ehǂv5G!Nf]WwSM 3M BSxFMlrPrC*tz N6I@Њ4t$/+bf 9cct"݄:E£$/4"|ޮ0z?(ԎiߏE-+ 7V{*^L|{}s7R}/+tFY5 @N,S$X;'[A(`nU~-9i Յu16w!vL7)TL O5,7@ =pqq_I 7 W٫id/(lfY{sr1 p針h?،G55!#PHEҲ~Sh K'h("8yŬXw#(PB}.԰<7;=)JK;pWT4?1ͼg,X8>S%'Z|b*URk@*\n@oM^9'Iύs_%G˦b' B~BjIzOmڒn +Yiyj,ߕ (B/sDn6V (K@d(`c$xe[=Z}?|jx9daO׹ 六 2BǃF<8||"5cvI)ROiP 8KEЅrB+Sb_gĄ.&T(;3voeM&3 w*Fe~D7?!o\N۸F'e#HT7, D4+w͜:GB Y 2+Bn5%c`c Vˬ_)=ud3Dv6$ONKZj⍯v $xͫ>kϒKGۓV^qKrtzvV--,s\9%>)Їf q` %#D . y:.˔I*/Q! glef*d{9t KjX"!Au150RCzff6c%bV ɿtUa4ԞCSN뗹R7+!\v;TN$;lde粖.h9ZK"5WR.]DtO)Ƚ]h S֮|2C[OҪ#KK`I;\95Z!62@pHըy箪q2?(cU k:ݫx`^z mԿEvja֊}7h3\O9/TU9ĒLujkzbީE ;>T3׮L%sl'0˖CU޸қb5!P=AEgS UcTij*r:çA.<ݜn ?o 0;ξsqmfĂoCIw=bo3pw (uD#)Wr;O vRchא8kNC6@\o˲kMrϴ"? _?U]m0cv.+Gl99J1pnmb_Fɂ.z!HX .w?j:(wƥQE pxYS0?ق5?j\~{dm6?4ンLZi13ĴQl[zf.rl> 춺9 SHƸJϿ`ne}NzFth؏ӚMxWj2oXtqgϙ>a>Ӿq vvQ !, f줚65Ex !IbBٚҳç5x%4• @EMIIlK[Ss*n9 =^l{+vЩT9 ^ N0(ll%u \/A\h]fLE.ɒf\M`A So]]sA;Q@ˌ?&1/^aV @ Є*lOhwzj}c"ct,y'֓TLk R2W%H橣WmKzwLD6^JbqS(t Nm鵸00(?TFuW<4#iaIA63,)ӟwߋV 5[Yͻ_~!&L񝦞з PfϠ~M)\e%oL> ɧRYsuJƨJ]31ܤD8x4rmI|ubK:fN_JVa3ѷ3[:ڿr8PM#ăJ : 4N^N / DĈp.DOZ"kS*Emig,NIn2t%C^V-3+Boe0ۦE]1ICJJks$jr`Cr 9{zZ^Z)KhC%q+TC/ TRͅ͏4L +/i]5XYX 䵗>,ҏ\NzM)2w4L ӍP h5b))5p]=FP0X &A*]Y_uE|4UKmi0%ңl|JG/&_YâE+a13bF-Ņ/wB̃p4h5F襒5j)*Ԭ}9mt9 LГoxڨ͌/*קQ9p.GX.W|r[(=Q#C-bI]$DN)OTcU8y^1֗Z\DuxwG-R !y],e!ZXOo&niz rr&bbX-#P/?n3X AB M[i0ɯ%y$)0>`u|L_i/1QU Ŕ:7Jo&O߭Ku L&kL Rro^$ -i,֊ cRBэ]N qmvͧF/ Ia-, xRŘÛZ#P{/B10*ąۙ4>iڪ\BeB9,׆|f&9`bd'X ! ~Co@QԜެ"+] #~xMoO}.^Z,>AS%##ٯVm+*oҭ.g/6pvVJŗl槅P[IkMUk?#GjEֹ<YhZծ P9DīHP%KīD@}t8Ac pF?) V͗-ҳ"/1;O2r'&Q9V?&w31JUޱ^ܚcpζ4 yl;iگeð8h?ڟMCL(بŬx%;sC>R2M g]ЉU*mBu7V O\h AZfaq=ufEeqtT" Jw~F1QEеXWGfq%7;hqo>PR)c6&Ʉ펋@J buS )շDWcκ¯ޢ$nw:]G7KvD\p1KDzUp[}i>>zZZR-Oh1OƳؖ)F x$%h)b}Yіѝ/ӂs0IkuzK>+%jnS&!,3~WEVtnsΥZR+0~‡aVx>ٶn~-Qe hs|$|QּFeI|ʢa\SE<|dBXo;%;]vFFLMD= jd8mϔG{bm .I2̫CW]5 A=opݚ/ԌV*T6 ^h5p$&dIX<{<>Xݣ.%\Q4=~rai}άFi`suo|:^IuC U\<W3 סq["No2_rqɲ?|+r5mrt;Il$,|;`=[+ ]jꬆVزyW$?Zn2?[aLӋc`K/qumV= 6?ɘ춭1ǡRաȅ \rthLОc5R&dlX?Y#Q7|jE;ԇ~'߻ЃHH+gqYݠ##+z4DZ,~Kb9tRνV!DdE@B`|BAJl@12Ő S,SDl<`CI>+bC Kě*j <$=F^ %~7#GR){_@ua=;~]8㋶{[hIlz챠/̃E)( oSxO>o}įkS4`f\;\y.ë6g~?syYRB' n!Q *M -_Q/PO$j_$q{$V_kWQ?>~F)D)d N:koK::FvDÔuctqކO$tRd,#`-8y޵S _ʬ І$KvЖ역<>l1(38xg#^6&A&g#M1ѸP*^AF ( )Ujrf\MIm$PE= }:k^sUN8Yӫ%%^ WiDDpN˹Yw/B1Tt6`H)4hP xǮ6k\P^ɋZ !77Ur LF[Բ)0~TA Kb'NC2"9A :x&Oi]6{KGu9U(t2$c4{"I؍pDZ^M2[z"G¹R#>wxVͯw8CjRG%N uIQ?cNh<$q`mOOSy*`Q 6 ԊՏ2UahHyǤd)u,U4G$I &mluPi l!L}--B%覮_8e2_.G0Z~>o\/"dKe wYg@NVGdL E-%Ь*Bs-c ԙJvNO&Eq75#@LGOY§zW>%%zL}$Y'cbP 8ӹ#+jC =Wym.4?"3 uv:ie C7+W1`bCLꝀ+;0 ,*vS^ k&^6%&N#5Tjrqը~aS Y3yd(V#[ #t04MSFa`̶#: .޻Z~:S3gC's_ ~I TJNm\1BNB.Ovi^sccv1äV5va$ C-]> 6D> |a.)!sp#9 [C;W-c:䦵 ޅR6ُF^ |3VEאlg6#n&iC`poI_8y6a3\fh&;zH=WX,XILiDWXfo㬇|?#}91;\5a ,0Ctb x`a+pbM'G|1} 죽oIVvZˢHbyunvd%hZx E*匞 C])J{罪&Y}W{bvk# 8 C2!K}ST Rmf o։HW2}m70( ??qTeap26pS_Uq3 ,R1=ǜ/ N{JASw"4Zdr2V>dg]6ޛO9q{V+с&D,3zu{u6AhףugViخaF٩sLF%O50mC_>ԉ(5"Wz\,dU/ La`80yaޱl&^9e-?Bb~D: U!DE!(d쨠$ R)(a(@$N#,C0zOc Aj\㹛xJNghc1 TsJo:fXȔ9ɖэ6AРMW_+V,kĉ99qՍTžpŒ,uZڪw;Z)(\YGWb4jդz~n-Nh7\Tu}EnGHybB-6?F&\+y7!M.B󓎒brN~*dV7nDpHxUl=_D,& ; I*`=q^?- ۇ >t=, I1fK5@ juUȇqW.L^Ҥ3}IȺBEßvЦvܔr.ŴGZ>LXE;h8dk}7@嬻rA % 9vX֤[3ƿO 7qz^Dr6\{4g"VS;)} <$#P), Gu) PޤHXd |a"0Wj9xڶB{8x;P$*o`F66V:U,A f>@3zXU4 Z Ude#C7ܿէzR2t5{&pq^lbhfU߉W;=bu b OMR>ǂB4P%}8αk"6?ַ~|/gۼkm]|mmH\9i Ha tjdMS`ՁCVjU*M OK' uwjhB>!_)p+1GNMDoϪ^6+FĀ 6;{OTɖ9݋~(ABx(ߘF>ܧUp_?dfl wmfHK٨ģ2rr_K~(%ԁkSFÚviksp/Re4ʀ .+Z0%R*)<֛(RApCUWYWOZ$3(0JiO8g}cb%oś~h!B~a]4k:LzE!P_Ip͢r$%f|-ɌG[xsV';l.@_ϬAFX#:04-aoFߏ^C{QAB. p;)ԌMє1(} &/`j:mbI}4&79z4dG4"꠬!N[8|!2/KlVheFˍB- ཰n.| 29I D`ٽ&袝wFstuJzvPmC=轷=f*[SbCkvs d~zc{dkNcsp3dɬWh@ غ(wԩ6 `|ܴ]Z g0#>-$z+*;NW[ E<ob)6\fϜBfC]jR?hvyzu^)KBzߡ{t' f:˩gDgCyEDfX֍(!/W,wXEY͘8hd-Bkx%DOuWaXb$ pg'$r~7ZX)ٞ&|_,k.g j3fX&N^#N+@OO} dqdh9=Z վ0LHʽZ=)Z@.OA!r({vjY|ů'DQ%0bF*|ɟR(} 6Ų$Ꮟ7I)CmFϬ$0h?9%+ff;ɘkGKpZK@Uvki/0A+ 7 U ӞPDS еf9o2Kt,WP(1s[[vHܮ Kb+ry߲"v9qr_ڣgQPUª$EeM3 ݅wrnП(V%cvqqW`Ѩ}︓\pI)ij* DcUn,M0߃ On>8$؟WP| : [<;$ k|Q JxAq $B`=_j0ca9kQ_{ đk_?aTx_Gt'PDfIٴL\"f8eHׂɠi9xPITԺMD3·qذ# D.fQ(OqE;^e#F%7ak»ΩuhXf1sY)qi'G?fm:._RW o?[Z꼖Ԑ^*CuKq5&&AD 7?]8]r*fk/0ĜFslM>^s - uGOxB;)jI G!B09Ζ*VwD+0TڬGbS wyD<5JXbr("-ija̯T.Q W̛H|xo?OAxBs$|0V{|-j#3M9<*pۃg>v17ϠF ip~"u;*F)!rO L?121G*@vv2IS 1BBsz gܭ?('jU;gKF}hi Ҫe:Bw #zG=&GgNmOb"=F7=uġn1?)D+φWbo Wj|?RڲKÌ;=_R*/T{INlӊc!_\R 6 ALSoc .]R[-4aZx~i{6l%O5԰-)ڞ*t0sR 1}nA'@)-v'5c-kf)_t}y9ClQ]кֻ]%b-Ub13ݤI-="Gط|mr~A 黗(8pqk =.޴ 0VSM- #]`|,QI^n:@@8*5rC- 築.n'1 bψxLG7ޫW; KV5d lU;^09 S@$u&<\-Am? q'XRi!ySHG7sK E7VK@ ,2_A=KIV--Y~&[O|b,* #^a6<\GN%B`Fͳ7"T. 4 ~E{d'`sc&.]eeh5 O4N #~:c4J+]`dEV|l!$|"b 2 !47y@,j9'O"// R%3`kE“]ࣁR9g)ϸrc,DcLj3T* LE8)QaTj 8eC(myZCEwn-.@dq?]7z M~%Av/WYH7#) ,A ې|1)FeѺDn5.^\ I0JNJ, cSr[KQ` ']ŝ%po 7ٵ]YOAnZzNMp!8}N-ڧ(٩IxB`zA]`f!Կ5.P/ QOU"m=VqMSb9ǴKDOo$;/_Zj?ZWÐv>RЉ;AN'n\]J*%_|& x٫[h/'ewn'/VBfhlƑvnY2wwj^!4* Zu.;j|vV訊 o-\s# ::͟Ƭ+~v(rF`5I1Ш\i?B&\gYq:dܾ [XS< ,u €QfI%ڔ J|ރ0ˣq-w{}Ʊ޸>! B?q7@HqN#df9޴uߴ}lSV^b^xf, %eP* .jMb[-+޴ΒtXcݗϲyy  5f`h.6:Eyc[8T :/XVkni9yO:>ӘDgL:VrԌD3 DN9z,%m'ljw"Q;R #B0fT }o-H:J:~Z (Prj ۺCn cXjM LԄOw+ LP(v2pNv ^~f'3;wJ5 ugD[US* }CVU5{@3\}. LND=y7xbw x'ϧm7F߁cR^.tKp,J_. ΩhqŃ NͤX6̌Zc4`Y!؊~:؊޹ ^ u;(Ld4S;XɆn23A9\lo8+B@sMGXEMa33,@D`Lmg a잕oNlu"OO(y9N"Lj%l^}η3[_a52Ty#R#_B6mf0]~L u/2ފ\[z,:t:lszuv>9njElraa!H)89]nѷeԁ4x[㗿wkVKcınWܢR tcZv"+M1?P@aH}>)-̜!vd#FKֵX$n}:~߱ w]}| O7ϬYw/wEBU/.7ME'Rf@{dE g} KƏj ݴ#3!p[~a~귏!LrtD"1/=[p["rx PpIÅјuf1˅RY'D븬'M"Pg*92wﬨ0YQѡ f}]Yم؉)|Bt|s` a}:WvEE0^E͒l^4s%g%v 5 &"bj1QvXVm5:L=gz3"mr^.yb ct ݅kx_IP.2z{PAaa;At)`6AI$BJ|ec U5L;)~0`эi`ۋF&E j!`~ X AvP4ޅ}k.L>j,G2˭'=γvV*˼"ģkM@\mc_>JzKN>^;srt5D߽k)QZIH/wL_S(> ;BjJ PbNx*''l3X$&A`M IJ:3zuZt:Ur[Oͼ2Xs^*TrZq.T\\^vsUc:QMLNnWJ*1v=>f)t v_ @e6i\Qb^| )`[$t;_ g_"~;6կ{ rA,=w) d=S-Y:2V{t}*k|O%r>mzBK ?K7^#8 ln1o0cu]$Q}!dŅVdÖ25-9g8x`Đy7T9;!k=^0Ed$ZFMB3.c֕ Uk֓st6zRz[erʘڬ†VQMTR]I&!? ¾ƕ GeϧH+:$5?vSUT~J u-Il}wu6 :<6\5TnAl7ȳ+)Jg|l ѵyZAtigG]F$ $ 7YMIVD>Q/yhMǘ<mBhTbbEh5:m(XxƇ!1*QɷҦoXS7cQ!pv-5]76n3S Z}A倛+/S޺u]jp$䌓Eew=N \PU|t]JMRo8ޔLZab& ZP=vlxYnѥ)ni}+`AW&.BiH3R({AN2p,-˾m8*=[Gm*\ Rփx t;'KB(D~*Ҁ vZ^GGXSvvn8^znԷڢef/Xs-* |V?&Pg)SQI4d3lXya[kmϬ.<|C 33{H݈ 8ݐM|?h&fL.DqqjhOFF >ζB[zlR?P򔐠Ѳ{Ͻ5ڇz%Ik-H "4^2d#KΩGXj2@}&5(^RЖ衤 эC'GW5ʕϦ1 paw5}CjŢ';Ò&U { Okt3# U]{_g 4 _XhT]w(i1 %఺+jL+k d૓tv{LGU}Pk&J8ےH5]-.͡t"F8B -o^TN2wmcq}hѝyůSNus߾g%9b`,\jףF9U԰\K5P9/AOi ?F:4o5<( <#)=uߺjC/b};ԟ`F)b(ϑdrq!sͽGp4{'b}_EBh^ԭ&wIZF"P_BX8 05:+t9s.36%,UlxBr7rkچ<'@8(Kl2TN6y(XaOHs7Jps (Pޜ-[ܜ^1sCߘ >AM8/=-,lt]jm1DB4͐X zcKfѧ\w"Web`yϫড়8]]?%ے]U3afq fĸܰm|\31 țpx,mFWG[Le" *U378BJLO<W]%D?o J3A,I}pKyveG).WP{=Bgg ]wAӴ G%Hvuknx /D8$@syэd(SvoOAF|t}P.Hs|EGѱّ˙&ڋ\bivE 8^T9Ow.{R!+n2B5}jǨ) A yf@(379Ti%yTT]/}{3ɧB1Okx}T6PRUyBl{ۇ4L֩\ɥ-nZ|ۃN*jNx"@_@] r4w=I.˟=|F, ه쁉F{go候:߇#lNu`ʃ;TRqxow?+ꇲH(1ʕGjqci{ekᡞ B7{yXp l'm?=s%" J[J^:FkyE͔3N֐Nhb L H4R2d9$q=]NX4 ") hI7R i.Q,G/.lN2sCkS|bUrÛ=a%.7bIl)}׽*]u_V$ BKPa I)` >Buʎ'~gdHZ̈́v 9 ͬ06^$Gz<:'KJ Tu/j A$ #]W_}4GGԩuj')E!I-6A${ꕫu?H E퐣Wl *6TK2l0Ҩ9,[uL<@l%ʣ?98 '؏AGb+݆Ꮬ:x1XZX)xqjdʇ>`h{Z8k?Q$.yI]Ή;&xMHbd}t.3ieB0Unc^]Lhh¬;[?`tޏc!kpQW[M:~%DB@Z@<@a @,?ɤ2qڼjՍ2hQ[PLDGk=b:y͠׳ 3ß4Rz 3`|xk6!O)o xZ'4[*ƅŁ"i8vn> `_KVQ22YsYXL6~|VLR+m>͈7S Q'ũ*m;]x l&uC! 4`+Ա͇PH;k3!dj5͈J7\i i2#5(rܾ7ƑUQ硌m-QV.t/+s}x4pHN"FZk )E]nD+Bj~W<]j۞1ʠy =v)'u %x`Ō3tzu*Vo]%x 9b}f Iw0]X~\C\g8ԒKq"؟uҕ' Im~=^q0Η-?A_5ZilZ+:g=K?r*F`p jԭMFΎVK+BPcSşljZr, ?*uI?wRhLjȞF10*gjnɁjn_c6/;d=}_ %xG%(QY \LSH]?@d 3ↈZd_3 NK= /\pzv!uş8ӎ35&Cm8iPͤ@0$U^kي]zJ/Q]wAZyq (5y:Nԅΰ|:`tFsf@Z=GK E#LVKu(Xƶ&9EUαJ8x ,gf@;QC`ۚ/pH1SPxHUP|7ssh^:!gAN_㟤0W1Ѹ`3Fo 4CCRT00 l2W~sMQʟw@p} y.ϡR77aDyxXW9#ZLq VAXr- CįD#Vz>I8 i*ZaVnN8RREð>?vXc_S>R?/7y4=Pތ1 abl缨Kby!+yI2$>\n$g[O:[g Ot@.~EbӋgcD浇yH*f9*=y >IP0+E{V8˙6Hh212B2׆U+Fx֛GR![|!: CwQl[.mĆS.pܴsStU߾= VG$ l8 8Oi 3}-6³&%Y*r.`9Shr£H(H$=Y=|~ˋ`Ff$N`.6 s9:eE'Øgͳ1|K_3flVg\X8ZFf."HԤ`fJ T&͞0s%lQNR xű[Dw8bꓭ(DIfvK#~SjʼnWzVcRqyM4k_b }ݔu]CD}kfH۾lP~M]@1~6h٫z\pN-NԖ`^.qQoL +<6./@qp}" o V_oJ5NQkV#e&i. :1mai)w1Ь&Z'x3!eP,Xqb>:zDmi"6؝[߸;)~nw1nc0"w+ _epͲBTP%m#刨dȍڨgHxZb͡ItE0kCjJ]F6R:޹W/B(o~*zs>w\nK 5u:kq8PaQ3//ēwZ߸,30F#W7B>tтNV{u4 qDjrRFJAҘ!֣Y" Xr drde׵ί|$Wڪӗ{{ᶋN(,?`8oe?C8d:};]-B3'Ĉ=ķ7]6ni%.dPQ~.S',c էQ_&Gm>vp8CFUa^y mH^E*]FϳY,\m}!I^X>60z $QNT괍j*EEfɔsE[bjuH97& W4;<]K9hHluB~Lo.>a>x#*;Oӯ%M)ZATAҟYy} . NJPn#3\C3Rԭ| {rV-i C xƊzx7sۧp.H*о]+hЗ( }>`$ ( htV,[%?7 btA|Zah)BKerHt/3 `"퐪[[q\`a6wIv%DbīԹ<Øg~J]Pꈐlq$_[.V DxU$DwPc" u*kL9-)r=!}qgnӄ[Izup1<rףB(g $D@tN{Eѫ5}\އd~J aZB/dY[7$0<0 hw^\Kۅ^bK.fʂH{@e%av5 O*Tx:NKe|y͕XjUQRR85cBPA?iW(V|)UwFs ЬzW*3?Wncyڽ \T'F\D*44_$ctj8ei_a+g"cu뵠R@ cM$C'̫nLFM hBr|>UIJ-p~Be8D؈] ƓmLM/r3, v7Nd7+-;+ U%k#KUn1a80n9 ڂ! B.g!;$Puv#t1Ztmњ޳PaKKvޢLDיkhe׮}QqtanxBq%֦,nO*WyztR[xMbr4tk| -sJ+2 N@,ˤJ- '}()ؕɛ$ F!;2cIwA$A4 &έR(E"P*n?6+gՃ Pd=d8\ #tF(z&%6Wt(;I2$TD|e+x%$3d-a3n΁glw@/sW;Cgl/\A8`AU0s`%9v77އߐu=>|?bحTṍXxr@tgaW18F~=5C(K=Im@*{;#nH ǵ0T@S k^YRZ j 0* |NA1,Tº1mi1pϠ9-%vd) %&*gkKR}EVB#4tH{]{JCw1>iYs5m d/1߸fe'Ǔ H'75]صaJl軬H?ff:FU ~Qw,1GC<>"4GŰo`ET߻Q8F@M}w <Ph;CyPҦV i>0A X#aP'F&J]NG( ̎0G+LB$[F UeqpZ^d7Seb[٘%d!i!iކuSt"^dN;/lyfK!tP=M}36pr=5j;WS9˪Ub0%ݽcvF2;v%ڊ^lXT*NҪ߼B S1.Lwb@1rne)tx ,m:w7p! 29Y}zQӴSsEU4gp0voμ݈(? ?Y2y|f}H7/QAICƓ6\+R@onU8. <Og &s/e J>yoײA%+j΀ -49E0 D°4i)SQGB>{9fN_Aft0i4_"$t;E5hbsBX.=&*d78o+gĢJg,fO'A\~QAWHDJ:JƧF+LMqP ug)yaϪC9f{[JK$emqYD'e*G {AC!zOQ?[T]xyDY;&<oܡK/[HK9ҽU4H^}4yLFED%_F;>VmrW-Jbs/RҀ\|,iIF.r +̜<~?VUtyվ;}n'bQl+;d'[{]r؝Z?Y[wvhRvD f^Q$ťɩ9upѼRPP\O/ QeTBq s6v׋6xI1k>z.* P,X9bvn lȘQzrp0Zzc.aCn5<:6qZAڤawLä cZ4q@wO}hC ɿ?#A@Ϻ8yEKh8 9)+v<c6 x%ui;2=NFB]Ges#cnV|e0guZkQ̧qMN]- gHmO,Q!B"F(7V6#A ?)c=/}&k}"%ayo0I>Imp9kUanoCY8 Eߡ1&`sL_OUĘӊ.Do!"UgJKܗtH:1iԴ8C6qʛEGԼHP3vy(i̽w ZGk^Yw%*u=hG|9}STUvglj^ WO2|$fNڲLղ;͋&MTu:$q҅堺\ْ5@@{Թޑ0z ;v ~m' [N!ssu3taZ4bHgXORĹqԽ_U gZ=b@To,5q&Ҍ,B&pPX RW w[0hJkS,i+ϔj ƽܪ<ʑ2 `]c5s&E^;;4]<I\UrNIؙN\c2cwpJPǫ*9t_}n|R,ͣ# 冥{%8?kO 0b3$W;6Fr;Z@s8TqMeLRt4EF$bv[9y+H_1'PL\0Q]2M(º^z[fD=T ܳ_^iO1+bmߥхQ@]ˈb+[E.REn[%B|2&8GEzMkÜbqޑKF)'`vb6Qwhs5`qEӮpɿ4@{ xVJC(#NjLdj^ݘ^?v CK VϻG䗗۠>5|Y_#IVRaK+gbs;Rk9qBr\ PvT(m7A2pjvUg&Z?0`DWY߰Zg _vMPٹeSN*)#.km]d'Ͱ?')E$ی7&G$6`eM[!d@&\ }l wxX:-c?P_v\١Qj^ \G?o€NB5]s* ڇۡ9 aOG_ \ڷ f{:Sީ:3&=+MEFU J.Xp^35.4G8Cl㕉W6h Y&Jc|筴/^+/n|Y VATr*ǵ87x_&r㑱0'-3 ^q`]D%D'ǢUd̬2ƙ,]3gayHf_d>=iqkHm%>9Bl-VJS9ѝIXu)$KB2!T{+QZdAtX]tc9c,IWz$i?nQ"H teÈyV;! ':i2Jrx¢[KMjf;|@y~UT$^j(F"72`u)=q,W'|Xu:㘃Œ҄ӀUC"Jpe>Ñ Z6M衇`(m)C{L.'7CʳmK|/$rKؙgGr2Q1ds6z<l*2X11ȵp~<%my2X -' Z|+Vk݄?'{#&W&)7CY wE b`pz! A~fMt(f/|M :+bfEKpw=ȶ)l7oO$4X(33a#vd&kH\vg}WُP|3ղVN^m}0y\IW GG A]1 X{NHjdp>xd$2_VdYt'`&$[GyrBMb1Q$ XI{ESeד/)~ح/|hYT&f-3[hTmEQXM?Z~~;s,}xKgԙYqJwě.O6OTՈ1*jx_A+r4s* 5w܈e49׮gCIҗܖg|P`ZJUCl6&$+#o[JK K0r3÷Ym]Xn $3 ?yu*4p Ϯ92_-EOQƁAYjK¬Uܒ+ qobk%J36KKR-ѝ3&Xl;+ Xct .pϧAMU?عb*]13H4!3QmJz i>gA5/̫CS%H`쫞*:\ڰnjpuL{$zffg@*wH{Jڼ%90!rᬗ-۔oJ1{Lo 9 9/v L *,>,F3axTXrM/ٟzd._?]~pTՖjM>'"k\렁F~XQi z2%Аu,]&!hÆ\Gp㦥YC S-0cQ5 .{"ọ--IWx.[ j/:iPcl @Džު)mAcѻY g?ĠRm(@T$ǽ4pYSs3ܯj\5`-pDBQӋ@RaDÐJğ+CX=2?b(P;e *xB)>{`l8]qctQD6"p} aZTYd~'rP_QsrM!Q_B&O)H q4W4_(5H X]xRH6` n? M9[cÕIP$PqrGU*` .&M#>N_~zD Ogn8rBKGDX DAK -^:{ P[˰>Az l2{c^`kr$sQ``]HP=[ 4yLx$V~ɖ-;|Sv;fTA$T]ǐ+C݅C lkMS!O˵yaH<&AuH3d͉2z!2Id y+ajdzYރvkʾa6Eè>|;;EjyW ND dŲ8xG}d Bn@ՏhIeHi &t݋$oQ >Đ[Ke)-լN8g|!m\Bk?3kc8H:z%0ojf89Cf{wCPjU}W@قY(R} шq5-SK+|̫}ȶ}ʚqʌ /bKc"U4A=lj7xu'Z=[/NLġ+z'oD @ΔQ^+3jc6|kqƽAIcy,XkpӡxgceJ(HPďƠxܛZ|1meZnr _ y̮uM HNYkT9U *~Š;C1 t[/CW RCr`pY@ʻwyYbjѱ>jjM!2o#d wI@4W_*:sq"0 4wsC88P4R^6J)`"x^+J$A-Ŋ!&ZP0R&}tֹTKI:/O|1,vۓGR&B0OˤƻZȌWr[{WQŚi*.e|@6R{| 7laa-@s0N =x0BX{}rİJZD~B>iUר3qL4B@I[kR~5-VR; M8>q 쥢Pw^[~ط*qF ,oqXxۻY8fٛTmM'\a2ql ;/}uF~>cBٖAB Qlh@_%ׅ R7rוC1TO+R5f۞r %5S)mtn.Eaaʚ)WǑ%"Kjfu͠CT>oٳ l!k5Y 昇`[s5ѡt?-MPNS,?"pA7UW+Ԋ7E9<&ee1wbb]!yfzG|3X].iTJ29RSj83H7yt :wzSzg-=#yA 7!4dX`m/``UDPhulHX;~X!ImlEڞt 9rgAaE$}CV2 \-hd3ёܜ"ʤUOH]Kπu|0>^̽A.n7}e33/x M){ٛ AW vl+%\Ҋ*. jW1R"ŐvΟ W7o0}"lVESw8;"JEo/%CBtSyFAҙ˃ f l>0ZNX(# M/ԨI{{G熷,Tu܉c=ȫcf|q >J49ddBGZ<fn:MBoT-nR "q4PWvq= [{ɁڢʦvFyj!t.n~'^`pp|%x{Fˢ$Y}hwR9G?Po@**0\s,o&Gv2**U0mphՋFN\CL@\LؐcYethqSsCK- 'i:VX(+C|R,[I<lvh@> 1uil,5غ3p{J _]"{8)۝O|W,$Y#Px WUaɏHwm|̉J}>!(ᶦ9,V  2D[(Rx6 &RTlxԇ39)?ưfD)*? 2/# d!6Egx-T#ܿT7]RdN,T5} 9S3a_-@ qORt2b\vazۻt^g(f̐M* <8$tu{ey^UQ ?84.9CԹ[KS?N֙{#9W?}biӥ}GjY+xv'dD~ØJ&qVho)O؛| WRW7ddPkW4Xc+˔@cvyR9QSYmy?o/PsVHRXB<QpU@lIq렌odL+$(V+b K{@5OИ*,#GKB8dXƿSӵEU` "삫@Ñ44)yf C^fG)9FZZZ?ޑ@+@ƶHթm'Xf34()(}Ec|) \\mIp|2T&Qpxldc Ϡΰ:)gZ#Fx0W3t_|`N4,Zs웏Z}vsݔ=חYw \v zS iΦѨDIΛ "/qR&0ֆN]:Fst RXazE}u=鍡y/ΐ3K4u!uR.cbȑ yc7ѡ>xaJ[ qHGo:><Jy%AbAG{u$؋el<'8z3 2Wv Dr_5JƄ G^/yHve}L꼁sU%m_y˲A>}/9 /4}ߙzF~fD+VKߓsctx(^KE3jpLQޘfLdT0%PY񺨒Ma %qmDk4F50>2׌=0g30PV*úYo!(yH s[&\yE(C.ĥl:u,v3pؚ*,{;3`kkLh%C n6c(WeE_F+J(] e y>pP$]`BE7".'p˅&&~#BQKԏ) oƖ]ꔟF/fx<UWVi6pZa8TE'fl;켷ߋwD%?d_dWtmt!u3Cǐzq1rM&LtyeU>k, /Ҡw@+$6pH\ g 1&Lg^/Q$Pob:N#"I퉬vf`,ƝGw*f-ݱ>6ԪG gPٳRN\Q,p6\Yu6G|oV·8+0(rSԡj|M60Ǖ`׍ GnA8U:ixk 3$tS~<ȲjF=Ac>7mqM{ C7.ψ :h?BA|?j=?AuWQ(3>, 5j=M@ħI!nsUbC9xb%$_:9< ?$^na>_rC-fS#Yr.xnZjxI(o1UL[4op .X &2 x3ʿ#,|Wig;eWg "KͲ5[V{kI5-r,|zÒW͠H^,-$U!o+ڪh ͼeo9 ރl,O?+`Rv%˹S-/_ ۂ۽l  zsďzN ,:ǬkIeڋJY>`dF>,4JZݒCa)ϳ (ȵc 1E/l[CPTzfAd;חL[ۨ( f[L!uHI;gz@yO燳iu-[d(S:p[^"P=?}e6)ޘ..Q8͛mti8)φ|df ֙,UP5}[ 'r< l~|kKDIh04ct,c\8R\L?j_ բݻHnf9AK6S#YQ&fwFn} e@O(D?wg{=.4Yڤjec* wODaGKP'@$F oN3PLK1\n;9)tyVmTiu,=wsM ӗS-c %Qѽ,IIȻY0;4}c:z,CcR3LOln3,լ`< (GH$W$]E G7䊀`ޒH+:ģk%V5oc&3t>spՑ- ]V!E^79r~c՟PV^|3mHǕ|p qfwNf,gǮCwjʉRFx ӥt?2wR7#NN>UP *>il!(bq}{QFyCe8ANr 8i{v+1^ /X4ߟRMB3iaTFJTI v0ԪU[owudн\~ mz׋ޗcۜgA.U~BҪxjcE3~ܹhR˸2"`5W`r͒/\}AZ_-nRV(XJ;k3ZKbcO\Ǧrຬ?hF$Ty (]FHhTr^]P;?޷/(BW!Q4SO-ܯ|06žfcu }J64Ps1.KvV\veP.~֢H=KVhwhT/aySLruHNp- 5Iqq [ zhQ˨5t3h &-%W$]ӆ+ބg-c1o lǴ8 rҙX}[>6xS Ir63n[|Ra[ߝ,-w)OK٬%Ś4sZb:  TkPekomח>$S>S zvG#CPf~|DI\{lt(ru1:E (,:ޱ pePQGG[Q˿,c,w:YE`9.Z="ak?׹D(qދBJuXuK`A qR7 ]ZB[rQ1= ADjՀ.E/@W4ll8 v:E'ʴx^kO 4$۩7jjS* =+RV<1}, 08z '  ) bxl?nf圢3qZ=&A7kcvB&l kSm2뛟aAR<:Ъzj l&H9-8tAzV`I1v8_ >ddȀnήQ6dH{x':$L}&{ynx$z73C0&$ T]V֩x9ޞ/K<4;e+n'VڹeM¹SSȕAge__#mcztS&tx/g}T2ଜ(zq W+g[=)XP%OBlۦDnR_V  0 I+KCܯL KmYvY, v Flؓ؎BP,Ok=VTD$QX*u3sk%WV5fYa}մ53uc a`,;&dr-Oi> ޺[ 98?O=oqt 0@٪u&$Umۀ;rA ^,s}}.Շtu=< (#O1mu P֟EU=eif>Fӗ^k6`"&;6Y !#fZ^$A/_B~ $PHF*^2!s3r0?0I;gQȩ؏Bל˞Kq~Ød Ԡ!lkj-.*lTiU|HGuWZZ۸zJ̗ꜴѾ޻%1UL00{{[>+5U:IYr(ޯI迋85mab~Iu+TrȆ h-[<,G2cDo2Hh&*HStNh=/Be`n\~ ']vVH,z̵’*8=@~V"L#0S]kNuŶa5L{&)Cږ:K Ir:)~;G%SR!=ܴQ;XdC>Ӹ.<1yD3t^g~ռ2!*}֦o`2 i> t`'Qxjm:P_(At%BM+wR JDž,euLWW5Ah tgP璎LyZ)={r=Y|꺡Ht@Ɔjp~j\Czo .K(JH1kx/yҬqz[$y0Q¦dP[a5(TQ{zJG*b.#'HId2ZbY* ™m( iI2]aB }p!`QP:"It`JeUee-mY ip$`H09ՁLg5GOg"QWO1ǫ8 XG"PU4?V$@:48]޵Vlُ5uC􋈳H' &La0in~fxqtA-2) Hxc*nˆkRk&K~܃OoFR^a$&\WA2ϙX/ 2 N>c' V?*mrYw9K_pR@ј5Hyr*ն۝] Cj)Z[`ژx vm4a/ iݮޔn\FӯzBJUtvt쪛+hƐKf@uqorl2(yozhd˖+ha$VY潼Rvpz&;'%'r҃/:2]c DԭisDLh]eF5V57mN1XF{N5Vb츳J ːy*vՆRd(8ʹ[" T?kfe?ûk z.'YC X,2>cl&L$GaW5?n| ͐<ń%p|5/Wj| '00H*@tT.&ҩLU{*ɯwhra:6Ff ,#mUw*2 XɜƖ CL4 u"-M}^"AEP0E;^܁m@`7@2L_lceP5ɘM$rz'Ie.d5_Y Õn m c Jc7@8۾'bUؓ5썠 i"[L~PIOL県{|E@%T4۽ˍ~Ӂ,@0"S5A"+h)r2$VtDlH )ʞJ4P);[}#B֦B>һ[e˜\f}[}BU,C){9R%q\oE.) 7AKj+a(Sٯt(+Y%Sq=4{|;bI1a;IC_nG84SG >gˁƭ,U?ǼI6JRX [ڶ5*IcZ>߲ilQْKjaQ0A:*74(|pDeiLo(7w{U \A*T@Y:.Qŏ .Yq4q!B&0&HnP,9M,8^kA%6{N @*rJ۷Tv: }9b&ZyHz^d'/7g G oERe?`8%6j[d ͧ`51d0]wxH/2:7wO.Y&M5L5e2Dl\DO8rRBTQ8jwVSJ4| @=oa"xZU OC7 }sHyMH.eHgM{(^NiUra7AP6<)ڥK*0$i<*/~PF`Ug.& }c>k/ԫ;P'zAF8_ i"c~-Ib~5 sjK dUTrN Ajʥo$hx?bV) ];gr?V3xkCIv餱&yE6CI4C2!4v5x( pL8/'}h(Tir ~[Ta_N#|uVnA9훝a*1x;TO]!E8M223$W=۟M]Z 64wDS =,`kjйW bi֡-vYv^yOZDf=W%'aQYZ/ H7roGAf)WY|[AIi=ek =P}kK7FaPWV/,ڙS0WB&}d"J f~0d&]/4̭E",s$W0_Nɩ ) $kW˺;T|םjbU9.jEuV9@->* ct4ĦavF~ex*1jcp@5Ym֋J5.eGb#>%D3-/" 'u[>HzdF=yf-Tj-W`Ħ}Ud"YC*b)rYu:- .* Gwacm)'|r62QHO=q43Θ$L0Tsc1G0?'ߒ){;t4+mLli(֍K(+B6\ks=^Bm9H kPW;}+,NF:LScCq8L XT}Xv.ˆi,XTb~~O4uǙѪuZTU'/4ΛO}` $JcƶYV;1^BɑM/< 7sOpI/\SU>-*(iڢ[5T ;@XKaQԼ彺tC -Zb&:h2/i85џ=D˩]{v@ϛ)G&#Loxt"myy)A֓ ;1itDUD_]nmgurxi}D"kݪ!v[lsvKEV,װͫj-%_`mvqvٖ&sdPmqIO>O[TL =Apx@ql[π?8Cרщ7Ӎ~?exijw[Wxڏ֊WO_p-~j*`Hkjé컴\j^$^踇N0KyJ\0M&qX }# m;5p8Cכω 1'U^gJ|  A^W9eUcy{U$T#`mW>,-A \D3u#+} 2k| V•>bJF=pm.^`> BfJoff*r21ފyv;Q޶Otõ5EVZ̈́Oh2F(-(IIv (lh֙s=O+i5W@/}.PuԋvHGȨ4-{{A@;ϊT0 (S83 >-ĕT2S #M9y qlwL)hcfYUI5 FC1,-ne:Nˀ$ST`Y,'h.zms^%5 ,AJI+=h` .Yﶬk*2MK sv[4l>e.j")cYʊkS3OnUĩp^Um0veiZU΢o5 iմ)+f"c9|BҭO۹gR(Y=d*Zke 3Ys3.a^r~s_26NŽ1sBI-d(#/a>5i@`n{SXTN.Y|8OR#|Aj'ɣ%VF'U, I>A3p"n{tެ\oFV/ڳȪsZpF:kFGD㬧DZ9Z;Ne}iOhDkN!y 'Mµ LүTni/V {^]Įcg B|I:YW924N͇~*oP|U3]Oڗ!j;(.,%vP")*?<ڹN0vt'e'y>ʃ7J v0h9z9F{=vlK8`-_a!X//}عNyEjQ_8R:P\>( A"/oQ Ƀj W:(۴8}ƚ;,6몛z+p~EyV 6U[%rvwf-fOBl̻I`fX&L:5+;EiLyORðIYP1zŁT*ӟe%K%rIzE=02_Zq@BS{vE- H wr<`&d-Rm3#KiO#Ȯ/NO}x-X$:e Zx r 0A;$+P1+92c4 !D\ ]ud .Y) E5`υ n{/ܞ0j /pD<UsB{ \,(N @u x ӫ"m;`r>{P!Pᐭz?⨽>k/D]yP)#DV}rΣք`yY{{'tB8 k8.-Qe%}aH~e!>*Hd>UP.O捸FW~1hLv KGǯwΈaQ&}'VvѲr P~ڂ\v` vDO7HjfQ2dR.b/6 `9N;u^jއsί2lRK*("S*,[6Zcsǒ-16';#=|O?mյAS'm 8mysb1d>ϡ^74b6?ϙlMaE2|-`=D)5_g5Ȑ˃p5.G gʯ腫fN㡍#Y/W ) F!- ipy~$"бXҭ'β2 /$rxuX*k F倲۸Y>wEh\>]9~m#5L \`wFk"4%KaMK͇,1I ` LX7Fl6Aoh,C>D0*AmCLS}D,%O ˋ;!&hZcڹi٘=M + ,ܼ< !QY.4AOiZud^wv#HC")(3k_Dwb$_J6l@4!ipEHy) Cr1D,#s:rE "!CT;:.>^ CEF#hK϶3dyQ [|*NсOrSdS%W@9sVʓUe_ rFK|0b`%S[k VGM :{ B~?s0r|>no3z 4-#h}(`Az՟Qt.O/?=X*: ᕒF7!<+bSTU s! t\nv`{ @Zv_1]o4c̿i{`tvIhhuZ<J~0YB7_PԷ>;t~ ̙/n&9T6}b W<~U?%j"=yi}]Q33o5i/7R{ՙ:9Wa0goISug Wd„'< vxS{hKqqmE_1j*G*B}wbY~#Sԁ0hsVFw .(4:GbTL`_ CΖzZS|K\ ?W|ތ>UɑzApQ<}Z]#'aҽWw MyfLɈa83_R(yɾ=6?413(I" .x[hi A[WV#3L"n >hWD30-_摓 z+)_,pt. HInj6Lr:d@V%uS#5WAiwL2(@ w5׻ OL_9|> 7ߣ)ǖqXg-k5ItP܉7^Od'J&\~T1)m}U/'x!@ Y-"FA(P7h9j{8{zCu r`.0)Tٓgr7[e!E#bAD9<uA |.`Y?<#ΊD#ӷii>|4}|'+ Fݦ88|7PF,b$9[%~2?0~>QV[`$Y "VOOيh>pa7|CН n[x_DBSđ(b/mE2H? S2Q%cNڗ47P :LSQ(}wr39Yxe%b2> Ay[H|\$A9Uƹ#H$~ ;LDȜP y@>A4Id*c&][bّbxY -W\'n8g"M0X%']'$$TB}ojrHO^xZ/ ߍBph3I]Wѣ:.K;F|Uy}KKF9h5YySv)(`4zHkx{^th1xM$R7^ YqZaē;Ht_TEԍ.E*H51D֮Z:I*5uDyϥI?T]31ƪjeD LSKesOK}Cu-Q*&{l$/-О~2wg_ARWP Z4JYmV 25a *(m8@Q}gQT a=,޻57jb1@C8,9R/M aW;Q!ak hŸ.iM1 UO X%=(fiҨ{D{X `sL<2C}yh,p4TV};!qqҘ*1K2i\si4_QO?8`[]Ro=`gXNP;(F_9jT%("߲Tcn2a'\[r`xNuN4~&fOrj~.ȸ1$E'%mSbgזĴ8ZvtAMI.7 ^,So~H([+!~IFC]5kAe[2bm!)N#b^!෎r{{2};eL7Շ{m0 ~:+"ekP'l0&$ F7V6IT`fn|?;:'Pd2-JvrjwMc he.8뢦J{/bBo3S-SvU<VH2x ̶8V;gu/֊t6aԱaU"8 վ9;;!/D9ةEUGig]" Sbfz,D/d;h@Y\/Ԟ,D$_`*:w4B wSgP2U[2c3fP3\u GQI$c//k~Cն=dBrioۺ8.s%Gt&ԫ).?&>j3$^ .# -Z[I c0z:n1Cnqu)A`,9N E]-afeߵ2,&}Q4|,8çYy _I! F:ߥf5VCZ')|o4D׍JۍAz?iܬxDz*.IiCdL$0oP"#eN~X7+Kvfwp 2>p0Jy?F.V\mH3p=pAN-{ ],L* Dl",bn4X~t#Fl|CrUFT1;^Ր0AЈ vNn;N}"S)TmK{d%;TfT#X5>hvBFv-L~E:gPy/ /PøA59ES)ЖBfMӺwC3i_k\V(jyQ4--4=?C}R{gN:qCw[P՚πQZ%ݤ~*z8PAy`dj`{YLKheYGN4Z8 +AdhEB,HԨ]TM؅p*H vRɣ\oxPt(` Koڜx}o<ɣ XPuË VY۵$s0+]/.ƴ5Dm> p|ԁT2o2׽G;z5+")^!Y>ǃ7cGFZ7W0oH?WHI̜b rK d@Ȟ%9CdwJZe~Tt.OkQ_Azc+[T'2L :(F …[3N3G/1'Hǝ~ I6Xv}b/'G [Uᚯ /ƯkQJD5N`#F8(_qtշiWܼfz{rҝ́iP?`\8R:/"pwWVcTixO,d9?C4Z6&+=7_[Õ _c'݀sKg+G8\nz{@醊qec8ZSr!i;N?BڎG|+l\.2րx Й'ZDѵu,/Eٺf9k.` h^^!MM*޽`5K;T5ٯYDKO zu8DM)U%AS>}՞^h=uKhY *=-`[tԥkA-wv< zP,hHHw~nf6@Fҹ՜thM;3;'l~8qd~$aîli c0@,S0 ݾ ~\N#UZdKPnבA\C:`&eJX0}6+UKT?k/xA0 Զ7՞y$÷ax&;9˭OPǧZq@]BkSv]r1Ixx1}Fun<#{}Zr8Pp&b*5 ?[o5nL@1BG<3{ݛh5'dW Hm@!K_$c2Hd^mF L~D0t8~MJ{K2%:`Qq [=g[n`fkwy227ķ<5wX-1j>^!C1hOLJ%FId |#U~G㹹HJ'W,mC_a i:$'F(-82M:+MA]p0b2ZQlhK];_['oQT{?0:`/HC;>dc70hG;r85#:ʈ\Gȑy"?]bjYI-#]bk*CUFp%}R u?봷{/N)c1bĖ] )㚊ab%GJft{,@}Ǿj%B[V~5Ͷۘcc'/f$es|)J?)uzinnlCPNy]* "D >- NS9ьz{ung*Bdظ%Gt6f1};IaPhf'<ƛ= NII?)Fހqm䜖 z^RUKf ::i$zp\\\`v%Q^92(3b TUJ!u]`H\3Jxnȕ"­ q䂺jZeZWe+{#"P52`439FQ=b) 2 Hݾ)H pRb/*س9LG@ʴ~NwU1[yN }6@__:JMbH}HG,\~k5S.N 8,j&?)P+Fn|:sV¸hUE^[^fz|2*κzaWX`m/V##y,m/$|s_哤 2:+hx"&d'7ffiR7"ljUqo_cN*y&fdk_!Vŗ LQ=kh  3 (D@$h2 Śpmhh?wTár@kDGRbМ(+bxa/G&@Ń3JM}z#R<e*\"NRCWwL 1jwiV>$*R6I#wr}RhoyWlT[yRڔpAV,&3kھ Z'=:N|?{Fo=kLBbluBify@XSϗCNoឡa!ã%9q]Rag|Eve3(tHFK:ij7f K[:3ʼ0d^e(]s%B4H7CliFt1|vgw?xqtPk3Oӭj0`uƓ})߂DE?#;y#ʞcq)mpؖgEm}`z&2 ~&/(lHԸk ,^iRi+O-:x6Ui7( K,%OT}?R&Cf'J}24`w <|!Ϳ]:XQB2az\0nGqGH iGLF1Eť->R[fy$xW //3oƜ:p:1q@ +(q"X!'&T ˃NFr;wfm=+A.!M±T!,|:|v[=<^9 QݳS/TU~ԯFeBn\90A˱p M% It`qkZɏ8F~tth[3{?̖[2EA"o4 +>l@8LrI:_nJXrt1E|M4b7ƔmϑSk?ڇ_d̈́ƈ<*@G|)2%϶4Je| д7[r+a6Xڽ8|C9S ƏXS- >%yEg}| Kf7Y>Nߗd-29l|d_?y&|y*aW$&adSx}( JSbQGa\)`V`oJaA clij,-bH cky=יZ*&0 pW}{{AIӱ4&z"8M7H&~yrJ]EmlBFuCtk^Oi˃P~0yspb7LQr[t,}DKk8Y:(wqMj/ \gGl\vr ڌMALQ/Jkm.Qa]ЬtP1ٝR|gZ7fNgka tca)F\\բGl2+n  3/ˈ9DD.g;͟0~uM,'䖾Sh3ӽLJޱ?䙮1Y'w] "(5UN[P eP޵䓐ϚqлM_Xy6KO뛲a|5lWU!WoLg: ?h`6J]0nY:vLXUAEd8h1jjBk AzlpY;J8-yC!J6%Cþo\%%O0XMT:^Y0|rTq4AM2}Cc%7d8*~)$R9L'a5Gفү'?x*!B͖T>َ QNYρ| Fm'sgXF^3%T9B8ۖΎEJ3jƱ[`{2U8. ڎW@^waaL. Q7HqHq{󗽿ܵLׂ.]WC{H֟]QNvGYC`@K{ľZucČM-zAqCCPIH%]8K;]Pw3UBLPz w~4tC+PB+><Ō3/ ֣)OM;htF?k233?Cw'">de/$(zoI+])5yWž^bسYZ/H4h~i_g&&Ncgy\ fDqsc(~՜ ~Sm2]ȚȔ7ukJ,"ׁ;1CDuO!#~/m;.-L GwrMi0f _q*edL3[ޫ>-nrD> heuĄ~@3K3 rxpw}f2Xi&. >\wCfM҈R2"gk4. d6&]dY5 ~hA#xv&Pʇj6F>*YHn ]Td0:0_"T]lH.*)~>YB2 ,zu$ۓv:VmO= 28֎sXPpQS|NS9Jc堓ywOpEByZ%o? qN%(9 <˫ ܶl)E 0,-7.00ʇnry×he)lL ww-u ƭZ速M'.-JEw.8%eoQ* aߝa>v]q%{ E0Dž;GyL^$BpƉu݅tڻ/zTy!G_;JP_8 (c阿Pi{N4Bw?k!/txAvLpn?mo'Quw6aNkA%7QT NX H%s󧆇WkZ{ؘF'[6†6A8=R݆ywǝϜo8;L|`Lڹ'¸Y=B_\vѼO4o$Lt4/PZÌoz=6L`"]yFK>aq Nc} ;u:]g B6_;fwڒjMFeU?G-a iPw*dsiMw–PQ@k Ϣ/ZLB׶ͷs,I{+V ~/טw90zqk W+SjqE" {#E/Ktg-s@>VKƯ1{=^`ezvGٿxof}Ƴ4A^ᭀ2ۘ{c'5) Vĉ7yy s}/ yYd5ȇDv4w%0 FoVy]^7nTz'[+{!݅ Mk(rA;{\@iނ61s* l@ϵp䗃%M9h3K |sSt-8]KoW͑U?:߆FEv+ ! |!$wb- (WHe'X|lEy 7E]l9RX XY sP)" qA:gRS3崅,eg F^\S)<~s:Y=$-,@t,T &ҥ,pPdL /|˭֐L6!5̕lܰѴzT *ٟѷ"n]ؽbK !8ضڤ,HQI%{K] |IHҡ4dVc"+)NJR\;ONv/]˞ an2q"TP/@r՗u0&3YD[{$C6TiƽSjrx'V,n4G$m~`t.E$|bbR&0+ӷ*Na1hZTzZjӖr`D`#q](>}l2Ffc6om(/fvjBi0s;c=mV(H=vvZ>ߒljM2Q-nb}sQ;~FڏFQ2HSfs3E& ֡Б$[d"e#Z7rv3 ~,e*E h wQ,?rėRgq ڿ{emt4&J@VD.7a?;O9*RoZ>$CJ{q=1L]h{9MKEwVx sXx/_3^ te/|˷q~8fsKqxbbi`vIMg~q*(t-@ +W.{Z24z鵩{|sWbDhDp9kEAֳi.XSEbLz\9vE'dbPZ{%9vͦ]BU30Z/I+|=LxnUlJt/cQaShwkO} f{˩|]mPOlqf Vx"n eyn5yZ(iYwC겐n.}/+Q:+v!uĨyXB®~,QAęSؤ7)[kr܁좕L[s/pUXKlA5=S2&%Ozo;a*.bb/Bx풁^)dJ<+T矀|7q"r&&K=bS -;\TWѥiѺ$e%$wfKL=n4yUA:oMl~Iu^Nih;ܞ53l'zk,(s0:+Tq v%AA{_ɮ]ׂ@'?yA=PʫKm=j,"^~ttZ8w߇af$>%f-k$PBuP+w? Kz?בd#΀Z[68^x2/P7#mSFbj|hE yqȻd*Ä##r BfhoQPኇ9f"V`Ї Yr%[9$"T?Z+uYdh/A `s:& nlzW1[Oיּ+!) 5^h^|W-tҼϖWٗoo_ YAB#EJw<[&.k6U^0JZ~9\007+so;b35Y׎7"_Ⅶ %)Yёqj=}3"a . jtس/耹&>iǨ(x7u]7VED|W]*"U4x̅쾲%RX0V*<#C3݃ijI܀=j͛oK+!O>Og9\o:P1W$/&:[e,}\G\t9閮XZ֎!soApGWsBLjdӦ$dcĿpR"nC{ݗw/4JGRQ?<m0%Y{ͤ徫>Y(-gitN#4燆]?wR"Pڦ #@B ujZn1t;ڎ gGRgI3şR(Zq@!)Ʋa'$>ͮ\Q= 9Vic8Ӏ!iG3<&kCy{BXR RLJP@ HNav\9^S׊8"xemI[eZ;PkO-< 9 Q[LE;>x@['s0 1Y0CWyh88P +i/NRKlǃճ Ψ8K*%zԅiōԲPPVǥfؾIR )pB>eڎ3t_;v!LQ JK8 =l"2*ڷOu!SgfJ8W<˳5 p!h ocdq Y]0- "^h\?b/5!x|}$\xthG?&l3E~!͍Gݨ,JIaq@sG?c0'&BNDҙ3_St~,׃rM4Q*`L*C"ZȗIReט[fvSA˧p"J%~\ 5c`H7fCm^D7/@:^8.$pG"T{w`E(dXmȿRtHOTq+%$m6{bk{\ 3W䭐G ) G6}'!dwp0bY44"a`VnTW?v5;3]=`P(f ^.O+j\R[HMr^Pϐ,5F"<#r" n2hGmI!(.D?,C".|9+GY#=]ZZ쎊ռ*6=nO+f%pBV/K jdf73w=]f2~@y]~Dk]m} \Hj#ddcBԈ Y,l|  U0_/Far>KWtk ЁͯZ+鎒j-\P@ tAi:??mEhԦj'BqQAf$6F1qЇ΁ʤ]5t\+G$:0d*0 ~jV]|)D ^n*^zh~t0c&.< yď=(s~ tɒiΊ? _o qU  ,VY0V(ZuるVjt Rb=xaldf<h̬tb.tH;Vw7Ebaܥe,#eQMPѤ$ƏcP4qVc8G3;ӗG5һ}'T$[j+Vfƿ}:"捶)h6/oyZ ߱[xF3}uEӍf|%v ?!zeَ ; 'ŕ* 5`@=/Ez%(sJ!7pllx8ɶ5CuW7{AD;w.xIp>1͸H˨Lx2<;Ckb}xra|T:Vi66>ݩycPdB~~kz$fxSS8hfźi@ O :j^IɃ{i2AhAœ#% 7a/6rYxTM/-? E;dCRi~"sp& !H+u~Wh8A|s9mAn=[OVi+X0h8o* #M$~x+6XXXr_tmcQ`Ԉ(} hY%`vL4 KP_7lt&^bW-|MiĨRJ]s|*ɕ_nK|dKYRdc$cvɱ5s_h ]W<k2e$ʛ==. =F^K˗WZ["PX`όfƽԝw7GRA79[ӚFk DGZM/տTPd8A|+!D\#0,a-65P$yL2K(󖭚mNdFMs0 ?=pTFsnQH7xrC#dƦ݉3J.tYwg9JcrVPÅRkFJTK+IEhS 0%s _*b?6<,:|:RlN=> Px)=j˛NY3WeS$괆! ,&xp6Pʒg ȕdR):Ϥow[wnSxmEd4޵;JzS}M +uAi]rD !⹸nb! ZVW@؛@fnΕV(@4_ ܴ~-6uFc"hZ4ϫCͰEj{vT~g)| z!ۻ ;HAVyO$}0yOX lU;@OY 4 a'ӽX;흧!+ Qm2i'JZiI:]ʥjQ@6lKU(2")+a@V9k\"1ƭAqA5 Cj& R8&/;ߖzDeTvL1ݾYjJf>WF&;1{š-thdhی}$A-LjU=ˈlѰE dMDi u-($+ ®PBP qƢjF=fui_/,Rl+'m笟 f<׶U+Ŏ]<<%ϟHDql$d!.BS MwHCA/zv`m)YEŔ =[-0sSY X +ʴs=3pL$-d7Z(J)y%NI!O8w{)R案±7rOPuvB05 |%ܤ =kKH8U#Vm@L O9[hr(xHyaI̜>&ʑz\}Xu.{ eB~_+J~F;mAIcW;,<~l86٤jpA}5qo{VHN`O>> $_oϭ^cwwbעB^cА|5yc1 F rw+b . +MXՔekc+"h U!өЋ65\ F>BԜ—+!M[)<_C8#0 .2ɏAzC4SJe ChNk69k=̋UY;0QZņ j ~;C<٘ 9Ow_Kw Y5iv 9s$vb8ȂlXF ҸNv3<Rz Mh6ϵ/7]/[N쌤 Hhpf/Xߌp)Oe~Uӫ5XhFI, W'_;B Fyb`jSBٔQRTC5oBw\r T<0~hcjP\옭Țe6C뫾q3udDv5'>f9!S6 Nw'bf#ۚxr6ԃt;5{zfxD?Ti|\Kh/`*N`+4K/ +]Pb hR1T&ГoUJCJȠ&I a&sZmfH*tNyS%d0dgEU7(( ?>0'vK'wC_GR%Rߨde- +5yީXNWZT^c#D>Pq/A)mO(X$o{ٵ 񙍎pId3ʋ9wǁHyXؾXE> D|u:+DX УT0B;f{Cx}MȸI^9s@|fοط!3!"IHb | .!_t@cO#8Ż*`fnXEfn.֝D#γ:yHTm>\X v5 5׃'uST 9R1.X|='I]@\("Ii\XꉆMi BV#;98'މD ?c|蔜YYA׃4ʛ?1X@sݑHo_Gހda:URl̥~H٠[ZPz隮L#LYe8 `5&@w2{ס#Uyªn _J[Y!6Ҩ\v_m5Ōo3Aiq٤E´bˬ(v@پJyE.~\Py4bCiySi d٫+VgЀt"7HRK ]0j&l?/X$vr!nο5rݦ;Q+]TqLd_ZS|Y A`ʫ贎ߏ{]*yҘ/ ͠WQe~0X𻔟HH06{bH$af3/ ' 嶁¿sE4H%T\׋1ǹ,_0.2I.xk nٞW܉=M ç~Nm]k0%1FZPlK6.0ҹlL|N_^ޛ,` #$gR He!?^H> 7e 7Wxt dJDMV_JZFN) ӓ뚼$PDf +;=wFTإP#\}b 7Kz\nC̢YMC (>Z[N]dv> ,:<>>:S,t^}Z 0l$g'Pү3dCvÀG}>ɢ~a1$Yonw\&B5i'~Ѯ}Yn`1;t]ߨA8t|E9 'bې^DwdWx AZyjՔQ3m3eæhb;S7Nx&J`eESPyuLh. CĖuQmY;oInsv\jV{H`k~ѻ;3br u,ѝ+ثW|QKW08>RB'ЈCӧ1Ý?m=e[LX "ڣuk68s+5Ff Hl\O@sV,JL+8 h mi!MuLVW+ _? nillu`}kt׵nOx.k,],&CO*Yqf=7jj]blY 1M$؁A9GV5( Ve*yH13FhRWNx2ӾȣUxO;Fϸ衊Qj\ Xw'lJ1u ԡ{]%U/gUV (AE=l/y3bj7{5%]:Y&ׇs5rJX'l_"oD18ͩ ’S>yTrEV_KOrYR"hɿk}k*/{^[~ L/H LOĖQJMB!H &)TX ZtP"C[{vHBAj*L:l;Tp~%`d"& 4&f(n(tk F#O~v8@xT]pk5@DdÞ丐$րh{0]`N*c[|ePkQT/ %El"b%'Cx9zW}։;)b"ܛT -!} zOdk.CU&a>CgoEp&p~<" .oH?%ِۮij-oGtF@k+ʕx/{ e,]"1zH"G(۱;4eq( Vm,C-HR9T1K/pPiSPU)IC{dj{o*UV s:/L4pcO2]"8D7R>f3DZbҽ`j$ĕ/] u؇rS`;9̱|l^/٢s[V$q Ϭ`Q CJ8G6LɄ!45?P2=,*^K0A+ f}_T qAXkCo R ;_}W N'`c wܔD{3w38ZN;TUu_w;Q2;͙UJE;tSU*UE^ËI D0ɓmA7eP^㲣( + 9=ߔL]4>۱G֨-"T6c %03^2TǡzהE`ZL/D|7t} ]@qV[R?!0iv 6!)!l՞6UX w2֊$IvJ?/GO=z  @J8 wi)A'$ss>zéIi1G]VAWp^7-g`?-] *:_޾C}9F їz Wl).W#}3y(mI ֳ y؜Yv{Q= 1uQuҨqBb*8=#㜓luSbȄY Zh FBCڹSeY4mdcXYm9^X~[՝4_G %vR -33 sl#e'ի-j3Bɮ"dajOG(9%k/j?Z5yĔT_/y${?c[3!ɣH馔A^M[7#Th˴fϘ9x$Hտͥh~VR_ҳsIԣ mc0K(4;k|7QJO(xdoZGا=Ԁ A)gcrjmJ04CqM`חbxA|Ż`Hl){3gh[h  b@=q^GtyJvKo,@;F(0-|γBy00 q+t0Vg / [bUN&̾]nyt@Ƹ0RO#5U_wJ$c/lCmm0>UA ƽ(_=G쇑-Xפ1Ww+~ye跚I-c=\{^%_:?I nl9u'T*N$#lVURlncaC#j[fJIHw@YDA=PE,eE(TW) >WIczPT6v0N5.mǟ,/!&5~^g ]u511U;2w6F>mӷqڑ\ OCrfuM\!+̪wHYno jA)m MX-ӞtiT 1TJXs_ۿ$i^ԅҚʒw(T!\ejMOҚʢ^Mjk%06܂8E 6.ư {aDiodՑTRFTG.۱!HɌix-?υ6;OoJ< Hǚwgkcq1(Z'/*-\ܩ( y`[^F)E\~#8[0OfOZջ :K©#- <gdmI+$XTL{4+]i[v!zW#󾯼|X:f~PoNbVqio]yIgn>D5())l؈6&K{}X"5C|O i粫gZ,F2؟V }Y}'9KʫM N{z|a|U&&::`8#'n-)4KAI`UTs'>|VEGowr"@ļv{#Sdz=3y-TeP'6HMs{dA)$sԟ䧰I 72^)\RsPy'GB‡LPFe;b0[!(6N˅QkT3 e{k)3+{a&DȮԜ%wer]e$ޕm_ HM㋹އ&ts4c ~k7 "@]761OnA Mog^or3z5&\7F]!Q[%dFbwV {k.%Jf d*eK&! jW /ll~60\Į\@' 7>cWv? [Gq1 6]%SlLM9LeaChxZ\S3 XzCaR#J;tC'}ߐ[œB p"A;?Z_r}ݙ;86nءLmGqffi B~,S^|^v<5fkaP hЈ1 YֱBsq#!6Yތl}Y%s̞# Qh'UO`b0s{R]kij;-YNe߿R~{{bu;1X.ōzZNzZ9w=y4ΑQm- ia8.\^HC7jln衶׬~ߪl/o;ڃ@B67փE^46z+~zqNN\$N6P+ K%+`&~3I5ڈv QvV6^HmB6u3502z^50r,2Q?/^AܺW-!iH[J)#%^#hZYs+$<@ym!ѷΔty)~(=pNԐo-0IдFW_.mG<tуŻ@M1iKԊ:˄ػpka15 6j)Hj7ؽ +@bsנ[G#V _q!a E)&`^IB6O\c~89N\&er؁Nw]w2P:x?7*HɔΆ`/6F{“p͓lLL,( cyo\etEbV[twC7c)e&ŭyiz-U2脴6ĝ?X^&4Twv<-aC; X՘"a=ac];;qqvRB$g?^*,n>-bҨV2N%÷FR@>`YSde&^Isv9+6_שOHΫi]EY5sd@h<[K%4#UU*t>KFşF&jAAFq<伹jCe}na3"t ^J$\Y6 *w^mKG$~R ˅ټIDV.-9rfn#yMϱ!`.#\aOx5B8rg]U"(3._rMɰ[ayNp9dB",MJ*zW1*yBl)%Mq:1Vf66heQN㶱猑L- LH;>7šٜ.޺|i}T8| @P x 2;38LVFjZuނo /TBVA[ԏ{^rZXdw F:Gp6V.>:?a <ٛV&Ţ?F 1W~EW-v5"P_XAJ#* m\8O܄oVCY+9\'%R.q\{Ԝs2]b%rIWՇ_Vzz^}ݷDHOa56A\$yxdRi1E(jJAp# Ɗ=D/^0>P|k#H;<5X ` ;4ܛG%<늘̿J6bǂK-<|x35w^FTe)fGz%BC|TXs ni<EMN#ЯXzQ#2 & +595R ;u-GQo.DLg Ng)a?2hg%8giZXQwx!ZL~nuqQ*I+>x) IC9rʘ &ɡ 23 g$qAJKC62se >;fsG~̓إL^兢88/%3L[N/jLdV~u?DFң f$$_EQDq(._&`OoeH7I}4#LP 2۹d)#눟I'xIat\+]FsN3P$}^$zbC=Z zC>j=hYoe.Xc@N@39RR,FIo"q&Z@ydrZX'_qJRp„gVAX!#aijb*@X$eMTXc5CJ)!4?L䅕?hKD_SL~@Q߳ؖ~s_=U11KW8xo*)iǧo)Ʀa`C|1-hV;Sg ɬͻ3:ƸR̿&t]dŭݫ-]=pl WJޫ ,^(#SV dgTхZOxcdj۬w~f/Dث:=@;Pu`D_9`#gD>]|#J5[4Y=ؗRT `jU;SKYFLܸ׿V3y.Sި1:߼`\4 9ly<﨧Pzȭ}#xm+egjѩV[@$G睨arsܺ>8>JW]5Hba_C Rq; Ma(rR  Ƌ_?0R4jl-Q =?xrmg?kIL B8 ܳ2HvȢ焄{ A?2tsյW$k$p Z+yiַp3i6uΣEÁؔΌX8b>f v!wǥ^\τaa\9gpkp`9aTҷށg9,^{9j1˘T[-"t9zNQPe Eb)g|]q٩h?.SDlE52 8n  ypGg. \K1si kжæjcԻ+ 1e7 HI8_b<UE3}{3}ޑ3uX6¾X@nk>=]W>W|5a=7e؂fbW)aF‰- JxR2(;(R%Uf?VqnMɼqUС o5o4cEr6,%#;q c*iK_f7 d,4wQJ:Tӄ3#1e:y0*<6U1C@ 䑡) #75.Cx"`#WL-&.)•_M( 2skn 3d"<_X`obPu4a"gc䠷v˖B)m˰0$4j q6K;ʿDŽ^a9fYD5w:OeC QkbRsXLTԾi*_<7]ݵ'JmL `uϏBhyu[%ԘcN&u)8ϲ80z+Eu$+ Ql.e]KQ\Š`P8T2,*H7&a㓔O_ =?e<߹DHΉ~r̀FvsڏMcfTZ#Ue_tLK)T]= ?[Ho1[$múr%<6Hfh3&O;}/45dvHfھj5ʿ 9 zT9!MΗӤSA}N(w*]/ 8Ku774Ǿ" yېijE l{⎘hoů(p4 m1Nx tUݐhz穛o 88Ss6DC@J.CK/B*LhE3CNZ3|>od~DuR7wT&ל+Kf'P7W"gpU8g2 fI1w 3ˁ>/CtdP5kXJx_CcvGyTJBTiEvZmWWG{$ \e6 쇓'%3puySi'Fy>_3nM\eyNniJn!kwW7W1h;Kz%gPځwg\ؒ_\*EbͶ>R҈rl “Ar ܇򡇽P Jݼ9r(v3Ri BaJ4CV)dE/_oα"53_|lNBN]Bbkc̸%zV7N$4iQGfR0_jۡs.  ,V0dh^ xCHRXqgz޳Ѭp#S164rPIIN>& kk? Ay ZK iwAA?Mw[X/J{]#roב:}GpkC9_GL-hWĬ*b oMi8֭?Zp936r-2nHnX):]xȀmJ 0ӿ')6{oS+;udL*.ONB#;|nw:&ǟ\v$G$jQ}u;vO#qT6 K FDG_HYͳ>,t}[uw͐i͋,,bO+-8L.-C/aeЧp1!+ZV-@ Hw8a˂Smҿ/':<]F&=9CZM$ڛzqމ[e]P y3XGK+ kyNTA`zgjl7$Fo_AiTy!ڐ7/(UD[tĿ6}Fn$oGyfؔi{XU;"D&*űPv;4FA,ׇ: 2鞂7"U;ׇBv6+XesL%3›{I4)hctY*c'{兦oPEIϔF#fP8~P%P<eM K q@ Z^<XTZ*A"#j%AhY(|+\xfua W}V `\>r Uپnjg?' #) &o:\$n  S,(k&=ңsSjBB 6fk\eFCɄ5 )_Gk8N:on{}ڛq(H|?B\"fU ʒ0ZH+|)RM@gtF~Zk:I 8 - ]4K&(HpLEՀ&GN*%O/DeΈWO\)h'jPD:OG ~ʔFtYΒ~ aD/g)}!!-1Ŗ.w~mDPŒ%yK~ {>GON̐?L:oaT=*Q2SFxu 6Y]nlmwIEyT+.H"-v<.2etI~1Z`ۢzΰ>>(Osc1 Ov79&꨿mR 36Ʒ.ҖmIp/Ouw;465R뇷-TKuy"u'6\"# zs#h “ Vی{'Ukb.G]V?1]RU9=*t4,.2 NJc{vdRIyFfsSP+:g[ h!> \SbS,ơFqsO>5QWNu y#'Z#7?ٱOfUl)8C eZ7qZHj~WRFB{Mf?˛*d]V8+:쵮 %kMcA{aVZ>Fs8ɤb{_ nr 'ЖH]P WVKg;)LC04ֳVYVmcwK%'NyGq2M!OO2ƥ7yeU~TԆ7:~1t6EvtJx-t x_聯 /*Ԃ)5r#rJO$`^!~ nDqK2R؊aR4 \9x)Nt7k=DX8FXۈ ZG@`FĐ,mBoޙzapx")z>W|ҽhVOݧ|+4. 嫺}&kD% bFɸ )$2qpU$QÝ^7Gi oՍ1Wk>xɢ>Im^ĥ.pc33 P3BI&Vz:y[1 CA!T\Xe$ANJ|F6tG b7Bipx4wX'צ6z*zp Ήg)>&JaOSNVC鋄8vi_p,:u0C&गA6m0DQɺoQO  F^Y׳Os<`Y@HqԎf4vlE:J征Qq%wdUDB>=g-)xxx~ U}ko1 B.n-|4N:O!Iȳ;-:*b]f'Fj7mz=ʇ.~#gi{O[xV02T Ax& 0%ۙK *@+[w8^KykgA홃,g:yaX5sV5?jڭ eJXvWseT$JRGH: L8}hճ7Satq;_;->!<5c]|4ɻT2?Ef8.|LTs% :`@ލv.ژ2I.3Ekf3KM/i'?drQuq\6X0c!"S[鱼č gm|0*t0#IX|0 6iYDezsa7&Mʄ p9{ oR\YPTͱY|e-Y$X'4g/`Λ%k *#*CE8 Y[ZYR3X=Oۍ?: 'U9VF9ԹI<-RdBF60Ay` c?hxJo.snʺ5Q,Jɮ VaZeEL_=͵̯6{\z,)T~UJmƮVOBT'y/Gy'}7K&E0!bHUY#Ѝސ^}Nm1XFAz>iHh_fvAM\y@`<ޝ 6wIB~3;uGnRvJ -6FeQjjn"ukw9 UV?Fڙ+*@HVmS 8%4~V\CO|-҂Fw萤`Pr]I(di'SKO!HN֣B`;" }K Go34,uWt e`B%ht,O?9{oHK!x}im eMa'GHFJ,H5]ez|\Jӡr3Ėʟt]};J7;vlB̈a)#E`3X06~ƼcRx7"sɸD>79A\:(|D :8u,|̏o= pJt;si1Voj(uψ l80HF)NR덉 4X.!a)k U$asd"B)[({z" )Igq@* Qw$]xmp$ uA*< ybS7z3'\v$pfD63>Ks pZ1ٴ2i`,۳Yg:禷s ψZ+0 YӠ蓩Ғ-+՛iVAZ2 JuasĢ;8uh=Tc/L\;w f3g:I\nLx*"ɜIp3lc!2C4\T3t>zo%wgjDb*߃!ڃX1l=iņ,x1ݼ6kN]GfY{)O^GrтHw%@  A-O8/<+fZj\'ضHYˉR18Yҽ_@5GcqnBHmjڋ\]d,vHD*9Z )!>q]tx_>`*k͑ W 1/A\rU'#x3ο fJrwk$jU89tD\AH% sǏ6+1'+|WVwgM,^ 0mȏ>oI,q/po˴60zjVqit>WkHۚrځԳfӯ &%Ue6.$g_4h aq+r[z0e:Sx` Kp9kc*2Q$V>L{ ]}>}~36h$RՐJr^ UhVv@܈9?xcϖ܎a7p2Ai42RKSgZzqLkQ`Q*hXi[-䛸C,ᲇ 7Ъ0XJ& G:uKA. 97g-Ų`4`0'y% [.[R<1_u6} i0$8$a3J[ $MJעc-\b&@H pV,˩8d^к@ ϝ5ZYyՁɘ0X+U'e~pEÔ-,`p߲1a]ԟV&3EW+1(;i@X5jrjĉ+ҵGI:_=+ˌ86*w(V2#0i6qu|/6D|9Y2xXҾ qWBA&QZ^䫻d;Naʜ0tLOBY-/5ަ;9Æiy }Z-4xc#`C JΒcڈ^ !CFefRe]wφ.[,$?,9'3Sz/oԷP?o]G 6hNp^sրNd@v!izTD`0fvRpY4Z5wV}n0S,m W!`=vR%fĺ#!&ZR trz|^v\(&&6&'J,إVDYE8Zڃ%5mkʟ؆\T#\sIju;cn7^IVGYJ,S˲W`5l~'ڄYӕb^TJ4SGot^3AAz+, [lWg ɵ WaB]{E]ԏn{¾م6ނ_5bM_^ ױC|®5dzq+ݵ%km a4e~h2 _) ۟L!6t,͂X!/Mw6FOve:!=?Mݖ6 ZX9`ep:4 wfR2p*8GCB53y[Oi}}&MBKF/F^{$600 xp~e-wұ?ڿJ*S76FbEz8`A2.sE;l C.p82&0Q#Lkn! à1U%4zkO'jYYxai!|%:ETBt GTE$!*V/wqBD~m9^,2 L:0q1- V1%%5sesix^$%0!+L̛5~%Cj3N2HďK%@Y荛+B@USMscRl8JȊ}e" @",e`W} Wt 52f1 J?>3"sUFm` ǰ!w}C ~K `&w5#ᑥ"]^—>O7HJWcK˧,* 9Y4=Vm['%%OGIf4``0B劍F&;" ]:=q *V aͭ!ťden|7W=&([w?>ڎ 9Ex|0vrԩI?vћe?NS٣;6#RSggɢExQ4n,KMvL?j?y:;dO Y zmJ։^\|:iBcX#}EAJVa~ԃ/YP?&-yB ʦ\v\UF{$c7aOE1QdbH9xh0 "Ѭ=ΣC>$Z҂:@ݢϔW8(ΰ)i:gDNX}w 1Uc|nd k| ȹ2N^_avuR1NRK:1zϱՊ:a](nvj'&~ XZ[odVvY/MwUg38fd p)P;2w2S v 1L/W8l"Ő]gV=[HǟjeY˔cn?U6nt;lF:}$%>d #oʾ7(85E(I;7^ gA~ggQ`3!&< &H{hA+}0I'T>[ȉoĪ6@7՚|M wNؤ yȺIHf&3LT𳥯98'n7Blmf`xz.k\# U-W[3fkRu,&}^8j ~S1{v`n0qn:!u$ٝt]|ь+iTC7k2ӿuwh=1Z/O?׉WFk^JwMI4˽~0mop)ŋhܧ K䏕Si!Ek_ rMFnτ@ RѲĕgWX83gez`÷>4 7eˉLF*ڧWƨq tMj Pҟ# u%@8`iwW.$[@c(qCq{J? %;OC"sj,]nX*wYw%G:e:Տ&4A80U]} ՝F<:-. Z~ēF+Nxs~c%y8Q0| ]E΁l9t%h܇e/FE\ Ц19v(2"3y\a<=wt lfeU4,n2,Ɲၞ&@h2_#CVjSR{&KM?q 4#F':0ҼY~a!WP{wi*M &᫤({=V.+qrK-V;  Gb{ PqMDYRyB WѸ{)L,$1A:N8)}V}jzNƄ-1ГEis 1ځo}ɭE2m:İ5 7:/UV"3-#΃|]o8 T5dq6yeI[nosG5oc7c#B D%iIC/>.صuMF\ %[]Vv*" 2bQO5jrێG+dfK*vYm@QdK&;TCÚE9gu~VVFV *R/fJM3HRO5Ҳ$bNAuE1e$!IYGEimkpN%կ'U+4<2t"ɧQ~n244'NHv2|j{ }7';&a5d-}T] dRHU0͠FaG(K[t r3R8X~08/J(x*Sn|87}:P ~0OWy>/~+kСKXDn^ =[ceRƸ]8?uCkīٌ,iݾgxQk;S?[l }ZaR|;XyУ<jeќ<4fnc$4 Ztnf4 XRz:u:zJj@cʆuN7DV!#r;UŶ9}&K;itV7+A0͓<4l_(1Trq6\l?F oq5ˇ{ԶC3dk툀GP pz8a&VHJʬ]^(gh܂wK~%;}PVPy2_4Y1W;P+OI7ڐޜؠV$?A.Ef'""Cg&N]W@UsH9H&z@R՗Z_u#-;n}/ <CpԻ&[}Wag'`* Bq:pfُW@詸#>:. L0";}Zb*ŸZ-+0VQJ,!o ]Ѫ6sLtz4@W&>(((.@D8Ќ HyOی wIBH NfGbƃfZ(/ $g|ѿBl-LU'. bMzpi< K,Ǎy/,ȤL MZN3Z:%iym=JE#ԻY`4l62đƢAC3*\Dd.K %i(w*9fbnƖJ0҉`"/Y4ZiJ>dT_]eɮʓ>(q}6hjenq3;㉎W *2+%t{t}^G#}7>[2ĥ1:n x;ۮ'z 'ӎ_%ϔos/E%LِxMRs ʯ?l"9;W0ghݗ+4zj!ƞ qf/svVV7<2ۮlRbhf T<$MW~TDs*L VRzՇ8R%KXP;w<ըg\JiqmDBr q``/:m8RXo}*_T ْ'dRUj 3-dzFl4 W;0%6ڢt5`U@?:]LquIo`qvI̬6_`?I&'"f?a|YRB"W-kc+0 պTtsKMYNƖXNܕ6 N ok6mU繗cvΆ7 T݃QeY<7X\ XJ&`/ZF =`m,]gLZ?;hX2mc|VL'M|pY)\%_,)q; Y>j (a\aDYsX'OYyNݧqS 5w3X֌8"yudc+`I@yDMmr@\73 ,_n*WoTL35릜k-o:ҐϨjD\V X=oh31ۇ@Ɵmca ,̷m}w163- A ݯPUSffw`B)!WUq ݠx_Aty] AGhtR䜱`$M o܃ψQ:y(A{;-ҌkZQ"6C-&G0K qõ† EnF 8;I^zMYWˆUZ!DG7?y}WOC¾xpf1HĩiG.l- l4ۏ"@G~h)- lz+-9qFAYoX@2J(N[]J돩9joP0d)lTTZf N)?*_s*NZZ|qmnʲ!*6my'q b!9׶VbJ%{8z8:PU :K3ϧ5z:j~WQRu kf3(6*BJU;1RLt/}Q(5yykN>OCXmN oJ""P|N=`lZ;9rWB;>aLe!R#s,h"Ko34\զwc=rg]FIG.wuy$l;'_T(%S/eR=h Sx+JKLl!tG ; /PSY8]St Je‹amۢOAjqHqn2Q1N(`݀1oamZB?J?+ AwtRrrB 0d'%8$#A7x t'КS*Fr R9J$!|L]6Al5\.+ۤooq҄zN#"eJ򩔠 ez5n&)S ڛĶeW(e;'6$Kbݝ",WE6thdNsN,D'祃??..%n^&~h9^8!uf!ԅ̩ϝLwtL}#yƘEIJc[]qmГ?Ǐ!Wsz8&ԕB9yQᴬEC0{U8+uǬӼ'Chsh6s1 chTC3TspΫM6@ZE%!#.!or#;ьLzvZ${?cVpfS6_G`Al|Ͳ'Іcp]# ,<Ӣ+!%̃]`F-H"1kdtFh꼠OHqcq>bq% Tf-܊ 4ɻH`p{8d}p`ins#>QsУ\87{vͽÌ_dp__qWJ]W Tߍԅ5mp8R`@S$Q$̉@Pq D$Nwtx*og/؞5qrBpvndZ7m-=>Ww;Zz; p!3/}pNdCnSm8 :AwxV _6%'Iާ @EZ&ĝ)}eeP؊/Qnc 8B  AiA^aziI?,XxDZb4xdR%)/D)z=z]8GbPk[ 95ḳ|ÑRbiZpHɳ8T7ǼUDGiB}0R."8r~"TaJFJU΁{ I$%g#*4Q`-&:kst$rGF>"Xؕ8Y*v%':N.lQ?ZcJ1Ԟ@ULN{M:0~ r j^vQ+ >Pz5ZdoU~8!}0fp:윝*dzOH42߆W:d9-Q^[ S Afn&˃ CsyhZ"I b%""T=@Ŀs%M4 {dHIBQt>Ji֎52ԯ;o B76gwykإUWh߳] L.5-gX(Ց&$;T1 AhGͿ_$SbOwLJ)-diaڮ1yC斯ߎtaZ+(hD{JiGtHFS>U("=%X.mO3S$=&Ųo*3@msye_+WABN~A7AY ),U:G.'#o1q .O2ffS9c0MctV"ke4b>3;@#̠S>bkzmHqh3>O]5>Cӏ cfQxiGD20tJ_o$9hv6!nԡa_\$hV R XmX)no׹uh]=ڬ,: aN9{" ʰWZђ>X룵ZqXW;` BaTLԐtzs"uRg ` 22"nWSKc7bZ@)*m>\_nBjxv|.ĿY(h G!dӕh[.ߌ֫fA;`Jfm7ӜQdlؼcMQ :)WvZG 8EWB]nt}J<[yYuЍ6?1i؅䁓n3f0+ w2Їh@jNm/.gfږ4 H(GZ .Zߢg UTo[ <`ڰyv[ V[`,4~B*Tj04o Y.`™8WH&"a"_iZ6j(HJ[Xf-œ(M`ǫ%8jJ *ҫ/ jK p"U!̨Q+|b@~Xgq5 Uz T~6؅.VnK$鍭A 0 V_ޢ3۳aB2*_A|'xU;7ڡ'G:DIg@#HMȀH)m44pf0:T } 8/d"NY,.xzۆ`o!G\hE0ZGOpb]YȪcvN[ %Mg iF]yuՌ r"Xz0! 6}-/:_wh9[%d@;?Ţk>aSQX1Y{?K߁/غXDѿyԣз8&[*v:" .3&Sf<8dsEÀP69זVzAb|{nn³($f3Bd~@W7 ?!G^HbLh4v^`>]ٮ"U5ާd``r =EB 6p;Fo>%a闪BJomw:R4+nn-|\Pk_,#D. 9:;蘌0ǭ^Mٞݙ@UakM 1mM3ް05 ۂԆ9@i b~Vޮ<%bÜTP+q5I>"#z(&ˁĬGz8F̙$W0cY_alwc6ׯG0ИS^~Nu/i-Zm qG x=k7ƄaQ!pK;ii%_zy?޷/tW̋{rw98~@IDg2~xnޥ'c|=0u)b%v(Uq8m˳$N@qIQr=|[Ծ'G8\m?#YbMz3xƹBDƶ;J/cf>v 1.&1é+ۉP1BP> OWR ov苧w?zHIPjX7/{6CI$ifĺ{FyP>Hr>ZC˔ mp䐉bCv{;4x] nǂܢ!,/ yŤ\/  C/ED\%0{So*&OGvSHٰ(RRO KѤ>}x A%A*,S[cǻݡB@| "Sybngx~et: :1NZyZ=t 7x Q 5Sv :oWK@)yW* rAui2Jfzj(|+Prj*J,NE,J[}.ufE)ͺx㷼-iK] G&BǎX 8c\U8[ZЖFT|+sм=%TOx-lJhSDۼ+YdC=+IـXYMrW3̺fFtl\CxD*gZSa)"fs rzE -8QaEm D|sBI5]qƼ M>BH%NJ OcSɯ٭*۫L %pvۤLmVTF| ՃĨرp qC'z#\OI@ ,ae(0tM/2&ees ToƘB}aW&#S9Q=EhwOcXtۘw!&)dá>J/9yS֑7 y&vyu ~$"Q.IkyJK[ѽe_|uS@VL7AD b3.}QE:DR (.r #b,g.f5lksFGt=hi # ^pl%\![&.]gHC8^;;ৰ 6U#F@{5X%/`kp<VC)uQadGMʼnqBٹՈr:E`PnڇN"&~f ~dhK5ЂWZzH[C:m`# pk匄p[%[쫘|b@EHt!Ad 2 XD$r{2SeZuH an f֡i Kq0yĞWeSRpzցla%K\MK0{L΍x[KE'EϹ|F'[45@KkH+qMoR%#^ЙU)@ A4R]F,«*뾗y('lR~}*71pnx,ojNWVror;UT(7zAs#ۋos+┸*i>OnYU#Ǥl/1N+E37m|d2`,1z忽8 %M2f]('@%2 TL+\ŔHe" 5>SfG ~nBzŝ x7:7!vPJ%F.D (یS>{[Lɦfa1Z 7Bzδ])iƆNVZXȌ:W{,G='sA+sI3gJJF]73`?qx`{&j U3+GDPWrG*¯/኏eUf'2"6bT =?Zw0H~OE]>'$.)R<ܟ@"v@:~uO 7H긆9/K|@TUH.(^3Nd/9e^h4|2)ou-57ChdLXB-We;! VpJVpzQ ¦Gs pUw -Z6Lc͑cSyo1B~: ;BM4Qd.;JnKX?rԗ?╷P4:ˮGΥ=K }~X*R+v+ ׎NOJz ԖH;v&Ir ¼@VD*l$k/x٫r( #'vkx Jٛ4A=@li]9IGs=aHRфls:bniŸ5//Վ=HRY^$+ރY(ҳqeY cyEBuvōa>J(2( Y&m&E@ ?)w{& dk ʮ΀*?aQ 2Hv}<c!7 <=CYCM(x?p`71=+AJa!Tz'ܖ!Jqn6p38|wdx~zt=_˖4`\|rT;XAE%Q`kb X%V5μ직ОoRk|-lnQW-Sg~ CMie9'Mb&{A4۩2G#-PT>aob'%(?\ ^f6yYb&/sA s~"'5z/ᠵ\~n ,TOX쪀-^YTٱ&?a4Tdhun~ͨo L1M5$-!5-e|')Pu*Q¯Fz'R:F^40𤋮cua8𻖩,/9VwUX%Gx KVDZ(;"SBM4i+8#'#Ĥp^A~ǍUvr@ D8XmP#A;9q;FuIThK1Vk&XCJly;1xi> 8dD NB!&md#N=4~ (3p\% s} d}ĴQhf8ڴ-E'$=x(|u@Yq*P{(A[\&V2 I=g3{=?kFƝpL9 i?}C"-A`f4ob\Ͷq`h-3fJUܿ١[6A/8AAl 5圼陭ڭ8x*-j}s8,ف̧ H?V[E(֟̈́[GǺ("!oYcG..$!g_Re""#jЌ0=` ~NpN2LyeTR Ģ R߳yaKM%PM4+\&JbHчkgK{y%I} "V[Y e-ʹH02lZZ }$-0lU "TT{QZ3-_CܱpŷđWUxD%#4>1,fWK_ =On +GG.`c|B:CSjH8<鸾Ƥ\ek5O}^V(z'6Z[} JӇ#r)ian*zgCYҴSǮP_UG3QH{$Jgy(߇e>eaq=qS>] p@糗b>!I:SP 䗁9\XZ,\tgW4rSVE3}jcK}-~gc JTYƌXUK_<$?CHx-YAr`SRW{9PZH>qc֜@*י,֧~\a;|.ij(ּM3,[ZH.ͺ]Qx*0^+j %ɜ HPv^y wg?,_>4r(=MAl}JiɏLKM|xUGdr]y$1"SLb`m)PFe)H:QTNb 5Oh@ sYO7# Gদ֗s.~BDY~&)v?8ȉb9p t+wc4W,!+ TUhPVW>DI7w2C?>Yxpe]l ƾ;RI_:5 >Fz"ufc# u(To#~*S"۔H`$ Ӡ-yJ>Պ:q8/ Z1,OmXA%Ct{܏ib8ѩ{ޮ7Ep|5p!*9g ^(Y/kyKGasAg,^aHDLC=oƏgC&k+ Zh8|)Ina5teޞH[TZ-7,aNMa-Tc*Nt,xK9cR:(i$&&lDXrG$5`TB|& =vqoeepCC\tNzL¸aGO鷭=աv9<8]_ɧS@l{ S<˽v!jI/gu+j$JAwsY}=¤hJ%|' /3p1j5)z4 EV1UE('jzyWXx&?iiđ=瑶Q|p\, B(lK1Y/C9xzv}θ|-{ 1jY_BW ~\AJHi"󲶍|j;Cy%T_Ja1UR'Vh}FPg@6aִ-XDkWjP{סM&q?d1sk1˵yt6Q$M(0>귧E2ɯ4ŨﵨUޮVK@fރ'1j}v>}[R35wժy "Rd`mj~jx]LSJH k>i:yy@vrN2{2b$h'1,x048YwtSJm#u+hwΥY?A? +C)rZIO$?lJ3E#0΢*j`Ψ@i]e>v* #~̇$_\4vv] 1:Q0+dC`Ȅv%L)L('x[t&O=ԗ:]*FR>eDrmF\i@ѷz@er@ọ-xYR:ڡUl>pM͟,\.O+|<o'4lt47F 3ns<0,meĔob yeJ7H4+'MRn'J(VW'7wx u N}7~)UԻn'Xczf4m*Jb sγOD4iL2&ϱm>$.df7,ۄɈ /tadٴH'38`DH GW>3Wu,hH0zp^ ̴ N?.)l ͦly9-W΀3뗟wT4 )ŏ,,B(EȀk={e~^$δh"/E⢚?Ni1czK8q{Kb<5Z9yy#rS gϧJyHACSYn| ~2 ߷zqk,E x śLSЎ[uK|< ~ 1}'owds}Wq_0i^}A6(|[t^y".w@:I=-1/2mYSӕ>J‹Gr1L5]K$Z @D _OPZhKTq[B?mwϢH}}8E~BHWtI$Y{%4(/zydT;rV_7f*|Xj;Ά$ʱ>KLZ?qɾIP4[-*$r%!G[/!o^!yZ$,䊣ww. e ;ٵ@㡣-˟qkJF͔gC >R$|ʘ~\i3ur!SiWsXYG-u#|nB "XaV[)8$0䋾j<4rA&6PJ<$!y] dvꚕT@^Y/l&ȼ_K>MFr2湅z HQD&J^8+iCfHU/0 Dt`s I#i/< 渙qNU.mkHT߬fE;qIj |k2&ub@3eaqY. _lXEtH;pw <zbykEoZIoZy(> M S~?dB3X#&F􅗤35oELE,xwl{vx 1}\̭UCBe\+VogȮ3BveY7#0v0CoϝVs!5a;SR4q[wֻwN}|Q=C_*'] "Y@0x?_g>W)^$0L…FW߁=ɍkN7J & Vͷ^<0wa,xN5H﨟R][WW,[>pYz)iNIS_1"pZBQ:m3dVfGn?52K+|@Ry>FN) lX@ yٶJ4 wxB/*)屲EM̗(LI3K!d]K:ކB^5pyq.=>95'م&bۇt%TT1##]?dH<[; (mqϪKk  V;,lj‘)4Ak>9(Cܯ|}+̪_j%h"XuwLZ L YtZ&3XK lC).Dj>a*µ$ R*̌/Q:$ X_!.g -bCp|ɪyLNn@D wK;b:hneYM9FaUk}ʷ~ეm-pm:$'l2T)=5 u~Lmi2+籲'_5M Z&i9W.>Othzez(f2K|k(9!J$6 \ŷ7=gM%f][U#EщnP44קb OJc"Wjb^^it΍W{?EkE=<X8bT'dDGl1ɛ{ alφЩ}9@4SMoIrW AaVVyբX6BcH9w~s0LwP X7c}tiujO<glGGIhJr=EmaDɲsU |]Cͺ^i6n51n$r,0ʩsSđ@A7p\+c $B\L g"4wC\BlyxƑ۩}zP\y̒]ZW7"A=={3qkY#UyL ?} 4:H A-ẁno"*@%I,ݝU'#`4xLQax:-OJ q-HTc,XeRԯ*0k۰ƀ'?Np]1v2uo9JV>&keN'KR=7ٻeLҥ/;֜qղq&!d 9bbȧhN2eyaoTARVPV"[Az(]L! [JiTUSvG!-Sј3Wuub+z@Aה(D+fMgf<7Jvanp%gkI?3޻o+iT6ϓVZ"г<QGm}VVqNbDN>Jѷ)).r `X˃45O"GkL$DYϵ=_2!^ 7Z;@>H 0uaWI"a\WvM-k {ڏx͉&r]y4K6䒘G7cQE`&X:QP$ A5ôx83Z'_g9BW #Icnsꙡ>l܅}G-g^U:TζA_ų}Gd)b"%*mTD҆!Jm]U*&9mi*$ L[x1uq[lwn1ԑ~/LnE;‹Pޑ1su0n>G+&u-=ǘjLtVh]r!;O\jN`",+tBe07oShYDLGBh\ ޥ:FafQ7ߒ.P5,o-s֏c?;bX8$mZ#S|O@[*9ki-l~> kNҪEj6kc]x0axؓ OUZr :`&'c 츊`WR66l) 6I87$E'i<\*,}}{vօZP_w^6>W Q5]&\8K8-G%X sw5>xOP1ag h2LI5:ӶU y[+f%R 4:U %s)]vu Ϫf Zsȹl 1mF p 8#G˛1VN0/}ⷠ}Ru4%_U,\vyޟ!Q2j|\OI5 )g;~RC0SqUjKۿ2Ĭ֘iՉq\ڼaC\T.,\P (|^ J"{ccj*dG(ڑih *[#^VrokYLsSguJ6p@ύIQ̛6TmR`NKq7dָ{ɃxOn =/`b}`9*/l`t9|,~v0:!ABx/*φՊ%e@9fr-ojzp[;DDP;j[d@hOND/95X\[5:om*A^:v#6Nz}e|_d} kOyau^G\ TE6MD}8emYHʨ5fM:sg߳M4QE+l3zg#U7<]KGX)9 ;" VŽD1p%y2аY _*B5G hұng$ N?O53vor-IHԡۧflkH \`Ep<,.qlO\ \z+\p`jh !;@$8Eơ4alȑamYW;as.c= Y{[T&jx#ŧlope$g߭ T'aaм d@qmDҎP0*q:(p*Tj\aJP0cyOk0h c@ 9/G ;i}=j%N-Er=a;ܤ/ӡKF2>y03ao}`eTi>4"oQ)$|8X;*qn84EI{QwZgf(jF"7Ek;"pP 9ɘo^ir62-u4ljax9JAu0KcP!sb|r^x3SIa%6~:x{f>Iu?=ܮƉt1`>4qZu0cMxYI*:.Ot5&HakV(ɋCJY {C]tÛ$C3/(#* 7}9R)w*ԉKDQs,;=hP?u" e{),2Zr\30R(Q^ۢ춫*i۾eYO yQY_Wa 1mWvrp e![/qLe zËT`!E[ݔ2PFeII,Ay]ǀ5gDogHAVn(&>|5 \5^ް'ⵡggI!B7M:X!Tޓj~y\ۗM }.Uйw#.WhLkmö2Gǡh..hc6[*Ƕ12;LPsm]B<$nu7E_b\a~?ܝfY {CiÞ'N| ;䄷gŸ'*LB܆r2NIy,u^'MZl[E'W\Xpuvg!.+ŽTeK-7LtA8y 3E[,waaJnk!!)GtV@T1t^=sLbP eUӛN}M9`s\ds^ xFیuW ,Oo"ÿ I.O{yk{α7o>rGNapdG9 EptRRm-zd6#$y^c〴9h3B~|nU+ۃf5mQ6~фz\OSq=< ^`6FgEI'RyO[h?0*R v66'^-ْ{[^Ml ByLD\rN#;F#w=ҭ<77>WVE? WV\.P@7\n @E S)S {Gc/!HzGnVb6  8z+ۤgh5J7O2*1%4wh ,@>獬cr<3nTT'hWfKq UXAm`fFtAfrQAMSO3!Y!IL<:Lv(͸);"9˹yLp5@Âh4<4Wr6€iꮾ]'>|qPiw(qa $}BQ6ٟ!p2sP Z۽hzqn:%ָlrCK8 8TT\M $z)~TDJsvȣ8 yi[N /9uW> 7X_{)ˁZ*yw:1pWh ama$YP?7Z4X堷Mv]LAF&C BwDUAe̥Dv2xN.2B%Qm5Wg%HhgXMw8I*/F((^Z`Փ1CC豸9;:P*q ,]82=9dj՟fB^|;E?lw8MݞbRD Dds:vVOAk~Jl%ל-^`)TCGх7A5k7&Ԍv'i]zZ^<4ueF̱4 `I0Uu*b8vӵ*lNʏ^nBX8܈h H|񩨊"Ô1B^2f#cʽъCpݥ{AdUx$Xwn4Ws`({S64::MJHڀER?P]M)H*s"X@c h6/ >'-w O|nI M$6$,bd,SЃA遪E 4B*=ؑtjMTgH羉)3]=s:|X6m=݅܈{] dTcJT+1ZkD#$g[0#6<`/*Y3=< jH|b^ćk=_"~()N-_ġ cqbQqڭ"#KPp5A*lGF'O}6K]L:Uy]~<ʔ'f70,-9rr3ɟn06s?E@Z7[5YkceD^Ak.:<K; 7YZ$(#&/hRˍF'P gCNgKѨ`nGѤj#Ut:Wuv)q2y9 +~aI/Ǝd10i H]W;4WfUAkO9ƾ MB $!5@$G]h9Dqj!#;e?x+JI?ͼ5E6R&Ŵ/ =o᛿ub$̾*EOi]މZ!}?i)RFrincV~ʀ椭,c|AmdR^ڌ]E ό jvyw(װŚmv_pP7 a>#=˃:|ItZ5z^n»}x?cGWHTkFг)bRIЇZc/0}r5*} b^ gd]vb2N2=fUIa]wXL/2wp"ƥLX8_k7!26xAu/[MO_Np w uCRU:/01 (my%^o+UP IH(mS&Tyk4W]R{ظ4挖2!a[i$5` Z"7w%1"jIOp=5hsHǚj. {zb E:T ʠu b*$?cK r7MtxݱT XR02JM9n, 4k!)Jd{jM-+eqg6~t@%^  ]zDz{I`h}T޼IF)A :}e[ d%zZZk_<$v P@PgdBpBB擄dN!+feW9Z&\ĝ%7n=Vt!Yx=-k악DTSˊV+ňsvsn"ʋ܎|"^oZzÒFaJW]Ve;oxZx6lҋ* 78Vf6a' %nq{Cz\6ycTQsu%%=Ӕ~D{ S6J2۶|0̩ Or[V:U=: 65ұm&,[Uf쀗RF0Í:(Zks]*R%!yҳ<;wNE~piw.-"4Rl`;>Q`nAcԝ}pi.#5? DLlM~&߻2& `໌w#(X=S\)>%Lx؛hE]*Z(.4\|RA&d(Ey37/@*:7+"d}@ $0MJsE_Z'y̓&w$P\ܹӺ%tewa_ydܻgF,Q HfQ4>IG+d>|s&q1:ˏy$}Z# n^&iג.h{'熵kVQ<%W)N0T**%(H)JfEWY@2&@bO?e#$"Gݠ,~e75k1 5N-mMClPӚfECaˋ0nϫ6rP6^ sAokW:E/$2X +\&@43L,*9"y -r7t+ $cz yZ2q=hEAq* VhwԸWAWX ?鳊 WzSD`W4% 0)SH5t~yŠ2~9y^H:ؖTSL v92ƼH/Շɹ ۶wtIcnͼSau= `s)r4!0K^#.Z+Sc-\@! om51v>H6Vأij hA "(C"uB7-"JjJFtav'm/LVw -{,V'z 3N2#[߲n%BY [s vQM,~`mAN`FΩIp#x)'.O"CE[MBB zbtN`,)M'Iͥ !8.7xȟL2۽ ]EfXu>X`T1wo9ٸ.D.IfeqQ)xb)s ,{UIxKTc hî>E# x>9s]T)eaB>˛T41&fXJy'6N<{W֮OJݜ$Z/dNvZ%M~Ċ(w+۷Mk_^< `OT*@PNڢA`BrEreݽR%'x>AŬ7ʟv?+EpAlR9<;UXp!ܜĥZ!s$p$!zYLo)k -hҞ`(㤨Q,HʣwʵfJ*'lte}Ê2U??u>#=4X|S%m&ו93EFX$llCН䛙@n!G\pvkwxJ1 pHxEW5lc"xNJ[/zjF{1>W}g0B9I Hɇ_ 7*m9-%[e@*i }seZj16{ll04oCK na8PgT7g$MwLkgvg?ªClZCi  Z%XؖJ,rs/IaQ8`F>$oZQ7nuI瞄~a#noeX-Wt8pemVؙ$%>>Tz47@XTScJ1|SKLsq*:0*^4NU1צQU!\ruz̿)E{5OЂ73,A{^7>K(E{X͆U.2g+Z`.WdpQ=8p.IC35@^g$A\_`"[&174}l9%jEL71' {iZlG`* %![c@5d($(Qs4;*F=^ʣI`,iwf(X+VJ^Ash$RjDL;DQZm_{bV :;_Զ 4Ah`δ,0xa'䟁Io;ԑjNs/=6@R!so$m*H1w#,DY㮬9(dq7*չ-R x6$먞T U 6{==7H_@r  Dߨ$#wp󇄦 ŕtUfleʋ`UNzn?5I3zI"VB ᧁMf3l$wz9fF-x"hcA=%FvgVV`~F@^Z7&F1*'`)̱dfFY%<ޙkA qz*}Z;eӈܝC$CVr07r2b#ېSe!I85-6!*U]ݕ(Ԕ bNG89A*ނ%vtYīBfXI֝ 2].M?ejWkF#߾̗5#ZQye'S\j&֡rEoOfTDv`d}x~xo=B_#*ԫ{#~>%`:.jqrR{@C#g)b-BҦ0s^HyohZ2ʕ53}z B2r~虹Je2~tw&c \tB߈[3 u ȿ^c\K1y6bm-puHB0\@gv9*672#,/pM|vHb#S ;.x"c'|g[+OU~R6!ۅ*i+fui9;Gqvu4pB[*4ݓ{$.d HZNǹ TY6bH6ܗ$"NR`F ~Ws0?;WaO<75P0rnDCtV?OLcfZ6o{PdTE&!P#ISE* H<.`Z"ýC1:4ZT7l{؏CS8?DNXAy8ۄ (QP 4'R/>wD5ۛYh]D TEL]-AR<vaV2O"}MlrT " _G&=eػ\#i:OKKԟImise,+ RK1=yOQvBAڕw /K\y[UiSsml>5=G1'Zr 6\ lxGk]1 !跭5[L{#e(GlG@XM>]"&묰V~aW[I]JAfr2E7tT+ս"egΓIiK9Sol{u&B"ZU%k"9)Bզ/?zf շ'"3L7/e g1ʼU1G(o=bGVͲJPp8"w-l4aS8Dj.o]i(A,ܡ=Cq%Cw?*L֜o3y7$>!䙙TzFixڥ-e=<]BGrZOoєHRit#7vZ̚3&/..AwkE8x3=T!*Zod0YB&Z,o{kAg7)Su!^\6i{ս@qb#0bgUNeX<9 # q0؍q/"/~qr0`qqlR; nDj=$wHfRzB gGSUT{(ql ^ol 3wvUwӨ:M ՉG^)nbf6bD3Rn- q=sV[۴7)ST8saSU(pmcK|PN842NYcqy^ rfxv0J+Vn T$JټN 1w?Yr0c%7`UlMB!hr78/fI IYqZVí"8bC.RQDpƮE2]AHecjQS !N`-X52G6xǾ\NsCa}bbړkmJ!IB~୺鮮Ui8͝j `՚c_=gC59@:'MBFom#EFCRf^9ΩH a֨WH3*-`v~8o'ZvN3yNyxчlԷ[hs:: ѝ,sTH o?hOlW`4勈kZ@B%c=Xa=L0_yϰzJ{PSV ]zWf2 Gb1>hCpTU%¹ߕ>R揹AK9"5sDw!cNxm6\"zs3_dJQ{ 4QjR9Ke#?INl>EacKlk|E|?&L4p$+ߑC gTXFi"dz7DŽI~)o;_?TP.7NyDt]gFtYȃn~hܷďMu,:>3hrI_JEMdoRR̬ J+(HЮuk ~"P͏>#T.MGJrvi VU,[#Þ©'64B/z%{EO{6/;Ql? hPD-|}k?k==r*ճfɺ?P/'z2Ppr}0lo .ik\0F"~[;}䈺"tҺ'?җ<~C꒙kDxׯUTʳV!JLb,KvFe^W2WћU@*}msѐR-5K+݇<nP[KӋ#7zlzeo# KG^Ya_``Zeb9G_kL-{_dT@&WKVO l@{  uE$2]6T芐[ D17P0.@j+-\I:?- 0#n[~,))$2& .h'hݪwYAzcN LWa".ݹ'+F!dI8φO;44]L.ÕQ'M/q!'~^ ]VPx ½j8npVxl1PyoT瑜Z,qp/qksD,X_|`ztZӂ1B,Q(H2,̴UaNH&1-R0D qE*t10AlyD&OSA(21 Wqd;~H76p~SR\rA{3>s O]G+5w4 p+ҫ_B{jew(#@%uνFRlbkSH;̧jGZ# _O9:aё 6HK\B5P^=sLpH…uX0i;q9A_ߒ-+IWysV$7;!o, I i"%C)Rksu$1ˠ f<u5I"o ׉2aa愼K ڡσ_ܶGk;SvgۗG'hX ڀLĞ9rVSq,=BpRI筴G)'d:HO}eK9E־)L C!~qcEX[3S:< G;G?x/#7i"I_2 b|)$> 'DpUB#Vڧv .㟽 9p|A܇k%'Ro%W=gps17Q6b`54C>v9cb"'AI eGkM-whMc LK:nR$fUDsP$875:O &P=ߟ+n_U{yAQKٿЯ0z!>rJ qWwPs) Y<舎sxx+#_1<:k q:S2^nx('&坧Ps#h3 B96 @- ۴frrmSCU;``nNJoz#9lo$ A6O uRΒhZ8TiB`%\qDVtoC#9]_s%&.E%/ʅ{ eP0> KX~_G_mX|&.i~f[(d\ ӧx`J6>-io;/S/7Bu%N w ?{T ^ޡ*?.- oN d6fZ*6c_Y34p̲J8ک=Tr4JP{H}| (IknMlfWti}-> u/ w3WcC沇bDV[ N j>eUvGO㳹q.iC*>mvlP!ᨾfe(G6. ٙEf)]I-5l[HV5ӕD0$noju_s`J0p{u8WCRmybw&_a"Qb:wL'C5y)i~ Ҷ]ݣ6iFN+:RČTDKXS؁ͪ.w #MC;D cxs<5C<|QѴzvQ{B]ЛW*<X _e [X `dQPVO [9#lVԎcīa.+, AuP6,dhCԂ,gȐ \)pܗ2:O^ 2| ?8sԘqGˑ;%`n`nУ||$VH ǔ%`f̃ \o[ZЗ,QCs\NN<] o_]x5%; vHR '{!A&瞉 f#Yk=Ea.bzNŤ}QV΍ S寤aNb:p# lw-Ena=mV4*:k?F]hq0ܾ=,N^j˵6{EQ!8,x8x' w=gB,i ޚYcufz&"Wi]][> N{K')GrK nZw[10YْR5[qH_kߟu߱dW3O0Bz_oɋ0U/c}ЖWm].ܤo3j\oqxp.a1wMyk }~kɉHQW5K~$9 7pDHI:)U?N+Za<쫃<#@ ڨ]Pyu~r|6aX4aY.*،Ȋ8689O. 8vH`r[& N.槂OK\Q3Dm7Kܣ84Hq}eB_>p;⇐BVlWDCݒݨ3u/)9LūQ/11 t C)wF2-U~Pc盤C⑎A֫~41qTw fk K<@>f2EG}Ɲ^'?|!v/d$ >5$R,jm?fuO&F1(K~gvbMKS-Cv=I.,o>b^QzLl7:6!>Pxh`lUi*JzD2s1)Mbb˦Ȭδ&o CO O EQhStRL+pZ -9fuH#IJYvm[m5ضH+zvnb+?@kXҫ7C5ljP>v3xlҧlvaʮG)QD~*~msׯاFd.s w/5l .` J?w_R0Y3[}e]ǀQPapkBFDj;oP XRΟLÝ˯`rcB ~+pA}%Q\|Am(kBs;{]2v#EA JkDJXmC6R)g&.θ8 (:Ĉ~c3>fG4@T/{S@l'?ƞygu.V@P0(m:P:LhQKC*Xqjqn}{)~">4Ӧ|ʫ, {X{ VѶx*G^bwkx=ㄷQ"ϮCP V, 9dh^$Y9ސ0Ѥ" U=`rMEtrYjvBN2ے{E1UO4sQZSήutIvLP7O?YTxS8~{kLRAOVfE[V*V)i˜R ߁0@j& ­~X(#{i)`~p!xEhUú䦣M ( nJ%3ceUxCDV5(m4hk3mW.oC3wxZQ\؍"ҥ| rjcj*XuF&v# 0S*26߳6=X94++ s/!-"dMĘiz<֥e.VDd@8TAl)e*LzNb^&YTdQɍN CHgxAÄ{:a(}ZppqA6 8fssVK]v x*$b NEK&$%ti,J÷q.*%$=k7lTq26~TӰC $jL,D*& X>j/u6$N yLC.,ӌ8:ラr /p#_EB{>݊Lo0S&Ƙ].ƹDJi(-i%_g@fxYoNգ õ}at7VBg_?`Ѵd@!mV9:7K62:bCiIDC_yT kLcOm1p@dM+j6rMM<6U@6-R|vy&ڌqb*X$\_@C0Mse. Tލ&i꽛5+00bh szPj܇~>=Bz3:25`ooQyBTqw F`@,ȗ\V>xH /Op]oj`{lfEdJlCE rhl # q++52+1e})ںШ1MiY}vP-c+aB6kWE,PNct'۵:8˃I AIM]5rrsY`)m(=͞?)$h a[z5*Q.;6O-ʇ+e xz9%R\lFV/n EnM{[b@"ٳ1JG~zq7`r O O& T[Rz֢7EsPxf6! ௧OH1vj9EDT9ž{wgݗ\8! 3d8*R`ʷsb7^मIiw@7ʭlo7: Н(:GΞ͎BN)QA8$UN=ݨ%4&\p_ԱO~Fx9pkqj򱙟N9eyj?m_ ҎێG $AcS<լP[C؆ckyļ'2pc2jyM$ % ǭ :Ksm=%Ol'䏇].9{쭸 =/|_TR^KI-#LS-)# Jz%9N5Bk{M&wi9O%WJDM͉e(}3F0nwYSؑVȖ?7mRZIIm鴻[jB`6aK >ՄV&VdN l?Ho7F|~,(TU(%`xj"sEب0(uAh?K vF s=.7[q =NeOK0#E:NlPX=Нww@F6!tT۸Ѱ#S+^)dB0k&ϧO\-J ":,,/%;e}Vݼk.=oڷ-熢Ƒy^9tNc-R!*eq]Vf I|/Ɋu/Wa-Nȳj%7k2}Wd &ePlZ[Y59&2B04P ^3!;~`իU^(-C7ӧ41; 7Wxtmi;13n!\'=ΒXӌV)q]˱À2ҠnͺxN a?il6y h(P$N0~ ͂_bɀr}gbk^ؠ/~y3ƊG֪noJ߲U(޸APV :gy,uGa[Ŀ":fGI8̀)J1O&`ꀨL|]C\$ _ Ґ䒵K1ŀ,d{rp +0%@jg\YM #Q WV:֚4b;!]C6gYDc7">Kp/b>iFdLj} cſTZqHħ&cL7Q`$/NצOxRaCqp1u?}_EnjmGrU{7qVd}VDT7҈UzsrJ&ƨ4*-zOzUt{O+[ސ.~ _ 1^Z+{TJe3k$LoW"͓f׆)lIEQºE6dV\#C]78hN?D:W1kK[f_`>Rưۿ( _8}m06Y@&fڋŅ _gӅ3K:3eiIJh6 YZh[mT?CV.*JP[6W®[. A;cLl,*c1aX+L+OCD\C^sZtf_լXSi2Pe y+$D|̫8+YliK:-0Ԯ"jx&XC5?%ΎWK'P6f+/gNȔma {z?wIop!/'NJd݄O=#$}UqΝĨa)L㞗jO"?aԡ3sFe?m8Teԝ<-B^Qʑ] hi}ltO5/5ړ4 `>j4fmĕU~-O@9(/T[͹3'Til#%39Ԭ"w x ͍r5r}fG ro_HEft+R9N[sD*7jS6Ұ¤A |A}˴n[gSc {);/wR1$9:A3qdR;⍞'X9'E ?uI6 5>9 AbAn G?<_Y nxp[f,1|JIalJC|WP|?rWdCX'r52(2@ JkPxuY,j P?'')Zl^0p>HbY">N(ג>* Ƽ%%kVXҨWgI&^ 38ZbDP 1/ׄQGά@6;:q2}v"[M5m{DkT. @tk9ȡE•?N<~X 6*; \e#āײ.r5PkgWk D5 iº]3 P˜̮ړPY [7YT?㋲bV7tsXhƄ ʿM+`٢L5m!{mB+p9ÚY:c݄\`Q:/X 5cRSCQRa 8\^] qtO4w{4\@5Y_꼷|էCoy) G*ZQ#f8ZU+Eœ(c֕`3l԰Ҧjq`d_/O4 x=V]̔j71$?@GhST@,Am+I48L9ZS4Zb ,nbSt"wR|4 tT@A)h@kqlQ* 8t 4E[KNxg-yGM>W6j v 30q]aMoW"o=,621tN > rϬY:רTKD(r$4XNC^JU,dyPK4 ,Wgsq )wdQe{~]l  Bu5"{C\bx+Z3KS 2.YկX?mYw U"x=hT9K&91Nif9!X*?| GYiͨ.Amtfj 4nlUW?w$X$ }n VI<n`ew_xȹ {e"ء\ d% 9reՓ81$1n)IB'O1 C=@P2v%nj9)rj$ք.ΌIMq1xP5P\iS*dW+g sM{N LȽ+WsewT4$2'ナnGV8,Wu L~PbI+2DJCx3PGhF9GT\U%.m]X:ϸ'z-fɼX IoĹz×\ Fa IeaV9Y.6̓.}X9lB15j|Aj%t'0- B]9F4?]GdJ;O[L.>X`WUu iD2$4Nf"aٹ_(J-~^ZP Ͼyd63k(tS=!J * !i-s*>-l ]h~[;/> C}ejT( mʪe`aU9fB/_x>1E7~g-ߦ`C33t׀F>W3".bC?xc0 e7sm!{׻B}Gעt2ToǣxxxӠL2iR6q-E/maS*Y0lT P >£K!^=+g:.u`:پm0ÊQߜW\Hdp~TQH¶$@C8qD/K5SQ# o[Aߏ<칪w[ f^=ޛ%7!׃?5sZ4-&Bז*6< tL<*M;wq 9KDHjzFa~*w`NSUؖ.<)QMF]#2 2wƲ*>H4 $X.=wIUKUH#s>JOhf1a-vwxT[ p6d 0!D*' JS滊`Xmy@M^K Xޥ2pG1Gy/BD&(3~qmq;;8($1HojYq7K$ voQU[ Ȋ`lغh;foq( HV-N"i^eYj벲D.Й ( s-Q©WIAh>'m_ OUJMUs<^J"gh +x!%h4IiEjK:Z,AU:j?榓!/>jALݓ|G*a/m=)eN7\0t߽Z =( Q71VnF x3>i>fzw: \5RDAphJdcn?fM}۲GJMXyxӣ-ؘmJ])M }šyW#O,%j]$vvEoX1V! -R0IgܮN^,*qrtSI*ЈεEG $)}TDUP%r}$>7fvRoV"kz `pdX4[L3:,|_j^C (Y1ŗ{'33Dܱn,5%Z*()e<_- ,b/9NՊK#JhBp=)bo.+o={._M$J77{K5+@CKi#դajEg]Ee1pA"zc*2ķ]k98xKx|H(Ej?9:vTܰ &+r)/|;^D=e"1qaԇ8k>6P:2#6Ћ`A.#K٢Ȝ Q.05\ Gu5Yq9¶&ǿ+YrQmUm앿t&۔dcUaAh3M@# 1㣏&ɢwF YܮwڵWBf2F=S_5ҷfJ˜8D8ή*O"=WL4 OȚ*r +ۙXL0:Nd:LkJ]N%ߓ }v Y)Hw2 iC~*NDwYN/zt/!G}Ӭ:t ġ*#Ιmڷ %Ƶ#_3ݥT@+ ޿C&?_{j 6|> O`> Ło;w Q ]b&B])"r%5?"ܒXQ霸mx;F8|b`'0LMd/;;=Cl׮ƃV23R1OS"N8P|1lh.e =E{1B(sbUG&koZ >c4A,\gù`a2[y>1p`SC+deRY(~5p5|L;7@[p=!3j' $i͗ hcϿצ 7w̢*wH}4yU"y4LN%@A#l<ݏ& [Q+(i-GYѩJb8h'5Q!|0}cwo:ǒnN.Bw6lU7~oh9`쁽v H{Ȱ#;C]iH-"-pS:& j 3'fou{jOn?Hs&q$5ڋ/ %EUAfǸ"V•ǂ߆;V-|E)*?G=  H!%uY)P}-MTk'!u߁SB~iIZJ9LjWXj>wfe/+i66c;\Ǜ,ќ xq7{5~O,D,*N1_0Vgީ !6yHm,P$R]eӈ;T3P [|S/mƮ m8<؉#l(P+,[ߴKp+_vwn#}߯AwB8"BR@s_AϿD:`T_iyZh=W`wtIMM.GVK:Úvq4:dEA3 '@kp}˚LLfahA N+zJ)s1=dK`5z"V_T$)4tLvʃ[D9pDq7zDukciiMQ,jsz?mFN7~Q^ʴOMR3~/a7T|J IrZ3}4wT`BkխʏGꪜwbЀ{DmGG2x%@ۙBiڒ}^+1at(t"'e h܌H,5^kӘVc<^ʱHɸ} qG@siBpH(!1:FVq5m0+F ߮r"nr5`Rn6u>!ID:\-xETiz4l۔sxy.ܣk8աhhipB12/(⒯V: }IhԁwlhqYĬي}`=WS{g0`3ڇmaMҍ QjO=idݷ2~ :U\_ET@ ȳbX{4e=΃͉(Heۗ&R0y 4v~ZJ'a:8.ḩ\%dq 2M߹$o :~̠JJf|'6#L9ϊMM#[_YIkX{w#H+/5Vы;J1Qs yqlߍuF1rӕ`8CFLIɘ2 .Y1}/lIMnidBL 0q/KnJTHKO& Ƹ!ٚ4V& Z */ȖH. _d%.XzS`B!><}xXecqC5\7MֺkdS1 ^3Mڷhm!<(h뚈({//R^[ 晅GY}cPhlgjK%*9!ƺ5QEޅՈ Q= m.vE/e<( Mq\괪>6YK KT}FY3:rm-;mfo$%2?+?Ǡj7ތp({l2[H3"M]0s&,DV-RCR]RX?jJSD}S]o}ezg]r*݂&5ޛ!G fv@t_Ͳ!;좙/N,^>$7`iL㩻3D DQW6쒓s5v!|^Nl܆ SQՙH}hs[^?R"=7 >D?[b&pMt,cspY!UCۃbA\PQ!nYse4Dm7 ›2J,6vBze; ZDKWY[ 4w-{=?gPN{u+xEUҿM۾jyr.lkNs(1iC큮gzENvu)+vk )CrO4_ I;Tc0I&BoW8~ޔm 5nC8VGHD^8 YIUW~[aw~|*YQ**,ˠ>DUZL$A:Sbl7z/hDZ b 4{;6Xnwg?􏉪! Kt) R͠Z9 sX$.WPoä$Pp(\MRߠs<'cl]Sy\ bE+$' A͛&SM; {LpMUX^ \dy$7|5𢎚]bYv>"╳fnwٖ/<1 $G6q)=Jÿ9DZ+kOƖLVxO4S`Z, *qq&)/r5 I~E֠bI`6 ,ZFOym~գFgNB".vϼyy>EE7A(F4jvl9WԍзUm5iǯSUa h6T9hhњ>- 5gR.NS=&pV\[AC`wh!bNʲ)"ih< cP8UsKdT<Mm[M$B (Z~b!9.s4]Z006e~#~Oѷ{R'BW㮼!e]7'q2N3o=9q‡Pcl<6]²N2#nAWϲ eԝӌkxқ gdS[=ԚT =1Ot/q*%ށj^~xe&x!>Hg?X:BSnQ;CATUo{;CkV:iL4PL,~aGL4q/|8fc`05)Bp;-\Twń<}9O&9#+HX)̙BhdFǙ$qIrm@˽ʝ xөdG#GGAQk:YDJVBA2F~˟szF}"(YbL՗ {=~1׏,xl_+M>Y"J,& a<7< TɻI5,HWSޘMu"ۿK 3Zi VM|`B΍12N)Emp/$ d&|lN8Y{t`UP"֬ey,@eJёY ^ҏ)V]|ҭj!GD,UT՘r \"NމCgm9&0+: ۖRd=Ct#H ?8 Y?ehP< hW&:`C5iDO& Aчdzc$}"F[_wIhJwu*( j%2bN:G-K't}:!-2hJStPBS,Qvqʔ)._?}{c9c]vO~h{avx?a%Yc$> #Dƌk]B-:B(h̞Nxvm+xe(/wREﶋ4ud4x'pyHMm\lR^Z҅$-ʵ9wwPI97ʃ[29FNb+?Ȗz:\2vDһA__^uw\!l&+&R,GbG>!X-QwY7#`c*@} zBRE_#06b )5 l"T7Əʈ [xJI!fy:[*8Icd頀H;lɵmD=~Pdt@E [!hGȥ!ʒ͎ #W~`fy/o#$睠8+ys.S"&A6ElGZ 6{oP[Nv7~ #dQie7J_gxk,rK7] oHe4{ 7ho}]f&Vdx'ߦ(jB7L5"y7b3s^i"> #reWוbn!uʮt V.߬HAr/|fWXCptvJصS(A1\G$%O2^t  /lӴ֊{͖d l_ˆdw\;6X@(Ihw߃e@|<ַ]t#XxԎ_BnIbUv 7E[~Ǝ1V `ňґK@{EÅ,Τ,3 8|_!\&.\LR|^jP_ju lXDC-rz~PӠ?"'#l䷀OP)*^K-Vx~՚bBN&^&n˘nwwn;уﳴ%prwUU]gvY?|kz[!UKrBn)<)mW|_X+/*]PI9x}~W:gȮ̑)FgqgDzC1BR|nEй2ɹE|N)jEm쿸nΤ>`>!R|[xWbrמ3,RL$hk3r^bD^}'^Ch9}%Z䱁b{J&-dq#{]2ѱ0* Yk8szÊ ɷϑ<;P19B y!Z()oyi481m{G*Q=_N6RTo 5 v;FmןU0FOҝmP "#k6:w5F.Ve+4JyLi j{ը}8;Wy)wMi yH_>VișĽcԓ0<n+$@_Ğ؅mU3>%oJG]QSYoxa+xMi+qo ~R$*"Ek.A{d%-n5!Z8)@O4^d2c 03\r^/ǽ%OLě|̊u!PgGK ٳ}C qgo WKµ<WqM#v+U]acتv#X ⨸<󵋶9Qs/8™:.*qzScYuxp2Q7HN6K{5ɰhZM.zCŒ#{-~c0&AFc)sf6nX3]!=54p, KGsI5+s.̠l6ܹB3 1}2 ~Ywa> )Ive6$?lnq2 ~ chp<^e=|E`HJlߓ*$I<(q6ltAegS㏍1xj:Y*nșe.QWvߜ-`'ibwH(+UKe h=E7/Dl!S%BF<;M0.ՖΝgEbG2ʾN&~I]w#(;d{N;k XjyNQ;`ɐf+48@`D(%}bR |)nDhgKiGH GBEhG;kt" :8+ql̢[ݰ p/\׳#=MZ X1ǟ cRFi}t;?ؒj2ːH38T uhӑ\*[4·m_#=MZƮ1Q5+x+XQg+ Nwaqtr[Lrr~42Y4Na080k~3 3vt{}!C:E*\!gf &=~,,.y^2AWD#I!^9op@\HD_&HG_C؜x<ۋv3dL;ToHR8|O9H6~]n</ēDszbƮ_4d00-S $o_ZYB.}\}Lي5-o~o*워>3PAڻd6h{nͦ_LDx+4\y"YOiQdP0+ӻ:uq`Kšg:F+I7fÂva(MK4Cv#ɇT_^!P9=l Śc)m]y촷FԢf#v*Fg. VЇٛ瓛Yҕ,!;Uãk~J75m8\YPZl9Û *E \b2K[P7=hDCjS:UR8'݀o(TQC).|(~4=Je.6 |6ڴ 1gĆ9 >@c; XFNܦTMŰt"-nؕ =du[~ZwrM^&oǛb?\ۼ}6lEYHK7fz,v0ryx3(XxE}SٓnE6x;t1bc]BZŧL2fudu<7eV38Xx oNwG @c!z$m҇sЮrOEߊ# U\ɹ`Bc. aMxJܯXW#@58::a Kƭ/ Zcw޷CPDNg4lFD\p$w"#7!A`%PդRAny#=aiY}px\p,&r0*QcMUIa^X{aS~BML1&NkrM|ٝYz{'2͜1,{^8n!7DlQ?_*zUZt\YV0ɪ~n[H 3`Wϭ.u21% kK@b" Z;H{CRJ$ ;gdh| t.EY&.yy0?TPѯxQ*Q>tSAŃE`,"!I3~VZU(F" aړTyL5A^ `3F&%mr䁼l˿2ejh\( &$Bԫ { u TxPFh>gKn&|AH :NpoȸdT-U-4^j8,.mdпsymyyM(x#2-Z^tN? Be /n; 5vA4Fh*% hg^;&A>#ruHmH[P]6;5%p%GjZCl!kǒg5:N3 ?;GMt!8a.fE@N; ㈘NMEެRW(}9ksW KsוZrb`acrx9Eưa+Ś(g^ח;n{=ENd^`@OYrA{ߔ-d9 (=džIe](mυRtNnY1΢Yeq%iOAiX'חMWX2|NJUMwpo2:;826+Rf Ι}&Ӗ@D '.277>‚yr#Acn7|W:x)Ej)?4TC"zݾsA˻4dY8^ 8 5y ЙѣѧKoOíQ:qJu/s6NZ`a0RGE?lF \za -mAtX*Qʺ@0TUDT1+IV9q.Df98tlσ v?䛦lpsP'TP|W4 gyqd{H=v0) ^ORjіEbtˣ@)9NZ>֑RU߁Zö aeAc:Z,3_iC*1u;(] _iϟJQ[*'n $8DŽ.9 M 7׬E6&#pTpPO?:#Wb`?hڐ\ r~!jpe~H06,.R̼@_Du -X; 2M@}o"Z[[ixc@*XBs"v.6;%EbLx|\Rkiɛ?.XQ QήDl#U= (xiuýZXw] QMm $2tN\zZ%1Cַ@J:cS]}2м+3ǵ7hԖ>pw*G#7D2ĕDMDaNK ]ϵսI҆>BhsL/+qb![\2Ɩ]2-I&kdQ,}Y͠X]ފ"Flc_PRوO5G!z2 hRܕ`^j`0ߖU}X2 _G,upH&i(] +g G5иzt.Xk4p}~SnӆSpHś:,oV&! "z }2FU=+(:y#__X=q}kv<N,.v+ rh5 ":jBC ժF=ΖC[:#(S[q\rU &|r+csHp^"nZ}4[:<5XPJ"g;nP* >'vϿMH] uM_fxLQ7NjbC҂#8[5t}y-לBZg 'өư  PRC+if3A:QTP%+[/!I3/]@Mi\=] y^YZ&?w:&*U ޭX 3g#fT1$Glӽ _Kii p=aKN)n=¸N zG"peE 4!up-:A 1A/F9?-D^Yv \wDaaEWAޕ6+/:kơp Y1mѪ^}dI3(t@8q1Wq+JR;[`{C{L#mbCDs jYH&~_\(Eܬ~EF+ V}`fo{h 1&tau!+.ˉ! +,^xqnN;mrn#ٽ1=9LB;GU vՋ;pAQ͢8%)KRrȶl_DX<]͑rfUD3+uСGY ,5FYe6ʨAToGn4џ$Ҷ<jHj~w—_ I|s|IUV͹-^:FZ /K1~29ayħx?H0߀MX&?o JĿ D.%|`14_%8m66b4hG"ɹs@"NHqvH4298Ƙ o 2D "s-&)4&jlFt{2A_fp[F(7GD1~-dz2 -vt5h nZXK=k&UoV6+_ ycyƕib_ǔ"Gw/>M4TmJUw^`DvdĎFmؿF]1G :R(>.b PMIi:gIO<. G{zVN۹zAj`?p -8/AY |e!APҁuFlF"ϮB` hV"B%.nF+vYɱ1ڸiڮzowJVS| ڭ9V#:Uo `d\T~ZzdN08M.jA>4e/!e~peL.]_LXT9L2Xnƅ4̑UT݃Q3[B0Gl*6 L=9#A/Gٌ5T3FVQQ4]{$!Ipz윑D0D\~_NDA7&Ny֚D(hSn.XlyjEB>8".OŻ !+A*8#yOKGk"4Wt[ӉWj梄Ոj[7Hq!mf:(ŪT|dut1qG^A*_UDM$l/)OoMZP4%l26_|c@$Id׹;tN-g0 }#4*x(U*ҾbmsadzzR5'{QDD4v2;C8ja %( yᡨAl>'yVqjL."\i(΁Ro-KKb6? 6 ϓnEFhkvZm'fv#K(`eF}zhDK}̗ а f ,rc򦺕gpA!j[Et0T{Qr㏨T{ʍ0=A~SL*fЊy=]\||;ɵ0(AIq$ *r߷H&5CZu7)SMlބRQ 2a[#m EX@KUtJP{hv=~^j _P'cŃToV\Zjw HjQjM66L0 \htC7fȖ2|xg=-ao}}AQ7i74P[U{m$ KGL#h2IMlGMF1P~n{{?r2%&TPdt̟Ȕ[wcGY^mkĮ 찶|2I Tw+B؍}1j+hߣ u4_R+u;O(8P*[ɓfAʚMHP eǎɳ {Dśㅤ~DOl5oj3zy?'HȊ= b~MҗAלw{LB^!> <Ī`|^dB qё8Wp#o3@W+( t+M=u!|S3a)6ȿ=In١!Qjo݊E#;-z}T X'C)a u),;97Aa^u0u*:#nGx?WZRzxپP|VyٕC  L,R:q_AbtP\یϘ"Ȭx~314(>D>N,Ba-; $9 7B]i0KaSr:w7XD67H1B1ğj'Skfe}&-Nx.߲ ≬~M`u)otJW!\HoxeIR}&A4&fa4^8&*))m(VV9. 62?e[3򉟂[Xbzlbg,wЅInQiYZxv`<*bF*[{ r0[KYYi(s9BH'{WF!bvJr?1sSwcMqD`曶vaH>F*ۏ퍿&qm]\LC<5 -Xw=h€m;|*e=0,>?$f)['),GŪżr4J%c4q\ ^"^a8(Yyx.Z1MQ=D)kM0VnӾ= uBΏB5pkY T+y#ۙ2U-ELB73L9PVB8ubUc#zc,$+#J~^J4Q8h, Ⱦ$nyXbQGƢ$3Ar/eHұ1pMGe}([p}V$C@M;6dIɩE~ 0F9RoA*PȯH^- 7P;$!|eOQl٘xͿyՒ0JKH5TrĶ;'F|#xf \29 k*G} 4jGpybWtuba{wZɧ2z@ }{]ш?rԘz!Q׸\\2B渘:0Ip~SOrDz=k Od\٫ / |_QL<K$.H^UV8xV?ixl{00C'ŃѦyzOþ ߯vۻ-0rIV rS.VWy83&6{M-ʋ/GNj+Mj]lj$ by\ S[U2q]mV4%1]p 0Z#K+n14S.ȫnQcV,LqabF>׊-  'ݣ]&qsh17d%C=:KL8&gQ49=4/ZEښ:w-*V-hb oIÌ,Vq8qOv!nM DV:٤n՛㘉HT9ej2>m8EFټ>Ml5`uu ! 'G45s"-F*Caw dT;KQ.9qQ_Z'XrU$ fpkjռK1'i~TC&N̒ f[s;0 :C͌F"noU8]+~98Bg03|g`}f3!_k4v%Yhhu-[N*[l RKV Ivz~YzBRkbJӣ-vjBajfFUhpPb>&P_B:&@#l=YlJ~ 惽Jr (YZӕ@.x^B@MfV ͩZFG+*VM~$9%I/`&eԦ;1 wUxWJlEᔪi1`pٻ#V`.cY0G\ޞ 4cAi44ۻ=uY!r s" {Ϊ­3 AzD:1Cr, zA5fI~l5^s¾E;̨4e\l ̶ y5[tkM'˒Ox #1)krTUgϽCyWg5˵d&YOӎ5=M!t]A^4AJ7듵sR58siֺǮmy]կ3;S#=d"z泐LȸcpfrzmDv08*@|H.|\983ֳ3F@v <b+էaOPj[$˜;ѬW.T׫C?O uװѬ6J"AbZ]NZְ?1@#ʀ- E.3Th/WWDK~5>՚<揼}3͵]R} ^u%lYTi'j}:![G -אkADʄRC` eՒ'0b|n(7JJ{+9Up uCmV|ts#ghK:0gt~ ٨߰tWlKiЈNHKiZXś~$! ks9GgAZ]'Ec!y2kŎ5k,l"vQY|0l-{G iNl3g`ڐ=~4_tߍecCvoL{%D`w&T6BN%R>J@EPpL%"bz'.cH$ç#2vP9>; D\OTߘI񱟳=޺}d`J{ ]#fO&O[C LJ vيTsuZ2(3 - +8YC?MZg0D`G` wl' . 2,A UˁD ¼gXn[Z sgQCmOu,.IrKHx9?acΆ L&pdBADʥJIXC#L%@Fi}A$?gSi* >~ۧ0w1 vhn|Z"'_)~i*Tm+%ќx  AI44YN?C0%8JPHJ!;ݽ:\@:IUJjR@AjCrZEE[gR`@>K%DrB[cπkGNK8]U ilR uyˮ9UI BCݼLX˹IqO~\n( zݕ#:l-lfϥބtӱ8:G[}6}ngM=nnv lb6O:reӘ(zю82QWd D@ճ]?S W@Q_v*jmHϏqZ/'(U!I EDW/*G|< ~J3 K9fn~KY{Qw/LVY r%鱁2>6)Pu0-T=^*oj c+]~B}}G8-.מ2K7uE(0=Y<浮3׆*~H2Ş,_[d,ӴYq$,nj)ZRR) bOܱ؞CcjLfQr.X2Pb43i0]0ρc{ Wl_8ŅӅ-8u[~NE»FICPC=nE#L&؏AUL"Za쨖+̇3~;|Opci^V1nddI +!MGz1|/EQ!jra ~u9{ߊ!¡Igg/(H@)o ஈ$Cr礇r0|&CoŁ _T6F}6//T)n=M=W u;6oulͬ= t9OjPz X?*pQCkά0@AY4ԣ=P} gV"u3_S.UG.PB>.+M5odPfwp'u{,S<=_ Zǀҵ}UVpR ˌDžr[P OstaNPrG(c+xkց' DEF,NF,>q{<q/wi c,t[N9)Ga%oMO<ґ.r]GEkT{wL"Tolcsls7.nndΝqED8WIg4(Y 2~+F9Ap17kw,+vr[) =zXսU靝:Vg^!{,7K9A7}-\X _̔! eM(u^L@Nx+/M4JHBƥ [Q7"&hXw6%ot d@⤪9;KyWlbB(JrV.UCȫFZ#1$24MKA'q`KF?Q?hջpi4½Nl, /*4@|A -:@[S QqgkXAdwkM#YTsQ`PPHD>@"|ZCK뷇T7|1c;ו!8i0VXWEIFCu(_8 [GIFaK?/4½:/ό<١בcV5OXZn'Yp˜4F 匈|YX V闐9ͥ=x;?ft U6J&@#|o$0VCm_ܹR cuT69&Wܮ396_g&t-G < my~ Vuz)\e.zO6XI0@>z$YawLīO{_`e?݆6nF]覞w&5 ɽtQ]8vI/\y<-0M:j3wFMޢСaAb/0Ql o$l1Z^ja6z"RL_cabN4P[< >exM"5_=)&8{ΪǑ5eTv`Q`SG(Ădi\^3@śыElb/mnϜ"8 =o`||"򴾁X-0vNWߓ6jశg?,q3$o$t4Fֿ)~0ĸ;gbnǚ?ˏS]ZpFqsF@Xbx@ 1,lS)heM )֛ q3:Eۮ>i Pjww#DDUb ULQYKգKO̵ȉ9Z2!nċ5aN"፻|Jр{xW|pEAcd76GN7b{!N =rb3Ew(Z|+7U:wciLmM]LK}`DEA;!!d".jy߹j2]f}Yuḁ_X$B? >G]GHe :_-i (2b75?N$ + H54/_&$I4LZ_ӪV+KAiL8yg.۷xqsk,`swQ3d3cjR /U0HႿQ7gz&(Faw2?P,T)|X#.g"bOԩ$[+E`2Nge 1KJxK89 F?1 9< s_`X+ڡ$^DR_a44Sm:[t^^,cO_ul"N[_# ? Blڹ;mЦcĜa^$%I! [#ԭ̧|;爥_7\LO| v'qy tTX}^ }cK cmبqW^kE km*dvֱ CXzД 3x@Ƭ ~,z9b2QhWԈ[XRw),z_֕9t]a1XV ˒Ȕ_iyQv6_z@)"P ЃO_bxTB:a4\y:-Ai9>2HpLEޅܶ\v<8 A8w|tVVYuD50h`|+,khO ꪺ, TVLh%;nB RejdHLlUQ܃AO"?"1b&M({&#|"fٌ^,Z$-!`@k+"Ԇ>3--[k784pV}*3|돟,WO/bLWEPEY<4e!Y~? Vzk,Dis'nRb%t$(Ywjl VEn5tb6#>M^e!$m?"+<6Q:>3L&~p$B( ʔ;&RBgmМT)3R}T:!"pTME hP*ڎ F{]`a׫56qd`li7/$WWR}K 5Lya4#E#rCXQp8Uh{UaW~`^Ԙ\ 6U\Gա=/槟7&sT8G2s[ =` <^>'O/tQúi0&rP;4ŨL3d0ycղg]l=Pm(X#IL<'r{geJ546ĉ{3 P(Z'0=mɸHĐ5d}n}bߊ7 ;omm s| ,6caXbP( UkTC.0be%6:]C5m)9~Rxi%*R_Ea>\SlA'ށVT+nsV؞ܣ4Wձzoo[c(Gj2\dV9&w,|3u嚜$[8ji0@9MX52`'pZ&[uhu J0]1:Fk]Apc2& v4+w6xRIl"y κh>cEXe4nDlUB~*t$c {}XK;=QF,רv`n艀 ~.0Rds_ww"Kа|8a,mJq;=㘦9'+6N9 Z]rE:ެrWUcaD٬)~Kg@ZBiN"ҏw9Qh)2@n ݨ.Ũcj+ fmHL-ryv# 5mɧW;J?|R@Z׍2TR"Zi4zFv27gr=~!jh [GwÓ~"zRwӥZýw1k-x/l9‘†ύp\!`]NS+LB*j/j, r'>gṢ>&C2đ,1yq4]e2xdg8O%x&YSks0ECmКQm bVOT~R À8{CwC1s{{kʤɾW!b*Ch8 ;V+a#CJAim,,VX)r!%1~0=(&!dO# Qg#4E+=c@<*QFë#1V=] 6DzWg.\BK;A'-MsjKQGQ^eiu!##wf \@y~=A`*,Kbd?HRQ ɭ_0 pE$ԇAa\ tURzр#Mn#gW &6 ̼dti7L\xܕKj 8G6!don;" Rj =&NźHG OXJӱ&YNFS>W2 &s5A)Ebp2? >Շ,GTcA&Mv Btx R-*cU?TNG.#rc3!>4N)H&FJHY 80 W0NI?ބ: 5詮߫g;n19#Ly4S^.Ce%;:tZl?aKL9MVrȊ9[/e!RTQ 9˲'{:Il3b@!d r]Far)uKp)it3l4nI=c_zooBˢ yWe Ԓ7GL[Ucn^FgNMVP)xD[3c~<'$pBGRǍ'pĔ&.Fѻ*rsl1|i 7M3A=6[/Zih콺W~ɐG.֧z-R!Bl "E| gHYұT46t"ݕ')K[:EG , 6WP!s*0 ɽ/g< V)L, l<;S4oZ ު2Y}b^vOtㅪCwtvOk9u+ ׼{$1LժANRSiGg'a/gktlX؉N`KZ h^sh] WN%o\j#C0E)p6ֲW| ,$ Ztg#0v.c7.) XZ ZA>:4仃YjȢŚ]ԉUëe}cRoF_}]DP:c['gXSAogB;vnG i|Gbdt̳-bBJGk—}bR-͚Ax|详v|/t*XTq藍ՄY7/zvA؏x5Yv^x @plwPEu#G~fBWiRBG~zp؁*v,7 :2e<ļh׀[BiqֵThUVuNi-9\o`PPN;8px%o8udB=G1 dD$|g5Rahf\ty+W{ǟN ˸ ~D aRYFXFIc\b_dFr2[Iæ@K) Fa{I2\ S说"Yumh~ۘ = 7ϫUuw8Wشy~ؼLuݴ"q]T7uH-]˘cjoB>!?~IIybtI|zC]OsNPe[ͬh1Z{P?8gZ[ ]LOpJ[[b}PfP;<+*O91u8\ΎИF(atxFڒ^u9'r0s [Rɦ;lN~X=J53=iG`:b2?d^?Som-DwGmO/nt o0[|o$jehE85=4w#"n^cF|f;M a_ѥyl.lÆ =uޛR~y.Vd1McOW0RYrQ"zlYBfa?.cx kyJMmP]w_KAj>Zx~B isEq܋ݮ ]dPp>HyRqժ׳[K$_'}E!dx>Z?ťY[?}Xߺ/&xy'soK~ \0MwJ&bZk{ڑ9;+h!/ \S^^vbS-T_|À<`Tԇcd&2Ap㶷U=\H/{UtD|oxں)W =+ 2Qʭ*xY׏>.^zrQwd#$ %{/aޙXyߏg+H MՌtEWi`Vٻ§AѼƘD5ϔשhķXJMdUi}`%gx׬n<%kx 䡕cvn^N(szOxw%Ӽh&:Oֆ"[y5T3c8^ٯ;1?Q9 )UIǺn1bn ]1E,*!&p%1%. gX@ip-+P" ~Hc7=Q+QͮW= >[cZ^+ +f>;Q!ԍMĝ( Ҩ>ɺ lEW}0icߢ TANamT?1r[ $uQ5TBc= e`-.FFe+4Ǝr\^ǻg&}vn/sCIEIL ܗ`zA@q"ڣinaOoL[{C{9gf ҠDI"qM} l ][vm1F;v}|CJ2TjOMnjsب DJBx4߆M@Dބm*( K-9aiƺGp6@\EWCSɋ orE$Bnaf 3l 6qF8=mg$H<kOA6hg.rt2鱰xa}p[jY{.6DhFokiUzO.3WdC}0 Gu۰E.mFSnZޱϝVR2 жJSJ>V6j!)_r Js?v]hg_Ƣ( :VmFsAlFąU5/MĮS[dU|k-蛳sҏWݓ7֡Wۤ{SH_ gN. Kr ¼ c(J-{E9MF0J-~!/un0jۃoh~5g *LUtp_+WYS ŤLmyǒ 4 we*/%'ʴsRo41Zt' \g'15u/dl[%/}^)2nWj;=m U)|@%D|&)؅SG6E(U; ]3ߕB(P8G??6~Ŏ"-wPv!0%q56I+I Ql6]J9LX(Kp>pPp(5Y[벡9.[0z'BI~RE)z/Itn 6@XפD(8ǕdL@E/q0¹Jq_s'00G]cz'O;N:x,EKu*:)$qil5VNHR}/L1+lN4+慳ib&sĘfiӺwK~j^UА }7xT-J,MG:2;*fe/'ࣂ$kV`f֐,.)7Fcz_oɌ9Ye$0l /ƀ_V$'q7 ajқ/mM` ݈C.K3tB$6;߄5n3sg^+9/h!C$E?gaFa@@f3c1Ȑ:|úkrGh UW.D>qwfФܳRVv{j:! /T>O(.ƍHo7]x7<'#^W4g'ZnЁqm?wXT= )h75[ o0z^F6i@ʴ-%)dO #}m*狝9Z褓Ko#1)JE'U7vj\ q}f RUp׬ۢз&͸w~=#iiKZ@24FPf-+Qf ɹΒ5/V W=.UG۫ީZ#T4Er]z--Q.t3izdC(> PrO1ANMg[cF MwtJp,g )[(D{*xQrLro{~(sყM]+(I*MJ_H{ IC${p -#zuI۹)*u>U! Z1;? yɄu& D/;StG'.nY|=G_๔_.7zWzH,P 5%wƒjBۯ7%lWkk HGu; !?.Kٻk4P`#!QJϢgC{9V4>`䊡{ +X8(vj&}2HOeOHA{-wh  q6L)-uɴkM;'6ڬTǰ#/TøRzJy5k׳z]+i1(Xt#iX.)mOo2C pҚ߳8:ѓS)܄̘܁AID*s<54VQ:s~m*ɼJSHK`_A94?K pwmXZmSL4 :3;Xu,nm^¨Q6 $*̅F}Mc%7f⵶c3QBiY.=gzVBQP2(Q{Dg(MS0F>nέ GQx Ź9_;;Rj, DmSY=ű+ܻ/ ܩfș#~h;O&5ň?v2jt}xA5|3ZᶣcD"D$О% zǔw*94ӂJE=u KnJ wM;0l<iM@oBDViƖr45W~x:Yk%:"f[}t X\̖R`C@u,Ohh!"IԢC=Z -Z5%W{o >p#*ʂ+i٢ 9Ojol^M;O!9[9+yk!IiN' ҭǫZ[gU.#rZ?V{`,4QjDht#sVAhBqUPM4mk"?Zq//(݋,dBէئ˱|sqnF{kp%0|9kJ<Na %: ӿ\-?OS'nl8IaqHv5tܴ!i3Ñ+z_zҧ qlM}a=KZLjkXhi4^&fMm#rh|zLQc!V^kbwe7 8w2U{ ])' H[`c]lt*OAinV8Ef~ݛ;;!&R(K/+(!sm..1Pa40 FR (6|D8\"}o9/C &Jvx @Η2>inz uDL/& 3WREj i,ͅ>.c0f냹J)Fu!tKgXUrfܽF->=jWGP`2:}M^&tws i Ruk 6# ?&?9']hd.ly$xPG-Yڽ ~M$ 4!?z5v Yxy+i!oϋ 3ȱ/Pdbd+OGFjϝ g+M0P|לT`/f֨vf 94iqsdjeNrLZZsEc&B5O~^xKH]M{s<s*l3tS%+f[rOKb&Bs뉁k/%s.uR{T[::&g|jھ^sK,E?%|zwd¬؋ԨL ӓq#?LG'/}Ah QLXreqBy DnP1Dv,/#x)grIx< +:1UENh%R%^qZ.|"L||un%8Ida$n<fo8sx͜Qllď8 pHv!ix'':ڏB?`,tUc`"UiQJ@E:Fh^IBJ8#?mx!c YȌ\^S=HP:c|HKx(]G{ :ߵo"'QN5* l<y iduPE\Fٚ0 "7d[Ev"X](8Z܂ݧe` -GG#iS]Pb{?\b<پL2ݠ:N 9p ;(x *XI_ͿeLR۠Hރ/Xޙ;"l]>7Ip*䓵hŠ* vSAxlF:켈5 \BP?5ڟPq(#<\&y)LJ\P2?M@ʁ<~ -qѹJXTM#U"|ZMmP5Dp,s% "Ox9peQ m6cy+&5I{濖X4 ,Qq$~Q8`NἻnw0H>mp`yx#KN/d\'xNLF A>o염?(Z?I.2W8hqkbބtujmƞ]`=>3#(D]x8+州UyIR>o&V`:MS)xo\M v&x$RVR`$Rpճ@Jrf5fM`@ʦa%[\}M}4p3{Z(T]^1w9{{3f=vfJdWX7n){Ϻj %ya8ax!>To jQ}eoy"bHCF "D *~(IRD\8d`E8sZ?c@y4eqo 3S [vs Z9TC?jDώM\>rX$`5lhu϶ 9s(Ո|zl9NV*}T\Ö?m;H|w#8g aBnkoI%2]_i)#(8tP-"bXԙ)Hw;._]IZN JavÌ<]-Ã|?BDOŚSw,WhFV<+9WML_1Cp>ZeCrdӥ2e PRԘ>BFZ,lIbPdH`TeKOOLN$ST Nȍap$8)&{EsMkH5.Uih p8&zey4=I&kX pu鼴S( Q1@ŰeDxAq$_#pBL%X4V N~5-:ujX8j)k&ޅ^A$nf/YǶe^n ; 5[EA vKX~fUDoucۥdJ+:*q'k ? d [΍u H~)RTK~LP]-"%?<eĿ مiv<>n;`ۚV ,?]4AVO /Hs βT/ :ZʯsxR̚W$} w:{}dĎ(bvi=hsIm_*x,'箟ٿ>;Iox1GupT :+Kxe=O`K~R>us^zM ( bǥѦB`&)a=Te?D-KU;[uwˇ 4/kA&}uʐ?3;uz)EO:j".mЩЃ]XgJ8GQKw3)7pM9k'X"ˊPVy w2sNwd 12#B^ܠV-Z:.ŰVR@?cA'!jLQ<[5P lhs]84q@zJyp4!nڞ,S hףȪ} "Q`m\_â W8ӘAsN@d4N"Ƒ= QzR] <ƛ.x[D3ӥf tmtv{EQG9 %ow5XlEw5d{fX)T&]gyH$r}a)i"i.-DIj(\oaU!8R=ؓ)箘g҈wNq Jw{#E۟Q2[swbB-&cX40OTBgJ7r*;A1ЈGV-ʊ5"oVd3k HÚ?3RăVz3 7Bb6I:|=cic?H d#FJJd\u3*7z(1ܳkl#bUW.Κ0S7~#dfb٫5/0hC>~EX{{2vFϵ8톜`ȎĜoh h BUG :Ĺ/NT)$䊚5ll2{Fԫe2$_1H=#~s˙5Y<.w-0GM{n_9fjyLjlfϬѥvh OvKƊ`rI6.XDs~5 G#~f~LX6 {q&OJ%Waтc>=)gRSb4_Q >ws ʙU ̃56k[Mpó,=GL*W-zD9N2D U@#C>1kcdwDRe2rQC9ŝn1k'cnqə4Ln:^*w#j6}9D}ggj00B&„޳ZkI;D3"hG ,l^@/uU>-8"^]#52yX Կw wƄ6Ջ$12`7e9R-Rc=;AYlknÂ|H)L;b1 rkv#9e4bfL)2Y9|6h-TP_m5\"FťY^P_gɢ6:d*ϑ;NUYy sŸJI[&ߓUGdh(&oFIN8!uBB *}R#m6AN/hHk] B_ĭA6. }GvVb?ͣǶ#sE9xY F:@SlNX,]."mhAt@<1_ 'Rf},We}ŧ O]":nMr ZU͹Y|˅wI/Qvl% αdp\)qAnqQ3 < LU=;u'99j;d鴧7;`y#,5@_\U\hoN#k]nIalw~NP H%xfjR9&8AuS`J{@ $LSn" P2'E@2O0ka3@į1C rN #,r&ȍ/Fc,/!ETV ڽf&(ed8n4ڮ_'.S0\qtQg o6=u{I9 ڴtq%SVC+s:nOq/4L&qSбm1dNىsxb 狠5D@XXejk=ow 'Eq?>\HagDSC"$ GsrЮ,HI$4/=k>)#&ܸɼ)?e/skprji|Ac*ݷ8X3(\Ƀ˸̩YAD}wU,LW@:I+e4"6dC32N|=hyT_E.R@QВ=. z9fRRٞ=8$`lc.Ĕ!^''ae-Z rV\Sa)aNt,,_XqV*^nkxA LC0N񞷈?-.܀2ȴ/y}mgM Cf0"H.O8'qqa5Gź5UgHیKBq2/gwiMF]BR˰o)ńKq7$?>['rqJbzeNZUd xҌ건šV;jM^c/)hzJ.~xlD"{tk7!Q<fT\ޙ<>3EɧmPR.-\? ID:Thڅ:Lg}y{6ҭ,R1cg3xޏVzQ;IX.t4%^iwNb@Nq^!9x7(Dwzprk:SțU5i3/ɚ'xI òfnK8.rDܖn @jIWBS$KbW}o%;Pg7fni>[E냔t$P$dlh눏D˳D_ifkyx/h2vǼB%ǰ~ҩA*`xQ!8澒R: _l_MpHBK WFsǰϵ=qu_ƾIMYJ ]3/>1Ϝ˶ gsx&ZfN c_[' 7}B[.)Bj^:2QT.WK?^d$HX:dI̊8S8\<8縭#]iz02G>a{fMzði]M_J@j<28|gܠ] OfjPp[Pk_z!U>AMS GDeyc1 Os:}Rzc]V}4l;KQb*aj-_;~kN@b7|+j{)K|Af;.)['` Lpf7 CX6(HUcF;7 z tE, H?‘p7y _3dcSZ/%~ Ho/6k^Kd1|m$Vj J]dpOvO8 Zw}*:aec뮲ehͩYn ωK@z7O?F/L|9Sȃ?+~FrYs:@xQm_`Pż*Ȃ`_턄.[|EDCF1a 3:mdmv]b!:ʹ)@ejYwaq7Rȼe@҆poZZ Mv"=q)U*`D?5aLsJD$jt|Pg5_N.tBd!prfyV 6 n <ۀIx?c7,V?F 'Ye9nLq0PQ.ˇ$׹ G |ZFL~g!s 8&O'F֘'A$ (NuOn54CD%[<\eݜ ).ZcI# 4h)Gl/J\8l!j 7f1Ud n:u G9xK*$V,;L_^{An_̓gX a]maVޭMYJ{`Gn3X^toTC&5YMʖ\g[Vk!q‡.mI0M45ʍ̝Gw{^W7'/ԚUF֒\dns-xM)"B4LHc1 RAGRM@0er]9[!"_*a?q^W;O)ǀiBh˻/r[8t7>-mktΑԴk*ܚ #Zz$hЦS5yG֒@q 3 8`+5FFj댉!gi/~}LgJ0oC M)/oepkv*]X31emE0Gf<:|o W13kOz5r]#VfR&'I6R.g],~7"6h=灤,3 )<O*-qR}8%[.,/=!l5/j{疾6"3yw >aTP@ 7}$­WgRբTQ k~IU4\KVGcm*+ApCS5R< wVȣ[,p%&/wbFGfK~"ϵF <3k K I'4> ^#J08P?_,7?2jB'!Cg42 ) #hElҠr.FV~ WQ]4-e! !jj|jEz>֊şviWg+Ru=NRB1#ܲ_,#_g0rfon*tLm@Mr+cVνe#yQ^}"8*msCG}ݱ 7UMy1/sNNXmfۅn~ҀY:]heRe^wBhQZ%5i?.B4B#zAv=^NJS{/ijM0J=a TOהvk t%<5?P]-897ϛ~s |i3,- M?w0~+v cWRG)-20F8Y'6hNu8/=5O>2OV5sCIiĽOy+emX>ÿ5}PCyp6E;ޢuq}6Wʮr@aD" ƹ;I!Tjg:UMOe.psf$a]Xѷz˝6x7)FLrÁ8`~+e)p9]J$Bԛ6̹Νxml9y!4 :-] s!rFa~U[V[1W˞a#&72_Ef>mIxJ a;$r%b(DfkΤAʹԜ4-ԬQqݴ.G^ǃ''h*9=. Cv/nK̠݀ܖ~X? |fd7RL^' G9АG2},eF(I2Ƨ ή~⾮Y͢^{` پ~)O( /r:̦Q&ZC{> )$?>k8J%`R~`lքL T.yY1]B@{Fҥ%t ED4{‰] EjjA8mz9"_Fob|VMn9qcDP7D K#Q:CHY9* q`HfìP1|@Uq :g'=٩RΏ`ݩ\13$>!XyApxC^6|QՎ syپ]=̋%9gAEC%_XjΥEf rLܯ)Gǭw7}UXrhfD3\E0yulcԀ59, Ё7y^}tdb}ctS:cL ĸ$ȥh9[f_? NzoȭBzLYꀦk HF'4oH iqXWFXe%!Oy[Z);DnnJpg+.SEBmU"USA+9McSN+ 3ޤ ('6Kd-E/f ];?F0d8k M\SO2,?KkN]$hcy6Ҙ۫J` ;VSwI"q\UO/Q[B0Ok mᐔ#f.89MG)ؽfXZMlhFIyna BXjdMk_z˲^ݔ4F/bI'P$pוo,OZegC-D1@̇Tx kR)'ʣ3jMdX1H_Ff Q7MN=36Α -d?Jo I3-̈́@?< J-CHUR佰Q1SWaz9זm+_mFXvyb|Qz(@r>(EhF_eIc 67o#QRljՈr <Ɖa $ љL;c-b -Jh4'v19s@y4ՙl.dl'<ӵѮяПv,+݋ ~s@:47ȓ&iUV3P8AJ5:tA܄q/}ݝ랿,5h/k݊|^@[^:U.fOgJ#dcb9; g5X:;!CcU<7F^$3[|5\X;DUEgDč!)AyE=cE CW ZSYYGw 9&ȂnFTW B <F)19|Ŵ=a]3iE6eXڐ5;Ũ&S@4a/g8jw'EY klVMw}3Z6p!8jQ[6)H冗n/#㮹~hda :xGko.sJSlmy6ݮX:~_fᑝMCVUKlK$xc#N.g Msd/s0Kq;^Fr^W _=>c(nx &."K-V"t3rx4nli"5ec*/dFQ"띮GGlepL3ϋ-VELNo2lb?+S6\j58YQ]&i6ɸ},2dYX/BK"|5!dˤL _=R̝H6x9FٖZEm3HDnN'lCNU7WRt R<\ۗx]P}e%?(Ȃ˯+X&4/lowi9W,f컙^P?[-rW;jv6Q޹ WXޘ|䞓Aʭ-}<֋Pv_F]&as:YxJS#LکLPMxLI k/</R3`80s J4̔ Mw^2b,Am[tzW$^(s$۵wҹWf79au2҃rOY{DL?)apUF{?z 8ğ8 [8wX B:+=J^ n<-Rܞw:*Qq'窪+[E>XvIGLu{ ilO ͂oud89kTy{d'9 W4z5qN%e6Qt@+0됺nmZbڋZ*#0,v2 7.gZK0I11W4.ck'""'zW_4rzkt4ૺ.*0@9 Dkif* v$&Y?piS_8sWI[f>>+-h$NmG{m0T#Ԟ_57\`7c殝z ka<25t,$O$Љu4*˖.7змF\;s]lиOPӸDݦj}Oi)tSL8 UhĬϮ~?FJYqǝ4|U g+$hN1F )SoGBsf"9(s?iȝrš:%˜y/)P6>S8bݷۊ(1rg:h6p 8HN~/OE( {DI^Uh. I>N$$dQNvubLqI9+ٲ*kܖ4!U^=Dl/s$\vxֱBt^yzqq(`J.p;[MC 3'b5A~֧"!Ѣ '-.Fr$׌ m]4N (|Jb#TLm(\}9J\[^`pΆ^vfXѲX RhW4FN"8[N͉ơȧ*66Z0$@C-B!7v1k,h+oX?"0(ꚇ rtqkf 0KrzY(\.(L W*s8#TRkHWCD sr5PM`HNKg,~;:A@!\1jĉӌ1ia.@#Tjh]i,ky&|*L ZD96I*>%]ؑej-4SK4g󆐓zZDAn(Q<V+߾]N# KJx A?HgC+=Lcg}hc{/{`-h _Nl`+ ])݌E2r/xU~?ߴc  }ؽJωDfoʼf3ve/ USeʧi#Αib<:bI)܌X|jry) Q.%ZAAJ5_faZ9pkQݖX:*#Mb]|#tŏe#Aߜ4׺^oңػCU NXs4/GhmL lR;u2fq 5ADW:ң 3IIO"D+I,?AIUKhۇO~ıi=<¶ nQ2CxÚ>f>R Qk6a@3By f.~~qat|c`Ÿ3kF_X|NM{9fyujW \:È"1BFJ$:Xꂿo!x]Zj8voT esȵ*FU%}~v~9rx"uљRv-;ʸݓuH!586WG1Q145_rٕx7~HQď@6b`/M :,o뱢PqfWR褬Ƿ TPNݻ|FKAPu^cYjY~y(M:薂^30 y&w>>dh˛)UwBxRu tW@c$< vMPe$FX̠!媁s?f8k*1gzdA[((ߜɍO 4*CAfwjr-3Lfut4)8dˌ+ZFJR&4~*WVTI߹K()ɯJf 19S95ٛ`n\;}S\\+4ow˯hGsu)u[I>6ު6ZO4a+whyYse-(K]Y4p(#OP B]Zõ1+@[LO\nª5l-<_,j_`݆FiE"8wM#-:IpHʹ:;yuDG;Z@>G FeLWZG<ڋ}uƕb"Z&bw""#Q P/ mУ=cļC#9,$fWP}ocRf,Vs#*\G~c(9ʮ\k,dϱ%ZB+?vX^ґ>wb yh#swR| kd>}us>W(A`Ϊ A!Rp/F25 yS-󄅫*]_pFl9<10ה:薧0}B%֗{kRd[9& DƜրh=T05!*sYTb;)Ի MdzX}($`X] 1S\HNڶ= (ؔ&ba_}[,Gd+\gDkZh)o#[jB.[eĘBo~ł})N^#1+g̵XM@e+dn_,8䡾t9F,a0aZC';B%-[%lgWꛉ;3`*}cJDIgt`[t\L[+Ҫ;{M+ Eu)ŧmS;ss973"62npѠZRbDVO=j~=g`H|-$P. >TP[v V@ϻY,n2p>uq FO<[^NCObsRa z<5spOnqN[ůV}J _#ȚTBLc0 :XTpνrAmj?qT ],V%`=씻.rҥ BCdpe )3#WR}iS .1CGqLH5l7bGz斂Uw %|KBѯott.c}jWiȸ!fh% 0Rpǽl:~ypqx89ω]t~ŤS'1Uҁ0$>0DX"W{U\cy.#n0@KkKn 94$|ʯ盧ͅ( Viv_}XN!|ӣ~'f%Py9?u<2Xmx40 Jld J1.)>F\ #POy(qFx3gCTG[ƓObZ{4ʖSYLVZ/!5Z kNkwX|OVFkf$(m__Wڊ(sm~u t8g/ϓ= gpVC!x_ZT;i6*YhULbLU]Fla ЧZe,*1%$?+Zj5_w-SU%=0GKggԇ1KA1ytu9,lHH5Jo\؈;lң]z&QZ3C,Y>rD 4pƄ`W%/s.Me3NKuX1(4 Ђ",-w[9w!{#U8T8{)/fRiv1V@9T"8|WV%R}=,>"wZߜ+kZ4 :$a`AP wէKĶ6ϗa+VU\RχDi% dqa9LuBG ]s,`V6qhɋQ 8=Z=P[|LȊkԆqf2;nb4{k,%>th̏?^KGo?9<_{D\sYtj:2/xQ32tV(]Yfc1[4=M[RebT9xi7ɿpS]!ߔ!tųm@` RcǺԌ;)uVoLLKPIiرUq\~-Ri!q֩Iaք)Q\:,֖+(U/M:kC$)LǪ"7wR\v@l*$'BG^r?@ DUKhS 30iXTֆV-4b dI#2@v[{悞 Ɇ4z䗊<_;e#F$ԷIDulb=fn/Tx@erjGsLP6Zi= d YjiT`kD,M#,Ecdt̿fm~&xہݜ(QF{*d?ksz1TIKF܌@I$> z/̥m+SE',U5a QQߜ .t?v/9mX!hjc:*yCҟX?@%_`o;DM’8Advy&rm>ޚaz/fnV>YvXl,:n'.'s3Uup/h>J'#RuDTqSm^GHa;)R?,e1sF,a5n dW{quJ1NxLLCpPE럁/j IuvUe0\Jv+A-e*g5 s?/'Ǩ3AuҵTj}p3nS7don,g%DZ>3>}Ƭ\GY0[4tL **dCbWp(N}aIs|㐈2}FHK{#!agumgz(qpF-~pm&K(!ßதߺga)>.QìUL0ą)F9AMQ! pk:c۞@*](SF΁n0ob_:{U]{6ozmӵCiI ~éKDz}bvKƃl2yƘDs*sB 5QQLIǗ9|(oWTB{.+B*:չez/{ /A Uں{С~T{q1k{2zsY}Oz=+O\.29ޛ M3{?=b'0'WtBhBI5٨YWj.>[L#Ko4ZI; u8n2؝_DzRY՜.< [yZAhZw/6+1^3C4GG>պۃ ;Ϊ f',*#cݩlv네F*M/-W%c9L+ntټIU+$UhכdE u1_xiף7gb)TݔV>lEl)ڠQײE[{{|fg!%qw0^25YD "v_LF5Ⲃy|7}A=H匋6J9; ꗲW4 -}D(*|t?x*_M _p>Q="LNkNV"뵿k8k9HY{#t`( t3Ɩ<&8AH|^7Z%j_:d I˲8?*ZdT -`kӨ&QO#pV^¬"[Md-.XWYˏ{o??ýL'6d/ Ŗ<NRt p 3^hKd]3hM f)\~'B\xlSMV±`wߞrCEX!{ Y!{Q)`OVPut$ biϊtpt˭iicuIz o"wo{=lh^L*ͰRosbtal+G%>Y5;R5 r\qL/QؙnrxXQkU*}{ (5W9Zթɛ0VgܭGNI[ SFE'a=3# MʶJv+gBlF4 }G=@Ϻ'+ ̉%ct&; ΊPCSDyTXĵp&56O0 "2zpxnRYu7T2@T]c<&ʺY 1bdS~D[PUMq^szsy;3V>#D Zy ~VTj9qt|&Bk o 9"~ޠya>Axo_UYmBuga*;  qV{ģ&x0a߳wsW@g 6/=bw uub亰_;{4q2^0oUm<8޿t7u{s.T^%iQc G#Aߏ,6>iYT[ ~IGc sDUCxc=TZ߁*lDwKߊ&@A?g:kmv{"pV7,eV5EVStfhw\NCGe /ҷÅVTIA R:pJb_P㦏{GeNu-Ey gTWb@)|h58:WD562k;FB>u5hog_ؽ*]d2]*`Rb^iS mon|cq}a% 7;c1s0 #Q#>Uj]O=2,BʙqA[\.OįpvB `8;e6Bæ'$F'}Uz,ZP=Zg1zgSo=& A6\c.57&F2=h"ǝȝ]&_Ys)UJD#&Y96b!|yEU:r%gjN71;{Ȋ/_Zh;Ժ Bbt{WY;@ׄbGw= +@%j b [gٞHMDJbQM;}R:o-fev0 錎VwJ %ԓɫRw 6BLjԤ0e$UA; u!v)#?[˾5-+}88 SԽvpz- `5˲L(?i͘ï[1'u׽Wt>ML*D6 D^1|aJ -͵)t5䤺\t8qcy%+fvn@ކ€}nP4F^[^,==z zLt}V3C ~STK ~ MLsӿ㜃W5dۉԴYB,L@)2@yz|u _mZ\"hSZ}4 axnaw ZcDuJBU\' 켄;V|*w-]_$>Y;SS0r8p_S4=lJH# !-M4%"6GCN8+RiQ;/Nؾ3bth2m{[({  P<8|VyaNғNgfZ筷)Mr/)"udy2Ea| k2@^jO7;{T@T?YMoojx-E᠅=[I"lxb:0 WZ Bb.Cd i ̞K"#D!Z8dk*WbOkx]BS'=-M @Sf&_,ln7mZGȀ*?`ǁ_| dv” x̨2<^ 2ǷߞM ]סuv?5r]il -^AD u8żaG[")x$xX-L~װƧ=6+P7GA_辛d^7_́O~٣+:Y?&3$o?OBTaʨd2jhUD{O[՗\:O:`OR]SZi. ?Ȥg$QXb@b46mA=v,2߇O㹃هJZ;v:Ӽ#j :~tl^sz05 k`z5c,OIm`RX/RP#Bxu= ޶9l{~4t5 ;nSKtm]+YgIH\Z kNLZ['rFQ`O ѲO(z/Ls]v(܎HHSynmaIY5X#NoVOݼ"S9)~s&)?;Rf^r#,EPJ̻/K~f<$TWT!M8譣_ڈ#6*ꄞHgr?O. Ù ;x Ro[q6ԭz3(#h,$$Ǎh 5q ޽$Dadm&J6Pk .< 'ݲCki6Xwa?5vBw;#/IJX z4ɻ\ŝ4v,&=2 Qԉc5&(=c'd#joYWp@㴧0(ٓ !Ɔ5Jp 1rIDFfjJ+=GWJW8SDڠAvu-,WR;bdb ;'4k)ڕUNvLt+^4-Z2ժ [n'kB9]HҺ(xxXr1)eFJp̄,@NB#6 [e%) ֦z ji ,NoLKMeJBG)AO|zh[@xTRʑNmG ~3àJ*sҐ Sס+?_W-s_s ˇ2Ou閺o6K0;#>Cvx%vR'P˵-~nS^ 7mՅ}D7e{$'Ve':K uA嬭SgrBnvq8,W* 쎭Q\$c9T9ު-M,K~bًڐW;G[PϽ}MLMiTQ:.b?3ZN*_^Zifh) 9RC; vtW*R}A?Yzke@ * =s=kJMɖl(> *W5אoyGgr( oA7Q-wSMnUl`b-}rC69 8Œyk&C⅂:f!B@^U4|KQ<_XP_zfԻ^N #էeqOx^l> $Stc`|{?љR4#M8i9 7:NVҼάEN;i3[0?-"'lCQq$ѐ 8ne]VDfUyl`"9>=>,P+ Ӿphrv_t‚ʜcZo sgxJ_>7s/!^P|_pߖ3bybF }b-Ö}|\N%>ocWG+Ie;X!2A0|չ ܫD*3­ݪ@ӳޠi_;F6%N73; rB+yo`sJhPgp ^= s"o$k؆RL~_m8CːyEOej/e=! 5 MU3|C>WFXJ&4bI&w,_d JV {90')5ejK)$Mx$-zo8xWQZ[g@TT^qT°dq/LԉDbu&xl (NnE-]Tpi?Jj,JD#tzG2DN1ivžXM@F6!5uNJ;nA<;p0';i~s1|<ǩAE|grk~G_xrژrq]y!)Ʒ:",_2xĿ .|˷͇FС,KKtE1JEDH!#dľZ,ݤŠAZ](f017C2V{e |n4 CVkW;b]QO DzɊ̯J@B *#Nzo:9zֹQx o}{ &mn?8Bg(YcaIHX% k[F<OKy5{aOJlQlLt+8kdb6X% cMtC?~[WIRu}d\j`rݑH$Ib'DRx, >N,Pɋ)e# xmKPP>s7֍8 r6`)rRjr R|0BKx޲0!+il QxŒN̰] ~Û'_%@˚&|?edS٭MpbXւ,e2-l|6IH& ?SsЀX96›wAc Z> =ZN6 1kR(w+Ӫ y㍳_V껐۴~. @hޖ/[D)~?=c=u:-+a N2(h.%~¦y])E}i u@"s7M0r;Pvk˕D3K+wt9L#"v;_b L?]'H_wqpĬwTq-=I0acR73&t Vm =~kR{`Zˍ|N(r-MHY1&-6jYpIOERj$[VH6~;nYܰRÞ rb /?P0h:Q~ys;:d2H NW-gvjUAn3zp{w&L&I)j$ 2ye,:3@[?it-,)4緼5QK6s+8X{ϙE 2Z<AD`OXTԬTbݎߤޢhj{g]v.;a✾B]rz8XȤ- ֎s$!)Nϛ? bOT ɞ9B'8J1ȰBg[#f8{M>+Cwۖ QS)X@5Nd8S&iHH#?qe=OX׭窲 h7T?=MB|O<|LVi։ޔ:5+P.,/+C3u7.KYG-;Jҋ]e6gFa]+?Zub#+ڬP\"h].t"a3ta NpY:H='u.El4_$ ځ0S3.eͭ'6)r^g3e !I\aۉ+N,3t*+`{݁9̣!Ү4_7Es*@WbW`+"& þhmcK)n9"x[̔ aU]U;Sk>LG.A@{lٖ\n^SrM5DWu0&MYhxuv|\lfٝ,|& neǭB?*n`Y)7|Kjy|zq:ݨLY>t\fɄySxN;Vhu iZ% < 2+Ỗ=6w=܌2LkMY޹;d0MUwem@BV (kWpk!fnVDGDgJ=i4@w Y|]P1즠úe؛lz6QCCTʡF` ^QZ /ė0[8ikPgB#V$ dҶDC6M2Ll{)}8QRJ">7@<™pN{Uo'AlY,p U% rz|V|`ZC2qG !6R69Ȼ咽R#CָXk*)L 9^em(A*KLʣ`åʋ ̌ث~C6Z#1&wxQ]( 5?s֞G,_OHQ@H(^o!EjaP}A)܏Jn D(mf`йZ4$@U>6A ݺIcRʥ)P+Zo'-y4IfV /NycH}V6teO<tr %YwLǫ ɖ}?pxu$q B$\ 2vjb`_Gf8P^ɫөIY8o^#֔!Fţ$ma/\RF.I)~IgJuY6Y\srq@M`'#KƇ|ƍL=Q_$ī390C.,,s3MA';XNI2,4<usJ a7&:J*5/`1뉵My6L:o',Oo9v!Hb0c4NU4h/P j#F]iĆgK|fԡdy]mK sOeS* u[6XlLD Rtz.2]rDpDaֳYcჰ߽Y/VCliӦhs)xkǪUUA&K&D/+.5%1k#bDM_P*7~l:WgZ"孋X]|MS4{ZF|nG"x؞H/ nSAbjhu\fs9@ ׾h! *-vO?DYXDG.\qq=5ܺBm<4 /+TC!աDmhøX 4W:;is~(ucL0(y O59hU7Kzfϻ}]XT{uӮIJԇ$'훦[^N0DƙkIK$ޟpVbc]yQ~U'-r4AqZNt׷Fw6,-H] pҫ Ut%\? f7ئoU'H 31BF۱̐s4GظSňӁcE/?]a㡓K{ F|Ӗ-_Joe_@a|[U»YE_d!Td!+dw1c01dh'lj ]']Z>} ꍘkDhHY &E]+5~;x=jkV)@Lb6{O`t$5M,zIס /ر2,Hu+U^:v9 ]hI5WB*^oEU@ji|NMso%t!oK&+\k\t%\NbghD*oT=T+rP:B,TW}>$<@_}&E:TwoG'BEtf.`/09m 9L&j>n>>uA#۩fB=@=(c[F{ i1cAb8H>a|;ax*TSs6xOa?`o+x_ gꓘm˵%@7RPwd FvFR˥3eiU:Ol<46> %US/wmwgȌCYŸ|FZ ˯| Ŝ$bYd|6U8l`Ҡf2z[G7ODI~E'C||KK s:u3aLp'wuJA &&C)[#rOZ^RҝfBQ%hJXAAʓms 3ΡĬ|a}6\C b!nł9Ojt`cuTI,XL~2pv{~mZ]K*]4aC-WwE}palMƯh杞0‹CvDӉ(j]sq"8q&f[O8Y_n99a`}Lj1Ĵg)OgUAus _ |3Oϼ3tڤh~i7Vnh97@<37T6xawyb3#?bը|(xel-͈VXv17t2F-`o7SP%{ӶAv%5q8Ȉ{d؜GOTk,i~!@H8'tm"?qׄi [S@m^ Z\y- HHNf7f Z'R;á 予%֊90kⲈLM 7*bro$֕s1Ƽ8udz!T Z( t"6[9Ϗ^L-zGLbgI4+H ]8A8Do*f0qj!ZIAWS[qBDsɥfW&Vܱf9ͭkCtA{޵/Y@}vjh/KH`jԹ28+LٖBxvpS>R%qg! ɩAAn4܃\hJ&C3C6Vc+@6+XJoiL%1[[f6 K3'(OK3}_v=$6u~|c3I௽zKJ˘=$3B? Lx{>mR<Ǿ>{~1+s/x;Qg 6I5kp% :hJEd sU0^uK]ѥIlf#݅CP]lE+uTv>/A1 Hpj7&~SQ *3ҭ 3eqC)t"Qs|׬m0VP\<ƥxpA4_qͶIvmE3à +[z֨1Nu!nW{w !WQKgL&Ű e} rDRe[#oM; $a9zP:tN,D&܅K1#wSd]{մ4V1HހiLØ ~}_OnWJBvaxiC Kr;{ P#qB?OР8@d?QˋJ#8ZA7uz/b@'] Dj*5eYBUp襻E.`(iq wܵU2"|+l"9c&:`X" -J bge^ͭqeUpb![͔BGZTÏUq-3BP:Okllg@][eM-C>0=bxeЌ$7=VcP o$HnwW#,2 3HA. Gɜ!Xь):).]W et\/jC"J-MdiRZ Ua-#?: \Yߓ0o&W#M7.ջr2$$f[ B`<5'D\pSv֤,>w'R1h DMzU1o*)lJ>I!s 70,e;F$X*!Roe(ԲfQq[3C[0R#mr?&z/섚4 )h;`5q(F>Dm~FmczR\@EeWStosry֘Π[ p溸/}zL>EkzPGV%;l-@He /@t}+@؄N8$sILv pQtɴ#|>ih#X*ޟЎv{EO lCǑ>cB ;pP 5̋Lhбd I>[jgY7S{itz,@ Sw oQ q JRzOսw9y7FlR#+_Z؋#!X_T.ZvVdFKf ?ibdGI\ꭄ3\c*L)Z\$]ku:ȷ+0?VG;<$?uf? aXmT/W.(mќ_hՄ~PM爺eLfoȡQowI "ʹ/Ņ,LVOb{N[y`ٸwAyp^l_OuXRuNS6phH׎m&kl>he:w0[F`ESWv5/'jĠ}/a\Zqo=P?2TY k<DPkaG xX !5Kži?6W`A-@ W `B8Ffɲu&B4(I?ǔ[KNnW*x)e,q|NJrās4&gUK@T_wVǏfy"_l8o1ml685Ŝrž&\-"(͸ l4 'Hr@ڪB.[&7E D"*hA0xK')/´5IKϾ:;228|Ԛ䬓Ǿi# P+ƪ]a/:1|)zXW Ó.XbqkF9Ӑ6 WЎeRӯבAQe\6>%S7CUAiiFe0nɕRp9h2J42.nWzzH^:{~w= ,b356f 6mxlSQ~Ѿ[XcUʹ%hPAE0lNmT܄o xQdO0t8+^2 ;܎7Raɣ'wcw9 aSB=Ltp,#O~ȧ.W!@!mpIhG yyƗtWuu[xzX1.dj>hKZg13zBJlc~b-4,Q,sL ar6BY-ƔOGU;sKl2 DriEe]aQsY뱰}ɨ}],|#\~ϯM1=ê?>z^o%[̤i|s;PtO Yi>*jZUVCGjŽh1['`1Dxqa޽}_C8sa6y/nQM X5?Ц <]u+R-H KIP)clda)ƫc$|RX@E xUkrkʖ1"ߵi c+I:e ? q6hvϊ:L_E5RBD`ɇL|<u”їȴV#x܋fv;¨%aN\]C&C>P%KE} y4ZXrL4T]r3auLڹ=\YB,5 Lqax["AZNB';HqM^u=B uM!j4t_  _MN-2r@[8&*qXXgZo9/v Mdc!8*aH8a22sbQ3i]T{d -AYroQF2*[œmӸXk{7p'xD"^DY?)j#\&ð@;yيmg~?s*+nr ߾fc\mpc!&a$7`;z;7p)>3?; }&Š w5Lj2/(116pkgxZI?ZVƖ 6-b|j `PIШRoδT;/t߳FcMma.:y &~rl%!v J"v ؔw\<{۳/p6x ѓ^MZH~|0U,oB~K=BbL+"}CQIaI5{PAjaVM*ؿEڰ}u:Ϛ55,Riʀ ך*,Cnh({t*|"hMo[C̴ ϨV*(7T9( e{ge??<\g3mFQHQzlL"^zeHl[FdHn]G(8л֖(!WkfSKvT-@,.0u@-@\Z>j TLR|s?'< ٷV ym83h.ޟ b^bwY") T/HRn +c;Kaw0+S}{\ A&\P6@QGK>x>E_ɱ,Il1Gtb}6Euuf1MWƽtkqnT?KN ΨFMHƱF8h(#Mcf)IgE4pEeǜk"I֕sEZ͠uTp<3]2%dr4ѳH>lYv}M+'[qIA_&'!HcL'6D3Ue2r/[E=C^†hb.kLNm"GYOkdB ƛ jWfñ6*ʼHN1ØxlBZiXcH4l¸d3TM>“GQ9;-ck_"̺s.4XY*lL*L@u%.%{Wj#U%R~nQp_ics4^oƅ`[b#M̍DBLGBr"#/E9NxTAKZ:]eK \(D soAŧ?V'тqXUF& *)`)f FmfVTKz*h*{QG7IR5(CՐ>,(ɠW6} JEXS%}>,NL]+e>QƱw&8wx2}xuS1>;y?%q$)"k9mL%vlS,_'5g-辵Ur=֬ ?OW{ w{;[A蘬Άμ&0߳r,%۹_!"edmIdI'{NF7:?3a/_[AG 13 gS=Z<@maq@奤,RpH\+^inkYNbټP\K0fWs,:<skF^ˏQdW; <++]Ce8IhTQ"-j]LqG.0~0gai~?2Lf6:w3@s>YЁl=܇*Jv.7W"۪ TjzRˇcWǴI@ߠ·(uF4_]ARkPZzt6hq* ~ί4i6*^YΧq&#gd gpnk͜Pe;Va;  MC hC ߧZ8=6JT"u0(@| MUJz˿d48BvT?j!3E8}ӣj[z. 8d{vqY; 4 ;r,-Vr'^nHjjy8ۮ;ѐ#sr~B#>4:,*%&*PE?9/MEi~S +n-fk[8.5` @E)pZ!gkGjOj%mJa3Sjf_<,eGG +"˃KT!JoXDڗL7nڎEVx{x7.f Xhڂm G)T)Z6q4U-͕XmT8$+՜}yK4|;w+ T=|f: b ̏g'3+ ?x6kX9H/z;oDfJ5lԨ%?8Q{{ɌJQJ?.uK %d&7`ޓ2HBq9CRo¡ :XAg ) j6v2B|C[TK]V8Q. e-4\р;+s743 oUnZ%{ :49%uvz TĞZ`-е{? 0W &wYM:ܝLPA _`Cp5*GnA6{$#ܧu<E9Bq,%޶-Y+dHQk%6O22D62#@Or17=afĆ[@LV_wHkD"Txy/1xI\AvѱJgC(ape;%Wz*T_?+ j:Uڏ0Zڞ'5EϺsOD崀?Ϫ(G_w#-==Ak.a}L,vN}WgMk-HP3x]pAN1]#&7&vbFQm0.ԍUqZnaM @"u 9K1S-‹L$d \ |unh4UR 4M<9~mMHvC PZRzl$.J %z iv9f()/^K2H%}HgN8}I2r<8nVk!lmgU{$pGJP+wueJ& E}Zuzaθ Q|ϓ4|H!6(5āYqrMCWݞXY7vyd5,ȫY`.+b./쯍VzGBf_,HGZEၒ96*~ߣ vrDCAcRp64ZxX0]Rː}_C$nG<&{VBŀ& 3{PuNĺ%>@t8d|:sd쮞ZTD.|&[^,qU"#Ob&G{2}@ybFGcXX v_fT{2MIwT+BX,h#8-_i6ISw+ȧwWj8 :B;G䳄5Ӡ1!1R!kO[ߚ T%Dc6+@cS#?vYb./2`&KvHayr\b~o]|ޮi A5с#84M3Ω׈?fX s~ֶFB_x䫑QvD!MC݊aLrgb)q<t݁1up\(,8q Xc}sˆas6}(L.A#9B͕\? ,L/W_Bҫ Qa &(CĔjH4 ǂN< I*+6i"9՛ C]RM%z I85J#܊ 3R}}P8۸uqK2:_Ǖ=/3g5=E!\~z~R I߳N,4j fu) lP,i]~9L5GJ1Ai>#;b)3:9n/5WF]7 )X5;4Ss1>IhxiZ&0 :ꎇ)Y6悞Bvx{Ǥ@@ؐ Q3h-KKFȼ58㇢}Yp$9=mv1=éZ^7&bR#Ӆ "w*^QyݨIBs K 790R'bVmq9z2.{[> 9L fVxXDo"03 UlGx"?d`> 3Wn._|.𦋄o\ɮd:U^^! by [*/&Qdlsʰ&_Tʑb+:\@H'aRG~g^ Ǵڃ;'K}@ 0`s |q4skB r}|&zߘu}~i`(1&gn lUZI~~Q*派KyĒ?~+%@jH։kZfAOf׀HR<&RQĹV|3t< amS}kFm'(#~`rM כ'4]JD $r ,> hp:bW&`R'q!"" O6{9æ T{7i;Kb8r){nmYrk{ZTp+[X,a#>Rck#7$HָX5 8/W{i%FNJQǩ6}3^~!Yw  5ǎ:1eF# ;qaCJ'vu=A)U՝\ܸ򨿜-aM{:e(j1 yDŵu8B<U5Ǡ ֮"00؆C'|,.;0}]!eT1lixWpU 7F_JPģ#*$0Voq| K6]$.EGqd5''/a>z~n:Bp3xǁXP="X9I}ϼj4 Udvv?tG6c]! Dh<&N;IW&$3e_o">5ҰgYLpQ"}j NBE.*y?A\О7R)J|LWO^WMGjIs ӗ}RZeiavtww@lL{Q' ˾ޘ|;"Ib ZgTr "cpu}ǒFq_tncQ"&eڿ6*V+}?-^#lē@zKb O6j7&z_NIm˯jg𱝄_JpKjwfK1箫0UcJJ&ڃX|YQgdmhLhچ 4jO AFr#'~&(;$i\A #;m!O8&ysOu*[_0ٓȎqĎTa}4:CCs bOViXr/Fsk`<`+4G$E}54](XZ  |%~A8)bwIl$5v^G; ЬliIaw5n4fscCFȥ%Z_%@x8vC\Tև=;젔?_YZ.;0^*BVۭ\ʢj{9&Z4SHN<'WLH{]/xmI7gb(zd~w >f<( & X}6ޭZNM+8!*Љ T!ݑe#3:xXyD!vkc] kɵ:ɹ.<${P_vBn ˫Hd0)FXۊN],jն?dhh\Y*Uτk9Wq1 cf(}gKP/n> 17~Yv\xV+s`ۨ;q{@w(RTOajpdڍO9g?$PH;ݨa&:n߅xՎW}Dَ+m%\p#ӲH;z*H DHϽ2oY1.Yk:G +kSsG/*٪BzܳQi{lRKE{tp7jl]C8o F_+vٟx N ~x. 7岙N* gXv]pw˯B3GXS zaftٲTDќJhlo:%uX'tnQHb[J+M5 RD4?@t35^kTtRl b`?'ATlLrGSpo$[lumMv$;Ԣ6 g% t-V1>ӨˮVi k:wn?^ki¸2M--UFHIvޑfgLlr .Ao_3ayu1l~]o5ǎ N}w S 5,g4k ہ+̅m7t1XXo[#W p|\? _TI@GamQ-;Bw0%:+N$]n36gh$=;\x$Ҏ"{Em& $yM`O:=ᓺy->=XoɯX/ҿV6G~:̤@&gLf:. [(m>/14tD+S$h]4[WKSP%ץ 擐߀הNæ:ԦbGpy!f#E/|;n2?=}oZ\Ԋ0nq=wX,|k0/7OzPES<0T"l/UE]N1E}>_􂁞e,sCw'æ6MkQ+o6dEըF#pD̳9/,aIʥl-% 9f -"ɭ{.엫 p7h`WHl DwCjt-I`L!-fTC oe$(*L`LQg_[]7ݧ⇀0v aaP_j? %*= xqlC> )S,Ky@=NDkOkڦPk}iUl׸Dw)t"?8gkK:9϶w;aSq]HPKk20^jr F7gis lX4Ep2QTyMdx&K>L*-J,74W˘VVJ <g"S7ިP:sǞ,{>3ěg-Q%hMe0Ӷ?@.-=$fDP,9qa}%&dX"dAόZ7]ɇC!NqP8@aF>ȥ<"@ɖGkGW$<,_cexaп9$_?#/p4zi˨O'#,Z=~61B'SMΆCl g6pXV'?&ʷ&Si sӕ,vTK@7Os]̱q<L6 o*\LS 劣1`)$c[$1-e୵"zQY嘅8ZeJ&g+HARI9* DU@)+ v\&d`}FEѡ_+GJ|Q)R;9FgP;?Ŝ?z;LƌI<̤kp$Z}9+n~v<] c[J=q/BÍ}ы *O Wm!F Xx |o "A/ްcɀ j9 e񢬘_9#'oH {u:qX0 w[~ 1PMAnAPʀ!.pcrY1=#hvfe8=~SGOأcEDEK7U+&w)w9Lm{^@* \|(Nr2YA>.',.BA݇뼨*q;l}~eEO4?/%X/+Sn˟eﺝٷ4=,u-Kv:ϧyL޹h/ecGG٧+@/X4,v{q&UA vֶ,*go+3wK~HItJz4&Y8{atn>,,:d{/0R ܽyLel8Rt cMqvV?NuP$_KSmVnf=c}xS{v}BJZ:"C~KorI)䫖v"`eڷ|[V"` CTCUa_6׷8܉ګQ|n+.n- pk>0u4,_uXq.rzeci&2 5t>5M7\&~q̒n5{ 9^(~ea>vu-KԬ\>1}yo5Dy2]a%?3s=MCٱFRQ`T +S܆|LMDk+Sfh(ek!x| Ǽ :<3W4z觖wC ʀFjih궇/TyGlk+8}SzZJVç*9m %B挘I9Ȼ 1z`d/̜?Bɀ㤸Oͯ.ąVPjՇwt\m5}`UeB1Mx-*`:?8#JƴKgsƅLzQ5?+ Z̎V'H7!$'B>xI%'Mqlmsj m@KĞ.Fv@t٪yd\֗> 1``]WU؅5/5/cEoP 'F,e43/Zn+|B1 DMDO,mR7eF'nk;j޲MFw4e_AG?yۦ&.iЇʾLBAu.)}E%ڛ#.̌8"Zq 4 / '"WpVg+YimUϑHMKI0V#dL (Qeⴽ] FvC٘9[ Ulp|xz#Q-{sp#G_ro6nc Z9D2r+N_vY9^ 0 1 ͯɷl˸O [V CXTcz4R)xځ]]MC!aJb-ssȌ u6n-ɼrNo6KM5[YhԚ <`r#+lXM*Ϧ`ͩyO;;P_>Vo 2pdiP:HPPSxLh$>Q-2oS t1˜ja0iSHL4j=:J] o-mq IUҘwz"{ˤϷ Qa@DCMgdϿxF) +H vYSYA9Y&0tg5[νIOufu}qyTe(8w-^lU&#_gXסMTBrSViS-*yl|#I?K3G/ң8Mk;O υA<>?&enLT!N'v—mn@ﱎzY5w\fPZ%«!D\ĸ- |:nJyB)1-|U' J|:GoH _kvLY8X X>L) ]"ʚFOZD'D>:bDpD0-QVtgB. âkK0T`ba~le}OA2,Kd9w:hviYqL'xCM ~1El- 9ɲ_]徱L;e&g>FX7Q}xlLa3-3ѯ;Y He`ʀS['oHD X8ETgNOFZ@3 Qj΀v nد~3[F#YLұ}G8&'yB07‰B 7czU^M0I(eZ>db]\%T&dAc':W@5ۿx._v Tq^mDNO ߆D&Iy,1QfؿL' Ŀ)9xuvߞ_QJ]~0mVTs۝9;ƩiKNB`3,d0(VKō?/ e*nي}XN~?Qɚ/KyNo b}JbE4H~PKc2u `Qw[F&[&gg(eZn<?,XKQMdZ/.< g˧Iy1Fb=o/i]yC > O&S\YK4sNmJ)OCeGHPiK=~F2fީ? p)Ћى|""i7v/Acwz%DwA[;YcyJ}>?Y"W0Kl0 ổ{tLܹU_ o߿{O*/_N{z#@o?ਟ\A'&!Z+ZV"myXy?qgeDñ&Rܿb4\Q(&0C]60}zƬ;r;d7JHU;.Hvƚޓ=zf`,df)jpxFv(_ӈ7 V1!~GºYWU"퍲9y@pi'8t 8`NC٪"ԭyc^h">?~d"+onshNŌ,$'rK<ٯe"|j1VV s\-Wx3itWqK,7vaIcvQG6=_xe񱁫6]H?!]1­SlŹCes@7_%bSs7^?F>s>i.ܚ Au-VE%Z\6 RzB["̭w@G9]XhԘIH1 `bEvkt G5),s+zYv%K/ nJMUnIA[OET#OxV!1.>@,Z9t" I:3rJGLBy=jF͓Qut>uwD ^JLm>u! ¢VQWѭAv`GwVlm쭛؆{c+O3z>?]'vT!ZSq+[8#[jS}v8$~(.6;L LDwQ@u^&ۘEAZAk\GSh: >!/8ErS13]e볍ޣjk_(YJԓ` '~SpTISݷPULe]q),;t̸19 A=7ph97"b@KyȠ7 &\%6ko70ҚOz+ ~z:@(#t5U]vq??9zw.hlM/bc)'@>'*:~^W3I>) wsLs2 sm0@[|M mI ,t:vR3#KNN-wiG[<14 sD.Xn^dhG/UAV|x0v\5w2(X{d=' &wHN6%Qc\W dΔ&&ӽ 0tz.N_1u86Tr<&"f@/@-0цJjgAp2 Un}a2@fP,Ӧ? {.Y`- Ox@6P)EEZftp>fD+H֢z'=Oᕳ%gZPI%WkYN⠾u|S 8Ӥr h."VyP qԯɆ!8"E9<aow.AxJKÃDB*䛱" AdXkp_?,г_|<;a+EC$a>' ޛˉ4peTA z|H# x@H_}_(=.A $=/]BSyQ py 8LUz&mR6|GBx;NՒƻ. 4xW@A)M(KG}H{hiM*4_3*B^?F*ax߆e'Vʓ鲱tqgA^6Qf=9K-C&:7[ 9-U#ʝBf/LuVGs?`RXE<в8sRV[X,?{` 2qs-. )gYcZ( +OJ<'k6z =s?Y\wtV w݃N5e :f,'k>N>eCΌ6yN0-v[1@N_Uα&,3j qI -੃1[* JpEFahQ[4rKm{TpQgRXNt_beJL:o(!~|8D#Qw Qt`PzRcaWnh*Ӿ#.[j&4 :k)W]PI>qݕ3(fr͹ SD,id6JXLšI| ZFχc. %R#($8,B15σpBgKϖ1P3" X'h:P:B&)g2tAd5`dZ;Ջ4Qn`0rpiqK6T [qhRHWP0yW+OښFGSC"0| :3k>Wz.6 > 5DTYQD^,Zf7d^ am{ ˹[Cѕ7<T&= TUS+eIL,(cn+*HjI ktT8'jrb*0MNiV[Ooh`,X;T닀+<[ynh)Cs]"R6"|\V/\te"(\4ŚJ:SU1Dܮ]0^zͰ irGmBV} OSTْ%ӦR, '=I ):rVi5  #`<A~iO q9\n]w^o~-;){;-/JKqAkyl0-p}~/nrgݯS3n5Qjfz e$4:I OTSQ5DeaeNi߆t lY/Kv?ENYa-w+WWO'LT4,k:lLR;-Iܳ[_&CyS=&P Y2{Ԫ9p{h7K" Utώ+@K +RBLEE՟# \"534FdE/SmI`J5g' )7&㻃Q":ruJKz{z_sY{9ғVyBbFy1?RNb?*ӅEJ*Žyo͖}~He`/.Eœyq>5j<(/I(cY@7W B}rNmmK9͕ \HFIO֟o I#6Y ֧v= cwڣA Q ܝHe~ }eѼDw v[ `^zjCMYGuvADN yugB+h= ǙkiNѴ1O#}=#e)c+\v*&ܶiWG/m"e+IglRuzwϺvJ`Qn<ΞXFo]܏D&Q!&v+HI\t53S ʖWH ;v s~x*eV箥 J֜!x5R-9F:}u?S7J"nָB8̾=>d-]RXΛIGq-0a'9܆t֍Yͨ(7#ڹI{Hz3+'˘6H{D+5)&1b(DEȍRϣl5ϓZVg~5GPVw%υ<=o"VXB8"1FY釾1XX 3JKPS΋LIPuf -Gc_B`Ξ&J_ݵEpe.RcA\eJ;>3D륗 ,Uc1Uϟ] Se]>`ʀx"l9X°{7 ;b%SLSZyb(/.#Ƃ.\KEBt)8hU1vX5!rK`sʝB\,B$ƵwU_l&{CSudmD\%XR O8lqG~ cv"8X̘G;aL{'&09 ŽAI lɲQ8cP||ԣe'89y 3zjGW0[}¡HiuW{Uj U# AvH  Sd\'BYiRؙiHRvX*=Uf{0dڿ~jmڪ^& Zg ;Dzo!,A"뷒v2o{ 2;e99iFj}?8g:`ŽAAC]mznƬ8#Lo7{caw+t3.:wOh| $1,τpa ۄ*5 9\xB dI ϽF-\@곗GpAj4W"LVsEiƟ?Wf MM?q! @ڿ}^m. u Θs̑V;%Klp-] z\T*08/ ."ި y(uA7짇`+T8>+k(KmL^ l[YkTU1Omܿ[$c]p< 6O`MW:%䩳+<ۄB ϡD3\!Hq5Y#!!oIU֯sWx\B+x"#ՋݬDZl\dX*H ˚2أI^`F%ɓkL#ߺlGU(d]j'>ʓcn єZe؟ 27zFyOukm,b رXaT^Gg™1Hw7=Y~W,/4O M?V-Xdt<eEK1/N“UMpj J6l_p1NilZ@a\.A@ǣN̓caٚi >I/&jSdQh4 "A.No\Ӝ۴pwpN42„~k# cN8WQX_-NeVE0S)BvE1zf i2|ӫdn}('ja M.Z',S3Vn[mj=W@|q"R P&M;Rm `kQVB;$_'/7\^Mk;yϧiH%rij (DZD^|:Jf-MeX!cZ Tp?3YzݿOG@9q[8rcY.:}09{/pq\,K5OA 8I=8KV-n~b,㪀Phn}~j6g 0rQ`1m,;\B\UCj#&DhWTPkYҹv}ibWxRmҝ@*Ԇ9$XY%H65z51AK ec#;[>_vlySntZLkEC-^, ,Ǻhx絨j?X?MyK-1yC0ҏ13ˑ1B !8o[1_"DG&n8U;A}'UMpW4ek6Җӻ=GϹ ߚ1!L"0@f聶Hxv;jXHd;5PG_W[5/c{y.S|𜡖cY|'O"9U'E8xmpBpst/8B?͒J| ݻ9 וyl̦i+:5duE?".A`QTio8*Ht *|MҞ2ޫZv)}C JX3TљϞJ?d f6u޻LГŸ7|@Dj^եejxZs;Z/9}~=!&Fnkl3 [}V|?tPNvMM6a>7|pO B}(xF-户ʦDe!" pEЇwt@IC+:ة7]XSHO<%bAEP3I5;K\L{(MDL46gwԳl ۺNVү@h"R{Zo; ܹ*/d(.`h X.rJN?& )mn#:ߺ,̢x.r%:AGg^ODcUgoysjQxm K&ʌ06l,Gnnwi[>mHd@%*h6WNs2&N/rӱ0jŶd u,!$Hb@険l'=ϰw_?Q]bDy 22#ҐIg=я<(y7 Q0R<Ґ]{vB>aWF-klE64`bpK߁$[ 60ᇔ("C×BaQV nv(>DB֊Anpa6!4@p _ʄ{U qh=uEg&[ֈP.Lǐ"X踪g{8w@xi@(Fq\ՀJ&OAPTR8}^44U9ۖ-1XG՗Y k<.]ma!HDS4]>&l%c~l'O;A=1h*j|x:?ÏX>6 9gҢK5Ѵp7J.nY{dJQg0tW~`"׺H/)IhG6q6bι-t2qL)py66z\c "W1!8ۮ4s8*Cw#GUK D9ww] T)ܘKO .BS,BF9@rUf޶z׷%><2ґ,$%Ntr}Rw^c"mZK{Ӡjۤh6O"ֿ=!xpo GCv6헛7oo!&s ;9ѣ= fYPOD` q gFk{FyROTo$|+WI[A30ĭW-%'l{}8US6R]X1BW_a,4 Kxt1mYErzq7oQ9 &WSDgM68GwUX6FW׮}ߪpA_H"QTS] L9qY A͍Z>`fRvמ)=ê>ȑjBgz6"yݒ%i%/~?o((Se# Xj@i`#i?FEF t9 AiX}dx, CLU`cf `U8ZB[y _{Fv4ɊM&gEkdN++ݓBMٽMCW:TnYFTM_ȩXG1U:=:8 H8_~ylԬD,\nFo?Lwz"u}WvdKfqf`7ptdsT-yc`Lؾ"+*4KYArz4.td!֦Ti;&%BWD0zu /vX!uW<Թ~.YAYuٮxW?h]Cg${%}Wsy@/9G?Q_3o)p!"Tn"gtu8i)u!8Ԁ!vej-C+XcEWYY#CUE?Oޒ>O 82F(')X##:#>P"q$lvp>ou+ ةd 3P`􂛛le5֌&0euXUM\of,H׌S^D*פ.XW=PW h5K m(ʼnX ͤYF{8_KˌH aQo"NP0yaHPF ^ql0f4Hag?@f(@{@kaߊ_S ;߁ĝRùX~~S Bv mfu 5nXM~bUkab 9U" &j@MP3Jz_ HޯQ+8KҴzҒwZ 3AOojY?H#PfRc#-`etU6>O8,7+Z.I7+XIFyT^n (\ڪ+d|u\CU܏62B $sR3g[_Kãy6+ DaRPᯑRS:y<]%K m si]9x%~ԕlԨ\}}=+1$z4c#h9Q57c5K{rSý /ϩ6bop|gd+M7%ٙZezT: 8PYq"/V:|;ʉJBS=O1] >#V8aّlC ֣6Oỹ,WJfNW ?j9 ZCE,Au@䪏(MFĉB[^v(G ` Wu,'_57ʌc';GlHoEָ_p{.~g]d%pcjsV1WN5,衬ʅ7%00{'С(輕)hƑnI;4~~~-Z|ツUdX@BwKGsAh3k#þJ/6B(⷏)9׵ nQ]݉0`m:^JU0>鲳d`f? `0\=\u&6}6Q*G26yV0ў*ĵ 9-S@A]f:A"T5.i>l v!WuP)޼-qsr +l} 9S}xD`ZAs7-0\j%2l8 M>R9`fòs qMwn.mqU\RH#9CeUTR6'f8XJH3]~CjKCpԏb,T32Ȟ܄3a?UAvȐ%J,6\ߘ'SU[I^f6&^pl[RF jJͷ/#eNa"hȰ䤝g*&D8b6L R̟b֜Vcͫ<8޲.T$!{Z2#[Vj|8ݩ Q=eq$K{bthT2-ay/΁Hng$N-(D +Ԭ65c`]梞DU9v3Z3Y,>+Y4K.#y6ݧ ]LF,MEP&cBIy<B4HNKř/`F_?KZsƊ* QSE?pE%d( [[XkG!)>^f&L Hxj|Ú<| y+qb"Gv)DUaߚ 88HyK+fǑ&1kdq]"y{Mcw`i2IU&`{31aHJ/I0z=<'Nfn`lS?<vwh+ad˛vLl/i!)nz NX7йW qꄸY3RSSnSd7OHECȜ?jʡVk_qxž]̉ܡ k/+p.5[ZIFͧvm7Jvv+M(E:[&|_߃>.)^ Pʐ,D́ԇżk8"=~8}ld ?SFcHxi3 Dؚ~lnf8"VNp2FW_]@f4xZC``unAwHbDkO]{{ )jAC)9=mgMh"\b2HEŷnpPyoTʴ< CЮaxD->)W` 5/{!S$:,@<$`{-yTYbbkKۻ.\"H"Ub3Yin *ff21#lWj/e'x?9-_ t/bt/.m_ 2~@}Ћ2,f"rViF{NDŽ;vށ[n-]\%qs. kH ,i*?ox/}49vK:?,2$N+%8%E.Ѯ16={AڋT3:L!,@> %4ßh902Ox`gk3v=E6Ce2R՝TTO:_184ϫ׎$f\*-My~I˔sLwCe½|G+ъ~rQ^A`a'g1qCmX虗g~qn -E=7h7DZ=tߜQ\K=FVz;;|C3T-޸QӇNA\۔G.̈e1.d^J) xći6`PAhdl0?,0T\ʜt2IZA:C/w=Kw> HNg6=St0^CBLv\U%=Mwu(; #mމUp {vJTAv0HVc, 1Ql#cChm"xH5W H 1@6k4 mW0Ȣv(Q&d<#W. U)œr$hHՇke(ޮERTu҇ {>w 'Ml@9G~~tLlni={eUP?Z53 -ܵW^z>$CB5fdNA:XjԘx.0y.;x"!/Ž1e'wH D_Ʋ';hOnb3xgZvS@rq@o.zׁL8=OC3_M=NnPMp:ޫr)Њu[9IVBVzm?%գYW/Rzs-zoY#CT(-omT7პ[~'j1 /BF8-+@"%|&|5:Y̮шx}뗗"zs O~bV%wo`[%Y7ضʋC49gI"D+(d,]屃 !+GmBbRO7T*b-&Ri֝n8IM3)WRo kMx*C2XqsT&\Ў~j ! evO |RO^Q؀䨮n/W@̕4+">\+Eds5 ^e.گh{mx'`t$ ۿQlI{.A7ѷ_U,oɑx|ʪ3+t@uO;9wPWᛩ4Hqxe#( V~)f͚ޅZ{xeq }x:r -ͭ3JF4ir_$'X, = f) Oksk#|o,Y-w!/;+Jl`O,l2x!-e|ѵ;p* oښ 'R%fo}y OL$f&]^L"lj䍜 _.<P~O ݙrV(y#`鼂KP)}ʄRP#b!HԸBΉ]+>_#=9俋R@sj{.cO%SF\s Mo|,ΣEUj (T8F3[onK+3n7SH%4sgU:6 +=l̤D[pokm s:l&Sr}X؊ w 鉞w4/뷧Q+lڑ!~`h VnIPYm/~>{z!w0ŧm`շPfh+T hੴFY Wyɣd/lCp>X~n~JhY/] d"nDЇ*ĻEK}kvbCrGU) %g?o"A;3%1=Pa%=/-zkfՆKH.& (}_ȋ\+xq9<h-jYVb*8Ae&8wث}zJi+HMN|f$,[/q2w9`Tc!#Ů ̠j ş= y0UO0]9[j:zNMx[ ۛNIX Ha$54xFg$':Nnr1F$2DxC0Y2t7;> X")l dd!)ލ/vBk<2$떨в 4#o}iXs>uo`QriN_5)^WLI0Z r*ԅ(;-bL j"?X8}6sa89[1u.h]͉ſ_T}WOLh}ذ Ht.LETOyYX TpwE@v|pw Luʣ%‰|Î>C nL2ry;A|M[ob'Ŗ J^{_c/=fCKLSqo e%dvQ$a^%Ő8.َۡZĶG:ȭ.Ӽ#Zq@,M`l|O>r@N~ BxLa"RKj$}A(NwC#c*}ѭ猽8~m6F{<e5y;[!~,Զl*ʶ#9jbcG#re%|`fJxu5QLs>D82I r2QbYtN%ޮLfwwGSi.YY &o%{b@ ֤ ߃L3oZf?Nx t.Υ/^,%:1<4q-Z,iYz%8a:,X%:o4/t`\ Lld}Ӈ<)${mY-6;lY{d~ԍR?Y2,BӴ+ܾ(DU9t1ypRFڕg*;~ʶuA`(} tk$곞aQAW.8M={+E]ɹ/o) "odoi{yђN$hQ 폲/`kh1Nk(>Cv[dY^8懇`z&pa}¼b%LGLCXyZ$Fz^YߋnV !ޠ-y$!< ▩c&{aFKukf|shƍEwޖTFdg:$_rfr{ۯmD0)x'~N\1Cc߈_Sw%$O[Hd iC3uKfGo/9Y ]Tn`% vB*Q6;+'nkUFTlN[5CpwCfYSk#wGA5skab>2"m#|YrSjS~Sa,=U&AE'븃##z3E /2=u.LAmQw@xb_2ݱ:ivn)o(T;x; arK}hX*+7)U4%r` ML)꿿 ` jūO6iZedRcK6tewy<'}#F-Ƽ|Q̅Z \B=%g5ח;p05 _3:1G~"# S'k$/U}j60a%gTn4^APc*DS`:tUO~h !x>W\8 ɾ{=[yXa|cK_cWz}-6J\:Pdz8i'y mWbl*Ign[akLB} wV:'r_E@* j<%c9[d.hpI"fxgyߜ?MoVHc%F^`!8m{L`a`˓&Sl,CGAUJŬ>7-k(}jḧ́*l&Q ,M"bİ+n檸wx3 R.\[Nb@ߖKşQtܮ wPQsQQٲ^Nz40UlyKBDu"<;XC(9BVL?&ԆZ4r]rCfC) MUDׂ\δ{ _cp2sEi[ 7Gm@`Q(rj6Q/VZ91nnmTƟ92eŊt|9W!*B-4 ,4ñyf3 `ћ`R[RWbӁgNpϱۋ+ح!CkxQd0O"מݴ7YtG}x 5I>G~]=.mg٘ꁽlOHM@/cReyW.՘iI[.?!w!`;6\{>-X\ p>+iĶυ<зg3TtLSTLECN@Jq+^l5n N%a3!;p<6nP ?[;+ARc"\K AnBJ5&& n;F(#C?{a.MPDH?{ b2xJc5j]g!(,nD9s^beRrѺ2`wP"汅W#G]nOJr eC,1'v-IV lvMYB8HmD(7CѴ5K>NlBae4~'GU$ tIiF;|<DTbìfB .pZₛ+fmN^ S&9QL8QT/_*~e!VZX.iŵ.pfB_(e(۴/MGә⚑@kC͠_Օ#dgPpI[19=Z#p)\嚌#xxTmA*W 1i+JD]Dl0$26ԩœ?vr=Q&2j;H16fߣ[oL?5M.i?| .ڐfxz۹;&ؔb|lRAb=F %M9 cdF]@4XίHobZ0 MRYχ^* 9$Ʉ j%WxUc*H@pg4[~nf;kzG'?g5l@ nn7 x082Uh:[KHmy4XA$=Eڏx&: [ {ۗg8n/ o0? E:\ͼRZNmޗs4Gժ%@?*S~9'r0Z}Qvx+u.O.3zTp7B/`H=B@bvnջ88iX8'V !G~) $n nI>X>}$͓3j ၺuC(1(4sr"|P.@zX- ]ͻi,: t}v&\ 9I>}z>jBG!dFq1) Q0i; 'lVY[27i_DM ~wq?OlHYrTo%ދ]Lv5mȸhC(g(_\fsߺ?$zA8oY;L b-y+ܾ] '@"31uƖXwnAvk gRl%%s~({Vx-`]Ʒ˒ 2O1ϑ຀e'h;{8!u;-$DX~&utdR ™gWQVY-}рDPd.IJV;lqh66K&Ci1{oI 7c/O'VCOfW'43d]q1tóFQIw].P}|ubQBZ0UMOt@$ ynܐZ#F\_Drc"=5oA#@ n;[6j F ҆61Hz'tPa J4fmO/?Aya.$w`ӈdzu5r5I;*žh٣j@_&-1eok^8*Yy1]*&#oPT-)IŐd"13zBW+63m}'Ä]ϔV]'\K=uz] >O:݋?uB{3aL6L _qN?l<'%|VT ~\9_@ mCXiEuP&!W:׆ax߬ F,$`W' @GQ\e%HUe:@c/}z@l~I.VY mVj`|E/hwNT IcO*@w:!t}CBƩկUɢ"K Jrz=gZrMм{xvL ;&qv_v$\!]6q`"gDkȼ{ ?kX3s+ȃs)e4d&^DJ!H6XJeHAlT걦-xv \PbG!Bt8rAѢKvJ}ׂ:Du}S] 6~ s)ٍQZ(KlzTe%Eqf`ѪD>kvi.=< wUR)8hn@?5:Z|Fͺ a4jGT&ťh8Viˉ ^cC$xHkCd|έUCȆ9ؐLE?R5 LF"r g:Kr]й%K39lM[żIݫk6pIJͼ 5[CpoqD]VIÚ*;#6ϵ bh y.n%i8i~ƆWUf.`b,"Sq#,*gQK J6Ctb7NԧDpڊdIPz^a,TqU} Ҝt$1 ZR"c%2ʠk,a'xb-/@x!^JˀWD9Wl۳:N-̿۠:yƌ<~C7Urn^rD{ ݺF} !X`3w*Xbl 4 ,OvҐ4c1}[0*ـ{,W`.f8euKj j \d"ϩ`jR YyNhJ*ܟ#{wBr.{.=u4 MI2TJ^zQ<4"mb*JsawܥEܘ& 58D37:# sL%Q9S|w GvtFI YeW꫿t-M<ÿT4p[t} 2#n(ָϽr61m^ R^?^><}T?ּa]1֡*F44mI;t>)??gӃqe欄*\\;@%%[%5kLG =+i+*E5 Ic%֭#N[GP}L`5~WeOCY|SnC+iʴ !tpFHLM߳gX%$Rs|邎A=f#ҞgVVIhEx4t7 Ř'i ct &SdjG8hs][08fo^J`3~p#dsl'!3< #qop i΢,Iؑ q*M nf^oaDݩuϙ+Q}ҵwj^ZG0/q|xOi4 Ae@ԓG ̱6e4##4_}~[֋1\ݺW;%f0׍@nJ9DXc-0kKN~3:vnF^QFN$C@,]N[~Cj\ɷ_`ƴ^lC}Њ[[ Lb_h*:P-IH=;L?At0݅^3'ǧ`ِK6L,W蟪f`wF$ BrF 9 '2oG)p}Vbw?v5\Ȧ1!iZl"Jd3VpqA ])oDɴ;/=̣@>U)!c֣Z\RWN qI5u=;@2žFL{8Mzz'7D& @QxVk4d՝1.֒6_8.қQ֎4Jdl=?F!A`9fHMXj]odVdGbr֊ !p`\5 Wm h֢_o胨q}nas{ȴX0QTnaisi?qӒ̖R^uXdN+eW+o =CZ1Qzπ0睒vsoJ~C2G_>c:y20W0ѫD sV G='=!֟E|q6p`n L]/ѡ38+ ' sވ&wK0o{9*.+> !ᄒI_ȯ}Sڪ(&UOеUfPb0m2*dB&gTyzR;S)] 0$ב$q Mf6\'8D7B iRhNųzOGNx1)^2C.|ȮJ~q2zC@;%nà{HfuĊ[616V3%=-iyVC:w!Iuj k>@HP)5'J˗}QY`KDseͣQ-1}%hsKlRGx"e@1-jҙ_zѡ YPT',~y(WLd]i6$Ry5$ T`4~rOIuh=nwSuW+$d" NZU|'IXu"lؘ"%[0 LjIbCJeKYc1L@Y͗4GE6E2Mb|p42k%_XU?u W80y}Q=.3tSӷ.EŮ(;㾋}H/X;Gߨbk/ȡ ug*goGM3)Xe9\FK<TxR =ikmj`  X$YgYt V/5KrDU4OUh*?.}i<Ghg޺ `ea(L!ڣhsZ&7UG>gz+#4,Jw0DK '5mHV(S}kt|mIL?ˍSg8e´`K-1$[k\|\op;>v7-;bZd!}xkH7E,tpCFw)DKn8v ׂih|%ʨs)x/tbiKц%n  nЩ]kgzEm\;khuGd. ѽ|dݹL=b}RȾކSW[ϔs[D]Ţ@&w4PəjmGAсzt4jXLcRp+IgݭtF~+H տygQ8u>" ZS= !i[{(GzpB ckA- `4Tz4Qذ y!ٗd7ITx -f@iT.T*.KBj̳*9opTn\Z>m,"+t壘Ѯc y85D5U\|-̊_ O!vnZG}j1 Jsf9p8sHMi{Ћ/9 O'/epw9c3i Ǡ=α0_I%~6yc+DdeIaW44O2.!Q/O0ݪ#~kJ:o#Fߨy qP;R:WXgrH-O4C`Bۤ΍ BkF bk>MQO0 erSntxl%0_jT`݃lPeI9F+Sb+!H ??(qzzs|$M-G6l Z~l ~Em5*&ҊjB&=~b=-[t7 l3?H"*Ea.}->=nvv@!&}d|zDG ӎM8t $ѷA_KbBI5g"w|G=v\)XEY?LNyBAC\ HZ9w!mU&4O)@f UI'B^eyoSKy@Th3Rͣ2Q-ն:u캔^!Yw8IU5U1 =)&lP ZAK\@kZ]vk!<8NUSіAM8D ڹ!Sl;C-`H(p  Aٍ"{: Cn^QK3TpՆn$DݳݒƠwTػǟC6"8XF . nLd7$/08zQc \cZZ!+&R7m3=p2 ƹ]MOV2q<+dU'̱m̳A ,uP9E v2{H \61D'})ͥO/Ȕa=~TxN_"D[ 'w6za7(<>\櫛1njL-.&W`q?1>m=crB#ăn. ;VGޔ-dk 8\},=< ezX})*R Ȼm*[ofqCbŤij\iqr&v8³i$pW Zό(B!mW%")A: ;]Q?TÆ9 ;R/&X ԝ*O&` u=b-#|!j\6o- 8!ӝ &4ӡ vՍ@jB?NsnA*[a e=3)ۯ%bP@OXFPV/BnXF5.^q=|5v7 h1ȇƷ=#Jz6jL$D8yX`:2mݴh\Ka!pꎧ]s&󧄒W`8{_,((.,vb]$awF+?jPш?7Nzv1؄V=j7ppr;)Pkv,%eb"x*{)&T# Tbb z^l碾H^$;|Okc]6$&&'~Cmhgv_^}V@D27vt'R>#&/em;%m&_))q:^L=!G<2 ^n>\7^N8.ㅸ-qMm}=RKF  ? ب$4i{RiswmxdzV>yANBU@5B2qiQ hNp?=RVڦcPy$R8!r~=kyVMEY{cm^;atgVzc+4pBNyH>#e*A~"Xkr'b $]70Ȃ`٨dYK <@37{+X'^l(i3J #ss+kO+ by1%l1LpՓ#`hA`"S4\ΒO`6*@u(]ziuk(j`r+#"jS-[QǣSBt.%^b.P~;-^+dAFzA}dCTHXĶ1Q};dɞ[7qT Gp‡i Tvh-oNg%8F? lN`n&)9MЂzYbvzysF77lYKD<"Y}>-Ӫm[}U~Cp R9{xŸLiRoslb qIU&B|!cŠsdX "$̓O{([ 98wE(\W*b3zH}Ν f,.}oR`ꆚ)GM}_]JPbHRNFcj꺰 _=h1&ZNp߈">\g~k@?El2=-4t5\!9riڨkIrFMJ3hji HYQ})3Be40l5tBt_!Z*\"wyUQD&+Bɥ|74,02EdZ nt۪,8K ;8B_+TU 8Մ35!J~0S"Rjevu hCo/ovji컺ڣjPgW&ln93Vٯnd4*vB+u4RDdh*tO39hwKTǂO ʽbc.JyoޑDMo=upwᨪG;.L{%mJT~@2_wڝM d 4}6 le171u%4YIQ yc)SӭPCS}|33 ;|nm}?`՜LaG_fx[Ք ЯAvH9cht'ly? M4my QǍ>h~B̼"rlNL6^{3aui9!aDi"û`H J$ZN6CSgMwY8 ";m 깬쉱(/__IDw~'C r`آMrM/A3{5 zkhVHnƆH'zwx>< jhxhu:>IG7Pz55b"Xd;{YhB;Q R:??[Ts7yu[hI_.ESDMaP|r]_+%NyE.2p5rI=ope9K-UNYL1iJ Mox瓳V6"'8D6ҹr'aFZfrZHYUSG>];s`{v8ƥ7 LͩuG*'9ڙeʢ׏U*~QMҹml@.MTp5i@9ASc*&Q|8 ?ZXe~{E#f^,b2臔>3]Yc6L,QÙU{mcQ+Sjӥcaoa_U *Ks>/ ;mRz@_il; :(iPEדOݳZWI,'m2"suvy`hɦ6ئ! y '^| `.v?4A>߼>}H_E$ÂZizv rwv-탲wv[F^9.Ȱcu32M˶<9Z, <,P2mu_JӱE \#wؗlj|س|w4C G /bx]䉈=c.FkPu^W`+`Fh};RpRDBZ/6ƘBvӉbawvcB,n|H@ʵž,0Hω% v L(J]Z@ۻVC"SA͢FÔ vٮ} (btG@679bǵW*c"z)j%  XavlrJZތ&h ןI.ߢ : AXta Y=Z0v (Xy8ÒO~(/bP--WQ͚O#~,POd1nR=MnL` K^Ty4Y: 'l-5e|(ƍÕ&in1eJ#u''yD\]ldѓ'vڊ íyuP/G&K➓1YUjܤa|c&A@紸帺 Oިt0XQu$c6ctoR= gЦ/͈o7;s=%Xr ÅS9-DOE/5*{q/ Ts4T"erqf(ĝNytBpp93; i)%cP} lTV2%J,OVndcDdEㆹ#꣹~{1^|{([XZ#i5Tk: RBQa.8lP w-#oP!]mշNx &*lRc2!_RKۋsdVWr98V3sk•/6*R`3ZQn56yYdj-sk P83_ѺJ&NQ9l0` Y|MIT$!#X`qj8WO*Tw] EUjZ9D?8YVk J :8z]”` I\qSH+ނ6ueQH:~C{lQi X&L1M'*|wV*Q"뫞m #M:϶4Ӝv`8j7SV#SI% yDՅe A oͺԀ\ruلa4%^{~$U{+_WuS;hRuvBrj78߻GƈAq/OY$% mA^5]X&NjمIOB>~ִ8<+.KbٛƂy4\ڢ!s-0oІo~k:M_nC;8 3]@óWq*!ĭ [E('䥡@Rgk dZ#_LvzeKxxԳ|~G"M,N{E"Q5Gq@RkƴC%`uI1,2?֣:B%폒+H*fH#_z0h`A/I2ҌdepƈeM}X\Gp'\rjBkrq5i̖wbJVǡ~Azϝ~qo1 .nN ^e [Ka|`"}$TH+S8خslŨ吮湎C+D 5%IH'1vou9,a.ʐ>\M'W/2fzRSlhjrZ$Aʧ|EFBv - wP`.vT(Q;TM抨kkw*Gpz^y(tvlGtء$U4Iγ̅ A?jaKqPҠnDkW.С\iM)kD̋1d?6Bqf-b}ٰp{R캏kT~gL6 vpZR7aqu=tbL<3+a]&Sx~^$ L-@__-OV+.OUȟDj0 ,|;cX4sOv28EYTqs |wr~\'S` ̝~2r>[>]*SɭYZ:u\J89cLy^V4oҥ5~U޾oXo[5#dwk Y%fB&hP?Qtj482N&@:kv$D?g!9'] KDH?/Oz_coی7[()3-E(UL2W.*>z=t48Pi՜;B`,=WGWܡG=zTvLpo9-[VGpTPְ9:ǹ k#n!N=Bw#-]2Xu " Ksi_M_l%4Ց}}dp2T80> !(g^ޫ.0P]iS)t~lvs=Q-O^T4=U)9u|Tg^ICpj!@Q}E.s_ AϠ7,! iꀬ.Fi|%^_dA1|AZo^-BjL(~1\ R79=s%e^$HC[5pDŽ Y\[e.C6;n6 X}ʦ-sVE BZ)d 虇'+#44 l츂1W6#pC=^E)  pul_8(#,7} (rߖ 4^a(eBZGV_#Z/}P7Z6?C7b(8T䁇N?BfR*N@?PI&:f?L0I;ǞYVmL: y bBkbWli-fBb[0, pDd ŢEWqYN<Ԉn,ؓßI 8GN $9ʊ'w!A:۳I¦;٥ D2}޷uIsVݣZeݱ5q1K㴣#[0kcUw,9?]*uՇg9cyCwк6G3ԥ! Qaڃ+bpYK?Q)Q"fC)^ 8}fՁpA誉KiA=@&D(@Җo֛r8rr3N,Z T 1)^I!}-i5դ$Co:8,Fkav/99 v1Eew\; ,3\E]RbzasTZ,ewQ< 'pXTE>YcPQHzO@n-Wr̄ER.a8@RןѬtR 69SCIO1;L֣48 d\0Ù;e'ՎZ1r=~)p6|ËzuԶj=*Phؿە=y^ B+c\hΠi=97iFN7ZW AvpaP*3UTERGմ^or15F 1Ϛ.0 IbG?iT"񕲏4]&qC&CN8m*e-c&F|Qm1?´fhTyZgl)NIPW7M`CݗH/”SPp!芯>}0 c;xg @|4ǧ.e a晟.{8oz"gƐ/zR/o4FvQe,&]!j1 5ֶibuOuJ>U*jBW( 7TjqwƑ17D/P=jW(kgh eƁYќBPُCoy , /1z75 j'+tx':1˫ .lKm܋w^p-,Ӻ@Ct(+HVVKH3;Ie؞&ʠ@v?`Օ[flO(Zr`zSA]v0w>ӾLsWG:$krMq TpN/+n _jeJ\|_ ,aZZBNaR}= ru0VͿh^1EF$)$bX9Bh2crxg?p @̲#';Wf+>o46eu{E-74v̚?$иzW ݷ .Pi8JٺhĤ_܁݂-ݱL]lBt'Bs_TCxɅ&YAbcksQ8}W`΅Ujcιy9Q' Djmyr^=''L=av+2 Ag(rF,ea;N`Q yP#f3s^"?lƘ@z+h\0 sdo~龠Vf^gxa@5d(?4_Y_U d Dt^@m&} ?Bt}/pl^fNٷ.C(RⶡpPqrҀQ}~|ݻ3("޼w؊%7<=AtQH( *Q_Ph0',3w:d,b "]'zqX4wԌ"s)[CqRGJ۱o9ߌ( \K̈ݔ3M05r}ZYh^bO@bjK`B7^4J?-ḧڵnQRIʰ;)5%Vmcg!wίo:^Ȯ̼C*ǔX.o?ׂɇU"-vqUb}~k5 Xa, dϛWx:NX[{Pdo\.O<\8t#J"n$uMtmYbOe4UQ ~z)uv>X<\ͷ4#B_jkB+} PQMgLp<h(a:6YJ_a?h900~,(Äz|h7i:b=敨ax!5rm9CW4W/';:C@0mև.*liF\_wU+uCwrxh|-!=R CTe=Xow0NH* kCۥ;^Ux9N>^ ! ٠Ȩ,HoL5ʥi]"U'|2ёIw@5dٽyHDSJ =zM{?3I H0{fxch+Z WJN?;.@;@fY8/y49< J~H4~7[bX!>0wڇh CYa1ׯFLΐoj$<=&4X@+ s)i4e̼4%>UV '8.TP½|]W-jO>D⮯qOs[nᔭ RK憹rS68×&{M .,T92<^R7t+t#Hl7w{jDH||:Z &ǀ?䬰㟜7pUs>r9F_nW 7VF(SyCNc 8ʀ\u;sJAzK"yޭ/ہun:o@6E4A_lfuAHuT]>.uݣ {FB..@V7h[{PwߊE cԢl\#J2$Rnv%{+f+:ނ[)  jm C7:9{p]z̋Wx*;hVQ^c0d}ILcEM=OF?հv |+"gszba{#NEX!:XӒ~:@;YK9{y,) .# L0? }?SR"j#Wp{0$o}U'gүv>kF` ZŝP_~o%~I,1Y-sKjX w%6!dKgd+Y"Iliv Fؽy\W 7{o܍S `2/6-lFhg>dCiTb誆RQ zKU)-P|yVSp=f*^I]kэfx#\0HjNttAUgu{{gKC6pOɏIjR/mO;^ ]*p*45p{' vmӬs}S&/w ebϞwm?0g' c)WI1@o"W2pPUHKe"C߼?[̱)IN{8c0]f={ETrI8H|I.p.]lpXȳI~8_ +4w";} 0ڮ+L߮Rj100q'7euf =jH\f~Satym2uT]hn6\HM!LHeɘ¿w(h^au}}F{-R: bq9w|דWvhW Y(cXQt\U&֕cG +m> 8=0fpC,4?kM;y\pD,L7?ojD 7Qz7T@ 4`rךȈR P:rfJ@h} .\A7Qn z!2'cp\+e\`;Sv}մn"w~:oXx=是^7-e݉t;'ZvY@VTdєLOeMi|gjPνE95VN{Y)!z; U<.;7] ǂ f7L wO  d˔Js!4Fv;@=./!20 }h?KvXϦ֬MzjVո d:0 AJ4[?()(y[^ C~rR&{1i=}X#k+Q,1w fCw V] AC⎆1Q殯ӰGCC2CnWm*[\Q M ={?KyqtXTo#M1J~<ݏ#M n Ss2CVB$ 5ZE$qx.*L0#7Xx $†2rH[kB{: fC+=-${f*֍(G`ˡt^6s4Jdv:N {9"x`:&J*6oF_CK&;oU`gI ;"m9HwKiu6ND]?uϝ?HHQK@|qNqۃ*yAlPp̆̃S`kN~hp;]Ьm *YJ:v?p)O{ "RP}fan1h+^sI")Ɇf DoG,DN9jؤBPWx誮PՙgO]|iDof3֒?ϴ\"өCTIJ(8V#,:3АaU#ygOh~̣:>h>($_5anH}k.Nm)1%QRHQo3+XAt|M `Pr.8Xҥ:Z)@B)6UA4=Gܸ;27B5gg|_љ/D-E ;eK!a-m fn]-pPF#Hfw;-BD9I%[GLpKT!ZW[.B錎e–Gp_}ɦ,~7|@|QKqӈ?2SJ̉>c'X7@}NXGջ}x@T=aR[)hk:_KB"JCn'za?6peMhi7ce"2jhC^c"pLy:#589.MN4:9EVLVKLPŸN-]pZ!1{ 8FVD$ pd<`N XKt֋h5lU@*yA~g݅X7O;+C?oͽJK~he, ƕQy W윚 &./^e#aǘBI)>򈰱vKhӫ,[,@ܓ)IX=jFg'40*QR8B_UǞ`ڛ(qƕ`i-GN2:\ؐj) ˞6Sc8 }~f38]箞#l \ܜ/BN#zb8JN`{ o8(w}HFUDO;e\o$La-)8~D=AWj,w%[0cq֫;& R|KȰ#@5'iwN/8n+GG{܏Q*4ГD%H.\?-"nv_!PI^[+АT'\u#0Sev($+uΤ:|j(Jv&*&kv ZSeeAjTwRlI9ls`,FZ8#9'VSg,Q2}FdQ΍`yqH$@;+&X6)чX5MvS~K7acyꅪ6ҫ{CP&F6+X0׮Kڄ|~t:F&M`R 5rK3Zm?)l~ovʩ:v "TіK„b/bGaxAf.K+@QpgpjI X~T'Y`P֝lV]!:`d_p'j^;4$E̟&o<V"t!聐2㲴f9e -BD˻ E*)2 /!bRX65$V0u G1& Y2. z 6/p{tO|p")8;m4RIr^z~>%T+%ۜ} < "ݑTzE !j$?LjݛMtd ,Ra) Åt&bkH1l5 VbǙђx Pd դYQ)aG4~4|GbyoCLbE"ϛ"Y^ޭ imPY0S4Ɍ#>=ׄ/h*jU6$=5oHZF‹z\ K=0ߚycs}[bV̰Tkv­֗J33Qk _I+as#q&zM Vj?`8i4_݀17FfA̭/JK!>Q,DU_混WEH>F̡d;ԟvqxN_1f9Y) Du搤EOHvn\z!Y/c d> >sS7iF\7ܗRDl?=L}NLqUAdK"!i3WeZKdp -)uv]'>8#/8k5,G6;9jߥ*0si$}Y(K#|&Xط=Nĕ!!'Zܺ,_{(|x#"Gh,} $^WxyԞ]uTmɰZڼOrU`X_ሲ(폨$ް#?%2W|WÜ!z\.鷆m0tcVb':ɰ+hpE42XD{u>[φSzF|LLapWZ TѷFeP'[sωʛ}WwIvA૎>jXe Χ!dAUB8m6]K%H`Uvfb 8ٹvŖo *eZ,W/#$@FN6/I}S`\3 `JT_@C{;tZ)ۘ#}4߬LYjM&E%[_peŨ8 3AbZ4ts:e䷘ԐuHU{110Z'=8'P^TL-ٛ0 gb5ҙbuфb 'ב,G$US#r'*iU` +d3 7r}˕ss|.m_GvC44gk3@zxvh҈͑Zk_qzӃuM<׷ Hs\5L@gy%m^a޴p-Xĥ69o8Wm N OX^rA]iÀb&ZHprL}^tG҅eO.ڼxfW2iU$Ez5knk o@U"]}3+#٩;iC'Bvot! aOS`B`sBQ złj'(Y9I/=klr ;JS TDXQeN?P Q;qr%{pGd8:M*J MWL "%SU.%Q1&,0^DxJgyp#dxĶ/K$ًuE~@;7fmoQ}rDEɪ YE)'tX;aec<Ї R [$ú_{}48Q i$b[ UJK8_4b@#8A=kqc:u0|y&e8D^ #l>ԢQ8Tzqg9ԈowzO8v9wIf* ۲CI0 8UQ2:z(pPg%Q(01R.c;iY싔=q3,C}Mݨ=^yKIZ R"!Q˟oȶ+v3fJԇ4VW5h=^oXcYh@c|̩Z y"@gVEz[/ڀ_$+F뭌uV`Vzٔs >cR{6uѬ7Ehe;_mԕ^ΧT'C BN:Aw#~~nx)hw mhvyRX1՞Ƈh:ZDd?3ooa:YN:c̱.zIWEqAYr5reW%&Q2(Ntur v&ӄCLhNX6@-Q we WJ@bK\yOT$a/;gbv?Wʅ&U✀-DiVJ5m| $a^ў6xHxHvFqG-R*بЗ`XVB,F.ec.ANOA"nT$h DUܑ s-rT|m@)Itt>+Cd dZg>zsˠpĻ0]?O>q :ĆhKU)0/V5_hO IKaO? ln[܌Bg.DNh(X̞nU'nܤqH\pf4ml;*<,y@$ahr3URҿLB:$5FV>#FB>Fгd#i'l{ƒ)e}q[a60y  +ByZS:ӾA'nœ,.dg]33r%dҢ2⿜Tr{OBcsgq')S:<;=;ojʀd߸S-q 17]}:03œ%|\k`JZ7>HzJ; ߒ&eT!gWxo|jfR= ´L۩+Ծ7J#wn/EmeGb[*+Cf|fcMhx@|:8QS-zD]хWe`T7Xc#U\Uvĵ KgJ{aJ:HK-\q19<}v=kJhhOyni@Y_}kΈ3^Hb!GM3 XȜ_gU?/[]Shk 7&` LTHebת1xI8elUx"g3|h SE5QOs#-4A<+D}뤄kЀz6s$GI+⏾Bۦ/޶AHCxVP[wscE$ ul7Q~؟9bEeo}ys@hഝ[XU6̈́"% |=8֚\1/ 2t}xJWќvU%nj':4q:JC5skL*g3V+*3ST|*6K&ag4PUoJpRwiρ(H6z^-bxQ26Ui]|8ZL|hFx8R#{_Ӭ3>;V[tb|Δɼ 5}*;F G#7a?U"m|!I8FMKlF;0iVt G/\RADQ BI.X B2E/b?O["gbEwV78)*Qgȳ*r4Y??M^t ?I ( !c;" &'fB/&B؅<5E£K'L~b帐-:IvRקq Y]"QaF/U yii~E ޹B;R@HxXˌ v CUx!a?cdQ17)KlGW }0HE)+u42韮)!kw{-Eq}+U&AzQ3@wŶwUǰPB|#jeT{ioK@ zK[E~Om^=mw4sFD.4TNr8鸯6k6m ̴{N6I:xvQ]* ,m `ԔC .5_ 5rDSY({~k <c-n>r%T=9;Jo Jhp~W C!|)^=_$ ;(&t\3rxIZQTJ9u#$uo2>'5ªhi{݌ڬ4$`}nu3SSxwk ~:48Rd_Aa c\9?_)㪗,hiնa.HhGt,w(ėG=+[?x5-`%zccْN 74PAC]4E${l(Kö F '. =vOܕrOrl~׾E>qDVt ?aapňA!ʽ 15Iňi&XV7b !6 ZfaxPśG%'ae\n~(&Q\)-EiCc6ia5 ݌Q۫- o ⹈OTkP|E< w"A6 ORM8W lL#ِZ.PӺ :C"uChsb4 G9AST6ѳހFE 3QD!?.<"S'brֽvB8fmS+ +ݻ*K``L]硭uB)bg^7Kc1!PY+n%NA,3GnyyDydcF+/K84=Ñr򏶯Ǥp zP4Tm0@O18Yh7¤Ueէw[zZ.R἗K|9,q g}z :u*"+CB+ckh)qdD X$<͖rݎ ru2e*5 ]A!^i,Q Sy?:/βyXF$8\CI~~Qh >°%1RoBY]|(Ҋ0i:'{饢3P-".6o> $%얞Ce3.$0T?,Y8$3O1KR: kEeh( @)yX!d_V`QQ57gsV88?L;|K$Hgܨיa**q$MFSCbc&8̓N1 -d%?u|v7e/Ik0(qʒ2w;2Bp{K]~|1%]ZpLJv @u"!aYWm^k,i(+n$Yi{!q#92 ˗@Sjۨ.ձ%0w)I37 Jc~ͯ]ZJ₼zZt\w-=ISiuh:Ļ* ݭQD1sM#>T; q@L ՛_9^wZ𭐫/U4 g$8p LhЄsRvdxqnBŭ2KxupL͑$N[v'9& SCwD DϷeuJu&:φD- _U̵PRv;~= 띩OMuI#E,KӐ:@&[ E> },z}Ɏ%l,T3hv oaMH[. Wo:MS^Gayr>.Nen..r>b<`s\|=(Sd ?,2i% 7Vzw(ѶQ!)hUn v з9h&TT8""iƝb+gU$F&QgaS"S;8/D *k[^{KG[9쥞2t{Ujjp;YWmKfa\GtfhHҟz@58r'+d% 7} G\d֢"['#"C^ ;9Ksf]:؂2_3k*f~}#ÁN,Su`:J6\'?7+(Vl0zЩ+bIneH Z# k_v+uM}"?k.(DbrSYrd(=Io#`֕oi$W_3R0^XOsv;$Z^LF+TWuUM9 x3aDt[YA澠raN磄gnc~(iGn *X2P鬲肅ƤL ˓lMko!vj3}19ݡZvv.̈m#+A!(W;4~f ({[yFc[q̩#hCdg~E!KT}s_'E-"YmTk-'sn \:K=Ɛ>@~T,$ -i67{(+$c゗݌&"cFb2H$畊G? s 8x^y#nǽ#{uj][ 8e`L1-ZesSA5T(H.tA\\p?eE1`k:usK"qWB+&,Bi8.7EоfD_S/0 $&@pnT@sV\&xVz'-'c.%3_ke r^JCKQ{3`k |Ke&DlLI%T$<+O˛v"bGl䤸Zr@` Kֽ9~s*}=bLY;@ސLJ(No[]uD1{09֍x1bӺ|)~@cZ4SC3% /`+D5ߜr,ƥ`cP!oy7$0(+;]H'|0^h%Ϭ`pAP}} ӻネ)`-7vPn/%M!ݬ1JL%V>3"R?7aBBW!R;oh@ߚJj0w@ॸ3h@OIf8N- 2:cX 7ZjWde6E[&gB^իeIVӱ:yqL`t7Ϋ n吊Xr'%ysP@b"b ZcGxW.ԃߒvY=؜,A\$|`E2 o-ĥ c q4ZMѢ|֜kҨe7Dy2B-Mk_ ?ZL2boĤ9G<$C~,YMJGڪ@)M63={ ?L\}| @ D8!N;F@I tMzyM̝q!3*^;Dj?T}PʚF \E>zC_P8;mrggr p{}g^@)f{bGcR3ZH ?__bLTUŸ"]QЂsIYEpr%cv5Jql K\,ټ#c!Q9v㛎s >$ _9K Xb~`MgU1ƀ!0F(7VxB\}`}ԍ{=0 ]i)_39(7~hChDl~s@ơ s$^Q==IjA!@csW_ pu4T8f{ e;;{1tO>I ,f&XA0TIxZg 2ߔf>*ڐU0izF$G|kˁfCDPگLN*mSҕw!K '&ոQe>n'f.r>PaԐg~l&14s?; @֎]3=ȊSsG`#y8ѐ'- STt*BqH(\#S·jG po )poGJYmiYʍN+Q5 HhUcUt.(dp> |W5 zꄜpJjvt,.&ۈ-ύU9t L8 Y w"-(M Xa8}L@ŗI"1Ljyek"{ITb@$;Ŋez_Τ5fݯ̅jEYWr\?w#)ȣ=>ٕm^ LwE* ;CaD+$9c.ʪvnHB8HyVS':Ӓߤ@Ob@Dp6({7١"قTiů1qC^GsiKv'f!v1("LIYJD#pF0zwDOŤ0C,$*|,Y|oK9O'ҹ5Ӝ Q6"&51=̥ clz>BDhwwaǜ 1rJ@X]^g'4ysc|.uEGi TؖLG =(tJř Gԩ0mp yاCH "ggS|%.ӝ؋d0 z䴁FѪ痂nɮK|W;<86Ó?B*m? R?MЙ&!mK҇`B4uzFqYGu]u^a!ȮcD5rįw#aEa${~ݲC<Ќ-J:v̄tI"6"{8&} E\|N-2hծ&adQ vG*,PsE?c f?DjOw܁ ͛U81'8慞 }()qNzEׄ{,r0$U! \SǗzq"8yt~/rZnüAkPVr=&ꞁWy}H~}d  #iQR^dRcAj&H^y@RX&~p6Ek-?4Px`O~:;.2Ra؏ }tJjT_`kČ2D]Q>MB3!` P?rr"riSP fx \'45+Yʙ/Y?u[]ilxRę'_!B!mXdϹRI!,-"Ҵ3ai7`6.3P{l0zzyg fO+/]Mb6wx|zrGj}msSi$~~O8Db G=jfwCƙ|*8zmOd2Yޝ4:o]em+ʰ"pJBAQXeN.yW@>6~Xj|_,I\&W[6Q/v GDk(!jh,B1QC^!_Ct14bSu{K#n!msIV <Wk\1ÐӭIزF"&;Z9w9PSMU~qhwv( O{2a}7X R`1*Q2Zѡ)Uv \#~<8e5$׶3e03Q 8kzVJKq|Fյ%UNE'! ӫ P`QF'(o6ȝNLpVbF0u ƌgS Vd,N&nPaxv4o?Oê>Lw#W=,TIQ":3۾3[ iAo㱳3Mys&q8;f?(NN:dKeJ|yc La'{nHYb2鹅=2M-#W_\t #yMZPlO Fb.Wp+[652zKZ%G (_Qgہà-mjZ+0@=q{:4L6@j!=m9Wb 5&&ƭS5p:1\\3c\=-Վw1 ۀþ&hШiT9ZO{OHVh&59k_OW >uFwIXXz啛s!k%]V`'̈d+^aOvi[,or~+PUESǕ:6qQlOFt6! 1MdxBlA3ѵet$Sm8?1P~SiNZt[cKJe } %Y+Rye >WTLVNh#m"Q{^Mj =L]˝|21p)G2ǒ5J~ Li$}1L|ItET@ 'V) IవeWa**$~Hx3KdZ>k2) -$KQZ̋Orqy6{; x}S{""ep,̙'G&!8I)~~5-xGMvO6%nXjl!6i,SdQRű@9b 5=~3R_@vkgF'a 5m؟'FCu>bKˆ*B0QaH^^ ۛ`n8#r 5rxbJUWx+Y4;XBU-ę$!cIم` a>?ܲ[7I~]k}<"/I+w-BY s>GfN;YPs~; CDNїK.S ׁa(IXp(:rA693ֶEr_ *ʂSoL5:-pbW8ā+g0 9n87oe>KHζ! ؗH/]fx$_,X_/0ErjK3B%^[}X汐妑ژCY `7R2?[+֪;wq@fۂSAOd%s3-XVV v=9?V#{nޖHc &cX%ꉙNJL?1g"Z~;ݧRvïRՀ50)'h"BHXe>xh;" Cm½C[4|NyV%9lԔ AƆNhz9&`i4ϡ3ڧz2LE5vգ~S%xHPEI侻cYJ6]`vɿ \l!nokG%L/1NXL\d>]X26?p7B@:04fͯKfy_Pe"+.R~ E58^ HLv\ 7{*=iyۈ< ґ2Xġil50·T{3V`-2  UǟqP~U;. #{ u}(,~OIFNp\r1|a&a=[[%5} V5mqc%brCbǼ[]4ھ4E7\dG_m dȰt,ӓ!S gZU(l+{@W9> Hm~.DiRMi9oLW6^PzA6ml1Nd~oFmEr]BOZA72g. =$4@#R QċQBś=2Q%HW`x[kThAtDֽXseb{Q_i#R=\AKgc@Ǔ &7]` }f(G+C~@IFVΰUMGguNl&7Dx+uߞ$Ύ~%Ps=R o>Tq׀$\š29)T9XzTo0YB\ے"Dˍ??dR=u_n]/SLzEݑz;-?Kz0]j6L QOlںGSV̤9p7c;/37r.f5-(<1:O=v91hO˜ QM3F!@U†: -Œ:8hLucdSflE1iIut*JN/4PLBB3~fsO}%?w(Z8*Y) `^&cPQm/ia t3YêFu_Wiz M>vhuXbNH^b76)h#9k= A0yd]Hڋ [E_=.L6 r wwVW%~˴[B8,yݘu [Af9 ::v=h`Eyx_5<58QPѡ~\.29zZǢ-[|?AWDiiÿE瀼2f3!r3ƪ*BȨ{Nhk)s/,+4xyPd ULޖ~Vdj%w-Θol`UFy0iCtJ ,cցG0PXOwwb.NgSV1r}3p&e0i3dn?d\ gy :QB1a$Amry\a (,>; yEjL%9Q07Dx#h9vKBZTcp1 bѬͿ!1¡t61^TXUc/[2L>DshJ(dmȄ@ H(jKd=}Y/Kh`ċRCXNÎ;AtƵҥ-v.;t:CMJa.p)Dl2'Oj䢻'ƚS}J]nmǰ/6+vΓXV,ѫh,Fc<M5!Qj+$И{֭DjQ;=dɕ)Ix- #Fk8v]ԸUP&j I~e!6ű"1N"yǹ:aqK>dI:coQnDv?25ʵðqqd@4Dt|3M5ȳHC~[Dh0`ER }FP־ {j5(8`jlО4HD,c"Rd2LTKLB)oREoLK4" G40cPL'c)NiOC+͘a {c{tF?D{]qLqv=8SW]uP ;w4=`V!A,\y$/BJSBBQEpid QX`m]'v pl0fg^z>&.VʇVU+pZw/KYϻ%t<Yq@XY r{NWdDff"-WlqO\&abK s65xQ=* 3ᨊٍ2^`K⇆l YQ _izWh\!FV*@/kdM W#ED1Ҭ8NrgV#Ɇ2"lO1x T3Zg1XS`1;ғΰIǁ:1}]=wo:NrS^B8_Z+mYEo;eD ?&c|Y_ ]GR襐zo0CI̶  q_wJUDc̤+RF&tXa8"Ÿ}Xg`_ lZ=B1k>z~ۘBօ%߮7kL@DBbz%"wbdJa(.ԭ$3TAbdvuҵ_ WoXwFMQ+S SR!yf)O@ez+}/:ÛA!zR2U2NT3J7T0 EyaΰDK׳sM,XL&a; }qFU-nQv bᵺԇRRe%+-lO:cjkX#(T'$N&nIV2՞ES*@BAC´[4|;[{`Z2z ̖e{8^ݧ=AϚe>nD$s'>X>EO]!dfKp_\Sma78D&da ek5vkfSYVNcG QRD`ri ^/\mF1@V7ˎyK=y= S^C x[z҂\juY9/~ 9hWt(h }ijKy{{BoRGe cߴW(NT-J[my|LDǯn݊_PU\7TDm[iΛUfIh^ڠz~sxIʛ".qQ6岥`7Uˤ/1HHv六5RoJi%L[+Ûne7=t0P,laKlƝ@|@r-lCA(x[VK:zZa}ii֠嬰i)pܾ2Q}ú|U|E+M%ma?Ȱ*Wp":W?.$>]D~# 0^6rHܸGNi.*Lýs`k3[+,JnTP7ژj:]M6>Y =AVAr{"[I9x =Ayo[( %EYcKٚ'ˆuC֬RnaBgRC>ئoꭏ?4LIQE'|Ȋ8رo *AwZTHehL"}4[G->_Kϥd<|ǎ0u8}P lb;=xxԐQpR}I4 /sQ;Ƿ Gj)W:Bs A<[CqU ]|>wׇ]7x BxrV<ۚţη4F:98 uE\ݑq*|dI뛞|?^e";F;vX]KCe㓗ُzWwn-n*ksi'jTHcx ~-HZJo9GYՋF?w` ? ~;H䲏}tj"4z4Z>Sz%>P)[/[Tb {c{{0yT+ 3$ҫ6fD(QE E_ @!4fY%.Y{!tqi &qz(6yRҋC3w7srE?W\ve)Z yL tƁ8B^3P4fcqv'MbS<3sk(I^x`Uώu eZ'ʰ?y%MT?E$a ڮCΊfjv܁b+bvJXp2#kDž{.v39L2ZM$VrU~Tfs:tqj_ߒ:ܝK`H7XdG"2ܩ}ԅk٫9Uџ8 'D9Qb7Э)Il,;RjuM<%y tWlBf %($3 B~ldW~$1 %y1O俑Q?I5[՝8SM0\ծUw@N[$OJRɀ'OkNňEf񮐰TrkR'nhqqQHl"q:7V3e"xϧa=Hv |4&>kK Eq&o߄{wjW(@83ΣxV._cRCZk iXWl$vlǓA|ΧP{?d:>ZupVP8&7؛\p`z-N"ZX*b!X&` "0iN>$u6dp]"ɠUF+cz(!TTQlVhΕۛ\\À4 c~|} Grlod]qDh Ul7RC[Ӹsh Ui=/0jYYyI6ptnR4nt=Èsc"MG֢ ||Y -sauHLaKOd`HSIu[h,{=c{YCs"hApF΁y)?t9.K<VrM̽T%*]5Nr Jː{孞O`S0zj"|x7I;s[[(Peor!#,nYUHO+9DT?˖ɥ10x.DPςF)`U`5!3[zq-EHbpAMSM%i 5xb,꟭(O &%JC-壥lޡ˃=i8)dTb,WtNq~kͳc샣tW.}'O7wF.Lz/N{Ј/&KϧN^Ǡh )ޑ TK=3/>D#瘇޻$MM)ȅ{Tމ5;Ǻ&yûL$,]`K@IN)-LACz9IN4UDeDJkJ0q24Vul@lx$nwgFB:ɒg"'~̨*]rHƺo?ߍR;T_gg,d=\`e6[D~Z#]#H4&1+<S*)/f1BthKV(4IDbJ1$]0]2Җ'LeZ:p+y?߾rL_Pm,{B-]dMXK"k2~4$+f8|T } AXP]6dSLqSCU3w[|p\=Bj3XI&Ё#>?UFy-5^i> 58%U<+D^UmTs{O$U}lμlNi5΁ND?#LڳTInW[>|T(Nm,fc E|ȟ'$=`:j|%Af2Fl#\w٪3>}Q`7J,pΘw-({IYC2Lmfcj K1^u+snEKV s 3=> 8i4Q`ts4M:§IKz_% #٨o+8 5dn?G (4[l,ǤNdx,աYc_LadeL,hVjs)J[Vy5"t$;qk>I5ō |MՕdдA$~ ՃO Y'6ʜ`+>fM"uOBNOA⪥|xHz8ɾ(L#PAj3lAX3}tYgH"/ꂧA(l_P/cL>#D$S- ͳ?7t1]We7& yҳM\3QenK,N67~^]bFozM;| avM_hH#Pi1Z_vYAXF\7,rwݹ6a8d-ˁz{U e@iN>)Y _Hӻp|d4I-Q7A,*7Q%^DVXB6꺄2B_2*}Ѿ,dK@b_GlSDh#ySM&C1c<47 *O"% ,2;fr8)qPCOT)Jh30+]mv]v9ڣC>a f̍`#ZL77\D@cmw69[١P0`#?9mJJ Ls~f5c2g1nZ (?R9ߥN /*s-VETW>nR s>֓#ݼF$LVVXd?QXEM5Qkٝ躠#h6l93}Eʌ}^7"Bna^͒ޕUЃ&3qmsWҙ(l?[ )r;ǕG;op&-b(o $ulh!~4`Ĥ)T9vN%x 俆$h!2 L'0 ݡRnAuTrACe T%d>v 1)^r6:MAuc]4G,Swͦ-ܢuE[BsCKݙ<) 37_8փ䁡k>mU_(׭c6 i5]7n;9WJugֱ!U aYP|9w8fULO~q2\MO>b뫝cX@bWaxx1ίùދl9Cc+s%pO~7DǢ'l{?5#}#dJjxrvrwQU$Ⱦ{bko~J^y/%֎:9*!R~g2Q5׏$''i"wۂX{>)3+"5~/ 4`9`k2>JmZi-a04e;B {n&-\Dӟ33-,^tz%Z.?襞^OSӖtJuDzdHXeAXm{nl kƴayF vhfl7o* q)N_5+GE(]haʻB<]4W/ZQMY߹l4Eqzqa>y;e+D9lwKbp0z(*&,%KOĎ<'-sGogͻ.ߋJFڜpeg*QoOfBmhC,Z$D+qD"sፚϞ̢|)ǠI=#$P g"jO5 han3 7췖9kbZݳҬ*DFIJ.u)C.`X߭\؂.#C=.U(9Y!42Yu39秊< hyo7"ힿ[ C`w`Wpذ?Rܓt̺Z.UVOijzۼp@³cJ/b͞cOT oG| .Ke: F>a~0K)lPt<4j'gk<ѺW{ (K~`1Xqy%) ]KKMI ^_CP4OcĆ俚}& f#G4Tc(EGd gKa?=WB rl҂㖠tm6):Az^$;u]:lR#+әi;XA3aIU?QA:O`GnH %q<%uU[:j:;sB7h* t[G+ ԞvE3) PBEaę뭃-G\e)|:POY&$eXHXzogsy)T+ -HZ H~+M%z#}m^_ʍ^0+ZiAq΂Xl:E~;6ş"[rG060EuO^ɓT=oKH|@5ő(Tj ōG'in~a!/@&PQ-gcl1Q-lY0W39Tzz=zg Š|zƮQ"-݈> |WfLO;ynһ2H%"$z*h*gR;1NÛ"s8ؑi5SI).26Hٌ)U063 `ޯ*M/.|5Ul8i0?asiZiBIudC cSDƴ {aK($EKt|(O8h-%{x";*?pf4|:<2v?n,MZ9NEkS$v-s(a\ެw;xC  <) ]W g+)n|u>}? MƷIm]YM3s/bicQ#mduJ{< {9IºK/ OpGS ֌Bmy<*s2އ3q/+ T3LnS/+DAՔU މ .i 2vu+D>%҄^_uSRv*1a},kXF \\3Ibz12z`F-vmxbHơC?foyI-QEreBlɎiI P:xsqaf1ŻsSf S_ZMz(^AB&weNvۚdZ0TeϏ&,8QI ,W, SC^~bJ3 <xp#V'?1W'ua=+RX*{H \9ø6 wigIT7'>Ba &\˟"ܭ 3"Hy^w q@MoϿ&M3fGElsd1A%"eΔ1lKUS,u3 {qOv$'n/mӣBP8pgK=mA\.(bv )'BvQZo;]Z;Od7ufp}ؓGop cbY"6 ~of3xNn?yOIDUْas!"Ejzо ػA);)` TkD5bu½(T8p-4tnKa;C/CU|&:z)B4\⚕}~dR@9ˡߓqź0c$J0\HgfZx:PҐfnAAYIDQ({moژBx9qܥaU#,`6܉nm;+5#A|BP>lC!I A0 mJEjq0$ ˶~< U*15dRnyCvF'/=HL:*Y,2,&[ld^>Hܹ؈Md ?ܭįhIU` |̢N},WI9S_4ūKFrW!S,$}JT'`3<À2D'!ҁi!x&bgS"NYԆ;OԔ]t+Ve0ԓ']|n*a"3ਟI#I6MqXD_ Q ΆF${1ᾨ"m=Mwz}䠢Nn^%$iQhM&̆ɶ?J#jrE^:ꁴHpҸM3s,D޿pqs{`T%E3i`Z` m0aUlb\ⰽ v'Ni*\c3rjVѭW39pS&%NAM|AP¤a)l%q'G7&4 u]$7n$ EJ>U^{Hm>\7c^YI*?Wt_=÷ Vhs7Ot䰒Bm[L ύ3,{઼%C0*L򄑋6<9Ç]vr0JK5Hki4_A;ja}C3`|`>9*Ȏagoٮ^EsƖqE¿9`c\wU"XjOF 5&%##ZL? 䱞uE.CS  \XzMelB*#Q˩ yHW3&p"`7Ȥ=Da$5.Քg^*Ne-4>L ȆVG (7oo+N4u:c=6ѨnhuK$I)FC#bIZ"*$ 3/z kwWr^b?f2A[=,9*뭘PBf Zr}Q~X( ۢK |U>LQUD1Mm9O/&8m`sފi{~Gȡd2qF1cyנA8*! چf8pVay%M2i!Kpl5°[r~ C`ffjOc|3e\bѨ JZi:,,BNjg\*|4T xD6|6p:,L&/4RY*{ q iubQɢܧyg2%P>>˥ SEnioC4ues@aHL^$,hwW;Aڪ!mOyWG0^B2!D.%7<[Y%67ZH:^dRJ>ckltaԂfA+7ޔs[ ̞Qޜ[$;X;CӟEe*Srm$QsI:\{gm45(jB Usb#O:~B[95z*=5+CPTl"/dɱe,u$kMH~xTfO`Yx~9hyZnKPigzS-HwV k3V^[@ O;׊* mw.%zf7&'U=Q 9(PՍ'70 K+V7f4CkmPIPډHq &W[#QSw<S6 5ۏ ǃą4z=rl@`a]K+.!_ B][ö>69ev^{PabАȇ_ԭ}JTxCʺeV L@_CЂʚuBy(/ *\,RB]I1$vA "˱Kb18n՝ށ [%dhHGY2 5/Fw RE=ӁJK@]uǗT困{DW$iC!z#X>j?OT@Kw`GA҅>O  B YDw} -E>^o^bI:@_1=_ ]td8>D;[^%FQi)6J+GA0d4!J_À( HmiLPwe=/58CaD~ĮD>ukhQѺ,|ä`%3kdq_@ƌL'߲uK;SH!/)66Ioj*tP +)ެ)4M^xZ '$|mdB&'v&Q*=csP+,S _yM8/a k,SX׽j2,En9"mm-}@Zx+Tւ}4 VYl.h%Dm>_cݻv:tAkX֏1tCqr2 Ysl_$e2ԨHٮ9fϪMgu34_>!nIrV)՞=G,dV?ZB] K76PhEƃ p _ƧԴ yh@> l<"HRM 8VyijL}X@vKBA> d9`%J,5cN|]k9 o9=Q˜f.86?/tS۴J6n#̙M|I^z `I4AG-k4t`M:,삌v }dQDv`dy}(nfՠh &?=wJF{Ί!uäu-D 2%T)cs43!F_5}nqeB \n X˸} 7⋦ '{%İe/Td?#XR$Cb7~cbV>I 7čMY2AN`=2,&tܬ[&5ͽ/>r8$UVtl)B _}^ط0؃Wɖyaxälb  jT 0bZ rRRϦ2~m$̉ZiIy5AWYZ"5  X<(큰uCt9%г?m# yF˻3K&p_cMballO@Gɨ| :,}^A# "r!d+pTLE?[mY[πniړܸVݔ}XJ$޵{ ^X2Q]Sg E!gbo C \?)!/v.:_fq>۾gW`]ܤ$? 1a5!|EkS=||sUH੧OPS&K-V?FeNR߂GV߶N"dm4d }sw}0P2@3m5Pwⓤwz[պwRֈ؇,no*zV*`Tv$~q`#8*8չǪz`Z[9p)q0ZSv:g8϶6K/dl"u2#>xK7Z>G9V9#OL'l;h\8HԃFFaJ+mNG~5Gva>ƅō_.@C];)=7_acZ5C5uC/f [R)[ԣ!XL|qDnAn ?5+y6`o_ ѰCe[ YHհ$sXuF'9 yxN>(i^cG/kRzW!VkTw6фPs Ͼf6[dnm26?d7uewm&mw RA9p+PXY7MAoҁ[I'W ҽ)M?|kF &FX72؅O%Bɺ[|Sz|\YcJF~]KI W{({Lc$eV:pNܷR*ϧ%~^xB|]S&L( ):!pMT'JRX.b4d ^\sp:@ԅW lUO. 5dkz dJQs'tL !͹W8_0Fj0*Xbmͅ UʖV=iv#P~qd\&3#3H&G@E:~>\$91 x.k?KۂACe=`r7N;aK^.a`Q GP:tV'IyIe ^yVrn+%YE3Vu߰nC7T {#@w\{7pWӰ2:L< ܫbK'6.gi%PN60+)WZS{c78kGĤR1)F!a 2|}Z<{([Sosgǂ=y|l /Twm8T[d!Kן*%, ^J3J1,*UHia P65?^!F>r¼yf،3۪#aZ5ӧdtlU`4+p͑'4͓/BSZQӕKy##y*i@,7&v=RPir"Oa(!-{I 5/8l~{ٍh+Rp"D2W۪"3?M7QT?ڍ `-=N&YpÀ~λ'!CNsM<@&D_["wV4bS5aנ!$(߆5LWt e[+!~(I6Faݴ-A1AƋxͤ!X}lW)pnAŷ9>qhƝs~`* N~j>'s?/.9dx?uNjD]hTe Iׯ"/~A"P@lGPJPuSCe2Jj@ޒa{VߝVQ!eTimp吺B;F4)<.%ޘTňmM:IGEpu4w6iˁY˂T0)^UOuZ|< fD򹺉\ ~XP#AfY3m>F鈊}Ec]MY7t|b{ ݷb%bN-f)N5Bx`@gnO6NI mDti҆e(wdo.[.TcoAۨ8Ł ? ܊܉Yk~?.v|Tٱ-r&CBʟ|VϪx 'hOH{D;'*/aQb1heؽ?w'$pżyd3Yӷ{DuV$Wd/q0+oaq? ~pF@tMxr |h`V LtZ挫IzAw`[a1Ь5ir(L٦+B\ qw'V!4[S!."},lt.ጴ-IIe3B@a栣I3ōtzb)x~X5j++bɭ&mӄҲZؾL=.WRɆ҈@1 (hRD'xꞺEF#OE>evN O"01'L/"fjZjE/У\TL 8F#l1+Gɐ~.s`#x_B$XDI_,#z#e"?ɵ!ДI@ʴZ4Z-6F42]l(0s)4_!zSe2nļײ=.σ` $1*GIbgU;`#p+c'؝ѝV\ZMSݵO EH.%IRfFA<&|b%7^*Q&$1:f9zE/l@XP<;4.]oݬ,SsAnӊ]U dG[X L.Wkrpy̯5Pw[/ Unalɡ^OAK J΢Hpt  e">zcr<۞ _=>Thw*s4$p8#7+wJ-ybLgx[l _~|`)i:j!Jz]`ˊYh52fD٭N+=9fɀ*ς*')yIt>Gv{CUm&i'q fS;\Sr2,rN1d(Hbyd9,^`$ρ%@!fSwI;esé :Tvf -wR]Bά 1.k"nljJ pxK4G ։i-(u.35U巍^ v(7I${])C^JFYFls[/ xS}wO4`4:u$ i'R@<릥gB}I|YJ?"PpN/>~<0ۄ%]mk~ r2 }&Z~ G$gAi[[\ b0hfW-KQ6s3vR}j Na,UhX-q[\W~4GiqH5̢_m:u{Viu^ˋ.Gq锋 u}2&! }`&7Zs"I$l' on_e=D}෹HRzB#?2f;Y{!4 =s1@G Ɗ-VE[9)v2 lnw=g_`^\oaVX|g|WW䫞+:g;q, bFb;;/Qr*<*赓R{HhA2l`(f\N[yO@y'Ȧ{7)n *I.T7G >Io.ɎbB]Wb!)uzA?{|Οst)0 a"q[Ӗ-熃Ȥ@[:Q4CA%ög#"#g%߂pb>{1jvEdi vr ov`bz"FŤ>\Քј\Q^u$eCV]XAFz5\ $Guhw8Pmu=z{3ЫvιfrRp:u#8}ݠDޒQAehF*-ulCq̬(w[qI?YE˾} dlӤV^KښDR%۫\YDY re?ދL|x g7t#wʱ/$mUuQkH_=|U+$͹9]'03ԁƙN8LXgD2U68^̯~%zl^#j1,L Oy}zIj ~$6w6%oąq1јV}v :-\,tq;Z%RV5gAp0IG,-JW΀zuA[@Ҙn K$  -FT0$~/pDY(LLt0NFPyjI( >7ĵ$1rxY8~}ģɔW&}sF$sAuzЎ=6Y};|RmXWf.>zpE[UƧmG ! =%o7!GUkGGq|/2_*i^4k`T086URQǼ9֎ԳҎ"/`K\y oz@$&(3=c%.9WXrĆL- :):poBcs/[k@~5b /z%=ۨ&ˎ,Uv74Z/-G͖v1068pxe~ m Lڬhc`5'X+}HlN sw$HDP2)f@nD`{NEQ8:7[*Y,&I=1cKm׋wB&pJø!GMj~RϳTg&0kV<zx}߄c+Q(Mqb ;14fxZS&WZP[?stojOg? DO["^oK~@of%”j>-(8%5Nj[PV4\&ЙD0rxrBX"|D,Kӝ iǺ9]h D t@OLz(@ԷQ- <'6E`LŮc#NYYPy8ŹPelUH Qȑ 7x0<RR[V:@j s]i;r95ܫ !q}`J 3 fh" 7 c>7QfC*%jXK9fv[vOa;]fҬ[m ,iQ<7.KME5 / y6`n7?7sqloS{30e橰:R #Su\&N|9˟3XF3-b;wղ9-yv !/I{| >.T Ϛ[[zSE1_{\QAtⱃڰ2h!~fM[o'skY֏Ml^tqv;"U)BS[8qUxG,Bu3_tguM,4]+Cn>nm^>dC%2q@0veHmB\u'z0'˃PgTm>p'|XI"^cڿV owM%u'T UqJW܌׭lkJ&rceEqXqv}*+D Ť*ԋp]s̥PÕXc l W*5+-IJV"OBL8AZRzATEƐwШ'3'UÀşe']!tY8ַKwwV.J<1틂!}mj]y+WcJ!15,\VOH"vtFZSn)V5^NSK_~$Uodtw[$r\tv_1~[kr8ϡq3$ ܵ//VFWjIy见CrB/+H;k ^ j˨OklzV"ͲӃEUsb& 2&%vPtbvKVor[b7)+PiEȵx$y<a=K՗/"'#y}%8BnINR=g ~i4 pRvhmRTx!J`4*<׉#\{w0AJ6 m2V:{CKOi~ʁ9xZv A# xAʌP߯X8|ʪJli k.,S3KχW_~T<_ExӣT<π]9w Ӷ(oX-'fXv;څUə[_YyD=wC.`jx5¢b7X\X,Y. .Vw FtYi!I7=ą9)FCcz6$) |ge"W]J,/Ǘu>$ i|ڹx?ư:s\EIXT Vt9 4 Zuֿ^y_y&ΠUpAc1سY\Po؆;2>v[j5멃5c.<νNvdDo% hPJ~1I)ΔuWhE:5wՆ ĢL) v9OS~2*.:&Ȁ)H9V]Zޓ2RupWAIˋP.7oxU2-1uy_><"se>Sߵ!-s-!7& E+Ko3җNpW i^݁aXy++ll𥩞V@fr FG'ԋ4M0Dbd b~-Q1Y jxz o&tp+'Bk1>+oBw$-o' FqcΛE4ANG;]/89%e&PD'!Ɓ;ӗͱDZƥ;!N;E ׀eA o^Fj4t29PU%iᶕH4uqT~%8Jfk2%769v1"MXc7f33^ ]l~E5grI])[ wyA#(,o!~z}@'R&QE)V Sˇ7,ɗv{l>d&0_S#O+9tB9w5d[P- A]҇ ON3%o5 *uyWF^J<|YT5ֵ$*stUyso E)P'=л1w>_!s}rC['{)5 CP褅lyMmTD 2[k8FNL)~Gmʯ  Z+ISxD!9d]X+z.%ho J iձIGz3B O-qآFʯj[6x ;&#ڛqb&8;NqΜbh\MI)&VeFR9 _wX63kb)Yp5O#RfW醝#76Q鐺 ˇn/U]Dd^:LR4zQ뤤T2Yg%I6)*L2ζ@Wsh.xܝ2XpJʼ-)"^ "P d|AM!omƸeŽUW߶Cb;g=qYP i"zރp?=dnbZB& GȣvngNugKf`h&P߇E<9;tN"tl{Zs[uJVX)0굴Ԥ\$ϴǙmO\sܒ{ok8_ HBxzYoZpsͥ~cXõVPI5*cRlG~H/.@0C#%e:ľI4#IhH)Lq[pVg,oTsE˞(x8-VfTXN]NRhZ;5V1㙇G*wDB{<('Ƣ'4X,J7zy-.7:j iMQ"U>iM59+v(P}K;Bt쩖G츘['#"&,R~K垶(竔׷/xYE[T{%`@V8Mh{ "un!$Bi^q#0 ѽopP(Uqu& '-463 ߨ]Gn?Ӏ֨? Hi?~O J qH.f FǪ㠆ևKAY:}'j sHνW-p#IQ|"r8Ǣ;bN0r-v8s_ѭuݢ`f1Nkp9M mN@lė es[0"7}dLw<$%|ݘ3 :gKXHYs~@{ֈX?+. mN&$8^`]$bE!K(_oTj Q *?TLܢv9r%ZU9sK=.ԤV,UOC"{&CtOs*WyӐL@Rs&iW(ƇhϒW(66)PэV*bB YF8Mda//]%ұlfRjtJӮ9C."4wun*͝{NOBL':'`|vWSnqpÌ u4'5f38Qˉ\?AY O~,iފx lƒO y ℻[¤/l|9+"_ShK4"{dEypO?W$Sy խ00L>{tn X5-g'3d,)H<@Vk8OF-*qVSLu(%PIwcsoz bGfLE2Pk0mFnv4T83!}ӵO?.ͤRܹBST,Ʌ|h86Xr JԿܼyjh]<b)PmQb^Hbh۔{ߢmktmb<ݾ<< GjRte3= r%N1 2J=aAMF1?"x~oT|7}ꙺە h* EWIWE?*~:)ygZEsꚤۦG@e5jUZ熶*-CWL6p8y/^tᗾ?? t,aMNZwMP+`($dNJ8L-k8X_ӏN:)VNyuU4Q`ߌzТi:98U-O:?XċJ0-N 2 0.Z7yTǫ?x'8XΖ,++eFxjܺr$ RnJD ɷ 1Ǣ. k38R- AJMuYmCFhd"< ^m@BCSg.q抷[d䝗۵E9Ɂ6P^Ԡ+,kހPл`dy?fE!O{Lxy4JvfCvgÈ ZS}yb`9>8`|^-:"p 3j_UO&4&UP :U;%vxs tx@O/fhW2aٍXexR}Xaɋ| Diҥ2Wj[~%F;U-OE9;9M32vn֫E آz2ty[ih /csАGsoᏹ`c۳ /{"雒JK'!`%Z]cSP updAy0:94yT1(\M1a # ws9M;#6qy7kw) .'.S*<\IEuh?v@jH!W!oϯY]ds1^10jZ#JDF.'qH_th NK)nhqtΆa+¡>UZ[1H%U&Q~Pv>mr;E OB]_ 'T{k>8(.JπGqZ4M_mx6rf0Q%Xm o :rjniiu@ڍcbh|ڎR"F8;BS2qo_`o?$< 2pjN|#/iF.AI{jc$ (3Iv(tձ{ш0GXi9|N>zu,Ĺ2@qQv2B"Wf C[&Dq(=̄KƜ`DFr5C+#V?#8u/*,$ʸl09}xע梩͡T%8$%L N+TM n|kŇcsn +}a푣@d@B*{._[Fnq0}[)!P<_l76&vXR2uZ ^'KP>a:ʐO=-Nq,oRX>qp@Bw;O@#=`#sᷘ\8()Ձd!y` 2-uՀI /uF{[`,^-l}fLdJ?T-oC=9 < 2|d*Ô;$aO5aBW)qs)&lfR"}_8+-\t uWeBQ?=ZP^oS&Sk_-FEh(W#K+LExp [_WY#r)=gb0Nq=g5܀4?B4^&- |xT^H&( /^?:j7TSH.S.t/dmF s#Ȝ2r), y}KJ^U3ߤ]_MSc[$-QٽTX|HT\tjpSaEM>luY^di4YӵvGaf!Y5qQ2EwrƾYƉ˶qh; zKdmnhsYXS*3SU9uܵr|6| [%q`iV hZ K; Ft,a39Wl#vM2t)8$D@=بTMv;uҽحD-,WlJ޺2`/-e.%>v-rϺZzR;jKs4ZnDÙ9msє4-jwI/t8'BѶiW[M4ƗZMrHCdF4 ?l:W%Oϋ0fhBMYnm5њ{\Ʋ[ c *V/x^Y^^UVkPr 8bX2־Bl^&L$n8>QNyOtvγyqIMVb2N1 \BaTͷIwUm\( mܤ$[J'67p-J} [`/pD)֏uZ?V)B}y喉 (bb|T?~T=EJTt.䞗lU.h,kUɠ"]Rhqs tQ\M,H-?TaX&e?IEfy4uCΓ:x! I;1ëQ OzBʳk @):f5YJ2Τ[~*> j_WG7F S;HXqu+.<ÞedG%~<82|otW72yU $?us:UxsE DV`H`vb2Cv2c$ZJb_MP/d u9ڞWheKB[Ԩ n"QEBD6D4)Wghg"?_ ?1Dr9My~$#31dY'PoZ&j)&cKi]ޠ]9ƾ-0N{Sd/pw  Wy?1]DAkLdڣu31n 1HnD=7u6.ߑ3{IŖx'@uߔ1j>:8|:lp_5J\=&=eUf2ZӜMuZi=PAJK:5qe#Tf\<"`" E:]G,H[ae_>Ν؞P_|;+:4* ?9;K.޶u9QJ(_O=jjO ^TJ'i^.T2&u)YO'6yjdO:}W/ h;QqJ-X1X#UJU v6XKvHE2 LH%un e'VI6Ivyբ[`+GujXm%2o 3P-cqaB!X,oKT i,ǘdNU- Qyؼ=g,bqQ Ɨc}n{QS+< gX;Xrj ]x}-6w\8]'o\5^2+s ATD=qIX +xaS $  a \YD.㏤gŒE S;?I"F#jwL{mՈf [d\PR<{, 5Ce<"ed-7k׺m {0=Gƥt`.b-& 遹:X0NqUVьLd,)^R̸%n.I_w6YxkeE/nYlΑrKtEi8ox~3iQȥFq>,K%nM"$?΀F:m3SuضЊ@ nbM_Ifï.ڦsDGlB;8Htf]xi;/W¬ͭ?I0Did):O~{ph GX+>WP,Nh/ H}1;/qZ{fxiz ο|0Fu]0]Te3Lm6 PlnC̗i/|خ] >UW %=eHouH}=BlB6`! ?'\@8i+Նh^KNY/1 409D KWqmi]#dZQJ[DzC4WԎܰހДdSͧH:z.J#g^|T@VrCuyxcA^=mC|jmv>C4 Us .(ƷsJ Rh۫hQ,(VD QD.{ Ѻի0`2_r]ۂ!)|e#<#NCIg[R#+rAVs"u6Z_$fS^걹FYˍp 2LMw*ߪZx]$=׵`8D$3 4|7 3_44Z4?W9ɆIA[B$sNجG[2i/d0NL@L&kH͔9!XSrZc'Tx9Ḧ́cU RG'h6/##] lh pn_lBQC 1mC+П;\mSؙa ~X&>SrN^M2Ѫz4JdE.=/et~>A'ė y9~"Q,!b>75`ؖT78g$A]?֣tmco7CO6." N>dݩBh8 ZBk.U̅DkC7(+H"AxH8cO4 n\ywM"wE@-/ 2b*tpn  oT,[W>ry\?k:u<ֺw4"\R1[aZ>6@K,Ah?*.m#&z^Qبb󈙃Qxkh7boҵ`* Wm뀥6m ^7LCZ=Y${~ղ)R ;9RH %| N/9O%3gr6m eP x<;u{9p62:K3]%"Kxq}RYCVfz9ƵS޼,h8Au3@ʈ%`5 1m>B?D)\ YGg#; ڿZO~W;($ -DJX] f_ڬn1{|CRL^<78iK+'ޛTq:hެr*5/Fẏݦ401?=4g[p5]F 8q/`8%hH{=#D\ۥξi4#)7޵@WH2wx\ DV;˃&PP>;DZo[a+)7lEAp,h[ˎ}6)0, ĵc/TY9b$}G1ү@&採xc)HR~Ng[+:n[A_ʈi}_U#h\7Wc㬪[GB`y}5$YoԕR]tz{ύb~% xe+9t4ΣY(=ɘx3E!LGʚX0"b;I|pi#)t2}y|7e*L@wK1^KDۛ uAHӮJum*4YbxvWxk sZmtreSM.5LuK"#@EA ~f蟿]6 cƃ7Gz9kS;G!`J$|ͩv7'%80^(Q1 6%']?o)ؿhSpTЏr CL 0w偍zbMt╎!~`\bx[hU;r536Q4ogtsppkJ |!yC/euJk]Z#HtI19"!.*e0`p^6b{>^t7.t\X ) w?D -ȯw&-0u$V[?qL ,w =5T˘Uׯ Pu|T0U],NɭY@!U=JFܛs W~քytH^‰!;ZI5In_Igv'9}+kP #KI/CU N i{h?y!aٍ"ECVÎNN&:t- s\:7TpoW4{GԶfu1+L2qH ֧Do!W#ˠs8tVG{$=p6X@E2] B\^5Ҡ9REgF M oҢf.R?IwiUzQO<+^ 'N'ڪN ĸhik}Ke;Kܯ$/q>+m3S"NzɋOI"f:4ݰ J7zjXf(k1S@m}+ %@Jnq sy;[ GXRL'4^k\7v=K|q{ܾWT$sHefcᠦc- Yn~]1FdZlD%- 1Q,XBW`.D:يy1@7s`dI (ФJ h綴WO__sGw#d6Ɔ^Sֿ2Wztoa|3 +xE't >QfKOYv0%ɝ&!NwƳuY巛]4;Xxmgq11kfޕp max~KA1nvAvGbvԏKo1okQzH7?8&occ*3Ck. y2_yK?kj3>B>s ,`(t(篪s za9Iy8F/ g8LLYד)xR1|5zl7{o,Q DG? BR- 礆TG4sE:k[[30΍E:QX+vF}Ca~`iauS8`_]5j"S5:ͤjsNrPo dBnYrkdcg]ca%Zdi@_ Ƙ6$Z= "]t^y*Alts ]iEK?<]8qd{Js| &1_v͢ag]K=REAX6b`xs s ~X2"hvu `ed XJGo0-"p aB_j?E*K{`PFRw#- 'j h#=UN iM7M%25!BDrYP6QG0]:œ2n1\V{MkI}FtvR%T-Zߕ~֞[j_A۽ klj{?KHv&_د)_>J (U}!RtM Ĉ*BQ=pwF@!`Hbp`r}\G+>n"%^Ipoe ;׭c%ИZpLs׸, 5;>4WGEp- hOMȱ,62~٘SdEL0ߕXjLa) hd@&yfگ&!D1S;5;{TU{:ie9ꊑg%sY@I280b3hYj_AɎ[%3:aK ,F2{{I: 2syſ`1i*iN0.iWWr,b7.Du C@B(7 ń-w<AwpIBn &CJpPU60^Ģ/ w8)4;E# պ27 Yds>l[ D$n}bz'A-.[QN^y_~ 1f AW&6MB(, <;ZKf09W4߅cH%^8IuNlϥ0Jń2K434q>AmsDړkD>go0_'J`LtZ\ s N8R9r)(:V@˦kdz]mbaPOlD+C|N0FA }3kLMJ$d0WpBp,t]_gO8 |NL i>i 4 k*sE2R ,r)ۏ[i"Ǐd(\1@00<ϋg`nOwQE ~ k$SvuO+=X_1f$bhpe|mL6ӊyL UbDHO*x]}{ё"S.y{B*`ۣB0kmlďiʸ\T庼]g~4yrd{3k,(숹E^ZseayM yҚ`&CXtՆ׬KMH`'Wm$t>a 7H^0LH TYXrqw5Fֺ\:Bk̝ %s$ e,psza7[L 9}AM& z$_h'(Z ٟ͊ h!^AB[¸X.q6z@Q"n%VYeR}7 ٛrn6uv2/+?S  7'3ևY?4*:ox չ;+" "mE8_0PUkTDrWُ.]TvI MMȀq!23,@̈ QrVxxn鴙r$CWB_LB4VlVo1нwN}9 ao}DOyi^t菬M Ŕmlj@_r!S(C(a<|sȩZ)64o)2 t/ScUHbouQRu\W؆w$fl ! z Vԍ?`s/( ={ju1FSM<~ho%)>Я JpFZ gx?eE]&cIJGswO-AT[`Ϊm^^n뗱z\ Xcy %[ǎWj%ح'ye7%Ğ}?!=zY E+0r} 6JuNpGk'A›Sar<厣 CthzYH:=֑-G6[kB\h~fKkA\ :+B0=oL^\?zٿxT8 A,&e(fMZ.J\v3fzAN/ q(><6c(CiTT{H<(vZ屹\(YLi&_.O#{T"|ЮuF 4G{Z6-s:SN*M}1I 0z5ŒRVď<ަ o0ņ;BKۈc7wi$hpHԡue)/|nBIkj6!SAyyys1j'B="# qu ظx:xBx3~4Ёi"l;22'#} c "Sy b$5d%\abQк.p\1ZK/Fs.gx]4&C>kRfȌۉ1~a-B5}5%0`ѿӱ 1(s/q`'w2.!D|AkTRyLwX"ޅOb%j_!č"ʘš?0WX6s>>J uTCjMELOATpRW1( rXHF<0prݨ1W6mR,B+UD }&T̬jaM<-#(I}9x* g&;3/ UQM.$|QV@%Wg}K!h_!*g^@kGyqF.msYX Dm6V\l `oeDjDLBS#}3% ԨY:z2F1S ,/p8*pMbk=_sX> tu-zHR SY3B&(Sv?ӌ;7ʰAn~a`+d6:!Ej'轲(0|([j+6 ѫ|#Ǎ!:i/.L$O W*Rm* "2M6Gw=#3;}"zƍ#p;FZ([sXKcf>Ѱ'[M:rRxK@otg3bW!f~č+jG5&E`7;*e(V@L++S07qi{Me(>$:K+8:Pz4A~S#q}j8P_dȔ&OvY¾!s\K5w09hY3w00F#GN1VpN"O75ā,dT3bďМ&"Մ~Ӕ@{[t/!6j Gݴ@lm P)nDЫFu'_Jx]I%Ds^N} >">z:q,"TWhTm P5/shr)V;$FWHfH-/v]­~N-]:Mlw_N) b#_MڢtVyo ȿ8£I$Iri@l1Zgc݈^}_sV4?:1Z)eD@N-+'#Nc3%5{ BQokb/S緕 /!4vҺ%i᮳"$t6ls0(ؤ z1-'`3rT <2Շ *ҒiGd/FRgp_UXQyG9;Z`cm-|0tqBG-U+_nT?N`:"4+|3H'#$(npmLOڊ>4d[N8R竲ފ>GyUƨ\*Z6 `2z c0AHJq$EءHfA۹]zxV }L?|;t%ކ\/F\u@CӰ8B X̔Ʃ;WW~2fO1eAoo%ς<Ě!QkT$Na=4$L+sWgD_ZXwafjߤ" x]WmzŧA¡vT̖z4XT<.ӑupN#y2$vJ@c/-̍ЄD)gUp7R֖G ESc@ڳluY#Ecʰ*dȥԤzKXq%٦N;[T#KxiG¨/&0tc-b4Xa7¿QDؑuZ7_0RV7n?x Hf@^`@S-=UQ;$*ŰSYӶM865Kp϶n";KA r :=~ s3[{RsUB(O (>e۵cyƿQpeIJR̛Y?Ӌ`>ga~X=$'v>1ɲ1Fk+ᕽ`[(ne3k)XH2٥lWlX9O7_Xš!D# 1Sb=ӿۅB[[ D_Ηr1ů>ST{ e)lA8k|TFޤFåmZٚphE}l m=#'r\1'5*|TxN'v&vi6PvU]F^,amgj`,3ޝ;uf2<'Ѧf@=GUL5։v:O@ ށ6j``-A-cA7bhITnjQފ%JD]Oq1@s9EY=aB55裑 ڏ3;2i#3 ܜ /vml's4g^imr}Ք='ύk5 u3?y4`ʿN'kfȾ& ^~/rY x ϙKB*AV3piԟ4j[([8j*{Bau`i 5JgAndS?_F:6zTwls tN)no]OFl}HFAJn6D!w|(-=`5ʘ$j5QEgh # ݥ؅]E\a'&DEc7zV8 FePDΆƊ3ϱ,^<\6;'C$H8"Y+vEef<h4KSאJrz newZI; 9/7~kZFz[GjD p'an9qQ8vG8ǽoJQG w|١j݀ǝx`#S]jbemHJa))M ipqGp{;JY([r9:yH&3Wla6@FUAd6lmbt~6O5k!7BV)7t}ssR!jBX7g_4WsDQ=z7'-?Wr怩])Mf>yz&~ʆ ;?r-p 7 o@r.'[:dd],yS<]~7e],IWXq#2!`sPb82RJ|x^aes X:p`"5T-8KG9MqFؿ*OިYHMΉ.;:zwR u$"ᙼa_tv ߔccz/AhjQ/ 0҇2sv a e [AHf ~͌;孈jZrڕ$ :|AC(޶\v~/B+1#ry^/G P-Fik9}rⵛN[D3{5WP"gO۽KKvWYS -6³$gu>K'%ϮM9m}?fh@o,H:Ɂ|`CN n~z=i1Orl^r(٘ ঑|ziSf}~⢫v[egG$F!o6qrĻTnG=ou9wl C8UrU_7'mH!sj*h A 6hXaxyO> dlbJ3)8 .mG %Q "bLbw\OwL3֗БgƢbfdS C H޻$ZfL42u ]pH8 G'^ߏž7u; 7=0% MX-\ToBYQ1@ΒGqfTX* e衆4ŽB1O!JT y}D@%-/oэP} zό3Ԕ61);E} ju, WJ܍Mz9V)@\&vqU4pM#0vFyTQKWм0-pO#uݞ'`J@}%3܉"}(8wO1j w:;`ʒ<8S@纩GM41s! Izfg~*MxMAgyaqS1`_l^Tv?nҬ !"n#ěp(P8_JaBL v~l6Z!5.47#;lw3lon6b?QČC28M]Yt}i9$O~ ԫf{bGܰzP61%vOFT9_TU6"c0h5Ίv$c(DbFSN5T+W#2bMO~ji}X; ..Z D0C>kO 뻯G )Lu"kZʷz`&.0Ϣm^2 sNں'vacLWngx_?G4z]ĤI5q%~U7H%cr'oH-݄ s?;݃T"^lw=3@U|ָf`l.Ogؔ2kRnrmd;)O,)G]^NW[XD2E5?ȸ4 Obl'hw<8"OrV*#͚ܧ0k]JVwϦpE)c x;Qj -%,'tɖ[F‹Ł꿖)1<~=ŁUwY$ V[=8ahρ,re6MZ` ڎQEɰSF_w])|uL>/s Vhॄ1AtyH8 uf(]<#nguYNꊤoj5ΊФ?h:G[ b*רr篭vUR _`B; X)B)pd֦ o4$u^8tb g n5YDY8oi|?qc?Les9- d[!<Ű>8bp@nzM'&Hfwj[|'M7n1V.Uk%ѝ4̤xe2jGL,<<lCOvsFbt64Gq8*Pc "KuIi\#j&8դ{x.\Kw0ږֵ\hڄtϯ9 F*(7uaC$`rPmt_7?%j4g3 9Ԗ9.=PN Fw` h `rl_?U4!.u"m58 !%1NmCw@7zQ4tbӅ@_6M8)7 /c=7Y~>LC${ eAa3<W+ZICLbkc*__-Sҁ,GHbWv'Z^]=s+ۼ6i,zڝl_'r(/VȂFYܜ:ĭъ6'z-YoA*JNN= oXEZ[9BIT?_H[%e?511诲W@R0jڪ1Nĸ$!Jk4۷NI[ „>l~+ʹTiCIɰR*VŤ(J&jiZ0ޑm7v/Vmg JҪwlddeHVGEm-f "{6.ȴy?G?`<|[Zarj|V$M,shcSk g(ƥ4t4[j7W(8$;iB,u{ߙ@eQLeT`gMT=>J0b@G}_A$Qg|oTLX.rٷ CbbEﱨ7$mKk9ӠEW(%r+6؛l'A%/ C)N ~" ,x:4N26,G5\LBZ?lq |J_oiBK9 y ƜD|iS}y41._#gن ?G5BA'_Nǧᕫ o O6vwyu?GdŒd,3PAin@ S+ˆ%kn=ŕRx}^JRcͼ7Ҽ#v}c ӎNӥCT}5F&R~8'XV6JǟacK ^7 ڲa=bT aWhe{x9XM $|!4p@D*S?gOV\I>(w4$?h =|G  BZ*,Yia,8cq ;S~XmZ[u.".=&uL;#Wy@: 0Mil?NѧK!}#JNtۓ8jns9WANng v^TC=)75NGe9w>7ߤyn\G̕ `'P=$, gᵷsviL@Ȯo )Aͽ;[.dGBY&id_`&Q27X JEʁPs\}D^9j[3f.FE2bَ DPzT?mEK )&[Bh`uOD7/%O;Qʡ2ᄃ@38Z-Ћ^4Q>0!28F?UY[U faЩz{gK a$1%N$S2h)F؅S"G$cPL4F7s4C1 T6>a6~:)vѵP@!G9=A?\kESP,3ܑU<,ƈVd|ddA8z\AcёN3&ӡ05yHykڍQnY, < 5;&w*8^:歘4\]b)(K`٥,U~_^} c$ Ǿcի6 (ʅB@FK:j<Ht?Mٍ?QoH}3OhA,#~! =4z&Q|=Iن1@9A&ҾFSZ !}ze+7edsrcՇKr<ȷ*> .tX N;sOycz>)RF4IQ:(|^1G/Vpm7>[mc8jF}c!J+-_ :~ XtY|! 6+|sҿV40.dfϻ~&z7c3:鉙3^_ 㩇vMQy`[䩿 Wokk! [ rF4^`%kqݱ#H+6ReT/Vչ:>r?ݪRL[X.Oy˪]\"et$c.lG-'鴾;4[?M@f?6BtGQtU ]$/Q 3nUǸV> LWɸC|d"n(A~F&@mMznFe2(܉x(a_+~ރubJ嗭lHE)%O졼hB3j%x^I^M/O6=j?@C>!uW9(IoqbiL@ky:@[ -d1֐ }L>CFJǹV *~xFLq6\d)W&]߶1gvu'do ]10~"CjVGM'Iב@z>,N@:HoC RR; 4XzWªZ ,u{+4h 1cS3/^[)T"Ixҍa2𒢀og V񼤫 ƈY|,.bt|\e~MJ#k'/7Y& ODb; @tfS5¾u-Mʂ%C=][b;NwdX=N~Cמ.e(^PV# Eᬰ軳6Sbv_faw<~C(fR^.»S+mS/2VDɬ_JXqh/UZ9+bΩ7hF;?WƓC6.0Xj\h$!æyL6_!F9‘/Ƭ:X׶u4 Ӈ3g< Xr-kwkfXŮ#\3v1 1N@ptրs72|dKq?c.krï5v?R9{v; P/ȢQk!ۑ's7ɘq#Pky%+Q"fa(>f* -M(O<`{Zi/AK%Ǻ$ۘ{ B?οre~mf-WkXc4&=u,o¿8W7SrB'quTO#Ό?#ʲ΂GpՍ`3)gJ.exb8FVK@?D@m.iFߨdbU{WR NI`3b61,m9 ^mP773(%u>HE&A*> 6:VJy#[S4]H'R:Yz@4@Bq=\C:ҲO^ ++p>;6{’wtUr3P83_?O&k3Zu Ҏ5 aG"5渲ȣa+~n,0 M`ĄP<:npQ 5_L$)?-=V|dE\k `lIЂ!N^eJgm/r,s_v`xǤbpܡDݖ Gi^KcRshMXTbMTea`:qbi,FF"æC?0 JM}vx!:ӼfwJT#=mc<-\fRx U#jɑ\>HUye3?xpUGpx@hЏ~*& q):3l_0SM\*Ws=Lg·_AlAW:KO崮ut%٨6`. IUt 0D?c()2iH=A ɲjT4ẋbtts{k U 5ʖf! ~SE'yׁ叒JJi5:n vҢy6G4UlY=Ԁu+5{Sq.Tyò?΀^Ƙl#6cfm;E\bJ{*7]#&KC1g7?/56]0T28{"aYvqnle[tE}.̩#sq~CO..Uل"T&o7c*kA;f cl8X riS/rL96zx3Θf)ͳY03\>=%GhRC 9d[c怈EWwމ17WH /xro?AJT1HVk[EWKTF-W __jpnDp;pyK?`t' 31|w/mdn52-ѫE~LHzKdL&[b+D`l.8oT8ؒO]Vl%yv*ڇ=96i}zV!H 5_fXP*MPOؤFzm_[81 T F Ē|7}t0G%Q鑔@5Kb ѻ]6u>=р_OeС)^"j :qܻ-S^t<4 uC$e@ Lu,F, +I7eL%%7 u/XW»z}q\6e#=Z \} ,`a} 8wsu.DʗZ;F{~o nlPP [Gک'ʥSK͉pV/8ffi5yAqe8C;RO'"L0lx@*Xc{ ZFL_:-w7U{LhbGSºSOƽy5H:٠Bd;6 }8 3ZTT_ҷpF Ŋ_z>/00@@hfH{`TLL1{(]<P/s.c5sʈm{d?u])4 CPX3pMY' HL9QUAxlz"EѢh-C~}:Ą}w;j=oCt Z(k5R2.А4=HEf/$Y`a@`:L/H%"'tT" hgj*,W m5oijܙzPwF aAb>/L!VlQxLœ}6dэ`EK@Ijr?sD.gMj -aXii`pl 0:141KnIxV$ KVɸUpePkNj*0شH َ"m}asboȥ93ZDHUnVQn!*+ט3&EEۊg*啪XiқQ %;X=VG׸$ÄkG6X|m|I}KDƪ װ\Ӥl~ꪨm1r%RG7|c`:C_7iRGl?QB>~r'x~&%man ;ٓ+T-;["M-;Xs','+l$Q/̼dlͅ y vr'@Eg2pcEt_XZvXɬ\DƋ|=Kɬ!_QV]Aۊ _[d$\g?/czd5I^챱o;}lgq0~00.:A֙רQ;(WU\׃ͱ%bmHņɦAR5j+ ;s5IN|9xӢUB#G﷔A_xEVՊxJij w$oەYGՒ|笙Bvo색 RW-I9;?׳Rm)NJ3ӑŇT0$`.I#gi9@*ՙy9Ij,-^P^ ͺXxn]V 9NHE~F5𽐿+d/r̄ޛA1NT^]Wu۶ x}*Z[067Brhu8Zvr |7ӉEo8| 4X ƣJG hCU2.⿔dĐuvC۷ k{Pl"aujy3ϫ)/ScA@$8.V3Y64T7ISFnʳBBRzxxTG-; veTGp {c" pHӲ70%o`s&. Nn(|9V 2-a$۰n.c:0 s,[WxxnvV!P2,aK#L'D`"UVYCIJ TAm?id#*ŨoXIsgܔi0r3fhsրz0$&{FG_'KrLrEX6lUx79‚Sm x?#`} yJ #0Å2ܫu- *F#S{wA[/-Ŝ=OW6N])Uig\cF9+ C:뱤p7m$' YVN8ڑ rz`[kARlx[=F"< >ؿ+F±aFSOUVGoClL-|IC[oE԰&ƴX#=Y.B݌kjF-87)gpef)tLShkOU^0ŎOt~/2\Ȕ4q|na?Lu(\kщYO  7UwD}>al]¾9XUwg̖wnOEXUy5 ;RmBQ퐕1wVV0dMivpI+/tVyԭ 1NO]]=Xyb_Wps@Z8i?):/mQ헼tEPT)s[jzGq@)vND<$LkkPbӅhPhu@}$q1ĘlϨg"0R.,e *Chڍ e8o'8{8_'Y6=ԨC[W y*]xmh"& uEިOG(7&qb c3#yXpe̚Jߑ>̱N:wLx6*2'Eeˉ0:g4*T]u%(6bbqm.5c0JN+:]33+JOBC&+w+}*ΤweT( 88hy1(g-b;_Xe]CbJwO& MNbXAOVH +/QMxؘEV]z ɦTBsf꿴Wy߸ee(۵ڞ@vpî6 Y{_xsA)v tXq-"cH&_U6b,rTxEO V12c0}&0(xj4r~es3=Rv;If.rZC,vW`H]̭\yA6g5)RdJ=Q HU rGܴj"Pn {Slؑti[ yvLjyf=noɚ诇:[I7_lVinlw'p/}YY \خ9Zf|G/ڑOE2EC LrF*fq~) e*;qav<( `>t@˨U:3O{"t+'z/-%ޗn {5\**_6HALNh(c%\ dp*jDiFX.guȯk([<]3h|K00Q\L< w[f%8Q85tr0z^`FWG_ȟ/@IDUu0~A-[Gi0Zbm؏n̊[):8ᖾm+!g.ga(\/~K]۸x!8!YY:O#Rc#Ύjt1$,1|3R̻B&["AB;4/'![bYS4n 9_DqN-~}Zc^#}G:ʹv}/e}`whǔ[X8P} T0C< Wki6~xn5T..?*e N?@tȝ&sÇY{R1Pe, C,; ܻjW:Yc'$H&!r&)]eR+Ubn $y59q=\*YQԹs<% ~%O~te&Jdئ'[x{&v-xeMr&U,r:1ujnaNN]avʖ4ѥ{~R:Lc6e!0%~ҷW׍ڄ+zrtflk5x1 V=~ٗn~ +jSF~A%& 4A '}8_~u; w,|Ddnmj ihh/!.裱@~HR^aq{Pji6Έԡ{@NϽ)L (O(( WV,`%.>?+fb732cO|nsR]p L<(iyFlXtޡ^ )tp\F[1U^x#BDRpN.O!608ɯ}-8R'm/dF ;,R#cvΌĂrG@,3(0\pDZ ϊV|׷D_~F ˛c&I%phd)-bC n%?Hؙ,Mk"U=j'.+V%gqC {scELI`>CeQ)3寧kiZ u_>thr%\(+ucT\g9EVhSK?ցVY}̻a!"MŇVC%i] SU󋷍VJ5\O˗AeݒE)PR*RHIn^fEbK v݉ & 7DJwrI0g u_"JnϘ3`Ѓ|b0z@e ݿ0DLښleǝ* ӍMm*&(@{w+1Ӹ'K 4ɺH @L%Gp. M{l *=nz^t^|롼<%!bb?zSYajy PG>*GA Eq|^R.W:OT#p^Tۣfq roChCmCON>po;?16M,=NU4YJҖt̃O5VǼ\TՀMZ V&nN8ϤC9$YloM"KK#B.u}e:5 _Sj(wËLxCSРT\彟d`Ŧ~= (yT*(c5"kon0\"9N:VR_=IVxt@& @-0fπiN)o<dCEB&\1vo-Ӝ9ZSY]3ـܢLG%ON֗  8#JAÿt߸}:^M?>,O¢:%ԬVݶjФi ӝ[!.^!6g,xONtmo줮e΁QW pCᾜ#!}j  @|9)"Iy ~ GȒq׬ZN7b6TՉTpqxՔVA[$McTDN!$4pS1ޞ~Fz>d,EAuh'*jx:P"2b_IHfAMpe`-d.fwElyP6W艄KpطJ ghC// $KvQ"ã1XHlɱ`k)QS!3NCh((Cxs=)NA!]C7<$R&$tsb<՛K9.#IJ" )[S'_܋o.ȋ v)\D$o\8㘟ʹ=^%<%GXwYM>78chx;.7mFtMD Zb2QX/||]P8cMqx)߂"#5ꄱ̺dW߁ 4tɎ@?ȩ*`BSgbI)ziAr'UW0Zcm=%]#BsCNw0+Sݫ4\7&4l1"c"Pyߣ'*Su%6fj=NRs)V{>$qOr6c~{YmǓ>k\ޙX` UcyWUbqF E]wQRgɺ])ݞ/8+ǸiR)fF5\LZ -+Q#V|Go~CBDW'ɐސF iqS&0hăԌ>VKjI~ CFL1URSoUDf~s[P%# WcіI;Yk$r}6ޝtT.dݖ|׾<ķώ62(7fKAZ'%}ARTHP.04RhR?:TSe;`|} ,#~YSUq&a{)y#[&7tr-15?To+fL1.-m\saY|N0O|2/ }`' zdzU_]&;d_21uW"fu2I+#\ ~$9hbO(I?(WXW/\^t&thJqfym|aYgDRuGͽ|c_o4SLKLj}'kt]e@f|q^a cFLZO)?(}lVt:!.L,N<䌒qho,_M1CU BW&]>L7eM8yVdeXlk~Cjw"[2pgkٔ^|n]HlT܂_g2T:&gO's6Kp˵h8ale0 \o4Nd||zȍ@݆5$/`heD'ks%9ZҖo]$F%Y1EJo1.wxj %st;ȤvtY-ǿsRt"K0!r֞tcu^,ᰁC3;[l{eUok5';$眕z<_ ?7=l J՜NT頿lEߛ44钓U> b4Ӝ? _}TS/gcD%@^'JVf]k~YcVYԦ>5/ yVO`IWfb\)/T:|l*Cڄs""VX$ZYVXk.9cCv^: y +sMS;,̲u-]dqTAP葀6;QBg 8Trӈ^a>V5ڔ\)u#DBqC D3Bx R4*{0 \ {tL18E(2E"#Sv~"7$8huk@ՒV6ypO5Y\my+Gu};炾 #x! ?Jbh4Fļ6걼aWKָQ`mM] /8`hZ ZwNTc"41,Q›J1x1? D{-_IE2\ySwyP\Zpip }6]'oJoZ:aΝ0~[TqJ܎Q# vy^wNz]K+DgKITA7W~`V)f ]zdf<5{>T8%6 \s7?i}d '}w5/^c#TH/3Z߇q.P >YwwnŗBc ]e58|uä9'3YB121-A:u7כMd23R/WKI&n&U $ҜoiKAؗ] / ۸|F-}N"&SQTmC-u7 2Hx6/ dj͘5 mpyRyrXqghM:qh~fK .%jxHs3_BB7AiSpշ)Lmґ45+'MVᾦ-$X+|J>XdtA44+Je4&Z_mةRU|PaȜ1YZ`5`;ݠ:fӸL> gsնAQ6Z?y8 Ccȣd*՗δJϞ$VhT<6bwm?w Skp4iσgp⋶tΎ,3s[1^XFUO 5H}ʹ޿ N\Oi#"1Gs@~Rr& )*$ "K5^9i;6Ưm+Jġu/X𦍵vt = o$؛3 */N`\B^_C߇_Ai|*>n ]q{!ӽŅ[uCEpli "+s/?Ӛ8kF֋. FWQxv:*U~Eb]f ĩ2/ޡiݠRD Siqh#J&}Rw&u3s<ȶ/*䬩_&; 5!rJ'7Vy)!s=rQ= oX4f\H;+Il s˸+g9\'0zMɑu|Ǧ!ԂO\$rP~aSd_zX]|_\ Nڿ *?4MtVEFMoԢ1RMZ) _ޥK<[bGk> T4}w[8"Wx;d~*FuNH:pc{@MoSk@*f>+> EXQbhj݇ "}: Y(e\;!4IscEɛ~qG-gs!dkc͊gSYc#sA--^, ,F6 ڻTOڅHeK\JgѨ Np/_`zDmV夳y DdQ:Κ5< 5BU_kۜ}uN8,0(ܷO~Q0w!\bU(ˆ # Ͷ-]e/^ii?ohWVqAlUDNsWS#1O}[-F(J`Xx<٨'Z\PQiވ4j/5SW{GӴa6^",Ѽ*~|"ckr97`<Aڅ)*YWA}К K FЎVw[T$J68)'p˕ѥ%d>#Vg~s/iƓ".@9Ci;||W*7^E1 u"8Ғ} jɳ; Oljk6s޾F<=If "zs0*zO/ 1@ubxX5tQp]L ~Vu-ZYhrR[<N4, |e1ӥ6 .N); Zӹ츨0Ȭf /Wם/k>Q)۹xrEeUx! &bPYI(ew q5u:Njj^>XŰX.%U\8]):{i6[_UΕ盝M\ɜv}e8-.Fzi[/ϥy@aQѻrsmT~$͉#6 WM]ۅ@|"Nޔ+:tmOBux#u-Dx\ٶK?Gd{2̖27#q|_W,Ԫ^ ~nZRe)$w:mLj8ުeOkW&ioqsͧ *Tq؉:B֢wXO) n3f-ڟVHDUӗAֵ1gOkn},jTpX dM{ЦYL/!O H8H8?F쎺arsähǰ$o7-|`a44䈊|R!M8}`3Nq2mM ^V(*)ߴ m] p0wAf%DEFRЍ8B-T J'çΔbt^^PGΞʲcq6<ʘU#*$Nt/ĦsP7} DM:ܟK{`9h' ґ:2lUm092X`*MghA-c&vC|zfmy=85-(jDWP},tZ<%~O׈[_ څ8-!8"H 3t\Z0\N@.a͹ierFO^ /'e%Cn/#6~a]enS'y&hp|@"^$oo0U,/w%r*D3պfk,ns (h. p >(Eo2s 1NOlda!g&pqML^,8ITޢlTuAܪ~0"d { mC!q뉃<3Ui?},CrSm HOc7VHCpT8gH-6]"ڶk<c ycNXwjѾ`$#ޯ4BLB8ws>=?n^%*;.3/̶"'7l/xT(}W)5 LH\o{ :;On|A ڍ94ɩcѩ @_$)Q,2a|Ȯ]:v"Y{%> Ā~SQnidW|([^#LBGA/JT17RlX.sa,=`Fz KNTiF~mŏLJP=p3^6d IG_ E񪲊x@0CY&r-zwO ̀r&P$SIu6`6&@JѦZ[W"c$(py4r,M'{0r4xKsBg,oʼnR=G10N279 AJ1J +XWYeh_D";{~[+\˓3)sYUv”-`6}jGx>Ѯ Vpu1bK/Ru:L䴷<^[NYj 0To2uczV̛}# G2p:qymZQCjoRYx6q(g"*96X+!ɄC(Һl1'Nauk"Lm^A Jn ^7l5 k :97äb:U$*c0) b:qCcSs}{#o}Ğac<BKCi*k31=h(F"-Uoͻ2BIa&;ݟsV]zO^{,&p|DP繸pI; AWwߗC\sU|yl;Ϳլ2$Y`t{yGv룈8+ɬ-I\!lSP^~: kl/b[N_Q_:N/%"YL BsmO7jgBOݞG*Vٛ, =DFf,G0} lw-[Œ c[+đ35@3gƆb /,K3`~]{\e'Wn>p7զ2Bt#.c#@3~)ңIs ^wIiehr!T2IW7&v_˽څzv&9k0KNSiee9;S~i|SG0ŭŬvh75/G8 L)^;ν6f;WǨ+A:1ڔnU;cdKސ#Y0I _°Q!b8 a'!sC"%QW@]Gl)֒<}2 *e !#jΖy/.Y 4@-)wvu"R] ObTA(6ilc䊩~6?K@YOe7޳K5Q$}if 1B\@CgJFyϵ{w4ҽj^FLhhLs;wOl46U,>c5NzhOKHj ծJu VgD")M.# O gьtlnStALDAxi ȓ' A'/8XיD~Qmk-b&xEbl|eVdZ/M dpE~ϖ1ŲRL2& M[ìL#v*t@wk4n{wɂigCfeAI_9ŝ[27 y:+i@qi 95] ؖ+.fFDFX H9Be0 Hƫ)]a=e\t"d{1 :,캋P[ j]//[C>[$ߴ@&[UEou*&L yp%Cu&6>k78AMCsT_+^]Xnnv_0Fn(y@-ۄƟ5vbr=ޙʘRF3E"V?*9nb?|}ȭ5QF=g BLg=CUw-ڑ{.MB&KӋHsh,񓴻K fy>W8!&jwd g8#V=;ߕn=}o@mB)Lytl.;FOE[臲9M ah ZuCІr_фR^Mgh?߄X #ř C^U.aW!ijTP^Ed<@eî# %[S57F4Tp|2JͰw[A [c'iRqSX/tѭ_Yڔn*/ Tu?XmzY8dz'ojvca R%/NSx:VotqpI]%&lw. ؞L8ERNP'ggCpB&*I՘AF6$H1Oub-ף5IFu_@a[@*43h v ¿HV]3WVMr {svDF1b/ (?vFdnb-}8-/,ge^NnFbP~z|[{=eIgV{ڎ¯5shpi)N\»}' x(KʜѤjq0ag[_\>)f4:tDgQcl</1rL`>ZBuIzeq4.|FGk% զ2> Q6=P!-I\^AfמB2+gw5(`ދ1˗z }6ՂXxq9UT ƙZ;U2$7Nt3SA)Lf仺GShV&<5`Ù~b-0 ]-L2:IwHÃkEH5pB1*u /ౠ` E!O$KL\fq`šXVeB_.E漑PmOojo_md mM?6sH" =waUe%,C_G%FeN,m.zny?hjѼv$APG 3Q30UIٷoI BB&]PaBtXQʄO֣3kȣ$!Tۺ%,0Ai`~rf]37zh -*TM$UpkP@f1+ 8{H䆯CYK2?#GwKT3Xa Mpnrwgjo1};f1A"J!q5Oo6 5]0SeOy4g3ptXi8r@SUc,(C[#/ouX$WgP̚>XOa[t 7µS,DZܽzT2Ӳ;'ZM~8LCˆG‰#~}D RaXx(- SZ(Se(7 oMR8*.KCOk1iמM R|nGhn"L2n]K("oJNk9P›۰o".CbNO6 ܵE, o.@׈4!"tV2 0fEegidSFt33̴-r.äWxYV"^5dY"K:ZmhN iG1+͉[o"yG"1Q"K}wF/zna,d:tr {1OXBp`f4#bj(KZk%&֯4p6Ėj>CW&taiEcљ\28v:̡*E``$'`JW>zgF8@䞽zb`r_BnOvIBB'3cX>r\Yyr6hpT35.uKuT) hXJA$qw΢D5QǨ)&YPnk,0)C6l{[4ϨQrlH_,~ p*lC0!H:-G= xFáCof-^W h^GPZ ΜqɁ5P)f;ǵpZT)mAB+؉ez W؜H$A(gxȣ ܀8Wl9 T2V t3N;oh>'bi2ޚ3/p@" 3[k0)Fgnz}ӡɛDG0^৞i(#8+@ԑ_,"#އ +.e$d YS6nyJ ;Bl^̵n"Mee ID{P8@^Ҿ(HŠ~ @2 To7ZiN2_B6 %~im烵M 9i`9 r}0kaXGƛ7E:C Sۍ+夓#+)ߞmbl ȿ ] asH3/H3j4_C'}[/.=dfѹZ9w3M͵WHty?EU4f@i:ȯYS`@5AOMd dWMTSvV:]O+<6I| _ud8s9wk5H7z(8>œ18~}g0ƻ1 3@4;;1| tj"j; dYjOq0JXYgPJ.=;bMr:Ne+.+vr *$otZs^4+Z$nzl&2Q=*^J̢?/`nĹZbA^8W++t k=rgRpB؜O6r*&z_6<% ]d"3xZggPrtuy]k@l#ip\n5L}ˁȬFpT^A3)faaxҰґN.g-vRBMp˖!`^HA9 l(zkIO6;mH)UDM'x,d*Y$$4^#͛;X@݉Ԑ.Q0v0J~4Zl.HT9ƀ8c[O0w6_&s{z;Ti]-KLBFX*ZXlૣ:d}c2tu{a+' Jh}6j ND>3$tF $g ^ByMuB%3z 9#D" Gz p &Oh$‘$^4auR{vH<[N!3_U . X[nWs ;jT[#KpIPF# D?R@UG*)P$ۖaa5(UE蛷b> ƻz^ Wq;@yie忇6|'+ WhS@=:gix(/ܫSBTnVӫ% ;lE?F;mb|)GiF;nEKlPdrB|U@c5&G pOf5$oP:-܌\P[>'Q-;f R9r~ā>t cœwm}kئ槗/^4nc\X3*fGq 9IO~/YJ*1E;ԌH%WzlV8 u|.7]7X1۫ݓv~8:Cf) =lߜYժP{+I_qqq͠j*+cvn $ 1CC1-T ѾJߒxvPA l#?cUNy*~zEn?aWY/d+i#D#y>nDun#̹/lϫ`<_ԭ=e0uhvauaj~p x@q`T'aHvQ{* m:w#e*zB5fދPb/x.b&)iδum);lX? НXC{Gֿ?* V(Ev%5^WC3V;9z-ͯέ*WK5klaGn"XMgQOlɐ^յokuQ>N K!TUM-sRBc+8\) <fRQW^+Ur?5[/{ZK* ԦYԑ ųǣhV' T͒ד=uQ>} mXR>S-,7:ИGOC'~Q&ݾh?j+i~pYlA\rKB쉲݋u2ʿN>=q#>~*ː;KAPҠqE9MAMktQZT&p= Z ۈ9_l} 80[ D" P蒘nL,#u`e*e_ AQt>0&Ywr50EF\/M1٠ R_Nv0->Ոn{pmZK?[f/\##bVlM`[5ՠeDFDvu6 \꟠jF+ Yk!]=ޛ(ؘ,F{3>U-yז;|k ?㔓 m?a hfd>$ڳK& #X֘O 9Nw29N{m:H_P[mdE:fN?vϒ5γ<~ SWPKUԓ6U q2=%Et.f¬U{EmbBn*ʟO 9wLq} :~*axmЉEnFL)*X{5[8@GȅC%u^ :q"E#XSp@UXJҚzʦm*f) x2'#,[fU?xD}NN$*7сQdGCXi2QKqkTFWK>sj[pA:Ya]w j vZT"[^g=s3Cf)x揢DmԗyrNTλv"iFT$b7S^uT@.OP4HmRdz"ŖED[GzvaBGӡz41 M/c2X"6:m k[("Goq (qLva.Ac vxj%u>BRM6T!=N( 3Jڸ)<~W7[4t =]K) ˜cڑҹ'jQÉxCr@mAAJJ| hw Х7[:Y@BQv\ޏ3g8H#t"D ?cfjCls)L>Jiv00eQIc3$M/Z0gD?RtF.ꑠ! <+]wC7⹑6 ESA'Ljgb!*Jʯg~'.Rdi6b߲je8m6R_á2A%( l6HNaj/~*т{$=Ō峄v4g02#*vw!3bY̚<30ͺRQj`o^+D?8 DMTG}CGh3lfA#<0yӪʼ:krGຓLq܂%G,G|/z*{¨0bwwo?:WC?i (*v<\@ FTK`|d&ԋP+DH2pJL /զCN63+26]Ĵ[$Xt>r^GV.SYѼiP_D/ kQ$Ob Q"M"joPYϛ V3-9!V6!+Gݶ~Ҕ#hy}ZWAAfv%[bQHf=4WQy($nϐx8,a8:tJLJ.IÞZUi rt5 -J &גSJhiOnG|X6c)8,@`-|8Fcdugwwc$'ՀZAA(⁂x#lHSJ^L7+nkl a2ɜ !)?m 85i.3|{yhd g~lIBLޘ x]|΋7lD>|·$%'mJ~qCFo=OAaK}q[Hx?ź`ujtg 쭈0Ra 32D[&rUb>xiB,x27nKc;5By wnQىffMOT b ~&,K"˵Hf;@Ǻ)й]-PYC"ږN(,G}KM`} * -BCy }Jcnj;K$O1ףa[`n,ПP"@DD≛wQ,}C+HlTY$7bUa)eqΝ2Vx"ɣUW,n+LXDD ٵA-$XT@r531+׋<=&M^~քDŽ?cގfX`{hrj,Yy8ha/HZ+s]ZSLu"*eA1("J vJ-T#buo5]aHc+ꉶ9D3;C|W:lN@YB0`xZQ; HJɵ )c2OՄ^=\2p=n-8hQPIsU{TGAyqE`1PRf,@Qo0}6!mIUᷡU0]%][uphPP&8pξ`s]Y!etSfZv%q(-6~N?P"0G_rO01XOKq&z e+'hע=Ruc Wbȼo)q| f|E7KIu!"~MXe&Q¥OA;u cɢ7Ec^л[I'tS2LRYaO@K.NvB˫Tө;㘍*(*@G춋&D'?˂$WK^MCNh`©g1<[:Nbs"Q*FvX=>Y˪E( B hSUʃϧ.d*]Q~m4wCu2A(]L;D*(Tgyk6ˣzi6Zzi-Wɧș2_M>V.H]o\w t(8pqFR˧cQݣ^a." X`ˣ+ۧzͼ'gf*;=jl}_zc1{REEvy^(r{@rI,WteÚ2ʈEwS8,_BK[͵m% 9 7MR y$Љj&u-P*P)[gGFWTRs!η2JCbkĶ ; :.9n#v62ӌ{T蟕lwB:fqXb>n%72'akvf_V[jv]1C]uݬ8MI$lL*ŕߔ6 S"oJUzK7Y.aaTnu-ۮyYτQ'-WA"]{̀Cyqlε2@;}w VsQ_խÕh&SǓzF_AfIԽ-:pV?gyP y|l2pjAԣ҉y29:/~<LjĿtT6b_,MF` ".\m=D\ LLQiU?Ef:i1k0)U|0BHoib,kO )!E޲`A~&gElΚV<7@ n_J4/f?j\GZ 9a#C-:=&E&TPɒQIXH2ԓJWXJ-L>}e5 a\k:D"u-Jú +QTL{=izmFfƝq>&S>2&&όNN:Xlv,c]UT)z^dŸw a_e$#%<HI12`Ac<ʱs5Mƣ:m N|q4'0Si1siYwdvl)z9ELVz ƄoqQFNl0{~%F{KHfHZצ,WR^4)Oj/1n V#'6j੍DYzd饡w{n n> ^{(L Eρ>ؔctmڴ3;M8q2G;czQ)ºOo怠j8CQ3P%, WWEETB C6\y1h6E5h%aC{It0uGMUWg+Kˆy:0ՐHloX2hGdž׊#7ޛ&,Jy o{џ5.kGX($$bf)gH`)i5Mj&ぐMHR 0.)rB W6ϓƻ>H>]':]3"t9%>&ɯ3%Εp{ı.B2c1+ֻ -(QNjMR /H4F[wʄDU,?7T}M֢Efs}t܁03?9'o1K_-9Ye ;H2ve/8f P0ZI!]fd&/ɤlj&)x:u6* hH,_K=*:W[̱ 3#rn7~j_747ݱ,F #5z,Tc&TzTA㝹PP5nC Խ#m@? :.;}6X A|*UD,!'M6 Vg(7㡟HXރ[&ù7@_eF f"#'U*iN+Acn[K)jPhN92&Fpյot_BqE7F5?]K  L9y_npav!kC⮌ Vsϔqv83 ,֏( t,{s[ z?Pavvt)ᨻ rh-y ޯB[ Q$ƦB|RD`øa#IC&7yE}֏iEWcZ<?/wT`tG\*޹%|{+#?uYaנ򛸻,d2 &UN;lfe𑄆`2{7# Xj?7Ur+%nSG?<<&ilJƑǗ7 l[eęW֮ou:m(aT?=Bv y=`@NobфIä@V ,+g']@PHm 2jyG]dGF@fzvk%yXHݦ/^ō*P2'j8sc>N˓"T XR >QWo[D/Ȑ)/ Ĕ$`^rU`(ySYq*4W:RoV y͜8L. ׸T ]}Bn:#&R`8[g0Ƶd2,0CB&ʓd`p^m hYeĩ (SM5ب1.yYE w1q?/<%6E@(<KjtK"UBeeU"!u"IИծDJFi Au_=xaN 35vdˎZGt xE ?lcycki7?zw?^=w$@*b~l# -q76\,?yR1@8̌A65]-T9n~]*s>KTEK*Γ꺂 T"0W=Jqd(3ҎDAw'-T~:.«}ⷊ6qWqMX\A![|`Y@0Kź#خg ]7+zCsqc<")V'sߤ`OOsQ-?B^eNeFUFJZSRk 2 ,|eAx=S -"25=5:ԫpGZYQ3D@0B.lpaqS&&1-} 8~.oPԽCh5qJ*^%*'IE*n# \sYXI?*P5 #lEwmʆc5;VVp&&S9\Is_Y \5WZ-GR"(a3B*ZU%2wS/ɤΡdY в(,,-7z sD~@0 G;KwHBD23kd0e~aF,ʡ²Fl[[wq Kbeө65[,wu+㝞 I֯` 9)0"Һܘ?}kaVũ&oQq*Q{|vf[Ǐ>Ъ)<0meyv1 1s-rn\97#:9b{noKpᜩ1,"7iU=34qm@Up?3r&32`1!&{&˕eZ09a tQk:P$l^6/t%mOo+?o3-b:Ϯ 2d'!=eVǫɿ y@ @U S%]i4Ycs?w2ug~ЩA7Jr2zRg*`hᕇ{쓘OvОB9 XcG6~T6f8FWӵ~2b3^Ul Ǜӯό.+ *^ȜiNv% wt MH'eà||LG<5O] .^oWΈR,$UY _3FX!p^m"=POcUl|)OܮhK@}qU .Tpbe `!Γx&q1?W!HGIIrms΢ J#^Q]x*5H 5dt22IN2-*H(QFeUb{gq+,W_*zt[ B`>]gξ,Xߍf['.q{R1 @Y %N*,rRah朡 _vEo:<2_6Ȭ0ńp %/N_ c-iP m!^ϋ3/|}!{l&yGj)pz?Tmm”uٟSo60ᑪQBn 比~T锫ˆ2eIATji~")J9c)$@؀>q&},His3)cdr,߈q>@ z0~|GOXQ0l~RƔ59y"w@,kز{4WWʇF՗G y!1+cTM2i>0 K9,0"seoW D'Yr0Pt{~mFF7}Msů8Zf\%PO h1J` 9(&rwn:ς≥dW)aK04GlUtwYPSʊ~15Eٙ? mEՙ0R,; D:{V/}E]oi? d J}EEZA N/sǗ2hR獘Q_zH&#c&9fzla~1Ӑ%>^UT  c&t{L {L,h0|߁^GD$CcIN\D+{X.Ys˃#Br8lzmS{h@ʷ4^o#w>ugh\}AAKd̉)Xį*[:jlv Pvoq88kz\V?HsTzn~ک$^xʴ3ooAml4؟z3oq4"{z,3,DDA]ߓAfe` b 9t~fuM҃*YTLmFo+x`鷜ce-\nAV|r_#mMG{uWfΤ+n_%E'mEƗi#`1Gh0_ZLSۣp_0Aw!/)HF_3YGD`~X|CHITyS9ÕU,9oXg-MVȂMY}~Yh#=ռxӪ縢 Tdq7 4dbicS" Vp=SG8W<q++lAPt]7;Pbżmc5lۑo>1QЫìV^U97 ,8þoe삼V Z셄 t2pj)za\r]AEKy֥$y etQ7F6-^4!sidYkFK<4s!fwG} | a~%}p+|-vM-ud7!@'q2 f CTAx lFn) h iWrOOW^~U!m ]I@/a:! e2,|S.tS9">I9W_G0/0* WH&YM ;\!V֏|byU"+*9%8XW>(Pf<JqHCcPQl' hMb>0ܸ:QdɃX:@Z*'F' w-Fp'OnRe^@)ٵee&Dh\OM6Cc0duL '~a{|kϐeSr#i$'!_75,IԒѥw;WΎKR Λ|־Poצ;#:s{nˢ-o Tg$+Úڷ>~Lqc8't'+?x ph].k'SA|Ƞ~paR@k&l&p\Sѿٽ2Y(1PZz ȥ.CG:c%gE͠ E b)qf2|U83Vb:r a7~ L@Ԝ}?raM&n^≊65*/KMȀ$g ?_Wzx;Sh3uҜd[S 8$o;U4a-VX2lTiCEBFp`Aڞ9LfwOͶ` u@0DP!3gj7|ZnlBVqOBN ̟Zsy@0LRm^԰N|l"fhq1HY1\df%vo(UNa+;<'VjzbASG'}g.Sl0!nƥ0۪o1$o˅ZCԑإ\yGZe\S*/:C1an3Q-~76N$B@ BѵJbӭ!L۸ K|*6ɠ"r"1z_jDوZI§3?p&G h_~7RKt {9S_qR6;SXU3K^z%C_*s2`_og-Pn={*=u3Yn3bST4թHde!>mYzYPD=@#T %T,fyX 2(m\\^=pe&"SU8wA)߹.z4Ps(yVÅj8`u`>6qz`Yb81"Ö`Q=3[7Z(QW!$7Оb!0 G$6]^oSKs4gw 9LYS*`(O]׼go Ƀ?YHø;rg;"3Mm;OFp!qYP;~(1ׅDŵY;K\ n N8r3rzǕ䅘l VQp}Y ux܃Пל5L>3a sw;ֹ%"stoΜ:Pa1nn v}ct9IEvϕ|:n ,h* nJQ{PNvaDqw>f/8!id2gx6 4ײ08i6#Qj9fnvKzLlMSuLAu"`@Y΄u 9+%! yXt*Á\͓F#|Tr]eK̞ΐeۛCPnܐd-F>7J]h@C1n$0$2zI- K)id" Z,_W?XJuF󟧊(na."u4]\J 1,PWъ }R 7тUt(,://qO8YQߖ*K5dI^ 8pL⛄~| B_EۋT:$"ظaJкGqB{xNc}h _i-n)CY_ӼJ`uy;ibтtC9_s)5' 446ˀ4w}|tFm=Z=PX)H =M+:42R'ϰ-b5¾QY{Y(FhA&P1|s Kalu l_N8 [:J^uߧМ1%ewRȍeQ@6O%,˳6#"3׹X/W<Cy~^LYTCIB,(=^]s7=3~spcb+:@[(gȀ\4g|)P㶎 F݋#pՆ_\&XL$"´ c.E<9[v. ==ev@[D :cd+ ɖ}l;rV{%=ì89Џ{Ca`CUgőpЭ mck* DkR"",gg3rCPT AAUG2Z }8X%` Gc̼r6ɕKmZv;v+k'䋫O^lf6[뻈~T[*tw@j_!gz\Kv"2~5RO.LۧLh=@o%jeA((3} z~DK$vm naldsf@Q>pݜF*Jbt_DeJ:Dd&'zͳdvv6#g~Ϡ~uk}a7y1fICPkH?3=i:%ŏV.P5|‘6(qGp"'cY8Y.gJRe2ϷY\_U.)AlHu͛q}ƴ$,1 -<ffZep4Q͗Tk.`js%L?KMmJ@Q]2DV$vKV x9_Ĩ|y@igwgIT8_y״N@Yz'  KZy3n)xJF j]+qޫd1,\fAPx8u/#U`FT6O;E֧!ϸ=۔0Kް!V,\ LBlEo:qFػkLeVKA_Sa^e)C}Aur[ֿaâGm5vV7e#syO_LJ,fC+20 ̣{bv7yx $WHyCҚߡF#G=J NaAUP^D|痶/q"Ib?α4w| GrMs$2a;V`2#3aDͣ|.yX#uH[7z0UE;oDdpBRB6M`xxVv a z«B%LaJr迸BmMR@ 2PM$pJIkJ懐p _mֿid6wuȆ|g%Vj05ylm=yflL<}8P`LQMnXV_%^#c*vcu^i~>sR-R! dh[}} 3x-J^&o*64Y.%N*@1nP(nɤpOPqI"A8jHN}oqm0o*K_m}{xYܶ'dU=2+sJb퓐CۅԨ(^EYO7%٢rFT>2ʏjgnjГ]-;{F֙pm[' FyWR#M什F =,Qf2 Ɉ$AQB+}dY`O/BH͍.b&KaK]nsDfb }*OT']} b62#kE"i352Fe=Ϩɘ\r!.R؈Mϧ-.Ke ixZc98.=IN(s)0.b_f6[=-_A .(tSS{hnfh#~ Tlaބ | p ~V@{֣<uoY4J3( df:RꈠLkDJ6''f%5`cZ5 (t^7n6ViL^8.u%p <3$\qc?{/.nY6ƽ5MɠeSu{9S'_/)͏JOd%ă$ oڶ{Kgƫ\:]6MbX !#^{Qˑ-rF٫{IWˊj/_&%KdgV Gq `1ݗAѫg[TE+F5Z̫Dx&ɇ.=(qT>V|^qi$O@IS<=*?/TQh oh^ DtMhF9҈r:#xm4uEu,ȹ :σXfכp׏Ls0 dGAkk} i^:d'q4MFG*܂${qF$OG\~"ʁ]W{f/eI~&-ˮ:. hÖ[3e* `&[EX~;Rg<l-&y,w{\t*_Ɖ5HV!F4۷U_WF{Ud<$[rK|`΂?H}3WK#"lmFnaQD"\~?(z>U6ALm;jӺ K\Jʋ<soi'%)y.C%rݗ}q t+==AS~xqtl ..Y~u "yLѶc T:D%.v>O9)gr&-,JMގAl~iIp8vO,MQbᚁKCTp"0_xe>Y GiW&p="9rZmYWleB-Ϥ=l@GŴN<|{)*bTl E_s\݆Q!83oh[ǫsM0]ӳI)m4C!dVO^c@|p!3uDȬq0G^R$rǖ'´4ʋteYG2EF5D1Gi ɨ4[<-F"i"&7-zbN[L60`#sa俉zqe2"3w}?΄<L>^lY0,~HyCϼiwuu_*?$mTDR쟉JDxw-WŒ!ڒ6*В߷optA_ Z]A/ϻӾׅVGăE4싪9>hLGondk ?!6X,stU1a]&fi?\. g? S̢yjA7-WIU)jY(|To̻<֏ZLUηX5.qk|KQ]oj s3mj>_0sj ~+k亣hIGҳ̬|}?K$.ȗ^yd(BZͷTb3(R[G..[ϸ^ t2DԽ}!(2_|濤ưO{;:Ri٫,Ж2j$\{cZ %)#QitxZYiw#ԇWc#k }`pLӿL2q%/%}\=_ZYL/^ْU~^Z{丠^{%199B۝) k+@]~=Y dvMQ?) y7Mu-rfg¦o4x4!0|W\ `G~m|4B!߬‚3gX%wdVū8N;N/AN &7oKX5@fQ;͛2OHdP^2ö&:0L. WTnQʟSI$xJC[F^vXU%œaĿ<=\p@q1 s[b` $$ڡCהTl.OdƸOFcPPy>%5k:SspgUX֖hU̐χ@dgImblDFCaLe^a7F/ :uQ4BCNPxN1nnrOqRGwmln3zߨ!E`Ed4Sdy% T[Da- `JOGZ&d;@)wnƏѶSRgפ,g#[Շ_TUhbRDJGS$[i4pnjyZJrҟ͏IԷ WX͇] 5D55~ٝ3%~@bSBr;x{6Fj-%^b%j"U$O9}if>f.ñW 6wL3Lxt (5c瘯^GP^P<ʉ~l2d{mC.4`bZX$X SE/nW.Yf{V%4o՚4 zO.$0<> 4sI8c&EWJ`+\Qb tg LaI̎r*DQSݶ2=dRp62imm+LTW ZQꩼQ՝ ^o#4j󻎅+E=SRD<8n@LlԸ~7LŁ6XWǚOZWugG,!&)xZji8ӄ,s< 9O(" q(~pڒ)ަb>\r<o@bVkp'%0EY@X`{) +&TqZuoYFAh ,^@{i42fd֋L6*4**'N9Ek=՟LΙn\? ~2/8D_p{> ҷ\T j2>*E fډɼGtR3ԡzwR K8*ݷ2>k})􋹍45{s9`j| )m𭅀=t sD"_{{)-]f`$bK1WWb섟Jq LKQmlr#2AK o1w& ,?$O yԪT.AzGAuKYJ#[2~]>@9h2 $vkzz{ Bki)ɍdQjヸ*n: P#7ܶC3'IƔf!&\0^5>.d̓4_7y[~ɺ.t&4&~rKڳgF̆CpsaMEJJXwU%_V  GFV>au5*{wdzB$zؕb)N,PLX 8' 0ha]GEt f,JڹЪo|ٙ$Y%YZ5: *x`ظ!9301#5W( :Kg3.Fc/f-#Y[/ ̭yGKPث J( Zʛkc}܅!DfpEf 0Fq rN(3T!';ڳu,d f͕h (%!÷Z27Н;}?Э1.6~l>.\T^9%kErc4D"é>_ǘѥ4*ܿA T|SF ^֩ކ]G6H2sDK QqGu7qzÊ *&<6JUQd#%Tm 52ߙljCwU'"վ)eA>oM۰MTM }6;jl#$cyU3=9o5l!`̶`&y_X[KKP&)}.1W`H}ALQvBb rRuZ3!(nykSEmyrBe4i5I%K+KRa,',ozMukϯƋ [ާHe@As~)sA眽S!Ļ>0g5GЮ͑hOi~}7t]T#WƲ\^9-dKx!@bk:dP+mOjY+M!2\I%ݤxՐ\bm w?H4轹^wC%́8GN]3H:.߭;G0ϛ3{)'y6PR(Y&{(wĢ^Yzx7T:S" E hЕ{9*gL${U0 ǂ(tT\Ӗk&> y9Es`p[ +,ZK4b ֎u-AIJJ놘U cl(/`R`eē[5h|H a N-RWOH{wwaa߅b鯑lvztWt`'*l1eՖLYڭbq=6s)FBHӀ:WVun00RWE) $; RUL5`t=7="y50nS.C}&>it5tM !#o[bߌ"VK#v*:!ᙗ0i(P9O5!g81&Z\`q劺3iCu{هX\˕5W庲Hegq,hqU[CfXi?3nԢNZ>( Lƫن@pq%+ X +[$]%L đ0y&]kN@z:L&u{D/EjQ Vo 8!bsK 2PV*DϺ >)]dIβG-!w]FnPN23z>Xw$stUs86<)e3ʓGXA7dx T3OZ,%=<`*Ҝ)4Ad,p jdEKN+̠e<9oM-/hq ҍmAڲz? Ds~{bG;^^頊a~UtaS1Qiĺ<8s(m@x`Z"P"QBʅsG$av|bȫp e| N趌{댩W[}Fs! z:X{VQR P써4۠Vzg~,vUz1GLN5kqҀю)cJ0g%<\b$jnmdNCfDý{3 B^Yj ف+9 UKHAshR)UEON 8l 1S&v+-(bj( >-KSth){Ue y)[:en׽jٜ6eodM\ch7{׊B@^@zDfed:"%) T/W(i3&m]3LE1!gv +\5Pl2*#Hrky:>wosB?y2*4pX .Dq2Ɓ ow.ǂZ=ַJkV}6Q:J(ͫ fȳ"EFbn/ )ӛU /~ZLE[KWY޷<(`vupT#~p%NώXrp[^T!NJ!e[ kCo4ݎQC2ƆEe]g]Ah\oHX8( mpv>d d;-,@rMYB]OWcn3w.:"S8 jO4t+NwӪj;F𕋊뫥^E5Th> rE7Gk @H!I():UxwiݤCt -o[&oF3*Ϛm˨LSƱ˄#N)errkfZȒ ` 9|W6mG[*abC꙯spMynl±"PÁ ~2x7 >$fK%m#o TUm{OcMD4u=˨A|I]"3OeTT.aa?264Gp~8 oOyY2&HJ&Mə_n^t9'ry'B&rXnȮ*d]9vZ1MyH"DoӻHc|ap%z X5&-ayl|Jeb&}]Z"S6d݌"18h/GR?+?[9I!xUbHgb$ #8"Zh1F4wXeLڟaX,њ,H\!z{=GwV@fngcCTTBt3}CzuE8Dxb Xǖ4uD#!B͸l@n1; I,fVˬS-Od0jn?{Nmol<'>O:%0HױgHlY 9s!|>J;PR  )gsO(" YRhC  H ;þ^OTwVu{ںcc0,<8Pd0,gﭟBѢCqK@sba$ @ yɄS>dIrC6c\F}?oq;?d$bl{f|պ\v~ƯV/i v}iͪ&:&tD7H`naBZò穷PC(=-ڷS+`qMA$@?ZM^%#݁E:'[CD[3re:{z D DsJ;Ȉk5? T~at| ݥ0oZGgBa((k=L L>x֦>Ɨ la\Ƞ,,*'87D >ErG&ݨ>e޶LYyt3'>B%? Ed"'E#8uǽڄ=1km X^.(Cұa5<1eEEɃY)o/?b[x m[JP[slob}nM7ͧN$nW+ x%DПC-AUHdCeXBVMvGvA/S0Krqʑ=[{ir (#sÊt*R63^ S0\"ӂz='M6'nFYK6 F &Rvrbڒ47qy|2P"u-I; r^xZ '*8 e)T. v Nd6/AP,PH k88?/:=wBȯi|D0ZJ|W7lQƫ7MYGd~ihL}pND0.hmס_ث0mt U^&U:2PKd|]_A*v/S{65I}g`eb\My^r *W/O5=lHo'Ӛ{\z] U.Z졺 7>qxhc?(cybE_kM~}쉺ۜ/gnmEkHm|kAb[ܝ]nf}E$KKFGןB umWe":n,-Я]F:U=y`'Xr_M8 kbp~Qoɐ'~mFkCF! ;݂(?=1lHOʒN^T?:vUZ)%v\,e.{a660V:x{hf+)uw)}:n hAXH nGxJf)iP^yy /ߕa1}qyg#1X9+ZRu7!.ļ/4JR9~&=b͛Fz+q텩k-p_aШbi'R{2{ ?k6qpx]ۘ?nvvx TЂ6tzO0@aUq@:2뺃\`:2b>@ݫ֘\U\ٵGO?);C%0"5X5쑯Y&;GsQnVb ;GKTP$ўA@mSŮET|Shret- ~ƩȞ;H<[Ͱ. y}xvp2LW҅l[/B]as]sŃ0 ɠv#W\Ϋq֜&C٩R~HuAg\WGe=!j}!~g߇F+ݘ ^]>&{J?VboMՋ7W5'e}0q[o׏'ߗ(퀋!б'ْ˲;~\.p |x>г6Ūo 1._:zV`]N\̌u%8F k` ,⚙7&G@|9JNeIv|@#T7īd#ѧkYV J&~ 1b `_y6u%TsS̛(R>NjTU$I9'^z@5nk[MȐ.(FP;@lYu^L!%zT;CT^jhuMA'B&oE07x8(O*t: xp3imN|΍[2(a pj GNæ*u~0vtQ<ֲT/BxE l5LT垎EOc UNtO8Z*`9.XJ==͵܂bZW@RT+%Fy聟9a:eb]F4_C|1:J`}7f'v`GxNA-ݚN [{> $s;FRIF`NkLwËFg2-Z?n06 ,;ޖ[,-~{Jaf]9vъx=E;\'zjf= [iu6bU mڏWQ<.) ? \  gRtyL";aO7' e&K4wm]-u-t8hWmX,x@Ҹ*kԚl&Q\Yd!72ӷ@[$3=2;+>&s1jK=ovUkBGhWT.Zgb.կuMIf9.XdmSGWh0Xʂ:S(>]$2蔗]IqIWP:Y }D_,:n⮙$lZ"5!KQ7 נP19-r^Az"̎4#΋0\ҽL4l>GA_ [a| }Nh;vz 2 SrI>ZM&=u\דIJ,ɰc.I}!ݒ*mҴN E=c`_(9|v|$k0G1?Fض(d]0 n"{1|\Mf XJ$Ou7L{H<% kboPnf'XQMy h~k/E+~/,J;[!="[ȵ%w V V?z|-tL?#5.3ܸۥ[QRk՞T.iJMއPm! 4FL4+V3zH(¤ٖ#n[yo|зH^;Z |uȂNh`DVWjw?vՁ)[^9Z%͖(bFQP+ͨAڎlA ӋZ՟o";Q ]{"LzkgmS׬_Y9WiO̡+H+:%(Li|Z!.!Ci8pAُҁOiC=#ZЖhbdTnEm.Aw ]<ƗZin(]: p#*c0ʪ 7,E<| g+C]&gC]3cWBIh#04S0C#]fid"̵S)]/r0.Y,2 ;ξzPS:q AaF/ wڿG =P/ݞA Y-Qe鎫 rRlG8Ta~|o6RYCi{kfH(In~TltL(wS@E gs;Cf=dFKw.gd?c^MP_[%i5>/0ugk!& <(1 y i?o?ǁq!vr0ڂ_% [*h}a۶ACiQͤ=#b2Cl):iݝ{&c3\ѭd8yq- ux[;&*dF}Dou 7SZ̝#Th\ gO9g|\ȏr'z^0,]@Qٹ[~={4\rϛ7|1!1v fLo_^fcI6a*8hC,vU^0}x_ӿ6/4@M9= D~ j|6MUu<8Ճ9;\қ>SQGwU;T. MeV8$i(`ls&1dwcTKG(u K"lQ|5p-R-G{ZO`Osɾu v?]{w; @rdt{TP͉ E 4duyNn/xt ǪQ8>CW]m}2p%g1+Wu ~RW1pU:h`aJS01tH#Nߜsf<R>:CA7 eEMk2@[ Oko>ԒA$Ӻ|[C}r3qKe0b'c8^Vv7c*Qz}y#)\ч*h+UwtMD|#!m{X _aXWkB`Q.{ⴹygmHQfmsտކ T{E`LHBV7CnyޝMҸH2%XYM7_Ђ)Ɓ!rt@֞6gEyuzBZA.qd^4ϦNF$B#HKD*OK~G 0Κ#˅uςP}m' qT1a[ƈicɊܲ8O/J 4o.qghi ȗb0$IJ sԀ{Q儭1Ђr| vOoփF" [+bODk`E9;%<Zĩ uR43}"X81 ]@ s}Z)v-Ņ5KT@ "}1? ؋itn7]Tl!ۢm01uV.|֢ȢcL;f֍hY j5LE /.rXPjDm8sYT|n XLTpFl~ƄM\?wĦ_ z D81z6![݉^ 3.[HgWM8m~50 c7w[ eumy׈IxĠWoRӦz#",A?p)њ x5NswMZ@ilTiar4[Cpqda-<)Ym v*B+Q)MT<[ju8fE_D}=?xq3٤qa0"48+r㮭фh&A1g\AB 9N_QmqW8Up囕ǵ3ǢVfҷ-SD\0HF]^Ov`Fp O޻مG7_NzQ% $AgVz=N6;;- -\-eqk;$=g,6)ptY_ޢdM q;!I%9Jۆ/]vShM7~"Ѷ/GCb/kFDA,9n㭑 yD ijďQ[;Eo!',&@H7tӃ?Yc )3xҀs?؅ ]p2 >Nf^_Ou3b|3+*glag!,ˤr!hTw܍|*i\ 7ĝU2d*/ˏ t}t *Kj$@ѽ@`HNp6ޟ&Л·=6w׎%_KV D|AGt<&2ްH3Q:LEn؛ rp^R^% ŷ=(vڸ)l8dD^n#빉,ra4X/yT絊{?  B[&CƳGYƁǔ5AkxzMB5EJ3%,& R&e_ȌVYXhMIOC/]xʯX|BfW]d#P$ry ϜAckgcy*QյsEZT5tHNmLAr2/*` ‡?lYN/H;k'?Vt,$wY ZO/&͑DYXjH7 #B(/tnd~yxhݶz] x-uޭ?Y"w&Fu6p܄I&:ra5Vl8PKAjO8& ܲ qBݹ}e'@qA;RpbIC )a3Dڤ'!H'l, tOx&~0Y}|,O#3`nS$L|yУ_O-κ,̐?̌scJk#zvU#{39bc9L}Rŀie/y( yTG,G5oml_qF@C-HX) i/k_! َ&y9A{WGcW*5EO#89_3_݄)H`dioL3v=-,&PUJ\?_%\I@JEQ ׇ <1RA C ס?p fQpF) q ,0۔T\N"//1 p,}mѕ<_&-fLh(f#]D#0:׹hlRj6U)tqVh,W ɋpmRLwh/4`n@\x-Wnhrc:,ãj>Hd{6ڼ^nRvG'Ur/K@6F-^Q+wV٬y8G 5/GƻCӍ:w&|ϬrREʦrb_=TU9p) F".1 Me#wt9`B=OM }38Zxxxnms%PrXhE:{9|3󞠺ؖ:vM{CT\FG焹|Zdb~J S1O"g˙Y\6ѽRE,p'6!OYC\u5?cu3lHMF: _鬵O.ᒎ3(NDtCϑCFg;>dɫo6qeWs81.'B,5GXٜ\0ɫe ~p$V~A,ȯY; c`a8hm0BPǫ(G61_嚢k._VU'}ʃyh!ɗw7Dg!7ipeVx!SJ^5lMTʑbm n٢4'o=ei^҆VnĠp})l$dui =:ku 8`{v +f9o𡖻 IjZa1u?:xl塦Ur&dmťItVKKљ0y6э S{ˡVVe"ɢ~< Ԕj̟ӆPS?FiC#kv| 3>8#p=yU|ybmZDatT;_/=Ts](,bV*Kg-Z I=t?jqSYr_<7mxbtQTt1lYj3pC2P H+Egr=D4 ع`UͷRrwʌP ,Iu}Pc;*O񩇁@ "}36ugޛk>MZ;\{ swW@%..3ȽKͳN50]%_]%bafHj0K@):=,B-ѧbBJC2$ `egKG| 5%L^ e~ `tsܗay*~-"BBY]yx*ۮP=#觝.*}y6гQZmW\g2` zʏ %b:~rbB|sӑ FJSHN\T~tǴ 3?U2pq,zH~;;X{hP#닩2od[c;Ǩ>2'㏉Jr=sBe0ۛ#!1%-c*Qf~ϵXѲom1M{.U@%W.5+5j(e ͭk.ZJ@e Rb]y5z+3 >Z}[f7)S 4Ytо"KꫦJ`XGg! 5N6o.略N='(`~n,5v7"0!@1O.{[5=t>Ki+搳Iy]0X_WUn]&8HVwQ1hja[Hn h(;|pJvS<s08]}.Q2-k\mL]Hm lV| 4*ִ'1kW fd俿oۉaf|-V~Ew;,h\O3$^0TXs^'zg< ^G.ꤊ^'CYqg! b/pY-l\yI6D`Fg2ԒX4V#d{}w+aIJyIvDZ,lݐ~M9AV2y7`\IL次 PqCա| l/itY&lXc)@#ϑ#P)`TC~7Sܼa D.q2MǖM|rM0dz(ʰ+X'/xI~@2a&4\+(%ZdZ&dtKN #]nRڈ-r=3>uvFHhm)>%,n7(<q\o'&Sw)Wf9kˣc!;񟖫$-\-Z4 Pats,*XvL*JkMYFx L)D,քSEݦ7XM;O2?kߓ>SM-Y_ ;P1`bOSQ 9m\BuưA~3aٰrl+ɰKEteZމi\nd|DžMmN 9?۝TqEED^3J?J\"JspNaZ6QpB:89wV,'`FMO6.}QI [@JX!znDU),Tw\a3 M q4ū؅_$`ɤ|(2-cBM䅑϶.PNlk,|7:ƦD|A${c(w DB#e>U{V :p75ZRLdIۮ i{wUI%կgr"Xw*oռ;Tx=9Z~Nyt{Q+Xt&aC|yUvCB7cӤ!cs4{i +VD5n@r`bdd<ƶBp{l))%ہpEk$V.}}֦RBӆũlhr:WCcj_-/1wgQSlRnqIFBL_pR@q6B%Bn͗y*(xTbyҾMkĠ>a~yҎgJ{5RH,Ш>`\~~?'֟50j7{( -x~i<+yz=Hc]qRg& w*0J fJUIG$'l;WH5{F 8'O=>Q?^Y/tx:s*(o[6Jji+xg4;Y 5~S7:%ܤ[v +.*fF}}@(*?8ʬpxN=/d GdcsR8WZu^ h: 6,&o׭擁yRr$H35?O,ȞRyۊ{x+ K|&z$3 #*WC3SݿD~; CpZeG1@hG֣~5G5u5 -dDPt;*XWU=aTڢNl}&dg݉>0˼pUF`s(u C;ZC+0KUc{*Tښ &e_J- gCnK[ %,Xˆ4c*vxAD7Sߠ#&ݓV3T~Eg*Ckjtv&K]SζQp9 넥K&,Yx,1ټ("1\Ua6Jܩ"Q}ה>gLvJ |e*}Ap H\XFfEpϔm[_ §7q6Ҋ9,tAaoeL.rià7%7pŀB{&d+E`Y PN&9(&*CJD=9H0;H,*d7J )er^37)t#EŁTT WF4毴/. ]ɉV ^F[_p"U:dT&-q`W,pH?[)0Xopl FGTE0Q\Ր82!J?ʣqϼ~$G 9I4:#(VlLȰaXmuFٺj3|4MPd.: P*.L*{v~?%LJHRTgknw5@pݽzx5 ﰽa*RHl~ZZ qrD'I:b:$:~Ԇ7L?WvW"1ȇq5=zwLxTZ蔒k909хƵB^nE?za0aIfz "<"ӆ]eVNhHy@+I?ʯ;vxnȓp+J w[4^u=TıX ʳH%Z1^K HC4in@!Fg ?mx!sp0RẍLbνMTۧQK|(}>9/+! QKzD3ixcʹUumF%;CLf\U#jСl7VTm2;~ǿ; %P7-q7@Q_HZ>yS8Dж@\*J ֚hzےʅLʘZebVrnz-uрbD7BP@EĀ PqYIs5eHkX4lq??$Kéo+{[ө7ͤ `F0b^rM7b݌ ֦;tqabL/&2n4A?KX7u7p kl^iI!D| *`&bؔyrIexZ|7f|ŁafgL(V< nI30<'^|pv̻*.! gjOs 1ѽVʬYоVvز=#/!^z]LRj&X2a~ +#z9} 1b)cSTk&jUӾx}7yp>M$i>aS-buG>̗\LB_^\҅d:GĺFoo♸׹ >5~!dy$Dy`[S wpZ4!g-_wT!ͭTp5t"2Hкtt&bÆ}*v%:x.j5"X{z77HYE:ahەR1Wqia#A<`?Z* *=!]Ǫ=k:UX=M#o~lb :c4Es,1?k>YO~\ᷬ&HBY/Ts-bп9T $zCM@˅>轊tg AQH/=zS=*B>n{~Vdf> N g)NiX0-j?JI0> AW9k#X" ,Z1bEBʾȝT[JB0ZaQ#eJ @ L ˬ㻱_dos㆘YTki59fGYUDK-#`4`#jT¶dqjU`} m`9L^P#dߠT,X06n ̠/Qw*L[ӷ}yRl˘6(\ϯ=Cd隓e4D kŸWޡ3~w\?E ?).]8S挭SȘR$ϜCsg$^k|q&y Y|HIu\y*Dq41J–=YLӣF5V>o=GY3:iļ,tHlKwvv|ˡ"tIT~W2'/rܣM2!(J_ۉ 51!g a] Wy%Xl7Y&, 1I|+]I#DJt7|vg4]gx6&f{I_@^nΞ[͑$@?0#?5F3dD!.ܮow3e?-ІTL\Y,Ӕ\*s~D܂$ݥIm1 jZDhc<]$aW֢D@B X>/%\ n;`jG9ŝ`ȼȱiߠ4~ec37ZwۿTӸ/-z4i]k~PgdSsJ#'^Jd>޻[=e?( %!yD*wAIn4ͽElLnSx#Äo~h@C`D#$D<_CfnfCC':Q%U4}0be*LTBWOlDTq #!AAhK0n bމi&gE N/T;g+&z&akkxA8k쩉.8& 5ҕuQ:&eʬtG`Ɠا \?(R~Q6T'i 6b(wޅmQ/T}ish ҾW2wkUuΙ*.Ձi%Yf I SQ&|gs JsW9Sd= "ȌV{!^Wr.nCaETbk: E *t*ulVWP&=|FZZY[[CuB@o,1DPi״a'C nC5ȇ4Q:w@+HWG%t˪,O^#χ  Eu<2-'w|g+N쇙rk@< {&,Ԫ_ra+) cŁ*fW|jUxW߅Lg2;4!^ID] ]*.(6Ի]4Cn d6ַQRXr'6|r4œO6y5GF 6d>٦-/ ?E8aƁK >ࠦPMiF5htk+?H/S;v7a5")ȩE)L{J^T` ͿuI|ITPWH (M[j!a b| ut{vx pcIG9R; ]ߥrnxEpciUMl|dc3-̪`fm.T7P"ʎ߳5!1_:31%Gۛ4ZZzH^2۹~N =2fTZ .;NA;\(H|(ԶGNH]>3n1-L[k1 9<wW Eh]lVZA/;2\~Յ Ebs.P{a>!Sh2@jxn$ Xh,.5q4TRGل.cNkqϢ WI˛Ԏd0@w;T .՜n~$HJFжS:4ngyۀvH3V<%`x)]` 7W]~e7 uN>ilu*a~\G&ev9` H d6)˹g2b]&S1g Y2? 4+`̦ nW$0߉.q>Ⱥ'p1~(tE:[vnVC:m,!zD,Z۟gxrhm]U'v8 Īʊuae"͞m\J2hϰE Mv8΃]\m8xW F1b,rA.nmm97ħF5PLF/m1UȷL?DKD.16Y2W6Gd3Oز!1j{9ce=˸DK{ b1s80E Lםy[ir|9җH$<)zga@H4 Yx;beFuJ\#bxE!,Wrtr0/Vs=|apA5l迲t)xg$ xL'% XX93r [8㽍}F:ɳ:}h#4b7}z^>' hm:Yc#~[i+?"ʪxR6랶E/HuXVBF++_# k7JPuXϽUIz$$&&D"4G- ʝ-I/yc+-snPr,ZaA:"ҟnGX Q ;^hٵir:oLAFβHU*>., gT"<(@]Y???ĜӃ?jse$l.Vm:Gϡֵe,S~ q#]kWX$ըrCx3Kp4EIcDūxQn`9` ?4)in8!+"wnUڞk=3a@#8xBB FoE;';;Dx_~%+&I[`7 ?>_qJ5q$Ct d;WCڌng^մySlF{T+$*ym>IVy._tJu;חlJc1 K%/(Dv%mIJ]ޡSuUى!d[Ț#}hA.@_K xi~/gxRbɢrOpe\<ɕ;rH)HL'_f'Ct yKfN$谷Zÿs\%R%GKKi L948䄼0Lxő)oELV?+K2+]4U^a^Ok5P+GΔe~ ^jy1(WP2a!Q7zUO7 h]`p4) q9Iĵ@Z씨DГQ!G2+줂luayc짵6a籥#52,ӘFz9ce#FfqL><ϙzt*9J W]RcXn!9G1")sDx?(ZFe`E'"* 0 j-- 彉 &{"57wpQoCr=0 SkqLj{D\؉;8Pd@mY}PcE(ZAީ'q+v]O3ݎR=-uUmmyʚ]mo/PFՏ4jھxN1 eG8;a!@f+Nℕ~KxBMBU0>d; C!krVDD9#' d"oC6rNwwu=^Bh߽%wf[ b 0ܯM1^j.D^}PBOYt^=Tgeh+3V;3-) "2i [ r`Dx)k.-TtgF'uxO~jC|=n"B,RG]s OY%qHO Vzˀ[6v[w#␩PNN,/eCeƟPnmEs@8 fnOy.0k\<>/U #s [o\c[!K Uk.nٓe1`$ ('&_%*ytKTp!i]|QF(Zq sL];Sh]Q0yC@f_"ňV$q+ VC|R'asD ;NκN17kj[&=PT 7su3+0s;(:NU E`tPfTPo|k eHBOn"$R4UĠg@[~iTmYL[nzDA@R)Y@L.aߗz@,Ƃx?rXO칎) 1za*,tj,fYG^h@i% +uVD* Nh*WU, 8`Q;LctSXl VOLo?..<07/oCDc-ae43 SU!bitŁQAԱgm J)н|4ØDZ*Z-''O >=Yy?n`*Q[wPP9i}Ў'(cge:z )JŘxiI84 U2h$ s,w+.3KP9-8:9 43d]o'#s Awc4& ; 6M&A&GEE.RAbxA#_bsN&xݯ@7 PbM¦WvHu$ ~+9}o|ATc-Rʰ$[.N'K[aos$4O';{>.H .r2 nJ̘Է1rײfǔ@l]*|8QGWKI3 ޗtB`k< ND\В ]VD<1:c˴bHQF]\-q+/|(UΕ<ϟZ-YTdSܺ'A*{0&s(5=yz!>_K2!z3.AU KٛQ7ݷJr!`]SJP&_*/QΐˡQy%ѣl1Pp{u)D\~Vx);1Ɵ+EG^UH3M}3[Ʒ9]棘F-}RuT²mۯbK8~hI` ka5i0Y"pO Q[z..nx6SƲK#T"xFzF]BHId&Z&6~BH_5,;2_ CRXQ"J[;UE4%Su#IZQ9!1>`*ѿsCtÚ1d_;n< .z#J) +{OdU+B ogj]WI'jiQ/ F㈉؉@z*B_Tj_ؐ7xxl본q8LX)rQJ4?C%0olg~_!ll_C;y`\qt %t0aK@nRbUݤ-^z>+kJ,L2v\!Eڜ m|%'oZ-Ѽ %Se$/xd?`LEZ;2c5 Zٷc RCBr޶;ΰr&$IcS@1SNpEWҍ0F s6퍛KN|%H).c.6NA!m >2 7F5}?0_*JC>kVǃ`#a$^1Zj ^fpxy@6a}x˛BEF 3^Gj䪸d)p_k')Hoe g(ۜ.7Z :Gʬ_h$ "s@|4A\ IOq:'u5yǸF߲:hXi5reJvaQ0io,F  ,~ax~#-IFy)@>wY"}|1FuSqľ( 8.)X9}$ڙfPe)ju)#^El =!I 3ڻJ Z4nDF]GIi} ]4YQ"h'hpgPNNT1[ݻ;+.AjuTxxU^B e:,oT ,.1~ړ+o3b}72V-,=`!xʬ{Z сhcEi;&sdu}OLiQ:yXĬ{x\pePļVHkgSiN1v#rc@y쨂e 5c%+ %lj)pizJ 6z괻{Riʵ'JY͝Jr;'U,vv pɐMO]#G;RMޙ74^NR/j6wee uoc3y[oOJY)! y1'&J R4͖:@յ{x?GsmI?O*gLM=bD޲x:#m!thOC3Ä\]YL!J} d =ՙGʲ:Wq?@]. v\H~ka)OE¤9&*J]h/ t~nXzF&֠z䅛hN:6RrV?n<VC"(ҨB" ;1EŢ.,QiwZ}oOdq&?d1;,"avDZ ?d^PuĩViĉ+O.OETs/#\>ͭ˅'o?*@ĜQ\Ms·B ?V9='J|%i-|OA`&&u?%>|nL:˽#hླf{ar!tYc9֊&4;zҬ(N3U=247!xql䳭R63uw&( ڶ%UGL~; :~dΏʳj jA*O]tۿä )o:1S0Q>)ĦkR5vr)ָYح" "Hɵ&!8!!eUP*aTX#79?ĠMO3iuN WG˂z.|,HDOME+`H_9ISybd񎨪@:U4Ф(}&NĭNg?X$O&]Z #(8(8ַy>pt?tqJO 웪|3{£ YgIқP#(MV )9Z$*FD[ r"f8@ʫ/zv7%ϭC'<)"X{3yBI :MgoNՏ*.EԯC{{}Xvz菔:6Ez@?)>,׭)ᶖ2؏Nb31c;*:C[ٗ0՚j,=,s=chtlok;$sx,V`o;֯M_AgBmќ&0+r'Jڡ3A)n-]09 "*neFXd3ב4{nM"?CD"Fv|UL9gu{#*Ac)34QJcCky~F]lX4\yMZX0&qtz "m(ۥA xၢAmat[ro'~?2RBx(ux$UȹA>2s_=UŌhsK0g湱e 3;fT  %ЬvS!zWQFjȸbsdA"af@W$oZܦIp4wX{~%Ὲ%pmQ0ljvh$AxCM:;[’3 K>7E0˨w$vM)_ -19,4ᚔ뀂j $IHR]&4`u'^"ެe0s|*rXh( $*Y0$DCo[|FxcPHP0؎f(qFhZQGZrɝ }szihA k*s1PḲr.Y0"yt"h$fe 7ʞM!^;\eQ]OZ9V^u+?4aPͬBT\αRLmzy9l aCijFh7p^Aej>IwNi2mgȕ;uŸ]2sa8+4]1gol﫷ɑWۛy%.7 NZ\VzvVBbM|FٵV%J`p Գ %b#j^*N;Ⱦ8þM)cvߟZr7p OMQFyyl)O.KAsnd'ZaFdU綁F !MmLe \ʈ# }/όlS:&U8_x; 2ؾt}Qwb+фn'TR%%ܚ{k&NAvR_&f?;}ISQ>t?TH$gU~K:E=0WvLmqEy8zC}f708lTcTNL2M5أd ?@LJvR`}x.>7|8yo'ZL;X'*)4bduyMr<Ɛcijþ38,O`6XVgERgk +m61dGVYEPLQ~%0ar@[YΆ]-*icMP"82fk/k#SK zR:J,!X RPE'ӝ+m7R,GYǬy3X3 -/dv ha(y.T`-iF-iAk(0pݘ*Kڹ:@b!,(V$F눲ZI7yzT(.SbcT6 6 Fyo|R1'!5c¯/} Aİ,*E?vjPu=ײ \yl 8ԝ(s>W8Lsi(8ʀ+a?ߤ_ 4&6L]"5VMn79 "ƩG Q1!aV'fn0%НrFGVoVzFTd̈́=g-t!H "-)-565I(2"i7ukg9l$oOO'RY𨟑A5VLf=6b_\(Y05U??u 4 -t$ ld,*4|C9[W-?_⧎H/D?uhY8^N.d5_ a\pQ7t̲v,~'ˆM ODF}ӷ6053zϸT wk z Pfˡ:ZM},|0+b (H #$O{|CxzE] c]>Ik, #, cvg,5؞ϝb|RS/*>fo8C V4)=R/4<Yc6Wq=ӵ2˼&3?hd2nਠ"ݯ*{v 1N̑T ax)J8Kx)2Xa}l<|lT4^!ޣ$xM+K/~z0AWs W˷gUvG>tt$]#zvwbBmGjQD &wT5HٛLө߯/ۨ6ND Yt~s RBnrĩJdqNpi - Oѽ,@ߴ]d e!Mq%0eΖ8):; fBNJJ `fqJ.bx_4%B{FkLsDi[0ccbdFɪ\L>FhTŶٹῢ'ƨoJ`!آFЁDd7j` C>\Td,o Z$[0|>o)M EHR6&V5f Vv?lI D(%@/"Gȸ*Y]FEVPf[z=ճje밾*??;u,Dvɰ5V* y=4gN@64>w_MGņ| x}\p^nnEq&V$1P_4ږT<ݺ ||Y廋38Џ.7Q&ʮcP95q-ypP_He0i!'aulgSfB[tݥ|UqW/rgO ;ͭ8C[G7$U3#vC\ $r~ "vYRV·TK+ycQSQ>KPLSФPn6 41bZ*pn©Uы0MoKՀ(v'ǜE^ӻap1sU{G&Kx6OdzJU[G'5KV#{q("@^HX9$?4BA?Iž]E$@8ԆZ^*nk4kg,GYOV-]^0 "[;쌜7j+h%tH%7uwY=-!m;P(P+ǭP0".OL58G;W(k:G g\"sU^bVmM:/3|MeJ!-=.Li'mjx]H) A J9y\6ȻECHpi©~x\4 zs6% "<*;x6ErO ?7Sl9ʺ3P̅js˅>[\ۼVq}~FWHqK LG@C d? IvDKDȠp'C\$R/6َZ͖>ZG;D;" i]%OJްeuw_DɣmC8dh1>(!6PzUi{#ٸPKe=Uʴ+uW.X{oiJ'\)MJ='d3y~,5-=|njH-Y?_p )OH?..b._ȿ*e{(FXOp;oi4fg%Ys  v4'hB3 1r~NpMކ`,ۍ:w)4>xKt08̷ OrNBgG>Dv .*(-$*hMv,^2FI@ZmWH-`q5 I#Nɢmnk|R3W6L'XLjU(bN='#U1JV aF$ &-d-=mvf ݷ@L~ V^SfJBX3("׺Nkd8A7r8%2/6`WROP ,7|M )ޯ'iq{BػK3-P%#= q~Dz۳0/wMKY'o-T8RA)v!5(S?Oxs/rI6]m2;f wkv,t'!R )Oj3_.Z`g2DZ(EeY\D!g,rzͬ0_7+h]9_hl7ᚪlĘR] 鈐yol|W 5<+&tD>}@,9cJxxYe{Rh[ӮOb+8tL5E墠Q {-)XgYP%Lls%p(Yc$5_46ӗWz OE}YGSjh o`"w mo*W*XppPAOt_//kc(&f5=-/|d|M_9慄ʨ쟯p}gOIPz1XQ]+5!Tτw| h;stmy~!༲t)eɟ%'>BqF+jL asbWv,j tP| >{:!SAkxŪ!кM.L13%OqĹI|0z9Fċ;ۗ+n',_݉(b%As:U OjQ7763!1 <(zT,Y[8x Dz6Lpo e/%tڌ(y9 UHXwPk! U{։Nb;ړYl/V5U\%Z2s}*S(Y20id$Ci* gVbHh-ϫ`t.}A enBVKJ1Ŭ 5cN^ 2"a?r:y&'k< Fw2AQn"AdZ#kq>*KyKY-d6+gF Y uuڬ1L yDC}Jh@659_@ $YDk3E ^޼LB=4baH4 $Ujs{ü4MLO{:qK=RtZv!0c pFkt?h48# ED]*lpb}#;oe(&5S~jBJbðj7mV|Dnl6_]CT]*+|u:CWbP>J:D,݊2]/ZEvi<|/MDNݗ`5DXWnWYԚ9"ջ Qo^ID;EW< w}{AwN17l!:ѼE1H&5]Q/҄u ZNΞzOTv+hnZ)Y}ھ%T&%n؏j*Kܺ#"a[(` X 'ZdZU;uAh(8r*oj`wo00:'dvGYy0k2G!C ~n_^?~ʺ$!RuՇm F6#gD8,VP9($KF~\c;b渺"m!م"N ą!~*(Wțy8MGM\,0}lv6Ӑ 1%oI>]2fs ߐ1P:tFЅM2N1#G|ޅ{wGiZݪB,[1Ɍc3sF ꣷݡjisH?!E>H \d(02</nĴ2 | T-/مlZ lGU~ʯpQSoKzNqWU;oâN",)98/ ErlT2D 2|)QĒfA>nSs3N?^ )efZڠhHRcA1ptiЇNvhcJUV(?%fw2JL*)w="WQOSEzT)7{qrKE{ixV"K t0[cDnҲS%1A#tȸRWQ>Pt嵐pA% 6`ԑoG/a/l%J)Pi3}ͰUzXqA !Od^~R}CK8>-Za_ȫ&`J&c),ұa^ Of +*w4Dk }eksij.ox<24$>4S]{7< Ԡt[)-e\P~ExTTwhQ(Im*ŋDJMP"x|y2( Og4Di?c K]K^{&Vsdlj밐+{=$ k8T؋`I73,9gywdA'pʧ[ İ7jŎcC9؊0:}zuе^aY}XN~w7&-ҧoi'eX">>h[ΠaW2YI%W$&tEA=.$&~Ny|Krt>ca ٨Yَ3wPae/]:6GjMM\r5voDpiNcg*vYאGa[Cf`NZ-E}DVxY,ܜRlr3KQt͞ܛt<&#ƬF0lDwSӧP'%44++A}sjEyO: "[ڙf>lR.v[G+ ߒL.%fV޶fO*džkiݗUL:'$|_[WѶ7q Ͳ"A:]Xr DYQmiDSǿM$۪TS 44 #dD _$w~-ET#V:ҬNzme٧8oEZȫwǘZ҇ߜM3|{ńMbsJIhen+:!*LIQ&I&HL7Pqne,ܩm,om40zt,( $: \ f ѰR6T8|Aҩم; VטɼS, 1U{Z6Nѽ-4Se^ǟ1 `liZ bϓi D0fh`}>>ehܫe^m^!; dѷ@">i D(7ĉSu.tOIp`KpH,{ՀB戩<'H)r;pOYRc5-i'^DkP!o  l(t5ܳ=mAn!+"Z,YkE7L d9a@2H<#3O /ac-OF-1/@ú8c4K4Aˆ*Zr.KH]nPRAbyBv\o>84"|IEF%c4_k.>9y3ur M^%6@@e8Hid]>gTtsᆑucedluvrHQtw Uz<پEzzi?{89f]K'&fTekk]n'V2tXծ+E.J| kGoߟ^"~ zm:CgJ*q\/qݛ D}%xp\b]vW>ieqh_EH%sRB(fpi܂W:7Xi&2&4*1NVvhGNXh7#T]y[GШtO{ָ5V(37i޺6>PN1Wf6Pҳ/<y7a7髨q! }cISY^3N_9MI&t4Lq^8ť54tꅾ8*|Ԭj7[A.gxT-@cdLߨ3+*@=W)jCb]^  e1Uݳ!)EȩN8S.`\ww,i|q;C(TըhW]W\.dQ-EƹlX֯xwʾi1vݒH)NY4 ]:]SQGLb7V=<_o[np-\ * =>Jp燬J!UIAܗuɠZglAM)U?g>(Ȱ`e!v/f$!J\&,u O ;q6G6 罭W#2?x*SYuս˃m7Qzdܛ blտYѓIA'/Qew$AHB?)I![$=PB\ϳՋO<+\m L$z8tbKX!6VQpT>1V&*.^WK- WLEq7vYve]`b Jْ&lj*#]~:K=T7$K%)6b\Q RRt&x xgʥVu5!wyv2X}|w>dncۻį9nJL\F hO?0p8Q1(ऽ-ɌZo#Y@yf7nb*DaA yt#< R{z1V 5Gc9/PYJuZ j^^Np )q_Of+_+ %3wNàKͫj(2=7g_:zyi#Ϗh2XAPO¤B}|ɀd<2[yCs738[οU׶3{( 8V I z*;DaGІc8w9xn1(ܺ$sCt}U6'b)"ٲ|u,JĴQ 0U/hǧOΊG4=L[ȒɳO5>~_2!Jy}kO6ptmTbqO^ީJjHcXOe,}o%9:h,d3 f^S+#Dͬ"fD\c=L 0з] #) \[%1̖)KMJMAgTT[?Y>@d'췚 jN+ZE]h /h wY^2|3t(~;'?†D(E\O+;ďרPڥ] {$zR6O3ITybwCl┡XT,#6F:$anA~Um)neА '4;_%7!SX]!?C_6(#`?;^O3[=z;coI^[ |B* il$ë6g36zfxQZI| rx`!*H!ٷ?$0:2|i{DSڈ ??Rl?@W"vK[9W޸p NRB]uX؛4QeӤhYou Ni Zl8I7\,C^§jC)a-j^tcQ.wkuv> VGT4_ lK,Hi˻_^{}^Rмq=kΗ;B3uI'԰xq땂<2;2ຑj8d}R1\; -T6xlmgpB"&@, |Eq^QA?kuGWqw`^ P{`妙94X(az% rA*0Z@7!Qt*^~ AF2 ̥KpnШnͷ-dzNɃz 8P4q3!pa̽ϱo_HR"ȚUDT"16X)\g{aq<tNmG@Z9gL@/#dZv-"ݼ~Z8ް!nfY)v&A=8T$ZeK |dG8"nޤ1 5A gTQXdNF\@h5>R#gvFJ$ٸ2H\ 9oo450 i(!ٓuSTK8~jiK* 37Hێj/ XQ~UcLנX-E>F'vJ"?p3-#Su5{buR :w\ eTezE;Q*S̎`]L8~h}w/E=qz˟]b#ERNIB 9"U0yR%1 ph^?GdA(,ʁʧ1oeMj$O}fplmdKK t RUGCϰ5u׊#NR0? 3ziU?u X 2<ב9,%AEH JӃSsu09ƃ^w=^IG1OI SW YXG$ogvK)`nϻtTDG,9H Ztcg]֤> d܈eyeCҲ[櫝2Z|k]k{txSm.h*,ACӥf,O!nHLlY]U3PϭFqxU»"{8:kW1{f(=I  >[36 $@*5J_<d;>)ǁ u3plg*`)~hƁmtF;TPf{;8(mc\5 1|z 1q܈pA-(,RwB`rqRV!쥃dXYCA̞@޸/|Էj486_NRO#xfxL{ڜ*.&wgtQr[VcMLjsfjTz8d)l'~k̡>&W4Ot`6MG wzvrފ8qRD㸖`vkϫȠ@Ϧ)6턛ʇ9><x1LDYI* ʆ*۞gʣ.ˇͪ@" hd]mmFiU?h;~{;|sVLaLV] ׆gvnh Kۓ3DUKPy[)[[Z*㈲wA (?.5vK%lW.IQwd6b5z2'1KaL (C "\KRP;|CL^; >[=,Qc\9-MS'2VWnzbqjEN|]b["іڡB7b}:7^EH> {fƇ=ZWkL>PÖnHEfNj)vZ9ؚUSd1~,ɀ:L4lv?@P=>rNK-hWHM`rz3"gcwuv6}(ZdhvRb92f{AP=؍92U=s<ePb,ؑr { !wKTcnmnf+jZ0ij[$Zp6lYIȲ%ȝkHFL\h@M1Π2"lAjҎB~DL 'X qr!Xev,ڽ\?Ø0.2o钥2~{eQkQsVn蕘A[ dN=DߙϯdHf5s4hA'69HXUNZ[@uV%ͼ%V95ѴܰmW2;0z5e+>@?vʼa7׿DBO10xeFn,I1Zpb6"i&x+1HX+!_F+d{~`4E5 dYu6[`n ~a.:Z7]'g#n? <q4"/uaKUQBPGtzC-gY ꧊XTkLQ~Ӻ @k"2&> C݅Ś,%!9l'vjEy/=g.aKۙK.KUBy`U_Y16*s0t:Zq-y0 7`&a-*Kt]ZgjX4U?9L-7IO*ˁNh0czy\O.(덙kk@dlү>,E8no,+ < *7ms K҃Ta?',TQI+W>?>xqB?6dh(0.V퇪mBրlXS%$x&4#رEW1V'\ `峠vnIѦ@k~ݙF^.=0:70{\{P{ЧC8?Tsݐ,֦V÷7RWd%#xl)lYqlV>lAu{R)r@vu<H͐.!t}R|[ )GPR7>̺+dO2(q>".ԇIܛM;m'|jb ɮ)dǎlkLBԮ !:en߭ AsxV ^؅#YD <#Wt#6zލK[G:|Hb\"yMZI3] ͨeJFmZŘx+l[ Z$W;1d.fZS9"#F %ĞPYݱ]yw}LcգAK .G=˼ڄfdh-! R;ro&]v'Juk mjD i ] mIA=k>e7?ÁK͵\:)& {ôcFKmI~7_H͆D+O_gt]1-1uܤ?DP@ 3P% TNu/S!Ǚo2LCvw"/Z/E;a@$f Y*PKBJYrP5Q#X4Cn7K:]էaz1ײ;:]M3" *+k̯S󀨹8,>;\Vͱ}((U8*=euM:]8c (M ȏԺEoR(q!ƏE2t@JAR]\=VE Zb<%f6H\+QnL% C7-UU[oBOHވ Yl]!~9?FZ*+Ḿk4L9r=U'qDZ~n&4Ƀgh5#..Eҕp,"5QPc/o8nPޗ}xOdAEDMoi'mR""QŠZ%WZ5Z):0(I^V5J%~pEJKtގ|:}f;Jnd`!6,u eyTjT"^<°0Sx)f|[dh(Bl?U/׸ijE,` wwy8h"NB28d9ٸ' w pn{2)F&bQEIip55]λcnojM[GI@9k~Wh)ܗjTv,QvZo"ڹ8F=yݲw -0s;ni!maf`mL(Sk>g7)Rw|#J[Z%3cㆉJ(Yj˲&>zwFK QvE Oz%QU[=/.t:LNɒ@P5S5+YVگL 2ϞXlʿYE~-Fi}z@4{Nܒl3?u*Uy'bL%]{GG79wDZ6kn}A8~(ٕ ׏l؂m/{18[RK;1H5 Ap2ɄCWBΦ- th8ut|(<8]AE)$% J[Z.edV=&8ᄞI%)!NϺzC?A33#Oc g\qp}f6 [x5BB5UwG$ypMjٺm顇(q'X+̕o4]ϐ^-[bSdJMP0YlZ2.8&$;vfky@/Dm8G QJS+z0^ҬSsØdP(4sS pCQw_"|hD|rne1 FX沐>CrZ4lgLzYk/K5Ùif%X ]ځ5bg;}xz%ImQbizcRۃ$i Zè;&A^54]ύI#=p4F(33`wo2? ¬=yiAW3id&, T ˡZ.h+#|(nN+hʇ%tȸi"cpH*F%D^60~޻[0;[+>|!9 *{y$ޏ>ѹkZwCdC~_Kw^ێ\VM]ʹr8)YV\f=GcM;!oG(:G G3s8&6 ws5E5FZi.#4C I+_'wb)V-BP6;2ۀ{WF-XtV)ȿx6:vShuaMPb"+Y$S_b~a"NǎRmj풁8& sSJ,dfV5cY6 3a%4dǏ! 3St =bw" {(zE~Z247ajRds=vvi!\mX=g]j*@+ ī.JR:%kV v+%\(V (i+ sD1L(<aHo$2+'f}*w;m O9UhOQm!LD'n D4 X#K\$e9Yyˮ#Dv7*eoL|OBYwsbŎ ypXJJ]:QD[b ~<>3Zw=I V1̧L3T`PYhGM.B!>5FɺP&bw ¹ӽiq) JO;P}DM]#4y=TMnƴ~սrA»#ܣ+0 i˥S] B_]#pVۘ=z`2P hKy QHUd5.R '©wZMи@|J·|wǚ9T~?CWƿ(3!+ĦUJuq6a&JGEGct듶4LXSBm`CՕ#4)%aH™,Vb^UN4@n{kg֨DAB ,ǻ'sч/sIT7 GׂԲRVs \.E"$kc^>^SI!.3R~As&jB(~KdP~mU5LtKd6JH*7-"NE^i?D{>BgK)gLv1Um]9{W  O .S}z{* ȼ ֎fYBf*{`V:K }Xt~t!bA:ÀKrHJ =\_DRr)Ԓ W7PYSޏ͕ߤ'9ě3NRy;QD,ߎuϊ'tnbf3Ia|ˮ_B6ͶUL׺^ ª]|7Z50i1#[H/!<xT 6NJwvR[?[FNy(溄<Pm_19%dYрR8PNݞ52M @<ևJH O]qdδl/ @ ;+g٠[>ϠAION `5}קnB&P렕Ӷ^)7/wBS Ψa#xz,a2*^"4.zNx3Ze.2 5&Ay!KP c J-/5jw?4y[7jvчSm c 0 F{7YnkN1A'(́]>N^cHpr؟:sxO9)^>MI B675v)nT\ƫ4552iGi!x<"++{#@u'ګT *XV~Yo^۔?L[B?Ŝ:nczNX(.?\+05FӺ5תO#󟢳aǠGsXz~1,DM'f:;#V'Vsj2׌|xw#0זEMӌ_' iOC$ZO)aFsGE()y 3t ̱ O\>^J :^)lZ딾B9_5b,[A΂>ak@ X UVtyle˫̝M>G" [> )X^xM:G8T+,tz^71q+[3n(T\9M4f+XmCNMF(!.\Cr Z ]ΛYntII ك &)>?.zp0?y9yg?ʝ4k!Gɽ,js$ap*qt9vdjnGS2ᶢ;H&K <4 ^;I?:RSյcrJsG@WN7CD+wߘ8fZΑ3ctVI@(Zt3l#F IX {/ROߓ8zxƾa #8.VQu(E^H%++O;T BrB;#?D:%^.. A5Jڿ%FX, ve=-ZTuBj#7MuX c58uw+a %|8y m>yeEy.H(Z.ʦZ{0Xe I(g.1\b¾%X`eQ1Y ݫ<:bь89Ug:@\&/lB$jN\Rc;L(lj j k :%AH\̖ŰGᆀ| mw ,mItq0VrX-lq/lS>5QP20VQk! @P[ vjհk;٭Yz A.&HwD|B%d-;b Pmx  hR̔6@}2,b9vTwKo>b&rPa~lk;:.8M=31H 2`LvHdLvaTvؽEY9Byd#W2>ؒt$mt!ߕh5>KZ϶Ivw6*F麨'5rxQs~f+(V &LN  rypg@aGۢ|լ|fxeϱv|є !bxmn7`7*AKWh-vyRU B֥`~^Լ?8~. Y,ζ!Q'NWO-Wcٞ{/J/E9!=.~My!x|"yt0sʎuЦXR~<^Kw<]&{3YA(>GbjL܀RpGV~R :R').,&sU|fGQq;1_u3G:j445w&ĪTdhmA<)@@k rUƏ0& [2e)کAYcP>E&Y%/U߽\"5o-p-!_ӴA-!v@Ted_9҃pcԄCdVpE=ZԄV 됋aSsy޺3=N+iQЭVTtoEo%Ȱ3Z ZAbQdȖs#tCɗ nX-t}b?g7RV.גͮ&f0?l >Qܮ7ɈQ5g3wFl7~K]i8|] ӗ2?:}RA\*q jŘYa.!A21]RX'۪O⯼#SFBޝ'b iz p 8qc=,}-/ /LizB^vi~3\z(ړI N܌(Ľ.1 1Žb.ϢݕHtכyg'-jc6ɳ}A^c[bN|XSc#KIK"Ly3w,TVYA 74t Bd<"8¢#fsbGkOȑ|mA[k+ȶest;Y ` Az̈́(, L+0pmRZ@ivk eZw읣ǁd+ GqdrT%O&O{&?Z^=i_seY"KuI-!vߞ`4C;W%I [Hid@^c_W)[Zz軆yYe @8uȤm kfF+fK' ?E /YhDU7N8t^QK0NVGoSCb T}/3$/L, vH<"iH>9pZoAATNJkj>a]l'~%{2q=KZSrPUp#y7(8Ui$+ <ڿ=uL5.N>2ޡ Ow֧3NR^+eӗr,O$ç~Rq!SrA G"um(" n{pQLJ4P$|X _u7rYN9\Mx}n es4^ڿگuOڕK!]2|~gR=Qְ3ⷬgl(*Aj$!/SRY-,a,3C?ڹHz֤يBuf~|JJh̝dJߝGVmEpݐ STT}X*(tX T=X=p8 Kr뗐Tdg)Dv[k%f 8RBY, T7>6F{cs w A(n~%&v%u9?U;vCmKWKy%3潒u<a Y`L76%@̇ϒYm︧a d߳M&Ÿxo?BVjh-k2w%D4WtwNL߬7[@R0痘gWi]X Y @v8HS֝)у_#72}ml;xAY' rE[+QSBhȐb  BncVZxe$ MV'Y| ?AsfR - +[Q#Z}Z}/-v~6nZtc`0v \k=w}rVl<.bKDH}YÙZ곐}sm$@}\kprJajT5i)'[0G4 V#yk#EWES{x*Q}rzJз&)F48B`lGZUВ̊{ȗE36*Ό[gF<_~Лݙo~1_ML)jB4zsBeu|PE®d`/5 P aIEDv0%i}9x bO ~s^N+~nMB!ܾ5j,:F3`v!S8bp: y6Ti%[l##~*kg6pȲQ"iu˞wL?>Nl19S#[(ozarPdhLS0y͑аYyJD]';sob!-?ͰzbEܑn_pIQ@(:HR4@էQ]f9D0 T&H/xכji9x4&tm1v?t9:5 .fEMD8 k<LNX}fJlX ĹmgT}D&KQtAoɂpiN%.W;> <@q!oקę&B+nͤօ91n\f<VCi>?fu(i0R8 A. ѝL>׀v@mV= )1z"{vr/̉,-ep߼@sʵ\s'uLȔlR 9U8'onU,]q dծ"t~9Bn? eO8T x8K0 JQb>9,lGzT'"9\JsƚN7|-Hή5}TէS1nw&yC) +7c-Rp Z[ vԩL- Rn͟H{`x,w/ & h̨RDyl2k*KAKA)g%;wxOm =cԏ/`4D }v | od9"f\h|=B%AlIUz7zOul~2DV_wɭTf.(~!p@To|AyRW>05 gko*};͋b _ {'u-VCΌj]˥]dJP 6S 57kV&P&'tˠ&Ô|Inv]7 Z -pKkv%W*x>80v閜Iܶ'\RiLX//x8KvQ>j߅t`;5 |ks؁^,sߋgEA@sGd`~d'l67]ٸ&o,5s 7ax"^ 6Ʃ0bY B:jd_tk&Xpz190-xiQd!`=bb߫; Ls'u7RSGʂfLX茕Ly ;rEYE2; DԻ7*S~V2{6=}t `3b1 f}Y؁sK7fld^Kyuwc!XX b U1/搚B8gh8FX;r֑=0CNa82 2tM#[ёUD{*;dOֿIF-0b7(M~Y2vo Ua{v6߬o''ȅjo 9 9t@J;税iT IKܒdCŵC WJM"M9|ق=W7g W#bۮB~BESf `3gQ]%F ]rP[pwzB\Z3#Op%onu#)֬#?m R_XjEܤV]_inCMzM$-j tӕa4w8QȡZ 5PM'ְLOKmrhg] Oߦ jsgxQIZ$" :H $7?_APʲI기Zڄ|sdN:yvOd%6#z.M@.%[#IlFU nɒTO*- _SZ/Ʊת6Dg87-\kI%".X߄Ebpwz43b蝳Ρ=fњ|sYΟ)e,QJ%zɇܿ%; O:/BqVm"'k[ĔTnH }".]اCxv7Hf¬uT 8бZPɟN iTӅx4 mq'Hvgwa&V> {s,z/~bum -l5c&uŕHfG=- _O p7τ2^WTf#b) . Ie@πt?WO @Xn4-{1 (Z:'%7 BC$W\~4A32q(eΫ@P5n."nx\F(St/ ن9߃#<ש N8(eb XLKEifR1̌-gгݨ+gL\f-1*K& %BgL[uҼ_G -QX jj X#i_e VYN eB*ò[ڦrq$U)YK0B2wavĶ~nofh^{XO>Io١-#QX) UtԻ`[sh@13ID ,oܗ*UC 8yX)1.ƗXWI|\W{y1ưwfťxyԚKHǔ ;͂}M9QtgSEVS 5.$NCzr^l8J-Oq]-/Hns|т^i5(}gˣBr_Iga.hiI4 Gx_CEͅkVIB#a! אW@7'y_Ⰻhǿ VY 4QN\:-);+K.tBR}E(jYcV(-˝~ E1^qr&4߫!~W dPȢ]C$ usIxzQёFEIJk>Jks~p$.Lohx7Lء\{W\4~?{UjU c3#ICa`ۙtiLg QP6Ms{#.Jc@Ԣs6dQoV- 7H*a>BL6ٱXz='i!y k"ѰLbOL 3gN᪉cjoWu/WW57^ڙs\խKa~ר]2m8[yxj6\;N5QLtZ$].s`fJoWFj^ Z˦F9WEX4DI؄Mͳ1t&BbֈE)<[oFvFԔ[7*p{>&wLg ,b0fx([㾝hYU8F8l|D+YP]A{r3RxNS #b~!\wz+)rnѶ7y{( IAfI%:xLZ%AOwf2I4l YFָidh\x!1%@Т1d!W8EoSN)6GĎULfzgplJɆO9򆸣zfkzhzTS|c]y_ m9!52[XvyH_GTCB$"rz"}.ӆ6Ije4 ݾQ6",XH>!<ċMqkpg,N9ߊ ;{- ~RU.'y|Zu cNuu';vtĉ@/].o6R狋ԙ7h(XVİպ6&aӗ(qncPwٿ> J?q}4vYiA#ŪBtjQ(n Pu<cN^qMVx8:br Hy Vp Qj`ιSF,[>W< {vWjyN+0ZY9 G|IdRc H"}I\6.$ RD4#u^ oV2GѹԨG5E~v UJ_#q4e"H.(b'/.\ $/0_[{ >};(Kh|mZpdT0È!{fax4G@,d^toP,P۟ϼJ-zNG *x)dN6cףGib$AdU=D =<gD0-Xqਣ'pI(d?<8P |甂?Qr˞RWO]|`>lN']]17`,.pT.!.u/=V/'uz6#M夐-cBʩ!7((y#F!-dì`rCТnN)e g5-,6o@C{׻)W HLUj Ǹezp*q3fdoD#ԘwZd@|ªT1fxj(5VL \:3F.W#̠ۣ{*j!Q[vu:2qc4/4mA봎he,B+o;4Ŭ@W"o#n7[`Aɐ"ܑ ʼժd)ss0SAQ5Os7]X,{ 9ܐ_(`]Ͻ\? h;5wI/a3:_/MR("Ƣraģbq+wTIE7-|hj NJ{:@ m=='ƹ[.Xۓ˧|~ΥMLƋTݭY:NzNv~ce]-sDePAJg{w: qfEۣj5OwoFlz1LOEk*o޲gc[Pr;֌Fѱ:sh?@~erКIb8~L$BFp/ΪQsq (P"9c۩,5'1nS _UQPg O ̔X]` 8 ּhEz- l;2Ǒـ^@?Ӎey9y[E66K(:_*?`GBI?ٳZ-BTSgyNPfi,hgJ>?:s'a2Y&&pJJH$[9RxQ=x `P?`=a*C!4nfJ\CLA7Uzw~Xŵ;O $~2跃ա["y}=<~] ;>4G@!PɃyFg ̽vNyUL~g`V%0) RaӤT>ڂ(f$= V% Mkrȭ~F"1!C>?` av-ƪEXDZ#)+cmTEg"L魆"$;(Ǥ(5 V |*]Y]&k`m(D/9 J9H6^,=n"A6^x:+׿Aj βE-eԽ)Iw䶤F?Y׏R-!wi;i:S O?3)>SRjɼD)x,q]8Ͳ(*]fT6H,]k=cAσ5 o,GwUԐ94 /v_2eQʚ]SSᚾ`pFy)bGL: M<Lư;`3gǼF0|\u ƮY Njdeg"v{#EE",|Fd']9 :&xIt]Al!$[f4{W\0ㅓ4#Uqގ=~tİ?&&6&V5ŕ9Axs{2Q\ }kǍ0fØKB9᤼K6%ҍj~N:ȟj۶"5zVU B|;I1'jT wLd<6E1gG h [gct n簠=bͮo(i :jh;|4krU(*epXYnRH}! ~ƮՄXLKܕ F &h:u Ӵm.R4{]hNx$Ny#7wGaJIgFhvn=:蝊/j3fj>ds9#-+B!ٺBȮ< Fȗ3o/9e`k6Qr ȩV[6"4 =b2#d:Ȍ2 RAؐhq@NnkJ>ӬcV^nԤ2Ӧ};_QGх'-?T8<Ň, 62L_* 0e Oaps19A !)xʣ&2 7U =& F DhH̠-D]l׭ r!ݼh١Aͫ9ˠx-`)?Euܼ(8Ÿs_[@R1t#UFeUr zb])jeS:'xMAa"*o_->#5c Y[1@Z>T2#Ë:!* eT4}:-t+,ZXdfxk8{pUX@UcvXX:tZ%㒙&r= ˷ Gdr_Nig˓-$]4R,|~iG.-NDz_0{U_ jx^(6DqUl!&aI0RġYa5,(5'] naGkHYA_cٺfs{^dJB 9J.qh mvlG;3ύ7'bET 6ApHf^5pi6n Vk18XBxrG\\d*NҬ jFWd2`2:K 2l(;p(FJ>L{6X!D؆}tmZyJ9PCZ|oY8>.Sѧ1$F$1a}`q&^Nq>kwe#NȘFcv0v]NOC(~`s^RF`8dbqXBض̂%X87= z&W+{箥^})+/(݋V;8x-8<D[+nkh  <*@v?y߳Z)ȭ+p9x$5laDoKEm5Ы\5aHpc/W%va^<,O^h-kdSB{p#64fyUE&VOOu/Adf:]$u~ܼ~{&Hu$[{s87x<7ʽ UCܡa1.cܱQ `x|tΰV ͤ!y;I wR…,ZU[D¡97^'džV><^n ^5zjWngy+̙ V$ X2fř8Ƿ f| [IӕJOI&Ȭ2E*C2'VFt=-@.LVCgm,49^ ݕ;A!j,@(2r@]w͔>g'Ljr>QA`a=B#v45ۇh2왬5mNarBHR+O sTʌGԓ]7>׃yb9:3 >PdPݏu ֱZ:Mq[2&޹!8bYA[")|~=(3 x+f|B7Plu!,rv&=|ш,!8!{*(S,զއP]7E4w(:Texd櫦!^KCx;|y=GmO@S~״R" أ߽€0yy8RmtPBM$leI=zKօ)|_Z 7oWtkP\'hp"wܨ{)I͚D?8Pi sW~3FSɿCȧN'mi1 o08*nsN}#/

;d葌lJ܄EA?~Zg57/f) ;LkChw*4~cRX⼞#ΠN!*߁엽0@ \4jA8uN1ɸ(gKvvzQ(kƱ7EShff)Lonr~}{GP'̛. Kz?|Ggy9+|&_D,}(ȴr6D%6ceS66qo,(dM,n@=a-sh,2t>4 RR*v'4eB7Sr*}w縨ٓڷI!'^m7玖?[OCkk塮?@f/cvzo`\c斝0}F0e~o?٬>B,?c [{`gnY9m #F\`(fǿ3Hr}ڪ:s?:GvY`N"BYwU¼$3bf|P [NjTT _wG~5@jlF0OfW,P۴1-j4a( @g⤥bƕlwc.ʫ5nJ},rİYDzhGIC6h+"~nGm038&ΫI?##ʤY5ĉ6 b<E&qA1\%?Vn91fC㌀AYaii:dn51ovm] ٺE7e]ֽ{x <}Ra5qc5I=OQ1}%ij <'ڠ1q|~S+5k*nl->}Q\릩~XϕhX|S` ϮF5MU=]jCM0pt'I^A~ tg烙Xj+x,ΪɁ*t7і|5v5|ɮ6vp`eHH `n)z(԰! A>L$Oֲ(S\F%ѣMFBծv1C'ˠLEv9^/~]8ոoCÖMMyN$ႏȐvik =a$1ߑo o@) {m?nBOً(;6#\ov]I{QZ@2&qQ\(KiǶ>F1[]fs0P=zwH ]B8;QxaI6aM8 G0?bͱ`a_*͚FOM8mD׺y @z]B̚x'xY\;H|[:*hﮇޅb2&hL!ׅwgo!;R^1$x;E0Z7)oIyh-FD냴I"^!a kK [wcFy2ܤ5Ob| C DJC!DzpK؎[||e|z ` ~ |<$Hg|@}yL[0Z11BF5ٮ+ 4ȿ}>4o&{֒gEmFNӻ5 tLы*ISkb^⩐JCk~eQ0fG0l8L3:m.vɦO1WI757tUN߀܁[œ|ogO {N]oƄ94]"&$w! q2CcFtzCmc6̣t3PM* ¶4l <I{xQ,zF}LX> fWހ;or^#ɫ^ c :x'cbD:'ʪUazC9~Zrf#YCyg"qZ^A~)&g/yLG<2Q2O##g _>q=0VVCIM΢)p+xjb9MqUq(a77~2 d$t:׈v PBdvi}SvjS|:;{nd!~"/ hnW kF c~Bdrޣ|B]Gwt iȩ~|ŦpJL7s +P#$hxX_TyKϵ$G !ESskXħtһ@>}F)Х.i7d\UbI=>۸oipU'h& K?eFʗ^Q@ZWe9;[O>Orǻ$]Sl KB(xVrJKcA~1c.6˚"Vg?Й 7*A/U b"} ?O:]/k'C@#%vFo9'珴ޒ2N?FsoF[K0v̎ "7j,g"JgCR#RYoɠZd]PC^  Eֳ(6"Fo%B:k?Źs Ejf*_/_}JHEOq<>\ɩkgGCrE@べ2`w;&#l&:}\IitZr1 }ơ8,._5!mm!XPᮢ}筼?͘0Г_ 5 XJ#RiО ӿ$os)AdS:Mbg HVq1"cijOπPQ/)0XD`;XrpJhw ߚ=H & lHNeχa7!tjR!WJa(c-\O52F{E]~COv?`@`mLL,0%9yt;o%&>e̤ Q!MqV9Ozflsq$cLԤ*b} fZ, Jtszh"-uzSN#)zP[t:W;"lnHǁnY9h)qMpyΗow]p$ѭA`XGǗN{uѱbH8 al8N]3KK <̚38 @:K{kHh|LD9}O?L]^ jv Khw1N$TTS*Z&J)Rp] V.#?/d%fG9NBG=ّ+E u"S2`G// x1؛t.O2-&WI0MNYW8 wbqnfU]mt˕ Pc)d5>/vݢ0uze$]A2DcCŘ 9.C˳G @#vZi?H˄t 椽Huf {Lco`PC%!Cq+ 1"a:=5McLL""ֽ: 2A\+WxM*m Xs?ji3tPV`ox$q*)ƈ+P6Vt,'=vh]Yv(m+EBoL56*r@lqAm9^f9>>k ZaŸte-xέ{LwK ¢>U1D{usty=Q o|P ҹΑ+#K ]Y'(#h| KmcF 05RVԝ4y[2AiM+DrQ{AF yV[խ^lrHa p:/Ky2 Ql<` <pz3Y;/|A fc"O-{S h. ̚_yiMdN)iKԈ^ʲr(1պ\ᛁ}ɾ6N'x[q3v9!<'0\)(o*J*iYg?Ȑ{$Zjl??J5:P+c)0K2lG_UiD:k^Pw?0%$(9Pc̓4B}$ 5trYa:͐ ]힤 2gιO\$j=$v-ڦ`ySy` Dƣ옦Sn> U#iN'Ҡߝryj$78ʍ *ߐ0_qie"7H;)6 IKCܶk*^rɐ3!wqՋ1MhKF挗6}aG W¡]^6ILz]|7^J\˕rBI̢} s3LJoOkyăoz*Kj*.'fDFy&1_B0Փ4}SAj{Uz^A'-4 J;9,i  GvgW"o3̥g=[u\o&wv(KU v-g} ۣ0eHϰ?H( )s%ՙ/zʱgɽN$ΐt1-i_u=@[iGy2v7{H.%'LFL wjra/H\׬U_CY/yV[^!Qv(;Xh0UdѾFw\o;Ì3n:Fnm~3 'ݙ'k ؐhɌ;m 𘾛,Nzՙ)#{sLΈ6 ut_"^l u), kR:fE6m'ςhSө|YCS/"_ܓP!ge[DS!SX ,/km2"2õ s*F<r:gpWth"ҜOռ2Br<&@AwtS6=!| J, /=3Jb.&≮L 'nApWFޔ~ha.VjaLϫ!4HFEY<>r.Y #@o ϑtGm߯q'3 ^BKp !^ 8p30 @Rd1?oM4 Lo+<+UE<,qߍ?H}@nZ",k37?r&xC>+v?[3XlH܇3.IH@ʃ=<%w=nܫW2WNVOU0ǝ oV"TSNW| na騗|gFT.yO]O.S1L9 'G(O'@"pK,$`FQt8[x}_c3=e8ng8{, :+3{9`ZF )wB?Vů+s6#, M&W"w2 ݜ' }НΔn!(hN_mq#FO $?$&T9P®MV%=JX 4"]HVZ㖶>-qteHk<bw/ȝg=ٮ&IG;ti"ev(AM #-g|KݎGۉbKȲ2i^Is+T&q>bkWkeM:l2iU\ê˟R.iVp,zm2̬dQ3_:${d2La2_NQA@/۫FWb">)^}P[)N ˒R)"p&ϖ2JJ&^N^IΓYpTb ]x/O y?LlF ɉ!Y-eԹi$Ȕ>ջ-JW]0$-z'm+Vi ^ڐ/ϨTOx!4+J\/!a4]I΀^Mjc xAĖ;f?fhH`NcQ K&x"xYo-lL4bLetY"' _>*8 o`Lj+gr qڿbRyvMLvGj[Z7hFY=9_L^՝]l}m4w9aqZMԀV7Zrl4ǀr;(rp sy cѶ|Ty@F0yqv+_c$H.Wʂ@]FFGd0%EibpM /uyQ<.iٳKBl9%?Rm,4~چB)P hDQ`͸D8oϘ2Z[\^2[&a嶶i˯EtMg[J%1 41.~%ӏ&."5?g͐" X+@b1ڋXKH=]gsPǗīFF/ m']F&fRSdHVhrREɸq |C!O,.80%-1@\|4h'Dj32,1HAvTC(.V}֪rd?S9vm*}Qho$UrkeB~>bR@8T+\%D g19 C":^X=Bg 8@9MHpjx[]D)b;@QH? SKq.Xs3VQP!8.ͣa hBe$,Ezfx;2Rw=^Ȟ@-caBPQxS;uIŖmeT_%G{ cl͔s\U^tnj  /A&H@iYEpS|~*1;SB+9k3g4ꗖR!D|[8df Z Ud/F1r "qkҕ؝&]Mzgp&qexUhYCLG5lYDP`(GzAOXYAs2CO ^`ixI*'   Θ)R[D0Փ V^;3ԊяzgG&lC5,g koخͷ$$;5 `uC1`!ϗCN:qM@]eϩUD'qxkՖ1g[Z.SZ<چvS>vr^~-Iz9G# ?h0].>&M$Der. MGph2ϡnBD<;"tMëu#(}8Qsc\w HkɒoZgLe[$=kgs){ Q#<\9龳(2,;" M3a|=^hHLME QzBa5Kj2zWW!;.!TuA?1\LgML` GpE3!5횶;}قP r_'u4-:_6k =<a nitPN)0c2 y-gtk<*&-jZsy|0Gz_= d04Am?,sG9rbn~|`VW!60BS*":Qj#EޞSN|\Wէ:6v3W.:&n‚Rb`|ԛ׎qŠ/ҭZn ܔt<#^^ v^/  mAw͑ xZE`VhHZRBS F|VrÙ&+koyZ41Bg'⒰tŮ'NRJ|".2aN x\(L4̣:2 vxc7A|do R/Ƣqdj`/dLL@h4\C#B{5#zYݝl/lX T`$=;UQ0i|)FBbMfnb: FS KxԐ{wqJ!k8GYҩV1GϺ7fUCvL2ь.C ` N\=VoyP:>XXe^YP2%.k6$7,Fyg|q4T';@kפCmϲ`⒧EشDQsxRYa4Dj4K6}ߧd l#>.+|aՔ[n0œa6#_DYS(M>͙@zF6;.@+-G c<ױ~8BMЉ3bĸy(GʝMCĦ3u&JLe2"BȊלĕx1nx)r%NC3AE#nzy HӲp @z&oSwbHkB\peXIXiJA&NHDzdL`qixk $ު6.83eܷȆEw=\Ɗ7::"Oy|/,{ r6o'T^qetc} Г Gmkc*p.+Z l5XaMF0tWJk/if?$JCWyyJ\Z5Pjؚr }Yvn-6$9}}D{)B  &ʊd ,tM!"E:}ߔGXV*ds _-LJR<=k4܋d9F ?k\ty⒇RKhNF;ӟ6pMt)l[2񹾟7 ?6ur-)}\VOl.[!`[h)Pd84c=ccP3ijK'qmǽOigh EDIuj Ka&#(dH{TI<\U[rVzdϗۡL~2^. >gG#, yKǂܓsҞWo$z_ntaܝp"! _گoUgb4^>|b"z%'2E8~?A`V'#c#,dR8[ @!aAVN&ʩMO{>Ƌ **>"#q1̶K稼7/[C0D# U  {b{1Y%δu40Y`N | H"w8R*& ON2]w|?7y|ֻW[[.V̢@ x9w5cIB"D{>p̮RO+*HjV⍩pisnwܺHzqNj9L] `!*r!hbX abU70krL7!Lo!qML1svQSaLYӾڶEQ"ș{زP(sjkm X$ pZ\lU q!_OTsAiS?RJ$Y[mKGM$r#YlN#8Y<#goMaa Zڀ "x9~Fj?L!EQH2{Pz*3=@!a#ߙXHst(nE|`u|1P0CڗÚ/SklaCC7qmI04&cʺ`5ˇ :H\i\%t`- Rڹl?jk= P83 L_V~.8ܻ4TAfXK`&u\ ˜ryZtpӁrϏ[l35NmAKR8lf].' R)ܮ! pd ghՂI~C<Kq?vz3v/EtҒj}Z&{Kx7ۦbw9rf%܆ae9*#4wۿ|/>LX 0Lg&}SJaAr@ jh^rN W}:֫gNrZ~2nKy/Ymӆw^uڜzZ4r,#(wHxXPiTI]Bcұ,&Y|y[筝L!f%Y]/iu?^"[tZpdm^lM>˺x%gi:UzT2KX:^Ӿ}<]4>ne X Ql;ҍ IU$Q`Q[1غݰ0 dG^ c[+`9}@ Dl+1~y{v0۪ mЭaQ‰s,313,]ܾ8KRK̄%z8cbwJx&z󆺀h,=iQ`x{/MC6 O ôX{yp?y3O`]4bH!Χ(b̆b. m8 (œboy H卜G8 1GGfq]i#%,kq _ێ..}5 1 OXB#'e=a!>0C }) W@-phT|Yj` G/"'\x~Nė/֤`Q / !`Kx l*ÓJgۂ Ÿ}<)}~ )۞ێ|?齒C:J xMkWɵt]cJLm։6~.')a@,wqݲƻ9*[a5PھuWF?M#;{^HxZ%FdӹfE8a:wp8V9:#[B+% eڜ89aPEkU06ٜg;C=4uʏF`_wx JY:#0u{Hu?#G{z_j(7]Q59:1$7;NQER_=Lc2mQ@/ rs92({.d _dGI~-msVLx(M82L67]scEJ츜fxd,Ʒ#iGa [xz`+J+6a$+fhkE<}En=;cZk9۶L!8TZ{j:Y]cZtoME+)zTL%3prpeUsF6KлWN` X"Icuʆ ?b?p:s`|y4`HeSBA*]oMƂeP6CY#iM=O%O.sWi6} YA{ic !~GQHJ!jZ"`uJn9n7w ZVk9n6\^H)pSbs6yY/#Q;,*Wgn_ OłzCLhFP-; ,xPyZj(g ukF!` " $[^b\OΖ_4~xףZR^l B/K!/UeAX_]'m^F =Q5;y˨?I>bE7>P5)e%]?E| i藏`@TH}_63Sc{cfr$ S.`{n(sA!'sŮYW͒톎aN%x"2m9t\G 0v}X=c4f\YRC!jvwǯP ƀ8bC8EV BcP8,>2$Īm~40cB]LyUأ"M>/61Zhn&%WKwɄon}z9N>1ׯD ڙk \T]1߃M#)~j0ЙL]`nO2dtFu0 ج D{v&O17 S;pc%V DC0,[PSVߊ@Чɗs)XD7i yr$:J9%Oddv3_DdFprw\#G C:ч {%M:,:)V} Hl.WˬK=ESai1}&( Nn rM=Wa<jy<֐"S=DQ4czLpxI?";ؖ<%N&a$,03On)ArʥxcyUlpRfP4D܉xvɝTnXkuBuԟSJhnR3?d,$`%'  s c׭,`+vLI7 )̮\1>0Η<&2i+ĖմjrV_ΘLD`kU_UqOQ勌+ c`I+WTmZ(CϧC|PbSlR\0°*8%G ,(!x-9!?fL^tH/m<&n*CΌflΙ;avbYtCx*lNB 'pwVKDF뙬ߺƫ҆xWm%9A;9T LtFq!颾Zn2~#(--)ºEK;2"6~Nsbj9 [Uÿd)o})@s(vjw3(1y O˿K-٥3gnX[KYuؔZcx1*3W3ЬIKD^ȿ9 8p$R1lSE dEK "Lr.=bBD4?3lm*  Q&4@od/V+el V_rzɁ_t*3L(hnzioS5$W#O.@=B*|vYe c|)S} ȶu'\X́"Q5_ٝWX=Cdva珎#lu>JŌ @ajvqQ WK=ډyXntF~`,a\=JC+%?ײ:'lYMt?ԟWU˜ #{s)<,$唎H1yHÛ!(Mh_f lx)@9D oERuEɮ*HyՎXʬD`b6?7˃כ"|ڀ+ -trk> HwBh\P&- vxq.A:i R/!ݤ^Hp PTW7r`fLW 5lTQN q a\[ڤ;HͳƐVtnIDc8,$m1Go" llf[`!8nJ/7 >gڛ=eDmnD;'F[ ?PoM{jyݣ G>llQ񘘱D;8w*ܨz᾽+Ă]}yǺ*Z+.] ῪMxokSߔ&B}# g+S*+(q+k"PcjS Mj`I5/Lxm ᑉ]h58Dǯ Cyx<%7` ww $Vz}LZQ6WN⮣+VXd #A.yKWPD3G+U|l ^+AITйlEPc³ٔ3|v=gM?s.:;%v+%5i؏oRdZ1t?De깹wjlbL3eHhNk`;_`SÕN$Ez%xL&dWx-ѽ)On(;%*V\I.Ρ[΅(Y-|߫g  vWn?0 "%е5rֻPN:o"}1?9jLju;-󤉟dz:`fsʚhiSw!hϊ)(LES'sN8X䲽K m,ٔ0^++p o$1}oW^j}O>H.'t ?F3Eg(̄Û/# #xw8Ώ*vz}LI%۹Wx`*DUY/[!LhѻoD30Œf`)mCY\"OUQ 4y^X, ۅ'e+\%rP2zmsJᒡQM4>K&4%|X/=s e*Zl\( ~}^tN b{;r2̌3ÁxRi/ @D,8!x٫rdD܌?~Y}`9z0T/pb>ks]M "iE){lKhgpiV9CP^?J&D`ZEM*(~tw\qZ'@ 8`I\#5t}{SG1{9$Z G*ɏ`Z@5u~YpK;QQ əlSX"Rwŵ8dxvMqgS`y0^/˥h|su H_l jDSǶNAiX4ܦx1i5 & x3v[!<\@'x#^x!*i;eljցuyPyTPO fXP_LMnŠTvEQR)EQS=~(.\ 9 7*ܮkS^,`ro q׆&(t21 b4vV[k ݼh ~ʶVKg htzbL9Nd[A&Hmɴ-bFt JJBdMs,zK4cc{@4XqT8jip9!T({%LX3132̖ S=D]KԿQhXݯ;nFs#EqgÁ-0BVAw͸$e&Xxd vh;3~wJu*nfdlJ{J~CT?Try6}9.pv?bG+ 7.!7ahV?L,|Kk @)+ 2eqz|w%x4?8 "' k rS FP8#fd\ <DNWtw E֜qft#(G>IuKή#H^[h,XSM@`G{X7Vƴl]rW1i[u[l~Ȯ̕_ȟyh"\Mz." ޔ|0ۖ`hBr U>?ty"vD2!J]O|:rԾmb!Ѧ$(l/B;PUG n:4ч!9ũN.6d\MIi;˩f`csB䈋ww#BT)!vNha'[00x[ԋnǫnWQT\Ef4D G^K%ރlW÷izSb3kNHw^ExUק֑PNفakPNr\t#ZöZᶶƊZCn2M8b4vu Fve;yYߢ`W0N):p1wFiױծnV:Awu"uU۩R3T*J${ *ANjNи/BB$8!36o \rx0t$Q.l b`pԑ%YTAzgч5cgo[ۏ99wY†1A{-}? <%ﭛoXDoM6^J?9{ԙ{^nz؃'~PѾfA :Py)\oQkUD8Cr8ڌI%'#Xr]Msӯ)L!a]UJsR}:cSt J6|୨,yL^\R*F-o,jJ-ސ:`-5.~jSCɽT pT0z b `x䵋ͱk&<8 9-)j[c: }jRHmCc/O,£^ ՟M,>{-C:D/IB(`X բTbrI!ro2)32@W}f(=x2φԥ^F54ԀoԹM5#rW޷8b,*J|}Ag!y ib* 5lf՘[YVϟR}/@sMOxT9nIJ25ى Y'0VYd gJMX<6+rO #{1 Cs(Y"yu6=bxh*G%`# 4r\gMT9#Y(;u -3! iL;ج58-DIJ{۸j1? qKF9='/KiL}CPyLBR֑m #@def~ 9minVC2Ӱc_Y̼h3?\mSQS%ȏ[׃ Vvi#A9w4TM+boXSY$4EZqpfRO+1!cS'wO*jqUO~ #/Pj{MgS@*m!aNb_'ȓk_Vp|Ǖ&%L`߿6RrHzhVbQtH-*1THN n&뻂|Rj Uk R]z|"w4X=B9Y_] =o4oɚ"p^.#ZA[6B&c5h_QQV f[?g+ѝAD.ݹ:]w}oOC.!8tI6 6[T||r.`*ep۶$>:} pUx-- 8HcSHkD~pJorGI\:A3Umky$Hqx~@;Jx$'H*V %fOgbm%43FU3"Ƈ5[5;:_՗jyOR JCKYhj$cpZ:"gZfjDs"Y2s`RΉ&ӓ_.R膾$gI$@l8d8J1l:(f-{ ~ω!'oN MiK!lyej+{| Kh0KϺ 1Qz~[\}Wr*L@1 5g?l+:X 8hGJthaH[ކNF8W46I*(|ixEHv` y! I(a% ޛa֙M3dB.*c5 cWPNa_D|slC’+f؏Sp"UR3GTPs-C$GU=M=oDݝC S>3t0|vD]J[@K fx:Jɓ[u햼~/Uv}Rw8r|ܧ=wOOq>xOHO2vPgNX20Vufi#ZfyUNhZ}M5kb%IMZm lO {`R'~o<\;oWkv)>$^BIC'Ƅrd5f"+Qf(],ij ;Q0IW ۸fjLRapA߼N6_g#|[T&Hp2FW~%-r FV"F~}G 80Nzy4f¿t-@lӻyN"~ޢ 0DLsw3H{0[Q(pIEPU=$6cO3y(do%ZGz9w&^ٿp5_4JԿ9aՒy™:|>z鴾h; -߿%C+ UkiYrwS8di o_Oس^kgU= ,Hݿ?wXN^i+Q"I!~&D5 Aхv(=+pfB.Kq[lpi @uU=ȣpo*{0q`uFz)|@3r!!Y^c+& oֶEQ~W1`IէD`3܋%÷ڵQnl<8Hڛ^hݎ0$z`S ^TArY=TYV1{T3ќv賴ٝ&١V}:_^oۘۂֈhhXH%BtcatI#ζ5]nIgk]񿒬Ɇ/GX7$[=S>v~xl_2l`oº{/2bOѐGhwzXkyòM՚J$"2qwg8[I&j;p/fኧ8s)& E$quu'&bG/Gf.n*w+!H\'{'L^@P G)Z@&Xerǥ8],gv8u+zZ)z?Xygb8|)_,HP jz]z"Z)*.Ie>v@\F8,f-X՞lR@4{[1΀>kE(}6sX޼9dvPSl,diso ־ ! hu U@qh{;]Zae^ݜh # w梁Ig,k s}aNT0Ep٧tS1#c g;csޥt74 (h9A+M^a@- Ѱގ%(>[䟂yߤ|y̧Ca&XHa\1u[ƾbhsduKC9es *2BW4c#."Es;˹sn4\z>;5Cհ#%Liegh}RE_ tRIδ 0IO#ԫZ٢~?L_bBP!}uQmK$`na^e)o¤qFml￀_ѯIٶFdqo 9߆y}dy/T:~tCf\st&abs{1ib5U## ZȂqV!$C,/8YW7&>z+=W#Y6#a9\ofq!l $nRēbMU%o= c {2 əq ׼do7?{ Ura-N|7?G}b\E%&+Z".Jx\u}pkBTu*mk+d [EjReHdP5a+U(q"'Ĕ[O1Z_13EubMq Q$3R7DB ߨNkӶβIF,_#c"~s Pr ]̆n0iRҠ;•[IP3xS?)[kJLMrs &4Cu\C|[/sr& r+Sv6XaԀ*ZLyܪ(:0B5,2(q=q]2W> e$D,CIhˑ8o_룅Aƥ6C#p%"a瀝6OU\S<{R`]T] ygE\lb׌.`m"d{dKQ Yt`4 Wk&* G>z 0Ttzx[ւo2\ #Ӷ!LLEhpG805(iz;w Hn/WEE+/o_YA8;;TfcgSs8ZGpXMIe1 g& iơ?#4*8eHn[@5d<]ܖ̫ޕѱ*FWTZD:2ە.&s>4pxIPAN Uu_%)Lc0Go B\V&o%rh@?7i`'^{Bx!8vT{@GbMFq]RI' !l_} EDNN7#Ur愜QGxwj f_{q;g~*uC?(K[uɯC"İѬ-Q_C/ɨHdq!Jmn?PCV "Z[nOktz^ ְ, 4f;to`,})g)Ňe>GIzmt*tNJq:jyv̧?bh+3SK|XekL Fl^zl?? ԡ6T!j ES9A|3_OQcNb$Sf1|4N;H[Hx9_f~J&#ݏgߴF$TJ:;F ؑ8eMg+ME۸v[H3 6HNuȀɎ~&㷎P=4v:>lD6Ms.pU(ᓮ 'A tMJ蟸QwQy_op .|Pj-֧y`xphfKR,w—083(z &ًF;ݻzdz@!I'L/٨ i-WWQSN& chfNU`汋z-Sb6з\7cP0n"\ T̡Y1vjqW"߈Fև=ruY%(Aq*6="(G;iw]j)C[NǍ)$EܜA&g6#U}ޭm}PgD\VK FPdX Ո,3I)4)t 5fDz)ԿC`~΅ <{{LK)_G"I9>ӲטD/&L1_Y^ҥ9$܃jn*I[8{!O$azB;g/{N9nJDᾶ&PYF1Kw~n$9Ku JN @gVH%*ÿXо-Rџ_Cwa@~J SںKrJP޿HhE)p]u]\.ƺ) &Z klpGNΡ6Amo㓕QЛb uS. '[@,dTv6'ܢY; )[xpLۧ1+Ʒf,ڑ PĨ wl!}GeBu 2(XoQ 9zĜng@j j.찌?T}Vdw.#Sot+ZTz˫PݦߪR2IP`Ds8ݦT=`=ӊ&+dF0[m1Iskh}_X,IU*of\tVm :V-o9b>&U VQF Z\B@ݔ~V}/t5#C[* ? HAp6X)O}\`o "$DYjh+*fd: cLX|srm%\{+T f0K-_fu LlX~irSWl ipN;ՙLƥ?}Ga8ׂlq`CɦᰵXCȠC=cX(*jPNr^fd}]<)MBɅMEnb~Jq[b(j_|mDzp||,%o̦ Ge[CB0ҎQa 82>P_*zq/wQp]\A ^m%O*y˝u+6'Jm\d@(!ƢGPoB!*j`*GvF(lɗr-[v|F$cG.`ֺLGÓ#Xh\hs 2IjMldQfmrͪiG[A O>Ji>c)aX+85Rq?( RDx+ m}(No>EoR~Sz̒EN-i:Q0 0`UyB&+im0A7dݚeEQfqpŔhgS) -8,M \՞n l+(L!=]3Ɇ8|;(MP1'pWD*vQSBgQkXdvmF~ PW{ù;XIP^ R8F\ <1*Ƞpپ,*ՄG4UT~E 4j8,v¡ӳƻ>)|8AQDȟ p`^҉(ɧ@l_m*ƷwNw: `rs.;^TV'[rc̱$0'&lP| :R_\'\ Zҋqd~qޢ*ov6*dj&K l"ε|dƥ䊐 CS)Ջ~IB.U[7,C#  |{0_qlJ7F#w챼9t6<8.ngjlGM|0[I4P߾gV7W%y:ilxTwC 'ί10'G4rg|LNAq&OGvZZez۠6 >( Mz\Xpn#IIOҳW#Q,u'z 17{p Wr\6^ƒQMD[Wp=k;?㣲x٫h(&+<4ب{Uo`t$K'/DkScp˼68 Vqd 5 uECjF2iq#S:RMxRlVF`iNjvY6XsH Mdzڦnr8Y; N̑qt[Aͺ$9&ͦV};"LBZ;US )up@mhmgv "LHkRv/uՎJ9ntA0S{l:E8YPژyu5W.7%6jUT>\TBi~Ez)׺z=v4A̯MA[1S]&K--G2m`唀gdJ7<ĒWѮT>@9*Ϲ:}]d+%a:J1/X<%)nA˙+ř %cldXNp:ۇnNCFS#xok1^=*Il@90l"2)Ͻ*$^6feao- ɘ8]SpLu`t1: ڪ;w}IObt6AsI9݀5 Q7/ ~Q#M\ *h v bBmqr_OJI:סқ-?B#\cr6!`&0dl>%GiKDՐ[4 cuzi]Z .pv^mJ|¦wЕ$/r911 JimYGr}yaMݛF_rqjқ:p9CJ*Ă 2auiJD&hv-.T+Ή }Sw^ @/qg_>A(WuQf2a%\-;BHL5*݉\Qd ofZ3N?.V*N6Y6%Y 툓@tS%[͍7p>\8i ٤&-լԭ§!*dw]ns0ۗ;tՔRUH :ka7o c_qϓ %IK{I7읤 [W !Bk(˘g4F0E jn5Kl#{K%ڿ^zO(=kV>,&ɐ%h[],I]A:U\VLW 6ěKjMZ"X|?:]9 걉6AB@ځK_6Z'Á\s')iՄLmCyAOP+jBkŷOiZB$ŅG@l5uZB{pdyC1h\yWVq1Ar$LOl8$xg=VAX ֑MZ Vr\oQ )/!dlW/9RM *7ɬӸR2{oVڪ}!G,<`zU)d^8%عFrcq9W{n,ݗ΅rРC<SL~,Zn?."RBaQ(G),={$ME+.Ne9A⵸@ 21Hm/&K i\1]xwZݻ['1;g[ $Ԉ `jgNUtjfu۾]@P3ä"zyx7@]J>i}It㑷ao?Ŀf MS7 %@0)m%XN x'Aj`Ry'B<иgzMF% 1BTi2ٰ}m>G:*⮟iYE8g O;^2bNrGr P㉆㴞*ZHf1ޏ1~U=:iɫftWW*M^E:Y}zpRZu]lodS*~ Hʧ6&K2Y[\-A"ĶOhNێTGHL}O@&"kd |/ ϹTq(2Oi{@7Rpx/wA0uZ/$3ڟL>ӫn;@Vtkc3'ۈo2 bgu|Yԋ[EJF 2dv"5ŤI5ZFi4@7:riZw!*K*=l̉na >J-41U,O%9IG2l==%R|p i{b݁-wΐkczD.ul+yh;F)"Y=tN'2A2Qz SYJ99Ȗ!MM,$SQ5 :r}'27Ak+c"ws?΄JhNwL k9l׹8_J}pFܑ}6E7S={%9jD%N]@%N/y[Uc5:qIyz?$ hm&~j6q qX_ML_9&>HF*50͘7[SCId<\v* DžܔCZE ;ě{tX`5!`UTH $ AYʨ~utR=vS2C)DMr+ۻHKd44a%>6,(bEOВ>|Ůi\M|-@d}!;4sKӠ=mv ZB'SĖ%r*J]6*N3q4,`MFv;{u-b~`Ӥy [ LA֌$d> :"4&9in2Ǥ0MZ1CsÈVNdU< 'MiY>m|d } 12eN'2`p?\>$- bDHq#k õ9++)a^xo)/_o~Dc  ^vw;<'pKI/ǕljՃz ئP 8)hSl뭦{h/jq%>.ŘoOB˟) [ ˹T\zI=LޮlR̊[.lLs5+Cj&Jޗ4ᔧF+7f#aRfmYߒ!oNg"?܄#SA`s49ޛ{:lpp mh$ia4FU0T[B(z4u(o޹U$Mg3b^"dfƮfTP*K A60(?157:@07>߆K"cѰrp/DZCJL#CGY\MrΣVWODcaY: ƯH q2m%ަ.il_4e*XcPZ֍?'IrÜ%ԟhSGn":)зKk-'*Ot ξPS=@t n*һdW]xxMҥBM ٕ.-E#""PuuՠBDgp ֺ@פ?a9e}p4w7vn+_9`p_l |?-,:t+%Bt#ϼ(:opE_ _J٦"yR(oޔ.mbsU%tGzbie+d6+fOPK y NsBhbe}0Iot'b TY!Wl J7FOIJl21E޲YG76o>|\7hЅbO[ }֑4K\lx#!<D!=&?o%(QQ~yTNC unlcb G,ocu -vKQv(C+Y%z0ln,遄g|!=RTjPOq\hǿƆM}}lGr]%F`X!~5l'oCh篊Ϡdsو NNp32:'&*M@~OB6ʂpV/ C ArXr /nYhS!4tAEbdQM F h OvO ;B/o@ r/(RaSHWɪmj8chLz$Ì4Mo8̚>?0w] O M$B3)He\| +0dt߾Z2 *}qε\T&%+ՖDg0քswhNsqqJݖk| :8{''ZNvN,.RD/wr+J!q5 f^aYhdlF~ԼNꨵ} }wKUU lq1^tfW8DRy+7ENS!RO%U:oy,S{*- Cc,"Ca0φחCk6mĦnyđRdWSɍ$i#,3UK.~mLSJ(B;11Φy  iSRS,KID6kk'3'y.w/9Hx,pUܢ^'Qpx4):F_wC+(pe#0/A%wm3ZW}G<S&3NjXא,ߩrX;DJ/WaLvte++gAf: h!`&yD3Žyƪ0 u]ڇ0>W7?JNBM3vĤ['iGW8B7"oT:wt씋ʄMrVv3Xԭt3 2Զ6ؖ[|7~8:KnV||T=zԭؑHAr.L/8A0 PxJɻښQD7kS(^5ze"w,[;.Av_a!cUݮNu MOMX; Xeۧ7z1} X%L.'o'xvsN,9ÍApCY\[d~VtF رmawňD4=+Qx8?2nqXasYׇ) ջr+uRXA ԧ!#zDpv!5 zi8!qaD j<֔R`X $:uQo9~ȋZzAg몝'pJ*^!Tϒ@*(RqˣW!] />SċټflAom+~^iPD@*]9/h#q=%F_H 9[(@5wD"_YMǰ|/ 9 i> iBe 7WT/_dq`HfHgӊ}?#̤0oqITku,D%X4~*mH& 1ך[|] X`ĥYqCL(0j VtYP#3ۘc~ßj/6E|M, ٿxje]Olj8%u%!EvoR)ZFmjxFϬ9WcDʣD&qcj;Gq94),̧%)dp'eca]OqX {z%vGpB\o<.3J ؇iFPegD:bI7μCr @JsL{ʾ! K%w|߇()2b)7vܟ>2sn6©D.tr!伬FP8a.bçBPcgÖ-_C`*GH_؏&B[n,[3-M$0(AVKWPSR:y>0_Qa֮ DlT4@TS2t&KXZ̾Q="w ;g@1t N 0N0)v$ə3AW/ "o4DrWNp_ c8b nlvN,b6 o)zZ0D־k>0\J:9oqza3|pJ)01SG~O ?ʗo 7mg E§?]_.-ǖ(ڋDZuD#vw?b,)@aT|=|aeWrZӬ]vt0c-|7*7ƮH4^h\mTѿm>{ʲ9_MUo 0da 㻱N5dr[pvz O/S!jks:@:~,7q9en:$culBԒw?F{7=vS%A7C ]S:WZTu04J $גc25sYOΐXh`q,!hNib*),f np$I؈t`J>Š^' v.y8ۄ3u6.1>ɄN=nBP VP@JLdՃQ2V9Ʋ 9Zܫsp~TT5-z=~ȾDa_xq'xT. 7e 3b#ȻJ1mwHFj3H>k(BvQ:C~uASI8x1;$㱘J0H8=ؑc^^2`eȊxꍈyʡV{gV_4 $|P`4R!'@ `UWi2 2KӶG/ju CVҒtzAa ;DzOŊ͐W3Ȋ}A1(ٟn \ '(_PmV@`hVާb* J/kgc:vA6ua.$T>CgƈGuKVJxAkHK&IaĕN+nDZVܻ9pgs9Q<}RX߉ؿLah5rt$6MM؎jQVy?Zr*Nk0/}~}Tz+/,.]1[0ܪ r*֧JWSM oG+Bf8-#=;c-7)ft"3i(%CRn+ByAW_xp, Ϛ6A}!; Gy)r1m?M/K,Dp*җC^82)WH@}da[  Z"m+^c9p~Y>8x3P{KDpNxE[cVˠ5RhKQM;F 2ө?{Tef@fmMw3}Î~t6nT`؄[@VkK{/O*g ݽK/qgM1BhSF?}};< 'Yx5@wЁ-]_qaI,W$yʪCG#%19C(IWr;yE#jb ޺_{=>;V;!qweWbp wbx Iw]-_ln 4Yw~]5WĢA7c'Қrd:掕܀?T+} %d;u"r(D4>yPΰ,Wn{.1ȿg.5@2İ'u{Wȅ 4H՜C4JaaL$(qXz8"\V-K⎺xHrvv YK߹oIQC>)6n4B4Ql_޹& [5$ّڅ+fuv{64rCosy\5v RJי\8;2z6TD|2+.2)R!E* ;Zi/:R%~f `IdOd//CJN4dX S, -] s8DJl$h-?Q.Ȭ;Y"ޱ1=z6M^E)6~[<ߏ\g懿j|lL^]>Cˈun徼Wz>)n EJ\ I=SK8zq~HCW^f-zL8f%*#ozm ,^/o[˽p&LڀDG-s.<ܴ~H^6&ZYC$WH~A31OƟ!X:D Ԋ))9~J|]{V=0EUUEdG //Kz `Uet_c' c4jeW lDHG2}k0(5Fw0`t,f#p4[()^̹h BWx;,D(ڱ}0WO)@}tA^VeTk+;$ # F. jLAs߭(Rဝgd? 4(luC%;[2V`(q^P{W Ǿ>余eKm1qdo_ĕZE#38*3Ρ3Fa)$Qܺ']Ch1ē-*_.2G;cLp2hE|hWjU4隸׮Y-z5#K]+[rX$XT Q;$0?9nnbخN{p;c2ߕ0E u!r7jncȞHb[r7 tnmA4!^;?(0rXx:ͭJY&,. 3UHTؤZ. \U(6`#hy Q 7~кߥZ0~2zέCqKwuilה׾eTt _\nuH`/s'zcZӛV/4Q ^+O'- o(=f!GԔk/ S9풳³wٚ3,] X6lT&{$\qfd:g _՝>*ƖCt'Bna\6n*& 2sۡH֖2ƃa4yT̀i;{hmJ@?OvQ#ŠP[ ҥ T 2_ˢ }4 M\qTO6Hl^9waws!d`.G#%W1Kn*nd!zꐶm戹ɡ1veD5%T24l#̗r%YWmdiv$usAfHB(x gtb]9F]*-G3`lK:< OvX*geWhsNxFEAbpT|hJo_\pB'{U61{n5}>e>-hB4%=p6e6*33F=M2ٲ=f5(tMyDƭ(Zu80p5<(X<9uOp1 5DX8s 2zPFA˺C#HRM[r*YU7 KJߡ5άeEx<7`b%zou ն NE\e|ad@՝}tڏlфu@cV]^ nF p8Ŷq'$[TLe {֨6s h '~ҵW€D/srd79W9Ɇ[b&c+fz_)xTXLK4a7Eg AG97\HiͺݜXӓWO*|4|Q kwjNi_N8>Sx+Mr[D^B .-@^jݐqgatvCxGyW_eip [l(D='bl'mωpƘA,pW?aP k[r,8;-.#7]V"H@|7\D"["cH>ۙŠZU+~/m`Ǟ $HVṾ$)^^Շ1vg wc9*Oe J֍F Z?`ӔEL!2;[ C!O&'6s|eQ%ǜM^Z9Pf%\]p/uae1>pUo#0&SU.6-K=!U*G͓U~+y {ۀ oHO0R 2~w#{򌣔0w8IsJ꣪-ꇩ4p\8׾b+7TPق?{%Z17ᗆYr䠝 (CM>TC,7+D:2w%O&ԝNV[&+iRf+_?umiY}8 @j. 憸a4a*jl^#S}ֹk; :vlOVns 0 jYbGIWjfor33)/Z*VV}oh(LYL:%Zw(7C'+5MUPuLxp7>ʦ6-']qǿn?qrT텄Z1`t_|KiuPUNdHg̈asxjHObRTRE LUߐ[fA_Cw%E!zwBP_y/fCaF:<⸣Sln8[S-r؄֧}z*uH) !;L*LHZXMZWGع .,R zT) F ~ -v揎Zs9uড়4!n$t ;ݐ,S{ׅf@ МiPx}A=q, UAo*<\>5mQ>B_JyLL&$O9OGC"/AN*SiS4[+egWF`ڕѦYkUWܡoX r;K%x 9)cߝqK qS+A:bKRnf㌆DQ4CW0۬,EĤTs#kd6[vNs8$Fнz[Xw2`A隚>Q%M[4i=U Hd,Rc8?ߴw_0.(kHYIa˃:>EPQl,&Wr5~7qz@+=%{:?Q#΋&YМs*JȧuzU$Afs,gkE{`ƌ^6|QP<~p_5GQB Y2[b&o\yl%J\3hmd-vZ+E#!ʴH_\VGBw( T+?YS@%pټꯁmqupEneMȬHovf<9D#Y7T~%=X.vZNw %f()#݂] M5oZ* # /w/y\fc(=S L eOO'arq~"f,}ʟ6fƋԡe_>F 0A?5)y-ʉ[}?ʍ4垬҇}ۢY PTPwPCC Ġ%̙#}2k,mMmq!Ǒtc\f89 ^H*Wb2"= Q%<9ՠX gar'G-V!32: >[ n5ߙBIv9S&R8k&Nl;D;X&S4#{{kH'OC.TCL8NVA3u({^ϵ\aI(T f; ڱp x "eNſUc H91$澃LJoV_el@+Tώ TYO?_!^IM<W"Trkf ĒwS@r@Gh'rQFy*r/{tȣDU>tD~ CI]MRY-bC* i>'x+rzX@VV'۷.Վ86tv4SR1FɇvS7u@| y32*U .oϠlwHb$/ ;F .lq)zw3ZTxć$˿ %gF D׆&[V!#U .М~I:@v` MssSC-c;y:Y^9kҤ'{Xvt_}?OHh{a@J1d[򰭉ɼ|xaϐF'jQ9ܛ"vab80O2祲S3IF=x6b>u;y8 D RS'[(k,.af^|=fAUp bfϖ|pk-2G{Yrz"7qfp:!joPŨvLX)0N(}kYAV 7D < ]``JȑQC DzrKc}B*͗J](q$ȥژ ]ucPSzy#kUҢLX8&J#;ґl׶3VCwy9??^];RU FiզGuJkmTQ߅ϩ1Ůy̚p슙$-cܘٻR}J39/&-./3AmpJгĶ9Ofm%GU;W8 zggՀkU0H—lq#aa8;JS 7o6>+U%Ni1CFˤ: b6XmQU2#6Ŝ w%ji,3[ҧFs eZ$ͧå.E;"J9b:Lŏ;^KriLM.Inx'ڴ֭zLEtnPX1K=[,ef״sG5Pv.͍sKy[|24@F\zUM RBxPQ{iӻV8SmbKD0&9)-e~v˰eq{)JYªSʤ餉tPr@`-t6DmA`(۶ھŘ\/YAL^XI))l3-~;'܉d?V=…DZeUNeBpx.t(p5-F`~Ѩa5}\ޮUً3 h 0sbSHY(|+U10vXF ֡=ЅܳJqə]d,z+Q,k;ȼW U<08CaVxιiuƧ> ;\"x@Rg XToGg:|SruFy3'SrP?0 qt ]ELFmh2y1z[BxAhIb+di,, sp0[ &,lC8MÙk|/uc\tg[^/GtT^"! E^o'Q%P<-I״\ V=~؊ n'0Q-RML2Y> Y%Aja$" tGo޵Lfm2d:WJ{?QŔ(\LlFnABM߄D Hv# fۤ&94r$23O\%q6zbd 5He H'9pE_2w 8aWn+=oF޸NθcJH* `cGӌ1ƅqtD0叒oy`h!#jyKk+ET齼 j+E\QUWö՗ fIDYf>W7DIޖza$GP6gȁ `0/ 7Xf8PΦ~d(#?PUǘAkVF)OpۣC(lWi 2Fne_r,*0-:X2RCt`lq<$;Gx' -L~+t7xFjн/P)4nVp4w#K~~fH-+1!5DYΗd LxvfO,GxKN݌t7!Ա9АFgӚ 3 UwMw8{]v9Ix!OD}xe/"yĽb6 K#wFy'L1$8<r йQat|Qi%oxa93&7/ ڵZGWSZpSm2G4 C[ketoưUtz{gu2rCV'ir|P z-A`#v'csy8" _B0ީ, /2Q }N`TSeUm ڛ! 84XKq ^t(\߮)o)pmw薼3s y; dJhl]7$.!jʁtN'o; P9_%ŴͼEё`g$gd}v MrcxH9"I> ~9m~/AȜ)d=m Eh06?C5Ni§ʟek%qHEh5A'>1D`2\~D*;1⢝ta$ɑUWYFw-0b @<@9zHs9]+ASD~'Pr]i%ΉvY% b`$'PP;o!utnd1؊cE.(n>._?AFƄ}4AWU_.6))]ə:-lrN<ͼ=xO՟%ًFR+":IK38Ԝ ~ʠHaEj<%0&+&=5-O.n9lV[Yӳ$3}>jvakZDS)qX-'Pɭ(بA8|Xԏ:=޷5}ojLJ)ůDKu\Bf41 #f-r:[ xӺ[ŧ0}e,,+BmToq;RoBED>J dSO0xRɖ 0%B{5(BViT﵎2SfzG涆CzXdk$0^w婢= y;C QGڠŶQ6 +C֧h0_PzSY"|](2(Ga.i!wPPym,s/P-"+ ܳn-t%3sz9zyrOrU/MO^Pۓk-~ Aj ]Yʽ;F^!FW5yzU{(*fP4h&xuo@]nTh]Q0fzW2to~pCvW;{`ѰX/\~ 9GlE|y3A2;q.+yj#{uo"Bf GE4mԫ:')%yiV͏g~tvUU77Y1E˪\Ha@aV$[Iԍ啩g|1ۨͤ^'as; Mq mI$h'h?4Y? %& ς'g,fS1E1ÆC:Dӽ8=N ]J48;=ȴXI^TI>Os~*C7r-̯ډ^*aŔOvZ*s!aePNVbўG=ֻPl>o!)5g5{^G%m竐lM/ ŧxBcxML4S sګ]@SѰȻR( 2`W@FUݑWѹIzTxV>ƶ`̮!e.KN0C¿rXVxֈ vBsSϐcG\D]D6x݊5!墉/$ ,US@Zhy/@d_`8CT w%91IJ#Ox&5^u _&b;Fj0=m-!JSMA8sxlx*)p">aH$cT7U,7q"kimaX*Ai@Ȑ sGa./K.pez!ck㓜`ɑF2;9S!;.-2֬_,j<P2#=Ak9~ɚu J* ߨ{qc5$A֚h7q$d8["MzQ9F.:B48O+?5GSD@yҙ+{4d~8NhcYDQ2|oǹWr?/*Á7AyCTAF^)`Bhnt*aC> {g6 /oX N2OQLMsYΛ^}`6d^n/+p3..❏`hɘ)vo*`02fQ&`2HPgdKD;Vېh@˺:<^>vqfb+g_ԔM,,oΖ4Vf֨ȼ!44UgJ9]2RWr{"=qIUg$W~. bV0RWӮt ;_x tT E|YFTwAr򧷮X8-'ڭϐu)(=_uw^/xVȾWuk{'Ș31)G?NWӜ:FiS`ɉP [sD7QpnR> H θ2tc&n}YLܬIN@2+<,N喳u3sC΢ _(w^ %:%Lv]3!"rQ0\Jk7\Rǩ%|>w>EiT-Sl}ÝQ0 +uW+A@O~:Z5 ҎXDmqے㳘N(E\쑡 X岠e^>x;G 1)Mv~@u6 }GBt;JlPw4Z*{aCC5ȕrM]Uq mܾB백Ӹ^eq1d nF;aG*X7ڈ;֙wB#pW;rsX+kyBZ`M9FZ8zXx_Х^`K?%\i6Zc$L9ztx1UGPOm16Q&l&JTrvCDhg!|.`m%2O!Pb!a{q%Ã|cAҗIsV}hL>w T cs{:%v {_^%;1*\pHc( W= ]ђKrr5`luYg;RʱFd6}4x>)hߛ/^b mla=Ta5joθpEhOb\l}mm8AyPŇ8649P:0X/éT/oE5J:~D AP12 ݅aCبajhdTɯ,IJ$1'Ws74uG^#_u1.(S^4%kss25eFR" GcY'\.4f ml(wo^OL۝u wF(`kTC~BTUUPMNu#LD画Kf(J @Ay3NgoöJȒ^(GrдF^}[3ZAa]uPd U/q/LVx2l,qOb_ n& }]2֕dXf;A% H$Fٹَ|8נ#HWy@GoY,y)甸qmb5[ \6 XwYtb`uK,:%1'4z+i?9aaGk15G3o rn(is/iW >/LۇdUX]9Ad64 .Wz;;C\ㄒ~kv7lMֿz ZFB_U|y(2h oJ㬳t +b|ܴ?O{:ęF!?V l_ ))Bj(.jےx!^PiAߪM"L){p`7.SߤAS0aMW:e`b `zC5[B[ׇO)v{=^dD?;@*BA U{ʣF}wp\9*+n3p RϞ/6V6_IP yK| G!F9yʹz]0^^ųeWpAdFXy8HH74e&lVe4q2)hX"rECsߙ}Fx=K(mWΣ0ؙ;e!|T#KN>/ !_ޝ\0|=* R^Ee (8ɅfF3sIe>%D]+Z͝8MǽYiDs0+.lKRQhZŵ8O~ӠA; {QM2ڑFe쳪=2*@FPÜT{ܛ@$o2`|kG='~+[CO[r3̽T SzӣD]p~Vt[,ep䣴4?k7(P&s5 bAV`cx)3S(nʸvm!:,M IWZ7'I9&%| wnq)W1@YtO48$S%lJ*}އ]#,Fq,EhF@4  sBlaY{*]S , Wܸ>bQ=15CY/\Jwg4)BZg$H N@C3N5ZO~Q1" b^3;U !Q'$8 @XR\%R 0 0cZfhݟ\q|gum DѤI=njvvf=+3,[{z&o?-dתgqCoغXCކR ƭeg}Tqֽ1 螹bYzD=O-ZwȠ:<kٖ_: XJ3GgWoRcè &܆S-X Ūu1li1]b u{Xޣ ˋ'?Z\#5.s L¼{){]*}&fFZgr%-6p_G`v?Ya^&I;Oc(֎|2hvx:QOfa@5gx9S &fMA̙a-].fҮ"~J9 ,p{lrjD V:4j(VN:Cz`$6V/ AZc"L\wPZ=4Nal}s#Ȩe_XDm5%0H9 dНr:tx]`a`k:"^́YtסXkZ1皇2PS{;)L=CS=%BlCn)SU_c@ GJ0۠ot^RH {jjǷ6,hm4yogРrtrwH$M`Tg1Bm]3$+MKF\1xטb]Q'ͮ}eW͝;=lj2viXތ tH\a:GA?<Urq](@]lcam,]) G͙nJ {BJL?%FK7ۀ L./U=HXe*xuM4zn bmbLi7}WO4$Dyiy@~\>RZ(yê> rpjM,XXH4ׇq-jt0HmP*U±/Qm-Qd>W~}'!=*c-HthYl[Eso6yh '|b.Z-+zTjT* ;xZCe "ANʬQ?# KIkKQc=d0ИRJ?#1p+ V"4 <gacٯ4P&o$&~0 NT\WHmB*$}b6)1",s'Qs=:.'J{o`dk07jSbBci?#Z?n"my]ϡjEq6vӾ5`9,OFdAsi'fr{.,\<5^%*H9u1~ ᏦV1tp0+$Dۤo}.Jö}m/]Sr F}H2@0ruplגr8qCm? n.*9xL5}s'2:d1P8B5q~nK۴Rۑ]!I ˰a忪fZ4,&@&F R5j٪T0LsR?hLgCywtϼ$JCF멝Z1"!z+HDJb%TPɆ o&]5 M5ؕ.]@bH>Z~8lKb6\URLG'7{X/3^68n޹N]sfhƥP 'nS-N,$zs 7l؅QH7UR^! #x$9g׆3cri;c8bXxFW>p:⾤) ?JȒսL*(""M?Y0NצgּAZ9= y V"eRŶ1Η{goy> ;C`剭83OA#c޾sdc19U *D_la ȳvԟ&3 MHAV@ĺ`LFL1Ajv{sG=>ރZqi|iP <ʦnS >XF\wC9PRb i@fJy8Y3 |*^v6.99P;Qz8L&nPofPcI/2Nc>#K+VwuA,nNWoAnu+X` %,l'M*NU*xSWq5U_!|DmgISzeR !s'E{nlB(XLŐ ~ݑEDPIel9DEfsi.6f+TO :=on-k _k 8}%ig}rC8Um B'%)L?q>DUEkÄ.}~c$:thB8&j)<~*D.J?X Z_)飧ނC/cD]ɢЃ_px}7q(&pq˧;`l߰S(]QL;ѻ,JOxdv<摁Ǽ;pcIo`Jsh_{T&TMbHߨ(k/Kk9XasE;i.a2n~h(/=|yvZ<o83ۂ w}kiu8.gbo?5"Jtal{T_bЬ05lx.V+ٯ (Sitk/쓽}M)0}BtEdL %v,HŤj"L޵'kZToddozݨz"6kNWbNlG!R @M/mcP%}P4R^Zl(}Lttm+n]AJ @U?Q㖐*!cs՟4Z@6+T霯9j[xT0 UEDı'U)F (ƽPP? aՠdj5%8%pb!FdvX[gebkoduUHnF Xw 'C@`kQdKnf\ڠL4g[=UzGYp6s)9UͶ\X=L,è 9`131A(ѪU >PWT (zQ#5728$U 1]MX%_w7D.Ԩǽrn-E Eo5Z0C nf%fRyW^8N |Q ?y,$sAwT 6F5޹ͨ؛8Ǔqm(u5ʰ\@ʜ ;.S)f;tyًh]GRLmXګf oz=%9KnKl0h)?bq 7'MWq dg@dm V\쟻%FO\ßp>{UQPɦ0M6v&Ц`땜عDi Gxg{բ["1otb+ hN;l{sفJLwe|?gO\,% 0U[ڡ aC26l%Nhꍮ/U@}0 ?|Te8w&ref&97 <3)ž ˜^J1Jtπ1v0Kּk;{@w gf_ F3 y\t[X-h uvM*{!4(dr2Ө:6<"xXrwG{ ɻܧbV~ZܩPTZ(gۢ} W?2>M}bw7aGU^t|V5#н0*}Q>dR8OF2 = e*:-gٓ !/XN:!98+d$ޘg!Ski}m^qq"8"x-5Z u(z0s9٦8h37/jֶ֞  ൷LtqR@I.Yx ]~J_Rg*h_e^Chk4z)i "3Q^~dmKOSt7 Gf<y]cIqU`Z0bxѪ"=vw콇 cB{͏ [O O[q xz$O҅77;e@6O%fmK6?IrL-H6ML:'Ydu_$ƹj?ԦZ`],i4bS\UӓFf4, `4kH~H=6kL[4HrqZ^ LMrȽ݊$#qym~_ӒVݶjG6+}oMbҶٯ2nW0Q)9yg")ki<t}&o5()ܟ!oiMNP`ngұ!-^~}uH]Ӓb M7м+V!\O0gFbRfGHI FBe?c-?*,eYS2M8.g1hf~c"i%+r-8pf YV)&X$iT3;4)+Fkmvp_ќQ]5iKx+/lP #NPˢ ] 5#|cO^ V:@b A C!>Cr z+4r72`KE:u~L?:ryA^h$+M:M]  ?a)oR7+8do](v9JҺ/c ZppDlUB*~ZoyWÕRi5J+c!0 쭛|3,~_@(D^\vۥQڐf{ZbE8>'g|-b|&^+wu?X!Zak-ra3l0CxpL \ނ{ɦMRVȳ&@K%ãH:mք·!N` 7ّvV2lbV 38fh:+?ڵ >r_D7KXMt}Y$kL]nS\-)::t@57s'MlT6$mY ]ǘ> 0Gޥh/jnxgjVwM9ը9ݠ[թ ꨫȁckTp ՃhPX/Oc: 9cgnySrV6>v:չB{DiX08>JTjLxΈś+n/Gb,AG~)6e#!uB?m#vȌehF_CJP1qpKv)m>| %K*5R1dpq^UU5fWj" 9DxaI/¼Oq&5;]ط_/ߌ$"A*ObO1f~4 `/;bN5EjzV8f?C9 E{ܭG}7#X41/sPzAN{_BF)X0S&4PCuQ:a֡7Ng@}.}sFLUKwxwXp--f+9ߝĨB(̒ Y# έlA`g[+'}f.+YAɂ _ȅZ&Mn=𬽿I{Da@H83N'\"O!ME3CJ gw}0_6SaL$cc]+7Mck-<}lYVHbR.8`bF=h@?I/镮8e:4UP0S7D?3F~ -ğZtXeOH4jjw*1ףXԖ^ذ-6մ :YPW-D[E&mݢÒ\''@mQX!jKFB dpŞtԦO#rE9w 3{άX}&?Y[Rn; ݹA[h|, f z/(ؾ&d@ߕ``NL}@n-H,k^ZD:0.6ΝC–+r#d䋠F>`݄uAoJ>%ς_VYU5D3B&.MJu+vC-Z)hp׈|Bj $=)vo] WW5˶ DcqCI/ V-^9RQUQ_ljBAC \Sʐaݱ|> ICai$n+tMXW4Ube YNWdur=:TGҷ^ھMgAgy6)Ks ż.Y^:Ex,Dr<*HKMTE&xvub$^>(i`đ < QNr~E[8.=os=DFE2Ặ|@~s1-Q'-kn[gr)S+Ș0 9(r&?@ 'n+Cʔ{^x҄_0#ѣ &g"ټ͹?vK^ӻ\ *>"n-co~ [ޤ`R:=k2$^ ˂iNBtڽT(f%wΗXs#>kC]ATIr&8q5 v U$C pSdօ :l@ѥT:M)^[6g{F%1@Q+)3f ޴ #A,SΆ޿ʢ}|4*9c"H$GBS@Tx=Q4ZaTi5:l[*V Emh>YERv[W^T%e3À}8#D@%ރt3\c^*]]?a%X7drc˜,)i5.8 4-ɕ'u/{x@`R7F՘ ثs98s/&xӫ(q&o?8fJI룚D~W>!$9C ͪ7^93\Zt(H7x]'neʇ_.-3LᖡIE{ I]\_&{L|Ӏ( W=T'9DyJniPS@oM>ɔB?)U^4>T5lpg<1,' i/}UedVsq/U?Ef:qQ.WҭdIb厴O95"^I .t-L)unW3M"iY[LXpG Q_Gnk~m@2Tr.t*B+? !F؏ k#>[ aMJ,%(NW0Kn~6`MP_ H4. ̨pr}SƉ9 =b_wqO c,7- ӕS,$)`GD8`kV Q32<;5 N2Wp"?Fcb 1G0%G\qHd7Gսԕ -sZgTy0߿`F/kawJ92 jѾw\;꧋e?zkh#7DPoZ4ӟ覤~~dW,$2m^6O|PC\S77Tp٭[žzDm@Ks^I*fC9Py{깮ϧ02uˁlb<|1}20ˁp*xTmM6^0{uzvb4)(ѯʳ+؂QHL1~R!*-'5#@k+JHV8ԁEyR o-{Ni,nNƀT,B0iA-QO?UM/ZOȍb^{\ԇ̷O/6#D_r}1N.IPAݒЏZ59.ݠi_}~LA팯gMj$e\4Pҙ(W'XI%Q A[G/ sFXF/Dw-"|>5)noڵ~=9Gq="14HMGҋg(CFFyE".%oÂa8NX `܂P ݙַ {"'8wza'ZkU$ވg[R #4Zӊog_ϡ%o-f <= 2~d2y"UdwK UEr{}vMݙ4쏫e/^'C1b-Y3HK_ a;(gϬp8!_LC'Zjh0&:w 7$#umpք~毌gm%n3ZKg,6B|DBm1%(Q{쳌?C$u)$Y8 X=YR hX~Hb7`!\5[ lp6G>HEh.7O-'q~M!% !{o2E\!,z4z?ST8\:듛 ej}1l~6Qi@9NB,錄*1xN85qܹZv]>*‰劇䜯3R*/2Εtb 18G+[ ObWIGW_˥2߯ 3T$jp kBvttN6-BC |ƴfSh5y-v+lJPvuDDh3:3@3vw00ti餠bK A"wU}ChҤ8(3n^ָq/$lr峣[sGW̥3aNWGa MmX5ΐWeyX?'9u$wq =w=kSL(8s&M2*Οe\/ \o@%x7F`Y羧)"%V@31&bڃ'ZDoy["d+tI9dV=="8 FyQ,VsŴwհϰBtn'g OX-2Iô¡=J\Ktfm<$:e!e%~"D`>, }ub@IFUGqOM T*~&JcäwᮒS]TS43P"έ}r%Sg=ԥ4"͊=Ȕ>na^dXNe Q\hV@r|-@f>0fwuxZ^Z?g ~铃jNYQKAH9Uus'RK& qIp(!+%ud3ѻ>#O ^"[cdL%t q<l% asS]K95 ȀMc}빳c,|ͅqFyBk\2mw)/"\&b%_>l 9~A ~YSb Ӓϝa1H>qzh 2.z:Pcr?7qʑ$uMSK7F~!ALTBN Z:m_C@Dp⭉LBi4"\%[0 2]re,禵H m-^DP~!(z5f9P"Ŋkqt9'3|â 0φGw--Cs $b``tvSv;8;Jݫ?IH΁3Qp٘>tW(nze{!Ro߬L8*=ݢj,I8 ^Xq;Kt@lN!w=0HTϔ#^9hk lW^պ֏SE]KVr4+RB2B>G4(W+>;/޾[phewD $3w;HDi댰LӖ8ׄ/f&NJTURx7SK5"k̠%]Bf>a饲#4,fq= ~fELy'"IlU^۠fh{OێÕbOWR <v.Fb{v0Y6,{EF ;>c0 7B#xm*9 A;əfąݑB67lq$j8A)$x`Zbï%>Pr22U;@LIj;톑#1:M+. U a%nnL(od ҧlOkfN QHj 6K:Bo|#|SjB5sa{&Ts ^T_\F49?U7x9zFsTP~j$%!%KyCOEj4Rv^ƝȧrHFh[V{ cᅰŒ _kYԘ]x\T㤰G"QpUiU ˈlaҴiN&No:*%S͝l,I].'XNh:$xyh:_aHvqşp2x3y׺MKxTZvSv\8(´(⏎Jd/\|T.uO{~1yQtOt[+0GI6YM~1ޚĥAU OEy{y/ǧ m^xqc:h8}IA#MT0|DV=x>ԊxhccUXTAREn\KAR27g 'X7nԢNxΓuU=v5 IIP!}޾jcX0y-) wՄbUED"Bs.>69}躲~ Ӳ㑎qބ =[5{yfJ)h ">R?;᫑VXx,\Oyy(-ӹ.T 6'~P %Ϥg [0aCp5ׯCvkۖ_fL@Ȁ-VL#?LTſlK  dʉL}Drl}q S>ב؇<ߩ!i*}w>R.j- s?{, F GחfgHi7zTyDgfB;Kż'3ē0bk]q`4ahCp]h wACdk5^:2MX?NV9^՟gXJS(6PzP̩&:/4X  RοpwwKW#SmVC{*LպPlf3Z@A4-B)yܘ9; ޅm9 W~.u䁂`$S8'yXs>:fnZH8o2UR/DKh٫]:U[DMt?׆x2j3\[Z4 3u)Ngwm?$P#xо tPAB,AS(Aܟ9MҎ<料GжzU|`ܨiySRcGZ`0ImnCJ\iPz_4~VBEV^mupfUQ Bw> g//T\-Ƙ /5ޭemjnV XIN\j)U\Xf߹7Khu'?ِ $:lhMǀ<}Nxr+?xZv$ B͈ 7|s0ӳ:Q\uJ w͕P7x XEU DհM'ۘ]@4t0ƚluNaU2#LzxQ6<=fYJ?PHIo@'$t =r[} Rԕf%qeɄoQ:tٻn7gLmF;q)UW!M*+XwgoVG/U!ĉ5^% Cr)/ϸ:S7aЈj\2`! 0$$ko?ZuVTP xf˟uxI@ilj'PHkng!r?g9K'+~!)p,/7jA؊7hz„(?e,,ͻR|&T-iv)Wr0@7rqf_ia|FCNHy=MІJUR'+|cLTW#3Oh n 'B"I7d"h@ QL^On7T30&z>pNd.㜾,91UPV[6%R?% nDqMj-vqtslve]dl;2>> 2 K~| _%7ގxN6^ lj<67En*dQLf]'U%IͬB{$?3ӿHMo7a'q! 4c(ǣ=/sRrC$g^p[4K6<#~˔n%9xS )'=&Du_CF).,u/Oz^<_`#o&l d\:fzPUJv5v$t5Uʎqӗ\NoP 1@G i_j5SAqsٙ`gܸ5>O8l6H ؆<^4^;p@`Û CcKvy8;\WSc7N MTڍ՛̍_gFtdG;ɰ yT߫1Jr| L籮*Ts5Yl4&rƧ^љ;4gY}ncĒSeݗ N)G9)IJk A6sGIMxnGO3sCq k; wpHo48r Yn:?%n&c1|oq1|9V$H|[E(I>_R%xV# ћCut[ܭ⺩f/1T L8.n4D`V܂2'Ϟ 8c@7ꡩg,LG)|.NM .t@3RNdj`ƁMn`o P5a¦j#Lf݀ʯY]E"Z sL {uRmx8S n>BsEӘ6͠{F'K!]g4A##Bd+bȽ_FbWm>wk$VWy},0SHV+PWQOmBA4(bSFRAr.e_~X/^N3ÎHpF0e#KʃBT":B}yup x>*ŒHF "lOwr4CxSM3_=xQTXU ڟ;](gX=$r9Ϝ\&v9ߩBVU-ASc؛Ǵo 7Col6 r0l Ii pZy *Pv*>d&Tb4 aލJh1Ǒ>lz,rrf7i[{ ½frDP6W89 m{j@G@0RFqȲFM•˗ ޳ޫj{F5e솴kcE70Q=F9cސGiۅ33ݯYDvѾ.8z#$?~3J_@ƟqcdD.JJG!6=ϑfƀً@; [5{QZGP~pŚn 6ohu;x9of fuEKcDaSc܁kپG?-j822[)k8~@6. 3o(6/t}᳻!d̀\AʏCwE-8 ^_.<\z/>wJ宵jWlufvpV7>l}WgjX䴘Ψ'J姖 n4s~jmhlsKyeIqj/čO8uظ:P-rlv3Q\ \u'?֛:\( 3oi;[8*!Wvh}^[nYc7:]0+OT}i52RcuYxRVA; q 6 ر@2;Cw{[ ɥHBa Gt"aīzx` =#طh;[c6a2F @g-6 b'oV8Z*BTOֲԟ?CbB\#*D>vF(Q-]޴闅ƽ_Wv*)~s92r'Cs W Kb[^ M S;FLXx#$ַ!LZ4GkהY$4k ?JhuB"-~؜T3(XL@>unh.wa{z'ש-G:*fn,XXV*Ǚ\Gr.3r'SX#*lhXVqܪbwD.WP[®a)ǂObb;&4N#u#_KF>-Q:fUJDC͗ .kLyƘsE J IYi,]` lM %7_16["#1WIB:V1lJDۡ!fAl(Tn{߭YUt!Vۯ:+޼$}0uȣf=hs!+o#sp7#R {_֔!v8^(rړ2O4DRBA,f`Z֡J% WN޶PNiʿY<=--~m$ ,!97)dBSpSVũ"#%}U.N㚸u ew1-ZՀq‹G3eA=k&׹չ(M|Ev8(r%zP)!rН٪<±3` .|:\aW2K96+8l4<jbnWNpK6"%z]^ͨq`dsMeF&UؼAҫ(oljy>/ 8`!^e s3bN_,~ϳApYb%pON :>i Yl Hr2z^JOX|l:Ӭݞ TB[K6T?̂(_I;Ug=0N;9ι[QcE lfQdir؞t7ʜLAZ6ʼn6j #iɿ&V3N#LVaO,1ND42߈drJCBH9S)^h%3T&ñ¡9Q&r+̗=Va:1t#mV{gq]j;6ϲ6,o(gųp>jq KNg2݄dB Vt_ L": FU8b) enYLQ9+{v?39tZ,,]pN2V99U"n˕9;T-j.*N})(o?#9wpΨ w8ۄ%w}v3DTӿ{:>@rֵ;ђE7VV[ X W|ɮ *R]#J8MWrxvgJޜⶤ˧_e lC꧎Op 8/," df4Q=<,;{gߥ M,Ժ%p]Bw-ʐe3ATC/9af{ѡs8`@QįQlLuq|,(8kĽ\q.Lۊ$3pqnGغlknUMfa2hRZ6[W7hL'XzzvJGy|\B6;ԟFpUg&| xw%OYI4|'js1/?Tv`@]+{ /qٌ,Le1{ 0x]|'&v  'OM]:tE|l}p iy9t'**/+plf)t/r>,Nˌ8i57xr(f́:zY#Q⠌0ݞrr4;xJ*E.珎*Kag(#E *мhV1.ƅ_3sNqq`6WՍ^6h:ZM @XoMBŋH\#'͏,+Z,hha$b6ՋǦIS+ >={AT@!HrMh̎u$^nIrW$g}S a6ԃwRCߺ]ݟZNe OizŧUW8 ;A|doA7nkƪq)@D*;(G3 +R"$\\&ei uÄ8@Y*mPz]YzuW`n1`ܵr ax$%wV?Um_8b8 _:9&x4 uWiG /P{FM@)}. SA Dh 0U([h1wb_qD@,%az٫&-j~4Pp`3\?p Eem7.Yw€:D``Al%49x?K>R$Σ 8%#_UX , kjrXnAZ'ljw! W&.1J>["r *Hf==.5ylfQՔ`yb/-zw7CwolCҋMp) j LKA\J`Q/I6=NPOsdWhKSw^ 9.pcyjA`aNwvu43'p k>rt {HQ_3KnFMJkA?pF0.gfdQ9. #ЇC =9O.‘-C:Ht/qRkݴRM% *" |vǦ`kta!8xm ̂|"`}2oLC<ѣy3lC?T-nՃ#፫tf@3K.)nӟ ˆx(70E +)'n{ï:*8dy^/C)9M0`AOEh TmiQO]::Ԡ:2ffU]KT: mYOjK2 o',Ult|>Gug'Bcd#j;V]5ӮL xoZmr==G%Y[--,H{NZ~"e@k'sŷheO ,qj#C9@*c!m䩡2drJ5&CA]vt͹͑9Ae;_V=[Y#1.3%oh!++ pkC-2ݗQ2|J1 Tx'LTԠ F8DLG8 l^#28 Ţc x, X2lȌqZ~&~4u.β OSp.cܧ?=t6w/dtXLji;8|,#17t dD}=F׹ՠWlX7"i+{_m4A>/afiIfYE$#cެeZh(Q6͙ -6wB.O&7,?Չ0.1# HKFG<1}f9-p=O+A#[V9> SLN#n%M{i./=xtA׈A 2Lr p"#h\"$1XE5eFxhO amLȄQx;v̥lW1{a!Їf`eL*ro_ë <ibחvB'kn3D"Rf>$|Xj6O 5GYqJ;* D7H򷭀ASLK.ΨOp1X*1#efwiGȻ[c;t\.jf:_7=ٚA:Mj;_sdQ/ཷP%M<8B!]2qPa?]BR`8CwVưa=Ja%KK L7j D8rN۝Z6Tb\zIǰט8Z h-HqǞ+-ټ.rciq9r )bj$&lig?[|!tB+7kگe#'_ne GMIj2Qc?u3MQuqT!@T;{"$ g9;%?E[纅pH8SmR]?sep=e'bIF:qyLmy 0ltP$~阈L%AgK?DDB $yIu5,#pe#QF%ޅq(I!kZ֎PR,I+0*icOY`fuHeőMXq2ّń[}]qS+U/XԱ7.e# GhҼ J̒E|g=&I'5XxD13陗h=~6 cp=x%5"H&GSD Y_ Cs];d?yg:؟6Ɂucz4_ <"+ {u7C'^lk8܋DWOɓʽUWi?"(m}ϋTr}ZτR'k%LO9e Xm^L#6CC9:dסre]N>g SQi(vќ>hA'N@EiQͽy8 T$6=\4;1˂HvUx!˲/5٤^,(1 4j-~JgA.~(EяIͬ/eq`#}bd>Htf o 6uR^.2rP6&^CS̿aGv9c )g&Q`6}_BBZWa\~>ǀ!q$)s_4YyɄ`T̓:n@9B!ZbQ `tOioX:|cI&p,ֺ7rn䲄U'>3$X!,n ͢>ΘT;0ySeOH >a7̯]-;(Gj G77ſsZzDo qVBf: ƐS)6UGv :J % OvҾd(&W |;j#F rުr}X2dz,PviyBenP&9 Z1@t׎.C8B53Ip?bЀXB`ju\}_<%sTm&''M@, (W4plbNf& HNW1D:*%St!DZDOywn_6jjصt|1f@SJ w]R H䈔w%^b`wхCnU3CW)("9u1y*,#dsUT}o*q4xӝ];ĂMD=؞{0!O >FDp\-Pm<oa%F1[Lz06@`>fڲyC$ThJt4r'R 立"uW\KD ȕ9&(f∢Xo"Ύ@yTLEzQ篘(>=݊8xݥ %/GHЬ+"P^OKtmȈHg"2Tq˅NDzzxo=jkkP= bp84{ϰS;a^վI\~TBc&h'X^QvW&_==tcxk k *I*61HAA|X\Gnfdꔔ,ym4cEoWF]#'ns0K#"q-HXW|/7_Zd'~zkpc_F9lj16)aa eQN 4l8qfO7Ka4O_cMP%b)tצ [LpCWegd1 |l]Dk$^ Ti7&q$ZD*G5k,Fn,4M.} #pAO6w$lBI؍Ub u,t|1Nï(Ksf :kTMdD^PYtI5J!2}׏H ⿌* xx I!OԪoc)HVCZ84O۹Q%9֛g8#?GD>meJST(*z֨6aoMu}цoeZ>UĖ᷒~݌1b'hI6q!?. ,LzA#SY*kjdFg K\\jY,: W.cy!16Hʝ4G=aA# =ȫ#0Uv,VFpzx縺Aĸۑ-o6x vϷ/(^9#s67oK$/L+vp+XLR*YG[iٗEedTwx?nn! 4>p1W ?s .i,PLM}p&roO۷εm`ILo̸F?|g+ dA_)S&i CDeoE58*$ o _Al6Ǒ\*&btD Dv z-=)b:L>V{|wzǜca!?Wx?30E-G$alMB݌2Uo* TYrE;@n4( F-PDKRb9[ãҒKB#jut)яx@nֿfs$_PHJ<Rcvy;QK9wx|]D/(-~OUw.GA03iEV?ٕo8Z3ޮ TH@$q]ojbsqtn`ohY@T'8WEհ4U2X>DABGQMgun8՜l[aNѤ&7OKaC~EUF T=wqjWd:?'+d6S;-HyZtԧ~P6&a%:rbH_/1(a> ۣ({xɊI3a-ULKHUґ1L+!+ DPVwX\/YmNz*?:\*I]$N2z#1LOI9~"w #Wk!syZ U>,ז6r(_dJ+T\7|a]u]JQE%^Ǥy: ߹;Uݍ! mWd(GDz~ќ0#1!25ga[Y+cn_'=m5xXi 3T5Jz.}YԻg70=ۗDlhFZj ZL&v2`C/#M]ܛusTM47pf@5C\lGOO8.v汮Їuӥ[ֵc "Y]rGŭtִB' 5nPX"Is(IKX=f1o)G*qD;پ>F-QTC{{4HY2gO%ށ2Sf<Ș!al1UOd'\=?3ie][Ljt2 "8316Po"!JD.5ZIEUTjRmq8lFwm; э*Dج g8mYxګ lld81Q-84*(>ːLߜmpsr;fss[es_3U&/j}۳$(*/POfdꮊ<]'_ʻDW?0mͭ8Z;,S:y: {<\H/x ~||κ]C)Ő,如izx;SoB GhJ͠"X+fveSRנyj'Zi-d&q~`?>٭#,LVNhj>v9NdTf4n:KdjKW._3lSoU.OzJ K?@VCjz aG'sE zyp{R$\ S |E:5aԕst!tLra7}.(fh3''3~xLq{}ѭK9?{\;3uݼ-}*%̄*&ۘ&PbJW[誹̤ ިVoukleL~U_k.[13~+9Ŏ{!REM}`x_\d 8'o-av渒Tz_q*(I퍪 LS 2s/l:)huh$'h R)&Y,AZKTLkH'یA3C+(vSAUaʉ1,}g,bns"GsDBjm *gNU> n"*, /K"'>#T _"t|:aX͹Da;Tp̗YIb F&+2Hi[EtrEH3u' -2\*R[8 WCH{Bn m'qSϱ: {%^aIťYnV4O  !swlsaߛQ^/JP ,VsY!H6^˶aȅ W /sB^t=%KFs>D"W1xXe'(=q|}>2'Wl-s ЇUR2TkԷ)|N$QS ξ,k#js΢Yu9z%=  M؉5W=Pf!7o5:p\el%BYO~w%n)li:PPPyIpq4e j麠* |V.ipth |[w8 >6(F;S ,'庘=+;PmaFW$d0GZ1p.!K_| Knsq껣Z7$i,%nLݔ*r_'_% oFJ4(r$̽YRn'e!MiAsScYA`' rH|8Z9酰hzR:ϕ!_wXgqlCe[ou"@,?>iqsY0<# suvei&gړ:=ߐr,#Nx(=]~rVK[Rl^ȥ{_ 1‰87rTZ/# ȻH{$.6YNj-7K(2Z&2+L:I F+<+8gw1NDՖ@sFP8/XNxbeg|0_\O\fծd<Q9D{Ьo'#J:ɕV [5s>=BuOa9;!,2f- |/YygX 9%zݓ4I֘.1snݰP-O럔#/S!;;bܡ7֬ѬZ)}`SeK5Vu_"b!+y'Hj o)rgZ9 8DXS E yדLmG= wG$Pه8?cy H/?7}})9B}+O'O6# Ym,Q?ƛBq WCau?)n*VJN;!sg46G"w/e𹮜!i)J>)%X, ῶSƹ;aiӔ]"C̊"o&iɁ9 4{X?IndBauS<mdX]!3>5vL'&#Qʥ Ef3V Q kBvi.\DRzmeZະ5?Jqf6F.@9(:>Nk]{á\̿ vP<Je>yR7ىNE/EP߭^f~`*lY>h[^7(H9}n-="Q-AMB߂M;qd 䵈;398j 5_GhL󨷑S`C7UR:flvuS;Ԟ~[w,LJe cI^W@tjʑ' `ɠ[Ȓ;ٿ;1|qS9h 4 ?a{j/BqHʡPDO?MSVf"iىV8T Q]>(,ZENSϝ)bQk݃{sfsC!#3 ,p0&x(eTD lx.ΌPVpDEpU,j=M &9]`rX Ve3v#E%Ҋ#Lju`;HL-֘.łx&bܕ%HԐG)wkߩWNA>UU~v؟T/{Z ٹa+碊M]ҭ92k<};*  mWOyD%Al4l.c];>Dp캥cCZ y @;H}L..=C<_<;TQd欰eu÷`|0hW踠N[ X:(ֶlB_Q^엍IXJ,FUCĿz-,W3h lg CC !aޘ8-Z*I"g0>U7kRaZe~> Hº2,+dW< q\$S1abT9X 2p2MFa7QXjdLʰW= B׍PT"58SW h800A#w3'7[Aݶ3϶.K(ξP|?BFHa,q߁z/kDH8Wwdщ1BrPqf Vi﫝:tiHJ*Ug[@1>fƥ hz)ua3x۽.I2Mit&901٭%\r.o$ؠ?=xP<6R?.4di>8b~PG|ǬAC ҷ8>+6s3TM"fHИc5+~`7(:DG/ޖG :6H,r6JPjr2uSo(W,F4u(TqvRPmMX2;z.!>eJPaH}7?4\#;¦IllUY淯KC{iaѽ?t5=Zj&+f; 2EQ|^lمcݮG, .8*_g?>YZvz_g\ I/ƕpSö.j-B9]֕AsdKxU\M1c#mSLо#rOjx\J# Y&',;L[w> %myWi*P^Dtv~Lcjo}H^GeX|Pۆq Ue,`WO=ba/F (~ȣ|GYPH]8%K g(iwjꓻUfms ~\S4%ЁNZ-1Ǽj1qSk% ].-^V?qu^?g#& 6uvyDn3RUb/lpjs<'7n;+m|ԡ'W3A{OgYf2LXbM Q$ϕ锆< n4@zotG51Uqx6P]g&bWgKz?5Z@CF4f\Htۏc'kɫoq~Y:y)JW[oHHY6jUPF\:L@>^'8cz d1z_MkDLq%?ŁÑKeA\]:%9+j9Yj1],'bƈxMuT((B#g`_7aEōnŀev ɲ%d hf&i2pU]1jB<&P>`JG@ڛ~6R,ωVyiLxZ6rM@H v?xcQKEQO%zM,RL|׿ Syc*Kj%P!T"A+qzaylc#Mk#j ;1_hVy&PЈ Z\Z%σ[ .LOU?+tbCnfG;1xtx:NtfAk&ŧ>\EU](V1#4%flj}<#`;_]_xoezwl40;1*b6Sܡy vݠ懋K7zMۿ3ۗZ0/kNA'@@d|gu)PCʈTy֔?(CB3quz\k9P(\΁!W\JW!ŏ{0Bs~EGg_gĉd|xeV֛/xXŹ"Gjܜ]0˓jiP\vV H@V5k"&"NHO-ט^ї|?q&y Y[AF֤UKh};|b%=I&^{;?](uBCb'8\;E$=3e6f@\jw*4Ndg$ GM%Ē֜|s6yOsb tcz\3 rU@P3ML!,Akג3irsdi{Ub+neHch}c5[yO+d$u: _ :X:R;EըsGhp3KlsV20?ptp"򫴡蹪F7VYΒ_;>n7D-l0󶍮yrLL32nr Gq>r߾a{byGD~ $%H/&JG,"3g~0.S-3苶9óQȱަfz|a㶞C-"G!Bn(/gJcX6ČɋA1Tҕ6}o>=,UẪj@xcc-쐿 z;tEp9\ܑcBm Ld;{ "kaҔYbm!vetu[¤'%Ue#+ VG{Eupn=jzQc;춰H>AӏrAp~ySkm ?~'#of&R M/v}u7^U6o/"rwcy] ]wh"/),572ҏd_z&Ҩ90Ǣ;D {Z>Ut9 b_:钩vûwM:/m& SPnHB0o#oVYU‚#Gr<*Ty^jCJ.: iE~aiJzF6YJ܅[ 222a}6ɝphtk`6H ZA' -'2Z,8x G+mi{(hGoY1xOl_4Vg&l>Tz>᪥;L'M:"PrDC.Q2LiJL} U=;lȲMEeS7)ҥ!kU/~|}F'>6r:鬎a["wd6Zz-:~,8`<\I\}w6w ytq+OcoY=M~T` {M|;YbNx9uf*s!8THdd`7Wp h9BO bCm+en-hb/1]w^/! S՛EMY*e*Cك=Hݱ3!C7|wRrB$]G-R4afkl <䴐f/qi!֊R#Ȭo#s󆹋O{s}rZ?2r3HQJI,hPy¤!KZpj,:mR5`J|$c3 ͎_|)1dL  \>zb@y*;,lϩq3v;VH9&I"jlf~-sw͇9LYT«zq:mq .2nL?>-h]AJ198 Ռ2 Q9ٹop$A8}9<-2=~v: &eW p4Oh&0 *C /i#z3iT.qa'z1*XzNt1 J8$WVa(6MF )Xvtz И(!Q%A͈n>hB߭|j~ w .1Œ/mwű2mSx b5{ ~rYHמšFRĎŨ$C.LsuPuXxU?@/=lŕA}aK"cy ş%߲#' S$n0tT(`x+*m5Ǽ-q5cͶ1㧑DBHɃtr n.ѡ.WjɎܢS14?A2馎ڎ*F$2~]6N'9,u#%؉:jj꺄X%y{|Z#pe^y9€uE2E#RpPUr)>6VYcu^GˤEM9a9%[ ?Nt)C&[B{-[41o:\@Y(s1Cak)ػN_*kʯT!Gpו#L9#lw򀵨@ |4p`m(wۢr(族aLq~-T'uc:&'ߑ.-l`L& J ݀xSESM+:}K>A&e[bG9y߫SZd?!ШpˎE=G´HDGuÁt}(| [|;,cY1R8C^)\qPwl8xbzHC*6L'JUٶ`GYT'0^`.`;yScd\=f$wWjMꟸd߾O  3 4,-V_' ■vB ,9r |vIRP7&w07 'E%=lG̈́=?q.4mKg}hT2 ] Ʌ?qP rM߲T)paݠYiz,ɕteϱ^jpe!oNn\9ߩ e(GX ?XE۹*Z/(jlq3aW-GDe3 |+`fisl2tB&uy# 0ecĩtSpy7{=g,V4#zAƃ)ȣi#O1:gw2>nNZ);iv!|ڱ`?k?xi9r6KI~C8mNWOf۩`"rQ17!<0^`6o0!,$D!B?* [bvk]r_p=`)L.ُPe-ЊV !V>Cc;wUtt4 1ZտbL@[ב:4Ѣ[F9yjڿE30@̆*I!m$Φ3`:i6sV3M+CH[Ó !oL&Y8w,ÉOOiF2B6( rs} (!鎖*g,/yNz' ߅8i3Sh)o?nTD;N#p >P"}4 .Ay&5Pџ0bXM:?*VQ^U[*6A:Z,P9~17X ȒV~eQIO7I@!+_.׵ewer`Aȍ}02AoU_.~LUX~!qe#YI5p6,~KP^ig(kwr̭VtB>!趪 3Hk5+,e^Ƹ8Յu2L9A&.cW_,V>AR#Ayn)i=O7=24^-ac^0b0?~dCaEd(w0z;_N^.+o̪O1cLm ɲ-"4Ef#p*lz[5:NQQre~f 22aII-Wy'9EM>>bɇElǩfSJ1hTӎ}P-zP)lʶ \Nz*snjSv3hW¬6l")7<`}:@c&BC`~0|C,0t)~~69xTALzvMiz,8v?W\aUE?Z=LR8@^bnIegٌZ.iV ]x1"2_ L "Zo:iyo>8? z|+myw^gw9#ΫWC`#u-i7(ݵ\Rk 9(/R4u ħuY$}KL9êXE =}]M A\{dnLrP8LLޢuz C*OFx<"= b-. 1i3Dfd[}[ap:o/]p(9^e;Tq +1pPx}v8JP PiB{'گ +njAC~+:ܚ$HM [O¼U`B72 n=u, !K>˾*Yk!N)D𸢣Qak Rtt5v}ms}F*j$)K  W8cL ?$ gԌ_QPcmse;[6K)? yCBw5&P>CnL64UB0QK/uX޳%69-˥?ˎb 5a9-pWD UwL`RZ|,\P *K YG4Щfyߌ뷞zwl]AT~2pbS]Q@2K㭩30Q!%'E[bK-՞HZVaB>d6~zxGq 4cB$K0ZScKB >D28 sz}Q}EUe<ۄb)2&niۄY(Élc: PlEh9P?$m]8gE/"I*Q_El~S,V}1lo@< u&hՋm^ܵx9jQLP 4'vZˍ6'Ux6) 8G^~k5S x #bdDI}/V}.jBu\Fދ*>Ü` WWk01'd+c;PG6x$@W׵akk:Mj6X%ߩjjR)~m lJQ%8A](ס)R-_  b卷9=B+N$S8 lq+2ZAs#H%3,G}yɑmY6J +MdbcJ|4V32F-TO8`j9 3? % Vn@fsKJƵSj侦:߂.HZW$Gj Gqdmn/%n$ϩ}8U؊61M nvb= i$Smnۢ0fs! [3K׬[wL|8ēr'Nxw0 \+eSz<]$jp(&g}fqaʀ48݄#BҬ}}6~Ư ;;aT _V@c~l??v=W<(Ua uE7~A ih(?IȦfrJL)>|zҋ'±(𭜒AG R$=c.Zqg0 Ƣiq['\$| Q^歎3k%_u?K#˻'zHWYP5th_jNՁ 6gI׭.Κth$ezue OΑU'MD2?K,Pf4&U|w: 8GĄ@;'<>WRi] AClB.W_z " υ7_WA ör(=w ͢?KLbhsO!$鮯ң3 wGo H gQ>C!(z*R%?Y"BYx91$vRM&{ctXc.tBN<ÿHKs۾f[9⺲Q+kF_])|N@o\!AnC|>,Oѓ_j3Lz\HcH҄yk^!pNa@<0o9&y6+xN+v;<W}I Ry"lvEi' w'߹hMѫsu^LPO:fXTQ<EP1Y gV t'lI&sp911 }}ԫ0S^ojP5>>s$" GMoVDKt~ :Г^_uwr*.VhJ c+ID(A[2*7˰~(*s`,LY"y[\Yqiuqςd=ZTPQݙ[X_#_ӍpMzt_:w(|!OoXSmmΡ.V:yg?A*`,$7+A*$;m2O _'9?Iďq٠74lzبGX1XEgdFtST(Lɢ9I! 3>S+S~'/ 5hb9&g9ᤸ~|皌}8kvK.OU4ؙCuЇ=лv_aT}]f?fR/-tL4/]K@h1Ur2rYh 9?_45ѻdž SeF-O●Yo 'WHcL4 MtskݙqPZI=@10ݰ-,Ŭ2kW8?ʥK+l pxyv)O%yW%FdU _K䷞(ܣ{T v QhP}BsTZ%Me՘$cȣ=o Vx'Mb/ԎassОA4IT54; E X]aYA*?sIt K߿8V%;Չw2k~$7<0-AQDPHdT`=E6//͗ {NE\U3ajC$&:ޯ߷ wMp7Z0h@t0vpvi`~&Nݔ #4zȭZʔԫl|Xh{hbo zжzz/2+Z ^  +^3;7!4&qvCZ~c7T,?hwiza**3#5:Xv՛y<9G9(\k0?LnNfKLiCzFj!YrB/+>VڦIc&ziЈX0tj hqN'=:*uߚQv±8]pDQ*C1PR~:_Om!wXղw^:@gZhJx*ZAY=wR |*0lX|Z`mCvN4 +nϪӛiG?6E̴I@ ܌.D)/cu[ѧ8h"_ 7Ia,r?Nkd^W:`' >+<,)a!(X;WvEP-õŰ%^QT˒1)*=wkPLqdi;u<|{ ڮ_Xzir#d.F;:!@1`L%eJim;4ʎp@G%ZjbRgll(abDgpߞ&2bg V RƺL/Ob )<7?PQS1$>6\+{b`xxƌ ofZ1  `a) z۞Э rTάN%ޅ*HY2jFPc~^AZ)̶L45 8 %ӹ CUT:&o#N"D€"'lk]vL7`rsW + k(O3rr[. d˻24pב/xB ,Gk8AB8Q!5O& CIgAD;L"$.SK ď0̭V⺻b7"ug ,VGźP$HMg,XYz61X&CԢ2f'IIpڞûqSzY1\ޅ W8+*#XV95~RDuf]7*PNݠ1{PHTA#`>Noу#nTi\&lvlbkȶi>-rt!]Mð9GMuNc0jIC pѲq >lі~d'2k&+ {ś@8 xO)rRs+Q ϰS͹܇p}q.W=Wa6NVYsq}ⳎDXli C'e\ktXr,[L6{s 5W7` ('F.!T,֋Z]7[D4- xPhRT_I7; [ mYxܦ)6}EK CB6!m:O.ŀ eMYFE'>yTBv#$8_0N#zvr?ULj=`k|! Pbo"A`iTvD&-=.!r阅cpc;K|SߍXZCv;5T8u{8WiC_b4«!6vpE"e P.( pYj&{[FBEހPa$vg]끖.ݼ~ еe"M"<ʛz 46^IZP45i,>;l:Xc2 ˙Û̀KU'cC-'CEvAo)M]ٸ} tX߂v|7&'Nт[eIB⦪U=A(`MvCi9Kienķ9C.8|.nbћ[-]Pjn{藦m6b4HwC+3Z1! {$#V6"u㟢W o ~ͪ+f,$ѣ$ػ&Pmg㰟?,~q ڎ.eUYL";S(WP {NU&MT]jUSL!I ¥eSeA/ag+([ML? L%x!t*#hCfHX?e5|/\mB,~JCɻFIjt^(JX!UV IEo<*R巎Oa򜼾ihds꽝uo}LBH} uOD(gLkXe~;nϩz,4ƞ gvmʶ+㒖2©}z[kz;0 }1'~Kv>! EL~B7{[4g|%r܂β`ѻzMkZLON?L'חRT)4q|sca!Q19*MDQ<4<8?~us"9ĮX.Jmx 'nqmn;¡\o~+5bzU3{hW:' ]]\5Wۋt=]mm>={1AFnЄxuqB~ʹ]^Cs3\bu0J]#γD}^7ly1$y>T]`VrvZuӘ5x|C"|M iBW,;Yǩ;9ЕNhe\HʼnX]Ma#:]+ܨ7eax'1U @NyO}n b]y>+!Mn(i9M˲(`Z9Oz="Z Qh|vN+z!&b z]m Sfc@g}rJ}VL)v 3Gfۅ8TOΓS8TW=/:Sj*;Xչ;ŶR ,zC,diyhdW{Ճ2KT@<&Wmih2kl_Ln3u)5pw)B}|=Mp7|}0&:'<&?8ntԟٺs_-:cH`.-W~Qf 4/Ϻo؎5MUԜL/]ŞeƵ⏮9Z5+=tC(5Db(~hL#FyW44~ʤx{hVd&a'G8,7LݨǞ}?r%*;L @RGyuʌ {xEPkfE)a7s $+b#h{#@SAʘMEw_X㣭:`o-(I:V74 QqIP@^P|GO7³XԒlWx1n}%P$md`l4>13 !kO#I"ш"{xTr:0@ix Rj юf̱Ȱˆ+Xkd:|sN}՜:FǑ%BL d)O5z[$KEg?WW5%P ^s؃ѰƯ?Mnt" fBg |L=fE0}W!Tn+X;F$54>0z@+MfaEwkwϻ]@sJb$ꂢׅ]#yb,~[%P7o^!89oHӑ瀲;X 0Ȫ, ng2Ze6 G.wqchtK+F9U!昲~~TBU9@b~C"o}GiRt#a@4`M{ijV+v ;DU駝_HVI^\튮w찢k"5LۍT[ܭC,J/T^AƁ -\g<Q̔fc;*pGACʤ6\Ŵ#L;N 7 !\sB*1 k ̓JOO?_- O1󅶪sg:%&׮ޱn"kв0_2u.?-^"eK^o.:rtX^*%l7ԅw+KpXp O.!i_ (幉^14ꮝT@ȩAnR [M~n~$2R)ov':ǼA ຝfUCpupPMXX~ bZn8W y h_q 8h?dTlSv8"$#uX$jr&arNIfYiQNilCjLU^DOe-\DžU Z8~aC}|URUhAFz0tN.(.L|XGZM@u?_\te}uv6}ō|f@Kgh^5ãΒWGQ.B $y6(s-A֫wLLzQ;_^:r 5 i[J&i$DrGq84\Yn:L êèܛ2񅰵d(S/G4!vgMOFVRr5T-YT}͹?XwR- E̸&,f8#8N|ߣmG[/WP_0ɿbU@5Du|6M-0f.L n ks nq^C`ȢsHC1RɑZ& D1'Z/l0 !݈%`QVkܡY{L7#+mҚD+?9T %o |}~'O$"zE_) 3݃_haC% <\Є@is%)@^KcAhFyM̥X.Gp/.4Dۤ^q>T>\?FG8"(2^f`/1h6~wi6 $Ccyi#\Ըw-г}~, ۷NwA`Nf65*wipXDnG*L; xpJ[Gäe R'\wԗ ɞRJ!;Yd:hW'L_-7WMNphE2H~i~ߝf^m 6~ly-,A3fR-Wq@)il)9M692z2D gnsC/j*ر&Ȳ1.@[뉭mkCq3̷!e:+0q+rMD!y*nd`=vL ʒ6Z42ld4jK8tyxX9$xao`5.ʁ}Q#:bpYp,?(2YC:husGCJLČ̮ >LuLwU7ŀꛌ`ſgf@NSNmz&!Bs:!ieAt-d^nUC捕*"Հ40\܍}F:<3Cd;&I6^ZQtS.+C3:lF kżW;f]CϠ(!8X. :QC 0ֱ"eA4j>I8j‚GG;k^qՂB''QP-ҹk4~?|(|L}k_skE(omUD4qw_JH曎[W c#"\>Lz^A!^>)i:nwY'?|ֱ>Vj4hNczu9 ["VP6zS4Z]$.T Dfhor"EE~ln:UL5n1f耠BJ6TyÛa=_oLhgȀZ."J}uWi[ 4*_ve{Gsml38 =϶N$ цN,J ^>Ff–hٟ50<ؾ)i8+N.D0jZKE؁DI-va *.yLɊ, dӀ:}>S]6'RjOQb{9S4R߫E *FoMs '^ Į-n]jZuJ,]Z׭2~8лrB7*EtAHJ80/{jʼ$&MkyxzU=ZhD[cdȤz~O0.B*K)F"ѦPaQjaU+otO .&8ZmIƥb`_<\O?_jIEzHCb"3i/X5hE;b>?#w8~CtR4t G1YKɱÕTt ۛF!W|r2kXҤa0ufhP|o"WaݿW #-htԜ՗Es35Kpyٰѐx&۟io8]T'4 HH9G;">H q b=&0Tٹ܇xH!}M@zxZ$0exN >)$FFEqh&hud>VL;8x9"&EiEB&P~&Q7Z5WG u^tSMݕp ۉ=̴x?Q:\r+sØ.^hLT$V9>I#YZ{hb6f[_K79wWV={Ӻ'[IԌ?ƌE K[5zTL~?bdͤ2'ᜩ;%yKnAk՜~J؞,Uʣ>LCxΖ L:yՏPTg*mBe?򙗍zcUJD=K˞0a(9;1LxEw]Nl%'r\2R*15jG%+(N'I|TuKP QW'*B؛=AOHg@x:=?[mߏ4sɟ@@]:sA G!Z]?xU ؃`YZGNi}$fzPܐ>--茜A fH&eܓBͽVڐ?c3 K`ph><nȔtk8T 2שGfy"? y* $Ӓ1MCY#$.+5%,ە(NSDܤ4C-8.|l𡵫Qss*5:*B).PFt==%EM pk7l5k"`f8nb-cIGтnC ŚeO $<4e0&5Q#i0Ҩ8p?FX"`f 'RfnIWck'[;}!HVshuUSmtSSGuw#rz-[Ot=E)oۢvQIF<f?Cr3$(gojA7ҙY.8Uo^PiFSSZT3 |Oߧ<Mz7JsI(p|*G3 ˴)ϥ ` 5懨gGQx4apcT$85P8 О~~~LY/ΝP)㦂)[t!t7z߁gD.ji~'=+˂W52oS~Q?~?|L >kWC7.^m[ˋ*.0`~Ш i_X5N$4v^Dn➜n0=~oQ4)byYXՄP\كlN~,N%ym/_xN bi>(1524I,@/]LA/Ş 4n^4=ZwuKƳn >Cy@<~3r^G@MDGa |bJ >NKM@naCy!JW=~*%X.(-;PDCpDv̧pxsKisǩ7=LV<$\5nMQyϰȜtraPzأq Egd&~A)'p@>RόU 1X^;#x/ v%:83qtGyE;SFe673`ա:wL{E_ǠeG.3;D='dp-r7XuGZ p`4&^SsfKt.$bt(g-PV#ٵvT\HI떴 )FL,2 K lK\۲n 8*Uګt HXalّIpQ(ң!:1HuL~vWKu馡<&)i xbh u-yƝ}CSv8 - Ċ6򥞶Vۑ5XGT=;q:Ɂ@13b=śopM[Qz_ߑJG_ruAMѳD$BPWcMb jmr?[ZXeFTu4 B 8rYckӼ`Y.!. 3(j͂-]`/F%fK%l< >#0,T$\ew 蜑co`S[5IM'"i|y4ZwՊ BΤ;1ru')8ImT0p-,ZAZ-]1s{:-:&e!ʼ"k B QaX/b#6G̱)D҆![)l%^H9Bx >l ?:kMbI4q\$ؠ^XFjy~MO,<:;8iV b`nL'.FūU Pp,sY{e2ZVb5lY_߳*R~ϐ~; jŁkۃ,=nԹ)ee#$L0@ڞ w*Sݤ9>.D9OW辇[ sY ]Wen ]XV_oy1B[(*(6 74Z3Ma냙-oyJ ]=ZYñq@R̨l@K6LDN| /Ãlp %'Yr3 3xhUjjIJRpM Ȃ:kzqRu荵EMy Lf`HHb&xvDJܮ˻R;ja3-t=n٪Kz 7b!Ä+CM;HwXy `@1գoQby,[̲"i$8bfVk7t9sZ/S /$z,&`ߞQ|oV(}ѰM.wQ '_PCYu2qҺ i8ϴ9j +OnS :p|Nn&|ocp@ȑR V.'QM?^nM` 2O a&1+mo#;%Otꪧ)( KjVcvlsjs`5ܲ^V*H_YDǏs/.Y~fH"15@Σsdq1y%# uGC#&~5 wk;GTJ(76yZ|5S (ԅPm '|%t2;*&$yAd!MMML_w}ZMe9-DT QIWOkA+Egyđ_wNӨ < ڈ- c'SXS|tF>CݠADzwN LWć𱤦9?q.V/N)jaю*Yɬ\cXDLe!{|LH$6Õigw؀}šq"=Mt/.=VFKBI4q4 Ow|'y9绺[qV ZMk,k.Jf-I WGsM"ɹ"-zJH4HI=`warBt!Ygi7]yEweʖxԠNT-f6%կ8K$O^v97gSV19_SX:zh^44tWP m y/w%;4`| G-3INpc\De36;՞DS^N%1ܢմѯ]@ވQh8iEQp}a_pkTQRL,z))w:}*dQ#ȕ9P,]+FJ#Td7~^IGô>A_|ۍ ₉\6cjf )?Ȃcҏ5w Ia\-ʍܝpaxAYh}.:Bzгl|! cųb2(X;/%?iQ/!j^GF)[uAGcv TRyuJz0_:-tMF,2@)XF >(,}SAM>CC[aO3NLK@ gr:B'RBbس'uQ2Ά1Iӯՙ?n`g{#}|/IHJ\K av C!$9lhz1Χ2ج^fMȏIj;4/ v(RH7+ͼm ҧaSNgB fek;Kx`ZIG-ÏblaYϟBm7;]σRv2x/F%d~1^hcK ty(;_G#(Җj1(TYX.p8RUzGhzm>Wj*Q/鎝skDa>o<`[ g-l"z7G'jTιK֞J v, ;d{ģLa4D~;[v( N߉J!w`%Tj! 67(mWh‘T#of\Oj@uyۦ 9Ugھd^O:@1pehvۺm4f]fa8s4EkNHtU׌/b Q~7 >͚:WYEu^SLcV_8#N!E[<= 8פ(ibvԗ](so:WVJj5RЌ|+,.ͅd P\ļ^̗H&N߶?TvyEq"p0x;e.wh.T07/+lhWq_C^𹜎yb69QPiu@Wf8BzK^(\IRErU`YIb^9~G<Ӵ(&CZ׍Ѭ1YpHR@8fa֚9鞦Zy>˹Jn|w/"3.'V~vAֹ:>JXJ<.^ʼniV0)#蠤!aџ]68\;Ҁ*UbO"dѭϠ:Ě-8X=+l2ggu{1{;hEQuCqzA~i8hQkÈwWcGb+xH%_rQ6=qwh1;@}k7,ƨwϛyFp֏ͶV(Tm1N hD}L\W\O6P/ބĪ.PX >Nٺل;D+|jYZMS;ƢKs?C |hfDaXFIq[Pbjݘ^aà1 ʫ(+|ҙm#l5 ߄^!0) twP 7w\ ?z_<4܍|&b}yvK#HijR!L[tE~yziM:$kFAEZʂl6SO@k3~*ty++&+$,#`>p oT,~B'MwKkjԎy.ȗ7S_NORt x54Dcdq$:$و?1ߑh$0+ T ("yB丙Y4t(DKyXkNb"e\q݉Hu3ǟ-GiD.4E?Wl +Ԃ*Afݏ [aK -!JhX " 4d{vnM}p!Jos;;rbӐ\% k@BS`-0k-%nUvȉr"歚V 幫h JFXh!]gC6r(Eɂ<6fe#\@P/ S4Fka*S;K&$$mP3q "?[5Rmhf𻛖N"RsPɄ,hMbjv8vsЅ F6-k0 N E'܅" 跺v> ƴ9@7lf*^ːwzJYHney8{͟Svwea g:(AK%f=Y~Zwo1);5H a MzF?;oڎ.M<%.YZu/=85wbbq'ua&`K R^~>L0aQ%\C-@\c#] 0J=a(T icDq"Js>vQ;9K*vcIKK޴zN|$;Yyω';9Sߴn+EC?D\(/{Ea{ >?x[C,O&栎 |܆ZVE+{J=.&jX`~0 D|6CNwשZNgm&L:R<#~:]"'ˀtUJ椏 c@70^~k (os*e2ߦ )n7! F[$YkSD!Tr3N@ng& MaOL;i\h@1Deyq,w0 l%C$u9bD܌L;Hr؈yK$x^$?pJ^1S&rQbEs!G7`U \Yrj_6K&Cgs7a7/ Q;նk2m8cv@)⧠/""WOq4k),I,Q2[^p je6o<]j0t+(|-I\㐴oaik }x-eb?^4h#2XU/ٹWdBI(oAu]l_>mq%p: k0+|vfkx =4q,3%YdGtf.-_`k!fb3=GbL"wR_fPQIyӘMnDES$w Ѳ'z`#G1fHW|i2Tsi%X=mgAWMR934KĢWkׅSp yE?p oD-͟SF+. EKO?f N2B:[4:R·}tN{0ڦ'Mt ѓ0.* L@ &.k&h,L@]y/`&`Q_H̓iPwH 7Iϩg:⪓Ss^0ܙEN'WeҬw;H(=j30gޒڌdL;a7MӲ>jec kۣj/)hP[ܝ:Ц i<9 t"VĺxȬ(Gš,LdkݭCWw9 [J}c;;gP'Gc:+ )mF=Y "8H EjR@c#nxsӕmKNF-_앍 χ",:OsHB7G/Jf1攠<E~/$"YMM:_XqkŀWäx8rlo^7J: i܈\ZU2C;S86XCn-%}(yݮ9b+-/5j O$8g\e=6tݩ4:W{qU]:8KvI1 SKm0ʄŞ~&,"&ҌZcT&~'&Auy&@QІ)фw\qFHʟ1'9;$c͛v"p4aU7|T=s,ӿ s.$*cH+4f_j 16:0ƤsuI0-MOiȭ1d`5qidie3Ry.䈡/Z]3 RS}"P.<(&|M>KŴcc!qXMsj֜DJIvW0kXta#K: uZ3]T-S0C(j,yAW|k;amw9M} '\zʡͪbJ/ #kH 4@{6-d~hD$j劢H?ki ! ӥ9uv;k 6kf:jB(XcAmuTeC$xw0=o8vA#*[W.Jw(n4!A1.#!}HY/a7C;=tn].%ZjM.,6DQ-90J(|YϭγU,]8\ h dw{>Kْ0nI9G|)4>rL>tyҿjt[U͙}f||||Ъ-sK~E@:2ίXk#">)mCe3Vɼ &@@$u,j:e $(cdEi7@Gt,HǻP"l]T^f=uϚH*4l BCFh$T?YGiiһL#MqHiQT&{@MVo#2f&)܋ig ȗ=OVEVd2@@"bSvtSH_XJ?PD ,4)=1;@F/.IeM{b5݄Nj:/E VW!UYI\ǫymR ay_|ĿFXLWUxUgHMm7@;(5 (@`է>7pd:rmo;#}j7fz<u+6i8%BAaJ%+8r-{Yx~YfΑ ߽;py\cqC[[ˀbHYC2F"[7 4o>5>J%`\ k1j 3U@ ㉅nC8u<`v`JJsjX\,<Lw싅9 w}z5>q'Ԋ|)!5+S*#EYo6p\ c>)r=].4!УJb~UI+`p-H܆uŏU%fÛK6N/i=3ǂqjK 9򙰋1V\[ڵ(Jͮ^/АLlJI'- {α>1# _46+:zxRb(=)lmHjg%6bͫ0u(Cxf') FjĂx:^Ӑ2v,V"s@UWⷫcMt>N62{/pw-*9*)[qOhOs:`O1._mD=z,/M.NQʟ (I#=4&o7$!2X蜱R{弖F޾3h:hv=[U9TZVUQ|d#u].IC%655ѲF G&:7SzȰv ͬ%z߮X*X$ ܋O _HNqp'$dNw܍җTp7b ߠIA%^7jY;*!C}BHi5m\3:el/\-H%5&T$c_KZba8ݙyal֩'CQIŕ7駢S]#0K[ `Wewi rBAטS>x>N|,%Ypm +񆤄+I6DOlK[ȹq0Fbe1`.$GE6rK?MDhJ37nHxY wJ>yl?Ez2YU٫$Gfn :CƒVTnX9}!3O&>gP>>'O$-F򔓎W"5WK;+,sY)ҏjsՖo Kn_2Mkz YcѹV?XПXMAd;ve^QAc7Oۖkc|"XH?A{s{>mLCoC(}S²0U|/>VFU!x(upjhur XsϾl:.x2 N],+$ﶇú:4aeClBGqBVJ@Y4 ~9)<dyC9{Ή˫r8}ou)XYwdqʡfy`"&_h#N" S{p2tX ٚ sF20䷤m5vP×rDee'agPBЬ N~uSa-bD٨ kj< _OL'Gd80}{0~TЮ!=@3ZN6$0\ADdFS#,W٨+>2f`5^[]|I}lkN LXۍRK!/E߀E3x` |+ʑtb> %7 ^ OuI`y{/%XNsG7.w.G"YgX *,Ż`-NuPX`!*B(j?Kl?/o Cpx]|Pcb3UKQ'TgjSʍ?GO;9BV2 &6ğ%*jŤ>wʇNTT旘9l8s@g|u >q M sJ0HEӴ#tY113椧m/'ssoҋwZ[V4-$%s?7}i,; ѓhDR XCmBBRجPb9"YTaar[ցh#yJ4g*5R=C[gY qfw!nubdpؿ;thNO+粨;wW>nϲ6s “Aj2zF>|` :WTـ'_pѝ,)b%|c3B _+imXQNcnpTx;u_z~7B1•&69b<;1HȪPʍ3dI\WUmF 88njt bRB3ߜtCs2)@Li͵MBӸ]N`-cW@qO{$U 7:`,FcjL[?+.ɥspNaudf~aYZ$x' :ҠkĶkfs@4^64y2Nڔx~),yCsy;A7o柰r@ӄ MiZxNcX!}Or=y:eE"cϗu|@cғݟmm %Me6お'&T; _vinWHD0b 'a.8{DAd=P uRc}՟pAd , `$8{zE2ڹC kq˃š< z聊HZ8$>evߴ'5/؀>3%"BS| ~ L4Oֽ]5/z|PyKbx^Sd7K:X]ؿ^dh*~sIw^>ݦg}\y}Ԏ>Mx= a ^G8CC$~'ܨ۱09ViJL`J+j5.K*37Kx >+&d ]QӉ#Qž.A|p gg22I) fo^.0+S>FL*{9)2 ^i/sG_5WA ƀ I.h׎ٔRs9o s`C$Gh@-}֠HR7œ`p7 ɗ?,ZlĆ>;$V?>B wi'1" OqbtqaOGPq SMۊa׶`^R>jNPtuӝvL eX}Ox  `@ c.]0!1 `o泻rDS1GɥMxyɤ^B$N ѐ$H"8V.PJcƿϲŸQh3dƫ2_!z/!~ ۲kHQ%,WJ? ~;\Y-VSyY+oZ2G_,.K )4@QV>E `S@K[7|=-6b>jWt0J!}R~z+:p#RWQ,r*-7C!2|DVI8/w>rC ;uzQx |?&Gg t-*󼹱ڼi):Y C-$gNV|zZQ@D1 @oZ;1Vd80" NX// JS^IYSR*EGgvwrWw9uV;x!uP?l-p(=voY_K(ۛX!m[|BO+"_"a ~Ֆ`i Ew_+G>qHiT=g_wԜfL"(͜[إ/3琢/v ձLL{D@pԦr3bȅe$ %1q3*l2Ay*E0e`E&nT>~/*/s4bN0<&􇂦ތrf=ڂ+%.Ke7J4Q@j l^Ll:^%Ӑ*4JY| ѽFݓ[|ު%N:N;u6[VC%.rBպ}GCzzqGs`˽ &9cw0 q'w, nѾ [pZxL3Bº_cT:`X\gn<6ZAR*WVml0?.uh4-~\F 3;kWM%,dfQ~QOu~CoY tjSOHkYȸ >Ho ė%˿;3]$`a3EVq3^>ЎGs: +ĜGķr:"[@%?!\"Ȣ)2x4PW,3P#OSI%vAijLbs? :h `hy(07b@iTTu Vsk>g@}r*k9o.ޛ}g&*챯GDoUM ys ~@o1OZ"\A{{7p\!1-Gb?zWbodQESBo8,[*5ʅLjrbF\U@dz<r ?o(Sa) 59)+ a8_*d>nai:i4I醰1nPDO !t;3^Q$İF \/(P8phܙqnO8[ޡ+Q+?k?(Q=I0Ӥ$HOIďwpv/۬>ѭh̝9wزn)&W.r 4~ Qjmgq!~fa68/lCEv5y.Yɛ 7K[늟&[w]"n >4%BͥPy1P.TS"Ay~YKc<@v?1s~ `=x\fT(AmCv\Y. z.- kˎ"sVI-7c=Crײ4? `oa8*(X7Uh'݋6vUPֿ^I?`U% p}dFt W|{)NjnHORA\IUvx/STd]OjK|]O !2(( "~夿|8E Ns;,=vPڒ(sUꯟM4ߋ;juESw ߹;[ԶfR4UzM8znXtt>du)]3=۝W jgn3+ũG+lwjֵS-aK>vwӃk"h3J.mjN$݉^c_6`sɍŜJM^F.%b2A0cNfB;Y9({M|ᷘ`aJY2LE7G˥Z ~#M&pmoDwb"p8yAx-U)n5DqOs@ʠ(cޫX,,Jy` vTCZ97Sv1=0O#GnA7^D C^3Wy@R`KT3XB߂*4x! ,-#DqxO%SA-ץ@H^rTpqpe%N#R3 0 ǬLDgxWg;8`{r Qa p4O?Ҙ#lf0Ժ` 燸p=8:dm`ԝ :i .`L{GAW:'*Y/5q'C$kɲqFIK5>C=TkWb2@~K]s(B&y1#&CIqj%lb,餧 t̳x-әSG(}Bմ8Elt6ɽ^1+ܱ1qX7 Vy\ XU)ϼOBn4枎yq9VN.$P1'))L?ih[Zu MLOy'kfii yUnө%TW{G@]Fț3Sw͝Q7?L 'uݛҮ`3ńl'rޠ~&8埀5iҕO=?R p 64l+2WViޱKDzo|ԋ)FAq2/؛d^D>ѕ}DðU3M}3Dy;=ypc?V59'`>K:4t( 0"x y4n#'aq6Zid~ UZW c^t}l#Aviݹ,:.߫:+:Z[xoo 2Ruha[2/To;yį3bZdqtctםauUDv/Jov-^tTo~GC-|1]|igvEr(1/L_,Ԙb\>-5c]WSPӮ#!@m+ɽF:<y6ZPy.?/չCLzO@`Q 3p ~nvq"qsYNƼ8蟶~ 11kTE)&%9FKdoS]> 6AlYM͇A;N>>kQmCLΜ[ԭ3vC ݾ{ab}ۊ_] gCܠj#aoɟ@MPr,o>F'\ KD&NEAC>'`H]ˆ43G:3t.Z(.P [=.֠ѹ ʠ918 ITۧf0BKgnѼiHfje5źиTߑN[ܥi/=@hhIv0r&$)NK{aX TDVf>toGQ^a_tWtp8(? 2Pm.HUb$.>,۴|`tξ8M4eXHI!iBNQcs|oka6ROn>*W/Z'mA} o` )⟤[*`2W C/@9iPpU^&a TV5FF}$k@/) OX5>Zia5xΟ`3^JfC5]J+>~}1rQ\A!~Ysӡ\ (FB]wXg/WCr9TpA8=QU4 0O3g :AѻNXB_ eD}>?EW6; Vˆm$/EU /q"+U˫B0ESo!/ȬRyi1ɢH8Eew:|Hx`",ϵ[d`)6|+6_5I;fW m,.؃X6ؾ%U5w}zT>Pdq.%l%uL4BDFh(cōqiW}Zm.-}WNe[Iʏ 0^gʎrIo yyA̱"]C%{ nR@:Va*@I |֩!qK$'K krp\) K$$C)dJ[{ Gb; # VF= ^B]٫ǧVM0 >`'1=jl^w]0ӽ(Q++b3Ar7av\M-"U@G5aNE`6D8/rkOi}Ika_y1Ȭbl :m;^3?_8a'q׻l>{89WB 5r PlqA  Y"RBпg8mUU5D#_t8U9sRmvMN&1p{cs=N x/f&oٿD @/)~jqIc"8s_2̅کԤa.5[" ɂy!7" ?`r#Ɛ1~!EBMo ^(ghZtuE L"Sנ\K7'wQtn' \S\(ITڱr-%Xa< R(q֘PD*HXP`HXymsoyI_y(g+U> ü;tdU1``(d%{9@:X~L՟k cP'9B,ލ$\_,_Nmi$6,+&iD#:\<|Q7!?o^JU|`)u$_44Պ l%Y@%o7f{[&'K#Y&{.mdeb_)/i#ύqK+ J4ڔ{4*쮮vP.*"VH\]jԞ (n;.<ģ:.IsT**i(8rTMi .'id ދ1~bJe*PU%P8ՇA6S2B "Ebh#Km+`{1wW = C}Lr& DRUuJ^I5}5zڔV!EpiàI{x ֔u{Ct{1 j$]t]ܾk;b O$F 5KN3dD!008~%2 9=p܌LI4m6c`M&j#l|BM[+DžJœZ>iyW-ous@l Mc;kTwA-ŵiXb5G*12b$iH9|?Owc 0'j6[H?4`5_דVkLó}]=ξ~\HwhMZ|"D4L֗|*?f֑`J?.O1] \B Cιa/!x?4 YE|PHx:ۆ"NQrAMu+B3 3nHoM76Ay`Q}w:uOUq«f)qpj?[1toٖVӠyT~9.\[DBKsVd.ʯ&ԛ1rr?RHfS6(KǢ9Ni>=6NɃV!UK IS-l F@d if]i}ZoPgFqΖ]j8L -]@\/0ԑ2ҥO mLy}M5-}+dS$iX"3t=:6T2Gw/Wc Gek̅)r|Yn{fsOcf@G#ݸ; Wȹ=q{~*At })IZPgȠm&^#/OҒW{6t%s˕OQԘVŽjJb~lTLj^-8NU^x75D U҆I}|}qMr/!9qso!J<r]N#}g$s]&øJGr! 8Хf? X%jN!.EM87qD:L(,ZPX,78t,W6aԶDe5n!7Ej,FI fi{?4~zB$%0n%:X;fWUyCҶL9Lع/h.紅/ߜ<[EQV"8B!;(h]A(hQŮ\tӤzxF̎жYHA$|sgohwĩo"6=`%uQtřijA)lBX?l>gO]r/ >5GL?72lJWFу}mj 6j6/]uQ[ӯ8)>-;.&z3RNO G"Bhr;beLt]>lM*J46 nًh (Ef@|ۆ gAa.xDt z̓2ۧ m=R9ɰ%8,hu$H gz3⽗Y%cWmNlb^쏵?y?^p9Gv-/uk܉"K6u]9!oJ+l-}Ds&u<@/$;&%SPʇPfQoYViDcm%#_Em vO}g5L2ϯ*ٱ*]-䒣m:Iѣ=Һdfe@ D#_F+K3uV Y} ,|[zzCO%ԴFy97H2aP 6[|/ I%\QM*Z[%(;] aY;"l/jy?wPwm8<4k=ioCNfY@J szTnPw=Lӟ0k R͊ ꆧN8# XPE|3ƻfQ~3" 1%#Qp2oӧ\XZ*%N<NH: |t%_ba4@в ]agc>ǗSn[vkvztP0egm@$6IU+D<'٫In&1ΊwNk ~TĊbÃѢ 8غ(YQ+!tL K<s{x)v8Au+M] Cq59ҶFIiluSwŪ.y\@s:#fC~>}*@x(Ұ.pZӶL.ȶ~ulf3Ixnkl}ُ[3ݝ8,7`?'bWt ߧX0WثfPrp/2鄏-nXkO>4U S'G+Ρ"CZI׷sVwҶ+bM@NElFE!TN,<8j ڻOazmr^~Յc oA^hDYW9sƟ{ޙ8M(!"$ rsg>:¥~m8x_)bVuS X4]:2I;LJh%(5RoeAC//=V9bW.JPI~ē{x-(Wi"ku#D3vZi:YtOF4VZe [q` a̯S_@ŏ 6*k|:w Lkލ]# 7i]Q;O E + kvnE=oEab=Aӗ8*\[I\ZcyMRq/oWFdp7 ׀N]Q &UE;+ %[h'2&6m*֡EӥUANIP\ckk<b&h'Rʿ&ke8;LA܉yKqp&cgLth؆zd_퐨M+ζG*ЊْL‡O;y%h&U]v"plRc &eύ+H̼.F@q#ݫ>%\t^SqD0gi1o/Rw`(,bI6D \ne+ ~9R[YyEB'N?иVf:ϕx8 $U\]6 xe"nh6f Sw4KmEX{OV܎F1ԶG$Q.A, E0-cQO{#cФ7㌁_&.J.!-kAv-Iųu|"S žێ).]9aY+is/>={N/sHřr^ovh-=eS\@B铭^Z2-*[ÇwRA7;lAsDj}$iD7B߀"۳aL B1ۃz{0dXL';Ϙ}Ҵdp݈g.:$'2h2DV𚟓d<"beӃ2QxlG w-\:bɇsTۯME}*fJZֺm'| AE W7_&ƺ0Ծ_1@l@G9f"s#nt%xh 0/UH<|&-c%{A쬦B>bn4}Rb sr\0[?I |n_=qV [Fe/MQY6\kIV`Mnbnxv!Pq" 5y{\@+5xq۽E4f: 1z)65F^*X1%lU?M4s3oXr)0CKju񋱂P7Mc|4y9:kS+;ROuPtt-]]BҚhpmD;}[#E?vSiL덂_0UaQ"|ȴڽ,v&e!EiG59h 5陛M܍rC'!)WU.ukoMk}k6Tz\yR!/l>(pF;[B){& Z ؘg\w4_:MWpAZіqX]FGmX3!P/y:1C &tׁOrSwf?@:< HU SN_!өj& g$Ē %x agbCd6Y.AUeX<* lEԚ4G݋-IK][oܽ1S X&W< hA&K),hbm~{2p0v"'kb1~WfG*jɃg~CIaptGau8\}B?y$QQ[o(I{@KzpdI&>G&`ΤI.)8 }+$CYn6`Dx-ǢjeMcO QX" 5P}Co.dW,B_X$%\N,.b1YXJ*|QmiMu̖Wej"4f?@4o-A=&'w Bt2_ VA~@hz$Ul 6!Q⛉ŽmA RW kY.gܳxG$Py:mF]703Hdych9w& g*/c: r\j9 \u/6֡ qK nZ9ԉ V\ š);J1mK\NMͤ[ؚP9|hkFb,}(˳u1zW:\rPzW+-ݑպ\uͦNUYG7(@;&rx-JL/9:lEH`lX1iKӞ+Ig ذˠMAeԻURK\&*gcsY5?*uьrU;zA4o6 wxiUMuJ?ze:u|vd?c>Fz~j0Qw5_0) :S1:" fk^ϩOh}Q[]5"5]8 KmIYj)B-* E~!mKR/n6ΛT!$>F#<Н Q/k /g3cDd;@-FYv>7_vNUF8Q;ܵpܶUBc5.SF\?Y-Oݺh4HǺCBĔ˩x}_ $%)"j6h~kFnI٤/$S:_2Dk P4FFМ>I/gV~jE9b[M{/4̼u(bKdRMn,^. Ynf0nn{w+ʍuɾ^!oKJ о76ʘ 2B[U! Zo{,JIRT3;L bRIS]'*X|; @Y=ArEp~ ȈO3T9*nPԄ3z&LY혝n9AZeaUI AXo)fc8ChӢ6}48̰ Ai}3ź!~[ FZZL/ik {xmRtg(DHrTq,K-y?\S0z%uLvtFӻ+o^:{ǧar|G nv\!*5 ru#Z{rxcz9&$8NX;+&yf%VKQM@3aIz[2I=Qs\DWXr[tSL64-= ѺF/R[ $^ags3\rh/R+sj/  "9KPpDaR95q*YvӜ4?=X =w_zhhxZجwR󩾚۳}*DW[̧L }Bd`ܞԇ k! 4 %9olzyx9atZLȒ+AD SkQ dGQ3.tirD:(2*;GHUU΃Z6dcԵL)m\q&@]m>HtiQ;H=;=ևqNN/6=夲픡SwLXE-3OiG'cEW?<_r&K[>&pVI,8>,rDs/tc[ h?7MR9vu[ ^\IƷKYhOv^ 7EavjīiK%.Ip}4ܺQ±q< <2OVRh9N2_jNxQcJ2(z6>8"3 =K(,DzmJk")f`S#ƍݗpS pP LN֍eFY 9D+SˉW Siv#GdvԷaI3SQ+bVoۤd@w$ġ[h1Be#B>.uLɲ Иɉ5j\o&r;|]H< /r}`ʍU=\)~PʠPhep+Q+DLzl G2*Bn"o.ǴБ7tCs%t pw]~Nb;@|_[l)޽\b'- Vt**6VJ):?BKlH .nrsT=s~4oЋ+ oX}!e ~lvV oCM/ȁ OմdU(#xvWirZ 7d:w-{Kk0(M}>R(r?ŊEZ 8P93}>c^S'=%+E6$Z~9N貈vE5|3yg]kz "5z>]f`rzjoip(~ ]ȫVGl#}Ϧ7gsUy̘7o|Nh|o QUdE 25J(Le(/z4-X;<,nt#" _d`6i%& A+9u!uI;U犂]A1l_Ã8t_Lf_J4fTꚼkfE)b@76V?*{Z p`4qq G9xl^++r"+"a@5jNw7h!t8-X. Д7vcZB >+C$ 98|g<qѤ8qcf6jK, }gJ\[HD)lrjÝT/e[d&'JY-Ut P[9kE_N6摀^ڸJBqn3:j;];]VY^MF[Isqԛ ^nl9GT`Sp;$jv\)Jx6 ti0Rh11Xf*ŶNHb=gg.xI9 _+9Dp-݃]!3hmܐ{ k qeKi6dф9!KHM!2aۑ6]v(%QQ$D C,a3:E);)y]v.);1IG/ \QaC~FH sϻ\Wx#N/t Ny0". 3k+'?~Y6x^%q5Vn`1޼A^XDX0LgR a\A;|R -L  |{XK"' Q8X`ysQs*nb/ZK_C԰h֩,Ebuӛi[+'@g0׈v'jo!>yn[~X+"~׏Q9YJa= L V #Sf3*֩f89H<n;Va&Lӟ#K+SGbL_~X 7\e,ah_E ~@ ;ݔJNnNZ{ Ⱦ gk!'FIJ+iKa]5[Q Tb<fc2/xZewl)b `Q2S YTWR'E~ opƙj gJ7w((rn1~bv^K?1q]k,RޞZaXWavu!o\/$2L'3p32Sީ=::1/'Ctbk`ކy#R=4`I(3A6a qGtxHjPNWnS.W ֙a3eWSLnXzjE:5PUW\wadQ |?y)UW qjt)'y<_)ʽ'd^#`* 0B}Hw@؇7`x<[y&9̐!.ra@7h*E1Af4TT(b7r524<ߝ|nK/:YEKK/F|A޺s_IOi@NqQ=2;Dft?Pr'۴Hox?SM@ͮ 'jh߳o3=Z`YS,"ꏰh: pm`v = B|NdOS~2EL=7\QL| ^>S`jC[/VbC."ebui2FF'ɱ)nX[rO9iŻz:.@0Zˡ0͉1MD7[![u]dV ‰A@_^0 ZsW Jfn9[j`#G5>oK?GA)pC](CzK&}w PK'&ahy*DK*Bh>F?]b'Nm^ :t8xt$@w+3ȸՑ+K͐a(Fp8CoLN:ʲg 9:n d?ġ=m쯰~-1b>~(-pi7ߖnmIU^6o 9yzoOؐ=%'o>Xz+T隻K]?`wr:uCerAXAIXcq"@.Qg 3;nVL 7n6y2}.t41ojVB-GMvjAɂ)&ʀmc ߼]7U,60]RQS7d?>xmk:p~ jD UsM9n99aAE4k%>a%vtv贎;c;~̤+ƹ^?%~A"|d6IY=bN+74v|ZU}kp J19@E:N`y&"gp"ovMIOwo!%m.K)s؊Njk_ym ?8v& `uv&xQ~P@_Xڜ텉  @B۴lsY{u E<'U R_u`zK Uu6AHl)(ieD+]߰md@qbh7wyJHH ȂJ%Rb !ƓzFFhV[(J b{DLS%ݘ7'/.c&̛9oX!b49uɯMEU!0 /S 7g?A,>E|\+|{sM=*V_<6)BI ce"j?ATIuJsdeފ6Ua)U N4|IoDi:ca~E5+iVÙ | Mh2J͎k)r3'dVf͇%OӋ UXm)&BSA]~91j!%VMw 7짐0{/STWNB^Vn7+ 0v@s:#BDKn]ZA*J^fr%PA;5H8oMbxfǾnghG0!-oWE7A\?| ᢵcy$z 8yY_`DQb #eNم, LgM:87P,`qDH7XbǼ|5~[};|ğԋ񘁉FX}ɴ_p6}kz۲8'#~ޢI /rԣ@j3 ӎ̮;R%O O2ݫ_v11g؟P'tt?u3 .c'h'N-9,"T`#;ROd6Oa;lw]K i'`.ߐ_?e;A>YD$ R6 ѩ=;Ho}<=:!s!8cSfcep j% ƙl $b VDwPI6ǃS: hiXbjaMvDKb&i=)ΪnCn_?Jñ$R|Nf В\ <Ɇ䪐 XrVmLWr(1>HyZ()o? HMD#]=9ƈ5v,IHjWiM}}Q\BXraA *mǁ+ !D`zsk Z1|_Iu :8[P6cdv̗,5%#"X0jumi%߹8>ruozf@Go| 3ǭm's[,Gi~PRAL:H$kD@$2-6f›y]I:I4Lξ{+Hwz1 `cj}0婯E$@!)Cifi5T!F!pj!L_L;qb/W<5S_1Yf+ Lfi:ఌ!-zu+ Gm&\{ٖ%"%^_=Qc dSb#`\kI丨bY4*U3i- 71$skOuѴ+6oa-劒^z54kLs!j,Nl$McV¥}DR[]c6덠G:q(+EP!cA*le5Mk3qMd9*^jׄ)Zr zW4=.&i$]۩3 j8DZjd̫Bsh{Sڙxa<Gf1ߠoyhd;+잖bCUUz^(;8XH!U?2b#="JqZHZ0ߴj*$gPBN5'65FovmF"A )W#U/N~.RޞժD{7 j4n\^^~$4G.:8oTw;<ܗ99s_kz#Jp좈eF4,9ZD>+FvcSiOB.G׏W9XPI6pgeyU0pW[ v%H%soj xs[fE76Fa I!tn-zbl2 $(![H8Xu#ȃAHU.vXK*3K/ #@l~`N`ti-~ݝBWa@0/=-,g*"5԰WƇb}SpZD|d^iwXzA7xm&SϣGyf7-TMTsiwJݔ*4BF35PPӃ&bgHW'o(BU?"H+j؇("ȧhIEeGc"6igD]aݥo*"[Hoݯ&{kR/[79,19"Ա*ݙ5X$5KD f,fexK4}}2z#( _5owk}!z i+@JM/e2bFHƻvj[_!]QߧZ^Ƞ ݫb᨜7!\) >!-&oQeŎX-BHVo{$!;{ XLyь*"CY FONV$L-2ئٞg:^A3<)" G"_Ѝeh8)NF.Ϙ\t2<[vB.R6̟iӶf,P]΋Q oҡy/=36_DxVu3#1 RQ6@X~F+گ-gAޜ iD#82Ʉj?C I+>ꛆoRkCV]Wˇ+O ’)bȋP"\+%;[K9U6T\qZ܌+@c8ldYi^`S3z'jTÖjYĆ^Vr5e.GKݷ D/Dݓ˿ȖoyJ 4H)pn/h]"E\W}{UO.J׻D}R鐏;pj^| PX^x_^7sRwYuxzKK< 7eU ۰S$Bp؋0Q8TP'w5IaUuyh(.ZYfǛsr^˛!oCh~SU}<ۖ8Ufgkܘ24,q\l^4^R cD~zҨ0Rr=d (Vzهpm^1-kmVړZ^ ==J&P?WC߁ -ۜ@f,b/hy1h+җ&%dpfi#ԂYqDD;Dŭ6P<S՟ʦ*"!=[-}\fHK>#x*Xd,xj:" dǝn'aJen^ ڐ%4[/sXK#~OodeA:͆1iZ폋$ge2!uM AFހB)1whCYkȪ1nfƎTX"Y 1s|Y/;)\-X.l3-^ )ܑx,!A%CƔ膶U'[ e \u_nZr}1qA[DjJlq+g/b?P=y6N?UَQ] ̖/-nvZ46=e0uQP3DWEϙ.4[b=n/L(R> 3hM) ،:DAwnHuLtr - =εqwAy(c+Yxzjq̞~ /4gۧN LLrnW[#s% Ӧ=OXr|ND},4^Cf2>+.-t0oϩ lANm7wX`Go0gH!m>}vAD8Uf1UzDT ^9ӿ^f >J؛6 7f{D `ZLI#fW ZbrSeNU1 ۆOp|֭C" ׽?RMdb0w&Q0H_C3 #dh r%'|ߦCLwf FQC`p*ݾlfiOEs̀7-[BLz쭹DW#hq<snmHPO M2 YYjZ5y5?p`9A5pqY/2Ȁ YGwBd&2Y rOJ聮8K-囕i|KCorf _ѤM6XR)앭?VewIlfTL >LSI1W(}.Hf# pvϱ\TQCJǐEߋ֞g(z3~3Xoϭ WKt&o hׁ!3N|C#QZx{Plo|U~~XSS/ uhjH;tAgC71;:KiZ+H8s@zW 0/e\hET0|nkw_~:>snXdd> g`5vie XQ&]_9X;LTQfTR'qi% IhK  (^6~V889HL |DmrN| oGi2e=K-Jwq&'5PZ`Jb^u=Q( #nfqk].2 u ^\1bFL0ֿbV4W"Si*a@hEљ=ﰝE2]޿M%Lgb>FBe|hk#ۄ&6@,n!z 'b6Mc̹&l[4?HE#{6|PZW v]⟘2<)sĵC4D$lm~Br$ko=.#/NвΪ5ƷJBq9eiR[ kgS'x,G[8H έ֧ Bݼ`dCgy{*&9AŎ(9bY<,֪K7(ezF? +0_eKR1咬VQB3r"JTj^ YR0Z/,R¥W%D|98yE y]gDL^: uIpjOC›V7CSPLe=QM #*@\oթr粂CN0pWcYw&ufu +zYWWyg`߃0em6Yd'>h 8LpDMF67럙y4D*Jd%qnvƋN8'- !x{v|i}OY^?cQ-+w,t]2ޫ! Er|!iK;PCdB.I2wgNE`2&194u̖$1c}@ϮC\WDPW*^ 瓣P4vI^_^s5㙄,kףO!ǜu>%L;'omG|93Q@.9( 'JoZߝk7Y6MJKu+|dmUi"}J,J٠4=,[ e/9GM= (bǧ0XȆ,0N3ǘbؘoCNEFJF\ΧsxӅ5hUWivp|>#rӣ~izq"nj8(9 : l n?vyP(m݉9'MȏEedOX,QL"S\ymΖCT4O<nc :x;Gu(q}[0ͭIޅxhF+mg.R3p+*'@3Wd,*1W0%>3/s{O _^l԰0?$RT1N")[#feD4VlϬQl5ʐR+oUox1?NK 㔰#ך3K'fcrMAͯHMhʻIgiUY4jG8:/հ mrpzb>?3밀 Og@ddmHu^A#*' {t?@t>#av\7`g@/ ߊNmyIKڰf/x +sHdc{u]ƽmEIVuca'&ȝ!JlVzFTts]CpM#;}]z~Ձ5.)J#ru<ńl1íxyT@BM%M\ VM?4ٳD֐{[RNT^X⒂\=d 'e^l@\ey:R2RLї{'H!@Bξ-uz0ѳr0xOJFCߥȢ9!Hr@%ʩjS m8N]c+J?vP 0;7u5JWI+t͓M}!^ˬUr+|.Ci1zn y\L6SDVUGa2obmaQSk!mHB1\5]r.,kCN]f112uһT,eÏ\3WqD̰xyq[i#V;܈=[ar>>dA ߘ`BKq`AZQ ]BHZ뤳 Mnr'rZя{qb]Q9 LzT(=IψHƛ3QF+ @}uc7}Ɂ5SV济44<5}aN5ց:DUWiIlF˺s\WZ&G_Xqha.7T"'S?v,؛K)b (L=VbF" FwY-F7 aC@ko\MeX-Viu\SQ )dͶԔ»{ChT?J)r0sO`rv20aLګ!+<ϵz YV0q l<] =ɷ؆] E,PmӸدOJ~N# _6_ɪliZ6YDV'sg"EhXm2=gh5+_ba}cxzd.pV&2*shWY4q&{}koޣ+~RRFov6`NdDߴXLTx3}_KAh9#%2wݐr ގ~*A wvVYA Ns+сAs=m:.'Jn]b"jpVO1fXGMe~7M߂B13ǔBc9&0Yt8]٣ÝY w.]u7߽IkRS 9A),ZU;m-x aŽL"4[-(#ׅ 阮V1o0\V-X%X\ B*1.}t#QF>gs>*1"ү:zȼcs7F1SnW?Dyx !-.svwЪЧARpv=4| &z:='OZX w3Y2~% eeΜI0xn~>[/+buo$3S(0ȶ]8lǺi-F:B7҅VY9}W]eVRr߿քƭvHd-!cwYD{{2MVFq-qN` q@}9sC3^#2׼>770/5OaUBvg!HPVkiB`1y"ؿ{^ "ǾS|Bfn7Ȃ*W93v7YJ0e ; ֒rcv߬n'"Ӗq޵r/]fM] vRw7 OCRI2S5 U6Mn[֍2!7{E;e͠T˝PDtycyhICP9tJa0w u/?/ M&s k&dZAHph"ћagk|~0_ [$) a3ik)rp&tUA(b\S DA,z< f-v;꫗u~;ӈq0 #Ԩ-6}.cpnL{3*3$9i PQF緜a-Lā~6 GuD 'ZK@tr0Slhh|WH zWLXf(ӚM ZbGjJz )#6mR}YӘ{>;6N5.Kd gQ,[ƌ`/[~aS%aAkNn^RLac㯸qLljGs.Qo  Ηd%WgKq@{|#!o< &W0k ʤ^:^{בmv h:`xj$|HZ3|vGb4jc.3;ҖWv>9No?V) z)QhҖui4EGB#U# SUBn[5mTcBnT>ac]RzBaU/OkYޜg- ,sOڠJE.t_k#Q 1y?$9oUnF/@Gf_R:Ў)GXB5ID͟IR,=xs5{$Pq2asT 6丿K^B6"W~T2ԝ )w lỸaqL C}<|Ui[U:֡h}Ѫ_,‡ =i5[Cvx0>>@uig ʫ[t?TT˨Y7E{nBݳX|jt&{z`xt7E7TQ wv/vg"eIǫvu:=gLT*@%c*3V"m΄9܏2 TbN`rL 'VtbBg6er=~}9g UOEtl¦̱sP#qAMPjx&o±K%-Pm,ţp_:L5gwOBjr-kdPkYC0AtTqx6bs/wO)㋬0t9,.p3B)}uɅ.URbh%ķX҂4TP"اkSӋeV \0q~Cehކfhfut&Iy[?'M.X+ގϋxvM#&JKA4Z cS܃T\/FC FuQ:5KgRkT[n](!.h!T׎7W%;_0pd_8y\ׄҧ S(|YWm[^CUUV$y8LzC}SrO;Yb|?Jfv|bW-FAz@*[h)a>TുfـѫC0lWd?Ae}fةZX.i `r.m(V-SY-.G;pZ:u鹺zƧϩ֛}l:ވ]ʞfłj獪?vO [³HzK=v@!fnnFMK.nf&$ nOcs$"n=Qt/*~x z#!ZtzOk=jj=.&L-؄,/G~j]PZ˜BV=%h}RyLe (mήg>#hV̺:ƉVE07eDٚ*q@-΅kjW%bekw9. LKi;-˅9ple "_nEZ5@yi 5fih|^ZMjߜG^;܌Q !+ S-"^REd,MfbC[mlqKmB!e|hҕiu5g>K]4L :?xb5x< !P%Bn{<h$Z$O"rY#?h2 ˀ[;}!L\ m9Jb[,?fGi#{4ɕ XqnNrMhyr$ٯ5x(s&f릸X~Z)Ƕye(xha FD6 q(f$" RjchCflt󾣅jձ;wƠP}[TQ{%L qKrO"y|%wʉx@,,pΟ:@|jevc nXE*M>m2#j|u) wE,";.]XT(VXT}h34 }\X^ JΣh(Hiٚny֪Z?S}:v5>K7<bX бؚٝ~xbmcL<*H6̵\n$;[ ȶk!^;4o -'E4sрH4,*˾V0ggTsbh0mv2<%euKv)RE@-]=Ga?W#[ B:teņ!2MR-NvYOs1ǐ&K80"nO? z(^˜4w5Wy^$in<|7'~<JJH/a)O2 K'pbK;Z*lZf_V{ ڲirěeeKGJڲ!a)oǻ] $Ȃ.+zѠ<qNw(T@.P=4>߶ˈ H2ʑxCoHfX?}6in ߷0)']e8(0Z1ιH#7sOB ~˱ OG-& ԲB\55{%ΡxMl.ٯaЗ=Ȋ7SEŻ3.`Eu爷.cr_} '=3Aހk~M~޵-?Tkuf3ZMr ,` Lbmc+Y;0zj 4fR!y:I r;c8#/q%i'H˿$|~˦{­ &1 f1 T1u ˽MnZמU!dZcfI)}>Ϙ&m2- MmϨ:&p֥!Q6esoM?ctBܿ}Zz-F|y+_Ҫ h~_J"5oj 6;m) 1Փ(~cjE TrYWů`v)f/YKN'nFR-4%X[N)P,dp_d6L$N*QKP 6=&zE4ǧPl0EN(@ b6nF2nj>3ΰ-3|i}Weo~$Bwuzcu-s ;FRsR' P):u6a`_)Hz [!H1hV(KyoC/NmckkvNfwԦ!G +;8:;˻c7MkDcaaMߤgO puϺcUgy cMI:i[b-HG+܋E!֛kzԧ8&*`&(sW2GY+[j#=7  & T!;d4KeXp|Lϫ\f> K^e!>I79Яmh|aSZyj o-Q@Ml`P]lY^9+$/]!'$Bܢ/Զ0mBrBufA^Zxm) .Кj%=D=&JL._'h};kgQ%-b7CgXװ4hW.y7CKH7~M2+ofn_rȳlbN?{(W.*]bci%H OX9l0F}ӑk8pE=-:dyVλt0yB#KXtvxo<̕A/<+aOa2v_}3xZ–-Z]=@=%z^7)39(I dk leF1D!}utBg 47Yۉ7]WpɎ,I8eeZdK2Ď~QkR-.ī^]#raЦF,3?uGr.2C=ZQ"+,EIۊ;^<0(2Z0B(62Y &7p䚺+#m'8F=_zW$Ō&?g;q-]dEMjTvc /73xo2Y?N=t]j8`/ dyÏK#< <:Ðl?V⽉V$hShpm~?u%5nu\w" ;){.t ̒H X׾W^eCZ~r\~Lpsu(:#V*z2>4"8U*vJ_Ï.h Qn\`&}?jv01|Lik ylfťZϭ+oV8=*L9 촱k^\ &- Oq0ۡW+٠~2XqI ;|7ZD(ܒO[4 5$ii.+ l,~~W6i x4fnYKޙq"Ј4*i_`dC/>C="F߆Biɣ:@Dn j g+DC8,U?@CjtKWCk a8x-x@#w Ũo7'4o{C&|BjIZ63PRW*[]k$cz_oaqbB\VPكGeO9%DOߢ%&&*68@h9Jt4 5Z&'_jK.xךmݶ28ҹbƎgZz[S U8$մS,6G= Y~,rgFښG7 GjXFN12H-7lLI|h+*uU]e-lj7Y/٧zewJJ\ _6#9Ǵ]X'!e'>j:'gNd a|bef"@ SDBE!8Y>kM3+eECR`eց 8lϖQkY^jƬ[˩["ȐMB" n5yqض*Lʁpjѫ sTjlgZ'!V#Sq+_1YbɥKHY ]$yv}fs5R;IuXeP?iqZUT@_6f9"lE2$jP“0**|LI Vacgx=鞠)H K.HXwV&?/hڕW*j0iW`) b t+X|]byަĠLRQkǯtCav[Y.:wG¦Cs,fck9'ϋ" Z1lh*O&AzEfW, fBk'v!BMN:N߇}kf6K}pX? lC7t0psMyE9"nq)6+k_cɮ*%Ïi 3.>@m:P[Ox#=#:YBY~ ²c6mרAFТ,̛qiʸ$l%_E/b$8E C#,}We칌.m/Z0w/[j@3 Z:B:d-a!GӨRhTgI>bP^cgZF|KO$ϴD1dmRm$supQg Kˬ^ JИ>F̿!pkHpm2mX+KQd3*/U|drn Kp⒗xH.TFt"T:xy0ƈ'힊/9<:1˾߂Tԟ䍹!pjOlb"g!r*=@"ӶƤ]Iz 'm!αx<U' Տё~=Ϛ鿞cуbW-xS^#ܺoS ]ȜEbTJzw WU^;̠,{ KSB)bu :rsXT%QOVa\2X2 ͛K=Em}~3mNF"#-pʒxm!E*ݸ[*b%dksϚhp G>U߾!@'4r{ygA:z_mzPɂ|8ٛ_>5O+C#fti+s^n\[LyսgďBnԦI$@ӆ/;d, FWnq:^~LyJg<ٖgz|4:}Ie:@nPMqSJG[3Y\$|5tIʮH~f`,IsWVf@gB{G]P >˽JAlp-^юX3öypp]aCEօ8Č7X-ܢ&XPʿ{bWh&Vů#p!̓atD18-@niF 0MF5cZ,A՛g%Zh w3H 8]-o Ȭ}Z9POGi5L{XDDg^nŷ;gLjH~j%`̶n3Q{1#tV`s%UTX_KC#o|\2Qzvݍܳ:?l0xnMO2'TQތ+ʖjVՌx/IOe7ENzoE+?SBh W6[1Oc]OQU=a4VmD{%A5;^5BxvzP`gV Ov]N㝻R?'ÂMʡ,%"-&$#Ka&IkruSNNglx]us])ѫ ֶɗܠg$8Ō 2As IjGfcMbѸ'Zz#4{%!$bLH!tSXk>߉EP"L/H ޗ;35Ϧ]@Zb Y|QNBe e`-JwT_,f! d Iﳦ˯w97[1dSgun&}tp| |MRϑaqnpnJTɭK5cZ zAe]!X|)J<,2-QKTvI?w-DɶLOe=܈}~Z}Vj[=fc-9,d%>7 YVH ,FNl(s{jcj5ԇSg7,W ~$Ez|p}OYoʩ 1rA*U1S>V9wgՔH Gprqhh Ba1dx J8Ք?gKOW}g| (9AnfŹ?CJAZ1.@ZSQy[P?+y^Nډ[1&vp: c+w2m*pN+-Zuw^ V] t9qWyɹeQnzcN%dő5Jq-1m 3{sACEF< DC:d)C-E$ lÃ1A[ N{k ?n`aM0 PxL3(l5yGeCE|i<~W)=Zިo]3ٹ~?ZGY܏ؽсUcEp(_{3Oe= t& ˶4%&bt}бX>7ȫ)HF*-qPD.z~#hl[/y#'Ȝw) wV mLӴ{ШHXh"X:U|B$%fC#K!];ú& wg&5J'Rwx&D,hVc`],h@0Ծ sH)x7')%lW%{:F W*!VRڣQqm7@T]1^.ͺl4>FDB)ntj!zK˂ E FQ_=(; [+ V@'-o~QgеaιaUyD~diL̰B ivl96GќɼAܙp4a B<gIс'<ÐRޝk"Ҭfn0[ݴZr~U}A}]Fi[ECʼn,+M ڨ=Bq05ͅ&~\%ՑA?y1jln_I`쎜ri\iċe(yN9ѽKK͛pe(}#z0g70IŬy[ ,4WY,D@v?Ϊt$)TNfd95h( C^Z8r;if_oRJM]&4Xg>m-A-V ,3P)BްH.b]Bn 0PYTd3QN.We6<=ص/>)ɱ0~ }c؂j4Хmɮh]b~;ތ*-)艍S1#DϫKO^SO5D 0urY'ҹǐ!js~sC߂^x*}3 [QH{SI;en"?Bϧ08lǡ-{ﰊt|Wp0u#Jw ?6ӗ G8.L^fnvwJ|CjW`K7+b͉lґONI/O E!V57B/Bk Itُ}T)Np 4Gow%JӜ|^Ю<6 bI{l_\bGrƜbf@cDHA24Ps^̜"آVE2wD9q+*ּvS˖֥8ɂe7(Q`m{=:Y2keICM3`'ܧx[k#g*%C a k+FLr=8 5>k\85wy p.3k`3*hLsk]=OXm(/_>l璖y:>[%nB}*\Uu-#J8Lբvpāty#p=c_Kl]'6rwkezf/D'Yӆ+pz>K'2`C ςJU&NI-Fkr!ƿX,U퐨C$f5(K? '$w)q22N۫ ,ydr鬛6Sd[-6`ћ.Dg/uC̪coZj#~svc[lkUsdyl\2a3O`p uoB~_{5D_Hug`iմcHMa%W( E|K9fDD#ETS7cl$CܐqܭP'}# /՜h-:6Бbv-l' 95arA aZ0{kUAIt3MQoQ DUDO0W#\!"EP kcV/XWVփ'oL:jzZA1PڢTIdݦ[$ύW ^~d$s lwCS7&rVs544Q1T\U@14(-+-V? 标ih+%>O-SU@<:s(RG!ux.fyW-w YoZ>!NY0.*s{?\μɟ CMYU\5+oZam:P$+AkM!&;*%(zcLM % :7;ninE"0SbVro Yy5S-z:ibtmq(P#1/g (xJo{vGb>Vn^Fn1Oa)UPs\NYu)- UYI})%ه̟@]FN)ӜPC +f#צ~8&Ƴ+^5ƝK`*%Uz|alryQgp쯧_vM%hXм7ό*u4F}C\咾msM?Ha,O˦D;:άT\ueCk3Ѯ!8G $BzH9EEe:@%ם$ϑ wC~iboӆjߦ &U㨀ߟwBHb\!z>۠q?<|(IΗW*D@HJuPM5 O 3/Oi;?ЯIs 3B\nd5* j%p *v"L{Vkλ^盙Yob1bGvIYcR!F쏹q<7=&G4m1],ZlF9 U :fBM<'TWŰc:)[af!5I QHZ %%.״x@\S,$iQ XAIKjYQ`}Ahk.V,E! ۘbwh GzES$!j=;NC[4/V ֣*)I[WGëQ A %NK"czr,7s84Jѿ҈ֿ_Wͤ (;fv^KhNsn9U!QMXh(N  F'\+ǩ .&$ou:(qS`yzuBB;= -883yPg4xX#[NB8(l"k=\Ǭk"@icdFU8Sk589y@L':xΟ3= Y77rbE!<4i y a\Hgs|!5)* 7g":)lb4=औTdK`6&_9[;XtABACSӇ\߳_@T99L 2M/3N_ f9t%CRgώDφόy|31.ln}!l;uX Mx9 A\4jo1 b@Zm(KC'e,ji ЋҖdF {+ڇ\.t"H Obqdq{Fva\<1a <\\[s:DWxz;ea&[1-; Qe\ 8Z?I\(~ Irb ZZD9{K&[`_'ٗ]"SS|8XXs1&A3`S3c:M9"PT^Whx\o;{y8m;U^sui;WX4BugY6 !vtJg0%;q0>D,Rhͫ}lx{|G4(2FѧyV:zr_!2D4V( j:OP b k&plEقB]=2 u\ݍV͐)8MIjҭO76hG%s|uRsN4AOY-l7堲r wtF4^vG~eW 2$9䶮TPh"̽CPs'ʕ'sWĢ$!Lr&Ӷ|t9u9Ry茤gN樭)jNof8x3㫅|{ ZD΍ AdI(I`Yvw+qd@**0?UNy%MfbtzLu"rU !a.$D7J|>8N 6 G^[ 1A.j#3 28 iC*"~H/5t'W}yEp*CTq}Ht8Vʿ#D҆KF{@ jbAq@4sp!n-J| Yƃn8ߖT7 vGDF) ` u2Y 6wO*6j>Zܲ txjc,dSRm|*͜c  5=`OԄQ3GtyA.S@Lp ?Z7qe%jaoڿg D>Q.f&ugb9Px*|A#rzL.7|L 6AوeH$+ ӵRn/p`XƜ8W-Z:ܓ8r] 4MN4#6 a )kkBج;∮! &%E<ߢhŌYFCQjif&旸2;l+Ԟ&EZM*qBJ3"r'u_8qNJHH~. Yt`S*Fyݙxs‰INWgPE&b/o'yㆣ9` 'G-#G.m**#zt =)L M2cӕϩ9јƑB@CIy 6_fHO.7?-cxd8Lwn}<$ц٢}LaIOwC %s<4DwKe'D:?M((M?eRWLZ7SJ=S y}/wN)(Sޙn]=o/ ǣy(ϙV. M-"Cũ24{3kuNGAUySי4uG"a!n9|>G]7qeEtw2"xR%i*UW1B?<*\8J><Wan%2A2:"Phman0VK '7Y̭h|k' I0q8&1]8vW;+`L=JS(GnlWݚ|U}n~FIqFILV.#\-B@4Io#.(Goł(k4EwPj深j5z]K!NnQ{RX02*YD_dQ[= #?SƁSvno6+\ȪXOU Qjr#S[8JZarf7Ug@LkI^K|vhvы 條<9!^S:x]tyz ؗb8@ ɫɌks32 lbM{hR4:w \$k}}gCXbe|;ՍmkD'9'%0 zٟI:L9lŒP[7.4oGG>×-Eޔ} Q򒙢7L[J{5k\s,2iۡy$#U?6T^tgÝsWˋ驨Kie: mh^ّ_\?(; l͐vc:d$=!S*"nKm(dZU($Z-v0%766zZ hģ3B[IiKg<<%ʩ7v!yy|K25{D[5g2\[ X`\ +W DV) fyjxY i@Lxh!`, V猕 h g͈d?j!ch9\Y"_1F7uGe|7~V괝V =;ʒn@ygN&^˥hxzV=ڿ̄eUAUhJGV8X?i>٦[ JgV_c'u.KX9uN0ck^4ܤ{yݴScp, QEGWbi3Mǘй?\[IbGQ=gR:{E6CTC޸*ieM y>$VO ,21ɔT7a1WY}$Ѓv%zLK-2YxŇ?;qK9LaD_Y+5d?o7aB1^>K[lݫiU߳1Tbku Z\O/h2ndW+3ag^AI%_Yg0o& Ukm4'yPw ygr)vpv 1a SIM N9ş<g]`Km.600*Fs/P&seDجJǼdްW?<旬?96:9xV_2(v Xlۙ8^ӿͅ<"H/)ۧS<\7mmTjQ6ҶN?X2Fn/un٢?x˩AbU/'vD^0EPn[*U +h@;?k|8X=q#b)A)`O`:YyҒ@z|d6{^DrK|c5 zFuYYP^/i,[ߩ\':}]PN>%rC)LxF\ȴli{n O|ܜ*m0/K"Ԧ1mICfH% nvXGەo\D{y C!Zfzg?Ij%û9m}A!λ{ DPv ͕"c W0J bcޣ.&k_.yWsuX"V}k>R,W3e~6F#6,OB~KK["W!BNՙy"&{)~Onu#z/muY`ޕ|f sz+cNpATSU$g䱥;{.ِIOCڳq|^]ϼeŠ)P}kW2!VF-6Ǣ|lnSGi\p|HKBˍdi'6yb7 pkg*(p*0sbw'Y `V_uMη;RԧEt$}Åx6[nqNo[qb%[GDEVWQ5TE^y7}!{r☬Gkx)Ѿf9"RR%_f>z'O`XyŽըq,`OA%}>+\j3MjLWNз6$lCOC*+B+\_g~/ǞZ>>a"L5v\FGpÒ%]Yd, ~FlI:7K H-h͢=r#|A!L.>bW5;unIZvj(|%;Kޠ!X1WK8DsQBp .t)2e6:|fǎe+ M7<2 2-!rcR]0j e4f]0HQmEͮw $ #OEr8[K8:̖k3|JY^(nO2"XN[o'm'"V+=-uOqIҭ~@8d)|$Kz%R ؿn47>Ũ p BKJ 5⒦d =QQ2Ǣ5 R6&҅JъJ`vLa?rAch(KxˑYE"5+ë»j+%5f^gU}Je~z2+S.]/ϋuhk଒(o~ v?7Ԟ6>4M9]:0$e1),X,\ e7W{_0Vt{ q`GO4|Y8ޅɉs?{ 1ȴj/_6bi Y- <ǠlF9jg[wڀ i v s 8{&lJ7Ǿ^rF]+9mu5K.Zf7'dV?򉨤n~EQ8L%܈ۢ~dI+,Nx詟Xx eEzXIkE` l)#ZPLP߷qvQ>T1t&:"tCr%;Z>زisj:9-ƾ2|ގUฃjd'D1`jļmQ{-I,M9<Μ(ɲ4eAӞp3'Jbi~F]'-ut~h'VFD`*t$ 4v~ݤl.rf;6ЅƮnލjS5M( .izɷ;Z[ՐZڲo^x ss0/^r 8(kDi $߿k#,:LNa^P™jm\ə1N8i*hX _(<џ|xCI ->7re =~F.('kd ٰܝM'3WwNna) >c?k@П7G "++X/&CVD *Qդgyڏ\8)+{^u$1DLJ)Nmǭ+X#Fժ#fxEM'tؾԉ Ss(;,| ]"ό \ңSÑfL۔ 1;2~>Syvr>RYOFs{ fQXlQ1E"m4!0DmW, WjA12Ѡ!"A!9p#QKmg/7qѥ_YL,@vRD:z7ن1!+"#Aq&t5ǯ{jc*js%#n%I+yZ" 4f-0 _ 'qT/f͘ yNz•)CJ9 iGEB8p}wTr}6E$/6d&,$ՖrH'jU UֿH8X=Pҭ=-ha8bo4;Q/?N#/7ZI0$R#1,HSr -0Q=L%6D_YrWB/LfM6Լi^;!BjArC9FQ]l)u1X –;kTo92q\參9ƺi03˸-JDjhWG؝ B_6ɑGq)Z}~{hg}9y' FRq8 }OP{@ץf=-ԳGwm egWky^،2 J ODT^cޭJBinǥ܎ Kˀ_,v=I9q2~gW%}:s,+>+4֔`F0UUbքBXk7Rd0FV!p͈C!'a$Ov{uM "IË6ӌɞ24xҹ7-]`'(y#[š8EIߗ&Vq=A]G ^/9'޷ŷ͕'s[Dv˶ H҂oꐜ(.کh׷ޜ Z֩$Un,aA E?`~bIj"u }&.ditkHjZ̟w伺 rd&Q2y._sf(,ZD1zX;uE3}d,pqjQZ O^HOz{y#eS+h)={.{<fc?^s3I4}d„q"o2Q(E$$S 1uՌM] \TF2PAm&b,~D[GIlR)63CLyP&"/_O>K EKS* 60ZC7µ4ɧ!{8@`HTĖxnؘLNOe`acWVM׊7oJ&؋ّC& ')1 ؘ™9oc(18+ 3)"dh1_ҖGq}I&X8^^?u clL/\̷}TdSXtc5 [/f?W{V:ym+UDR)CGb)Pw280HD:9B ?YjwTg)&+fbϵ ^XOQG>ݘ'g- ~A' <\ݒ1;j'Uc.U?eb3:(v4ࢠa)!.d)I+7ZsO ҢPh-ck~f[p_8 j[eL)ȗX6=r_"6K5u,),tDsyw7wԻĄ5?=oKH@lz0·4 + sy]J<|* -zZa >7~%T]:Z+`JSi  oJy{p3yFZ=hP!ɫ]VVz_LW s;d0w^?0Զұ\wƣy)ɤ\s# "j(3>Uw=Q5'zP]jΣ65=(u٣uAqjigQMW`L-8&oMI DE"w>SP\2o?s@U<8ay'Y1[-Vk*060D( (B9.\VQ)h)UQ-s8h'+A]2u~M꣮:V)5F~`[ڽU߼D 򭝉`IGDYӲ^4UFlLZχC8Nz׍dx6h!^Ȥ #H8̚2{iTOGt8爤$.@,u3͎ݦ;!oHA) ?NFNda6_}_ en]+)LxKm*d2&lcR~/q;JqjoTj$G+)PQ=13Cy2%s܏DAw&c!p_A5juQbYtFJd'WOHe> uIRO#''nt& 00Yl oR:Z*c;4!!~SI _G_Uh4Y D|iVHXԇkCru_!%@|dV/#,HO(9I hAh0]b 4Îބd hDҏ >"\ xm= 0 j Yם.5mbIPnߊkswӈfLf 6)*(Ts];>X(*f%tp3sKe8 b OxY}6RֹHeSO8ka uT>lHDžT9Y~69gjZ< ΥVrǍyzf #~3f* z02*7u׬OHs,^^|A.n *.2@sZJلP}zMD6/KF2Dq7[ N4Wd.IPQ ?NiG\b 2W**?;(G19Xɫg.a}zf:a§eFNS݇zwD/ iktݤgNsFy &ШLS6oixMXtA5]U |#2\e`u9jV. e?b>6>i UֱMq TwSwؘ6h:GI{~o$>2юQ)b&\FQM4xAaq$0x.ER a_;4 NW`,[Ã({\@M\ 1EmLsH'Cg|9yJeČkz #WC0ũrK}w5p@Akh}MQzA*kAْ/j˞ :}uM~1+oeKrU~) %[LmPǨ!-e{vPΣәHr>ZE<_)ѻ"Da[ /Du0 4E͗`Xڶ$x s.jN Owc9xJg :5).7RUq\}2M^tQ,&<|)z݄R;Wu `7EV΋> 4xEԲMBg|)V$?t6{O&7M0b݇;#W5H1UAƐW'z$.D+AZD3HJl&r'J5ٜbLxŤ86yRՖZgjaGbZtr ?ELКE(3nƳ8 nqf_m&8/yUɞdHcJ(qz2jCϑC16v&o'Mͤڕ/S'Y;CHIF.ܳ*Z6@^7E㭉MAO*b!E9R9u y^/; LQj)an'^U2C 1 :Pv**Dz-{\І/uT<+8)y3XFv;(&"%M撞Rq$4٨&_oKX{} h%MnlX-<@uV[0/%NW#,J]́)11m(!6y?nEF=/Iw82nc1}BLln'fMC 8UMC2ib!s}h/RX}Uy,1%Wb-&p[Ib:}Л jQq.e7((7 g٣d4iVD)\wS?Ed3S8Vmُ]=ֲ+ǻւt_?£b;;{h ~N(gNe S0[C^ ݧ[#̲l-,Fx&2@Ht P>8IincnK &uF'rj w!­ _a7E^L/v. >w(Y1G5D˸ޡ{P۟$=4<).LHvLEM;7e%=Zl^fΦ\ZiH397Qێ@C{Hюy!FŭL#+)r%!c#˫:rTh=9o>? p *y=}ųlA<5NSӗ)L6roPAfF7SAȘ!5 .HX~tgr{/qL{% iމV[2\uS2c=`!u`bf'^H5:+/4T.7~Ԫiq+gv^=\ pL2gI_tS>p/¡=G_ڡs(XG9գc2X2*ܪ7V/w S9P34Ш U+3r- Z O\B">cA><'?ܶGTEZ;!^Bx.r f'2||Ro͐IDY ^~Sr"h6m *4)pȢ@IP&yI8TFy L"_ l-8yYD! 9"1g9bz!R-/%T؇7S|Y[M(̆cUC]QúJ%/B$10uiI 3c1B/ HDEͯ6$pzq3maEn>=qgO'=~\D'ۜ,luߝxޚ?P J9bRB;VgVm pgV:4#ۜ[ɑ X)-pE s _I%D7E6a%5_K| bGd+w%Bn$=e^W%YF4 DB#l 8kb|(}Isiݞ& #Y>,wp<=lmjWY \ҽ7p<& |k;kw>鏉:yfQ.i=#T[NNCx|<*n kUYmpKa .g4V⢹}혌E AW7$tL4#~,! ӈ+NWnCu|To(}JHs$%ܵȱwCӹFԂ#nΧNDz5ѰGUA=o'R8d33z5pFOxo2=m_,Ͷ(^b򎒒m@5(.!M0z_4Q_eQ{P1==oyXD~5~y)48|>diQ:<i:TLJ+]2m0zP8+'L;=KWć` (LǁCipϫ3Œ!LXꃚ]"_I xϏVb\pG d/_] p' ?7=p)Nø->:"%{Ƿ( ?M]Bf7,8o |=e$58!}}(;Z'Kg Nw7%B&+p\Ѡy%=NޘEO0Wlp&"ko1"ޝH/IK7JVQ-Uړԃߋy ^kj: ;/i{h{콦[3==#i>ݙKTӸx>cP vz#tDegJ( aT} pm[)H40 _xb m|ĕ#X2l=<| LEՄiJ){M|R8<8YAK {lXt@&'҆ -Y}{-/x֥C[ nkF/v\imI2!F Ž.J(%( Jn}t5pPs QN T*$dxf3E\~i9(k o P̦ﳊV,&"emTLdll=0$ʠ(5̲*=C2elDU>SX˪ABO>h ;)pV@Q&Au_>U* %\هPetZ#| 0C|m\A&(N<$[6$F ;,f&{ h=O o|)S`@0Nj=iAZ:PZ1fԶ<_`!@=Kқ7#7Ŗ HB}U{]Ae[ls+hގIOKp8C"iy4B%0'J!Xꗹ)+FѢv1%Ѐ?ÞRHΈMk`|}Rg͒cY:LL\bOUyˠWU(%Ge p.W[# p3Q $ PuG" XNdTΆqHPiI)١]\^0_K >ݙ] PNx`FTy4d t Z)[澆kREf'eoǥQPv"{ 醷yuAt]wT`݀ `5us&yAd _O`V_ '{{YD\dCi>:r8cn8$xTTғDrholޮ1>>'upJ 4&yE8]uFSwj6#x('gw;T$C}kg9)EEF @OK yD,5RΈ), 2gB>rؗZdqO?eԈ'kȊJb3|JWgA rhd cN%<]fc<`,RxC |R\+2>;xVQ"E!v ȧ"7K}qeL&Wf Y޳j.@O6@حƢސӐˆML xKB##x%n ǁՖ@W(]2g#'xl7$"6C]Qi0FrwB/lR$>Bf&S! !'t\^`&av0wB7LzC* r{рQiEy+m3. 21r7F֩p7 mcJ4ܚxXV|IԓϑYSW :$h d@<‘g)SuqD%,-x6Dw6gf?t _ڏ\Ğ FМP’C*2W ͷS];94I.X"e]⚋GeIy ;Fk Z%3IHX~C']$;uK0f1ǬYʔ&oiK`ݿe)4%ZU ZW;:4f"چ?8J f$ヿwg AIVQ."o $ %~9&;^6bî%VUh3_95PN5۬S W:,/>Q`L5 Ω'2_W܎d(aÁ dci՜Gt4Es[4\Ke&ǷZN8x/F~`Xb']8kwetBBňE9Cb\Wh6ףX3v[D`uiT"ցKD |[ . z-sq(KolöbR.>Ck;lp@7ߣuq4E~YlH}Fr._ 2J" :qFƋPQE^3z g+"`蛊#>{u5:16sԨj; Yt }!\O!riq>?;B'B//S;! uq[PAvPxJY!rwӒ>Y¾t>0FVI 2X<-09eson HͫM1JӇ} 31CO{l¹#z6dX97sUSJ*\^m%tgH F"eo(^bh/ӧ%|lfT #"T5TBz܄$N UvÂuށ"Iyߠ'i |6TZYs;?mscol xcl(B_1ˋFdg&0*o;1՟ݛw822%@ V ;Nb,S>^m^c┯棽6e!WѰC%k_/WD#esi<3FĵZ^ϴrh3O$ԝ=1 o>\*uןF?,5ldcқbak {eJp2e҃S+Cۭ4d4{ՆoӂĂOlλf5ivKQhK7S570Դ۠1j\gp* _y9^8&^Y@5u|SisSsxXe'^¨ 1o9ys 4XJȊRgn}r lRWê :KGxJ{\UDCJ^hV'XU˸I̻ͷCxv,g,f 7GӐژ`0;dЗa[4tDc æĄNS=%/NH->U0/3&BĆ0O0c1GqZ*l>eKI[I{mɂlA-N'Y,HX=M\ Ӱzf* hD]^0S+ Z)N՚ =N]9x! 0+\^o8>5d  D+5TLslzT>Dd?k7>}\ U&Opza`tP q-xZ97Wm<*JZT*0 rS߸D&foyb˧~ZnW<].Tʶfo^GYo%~ =\Y9qCWcx-tC}grm-oztsPP*s>rԢta@5FSgdKs)3)h7QnB^M@᝻Ybqe]&"%nykKL/T~AѨs{%= ` w#C값=?.W&cXn7Oɪ R$C z=ǂ_!K9PGIz%{þhDW+7p嫣.@`႞.1’I;)V֙2HN~/j~qzshx|h/=]uzg}% kCar]XXnx¿H1ReKt 5gPx @Vk9U $FdF)$waz/^J; >HgT$M(FNv]d|cbt҈G5=^fEPUL{lS4 흧9@ WXW ±B/(x6^O°WY@:fm#l7&iC5Wjճ }c~ɚ ']I|k!bY܊ mʅju-T ݤ4ɅtZ7¿sGRQ9ɽբz~M1okOA0,"GbqyX{/9侥 NSnM5[T/tԏXEIO"emNq$5kQp5OHsZMgї£&CYCJ-n 7~֪H v+wwvSi`;[<\7t˅ɼjcPZll_d䲿#R(%]Jm?U1ABͪ.خK.V7SM'_f"hpĥ ot-EyHLbpH\KDB&55괥{1 ;(Wp ~å,h?GGGV!P<;0y w%Ee%iR*2V{*D.tM!Pp3oz%5'H(5E|Fg*  Caz.ȹkI{NspO0,XJg]ZbsQ 2e7ẘϿL>!դ6;(f7^ y!#xyPO02ݵlQ%Z8g57_;&6I@PS _"eiI*eMT1s@iKesBV3 l].Wd)IdC+ 4<o@G-LtIVTo0׋XbQ=czϦ|=~;;ulQQi@?| E^?|nm"4ۛw{DQ1iJ]2bȪOlԉHcɚ˴ICY@wZJv-1u_GolwL䇑 -Õ%wrK罕Fa\Q*?ߔ@8@[ZQl-ZX\S麪\f[OSyPc"ۓPwG+U_i}).SKPU擈cjo;IeZ6tw6o>*)#4ApZRŇ`LM_q5ǖ8PzrXʻ i\cŒ9ت$p'@ۧEycÇ,OIǭd.֝OG !N7KbtVȻ_Pe/u|#;Nb]LPð.z'0Cˆ;E'ULuwh YNL]٩s#.hY̴kUSӋZL_:ظ52֒2Zx1\7P&!hBCZ33sSk9QZnUKj ѷv`W cm¼)Y$Tқ95`| i !tBND*ķ>اd&UVKGŔ<Ȏrd63'oÒ4t6m˹b8ۺfݴ8f C % mA Ӊk÷XR~=#ɡۈ`Ђcy@bq+ `Crʭ>&v+uVIqRU' $BX. Tó o:6jj?*c=#}5;G㐵|iL=⌸ z*IYl@YM Y'3,`N<Ӹ_0Db6rǻH`yέ{Jx6x7H& !K8Vk*!ߎEc٣1Apq,2V27%xnxg4G&Ÿe,tc19iխAjJ~3.MFWY~0ӽLh1 >;fc7* S3pǀƱnHCٵ3az#WBfhUXCF? y 5Tpg>sZQ@tx-J$Ԁ#eJS>W=B(] 풲1݋>7667+Rvį#E4YUd/[j.Y@ĘuMګ+|/s qPy^"/aVN Bָ{b 3A5Zo.uKZ]JcS0ϕ(gt~,/\ˮ^bukNݏH:ūsnzsaE,2/j׬OjFl[7Q3 n<\4Má`bpCt:Wp d$;LNy)hT7bެɱ79%"GH8%p #;K`J<55^kP 3kV-Qq5&Z[QAE+"~\QT+) ˻X puY9d-n|KZxNZt0uEm.pRJ+{)S4Ap׃nQVG[҉52Z6N׿ 8!ɏo}L߅)TdB0vT,!>6;b?XsA'EƄ:@/A$WފRioerEC̚p[ ^XQb sgeԲ 8hblXxɁET,ԶY3Ո,rve2nIqn7=O%, #އAi*aEsWMukCIZn=SRf=5$q8e~dIl%-?a ce]^>~|#WJ4yGKK,bjtCzƢ' Ԋ^3hPwGhd%gM5QB+aUUcϭD&Ėi(I2 /J[ٺG1'LKNaW)>" b tk/d5]G *b`yY&r5&zKF~͸)bٜ8i)^q)rXتRYUfS>Sy@ $*2`/4NJݹјV&Bj!PޭE /ZZ7onvT-aQF4/& ͵5ŨHA6.A!7: !1 A~md3UIh;'ks] WѹohJ4WlTNOFI#z!Jn'y~AۀV21B?0Lb1oky>TWTlQch[tzd2]*jy¤k>3%E$ẒumD΂ff@BMt}$2[.iKlUaJ|v30O(+l(uc~UoW¯4ly0O?2.xb϶hjeъ?l/؃;'ea<}F.xiݎ՜ epDKAK7:*[7lG7C`Sę4ĵX M*^WuqOmWr']8wK[Auc4u/j7NmLE/o5*Qr>$hnAk&֟ EqC"r-AE: q'? I͌7Pz҈F 簴/0O6 ]MWҶQ=uū#™s;%Mg(\>mAP1Qf=o4H\sjEX5i$~_{%<>z67Rbnua; gr4v jq"3NDPfbWʛ/Xp@ӏ+a0ّbmQ<۬3嫮83WZ/k~|S|/V%s/t~mc eؑNkv*<pd'Xze}Eq_q8*ѽV~+>Qi%+٤[Zgx4~WA}\3i!AMm艻M=Ȝ BJ/)nLy EXRtl#Fw}СkǷ~B豊Bz1m- 4iw{sL4W+BUÒAt䙣#rv@2]H"+P*\<>厴nw 51җ]-d| G~UKr V_f7@ե۾%ĉg0R-9B}doޫ"fD|'k&)!Dj]1n՝;m):F&BI\}~2>x7%B6mljzŢ^EےJ.zByY PN#`6?42mpSyE#NMY7dP!ϊf=^ yG!rdz/s0#;N9+VR~u?0.Ş+OɦDZ3/)%0ڣ?t1 l>U‡]JKw" x'u xL2BalLAEO8syã;3Ou2ɏS|C%)ܾ$[k 30bBPu6茱AZ86!a/%`m;`ݚ}Q/Vhrt ?!|,^dD.IuqKl<ӨIYa_ n嚢N J+s8t'yN_` !^zOg*= i:xk7Fnӭ\}5ې#Pޞ0Ѧ0t`砨I 3 %ʧh7 /PV<-لYCdD s_X5ueG˘G7^U0sFʁEg)>`*]P?`iLe!3YZOJ 47_t*8L%- [nAnPi9ܷ⫩G<x4dl I;EǍBF0C/Iz;n!<byPK}IbyNt '8Le4XrE[ R|,'Uu-=l_N [}_V|]s$rD|ؓ4$0(.;bݒ;Z'LHKwY9`s Sh0 Mo}sB}"@0_zLOf2瞙\FMG j/UӮQ$0Trs  @ք TTHQ%5ibz+N 2vEBSqrP :v ~Iݗm&Н 4\1`mtBG*1t|Hsvro'%4FE#͍WKZS tO72J~1ޯ4a slNnP=F,Bќ'q幝X1dIeԭc 73Ŀ#.Q;{ߟSYX C[m&I**x6r Cj2גtw9Ox±/taao{RֳZg8SO]Xl6y$<+CNx$6fN(Q@Q9r:|$<5 j'޽>%q躣\rXثH먃}ˍhޟW=+zdӅOScGpҥP.q/:c-+d0K~W(_\<#:(nQ*{X{6&L'Ж}"Jgk ZR$jSY@I>q$|lk_KW6foyqW@lRlv̗&t Ub=KtH\4r5S,D ;qqܦݼz{l Cz|!w~< }f"lEjv !s/aj=BtG 11K5k`P)ygHF3[IX3 _st[I8]jal7{koJ_QYFG Ijl'#<S\5Y&;7;x2vۀ>XkRs zI;I9Jn%aZÊۂ:;TR4m\f ,"ŀR6_1Ds?V^ Kzn*\ YT$KUB]66ػ/>/u?8@XR}}AMN04t 52\qLzw q|}I*7eKgBpORoz{yJyg1/Em5%ƞ4QdJiY)B-DX<xKZH~jf0Ncҋ*;o`W(NEz7 8y׾Hljr8-;8ؾmlr#4>'R*(H5G͠ /Xg  (z60*R ܨ9헧S͸b&Yޮj##\` br# 77 Mvg7u+-Iy;L E+jFUtۭW}A_Q^.@wWyஹ}.O ӈoBiSߟ4&cµ$ f6zC=Eu\#60|RϾf")!GgJD`vK]n2@2i_]\ ,]:? x" y_w\{Na,G4Y&>S: 2T~JjɹeCU@e6ʹ챫_;lٌ’N7SgƏIO&ܠmC6=s\;A  0_2'ȼk!PMExFdg2PS$t^,dO^.'#ҏAϒ04%iHI.LpEe-#u$/HZL:Z囘xDQrВz9YDS)(5!k܃;U<$XjE=oI \*r'9,^j~N9>Kll8fDl!b]9<4ct.km k :˴BN^aŔ:̋*^ u*ydˎ)%C[Bq=Aֵt |o{B2X莸c/hHFP$Y=e+0**_DŽa}v:nmS Y&(>|l.Ok2&j0p@MU!k3ۡn~BQxYW38OIH&̵g *qC fҰ2g k9L"ȍA?Xh<*Y݌%Dn1>2/I^xuzܟ΄mw0=O{+Ǒ AZ/s}K\'ELod^d9[ <.@hbYy0=}c:\;&wb=2c97dcI]%J5DSѿlgℕb\֏/D`K1cP5(.|z2vb[_[lSni2V'RV̘\c+lYwbUTgmN`Im!|nJ>{\Edk`+EN*QtRۨg*cdnW)ml*8 VBE6ޕ>Fۋ/6D$WW,LKbyAZDfs?ֆtRV*Ä;qלk|iR L| *zo';DPhhAB'nW {IK Т᪓ƳS5;S =K\Ȥ;](|Nb *uhMp.AB'0gB5>MB-OuFүwR_ޠ~j9 W.r۱^M@H&Z&gR7i@-ISU5DXRw͊6Ȕ;&ʞs#[>Lo}pnBaGіx}*[k.]AnG+GS",w,2Ok}} UP#dJ) 3^㨁xVtzxXK/C0~7l9cbH>9vTL LAJ'bj˿pԪFȸ-4u`ba1kRAX vJۨ,D颤~Ai+4StΚ,[ H"lBw2h)N\>+*ІSa$d*_D]'!qv*潘T]"CClaQS4Ѱ I%eǝ"0vDT8 !,W pf`N'{пXפ/攜Œ(nwZf9lp "B*JCO;!w\@IS`uEn5 S4X$N+crxm'<XN7dٖȹwT F:9)Ԣk`XQDfHo})Q4]#ZŎ,C#:$_i&(AD6\‚[{b}u/PRhy-cG9[wf D-nkv=VOTrMQv=A *#,GT&VBc]k6Fj:UUzwCп GU UzP(\;@N@͗RWU0rn&d MˍѭH;^fݠnɫWG 9] bP4oX;|,d-@z*ts::<Kh9 HXݢG(z'lJZpWӄM~Wꈓ/mw eʒ.(ti gj10pKCNX06*hglŠ{ܑ xA}:p]B:cKk|ZTȡU'/T(/8Q܏s;tV{V495nSkb4e6,˳y[_O\. ]sas6\y0}p8T?eY6Xiﵤ٬ IHwkNo%PGroa7dʪrG\jY&?+A-JFѨЂBvYjzU:Ӈ{yT%?öX58]-Btp&-XlK.z Qjb#h?F;ͤ1g|J8nE1CL."e{6u'*J%v:yu4pt}%nCe#B6{S~632/8q?~]G 9htX)ڎ\&+g *F#Hֈ\0q΄3+uaτOyfn&tD'#e2 k#1tIvB"|O+ݹTR+e:Ԙ=كy_C&Cw@UuIKV-N$̀qoMd!Wm^1Ak `/~Mʍֿ{D ~aX fS|2*&fndp&]V0 {$E;].FDO b8eh RwÂ60쬏X vނU޲l"y?K{VA'N @oJp% TcI+"_^@V@{FN1̾ (ZSur7 n:jwdCdCii/Iޑj}Ú%Q4l й9}HYAy*AS08z&6kouDdQ,Nr)oXz] Ik)gadAi:˴]/6v&'b%g+Z1, oKڮ?9%ۙbqdv0fRٷɁ % :FxWWOѰq+⑃i<#)N}'ˆKbˁ,W4/9Tc/ĵJ.-uüYfC0 ܃O\szxХ·*FC:I_H(IA q.cw!5Lǔ픵O@a,&%qz6FZ WL *2tF!x." q#e*=J(S[/źey\> Aɦ<-y%n yEr&'zeت?8~֞t C܅ 2deḠ!3m<L(DO6&*ۇ7~#U3s*nZ?zICJyT]HU+v)W9bi,7MYXQV*J6׃2j{hA:`Nm( X5! ;XS>]3aDDvJO3\o|*g2j#cjje.X4MmOw,Y /,9,}y\R\VD( , Ց2x%etxM4 GWț>=On8I51l9s-LN- 4:|V-0T$/vͫ`Lq*O؊QiPM!+.E\~̺F)G1ry.drid>>{ }oJl)pK*x5>B8@-YXf染ĵ=HUM~ԾWcK?űlC0}0"BAp$ W4o8lɧ?kQ.暣S #:8 =7F0[5U>8_6`T3Ŵa1P]gXO0$ߤHKt1+B^,5uQ2G?Bu6;xC5Z+(ɩ=ee'po!TMP1 JtmXtZY bo X?*.DwT ӖY=k#でjT1":B|$GcN6ۃ8 BsOYRUX?3? } i2*^<|cic-~B{gt`TxhQvΉD;4L:U݉2a?p4E#}%0,%IJxF$Z=BߣȮ@]RVvxaqL"\v) onQo?DP脥BE#l֦^4vH:Mղ8|T[`H] 8]"Nm~Z5NѴa֎ϔ'S כuݕgz]!&1(3,͌/;}Enݠk#nyI ]ZUo 2EN KV)x?Bk,6+++!X2YMNՍLW;nHe~p^iax@1%mre?^<:p0?TW38bs}*%O܈}Y4?g|v*.īؓukWAdgk&Bb%f *N[A,)`g{sh4 à:6uTcA8 RU\z<cLo>\EOqfRQ%"Ε^Ì~)Ղ ^+G!+,l|p4+Eeksyp} +<16x&L>ML `q0TFy\q$ 3E&h#ITGOJz ǎeMf?b Q S~z]-w4

t@GF.(_؊%~^ᤑ&#~S]ԕdq`U%|"XƣjZ>C?68a1^lB$dV$Ӳ-3:=4#_GWZ ;ؿ.wϒDxG,:T).ܟn-{ r)ۛW/ty2]*dK l&Ɠ)LHmݡ2G.7=i,k]5#|d#`qڱ_0hZ"N$^z K YOC·SGKb/8(/ZKhlˠW=ɛ1gIHjy*?k3s@~*:iۭ5`;W!̙MK0g!2 UX*+lqi@薛ũ+Nms/6){6N0s,PoBc=j;840-? ȈxoI :p.Sz. w<;'WkńxB|vn >UOkSczR(:q75G숯7@'nlY+ j1tYE8eՑ"cDoH1Щje'RiDvO%(?sՇI5E(ɫQ))Й&0tc+I(7(?{@1NQU[X$X<]`ճ|ӆsډɿXfzt*Xa/nL .eΑP*u(S;C+Y4 F|q RZ(P*s{Bok%LEBMu}ɛex\ 8Qz12)kTIvL8oI/>v=?!=#=ͷ5Wu2>V}HUB HASkBb>-ov|yIxDO("m d&ԗEYSbrz T+b_,\a]'_ Z:B0-BxI߭+N0B\_*&[;40ʆ]h=!5! œ|Trs#+USW wF'RϕF"%"O߀ :h͓[--C-t&. Daԭ*ddUݳe"!cQҝ r{H4 ?o"m} 7e -oِ >h}1B2 кn;Z# I='RL6tYt;#_~NLBpI}aX&wd0P3յ%~éCNfXT?m ց=IsL$ua8.wܟЋT=qK(Npʉξr(Yjig:_ > f-Ђ@@ھVW,L}ܩ?꬙@Ђ kΰvcޗ`!J4nP dګD7[^qJɂF^;4aO=u@^J[љԻ+zxz]~22Ρjg<Œ9RG*e*ޢ. /:o1#Ŗ8z 6~sE,@׶ubF8zp  <^z>`)Ļ5%,\hx?)S=_nMEd0Dٍ٨S;-5XFZ@M7AEmۺC j ½et5KplZYfL!Q K`bН,lbRBpܳH[nsp-nQoքr.3Z,_{!Bo]cB; G،HfI] Ҏޗݤ9v&QTvwu#…2 =85:=}|o(\{7=bbD#EpI |BԱm B*ni܆K|8PzJ_U]w-O>$|Yӥ_0ʔm,u+ iIz6gۡhPBK@co^tS4n(Awf*|u^1D#iYZlQ{2beC% ϖL nTu~$ ׉$~sj|y:1@1dR> m2;} iKyC5Uyɽ@>|cM\/ z:ʆ&{Tx H%"׬O\A 2E_YßҪG ٦WStP$(7'>㇪ı2xh˜n7b1RE#U/5CKotf>YWbdM9९nb\=/MZ,țuc!"%g?K:6;7򿩱Ug"}m2.y^6gЂ#/XGCt9i㾌 Hj,H!}f~(5j-̍JWVOE+wУڣ;i}nUX%^%)zFGdY,|Uh!zFmV$ FL7PJ cn:Zp,ohdwQkv@|׵ƿڪj?dB6{`M(ik "W4X{"yGob7";O9$a-+mg}$zbuM7Ϥ@D6E92y u%X<\ LNv1%hkih`pWOi]PZ&ܵ%{eꋺ=|azOh807HE-Jvlo\^Q*euYkՠltVWBؘ땩\/')V{CKaD'og.Q0y|ۊiM:JA6>]?hl N9B=KWOsQE~'( uC" yA8пrQʝq`SL_o;0; :U{N|KWOLS':ItKLe7m)9Vv{RimC&"~+NoUg݄EnakIEYf>j#'ju Ҍ[xpB;B8a R_OZ ߕv* +/{r 5I1lux&\Ґ^Ք78qE[fH3w-H[oGʡD@ O'SVo⌒RzgWߎG0"xs(LBRƦ2Sr\#+2A6mG{4cŮmAh?Pg =}0tՂ M.DR-ʙB$ 8@~Q6IHɒ(ep?3T@ GhcsRջs)g f dx;ekٹ͙5l H%cEs9Ѡli`TL7ag|JpdCo3P~7`A`|WEm{7pCWS;(M6=+4k] !08'y<K6t.|w#u;AF'>L^C̜GZܟ519W-Fm'@-W*hy_+}=rkkLP_D0ޕWuo\zY}ȡ\SĤ?4"r,h. V}B8/B:I.9\#"i'{9?10RI2`F;Uor i>?P V8}=54ʻ EgD(eh_z65;qzSn@a2pjבi?yAMŢ|<͘Hċ晾 [Xڊ<l21J/dhZhUBColvHGOYwRU?OXΨz=n6{EFļlm{Veafu:Xb޼!8n9k::7pW,ЦsJP]ױY7) g߽' \2i,zI$lGo%gYmO CjG #˙}(8Ԓ1ަJ+J +>CF=KEX|nl} [,q"NQ[WW k<rΜر}m !ɹ>\8>a 8#) 0/R_m{agC}״蛮.ǧhim[._ɕ5/Ds>ъE?TYb~T=% ː/dK@.qR>jR+4]9C-!FmF|ZVJZZ韷[!iܢτ |e]أdk&eY@+b= ȷ봱}1(`tiKv>'E-:]= AI6"cn\ g&z a{2sReD>Pu"fXHwɵݯFҟJC:V1p,RvP\&R:xc+YH3DxIw5EDjH V~GvD?'Zhq 'Nm$a#oL)ÕH{)WV*J$=rg\Klj2e $Fj湗TB&W$I#4$=ZxYrn#^>Oc]@EBi97yvRaզ)*WwRArē=qVFG]ٶ<1f>6`fۗ팅Y Z7<ÏE4لP%K/C:|#Li>1d\yJَ.V#ӵ_TdzP;rz-bN9Xt3#/cЯ&pzͲlUh"R:6]M!4_{v\a;I U4!*c(ɨ$24F$ mԟVtxñˁO 6BJ^+8ɨ6QW)%>1c:daƫFx+5p <օA]3yqn5;:ɷ>XoLzVR K^XDWd79I,c4*RAz9`TybOf%>òWl V9{˜՘sz~,[FKF pIMpTW?hn"M;_$,O4 %QƲ Y[7iDt&}/'r-u1,󂀸N'J`AHeέsB!  V庣lvڧY./Lެqt52i{j4bfF.񯙁ןꞔ*@, &H{+y=r(|o8㩇]ޡ ^0u~Iڂ C^ckr_95}}N"̴rfG-()X{Bތ+8Xy#<$tY 7y'ֹs&rn;M A-#1Hi0u'. e z})|eMDs eܮh7T_6) mmA+ 9}J{ kggeB"-ZƦv#zts@['sB}Ɩ4Q G_\si8g#ǝ{qéDTM4en'mjİBMp0#2mmAKWr ೻f@,'(ޗNkѳYs!s\>%>uWz\ >׾E<jS)Uh x5ISg9'7^ 0X'pd kv%Hwμjrp3+'tz9 S6 >-;A<mzJ|4n= /aAxڡjof) ɟ0xQc5Ȩa_S|7,gDjݣJ܊VluJ /ڨ m!vw)aLTGw#%Tmf:mc[6\vry#c!צ_$p &.g1'|ϓSzVUpYWQ%(nH!4>Tj11+ gİ{f e)ZXQiHyNC M<2x"#qp< :R륮&scC= %i\R'R:8N;\(&[ӷ!xRNʔFPN#u7Yj.Ȃ&/4Wq~:}"xfs?M7kՖR7 IӱZvUNkz[YpmໝPMo` Ļ:NXg0.zI'* +?Sz@WAP 8wj<ҭi%F1J0-+"]%^B}lR?iWxdҟ`I1A/fx&Q)@VvTv%RNNC~U]65і[IQ$\=q+,=8&%;ZM \<O1 P 2"kU0!w.y@ ?U`!i.CjPLE>ᰀ3K)"6󺾆p>wG>J"GyD@zx u#ytP_*t٘V5zONIR޳~vb[uU3; |J}Sdds8&5PEp˯9ދ:T!`ݟ(6sbl)1;k{@2ԖeBhUu^PUhNpBmI r%4`._/"! ucQqo 6ۮ 4=HЃ=56ucaA}ΑUST\MFЁ~ U5`@WOUp]Ւ(!Uz.`Ș@7&}n)vù@R8q,C=H;E4jz Y7Vy ٮC_Y @hxؤԷrUe !xC6_A2X>^)bq)bl 6AX'S`rbMX3T i3Gſ+0W'kZp4I;id2'7a7P#PK>ڤEGJ[NTkҒ}DZ@Yp꾸~Xc= +ԛ+h7Ʊ'TbOAVB6̲hC^ri)BRl<!PIXip;wFg:OK]9a37J.o,x1[ C4h܇vS+O251)F69vIBXWP]zL,5I쭪yϒC2$"rJ"* ܼlEe~݊&j&zH;7늹bBNw 1FFL[8~jd,볙7lOnL0gӑ~Bke ,.༬xS@@h sA_wMR$)Y{o4]ٰQjdtIc܍>쁟gꭰmv #}s[?=-Мo0̓pBah dTӾ+A7\6Qvtꭏuͩˎ b: $!o\?y񨸬-WKg}GCOZ<܃308TpyMbG cïugW]FaËH&.jO\Fl,v([d/- L_獗bl&5O-;8L k Fp:GuE; œw/gY$ȋ$6t4/sJ"!m&*Ockȗ=0^~rJ)brMU3a["-QC0 Pi[u!la/a5Ol;9!*_RFQbS1h:yTHװrt$ 9l=qTH6JpQ`؉`yn/~=& \Gf`@׍(!`u/Չ+2s˺+~ol\_%ZsNR|pzJW> ݞM%*< zbҸ,,2y y'zȂnG4:C/=`|xM%LPψB5Z+dXN`(zI6҄?:^1%"p3$ji˝n Mƀ%k@)RB¬+UT]bH1xrgpѱ5rj‡8@Gt]pjR+]\/ ߄yAxaD1:'V yr6Õ>HE`Pk=ɖmGfGGf6y!مz <ϑU$-2H{VT.OpFSbKW]O Ɂ%<{V>T ^  sP֟PdŖBaAG=ݷMhjD.K%/q@Cn*9ږg%?E?a)?^0kYk Ƃ~%f=dz6N$Đg38e8PŠT])`#Ҟ!L)qC"Yc:,l\WqܲflFXI)x"pQ{sKrx߻j^?WtYh8CeqnV|B`pڟIƌ_R>-Qěn[L ??{hs47ξ5*َ1XTBkQ$gE9 Go &]WJEkK h&o'q5oY܌}U $êR=r YuSC(fTIU:Xa̼ݼ 8Hfn~S:@%RiGŽ;p0 Uq2v=;qWg#`(}0ԗ/e 1`QbZiHKAK `SqA 72dHvYAqGpՊ=¢^Qh^:j:S[ VM7̣+SK8j0 e0ǂ6|p&Bt(` Rk?^wjYRݰ& X7x6OSfE=;V_C";gGkB)KQ"8 $J]= Z`[W %`TIvSPp?mG_:62]W6JI-';\+Nm]ZgfnЁ_FrS(bw<O(=88֭g:?}NэK ?q_v]t2avn1zwcLFv.E 'lJ -@H4s $y&^<_,ߟJh_ *^=¯J] ,}SZ*&g]yzP=c]sXkh!IKe3鵃eb NՍݔ("GQx: sB/]qz#0>M,;;,HZHMi4P~J1_yҘT4";M.f!.r(, 1/_ ɫնvL j:ZP^yCE:J\gYrEFZ32y(MhNt5k檫V5mCN3j5lQ0e+!ڗ>sZwԀ.e?.j0bLj;%)h~ Xy$+)p'.o(5䆷!3F,&ZZTPʈـQ,Է1ö H]b_\:,^L6i9fIcZ결¼{ ]뫩R-l!&?Au` '&/7yMU8T2JlʞZt oxTAQ7Ă% 4,L%Lq1 ^x&lxB,|nf<  ]~%RJ 9ڸ? m (8!/|CY[BX*DiJHp"zH~hjx/lyҗϣgC՗riy=b~!TgS=ltq\GQ/r:gC $?q20 4z&$ھn4yr>ⴷxO+)I:ckaƗ 1;PHTw\XfhlЏ/b}#װSe7]l#L6_>,Tavִ5*Ij,G⥿S+P|DҦƠWH `%f;S]资LOcA@7pP=~W#pa)m6|RE"V;]$(y&bew.0~V/=WqV!jF'ⷍaxr$r8,lv#lMx*Bse޼T8I02JIr&hN!eCqQx]'7(ܐ=MW-#y  5Wl,fޚS! (9yՐZ)ӣ C!J4I&k [6~9Oh(j~zlkGJ|YCl1yA/8:~ pJ/9b lKC ]q y}K HRq8$ҵH@h c4lB w'ǎ sAxK6C@jaeJdCPJ낻"{M"`{g(|c >K^<( x"9M.*0V 5[g7G9V*6^"(ZsԓTI?;ރ,YDϿI"f`?|rk!߮ ƈ)9 3'[ }5r|Vꄧ1~-כ{ߢ"xt7e-=xKSnDlJs0597B|dM1cnrѸ} 1q䌨 <Һ2 G;XDI`:Vb"[D9`2YXI PkA뜼_pzDʢrV 8_(M@ q3(Zr ً Gj/33DBZ,(GA5?5XwLdI\?OXc(ɚf@k7f[Y҂MyP`p4k[Hw:wK"T*ȖAY6ɷ.15:aSFѫx ۳>%ɏcc.gk=íD;#w6歶`95: Ba&|~a<uL1̎q;hAJeDYc`!AY\ 8M sj%Aʽ3U-#tDO55d&;f`Xޙu`]#Ma"(st{4TC~4>o5ʋZtmM^HGgzIrs#rd7\&ȏ)MhF2C"zّzFD7SDqù7SX@ʦ0/#_iu9hJ#+?9PS|ERxVcbF 0W: E18/hmˢ<&1Qhs1eY!wĻ5.}VoL qw}ؘg>٥+?;Ah@AIDe$FTwƋ kR iP5Y7^ g꒖\V{V_*Qq݋. dre=M)[۾="iaeb]'b(ر"y@w{ 4NWFLC>( L#BP)@r}%|ٔ4"~xcq* RJW/c68}xcBb@m#G)J ^brˈN#zJď5-(*NR??㘟jĴ! FXư9(m"IXz7v9GJ֣wQvR1,%8CQ`YQ$GEkGRw5d]"܉$ (sFzP!Q( WAЮ)%L5#(D\i#w&`Һ}ގ΄K҉)oޝ v%YdT>kGxE&D&W]S?1˫JEܱ ˆRQ`2Eǁ,?{j7ә4\>,H|) aH=M$6}2wHGX?GsOhouaiԹ$bhNd˧8$*8וqjdwxƢcrŴ.騰՛DQbVbY^fz:}5) VSn~KD!fDmN# & -Y9Z&i5^7EcaIJbV+!/T4%'cM}uSˋpAm,K^f^*K̉<{C ["p"*xJR]RSu-b^4gķ٥3}a<>{x%?֏;͙ɢ"ߗ=ƒ"'gim\ f`*Hp\F|ORB%Q)nCL' o],V8S =oJT%ĭ'2HkC=X'$%tp̒D@$fU'"#2aͱ *.y4<۽KN |Qj^CYjJm~ k[&WӬvW~k޺h#8R9tK\+pui yVN3^6K:t!dyJsgH;[Tv01ż4'1Wׁ]Dkk wJT98XT?bRq )1s4/D=*Aҁ+, $A$ly*Fq "YG`p.EYC<i.J!l.ɆaxeE;W䟕ݠ2 @^e߬k[fFq>(f QIԹw_wiVeip :Ki2(2hlTR ,^TKZJUy+f ?6d%JTpz:"OHN?P%}(x[U|P~=ȒuYH|XBC^\+N&0H׾ R^%P~u-c} e,ڝm1c0'&` /_rmؾ4}15sĿ ) q3(?(S3 Qx*HkLX/`ʬQ_K9䋰 jU<]qObbD/J2Y:re3lڻ'9Zv4GO}Y\7G4_u{ʡ1DpR=,BMtSHtw4g:<%5}%*r%TzI3hy?9^!21Q4tc@Y3<^Ė@a#R'_  5귘eG.OztF^e#8 C %wkGd@x#=}`e&:+9hSSŵ_u%j{rim–\^+ޖ;ҬZ@&GuW J1m!mpRgU'#8v®xFW^:|@"C)Rw LjO>l;Z]3,>9c$k](Hm ѻ]ik>_l0"H\!T2'MTL p4m*㐶Lj] b|UKDQ(8djs)|} & scjԁӪ|}Tj9g jpr5F˴+l/-ē-XL^ {Xgl< =:\`ht:tot'pAG7$k8gQ׿,U{޲-3Z*Ou~KVlSr_jDp mGIpD+PO Xyz5N &8줖72y|}} amfɛU8S]0<`& zR3ٖB^C'6B( :}G+Aw_L/VPZ6(v`&:sRx $[jo$`c"4Bn}i.!$M6zM|E!\D\AK_R#} kDzN/a@E{* VfֳX6J{#Aơ4´7_S fE]u{nx 1a1$.9?{X ar;p$;ZhXB2]Y6@G} 2=tbݮ %,f+}^zh0,~*lwH ʕmHne!aKj== $olya@GYS6 {oh3p,8QQCj+GNn6^u l\Hc)3ջ17jJ 4SETXtaiD^aMJo)qwr;I`pvW2H{ۄ,;Fz!m՚y.q̳GioQ?pxc0!X++c-:PLwUv//-F1˝5FR7T^6vdh$Z dtrQ+b$v]kaN87 KS;F9u9342OQͫQY4}BEMPa48vE}9nTۀxl0j_?Y}V 3E9OaE$7/%4q6zalf ϺCZ9uZ/e~sp4X#.\S e&EQ}Kr{XK-b8;.$Em i!n~bwShPu6w r+l_~J*q|x$\Vi˻cӶ x$3 ui y[RƆRh HνLІބ:7ۅ{StĊʭ(zH\}Q?IoYxPԟ!J]pw{yr \0.[((4Bۼ&.r299X}V$Q҂?AڦWF-8/_BsoHlwi9Ȕ:@>C}=vG,һYaa;M8a0SbBuY=DjJCݷݦ>isWn%ˠvq忈Y"" k0!3sϷ*o8w'7r<~li2¸ V>kF{C..QGJq_4%KyEٍ㷧_Fa̍>A%iZOHtjaYA2l n ԴEɃ]d\drZP9[ b fgb%SbmWsvR!Oxi?v8p]L=|JWGgv f+#Ωѥ{m3 S@ q+m; ({`k;3Ls2'Qh1{H̵[n ztGL--8Z(uH?m !9zu-qp_d%\MD/J,=y%lعFȭ"g?vTU)MW9=DV/=jF8P)MKu7TQ=mӤ!˙}2/\OܘJ- \>Bֈ6iK摓7$[V\=XVkw4w>+a.7ʜZ+6A0>RK9RБ"mci ƿe]fl~DR+5:PqPpvy(2q'cגFˢoP>E~mSVe2XjW7,=}-ʰϤYҊw"? Ji9ز9N'fMXG4\ ٍ1c `Af J)2.84= 2 u }j :ac)nl2v"164u5G8rޞh7o!%a+'a瘲%r#e(v-*W._Sw{8BCA!W#a/Ľ\x~%[ZKP.I.=%ml44Z~K;oyP҇]փ1T/ѡ<°Z%³LE/I°G(Mq\|o5i44#B^B!1%DوiH3(6ard/S.:Ϟ{K1{1W9\j_j{>."=*i}X`R1β,50#+ aj8< :sm_Z>&V '8Kb[ ރ;:N+Kr l'2i}`(Xz「IH-^L R>BJhNu;3o*yNT"BEv^V1 8cEo6 t9HlW[% mkiYsJcz RqΐڋjPPyRVXvam6Fl_^M}dE# LWsm,A'*:5x^VͰE$ukDxU=!B ĩNcl%Da!wxṞCNTA#}s{,jAF)NͿ,Ca[l5sbYzV(lJÔ}hM9K E)Xބ!{+{<*t`&䭪0yMi;6FGM'Mӝ<,ut\;cbrV0}|c yGD^x.9BV{rz7P2d|nMxkD`X|;M༎J<Yq\oؕ=xSؓ#B쥔~Y%RO^*ޑ{rϙ_5:Kʎi*>A~%[gq4ZaZZ;|)C?I7e&lH?ذ7L4}C=%,3TE)EW,9jRe> 7} ƃ<Ӟ3"θ5y~fN>a_ zZ @ʎBFЋ#rE0nB=VD>ݽzi{lΫ6 "9s]t!*ݓnYa/Q0epj)_4xڽ,/OnnXCc?7BŌ.I.];@"MgdaLL5J\vʤ`b_ k~χX^\TC 󍛗/$^zhl߲^>kfmqlnlE##<[wPF/9MڡeNY1h@n?HoQG>PJQ(8r S3C-xAx g6tczetdkRYs&Z6/^W@Ƒ_{PG}x]ETpeT'7vUDhHP3P,JF[f ;^ϐ Rtz"ڰ.Q_9$4S4Rù0dK5l#Al97v 2cȅ:m7-[XcH[ύM2.!DX.aL/Y48NF;,=򄼹9ELΣGt)"F7bF|?}88+H6+Em6L|;.dw@؉&|:IYƬbsˈjJ U~R\i {g|457+ڪtC_:,8cOnS,o4ejZ6Vu 2Jt`b2U?^\wBv+Z8;v:=>LƗ @B3ӛ(oVSq-qn5OˋՄV68G~ YB/5vOؖ~koʽiz@3Z9 .?[dkR.pzLPr%uaѹQ@ OH>˾1s*H6z }&yAo&PTx+_Z:#B}xuҿ4>5%ǖkraAG_:?}ಯ"h#y#*H9CzPes%y3SK˲Yis𻗛W^2t!á6~壥w {Dm^MJ$[(ٿŬ x2gm; Z8Ăt$)FNck@|zYb Dv(hI>c܉liKqK/C8M'&#&Awxb#NB%,(km/~őul#t%.~fIƙ'F |yi++8Y*u]Eo`f3dqd^j.ҙ82uӯM7ױd K*(N=Ii1F|( ]S4̨G8 ^#jt8$+r1%ۛ~V#у|M;6RQ0KV>o"s5FW(si>_Tb]ȪuaxBLϖX??'^/I-3!86nզA-Pb51Ų`/Iuttu.OT.STg6ۂTaVXZ+#3Iݪ4v\lj@s3WU3T Q.l>"B9a b7AGm%q[%OwCBSǤZ8oKr:(lγ"R<\g wvsW^Cs*2yKPZZ N2擉/tqY~;_ee ׵F&+ "2Z!2fNִd ͎ͅ~eNj*)9:͇6iv޵YFmxteKPуM`4U$LskHqӋRӨDgU6Ţ(V:!CfHPz}g䲃19s[i@hتm!r-;m~ڄ0Hgs&%?@\Kaq Hٷ\mTxǼGa%K ̓~!A%_3 ".ajQ3-EZnEu}3,sFd?ߠ0g/8&XZJv~mJG# L3Uv͝}$ΌW{%3zFRǴOtLd>C?I#_<|7fh@-\;Y>cc4Jt+c9caF\+3ik=jo/yOXiGolYך9 gxEhڴyw >ܒ(XAaЩIg?ߙa=ܓ-7#Ȁzy֋#^O*u]䫅[*qVP=K/r+1\J1A _O5\0zWP1[^9#Ys0׷pr-c dqw@ۄ Yd`KAHN8N*g}Θ cߵqVӮcz.Nb*Mř"ױ}c! TNFA Èmb(%,5Dlb`J'aIهPA ØџO%T c2̫Cz)l\ I0voNͿL `in*=^uQ,}ҟ֞cz2SOyr-9$0.~T0GGe g2[?CD.k^҆UsgnLY Fxd8NPC:1Xqo:IǏAZUiw75 Ctd1E+, sqsyty5 EK<8[r$o6 ۏ2"z6ǃFK%$+{D-qug+wbQy9N9t cnW(X軡gQ}–Tt(XTSWFuCZK%qh=] i$+bFɈ4,dqRb[|l6!uE;Mʐ zxXcVDH[ bpY#x)p"G+4}*Ñk&qԊ6G-NU2 =ajQ"x<nËMk.qȄD@rCx6' _/E͡+eJ/JG_^桄"96ܾBNtv]K\7H6z}/U_ &?} ~D+K;)PYl}_?h 7 {Juo몸+Y{ܭ9;Ւzջl#ѹ@uOv9@:#x,tM0*F&/8ZTdC$y h#8 EYPX`w9Ju媔ܣ1e(XUo'"]>G6I?GlB- Y7+\{E 7{=ZVнNbD1m}:ݐVU;xT+&>PKVzx-HUCGY'IuFØ >NR'#VFqR<+ Ř `0a+9鏨 Ӑg&rMϴ\b@,BQ"D`#ٷJ.1aC"q`v[֧;Huт β$x(ؒ @intxv@ьX2 O+pƽW11M =*zlp oQԸl "9 i861+ a-5p%uçQMP-#92g*ʺ(kzY>B V+d\N:]+ ^CH5kY]©Y\EMZK쪲KCڑbq-b̀3?߮jƅ_qv&0(](!Q@\vlb䙃++ukLZ`BJ+luU.2P'>)hz)_sO ѾH.fJKɘVQNpMbgR{d91=ןtd8q [uOUxx꒫eʵmzlaT-4xyk&2A@ }O7I}^+T:5bx^'d Djקxk)Ua|YUi y/.wMn [PmƇ>D(FWNP !ӁL ,$w$=4:1A5RiԴÒZs3f{ǜ:lU=;UD(q~Nө{aw{a~/ #vkjec,Y~߄.Y !^&{Wi2j$DIX1͸o؝H 7xPaPA\XTCxzvuR[|^HJa4|lk᨜Ql[oq. cсXlz'[RɽQ(|8F>d ^Lk }1׶I/'HP, 0ULDrX͵hQS}ɀ(rf]"^핰4 8ʜsm"tFE4P& xqv^B;+,3%hr=9",Jp#W-8ߟݼ@h٧ "&.R]˩{ 1b:(a5ܭLY %-K(/\gQziRdaWкDh̷mI clM˚}EVjtr|yЪY,ضz}qsăkTUU=%VtR==q`h֏M_#50ȮwSݪ򻮑@hrz4(THVn˴Q unN)+8%.Bs կP+!}7H&,9z@u\Jԙ .z?dL~Ė]4O($>|ӿ}ȵȦPy;$e@i]$ zrl(栓A 'YbThPN]YnǽbY\9 VZ(p޺(ݝoFZFqOs[uv8n"~h~lҵТ1TgT܍!Ow((n fy;~ [QTЩ!ބYlAe8NjiW#6*tk[`K!P__B0ِ٥JJ*]֍EUFAF;72Oz> :}PuHn7dScY=kĵԙ@ubɹd9BiݦMӲXwm׉~J^A_yU!& = qV>23`cZُ/Gwmܨ+zΧY\B4v5W 5Q)ls˥%n0v*N U&'R{1F-EMU'E9I> \D.Fl9OU{Xeooz*}{S5ab. pāޯ'/2>ɼ|jTHCdaQd"!6Z7`LY ^ {nQ$],ra8D'Uх4R,FeRwa]&-r]?S\G>?hM7*5i4n[WǪ][гo5#xY K~`9RlԷ1?EF6ٴ5:0Gܵd0p1"A8҉9gߒmX]GhdZKH&Ó.Yefi3"5 mC0haxq9؀!=o3R`O W<]֐ty(G:9Oxӭ%QBQxV:D]5h<2Fxun/,q'\@TQʻfz`h" bqI~-f䊻*7=j1 WJvпI=|x)F/)ROHr56[xnZi2r^@2xy}P!nR[jz]u6y/TL/TaW᏾);oxS8-:MEd2 P(>%D)5c " /L{℠|0~ژou_JG;-;$ֳ+FxR|LOF$=kE0˳Vow҅P|9x~JcOJ3sBXsdch@(y9iKؔ(\xsO0d v4d޼wb)Ii=3TU-b"ZD=& 읲rxQa3*+P:\fp HsrMkHsM~2ra~ ?䴉"Vtsu C⮃=deS+#0{׎_}XĹu^n1/-&@…`ޯfWUx_;:{X]mUonSH2.'`dsKؠ̦sgx_ %<|^3҈>2{ؕj)TɽΰA/ec-2ߗD&3r"JN?Ot\hEEC]7s;hoReYߞx!!7ۘXKRƣ q/p y=*ڪ7;q]s">?y##yR( rLZdk}[${O'AE$QVξcI݊l;tg{+.5A/b!ٍ.*uQ)<".b~^CA@GLlW:r*_gTFSUZ|8!@$_T4oUqdyh%Hy(d ( xc;`.Z7 HhtD%jho..VfXmDlwfaJy "t% U K)"jg?&ն`iB4(;tPGBp sxo+YO.|LT-49 >{&>rv^+%6Ս;G {7w< ƭ#TN< 6Z-z[<Ձ|9tu}uC6,OM0  `;#,iȌ?` UCV/famyf6]LԔl_nhMF(!ŸjvM5,D;NaQ婛ETׯZ^It 'Εȍ⼻ |K?[t H_ײ06ר2AX0UŸ"[W9m*8^GƐ8t%78[-+"R sڠ(翹֣ZQ,"b;@lDMc/n1aSmcHy'̐eK@Uh9&?F MQ=,{.r*}WV[-i6P01 :lAt:] KD"PBCZ:.;M}IL3F *- 5M zhy,wۃjq);Fs VIhѽ5oX̰qI/\ )T 3{*m GpQl=&w:Wc-t.&=PR s[%;Txޣg ?iQi״5_O|o3)/)$`xi~(ґ,`mStN} ?LvL%ӛv*I5WhIy+m5ZLv 3M'OXJ8Ɲ_üN\J.GٷwC_$d` X3ziq7־Pnl'kȊsX[kxS1?]^\$8>C4j"w_3/eKnory2bVy㼛Pٟb^iΥL&"C9La-Q;ip%w-v]N* f;S22@8؊آqHXMvlMu.;o񎣼iޫlmGV Q⊧OǬ7qPZ㞼htAJY2*ji^D>65-Ta!i4P2{`\CXq{[c5UmH컿@ Ae ?U>DΥG;7s%qt-ߓ q/⃧puyxEY.frBm@{XstRNC}]I |>0fEaSBiU}$z;P;jrv/ ip"Z_*62pVW0.mDzz縥 co4d|VčՉOA 9П (lD􈝱=W5(kGi%(6"%1G11K˗HX/C_5'Kp P)`܋t *DN&$2i!1{""y^5En_"P,pqPùZ [kAL]؃AkꅔltxHvp>(FYԫ4H֥$ 2uƼ'.Y[-E#w b1Q2Gps+voEahvwvNX9oOr@y~S$Gyl?iqjt]gb͏ q%t.ReT_MEw=I Z vufVd(Y,N4!*mf [gQ3r"Ijpna-5P ̏EafXod¢gCF|*1'-xX!3i2E1U-Uu(@!V$(&oECULTRn&3Lsrbl\GD2kdp:.8mk8.o띪 R%!Y컕@׊ !ϘQ>NKUwc;+Q-%H'%;J@5Gzx{Vk1)OD\,sԕcW"ګի]F"kᮌ:@ȎV C[O}Tlz8jsK$ID B/ ڵA8CTB~L usBrLX0׏wVnCfA,cMVpR8%%sa1`/XD0݂g:{pv5"HQ sN_ ϳW5!Ul^/^ MKJ/Fvdjp1g͒9%ct[15e-aqs`k_\@uH|u3!FDT-Y)16?AEG7:_e]A2y:q|φsI%z*"w8q 2+@Y _hdڗfoz`q{n1XN7Z=1\^gb&B]P+1WKsjGD' (uC)0yLWYsf*_oDC2D>qyn>uk-xPH.WD-:рII`zhMn#mviIR;[ :=Wm WDzpM2椱FڧyRG򖶝D\DGF ݗ9mݵ;ӝ+_Wd] >WeQXh4Khi&"r|d5HnYς~CǤR]u&z,]SA$p/)nӊRoR^Z7]vCOPo+ГWڴ3N`kPYTG27^J0&_nX`ɼn#C~[%)|-ߤJ@a;=ndP_go` ad9vfukэf0_rڢH:[k}k;3 %{uD!WNJ0:nC'c?9uW\H䑳YSM'_Q`◢|"\l#"hP +'J>*jMF4s*usjgQ'9*R,W1aC\n$`;?^?1@iѦڽGZ?&YWudPN  >Kef_>{zftJUl`og$o%ka(%FhN>8X+:\#Vol-q"WSm7 f-[o #&e_GF;R}XX?x]keP~uI>g5|g8wAbqۍ &EVKD6<֮90X!+̆غsQ_@ϝm9fr;)m*R[8jet$\Ku(!  =6G15WyP P[b0Fn<3J5$GWAz.ZSjFO <9riJsW&+6q'-f3Y>L.?(\Ft!9G(Ywث8wGx/nR\  f۩9޶Gpo#fv-hq)s]?_ܛʟ[Ukk/buw]|5J []i]Btql>xc/ N M[r(#~6:҂Cɻ l]#?#WzDxQ'I _$7\H+nPWO]K%o g,l^r] si:&2K Wc얍)z邕Zlw,nd0IG%߰ގPxҠ-MȜW>a`7rO C7n2MS;,/-p+PPNA⨧گ! ',.YQf8ི 0+J%QPJߋ7bZ:tXw'Ҵt4yiBp;Y挐ڶL>- {|K e`rbȌ/X(XFxM{h;R:( x p\`9/@y Cm~GJ WIJeHFٵM+\/ƶ4_=V_"BY̝FXY.$R:ͺlѱ2Vx.#fOG)\r=g&\)oQFFŽ /`j"u(K)癯R)"H ms~{s[7)%JMBVG \[h|`Yg_qn MUr];^< ؆S&8+)\tC + ql'ƥ浰ˆ JB)E&H|/Ggp\|Ӈd)oYĶJYkK^+H!nIdlu"ms/ +qNj*w"xcۖn9m 0aVFk'%#l>;Vҕˀ0ΨT6gF>(! kzEw_knM#R;,, grN:zqG;EW: 5we o` T<ⓩc%aT5YX %Wf7F6_E*f%EŜ !#m6 PJW Vm4mD:9!W? GXFPgc/!LG#nG^cx3 H3";~M0> 8;|a]upݡ S oEDrJUN߷"Zʒ^?0f2*ts>|"\7B+-_θ6عUSw_he uhm,'oRY<<)葊q#@$q%Mrs)Y4g6HB;,ovHR\ڼTY!d[e -Y(l!|V};AO=ù:> ߖ2QȁtH䈭1 G=?=J3Ѭo)p]JE qPut1xV`Yy+PwbjNTZGՄE"9xgй7a&kQbtف6T틉i["ئF-fE"ZzA`?]{XqX7So< %|QYTVNr5T)@ jUPu[nX~o=* K h)CtKjx>=cIR ʇڄRh |>, vWGY zRPzY}OkU`޲Db920p2 7%5pd+ǧ/d֭&^/^:++TUwH-͟F^5_6 P*o>ÁCMep8+(u$"*\Q`K!S)”LuOfXǞWQGmRaHS7Ԟa(AxAwSևԡ$݉Ѣ;6Np-Vnnc6[>& "[8 c„&%g.!#\~,g姕MH{驾:j`W'yV1HA9kY\@aE ]mՎ>P6/?q ^=>wtT)"+Zh; 3ɮ˔cpB*ZR6<'.&p%Լ8xeHz&af"ݳ SGK_s2i%4p=mٞXg6HJXsCܫx^pO^tйO;ODXn.&$.%YO真U*{2!m-ږt2..cUwbAz=[;2&tgX3,稃AipI[IFAl'ݤgŽ% CBuv)7rMTd{`̤840u+%=x*e:5Vԇxzl36HNzoEZM J#!u&rC9$݅.t#<oiZ\xx^/MVg=HWG$3A)g@VĀG,UY5 $5) sdD{#(Op&?ۍw靃-SqaM%`ty2ME_v^Y` u3ix= 2Y nvm>u,Kγ8ꎤ;Eÿ7.C`P Awy4Ks =2/4BJ ^>`\d|/1qr$W|H]bpC4Fd5ƹ_P=zt:DSDȢy,hWከE(5pRO}GY?s>U3Q:iM c?opxBg5?G?3-T$ctcoguVή98AO + b^cՅ9vql3?-q]B|YZk̞~d5S\1N~FU^R3,X)^c[(R^u|AD(;Av %4O0#i?#T+,jF4ӎ2o֊/q (yu}AnA61FF@̅k}DذG҅% (v\ے [.@=ñ<Upj4 W.*dĿ3,d٤|xd.wl_m޺$NY“Px+8b>Ds.?Q{|908\w.hkb fZi7A{$ssg x>馜r!P[7Ոm,rڱII _$-IW8CblQ~sPy1kEc{uS:NQF_"PGU.msM}<2 Zѓ%vʹ˦T=CEp7 -%mǐ#J0߫p1mbS$afJ~4X0>NoIW֡ZݸEIɹM | Tv #470+ذMWWĿ ɬC83[m4 d䤡xa/*V}6CQr3AA k:Yn׌U)NɿGw,rʎXl ]&.zX8䑐ʿP6#AtOX.S(i[H r>Cph9uL HXZ6097f|GJ%P >;n_ an5N`/LM(-W5x0-XqrrFp0$=f<aj-wZm|vPs:GGKnY` IE?¸ejL;mWܾc42[IYyD r-I 4t+G=)  JS]^GxHF\ kT3 &0lPs_YJK*,A?w\[%cy@k ?x. LETN]k2+NݘE'0̿"57ov݀CI0s%6!ϖbnWCBŊ`,ESµF.?Ȩ(+[\R9++kGI"n;o'+qXV̩uєS e&>.&%8J[1,DM2園+Pn'$#*Xω8n/?ņZT$ -G׃/5;qZDi.jRXz=qNX B}[l{Wec%[p52/3tewKyr(Tk&6o3jWe@^qf VrY Cͣ֒h25'ERdren4;f5\/HR@=8A9zc>8TgK%e[}cN8 )RBZe +011)bή̥NB$aw~uf8_mQ͍Cӡy* uv^ pM}uOl0] wpm # Փ:c˔r5/ oZrNe |3]GLZer]WWLo=jC[ 6\#]K'&Y-mH!n)}cI{ښ oe9RYd=˾I4|,A@G?.Kp}kPl+Rx?)y ٮ CƒQ۴֚a{{>F^(,VJ_ |e'?̄L>2)Yn? )B++>~W;v_S;GU #rVt|yBu\8“]]8Q>5|(nc`\T[/")(QU9Ϣxw0j,VYw1u'2@õY\J>vPnM$ TapBPHxK֖@ڀc;k3Tmꁦe@P 祢4:c z93q dq{DRK:5rĬDbۜG=ޜ}.zYbthg:$w|/1p ut粻_уTV!Th6H NLN @ĭ"8*Sn/ S9*ȗ -~C \GE< ƘCNnH5)E+v\udwW"u=w֟uV&3p~bԅ(L[!FJ2\ W&ˏϸ%WH5 E?yFvLf ~!A|%* %9] KBY=\'.'ړ3ջZeRq@K+@yQʺb*o#etU^h7P*r$4@{ w`!>6fgCu*kHH@Qq5ͣeD6U%<_@'BqC{=9THIhrf@L>]?e?:bS!ŋ jUnzأ#{sԃeH?}m9=+L5^DiT:n*XbL03I/aQк+~KSuw@$]F׎4ry\6"W2,g>c0[П̀g~__\ o'mDwIeDs̳pY`1ABJa惎nROZ?<5U 8(4ؓ@(l Dvze9fƴwԠZYR `(R (kyÖmzX$+C\&l 0lagO\]]Ut{¯}oiLS=ㆍ0 r׊/\5~nia I+3Lh ZTZhFATLXŜtTVmz&S#d3ԧ΄7W/%[ k\Lx<ZScYX3CL:x$g>"^e>X dh`b#y]s(M$30x|nX Xb!c߰)=Ob4vKҴԑ$0|ކI2:F)gx'd`baCdGĆXWKG$9 Rs"O&gGW ]t~I΅j`t;W.^z^T}m7Ӓgnv$-Rp!ALcN_A.+ 0QBnQx%)%ќf\hy8ERUbD<_z)S٧O-ƍ #oxOD,]z}@sTsj?A $Ԣg/ xKYt:r% !a1 CytZ&9&ٍ}cGՃ],!lFǕ2" )W 3 Mq dCAޖyru@ScZP}\>\.t߿֡$d\>)bg]qϔsnq[t% bEOy9MzNO|U2U/A[-e' /I޾ʯ6hy-/55JVf2$t87V11 FZwR:AOVqE"wV8%+~p)z9C}.L3_(ݳB&_^+^0̎~'lb̘dYhvfttDHLHY m!X4S%S,4~]1x3W޴dAadlɦ 3a8rcU1'z2xk hx^)ƝyZҫ=t"!CMFWZ6lI-RZ e`Nq9{rR~1>˜&"TB{9兲XоyU2_uDb3grRlOCsЌ$ (y;C b%U+^P*x sЅ0>o4PlQfg<6xc҇lj柽Bn(з YXzlq(15ʲ5+L4rn(nG1(|"sGl/*0x?wwi10IWjR{WAřS 4_b|LAsl;%Sq:Q3%pvH^72LNXX3́hf /ϏuRSb&spۢAoa^1)޸mТ l0MiBrBJI䰪W687T| پ+ڃLmݐm;U pX#Z(x4ȻrvI?c 6{#*dvv'Db"CS1!2˺|23 ̌{Ķ BQlj/ZkqѾK7F{TЗ7<]F|HwE*ݝMZe*=USLjA B.&$<*#z8w|ao.=' )yekdVa&'/{ b]m8d.S,i 'N]7~ cѯ 1X2th.5C.%i"krs3-P;8*ˮ6]#q9ĬVWU%C)=]k:K }z-jgGFaMo׾b![=j]7C)w."J@?3/-}v ?!^ !Ǐ_T֤#Y^ˎurp+N^gx)qA+9l*,i' Qk~B_06Һ‰U#&AvfݗNy,=j8 ֞UM\[j {`)LXqLx(kY*5ZV_z4+ѮS_J(J*0/gCGJrq6C񔝕Q2eTxRl /WWx$GZ6 $顊c0<Ē4,{9^"/972]N8lV'#ӌZhTRhjWLoHS[,ăU"]+PIUdO[ҳ3=&\38#K;h'Ng`KC<7\ &AM (bui&*{]+_&bՙɉ7QcډTZ@s/+DzaA tHGv9]5Ba9~|{--Z>SV$|>5 rj1gpDɧniI4o-we_\6^rhYy@ `d*ED.>ބhbR:$̟Q5^Uy.)ɔXɵukzgnc87h猚H axf^ݼ',Oϛ7knhRTS&dYlOzqAz3տ8WawkьL<<'ާk(ث!zKZ``WuoA4G "zFT6 E oҗ`N*Prsމ+Pu9n߀>ZHa {oW̾4$} NX+L/i=H\Ujಊ]:>IߠETqFt!1\Md/p@I i >U]r(zPоdBJ}>X7ks+JiҰȟdo܇|P_|deV6.=w l #ˎMq/AT;3`‘rg3zR1joGglSDiI/&O7q(s~ t?.>3O*U+@f=LKe/[T󝦌_HtmM@nC_^azT0׹f-ŏ$Ɔ6SOud=uCu&Ոbe:`突yt1)o[rzr(HÊ&SĥP q hYRoxXˉȗx\͎-sA8Yo3"5nzDR$⇳+^mvU?jUA6:QnqE!}t;[{dfz$:<#7Аo)tFե۲;F#%q4X/s`O)[:&XӑF-TB7N9Hgq!` /ncj9f(+{ϓH2H/Zahഇ6?Uh>Ng\ UOsY?t5)\ܶ6?[Uye .7|9AՏjaLAmt1ʨ\'JG9v&݋q8=ыISCk7e6ާsѓ#(zvdM6-pl?-)'Uc$\m?Д@W"}N*ʂ/n IFtp_;JwL)5Z٣iF|4f8(j*ZOi8~?5jմG{Оjӈh] 9"eTWDedɥT,:KGoΤ{#gQeTX HfGݸjdt$u r完O%(ì1s:al>B-TZ5 ]_tR W+Š e3O9הg9}^Rs؟PCP.\ݤm%34FlCCRPo6{IJt= 8u7hvhsr1 QDfD1$MtqQ ZZE*X?6Xw+BK۫=.]u= J"9fX=yƾc0"o}95OOO£>VfZO/%Fi =pOW\vX߳:\4Lczp$;͠@@.d7ѧ(m[ oq}Tk|*7.FR[1;=NT ڽA>F.E=hR"S&01η+A f{iOezteo5aťV'ƭصR!8dՏ:$+3P;S0Dž;{.m/I 7r>1 "΂Θa M¹ڥ{v%׼5r*"3@2i6fꩺp0C-7KF?'ok?f'C-$& lc= wu`E`p9GwOհMBUZk`U"LidtU@{z `dԸSIKW+s]`%1{%&-IgxQRj5|ЈbW%}^VL;~k*{Fz 0@29'>|F}`mM :'5cPAcq,S_|((|dmAɨE餙+!5Ol:&Y={m" L`"BYϫTcKFpM.2x -_| ~&%qF,#YqhR\s KE6:5;M=5$jBA#_pgocF9腫n˿̫.|Ȝ#:xQ$ÌONhXk ,}{#K텉"p\xFR׌r/<'ZB3>:Rߓ^X{<̪ ܦ9|-k"pC-Sɵnfn1S3Z mlhʂ[UBwB-~1=\m{NcٙZN!li0P2ʪ2{'Drݩ4J=plާ\; 4t$wBr^]zܾܞ?9/&r{_7W^u4ha`/7+m,vtMS鎖 ctʕ,(0K{/b6CT -[x>VG ~~%St{ ]L`BlK7|.= rn\ ᡬ!Iv)Wy=TFFETLi˚V!Nk2qlFBb"VmihݚtYO䘝>ٴCˢrrzF@,]`WVe,K熵 q6ws@xjj|? 0wK(ڐbu|IIT`bg{)vʶ`N-A,VVrqWFLg1H`4qg)[hD1~g)(Qzz4肖.yhd~.Z2劳[ ǖ02ۅ6OjRJ9S+O{Z:Gev2:)6 iN1z)?kmKZZfb,gZXn'[EjQ(4l4}TFIV|TU32㒦2|<~v!!PAĶ"_6m6'A^O .ͪ9@-WNמW9@`D-kѹ >2ö́V11!u6#"C7muǗD8Pk75.'+#%XtEg`OxEɥ86~ct] ڼ>byo0&IG^=FQ5H.D,;ʸO \ b΀mұ K՛r`@?v !Fՙ.JEq[2e{Rզ|)(ړ0*Cab$ s/$ ͎N8`Tj|=%NRPY<*]395S'ҫLf-]UIu/kJԭˢtLҿP7CN%{{_f|i Y].m0 tI4n9S7ZX(Kr3~Fm${ΈTe~=nhH r |oF8۴0RE* ZBS=iOu_gBM!/oW)E <+@:VbfMR.*mP׭oX-mC`gH* PrTm,]2#N$3C`u(H5}sA7,bV<*kezg2'B>-TRڼ‚qY7?:n q+x,CEЂyZFÍʍ00?/v4zȝruh%M>[!_d !LV$-}sƁ\hI<"ģd۴R+-"h$4<=p4](D}pg3I T9vUQ([ڭ=f)9[U )ن/mo˧CW: mn(32u4n22#V/+^o^O  fpYA}QH"LFYQ II6g5bܰEVr?{҃PL"r\!`h>}=9~n~4k'('FӤn=ZTXO>xli"?JGK@ TD,Y_OAM.h%xoR&X~pKGF4IG?Z) 缾xcOXWԲ $X`)"9{dăO8 rWCG Nw`?A7ATvN2 l A2&a=M8*<Ԡpm&n=MȚkGG;Z'oɨQRKZ l^wr'yCN^x]9z]@Ld7ڝ#DC@ώ'P,$⸤Q 2yN2B&YbSS1p(e<si5༟3W9̉`-%V_I!iv<HM/E ToDvӕ~C5ÜcjN&mYإ!XDIRv<נAaY6A  2D>D 'S_s0?֍ 8xZx7K]N {vΜ7=]q @{[XQ|-y%@/ulZFCPiWڑPr ٲd3vUDK=rSc}'u(+ 0ʡ3ԯ$p|L!ZE VbYǁ;brџGj]18#@}-8_A &3d Dw҂L {On0؏8\'jԎCڂz;=L947@_cAKIaq,'jʭHfO BmL,l ֜W+m:Gcá#EK+H%aС2XƳ$eVqX1n4_uGd_ ;h7#Ix(Nީ򄘔h͖^ >~4nWٶ/iE%3ds88Y5L0|V)-gv CSYbvdXO.NT×4m*I]y@k*F,~}>싧dw՞ħAC֬ξQ -425cJp#$W4 '`\p˞tFG=v޺'9cyN %6Z†*DJc!žaW0UMDʚG?vvTnhh`&M`L2yy]#XvgE;- 3K6z Ƿ2pndriV5`hHwHͶX2v{vR>|X_9zP=0$,QvOW?FfZ!c?tXO}|[-FQq*7+,=- E!pc }H2l$U&wҢYh/y="휰03\jPv|RIgmȌu=( 󧆪FFIzHrEA]\vS!5u ў;%123]o c[-ՌmIy|}ZJsvM,`.;p++C.WC}j6Wǖa/H`Э5ۗI0o:φLq80pב]ct-ѕ7#UVUO՟7#vV7ΓsD'0qs0v, :K.dɮTCpQ+ pxZs|fW͖lqTqʇ+3~$;c\|Gٳ,޾vxÒ"ŵ˒Wo@t*IzԞktˣ?9ei+]e/EF/b4h+q>&Ń vd%ʑQ4ǒ.1gWqOu"Id @\];I3j>Y. \sC5 +70O*v;X~@^;T] 5_E.Iԇ͔gJfi~]K{őqrEQO-;SZϣ[ lf$XݸW8|Xɂb<';ߡ U392N jb_T.UyMخ尗r{Sғ],ndl5UYd { 6kآHRSN tl7RC":d*{3LjַkRy\h3嚚N̥{{ej6vh]؂:|.h.xj(7YE(D@.1:- 9ihWO2%D[.yEpaJw6?Eͳ6fԢ{ZΈ/ FۍoZ~aj1v[!{<8qnC0B\7 zDRi5E.ة`(2(Ӧ2[#warsV Gh~'2F7Gy"}Tpo>8'dۊĆ?W|.f].K6k|p5jWWeQ/n+}'SkLukso\~$w[wdo_6jM1R9 &~j _{/z*nUUM}(QN($xN8Eҙf4*M:e`P/{-4r¥!1"VAAAUz͓&>yM"S&`DiguO+sā2;-,ʖS%|]Vꕑ%^I<) :N#,c[9xU;)e r2eWo`85F$g)D! ʵ]RN&ՆOմtu9dS81o0ij9XMBubOqNx;5 oOC+jgiɛS 9)$P+r&E49,%fRzB`EqcEU ΉZx۳ݝZ+"W.eW*Fi!C\ٜ/^tB%6$ڛ< _ sfvA1Ku(7`:ST>܌= 6P*?˗cd|\]Sf.rkseI9Լ:>p.Kh]+eZWٟOyEXMçq2NbȀ̈́Jqu|r0hd*Rh܇`DFfphFanI hߖrX+u2ǟn\;!ʩҲX>L%<傏92780 bDZ156"RpX} 3j:ItcWaQyz9*YX Yh~YfMnIǟ҃)Ӈ7BP%=NVXj-M a ;DiU%јZPeH/۷B͵ No^#Э0+H$w*^:0F`CuĥnOtK4GOQ"0|ܻHsEQ򦢾vp@w9sxAsOa<4:daYcc[?\^+8n1zNఈT\֪iZx@t]|pީ]t.u;0aE/Nez5eTk[ק5F*5U00Cs=g w rYEsEOGl`|XI&f]|vU{"qGv16R.f"K2YՖf[:.꪿Nhc(`ban J 6JQy=Tw,%{\Hp$ 4*/\yH(UۥK0z%Agpjvk=2^ATr-W_\ <2R+ JB6ݫq:W펨pmSq6 *mE #˪ǽQt?gRAv5a[V$΂ײ$Bv> iiW۬v&P{d ʟةU)sj6l!d.I;Zt7̉Ķΐ{U:-&:Io0mIqjW0TwM)CM'QӏسZ )%bSڸWdkOcIDX[n5txr)I\W]L`Eq'uccvVBJȐwR \QNzDApsbV83P=kY9u|F׈Xy+=kF4]6.4^6xEHe!c? DYjBLzA~#R]Ґ2pE ѡ`K0esys*'F/BڝHŠ`_0D/S&ژݡw?{{+r =?tK v}0c`two_rh-lf9_a$0x7 ltN1.MEF TE0(==9CT"RZN';Hy휧PՖGp\s}CryԱf]}o$ |]V8S>U/`0%3h+$6΍c1>k+Q$pM&UJFh;^m`,:^Z+84œt:i]ŲZX7(#N+e&7:(j(S( G8爮qrWtĒ\ݶ܀9(Ql㺐PޡA`cQ1Ӂ׽x8k-0:V0!^ S%Ӌm 6]CK-Fiq 8@~v#Fl8yraʥ&raH)~( io'(4#ywL7(r’0ǵNI6-c-4)K!;rF@@:DQ !J{fa+3z}>e!7~Mv|, aZ͎H~J3emi cC75guɮIk y+WlX~R FӴ @Ƅj9 oc5Y[棈La_B5l!H~Xs) <Y,_kAK3]W=>־1h-'A'*@Z'<8i%QkofFV(n/#˫ӥ@/p@]"Xc]j[xdIJݘj Z/.)K@[, 3~@ @\ ϓIH¹)f7sG_bՈkl[di#RF uQkୁߐ˭x3=즷',dD|$}j@7rex;eC4xvA(JMϟpb.#h*#rGU3-!us7U{_%8mPs?pkzo`Y]VS9ɚʷz ;踳UUs HqbJv,YZVWyY_{Jݙa~ze T'cٽ`(W)QkSޒl7!`:uIUN{R=`==׍p&pV3;IQdzX_ Ql=oRJ%m5sϸ* } S@JTIj_   da[Gƶ!ɳKSK]hGdMrY1DFɯ$3CcZŀvr|S#_+w9 a {Yw\I ~iCޢ !] `H$ku|prTZ8:9Ó$w'? qjoT0hչ;A#C)y+וDf#9w7 B1V Pk9|4Q}+?e@WXB[9ǁ08sx6}h:ڕqwT:eIbhqNӴ/a_bPHYWe8 coo U[$G7oȊm)f|uː\um]4ŶP,n*]}>Fko*csKq`+bZB,%tպBZ i J!AB6KҺ#T%k3}2!w+k#B0\wsy:87](N,Qmמ,kd.͂bB6kY7ǍC1 irMQI#JS#So撆Ϗ(Qv '{nAg`DsAd`*  po&9bFfk0AKv.aa=tn_g,)xLxAJ @Za!100@L56ʷ;#k?Wa-ihD/nܺr}:\R|󁉪Å@W߷k cm*9~Tňg[VeR-ԜӤxMa,UHsg0\n:IY=&պƙwsHb-P<ЪXw] 1൫BC5a]pm{n# ,i2Y+9T hY0# @2p&̄#C /?`|'Y/~@ ~-_ ׄ# :-uDGv2%t*B~ :ݷ];|YqSt[[/Ѡ}I-SKr>"qTIR5 !\`1xoC^,>8ԧK)w)8gyflj۲w}24!F(2ј#JZSgbcxv\n5D.TfΩcWtfh|K','K̗5 }  2xnr〨B/AO{AR `H6%N򲻎yC-5fET,VBV&&Ԝx!&uWu^s/MRc9Sj$| s'TfMMv]!l)B@Iv`(a(qnŁ6L]Vc.cS5g ]Bϯ#^N}` 4FA>T ?[Z,χiiUϯrUM iu,* V>qAwma 6#,+6'O/ ]v :r{yxd:ܿU mZ rdO՛RGC{z҆ln ȎU%GI}@>S iQq&Ͼbay,T|q|Ky=O`Q޳!݂vzێ*GMb^9Jm&6,^2tiU/\\Ndb4/ U} 혪zlGkx[777#O_tt``agyXs02rN!74S> 5]:\l|Q- {UA(F2ieoíqʔ kܮ:6V9<N3%䲚NAj;8󆇢-pYr3p=i0ʸkC+nyw0 j")(>tXo`;6KjE< avx=H_VX :+8cGm.(VxIsn|Y ~ jnEϭe7˓w5gwdnjs,|ބΥſ-Ck[z$%]qآY_SShV@G`o;mC2Ç"B$ [9QYpK].3d\x91*F#p?\"*4gfɀcq WN[٩}!PB_AD&P_.tiaL%7FyVzJ@haP9Nr;rxFM " /rV NX=RW#ň?xZNꂷ9*R'vaNuD R/GQhsbA] Li_Rv@629~g:&c >[ *;4O2Cw KJxʺ]M]c# Ѥ4X7Ẁk0"6A*mƂߗ!лG@> a-0+i{,sU(g'ZΓЂd"e(kU2B]|G4Dgq1 &p)Ҡ^`ÉB`k{ǮFr'۩tB }5Id;eKmEq+ NИ=̢յ=#]z4t^&* &-!cZ`Imccsv3 #F z1b6&m%)}^ Ig#3& `X{ D*a3JLl0E&Wdm?, 93稊('yY, qmi.}LvfZ1[K{Yn‚ٶf&~9tп\mIJK:O_ WFUsG40M=~xဏp.EzIu[Y;ݺ\ً [lP]kb;$H*_h({am+i>@' -F!-:j,8|:̋"T{ ZRϩJ5.x%xX|# e!:* JU|WZ AqpExL 3i;H-d*>2E'΁Rm?pa@w$أW)[E $u{\ xzoڽR\2+\;"X'9yF|;zPrϟfW 48ۑyc$J-tv m/T!jk"zB꒷ &3y0M~ jGt ǒE#TJ򆇖=Jcov)PWavQ s47}FsrzdaLy7͊?>tF3Ԍ8E(fW>q&u 4Q'@])visCOG.Z4\X,L rْ98@BzD oX9"TVېӁnVNߣo Mg)(2cs<||Z )lxtȺۦٟwѫkJHo-YٻvLd-`kiBJ?:O.U^1$i:㭽z3rI])o3"x-|>ϸfeG*Âj)Ƚ}dr*2]Lg wآ`oJ{9,Pcg~IVfGT{p0v$r垿sB :Ed_p^:r^l"$\|yy)}z4?赙Y{Y;X Ѫn08̊Jwjeٝ~Ā+' L )Gk\ҔSNU/TnHqN+36h!sad}Co a7 UOl[{(lLL KF & qpk|Q1;2XuB ]q40텸(G?kܩQ򏣳ZY3"E;0|%i_!v· 4ʣyo00~ :$lNKA#N:[sSㇳ%/l IOa/dʕYM(4 AmJ}h&t#*.{eW vt .&j|Rg0_:٥*\|݋=bNȚ\F6| 2g ;Ʈd4N}Œ!t>wy˂b㡃Zg_#⼢ľ;W*fC2M_vg*@Bxl)S1Lku y WOI8\~%0:a<],sYWb@;bJ;O"_Ө/lk7x [4*fx?@^vE Ӧ-&BO-8?$\@~B|U'=li0!Xr'#ͅpی,^sYh`ʿ6R`|ƾ-x=3u"9h w˰/K;]^:AV_|ZcAHW:O zA-{7<;%뺜ST L*[ZUu^I",g0=6?y_ 4|=2tρgAFH؊E ,l"$O`YpGcɯߘx9|)hfQ87=2D`n|=6nѢiIn>Pwm埞ӛl1KzU:77nK P9aV(^A$(MG `葓aQܸ:)9@-8ǘDL NXi1ez~T0ƛ<džiYTT܃ȰL<x;XULٷ$SZO;P}=~T"ǚNrl^W|:L7,-o\Cnl#v8U%3N~éaHH7Nsh7k ӚnKO@F[T'-OR վ-į8`I+hOIԯ=H)U"/CSʄm4U%3-9Teg/Eв0+Yk*,șw紳-!6k.>& %o {*Zt{2kΌ+'>2dZ&"LǷ~ ?%/J5ǬRD.mSkE !8;LKi[}4uΘAA!ؾH fŐ5AL sl<$ePgw ĺaJp{1dLXg+˳re@"?9p.4F+0&ΙTwm+QҘ,x|2$z=&bUREA^}RK1׽a4J~2a,Ϋsf?B Ꟗ;ݟb KS}b)O}> z'h5hV.7*簒\!m7]/:[<:\z7bIؐ0PFTₖp'Zc/rs Xvq^ ,iȯdFh5+IR+IXb4]YUⳠT\o;|7 DZ<~2XL8hs C߂&w[\߃B\]poU[/k <~'24ɑ Vf6ռ4GU{RY1uq*^Hx=ªAKrB KA);QI2Gx@wwk$_gP(,8_*06hv;"XD7FW07}?xǩ<`i7\k"c`# X}?&ϪWX$&|T]D^c\U)|q w*h;U%:; eƦZ-:N/uN>90-Qx䰟 ED /$,Rm".@%?d͗2_bqi[9T$Q%2Q&S V4,86ȒU@m޼3;P.8"fZUUR"M]Kxzė_)wG vp>bE0W0,-eeeAZ 'y8'ߓz}JS0b%QP\B_y6Z p5\ʝlb b io珏\8go@7*hR(+5w-mV!(X^\i݁Tה7 q-gs,i9a/=B|(!,yv"d H'y  )sʔy#/u6Ma{OGn t-|:?M92dR`ʴ5w-kȓ) R+}h’3GtP0F8a\Z.}TҶ)Jnk),QivX?HC:q9d Թ~رQaCK&¶X/ |׵ͧt1GśTq{MA| H4zO5#DmOjI ~ TAgPpSG؎'Gzf]^kw/W,! HNA\Imu^@j6fkc#BB)rk ˪Aw.wkj\X`i8 Mwi!`^aD㞲cmdi") K2D:s8?]2w~ѱ^۳2%27Ը/G/9zF,tu@|ʸF Fƴ |<Ǝ(?;cXt@Y<!a_˼E)TCDI16&cyaA40\FQgh ww27P.Iip;kkuM~FP-=qÑdMMiD;P.W1ߓ1"p[pB'u&y ߂) xz!9zQ Gul ),Y #B1/dcKh6ۈ9_x@m l$j¿m: vS'_g4kE bN1< ۞(.>DGR.@8Yݷ8WJ Ya"粧'+6epLDN**3.ãnMGOTo 9TD^| eM&ztL/"Aw)[z 30(vوCVpH2}Нs T}&pQ16{}wjY~Rs;d;oj:ǔF#C tKR<\x[շ%D<7e@Ʈ#_N r_a|T9v́WI1.fւC„eNzYֽQgLtLEf=W{DqՏ4=kM2_n{5jާ?Hx,'=%Wnh:׎™ՙϥ yӊ9MM< bYGGuJ@5Xp#ɦfMcEv)q0Ω'Ӧf?\2Uhב_)LvW6*^1U}!a5UhRVݿfjF3XKV tݣ:ح5d OG+< kS|g]*+Ȥ4 2w"+M1ļoqm+4 .ve-׽*:t1כ;LNBf2NxpJBS̻5LS63s EL+C~:w (%D^},iUt,SfFisK'r9tg>)yK4{/ s|s l;* I]rB#3YGH%[ÓRk=vó(eu}$Hp6 P}fzWE~=h ᱐3vX=w5 ]fLct={{ r95U0&V-f5Eb\\ZI=gi*>ߡ|O'Cr+xy$%[=l4췿.Iu7z:Jt=]7d[[3F e{3S.]2;RN0ʼnU=D,{Fsi skH}(\ẏo@fVR*cVluV;dR1bP]SKnö[Zo^kpP0H)P&ъʋ(̾9U*,> .ٿuYū o;K2%/;RFIwW,\# 0y #Vj"[#*uIhXIa-<v>!zΐ3xy XK'1{ds,!2Tz޷a[z9$<'KvC5;$KάOW3$m u`7 XmMfix:N7K,sGʈy ,uS7& SF?s]e_/*L{Y|UF*Q݋{9UPjRhϑ1{ $!0!,vrX[v,) p]T%`nѠ2"skӱ\;0DJB~w~\n]0MД.n>BcAAe<;1VSP|:Yt@bLAM,E,6erH'_-1|݋1ѡ(=\\de^'~ 2@q]AeBjࡈqԋb*NI|MGyJȰĺ%L!Ć'2H,#Zׯ)zc8{^Yю%rGQXUqa%1;Sem836>s:&b2Q\[2'TG)徻qRde"^1ߏ u *Ojr_xYpZ{҃K0bGp}ty m55ƽ5/3wV964Vkm&TV&b!niz Bԟh&-SRFg "hL-tib9'nLxsT(~rO):u Y c%& ml`y^sΟ_C[K~׽q/ċE@pǥn-DZrdxQo56Ҿ@J#i4S~?u[Y hGNĤz&eu~hrѡ\` Nv^ZE - ' gu*h:liVˢNy%&Ucn,dwNa q qmgT6(S'C&}eDy 4,QCu-3a<&*9aEZ݅pՒU,Xc6<] kD(CKֹdأ`` L+qЈ 8Qãy2kLij{We=0rO%JkCa^mP_*C~/sm^KV]ߠ?W@t8<Z}e#DA"k#sG<>Fe$_B ^l9'?O`Ur B1Ww@S2hy<7A35G$IزWV(Ԁ{DVr }I)$jr\Vbs_:}<<.@Y4xȈPg圬GSJ2&1lg>H8qNGaL?QO4ILyh.S44ˑU,_2 / t%Fpa5Qp]lWSNp_twW;l6|b~+l;}!k^<;mH#8chxFZ_pV6;5/Qcs jøǽ|`V{O^i,df&Yi:&gjZ RXʰ(^:/aj \LᲡ v }x3Ms)8ˑ87StP[!EJ z({\zyΉ#5G9g5c\e$h mUN9B^ 8?Miw//1wٚMsg}X,IZƉQy3&;ʖKr W{ XفHhXx 6[ɝTdUvrQ\#‰M_lچ@Zl2UoTɥ`ּ ViM٬'s s("` Eg6I-3MJsu~8/ɑˤf>REw$:X;VX*,GL7ĚϚL !F(IA|gKY."}\[彌<'HU ɨ0Z?4Ce_/P`gZ$Dn@ yI dsؽ{JZ{QWwD3͜Rm?p `y>8I `zwQod9A< S|; *X孠vH)Ѧ<~ ҅w;KЁL@cKm!=З1{\Cբ|N[~sRE0RvVAJ^U4ɗrF;]3f fj) X8- 杧L25K2 Gz.^4@"'p(l.1dhw6.zԾq\+}%0Lu0S`A }ԛƑo*(:)OHiM1ᇯ;aTR>%- |d˄ޥ+a噄AۀFhF[|F#|aQγd<1¯&Yw/ )51?jv~fW1tO'z"CMeTȪ WTb͍\`bv`#6ft =pbJu(-0KBsw`e1&ߩF5vEךB7a ɤ0?Yʖa&O~\ޝM7BQ9iWJÚkBRVpP1")˦6.}Sw(HxW/VRɺs9I_v뤞g ɱqu8+vx%@..8'RxTV&MJH);GBww'׷kgH9cIrT0tʮ7&+dBzi 3僞/Q1WYW[@)~T0*sb^@5knATtn;xyUoa^+9숇Hl*\T[_sY (/D$x*MFcGOj_v_"q4SNQ̶<$aUUj+R+^4tq\tL頿qb^_!s&kP/aPh&!fTd|90mո ,Ȏi+A[5'0 ײW9T:jt >O{ 0%; HtNi",D7a@S5}{Š q<8wZ"M!Oj9aaNͤ C zcM h뚶Pek"c.|2@);2~ "ES]].bWꝪּ1H؁;5CIC$`b(Ir+r 7RwB & mf4rTI=0|!<!ͰZ~C30\@emQa`-Nb)A|Qhc"oQ+˛4b8 eF,񟥶|] , 1~.?4zXk ҄J@!+s[+ɯd$,^11vwo/Ng2"/Vl̻ Xds,2u<3/kəLsgeR;z_,^k?ήk)M pS35e/l瓖*jfs {CɘS]L(װa7}3N1V=fOSW"c憂'*CA ~ԆTup >O*CFNʢxΉlbhc>/l@_ߜ ;6jM-(=#Fߍ0j}YzVL T!$;<P9?ꂯ:8Qt!Ryap]cwg"՝Is_.w=Dp9i'Cǻ)LO$[:#؊Ԯpݮ[9<|_Cp#JI}@E.^㛜i>%BiK/Cei1MмT/C,)F{ F$zp7ej*KJBR&_54G1M֤a~QfNI69zPéDZ#ϖl[7 \~*w洕M2a  X'LvmEoLRâA[Ҧ,YibwԞtW- М/}-MIO£'ΰu]r0 hH ~yy~RS_[֯AöJ:g-ny7O*s>ѫU1åz;ZP&0_{ǭHaNBC/<ʵ*Z5񌊈bH4!YN&8ض5A ?'\ 57n#g'oޠ! :9_Z b|"~耪a4 o{1οP׋J0:׽$q dx!*L^4Hp$PҠPkb/DcM_ AʚtP:F,P~WB?aQ j#}X:BEyv$s*<^h[X]27/e+vdĎMX}ԱȕuURGg$K-x<[*DZbn#mD WsuC =Ҩ2f̳Rkx ]aO(Φ=$g&/ћj}ƯTvLMcRDkvPwzsqd" i/+ Z zQ>봽 SU'VeŽYs^b4PY}(F~Frh aJ*$M k&pܭwF8d::yl{@srA:?e3 {CNȏ gďCd(;2q)YOqOgv!jGZg UtwRlzJ(tR8p)rFMXOܩ;sGtN>FT+Yd> ^ED o )306Ơy ľy`EɱT ^rhvUSBUb9:(ƫ#t@ATYkȐЋy1:Tʃ#" J9.sO쵡?t.MuάfWTUQC@QD*J0Lƨ 9jvDx:[}mk'M"sx kSMa1B/n)NٍݧsMMόCM1DžNǘs8;Jxz"hQ Ӆ5s zi))bzk" Px+dmM)ҥ&\!UѤ|aܔN`gA}\?w?feÑ;Cb0/}86}+X_Ǥ(:>I mF1 v}l~OQH^OuUGXT<Vq21l~?E[J O!R/a?IVCFcޣMțy `o`W?S* lEREl`x ۷5dN;aB>C4^w f5M". ':L!]ލs~FݯQ&,5,j %$}9<[Lf2R+85'Jrvx`NB 2t,49șXnӰ'A[ xhl??xk￵a0- 5yu0-?o?0MeZ9ڦ| UG8pN67Q2RMѠȧQCaw M5ޥ ͽ{wjcлeU?E|l-8!\,".s ;2c~ iݑ3X,/9\y6djFm1L ; [NaPtƿ(iɦ>"dUAa Ug"Hj-  #h=OkycFhU(r:1B<&UGgX|=5`b pc庲 )C'XZ.W4DpK5{`;SLgg/_ oRHM@6eCK yW D1s {}xd FSO$9Я'>D?`ʫpZxW:נO@RXėAoZAI!)A 74χ/".=ضpKZ*%p8*BFH473"7.WȆkp<̟y&Qj c{#c͡i")aQȷ ! I_K&e?5pcuE}ӯ7/r;Q6zuRLݽC*#[`!gӱ ;Irl T_qy(g :Z= ]߅4_Xutq%2Y:{n1mN$ kC\Jc 'W_%hu^zP,(prƙ9y 0\Sftyy} zBv#Kj^frh:YHޭ;UU-=U+"!Ee/Nq/mtpAZ69Z-+i:1a>St#S^\ĀK uL3{Ub`KVb +9|@bPP-ED.-{r#^x#j^{3? 8`b+#S""@,Rs 10Xq;fz|3;̃k51"CE/(!"n{t"eq\ȁDЁj&T9CDsNmKaDo'_l4!^Z \ub+txhjn k;U.dNjJv1dt37ޯAVC |!_̶\]On.wxqeW`j鉾wL(mrA]}}ƁnC7}نQ|7z."D'/*(>̠N ,N*hyU֞1ނ!|C7"e AGQWi7"@#)/ { R $Ii`\!V( ɻ77$ `&덁F'eY%$Z=G{X5DqK7įq<4 58wõKe^j0u/6U_uF _m}#M& bz<6Pp!ETiLTi$nȬjJhD$%fI'jr࣑hۏx !|QP ~=[R J*J>Zx!:.vᵅXs%4l2LWD z(,5cG'['$)/eD]< fj 3@y %Y dk sΨ)S,<`/61w_nx|w^l*msAU!CM48L̙]&u^ uih2C-[RcGI%=#@uNy=z ڧg2L"P4+K`$$qdq&3dRmq5Od;<@J9u϶Jf<1)B\q࿧x6kYq.dhzPmlZZV JvD24>ö %|Wn$r vn/j6E; ocN{>ݡ|~fc@@G2-ݻvߔUviSCfEYZ ¶ڂ-/TH_@'|69|Pb 9M=3)FA7_]:8W  =s."YlںjZ;kf5&AM獘iyYJc]S'@5 W{&J B^৽ˋ Cb0ObM^ڭ?S&bIQjycwHx7B4Kcxc|gC9QJ$G>`ƭqٹޠT+.7cp}dDOt@S&|Ba?y$ȗT&bҺ'.jx-"L)PRWv#r>[_2OCl9t8yF\7,~pU$v#Nmhɬ,RFW ^4n@I R_d-AY anN_Ê5C.tU^h(Ϣ+39YS|  $>(~'An"b8ǫlpWr$i[F5D{g6F$O ՠxF98ewgV3tT`|UOP #F jY]#-z5;K*+!G>rqJ3[y卤9Rzf!l"eSkBBs mLLؙT"GmjW<%ʂ!kjPb,}/ՙh~;URLೡ݇;y-m ;NaKSR5Dqv'Sͣ)D<2b T %~%w2vZziW )Py5XΕFq+In/l'/@!]U3HSY/xfY (^O%ŽQ.͗TŸ[eqKWx84& ( "%ǒQGsn9_UGML7G$MdP)"WيFeʯ_&./)a ºij/ k@oAb<hY~}/r\PKF5ٸ{Di36 /Uerqe8?lƀكBF%֎$ΎZXok)`xڟQ[O,z[>ibc*]Ɯ[zV>jWц mC5 ݺEB9f/Qe^: fMkXm|[r`i `вXuY OHhS5{gKʑTQ*#+:oC/ ^i"C` 6%CX5!OϮP-4&! NކuHƃVH.xL;o؊22ORΣY3cLr\=3,2ޠ.Jqj1)D#s';hZp ^K|G#uHkǤDhi(6˔D^+ηjyVejm\WnuJvC 7F(^ %joۏJC R]_y%u' `͡/ -gf3YJp_;n倜- hY5`mqU'iw_jfUО}B\d[lwf DCA8>v$56|f*@-[l ~̺u=knsz c W,9X9عOIڤ!|OCB㖼Tk._|\وi^)Ge)G;ru4*=6l_mn(s oʒzX*ĭ0lurd+EߊzoB$.6ak%n8l\87|[4]97m__k}A[,CAb Nu[>P3ߧW鸗[&8{^'Փv_fBAHAaXPP4r_'k! 4/zIL6,:-jx-'5G|D%G%MsJ15HHЮyx1hQKtk]oKK_YBnbi:xS\.]4zzp2lq'H=q17֔F>0Uڛ[FFhV4Q&PC/c|.wuPQL {RӖDn87ͫ_8{ kR8+]/@α mw^=RmTk^4vٲ.tɢWOƷ0=%݃-?-|_6mkwKn֋ͅzտYC8"Piz,,F)77Wh; m~:|$DaJIe?F]wlb IbIy-Ž]N6J&`%IAHYhUyydXjf88 do2v0~k7l/_3+Ccl v?AD;!@ *.\>eWE;yR-YC+T3Mv33ub&/qKhx⡐8l->.m\Qx0 zĖSqChN' .~=C}}׎DbH\C[RE2btZg%&ŋ#P>ŋ'U` 6_3ro)EQU}cR uύK/ :$%;$dR<.sEyuzD7Mk! { -[a3"9??l;xz4`+jGX4*O2pkD ~] DDttTx62 jWNشr(-H1d.݌y6$+@8 E| W1wihV0dB,lU0zaoCjet 0߼ԉcMR@4x^ E q =cil`O2G;M^0b9q,T{tYx8XtA׿fP(&-[qJi1sqg2]Q1l> *be ]. +(pbе؋L wpCۻ%ұX."+gZmIxFIpXRi_4=1-ZhtUqRܡdIm.C^O޾DM /ɇ3iM&fhME@Α&@#cΈ z^QJW(U\JKUN~9"%Z)5чuk2gH&T χo꜅sTsY|-*spfer ۥlQ7tFk]` |-B%YM Dܑ2TO({CcT=գ͢VS9 TQqQְ;gv4Eva{1e$=Ǡs^@nOSuP?oD[/r/}#4-\K? A"Xpw-R(#Vmwv:ꏯTU j*\@sIڇlhDw6dZ ְKP !KhUN`j 4.@1/[I>.%kdՆft 6# 1鏑+jBOBIU+?iq7Ԛ P.eaVe qK$yC\#F5Ǎ0Ln+Q] f;KH'n71 EIʔ92gqBOĹ~Q4kHyŜUOnN5CPq,e]:Zl5)4lV$l҃!SE9~ɯ0''H2fz[#-uiq"!8H7SRCE.* F\/*` [Oad:_N֘`[,-l0K= KNf k2(e;b0b6?J&; !>IqI aJH4۠ G wGY;dXBY` nv=TO5BT,4KSR6Gk6ل7g[-<)3E$WB}eFct.A7GsWVؑ+X"륜H #,dRUsX_"U'iWw J)#.0,YwU /hD$l]#Z0Do^)aKfC^˶>=y JFAY*ieT# sLٻYR$ FЦie}nDvMc1)~8ϛ>GfG;4c wZSU:zeN1CW\OxxE(b`?@ <0o"}}Ia8*&޷ؿQ.yGx7WOݷ+lP NdF?%:טg݇7(7N=ZuGVZ<2eʼn8”Ў$ !߹Ē0~ZvPPEELapsVxUc\FRL<2#J<˛SĒc[˫NĬS;>S kwXkkh3:MQe)=+veF+WO3n-˜d斡Mr}=CƟg*)O2oxI\~|뗭N@^FiCFG1K؇|j0?ufΎON= c 2okqe\L|OEگn 7g'qMD񠃺ILyp~Y21TN;N |"_=X;|:%Ov^9RN@w^j޸d}x ƽ-ޝԳo + Օk#KHhb,[nvZ;q/l.F=, N#ra4Qg5IŶˀF XcC8؞CܵQj/qi"]\ .CF]RA sYr<=H9 "#ICmd`F/<@J[C"2n/i[}o{H~ScEɵU^/3ɝNb_nHq =^xitv8U'd3[ z z q#<=Iq;3#1jB1(XP7qȂy1)_,T7K--#G^5H.?=j2!oڠn1B58Nf<ՃPmK^XTU ,*6s )W~HOQI%*5f8/mg !naݞ Єߣ0LU4I&[4{jjbge S08COFiطoX)}fNEÝm'y9E cLK'aᰦ$MAK}枲W{[jBLs=FEBYjc5std6BH}$QFOrIi8J,|U9MuȢ#E#d$L%)S!I4C€}y8JBzڕ;/k$d3d\"1Lu2SL^L̸O J|%@o4(jLImф*Q%Ly!"U$  xpRayf ٕo\Wpjf2/y%bc$%"ifExdB^ {P2Ƃo4ڡHfݺߨHEҭaNS &:HX[B,4(} cBdUy}Xl JոPo6%¥ʫ5|OanE1 UǙ_}A\&r{NH`UC܉3  `슒ʀzFƃTű]o=hJnbD/W/)?eE|M.O k! jII۵ 6Y+uo+5 c' (XiPnUp_6<S+jtT/}(+/Tѯf#U֧ ybb?džh)DG_4?Jn_V85ɔ3(V}|Zq#`}CNX@SQm*%eCr?ʜר޵%.<0[}uuasas1%׼[=`H>C(&_j+\a{$-C3isF|byUѶm*Q '7Rxezw\ϟFጽﱖ_D) &~U9^ rAtD/#i3WCN\$"#4kMȎG{pCG[BW|+<+PssY&%U.X ⇭lR7:ijLnىſfU2V @8$A!7#Pe8"QK&椂Df^+H_[nR cכ,O~OMY`CGהPOo bx N_% fU?iEGR}ݑiÖ ^q: b?g&%tR1hx:XmQ0[^};ᩢW]k:9]煂WD:,ڵ *KGȵi7Q7O9I $cj,YZ8GlwA0] J1U&,3^[$g13Vs#S7r'`r,BRآkWVRA)o؏^L+cvJ&2U2>jw yݨJR:r7ӦD]`-s BmG;Sez q.JrfZr~s.^hW}h@2xkͫYK3zHdji|J g nWXO|"МCjHۦreCԸ޾\7luTW1W R|m{z[Kn3A*@i (3~n$|6JW`\&g?^OJkv5Ai1ȑ&(_!@.0B.mIU|,Y7K(^, Bhq7I#q}A&` WmI#6f0aϱQRjy"%pn(u#Pf&^ą[ۧj dy,N?W35Gf/9wAtnXD̔EK {$"9.tuUf.I1a:c;bA9V4xoQӾTjsZ7N4q_,>q 8Uϵ8Hիa xV_fo̿Syg$ѤJ7X}+Y{fݻp9J:&=g57y27jҘ7HJEJ=vh~jbB A,d( s|Ѯ|QvZ-zRk~ u~ _ɂ!._&ez眫r|:tl\;o+Ԯ*|j:{㏭TCoп ʑg ?eo,="Xz~iCشVBDnL@ 2N%,pl;͏&bxߡ͙_=qzrIO %{>1bC*;)Iܦ^h i{(M|f40,!:PHT/7XФ94$;x qJ]LӲ'0aٌ5dB)btx舅s…|ae;Р6Wg/ z ѩ|8|Ҏ"X[uY`IMGz"x-D=-'qy `W>D~M<:SޖO+ Gj0W@"߳F`܍!]UT䢬R]U+tڰ"og~/cg_uDj zzu!-o4{.F-Q5+JNuΪ%~'*.j 8L|0*@LDz9J0$ Ws5b+лQJJJ,tsQf눪YȠ8kZ.rZ@-uq7^V_ xg;'o,X "\lӻO 65lUGd 395{$K%^D#V mY3s\Е> T&SB@]87Ovnk8;seNrrO/jP"=.,H.>Mx_O#TދJ(V#a?AJB,,ng~0yOUL2au+#d#[1TNQ葤: rU2Rs\~bmЏ&[i[pʖy|/7CI$_F1H"e%)4;~Q~GrH[#%oļ2Q0sOykY|*>֗=+)jsLE{ib2m0vױJ̘ +ˁB#l7e5!4"z6 &̓ ǚ]w\uoq3:P6lMiD ɘ\B}g!ȧ 6vA|h D@4Ru:]v75g3,7. ʮ,{M[Xv7r@ ӿKzoĚ[08潇PG-7+1)學߇c=2"y^m2珹;W_!t G[n%lJ٪dDE2y6ppxU4]D'vgJgdY݊a5tL7'08?մՄ񇝤⧲$6-k; 9 "׉>(~ZuBb1#-%@+O0pir쥭۬_  XAU4e5uwM~(-tbV`#rޘ°̅Ń(|eF-2\wMeA[ 2Fs#${ek婜4$!`_:ŀRl kw5_8X2Xlj%L:3xwz^WQBf׎UP-&VFc{8'!9[f=: 0@ ԽZvӍmLq =<2 /O}دa =/{Ru}/7ʝ fPdYrό;攣>za5{mL, 4y5Z%a$ѯU+8ˏ1*5MoKf`b:q}{x%Tab= "^^y+: y(0CرzB. uYE[PÄ᯳2ŧ0Xp5GPlރ\I}J}Gk|a>0.}PPr$[L_UԧQL͒aer;!f+!P&CPCڤ!E$XER%/W8#f;cNI'CfDeWis0I(.?Hԟ=ֹ&"iYs]MkϦ/V,|F_rҀQ8Sd ;`8imЎAǬ8k9:Yrp2. *Z(55({-SB^Pt$GK~B%-4l`o}[a @|VL!lO6 塠)5᧹XM4?(U c/Λs*uSTXsfTS҇] R_ҮMukY%fUEr"^:|* h4⥘3;u;k\O;lm2<{Z?Z (jYxMwg7n%^9Z+K,%(C?Oo?зq6 C 2"*2K4ϧXn\$Vc]w#9߆J}^`T0, $1fSMZMڄa7m.v䚄}*uK<X).xZ> *Aju'+*O0.[n9@]tn (gC{CoЋs0wS LfIɢGKI6]%sO ֹVbR _U>? eJܵt)ׇ8{=&5y;|R֕sѤ!sq]9zRƩD s"Ah_[:0IxR6Mi\z;3Z偭CbpnWm5 )s;z{s`xIks{e+j^;ޚH} }>eܣ͡rJV%ph d(/ >% pU_-৤tGW_%:G:jK>G} vQe0w#t${@c:a&i(ՐroRJ}ob,ͤ$R C=Ѵl9%vKSzjywtz_=ͺ֔,JAm[!Q7i@-p1 ~ 04U&(ճJw~Jz4T3&%y{@B>O<=1tR g4 -?itO"w:ZR*ΧG Fl=Gty?+wHóLz IUCi\F,HU;??)@zӡ9i-iΏm;*pcs.(Py~!ΌH%&=#Sb_UC_Cq{${ŕ`V٣|MrGFt?@-IS?7-##ß^U$<-'M,(|l/Kgj omowmNKOt޲v p,kY _f*G!QC sCGW˜rgg;3Kh 莟P}ou &5RН&#BS"5PmNrt| &̼~oN™ǯD,BTXg c]EĘma%&CQ}w_XΌܩ¹jEgv2 e܋[bG¸ uxHREzĸ(&!%!շH`n8 >3goM C>͈5 ;hgīW'QgPği7o-:4Q%NDUd%-/msק]uRZuu_~p i8]QCrBE]} Љ:mc'p{R+ #] tΗudmgnu]aħ5T V別O (چ@ Q{{GS cޑpL/)vy',-+U*v/iֲ=£ b_._|yl'Jt}4@cM24TrbSF( M} +x^n@RyOI~2 ?˶xýw0ۖ '`j)A(떝QaB}VE.+rYkݾfqqUC)Bg%#6v @J6?5 tc}r)RIW86ӁbMWWfA@<'WYVީE?#̇ DG2RS\1V&ד mQ 3QK,W(<$!W7U>ho2+3(T6#K2y[ty0G tLuo`D*-lt79y^xye2ŧ)U)d;G4a5 2/ce);nQߓ٣Jj@޼w5F#m R#88gZrܛ@͉]K ęq!NIxLԊ9m[QH(A.Fpp᨜E\I$]."F~`O (. ?]ZGq$+F`f֍n_mZút2 \{-ѱ)WFohO9/f HJ#S?˿Kmf^?/sDbH|2j*iFy5F&I+ V輟!LW?T{`Ix;ٻaE%Af=qn !󿠉Q9W6B1 zFu1!rVЕC؎FM>8,sҔ @)y{w!H%҃U?\ 'm )nBI XlJ+I-9z>h~kܱ\6JdeKzu8/ʆͳ>gPf>>>Hjhƭ1r '#v8 nl~.F0Za3j1`;Gz }A`cB7ae:Uwk NSҙ߱Z4[>L zVY^4B3dqvws'#K$@j஡+(o5El>v>Ցf)yñcSĐKfP][Sv\{)|yُbkiu"ƥ KD1J,PoOйSBp(e jZ<1Ou36ϋ#1GDrKED/q>ڇ3pxg2҅@݃RS&ei1/NWv5)laOK&KP 3ȕ20%~b .[yOͬkaM|3=`\ ~.w6!e 73Ϗ+[f«6*{Py-=1mJ6C¤yߐk8„L,|} uqk_Vg7[zp5G{?$`B#]<#L jT΋~M.A`w|t5aD$"pg)íAS34 XR3cl7\h8)P׉b#mk/܇H)d}A謥G-_﷨1Ug>$ܰ}gMےӀpɾU<l.䟀Eqr&]ɟGjUlޱXz،0ץthG$'./VU͋wU4'L{/oDv!A l-^F~B1YPK n:מ`t^#Y,wXb^\R<GkνzxEƃduk] 0׬Yj_ E'O HI/J%dh[%['ΙU5om%?7!J1S $ t8U]Y%A0iIqyt$._,D8O¹y"DoI ^bh,f4I#rbCLj9ʠ1qS*t/4bP'Qt!$fKQ*8i|bz`.>8oщNV|r օ :쏩*K 8%y1v|f2bΟN"hN)GI]8$ \egg68۫]S8n~qZ HΰZ2eK6k! Z!#1)TR XeoCFO,PbQ!#'늵m~"ޞ4~X`x;T}21ݞտ= m-CԸ}lü%hTS8sTOo6t2i&q^Q Fl<ܓ|;Rw[pஞݸrfޙ~9^D"h1@][Xf!R%}ҸVUY'aD aۛvJp*5}y?ed(<`«#TI6}^Xn*ե[J[zV7޸ATrDt7]hoe;e~u5j`5?k[Tcܣ ՔXO /u)":i( ȁ,Jf϶nDRB Ux^;,3BNFS.!k2yp,~i*LN f>nƩutMX}/ЩCn0ݢm|v}k֑x-(dOFl^KA}-=8=W@W#`IJ>`Y8#NkRfs⺢(Eu0>swt9@m޳z7"% S~:-s0%$֒יmӣ6쨠 wNË͹op6j Vq PRLa)Q,ҮrD%]_*[f@f53t0D 3o K/!K~^z c}yfW<f " K4R/4r+M /`{p"?^\z =CHG@$vUaH[H=|~@S#]d9h&` *ukL =lm*0I89Z;= 2]\d%&x LufMwP;oJFho w5O'\X9}cF5/26Ws_(G MOa$Z0W{ZI]P$O~Ê#E">0[*y }HuVdh\"yaszh۸eUl+&[1_i60sȭ|))[=4Dh@ I@< ڍi#  a=HWQJ(yA' utJ 0! ^P+ȩayZXů4"F9QN+R ZDhV|Rޤ1㾎Uaἶ54A~l 41 _6 x QUew l+b:f|3AA8$hvDs q\ICq1bsJӳhK#w_s /?7,HXx B̬vKCU'WD,7^BM/Ҕؠ_*l"% ))LaC/mC-*MD?wV:nwԑ.z":a3s7hBNb%_~B4V (>VjebonZ4lLuvv fU *f2BWqRZitݫy M@+8T-Z-aξ8~\ohD͑ĈHdT dkS^#,eBDJWzz㼟Ue0EZ"oobv*&' ̥10oh/80u`?4LrąǮJQ*S9o6;G%yvmjoF;Iz^SҴpk%8nq'Vs?s~S7ȹȤʹjI ~K* RδsSy5\2-t+.gR?G4 ? 5dQƻʷZ$[S oǞ;)xD]2"w]%flR,U[q'K]*֦@#1>XL2wn8!_T|̵݇iਵh5F,O{)x r[ HBeI%:#*W5`eYDq'rk7~pZ{R'pAYv0mZkb̳:D1y8R; /'9{HWX{NiH,H+JF`tU)1"J]|mԶ8D(YI$$#Eu,[iWxDe]ܦ4tch@Te Gݫgz[pg) Qվ= 3[f~j8q~M_8V=X:9["j/ru?Brpͤ0oGSNQ>_nM 8q}[ΦzE{k1ƒ&P;} p,ɫGV.8 4Ls2+D+v[wZ&=|xP K1sC|oxHĝ\}Rn:5̸^Dq|I2'EI)&!mk~@퀒V%XIf'ڐɢ/=*61qDsՁFx C:pB7Yqr`{vIato}^7oM'JL 3Tހ,ӆ֩H(%'MVAѓ ??a}?A`V]_z`%_+[4ȉz&u2c;ۇv@=k>TqxcoS"0C'kJX@:( 7jzF{1 ے_T+y{Q1tm6ϰH[nFgV?2=98Ox8 lt#PO@ &YAɟ(  ʊ(*~|;Sz~994&YXEO?Z o b Bx<mPDa*_NMb2o(zG&N5 LtNV0{61F^ p{7뒂L fw %ԒxQ,F#J ;U#md?PtBhqBsNy}9iѼ <d &۱y7^2H}/ +f@ ,AT./n|SM`b9u|ncĉ3x2nɒJ;[y\ pʲt|Y-YK T'So+2g3w_/O%(|ACXS8܄sNϲ1Oa57kVs=O݃BMOhgi/T VfU"_T?bj3rYO}SaWi =3[b|gL,u6.}!'kP|` ~%u<ɢ\HKʗ,Lbג'ga$eGzf+8l5MӘ-YTCPkH -EE(gȴI+1~lV)ה^)ƀgTvI;9ViΥZĴa L"7;K:WEZ~v&Ι!SoͅB%z EoϷkƯ 7 M)>bXvAu[| {$d(3 j4rz¤[ŒtVz# ӕ2m i n}!l-b.ލ9mgj̗siBs8jvqY;H]7k|ܦlST0)GNZa]a{3aof"2y/O8Wǜ#a3껞Zv4bS9=,'rAtv+z\H`1SVa?2)t8*6D-qKSnNWFm7d]E ]͙b 9~$* / 9ȱ6EF~7<ԙk2/#5q [ZP!g!? sFK T̈'l9 8F2`b4 q(l+!AC;˜\HYP+ V,{LU-sel*@|/su, i.{ rMoIE4u$,34\“+Z9 Do(B(JLW#3) GCG +$e?g*ˌhBΘ`OLDC.K`j"!!A+B}ߡ#5+1Ahzꂚ+lSk]4^fm SCp>yvdR:%9Gti ]O/Xd-`*ڒ-c}&/b BN ozx UUB8=:9{`UbxxFg@7[5.jkt(0 Tp{a4.ۈS Sҙk E"im=S;XWdEKA7y 5KWƫQtFwxޯ^WCH;1`W1\2'KM@GrMO(j KOq.oP6_! ܊t,P/d^lAEoPySJX>r / y4|Y~ڔTހ{f LgKqT[r)PC*ubֱ=xv͒fwD좳 GV,#|5Q^죒-F ,LZsU{][i-[73Fko#M @75:xŀtQ.G:rPAZI$ 3*;R'R,%f~6)M(/9얟H[g:QGUI!tZs:u;FsXmvڀlFMwT0oΏӹ`!US8C+?tt_ T-{b cĩ&e _< dNԄ|Ϝ_ŗ^/$ +i:wJ~X,y;_ ڗ4bwA@:(֭缤+xb ?pDwr=s>JLo{Cor° r5%gubJ؞nry9ӜT+z]Q44`>n1&3aqÛ!VD.#.5B2٨ikH>d J͉U,"e!k iq~Ȧ{wjvY3ȑjB)gJwH4ZyX`Iw?Sm1f_C)VɊo 5Z~n\$1fb2tNYCwhȆݧJ 6)cѺCWd~\I;9)) m_eKƫp]Ȓ{Nu$j9(ܭXZF\^ aJ8dtH#XwG.)~+1r`@%Jw|QG'+'1Q\O,ѨGi}z .syN6@)`TF@iR3&ooۑLٍrAOr A7#M%_\f! bԕ~;2wP,i'yGeηQ ֥;w ׎.0Z:nlKL=jnRSـDvcfx77n͐揱& C`2yd({& 11kr8ɡ ZKKC|-\҂8KBsvCtbD3R+lG{֔@!̭+;G.kp̣h$`ifVvq5ق3m"=`FF+^7,wNڗi-ۆ=({-|-XܙۀdJ} ihZgzU%r'\us)ɮYTxB?p2PК/wlZNG.$M }zM`3Z^ڪi=##E\EF1Db$}O{[=?Xf|`^qƟ JUQ, [*Ζe͉? ^$WQ܉lO}EWG;$u7#xm9yfzi D91epB}A$RG&@;5uնhiRmxLq%[F.4VW.֧mډ/NBcJ-ªϖ;NMۿeIvX*&@scIL!o` xR倁 w%AJjS9WO 'Ylp!jӃIJ!`Yy8Kn !5 1Ȱ]9cMdnf_mCT1T6aug`2Ql'y-F:`b%vSI>b((۱AU;IdiSKP2 !o Juge 9jࢀxOo+AߨY\D=u"YT'"B>IDE<0*& >RXHD8 zژG`p ,L=Œ7|GsRQx}2h*ϷsTDslr !/P ׫onv_=a9ګ#8R e/)9{f(2,UqgIزK eFMIۮd&ov;w#'qNį(C1 (lξLxJխyV=?*i"'cF%Rvۮ*%̵YmUE3Xv4؂IO;[y$2+QY3tuhTwWk@'i¼\QH9%՝ҵOu 標\' f-2I gv*S{Ҹ uO?Ri/ # vpRrHEjpD mXqѭ)%&`(HGf\o u0=,&BRP3VhG]H~< qvj9hUPde%")1 2 R:{24Kgg8 \NbUAyk"hHH'фGŏؾSLgH5~%g:чfH/L~0+bQhUgR}|vչ,Qt/_V7( ZO@lsՄwZ7iWz]a;^K+^/qKySR#=aS5&YPK٩!9=s|D'B9Ƀt!}k|w)`rbTKvA*:jE~3Ϝ4z $Umd"_%L+ԆJh҈ҁ˺z"_6 RN6;nh%GfP.fW2_;*~3kObw0c^Zoլ"M0Ϥ# 76D$bVZ/)cE ClT9}AXqo}P~RE *po=m(tem:(h:d+g9Uû Hճ]~'aDL1tYSCh҂.[Z^~sIF.V f A!rނ A\Fo^]??6ꓖ&|?bmXpW$ܺ7wu@k(^ĈW2SvglUHa?T>nL\{'*Y^y~Jm2}op6rp~XJfmMY)LTȪ$S6t@HV:,X0ԅ<*QrRVrn77hO mF!C0\^LZD!5 u[$_N] kmC9p# вoȂ0--_\>< nso-=Y d8.)QP&\F ӆ8d G u!f2'Ibdûr,d~*=RD;,# s }gI0@ʿ|87!K8oWjOES@7'8ۏ:z=&J5s~5gGT{H*֢x4*8)+H?_ LGZ,4da"N~jFg_1P! 6?^"}IKp ԠVMhD 78hlFvGbC/8ހ[0I9oIe]Fj+D& +YsV,?َUɿtp90B@~}4GqR"É),1nL@s?ӧ%Q.Fx`{;>@QBیxypbiqs/ީ'M /:hE͈:ɨJHh|T~&̞6xڭ읰/o:Q@1^ۍ  ;ݴueN «h2rT{3%7#p&˗dƬ*kmx:Aiq&Ό:hE Y0Ү^)^CTiT#dɧBlʷ}ƺcw^ }.R8A .0Y?yվDr\\c}qo@{knSXF˓!;kΞfp5ˊWœ/r{UXy!۬vW?gh8Xo|]p1|>כ)RfwhG@fe_߷vB-Hl {DL(iJ^o/ ɯʧ+56 ЊpV;E]ѣe\ )Ok9g K_qx0k;?@g?+ X bN6cC|%nMOtK>G8t>~$}5b)<>^4jC~||=_W z;Mbwck< ܗn:IE9!v E; $ziFrZ¸Pg6ծQEg?V YX}(8W+ppJNl8!BuKwǧXXP!N2[TsJ/"ƒ *p@@笮a{HD,lrHsXC[%OiƆ{;FoR9&M5:Z}A"vJUf|U &ܒ90s+p.>Un$dJv2ˋ&ː^p"G.K JD#X^ͦDQDpCD$a@Uk=stť)VUQ;D?&˜| 69\Tg./(]j'LL뷌\ys^.̝NЅ q9v0cSk%68;ɦS߹ଟ\ȌY:~A&sDX(*@Vs8F|܎~9voU䴟-0':+cxCֺFshu#_ҟxP K}~ۋȍn~KerYQG: G[?ȸBEl.࣭@ XtozG=t2^1aylfqjw<ɽM ILqK1ۃNG4r!QO}ti^+#N]K k 1<]2% AUtXc&/?J]M%@  2*> QV~͏z nVR.{aWQE6sZ|3O!*?YEPp'Z5~%8XT Qc y/^ON(3\EɶO5gS4tp- n;$m(Z[Q{z= odh&`ĥ!ܶւ[vUs2[,24&V>'^ 'I[OR QAhJ?w"G L#>Wiz"#!Զ7f ?+B?ܰʋ4ghsDj>>1R|j?sM2"S_E̳řGЍ:e]wCd&L&^mEַuڿUX +IeTP~?`R'rRs{t}N<[^~sݢ3F=cIistBLbh4 s`r86`Q"*$^Jz-+)dNR2)+#H 9yD5 O)Wy$]t=!et B&1`Ju>Q$>C(vzgdԈԁZ?O6YJ*C,77E!G2`nӀ*IC !6ڤ Kbf=X$A/wh 9XE$:5+׶fjh\Zv{:f.:܌0"tK 9؋ǚ|j] DՅg)uX n}:o}`sz{p3cx;hPG%k7* 8 YaFN%tlSQ$qjf١IETHk @\ @QIFHUr5|&Dud/tԚ%<>D\+J1ELN[BSc)K!9j^ ~v*bllN(UPe %2I'F ?',ܓү$X|47ggxmND VCiǶRS*NQ }:d݆8qY!Es1HZiy>( )4 =wЌ%&jM&,Ÿj^bغ̮_2Q榴2򟙝(0Q. Ěfo_TēwPLZWB5'WhjٯDSGy_ODXH{ܰ]g49]:&aN)@33/lVAXy5&0i"a˄p.jg:[/ƈ yca$5L/$}pcVwkGUtjf R3sӂ'D14uNEҩ{=p+udE RoSG%B?Rr̲ha?v;t #$,1 =i QC$RlzEdvM x-RvU̅f%k{7b9)(ρ; cӨ-3/w]I|G(cD\/N?<tmh' 5@e+U.RU#nyv+ ,鎜83 G=,:/`-NGc6N>&OQ,b8t3lĘ<0(((YTMnձ /s$] عD-`! U3_][!;!_#f0EBgA>}mu?TgS/X$ }3052 ITLLIYe%6 zWY5+L6MYut5 K^bO4\UϊpGrœ 5nTgh%.9y53(McBOW1e!OT~MF=)ᐩn %a'`\6!4|y.l?>;G!O/ :)FB_2ii<*j|s#Vum `Px$~@)GzyIf<xUnߏ34?`ү wp[i:wݖEo5qEP < ބD2C& @1X"| ]+rW|Sǁp#C3/hܝ ~\.`F6"ۣ]ZΨzW5efu?C,ʈnV.D#vgbZ=8n>= -K>i5Čtm( H#}pZJC/m/v,-G)ߙej`=@F Hn˙ǞËh[%AgSc.rؓ`^?AGBzQ6혴á75{'M *flMʴiSVR;hG]-Äv])N,(^*Wmu($O7=L JihjJi)=(%{wAd3\j4-7خi-D&- d3彫WFAUIՋޗ޷Q@7; 0>NJ|bÔON) Zy`.61^\G1h,a)qRT?s301ntX!b$V&?qT6_gYcJh,7=,1}bp]]dݣPVWw /*DrAFIb,tؿC NcdZ8Jn }ݽ4/:'GY; 흸JUH\˻ZpvEcgG7OڧwNәAգGwvR@B4i`Xu(@:KR);s:$4)nJpb#;*29JdX)Q*i^3yS1UV&̠ ݁!G縷) ? y3mgMϪQp hȖC%?i-oGcY7]_ߎѠ=إB}6zj0 0?o:i;6&Hl{wX/wfM!Ok^Pu@Fu^+(XCZE֎,s(S`HDd'u w Ci~mqw EI h5d()@) %pJԲË{$1"g# |vg`mfHu% ic_7-ܠ=҆YRTH2lDr.aIpϣɧm\A6;aJLI OfGeS 5>ڈ"]=?ctMH]_:FڪbƖ>_hg5̀ =u>\ӗIЙ2W#yG5 IHuUrHf@\tt캁[С,D p[@;r F̯U o dp^O0OG#B,Gx~GT).ϙ fZ}c4 Li'(2C .'e=r(5,3Jj&#JA!{P*l^oge$’RUc;H>5n ?沵AIGq鬫=M +u*2Vxc"В{54mR\'YDri،7ouXᨤђqP0>xdBUeyTF˛gnhj1}6o&&-|:6B'\>p+n*4`PA?`wo0ͯ-O3A6[#25ÚapIʵ:b&"+8ͤC8ow5 hIΫ8t9slYk oaWcsD`yvyg|sS9XÆ7:lowvaf6⍩o7W7+lLqT"kV&ɣb4\fW ]mZ0ݒ< #dnfۨiT-,E41&zk<'|dC8ך%EMSlv2 s("9o[@^P8V{E<1V*Ɖw\Tb*mT[]nq08 ƄxRF`MRl">) I0Eb$ u'(dr#e%/CZ暗ɀpV0Sx;5df,have qt*A;eΧm$գ#\?; ,ˍz!%uv#2_Rr^ԼWDm^5fO җ.h9LtAuSibX.q) p^]kCgf["]vàN[ *&#ֆt6׶FSlRZGޞ*q4[FJn$9l[=^sMS@BzˏTp?ǫ&9=3K8(RfwsCɺX,Kh_{}nKCZ7JCN:H4nUpo7WA{Q_P<Xx-μ:(VF'sUBI 4iJxs?mNIPKw!<2|/;W7xTB&GK^{;95vYliw(W2#5^w<+IT9$'/3ԧpN3s4b" i>%UpXMCb9[еEӟt5ĺ~V3TFJYQ;h+Q(>-`o窆JB*kJߧT_ks9qJ{_LFƇ)q3RleT` hu "s#~Ay?a551vDz;:H󾘾}\j~B>+Gd'%z, e0+DjYXB,&E˃s2Gw J Nί:=.uf< >|ECǹ*a"`3}1!vj ES 0Ew2uLʭ(u$Za?tR~}aS[ NlK&Yâqk?~ȹ],m ifÁqyk2YI'f\w?2ک'+2mYFX2F*H{Xhkc~\oUg BO^)(0յלY]C8Zg7̂ne\~Wa!IiSD“ЪNT?{1VqyQWnПdĮ7gWHZ,fClG H\6x,nU+oEψhΡ7|80+0ZL#a< S8pˏDF8"2cE_xlO X+c@M.c"AWClN0'<&mQ;=-bȮs{%K WBF[,y⥘[X_zCҔ*́5yUM#7!Woǵ V4!$Zt'zR _ 3Υ HXV\ ӈ W2S~;1NfR2Nu%֍srؖ n1mYIGE9|_%d7{Ȑ58}GCwU`K^.E~PJ t8'g%o b$)N}/hew5)J*Fg48i'l1oG*@HںylY6 /ϥ󫗫Vl b|x<]/;fJ+u@?OrC(,Z8 1lx2lyt_+;~m@N-$0SdMx PB ViO+LmW*qވĵCOURp3TB/9jA4 V>dqvq~/=mZ.'%2B?ر4Տ03!|JQ 43cU|[ma4rd?kϕ&* l3t*z;' >ߟdw-şdB*OVx+W0K~S :&qEhfdrx(h_Ps)ϼ6U*sbMVS%/BKmUIQDJUZ"3q\*RF*,e8vwAq%]ի:EϘMCG֛!-=/w[DBui zh\Ԃ_>VՋQ -O)kfC4i ^^63YjD/{$J&}IDiΠJY]7'jƩ|3Ԥ; ]^R+=V DƣcAITu \S.qc9F=Z4ufsmŸ#5<8z(odݐ.YdHfG%p"oDjA+ ,8yt!BrGR]݋~=뒱fڑ¨Zd4[8ONQtUlJk\ɉGNLZnYPܧOAEI{&^)¡x8Nx)9}ڄ3nnߘ !ƜЉAw[k@[B sNcqvEMk,1+e$tBJ8WbGgAUw~t3x20 (S\OQ[s։b+[1Ί{;/4 |s}2Ŋ2+CjcBGY{C!tCc86.:tW5=1hRs y΁ rD|t%V@I8d\0摯OUQaR>~C 9 l: V4r#xQ+"!B| ~ @&2^ؒ&da,1A4>WY?Ϭ/u ǭ3fٸm?#G;h :{|!qDZSʲu ݚGgq`]&_Iq9+@w /^&q<%5X1_M!΅r K10|YZvB [zl|Ux[G-A!Ox+h}DSc9N}=c%ri+ 4h ^*xɇc:b(5w8yvýe+)8ꦝ%|T1o@ 3LtY_ 1ߡV}Cwonה7@wT A"6 7L\pߝֽY\7vc4';7!F|rDs"@yHXQA!! *'2 i KݚqؤHtHn7q:k FsRR0D.Z {o<֊_w'Azi5plҴyԊ@=Me,IE\rtSP0ɝ%EqT-z_ c8F O98^OŢ q_,n{$0aK ?6ⱌv}4 D<y{lMzJv792[Tx&="yH[m#]^/E*I wJ+sF,YV=8śNV¡h[g?w2*`Vg>ZU- iC9U]2GpQgʼDzˢͭR|)X'Qbt7󁽌%Q1kݒx@v &j{Y< (W ys^7aV';jd1%-ƫgkc߉ (۪AGF0+FTK۷˜@BXi찛_Uյj!32XUEVL|$|a=lWaEQ]TYC7lUeYM )aB^6Tةk^|bS0˄nH5)F҇z\M SK !! 1P  _openblas.lib B㉑ qiskit-aer-0.4.1/src/transpile/000077500000000000000000000000001362723322000163555ustar00rootroot00000000000000qiskit-aer-0.4.1/src/transpile/basic_opts.hpp000066400000000000000000000046441362723322000212240ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_transpile_basic_opt_hpp_ #define _aer_transpile_basic_opt_hpp_ #include "transpile/circuitopt.hpp" namespace AER { namespace Transpile { using uint_t = uint_t; using op_t = Operations::Op; using optype_t = Operations::OpType; using oplist_t = std::vector; using opset_t = Operations::OpSet; using reg_t = std::vector; class ReduceBarrier : public CircuitOptimization { public: void optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const opset_t &opset, ExperimentData &data) const override; }; void ReduceBarrier::optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const opset_t &allowed_opset, ExperimentData &data) const { size_t idx = 0; for (size_t i = 0; i < circ.ops.size(); ++i) { if (circ.ops[i].type != optype_t::barrier) { if (idx != i) circ.ops[idx] = circ.ops[i]; ++idx; } } if (idx != circ.ops.size()) circ.ops.erase(circ.ops.begin() + idx, circ.ops.end()); } class Debug : public CircuitOptimization { public: void optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const opset_t &opset, ExperimentData &data) const override; }; void Debug::optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const opset_t &allowed_opset, ExperimentData &data) const { oplist_t::iterator it = circ.ops.begin(); while (it != circ.ops.end()) { std::clog << it->name << std::endl; ++it; } } //------------------------------------------------------------------------- } // end namespace Transpile } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/transpile/circuitopt.hpp000066400000000000000000000030461362723322000212560ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_circuit_optimization_hpp_ #define _aer_circuit_optimization_hpp_ #include #include #include #include #include #include #include #include #include "framework/operations.hpp" #include "noise/noise_model.hpp" namespace AER { namespace Transpile { class CircuitOptimization { public: CircuitOptimization() = default; virtual ~CircuitOptimization() = default; virtual void optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const Operations::OpSet &opset, ExperimentData &data) const = 0; virtual void set_config(const json_t &config); protected: json_t config_; }; void CircuitOptimization::set_config(const json_t& config) { config_ = config; } //------------------------------------------------------------------------- } // end namespace Transpile } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/transpile/delay_measure.hpp000066400000000000000000000103711362723322000217070ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_transpile_delay_measure_hpp_ #define _aer_transpile_delay_measure_hpp_ #include #include "transpile/circuitopt.hpp" namespace AER { namespace Transpile { class DelayMeasure : public CircuitOptimization { public: // DelayMeasure uses following configuration options // - delay_measure_verbose (bool): if true, output generated gates in metadata (default: false) // - delay_measure_enable (bool): if true, activate optimization (default: true) void set_config(const json_t &config) override; // Push back measurements to tail of circuit if no non-measure // instructions follow on the same qubits // This allows measure sampling to be used on more circuits void optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const Operations::OpSet &opset, ExperimentData &data) const override; private: // show debug info bool verbose_ = false; // disabled in config bool active_ = true; }; void DelayMeasure::set_config(const json_t &config) { CircuitOptimization::set_config(config); JSON::get_value(verbose_, "delay_measure_verbose", config); JSON::get_value(active_, "delay_measure_enable", config); } void DelayMeasure::optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const Operations::OpSet &allowed_opset, ExperimentData &data) const { // Pass if we have quantum errors in the noise model if (active_ == false || circ.shots <= 1 || noise.has_quantum_errors()) return; // Get position of first measure / readout error in circ auto it = circ.ops.begin(); while (it != circ.ops.end()) { const auto type = it->type; if (type == Operations::OpType::measure || type == Operations::OpType::roerror) break; ++it; } // If there are no measure instructions we don't need to optimize if (it == circ.ops.end()) return; // Store measure and non measure instructions in the tail // for possible later remapping size_t pos = std::distance(circ.ops.begin(), it); std::vector meas_ops; meas_ops.reserve(circ.ops.size() - pos); std::vector non_meas_ops; non_meas_ops.reserve(circ.ops.size() - pos); // Scan circuit to find position of first measure for all qubits; std::unordered_set meas_qubits; while (it != circ.ops.end()) { // If any operations are conditional we abort if (it->conditional) return; const auto type = it->type; const auto qubits = it->qubits; switch (type) { case Operations::OpType::measure: case Operations::OpType::roerror: { meas_qubits.insert(qubits.begin(), qubits.end()); meas_ops.push_back(*it); break; } case Operations::OpType::snapshot: { return; } default: { for (const auto& qubit : qubits) { if (meas_qubits.find(qubit) != meas_qubits.end()) { return; } } non_meas_ops.push_back(*it); } } ++it; } // Check if there are any non-meas instructions in the tail if (non_meas_ops.empty()) return; // Now modify the circuit to add meas instructions // after non meas instructions circ.ops.erase(circ.ops.begin() + pos, circ.ops.end()); circ.ops.insert(circ.ops.end(), non_meas_ops.begin(), non_meas_ops.end()); circ.ops.insert(circ.ops.end(), meas_ops.begin(), meas_ops.end()); if (verbose_) data.add_metadata("delay_measure_verbose", circ.ops); } //------------------------------------------------------------------------- } // end namespace Transpile } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/transpile/fusion.hpp000066400000000000000000000513061362723322000203760ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_transpile_fusion_hpp_ #define _aer_transpile_fusion_hpp_ #include "transpile/circuitopt.hpp" namespace AER { namespace Transpile { using uint_t = uint_t; using op_t = Operations::Op; using optype_t = Operations::OpType; using oplist_t = std::vector; using opset_t = Operations::OpSet; using reg_t = std::vector; class Fusion : public CircuitOptimization { public: // constructor Fusion(uint_t max_qubit = 5, uint_t threshold = 20, double cost_factor = 1.8); /* * Fusion optimization uses following configuration options * - fusion_enable (bool): Enable fusion optimization in circuit optimization * passes [Default: True] * - fusion_verbose (bool): Output gates generated in fusion optimization * into metadata [Default: False] * - fusion_max_qubit (int): Maximum number of qubits for a operation generated * in a fusion optimization [Default: 5] * - fusion_threshold (int): Threshold that number of qubits must be greater * than to enable fusion optimization [Default: 20] * - fusion_cost_factor (double): a cost function to estimate an aggregate * gate [Default: 1.8] */ void set_config(const json_t &config) override; void optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const opset_t &allowed_opset, ExperimentData &data) const override; private: bool can_ignore(const op_t& op) const; bool can_apply_fusion(const op_t& op) const; double get_cost(const op_t& op) const; bool aggregate_operations(oplist_t& ops, const int fusion_start, const int fusion_end) const; op_t generate_fusion_operation(const std::vector& fusioned_ops) const; void swap_cols_and_rows(const uint_t idx1, const uint_t idx2, cmatrix_t &mat, uint_t dim) const; cmatrix_t sort_matrix(const reg_t &src, const reg_t &sorted, const cmatrix_t &mat) const; cmatrix_t expand_matrix(const reg_t& src_qubits, const reg_t& dst_sorted_qubits, const cmatrix_t& mat) const; bool is_diagonal(const oplist_t& ops, const uint_t from, const uint_t until) const; double estimate_cost(const oplist_t& ops, const uint_t from, const uint_t until) const; void add_fusion_qubits(reg_t& fusion_qubits, const op_t& op) const; cmatrix_t matrix(const op_t& op) const; #ifdef DEBUG void dump(const Circuit& circuit) const; #endif const static std::vector supported_gates; private: uint_t max_qubit_; uint_t threshold_; double cost_factor_; bool verbose_ = false; bool active_ = true; }; const std::vector Fusion::supported_gates({ "id", // Pauli-Identity gate "x", // Pauli-X gate "y", // Pauli-Y gate "z", // Pauli-Z gate "s", // Phase gate (aka sqrt(Z) gate) "sdg", // Conjugate-transpose of Phase gate "h", // Hadamard gate (X + Z / sqrt(2)) "t", // T-gate (sqrt(S)) "tdg", // Conjguate-transpose of T gate // Waltz Gates "u0", // idle gate in multiples of X90 "u1", // zero-X90 pulse waltz gate "u2", // single-X90 pulse waltz gate "u3", // two X90 pulse waltz gate "U", // two X90 pulse waltz gate // Two-qubit gates "CX", // Controlled-X gate (CNOT) "cx", // Controlled-X gate (CNOT) "cu1", // Controlled-U1 gate "cz", // Controlled-Z gate "swap" // SWAP gate // Three-qubit gates //"ccx" // Controlled-CX gate (Toffoli): TODO }); Fusion::Fusion(uint_t max_qubit, uint_t threshold, double cost_factor): max_qubit_(max_qubit), threshold_(threshold), cost_factor_(cost_factor) { } void Fusion::set_config(const json_t &config) { CircuitOptimization::set_config(config); if (JSON::check_key("fusion_verbose", config_)) JSON::get_value(verbose_, "fusion_verbose", config_); if (JSON::check_key("fusion_enable", config_)) JSON::get_value(active_, "fusion_enable", config_); if (JSON::check_key("fusion_max_qubit", config_)) JSON::get_value(max_qubit_, "fusion_max_qubit", config_); if (JSON::check_key("fusion_threshold", config_)) JSON::get_value(threshold_, "fusion_threshold", config_); if (JSON::check_key("fusion_cost_factor", config_)) JSON::get_value(cost_factor_, "fusion_cost_factor", config_); } #ifdef DEBUG void Fusion::dump(const Circuit& circuit) const { int idx = 0; for (const op_t& op : circuit.ops) { std::cout << " " << idx++ << ":\t" << op.name << " " << op.qubits << std::endl; for (const cmatrix_t& mat: op.mats) { const uint_t row = mat.GetRows(); const uint_t column = mat.GetColumns(); for (uint_t i = 0; i < row; ++i) { for (uint_t j = 0; j < column; ++j) { if (j == 0) std::cout << " "; else std::cout << ", "; std::cout << mat(i, j); } std::cout << std::endl; } } } } #endif void Fusion::optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const opset_t &allowed_opset, ExperimentData &data) const { // Check if fusion should be skipped if (circ.num_qubits < threshold_ || !active_ || !allowed_opset.contains(optype_t::matrix)) return; bool applied = false; uint_t fusion_start = 0; for (uint_t op_idx = 0; op_idx < circ.ops.size(); ++op_idx) { if (can_ignore(circ.ops[op_idx])) continue; if (!can_apply_fusion(circ.ops[op_idx])) { applied |= fusion_start != op_idx && aggregate_operations(circ.ops, fusion_start, op_idx); fusion_start = op_idx + 1; } } if (fusion_start < circ.ops.size() && aggregate_operations(circ.ops, fusion_start, circ.ops.size())) applied = true; if (applied) { size_t idx = 0; for (size_t i = 0; i < circ.ops.size(); ++i) { if (circ.ops[i].name != "nop") { if (i != idx) circ.ops[idx] = circ.ops[i]; ++idx; } } if (idx != circ.ops.size()) circ.ops.erase(circ.ops.begin() + idx, circ.ops.end()); if (verbose_) data.add_metadata("fusion_verbose", circ.ops); } #ifdef DEBUG dump(circ.ops); #endif } bool Fusion::can_ignore(const op_t& op) const { switch (op.type) { case optype_t::barrier: return true; case optype_t::gate: return op.name == "id" || op.name == "u0"; default: return false; } } bool Fusion::can_apply_fusion(const op_t& op) const { if (op.conditional) return false; switch (op.type) { case optype_t::matrix: return op.mats.size() == 1 && op.mats[0].size() <= 4; case optype_t::gate: return (std::find(supported_gates.begin(), supported_gates.end(), op.name) != supported_gates.end()); case optype_t::reset: case optype_t::measure: case optype_t::bfunc: case optype_t::roerror: case optype_t::snapshot: case optype_t::kraus: case optype_t::barrier: default: return false; } } double Fusion::get_cost(const op_t& op) const { if (can_ignore(op)) return .0; else return cost_factor_; } bool Fusion::aggregate_operations(oplist_t& ops, const int fusion_start, const int fusion_end) const { // costs[i]: estimated cost to execute from 0-th to i-th in original.ops std::vector costs; // fusion_to[i]: best path to i-th in original.ops std::vector fusion_to; // set costs and fusion_to of fusion_start fusion_to.push_back(fusion_start); costs.push_back(get_cost(ops[fusion_start])); bool applied = false; // calculate the minimal path to each operation in the circuit for (int i = fusion_start + 1; i < fusion_end; ++i) { // init with fusion from i-th to i-th fusion_to.push_back(i); costs.push_back(costs[i - fusion_start - 1] + get_cost(ops[i])); for (int num_fusion = 2; num_fusion <= static_cast (max_qubit_); ++num_fusion) { // calculate cost if {num_fusion}-qubit fusion is applied reg_t fusion_qubits; add_fusion_qubits(fusion_qubits, ops[i]); for (int j = i - 1; j >= fusion_start; --j) { add_fusion_qubits(fusion_qubits, ops[j]); if (static_cast (fusion_qubits.size()) > num_fusion) // exceed the limit of fusion break; // calculate a new cost of (i-th) by adding double estimated_cost = estimate_cost(ops, (uint_t) j, i) // fusion gate from j-th to i-th, and + (j == 0 ? 0.0 : costs[j - 1 - fusion_start]); // cost of (j-1)-th // update cost if (estimated_cost <= costs[i - fusion_start]) { costs[i - fusion_start] = estimated_cost; fusion_to[i - fusion_start] = j; applied = true; } } } } if (!applied) return false; // generate a new circuit with the minimal path to the last operation in the circuit for (int i = fusion_end - 1; i >= fusion_start;) { int to = fusion_to[i - fusion_start]; if (to != i) { std::vector fusioned_ops; for (int j = to; j <= i; ++j) { fusioned_ops.push_back(ops[j]); ops[j].name = "nop"; } if (!fusioned_ops.empty()) ops[i] = generate_fusion_operation(fusioned_ops); } i = to - 1; } return true; } op_t Fusion::generate_fusion_operation(const std::vector& fusioned_ops) const { std::vector regs; std::vector mats; for (const op_t& fusioned_op: fusioned_ops) { regs.push_back(fusioned_op.qubits); mats.push_back(matrix(fusioned_op)); } reg_t sorted_qubits; for (const reg_t& reg: regs) for (const uint_t qubit: reg) if (std::find(sorted_qubits.begin(), sorted_qubits.end(), qubit) == sorted_qubits.end()) sorted_qubits.push_back(qubit); std::sort(sorted_qubits.begin(), sorted_qubits.end()); std::vector sorted_mats; for (size_t i = 0; i < regs.size(); ++i) { const reg_t& reg = regs[i]; const cmatrix_t& mat = mats[i]; sorted_mats.push_back(expand_matrix(reg, sorted_qubits, mat)); } auto U = sorted_mats[0]; const auto dim = 1ULL << sorted_qubits.size(); for (size_t m = 1; m < sorted_mats.size(); m++) { cmatrix_t u_tmp(U.GetRows(), U.GetColumns()); const cmatrix_t& u = sorted_mats[m]; for (size_t i = 0; i < dim; ++i) for (size_t j = 0; j < dim; ++j) for (size_t k = 0; k < dim; ++k) u_tmp(i, j) += u(i, k) * U(k, j); U = u_tmp; } return Operations::make_unitary(sorted_qubits, U, std::string("fusion")); } cmatrix_t Fusion::expand_matrix(const reg_t& src_qubits, const reg_t& dst_sorted_qubits, const cmatrix_t& mat) const { const auto dst_dim = 1ULL << dst_sorted_qubits.size(); // generate a matrix for op cmatrix_t u(dst_dim, dst_dim); std::vector filled(dst_dim, false); if (src_qubits.size() == 1) { //1-qubit operation // 1. identify delta const auto index = std::distance(dst_sorted_qubits.begin(), std::find(dst_sorted_qubits.begin(), dst_sorted_qubits.end(), src_qubits[0])); const auto delta = 1ULL << index; // 2. find vmat(0, 0) position in U for (uint_t i = 0; i < dst_dim; ++i) { if (filled[i]) continue; // 3. allocate op.u to u based on u(i, i) and delta u(i , (i + 0) ) = mat(0, 0); u(i , (i + delta)) = mat(0, 1); u((i + delta), (i + 0) ) = mat(1, 0); u((i + delta), (i + delta)) = mat(1, 1); filled[i] = filled[i + delta] = true; } } else if (src_qubits.size() == 2) { //2-qubit operation reg_t sorted_src_qubits = src_qubits; std::sort(sorted_src_qubits.begin(), sorted_src_qubits.end()); const cmatrix_t sorted_mat = sort_matrix(src_qubits, sorted_src_qubits, mat); // 1. identify low and high delta auto low = std::distance(dst_sorted_qubits.begin(), std::find(dst_sorted_qubits.begin(), dst_sorted_qubits.end(), sorted_src_qubits[0])); auto high = std::distance(dst_sorted_qubits.begin(), std::find(dst_sorted_qubits.begin(), dst_sorted_qubits.end(), sorted_src_qubits[1])); auto low_delta = 1UL << low; auto high_delta = 1UL << high; // 2. find op.u(0, 0) position in U for (uint_t i = 0; i < dst_dim; ++i) { if (filled[i]) continue; // 3. allocate vmat to u based on u(i, i) and delta u(i , (i + 0) ) = sorted_mat(0, 0); u(i , (i + low_delta) ) = sorted_mat(0, 1); u(i , (i + high_delta) ) = sorted_mat(0, 2); u(i , (i + low_delta + high_delta)) = sorted_mat(0, 3); u((i + low_delta) , (i + 0) ) = sorted_mat(1, 0); u((i + low_delta) , (i + low_delta) ) = sorted_mat(1, 1); u((i + low_delta) , (i + high_delta) ) = sorted_mat(1, 2); u((i + low_delta) , (i + low_delta + high_delta)) = sorted_mat(1, 3); u((i + high_delta) , (i + 0) ) = sorted_mat(2, 0); u((i + high_delta) , (i + low_delta) ) = sorted_mat(2, 1); u((i + high_delta) , (i + high_delta) ) = sorted_mat(2, 2); u((i + high_delta) , (i + low_delta + high_delta)) = sorted_mat(2, 3); u((i + low_delta + high_delta), (i + 0) ) = sorted_mat(3, 0); u((i + low_delta + high_delta), (i + low_delta) ) = sorted_mat(3, 1); u((i + low_delta + high_delta), (i + high_delta) ) = sorted_mat(3, 2); u((i + low_delta + high_delta), (i + low_delta + high_delta)) = sorted_mat(3, 3); filled[i] = true; filled[i + low_delta] = true; filled[i + high_delta] = true; filled[i + low_delta + high_delta] = true; } //TODO: } else if (src_qubits.size() == 3) { } else { throw std::runtime_error("Fusion::illegal qubit number: " + std::to_string(src_qubits.size())); } return u; } //------------------------------------------------------------------------------ // Gate-swap optimized helper functions //------------------------------------------------------------------------------ void Fusion::swap_cols_and_rows(const uint_t idx1, const uint_t idx2, cmatrix_t &mat, uint_t dim) const { uint_t mask1 = (1UL << idx1); uint_t mask2 = (1UL << idx2); for (uint_t first = 0; first < dim; ++first) { if ((first & mask1) && !(first & mask2)) { uint_t second = (first ^ mask1) | mask2; for (uint_t i = 0; i < dim; ++i) { complex_t cache = mat(first, i); mat(first, i) = mat(second, i); mat(second, i) = cache; } for (uint_t i = 0; i < dim; ++i) { complex_t cache = mat(i, first); mat(i, first) = mat(i, second); mat(i, second) = cache; } } } } cmatrix_t Fusion::sort_matrix(const reg_t &src, const reg_t &sorted, const cmatrix_t &mat) const { const uint_t dim = mat.GetRows(); auto ret = mat; auto current = src; while (current != sorted) { uint_t from; uint_t to; for (from = 0; from < current.size(); ++from) if (current[from] != sorted[from]) break; if (from == current.size()) break; for (to = from + 1; to < current.size(); ++to) if (current[from] == sorted[to]) break; if (to == current.size()) { std::stringstream ss; ss << "Fusion::sort_matrix we should not reach here"; throw std::runtime_error(ss.str()); } swap_cols_and_rows(from, to, ret, dim); uint_t cache = current[from]; current[from] = current[to]; current[to] = cache; } return ret; } bool Fusion::is_diagonal(const std::vector& ops, const uint_t from, const uint_t until) const { // check unitary matrix of ops between "from" and "to" is a diagonal matrix for (uint_t i = from; i <= until; ++i) { // ┌───┐┌────┐┌───┐ // ─┤ X ├┤ U1 ├┤ X ├ // └─┬─┘└────┘└─┬─┘ // ───■──────────■─- if ((i + 2) <= until && ops[i + 0].name == "cx" && ops[i + 1].name == "u1" && ops[i + 2].name == "cx" && ops[i + 0].qubits[1] == ops[i + 1].qubits[0] && ops[i + 1].qubits[0] == ops[i + 2].qubits[1] && ops[i + 0].qubits[0] == ops[i + 2].qubits[0] ) { i += 2; continue; } if (ops[i].name == "u1" || ops[i].name == "cu1") continue; return false; } return true; } double Fusion::estimate_cost(const std::vector& ops, const uint_t from, const uint_t until) const { if (is_diagonal(ops, from, until)) return cost_factor_; reg_t fusion_qubits; for (uint_t i = from; i <= until; ++i) add_fusion_qubits(fusion_qubits, ops[i]); return pow(cost_factor_, (double) std::max(fusion_qubits.size() - 1, size_t(1))); } void Fusion::add_fusion_qubits(reg_t& fusion_qubits, const op_t& op) const { for (const auto qubit: op.qubits){ if (find(fusion_qubits.begin(), fusion_qubits.end(), qubit) == fusion_qubits.end()){ fusion_qubits.push_back(qubit); } } } cmatrix_t Fusion::matrix(const op_t& op) const { if (op.type == optype_t::gate) { if (op.name == "id") { // Pauli-Identity gate return Utils::Matrix::I; } else if (op.name == "x") { // Pauli-X gate return Utils::Matrix::X; } else if (op.name == "y") { // Pauli-Y gate return Utils::Matrix::Y; } else if (op.name == "z") { // Pauli-Z gate return Utils::Matrix::Z; } else if (op.name == "s") { // Phase gate (aka sqrt(Z) gate) return Utils::Matrix::S; } else if (op.name == "sdg") { // Conjugate-transpose of Phase gate return Utils::Matrix::SDG; } else if (op.name == "h") { // Hadamard gate (X + Z / sqrt(2)) return Utils::Matrix::H; } else if (op.name == "t") { // T-gate (sqrt(S)) return Utils::Matrix::T; } else if (op.name == "tdg") { // Conjguate-transpose of T gate return Utils::Matrix::TDG; } else if (op.name == "u0") { // idle gate in multiples of X90 return Utils::Matrix::I; } else if (op.name == "u1") { // zero-X90 pulse waltz gate return Utils::make_matrix( { { {1, 0}, {0, 0} }, { {0, 0}, std::exp( complex_t(0, 1.) * std::real(op.params[0])) }} ); } else if (op.name == "cu1") { // zero-X90 pulse waltz gate return Utils::make_matrix( { { {1, 0}, {0, 0}, {0, 0}, {0, 0} }, { {0, 0}, {1, 0}, {0, 0}, {0, 0} }, { {0, 0}, {0, 0}, {1, 0}, {0, 0} }, { {0, 0}, {0, 0}, {0, 0}, std::exp( complex_t(0, 1.) * std::real(op.params[0])) }} ); } else if (op.name == "u2") { // single-X90 pulse waltz gate return Utils::Matrix::u3( M_PI / 2., std::real(op.params[0]), std::real(op.params[1])); } else if (op.name == "u3" || op.name == "U") { // two X90 pulse waltz gate return Utils::Matrix::u3( std::real(op.params[0]), std::real(op.params[1]), std::real(op.params[2])); // Two-qubit gates } else if (op.name == "CX" || op.name == "cx") { // Controlled-X gate (CNOT) return Utils::Matrix::CX; } else if (op.name == "cz") { // Controlled-Z gate return Utils::Matrix::CZ; } else if (op.name == "swap") { // SWAP gate return Utils::Matrix::SWAP; // Three-qubit gates // } else if (op.name == "ccx") { // Controlled-CX gate (Toffoli) // return Utils::Matrix::CCX; } else { std::stringstream msg; msg << "invalid operation:" << op.name << "\'.matrix()"; throw std::runtime_error(msg.str()); } } else if (op.type == optype_t::matrix) { return op.mats[0]; } else { std::stringstream msg; msg << "Fusion: unexpected operation type:" << op.type; throw std::runtime_error(msg.str()); } } //------------------------------------------------------------------------- } // end namespace Transpile } // end namespace AER //------------------------------------------------------------------------- #endif qiskit-aer-0.4.1/src/transpile/truncate_qubits.hpp000066400000000000000000000155511362723322000223110ustar00rootroot00000000000000/** * This code is part of Qiskit. * * (C) Copyright IBM 2018, 2019. * * This code is licensed under the Apache License, Version 2.0. You may * obtain a copy of this license in the LICENSE.txt file in the root directory * of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. * * Any modifications or derivative works of this code must retain this * copyright notice, and modified files need to carry a notice indicating * that they have been altered from the originals. */ #ifndef _aer_transpile_truncate_qubits_hpp_ #define _aer_transpile_truncate_qubits_hpp_ #include #include "transpile/circuitopt.hpp" namespace AER { namespace Transpile { class TruncateQubits : public CircuitOptimization { public: using mapping_t = std::unordered_map; void set_config(const json_t &config) override; // Truncate unused qubits void optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const Operations::OpSet &opset, ExperimentData &data) const override; private: // check this optimization can be applied bool can_apply(const Circuit& circ) const; // check this optimization can be applied bool can_apply(const Operations::Op& op) const; // Generate a list of qubits that are used in the input circuit and noise model reg_t get_active_qubits(const Circuit& circ, const Noise::NoiseModel& noise) const; // generate a new mapping. a value of reg_t is original and its index is the new mapping mapping_t generate_mapping(const reg_t& active_qubits, const Circuit& circ, const Noise::NoiseModel& noise) const; // remap qubits in an operation void remap_qubits(reg_t &qubits, const mapping_t &mapping) const; // show debug info bool verbose_ = false; // disabled in config bool active_ = true; }; void TruncateQubits::set_config(const json_t &config) { CircuitOptimization::set_config(config); if (JSON::check_key("truncate_verbose", config)) { JSON::get_value(verbose_, "truncate_verbose", config); } if (JSON::check_key("truncate_enable", config)) { JSON::get_value(active_, "truncate_enable", config); } if (JSON::check_key("initial_statevector", config)) { active_ = false; } } void TruncateQubits::optimize_circuit(Circuit& circ, Noise::NoiseModel& noise, const Operations::OpSet &allowed_opset, ExperimentData &data) const { // Check if circuit operations allow remapping // Remapped circuits must return the same output data as the // original circuit if (!active_ || !can_apply(circ)) return; // Get qubits actually used in the circuit // If this is all qubits we don't need to remap reg_t active_qubits = get_active_qubits(circ, noise); if (active_qubits.size() == circ.num_qubits) return; // Generate the qubit mapping {original_qubit: new_qubit} mapping_t mapping = generate_mapping(active_qubits, circ, noise); // Remap circuit operations for (Operations::Op& op: circ.ops) { remap_qubits(op.qubits, mapping); // Remap regs for (reg_t ® : op.regs) { remap_qubits(reg, mapping); } } // Update the number of qubits in the circuit circ.num_qubits = active_qubits.size(); // Remap noise model noise.remap_qubits(mapping); if (verbose_) { json_t truncate_metadata; truncate_metadata["active_qubits"] = active_qubits; truncate_metadata["mapping"] = mapping; data.add_metadata("truncate_qubits", truncate_metadata); } } reg_t TruncateQubits::get_active_qubits(const Circuit& circ, const Noise::NoiseModel& noise) const { size_t not_used = circ.num_qubits + 1; reg_t active_qubits = reg_t(circ.num_qubits, not_used); for (const Operations::Op& op: circ.ops) { for (size_t qubit: op.qubits) active_qubits[qubit] = qubit; for (const reg_t ®: op.regs) for (size_t qubit: reg) active_qubits[qubit] = qubit; // Add noise model qubits // The label for checking noise is either stored in string_params // or is the op name std::string label = ""; if (op.string_params.size() == 1) { label = op.string_params[0]; } if (label == "") label = op.name; const auto noise_reg = noise.nonlocal_noise_qubits(label, op.qubits); for (size_t qubit: noise_reg) { // A noise model might have more qubits in it than are in // the original circuit. In this case we only add qubits // up to the number of qubits in the circuit if (qubit < circ.num_qubits) active_qubits[qubit] = qubit; } } // Erase unused qubits for the list active_qubits.erase(std::remove(active_qubits.begin(), active_qubits.end(), not_used), active_qubits.end()); return active_qubits; } TruncateQubits::mapping_t TruncateQubits::generate_mapping(const reg_t& active_qubits, const Circuit& circ, const Noise::NoiseModel& noise) const { // Convert to mapping mapping_t mapping; for (const auto & qubit : active_qubits) { size_t new_qubit = std::distance(active_qubits.begin(), find(active_qubits.begin(), active_qubits.end(), qubit)); mapping[qubit] = new_qubit; } // Now we need to complete the mapping by adding qubits not in the input space // This is required for remapping the noise model. if (!noise.is_ideal()) { uint_t unused_qubit = active_qubits.size(); for (uint_t qubit=0; qubit bench(qft_circuits, mixed()) => # bench(qft_circuits, reset) => bench(qft_circuits, kraus()) self.params = ( self.qft_circuits, [no_noise(), mixed_unitary_noise_model(), reset_noise_model(), kraus_noise_model()], ['statevector', 'density_matrix', 'stabilizer', 'extended_stabilizer', 'matrix_product_state']) def setup(self, qobj, noise_model_wrapper, simulator_method): """ Setup env before benchmarks start """ def time_quantum_fourier_transform(self, qobj, noise_model_wrapper, simulator_method): """ Benchmark QFT """ backend_options = { 'method': simulator_method, 'noise_model': noise_model_wrapper(), } result = self.backend.run( qobj, noise_model=noise_model_wrapper() ).result() if result.status != 'COMPLETED': raise QiskitError("Simulation failed. Status: " + result.status) def peakmem_quantum_fourier_transform(self, qobj, noise_model_wrapper, simulator_method): """ Benchmark QFT """ backend_options = { 'method': simulator_method, 'noise_model': noise_model_wrapper(), } result = self.backend.run( qobj, noise_model=noise_model_wrapper() ).result() if result.status != 'COMPLETED': raise QiskitError("Simulation failed. Status: " + result.status) qiskit-aer-0.4.1/test/benchmark/quantum_volume_benchmarks.py000066400000000000000000000062041362723322000243300ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """Quantum Voluming benchmark suite""" # Write the benchmarking functions here. # See "Writing benchmarks" in the asv docs for more information. from qiskit import QiskitError from qiskit.compiler import transpile, assemble from qiskit.providers.aer import QasmSimulator from .tools import quantum_volume_circuit, mixed_unitary_noise_model, \ reset_noise_model, kraus_noise_model, no_noise class QuantumVolumeTimeSuite: """ Benchmarking times for Quantum Volume with various noise configurations - ideal (no noise) - mixed state - reset - kraus For each noise model, we want to test various configurations of number of qubits The methods defined in this class will be executed by ASV framework as many times as the combination of all parameters exist in `self.params`, for exmaple: self.params = ([1,2,3],[4,5,6]), will run all methdos 9 times: time_method(1,4) time_method(1,5) time_method(1,6) time_method(2,4) time_method(2,5) time_method(2,6) time_method(3,4) time_method(3,5) time_method(3,6) """ def __init__(self): self.timeout = 60 * 20 self.qv_circuits = [] self.backend = QasmSimulator() for num_qubits in (5, 10, 15): for depth in (10, ): # We want always the same seed, as we want always the same # circuits for the same value pairs of qubits and depth circ = quantum_volume_circuit(num_qubits, depth, seed=1) circ = transpile(circ, basis_gates=['u1', 'u2', 'u3', 'cx'], optimization_level=0, seed_transpiler=1) qobj = assemble(circ, self.backend, shots=1) self.qv_circuits.append(qobj) self.param_names = ["Quantum Volume", "Noise Model"] # This will run every benchmark for one of the combinations we have: # bench(qv_circuits, None) => bench(qv_circuits, mixed()) => # bench(qv_circuits, reset) => bench(qv_circuits, kraus()) self.params = (self.qv_circuits, [ no_noise(), mixed_unitary_noise_model(), reset_noise_model(), kraus_noise_model() ]) def setup(self, qobj, noise_model_wrapper): """ Setup enviornment before running the tests """ def time_quantum_volume(self, qobj, noise_model_wrapper): """ Benchmark for quantum volume """ result = self.backend.run( qobj, noise_model=noise_model_wrapper() ).result() if result.status != 'COMPLETED': raise QiskitError("Simulation failed. Status: " + result.status) qiskit-aer-0.4.1/test/benchmark/randomized_benchmarking.py000066400000000000000000000070671362723322000237260ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=no-member,invalid-name,missing-docstring,no-name-in-module # pylint: disable=attribute-defined-outside-init,unsubscriptable-object import numpy as np from qiskit import assemble from qiskit import transpile from qiskit import Aer import qiskit.ignis.verification.randomized_benchmarking as rb from .tools import kraus_noise_model, no_noise, mixed_unitary_noise_model, \ reset_noise_model def build_rb_circuit(nseeds=1, length_vector=None, rb_pattern=None, length_multiplier=1, seed_offset=0, align_cliffs=False, seed=None): """ Randomized Benchmarking sequences. """ if not seed: np.random.seed(10) else: np.random.seed(seed) rb_opts = {} rb_opts['nseeds'] = nseeds rb_opts['length_vector'] = length_vector rb_opts['rb_pattern'] = rb_pattern rb_opts['length_multiplier'] = length_multiplier rb_opts['seed_offset'] = seed_offset rb_opts['align_cliffs'] = align_cliffs # Generate the sequences try: rb_circs, _ = rb.randomized_benchmarking_seq(**rb_opts) except OSError: skip_msg = ('Skipping tests because ' 'tables are missing') raise NotImplementedError(skip_msg) all_circuits = [] for seq in rb_circs: all_circuits += seq return all_circuits class RandomizedBenchmarkingQasmSimBenchmark: # parameters for RB (1&2 qubits): params = ([[[0]], [[0, 1]], [[0, 2], [1]]], ['statevector', 'density_matrix', 'stabilizer', 'extended_stabilizer', 'matrix_product_state'], [no_noise(), mixed_unitary_noise_model(), reset_noise_model(), kraus_noise_model()]) param_names = ['rb_pattern', 'simulator_method', 'noise_model'] version = '0.2.0' timeout = 600 def setup(self, rb_pattern, _, __): length_vector = np.arange(1, 200, 4) nseeds = 1 self.seed = 10 self.circuits = build_rb_circuit(nseeds=nseeds, length_vector=length_vector, rb_pattern=rb_pattern, seed=self.seed) self.sim_backend = Aer.get_backend('qasm_simulator') trans_circ = transpile(self.circuits, backend=self.sim_backend, seed_transpiler=self.seed) self.qobj = assemble(trans_circ, backend=self.sim_backend) def time_run_rb_circuit(self, _, simulator_method, noise_model): backend_options = { 'method': simulator_method, 'noise_model': noise_model(), } job = self.sim_backend.run(self.qobj, backend_options=backend_options) job.result() def peakmem_run_rb_circuit(self, _, simulator_method, noise_model): backend_options = { 'method': simulator_method, 'noise_model': noise_model(), } job = self.sim_backend.run(self.qobj, backend_options=backend_options) job.result() qiskit-aer-0.4.1/test/benchmark/simple_benchmarks.py000066400000000000000000000067411362723322000225460ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Airspeed Velocity (ASV) benchmarks suite for simple 1-qubit/2-qubit gates """ from qiskit import QiskitError from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator from .tools import mixed_unitary_noise_model, \ reset_noise_model, kraus_noise_model, no_noise, \ simple_cnot_circuit, simple_u3_circuit # Write the benchmarking functions here. # See "Writing benchmarks" in the asv docs for more information. class SimpleU3TimeSuite: """ Benchmark simple circuits with just one U3 gate The methods defined in this class will be executed by ASV framework as many times as the combination of all parameters exist in `self.params`, for exmaple: self.params = ([1,2,3],[4,5,6]), will run all methdos 9 times: time_method(1,4) time_method(1,5) time_method(1,6) time_method(2,4) time_method(2,5) time_method(2,6) time_method(3,4) time_method(3,5) time_method(3,6) For each noise model, we want to test various configurations of number of qubits """ def __init__(self): self.timeout = 60 * 20 self.backend = QasmSimulator() self.circuits = [] for i in 5, 10, 15: circuit = simple_u3_circuit(i) self.circuits.append(assemble(circuit, self.backend, shots=1)) self.param_names = [ "Simple u3 circuits", "Noise Model" ] self.params = (self.circuits, [ no_noise(), mixed_unitary_noise_model(), reset_noise_model(), kraus_noise_model() ]) def time_simple_u3(self, qobj, noise_model_wrapper): """ Benchmark for circuits with a simple u3 gate """ result = self.backend.run( qobj, noise_model=noise_model_wrapper() ).result() if result.status != 'COMPLETED': raise QiskitError("Simulation failed. Status: " + result.status) class SimpleCxTimeSuite: """ Benchmark simple circuits with just on CX gate For each noise model, we want to test various configurations of number of qubits """ def __init__(self): self.timeout = 60 * 20 self.backend = QasmSimulator() self.circuits = [] self.param_names = [ "Simple cnot circuits", "Noise Model" ] for i in 5, 10, 15: circuit = simple_cnot_circuit(i) self.circuits.append(assemble(circuit, self.backend, shots=1)) self.params = (self.circuits, [ no_noise(), mixed_unitary_noise_model(), reset_noise_model(), kraus_noise_model() ]) def time_simple_cx(self, qobj, noise_model_wrapper): """ Benchmark for circuits with a simple cx gate """ result = self.backend.run( qobj, noise_model=noise_model_wrapper() ).result() if result.status != 'COMPLETED': raise QiskitError("Simulation failed. Status: " + result.status) qiskit-aer-0.4.1/test/benchmark/tools.py000066400000000000000000000154311362723322000202140ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Benchmarking utility functions. """ import math from itertools import repeat from numpy import random from scipy import linalg from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors import depolarizing_error from qiskit.providers.aer.noise.errors import amplitude_damping_error from qiskit.providers.aer.noise.errors import thermal_relaxation_error class NoiseWithDescription: """ This is just a wrapper for adding a descriptive text to the noise model so ASV can print this text in its reports """ def __init__(self, noise_model, description): self._noise_model = noise_model self._description = description def __repr__(self): return self._description def __call__(self): return self._noise_model # pylint: disable=no-member def _add_measurements(circuit, qr): cr = ClassicalRegister(qr.size) meas = QuantumCircuit(qr, cr) meas.barrier(qr) meas.measure(qr, cr) return circuit + meas def no_noise(): """ No noise at all """ return NoiseWithDescription(None, "No Noise") def mixed_unitary_noise_model(): """Return test rest mixed unitary noise model""" noise_model = NoiseModel() error1 = depolarizing_error(0.1, 1) noise_model.add_all_qubit_quantum_error(error1, ['u1', 'u2', 'u3']) error2 = depolarizing_error(0.1, 2) noise_model.add_all_qubit_quantum_error(error2, ['cx']) return NoiseWithDescription(noise_model, "Mixed Unitary Noise") def reset_noise_model(): """Return test reset noise model""" noise_model = NoiseModel() error1 = thermal_relaxation_error(50, 50, 0.1) noise_model.add_all_qubit_quantum_error(error1, ['u1', 'u2', 'u3']) error2 = error1.tensor(error1) noise_model.add_all_qubit_quantum_error(error2, ['cx']) return NoiseWithDescription(noise_model, "Reset Noise") def kraus_noise_model(): """Return test Kraus noise model""" noise_model = NoiseModel() error1 = amplitude_damping_error(0.1) noise_model.add_all_qubit_quantum_error(error1, ['u1', 'u2', 'u3']) error2 = error1.tensor(error1) noise_model.add_all_qubit_quantum_error(error2, ['cx']) return NoiseWithDescription(noise_model, "Kraus Noise") def quantum_volume_circuit(num_qubits, depth, measure=True, seed=None): """Create a quantum volume circuit without measurement. The model circuits consist of layers of Haar random elements of SU(4) applied between corresponding pairs of qubits in a random bipartition. Args: num_qubits (int): number of qubits depth (int): ideal depth of each model circuit (over SU(4)) measure (bool): include measurement in circuit. seed (int): the seed for the random number generator Returns: QuantumCircuit: A quantum volume circuit. """ # Create random number generator with possibly fixed seed rng = random.RandomState(seed) # Create quantum/classical registers of size n qr = QuantumRegister(num_qubits) circuit = QuantumCircuit(qr) # For each layer for _ in repeat(None, depth): # Generate uniformly random permutation Pj of [0...n-1] perm = rng.permutation(num_qubits) # For each consecutive pair in Pj, generate Haar random SU(4) # Decompose each SU(4) into CNOT + SU(2) and add to Ci for k in range(math.floor(num_qubits / 2)): # Generate random SU(4) matrix # pylint: disable=invalid-name X = (rng.randn(4, 4) + 1j * rng.randn(4, 4)) SU4, _ = linalg.qr(X) # Q is a unitary matrix SU4 /= pow(linalg.det(SU4), 1 / 4) # make Q a special unitary qubits = [qr[int(perm[2 * k])], qr[int(perm[2 * k + 1])]] circuit.unitary(SU4, qubits) if measure is True: circuit = _add_measurements(circuit, qr) return circuit def qft_circuit(num_qubits, measure=True): """Create a qft circuit. Args: num_qubits (int): number of qubits measure (bool): include measurement in circuit. Returns: QftCircuit: A qft circuit. """ # Create quantum/classical registers of size n qr = QuantumRegister(num_qubits) circuit = QuantumCircuit(qr) for i in range(num_qubits): for j in range(i): circuit.cu1(math.pi/float(2**(i-j)), qr[i], qr[j]) circuit.h(qr[i]) if measure is True: circuit = _add_measurements(circuit, qr) return circuit def simple_u3_circuit(num_qubits, measure=True): """Creates a simple circuit composed by u3 gates, with measurements or not at the end of each qubit. Args: num_qubits (int): Number of qubits measure (bool): Add measurements at the end of each qubit Returns: QuantumCircuit: The simple quantum circuit """ qr = QuantumRegister(num_qubits) circuit = QuantumCircuit(qr) for i in range(num_qubits): circuit.u3(1.1, 2.2, 3.3, qr[i]) if measure: circuit = _add_measurements(circuit, qr) return circuit def simple_cnot_circuit(num_qubits, measure=True): """Creates a simple circuit composed by cnot gates, with measurements or not at the end of each qubit. Args: num_qubits (int): Number of qubits measure (bool): Add measurements at the end of each qubit Returns: QuantumCircuit: The simple quantum circuit """ qr = QuantumRegister(num_qubits) circuit = QuantumCircuit(qr) for i in range(num_qubits): # for the last qubit, we exchange control and target qubits target_qubit = i + 1 if num_qubits - 1 > i else i - 1 circuit.cx(qr[i], qr[target_qubit]) if measure: circuit = _add_measurements(circuit, qr) return circuit # pylint: disable=invalid-name def quantum_fourier_transform_circuit(num_qubits): """Create quantum fourier transform circuit. Args: num_qubits (int): Number of qubits Returns: QuantumCircuit: QFT circuit """ qreg = QuantumRegister(num_qubits) creg = ClassicalRegister(num_qubits) circuit = QuantumCircuit(qreg, creg, name="qft") n = len(qreg) for i in range(n): for j in range(i): circuit.cu1(math.pi/float(2**(i-j)), qreg[i], qreg[j]) circuit.h(qreg[i]) circuit.measure(qreg, creg) return circuit qiskit-aer-0.4.1/test/data/000077500000000000000000000000001362723322000154555ustar00rootroot00000000000000qiskit-aer-0.4.1/test/data/qobj_snapshot_expval_matrix.json000066400000000000000000000036371362723322000241760ustar00rootroot00000000000000{ "qobj_id": "matrix_observable_snapshot_example", "schema_version": "1.0.0", "type": "QASM", "experiments": [ { "config": { "shots": 1000, "memory_slots": 2, "n_qubits": 2 }, "instructions": [ {"name": "h", "qubits": [0]}, {"name": "cx", "qubits": [0, 1]}, { "name": "snapshot", "type": "expectation_value_matrix", "label": "pre_measure", "params": [ [1, [[[0], [[1, 0], [0, -1]]], [[1], [[1, 0], [0, -1]]]] ] ] }, { "name": "snapshot", "type": "expectation_value_matrix", "label": "pre_measure", "params": [ [1, [[[0], [[1, 0], [0, -1]]]]], [1, [[[1], [[1, 0], [0, -1]]]]] ] }, {"name": "measure", "qubits": [0, 1], "memory": [0, 1]}, { "name": "snapshot", "type": "expectation_value_matrix", "label": "post_measure", "params": [ [1, [[[0], [[1, 0], [0, -1]]], [[1], [[1, 0], [0, -1]]]] ] ] }, { "name": "snapshot", "type": "expectation_value_matrix", "label": "post_measure", "params": [ [1, [[[0], [[1, 0], [0, -1]]]]], [1, [[[1], [[1, 0], [0, -1]]]]] ] } ] } ] }qiskit-aer-0.4.1/test/data/qobj_snapshot_expval_pauli.json000066400000000000000000000032241362723322000237740ustar00rootroot00000000000000{ "qobj_id": "pauli_observable_snapshot_example", "schema_version": "1.0.0", "type": "QASM", "experiments": [ { "config": { "shots": 1000, "memory_slots": 2, "n_qubits": 2 }, "instructions": [ {"name": "h", "qubits": [0]}, {"name": "cx", "qubits": [0, 1]}, { "name": "snapshot", "type": "expectation_value_pauli", "label": "pre_measure", "qubits": [0, 1], "params": [[[1, 0] , "ZZ"]] }, { "name": "snapshot", "type": "expectation_value_pauli", "label": "pre_measure", "qubits": [0, 1], "params": [[[1, 0] , "ZI"], [[1, 0], "IZ"]] }, {"name": "measure", "qubits": [0], "memory": [0]}, {"name": "measure", "qubits": [0], "memory": [1]}, { "name": "snapshot", "type": "expectation_value_pauli", "label": "post_measure", "qubits": [0, 1], "params": [[[1, 0] , "ZI"], [[1, 0], "ZZ"]] }, { "name": "snapshot", "type": "expectation_value_pauli", "label": "post_measure", "qubits": [0, 1], "params": [[[1, 0] , "ZI"], [[1, 0], "IZ"]] } ] } ] }qiskit-aer-0.4.1/test/data/qobj_snapshot_probs.json000066400000000000000000000014541362723322000224330ustar00rootroot00000000000000{ "qobj_id": "probabilities_snapshot_example", "schema_version": "1.0.0", "type": "QASM", "experiments": [ { "config": { "shots": 1000, "memory_slots": 2, "n_qubits": 2 }, "instructions": [ {"name": "h", "qubits": [0]}, {"name": "cx", "qubits": [0, 1]}, {"name": "snapshot", "type": "probabilities", "label": "pre_measure", "qubits": [0, 1]}, {"name": "measure", "qubits": [0], "memory": [0]}, {"name": "measure", "qubits": [1], "memory": [1]}, {"name": "snapshot", "type": "probabilities", "label": "post_measure", "qubits": [0, 1]} ] } ] }qiskit-aer-0.4.1/test/data/qobj_snapshot_statevector.json000066400000000000000000000012201362723322000236400ustar00rootroot00000000000000{ "qobj_id": "state_snapshot_example", "schema_version": "1.0.0", "type": "QASM", "experiments": [ { "config": { "shots": 1, "memory_slots": 0, "n_qubits": 2 }, "instructions": [ {"name": "snapshot", "type": "statevector", "label": "initial"}, {"name": "h", "qubits": [0]}, {"name": "snapshot", "type": "statevector", "label": "middle"}, {"name": "cx", "qubits": [0, 1]}, {"name": "snapshot", "type": "statevector", "label": "final"} ] } ] }qiskit-aer-0.4.1/test/src/000077500000000000000000000000001362723322000153335ustar00rootroot00000000000000qiskit-aer-0.4.1/test/src/test_snapshot.cpp000066400000000000000000000034761362723322000207470ustar00rootroot00000000000000#define CATCH_CONFIG_MAIN #include #include #include #include "utils.hpp" namespace AER{ namespace Test{ TEST_CASE( "Simulators Snapshot", "[snaphot]" ) { std::map qobj_snapshots; qobj_snapshots["state"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_statevector.json"); qobj_snapshots["probs"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_probs.json"); qobj_snapshots["pauli"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_expval_pauli.json"); qobj_snapshots["matrix"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_expval_matrix.json"); AER::Simulator::QasmController sim{}; SECTION( "State simulator snapshot" ) { auto expected_result = R"({ "final":[[[0.7071067811865476,0.0],[0.0,0.0],[0.0,0.0],[0.7071067811865475,0.0]]], "initial":[[[1.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0]]], "middle":[[[0.7071067811865476,0.0],[0.7071067811865475,0.0],[0.0,0.0],[0.0,0.0]]] })"_json; auto result = sim.execute(qobj_snapshots["state"]); result = result["results"][0]["data"]["snapshots"]["state"]; REQUIRE(result == expected_result); } SECTION( "Probs simulator snapshot" ) { REQUIRE(false); } SECTION( "Pauli simulator snaphsot" ) { REQUIRE(false); } SECTION( "Unitary simulator snapshot" ) { REQUIRE(false); } } //------------------------------------------------------------------------------ } // end namespace Test //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ qiskit-aer-0.4.1/test/src/test_snapshot_bdd.cpp000066400000000000000000000041741362723322000215540ustar00rootroot00000000000000#define CATCH_CONFIG_MAIN #include #include #include #include "utils.hpp" namespace AER{ namespace Test{ SCENARIO("We can get snapshots from different simulator types") { GIVEN("A Qobj with snapshot information for every simulator type"){ std::map qobj_snapshots; qobj_snapshots["state"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_statevector.json"); qobj_snapshots["probs"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_probs.json"); qobj_snapshots["pauli"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_expval_pauli.json"); qobj_snapshots["matrix"] = AER::Test::Utilities::load_qobj("../../test/data/qobj_snapshot_expval_matrix.json"); AER::Simulator::QasmController sim{}; WHEN("we get the expected results"){ auto expected_result = R"({ "final":[[[0.7071067811865476,0.0],[0.0,0.0],[0.0,0.0],[0.7071067811865475,0.0]]], "initial":[[[1.0,0.0],[0.0,0.0],[0.0,0.0],[0.0,0.0]]], "middle":[[[0.7071067811865476,0.0],[0.7071067811865475,0.0],[0.0,0.0],[0.0,0.0]]] })"_json; THEN("the state simulator should pass"){ auto result = sim.execute(qobj_snapshots["state"]); result = result["results"][0]["data"]["snapshots"]["state"]; REQUIRE(result == expected_result); } THEN("the probs simulator should pass"){ REQUIRE(false); } THEN("the pauli simulator should pass"){ REQUIRE(false); } THEN("the unitary matrix simulator should pass"){ REQUIRE(false); } } } } //------------------------------------------------------------------------------ } // end namespace Test //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ qiskit-aer-0.4.1/test/src/test_utils.cpp000066400000000000000000000023651362723322000202440ustar00rootroot00000000000000#define CATCH_CONFIG_MAIN #include #include #include #include #include "framework/linalg/almost_equal.hpp" #include "utils.hpp" namespace AER{ namespace Test{ TEST_CASE( "Framework Utilities", "[almost_equal]" ) { SECTION( "The maximum difference between two numbers over 1.0 is greater than epsilon, so they are amlmost equal" ) { double first = 1.0 + std::numeric_limits::epsilon(); double actual = 1.0; // Because the max_diff param is bigger than epsilon, this should be almost equal REQUIRE(Linalg::almost_equal(first, actual, 1e-15, 1e-15)); } SECTION( "The difference between two numbers really close to 0 should say are almost equal" ) { double first = 5e-323; // Really close to the min magnitude of double double actual = 6e-323; REQUIRE(Linalg::almost_equal(first, actual, 1e-323, 1e-323)); } } //------------------------------------------------------------------------------ } // end namespace Test //------------------------------------------------------------------------------ } // end namespace AER //------------------------------------------------------------------------------ qiskit-aer-0.4.1/test/src/utils.hpp000066400000000000000000000007261362723322000172110ustar00rootroot00000000000000#include #include "framework/json.hpp" namespace AER{ namespace Test{ namespace Utilities { inline json_t load_qobj(const std::string& filename){ return JSON::load(filename); } template T calculate_floats(T start, T decrement, int count){ for (int i = 0; i < count; ++i) start -= decrement; return start; } } // End of Utilities namespace } // End of Test namespace } // End of AER namspaceqiskit-aer-0.4.1/test/terra/000077500000000000000000000000001362723322000156615ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/__init__.py000066400000000000000000000020671362723322000177770ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. ''' Terra tests ''' import os def load_tests(loader, standard_tests, pattern): """ test suite for unittest discovery """ this_dir = os.path.dirname(__file__) if pattern in ['test*.py', '*_test.py']: package_tests = loader.discover(start_dir=this_dir, pattern=pattern) standard_tests.addTests(package_tests) elif pattern in ['profile*.py', '*_profile.py']: loader.testMethodPrefix = 'profile' package_tests = loader.discover(start_dir=this_dir, pattern='test*.py') standard_tests.addTests(package_tests) return standard_tests qiskit-aer-0.4.1/test/terra/backends/000077500000000000000000000000001362723322000174335ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/backends/__init__.py000066400000000000000000000020701362723322000215430ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. ''' Terra tests ''' import os def load_tests(loader, standard_tests, pattern): """ test suite for unittest discovery """ this_dir = os.path.dirname(__file__) if pattern in ['test*.py', '*_test.py']: package_tests = loader.discover(start_dir=this_dir, pattern=pattern) standard_tests.addTests(package_tests) elif pattern in ['profile*.py', '*_profile.py']: loader.testMethodPrefix = 'profile' package_tests = loader.discover(start_dir=this_dir, pattern='test*.py') standard_tests.addTests(package_tests) return standard_tests qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/000077500000000000000000000000001362723322000224735ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_algorithms.py000066400000000000000000000114051362723322000262400ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_algorithms from qiskit import execute from qiskit.providers.aer import QasmSimulator class QasmAlgorithmTests: """QasmSimulator algorithm tests in the default basis""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test algorithms # --------------------------------------------------------------------- def test_grovers_default_basis_gates(self): """Test grovers circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_algorithms.grovers_circuit( final_measure=True, allow_sampling=True) targets = ref_algorithms.grovers_counts(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_teleport_default_basis_gates(self): """Test teleport circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_algorithms.teleport_circuit() targets = ref_algorithms.teleport_counts(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) class QasmAlgorithmTestsWaltzBasis: """QasmSimulator algorithm tests in the Waltz u1,u2,u3,cx basis""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test algorithms # --------------------------------------------------------------------- def test_grovers_waltz_basis_gates(self): """Test grovers gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_algorithms.grovers_circuit( final_measure=True, allow_sampling=True) targets = ref_algorithms.grovers_counts(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_teleport_waltz_basis_gates(self): """Test teleport gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_algorithms.teleport_circuit() targets = ref_algorithms.teleport_counts(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) class QasmAlgorithmTestsMinimalBasis: """QasmSimulator algorithm tests in the minimal U,CX basis""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test algorithms # --------------------------------------------------------------------- def test_grovers_minimal_basis_gates(self): """Test grovers circuits compiling to u3,cx""" shots = 2000 circuits = ref_algorithms.grovers_circuit( final_measure=True, allow_sampling=True) targets = ref_algorithms.grovers_counts(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_teleport_minimal_basis_gates(self): """Test teleport gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_algorithms.teleport_circuit() targets = ref_algorithms.teleport_counts(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_basics.py000066400000000000000000000034201362723322000253310ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.utils.mock import FakeFailureQasmSimulator, FakeSuccessQasmSimulator from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.compiler import transpile, assemble from qiskit.providers.aer import AerError class QasmBasicsTests: """QasmSimulator basic tests.""" def test_simulation_succeed(self): """Test the we properly manage simulation failures.""" mocked_backend = FakeSuccessQasmSimulator(time_alive=0) qr = QuantumRegister(1) cr = ClassicalRegister(1) succeed_circuit = QuantumCircuit(qr, cr) quantum_circuit = transpile(succeed_circuit, mocked_backend) qobj = assemble(quantum_circuit) result = mocked_backend.run(qobj).result() self.assertTrue(getattr(result, 'success', False)) def test_simulation_failed(self): """Test the we properly manage simulation failures.""" mocked_backend = FakeFailureQasmSimulator(time_alive=0) qr = QuantumRegister(1) cr = ClassicalRegister(1) failed_circuit = QuantumCircuit(qr, cr) quantum_circuit = transpile(failed_circuit, mocked_backend) qobj = assemble(quantum_circuit) job = mocked_backend.run(qobj) self.assertRaises(AerError, job.result) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_cliffords.py000066400000000000000000001036251362723322000260500ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_1q_clifford from test.terra.reference import ref_2q_clifford from qiskit import execute from qiskit.providers.aer import QasmSimulator class QasmCliffordTests: """QasmSimulator Clifford gate tests in default basis.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test h-gate # --------------------------------------------------------------------- def test_h_gate_deterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.h_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_h_gate_nondeterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.h_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test x-gate # --------------------------------------------------------------------- def test_x_gate_deterministic_default_basis_gates(self): """Test x-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.x_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test z-gate # --------------------------------------------------------------------- def test_z_gate_deterministic_default_basis_gates(self): """Test z-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.z_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test y-gate # --------------------------------------------------------------------- def test_y_gate_deterministic_default_basis_gates(self): """Test y-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.y_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test s-gate # --------------------------------------------------------------------- def test_s_gate_deterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.s_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_s_gate_nondeterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.s_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test sdg-gate # --------------------------------------------------------------------- def test_sdg_gate_deterministic_default_basis_gates(self): """Test sdg-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.sdg_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_sdg_gate_nondeterministic_default_basis_gates(self): shots = 2000 """Test sdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.sdg_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cx-gate # --------------------------------------------------------------------- def test_cx_gate_deterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.cx_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cx_gate_nondeterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.cx_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cz-gate # --------------------------------------------------------------------- def test_cz_gate_deterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.cz_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cz_gate_nondeterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.cz_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test swap-gate # --------------------------------------------------------------------- def test_swap_gate_deterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.swap_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_swap_gate_nondeterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.swap_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) class QasmCliffordTestsWaltzBasis: """QasmSimulator Clifford gate tests in Waltz u1,u2,u3,cx basis.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test h-gate # --------------------------------------------------------------------- def test_h_gate_deterministic_waltz_basis_gates(self): """Test h-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.h_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_h_gate_nondeterministic_waltz_basis_gates(self): """Test h-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.h_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test x-gate # --------------------------------------------------------------------- def test_x_gate_deterministic_waltz_basis_gates(self): """Test x-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.x_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test z-gate # --------------------------------------------------------------------- def test_z_gate_deterministic_waltz_basis_gates(self): """Test z-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.z_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_z_gate_deterministic_minimal_basis_gates(self): """Test z-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.z_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test y-gate # --------------------------------------------------------------------- def test_y_gate_deterministic_default_basis_gates(self): """Test y-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.y_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_y_gate_deterministic_waltz_basis_gates(self): shots = 100 """Test y-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.y_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test s-gate # --------------------------------------------------------------------- def test_s_gate_deterministic_waltz_basis_gates(self): """Test s-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.s_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_s_gate_nondeterministic_waltz_basis_gates(self): """Test s-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.s_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test sdg-gate # --------------------------------------------------------------------- def test_sdg_gate_deterministic_waltz_basis_gates(self): """Test sdg-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.sdg_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_sdg_gate_nondeterministic_waltz_basis_gates(self): """Test sdg-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.sdg_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cx-gate # --------------------------------------------------------------------- def test_cx_gate_deterministic_waltz_basis_gates(self): shots = 100 """Test cx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.cx_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cx_gate_nondeterministic_waltz_basis_gates(self): """Test cx-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.cx_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cz-gate # --------------------------------------------------------------------- def test_cz_gate_deterministic_waltz_basis_gates(self): """Test cz-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.cz_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cz_gate_nondeterministic_waltz_basis_gates(self): """Test cz-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.cz_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test swap-gate # --------------------------------------------------------------------- def test_swap_gate_deterministic_waltz_basis_gates(self): """Test swap-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.swap_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_swap_gate_nondeterministic_waltz_basis_gates(self): """Test swap-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.swap_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) class QasmCliffordTestsMinimalBasis: """QasmSimulator Clifford gate tests in minimam U,CX basis.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test h-gate # --------------------------------------------------------------------- def test_h_gate_deterministic_minimal_basis_gates(self): """Test h-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.h_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_h_gate_nondeterministic_minimal_basis_gates(self): """Test h-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.h_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test x-gate # --------------------------------------------------------------------- def test_x_gate_deterministic_minimal_basis_gates(self): """Test x-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.x_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test z-gate # --------------------------------------------------------------------- def test_z_gate_deterministic_minimal_basis_gates(self): """Test z-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.z_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test y-gate # --------------------------------------------------------------------- def test_y_gate_deterministic_minimal_basis_gates(self): """Test y-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.y_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test s-gate # --------------------------------------------------------------------- def test_s_gate_deterministic_minimal_basis_gates(self): """Test s-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.s_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_s_gate_nondeterministic_minimal_basis_gates(self): """Test s-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.s_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test sdg-gate # --------------------------------------------------------------------- def test_sdg_gate_deterministic_minimal_basis_gates(self): """Test sdg-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=True) targets = ref_1q_clifford.sdg_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_sdg_gate_nondeterministic_minimal_basis_gates(self): """Test sdg-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=True) targets = ref_1q_clifford.sdg_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cx-gate # --------------------------------------------------------------------- def test_cx_gate_deterministic_minimal_basis_gates(self): """Test cx-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.cx_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cx_gate_nondeterministic_minimal_basis_gates(self): """Test cx-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.cx_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cz-gate # --------------------------------------------------------------------- def test_cz_gate_deterministic_minimal_basis_gates(self): """Test cz-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.cz_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cz_gate_nondeterministic_minimal_basis_gates(self): """Test cz-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.cz_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test swap-gate # --------------------------------------------------------------------- def test_swap_gate_deterministic_minimal_basis_gates(self): """Test swap-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.swap_gate_counts_deterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_swap_gate_nondeterministic_minimal_basis_gates(self): """Test swap-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.swap_gate_counts_nondeterministic(shots) job = execute( circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test multiplexer-cx-gate # --------------------------------------------------------------------- def test_multiplexer_cx_gate_deterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.multiplexer_cx_gate_circuits_deterministic( final_measure=True) targets = ref_2q_clifford.multiplexer_cx_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_multiplexer_cx_gate_nondeterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.multiplexer_cx_gate_circuits_nondeterministic( final_measure=True) targets = ref_2q_clifford.multiplexer_cx_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_conditional.py000066400000000000000000000152631362723322000264000ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_conditionals from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator class QasmConditionalGateTests: """QasmSimulator conditional tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test conditional # --------------------------------------------------------------------- def test_conditional_gates_1bit(self): """Test conditional gate operations on 1-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_1bit( final_measure=True, conditional_type='gate') targets = ref_conditionals.conditional_counts_1bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_conditional_gates_2bit(self): """Test conditional gate operations on 2-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_2bit( final_measure=True, conditional_type='gate') targets = ref_conditionals.conditional_counts_2bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) class QasmConditionalUnitaryTests: """QasmSimulator conditional tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test conditional # --------------------------------------------------------------------- def test_conditional_unitary_1bit(self): """Test conditional unitary operations on 1-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_1bit( final_measure=True, conditional_type='unitary') targets = ref_conditionals.conditional_counts_1bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_conditional_unitary_2bit(self): """Test conditional unitary operations on 2-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_2bit( final_measure=True, conditional_type='unitary') targets = ref_conditionals.conditional_counts_2bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) class QasmConditionalKrausTests: """QasmSimulator conditional tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test conditional # --------------------------------------------------------------------- def test_conditional_unitary_1bit(self): """Test conditional kraus operations on 1-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_1bit( final_measure=True, conditional_type='kraus') targets = ref_conditionals.conditional_counts_1bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_conditional_kraus_2bit(self): """Test conditional kraus operations on 2-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_2bit( final_measure=True, conditional_type='kraus') targets = ref_conditionals.conditional_counts_2bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) class QasmConditionalSuperOpTests: """QasmSimulator conditional tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test conditional # --------------------------------------------------------------------- def test_conditional_superop_1bit(self): """Test conditional superop operations on 1-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_1bit( final_measure=True, conditional_type='superop') targets = ref_conditionals.conditional_counts_1bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_conditional_superop_2bit(self): """Test conditional superop operations on 2-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_2bit( final_measure=True, conditional_type='superop') targets = ref_conditionals.conditional_counts_2bit(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_delay_measure.py000066400000000000000000000114771362723322000267170ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.compiler import assemble, transpile from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors import ReadoutError, depolarizing_error from test.benchmark.tools import quantum_volume_circuit, qft_circuit class QasmDelayMeasureTests: """QasmSimulator delay measure sampling optimization tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} def delay_measure_circuit(self): """Test circuit that allows measure delay optimization""" qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') circuit = QuantumCircuit(qr, cr) circuit.x(0) circuit.measure(0, 0) circuit.barrier([0, 1]) circuit.x(1) circuit.measure(0, 1) return circuit def test_delay_measure_enable(self): """Test measure sampling works with delay measure optimization""" # Circuit that allows delay measure circuit = self.delay_measure_circuit() shots = 100 qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) # Delay measure default backend_options = self.BACKEND_OPTS.copy() backend_options['optimize_ideal_threshold'] = 0 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) metadata = result.results[0].metadata self.assertTrue(metadata.get('measure_sampling')) # Delay measure enabled backend_options = self.BACKEND_OPTS.copy() backend_options['delay_measure_enable'] = True backend_options['optimize_ideal_threshold'] = 0 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) metadata = result.results[0].metadata self.assertTrue(metadata.get('measure_sampling')) # Delay measure disabled backend_options = self.BACKEND_OPTS.copy() backend_options['delay_measure_enable'] = False backend_options['optimize_ideal_threshold'] = 0 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) metadata = result.results[0].metadata self.assertFalse(metadata.get('measure_sampling')) def test_delay_measure_verbose(self): """Test delay measure with verbose option""" circuit = self.delay_measure_circuit() shots = 100 qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) # Delay measure verbose enabled backend_options = self.BACKEND_OPTS.copy() backend_options['delay_measure_enable'] = True backend_options['delay_measure_verbose'] = True backend_options['optimize_ideal_threshold'] = 0 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) metadata = result.results[0].metadata self.assertIn('delay_measure_verbose', metadata) # Delay measure verbose disabled backend_options = self.BACKEND_OPTS.copy() backend_options['delay_measure_enable'] = True backend_options['delay_measure_verbose'] = False backend_options['optimize_ideal_threshold'] = 0 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) metadata = result.results[0].metadata self.assertNotIn('delay_measure_verbose', metadata) # Delay measure verbose default backend_options = self.BACKEND_OPTS.copy() backend_options['delay_measure_enable'] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) metadata = result.results[0].metadata self.assertNotIn('delay_measure_verbose', metadata) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_fusion.py000066400000000000000000000436461362723322000254060ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_2q_clifford from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.compiler import assemble, transpile from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors import ReadoutError, depolarizing_error from test.benchmark.tools import quantum_volume_circuit, qft_circuit class QasmFusionTests: """QasmSimulator fusion tests.""" SIMULATOR = QasmSimulator() def create_statevector_circuit(self): """ Creates a simple circuit for running in the statevector """ qr = QuantumRegister(10) cr = ClassicalRegister(10) circuit = QuantumCircuit(qr, cr) circuit.u3(0.1, 0.1, 0.1, qr[0]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[0]) circuit.barrier(qr) circuit.measure(qr, cr) return circuit def noise_model(self): """ Creates a new noise model for testing purposes """ readout_error = [0.01, 0.1] depolarizing = {'u3': (1, 0.001), 'cx': (2, 0.02)} noise = NoiseModel() readout = [[1.0 - readout_error[0], readout_error[0]], [readout_error[1], 1.0 - readout_error[1]]] noise.add_all_qubit_readout_error(ReadoutError(readout)) for gate, (num_qubits, gate_error) in depolarizing.items(): noise.add_all_qubit_quantum_error( depolarizing_error(gate_error, num_qubits), gate) return noise def check_mat_exist(self, result): fusion_gates = result.to_dict( )['results'][0]['metadata']['fusion_verbose'] for gate in fusion_gates: print(gate) def test_clifford_no_fusion(self): """Test Fusion with clifford simulator""" shots = 100 circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_verbose'] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) self.assertTrue( 'results' in result.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' not in result.to_dict()['results'][0]['metadata'], msg="fusion must not work for clifford") def test_noise_fusion(self): """Test Fusion with noise model option""" circuit = self.create_statevector_circuit() shots = 100 noise_model = self.noise_model() circuit = transpile([circuit], backend=self.SIMULATOR, basis_gates=noise_model.basis_gates) qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = self.SIMULATOR.run( qobj, noise_model=noise_model, backend_options=backend_options).result() self.assertTrue(getattr(result, 'success', False)) self.assertTrue( 'results' in result.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' in result.to_dict()['results'][0]['metadata'], msg="verbose must work with noise") def test_fusion_verbose(self): """Test Fusion with verbose option""" circuit = self.create_statevector_circuit() shots = 100 qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_verbose = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_verbose, 'success', 'False')) self.assertTrue( 'results' in result_verbose.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_verbose.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' in result_verbose.to_dict()['results'][0] ['metadata'], msg="fusion must work for satevector") backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = False backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_nonverbose = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_nonverbose, 'success', 'False')) self.assertTrue( 'results' in result_nonverbose.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_nonverbose.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' not in result_nonverbose.to_dict()['results'][0] ['metadata'], msg="verbose must not work if fusion_verbose is False") backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_default = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_default, 'success', 'False')) self.assertTrue( 'results' in result_default.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_default.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' not in result_default.to_dict()['results'][0] ['metadata'], msg="verbose must not work if fusion_verbose is False") def test_control_fusion(self): """Test Fusion enable/disable option""" shots = 100 circuit = self.create_statevector_circuit() qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_verbose = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_verbose, 'success', 'False')) self.assertTrue( 'results' in result_verbose.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_verbose.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' in result_verbose.to_dict()['results'][0] ['metadata'], msg="fusion must work for satevector") backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = False backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_disabled = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_disabled, 'success', 'False')) self.assertTrue( 'results' in result_disabled.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_disabled.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' not in result_disabled.to_dict()['results'][0] ['metadata'], msg="fusion must not work with fusion_enable is False") backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_verbose'] = True result_default = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_default, 'success', 'False')) self.assertTrue( 'results' in result_default.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_default.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' not in result_default.to_dict()['results'][0] ['metadata'], msg="fusion must not work by default for satevector") def test_default_fusion(self): """Test default Fusion option""" default_threshold = 20 shots = 100 circuit = qft_circuit(default_threshold - 1, measure=True) qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_verbose'] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_verbose = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_verbose, 'success', 'False')) self.assertTrue( 'results' in result_verbose.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_verbose.to_dict()['results'][0], msg="metadata must not exist in results[0]") self.assertTrue( 'fusion_verbose' not in result_verbose.to_dict()['results'][0] ['metadata'], msg="fusion must work for satevector") circuit = qft_circuit(default_threshold, measure=True) qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) result_verbose = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_verbose, 'success', 'False')) self.assertTrue( 'results' in result_verbose.to_dict(), msg="results must exist in result") self.assertTrue( 'metadata' in result_verbose.to_dict()['results'][0], msg="metadata must exist in results[0]") self.assertTrue( 'fusion_verbose' in result_verbose.to_dict()['results'][0] ['metadata'], msg="fusion must work for satevector") def test_fusion_operations(self): """Test Fusion enable/disable option""" shots = 100 qr = QuantumRegister(10) cr = ClassicalRegister(10) circuit = QuantumCircuit(qr, cr) for i in range(10): circuit.h(qr[i]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[0]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[1]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[0]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[1]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[3]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.cx(qr[2], qr[3]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[3]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[3]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.cx(qr[2], qr[3]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[3]) circuit.barrier(qr) circuit.u3(0.1, 0.1, 0.1, qr[3]) circuit.barrier(qr) circuit.measure(qr, cr) qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_fusion = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_fusion, 'success', 'False')) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = False backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_nonfusion = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_nonfusion, 'success', 'False')) self.assertDictAlmostEqual( result_fusion.get_counts(circuit), result_nonfusion.get_counts(circuit), delta=0.0, msg="fusion x-x-x was failed") def test_fusion_qv(self): """Test Fusion with quantum volume""" shots = 100 circuit = quantum_volume_circuit(10, 1, measure=True, seed=0) qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_fusion = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_fusion, 'success', 'False')) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = False backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_nonfusion = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_nonfusion, 'success', 'False')) self.assertDictAlmostEqual( result_fusion.get_counts(circuit), result_nonfusion.get_counts(circuit), delta=0.0, msg="fusion for qv was failed") def test_fusion_qft(self): """Test Fusion with qft""" shots = 100 circuit = qft_circuit(10, measure=True) qobj = assemble([circuit], self.SIMULATOR, shots=shots, seed_simulator=1) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = True backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_fusion = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_fusion, 'success', 'False')) backend_options = self.BACKEND_OPTS.copy() backend_options['fusion_enable'] = False backend_options['fusion_verbose'] = True backend_options['fusion_threshold'] = 1 backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result_nonfusion = self.SIMULATOR.run( qobj, backend_options=backend_options).result() self.assertTrue(getattr(result_nonfusion, 'success', 'False')) self.assertDictAlmostEqual( result_fusion.get_counts(circuit), result_nonfusion.get_counts(circuit), delta=0.0, msg="fusion for qft was failed")qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_initialize.py000066400000000000000000000053631362723322000262360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_initialize from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator class QasmInitializeTests: """QasmSimulator initialize tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test initialize # --------------------------------------------------------------------- def test_initialize_1(self): """Test QasmSimulator initialize""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 2000 circuits = ref_initialize.initialize_circuits_1(final_measure=True) targets = ref_initialize.initialize_counts_1(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_initialize_2(self): """Test QasmSimulator initializes""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 2000 circuits = ref_initialize.initialize_circuits_2(final_measure=True) targets = ref_initialize.initialize_counts_2(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_initialize_sampling_opt(self): """Test sampling optimization""" shots = 2000 circuits = ref_initialize.initialize_sampling_optimization() targets = ref_initialize.initialize_counts_sampling_optimization(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_measure.py000066400000000000000000000235701362723322000255360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_measure from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors import ReadoutError, depolarizing_error class QasmMeasureTests: """QasmSimulator measure tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test measure # --------------------------------------------------------------------- def test_measure_deterministic_with_sampling(self): """Test QasmSimulator measure with deterministic counts with sampling""" shots = 100 circuits = ref_measure.measure_circuits_deterministic( allow_sampling=True) target_counts = ref_measure.measure_counts_deterministic(shots) target_memory = ref_measure.measure_memory_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots, memory=True) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, target_counts, delta=0) self.compare_memory(result, circuits, target_memory) self.compare_result_metadata(result, circuits, "measure_sampling", True) def test_measure_deterministic_without_sampling(self): """Test QasmSimulator measure with deterministic counts without sampling""" shots = 100 circuits = ref_measure.measure_circuits_deterministic( allow_sampling=False) target_counts = ref_measure.measure_counts_deterministic(shots) target_memory = ref_measure.measure_memory_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots, memory=True) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, target_counts, delta=0) self.compare_memory(result, circuits, target_memory) self.compare_result_metadata(result, circuits, "measure_sampling", False) def test_measure_nondeterministic_with_sampling(self): """Test QasmSimulator measure with non-deterministic counts with sampling""" shots = 2000 circuits = ref_measure.measure_circuits_nondeterministic( allow_sampling=True) targets = ref_measure.measure_counts_nondeterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # Test sampling was enabled for res in result.results: self.assertIn("measure_sampling", res.metadata) self.assertEqual(res.metadata["measure_sampling"], True) def test_measure_nondeterministic_without_sampling(self): """Test QasmSimulator measure with nin-deterministic counts without sampling""" shots = 2000 circuits = ref_measure.measure_circuits_nondeterministic( allow_sampling=False) targets = ref_measure.measure_counts_nondeterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) self.compare_result_metadata(result, circuits, "measure_sampling", False) def test_measure_sampling_with_readouterror(self): """Test QasmSimulator measure with deterministic counts with sampling and readout-error""" readout_error = [0.01, 0.1] noise_model = NoiseModel() readout = [[1.0 - readout_error[0], readout_error[0]], [readout_error[1], 1.0 - readout_error[1]]] noise_model.add_all_qubit_readout_error(ReadoutError(readout)) shots = 1000 circuits = ref_measure.measure_circuits_deterministic( allow_sampling=True) targets = ref_measure.measure_counts_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, noise_model=noise_model, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_result_metadata(result, circuits, "measure_sampling", True) def test_measure_sampling_with_quantum_noise(self): """Test QasmSimulator measure with deterministic counts with sampling and readout-error""" readout_error = [0.01, 0.1] noise_model = NoiseModel() depolarizing = {'u3': (1, 0.001), 'cx': (2, 0.02)} readout = [[1.0 - readout_error[0], readout_error[0]], [readout_error[1], 1.0 - readout_error[1]]] noise_model.add_all_qubit_readout_error(ReadoutError(readout)) for gate, (num_qubits, gate_error) in depolarizing.items(): noise_model.add_all_qubit_quantum_error( depolarizing_error(gate_error, num_qubits), gate) shots = 1000 circuits = ref_measure.measure_circuits_deterministic( allow_sampling=True) targets = ref_measure.measure_counts_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, noise_model=noise_model, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) sampling = (self.BACKEND_OPTS.get("method", "automatic").startswith("density_matrix")) self.compare_result_metadata(result, circuits, "measure_sampling", sampling) class QasmMultiQubitMeasureTests: """QasmSimulator measure tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test multi-qubit measure qobj instruction # --------------------------------------------------------------------- def test_measure_deterministic_multi_qubit_with_sampling(self): """Test QasmSimulator multi-qubit measure with deterministic counts with sampling""" shots = 100 circuits = ref_measure.multiqubit_measure_circuits_deterministic( allow_sampling=True) target_counts = ref_measure.multiqubit_measure_counts_deterministic(shots) target_memory = ref_measure.multiqubit_measure_memory_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots, memory=True) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, target_counts, delta=0) self.compare_memory(result, circuits, target_memory) self.compare_result_metadata(result, circuits, "measure_sampling", True) def test_measure_deterministic_multi_qubit_without_sampling(self): """Test QasmSimulator multi-qubit measure with deterministic counts without sampling""" shots = 100 circuits = ref_measure.multiqubit_measure_circuits_deterministic( allow_sampling=False) target_counts = ref_measure.multiqubit_measure_counts_deterministic(shots) target_memory = ref_measure.multiqubit_measure_memory_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots, memory=True) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.compare_counts(result, circuits, target_counts, delta=0) self.compare_memory(result, circuits, target_memory) self.compare_result_metadata(result, circuits, "measure_sampling", False) def test_measure_nondeterministic_multi_qubit_with_sampling(self): """Test QasmSimulator measure with non-deterministic counts""" shots = 2000 circuits = ref_measure.multiqubit_measure_circuits_nondeterministic( allow_sampling=True) targets = ref_measure.multiqubit_measure_counts_nondeterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) self.compare_result_metadata(result, circuits, "measure_sampling", True) def test_measure_nondeterministic_multi_qubit_without_sampling(self): """Test QasmSimulator measure with non-deterministic counts""" shots = 2000 circuits = ref_measure.multiqubit_measure_circuits_nondeterministic( allow_sampling=False) targets = ref_measure.multiqubit_measure_counts_nondeterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) self.compare_result_metadata(result, circuits, "measure_sampling", False) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_method.py000066400000000000000000000326661362723322000253630ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_2q_clifford from test.terra.reference import ref_non_clifford from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer import AerError from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors import QuantumError from qiskit.providers.aer.noise.errors import pauli_error from qiskit.providers.aer.noise.errors import amplitude_damping_error class QasmMethodTests: """QasmSimulator method option tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test Clifford circuits with clifford and non-clifford noise # --------------------------------------------------------------------- def test_backend_method_clifford_circuits(self): """Test statevector method is used for Clifford circuit""" # Test circuits shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() success = getattr(result, 'success', False) self.assertTrue(success) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method != 'automatic': self.compare_result_metadata(result, circuits, 'method', method) else: self.compare_result_metadata(result, circuits, 'method', 'stabilizer') def test_backend_method_clifford_circuits_and_reset_noise(self): """Test statevector method is used for Clifford circuit""" # Test noise model noise_circs = [[{ "name": "reset", "qubits": [0] }], [{ "name": "id", "qubits": [0] }]] noise_probs = [0.5, 0.5] error = QuantumError(zip(noise_circs, noise_probs)) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error( error, ['id', 'x', 'y', 'z', 'h', 's', 'sdg']) # Test circuits shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) self.assertTrue(success) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method != 'automatic': self.compare_result_metadata(result, circuits, 'method', method) else: self.compare_result_metadata(result, circuits, 'method', 'stabilizer') def test_backend_method_clifford_circuits_and_pauli_noise(self): """Test statevector method is used for Clifford circuit""" # Noise Model error = pauli_error([['XX', 0.5], ['II', 0.5]], standard_gates=True) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['cz', 'cx']) # Test circuits shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() success = getattr(result, 'success', False) self.assertTrue(success) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method != 'automatic': self.compare_result_metadata(result, circuits, 'method', method) else: self.compare_result_metadata(result, circuits, 'method', 'stabilizer') def test_backend_method_clifford_circuits_and_unitary_noise(self): """Test statevector method is used for Clifford circuit""" # Noise Model error = pauli_error([['XX', 0.5], ['II', 0.5]], standard_gates=False) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['cz', 'cx']) # Test circuits shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue(success) if method == 'automatic': target_method = 'density_matrix' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) def test_backend_method_clifford_circuits_and_kraus_noise(self): """Test statevector method is used for Clifford circuit""" # Noise Model error = amplitude_damping_error(0.5) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error( error, ['id', 'x', 'y', 'z', 'h', 's', 'sdg']) # Test circuits shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue(success) if method == 'automatic': target_method = 'density_matrix' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) # --------------------------------------------------------------------- # Test non-Clifford circuits with clifford and non-clifford noise # --------------------------------------------------------------------- def test_backend_method_nonclifford_circuits(self): """Test statevector method is used for Clifford circuit""" # Test circuits shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue(success) if method == 'automatic': target_method = 'statevector' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) def test_backend_method_nonclifford_circuit_and_reset_noise(self): """Test statevector method is used for Clifford circuit""" # Test noise model noise_circs = [[{ "name": "reset", "qubits": [0] }], [{ "name": "id", "qubits": [0] }]] noise_probs = [0.5, 0.5] error = QuantumError(zip(noise_circs, noise_probs)) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error( error, ['id', 'x', 'y', 'z', 'h', 's', 'sdg']) # Test circuits shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue self.assertTrue(success) if method == 'automatic': target_method = 'density_matrix' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) def test_backend_method_nonclifford_circuit_and_pauli_noise(self): """Test statevector method is used for Clifford circuit""" # Noise Model error = pauli_error([['XX', 0.5], ['II', 0.5]], standard_gates=True) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['cz', 'cx']) # Test circuits shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue(success) if method == 'automatic': target_method = 'density_matrix' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) def test_backend_method_nonclifford_circuit_and_unitary_noise(self): """Test statevector method is used for Clifford circuit""" # Noise Model error = pauli_error([['XX', 0.5], ['II', 0.5]], standard_gates=False) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['cz', 'cx']) # Test circuits shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue(success) if method == 'automatic': target_method = 'density_matrix' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) def test_backend_method_nonclifford_circuit_and_kraus_noise(self): """Test statevector method is used for Clifford circuit""" # Noise Model error = amplitude_damping_error(0.5) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error( error, ['id', 'x', 'y', 'z', 'h', 's', 'sdg']) # Test circuits shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() success = getattr(result, 'success', False) # Check simulation method method = self.BACKEND_OPTS.get('method', 'automatic') if method == 'stabilizer': self.assertFalse(success) else: self.assertTrue(success) if method == 'automatic': target_method = 'density_matrix' else: target_method = method self.compare_result_metadata(result, circuits, 'method', target_method) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_noise.py000066400000000000000000000145101362723322000252040ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_readout_noise from test.terra.reference import ref_pauli_noise from test.terra.reference import ref_reset_noise from test.terra.reference import ref_kraus_noise from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator class QasmReadoutNoiseTests: """QasmSimulator readout error noise model tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} def test_readout_noise(self): """Test simulation with classical readout error noise model.""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 2000 circuits = ref_readout_noise.readout_error_circuits() noise_models = ref_readout_noise.readout_error_noise_models() targets = ref_readout_noise.readout_error_counts(shots) for circuit, noise_model, target in zip(circuits, noise_models, targets): qobj = assemble(circuit, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) class QasmPauliNoiseTests: """QasmSimulator pauli error noise model tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} def test_pauli_gate_noise(self): """Test simulation with Pauli gate error noise model.""" shots = 2000 circuits = ref_pauli_noise.pauli_gate_error_circuits() noise_models = ref_pauli_noise.pauli_gate_error_noise_models() targets = ref_pauli_noise.pauli_gate_error_counts(shots) for circuit, noise_model, target in zip(circuits, noise_models, targets): qobj = assemble(circuit, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) def test_pauli_reset_noise(self): """Test simulation with Pauli reset error noise model.""" shots = 2000 circuits = ref_pauli_noise.pauli_reset_error_circuits() noise_models = ref_pauli_noise.pauli_reset_error_noise_models() targets = ref_pauli_noise.pauli_reset_error_counts(shots) for circuit, noise_model, target in zip(circuits, noise_models, targets): qobj = assemble(circuit, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) def test_pauli_measure_noise(self): """Test simulation with Pauli measure error noise model.""" shots = 2000 circuits = ref_pauli_noise.pauli_measure_error_circuits() noise_models = ref_pauli_noise.pauli_measure_error_noise_models() targets = ref_pauli_noise.pauli_measure_error_counts(shots) for circuit, noise_model, target in zip(circuits, noise_models, targets): qobj = assemble(circuit, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) class QasmResetNoiseTests: """QasmSimulator reset error noise model tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} def test_reset_gate_noise(self): """Test simulation with reset gate error noise model.""" shots = 2000 circuits = ref_reset_noise.reset_gate_error_circuits() noise_models = ref_reset_noise.reset_gate_error_noise_models() targets = ref_reset_noise.reset_gate_error_counts(shots) for circuit, noise_model, target in zip(circuits, noise_models, targets): qobj = assemble(circuit, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) class QasmKrausNoiseTests: """QasmSimulator Kraus error noise model tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} def test_kraus_gate_noise(self): """Test simulation with Kraus gate error noise model.""" shots = 2000 circuits = ref_kraus_noise.kraus_gate_error_circuits() noise_models = ref_kraus_noise.kraus_gate_error_noise_models() targets = ref_kraus_noise.kraus_gate_error_counts(shots) for circuit, noise_model, target in zip(circuits, noise_models, targets): qobj = assemble(circuit, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_noncliffords.py000066400000000000000000000565061362723322000265700ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_non_clifford from qiskit import execute from qiskit.providers.aer import QasmSimulator class QasmNonCliffordTests: """QasmSimulator non-Clifford gate tests in default basis.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test t-gate # --------------------------------------------------------------------- def test_t_gate_deterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.t_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_t_gate_nondeterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.t_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test tdg-gate # --------------------------------------------------------------------- def test_tdg_gate_deterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.tdg_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_tdg_gate_nondeterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.tdg_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test ccx-gate # --------------------------------------------------------------------- def test_ccx_gate_deterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.ccx_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_ccx_gate_nondeterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.ccx_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cswap-gate (Fredkin) # --------------------------------------------------------------------- def test_cswap_gate_deterministic_default_basis_gates(self): shots = 100 circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cswap_gate_nondeterministic_default_basis_gates(self): shots = 2000 circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cu1 gate # --------------------------------------------------------------------- def test_cu1_gate_nondeterministic_default_basis_gates(self): """Test cu1-gate gate circuits compiling to default basis.""" shots = 2000 circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.cu1_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cu3 gate # --------------------------------------------------------------------- def test_cu3_gate_deterministic_default_basis_gates(self): """Test cu3-gate gate circuits compiling to default basis.""" shots = 100 circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cu3_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) class QasmNonCliffordTestsWaltzBasis: """QasmSimulator non-Clifford gate tests in minimal u1,u2,u3,cx basis.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test t-gate # --------------------------------------------------------------------- def test_t_gate_deterministic_waltz_basis_gates(self): """Test t-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.t_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_t_gate_nondeterministic_waltz_basis_gates(self): """Test t-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.t_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test tdg-gate # --------------------------------------------------------------------- def test_tdg_gate_deterministic_waltz_basis_gates(self): """Test tdg-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.tdg_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_tdg_gate_nondeterministic_waltz_basis_gates(self): """Test tdg-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.tdg_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test ccx-gate # --------------------------------------------------------------------- def test_ccx_gate_deterministic_waltz_basis_gates(self): """Test ccx-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.ccx_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_ccx_gate_nondeterministic_waltz_basis_gates(self): """Test ccx-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.ccx_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cswap-gate (Fredkin) # --------------------------------------------------------------------- def test_cswap_gate_deterministic_waltz_basis_gates(self): """Test cswap-gate gate circuits compiling to u1,u2,u3,cx""" shots = 100 circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cswap_gate_nondeterministic_waltz_basis_gates(self): """Test cswap-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cu1 gate # --------------------------------------------------------------------- def test_cu1_gate_nondeterministic_waltz_basis_gates(self): """Test cu1-gate gate circuits compiling to u1,u2,u3,cx""" shots = 2000 circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.cu1_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cu3 gate # --------------------------------------------------------------------- def test_cu3_gate_deterministic_default_basis_gates(self): """Test cu3-gate gate circuits compiling to u1,u2,u3,cx.""" shots = 100 circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cu3_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) class QasmNonCliffordTestsMinimalBasis: """QasmSimulator non-Clifford gate tests in minimal U,CX basis.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test t-gate # --------------------------------------------------------------------- def test_t_gate_deterministic_minimal_basis_gates(self): """Test t-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.t_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_t_gate_nondeterministic_minimal_basis_gates(self): """Test t-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.t_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test tdg-gate # --------------------------------------------------------------------- def test_tdg_gate_deterministic_minimal_basis_gates(self): """Test tdg-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.tdg_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_tdg_gate_nondeterministic_minimal_basis_gates(self): """Test tdg-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.tdg_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test ccx-gate # --------------------------------------------------------------------- def test_ccx_gate_deterministic_minimal_basis_gates(self): """Test ccx-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.ccx_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_ccx_gate_nondeterministic_minimal_basis_gates(self): """Test ccx-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.ccx_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) # --------------------------------------------------------------------- # Test cu1 gate # --------------------------------------------------------------------- def test_cu1_gate_nondeterministic_minimal_basis_gates(self): """Test cu1-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.cu1_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) # --------------------------------------------------------------------- # Test multiplexer-gate # --------------------------------------------------------------------- def test_multiplexer_cxx_gate_deterministic_default_basis_gates(self): """Test multiplexer-gate gate circuits """ shots = 100 circuits = ref_non_clifford.multiplexer_ccx_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.multiplexer_ccx_gate_counts_deterministic( shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_multiplexer_cxx_gate_nondeterministic_default_basis_gates(self): """Test ccx-gate gate circuits """ shots = 2000 circuits = ref_non_clifford.multiplexer_ccx_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.multiplexer_ccx_gate_counts_nondeterministic( shots) job = execute(circuits, self.SIMULATOR, shots=shots) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cswap-gate (Fredkin) # --------------------------------------------------------------------- def test_cswap_gate_deterministic_minimal_basis_gates(self): """Test cswap-gate gate circuits compiling to u3,cx""" shots = 100 circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cswap_gate_nondeterministic_minimal_basis_gates(self): """Test cswap-gate gate circuits compiling to u3,cx""" shots = 2000 circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_counts_nondeterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) # --------------------------------------------------------------------- # Test cu3 gate # --------------------------------------------------------------------- def test_cu3_gate_deterministic_default_basis_gates(self): """Test cu3-gate gate circuits compiling to u3, cx.""" shots = 100 circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cu3_gate_counts_deterministic(shots) job = execute(circuits, self.SIMULATOR, shots=shots, basis_gates=['u3', 'cx']) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_reset.py000066400000000000000000000064631362723322000252210ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from test.terra.reference import ref_reset from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator class QasmResetTests: """QasmSimulator reset tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test reset # --------------------------------------------------------------------- def test_reset_deterministic(self): """Test QasmSimulator reset with for circuits with deterministic counts""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 100 circuits = ref_reset.reset_circuits_deterministic(final_measure=True) targets = ref_reset.reset_counts_deterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_reset_nondeterministic(self): """Test QasmSimulator reset with for circuits with non-deterministic counts""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 2000 circuits = ref_reset.reset_circuits_nondeterministic( final_measure=True) targets = ref_reset.reset_counts_nondeterministic(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_reset_sampling_opt(self): """Test sampling optimization""" shots = 2000 circuits = ref_reset.reset_circuits_sampling_optimization() targets = ref_reset.reset_counts_sampling_optimization(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_repeated_resets(self): """Test repeated reset operations""" shots = 100 circuits = ref_reset.reset_circuits_repeated() targets = ref_reset.reset_counts_repeated(shots) qobj = assemble(circuits, self.SIMULATOR, shots=shots) result = self.SIMULATOR.run( qobj, backend_options=self.BACKEND_OPTS).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_snapshot.py000066400000000000000000001051311362723322000257260ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests for Snapshot instructions """ import logging import numpy as np from qiskit.compiler import assemble from qiskit.quantum_info.operators import Pauli from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer import AerError from test.terra.reference.ref_snapshot_state import ( snapshot_state_circuits_deterministic, snapshot_state_counts_deterministic, snapshot_state_pre_measure_statevector_deterministic, snapshot_state_post_measure_statevector_deterministic, snapshot_state_circuits_nondeterministic, snapshot_state_counts_nondeterministic, snapshot_state_pre_measure_statevector_nondeterministic, snapshot_state_post_measure_statevector_nondeterministic) from test.terra.reference.ref_snapshot_probabilities import ( snapshot_probabilities_circuits, snapshot_probabilities_counts, snapshot_probabilities_labels_qubits, snapshot_probabilities_post_meas_probs, snapshot_probabilities_pre_meas_probs) from test.terra.reference.ref_snapshot_expval import ( snapshot_expval_circuits, snapshot_expval_counts, snapshot_expval_labels, snapshot_expval_post_meas_values, snapshot_expval_pre_meas_values) class QasmSnapshotStatevectorTests: """QasmSimulator snapshot statevector tests.""" SIMULATOR = QasmSimulator() SUPPORTED_QASM_METHODS = [ 'automatic', 'statevector', 'statevector_gpu', 'statevector_thrust', 'matrix_product_state' ] BACKEND_OPTS = {} @staticmethod def statevector_snapshots(data, label): """Format snapshots as list of Numpy arrays""" snaps = data.get("snapshots", {}).get("statevector", {}).get(label, []) statevecs = [] for snap in snaps: statevecs.append(np.array(snap)) return statevecs def test_snapshot_statevector_pre_measure_det(self): """Test snapshot statevector before deterministic final measurement""" shots = 10 label = "snap" counts_targets = snapshot_state_counts_deterministic(shots) statevec_targets = snapshot_state_pre_measure_statevector_deterministic( ) circuits = snapshot_state_circuits_deterministic(label, 'statevector', post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStatevectorTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.statevector_snapshots(data, label) self.assertTrue(len(snaps), 1) target = statevec_targets[j] value = snaps[0] self.assertTrue(np.allclose(value, target)) def test_snapshot_statevector_pre_measure_nondet(self): """Test snapshot statevector before non-deterministic final measurement""" shots = 100 label = "snap" counts_targets = snapshot_state_counts_nondeterministic(shots) statevec_targets = snapshot_state_pre_measure_statevector_nondeterministic( ) circuits = snapshot_state_circuits_nondeterministic(label, 'statevector', post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStatevectorTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.2 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.statevector_snapshots(data, label) self.assertTrue(len(snaps), 1) target = statevec_targets[j] value = snaps[0] self.assertTrue(np.allclose(value, target)) def test_snapshot_statevector_post_measure_det(self): """Test snapshot statevector after deterministic final measurement""" shots = 10 label = "snap" counts_targets = snapshot_state_counts_deterministic(shots) statevec_targets = snapshot_state_post_measure_statevector_deterministic( ) circuits = snapshot_state_circuits_deterministic(label, 'statevector', post_measure=True) qobj = assemble(circuits, self.SIMULATOR, memory=True, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStatevectorTests.SUPPORTED_QASM_METHODS: logging.getLogger().setLevel(logging.CRITICAL) self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0) # Check snapshots for i, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.statevector_snapshots(data, label) for j, mem in enumerate(data['memory']): target = statevec_targets[i].get(mem) self.assertTrue(np.allclose(snaps[j], target)) def test_snapshot_statevector_post_measure_nondet(self): """Test snapshot statevector after non-deterministic final measurement""" shots = 100 label = "snap" counts_targets = snapshot_state_counts_nondeterministic(shots) statevec_targets = snapshot_state_post_measure_statevector_nondeterministic( ) circuits = snapshot_state_circuits_nondeterministic(label, 'statevector', post_measure=True) qobj = assemble(circuits, self.SIMULATOR, memory=True, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStatevectorTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.2 * shots) # Check snapshots for i, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.statevector_snapshots(data, label) for j, mem in enumerate(data['memory']): target = statevec_targets[i].get(mem) self.assertTrue(np.allclose(snaps[j], target)) class QasmSnapshotStabilizerTests: """QasmSimulator method snapshot stabilizer tests.""" SIMULATOR = QasmSimulator() SUPPORTED_QASM_METHODS = ['automatic', 'stabilizer'] BACKEND_OPTS = {} @staticmethod def stabilizer_snapshots(data, label): """Get stabilizer snapshots""" return data.get("snapshots", {}).get("stabilizer", {}).get(label, []) @staticmethod def stabilizes_statevector(stabilizer, statevector): """Return True if two stabilizer states are equal.""" # Get stabilizer and destabilizers and convert to sets for stab in stabilizer: if stab[0] == '-': pauli_mat = -1 * Pauli.from_label(stab[1:]).to_matrix() else: pauli_mat = Pauli.from_label(stab).to_matrix() val = statevector.conj().dot(pauli_mat.dot(statevector)) if not np.isclose(val, 1): return False return True def test_snapshot_stabilizer_pre_measure_det(self): """Test snapshot stabilizer before deterministic final measurement""" shots = 10 label = "snap" counts_targets = snapshot_state_counts_deterministic(shots) statevec_targets = snapshot_state_pre_measure_statevector_deterministic( ) circuits = snapshot_state_circuits_deterministic(label, 'stabilizer', post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStabilizerTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.stabilizer_snapshots(data, label) self.assertEqual(len(snaps), 1) statevec = statevec_targets[j] stabilizer = snaps[0] self.assertTrue( self.stabilizes_statevector(stabilizer, statevec)) def test_snapshot_stabilizer_pre_measure_nondet(self): """Test snapshot stabilizer before non-deterministic final measurement""" shots = 100 label = "snap" counts_targets = snapshot_state_counts_nondeterministic(shots) statevec_targets = snapshot_state_pre_measure_statevector_nondeterministic( ) circuits = snapshot_state_circuits_nondeterministic(label, 'stabilizer', post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStabilizerTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.2 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.stabilizer_snapshots(data, label) self.assertEqual(len(snaps), 1) statevec = statevec_targets[j] stabilizer = snaps[0] self.assertTrue( self.stabilizes_statevector(stabilizer, statevec)) def test_snapshot_stabilizer_post_measure_det(self): """Test snapshot stabilizer after deterministic final measurement""" shots = 10 label = "snap" counts_targets = snapshot_state_counts_deterministic(shots) statevec_targets = snapshot_state_post_measure_statevector_deterministic( ) circuits = snapshot_state_circuits_deterministic(label, 'stabilizer', post_measure=True) qobj = assemble(circuits, self.SIMULATOR, memory=True, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStabilizerTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0) # Check snapshots for i, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.stabilizer_snapshots(data, label) for j, mem in enumerate(data['memory']): statevec = statevec_targets[i].get(mem) stabilizer = snaps[j] self.assertTrue( self.stabilizes_statevector(stabilizer, statevec)) def test_snapshot_stabilizer_post_measure_nondet(self): """Test snapshot stabilizer after non-deterministic final measurement""" shots = 100 label = "snap" counts_targets = snapshot_state_counts_nondeterministic(shots) statevec_targets = snapshot_state_post_measure_statevector_nondeterministic( ) circuits = snapshot_state_circuits_nondeterministic(label, 'stabilizer', post_measure=True) qobj = assemble(circuits, self.SIMULATOR, memory=True, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotStabilizerTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.2 * shots) # Check snapshots for i, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.stabilizer_snapshots(data, label) for j, mem in enumerate(data['memory']): statevec = statevec_targets[i].get(mem) stabilizer = snaps[j] self.assertTrue( self.stabilizes_statevector(stabilizer, statevec)) class QasmSnapshotDensityMatrixTests: """QasmSimulator snapshot density matrix tests.""" SIMULATOR = QasmSimulator() SUPPORTED_QASM_METHODS = [ 'automatic', 'density_matrix', 'density_matrix_gpu', 'density_matrix_thrust' ] BACKEND_OPTS = {} @staticmethod def density_snapshots(data, label): """Format snapshots as list of Numpy arrays""" # Check snapshot entry exists in data snaps = data.get("snapshots", {}).get("density_matrix", {}).get(label, []) # Convert nested lists to numpy arrays output = {} for snap_dict in snaps: memory = snap_dict['memory'] mat = np.array(snap_dict['value']) output[memory] = mat[:, :, 0] + 1j * mat[:, :, 1] return output def test_snapshot_density_matrix_pre_measure_det(self): """Test snapshot density matrix before deterministic final measurement""" shots = 10 label = "snap" counts_targets = snapshot_state_counts_deterministic(shots) statevec_targets = snapshot_state_pre_measure_statevector_deterministic( ) circuits = snapshot_state_circuits_deterministic(label, 'density_matrix', post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotDensityMatrixTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.density_snapshots(data, label) self.assertTrue(len(snaps), 1) target = np.outer(statevec_targets[j], statevec_targets[j].conj()) # Pre-measurement all memory bits should be 0 value = snaps.get('0x0') self.assertTrue(np.allclose(value, target)) def test_snapshot_density_matrix_pre_measure_nondet(self): """Test snapshot density matrix before non-deterministic final measurement""" shots = 100 label = "snap" counts_targets = snapshot_state_counts_nondeterministic(shots) statevec_targets = snapshot_state_pre_measure_statevector_nondeterministic( ) circuits = snapshot_state_circuits_nondeterministic(label, 'density_matrix', post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotDensityMatrixTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.2 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.density_snapshots(data, label) self.assertTrue(len(snaps), 1) target = np.outer(statevec_targets[j], statevec_targets[j].conj()) value = snaps.get('0x0') self.assertTrue(np.allclose(value, target)) def test_snapshot_density_matrix_post_measure_det(self): """Test snapshot density matrix after deterministic final measurement""" shots = 10 label = "snap" counts_targets = snapshot_state_counts_deterministic(shots) statevec_targets = snapshot_state_post_measure_statevector_deterministic( ) circuits = snapshot_state_circuits_deterministic(label, 'density_matrix', post_measure=True) qobj = assemble(circuits, self.SIMULATOR, memory=True, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotDensityMatrixTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0) # Check snapshots for i, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.density_snapshots(data, label) for j, mem in enumerate(data['memory']): target = statevec_targets[i].get(mem) target = np.outer(target, target.conj()) value = snaps.get(mem) self.assertTrue(np.allclose(value, target)) def test_snapshot_density_matrix_post_measure_nondet(self): """Test snapshot density matrix after non-deterministic final measurement""" shots = 100 label = "snap" counts_targets = snapshot_state_counts_nondeterministic(shots) statevec_targets = snapshot_state_post_measure_statevector_nondeterministic( ) circuits = snapshot_state_circuits_nondeterministic(label, 'density_matrix', post_measure=True) qobj = assemble(circuits, self.SIMULATOR, memory=True, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotDensityMatrixTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.2 * shots) # Check snapshots for i, circuit in enumerate(circuits): data = result.data(circuit) snaps = self.density_snapshots(data, label) for j, mem in enumerate(data['memory']): target = statevec_targets[i].get(mem) target = np.outer(target, target.conj()) value = snaps.get(mem) self.assertTrue(np.allclose(value, target)) class QasmSnapshotProbabilitiesTests: """QasmSimulator snapshot probabilities tests.""" SIMULATOR = QasmSimulator() SUPPORTED_QASM_METHODS = [ 'automatic', 'statevector', 'statevector_gpu', 'statevector_thrust', 'stabilizer', 'density_matrix', 'density_matrix_gpu', 'density_matrix_thrust', 'matrix_product_state', ] BACKEND_OPTS = {} @staticmethod def probability_snapshots(data, labels): """Format snapshots as nested dicts""" # Check snapshot entry exists in data output = {} for label in labels: snaps = data.get("snapshots", {}).get("probabilities", {}).get(label, []) output[label] = { snap_dict['memory']: snap_dict['value'] for snap_dict in snaps } return output def test_snapshot_probabilities_pre_measure(self): """Test snapshot probabilities before final measurement""" shots = 1000 labels = list(snapshot_probabilities_labels_qubits().keys()) counts_targets = snapshot_probabilities_counts(shots) prob_targets = snapshot_probabilities_pre_meas_probs() circuits = snapshot_probabilities_circuits(post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotProbabilitiesTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.1 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) all_snapshots = self.probability_snapshots(data, labels) for label in labels: snaps = all_snapshots.get(label, {}) self.assertTrue(len(snaps), 1) for memory, value in snaps.items(): target = prob_targets[j].get(label, {}).get(memory, {}) self.assertDictAlmostEqual(value, target, delta=1e-7) def test_snapshot_probabilities_post_measure(self): """Test snapshot probabilities after final measurement""" shots = 1000 labels = list(snapshot_probabilities_labels_qubits().keys()) counts_targets = snapshot_probabilities_counts(shots) prob_targets = snapshot_probabilities_post_meas_probs() circuits = snapshot_probabilities_circuits(post_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotProbabilitiesTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.1 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) all_snapshots = self.probability_snapshots(data, labels) for label in labels: snaps = all_snapshots.get(label, {}) for memory, value in snaps.items(): target = prob_targets[j].get(label, {}).get(memory, {}) self.assertDictAlmostEqual(value, target, delta=1e-7) class QasmSnapshotExpValPauliTests: """QasmSimulator snapshot pauli expectation value tests.""" SIMULATOR = QasmSimulator() SUPPORTED_QASM_METHODS = [ 'automatic', 'statevector', 'statevector_gpu', 'statevector_thrust', 'matrix_product_state', 'stabilizer' ] BACKEND_OPTS = {} @staticmethod def expval_snapshots(data, labels): """Format snapshots as nested dicts""" # Check snapshot entry exists in data output = {} for label in labels: snaps = data.get("snapshots", {}).get("expectation_value", {}).get(label, []) # Convert list into dict inner = {} for snap_dict in snaps: val = snap_dict['value'] inner[snap_dict['memory']] = val output[label] = inner return output def test_snapshot_expval_pauli_pre_measure(self): """Test snapshot expectation value (pauli) before final measurement""" shots = 1000 labels = snapshot_expval_labels() counts_targets = snapshot_expval_counts(shots) value_targets = snapshot_expval_pre_meas_values() circuits = snapshot_expval_circuits(pauli=True, post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotExpValPauliTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.1 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) all_snapshots = self.expval_snapshots(data, labels) for label in labels: snaps = all_snapshots.get(label, {}) self.assertTrue(len(snaps), 1) for memory, value in snaps.items(): target = value_targets[j].get(label, {}).get(memory, {}) self.assertAlmostEqual(value, target, delta=1e-7) def test_snapshot_expval_pauli_post_measure(self): """Test snapshot expectation value (pauli) after final measurement""" shots = 1000 labels = snapshot_expval_labels() counts_targets = snapshot_expval_counts(shots) value_targets = snapshot_expval_post_meas_values() circuits = snapshot_expval_circuits(pauli=True, post_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotExpValPauliTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.1 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) all_snapshots = self.expval_snapshots(data, labels) for label in labels: snaps = all_snapshots.get(label, {}) self.assertTrue(len(snaps), 1) for memory, value in snaps.items(): target = value_targets[j].get(label, {}).get(memory, {}) self.assertAlmostEqual(value, target, delta=1e-7) class QasmSnapshotExpValMatrixTests: """QasmSimulator snapshot pauli expectation value tests.""" SIMULATOR = QasmSimulator() SUPPORTED_QASM_METHODS = [ 'automatic', 'statevector', 'statevector_gpu', 'statevector_thrust', 'matrix_product_state' ] BACKEND_OPTS = {} @staticmethod def expval_snapshots(data, labels): """Format snapshots as nested dicts""" # Check snapshot entry exists in data output = {} for label in labels: snaps = data.get("snapshots", {}).get("expectation_value", {}).get(label, []) # Convert list into dict inner = {} for snap_dict in snaps: inner[snap_dict['memory']] = snap_dict['value'] output[label] = inner return output def test_snapshot_expval_matrix_pre_measure(self): """Test snapshot expectation value (matrix) before final measurement""" shots = 1000 labels = snapshot_expval_labels() counts_targets = snapshot_expval_counts(shots) value_targets = snapshot_expval_pre_meas_values() circuits = snapshot_expval_circuits(pauli=False, post_measure=False) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotExpValMatrixTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.1 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) all_snapshots = self.expval_snapshots(data, labels) for label in labels: snaps = all_snapshots.get(label, {}) self.assertTrue(len(snaps), 1) for memory, value in snaps.items(): target = value_targets[j].get(label, {}).get(memory, {}) self.assertAlmostEqual(value, target, delta=1e-7) def test_snapshot_expval_matrix_post_measure(self): """Test snapshot expectation value (matrix) after final measurement""" shots = 1000 labels = snapshot_expval_labels() counts_targets = snapshot_expval_counts(shots) value_targets = snapshot_expval_post_meas_values() circuits = snapshot_expval_circuits(pauli=False, post_measure=True) qobj = assemble(circuits, self.SIMULATOR, shots=shots) job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() success = getattr(result, 'success', False) method = self.BACKEND_OPTS.get('method', 'automatic') if method not in QasmSnapshotExpValMatrixTests.SUPPORTED_QASM_METHODS: self.assertFalse(success) else: self.assertTrue(success) self.compare_counts(result, circuits, counts_targets, delta=0.1 * shots) # Check snapshots for j, circuit in enumerate(circuits): data = result.data(circuit) all_snapshots = self.expval_snapshots(data, labels) for label in labels: snaps = all_snapshots.get(label, {}) self.assertTrue(len(snaps), 1) for memory, value in snaps.items(): target = value_targets[j].get(label, {}).get(memory, {}) self.assertAlmostEqual(value, target, delta=1e-7) qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_thread_management.py000066400000000000000000000521001362723322000275270ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ import multiprocessing import psutil from test.benchmark.tools import quantum_volume_circuit from qiskit import execute, QuantumCircuit from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import pauli_error from test.terra.decorators import requires_omp, requires_multiprocessing # pylint: disable=no-member class QasmThreadManagementTests: """QasmSimulator thread tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} def dummy_noise_model(self): """Return dummy noise model for dummy circuit""" noise_model = NoiseModel() error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model.add_all_qubit_quantum_error(error, 'x') return noise_model def dummy_circuit(self, num_qubits): """Dummy circuit for testing thread settings""" circ = QuantumCircuit(num_qubits, num_qubits) circ.x(range(num_qubits)) circ.measure(range(num_qubits), range(num_qubits)) return circ def measure_in_middle_circuit(self, num_qubits): """Dummy circuit for testing thread settings""" circ = QuantumCircuit(num_qubits, num_qubits) circ.measure(range(num_qubits), range(num_qubits)) circ.x(range(num_qubits)) circ.measure(range(num_qubits), range(num_qubits)) return circ def threads_used(self, result): """Return a list of threads used for each execution""" exp_threads = getattr(result, 'metadata', {}).get('parallel_experiments', 1) threads = [] for exp_result in getattr(result, 'results', []): exp_meta = getattr(exp_result, 'metadata', {}) shot_threads = exp_meta.get('parallel_shots', 1) state_threads = exp_meta.get('parallel_state_update', 1) threads.append({ 'experiments': exp_threads, 'shots': shot_threads, 'state_update': state_threads, 'total': exp_threads * shot_threads * state_threads }) return threads def test_max_memory_settings(self): """test max memory configuration""" # 4-qubit quantum volume test circuit shots = 100 circuit = quantum_volume_circuit(4, 1, measure=True, seed=0) system_memory = int(psutil.virtual_memory().total / 1024 / 1024) # Test defaults opts = self.BACKEND_OPTS.copy() result = execute(circuit, self.SIMULATOR, shots=shots, backend_options=opts).result() max_mem_result = result.metadata.get('max_memory_mb') self.assertGreaterEqual(max_mem_result, int(system_memory / 2), msg="Default 'max_memory_mb' is too small.") self.assertLessEqual(max_mem_result, system_memory, msg="Default 'max_memory_mb' is too large.") # Test custom value max_mem_target = 128 opts['max_memory_mb'] = max_mem_target result = execute(circuit, self.SIMULATOR, shots=shots, backend_options=opts).result() max_mem_result = result.metadata.get('max_memory_mb') self.assertEqual(max_mem_result, max_mem_target, msg="Custom 'max_memory_mb' is not being set correctly.") @requires_omp @requires_multiprocessing def test_parallel_thread_defaults(self): """Test parallel thread assignment defaults""" opts = self.BACKEND_OPTS max_threads = multiprocessing.cpu_count() # Test single circuit, no noise # Parallel experiments and shots should always be 1 result = execute(self.dummy_circuit(1), self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) # Test single circuit, with noise # Parallel experiments should always be 1 # parallel shots should be greater than 1 result = execute(self.dummy_circuit(1), self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test single circuit, with measure in middle, no noise # Parallel experiments should always be 1 # parallel shots should be greater than 1 result = execute(self.measure_in_middle_circuit(1), self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, no noise # Parallel experiments always be 1 # parallel shots should always be 1 result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuits, with noise # Parallel experiments should always be 1 # parallel shots should be greater than 1 result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, with measure in middle, no noise # Parallel experiments should always be 1 # parallel shots should be greater than 1 result = execute(max_threads*[self.measure_in_middle_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) @requires_omp @requires_multiprocessing def test_parallel_thread_assignment_priority(self): """Test parallel thread assignment priority""" # If we set all values to max test output # We intentionally set the max shot and experiment threads to # twice the max threads to check they are limited correctly for custom_max_threads in [0, 1, 2, 4]: opts = self.BACKEND_OPTS.copy() opts['max_parallel_threads'] = custom_max_threads opts['max_parallel_experiments'] = 2 * custom_max_threads opts['max_parallel_shots'] = 2 * custom_max_threads # Calculate actual max threads from custom max and CPU number max_threads = multiprocessing.cpu_count() if custom_max_threads > 0: max_threads = min(max_threads, custom_max_threads) # Test single circuit, no noise # Parallel experiments and shots should always be 1 result = execute(self.dummy_circuit(1), self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) # Test single circuit, with noise # Parallel experiments should always be 1 # parallel shots should be greater than 1 result = execute(self.dummy_circuit(1), self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test single circuit, with measure in middle, no noise # Parallel experiments should always be 1 # parallel shots should be greater than 1 result = execute(self.measure_in_middle_circuit(1), self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, no noise # Parallel experiments always be greater than 1 # parallel shots should always be 1 result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': max_threads, 'shots': 1, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuits, with noise # Parallel experiments always be greater than 1 # parallel shots should always be 1 result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': max_threads, 'shots': 1, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, with measure in middle, no noise # Parallel experiments always be greater than 1 # parallel shots should always be 1 result = execute(max_threads*[self.measure_in_middle_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': max_threads, 'shots': 1, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) @requires_omp @requires_multiprocessing def test_parallel_experiment_thread_assignment(self): """Test parallel experiment thread assignment""" max_threads = multiprocessing.cpu_count() opts = self.BACKEND_OPTS.copy() opts['max_parallel_experiments'] = max_threads # Test single circuit # Parallel experiments and shots should always be 1 result = execute(self.dummy_circuit(1), self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, no noise # Parallel experiments should take priority result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': max_threads, 'shots': 1, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuits, with noise # Parallel experiments should take priority result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': max_threads, 'shots': 1, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, with measure in middle, no noise # Parallel experiments should take priority result = execute(max_threads*[self.measure_in_middle_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': max_threads, 'shots': 1, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuits, with memory limitation # NOTE: this assumes execution on statevector simulator # which required approx 2 MB for 16 qubit circuit. opts['max_memory_mb'] = 1 result = execute(2 * [quantum_volume_circuit(16, 1, measure=True, seed=0)], self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) @requires_omp @requires_multiprocessing def test_parallel_shot_thread_assignment(self): """Test parallel shot thread assignment""" max_threads = multiprocessing.cpu_count() opts = self.BACKEND_OPTS.copy() opts['max_parallel_shots'] = max_threads # Test single circuit # Parallel experiments and shots should always be 1 result = execute(self.dummy_circuit(1), self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, no noise # Parallel experiments and shots should always be 1 result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuits, with noise # Parallel shots should take priority result = execute(max_threads*[self.dummy_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuit, with measure in middle, no noise # Parallel shots should take priority result = execute(max_threads*[self.measure_in_middle_circuit(1)], self.SIMULATOR, shots=10*max_threads, noise_model=self.dummy_noise_model(), backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': max_threads, 'state_update': 1, 'total': max_threads } self.assertEqual(threads, target) # Test multiple circuits, with memory limitation # NOTE: this assumes execution on statevector simulator # which required approx 2 MB for 16 qubit circuit. opts['max_memory_mb'] = 1 result = execute(2 * [quantum_volume_circuit(16, 1, measure=True, seed=0)], self.SIMULATOR, shots=10*max_threads, backend_options=opts).result() for threads in self.threads_used(result): target = { 'experiments': 1, 'shots': 1, 'state_update': max_threads, 'total': max_threads } self.assertEqual(threads, target) @requires_omp @requires_multiprocessing def _test_qasm_explicit_parallelization(self): """test disabling parallel shots because max_parallel_shots is 1""" # Test circuit shots = multiprocessing.cpu_count() circuit = quantum_volume_circuit(16, 1, measure=True, seed=0) backend_opts = self.BACKEND_OPTS.copy() backend_opts['max_parallel_shots'] = 1 backend_opts['max_parallel_experiments'] = 1 backend_opts['noise_model'] = self.dummy_noise_model() backend_opts['_parallel_experiments'] = 2 backend_opts['_parallel_shots'] = 3 backend_opts['_parallel_state_update'] = 4 result = execute( circuit, self.SIMULATOR, shots=shots, backend_options=backend_opts).result() if result.metadata['omp_enabled']: self.assertEqual( result.metadata['parallel_experiments'], 2, msg="parallel_experiments should be 2") self.assertEqual( result.to_dict()['results'][0]['metadata']['parallel_shots'], 3, msg="parallel_shots must be 3") self.assertEqual( result.to_dict()['results'][0]['metadata'] ['parallel_state_update'], 4, msg="parallel_state_update should be 4") qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_truncate.py000066400000000000000000000464441362723322000257270ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2018, IBM. # # This source code is licensed under the Apache License, Version 2.0 found in # the LICENSE.txt file in the root directory of this source tree. """ QasmSimulator Integration Tests """ import json from test.benchmark.tools import quantum_volume_circuit from qiskit import execute, QuantumRegister, ClassicalRegister, QuantumCircuit, Aer from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer import noise from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors import ReadoutError, depolarizing_error from qiskit.providers.models import BackendProperties class QasmQubitsTruncateTests: """QasmSimulator Qubits Truncate tests.""" SIMULATOR = QasmSimulator() def create_circuit_for_truncate(self): qr = QuantumRegister(4) cr = ClassicalRegister(4) circuit = QuantumCircuit(qr, cr) circuit.u3(0.1,0.1,0.1,qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[3]) circuit.barrier(qr) circuit.u3(0.1,0.1,0.1,qr[0]) circuit.barrier(qr) circuit.measure(qr[0], cr[0]) circuit.measure(qr[1], cr[1]) return circuit def device_properties(self): properties = {"general": [], "last_update_date": "2019-04-22T03:26:08+00:00", "gates": [ {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [0]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [0]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [0]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [1]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [1]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [1]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [2]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [2]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [2]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [3]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [3]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [3]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [4]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [4]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [4]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [5]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [5]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [5]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [6]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [6]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [6]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [7]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [7]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [7]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [8]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [8]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [8]}, {"gate": "u1", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [9]}, {"gate": "u2", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [9]}, {"gate": "u3", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-23T01:45:04+00:00", "unit": ""}], "qubits": [9]}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:26:00+00:00", "unit": ""}], "qubits": [0, 1], "name": "CX0_1"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:29:15+00:00", "unit": ""}], "qubits": [1, 2], "name": "CX1_2"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:32:48+00:00", "unit": ""}], "qubits": [2, 3], "name": "CX2_3"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:26:00+00:00", "unit": ""}], "qubits": [3, 4], "name": "CX3_4"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:29:15+00:00", "unit": ""}], "qubits": [4, 5], "name": "CX4_5"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:32:48+00:00", "unit": ""}], "qubits": [5, 6], "name": "CX5_6"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:26:00+00:00", "unit": ""}], "qubits": [6, 7], "name": "CX6_7"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:29:15+00:00", "unit": ""}], "qubits": [7, 8], "name": "CX7_8"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:32:48+00:00", "unit": ""}], "qubits": [8, 9], "name": "CX8_9"}, {"gate": "cx", "parameters": [{"name": "gate_error", "value": 0.001, "date": "2019-04-22T02:26:00+00:00", "unit": ""}], "qubits": [9, 0], "name": "CX9_0"}], "qubits": [ [ {"name": "T1", "value": 23.809868955712616, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 43.41142418044261, "date": "2019-04-22T01:33:33+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.032871440179164, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.03489999999999993, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 68.14048367144501, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 56.95903203933663, "date": "2019-04-22T01:34:36+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 4.896209948700639, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.19589999999999996, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 83.26776276928099, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 23.49615795695734, "date": "2019-04-22T01:31:32+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.100093544085939, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.09050000000000002, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 57.397746445609975, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 98.47976889309517, "date": "2019-04-22T01:32:32+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.238526396839902, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.24350000000000005, "date": "2019-04-20T15:31:39+00:00", "unit": ""}], [ {"name": "T1", "value": 23.809868955712616, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 43.41142418044261, "date": "2019-04-22T01:33:33+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.032871440179164, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.03489999999999993, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 68.14048367144501, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 56.95903203933663, "date": "2019-04-22T01:34:36+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 4.896209948700639, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.19589999999999996, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 83.26776276928099, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 23.49615795695734, "date": "2019-04-22T01:31:32+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.100093544085939, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.09050000000000002, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 57.397746445609975, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 98.47976889309517, "date": "2019-04-22T01:32:32+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.238526396839902, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.24350000000000005, "date": "2019-04-20T15:31:39+00:00", "unit": ""}], [ {"name": "T1", "value": 23.809868955712616, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 43.41142418044261, "date": "2019-04-22T01:33:33+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 5.032871440179164, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.03489999999999993, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], [ {"name": "T1", "value": 68.14048367144501, "date": "2019-04-22T01:30:15+00:00", "unit": "\u00b5s"}, {"name": "T2", "value": 56.95903203933663, "date": "2019-04-22T01:34:36+00:00", "unit": "\u00b5s"}, {"name": "frequency", "value": 4.896209948700639, "date": "2019-04-22T03:26:08+00:00", "unit": "GHz"}, {"name": "readout_error", "value": 0.19589999999999996, "date": "2019-04-22T01:29:47+00:00", "unit": ""}], ], "backend_name": "mock_4q", "backend_version": "1.0.0"} return BackendProperties.from_dict(properties) def test_truncate_ideal_sparse_circuit(self): """Test qubit truncation for large circuit with unused qubits.""" # Circuit that uses just 2-qubits circuit = QuantumCircuit(50, 2) circuit.x(10) circuit.x(20) circuit.measure(10, 0) circuit.measure(20, 1) qasm_sim = Aer.get_backend('qasm_simulator') backend_options = self.BACKEND_OPTS.copy() backend_options["truncate_verbose"] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = execute(circuit, qasm_sim, shots=100, backend_options=backend_options).result() metadata = result.results[0].metadata self.assertTrue('truncate_qubits' in metadata, msg="truncate_qubits must work.") active_qubits = sorted(metadata['truncate_qubits'].get('active_qubits', [])) mapping = sorted(metadata['truncate_qubits'].get('mapping', [])) self.assertEqual(active_qubits, [10, 20]) self.assertIn(mapping, [[[10, 0], [20, 1]], [[10, 1], [20, 0]]]) def test_truncate_nonlocal_noise(self): """Test qubit truncation with non-local noise.""" # Circuit that uses just 2-qubits circuit = QuantumCircuit(10, 1) circuit.x(5) circuit.measure(5, 0) # Add non-local 2-qubit depolarizing error # that acts on qubits [4, 6] when X applied to qubit 5 noise_model = NoiseModel() error = depolarizing_error(0.1, 2) noise_model.add_nonlocal_quantum_error(error, ['x'], [5], [4, 6]) qasm_sim = Aer.get_backend('qasm_simulator') backend_options = self.BACKEND_OPTS.copy() backend_options["truncate_verbose"] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = execute(circuit, qasm_sim, shots=100, noise_model=noise_model, backend_options=backend_options).result() metadata = result.results[0].metadata self.assertTrue('truncate_qubits' in metadata, msg="truncate_qubits must work.") active_qubits = sorted(metadata['truncate_qubits'].get('active_qubits', [])) mapping = metadata['truncate_qubits'].get('mapping', []) active_remapped = sorted([i[1] for i in mapping if i[0] in active_qubits]) self.assertEqual(active_qubits, [4, 5, 6]) self.assertEqual(active_remapped, [0, 1, 2]) def test_truncate(self): """Test truncation with noise model option""" circuit = self.create_circuit_for_truncate() qasm_sim = Aer.get_backend('qasm_simulator') backend_options = self.BACKEND_OPTS.copy() backend_options["truncate_verbose"] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = execute(circuit, qasm_sim, noise_model=NoiseModel.from_backend(self.device_properties()), shots=100, coupling_map=[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 0]], # 10-qubit device backend_options=backend_options).result() self.assertTrue('truncate_qubits' in result.to_dict()['results'][0]['metadata'], msg="truncate_qubits must work.") def test_no_truncate(self): """Test truncation with noise model option""" circuit = self.create_circuit_for_truncate() qasm_sim = Aer.get_backend('qasm_simulator') backend_options = self.BACKEND_OPTS.copy() backend_options["truncate_verbose"] = True backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = execute(circuit, qasm_sim, noise_model=NoiseModel.from_backend(self.device_properties()), shots=100, coupling_map=[[1, 0], [1, 2], [1, 3], [2, 0], [2, 1], [2, 3], [3, 0], [3, 1], [3, 2]], # 4-qubit device backend_options=backend_options).result() self.assertFalse('truncate_qubits' in result.to_dict()['results'][0]['metadata'], msg="truncate_qubits must work.") def test_truncate_disable(self): """Test explicitly disabling truncation with noise model option""" circuit = self.create_circuit_for_truncate() qasm_sim = Aer.get_backend('qasm_simulator') backend_options = self.BACKEND_OPTS.copy() backend_options["truncate_verbose"] = True backend_options["truncate_enable"] = False backend_options['optimize_ideal_threshold'] = 1 backend_options['optimize_noise_threshold'] = 1 result = execute(circuit, qasm_sim, noise_model=NoiseModel.from_backend(self.device_properties()), shots=100, coupling_map=[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 0]], # 10-qubit device backend_options=backend_options).result() self.assertFalse('truncate_qubits' in result.to_dict()['results'][0]['metadata'], msg="truncate_qubits must not work.") qiskit-aer-0.4.1/test/terra/backends/qasm_simulator/qasm_unitary_gate.py000066400000000000000000000037351362723322000265710ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ from qiskit import execute from qiskit.providers.aer import QasmSimulator from test.terra.reference import ref_unitary_gate class QasmUnitaryGateTests: """QasmSimulator additional tests.""" SIMULATOR = QasmSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test unitary gate qobj instruction # --------------------------------------------------------------------- def test_unitary_gate(self): """Test simulation with unitary gate circuit instructions.""" shots = 100 circuits = ref_unitary_gate.unitary_gate_circuits_deterministic( final_measure=True) targets = ref_unitary_gate.unitary_gate_counts_deterministic( shots) result = execute(circuits, self.SIMULATOR, shots=shots).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_random_unitary_gate(self): """Test simulation with random unitary gate circuit instructions.""" shots = 2000 circuits = ref_unitary_gate.unitary_random_gate_circuits_nondeterministic(final_measure=True) targets = ref_unitary_gate.unitary_random_gate_counts_nondeterministic() result = execute(circuits, self.SIMULATOR, shots=shots).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) qiskit-aer-0.4.1/test/terra/backends/statevector_simulator/000077500000000000000000000000001362723322000240755ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/backends/statevector_simulator/statevector_basics.py000066400000000000000000001643311362723322000303460ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2020. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ StatevectorSimulator Integration Tests """ from test.terra.reference import ref_measure from test.terra.reference import ref_reset from test.terra.reference import ref_initialize from test.terra.reference import ref_conditionals from test.terra.reference import ref_1q_clifford from test.terra.reference import ref_2q_clifford from test.terra.reference import ref_non_clifford from test.terra.reference import ref_unitary_gate from qiskit import execute from qiskit.compiler import assemble from qiskit.providers.aer import StatevectorSimulator class StatevectorSimulatorTests: """StatevectorSimulator tests.""" SIMULATOR = StatevectorSimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test initialize # --------------------------------------------------------------------- def test_initialize_1(self): """Test StatevectorSimulator initialize""" circuits = ref_initialize.initialize_circuits_1(final_measure=False) targets = ref_initialize.initialize_statevector_1() qobj = assemble(circuits, shots=1) sim_job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = sim_job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_initialize_2(self): """Test StatevectorSimulator initialize""" circuits = ref_initialize.initialize_circuits_2(final_measure=False) targets = ref_initialize.initialize_statevector_2() qobj = assemble(circuits, shots=1) sim_job = self.SIMULATOR.run(qobj, backend_options=self.BACKEND_OPTS) result = sim_job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test reset # --------------------------------------------------------------------- def test_reset_deterministic(self): """Test StatevectorSimulator reset with for circuits with deterministic counts""" # For statevector output we can combine deterministic and non-deterministic # count output circuits circuits = ref_reset.reset_circuits_deterministic(final_measure=False) targets = ref_reset.reset_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_reset_nondeterministic(self): """Test StatevectorSimulator reset with for circuits with non-deterministic counts""" # For statevector output we can combine deterministic and non-deterministic # count output circuits circuits = ref_reset.reset_circuits_nondeterministic( final_measure=False) targets = ref_reset.reset_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test measure # --------------------------------------------------------------------- def test_measure(self): """Test StatevectorSimulator measure with deterministic counts""" circuits = ref_measure.measure_circuits_deterministic( allow_sampling=True) targets = ref_measure.measure_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test conditional # --------------------------------------------------------------------- def test_conditional_gate_1bit(self): """Test conditional gates on 1-bit conditional register.""" circuits = ref_conditionals.conditional_circuits_1bit( final_measure=False) targets = ref_conditionals.conditional_statevector_1bit() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_conditional_unitary_1bit(self): """Test conditional unitaries on 1-bit conditional register.""" circuits = ref_conditionals.conditional_circuits_1bit( final_measure=False, conditional_type='unitary') targets = ref_conditionals.conditional_statevector_1bit() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_conditional_gate_2bit(self): """Test conditional gates on 2-bit conditional register.""" circuits = ref_conditionals.conditional_circuits_2bit( final_measure=False) targets = ref_conditionals.conditional_statevector_2bit() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_conditional_unitary_2bit(self): """Test conditional unitary on 2-bit conditional register.""" circuits = ref_conditionals.conditional_circuits_2bit( final_measure=False, conditional_type='unitary') targets = ref_conditionals.conditional_statevector_2bit() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test h-gate # --------------------------------------------------------------------- def test_h_gate_deterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.h_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_h_gate_deterministic_waltz_basis_gates(self): """Test h-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.h_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_h_gate_deterministic_minimal_basis_gates(self): """Test h-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.h_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_h_gate_nondeterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.h_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_h_gate_nondeterministic_waltz_basis_gates(self): """Test h-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.h_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_h_gate_nondeterministic_minimal_basis_gates(self): """Test h-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.h_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test x-gate # --------------------------------------------------------------------- def test_x_gate_deterministic_default_basis_gates(self): """Test x-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.x_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_x_gate_deterministic_waltz_basis_gates(self): """Test x-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.x_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_x_gate_deterministic_minimal_basis_gates(self): """Test x-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.x_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test z-gate # --------------------------------------------------------------------- def test_z_gate_deterministic_default_basis_gates(self): """Test z-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.z_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_z_gate_deterministic_waltz_basis_gates(self): """Test z-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.z_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_z_gate_deterministic_minimal_basis_gates(self): """Test z-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.z_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test y-gate # --------------------------------------------------------------------- def test_y_gate_deterministic_default_basis_gates(self): """Test y-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.y_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_y_gate_deterministic_waltz_basis_gates(self): """Test y-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.y_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_y_gate_deterministic_minimal_basis_gates(self): """Test y-gate gate circuits compiling to u3, cx.""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.y_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test s-gate # --------------------------------------------------------------------- def test_s_gate_deterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.s_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_s_gate_deterministic_waltz_basis_gates(self): """Test s-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.s_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_s_gate_deterministic_minimal_basis_gates(self): """Test s-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.s_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_s_gate_nondeterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.s_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_s_gate_nondeterministic_waltz_basis_gates(self): """Test s-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.s_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_s_gate_nondeterministic_minimal_basis_gates(self): """Test s-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.s_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test sdg-gate # --------------------------------------------------------------------- def test_sdg_gate_deterministic_default_basis_gates(self): """Test sdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_sdg_gate_deterministic_waltz_basis_gates(self): """Test sdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_sdg_gate_deterministic_minimal_basis_gates(self): """Test sdg-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_sdg_gate_nondeterministic_default_basis_gates(self): """Test sdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_sdg_gate_nondeterministic_waltz_basis_gates(self): """Test sdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_sdg_gate_nondeterministic_minimal_basis_gates(self): """Test sdg-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test cx-gate # --------------------------------------------------------------------- def test_cx_gate_deterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cx_gate_deterministic_waltz_basis_gates(self): """Test cx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cx_gate_deterministic_minimal_basis_gates(self): """Test cx-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cx_gate_nondeterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cx_gate_nondeterministic_waltz_basis_gates(self): """Test cx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cx_gate_nondeterministic_minimal_basis_gates(self): """Test cx-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test cz-gate # --------------------------------------------------------------------- def test_cz_gate_deterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cz_gate_deterministic_waltz_basis_gates(self): """Test cz-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cz_gate_deterministic_minimal_basis_gates(self): """Test cz-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cz_gate_nondeterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cz_gate_nondeterministic_waltz_basis_gates(self): """Test cz-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cz_gate_nondeterministic_minimal_basis_gates(self): """Test cz-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test swap-gate # --------------------------------------------------------------------- def test_swap_gate_deterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_swap_gate_deterministic_waltz_basis_gates(self): """Test swap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_swap_gate_deterministic_minimal_basis_gates(self): """Test swap-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_swap_gate_nondeterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_swap_gate_nondeterministic_waltz_basis_gates(self): """Test swap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_swap_gate_nondeterministic_minimal_basis_gates(self): """Test swap-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test t-gate # --------------------------------------------------------------------- def test_t_gate_deterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.t_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_t_gate_deterministic_waltz_basis_gates(self): """Test t-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.t_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_t_gate_deterministic_minimal_basis_gates(self): """Test t-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.t_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_t_gate_nondeterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.t_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_t_gate_nondeterministic_waltz_basis_gates(self): """Test t-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.t_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_t_gate_nondeterministic_minimal_basis_gates(self): """Test t-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.t_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test tdg-gate # --------------------------------------------------------------------- def test_tdg_gate_deterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_tdg_gate_deterministic_waltz_basis_gates(self): """Test tdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_tdg_gate_deterministic_minimal_basis_gates(self): """Test tdg-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_tdg_gate_nondeterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_tdg_gate_nondeterministic_waltz_basis_gates(self): """Test tdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_tdg_gate_nondeterministic_minimal_basis_gates(self): """Test tdg-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test ccx-gate # --------------------------------------------------------------------- def test_ccx_gate_deterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_ccx_gate_deterministic_waltz_basis_gates(self): """Test ccx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_ccx_gate_deterministic_minimal_basis_gates(self): """Test ccx-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_ccx_gate_nondeterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_ccx_gate_nondeterministic_waltz_basis_gates(self): """Test ccx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_ccx_gate_nondeterministic_minimal_basis_gates(self): """Test ccx-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test unitary gate qobj instruction # --------------------------------------------------------------------- def test_unitary_gate(self): """Test simulation with unitary gate circuit instructions.""" circuits = ref_unitary_gate.unitary_gate_circuits_deterministic( final_measure=False) targets = ref_unitary_gate.unitary_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test cu1 gate # --------------------------------------------------------------------- def test_cu1_gate_nondeterministic_default_basis_gates(self): """Test cu1-gate gate circuits compiling to default basis.""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cu1_gate_nondeterministic_waltz_basis_gates(self): """Test cu1-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cu1_gate_nondeterministic_minimal_basis_gates(self): """Test cu1-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test cswap-gate (Fredkin) # --------------------------------------------------------------------- def test_cswap_gate_deterministic_default_basis_gates(self): """Test cswap-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cswap_gate_deterministic_minimal_basis_gates(self): """Test cswap-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cswap_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cswap_gate_deterministic_waltz_basis_gates(self): """Test cswap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cswap_gate_nondeterministic_default_basis_gates(self): """Test cswap-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cswap_gate_nondeterministic_minimal_basis_gates(self): """Test cswap-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cswap_gate_nondeterministic_waltz_basis_gates(self): """Test cswap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_statevector_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) # --------------------------------------------------------------------- # Test cu3-gate (Fredkin) # --------------------------------------------------------------------- def test_cu3_gate_deterministic_default_basis_gates(self): """Test cu3-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cu3_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cu3_gate_deterministic_minimal_basis_gates(self): """Test cu3-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=True) targets = ref_non_clifford.cu3_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) def test_cu3_gate_deterministic_waltz_basis_gates(self): """Test cu3-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cu3_gate_statevector_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_statevector(result, circuits, targets) qiskit-aer-0.4.1/test/terra/backends/test_pulse_simulator.py000066400000000000000000001010171362723322000242730ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ PulseSimulator Integration Tests """ import sys import unittest import functools from test.terra import common import numpy as np from scipy.linalg import expm from scipy.special import erf import qiskit import qiskit.pulse as pulse from qiskit.compiler import assemble from qiskit.quantum_info import state_fidelity from qiskit.pulse.channels import (DriveChannel, ControlChannel, AcquireChannel, MemorySlot) from qiskit.pulse.commands import SamplePulse, FrameChange from qiskit.providers.aer.pulse.pulse_system_model import PulseSystemModel from qiskit.providers.aer.pulse.hamiltonian_model import HamiltonianModel USE_CPP_ODE_FUNC = True def run_cython_and_cpp_solvers(func): """ This is a temporary decorator to test both the C++ solver and Cython one. It should be removed when the cyhton one will be removed """ @functools.wraps(func) def wrapper(*args, **kwargs): # pylint: disable=global-statement global USE_CPP_ODE_FUNC USE_CPP_ODE_FUNC = True # Run C++ Solver first func(*args, **kwargs) # Run Cython Solver afterwards USE_CPP_ODE_FUNC = False func(*args, **kwargs) return wrapper class TestPulseSimulator(common.QiskitAerTestCase): r"""PulseSimulator tests. Mathematical expressions are formulated in latex in docstrings for this class. # pylint: disable=anomalous backslash in string Uses single qubit Hamiltonian `H = -\frac{1}{2} \omega_0 \sigma_z + \frac{1}{2} \omega_a e^{i(\omega_{d0} t+\phi)} \sigma_x`. We make sure H is Hermitian by taking the complex conjugate of the lower triangular piece (as done by the simulator). To find the closed form, we move to a rotating frame via the unitary `Urot = e^{-i \omega t \sigma_z/2} (\ket{psi_{rot}}=Urot \ket{psi_{rot}})`. In this frame, the Hamiltonian becomes `Hrot = \frac{1}{2} \omega_a (\cos(\phi) \sigma_x - \sin(\phi) \sigma_y) + \frac{\omega_{d0}-\omega_0}{2} \sigma_z`. """ def setUp(self): """ Set configuration settings for pulse simulator WARNING: We do not support Python 3.5 because the digest algorithm relies on dictionary insertion order. This "feature" was introduced later on Python 3.6 and there's no official support for OrderedDict in the C API so Python 3.5 support has been disabled while looking for a propper fix. """ if sys.version_info.major == 3 and sys.version_info.minor == 5: self.skipTest("We don't support Python 3.5 for Pulse simulator") # Get pulse simulator backend self.backend_sim = qiskit.Aer.get_backend('pulse_simulator') # --------------------------------------------------------------------- # Test single qubit gates (using meas level 2 and square drive) # --------------------------------------------------------------------- @run_cython_and_cpp_solvers def test_x_gate(self): """ Test x gate. Set omega_d0=omega_0 (drive on resonance), phi=0, omega_a = pi/time """ # setup system model total_samples = 100 omega_0 = 2 * np.pi omega_d0 = omega_0 omega_a = np.pi / total_samples system_model = self._system_model_1Q(omega_0, omega_a) # set up schedule and qobj schedule = self._simple_1Q_schedule(0, total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=256) # set backend backend_options backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False # run simulation result = self.backend_sim.run(qobj, system_model=system_model, backend_options=backend_options).result() # test results counts = result.get_counts() exp_counts = {'1': 256} self.assertDictAlmostEqual(counts, exp_counts) @run_cython_and_cpp_solvers def test_dt_scaling_x_gate(self): """ Test that dt is being used correctly by the solver. """ total_samples = 100 # do the same thing as test_x_gate, but scale dt and all frequency parameters # define test case for a single scaling def scale_test(scale): # set omega_0, omega_d0 equal (use qubit frequency) -> drive on resonance # Require omega_a*time = pi to implement pi pulse (x gate) omega_0 = 2 * np.pi / scale omega_d0 = omega_0 omega_a = np.pi / total_samples / scale # set up system model system_model = self._system_model_1Q(omega_0, omega_a) system_model.dt = system_model.dt * scale # set up schedule and qobj schedule = self._simple_1Q_schedule(0, total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=256) # set backend backend_options backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False # run simulation result = self.backend_sim.run(qobj, system_model=system_model, backend_options=backend_options).result() counts = result.get_counts() exp_counts = {'1': 256} self.assertDictAlmostEqual(counts, exp_counts) # set scales and run tests scales = [2., 0.1234, 10.**5, 10**-5] for scale in scales: scale_test(scale) @run_cython_and_cpp_solvers def test_hadamard_gate(self): """Test Hadamard. Is a rotation of pi/2 about the y-axis. Set omega_d0=omega_0 (drive on resonance), phi=-pi/2, omega_a = pi/2/time """ # set variables shots = 100000 # large number of shots so get good proportions total_samples = 100 # set omega_0, omega_d0 equal (use qubit frequency) -> drive on resonance omega_0 = 2 * np.pi omega_d0 = omega_0 # Require omega_a*time = pi/2 to implement pi/2 rotation pulse # num of samples gives time omega_a = np.pi / 2 / total_samples system_model = self._system_model_1Q(omega_0, omega_a) phi = -np.pi / 2 schedule = self._simple_1Q_schedule(phi, total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=shots) # set backend backend_options backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False # run simulation result = self.backend_sim.run(qobj, system_model=system_model, backend_options=backend_options).result() counts = result.get_counts() # compare prop prop = {} for key in counts.keys(): prop[key] = counts[key] / shots exp_prop = {'0': 0.5, '1': 0.5} self.assertDictAlmostEqual(prop, exp_prop, delta=0.01) @run_cython_and_cpp_solvers def test_arbitrary_gate(self): """Test a few examples w/ arbitary drive, phase and amplitude. """ shots = 10000 # large number of shots so get good proportions total_samples = 100 num_tests = 3 # set variables for each test omega_0 = 2 * np.pi omega_d0_vals = [omega_0 + 1, omega_0 + 0.02, omega_0 + 0.005] omega_a_vals = [ 2 * np.pi / 3 / total_samples, 7 * np.pi / 5 / total_samples, 0.1 ] phi_vals = [5 * np.pi / 7, 19 * np.pi / 14, np.pi / 4] for i in range(num_tests): with self.subTest(i=i): system_model = self._system_model_1Q(omega_0, omega_a_vals[i]) schedule = self._simple_1Q_schedule(phi_vals[i], total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0_vals[i]/(2*np.pi)], memory_slots=2, shots=shots) # Run qobj and compare prop to expected result backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() counts = result.get_counts() prop = {} for key in counts.keys(): prop[key] = counts[key] / shots exp_prop = self._analytic_prop_1q_gates( total_samples=total_samples, omega_0=omega_0, omega_a=omega_a_vals[i], omega_d0=omega_d0_vals[i], phi=phi_vals[i]) self.assertDictAlmostEqual(prop, exp_prop, delta=0.01) @run_cython_and_cpp_solvers def test_meas_level_1(self): """Test measurement level 1. """ shots = 10000 # run large number of shots for good proportions total_samples = 100 # perform hadamard setup (so get some 0's and some 1's), but use meas_level = 1 # set omega_0, omega_d0 equal (use qubit frequency) -> drive on resonance omega_0 = 2 * np.pi omega_d0 = omega_0 # Require omega_a*time = pi/2 to implement pi/2 rotation pulse # num of samples gives time omega_a = np.pi / 2 / total_samples phi = -np.pi / 2 system_model = self._system_model_1Q(omega_0, omega_a) phi = -np.pi / 2 schedule = self._simple_1Q_schedule(phi, total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=1, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=shots) # set backend backend_options backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() # Verify that (about) half the IQ vals have abs val 1 and half have abs val 0 # (use prop for easier comparison) mem = np.abs(result.get_memory()[:, 0]) iq_prop = {'0': 0, '1': 0} for i in mem: if i == 0: iq_prop['0'] += 1 / shots else: iq_prop['1'] += 1 / shots exp_prop = {'0': 0.5, '1': 0.5} self.assertDictAlmostEqual(iq_prop, exp_prop, delta=0.01) @run_cython_and_cpp_solvers def test_gaussian_drive(self): """Test gaussian drive pulse using meas_level_2. Set omega_d0=omega_0 (drive on resonance), phi=0, omega_a = pi/time """ # set variables # set omega_0, omega_d0 equal (use qubit frequency) -> drive on resonance total_samples = 100 omega_0 = 2 * np.pi omega_d0 = omega_0 # Require omega_a*time = pi to implement pi pulse (x gate) # num of samples gives time omega_a = np.pi / total_samples phi = 0 # Test gaussian drive results for a few different sigma gauss_sigmas = { total_samples / 6, total_samples / 3, total_samples } system_model = self._system_model_1Q(omega_0, omega_a) for gauss_sigma in gauss_sigmas: with self.subTest(gauss_sigma=gauss_sigma): schedule = self._simple_1Q_schedule(phi, total_samples, "gaussian", gauss_sigma) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=1000) backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() statevector = result.get_statevector() exp_statevector = self._analytic_gaussian_statevector( total_samples, gauss_sigma=gauss_sigma, omega_a=omega_a) # Check fidelity of statevectors self.assertGreaterEqual( state_fidelity(statevector, exp_statevector), 0.99) @run_cython_and_cpp_solvers def test_frame_change(self): """Test frame change command. """ shots = 10000 total_samples = 100 # set omega_0, omega_d0 equal (use qubit frequency) -> drive on resonance omega_0 = 2 * np.pi omega_d0 = omega_0 # set phi = 0 phi = 0 dur_drive1 = total_samples # first pulse duration fc_phi = np.pi # Test frame change where no shift in state results # specfically: do pi/2 pulse, then pi frame change, then another pi/2 pulse. # Verify left in |0> state dur_drive2 = dur_drive1 # same duration for both pulses omega_a = np.pi / 2 / dur_drive1 # pi/2 pulse amplitude system_model = self._system_model_1Q(omega_0, omega_a) schedule = self._1Q_frame_change_schedule(phi, fc_phi, total_samples, dur_drive1, dur_drive2) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=shots) backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() counts = result.get_counts() exp_counts = {'0': shots} self.assertDictAlmostEqual(counts, exp_counts) # Test frame change where a shift does result # specifically: do pi/4 pulse, then pi phase change, then do pi/8 pulse. # check that a net rotation of pi/4-pi/8 has occured on the Bloch sphere dur_drive2 = int(dur_drive1 / 2) # half time for second pulse (halves angle) omega_a = np.pi / 4 / dur_drive1 # pi/4 pulse amplitude system_model = self._system_model_1Q(omega_0, omega_a) schedule = self._1Q_frame_change_schedule(phi, fc_phi, total_samples, dur_drive1, dur_drive2) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=shots) backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() counts = result.get_counts() # verify props prop_shift = {} for key in counts.keys(): prop_shift[key] = counts[key] / shots # net angle is given by pi/4-pi/8 prop0 = np.cos((np.pi / 4 - np.pi / 8) / 2)**2 exp_prop = {'0' : prop0, '1': 1 - prop0} self.assertDictAlmostEqual(prop_shift, exp_prop, delta=0.01) @run_cython_and_cpp_solvers def test_three_level(self): r"""Test 3 level system. Compare statevectors as counts only use bitstrings. Analytic form given in _analytic_statevector_3level function docstring. """ def analytic_state_vector(omega_a, total_samples): r"""Returns analytically computed statevector for 3 level system with our Hamiltonian. Is given by `(\frac{1}{3} (2+\cos(\frac{\sqrt{3}}{2} \omega_a t)), -\frac{i}{\sqrt{3}} \sin(\frac{\sqrt{3}}{2} \omega_a t), -\frac{2\sqrt{2}}{3} \sin(\frac{\sqrt{3}}{4} \omega_a t)^2)`. Args: omega_a (float): Q0 drive amplitude total_samples (int): number of samples to use in pulses_idx Returns: exp_statevector (list): analytically computed statevector with Hamiltonian from above (Returned in the rotating frame) """ time = total_samples arg1 = np.sqrt(3) * omega_a * time / 2 # cos arg for first component arg2 = arg1 # sin arg for first component arg3 = arg1 / 2 # sin arg for 3rd component exp_statevector = np.array([(2 + np.cos(arg1)) / 3, -1j * np.sin(arg2) / np.sqrt(3), -2 * np.sqrt(2) * np.sin(arg3)**2 / 3], dtype=complex) return exp_statevector shots = 1000 total_samples = 100 # Set omega_0,omega_d0 (use qubit frequency) -> drive on resonance omega_0 = 2 * np.pi omega_d0 = omega_0 # Set phi = 0 for simplicity phi = 0 # Test pi pulse omega_a = np.pi / total_samples system_model = self._system_model_1Q(omega_0, omega_a, qubit_dim=3) schedule = self._simple_1Q_schedule(phi, total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=shots) backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() statevector = result.get_statevector() exp_statevector = analytic_state_vector(omega_a, total_samples) # Check fidelity of statevectors self.assertGreaterEqual( state_fidelity(statevector, exp_statevector), 0.99) # Test 2*pi pulse omega_a = 2 * np.pi / total_samples system_model = self._system_model_1Q(omega_0, omega_a, qubit_dim=3) schedule = self._simple_1Q_schedule(phi, total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0]], qubit_lo_freq=[omega_d0/(2*np.pi)], memory_slots=2, shots=shots) backend_options = {'seed' : 9000} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result = self.backend_sim.run(qobj, system_model, backend_options).result() statevector = result.get_statevector() exp_statevector = analytic_state_vector(omega_a, total_samples) # Check fidelity of vectors self.assertGreaterEqual( state_fidelity(statevector, exp_statevector), 0.99) @run_cython_and_cpp_solvers def test_interaction(self): r"""Test 2 qubit interaction via swap gates.""" shots = 100000 total_samples = 100 # Do a standard SWAP gate # Interaction amp (any non-zero creates the swap gate) omega_i_swap = np.pi / 2 / total_samples # set omega_d0=omega_0 (resonance) omega_0 = 2 * np.pi omega_d0 = omega_0 # For swapping, set omega_d1 = 0 (drive on Q0 resonance) # Note: confused by this as there is no d1 term omega_d1 = 0 # do pi pulse on Q0 and verify state swaps from '01' to '10' (reverse bit order) # Q0 drive amp -> pi pulse omega_a_pi_swap = np.pi / total_samples system_model = self._system_model_2Q(omega_0, omega_a_pi_swap, omega_i_swap) schedule = self._schedule_2Q_interaction(total_samples) qobj = assemble([schedule], backend=self.backend_sim, meas_level=2, meas_return='single', meas_map=[[0, 1]], qubit_lo_freq=[omega_d0 / (2 * np.pi), omega_d1 / (2 * np.pi)], memory_slots=2, shots=shots) backend_options = {'seed': 12387} backend_options['use_cpp_ode_func'] = True if USE_CPP_ODE_FUNC else False result_pi_swap = self.backend_sim.run(qobj, system_model, backend_options).result() counts_pi_swap = result_pi_swap.get_counts() exp_counts_pi_swap = { '10': shots } # reverse bit order (qiskit convention) self.assertDictAlmostEqual(counts_pi_swap, exp_counts_pi_swap, delta=2) # do pi/2 pulse on Q0 and verify half the counts are '00' and half are swapped state '10' # Q0 drive amp -> pi/2 pulse omega_a_pi2_swap = np.pi / 2 / total_samples system_model = self._system_model_2Q(omega_0, omega_a_pi2_swap, omega_i_swap) result_pi2_swap = self.backend_sim.run(qobj, system_model, backend_options).result() counts_pi2_swap = result_pi2_swap.get_counts() # compare proportions for improved accuracy prop_pi2_swap = {} for key in counts_pi2_swap.keys(): prop_pi2_swap[key] = counts_pi2_swap[key] / shots exp_prop_pi2_swap = {'00': 0.5, '10': 0.5} # reverse bit order self.assertDictAlmostEqual(prop_pi2_swap, exp_prop_pi2_swap, delta=0.01) # Test that no SWAP occurs when omega_i=0 (no interaction) omega_i_no_swap = 0 # Q0 drive amp -> pi pulse omega_a_no_swap = np.pi / total_samples system_model = self._system_model_2Q(omega_0, omega_a_no_swap, omega_i_no_swap) result_no_swap = self.backend_sim.run(qobj, system_model, backend_options).result() counts_no_swap = result_no_swap.get_counts() exp_counts_no_swap = { '01': shots } # non-swapped state (reverse bit order) self.assertDictAlmostEqual(counts_no_swap, exp_counts_no_swap) def _system_model_1Q(self, omega_0, omega_a, qubit_dim=2): """Constructs a simple 1 qubit system model. Args: omega_0 (float): frequency of qubit omega_a (float): strength of drive term qubit_dim (int): dimension of qubit Returns: PulseSystemModel: model for qubit system """ # make Hamiltonian hamiltonian = {} hamiltonian['h_str'] = ['-0.5*omega0*Z0', '0.5*omegaa*X0||D0'] hamiltonian['vars'] = {'omega0': omega_0, 'omegaa': omega_a} hamiltonian['qub'] = {'0': qubit_dim} ham_model = HamiltonianModel.from_dict(hamiltonian) u_channel_lo = [] subsystem_list = [0] dt = 1. return PulseSystemModel(hamiltonian=ham_model, u_channel_lo=u_channel_lo, subsystem_list=subsystem_list, dt=dt) def _system_model_2Q(self, omega_0, omega_a, omega_i, qubit_dim=2): """Constructs a simple 1 qubit system model. Args: omega_0 (float): frequency of qubit omega_a (float): strength of drive term omega_i (float): strength of interaction qubit_dim (int): dimension of qubit Returns: PulseSystemModel: model for qubit system """ # make Hamiltonian hamiltonian = {} # qubit 0 terms hamiltonian['h_str'] = ['-0.5*omega0*Z0', '0.5*omegaa*X0||D0'] # interaction term hamiltonian['h_str'].append('omegai*(Sp0*Sm1+Sm0*Sp1)||U1') hamiltonian['vars'] = { 'omega0': omega_0, 'omegaa': omega_a, 'omegai': omega_i } hamiltonian['qub'] = {'0' : qubit_dim, '1' : qubit_dim} ham_model = HamiltonianModel.from_dict(hamiltonian) u_channel_lo = [[{'q': 0, 'scale': [1.0, 0.0]}], [{'q': 0, 'scale': [-1.0, 0.0]}, {'q': 1, 'scale': [1.0, 0.0]}]] subsystem_list = [0, 1] dt = 1. return PulseSystemModel(hamiltonian=ham_model, u_channel_lo=u_channel_lo, subsystem_list=subsystem_list, dt=dt) def _simple_1Q_schedule(self, phi, total_samples, shape="square", gauss_sigma=0): """Creates schedule for single pulse test Args: phi (float): drive phase (phi in Hamiltonian) total_samples (int): length of pulses shape (str): shape of the pulse; defaults to square pulse gauss_sigma (float): std dev for gaussian pulse if shape=="gaussian" Returns: schedule (pulse schedule): schedule for this test """ # set up pulse command phase = np.exp(1j * phi) drive_pulse = None if shape == "square": const_pulse = np.ones(total_samples) drive_pulse = SamplePulse(phase * const_pulse, name='drive_pulse') if shape == "gaussian": times = 1.0 * np.arange(total_samples) gaussian = np.exp(-times**2 / 2 / gauss_sigma**2) drive_pulse = SamplePulse(phase * gaussian, name='drive_pulse') # set up acquire command acq_cmd = pulse.Acquire(duration=total_samples) # add commands into a schedule for first qubit schedule = pulse.Schedule(name='drive_pulse') schedule |= drive_pulse(DriveChannel(0)) schedule |= acq_cmd(AcquireChannel(0), MemorySlot(0)) << schedule.duration return schedule def _1Q_frame_change_schedule(self, phi, fc_phi, total_samples, dur_drive1, dur_drive2): """Creates schedule for frame change test. Does a pulse w/ phase phi of duration dur_drive1, then frame change of phase fc_phi, then another pulse of phase phi of duration dur_drive2. The different durations for the pulses allow manipulation of rotation angles on Bloch sphere Args: phi (float): drive phase (phi in Hamiltonian) fc_phi (float): phase for frame change total_samples (int): length of pulses dur_drive1 (int): duration of first pulse dur_drive2 (int): duration of second pulse Returns: schedule (pulse schedule): schedule for frame change test """ phase = np.exp(1j * phi) drive_pulse_1 = SamplePulse(phase * np.ones(dur_drive1), name='drive_pulse_1') drive_pulse_2 = SamplePulse(phase * np.ones(dur_drive2), name='drive_pulse_2') # frame change fc_pulse = FrameChange(phase=fc_phi, name='fc') # set up acquire command acq_cmd = pulse.Acquire(duration=total_samples) # add commands to schedule schedule = pulse.Schedule(name='fc_schedule') schedule |= drive_pulse_1(DriveChannel(0)) schedule += fc_pulse(DriveChannel(0)) schedule += drive_pulse_2(DriveChannel(0)) schedule |= acq_cmd(AcquireChannel(0), MemorySlot(0)) << schedule.duration return schedule def _analytic_prop_1q_gates(self, total_samples, omega_0, omega_a, omega_d0, phi): """Compute proportion for 0 and 1 states analytically for single qubit gates. Args: total_samples (int): length of pulses omega_0 (float): Q0 freq omega_a (float): Q0 drive amplitude omega_d0 (flaot): Q0 drive frequency phi (float): drive phase Returns: exp_prop (dict): expected value of 0 and 1 proportions from analytic computation """ time = total_samples # write Hrot analytically h_rot = np.array([[ (omega_d0 - omega_0) / 2, np.exp(1j * phi) * omega_a / 2 ], [np.exp(-1j * phi) * omega_a / 2, -(omega_d0 - omega_0) / 2]]) # exponentiate u_rot = expm(-1j * h_rot * time) state0 = np.array([1, 0]) # compute analytic prob (proportion) of 0 state mat_elem0 = np.vdot(state0, np.dot(u_rot, state0)) prop0 = np.abs(mat_elem0)**2 # return expected proportion exp_prop = {'0': prop0, '1': 1 - prop0} return exp_prop def _analytic_gaussian_statevector(self, total_samples, gauss_sigma, omega_a): r"""Computes analytic statevector for gaussian drive. Solving the Schrodinger equation in the rotating frame leads to the analytic solution `(\cos(x), -i\sin(x)) with `x = \frac{1}{2}\sqrt{\frac{\pi}{2}}\sigma\omega_a erf(\frac{t}{\sqrt{2}\sigma}). Args: total_samples (int): length of pulses gauss_sigma (float): std dev for the gaussian drive omega_a (float): Q0 drive amplitude Returns: exp_statevector (list): analytic form of the statevector computed for gaussian drive (Returned in the rotating frame) """ time = total_samples arg = 1 / 2 * np.sqrt(np.pi / 2) * gauss_sigma * omega_a * erf( time / np.sqrt(2) / gauss_sigma) exp_statevector = [np.cos(arg), -1j * np.sin(arg)] return exp_statevector def _schedule_2Q_interaction(self, total_samples): """Creates schedule for testing two qubit interaction. Specifically, do a pi pulse on qub 0 so it starts in the `1` state (drive channel) and then apply constant pulses to each qubit (on control channel 1). This will allow us to test a swap gate. Args: total_samples (int): length of pulses Returns: schedule (pulse schedule): schedule for 2q experiment """ # set up const pulse const_pulse = SamplePulse(np.ones(total_samples), name='const_pulse') # set u channel uchannel = 1 # gives omega1-omega0 (we will set equal, so don't need negation) # add commands to schedule schedule = pulse.Schedule(name='2q_schedule') schedule |= const_pulse(DriveChannel(0)) # pi pulse drive schedule += const_pulse(ControlChannel(uchannel)) << schedule.duration # u chan pulse acq_cmd = pulse.Acquire(duration=total_samples) acq_sched = acq_cmd(AcquireChannel(0), MemorySlot(0)) acq_sched += acq_cmd(AcquireChannel(1), MemorySlot(1)) schedule |= acq_sched << schedule.duration return schedule if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_qasm_simulator.py000066400000000000000000000124261362723322000241110ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ import unittest from test.terra import common # Basic circuit instruction tests from test.terra.backends.qasm_simulator.qasm_reset import QasmResetTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMeasureTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMultiQubitMeasureTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTests from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_unitary_gate import QasmUnitaryGateTests from test.terra.backends.qasm_simulator.qasm_initialize import QasmInitializeTests # Conditional instruction tests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalGateTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalUnitaryTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalKrausTests # Algorithm circuit tests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsMinimalBasis # Noise model simulation tests from test.terra.backends.qasm_simulator.qasm_noise import QasmReadoutNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmPauliNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmResetNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmKrausNoiseTests # Snapshot tests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStatevectorTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotDensityMatrixTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStabilizerTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotProbabilitiesTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValPauliTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValMatrixTests # Other tests from test.terra.backends.qasm_simulator.qasm_method import QasmMethodTests from test.terra.backends.qasm_simulator.qasm_thread_management import QasmThreadManagementTests from test.terra.backends.qasm_simulator.qasm_fusion import QasmFusionTests from test.terra.backends.qasm_simulator.qasm_delay_measure import QasmDelayMeasureTests from test.terra.backends.qasm_simulator.qasm_truncate import QasmQubitsTruncateTests from test.terra.backends.qasm_simulator.qasm_basics import QasmBasicsTests class TestQasmSimulator(common.QiskitAerTestCase, QasmMethodTests, QasmMeasureTests, QasmMultiQubitMeasureTests, QasmResetTests, QasmInitializeTests, QasmConditionalGateTests, QasmConditionalUnitaryTests, QasmConditionalKrausTests, QasmCliffordTests, QasmCliffordTestsWaltzBasis, QasmCliffordTestsMinimalBasis, QasmNonCliffordTests, QasmNonCliffordTestsWaltzBasis, QasmNonCliffordTestsMinimalBasis, QasmAlgorithmTests, QasmAlgorithmTestsWaltzBasis, QasmAlgorithmTestsMinimalBasis, QasmUnitaryGateTests, QasmReadoutNoiseTests, QasmPauliNoiseTests, QasmThreadManagementTests, QasmFusionTests, QasmDelayMeasureTests, QasmQubitsTruncateTests, QasmResetNoiseTests, QasmKrausNoiseTests, QasmBasicsTests, QasmSnapshotStatevectorTests, QasmSnapshotDensityMatrixTests, QasmSnapshotProbabilitiesTests, QasmSnapshotExpValPauliTests, QasmSnapshotExpValMatrixTests, QasmSnapshotStabilizerTests): """QasmSimulator automatic method tests.""" BACKEND_OPTS = { "seed_simulator": 2113 } if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_qasm_simulator_density_matrix.py000066400000000000000000000120131362723322000272240ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ import unittest from test.terra import common from test.terra.decorators import requires_method # Basic circuit instruction tests from test.terra.backends.qasm_simulator.qasm_reset import QasmResetTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMeasureTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMultiQubitMeasureTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTests from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_unitary_gate import QasmUnitaryGateTests # Conditional instruction tests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalGateTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalUnitaryTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalKrausTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalSuperOpTests # Algorithm circuit tests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsMinimalBasis # Noise model simulation tests from test.terra.backends.qasm_simulator.qasm_noise import QasmReadoutNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmPauliNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmResetNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmKrausNoiseTests # Other tests from test.terra.backends.qasm_simulator.qasm_method import QasmMethodTests # Snapshot tests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStatevectorTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotDensityMatrixTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStabilizerTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotProbabilitiesTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValPauliTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValMatrixTests class DensityMatrixTests( QasmMethodTests, QasmMeasureTests, QasmMultiQubitMeasureTests, QasmResetTests, QasmConditionalGateTests, QasmConditionalUnitaryTests, QasmConditionalKrausTests, QasmConditionalSuperOpTests, QasmCliffordTests, QasmCliffordTestsWaltzBasis, QasmCliffordTestsMinimalBasis, QasmNonCliffordTests, QasmNonCliffordTestsWaltzBasis, QasmNonCliffordTestsMinimalBasis, QasmAlgorithmTests, QasmAlgorithmTestsWaltzBasis, QasmAlgorithmTestsMinimalBasis, QasmUnitaryGateTests, QasmReadoutNoiseTests, QasmPauliNoiseTests, QasmResetNoiseTests, QasmKrausNoiseTests, QasmSnapshotStatevectorTests, QasmSnapshotDensityMatrixTests, QasmSnapshotProbabilitiesTests, QasmSnapshotExpValPauliTests, QasmSnapshotExpValMatrixTests, QasmSnapshotStabilizerTests): """Container class of density_matrix method tests.""" pass class TestQasmSimulatorDensityMatrix(common.QiskitAerTestCase, DensityMatrixTests): """QasmSimulator density_matrix method tests.""" BACKEND_OPTS = {"seed_simulator": 314159, "method": "density_matrix"} @requires_method("qasm_simulator", "density_matrix_gpu") class TestQasmSimulatorDensityMatrixThrustGPU(common.QiskitAerTestCase, DensityMatrixTests): """QasmSimulator density_matrix_gpu method tests.""" BACKEND_OPTS = {"seed_simulator": 314159, "method": "density_matrix_gpu"} @requires_method("qasm_simulator", "density_matrix_thrust") class TestQasmSimulatorDensityMatrixThrustCPU(common.QiskitAerTestCase, DensityMatrixTests): """QasmSimulator density_matrix_thrust method tests.""" BACKEND_OPTS = { "seed_simulator": 314159, "method": "density_matrix_thrust" } if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_qasm_simulator_extended_stabilizer.py000066400000000000000000000652251362723322000302260ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ ExtendedStabilizer Integration Tests """ import unittest import logging from test.terra import common from test.terra.reference import ref_measure from test.terra.reference import ref_reset from test.terra.reference import ref_conditionals from test.terra.reference import ref_1q_clifford from test.terra.reference import ref_2q_clifford from test.terra.reference import ref_non_clifford from test.terra.reference import ref_algorithms from qiskit.compiler import assemble from qiskit.providers.aer import QasmSimulator logger = logging.getLogger(__name__) class TestQasmExtendedStabilizerSimulator(common.QiskitAerTestCase): """QasmSimulator extended_stabilizer method tests.""" BACKEND_OPTS = { "seed_simulator": 1984, "method": "extended_stabilizer" } BACKEND_OPTS_SAMPLING = { "seed_simulator": 1984, "method": "extended_stabilizer", "extended_stabilizer_measure_sampling": True } # --------------------------------------------------------------------- # Test reset # --------------------------------------------------------------------- def test_reset_deterministic(self): """Test ExtendedStabilizer reset with for circuits with deterministic counts""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 100 circuits = ref_reset.reset_circuits_deterministic(final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_reset.reset_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_reset_nondeterministic(self): """Test ExtendedStabilizer reset with for circuits with non-deterministic counts""" # For statevector output we can combine deterministic and non-deterministic # count output circuits shots = 2000 circuits = ref_reset.reset_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_reset.reset_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # # --------------------------------------------------------------------- # # Test measure # # --------------------------------------------------------------------- def test_measure_deterministic_with_sampling(self): """Test ExtendedStabilizer measure with deterministic counts with sampling""" shots = 100 circuits = ref_measure.measure_circuits_deterministic( allow_sampling=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_measure.measure_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_measure_deterministic_without_sampling(self): """Test ExtendedStabilizer measure with deterministic counts without sampling""" shots = 100 circuits = ref_measure.measure_circuits_deterministic( allow_sampling=False) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_measure.measure_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_measure_nondeterministic_with_sampling(self): """Test CHimulator measure with non-deterministic counts with sampling""" shots = 2000 circuits = ref_measure.measure_circuits_nondeterministic( allow_sampling=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_measure.measure_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_measure_nondeterministic_without_sampling(self): """Test CHimulator measure with non-deterministic counts without sampling""" shots = 2000 circuits = ref_measure.measure_circuits_nondeterministic( allow_sampling=False) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_measure.measure_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # # --------------------------------------------------------------------- # # Test multi-qubit measure qobj instruction # # --------------------------------------------------------------------- def test_measure_deterministic_multi_qubit_with_sampling(self): """Test ExtendedStabilizer multi-qubit measure with deterministic counts with sampling""" shots = 100 circuits = ref_measure.multiqubit_measure_circuits_deterministic( allow_sampling=True) targets = ref_measure.multiqubit_measure_counts_deterministic(shots) qobj = assemble(circuits, QasmSimulator(), shots=shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_measure_deterministic_multi_qubit_without_sampling(self): """Test ExtendedStabilizer multi-qubit measure with deterministic counts without sampling""" shots = 100 circuits = ref_measure.multiqubit_measure_circuits_deterministic( allow_sampling=False) targets = ref_measure.multiqubit_measure_counts_deterministic(shots) qobj = assemble(circuits, QasmSimulator(), shots=shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_measure_nondeterministic_multi_qubit_with_sampling(self): """Test CHimulator reset with non-deterministic counts""" shots = 2000 circuits = ref_measure.multiqubit_measure_circuits_nondeterministic( allow_sampling=True) targets = ref_measure.multiqubit_measure_counts_nondeterministic(shots) qobj = assemble(circuits, QasmSimulator(), shots=shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_measure_nondeterministic_multi_qubit_without_sampling(self): """Test CHimulator reset with non-deterministic counts""" shots = 2000 circuits = ref_measure.multiqubit_measure_circuits_nondeterministic( allow_sampling=False) targets = ref_measure.multiqubit_measure_counts_nondeterministic(shots) qobj = assemble(circuits, QasmSimulator(), shots=shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # # --------------------------------------------------------------------- # # Test conditional # # --------------------------------------------------------------------- def test_conditional_1bit(self): """Test conditional operations on 1-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_1bit( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_conditionals.conditional_counts_1bit(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_conditional_2bit(self): """Test conditional operations on 2-bit conditional register.""" shots = 100 circuits = ref_conditionals.conditional_circuits_2bit( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_conditionals.conditional_counts_2bit(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test h-gate # --------------------------------------------------------------------- def test_h_gate_deterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.h_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_h_gate_nondeterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.h_gate_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test x-gate # --------------------------------------------------------------------- def test_x_gate_deterministic_default_basis_gates(self): """Test x-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.x_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test z-gate # --------------------------------------------------------------------- def test_z_gate_deterministic_default_basis_gates(self): """Test z-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.z_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test y-gate # --------------------------------------------------------------------- def test_y_gate_deterministic_default_basis_gates(self): """Test y-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.y_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) # --------------------------------------------------------------------- # Test s-gate # --------------------------------------------------------------------- def test_s_gate_deterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.s_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_s_gate_nondeterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.s_gate_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test sdg-gate # --------------------------------------------------------------------- def test_sdg_gate_deterministic_default_basis_gates(self): """Test sdg-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.sdg_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_sdg_gate_nondeterministic_default_basis_gates(self): shots = 2000 """Test sdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_1q_clifford.sdg_gate_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cx-gate # --------------------------------------------------------------------- def test_cx_gate_deterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_2q_clifford.cx_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cx_gate_nondeterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_2q_clifford.cx_gate_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test cz-gate # --------------------------------------------------------------------- def test_cz_gate_deterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_2q_clifford.cz_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_cz_gate_nondeterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_2q_clifford.cz_gate_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test swap-gate # --------------------------------------------------------------------- def test_swap_gate_deterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_2q_clifford.swap_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0) def test_swap_gate_nondeterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" shots = 2000 circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_2q_clifford.swap_gate_counts_nondeterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS_SAMPLING) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) # --------------------------------------------------------------------- # Test t-gate # --------------------------------------------------------------------- def test_t_gate_deterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_non_clifford.t_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) def test_t_gate_nondeterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" shots = 500 circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_non_clifford.t_gate_counts_nondeterministic(shots) opts = self.BACKEND_OPTS.copy() opts["extended_stabilizer_mixing_time"] = 50 job = QasmSimulator().run(qobj, backend_options=opts) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) # --------------------------------------------------------------------- # Test tdg-gate # --------------------------------------------------------------------- def test_tdg_gate_deterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_non_clifford.tdg_gate_counts_deterministic(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) def test_tdg_gate_nondeterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" shots = 500 circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_non_clifford.tdg_gate_counts_nondeterministic(shots) opts = self.BACKEND_OPTS.copy() opts["extended_stabilizer_mixing_time"] = 50 job = QasmSimulator().run(qobj, backend_options=opts) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) # --------------------------------------------------------------------- # Test ccx-gate # --------------------------------------------------------------------- def test_ccx_gate_deterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" shots = 100 circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_non_clifford.ccx_gate_counts_deterministic(shots) opts = self.BACKEND_OPTS.copy() opts["extended_stabilizer_mixing_time"] = 100 job = QasmSimulator().run(qobj, backend_options=opts) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) def test_ccx_gate_nondeterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" shots = 500 circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_non_clifford.ccx_gate_counts_nondeterministic(shots) opts = self.BACKEND_OPTS.copy() opts["extended_stabilizer_mixing_time"] = 100 job = QasmSimulator().run(qobj, backend_options=opts) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.10 * shots) # # --------------------------------------------------------------------- # # Test algorithms # # --------------------------------------------------------------------- def test_grovers_default_basis_gates(self): """Test grovers circuits compiling to backend default basis_gates.""" shots = 500 circuits = ref_algorithms.grovers_circuit( final_measure=True, allow_sampling=True) qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_algorithms.grovers_counts(shots) opts = self.BACKEND_OPTS.copy() opts["extended_stabilizer_mixing_time"] = 100 job = QasmSimulator().run(qobj, backend_options=opts) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.1 * shots) def test_teleport_default_basis_gates(self): """Test teleport circuits compiling to backend default basis_gates.""" shots = 1000 circuits = ref_algorithms.teleport_circuit() qobj = assemble(circuits, QasmSimulator(), shots=shots) targets = ref_algorithms.teleport_counts(shots) job = QasmSimulator().run(qobj, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, circuits, targets, delta=0.05 * shots) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_qasm_simulator_matrix_product_state.py000066400000000000000000000103451362723322000304330ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator matrix product state method integration tests """ import unittest from test.terra import common # Basic circuit instruction tests from test.terra.backends.qasm_simulator.qasm_reset import QasmResetTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMeasureTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMultiQubitMeasureTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTests from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_unitary_gate import QasmUnitaryGateTests from test.terra.backends.qasm_simulator.qasm_initialize import QasmInitializeTests # Conditional instruction tests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalGateTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalUnitaryTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalKrausTests # Algorithm circuit tests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsMinimalBasis # Noise model simulation tests from test.terra.backends.qasm_simulator.qasm_noise import QasmReadoutNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmPauliNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmResetNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmKrausNoiseTests # Snapshot tests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStatevectorTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStabilizerTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotProbabilitiesTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValPauliTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValMatrixTests # Other tests from test.terra.backends.qasm_simulator.qasm_method import QasmMethodTests class TestQasmMatrixProductStateSimulator( common.QiskitAerTestCase, #QasmMethodTests, # FAILING: Not implemented yet QasmMeasureTests, QasmMultiQubitMeasureTests, QasmResetTests, QasmConditionalGateTests, QasmConditionalUnitaryTests, QasmCliffordTests, QasmCliffordTestsWaltzBasis, QasmCliffordTestsMinimalBasis, QasmNonCliffordTests, QasmNonCliffordTestsWaltzBasis, QasmNonCliffordTestsMinimalBasis, QasmAlgorithmTests, QasmAlgorithmTestsWaltzBasis, QasmAlgorithmTestsMinimalBasis, QasmUnitaryGateTests, #QasmInitializeTests, # THROWS: uncaught exception QasmReadoutNoiseTests, QasmPauliNoiseTests, QasmResetNoiseTests, QasmSnapshotStatevectorTests, QasmSnapshotProbabilitiesTests, QasmSnapshotStabilizerTests, QasmSnapshotExpValPauliTests, QasmSnapshotExpValMatrixTests, ): """QasmSimulator matrix product state method tests.""" BACKEND_OPTS = { "seed_simulator": 314159, "method": "matrix_product_state", "max_parallel_threads": 1 } if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_qasm_simulator_stabilizer.py000066400000000000000000000062721362723322000263430ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ import unittest from test.terra import common # Basic circuit instruction tests from test.terra.backends.qasm_simulator.qasm_reset import QasmResetTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMeasureTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMultiQubitMeasureTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTests # Conditional instruction tests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalGateTests # Algorithm circuit tests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTests # Noise model simulation tests from test.terra.backends.qasm_simulator.qasm_noise import QasmReadoutNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmPauliNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmResetNoiseTests # Snapshot tests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStatevectorTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotDensityMatrixTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStabilizerTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotProbabilitiesTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValPauliTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValMatrixTests # Other tests from test.terra.backends.qasm_simulator.qasm_method import QasmMethodTests class TestQasmStabilizerSimulator(common.QiskitAerTestCase, QasmMethodTests, QasmMeasureTests, QasmMultiQubitMeasureTests, QasmResetTests, QasmConditionalGateTests, QasmCliffordTests, QasmAlgorithmTests, QasmReadoutNoiseTests, QasmResetNoiseTests, QasmPauliNoiseTests, QasmSnapshotStatevectorTests, QasmSnapshotDensityMatrixTests, QasmSnapshotProbabilitiesTests, QasmSnapshotExpValPauliTests, QasmSnapshotExpValMatrixTests, QasmSnapshotStabilizerTests): """QasmSimulator stabilizer method tests.""" BACKEND_OPTS = { "seed_simulator": 1337, "method": "stabilizer" } if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_qasm_simulator_statevector.py000066400000000000000000000126551362723322000265400ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator Integration Tests """ import unittest from test.terra import common from test.terra.decorators import requires_method # Basic circuit instruction tests from test.terra.backends.qasm_simulator.qasm_reset import QasmResetTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMeasureTests from test.terra.backends.qasm_simulator.qasm_measure import QasmMultiQubitMeasureTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTests from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_cliffords import QasmCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTests from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_noncliffords import QasmNonCliffordTestsMinimalBasis from test.terra.backends.qasm_simulator.qasm_unitary_gate import QasmUnitaryGateTests from test.terra.backends.qasm_simulator.qasm_initialize import QasmInitializeTests # Conditional instruction tests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalGateTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalUnitaryTests from test.terra.backends.qasm_simulator.qasm_conditional import QasmConditionalKrausTests # Algorithm circuit tests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTests from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsWaltzBasis from test.terra.backends.qasm_simulator.qasm_algorithms import QasmAlgorithmTestsMinimalBasis # Noise model simulation tests from test.terra.backends.qasm_simulator.qasm_noise import QasmReadoutNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmPauliNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmResetNoiseTests from test.terra.backends.qasm_simulator.qasm_noise import QasmKrausNoiseTests # Snapshot tests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStatevectorTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotDensityMatrixTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotStabilizerTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotProbabilitiesTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValPauliTests from test.terra.backends.qasm_simulator.qasm_snapshot import QasmSnapshotExpValMatrixTests # Other tests from test.terra.backends.qasm_simulator.qasm_method import QasmMethodTests from test.terra.backends.qasm_simulator.qasm_thread_management import QasmThreadManagementTests from test.terra.backends.qasm_simulator.qasm_fusion import QasmFusionTests from test.terra.backends.qasm_simulator.qasm_delay_measure import QasmDelayMeasureTests from test.terra.backends.qasm_simulator.qasm_truncate import QasmQubitsTruncateTests from test.terra.backends.qasm_simulator.qasm_basics import QasmBasicsTests class StatevectorTests( QasmMethodTests, QasmMeasureTests, QasmMultiQubitMeasureTests, QasmResetTests, QasmInitializeTests, QasmConditionalGateTests, QasmConditionalUnitaryTests, QasmConditionalKrausTests, QasmCliffordTests, QasmCliffordTestsWaltzBasis, QasmCliffordTestsMinimalBasis, QasmNonCliffordTests, QasmNonCliffordTestsWaltzBasis, QasmNonCliffordTestsMinimalBasis, QasmAlgorithmTests, QasmAlgorithmTestsWaltzBasis, QasmAlgorithmTestsMinimalBasis, QasmUnitaryGateTests, QasmReadoutNoiseTests, QasmPauliNoiseTests, QasmThreadManagementTests, QasmFusionTests, QasmDelayMeasureTests, QasmQubitsTruncateTests, QasmResetNoiseTests, QasmKrausNoiseTests, QasmBasicsTests, QasmSnapshotStatevectorTests, QasmSnapshotDensityMatrixTests, QasmSnapshotProbabilitiesTests, QasmSnapshotExpValPauliTests, QasmSnapshotExpValMatrixTests, QasmSnapshotStabilizerTests): """Container class of statevector method tests.""" pass class TestQasmSimulatorStatevector(common.QiskitAerTestCase, StatevectorTests): """QasmSimulator statevector method tests.""" BACKEND_OPTS = {"seed_simulator": 271828, "method": "statevector"} @requires_method("qasm_simulator", "statevector_gpu") class TestQasmSimulatorStatevectorThrustGPU(common.QiskitAerTestCase, StatevectorTests): """QasmSimulator statevector_gpu method tests.""" BACKEND_OPTS = {"seed_simulator": 271828, "method": "statevector_gpu"} @requires_method("qasm_simulator", "statevector_thrust") class TestQasmSimulatorStatevectorThrustCPU(common.QiskitAerTestCase, StatevectorTests): """QasmSimulator statevector_thrust method tests.""" BACKEND_OPTS = {"seed_simulator": 271828, "method": "statevector_thrust"} if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_statevector_simulator.py000066400000000000000000000032221362723322000255050ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ StatevectorSimulator Integration Tests """ import unittest from test.terra import common from test.terra.decorators import requires_method # Basic circuit instruction tests from test.terra.backends.statevector_simulator.statevector_basics import StatevectorSimulatorTests class TestStatevectorSimulator(common.QiskitAerTestCase, StatevectorSimulatorTests): """StatevectorSimulator automatic method tests.""" BACKEND_OPTS = {"seed_simulator": 10598} @requires_method("statevector_simulator", "statevector_gpu") class TestStatevectorSimulatorThrustGPU(common.QiskitAerTestCase, StatevectorSimulatorTests): """StatevectorSimulator automatic method tests.""" BACKEND_OPTS = {"seed_simulator": 10598, "method": "statevector_gpu"} @requires_method("statevector_simulator", "statevector_thrust") class TestStatevectorSimulatorThrustCPU(common.QiskitAerTestCase, StatevectorSimulatorTests): """StatevectorSimulator automatic method tests.""" BACKEND_OPTS = {"seed_simulator": 10598, "method": "statevector_thrust"} if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/test_unitary_simulator.py000066400000000000000000000030431362723322000246360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ UnitarySimulator Integration Tests """ import unittest from test.terra import common from test.terra.decorators import requires_method # Basic circuit instruction tests from test.terra.backends.unitary_simulator.unitary_basics import UnitarySimulatorTests class TestUnitarySimulator(common.QiskitAerTestCase, UnitarySimulatorTests): """UnitarySimulator automatic method tests.""" BACKEND_OPTS = {"seed_simulator": 2113} @requires_method("unitary_simulator", "unitary_gpu") class TestUnitarySimulatorThrustGPU(common.QiskitAerTestCase, UnitarySimulatorTests): """UnitarySimulator unitary_gpu method tests.""" BACKEND_OPTS = {"seed_simulator": 2113, "method": "unitary_gpu"} @requires_method("unitary_simulator", "unitary_thrust") class TestUnitarySimulatorThrustCPU(common.QiskitAerTestCase, UnitarySimulatorTests): """UnitarySimulator unitary_thrust method tests.""" BACKEND_OPTS = {"seed_simulator": 2113, "method": "unitary_thrust"} if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/backends/unitary_simulator/000077500000000000000000000000001362723322000232255ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/backends/unitary_simulator/unitary_basics.py000066400000000000000000001540661362723322000266320ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ UnitarySimulator Integration Tests """ import unittest from test.terra import common from test.terra.reference import ref_1q_clifford from test.terra.reference import ref_2q_clifford from test.terra.reference import ref_non_clifford from test.terra.reference import ref_unitary_gate from qiskit import execute from qiskit.providers.aer import UnitarySimulator class UnitarySimulatorTests: """UnitarySimulator tests.""" SIMULATOR = UnitarySimulator() BACKEND_OPTS = {} # --------------------------------------------------------------------- # Test h-gate # --------------------------------------------------------------------- def test_h_gate_deterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.h_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_h_gate_deterministic_waltz_basis_gates(self): """Test h-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.h_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_h_gate_deterministic_minimal_basis_gates(self): """Test h-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.h_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_h_gate_nondeterministic_default_basis_gates(self): """Test h-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.h_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_h_gate_nondeterministic_waltz_basis_gates(self): """Test h-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.h_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_h_gate_nondeterministic_minimal_basis_gates(self): """Test h-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.h_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.h_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test x-gate # --------------------------------------------------------------------- def test_x_gate_deterministic_default_basis_gates(self): """Test x-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.x_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_x_gate_deterministic_waltz_basis_gates(self): """Test x-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.x_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_x_gate_deterministic_minimal_basis_gates(self): """Test x-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.x_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.x_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test z-gate # --------------------------------------------------------------------- def test_z_gate_deterministic_default_basis_gates(self): """Test z-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.z_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_z_gate_deterministic_waltz_basis_gates(self): """Test z-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.z_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_z_gate_deterministic_minimal_basis_gates(self): """Test z-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.z_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.z_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test y-gate # --------------------------------------------------------------------- def test_y_gate_deterministic_default_basis_gates(self): """Test y-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.y_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_y_gate_deterministic_waltz_basis_gates(self): """Test y-gate gate circuits compiling to u1,u2,u3,cx.""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.y_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_y_gate_deterministic_minimal_basis_gates(self): """Test y-gate gate circuits compiling to u3, cx.""" circuits = ref_1q_clifford.y_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.y_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test s-gate # --------------------------------------------------------------------- def test_s_gate_deterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.s_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_s_gate_deterministic_waltz_basis_gates(self): """Test s-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.s_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_s_gate_deterministic_minimal_basis_gates(self): """Test s-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.s_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_s_gate_nondeterministic_default_basis_gates(self): """Test s-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.s_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_s_gate_nondeterministic_waltz_basis_gates(self): """Test s-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.s_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_s_gate_nondeterministic_minimal_basis_gates(self): """Test s-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.s_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.s_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test sdg-gate # --------------------------------------------------------------------- def test_sdg_gate_deterministic_default_basis_gates(self): """Test sdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_sdg_gate_deterministic_waltz_basis_gates(self): """Test sdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_sdg_gate_deterministic_minimal_basis_gates(self): """Test sdg-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_deterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_sdg_gate_nondeterministic_default_basis_gates(self): """Test sdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_sdg_gate_nondeterministic_waltz_basis_gates(self): """Test sdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_sdg_gate_nondeterministic_minimal_basis_gates(self): """Test sdg-gate gate circuits compiling to u3,cx""" circuits = ref_1q_clifford.sdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_1q_clifford.sdg_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cx-gate # --------------------------------------------------------------------- def test_cx_gate_deterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cx_gate_deterministic_waltz_basis_gates(self): """Test cx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cx_gate_deterministic_minimal_basis_gates(self): """Test cx-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cx_gate_nondeterministic_default_basis_gates(self): """Test cx-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cx_gate_nondeterministic_waltz_basis_gates(self): """Test cx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cx_gate_nondeterministic_minimal_basis_gates(self): """Test cx-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cx_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cx_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cz-gate # --------------------------------------------------------------------- def test_cz_gate_deterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cz_gate_deterministic_waltz_basis_gates(self): """Test cz-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cz_gate_deterministic_minimal_basis_gates(self): """Test cz-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cz_gate_nondeterministic_default_basis_gates(self): """Test cz-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cz_gate_nondeterministic_waltz_basis_gates(self): """Test cz-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cz_gate_nondeterministic_minimal_basis_gates(self): """Test cz-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.cz_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.cz_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cu1 gate # --------------------------------------------------------------------- def test_cu1_gate_nondeterministic_default_basis_gates(self): """Test cu1-gate gate circuits compiling to default basis""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cu1_gate_nondeterministic_waltz_basis_gates(self): """Test cu1-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cu1_gate_nondeterministic_minimal_basis_gates(self): """"Test cu1-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cu3 gate # --------------------------------------------------------------------- def test_cu3_gate_deterministic_default_basis_gates(self): """Test cu3-gate gate circuits compiling to default basis""" circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cu3_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cu3_gate_deterministic_waltz_basis_gates(self): """Test cu3-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cu3_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cu3_gate_deterministic_minimal_basis_gates(self): """"Test cu3-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cu3_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cu3_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cswap gate # --------------------------------------------------------------------- def test_cswap_gate_deterministic_default_basis_gates(self): """Test cswap-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary( result, circuits, targets ) # --------------------------------------------------------------------- # Test swap-gate # --------------------------------------------------------------------- def test_swap_gate_deterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_swap_gate_deterministic_waltz_basis_gates(self): """Test swap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_swap_gate_deterministic_minimal_basis_gates(self): """Test swap-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_deterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_swap_gate_nondeterministic_default_basis_gates(self): """Test swap-gate circuits compiling to backend default basis_gates.""" circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_swap_gate_nondeterministic_waltz_basis_gates(self): """Test swap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_swap_gate_nondeterministic_minimal_basis_gates(self): """Test swap-gate gate circuits compiling to u3,cx""" circuits = ref_2q_clifford.swap_gate_circuits_nondeterministic( final_measure=False) targets = ref_2q_clifford.swap_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test t-gate # --------------------------------------------------------------------- def test_t_gate_deterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.t_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_t_gate_deterministic_waltz_basis_gates(self): """Test t-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.t_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_t_gate_deterministic_minimal_basis_gates(self): """Test t-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.t_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.t_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_t_gate_nondeterministic_default_basis_gates(self): """Test t-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.t_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_t_gate_nondeterministic_waltz_basis_gates(self): """Test t-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.t_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_t_gate_nondeterministic_minimal_basis_gates(self): """Test t-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.t_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.t_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test tdg-gate # --------------------------------------------------------------------- def test_tdg_gate_deterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_tdg_gate_deterministic_waltz_basis_gates(self): """Test tdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_tdg_gate_deterministic_minimal_basis_gates(self): """Test tdg-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_tdg_gate_nondeterministic_default_basis_gates(self): """Test tdg-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_tdg_gate_nondeterministic_waltz_basis_gates(self): """Test tdg-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_tdg_gate_nondeterministic_minimal_basis_gates(self): """Test tdg-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.tdg_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.tdg_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test ccx-gate # --------------------------------------------------------------------- def test_ccx_gate_deterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_ccx_gate_deterministic_waltz_basis_gates(self): """Test ccx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_ccx_gate_deterministic_minimal_basis_gates(self): """Test ccx-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_ccx_gate_nondeterministic_default_basis_gates(self): """Test ccx-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_ccx_gate_nondeterministic_waltz_basis_gates(self): """Test ccx-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_ccx_gate_nondeterministic_minimal_basis_gates(self): """Test ccx-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.ccx_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.ccx_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test unitary gate qobj instruction # --------------------------------------------------------------------- def test_unitary_gate(self): """Test simulation with unitary gate circuit instructions.""" circuits = ref_unitary_gate.unitary_gate_circuits_deterministic( final_measure=False) targets = ref_unitary_gate.unitary_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cswap-gate (Fredkin) # --------------------------------------------------------------------- def test_cswap_gate_deterministic_default_basis_gates(self): """Test cswap-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) # --------------------------------------------------------------------- # Test cu1 gate # --------------------------------------------------------------------- def test_cu1_gate_nondeterministic_waltz_basis_gates(self): """Test cu1-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cswap_gate_deterministic_minimal_basis_gates(self): """Test cswap-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cu1_gate_nondeterministic_minimal_basis_gates(self): """"Test cu1-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cswap_gate_deterministic_waltz_basis_gates(self): """Test cswap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_deterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_deterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cswap_gate_nondeterministic_default_basis_gates(self): """Test cswap-gate circuits compiling to backend default basis_gates.""" circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cu1_gate_nondeterministic_default_basis_gates(self): """Test cu1-gate gate circuits compiling to default basis""" circuits = ref_non_clifford.cu1_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cu1_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cswap_gate_nondeterministic_minimal_basis_gates(self): """Test cswap-gate gate circuits compiling to u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) def test_cswap_gate_nondeterministic_waltz_basis_gates(self): """Test cswap-gate gate circuits compiling to u1,u2,u3,cx""" circuits = ref_non_clifford.cswap_gate_circuits_nondeterministic( final_measure=False) targets = ref_non_clifford.cswap_gate_unitary_nondeterministic() job = execute(circuits, self.SIMULATOR, shots=1, basis_gates=['u1', 'u2', 'u3', 'cx'], backend_options=self.BACKEND_OPTS) result = job.result() self.assertTrue(getattr(result, 'success', False)) self.compare_unitary(result, circuits, targets) qiskit-aer-0.4.1/test/terra/common.py000066400000000000000000000367721362723322000175420ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Shared functionality and helpers for the unit tests. """ from enum import Enum import inspect import logging import os import unittest from unittest.util import safe_repr from itertools import repeat from random import choice, sample from math import pi import numpy as np from numpy.linalg import norm from qiskit.quantum_info import state_fidelity from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer import __path__ as main_path class Path(Enum): """Helper with paths commonly used during the tests.""" MAIN = main_path[0] TEST = os.path.dirname(__file__) # Examples path: examples/ EXAMPLES = os.path.join(MAIN, '../examples') class QiskitAerTestCase(unittest.TestCase): """Helper class that contains common functionality.""" @classmethod def setUpClass(cls): cls.moduleName = os.path.splitext(inspect.getfile(cls))[0] cls.log = logging.getLogger(cls.__name__) # Set logging to file and stdout if the LOG_LEVEL environment variable # is set. if os.getenv('LOG_LEVEL'): # Set up formatter. log_fmt = ('{}.%(funcName)s:%(levelname)s:%(asctime)s:' ' %(message)s'.format(cls.__name__)) formatter = logging.Formatter(log_fmt) # Set up the file handler. log_file_name = '%s.log' % cls.moduleName file_handler = logging.FileHandler(log_file_name) file_handler.setFormatter(formatter) cls.log.addHandler(file_handler) # Set the logging level from the environment variable, defaulting # to INFO if it is not a valid level. level = logging._nameToLevel.get(os.getenv('LOG_LEVEL'), logging.INFO) cls.log.setLevel(level) @staticmethod def _get_resource_path(filename, path=Path.TEST): """ Get the absolute path to a resource. Args: filename (string): filename or relative path to the resource. path (Path): path used as relative to the filename. Returns: str: the absolute path to the resource. """ return os.path.normpath(os.path.join(path.value, filename)) def assertNoLogs(self, logger=None, level=None): """ Context manager to test that no message is sent to the specified logger and level (the opposite of TestCase.assertLogs()). """ # pylint: disable=invalid-name return _AssertNoLogsContext(self, logger, level) def check_position(self, obj, items, precision=15): """Return position of numeric object in a list.""" for pos, item in enumerate(items): # Try numeric difference first try: delta = round(np.linalg.norm(np.array(obj) - np.array(item)), precision) if delta == 0: return pos # If objects aren't numeric try direct equality comparison except: try: if obj == item: return pos except: return None return None def remove_if_found(self, obj, items, precision=15): """If obj is in list of items, remove first instance""" pos = self.check_position(obj, items) if pos is not None: items.pop(pos) def compare_statevector(self, result, circuits, targets, global_phase=True, places=None): """Compare final statevectors to targets.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case output = result.get_statevector(circuit) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " {} != {}".format(output, target)) if (global_phase): # Test equal including global phase self.assertAlmostEqual(norm(output - target), 0, places=places, msg=msg) else: # Test equal ignorning global phase self.assertAlmostEqual(state_fidelity(output, target) - 1, 0, places=places, msg=msg + " up to global phase") def compare_unitary(self, result, circuits, targets, global_phase=True, places=None): """Compare final unitary matrices to targets.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case output = result.get_unitary(circuit) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " {} != {}".format(output, target)) if (global_phase): # Test equal including global phase self.assertAlmostEqual(norm(output - target), 0, places=places, msg=msg) else: # Test equal ignorning global phase delta = np.trace(np.dot(np.conj(np.transpose(output)), target)) - len(output) self.assertAlmostEqual(delta, 0, places=places, msg=msg + " up to global phase") def compare_counts(self, result, circuits, targets, hex_counts=True, delta=0): """Compare counts dictionary to targets.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case if hex_counts: # Don't use get_counts method which converts hex output = result.data(circuit)["counts"] else: # Use get counts method which converts hex output = result.get_counts(circuit) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " {} != {}".format(output, target)) self.assertDictAlmostEqual(output, target, delta=delta, msg=msg) def compare_memory(self, result, circuits, targets, hex_counts=True): """Compare memory list to target.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case self.assertIn("memory", result.data(circuit)) if hex_counts: # Don't use get_counts method which converts hex output = result.data(circuit)["memory"] else: # Use get counts method which converts hex output = result.get_memory(circuit) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " {} != {}".format(output, target)) self.assertEqual(output, target, msg=msg) def compare_result_metadata(self, result, circuits, key, targets): """Compare result metadata key value.""" if not isinstance(targets, (list, tuple)): targets = len(circuits) * [targets] for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case value = None metadata = getattr(result.results[0], 'metadata') if metadata: value = metadata.get(key) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " metadata {} value {} != {}".format(key, value, target)) self.assertEqual(value, target, msg=msg) def assertDictAlmostEqual(self, dict1, dict2, delta=None, msg=None, places=None, default_value=0): """ Assert two dictionaries with numeric values are almost equal. Fail if the two dictionaries are unequal as determined by comparing that the difference between values with the same key are not greater than delta (default 1e-8), or that difference rounded to the given number of decimal places is not zero. If a key in one dictionary is not in the other the default_value keyword argument will be used for the missing value (default 0). If the two objects compare equal then they will automatically compare almost equal. Args: dict1 (dict): a dictionary. dict2 (dict): a dictionary. delta (number): threshold for comparison (defaults to 1e-8). msg (str): return a custom message on failure. places (int): number of decimal places for comparison. default_value (number): default value for missing keys. Raises: TypeError: raises TestCase failureException if the test fails. """ if dict1 == dict2: # Shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") if places is not None: success = True standard_msg = '' # check value for keys in target keys1 = set(dict1.keys()) for key in keys1: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if round(abs(val1 - val2), places) != 0: success = False standard_msg += '(%s: %s != %s), ' % (safe_repr(key), safe_repr(val1), safe_repr(val2)) # check values for keys in counts, not in target keys2 = set(dict2.keys()) - keys1 for key in keys2: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if round(abs(val1 - val2), places) != 0: success = False standard_msg += '(%s: %s != %s), ' % (safe_repr(key), safe_repr(val1), safe_repr(val2)) if success is True: return standard_msg = standard_msg[:-2] + ' within %s places' % places else: if delta is None: delta = 1e-8 # default delta value success = True standard_msg = '' # check value for keys in target keys1 = set(dict1.keys()) for key in keys1: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if abs(val1 - val2) > delta: success = False standard_msg += '(%s: %s != %s), ' % (safe_repr(key), safe_repr(val1), safe_repr(val2)) # check values for keys in counts, not in target keys2 = set(dict2.keys()) - keys1 for key in keys2: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if abs(val1 - val2) > delta: success = False standard_msg += '(%s: %s != %s), ' % (safe_repr(key), safe_repr(val1), safe_repr(val2)) if success is True: return standard_msg = standard_msg[:-2] + ' within %s delta' % delta msg = self._formatMessage(msg, standard_msg) raise self.failureException(msg) class _AssertNoLogsContext(unittest.case._AssertLogsContext): """A context manager used to implement TestCase.assertNoLogs().""" # pylint: disable=inconsistent-return-statements def __exit__(self, exc_type, exc_value, tb): """ This is a modified version of TestCase._AssertLogsContext.__exit__(...) """ self.logger.handlers = self.old_handlers self.logger.propagate = self.old_propagate self.logger.setLevel(self.old_level) if exc_type is not None: # let unexpected exceptions pass through return False if self.watcher.records: msg = 'logs of level {} or higher triggered on {}:\n'.format( logging.getLevelName(self.level), self.logger.name) for record in self.watcher.records: msg += 'logger %s %s:%i: %s\n' % (record.name, record.pathname, record.lineno, record.getMessage()) self._raiseFailure(msg) def _is_ci_fork_pull_request(): """ Check if the tests are being run in a CI environment and if it is a pull request. Returns: bool: True if the tests are executed inside a CI tool, and the changes are not against the "master" branch. """ if os.getenv('TRAVIS'): # Using Travis CI. if os.getenv('TRAVIS_PULL_REQUEST_BRANCH'): return True elif os.getenv('APPVEYOR'): # Using AppVeyor CI. if os.getenv('APPVEYOR_PULL_REQUEST_NUMBER'): return True return False def generate_random_circuit(n_qubits, n_gates, gate_types): """ Generation of a random circuit has a history in Qiskit. Terra used to have a file _random_circuit_generator.py, but it is not there anymore. This file was located in folder `test`, hence accessible only to Qiskit developers and not to users. Currently, as far as I know, each test that requires random circuits has its own implementation of a random circuit generator. This includes tests in qiskit-addon-sympy and test_visualization in terra. Aqua had an issue of writing a random circuit generator, which was closed with the justification that it is moved to ignes. """ qr = QuantumRegister(n_qubits, 'qr') cr = ClassicalRegister(n_qubits, 'cr') circuit = QuantumCircuit(qr, cr) for _ in repeat(None, n_gates): # Choose the next gate op_name = choice(gate_types) if op_name == 'id': op_name = 'iden' operation = eval('QuantumCircuit.' + op_name) # Check if operation is one of u1, u2, u3 if op_name[0] == 'u' and op_name[1].isdigit(): # Number of angles n_angles = int(op_name[1]) # Number of qubits manipulated by the gate n_params = 1 else: n_angles = 0 if op_name == 'measure': n_params = 1 else: n_params = len(inspect.signature(operation).parameters) - 1 # Choose qubits qubit_indices = sample(range(n_qubits), n_params) qubits = [qr[i] for i in qubit_indices] # Choose angles angles = np.random.rand(n_angles) * pi # Measurement operation # In all measure operations, the classical register is not random, # but has the same index as the quantum register if op_name == 'measure': classical_regs = [cr[i] for i in qubit_indices] else: classical_regs = [] # Add operation to the circuit operation(circuit, *angles, *qubits, *classical_regs) return circuit qiskit-aer-0.4.1/test/terra/decorators.py000066400000000000000000000053241362723322000204040ustar00rootroot00000000000000# -*- coding: utf-8 -*- # This code is part of Qiskit. # # (C) Copyright IBM 2017, 2020. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """Decorator for using with Qiskit Aer unit tests.""" import unittest import multiprocessing from qiskit import QuantumCircuit, assemble, execute from qiskit.providers.aer import AerProvider, QasmSimulator from qiskit.providers.aer import AerError def is_method_available(backend, method): """Check if input method is available for the qasm simulator.""" # Simple test circuit that should work on all simulators. if isinstance(backend, str): backend = AerProvider().get_backend(backend) dummy_circ = QuantumCircuit(1) dummy_circ.iden(0) qobj = assemble(dummy_circ, optimization_level=0) backend_options = {"method": method} try: job = backend.run(qobj, backend_options=backend_options) result = job.result() return result.success except AerError: return False return True def requires_method(backend, method): """Decorator that skips test if a simulation method is unavailable. Args: backend (str or AerBackend): backend to check method for. method (str): the method string Returns: decorator: the decorator for testing input method. """ reason = 'method "{}" is unavailable, skipping test'.format(method) skip = not is_method_available(backend, method) return unittest.skipIf(skip, reason) def requires_omp(test_item): """Decorator that skips test if OpenMP is not available. Args: test_item (callable): function or class to be decorated. Returns: callable: the decorated function. """ # Run dummy circuit to check OpenMP status result = execute(QuantumCircuit(1), QasmSimulator()).result() omp_enabled = result.metadata.get('omp_enabled', False) skip = not omp_enabled reason = 'OpenMP not available, skipping test' return unittest.skipIf(skip, reason)(test_item) def requires_multiprocessing(test_item): """Decorator that skips test if run on single-core CPU. Args: test_item (callable): function or class to be decorated. Returns: callable: the decorated function. """ skip = multiprocessing.cpu_count() <= 1 reason = 'Multicore CPU not available, skipping test' return unittest.skipIf(skip, reason)(test_item) qiskit-aer-0.4.1/test/terra/extensions/000077500000000000000000000000001362723322000200605ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/extensions/__init__.py000066400000000000000000000020701362723322000221700ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. ''' Terra tests ''' import os def load_tests(loader, standard_tests, pattern): """ test suite for unittest discovery """ this_dir = os.path.dirname(__file__) if pattern in ['test*.py', '*_test.py']: package_tests = loader.discover(start_dir=this_dir, pattern=pattern) standard_tests.addTests(package_tests) elif pattern in ['profile*.py', '*_profile.py']: loader.testMethodPrefix = 'profile' package_tests = loader.discover(start_dir=this_dir, pattern='test*.py') standard_tests.addTests(package_tests) return standard_tests qiskit-aer-0.4.1/test/terra/extensions/test_snapshot_density_matrix.py000066400000000000000000000064061362723322000264610ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import unittest from qiskit import QuantumCircuit, assemble from qiskit.extensions.exceptions import ExtensionError from qiskit.providers.aer.extensions.snapshot_density_matrix import SnapshotDensityMatrix class TestSnapshotDensityMatrixExtension(unittest.TestCase): """SnapshotDensityMatrix extension tests""" @staticmethod def snapshot_circuit_instr(circ_qubits, label, qubits=None): """Return QobjInstruction for circuit monkey patch method.""" circuit = QuantumCircuit(circ_qubits) circuit.snapshot_density_matrix(label, qubits) qobj = assemble(circuit) instr = qobj.experiments[0].instructions[0] return instr def test_snapshot_label_raises(self): """Test snapshot label must be str""" self.assertRaises(ExtensionError, lambda: SnapshotDensityMatrix(1, 1)) def test_snapshot_name(self): """Test snapshot instruction has correct name""" instrs = [ SnapshotDensityMatrix('snap', 1).assemble(), self.snapshot_circuit_instr(1, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'name')) self.assertEqual(instr.name, 'snapshot') def test_snapshot_type(self): """Test snapshot instruction has correct type.""" instrs = [ SnapshotDensityMatrix('snap', 1).assemble(), self.snapshot_circuit_instr(1, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'density_matrix') def test_snapshot_label(self): """Test snapshot instruction has correct label""" for label in ['snap0', 'snap1', 'snap2']: instrs = [ SnapshotDensityMatrix(label, 1).assemble(), self.snapshot_circuit_instr(1, label) ] for instr in instrs: self.assertTrue(hasattr(instr, 'label')) self.assertEqual(instr.label, label) def test_snapshot_all_qubits(self): """Test snapshot instruction has correct qubits.""" for j in range(1, 5): instrs = [ SnapshotDensityMatrix('snap', j).assemble(), self.snapshot_circuit_instr(j, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, list(range(j))) def test_snapshot_specific_qubits(self): """Test snapshot instruction has correct qubits.""" for qubits in [[0], [0, 2], [1, 3, 0]]: instr = self.snapshot_circuit_instr(5, 'snap', qubits) self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, qubits) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/extensions/test_snapshot_expectation_value.py000066400000000000000000000165771362723322000271470ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import unittest import numpy from qiskit import QuantumCircuit, assemble from qiskit.extensions.exceptions import ExtensionError from qiskit.providers.aer.extensions.snapshot_expectation_value import SnapshotExpectationValue from qiskit.quantum_info.operators import Pauli, Operator class TestSnapshotExpectationValueExtension(unittest.TestCase): """SnapshotExpectationValue extension tests""" @staticmethod def snapshot_circuit_instr(circ_qubits, label, op, qubits, single_shot=False, variance=False): """Return QobjInstruction for circuit monkey patch method.""" circuit = QuantumCircuit(circ_qubits) circuit.snapshot_expectation_value(label, op, qubits, single_shot=single_shot, variance=variance) qobj = assemble(circuit) instr = qobj.experiments[0].instructions[0] return instr def test_snapshot_label_raises(self): """Test snapshot label must be str""" self.assertRaises(ExtensionError, lambda: SnapshotExpectationValue(1, [[1, 'X']])) def test_snapshot_name(self): """Test snapshot instruction has correct name""" for op in [Pauli.from_label('X'), Operator([[0, 1], [1, 0]])]: instrs = [ SnapshotExpectationValue('snap', op).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0]) ] for instr in instrs: self.assertTrue(hasattr(instr, 'name')) self.assertEqual(instr.name, 'snapshot') def test_snapshot_label(self): """Test snapshot instruction has correct label""" for op in [Pauli.from_label('X'), Operator([[0, 1], [1, 0]])]: for label in ['snap0', 'snap1']: instrs = [ SnapshotExpectationValue(label, op).assemble(), self.snapshot_circuit_instr(1, label, op, [0]) ] for instr in instrs: self.assertTrue(hasattr(instr, 'label')) self.assertEqual(instr.label, label) def test_snapshot_pauli_type(self): """Test snapshot instruction has correct type.""" pauli_ops = [ [[1, 'I'], [0.5, 'X'], [0.25, 'Y'], [-3, 'Z']], [[1j, 'I'], [0.5j, 'X'], [0.25j, 'Y'], [-3j, 'Z']], [[0.5j, Pauli.from_label('X')], [-0.5j, Pauli.from_label('Z')]] ] for op in pauli_ops: # standard instrs = [ SnapshotExpectationValue('snap', op, single_shot=False, variance=False).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0], single_shot=False, variance=False) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'expectation_value_pauli') # Single shot instrs = [ SnapshotExpectationValue('snap', op, single_shot=True, variance=False).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0], single_shot=True, variance=False) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'expectation_value_pauli_single_shot') # Variance instrs = [ SnapshotExpectationValue('snap', op, single_shot=False, variance=True).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0], single_shot=False, variance=True) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'expectation_value_pauli_with_variance') def test_snapshot_matrix_type(self): """Test snapshot instruction has correct type.""" matrix_ops = [ numpy.eye(2), numpy.array([[0, 1j], [-1j, 0]]), Operator(Pauli.from_label('Z')) ] for op in matrix_ops: # standard instrs = [ SnapshotExpectationValue('snap', op, single_shot=False, variance=False).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0], single_shot=False, variance=False) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'expectation_value_matrix') # Single shot instrs = [ SnapshotExpectationValue('snap', op, single_shot=True, variance=False).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0], single_shot=True, variance=False) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'expectation_value_matrix_single_shot') # Variance instrs = [ SnapshotExpectationValue('snap', op, single_shot=False, variance=True).assemble(), self.snapshot_circuit_instr(1, 'snap', op, [0], single_shot=False, variance=True) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'expectation_value_matrix_with_variance') def test_snapshot_specific_qubits(self): """Test snapshot instruction has correct qubits.""" for qubits in [[0], [0, 2], [1, 3, 0]]: pauli = Pauli.from_label(len(qubits) * 'X') instrs = [ self.snapshot_circuit_instr(5, 'snap', pauli, qubits), self.snapshot_circuit_instr(5, 'snap', Operator(pauli), qubits) ] for instr in instrs: self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, qubits) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/extensions/test_snapshot_probabilities.py000066400000000000000000000103741362723322000262450ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import unittest from qiskit import QuantumCircuit, assemble from qiskit.extensions.exceptions import ExtensionError from qiskit.providers.aer.extensions.snapshot_probabilities import SnapshotProbabilities class TestSnapshotProbabilitiesExtension(unittest.TestCase): """SnapshotProbabilities extension tests""" @staticmethod def snapshot_circuit_instr(circ_qubits, label, qubits, variance=False): """Return QobjInstruction for circuit monkey patch method.""" circuit = QuantumCircuit(circ_qubits) circuit.snapshot_probabilities(label, qubits, variance) qobj = assemble(circuit) instr = qobj.experiments[0].instructions[0] return instr def test_snapshot_label_raises(self): """Test snapshot label must be str""" self.assertRaises(ExtensionError, lambda: SnapshotProbabilities(1, 1)) def test_snapshot_name(self): """Test snapshot instruction has correct name""" instrs = [ SnapshotProbabilities('snap', 1, False).assemble(), SnapshotProbabilities('snap', 1, True).assemble(), self.snapshot_circuit_instr(1, 'snap', [0], False), self.snapshot_circuit_instr(1, 'snap', [0], True) ] for instr in instrs: self.assertTrue(hasattr(instr, 'name')) self.assertEqual(instr.name, 'snapshot') def test_snapshot_type(self): """Test snapshot instruction has correct type.""" # without variance instrs = [ SnapshotProbabilities('snap', 1, False).assemble(), self.snapshot_circuit_instr(1, 'snap', [0], False) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'probabilities') # with variance instrs = [ SnapshotProbabilities('snap', 1, True).assemble(), self.snapshot_circuit_instr(1, 'snap', [0], True) ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'probabilities_with_variance') def test_snapshot_label(self): """Test snapshot instruction has correct label""" for label in ['snap0', 'snap1']: instrs = [ SnapshotProbabilities(label, 1, False).assemble(), SnapshotProbabilities(label, 1, True).assemble(), self.snapshot_circuit_instr(1, label, [0], False), self.snapshot_circuit_instr(1, label, [0], True) ] for instr in instrs: self.assertTrue(hasattr(instr, 'label')) self.assertEqual(instr.label, label) def test_snapshot_all_qubits(self): """Test snapshot instruction has correct qubits.""" for j in range(1, 5): instrs = [ SnapshotProbabilities('snap', j, False).assemble(), SnapshotProbabilities('snap', j, True).assemble(), self.snapshot_circuit_instr(j, 'snap', range(j), True), self.snapshot_circuit_instr(j, 'snap', range(j), False) ] for instr in instrs: self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, list(range(j))) def test_snapshot_specific_qubits(self): """Test snapshot instruction has correct qubits.""" for qubits in [[0], [0, 2], [1, 3, 0]]: instrs = [ self.snapshot_circuit_instr(5, 'snap', qubits, False), self.snapshot_circuit_instr(5, 'snap', qubits, True) ] for instr in instrs: self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, qubits) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/extensions/test_snapshot_stabilizer.py000066400000000000000000000056021362723322000255630ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import unittest from qiskit import QuantumCircuit, assemble from qiskit.extensions.exceptions import ExtensionError from qiskit.providers.aer.extensions.snapshot_stabilizer import SnapshotStabilizer class TestSnapshotStabilizerExtension(unittest.TestCase): """SnapshotStbilizer extension tests""" @staticmethod def snapshot_circuit_instr(circ_qubits, label): """Return QobjInstruction for circuit monkey patch method.""" circuit = QuantumCircuit(circ_qubits) circuit.snapshot_stabilizer(label) qobj = assemble(circuit) instr = qobj.experiments[0].instructions[0] return instr def test_snapshot_label_raises(self): """Test snapshot label must be str""" self.assertRaises(ExtensionError, lambda: SnapshotStabilizer(1, 1)) def test_snapshot_name(self): """Test snapshot instruction has correct name""" instrs = [ SnapshotStabilizer('snap', 1).assemble(), self.snapshot_circuit_instr(1, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'name')) self.assertEqual(instr.name, 'snapshot') def test_snapshot_type(self): """Test snapshot instruction has correct type.""" instrs = [ SnapshotStabilizer('snap', 1).assemble(), self.snapshot_circuit_instr(1, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'stabilizer') def test_snapshot_label(self): """Test snapshot instruction has correct label""" for label in ['snap0', 'snap1', 'snap2']: instrs = [ SnapshotStabilizer(label, 1).assemble(), self.snapshot_circuit_instr(1, label) ] for instr in instrs: self.assertTrue(hasattr(instr, 'label')) self.assertEqual(instr.label, label) def test_snapshot_qubits(self): """Test snapshot instruction has correct qubits.""" for j in range(1, 5): instrs = [ SnapshotStabilizer('snap', j).assemble(), self.snapshot_circuit_instr(j, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, list(range(j))) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/extensions/test_snapshot_statevector.py000066400000000000000000000056161362723322000257630ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import unittest from qiskit import QuantumCircuit, assemble from qiskit.extensions.exceptions import ExtensionError from qiskit.providers.aer.extensions.snapshot_statevector import SnapshotStatevector class TestSnapshotStatevectorExtension(unittest.TestCase): """SnapshotStatevector extension tests""" @staticmethod def snapshot_circuit_instr(circ_qubits, label): """Return QobjInstruction for circuit monkey patch method.""" circuit = QuantumCircuit(circ_qubits) circuit.snapshot_statevector(label) qobj = assemble(circuit) instr = qobj.experiments[0].instructions[0] return instr def test_snapshot_label_raises(self): """Test snapshot label must be str""" self.assertRaises(ExtensionError, lambda: SnapshotStatevector(1, 1)) def test_snapshot_name(self): """Test snapshot instruction has correct name""" instrs = [ SnapshotStatevector('snap', 1).assemble(), self.snapshot_circuit_instr(1, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'name')) self.assertEqual(instr.name, 'snapshot') def test_snapshot_type(self): """Test snapshot instruction has correct type.""" instrs = [ SnapshotStatevector('snap', 1).assemble(), self.snapshot_circuit_instr(1, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'snapshot_type')) self.assertEqual(instr.snapshot_type, 'statevector') def test_snapshot_label(self): """Test snapshot instruction has correct label""" for label in ['snap0', 'snap1', 'snap2']: instrs = [ SnapshotStatevector(label, 1).assemble(), self.snapshot_circuit_instr(1, label) ] for instr in instrs: self.assertTrue(hasattr(instr, 'label')) self.assertEqual(instr.label, label) def test_snapshot_qubits(self): """Test snapshot instruction has correct qubits.""" for j in range(1, 5): instrs = [ SnapshotStatevector('snap', j).assemble(), self.snapshot_circuit_instr(j, 'snap') ] for instr in instrs: self.assertTrue(hasattr(instr, 'qubits')) self.assertEqual(instr.qubits, list(range(j))) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/000077500000000000000000000000001362723322000167765ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/noise/__init__.py000066400000000000000000000020701362723322000211060ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. ''' Terra tests ''' import os def load_tests(loader, standard_tests, pattern): """ test suite for unittest discovery """ this_dir = os.path.dirname(__file__) if pattern in ['test*.py', '*_test.py']: package_tests = loader.discover(start_dir=this_dir, pattern=pattern) standard_tests.addTests(package_tests) elif pattern in ['profile*.py', '*_profile.py']: loader.testMethodPrefix = 'profile' package_tests = loader.discover(start_dir=this_dir, pattern='test*.py') standard_tests.addTests(package_tests) return standard_tests qiskit-aer-0.4.1/test/terra/noise/test_noise_inserter.py000066400000000000000000000104001362723322000234320ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ noise_model_inserter module tests """ from qiskit import QuantumRegister, QuantumCircuit from qiskit.providers.aer.utils import insert_noise from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import pauli_error from qiskit.qasm import pi import unittest class TestNoiseInserter(unittest.TestCase): def test_no_noise(self): qr = QuantumRegister(3, 'qr') circuit = QuantumCircuit(qr) circuit.x(qr[0]) circuit.y(qr[1]) circuit.z(qr[2]) target_circuit = QuantumCircuit(qr) target_circuit.x(qr[0]) target_circuit.y(qr[1]) target_circuit.z(qr[2]) noise_model = NoiseModel() #empty result_circuit = insert_noise(circuit, noise_model) self.assertEqual(target_circuit, result_circuit) def test_simple_noise(self): qr = QuantumRegister(3, 'qr') circuit = QuantumCircuit(qr) circuit.x(qr[0]) circuit.y(qr[1]) circuit.z(qr[2]) error_x = pauli_error([('Y', 0.25), ('I', 0.75)]) error_y = pauli_error([('X', 0.35), ('Z', 0.65)]) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error_x, 'x') noise_model.add_all_qubit_quantum_error(error_y, 'y') target_circuit = QuantumCircuit(qr) target_circuit.x(qr[0]) target_circuit.append(error_x.to_instruction(), [qr[0]]) target_circuit.y(qr[1]) target_circuit.append(error_y.to_instruction(), [qr[1]]) target_circuit.z(qr[2]) result_circuit = insert_noise(circuit, noise_model) self.assertEqual(target_circuit, result_circuit) def test_transpiling(self): qr = QuantumRegister(3, 'qr') circuit = QuantumCircuit(qr) circuit.x(qr[0]) circuit.y(qr[1]) circuit.z(qr[2]) error_x = pauli_error([('Y', 0.25), ('I', 0.75)]) error_y = pauli_error([('X', 0.35), ('Z', 0.65)]) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error_x, 'x') noise_model.add_all_qubit_quantum_error(error_y, 'u1') target_circuit = QuantumCircuit(qr) target_circuit.x(qr[0]) target_circuit.append(error_x.to_instruction(), [qr[0]]) target_circuit.u3(pi, pi / 2, pi / 2, qr[1]) target_circuit.u1(pi, qr[2]) target_circuit.append(error_y.to_instruction(), [qr[2]]) result_circuit = insert_noise(circuit, noise_model, transpile=True) self.assertEqual(target_circuit, result_circuit) def test_multiple_inputs(self): qr = QuantumRegister(1, 'qr') circuit1 = QuantumCircuit(qr) circuit1.x(qr[0]) circuit2 = QuantumCircuit(qr) circuit2.y(qr[0]) circuits_list = [circuit1, circuit2] circuits_tuple = (circuit1, circuit2) noise_model = NoiseModel() error_x = pauli_error([('Y', 0.25), ('I', 0.75)]) error_y = pauli_error([('X', 0.35), ('Z', 0.65)]) noise_model.add_all_qubit_quantum_error(error_x, 'x') noise_model.add_all_qubit_quantum_error(error_y, 'y') target_circuit1 = QuantumCircuit(qr) target_circuit1.x(qr[0]) target_circuit1.append(error_x.to_instruction(), [qr[0]]) target_circuit2 = QuantumCircuit(qr) target_circuit2.y(qr[0]) target_circuit2.append(error_y.to_instruction(), [qr[0]]) target_circuits = [target_circuit1, target_circuit2] result_circuits = insert_noise(circuits_list, noise_model) self.assertEqual(target_circuits, result_circuits) target_circuits = [target_circuit1, target_circuit2] result_circuits = insert_noise(circuits_tuple, noise_model) self.assertEqual(target_circuits, result_circuits) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/test_noise_model.py000066400000000000000000000215641362723322000227140ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ NoiseModel class integration tests """ import unittest from test.terra import common from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute from qiskit.compiler import assemble, transpile from qiskit.providers.aer.backends import QasmSimulator from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import pauli_error from qiskit.providers.aer.noise.errors.standard_errors import reset_error from qiskit.providers.aer.noise.errors.standard_errors import amplitude_damping_error from qiskit.test import mock class TestNoise(common.QiskitAerTestCase): """Testing noise model""" def test_amplitude_damping_error(self): """Test amplitude damping error damps to correct state""" qr = QuantumRegister(1, 'qr') cr = ClassicalRegister(1, 'cr') circuit = QuantumCircuit(qr, cr) circuit.x(qr) # prepare + state for _ in range(30): # Add noisy identities circuit.barrier(qr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) shots = 2000 backend = QasmSimulator() # test noise model error = amplitude_damping_error(0.75, 0.25) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, 'id') # Execute target = {'0x0': 3 * shots / 4, '0x1': shots / 4} circuit = transpile(circuit, basis_gates=noise_model.basis_gates) qobj = assemble([circuit], backend, shots=shots) result = backend.run(qobj, noise_model=noise_model).result() self.assertTrue(getattr(result, 'success', False)) self.compare_counts(result, [circuit], [target], delta=0.05 * shots) def test_noise_model_basis_gates(self): """Test noise model basis_gates""" basis_gates = ['u1', 'u2', 'u3', 'cx'] model = NoiseModel(basis_gates) target = sorted(basis_gates) self.assertEqual(model.basis_gates, target) # Check adding readout errors doesn't add to basis gates model = NoiseModel(basis_gates) target = sorted(basis_gates) model.add_all_qubit_readout_error([[0.9, 0.1], [0, 1]], False) self.assertEqual(model.basis_gates, target) model.add_readout_error([[0.9, 0.1], [0, 1]], [2], False) self.assertEqual(model.basis_gates, target) # Check a reset instruction error isn't added to basis gates model = NoiseModel(basis_gates) target = sorted(basis_gates) model.add_all_qubit_quantum_error(reset_error(0.2), ['reset'], False) self.assertEqual(model.basis_gates, target) # Check a non-standard gate isn't added to basis gates model = NoiseModel(basis_gates) target = sorted(basis_gates) model.add_all_qubit_quantum_error(reset_error(0.2), ['label'], False) self.assertEqual(model.basis_gates, target) # Check a standard gate is added to basis gates model = NoiseModel(basis_gates) target = sorted(basis_gates + ['h']) model.add_all_qubit_quantum_error(reset_error(0.2), ['h'], False) self.assertEqual(model.basis_gates, target) def test_noise_model_noise_instructions(self): """Test noise instructions""" model = NoiseModel() target = [] self.assertEqual(model.noise_instructions, target) # Check a non-standard gate is added to noise instructions model = NoiseModel() model.add_all_qubit_quantum_error(reset_error(0.2), ['label'], False) target = ['label'] self.assertEqual(model.noise_instructions, target) # Check a standard gate is added to noise instructions model = NoiseModel() model.add_all_qubit_quantum_error(reset_error(0.2), ['h'], False) target = ['h'] self.assertEqual(model.noise_instructions, target) # Check a reset is added to noise instructions model = NoiseModel() model.add_all_qubit_quantum_error(reset_error(0.2), ['reset'], False) target = ['reset'] self.assertEqual(model.noise_instructions, target) # Check a measure is added to noise instructions for readout error model = NoiseModel() model.add_all_qubit_readout_error([[0.9, 0.1], [0, 1]], False) target = ['measure'] self.assertEqual(model.noise_instructions, target) def test_noise_model_noise_qubits(self): """Test noise instructions""" model = NoiseModel() target = [] self.assertEqual(model.noise_qubits, target) # Check adding a default error isn't added to noise qubits model = NoiseModel() model.add_all_qubit_quantum_error(pauli_error([['XX', 1]]), ['label'], False) target = [] self.assertEqual(model.noise_qubits, target) # Check adding a local error adds to noise qubits model = NoiseModel() model.add_quantum_error(pauli_error([['XX', 1]]), ['label'], [1, 0], False) target = sorted([0, 1]) self.assertEqual(model.noise_qubits, target) # Check adding a non-local error adds to noise qubits model = NoiseModel() model.add_nonlocal_quantum_error(pauli_error([['XX', 1]]), ['label'], [0], [1, 2], False) target = sorted([0, 1, 2]) self.assertEqual(model.noise_qubits, target) # Check adding a default error isn't added to noise qubits model = NoiseModel() model.add_all_qubit_readout_error([[0.9, 0.1], [0, 1]], False) target = [] self.assertEqual(model.noise_qubits, target) # Check adding a local error adds to noise qubits model = NoiseModel() model.add_readout_error([[0.9, 0.1], [0, 1]], [2], False) target = [2] self.assertEqual(model.noise_qubits, target) def test_noise_models_equal(self): """Test two noise models are Equal""" roerror = [[0.9, 0.1], [0.5, 0.5]] error1 = pauli_error([['X', 1]], standard_gates=False) error2 = pauli_error([['X', 1]], standard_gates=True) model1 = NoiseModel() model1.add_all_qubit_quantum_error(error1, ['u3'], False) model1.add_quantum_error(error1, ['u3'], [2], False) model1.add_nonlocal_quantum_error(error1, ['cx'], [0, 1], [3], False) model1.add_all_qubit_readout_error(roerror, False) model1.add_readout_error(roerror, [0], False) model2 = NoiseModel() model2.add_all_qubit_quantum_error(error2, ['u3'], False) model2.add_quantum_error(error2, ['u3'], [2], False) model2.add_nonlocal_quantum_error(error2, ['cx'], [0, 1], [3], False) model2.add_all_qubit_readout_error(roerror, False) model2.add_readout_error(roerror, [0], False) self.assertEqual(model1, model2) def test_noise_models_not_equal(self): """Test two noise models are not equal""" error = pauli_error([['X', 1]]) model1 = NoiseModel() model1.add_all_qubit_quantum_error(error, ['u3'], False) model2 = NoiseModel(basis_gates=['u3', 'cx']) model2.add_all_qubit_quantum_error(error, ['u3'], False) def test_noise_model_from_backend_singapore(self): circ = QuantumCircuit(2) circ.x(0) circ.x(1) circ.measure_all() backend = mock.FakeSingapore() noise_model = NoiseModel.from_backend(backend) qobj = assemble(transpile(circ, backend), backend) sim = QasmSimulator() result = sim.run(qobj, noise_model=noise_model).result() self.assertTrue(result.success) def test_noise_model_from_backend_almaden(self): circ = QuantumCircuit(2) circ.x(0) circ.x(1) circ.measure_all() backend = mock.FakeAlmaden() noise_model = NoiseModel.from_backend(backend) qobj = assemble(transpile(circ, backend), backend) sim = QasmSimulator() result = sim.run(qobj, noise_model=noise_model).result() self.assertTrue(result.success) def test_noise_model_from_rochester(self): circ = QuantumCircuit(2) circ.x(0) circ.x(1) circ.measure_all() backend = mock.FakeRochester() noise_model = NoiseModel.from_backend(backend) qobj = assemble(transpile(circ, backend), backend) sim = QasmSimulator() result = sim.run(qobj, noise_model=noise_model).result() self.assertTrue(result.success) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/test_noise_remapper.py000066400000000000000000000134671362723322000234320ustar00rootroot00000000000000""" NoiseModel class integration tests """ import unittest from test.terra import common from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.noiseerror import NoiseError from qiskit.providers.aer.noise.errors import depolarizing_error from qiskit.providers.aer.utils import remap_noise_model class TestNoiseRemapper(common.QiskitAerTestCase): """Testing remap_noise_model function""" def test_raises_duplicate_qubits(self): """Test duplicate qubits raises exception""" model = NoiseModel() self.assertRaises(NoiseError, remap_noise_model, model, [[0, 1], [2, 1]], warnings=False) model = NoiseModel() error = depolarizing_error(0.5, 1) model.add_quantum_error(error, ['u3'], [2], False) self.assertRaises(NoiseError, remap_noise_model, model, [[3, 2]], warnings=False) def test_remap_all_qubit_quantum_errors(self): """Test remapper doesn't effect all-qubit quantum errors.""" model = NoiseModel() error1 = depolarizing_error(0.5, 1) error2 = depolarizing_error(0.5, 2) model.add_all_qubit_quantum_error(error1, ['u3'], False) model.add_all_qubit_quantum_error(error2, ['cx'], False) remapped_model = remap_noise_model(model, [[0, 1], [1, 0]], warnings=False) self.assertEqual(model, remapped_model) def test_remap_quantum_errors(self): """Test remapping of quantum errors.""" model = NoiseModel() error1 = depolarizing_error(0.5, 1) error2 = depolarizing_error(0.5, 2) model.add_quantum_error(error1, ['u3'], [0], False) model.add_quantum_error(error2, ['cx'], [1, 2], False) remapped_model = remap_noise_model(model, [[0, 1], [1, 2], [2, 0]], warnings=False) target = NoiseModel() target.add_quantum_error(error1, ['u3'], [1], False) target.add_quantum_error(error2, ['cx'], [2, 0], False) self.assertEqual(remapped_model, target) def test_remap_nonlocal_quantum_errors(self): """Test remapping of non-local quantum errors.""" model = NoiseModel() error1 = depolarizing_error(0.5, 1) error2 = depolarizing_error(0.5, 2) model.add_nonlocal_quantum_error(error1, ['u3'], [0], [1], False) model.add_nonlocal_quantum_error(error2, ['cx'], [1, 2], [3, 0], False) remapped_model = remap_noise_model(model, [[0, 1], [1, 2], [2, 0]], warnings=False) target = NoiseModel() target.add_nonlocal_quantum_error(error1, ['u3'], [1], [2], False) target.add_nonlocal_quantum_error(error2, ['cx'], [2, 0], [3, 1], False) self.assertEqual(remapped_model, target) def test_remap_all_qubit_readout_errors(self): """Test remapping of all-qubit readout errors.""" model = NoiseModel() error1 = [[0.9, 0.1], [0.5, 0.5]] model.add_all_qubit_readout_error(error1, False) remapped_model = remap_noise_model(model, [[0, 1], [1, 2], [2, 0]], warnings=False) self.assertEqual(remapped_model, model) def test_remap_readout_errors(self): """Test remapping of readout errors.""" model = NoiseModel() error1 = [[0.9, 0.1], [0.5, 0.5]] error2 = [[0.8, 0.2, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0.1, 0.9]] model.add_readout_error(error1, [1], False) model.add_readout_error(error2, [0, 2], False) remapped_model = remap_noise_model(model, [[0, 1], [1, 2], [2, 0]], warnings=False) target = NoiseModel() target.add_readout_error(error1, [2], False) target.add_readout_error(error2, [1, 0], False) self.assertEqual(remapped_model, target) def test_reduce_noise_model(self): """Test reduction mapping of noise model.""" error1 = depolarizing_error(0.5, 1) error2 = depolarizing_error(0.5, 2) roerror1 = [[0.9, 0.1], [0.5, 0.5]] roerror2 = [[0.8, 0.2, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0.1, 0.9]] model = NoiseModel() model.add_all_qubit_quantum_error(error1, ['u3'], False) model.add_quantum_error(error1, ['u3'], [1], False) model.add_nonlocal_quantum_error(error2, ['cx'], [2, 0], [3, 1], False) model.add_all_qubit_readout_error(roerror1, False) model.add_readout_error(roerror2, [0, 2], False) remapped_model = remap_noise_model(model, [0, 1, 2], discard_qubits=True, warnings=False) target = NoiseModel() target.add_all_qubit_quantum_error(error1, ['u3'], False) target.add_quantum_error(error1, ['u3'], [1], False) target.add_all_qubit_readout_error(roerror1, False) target.add_readout_error(roerror2, [0, 2], False) self.assertEqual(remapped_model, target) def test_reduce_remapped_noise_model(self): """Test reduction and remapping of noise model.""" error1 = depolarizing_error(0.5, 1) error2 = depolarizing_error(0.5, 2) roerror1 = [[0.9, 0.1], [0.5, 0.5]] roerror2 = [[0.8, 0.2, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0.1, 0.9]] model = NoiseModel() model.add_all_qubit_quantum_error(error1, ['u3'], False) model.add_quantum_error(error1, ['u3'], [1], False) model.add_nonlocal_quantum_error(error2, ['cx'], [2, 0], [3, 1], False) model.add_all_qubit_readout_error(roerror1, False) model.add_readout_error(roerror2, [0, 2], False) remapped_model = remap_noise_model(model, [2, 0, 1], discard_qubits=True, warnings=False) target = NoiseModel() target.add_all_qubit_quantum_error(error1, ['u3'], False) target.add_quantum_error(error1, ['u3'], [2], False) target.add_all_qubit_readout_error(roerror1, False) target.add_readout_error(roerror2, [1, 0], False) self.assertEqual(remapped_model, target) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/test_noise_transformation.py000066400000000000000000000304021362723322000246510ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ NoiseTransformer class tests """ import unittest import numpy from qiskit.providers.aer.noise.errors.errorutils import standard_gate_unitary from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.utils import NoiseTransformer from qiskit.providers.aer.utils import approximate_quantum_error from qiskit.providers.aer.utils import approximate_noise_model from qiskit.providers.aer.noise.errors.standard_errors import amplitude_damping_error from qiskit.providers.aer.noise.errors.standard_errors import reset_error from qiskit.providers.aer.noise.errors.standard_errors import pauli_error from qiskit.providers.aer.noise.errors.quantum_error import QuantumError class TestNoiseTransformer(unittest.TestCase): def setUp(self): self.ops = { 'X': standard_gate_unitary('x'), 'Y': standard_gate_unitary('y'), 'Z': standard_gate_unitary('z'), 'H': standard_gate_unitary('h'), 'S': standard_gate_unitary('s') } self.n = NoiseTransformer() def assertNoiseModelsAlmostEqual(self, lhs, rhs, places=3): self.assertNoiseDictsAlmostEqual( lhs._nonlocal_quantum_errors, rhs._nonlocal_quantum_errors, places=places) self.assertNoiseDictsAlmostEqual( lhs._local_quantum_errors, rhs._local_quantum_errors, places=places) self.assertNoiseDictsAlmostEqual( lhs._default_quantum_errors, rhs._default_quantum_errors, places=places) self.assertNoiseDictsAlmostEqual( lhs._local_readout_errors, rhs._local_readout_errors, places=places) if lhs._default_readout_error is not None: self.assertTrue(rhs._default_readout_error is not None) self.assertErrorsAlmostEqual( lhs._default_readout_error, rhs._default_readout_error, places=places) else: self.assertTrue(rhs._default_readout_error is None) def assertNoiseDictsAlmostEqual(self, lhs, rhs, places=3): keys = set(lhs.keys()).union(set(rhs.keys())) for key in keys: self.assertTrue( key in lhs.keys(), msg="Key {} is missing from lhs".format(key)) self.assertTrue( key in rhs.keys(), msg="Key {} is missing from rhs".format(key)) if isinstance(lhs[key], dict): self.assertNoiseDictsAlmostEqual(lhs[key], rhs[key], places=places) else: self.assertErrorsAlmostEqual(lhs[key], rhs[key], places=places) def assertErrorsAlmostEqual(self, lhs, rhs, places=3): self.assertMatricesAlmostEqual(lhs.to_quantumchannel()._data, rhs.to_quantumchannel()._data, places) def assertDictAlmostEqual(self, lhs, rhs, places=None): keys = set(lhs.keys()).union(set(rhs.keys())) for key in keys: self.assertAlmostEqual( lhs.get(key), rhs.get(key), msg="Not almost equal for key {}: {} !~ {}".format( key, lhs.get(key), rhs.get(key)), places=places) def assertListAlmostEqual(self, lhs, rhs, places=None): self.assertEqual( len(lhs), len(rhs), msg="List lengths differ: {} != {}".format(len(lhs), len(rhs))) for i in range(len(lhs)): if isinstance(lhs[i], numpy.ndarray) and isinstance( rhs[i], numpy.ndarray): self.assertMatricesAlmostEqual(lhs[i], rhs[i], places=places) else: self.assertAlmostEqual(lhs[i], rhs[i], places=places) def assertMatricesAlmostEqual(self, lhs, rhs, places=None): self.assertEqual(lhs.shape, rhs.shape, "Marix shapes differ: {} vs {}".format(lhs, rhs)) n, m = lhs.shape for x in range(n): for y in range(m): self.assertAlmostEqual( lhs[x, y], rhs[x, y], places=places, msg="Matrices {} and {} differ on ({}, {})".format( lhs, rhs, x, y)) def test_transformation_by_pauli(self): n = NoiseTransformer() # polarization in the XY plane; we represent via Kraus operators X = self.ops['X'] Y = self.ops['Y'] Z = self.ops['Z'] p = 0.22 theta = numpy.pi / 5 E0 = numpy.sqrt(1 - p) * numpy.array(numpy.eye(2)) E1 = numpy.sqrt(p) * (numpy.cos(theta) * X + numpy.sin(theta) * Y) results = approximate_quantum_error((E0, E1), operator_dict={ "X": X, "Y": Y, "Z": Z}) expected_results = pauli_error( [('X', p * numpy.cos(theta) * numpy.cos(theta)), ('Y', p * numpy.sin(theta) * numpy.sin(theta)), ('Z', 0), ('I', 1 - p)]) self.assertErrorsAlmostEqual(expected_results, results) # now try again without fidelity; should be the same n.use_honesty_constraint = False results = approximate_quantum_error((E0, E1), operator_dict={ "X": X, "Y": Y, "Z": Z}) self.assertErrorsAlmostEqual(expected_results, results) def test_reset(self): # approximating amplitude damping using relaxation operators gamma = 0.23 error = amplitude_damping_error(gamma) p = (gamma - numpy.sqrt(1 - gamma) + 1) / 2 q = 0 expected_results = reset_error(p, q) results = approximate_quantum_error(error, operator_string="reset") self.assertErrorsAlmostEqual(results, expected_results) def test_transform(self): X = self.ops['X'] Y = self.ops['Y'] Z = self.ops['Z'] p = 0.34 theta = numpy.pi / 7 E0 = numpy.sqrt(1 - p) * numpy.array(numpy.eye(2)) E1 = numpy.sqrt(p) * (numpy.cos(theta) * X + numpy.sin(theta) * Y) results_dict = approximate_quantum_error((E0, E1), operator_dict={ "X": X, "Y": Y, "Z": Z}) results_string = approximate_quantum_error((E0, E1), operator_string='pauli') results_list = approximate_quantum_error((E0, E1), operator_list=[X, Y, Z]) results_tuple = approximate_quantum_error((E0, E1), operator_list=(X, Y, Z)) self.assertErrorsAlmostEqual(results_dict, results_string) self.assertErrorsAlmostEqual(results_string, results_list) self.assertErrorsAlmostEqual(results_list, results_tuple) def test_fidelity(self): n = NoiseTransformer() expected_fidelity = {'X': 0, 'Y': 0, 'Z': 0, 'H': 0, 'S': 2} for key in expected_fidelity: self.assertAlmostEqual( expected_fidelity[key], n.fidelity([self.ops[key]]), msg="Wrong fidelity for {}".format(key)) def test_approx_noise_model(self): noise_model = NoiseModel() gamma = 0.23 p = 0.4 q = 0.33 ad_error = amplitude_damping_error(gamma) r_error = reset_error(p, q) # should be approximated as-is noise_model.add_all_qubit_quantum_error(ad_error, 'iden x y s') noise_model.add_all_qubit_quantum_error(r_error, 'iden z h') result = approximate_noise_model(noise_model, operator_string="reset") expected_result = NoiseModel() gamma_p = (gamma - numpy.sqrt(1 - gamma) + 1) / 2 gamma_q = 0 ad_error_approx = reset_error(gamma_p, gamma_q) expected_result.add_all_qubit_quantum_error(ad_error_approx, 'iden x y s') expected_result.add_all_qubit_quantum_error(r_error, 'iden z h') self.assertNoiseModelsAlmostEqual(expected_result, result) def test_clifford(self): x_p = 0.17 y_p = 0.13 z_p = 0.34 error = pauli_error([('X', x_p), ('Y', y_p), ('Z', z_p), ('I', 1 - (x_p + y_p + z_p))]) results = approximate_quantum_error(error, operator_string="clifford") self.assertErrorsAlmostEqual(error, results) def test_approx_names(self): gamma = 0.23 error = amplitude_damping_error(gamma) results_1 = approximate_quantum_error(error, operator_string="pauli") results_2 = approximate_quantum_error(error, operator_string="Pauli") self.assertErrorsAlmostEqual(results_1, results_2) def test_paulis_1_and_2_qubits(self): probs = [0.5, 0.3, 0.2] paulis_1q = ['X', 'Y', 'Z'] paulis_2q = ['XI', 'YI', 'ZI'] error_1q = pauli_error(zip(paulis_1q, probs)) error_2q = pauli_error(zip(paulis_2q, probs)) results_1q = approximate_quantum_error(error_1q, operator_string="pauli") results_2q = approximate_quantum_error(error_2q, operator_string="pauli") self.assertErrorsAlmostEqual(error_1q, results_1q) self.assertErrorsAlmostEqual(error_2q, results_2q, places = 2) paulis_2q = ['XY', 'ZZ', 'YI'] error_2q = pauli_error(zip(paulis_2q, probs)) results_2q = approximate_quantum_error(error_2q, operator_string="pauli") self.assertErrorsAlmostEqual(error_2q, results_2q, places=2) def test_reset_2_qubit(self): # approximating amplitude damping using relaxation operators gamma = 0.23 p = (gamma - numpy.sqrt(1 - gamma) + 1) / 2 q = 0 A0 = [[1, 0], [0, numpy.sqrt(1 - gamma)]] A1 = [[0, numpy.sqrt(gamma)], [0, 0]] error_1 = QuantumError([([{'name': 'kraus', 'qubits': [0], 'params': [A0, A1]}, {'name': 'id', 'qubits': [1]} ], 1)]) error_2 = QuantumError([([{'name': 'kraus', 'qubits': [1], 'params': [A0, A1]}, {'name': 'id', 'qubits': [0]} ], 1)]) expected_results_1 = QuantumError([ ([{'name': 'id', 'qubits': [0]}, {'name': 'id', 'qubits': [1]}], 1-p), ([{'name': 'reset', 'qubits': [0]}, {'name': 'id', 'qubits': [1]}],p), ]) expected_results_2 = QuantumError([ ([{'name': 'id', 'qubits': [1]}, {'name': 'id', 'qubits': [0]}], 1 - p), ([{'name': 'reset', 'qubits': [1]}, {'name': 'id', 'qubits': [0]}], p), ]) results_1 = approximate_quantum_error(error_1, operator_string="reset") results_2 = approximate_quantum_error(error_2, operator_string="reset") self.assertErrorsAlmostEqual(results_1, expected_results_1) self.assertErrorsAlmostEqual(results_2, expected_results_2) def test_errors(self): gamma = 0.23 error = amplitude_damping_error(gamma) # kraus error is legit, transform_channel_operators are not with self.assertRaisesRegex( TypeError, "takes 1 positional argument but 2 were given"): approximate_quantum_error(error, 7) with self.assertRaisesRegex(RuntimeError, "No information about noise type seven"): approximate_quantum_error(error, operator_string="seven") if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/test_quantum_error.py000066400000000000000000000541301362723322000233150ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019, 2020. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QuantumError class tests """ import unittest from test.terra import common import numpy as np from qiskit.quantum_info.operators import SuperOp, Kraus from qiskit.providers.aer.noise import QuantumError from qiskit.providers.aer.noise.noiseerror import NoiseError from qiskit.providers.aer.noise.errors.errorutils import standard_gate_unitary class TestQuantumError(common.QiskitAerTestCase): """Testing QuantumError class""" def kraus_error(self, param): """Return a Kraus error list""" return [ np.array([[1, 0], [0, np.sqrt(1 - param)]], dtype=complex), np.array([[0, 0], [0, np.sqrt(param)]], dtype=complex) ] def mixed_unitary_error(self, probs, labels): """Return a mixed unitary error list""" return [np.sqrt(prob) * standard_gate_unitary(label) for prob, label in zip(probs, labels)] def depol_error(self, param): """Return depol error unitary list""" return self.mixed_unitary_error( [1 - param * 0.75, param * 0.25, param * 0.25, param * 0.25], ['id', 'x', 'y', 'z']) def test_standard_gate_unitary(self): """Test standard gates are correct""" def norm(op_a, op_b): return round(np.linalg.norm(op_a - op_b), 15) self.assertEqual(norm(standard_gate_unitary('id'), np.eye(2)), 0, msg="identity matrix") self.assertEqual(norm(standard_gate_unitary('x'), np.array([[0, 1], [1, 0]])), 0, msg="Pauli-X matrix") self.assertEqual(norm(standard_gate_unitary('y'), np.array([[0, -1j], [1j, 0]])), 0, msg="Pauli-Y matrix") self.assertEqual(norm(standard_gate_unitary('z'), np.diag([1, -1])), 0, msg="Pauli-Z matrix") self.assertEqual(norm(standard_gate_unitary('h'), np.array([[1, 1], [1, -1]]) / np.sqrt(2)), 0, msg="Hadamard gate matrix") self.assertEqual(norm(standard_gate_unitary('s'), np.diag([1, 1j])), 0, msg="Phase gate matrix") self.assertEqual(norm(standard_gate_unitary('sdg'), np.diag([1, -1j])), 0, msg="Adjoint phase gate matrix") self.assertEqual(norm(standard_gate_unitary('t'), np.diag([1, (1 + 1j) / np.sqrt(2)])), 0, msg="T gate matrix") self.assertEqual(norm(standard_gate_unitary('tdg'), np.diag([1, (1 - 1j) / np.sqrt(2)])), 0, msg="Adjoint T gate matrix") self.assertEqual(norm( standard_gate_unitary('cx'), np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])), 0, msg="Controlled-NOT gate matrix") self.assertEqual(norm(standard_gate_unitary('cz'), np.diag([1, 1, 1, -1])), 0, msg="Controlled-Z gate matrix") self.assertEqual(norm( standard_gate_unitary('swap'), np.array([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]])), 0, msg="SWAP matrix") self.assertEqual(norm( standard_gate_unitary('ccx'), np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0]])), 0, msg="Toffoli gate matrix") def test_raise_probabilities_negative(self): """Test exception is raised for negative probabilities.""" noise_ops = [([{ "name": "id", "qubits": [0] }], 1.1), ([{ "name": "x", "qubits": [0] }], -0.1)] self.assertRaises(NoiseError, lambda: QuantumError(noise_ops)) def test_raise_probabilities_normalized_qobj(self): """Test exception is raised for qobj probabilities greater than 1.""" noise_ops = [([{ "name": "id", "qubits": [0] }], 0.9), ([{ "name": "x", "qubits": [0] }], 0.2)] self.assertRaises(NoiseError, lambda: QuantumError(noise_ops)) def test_raise_probabilities_normalized_unitary_kraus(self): """Test exception is raised for unitary kraus probs greater than 1.""" a_0 = np.sqrt(0.9) * np.eye(2) a_1 = np.sqrt(0.2) * np.diag([1, -1]) self.assertRaises(NoiseError, lambda: QuantumError([a_0, a_1])) def test_raise_probabilities_normalized_nonunitary_kraus(self): """Test exception is raised for non-unitary kraus probs greater than 1.""" a_0 = np.sqrt(0.9) * np.array([[1, 0], [0, np.sqrt(1 - 0.3)]], dtype=complex) a_1 = np.sqrt(0.2) * np.array([[0, np.sqrt(0.3)], [0, 0]], dtype=complex) self.assertRaises(NoiseError, lambda: QuantumError([a_0, a_1])) def test_raise_non_cptp_kraus(self): """Test exception is raised for non-CPTP input.""" a_0 = np.array([[1, 0], [0, np.sqrt(1 - 0.3)]], dtype=complex) a_1 = np.array([[0, 0], [np.sqrt(0.3), 0]], dtype=complex) self.assertRaises(NoiseError, lambda: QuantumError([a_0, a_1])) self.assertRaises(NoiseError, lambda: QuantumError([a_0])) def test_raise_non_multiqubit_kraus(self): """Test exception is raised for non-multiqubit input.""" a_0 = np.sqrt(0.5) * np.diag([1, 1, 1]) a_1 = np.sqrt(0.5) * np.diag([1, 1, -1]) self.assertRaises(NoiseError, lambda: QuantumError([a_0, a_1])) def test_pauli_conversion_standard_gates(self): """Test conversion of Pauli channel kraus to gates""" error = QuantumError(self.depol_error(1), standard_gates=True) for j in range(4): instr, _ = error.error_term(j) self.assertEqual(len(instr), 1) self.assertIn(instr[0]['name'], ['x', 'y', 'z', 'id']) self.assertEqual(instr[0]['qubits'], [0]) target = SuperOp(Kraus(self.depol_error(1))) self.assertEqual(target, SuperOp(error)) def test_pauli_conversion_unitary(self): """Test conversion of Pauli channel kraus to unitary qobj""" error = QuantumError(self.depol_error(1), standard_gates=False) for j in range(4): instr, _ = error.error_term(j) self.assertEqual(len(instr), 1) self.assertIn(instr[0]['name'], ['unitary', 'id']) self.assertEqual(instr[0]['qubits'], [0]) target = SuperOp(Kraus(self.depol_error(1))) self.assertEqual(target, SuperOp(error)) def test_tensor_both_kraus(self): """Test tensor of two kraus errors""" kraus0 = self.kraus_error(0.3) kraus1 = self.kraus_error(0.5) error = QuantumError(kraus0).tensor(QuantumError(kraus1)) target = SuperOp(Kraus(kraus0)).tensor(Kraus(kraus1)) kraus, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(kraus[0]['name'], 'kraus') self.assertEqual(kraus[0]['qubits'], [0, 1]) self.assertEqual(target, SuperOp(error), msg="Incorrect tensor kraus") def test_tensor_both_unitary_instruction(self): """Test tensor of two unitary instruction errors.""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=False) error1 = QuantumError(unitaries1, standard_gates=False) error = error0.tensor(error1) target = SuperOp(Kraus(unitaries0)).tensor(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertEqual(len(circ), 1) self.assertEqual(circ[0]['name'], 'unitary') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(SuperOp(error), target) def test_tensor_both_unitary_standard_gates(self): """Test tensor of two unitary standard gate errors""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=True) error1 = QuantumError(unitaries1, standard_gates=True) error = error0.tensor(error1) target = SuperOp(Kraus(unitaries0)).tensor(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertEqual(len(circ), 2) for instr in circ: self.assertIn(instr['name'], ['s', 'x', 'y', 'z']) self.assertIn(instr['qubits'], [[0], [1]]) self.assertEqual(SuperOp(error), target) def test_tensor_kraus_and_unitary(self): """Test tensor of a kraus and unitary error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(kraus).tensor(QuantumError(unitaries)) target = SuperOp(Kraus(kraus)).tensor(Kraus(unitaries)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(target, SuperOp(error)) def test_tensor_unitary_and_kraus(self): """Test tensor of a unitary and kraus error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(unitaries).tensor(QuantumError(kraus)) target = SuperOp(Kraus(unitaries)).tensor(Kraus(kraus)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(target, SuperOp(error)) def test_expand_both_kraus(self): """Test expand of two kraus errors""" kraus0 = self.kraus_error(0.3) kraus1 = self.kraus_error(0.5) error = QuantumError(kraus0).expand(QuantumError(kraus1)) target = SuperOp(Kraus(kraus0)).expand(Kraus(kraus1)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(target, SuperOp(error)) def test_expand_both_unitary_instruction(self): """Test expand of two unitary instruction errors.""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=False) error1 = QuantumError(unitaries1, standard_gates=False) error = error0.expand(error1) target = SuperOp(Kraus(unitaries0)).expand(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertEqual(circ[0]['name'], 'unitary') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(SuperOp(error), target) def test_expand_both_unitary_standard_gates(self): """Test expand of two unitary standard gate errors""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=True) error1 = QuantumError(unitaries1, standard_gates=True) error = error0.expand(error1) target = SuperOp(Kraus(unitaries0)).expand(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertEqual(len(circ), 2) for instr in circ: self.assertIn(instr['name'], ['s', 'x', 'y', 'z']) self.assertIn(instr['qubits'], [[0], [1]]) self.assertEqual(SuperOp(error), target) def test_expand_kraus_and_unitary(self): """Test expand of a kraus and unitary error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(kraus).expand(QuantumError(unitaries)) target = SuperOp(Kraus(kraus)).expand(Kraus(unitaries)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(target, SuperOp(error)) def test_expand_unitary_and_kraus(self): """Test expand of a unitary and kraus error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(unitaries).expand(QuantumError(kraus)) target = SuperOp(Kraus(unitaries)).expand(Kraus(kraus)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0, 1]) self.assertEqual(target, SuperOp(error)) def test_raise_compose_different_dim(self): """Test composing incompatible errors raises exception""" error0 = QuantumError([np.diag([1, 1, 1, -1])]) # 2-qubit coherent error error1 = QuantumError([np.diag([1, -1])]) # 1-qubit coherent error self.assertRaises(NoiseError, lambda: error0.compose(error1)) self.assertRaises(NoiseError, lambda: error1.compose(error0)) def test_compose_both_kraus(self): """Test compose of two kraus errors""" kraus0 = self.kraus_error(0.3) kraus1 = self.kraus_error(0.5) error = QuantumError(kraus0).compose(QuantumError(kraus1)) target = SuperOp(Kraus(kraus0)).compose(Kraus(kraus1)) kraus, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(kraus[0]['name'], 'kraus') self.assertEqual(kraus[0]['qubits'], [0]) self.assertEqual(target, SuperOp(error), msg="Incorrect tensor kraus") def test_compose_both_unitary_instruction(self): """Test compose of two unitary instruction errors.""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=False) error1 = QuantumError(unitaries1, standard_gates=False) error = error0.compose(error1) target = SuperOp(Kraus(unitaries0)).compose(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertEqual(circ[0]['name'], 'unitary') self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(SuperOp(error), target) def test_compose_both_unitary_standard_gates(self): """Test compose of two unitary standard gate errors""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=True) error1 = QuantumError(unitaries1, standard_gates=True) error = error0.compose(error1) target = SuperOp(Kraus(unitaries0)).compose(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertIn(circ[0]['name'], ['s', 'x', 'y', 'z']) self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(SuperOp(error), target) def test_compose_kraus_and_unitary(self): """Test compose of a kraus and unitary error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(kraus).compose(QuantumError(unitaries)) target = SuperOp(Kraus(kraus)).compose(Kraus(unitaries)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(target, SuperOp(error)) def test_compose_unitary_and_kraus(self): """Test compose of a unitary and kraus error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(unitaries).compose(QuantumError(kraus)) target = SuperOp(Kraus(unitaries)).compose(Kraus(kraus)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(target, SuperOp(error)) def test_dot_both_kraus(self): """Test dot of two kraus errors""" kraus0 = self.kraus_error(0.3) kraus1 = self.kraus_error(0.5) error = QuantumError(kraus0).dot(QuantumError(kraus1)) target = SuperOp(Kraus(kraus0)).dot(Kraus(kraus1)) kraus, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(kraus[0]['name'], 'kraus') self.assertEqual(kraus[0]['qubits'], [0]) self.assertEqual(target, SuperOp(error), msg="Incorrect dot kraus") def test_dot_both_unitary_instruction(self): """Test dot of two unitary instruction errors.""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=False) error1 = QuantumError(unitaries1, standard_gates=False) error = error0.dot(error1) target = SuperOp(Kraus(unitaries0)).dot(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertEqual(circ[0]['name'], 'unitary') self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(SuperOp(error), target) def test_dot_both_unitary_standard_gates(self): """Test dot of two unitary standard gate errors""" unitaries0 = self.mixed_unitary_error([0.9, 0.1], ['z', 's']) unitaries1 = self.mixed_unitary_error([0.6, 0.4], ['x', 'y']) error0 = QuantumError(unitaries0, standard_gates=True) error1 = QuantumError(unitaries1, standard_gates=True) error = error0.dot(error1) target = SuperOp(Kraus(unitaries0)).dot(Kraus(unitaries1)) for j in range(4): circ, _ = error.error_term(j) self.assertIn(circ[0]['name'], ['s', 'x', 'y', 'z']) self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(SuperOp(error), target) def test_dot_kraus_and_unitary(self): """Test dot of a kraus and unitary error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(kraus).dot(QuantumError(unitaries)) target = SuperOp(Kraus(kraus)).dot(Kraus(unitaries)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(target, SuperOp(error)) def test_dot_unitary_and_kraus(self): """Test dot of a unitary and kraus error.""" kraus = self.kraus_error(0.4) unitaries = self.depol_error(0.1) error = QuantumError(unitaries).dot(QuantumError(kraus)) target = SuperOp(Kraus(unitaries)).dot(Kraus(kraus)) circ, prob = error.error_term(0) self.assertEqual(prob, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(target, SuperOp(error)) def test_to_quantumchannel_kraus(self): """Test to_quantumchannel for Kraus inputs.""" a_0 = np.array([[1, 0], [0, np.sqrt(1 - 0.3)]], dtype=complex) a_1 = np.array([[0, 0], [0, np.sqrt(0.3)]], dtype=complex) b_0 = np.array([[1, 0], [0, np.sqrt(1 - 0.5)]], dtype=complex) b_1 = np.array([[0, 0], [0, np.sqrt(0.5)]], dtype=complex) target = SuperOp(Kraus([a_0, a_1])).tensor(SuperOp(Kraus([b_0, b_1]))) error = QuantumError([a_0, a_1]).tensor(QuantumError([b_0, b_1])) self.assertEqual(target, error.to_quantumchannel()) def test_to_quantumchannel_circuit(self): """Test to_quantumchannel for circuit inputs.""" noise_ops = [([{ 'name': 'reset', 'qubits': [0] }], 0.2), ([{ 'name': 'reset', 'qubits': [1] }], 0.3), ([{ 'name': 'id', 'qubits': [0] }], 0.5)] error = QuantumError(noise_ops) reset = SuperOp( np.array([[1, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])) iden = SuperOp(np.eye(4)) target = 0.2 * iden.tensor(reset) + 0.3 * reset.tensor( iden) + 0.5 * iden.tensor(iden) self.assertEqual(target, error.to_quantumchannel()) def test_equal(self): """Test two quantum errors are equal""" a_i = np.sqrt(0.25) * standard_gate_unitary('id') a_x = np.sqrt(0.25) * standard_gate_unitary('x') a_y = np.sqrt(0.25) * standard_gate_unitary('y') a_z = np.sqrt(0.25) * standard_gate_unitary('z') error1 = QuantumError([a_i, a_x, a_y, a_z], standard_gates=True) error2 = QuantumError([a_i, a_x, a_y, a_z], standard_gates=False) self.assertEqual(error1, error2) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/test_readout_error.py000066400000000000000000000171351362723322000232720ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ ReadoutError class tests """ import unittest from test.terra import common import numpy as np from qiskit.providers.aer.noise.noiseerror import NoiseError from qiskit.providers.aer.noise.errors.readout_error import ReadoutError class TestReadoutError(common.QiskitAerTestCase): """Testing ReadoutError class""" def test_probabilities_normalized_exception(self): """Test exception is raised for probabilities greater than 1.""" probs = [[0.9, 0.2], [0, 1]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) probs = [[0, 1], [0.9, 0.2]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) def test_probabilities_negative_exception(self): """Test exception is raised for negative probabilities.""" probs = [[1.1, -0.1], [0, 1]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) probs = [[0, 1], [1.1, -0.1]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) def test_probabilities_dimension_exception(self): """Test exception is raised if probabilities are not multi-qubit""" probs = [[1, 0, 0], [0, 1, 0], [0, 1, 0]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) def test_probabilities_length_exception(self): """Test exception is raised if probabilities are different lengths""" probs = [[1, 0, 0, 0], [0, 1]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) probs = [[0, 1], [1, 0, 0, 0]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) probs = [[1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) def test_probabilities_num_outcomes_exception(self): """Test exception is raised if not enough probability vectors""" probs = [[0, 1]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) probs = [[1, 0], [0, 1], [0, 0]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) probs = [[1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 1, 0]] self.assertRaises(NoiseError, lambda: ReadoutError(probs)) def test_1qubit(self): """Test 1-qubit readout error""" # Test circuit: ideal outcome "11" probs = [[1, 0], [0, 1]] roerror_dict = { 'type': 'roerror', 'operations': ['measure'], 'probabilities': probs } roerror = ReadoutError(probs) self.assertEqual(roerror.number_of_qubits, 1) self.assertEqual(roerror.probabilities.tolist(), probs) self.assertEqual(roerror.to_dict(), roerror_dict) def test_2qubit(self): """Test 2-qubit readout error""" # Test circuit: ideal outcome "11" probs = [[0.7, 0.2, 0.1, 0], [0, 0.9, 0.1, 0], [0, 0, 1, 0], [0.1, 0.1, 0.2, 0.6]] roerror_dict = { 'type': 'roerror', 'operations': ['measure'], 'probabilities': probs } roerror = ReadoutError(probs) self.assertEqual(roerror.number_of_qubits, 2) self.assertEqual(roerror.probabilities.tolist(), probs) self.assertEqual(roerror.to_dict(), roerror_dict) def test_tensor(self): """Test tensor of two readout errors.""" probs0 = [[0.9, 0.1], [0.4, 0.6]] probs1 = [[0.5, 0.5], [0.2, 0.8]] probs = np.kron(probs0, probs1).tolist() error_dict = { 'type': 'roerror', 'operations': ['measure'], 'probabilities': probs } error0 = ReadoutError(probs0) error1 = ReadoutError(probs1) error = error0.tensor(error1) self.assertEqual(error.number_of_qubits, 2) self.assertEqual(error.probabilities.tolist(), probs) self.assertEqual(error.to_dict(), error_dict) def test_expand(self): """Test expand of two readout errors.""" probs0 = [[0.9, 0.1], [0.4, 0.6]] probs1 = [[0.5, 0.5], [0.2, 0.8]] probs = np.kron(probs0, probs1).tolist() error_dict = { 'type': 'roerror', 'operations': ['measure'], 'probabilities': probs } error0 = ReadoutError(probs0) error1 = ReadoutError(probs1) error = error1.expand(error0) self.assertEqual(error.number_of_qubits, 2) self.assertEqual(error.probabilities.tolist(), probs) self.assertEqual(error.to_dict(), error_dict) def test_compose(self): """Test compose of two readout errors.""" probs0 = [[0.9, 0.1], [0.4, 0.6]] probs1 = [[0.5, 0.5], [0.2, 0.8]] probs = np.dot(probs1, probs0).tolist() error_dict = { 'type': 'roerror', 'operations': ['measure'], 'probabilities': probs } error0 = ReadoutError(probs0) error1 = ReadoutError(probs1) # compose method error = error0.compose(error1) self.assertEqual(error.number_of_qubits, 1) self.assertEqual(error.probabilities.tolist(), probs) self.assertEqual(error.to_dict(), error_dict) # @ method error = error0 @ error1 self.assertEqual(error.number_of_qubits, 1) self.assertEqual(error.probabilities.tolist(), probs) self.assertEqual(error.to_dict(), error_dict) def test_dot_front(self): """Test dot of two readout errors.""" probs0 = [[0.9, 0.1], [0.4, 0.6]] probs1 = [[0.5, 0.5], [0.2, 0.8]] probs = np.dot(probs1, probs0).tolist() error_dict = { 'type': 'roerror', 'operations': ['measure'], 'probabilities': probs } error0 = ReadoutError(probs0) error1 = ReadoutError(probs1) # dot method error = error1.dot(error0) self.assertEqual(error.number_of_qubits, 1) self.assertEqual(error.probabilities.tolist(), probs) self.assertEqual(error.to_dict(), error_dict) # * method error = error1 * error0 self.assertEqual(error.number_of_qubits, 1) self.assertEqual(error.probabilities.tolist(), probs) self.assertEqual(error.to_dict(), error_dict) def test_equal(self): """Test two readout errors are equal""" error1 = ReadoutError([[0.9, 0.1], [0.5, 0.5]]) error2 = ReadoutError(np.array([[0.9, 0.1], [0.5, 0.5]])) self.assertEqual(error1, error2) def test_to_instruction(self): """Test conversion of ReadoutError to Instruction.""" # 1-qubit case probs1 = [[0.8, 0.2], [0.5, 0.5]] instr1 = ReadoutError(probs1).to_instruction() self.assertEqual(instr1.name, "roerror") self.assertEqual(instr1.num_clbits, 1) self.assertEqual(instr1.num_qubits, 0) self.assertTrue(np.allclose(instr1.params, probs1)) # 2-qubit case probs2 = np.kron(probs1, probs1) instr2 = ReadoutError(probs2).to_instruction() self.assertEqual(instr2.name, "roerror") self.assertEqual(instr2.num_clbits, 2) self.assertEqual(instr2.num_qubits, 0) self.assertTrue(np.allclose(instr2.params, probs2)) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/noise/test_standard_errors.py000066400000000000000000001010121362723322000235760ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Standard error function tests """ import unittest from test.terra import common import numpy as np from qiskit.quantum_info.operators.pauli import Pauli from qiskit.providers.aer.noise.noiseerror import NoiseError from qiskit.providers.aer.noise.errors.errorutils import standard_gate_unitary from qiskit.providers.aer.noise.errors.standard_errors import kraus_error from qiskit.providers.aer.noise.errors.standard_errors import mixed_unitary_error from qiskit.providers.aer.noise.errors.standard_errors import coherent_unitary_error from qiskit.providers.aer.noise.errors.standard_errors import pauli_error from qiskit.providers.aer.noise.errors.standard_errors import depolarizing_error from qiskit.providers.aer.noise.errors.standard_errors import thermal_relaxation_error from qiskit.providers.aer.noise.errors.standard_errors import phase_amplitude_damping_error from qiskit.providers.aer.noise.errors.standard_errors import amplitude_damping_error from qiskit.providers.aer.noise.errors.standard_errors import phase_damping_error # TODO: Test Kraus thermal relaxation error by comparing to amplitude damping channel class TestNoise(common.QiskitAerTestCase): """Testing Standard Errors package""" def test_kraus_error(self): """Test Kraus error when input is list instead of numpy array""" A0 = [[1, 0], [0, np.sqrt(1 - 0.3)]] A1 = [[0, 0], [0, np.sqrt(0.3)]] targets = [A0, A1] error = kraus_error(targets) circ, p = error.error_term(0) self.assertEqual(p, 1) kraus = circ[0] self.assertEqual(kraus['name'], 'kraus') self.assertEqual(kraus['qubits'], [0]) for op in kraus['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus QuantumError") def test_mixed_unitary_error_raise_nonunitary(self): """Test error is raised if input is not unitary.""" A0 = [[1, 0], [0, np.sqrt(1 - 0.3)]] A1 = [[0, 0], [0, np.sqrt(0.3)]] noise_ops = [(A0, 0.5), (A1, 0.5)] self.assertRaises(NoiseError, lambda: mixed_unitary_error(noise_ops)) def test_mixed_unitary_error_raise_differnt_shape(self): """Test error is raised if input matrices different size""" unitaries = [np.eye(4), np.eye(2)] probs = [0.7, 0.4] noise_ops = [(unitaries[0], probs[0]), (unitaries[1], probs[1])] self.assertRaises(NoiseError, lambda: mixed_unitary_error(noise_ops)) def test_mixed_unitary_error(self): """Test construction of mixed unitary error""" unitaries = [np.eye(2), np.diag([1, -1])] probs = [0.7, 0.3] error = mixed_unitary_error([(unitaries[0], probs[0]), (unitaries[1], probs[1])], standard_gates=True) (op0, p0) = error.error_term(0) (op1, p1) = error.error_term(1) self.assertEqual(op0[0], {"name": "z", "qubits": [0]}) self.assertEqual(op1[0], {"name": "id", "qubits": [0]}) self.assertEqual(p0, 0.3) self.assertEqual(p1, 0.7) def test_coherent_unitary_error(self): """Test coherent unitary error""" unitary = np.diag([1, -1, 1, -1]) error = coherent_unitary_error(unitary) ref = mixed_unitary_error([(unitary, 1)]) self.assertEqual(error.to_dict(), ref.to_dict()) def test_pauli_error_raise_invalid(self): """Test exception for invalid Pauli string""" self.assertRaises(NoiseError, lambda: pauli_error([('S', 1)])) def test_pauli_error_1q_unitary_from_string(self): """Test single-qubit pauli error as unitary qobj from string label""" paulis = ['I', 'X', 'Y', 'Z'] probs = [0.4, 0.3, 0.2, 0.1] error = pauli_error(zip(paulis, probs), standard_gates=False) target_unitaries = [standard_gate_unitary('x'), standard_gate_unitary('y'), standard_gate_unitary('z')] target_probs = probs.copy() target_identity_count = 0 for j in range(len(paulis)): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, ('unitary', 'id')) self.assertEqual(circ[0]['qubits'], [0]) self.remove_if_found(p, target_probs) if name == "unitary": self.remove_if_found(circ[0]['params'][0], target_unitaries) else: target_identity_count += 1 self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") self.assertEqual(target_identity_count, 1, msg="Incorrect identities") def test_pauli_error_1q_gate_from_string(self): """Test single-qubit pauli error as gate qobj from string label""" paulis = ['I', 'X', 'Y', 'Z'] probs = [0.4, 0.3, 0.2, 0.1] error = pauli_error(zip(paulis, probs), standard_gates=True) target_circs = [[{"name": "id", "qubits": [0]}], [{"name": "x", "qubits": [0]}], [{"name": "y", "qubits": [0]}], [{"name": "z", "qubits": [0]}]] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) self.remove_if_found(p, target_probs) self.remove_if_found(circ, target_circs) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_circs, [], msg="Incorrect circuits") def test_pauli_error_1q_unitary_from_pauli(self): """Test single-qubit pauli error as unitary qobj from Pauli obj""" paulis = [Pauli.from_label(s) for s in ['I', 'X', 'Y', 'Z']] probs = [0.4, 0.3, 0.2, 0.1] error = pauli_error(zip(paulis, probs), standard_gates=False) target_unitaries = [standard_gate_unitary('x'), standard_gate_unitary('y'), standard_gate_unitary('z')] target_probs = probs.copy() target_identity_count = 0 for j in range(len(paulis)): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, ('unitary', 'id')) self.assertEqual(circ[0]['qubits'], [0]) self.remove_if_found(p, target_probs) if name == "unitary": self.remove_if_found(circ[0]['params'][0], target_unitaries) else: target_identity_count += 1 self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") self.assertEqual(target_identity_count, 1, msg="Incorrect identities") def test_pauli_error_1q_gate_from_pauli(self): """Test single-qubit pauli error as gate qobj from Pauli obj""" paulis = [Pauli.from_label(s) for s in ['I', 'X', 'Y', 'Z']] probs = [0.4, 0.3, 0.2, 0.1] error = pauli_error(zip(paulis, probs), standard_gates=True) target_circs = [[{"name": "id", "qubits": [0]}], [{"name": "x", "qubits": [0]}], [{"name": "y", "qubits": [0]}], [{"name": "z", "qubits": [0]}]] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) self.remove_if_found(p, target_probs) self.remove_if_found(circ, target_circs) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_circs, [], msg="Incorrect circuits") def test_pauli_error_2q_unitary_from_string(self): """Test two-qubit pauli error as unitary qobj from string label""" paulis = ['XY', 'YZ', 'ZX'] probs = [0.5, 0.3, 0.2] error = pauli_error(zip(paulis, probs), standard_gates=False) X = standard_gate_unitary('x') Y = standard_gate_unitary('y') Z = standard_gate_unitary('z') target_unitaries = [np.kron(X, Y), np.kron(Y, Z), np.kron(Z, X)] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, 'unitary') self.assertEqual(circ[0]['qubits'], [0, 1]) self.remove_if_found(p, target_probs) self.remove_if_found(circ[0]['params'][0], target_unitaries) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") def test_pauli_error_2q_unitary_from_string_1q_only(self): """Test two-qubit pauli error as unitary qobj from string label""" paulis = ['XI', 'YI', 'ZI'] probs = [0.5, 0.3, 0.2] error = pauli_error(zip(paulis, probs), standard_gates=False) target_unitaries = [standard_gate_unitary('x'), standard_gate_unitary('y'), standard_gate_unitary('z')] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, 'unitary') self.assertEqual(circ[0]['qubits'], [1]) self.remove_if_found(p, target_probs) self.remove_if_found(circ[0]['params'][0], target_unitaries) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") def test_pauli_error_2q_gate_from_string(self): """Test two-qubit pauli error as gate qobj from string label""" paulis = ['XZ', 'YX', 'ZY'] probs = [0.5, 0.3, 0.2] error = pauli_error(zip(paulis, probs), standard_gates=True) target_circs = [[{"name": "z", "qubits": [0]}, {"name": "x", "qubits": [1]}], [{"name": "x", "qubits": [0]}, {"name": "y", "qubits": [1]}], [{"name": "y", "qubits": [0]}, {"name": "z", "qubits": [1]}]] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) self.remove_if_found(p, target_probs) self.remove_if_found(circ, target_circs) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_circs, [], msg="Incorrect circuits") def test_pauli_error_2q_gate_from_string_1qonly(self): """Test two-qubit pauli error as gate qobj from string label""" paulis = ['XI', 'YI', 'ZI'] probs = [0.5, 0.3, 0.2] error = pauli_error(zip(paulis, probs), standard_gates=True) target_circs = [[{"name": "x", "qubits": [1]}], [{"name": "y", "qubits": [1]}], [{"name": "z", "qubits": [1]}]] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) self.remove_if_found(p, target_probs) self.remove_if_found(circ, target_circs) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_circs, [], msg="Incorrect circuits") def test_pauli_error_2q_unitary_from_pauli(self): """Test two-qubit pauli error as unitary qobj from Pauli obj""" paulis = [Pauli.from_label(s) for s in ['XY', 'YZ', 'ZX']] probs = [0.5, 0.3, 0.2] error = pauli_error(zip(paulis, probs), standard_gates=False) X = standard_gate_unitary('x') Y = standard_gate_unitary('y') Z = standard_gate_unitary('z') target_unitaries = [np.kron(X, Y), np.kron(Y, Z), np.kron(Z, X)] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, 'unitary') self.assertEqual(circ[0]['qubits'], [0, 1]) self.remove_if_found(p, target_probs) self.remove_if_found(circ[0]['params'][0], target_unitaries) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") def test_pauli_error_2q_gate_from_pauli(self): """Test two-qubit pauli error as gate qobj from Pauli obj""" paulis = [Pauli.from_label(s) for s in ['XZ', 'YX', 'ZY']] probs = [0.5, 0.3, 0.2] error = pauli_error(zip(paulis, probs), standard_gates=True) target_circs = [[{"name": "z", "qubits": [0]}, {"name": "x", "qubits": [1]}], [{"name": "x", "qubits": [0]}, {"name": "y", "qubits": [1]}], [{"name": "y", "qubits": [0]}, {"name": "z", "qubits": [1]}]] target_probs = probs.copy() for j in range(len(paulis)): circ, p = error.error_term(j) self.remove_if_found(p, target_probs) self.remove_if_found(circ, target_circs) self.assertEqual(target_probs, [], msg="Incorrect probabilities") self.assertEqual(target_circs, [], msg="Incorrect circuits") def test_depolarizing_error_identity_unitary(self): """Test depolarizing error with p=0 (ideal) as unitary qobj""" # 1 qubit error = depolarizing_error(0, 1, standard_gates=False) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") # 2-qubit error = depolarizing_error(0, 2, standard_gates=False) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") def test_depolarizing_error_ideal(self): """Test depolarizing error with p=0 (ideal) as gate qobj""" # 1 qubit error = depolarizing_error(0, 1, standard_gates=True) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") # 2-qubit error = depolarizing_error(0, 2, standard_gates=True) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") def test_depolarizing_error_1q_unitary(self): """Test 1-qubit depolarizing error as unitary qobj""" p_depol = 0.3 error = depolarizing_error(p_depol, 1, standard_gates=False) target_unitaries = [standard_gate_unitary('x'), standard_gate_unitary('y'), standard_gate_unitary('z')] for j in range(4): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, ('unitary', "id")) self.assertEqual(circ[0]['qubits'], [0]) if name == "unitary": self.assertAlmostEqual(p, p_depol / 4, msg="Incorrect Pauli probability") self.remove_if_found(circ[0]['params'][0], target_unitaries) else: self.assertAlmostEqual(p, 1 - p_depol + p_depol / 4, msg="Incorrect identity probability") self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") def test_depolarizing_error_1q_gate(self): """Test 1-qubit depolarizing error as gate qobj""" p_depol = 0.3 error = depolarizing_error(p_depol, 1, standard_gates=True) target_circs = [[{"name": "id", "qubits": [0]}], [{"name": "x", "qubits": [0]}], [{"name": "y", "qubits": [0]}], [{"name": "z", "qubits": [0]}]] for j in range(4): circ, p = error.error_term(j) self.assertEqual(circ[0]['qubits'], [0]) if circ[0]['name'] == "id": self.assertAlmostEqual(p, 1 - p_depol + p_depol / 4, msg="Incorrect identity probability") else: self.assertAlmostEqual(p, p_depol / 4, msg="Incorrect Pauli probability") self.remove_if_found(circ, target_circs) self.assertEqual(target_circs, [], msg="Incorrect unitaries") def test_depolarizing_error_2q_unitary(self): """Test 2-qubit depolarizing error as unitary qobj""" p_depol = 0.3 error = depolarizing_error(p_depol, 2, standard_gates=False) X = standard_gate_unitary('x') Y = standard_gate_unitary('y') Z = standard_gate_unitary('z') target_unitaries = [X, Y, Z, # on qubit 0 X, Y, Z, # on qubit 1 np.kron(X, X), np.kron(X, Y), np.kron(X, Z), np.kron(Y, X), np.kron(Y, Y), np.kron(Y, Z), np.kron(Z, X), np.kron(Z, Y), np.kron(Z, Z)] for j in range(16): circ, p = error.error_term(j) name = circ[0]['name'] self.assertIn(name, ('unitary', "id")) if name == "unitary": self.assertAlmostEqual(p, p_depol / 16) op = circ[0]['params'][0] qubits = circ[0]['qubits'] if len(op) == 2: self.assertIn(qubits, [[0], [1]]) else: self.assertEqual(qubits, [0, 1]) self.remove_if_found(op, target_unitaries) else: self.assertAlmostEqual(p, 1 - p_depol + p_depol / 16) self.assertEqual(circ[0]['qubits'], [0]) self.assertEqual(target_unitaries, [], msg="Incorrect unitaries") def test_depolarizing_error_2q_gate(self): """Test 2-qubit depolarizing error as gate qobj""" p_depol = 0.3 error = depolarizing_error(p_depol, 2, standard_gates=True) target_circs = [[{"name": "id", "qubits": [0]}], [{"name": "x", "qubits": [0]}], [{"name": "y", "qubits": [0]}], [{"name": "z", "qubits": [0]}], [{"name": "x", "qubits": [1]}], [{"name": "y", "qubits": [1]}], [{"name": "z", "qubits": [1]}], [{"name": "x", "qubits": [0]}, {"name": "x", "qubits": [1]}], [{"name": "x", "qubits": [0]}, {"name": "y", "qubits": [1]}], [{"name": "x", "qubits": [0]}, {"name": "z", "qubits": [1]}], [{"name": "y", "qubits": [0]}, {"name": "x", "qubits": [1]}], [{"name": "y", "qubits": [0]}, {"name": "y", "qubits": [1]}], [{"name": "y", "qubits": [0]}, {"name": "z", "qubits": [1]}], [{"name": "z", "qubits": [0]}, {"name": "x", "qubits": [1]}], [{"name": "z", "qubits": [0]}, {"name": "y", "qubits": [1]}], [{"name": "z", "qubits": [0]}, {"name": "z", "qubits": [1]}]] for j in range(16): circ, p = error.error_term(j) self.remove_if_found(circ, target_circs) if circ == [{"name": "id", "qubits": [0]}]: self.assertAlmostEqual(p, 1 - p_depol + p_depol / 16, msg="Incorrect identity probability") else: self.assertAlmostEqual(p, p_depol / 16, msg="Incorrect Pauli probability") self.assertEqual(target_circs, [], msg="Incorrect unitaries") def test_amplitude_damping_error_raises_invalid_amp_param(self): """Test phase and amplitude damping error raises for invalid amp_param""" self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(-0.5, 0, 0)) self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(1.1, 0, 0)) def test_amplitude_damping_error_raises_invalid_phase_param(self): """Test phase and amplitude damping error raises for invalid amp_param""" self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(0, -0.5, 0)) self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(0, 1.1, 0)) def test_amplitude_damping_error_raises_invalid_excited_state_pop(self): """Test phase and amplitude damping error raises for invalid pop""" self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(0, 0, -0.5)) self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(0, 0, 1.1)) def test_amplitude_damping_error_raises_invalid_combined_params(self): """Test phase and amplitude damping error raises for invalid pop""" self.assertRaises(NoiseError, lambda: phase_amplitude_damping_error(0.5, 0.6, 0)) def test_phase_amplitude_damping_error_noncanonical(self): """Test phase maplitude damping channel has correct number of ops""" error = phase_amplitude_damping_error(0.25, 0.5, 0.3, canonical_kraus=False) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) self.assertEqual(len(circ[0]['params']), 6, msg="Incorrect number of kraus matrices") def test_phase_amplitude_damping_error_canonical(self): """Test phase maplitude damping channel has correct number of ops""" error = phase_amplitude_damping_error(0.25, 0.5, 0.3, canonical_kraus=True) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) self.assertEqual(len(circ[0]['params']), 4, msg="Incorrect number of kraus matrices") def test_amplitude_damping_error_ideal_noncanonical(self): """Test amplitude damping error with param=0 and noncanonical kraus""" error = amplitude_damping_error(0, excited_state_population=0.5, canonical_kraus=False) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") def test_amplitude_damping_error_full_0state_canonical(self): """Test amplitude damping error with param=1 and canonical kraus""" error = amplitude_damping_error(1, excited_state_population=0, canonical_kraus=True) targets = [np.diag([1, 0]), np.array([[0, 1], [0, 0]])] circ, p = error.error_term(0) self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_amplitude_damping_error_full_1state_canonical(self): """Test amplitude damping error with param=1 and canonical kraus""" error = amplitude_damping_error(1, excited_state_population=1, canonical_kraus=True) targets = [np.diag([0, 1]), np.array([[0, 0], [1, 0]])] circ, p = error.error_term(0) self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_amplitude_damping_error_full_0state_noncanonical(self): """Test amplitude damping error with param=1 and canonical kraus""" error = amplitude_damping_error(1, excited_state_population=0, canonical_kraus=False) targets = [np.diag([1, 0]), np.array([[0, 1], [0, 0]])] circ, p = error.error_term(0) self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_amplitude_damping_error_full_1state_noncanonical(self): """Test amplitude damping error with param=1 and canonical kraus""" error = amplitude_damping_error(1, excited_state_population=1, canonical_kraus=False) targets = [np.diag([0, 1]), np.array([[0, 0], [1, 0]])] circ, p = error.error_term(0) self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_phase_damping_error_ideal(self): """Test phase damping error with param=0 (ideal)""" error = phase_damping_error(0) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") def test_phase_damping_error_full_canonical(self): """Test phase damping error with param=1 and canonical kraus""" error = phase_damping_error(1, canonical_kraus=True) circ, p = error.error_term(0) targets = [np.diag([1, 0]), np.diag([0, 1])] self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_phase_damping_error_full_noncanonical(self): """Test phase damping error with param=1 and non-canonical kraus""" error = phase_damping_error(1, canonical_kraus=False) circ, p = error.error_term(0) targets = [np.diag([1, 0]), np.diag([0, 1])] self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_phase_damping_error_canonical(self): """Test phase damping error with canonical kraus""" p_phase = 0.3 error = phase_damping_error(p_phase, canonical_kraus=True) # The canonical form of this channel should be a mixed # unitary dephasing channel targets = [[{'name': 'z', 'qubits': [0]}], [{'name': 'id', 'qubits': [0]}]] for j in range(2): circ, p = error.error_term(j) self.assertEqual(circ[0]["qubits"], [0]) self.remove_if_found(circ, targets) self.assertEqual(targets, [], msg="Incorrect canonical circuits") def test_phase_damping_error_noncanonical(self): """Test phase damping error with non-canonical kraus""" p_phase = 0.3 error = phase_damping_error(0.3, canonical_kraus=False) circ, p = error.error_term(0) targets = [np.array([[1, 0], [0, np.sqrt(1 - p_phase)]]), np.array([[0, 0], [0, np.sqrt(p_phase)]])] self.assertEqual(p, 1, msg="Kraus probability") self.assertEqual(circ[0]["qubits"], [0]) for op in circ[0]['params']: self.remove_if_found(op, targets) self.assertEqual(targets, [], msg="Incorrect kraus matrices") def test_thermal_relaxation_error_raises_invalid_t2(self): """Test raises error for invalid t2 parameters""" # T2 == 0 self.assertRaises(NoiseError, lambda: thermal_relaxation_error(1, 0, 0)) # T2 < 0 self.assertRaises(NoiseError, lambda: thermal_relaxation_error(1, -1, 0)) def test_thermal_relaxation_error_raises_invalid_t1(self): """Test raises error for invalid t1 parameters""" # T1 == 0 self.assertRaises(NoiseError, lambda: thermal_relaxation_error(0, 0, 0)) # T1 < 0 self.assertRaises(NoiseError, lambda: thermal_relaxation_error(-0.1, 0.1, 0)) def test_thermal_relaxation_error_raises_invalid_t1_t2(self): """Test raises error for invalid t2 > 2 * t1 parameters""" # T2 > 2 * T1 self.assertRaises(NoiseError, lambda: thermal_relaxation_error(1, 2.1, 0)) def test_thermal_relaxation_error_t1_t2_inf_ideal(self): """Test t1 = t2 = inf returns identity channel""" error = thermal_relaxation_error(np.inf, np.inf, 0) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") def test_thermal_relaxation_error_zero_time_ideal(self): """Test gate_time = 0 returns identity channel""" error = thermal_relaxation_error(2, 3, 0) circ, p = error.error_term(0) self.assertEqual(p, 1, msg="ideal probability") self.assertEqual(circ[0], {"name": "id", "qubits": [0]}, msg="ideal circuit") def test_thermal_relaxation_error_t1_equal_t2_0state(self): """Test qobj instructions return for t1=t2""" error = thermal_relaxation_error(1, 1, 1) targets = [[{'name': 'id', 'qubits': [0]}], [{'name': 'reset', 'qubits': [0]}]] probs = [np.exp(-1), 1 - np.exp(-1)] for j in range(2): circ, p = error.error_term(j) self.remove_if_found(circ, targets) if circ[0]['name'] == 'id': self.assertAlmostEqual(p, probs[0], msg="identity probability") else: self.assertAlmostEqual(p, probs[1], msg="reset probability") self.assertEqual(targets, [], msg="relaxation circuits") def test_thermal_relaxation_error_t1_equal_t2_1state(self): """Test qobj instructions return for t1=t2""" error = thermal_relaxation_error(1, 1, 1, 1) targets = [[{'name': 'id', 'qubits': [0]}], [{'name': 'reset', 'qubits': [0]}, {'name': 'x', 'qubits': [0]}]] probs = [np.exp(-1), 1 - np.exp(-1)] for j in range(2): circ, p = error.error_term(j) self.remove_if_found(circ, targets) if circ[0]['name'] == 'id': self.assertAlmostEqual(p, probs[0], msg="identity probability") else: self.assertAlmostEqual(p, probs[1], msg="reset probability") self.assertEqual(targets, [], msg="relaxation circuits") def test_thermal_relaxation_error_gate(self): """Test qobj instructions return for t2 < t1""" t1, t2, time, p1 = (2, 1, 1, 0.3) error = thermal_relaxation_error(t1, t2, time, p1) targets = [[{'name': 'id', 'qubits': [0]}], [{'name': 'z', 'qubits': [0]}], [{'name': 'reset', 'qubits': [0]}], [{'name': 'reset', 'qubits': [0]}, {'name': 'x', 'qubits': [0]}]] p_reset0 = (1 - p1) * (1 - np.exp(-1 / t1)) p_reset1 = p1 * (1 - np.exp(-1 / t1)) p_z = 0.5 * np.exp(-1 / t1) * (1 - np.exp(-(1 / t2 - 1 / t1) * time)) p_id = 1 - p_z - p_reset0 - p_reset1 for j in range(4): circ, p = error.error_term(j) self.remove_if_found(circ, targets) name = circ[0]['name'] if circ[0]['name'] == 'id': self.assertAlmostEqual(p, p_id, msg="identity probability") elif name == 'z': self.assertAlmostEqual(p, p_z, msg="Z error probability") elif len(circ) == 1: self.assertAlmostEqual(p, p_reset0, msg="reset-0 probability") else: self.assertAlmostEqual(p, p_reset1, msg="reset-1 probability") self.assertEqual(targets, [], msg="relaxation circuits") def test_thermal_relaxation_error_kraus(self): """Test non-kraus instructions return for t2 < t1""" t1, t2, time, p1 = (1, 2, 1, 0.3) error = thermal_relaxation_error(t1, t2, time, p1) circ, p = error.error_term(0) self.assertEqual(p, 1) self.assertEqual(circ[0]['name'], 'kraus') self.assertEqual(circ[0]['qubits'], [0]) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/openpulse/000077500000000000000000000000001362723322000176735ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/openpulse/__init__.py000066400000000000000000000020701362723322000220030ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. ''' Terra tests ''' import os def load_tests(loader, standard_tests, pattern): """ test suite for unittest discovery """ this_dir = os.path.dirname(__file__) if pattern in ['test*.py', '*_test.py']: package_tests = loader.discover(start_dir=this_dir, pattern=pattern) standard_tests.addTests(package_tests) elif pattern in ['profile*.py', '*_profile.py']: loader.testMethodPrefix = 'profile' package_tests = loader.discover(start_dir=this_dir, pattern='test*.py') standard_tests.addTests(package_tests) return standard_tests qiskit-aer-0.4.1/test/terra/openpulse/test_duffing_model_generators.py000066400000000000000000000650321362723322000263450ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Tests for pulse system generator functions """ import unittest from numpy import array, array_equal, kron from test.terra.common import QiskitAerTestCase from qiskit.providers.aer.pulse.pulse_system_model import PulseSystemModel from qiskit.providers.aer.pulse.hamiltonian_model import HamiltonianModel from qiskit.providers.aer.pulse import duffing_model_generators as model_gen from qiskit.providers.aer.pulse.qobj.op_qobj import get_oper class TestDuffingModelGenerators(QiskitAerTestCase): """Tests for functions in duffing_model_generators.py""" def setUp(self): pass def test_duffing_system_model1(self): """First test of duffing_system_model, 2 qubits, 2 dimensional""" dim_oscillators = 2 oscillator_freqs = [5.0, 5.1] anharm_freqs = [-0.33, -0.33] drive_strengths = [1.1, 1.2] coupling_dict = {(0,1): 0.02} dt = 1.3 system_model = model_gen.duffing_system_model(dim_oscillators, oscillator_freqs, anharm_freqs, drive_strengths, coupling_dict, dt) cr_idx_dict = {label: idx for idx, label in enumerate(system_model.control_channel_labels)} # check basic parameters self.assertEqual(system_model.subsystem_list, [0, 1]) self.assertEqual(system_model.dt, 1.3) # check that cr_idx_dict is correct self.assertEqual(cr_idx_dict, {(0,1): 0, (1,0): 1}) self.assertEqual(system_model.control_channel_index((0,1)), 0) # check u_channel_lo is correct self.assertEqual(system_model.u_channel_lo, [[{'scale': [1.0, 0.0], 'q' : 1}], [{'scale': [1.0, 0.0], 'q' : 0}]]) # check consistency of system_model.u_channel_lo with cr_idx_dict # this should in principle be redundant with the above two checks for q_pair, idx in cr_idx_dict.items(): self.assertEqual(system_model.u_channel_lo[idx], [{'scale': [1.0, 0.0], 'q' : q_pair[1]}]) # check correct hamiltonian ham_model = system_model.hamiltonian expected_vars = {'v0': 5.0, 'v1': 5.1, 'alpha0': -0.33, 'alpha1': -0.33, 'r0': 1.1, 'r1': 1.2, 'j01': 0.02} self.assertEqual(ham_model._variables, expected_vars) self.assertEqual(ham_model._subsystem_dims, {0: 2, 1: 2}) self._compare_str_lists(list(ham_model._channels), ['D0', 'D1', 'U0', 'U1']) # check that Hamiltonian terms have been imported correctly # constructing the expected_terms requires some knowledge of how the strings get generated # and then parsed O0 = self._operator_array_from_str(2, ['I', 'O']) O1 = self._operator_array_from_str(2, ['O', 'I']) OO0 = O0@O0 OO1 = O1@O1 X0 = self._operator_array_from_str(2, ['I', 'X']) X1 = self._operator_array_from_str(2, ['X', 'I']) exchange = self._operator_array_from_str(2, ['Sm', 'Sp']) + self._operator_array_from_str(2, ['Sp', 'Sm']) expected_terms = [('np.pi*(2*v0-alpha0)', O0), ('np.pi*(2*v1-alpha1)', O1), ('np.pi*alpha0', OO0), ('np.pi*alpha1', OO1), ('2*np.pi*r0*D0', X0), ('2*np.pi*r1*D1', X1), ('2*np.pi*j01', exchange), ('2*np.pi*r0*U0', X0), ('2*np.pi*r1*U1', X1)] # first check the number of terms is correct, then loop through # each expected term and verify that it is present and consistent self.assertEqual(len(ham_model._system), len(expected_terms)) for expected_string, expected_op in expected_terms: idx = 0 found = False while idx < len(ham_model._system) and found is False: op, string = ham_model._system[idx] if expected_string == string: found = True self.assertTrue(array_equal(expected_op, op)) idx += 1 self.assertTrue(found) def test_duffing_system_model2(self): """Second test of duffing_system_model, 3 qubits, 3 dimensional""" # do similar tests for different model dim_oscillators = 3 oscillator_freqs = [5.0, 5.1, 5.2] anharm_freqs = [-0.33, -0.33, -0.32] drive_strengths = [1.1, 1.2, 1.3] coupling_dict = {(1,2): 0.03, (0,1): 0.02} dt = 1.3 system_model = model_gen.duffing_system_model(dim_oscillators, oscillator_freqs, anharm_freqs, drive_strengths, coupling_dict, dt) cr_idx_dict = {label: idx for idx, label in enumerate(system_model.control_channel_labels)} # check basic parameters self.assertEqual(system_model.subsystem_list, [0, 1, 2]) self.assertEqual(system_model.dt, 1.3) # check that cr_idx_dict is correct self.assertEqual(cr_idx_dict, {(0,1): 0, (1,0): 1, (1,2): 2, (2,1): 3}) self.assertEqual(system_model.control_channel_index((1,2)), 2) # check u_channel_lo is correct self.assertEqual(system_model.u_channel_lo, [[{'scale': [1.0, 0.0], 'q' : 1}], [{'scale': [1.0, 0.0], 'q' : 0}], [{'scale': [1.0, 0.0], 'q' : 2}], [{'scale': [1.0, 0.0], 'q' : 1}]]) # check consistency of system_model.u_channel_lo with cr_idx_dict # this should in principle be redundant with the above two checks for q_pair, idx in cr_idx_dict.items(): self.assertEqual(system_model.u_channel_lo[idx], [{'scale': [1.0, 0.0], 'q' : q_pair[1]}]) # check correct hamiltonian ham_model = system_model.hamiltonian expected_vars = {'v0': 5.0, 'v1': 5.1, 'v2': 5.2, 'alpha0': -0.33, 'alpha1': -0.33, 'alpha2': -0.32, 'r0': 1.1, 'r1': 1.2, 'r2': 1.3, 'j01': 0.02, 'j12': 0.03} self.assertEqual(ham_model._variables, expected_vars) self.assertEqual(ham_model._subsystem_dims, {0: 3, 1: 3, 2: 3}) self._compare_str_lists(list(ham_model._channels), ['D0', 'D1', 'D3', 'U0', 'U1', 'U2', 'U3']) # check that Hamiltonian terms have been imported correctly # constructing the expected_terms requires some knowledge of how the strings get generated # and then parsed O0 = self._operator_array_from_str(3, ['I', 'I', 'O']) O1 = self._operator_array_from_str(3, ['I', 'O', 'I']) O2 = self._operator_array_from_str(3, ['O', 'I', 'I']) OO0 = O0@O0 OO1 = O1@O1 OO2 = O2@O2 X0 = self._operator_array_from_str(3, ['I', 'I', 'A']) + self._operator_array_from_str(3, ['I', 'I', 'C']) X1 = self._operator_array_from_str(3, ['I', 'A', 'I']) + self._operator_array_from_str(3, ['I', 'C', 'I']) X2 = self._operator_array_from_str(3, ['A', 'I', 'I']) + self._operator_array_from_str(3, ['C', 'I', 'I']) exchange01 = self._operator_array_from_str(3, ['I', 'Sm', 'Sp']) + self._operator_array_from_str(3, ['I', 'Sp', 'Sm']) exchange12 = self._operator_array_from_str(3, ['Sm', 'Sp', 'I']) + self._operator_array_from_str(3, ['Sp', 'Sm', 'I']) expected_terms = [('np.pi*(2*v0-alpha0)', O0), ('np.pi*(2*v1-alpha1)', O1), ('np.pi*(2*v2-alpha2)', O2), ('np.pi*alpha0', OO0), ('np.pi*alpha1', OO1), ('np.pi*alpha2', OO2), ('2*np.pi*r0*D0', X0), ('2*np.pi*r1*D1', X1), ('2*np.pi*r2*D2', X2), ('2*np.pi*j01', exchange01), ('2*np.pi*j12', exchange12), ('2*np.pi*r0*U0', X0), ('2*np.pi*r1*U1', X1), ('2*np.pi*r1*U2', X1), ('2*np.pi*r2*U3', X2)] # first check the number of terms is correct, then loop through # each expected term and verify that it is present and consistent self.assertEqual(len(ham_model._system), len(expected_terms)) for expected_string, expected_op in expected_terms: idx = 0 found = False while idx < len(ham_model._system) and found is False: op, string = ham_model._system[idx] if expected_string == string: found = True self.assertTrue(array_equal(expected_op, op)) idx += 1 self.assertTrue(found) def test_duffing_system_model3(self): """Third test of duffing_system_model, 4 qubits, 2 dimensional""" # do similar tests for different model dim_oscillators = 2 oscillator_freqs = [5.0, 5.1, 5.2, 5.3] anharm_freqs = [-0.33, -0.33, -0.32, -0.31] drive_strengths = [1.1, 1.2, 1.3, 1.4] coupling_dict = {(0,2): 0.03, (1,0): 0.02, (0,3): 0.14, (3,1): 0.18, (1,2) : 0.33} dt = 1.3 system_model = model_gen.duffing_system_model(dim_oscillators, oscillator_freqs, anharm_freqs, drive_strengths, coupling_dict, dt) cr_idx_dict = {label: idx for idx, label in enumerate(system_model.control_channel_labels)} # check basic parameters self.assertEqual(system_model.subsystem_list, [0, 1, 2, 3]) self.assertEqual(system_model.dt, 1.3) # check that cr_idx_dict is correct self.assertEqual(cr_idx_dict, {(0,1): 0, (1,0): 1, (0,2): 2, (2,0): 3, (0,3): 4, (3,0): 5, (1,2): 6, (2,1): 7, (1,3): 8, (3,1): 9}) self.assertEqual(system_model.control_channel_index((1,2)), 6) # check u_channel_lo is correct self.assertEqual(system_model.u_channel_lo, [[{'scale': [1.0, 0.0], 'q' : 1}], [{'scale': [1.0, 0.0], 'q' : 0}], [{'scale': [1.0, 0.0], 'q' : 2}], [{'scale': [1.0, 0.0], 'q' : 0}], [{'scale': [1.0, 0.0], 'q' : 3}], [{'scale': [1.0, 0.0], 'q' : 0}], [{'scale': [1.0, 0.0], 'q' : 2}], [{'scale': [1.0, 0.0], 'q' : 1}], [{'scale': [1.0, 0.0], 'q' : 3}], [{'scale': [1.0, 0.0], 'q' : 1}]]) # check consistency of system_model.u_channel_lo with cr_idx_dict # this should in principle be redundant with the above two checks for q_pair, idx in cr_idx_dict.items(): self.assertEqual(system_model.u_channel_lo[idx], [{'scale': [1.0, 0.0], 'q' : q_pair[1]}]) # check correct hamiltonian ham_model = system_model.hamiltonian expected_vars = {'v0': 5.0, 'v1': 5.1, 'v2': 5.2, 'v3': 5.3, 'alpha0': -0.33, 'alpha1': -0.33, 'alpha2': -0.32, 'alpha3': -0.31, 'r0': 1.1, 'r1': 1.2, 'r2': 1.3, 'r3': 1.4, 'j01': 0.02, 'j02': 0.03, 'j03': 0.14, 'j12': 0.33, 'j13': 0.18} self.assertEqual(ham_model._variables, expected_vars) self.assertEqual(ham_model._subsystem_dims, {0: 2, 1: 2, 2: 2, 3: 2}) self._compare_str_lists(list(ham_model._channels), ['D0', 'D1', 'D3', 'D4', 'U0', 'U1', 'U2', 'U3', 'U4', 'U5', 'U6', 'U7', 'U8', 'U9']) # check that Hamiltonian terms have been imported correctly # constructing the expected_terms requires some knowledge of how the strings get generated # and then parsed O0 = self._operator_array_from_str(2, ['I', 'I', 'I', 'O']) O1 = self._operator_array_from_str(2, ['I', 'I', 'O', 'I']) O2 = self._operator_array_from_str(2, ['I', 'O', 'I', 'I']) O3 = self._operator_array_from_str(2, ['O', 'I', 'I', 'I']) OO0 = O0@O0 OO1 = O1@O1 OO2 = O2@O2 OO3 = O3@O3 X0 = self._operator_array_from_str(2, ['I','I', 'I', 'A']) + self._operator_array_from_str(2, ['I', 'I', 'I', 'C']) X1 = self._operator_array_from_str(2, ['I', 'I', 'A', 'I']) + self._operator_array_from_str(2, ['I', 'I', 'C', 'I']) X2 = self._operator_array_from_str(2, ['I', 'A', 'I', 'I']) + self._operator_array_from_str(2, ['I', 'C', 'I', 'I']) X3 = self._operator_array_from_str(2, ['A', 'I', 'I', 'I']) + self._operator_array_from_str(2, ['C', 'I', 'I', 'I']) exchange01 = self._operator_array_from_str(2, ['I', 'I', 'Sm', 'Sp']) + self._operator_array_from_str(2, ['I', 'I', 'Sp', 'Sm']) exchange02 = self._operator_array_from_str(2, ['I', 'Sm', 'I', 'Sp']) + self._operator_array_from_str(2, ['I', 'Sp', 'I', 'Sm']) exchange03 = self._operator_array_from_str(2, ['Sm', 'I', 'I', 'Sp']) + self._operator_array_from_str(2, ['Sp', 'I', 'I', 'Sm']) exchange12 = self._operator_array_from_str(2, ['I', 'Sm', 'Sp', 'I']) + self._operator_array_from_str(2, ['I', 'Sp', 'Sm', 'I']) exchange13 = self._operator_array_from_str(2, ['Sm', 'I', 'Sp', 'I']) + self._operator_array_from_str(2, ['Sp', 'I', 'Sm', 'I']) expected_terms = [('np.pi*(2*v0-alpha0)', O0), ('np.pi*(2*v1-alpha1)', O1), ('np.pi*(2*v2-alpha2)', O2), ('np.pi*(2*v3-alpha3)', O3), ('np.pi*alpha0', OO0), ('np.pi*alpha1', OO1), ('np.pi*alpha2', OO2), ('np.pi*alpha3', OO3), ('2*np.pi*r0*D0', X0), ('2*np.pi*r1*D1', X1), ('2*np.pi*r2*D2', X2), ('2*np.pi*r3*D3', X3), ('2*np.pi*j01', exchange01), ('2*np.pi*j02', exchange02), ('2*np.pi*j03', exchange03), ('2*np.pi*j12', exchange12), ('2*np.pi*j13', exchange13), ('2*np.pi*r0*U0', X0), ('2*np.pi*r1*U1', X1), ('2*np.pi*r0*U2', X0), ('2*np.pi*r2*U3', X2), ('2*np.pi*r0*U4', X0), ('2*np.pi*r3*U5', X3), ('2*np.pi*r1*U6', X1), ('2*np.pi*r2*U7', X2), ('2*np.pi*r1*U8', X1), ('2*np.pi*r3*U9', X3)] # first check the number of terms is correct, then loop through # each expected term and verify that it is present and consistent self.assertEqual(len(ham_model._system), len(expected_terms)) for expected_string, expected_op in expected_terms: idx = 0 found = False while idx < len(ham_model._system) and found is False: op, string = ham_model._system[idx] if expected_string == string: found = True self.assertTrue(array_equal(expected_op, op)) idx += 1 self.assertTrue(found) def test_duffing_hamiltonian_dict(self): """Test _duffing_hamiltonian_dict""" oscillators = [0, 1] oscillator_dims = [2, 2] oscillator_freqs = [5.0, 5.1] freq_symbols = ['v0', 'v1'] anharm_freqs = [-0.33, -0.33] anharm_symbols = ['a0', 'a1'] drive_strengths = [1.1, 1.2] drive_symbols = ['r0', 'r1'] ordered_coupling_edges = [(0,1)] coupling_strengths = [0.02] coupling_symbols = ['j'] cr_idx_dict = {(0,1): 0} expected = {'h_str': ['np.pi*(2*v0-a0)*O0','np.pi*(2*v1-a1)*O1', 'np.pi*a0*O0*O0', 'np.pi*a1*O1*O1', '2*np.pi*r0*X0||D0', '2*np.pi*r1*X1||D1', '2*np.pi*j*(Sp0*Sm1+Sm0*Sp1)', '2*np.pi*r0*X0||U0'], 'vars': {'v0': 5.0, 'v1': 5.1, 'a0': -0.33, 'a1' : -0.33, 'r0': 1.1, 'r1' : 1.2, 'j' : 0.02}, 'qub': {'0': 2, '1': 2}} output = model_gen._duffing_hamiltonian_dict(oscillators, oscillator_dims, oscillator_freqs, freq_symbols, anharm_freqs, anharm_symbols, drive_strengths, drive_symbols, ordered_coupling_edges, coupling_strengths, coupling_symbols, cr_idx_dict) self._compare_str_lists(output['h_str'], expected['h_str']) self.assertEqual(output['vars'], expected['vars']) self.assertEqual(output['qub'], expected['qub']) # test 3 oscillators with mixed up inputs oscillators = [0, 1, 2] oscillator_dims = [2, 2, 3] oscillator_freqs = [5.0, 5.1, 4.9] freq_symbols = ['v0', 'v1', 'x3'] anharm_freqs = [-0.33, -0.33, 1.] anharm_symbols = ['a0', 'a1', 'z4'] drive_strengths = [1.1, 1.2, 0.98] drive_symbols = ['r0', 'r1', 'sa'] ordered_coupling_edges = [(0,1), (1,2), (2,0)] coupling_strengths = [0.02, 0.1, 0.33] coupling_symbols = ['j', 's', 'r'] cr_idx_dict = {(0,1): 0, (2,0): 1, (1,2): 2} expected = {'h_str': ['np.pi*(2*v0-a0)*O0','np.pi*(2*v1-a1)*O1', 'np.pi*(2*x3-z4)*O2', 'np.pi*a0*O0*O0', 'np.pi*a1*O1*O1', 'np.pi*z4*O2*O2', '2*np.pi*r0*X0||D0', '2*np.pi*r1*X1||D1', '2*np.pi*sa*X2||D2', '2*np.pi*j*(Sp0*Sm1+Sm0*Sp1)','2*np.pi*s*(Sp1*Sm2+Sm1*Sp2)', '2*np.pi*r*(Sp0*Sm2+Sm0*Sp2)', '2*np.pi*r0*X0||U0', '2*np.pi*sa*X2||U1', '2*np.pi*r1*X1||U2'], 'vars': {'v0': 5.0, 'v1': 5.1, 'x3': 4.9, 'a0': -0.33, 'a1' : -0.33, 'z4': 1., 'r0': 1.1, 'r1' : 1.2, 'sa': 0.98, 'j' : 0.02, 's': 0.1, 'r': 0.33}, 'qub': {'0': 2, '1': 2, '2': 3}} output = model_gen._duffing_hamiltonian_dict(oscillators, oscillator_dims, oscillator_freqs, freq_symbols, anharm_freqs, anharm_symbols, drive_strengths, drive_symbols, ordered_coupling_edges, coupling_strengths, coupling_symbols, cr_idx_dict) self._compare_str_lists(output['h_str'], expected['h_str']) self.assertEqual(output['vars'], expected['vars']) self.assertEqual(output['qub'], expected['qub']) def test_cr_lo_list(self): """Test _cr_lo_list""" cr_dict = {(0,1): 0, (1,0) : 1, (3,4) : 2} expected = [[{'scale' : [1.0, 0], 'q' : 1}], [{'scale' : [1.0, 0], 'q' : 0}], [{'scale' : [1.0, 0], 'q' : 4}]] self.assertEqual(model_gen._cr_lo_list(cr_dict), expected) cr_dict = {(0,1): 0, (3,4) : 2, (1,0) : 1} expected = [[{'scale' : [1.0, 0], 'q' : 1}], [{'scale' : [1.0, 0], 'q' : 0}], [{'scale' : [1.0, 0], 'q' : 4}]] self.assertEqual(model_gen._cr_lo_list(cr_dict), expected) def test_single_term_generators(self): """Test various functions for individual terms: _single_duffing_drift_terms, _drive_terms, _exchange_coupling_terms, _cr_terms """ # single duffing terms self.assertEqual(model_gen._single_duffing_drift_terms(freq_symbols='v', anharm_symbols='a', system_list=0), ['np.pi*(2*v-a)*O0', 'np.pi*a*O0*O0']) self.assertEqual(model_gen._single_duffing_drift_terms(freq_symbols=['v0','v1'], anharm_symbols=['a0','a1'], system_list=[2, 3]), ['np.pi*(2*v0-a0)*O2', 'np.pi*(2*v1-a1)*O3', 'np.pi*a0*O2*O2', 'np.pi*a1*O3*O3']) # drive terms self.assertEqual(model_gen._drive_terms(drive_symbols='r', system_list=0), ['2*np.pi*r*X0||D0']) self.assertEqual(model_gen._drive_terms(drive_symbols=['r0', 'r1'], system_list=[1, 2]), ['2*np.pi*r0*X1||D1', '2*np.pi*r1*X2||D2']) # exchange coupling symbols = 'j' edges = [(0,1)] expected = ['2*np.pi*j*(Sp0*Sm1+Sm0*Sp1)'] self.assertEqual(model_gen._exchange_coupling_terms(symbols, edges), expected) symbols = ['j','k'] edges = [(0,1), (3,2)] expected = ['2*np.pi*j*(Sp0*Sm1+Sm0*Sp1)', '2*np.pi*k*(Sp3*Sm2+Sm3*Sp2)'] self.assertEqual(model_gen._exchange_coupling_terms(symbols, edges), expected) # cross resonance terms symbols = 'r' driven_indices = 0 u_channel_indices = [1] expected = ['2*np.pi*r*X0||U1'] self.assertEqual(model_gen._cr_terms(symbols, driven_indices, u_channel_indices), expected) symbols = ['r','s'] driven_indices = [0,3] u_channel_indices = [1,1] expected = ['2*np.pi*r*X0||U1', '2*np.pi*s*X3||U1'] self.assertEqual(model_gen._cr_terms(symbols, driven_indices, u_channel_indices), expected) def test_str_list_generator(self): """Test _str_list_generator""" # test one argument template = 'First: {0}' self.assertEqual(model_gen._str_list_generator(template, 'a'), ['First: a']) self.assertEqual(model_gen._str_list_generator(template, ['a1', 'a2']), ['First: a1', 'First: a2']) # test multiple arguments template = 'First: {0}, Second: {1}' self.assertEqual(model_gen._str_list_generator(template, 'a', 'b'), ['First: a, Second: b']) self.assertEqual(model_gen._str_list_generator(template, ['a1', 'a2'], ['b1', 'b2']), ['First: a1, Second: b1', 'First: a2, Second: b2']) def test_arg_to_iterable(self): """Test _arg_to_iterable.""" self.assertEqual(model_gen._arg_to_iterable('a'), ['a']) self.assertEqual(model_gen._arg_to_iterable(['a']), ['a']) self.assertEqual(model_gen._arg_to_iterable(('a','b')), ('a','b')) self.assertEqual(model_gen._arg_to_iterable({'a','b'}), {'a','b'}) def test_CouplingGraph(self): """Test CouplingGraph class.""" coupling_graph = model_gen.CouplingGraph([(0,1), (1,0), (3,2), (1,2)]) # test constructor, including catching of duplicate entries self.assertEqual(len(coupling_graph.graph), 3) self.assertEqual(coupling_graph.sorted_graph, [(0,1), (1,2), (2,3)]) self.assertEqual(coupling_graph.sorted_two_way_graph, [(0,1), (1,0), (1,2), (2,1), (2,3), (3,2)]) self.assertEqual(coupling_graph.two_way_graph_dict, {(0,1): 0, (1,0) : 1, (1,2) : 2, (2,1) : 3, (2,3) : 4, (3,2) : 5}) # test sorted_edge_index, and that it treats (1,2) and (2,1) as the same edge self.assertEqual(coupling_graph.sorted_edge_index((1,2)), 1) self.assertEqual(coupling_graph.sorted_edge_index((2,1)), 1) # test two_way_edge_index, and that it treats (1,2) and (2,1) as different self.assertEqual(coupling_graph.two_way_edge_index((1,2)), 2) self.assertEqual(coupling_graph.two_way_edge_index((2,1)), 3) def _compare_str_lists(self, list1, list2): """Helper function for checking that the contents of string lists are the same when order doesn't matter. Args: list1 (list): A list of strings list2 (list): A list of strings """ list1_copy = list1.copy() list2_copy = list1.copy() self.assertEqual(len(list1_copy), len(list2_copy)) list1_copy.sort() list2_copy.sort() for str1, str2 in zip(list1_copy, list2_copy): self.assertEqual(str1, str2) def _operator_array_from_str(self, dim, op_str_list): op = array([[1.]]) for c in op_str_list: op = kron(op, get_oper(c, dim)) return op qiskit-aer-0.4.1/test/terra/openpulse/test_pulse_digest.py000066400000000000000000000134641362723322000240030ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Tests for option handling in digest.py """ import unittest from test.terra.common import QiskitAerTestCase import qiskit import qiskit.pulse as pulse from qiskit.pulse import pulse_lib from qiskit.compiler import assemble from qiskit.providers.aer.pulse.pulse_system_model import PulseSystemModel from qiskit.providers.aer.pulse.hamiltonian_model import HamiltonianModel from qiskit.providers.aer.pulse.qobj.digest import digest_pulse_obj class TestDigest(QiskitAerTestCase): """Testing of functions in providers.aer.pulse.qobj.digest.""" def setUp(self): self.backend_sim = backend_sim = qiskit.Aer.get_backend('pulse_simulator') def test_qubit_lo_freq_handling(self): """Test how digest_pulse_obj retrieves qubit_lo_freq from various locations.""" # construct valid schedule list for passing to assemble schedules = [self._valid_2q_schedule()] # test qubit_lo_freq drawn from Hamiltonian when not specified elsewhere system_model = self._system_model_2Q() pulse_qobj = assemble(schedules, backend=self.backend_sim) op_system = digest_pulse_obj(pulse_qobj, system_model) self.assertAlmostEqual(op_system.freqs['D0'], 4.999009804864) self.assertAlmostEqual(op_system.freqs['D1'], 5.100990195135) self.assertAlmostEqual(op_system.freqs['U0'], 5.100990195135) self.assertAlmostEqual(op_system.freqs['U1'], 4.999009804864) # test qubit_lo_freq taken from estimates in system_model if present and not in assemble system_model._qubit_freq_est = [4.9, 5.1] pulse_qobj = assemble(schedules, backend=self.backend_sim) op_system = digest_pulse_obj(pulse_qobj, system_model) self.assertAlmostEqual(op_system.freqs['D0'], 4.9) self.assertAlmostEqual(op_system.freqs['D1'], 5.1) self.assertAlmostEqual(op_system.freqs['U0'], 5.1) self.assertAlmostEqual(op_system.freqs['U1'], 4.9) # test qubit_lo_freq passed to assemble overrides est system_model._qubit_freq_est = [4.9, 5.1] pulse_qobj = assemble(schedules, qubit_lo_freq=[4.8, 5.2], backend=self.backend_sim) op_system = digest_pulse_obj(pulse_qobj, system_model) self.assertAlmostEqual(op_system.freqs['D0'], 4.8) self.assertAlmostEqual(op_system.freqs['D1'], 5.2) self.assertAlmostEqual(op_system.freqs['U0'], 5.2) self.assertAlmostEqual(op_system.freqs['U1'], 4.8) def _valid_2q_schedule(self): """Returns a valid 2 qubit schedule.""" valid_pulse = pulse_lib.gaussian(duration=128, amp=0.5, sigma=16, name='valid_pulse') valid_meas_pulse = pulse_lib.gaussian_square(duration=1200, amp=0.025, sigma=4, risefall=25, name='valid_meas_pulse') acq_cmd = pulse.Acquire(duration=10) acquires = [pulse.AcquireChannel(0), pulse.AcquireChannel(1)] memoryslots = [pulse.MemorySlot(0), pulse.MemorySlot(1)] # create measurement schedule measure_and_acquire = \ valid_meas_pulse(pulse.MeasureChannel(0)) | acq_cmd(acquires, memoryslots) # add commands to schedule schedule = pulse.Schedule(name='valid_exp') schedule += valid_pulse(pulse.DriveChannel(0)) schedule += measure_and_acquire << schedule.duration return schedule def _system_model_2Q(self, v0=5.0, v1=5.1, j=0.01, r=0.02, alpha0=-0.33, alpha1=-0.33, qub_dim=3): """Constructs a simple 2 transmon PulseSystemModel.""" hamiltonian = {} hamiltonian['h_str'] = [] # Q0 terms hamiltonian['h_str'].append('np.pi*(2*v0-alpha0)*O0') hamiltonian['h_str'].append('np.pi*alpha0*O0*O0') hamiltonian['h_str'].append('2*np.pi*r*X0||D0') # Q1 terms hamiltonian['h_str'].append('np.pi*(2*v1-alpha1)*O1') hamiltonian['h_str'].append('np.pi*alpha1*O1*O1') hamiltonian['h_str'].append('2*np.pi*r*X1||D1') # Exchange coupling and ControlChannel terms hamiltonian['h_str'].append('2*np.pi*j*(Sp0*Sm1+Sm0*Sp1)') hamiltonian['h_str'].append('2*np.pi*r*X0||U0') hamiltonian['h_str'].append('2*np.pi*r*X1||U1') # set vars and qubit dimensions hamiltonian['vars'] = {'v0': v0, 'v1': v1, 'j': j, 'r': r, 'alpha0': alpha0, 'alpha1': alpha1} hamiltonian['qub'] = {'0' : qub_dim, '1' : qub_dim} ham_model = HamiltonianModel.from_dict(hamiltonian) # set up u channel freqs, u_channel_lo = [[{'q': 1, 'scale': [1.0, 0.0]}], [{'q': 0, 'scale': [1.0, 0.0]}]] subsystem_list = [0, 1] dt = 1. return PulseSystemModel(hamiltonian=ham_model, u_channel_lo=u_channel_lo, subsystem_list=subsystem_list, dt=dt) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/openpulse/test_system_models.py000066400000000000000000000210001362723322000241640ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Tests for PulseSystemModel and HamiltonianModel functionality """ import unittest import warnings from numpy import array from numpy.linalg import norm from test.terra.common import QiskitAerTestCase import qiskit from qiskit.test.mock import FakeOpenPulse2Q import qiskit.pulse as pulse from qiskit.pulse import pulse_lib from qiskit.compiler import assemble from qiskit.providers.aer.pulse.pulse_system_model import PulseSystemModel from qiskit.providers.aer.pulse.hamiltonian_model import HamiltonianModel class BaseTestPulseSystemModel(QiskitAerTestCase): """Tests for PulseSystemModel""" def setUp(self): self._default_qubit_lo_freq = [4.9, 5.0] self._u_channel_lo = [[{'q': 0, 'scale': [1.0, 0.0]}], [{'q': 0, 'scale': [-1.0, 0.0]}, {'q': 1, 'scale': [1.0, 0.0]}]] def _simple_system_model(self, v0=5.0, v1=5.1, j=0.01, r=0.02, alpha0=-0.33, alpha1=-0.33): hamiltonian = {} hamiltonian['h_str'] = ['np.pi*(2*v0-alpha0)*O0', 'np.pi*alpha0*O0*O0', '2*np.pi*r*X0||D0', '2*np.pi*r*X0||U1', '2*np.pi*r*X1||U0', 'np.pi*(2*v1-alpha1)*O1', 'np.pi*alpha1*O1*O1', '2*np.pi*r*X1||D1', '2*np.pi*j*(Sp0*Sm1+Sm0*Sp1)'] hamiltonian['qub'] = {'0' : 3, '1' : 3} hamiltonian['vars'] = {'v0': v0, 'v1': v1, 'j': j, 'r': r, 'alpha0': alpha0, 'alpha1': alpha1} ham_model = HamiltonianModel.from_dict(hamiltonian) subsystem_list =[0, 1] dt = 1. return PulseSystemModel(hamiltonian=ham_model, qubit_freq_est=self._default_qubit_lo_freq, u_channel_lo=self._u_channel_lo, subsystem_list=subsystem_list, dt=dt) class TestPulseSystemModel(BaseTestPulseSystemModel): r"""Tests for Hamiltonian options and processing.""" def test_control_channel_index(self): """Test PulseSystemModel.control_channel_index().""" # get the model with no control channel dict yet test_model = self._simple_system_model() # test that it gives a warning when a key has no corresponding control channel with warnings.catch_warnings(record=True) as w: # Cause all warnings to always be triggered. warnings.simplefilter("always") ctrl_idx = test_model.control_channel_index('no_key') self.assertEqual(len(w), 1) self.assertTrue('ControlChannel' in str(w[-1].message)) # control channel labels test_model.control_channel_labels = [(0,1)] self.assertEqual(test_model.control_channel_index((0,1)), 0) # test that it still correctly gives a warning for nonexistant indices with warnings.catch_warnings(record=True) as w: # Cause all warnings to always be triggered. warnings.simplefilter("always") ctrl_idx = test_model.control_channel_index((1,0)) self.assertEqual(len(w), 1) self.assertTrue('ControlChannel' in str(w[-1].message)) def test_control_channel_labels_from_backend(self): """Test correct importing of backend control channel description.""" backend = FakeOpenPulse2Q() system_model = PulseSystemModel.from_backend(backend) expected = [{'driven_q': 1, 'freq': '(1+0j)q0'}, {'driven_q': 0, 'freq': '(-1+0j)q0 + (1+0j)q1'}] self.assertEqual(system_model.control_channel_labels, expected) def test_qubit_lo_default(self): """Test drawing of defaults form a backend.""" test_model = self._simple_system_model() default_qubit_lo_freq = self._default_qubit_lo_freq default_u_lo_freq = self._compute_u_lo_freqs(default_qubit_lo_freq) # test output of default qubit_lo_freq freqs = test_model.calculate_channel_frequencies() self.assertAlmostEqual(freqs['D0'], default_qubit_lo_freq[0]) self.assertAlmostEqual(freqs['D1'], default_qubit_lo_freq[1]) self.assertAlmostEqual(freqs['U0'], default_u_lo_freq[0]) self.assertAlmostEqual(freqs['U1'], default_u_lo_freq[1]) # test defaults again, but with non-default hamiltonian test_model = self._simple_system_model(v0=5.1, v1=4.9, j=0.02) freqs = test_model.calculate_channel_frequencies() self.assertAlmostEqual(freqs['D0'], default_qubit_lo_freq[0]) self.assertAlmostEqual(freqs['D1'], default_qubit_lo_freq[1]) self.assertAlmostEqual(freqs['U0'], default_u_lo_freq[0]) self.assertAlmostEqual(freqs['U1'], default_u_lo_freq[1]) def test_qubit_lo_from_hamiltonian(self): """Test computation of qubit_lo_freq from the hamiltonian itself.""" test_model = self._simple_system_model() qubit_lo_from_hamiltonian = test_model.hamiltonian.get_qubit_lo_from_drift() freqs = test_model.calculate_channel_frequencies(qubit_lo_from_hamiltonian) self.assertAlmostEqual(freqs['D0'], 4.999009804864) self.assertAlmostEqual(freqs['D1'], 5.100990195135) self.assertAlmostEqual(freqs['U0'], 4.999009804864) self.assertAlmostEqual(freqs['U1'], 0.101980390271) # test again with different parameters test_model = self._simple_system_model(v0=5.1, v1=4.9, j=0.02) qubit_lo_from_hamiltonian = test_model.hamiltonian.get_qubit_lo_from_drift() freqs = test_model.calculate_channel_frequencies(qubit_lo_from_hamiltonian) self.assertAlmostEqual(freqs['D0'], 5.101980390271) self.assertAlmostEqual(freqs['D1'], 4.898019609728) self.assertAlmostEqual(freqs['U0'], 5.101980390271) self.assertAlmostEqual(freqs['U1'], -0.203960780543) def _compute_u_lo_freqs(self, qubit_lo_freq): """ Given qubit_lo_freq, return the computed u_channel_lo. """ u_lo_freqs = [] for scales in self._u_channel_lo: u_lo_freq = 0 for u_lo_idx in scales: qfreq = qubit_lo_freq[u_lo_idx['q']] qscale = u_lo_idx['scale'][0] u_lo_freq += qfreq * qscale u_lo_freqs.append(u_lo_freq) return u_lo_freqs class TestHamiltonianModel(QiskitAerTestCase): """Tests for HamiltonianModel""" def test_eigen_sorting(self): """Test estate mappings""" X = array([[0,1],[1,0]]) Y = array([[0,-1j], [1j, 0]]) Z = array([[1,0], [0, -1]]) simple_ham = {'h_str': ['a*X0','b*Y0', 'c*Z0'], 'vars': {'a': 0.1, 'b': 0.1, 'c' : 1}, 'qub': {'0': 2}} ham_model = HamiltonianModel.from_dict(simple_ham) # check norm for estate in ham_model._estates: self.assertAlmostEqual(norm(estate), 1) # check actually an eigenstate mat = 0.1 * X + 0.1 * Y + 1 * Z for idx, eval in enumerate(ham_model._evals): diff = mat @ ham_model._estates[:, idx] - eval * ham_model._estates[:, idx] self.assertAlmostEqual(norm(diff), 0) # Same test but with strongly off-diagonal hamiltonian, which should raise warning simple_ham = {'h_str': ['a*X0','b*Y0', 'c*Z0'], 'vars': {'a': 100, 'b': 32.1, 'c' : 0.12}, 'qub': {'0': 2}} ham_model = HamiltonianModel.from_dict(simple_ham) # check norm for estate in ham_model._estates: self.assertAlmostEqual(norm(estate), 1) # check actually an eigenstate mat = 100 * X + 32.1 * Y + 0.12 * Z for idx, eval in enumerate(ham_model._evals): diff = mat @ ham_model._estates[:, idx] - eval * ham_model._estates[:, idx] self.assertAlmostEqual(norm(diff), 0) if __name__ == '__main__': unittest.main() qiskit-aer-0.4.1/test/terra/reference/000077500000000000000000000000001362723322000176175ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/reference/ref_1q_clifford.py000066400000000000000000000431461362723322000232260ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for 1-qubit Clifford gate instructions. """ import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit # ========================================================================== # H-gate # ========================================================================== def h_gate_circuits_deterministic(final_measure=True): """H-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # HH=I circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def h_gate_counts_deterministic(shots, hex_counts=True): """H-gate circuits reference counts.""" targets = [] if hex_counts: # HH=I targets.append({'0x0': shots}) else: # HH=I targets.append({'0': shots}) return targets def h_gate_statevector_deterministic(): """H-gate circuits reference statevectors.""" targets = [] # HH=I targets.append(np.array([1, 0])) return targets def h_gate_unitary_deterministic(): """H-gate circuits reference unitaries.""" targets = [] # HH=I targets.append(np.eye(2)) return targets def h_gate_circuits_nondeterministic(final_measure=True): """X-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # H circuit = QuantumCircuit(*regs) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def h_gate_counts_nondeterministic(shots, hex_counts=True): """H-gate circuits reference counts.""" targets = [] if hex_counts: # H targets.append({'0x0': shots / 2, '0x1': shots / 2}) else: # H targets.append({'0': shots / 2, '1': shots / 2}) return targets def h_gate_statevector_nondeterministic(): """H-gate circuits reference statevectors.""" targets = [] # H targets.append(np.array([1, 1]) / np.sqrt(2)) return targets def h_gate_unitary_nondeterministic(): """H-gate circuits reference unitaries.""" targets = [] # HH=I targets.append(np.array([[1, 1], [1, -1]]) / np.sqrt(2)) return targets # ========================================================================== # X-gate # ========================================================================== def x_gate_circuits_deterministic(final_measure=True): """X-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # X circuit = QuantumCircuit(*regs) circuit.x(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # XX = I circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.x(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # HXH=Z circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.x(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def x_gate_counts_deterministic(shots, hex_counts=True): """X-gate circuits reference counts.""" targets = [] if hex_counts: # X targets.append({'0x1': shots}) # XX = I targets.append({'0x0': shots}) # HXH=Z targets.append({'0x0': shots}) else: # X targets.append({'1': shots}) # XX = I targets.append({'0': shots}) # HXH=Z targets.append({'0': shots}) return targets def x_gate_statevector_deterministic(): """X-gate circuits reference statevectors.""" targets = [] # X targets.append(np.array([0, 1])) # XX = I targets.append(np.array([1, 0])) # HXH=Z targets.append(np.array([1, 0])) return targets def x_gate_unitary_deterministic(): """X-gate circuits reference unitaries.""" targets = [] # X targets.append(np.array([[0, 1], [1, 0]])) # XX = I targets.append(np.eye(2)) # HXH=Z targets.append(np.array([[1, 0], [0, -1]])) return targets # ========================================================================== # Z-gate # ========================================================================== def z_gate_circuits_deterministic(final_measure=True): """Z-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # Z alone circuit = QuantumCircuit(*regs) circuit.z(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # HZH = X circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.z(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # HZZH = I circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.z(qr) circuit.barrier(qr) circuit.z(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def z_gate_counts_deterministic(shots, hex_counts=True): """Z-gate circuits reference counts.""" targets = [] if hex_counts: # Z targets.append({'0x0': shots}) # HZH = X targets.append({'0x1': shots}) # HZZH = I targets.append({'0x0': shots}) else: # Z targets.append({'0': shots}) # HZH = X targets.append({'1': shots}) # HZZH = I targets.append({'0': shots}) return targets def z_gate_statevector_deterministic(): """Z-gate circuits reference statevectors.""" targets = [] # Z targets.append(np.array([1, 0])) # HZH = X targets.append(np.array([0, 1])) # HZZH = I targets.append(np.array([1, 0])) return targets def z_gate_unitary_deterministic(): """Z-gate circuits reference unitaries.""" targets = [] # Z targets.append(np.array([[1, 0], [0, -1]])) # HZH = X targets.append(np.array([[0, 1], [1, 0]])) # HZZH = I targets.append(np.eye(2)) return targets # ========================================================================== # Y-gate # ========================================================================== def y_gate_circuits_deterministic(final_measure=True): """Y-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # Y circuit = QuantumCircuit(*regs) circuit.y(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # YY = I circuit = QuantumCircuit(*regs) circuit.y(qr) circuit.barrier(qr) circuit.y(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # HYH = -Y circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.y(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def y_gate_counts_deterministic(shots, hex_counts=True): """Y-gate circuits reference counts.""" targets = [] if hex_counts: # Y targets.append({'0x1': shots}) # YY = I targets.append({'0x0': shots}) # HYH = -Y targets.append({'0x1': shots}) else: # Y targets.append({'1': shots}) # YY = I targets.append({'0': shots}) # HYH = -Y targets.append({'1': shots}) return targets def y_gate_statevector_deterministic(): """Y-gate circuits reference statevectors.""" targets = [] # Y targets.append(np.array([0, 1j])) # YY = I targets.append(np.array([1, 0])) # HYH = -Y targets.append(np.array([0, -1j])) return targets def y_gate_unitary_deterministic(): """Y-gate circuits reference unitaries.""" targets = [] # Y targets.append(np.array([[0, -1j], [1j, 0]])) # YY = I targets.append(np.eye(2)) # HYH = -Y targets.append(np.array([[0, 1j], [-1j, 0]])) return targets # ========================================================================== # S-gate # ========================================================================== def s_gate_circuits_deterministic(final_measure=True): """S-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # S circuit = QuantumCircuit(*regs) circuit.s(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # S.X circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.s(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # HSSH = HZH = X circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.s(qr) circuit.barrier(qr) circuit.s(qr) circuit.barrier(qr) circuit.h(qr) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) return circuits def s_gate_counts_deterministic(shots, hex_counts=True): """S-gate circuits reference counts.""" targets = [] if hex_counts: # S targets.append({'0x0': shots}) # S.X targets.append({'0x1': shots}) # HSSH = HZH = X targets.append({'0x1': shots}) else: # S targets.append({'0': shots}) # S.X targets.append({'1': shots}) # HSSH = HZH = X targets.append({'1': shots}) return targets def s_gate_statevector_deterministic(): """S-gate circuits reference statevectors.""" targets = [] # S targets.append(np.array([1, 0])) # S.X targets.append(np.array([0, 1j])) # HSSH = HZH = X targets.append(np.array([0, 1])) return targets def s_gate_unitary_deterministic(): """S-gate circuits reference unitaries.""" targets = [] # S targets.append(np.diag([1, 1j])) # S.X targets.append(np.array([[0, 1], [1j, 0]])) # HSSH = HZH = X targets.append(np.array([[0, 1], [1, 0]])) return targets def s_gate_circuits_nondeterministic(final_measure=True): """S-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # SH circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.s(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # HSH circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.s(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def s_gate_counts_nondeterministic(shots, hex_counts=True): """S-gate circuits reference counts.""" targets = [] if hex_counts: # S.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) # H.S.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) else: # S.H targets.append({'0': shots / 2, '1': shots / 2}) # H.S.H targets.append({'0': shots / 2, '1': shots / 2}) return targets def s_gate_statevector_nondeterministic(): """S-gate circuits reference statevectors.""" targets = [] # S.H targets.append(np.array([1, 1j]) / np.sqrt(2)) # H.S.H targets.append(np.array([1 + 1j, 1 - 1j]) / 2) return targets def s_gate_unitary_nondeterministic(): """S-gate circuits reference unitaries.""" targets = [] # S.H targets.append(np.array([[1, 1], [1j, -1j]]) / np.sqrt(2)) # H.S.H targets.append(np.array([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]]) / 2) return targets # ========================================================================== # S^dagger-gate # ========================================================================== def sdg_gate_circuits_deterministic(final_measure=True): """Sdg-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # Sdg circuit = QuantumCircuit(*regs) circuit.sdg(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.Sdg.Sdg.H = H.Z.H = X circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.sdg(qr) circuit.barrier(qr) circuit.sdg(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.Sdg.S.H = I circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.s(qr) circuit.barrier(qr) circuit.sdg(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def sdg_gate_counts_deterministic(shots, hex_counts=True): """Sdg-gate circuits reference counts.""" targets = [] if hex_counts: # Sdg targets.append({'0x0': shots}) # H.Sdg.Sdg.H = H.Z.H = X targets.append({'0x1': shots}) # H.Sdg.S.H = I targets.append({'0x0': shots}) else: # Sdg targets.append({'0': shots}) # H.Sdg.Sdg.H = H.Z.H = X targets.append({'1': shots}) # H.Sdg.S.H = I targets.append({'0': shots}) return targets def sdg_gate_statevector_deterministic(): """Sdg-gate circuits reference statevectors.""" targets = [] # Sdg targets.append(np.array([1, 0])) # H.Sdg.Sdg.H = H.Z.H = X targets.append(np.array([0, 1])) # H.Sdg.S.H = I targets.append(np.array([1, 0])) return targets def sdg_gate_unitary_deterministic(): """Sdg-gate circuits reference unitaries.""" targets = [] # Sdg targets.append(np.diag([1, -1j])) # H.Sdg.Sdg.H = H.Z.H = X targets.append(np.array([[0, 1], [1, 0]])) # H.Sdg.S.H = I targets.append(np.eye(2)) return targets def sdg_gate_circuits_nondeterministic(final_measure=True): """Sdg-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # Sdg.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.sdg(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.Sdg.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.sdg(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def sdg_gate_counts_nondeterministic(shots, hex_counts=True): """Sdg-gate circuits reference counts.""" targets = [] if hex_counts: # Sdg.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) # H.Sdg.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) else: # Sdg.H targets.append({'0': shots / 2, '1': shots / 2}) # H.Sdg.H targets.append({'0': shots / 2, '1': shots / 2}) return targets def sdg_gate_statevector_nondeterministic(): """Sdg-gate circuits reference statevectors.""" targets = [] # Sdg.H targets.append(np.array([1, -1j]) / np.sqrt(2)) # H.Sdg.H targets.append(np.array([1 - 1j, 1 + 1j]) / 2) return targets def sdg_gate_unitary_nondeterministic(): """Sdg-gate circuits reference unitaries.""" targets = [] # Sdg.H targets.append(np.array([[1, 1], [-1j, 1j]]) / np.sqrt(2)) # H.Sdg.H targets.append(np.array([[1 - 1j, 1 + 1j], [1 + 1j, 1 - 1j]]) / 2) return targets qiskit-aer-0.4.1/test/terra/reference/ref_2q_clifford.py000066400000000000000000000646571362723322000232410ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for 2-qubit Clifford gate instructions. """ import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from test.terra.utils.multiplexer import multiplexer_multi_controlled_x # ========================================================================== # CX-gate # ========================================================================== def cx_gate_circuits_deterministic(final_measure=True): """CX-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # CX01, |00> state circuit = QuantumCircuit(*regs) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10, |00> state circuit = QuantumCircuit(*regs) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(X^I), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(I^X), |01> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(I^X), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(X^I), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(X^X), |01> state circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(X^X), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cx_gate_counts_deterministic(shots, hex_counts=True): """CX-gate circuits reference counts.""" targets = [] if hex_counts: # CX01, |00> state targets.append({'0x0': shots}) # {"00": shots} # CX10, |00> state targets.append({'0x0': shots}) # {"00": shots} # CX01.(X^I), |10> state targets.append({'0x2': shots}) # {"00": shots} # CX10.(I^X), |01> state targets.append({'0x1': shots}) # {"00": shots} # CX01.(I^X), |11> state targets.append({'0x3': shots}) # {"00": shots} # CX10.(X^I), |11> state targets.append({'0x3': shots}) # {"00": shots} # CX01.(X^X), |01> state targets.append({'0x1': shots}) # {"00": shots} # CX10.(X^X), |10> state targets.append({'0x2': shots}) # {"00": shots} else: # CX01, |00> state targets.append({'00': shots}) # {"00": shots} # CX10, |00> state targets.append({'00': shots}) # {"00": shots} # CX01.(X^I), |10> state targets.append({'10': shots}) # {"00": shots} # CX10.(I^X), |01> state targets.append({'01': shots}) # {"00": shots} # CX01.(I^X), |11> state targets.append({'11': shots}) # {"00": shots} # CX10.(X^I), |11> state targets.append({'11': shots}) # {"00": shots} # CX01.(X^X), |01> state targets.append({'01': shots}) # {"00": shots} # CX10.(X^X), |10> state targets.append({'10': shots}) # {"00": shots} return targets def cx_gate_statevector_deterministic(): """CX-gate test circuits with deterministic counts.""" targets = [] # CX01, |00> state targets.append(np.array([1, 0, 0, 0])) # CX10, |00> state targets.append(np.array([1, 0, 0, 0])) # CX01.(X^I), |10> state targets.append(np.array([0, 0, 1, 0])) # CX10.(I^X), |01> state targets.append(np.array([0, 1, 0, 0])) # CX01.(I^X), |11> state targets.append(np.array([0, 0, 0, 1])) # CX10.(X^I), |11> state targets.append(np.array([0, 0, 0, 1])) # CX01.(X^X), |01> state targets.append(np.array([0, 1, 0, 0])) # CX10.(X^X), |10> state targets.append(np.array([0, 0, 1, 0])) return targets def cx_gate_unitary_deterministic(): """CX-gate circuits reference unitaries.""" targets = [] # CX01, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])) # CX10, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])) # CX01.(X^I), |10> state targets.append(np.array([[0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]])) # CX10.(I^X), |01> state targets.append(np.array([[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])) # CX01.(I^X), |11> state targets.append(np.array([[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0]])) # CX10.(X^I), |11> state targets.append(np.array([[0, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0], [1, 0, 0, 0]])) # CX01.(X^X), |01> state targets.append(np.array([[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]])) # CX10.(X^X), |10> state targets.append(np.array([[0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0]])) return targets def cx_gate_circuits_nondeterministic(final_measure=True): """CX-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # CX01.(I^H), Bell state circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(H^I), Bell state circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cx_gate_counts_nondeterministic(shots, hex_counts=True): """CX-gate circuits reference counts.""" targets = [] if hex_counts: # CX01.(I^H), Bell state targets.append({'0x0': shots / 2, '0x3': shots / 2}) # CX10.(I^H), Bell state targets.append({'0x0': shots / 2, '0x3': shots / 2}) else: # CX01.(I^H), Bell state targets.append({'00': shots / 2, '11': shots / 2}) # CX10.(I^H), Bell state targets.append({'00': shots / 2, '11': shots / 2}) return targets def cx_gate_statevector_nondeterministic(): """CX-gate circuits reference statevectors.""" targets = [] # CX01.(I^H), Bell state targets.append(np.array([1, 0, 0, 1]) / np.sqrt(2)) # CX10.(I^H), Bell state targets.append(np.array([1, 0, 0, 1]) / np.sqrt(2)) return targets def cx_gate_unitary_nondeterministic(): """CX-gate circuits reference unitaries.""" targets = [] # CX01.(I^H), Bell state targets.append(np.array([[1, 1, 0, 0], [0, 0, 1, -1], [0, 0, 1, 1], [1, -1, 0, 0]]) / np.sqrt(2)) # CX10.(I^H), Bell state targets.append(np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 0, -1], [1, 0, -1, 0]]) / np.sqrt(2)) return targets # ========================================================================== # CZ-gate # ========================================================================== def cz_gate_circuits_deterministic(final_measure=True): """CZ-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # CZ, |00> state circuit = QuantumCircuit(*regs) circuit.cz(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10, |00> state circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.cz(qr[0], qr[1]) circuit.h(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01, |00> state circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.cz(qr[1], qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^H).CZ.(X^H) = CX10.(X^I), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.h(qr[0]) circuit.barrier(qr) circuit.cz(qr[0], qr[1]) circuit.barrier(qr) circuit.h(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (H^I).CZ.(H^X) = CX01.(I^X), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.h(qr[1]) circuit.barrier(qr) circuit.cz(qr[0], qr[1]) circuit.barrier(qr) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cz_gate_counts_deterministic(shots, hex_counts=True): """CZ-gate circuits reference counts.""" targets = [] if hex_counts: # CZ, |00> state targets.append({'0x0': shots}) # CX10, |00> state targets.append({'0x0': shots}) # CX01, |00> state targets.append({'0x0': shots}) # (I^H).CZ.(X^H) = CX10.(X^I), |11> state targets.append({'0x3': shots}) # (H^I).CZ.(H^X) = CX01.(I^H), |11> state targets.append({'0x3': shots}) else: # CZ, |00> state targets.append({'00': shots}) # CX10, |00> state targets.append({'00': shots}) # CX01, |00> state targets.append({'00': shots}) # (I^H).CZ.(X^H) = CX10.(X^I), |11> state targets.append({'11': shots}) # (H^I).CZ.(H^X) = CX01.(I^H), |11> state targets.append({'11': shots}) return targets def cz_gate_statevector_deterministic(): """CZ-gate test circuits with deterministic counts.""" targets = [] # CZ, |00> state targets.append(np.array([1, 0, 0, 0])) # CX10, |00> state targets.append(np.array([1, 0, 0, 0])) # CX01, |00> state targets.append(np.array([1, 0, 0, 0])) # (I^H).CZ.(X^H) = CX10.(X^I), |11> state targets.append(np.array([0, 0, 0, 1])) # (H^I).CZ.(H^X) = CX01.(I^H), |11> state targets.append(np.array([0, 0, 0, 1])) return targets def cz_gate_unitary_deterministic(): """CZ-gate circuits reference unitaries.""" targets = [] # CZ, |00> state targets.append(np.diag([1, 1, 1, -1])) # CX10, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])) # CX01, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])) # (I^H).CZ.(X^H) = CX10.(X^I), |11> state targets.append(np.array([[0, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0], [1, 0, 0, 0]])) # (H^I).CZ.(H^X) = CX01.(I^X), |11> state targets.append(np.array([[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0]])) return targets def cz_gate_circuits_nondeterministic(final_measure=True): """CZ-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(2) qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # (I^H).CZ.(H^H) = CX10.(H^I), Bell state circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.cz(qr[0], qr[1]) circuit.barrier(qr) circuit.h(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (H^I).CZ.(H^H) = CX01.(I^H), Bell state circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.cz(qr[0], qr[1]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cz_gate_counts_nondeterministic(shots, hex_counts=True): """CZ-gate circuits reference counts.""" targets = [] if hex_counts: # (I^H).CZ.(H^H) = CX10.(H^I), Bell state targets.append({'0x0': shots / 2, '0x3': shots / 2}) # (H^I).CZ.(H^H) = CX01.(I^H), Bell state targets.append({'0x0': shots / 2, '0x3': shots / 2}) else: # (I^H).CZ.(H^H) = CX10.(H^I), Bell state targets.append({'00': shots / 2, '11': shots / 2}) # (H^I).CZ.(H^H) = CX01.(I^H), Bell state targets.append({'00': shots / 2, '11': shots / 2}) return targets def cz_gate_statevector_nondeterministic(): """CZ-gate circuits reference statevectors.""" targets = [] # (I^H).CZ.(H^H) = CX10.(H^I), Bell state targets.append(np.array([1, 0, 0, 1]) / np.sqrt(2)) # (H^I).CZ.(H^H) = CX01.(I^H), Bell state targets.append(np.array([1, 0, 0, 1]) / np.sqrt(2)) return targets def cz_gate_unitary_nondeterministic(): """CZ-gate circuits reference unitaries.""" targets = [] # (I^H).CZ.(H^H) = CX10.(H^I), Bell state targets.append(np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 1, 0, -1], [1, 0, -1, 0]]) / np.sqrt(2)) # (H^I).CZ.(H^H) = CX01.(I^H), Bell state targets.append(np.array([[1, 1, 0, 0], [0, 0, 1, -1], [0, 0, 1, 1], [1, -1, 0, 0]]) / np.sqrt(2)) return targets # ========================================================================== # SWAP-gate # ========================================================================== def swap_gate_circuits_deterministic(final_measure=True): """SWAP-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # Swap(0,1), |00> state circuit = QuantumCircuit(*regs) circuit.swap(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Swap(0,1).(I^X), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.swap(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def swap_gate_counts_deterministic(shots, hex_counts=True): """SWAP-gate circuits reference counts.""" targets = [] if hex_counts: # Swap(0,1), |00> state targets.append({'0x0': shots}) # Swap(0,1).(I^X), |10> state targets.append({'0x2': shots}) else: # Swap(0,1), |00> state targets.append({'00': shots}) # Swap(0,1).(I^X), |10> state targets.append({'10': shots}) return targets def swap_gate_statevector_deterministic(): """SWAP-gate test circuits with deterministic counts.""" targets = [] # Swap(0,1), |00> state targets.append(np.array([1, 0, 0, 0])) # Swap(0,1).(I^X), |10> state targets.append(np.array([0, 0, 1, 0])) return targets def swap_gate_unitary_deterministic(): """SWAP-gate circuits reference unitaries.""" targets = [] # Swap(0,1), |00> state targets.append(np.array([[1, 0, 0, 0], [0, 0, 1, 0], [0, 1, 0, 0], [0, 0, 0, 1]])) # Swap(0,1).(I^X), |10> state targets.append(np.array([[0, 1, 0, 0], [0, 0, 0, 1], [1, 0, 0, 0], [0, 0, 1, 0]])) return targets def swap_gate_circuits_nondeterministic(final_measure=True): """SWAP-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # initial state as |10+> # Swap(0,1).(X^I^H), Permutation (0,1,2) -> (1,0,2) circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.swap(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Swap(0,2).(X^I^H), # Permutation (0,1,2) -> (2,1,0), circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.swap(qr[0], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Swap(2,0).Swap(0,1).(X^I^H), Permutation (0,1,2) -> (2,0,1) circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.swap(qr[0], qr[1]) circuit.barrier(qr) circuit.swap(qr[2], qr[0]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) return circuits def swap_gate_counts_nondeterministic(shots, hex_counts=True): """SWAP-gate circuits reference counts.""" targets = [] if hex_counts: # initial state as |10+> # Swap(0,1).(X^I^H), Permutation (0,1,2) -> (1,0,2) targets.append({'0x4': shots / 2, '0x6': shots / 2}) # Swap(0,2).(X^I^H), # Permutation (0,1,2) -> (2,1,0), targets.append({'0x1': shots / 2, '0x5': shots / 2}) # Swap(2,0).Swap(0,1).(X^I^H), Permutation (0,1,2) -> (2,0,1) targets.append({'0x1': shots / 2, '0x3': shots / 2}) else: # initial state as |10+> # Swap(0,1).(X^I^H), Permutation (0,1,2) -> (1,0,2) targets.append({'100': shots / 2, '110': shots / 2}) # Swap(0,2).(X^I^H), # Permutation (0,1,2) -> (2,1,0), targets.append({'001': shots / 2, '101': shots / 2}) # Swap(2,0).Swap(0,1).(X^I^H), Permutation (0,1,2) -> (2,0,1) targets.append({'001': shots / 2, '011': shots / 2}) return targets def swap_gate_statevector_nondeterministic(): """SWAP-gate circuits reference statevectors.""" targets = [] # initial state as |10+> # Swap(0,1).(X^I^H), Permutation (0,1,2) -> (1,0,2), |1+0> targets.append(np.array([0, 0, 0, 0, 1, 0, 1, 0]) / np.sqrt(2)) # Swap(0,2).(X^I^H), # Permutation (0,1,2) -> (2,1,0), targets.append(np.array([0, 1, 0, 0, 0, 1, 0, 0]) / np.sqrt(2)) # Swap(2,0).Swap(0,1).(X^I^H), Permutation (0,1,2) -> (2,0,1) targets.append(np.array([0, 1, 0, 1, 0, 0, 0, 0]) / np.sqrt(2)) return targets def swap_gate_unitary_nondeterministic(): """SWAP-gate circuits reference unitaries.""" targets = [] # initial state as |10+> # Swap(0,1).(X^I^H), Permutation (0,1,2) -> (1,0,2) targets.append(np.array([[0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, -1, 0, 0], [0, 0, 0, 0, 0, 0, 1, -1], [1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], [1, -1, 0, 0, 0, 0, 0, 0], [0, 0, 1, -1, 0, 0, 0, 0]]) / np.sqrt(2)) # Swap(0,2).(X^I^H), # Permutation (0,1,2) -> (2,1,0), targets.append(np.array([[0, 0, 0, 0, 1, 1, 0, 0], [1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, -1, 0, 0], [1, -1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, -1], [0, 0, 1, -1, 0, 0, 0, 0]]) / np.sqrt(2)) # Swap(2,0).Swap(0,1).(X^I^H), Permutation (0,1,2) -> (2,0,1) targets.append(np.array([[0, 0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 0, 1, -1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1, -1], [1, 1, 0, 0, 0, 0, 0, 0], [1, -1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, -1, 0, 0, 0, 0]]) / np.sqrt(2)) return targets def multiplexer_cx_gate_circuits_deterministic(final_measure=True): """multiplexer-gate simulating cx gate, test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) num_control_qubits = 1 # CX01, |00> state circuit = QuantumCircuit(*regs) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10, |00> state circuit = QuantumCircuit(*regs) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[1], qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(X^I), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(I^X), |01> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[1], qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(I^X), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(X^I), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[1], qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(X^X), |01> state circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(X^X), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[1], qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def multiplexer_cx_gate_circuits_nondeterministic(final_measure=True): """Multiplexer CX-like gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # cx gate only has one control qubit num_control_qubits = 1 # CX01.(I^H), Bell state circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(H^I), Bell state circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[1], qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def multiplexer_cx_gate_counts_deterministic(shots, hex_counts=True): """ The counts are exactly the same as the cx gate """ return cx_gate_counts_deterministic(shots, hex_counts) def multiplexer_cx_gate_counts_nondeterministic(shots, hex_counts=True): """ The counts are exactly the same as the cx gate """ return cx_gate_counts_nondeterministic(shots, hex_counts) qiskit-aer-0.4.1/test/terra/reference/ref_algorithms.py000066400000000000000000000066371362723322000232120ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for standard algorithms. """ from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit def grovers_circuit(final_measure=True, allow_sampling=True): """Testing a circuit originated in the Grover algorithm""" circuits = [] # 6-qubit grovers qr = QuantumRegister(6) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.h(qr[1]) circuit.x(qr[2]) circuit.x(qr[3]) circuit.x(qr[0]) circuit.cx(qr[0], qr[2]) circuit.x(qr[0]) circuit.cx(qr[1], qr[3]) circuit.ccx(qr[2], qr[3], qr[4]) circuit.cx(qr[1], qr[3]) circuit.x(qr[0]) circuit.cx(qr[0], qr[2]) circuit.x(qr[0]) circuit.x(qr[1]) circuit.x(qr[4]) circuit.h(qr[4]) circuit.ccx(qr[0], qr[1], qr[4]) circuit.h(qr[4]) circuit.x(qr[0]) circuit.x(qr[1]) circuit.x(qr[4]) circuit.h(qr[0]) circuit.h(qr[1]) circuit.h(qr[4]) if final_measure: circuit.barrier(qr) circuit.measure(qr[0], cr[0]) circuit.measure(qr[1], cr[1]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) return circuits def grovers_counts(shots, hex_counts=True): """Reference counts for Grovers algorithm""" targets = [] if hex_counts: # 6-qubit grovers targets.append({'0x0': 5 * shots / 8, '0x1': shots / 8, '0x2': shots / 8, '0x3': shots / 8}) else: # 6-qubit grovers targets.append({'00': 5 * shots / 8, '01': shots / 8, '10': shots / 8, '11': shots / 8}) return targets def teleport_circuit(): """Testing a circuit originated in the teleportation algorithm""" circuits = [] # Classic 3-qubit teleportation qr = QuantumRegister(3) c0 = ClassicalRegister(1) c1 = ClassicalRegister(1) c2 = ClassicalRegister(1) # Compiles to creg order [c2, c1, c0] circuit = QuantumCircuit(qr, c0, c1, c2) # Teleport the |0> state from qr[0] to qr[2] circuit.h(qr[1]) circuit.cx(qr[1], qr[2]) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) circuit.h(qr[0]) circuit.measure(qr[0], c0[0]) circuit.measure(qr[1], c1[0]) circuit.z(qr[2]).c_if(c0, 1) circuit.x(qr[2]).c_if(c1, 1) circuit.measure(qr[2], c2[0]) circuits.append(circuit) return circuits def teleport_counts(shots, hex_counts=True): """Reference counts for teleport circuits""" targets = [] if hex_counts: # Classical 3-qubit teleport targets.append({'0x0': shots / 4, '0x1': shots / 4, '0x2': shots / 4, '0x3': shots / 4}) else: # Classical 3-qubit teleport targets.append({'0 0 0': shots / 4, '0 0 1': shots / 4, '0 1 0': shots / 4, '0 1 1': shots / 4}) return targets qiskit-aer-0.4.1/test/terra/reference/ref_conditionals.py000066400000000000000000000351331362723322000235200ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for conditional gates. """ import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.circuit import Instruction def add_conditional_x(circuit, qreg, creg, val, conditional_type): """Add a conditional instruction to a circuit. Args: circuit (QuantumCircuit): circuit to add instruction to. qreg (QuantumRegister): qubit to apply conditional X to creg (ClassicalRegister): classical reg to condition on val (int): Classical reg value to condition on. conditional_type (string): instruction type to add conditional X as. Conditional type can be 'gate', 'unitary', 'kraus', 'superop' and will apply a conditional X-gate in that representation """ # X-gate matrix x_mat = np.array([[0, 1], [1, 0]], dtype=complex) x_superop = Instruction('superop', 1, 0, [np.kron(x_mat, x_mat)]) x_kraus = Instruction('kraus', 1, 0, [x_mat]) if conditional_type == 'unitary': circuit.unitary(x_mat, [qreg]).c_if(creg, val) elif conditional_type == 'kraus': circuit.append(x_kraus, [qreg]).c_if(creg, val) elif conditional_type == 'superop': circuit.append(x_superop, [qreg]).c_if(creg, val) else: circuit.x(qreg).c_if(creg, val) # ========================================================================== # Conditionals on 1-bit register # ========================================================================== def conditional_circuits_1bit(final_measure=True, conditional_type='gate'): """Conditional gates on single bit classical register.""" circuits = [] qr = QuantumRegister(1) cond = ClassicalRegister(1, 'cond') if final_measure: cr = ClassicalRegister(1, 'meas') regs = (qr, cr, cond) else: regs = (qr, cond) # Conditional on 0 (cond = 0) circuit = QuantumCircuit(*regs) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 0, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 0 (cond = 1) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 0, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 1 (cond = 0) circuit = QuantumCircuit(*regs) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 1, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 1 (cond = 1) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 1, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def conditional_counts_1bit(shots, hex_counts=True): """Conditional circuits reference counts.""" targets = [] if hex_counts: # Conditional on 0 (cond = 0), result "0 1" targets.append({'0x1': shots}) # Conditional on 0 (cond = 1), result "1 0" targets.append({'0x2': shots}) # Conditional on 1 (cond = 0), # result "0 0" targets.append({'0x0': shots}) # Conditional on 1 (cond = 1), # result "1 1" targets.append({'0x3': shots}) else: # Conditional on 0 (cond = 0), result "0 1" targets.append({'0 1': shots}) # Conditional on 0 (cond = 1), result "1 0" targets.append({'1 0': shots}) # Conditional on 1 (cond = 0), # result "0 0" targets.append({'0 0': shots}) # Conditional on 1 (cond = 1), # result "1 1" targets.append({'1 1': shots}) return targets def conditional_statevector_1bit(): """Conditional circuits reference statevector.""" targets = [] # Conditional on 0 (cond = 0) targets.append(np.array([0, 1])) # Conditional on 0 (cond = 1) targets.append(np.array([1, 0])) # Conditional on 1 (cond = 0) targets.append(np.array([1, 0])) # Conditional on 1 (cond = 1) targets.append(np.array([0, 1])) return targets # ========================================================================== # Conditionals on 2-bit register # ========================================================================== def conditional_circuits_2bit(final_measure=True, conditional_type='gate'): """Conditional test circuits on 2-bit classical register.""" circuits = [] qr = QuantumRegister(1) cond = ClassicalRegister(2, 'cond') if final_measure: cr = ClassicalRegister(1, 'meas') regs = (qr, cr, cond) else: regs = (qr, cond) # Conditional on 00 (cr = 00) circuit = QuantumCircuit(*regs) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 0, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 00 (cr = 01) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 0, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 00 (cr = 10) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 0, conditional_type) circuits.append(circuit) # Conditional on 00 (cr = 11) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 0, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 01 (cr = 00) circuit = QuantumCircuit(*regs) add_conditional_x(circuit, qr[0], cond, 1, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 01 (cr = 01) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 1, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 01 (cr = 10) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 1, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 01 (cr = 11) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 1, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 10 (cr = 00) circuit = QuantumCircuit(*regs) circuit.x(qr).c_if(cond, 2) circuits.append(circuit) # Conditional on 10 (cr = 01) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 2, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 10 (cr = 10) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 2, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 10 (cr = 11) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 2, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 11 (cr = 00) circuit = QuantumCircuit(*regs) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 3, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 11 (cr = 01) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 3, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 11 (cr = 10) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 3, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Conditional on 11 (cr = 11) circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.measure(qr[0], cond[0]) circuit.measure(qr[0], cond[1]) circuit.x(qr) circuit.barrier(qr) add_conditional_x(circuit, qr[0], cond, 3, conditional_type) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def conditional_counts_2bit(shots, hex_counts=True): """2-bit conditional circuits reference counts.""" targets = [] if hex_counts: # Conditional on 00 (cr = 00), result "00 1" targets.append({'0x1': shots}) # Conditional on 00 (cr = 01), result "01 0" targets.append({'0x2': shots}) # Conditional on 00 (cr = 10), result "10 0" targets.append({'0x4': shots}) # Conditional on 00 (cr = 11), result "11 0" targets.append({'0x6': shots}) # Conditional on 01 (cr = 00), result "00 0" targets.append({'0x0': shots}) # Conditional on 01 (cr = 01), result "01 1" targets.append({'0x3': shots}) # Conditional on 01 (cr = 10), result "10 0" targets.append({'0x4': shots}) # Conditional on 01 (cr = 11), result "11 0" targets.append({'0x6': shots}) # Conditional on 10 (cr = 00), result "00 0" targets.append({'0x0': shots}) # Conditional on 10 (cr = 01), result "01 0" targets.append({'0x2': shots}) # Conditional on 10 (cr = 10), result "10 1" targets.append({'0x5': shots}) # Conditional on 10 (cr = 11), result "11 0" targets.append({'0x6': shots}) # Conditional on 11 (cr = 00), result "00 0" targets.append({'0x0': shots}) # Conditional on 11 (cr = 01), result "01 0" targets.append({'0x2': shots}) # Conditional on 11 (cr = 10), result "10 0" targets.append({'0x4': shots}) # Conditional on 11 (cr = 11), result "11 1" targets.append({'0x7': shots}) else: # Conditional on 00 (cr = 00), result "00 1" targets.append({'00 1': shots}) # Conditional on 00 (cr = 01), result "01 0" targets.append({'01 0': shots}) # Conditional on 00 (cr = 10), result "10 0" targets.append({'10 0': shots}) # Conditional on 00 (cr = 11), result "11 0" targets.append({'11 0': shots}) # Conditional on 01 (cr = 00), result "00 0" targets.append({'00 0': shots}) # Conditional on 01 (cr = 01), result "01 1" targets.append({'01 1': shots}) # Conditional on 01 (cr = 10), result "10 0" targets.append({'10 0': shots}) # Conditional on 01 (cr = 11), result "11 0" targets.append({'11 0': shots}) # Conditional on 10 (cr = 00), result "00 0" targets.append({'00 0': shots}) # Conditional on 10 (cr = 01), result "01 0" targets.append({'01 0': shots}) # Conditional on 10 (cr = 10), result "10 1" targets.append({'10 0': shots}) # Conditional on 10 (cr = 11), result "11 0" targets.append({'11 0': shots}) # Conditional on 11 (cr = 00), result "00 0" targets.append({'00 0': shots}) # Conditional on 11 (cr = 01), result "01 0" targets.append({'01 0': shots}) # Conditional on 11 (cr = 10), result "10 0" targets.append({'10 0': shots}) # Conditional on 11 (cr = 11), result "11 1" targets.append({'11 1': shots}) return targets def conditional_statevector_2bit(): """2-bit conditional circuits reference statevector.""" state_0 = np.array([1, 0]) state_1 = np.array([0, 1]) targets = [] # Conditional on 00 (cr = 00) targets.append(state_1) # Conditional on 00 (cr = 01) targets.append(state_0) # Conditional on 00 (cr = 10) targets.append(state_0) # Conditional on 00 (cr = 11) targets.append(state_0) # Conditional on 01 (cr = 00) targets.append(state_0) # Conditional on 01 (cr = 01) targets.append(state_1) # Conditional on 01 (cr = 10) targets.append(state_0) # Conditional on 01 (cr = 11) targets.append(state_0) # Conditional on 10 (cr = 00) targets.append(state_0) # Conditional on 10 (cr = 01) targets.append(state_0) # Conditional on 10 (cr = 10) targets.append(state_1) # Conditional on 10 (cr = 11) targets.append(state_0) # Conditional on 11 (cr = 00) targets.append(state_0) # Conditional on 11 (cr = 01) targets.append(state_0) # Conditional on 11 (cr = 10) targets.append(state_0) # Conditional on 11 (cr = 11) targets.append(state_1) return targets qiskit-aer-0.4.1/test/terra/reference/ref_initialize.py000066400000000000000000000277041362723322000232000ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for initialize instruction. """ from numpy import array, sqrt from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit def initialize_circuits_1(final_measure=True): """Initialize test circuits""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # Start with |+++> state # Initialize qr[i] to |1> for i=0,1,2 for qubit in range(3): circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.h(qr[1]) circuit.h(qr[2]) circuit.initialize([0, 1], [qr[qubit]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Start with |+++> state # Initialize qr[i] to |1> and qr[j] to |0> # For [i,j] = [0,1], [1, 0], [0, 2], [2, 0], [1, 2], [2, 1] for qubit_i in range(3): for qubit_j in range(3): if (qubit_i != qubit_j): circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.h(qr[1]) circuit.h(qr[2]) circuit.initialize([0, 1, 0, 0], [qr[qubit_i], qr[qubit_j]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Start with |+++> state # Initialize qr[i] to |1>, qr[j] to |0> and qr[k] to |-> # For [i,j,k] = [0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0] for qubit_i in range(3): for qubit_j in range(3): for qubit_k in range(3): if (qubit_i != qubit_j) & (qubit_i != qubit_k) & (qubit_k != qubit_j): circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.h(qr[1]) circuit.h(qr[2]) circuit.initialize([0, 1, 0, 0, 0, -1, 0, 0] / sqrt(2), \ [qr[qubit_i], qr[qubit_j], qr[qubit_k]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def initialize_counts_1(shots, hex_counts=True): """Initialize test circuits reference counts.""" targets = [] if hex_counts: # Initialize 0 to |1> from |+++> targets.append({'0x1': shots/4, '0x3': shots/4, '0x5': shots/4, '0x7': shots/4}) # Initialize 1 to |1> from |+++> targets.append({'0x2': shots/4, '0x3': shots/4, '0x6': shots/4, '0x7': shots/4}) # Initialize 2 to |1> from |+++> targets.append({'0x4': shots/4, '0x5': shots/4, '0x6': shots/4, '0x7': shots/4}) # Initialize 0,1 to |01> from |+++> targets.append({'0x1': shots/2, '0x5': shots/2}) # Initialize 0,2 to |01> from |+++> targets.append({'0x1': shots/2, '0x3': shots/2}) # Initialize 1,0 to |01> from |+++> targets.append({'0x2': shots/2, '0x6': shots/2}) # Initialize 1,2 to |01> from |+++> targets.append({'0x2': shots/2, '0x3': shots/2}) # Initialize 2,0 to |01> from |+++> targets.append({'0x4': shots/2, '0x6': shots/2}) # Initialize 2,1 to |01> from |+++> targets.append({'0x4': shots/2, '0x5': shots/2}) # Initialize 0,1,2 to |01-> from |+++> targets.append({'0x1': shots/2, '0x5': shots/2}) # Initialize 0,2,1 to |01-> from |+++> targets.append({'0x1': shots/2, '0x3': shots/2}) # Initialize 1,0,2 to |01-> from |+++> targets.append({'0x2': shots/2, '0x6': shots/2}) # Initialize 1,2,0 to |01-> from |+++> targets.append({'0x2': shots/2, '0x3': shots/2}) # Initialize 2,0,1 to |01-> from |+++> targets.append({'0x4': shots/2, '0x6': shots/2}) # Initialize 2,1,0 to |01-> from |+++> targets.append({'0x4': shots/2, '0x5': shots/2}) else: # Initialize 0 to |1> from |+++> targets.append({'001': shots/4, '011': shots/4, '101': shots/4, '111': shots/4}) # Initialize 1 to |1> from |+++> targets.append({'010': shots/4, '011': shots/4, '110': shots/4, '111': shots/4}) # Initialize 2 to |1> from |+++> targets.append({'100': shots/4, '101': shots/4, '110': shots/4, '111': shots/4}) # Initialize 0,1 to |01> from |+++> targets.append({'001': shots/2, '101': shots/2}) # Initialize 0,2 to |01> from |+++> targets.append({'001': shots/2, '011': shots/2}) # Initialize 1,0 to |01> from |+++> targets.append({'010': shots/2, '110': shots/2}) # Initialize 1,2 to |01> from |+++> targets.append({'010': shots/2, '011': shots/2}) # Initialize 2,0 to |01> from |+++> targets.append({'100': shots/2, '110': shots/2}) # Initialize 2,1 to |01> from |+++> targets.append({'100': shots/2, '101': shots/2}) # Initialize 0,1,2 to |01-> from |+++> targets.append({'001': shots/2, '101': shots/2}) # Initialize 0,2,1 to |01-> from |+++> targets.append({'001': shots/2, '011': shots/2}) # Initialize 1,0,2 to |01-> from |+++> targets.append({'010': shots/2, '110': shots/2}) # Initialize 1,2,0 to |01-> from |+++> targets.append({'010': shots/2, '011': shots/2}) # Initialize 2,0,1 to |01-> from |+++> targets.append({'100': shots/2, '110': shots/2}) # Initialize 2,1,0 to |01-> from |+++> targets.append({'100': shots/2, '101': shots/2}) return targets def initialize_statevector_1(): """Initialize test circuits reference counts.""" targets = [] # Start with |+++> state # Initialize qr[i] to |1> for i=0,1,2 targets.append(array([0. +0.j, 0.5+0.j, 0. +0.j, 0.5+0.j, 0. +0.j, 0.5+0.j, 0. +0.j, 0.5+0.j])) targets.append(array([0. +0.j, 0. +0.j, 0.5+0.j, 0.5+0.j, 0. +0.j, 0. +0.j, 0.5+0.j, 0.5+0.j])) targets.append(array([0. +0.j, 0. +0.j, 0. +0.j, 0. +0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j])) # Start with |+++> state # Initialize qr[i] to |1> and qr[j] to |0> # For [i,j] = [0,1], [1, 0], [0, 2], [2, 0], [1, 2], [2, 1] targets.append(array([0. + 0.j, 1.0 + 0.j, 0. + 0.j, 0. + 0.j, \ 0. + 0.j, 1.0 + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 1.0 + 0.j, 0. + 0.j, 1.0 + 0.j, \ 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 1.0 + 0.j, 0. + 0.j, \ 0. + 0.j, 0. + 0.j, 1.0 + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 1.0 + 0.j, 1.0 + 0.j, \ 0. + 0.j, 0. + 0.j, 0 + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 0 + 0.j, 0. + 0.j, \ 1.0 + 0.j, 0. + 0.j, 1.0 + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 0 + 0.j, 0. + 0.j, \ 1.0 + 0.j, 1.0 + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) # Start with |+++> state # Initialize qr[i] to |1>, qr[j] to |0> and qr[k] to |-> # For [i,j,k] = [0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0] targets.append(array([0. + 0.j, 1.0 + 0.j, 0. + 0.j, 0. + 0.j, \ 0. + 0.j, -1.0 + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 1.0 + 0.j, 0. + 0.j, -1.0 + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 1.0 + 0.j, 0. + 0.j, \ 0. + 0.j, 0. + 0.j, -1.0 + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 1.0 + 0.j, -1.0 + 0.j, \ 0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, \ 1.0 + 0.j, 0. + 0.j, -1.0 + 0.j, 0. + 0.j] / sqrt(2))) targets.append(array([0. + 0.j, 0. + 0.j, 0. + 0.j, 0. + 0.j, \ 1.0 + 0.j, -1.0 + 0.j, 0. + 0.j, 0. + 0.j] / sqrt(2))) return targets def initialize_circuits_2(final_measure=True): """Initialize test circuits""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # Initialize 0 to |1> from |++> circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.initialize([0, 1], [qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Initialize 1 to |1> from |++> circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.initialize([0, 1], [qr[1]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def initialize_counts_2(shots, hex_counts=True): """Initialize test circuits reference counts.""" targets = [] if hex_counts: # Initialize 0 to |1> from |++> targets.append({'0x1': shots / 2, '0x3': shots / 2}) # Initialize 1 to |1> from |++> targets.append({'0x2': shots / 2, '0x3': shots / 2}) else: # Initialize 0 to |1> from |++> targets.append({'01': shots / 2, '11': shots / 2}) # Initialize 1 to |1> from |++> targets.append({'10': shots / 2, '11': shots / 2}) return targets def initialize_statevector_2(): """Initialize test circuits reference counts.""" targets = [] # Initialize 0 to |1> from |++> targets.append(array([0, 1, 0, 1]) / sqrt(2)) # Initialize 1 to |1> from |++> targets.append(array([0, 0, 1, 1]) / sqrt(2)) return targets # ========================================================================== # Sampling optimization # ========================================================================== def initialize_sampling_optimization(): """Test sampling optimization""" qr = QuantumRegister(2) cr = ClassicalRegister(2) qc = QuantumCircuit(qr, cr) # The optimization should not be triggerred # because the initialize operation performs randomizations qc.h(qr[0]) qc.cx(qr[0], qr[1]) qc.initialize([1, 0], [qr[0]]) qc.measure(qr, cr) return [qc] def initialize_counts_sampling_optimization(shots, hex_counts=True): """Sampling optimization counts""" if hex_counts: return [{'0x0': shots/2, '0x2': shots/2}] else: return [{'0x00': shots/2, '0x10': shots/2}] qiskit-aer-0.4.1/test/terra/reference/ref_kraus_noise.py000066400000000000000000000041741362723322000233550ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator kraus error NoiseModel integration tests """ from test.terra.utils.utils import list2dict from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import amplitude_damping_error # ========================================================================== # Amplitude damping error # ========================================================================== def kraus_gate_error_circuits(): """Kraus gate error noise model circuits""" circuits = [] # Repeated amplitude damping to diagonal state qr = QuantumRegister(1, 'qr') cr = ClassicalRegister(1, 'cr') circuit = QuantumCircuit(qr, cr) circuit.x(qr) # prepare + state for _ in range(30): # Add noisy identities circuit.barrier(qr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def kraus_gate_error_noise_models(): """Kraus gate error noise models""" noise_models = [] # Amplitude damping error on "id" error = amplitude_damping_error(0.75, 0.25) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, 'id') noise_models.append(noise_model) return noise_models def kraus_gate_error_counts(shots, hex_counts=True): """Kraus gate error circuits reference counts""" counts_lists = [] # 100% all-qubit Pauli error on "id" gates counts = [3 * shots / 4, shots / 4, 0, 0] counts_lists.append(counts) # Convert to counts dict return [list2dict(i, hex_counts) for i in counts_lists] qiskit-aer-0.4.1/test/terra/reference/ref_measure.py000066400000000000000000000241561362723322000224760ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for measure instruction. """ from numpy import array from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.circuit import Instruction # ========================================================================== # Single-qubit measurements with deterministic output # ========================================================================== def measure_circuits_deterministic(allow_sampling=True): """Measure test circuits with deterministic count output.""" circuits = [] qr = QuantumRegister(2) cr = ClassicalRegister(2) # Measure |00> state circuit = QuantumCircuit(qr, cr) circuit.barrier(qr) circuit.measure(qr, cr) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) # Measure |01> state circuit = QuantumCircuit(qr, cr) circuit.x(qr[0]) circuit.barrier(qr) circuit.measure(qr, cr) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) # Measure |10> state circuit = QuantumCircuit(qr, cr) circuit.x(qr[1]) circuit.barrier(qr) circuit.measure(qr, cr) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) # Measure |11> state circuit = QuantumCircuit(qr, cr) circuit.x(qr) circuit.barrier(qr) circuit.measure(qr, cr) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) return circuits def measure_counts_deterministic(shots, hex_counts=True): """Measure test circuits reference counts.""" targets = [] if hex_counts: # Measure |00> state targets.append({'0x0': shots}) # Measure |01> state targets.append({'0x1': shots}) # Measure |10> state targets.append({'0x2': shots}) # Measure |11> state targets.append({'0x3': shots}) else: # Measure |00> state targets.append({'00': shots}) # Measure |01> state targets.append({'01': shots}) # Measure |10> state targets.append({'10': shots}) # Measure |11> state targets.append({'11': shots}) return targets def measure_memory_deterministic(shots, hex_counts=True): """Measure test circuits reference memory.""" targets = [] if hex_counts: # Measure |00> state targets.append(shots * ['0x0']) # Measure |01> state targets.append(shots * ['0x1']) # Measure |10> state targets.append(shots * ['0x2']) # Measure |11> state targets.append(shots * ['0x3']) else: # Measure |00> state targets.append(shots * ['00']) # Measure |01> state targets.append(shots * ['01']) # Measure |10> state targets.append(shots * ['10']) # Measure |11> state targets.append(shots * ['11']) return targets def measure_statevector_deterministic(): """Measure test circuits reference counts.""" targets = [] # Measure |00> state targets.append(array([1, 0, 0, 0])) # Measure |01> state targets.append(array([0, 1, 0, 0])) # Measure |10> state targets.append(array([0, 0, 1, 0])) # Measure |11> state targets.append(array([0, 0, 0, 1])) return targets # ========================================================================== # Single-qubit measurements with non-deterministic output # ========================================================================== def measure_circuits_nondeterministic(allow_sampling=True): """"Measure test circuits with non-deterministic count output.""" circuits = [] qr = QuantumRegister(2) cr = ClassicalRegister(2) # Measure |++> state (sampled) circuit = QuantumCircuit(qr, cr) circuit.h(qr) circuit.barrier(qr) circuit.measure(qr, cr) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) return circuits def measure_counts_nondeterministic(shots, hex_counts=True): """Measure test circuits reference counts.""" targets = [] if hex_counts: # Measure |++> state targets.append({'0x0': shots / 4, '0x1': shots / 4, '0x2': shots / 4, '0x3': shots / 4}) else: # Measure |++> state targets.append({'00': shots / 4, '01': shots / 4, '10': shots / 4, '11': shots / 4}) return targets # ========================================================================== # Multi-qubit measurements with deterministic output # ========================================================================== def multiqubit_measure_circuits_deterministic(allow_sampling=True): """Multi-qubit measure test circuits with deterministic count output.""" circuits = [] def measure_n(num_qubits): """Multi-qubit measure instruction.""" return Instruction("measure", num_qubits, num_qubits, []) qr = QuantumRegister(2) cr = ClassicalRegister(2) circuit = QuantumCircuit(qr, cr) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(measure_n(2), [0, 1], [0, 1]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) # 3-qubit measure |101> qr = QuantumRegister(3) cr = ClassicalRegister(3) circuit = QuantumCircuit(qr, cr) circuit.x(qr[0]) circuit.x(qr[2]) circuit.barrier(qr) circuit.append(measure_n(3), [0, 1, 2], [0, 1, 2]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) # 4-qubit measure |1010> qr = QuantumRegister(4) cr = ClassicalRegister(4) circuit = QuantumCircuit(qr, cr) circuit.x(qr[1]) circuit.x(qr[3]) circuit.barrier(qr) circuit.append(measure_n(4), [0, 1, 2, 3], [0, 1, 2, 3]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) return circuits def multiqubit_measure_counts_deterministic(shots, hex_counts=True): """Multi-qubit measure test circuits reference counts.""" targets = [] if hex_counts: # 2-qubit measure |10> targets.append({'0x2': shots}) # 3-qubit measure |101> targets.append({'0x5': shots}) # 4-qubit measure |1010> targets.append({'0xa': shots}) else: # 2-qubit measure |10> targets.append({'10': shots}) # 3-qubit measure |101> targets.append({'101': shots}) # 4-qubit measure |1010> targets.append({'1010': shots}) return targets def multiqubit_measure_memory_deterministic(shots, hex_counts=True): """Multi-qubit measure test circuits reference memory.""" targets = [] if hex_counts: # 2-qubit measure |10> targets.append(shots * ['0x2']) # 3-qubit measure |101> targets.append(shots * ['0x5']) # 4-qubit measure |1010> targets.append(shots * ['0xa']) else: # 2-qubit measure |10> targets.append(shots * ['10']) # 3-qubit measure |101> targets.append(shots * ['101']) # 4-qubit measure |1010> targets.append(shots * ['1010']) return targets def multiqubit_measure_statevector_deterministic(): """Multi-qubit measure test circuits reference counts.""" targets = [] # 2-qubit measure |10> targets.append(array([0, 0, 1, 0])) # 3-qubit measure |101> targets.append(array([0, 0, 0, 0, 0, 1, 0, 0])) # 4-qubit measure |1010> targets.append(array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0])) return targets # ========================================================================== # Multi-qubit measurements with non-deterministic output # ========================================================================== def multiqubit_measure_circuits_nondeterministic(allow_sampling=True): """Multi-qubit measure test circuits with non-deterministic count output.""" circuits = [] def measure_n(num_qubits): """Multi-qubit measure instruction.""" return Instruction("measure", num_qubits, num_qubits, []) # 2-qubit measure |++> qr = QuantumRegister(2) cr = ClassicalRegister(2) circuit = QuantumCircuit(qr, cr) circuit.h(qr[0]) circuit.h(qr[1]) circuit.barrier(qr) circuit.append(measure_n(2), [0, 1], [0, 1]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) # 3-qubit measure |++0> qr = QuantumRegister(3) cr = ClassicalRegister(3) circuit = QuantumCircuit(qr, cr) circuit.h(qr[0]) circuit.h(qr[1]) circuit.barrier(qr) circuit.append(measure_n(3), [0, 1, 2], [0, 1, 2]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) return circuits def multiqubit_measure_counts_nondeterministic(shots, hex_counts=True): """Multi-qubit measure test circuits reference counts.""" targets = [] if hex_counts: # 2-qubit measure |++> targets.append({'0x0': shots / 4, '0x1': shots / 4, '0x2': shots / 4, '0x3': shots / 4}) # 3-qubit measure |0++> targets.append({'0x0': shots / 4, '0x1': shots / 4, '0x2': shots / 4, '0x3': shots / 4}) else: # 2-qubit measure |++> targets.append({'00': shots / 4, '01': shots / 4, '10': shots / 4, '11': shots / 4}) # 3-qubit measure |0++> targets.append({'000': shots / 4, '001': shots / 4, '010': shots / 4, '011': shots / 4}) return targets qiskit-aer-0.4.1/test/terra/reference/ref_non_clifford.py000066400000000000000000001677671362723322000235170ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for non-Clifford gate instructions. """ import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from test.terra.utils.multiplexer import multiplexer_multi_controlled_x # ========================================================================== # T-gate # ========================================================================== def t_gate_circuits_deterministic(final_measure=True): """T-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # T circuit = QuantumCircuit(*regs) circuit.t(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # T.T = S circuit = QuantumCircuit(*regs) circuit.t(qr) circuit.barrier(qr) circuit.t(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # T.X circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.t(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.T.T.T.T.H = H.Z.H = X circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def t_gate_counts_deterministic(shots, hex_counts=True): """T-gate circuits reference counts.""" targets = [] if hex_counts: # T targets.append({'0x0': shots}) # T.T = S targets.append({'0x0': shots}) # T.X targets.append({'0x1': shots}) # H.T.T.T.TH = H.Z.H = X targets.append({'0x1': shots}) else: # T targets.append({'0': shots}) # T.T = S targets.append({'0': shots}) # T.X targets.append({'1': shots}) # H.T.T.T.TH = H.Z.H = X targets.append({'1': shots}) return targets def t_gate_statevector_deterministic(): """T-gate circuits reference statevectors.""" targets = [] # T targets.append(np.array([1, 0])) # T.T = S targets.append(np.array([1, 0])) # T.X targets.append(np.array([0, 1 + 1j]) / np.sqrt(2)) # H.T.T.T.T.H = H.Z.H = X targets.append(np.array([0, 1])) return targets def t_gate_unitary_deterministic(): """T-gate circuits reference unitaries.""" targets = [] # T targets.append(np.diag([1, (1 + 1j) / np.sqrt(2)])) # T.T = S targets.append(np.diag([1, 1j])) # T.X targets.append(np.array([[0, 1], [(1 + 1j) / np.sqrt(2), 0]])) # H.T.T.T.TH = H.Z.H = X targets.append(np.array([[0, 1], [1, 0]])) return targets def t_gate_circuits_nondeterministic(final_measure=True): """T-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # T.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.t(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # X.T.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.x(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.T.T.H = H.S.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def t_gate_counts_nondeterministic(shots, hex_counts=True): """T-gate circuits reference counts.""" targets = [] if hex_counts: # T.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) # X.T.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) # H.T.T.H = H.S.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) else: # T.H targets.append({'0': shots / 2, '1': shots / 2}) # X.T.H targets.append({'0': shots / 2, '1': shots / 2}) # H.T.T.H = H.S.H targets.append({'0': shots / 2, '1': shots / 2}) return targets def t_gate_statevector_nondeterministic(): """T-gate circuits reference statevectors.""" targets = [] # T.H targets.append(np.array([1 / np.sqrt(2), 0.5 + 0.5j])) # X.T.H targets.append(np.array([0.5 + 0.5j, 1 / np.sqrt(2)])) # H.T.T.H = H.S.H targets.append(np.array([1 + 1j, 1 - 1j]) / 2) return targets def t_gate_unitary_nondeterministic(): """T-gate circuits reference unitaries.""" targets = [] # T.H targets.append( np.array([[1 / np.sqrt(2), 1 / np.sqrt(2)], [0.5 + 0.5j, -0.5 - 0.5j]])) # X.T.H targets.append( np.array([[0.5 + 0.5j, -0.5 - 0.5j], [1 / np.sqrt(2), 1 / np.sqrt(2)]])) # H.T.T.H = H.S.H targets.append(np.array([[1 + 1j, 1 - 1j], [1 - 1j, 1 + 1j]]) / 2) return targets # ========================================================================== # T^dagger-gate # ========================================================================== def tdg_gate_circuits_deterministic(final_measure=True): """Tdg-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # Tdg circuit = QuantumCircuit(*regs) circuit.tdg(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.Tdg.T.H = I circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.t(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.Tdg.Tdg.Tdg.Tdg.H = H.Z.H = X circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def tdg_gate_counts_deterministic(shots, hex_counts=True): """Sdg-gate circuits reference counts.""" targets = [] if hex_counts: # Tdg targets.append({'0x0': shots}) # H.Tdg.T.H = I targets.append({'0x0': shots}) # H.Tdg.Tdg.Tdg.Tdg.H = H.Z.H = X targets.append({'0x1': shots}) else: # Tdg targets.append({'0': shots}) # H.Tdg.T.H = I targets.append({'0': shots}) # H.Tdg.Tdg.Tdg.Tdg.H = H.Z.H = X targets.append({'1': shots}) return targets def tdg_gate_statevector_deterministic(): """Sdg-gate circuits reference statevectors.""" targets = [] # Tdg targets.append(np.array([1, 0])) # H.Tdg.T.H = I targets.append(np.array([1, 0])) # H.Tdg.Tdg.Tdg.Tdg.H = H.Z.H = X targets.append(np.array([0, 1])) return targets def tdg_gate_unitary_deterministic(): """Tdg-gate circuits reference unitaries.""" targets = [] # Tdg targets.append(np.diag([1, (1 - 1j) / np.sqrt(2)])) # H.Tdg.T.H = I targets.append(np.eye(2)) # H.Tdg.Tdg.Tdg.Tdg.H = H.Z.H = X targets.append(np.array([[0, 1], [1, 0]])) return targets def tdg_gate_circuits_nondeterministic(final_measure=True): """Tdg-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(1) if final_measure: cr = ClassicalRegister(1) regs = (qr, cr) else: regs = (qr, ) # Tdg.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.tdg(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # X.Tdg.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.x(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H.Tdg.Tdg.H = H.Sdg.H circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.tdg(qr) circuit.barrier(qr) circuit.h(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def tdg_gate_counts_nondeterministic(shots, hex_counts=True): """Tdg-gate circuits reference counts.""" targets = [] if hex_counts: # Tdg.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) # X.Tdg.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) # H.Tdg.Tdg.H = H.Sdg.H targets.append({'0x0': shots / 2, '0x1': shots / 2}) else: # Tdg.H targets.append({'0': shots / 2, '1': shots / 2}) # X.Tdg.H targets.append({'0': shots / 2, '1': shots / 2}) # H.Tdg.Tdg.H = H.Sdg.H targets.append({'0': shots / 2, '1': shots / 2}) return targets def tdg_gate_statevector_nondeterministic(): """Tdg-gate circuits reference statevectors.""" targets = [] # Tdg.H targets.append(np.array([1 / np.sqrt(2), 0.5 - 0.5j])) # X.Tdg.H targets.append(np.array([0.5 - 0.5j, 1 / np.sqrt(2)])) # H.Tdg.Tdg.H = H.Sdg.H targets.append(np.array([1 - 1j, 1 + 1j]) / 2) return targets def tdg_gate_unitary_nondeterministic(): """Tdg-gate circuits reference unitaries.""" targets = [] # Tdg.H targets.append( np.array([[1 / np.sqrt(2), 1 / np.sqrt(2)], [0.5 - 0.5j, -0.5 + 0.5j]])) # X.Tdg.H targets.append( np.array([[0.5 - 0.5j, -0.5 + 0.5j], [1 / np.sqrt(2), 1 / np.sqrt(2)]])) # H.Tdg.Tdg.H = H.Sdg.H targets.append(np.array([[1 - 1j, 1 + 1j], [1 + 1j, 1 - 1j]]) / 2) return targets # ========================================================================== # CCX-gate # ========================================================================== def ccx_gate_circuits_deterministic(final_measure=True): """CCX-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # CCX(0,1,2) circuit = QuantumCircuit(*regs) circuit.ccx(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^X^X).CCX(0,1,2).(I^X^X) -> |100> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.ccx(qr[0], qr[1], qr[2]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^I^X).CCX(0,1,2).(X^I^X) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.ccx(qr[0], qr[1], qr[2]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^X^I).CCX(0,1,2).(X^X^I) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.ccx(qr[0], qr[1], qr[2]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CCX(2,1,0) circuit = QuantumCircuit(*regs) circuit.ccx(qr[2], qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^X^X).CCX(2,1,0).(I^X^X) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.ccx(qr[2], qr[1], qr[0]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^I^X).CCX(2,1,0).(X^I^X) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.ccx(qr[2], qr[1], qr[0]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^X^I).CCX(2,1,0).(X^X^I) -> |001> circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.ccx(qr[2], qr[1], qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def ccx_gate_counts_deterministic(shots, hex_counts=True): """CCX-gate circuits reference counts.""" targets = [] if hex_counts: # CCX(0,1,2) targets.append({'0x0': shots}) # (I^X^X).CCX(0,1,2).(I^X^X) -> |100> targets.append({'0x4': shots}) # (X^I^X).CCX(0,1,2).(X^I^X) -> |000> targets.append({'0x0': shots}) # (X^X^I).CCX(0,1,2).(X^X^I) -> |000> targets.append({'0x0': shots}) # CCX(2,1,0) targets.append({'0x0': shots}) # (I^X^X).CCX(2,1,0).(I^X^X) -> |000> targets.append({'0x0': shots}) # (X^I^X).CCX(2,1,0).(X^I^X) -> |000> targets.append({'0x0': shots}) # (X^X^I).CCX(2,1,0).(X^X^I) -> |001> targets.append({'0x1': shots}) else: # CCX(0,1,2) targets.append({'000': shots}) # (I^X^X).CCX(0,1,2).(I^X^X) -> |100> targets.append({'100': shots}) # (X^I^X).CCX(0,1,2).(X^I^X) -> |000> targets.append({'000': shots}) # (X^X^I).CCX(0,1,2).(X^X^I) -> |000> targets.append({'000': shots}) # CCX(2,1,0) targets.append({'000': shots}) # (I^X^X).CCX(2,1,0).(I^X^X) -> |000> targets.append({'000': shots}) # (X^I^X).CCX(2,1,0).(X^I^X) -> |000> targets.append({'000': shots}) # (X^X^I).CCX(2,1,0).(X^X^I) -> |001> targets.append({'001': shots}) return targets def ccx_gate_statevector_deterministic(): """CCX-gate circuits reference statevectors.""" targets = [] zero_state = np.array([1, 0, 0, 0, 0, 0, 0, 0]) # CCX(0,1,2) targets.append(zero_state) # (I^X^X).CCX(0,1,2).(I^X^X) -> |100> targets.append(np.array([0, 0, 0, 0, 1, 0, 0, 0])) # (X^I^X).CCX(0,1,2).(X^I^X) -> |000> targets.append(zero_state) # (X^X^I).CCX(0,1,2).(X^X^I) -> |000> targets.append(zero_state) # CCX(2,1,0) targets.append(zero_state) # (I^X^X).CCX(2,1,0).(I^X^X) -> |000> targets.append(zero_state) # (X^I^X).CCX(2,1,0).(X^I^X) -> |000> targets.append(zero_state) # (X^X^I).CCX(2,1,0).(X^X^I) -> |001> targets.append(np.array([0, 1, 0, 0, 0, 0, 0, 0])) return targets def ccx_gate_unitary_deterministic(): """CCX-gate circuits reference unitaries.""" targets = [] # CCX(0,1,2) targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0]])) # (I^X^X).CCX(0,1,2).(I^X^X) -> |100> targets.append( np.array([[0, 0, 0, 0, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) # (X^I^X).CCX(0,1,2).(X^I^X) -> |000> targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) # (X^X^I).CCX(0,1,2).(X^X^I) -> |000> targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) # CCX(2,1,0) targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0]])) # (I^X^X).CCX(2,1,0).(I^X^X) -> |000> targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) # (X^I^X).CCX(2,1,0).(X^I^X) -> |000> targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) # (X^X^I).CCX(2,1,0).(X^X^I) -> |001> targets.append( np.array([[0, 1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) return targets def ccx_gate_circuits_nondeterministic(final_measure=True): """CCX-gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # (I^X^I).CCX(0,1,2).(I^X^H) -> |000> + |101> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.ccx(qr[0], qr[1], qr[2]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^I^X).CCX(0,1,2).(I^H^X) -> |000> + |110> circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.ccx(qr[0], qr[1], qr[2]) circuit.barrier(qr) circuit.x(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^X^I).CCX(2,1,0).(H^X^I) -> |000> + |101> circuit = QuantumCircuit(*regs) circuit.h(qr[2]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.ccx(qr[2], qr[1], qr[0]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^I^I).CCX(2,1,0).(X^H^I) -> |000> + |011> circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.ccx(qr[2], qr[1], qr[0]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def ccx_gate_counts_nondeterministic(shots, hex_counts=True): """CCX-gate circuits reference counts.""" targets = [] if hex_counts: # (I^X^I).CCX(0,1,2).(I^X^H) -> |000> + |101> targets.append({'0x0': shots / 2, '0x5': shots / 2}) # (I^I^X).CCX(0,1,2).(I^H^X) -> |000> + |110> targets.append({'0x0': shots / 2, '0x6': shots / 2}) # (I^X^I).CCX(2,1,0).(H^X^I) -> |000> + |101> targets.append({'0x0': shots / 2, '0x5': shots / 2}) # (X^I^I).CCX(2,1,0).(X^H^I) -> |000> + |011> targets.append({'0x0': shots / 2, '0x3': shots / 2}) else: # (I^X^I).CCX(0,1,2).(I^X^H) -> |000> + |101> targets.append({'000': shots / 2, '101': shots / 2}) # (I^I^X).CCX(0,1,2).(I^H^X) -> |000> + |110> targets.append({'000': shots / 2, '110': shots / 2}) # (I^X^I).CCX(2,1,0).(H^X^I) -> |000> + |101> targets.append({'000': shots / 2, '101': shots / 2}) # (X^I^I).CCX(2,1,0).(X^H^I) -> |000> + |011> targets.append({'000': shots / 2, '011': shots / 2}) return targets def ccx_gate_statevector_nondeterministic(): """CCX-gate circuits reference statevectors.""" targets = [] # (I^X^I).CCX(0,1,2).(I^X^H) -> |000> + |101> targets.append(np.array([1, 0, 0, 0, 0, 1, 0, 0]) / np.sqrt(2)) # (I^I^X).CCX(0,1,2).(I^H^X) -> |000> + |110> targets.append(np.array([1, 0, 0, 0, 0, 0, 1, 0]) / np.sqrt(2)) # (I^X^I).CCX(2,1,0).(H^X^I) -> |000> + |101> targets.append(np.array([1, 0, 0, 0, 0, 1, 0, 0]) / np.sqrt(2)) # (X^I^I).CCX(2,1,0).(X^H^I) -> |000> + |011> targets.append(np.array([1, 0, 0, 1, 0, 0, 0, 0]) / np.sqrt(2)) return targets def ccx_gate_unitary_nondeterministic(): """CCX-gate circuits reference unitaries.""" targets = [] # (I^X^I).CCX(0,1,2).(I^X^H) -> |000> + |101> targets.append( np.array([[1, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, -1, 0, 0], [0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, -1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0], [1, -1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1, -1]]) / np.sqrt(2)) # (I^I^X).CCX(0,1,2).(I^H^X) -> |000> + |110> targets.append( np.array([[1, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, -1, 0], [0, 1, 0, -1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 1], [1, 0, -1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, -1]]) / np.sqrt(2)) # (I^X^I).CCX(2,1,0).(H^X^I) -> |000> + |101> targets.append( np.array([[1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 0, 0, 0, -1, 0, 0], [1, 0, 0, 0, -1, 0, 0, 0], [0, 0, 1, 0, 0, 0, -1, 0], [0, 0, 0, 1, 0, 0, 0, -1]]) / np.sqrt(2)) # (X^I^I).CCX(2,1,0).(X^H^I) -> |000> + |011> targets.append( np.array([[1, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 1, 0, 0, 0, 0], [0, 1, 0, -1, 0, 0, 0, 0], [1, 0, -1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 1, 0, -1, 0], [0, 0, 0, 0, 0, 1, 0, -1]]) / np.sqrt(2)) return targets # ========================================================================== # Multiplexer-gate (CCX-like) # ========================================================================== def multiplexer_ccx_gate_circuits_deterministic(final_measure=True): """multiplexer-gate simulating ccx gate, test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # because ccx has two control qubits and one target num_control_qubits = 2 # CCX(0,1,2) circuit = QuantumCircuit(*regs) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1], qr[2]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^X^X).CCX(0,1,2).(I^X^X) -> |100> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1], qr[2]]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^I^X).CCX(0,1,2).(X^I^X) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1], qr[2]]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^X^I).CCX(0,1,2).(X^X^I) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1], qr[2]]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CCX(2,1,0) circuit = QuantumCircuit(*regs) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[2], qr[1], qr[0]]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^X^X).CCX(2,1,0).(I^X^X) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[2], qr[1], qr[0]]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^I^X).CCX(2,1,0).(X^I^X) -> |000> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[2], qr[1], qr[0]]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^X^I).CCX(2,1,0).(X^X^I) -> |001> circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[2], qr[1], qr[0]]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def multiplexer_ccx_gate_circuits_nondeterministic(final_measure=True): """mukltiplexer CCX-like gate test circuits with non-deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # because ccx has two control qubits and one target num_control_qubits = 2 # (I^X^I).CCX(0,1,2).(I^X^H) -> |000> + |101> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1], qr[2]]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^I^X).CCX(0,1,2).(I^H^X) -> |000> + |110> circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.barrier(qr) circuit.x(qr[0]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[0], qr[1], qr[2]]) circuit.barrier(qr) circuit.x(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (I^X^I).CCX(2,1,0).(H^X^I) -> |000> + |101> circuit = QuantumCircuit(*regs) circuit.h(qr[2]) circuit.barrier(qr) circuit.x(qr[1]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[2], qr[1], qr[0]]) circuit.barrier(qr) circuit.x(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # (X^I^I).CCX(2,1,0).(X^H^I) -> |000> + |011> circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.barrier(qr) circuit.x(qr[2]) circuit.barrier(qr) circuit.append(multiplexer_multi_controlled_x(num_control_qubits), [qr[2], qr[1], qr[0]]) circuit.barrier(qr) circuit.x(qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def multiplexer_ccx_gate_counts_deterministic(shots, hex_counts=True): """ The counts are exactly the same as the ccx gate """ return ccx_gate_counts_deterministic(shots, hex_counts) def multiplexer_ccx_gate_counts_nondeterministic(shots, hex_counts=True): """ The counts are exactly the same as the ccx gate """ return ccx_gate_counts_nondeterministic(shots, hex_counts) # ========================================================================== # CSWAP-gate (Fredkin) # ========================================================================== def cswap_gate_circuits_deterministic(final_measure): """cswap-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # CSWAP(0,1,2) # -> |000> circuit = QuantumCircuit(*regs) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(X^I^I) -> |100> circuit = QuantumCircuit(*regs) circuit.x(qr[2]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(I^X^I) -> |010> circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(X^X^I) -> |110> circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.x(qr[2]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(I^I^X) -> |001> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(I^X^X -> |101> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.x(qr[1]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(X^I^X) -> |011> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.x(qr[2]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(X^X^X) -> |111> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.x(qr[1]) circuit.x(qr[2]) circuit.barrier(qr) circuit.cswap(qr[0], qr[1], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(1,0,2).(I^X^X) -> |110> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.x(qr[1]) circuit.barrier(qr) circuit.cswap(qr[1], qr[0], qr[2]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(2,1,0).(X^I^X) -> |110> circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.x(qr[2]) circuit.barrier(qr) circuit.cswap(qr[2], qr[1], qr[0]) circuit.barrier(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cswap_gate_counts_deterministic(shots, hex_counts=True): """"cswap-gate circuits reference counts.""" targets = [] if hex_counts: # CSWAP(0,1,2) # -> |000> targets.append({'0x0': shots}) # CSWAP(0,1,2).(X^I^I) -> |100> targets.append({'0x4': shots}) # CSWAP(0,1,2).(I^X^I) -> |010> targets.append({'0x2': shots}) # CSWAP(0,1,2).(X^X^I) -> |110> targets.append({'0x6': shots}) # CSWAP(0,1,2).(I^I^X). -> |001> targets.append({'0x1': shots}) # CSWAP(0,1,2).(I^X^X) -> |101> targets.append({'0x5': shots}) # CSWAP(0,1,2).(X^I^X) -> |011> targets.append({'0x3': shots}) # CSWAP(0,1,2).(X^X^X) -> |111> targets.append({'0x7': shots}) # CSWAP(1,0,2).(I^X^X) -> |110> targets.append({'0x6': shots}) # CSWAP(2,1,0).(X^I^X) -> |110> targets.append({'0x6': shots}) else: # CSWAP(0,1,2) # -> |000> targets.append({'000': shots}) # CSWAP(0,1,2).(X^I^I) -> |100> targets.append({'100': shots}) # CSWAP(0,1,2).(I^X^I) -> |010> targets.append({'010': shots}) # CSWAP(0,1,2).(X^X^I) -> |110> targets.append({'110': shots}) # CSWAP(0,1,2).(I^I^X) -> |001> targets.append({'001': shots}) # CSWAP(0,1,2).(I^X^X) -> |101> targets.append({'101': shots}) # CSWAP(0,1,2).(X^I^X) -> |011> targets.append({'011': shots}) # CSWAP(0,1,2).(X^X^X) -> |111> targets.append({'111': shots}) # CSWAP(1,0,2).(I^X^X) -> |110> targets.append({'110': shots}) # CSWAP(2,1,0).(X^I^X) -> |110> targets.append({'110': shots}) return targets def cswap_gate_circuits_nondeterministic(final_measure=True): """cswap-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(3) if final_measure: cr = ClassicalRegister(3) regs = (qr, cr) else: regs = (qr, ) # CSWAP(0,1,2).(H^H^H) circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.h(qr[1]) circuit.h(qr[2]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(X^I^H). -> |100> + |011> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.x(qr[2]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(I^X^H). -> |010> + |101> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.x(qr[1]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(I^H^I) -> |010>+|000> circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(H^I^I) -> |100>+|000> circuit = QuantumCircuit(*regs) circuit.h(qr[2]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(I^I^H) -> |001>+|000> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CSWAP(0,1,2).(X^X^H) -> |110> + |111> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.x(qr[1]) circuit.x(qr[2]) circuit.cswap(qr[0], qr[1], qr[2]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cswap_gate_counts_nondeterministic(shots, hex_counts=True): targets = [] if hex_counts: # CSWAP(0,1,2).(H^H^H) -> |---> targets.append({ '0x0': shots / 8, '0x1': shots / 8, '0x2': shots / 8, '0x3': shots / 8, '0x4': shots / 8, '0x5': shots / 8, '0x6': shots / 8, '0x7': shots / 8, }) # CSWAP(0,1,2).(X^I^H). -> |100> + |011> targets.append({'0x3': shots / 2, '0x4': shots / 2}) # CSWAP(0,1,2).(I^X^H). -> |010> + |101> targets.append({'0x2': shots / 2, '0x5': shots / 2}) # CSWAP(0,1,2).(I^H^I) -> |0-0> targets.append({'0x2': shots / 2, '0x0': shots / 2}) # CSWAP(0,1,2).(H^I^I) -> |-00> targets.append({'0x4': shots / 2, '0x0': shots / 2}) # CSWAP(0,1,2).(I^I^H) -> |00-> targets.append({'0x0': shots / 2, '0x1': shots / 2}) # CSWAP(0,1,2).(X^X^H) -> |110> + |111> targets.append({'0x6': shots / 2, '0x7': shots / 2}) else: # CSWAP(0,1,2).(H^H^H) -> |---> targets.append({ '000': shots / 8, '001': shots / 8, '010': shots / 8, '011': shots / 8, '100': shots / 8, '101': shots / 8, '110': shots / 8, '111': shots / 8, }) # CSWAP(0,1,2).(X^I^H). -> |100> + |011> targets.append({'011': shots / 2, '100': shots / 2}) # CSWAP(0,1,2).(I^X^H). -> |010> + |101> targets.append({'010': shots / 2, '101': shots / 2}) # CSWAP(0,1,2).(I^H^I) -> |0-0> targets.append({'010': shots / 2, '000': shots / 2}) # CSWAP(0,1,2).(H^I^I) -> |-00> targets.append({'100': shots / 2, '000': shots / 2}) # CSWAP(0,1,2).(I^I^H) -> |00-> targets.append({'001': shots / 2, '000': shots / 2}) # CSWAP(0,1,2).(X^X^H) -> |110> + |111> targets.append({'110': shots / 2, '111': shots / 2}) return targets def cswap_gate_statevector_deterministic(): targets = [] # CSWAP(0,1,2) # -> |000> targets.append(np.array([1, 0, 0, 0, 0, 0, 0, 0])) # CSWAP(0,1,2).(X^I^I) -> |100> targets.append(np.array([0, 0, 0, 0, 1, 0, 0, 0])) # CSWAP(0,1,2).(I^X^I) -> |010> targets.append(np.array([0, 0, 1, 0, 0, 0, 0, 0])) # CSWAP(0,1,2).(X^X^I) -> |110> targets.append(np.array([0, 0, 0, 0, 0, 0, 1, 0])) # CSWAP(0,1,2).(I^I^X) -> |001> targets.append(np.array([0, 1, 0, 0, 0, 0, 0, 0])) # CSWAP(0,1,2).(I^X^X) -> |101> targets.append(np.array([0, 0, 0, 0, 0, 1, 0, 0])) # CSWAP(0,1,2).(X^I^X) -> |011> targets.append(np.array([0, 0, 0, 1, 0, 0, 0, 0])) # CSWAP(0,1,2).(X^X^X) -> |111> targets.append(np.array([0, 0, 0, 0, 0, 0, 0, 1])) # CSWAP(1,0,2).(I^X^X) -> |110> targets.append(np.array([0, 0, 0, 0, 0, 0, 1, 0])) # CSWAP(2,1,0).(X^I^X) -> |110> targets.append(np.array([0, 0, 0, 0, 0, 0, 1, 0])) return targets def cswap_gate_statevector_nondeterministic(): targets = [] # CSWAP(0,1,2).(H^H^H) -> |---> targets.append(np.array([1, 1, 1, 1, 1, 1, 1, 1]) / np.sqrt(8)) # CSWAP(0,1,2).(X^I^H). -> |100> + |011> targets.append(np.array([0, 0, 0, 1, 1, 0, 0, 0]) / np.sqrt(2)) # CSWAP(0,1,2).(I^X^H). -> |010> + |101> targets.append(np.array([0, 0, 1, 0, 0, 1, 0, 0]) / np.sqrt(2)) # CSWAP(0,1,2).(I^H^I) -> |0-0> targets.append(np.array([1, 0, 1, 0, 0, 0, 0, 0]) / np.sqrt(2)) # CSWAP(0,1,2).(H^I^I) -> |-00> targets.append(np.array([1, 0, 0, 0, 1, 0, 0, 0]) / np.sqrt(2)) # CSWAP(0,1,2).(I^I^H) -> |00-> targets.append(np.array([1, 1, 0, 0, 0, 0, 0, 0]) / np.sqrt(2)) # CSWAP(0,1,2).(X^X^H) -> |110> + |111> targets.append(np.array([0, 0, 0, 0, 0, 0, 1, 1]) / np.sqrt(2)) return targets def cswap_gate_unitary_deterministic(): """cswap-gate circuits reference unitaries.""" targets = [] # CSWAP(0,1,2) # -> |000> targets.append( np.array([[1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1]])) # CSWAP(0,1,2).(X^I^I) -> |100> targets.append( np.array([[0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0]])) # CSWAP(0,1,2).(I^X^I) -> |010> targets.append( np.array([[0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0]])) # CSWAP(0,1,2).(X^X^I) -> |110> targets.append( np.array([[0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0]])) # CSWAP(0,1,2).(I^I^X) -> |001> targets.append( np.array([[0, 1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0]])) # CSWAP(0,1,2).(I^X^X) -> |101> targets.append( np.array([[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]])) # CSWAP(0,1,2).(X^I^X) -> |011> targets.append( np.array([[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]])) # CSWAP(0,1,2).(X^X^X) -> |111> targets.append( np.array([[0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0]])) # CSWAP(1,0,2).(I^X^X) -> |110> targets.append( np.array([[0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0]])) # CSWAP(2,1,0).(X^I^X) -> |110> targets.append( np.array([[0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0]])) return targets def cswap_gate_unitary_nondeterministic(): """cswap-gate circuits reference unitaries.""" targets = [] targets.append( np.array([[ 0.35355339, 0.35355339, 0.35355339, 0.35355339, 0.35355339, 0.35355339, 0.35355339, 0.35355339 ], [ 0.35355339, -0.35355339, 0.35355339, -0.35355339, 0.35355339, -0.35355339, 0.35355339, -0.35355339 ], [ 0.35355339, 0.35355339, -0.35355339, -0.35355339, 0.35355339, 0.35355339, -0.35355339, -0.35355339 ], [ 0.35355339, -0.35355339, 0.35355339, -0.35355339, -0.35355339, 0.35355339, -0.35355339, 0.35355339 ], [ 0.35355339, 0.35355339, 0.35355339, 0.35355339, -0.35355339, -0.35355339, -0.35355339, -0.35355339 ], [ 0.35355339, -0.35355339, -0.35355339, 0.35355339, 0.35355339, -0.35355339, -0.35355339, 0.35355339 ], [ 0.35355339, 0.35355339, -0.35355339, -0.35355339, -0.35355339, -0.35355339, 0.35355339, 0.35355339 ], [ 0.35355339, -0.35355339, -0.35355339, 0.35355339, -0.35355339, 0.35355339, 0.35355339, -0.35355339 ]])) targets.append( np.array([[0, 0, 0, 0, 0.70710678, 0.70710678, 0, 0], [0, 0, 0, 0, 0.70710678, -0.70710678, 0, 0], [0, 0, 0, 0, 0, 0, 0.70710678, 0.70710678], [0.70710678, -0.70710678, 0, 0, 0, 0, 0, 0], [0.70710678, 0.70710678, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0.70710678, -0.70710678], [0, 0, 0.70710678, 0.70710678, 0, 0, 0, 0], [0, 0, 0.70710678, -0.70710678, 0, 0, 0, 0]])) targets.append( np.array([[0, 0, 0.70710678, 0.70710678, 0, 0, 0, 0], [0, 0, 0.70710678, -0.70710678, 0, 0, 0, 0], [0.70710678, 0.70710678, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0.70710678, -0.70710678], [0, 0, 0, 0, 0, 0, 0.70710678, 0.70710678], [0.70710678, -0.70710678, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0.70710678, 0.70710678, 0, 0], [0, 0, 0, 0, 0.70710678, -0.70710678, 0, 0]])) targets.append( np.array([[0.70710678, 0, 0.70710678, 0, 0, 0, 0, 0], [0, 0.70710678, 0, 0.70710678, 0, 0, 0, 0], [0.70710678, 0, -0.70710678, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0.70710678, 0, 0.70710678], [0, 0, 0, 0, 0.70710678, 0, 0.70710678, 0], [0, 0.70710678, 0, -0.70710678, 0, 0, 0, 0], [0, 0, 0, 0, 0.70710678, 0, -0.70710678, 0], [0, 0, 0, 0, 0, 0.70710678, 0, -0.70710678]])) targets.append( np.array([[0.70710678, 0, 0, 0, 0.70710678, 0, 0, 0], [0, 0.70710678, 0, 0, 0, 0.70710678, 0, 0], [0, 0, 0.70710678, 0, 0, 0, 0.70710678, 0], [0, 0.70710678, 0, 0, 0, -0.70710678, 0, 0], [0.70710678, 0, 0, 0, -0.70710678, 0, 0, 0], [0, 0, 0, 0.70710678, 0, 0, 0, 0.70710678], [0, 0, 0.70710678, 0, 0, 0, -0.70710678, 0], [0, 0, 0, 0.70710678, 0, 0, 0, -0.70710678]])) targets.append( np.array([[0.70710678, 0.70710678, 0, 0, 0, 0, 0, 0], [0.70710678, -0.70710678, 0, 0, 0, 0, 0, 0], [0, 0, 0.70710678, 0.70710678, 0, 0, 0, 0], [0, 0, 0, 0, 0.70710678, -0.70710678, 0, 0], [0, 0, 0, 0, 0.70710678, 0.70710678, 0, 0], [0, 0, 0.70710678, -0.70710678, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0.70710678, 0.70710678], [0, 0, 0, 0, 0, 0, 0.70710678, -0.70710678]])) targets.append( np.array([[0, 0, 0, 0, 0, 0, 0.70710678, 0.70710678], [0, 0, 0, 0, 0, 0, 0.70710678, -0.70710678], [0, 0, 0, 0, 0.70710678, 0.70710678, 0, 0], [0, 0, 0.70710678, -0.70710678, 0, 0, 0, 0], [0, 0, 0.70710678, 0.70710678, 0, 0, 0, 0], [0, 0, 0, 0, 0.70710678, -0.70710678, 0, 0], [0.70710678, 0.70710678, 0, 0, 0, 0, 0, 0], [0.70710678, -0.70710678, 0, 0, 0, 0, 0, 0]])) return targets # ========================================================================== # CU1 # ========================================================================== def cu1_gate_circuits_nondeterministic(final_measure): circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # H^X.CU1(0,0,1).H^X circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.x(qr[0]) circuit.cu1(0, qr[0], qr[1]) circuit.x(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^I.CU1(pi,0,1).H^I circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.cu1(np.pi, qr[0], qr[1]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^X.CU1(pi/4,0,1).H^X circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.x(qr[0]) circuit.cu1(np.pi / 4, qr[0], qr[1]) circuit.x(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^X.CU1(pi/2,0,1).H^X circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.x(qr[0]) circuit.cu1(np.pi / 2, qr[0], qr[1]) circuit.x(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^X.CU1(pi,0,1).H^X circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.x(qr[0]) circuit.cu1(np.pi, qr[0], qr[1]) circuit.x(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^H.CU1(0,0,1).H^H circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.h(qr[0]) circuit.cu1(0, qr[0], qr[1]) circuit.h(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^H.CU1(pi/2,0,1).H^H circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.h(qr[0]) circuit.cu1(np.pi / 2, qr[0], qr[1]) circuit.h(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^H.CU1(pi,0,1).H^H circuit = QuantumCircuit(*regs) circuit.h(qr[1]) circuit.h(qr[0]) circuit.cu1(np.pi, qr[0], qr[1]) circuit.h(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cu1_gate_counts_nondeterministic(shots, hex_counts=True): """CU1-gate circuits reference counts.""" targets = [] if hex_counts: # H^X.CU1(0,0,1).H^X targets.append({'0x0': shots}) # H^I.CU1(pi,0,1).H^I targets.append({'0x0': shots}) # H^X.CU1(pi/4,0,1).H^X targets.append({ '0x0': shots * (0.25 * (2 + np.sqrt(2))), '0x2': shots * (0.25 * (2 - np.sqrt(2))) }) # H^X.CU1(pi/2,0,1).H^X targets.append({'0x0': shots * 0.5, '0x2': shots * 0.5}) # H^X.CU1(pi,0,1).H^X targets.append({'0x2': shots}) # H^H.CU1(0,0,1).H^H targets.append({'0x0': shots}) # H^H.CU1(pi/2,0,1).H^H targets.append({ '0x0': shots * 0.625, '0x1': shots * 0.125, '0x2': shots * 0.125, '0x3': shots * 0.125 }) # H^H.CU1(pi,0,1).H^H targets.append({ '0x0': shots * 0.25, '0x1': shots * 0.25, '0x2': shots * 0.25, '0x3': shots * 0.25 }) else: # H^X.CU1(0,0,1).H^X targets.append({'00': shots}) # H^I.CU1(pi,0,1).H^I targets.append({'00': shots}) # H^X.CU1(pi/4,0,1).H^X targets.append({'00': shots * 0.85, '10': shots * 0.15}) # H^X.CU1(pi/2,0,1).H^X targets.append({'00': shots * 0.5, '10': shots * 0.5}) # H^X.CU1(pi,0,1).H^X targets.append({'10': shots}) # H^H.CU1(0,0,1).H^H targets.append({'00': shots}) # H^H.CU1(pi/2,0,1).H^H targets.append({ '00': shots * 0.5125, '01': shots * 0.125, '10': shots * 0.125, '11': shots * 0.125 }) # H^H.CU1(pi,0,1).H^H targets.append({ '00': shots * 0.25, '01': shots * 0.25, '10': shots * 0.25, '11': shots * 0.25 }) return targets def cu1_gate_statevector_nondeterministic(): targets = [] # H^X.CU1(0,0,1).H^X targets.append(np.array([1, 0, 0, 0])) # H^I.CU1(pi,0,1).H^I targets.append(np.array([1, 0, 0, 0])) # H^X.CU1(pi/4,0,1).H^X targets.append( np.array([(0.25 * (2 + np.sqrt(2))) + (1 / (2 * np.sqrt(2))) * 1j, 0, (0.25 * (2 - np.sqrt(2))) - (1 / (2 * np.sqrt(2))) * 1j, 0])) # H^X.CU1(pi/2,0,1).H^X targets.append(np.array([0.5 + 0.5j, 0, 0.5 - 0.5j, 0])) # H^X.CU1(pi,0,1).H^X targets.append(np.array([0, 0, 1, 0])) # H^H.CU1(0,0,1).H^H targets.append(np.array([1, 0, 0, 0])) # H^H.CU1(pi/2,0,1).H^H targets.append( np.array([0.75 + 0.25j, 0.25 - 0.25j, 0.25 - 0.25j, -0.25 + 0.25j])) # H^H.CU1(pi,0,1).H^H targets.append(np.array([0.5, 0.5, 0.5, -0.5])) return targets def cu1_gate_unitary_nondeterministic(): targets = [] # H^X.CU1(0,0,1).H^X targets.append(np.eye(4)) # H^I.CU1(pi,0,1).H^I targets.append( np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])) # H^X.CU1(pi/4,0,1).H^X targets.append( np.array([[(0.25 * (2 + np.sqrt(2))) + (1 / (2 * np.sqrt(2))) * 1j, 0, (0.25 * (2 - np.sqrt(2))) - (1 / (2 * np.sqrt(2))) * 1j, 0], [0, 1, 0, 0], [(0.25 * (2 - np.sqrt(2))) - (1 / (2 * np.sqrt(2))) * 1j, 0, (0.25 * (2 + np.sqrt(2))) + (1 / (2 * np.sqrt(2))) * 1j, 0], [0, 0, 0, 1]])) # H^X.CU1(pi/2,0,1).H^X targets.append( np.array([[0.5 + 0.5j, 0, 0.5 - 0.5j, 0], [0, 1, 0, 0], [0.5 - 0.5j, 0, 0.5 + 0.5j, 0], [0, 0, 0, 1]])) # H^X.CU1(pi,0,1).H^X targets.append( np.array([[0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]])) # H^H.CU1(0,0,1).H^H targets.append(np.eye(4)) # H^H.CU1(pi/2,0,1).H^H targets.append( (0.75 + 0.25j) * np.eye(4) + (0.25 - 0.25j) * np.array([[0, 1, 1, -1], [1, 0, -1, 1], [1, -1, 0, 1], [-1, 1, 1, 0]])) # H^H.CU1(pi,0,1).H^H targets.append( 0.5 * np.array([[1, 1, 1, -1], [1, 1, -1, 1], [1, -1, 1, 1], [-1, 1, 1, 1]])) return targets # ========================================================================== # CU3 # ========================================================================== def cu3_gate_circuits_deterministic(final_measure): circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # I^X.CI.I^X circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.cu3(0, 0, 0, qr[0], qr[1]) circuit.x(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX circuit = QuantumCircuit(*regs) circuit.cu3(np.pi, 0, np.pi, qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # I^X.CX.I^X circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.cu3(np.pi, 0, np.pi, qr[0], qr[1]) circuit.x(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # H^X.CH.I^X circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.cu3(np.pi / 2, 0, np.pi, qr[0], qr[1]) circuit.x(qr[0]) circuit.h(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # I^X.CRX(pi).I^X circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.cu3(np.pi, -np.pi / 2, np.pi / 2, qr[0], qr[1]) circuit.x(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # I^X.CRY(pi).I^X circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.cu3(np.pi, 0, 0, qr[0], qr[1]) circuit.x(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cu3_gate_unitary_deterministic(): targets = [] # I^X.CI.I^X targets.append(np.eye(4)) # CX targets.append( np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])) # I^X.CX.I^X targets.append( np.array([[0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]])) # H^X.CH.I^X targets.append( np.array([[1, 0, 0, 0], [0, 1 / np.sqrt(2), 0, 1 / np.sqrt(2)], [0, 0, 1, 0], [0, 1 / np.sqrt(2), 0, -1 / np.sqrt(2)]])) # I^X.CRX(pi).I^X targets.append( np.array([[0, 0, -1j, 0], [0, 1, 0, 0], [-1j, 0, 0, 0], [0, 0, 0, 1]])) # I^X.CRY(pi).I^X targets.append( np.array([[0, 0, -1, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]])) return targets def cu3_gate_statevector_deterministic(): init_state = np.array([1, 0, 0, 0]) targets = [mat.dot(init_state) for mat in cu3_gate_unitary_deterministic()] return targets def cu3_gate_counts_deterministic(shots, hex_counts=True): """CU2-gate circuits reference counts.""" probs = [np.abs(vec)**2 for vec in cu3_gate_statevector_deterministic()] targets = [] for prob in probs: if hex_counts: targets.append({hex(i): shots * p for i, p in enumerate(prob)}) else: counts = {} for i, p in enumerate(prob): key = bin(i)[2:] key = (2 - len(key)) * '0' + key counts[key] = shots * p targets.append(counts) return targets qiskit-aer-0.4.1/test/terra/reference/ref_pauli_noise.py000066400000000000000000000221071362723322000233360ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator readout error NoiseModel integration tests """ from test.terra.utils.utils import list2dict from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import pauli_error # ========================================================================== # Pauli Gate Errors # ========================================================================== def pauli_gate_error_circuits(): """Local Pauli gate error noise model circuits""" circuits = [] qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') # 100% all-qubit Pauli error on "id" gate circuit = QuantumCircuit(qr, cr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25% all-qubit Pauli error on "id" gates circuit = QuantumCircuit(qr, cr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 100% Pauli error on "id" gates on qubit-1 circuit = QuantumCircuit(qr, cr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25% all-qubit Pauli error on "id" gates on qubit-0 circuit = QuantumCircuit(qr, cr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25% Pauli-X error on spectator for CX gate on [0, 1] qr = QuantumRegister(3, 'qr') cr = ClassicalRegister(3, 'cr') circuit = QuantumCircuit(qr, cr) circuit.cx(qr[0], qr[1]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def pauli_gate_error_noise_models(): """Local Pauli gate error noise models""" noise_models = [] # 100% all-qubit Pauli error on "id" gates error = pauli_error([('X', 1)]) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, 'id') noise_models.append(noise_model) # 25% all-qubit Pauli error on "id" gates error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, 'id') noise_models.append(noise_model) # 100% Pauli error on "id" gates on qubit-1 error = pauli_error([('X', 1)]) noise_model = NoiseModel() noise_model.add_quantum_error(error, 'id', [1]) noise_models.append(noise_model) # 25% all-qubit Pauli error on "id" gates on qubit-0 error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_quantum_error(error, 'id', [0]) noise_models.append(noise_model) # 25% Pauli-X error on spectator for CX gate on [0, 1] error = pauli_error([('XII', 0.25), ('III', 0.75)]) noise_model = NoiseModel() noise_model.add_nonlocal_quantum_error(error, 'cx', [0, 1], [0, 1, 2]) noise_models.append(noise_model) return noise_models def pauli_gate_error_counts(shots, hex_counts=True): """Pauli gate error circuits reference counts""" counts_lists = [] # 100% all-qubit Pauli error on "id" gates counts = [0, 0, 0, shots] counts_lists.append(counts) # 25% all-qubit Pauli error on "id" gates counts = [9 * shots / 16, 3 * shots / 16, 3 * shots / 16, shots / 16] counts_lists.append(counts) # 100% Pauli error on "id" gates on qubit-1 counts = [0, 0, shots, 0] counts_lists.append(counts) # 25% all-qubit Pauli error on "id" gates on qubit-0 counts = [3 * shots / 4, shots / 4, 0, 0] counts_lists.append(counts) # 25% Pauli-X error on spectator for CX gate on [0, 1] counts = [3 * shots / 4, 0, 0, 0, shots / 4, 0, 0, 0] counts_lists.append(counts) # Convert to counts dict return [list2dict(i, hex_counts) for i in counts_lists] # ========================================================================== # Pauli Measure Errors # ========================================================================== def pauli_measure_error_circuits(): """Local Pauli measure error noise model circuits""" circuits = [] qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') # 25% all-qubit Pauli error on measure circuit = QuantumCircuit(qr, cr) circuit.measure(qr, cr) circuits.append(circuit) # 25% local Pauli error on measure of qubit 1 circuit = QuantumCircuit(qr, cr) circuit.measure(qr, cr) circuits.append(circuit) # 25 % non-local Pauli error on qubit 1 for measure of qubit-1 circuit = QuantumCircuit(qr, cr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def pauli_measure_error_noise_models(): """Local Pauli measure error noise models""" noise_models = [] # 25% all-qubit Pauli error on measure error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, 'measure') noise_models.append(noise_model) # 25% local Pauli error on measure of qubit 1 error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_quantum_error(error, 'measure', [1]) noise_models.append(noise_model) # 25 % non-local Pauli error on qubit 1 for measure of qubit-1 error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_nonlocal_quantum_error(error, 'measure', [0], [1]) noise_models.append(noise_model) return noise_models def pauli_measure_error_counts(shots, hex_counts=True): """Local Pauli measure error circuits reference counts""" counts_lists = [] # 25% all-qubit Pauli error on measure counts = [9 * shots / 16, 3 * shots / 16, 3 * shots / 16, shots / 16] counts_lists.append(counts) # 25% local Pauli error on measure of qubit 1 counts = [3 * shots / 4, 0, shots / 4, 0] counts_lists.append(counts) # 25 % non-local Pauli error on qubit 1 for measure of qubit-1 counts = [3 * shots / 4, 0, shots / 4, 0] counts_lists.append(counts) # Convert to counts dict return [list2dict(i, hex_counts) for i in counts_lists] # ========================================================================== # Pauli Reset Errors # ========================================================================== def pauli_reset_error_circuits(): """Local Pauli reset error noise model circuits""" circuits = [] qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') # 25% all-qubit Pauli error on reset circuit = QuantumCircuit(qr, cr) circuit.barrier(qr) circuit.reset(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25% local Pauli error on reset of qubit 1 circuit = QuantumCircuit(qr, cr) circuit.barrier(qr) circuit.reset(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25 % non-local Pauli error on qubit 1 for reset of qubit-0 circuit = QuantumCircuit(qr, cr) circuit.barrier(qr) circuit.reset(qr[1]) circuit.barrier(qr) circuit.reset(qr[0]) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def pauli_reset_error_noise_models(): """Local Pauli reset error noise models""" noise_models = [] # 25% all-qubit Pauli error on reset error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, 'reset') noise_models.append(noise_model) # 25% local Pauli error on reset of qubit 1 error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_quantum_error(error, 'reset', [1]) noise_models.append(noise_model) # 25 % non-local Pauli error on qubit 1 for reset of qubit-0 error = pauli_error([('X', 0.25), ('I', 0.75)]) noise_model = NoiseModel() noise_model.add_nonlocal_quantum_error(error, 'reset', [0], [1]) noise_models.append(noise_model) return noise_models def pauli_reset_error_counts(shots, hex_counts=True): """Local Pauli reset error circuits reference counts""" counts_lists = [] # 25% all-qubit Pauli error on reset counts = [9 * shots / 16, 3 * shots / 16, 3 * shots / 16, shots / 16] counts_lists.append(counts) # 25% local Pauli error on reset of qubit 1 counts = [3 * shots / 4, 0, shots / 4, 0] counts_lists.append(counts) # 25 % non-local Pauli error on qubit 1 for reset of qubit-0 counts = [3 * shots / 4, 0, shots / 4, 0] counts_lists.append(counts) # Convert to counts dict return [list2dict(i, hex_counts) for i in counts_lists] qiskit-aer-0.4.1/test/terra/reference/ref_readout_noise.py000066400000000000000000000105271362723322000236720ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator readout error NoiseModel integration tests """ from test.terra.utils.utils import list2dict from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.circuit import Instruction from qiskit.providers.aer.noise import NoiseModel # ========================================================================== # Readout error # ========================================================================== # Error matrices used in tests ROERROR_1Q = [[0.9, 0.1], [0.3, 0.7]] ROERROR_2Q = [[0.3, 0, 0, 0.7], [0, 0.6, 0.4, 0], [0, 0, 1, 0], [0.1, 0, 0, 0.9]] def readout_error_circuits(): """Readout error test circuits""" circuits = [] # Test circuit: ideal bell state for 1-qubit readout errors qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') circuit = QuantumCircuit(qr, cr) circuit.h(qr[0]) circuit.cx(qr[0], qr[1]) # Ensure qubit 0 is measured before qubit 1 circuit.barrier(qr) circuit.measure(qr[0], cr[0]) circuit.barrier(qr) circuit.measure(qr[1], cr[1]) # Add three copies of circuit circuits += 3 * [circuit] # 2-qubit correlated readout error circuit measure2 = Instruction("measure", 2, 2, []) # 2-qubit measure qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') circuit = QuantumCircuit(qr, cr) circuit.h(qr) circuit.barrier(qr) circuit.append(measure2, [0, 1], [0, 1]) circuits.append(circuit) return circuits def readout_error_noise_models(): """Readout error test circuit noise models.""" noise_models = [] # 1-qubit readout error on qubit 0 noise_model = NoiseModel() noise_model.add_readout_error(ROERROR_1Q, [0]) noise_models.append(noise_model) # 1-qubit readout error on qubit 1 noise_model = NoiseModel() noise_model.add_readout_error(ROERROR_1Q, [1]) noise_models.append(noise_model) # 1-qubit readout error on qubit 1 noise_model = NoiseModel() noise_model.add_all_qubit_readout_error(ROERROR_1Q) noise_models.append(noise_model) # 2-qubit readout error on qubits 0,1 noise_model = NoiseModel() noise_model.add_readout_error(ROERROR_2Q, [0, 1]) noise_models.append(noise_model) return noise_models def readout_error_counts(shots, hex_counts=True): """Readout error test circuits reference counts.""" counts_lists = [] # 1-qubit readout error on qubit 0 counts = [ ROERROR_1Q[0][0] * shots / 2, ROERROR_1Q[0][1] * shots / 2, ROERROR_1Q[1][0] * shots / 2, ROERROR_1Q[1][1] * shots / 2 ] counts_lists.append(counts) # 1-qubit readout error on qubit 1 counts = [ ROERROR_1Q[0][0] * shots / 2, ROERROR_1Q[1][0] * shots / 2, ROERROR_1Q[0][1] * shots / 2, ROERROR_1Q[1][1] * shots / 2 ] counts_lists.append(counts) # 1-qubit readout error on qubit 1 p00 = 0.5 * (ROERROR_1Q[0][0]**2 + ROERROR_1Q[1][0]**2) p01 = 0.5 * ( ROERROR_1Q[0][0] * ROERROR_1Q[0][1] + ROERROR_1Q[1][0] * ROERROR_1Q[1][1]) p10 = 0.5 * ( ROERROR_1Q[0][0] * ROERROR_1Q[0][1] + ROERROR_1Q[1][0] * ROERROR_1Q[1][1]) p11 = 0.5 * (ROERROR_1Q[0][1]**2 + ROERROR_1Q[1][1]**2) counts = [p00 * shots, p01 * shots, p10 * shots, p11 * shots] counts_lists.append(counts) # 2-qubit readout error on qubits 0,1 probs_ideal = [0.25, 0.25, 0.25, 0.25] p00 = sum([ ideal * noise[0] for ideal, noise in zip(probs_ideal, ROERROR_2Q) ]) p01 = sum([ ideal * noise[1] for ideal, noise in zip(probs_ideal, ROERROR_2Q) ]) p10 = sum([ ideal * noise[2] for ideal, noise in zip(probs_ideal, ROERROR_2Q) ]) p11 = sum([ ideal * noise[3] for ideal, noise in zip(probs_ideal, ROERROR_2Q) ]) counts = [p00 * shots, p01 * shots, p10 * shots, p11 * shots] counts_lists.append(counts) return [list2dict(i, hex_counts) for i in counts_lists] qiskit-aer-0.4.1/test/terra/reference/ref_reset.py000066400000000000000000000141521362723322000221520ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for reset instruction. """ from numpy import array, sqrt from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit # ========================================================================== # Deterministic output # ========================================================================== def reset_circuits_deterministic(final_measure=True): """Reset test circuits with deterministic count output""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # Reset 0 from |11> circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.reset(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Reset 1 from |11> circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.reset(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Reset 0,1 from |11> circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.reset(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Reset 0,1 from |++> circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.reset(qr) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def reset_counts_deterministic(shots, hex_counts=True): """Reset test circuits reference counts.""" targets = [] if hex_counts: # Reset 0 from |11> targets.append({'0x2': shots}) # Reset 1 from |11> targets.append({'0x1': shots}) # Reset 0,1 from |11> targets.append({'0x0': shots}) # Reset 0,1 from |++> targets.append({'0x0': shots}) else: # Reset 0 from |11> targets.append({'10': shots}) # Reset 1 from |11> targets.append({'01': shots}) # Reset 0,1 from |11> targets.append({'00': shots}) # Reset 0,1 from |++> targets.append({'00': shots}) return targets def reset_statevector_deterministic(): """Reset test circuits reference counts.""" targets = [] # Reset 0 from |11> targets.append(array([0, 0, 1, 0])) # Reset 1 from |11> targets.append(array([0, 1, 0, 0])) # Reset 0,1 from |11> targets.append(array([1, 0, 0, 0])) # Reset 0,1 from |++> targets.append(array([1, 0, 0, 0])) return targets # ========================================================================== # Non-Deterministic output # ========================================================================== def reset_circuits_nondeterministic(final_measure=True): """Reset test circuits with deterministic count output""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # Reset 0 from |++> circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.reset(qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # Reset 1 from |++> circuit = QuantumCircuit(*regs) circuit.h(qr) circuit.reset(qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def reset_counts_nondeterministic(shots, hex_counts=True): """Reset test circuits reference counts.""" targets = [] if hex_counts: # Reset 0 from |++> targets.append({'0x0': shots / 2, '0x2': shots / 2}) # Reset 1 from |++> targets.append({'0x0': shots / 2, '0x1': shots / 2}) else: # Reset 0 from |++> targets.append({'00': shots / 2, '10': shots / 2}) # Reset 1 from |++> targets.append({'00': shots / 2, '01': shots / 2}) return targets def reset_statevector_nondeterministic(): """Reset test circuits reference counts.""" targets = [] # Reset 0 from |++> targets.append(array([1, 0, 1, 0]) / sqrt(2)) # Reset 1 from |++> targets.append(array([1, 1, 0, 0]) / sqrt(2)) return targets # ========================================================================== # Repeated Resets # ========================================================================== def reset_circuits_repeated(): """Test circuit for repeated measure reset""" qr = QuantumRegister(1) cr = ClassicalRegister(2) qc = QuantumCircuit(qr, cr) qc.x(qr[0]) qc.measure(qr[0], cr[0]) qc.reset(qr[0]) qc.measure(qr[0], cr[1]) qc.reset(qr[0]) return [qc] def reset_counts_repeated(shots, hex_counts=True): """Sampling optimization counts""" if hex_counts: return [{'0x1': shots}] else: return [{'01': shots}] # ========================================================================== # Sampling optimization # ========================================================================== def reset_circuits_sampling_optimization(): """Test sampling optimization""" qr = QuantumRegister(2) cr = ClassicalRegister(2) qc = QuantumCircuit(qr, cr) # The optimization should not be triggerred # because the reset operation performs randomizations qc.h(qr[0]) qc.cx(qr[0], qr[1]) qc.reset([qr[0]]) qc.measure(qr, cr) return [qc] def reset_counts_sampling_optimization(shots, hex_counts=True): """Sampling optimization counts""" if hex_counts: return [{'0x0': shots/2, '0x2': shots/2}] else: return [{'00': shots/2, '10': shots/2}] qiskit-aer-0.4.1/test/terra/reference/ref_reset_noise.py000066400000000000000000000103071362723322000233450ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ QasmSimulator reset error NoiseModel integration tests """ from test.terra.utils.utils import list2dict from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import reset_error # ========================================================================== # Reset Gate Errors # ========================================================================== def reset_gate_error_circuits(): """Reset gate error noise model circuits""" circuits = [] # 50% reset to 0 state on qubit 0 qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') circuit = QuantumCircuit(qr, cr) circuit.x(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25% reset to 0 state on qubit 1 qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') circuit = QuantumCircuit(qr, cr) circuit.x(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 100% reset error to 0 on all qubits qr = QuantumRegister(1, 'qr') cr = ClassicalRegister(1, 'cr') circuit = QuantumCircuit(qr, cr) circuit.x(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 100% reset error to 1 on all qubits qr = QuantumRegister(1, 'qr') cr = ClassicalRegister(1, 'cr') circuit = QuantumCircuit(qr, cr) circuit.iden(qr) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # 25% reset error to 0 and 1 on all qubits qr = QuantumRegister(2, 'qr') cr = ClassicalRegister(2, 'cr') circuit = QuantumCircuit(qr, cr) circuit.iden(qr[0]) circuit.x(qr[1]) circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def reset_gate_error_noise_models(): """Reset gate error noise models""" noise_models = [] # 50% reset to 0 state on qubit 0 error = reset_error(0.5) noise_model = NoiseModel() noise_model.add_quantum_error(error, 'x', [0]) noise_models.append(noise_model) # 25% reset to 0 state on qubit 1 error = reset_error(0.25) noise_model = NoiseModel() noise_model.add_quantum_error(error, 'x', [1]) noise_models.append(noise_model) # 100% reset error to 0 on all qubits error = reset_error(1) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['id', 'x']) noise_models.append(noise_model) # 100% reset error to 1 on all qubits error = reset_error(0, 1) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['id', 'x']) noise_models.append(noise_model) # 25% reset error to 0 and 1 on all qubits error = reset_error(0.25, 0.25) noise_model = NoiseModel() noise_model.add_all_qubit_quantum_error(error, ['id', 'x']) noise_models.append(noise_model) return noise_models def reset_gate_error_counts(shots, hex_counts=True): """Reset gate error circuits reference counts""" counts_lists = [] # 50% reset to 0 state on qubit 0 counts = [0, 0, shots / 2, shots / 2] counts_lists.append(counts) # 25% reset to 0 state on qubit 1 counts = [0, shots / 4, 0, 3 * shots / 4] counts_lists.append(counts) # 100% reset error to 0 on all qubits counts = [shots, 0, 0, 0] counts_lists.append(counts) # 100% reset error to 1 on all qubits counts = [0, shots, 0, 0] counts_lists.append(counts) # 25% reset error to 0 and 1 on all qubits counts = [3 * shots / 16, shots / 16, 9 * shots / 16, 3 * shots / 16] counts_lists.append(counts) # Convert to counts dict return [list2dict(i, hex_counts) for i in counts_lists] qiskit-aer-0.4.1/test/terra/reference/ref_snapshot_expval.py000066400000000000000000000203701362723322000242450ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for snapshot state instructions. """ import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.quantum_info.states import Statevector from qiskit.providers.aer.extensions.snapshot_expectation_value import * def snapshot_expval_labels(): """List of labels for exp val snapshots.""" return [ "", "", "", "", "", "", "", "", "", "", "", "", "", "" ] def snapshot_expval_params(pauli=False): """Dictionary of labels and params, qubits for exp val snapshots.""" if pauli: X_wpo = [[1, 'X']] Z_wpo = [[1, 'Z']] H_wpo = [[1 / np.sqrt(2), 'X'], [1 / np.sqrt(2), 'Z']] IX_wpo = [[1, 'IX']] IZ_wpo = [[1, 'IZ']] IH_wpo = [[1 / np.sqrt(2), 'IX'], [1 / np.sqrt(2), 'IZ']] XX_wpo = [[1, 'XX']] ZZ_wpo = [[1, 'ZZ']] else: X_wpo = np.array([[0, 1], [1, 0]], dtype=complex) Z_wpo = np.array([[1, 0], [0, -1]], dtype=complex) H_wpo = np.array([[1, 1], [1, -1]], dtype=complex) / np.sqrt(2) IX_wpo = np.kron(np.eye(2), X_wpo) IZ_wpo = np.kron(np.eye(2), Z_wpo) IH_wpo = np.kron(np.eye(2), H_wpo) XX_wpo = np.kron(X_wpo, X_wpo) ZZ_wpo = np.kron(Z_wpo, Z_wpo) return { "": (H_wpo, [0]), "": (H_wpo, [1]), "": (X_wpo, [0]), "": (X_wpo, [1]), "": (Z_wpo, [0]), "": (Z_wpo, [1]), "": (IH_wpo, [0, 1]), "": (IH_wpo, [1, 0]), "": (IX_wpo, [0, 1]), "": (IX_wpo, [1, 0]), "": (IZ_wpo, [0, 1]), "": (IZ_wpo, [1, 0]), "": (XX_wpo, [0, 1]), "": (ZZ_wpo, [0, 1]), } def snapshot_expval_circuits(pauli=False, single_shot=False, variance=False, post_measure=False): """SnapshotExpectationValue test circuits with deterministic counts""" circuits = [] num_qubits = 2 qr = QuantumRegister(num_qubits) cr = ClassicalRegister(num_qubits) regs = (qr, cr) # State |+1> circuit = QuantumCircuit(*regs) circuit.x(0) circuit.h(1) if not post_measure: for label, (params, qubits) in snapshot_expval_params(pauli=pauli).items(): circuit.snapshot_expectation_value(label, params, qubits, single_shot=single_shot, variance=variance) circuit.barrier(qr) circuit.measure(qr, cr) circuit.barrier(qr) if post_measure: for label, (params, qubits) in snapshot_expval_params(pauli=pauli).items(): circuit.snapshot_expectation_value(label, params, qubits, single_shot=single_shot, variance=variance) circuits.append(circuit) # State |00> + |11> circuit = QuantumCircuit(*regs) circuit.h(0) circuit.cx(0, 1) if not post_measure: for label, (params, qubits) in snapshot_expval_params(pauli=pauli).items(): circuit.snapshot_expectation_value(label, params, qubits, single_shot=single_shot, variance=variance) circuit.barrier(qr) circuit.measure(qr, cr) circuit.barrier(qr) if post_measure: for label, (params, qubits) in snapshot_expval_params(pauli=pauli).items(): circuit.snapshot_expectation_value(label, params, qubits, single_shot=single_shot, variance=variance) circuits.append(circuit) # State |10> -i|01> circuit = QuantumCircuit(*regs) circuit.h(0) circuit.s(0) circuit.cx(0, 1) circuit.x(1) if not post_measure: for label, (params, qubits) in snapshot_expval_params(pauli=pauli).items(): circuit.snapshot_expectation_value(label, params, qubits, single_shot=single_shot, variance=variance) circuit.barrier(qr) circuit.measure(qr, cr) circuit.barrier(qr) if post_measure: for label, (params, qubits) in snapshot_expval_params(pauli=pauli).items(): circuit.snapshot_expectation_value(label, params, qubits, single_shot=single_shot, variance=variance) circuits.append(circuit) return circuits def snapshot_expval_counts(shots): """SnapshotExpectationValue test circuits reference counts.""" targets = [] # State |+1> targets.append({'0x1': shots / 2, '0x3': shots / 2}) # State |00> + |11> targets.append({'0x0': shots / 2, '0x3': shots / 2}) # State |01> -i|01> targets.append({'0x1': shots / 2, '0x2': shots / 2}) return targets def snapshot_expval_final_statevecs(): """SnapshotExpectationValue test circuits pre meas statevecs""" # Get pre-measurement statevectors statevecs = [] # State |+1> statevec = Statevector.from_label('+1') statevecs.append(statevec) # State |00> + |11> statevec = (Statevector.from_label('00') + Statevector.from_label('11')) / np.sqrt(2) statevecs.append(statevec) # State |10> -i|01> statevec = (Statevector.from_label('10') - 1j * Statevector.from_label('01')) / np.sqrt(2) statevecs.append(statevec) return statevecs def snapshot_expval_pre_meas_values(): """SnapshotExpectationValue test circuits reference final probs""" targets = [] for statevec in snapshot_expval_final_statevecs(): values = {} for label, (mat, qubits) in snapshot_expval_params().items(): values[label] = { '0x0': statevec.data.conj().dot(statevec.evolve(mat, qubits).data) } targets.append(values) return targets def snapshot_expval_post_meas_values(): """SnapshotExpectationValue test circuits reference final statevector""" targets = [] for statevec in snapshot_expval_final_statevecs(): values = {} for label, (mat, qubits) in snapshot_expval_params().items(): inner_dict = {} for j in ['00', '01', '10', '11']: # Check if non-zero measurement probability for given # measurement outcome for final statevector vec = Statevector.from_label(j) if not np.isclose(vec.data.dot(statevec.data), 0): # If outcome is non-zero compute expectation value # with post-selected outcome state inner_dict[hex(int(j, 2))] = vec.data.conj().dot(vec.evolve(mat, qubits).data) values[label] = inner_dict targets.append(values) return targets qiskit-aer-0.4.1/test/terra/reference/ref_snapshot_probabilities.py000066400000000000000000000140141362723322000255740ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for snapshot state instructions. """ from numpy import array from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer.extensions.snapshot_probabilities import * def snapshot_probabilities_labels_qubits(): """Dictionary of labels and qubits for 3-qubit probability snapshots""" return { "[0]": [0], "[1]": [1], "[2]": [2], "[0, 1]": [0, 1], "[1, 0]": [1, 0], "[0, 2]": [0, 2], "[2, 0]": [2, 0], "[1, 2]": [1, 2], "[2, 1]": [2, 1], "[0, 1, 2]": [0, 1, 2], "[1, 2, 0]": [1, 2, 0], "[2, 0, 1]": [2, 0, 1] } def snapshot_probabilities_circuits(post_measure=False): """Snapshot Probabilities test circuits with deterministic counts""" circuits = [] num_qubits = 3 qr = QuantumRegister(num_qubits) cr = ClassicalRegister(num_qubits) regs = (qr, cr) # State |01+> circuit = QuantumCircuit(*regs) circuit.h(0) circuit.x(1) if not post_measure: for label, qubits in snapshot_probabilities_labels_qubits().items(): circuit.snapshot_probabilities(label, qubits) circuit.barrier(qr) circuit.measure(qr, cr) circuit.barrier(qr) if post_measure: for label, qubits in snapshot_probabilities_labels_qubits().items(): circuit.snapshot_probabilities(label, qubits) circuits.append(circuit) # State |010> -i|101> circuit = QuantumCircuit(*regs) circuit.h(0) circuit.sdg(0) circuit.cx(0, 1) circuit.cx(0, 2) circuit.x(1) if not post_measure: for label, qubits in snapshot_probabilities_labels_qubits().items(): circuit.snapshot_probabilities(label, qubits) circuit.barrier(qr) circuit.measure(qr, cr) circuit.barrier(qr) if post_measure: for label, qubits in snapshot_probabilities_labels_qubits().items(): circuit.snapshot_probabilities(label, qubits) circuits.append(circuit) return circuits def snapshot_probabilities_counts(shots): """Snapshot Probabilities test circuits reference counts.""" targets = [] # State |01+> targets.append({'0x2': shots / 2, '0x3': shots / 2}) # State |010> -i|101> targets.append({'0x2': shots / 2, '0x5': shots / 2}) return targets def snapshot_probabilities_pre_meas_probs(): """Snapshot Probabilities test circuits reference final probs""" targets = [] # State |01+> probs = { "[0]": {'0x0': {'0x0': 0.5, '0x1': 0.5}}, "[1]": {'0x0': {'0x1': 1.0}}, "[2]": {'0x0': {'0x0': 1.0}}, "[0, 1]": {'0x0': {'0x2': 0.5, '0x3': 0.5}}, "[1, 0]": {'0x0': {'0x1': 0.5, '0x3': 0.5}}, "[0, 2]": {'0x0': {'0x0': 0.5, '0x1': 0.5}}, "[2, 0]": {'0x0': {'0x0': 0.5, '0x2': 0.5}}, "[1, 2]": {'0x0': {'0x1': 1.0}}, "[2, 1]": {'0x0': {'0x2': 1.0}}, "[0, 1, 2]": {'0x0': {'0x2': 0.5, '0x3': 0.5}}, "[1, 2, 0]": {'0x0': {'0x1': 0.5, '0x5': 0.5}}, "[2, 0, 1]": {'0x0': {'0x4': 0.5, '0x6': 0.5}}, } targets.append(probs) # State |010> -i|101> probs = { "[0]": {'0x0': {'0x0': 0.5, '0x1': 0.5}}, "[1]": {'0x0': {'0x0': 0.5, '0x1': 0.5}}, "[2]": {'0x0': {'0x0': 0.5, '0x1': 0.5}}, "[0, 1]": {'0x0': {'0x1': 0.5, '0x2': 0.5}}, "[1, 0]": {'0x0': {'0x1': 0.5, '0x2': 0.5}}, "[0, 2]": {'0x0': {'0x0': 0.5, '0x3': 0.5}}, "[2, 0]": {'0x0': {'0x0': 0.5, '0x3': 0.5}}, "[1, 2]": {'0x0': {'0x1': 0.5, '0x2': 0.5}}, "[2, 1]": {'0x0': {'0x1': 0.5, '0x2': 0.5}}, "[0, 1, 2]": {'0x0': {'0x2': 0.5, '0x5': 0.5}}, "[1, 2, 0]": {'0x0': {'0x1': 0.5, '0x6': 0.5}}, "[2, 0, 1]": {'0x0': {'0x3': 0.5, '0x4': 0.5}}, } targets.append(probs) return targets def snapshot_probabilities_post_meas_probs(): """Snapshot Probabilities test circuits reference final statevector""" targets = [] # State |01+> probs = { "[0]": {'0x2': {'0x0': 1.0}, '0x3': {'0x1': 1.0}}, "[1]": {'0x2': {'0x1': 1.0}, '0x3': {'0x1': 1.0}}, "[2]": {'0x2': {'0x0': 1.0}, '0x3': {'0x0': 1.0}}, "[0, 1]": {'0x2': {'0x2': 1.0}, '0x3': {'0x3': 1.0}}, "[1, 0]": {'0x2': {'0x1': 1.0}, '0x3': {'0x3': 1.0}}, "[0, 2]": {'0x2': {'0x0': 1.0}, '0x3': {'0x1': 1.0}}, "[2, 0]": {'0x2': {'0x0': 1.0}, '0x3': {'0x2': 1.0}}, "[1, 2]": {'0x2': {'0x1': 1.0}, '0x3': {'0x1': 1.0}}, "[2, 1]": {'0x2': {'0x2': 1.0}, '0x3': {'0x2': 1.0}}, "[0, 1, 2]": {'0x2': {'0x2': 1.0}, '0x3': {'0x3': 1.0}}, "[1, 2, 0]": {'0x2': {'0x1': 1.0}, '0x3': {'0x5': 1.0}}, "[2, 0, 1]": {'0x2': {'0x4': 1.0}, '0x3': {'0x6': 1.0}}, } targets.append(probs) # State |010> -i|101> probs = { "[0]": {'0x2': {'0x0': 1.0}, '0x5': {'0x1': 1.0}}, "[1]": {'0x2': {'0x1': 1.0}, '0x5': {'0x0': 1.0}}, "[2]": {'0x2': {'0x0': 1.0}, '0x5': {'0x1': 1.0}}, "[0, 1]": {'0x2': {'0x2': 1.0}, '0x5': {'0x1': 1.0}}, "[1, 0]": {'0x2': {'0x1': 1.0}, '0x5': {'0x2': 1.0}}, "[0, 2]": {'0x2': {'0x0': 1.0}, '0x5': {'0x3': 1.0}}, "[2, 0]": {'0x2': {'0x0': 1.0}, '0x5': {'0x3': 1.0}}, "[1, 2]": {'0x2': {'0x1': 1.0}, '0x5': {'0x2': 1.0}}, "[2, 1]": {'0x2': {'0x2': 1.0}, '0x5': {'0x1': 1.0}}, "[0, 1, 2]": {'0x2': {'0x2': 1.0}, '0x5': {'0x5': 1.0}}, "[1, 2, 0]": {'0x2': {'0x1': 1.0}, '0x5': {'0x6': 1.0}}, "[2, 0, 1]": {'0x2': {'0x4': 1.0}, '0x5': {'0x3': 1.0}}, } targets.append(probs) return targets qiskit-aer-0.4.1/test/terra/reference/ref_snapshot_state.py000066400000000000000000000134501362723322000240670ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for snapshot state instructions. """ from numpy import array, sqrt from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.providers.aer.extensions.snapshot import Snapshot from qiskit.providers.aer.extensions.snapshot_statevector import * def snapshot_state_circuits_deterministic(snapshot_label='snap', snapshot_type='statevector', post_measure=False): """Snapshot Statevector test circuits""" circuits = [] num_qubits = 3 qr = QuantumRegister(num_qubits) cr = ClassicalRegister(num_qubits) regs = (qr, cr) # State snapshot instruction acting on all qubits snapshot = Snapshot(snapshot_label, snapshot_type, num_qubits) # Snapshot |000> circuit = QuantumCircuit(*regs) if not post_measure: circuit.append(snapshot, qr) circuit.barrier(qr) circuit.measure(qr, cr) if post_measure: circuit.append(snapshot, qr) circuits.append(circuit) # Snapshot |111> circuit = QuantumCircuit(*regs) circuit.x(qr) if not post_measure: circuit.append(snapshot, qr) circuit.barrier(qr) circuit.measure(qr, cr) if post_measure: circuit.append(snapshot, qr) circuits.append(circuit) return circuits def snapshot_state_counts_deterministic(shots): """Snapshot Statevector test circuits reference counts.""" targets = [] # Snapshot |000> targets.append({'0x0': shots}) # Snapshot |111> targets.append({'0x7': shots}) return targets def snapshot_state_pre_measure_statevector_deterministic(): """Snapshot Statevector test circuits reference final statevector""" targets = [] # Snapshot |000> targets.append(array([1, 0, 0, 0, 0, 0, 0, 0], dtype=complex)) # Snapshot |111> targets.append(array([0, 0, 0, 0, 0, 0, 0, 1], dtype=complex)) return targets def snapshot_state_post_measure_statevector_deterministic(): """Snapshot Statevector test circuits reference final statevector""" targets = [] # Snapshot |000> targets.append({'0x0': array([1, 0, 0, 0, 0, 0, 0, 0], dtype=complex)}) # Snapshot |111> targets.append({'0x7': array([0, 0, 0, 0, 0, 0, 0, 1], dtype=complex)}) return targets def snapshot_state_circuits_nondeterministic(snapshot_label='snap', snapshot_type='statevector', post_measure=False): """Snapshot Statevector test circuits""" circuits = [] num_qubits = 3 qr = QuantumRegister(num_qubits) cr = ClassicalRegister(num_qubits) regs = (qr, cr) # State snapshot instruction acting on all qubits snapshot = Snapshot(snapshot_label, snapshot_type, num_qubits) # Snapshot |000> + i|111> circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.s(qr[0]) circuit.cx(qr[0], qr[1]) circuit.cx(qr[0], qr[2]) if not post_measure: circuit.append(snapshot, qr) circuit.barrier(qr) circuit.measure(qr, cr) if post_measure: circuit.append(snapshot, qr) circuits.append(circuit) # Snapshot |+++> circuit = QuantumCircuit(*regs) circuit.h(qr) if not post_measure: circuit.append(snapshot, qr) circuit.barrier(qr) circuit.measure(qr, cr) if post_measure: circuit.append(snapshot, qr) circuits.append(circuit) return circuits def snapshot_state_counts_nondeterministic(shots): """Snapshot Statevector test circuits reference counts.""" targets = [] # Snapshot |000> + i|111> targets.append({'0x0': shots/2, '0x7': shots/2}) # Snapshot |+++> targets.append({'0x0': shots/8, '0x1': shots/8, '0x2': shots/8, '0x3': shots/8, '0x4': shots/8, '0x5': shots/8, '0x6': shots/8, '0x7': shots/8}) return targets def snapshot_state_pre_measure_statevector_nondeterministic(): """Snapshot Statevector test circuits reference final statevector""" targets = [] # Snapshot |000> + i|111> targets.append(array([1, 0, 0, 0, 0, 0, 0, 1j], dtype=complex) / sqrt(2)) # Snapshot |+++> targets.append(array([1, 1, 1, 1, 1, 1, 1, 1], dtype=complex) / sqrt(8)) return targets def snapshot_state_post_measure_statevector_nondeterministic(): """Snapshot Statevector test circuits reference final statevector""" targets = [] # Snapshot |000> + i|111> targets.append({'0x0': array([1, 0, 0, 0, 0, 0, 0, 0], dtype=complex), '0x7': array([0, 0, 0, 0, 0, 0, 0, 1j], dtype=complex)}) # Snapshot |+++> targets.append({'0x0': array([1, 0, 0, 0, 0, 0, 0, 0], dtype=complex), '0x1': array([0, 1, 0, 0, 0, 0, 0, 0], dtype=complex), '0x2': array([0, 0, 1, 0, 0, 0, 0, 0], dtype=complex), '0x3': array([0, 0, 0, 1, 0, 0, 0, 0], dtype=complex), '0x4': array([0, 0, 0, 0, 1, 0, 0, 0], dtype=complex), '0x5': array([0, 0, 0, 0, 0, 1, 0, 0], dtype=complex), '0x6': array([0, 0, 0, 0, 0, 0, 1, 0], dtype=complex), '0x7': array([0, 0, 0, 0, 0, 0, 0, 1], dtype=complex)}) return targets qiskit-aer-0.4.1/test/terra/reference/ref_unitary_gate.py000066400000000000000000000152751362723322000235320ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Test circuits and reference outputs for measure instruction. """ import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit.quantum_info.random import random_unitary def unitary_gate_circuits_deterministic(final_measure=True): """Unitary gate test circuits with deterministic count output.""" circuits = [] qr = QuantumRegister(2, 'qr') if final_measure: cr = ClassicalRegister(2, 'cr') regs = (qr, cr) else: regs = (qr, ) y_mat = np.array([[0, -1j], [1j, 0]], dtype=complex) cx_mat = np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]], dtype=complex) # CX01, |00> state circuit = QuantumCircuit(*regs) circuit.unitary(cx_mat, [0, 1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10, |00> state circuit = QuantumCircuit(*regs) circuit.unitary(cx_mat, [1, 0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(Y^I), |10> state circuit = QuantumCircuit(*regs) circuit.unitary(y_mat, [1]) circuit.unitary(cx_mat, [0, 1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(I^Y), |01> state circuit = QuantumCircuit(*regs) circuit.unitary(y_mat, [0]) circuit.unitary(cx_mat, [1, 0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(I^Y), |11> state circuit = QuantumCircuit(*regs) circuit.unitary(y_mat, [0]) circuit.unitary(cx_mat, [0, 1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(Y^I), |11> state circuit = QuantumCircuit(*regs) circuit.unitary(y_mat, [1]) circuit.unitary(cx_mat, [1, 0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def unitary_gate_counts_deterministic(shots, hex_counts=True): """Unitary gate circuits reference counts.""" targets = [] if hex_counts: # CX01, |00> state targets.append({'0x0': shots}) # {"00": shots} # CX10, |00> state targets.append({'0x0': shots}) # {"00": shots} # CX01.(Y^I), |10> state targets.append({'0x2': shots}) # {"00": shots} # CX10.(I^Y), |01> state targets.append({'0x1': shots}) # {"00": shots} # CX01.(I^Y), |11> state targets.append({'0x3': shots}) # {"00": shots} # CX10.(Y^I), |11> state targets.append({'0x3': shots}) # {"00": shots} else: # CX01, |00> state targets.append({'00': shots}) # {"00": shots} # CX10, |00> state targets.append({'00': shots}) # {"00": shots} # CX01.(Y^I), |10> state targets.append({'10': shots}) # {"00": shots} # CX10.(I^Y), |01> state targets.append({'01': shots}) # {"00": shots} # CX01.(I^Y), |11> state targets.append({'11': shots}) # {"00": shots} # CX10.(Y^I), |11> state return targets def unitary_gate_statevector_deterministic(): """Unitary gate test circuits with deterministic counts.""" targets = [] # CX01, |00> state targets.append(np.array([1, 0, 0, 0])) # CX10, |00> state targets.append(np.array([1, 0, 0, 0])) # CX01.(Y^I), |10> state targets.append(np.array([0, 0, 1j, 0])) # CX10.(I^Y), |01> state targets.append(np.array([0, 1j, 0, 0])) # CX01.(I^Y), |11> state targets.append(np.array([0, 0, 0, 1j])) # CX10.(Y^I), |11> state targets.append(np.array([0, 0, 0, 1j])) return targets def unitary_gate_unitary_deterministic(): """Unitary gate circuits reference unitaries.""" targets = [] # CX01, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])) # CX10, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])) # CX01.(Y^I), |10> state targets.append(np.array([[0, 0, -1j, 0], [0, 1j, 0, 0], [1j, 0, 0, 0], [0, 0, 0, -1j]])) # CX10.(I^Y), |01> state targets.append(np.array([[0, -1j, 0, 0], [1j, 0, 0, 0], [0, 0, 1j, 0], [0, 0, 0, -1j]])) # CX01.(I^Y), |11> state targets.append(np.array([[0, -1j, 0, 0], [0, 0, 1j, 0], [0, 0, 0, -1j], [1j, 0, 0, 0]])) # CX10.(Y^I), |11> state targets.append(np.array([[0, 0, -1j, 0], [0, 0, 0, -1j], [0, 1j, 0, 0], [1j, 0, 0, 0]])) return targets def unitary_random_gate_circuits_nondeterministic(final_measure=True): """Unitary gate test circuits with random unitary gate and nondeterministic count output.""" circuits = [] qr = QuantumRegister(2, 'qr') if final_measure: cr = ClassicalRegister(2, 'cr') regs = (qr, cr) else: regs = (qr, ) # random 1 circuit = QuantumCircuit(*regs) circuit.unitary(random_unitary(4, seed=1), [1, 0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # random 2 circuit = QuantumCircuit(*regs) circuit.unitary(random_unitary(4, seed=2), [1, 0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def unitary_random_gate_counts_nondeterministic(): """Unitary gate test circuits with nondeterministic counts.""" targets = [] # random unitary seed = 1 targets.append({'0x0': 930, '0x1': 330, '0x2': 680, '0x3': 60}) # random unitary seed = 2 targets.append({'0x0': 41, '0x1': 343, '0x2': 1056, '0x3': 560}) return targets qiskit-aer-0.4.1/test/terra/test_python_to_cpp.py000066400000000000000000000054041362723322000221620ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. import sys import unittest import numpy as np from qiskit.providers.aer.pulse.qutip_lite.qobj import Qobj from qiskit.providers.aer.pulse.cy.test_python_to_cpp import \ test_py_list_to_cpp_vec, test_py_list_of_lists_to_cpp_vector_of_vectors,\ test_py_dict_string_numeric_to_cpp_map_string_numeric,\ test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles,\ test_np_array_of_doubles, test_evaluate_hamiltonians, test_py_ordered_map class TestPythonToCpp(unittest.TestCase): """ Test Pyhton C API wrappers we have for dealing with Python data structures in C++ code. """ def setUp(self): """ WARNING: We do not support Python 3.5 because the digest algorithm relies on dictionary insertion order. This "feature" was introduced later on Python 3.6 and there's no official support for OrderedDict in the C API so Python 3.5 support has been disabled while looking for a propper fix. """ if sys.version_info.major == 3 and sys.version_info.minor == 5: self.skipTest("We don't support Python 3.5 for Pulse simulator") pass def test_py_list_to_cpp_vec(self): arg = [1., 2., 3.] self.assertTrue(test_py_list_to_cpp_vec(arg)) def test_py_list_of_lists_to_cpp_vector_of_vectors(self): arg = [[1., 2., 3.]] self.assertTrue(test_py_list_of_lists_to_cpp_vector_of_vectors(arg)) def test_py_dict_string_numeric_to_cpp_map_string_numeric(self): arg = {"key": 1} self.assertTrue(test_py_dict_string_numeric_to_cpp_map_string_numeric(arg)) def test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles(self): arg = {"key": [[1., 2., 3.]]} self.assertTrue(test_py_dict_string_list_of_list_of_doubles_to_cpp_map_string_vec_of_vecs_of_doubles(arg)) def test_np_array_of_doubles(self): arg = np.array([0., 1., 2., 3.]) self.assertTrue(test_np_array_of_doubles(arg)) def test_evaluate_hamiltonians(self): """ TODO: Evaluate different hamiltoninan expressions?""" self.assertEqual(True, True) def test_py_ordered_map(self): # Since Python 3.6 dict insertion order is guaranted arg = {"D0": 1, "U0": 2, "D1": 3, "U1": 4} self.assertTrue(test_py_ordered_map(arg)) qiskit-aer-0.4.1/test/terra/utils/000077500000000000000000000000001362723322000170215ustar00rootroot00000000000000qiskit-aer-0.4.1/test/terra/utils/mock.py000066400000000000000000000202471362723322000203310ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. # pylint: disable=missing-docstring """ Utilities for mocking the IBMQ provider, including job responses and backends. The module includes dummy provider, backends, and jobs. The purpose of these classes is to trick backends for testing purposes: testing local timeouts, arbitrary responses or behavior, etc. The mock devices are mainly for testing the compiler. """ import datetime import uuid import logging from concurrent import futures import time from qiskit.result import Result from qiskit.providers import BaseBackend, BaseJob from qiskit.providers.models import BackendProperties, BackendConfiguration from qiskit.providers.models.backendconfiguration import GateConfig from qiskit.qobj import (QasmQobj, QobjExperimentHeader, QobjHeader, QasmQobjInstruction, QasmQobjExperimentConfig, QasmQobjExperiment, QasmQobjConfig) from qiskit.providers.jobstatus import JobStatus from qiskit.providers.baseprovider import BaseProvider from qiskit.providers.exceptions import QiskitBackendNotFoundError from qiskit.providers.aer import AerError logger = logging.getLogger(__name__) class FakeProvider(BaseProvider): """Dummy provider just for testing purposes. Only filtering backends by name is implemented. """ def get_backend(self, name=None, **kwargs): backend = self._backends[0] if name: filtered_backends = [backend for backend in self._backends if backend.name() == name] if not filtered_backends: raise QiskitBackendNotFoundError() else: backend = filtered_backends[0] return backend def backends(self, name=None, **kwargs): return self._backends def __init__(self): # TODO Add the rest of simulators that we want to mock self._backends = [FakeSuccessQasmSimulator(), FakeFailureQasmSimulator()] super().__init__() class FakeBackend(BaseBackend): """This is a dummy backend just for testing purposes.""" def __init__(self, configuration, time_alive=10): """ Args: configuration (BackendConfiguration): backend configuration time_alive (int): time to wait before returning result """ super().__init__(configuration) self.time_alive = time_alive def properties(self): """Return backend properties""" dummy_date = datetime.datetime.now().isoformat() properties = { 'backend_name': self.name(), 'backend_version': self.configuration().backend_version, 'last_update_date': dummy_date, 'qubits': [[{'name': 'DUMMY', 'date': dummy_date, 'unit': 'ms', 'value': 0}]], 'gates': [{'qubits': [0], 'gate': 'DUMMY', 'parameters': [{'name': 'DUMMY', 'date': dummy_date, 'unit': 'ms', 'value': 0}]}], 'general': [] } return BackendProperties.from_dict(properties) def run(self, qobj): job_id = str(uuid.uuid4()) job = FakeJob(self, self.run_job, job_id, qobj) job.submit() return job # pylint: disable=unused-argument def run_job(self, job_id, qobj): """Main dummy run loop""" time.sleep(self.time_alive) return Result.from_dict({ 'job_id': job_id, 'backend_name': self.name(), 'backend_version': self.configuration().backend_version, 'qobj_id': qobj.qobj_id, 'results': [], 'status': 'COMPLETED', 'success': True }) class FakeSuccessQasmSimulator(FakeBackend): """A fake QASM simulator backend that always returns SUCCESS""" def __init__(self, time_alive=10): configuration = BackendConfiguration( backend_name='fake_success_qasm_simulator', backend_version='0.0.0', n_qubits=5, basis_gates=['u1', 'u2', 'u3', 'cx', 'cz', 'id', 'x', 'y', 'z', 'h', 's', 'sdg', 't', 'tdg', 'ccx', 'swap', 'snapshot', 'unitary'], simulator=True, local=True, conditional=True, open_pulse=False, memory=True, max_shots=65536, gates=[GateConfig(name='TODO', parameters=[], qasm_def='TODO')], coupling_map=None ) super().__init__(configuration, time_alive=time_alive) class FakeFailureQasmSimulator(FakeBackend): """A fake simulator backend.""" def __init__(self, time_alive=10): configuration = BackendConfiguration( backend_name='fake_failure_qasm_simulator', backend_version='0.0.0', n_qubits=5, basis_gates=['u1', 'u2', 'u3', 'cx', 'cz', 'id', 'x', 'y', 'z', 'h', 's', 'sdg', 't', 'tdg', 'ccx', 'swap', 'snapshot', 'unitary'], simulator=True, local=True, conditional=True, open_pulse=False, memory=True, max_shots=65536, gates=[GateConfig(name='TODO', parameters=[], qasm_def='TODO')], coupling_map=None ) super().__init__(configuration, time_alive=time_alive) # pylint: disable=unused-argument def run_job(self, job_id, qobj): """Main dummy run loop""" time.sleep(self.time_alive) raise AerError("Mocking a failure in the QASM Simulator") class FakeJob(BaseJob): """Fake simulator job""" _executor = futures.ThreadPoolExecutor() def __init__(self, backend, fn, job_id, qobj): super().__init__(backend, job_id) self._backend = backend self._job_id = job_id self._qobj = qobj self._future = None self._future_callback = fn def submit(self): self._future = self._executor.submit( self._future_callback, self._job_id, self._qobj ) def result(self, timeout=None): # pylint: disable=arguments-differ return self._future.result(timeout=timeout) def cancel(self): return self._future.cancel() def status(self): if self._running: _status = JobStatus.RUNNING elif not self._done: _status = JobStatus.QUEUED elif self._cancelled: _status = JobStatus.CANCELLED elif self._done: _status = JobStatus.DONE elif self._error: _status = JobStatus.ERROR else: raise Exception('Unexpected state of {0}'.format( self.__class__.__name__)) _status_msg = None return {'status': _status, 'status_msg': _status_msg} def job_id(self): return self._job_id def backend(self): return self._backend @property def _cancelled(self): return self._future.cancelled() @property def _done(self): return self._future.done() @property def _running(self): return self._future.running() @property def _error(self): return self._future.exception(timeout=0) def new_fake_qobj(): """Create fake `Qobj` and backend instances.""" backend = FakeQasmSimulator() return QasmQobj( qobj_id='test-id', config=QasmQobjConfig(shots=1024, memory_slots=1, max_credits=100), header=QobjHeader(backend_name=backend.name()), experiments=[QasmQobjExperiment( instructions=[ QasmQobjInstruction(name='barrier', qubits=[1]) ], header=QobjExperimentHeader(), config=QasmQobjExperimentConfig(seed_simulator=123456) )] ) qiskit-aer-0.4.1/test/terra/utils/multiplexer.py000066400000000000000000000006741362723322000217540ustar00rootroot00000000000000import numpy as np from qiskit.circuit import Gate def multiplexer_multi_controlled_x(num_control): # Multi-controlled X gate multiplexer identity = np.array(np.array([[1, 0], [0, 1]], dtype=complex)) x_gate = np.array(np.array([[0, 1], [1, 0]], dtype=complex)) num_qubits = num_control + 1 multiplexer = Gate('multiplexer', num_qubits, (2 ** num_control-1) * [identity] + [x_gate]) return multiplexerqiskit-aer-0.4.1/test/terra/utils/utils.py000066400000000000000000000020351362723322000205330ustar00rootroot00000000000000# This code is part of Qiskit. # # (C) Copyright IBM 2018, 2019. # # This code is licensed under the Apache License, Version 2.0. You may # obtain a copy of this license in the LICENSE.txt file in the root directory # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. # # Any modifications or derivative works of this code must retain this # copyright notice, and modified files need to carry a notice indicating # that they have been altered from the originals. """ Utils """ from math import log2 def list2dict(counts_list, hex_counts=True): """Convert a list of counts to a dict""" if hex_counts: return {hex(i): val for i, val in enumerate(counts_list) if val > 0} # For bit-string counts we need to know number of qubits to # pad bitstring n_qubits = int(log2(counts_list)) counts_dict = {} for i, val in enumerate(counts_list): if val > 0: key = bin(i)[2:] key = (n_qubits - len(key)) * '0' + key counts_dict[key] = val return counts_dict qiskit-aer-0.4.1/test/third-party/000077500000000000000000000000001362723322000170135ustar00rootroot00000000000000qiskit-aer-0.4.1/test/third-party/LICENSE_1_0.txt000066400000000000000000000024721362723322000213020ustar00rootroot00000000000000Boost Software License - Version 1.0 - August 17th, 2003 Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. qiskit-aer-0.4.1/test/third-party/catch.hpp000066400000000000000000015656561362723322000206360ustar00rootroot00000000000000/* * Catch v2.3.0 * Generated: 2018-07-23 10:09:14.936841 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved. * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED #define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED // start catch.hpp #define CATCH_VERSION_MAJOR 2 #define CATCH_VERSION_MINOR 3 #define CATCH_VERSION_PATCH 0 #ifdef __clang__ # pragma clang system_header #elif defined __GNUC__ # pragma GCC system_header #endif // start catch_suppress_warnings.h #ifdef __clang__ # ifdef __ICC // icpc defines the __clang__ macro # pragma warning(push) # pragma warning(disable: 161 1682) # else // __ICC # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wpadded" # pragma clang diagnostic ignored "-Wswitch-enum" # pragma clang diagnostic ignored "-Wcovered-switch-default" # endif #elif defined __GNUC__ // GCC likes to warn on REQUIREs, and we cannot suppress them // locally because g++'s support for _Pragma is lacking in older, // still supported, versions # pragma GCC diagnostic ignored "-Wparentheses" # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wunused-variable" # pragma GCC diagnostic ignored "-Wpadded" #endif // end catch_suppress_warnings.h #if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) # define CATCH_IMPL # define CATCH_CONFIG_ALL_PARTS #endif // In the impl file, we want to have access to all parts of the headers // Can also be used to sanely support PCHs #if defined(CATCH_CONFIG_ALL_PARTS) # define CATCH_CONFIG_EXTERNAL_INTERFACES # if defined(CATCH_CONFIG_DISABLE_MATCHERS) # undef CATCH_CONFIG_DISABLE_MATCHERS # endif # if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) # define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER # endif #endif #if !defined(CATCH_CONFIG_IMPL_ONLY) // start catch_platform.h #ifdef __APPLE__ # include # if TARGET_OS_OSX == 1 # define CATCH_PLATFORM_MAC # elif TARGET_OS_IPHONE == 1 # define CATCH_PLATFORM_IPHONE # endif #elif defined(linux) || defined(__linux) || defined(__linux__) # define CATCH_PLATFORM_LINUX #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) # define CATCH_PLATFORM_WINDOWS #endif // end catch_platform.h #ifdef CATCH_IMPL # ifndef CLARA_CONFIG_MAIN # define CLARA_CONFIG_MAIN_NOT_DEFINED # define CLARA_CONFIG_MAIN # endif #endif // start catch_user_interfaces.h namespace Catch { unsigned int rngSeed(); } // end catch_user_interfaces.h // start catch_tag_alias_autoregistrar.h // start catch_common.h // start catch_compiler_capabilities.h // Detect a number of compiler features - by compiler // The following features are defined: // // CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? // CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? // CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? // **************** // Note to maintainers: if new toggles are added please document them // in configuration.md, too // **************** // In general each macro has a _NO_ form // (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. // Many features, at point of detection, define an _INTERNAL_ macro, so they // can be combined, en-mass, with the _NO_ forms later. #ifdef __cplusplus # if __cplusplus >= 201402L # define CATCH_CPP14_OR_GREATER # endif # if __cplusplus >= 201703L # define CATCH_CPP17_OR_GREATER # endif #endif #if defined(CATCH_CPP17_OR_GREATER) # define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS #endif #ifdef __clang__ # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ _Pragma( "clang diagnostic push" ) \ _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") # define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ _Pragma( "clang diagnostic pop" ) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ _Pragma( "clang diagnostic push" ) \ _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ _Pragma( "clang diagnostic pop" ) # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ _Pragma( "clang diagnostic push" ) \ _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) # define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ _Pragma( "clang diagnostic pop" ) #endif // __clang__ //////////////////////////////////////////////////////////////////////////////// // Assume that non-Windows platforms support posix signals by default #if !defined(CATCH_PLATFORM_WINDOWS) #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS #endif //////////////////////////////////////////////////////////////////////////////// // We know some environments not to support full POSIX signals #if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS #endif #ifdef __OS400__ # define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS # define CATCH_CONFIG_COLOUR_NONE #endif //////////////////////////////////////////////////////////////////////////////// // Android somehow still does not support std::to_string #if defined(__ANDROID__) # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING #endif //////////////////////////////////////////////////////////////////////////////// // Not all Windows environments support SEH properly #if defined(__MINGW32__) # define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH #endif //////////////////////////////////////////////////////////////////////////////// // PS4 #if defined(__ORBIS__) # define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE #endif //////////////////////////////////////////////////////////////////////////////// // Cygwin #ifdef __CYGWIN__ // Required for some versions of Cygwin to declare gettimeofday // see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin # define _BSD_SOURCE #endif // __CYGWIN__ //////////////////////////////////////////////////////////////////////////////// // Visual C++ #ifdef _MSC_VER # if _MSC_VER >= 1900 // Visual Studio 2015 or newer # define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS # endif // Universal Windows platform does not support SEH // Or console colours (or console at all...) # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) # define CATCH_CONFIG_COLOUR_NONE # else # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH # endif #endif // _MSC_VER //////////////////////////////////////////////////////////////////////////////// // DJGPP #ifdef __DJGPP__ # define CATCH_INTERNAL_CONFIG_NO_WCHAR #endif // __DJGPP__ //////////////////////////////////////////////////////////////////////////////// // Use of __COUNTER__ is suppressed during code analysis in // CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly // handled by it. // Otherwise all supported compilers support COUNTER macro, // but user still might want to turn it off #if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) #define CATCH_INTERNAL_CONFIG_COUNTER #endif #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) # define CATCH_CONFIG_COUNTER #endif #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) # define CATCH_CONFIG_WINDOWS_SEH #endif // This is set by default, because we assume that unix compilers are posix-signal-compatible by default. #if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) # define CATCH_CONFIG_POSIX_SIGNALS #endif // This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. #if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) # define CATCH_CONFIG_WCHAR #endif #if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) # define CATCH_CONFIG_CPP11_TO_STRING #endif #if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) # define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS #endif #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) # define CATCH_INTERNAL_CONFIG_NEW_CAPTURE #endif #if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) # define CATCH_CONFIG_NEW_CAPTURE #endif #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS # define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS #endif #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS # define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS #endif // end catch_compiler_capabilities.h #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) #ifdef CATCH_CONFIG_COUNTER # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) #else # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) #endif #include #include #include namespace Catch { struct CaseSensitive { enum Choice { Yes, No }; }; class NonCopyable { NonCopyable( NonCopyable const& ) = delete; NonCopyable( NonCopyable && ) = delete; NonCopyable& operator = ( NonCopyable const& ) = delete; NonCopyable& operator = ( NonCopyable && ) = delete; protected: NonCopyable(); virtual ~NonCopyable(); }; struct SourceLineInfo { SourceLineInfo() = delete; SourceLineInfo( char const* _file, std::size_t _line ) noexcept : file( _file ), line( _line ) {} SourceLineInfo( SourceLineInfo const& other ) = default; SourceLineInfo( SourceLineInfo && ) = default; SourceLineInfo& operator = ( SourceLineInfo const& ) = default; SourceLineInfo& operator = ( SourceLineInfo && ) = default; bool empty() const noexcept; bool operator == ( SourceLineInfo const& other ) const noexcept; bool operator < ( SourceLineInfo const& other ) const noexcept; char const* file; std::size_t line; }; std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); // Use this in variadic streaming macros to allow // >> +StreamEndStop // as well as // >> stuff +StreamEndStop struct StreamEndStop { std::string operator+() const; }; template T const& operator + ( T const& value, StreamEndStop ) { return value; } } #define CATCH_INTERNAL_LINEINFO \ ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) // end catch_common.h namespace Catch { struct RegistrarForTagAliases { RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); }; } // end namespace Catch #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS // end catch_tag_alias_autoregistrar.h // start catch_test_registry.h // start catch_interfaces_testcase.h #include #include namespace Catch { class TestSpec; struct ITestInvoker { virtual void invoke () const = 0; virtual ~ITestInvoker(); }; using ITestCasePtr = std::shared_ptr; class TestCase; struct IConfig; struct ITestCaseRegistry { virtual ~ITestCaseRegistry(); virtual std::vector const& getAllTests() const = 0; virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; }; bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); std::vector const& getAllTestCasesSorted( IConfig const& config ); } // end catch_interfaces_testcase.h // start catch_stringref.h #include #include #include namespace Catch { class StringData; /// A non-owning string class (similar to the forthcoming std::string_view) /// Note that, because a StringRef may be a substring of another string, /// it may not be null terminated. c_str() must return a null terminated /// string, however, and so the StringRef will internally take ownership /// (taking a copy), if necessary. In theory this ownership is not externally /// visible - but it does mean (substring) StringRefs should not be shared between /// threads. class StringRef { public: using size_type = std::size_t; private: friend struct StringRefTestAccess; char const* m_start; size_type m_size; char* m_data = nullptr; void takeOwnership(); static constexpr char const* const s_empty = ""; public: // construction/ assignment StringRef() noexcept : StringRef( s_empty, 0 ) {} StringRef( StringRef const& other ) noexcept : m_start( other.m_start ), m_size( other.m_size ) {} StringRef( StringRef&& other ) noexcept : m_start( other.m_start ), m_size( other.m_size ), m_data( other.m_data ) { other.m_data = nullptr; } StringRef( char const* rawChars ) noexcept; StringRef( char const* rawChars, size_type size ) noexcept : m_start( rawChars ), m_size( size ) {} StringRef( std::string const& stdString ) noexcept : m_start( stdString.c_str() ), m_size( stdString.size() ) {} ~StringRef() noexcept { delete[] m_data; } auto operator = ( StringRef const &other ) noexcept -> StringRef& { delete[] m_data; m_data = nullptr; m_start = other.m_start; m_size = other.m_size; return *this; } operator std::string() const; void swap( StringRef& other ) noexcept; public: // operators auto operator == ( StringRef const& other ) const noexcept -> bool; auto operator != ( StringRef const& other ) const noexcept -> bool; auto operator[] ( size_type index ) const noexcept -> char; public: // named queries auto empty() const noexcept -> bool { return m_size == 0; } auto size() const noexcept -> size_type { return m_size; } auto numberOfCharacters() const noexcept -> size_type; auto c_str() const -> char const*; public: // substrings and searches auto substr( size_type start, size_type size ) const noexcept -> StringRef; // Returns the current start pointer. // Note that the pointer can change when if the StringRef is a substring auto currentData() const noexcept -> char const*; private: // ownership queries - may not be consistent between calls auto isOwned() const noexcept -> bool; auto isSubstring() const noexcept -> bool; }; auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string; auto operator + ( StringRef const& lhs, char const* rhs ) -> std::string; auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string; auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; inline auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { return StringRef( rawChars, size ); } } // namespace Catch // end catch_stringref.h namespace Catch { template class TestInvokerAsMethod : public ITestInvoker { void (C::*m_testAsMethod)(); public: TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {} void invoke() const override { C obj; (obj.*m_testAsMethod)(); } }; auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker*; template auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInvoker* { return new(std::nothrow) TestInvokerAsMethod( testAsMethod ); } struct NameAndTags { NameAndTags( StringRef const& name_ = StringRef(), StringRef const& tags_ = StringRef() ) noexcept; StringRef name; StringRef tags; }; struct AutoReg : NonCopyable { AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept; ~AutoReg(); }; } // end namespace Catch #define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) #define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ #define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ #define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF #if defined(CATCH_CONFIG_DISABLE) #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ static void TestName() #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ namespace{ \ struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \ void test(); \ }; \ } \ void TestName::test() #endif /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ static void TestName(); \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ static void TestName() #define INTERNAL_CATCH_TESTCASE( ... ) \ INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ \ struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \ void test(); \ }; \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ } \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ void TestName::test() #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS // end catch_test_registry.h // start catch_capture.hpp // start catch_assertionhandler.h // start catch_assertioninfo.h // start catch_result_type.h namespace Catch { // ResultWas::OfType enum struct ResultWas { enum OfType { Unknown = -1, Ok = 0, Info = 1, Warning = 2, FailureBit = 0x10, ExpressionFailed = FailureBit | 1, ExplicitFailure = FailureBit | 2, Exception = 0x100 | FailureBit, ThrewException = Exception | 1, DidntThrowException = Exception | 2, FatalErrorCondition = 0x200 | FailureBit }; }; bool isOk( ResultWas::OfType resultType ); bool isJustInfo( int flags ); // ResultDisposition::Flags enum struct ResultDisposition { enum Flags { Normal = 0x01, ContinueOnFailure = 0x02, // Failures fail test, but execution continues FalseTest = 0x04, // Prefix expression with ! SuppressFail = 0x08 // Failures are reported but do not fail the test }; }; ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ); bool shouldContinueOnFailure( int flags ); inline bool isFalseTest( int flags ) { return ( flags & ResultDisposition::FalseTest ) != 0; } bool shouldSuppressFailure( int flags ); } // end namespace Catch // end catch_result_type.h namespace Catch { struct AssertionInfo { StringRef macroName; SourceLineInfo lineInfo; StringRef capturedExpression; ResultDisposition::Flags resultDisposition; // We want to delete this constructor but a compiler bug in 4.8 means // the struct is then treated as non-aggregate //AssertionInfo() = delete; }; } // end namespace Catch // end catch_assertioninfo.h // start catch_decomposer.h // start catch_tostring.h #include #include #include #include // start catch_stream.h #include #include #include namespace Catch { std::ostream& cout(); std::ostream& cerr(); std::ostream& clog(); class StringRef; struct IStream { virtual ~IStream(); virtual std::ostream& stream() const = 0; }; auto makeStream( StringRef const &filename ) -> IStream const*; class ReusableStringStream { std::size_t m_index; std::ostream* m_oss; public: ReusableStringStream(); ~ReusableStringStream(); auto str() const -> std::string; template auto operator << ( T const& value ) -> ReusableStringStream& { *m_oss << value; return *this; } auto get() -> std::ostream& { return *m_oss; } static void cleanup(); }; } // end catch_stream.h #ifdef __OBJC__ // start catch_objc_arc.hpp #import #ifdef __has_feature #define CATCH_ARC_ENABLED __has_feature(objc_arc) #else #define CATCH_ARC_ENABLED 0 #endif void arcSafeRelease( NSObject* obj ); id performOptionalSelector( id obj, SEL sel ); #if !CATCH_ARC_ENABLED inline void arcSafeRelease( NSObject* obj ) { [obj release]; } inline id performOptionalSelector( id obj, SEL sel ) { if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; return nil; } #define CATCH_UNSAFE_UNRETAINED #define CATCH_ARC_STRONG #else inline void arcSafeRelease( NSObject* ){} inline id performOptionalSelector( id obj, SEL sel ) { #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" #endif if( [obj respondsToSelector: sel] ) return [obj performSelector: sel]; #ifdef __clang__ #pragma clang diagnostic pop #endif return nil; } #define CATCH_UNSAFE_UNRETAINED __unsafe_unretained #define CATCH_ARC_STRONG __strong #endif // end catch_objc_arc.hpp #endif #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless #endif // We need a dummy global operator<< so we can bring it into Catch namespace later struct Catch_global_namespace_dummy {}; std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); namespace Catch { // Bring in operator<< from global namespace into Catch namespace using ::operator<<; namespace Detail { extern const std::string unprintableString; std::string rawMemoryToString( const void *object, std::size_t size ); template std::string rawMemoryToString( const T& object ) { return rawMemoryToString( &object, sizeof(object) ); } template class IsStreamInsertable { template static auto test(int) -> decltype(std::declval() << std::declval(), std::true_type()); template static auto test(...)->std::false_type; public: static const bool value = decltype(test(0))::value; }; template std::string convertUnknownEnumToString( E e ); template typename std::enable_if< !std::is_enum::value && !std::is_base_of::value, std::string>::type convertUnstreamable( T const& ) { return Detail::unprintableString; } template typename std::enable_if< !std::is_enum::value && std::is_base_of::value, std::string>::type convertUnstreamable(T const& ex) { return ex.what(); } template typename std::enable_if< std::is_enum::value , std::string>::type convertUnstreamable( T const& value ) { return convertUnknownEnumToString( value ); } #if defined(_MANAGED) //! Convert a CLR string to a utf8 std::string template std::string clrReferenceToString( T^ ref ) { if (ref == nullptr) return std::string("null"); auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString()); cli::pin_ptr p = &bytes[0]; return std::string(reinterpret_cast(p), bytes->Length); } #endif } // namespace Detail // If we decide for C++14, change these to enable_if_ts template struct StringMaker { template static typename std::enable_if<::Catch::Detail::IsStreamInsertable::value, std::string>::type convert(const Fake& value) { ReusableStringStream rss; // NB: call using the function-like syntax to avoid ambiguity with // user-defined templated operator<< under clang. rss.operator<<(value); return rss.str(); } template static typename std::enable_if::value, std::string>::type convert( const Fake& value ) { #if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER) return Detail::convertUnstreamable(value); #else return CATCH_CONFIG_FALLBACK_STRINGIFIER(value); #endif } }; namespace Detail { // This function dispatches all stringification requests inside of Catch. // Should be preferably called fully qualified, like ::Catch::Detail::stringify template std::string stringify(const T& e) { return ::Catch::StringMaker::type>::type>::convert(e); } template std::string convertUnknownEnumToString( E e ) { return ::Catch::Detail::stringify(static_cast::type>(e)); } #if defined(_MANAGED) template std::string stringify( T^ e ) { return ::Catch::StringMaker::convert(e); } #endif } // namespace Detail // Some predefined specializations template<> struct StringMaker { static std::string convert(const std::string& str); }; #ifdef CATCH_CONFIG_WCHAR template<> struct StringMaker { static std::string convert(const std::wstring& wstr); }; #endif template<> struct StringMaker { static std::string convert(char const * str); }; template<> struct StringMaker { static std::string convert(char * str); }; #ifdef CATCH_CONFIG_WCHAR template<> struct StringMaker { static std::string convert(wchar_t const * str); }; template<> struct StringMaker { static std::string convert(wchar_t * str); }; #endif // TBD: Should we use `strnlen` to ensure that we don't go out of the buffer, // while keeping string semantics? template struct StringMaker { static std::string convert(char const* str) { return ::Catch::Detail::stringify(std::string{ str }); } }; template struct StringMaker { static std::string convert(signed char const* str) { return ::Catch::Detail::stringify(std::string{ reinterpret_cast(str) }); } }; template struct StringMaker { static std::string convert(unsigned char const* str) { return ::Catch::Detail::stringify(std::string{ reinterpret_cast(str) }); } }; template<> struct StringMaker { static std::string convert(int value); }; template<> struct StringMaker { static std::string convert(long value); }; template<> struct StringMaker { static std::string convert(long long value); }; template<> struct StringMaker { static std::string convert(unsigned int value); }; template<> struct StringMaker { static std::string convert(unsigned long value); }; template<> struct StringMaker { static std::string convert(unsigned long long value); }; template<> struct StringMaker { static std::string convert(bool b); }; template<> struct StringMaker { static std::string convert(char c); }; template<> struct StringMaker { static std::string convert(signed char c); }; template<> struct StringMaker { static std::string convert(unsigned char c); }; template<> struct StringMaker { static std::string convert(std::nullptr_t); }; template<> struct StringMaker { static std::string convert(float value); }; template<> struct StringMaker { static std::string convert(double value); }; template struct StringMaker { template static std::string convert(U* p) { if (p) { return ::Catch::Detail::rawMemoryToString(p); } else { return "nullptr"; } } }; template struct StringMaker { static std::string convert(R C::* p) { if (p) { return ::Catch::Detail::rawMemoryToString(p); } else { return "nullptr"; } } }; #if defined(_MANAGED) template struct StringMaker { static std::string convert( T^ ref ) { return ::Catch::Detail::clrReferenceToString(ref); } }; #endif namespace Detail { template std::string rangeToString(InputIterator first, InputIterator last) { ReusableStringStream rss; rss << "{ "; if (first != last) { rss << ::Catch::Detail::stringify(*first); for (++first; first != last; ++first) rss << ", " << ::Catch::Detail::stringify(*first); } rss << " }"; return rss.str(); } } #ifdef __OBJC__ template<> struct StringMaker { static std::string convert(NSString * nsstring) { if (!nsstring) return "nil"; return std::string("@") + [nsstring UTF8String]; } }; template<> struct StringMaker { static std::string convert(NSObject* nsObject) { return ::Catch::Detail::stringify([nsObject description]); } }; namespace Detail { inline std::string stringify( NSString* nsstring ) { return StringMaker::convert( nsstring ); } } // namespace Detail #endif // __OBJC__ } // namespace Catch ////////////////////////////////////////////////////// // Separate std-lib types stringification, so it can be selectively enabled // This means that we do not bring in #if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS) # define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER # define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER # define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER #endif // Separate std::pair specialization #if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER) #include namespace Catch { template struct StringMaker > { static std::string convert(const std::pair& pair) { ReusableStringStream rss; rss << "{ " << ::Catch::Detail::stringify(pair.first) << ", " << ::Catch::Detail::stringify(pair.second) << " }"; return rss.str(); } }; } #endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER // Separate std::tuple specialization #if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER) #include namespace Catch { namespace Detail { template< typename Tuple, std::size_t N = 0, bool = (N < std::tuple_size::value) > struct TupleElementPrinter { static void print(const Tuple& tuple, std::ostream& os) { os << (N ? ", " : " ") << ::Catch::Detail::stringify(std::get(tuple)); TupleElementPrinter::print(tuple, os); } }; template< typename Tuple, std::size_t N > struct TupleElementPrinter { static void print(const Tuple&, std::ostream&) {} }; } template struct StringMaker> { static std::string convert(const std::tuple& tuple) { ReusableStringStream rss; rss << '{'; Detail::TupleElementPrinter>::print(tuple, rss.get()); rss << " }"; return rss.str(); } }; } #endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER namespace Catch { struct not_this_one {}; // Tag type for detecting which begin/ end are being selected // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace using std::begin; using std::end; not_this_one begin( ... ); not_this_one end( ... ); template struct is_range { static const bool value = !std::is_same())), not_this_one>::value && !std::is_same())), not_this_one>::value; }; #if defined(_MANAGED) // Managed types are never ranges template struct is_range { static const bool value = false; }; #endif template std::string rangeToString( Range const& range ) { return ::Catch::Detail::rangeToString( begin( range ), end( range ) ); } // Handle vector specially template std::string rangeToString( std::vector const& v ) { ReusableStringStream rss; rss << "{ "; bool first = true; for( bool b : v ) { if( first ) first = false; else rss << ", "; rss << ::Catch::Detail::stringify( b ); } rss << " }"; return rss.str(); } template struct StringMaker::value && !::Catch::Detail::IsStreamInsertable::value>::type> { static std::string convert( R const& range ) { return rangeToString( range ); } }; template struct StringMaker { static std::string convert(T const(&arr)[SZ]) { return rangeToString(arr); } }; } // namespace Catch // Separate std::chrono::duration specialization #if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) #include #include #include namespace Catch { template struct ratio_string { static std::string symbol(); }; template std::string ratio_string::symbol() { Catch::ReusableStringStream rss; rss << '[' << Ratio::num << '/' << Ratio::den << ']'; return rss.str(); } template <> struct ratio_string { static std::string symbol(); }; template <> struct ratio_string { static std::string symbol(); }; template <> struct ratio_string { static std::string symbol(); }; template <> struct ratio_string { static std::string symbol(); }; template <> struct ratio_string { static std::string symbol(); }; template <> struct ratio_string { static std::string symbol(); }; //////////// // std::chrono::duration specializations template struct StringMaker> { static std::string convert(std::chrono::duration const& duration) { ReusableStringStream rss; rss << duration.count() << ' ' << ratio_string::symbol() << 's'; return rss.str(); } }; template struct StringMaker>> { static std::string convert(std::chrono::duration> const& duration) { ReusableStringStream rss; rss << duration.count() << " s"; return rss.str(); } }; template struct StringMaker>> { static std::string convert(std::chrono::duration> const& duration) { ReusableStringStream rss; rss << duration.count() << " m"; return rss.str(); } }; template struct StringMaker>> { static std::string convert(std::chrono::duration> const& duration) { ReusableStringStream rss; rss << duration.count() << " h"; return rss.str(); } }; //////////// // std::chrono::time_point specialization // Generic time_point cannot be specialized, only std::chrono::time_point template struct StringMaker> { static std::string convert(std::chrono::time_point const& time_point) { return ::Catch::Detail::stringify(time_point.time_since_epoch()) + " since epoch"; } }; // std::chrono::time_point specialization template struct StringMaker> { static std::string convert(std::chrono::time_point const& time_point) { auto converted = std::chrono::system_clock::to_time_t(time_point); #ifdef _MSC_VER std::tm timeInfo = {}; gmtime_s(&timeInfo, &converted); #else std::tm* timeInfo = std::gmtime(&converted); #endif auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); char timeStamp[timeStampSize]; const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; #ifdef _MSC_VER std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); #else std::strftime(timeStamp, timeStampSize, fmt, timeInfo); #endif return std::string(timeStamp); } }; } #endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER #ifdef _MSC_VER #pragma warning(pop) #endif // end catch_tostring.h #include #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4389) // '==' : signed/unsigned mismatch #pragma warning(disable:4018) // more "signed/unsigned mismatch" #pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) #pragma warning(disable:4180) // qualifier applied to function type has no meaning #endif namespace Catch { struct ITransientExpression { auto isBinaryExpression() const -> bool { return m_isBinaryExpression; } auto getResult() const -> bool { return m_result; } virtual void streamReconstructedExpression( std::ostream &os ) const = 0; ITransientExpression( bool isBinaryExpression, bool result ) : m_isBinaryExpression( isBinaryExpression ), m_result( result ) {} // We don't actually need a virtual destructor, but many static analysers // complain if it's not here :-( virtual ~ITransientExpression(); bool m_isBinaryExpression; bool m_result; }; void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ); template class BinaryExpr : public ITransientExpression { LhsT m_lhs; StringRef m_op; RhsT m_rhs; void streamReconstructedExpression( std::ostream &os ) const override { formatReconstructedExpression ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) ); } public: BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs ) : ITransientExpression{ true, comparisonResult }, m_lhs( lhs ), m_op( op ), m_rhs( rhs ) {} }; template class UnaryExpr : public ITransientExpression { LhsT m_lhs; void streamReconstructedExpression( std::ostream &os ) const override { os << Catch::Detail::stringify( m_lhs ); } public: explicit UnaryExpr( LhsT lhs ) : ITransientExpression{ false, lhs ? true : false }, m_lhs( lhs ) {} }; // Specialised comparison functions to handle equality comparisons between ints and pointers (NULL deduces as an int) template auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return static_cast(lhs == rhs); } template auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == reinterpret_cast( rhs ); } template auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == reinterpret_cast( rhs ); } template auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast( lhs ) == rhs; } template auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast( lhs ) == rhs; } template auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return static_cast(lhs != rhs); } template auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs != reinterpret_cast( rhs ); } template auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs != reinterpret_cast( rhs ); } template auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinterpret_cast( lhs ) != rhs; } template auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reinterpret_cast( lhs ) != rhs; } template class ExprLhs { LhsT m_lhs; public: explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {} template auto operator == ( RhsT const& rhs ) -> BinaryExpr const { return { compareEqual( m_lhs, rhs ), m_lhs, "==", rhs }; } auto operator == ( bool rhs ) -> BinaryExpr const { return { m_lhs == rhs, m_lhs, "==", rhs }; } template auto operator != ( RhsT const& rhs ) -> BinaryExpr const { return { compareNotEqual( m_lhs, rhs ), m_lhs, "!=", rhs }; } auto operator != ( bool rhs ) -> BinaryExpr const { return { m_lhs != rhs, m_lhs, "!=", rhs }; } template auto operator > ( RhsT const& rhs ) -> BinaryExpr const { return { static_cast(m_lhs > rhs), m_lhs, ">", rhs }; } template auto operator < ( RhsT const& rhs ) -> BinaryExpr const { return { static_cast(m_lhs < rhs), m_lhs, "<", rhs }; } template auto operator >= ( RhsT const& rhs ) -> BinaryExpr const { return { static_cast(m_lhs >= rhs), m_lhs, ">=", rhs }; } template auto operator <= ( RhsT const& rhs ) -> BinaryExpr const { return { static_cast(m_lhs <= rhs), m_lhs, "<=", rhs }; } auto makeUnaryExpr() const -> UnaryExpr { return UnaryExpr{ m_lhs }; } }; void handleExpression( ITransientExpression const& expr ); template void handleExpression( ExprLhs const& expr ) { handleExpression( expr.makeUnaryExpr() ); } struct Decomposer { template auto operator <= ( T const& lhs ) -> ExprLhs { return ExprLhs{ lhs }; } auto operator <=( bool value ) -> ExprLhs { return ExprLhs{ value }; } }; } // end namespace Catch #ifdef _MSC_VER #pragma warning(pop) #endif // end catch_decomposer.h // start catch_interfaces_capture.h #include namespace Catch { class AssertionResult; struct AssertionInfo; struct SectionInfo; struct SectionEndInfo; struct MessageInfo; struct Counts; struct BenchmarkInfo; struct BenchmarkStats; struct AssertionReaction; struct ITransientExpression; struct IResultCapture { virtual ~IResultCapture(); virtual bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) = 0; virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0; virtual void benchmarkEnded( BenchmarkStats const& stats ) = 0; virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual void handleFatalErrorCondition( StringRef message ) = 0; virtual void handleExpr ( AssertionInfo const& info, ITransientExpression const& expr, AssertionReaction& reaction ) = 0; virtual void handleMessage ( AssertionInfo const& info, ResultWas::OfType resultType, StringRef const& message, AssertionReaction& reaction ) = 0; virtual void handleUnexpectedExceptionNotThrown ( AssertionInfo const& info, AssertionReaction& reaction ) = 0; virtual void handleUnexpectedInflightException ( AssertionInfo const& info, std::string const& message, AssertionReaction& reaction ) = 0; virtual void handleIncomplete ( AssertionInfo const& info ) = 0; virtual void handleNonExpr ( AssertionInfo const &info, ResultWas::OfType resultType, AssertionReaction &reaction ) = 0; virtual bool lastAssertionPassed() = 0; virtual void assertionPassed() = 0; // Deprecated, do not use: virtual std::string getCurrentTestName() const = 0; virtual const AssertionResult* getLastResult() const = 0; virtual void exceptionEarlyReported() = 0; }; IResultCapture& getResultCapture(); } // end catch_interfaces_capture.h namespace Catch { struct TestFailureException{}; struct AssertionResultData; struct IResultCapture; class RunContext; class LazyExpression { friend class AssertionHandler; friend struct AssertionStats; friend class RunContext; ITransientExpression const* m_transientExpression = nullptr; bool m_isNegated; public: LazyExpression( bool isNegated ); LazyExpression( LazyExpression const& other ); LazyExpression& operator = ( LazyExpression const& ) = delete; explicit operator bool() const; friend auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream&; }; struct AssertionReaction { bool shouldDebugBreak = false; bool shouldThrow = false; }; class AssertionHandler { AssertionInfo m_assertionInfo; AssertionReaction m_reaction; bool m_completed = false; IResultCapture& m_resultCapture; public: AssertionHandler ( StringRef macroName, SourceLineInfo const& lineInfo, StringRef capturedExpression, ResultDisposition::Flags resultDisposition ); ~AssertionHandler() { if ( !m_completed ) { m_resultCapture.handleIncomplete( m_assertionInfo ); } } template void handleExpr( ExprLhs const& expr ) { handleExpr( expr.makeUnaryExpr() ); } void handleExpr( ITransientExpression const& expr ); void handleMessage(ResultWas::OfType resultType, StringRef const& message); void handleExceptionThrownAsExpected(); void handleUnexpectedExceptionNotThrown(); void handleExceptionNotThrownAsExpected(); void handleThrowingCallSkipped(); void handleUnexpectedInflightException(); void complete(); void setCompleted(); // query auto allowThrows() const -> bool; }; void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString ); } // namespace Catch // end catch_assertionhandler.h // start catch_message.h #include namespace Catch { struct MessageInfo { MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ); std::string macroName; std::string message; SourceLineInfo lineInfo; ResultWas::OfType type; unsigned int sequence; bool operator == ( MessageInfo const& other ) const; bool operator < ( MessageInfo const& other ) const; private: static unsigned int globalCount; }; struct MessageStream { template MessageStream& operator << ( T const& value ) { m_stream << value; return *this; } ReusableStringStream m_stream; }; struct MessageBuilder : MessageStream { MessageBuilder( std::string const& macroName, SourceLineInfo const& lineInfo, ResultWas::OfType type ); template MessageBuilder& operator << ( T const& value ) { m_stream << value; return *this; } MessageInfo m_info; }; class ScopedMessage { public: explicit ScopedMessage( MessageBuilder const& builder ); ~ScopedMessage(); MessageInfo m_info; }; } // end namespace Catch // end catch_message.h #if !defined(CATCH_CONFIG_DISABLE) #if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION) #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__ #else #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" #endif #if defined(CATCH_CONFIG_FAST_COMPILE) /////////////////////////////////////////////////////////////////////////////// // Another way to speed-up compilation is to omit local try-catch for REQUIRE* // macros. #define INTERNAL_CATCH_TRY #define INTERNAL_CATCH_CATCH( capturer ) #else // CATCH_CONFIG_FAST_COMPILE #define INTERNAL_CATCH_TRY try #define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); } #endif #define INTERNAL_CATCH_REACT( handler ) handler.complete(); /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ INTERNAL_CATCH_TRY { \ CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \ CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( (void)0, false && static_cast( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&. /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \ INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ if( Catch::getResultCapture().lastAssertionPassed() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \ INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ if( !Catch::getResultCapture().lastAssertionPassed() ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ try { \ static_cast(__VA_ARGS__); \ catchAssertionHandler.handleExceptionNotThrownAsExpected(); \ } \ catch( ... ) { \ catchAssertionHandler.handleUnexpectedInflightException(); \ } \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \ if( catchAssertionHandler.allowThrows() ) \ try { \ static_cast(__VA_ARGS__); \ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ } \ catch( ... ) { \ catchAssertionHandler.handleExceptionThrownAsExpected(); \ } \ else \ catchAssertionHandler.handleThrowingCallSkipped(); \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \ if( catchAssertionHandler.allowThrows() ) \ try { \ static_cast(expr); \ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ } \ catch( exceptionType const& ) { \ catchAssertionHandler.handleExceptionThrownAsExpected(); \ } \ catch( ... ) { \ catchAssertionHandler.handleUnexpectedInflightException(); \ } \ else \ catchAssertionHandler.handleThrowingCallSkipped(); \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \ catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_INFO( macroName, log ) \ Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ); /////////////////////////////////////////////////////////////////////////////// // Although this is matcher-based, it can be used with just a string #define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ if( catchAssertionHandler.allowThrows() ) \ try { \ static_cast(__VA_ARGS__); \ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ } \ catch( ... ) { \ Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher ); \ } \ else \ catchAssertionHandler.handleThrowingCallSkipped(); \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) #endif // CATCH_CONFIG_DISABLE // end catch_capture.hpp // start catch_section.h // start catch_section_info.h // start catch_totals.h #include namespace Catch { struct Counts { Counts operator - ( Counts const& other ) const; Counts& operator += ( Counts const& other ); std::size_t total() const; bool allPassed() const; bool allOk() const; std::size_t passed = 0; std::size_t failed = 0; std::size_t failedButOk = 0; }; struct Totals { Totals operator - ( Totals const& other ) const; Totals& operator += ( Totals const& other ); Totals delta( Totals const& prevTotals ) const; int error = 0; Counts assertions; Counts testCases; }; } // end catch_totals.h #include namespace Catch { struct SectionInfo { SectionInfo ( SourceLineInfo const& _lineInfo, std::string const& _name ); // Deprecated SectionInfo ( SourceLineInfo const& _lineInfo, std::string const& _name, std::string const& ) : SectionInfo( _lineInfo, _name ) {} std::string name; std::string description; // !Deprecated: this will always be empty SourceLineInfo lineInfo; }; struct SectionEndInfo { SectionInfo sectionInfo; Counts prevAssertions; double durationInSeconds; }; } // end namespace Catch // end catch_section_info.h // start catch_timer.h #include namespace Catch { auto getCurrentNanosecondsSinceEpoch() -> uint64_t; auto getEstimatedClockResolution() -> uint64_t; class Timer { uint64_t m_nanoseconds = 0; public: void start(); auto getElapsedNanoseconds() const -> uint64_t; auto getElapsedMicroseconds() const -> uint64_t; auto getElapsedMilliseconds() const -> unsigned int; auto getElapsedSeconds() const -> double; }; } // namespace Catch // end catch_timer.h #include namespace Catch { class Section : NonCopyable { public: Section( SectionInfo const& info ); ~Section(); // This indicates whether the section should be executed or not explicit operator bool() const; private: SectionInfo m_info; std::string m_name; Counts m_assertions; bool m_sectionIncluded; Timer m_timer; }; } // end namespace Catch #define INTERNAL_CATCH_SECTION( ... ) \ CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS #define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \ CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS // end catch_section.h // start catch_benchmark.h #include #include namespace Catch { class BenchmarkLooper { std::string m_name; std::size_t m_count = 0; std::size_t m_iterationsToRun = 1; uint64_t m_resolution; Timer m_timer; static auto getResolution() -> uint64_t; public: // Keep most of this inline as it's on the code path that is being timed BenchmarkLooper( StringRef name ) : m_name( name ), m_resolution( getResolution() ) { reportStart(); m_timer.start(); } explicit operator bool() { if( m_count < m_iterationsToRun ) return true; return needsMoreIterations(); } void increment() { ++m_count; } void reportStart(); auto needsMoreIterations() -> bool; }; } // end namespace Catch #define BENCHMARK( name ) \ for( Catch::BenchmarkLooper looper( name ); looper; looper.increment() ) // end catch_benchmark.h // start catch_interfaces_exception.h // start catch_interfaces_registry_hub.h #include #include namespace Catch { class TestCase; struct ITestCaseRegistry; struct IExceptionTranslatorRegistry; struct IExceptionTranslator; struct IReporterRegistry; struct IReporterFactory; struct ITagAliasRegistry; class StartupExceptionRegistry; using IReporterFactoryPtr = std::shared_ptr; struct IRegistryHub { virtual ~IRegistryHub(); virtual IReporterRegistry const& getReporterRegistry() const = 0; virtual ITestCaseRegistry const& getTestCaseRegistry() const = 0; virtual ITagAliasRegistry const& getTagAliasRegistry() const = 0; virtual IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() = 0; virtual StartupExceptionRegistry const& getStartupExceptionRegistry() const = 0; }; struct IMutableRegistryHub { virtual ~IMutableRegistryHub(); virtual void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) = 0; virtual void registerListener( IReporterFactoryPtr const& factory ) = 0; virtual void registerTest( TestCase const& testInfo ) = 0; virtual void registerTranslator( const IExceptionTranslator* translator ) = 0; virtual void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) = 0; virtual void registerStartupException() noexcept = 0; }; IRegistryHub& getRegistryHub(); IMutableRegistryHub& getMutableRegistryHub(); void cleanUp(); std::string translateActiveException(); } // end catch_interfaces_registry_hub.h #if defined(CATCH_CONFIG_DISABLE) #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \ static std::string translatorName( signature ) #endif #include #include #include namespace Catch { using exceptionTranslateFunction = std::string(*)(); struct IExceptionTranslator; using ExceptionTranslators = std::vector>; struct IExceptionTranslator { virtual ~IExceptionTranslator(); virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const = 0; }; struct IExceptionTranslatorRegistry { virtual ~IExceptionTranslatorRegistry(); virtual std::string translateActiveException() const = 0; }; class ExceptionTranslatorRegistrar { template class ExceptionTranslator : public IExceptionTranslator { public: ExceptionTranslator( std::string(*translateFunction)( T& ) ) : m_translateFunction( translateFunction ) {} std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override { try { if( it == itEnd ) std::rethrow_exception(std::current_exception()); else return (*it)->translate( it+1, itEnd ); } catch( T& ex ) { return m_translateFunction( ex ); } } protected: std::string(*m_translateFunction)( T& ); }; public: template ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) { getMutableRegistryHub().registerTranslator ( new ExceptionTranslator( translateFunction ) ); } }; } /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ static std::string translatorName( signature ); \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ static std::string translatorName( signature ) #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // end catch_interfaces_exception.h // start catch_approx.h #include #include namespace Catch { namespace Detail { class Approx { private: bool equalityComparisonImpl(double other) const; public: explicit Approx ( double value ); static Approx custom(); Approx operator-() const; template ::value>::type> Approx operator()( T const& value ) { Approx approx( static_cast(value) ); approx.epsilon( m_epsilon ); approx.margin( m_margin ); approx.scale( m_scale ); return approx; } template ::value>::type> explicit Approx( T const& value ): Approx(static_cast(value)) {} template ::value>::type> friend bool operator == ( const T& lhs, Approx const& rhs ) { auto lhs_v = static_cast(lhs); return rhs.equalityComparisonImpl(lhs_v); } template ::value>::type> friend bool operator == ( Approx const& lhs, const T& rhs ) { return operator==( rhs, lhs ); } template ::value>::type> friend bool operator != ( T const& lhs, Approx const& rhs ) { return !operator==( lhs, rhs ); } template ::value>::type> friend bool operator != ( Approx const& lhs, T const& rhs ) { return !operator==( rhs, lhs ); } template ::value>::type> friend bool operator <= ( T const& lhs, Approx const& rhs ) { return static_cast(lhs) < rhs.m_value || lhs == rhs; } template ::value>::type> friend bool operator <= ( Approx const& lhs, T const& rhs ) { return lhs.m_value < static_cast(rhs) || lhs == rhs; } template ::value>::type> friend bool operator >= ( T const& lhs, Approx const& rhs ) { return static_cast(lhs) > rhs.m_value || lhs == rhs; } template ::value>::type> friend bool operator >= ( Approx const& lhs, T const& rhs ) { return lhs.m_value > static_cast(rhs) || lhs == rhs; } template ::value>::type> Approx& epsilon( T const& newEpsilon ) { double epsilonAsDouble = static_cast(newEpsilon); if( epsilonAsDouble < 0 || epsilonAsDouble > 1.0 ) { throw std::domain_error ( "Invalid Approx::epsilon: " + Catch::Detail::stringify( epsilonAsDouble ) + ", Approx::epsilon has to be between 0 and 1" ); } m_epsilon = epsilonAsDouble; return *this; } template ::value>::type> Approx& margin( T const& newMargin ) { double marginAsDouble = static_cast(newMargin); if( marginAsDouble < 0 ) { throw std::domain_error ( "Invalid Approx::margin: " + Catch::Detail::stringify( marginAsDouble ) + ", Approx::Margin has to be non-negative." ); } m_margin = marginAsDouble; return *this; } template ::value>::type> Approx& scale( T const& newScale ) { m_scale = static_cast(newScale); return *this; } std::string toString() const; private: double m_epsilon; double m_margin; double m_scale; double m_value; }; } // end namespace Detail namespace literals { Detail::Approx operator "" _a(long double val); Detail::Approx operator "" _a(unsigned long long val); } // end namespace literals template<> struct StringMaker { static std::string convert(Catch::Detail::Approx const& value); }; } // end namespace Catch // end catch_approx.h // start catch_string_manip.h #include #include namespace Catch { bool startsWith( std::string const& s, std::string const& prefix ); bool startsWith( std::string const& s, char prefix ); bool endsWith( std::string const& s, std::string const& suffix ); bool endsWith( std::string const& s, char suffix ); bool contains( std::string const& s, std::string const& infix ); void toLowerInPlace( std::string& s ); std::string toLower( std::string const& s ); std::string trim( std::string const& str ); bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ); struct pluralise { pluralise( std::size_t count, std::string const& label ); friend std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ); std::size_t m_count; std::string m_label; }; } // end catch_string_manip.h #ifndef CATCH_CONFIG_DISABLE_MATCHERS // start catch_capture_matchers.h // start catch_matchers.h #include #include namespace Catch { namespace Matchers { namespace Impl { template struct MatchAllOf; template struct MatchAnyOf; template struct MatchNotOf; class MatcherUntypedBase { public: MatcherUntypedBase() = default; MatcherUntypedBase ( MatcherUntypedBase const& ) = default; MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = delete; std::string toString() const; protected: virtual ~MatcherUntypedBase(); virtual std::string describe() const = 0; mutable std::string m_cachedToString; }; template struct MatcherMethod { virtual bool match( ObjectT const& arg ) const = 0; }; template struct MatcherMethod { virtual bool match( PtrT* arg ) const = 0; }; template struct MatcherBase : MatcherUntypedBase, MatcherMethod { MatchAllOf operator && ( MatcherBase const& other ) const; MatchAnyOf operator || ( MatcherBase const& other ) const; MatchNotOf operator ! () const; }; template struct MatchAllOf : MatcherBase { bool match( ArgT const& arg ) const override { for( auto matcher : m_matchers ) { if (!matcher->match(arg)) return false; } return true; } std::string describe() const override { std::string description; description.reserve( 4 + m_matchers.size()*32 ); description += "( "; bool first = true; for( auto matcher : m_matchers ) { if( first ) first = false; else description += " and "; description += matcher->toString(); } description += " )"; return description; } MatchAllOf& operator && ( MatcherBase const& other ) { m_matchers.push_back( &other ); return *this; } std::vector const*> m_matchers; }; template struct MatchAnyOf : MatcherBase { bool match( ArgT const& arg ) const override { for( auto matcher : m_matchers ) { if (matcher->match(arg)) return true; } return false; } std::string describe() const override { std::string description; description.reserve( 4 + m_matchers.size()*32 ); description += "( "; bool first = true; for( auto matcher : m_matchers ) { if( first ) first = false; else description += " or "; description += matcher->toString(); } description += " )"; return description; } MatchAnyOf& operator || ( MatcherBase const& other ) { m_matchers.push_back( &other ); return *this; } std::vector const*> m_matchers; }; template struct MatchNotOf : MatcherBase { MatchNotOf( MatcherBase const& underlyingMatcher ) : m_underlyingMatcher( underlyingMatcher ) {} bool match( ArgT const& arg ) const override { return !m_underlyingMatcher.match( arg ); } std::string describe() const override { return "not " + m_underlyingMatcher.toString(); } MatcherBase const& m_underlyingMatcher; }; template MatchAllOf MatcherBase::operator && ( MatcherBase const& other ) const { return MatchAllOf() && *this && other; } template MatchAnyOf MatcherBase::operator || ( MatcherBase const& other ) const { return MatchAnyOf() || *this || other; } template MatchNotOf MatcherBase::operator ! () const { return MatchNotOf( *this ); } } // namespace Impl } // namespace Matchers using namespace Matchers; using Matchers::Impl::MatcherBase; } // namespace Catch // end catch_matchers.h // start catch_matchers_floating.h #include #include namespace Catch { namespace Matchers { namespace Floating { enum class FloatingPointKind : uint8_t; struct WithinAbsMatcher : MatcherBase { WithinAbsMatcher(double target, double margin); bool match(double const& matchee) const override; std::string describe() const override; private: double m_target; double m_margin; }; struct WithinUlpsMatcher : MatcherBase { WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType); bool match(double const& matchee) const override; std::string describe() const override; private: double m_target; int m_ulps; FloatingPointKind m_type; }; } // namespace Floating // The following functions create the actual matcher objects. // This allows the types to be inferred Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff); Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff); Floating::WithinAbsMatcher WithinAbs(double target, double margin); } // namespace Matchers } // namespace Catch // end catch_matchers_floating.h // start catch_matchers_generic.hpp #include #include namespace Catch { namespace Matchers { namespace Generic { namespace Detail { std::string finalizeDescription(const std::string& desc); } template class PredicateMatcher : public MatcherBase { std::function m_predicate; std::string m_description; public: PredicateMatcher(std::function const& elem, std::string const& descr) :m_predicate(std::move(elem)), m_description(Detail::finalizeDescription(descr)) {} bool match( T const& item ) const override { return m_predicate(item); } std::string describe() const override { return m_description; } }; } // namespace Generic // The following functions create the actual matcher objects. // The user has to explicitly specify type to the function, because // infering std::function is hard (but possible) and // requires a lot of TMP. template Generic::PredicateMatcher Predicate(std::function const& predicate, std::string const& description = "") { return Generic::PredicateMatcher(predicate, description); } } // namespace Matchers } // namespace Catch // end catch_matchers_generic.hpp // start catch_matchers_string.h #include namespace Catch { namespace Matchers { namespace StdString { struct CasedString { CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ); std::string adjustString( std::string const& str ) const; std::string caseSensitivitySuffix() const; CaseSensitive::Choice m_caseSensitivity; std::string m_str; }; struct StringMatcherBase : MatcherBase { StringMatcherBase( std::string const& operation, CasedString const& comparator ); std::string describe() const override; CasedString m_comparator; std::string m_operation; }; struct EqualsMatcher : StringMatcherBase { EqualsMatcher( CasedString const& comparator ); bool match( std::string const& source ) const override; }; struct ContainsMatcher : StringMatcherBase { ContainsMatcher( CasedString const& comparator ); bool match( std::string const& source ) const override; }; struct StartsWithMatcher : StringMatcherBase { StartsWithMatcher( CasedString const& comparator ); bool match( std::string const& source ) const override; }; struct EndsWithMatcher : StringMatcherBase { EndsWithMatcher( CasedString const& comparator ); bool match( std::string const& source ) const override; }; struct RegexMatcher : MatcherBase { RegexMatcher( std::string regex, CaseSensitive::Choice caseSensitivity ); bool match( std::string const& matchee ) const override; std::string describe() const override; private: std::string m_regex; CaseSensitive::Choice m_caseSensitivity; }; } // namespace StdString // The following functions create the actual matcher objects. // This allows the types to be inferred StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); StdString::RegexMatcher Matches( std::string const& regex, CaseSensitive::Choice caseSensitivity = CaseSensitive::Yes ); } // namespace Matchers } // namespace Catch // end catch_matchers_string.h // start catch_matchers_vector.h #include namespace Catch { namespace Matchers { namespace Vector { namespace Detail { template size_t count(InputIterator first, InputIterator last, T const& item) { size_t cnt = 0; for (; first != last; ++first) { if (*first == item) { ++cnt; } } return cnt; } template bool contains(InputIterator first, InputIterator last, T const& item) { for (; first != last; ++first) { if (*first == item) { return true; } } return false; } } template struct ContainsElementMatcher : MatcherBase> { ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {} bool match(std::vector const &v) const override { for (auto const& el : v) { if (el == m_comparator) { return true; } } return false; } std::string describe() const override { return "Contains: " + ::Catch::Detail::stringify( m_comparator ); } T const& m_comparator; }; template struct ContainsMatcher : MatcherBase> { ContainsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} bool match(std::vector const &v) const override { // !TBD: see note in EqualsMatcher if (m_comparator.size() > v.size()) return false; for (auto const& comparator : m_comparator) { auto present = false; for (const auto& el : v) { if (el == comparator) { present = true; break; } } if (!present) { return false; } } return true; } std::string describe() const override { return "Contains: " + ::Catch::Detail::stringify( m_comparator ); } std::vector const& m_comparator; }; template struct EqualsMatcher : MatcherBase> { EqualsMatcher(std::vector const &comparator) : m_comparator( comparator ) {} bool match(std::vector const &v) const override { // !TBD: This currently works if all elements can be compared using != // - a more general approach would be via a compare template that defaults // to using !=. but could be specialised for, e.g. std::vector etc // - then just call that directly if (m_comparator.size() != v.size()) return false; for (std::size_t i = 0; i < v.size(); ++i) if (m_comparator[i] != v[i]) return false; return true; } std::string describe() const override { return "Equals: " + ::Catch::Detail::stringify( m_comparator ); } std::vector const& m_comparator; }; template struct UnorderedEqualsMatcher : MatcherBase> { UnorderedEqualsMatcher(std::vector const& target) : m_target(target) {} bool match(std::vector const& vec) const override { // Note: This is a reimplementation of std::is_permutation, // because I don't want to include inside the common path if (m_target.size() != vec.size()) { return false; } auto lfirst = m_target.begin(), llast = m_target.end(); auto rfirst = vec.begin(), rlast = vec.end(); // Cut common prefix to optimize checking of permuted parts while (lfirst != llast && *lfirst != *rfirst) { ++lfirst; ++rfirst; } if (lfirst == llast) { return true; } for (auto mid = lfirst; mid != llast; ++mid) { // Skip already counted items if (Detail::contains(lfirst, mid, *mid)) { continue; } size_t num_vec = Detail::count(rfirst, rlast, *mid); if (num_vec == 0 || Detail::count(lfirst, llast, *mid) != num_vec) { return false; } } return true; } std::string describe() const override { return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target); } private: std::vector const& m_target; }; } // namespace Vector // The following functions create the actual matcher objects. // This allows the types to be inferred template Vector::ContainsMatcher Contains( std::vector const& comparator ) { return Vector::ContainsMatcher( comparator ); } template Vector::ContainsElementMatcher VectorContains( T const& comparator ) { return Vector::ContainsElementMatcher( comparator ); } template Vector::EqualsMatcher Equals( std::vector const& comparator ) { return Vector::EqualsMatcher( comparator ); } template Vector::UnorderedEqualsMatcher UnorderedEquals(std::vector const& target) { return Vector::UnorderedEqualsMatcher(target); } } // namespace Matchers } // namespace Catch // end catch_matchers_vector.h namespace Catch { template class MatchExpr : public ITransientExpression { ArgT const& m_arg; MatcherT m_matcher; StringRef m_matcherString; public: MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef matcherString ) : ITransientExpression{ true, matcher.match( arg ) }, m_arg( arg ), m_matcher( matcher ), m_matcherString( matcherString ) {} void streamReconstructedExpression( std::ostream &os ) const override { auto matcherAsString = m_matcher.toString(); os << Catch::Detail::stringify( m_arg ) << ' '; if( matcherAsString == Detail::unprintableString ) os << m_matcherString; else os << matcherAsString; } }; using StringMatcher = Matchers::Impl::MatcherBase; void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef matcherString ); template auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef matcherString ) -> MatchExpr { return MatchExpr( arg, matcher, matcherString ); } } // namespace Catch /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ INTERNAL_CATCH_TRY { \ catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher ) ); \ } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) /////////////////////////////////////////////////////////////////////////////// #define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \ do { \ Catch::AssertionHandler catchAssertionHandler( macroName, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ if( catchAssertionHandler.allowThrows() ) \ try { \ static_cast(__VA_ARGS__ ); \ catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ } \ catch( exceptionType const& ex ) { \ catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher ) ); \ } \ catch( ... ) { \ catchAssertionHandler.handleUnexpectedInflightException(); \ } \ else \ catchAssertionHandler.handleThrowingCallSkipped(); \ INTERNAL_CATCH_REACT( catchAssertionHandler ) \ } while( false ) // end catch_capture_matchers.h #endif // These files are included here so the single_include script doesn't put them // in the conditionally compiled sections // start catch_test_case_info.h #include #include #include #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif namespace Catch { struct ITestInvoker; struct TestCaseInfo { enum SpecialProperties{ None = 0, IsHidden = 1 << 1, ShouldFail = 1 << 2, MayFail = 1 << 3, Throws = 1 << 4, NonPortable = 1 << 5, Benchmark = 1 << 6 }; TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::vector const& _tags, SourceLineInfo const& _lineInfo ); friend void setTags( TestCaseInfo& testCaseInfo, std::vector tags ); bool isHidden() const; bool throws() const; bool okToFail() const; bool expectedToFail() const; std::string tagsAsString() const; std::string name; std::string className; std::string description; std::vector tags; std::vector lcaseTags; SourceLineInfo lineInfo; SpecialProperties properties; }; class TestCase : public TestCaseInfo { public: TestCase( ITestInvoker* testCase, TestCaseInfo&& info ); TestCase withName( std::string const& _newName ) const; void invoke() const; TestCaseInfo const& getTestCaseInfo() const; bool operator == ( TestCase const& other ) const; bool operator < ( TestCase const& other ) const; private: std::shared_ptr test; }; TestCase makeTestCase( ITestInvoker* testCase, std::string const& className, NameAndTags const& nameAndTags, SourceLineInfo const& lineInfo ); } #ifdef __clang__ #pragma clang diagnostic pop #endif // end catch_test_case_info.h // start catch_interfaces_runner.h namespace Catch { struct IRunner { virtual ~IRunner(); virtual bool aborting() const = 0; }; } // end catch_interfaces_runner.h #ifdef __OBJC__ // start catch_objc.hpp #import #include // NB. Any general catch headers included here must be included // in catch.hpp first to make sure they are included by the single // header for non obj-usage /////////////////////////////////////////////////////////////////////////////// // This protocol is really only here for (self) documenting purposes, since // all its methods are optional. @protocol OcFixture @optional -(void) setUp; -(void) tearDown; @end namespace Catch { class OcMethod : public ITestInvoker { public: OcMethod( Class cls, SEL sel ) : m_cls( cls ), m_sel( sel ) {} virtual void invoke() const { id obj = [[m_cls alloc] init]; performOptionalSelector( obj, @selector(setUp) ); performOptionalSelector( obj, m_sel ); performOptionalSelector( obj, @selector(tearDown) ); arcSafeRelease( obj ); } private: virtual ~OcMethod() {} Class m_cls; SEL m_sel; }; namespace Detail{ inline std::string getAnnotation( Class cls, std::string const& annotationName, std::string const& testCaseName ) { NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()]; SEL sel = NSSelectorFromString( selStr ); arcSafeRelease( selStr ); id value = performOptionalSelector( cls, sel ); if( value ) return [(NSString*)value UTF8String]; return ""; } } inline std::size_t registerTestMethods() { std::size_t noTestMethods = 0; int noClasses = objc_getClassList( nullptr, 0 ); Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc( sizeof(Class) * noClasses); objc_getClassList( classes, noClasses ); for( int c = 0; c < noClasses; c++ ) { Class cls = classes[c]; { u_int count; Method* methods = class_copyMethodList( cls, &count ); for( u_int m = 0; m < count ; m++ ) { SEL selector = method_getName(methods[m]); std::string methodName = sel_getName(selector); if( startsWith( methodName, "Catch_TestCase_" ) ) { std::string testCaseName = methodName.substr( 15 ); std::string name = Detail::getAnnotation( cls, "Name", testCaseName ); std::string desc = Detail::getAnnotation( cls, "Description", testCaseName ); const char* className = class_getName( cls ); getMutableRegistryHub().registerTest( makeTestCase( new OcMethod( cls, selector ), className, NameAndTags( name.c_str(), desc.c_str() ), SourceLineInfo("",0) ) ); noTestMethods++; } } free(methods); } } return noTestMethods; } #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) namespace Matchers { namespace Impl { namespace NSStringMatchers { struct StringHolder : MatcherBase{ StringHolder( NSString* substr ) : m_substr( [substr copy] ){} StringHolder( StringHolder const& other ) : m_substr( [other.m_substr copy] ){} StringHolder() { arcSafeRelease( m_substr ); } bool match( NSString* arg ) const override { return false; } NSString* CATCH_ARC_STRONG m_substr; }; struct Equals : StringHolder { Equals( NSString* substr ) : StringHolder( substr ){} bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str isEqualToString:m_substr]; } std::string describe() const override { return "equals string: " + Catch::Detail::stringify( m_substr ); } }; struct Contains : StringHolder { Contains( NSString* substr ) : StringHolder( substr ){} bool match( NSString* str ) const { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location != NSNotFound; } std::string describe() const override { return "contains string: " + Catch::Detail::stringify( m_substr ); } }; struct StartsWith : StringHolder { StartsWith( NSString* substr ) : StringHolder( substr ){} bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == 0; } std::string describe() const override { return "starts with: " + Catch::Detail::stringify( m_substr ); } }; struct EndsWith : StringHolder { EndsWith( NSString* substr ) : StringHolder( substr ){} bool match( NSString* str ) const override { return (str != nil || m_substr == nil ) && [str rangeOfString:m_substr].location == [str length] - [m_substr length]; } std::string describe() const override { return "ends with: " + Catch::Detail::stringify( m_substr ); } }; } // namespace NSStringMatchers } // namespace Impl inline Impl::NSStringMatchers::Equals Equals( NSString* substr ){ return Impl::NSStringMatchers::Equals( substr ); } inline Impl::NSStringMatchers::Contains Contains( NSString* substr ){ return Impl::NSStringMatchers::Contains( substr ); } inline Impl::NSStringMatchers::StartsWith StartsWith( NSString* substr ){ return Impl::NSStringMatchers::StartsWith( substr ); } inline Impl::NSStringMatchers::EndsWith EndsWith( NSString* substr ){ return Impl::NSStringMatchers::EndsWith( substr ); } } // namespace Matchers using namespace Matchers; #endif // CATCH_CONFIG_DISABLE_MATCHERS } // namespace Catch /////////////////////////////////////////////////////////////////////////////// #define OC_MAKE_UNIQUE_NAME( root, uniqueSuffix ) root##uniqueSuffix #define OC_TEST_CASE2( name, desc, uniqueSuffix ) \ +(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Name_test_, uniqueSuffix ) \ { \ return @ name; \ } \ +(NSString*) OC_MAKE_UNIQUE_NAME( Catch_Description_test_, uniqueSuffix ) \ { \ return @ desc; \ } \ -(void) OC_MAKE_UNIQUE_NAME( Catch_TestCase_test_, uniqueSuffix ) #define OC_TEST_CASE( name, desc ) OC_TEST_CASE2( name, desc, __LINE__ ) // end catch_objc.hpp #endif #ifdef CATCH_CONFIG_EXTERNAL_INTERFACES // start catch_external_interfaces.h // start catch_reporter_bases.hpp // start catch_interfaces_reporter.h // start catch_config.hpp // start catch_test_spec_parser.h #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif // start catch_test_spec.h #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wpadded" #endif // start catch_wildcard_pattern.h namespace Catch { class WildcardPattern { enum WildcardPosition { NoWildcard = 0, WildcardAtStart = 1, WildcardAtEnd = 2, WildcardAtBothEnds = WildcardAtStart | WildcardAtEnd }; public: WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ); virtual ~WildcardPattern() = default; virtual bool matches( std::string const& str ) const; private: std::string adjustCase( std::string const& str ) const; CaseSensitive::Choice m_caseSensitivity; WildcardPosition m_wildcard = NoWildcard; std::string m_pattern; }; } // end catch_wildcard_pattern.h #include #include #include namespace Catch { class TestSpec { struct Pattern { virtual ~Pattern(); virtual bool matches( TestCaseInfo const& testCase ) const = 0; }; using PatternPtr = std::shared_ptr; class NamePattern : public Pattern { public: NamePattern( std::string const& name ); virtual ~NamePattern(); virtual bool matches( TestCaseInfo const& testCase ) const override; private: WildcardPattern m_wildcardPattern; }; class TagPattern : public Pattern { public: TagPattern( std::string const& tag ); virtual ~TagPattern(); virtual bool matches( TestCaseInfo const& testCase ) const override; private: std::string m_tag; }; class ExcludedPattern : public Pattern { public: ExcludedPattern( PatternPtr const& underlyingPattern ); virtual ~ExcludedPattern(); virtual bool matches( TestCaseInfo const& testCase ) const override; private: PatternPtr m_underlyingPattern; }; struct Filter { std::vector m_patterns; bool matches( TestCaseInfo const& testCase ) const; }; public: bool hasFilters() const; bool matches( TestCaseInfo const& testCase ) const; private: std::vector m_filters; friend class TestSpecParser; }; } #ifdef __clang__ #pragma clang diagnostic pop #endif // end catch_test_spec.h // start catch_interfaces_tag_alias_registry.h #include namespace Catch { struct TagAlias; struct ITagAliasRegistry { virtual ~ITagAliasRegistry(); // Nullptr if not present virtual TagAlias const* find( std::string const& alias ) const = 0; virtual std::string expandAliases( std::string const& unexpandedTestSpec ) const = 0; static ITagAliasRegistry const& get(); }; } // end namespace Catch // end catch_interfaces_tag_alias_registry.h namespace Catch { class TestSpecParser { enum Mode{ None, Name, QuotedName, Tag, EscapedName }; Mode m_mode = None; bool m_exclusion = false; std::size_t m_start = std::string::npos, m_pos = 0; std::string m_arg; std::vector m_escapeChars; TestSpec::Filter m_currentFilter; TestSpec m_testSpec; ITagAliasRegistry const* m_tagAliases = nullptr; public: TestSpecParser( ITagAliasRegistry const& tagAliases ); TestSpecParser& parse( std::string const& arg ); TestSpec testSpec(); private: void visitChar( char c ); void startNewMode( Mode mode, std::size_t start ); void escape(); std::string subString() const; template void addPattern() { std::string token = subString(); for( std::size_t i = 0; i < m_escapeChars.size(); ++i ) token = token.substr( 0, m_escapeChars[i]-m_start-i ) + token.substr( m_escapeChars[i]-m_start-i+1 ); m_escapeChars.clear(); if( startsWith( token, "exclude:" ) ) { m_exclusion = true; token = token.substr( 8 ); } if( !token.empty() ) { TestSpec::PatternPtr pattern = std::make_shared( token ); if( m_exclusion ) pattern = std::make_shared( pattern ); m_currentFilter.m_patterns.push_back( pattern ); } m_exclusion = false; m_mode = None; } void addFilter(); }; TestSpec parseTestSpec( std::string const& arg ); } // namespace Catch #ifdef __clang__ #pragma clang diagnostic pop #endif // end catch_test_spec_parser.h // start catch_interfaces_config.h #include #include #include #include namespace Catch { enum class Verbosity { Quiet = 0, Normal, High }; struct WarnAbout { enum What { Nothing = 0x00, NoAssertions = 0x01, NoTests = 0x02 }; }; struct ShowDurations { enum OrNot { DefaultForReporter, Always, Never }; }; struct RunTests { enum InWhatOrder { InDeclarationOrder, InLexicographicalOrder, InRandomOrder }; }; struct UseColour { enum YesOrNo { Auto, Yes, No }; }; struct WaitForKeypress { enum When { Never, BeforeStart = 1, BeforeExit = 2, BeforeStartAndExit = BeforeStart | BeforeExit }; }; class TestSpec; struct IConfig : NonCopyable { virtual ~IConfig(); virtual bool allowThrows() const = 0; virtual std::ostream& stream() const = 0; virtual std::string name() const = 0; virtual bool includeSuccessfulResults() const = 0; virtual bool shouldDebugBreak() const = 0; virtual bool warnAboutMissingAssertions() const = 0; virtual bool warnAboutNoTests() const = 0; virtual int abortAfter() const = 0; virtual bool showInvisibles() const = 0; virtual ShowDurations::OrNot showDurations() const = 0; virtual TestSpec const& testSpec() const = 0; virtual bool hasTestFilters() const = 0; virtual RunTests::InWhatOrder runOrder() const = 0; virtual unsigned int rngSeed() const = 0; virtual int benchmarkResolutionMultiple() const = 0; virtual UseColour::YesOrNo useColour() const = 0; virtual std::vector const& getSectionsToRun() const = 0; virtual Verbosity verbosity() const = 0; }; using IConfigPtr = std::shared_ptr; } // end catch_interfaces_config.h // Libstdc++ doesn't like incomplete classes for unique_ptr #include #include #include #ifndef CATCH_CONFIG_CONSOLE_WIDTH #define CATCH_CONFIG_CONSOLE_WIDTH 80 #endif namespace Catch { struct IStream; struct ConfigData { bool listTests = false; bool listTags = false; bool listReporters = false; bool listTestNamesOnly = false; bool showSuccessfulTests = false; bool shouldDebugBreak = false; bool noThrow = false; bool showHelp = false; bool showInvisibles = false; bool filenamesAsTags = false; bool libIdentify = false; int abortAfter = -1; unsigned int rngSeed = 0; int benchmarkResolutionMultiple = 100; Verbosity verbosity = Verbosity::Normal; WarnAbout::What warnings = WarnAbout::Nothing; ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter; RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder; UseColour::YesOrNo useColour = UseColour::Auto; WaitForKeypress::When waitForKeypress = WaitForKeypress::Never; std::string outputFilename; std::string name; std::string processName; #ifndef CATCH_CONFIG_DEFAULT_REPORTER #define CATCH_CONFIG_DEFAULT_REPORTER "console" #endif std::string reporterName = CATCH_CONFIG_DEFAULT_REPORTER; #undef CATCH_CONFIG_DEFAULT_REPORTER std::vector testsOrTags; std::vector sectionsToRun; }; class Config : public IConfig { public: Config() = default; Config( ConfigData const& data ); virtual ~Config() = default; std::string const& getFilename() const; bool listTests() const; bool listTestNamesOnly() const; bool listTags() const; bool listReporters() const; std::string getProcessName() const; std::string const& getReporterName() const; std::vector const& getTestsOrTags() const; std::vector const& getSectionsToRun() const override; virtual TestSpec const& testSpec() const override; bool hasTestFilters() const override; bool showHelp() const; // IConfig interface bool allowThrows() const override; std::ostream& stream() const override; std::string name() const override; bool includeSuccessfulResults() const override; bool warnAboutMissingAssertions() const override; bool warnAboutNoTests() const override; ShowDurations::OrNot showDurations() const override; RunTests::InWhatOrder runOrder() const override; unsigned int rngSeed() const override; int benchmarkResolutionMultiple() const override; UseColour::YesOrNo useColour() const override; bool shouldDebugBreak() const override; int abortAfter() const override; bool showInvisibles() const override; Verbosity verbosity() const override; private: IStream const* openStream(); ConfigData m_data; std::unique_ptr m_stream; TestSpec m_testSpec; bool m_hasTestFilters = false; }; } // end namespace Catch // end catch_config.hpp // start catch_assertionresult.h #include namespace Catch { struct AssertionResultData { AssertionResultData() = delete; AssertionResultData( ResultWas::OfType _resultType, LazyExpression const& _lazyExpression ); std::string message; mutable std::string reconstructedExpression; LazyExpression lazyExpression; ResultWas::OfType resultType; std::string reconstructExpression() const; }; class AssertionResult { public: AssertionResult() = delete; AssertionResult( AssertionInfo const& info, AssertionResultData const& data ); bool isOk() const; bool succeeded() const; ResultWas::OfType getResultType() const; bool hasExpression() const; bool hasMessage() const; std::string getExpression() const; std::string getExpressionInMacro() const; bool hasExpandedExpression() const; std::string getExpandedExpression() const; std::string getMessage() const; SourceLineInfo getSourceInfo() const; StringRef getTestMacroName() const; //protected: AssertionInfo m_info; AssertionResultData m_resultData; }; } // end namespace Catch // end catch_assertionresult.h // start catch_option.hpp namespace Catch { // An optional type template class Option { public: Option() : nullableValue( nullptr ) {} Option( T const& _value ) : nullableValue( new( storage ) T( _value ) ) {} Option( Option const& _other ) : nullableValue( _other ? new( storage ) T( *_other ) : nullptr ) {} ~Option() { reset(); } Option& operator= ( Option const& _other ) { if( &_other != this ) { reset(); if( _other ) nullableValue = new( storage ) T( *_other ); } return *this; } Option& operator = ( T const& _value ) { reset(); nullableValue = new( storage ) T( _value ); return *this; } void reset() { if( nullableValue ) nullableValue->~T(); nullableValue = nullptr; } T& operator*() { return *nullableValue; } T const& operator*() const { return *nullableValue; } T* operator->() { return nullableValue; } const T* operator->() const { return nullableValue; } T valueOr( T const& defaultValue ) const { return nullableValue ? *nullableValue : defaultValue; } bool some() const { return nullableValue != nullptr; } bool none() const { return nullableValue == nullptr; } bool operator !() const { return nullableValue == nullptr; } explicit operator bool() const { return some(); } private: T *nullableValue; alignas(alignof(T)) char storage[sizeof(T)]; }; } // end namespace Catch // end catch_option.hpp #include #include #include #include #include namespace Catch { struct ReporterConfig { explicit ReporterConfig( IConfigPtr const& _fullConfig ); ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ); std::ostream& stream() const; IConfigPtr fullConfig() const; private: std::ostream* m_stream; IConfigPtr m_fullConfig; }; struct ReporterPreferences { bool shouldRedirectStdOut = false; bool shouldReportAllAssertions = false; }; template struct LazyStat : Option { LazyStat& operator=( T const& _value ) { Option::operator=( _value ); used = false; return *this; } void reset() { Option::reset(); used = false; } bool used = false; }; struct TestRunInfo { TestRunInfo( std::string const& _name ); std::string name; }; struct GroupInfo { GroupInfo( std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount ); std::string name; std::size_t groupIndex; std::size_t groupsCounts; }; struct AssertionStats { AssertionStats( AssertionResult const& _assertionResult, std::vector const& _infoMessages, Totals const& _totals ); AssertionStats( AssertionStats const& ) = default; AssertionStats( AssertionStats && ) = default; AssertionStats& operator = ( AssertionStats const& ) = default; AssertionStats& operator = ( AssertionStats && ) = default; virtual ~AssertionStats(); AssertionResult assertionResult; std::vector infoMessages; Totals totals; }; struct SectionStats { SectionStats( SectionInfo const& _sectionInfo, Counts const& _assertions, double _durationInSeconds, bool _missingAssertions ); SectionStats( SectionStats const& ) = default; SectionStats( SectionStats && ) = default; SectionStats& operator = ( SectionStats const& ) = default; SectionStats& operator = ( SectionStats && ) = default; virtual ~SectionStats(); SectionInfo sectionInfo; Counts assertions; double durationInSeconds; bool missingAssertions; }; struct TestCaseStats { TestCaseStats( TestCaseInfo const& _testInfo, Totals const& _totals, std::string const& _stdOut, std::string const& _stdErr, bool _aborting ); TestCaseStats( TestCaseStats const& ) = default; TestCaseStats( TestCaseStats && ) = default; TestCaseStats& operator = ( TestCaseStats const& ) = default; TestCaseStats& operator = ( TestCaseStats && ) = default; virtual ~TestCaseStats(); TestCaseInfo testInfo; Totals totals; std::string stdOut; std::string stdErr; bool aborting; }; struct TestGroupStats { TestGroupStats( GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting ); TestGroupStats( GroupInfo const& _groupInfo ); TestGroupStats( TestGroupStats const& ) = default; TestGroupStats( TestGroupStats && ) = default; TestGroupStats& operator = ( TestGroupStats const& ) = default; TestGroupStats& operator = ( TestGroupStats && ) = default; virtual ~TestGroupStats(); GroupInfo groupInfo; Totals totals; bool aborting; }; struct TestRunStats { TestRunStats( TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting ); TestRunStats( TestRunStats const& ) = default; TestRunStats( TestRunStats && ) = default; TestRunStats& operator = ( TestRunStats const& ) = default; TestRunStats& operator = ( TestRunStats && ) = default; virtual ~TestRunStats(); TestRunInfo runInfo; Totals totals; bool aborting; }; struct BenchmarkInfo { std::string name; }; struct BenchmarkStats { BenchmarkInfo info; std::size_t iterations; uint64_t elapsedTimeInNanoseconds; }; struct IStreamingReporter { virtual ~IStreamingReporter() = default; // Implementing class must also provide the following static methods: // static std::string getDescription(); // static std::set getSupportedVerbosities() virtual ReporterPreferences getPreferences() const = 0; virtual void noMatchingTestCases( std::string const& spec ) = 0; virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0; virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0; virtual void testCaseStarting( TestCaseInfo const& testInfo ) = 0; virtual void sectionStarting( SectionInfo const& sectionInfo ) = 0; // *** experimental *** virtual void benchmarkStarting( BenchmarkInfo const& ) {} virtual void assertionStarting( AssertionInfo const& assertionInfo ) = 0; // The return value indicates if the messages buffer should be cleared: virtual bool assertionEnded( AssertionStats const& assertionStats ) = 0; // *** experimental *** virtual void benchmarkEnded( BenchmarkStats const& ) {} virtual void sectionEnded( SectionStats const& sectionStats ) = 0; virtual void testCaseEnded( TestCaseStats const& testCaseStats ) = 0; virtual void testGroupEnded( TestGroupStats const& testGroupStats ) = 0; virtual void testRunEnded( TestRunStats const& testRunStats ) = 0; virtual void skipTest( TestCaseInfo const& testInfo ) = 0; // Default empty implementation provided virtual void fatalErrorEncountered( StringRef name ); virtual bool isMulti() const; }; using IStreamingReporterPtr = std::unique_ptr; struct IReporterFactory { virtual ~IReporterFactory(); virtual IStreamingReporterPtr create( ReporterConfig const& config ) const = 0; virtual std::string getDescription() const = 0; }; using IReporterFactoryPtr = std::shared_ptr; struct IReporterRegistry { using FactoryMap = std::map; using Listeners = std::vector; virtual ~IReporterRegistry(); virtual IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const = 0; virtual FactoryMap const& getFactories() const = 0; virtual Listeners const& getListeners() const = 0; }; } // end namespace Catch // end catch_interfaces_reporter.h #include #include #include #include #include #include #include namespace Catch { void prepareExpandedExpression(AssertionResult& result); // Returns double formatted as %.3f (format expected on output) std::string getFormattedDuration( double duration ); template struct StreamingReporterBase : IStreamingReporter { StreamingReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = false; if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) throw std::domain_error( "Verbosity level not supported by this reporter" ); } ReporterPreferences getPreferences() const override { return m_reporterPrefs; } static std::set getSupportedVerbosities() { return { Verbosity::Normal }; } ~StreamingReporterBase() override = default; void noMatchingTestCases(std::string const&) override {} void testRunStarting(TestRunInfo const& _testRunInfo) override { currentTestRunInfo = _testRunInfo; } void testGroupStarting(GroupInfo const& _groupInfo) override { currentGroupInfo = _groupInfo; } void testCaseStarting(TestCaseInfo const& _testInfo) override { currentTestCaseInfo = _testInfo; } void sectionStarting(SectionInfo const& _sectionInfo) override { m_sectionStack.push_back(_sectionInfo); } void sectionEnded(SectionStats const& /* _sectionStats */) override { m_sectionStack.pop_back(); } void testCaseEnded(TestCaseStats const& /* _testCaseStats */) override { currentTestCaseInfo.reset(); } void testGroupEnded(TestGroupStats const& /* _testGroupStats */) override { currentGroupInfo.reset(); } void testRunEnded(TestRunStats const& /* _testRunStats */) override { currentTestCaseInfo.reset(); currentGroupInfo.reset(); currentTestRunInfo.reset(); } void skipTest(TestCaseInfo const&) override { // Don't do anything with this by default. // It can optionally be overridden in the derived class. } IConfigPtr m_config; std::ostream& stream; LazyStat currentTestRunInfo; LazyStat currentGroupInfo; LazyStat currentTestCaseInfo; std::vector m_sectionStack; ReporterPreferences m_reporterPrefs; }; template struct CumulativeReporterBase : IStreamingReporter { template struct Node { explicit Node( T const& _value ) : value( _value ) {} virtual ~Node() {} using ChildNodes = std::vector>; T value; ChildNodes children; }; struct SectionNode { explicit SectionNode(SectionStats const& _stats) : stats(_stats) {} virtual ~SectionNode() = default; bool operator == (SectionNode const& other) const { return stats.sectionInfo.lineInfo == other.stats.sectionInfo.lineInfo; } bool operator == (std::shared_ptr const& other) const { return operator==(*other); } SectionStats stats; using ChildSections = std::vector>; using Assertions = std::vector; ChildSections childSections; Assertions assertions; std::string stdOut; std::string stdErr; }; struct BySectionInfo { BySectionInfo( SectionInfo const& other ) : m_other( other ) {} BySectionInfo( BySectionInfo const& other ) : m_other( other.m_other ) {} bool operator() (std::shared_ptr const& node) const { return ((node->stats.sectionInfo.name == m_other.name) && (node->stats.sectionInfo.lineInfo == m_other.lineInfo)); } void operator=(BySectionInfo const&) = delete; private: SectionInfo const& m_other; }; using TestCaseNode = Node; using TestGroupNode = Node; using TestRunNode = Node; CumulativeReporterBase( ReporterConfig const& _config ) : m_config( _config.fullConfig() ), stream( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = false; if( !DerivedT::getSupportedVerbosities().count( m_config->verbosity() ) ) throw std::domain_error( "Verbosity level not supported by this reporter" ); } ~CumulativeReporterBase() override = default; ReporterPreferences getPreferences() const override { return m_reporterPrefs; } static std::set getSupportedVerbosities() { return { Verbosity::Normal }; } void testRunStarting( TestRunInfo const& ) override {} void testGroupStarting( GroupInfo const& ) override {} void testCaseStarting( TestCaseInfo const& ) override {} void sectionStarting( SectionInfo const& sectionInfo ) override { SectionStats incompleteStats( sectionInfo, Counts(), 0, false ); std::shared_ptr node; if( m_sectionStack.empty() ) { if( !m_rootSection ) m_rootSection = std::make_shared( incompleteStats ); node = m_rootSection; } else { SectionNode& parentNode = *m_sectionStack.back(); auto it = std::find_if( parentNode.childSections.begin(), parentNode.childSections.end(), BySectionInfo( sectionInfo ) ); if( it == parentNode.childSections.end() ) { node = std::make_shared( incompleteStats ); parentNode.childSections.push_back( node ); } else node = *it; } m_sectionStack.push_back( node ); m_deepestSection = std::move(node); } void assertionStarting(AssertionInfo const&) override {} bool assertionEnded(AssertionStats const& assertionStats) override { assert(!m_sectionStack.empty()); // AssertionResult holds a pointer to a temporary DecomposedExpression, // which getExpandedExpression() calls to build the expression string. // Our section stack copy of the assertionResult will likely outlive the // temporary, so it must be expanded or discarded now to avoid calling // a destroyed object later. prepareExpandedExpression(const_cast( assertionStats.assertionResult ) ); SectionNode& sectionNode = *m_sectionStack.back(); sectionNode.assertions.push_back(assertionStats); return true; } void sectionEnded(SectionStats const& sectionStats) override { assert(!m_sectionStack.empty()); SectionNode& node = *m_sectionStack.back(); node.stats = sectionStats; m_sectionStack.pop_back(); } void testCaseEnded(TestCaseStats const& testCaseStats) override { auto node = std::make_shared(testCaseStats); assert(m_sectionStack.size() == 0); node->children.push_back(m_rootSection); m_testCases.push_back(node); m_rootSection.reset(); assert(m_deepestSection); m_deepestSection->stdOut = testCaseStats.stdOut; m_deepestSection->stdErr = testCaseStats.stdErr; } void testGroupEnded(TestGroupStats const& testGroupStats) override { auto node = std::make_shared(testGroupStats); node->children.swap(m_testCases); m_testGroups.push_back(node); } void testRunEnded(TestRunStats const& testRunStats) override { auto node = std::make_shared(testRunStats); node->children.swap(m_testGroups); m_testRuns.push_back(node); testRunEndedCumulative(); } virtual void testRunEndedCumulative() = 0; void skipTest(TestCaseInfo const&) override {} IConfigPtr m_config; std::ostream& stream; std::vector m_assertions; std::vector>> m_sections; std::vector> m_testCases; std::vector> m_testGroups; std::vector> m_testRuns; std::shared_ptr m_rootSection; std::shared_ptr m_deepestSection; std::vector> m_sectionStack; ReporterPreferences m_reporterPrefs; }; template char const* getLineOfChars() { static char line[CATCH_CONFIG_CONSOLE_WIDTH] = {0}; if( !*line ) { std::memset( line, C, CATCH_CONFIG_CONSOLE_WIDTH-1 ); line[CATCH_CONFIG_CONSOLE_WIDTH-1] = 0; } return line; } struct TestEventListenerBase : StreamingReporterBase { TestEventListenerBase( ReporterConfig const& _config ); void assertionStarting(AssertionInfo const&) override; bool assertionEnded(AssertionStats const&) override; }; } // end namespace Catch // end catch_reporter_bases.hpp // start catch_console_colour.h namespace Catch { struct Colour { enum Code { None = 0, White, Red, Green, Blue, Cyan, Yellow, Grey, Bright = 0x10, BrightRed = Bright | Red, BrightGreen = Bright | Green, LightGrey = Bright | Grey, BrightWhite = Bright | White, BrightYellow = Bright | Yellow, // By intention FileName = LightGrey, Warning = BrightYellow, ResultError = BrightRed, ResultSuccess = BrightGreen, ResultExpectedFailure = Warning, Error = BrightRed, Success = Green, OriginalExpression = Cyan, ReconstructedExpression = BrightYellow, SecondaryText = LightGrey, Headers = White }; // Use constructed object for RAII guard Colour( Code _colourCode ); Colour( Colour&& other ) noexcept; Colour& operator=( Colour&& other ) noexcept; ~Colour(); // Use static method for one-shot changes static void use( Code _colourCode ); private: bool m_moved = false; }; std::ostream& operator << ( std::ostream& os, Colour const& ); } // end namespace Catch // end catch_console_colour.h // start catch_reporter_registrars.hpp namespace Catch { template class ReporterRegistrar { class ReporterFactory : public IReporterFactory { virtual IStreamingReporterPtr create( ReporterConfig const& config ) const override { return std::unique_ptr( new T( config ) ); } virtual std::string getDescription() const override { return T::getDescription(); } }; public: explicit ReporterRegistrar( std::string const& name ) { getMutableRegistryHub().registerReporter( name, std::make_shared() ); } }; template class ListenerRegistrar { class ListenerFactory : public IReporterFactory { virtual IStreamingReporterPtr create( ReporterConfig const& config ) const override { return std::unique_ptr( new T( config ) ); } virtual std::string getDescription() const override { return std::string(); } }; public: ListenerRegistrar() { getMutableRegistryHub().registerListener( std::make_shared() ); } }; } #if !defined(CATCH_CONFIG_DISABLE) #define CATCH_REGISTER_REPORTER( name, reporterType ) \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::ReporterRegistrar catch_internal_RegistrarFor##reporterType( name ); } \ CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS #define CATCH_REGISTER_LISTENER( listenerType ) \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ namespace{ Catch::ListenerRegistrar catch_internal_RegistrarFor##listenerType; } \ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS #else // CATCH_CONFIG_DISABLE #define CATCH_REGISTER_REPORTER(name, reporterType) #define CATCH_REGISTER_LISTENER(listenerType) #endif // CATCH_CONFIG_DISABLE // end catch_reporter_registrars.hpp // Allow users to base their work off existing reporters // start catch_reporter_compact.h namespace Catch { struct CompactReporter : StreamingReporterBase { using StreamingReporterBase::StreamingReporterBase; ~CompactReporter() override; static std::string getDescription(); ReporterPreferences getPreferences() const override; void noMatchingTestCases(std::string const& spec) override; void assertionStarting(AssertionInfo const&) override; bool assertionEnded(AssertionStats const& _assertionStats) override; void sectionEnded(SectionStats const& _sectionStats) override; void testRunEnded(TestRunStats const& _testRunStats) override; }; } // end namespace Catch // end catch_reporter_compact.h // start catch_reporter_console.h #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch // Note that 4062 (not all labels are handled // and default is missing) is enabled #endif namespace Catch { // Fwd decls struct SummaryColumn; class TablePrinter; struct ConsoleReporter : StreamingReporterBase { std::unique_ptr m_tablePrinter; ConsoleReporter(ReporterConfig const& config); ~ConsoleReporter() override; static std::string getDescription(); void noMatchingTestCases(std::string const& spec) override; void assertionStarting(AssertionInfo const&) override; bool assertionEnded(AssertionStats const& _assertionStats) override; void sectionStarting(SectionInfo const& _sectionInfo) override; void sectionEnded(SectionStats const& _sectionStats) override; void benchmarkStarting(BenchmarkInfo const& info) override; void benchmarkEnded(BenchmarkStats const& stats) override; void testCaseEnded(TestCaseStats const& _testCaseStats) override; void testGroupEnded(TestGroupStats const& _testGroupStats) override; void testRunEnded(TestRunStats const& _testRunStats) override; private: void lazyPrint(); void lazyPrintWithoutClosingBenchmarkTable(); void lazyPrintRunInfo(); void lazyPrintGroupInfo(); void printTestCaseAndSectionHeader(); void printClosedHeader(std::string const& _name); void printOpenHeader(std::string const& _name); // if string has a : in first line will set indent to follow it on // subsequent lines void printHeaderString(std::string const& _string, std::size_t indent = 0); void printTotals(Totals const& totals); void printSummaryRow(std::string const& label, std::vector const& cols, std::size_t row); void printTotalsDivider(Totals const& totals); void printSummaryDivider(); private: bool m_headerPrinted = false; }; } // end namespace Catch #if defined(_MSC_VER) #pragma warning(pop) #endif // end catch_reporter_console.h // start catch_reporter_junit.h // start catch_xmlwriter.h #include namespace Catch { class XmlEncode { public: enum ForWhat { ForTextNodes, ForAttributes }; XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ); void encodeTo( std::ostream& os ) const; friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ); private: std::string m_str; ForWhat m_forWhat; }; class XmlWriter { public: class ScopedElement { public: ScopedElement( XmlWriter* writer ); ScopedElement( ScopedElement&& other ) noexcept; ScopedElement& operator=( ScopedElement&& other ) noexcept; ~ScopedElement(); ScopedElement& writeText( std::string const& text, bool indent = true ); template ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { m_writer->writeAttribute( name, attribute ); return *this; } private: mutable XmlWriter* m_writer = nullptr; }; XmlWriter( std::ostream& os = Catch::cout() ); ~XmlWriter(); XmlWriter( XmlWriter const& ) = delete; XmlWriter& operator=( XmlWriter const& ) = delete; XmlWriter& startElement( std::string const& name ); ScopedElement scopedElement( std::string const& name ); XmlWriter& endElement(); XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ); XmlWriter& writeAttribute( std::string const& name, bool attribute ); template XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { ReusableStringStream rss; rss << attribute; return writeAttribute( name, rss.str() ); } XmlWriter& writeText( std::string const& text, bool indent = true ); XmlWriter& writeComment( std::string const& text ); void writeStylesheetRef( std::string const& url ); XmlWriter& writeBlankLine(); void ensureTagClosed(); private: void writeDeclaration(); void newlineIfNecessary(); bool m_tagIsOpen = false; bool m_needsNewline = false; std::vector m_tags; std::string m_indent; std::ostream& m_os; }; } // end catch_xmlwriter.h namespace Catch { class JunitReporter : public CumulativeReporterBase { public: JunitReporter(ReporterConfig const& _config); ~JunitReporter() override; static std::string getDescription(); void noMatchingTestCases(std::string const& /*spec*/) override; void testRunStarting(TestRunInfo const& runInfo) override; void testGroupStarting(GroupInfo const& groupInfo) override; void testCaseStarting(TestCaseInfo const& testCaseInfo) override; bool assertionEnded(AssertionStats const& assertionStats) override; void testCaseEnded(TestCaseStats const& testCaseStats) override; void testGroupEnded(TestGroupStats const& testGroupStats) override; void testRunEndedCumulative() override; void writeGroup(TestGroupNode const& groupNode, double suiteTime); void writeTestCase(TestCaseNode const& testCaseNode); void writeSection(std::string const& className, std::string const& rootName, SectionNode const& sectionNode); void writeAssertions(SectionNode const& sectionNode); void writeAssertion(AssertionStats const& stats); XmlWriter xml; Timer suiteTimer; std::string stdOutForSuite; std::string stdErrForSuite; unsigned int unexpectedExceptions = 0; bool m_okToFail = false; }; } // end namespace Catch // end catch_reporter_junit.h // start catch_reporter_xml.h namespace Catch { class XmlReporter : public StreamingReporterBase { public: XmlReporter(ReporterConfig const& _config); ~XmlReporter() override; static std::string getDescription(); virtual std::string getStylesheetRef() const; void writeSourceInfo(SourceLineInfo const& sourceInfo); public: // StreamingReporterBase void noMatchingTestCases(std::string const& s) override; void testRunStarting(TestRunInfo const& testInfo) override; void testGroupStarting(GroupInfo const& groupInfo) override; void testCaseStarting(TestCaseInfo const& testInfo) override; void sectionStarting(SectionInfo const& sectionInfo) override; void assertionStarting(AssertionInfo const&) override; bool assertionEnded(AssertionStats const& assertionStats) override; void sectionEnded(SectionStats const& sectionStats) override; void testCaseEnded(TestCaseStats const& testCaseStats) override; void testGroupEnded(TestGroupStats const& testGroupStats) override; void testRunEnded(TestRunStats const& testRunStats) override; private: Timer m_testCaseTimer; XmlWriter m_xml; int m_sectionDepth = 0; }; } // end namespace Catch // end catch_reporter_xml.h // end catch_external_interfaces.h #endif #endif // ! CATCH_CONFIG_IMPL_ONLY #ifdef CATCH_IMPL // start catch_impl.hpp #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wweak-vtables" #endif // Keep these here for external reporters // start catch_test_case_tracker.h #include #include #include namespace Catch { namespace TestCaseTracking { struct NameAndLocation { std::string name; SourceLineInfo location; NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); }; struct ITracker; using ITrackerPtr = std::shared_ptr; struct ITracker { virtual ~ITracker(); // static queries virtual NameAndLocation const& nameAndLocation() const = 0; // dynamic queries virtual bool isComplete() const = 0; // Successfully completed or failed virtual bool isSuccessfullyCompleted() const = 0; virtual bool isOpen() const = 0; // Started but not complete virtual bool hasChildren() const = 0; virtual ITracker& parent() = 0; // actions virtual void close() = 0; // Successfully complete virtual void fail() = 0; virtual void markAsNeedingAnotherRun() = 0; virtual void addChild( ITrackerPtr const& child ) = 0; virtual ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) = 0; virtual void openChild() = 0; // Debug/ checking virtual bool isSectionTracker() const = 0; virtual bool isIndexTracker() const = 0; }; class TrackerContext { enum RunState { NotStarted, Executing, CompletedCycle }; ITrackerPtr m_rootTracker; ITracker* m_currentTracker = nullptr; RunState m_runState = NotStarted; public: static TrackerContext& instance(); ITracker& startRun(); void endRun(); void startCycle(); void completeCycle(); bool completedCycle() const; ITracker& currentTracker(); void setCurrentTracker( ITracker* tracker ); }; class TrackerBase : public ITracker { protected: enum CycleState { NotStarted, Executing, ExecutingChildren, NeedsAnotherRun, CompletedSuccessfully, Failed }; class TrackerHasName { NameAndLocation m_nameAndLocation; public: TrackerHasName( NameAndLocation const& nameAndLocation ); bool operator ()( ITrackerPtr const& tracker ) const; }; using Children = std::vector; NameAndLocation m_nameAndLocation; TrackerContext& m_ctx; ITracker* m_parent; Children m_children; CycleState m_runState = NotStarted; public: TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); NameAndLocation const& nameAndLocation() const override; bool isComplete() const override; bool isSuccessfullyCompleted() const override; bool isOpen() const override; bool hasChildren() const override; void addChild( ITrackerPtr const& child ) override; ITrackerPtr findChild( NameAndLocation const& nameAndLocation ) override; ITracker& parent() override; void openChild() override; bool isSectionTracker() const override; bool isIndexTracker() const override; void open(); void close() override; void fail() override; void markAsNeedingAnotherRun() override; private: void moveToParent(); void moveToThis(); }; class SectionTracker : public TrackerBase { std::vector m_filters; public: SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ); bool isSectionTracker() const override; static SectionTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ); void tryOpen(); void addInitialFilters( std::vector const& filters ); void addNextFilters( std::vector const& filters ); }; class IndexTracker : public TrackerBase { int m_size; int m_index = -1; public: IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ); bool isIndexTracker() const override; void close() override; static IndexTracker& acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ); int index() const; void moveNext(); }; } // namespace TestCaseTracking using TestCaseTracking::ITracker; using TestCaseTracking::TrackerContext; using TestCaseTracking::SectionTracker; using TestCaseTracking::IndexTracker; } // namespace Catch // end catch_test_case_tracker.h // start catch_leak_detector.h namespace Catch { struct LeakDetector { LeakDetector(); }; } // end catch_leak_detector.h // Cpp files will be included in the single-header file here // start catch_approx.cpp #include #include namespace { // Performs equivalent check of std::fabs(lhs - rhs) <= margin // But without the subtraction to allow for INFINITY in comparison bool marginComparison(double lhs, double rhs, double margin) { return (lhs + margin >= rhs) && (rhs + margin >= lhs); } } namespace Catch { namespace Detail { Approx::Approx ( double value ) : m_epsilon( std::numeric_limits::epsilon()*100 ), m_margin( 0.0 ), m_scale( 0.0 ), m_value( value ) {} Approx Approx::custom() { return Approx( 0 ); } Approx Approx::operator-() const { auto temp(*this); temp.m_value = -temp.m_value; return temp; } std::string Approx::toString() const { ReusableStringStream rss; rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; return rss.str(); } bool Approx::equalityComparisonImpl(const double other) const { // First try with fixed margin, then compute margin based on epsilon, scale and Approx's value // Thanks to Richard Harris for his help refining the scaled margin value return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value))); } } // end namespace Detail namespace literals { Detail::Approx operator "" _a(long double val) { return Detail::Approx(val); } Detail::Approx operator "" _a(unsigned long long val) { return Detail::Approx(val); } } // end namespace literals std::string StringMaker::convert(Catch::Detail::Approx const& value) { return value.toString(); } } // end namespace Catch // end catch_approx.cpp // start catch_assertionhandler.cpp // start catch_context.h #include namespace Catch { struct IResultCapture; struct IRunner; struct IConfig; struct IMutableContext; using IConfigPtr = std::shared_ptr; struct IContext { virtual ~IContext(); virtual IResultCapture* getResultCapture() = 0; virtual IRunner* getRunner() = 0; virtual IConfigPtr const& getConfig() const = 0; }; struct IMutableContext : IContext { virtual ~IMutableContext(); virtual void setResultCapture( IResultCapture* resultCapture ) = 0; virtual void setRunner( IRunner* runner ) = 0; virtual void setConfig( IConfigPtr const& config ) = 0; private: static IMutableContext *currentContext; friend IMutableContext& getCurrentMutableContext(); friend void cleanUpContext(); static void createContext(); }; inline IMutableContext& getCurrentMutableContext() { if( !IMutableContext::currentContext ) IMutableContext::createContext(); return *IMutableContext::currentContext; } inline IContext& getCurrentContext() { return getCurrentMutableContext(); } void cleanUpContext(); } // end catch_context.h // start catch_debugger.h namespace Catch { bool isDebuggerActive(); } #ifdef CATCH_PLATFORM_MAC #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ #elif defined(CATCH_PLATFORM_LINUX) // If we can use inline assembler, do it because this allows us to break // directly at the location of the failing check instead of breaking inside // raise() called from it, i.e. one stack frame below. #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64)) #define CATCH_TRAP() asm volatile ("int $3") /* NOLINT */ #else // Fall back to the generic way. #include #define CATCH_TRAP() raise(SIGTRAP) #endif #elif defined(_MSC_VER) #define CATCH_TRAP() __debugbreak() #elif defined(__MINGW32__) extern "C" __declspec(dllimport) void __stdcall DebugBreak(); #define CATCH_TRAP() DebugBreak() #endif #ifdef CATCH_TRAP #define CATCH_BREAK_INTO_DEBUGGER() if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } #else namespace Catch { inline void doNothing() {} } #define CATCH_BREAK_INTO_DEBUGGER() Catch::doNothing() #endif // end catch_debugger.h // start catch_run_context.h // start catch_fatal_condition.h // start catch_windows_h_proxy.h #if defined(CATCH_PLATFORM_WINDOWS) #if !defined(NOMINMAX) && !defined(CATCH_CONFIG_NO_NOMINMAX) # define CATCH_DEFINED_NOMINMAX # define NOMINMAX #endif #if !defined(WIN32_LEAN_AND_MEAN) && !defined(CATCH_CONFIG_NO_WIN32_LEAN_AND_MEAN) # define CATCH_DEFINED_WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #ifdef __AFXDLL #include #else #include #endif #ifdef CATCH_DEFINED_NOMINMAX # undef NOMINMAX #endif #ifdef CATCH_DEFINED_WIN32_LEAN_AND_MEAN # undef WIN32_LEAN_AND_MEAN #endif #endif // defined(CATCH_PLATFORM_WINDOWS) // end catch_windows_h_proxy.h #if defined( CATCH_CONFIG_WINDOWS_SEH ) namespace Catch { struct FatalConditionHandler { static LONG CALLBACK handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo); FatalConditionHandler(); static void reset(); ~FatalConditionHandler(); private: static bool isSet; static ULONG guaranteeSize; static PVOID exceptionHandlerHandle; }; } // namespace Catch #elif defined ( CATCH_CONFIG_POSIX_SIGNALS ) #include namespace Catch { struct FatalConditionHandler { static bool isSet; static struct sigaction oldSigActions[]; static stack_t oldSigStack; static char altStackMem[]; static void handleSignal( int sig ); FatalConditionHandler(); ~FatalConditionHandler(); static void reset(); }; } // namespace Catch #else namespace Catch { struct FatalConditionHandler { void reset(); }; } #endif // end catch_fatal_condition.h #include namespace Catch { struct IMutableContext; /////////////////////////////////////////////////////////////////////////// class RunContext : public IResultCapture, public IRunner { public: RunContext( RunContext const& ) = delete; RunContext& operator =( RunContext const& ) = delete; explicit RunContext( IConfigPtr const& _config, IStreamingReporterPtr&& reporter ); ~RunContext() override; void testGroupStarting( std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount ); void testGroupEnded( std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount ); Totals runTest(TestCase const& testCase); IConfigPtr config() const; IStreamingReporter& reporter() const; public: // IResultCapture // Assertion handlers void handleExpr ( AssertionInfo const& info, ITransientExpression const& expr, AssertionReaction& reaction ) override; void handleMessage ( AssertionInfo const& info, ResultWas::OfType resultType, StringRef const& message, AssertionReaction& reaction ) override; void handleUnexpectedExceptionNotThrown ( AssertionInfo const& info, AssertionReaction& reaction ) override; void handleUnexpectedInflightException ( AssertionInfo const& info, std::string const& message, AssertionReaction& reaction ) override; void handleIncomplete ( AssertionInfo const& info ) override; void handleNonExpr ( AssertionInfo const &info, ResultWas::OfType resultType, AssertionReaction &reaction ) override; bool sectionStarted( SectionInfo const& sectionInfo, Counts& assertions ) override; void sectionEnded( SectionEndInfo const& endInfo ) override; void sectionEndedEarly( SectionEndInfo const& endInfo ) override; void benchmarkStarting( BenchmarkInfo const& info ) override; void benchmarkEnded( BenchmarkStats const& stats ) override; void pushScopedMessage( MessageInfo const& message ) override; void popScopedMessage( MessageInfo const& message ) override; std::string getCurrentTestName() const override; const AssertionResult* getLastResult() const override; void exceptionEarlyReported() override; void handleFatalErrorCondition( StringRef message ) override; bool lastAssertionPassed() override; void assertionPassed() override; public: // !TBD We need to do this another way! bool aborting() const final; private: void runCurrentTest( std::string& redirectedCout, std::string& redirectedCerr ); void invokeActiveTestCase(); void resetAssertionInfo(); bool testForMissingAssertions( Counts& assertions ); void assertionEnded( AssertionResult const& result ); void reportExpr ( AssertionInfo const &info, ResultWas::OfType resultType, ITransientExpression const *expr, bool negated ); void populateReaction( AssertionReaction& reaction ); private: void handleUnfinishedSections(); TestRunInfo m_runInfo; IMutableContext& m_context; TestCase const* m_activeTestCase = nullptr; ITracker* m_testCaseTracker; Option m_lastResult; IConfigPtr m_config; Totals m_totals; IStreamingReporterPtr m_reporter; std::vector m_messages; AssertionInfo m_lastAssertionInfo; std::vector m_unfinishedSections; std::vector m_activeSections; TrackerContext m_trackerContext; bool m_lastAssertionPassed = false; bool m_shouldReportUnexpected = true; bool m_includeSuccessfulResults; }; } // end namespace Catch // end catch_run_context.h namespace Catch { namespace { auto operator <<( std::ostream& os, ITransientExpression const& expr ) -> std::ostream& { expr.streamReconstructedExpression( os ); return os; } } LazyExpression::LazyExpression( bool isNegated ) : m_isNegated( isNegated ) {} LazyExpression::LazyExpression( LazyExpression const& other ) : m_isNegated( other.m_isNegated ) {} LazyExpression::operator bool() const { return m_transientExpression != nullptr; } auto operator << ( std::ostream& os, LazyExpression const& lazyExpr ) -> std::ostream& { if( lazyExpr.m_isNegated ) os << "!"; if( lazyExpr ) { if( lazyExpr.m_isNegated && lazyExpr.m_transientExpression->isBinaryExpression() ) os << "(" << *lazyExpr.m_transientExpression << ")"; else os << *lazyExpr.m_transientExpression; } else { os << "{** error - unchecked empty expression requested **}"; } return os; } AssertionHandler::AssertionHandler ( StringRef macroName, SourceLineInfo const& lineInfo, StringRef capturedExpression, ResultDisposition::Flags resultDisposition ) : m_assertionInfo{ macroName, lineInfo, capturedExpression, resultDisposition }, m_resultCapture( getResultCapture() ) {} void AssertionHandler::handleExpr( ITransientExpression const& expr ) { m_resultCapture.handleExpr( m_assertionInfo, expr, m_reaction ); } void AssertionHandler::handleMessage(ResultWas::OfType resultType, StringRef const& message) { m_resultCapture.handleMessage( m_assertionInfo, resultType, message, m_reaction ); } auto AssertionHandler::allowThrows() const -> bool { return getCurrentContext().getConfig()->allowThrows(); } void AssertionHandler::complete() { setCompleted(); if( m_reaction.shouldDebugBreak ) { // If you find your debugger stopping you here then go one level up on the // call-stack for the code that caused it (typically a failed assertion) // (To go back to the test and change execution, jump over the throw, next) CATCH_BREAK_INTO_DEBUGGER(); } if( m_reaction.shouldThrow ) throw Catch::TestFailureException(); } void AssertionHandler::setCompleted() { m_completed = true; } void AssertionHandler::handleUnexpectedInflightException() { m_resultCapture.handleUnexpectedInflightException( m_assertionInfo, Catch::translateActiveException(), m_reaction ); } void AssertionHandler::handleExceptionThrownAsExpected() { m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); } void AssertionHandler::handleExceptionNotThrownAsExpected() { m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); } void AssertionHandler::handleUnexpectedExceptionNotThrown() { m_resultCapture.handleUnexpectedExceptionNotThrown( m_assertionInfo, m_reaction ); } void AssertionHandler::handleThrowingCallSkipped() { m_resultCapture.handleNonExpr(m_assertionInfo, ResultWas::Ok, m_reaction); } // This is the overload that takes a string and infers the Equals matcher from it // The more general overload, that takes any string matcher, is in catch_capture_matchers.cpp void handleExceptionMatchExpr( AssertionHandler& handler, std::string const& str, StringRef matcherString ) { handleExceptionMatchExpr( handler, Matchers::Equals( str ), matcherString ); } } // namespace Catch // end catch_assertionhandler.cpp // start catch_assertionresult.cpp namespace Catch { AssertionResultData::AssertionResultData(ResultWas::OfType _resultType, LazyExpression const & _lazyExpression): lazyExpression(_lazyExpression), resultType(_resultType) {} std::string AssertionResultData::reconstructExpression() const { if( reconstructedExpression.empty() ) { if( lazyExpression ) { ReusableStringStream rss; rss << lazyExpression; reconstructedExpression = rss.str(); } } return reconstructedExpression; } AssertionResult::AssertionResult( AssertionInfo const& info, AssertionResultData const& data ) : m_info( info ), m_resultData( data ) {} // Result was a success bool AssertionResult::succeeded() const { return Catch::isOk( m_resultData.resultType ); } // Result was a success, or failure is suppressed bool AssertionResult::isOk() const { return Catch::isOk( m_resultData.resultType ) || shouldSuppressFailure( m_info.resultDisposition ); } ResultWas::OfType AssertionResult::getResultType() const { return m_resultData.resultType; } bool AssertionResult::hasExpression() const { return m_info.capturedExpression[0] != 0; } bool AssertionResult::hasMessage() const { return !m_resultData.message.empty(); } std::string AssertionResult::getExpression() const { if( isFalseTest( m_info.resultDisposition ) ) return "!(" + m_info.capturedExpression + ")"; else return m_info.capturedExpression; } std::string AssertionResult::getExpressionInMacro() const { std::string expr; if( m_info.macroName[0] == 0 ) expr = m_info.capturedExpression; else { expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 ); expr += m_info.macroName; expr += "( "; expr += m_info.capturedExpression; expr += " )"; } return expr; } bool AssertionResult::hasExpandedExpression() const { return hasExpression() && getExpandedExpression() != getExpression(); } std::string AssertionResult::getExpandedExpression() const { std::string expr = m_resultData.reconstructExpression(); return expr.empty() ? getExpression() : expr; } std::string AssertionResult::getMessage() const { return m_resultData.message; } SourceLineInfo AssertionResult::getSourceInfo() const { return m_info.lineInfo; } StringRef AssertionResult::getTestMacroName() const { return m_info.macroName; } } // end namespace Catch // end catch_assertionresult.cpp // start catch_benchmark.cpp namespace Catch { auto BenchmarkLooper::getResolution() -> uint64_t { return getEstimatedClockResolution() * getCurrentContext().getConfig()->benchmarkResolutionMultiple(); } void BenchmarkLooper::reportStart() { getResultCapture().benchmarkStarting( { m_name } ); } auto BenchmarkLooper::needsMoreIterations() -> bool { auto elapsed = m_timer.getElapsedNanoseconds(); // Exponentially increasing iterations until we're confident in our timer resolution if( elapsed < m_resolution ) { m_iterationsToRun *= 10; return true; } getResultCapture().benchmarkEnded( { { m_name }, m_count, elapsed } ); return false; } } // end namespace Catch // end catch_benchmark.cpp // start catch_capture_matchers.cpp namespace Catch { using StringMatcher = Matchers::Impl::MatcherBase; // This is the general overload that takes a any string matcher // There is another overload, in catch_assertionhandler.h/.cpp, that only takes a string and infers // the Equals matcher (so the header does not mention matchers) void handleExceptionMatchExpr( AssertionHandler& handler, StringMatcher const& matcher, StringRef matcherString ) { std::string exceptionMessage = Catch::translateActiveException(); MatchExpr expr( exceptionMessage, matcher, matcherString ); handler.handleExpr( expr ); } } // namespace Catch // end catch_capture_matchers.cpp // start catch_commandline.cpp // start catch_commandline.h // start catch_clara.h // Use Catch's value for console width (store Clara's off to the side, if present) #ifdef CLARA_CONFIG_CONSOLE_WIDTH #define CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH #undef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH #endif #define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CONFIG_CONSOLE_WIDTH-1 #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wweak-vtables" #pragma clang diagnostic ignored "-Wexit-time-destructors" #pragma clang diagnostic ignored "-Wshadow" #endif // start clara.hpp // Copyright 2017 Two Blue Cubes Ltd. All rights reserved. // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // See https://github.com/philsquared/Clara for more details // Clara v1.1.4 #ifndef CATCH_CLARA_CONFIG_CONSOLE_WIDTH #define CATCH_CLARA_CONFIG_CONSOLE_WIDTH 80 #endif #ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH #define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_CLARA_CONFIG_CONSOLE_WIDTH #endif #ifndef CLARA_CONFIG_OPTIONAL_TYPE #ifdef __has_include #if __has_include() && __cplusplus >= 201703L #include #define CLARA_CONFIG_OPTIONAL_TYPE std::optional #endif #endif #endif // ----------- #included from clara_textflow.hpp ----------- // TextFlowCpp // // A single-header library for wrapping and laying out basic text, by Phil Nash // // This work is licensed under the BSD 2-Clause license. // See the accompanying LICENSE file, or the one at https://opensource.org/licenses/BSD-2-Clause // // This project is hosted at https://github.com/philsquared/textflowcpp #include #include #include #include #ifndef CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH #define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH 80 #endif namespace Catch { namespace clara { namespace TextFlow { inline auto isWhitespace( char c ) -> bool { static std::string chars = " \t\n\r"; return chars.find( c ) != std::string::npos; } inline auto isBreakableBefore( char c ) -> bool { static std::string chars = "[({<|"; return chars.find( c ) != std::string::npos; } inline auto isBreakableAfter( char c ) -> bool { static std::string chars = "])}>.,:;*+-=&/\\"; return chars.find( c ) != std::string::npos; } class Columns; class Column { std::vector m_strings; size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH; size_t m_indent = 0; size_t m_initialIndent = std::string::npos; public: class iterator { friend Column; Column const& m_column; size_t m_stringIndex = 0; size_t m_pos = 0; size_t m_len = 0; size_t m_end = 0; bool m_suffix = false; iterator( Column const& column, size_t stringIndex ) : m_column( column ), m_stringIndex( stringIndex ) {} auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; } auto isBoundary( size_t at ) const -> bool { assert( at > 0 ); assert( at <= line().size() ); return at == line().size() || ( isWhitespace( line()[at] ) && !isWhitespace( line()[at-1] ) ) || isBreakableBefore( line()[at] ) || isBreakableAfter( line()[at-1] ); } void calcLength() { assert( m_stringIndex < m_column.m_strings.size() ); m_suffix = false; auto width = m_column.m_width-indent(); m_end = m_pos; while( m_end < line().size() && line()[m_end] != '\n' ) ++m_end; if( m_end < m_pos + width ) { m_len = m_end - m_pos; } else { size_t len = width; while (len > 0 && !isBoundary(m_pos + len)) --len; while (len > 0 && isWhitespace( line()[m_pos + len - 1] )) --len; if (len > 0) { m_len = len; } else { m_suffix = true; m_len = width - 1; } } } auto indent() const -> size_t { auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos; return initial == std::string::npos ? m_column.m_indent : initial; } auto addIndentAndSuffix(std::string const &plain) const -> std::string { return std::string( indent(), ' ' ) + (m_suffix ? plain + "-" : plain); } public: explicit iterator( Column const& column ) : m_column( column ) { assert( m_column.m_width > m_column.m_indent ); assert( m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent ); calcLength(); if( m_len == 0 ) m_stringIndex++; // Empty string } auto operator *() const -> std::string { assert( m_stringIndex < m_column.m_strings.size() ); assert( m_pos <= m_end ); if( m_pos + m_column.m_width < m_end ) return addIndentAndSuffix(line().substr(m_pos, m_len)); else return addIndentAndSuffix(line().substr(m_pos, m_end - m_pos)); } auto operator ++() -> iterator& { m_pos += m_len; if( m_pos < line().size() && line()[m_pos] == '\n' ) m_pos += 1; else while( m_pos < line().size() && isWhitespace( line()[m_pos] ) ) ++m_pos; if( m_pos == line().size() ) { m_pos = 0; ++m_stringIndex; } if( m_stringIndex < m_column.m_strings.size() ) calcLength(); return *this; } auto operator ++(int) -> iterator { iterator prev( *this ); operator++(); return prev; } auto operator ==( iterator const& other ) const -> bool { return m_pos == other.m_pos && m_stringIndex == other.m_stringIndex && &m_column == &other.m_column; } auto operator !=( iterator const& other ) const -> bool { return !operator==( other ); } }; using const_iterator = iterator; explicit Column( std::string const& text ) { m_strings.push_back( text ); } auto width( size_t newWidth ) -> Column& { assert( newWidth > 0 ); m_width = newWidth; return *this; } auto indent( size_t newIndent ) -> Column& { m_indent = newIndent; return *this; } auto initialIndent( size_t newIndent ) -> Column& { m_initialIndent = newIndent; return *this; } auto width() const -> size_t { return m_width; } auto begin() const -> iterator { return iterator( *this ); } auto end() const -> iterator { return { *this, m_strings.size() }; } inline friend std::ostream& operator << ( std::ostream& os, Column const& col ) { bool first = true; for( auto line : col ) { if( first ) first = false; else os << "\n"; os << line; } return os; } auto operator + ( Column const& other ) -> Columns; auto toString() const -> std::string { std::ostringstream oss; oss << *this; return oss.str(); } }; class Spacer : public Column { public: explicit Spacer( size_t spaceWidth ) : Column( "" ) { width( spaceWidth ); } }; class Columns { std::vector m_columns; public: class iterator { friend Columns; struct EndTag {}; std::vector const& m_columns; std::vector m_iterators; size_t m_activeIterators; iterator( Columns const& columns, EndTag ) : m_columns( columns.m_columns ), m_activeIterators( 0 ) { m_iterators.reserve( m_columns.size() ); for( auto const& col : m_columns ) m_iterators.push_back( col.end() ); } public: explicit iterator( Columns const& columns ) : m_columns( columns.m_columns ), m_activeIterators( m_columns.size() ) { m_iterators.reserve( m_columns.size() ); for( auto const& col : m_columns ) m_iterators.push_back( col.begin() ); } auto operator ==( iterator const& other ) const -> bool { return m_iterators == other.m_iterators; } auto operator !=( iterator const& other ) const -> bool { return m_iterators != other.m_iterators; } auto operator *() const -> std::string { std::string row, padding; for( size_t i = 0; i < m_columns.size(); ++i ) { auto width = m_columns[i].width(); if( m_iterators[i] != m_columns[i].end() ) { std::string col = *m_iterators[i]; row += padding + col; if( col.size() < width ) padding = std::string( width - col.size(), ' ' ); else padding = ""; } else { padding += std::string( width, ' ' ); } } return row; } auto operator ++() -> iterator& { for( size_t i = 0; i < m_columns.size(); ++i ) { if (m_iterators[i] != m_columns[i].end()) ++m_iterators[i]; } return *this; } auto operator ++(int) -> iterator { iterator prev( *this ); operator++(); return prev; } }; using const_iterator = iterator; auto begin() const -> iterator { return iterator( *this ); } auto end() const -> iterator { return { *this, iterator::EndTag() }; } auto operator += ( Column const& col ) -> Columns& { m_columns.push_back( col ); return *this; } auto operator + ( Column const& col ) -> Columns { Columns combined = *this; combined += col; return combined; } inline friend std::ostream& operator << ( std::ostream& os, Columns const& cols ) { bool first = true; for( auto line : cols ) { if( first ) first = false; else os << "\n"; os << line; } return os; } auto toString() const -> std::string { std::ostringstream oss; oss << *this; return oss.str(); } }; inline auto Column::operator + ( Column const& other ) -> Columns { Columns cols; cols += *this; cols += other; return cols; } }}} // namespace Catch::clara::TextFlow // ----------- end of #include from clara_textflow.hpp ----------- // ........... back in clara.hpp #include #include #include #if !defined(CATCH_PLATFORM_WINDOWS) && ( defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) ) #define CATCH_PLATFORM_WINDOWS #endif namespace Catch { namespace clara { namespace detail { // Traits for extracting arg and return type of lambdas (for single argument lambdas) template struct UnaryLambdaTraits : UnaryLambdaTraits {}; template struct UnaryLambdaTraits { static const bool isValid = false; }; template struct UnaryLambdaTraits { static const bool isValid = true; using ArgType = typename std::remove_const::type>::type; using ReturnType = ReturnT; }; class TokenStream; // Transport for raw args (copied from main args, or supplied via init list for testing) class Args { friend TokenStream; std::string m_exeName; std::vector m_args; public: Args( int argc, char const* const* argv ) : m_exeName(argv[0]), m_args(argv + 1, argv + argc) {} Args( std::initializer_list args ) : m_exeName( *args.begin() ), m_args( args.begin()+1, args.end() ) {} auto exeName() const -> std::string { return m_exeName; } }; // Wraps a token coming from a token stream. These may not directly correspond to strings as a single string // may encode an option + its argument if the : or = form is used enum class TokenType { Option, Argument }; struct Token { TokenType type; std::string token; }; inline auto isOptPrefix( char c ) -> bool { return c == '-' #ifdef CATCH_PLATFORM_WINDOWS || c == '/' #endif ; } // Abstracts iterators into args as a stream of tokens, with option arguments uniformly handled class TokenStream { using Iterator = std::vector::const_iterator; Iterator it; Iterator itEnd; std::vector m_tokenBuffer; void loadBuffer() { m_tokenBuffer.resize( 0 ); // Skip any empty strings while( it != itEnd && it->empty() ) ++it; if( it != itEnd ) { auto const &next = *it; if( isOptPrefix( next[0] ) ) { auto delimiterPos = next.find_first_of( " :=" ); if( delimiterPos != std::string::npos ) { m_tokenBuffer.push_back( { TokenType::Option, next.substr( 0, delimiterPos ) } ); m_tokenBuffer.push_back( { TokenType::Argument, next.substr( delimiterPos + 1 ) } ); } else { if( next[1] != '-' && next.size() > 2 ) { std::string opt = "- "; for( size_t i = 1; i < next.size(); ++i ) { opt[1] = next[i]; m_tokenBuffer.push_back( { TokenType::Option, opt } ); } } else { m_tokenBuffer.push_back( { TokenType::Option, next } ); } } } else { m_tokenBuffer.push_back( { TokenType::Argument, next } ); } } } public: explicit TokenStream( Args const &args ) : TokenStream( args.m_args.begin(), args.m_args.end() ) {} TokenStream( Iterator it, Iterator itEnd ) : it( it ), itEnd( itEnd ) { loadBuffer(); } explicit operator bool() const { return !m_tokenBuffer.empty() || it != itEnd; } auto count() const -> size_t { return m_tokenBuffer.size() + (itEnd - it); } auto operator*() const -> Token { assert( !m_tokenBuffer.empty() ); return m_tokenBuffer.front(); } auto operator->() const -> Token const * { assert( !m_tokenBuffer.empty() ); return &m_tokenBuffer.front(); } auto operator++() -> TokenStream & { if( m_tokenBuffer.size() >= 2 ) { m_tokenBuffer.erase( m_tokenBuffer.begin() ); } else { if( it != itEnd ) ++it; loadBuffer(); } return *this; } }; class ResultBase { public: enum Type { Ok, LogicError, RuntimeError }; protected: ResultBase( Type type ) : m_type( type ) {} virtual ~ResultBase() = default; virtual void enforceOk() const = 0; Type m_type; }; template class ResultValueBase : public ResultBase { public: auto value() const -> T const & { enforceOk(); return m_value; } protected: ResultValueBase( Type type ) : ResultBase( type ) {} ResultValueBase( ResultValueBase const &other ) : ResultBase( other ) { if( m_type == ResultBase::Ok ) new( &m_value ) T( other.m_value ); } ResultValueBase( Type, T const &value ) : ResultBase( Ok ) { new( &m_value ) T( value ); } auto operator=( ResultValueBase const &other ) -> ResultValueBase & { if( m_type == ResultBase::Ok ) m_value.~T(); ResultBase::operator=(other); if( m_type == ResultBase::Ok ) new( &m_value ) T( other.m_value ); return *this; } ~ResultValueBase() override { if( m_type == Ok ) m_value.~T(); } union { T m_value; }; }; template<> class ResultValueBase : public ResultBase { protected: using ResultBase::ResultBase; }; template class BasicResult : public ResultValueBase { public: template explicit BasicResult( BasicResult const &other ) : ResultValueBase( other.type() ), m_errorMessage( other.errorMessage() ) { assert( type() != ResultBase::Ok ); } template static auto ok( U const &value ) -> BasicResult { return { ResultBase::Ok, value }; } static auto ok() -> BasicResult { return { ResultBase::Ok }; } static auto logicError( std::string const &message ) -> BasicResult { return { ResultBase::LogicError, message }; } static auto runtimeError( std::string const &message ) -> BasicResult { return { ResultBase::RuntimeError, message }; } explicit operator bool() const { return m_type == ResultBase::Ok; } auto type() const -> ResultBase::Type { return m_type; } auto errorMessage() const -> std::string { return m_errorMessage; } protected: void enforceOk() const override { // Errors shouldn't reach this point, but if they do // the actual error message will be in m_errorMessage assert( m_type != ResultBase::LogicError ); assert( m_type != ResultBase::RuntimeError ); if( m_type != ResultBase::Ok ) std::abort(); } std::string m_errorMessage; // Only populated if resultType is an error BasicResult( ResultBase::Type type, std::string const &message ) : ResultValueBase(type), m_errorMessage(message) { assert( m_type != ResultBase::Ok ); } using ResultValueBase::ResultValueBase; using ResultBase::m_type; }; enum class ParseResultType { Matched, NoMatch, ShortCircuitAll, ShortCircuitSame }; class ParseState { public: ParseState( ParseResultType type, TokenStream const &remainingTokens ) : m_type(type), m_remainingTokens( remainingTokens ) {} auto type() const -> ParseResultType { return m_type; } auto remainingTokens() const -> TokenStream { return m_remainingTokens; } private: ParseResultType m_type; TokenStream m_remainingTokens; }; using Result = BasicResult; using ParserResult = BasicResult; using InternalParseResult = BasicResult; struct HelpColumns { std::string left; std::string right; }; template inline auto convertInto( std::string const &source, T& target ) -> ParserResult { std::stringstream ss; ss << source; ss >> target; if( ss.fail() ) return ParserResult::runtimeError( "Unable to convert '" + source + "' to destination type" ); else return ParserResult::ok( ParseResultType::Matched ); } inline auto convertInto( std::string const &source, std::string& target ) -> ParserResult { target = source; return ParserResult::ok( ParseResultType::Matched ); } inline auto convertInto( std::string const &source, bool &target ) -> ParserResult { std::string srcLC = source; std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( char c ) { return static_cast( ::tolower(c) ); } ); if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on") target = true; else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off") target = false; else return ParserResult::runtimeError( "Expected a boolean value but did not recognise: '" + source + "'" ); return ParserResult::ok( ParseResultType::Matched ); } #ifdef CLARA_CONFIG_OPTIONAL_TYPE template inline auto convertInto( std::string const &source, CLARA_CONFIG_OPTIONAL_TYPE& target ) -> ParserResult { T temp; auto result = convertInto( source, temp ); if( result ) target = std::move(temp); return result; } #endif // CLARA_CONFIG_OPTIONAL_TYPE struct NonCopyable { NonCopyable() = default; NonCopyable( NonCopyable const & ) = delete; NonCopyable( NonCopyable && ) = delete; NonCopyable &operator=( NonCopyable const & ) = delete; NonCopyable &operator=( NonCopyable && ) = delete; }; struct BoundRef : NonCopyable { virtual ~BoundRef() = default; virtual auto isContainer() const -> bool { return false; } virtual auto isFlag() const -> bool { return false; } }; struct BoundValueRefBase : BoundRef { virtual auto setValue( std::string const &arg ) -> ParserResult = 0; }; struct BoundFlagRefBase : BoundRef { virtual auto setFlag( bool flag ) -> ParserResult = 0; virtual auto isFlag() const -> bool { return true; } }; template struct BoundValueRef : BoundValueRefBase { T &m_ref; explicit BoundValueRef( T &ref ) : m_ref( ref ) {} auto setValue( std::string const &arg ) -> ParserResult override { return convertInto( arg, m_ref ); } }; template struct BoundValueRef> : BoundValueRefBase { std::vector &m_ref; explicit BoundValueRef( std::vector &ref ) : m_ref( ref ) {} auto isContainer() const -> bool override { return true; } auto setValue( std::string const &arg ) -> ParserResult override { T temp; auto result = convertInto( arg, temp ); if( result ) m_ref.push_back( temp ); return result; } }; struct BoundFlagRef : BoundFlagRefBase { bool &m_ref; explicit BoundFlagRef( bool &ref ) : m_ref( ref ) {} auto setFlag( bool flag ) -> ParserResult override { m_ref = flag; return ParserResult::ok( ParseResultType::Matched ); } }; template struct LambdaInvoker { static_assert( std::is_same::value, "Lambda must return void or clara::ParserResult" ); template static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { return lambda( arg ); } }; template<> struct LambdaInvoker { template static auto invoke( L const &lambda, ArgType const &arg ) -> ParserResult { lambda( arg ); return ParserResult::ok( ParseResultType::Matched ); } }; template inline auto invokeLambda( L const &lambda, std::string const &arg ) -> ParserResult { ArgType temp{}; auto result = convertInto( arg, temp ); return !result ? result : LambdaInvoker::ReturnType>::invoke( lambda, temp ); } template struct BoundLambda : BoundValueRefBase { L m_lambda; static_assert( UnaryLambdaTraits::isValid, "Supplied lambda must take exactly one argument" ); explicit BoundLambda( L const &lambda ) : m_lambda( lambda ) {} auto setValue( std::string const &arg ) -> ParserResult override { return invokeLambda::ArgType>( m_lambda, arg ); } }; template struct BoundFlagLambda : BoundFlagRefBase { L m_lambda; static_assert( UnaryLambdaTraits::isValid, "Supplied lambda must take exactly one argument" ); static_assert( std::is_same::ArgType, bool>::value, "flags must be boolean" ); explicit BoundFlagLambda( L const &lambda ) : m_lambda( lambda ) {} auto setFlag( bool flag ) -> ParserResult override { return LambdaInvoker::ReturnType>::invoke( m_lambda, flag ); } }; enum class Optionality { Optional, Required }; struct Parser; class ParserBase { public: virtual ~ParserBase() = default; virtual auto validate() const -> Result { return Result::ok(); } virtual auto parse( std::string const& exeName, TokenStream const &tokens) const -> InternalParseResult = 0; virtual auto cardinality() const -> size_t { return 1; } auto parse( Args const &args ) const -> InternalParseResult { return parse( args.exeName(), TokenStream( args ) ); } }; template class ComposableParserImpl : public ParserBase { public: template auto operator|( T const &other ) const -> Parser; template auto operator+( T const &other ) const -> Parser; }; // Common code and state for Args and Opts template class ParserRefImpl : public ComposableParserImpl { protected: Optionality m_optionality = Optionality::Optional; std::shared_ptr m_ref; std::string m_hint; std::string m_description; explicit ParserRefImpl( std::shared_ptr const &ref ) : m_ref( ref ) {} public: template ParserRefImpl( T &ref, std::string const &hint ) : m_ref( std::make_shared>( ref ) ), m_hint( hint ) {} template ParserRefImpl( LambdaT const &ref, std::string const &hint ) : m_ref( std::make_shared>( ref ) ), m_hint(hint) {} auto operator()( std::string const &description ) -> DerivedT & { m_description = description; return static_cast( *this ); } auto optional() -> DerivedT & { m_optionality = Optionality::Optional; return static_cast( *this ); }; auto required() -> DerivedT & { m_optionality = Optionality::Required; return static_cast( *this ); }; auto isOptional() const -> bool { return m_optionality == Optionality::Optional; } auto cardinality() const -> size_t override { if( m_ref->isContainer() ) return 0; else return 1; } auto hint() const -> std::string { return m_hint; } }; class ExeName : public ComposableParserImpl { std::shared_ptr m_name; std::shared_ptr m_ref; template static auto makeRef(LambdaT const &lambda) -> std::shared_ptr { return std::make_shared>( lambda) ; } public: ExeName() : m_name( std::make_shared( "" ) ) {} explicit ExeName( std::string &ref ) : ExeName() { m_ref = std::make_shared>( ref ); } template explicit ExeName( LambdaT const& lambda ) : ExeName() { m_ref = std::make_shared>( lambda ); } // The exe name is not parsed out of the normal tokens, but is handled specially auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); } auto name() const -> std::string { return *m_name; } auto set( std::string const& newName ) -> ParserResult { auto lastSlash = newName.find_last_of( "\\/" ); auto filename = ( lastSlash == std::string::npos ) ? newName : newName.substr( lastSlash+1 ); *m_name = filename; if( m_ref ) return m_ref->setValue( filename ); else return ParserResult::ok( ParseResultType::Matched ); } }; class Arg : public ParserRefImpl { public: using ParserRefImpl::ParserRefImpl; auto parse( std::string const &, TokenStream const &tokens ) const -> InternalParseResult override { auto validationResult = validate(); if( !validationResult ) return InternalParseResult( validationResult ); auto remainingTokens = tokens; auto const &token = *remainingTokens; if( token.type != TokenType::Argument ) return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); assert( !m_ref->isFlag() ); auto valueRef = static_cast( m_ref.get() ); auto result = valueRef->setValue( remainingTokens->token ); if( !result ) return InternalParseResult( result ); else return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); } }; inline auto normaliseOpt( std::string const &optName ) -> std::string { #ifdef CATCH_PLATFORM_WINDOWS if( optName[0] == '/' ) return "-" + optName.substr( 1 ); else #endif return optName; } class Opt : public ParserRefImpl { protected: std::vector m_optNames; public: template explicit Opt( LambdaT const &ref ) : ParserRefImpl( std::make_shared>( ref ) ) {} explicit Opt( bool &ref ) : ParserRefImpl( std::make_shared( ref ) ) {} template Opt( LambdaT const &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} template Opt( T &ref, std::string const &hint ) : ParserRefImpl( ref, hint ) {} auto operator[]( std::string const &optName ) -> Opt & { m_optNames.push_back( optName ); return *this; } auto getHelpColumns() const -> std::vector { std::ostringstream oss; bool first = true; for( auto const &opt : m_optNames ) { if (first) first = false; else oss << ", "; oss << opt; } if( !m_hint.empty() ) oss << " <" << m_hint << ">"; return { { oss.str(), m_description } }; } auto isMatch( std::string const &optToken ) const -> bool { auto normalisedToken = normaliseOpt( optToken ); for( auto const &name : m_optNames ) { if( normaliseOpt( name ) == normalisedToken ) return true; } return false; } using ParserBase::parse; auto parse( std::string const&, TokenStream const &tokens ) const -> InternalParseResult override { auto validationResult = validate(); if( !validationResult ) return InternalParseResult( validationResult ); auto remainingTokens = tokens; if( remainingTokens && remainingTokens->type == TokenType::Option ) { auto const &token = *remainingTokens; if( isMatch(token.token ) ) { if( m_ref->isFlag() ) { auto flagRef = static_cast( m_ref.get() ); auto result = flagRef->setFlag( true ); if( !result ) return InternalParseResult( result ); if( result.value() == ParseResultType::ShortCircuitAll ) return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); } else { auto valueRef = static_cast( m_ref.get() ); ++remainingTokens; if( !remainingTokens ) return InternalParseResult::runtimeError( "Expected argument following " + token.token ); auto const &argToken = *remainingTokens; if( argToken.type != TokenType::Argument ) return InternalParseResult::runtimeError( "Expected argument following " + token.token ); auto result = valueRef->setValue( argToken.token ); if( !result ) return InternalParseResult( result ); if( result.value() == ParseResultType::ShortCircuitAll ) return InternalParseResult::ok( ParseState( result.value(), remainingTokens ) ); } return InternalParseResult::ok( ParseState( ParseResultType::Matched, ++remainingTokens ) ); } } return InternalParseResult::ok( ParseState( ParseResultType::NoMatch, remainingTokens ) ); } auto validate() const -> Result override { if( m_optNames.empty() ) return Result::logicError( "No options supplied to Opt" ); for( auto const &name : m_optNames ) { if( name.empty() ) return Result::logicError( "Option name cannot be empty" ); #ifdef CATCH_PLATFORM_WINDOWS if( name[0] != '-' && name[0] != '/' ) return Result::logicError( "Option name must begin with '-' or '/'" ); #else if( name[0] != '-' ) return Result::logicError( "Option name must begin with '-'" ); #endif } return ParserRefImpl::validate(); } }; struct Help : Opt { Help( bool &showHelpFlag ) : Opt([&]( bool flag ) { showHelpFlag = flag; return ParserResult::ok( ParseResultType::ShortCircuitAll ); }) { static_cast( *this ) ("display usage information") ["-?"]["-h"]["--help"] .optional(); } }; struct Parser : ParserBase { mutable ExeName m_exeName; std::vector m_options; std::vector m_args; auto operator|=( ExeName const &exeName ) -> Parser & { m_exeName = exeName; return *this; } auto operator|=( Arg const &arg ) -> Parser & { m_args.push_back(arg); return *this; } auto operator|=( Opt const &opt ) -> Parser & { m_options.push_back(opt); return *this; } auto operator|=( Parser const &other ) -> Parser & { m_options.insert(m_options.end(), other.m_options.begin(), other.m_options.end()); m_args.insert(m_args.end(), other.m_args.begin(), other.m_args.end()); return *this; } template auto operator|( T const &other ) const -> Parser { return Parser( *this ) |= other; } // Forward deprecated interface with '+' instead of '|' template auto operator+=( T const &other ) -> Parser & { return operator|=( other ); } template auto operator+( T const &other ) const -> Parser { return operator|( other ); } auto getHelpColumns() const -> std::vector { std::vector cols; for (auto const &o : m_options) { auto childCols = o.getHelpColumns(); cols.insert( cols.end(), childCols.begin(), childCols.end() ); } return cols; } void writeToStream( std::ostream &os ) const { if (!m_exeName.name().empty()) { os << "usage:\n" << " " << m_exeName.name() << " "; bool required = true, first = true; for( auto const &arg : m_args ) { if (first) first = false; else os << " "; if( arg.isOptional() && required ) { os << "["; required = false; } os << "<" << arg.hint() << ">"; if( arg.cardinality() == 0 ) os << " ... "; } if( !required ) os << "]"; if( !m_options.empty() ) os << " options"; os << "\n\nwhere options are:" << std::endl; } auto rows = getHelpColumns(); size_t consoleWidth = CATCH_CLARA_CONFIG_CONSOLE_WIDTH; size_t optWidth = 0; for( auto const &cols : rows ) optWidth = (std::max)(optWidth, cols.left.size() + 2); optWidth = (std::min)(optWidth, consoleWidth/2); for( auto const &cols : rows ) { auto row = TextFlow::Column( cols.left ).width( optWidth ).indent( 2 ) + TextFlow::Spacer(4) + TextFlow::Column( cols.right ).width( consoleWidth - 7 - optWidth ); os << row << std::endl; } } friend auto operator<<( std::ostream &os, Parser const &parser ) -> std::ostream& { parser.writeToStream( os ); return os; } auto validate() const -> Result override { for( auto const &opt : m_options ) { auto result = opt.validate(); if( !result ) return result; } for( auto const &arg : m_args ) { auto result = arg.validate(); if( !result ) return result; } return Result::ok(); } using ParserBase::parse; auto parse( std::string const& exeName, TokenStream const &tokens ) const -> InternalParseResult override { struct ParserInfo { ParserBase const* parser = nullptr; size_t count = 0; }; const size_t totalParsers = m_options.size() + m_args.size(); assert( totalParsers < 512 ); // ParserInfo parseInfos[totalParsers]; // <-- this is what we really want to do ParserInfo parseInfos[512]; { size_t i = 0; for (auto const &opt : m_options) parseInfos[i++].parser = &opt; for (auto const &arg : m_args) parseInfos[i++].parser = &arg; } m_exeName.set( exeName ); auto result = InternalParseResult::ok( ParseState( ParseResultType::NoMatch, tokens ) ); while( result.value().remainingTokens() ) { bool tokenParsed = false; for( size_t i = 0; i < totalParsers; ++i ) { auto& parseInfo = parseInfos[i]; if( parseInfo.parser->cardinality() == 0 || parseInfo.count < parseInfo.parser->cardinality() ) { result = parseInfo.parser->parse(exeName, result.value().remainingTokens()); if (!result) return result; if (result.value().type() != ParseResultType::NoMatch) { tokenParsed = true; ++parseInfo.count; break; } } } if( result.value().type() == ParseResultType::ShortCircuitAll ) return result; if( !tokenParsed ) return InternalParseResult::runtimeError( "Unrecognised token: " + result.value().remainingTokens()->token ); } // !TBD Check missing required options return result; } }; template template auto ComposableParserImpl::operator|( T const &other ) const -> Parser { return Parser() | static_cast( *this ) | other; } } // namespace detail // A Combined parser using detail::Parser; // A parser for options using detail::Opt; // A parser for arguments using detail::Arg; // Wrapper for argc, argv from main() using detail::Args; // Specifies the name of the executable using detail::ExeName; // Convenience wrapper for option parser that specifies the help option using detail::Help; // enum of result types from a parse using detail::ParseResultType; // Result type for parser operation using detail::ParserResult; }} // namespace Catch::clara // end clara.hpp #ifdef __clang__ #pragma clang diagnostic pop #endif // Restore Clara's value for console width, if present #ifdef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH #define CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH #undef CATCH_TEMP_CLARA_CONFIG_CONSOLE_WIDTH #endif // end catch_clara.h namespace Catch { clara::Parser makeCommandLineParser( ConfigData& config ); } // end namespace Catch // end catch_commandline.h #include #include namespace Catch { clara::Parser makeCommandLineParser( ConfigData& config ) { using namespace clara; auto const setWarning = [&]( std::string const& warning ) { auto warningSet = [&]() { if( warning == "NoAssertions" ) return WarnAbout::NoAssertions; if ( warning == "NoTests" ) return WarnAbout::NoTests; return WarnAbout::Nothing; }(); if (warningSet == WarnAbout::Nothing) return ParserResult::runtimeError( "Unrecognised warning: '" + warning + "'" ); config.warnings = static_cast( config.warnings | warningSet ); return ParserResult::ok( ParseResultType::Matched ); }; auto const loadTestNamesFromFile = [&]( std::string const& filename ) { std::ifstream f( filename.c_str() ); if( !f.is_open() ) return ParserResult::runtimeError( "Unable to load input file: '" + filename + "'" ); std::string line; while( std::getline( f, line ) ) { line = trim(line); if( !line.empty() && !startsWith( line, '#' ) ) { if( !startsWith( line, '"' ) ) line = '"' + line + '"'; config.testsOrTags.push_back( line + ',' ); } } return ParserResult::ok( ParseResultType::Matched ); }; auto const setTestOrder = [&]( std::string const& order ) { if( startsWith( "declared", order ) ) config.runOrder = RunTests::InDeclarationOrder; else if( startsWith( "lexical", order ) ) config.runOrder = RunTests::InLexicographicalOrder; else if( startsWith( "random", order ) ) config.runOrder = RunTests::InRandomOrder; else return clara::ParserResult::runtimeError( "Unrecognised ordering: '" + order + "'" ); return ParserResult::ok( ParseResultType::Matched ); }; auto const setRngSeed = [&]( std::string const& seed ) { if( seed != "time" ) return clara::detail::convertInto( seed, config.rngSeed ); config.rngSeed = static_cast( std::time(nullptr) ); return ParserResult::ok( ParseResultType::Matched ); }; auto const setColourUsage = [&]( std::string const& useColour ) { auto mode = toLower( useColour ); if( mode == "yes" ) config.useColour = UseColour::Yes; else if( mode == "no" ) config.useColour = UseColour::No; else if( mode == "auto" ) config.useColour = UseColour::Auto; else return ParserResult::runtimeError( "colour mode must be one of: auto, yes or no. '" + useColour + "' not recognised" ); return ParserResult::ok( ParseResultType::Matched ); }; auto const setWaitForKeypress = [&]( std::string const& keypress ) { auto keypressLc = toLower( keypress ); if( keypressLc == "start" ) config.waitForKeypress = WaitForKeypress::BeforeStart; else if( keypressLc == "exit" ) config.waitForKeypress = WaitForKeypress::BeforeExit; else if( keypressLc == "both" ) config.waitForKeypress = WaitForKeypress::BeforeStartAndExit; else return ParserResult::runtimeError( "keypress argument must be one of: start, exit or both. '" + keypress + "' not recognised" ); return ParserResult::ok( ParseResultType::Matched ); }; auto const setVerbosity = [&]( std::string const& verbosity ) { auto lcVerbosity = toLower( verbosity ); if( lcVerbosity == "quiet" ) config.verbosity = Verbosity::Quiet; else if( lcVerbosity == "normal" ) config.verbosity = Verbosity::Normal; else if( lcVerbosity == "high" ) config.verbosity = Verbosity::High; else return ParserResult::runtimeError( "Unrecognised verbosity, '" + verbosity + "'" ); return ParserResult::ok( ParseResultType::Matched ); }; auto cli = ExeName( config.processName ) | Help( config.showHelp ) | Opt( config.listTests ) ["-l"]["--list-tests"] ( "list all/matching test cases" ) | Opt( config.listTags ) ["-t"]["--list-tags"] ( "list all/matching tags" ) | Opt( config.showSuccessfulTests ) ["-s"]["--success"] ( "include successful tests in output" ) | Opt( config.shouldDebugBreak ) ["-b"]["--break"] ( "break into debugger on failure" ) | Opt( config.noThrow ) ["-e"]["--nothrow"] ( "skip exception tests" ) | Opt( config.showInvisibles ) ["-i"]["--invisibles"] ( "show invisibles (tabs, newlines)" ) | Opt( config.outputFilename, "filename" ) ["-o"]["--out"] ( "output filename" ) | Opt( config.reporterName, "name" ) ["-r"]["--reporter"] ( "reporter to use (defaults to console)" ) | Opt( config.name, "name" ) ["-n"]["--name"] ( "suite name" ) | Opt( [&]( bool ){ config.abortAfter = 1; } ) ["-a"]["--abort"] ( "abort at first failure" ) | Opt( [&]( int x ){ config.abortAfter = x; }, "no. failures" ) ["-x"]["--abortx"] ( "abort after x failures" ) | Opt( setWarning, "warning name" ) ["-w"]["--warn"] ( "enable warnings" ) | Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" ) ["-d"]["--durations"] ( "show test durations" ) | Opt( loadTestNamesFromFile, "filename" ) ["-f"]["--input-file"] ( "load test names to run from a file" ) | Opt( config.filenamesAsTags ) ["-#"]["--filenames-as-tags"] ( "adds a tag for the filename" ) | Opt( config.sectionsToRun, "section name" ) ["-c"]["--section"] ( "specify section to run" ) | Opt( setVerbosity, "quiet|normal|high" ) ["-v"]["--verbosity"] ( "set output verbosity" ) | Opt( config.listTestNamesOnly ) ["--list-test-names-only"] ( "list all/matching test cases names only" ) | Opt( config.listReporters ) ["--list-reporters"] ( "list all reporters" ) | Opt( setTestOrder, "decl|lex|rand" ) ["--order"] ( "test case order (defaults to decl)" ) | Opt( setRngSeed, "'time'|number" ) ["--rng-seed"] ( "set a specific seed for random numbers" ) | Opt( setColourUsage, "yes|no" ) ["--use-colour"] ( "should output be colourised" ) | Opt( config.libIdentify ) ["--libidentify"] ( "report name and version according to libidentify standard" ) | Opt( setWaitForKeypress, "start|exit|both" ) ["--wait-for-keypress"] ( "waits for a keypress before exiting" ) | Opt( config.benchmarkResolutionMultiple, "multiplier" ) ["--benchmark-resolution-multiple"] ( "multiple of clock resolution to run benchmarks" ) | Arg( config.testsOrTags, "test name|pattern|tags" ) ( "which test or tests to use" ); return cli; } } // end namespace Catch // end catch_commandline.cpp // start catch_common.cpp #include #include namespace Catch { bool SourceLineInfo::empty() const noexcept { return file[0] == '\0'; } bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept { return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0); } bool SourceLineInfo::operator < ( SourceLineInfo const& other ) const noexcept { return line < other.line || ( line == other.line && (std::strcmp(file, other.file) < 0)); } std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ) { #ifndef __GNUG__ os << info.file << '(' << info.line << ')'; #else os << info.file << ':' << info.line; #endif return os; } std::string StreamEndStop::operator+() const { return std::string(); } NonCopyable::NonCopyable() = default; NonCopyable::~NonCopyable() = default; } // end catch_common.cpp // start catch_config.cpp // start catch_enforce.h #include #define CATCH_PREPARE_EXCEPTION( type, msg ) \ type( ( Catch::ReusableStringStream() << msg ).str() ) #define CATCH_INTERNAL_ERROR( msg ) \ throw CATCH_PREPARE_EXCEPTION( std::logic_error, CATCH_INTERNAL_LINEINFO << ": Internal Catch error: " << msg); #define CATCH_ERROR( msg ) \ throw CATCH_PREPARE_EXCEPTION( std::domain_error, msg ) #define CATCH_ENFORCE( condition, msg ) \ do{ if( !(condition) ) CATCH_ERROR( msg ); } while(false) // end catch_enforce.h namespace Catch { Config::Config( ConfigData const& data ) : m_data( data ), m_stream( openStream() ) { TestSpecParser parser(ITagAliasRegistry::get()); if (data.testsOrTags.empty()) { parser.parse("~[.]"); // All not hidden tests } else { m_hasTestFilters = true; for( auto const& testOrTags : data.testsOrTags ) parser.parse( testOrTags ); } m_testSpec = parser.testSpec(); } std::string const& Config::getFilename() const { return m_data.outputFilename ; } bool Config::listTests() const { return m_data.listTests; } bool Config::listTestNamesOnly() const { return m_data.listTestNamesOnly; } bool Config::listTags() const { return m_data.listTags; } bool Config::listReporters() const { return m_data.listReporters; } std::string Config::getProcessName() const { return m_data.processName; } std::string const& Config::getReporterName() const { return m_data.reporterName; } std::vector const& Config::getTestsOrTags() const { return m_data.testsOrTags; } std::vector const& Config::getSectionsToRun() const { return m_data.sectionsToRun; } TestSpec const& Config::testSpec() const { return m_testSpec; } bool Config::hasTestFilters() const { return m_hasTestFilters; } bool Config::showHelp() const { return m_data.showHelp; } // IConfig interface bool Config::allowThrows() const { return !m_data.noThrow; } std::ostream& Config::stream() const { return m_stream->stream(); } std::string Config::name() const { return m_data.name.empty() ? m_data.processName : m_data.name; } bool Config::includeSuccessfulResults() const { return m_data.showSuccessfulTests; } bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); } bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); } ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; } RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; } unsigned int Config::rngSeed() const { return m_data.rngSeed; } int Config::benchmarkResolutionMultiple() const { return m_data.benchmarkResolutionMultiple; } UseColour::YesOrNo Config::useColour() const { return m_data.useColour; } bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; } int Config::abortAfter() const { return m_data.abortAfter; } bool Config::showInvisibles() const { return m_data.showInvisibles; } Verbosity Config::verbosity() const { return m_data.verbosity; } IStream const* Config::openStream() { return Catch::makeStream(m_data.outputFilename); } } // end namespace Catch // end catch_config.cpp // start catch_console_colour.cpp #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wexit-time-destructors" #endif // start catch_errno_guard.h namespace Catch { class ErrnoGuard { public: ErrnoGuard(); ~ErrnoGuard(); private: int m_oldErrno; }; } // end catch_errno_guard.h #include namespace Catch { namespace { struct IColourImpl { virtual ~IColourImpl() = default; virtual void use( Colour::Code _colourCode ) = 0; }; struct NoColourImpl : IColourImpl { void use( Colour::Code ) {} static IColourImpl* instance() { static NoColourImpl s_instance; return &s_instance; } }; } // anon namespace } // namespace Catch #if !defined( CATCH_CONFIG_COLOUR_NONE ) && !defined( CATCH_CONFIG_COLOUR_WINDOWS ) && !defined( CATCH_CONFIG_COLOUR_ANSI ) # ifdef CATCH_PLATFORM_WINDOWS # define CATCH_CONFIG_COLOUR_WINDOWS # else # define CATCH_CONFIG_COLOUR_ANSI # endif #endif #if defined ( CATCH_CONFIG_COLOUR_WINDOWS ) ///////////////////////////////////////// namespace Catch { namespace { class Win32ColourImpl : public IColourImpl { public: Win32ColourImpl() : stdoutHandle( GetStdHandle(STD_OUTPUT_HANDLE) ) { CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo( stdoutHandle, &csbiInfo ); originalForegroundAttributes = csbiInfo.wAttributes & ~( BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY ); originalBackgroundAttributes = csbiInfo.wAttributes & ~( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY ); } virtual void use( Colour::Code _colourCode ) override { switch( _colourCode ) { case Colour::None: return setTextAttribute( originalForegroundAttributes ); case Colour::White: return setTextAttribute( FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::Red: return setTextAttribute( FOREGROUND_RED ); case Colour::Green: return setTextAttribute( FOREGROUND_GREEN ); case Colour::Blue: return setTextAttribute( FOREGROUND_BLUE ); case Colour::Cyan: return setTextAttribute( FOREGROUND_BLUE | FOREGROUND_GREEN ); case Colour::Yellow: return setTextAttribute( FOREGROUND_RED | FOREGROUND_GREEN ); case Colour::Grey: return setTextAttribute( 0 ); case Colour::LightGrey: return setTextAttribute( FOREGROUND_INTENSITY ); case Colour::BrightRed: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED ); case Colour::BrightGreen: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN ); case Colour::BrightWhite: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE ); case Colour::BrightYellow: return setTextAttribute( FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN ); case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); default: CATCH_ERROR( "Unknown colour requested" ); } } private: void setTextAttribute( WORD _textAttribute ) { SetConsoleTextAttribute( stdoutHandle, _textAttribute | originalBackgroundAttributes ); } HANDLE stdoutHandle; WORD originalForegroundAttributes; WORD originalBackgroundAttributes; }; IColourImpl* platformColourInstance() { static Win32ColourImpl s_instance; IConfigPtr config = getCurrentContext().getConfig(); UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto; if( colourMode == UseColour::Auto ) colourMode = UseColour::Yes; return colourMode == UseColour::Yes ? &s_instance : NoColourImpl::instance(); } } // end anon namespace } // end namespace Catch #elif defined( CATCH_CONFIG_COLOUR_ANSI ) ////////////////////////////////////// #include namespace Catch { namespace { // use POSIX/ ANSI console terminal codes // Thanks to Adam Strzelecki for original contribution // (http://github.com/nanoant) // https://github.com/philsquared/Catch/pull/131 class PosixColourImpl : public IColourImpl { public: virtual void use( Colour::Code _colourCode ) override { switch( _colourCode ) { case Colour::None: case Colour::White: return setColour( "[0m" ); case Colour::Red: return setColour( "[0;31m" ); case Colour::Green: return setColour( "[0;32m" ); case Colour::Blue: return setColour( "[0;34m" ); case Colour::Cyan: return setColour( "[0;36m" ); case Colour::Yellow: return setColour( "[0;33m" ); case Colour::Grey: return setColour( "[1;30m" ); case Colour::LightGrey: return setColour( "[0;37m" ); case Colour::BrightRed: return setColour( "[1;31m" ); case Colour::BrightGreen: return setColour( "[1;32m" ); case Colour::BrightWhite: return setColour( "[1;37m" ); case Colour::BrightYellow: return setColour( "[1;33m" ); case Colour::Bright: CATCH_INTERNAL_ERROR( "not a colour" ); default: CATCH_INTERNAL_ERROR( "Unknown colour requested" ); } } static IColourImpl* instance() { static PosixColourImpl s_instance; return &s_instance; } private: void setColour( const char* _escapeCode ) { Catch::cout() << '\033' << _escapeCode; } }; bool useColourOnPlatform() { return #ifdef CATCH_PLATFORM_MAC !isDebuggerActive() && #endif #if !(defined(__DJGPP__) && defined(__STRICT_ANSI__)) isatty(STDOUT_FILENO) #else false #endif ; } IColourImpl* platformColourInstance() { ErrnoGuard guard; IConfigPtr config = getCurrentContext().getConfig(); UseColour::YesOrNo colourMode = config ? config->useColour() : UseColour::Auto; if( colourMode == UseColour::Auto ) colourMode = useColourOnPlatform() ? UseColour::Yes : UseColour::No; return colourMode == UseColour::Yes ? PosixColourImpl::instance() : NoColourImpl::instance(); } } // end anon namespace } // end namespace Catch #else // not Windows or ANSI /////////////////////////////////////////////// namespace Catch { static IColourImpl* platformColourInstance() { return NoColourImpl::instance(); } } // end namespace Catch #endif // Windows/ ANSI/ None namespace Catch { Colour::Colour( Code _colourCode ) { use( _colourCode ); } Colour::Colour( Colour&& rhs ) noexcept { m_moved = rhs.m_moved; rhs.m_moved = true; } Colour& Colour::operator=( Colour&& rhs ) noexcept { m_moved = rhs.m_moved; rhs.m_moved = true; return *this; } Colour::~Colour(){ if( !m_moved ) use( None ); } void Colour::use( Code _colourCode ) { static IColourImpl* impl = platformColourInstance(); impl->use( _colourCode ); } std::ostream& operator << ( std::ostream& os, Colour const& ) { return os; } } // end namespace Catch #if defined(__clang__) # pragma clang diagnostic pop #endif // end catch_console_colour.cpp // start catch_context.cpp namespace Catch { class Context : public IMutableContext, NonCopyable { public: // IContext virtual IResultCapture* getResultCapture() override { return m_resultCapture; } virtual IRunner* getRunner() override { return m_runner; } virtual IConfigPtr const& getConfig() const override { return m_config; } virtual ~Context() override; public: // IMutableContext virtual void setResultCapture( IResultCapture* resultCapture ) override { m_resultCapture = resultCapture; } virtual void setRunner( IRunner* runner ) override { m_runner = runner; } virtual void setConfig( IConfigPtr const& config ) override { m_config = config; } friend IMutableContext& getCurrentMutableContext(); private: IConfigPtr m_config; IRunner* m_runner = nullptr; IResultCapture* m_resultCapture = nullptr; }; IMutableContext *IMutableContext::currentContext = nullptr; void IMutableContext::createContext() { currentContext = new Context(); } void cleanUpContext() { delete IMutableContext::currentContext; IMutableContext::currentContext = nullptr; } IContext::~IContext() = default; IMutableContext::~IMutableContext() = default; Context::~Context() = default; } // end catch_context.cpp // start catch_debug_console.cpp // start catch_debug_console.h #include namespace Catch { void writeToDebugConsole( std::string const& text ); } // end catch_debug_console.h #ifdef CATCH_PLATFORM_WINDOWS namespace Catch { void writeToDebugConsole( std::string const& text ) { ::OutputDebugStringA( text.c_str() ); } } #else namespace Catch { void writeToDebugConsole( std::string const& text ) { // !TBD: Need a version for Mac/ XCode and other IDEs Catch::cout() << text; } } #endif // Platform // end catch_debug_console.cpp // start catch_debugger.cpp #ifdef CATCH_PLATFORM_MAC # include # include # include # include # include # include # include namespace Catch { // The following function is taken directly from the following technical note: // http://developer.apple.com/library/mac/#qa/qa2004/qa1361.html // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). bool isDebuggerActive(){ int mib[4]; struct kinfo_proc info; std::size_t size; // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result. info.kp_proc.p_flag = 0; // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID. mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); // Call sysctl. size = sizeof(info); if( sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, nullptr, 0) != 0 ) { Catch::cerr() << "\n** Call to sysctl failed - unable to determine if debugger is active **\n" << std::endl; return false; } // We're being debugged if the P_TRACED flag is set. return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); } } // namespace Catch #elif defined(CATCH_PLATFORM_LINUX) #include #include namespace Catch{ // The standard POSIX way of detecting a debugger is to attempt to // ptrace() the process, but this needs to be done from a child and not // this process itself to still allow attaching to this process later // if wanted, so is rather heavy. Under Linux we have the PID of the // "debugger" (which doesn't need to be gdb, of course, it could also // be strace, for example) in /proc/$PID/status, so just get it from // there instead. bool isDebuggerActive(){ // Libstdc++ has a bug, where std::ifstream sets errno to 0 // This way our users can properly assert over errno values ErrnoGuard guard; std::ifstream in("/proc/self/status"); for( std::string line; std::getline(in, line); ) { static const int PREFIX_LEN = 11; if( line.compare(0, PREFIX_LEN, "TracerPid:\t") == 0 ) { // We're traced if the PID is not 0 and no other PID starts // with 0 digit, so it's enough to check for just a single // character. return line.length() > PREFIX_LEN && line[PREFIX_LEN] != '0'; } } return false; } } // namespace Catch #elif defined(_MSC_VER) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); namespace Catch { bool isDebuggerActive() { return IsDebuggerPresent() != 0; } } #elif defined(__MINGW32__) extern "C" __declspec(dllimport) int __stdcall IsDebuggerPresent(); namespace Catch { bool isDebuggerActive() { return IsDebuggerPresent() != 0; } } #else namespace Catch { bool isDebuggerActive() { return false; } } #endif // Platform // end catch_debugger.cpp // start catch_decomposer.cpp namespace Catch { ITransientExpression::~ITransientExpression() = default; void formatReconstructedExpression( std::ostream &os, std::string const& lhs, StringRef op, std::string const& rhs ) { if( lhs.size() + rhs.size() < 40 && lhs.find('\n') == std::string::npos && rhs.find('\n') == std::string::npos ) os << lhs << " " << op << " " << rhs; else os << lhs << "\n" << op << "\n" << rhs; } } // end catch_decomposer.cpp // start catch_errno_guard.cpp #include namespace Catch { ErrnoGuard::ErrnoGuard():m_oldErrno(errno){} ErrnoGuard::~ErrnoGuard() { errno = m_oldErrno; } } // end catch_errno_guard.cpp // start catch_exception_translator_registry.cpp // start catch_exception_translator_registry.h #include #include #include namespace Catch { class ExceptionTranslatorRegistry : public IExceptionTranslatorRegistry { public: ~ExceptionTranslatorRegistry(); virtual void registerTranslator( const IExceptionTranslator* translator ); virtual std::string translateActiveException() const override; std::string tryTranslators() const; private: std::vector> m_translators; }; } // end catch_exception_translator_registry.h #ifdef __OBJC__ #import "Foundation/Foundation.h" #endif namespace Catch { ExceptionTranslatorRegistry::~ExceptionTranslatorRegistry() { } void ExceptionTranslatorRegistry::registerTranslator( const IExceptionTranslator* translator ) { m_translators.push_back( std::unique_ptr( translator ) ); } std::string ExceptionTranslatorRegistry::translateActiveException() const { try { #ifdef __OBJC__ // In Objective-C try objective-c exceptions first @try { return tryTranslators(); } @catch (NSException *exception) { return Catch::Detail::stringify( [exception description] ); } #else // Compiling a mixed mode project with MSVC means that CLR // exceptions will be caught in (...) as well. However, these // do not fill-in std::current_exception and thus lead to crash // when attempting rethrow. // /EHa switch also causes structured exceptions to be caught // here, but they fill-in current_exception properly, so // at worst the output should be a little weird, instead of // causing a crash. if (std::current_exception() == nullptr) { return "Non C++ exception. Possibly a CLR exception."; } return tryTranslators(); #endif } catch( TestFailureException& ) { std::rethrow_exception(std::current_exception()); } catch( std::exception& ex ) { return ex.what(); } catch( std::string& msg ) { return msg; } catch( const char* msg ) { return msg; } catch(...) { return "Unknown exception"; } } std::string ExceptionTranslatorRegistry::tryTranslators() const { if( m_translators.empty() ) std::rethrow_exception(std::current_exception()); else return m_translators[0]->translate( m_translators.begin()+1, m_translators.end() ); } } // end catch_exception_translator_registry.cpp // start catch_fatal_condition.cpp #if defined(__GNUC__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif #if defined( CATCH_CONFIG_WINDOWS_SEH ) || defined( CATCH_CONFIG_POSIX_SIGNALS ) namespace { // Report the error condition void reportFatal( char const * const message ) { Catch::getCurrentContext().getResultCapture()->handleFatalErrorCondition( message ); } } #endif // signals/SEH handling #if defined( CATCH_CONFIG_WINDOWS_SEH ) namespace Catch { struct SignalDefs { DWORD id; const char* name; }; // There is no 1-1 mapping between signals and windows exceptions. // Windows can easily distinguish between SO and SigSegV, // but SigInt, SigTerm, etc are handled differently. static SignalDefs signalDefs[] = { { EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL - Illegal instruction signal" }, { EXCEPTION_STACK_OVERFLOW, "SIGSEGV - Stack overflow" }, { EXCEPTION_ACCESS_VIOLATION, "SIGSEGV - Segmentation violation signal" }, { EXCEPTION_INT_DIVIDE_BY_ZERO, "Divide by zero error" }, }; LONG CALLBACK FatalConditionHandler::handleVectoredException(PEXCEPTION_POINTERS ExceptionInfo) { for (auto const& def : signalDefs) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == def.id) { reportFatal(def.name); } } // If its not an exception we care about, pass it along. // This stops us from eating debugger breaks etc. return EXCEPTION_CONTINUE_SEARCH; } FatalConditionHandler::FatalConditionHandler() { isSet = true; // 32k seems enough for Catch to handle stack overflow, // but the value was found experimentally, so there is no strong guarantee guaranteeSize = 32 * 1024; exceptionHandlerHandle = nullptr; // Register as first handler in current chain exceptionHandlerHandle = AddVectoredExceptionHandler(1, handleVectoredException); // Pass in guarantee size to be filled SetThreadStackGuarantee(&guaranteeSize); } void FatalConditionHandler::reset() { if (isSet) { RemoveVectoredExceptionHandler(exceptionHandlerHandle); SetThreadStackGuarantee(&guaranteeSize); exceptionHandlerHandle = nullptr; isSet = false; } } FatalConditionHandler::~FatalConditionHandler() { reset(); } bool FatalConditionHandler::isSet = false; ULONG FatalConditionHandler::guaranteeSize = 0; PVOID FatalConditionHandler::exceptionHandlerHandle = nullptr; } // namespace Catch #elif defined( CATCH_CONFIG_POSIX_SIGNALS ) namespace Catch { struct SignalDefs { int id; const char* name; }; // 32kb for the alternate stack seems to be sufficient. However, this value // is experimentally determined, so that's not guaranteed. constexpr static std::size_t sigStackSize = 32768 >= MINSIGSTKSZ ? 32768 : MINSIGSTKSZ; static SignalDefs signalDefs[] = { { SIGINT, "SIGINT - Terminal interrupt signal" }, { SIGILL, "SIGILL - Illegal instruction signal" }, { SIGFPE, "SIGFPE - Floating point error signal" }, { SIGSEGV, "SIGSEGV - Segmentation violation signal" }, { SIGTERM, "SIGTERM - Termination request signal" }, { SIGABRT, "SIGABRT - Abort (abnormal termination) signal" } }; void FatalConditionHandler::handleSignal( int sig ) { char const * name = ""; for (auto const& def : signalDefs) { if (sig == def.id) { name = def.name; break; } } reset(); reportFatal(name); raise( sig ); } FatalConditionHandler::FatalConditionHandler() { isSet = true; stack_t sigStack; sigStack.ss_sp = altStackMem; sigStack.ss_size = sigStackSize; sigStack.ss_flags = 0; sigaltstack(&sigStack, &oldSigStack); struct sigaction sa = { }; sa.sa_handler = handleSignal; sa.sa_flags = SA_ONSTACK; for (std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i) { sigaction(signalDefs[i].id, &sa, &oldSigActions[i]); } } FatalConditionHandler::~FatalConditionHandler() { reset(); } void FatalConditionHandler::reset() { if( isSet ) { // Set signals back to previous values -- hopefully nobody overwrote them in the meantime for( std::size_t i = 0; i < sizeof(signalDefs)/sizeof(SignalDefs); ++i ) { sigaction(signalDefs[i].id, &oldSigActions[i], nullptr); } // Return the old stack sigaltstack(&oldSigStack, nullptr); isSet = false; } } bool FatalConditionHandler::isSet = false; struct sigaction FatalConditionHandler::oldSigActions[sizeof(signalDefs)/sizeof(SignalDefs)] = {}; stack_t FatalConditionHandler::oldSigStack = {}; char FatalConditionHandler::altStackMem[sigStackSize] = {}; } // namespace Catch #else namespace Catch { void FatalConditionHandler::reset() {} } #endif // signals/SEH handling #if defined(__GNUC__) # pragma GCC diagnostic pop #endif // end catch_fatal_condition.cpp // start catch_interfaces_capture.cpp namespace Catch { IResultCapture::~IResultCapture() = default; } // end catch_interfaces_capture.cpp // start catch_interfaces_config.cpp namespace Catch { IConfig::~IConfig() = default; } // end catch_interfaces_config.cpp // start catch_interfaces_exception.cpp namespace Catch { IExceptionTranslator::~IExceptionTranslator() = default; IExceptionTranslatorRegistry::~IExceptionTranslatorRegistry() = default; } // end catch_interfaces_exception.cpp // start catch_interfaces_registry_hub.cpp namespace Catch { IRegistryHub::~IRegistryHub() = default; IMutableRegistryHub::~IMutableRegistryHub() = default; } // end catch_interfaces_registry_hub.cpp // start catch_interfaces_reporter.cpp // start catch_reporter_listening.h namespace Catch { class ListeningReporter : public IStreamingReporter { using Reporters = std::vector; Reporters m_listeners; IStreamingReporterPtr m_reporter = nullptr; ReporterPreferences m_preferences; public: ListeningReporter(); void addListener( IStreamingReporterPtr&& listener ); void addReporter( IStreamingReporterPtr&& reporter ); public: // IStreamingReporter ReporterPreferences getPreferences() const override; void noMatchingTestCases( std::string const& spec ) override; static std::set getSupportedVerbosities(); void benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) override; void benchmarkEnded( BenchmarkStats const& benchmarkStats ) override; void testRunStarting( TestRunInfo const& testRunInfo ) override; void testGroupStarting( GroupInfo const& groupInfo ) override; void testCaseStarting( TestCaseInfo const& testInfo ) override; void sectionStarting( SectionInfo const& sectionInfo ) override; void assertionStarting( AssertionInfo const& assertionInfo ) override; // The return value indicates if the messages buffer should be cleared: bool assertionEnded( AssertionStats const& assertionStats ) override; void sectionEnded( SectionStats const& sectionStats ) override; void testCaseEnded( TestCaseStats const& testCaseStats ) override; void testGroupEnded( TestGroupStats const& testGroupStats ) override; void testRunEnded( TestRunStats const& testRunStats ) override; void skipTest( TestCaseInfo const& testInfo ) override; bool isMulti() const override; }; } // end namespace Catch // end catch_reporter_listening.h namespace Catch { ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig ) : m_stream( &_fullConfig->stream() ), m_fullConfig( _fullConfig ) {} ReporterConfig::ReporterConfig( IConfigPtr const& _fullConfig, std::ostream& _stream ) : m_stream( &_stream ), m_fullConfig( _fullConfig ) {} std::ostream& ReporterConfig::stream() const { return *m_stream; } IConfigPtr ReporterConfig::fullConfig() const { return m_fullConfig; } TestRunInfo::TestRunInfo( std::string const& _name ) : name( _name ) {} GroupInfo::GroupInfo( std::string const& _name, std::size_t _groupIndex, std::size_t _groupsCount ) : name( _name ), groupIndex( _groupIndex ), groupsCounts( _groupsCount ) {} AssertionStats::AssertionStats( AssertionResult const& _assertionResult, std::vector const& _infoMessages, Totals const& _totals ) : assertionResult( _assertionResult ), infoMessages( _infoMessages ), totals( _totals ) { assertionResult.m_resultData.lazyExpression.m_transientExpression = _assertionResult.m_resultData.lazyExpression.m_transientExpression; if( assertionResult.hasMessage() ) { // Copy message into messages list. // !TBD This should have been done earlier, somewhere MessageBuilder builder( assertionResult.getTestMacroName(), assertionResult.getSourceInfo(), assertionResult.getResultType() ); builder << assertionResult.getMessage(); builder.m_info.message = builder.m_stream.str(); infoMessages.push_back( builder.m_info ); } } AssertionStats::~AssertionStats() = default; SectionStats::SectionStats( SectionInfo const& _sectionInfo, Counts const& _assertions, double _durationInSeconds, bool _missingAssertions ) : sectionInfo( _sectionInfo ), assertions( _assertions ), durationInSeconds( _durationInSeconds ), missingAssertions( _missingAssertions ) {} SectionStats::~SectionStats() = default; TestCaseStats::TestCaseStats( TestCaseInfo const& _testInfo, Totals const& _totals, std::string const& _stdOut, std::string const& _stdErr, bool _aborting ) : testInfo( _testInfo ), totals( _totals ), stdOut( _stdOut ), stdErr( _stdErr ), aborting( _aborting ) {} TestCaseStats::~TestCaseStats() = default; TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo, Totals const& _totals, bool _aborting ) : groupInfo( _groupInfo ), totals( _totals ), aborting( _aborting ) {} TestGroupStats::TestGroupStats( GroupInfo const& _groupInfo ) : groupInfo( _groupInfo ), aborting( false ) {} TestGroupStats::~TestGroupStats() = default; TestRunStats::TestRunStats( TestRunInfo const& _runInfo, Totals const& _totals, bool _aborting ) : runInfo( _runInfo ), totals( _totals ), aborting( _aborting ) {} TestRunStats::~TestRunStats() = default; void IStreamingReporter::fatalErrorEncountered( StringRef ) {} bool IStreamingReporter::isMulti() const { return false; } IReporterFactory::~IReporterFactory() = default; IReporterRegistry::~IReporterRegistry() = default; } // end namespace Catch // end catch_interfaces_reporter.cpp // start catch_interfaces_runner.cpp namespace Catch { IRunner::~IRunner() = default; } // end catch_interfaces_runner.cpp // start catch_interfaces_testcase.cpp namespace Catch { ITestInvoker::~ITestInvoker() = default; ITestCaseRegistry::~ITestCaseRegistry() = default; } // end catch_interfaces_testcase.cpp // start catch_leak_detector.cpp #ifdef CATCH_CONFIG_WINDOWS_CRTDBG #include namespace Catch { LeakDetector::LeakDetector() { int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); flag |= _CRTDBG_LEAK_CHECK_DF; flag |= _CRTDBG_ALLOC_MEM_DF; _CrtSetDbgFlag(flag); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); // Change this to leaking allocation's number to break there _CrtSetBreakAlloc(-1); } } #else Catch::LeakDetector::LeakDetector() {} #endif // end catch_leak_detector.cpp // start catch_list.cpp // start catch_list.h #include namespace Catch { std::size_t listTests( Config const& config ); std::size_t listTestsNamesOnly( Config const& config ); struct TagInfo { void add( std::string const& spelling ); std::string all() const; std::set spellings; std::size_t count = 0; }; std::size_t listTags( Config const& config ); std::size_t listReporters( Config const& /*config*/ ); Option list( Config const& config ); } // end namespace Catch // end catch_list.h // start catch_text.h namespace Catch { using namespace clara::TextFlow; } // end catch_text.h #include #include #include namespace Catch { std::size_t listTests( Config const& config ) { TestSpec testSpec = config.testSpec(); if( config.hasTestFilters() ) Catch::cout() << "Matching test cases:\n"; else { Catch::cout() << "All available test cases:\n"; } auto matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( auto const& testCaseInfo : matchedTestCases ) { Colour::Code colour = testCaseInfo.isHidden() ? Colour::SecondaryText : Colour::None; Colour colourGuard( colour ); Catch::cout() << Column( testCaseInfo.name ).initialIndent( 2 ).indent( 4 ) << "\n"; if( config.verbosity() >= Verbosity::High ) { Catch::cout() << Column( Catch::Detail::stringify( testCaseInfo.lineInfo ) ).indent(4) << std::endl; std::string description = testCaseInfo.description; if( description.empty() ) description = "(NO DESCRIPTION)"; Catch::cout() << Column( description ).indent(4) << std::endl; } if( !testCaseInfo.tags.empty() ) Catch::cout() << Column( testCaseInfo.tagsAsString() ).indent( 6 ) << "\n"; } if( !config.hasTestFilters() ) Catch::cout() << pluralise( matchedTestCases.size(), "test case" ) << '\n' << std::endl; else Catch::cout() << pluralise( matchedTestCases.size(), "matching test case" ) << '\n' << std::endl; return matchedTestCases.size(); } std::size_t listTestsNamesOnly( Config const& config ) { TestSpec testSpec = config.testSpec(); std::size_t matchedTests = 0; std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( auto const& testCaseInfo : matchedTestCases ) { matchedTests++; if( startsWith( testCaseInfo.name, '#' ) ) Catch::cout() << '"' << testCaseInfo.name << '"'; else Catch::cout() << testCaseInfo.name; if ( config.verbosity() >= Verbosity::High ) Catch::cout() << "\t@" << testCaseInfo.lineInfo; Catch::cout() << std::endl; } return matchedTests; } void TagInfo::add( std::string const& spelling ) { ++count; spellings.insert( spelling ); } std::string TagInfo::all() const { std::string out; for( auto const& spelling : spellings ) out += "[" + spelling + "]"; return out; } std::size_t listTags( Config const& config ) { TestSpec testSpec = config.testSpec(); if( config.hasTestFilters() ) Catch::cout() << "Tags for matching test cases:\n"; else { Catch::cout() << "All available tags:\n"; } std::map tagCounts; std::vector matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config ); for( auto const& testCase : matchedTestCases ) { for( auto const& tagName : testCase.getTestCaseInfo().tags ) { std::string lcaseTagName = toLower( tagName ); auto countIt = tagCounts.find( lcaseTagName ); if( countIt == tagCounts.end() ) countIt = tagCounts.insert( std::make_pair( lcaseTagName, TagInfo() ) ).first; countIt->second.add( tagName ); } } for( auto const& tagCount : tagCounts ) { ReusableStringStream rss; rss << " " << std::setw(2) << tagCount.second.count << " "; auto str = rss.str(); auto wrapper = Column( tagCount.second.all() ) .initialIndent( 0 ) .indent( str.size() ) .width( CATCH_CONFIG_CONSOLE_WIDTH-10 ); Catch::cout() << str << wrapper << '\n'; } Catch::cout() << pluralise( tagCounts.size(), "tag" ) << '\n' << std::endl; return tagCounts.size(); } std::size_t listReporters( Config const& /*config*/ ) { Catch::cout() << "Available reporters:\n"; IReporterRegistry::FactoryMap const& factories = getRegistryHub().getReporterRegistry().getFactories(); std::size_t maxNameLen = 0; for( auto const& factoryKvp : factories ) maxNameLen = (std::max)( maxNameLen, factoryKvp.first.size() ); for( auto const& factoryKvp : factories ) { Catch::cout() << Column( factoryKvp.first + ":" ) .indent(2) .width( 5+maxNameLen ) + Column( factoryKvp.second->getDescription() ) .initialIndent(0) .indent(2) .width( CATCH_CONFIG_CONSOLE_WIDTH - maxNameLen-8 ) << "\n"; } Catch::cout() << std::endl; return factories.size(); } Option list( Config const& config ) { Option listedCount; if( config.listTests() ) listedCount = listedCount.valueOr(0) + listTests( config ); if( config.listTestNamesOnly() ) listedCount = listedCount.valueOr(0) + listTestsNamesOnly( config ); if( config.listTags() ) listedCount = listedCount.valueOr(0) + listTags( config ); if( config.listReporters() ) listedCount = listedCount.valueOr(0) + listReporters( config ); return listedCount; } } // end namespace Catch // end catch_list.cpp // start catch_matchers.cpp namespace Catch { namespace Matchers { namespace Impl { std::string MatcherUntypedBase::toString() const { if( m_cachedToString.empty() ) m_cachedToString = describe(); return m_cachedToString; } MatcherUntypedBase::~MatcherUntypedBase() = default; } // namespace Impl } // namespace Matchers using namespace Matchers; using Matchers::Impl::MatcherBase; } // namespace Catch // end catch_matchers.cpp // start catch_matchers_floating.cpp // start catch_to_string.hpp #include namespace Catch { template std::string to_string(T const& t) { #if defined(CATCH_CONFIG_CPP11_TO_STRING) return std::to_string(t); #else ReusableStringStream rss; rss << t; return rss.str(); #endif } } // end namespace Catch // end catch_to_string.hpp #include #include #include #include namespace Catch { namespace Matchers { namespace Floating { enum class FloatingPointKind : uint8_t { Float, Double }; } } } namespace { template struct Converter; template <> struct Converter { static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated"); Converter(float f) { std::memcpy(&i, &f, sizeof(f)); } int32_t i; }; template <> struct Converter { static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated"); Converter(double d) { std::memcpy(&i, &d, sizeof(d)); } int64_t i; }; template auto convert(T t) -> Converter { return Converter(t); } template bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) { // Comparison with NaN should always be false. // This way we can rule it out before getting into the ugly details if (std::isnan(lhs) || std::isnan(rhs)) { return false; } auto lc = convert(lhs); auto rc = convert(rhs); if ((lc.i < 0) != (rc.i < 0)) { // Potentially we can have +0 and -0 return lhs == rhs; } auto ulpDiff = std::abs(lc.i - rc.i); return ulpDiff <= maxUlpDiff; } } namespace Catch { namespace Matchers { namespace Floating { WithinAbsMatcher::WithinAbsMatcher(double target, double margin) :m_target{ target }, m_margin{ margin } { if (m_margin < 0) { throw std::domain_error("Allowed margin difference has to be >= 0"); } } // Performs equivalent check of std::fabs(lhs - rhs) <= margin // But without the subtraction to allow for INFINITY in comparison bool WithinAbsMatcher::match(double const& matchee) const { return (matchee + m_margin >= m_target) && (m_target + m_margin >= matchee); } std::string WithinAbsMatcher::describe() const { return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target); } WithinUlpsMatcher::WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType) :m_target{ target }, m_ulps{ ulps }, m_type{ baseType } { if (m_ulps < 0) { throw std::domain_error("Allowed ulp difference has to be >= 0"); } } bool WithinUlpsMatcher::match(double const& matchee) const { switch (m_type) { case FloatingPointKind::Float: return almostEqualUlps(static_cast(matchee), static_cast(m_target), m_ulps); case FloatingPointKind::Double: return almostEqualUlps(matchee, m_target, m_ulps); default: throw std::domain_error("Unknown FloatingPointKind value"); } } std::string WithinUlpsMatcher::describe() const { return "is within " + Catch::to_string(m_ulps) + " ULPs of " + ::Catch::Detail::stringify(m_target) + ((m_type == FloatingPointKind::Float)? "f" : ""); } }// namespace Floating Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff) { return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double); } Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff) { return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float); } Floating::WithinAbsMatcher WithinAbs(double target, double margin) { return Floating::WithinAbsMatcher(target, margin); } } // namespace Matchers } // namespace Catch // end catch_matchers_floating.cpp // start catch_matchers_generic.cpp std::string Catch::Matchers::Generic::Detail::finalizeDescription(const std::string& desc) { if (desc.empty()) { return "matches undescribed predicate"; } else { return "matches predicate: \"" + desc + '"'; } } // end catch_matchers_generic.cpp // start catch_matchers_string.cpp #include namespace Catch { namespace Matchers { namespace StdString { CasedString::CasedString( std::string const& str, CaseSensitive::Choice caseSensitivity ) : m_caseSensitivity( caseSensitivity ), m_str( adjustString( str ) ) {} std::string CasedString::adjustString( std::string const& str ) const { return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; } std::string CasedString::caseSensitivitySuffix() const { return m_caseSensitivity == CaseSensitive::No ? " (case insensitive)" : std::string(); } StringMatcherBase::StringMatcherBase( std::string const& operation, CasedString const& comparator ) : m_comparator( comparator ), m_operation( operation ) { } std::string StringMatcherBase::describe() const { std::string description; description.reserve(5 + m_operation.size() + m_comparator.m_str.size() + m_comparator.caseSensitivitySuffix().size()); description += m_operation; description += ": \""; description += m_comparator.m_str; description += "\""; description += m_comparator.caseSensitivitySuffix(); return description; } EqualsMatcher::EqualsMatcher( CasedString const& comparator ) : StringMatcherBase( "equals", comparator ) {} bool EqualsMatcher::match( std::string const& source ) const { return m_comparator.adjustString( source ) == m_comparator.m_str; } ContainsMatcher::ContainsMatcher( CasedString const& comparator ) : StringMatcherBase( "contains", comparator ) {} bool ContainsMatcher::match( std::string const& source ) const { return contains( m_comparator.adjustString( source ), m_comparator.m_str ); } StartsWithMatcher::StartsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "starts with", comparator ) {} bool StartsWithMatcher::match( std::string const& source ) const { return startsWith( m_comparator.adjustString( source ), m_comparator.m_str ); } EndsWithMatcher::EndsWithMatcher( CasedString const& comparator ) : StringMatcherBase( "ends with", comparator ) {} bool EndsWithMatcher::match( std::string const& source ) const { return endsWith( m_comparator.adjustString( source ), m_comparator.m_str ); } RegexMatcher::RegexMatcher(std::string regex, CaseSensitive::Choice caseSensitivity): m_regex(std::move(regex)), m_caseSensitivity(caseSensitivity) {} bool RegexMatcher::match(std::string const& matchee) const { auto flags = std::regex::ECMAScript; // ECMAScript is the default syntax option anyway if (m_caseSensitivity == CaseSensitive::Choice::No) { flags |= std::regex::icase; } auto reg = std::regex(m_regex, flags); return std::regex_match(matchee, reg); } std::string RegexMatcher::describe() const { return "matches " + ::Catch::Detail::stringify(m_regex) + ((m_caseSensitivity == CaseSensitive::Choice::Yes)? " case sensitively" : " case insensitively"); } } // namespace StdString StdString::EqualsMatcher Equals( std::string const& str, CaseSensitive::Choice caseSensitivity ) { return StdString::EqualsMatcher( StdString::CasedString( str, caseSensitivity) ); } StdString::ContainsMatcher Contains( std::string const& str, CaseSensitive::Choice caseSensitivity ) { return StdString::ContainsMatcher( StdString::CasedString( str, caseSensitivity) ); } StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { return StdString::EndsWithMatcher( StdString::CasedString( str, caseSensitivity) ); } StdString::StartsWithMatcher StartsWith( std::string const& str, CaseSensitive::Choice caseSensitivity ) { return StdString::StartsWithMatcher( StdString::CasedString( str, caseSensitivity) ); } StdString::RegexMatcher Matches(std::string const& regex, CaseSensitive::Choice caseSensitivity) { return StdString::RegexMatcher(regex, caseSensitivity); } } // namespace Matchers } // namespace Catch // end catch_matchers_string.cpp // start catch_message.cpp // start catch_uncaught_exceptions.h namespace Catch { bool uncaught_exceptions(); } // end namespace Catch // end catch_uncaught_exceptions.h namespace Catch { MessageInfo::MessageInfo( std::string const& _macroName, SourceLineInfo const& _lineInfo, ResultWas::OfType _type ) : macroName( _macroName ), lineInfo( _lineInfo ), type( _type ), sequence( ++globalCount ) {} bool MessageInfo::operator==( MessageInfo const& other ) const { return sequence == other.sequence; } bool MessageInfo::operator<( MessageInfo const& other ) const { return sequence < other.sequence; } // This may need protecting if threading support is added unsigned int MessageInfo::globalCount = 0; //////////////////////////////////////////////////////////////////////////// Catch::MessageBuilder::MessageBuilder( std::string const& macroName, SourceLineInfo const& lineInfo, ResultWas::OfType type ) :m_info(macroName, lineInfo, type) {} //////////////////////////////////////////////////////////////////////////// ScopedMessage::ScopedMessage( MessageBuilder const& builder ) : m_info( builder.m_info ) { m_info.message = builder.m_stream.str(); getResultCapture().pushScopedMessage( m_info ); } ScopedMessage::~ScopedMessage() { if ( !uncaught_exceptions() ){ getResultCapture().popScopedMessage(m_info); } } } // end namespace Catch // end catch_message.cpp // start catch_output_redirect.cpp // start catch_output_redirect.h #ifndef TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H #define TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H #include #include #include namespace Catch { class RedirectedStream { std::ostream& m_originalStream; std::ostream& m_redirectionStream; std::streambuf* m_prevBuf; public: RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ); ~RedirectedStream(); }; class RedirectedStdOut { ReusableStringStream m_rss; RedirectedStream m_cout; public: RedirectedStdOut(); auto str() const -> std::string; }; // StdErr has two constituent streams in C++, std::cerr and std::clog // This means that we need to redirect 2 streams into 1 to keep proper // order of writes class RedirectedStdErr { ReusableStringStream m_rss; RedirectedStream m_cerr; RedirectedStream m_clog; public: RedirectedStdErr(); auto str() const -> std::string; }; #if defined(CATCH_CONFIG_NEW_CAPTURE) // Windows's implementation of std::tmpfile is terrible (it tries // to create a file inside system folder, thus requiring elevated // privileges for the binary), so we have to use tmpnam(_s) and // create the file ourselves there. class TempFile { public: TempFile(TempFile const&) = delete; TempFile& operator=(TempFile const&) = delete; TempFile(TempFile&&) = delete; TempFile& operator=(TempFile&&) = delete; TempFile(); ~TempFile(); std::FILE* getFile(); std::string getContents(); private: std::FILE* m_file = nullptr; #if defined(_MSC_VER) char m_buffer[L_tmpnam] = { 0 }; #endif }; class OutputRedirect { public: OutputRedirect(OutputRedirect const&) = delete; OutputRedirect& operator=(OutputRedirect const&) = delete; OutputRedirect(OutputRedirect&&) = delete; OutputRedirect& operator=(OutputRedirect&&) = delete; OutputRedirect(std::string& stdout_dest, std::string& stderr_dest); ~OutputRedirect(); private: int m_originalStdout = -1; int m_originalStderr = -1; TempFile m_stdoutFile; TempFile m_stderrFile; std::string& m_stdoutDest; std::string& m_stderrDest; }; #endif } // end namespace Catch #endif // TWOBLUECUBES_CATCH_OUTPUT_REDIRECT_H // end catch_output_redirect.h #include #include #include #include #include #if defined(CATCH_CONFIG_NEW_CAPTURE) #if defined(_MSC_VER) #include //_dup and _dup2 #define dup _dup #define dup2 _dup2 #define fileno _fileno #else #include // dup and dup2 #endif #endif namespace Catch { RedirectedStream::RedirectedStream( std::ostream& originalStream, std::ostream& redirectionStream ) : m_originalStream( originalStream ), m_redirectionStream( redirectionStream ), m_prevBuf( m_originalStream.rdbuf() ) { m_originalStream.rdbuf( m_redirectionStream.rdbuf() ); } RedirectedStream::~RedirectedStream() { m_originalStream.rdbuf( m_prevBuf ); } RedirectedStdOut::RedirectedStdOut() : m_cout( Catch::cout(), m_rss.get() ) {} auto RedirectedStdOut::str() const -> std::string { return m_rss.str(); } RedirectedStdErr::RedirectedStdErr() : m_cerr( Catch::cerr(), m_rss.get() ), m_clog( Catch::clog(), m_rss.get() ) {} auto RedirectedStdErr::str() const -> std::string { return m_rss.str(); } #if defined(CATCH_CONFIG_NEW_CAPTURE) #if defined(_MSC_VER) TempFile::TempFile() { if (tmpnam_s(m_buffer)) { throw std::runtime_error("Could not get a temp filename"); } if (fopen_s(&m_file, m_buffer, "w")) { char buffer[100]; if (strerror_s(buffer, errno)) { throw std::runtime_error("Could not translate errno to string"); } throw std::runtime_error("Could not open the temp file: " + std::string(m_buffer) + buffer); } } #else TempFile::TempFile() { m_file = std::tmpfile(); if (!m_file) { throw std::runtime_error("Could not create a temp file."); } } #endif TempFile::~TempFile() { // TBD: What to do about errors here? std::fclose(m_file); // We manually create the file on Windows only, on Linux // it will be autodeleted #if defined(_MSC_VER) std::remove(m_buffer); #endif } FILE* TempFile::getFile() { return m_file; } std::string TempFile::getContents() { std::stringstream sstr; char buffer[100] = {}; std::rewind(m_file); while (std::fgets(buffer, sizeof(buffer), m_file)) { sstr << buffer; } return sstr.str(); } OutputRedirect::OutputRedirect(std::string& stdout_dest, std::string& stderr_dest) : m_originalStdout(dup(1)), m_originalStderr(dup(2)), m_stdoutDest(stdout_dest), m_stderrDest(stderr_dest) { dup2(fileno(m_stdoutFile.getFile()), 1); dup2(fileno(m_stderrFile.getFile()), 2); } OutputRedirect::~OutputRedirect() { Catch::cout() << std::flush; fflush(stdout); // Since we support overriding these streams, we flush cerr // even though std::cerr is unbuffered Catch::cerr() << std::flush; Catch::clog() << std::flush; fflush(stderr); dup2(m_originalStdout, 1); dup2(m_originalStderr, 2); m_stdoutDest += m_stdoutFile.getContents(); m_stderrDest += m_stderrFile.getContents(); } #endif // CATCH_CONFIG_NEW_CAPTURE } // namespace Catch #if defined(CATCH_CONFIG_NEW_CAPTURE) #if defined(_MSC_VER) #undef dup #undef dup2 #undef fileno #endif #endif // end catch_output_redirect.cpp // start catch_random_number_generator.cpp // start catch_random_number_generator.h #include #include namespace Catch { struct IConfig; std::mt19937& rng(); void seedRng( IConfig const& config ); unsigned int rngSeed(); } // end catch_random_number_generator.h namespace Catch { std::mt19937& rng() { static std::mt19937 s_rng; return s_rng; } void seedRng( IConfig const& config ) { if( config.rngSeed() != 0 ) { std::srand( config.rngSeed() ); rng().seed( config.rngSeed() ); } } unsigned int rngSeed() { return getCurrentContext().getConfig()->rngSeed(); } } // end catch_random_number_generator.cpp // start catch_registry_hub.cpp // start catch_test_case_registry_impl.h #include #include #include #include namespace Catch { class TestCase; struct IConfig; std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ); bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); void enforceNoDuplicateTestCases( std::vector const& functions ); std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); std::vector const& getAllTestCasesSorted( IConfig const& config ); class TestRegistry : public ITestCaseRegistry { public: virtual ~TestRegistry() = default; virtual void registerTest( TestCase const& testCase ); std::vector const& getAllTests() const override; std::vector const& getAllTestsSorted( IConfig const& config ) const override; private: std::vector m_functions; mutable RunTests::InWhatOrder m_currentSortOrder = RunTests::InDeclarationOrder; mutable std::vector m_sortedFunctions; std::size_t m_unnamedCount = 0; std::ios_base::Init m_ostreamInit; // Forces cout/ cerr to be initialised }; /////////////////////////////////////////////////////////////////////////// class TestInvokerAsFunction : public ITestInvoker { void(*m_testAsFunction)(); public: TestInvokerAsFunction( void(*testAsFunction)() ) noexcept; void invoke() const override; }; std::string extractClassName( StringRef const& classOrQualifiedMethodName ); /////////////////////////////////////////////////////////////////////////// } // end namespace Catch // end catch_test_case_registry_impl.h // start catch_reporter_registry.h #include namespace Catch { class ReporterRegistry : public IReporterRegistry { public: ~ReporterRegistry() override; IStreamingReporterPtr create( std::string const& name, IConfigPtr const& config ) const override; void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ); void registerListener( IReporterFactoryPtr const& factory ); FactoryMap const& getFactories() const override; Listeners const& getListeners() const override; private: FactoryMap m_factories; Listeners m_listeners; }; } // end catch_reporter_registry.h // start catch_tag_alias_registry.h // start catch_tag_alias.h #include namespace Catch { struct TagAlias { TagAlias(std::string const& _tag, SourceLineInfo _lineInfo); std::string tag; SourceLineInfo lineInfo; }; } // end namespace Catch // end catch_tag_alias.h #include namespace Catch { class TagAliasRegistry : public ITagAliasRegistry { public: ~TagAliasRegistry() override; TagAlias const* find( std::string const& alias ) const override; std::string expandAliases( std::string const& unexpandedTestSpec ) const override; void add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ); private: std::map m_registry; }; } // end namespace Catch // end catch_tag_alias_registry.h // start catch_startup_exception_registry.h #include #include namespace Catch { class StartupExceptionRegistry { public: void add(std::exception_ptr const& exception) noexcept; std::vector const& getExceptions() const noexcept; private: std::vector m_exceptions; }; } // end namespace Catch // end catch_startup_exception_registry.h namespace Catch { namespace { class RegistryHub : public IRegistryHub, public IMutableRegistryHub, private NonCopyable { public: // IRegistryHub RegistryHub() = default; IReporterRegistry const& getReporterRegistry() const override { return m_reporterRegistry; } ITestCaseRegistry const& getTestCaseRegistry() const override { return m_testCaseRegistry; } IExceptionTranslatorRegistry& getExceptionTranslatorRegistry() override { return m_exceptionTranslatorRegistry; } ITagAliasRegistry const& getTagAliasRegistry() const override { return m_tagAliasRegistry; } StartupExceptionRegistry const& getStartupExceptionRegistry() const override { return m_exceptionRegistry; } public: // IMutableRegistryHub void registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) override { m_reporterRegistry.registerReporter( name, factory ); } void registerListener( IReporterFactoryPtr const& factory ) override { m_reporterRegistry.registerListener( factory ); } void registerTest( TestCase const& testInfo ) override { m_testCaseRegistry.registerTest( testInfo ); } void registerTranslator( const IExceptionTranslator* translator ) override { m_exceptionTranslatorRegistry.registerTranslator( translator ); } void registerTagAlias( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) override { m_tagAliasRegistry.add( alias, tag, lineInfo ); } void registerStartupException() noexcept override { m_exceptionRegistry.add(std::current_exception()); } private: TestRegistry m_testCaseRegistry; ReporterRegistry m_reporterRegistry; ExceptionTranslatorRegistry m_exceptionTranslatorRegistry; TagAliasRegistry m_tagAliasRegistry; StartupExceptionRegistry m_exceptionRegistry; }; // Single, global, instance RegistryHub*& getTheRegistryHub() { static RegistryHub* theRegistryHub = nullptr; if( !theRegistryHub ) theRegistryHub = new RegistryHub(); return theRegistryHub; } } IRegistryHub& getRegistryHub() { return *getTheRegistryHub(); } IMutableRegistryHub& getMutableRegistryHub() { return *getTheRegistryHub(); } void cleanUp() { delete getTheRegistryHub(); getTheRegistryHub() = nullptr; cleanUpContext(); ReusableStringStream::cleanup(); } std::string translateActiveException() { return getRegistryHub().getExceptionTranslatorRegistry().translateActiveException(); } } // end namespace Catch // end catch_registry_hub.cpp // start catch_reporter_registry.cpp namespace Catch { ReporterRegistry::~ReporterRegistry() = default; IStreamingReporterPtr ReporterRegistry::create( std::string const& name, IConfigPtr const& config ) const { auto it = m_factories.find( name ); if( it == m_factories.end() ) return nullptr; return it->second->create( ReporterConfig( config ) ); } void ReporterRegistry::registerReporter( std::string const& name, IReporterFactoryPtr const& factory ) { m_factories.emplace(name, factory); } void ReporterRegistry::registerListener( IReporterFactoryPtr const& factory ) { m_listeners.push_back( factory ); } IReporterRegistry::FactoryMap const& ReporterRegistry::getFactories() const { return m_factories; } IReporterRegistry::Listeners const& ReporterRegistry::getListeners() const { return m_listeners; } } // end catch_reporter_registry.cpp // start catch_result_type.cpp namespace Catch { bool isOk( ResultWas::OfType resultType ) { return ( resultType & ResultWas::FailureBit ) == 0; } bool isJustInfo( int flags ) { return flags == ResultWas::Info; } ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs ) { return static_cast( static_cast( lhs ) | static_cast( rhs ) ); } bool shouldContinueOnFailure( int flags ) { return ( flags & ResultDisposition::ContinueOnFailure ) != 0; } bool shouldSuppressFailure( int flags ) { return ( flags & ResultDisposition::SuppressFail ) != 0; } } // end namespace Catch // end catch_result_type.cpp // start catch_run_context.cpp #include #include #include namespace Catch { RunContext::RunContext(IConfigPtr const& _config, IStreamingReporterPtr&& reporter) : m_runInfo(_config->name()), m_context(getCurrentMutableContext()), m_config(_config), m_reporter(std::move(reporter)), m_lastAssertionInfo{ StringRef(), SourceLineInfo("",0), StringRef(), ResultDisposition::Normal }, m_includeSuccessfulResults( m_config->includeSuccessfulResults() || m_reporter->getPreferences().shouldReportAllAssertions ) { m_context.setRunner(this); m_context.setConfig(m_config); m_context.setResultCapture(this); m_reporter->testRunStarting(m_runInfo); } RunContext::~RunContext() { m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, aborting())); } void RunContext::testGroupStarting(std::string const& testSpec, std::size_t groupIndex, std::size_t groupsCount) { m_reporter->testGroupStarting(GroupInfo(testSpec, groupIndex, groupsCount)); } void RunContext::testGroupEnded(std::string const& testSpec, Totals const& totals, std::size_t groupIndex, std::size_t groupsCount) { m_reporter->testGroupEnded(TestGroupStats(GroupInfo(testSpec, groupIndex, groupsCount), totals, aborting())); } Totals RunContext::runTest(TestCase const& testCase) { Totals prevTotals = m_totals; std::string redirectedCout; std::string redirectedCerr; auto const& testInfo = testCase.getTestCaseInfo(); m_reporter->testCaseStarting(testInfo); m_activeTestCase = &testCase; ITracker& rootTracker = m_trackerContext.startRun(); assert(rootTracker.isSectionTracker()); static_cast(rootTracker).addInitialFilters(m_config->getSectionsToRun()); do { m_trackerContext.startCycle(); m_testCaseTracker = &SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(testInfo.name, testInfo.lineInfo)); runCurrentTest(redirectedCout, redirectedCerr); } while (!m_testCaseTracker->isSuccessfullyCompleted() && !aborting()); Totals deltaTotals = m_totals.delta(prevTotals); if (testInfo.expectedToFail() && deltaTotals.testCases.passed > 0) { deltaTotals.assertions.failed++; deltaTotals.testCases.passed--; deltaTotals.testCases.failed++; } m_totals.testCases += deltaTotals.testCases; m_reporter->testCaseEnded(TestCaseStats(testInfo, deltaTotals, redirectedCout, redirectedCerr, aborting())); m_activeTestCase = nullptr; m_testCaseTracker = nullptr; return deltaTotals; } IConfigPtr RunContext::config() const { return m_config; } IStreamingReporter& RunContext::reporter() const { return *m_reporter; } void RunContext::assertionEnded(AssertionResult const & result) { if (result.getResultType() == ResultWas::Ok) { m_totals.assertions.passed++; m_lastAssertionPassed = true; } else if (!result.isOk()) { m_lastAssertionPassed = false; if( m_activeTestCase->getTestCaseInfo().okToFail() ) m_totals.assertions.failedButOk++; else m_totals.assertions.failed++; } else { m_lastAssertionPassed = true; } // We have no use for the return value (whether messages should be cleared), because messages were made scoped // and should be let to clear themselves out. static_cast(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); // Reset working state resetAssertionInfo(); m_lastResult = result; } void RunContext::resetAssertionInfo() { m_lastAssertionInfo.macroName = StringRef(); m_lastAssertionInfo.capturedExpression = "{Unknown expression after the reported line}"_sr; } bool RunContext::sectionStarted(SectionInfo const & sectionInfo, Counts & assertions) { ITracker& sectionTracker = SectionTracker::acquire(m_trackerContext, TestCaseTracking::NameAndLocation(sectionInfo.name, sectionInfo.lineInfo)); if (!sectionTracker.isOpen()) return false; m_activeSections.push_back(§ionTracker); m_lastAssertionInfo.lineInfo = sectionInfo.lineInfo; m_reporter->sectionStarting(sectionInfo); assertions = m_totals.assertions; return true; } bool RunContext::testForMissingAssertions(Counts& assertions) { if (assertions.total() != 0) return false; if (!m_config->warnAboutMissingAssertions()) return false; if (m_trackerContext.currentTracker().hasChildren()) return false; m_totals.assertions.failed++; assertions.failed++; return true; } void RunContext::sectionEnded(SectionEndInfo const & endInfo) { Counts assertions = m_totals.assertions - endInfo.prevAssertions; bool missingAssertions = testForMissingAssertions(assertions); if (!m_activeSections.empty()) { m_activeSections.back()->close(); m_activeSections.pop_back(); } m_reporter->sectionEnded(SectionStats(endInfo.sectionInfo, assertions, endInfo.durationInSeconds, missingAssertions)); m_messages.clear(); } void RunContext::sectionEndedEarly(SectionEndInfo const & endInfo) { if (m_unfinishedSections.empty()) m_activeSections.back()->fail(); else m_activeSections.back()->close(); m_activeSections.pop_back(); m_unfinishedSections.push_back(endInfo); } void RunContext::benchmarkStarting( BenchmarkInfo const& info ) { m_reporter->benchmarkStarting( info ); } void RunContext::benchmarkEnded( BenchmarkStats const& stats ) { m_reporter->benchmarkEnded( stats ); } void RunContext::pushScopedMessage(MessageInfo const & message) { m_messages.push_back(message); } void RunContext::popScopedMessage(MessageInfo const & message) { m_messages.erase(std::remove(m_messages.begin(), m_messages.end(), message), m_messages.end()); } std::string RunContext::getCurrentTestName() const { return m_activeTestCase ? m_activeTestCase->getTestCaseInfo().name : std::string(); } const AssertionResult * RunContext::getLastResult() const { return &(*m_lastResult); } void RunContext::exceptionEarlyReported() { m_shouldReportUnexpected = false; } void RunContext::handleFatalErrorCondition( StringRef message ) { // First notify reporter that bad things happened m_reporter->fatalErrorEncountered(message); // Don't rebuild the result -- the stringification itself can cause more fatal errors // Instead, fake a result data. AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } ); tempResult.message = message; AssertionResult result(m_lastAssertionInfo, tempResult); assertionEnded(result); handleUnfinishedSections(); // Recreate section for test case (as we will lose the one that was in scope) auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); Counts assertions; assertions.failed = 1; SectionStats testCaseSectionStats(testCaseSection, assertions, 0, false); m_reporter->sectionEnded(testCaseSectionStats); auto const& testInfo = m_activeTestCase->getTestCaseInfo(); Totals deltaTotals; deltaTotals.testCases.failed = 1; deltaTotals.assertions.failed = 1; m_reporter->testCaseEnded(TestCaseStats(testInfo, deltaTotals, std::string(), std::string(), false)); m_totals.testCases.failed++; testGroupEnded(std::string(), m_totals, 1, 1); m_reporter->testRunEnded(TestRunStats(m_runInfo, m_totals, false)); } bool RunContext::lastAssertionPassed() { return m_lastAssertionPassed; } void RunContext::assertionPassed() { m_lastAssertionPassed = true; ++m_totals.assertions.passed; resetAssertionInfo(); } bool RunContext::aborting() const { return m_totals.assertions.failed == static_cast(m_config->abortAfter()); } void RunContext::runCurrentTest(std::string & redirectedCout, std::string & redirectedCerr) { auto const& testCaseInfo = m_activeTestCase->getTestCaseInfo(); SectionInfo testCaseSection(testCaseInfo.lineInfo, testCaseInfo.name); m_reporter->sectionStarting(testCaseSection); Counts prevAssertions = m_totals.assertions; double duration = 0; m_shouldReportUnexpected = true; m_lastAssertionInfo = { "TEST_CASE"_sr, testCaseInfo.lineInfo, StringRef(), ResultDisposition::Normal }; seedRng(*m_config); Timer timer; try { if (m_reporter->getPreferences().shouldRedirectStdOut) { #if !defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) RedirectedStdOut redirectedStdOut; RedirectedStdErr redirectedStdErr; timer.start(); invokeActiveTestCase(); redirectedCout += redirectedStdOut.str(); redirectedCerr += redirectedStdErr.str(); #else OutputRedirect r(redirectedCout, redirectedCerr); timer.start(); invokeActiveTestCase(); #endif } else { timer.start(); invokeActiveTestCase(); } duration = timer.getElapsedSeconds(); } catch (TestFailureException&) { // This just means the test was aborted due to failure } catch (...) { // Under CATCH_CONFIG_FAST_COMPILE, unexpected exceptions under REQUIRE assertions // are reported without translation at the point of origin. if( m_shouldReportUnexpected ) { AssertionReaction dummyReaction; handleUnexpectedInflightException( m_lastAssertionInfo, translateActiveException(), dummyReaction ); } } Counts assertions = m_totals.assertions - prevAssertions; bool missingAssertions = testForMissingAssertions(assertions); m_testCaseTracker->close(); handleUnfinishedSections(); m_messages.clear(); SectionStats testCaseSectionStats(testCaseSection, assertions, duration, missingAssertions); m_reporter->sectionEnded(testCaseSectionStats); } void RunContext::invokeActiveTestCase() { FatalConditionHandler fatalConditionHandler; // Handle signals m_activeTestCase->invoke(); fatalConditionHandler.reset(); } void RunContext::handleUnfinishedSections() { // If sections ended prematurely due to an exception we stored their // infos here so we can tear them down outside the unwind process. for (auto it = m_unfinishedSections.rbegin(), itEnd = m_unfinishedSections.rend(); it != itEnd; ++it) sectionEnded(*it); m_unfinishedSections.clear(); } void RunContext::handleExpr( AssertionInfo const& info, ITransientExpression const& expr, AssertionReaction& reaction ) { m_reporter->assertionStarting( info ); bool negated = isFalseTest( info.resultDisposition ); bool result = expr.getResult() != negated; if( result ) { if (!m_includeSuccessfulResults) { assertionPassed(); } else { reportExpr(info, ResultWas::Ok, &expr, negated); } } else { reportExpr(info, ResultWas::ExpressionFailed, &expr, negated ); populateReaction( reaction ); } } void RunContext::reportExpr( AssertionInfo const &info, ResultWas::OfType resultType, ITransientExpression const *expr, bool negated ) { m_lastAssertionInfo = info; AssertionResultData data( resultType, LazyExpression( negated ) ); AssertionResult assertionResult{ info, data }; assertionResult.m_resultData.lazyExpression.m_transientExpression = expr; assertionEnded( assertionResult ); } void RunContext::handleMessage( AssertionInfo const& info, ResultWas::OfType resultType, StringRef const& message, AssertionReaction& reaction ) { m_reporter->assertionStarting( info ); m_lastAssertionInfo = info; AssertionResultData data( resultType, LazyExpression( false ) ); data.message = message; AssertionResult assertionResult{ m_lastAssertionInfo, data }; assertionEnded( assertionResult ); if( !assertionResult.isOk() ) populateReaction( reaction ); } void RunContext::handleUnexpectedExceptionNotThrown( AssertionInfo const& info, AssertionReaction& reaction ) { handleNonExpr(info, Catch::ResultWas::DidntThrowException, reaction); } void RunContext::handleUnexpectedInflightException( AssertionInfo const& info, std::string const& message, AssertionReaction& reaction ) { m_lastAssertionInfo = info; AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) ); data.message = message; AssertionResult assertionResult{ info, data }; assertionEnded( assertionResult ); populateReaction( reaction ); } void RunContext::populateReaction( AssertionReaction& reaction ) { reaction.shouldDebugBreak = m_config->shouldDebugBreak(); reaction.shouldThrow = aborting() || (m_lastAssertionInfo.resultDisposition & ResultDisposition::Normal); } void RunContext::handleIncomplete( AssertionInfo const& info ) { m_lastAssertionInfo = info; AssertionResultData data( ResultWas::ThrewException, LazyExpression( false ) ); data.message = "Exception translation was disabled by CATCH_CONFIG_FAST_COMPILE"; AssertionResult assertionResult{ info, data }; assertionEnded( assertionResult ); } void RunContext::handleNonExpr( AssertionInfo const &info, ResultWas::OfType resultType, AssertionReaction &reaction ) { m_lastAssertionInfo = info; AssertionResultData data( resultType, LazyExpression( false ) ); AssertionResult assertionResult{ info, data }; assertionEnded( assertionResult ); if( !assertionResult.isOk() ) populateReaction( reaction ); } IResultCapture& getResultCapture() { if (auto* capture = getCurrentContext().getResultCapture()) return *capture; else CATCH_INTERNAL_ERROR("No result capture instance"); } } // end catch_run_context.cpp // start catch_section.cpp namespace Catch { Section::Section( SectionInfo const& info ) : m_info( info ), m_sectionIncluded( getResultCapture().sectionStarted( m_info, m_assertions ) ) { m_timer.start(); } Section::~Section() { if( m_sectionIncluded ) { SectionEndInfo endInfo{ m_info, m_assertions, m_timer.getElapsedSeconds() }; if( uncaught_exceptions() ) getResultCapture().sectionEndedEarly( endInfo ); else getResultCapture().sectionEnded( endInfo ); } } // This indicates whether the section should be executed or not Section::operator bool() const { return m_sectionIncluded; } } // end namespace Catch // end catch_section.cpp // start catch_section_info.cpp namespace Catch { SectionInfo::SectionInfo ( SourceLineInfo const& _lineInfo, std::string const& _name ) : name( _name ), lineInfo( _lineInfo ) {} } // end namespace Catch // end catch_section_info.cpp // start catch_session.cpp // start catch_session.h #include namespace Catch { class Session : NonCopyable { public: Session(); ~Session() override; void showHelp() const; void libIdentify(); int applyCommandLine( int argc, char const * const * argv ); void useConfigData( ConfigData const& configData ); int run( int argc, char* argv[] ); #if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(UNICODE) int run( int argc, wchar_t* const argv[] ); #endif int run(); clara::Parser const& cli() const; void cli( clara::Parser const& newParser ); ConfigData& configData(); Config& config(); private: int runInternal(); clara::Parser m_cli; ConfigData m_configData; std::shared_ptr m_config; bool m_startupExceptions = false; }; } // end namespace Catch // end catch_session.h // start catch_version.h #include namespace Catch { // Versioning information struct Version { Version( Version const& ) = delete; Version& operator=( Version const& ) = delete; Version( unsigned int _majorVersion, unsigned int _minorVersion, unsigned int _patchNumber, char const * const _branchName, unsigned int _buildNumber ); unsigned int const majorVersion; unsigned int const minorVersion; unsigned int const patchNumber; // buildNumber is only used if branchName is not null char const * const branchName; unsigned int const buildNumber; friend std::ostream& operator << ( std::ostream& os, Version const& version ); }; Version const& libraryVersion(); } // end catch_version.h #include #include namespace Catch { namespace { const int MaxExitCode = 255; IStreamingReporterPtr createReporter(std::string const& reporterName, IConfigPtr const& config) { auto reporter = Catch::getRegistryHub().getReporterRegistry().create(reporterName, config); CATCH_ENFORCE(reporter, "No reporter registered with name: '" << reporterName << "'"); return reporter; } IStreamingReporterPtr makeReporter(std::shared_ptr const& config) { if (Catch::getRegistryHub().getReporterRegistry().getListeners().empty()) { return createReporter(config->getReporterName(), config); } auto multi = std::unique_ptr(new ListeningReporter); auto const& listeners = Catch::getRegistryHub().getReporterRegistry().getListeners(); for (auto const& listener : listeners) { multi->addListener(listener->create(Catch::ReporterConfig(config))); } multi->addReporter(createReporter(config->getReporterName(), config)); return std::move(multi); } Catch::Totals runTests(std::shared_ptr const& config) { // FixMe: Add listeners in order first, then add reporters. auto reporter = makeReporter(config); RunContext context(config, std::move(reporter)); Totals totals; context.testGroupStarting(config->name(), 1, 1); TestSpec testSpec = config->testSpec(); auto const& allTestCases = getAllTestCasesSorted(*config); for (auto const& testCase : allTestCases) { if (!context.aborting() && matchTest(testCase, testSpec, *config)) totals += context.runTest(testCase); else context.reporter().skipTest(testCase); } if (config->warnAboutNoTests() && totals.testCases.total() == 0) { ReusableStringStream testConfig; bool first = true; for (const auto& input : config->getTestsOrTags()) { if (!first) { testConfig << ' '; } first = false; testConfig << input; } context.reporter().noMatchingTestCases(testConfig.str()); totals.error = -1; } context.testGroupEnded(config->name(), totals, 1, 1); return totals; } void applyFilenamesAsTags(Catch::IConfig const& config) { auto& tests = const_cast&>(getAllTestCasesSorted(config)); for (auto& testCase : tests) { auto tags = testCase.tags; std::string filename = testCase.lineInfo.file; auto lastSlash = filename.find_last_of("\\/"); if (lastSlash != std::string::npos) { filename.erase(0, lastSlash); filename[0] = '#'; } auto lastDot = filename.find_last_of('.'); if (lastDot != std::string::npos) { filename.erase(lastDot); } tags.push_back(std::move(filename)); setTags(testCase, tags); } } } // anon namespace Session::Session() { static bool alreadyInstantiated = false; if( alreadyInstantiated ) { try { CATCH_INTERNAL_ERROR( "Only one instance of Catch::Session can ever be used" ); } catch(...) { getMutableRegistryHub().registerStartupException(); } } const auto& exceptions = getRegistryHub().getStartupExceptionRegistry().getExceptions(); if ( !exceptions.empty() ) { m_startupExceptions = true; Colour colourGuard( Colour::Red ); Catch::cerr() << "Errors occurred during startup!" << '\n'; // iterate over all exceptions and notify user for ( const auto& ex_ptr : exceptions ) { try { std::rethrow_exception(ex_ptr); } catch ( std::exception const& ex ) { Catch::cerr() << Column( ex.what() ).indent(2) << '\n'; } } } alreadyInstantiated = true; m_cli = makeCommandLineParser( m_configData ); } Session::~Session() { Catch::cleanUp(); } void Session::showHelp() const { Catch::cout() << "\nCatch v" << libraryVersion() << "\n" << m_cli << std::endl << "For more detailed usage please see the project docs\n" << std::endl; } void Session::libIdentify() { Catch::cout() << std::left << std::setw(16) << "description: " << "A Catch test executable\n" << std::left << std::setw(16) << "category: " << "testframework\n" << std::left << std::setw(16) << "framework: " << "Catch Test\n" << std::left << std::setw(16) << "version: " << libraryVersion() << std::endl; } int Session::applyCommandLine( int argc, char const * const * argv ) { if( m_startupExceptions ) return 1; auto result = m_cli.parse( clara::Args( argc, argv ) ); if( !result ) { Catch::cerr() << Colour( Colour::Red ) << "\nError(s) in input:\n" << Column( result.errorMessage() ).indent( 2 ) << "\n\n"; Catch::cerr() << "Run with -? for usage\n" << std::endl; return MaxExitCode; } if( m_configData.showHelp ) showHelp(); if( m_configData.libIdentify ) libIdentify(); m_config.reset(); return 0; } void Session::useConfigData( ConfigData const& configData ) { m_configData = configData; m_config.reset(); } int Session::run( int argc, char* argv[] ) { if( m_startupExceptions ) return 1; int returnCode = applyCommandLine( argc, argv ); if( returnCode == 0 ) returnCode = run(); return returnCode; } #if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(UNICODE) int Session::run( int argc, wchar_t* const argv[] ) { char **utf8Argv = new char *[ argc ]; for ( int i = 0; i < argc; ++i ) { int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL ); utf8Argv[ i ] = new char[ bufSize ]; WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL ); } int returnCode = run( argc, utf8Argv ); for ( int i = 0; i < argc; ++i ) delete [] utf8Argv[ i ]; delete [] utf8Argv; return returnCode; } #endif int Session::run() { if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeStart ) != 0 ) { Catch::cout() << "...waiting for enter/ return before starting" << std::endl; static_cast(std::getchar()); } int exitCode = runInternal(); if( ( m_configData.waitForKeypress & WaitForKeypress::BeforeExit ) != 0 ) { Catch::cout() << "...waiting for enter/ return before exiting, with code: " << exitCode << std::endl; static_cast(std::getchar()); } return exitCode; } clara::Parser const& Session::cli() const { return m_cli; } void Session::cli( clara::Parser const& newParser ) { m_cli = newParser; } ConfigData& Session::configData() { return m_configData; } Config& Session::config() { if( !m_config ) m_config = std::make_shared( m_configData ); return *m_config; } int Session::runInternal() { if( m_startupExceptions ) return 1; if( m_configData.showHelp || m_configData.libIdentify ) return 0; try { config(); // Force config to be constructed seedRng( *m_config ); if( m_configData.filenamesAsTags ) applyFilenamesAsTags( *m_config ); // Handle list request if( Option listed = list( config() ) ) return static_cast( *listed ); auto totals = runTests( m_config ); // Note that on unices only the lower 8 bits are usually used, clamping // the return value to 255 prevents false negative when some multiple // of 256 tests has failed return (std::min) (MaxExitCode, (std::max) (totals.error, static_cast(totals.assertions.failed))); } catch( std::exception& ex ) { Catch::cerr() << ex.what() << std::endl; return MaxExitCode; } } } // end namespace Catch // end catch_session.cpp // start catch_startup_exception_registry.cpp namespace Catch { void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept { try { m_exceptions.push_back(exception); } catch(...) { // If we run out of memory during start-up there's really not a lot more we can do about it std::terminate(); } } std::vector const& StartupExceptionRegistry::getExceptions() const noexcept { return m_exceptions; } } // end namespace Catch // end catch_startup_exception_registry.cpp // start catch_stream.cpp #include #include #include #include #include #include #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wexit-time-destructors" #endif namespace Catch { Catch::IStream::~IStream() = default; namespace detail { namespace { template class StreamBufImpl : public std::streambuf { char data[bufferSize]; WriterF m_writer; public: StreamBufImpl() { setp( data, data + sizeof(data) ); } ~StreamBufImpl() noexcept { StreamBufImpl::sync(); } private: int overflow( int c ) override { sync(); if( c != EOF ) { if( pbase() == epptr() ) m_writer( std::string( 1, static_cast( c ) ) ); else sputc( static_cast( c ) ); } return 0; } int sync() override { if( pbase() != pptr() ) { m_writer( std::string( pbase(), static_cast( pptr() - pbase() ) ) ); setp( pbase(), epptr() ); } return 0; } }; /////////////////////////////////////////////////////////////////////////// struct OutputDebugWriter { void operator()( std::string const&str ) { writeToDebugConsole( str ); } }; /////////////////////////////////////////////////////////////////////////// class FileStream : public IStream { mutable std::ofstream m_ofs; public: FileStream( StringRef filename ) { m_ofs.open( filename.c_str() ); CATCH_ENFORCE( !m_ofs.fail(), "Unable to open file: '" << filename << "'" ); } ~FileStream() override = default; public: // IStream std::ostream& stream() const override { return m_ofs; } }; /////////////////////////////////////////////////////////////////////////// class CoutStream : public IStream { mutable std::ostream m_os; public: // Store the streambuf from cout up-front because // cout may get redirected when running tests CoutStream() : m_os( Catch::cout().rdbuf() ) {} ~CoutStream() override = default; public: // IStream std::ostream& stream() const override { return m_os; } }; /////////////////////////////////////////////////////////////////////////// class DebugOutStream : public IStream { std::unique_ptr> m_streamBuf; mutable std::ostream m_os; public: DebugOutStream() : m_streamBuf( new StreamBufImpl() ), m_os( m_streamBuf.get() ) {} ~DebugOutStream() override = default; public: // IStream std::ostream& stream() const override { return m_os; } }; }} // namespace anon::detail /////////////////////////////////////////////////////////////////////////// auto makeStream( StringRef const &filename ) -> IStream const* { if( filename.empty() ) return new detail::CoutStream(); else if( filename[0] == '%' ) { if( filename == "%debug" ) return new detail::DebugOutStream(); else CATCH_ERROR( "Unrecognised stream: '" << filename << "'" ); } else return new detail::FileStream( filename ); } // This class encapsulates the idea of a pool of ostringstreams that can be reused. struct StringStreams { std::vector> m_streams; std::vector m_unused; std::ostringstream m_referenceStream; // Used for copy state/ flags from static StringStreams* s_instance; auto add() -> std::size_t { if( m_unused.empty() ) { m_streams.push_back( std::unique_ptr( new std::ostringstream ) ); return m_streams.size()-1; } else { auto index = m_unused.back(); m_unused.pop_back(); return index; } } void release( std::size_t index ) { m_streams[index]->copyfmt( m_referenceStream ); // Restore initial flags and other state m_unused.push_back(index); } // !TBD: put in TLS static auto instance() -> StringStreams& { if( !s_instance ) s_instance = new StringStreams(); return *s_instance; } static void cleanup() { delete s_instance; s_instance = nullptr; } }; StringStreams* StringStreams::s_instance = nullptr; void ReusableStringStream::cleanup() { StringStreams::cleanup(); } ReusableStringStream::ReusableStringStream() : m_index( StringStreams::instance().add() ), m_oss( StringStreams::instance().m_streams[m_index].get() ) {} ReusableStringStream::~ReusableStringStream() { static_cast( m_oss )->str(""); m_oss->clear(); StringStreams::instance().release( m_index ); } auto ReusableStringStream::str() const -> std::string { return static_cast( m_oss )->str(); } /////////////////////////////////////////////////////////////////////////// #ifndef CATCH_CONFIG_NOSTDOUT // If you #define this you must implement these functions std::ostream& cout() { return std::cout; } std::ostream& cerr() { return std::cerr; } std::ostream& clog() { return std::clog; } #endif } #if defined(__clang__) # pragma clang diagnostic pop #endif // end catch_stream.cpp // start catch_string_manip.cpp #include #include #include #include namespace Catch { namespace { char toLowerCh(char c) { return static_cast( std::tolower( c ) ); } } bool startsWith( std::string const& s, std::string const& prefix ) { return s.size() >= prefix.size() && std::equal(prefix.begin(), prefix.end(), s.begin()); } bool startsWith( std::string const& s, char prefix ) { return !s.empty() && s[0] == prefix; } bool endsWith( std::string const& s, std::string const& suffix ) { return s.size() >= suffix.size() && std::equal(suffix.rbegin(), suffix.rend(), s.rbegin()); } bool endsWith( std::string const& s, char suffix ) { return !s.empty() && s[s.size()-1] == suffix; } bool contains( std::string const& s, std::string const& infix ) { return s.find( infix ) != std::string::npos; } void toLowerInPlace( std::string& s ) { std::transform( s.begin(), s.end(), s.begin(), toLowerCh ); } std::string toLower( std::string const& s ) { std::string lc = s; toLowerInPlace( lc ); return lc; } std::string trim( std::string const& str ) { static char const* whitespaceChars = "\n\r\t "; std::string::size_type start = str.find_first_not_of( whitespaceChars ); std::string::size_type end = str.find_last_not_of( whitespaceChars ); return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string(); } bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) { bool replaced = false; std::size_t i = str.find( replaceThis ); while( i != std::string::npos ) { replaced = true; str = str.substr( 0, i ) + withThis + str.substr( i+replaceThis.size() ); if( i < str.size()-withThis.size() ) i = str.find( replaceThis, i+withThis.size() ); else i = std::string::npos; } return replaced; } pluralise::pluralise( std::size_t count, std::string const& label ) : m_count( count ), m_label( label ) {} std::ostream& operator << ( std::ostream& os, pluralise const& pluraliser ) { os << pluraliser.m_count << ' ' << pluraliser.m_label; if( pluraliser.m_count != 1 ) os << 's'; return os; } } // end catch_string_manip.cpp // start catch_stringref.cpp #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wexit-time-destructors" #endif #include #include #include namespace { const uint32_t byte_2_lead = 0xC0; const uint32_t byte_3_lead = 0xE0; const uint32_t byte_4_lead = 0xF0; } namespace Catch { StringRef::StringRef( char const* rawChars ) noexcept : StringRef( rawChars, static_cast(std::strlen(rawChars) ) ) {} StringRef::operator std::string() const { return std::string( m_start, m_size ); } void StringRef::swap( StringRef& other ) noexcept { std::swap( m_start, other.m_start ); std::swap( m_size, other.m_size ); std::swap( m_data, other.m_data ); } auto StringRef::c_str() const -> char const* { if( isSubstring() ) const_cast( this )->takeOwnership(); return m_start; } auto StringRef::currentData() const noexcept -> char const* { return m_start; } auto StringRef::isOwned() const noexcept -> bool { return m_data != nullptr; } auto StringRef::isSubstring() const noexcept -> bool { return m_start[m_size] != '\0'; } void StringRef::takeOwnership() { if( !isOwned() ) { m_data = new char[m_size+1]; memcpy( m_data, m_start, m_size ); m_data[m_size] = '\0'; m_start = m_data; } } auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef { if( start < m_size ) return StringRef( m_start+start, size ); else return StringRef(); } auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool { return size() == other.size() && (std::strncmp( m_start, other.m_start, size() ) == 0); } auto StringRef::operator != ( StringRef const& other ) const noexcept -> bool { return !operator==( other ); } auto StringRef::operator[](size_type index) const noexcept -> char { return m_start[index]; } auto StringRef::numberOfCharacters() const noexcept -> size_type { size_type noChars = m_size; // Make adjustments for uft encodings for( size_type i=0; i < m_size; ++i ) { char c = m_start[i]; if( ( c & byte_2_lead ) == byte_2_lead ) { noChars--; if (( c & byte_3_lead ) == byte_3_lead ) noChars--; if( ( c & byte_4_lead ) == byte_4_lead ) noChars--; } } return noChars; } auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string { std::string str; str.reserve( lhs.size() + rhs.size() ); str += lhs; str += rhs; return str; } auto operator + ( StringRef const& lhs, const char* rhs ) -> std::string { return std::string( lhs ) + std::string( rhs ); } auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string { return std::string( lhs ) + std::string( rhs ); } auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& { return os.write(str.currentData(), str.size()); } auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& { lhs.append(rhs.currentData(), rhs.size()); return lhs; } } // namespace Catch #if defined(__clang__) # pragma clang diagnostic pop #endif // end catch_stringref.cpp // start catch_tag_alias.cpp namespace Catch { TagAlias::TagAlias(std::string const & _tag, SourceLineInfo _lineInfo): tag(_tag), lineInfo(_lineInfo) {} } // end catch_tag_alias.cpp // start catch_tag_alias_autoregistrar.cpp namespace Catch { RegistrarForTagAliases::RegistrarForTagAliases(char const* alias, char const* tag, SourceLineInfo const& lineInfo) { try { getMutableRegistryHub().registerTagAlias(alias, tag, lineInfo); } catch (...) { // Do not throw when constructing global objects, instead register the exception to be processed later getMutableRegistryHub().registerStartupException(); } } } // end catch_tag_alias_autoregistrar.cpp // start catch_tag_alias_registry.cpp #include namespace Catch { TagAliasRegistry::~TagAliasRegistry() {} TagAlias const* TagAliasRegistry::find( std::string const& alias ) const { auto it = m_registry.find( alias ); if( it != m_registry.end() ) return &(it->second); else return nullptr; } std::string TagAliasRegistry::expandAliases( std::string const& unexpandedTestSpec ) const { std::string expandedTestSpec = unexpandedTestSpec; for( auto const& registryKvp : m_registry ) { std::size_t pos = expandedTestSpec.find( registryKvp.first ); if( pos != std::string::npos ) { expandedTestSpec = expandedTestSpec.substr( 0, pos ) + registryKvp.second.tag + expandedTestSpec.substr( pos + registryKvp.first.size() ); } } return expandedTestSpec; } void TagAliasRegistry::add( std::string const& alias, std::string const& tag, SourceLineInfo const& lineInfo ) { CATCH_ENFORCE( startsWith(alias, "[@") && endsWith(alias, ']'), "error: tag alias, '" << alias << "' is not of the form [@alias name].\n" << lineInfo ); CATCH_ENFORCE( m_registry.insert(std::make_pair(alias, TagAlias(tag, lineInfo))).second, "error: tag alias, '" << alias << "' already registered.\n" << "\tFirst seen at: " << find(alias)->lineInfo << "\n" << "\tRedefined at: " << lineInfo ); } ITagAliasRegistry::~ITagAliasRegistry() {} ITagAliasRegistry const& ITagAliasRegistry::get() { return getRegistryHub().getTagAliasRegistry(); } } // end namespace Catch // end catch_tag_alias_registry.cpp // start catch_test_case_info.cpp #include #include #include #include namespace Catch { namespace { TestCaseInfo::SpecialProperties parseSpecialTag( std::string const& tag ) { if( startsWith( tag, '.' ) || tag == "!hide" ) return TestCaseInfo::IsHidden; else if( tag == "!throws" ) return TestCaseInfo::Throws; else if( tag == "!shouldfail" ) return TestCaseInfo::ShouldFail; else if( tag == "!mayfail" ) return TestCaseInfo::MayFail; else if( tag == "!nonportable" ) return TestCaseInfo::NonPortable; else if( tag == "!benchmark" ) return static_cast( TestCaseInfo::Benchmark | TestCaseInfo::IsHidden ); else return TestCaseInfo::None; } bool isReservedTag( std::string const& tag ) { return parseSpecialTag( tag ) == TestCaseInfo::None && tag.size() > 0 && !std::isalnum( static_cast(tag[0]) ); } void enforceNotReservedTag( std::string const& tag, SourceLineInfo const& _lineInfo ) { CATCH_ENFORCE( !isReservedTag(tag), "Tag name: [" << tag << "] is not allowed.\n" << "Tag names starting with non alpha-numeric characters are reserved\n" << _lineInfo ); } } TestCase makeTestCase( ITestInvoker* _testCase, std::string const& _className, NameAndTags const& nameAndTags, SourceLineInfo const& _lineInfo ) { bool isHidden = false; // Parse out tags std::vector tags; std::string desc, tag; bool inTag = false; std::string _descOrTags = nameAndTags.tags; for (char c : _descOrTags) { if( !inTag ) { if( c == '[' ) inTag = true; else desc += c; } else { if( c == ']' ) { TestCaseInfo::SpecialProperties prop = parseSpecialTag( tag ); if( ( prop & TestCaseInfo::IsHidden ) != 0 ) isHidden = true; else if( prop == TestCaseInfo::None ) enforceNotReservedTag( tag, _lineInfo ); tags.push_back( tag ); tag.clear(); inTag = false; } else tag += c; } } if( isHidden ) { tags.push_back( "." ); } TestCaseInfo info( nameAndTags.name, _className, desc, tags, _lineInfo ); return TestCase( _testCase, std::move(info) ); } void setTags( TestCaseInfo& testCaseInfo, std::vector tags ) { std::sort(begin(tags), end(tags)); tags.erase(std::unique(begin(tags), end(tags)), end(tags)); testCaseInfo.lcaseTags.clear(); for( auto const& tag : tags ) { std::string lcaseTag = toLower( tag ); testCaseInfo.properties = static_cast( testCaseInfo.properties | parseSpecialTag( lcaseTag ) ); testCaseInfo.lcaseTags.push_back( lcaseTag ); } testCaseInfo.tags = std::move(tags); } TestCaseInfo::TestCaseInfo( std::string const& _name, std::string const& _className, std::string const& _description, std::vector const& _tags, SourceLineInfo const& _lineInfo ) : name( _name ), className( _className ), description( _description ), lineInfo( _lineInfo ), properties( None ) { setTags( *this, _tags ); } bool TestCaseInfo::isHidden() const { return ( properties & IsHidden ) != 0; } bool TestCaseInfo::throws() const { return ( properties & Throws ) != 0; } bool TestCaseInfo::okToFail() const { return ( properties & (ShouldFail | MayFail ) ) != 0; } bool TestCaseInfo::expectedToFail() const { return ( properties & (ShouldFail ) ) != 0; } std::string TestCaseInfo::tagsAsString() const { std::string ret; // '[' and ']' per tag std::size_t full_size = 2 * tags.size(); for (const auto& tag : tags) { full_size += tag.size(); } ret.reserve(full_size); for (const auto& tag : tags) { ret.push_back('['); ret.append(tag); ret.push_back(']'); } return ret; } TestCase::TestCase( ITestInvoker* testCase, TestCaseInfo&& info ) : TestCaseInfo( std::move(info) ), test( testCase ) {} TestCase TestCase::withName( std::string const& _newName ) const { TestCase other( *this ); other.name = _newName; return other; } void TestCase::invoke() const { test->invoke(); } bool TestCase::operator == ( TestCase const& other ) const { return test.get() == other.test.get() && name == other.name && className == other.className; } bool TestCase::operator < ( TestCase const& other ) const { return name < other.name; } TestCaseInfo const& TestCase::getTestCaseInfo() const { return *this; } } // end namespace Catch // end catch_test_case_info.cpp // start catch_test_case_registry_impl.cpp #include namespace Catch { std::vector sortTests( IConfig const& config, std::vector const& unsortedTestCases ) { std::vector sorted = unsortedTestCases; switch( config.runOrder() ) { case RunTests::InLexicographicalOrder: std::sort( sorted.begin(), sorted.end() ); break; case RunTests::InRandomOrder: seedRng( config ); std::shuffle( sorted.begin(), sorted.end(), rng() ); break; case RunTests::InDeclarationOrder: // already in declaration order break; } return sorted; } bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ) { return testSpec.matches( testCase ) && ( config.allowThrows() || !testCase.throws() ); } void enforceNoDuplicateTestCases( std::vector const& functions ) { std::set seenFunctions; for( auto const& function : functions ) { auto prev = seenFunctions.insert( function ); CATCH_ENFORCE( prev.second, "error: TEST_CASE( \"" << function.name << "\" ) already defined.\n" << "\tFirst seen at " << prev.first->getTestCaseInfo().lineInfo << "\n" << "\tRedefined at " << function.getTestCaseInfo().lineInfo ); } } std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ) { std::vector filtered; filtered.reserve( testCases.size() ); for( auto const& testCase : testCases ) if( matchTest( testCase, testSpec, config ) ) filtered.push_back( testCase ); return filtered; } std::vector const& getAllTestCasesSorted( IConfig const& config ) { return getRegistryHub().getTestCaseRegistry().getAllTestsSorted( config ); } void TestRegistry::registerTest( TestCase const& testCase ) { std::string name = testCase.getTestCaseInfo().name; if( name.empty() ) { ReusableStringStream rss; rss << "Anonymous test case " << ++m_unnamedCount; return registerTest( testCase.withName( rss.str() ) ); } m_functions.push_back( testCase ); } std::vector const& TestRegistry::getAllTests() const { return m_functions; } std::vector const& TestRegistry::getAllTestsSorted( IConfig const& config ) const { if( m_sortedFunctions.empty() ) enforceNoDuplicateTestCases( m_functions ); if( m_currentSortOrder != config.runOrder() || m_sortedFunctions.empty() ) { m_sortedFunctions = sortTests( config, m_functions ); m_currentSortOrder = config.runOrder(); } return m_sortedFunctions; } /////////////////////////////////////////////////////////////////////////// TestInvokerAsFunction::TestInvokerAsFunction( void(*testAsFunction)() ) noexcept : m_testAsFunction( testAsFunction ) {} void TestInvokerAsFunction::invoke() const { m_testAsFunction(); } std::string extractClassName( StringRef const& classOrQualifiedMethodName ) { std::string className = classOrQualifiedMethodName; if( startsWith( className, '&' ) ) { std::size_t lastColons = className.rfind( "::" ); std::size_t penultimateColons = className.rfind( "::", lastColons-1 ); if( penultimateColons == std::string::npos ) penultimateColons = 1; className = className.substr( penultimateColons, lastColons-penultimateColons ); } return className; } } // end namespace Catch // end catch_test_case_registry_impl.cpp // start catch_test_case_tracker.cpp #include #include #include #include #include #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wexit-time-destructors" #endif namespace Catch { namespace TestCaseTracking { NameAndLocation::NameAndLocation( std::string const& _name, SourceLineInfo const& _location ) : name( _name ), location( _location ) {} ITracker::~ITracker() = default; TrackerContext& TrackerContext::instance() { static TrackerContext s_instance; return s_instance; } ITracker& TrackerContext::startRun() { m_rootTracker = std::make_shared( NameAndLocation( "{root}", CATCH_INTERNAL_LINEINFO ), *this, nullptr ); m_currentTracker = nullptr; m_runState = Executing; return *m_rootTracker; } void TrackerContext::endRun() { m_rootTracker.reset(); m_currentTracker = nullptr; m_runState = NotStarted; } void TrackerContext::startCycle() { m_currentTracker = m_rootTracker.get(); m_runState = Executing; } void TrackerContext::completeCycle() { m_runState = CompletedCycle; } bool TrackerContext::completedCycle() const { return m_runState == CompletedCycle; } ITracker& TrackerContext::currentTracker() { return *m_currentTracker; } void TrackerContext::setCurrentTracker( ITracker* tracker ) { m_currentTracker = tracker; } TrackerBase::TrackerHasName::TrackerHasName( NameAndLocation const& nameAndLocation ) : m_nameAndLocation( nameAndLocation ) {} bool TrackerBase::TrackerHasName::operator ()( ITrackerPtr const& tracker ) const { return tracker->nameAndLocation().location == m_nameAndLocation.location && tracker->nameAndLocation().name == m_nameAndLocation.name; } TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) : m_nameAndLocation( nameAndLocation ), m_ctx( ctx ), m_parent( parent ) {} NameAndLocation const& TrackerBase::nameAndLocation() const { return m_nameAndLocation; } bool TrackerBase::isComplete() const { return m_runState == CompletedSuccessfully || m_runState == Failed; } bool TrackerBase::isSuccessfullyCompleted() const { return m_runState == CompletedSuccessfully; } bool TrackerBase::isOpen() const { return m_runState != NotStarted && !isComplete(); } bool TrackerBase::hasChildren() const { return !m_children.empty(); } void TrackerBase::addChild( ITrackerPtr const& child ) { m_children.push_back( child ); } ITrackerPtr TrackerBase::findChild( NameAndLocation const& nameAndLocation ) { auto it = std::find_if( m_children.begin(), m_children.end(), TrackerHasName( nameAndLocation ) ); return( it != m_children.end() ) ? *it : nullptr; } ITracker& TrackerBase::parent() { assert( m_parent ); // Should always be non-null except for root return *m_parent; } void TrackerBase::openChild() { if( m_runState != ExecutingChildren ) { m_runState = ExecutingChildren; if( m_parent ) m_parent->openChild(); } } bool TrackerBase::isSectionTracker() const { return false; } bool TrackerBase::isIndexTracker() const { return false; } void TrackerBase::open() { m_runState = Executing; moveToThis(); if( m_parent ) m_parent->openChild(); } void TrackerBase::close() { // Close any still open children (e.g. generators) while( &m_ctx.currentTracker() != this ) m_ctx.currentTracker().close(); switch( m_runState ) { case NeedsAnotherRun: break; case Executing: m_runState = CompletedSuccessfully; break; case ExecutingChildren: if( m_children.empty() || m_children.back()->isComplete() ) m_runState = CompletedSuccessfully; break; case NotStarted: case CompletedSuccessfully: case Failed: CATCH_INTERNAL_ERROR( "Illogical state: " << m_runState ); default: CATCH_INTERNAL_ERROR( "Unknown state: " << m_runState ); } moveToParent(); m_ctx.completeCycle(); } void TrackerBase::fail() { m_runState = Failed; if( m_parent ) m_parent->markAsNeedingAnotherRun(); moveToParent(); m_ctx.completeCycle(); } void TrackerBase::markAsNeedingAnotherRun() { m_runState = NeedsAnotherRun; } void TrackerBase::moveToParent() { assert( m_parent ); m_ctx.setCurrentTracker( m_parent ); } void TrackerBase::moveToThis() { m_ctx.setCurrentTracker( this ); } SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ) : TrackerBase( nameAndLocation, ctx, parent ) { if( parent ) { while( !parent->isSectionTracker() ) parent = &parent->parent(); SectionTracker& parentSection = static_cast( *parent ); addNextFilters( parentSection.m_filters ); } } bool SectionTracker::isSectionTracker() const { return true; } SectionTracker& SectionTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation ) { std::shared_ptr section; ITracker& currentTracker = ctx.currentTracker(); if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { assert( childTracker ); assert( childTracker->isSectionTracker() ); section = std::static_pointer_cast( childTracker ); } else { section = std::make_shared( nameAndLocation, ctx, ¤tTracker ); currentTracker.addChild( section ); } if( !ctx.completedCycle() ) section->tryOpen(); return *section; } void SectionTracker::tryOpen() { if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) ) open(); } void SectionTracker::addInitialFilters( std::vector const& filters ) { if( !filters.empty() ) { m_filters.push_back(""); // Root - should never be consulted m_filters.push_back(""); // Test Case - not a section filter m_filters.insert( m_filters.end(), filters.begin(), filters.end() ); } } void SectionTracker::addNextFilters( std::vector const& filters ) { if( filters.size() > 1 ) m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() ); } IndexTracker::IndexTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent, int size ) : TrackerBase( nameAndLocation, ctx, parent ), m_size( size ) {} bool IndexTracker::isIndexTracker() const { return true; } IndexTracker& IndexTracker::acquire( TrackerContext& ctx, NameAndLocation const& nameAndLocation, int size ) { std::shared_ptr tracker; ITracker& currentTracker = ctx.currentTracker(); if( ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { assert( childTracker ); assert( childTracker->isIndexTracker() ); tracker = std::static_pointer_cast( childTracker ); } else { tracker = std::make_shared( nameAndLocation, ctx, ¤tTracker, size ); currentTracker.addChild( tracker ); } if( !ctx.completedCycle() && !tracker->isComplete() ) { if( tracker->m_runState != ExecutingChildren && tracker->m_runState != NeedsAnotherRun ) tracker->moveNext(); tracker->open(); } return *tracker; } int IndexTracker::index() const { return m_index; } void IndexTracker::moveNext() { m_index++; m_children.clear(); } void IndexTracker::close() { TrackerBase::close(); if( m_runState == CompletedSuccessfully && m_index < m_size-1 ) m_runState = Executing; } } // namespace TestCaseTracking using TestCaseTracking::ITracker; using TestCaseTracking::TrackerContext; using TestCaseTracking::SectionTracker; using TestCaseTracking::IndexTracker; } // namespace Catch #if defined(__clang__) # pragma clang diagnostic pop #endif // end catch_test_case_tracker.cpp // start catch_test_registry.cpp namespace Catch { auto makeTestInvoker( void(*testAsFunction)() ) noexcept -> ITestInvoker* { return new(std::nothrow) TestInvokerAsFunction( testAsFunction ); } NameAndTags::NameAndTags( StringRef const& name_ , StringRef const& tags_ ) noexcept : name( name_ ), tags( tags_ ) {} AutoReg::AutoReg( ITestInvoker* invoker, SourceLineInfo const& lineInfo, StringRef const& classOrMethod, NameAndTags const& nameAndTags ) noexcept { try { getMutableRegistryHub() .registerTest( makeTestCase( invoker, extractClassName( classOrMethod ), nameAndTags, lineInfo)); } catch (...) { // Do not throw when constructing global objects, instead register the exception to be processed later getMutableRegistryHub().registerStartupException(); } } AutoReg::~AutoReg() = default; } // end catch_test_registry.cpp // start catch_test_spec.cpp #include #include #include #include namespace Catch { TestSpec::Pattern::~Pattern() = default; TestSpec::NamePattern::~NamePattern() = default; TestSpec::TagPattern::~TagPattern() = default; TestSpec::ExcludedPattern::~ExcludedPattern() = default; TestSpec::NamePattern::NamePattern( std::string const& name ) : m_wildcardPattern( toLower( name ), CaseSensitive::No ) {} bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const { return m_wildcardPattern.matches( toLower( testCase.name ) ); } TestSpec::TagPattern::TagPattern( std::string const& tag ) : m_tag( toLower( tag ) ) {} bool TestSpec::TagPattern::matches( TestCaseInfo const& testCase ) const { return std::find(begin(testCase.lcaseTags), end(testCase.lcaseTags), m_tag) != end(testCase.lcaseTags); } TestSpec::ExcludedPattern::ExcludedPattern( PatternPtr const& underlyingPattern ) : m_underlyingPattern( underlyingPattern ) {} bool TestSpec::ExcludedPattern::matches( TestCaseInfo const& testCase ) const { return !m_underlyingPattern->matches( testCase ); } bool TestSpec::Filter::matches( TestCaseInfo const& testCase ) const { // All patterns in a filter must match for the filter to be a match for( auto const& pattern : m_patterns ) { if( !pattern->matches( testCase ) ) return false; } return true; } bool TestSpec::hasFilters() const { return !m_filters.empty(); } bool TestSpec::matches( TestCaseInfo const& testCase ) const { // A TestSpec matches if any filter matches for( auto const& filter : m_filters ) if( filter.matches( testCase ) ) return true; return false; } } // end catch_test_spec.cpp // start catch_test_spec_parser.cpp namespace Catch { TestSpecParser::TestSpecParser( ITagAliasRegistry const& tagAliases ) : m_tagAliases( &tagAliases ) {} TestSpecParser& TestSpecParser::parse( std::string const& arg ) { m_mode = None; m_exclusion = false; m_start = std::string::npos; m_arg = m_tagAliases->expandAliases( arg ); m_escapeChars.clear(); for( m_pos = 0; m_pos < m_arg.size(); ++m_pos ) visitChar( m_arg[m_pos] ); if( m_mode == Name ) addPattern(); return *this; } TestSpec TestSpecParser::testSpec() { addFilter(); return m_testSpec; } void TestSpecParser::visitChar( char c ) { if( m_mode == None ) { switch( c ) { case ' ': return; case '~': m_exclusion = true; return; case '[': return startNewMode( Tag, ++m_pos ); case '"': return startNewMode( QuotedName, ++m_pos ); case '\\': return escape(); default: startNewMode( Name, m_pos ); break; } } if( m_mode == Name ) { if( c == ',' ) { addPattern(); addFilter(); } else if( c == '[' ) { if( subString() == "exclude:" ) m_exclusion = true; else addPattern(); startNewMode( Tag, ++m_pos ); } else if( c == '\\' ) escape(); } else if( m_mode == EscapedName ) m_mode = Name; else if( m_mode == QuotedName && c == '"' ) addPattern(); else if( m_mode == Tag && c == ']' ) addPattern(); } void TestSpecParser::startNewMode( Mode mode, std::size_t start ) { m_mode = mode; m_start = start; } void TestSpecParser::escape() { if( m_mode == None ) m_start = m_pos; m_mode = EscapedName; m_escapeChars.push_back( m_pos ); } std::string TestSpecParser::subString() const { return m_arg.substr( m_start, m_pos - m_start ); } void TestSpecParser::addFilter() { if( !m_currentFilter.m_patterns.empty() ) { m_testSpec.m_filters.push_back( m_currentFilter ); m_currentFilter = TestSpec::Filter(); } } TestSpec parseTestSpec( std::string const& arg ) { return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec(); } } // namespace Catch // end catch_test_spec_parser.cpp // start catch_timer.cpp #include static const uint64_t nanosecondsInSecond = 1000000000; namespace Catch { auto getCurrentNanosecondsSinceEpoch() -> uint64_t { return std::chrono::duration_cast( std::chrono::high_resolution_clock::now().time_since_epoch() ).count(); } namespace { auto estimateClockResolution() -> uint64_t { uint64_t sum = 0; static const uint64_t iterations = 1000000; auto startTime = getCurrentNanosecondsSinceEpoch(); for( std::size_t i = 0; i < iterations; ++i ) { uint64_t ticks; uint64_t baseTicks = getCurrentNanosecondsSinceEpoch(); do { ticks = getCurrentNanosecondsSinceEpoch(); } while( ticks == baseTicks ); auto delta = ticks - baseTicks; sum += delta; // If we have been calibrating for over 3 seconds -- the clock // is terrible and we should move on. // TBD: How to signal that the measured resolution is probably wrong? if (ticks > startTime + 3 * nanosecondsInSecond) { return sum / i; } } // We're just taking the mean, here. To do better we could take the std. dev and exclude outliers // - and potentially do more iterations if there's a high variance. return sum/iterations; } } auto getEstimatedClockResolution() -> uint64_t { static auto s_resolution = estimateClockResolution(); return s_resolution; } void Timer::start() { m_nanoseconds = getCurrentNanosecondsSinceEpoch(); } auto Timer::getElapsedNanoseconds() const -> uint64_t { return getCurrentNanosecondsSinceEpoch() - m_nanoseconds; } auto Timer::getElapsedMicroseconds() const -> uint64_t { return getElapsedNanoseconds()/1000; } auto Timer::getElapsedMilliseconds() const -> unsigned int { return static_cast(getElapsedMicroseconds()/1000); } auto Timer::getElapsedSeconds() const -> double { return getElapsedMicroseconds()/1000000.0; } } // namespace Catch // end catch_timer.cpp // start catch_tostring.cpp #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wexit-time-destructors" # pragma clang diagnostic ignored "-Wglobal-constructors" #endif // Enable specific decls locally #if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) #define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER #endif #include #include namespace Catch { namespace Detail { const std::string unprintableString = "{?}"; namespace { const int hexThreshold = 255; struct Endianness { enum Arch { Big, Little }; static Arch which() { union _{ int asInt; char asChar[sizeof (int)]; } u; u.asInt = 1; return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little; } }; } std::string rawMemoryToString( const void *object, std::size_t size ) { // Reverse order for little endian architectures int i = 0, end = static_cast( size ), inc = 1; if( Endianness::which() == Endianness::Little ) { i = end-1; end = inc = -1; } unsigned char const *bytes = static_cast(object); ReusableStringStream rss; rss << "0x" << std::setfill('0') << std::hex; for( ; i != end; i += inc ) rss << std::setw(2) << static_cast(bytes[i]); return rss.str(); } } template std::string fpToString( T value, int precision ) { if (std::isnan(value)) { return "nan"; } ReusableStringStream rss; rss << std::setprecision( precision ) << std::fixed << value; std::string d = rss.str(); std::size_t i = d.find_last_not_of( '0' ); if( i != std::string::npos && i != d.size()-1 ) { if( d[i] == '.' ) i++; d = d.substr( 0, i+1 ); } return d; } //// ======================================================= //// // // Out-of-line defs for full specialization of StringMaker // //// ======================================================= //// std::string StringMaker::convert(const std::string& str) { if (!getCurrentContext().getConfig()->showInvisibles()) { return '"' + str + '"'; } std::string s("\""); for (char c : str) { switch (c) { case '\n': s.append("\\n"); break; case '\t': s.append("\\t"); break; default: s.push_back(c); break; } } s.append("\""); return s; } #ifdef CATCH_CONFIG_WCHAR std::string StringMaker::convert(const std::wstring& wstr) { std::string s; s.reserve(wstr.size()); for (auto c : wstr) { s += (c <= 0xff) ? static_cast(c) : '?'; } return ::Catch::Detail::stringify(s); } #endif std::string StringMaker::convert(char const* str) { if (str) { return ::Catch::Detail::stringify(std::string{ str }); } else { return{ "{null string}" }; } } std::string StringMaker::convert(char* str) { if (str) { return ::Catch::Detail::stringify(std::string{ str }); } else { return{ "{null string}" }; } } #ifdef CATCH_CONFIG_WCHAR std::string StringMaker::convert(wchar_t const * str) { if (str) { return ::Catch::Detail::stringify(std::wstring{ str }); } else { return{ "{null string}" }; } } std::string StringMaker::convert(wchar_t * str) { if (str) { return ::Catch::Detail::stringify(std::wstring{ str }); } else { return{ "{null string}" }; } } #endif std::string StringMaker::convert(int value) { return ::Catch::Detail::stringify(static_cast(value)); } std::string StringMaker::convert(long value) { return ::Catch::Detail::stringify(static_cast(value)); } std::string StringMaker::convert(long long value) { ReusableStringStream rss; rss << value; if (value > Detail::hexThreshold) { rss << " (0x" << std::hex << value << ')'; } return rss.str(); } std::string StringMaker::convert(unsigned int value) { return ::Catch::Detail::stringify(static_cast(value)); } std::string StringMaker::convert(unsigned long value) { return ::Catch::Detail::stringify(static_cast(value)); } std::string StringMaker::convert(unsigned long long value) { ReusableStringStream rss; rss << value; if (value > Detail::hexThreshold) { rss << " (0x" << std::hex << value << ')'; } return rss.str(); } std::string StringMaker::convert(bool b) { return b ? "true" : "false"; } std::string StringMaker::convert(char value) { if (value == '\r') { return "'\\r'"; } else if (value == '\f') { return "'\\f'"; } else if (value == '\n') { return "'\\n'"; } else if (value == '\t') { return "'\\t'"; } else if ('\0' <= value && value < ' ') { return ::Catch::Detail::stringify(static_cast(value)); } else { char chstr[] = "' '"; chstr[1] = value; return chstr; } } std::string StringMaker::convert(signed char c) { return ::Catch::Detail::stringify(static_cast(c)); } std::string StringMaker::convert(unsigned char c) { return ::Catch::Detail::stringify(static_cast(c)); } std::string StringMaker::convert(std::nullptr_t) { return "nullptr"; } std::string StringMaker::convert(float value) { return fpToString(value, 5) + 'f'; } std::string StringMaker::convert(double value) { return fpToString(value, 10); } std::string ratio_string::symbol() { return "a"; } std::string ratio_string::symbol() { return "f"; } std::string ratio_string::symbol() { return "p"; } std::string ratio_string::symbol() { return "n"; } std::string ratio_string::symbol() { return "u"; } std::string ratio_string::symbol() { return "m"; } } // end namespace Catch #if defined(__clang__) # pragma clang diagnostic pop #endif // end catch_tostring.cpp // start catch_totals.cpp namespace Catch { Counts Counts::operator - ( Counts const& other ) const { Counts diff; diff.passed = passed - other.passed; diff.failed = failed - other.failed; diff.failedButOk = failedButOk - other.failedButOk; return diff; } Counts& Counts::operator += ( Counts const& other ) { passed += other.passed; failed += other.failed; failedButOk += other.failedButOk; return *this; } std::size_t Counts::total() const { return passed + failed + failedButOk; } bool Counts::allPassed() const { return failed == 0 && failedButOk == 0; } bool Counts::allOk() const { return failed == 0; } Totals Totals::operator - ( Totals const& other ) const { Totals diff; diff.assertions = assertions - other.assertions; diff.testCases = testCases - other.testCases; return diff; } Totals& Totals::operator += ( Totals const& other ) { assertions += other.assertions; testCases += other.testCases; return *this; } Totals Totals::delta( Totals const& prevTotals ) const { Totals diff = *this - prevTotals; if( diff.assertions.failed > 0 ) ++diff.testCases.failed; else if( diff.assertions.failedButOk > 0 ) ++diff.testCases.failedButOk; else ++diff.testCases.passed; return diff; } } // end catch_totals.cpp // start catch_uncaught_exceptions.cpp #include namespace Catch { bool uncaught_exceptions() { #if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) return std::uncaught_exceptions() > 0; #else return std::uncaught_exception(); #endif } } // end namespace Catch // end catch_uncaught_exceptions.cpp // start catch_version.cpp #include namespace Catch { Version::Version ( unsigned int _majorVersion, unsigned int _minorVersion, unsigned int _patchNumber, char const * const _branchName, unsigned int _buildNumber ) : majorVersion( _majorVersion ), minorVersion( _minorVersion ), patchNumber( _patchNumber ), branchName( _branchName ), buildNumber( _buildNumber ) {} std::ostream& operator << ( std::ostream& os, Version const& version ) { os << version.majorVersion << '.' << version.minorVersion << '.' << version.patchNumber; // branchName is never null -> 0th char is \0 if it is empty if (version.branchName[0]) { os << '-' << version.branchName << '.' << version.buildNumber; } return os; } Version const& libraryVersion() { static Version version( 2, 3, 0, "", 0 ); return version; } } // end catch_version.cpp // start catch_wildcard_pattern.cpp #include namespace Catch { WildcardPattern::WildcardPattern( std::string const& pattern, CaseSensitive::Choice caseSensitivity ) : m_caseSensitivity( caseSensitivity ), m_pattern( adjustCase( pattern ) ) { if( startsWith( m_pattern, '*' ) ) { m_pattern = m_pattern.substr( 1 ); m_wildcard = WildcardAtStart; } if( endsWith( m_pattern, '*' ) ) { m_pattern = m_pattern.substr( 0, m_pattern.size()-1 ); m_wildcard = static_cast( m_wildcard | WildcardAtEnd ); } } bool WildcardPattern::matches( std::string const& str ) const { switch( m_wildcard ) { case NoWildcard: return m_pattern == adjustCase( str ); case WildcardAtStart: return endsWith( adjustCase( str ), m_pattern ); case WildcardAtEnd: return startsWith( adjustCase( str ), m_pattern ); case WildcardAtBothEnds: return contains( adjustCase( str ), m_pattern ); default: CATCH_INTERNAL_ERROR( "Unknown enum" ); } } std::string WildcardPattern::adjustCase( std::string const& str ) const { return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str; } } // end catch_wildcard_pattern.cpp // start catch_xmlwriter.cpp #include using uchar = unsigned char; namespace Catch { namespace { size_t trailingBytes(unsigned char c) { if ((c & 0xE0) == 0xC0) { return 2; } if ((c & 0xF0) == 0xE0) { return 3; } if ((c & 0xF8) == 0xF0) { return 4; } CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); } uint32_t headerValue(unsigned char c) { if ((c & 0xE0) == 0xC0) { return c & 0x1F; } if ((c & 0xF0) == 0xE0) { return c & 0x0F; } if ((c & 0xF8) == 0xF0) { return c & 0x07; } CATCH_INTERNAL_ERROR("Invalid multibyte utf-8 start byte encountered"); } void hexEscapeChar(std::ostream& os, unsigned char c) { os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << static_cast(c); } } // anonymous namespace XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat ) : m_str( str ), m_forWhat( forWhat ) {} void XmlEncode::encodeTo( std::ostream& os ) const { // Apostrophe escaping not necessary if we always use " to write attributes // (see: http://www.w3.org/TR/xml/#syntax) for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) { uchar c = m_str[idx]; switch (c) { case '<': os << "<"; break; case '&': os << "&"; break; case '>': // See: http://www.w3.org/TR/xml/#syntax if (idx > 2 && m_str[idx - 1] == ']' && m_str[idx - 2] == ']') os << ">"; else os << c; break; case '\"': if (m_forWhat == ForAttributes) os << """; else os << c; break; default: // Check for control characters and invalid utf-8 // Escape control characters in standard ascii // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0 if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) { hexEscapeChar(os, c); break; } // Plain ASCII: Write it to stream if (c < 0x7F) { os << c; break; } // UTF-8 territory // Check if the encoding is valid and if it is not, hex escape bytes. // Important: We do not check the exact decoded values for validity, only the encoding format // First check that this bytes is a valid lead byte: // This means that it is not encoded as 1111 1XXX // Or as 10XX XXXX if (c < 0xC0 || c >= 0xF8) { hexEscapeChar(os, c); break; } auto encBytes = trailingBytes(c); // Are there enough bytes left to avoid accessing out-of-bounds memory? if (idx + encBytes - 1 >= m_str.size()) { hexEscapeChar(os, c); break; } // The header is valid, check data // The next encBytes bytes must together be a valid utf-8 // This means: bitpattern 10XX XXXX and the extracted value is sane (ish) bool valid = true; uint32_t value = headerValue(c); for (std::size_t n = 1; n < encBytes; ++n) { uchar nc = m_str[idx + n]; valid &= ((nc & 0xC0) == 0x80); value = (value << 6) | (nc & 0x3F); } if ( // Wrong bit pattern of following bytes (!valid) || // Overlong encodings (value < 0x80) || (0x80 <= value && value < 0x800 && encBytes > 2) || (0x800 < value && value < 0x10000 && encBytes > 3) || // Encoded value out of range (value >= 0x110000) ) { hexEscapeChar(os, c); break; } // If we got here, this is in fact a valid(ish) utf-8 sequence for (std::size_t n = 0; n < encBytes; ++n) { os << m_str[idx + n]; } idx += encBytes - 1; break; } } } std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ) { xmlEncode.encodeTo( os ); return os; } XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer ) : m_writer( writer ) {} XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept : m_writer( other.m_writer ){ other.m_writer = nullptr; } XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept { if ( m_writer ) { m_writer->endElement(); } m_writer = other.m_writer; other.m_writer = nullptr; return *this; } XmlWriter::ScopedElement::~ScopedElement() { if( m_writer ) m_writer->endElement(); } XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) { m_writer->writeText( text, indent ); return *this; } XmlWriter::XmlWriter( std::ostream& os ) : m_os( os ) { writeDeclaration(); } XmlWriter::~XmlWriter() { while( !m_tags.empty() ) endElement(); } XmlWriter& XmlWriter::startElement( std::string const& name ) { ensureTagClosed(); newlineIfNecessary(); m_os << m_indent << '<' << name; m_tags.push_back( name ); m_indent += " "; m_tagIsOpen = true; return *this; } XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) { ScopedElement scoped( this ); startElement( name ); return scoped; } XmlWriter& XmlWriter::endElement() { newlineIfNecessary(); m_indent = m_indent.substr( 0, m_indent.size()-2 ); if( m_tagIsOpen ) { m_os << "/>"; m_tagIsOpen = false; } else { m_os << m_indent << ""; } m_os << std::endl; m_tags.pop_back(); return *this; } XmlWriter& XmlWriter::writeAttribute( std::string const& name, std::string const& attribute ) { if( !name.empty() && !attribute.empty() ) m_os << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"'; return *this; } XmlWriter& XmlWriter::writeAttribute( std::string const& name, bool attribute ) { m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"'; return *this; } XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) { if( !text.empty() ){ bool tagWasOpen = m_tagIsOpen; ensureTagClosed(); if( tagWasOpen && indent ) m_os << m_indent; m_os << XmlEncode( text ); m_needsNewline = true; } return *this; } XmlWriter& XmlWriter::writeComment( std::string const& text ) { ensureTagClosed(); m_os << m_indent << ""; m_needsNewline = true; return *this; } void XmlWriter::writeStylesheetRef( std::string const& url ) { m_os << "\n"; } XmlWriter& XmlWriter::writeBlankLine() { ensureTagClosed(); m_os << '\n'; return *this; } void XmlWriter::ensureTagClosed() { if( m_tagIsOpen ) { m_os << ">" << std::endl; m_tagIsOpen = false; } } void XmlWriter::writeDeclaration() { m_os << "\n"; } void XmlWriter::newlineIfNecessary() { if( m_needsNewline ) { m_os << std::endl; m_needsNewline = false; } } } // end catch_xmlwriter.cpp // start catch_reporter_bases.cpp #include #include #include #include #include namespace Catch { void prepareExpandedExpression(AssertionResult& result) { result.getExpandedExpression(); } // Because formatting using c++ streams is stateful, drop down to C is required // Alternatively we could use stringstream, but its performance is... not good. std::string getFormattedDuration( double duration ) { // Max exponent + 1 is required to represent the whole part // + 1 for decimal point // + 3 for the 3 decimal places // + 1 for null terminator const std::size_t maxDoubleSize = DBL_MAX_10_EXP + 1 + 1 + 3 + 1; char buffer[maxDoubleSize]; // Save previous errno, to prevent sprintf from overwriting it ErrnoGuard guard; #ifdef _MSC_VER sprintf_s(buffer, "%.3f", duration); #else sprintf(buffer, "%.3f", duration); #endif return std::string(buffer); } TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) :StreamingReporterBase(_config) {} void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} bool TestEventListenerBase::assertionEnded(AssertionStats const &) { return false; } } // end namespace Catch // end catch_reporter_bases.cpp // start catch_reporter_compact.cpp namespace { #ifdef CATCH_PLATFORM_MAC const char* failedString() { return "FAILED"; } const char* passedString() { return "PASSED"; } #else const char* failedString() { return "failed"; } const char* passedString() { return "passed"; } #endif // Colour::LightGrey Catch::Colour::Code dimColour() { return Catch::Colour::FileName; } std::string bothOrAll( std::size_t count ) { return count == 1 ? std::string() : count == 2 ? "both " : "all " ; } } // anon namespace namespace Catch { namespace { // Colour, message variants: // - white: No tests ran. // - red: Failed [both/all] N test cases, failed [both/all] M assertions. // - white: Passed [both/all] N test cases (no assertions). // - red: Failed N tests cases, failed M assertions. // - green: Passed [both/all] N tests cases with M assertions. void printTotals(std::ostream& out, const Totals& totals) { if (totals.testCases.total() == 0) { out << "No tests ran."; } else if (totals.testCases.failed == totals.testCases.total()) { Colour colour(Colour::ResultError); const std::string qualify_assertions_failed = totals.assertions.failed == totals.assertions.total() ? bothOrAll(totals.assertions.failed) : std::string(); out << "Failed " << bothOrAll(totals.testCases.failed) << pluralise(totals.testCases.failed, "test case") << ", " "failed " << qualify_assertions_failed << pluralise(totals.assertions.failed, "assertion") << '.'; } else if (totals.assertions.total() == 0) { out << "Passed " << bothOrAll(totals.testCases.total()) << pluralise(totals.testCases.total(), "test case") << " (no assertions)."; } else if (totals.assertions.failed) { Colour colour(Colour::ResultError); out << "Failed " << pluralise(totals.testCases.failed, "test case") << ", " "failed " << pluralise(totals.assertions.failed, "assertion") << '.'; } else { Colour colour(Colour::ResultSuccess); out << "Passed " << bothOrAll(totals.testCases.passed) << pluralise(totals.testCases.passed, "test case") << " with " << pluralise(totals.assertions.passed, "assertion") << '.'; } } // Implementation of CompactReporter formatting class AssertionPrinter { public: AssertionPrinter& operator= (AssertionPrinter const&) = delete; AssertionPrinter(AssertionPrinter const&) = delete; AssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) : stream(_stream) , result(_stats.assertionResult) , messages(_stats.infoMessages) , itMessage(_stats.infoMessages.begin()) , printInfoMessages(_printInfoMessages) {} void print() { printSourceInfo(); itMessage = messages.begin(); switch (result.getResultType()) { case ResultWas::Ok: printResultType(Colour::ResultSuccess, passedString()); printOriginalExpression(); printReconstructedExpression(); if (!result.hasExpression()) printRemainingMessages(Colour::None); else printRemainingMessages(); break; case ResultWas::ExpressionFailed: if (result.isOk()) printResultType(Colour::ResultSuccess, failedString() + std::string(" - but was ok")); else printResultType(Colour::Error, failedString()); printOriginalExpression(); printReconstructedExpression(); printRemainingMessages(); break; case ResultWas::ThrewException: printResultType(Colour::Error, failedString()); printIssue("unexpected exception with message:"); printMessage(); printExpressionWas(); printRemainingMessages(); break; case ResultWas::FatalErrorCondition: printResultType(Colour::Error, failedString()); printIssue("fatal error condition with message:"); printMessage(); printExpressionWas(); printRemainingMessages(); break; case ResultWas::DidntThrowException: printResultType(Colour::Error, failedString()); printIssue("expected exception, got none"); printExpressionWas(); printRemainingMessages(); break; case ResultWas::Info: printResultType(Colour::None, "info"); printMessage(); printRemainingMessages(); break; case ResultWas::Warning: printResultType(Colour::None, "warning"); printMessage(); printRemainingMessages(); break; case ResultWas::ExplicitFailure: printResultType(Colour::Error, failedString()); printIssue("explicitly"); printRemainingMessages(Colour::None); break; // These cases are here to prevent compiler warnings case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: printResultType(Colour::Error, "** internal error **"); break; } } private: void printSourceInfo() const { Colour colourGuard(Colour::FileName); stream << result.getSourceInfo() << ':'; } void printResultType(Colour::Code colour, std::string const& passOrFail) const { if (!passOrFail.empty()) { { Colour colourGuard(colour); stream << ' ' << passOrFail; } stream << ':'; } } void printIssue(std::string const& issue) const { stream << ' ' << issue; } void printExpressionWas() { if (result.hasExpression()) { stream << ';'; { Colour colour(dimColour()); stream << " expression was:"; } printOriginalExpression(); } } void printOriginalExpression() const { if (result.hasExpression()) { stream << ' ' << result.getExpression(); } } void printReconstructedExpression() const { if (result.hasExpandedExpression()) { { Colour colour(dimColour()); stream << " for: "; } stream << result.getExpandedExpression(); } } void printMessage() { if (itMessage != messages.end()) { stream << " '" << itMessage->message << '\''; ++itMessage; } } void printRemainingMessages(Colour::Code colour = dimColour()) { if (itMessage == messages.end()) return; // using messages.end() directly yields (or auto) compilation error: std::vector::const_iterator itEnd = messages.end(); const std::size_t N = static_cast(std::distance(itMessage, itEnd)); { Colour colourGuard(colour); stream << " with " << pluralise(N, "message") << ':'; } for (; itMessage != itEnd; ) { // If this assertion is a warning ignore any INFO messages if (printInfoMessages || itMessage->type != ResultWas::Info) { stream << " '" << itMessage->message << '\''; if (++itMessage != itEnd) { Colour colourGuard(dimColour()); stream << " and"; } } } } private: std::ostream& stream; AssertionResult const& result; std::vector messages; std::vector::const_iterator itMessage; bool printInfoMessages; }; } // anon namespace std::string CompactReporter::getDescription() { return "Reports test results on a single line, suitable for IDEs"; } ReporterPreferences CompactReporter::getPreferences() const { return m_reporterPrefs; } void CompactReporter::noMatchingTestCases( std::string const& spec ) { stream << "No test cases matched '" << spec << '\'' << std::endl; } void CompactReporter::assertionStarting( AssertionInfo const& ) {} bool CompactReporter::assertionEnded( AssertionStats const& _assertionStats ) { AssertionResult const& result = _assertionStats.assertionResult; bool printInfoMessages = true; // Drop out if result was successful and we're not printing those if( !m_config->includeSuccessfulResults() && result.isOk() ) { if( result.getResultType() != ResultWas::Warning ) return false; printInfoMessages = false; } AssertionPrinter printer( stream, _assertionStats, printInfoMessages ); printer.print(); stream << std::endl; return true; } void CompactReporter::sectionEnded(SectionStats const& _sectionStats) { if (m_config->showDurations() == ShowDurations::Always) { stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; } } void CompactReporter::testRunEnded( TestRunStats const& _testRunStats ) { printTotals( stream, _testRunStats.totals ); stream << '\n' << std::endl; StreamingReporterBase::testRunEnded( _testRunStats ); } CompactReporter::~CompactReporter() {} CATCH_REGISTER_REPORTER( "compact", CompactReporter ) } // end namespace Catch // end catch_reporter_compact.cpp // start catch_reporter_console.cpp #include #include #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch // Note that 4062 (not all labels are handled // and default is missing) is enabled #endif namespace Catch { namespace { // Formatter impl for ConsoleReporter class ConsoleAssertionPrinter { public: ConsoleAssertionPrinter& operator= (ConsoleAssertionPrinter const&) = delete; ConsoleAssertionPrinter(ConsoleAssertionPrinter const&) = delete; ConsoleAssertionPrinter(std::ostream& _stream, AssertionStats const& _stats, bool _printInfoMessages) : stream(_stream), stats(_stats), result(_stats.assertionResult), colour(Colour::None), message(result.getMessage()), messages(_stats.infoMessages), printInfoMessages(_printInfoMessages) { switch (result.getResultType()) { case ResultWas::Ok: colour = Colour::Success; passOrFail = "PASSED"; //if( result.hasMessage() ) if (_stats.infoMessages.size() == 1) messageLabel = "with message"; if (_stats.infoMessages.size() > 1) messageLabel = "with messages"; break; case ResultWas::ExpressionFailed: if (result.isOk()) { colour = Colour::Success; passOrFail = "FAILED - but was ok"; } else { colour = Colour::Error; passOrFail = "FAILED"; } if (_stats.infoMessages.size() == 1) messageLabel = "with message"; if (_stats.infoMessages.size() > 1) messageLabel = "with messages"; break; case ResultWas::ThrewException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "due to unexpected exception with "; if (_stats.infoMessages.size() == 1) messageLabel += "message"; if (_stats.infoMessages.size() > 1) messageLabel += "messages"; break; case ResultWas::FatalErrorCondition: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "due to a fatal error condition"; break; case ResultWas::DidntThrowException: colour = Colour::Error; passOrFail = "FAILED"; messageLabel = "because no exception was thrown where one was expected"; break; case ResultWas::Info: messageLabel = "info"; break; case ResultWas::Warning: messageLabel = "warning"; break; case ResultWas::ExplicitFailure: passOrFail = "FAILED"; colour = Colour::Error; if (_stats.infoMessages.size() == 1) messageLabel = "explicitly with message"; if (_stats.infoMessages.size() > 1) messageLabel = "explicitly with messages"; break; // These cases are here to prevent compiler warnings case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: passOrFail = "** internal error **"; colour = Colour::Error; break; } } void print() const { printSourceInfo(); if (stats.totals.assertions.total() > 0) { if (result.isOk()) stream << '\n'; printResultType(); printOriginalExpression(); printReconstructedExpression(); } else { stream << '\n'; } printMessage(); } private: void printResultType() const { if (!passOrFail.empty()) { Colour colourGuard(colour); stream << passOrFail << ":\n"; } } void printOriginalExpression() const { if (result.hasExpression()) { Colour colourGuard(Colour::OriginalExpression); stream << " "; stream << result.getExpressionInMacro(); stream << '\n'; } } void printReconstructedExpression() const { if (result.hasExpandedExpression()) { stream << "with expansion:\n"; Colour colourGuard(Colour::ReconstructedExpression); stream << Column(result.getExpandedExpression()).indent(2) << '\n'; } } void printMessage() const { if (!messageLabel.empty()) stream << messageLabel << ':' << '\n'; for (auto const& msg : messages) { // If this assertion is a warning ignore any INFO messages if (printInfoMessages || msg.type != ResultWas::Info) stream << Column(msg.message).indent(2) << '\n'; } } void printSourceInfo() const { Colour colourGuard(Colour::FileName); stream << result.getSourceInfo() << ": "; } std::ostream& stream; AssertionStats const& stats; AssertionResult const& result; Colour::Code colour; std::string passOrFail; std::string messageLabel; std::string message; std::vector messages; bool printInfoMessages; }; std::size_t makeRatio(std::size_t number, std::size_t total) { std::size_t ratio = total > 0 ? CATCH_CONFIG_CONSOLE_WIDTH * number / total : 0; return (ratio == 0 && number > 0) ? 1 : ratio; } std::size_t& findMax(std::size_t& i, std::size_t& j, std::size_t& k) { if (i > j && i > k) return i; else if (j > k) return j; else return k; } struct ColumnInfo { enum Justification { Left, Right }; std::string name; int width; Justification justification; }; struct ColumnBreak {}; struct RowBreak {}; class Duration { enum class Unit { Auto, Nanoseconds, Microseconds, Milliseconds, Seconds, Minutes }; static const uint64_t s_nanosecondsInAMicrosecond = 1000; static const uint64_t s_nanosecondsInAMillisecond = 1000 * s_nanosecondsInAMicrosecond; static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond; static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond; uint64_t m_inNanoseconds; Unit m_units; public: explicit Duration(uint64_t inNanoseconds, Unit units = Unit::Auto) : m_inNanoseconds(inNanoseconds), m_units(units) { if (m_units == Unit::Auto) { if (m_inNanoseconds < s_nanosecondsInAMicrosecond) m_units = Unit::Nanoseconds; else if (m_inNanoseconds < s_nanosecondsInAMillisecond) m_units = Unit::Microseconds; else if (m_inNanoseconds < s_nanosecondsInASecond) m_units = Unit::Milliseconds; else if (m_inNanoseconds < s_nanosecondsInAMinute) m_units = Unit::Seconds; else m_units = Unit::Minutes; } } auto value() const -> double { switch (m_units) { case Unit::Microseconds: return m_inNanoseconds / static_cast(s_nanosecondsInAMicrosecond); case Unit::Milliseconds: return m_inNanoseconds / static_cast(s_nanosecondsInAMillisecond); case Unit::Seconds: return m_inNanoseconds / static_cast(s_nanosecondsInASecond); case Unit::Minutes: return m_inNanoseconds / static_cast(s_nanosecondsInAMinute); default: return static_cast(m_inNanoseconds); } } auto unitsAsString() const -> std::string { switch (m_units) { case Unit::Nanoseconds: return "ns"; case Unit::Microseconds: return "µs"; case Unit::Milliseconds: return "ms"; case Unit::Seconds: return "s"; case Unit::Minutes: return "m"; default: return "** internal error **"; } } friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& { return os << duration.value() << " " << duration.unitsAsString(); } }; } // end anon namespace class TablePrinter { std::ostream& m_os; std::vector m_columnInfos; std::ostringstream m_oss; int m_currentColumn = -1; bool m_isOpen = false; public: TablePrinter( std::ostream& os, std::vector columnInfos ) : m_os( os ), m_columnInfos( std::move( columnInfos ) ) {} auto columnInfos() const -> std::vector const& { return m_columnInfos; } void open() { if (!m_isOpen) { m_isOpen = true; *this << RowBreak(); for (auto const& info : m_columnInfos) *this << info.name << ColumnBreak(); *this << RowBreak(); m_os << Catch::getLineOfChars<'-'>() << "\n"; } } void close() { if (m_isOpen) { *this << RowBreak(); m_os << std::endl; m_isOpen = false; } } template friend TablePrinter& operator << (TablePrinter& tp, T const& value) { tp.m_oss << value; return tp; } friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { auto colStr = tp.m_oss.str(); // This takes account of utf8 encodings auto strSize = Catch::StringRef(colStr).numberOfCharacters(); tp.m_oss.str(""); tp.open(); if (tp.m_currentColumn == static_cast(tp.m_columnInfos.size() - 1)) { tp.m_currentColumn = -1; tp.m_os << "\n"; } tp.m_currentColumn++; auto colInfo = tp.m_columnInfos[tp.m_currentColumn]; auto padding = (strSize + 2 < static_cast(colInfo.width)) ? std::string(colInfo.width - (strSize + 2), ' ') : std::string(); if (colInfo.justification == ColumnInfo::Left) tp.m_os << colStr << padding << " "; else tp.m_os << padding << colStr << " "; return tp; } friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { if (tp.m_currentColumn > 0) { tp.m_os << "\n"; tp.m_currentColumn = -1; } return tp; } }; ConsoleReporter::ConsoleReporter(ReporterConfig const& config) : StreamingReporterBase(config), m_tablePrinter(new TablePrinter(config.stream(), { { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 32, ColumnInfo::Left }, { "iters", 8, ColumnInfo::Right }, { "elapsed ns", 14, ColumnInfo::Right }, { "average", 14, ColumnInfo::Right } })) {} ConsoleReporter::~ConsoleReporter() = default; std::string ConsoleReporter::getDescription() { return "Reports test results as plain lines of text"; } void ConsoleReporter::noMatchingTestCases(std::string const& spec) { stream << "No test cases matched '" << spec << '\'' << std::endl; } void ConsoleReporter::assertionStarting(AssertionInfo const&) {} bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) { AssertionResult const& result = _assertionStats.assertionResult; bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); // Drop out if result was successful but we're not printing them. if (!includeResults && result.getResultType() != ResultWas::Warning) return false; lazyPrint(); ConsoleAssertionPrinter printer(stream, _assertionStats, includeResults); printer.print(); stream << std::endl; return true; } void ConsoleReporter::sectionStarting(SectionInfo const& _sectionInfo) { m_headerPrinted = false; StreamingReporterBase::sectionStarting(_sectionInfo); } void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) { m_tablePrinter->close(); if (_sectionStats.missingAssertions) { lazyPrint(); Colour colour(Colour::ResultError); if (m_sectionStack.size() > 1) stream << "\nNo assertions in section"; else stream << "\nNo assertions in test case"; stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl; } if (m_config->showDurations() == ShowDurations::Always) { stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl; } if (m_headerPrinted) { m_headerPrinted = false; } StreamingReporterBase::sectionEnded(_sectionStats); } void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) { lazyPrintWithoutClosingBenchmarkTable(); auto nameCol = Column( info.name ).width( static_cast( m_tablePrinter->columnInfos()[0].width - 2 ) ); bool firstLine = true; for (auto line : nameCol) { if (!firstLine) (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak(); else firstLine = false; (*m_tablePrinter) << line << ColumnBreak(); } } void ConsoleReporter::benchmarkEnded(BenchmarkStats const& stats) { Duration average(stats.elapsedTimeInNanoseconds / stats.iterations); (*m_tablePrinter) << stats.iterations << ColumnBreak() << stats.elapsedTimeInNanoseconds << ColumnBreak() << average << ColumnBreak(); } void ConsoleReporter::testCaseEnded(TestCaseStats const& _testCaseStats) { m_tablePrinter->close(); StreamingReporterBase::testCaseEnded(_testCaseStats); m_headerPrinted = false; } void ConsoleReporter::testGroupEnded(TestGroupStats const& _testGroupStats) { if (currentGroupInfo.used) { printSummaryDivider(); stream << "Summary for group '" << _testGroupStats.groupInfo.name << "':\n"; printTotals(_testGroupStats.totals); stream << '\n' << std::endl; } StreamingReporterBase::testGroupEnded(_testGroupStats); } void ConsoleReporter::testRunEnded(TestRunStats const& _testRunStats) { printTotalsDivider(_testRunStats.totals); printTotals(_testRunStats.totals); stream << std::endl; StreamingReporterBase::testRunEnded(_testRunStats); } void ConsoleReporter::lazyPrint() { m_tablePrinter->close(); lazyPrintWithoutClosingBenchmarkTable(); } void ConsoleReporter::lazyPrintWithoutClosingBenchmarkTable() { if (!currentTestRunInfo.used) lazyPrintRunInfo(); if (!currentGroupInfo.used) lazyPrintGroupInfo(); if (!m_headerPrinted) { printTestCaseAndSectionHeader(); m_headerPrinted = true; } } void ConsoleReporter::lazyPrintRunInfo() { stream << '\n' << getLineOfChars<'~'>() << '\n'; Colour colour(Colour::SecondaryText); stream << currentTestRunInfo->name << " is a Catch v" << libraryVersion() << " host application.\n" << "Run with -? for options\n\n"; if (m_config->rngSeed() != 0) stream << "Randomness seeded to: " << m_config->rngSeed() << "\n\n"; currentTestRunInfo.used = true; } void ConsoleReporter::lazyPrintGroupInfo() { if (!currentGroupInfo->name.empty() && currentGroupInfo->groupsCounts > 1) { printClosedHeader("Group: " + currentGroupInfo->name); currentGroupInfo.used = true; } } void ConsoleReporter::printTestCaseAndSectionHeader() { assert(!m_sectionStack.empty()); printOpenHeader(currentTestCaseInfo->name); if (m_sectionStack.size() > 1) { Colour colourGuard(Colour::Headers); auto it = m_sectionStack.begin() + 1, // Skip first section (test case) itEnd = m_sectionStack.end(); for (; it != itEnd; ++it) printHeaderString(it->name, 2); } SourceLineInfo lineInfo = m_sectionStack.back().lineInfo; if (!lineInfo.empty()) { stream << getLineOfChars<'-'>() << '\n'; Colour colourGuard(Colour::FileName); stream << lineInfo << '\n'; } stream << getLineOfChars<'.'>() << '\n' << std::endl; } void ConsoleReporter::printClosedHeader(std::string const& _name) { printOpenHeader(_name); stream << getLineOfChars<'.'>() << '\n'; } void ConsoleReporter::printOpenHeader(std::string const& _name) { stream << getLineOfChars<'-'>() << '\n'; { Colour colourGuard(Colour::Headers); printHeaderString(_name); } } // if string has a : in first line will set indent to follow it on // subsequent lines void ConsoleReporter::printHeaderString(std::string const& _string, std::size_t indent) { std::size_t i = _string.find(": "); if (i != std::string::npos) i += 2; else i = 0; stream << Column(_string).indent(indent + i).initialIndent(indent) << '\n'; } struct SummaryColumn { SummaryColumn( std::string _label, Colour::Code _colour ) : label( std::move( _label ) ), colour( _colour ) {} SummaryColumn addRow( std::size_t count ) { ReusableStringStream rss; rss << count; std::string row = rss.str(); for (auto& oldRow : rows) { while (oldRow.size() < row.size()) oldRow = ' ' + oldRow; while (oldRow.size() > row.size()) row = ' ' + row; } rows.push_back(row); return *this; } std::string label; Colour::Code colour; std::vector rows; }; void ConsoleReporter::printTotals( Totals const& totals ) { if (totals.testCases.total() == 0) { stream << Colour(Colour::Warning) << "No tests ran\n"; } else if (totals.assertions.total() > 0 && totals.testCases.allPassed()) { stream << Colour(Colour::ResultSuccess) << "All tests passed"; stream << " (" << pluralise(totals.assertions.passed, "assertion") << " in " << pluralise(totals.testCases.passed, "test case") << ')' << '\n'; } else { std::vector columns; columns.push_back(SummaryColumn("", Colour::None) .addRow(totals.testCases.total()) .addRow(totals.assertions.total())); columns.push_back(SummaryColumn("passed", Colour::Success) .addRow(totals.testCases.passed) .addRow(totals.assertions.passed)); columns.push_back(SummaryColumn("failed", Colour::ResultError) .addRow(totals.testCases.failed) .addRow(totals.assertions.failed)); columns.push_back(SummaryColumn("failed as expected", Colour::ResultExpectedFailure) .addRow(totals.testCases.failedButOk) .addRow(totals.assertions.failedButOk)); printSummaryRow("test cases", columns, 0); printSummaryRow("assertions", columns, 1); } } void ConsoleReporter::printSummaryRow(std::string const& label, std::vector const& cols, std::size_t row) { for (auto col : cols) { std::string value = col.rows[row]; if (col.label.empty()) { stream << label << ": "; if (value != "0") stream << value; else stream << Colour(Colour::Warning) << "- none -"; } else if (value != "0") { stream << Colour(Colour::LightGrey) << " | "; stream << Colour(col.colour) << value << ' ' << col.label; } } stream << '\n'; } void ConsoleReporter::printTotalsDivider(Totals const& totals) { if (totals.testCases.total() > 0) { std::size_t failedRatio = makeRatio(totals.testCases.failed, totals.testCases.total()); std::size_t failedButOkRatio = makeRatio(totals.testCases.failedButOk, totals.testCases.total()); std::size_t passedRatio = makeRatio(totals.testCases.passed, totals.testCases.total()); while (failedRatio + failedButOkRatio + passedRatio < CATCH_CONFIG_CONSOLE_WIDTH - 1) findMax(failedRatio, failedButOkRatio, passedRatio)++; while (failedRatio + failedButOkRatio + passedRatio > CATCH_CONFIG_CONSOLE_WIDTH - 1) findMax(failedRatio, failedButOkRatio, passedRatio)--; stream << Colour(Colour::Error) << std::string(failedRatio, '='); stream << Colour(Colour::ResultExpectedFailure) << std::string(failedButOkRatio, '='); if (totals.testCases.allPassed()) stream << Colour(Colour::ResultSuccess) << std::string(passedRatio, '='); else stream << Colour(Colour::Success) << std::string(passedRatio, '='); } else { stream << Colour(Colour::Warning) << std::string(CATCH_CONFIG_CONSOLE_WIDTH - 1, '='); } stream << '\n'; } void ConsoleReporter::printSummaryDivider() { stream << getLineOfChars<'-'>() << '\n'; } CATCH_REGISTER_REPORTER("console", ConsoleReporter) } // end namespace Catch #if defined(_MSC_VER) #pragma warning(pop) #endif // end catch_reporter_console.cpp // start catch_reporter_junit.cpp #include #include #include #include namespace Catch { namespace { std::string getCurrentTimestamp() { // Beware, this is not reentrant because of backward compatibility issues // Also, UTC only, again because of backward compatibility (%z is C++11) time_t rawtime; std::time(&rawtime); auto const timeStampSize = sizeof("2017-01-16T17:06:45Z"); #ifdef _MSC_VER std::tm timeInfo = {}; gmtime_s(&timeInfo, &rawtime); #else std::tm* timeInfo; timeInfo = std::gmtime(&rawtime); #endif char timeStamp[timeStampSize]; const char * const fmt = "%Y-%m-%dT%H:%M:%SZ"; #ifdef _MSC_VER std::strftime(timeStamp, timeStampSize, fmt, &timeInfo); #else std::strftime(timeStamp, timeStampSize, fmt, timeInfo); #endif return std::string(timeStamp); } std::string fileNameTag(const std::vector &tags) { auto it = std::find_if(begin(tags), end(tags), [] (std::string const& tag) {return tag.front() == '#'; }); if (it != tags.end()) return it->substr(1); return std::string(); } } // anonymous namespace JunitReporter::JunitReporter( ReporterConfig const& _config ) : CumulativeReporterBase( _config ), xml( _config.stream() ) { m_reporterPrefs.shouldRedirectStdOut = true; m_reporterPrefs.shouldReportAllAssertions = true; } JunitReporter::~JunitReporter() {} std::string JunitReporter::getDescription() { return "Reports test results in an XML format that looks like Ant's junitreport target"; } void JunitReporter::noMatchingTestCases( std::string const& /*spec*/ ) {} void JunitReporter::testRunStarting( TestRunInfo const& runInfo ) { CumulativeReporterBase::testRunStarting( runInfo ); xml.startElement( "testsuites" ); } void JunitReporter::testGroupStarting( GroupInfo const& groupInfo ) { suiteTimer.start(); stdOutForSuite.clear(); stdErrForSuite.clear(); unexpectedExceptions = 0; CumulativeReporterBase::testGroupStarting( groupInfo ); } void JunitReporter::testCaseStarting( TestCaseInfo const& testCaseInfo ) { m_okToFail = testCaseInfo.okToFail(); } bool JunitReporter::assertionEnded( AssertionStats const& assertionStats ) { if( assertionStats.assertionResult.getResultType() == ResultWas::ThrewException && !m_okToFail ) unexpectedExceptions++; return CumulativeReporterBase::assertionEnded( assertionStats ); } void JunitReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { stdOutForSuite += testCaseStats.stdOut; stdErrForSuite += testCaseStats.stdErr; CumulativeReporterBase::testCaseEnded( testCaseStats ); } void JunitReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { double suiteTime = suiteTimer.getElapsedSeconds(); CumulativeReporterBase::testGroupEnded( testGroupStats ); writeGroup( *m_testGroups.back(), suiteTime ); } void JunitReporter::testRunEndedCumulative() { xml.endElement(); } void JunitReporter::writeGroup( TestGroupNode const& groupNode, double suiteTime ) { XmlWriter::ScopedElement e = xml.scopedElement( "testsuite" ); TestGroupStats const& stats = groupNode.value; xml.writeAttribute( "name", stats.groupInfo.name ); xml.writeAttribute( "errors", unexpectedExceptions ); xml.writeAttribute( "failures", stats.totals.assertions.failed-unexpectedExceptions ); xml.writeAttribute( "tests", stats.totals.assertions.total() ); xml.writeAttribute( "hostname", "tbd" ); // !TBD if( m_config->showDurations() == ShowDurations::Never ) xml.writeAttribute( "time", "" ); else xml.writeAttribute( "time", suiteTime ); xml.writeAttribute( "timestamp", getCurrentTimestamp() ); // Write test cases for( auto const& child : groupNode.children ) writeTestCase( *child ); xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), false ); xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), false ); } void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) { TestCaseStats const& stats = testCaseNode.value; // All test cases have exactly one section - which represents the // test case itself. That section may have 0-n nested sections assert( testCaseNode.children.size() == 1 ); SectionNode const& rootSection = *testCaseNode.children.front(); std::string className = stats.testInfo.className; if( className.empty() ) { className = fileNameTag(stats.testInfo.tags); if ( className.empty() ) className = "global"; } if ( !m_config->name().empty() ) className = m_config->name() + "." + className; writeSection( className, "", rootSection ); } void JunitReporter::writeSection( std::string const& className, std::string const& rootName, SectionNode const& sectionNode ) { std::string name = trim( sectionNode.stats.sectionInfo.name ); if( !rootName.empty() ) name = rootName + '/' + name; if( !sectionNode.assertions.empty() || !sectionNode.stdOut.empty() || !sectionNode.stdErr.empty() ) { XmlWriter::ScopedElement e = xml.scopedElement( "testcase" ); if( className.empty() ) { xml.writeAttribute( "classname", name ); xml.writeAttribute( "name", "root" ); } else { xml.writeAttribute( "classname", className ); xml.writeAttribute( "name", name ); } xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) ); writeAssertions( sectionNode ); if( !sectionNode.stdOut.empty() ) xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false ); if( !sectionNode.stdErr.empty() ) xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false ); } for( auto const& childNode : sectionNode.childSections ) if( className.empty() ) writeSection( name, "", *childNode ); else writeSection( className, name, *childNode ); } void JunitReporter::writeAssertions( SectionNode const& sectionNode ) { for( auto const& assertion : sectionNode.assertions ) writeAssertion( assertion ); } void JunitReporter::writeAssertion( AssertionStats const& stats ) { AssertionResult const& result = stats.assertionResult; if( !result.isOk() ) { std::string elementName; switch( result.getResultType() ) { case ResultWas::ThrewException: case ResultWas::FatalErrorCondition: elementName = "error"; break; case ResultWas::ExplicitFailure: elementName = "failure"; break; case ResultWas::ExpressionFailed: elementName = "failure"; break; case ResultWas::DidntThrowException: elementName = "failure"; break; // We should never see these here: case ResultWas::Info: case ResultWas::Warning: case ResultWas::Ok: case ResultWas::Unknown: case ResultWas::FailureBit: case ResultWas::Exception: elementName = "internalError"; break; } XmlWriter::ScopedElement e = xml.scopedElement( elementName ); xml.writeAttribute( "message", result.getExpandedExpression() ); xml.writeAttribute( "type", result.getTestMacroName() ); ReusableStringStream rss; if( !result.getMessage().empty() ) rss << result.getMessage() << '\n'; for( auto const& msg : stats.infoMessages ) if( msg.type == ResultWas::Info ) rss << msg.message << '\n'; rss << "at " << result.getSourceInfo(); xml.writeText( rss.str(), false ); } } CATCH_REGISTER_REPORTER( "junit", JunitReporter ) } // end namespace Catch // end catch_reporter_junit.cpp // start catch_reporter_listening.cpp #include namespace Catch { ListeningReporter::ListeningReporter() { // We will assume that listeners will always want all assertions m_preferences.shouldReportAllAssertions = true; } void ListeningReporter::addListener( IStreamingReporterPtr&& listener ) { m_listeners.push_back( std::move( listener ) ); } void ListeningReporter::addReporter(IStreamingReporterPtr&& reporter) { assert(!m_reporter && "Listening reporter can wrap only 1 real reporter"); m_reporter = std::move( reporter ); m_preferences.shouldRedirectStdOut = m_reporter->getPreferences().shouldRedirectStdOut; } ReporterPreferences ListeningReporter::getPreferences() const { return m_preferences; } std::set ListeningReporter::getSupportedVerbosities() { return std::set{ }; } void ListeningReporter::noMatchingTestCases( std::string const& spec ) { for ( auto const& listener : m_listeners ) { listener->noMatchingTestCases( spec ); } m_reporter->noMatchingTestCases( spec ); } void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) { for ( auto const& listener : m_listeners ) { listener->benchmarkStarting( benchmarkInfo ); } m_reporter->benchmarkStarting( benchmarkInfo ); } void ListeningReporter::benchmarkEnded( BenchmarkStats const& benchmarkStats ) { for ( auto const& listener : m_listeners ) { listener->benchmarkEnded( benchmarkStats ); } m_reporter->benchmarkEnded( benchmarkStats ); } void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) { for ( auto const& listener : m_listeners ) { listener->testRunStarting( testRunInfo ); } m_reporter->testRunStarting( testRunInfo ); } void ListeningReporter::testGroupStarting( GroupInfo const& groupInfo ) { for ( auto const& listener : m_listeners ) { listener->testGroupStarting( groupInfo ); } m_reporter->testGroupStarting( groupInfo ); } void ListeningReporter::testCaseStarting( TestCaseInfo const& testInfo ) { for ( auto const& listener : m_listeners ) { listener->testCaseStarting( testInfo ); } m_reporter->testCaseStarting( testInfo ); } void ListeningReporter::sectionStarting( SectionInfo const& sectionInfo ) { for ( auto const& listener : m_listeners ) { listener->sectionStarting( sectionInfo ); } m_reporter->sectionStarting( sectionInfo ); } void ListeningReporter::assertionStarting( AssertionInfo const& assertionInfo ) { for ( auto const& listener : m_listeners ) { listener->assertionStarting( assertionInfo ); } m_reporter->assertionStarting( assertionInfo ); } // The return value indicates if the messages buffer should be cleared: bool ListeningReporter::assertionEnded( AssertionStats const& assertionStats ) { for( auto const& listener : m_listeners ) { static_cast( listener->assertionEnded( assertionStats ) ); } return m_reporter->assertionEnded( assertionStats ); } void ListeningReporter::sectionEnded( SectionStats const& sectionStats ) { for ( auto const& listener : m_listeners ) { listener->sectionEnded( sectionStats ); } m_reporter->sectionEnded( sectionStats ); } void ListeningReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { for ( auto const& listener : m_listeners ) { listener->testCaseEnded( testCaseStats ); } m_reporter->testCaseEnded( testCaseStats ); } void ListeningReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { for ( auto const& listener : m_listeners ) { listener->testGroupEnded( testGroupStats ); } m_reporter->testGroupEnded( testGroupStats ); } void ListeningReporter::testRunEnded( TestRunStats const& testRunStats ) { for ( auto const& listener : m_listeners ) { listener->testRunEnded( testRunStats ); } m_reporter->testRunEnded( testRunStats ); } void ListeningReporter::skipTest( TestCaseInfo const& testInfo ) { for ( auto const& listener : m_listeners ) { listener->skipTest( testInfo ); } m_reporter->skipTest( testInfo ); } bool ListeningReporter::isMulti() const { return true; } } // end namespace Catch // end catch_reporter_listening.cpp // start catch_reporter_xml.cpp #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable:4061) // Not all labels are EXPLICITLY handled in switch // Note that 4062 (not all labels are handled // and default is missing) is enabled #endif namespace Catch { XmlReporter::XmlReporter( ReporterConfig const& _config ) : StreamingReporterBase( _config ), m_xml(_config.stream()) { m_reporterPrefs.shouldRedirectStdOut = true; m_reporterPrefs.shouldReportAllAssertions = true; } XmlReporter::~XmlReporter() = default; std::string XmlReporter::getDescription() { return "Reports test results as an XML document"; } std::string XmlReporter::getStylesheetRef() const { return std::string(); } void XmlReporter::writeSourceInfo( SourceLineInfo const& sourceInfo ) { m_xml .writeAttribute( "filename", sourceInfo.file ) .writeAttribute( "line", sourceInfo.line ); } void XmlReporter::noMatchingTestCases( std::string const& s ) { StreamingReporterBase::noMatchingTestCases( s ); } void XmlReporter::testRunStarting( TestRunInfo const& testInfo ) { StreamingReporterBase::testRunStarting( testInfo ); std::string stylesheetRef = getStylesheetRef(); if( !stylesheetRef.empty() ) m_xml.writeStylesheetRef( stylesheetRef ); m_xml.startElement( "Catch" ); if( !m_config->name().empty() ) m_xml.writeAttribute( "name", m_config->name() ); } void XmlReporter::testGroupStarting( GroupInfo const& groupInfo ) { StreamingReporterBase::testGroupStarting( groupInfo ); m_xml.startElement( "Group" ) .writeAttribute( "name", groupInfo.name ); } void XmlReporter::testCaseStarting( TestCaseInfo const& testInfo ) { StreamingReporterBase::testCaseStarting(testInfo); m_xml.startElement( "TestCase" ) .writeAttribute( "name", trim( testInfo.name ) ) .writeAttribute( "description", testInfo.description ) .writeAttribute( "tags", testInfo.tagsAsString() ); writeSourceInfo( testInfo.lineInfo ); if ( m_config->showDurations() == ShowDurations::Always ) m_testCaseTimer.start(); m_xml.ensureTagClosed(); } void XmlReporter::sectionStarting( SectionInfo const& sectionInfo ) { StreamingReporterBase::sectionStarting( sectionInfo ); if( m_sectionDepth++ > 0 ) { m_xml.startElement( "Section" ) .writeAttribute( "name", trim( sectionInfo.name ) ); writeSourceInfo( sectionInfo.lineInfo ); m_xml.ensureTagClosed(); } } void XmlReporter::assertionStarting( AssertionInfo const& ) { } bool XmlReporter::assertionEnded( AssertionStats const& assertionStats ) { AssertionResult const& result = assertionStats.assertionResult; bool includeResults = m_config->includeSuccessfulResults() || !result.isOk(); if( includeResults || result.getResultType() == ResultWas::Warning ) { // Print any info messages in tags. for( auto const& msg : assertionStats.infoMessages ) { if( msg.type == ResultWas::Info && includeResults ) { m_xml.scopedElement( "Info" ) .writeText( msg.message ); } else if ( msg.type == ResultWas::Warning ) { m_xml.scopedElement( "Warning" ) .writeText( msg.message ); } } } // Drop out if result was successful but we're not printing them. if( !includeResults && result.getResultType() != ResultWas::Warning ) return true; // Print the expression if there is one. if( result.hasExpression() ) { m_xml.startElement( "Expression" ) .writeAttribute( "success", result.succeeded() ) .writeAttribute( "type", result.getTestMacroName() ); writeSourceInfo( result.getSourceInfo() ); m_xml.scopedElement( "Original" ) .writeText( result.getExpression() ); m_xml.scopedElement( "Expanded" ) .writeText( result.getExpandedExpression() ); } // And... Print a result applicable to each result type. switch( result.getResultType() ) { case ResultWas::ThrewException: m_xml.startElement( "Exception" ); writeSourceInfo( result.getSourceInfo() ); m_xml.writeText( result.getMessage() ); m_xml.endElement(); break; case ResultWas::FatalErrorCondition: m_xml.startElement( "FatalErrorCondition" ); writeSourceInfo( result.getSourceInfo() ); m_xml.writeText( result.getMessage() ); m_xml.endElement(); break; case ResultWas::Info: m_xml.scopedElement( "Info" ) .writeText( result.getMessage() ); break; case ResultWas::Warning: // Warning will already have been written break; case ResultWas::ExplicitFailure: m_xml.startElement( "Failure" ); writeSourceInfo( result.getSourceInfo() ); m_xml.writeText( result.getMessage() ); m_xml.endElement(); break; default: break; } if( result.hasExpression() ) m_xml.endElement(); return true; } void XmlReporter::sectionEnded( SectionStats const& sectionStats ) { StreamingReporterBase::sectionEnded( sectionStats ); if( --m_sectionDepth > 0 ) { XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResults" ); e.writeAttribute( "successes", sectionStats.assertions.passed ); e.writeAttribute( "failures", sectionStats.assertions.failed ); e.writeAttribute( "expectedFailures", sectionStats.assertions.failedButOk ); if ( m_config->showDurations() == ShowDurations::Always ) e.writeAttribute( "durationInSeconds", sectionStats.durationInSeconds ); m_xml.endElement(); } } void XmlReporter::testCaseEnded( TestCaseStats const& testCaseStats ) { StreamingReporterBase::testCaseEnded( testCaseStats ); XmlWriter::ScopedElement e = m_xml.scopedElement( "OverallResult" ); e.writeAttribute( "success", testCaseStats.totals.assertions.allOk() ); if ( m_config->showDurations() == ShowDurations::Always ) e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() ); if( !testCaseStats.stdOut.empty() ) m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false ); if( !testCaseStats.stdErr.empty() ) m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false ); m_xml.endElement(); } void XmlReporter::testGroupEnded( TestGroupStats const& testGroupStats ) { StreamingReporterBase::testGroupEnded( testGroupStats ); // TODO: Check testGroupStats.aborting and act accordingly. m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", testGroupStats.totals.assertions.passed ) .writeAttribute( "failures", testGroupStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk ); m_xml.endElement(); } void XmlReporter::testRunEnded( TestRunStats const& testRunStats ) { StreamingReporterBase::testRunEnded( testRunStats ); m_xml.scopedElement( "OverallResults" ) .writeAttribute( "successes", testRunStats.totals.assertions.passed ) .writeAttribute( "failures", testRunStats.totals.assertions.failed ) .writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk ); m_xml.endElement(); } CATCH_REGISTER_REPORTER( "xml", XmlReporter ) } // end namespace Catch #if defined(_MSC_VER) #pragma warning(pop) #endif // end catch_reporter_xml.cpp namespace Catch { LeakDetector leakDetector; } #ifdef __clang__ #pragma clang diagnostic pop #endif // end catch_impl.hpp #endif #ifdef CATCH_CONFIG_MAIN // start catch_default_main.hpp #ifndef __OBJC__ #if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) // Standard C/C++ Win32 Unicode wmain entry point extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { #else // Standard C/C++ main entry point int main (int argc, char * argv[]) { #endif return Catch::Session().run( argc, argv ); } #else // __OBJC__ // Objective-C entry point int main (int argc, char * const argv[]) { #if !CATCH_ARC_ENABLED NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; #endif Catch::registerTestMethods(); int result = Catch::Session().run( argc, (char**)argv ); #if !CATCH_ARC_ENABLED [pool drain]; #endif return result; } #endif // __OBJC__ // end catch_default_main.hpp #endif #if !defined(CATCH_CONFIG_IMPL_ONLY) #ifdef CLARA_CONFIG_MAIN_NOT_DEFINED # undef CLARA_CONFIG_MAIN #endif #if !defined(CATCH_CONFIG_DISABLE) ////// // If this config identifier is defined then all CATCH macros are prefixed with CATCH_ #ifdef CATCH_CONFIG_PREFIX_ALL #define CATCH_REQUIRE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define CATCH_REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) #define CATCH_REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_REQUIRE_THROWS", Catch::ResultDisposition::Normal, "", __VA_ARGS__ ) #define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) #define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr ) #endif// CATCH_CONFIG_DISABLE_MATCHERS #define CATCH_REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define CATCH_CHECK( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CATCH_CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) #define CATCH_CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CATCH_CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CATCH_CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CATCH_CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CATCH_CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CATCH_CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ ) #define CATCH_CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CATCH_CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, "", __VA_ARGS__ ) #define CATCH_CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CATCH_CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) #define CATCH_CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CATCH_CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CATCH_CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define CATCH_CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CATCH_CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CATCH_CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) #define CATCH_REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CATCH_REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define CATCH_INFO( msg ) INTERNAL_CATCH_INFO( "CATCH_INFO", msg ) #define CATCH_WARN( msg ) INTERNAL_CATCH_MSG( "CATCH_WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) #define CATCH_CAPTURE( msg ) INTERNAL_CATCH_INFO( "CATCH_CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) ) #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define CATCH_REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) #define CATCH_SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #define CATCH_DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) #define CATCH_FAIL( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define CATCH_FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "CATCH_FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CATCH_SUCCEED( ... ) INTERNAL_CATCH_MSG( "CATCH_SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() // "BDD-style" convenience wrappers #define CATCH_SCENARIO( ... ) CATCH_TEST_CASE( "Scenario: " __VA_ARGS__ ) #define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) #define CATCH_GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) #define CATCH_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) #define CATCH_AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And when: " << desc ) #define CATCH_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) #define CATCH_AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else #define REQUIRE( ... ) INTERNAL_CATCH_TEST( "REQUIRE", Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define REQUIRE_FALSE( ... ) INTERNAL_CATCH_TEST( "REQUIRE_FALSE", Catch::ResultDisposition::Normal | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) #define REQUIRE_THROWS( ... ) INTERNAL_CATCH_THROWS( "REQUIRE_THROWS", Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define REQUIRE_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "REQUIRE_THROWS_AS", exceptionType, Catch::ResultDisposition::Normal, expr ) #define REQUIRE_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "REQUIRE_THROWS_WITH", Catch::ResultDisposition::Normal, matcher, expr ) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "REQUIRE_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::Normal, matcher, expr ) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define REQUIRE_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "REQUIRE_NOTHROW", Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define CHECK( ... ) INTERNAL_CATCH_TEST( "CHECK", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CHECK_FALSE( ... ) INTERNAL_CATCH_TEST( "CHECK_FALSE", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::FalseTest, __VA_ARGS__ ) #define CHECKED_IF( ... ) INTERNAL_CATCH_IF( "CHECKED_IF", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CHECKED_ELSE( ... ) INTERNAL_CATCH_ELSE( "CHECKED_ELSE", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CHECK_NOFAIL( ... ) INTERNAL_CATCH_TEST( "CHECK_NOFAIL", Catch::ResultDisposition::ContinueOnFailure | Catch::ResultDisposition::SuppressFail, __VA_ARGS__ ) #define CHECK_THROWS( ... ) INTERNAL_CATCH_THROWS( "CHECK_THROWS", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define CHECK_THROWS_AS( expr, exceptionType ) INTERNAL_CATCH_THROWS_AS( "CHECK_THROWS_AS", exceptionType, Catch::ResultDisposition::ContinueOnFailure, expr ) #define CHECK_THROWS_WITH( expr, matcher ) INTERNAL_CATCH_THROWS_STR_MATCHES( "CHECK_THROWS_WITH", Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) INTERNAL_CATCH_THROWS_MATCHES( "CHECK_THROWS_MATCHES", exceptionType, Catch::ResultDisposition::ContinueOnFailure, matcher, expr ) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define CHECK_NOTHROW( ... ) INTERNAL_CATCH_NO_THROW( "CHECK_NOTHROW", Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CHECK_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "CHECK_THAT", matcher, Catch::ResultDisposition::ContinueOnFailure, arg ) #define REQUIRE_THAT( arg, matcher ) INTERNAL_CHECK_THAT( "REQUIRE_THAT", matcher, Catch::ResultDisposition::Normal, arg ) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define INFO( msg ) INTERNAL_CATCH_INFO( "INFO", msg ) #define WARN( msg ) INTERNAL_CATCH_MSG( "WARN", Catch::ResultWas::Warning, Catch::ResultDisposition::ContinueOnFailure, msg ) #define CAPTURE( msg ) INTERNAL_CATCH_INFO( "CAPTURE", #msg " := " << ::Catch::Detail::stringify(msg) ) #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE( __VA_ARGS__ ) #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, __VA_ARGS__ ) #define METHOD_AS_TEST_CASE( method, ... ) INTERNAL_CATCH_METHOD_AS_TEST_CASE( method, __VA_ARGS__ ) #define REGISTER_TEST_CASE( Function, ... ) INTERNAL_CATCH_REGISTER_TESTCASE( Function, __VA_ARGS__ ) #define SECTION( ... ) INTERNAL_CATCH_SECTION( __VA_ARGS__ ) #define DYNAMIC_SECTION( ... ) INTERNAL_CATCH_DYNAMIC_SECTION( __VA_ARGS__ ) #define FAIL( ... ) INTERNAL_CATCH_MSG( "FAIL", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::Normal, __VA_ARGS__ ) #define FAIL_CHECK( ... ) INTERNAL_CATCH_MSG( "FAIL_CHECK", Catch::ResultWas::ExplicitFailure, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() #endif #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) // "BDD-style" convenience wrappers #define SCENARIO( ... ) TEST_CASE( "Scenario: " __VA_ARGS__ ) #define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TEST_CASE_METHOD( className, "Scenario: " __VA_ARGS__ ) #define GIVEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Given: " << desc ) #define WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " When: " << desc ) #define AND_WHEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( "And when: " << desc ) #define THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " Then: " << desc ) #define AND_THEN( desc ) INTERNAL_CATCH_DYNAMIC_SECTION( " And: " << desc ) using Catch::Detail::Approx; #else // CATCH_CONFIG_DISABLE ////// // If this config identifier is defined then all CATCH macros are prefixed with CATCH_ #ifdef CATCH_CONFIG_PREFIX_ALL #define CATCH_REQUIRE( ... ) (void)(0) #define CATCH_REQUIRE_FALSE( ... ) (void)(0) #define CATCH_REQUIRE_THROWS( ... ) (void)(0) #define CATCH_REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0) #define CATCH_REQUIRE_THROWS_WITH( expr, matcher ) (void)(0) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) #endif// CATCH_CONFIG_DISABLE_MATCHERS #define CATCH_REQUIRE_NOTHROW( ... ) (void)(0) #define CATCH_CHECK( ... ) (void)(0) #define CATCH_CHECK_FALSE( ... ) (void)(0) #define CATCH_CHECKED_IF( ... ) if (__VA_ARGS__) #define CATCH_CHECKED_ELSE( ... ) if (!(__VA_ARGS__)) #define CATCH_CHECK_NOFAIL( ... ) (void)(0) #define CATCH_CHECK_THROWS( ... ) (void)(0) #define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0) #define CATCH_CHECK_THROWS_WITH( expr, matcher ) (void)(0) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define CATCH_CHECK_NOTHROW( ... ) (void)(0) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CATCH_CHECK_THAT( arg, matcher ) (void)(0) #define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define CATCH_INFO( msg ) (void)(0) #define CATCH_WARN( msg ) (void)(0) #define CATCH_CAPTURE( msg ) (void)(0) #define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) #define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) #define CATCH_METHOD_AS_TEST_CASE( method, ... ) #define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0) #define CATCH_SECTION( ... ) #define CATCH_DYNAMIC_SECTION( ... ) #define CATCH_FAIL( ... ) (void)(0) #define CATCH_FAIL_CHECK( ... ) (void)(0) #define CATCH_SUCCEED( ... ) (void)(0) #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) // "BDD-style" convenience wrappers #define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) #define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) #define CATCH_GIVEN( desc ) #define CATCH_WHEN( desc ) #define CATCH_AND_WHEN( desc ) #define CATCH_THEN( desc ) #define CATCH_AND_THEN( desc ) // If CATCH_CONFIG_PREFIX_ALL is not defined then the CATCH_ prefix is not required #else #define REQUIRE( ... ) (void)(0) #define REQUIRE_FALSE( ... ) (void)(0) #define REQUIRE_THROWS( ... ) (void)(0) #define REQUIRE_THROWS_AS( expr, exceptionType ) (void)(0) #define REQUIRE_THROWS_WITH( expr, matcher ) (void)(0) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define REQUIRE_NOTHROW( ... ) (void)(0) #define CHECK( ... ) (void)(0) #define CHECK_FALSE( ... ) (void)(0) #define CHECKED_IF( ... ) if (__VA_ARGS__) #define CHECKED_ELSE( ... ) if (!(__VA_ARGS__)) #define CHECK_NOFAIL( ... ) (void)(0) #define CHECK_THROWS( ... ) (void)(0) #define CHECK_THROWS_AS( expr, exceptionType ) (void)(0) #define CHECK_THROWS_WITH( expr, matcher ) (void)(0) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define CHECK_NOTHROW( ... ) (void)(0) #if !defined(CATCH_CONFIG_DISABLE_MATCHERS) #define CHECK_THAT( arg, matcher ) (void)(0) #define REQUIRE_THAT( arg, matcher ) (void)(0) #endif // CATCH_CONFIG_DISABLE_MATCHERS #define INFO( msg ) (void)(0) #define WARN( msg ) (void)(0) #define CAPTURE( msg ) (void)(0) #define TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) #define TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) #define METHOD_AS_TEST_CASE( method, ... ) #define REGISTER_TEST_CASE( Function, ... ) (void)(0) #define SECTION( ... ) #define DYNAMIC_SECTION( ... ) #define FAIL( ... ) (void)(0) #define FAIL_CHECK( ... ) (void)(0) #define SUCCEED( ... ) (void)(0) #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) #endif #define CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) // "BDD-style" convenience wrappers #define SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ) ) #define SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) #define GIVEN( desc ) #define WHEN( desc ) #define AND_WHEN( desc ) #define THEN( desc ) #define AND_THEN( desc ) using Catch::Detail::Approx; #endif #endif // ! CATCH_CONFIG_IMPL_ONLY // start catch_reenable_warnings.h #ifdef __clang__ # ifdef __ICC // icpc defines the __clang__ macro # pragma warning(pop) # else # pragma clang diagnostic pop # endif #elif defined __GNUC__ # pragma GCC diagnostic pop #endif // end catch_reenable_warnings.h // end catch.hpp #endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED qiskit-aer-0.4.1/tools/000077500000000000000000000000001362723322000147255ustar00rootroot00000000000000qiskit-aer-0.4.1/tools/verify_wheels.py000066400000000000000000000376351362723322000201700ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Copyright 2019, IBM. # # This source code is licensed under the Apache License, Version 2.0 found in # the LICENSE.txt file in the root directory of this source tree. import numpy as np from numpy.linalg import norm from qiskit import ClassicalRegister from qiskit.compiler import assemble, transpile from qiskit import execute from qiskit import QuantumCircuit from qiskit import QuantumRegister from qiskit.providers.aer.pulse.duffing_model_generators import duffing_system_model from qiskit.pulse import Schedule, Acquire from qiskit.pulse.channels import (DriveChannel, AcquireChannel, MemorySlot) from qiskit.pulse.commands.parametric_pulses import Gaussian from qiskit.providers.aer import QasmSimulator from qiskit.providers.aer import StatevectorSimulator from qiskit.providers.aer import UnitarySimulator from qiskit.providers.aer import PulseSimulator def assertAlmostEqual(first, second, places=None, msg=None, delta=None): """Test of 2 object are almost equal. Fail if the two objects are unequal as determined by their difference rounded to the given number of decimal places (default 7) and comparing to zero, or by comparing that the difference between the two objects is more than the given delta. Note that decimal places (from zero) are usually not the same as significant digits (measured from the most significant digit). If the two objects compare equal then they will automatically compare almost equal. """ if first == second: # shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") diff = abs(first - second) if delta is not None: if diff <= delta: return standardMsg = '%s != %s within %s delta (%s difference)' % ( first, second, delta, diff) else: if places is None: places = 7 if round(diff, places) == 0: return standardMsg = '%s != %s within %r places (%s difference)' % ( first, second, places, diff) raise Exception(standardMsg) def grovers_circuit(final_measure=True, allow_sampling=True): """Testing a circuit originated in the Grover algorithm""" circuits = [] # 6-qubit grovers qr = QuantumRegister(6) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) circuit = QuantumCircuit(*regs) circuit.h(qr[0]) circuit.h(qr[1]) circuit.x(qr[2]) circuit.x(qr[3]) circuit.x(qr[0]) circuit.cx(qr[0], qr[2]) circuit.x(qr[0]) circuit.cx(qr[1], qr[3]) circuit.ccx(qr[2], qr[3], qr[4]) circuit.cx(qr[1], qr[3]) circuit.x(qr[0]) circuit.cx(qr[0], qr[2]) circuit.x(qr[0]) circuit.x(qr[1]) circuit.x(qr[4]) circuit.h(qr[4]) circuit.ccx(qr[0], qr[1], qr[4]) circuit.h(qr[4]) circuit.x(qr[0]) circuit.x(qr[1]) circuit.x(qr[4]) circuit.h(qr[0]) circuit.h(qr[1]) circuit.h(qr[4]) if final_measure: circuit.barrier(qr) circuit.measure(qr[0], cr[0]) circuit.measure(qr[1], cr[1]) if not allow_sampling: circuit.barrier(qr) circuit.iden(qr) circuits.append(circuit) return circuits def assertDictAlmostEqual(dict1, dict2, delta=None, msg=None, places=None, default_value=0): """Assert two dictionaries with numeric values are almost equal. Fail if the two dictionaries are unequal as determined by comparing that the difference between values with the same key are not greater than delta (default 1e-8), or that difference rounded to the given number of decimal places is not zero. If a key in one dictionary is not in the other the default_value keyword argument will be used for the missing value (default 0). If the two objects compare equal then they will automatically compare almost equal. Args: dict1 (dict): a dictionary. dict2 (dict): a dictionary. delta (number): threshold for comparison (defaults to 1e-8). msg (str): return a custom message on failure. places (int): number of decimal places for comparison. default_value (number): default value for missing keys. Raises: TypeError: raises TestCase failureException if the test fails. """ if dict1 == dict2: # Shortcut return if delta is not None and places is not None: raise TypeError("specify delta or places not both") if places is not None: success = True standard_msg = '' # check value for keys in target keys1 = set(dict1.keys()) for key in keys1: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if round(abs(val1 - val2), places) != 0: success = False standard_msg += '(%s: %s != %s), ' % (key, val1, val2) # check values for keys in counts, not in target keys2 = set(dict2.keys()) - keys1 for key in keys2: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if round(abs(val1 - val2), places) != 0: success = False standard_msg += '(%s: %s != %s), ' % (key, val1, val2) if success is True: return standard_msg = standard_msg[:-2] + ' within %s places' % places else: if delta is None: delta = 1e-8 # default delta value success = True standard_msg = '' # check value for keys in target keys1 = set(dict1.keys()) for key in keys1: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if abs(val1 - val2) > delta: success = False standard_msg += '(%s: %s != %s), ' % (key, val1, val2) # check values for keys in counts, not in target keys2 = set(dict2.keys()) - keys1 for key in keys2: val1 = dict1.get(key, default_value) val2 = dict2.get(key, default_value) if abs(val1 - val2) > delta: success = False standard_msg += '(%s: %s != %s), ' % (key, val1, val2) if success is True: return standard_msg = standard_msg[:-2] + ' within %s delta' % delta raise Exception(standard_msg) def compare_counts(result, circuits, targets, hex_counts=True, delta=0): """Compare counts dictionary to targets.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case if hex_counts: # Don't use get_counts method which converts hex output = result.data(circuit)["counts"] else: # Use get counts method which converts hex output = result.get_counts(circuit) assertDictAlmostEqual(output, target, delta=delta) def cx_gate_circuits_deterministic(final_measure=True): """CX-gate test circuits with deterministic counts.""" circuits = [] qr = QuantumRegister(2) if final_measure: cr = ClassicalRegister(2) regs = (qr, cr) else: regs = (qr, ) # CX01, |00> state circuit = QuantumCircuit(*regs) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10, |00> state circuit = QuantumCircuit(*regs) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(X^I), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(I^X), |01> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(I^X), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[0]) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(X^I), |11> state circuit = QuantumCircuit(*regs) circuit.x(qr[1]) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX01.(X^X), |01> state circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.cx(qr[0], qr[1]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) # CX10.(X^X), |10> state circuit = QuantumCircuit(*regs) circuit.x(qr) circuit.barrier(qr) circuit.cx(qr[1], qr[0]) if final_measure: circuit.barrier(qr) circuit.measure(qr, cr) circuits.append(circuit) return circuits def cx_gate_statevector_deterministic(): """CX-gate test circuits with deterministic counts.""" targets = [] # CX01, |00> state targets.append(np.array([1, 0, 0, 0])) # CX10, |00> state targets.append(np.array([1, 0, 0, 0])) # CX01.(X^I), |10> state targets.append(np.array([0, 0, 1, 0])) # CX10.(I^X), |01> state targets.append(np.array([0, 1, 0, 0])) # CX01.(I^X), |11> state targets.append(np.array([0, 0, 0, 1])) # CX10.(X^I), |11> state targets.append(np.array([0, 0, 0, 1])) # CX01.(X^X), |01> state targets.append(np.array([0, 1, 0, 0])) # CX10.(X^X), |10> state targets.append(np.array([0, 0, 1, 0])) return targets def cx_gate_unitary_deterministic(): """CX-gate circuits reference unitaries.""" targets = [] # CX01, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0]])) # CX10, |00> state targets.append(np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])) # CX01.(X^I), |10> state targets.append(np.array([[0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 0, 1]])) # CX10.(I^X), |01> state targets.append(np.array([[0, 1, 0, 0], [1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])) # CX01.(I^X), |11> state targets.append(np.array([[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0]])) # CX10.(X^I), |11> state targets.append(np.array([[0, 0, 1, 0], [0, 0, 0, 1], [0, 1, 0, 0], [1, 0, 0, 0]])) # CX01.(X^X), |01> state targets.append(np.array([[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]])) # CX10.(X^X), |10> state targets.append(np.array([[0, 0, 0, 1], [0, 0, 1, 0], [1, 0, 0, 0], [0, 1, 0, 0]])) return targets def compare_statevector(result, circuits, targets, global_phase=True, places=None): """Compare final statevectors to targets.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case output = result.get_statevector(circuit) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " {} != {}".format(output, target)) assertAlmostEqual(norm(output - target), 0, places=places, msg=msg) def compare_unitary(result, circuits, targets, global_phase=True, places=None): """Compare final unitary matrices to targets.""" for pos, test_case in enumerate(zip(circuits, targets)): circuit, target = test_case output = result.get_unitary(circuit) msg = ("Circuit ({}/{}):".format(pos + 1, len(circuits)) + " {} != {}".format(output, target)) if (global_phase): # Test equal including global phase assertAlmostEqual(norm(output - target), 0, places=places, msg=msg) else: # Test equal ignorning global phase delta = np.trace( np.dot(np.conj(np.transpose(output)), target)) - len(output) assertAlmostEqual(delta, 0, places=places) def model_and_pi_schedule(): """Return a simple model and schedule for pulse simulation""" # construct model model = duffing_system_model(dim_oscillators=2, oscillator_freqs=[5.0], anharm_freqs=[0], drive_strengths=[1.0], coupling_dict={}, dt=1.0) # construct Schedule schedule = Schedule(name='test_sched') # note: parameters set so that area under curve is 1/4 gauss_pulse = Gaussian(duration=10, amp=(1.0/4)/2.506627719963857, sigma=1) schedule = Schedule(name='test_sched') schedule |= gauss_pulse(DriveChannel(0)) acq_cmd = Acquire(duration=10) schedule += acq_cmd(AcquireChannel(0), MemorySlot(0)) << schedule.duration return model, schedule if __name__ == '__main__': # Run qasm simulator shots = 2000 circuits = grovers_circuit(final_measure=True, allow_sampling=True) targets = [{'0x0': 5 * shots / 8, '0x1': shots / 8, '0x2': shots / 8, '0x3': shots / 8}] simulator = QasmSimulator() qobj = assemble(transpile(circuits, simulator), simulator, shots=shots) result = simulator.run(qobj).result() assert result.status == 'COMPLETED' compare_counts(result, circuits, targets, delta=0.05 * shots) assert result.success is True # Run statevector simulator circuits = cx_gate_circuits_deterministic(final_measure=False) targets = cx_gate_statevector_deterministic() job = execute(circuits, StatevectorSimulator(), shots=1) result = job.result() assert result.status == 'COMPLETED' assert result.success is True compare_statevector(result, circuits, targets) # Run unitary simulator circuits = cx_gate_circuits_deterministic(final_measure=False) targets = cx_gate_unitary_deterministic() job = execute(circuits, UnitarySimulator(), shots=1, basis_gates=['u1', 'u2', 'u3', 'cx']) result = job.result() assert result.status == 'COMPLETED' assert result.success is True compare_unitary(result, circuits, targets) # Run pulse simulator system_model, schedule = model_and_pi_schedule() backend_sim = PulseSimulator() qobj = assemble([schedule], backend=backend_sim, qubit_lo_freq=[5.0], meas_level=1, meas_return='avg', shots=1) results = backend_sim.run(qobj, system_model).result() state = results.get_statevector(0) assertAlmostEqual(state[0], 0, delta=10**-5) assertAlmostEqual(state[1], -1j, delta=10**-5) qiskit-aer-0.4.1/tox.ini000066400000000000000000000021561362723322000151040ustar00rootroot00000000000000[tox] minversion = 2.1 envlist = py35, py36, py37, lint skipsdist = True [testenv] install_command = pip install -c{toxinidir}/constraints.txt -U {opts} {packages} setenv = VIRTUAL_ENV={envdir} LANGUAGE=en_US LC_ALL=en_US.utf-8 deps = -r requirements-dev.txt git+https://github.com/Qiskit/qiskit-terra.git commands = python setup.py bdist_wheel -- -- -j4 pip install --find-links={toxinidir}/dist qiskit_aer stestr run {posargs} [testenv:coverage] basepython = python3 setenv = {[testenv]setenv} PYTHON=coverage3 run --source qiskit --parallel-mode commands = stestr run {posargs} coverage3 combine coverage3 report [testenv:lint] deps = pycodestyle pylint git+https://github.com/Qiskit/qiskit-terra.git commands = pycodestyle --ignore=E402,W504 --max-line-length=100 qiskit/providers/aer pylint -j 2 -rn qiskit/providers/aer [testenv:docs] deps = -r requirements-dev.txt git+https://github.com/Qiskit/qiskit-terra.git commands = python setup.py bdist_wheel -- -- -j4 pip install --find-links={toxinidir}/dist qiskit_aer sphinx-build -W -b html docs/ docs/_build/html {posargs}

y1'rX#$ӡ~P ꨊ5\lm7d/L塖RKwO~02.:q ˇzt]C:&/ \%n]^v4${FQ)suھC*ĜVv5Q#lfrYF4:YљAzD]..JkȐӑ{;,VGh}R9W#W&!X&9Bʒd0f ƞvaҡjźVĄk17}psN%XWBtDe %ħVEV$㲑@1y/Mt2PP'0w{y7 F֋W6 !:Ƨ7B/՟9[, Ѳz?UpVj u: mGwagѵ$C} @I$֭rArV# E껤~USqmo(p,Y晩&{IQ|B5BJBNyȯMϓsK)/Y| rзIP:eUZd=k|Fj#;p~Zk}~eЉDyUgĻD$7kLCY#]]8~?oY#vP3Y/4ɟìi^XVPC?6&ZMrmm-!u 6 cb՝VG [ș>?bwgW>R/~ w_6ǣЀQ)B޶ ~6~ OlmtfYUS׶ GfyŹK|.~pcB ./?*FMEj2}iY;c qs '7t?j(,!IOkNWɒ(S^T)9܎ cGKԪxc84ϙlG!˹ԟs>QXEg8#%8@bzIW;kg,9 8b:U4z!\m821{bn3 k ,Sk6g:ȤBLQ4 {]BSif_lCmx. 'CXXp #NVU~ZnoC鯏MCɫٔ2 E"1&kSk3:$3oosenjg- 8NA"nܬ$0.P/E6fmUeo`6\c@zKlH>-7Ƀ*( tN.Г7*Pb I FYhkVǹ^9oFAOZP;$Bqe/㑝v^)%8Ń15A~q<U|yUEsy¨?8w6MSvJ:5}GX,HYM;z;}_6; 7OoBBu/}l^;{ \`(/lvMBdf$5>s/+gȌXa''{&qtvWWBP-M0]BPI,.1JP7fbcPو1`UO7.Kw($lۼ ':]>?:m! MA 3`GoU;P`)+ 0 eRov!>'v:U&PT,^o:"߀]%gP q.QtYZOQ|q^LQ( $, i*+yO NZ퍔ZQnCDm'S8U8LnYp[HN , s4- . 08ez0wlN(AG9LMaMznm'&x=@FΟ&"Z:P) D79yӂ#Zjz3[aHp?!~'KJ,c 7 K 6z+C ގ1m9A2P]k' |IE]#{o5#haU1*=/3.a(bނ&02񠄰k ?_%cWz-v3 #~b{]yqQt7'Dg&֬D^.x:dXK twוؒ?D9$uUn=9-j~~99@(OsI#gΛPuOo"=̡Do@9z!ds͢pl?cDIћ1(5œ;N"aSR/8#"+uRN:|s({n4`.[Ot`X)--Er-pM y,N\*mK:Df_:1妽==ңQ wt"ᮌ|G*5rۤ*{2#gn-,ޕL&$X=i]kn ?1* DyZ ]Du} Ǟ0ޕt^6$uU߰h@_7D++-13/%%EAVb7C C,qőGF+b| h)Ցk4R-r2 3rxlRQ&[q1c 5_aw\j=ZT)@Aq&gƩ$R^9}R^eql#Ny|* D_d_Y@5#Pcg |E)#*٢];o2ZRNNNHJ <޷zPf'G 'C=n1(1d(FsYv޹3P { zg $m`e*VhUe4v51ǏAy\5iHޜܬv@#9 =5e[ l( kĖLkKefH-7 =6>,8ſ_&/ZךN;x{uaCO]*r<)Q:n#L'd-+R`COcB@7ϕh;M9ak,u 2 YX<ykF` 98L u"g/[5 j34>]6ZvŧAd)1l‘~9-Kqъ=S,w Z5̍ DCF>X]} L$ ,åLiZz{eD*<_zU@yJmm\gIn[w. ._f>že"OG#Vtϱ`!E{CvCGHem)\n1YߐqCnwG4wדukh FUG!GA~ sr/0u$nJQ47@]C(Z*?j{jnPI5":q9 =ѳK V)tV%OF軶aCj2z9P9H>k)o E~#7h( /^asIF``52Qv+Q-B}aW-hyN' vlhL# S 1vVZt$Yѕ}Gv,.D%ڎ!bݏ _gJa',2e_(?fods-Š"7Q.غuy(-փ`hI:[Z IǦH,[ؽW]%+ gl_L|TP lyY vy`~OZ%Xr {&{gC4R:5a\<+9 +kڃ2)!tS趢G{5rHdeP`XG30#8a׵!.0YZ6?; 1Dqcx}Z:prZ\inRgH57d CΎD!`seըMDM-A "g!aWn R l[P_{ҫ4Q,Z+Tᢪ 4XUA@L ,?܋҆ZdO#dc y$B!X$rXI=s"(<õaLDkC}U#1؏3_)l;4xRLFEiy.!E6{4sol{؀HjOz]5a7'`iR[Q*$ʥ׳' 8`nNYZcA _ohJW!묩CQ D+xaxq7&_.%㲃%ͬ?,c?A[v"7nPQ+F\a&s[TGRYOv]))2U+"NaŌe.N%R SG$.C`3t"M{):)iTDP!c2Q HI 9dd%rU@WN=]e;78]/;Tm`N{xDOu~^Tٷ6.cG6B,72)UGI7|.K'\6vԝ|U;b?jdʁ493 b0,߰ eQJT|Ygӏԗc_y^ !o͂HA^@Tb 1rE _9ظz|JQe|<.. _̸9ihM] cE*rè) ЍF)PKԽtkJ>~GQtbF ^dM['jvB'OOQpJ:)̥ bzqtۧOk* Sx(hVs+PpX$ @$Oǁ\. RAu*g_9~29{6fZ!aBh7x>Ǯ)vt4*R}d}Y%Qa:H8|PAS%X0T/$H1VA۽ImqO'ZkB@a X8ٹ7Z[w.1/i?wȝ &fDDދ")Zs&t>)|*G)|%m#i佸JG@2X(o~M.%N`Q, PMgp|\nWy?ϺD<,:e ϵf7k>ew .fy|Q 6q՛h.S-uɾ8do@J3E3il$q=3%P:)iى,P8cE QC<齉?~2_3H5AmQZ1WIiVfW,CB浧[ kK+bC7B\0A˸6kӉ"KAܡ6 [$H'G__LoUy@!;h%{@ n5@;Wc7z\78z6 ЃlTwxH%YUO _"؞đ%ԳdיFa{Ұ{/zz#i@ݽEr,w>RRsHB}PHZjndezc=e+6ɭi[k0\".3*ɷA58AǾr.Yw݋^ p bx˽{U{09@; D -6<E zFfB`{ [KG-Ik\2S w`qƍ@dښ}N9%IzwA` afiK\x8_¿|,~;su.Jk$}h!1|#8B#.^'Rg Tatb4XFl(S\3ʮ#A~tTkJ' # LC@ɚU3)͸ s+`'* "p9mjFp%[HWi!@([1Ne!ںWR\s"S0D`x !&='o; [Y_פ5X"Jȉ ǘg'Q%-E`;5:+ĕ UJRqxZ) hk͌i>oY8BR6PF3þl T,v _ppg\>\\>0ΞziӖ>ͱZol/Ҟ]wh7 >L *#$21/QwC<}}ȓ=Yjލ$#i,h+eT3,DD9o =g//b6e_=~#z/R[9(]{pͩ ԧ?iٖ;E+ n*r ?EDߎ:>[_>Aҿ9>Ood]ڵwKDp,,DxvK 1p |h),]LD!Z QGi30d^=k*O*%O#̭ƣcBqɻPxHİk ?s&ǻ{԰UԺ:ITfK}\!D.`f&bewo7m aA$ПRq; sj!cja<]V3׍3 4,r^kV:&Pj{´V |k_U*ԭ6 s/q #0Q=|0L[u} 9PкPm 4~6?mA97]7Q'7j JF!NH>G~lR}d`[&?x+a;)̚Wo%ueB- kVNfsahu:Pa(XVlnBw7z&'3QUϨ2[|2r;,H KUA.ѦOW^AMi4a`!ٶFS6BI'7F),5R/7%W&X-Oq؂E 9 ;}> 3TM_]Z|S:l ԤGyNBa'E $JSVWI/Ys8~Sue^=ө̎vrWw-ے(% PL\O5%ϵ#we~{~O߁?;`x6D G2ϙ"+W*  Bjd=߯\I}r%g=)*&T=_ 2L.Z%[-/xEpˆaùUmn- %n称W: k> =]'PU0ۯʃqtYWr@k h`id`}*)b!;5:j:`~T`r9g2X&J7*S\G1/uف{jߊaH7OxDS#Qo7 $^oCϷ m}(nG\C, Z;Yq@˛A~*z}Ns(g}AOqiM YRPbPpkWbP>(TTY-E}<]s+٪mgIQ@\Ҙ9uINZLoXӸYŦ:^oh|fZOuMpr  mK~MGRnS˜Xr[ǝc׼|3E8rOEV|pcyu~d]/3:c l=iC -\ ͋6b "$Y^cH0TW#?;0.^ kp"^MX x,F]2,ΣoNo`;'sti&6oUV“>sk-*XFL*M2,֍6x(-3CS{P&* f7k'd"u6NMʘ< U{&&B~ϠjSG}DH͋|q4,E)m ?]MnGlhX;B ߳T2- $'U6\\Ǯ0꺔u!ObۺЇժ 8 *"jnX Qe|i0s\R_36$B0:(y`_a)u rMjJ~aZzl$ U.z{ 6zK?iQўt/Tvx(ь1 ^`t᪇L1LC1 (6%R{ZnslooR"I'F蘇wVslK]#'4UBv.\FgOs::Ue#Ex H( ʯ]C EZ bp_.aQhfyGg')(>34ޤ?t+BHplƸY\V L?7 878yFrW#Ӳa.WD#~0f{kajc eS,hiVY3'o|⎴L´ޘ0i+2BсCSnZJ@!IS{;S7!~Y۰BAxiSn.zT.gل2]-ϸvb}LZn abƅ!㡐̕=& vn߯)'~K# kc t-ԅ[Vq%K'l=_ ^2gn%o h`3K (XxML(0^'z3 *q\6׫fXY} O~\C5aC≠"Nr*GđԢg~ŗ4y^Q$Y_?-o|شٹ">C.~ւNGT s/şhӯ~vEھD<!7wN9.b\u6bmI.m@;G*:, 8X,\{^^a< pvJ0*{x(Max`DTM5ܫ. Ar&$4:yTo0WNHnjrjnY `q%EX VWBek[U3t;kc0,CvGBf) EiS3ufY]t[;Գc0J3op1{^Q(O"rEj^^ B"{`:${D(֎5tڨzBtigp# ǜ [yJou5 LlS]"vXkqITc ^w P ~)wsmx66ڢb亚M]҃j|n,˳,4hf`!:> ;yVûIw({o# r:yd\4djY\ѴݓrW&8TO6Ԧ=*} nf&YJH6?qZ ?E(cv=7q7F^ċAc7E5^v(]"k~=L|d`CjZ9ܓ~1YT/萓GsZaҟAvimY;"7ROrrՊAޭu4S` ּ͐z{x=?\cFx/AIݻ\U )b)]䅊|8\6Wޅ *^?$CyeavPɌ-̺|_ٚU^9H,z&wa(7stu%8t "2aJ+I$jU{O+L "J#SG@ˆLa)JS)Irq)Ô U{a-PĦ$qb]LrƼ;Lbd/*&jߛ )(DIA딤sj>J]hrn4YGM"bqNev[Z2NZ1IȞf~gSOLZZA i?#kzbm*yc$a۽@D/LC* U2T/ *j488ռs!b伯f]x A'XY +B;(NOn^fi->^yCar;(jDI|Iy4O7w@[B*# emXI1Qsuf7-6 ]]>7j 2L92jq+MӀK'aySr=4\X BS*1Σ.ә;dWNDV){4C[c~.ED+|RH3g<Hz{Ϡ{Ʉ*^ .LBީľlDgfrRV5oϊ #lRz@b7-?etŕ8`hעA%bW {lCIJok- )+`Ǻ0c:Q8 fmK:`v ؁cZE{)H\9]|Paί ɱ497'K;L\|joIY"Ro ƀ|hi~"&+72_FO6 3vÝ~j| >]*a1GtD*h`Z'=jJ3we%3fʂ}J\?po;Y]d{@'ڨ 2ڴ0ث'GJ<-Ay@I4%yUT1Ʌ_5Xχp`&-VD!b!WTCO C&:jjMMZ"VT1 5f͍Iͷ=;Y`Y]n0%и2Aټ Sg?f"-#hzw~U-'gh>n-W4y%2VKɤCQo+('lǣ;kC4j @&t<H˄[M6BYV00mѨƾ75k̍MJZ}X4m!l .X ?ʨxX&s֔RЃ>gWٔ;;K\ZǹN" -g.EN33&CD ޲c&`93X /ܼ5E]kOP^] 8S42"J^{Z.pX(~@ =wd%*}gSTE/_99I_T0$E'LXL>7pjE~)%V'=5={n*݃>Fkx/~O7}_ Sɮ2_M՛Q70W{hKuW8I;vt1\PJndKnM.pN/NP*rSSt(X5⮖3$؟#IqśJ䟽)^\DDBek@|=/X66̽,UI$W2Gwuf9yxߥrfddDA<6He5},=7ɀ8=|NwDQ2{;b97lUq7 ČMd&R5C1{x_oH;լR$hrm4N`Cs;\:NyZ}l -F>,)[E}tuV9Ӡ g A|H]'!| Yoy *S5,l|xᨄ %@X:LDYwp*=6T"!m<_vjFyk#'1H .]62?vm]^ہGUmBS "sj!_SkJ0Ba}]UO.H^Rگ,sW;VVɶ|S͞fP#ǼQٹ$}W4ZW PG7jwSnρj(_ik x )hm6=&$\޳Q!;"9m֗,Ye+A{@Lyyqˉ5dn sR[F '%~Ԭ|>J-S ?C]9w$%iB;=:$D\x'Z X(9 GoQJaz(W)m ʈvhJ;13'*1,q،7$mbd&FM:x+7N. QD|df̀]>2|͘[q".-̆}(N]^(7.[g&~{P4E-w=fO;| ?^kvF,'t̺17;F gQ%>/HݿV(ۤI/. XrQXvvB|@ڕL~&1LەߐW:Q-=,@5pٺecsOm/>Z薷0i\Nu'Kdkͬ(`⌗XSi9Vl|X|Ui*>@$P 'i}reJTߎe2|o1%< bbE\+ʯc30ܵ;jODw. "S}zY#8`ȿ2GA654QMGB>Xƶ/DcfYK -Te GVa' {pK C&ȹJS/(8P'żLyAR{:]wuMo!cycZ!鮪#l&' #1XJHSҙ=}GFS$䆉'_u+Q58+ m@I+Lx Jwl?C#g!"@w N%u!~# (iKN6A{IX݁IJL]T~mqE!pkc ;cpZN%1Y[7%'txN|vinZDa=)4&yscI#twQvn?^߮2>`B=-fRhWLq˕ =@ᬬɏ %e7x;\\o̹xALC(KsEoȵ4L yl[/hj>-ptWk'i]<^/yU)ǯxs;jWs![%*RX_|̭ϝgx:_&?TR3ז;!Sn,oRJ$Cf?@ԅJwvP[ ~Q՜+eϵ^!Ǚ\,YR8K(ٛ,4=_25'^`+ 6._gX$g^g[nPVxnt1Vɝ~,Mw!#Q)G#74XnQWij)D*&~ڶ[rTJkA/ B}_t&IkpLT2݈c kM|.J|Oq"(ov N#.1`y36h{e Z3K/( 'q߿A[LaFߦ<̜E'kt((Ze 1⥲ /4u\rx* 987kH`jڼf6Z(P` ݷd㬂`?W c2RF!1MK|eі"66][4i^7-纄 skj6Wn|i>1wH8q-Q B9^S@.Խaa.Ḱ.ݞQP1IY̠ >3Vʹ,z"6 z%ێxWĕ=Da`z⥛nqTܻP JCz*6@TոED}*Gm:.#PJ>3%B,Zr'ά(dW]X\ޱ]J-^0 Fe( ϿcYHnپ`^(.D)&A5I~,1PӕWϢ HXU`62@ҋIlu tui\%F&CCd@*'P@k_v4v;dH<ՅPM6B fL!|%Ȗ)"{?= T [Z$$!«i(E *7P=)>Ntbc0)Ndε">ގx{~&ZFD@<^`q&>0=WщpGK(Σqc׋pV ln ֈSg!`*_&k2 ?X7{gD&8gۚ$0´1VT?LJYu<=45[[筹e`TJyސXѝbr&oveCv}MUvǒQZ 5-ty!mnA =ÇOܸSq`s1WF6rX@>-rdhG, Mn;w5BLq 3_ Uw&]hD~G\̸JQnH~Z@rށq߃5>ȗk<<9.|EjҘ<ҧA V~ćdl4{C *о_J)T(b_X5AM8U:>J*eaӧW Vyn2* Q4jYk4YI5f@[*':;To^[DŽDYFq9n(FΚ`يI]p[a9~ <gۼ]8׵7spĦ~p.w< \Y.QJc. e,bXD Yk+JMѣ/dyZJsw$H6'+ZzreL3L[$"J3$i9*+O'1GRFl_&0)`Xr8ldz b4eUt7,$[ƪmU@+Ȯ鸰]dBsB#"W"f,|3d.|Ri714>I&=/qDѕ734Z$'+ עkcuօ w";A>x,BIyi:4_ /)T!ֲ/D F-n|_%dp0k'&@HP[uh= PۺH%x ˮ'1z/sF&?fMl9!%%!`lT2Cm oǴcpuP^Hl,E:/vaZYFՅ}r8Q\o&Lp1*(6xl#RB-L0>- ׵a|l5 >DdHnH 7#?z6~_wBx{lgDCPz]2^)(mQTz(/]v0O(6 ]u A` RK_ӗ`}[|r9U)%7Qp}VQVIJ8?*@i ~K4 'ivR[x~=;SY;ǻ]Ӿnb[U]~bF΋M I#@↠B,U%[4ݷqK\FOw~?Edh3[*\b[cѼ󙳛$4|7؛p9VXМxe =eA i"ۈ ?V7f*-+;tRzmKM 3%NU[f l4߬'4)3a 9[zY ƪ:j (U=V*!cD蒓76#uo7] A852jmȎK .a6w<(M*nXI^XCil v=kK2-Bts}ٷ(uOimkURP\S>Q a:`Ã2vHQ94݀~";ZAnZ/a+JJ >G i<SFD<5XuN2 FN+w6%'`6uNR<| _(G{%><~ߪ.qJEgb~O|B': =:(hE3^L$oT'RTsd'MP ) mܸW r3Y6dٰaP%6\'+;e r`7zcֆnCl2h 5u.L}Ɇ#0q>^CDC9[]#s5%9+qWcǜƨʾ-ʎĪZTf8#t!s->-8EuvP sGȁVX&M:P[ COÿ 9~%bUz`kPV4^,4٠.G*.>Zf6Rd7~匐+oғhZ 7s1G?Oy ʰL X^TDžxZel idxr{}' @S\/זSL)pY[y<*:o 5Li V]"]xnLb(|=\чpRٶиpڠ Rh93`Zʶ[퐅<@26׽?*}2K{ݴJ/orҝ̈ngVZV+5¡˼uDUI3;4ђ}pVRMyȤSQ9H$7 !@}7ӳ<O<$>#xc1uH{Bcmch }F} X$1ҿlQqMIpց;xDϤuc,X薘}J=O}w\$2b/N Rܣjjq}o_7 mU.++-u7emsǴeq_rUsKxopFz A!u,}8l9N!.r}IȔqop(zGbߓ)"P~VD3DŽ*WP@uNY FHӊ׎WYkְura+ oR O/3~ - Lf萀i/㝾Uլ}Sw;"L2?\@2]ףC@&ԧ"K2_ם R(F e@72letgPqn~A'f pvtH8MS]uA ϋ/+VZ! 3蕱|fz59(Ƒnz{%!=*X wzCs?gLDS#$E_HcQnzڀuSQU/v&DV&҇' M8gR2j08Ig"tlK1C4dIG!d)s GщdK2e0(L|cFx\jw~ n );'m?:;nzg6/-tGزK'J(]^xd[1̞)[«<-;mo9I=VWlԲԯ ֚7av.YaDmfhKZjM~b |l0KYW[_2z4 zQv+I> a49:u;!4w>&]M1P&6ׂ /CBplwl,4KÈ6 !3c}gRCN,wn~O55&YyДn"s;[OI".C!3;(Յ O[~R!o:E[#C0J>{%v10b$ᵋl2iso1V:Nw[I$4Bbv&+hKZ%*"C轸k)Ph!E˻o'fbE`DՊXd7ƒu~Zm5ZuBL+႙2C;^c]*Mk~>0pK Gp_m 2T8T3ϿB;7YuF\ U R1DxgWkV8j@e9sZ #bv3А+He 1J۵zɲ{vNTh,fbxݟ(Vs mG!0>؛l3 Á,l4P4jp tUaJsJ}DZf3 {qcME312ج,¼P6s6)kG랑>$ѴK0ՖOM9, >E>h*6HЖ|=]?tƩRu!ZH ) ,9*I{;A@L#.}dBXO!: dxRTvjpn2nXKL6j,%8אwgUH-%鵙'nA.X}yt=Ϊ,p"xcㄲ;F )lhk.8J5Ffr1{{sTaA3޿^rfg*] "~JsStv));b⋪ ] 76<gc\ڨtZ(z;Jњ_ܐ| /--P2U٠k\ҪV<^;h뇝H>YɽtmQ,F޿>(ϟG]RRct~k.W\kYtPV+ -h7e_PvptҞ\'agla &1 9mǂt_E8xJ.#nqzOzY˭\mJU먮 6$vӸWs7p6Ę~t?d"z" ֐+Gd8Wfl~絼e!z6HsWO^SmKTr dET4Gߵ9 ٲ0}k3>=KP U'<Pg+F7<џm܆ՖEɩk8|2ß%`pA \gХɶjƜ]@'BT A}Ͷ'{.&&CX>]a'@,S;]R/G%Nlk+aeAZ XЫVHDpWi[1p0(hX\:80#./r,L\O 71=ԭ|^5skmFB))Q;iD.E'4e,Ohx]Fׅ'wspQ&|mnP-Foy̚B(a ]w2IODTYP`*KI©Zl) ,B!r_\EӿVFѧ @LC4-aK JSw#Qftk/AHdsJ%o{ K'X3zI?@xCXbth#L$0qXB:9PNZT }z**ڰJ@n@ߘ?GeFHs^bi,he<^_R$]˶c\DJvfO5E1V1)7HMmxMDx([bk~M~ϬV.ރ"mL7x?cXB;"pfrxrNkyi^QauE'mmqwnˇg 5K>xԝ-x'JJ @E @[yGQ44f}i1YxE(n{k3 =JR=Ϙ̏Hb>I yTt\͋:\F U後}+?t0/#oOQ`Ɗϲ͕H+tkqXrn>W„-b GSxP>) b]ZMN1)4}~f\Lnt&'F%K}ߘ4bwqҽ] y9A: '((MjҞXy..[9NP9wit"&pKV{vvKu ~{&Q-3Au~8ȏ]L Hb /7R&%%"gA('u:ȶ#B([3Ř,ϿCƦQ-|%n:'Y|.VdyLt}Bqk/"փ@G ܼE#c\ I7c|Pߦo&FG k yX~=d c!Y*mk7$Jk;bFv* GX/^U4~<8!!{؋!{)$u;Kfk=SWv}JH#3 ђXD ۊ̖ K,:$ GqDXDm e\=޾ϥ^mR wҐdVwq]gL1ʾ3Q Iܰ巩7"=1Gk}!#^#k oM嵘")&C :*UIi8UmQt!qT|O;"'0  /JVt>6Xo(EA2IlR5nH'GO-Q! cW2)|vTk lcЇR[:<Q[YHmJKk$@q:,zE%,}O׸cQWCkg~B(p58*-H?(hҌHpLx#0f"6 Qu `@Wmh6桺e#$"2IAhSMH||Kw L*-ی|e$)޵e+RγB0Z K g/rֳ ȸDLȹK^hd ydAIml0/&Y+U*ebcp⿤vA28<{af>KJtӟh=.#0W%~/ `W$iy)aQ0;eeTѻ1 oVHq64M3wTn5<`a3]ɱ\`rgυe<_ש]Z~mf|o? 1߁$169&r>XAc>zP&\7V1O9P' cQGM-KF$YJ??u_sMɴTFB]͙(]P-f 4;Xa px(G'ʽ\":e(u GP%DLHѲ+r #en$v-W&3R7+f[t݄_Z Šx/Z JK#.˯ƍ%y~;axsAcCY.Rƾ;$FZЇs=plcp [")1̟6k|߁~d6,6mgݞ=d.{X6QAt&$C%ǬoIX8Y#p:nN 4L/gM'* ?p{ `r0bW#TqQGu J+$?@ٹC$AS-iOc#`Vx`{ ylD>IN0ê/e/P$Kx߹l<5~ѵ밁,![44b4dpg8vpI {k+ּEM{y3\ls3vDAx#NĶ<jRҧBZA=VΜ.}œ#8Ech J˪"f aN"78𬺿! T~Č8\koӠe7'L+ۛ*"yQr1/7N_`Қ8ʼn_%7TFpRB OOqFjYdn: A;,&[JY3ty3?Am#8+fsqT;FMM(}5b.3[ ۫W""pTXVޟ hB5}s̞zaPB:M{K\VZZE HEpZ\Do7P{Q/mYzÎ?n D2|O9ylu'n­2r30em˖݉FoDP%Pdh8L2; Y O^sOJ`s*8(]@ LfӲ|p-f<>H6Չ&?| /[2TM3%]? ޿URGVlRp$|ѝUOw T 0 x2|4}ϊ1S18`@a˰Mt2 Hm+fβF`S eSL(x6V}i&L\c 2H? H'0Sol6[vN%0laRy?"$4KxЬV`k$/=Lvrtd8RǼw߱&w蔸ѵm4awVij!%x% NJ u@80u?]}PJOۖnˍB+QFԂ%GsL=6GbOd"_>XM!Xi@W2<ͨ%\,s ؊_f񷏦RTW@?3¹< lUdF A!\N{;SKE 867'[YDJ'\O5r5xBR4j*qf?wlO#E Řm퇳8נswm1P{agfh-:#"li ErДԶC#9>uGP)Ji]"G78 VktFӦ W*ߩ %Wm=$0ٗCQ}u֖5|gnVM!oҞyqw[ṿt4vCbLgIx.+4rgfwb02XȻ2 9Ml `qVZ;@G^_rORjȌ~l6S<`ql"#=c<iCμ,V c⚜V&6ɸ}=S5'C.Ŝ/˛$KjpA Β UvtTy#t'?ϺNד@Љ\>2H#i!Q37D;#:Q^(]2v`Ě@ޚH6hT[L *7?$Ǡ)l^9Qt9u0> @η 1v@YIТփ |{}J]\B` "RuVd"EJfv $eN^rucD0ڃ#@XA"QaޅRl>V7MAq{/!U@GRcr0')g{ DN`&~\#Goa pg_6Ӵ |VޯORV# ]])_? Pނ%1m'Ko!P4XK'`Nv"Hᇋ-G f"g)!:"f.3@xM=t5ǚU 2/AKY~]NEH'#*'-zuad-"Wκ宧rJJ 1~bS Kp 2P㸡Zo fRTh@yPj}H5Zw/זmJ$«ƋrF5SV]2)CoďGYi֪G6d(ۥTf/%"6q(h7 &[DsXQeŢcf7fS2#XW>eh Zt_Ox&d]5<}$Ɲ5]2*B@%#_]nA;n'bh} |F[)à4BsҚ̶ta}rvH(WkJw`4̮)QrWl31 MTPaq4u Bbļ:&r r,6G&b&n/u3jPמSuqeӽ5/;WX kݭy< '\6Ʌua cLS5S ÃVC&]IZ<*X•gEA06 8D4s1 /fՅWR++UVsL=MJȰ$0P J"2k֠mI*DiQ6zrX1eR*( #xR^ґ4"jFB'= <)@}ObM#Hrmʧ3ڋ0`+C_ ٕ%GaVӀMx1`J2TCcf,h /aN;Nx q>dPVu@abwkݗJ1I[E3cM }d6R,x$b7Jw)w<[U,Vgo hsyLOdqBvolb' jȺ|ڐ^vPVUsHjQÏEfCS̞fLT_KؽqƑ1&)0ʳQO4_t;y&C%>Еfo;P^!mv07mI\ uyBR]An:}cQ94,I:o5MQ:& VNEuiY!y%yMilsNH(_F|PpwK&l!&2 & ZJkWmڬi@asPD7 7H,8DFw`k9CDiV_O&!+K Ba{0L?BPadE>/,`1t+-=q S d5T{ŭ~zA?!YwifUOB'2+v~_*wk*p1`VmY$~DgJힻx{K{Uh}"v9UC1P5b0uJMoa&o^ 8ZI-y;FoY _T+y<с̻JK=@ 36j"km4 m_~ec׽,,|jK+/1To CT>-OQ0W]wFrY4MsVˏPWLq.' drQ^퉯x<̡!Ś~o br *o j4/m[ۦ3уBAu;_Jqkqɳ@>+, )TÊQqz4Brbb{ЕxJpK7)sv@m3&[L!S.P ‹ ŊMYaf>=. 4${J}holLϳ}δuZOJnNvu,03iӳpjXZ=aF<ܢK ) ]wܫ{+9^!TyYA;M" so8qbyI~!p!}g&!+6AcA-FPu|f/p?xX#cjw%Cm+;Y/ yp ;uw]ώbB[dm'- /j݆$EKUE*%9fuwsh{-粒QEN3lRz G["C;41@nM۰-E)}T Gќ UkI >%yldP f^g^n4+%B& !a%Na.x;!"U&j%e< 1@Ъ F}_ ,&O/97PG_jd\? #Yg*??>zbؐxKh{DlEfָOddi};e@2C(#?*`aHF̴T%?<]].vb[Xv*px55FbS49&v$HI0X/ kYPN7EY^qҷeԓ٩hzq-:mG{'C6(sͮbUlV'g}RDZ棹fd`Q̯[`=%" '1_mPEeS&Lî \40.C:I{UCݣĚ>uO#wb9B6Rl\/G䔢3NʐnZΝaH$%{,$(pKESBB.boq3Xbůuwc\'N?H̦d}B>zw UCT)>0 (|ZOr p|?rVn,*U ݐ~!67gB[cIi-2!v0T4Bk(yS'1~eW#m{,;?x" ƣexrATTK_kAT!hnWv f}vq"PGt`\P|Ss_ ȝ@(1KS1EpWcגL"}!=sRTF$ &+!>k.ˁtpщ1by3d bf_ZFYw`l1g#h|"2tA9r 74TǾK&7dM|⸴f#h غf^l}el'i7O$}\3}!D$&B [!"hBk'k5awI]8kii=NGOV>tYrX91}lxqZEѯ,N򀲬&xEp ~9ZLS|4 cjɿuwچa6 &޷FHŷ-/WX3*Xq` ~tǞ^ͶEP*&/g#X{/r0Uh[7 ޻a##^xkÎ6DGFY dǁQ%! ϳr^}%9WNI;d`ԚfY5w&l}0-71vt#s cɆJy^A `1)>X/ui.+fsRqPPuҀMZdn >F3A)/AÀ*Ðʡg`X,d~JqE#EbW.wwAp x K7vAAz nx0kïE.tIV]*V1>Ơ0)*o=D|k\)P}CÚ^rQcRlz#GWKB Nmؑw|u._ &wO j'oS :D76`H?7U+ڒ{lƱoZ4H^S0[?_ftEq)|N Z26/J(_(#8J2'w/U2Җ\SABPֈphd,b ݃/S27axQ ޞM=0^I#{chD/)\%P+S0$؋nض5_bjmI@A[#-u_U)?s_/uUk.K z%Lɠj U4xa:%ey2 9wfRYWx'YEXC k,ώ{}l,W{퍂Bex^AŞp,}xF[i 5ܮ7d= "}3zRYE"K}hӃਲ7&+ǥĻâczӊK4y|G+)g8C 6?UK'U,!o䓦 ֟@f`sxol.|I m<|OZ-C9.^@"0onSOʐ;>Uo073>A kFN;z3 7HvV]/o`GϠ1I:k -