From 50c90ccabbe0365c8a31a86a04c3f209fd85d943 Mon Sep 17 00:00:00 2001 From: harisbal Date: Wed, 19 Sep 2018 16:53:03 +0100 Subject: [PATCH] Allow for join between two multi-index dataframe instances --- .circleci/config.yml | 147 + .coveragerc | 27 - .github/CODE_OF_CONDUCT.md | 63 + .gitignore | 10 +- .pep8speaks.yml | 6 +- .travis.yml | 57 +- LICENSES/XARRAY_LICENSE | 191 + MANIFEST.in | 34 +- Makefile | 3 +- README.md | 70 +- appveyor.yml | 22 +- asv_bench/benchmarks/algorithms.py | 168 +- asv_bench/benchmarks/attrs_caching.py | 8 +- asv_bench/benchmarks/binary_ops.py | 126 +- asv_bench/benchmarks/categoricals.py | 235 +- asv_bench/benchmarks/ctors.py | 64 +- asv_bench/benchmarks/eval.py | 59 +- asv_bench/benchmarks/frame_ctor.py | 159 +- asv_bench/benchmarks/frame_methods.py | 642 +-- asv_bench/benchmarks/gil.py | 453 +- asv_bench/benchmarks/groupby.py | 867 ++- asv_bench/benchmarks/hdfstore_bench.py | 129 - asv_bench/benchmarks/index_object.py | 308 +- asv_bench/benchmarks/indexing.py | 461 +- asv_bench/benchmarks/inference.py | 148 +- .../benchmarks/io}/__init__.py | 0 asv_bench/benchmarks/io/csv.py | 229 + asv_bench/benchmarks/io/excel.py | 36 + asv_bench/benchmarks/io/hdf.py | 151 + asv_bench/benchmarks/io/json.py | 127 + asv_bench/benchmarks/io/msgpack.py | 26 + asv_bench/benchmarks/io/pickle.py | 26 + asv_bench/benchmarks/io/sas.py | 21 + asv_bench/benchmarks/io/sql.py | 132 + asv_bench/benchmarks/io/stata.py | 37 + asv_bench/benchmarks/io_bench.py | 224 - asv_bench/benchmarks/io_sql.py | 105 - asv_bench/benchmarks/join_merge.py | 423 +- asv_bench/benchmarks/multiindex_object.py | 140 + asv_bench/benchmarks/offset.py | 125 + asv_bench/benchmarks/packers.py | 318 -- asv_bench/benchmarks/pandas_vb_common.py | 58 +- asv_bench/benchmarks/panel_ctor.py | 83 +- asv_bench/benchmarks/panel_methods.py | 32 +- asv_bench/benchmarks/parser_vb.py | 121 - asv_bench/benchmarks/period.py | 159 +- asv_bench/benchmarks/plotting.py | 57 +- asv_bench/benchmarks/reindex.py | 205 +- asv_bench/benchmarks/replace.py | 96 +- asv_bench/benchmarks/reshape.py | 151 +- asv_bench/benchmarks/rolling.py | 258 +- asv_bench/benchmarks/series_methods.py | 221 +- asv_bench/benchmarks/sparse.py | 269 +- asv_bench/benchmarks/stat_ops.py | 239 +- asv_bench/benchmarks/strings.py | 173 +- asv_bench/benchmarks/timedelta.py | 127 +- asv_bench/benchmarks/timeseries.py | 605 +- asv_bench/benchmarks/timestamp.py | 108 +- asv_bench/vbench_to_asv.py | 163 - ci/appveyor-27.yaml | 31 + ci/appveyor-36.yaml | 28 + ...tall_travis.sh => before_script_travis.sh} | 1 + ci/build_docs.sh | 19 +- ci/check_imports.py | 3 +- ci/circle-27-compat.yaml | 29 + ci/circle-35-ascii.yaml | 15 + ci/circle-36-locale.yaml | 35 + ci/circle-36-locale_slow.yaml | 36 + ci/doctests.sh | 60 + ci/environment-dev.yaml | 12 +- ci/install_circle.sh | 49 +- ci/install_db_circle.sh | 8 - ci/install_travis.sh | 101 +- ci/lint.sh | 135 +- ci/print_skipped.py | 6 +- ci/requirements-2.7.build | 6 - ci/requirements-2.7.pip | 10 - ci/requirements-2.7.run | 20 - ci/requirements-2.7.sh | 7 - ci/requirements-2.7_BUILD_TEST.build | 6 - ci/requirements-2.7_BUILD_TEST.pip | 7 - ci/requirements-2.7_BUILD_TEST.sh | 7 - ci/requirements-2.7_COMPAT.build | 5 - ci/requirements-2.7_COMPAT.pip | 4 - ci/requirements-2.7_COMPAT.run | 14 - ci/requirements-2.7_LOCALE.build | 5 - ci/requirements-2.7_LOCALE.pip | 3 - ci/requirements-2.7_LOCALE.run | 12 - ci/requirements-2.7_SLOW.build | 5 - ci/requirements-2.7_SLOW.run | 19 - ci/requirements-2.7_WIN.run | 18 - ci/requirements-3.5.build | 6 - ci/requirements-3.5.pip | 2 - ci/requirements-3.5.run | 20 - ci/requirements-3.5.sh | 11 - ci/requirements-3.5_ASCII.build | 6 - ci/requirements-3.5_ASCII.run | 3 - ci/requirements-3.5_OSX.build | 4 - ci/requirements-3.5_OSX.pip | 1 - ci/requirements-3.5_OSX.run | 16 - ci/requirements-3.5_OSX.sh | 7 - ci/requirements-3.6.build | 6 - ci/requirements-3.6.pip | 1 - ci/requirements-3.6.run | 25 - ci/requirements-3.6_DOC.build | 5 - ci/requirements-3.6_DOC.run | 25 - ci/requirements-3.6_DOC.sh | 11 - ci/requirements-3.6_LOCALE.build | 6 - ci/requirements-3.6_LOCALE.run | 22 - ci/requirements-3.6_LOCALE_SLOW.build | 6 - ci/requirements-3.6_LOCALE_SLOW.run | 22 - ci/requirements-3.6_NUMPY_DEV.build | 2 - ci/requirements-3.6_NUMPY_DEV.build.sh | 20 - ci/requirements-3.6_NUMPY_DEV.run | 1 - ci/requirements-3.6_WIN.run | 16 - ci/requirements-optional-conda.txt | 8 +- ci/requirements-optional-pip.txt | 12 +- ci/requirements_dev.txt | 14 +- ci/run_circle.sh | 4 +- ci/script_multi.sh | 32 +- ci/script_single.sh | 18 +- ci/travis-27-locale.yaml | 28 + ci/travis-27.yaml | 53 + ci/travis-35-osx.yaml | 28 + ci/travis-36-doc.yaml | 47 + ci/travis-36-slow.yaml | 31 + ci/travis-36.yaml | 49 + ci/travis-37-numpydev.yaml | 17 + ci/travis-37.yaml | 15 + circle.yml | 38 - conda.recipe/meta.yaml | 28 +- doc/README.rst | 6 +- doc/cheatsheet/Pandas_Cheat_Sheet.pdf | Bin 175124 -> 339134 bytes doc/cheatsheet/Pandas_Cheat_Sheet.pptx | Bin 178327 -> 105265 bytes doc/cheatsheet/Pandas_Cheat_Sheet_JP.pdf | Bin 0 -> 205542 bytes doc/cheatsheet/Pandas_Cheat_Sheet_JP.pptx | Bin 0 -> 105265 bytes doc/make.py | 696 ++- doc/plots/stats/moment_plots.py | 30 - doc/plots/stats/moments_ewma.py | 15 - doc/plots/stats/moments_ewmvol.py | 23 - doc/plots/stats/moments_expw.py | 35 - doc/plots/stats/moments_rolling.py | 24 - doc/plots/stats/moments_rolling_binary.py | 30 - doc/source/10min.rst | 144 +- doc/source/_static/banklist.html | 4 +- doc/source/_static/favicon.ico | Bin 0 -> 3902 bytes doc/source/_static/print_df_new.png | Bin 0 -> 77202 bytes doc/source/_static/print_df_old.png | Bin 0 -> 89239 bytes doc/source/_static/reshaping_melt.png | Bin 0 -> 52900 bytes doc/source/_static/reshaping_pivot.png | Bin 0 -> 52132 bytes doc/source/_static/reshaping_stack.png | Bin 0 -> 54479 bytes doc/source/_static/reshaping_unstack.png | Bin 0 -> 53895 bytes doc/source/_static/reshaping_unstack_0.png | Bin 0 -> 58533 bytes doc/source/_static/reshaping_unstack_1.png | Bin 0 -> 57978 bytes doc/source/advanced.rst | 318 +- doc/source/api.rst | 453 +- doc/source/basics.rst | 312 +- doc/source/categorical.rst | 289 +- doc/source/comparison_with_r.rst | 12 +- doc/source/comparison_with_sas.rst | 52 +- doc/source/comparison_with_sql.rst | 2 +- doc/source/comparison_with_stata.rst | 680 +++ doc/source/computation.rst | 131 +- doc/source/conf.py | 221 +- doc/source/contributing.rst | 444 +- doc/source/contributing_docstring.rst | 997 ++++ doc/source/cookbook.rst | 42 +- doc/source/developer.rst | 16 +- doc/source/dsintro.rst | 246 +- doc/source/ecosystem.rst | 235 +- doc/source/enhancingperf.rst | 148 +- doc/source/extending.rst | 351 ++ doc/source/gotchas.rst | 118 +- doc/source/groupby.rst | 217 +- doc/source/index.rst.template | 20 +- doc/source/indexing.rst | 293 +- doc/source/install.rst | 170 +- doc/source/internals.rst | 205 +- doc/source/io.rst | 1206 ++-- doc/source/merging.rst | 401 +- doc/source/missing_data.rst | 166 +- doc/source/names_wordlist.txt | 1652 ++++++ doc/source/options.rst | 354 +- doc/source/overview.rst | 43 +- doc/source/release.rst | 726 ++- doc/source/remote_data.rst | 30 - doc/source/reshaping.rst | 195 +- doc/source/sparse.rst | 23 +- doc/source/spelling_wordlist.txt | 920 ++++ doc/source/style.ipynb | 88 +- doc/source/text.rst | 173 +- .../nature_with_gtoc/static/nature.css_t | 10 +- doc/source/timedeltas.rst | 81 +- doc/source/timeseries.rst | 400 +- doc/source/tutorials.rst | 194 +- doc/source/visualization.rst | 140 +- doc/source/whatsnew.rst | 16 + doc/source/whatsnew/v0.10.0.txt | 37 +- doc/source/whatsnew/v0.10.1.txt | 10 +- doc/source/whatsnew/v0.11.0.txt | 12 +- doc/source/whatsnew/v0.12.0.txt | 20 +- doc/source/whatsnew/v0.13.0.txt | 6 +- doc/source/whatsnew/v0.13.1.txt | 40 +- doc/source/whatsnew/v0.14.0.txt | 70 +- doc/source/whatsnew/v0.14.1.txt | 36 +- doc/source/whatsnew/v0.15.0.txt | 40 +- doc/source/whatsnew/v0.15.1.txt | 8 +- doc/source/whatsnew/v0.15.2.txt | 14 +- doc/source/whatsnew/v0.16.0.txt | 18 +- doc/source/whatsnew/v0.16.1.txt | 14 +- doc/source/whatsnew/v0.16.2.txt | 10 +- doc/source/whatsnew/v0.17.0.txt | 12 +- doc/source/whatsnew/v0.17.1.txt | 14 +- doc/source/whatsnew/v0.18.0.txt | 22 +- doc/source/whatsnew/v0.18.1.txt | 12 +- doc/source/whatsnew/v0.19.0.txt | 15 +- doc/source/whatsnew/v0.19.1.txt | 4 +- doc/source/whatsnew/v0.19.2.txt | 4 +- doc/source/whatsnew/v0.20.0.txt | 23 +- doc/source/whatsnew/v0.20.2.txt | 4 +- doc/source/whatsnew/v0.21.0.txt | 51 +- doc/source/whatsnew/v0.21.1.txt | 158 +- doc/source/whatsnew/v0.22.0.txt | 302 +- doc/source/whatsnew/v0.23.0.txt | 1414 +++++ doc/source/whatsnew/v0.23.1.txt | 140 + doc/source/whatsnew/v0.23.2.txt | 108 + doc/source/whatsnew/v0.23.3.txt | 7 + doc/source/whatsnew/v0.23.4.txt | 37 + doc/source/whatsnew/v0.23.5.txt | 54 + doc/source/whatsnew/v0.24.0.txt | 846 +++ doc/source/whatsnew/v0.6.0.txt | 2 +- doc/source/whatsnew/v0.6.1.txt | 4 +- doc/source/whatsnew/v0.7.3.txt | 6 +- doc/source/whatsnew/v0.8.0.txt | 14 +- doc/source/whatsnew/v0.8.1.txt | 2 +- doc/source/whatsnew/v0.9.1.txt | 4 +- doc/sphinxext/README.rst | 2 +- .../ipython_console_highlighting.py | 116 - .../ipython_sphinxext/ipython_directive.py | 1091 ---- doc/sphinxext/numpydoc/__init__.py | 7 +- doc/sphinxext/numpydoc/comment_eater.py | 169 - doc/sphinxext/numpydoc/compiler_unparse.py | 865 --- doc/sphinxext/numpydoc/docscrape.py | 243 +- doc/sphinxext/numpydoc/docscrape_sphinx.py | 264 +- doc/sphinxext/numpydoc/linkcode.py | 83 - doc/sphinxext/numpydoc/numpydoc.py | 196 +- doc/sphinxext/numpydoc/phantom_import.py | 167 - doc/sphinxext/numpydoc/plot_directive.py | 642 --- .../numpydoc/templates/numpydoc_docstring.rst | 16 + .../numpydoc/tests/test_docscrape.py | 553 +- doc/sphinxext/numpydoc/tests/test_linkcode.py | 5 - .../numpydoc/tests/test_phantom_import.py | 5 - .../numpydoc/tests/test_plot_directive.py | 5 - .../numpydoc/tests/test_traitsdoc.py | 5 - doc/sphinxext/numpydoc/traitsdoc.py | 142 - pandas/__init__.py | 27 +- pandas/_libs/__init__.py | 8 +- pandas/_libs/algos.pxd | 15 +- pandas/_libs/algos.pyx | 695 ++- pandas/_libs/algos_common_helper.pxi.in | 445 +- pandas/_libs/algos_rank_helper.pxi.in | 83 +- pandas/_libs/algos_take_helper.pxi.in | 22 +- pandas/_libs/groupby.pyx | 510 +- pandas/_libs/groupby_helper.pxi.in | 598 +- pandas/_libs/hashing.pyx | 58 +- pandas/_libs/hashtable.pxd | 9 - pandas/_libs/hashtable.pyx | 51 +- pandas/_libs/hashtable_class_helper.pxi.in | 307 +- pandas/_libs/hashtable_func_helper.pxi.in | 36 +- pandas/_libs/index.pyx | 338 +- pandas/_libs/index_class_helper.pxi.in | 33 +- pandas/_libs/indexing.pyx | 7 +- pandas/_libs/internals.pyx | 464 ++ pandas/_libs/interval.pyx | 318 +- pandas/_libs/intervaltree.pxi.in | 5 +- pandas/_libs/join.pyx | 37 +- pandas/_libs/{src => }/khash.pxd | 5 +- pandas/_libs/lib.pxd | 4 - pandas/_libs/lib.pyx | 2528 +++++---- pandas/_libs/missing.pxd | 10 + pandas/_libs/missing.pyx | 326 ++ pandas/_libs/ops.pyx | 295 + pandas/_libs/parsers.pyx | 414 +- pandas/_libs/period.pyx | 1253 ----- pandas/_libs/properties.pyx | 52 +- .../_libs/{src/reduce.pyx => reduction.pyx} | 41 +- pandas/_libs/reshape.pyx | 101 +- pandas/_libs/reshape_helper.pxi.in | 81 - pandas/_libs/{src => }/skiplist.pxd | 25 +- pandas/_libs/{src => }/skiplist.pyx | 32 +- pandas/_libs/sparse.pyx | 45 +- pandas/_libs/sparse_op_helper.pxi.in | 4 +- pandas/_libs/src/compat_helper.h | 2 +- pandas/_libs/src/datetime.pxd | 150 - pandas/_libs/src/datetime/np_datetime.h | 138 - pandas/_libs/src/headers/cmath | 16 + pandas/_libs/src/headers/math.h | 11 - pandas/_libs/src/inference.pyx | 1720 ------ .../_libs/src/{helper.h => inline_helper.h} | 6 +- pandas/_libs/src/klib/khash.h | 13 +- pandas/_libs/src/klib/khash_python.h | 26 +- pandas/_libs/src/klib/ktypes.h | 6 - pandas/_libs/src/klib/kvec.h | 151 - pandas/_libs/src/numpy.pxd | 984 ---- pandas/_libs/src/numpy_helper.h | 134 - pandas/_libs/src/parse_helper.h | 1 + pandas/_libs/src/parser/.gitignore | 2 - pandas/_libs/src/parser/Makefile | 13 - pandas/_libs/src/parser/tokenizer.c | 61 +- pandas/_libs/src/parser/tokenizer.h | 14 +- pandas/_libs/src/period_helper.c | 1518 ----- pandas/_libs/src/period_helper.h | 191 - pandas/_libs/src/skiplist.h | 13 +- pandas/_libs/src/ujson/lib/ultrajson.h | 4 +- pandas/_libs/src/ujson/python/objToJSON.c | 56 +- pandas/_libs/src/ujson/python/ujson.c | 4 +- pandas/_libs/src/util.pxd | 126 - pandas/_libs/testing.pyx | 7 + pandas/_libs/tslib.pxd | 8 - pandas/_libs/tslib.pyx | 2507 ++------- pandas/_libs/tslibs/__init__.py | 9 +- pandas/_libs/tslibs/ccalendar.pxd | 12 + pandas/_libs/tslibs/ccalendar.pyx | 227 + pandas/_libs/tslibs/conversion.pxd | 20 +- pandas/_libs/tslibs/conversion.pyx | 916 ++- pandas/_libs/tslibs/fields.pyx | 240 +- pandas/_libs/tslibs/frequencies.pxd | 7 +- pandas/_libs/tslibs/frequencies.pyx | 327 +- pandas/_libs/tslibs/nattype.pxd | 7 +- pandas/_libs/tslibs/nattype.pyx | 164 +- pandas/_libs/tslibs/np_datetime.pxd | 67 +- pandas/_libs/tslibs/np_datetime.pyx | 146 +- pandas/_libs/tslibs/offsets.pxd | 3 + pandas/_libs/tslibs/offsets.pyx | 952 +++- pandas/_libs/tslibs/parsing.pyx | 144 +- pandas/_libs/tslibs/period.pyx | 2536 +++++++++ pandas/_libs/tslibs/resolution.pyx | 354 ++ .../{ => tslibs}/src/datetime/np_datetime.c | 504 +- .../_libs/tslibs/src/datetime/np_datetime.h | 80 + .../src/datetime/np_datetime_strings.c | 687 +-- .../src/datetime/np_datetime_strings.h | 53 +- pandas/_libs/tslibs/strptime.pyx | 167 +- pandas/_libs/tslibs/timedeltas.pxd | 17 +- pandas/_libs/tslibs/timedeltas.pyx | 1174 +++- pandas/_libs/tslibs/timestamps.pxd | 8 + pandas/_libs/tslibs/timestamps.pyx | 1119 ++++ pandas/_libs/tslibs/timezones.pxd | 4 +- pandas/_libs/tslibs/timezones.pyx | 115 +- pandas/_libs/tslibs/util.pxd | 228 + pandas/_libs/util.pxd | 114 + pandas/_libs/window.pyx | 610 +- pandas/_libs/writers.pyx | 171 + pandas/_version.py | 62 +- pandas/api/__init__.py | 1 + pandas/api/extensions/__init__.py | 10 + pandas/compat/__init__.py | 90 +- pandas/compat/chainmap_impl.py | 9 +- pandas/compat/numpy/__init__.py | 13 +- pandas/compat/openpyxl_compat.py | 35 - pandas/compat/pickle_compat.py | 24 +- pandas/computation/expressions.py | 4 + pandas/conftest.py | 451 +- pandas/core/accessor.py | 206 +- pandas/core/algorithms.py | 484 +- pandas/core/api.py | 24 +- pandas/core/apply.py | 411 ++ pandas/core/arrays/__init__.py | 10 + pandas/core/arrays/base.py | 794 +++ pandas/core/arrays/categorical.py | 2564 +++++++++ pandas/core/arrays/datetimelike.py | 880 +++ pandas/core/arrays/datetimes.py | 1358 +++++ pandas/core/arrays/integer.py | 628 +++ pandas/core/arrays/interval.py | 1043 ++++ pandas/core/arrays/period.py | 488 ++ pandas/core/arrays/timedeltas.py | 427 ++ pandas/core/base.py | 479 +- pandas/core/categorical.py | 2367 +------- pandas/core/common.py | 407 +- pandas/core/computation/align.py | 6 +- pandas/core/computation/check.py | 2 +- pandas/core/computation/eval.py | 24 +- pandas/core/computation/expr.py | 13 +- pandas/core/computation/expressions.py | 17 +- pandas/core/computation/ops.py | 12 +- pandas/core/computation/pytables.py | 4 +- pandas/core/computation/scope.py | 2 +- pandas/core/config.py | 25 +- pandas/core/config_init.py | 64 +- pandas/core/datetools.py | 51 - pandas/core/dtypes/api.py | 1 + pandas/core/dtypes/base.py | 227 + pandas/core/dtypes/cast.py | 396 +- pandas/core/dtypes/common.py | 232 +- pandas/core/dtypes/concat.py | 200 +- pandas/core/dtypes/dtypes.py | 319 +- pandas/core/dtypes/generic.py | 7 +- pandas/core/dtypes/inference.py | 78 +- pandas/core/dtypes/missing.py | 243 +- pandas/core/frame.py | 4110 +++++++++----- pandas/core/generic.py | 4889 ++++++++++++---- pandas/core/groupby.py | 4651 ---------------- pandas/core/groupby/__init__.py | 4 + pandas/core/groupby/base.py | 159 + pandas/core/groupby/categorical.py | 99 + pandas/core/groupby/generic.py | 1662 ++++++ pandas/core/groupby/groupby.py | 1966 +++++++ pandas/core/groupby/grouper.py | 634 +++ pandas/core/groupby/ops.py | 916 +++ pandas/core/indexes/accessors.py | 312 +- pandas/core/indexes/api.py | 73 +- pandas/core/indexes/base.py | 2227 +++++--- pandas/core/indexes/category.py | 274 +- pandas/core/indexes/datetimelike.py | 571 +- pandas/core/indexes/datetimes.py | 1458 ++--- pandas/core/indexes/frozen.py | 24 +- pandas/core/indexes/interval.py | 876 ++- pandas/core/indexes/multi.py | 778 +-- pandas/core/indexes/numeric.py | 81 +- pandas/core/indexes/period.py | 659 +-- pandas/core/indexes/range.py | 131 +- pandas/core/indexes/timedeltas.py | 525 +- pandas/core/indexing.py | 1218 ++-- pandas/core/internals/__init__.py | 14 + .../{internals.py => internals/blocks.py} | 3852 +++---------- pandas/core/internals/concat.py | 474 ++ pandas/core/internals/managers.py | 2053 +++++++ pandas/core/missing.py | 235 +- pandas/core/nanops.py | 116 +- pandas/core/ops.py | 2586 +++++---- pandas/core/panel.py | 268 +- pandas/core/panel4d.py | 99 - pandas/core/panelnd.py | 132 - pandas/core/resample.py | 574 +- pandas/core/reshape/api.py | 8 +- pandas/core/reshape/concat.py | 55 +- pandas/core/reshape/melt.py | 444 ++ pandas/core/reshape/merge.py | 356 +- pandas/core/reshape/pivot.py | 111 +- pandas/core/reshape/reshape.py | 693 +-- pandas/core/reshape/tile.py | 268 +- pandas/core/reshape/util.py | 9 +- pandas/core/series.py | 2385 +++++--- pandas/core/sorting.py | 47 +- pandas/core/sparse/api.py | 1 - pandas/core/sparse/array.py | 102 +- pandas/core/sparse/frame.py | 154 +- pandas/core/sparse/list.py | 152 - pandas/core/sparse/series.py | 143 +- pandas/core/strings.py | 1926 +++++-- pandas/core/tools/datetimes.py | 610 +- pandas/core/tools/numeric.py | 9 +- pandas/core/tools/timedeltas.py | 18 +- pandas/core/util/hashing.py | 12 +- pandas/core/window.py | 944 +++- pandas/errors/__init__.py | 133 +- pandas/formats/style.py | 7 - pandas/io/clipboard/__init__.py | 25 +- pandas/io/clipboard/clipboards.py | 19 +- pandas/io/clipboards.py | 51 +- pandas/io/common.py | 141 +- pandas/io/data.py | 6 - pandas/io/excel.py | 746 +-- pandas/io/feather_format.py | 4 +- pandas/io/formats/common.py | 44 - pandas/io/formats/console.py | 81 +- pandas/io/formats/csvs.py | 318 ++ pandas/io/formats/excel.py | 45 +- pandas/io/formats/format.py | 1228 +---- pandas/io/formats/html.py | 507 ++ pandas/io/formats/latex.py | 245 + pandas/io/formats/printing.py | 161 +- pandas/io/formats/style.py | 449 +- pandas/io/formats/terminal.py | 26 +- pandas/io/gbq.py | 157 +- pandas/io/gcs.py | 16 + pandas/io/html.py | 548 +- pandas/io/json/json.py | 169 +- pandas/io/json/normalize.py | 19 +- pandas/io/json/table_schema.py | 158 +- pandas/io/msgpack/_packer.pyx | 19 +- pandas/io/msgpack/_unpacker.pyx | 28 +- pandas/io/packers.py | 41 +- pandas/io/parquet.py | 266 +- pandas/io/parsers.py | 484 +- pandas/io/pickle.py | 108 +- pandas/io/pytables.py | 427 +- pandas/io/s3.py | 16 +- pandas/io/sas/sas.pyx | 44 +- pandas/io/sas/sas7bdat.py | 100 +- pandas/io/sas/sas_constants.py | 80 +- pandas/io/sas/sas_xport.py | 22 +- pandas/io/sql.py | 103 +- pandas/io/stata.py | 963 +++- pandas/io/wb.py | 6 - pandas/json.py | 7 - pandas/plotting/__init__.py | 7 + pandas/plotting/_compat.py | 84 +- pandas/plotting/_converter.py | 190 +- pandas/plotting/_core.py | 1271 ++++- pandas/plotting/_misc.py | 160 +- pandas/plotting/_style.py | 14 +- pandas/plotting/_timeseries.py | 40 +- pandas/plotting/_tools.py | 15 +- pandas/stats/api.py | 7 - pandas/stats/moments.py | 854 --- pandas/tests/api/test_api.py | 74 +- pandas/tests/api/test_types.py | 53 +- .../{formats => tests/arithmetic}/__init__.py | 0 pandas/tests/arithmetic/conftest.py | 171 + pandas/tests/arithmetic/test_datetime64.py | 1868 +++++++ pandas/tests/arithmetic/test_numeric.py | 872 +++ pandas/tests/arithmetic/test_object.py | 215 + pandas/tests/arithmetic/test_period.py | 990 ++++ pandas/tests/arithmetic/test_timedelta64.py | 1432 +++++ pandas/{stats => tests/arrays}/__init__.py | 0 .../tests/arrays/categorical/__init__.py | 0 pandas/tests/arrays/categorical/common.py | 10 + pandas/tests/arrays/categorical/conftest.py | 13 + pandas/tests/arrays/categorical/test_algos.py | 113 + .../arrays/categorical/test_analytics.py | 315 ++ pandas/tests/arrays/categorical/test_api.py | 518 ++ .../arrays/categorical/test_constructors.py | 540 ++ .../tests/arrays/categorical/test_dtypes.py | 176 + .../tests/arrays/categorical/test_indexing.py | 123 + .../tests/arrays/categorical/test_missing.py | 85 + .../arrays/categorical/test_operators.py | 310 ++ pandas/tests/arrays/categorical/test_repr.py | 517 ++ .../tests/arrays/categorical/test_sorting.py | 123 + .../tests/arrays/categorical/test_subclass.py | 26 + .../tests/arrays/categorical/test_warnings.py | 18 + pandas/tests/arrays/test_datetimelike.py | 72 + pandas/tests/arrays/test_integer.py | 619 +++ pandas/tests/arrays/test_interval.py | 72 + pandas/tests/computation/test_compat.py | 5 +- pandas/tests/computation/test_eval.py | 118 +- pandas/tests/dtypes/test_cast.py | 315 +- pandas/tests/dtypes/test_common.py | 134 +- pandas/tests/dtypes/test_concat.py | 124 +- pandas/tests/dtypes/test_dtypes.py | 314 +- pandas/tests/dtypes/test_generic.py | 7 +- pandas/tests/dtypes/test_inference.py | 324 +- pandas/tests/dtypes/test_io.py | 109 - pandas/tests/dtypes/test_missing.py | 99 +- .../tests/extension/__init__.py | 0 pandas/tests/extension/base/__init__.py | 53 + pandas/tests/extension/base/base.py | 9 + pandas/tests/extension/base/casting.py | 23 + pandas/tests/extension/base/constructors.py | 58 + pandas/tests/extension/base/dtype.py | 83 + pandas/tests/extension/base/getitem.py | 249 + pandas/tests/extension/base/groupby.py | 82 + pandas/tests/extension/base/interface.py | 73 + pandas/tests/extension/base/methods.py | 166 + pandas/tests/extension/base/missing.py | 132 + pandas/tests/extension/base/ops.py | 118 + pandas/tests/extension/base/reshaping.py | 173 + pandas/tests/extension/base/setitem.py | 168 + pandas/tests/extension/conftest.py | 88 + .../tests/extension/decimal/__init__.py | 0 pandas/tests/extension/decimal/array.py | 142 + .../tests/extension/decimal/test_decimal.py | 285 + .../tests/extension/json/__init__.py | 0 pandas/tests/extension/json/array.py | 181 + pandas/tests/extension/json/test_json.py | 266 + pandas/tests/extension/test_categorical.py | 231 + pandas/tests/extension/test_common.py | 94 + .../test_external_block.py | 3 +- pandas/tests/extension/test_integer.py | 226 + pandas/tests/extension/test_interval.py | 149 + pandas/tests/frame/common.py | 11 +- pandas/tests/frame/conftest.py | 191 + pandas/tests/frame/test_alter_axes.py | 861 +-- pandas/tests/frame/test_analytics.py | 1038 ++-- pandas/tests/frame/test_api.py | 279 +- pandas/tests/frame/test_apply.py | 701 ++- pandas/tests/frame/test_arithmetic.py | 313 ++ pandas/tests/frame/test_asof.py | 19 + .../tests/frame/test_axis_select_reindex.py | 115 +- pandas/tests/frame/test_block_internals.py | 75 +- pandas/tests/frame/test_combine_concat.py | 6 +- pandas/tests/frame/test_constructors.py | 426 +- pandas/tests/frame/test_convert_to.py | 90 +- pandas/tests/frame/test_dtypes.py | 320 +- pandas/tests/frame/test_duplicates.py | 457 ++ pandas/tests/frame/test_indexing.py | 966 +++- pandas/tests/frame/test_join.py | 17 + pandas/tests/frame/test_missing.py | 150 +- pandas/tests/frame/test_mutate_columns.py | 45 +- pandas/tests/frame/test_nonunique_indexes.py | 17 +- pandas/tests/frame/test_operators.py | 471 +- pandas/tests/frame/test_period.py | 10 +- pandas/tests/frame/test_query_eval.py | 100 +- pandas/tests/frame/test_rank.py | 118 +- pandas/tests/frame/test_replace.py | 130 +- pandas/tests/frame/test_repr_info.py | 60 +- pandas/tests/frame/test_reshape.py | 162 +- .../frame/test_sort_values_level_as_str.py | 95 + pandas/tests/frame/test_sorting.py | 52 +- pandas/tests/frame/test_subclass.py | 363 +- pandas/tests/frame/test_timeseries.py | 255 +- pandas/tests/frame/test_timezones.py | 145 + pandas/tests/frame/test_to_csv.py | 160 +- .../tests/generic/__init__.py | 0 pandas/tests/generic/test_frame.py | 270 + pandas/tests/generic/test_generic.py | 1021 ++++ .../generic/test_label_or_level_utils.py | 404 ++ pandas/tests/generic/test_panel.py | 59 + pandas/tests/generic/test_series.py | 248 + .../tests/groupby/aggregate/__init__.py | 0 .../tests/groupby/aggregate/test_aggregate.py | 289 + pandas/tests/groupby/aggregate/test_cython.py | 222 + pandas/tests/groupby/aggregate/test_other.py | 525 ++ pandas/tests/groupby/common.py | 62 - pandas/tests/groupby/conftest.py | 77 + pandas/tests/groupby/test_aggregate.py | 894 --- pandas/tests/groupby/test_apply.py | 541 ++ pandas/tests/groupby/test_bin_groupby.py | 31 +- pandas/tests/groupby/test_categorical.py | 1351 +++-- pandas/tests/groupby/test_counting.py | 31 +- pandas/tests/groupby/test_filters.py | 1180 ++-- pandas/tests/groupby/test_function.py | 1136 ++++ pandas/tests/groupby/test_functional.py | 371 -- pandas/tests/groupby/test_groupby.py | 4297 ++++++--------- pandas/tests/groupby/test_grouping.py | 248 +- pandas/tests/groupby/test_index_as_string.py | 48 - pandas/tests/groupby/test_nth.py | 679 +-- pandas/tests/groupby/test_rank.py | 292 + pandas/tests/groupby/test_timegrouper.py | 64 +- pandas/tests/groupby/test_transform.py | 1358 +++-- pandas/tests/groupby/test_value_counts.py | 2 +- pandas/tests/groupby/test_whitelist.py | 102 +- pandas/tests/indexes/common.py | 248 +- pandas/tests/indexes/conftest.py | 25 +- pandas/tests/indexes/data/mindex_073.pickle | Bin 670 -> 0 bytes .../tests/indexes/data/multiindex_v1.pickle | 149 - pandas/tests/indexes/datetimelike.py | 52 +- .../indexes/datetimes/test_arithmetic.py | 380 +- pandas/tests/indexes/datetimes/test_astype.py | 160 +- .../indexes/datetimes/test_construction.py | 282 +- .../indexes/datetimes/test_date_range.py | 606 +- .../tests/indexes/datetimes/test_datetime.py | 386 +- .../indexes/datetimes/test_datetimelike.py | 55 +- .../tests/indexes/datetimes/test_formats.py | 176 +- .../tests/indexes/datetimes/test_indexing.py | 367 +- pandas/tests/indexes/datetimes/test_misc.py | 174 +- .../tests/indexes/datetimes/test_missing.py | 88 +- pandas/tests/indexes/datetimes/test_ops.py | 983 +--- .../indexes/datetimes/test_partial_slicing.py | 63 +- .../indexes/datetimes/test_scalar_compat.py | 231 + pandas/tests/indexes/datetimes/test_setops.py | 38 +- .../tests/indexes/datetimes/test_timezones.py | 1083 ++++ pandas/tests/indexes/datetimes/test_tools.py | 1176 ++-- pandas/tests/indexes/interval/__init__.py | 0 pandas/tests/indexes/interval/test_astype.py | 209 + .../indexes/interval/test_construction.py | 386 ++ .../tests/indexes/interval/test_interval.py | 1014 ++++ .../indexes/interval/test_interval_new.py | 315 ++ .../indexes/interval/test_interval_range.py | 312 ++ .../indexes/interval/test_interval_tree.py | 90 + pandas/tests/indexes/multi/__init__.py | 0 pandas/tests/indexes/multi/conftest.py | 55 + pandas/tests/indexes/multi/test_analytics.py | 324 ++ pandas/tests/indexes/multi/test_astype.py | 31 + pandas/tests/indexes/multi/test_compat.py | 122 + .../tests/indexes/multi/test_constructor.py | 474 ++ pandas/tests/indexes/multi/test_contains.py | 95 + pandas/tests/indexes/multi/test_conversion.py | 171 + pandas/tests/indexes/multi/test_copy.py | 86 + pandas/tests/indexes/multi/test_drop.py | 126 + pandas/tests/indexes/multi/test_duplicates.py | 265 + .../tests/indexes/multi/test_equivalence.py | 219 + pandas/tests/indexes/multi/test_format.py | 128 + pandas/tests/indexes/multi/test_get_set.py | 416 ++ pandas/tests/indexes/multi/test_indexing.py | 348 ++ pandas/tests/indexes/multi/test_integrity.py | 288 + pandas/tests/indexes/multi/test_join.py | 95 + pandas/tests/indexes/multi/test_missing.py | 127 + pandas/tests/indexes/multi/test_monotonic.py | 205 + pandas/tests/indexes/multi/test_names.py | 124 + .../indexes/multi/test_partial_indexing.py | 98 + pandas/tests/indexes/multi/test_reindex.py | 108 + pandas/tests/indexes/multi/test_reshape.py | 126 + pandas/tests/indexes/multi/test_set_ops.py | 222 + pandas/tests/indexes/multi/test_sorting.py | 263 + .../tests/indexes/period/test_arithmetic.py | 484 +- pandas/tests/indexes/period/test_asfreq.py | 29 +- pandas/tests/indexes/period/test_astype.py | 99 + .../tests/indexes/period/test_construction.py | 47 +- pandas/tests/indexes/period/test_formats.py | 167 +- pandas/tests/indexes/period/test_indexing.py | 187 +- pandas/tests/indexes/period/test_ops.py | 532 +- pandas/tests/indexes/period/test_period.py | 310 +- .../indexes/period/test_scalar_compat.py | 18 + pandas/tests/indexes/period/test_setops.py | 19 +- pandas/tests/indexes/period/test_tools.py | 425 +- pandas/tests/indexes/test_base.py | 2908 +++++----- pandas/tests/indexes/test_category.py | 189 +- pandas/tests/indexes/test_frozen.py | 7 + pandas/tests/indexes/test_interval.py | 1168 ---- pandas/tests/indexes/test_multi.py | 2983 ---------- pandas/tests/indexes/test_numeric.py | 210 +- pandas/tests/indexes/test_range.py | 50 +- .../indexes/timedeltas/test_arithmetic.py | 373 +- .../tests/indexes/timedeltas/test_astype.py | 85 +- .../indexes/timedeltas/test_construction.py | 8 +- .../tests/indexes/timedeltas/test_formats.py | 96 + .../tests/indexes/timedeltas/test_indexing.py | 225 +- pandas/tests/indexes/timedeltas/test_ops.py | 364 +- .../indexes/timedeltas/test_scalar_compat.py | 63 + .../tests/indexes/timedeltas/test_setops.py | 1 - .../indexes/timedeltas/test_timedelta.py | 221 +- .../timedeltas/test_timedelta_range.py | 23 +- pandas/tests/indexes/timedeltas/test_tools.py | 1 - pandas/tests/indexing/common.py | 87 +- pandas/tests/indexing/interval/__init__.py | 0 .../indexing/{ => interval}/test_interval.py | 18 +- .../indexing/interval/test_interval_new.py | 247 + pandas/tests/indexing/test_categorical.py | 280 +- .../indexing/test_chaining_and_caching.py | 61 +- pandas/tests/indexing/test_coercion.py | 1442 ++--- pandas/tests/indexing/test_datetime.py | 89 +- pandas/tests/indexing/test_floats.py | 51 +- pandas/tests/indexing/test_iloc.py | 73 +- pandas/tests/indexing/test_indexing.py | 172 +- pandas/tests/indexing/test_indexing_slow.py | 3 +- pandas/tests/indexing/test_ix.py | 48 +- pandas/tests/indexing/test_loc.py | 131 +- pandas/tests/indexing/test_multiindex.py | 309 +- pandas/tests/indexing/test_panel.py | 10 +- pandas/tests/indexing/test_partial.py | 30 +- pandas/tests/indexing/test_scalar.py | 30 + pandas/tests/indexing/test_timedelta.py | 33 + pandas/tests/internals/test_internals.py | 218 +- pandas/tests/io/conftest.py | 74 + pandas/tests/io/data/banklist.html | 5 +- .../0.16.2/0.16.2_AMD64_windows_2.7.14.pickle | Bin 0 -> 132692 bytes .../0.19.2/0.19.2_AMD64_windows_2.7.14.pickle | Bin 0 -> 133468 bytes pandas/tests/io/data/macau.html | 2 +- pandas/tests/io/data/spam.html | 2 +- pandas/tests/io/data/stata16_118.dta | Bin 0 -> 4614 bytes .../tests/io/formats/data/unicode_series.csv | 18 - pandas/tests/io/formats/test_console.py | 74 + pandas/tests/io/formats/test_css.py | 28 +- pandas/tests/io/formats/test_format.py | 268 +- pandas/tests/io/formats/test_printing.py | 16 - pandas/tests/io/formats/test_style.py | 507 +- pandas/tests/io/formats/test_to_csv.py | 132 +- pandas/tests/io/formats/test_to_excel.py | 63 + pandas/tests/io/formats/test_to_html.py | 75 +- pandas/tests/io/formats/test_to_latex.py | 230 +- .../tests/io/generate_legacy_storage_files.py | 35 +- pandas/tests/io/json/test_compression.py | 109 +- .../tests/io/json/test_json_table_schema.py | 410 +- pandas/tests/io/json/test_normalize.py | 133 + pandas/tests/io/json/test_pandas.py | 173 +- pandas/tests/io/json/test_readlines.py | 5 +- pandas/tests/io/json/test_ujson.py | 1966 +++---- pandas/tests/io/msgpack/test_case.py | 4 +- pandas/tests/io/msgpack/test_extension.py | 2 +- pandas/tests/io/msgpack/test_pack.py | 2 +- pandas/tests/io/msgpack/test_seq.py | 2 +- pandas/tests/io/parser/c_parser_only.py | 61 +- pandas/tests/io/parser/common.py | 225 +- pandas/tests/io/parser/compression.py | 126 +- pandas/tests/io/parser/converters.py | 2 +- pandas/tests/io/parser/data/items.jsonl | 2 + pandas/tests/io/parser/data/tar_csv.tar.gz | Bin 10240 -> 117 bytes pandas/tests/io/parser/dtypes.py | 17 +- pandas/tests/io/parser/header.py | 84 +- pandas/tests/io/parser/na_values.py | 76 +- pandas/tests/io/parser/parse_dates.py | 56 +- pandas/tests/io/parser/test_network.py | 152 +- pandas/tests/io/parser/test_parsers.py | 24 +- pandas/tests/io/parser/test_textreader.py | 63 +- pandas/tests/io/parser/test_unsupported.py | 45 +- pandas/tests/io/parser/usecols.py | 59 +- pandas/tests/io/sas/data/cars.sas7bdat | Bin 0 -> 13312 bytes pandas/tests/io/sas/data/load_log.sas7bdat | Bin 0 -> 589824 bytes pandas/tests/io/sas/data/many_columns.csv | 4 + .../tests/io/sas/data/many_columns.sas7bdat | Bin 0 -> 81920 bytes .../tests/io/sas/data/zero_variables.sas7bdat | Bin 0 -> 149504 bytes pandas/tests/io/sas/test_sas7bdat.py | 112 +- pandas/tests/io/sas/test_xport.py | 6 +- pandas/tests/io/test_clipboard.py | 244 +- pandas/tests/io/test_common.py | 150 +- pandas/tests/io/test_compression.py | 115 + pandas/tests/io/test_excel.py | 1998 +++---- pandas/tests/io/test_feather.py | 11 +- pandas/tests/io/test_gbq.py | 33 +- pandas/tests/io/test_gcs.py | 47 + pandas/tests/io/test_html.py | 951 ++-- pandas/tests/io/test_packers.py | 122 +- pandas/tests/io/test_parquet.py | 372 +- pandas/tests/io/test_pickle.py | 159 +- pandas/tests/io/test_pytables.py | 471 +- pandas/tests/io/test_s3.py | 25 +- pandas/tests/io/test_sql.py | 191 +- pandas/tests/io/test_stata.py | 293 +- pandas/tests/plotting/common.py | 10 +- pandas/tests/plotting/test_boxplot_method.py | 7 +- pandas/tests/plotting/test_converter.py | 178 +- pandas/tests/plotting/test_datetimelike.py | 165 +- pandas/tests/plotting/test_deprecated.py | 12 +- pandas/tests/plotting/test_frame.py | 209 +- pandas/tests/plotting/test_groupby.py | 4 +- pandas/tests/plotting/test_hist_method.py | 24 +- pandas/tests/plotting/test_misc.py | 36 +- pandas/tests/plotting/test_series.py | 32 +- pandas/tests/reshape/merge/__init__.py | 0 .../{ => merge}/data/allow_exact_matches.csv | 0 .../allow_exact_matches_and_tolerance.csv | 0 .../tests/reshape/{ => merge}/data/asof.csv | 0 .../tests/reshape/{ => merge}/data/asof2.csv | 0 .../tests/reshape/{ => merge}/data/quotes.csv | 0 .../reshape/{ => merge}/data/quotes2.csv | 0 .../reshape/{ => merge}/data/tolerance.csv | 0 .../tests/reshape/{ => merge}/data/trades.csv | 0 .../reshape/{ => merge}/data/trades2.csv | 0 pandas/tests/reshape/{ => merge}/test_join.py | 64 +- .../tests/reshape/{ => merge}/test_merge.py | 925 ++-- .../reshape/{ => merge}/test_merge_asof.py | 193 +- .../merge/test_merge_index_as_string.py | 177 + .../reshape/{ => merge}/test_merge_ordered.py | 28 +- pandas/tests/reshape/merge/test_multi.py | 594 ++ pandas/tests/reshape/test_concat.py | 903 ++- pandas/tests/reshape/test_melt.py | 642 +++ pandas/tests/reshape/test_pivot.py | 565 +- pandas/tests/reshape/test_reshape.py | 970 +--- pandas/tests/reshape/test_tile.py | 172 +- .../tests/reshape/test_union_categoricals.py | 9 + pandas/tests/scalar/interval/__init__.py | 0 pandas/tests/scalar/interval/test_interval.py | 226 + pandas/tests/scalar/period/__init__.py | 0 .../test_asfreq.py} | 41 +- .../tests/scalar/{ => period}/test_period.py | 271 +- pandas/tests/scalar/test_interval.py | 139 - pandas/tests/scalar/test_nat.py | 44 +- pandas/tests/scalar/test_timestamp.py | 1572 ------ pandas/tests/scalar/timedelta/__init__.py | 0 .../tests/scalar/timedelta/test_arithmetic.py | 683 +++ .../scalar/timedelta/test_construction.py | 212 + pandas/tests/scalar/timedelta/test_formats.py | 28 + .../scalar/{ => timedelta}/test_timedelta.py | 405 +- pandas/tests/scalar/timestamp/__init__.py | 0 .../tests/scalar/timestamp/test_arithmetic.py | 76 + .../scalar/timestamp/test_comparisons.py | 193 + .../tests/scalar/timestamp/test_rendering.py | 96 + .../tests/scalar/timestamp/test_timestamp.py | 939 ++++ .../tests/scalar/timestamp/test_timezones.py | 309 ++ .../tests/scalar/timestamp/test_unary_ops.py | 271 + pandas/tests/series/conftest.py | 43 + pandas/tests/series/indexing/__init__.py | 0 pandas/tests/series/indexing/conftest.py | 8 + .../tests/series/indexing/test_alter_index.py | 557 ++ pandas/tests/series/indexing/test_boolean.py | 639 +++ pandas/tests/series/indexing/test_callable.py | 33 + pandas/tests/series/indexing/test_datetime.py | 711 +++ pandas/tests/series/indexing/test_iloc.py | 38 + pandas/tests/series/indexing/test_indexing.py | 815 +++ pandas/tests/series/indexing/test_loc.py | 150 + pandas/tests/series/indexing/test_numeric.py | 251 + pandas/tests/series/test_alter_axes.py | 161 +- pandas/tests/series/test_analytics.py | 1017 ++-- pandas/tests/series/test_api.py | 359 +- pandas/tests/series/test_apply.py | 118 +- pandas/tests/series/test_arithmetic.py | 68 + pandas/tests/series/test_combine_concat.py | 48 +- pandas/tests/series/test_constructors.py | 468 +- pandas/tests/series/test_datetime_values.py | 127 +- pandas/tests/series/test_dtypes.py | 194 +- pandas/tests/series/test_duplicates.py | 140 + pandas/tests/series/test_indexing.py | 2767 ---------- pandas/tests/series/test_internals.py | 14 + pandas/tests/series/test_io.py | 81 +- pandas/tests/series/test_missing.py | 207 +- pandas/tests/series/test_operators.py | 1800 ++---- pandas/tests/series/test_period.py | 166 +- pandas/tests/series/test_quantile.py | 65 +- pandas/tests/series/test_rank.py | 217 +- pandas/tests/series/test_replace.py | 28 + pandas/tests/series/test_repr.py | 284 +- pandas/tests/series/test_sorting.py | 86 +- pandas/tests/series/test_subclass.py | 15 +- pandas/tests/series/test_timeseries.py | 202 +- pandas/tests/series/test_timezones.py | 309 ++ pandas/tests/sparse/frame/__init__.py | 0 pandas/tests/sparse/frame/conftest.py | 116 + pandas/tests/sparse/frame/test_analytics.py | 40 + pandas/tests/sparse/frame/test_apply.py | 92 + pandas/tests/sparse/{ => frame}/test_frame.py | 903 ++- pandas/tests/sparse/frame/test_indexing.py | 113 + pandas/tests/sparse/frame/test_to_csv.py | 20 + .../tests/sparse/frame/test_to_from_scipy.py | 174 + pandas/tests/sparse/series/__init__.py | 0 pandas/tests/sparse/series/test_indexing.py | 113 + .../tests/sparse/{ => series}/test_series.py | 138 +- pandas/tests/sparse/test_array.py | 199 +- pandas/tests/sparse/test_combine_concat.py | 123 +- pandas/tests/sparse/test_libsparse.py | 29 +- pandas/tests/sparse/test_list.py | 111 - pandas/tests/test_algos.py | 396 +- pandas/tests/test_base.py | 298 +- pandas/tests/test_categorical.py | 4847 ---------------- pandas/tests/test_common.py | 168 +- pandas/tests/test_compat.py | 7 +- pandas/tests/test_config.py | 14 +- pandas/tests/test_downstream.py | 26 +- pandas/tests/test_errors.py | 32 +- pandas/tests/test_expressions.py | 29 +- pandas/tests/test_lib.py | 62 +- pandas/tests/test_multilevel.py | 336 +- pandas/tests/test_nanops.py | 151 +- pandas/tests/test_panel.py | 3596 ++++++------ pandas/tests/test_panel4d.py | 946 ---- pandas/tests/test_panelnd.py | 104 - pandas/tests/test_register_accessor.py | 89 + pandas/tests/test_resample.py | 877 +-- pandas/tests/test_sorting.py | 16 +- pandas/tests/test_strings.py | 483 +- pandas/tests/test_take.py | 593 +- pandas/tests/test_window.py | 1823 +++--- pandas/tests/tools/test_numeric.py | 246 +- pandas/tests/tseries/conftest.py | 13 - pandas/tests/tseries/offsets/__init__.py | 1 + pandas/tests/tseries/offsets/common.py | 25 + pandas/tests/tseries/offsets/conftest.py | 29 + .../{ => offsets}/data/cday-0.14.1.pickle | Bin .../data/dateoffset_0_15_2.pickle | 0 pandas/tests/tseries/offsets/test_fiscal.py | 657 +++ pandas/tests/tseries/offsets/test_offsets.py | 3253 +++++++++++ .../offsets/test_offsets_properties.py | 110 + pandas/tests/tseries/offsets/test_ticks.py | 269 + .../tests/tseries/offsets/test_yqm_offsets.py | 1030 ++++ pandas/tests/tseries/test_frequencies.py | 192 +- pandas/tests/tseries/test_offsets.py | 4901 ----------------- pandas/tests/tseries/test_timezones.py | 1777 ------ pandas/tests/tslibs/__init__.py | 0 pandas/tests/tslibs/test_api.py | 39 + pandas/tests/tslibs/test_array_to_datetime.py | 169 + pandas/tests/tslibs/test_ccalendar.py | 18 + pandas/tests/tslibs/test_conversion.py | 57 + pandas/tests/tslibs/test_libfrequencies.py | 116 + pandas/tests/tslibs/test_liboffsets.py | 172 + .../tests/{scalar => tslibs}/test_parsing.py | 123 +- pandas/tests/tslibs/test_period_asfreq.py | 82 + pandas/tests/tslibs/test_timezones.py | 67 + pandas/tests/tslibs/test_tslib.py | 23 + pandas/tests/util/test_hashing.py | 254 +- pandas/tests/util/test_testing.py | 170 +- pandas/tests/util/test_util.py | 69 +- pandas/tools/hashing.py | 18 - pandas/tseries/converter.py | 11 +- pandas/tseries/frequencies.py | 678 +-- pandas/tseries/holiday.py | 15 +- pandas/tseries/offsets.py | 2073 +++---- pandas/tseries/util.py | 104 - pandas/tslib.py | 2 +- pandas/util/_decorators.py | 138 +- pandas/util/_doctools.py | 20 +- pandas/util/_exceptions.py | 16 + pandas/util/_print_versions.py | 3 +- pandas/util/_test_decorators.py | 219 + pandas/util/_tester.py | 4 + pandas/util/_validators.py | 42 +- pandas/util/hashing.py | 18 - pandas/util/testing.py | 843 +-- pyproject.toml | 9 - scripts/announce.py | 8 +- scripts/api_rst_coverage.py | 43 - scripts/bench_join.R | 50 - scripts/bench_join.py | 211 - scripts/bench_join_multi.py | 32 - scripts/bench_refactor.py | 51 - scripts/boxplot_test.py | 14 - scripts/build_dist_for_release.sh | 6 +- scripts/convert_deps.py | 0 scripts/count_code.sh | 1 - scripts/download_wheels.py | 47 + scripts/faster_xs.py | 15 - scripts/file_sizes.py | 208 - scripts/find_commits_touching_func.py | 167 +- scripts/find_undoc_args.py | 161 +- scripts/gen_release_notes.py | 95 - scripts/git-mrb | 82 - scripts/git_code_churn.py | 34 - scripts/groupby_sample.py | 54 - scripts/groupby_speed.py | 35 - scripts/groupby_test.py | 145 - scripts/hdfstore_panel_perf.py | 17 - scripts/json_manip.py | 423 -- scripts/leak.py | 13 - scripts/list_future_warnings.sh | 46 + scripts/merge-pr.py | 16 +- scripts/parser_magic.py | 74 - scripts/preepoch_test.py | 23 - scripts/pypistats.py | 101 - scripts/roll_median_leak.py | 26 - scripts/runtests.py | 5 - scripts/test_py27.bat | 6 - scripts/testmed.py | 171 - scripts/tests/__init__.py | 0 scripts/tests/conftest.py | 3 + scripts/tests/test_validate_docstrings.py | 600 ++ scripts/touchup_gh_issues.py | 44 - scripts/use_build_cache.py | 354 -- scripts/validate_docstrings.py | 558 ++ scripts/winbuild_py27.bat | 2 - setup.cfg | 46 +- setup.py | 667 ++- test.bat | 2 +- test.sh | 2 +- test_fast.bat | 2 +- test_fast.sh | 2 +- versioneer.py | 16 +- 1014 files changed, 162852 insertions(+), 111735 deletions(-) create mode 100644 .circleci/config.yml delete mode 100644 .coveragerc create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 LICENSES/XARRAY_LICENSE delete mode 100644 asv_bench/benchmarks/hdfstore_bench.py rename {doc/sphinxext/ipython_sphinxext => asv_bench/benchmarks/io}/__init__.py (100%) create mode 100644 asv_bench/benchmarks/io/csv.py create mode 100644 asv_bench/benchmarks/io/excel.py create mode 100644 asv_bench/benchmarks/io/hdf.py create mode 100644 asv_bench/benchmarks/io/json.py create mode 100644 asv_bench/benchmarks/io/msgpack.py create mode 100644 asv_bench/benchmarks/io/pickle.py create mode 100644 asv_bench/benchmarks/io/sas.py create mode 100644 asv_bench/benchmarks/io/sql.py create mode 100644 asv_bench/benchmarks/io/stata.py delete mode 100644 asv_bench/benchmarks/io_bench.py delete mode 100644 asv_bench/benchmarks/io_sql.py create mode 100644 asv_bench/benchmarks/multiindex_object.py create mode 100644 asv_bench/benchmarks/offset.py delete mode 100644 asv_bench/benchmarks/packers.py delete mode 100644 asv_bench/benchmarks/parser_vb.py delete mode 100644 asv_bench/vbench_to_asv.py create mode 100644 ci/appveyor-27.yaml create mode 100644 ci/appveyor-36.yaml rename ci/{before_install_travis.sh => before_script_travis.sh} (93%) create mode 100644 ci/circle-27-compat.yaml create mode 100644 ci/circle-35-ascii.yaml create mode 100644 ci/circle-36-locale.yaml create mode 100644 ci/circle-36-locale_slow.yaml create mode 100755 ci/doctests.sh delete mode 100755 ci/install_db_circle.sh delete mode 100644 ci/requirements-2.7.build delete mode 100644 ci/requirements-2.7.pip delete mode 100644 ci/requirements-2.7.run delete mode 100644 ci/requirements-2.7.sh delete mode 100644 ci/requirements-2.7_BUILD_TEST.build delete mode 100644 ci/requirements-2.7_BUILD_TEST.pip delete mode 100755 ci/requirements-2.7_BUILD_TEST.sh delete mode 100644 ci/requirements-2.7_COMPAT.build delete mode 100644 ci/requirements-2.7_COMPAT.pip delete mode 100644 ci/requirements-2.7_COMPAT.run delete mode 100644 ci/requirements-2.7_LOCALE.build delete mode 100644 ci/requirements-2.7_LOCALE.pip delete mode 100644 ci/requirements-2.7_LOCALE.run delete mode 100644 ci/requirements-2.7_SLOW.build delete mode 100644 ci/requirements-2.7_SLOW.run delete mode 100644 ci/requirements-2.7_WIN.run delete mode 100644 ci/requirements-3.5.build delete mode 100644 ci/requirements-3.5.pip delete mode 100644 ci/requirements-3.5.run delete mode 100644 ci/requirements-3.5.sh delete mode 100644 ci/requirements-3.5_ASCII.build delete mode 100644 ci/requirements-3.5_ASCII.run delete mode 100644 ci/requirements-3.5_OSX.build delete mode 100644 ci/requirements-3.5_OSX.pip delete mode 100644 ci/requirements-3.5_OSX.run delete mode 100644 ci/requirements-3.5_OSX.sh delete mode 100644 ci/requirements-3.6.build delete mode 100644 ci/requirements-3.6.pip delete mode 100644 ci/requirements-3.6.run delete mode 100644 ci/requirements-3.6_DOC.build delete mode 100644 ci/requirements-3.6_DOC.run delete mode 100644 ci/requirements-3.6_DOC.sh delete mode 100644 ci/requirements-3.6_LOCALE.build delete mode 100644 ci/requirements-3.6_LOCALE.run delete mode 100644 ci/requirements-3.6_LOCALE_SLOW.build delete mode 100644 ci/requirements-3.6_LOCALE_SLOW.run delete mode 100644 ci/requirements-3.6_NUMPY_DEV.build delete mode 100644 ci/requirements-3.6_NUMPY_DEV.build.sh delete mode 100644 ci/requirements-3.6_NUMPY_DEV.run delete mode 100644 ci/requirements-3.6_WIN.run create mode 100644 ci/travis-27-locale.yaml create mode 100644 ci/travis-27.yaml create mode 100644 ci/travis-35-osx.yaml create mode 100644 ci/travis-36-doc.yaml create mode 100644 ci/travis-36-slow.yaml create mode 100644 ci/travis-36.yaml create mode 100644 ci/travis-37-numpydev.yaml create mode 100644 ci/travis-37.yaml delete mode 100644 circle.yml create mode 100644 doc/cheatsheet/Pandas_Cheat_Sheet_JP.pdf create mode 100644 doc/cheatsheet/Pandas_Cheat_Sheet_JP.pptx delete mode 100644 doc/plots/stats/moment_plots.py delete mode 100644 doc/plots/stats/moments_ewma.py delete mode 100644 doc/plots/stats/moments_ewmvol.py delete mode 100644 doc/plots/stats/moments_expw.py delete mode 100644 doc/plots/stats/moments_rolling.py delete mode 100644 doc/plots/stats/moments_rolling_binary.py create mode 100644 doc/source/_static/favicon.ico create mode 100644 doc/source/_static/print_df_new.png create mode 100644 doc/source/_static/print_df_old.png create mode 100644 doc/source/_static/reshaping_melt.png create mode 100644 doc/source/_static/reshaping_pivot.png create mode 100644 doc/source/_static/reshaping_stack.png create mode 100644 doc/source/_static/reshaping_unstack.png create mode 100644 doc/source/_static/reshaping_unstack_0.png create mode 100644 doc/source/_static/reshaping_unstack_1.png create mode 100644 doc/source/comparison_with_stata.rst create mode 100644 doc/source/contributing_docstring.rst create mode 100644 doc/source/extending.rst create mode 100644 doc/source/names_wordlist.txt delete mode 100644 doc/source/remote_data.rst create mode 100644 doc/source/spelling_wordlist.txt create mode 100644 doc/source/whatsnew/v0.23.0.txt create mode 100644 doc/source/whatsnew/v0.23.1.txt create mode 100644 doc/source/whatsnew/v0.23.2.txt create mode 100644 doc/source/whatsnew/v0.23.3.txt create mode 100644 doc/source/whatsnew/v0.23.4.txt create mode 100644 doc/source/whatsnew/v0.23.5.txt create mode 100644 doc/source/whatsnew/v0.24.0.txt delete mode 100644 doc/sphinxext/ipython_sphinxext/ipython_console_highlighting.py delete mode 100644 doc/sphinxext/ipython_sphinxext/ipython_directive.py mode change 100755 => 100644 doc/sphinxext/numpydoc/__init__.py delete mode 100755 doc/sphinxext/numpydoc/comment_eater.py delete mode 100755 doc/sphinxext/numpydoc/compiler_unparse.py mode change 100755 => 100644 doc/sphinxext/numpydoc/docscrape.py mode change 100755 => 100644 doc/sphinxext/numpydoc/docscrape_sphinx.py delete mode 100644 doc/sphinxext/numpydoc/linkcode.py mode change 100755 => 100644 doc/sphinxext/numpydoc/numpydoc.py delete mode 100755 doc/sphinxext/numpydoc/phantom_import.py delete mode 100755 doc/sphinxext/numpydoc/plot_directive.py create mode 100644 doc/sphinxext/numpydoc/templates/numpydoc_docstring.rst mode change 100755 => 100644 doc/sphinxext/numpydoc/tests/test_docscrape.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_linkcode.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_phantom_import.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_plot_directive.py delete mode 100644 doc/sphinxext/numpydoc/tests/test_traitsdoc.py delete mode 100755 doc/sphinxext/numpydoc/traitsdoc.py create mode 100644 pandas/_libs/internals.pyx rename pandas/_libs/{src => }/khash.pxd (96%) delete mode 100644 pandas/_libs/lib.pxd create mode 100644 pandas/_libs/missing.pxd create mode 100644 pandas/_libs/missing.pyx create mode 100644 pandas/_libs/ops.pyx delete mode 100644 pandas/_libs/period.pyx rename pandas/_libs/{src/reduce.pyx => reduction.pyx} (95%) delete mode 100644 pandas/_libs/reshape_helper.pxi.in rename pandas/_libs/{src => }/skiplist.pxd (51%) rename pandas/_libs/{src => }/skiplist.pyx (92%) delete mode 100644 pandas/_libs/src/datetime.pxd delete mode 100644 pandas/_libs/src/datetime/np_datetime.h create mode 100644 pandas/_libs/src/headers/cmath delete mode 100644 pandas/_libs/src/headers/math.h delete mode 100644 pandas/_libs/src/inference.pyx rename pandas/_libs/src/{helper.h => inline_helper.h} (80%) delete mode 100644 pandas/_libs/src/klib/ktypes.h delete mode 100644 pandas/_libs/src/klib/kvec.h delete mode 100644 pandas/_libs/src/numpy.pxd delete mode 100644 pandas/_libs/src/numpy_helper.h delete mode 100644 pandas/_libs/src/parser/.gitignore delete mode 100644 pandas/_libs/src/parser/Makefile delete mode 100644 pandas/_libs/src/period_helper.c delete mode 100644 pandas/_libs/src/period_helper.h delete mode 100644 pandas/_libs/src/util.pxd delete mode 100644 pandas/_libs/tslib.pxd create mode 100644 pandas/_libs/tslibs/ccalendar.pxd create mode 100644 pandas/_libs/tslibs/ccalendar.pyx create mode 100644 pandas/_libs/tslibs/offsets.pxd create mode 100644 pandas/_libs/tslibs/period.pyx create mode 100644 pandas/_libs/tslibs/resolution.pyx rename pandas/_libs/{ => tslibs}/src/datetime/np_datetime.c (63%) create mode 100644 pandas/_libs/tslibs/src/datetime/np_datetime.h rename pandas/_libs/{ => tslibs}/src/datetime/np_datetime_strings.c (51%) rename pandas/_libs/{ => tslibs}/src/datetime/np_datetime_strings.h (53%) create mode 100644 pandas/_libs/tslibs/timestamps.pxd create mode 100644 pandas/_libs/tslibs/timestamps.pyx create mode 100644 pandas/_libs/tslibs/util.pxd create mode 100644 pandas/_libs/util.pxd create mode 100644 pandas/_libs/writers.pyx create mode 100644 pandas/api/extensions/__init__.py delete mode 100644 pandas/compat/openpyxl_compat.py create mode 100644 pandas/core/apply.py create mode 100644 pandas/core/arrays/__init__.py create mode 100644 pandas/core/arrays/base.py create mode 100644 pandas/core/arrays/categorical.py create mode 100644 pandas/core/arrays/datetimelike.py create mode 100644 pandas/core/arrays/datetimes.py create mode 100644 pandas/core/arrays/integer.py create mode 100644 pandas/core/arrays/interval.py create mode 100644 pandas/core/arrays/period.py create mode 100644 pandas/core/arrays/timedeltas.py delete mode 100644 pandas/core/datetools.py create mode 100644 pandas/core/dtypes/base.py delete mode 100644 pandas/core/groupby.py create mode 100644 pandas/core/groupby/__init__.py create mode 100644 pandas/core/groupby/base.py create mode 100644 pandas/core/groupby/categorical.py create mode 100644 pandas/core/groupby/generic.py create mode 100644 pandas/core/groupby/groupby.py create mode 100644 pandas/core/groupby/grouper.py create mode 100644 pandas/core/groupby/ops.py create mode 100644 pandas/core/internals/__init__.py rename pandas/core/{internals.py => internals/blocks.py} (50%) create mode 100644 pandas/core/internals/concat.py create mode 100644 pandas/core/internals/managers.py delete mode 100644 pandas/core/panel4d.py delete mode 100644 pandas/core/panelnd.py create mode 100644 pandas/core/reshape/melt.py delete mode 100644 pandas/core/sparse/list.py delete mode 100644 pandas/formats/style.py delete mode 100644 pandas/io/data.py delete mode 100644 pandas/io/formats/common.py create mode 100644 pandas/io/formats/csvs.py create mode 100644 pandas/io/formats/html.py create mode 100644 pandas/io/formats/latex.py create mode 100644 pandas/io/gcs.py delete mode 100644 pandas/io/wb.py delete mode 100644 pandas/json.py delete mode 100644 pandas/stats/api.py delete mode 100644 pandas/stats/moments.py rename pandas/{formats => tests/arithmetic}/__init__.py (100%) create mode 100644 pandas/tests/arithmetic/conftest.py create mode 100644 pandas/tests/arithmetic/test_datetime64.py create mode 100644 pandas/tests/arithmetic/test_numeric.py create mode 100644 pandas/tests/arithmetic/test_object.py create mode 100644 pandas/tests/arithmetic/test_period.py create mode 100644 pandas/tests/arithmetic/test_timedelta64.py rename pandas/{stats => tests/arrays}/__init__.py (100%) rename ci/requirements-2.7_SLOW.pip => pandas/tests/arrays/categorical/__init__.py (100%) create mode 100644 pandas/tests/arrays/categorical/common.py create mode 100644 pandas/tests/arrays/categorical/conftest.py create mode 100644 pandas/tests/arrays/categorical/test_algos.py create mode 100644 pandas/tests/arrays/categorical/test_analytics.py create mode 100644 pandas/tests/arrays/categorical/test_api.py create mode 100644 pandas/tests/arrays/categorical/test_constructors.py create mode 100644 pandas/tests/arrays/categorical/test_dtypes.py create mode 100644 pandas/tests/arrays/categorical/test_indexing.py create mode 100644 pandas/tests/arrays/categorical/test_missing.py create mode 100644 pandas/tests/arrays/categorical/test_operators.py create mode 100644 pandas/tests/arrays/categorical/test_repr.py create mode 100644 pandas/tests/arrays/categorical/test_sorting.py create mode 100644 pandas/tests/arrays/categorical/test_subclass.py create mode 100644 pandas/tests/arrays/categorical/test_warnings.py create mode 100644 pandas/tests/arrays/test_datetimelike.py create mode 100644 pandas/tests/arrays/test_integer.py create mode 100644 pandas/tests/arrays/test_interval.py delete mode 100644 pandas/tests/dtypes/test_io.py rename ci/requirements-2.7_WIN.pip => pandas/tests/extension/__init__.py (100%) create mode 100644 pandas/tests/extension/base/__init__.py create mode 100644 pandas/tests/extension/base/base.py create mode 100644 pandas/tests/extension/base/casting.py create mode 100644 pandas/tests/extension/base/constructors.py create mode 100644 pandas/tests/extension/base/dtype.py create mode 100644 pandas/tests/extension/base/getitem.py create mode 100644 pandas/tests/extension/base/groupby.py create mode 100644 pandas/tests/extension/base/interface.py create mode 100644 pandas/tests/extension/base/methods.py create mode 100644 pandas/tests/extension/base/missing.py create mode 100644 pandas/tests/extension/base/ops.py create mode 100644 pandas/tests/extension/base/reshaping.py create mode 100644 pandas/tests/extension/base/setitem.py create mode 100644 pandas/tests/extension/conftest.py rename ci/requirements-3.6_LOCALE.pip => pandas/tests/extension/decimal/__init__.py (100%) create mode 100644 pandas/tests/extension/decimal/array.py create mode 100644 pandas/tests/extension/decimal/test_decimal.py rename ci/requirements-3.6_LOCALE_SLOW.pip => pandas/tests/extension/json/__init__.py (100%) create mode 100644 pandas/tests/extension/json/array.py create mode 100644 pandas/tests/extension/json/test_json.py create mode 100644 pandas/tests/extension/test_categorical.py create mode 100644 pandas/tests/extension/test_common.py rename pandas/tests/{internals => extension}/test_external_block.py (95%) create mode 100644 pandas/tests/extension/test_integer.py create mode 100644 pandas/tests/extension/test_interval.py create mode 100644 pandas/tests/frame/conftest.py create mode 100644 pandas/tests/frame/test_arithmetic.py create mode 100644 pandas/tests/frame/test_duplicates.py create mode 100644 pandas/tests/frame/test_sort_values_level_as_str.py create mode 100644 pandas/tests/frame/test_timezones.py rename ci/requirements-3.6_NUMPY_DEV.pip => pandas/tests/generic/__init__.py (100%) create mode 100644 pandas/tests/generic/test_frame.py create mode 100644 pandas/tests/generic/test_generic.py create mode 100644 pandas/tests/generic/test_label_or_level_utils.py create mode 100644 pandas/tests/generic/test_panel.py create mode 100644 pandas/tests/generic/test_series.py rename ci/requirements-3.6_WIN.pip => pandas/tests/groupby/aggregate/__init__.py (100%) create mode 100644 pandas/tests/groupby/aggregate/test_aggregate.py create mode 100644 pandas/tests/groupby/aggregate/test_cython.py create mode 100644 pandas/tests/groupby/aggregate/test_other.py delete mode 100644 pandas/tests/groupby/common.py create mode 100644 pandas/tests/groupby/conftest.py delete mode 100644 pandas/tests/groupby/test_aggregate.py create mode 100644 pandas/tests/groupby/test_apply.py create mode 100644 pandas/tests/groupby/test_function.py delete mode 100644 pandas/tests/groupby/test_functional.py create mode 100644 pandas/tests/groupby/test_rank.py delete mode 100644 pandas/tests/indexes/data/mindex_073.pickle delete mode 100644 pandas/tests/indexes/data/multiindex_v1.pickle create mode 100644 pandas/tests/indexes/datetimes/test_scalar_compat.py create mode 100644 pandas/tests/indexes/datetimes/test_timezones.py create mode 100644 pandas/tests/indexes/interval/__init__.py create mode 100644 pandas/tests/indexes/interval/test_astype.py create mode 100644 pandas/tests/indexes/interval/test_construction.py create mode 100644 pandas/tests/indexes/interval/test_interval.py create mode 100644 pandas/tests/indexes/interval/test_interval_new.py create mode 100644 pandas/tests/indexes/interval/test_interval_range.py create mode 100644 pandas/tests/indexes/interval/test_interval_tree.py create mode 100644 pandas/tests/indexes/multi/__init__.py create mode 100644 pandas/tests/indexes/multi/conftest.py create mode 100644 pandas/tests/indexes/multi/test_analytics.py create mode 100644 pandas/tests/indexes/multi/test_astype.py create mode 100644 pandas/tests/indexes/multi/test_compat.py create mode 100644 pandas/tests/indexes/multi/test_constructor.py create mode 100644 pandas/tests/indexes/multi/test_contains.py create mode 100644 pandas/tests/indexes/multi/test_conversion.py create mode 100644 pandas/tests/indexes/multi/test_copy.py create mode 100644 pandas/tests/indexes/multi/test_drop.py create mode 100644 pandas/tests/indexes/multi/test_duplicates.py create mode 100644 pandas/tests/indexes/multi/test_equivalence.py create mode 100644 pandas/tests/indexes/multi/test_format.py create mode 100644 pandas/tests/indexes/multi/test_get_set.py create mode 100644 pandas/tests/indexes/multi/test_indexing.py create mode 100644 pandas/tests/indexes/multi/test_integrity.py create mode 100644 pandas/tests/indexes/multi/test_join.py create mode 100644 pandas/tests/indexes/multi/test_missing.py create mode 100644 pandas/tests/indexes/multi/test_monotonic.py create mode 100644 pandas/tests/indexes/multi/test_names.py create mode 100644 pandas/tests/indexes/multi/test_partial_indexing.py create mode 100644 pandas/tests/indexes/multi/test_reindex.py create mode 100644 pandas/tests/indexes/multi/test_reshape.py create mode 100644 pandas/tests/indexes/multi/test_set_ops.py create mode 100644 pandas/tests/indexes/multi/test_sorting.py create mode 100644 pandas/tests/indexes/period/test_astype.py create mode 100644 pandas/tests/indexes/period/test_scalar_compat.py delete mode 100644 pandas/tests/indexes/test_interval.py delete mode 100644 pandas/tests/indexes/test_multi.py create mode 100644 pandas/tests/indexes/timedeltas/test_formats.py create mode 100644 pandas/tests/indexes/timedeltas/test_scalar_compat.py create mode 100644 pandas/tests/indexing/interval/__init__.py rename pandas/tests/indexing/{ => interval}/test_interval.py (89%) create mode 100644 pandas/tests/indexing/interval/test_interval_new.py create mode 100644 pandas/tests/io/conftest.py create mode 100644 pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_2.7.14.pickle create mode 100644 pandas/tests/io/data/legacy_pickle/0.19.2/0.19.2_AMD64_windows_2.7.14.pickle create mode 100644 pandas/tests/io/data/stata16_118.dta delete mode 100644 pandas/tests/io/formats/data/unicode_series.csv create mode 100644 pandas/tests/io/formats/test_console.py create mode 100644 pandas/tests/io/parser/data/items.jsonl create mode 100644 pandas/tests/io/sas/data/cars.sas7bdat create mode 100644 pandas/tests/io/sas/data/load_log.sas7bdat create mode 100644 pandas/tests/io/sas/data/many_columns.csv create mode 100644 pandas/tests/io/sas/data/many_columns.sas7bdat create mode 100644 pandas/tests/io/sas/data/zero_variables.sas7bdat create mode 100644 pandas/tests/io/test_compression.py create mode 100644 pandas/tests/io/test_gcs.py create mode 100644 pandas/tests/reshape/merge/__init__.py rename pandas/tests/reshape/{ => merge}/data/allow_exact_matches.csv (100%) rename pandas/tests/reshape/{ => merge}/data/allow_exact_matches_and_tolerance.csv (100%) rename pandas/tests/reshape/{ => merge}/data/asof.csv (100%) rename pandas/tests/reshape/{ => merge}/data/asof2.csv (100%) rename pandas/tests/reshape/{ => merge}/data/quotes.csv (100%) rename pandas/tests/reshape/{ => merge}/data/quotes2.csv (100%) rename pandas/tests/reshape/{ => merge}/data/tolerance.csv (100%) rename pandas/tests/reshape/{ => merge}/data/trades.csv (100%) rename pandas/tests/reshape/{ => merge}/data/trades2.csv (100%) rename pandas/tests/reshape/{ => merge}/test_join.py (96%) rename pandas/tests/reshape/{ => merge}/test_merge.py (66%) rename pandas/tests/reshape/{ => merge}/test_merge_asof.py (89%) create mode 100644 pandas/tests/reshape/merge/test_merge_index_as_string.py rename pandas/tests/reshape/{ => merge}/test_merge_ordered.py (79%) create mode 100644 pandas/tests/reshape/merge/test_multi.py create mode 100644 pandas/tests/reshape/test_melt.py create mode 100644 pandas/tests/scalar/interval/__init__.py create mode 100644 pandas/tests/scalar/interval/test_interval.py create mode 100644 pandas/tests/scalar/period/__init__.py rename pandas/tests/scalar/{test_period_asfreq.py => period/test_asfreq.py} (96%) rename pandas/tests/scalar/{ => period}/test_period.py (88%) delete mode 100644 pandas/tests/scalar/test_interval.py delete mode 100644 pandas/tests/scalar/test_timestamp.py create mode 100644 pandas/tests/scalar/timedelta/__init__.py create mode 100644 pandas/tests/scalar/timedelta/test_arithmetic.py create mode 100644 pandas/tests/scalar/timedelta/test_construction.py create mode 100644 pandas/tests/scalar/timedelta/test_formats.py rename pandas/tests/scalar/{ => timedelta}/test_timedelta.py (61%) create mode 100644 pandas/tests/scalar/timestamp/__init__.py create mode 100644 pandas/tests/scalar/timestamp/test_arithmetic.py create mode 100644 pandas/tests/scalar/timestamp/test_comparisons.py create mode 100644 pandas/tests/scalar/timestamp/test_rendering.py create mode 100644 pandas/tests/scalar/timestamp/test_timestamp.py create mode 100644 pandas/tests/scalar/timestamp/test_timezones.py create mode 100644 pandas/tests/scalar/timestamp/test_unary_ops.py create mode 100644 pandas/tests/series/conftest.py create mode 100644 pandas/tests/series/indexing/__init__.py create mode 100644 pandas/tests/series/indexing/conftest.py create mode 100644 pandas/tests/series/indexing/test_alter_index.py create mode 100644 pandas/tests/series/indexing/test_boolean.py create mode 100644 pandas/tests/series/indexing/test_callable.py create mode 100644 pandas/tests/series/indexing/test_datetime.py create mode 100644 pandas/tests/series/indexing/test_iloc.py create mode 100644 pandas/tests/series/indexing/test_indexing.py create mode 100644 pandas/tests/series/indexing/test_loc.py create mode 100644 pandas/tests/series/indexing/test_numeric.py create mode 100644 pandas/tests/series/test_arithmetic.py create mode 100644 pandas/tests/series/test_duplicates.py delete mode 100644 pandas/tests/series/test_indexing.py create mode 100644 pandas/tests/series/test_timezones.py create mode 100644 pandas/tests/sparse/frame/__init__.py create mode 100644 pandas/tests/sparse/frame/conftest.py create mode 100644 pandas/tests/sparse/frame/test_analytics.py create mode 100644 pandas/tests/sparse/frame/test_apply.py rename pandas/tests/sparse/{ => frame}/test_frame.py (60%) create mode 100644 pandas/tests/sparse/frame/test_indexing.py create mode 100644 pandas/tests/sparse/frame/test_to_csv.py create mode 100644 pandas/tests/sparse/frame/test_to_from_scipy.py create mode 100644 pandas/tests/sparse/series/__init__.py create mode 100644 pandas/tests/sparse/series/test_indexing.py rename pandas/tests/sparse/{ => series}/test_series.py (94%) delete mode 100644 pandas/tests/sparse/test_list.py delete mode 100644 pandas/tests/test_categorical.py delete mode 100644 pandas/tests/test_panel4d.py delete mode 100644 pandas/tests/test_panelnd.py create mode 100644 pandas/tests/test_register_accessor.py delete mode 100644 pandas/tests/tseries/conftest.py create mode 100644 pandas/tests/tseries/offsets/__init__.py create mode 100644 pandas/tests/tseries/offsets/common.py create mode 100644 pandas/tests/tseries/offsets/conftest.py rename pandas/tests/tseries/{ => offsets}/data/cday-0.14.1.pickle (100%) rename pandas/tests/tseries/{ => offsets}/data/dateoffset_0_15_2.pickle (100%) create mode 100644 pandas/tests/tseries/offsets/test_fiscal.py create mode 100644 pandas/tests/tseries/offsets/test_offsets.py create mode 100644 pandas/tests/tseries/offsets/test_offsets_properties.py create mode 100644 pandas/tests/tseries/offsets/test_ticks.py create mode 100644 pandas/tests/tseries/offsets/test_yqm_offsets.py delete mode 100644 pandas/tests/tseries/test_offsets.py delete mode 100644 pandas/tests/tseries/test_timezones.py create mode 100644 pandas/tests/tslibs/__init__.py create mode 100644 pandas/tests/tslibs/test_api.py create mode 100644 pandas/tests/tslibs/test_array_to_datetime.py create mode 100644 pandas/tests/tslibs/test_ccalendar.py create mode 100644 pandas/tests/tslibs/test_conversion.py create mode 100644 pandas/tests/tslibs/test_libfrequencies.py create mode 100644 pandas/tests/tslibs/test_liboffsets.py rename pandas/tests/{scalar => tslibs}/test_parsing.py (52%) create mode 100644 pandas/tests/tslibs/test_period_asfreq.py create mode 100644 pandas/tests/tslibs/test_timezones.py create mode 100644 pandas/tests/tslibs/test_tslib.py delete mode 100644 pandas/tools/hashing.py delete mode 100644 pandas/tseries/util.py create mode 100644 pandas/util/_exceptions.py create mode 100644 pandas/util/_test_decorators.py delete mode 100644 pandas/util/hashing.py delete mode 100644 pyproject.toml mode change 100644 => 100755 scripts/announce.py delete mode 100644 scripts/api_rst_coverage.py delete mode 100644 scripts/bench_join.R delete mode 100644 scripts/bench_join.py delete mode 100644 scripts/bench_join_multi.py delete mode 100644 scripts/bench_refactor.py delete mode 100644 scripts/boxplot_test.py mode change 100644 => 100755 scripts/build_dist_for_release.sh mode change 100644 => 100755 scripts/convert_deps.py delete mode 100755 scripts/count_code.sh create mode 100644 scripts/download_wheels.py delete mode 100644 scripts/faster_xs.py delete mode 100644 scripts/file_sizes.py delete mode 100644 scripts/gen_release_notes.py delete mode 100644 scripts/git-mrb delete mode 100644 scripts/git_code_churn.py delete mode 100644 scripts/groupby_sample.py delete mode 100644 scripts/groupby_speed.py delete mode 100644 scripts/groupby_test.py delete mode 100644 scripts/hdfstore_panel_perf.py delete mode 100644 scripts/json_manip.py delete mode 100644 scripts/leak.py create mode 100755 scripts/list_future_warnings.sh delete mode 100644 scripts/parser_magic.py delete mode 100644 scripts/preepoch_test.py delete mode 100644 scripts/pypistats.py delete mode 100644 scripts/roll_median_leak.py delete mode 100644 scripts/runtests.py delete mode 100644 scripts/test_py27.bat delete mode 100644 scripts/testmed.py create mode 100644 scripts/tests/__init__.py create mode 100644 scripts/tests/conftest.py create mode 100644 scripts/tests/test_validate_docstrings.py delete mode 100755 scripts/touchup_gh_issues.py delete mode 100755 scripts/use_build_cache.py create mode 100755 scripts/validate_docstrings.py delete mode 100644 scripts/winbuild_py27.bat diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 00000000000000..e947f30d285cdb --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,147 @@ +version: 2 +jobs: + + # -------------------------------------------------------------------------- + # 0. py27_compat + # -------------------------------------------------------------------------- + py27_compat: + docker: + - image: continuumio/miniconda:latest + # databases configuration + - image: circleci/postgres:9.6.5-alpine-ram + environment: + POSTGRES_USER: postgres + POSTGRES_DB: pandas_nosetest + - image: circleci/mysql:8-ram + environment: + MYSQL_USER: "root" + MYSQL_HOST: "localhost" + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_DATABASE: "pandas_nosetest" + environment: + JOB: "2.7_COMPAT" + ENV_FILE: "ci/circle-27-compat.yaml" + LOCALE_OVERRIDE: "it_IT.UTF-8" + MINICONDA_DIR: /home/ubuntu/miniconda3 + steps: + - checkout + - run: + name: build + command: | + ./ci/install_circle.sh + ./ci/show_circle.sh + - run: + name: test + command: ./ci/run_circle.sh --skip-slow --skip-network + + # -------------------------------------------------------------------------- + # 1. py36_locale + # -------------------------------------------------------------------------- + py36_locale: + docker: + - image: continuumio/miniconda:latest + # databases configuration + - image: circleci/postgres:9.6.5-alpine-ram + environment: + POSTGRES_USER: postgres + POSTGRES_DB: pandas_nosetest + - image: circleci/mysql:8-ram + environment: + MYSQL_USER: "root" + MYSQL_HOST: "localhost" + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_DATABASE: "pandas_nosetest" + + environment: + JOB: "3.6_LOCALE" + ENV_FILE: "ci/circle-36-locale.yaml" + LOCALE_OVERRIDE: "zh_CN.UTF-8" + MINICONDA_DIR: /home/ubuntu/miniconda3 + steps: + - checkout + - run: + name: build + command: | + ./ci/install_circle.sh + ./ci/show_circle.sh + - run: + name: test + command: ./ci/run_circle.sh --skip-slow --skip-network + + # -------------------------------------------------------------------------- + # 2. py36_locale_slow + # -------------------------------------------------------------------------- + py36_locale_slow: + docker: + - image: continuumio/miniconda:latest + # databases configuration + - image: circleci/postgres:9.6.5-alpine-ram + environment: + POSTGRES_USER: postgres + POSTGRES_DB: pandas_nosetest + - image: circleci/mysql:8-ram + environment: + MYSQL_USER: "root" + MYSQL_HOST: "localhost" + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_DATABASE: "pandas_nosetest" + + environment: + JOB: "3.6_LOCALE_SLOW" + ENV_FILE: "ci/circle-36-locale_slow.yaml" + LOCALE_OVERRIDE: "zh_CN.UTF-8" + MINICONDA_DIR: /home/ubuntu/miniconda3 + steps: + - checkout + - run: + name: build + command: | + ./ci/install_circle.sh + ./ci/show_circle.sh + - run: + name: test + command: ./ci/run_circle.sh --only-slow --skip-network + + # -------------------------------------------------------------------------- + # 3. py35_ascii + # -------------------------------------------------------------------------- + py35_ascii: + docker: + - image: continuumio/miniconda:latest + # databases configuration + - image: circleci/postgres:9.6.5-alpine-ram + environment: + POSTGRES_USER: postgres + POSTGRES_DB: pandas_nosetest + - image: circleci/mysql:8-ram + environment: + MYSQL_USER: "root" + MYSQL_HOST: "localhost" + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_DATABASE: "pandas_nosetest" + + environment: + JOB: "3.5_ASCII" + ENV_FILE: "ci/circle-35-ascii.yaml" + LOCALE_OVERRIDE: "C" + MINICONDA_DIR: /home/ubuntu/miniconda3 + steps: + - checkout + - run: + name: build + command: | + ./ci/install_circle.sh + ./ci/show_circle.sh + - run: + name: test + command: ./ci/run_circle.sh --skip-slow --skip-network + + +workflows: + version: 2 + build_and_test: + jobs: + - py27_compat + - py36_locale + - py36_locale_slow + - py35_ascii diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 3f630aa6cf8f56..00000000000000 --- a/.coveragerc +++ /dev/null @@ -1,27 +0,0 @@ -# .coveragerc to control coverage.py -[run] -branch = False -omit = */tests/* - -[report] -# Regexes for lines to exclude from consideration -exclude_lines = - # Have to re-enable the standard pragma - pragma: no cover - - # Don't complain about missing debug-only code: - def __repr__ - if self\.debug - - # Don't complain if tests don't hit defensive assertion code: - raise AssertionError - raise NotImplementedError - - # Don't complain if non-runnable code isn't run: - if 0: - if __name__ == .__main__.: - -ignore_errors = False - -[html] -directory = coverage_html_report diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000000..a1fbece3284ece --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,63 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct + +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. + +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +A working group of community members is committed to promptly addressing any +reported issues. The working group is made up of pandas contributors and users. +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the working group by e-mail (pandas-coc@googlegroups.com). +Messages sent to this e-mail address will not be publicly visible but only to +the working group members. The working group currently includes + +- Safia Abdalla +- Tom Augspurger +- Joris Van den Bossche +- Camille Scott +- Nathaniel Smith + +All complaints will be reviewed and investigated and will result in a response +that is deemed necessary and appropriate to the circumstances. Maintainers are +obligated to maintain confidentiality with regard to the reporter of an +incident. + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[http://contributor-covenant.org/version/1/3/0/][version], +and the [Swift Code of Conduct][swift]. + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/3/0/ +[swift]: https://swift.org/community/#code-of-conduct + diff --git a/.gitignore b/.gitignore index ff0a6aef47163f..a59f2843c365ae 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,7 @@ .ipynb_checkpoints .tags .cache/ +.vscode/ # Compiled source # ################### @@ -60,6 +61,9 @@ dist .coverage coverage.xml coverage_html_report +*.pytest_cache +# hypothesis test database +.hypothesis/ # OS generated files # ###################### @@ -87,8 +91,8 @@ scikits *.c *.cpp -# Performance Testing # -####################### +# Unit / Performance Testing # +############################## asv_bench/env/ asv_bench/html/ asv_bench/results/ @@ -106,3 +110,5 @@ doc/build/html/index.html doc/tmp.sv doc/source/styled.xlsx doc/source/templates/ +env/ +doc/source/savefig/ diff --git a/.pep8speaks.yml b/.pep8speaks.yml index 299b76c8922cce..fda26d87bf7f67 100644 --- a/.pep8speaks.yml +++ b/.pep8speaks.yml @@ -6,5 +6,7 @@ scanner: pycodestyle: max-line-length: 79 ignore: # Errors and warnings to ignore - - E731 - - E402 + - E402, # module level import not at top of file + - E731, # do not assign a lambda expression, use a def + - E741, # do not use variables named 'l', 'O', or 'I' + - W503 # line break before binary operator diff --git a/.travis.yml b/.travis.yml index fe1a2950dbf081..76f4715a4abb2e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,67 +34,65 @@ matrix: - os: osx language: generic env: - - JOB="3.5_OSX" TEST_ARGS="--skip-slow --skip-network" + - JOB="3.5, OSX" ENV_FILE="ci/travis-35-osx.yaml" TEST_ARGS="--skip-slow --skip-network" + - dist: trusty env: - - JOB="2.7_LOCALE" LOCALE_OVERRIDE="zh_CN.UTF-8" SLOW=true - addons: - apt: - packages: - - language-pack-zh-hans + - JOB="3.7" ENV_FILE="ci/travis-37.yaml" TEST_ARGS="--skip-slow --skip-network" + - dist: trusty env: - - JOB="2.7" TEST_ARGS="--skip-slow" LINT=true + - JOB="2.7, locale, slow, old NumPy" ENV_FILE="ci/travis-27-locale.yaml" LOCALE_OVERRIDE="zh_CN.UTF-8" SLOW=true addons: apt: packages: - - python-gtk2 + - language-pack-zh-hans - dist: trusty env: - - JOB="3.5" TEST_ARGS="--skip-slow --skip-network" COVERAGE=true + - JOB="2.7, lint" ENV_FILE="ci/travis-27.yaml" TEST_ARGS="--skip-slow" LINT=true addons: apt: packages: - - xsel - - dist: trusty - env: - - JOB="3.6" TEST_ARGS="--skip-slow --skip-network" PANDAS_TESTING_MODE="deprecate" CONDA_FORGE=true - # In allow_failures - - dist: trusty - env: - - JOB="2.7_SLOW" SLOW=true - # In allow_failures + - python-gtk2 - dist: trusty env: - - JOB="2.7_BUILD_TEST" TEST_ARGS="--skip-slow" BUILD_TEST=true + - JOB="3.6, coverage" ENV_FILE="ci/travis-36.yaml" TEST_ARGS="--skip-slow --skip-network" PANDAS_TESTING_MODE="deprecate" COVERAGE=true DOCTEST=true # In allow_failures - dist: trusty env: - - JOB="3.6_NUMPY_DEV" TEST_ARGS="--skip-slow --skip-network" PANDAS_TESTING_MODE="deprecate" + - JOB="3.6, slow" ENV_FILE="ci/travis-36-slow.yaml" SLOW=true # In allow_failures - dist: trusty env: - - JOB="3.6_DOC" DOC=true + - JOB="3.7, NumPy dev" ENV_FILE="ci/travis-37-numpydev.yaml" TEST_ARGS="--skip-slow --skip-network -W error" PANDAS_TESTING_MODE="deprecate" addons: apt: packages: - xsel + # In allow_failures + - dist: trusty + env: + - JOB="3.6, doc" ENV_FILE="ci/travis-36-doc.yaml" DOC=true allow_failures: - dist: trusty env: - - JOB="2.7_SLOW" SLOW=true - - dist: trusty - env: - - JOB="2.7_BUILD_TEST" TEST_ARGS="--skip-slow" BUILD_TEST=true + - JOB="3.6, slow" ENV_FILE="ci/travis-36-slow.yaml" SLOW=true - dist: trusty env: - - JOB="3.6_NUMPY_DEV" TEST_ARGS="--skip-slow --skip-network" PANDAS_TESTING_MODE="deprecate" + - JOB="3.7, NumPy dev" ENV_FILE="ci/travis-37-numpydev.yaml" TEST_ARGS="--skip-slow --skip-network -W error" PANDAS_TESTING_MODE="deprecate" + addons: + apt: + packages: + - xsel - dist: trusty env: - - JOB="3.6_DOC" DOC=true + - JOB="3.6, doc" ENV_FILE="ci/travis-36-doc.yaml" DOC=true before_install: - echo "before_install" + # set non-blocking IO on travis + # https://github.com/travis-ci/travis-ci/issues/8920#issuecomment-352661024 + - python -c 'import os,sys,fcntl; flags = fcntl.fcntl(sys.stdout, fcntl.F_GETFL); fcntl.fcntl(sys.stdout, fcntl.F_SETFL, flags&~os.O_NONBLOCK);' - source ci/travis_process_gbq_encryption.sh - export PATH="$HOME/miniconda3/bin:$PATH" - df -h @@ -102,8 +100,6 @@ before_install: - uname -a - git --version - git tag - - ci/before_install_travis.sh - - export DISPLAY=":99.0" install: - echo "install start" @@ -114,6 +110,8 @@ install: before_script: - ci/install_db_travis.sh + - export DISPLAY=":99.0" + - ci/before_script_travis.sh script: - echo "script start" @@ -121,6 +119,7 @@ script: - ci/script_single.sh - ci/script_multi.sh - ci/lint.sh + - ci/doctests.sh - echo "checking imports" - source activate pandas && python ci/check_imports.py - echo "script done" diff --git a/LICENSES/XARRAY_LICENSE b/LICENSES/XARRAY_LICENSE new file mode 100644 index 00000000000000..37ec93a14fdcd0 --- /dev/null +++ b/LICENSES/XARRAY_LICENSE @@ -0,0 +1,191 @@ +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: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +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 +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 [yyyy] [name of copyright owner] + + 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. diff --git a/MANIFEST.in b/MANIFEST.in index 9773019c6e6e08..b417b8890fa245 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,27 +3,39 @@ include LICENSE include RELEASE.md include README.md include setup.py -include pyproject.toml graft doc prune doc/build +graft LICENSES + graft pandas -global-exclude *.so -global-exclude *.pyd +global-exclude *.bz2 +global-exclude *.csv +global-exclude *.dta +global-exclude *.gz +global-exclude *.h5 +global-exclude *.html +global-exclude *.json +global-exclude *.msgpack +global-exclude *.pickle +global-exclude *.png global-exclude *.pyc +global-exclude *.pyd +global-exclude *.sas7bdat +global-exclude *.so +global-exclude *.xls +global-exclude *.xlsm +global-exclude *.xlsx +global-exclude *.xpt +global-exclude *.xz +global-exclude *.zip global-exclude *~ -global-exclude \#* -global-exclude .git* global-exclude .DS_Store -global-exclude *.png +global-exclude .git* +global-exclude \#* -# include examples/data/* -# recursive-include examples *.py -# recursive-include doc/source * -# recursive-include doc/sphinxext * -# recursive-include LICENSES * include versioneer.py include pandas/_version.py include pandas/io/formats/templates/*.tpl diff --git a/Makefile b/Makefile index c79175cd3c4017..4a4aca21e1b784 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ build: clean_pyc python setup.py build_ext --inplace lint-diff: - git diff master --name-only -- "*.py" | grep "pandas" | xargs flake8 + git diff master --name-only -- "*.py" | grep -E "pandas|scripts" | xargs flake8 develop: build -python setup.py develop @@ -23,3 +23,4 @@ doc: cd doc; \ python make.py clean; \ python make.py html + python make.py spellcheck diff --git a/README.md b/README.md index ac043f55864984..3dde5e5e2a76e8 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,33 @@ - + - + - + + - + @@ -48,18 +63,14 @@ - - - - - - + - - + +
Latest Releaselatest release + + latest release + +
latest release + + latest release + +
Package Statusstatus + + status
Licenselicense + + license + +
Build Status
Coveragecoverage
Conda - - conda default downloads +   + + coverage
Conda-forgeDownloads conda-forge downloads @@ -67,18 +78,18 @@
PyPI - - pypi downloads - - Gitter + + +
-[![https://gitter.im/pydata/pandas](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/pydata/pandas?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -## What is it + +## What is it? **pandas** is a Python package providing fast, flexible, and expressive data structures designed to make working with "relational" or "labeled" data both @@ -147,7 +158,7 @@ The source code is currently hosted on GitHub at: https://github.com/pandas-dev/pandas Binary installers for the latest released version are available at the [Python -package index](https://pypi.python.org/pypi/pandas) and on conda. +package index](https://pypi.org/project/pandas) and on conda. ```sh # conda @@ -160,10 +171,9 @@ pip install pandas ``` ## Dependencies -- [NumPy](http://www.numpy.org): 1.7.0 or higher -- [python-dateutil](https://labix.org/python-dateutil): 1.5 or higher -- [pytz](https://pythonhosted.org/pytz) - - Needed for time zone support with ``pandas.date_range`` +- [NumPy](https://www.numpy.org): 1.9.0 or higher +- [python-dateutil](https://labix.org/python-dateutil): 2.5.0 or higher +- [pytz](https://pythonhosted.org/pytz): 2011k or higher See the [full installation instructions](https://pandas.pydata.org/pandas-docs/stable/install.html#dependencies) for recommended and optional dependencies. @@ -205,9 +215,6 @@ See the full instructions for [installing from source](https://pandas.pydata.org ## Documentation The official documentation is hosted on PyData.org: https://pandas.pydata.org/pandas-docs/stable -The Sphinx documentation should provide a good starting point for learning how -to use the library. Expect the docs to continue to expand as time goes on. - ## Background Work on ``pandas`` started at AQR (a quantitative hedge fund) in 2008 and has been under active development since then. @@ -220,12 +227,15 @@ Further, general questions and discussions can also take place on the [pydata ma ## Discussion and Development Most development discussion is taking place on github in this repo. Further, the [pandas-dev mailing list](https://mail.python.org/mailman/listinfo/pandas-dev) can also be used for specialized discussions or design issues, and a [Gitter channel](https://gitter.im/pydata/pandas) is available for quick development related questions. -## Contributing to pandas +## Contributing to pandas [![Open Source Helpers](https://www.codetriage.com/pandas-dev/pandas/badges/users.svg)](https://www.codetriage.com/pandas-dev/pandas) + All contributions, bug reports, bug fixes, documentation improvements, enhancements and ideas are welcome. A detailed overview on how to contribute can be found in the **[contributing guide.](https://pandas.pydata.org/pandas-docs/stable/contributing.html)** -If you are simply looking to start working with the pandas codebase, navigate to the [GitHub “issues” tab](https://github.com/pandas-dev/pandas/issues) and start looking through interesting issues. There are a number of issues listed under [Docs](https://github.com/pandas-dev/pandas/issues?labels=Docs&sort=updated&state=open) and [Difficulty Novice](https://github.com/pandas-dev/pandas/issues?q=is%3Aopen+is%3Aissue+label%3A%22Difficulty+Novice%22) where you could start out. +If you are simply looking to start working with the pandas codebase, navigate to the [GitHub “issues” tab](https://github.com/pandas-dev/pandas/issues) and start looking through interesting issues. There are a number of issues listed under [Docs](https://github.com/pandas-dev/pandas/issues?labels=Docs&sort=updated&state=open) and [good first issue](https://github.com/pandas-dev/pandas/issues?labels=good+first+issue&sort=updated&state=open) where you could start out. + +You can also triage issues which may include reproducing bug reports, or asking for vital information such as version numbers or reproduction instructions. If you would like to start triaging issues, one easy way to get started is to [subscribe to pandas on CodeTriage](https://www.codetriage.com/pandas-dev/pandas). Or maybe through using pandas you have an idea of your own or are looking for something in the documentation and thinking ‘this can be improved’...you can do something about it! diff --git a/appveyor.yml b/appveyor.yml index a1f8886f6d068f..c6199c1493f22a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,20 +11,23 @@ matrix: environment: global: # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the - # /E:ON and /V:ON options are not enabled in the batch script intepreter + # /E:ON and /V:ON options are not enabled in the batch script interpreter # See: http://stackoverflow.com/a/13751649/163740 CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\run_with_env.cmd" clone_folder: C:\projects\pandas + PANDAS_TESTING_MODE: "deprecate" matrix: - CONDA_ROOT: "C:\\Miniconda3_64" + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 PYTHON_VERSION: "3.6" PYTHON_ARCH: "64" CONDA_PY: "36" - CONDA_NPY: "112" + CONDA_NPY: "113" - CONDA_ROOT: "C:\\Miniconda3_64" + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 PYTHON_VERSION: "2.7" PYTHON_ARCH: "64" CONDA_PY: "27" @@ -72,19 +75,12 @@ install: - cmd: conda info -a # create our env - - cmd: conda create -n pandas python=%PYTHON_VERSION% cython pytest>=3.1.0 pytest-xdist + - cmd: conda env create -q -n pandas --file=ci\appveyor-%CONDA_PY%.yaml - cmd: activate pandas - - cmd: pip install moto - - SET REQ=ci\requirements-%PYTHON_VERSION%_WIN.run - - cmd: echo "installing requirements from %REQ%" - - cmd: conda install -n pandas --file=%REQ% - cmd: conda list -n pandas - - cmd: echo "installing requirements from %REQ% - done" - - # add some pip only reqs to the env - - SET REQ=ci\requirements-%PYTHON_VERSION%_WIN.pip - - cmd: echo "installing requirements from %REQ%" - - cmd: pip install -Ur %REQ% + # uninstall pandas if it's present + - cmd: conda remove pandas -y --force & exit 0 + - cmd: pip uninstall -y pandas & exit 0 # build em using the local source checkout in the correct windows env - cmd: '%CMD_IN_ENV% python setup.py build_ext --inplace' diff --git a/asv_bench/benchmarks/algorithms.py b/asv_bench/benchmarks/algorithms.py index 40cfec1bcd4c74..cccd38ef112519 100644 --- a/asv_bench/benchmarks/algorithms.py +++ b/asv_bench/benchmarks/algorithms.py @@ -1,7 +1,7 @@ +import warnings from importlib import import_module import numpy as np - import pandas as pd from pandas.util import testing as tm @@ -12,113 +12,117 @@ except: pass -class Algorithms(object): +from .pandas_vb_common import setup # noqa + + +class Factorize(object): + goal_time = 0.2 - def setup(self): - N = 100000 - np.random.seed(1234) + params = [True, False] + param_names = ['sort'] - self.int_unique = pd.Int64Index(np.arange(N * 5)) - # cache is_unique - self.int_unique.is_unique + def setup(self, sort): + N = 10**5 + self.int_idx = pd.Int64Index(np.arange(N).repeat(5)) + self.float_idx = pd.Float64Index(np.random.randn(N).repeat(5)) + self.string_idx = tm.makeStringIndex(N) - self.int = pd.Int64Index(np.arange(N).repeat(5)) - self.float = pd.Float64Index(np.random.randn(N).repeat(5)) + def time_factorize_int(self, sort): + self.int_idx.factorize(sort=sort) - # Convenience naming. - self.checked_add = pd.core.algorithms.checked_add_with_arr + def time_factorize_float(self, sort): + self.float_idx.factorize(sort=sort) - self.arr = np.arange(1000000) - self.arrpos = np.arange(1000000) - self.arrneg = np.arange(-1000000, 0) - self.arrmixed = np.array([1, -1]).repeat(500000) - self.strings = tm.makeStringIndex(100000) + def time_factorize_string(self, sort): + self.string_idx.factorize(sort=sort) - self.arr_nan = np.random.choice([True, False], size=1000000) - self.arrmixed_nan = np.random.choice([True, False], size=1000000) - # match - self.uniques = tm.makeStringIndex(1000).values - self.all = self.uniques.repeat(10) +class Duplicated(object): - def time_factorize_string(self): - self.strings.factorize() + goal_time = 0.2 - def time_factorize_int(self): - self.int.factorize() + params = ['first', 'last', False] + param_names = ['keep'] - def time_factorize_float(self): - self.int.factorize() + def setup(self, keep): + N = 10**5 + self.int_idx = pd.Int64Index(np.arange(N).repeat(5)) + self.float_idx = pd.Float64Index(np.random.randn(N).repeat(5)) + self.string_idx = tm.makeStringIndex(N) - def time_duplicated_int_unique(self): - self.int_unique.duplicated() + def time_duplicated_int(self, keep): + self.int_idx.duplicated(keep=keep) - def time_duplicated_int(self): - self.int.duplicated() + def time_duplicated_float(self, keep): + self.float_idx.duplicated(keep=keep) - def time_duplicated_float(self): - self.float.duplicated() + def time_duplicated_string(self, keep): + self.string_idx.duplicated(keep=keep) - def time_match_strings(self): - pd.match(self.all, self.uniques) - def time_add_overflow_pos_scalar(self): - self.checked_add(self.arr, 1) +class DuplicatedUniqueIndex(object): - def time_add_overflow_neg_scalar(self): - self.checked_add(self.arr, -1) + goal_time = 0.2 - def time_add_overflow_zero_scalar(self): - self.checked_add(self.arr, 0) + def setup(self): + N = 10**5 + self.idx_int_dup = pd.Int64Index(np.arange(N * 5)) + # cache is_unique + self.idx_int_dup.is_unique - def time_add_overflow_pos_arr(self): - self.checked_add(self.arr, self.arrpos) + def time_duplicated_unique_int(self): + self.idx_int_dup.duplicated() - def time_add_overflow_neg_arr(self): - self.checked_add(self.arr, self.arrneg) - def time_add_overflow_mixed_arr(self): - self.checked_add(self.arr, self.arrmixed) +class Match(object): - def time_add_overflow_first_arg_nan(self): - self.checked_add(self.arr, self.arrmixed, arr_mask=self.arr_nan) + goal_time = 0.2 - def time_add_overflow_second_arg_nan(self): - self.checked_add(self.arr, self.arrmixed, b_mask=self.arrmixed_nan) + def setup(self): + self.uniques = tm.makeStringIndex(1000).values + self.all = self.uniques.repeat(10) - def time_add_overflow_both_arg_nan(self): - self.checked_add(self.arr, self.arrmixed, arr_mask=self.arr_nan, - b_mask=self.arrmixed_nan) + def time_match_string(self): + with warnings.catch_warnings(record=True): + pd.match(self.all, self.uniques) class Hashing(object): + goal_time = 0.2 - def setup(self): - N = 100000 - - self.df = pd.DataFrame( - {'A': pd.Series(tm.makeStringIndex(100).take( - np.random.randint(0, 100, size=N))), - 'B': pd.Series(tm.makeStringIndex(10000).take( - np.random.randint(0, 10000, size=N))), - 'D': np.random.randn(N), - 'E': np.arange(N), - 'F': pd.date_range('20110101', freq='s', periods=N), - 'G': pd.timedelta_range('1 day', freq='s', periods=N), - }) - self.df['C'] = self.df['B'].astype('category') - self.df.iloc[10:20] = np.nan - - def time_frame(self): - hashing.hash_pandas_object(self.df) - - def time_series_int(self): - hashing.hash_pandas_object(self.df.E) - - def time_series_string(self): - hashing.hash_pandas_object(self.df.B) - - def time_series_categorical(self): - hashing.hash_pandas_object(self.df.C) + def setup_cache(self): + N = 10**5 + + df = pd.DataFrame( + {'strings': pd.Series(tm.makeStringIndex(10000).take( + np.random.randint(0, 10000, size=N))), + 'floats': np.random.randn(N), + 'ints': np.arange(N), + 'dates': pd.date_range('20110101', freq='s', periods=N), + 'timedeltas': pd.timedelta_range('1 day', freq='s', periods=N)}) + df['categories'] = df['strings'].astype('category') + df.iloc[10:20] = np.nan + return df + + def time_frame(self, df): + hashing.hash_pandas_object(df) + + def time_series_int(self, df): + hashing.hash_pandas_object(df['ints']) + + def time_series_string(self, df): + hashing.hash_pandas_object(df['strings']) + + def time_series_float(self, df): + hashing.hash_pandas_object(df['floats']) + + def time_series_categorical(self, df): + hashing.hash_pandas_object(df['categories']) + + def time_series_timedeltas(self, df): + hashing.hash_pandas_object(df['timedeltas']) + + def time_series_dates(self, df): + hashing.hash_pandas_object(df['dates']) diff --git a/asv_bench/benchmarks/attrs_caching.py b/asv_bench/benchmarks/attrs_caching.py index b7610037bed4d9..48f0b7d71144c1 100644 --- a/asv_bench/benchmarks/attrs_caching.py +++ b/asv_bench/benchmarks/attrs_caching.py @@ -1,12 +1,15 @@ -from .pandas_vb_common import * - +import numpy as np +from pandas import DataFrame try: from pandas.util import cache_readonly except ImportError: from pandas.util.decorators import cache_readonly +from .pandas_vb_common import setup # noqa + class DataFrameAttributes(object): + goal_time = 0.2 def setup(self): @@ -21,6 +24,7 @@ def time_set_index(self): class CacheReadonly(object): + goal_time = 0.2 def setup(self): diff --git a/asv_bench/benchmarks/binary_ops.py b/asv_bench/benchmarks/binary_ops.py index 0ca21b929ea17c..cc8766e1fa39cc 100644 --- a/asv_bench/benchmarks/binary_ops.py +++ b/asv_bench/benchmarks/binary_ops.py @@ -1,11 +1,16 @@ -from .pandas_vb_common import * +import numpy as np +from pandas import DataFrame, Series, date_range +from pandas.core.algorithms import checked_add_with_arr try: import pandas.core.computation.expressions as expr except ImportError: import pandas.computation.expressions as expr +from .pandas_vb_common import setup # noqa + class Ops(object): + goal_time = 0.2 params = [[True, False], ['default', 1]] @@ -20,18 +25,17 @@ def setup(self, use_numexpr, threads): if not use_numexpr: expr.set_use_numexpr(False) - def time_frame_add(self, use_numexpr, threads): - (self.df + self.df2) + self.df + self.df2 def time_frame_mult(self, use_numexpr, threads): - (self.df * self.df2) + self.df * self.df2 def time_frame_multi_and(self, use_numexpr, threads): - self.df[((self.df > 0) & (self.df2 > 0))] + self.df[(self.df > 0) & (self.df2 > 0)] def time_frame_comparison(self, use_numexpr, threads): - (self.df > self.df2) + self.df > self.df2 def teardown(self, use_numexpr, threads): expr.set_use_numexpr(True) @@ -39,75 +43,109 @@ def teardown(self, use_numexpr, threads): class Ops2(object): + goal_time = 0.2 def setup(self): - self.df = DataFrame(np.random.randn(1000, 1000)) - self.df2 = DataFrame(np.random.randn(1000, 1000)) + N = 10**3 + self.df = DataFrame(np.random.randn(N, N)) + self.df2 = DataFrame(np.random.randn(N, N)) - self.df_int = DataFrame( - np.random.random_integers(np.iinfo(np.int16).min, - np.iinfo(np.int16).max, - size=(1000, 1000))) - self.df2_int = DataFrame( - np.random.random_integers(np.iinfo(np.int16).min, - np.iinfo(np.int16).max, - size=(1000, 1000))) + self.df_int = DataFrame(np.random.randint(np.iinfo(np.int16).min, + np.iinfo(np.int16).max, + size=(N, N))) + self.df2_int = DataFrame(np.random.randint(np.iinfo(np.int16).min, + np.iinfo(np.int16).max, + size=(N, N))) - ## Division + # Division def time_frame_float_div(self): - (self.df // self.df2) + self.df // self.df2 def time_frame_float_div_by_zero(self): - (self.df / 0) + self.df / 0 def time_frame_float_floor_by_zero(self): - (self.df // 0) + self.df // 0 def time_frame_int_div_by_zero(self): - (self.df_int / 0) + self.df_int / 0 - ## Modulo + # Modulo def time_frame_int_mod(self): - (self.df / self.df2) + self.df_int % self.df2_int def time_frame_float_mod(self): - (self.df / self.df2) + self.df % self.df2 class Timeseries(object): + goal_time = 0.2 - def setup(self): - self.N = 1000000 - self.halfway = ((self.N // 2) - 1) - self.s = Series(date_range('20010101', periods=self.N, freq='T')) - self.ts = self.s[self.halfway] + params = [None, 'US/Eastern'] + param_names = ['tz'] - self.s2 = Series(date_range('20010101', periods=self.N, freq='s')) + def setup(self, tz): + N = 10**6 + halfway = (N // 2) - 1 + self.s = Series(date_range('20010101', periods=N, freq='T', tz=tz)) + self.ts = self.s[halfway] - def time_series_timestamp_compare(self): - (self.s <= self.ts) + self.s2 = Series(date_range('20010101', periods=N, freq='s', tz=tz)) - def time_timestamp_series_compare(self): - (self.ts >= self.s) + def time_series_timestamp_compare(self, tz): + self.s <= self.ts - def time_timestamp_ops_diff1(self): + def time_timestamp_series_compare(self, tz): + self.ts >= self.s + + def time_timestamp_ops_diff(self, tz): self.s2.diff() - def time_timestamp_ops_diff2(self): - (self.s - self.s.shift()) + def time_timestamp_ops_diff_with_shift(self, tz): + self.s - self.s.shift() + +class AddOverflowScalar(object): + goal_time = 0.2 -class TimeseriesTZ(Timeseries): + params = [1, -1, 0] + param_names = ['scalar'] + + def setup(self, scalar): + N = 10**6 + self.arr = np.arange(N) + + def time_add_overflow_scalar(self, scalar): + checked_add_with_arr(self.arr, scalar) - def setup(self): - self.N = 1000000 - self.halfway = ((self.N // 2) - 1) - self.s = Series(date_range('20010101', periods=self.N, freq='T', tz='US/Eastern')) - self.ts = self.s[self.halfway] - self.s2 = Series(date_range('20010101', periods=self.N, freq='s', tz='US/Eastern')) +class AddOverflowArray(object): + + goal_time = 0.2 + + def setup(self): + N = 10**6 + self.arr = np.arange(N) + self.arr_rev = np.arange(-N, 0) + self.arr_mixed = np.array([1, -1]).repeat(N / 2) + self.arr_nan_1 = np.random.choice([True, False], size=N) + self.arr_nan_2 = np.random.choice([True, False], size=N) + + def time_add_overflow_arr_rev(self): + checked_add_with_arr(self.arr, self.arr_rev) + + def time_add_overflow_arr_mask_nan(self): + checked_add_with_arr(self.arr, self.arr_mixed, arr_mask=self.arr_nan_1) + + def time_add_overflow_b_mask_nan(self): + checked_add_with_arr(self.arr, self.arr_mixed, + b_mask=self.arr_nan_1) + + def time_add_overflow_both_arg_nan(self): + checked_add_with_arr(self.arr, self.arr_mixed, arr_mask=self.arr_nan_1, + b_mask=self.arr_nan_2) diff --git a/asv_bench/benchmarks/categoricals.py b/asv_bench/benchmarks/categoricals.py index a5bb5e790dec13..2a7717378c280b 100644 --- a/asv_bench/benchmarks/categoricals.py +++ b/asv_bench/benchmarks/categoricals.py @@ -1,4 +1,8 @@ -from .pandas_vb_common import * +import warnings + +import numpy as np +import pandas as pd +import pandas.util.testing as tm try: from pandas.api.types import union_categoricals except ImportError: @@ -7,108 +11,237 @@ except ImportError: pass +from .pandas_vb_common import setup # noqa + + +class Concat(object): -class Categoricals(object): goal_time = 0.2 def setup(self): - N = 100000 - self.s = pd.Series((list('aabbcd') * N)).astype('category') + N = 10**5 + self.s = pd.Series(list('aabbcd') * N).astype('category') + + self.a = pd.Categorical(list('aabbcd') * N) + self.b = pd.Categorical(list('bbcdjk') * N) + + def time_concat(self): + pd.concat([self.s, self.s]) + + def time_union(self): + union_categoricals([self.a, self.b]) + - self.a = pd.Categorical((list('aabbcd') * N)) - self.b = pd.Categorical((list('bbcdjk') * N)) +class Constructor(object): + + goal_time = 0.2 + def setup(self): + N = 10**5 self.categories = list('abcde') - self.cat_idx = Index(self.categories) + self.cat_idx = pd.Index(self.categories) self.values = np.tile(self.categories, N) self.codes = np.tile(range(len(self.categories)), N) - self.datetimes = pd.Series(pd.date_range( - '1995-01-01 00:00:00', periods=10000, freq='s')) + self.datetimes = pd.Series(pd.date_range('1995-01-01 00:00:00', + periods=N / 10, + freq='s')) + self.datetimes_with_nat = self.datetimes.copy() + self.datetimes_with_nat.iloc[-1] = pd.NaT self.values_some_nan = list(np.tile(self.categories + [np.nan], N)) self.values_all_nan = [np.nan] * len(self.values) + self.values_all_int8 = np.ones(N, 'int8') - def time_concat(self): - concat([self.s, self.s]) + def time_regular(self): + pd.Categorical(self.values, self.categories) - def time_union(self): - union_categoricals([self.a, self.b]) + def time_fastpath(self): + pd.Categorical(self.codes, self.cat_idx, fastpath=True) - def time_constructor_regular(self): - Categorical(self.values, self.categories) + def time_datetimes(self): + pd.Categorical(self.datetimes) - def time_constructor_fastpath(self): - Categorical(self.codes, self.cat_idx, fastpath=True) + def time_datetimes_with_nat(self): + pd.Categorical(self.datetimes_with_nat) - def time_constructor_datetimes(self): - Categorical(self.datetimes) + def time_with_nan(self): + pd.Categorical(self.values_some_nan) - def time_constructor_datetimes_with_nat(self): - t = self.datetimes - t.iloc[-1] = pd.NaT - Categorical(t) + def time_all_nan(self): + pd.Categorical(self.values_all_nan) - def time_constructor_with_nan(self): - Categorical(self.values_some_nan) + def time_from_codes_all_int8(self): + pd.Categorical.from_codes(self.values_all_int8, self.categories) - def time_constructor_all_nan(self): - Categorical(self.values_all_nan) +class ValueCounts(object): -class Categoricals2(object): goal_time = 0.2 - def setup(self): - n = 500000 - np.random.seed(2718281) + params = [True, False] + param_names = ['dropna'] + + def setup(self, dropna): + n = 5 * 10**5 arr = ['s%04d' % i for i in np.random.randint(0, n // 10, size=n)] - self.ts = Series(arr).astype('category') + self.ts = pd.Series(arr).astype('category') + + def time_value_counts(self, dropna): + self.ts.value_counts(dropna=dropna) + - self.sel = self.ts.loc[[0]] +class Repr(object): - def time_value_counts(self): - self.ts.value_counts(dropna=False) + goal_time = 0.2 - def time_value_counts_dropna(self): - self.ts.value_counts(dropna=True) + def setup(self): + self.sel = pd.Series(['s1234']).astype('category') def time_rendering(self): str(self.sel) + +class SetCategories(object): + + goal_time = 0.2 + + def setup(self): + n = 5 * 10**5 + arr = ['s%04d' % i for i in np.random.randint(0, n // 10, size=n)] + self.ts = pd.Series(arr).astype('category') + def time_set_categories(self): self.ts.cat.set_categories(self.ts.cat.categories[::2]) -class Categoricals3(object): +class Rank(object): + goal_time = 0.2 def setup(self): - N = 100000 + N = 10**5 ncats = 100 - self.s1 = Series(np.array(tm.makeCategoricalIndex(N, ncats))) - self.s1_cat = self.s1.astype('category') - self.s1_cat_ordered = self.s1.astype('category', ordered=True) + self.s_str = pd.Series(tm.makeCategoricalIndex(N, ncats)).astype(str) + self.s_str_cat = self.s_str.astype('category') + with warnings.catch_warnings(record=True): + self.s_str_cat_ordered = self.s_str.astype('category', + ordered=True) - self.s2 = Series(np.random.randint(0, ncats, size=N)) - self.s2_cat = self.s2.astype('category') - self.s2_cat_ordered = self.s2.astype('category', ordered=True) + self.s_int = pd.Series(np.random.randint(0, ncats, size=N)) + self.s_int_cat = self.s_int.astype('category') + with warnings.catch_warnings(record=True): + self.s_int_cat_ordered = self.s_int.astype('category', + ordered=True) def time_rank_string(self): - self.s1.rank() + self.s_str.rank() def time_rank_string_cat(self): - self.s1_cat.rank() + self.s_str_cat.rank() def time_rank_string_cat_ordered(self): - self.s1_cat_ordered.rank() + self.s_str_cat_ordered.rank() def time_rank_int(self): - self.s2.rank() + self.s_int.rank() def time_rank_int_cat(self): - self.s2_cat.rank() + self.s_int_cat.rank() def time_rank_int_cat_ordered(self): - self.s2_cat_ordered.rank() + self.s_int_cat_ordered.rank() + + +class Isin(object): + + goal_time = 0.2 + + params = ['object', 'int64'] + param_names = ['dtype'] + + def setup(self, dtype): + np.random.seed(1234) + n = 5 * 10**5 + sample_size = 100 + arr = [i for i in np.random.randint(0, n // 10, size=n)] + if dtype == 'object': + arr = ['s%04d' % i for i in arr] + self.sample = np.random.choice(arr, sample_size) + self.series = pd.Series(arr).astype('category') + + def time_isin_categorical(self, dtype): + self.series.isin(self.sample) + + +class IsMonotonic(object): + + def setup(self): + N = 1000 + self.c = pd.CategoricalIndex(list('a' * N + 'b' * N + 'c' * N)) + self.s = pd.Series(self.c) + + def time_categorical_index_is_monotonic_increasing(self): + self.c.is_monotonic_increasing + + def time_categorical_index_is_monotonic_decreasing(self): + self.c.is_monotonic_decreasing + + def time_categorical_series_is_monotonic_increasing(self): + self.s.is_monotonic_increasing + + def time_categorical_series_is_monotonic_decreasing(self): + self.s.is_monotonic_decreasing + + +class Contains(object): + + goal_time = 0.2 + + def setup(self): + N = 10**5 + self.ci = tm.makeCategoricalIndex(N) + self.c = self.ci.values + self.key = self.ci.categories[0] + + def time_categorical_index_contains(self): + self.key in self.ci + + def time_categorical_contains(self): + self.key in self.c + + +class CategoricalSlicing(object): + + goal_time = 0.2 + params = ['monotonic_incr', 'monotonic_decr', 'non_monotonic'] + param_names = ['index'] + + def setup(self, index): + N = 10**6 + values = list('a' * N + 'b' * N + 'c' * N) + indices = { + 'monotonic_incr': pd.Categorical(values), + 'monotonic_decr': pd.Categorical(reversed(values)), + 'non_monotonic': pd.Categorical(list('abc' * N))} + self.data = indices[index] + + self.scalar = 10000 + self.list = list(range(10000)) + self.cat_scalar = 'b' + + def time_getitem_scalar(self, index): + self.data[self.scalar] + + def time_getitem_slice(self, index): + self.data[:self.scalar] + + def time_getitem_list_like(self, index): + self.data[[self.scalar]] + + def time_getitem_list(self, index): + self.data[self.list] + + def time_getitem_bool_array(self, index): + self.data[self.data == self.cat_scalar] diff --git a/asv_bench/benchmarks/ctors.py b/asv_bench/benchmarks/ctors.py index b5694a3a21502b..3f9016787aab4b 100644 --- a/asv_bench/benchmarks/ctors.py +++ b/asv_bench/benchmarks/ctors.py @@ -1,30 +1,66 @@ -from .pandas_vb_common import * +import numpy as np +import pandas.util.testing as tm +from pandas import Series, Index, DatetimeIndex, Timestamp, MultiIndex +from .pandas_vb_common import setup # noqa + + +class SeriesConstructors(object): -class Constructors(object): goal_time = 0.2 - def setup(self): - self.arr = np.random.randn(100, 100) - self.arr_str = np.array(['foo', 'bar', 'baz'], dtype=object) + param_names = ["data_fmt", "with_index"] + params = [[lambda x: x, + list, + lambda arr: list(arr.astype(str)), + lambda arr: dict(zip(range(len(arr)), arr)), + lambda arr: [(i, -i) for i in arr], + lambda arr: [[i, -i] for i in arr], + lambda arr: ([(i, -i) for i in arr][:-1] + [None]), + lambda arr: ([[i, -i] for i in arr][:-1] + [None])], + [False, True]] + + def setup(self, data_fmt, with_index): + N = 10**4 + arr = np.random.randn(N) + self.data = data_fmt(arr) + self.index = np.arange(N) if with_index else None - self.data = np.random.randn(100) - self.index = Index(np.arange(100)) + def time_series_constructor(self, data_fmt, with_index): + Series(self.data, index=self.index) - self.s = Series(([Timestamp('20110101'), Timestamp('20120101'), - Timestamp('20130101')] * 1000)) - def time_frame_from_ndarray(self): - DataFrame(self.arr) +class SeriesDtypesConstructors(object): - def time_series_from_ndarray(self): - pd.Series(self.data, index=self.index) + goal_time = 0.2 + + def setup(self): + N = 10**4 + self.arr = np.random.randn(N, N) + self.arr_str = np.array(['foo', 'bar', 'baz'], dtype=object) + self.s = Series([Timestamp('20110101'), Timestamp('20120101'), + Timestamp('20130101')] * N * 10) def time_index_from_array_string(self): Index(self.arr_str) + def time_index_from_array_floats(self): + Index(self.arr) + def time_dtindex_from_series(self): DatetimeIndex(self.s) - def time_dtindex_from_series2(self): + def time_dtindex_from_index_with_series(self): Index(self.s) + + +class MultiIndexConstructor(object): + + goal_time = 0.2 + + def setup(self): + N = 10**4 + self.iterables = [tm.makeStringIndex(N), range(20)] + + def time_multiindex_from_iterables(self): + MultiIndex.from_product(self.iterables) diff --git a/asv_bench/benchmarks/eval.py b/asv_bench/benchmarks/eval.py index 6f33590ee9e33f..8e581dcf22b4c8 100644 --- a/asv_bench/benchmarks/eval.py +++ b/asv_bench/benchmarks/eval.py @@ -1,70 +1,67 @@ -from .pandas_vb_common import * +import numpy as np import pandas as pd try: import pandas.core.computation.expressions as expr except ImportError: import pandas.computation.expressions as expr +from .pandas_vb_common import setup # noqa + class Eval(object): + goal_time = 0.2 params = [['numexpr', 'python'], [1, 'all']] param_names = ['engine', 'threads'] def setup(self, engine, threads): - self.df = DataFrame(np.random.randn(20000, 100)) - self.df2 = DataFrame(np.random.randn(20000, 100)) - self.df3 = DataFrame(np.random.randn(20000, 100)) - self.df4 = DataFrame(np.random.randn(20000, 100)) + self.df = pd.DataFrame(np.random.randn(20000, 100)) + self.df2 = pd.DataFrame(np.random.randn(20000, 100)) + self.df3 = pd.DataFrame(np.random.randn(20000, 100)) + self.df4 = pd.DataFrame(np.random.randn(20000, 100)) if threads == 1: expr.set_numexpr_threads(1) def time_add(self, engine, threads): - df, df2, df3, df4 = self.df, self.df2, self.df3, self.df4 - pd.eval('df + df2 + df3 + df4', engine=engine) + pd.eval('self.df + self.df2 + self.df3 + self.df4', engine=engine) def time_and(self, engine, threads): - df, df2, df3, df4 = self.df, self.df2, self.df3, self.df4 - pd.eval('(df > 0) & (df2 > 0) & (df3 > 0) & (df4 > 0)', engine=engine) + pd.eval('(self.df > 0) & (self.df2 > 0) & ' + '(self.df3 > 0) & (self.df4 > 0)', engine=engine) def time_chained_cmp(self, engine, threads): - df, df2, df3, df4 = self.df, self.df2, self.df3, self.df4 - pd.eval('df < df2 < df3 < df4', engine=engine) + pd.eval('self.df < self.df2 < self.df3 < self.df4', engine=engine) def time_mult(self, engine, threads): - df, df2, df3, df4 = self.df, self.df2, self.df3, self.df4 - pd.eval('df * df2 * df3 * df4', engine=engine) + pd.eval('self.df * self.df2 * self.df3 * self.df4', engine=engine) def teardown(self, engine, threads): expr.set_numexpr_threads() class Query(object): + goal_time = 0.2 def setup(self): - self.N = 1000000 - self.halfway = ((self.N // 2) - 1) - self.index = date_range('20010101', periods=self.N, freq='T') - self.s = Series(self.index) - self.ts = self.s.iloc[self.halfway] - self.df = DataFrame({'a': np.random.randn(self.N), }, index=self.index) - self.df2 = DataFrame({'dates': self.s.values,}) - - self.df3 = DataFrame({'a': np.random.randn(self.N),}) - self.min_val = self.df3['a'].min() - self.max_val = self.df3['a'].max() + N = 10**6 + halfway = (N // 2) - 1 + index = pd.date_range('20010101', periods=N, freq='T') + s = pd.Series(index) + self.ts = s.iloc[halfway] + self.df = pd.DataFrame({'a': np.random.randn(N), 'dates': s}, + index=index) + data = np.random.randn(N) + self.min_val = data.min() + self.max_val = data.max() def time_query_datetime_index(self): - ts = self.ts - self.df.query('index < @ts') + self.df.query('index < @self.ts') - def time_query_datetime_series(self): - ts = self.ts - self.df2.query('dates < @ts') + def time_query_datetime_column(self): + self.df.query('dates < @self.ts') def time_query_with_boolean_selection(self): - min_val, max_val = self.min_val, self.max_val - self.df.query('(a >= @min_val) & (a <= @max_val)') + self.df.query('(a >= @self.min_val) & (a <= @self.max_val)') diff --git a/asv_bench/benchmarks/frame_ctor.py b/asv_bench/benchmarks/frame_ctor.py index dec4fcba0eb5e6..9def910df0babd 100644 --- a/asv_bench/benchmarks/frame_ctor.py +++ b/asv_bench/benchmarks/frame_ctor.py @@ -1,138 +1,101 @@ -from .pandas_vb_common import * +import numpy as np +import pandas.util.testing as tm +from pandas import DataFrame, Series, MultiIndex, Timestamp, date_range try: - from pandas.tseries.offsets import * -except: - from pandas.core.datetools import * + from pandas.tseries.offsets import Nano, Hour +except ImportError: + # For compatibility with older versions + from pandas.core.datetools import * # noqa +from .pandas_vb_common import setup # noqa -#---------------------------------------------------------------------- -# Creation from nested dict class FromDicts(object): + goal_time = 0.2 def setup(self): - (N, K) = (5000, 50) + N, K = 5000, 50 self.index = tm.makeStringIndex(N) self.columns = tm.makeStringIndex(K) - self.frame = DataFrame(np.random.randn(N, K), index=self.index, columns=self.columns) - try: - self.data = self.frame.to_dict() - except: - self.data = self.frame.toDict() - self.some_dict = list(self.data.values())[0] - self.dict_list = [dict(zip(self.columns, row)) for row in self.frame.values] - - self.data2 = dict( - ((i, dict(((j, float(j)) for j in range(100)))) for i in - range(2000))) - - def time_frame_ctor_list_of_dict(self): + frame = DataFrame(np.random.randn(N, K), index=self.index, + columns=self.columns) + self.data = frame.to_dict() + self.dict_list = frame.to_dict(orient='records') + self.data2 = {i: {j: float(j) for j in range(100)} + for i in range(2000)} + + def time_list_of_dict(self): DataFrame(self.dict_list) - def time_frame_ctor_nested_dict(self): + def time_nested_dict(self): DataFrame(self.data) - def time_series_ctor_from_dict(self): - Series(self.some_dict) + def time_nested_dict_index(self): + DataFrame(self.data, index=self.index) + + def time_nested_dict_columns(self): + DataFrame(self.data, columns=self.columns) + + def time_nested_dict_index_columns(self): + DataFrame(self.data, index=self.index, columns=self.columns) - def time_frame_ctor_nested_dict_int64(self): + def time_nested_dict_int64(self): # nested dict, integer indexes, regression described in #621 - DataFrame(self.data) + DataFrame(self.data2) -# from a mi-series +class FromSeries(object): -class frame_from_series(object): goal_time = 0.2 def setup(self): - self.mi = MultiIndex.from_tuples([(x, y) for x in range(100) for y in range(100)]) - self.s = Series(randn(10000), index=self.mi) + mi = MultiIndex.from_product([range(100), range(100)]) + self.s = Series(np.random.randn(10000), index=mi) - def time_frame_from_mi_series(self): + def time_mi_series(self): DataFrame(self.s) -#---------------------------------------------------------------------- -# get_numeric_data +class FromDictwithTimestamp(object): -class frame_get_numeric_data(object): goal_time = 0.2 + params = [Nano(1), Hour(1)] + param_names = ['offset'] - def setup(self): - self.df = DataFrame(randn(10000, 25)) - self.df['foo'] = 'bar' - self.df['bar'] = 'baz' - self.df = self.df.consolidate() - - def time_frame_get_numeric_data(self): - self.df._get_numeric_data() - - -# ---------------------------------------------------------------------- -# From dict with DatetimeIndex with all offsets - -# dynamically generate benchmarks for every offset -# -# get_period_count & get_index_for_offset are there because blindly taking each -# offset times 1000 can easily go out of Timestamp bounds and raise errors. - - -def get_period_count(start_date, off): - ten_offsets_in_days = ((start_date + (off * 10)) - start_date).days - if (ten_offsets_in_days == 0): - return 1000 - else: - return min((9 * ((Timestamp.max - start_date).days // ten_offsets_in_days)), 1000) - - -def get_index_for_offset(off): - start_date = Timestamp('1/1/1900') - return date_range(start_date, periods=min(1000, get_period_count( - start_date, off)), freq=off) - - -all_offsets = offsets.__all__ -# extra cases -for off in ['FY5253', 'FY5253Quarter']: - all_offsets.pop(all_offsets.index(off)) - all_offsets.extend([off + '_1', off + '_2']) + def setup(self, offset): + N = 10**3 + np.random.seed(1234) + idx = date_range(Timestamp('1/1/1900'), freq=offset, periods=N) + df = DataFrame(np.random.randn(N, 10), index=idx) + self.d = df.to_dict() + def time_dict_with_timestamp_offsets(self, offset): + DataFrame(self.d) -class FrameConstructorDTIndexFromOffsets(object): - params = [all_offsets, [1, 2]] - param_names = ['offset', 'n_steps'] +class FromRecords(object): - offset_kwargs = {'WeekOfMonth': {'weekday': 1, 'week': 1}, - 'LastWeekOfMonth': {'weekday': 1, 'week': 1}, - 'FY5253': {'startingMonth': 1, 'weekday': 1}, - 'FY5253Quarter': {'qtr_with_extra_week': 1, 'startingMonth': 1, 'weekday': 1}} + goal_time = 0.2 + params = [None, 1000] + param_names = ['nrows'] - offset_extra_cases = {'FY5253': {'variation': ['nearest', 'last']}, - 'FY5253Quarter': {'variation': ['nearest', 'last']}} + def setup(self, nrows): + N = 100000 + self.gen = ((x, (x * 20), (x * 100)) for x in range(N)) - def setup(self, offset, n_steps): + def time_frame_from_records_generator(self, nrows): + # issue-6700 + self.df = DataFrame.from_records(self.gen, nrows=nrows) - extra = False - if offset.endswith("_", None, -1): - extra = int(offset[-1]) - offset = offset[:-2] - kwargs = {} - if offset in self.offset_kwargs: - kwargs = self.offset_kwargs[offset] +class FromNDArray(object): - if extra: - extras = self.offset_extra_cases[offset] - for extra_arg in extras: - kwargs[extra_arg] = extras[extra_arg][extra -1] + goal_time = 0.2 - offset = getattr(offsets, offset) - self.idx = get_index_for_offset(offset(n_steps, **kwargs)) - self.df = DataFrame(np.random.randn(len(self.idx), 10), index=self.idx) - self.d = dict([(col, self.df[col]) for col in self.df.columns]) + def setup(self): + N = 100000 + self.data = np.random.randn(N) - def time_frame_ctor(self, offset, n_steps): - DataFrame(self.d) + def time_frame_from_ndarray(self): + self.df = DataFrame(self.data) diff --git a/asv_bench/benchmarks/frame_methods.py b/asv_bench/benchmarks/frame_methods.py index af72ca1e9a6ab6..1819cfa2725dbf 100644 --- a/asv_bench/benchmarks/frame_methods.py +++ b/asv_bench/benchmarks/frame_methods.py @@ -1,20 +1,43 @@ -from .pandas_vb_common import * import string +import warnings +import numpy as np +import pandas.util.testing as tm +from pandas import (DataFrame, Series, MultiIndex, date_range, period_range, + isnull, NaT) -#---------------------------------------------------------------------- -# lookup +from .pandas_vb_common import setup # noqa + + +class GetNumericData(object): + + goal_time = 0.2 + + def setup(self): + self.df = DataFrame(np.random.randn(10000, 25)) + self.df['foo'] = 'bar' + self.df['bar'] = 'baz' + with warnings.catch_warnings(record=True): + self.df = self.df.consolidate() + + def time_frame_get_numeric_data(self): + self.df._get_numeric_data() + + +class Lookup(object): -class frame_fancy_lookup(object): goal_time = 0.2 def setup(self): - self.df = DataFrame(np.random.randn(10000, 8), columns=list('abcdefgh')) + self.df = DataFrame(np.random.randn(10000, 8), + columns=list('abcdefgh')) self.df['foo'] = 'bar' self.row_labels = list(self.df.index[::10])[:900] - self.col_labels = (list(self.df.columns) * 100) - self.row_labels_all = np.array((list(self.df.index) * len(self.df.columns)), dtype='object') - self.col_labels_all = np.array((list(self.df.columns) * len(self.df.index)), dtype='object') + self.col_labels = list(self.df.columns) * 100 + self.row_labels_all = np.array( + list(self.df.index) * len(self.df.columns), dtype='object') + self.col_labels_all = np.array( + list(self.df.columns) * len(self.df.index), dtype='object') def time_frame_fancy_lookup(self): self.df.lookup(self.row_labels, self.col_labels) @@ -23,25 +46,20 @@ def time_frame_fancy_lookup_all(self): self.df.lookup(self.row_labels_all, self.col_labels_all) -#---------------------------------------------------------------------- -# reindex - class Reindex(object): + goal_time = 0.2 def setup(self): - self.df = DataFrame(randn(10000, 1000)) - self.idx = np.arange(4000, 7000) - + N = 10**3 + self.df = DataFrame(np.random.randn(N * 10, N)) + self.idx = np.arange(4 * N, 7 * N) self.df2 = DataFrame( - dict([(c, {0: randint(0, 2, 1000).astype(np.bool_), - 1: randint(0, 1000, 1000).astype( - np.int16), - 2: randint(0, 1000, 1000).astype( - np.int32), - 3: randint(0, 1000, 1000).astype( - np.int64),}[randint(0, 4)]) for c in - range(1000)])) + {c: {0: np.random.randint(0, 2, N).astype(np.bool_), + 1: np.random.randint(0, N, N).astype(np.int16), + 2: np.random.randint(0, N, N).astype(np.int32), + 3: np.random.randint(0, N, N).astype(np.int64)} + [np.random.randint(0, 4)] for c in range(N)}) def time_reindex_axis0(self): self.df.reindex(self.idx) @@ -53,81 +71,86 @@ def time_reindex_both_axes(self): self.df.reindex(index=self.idx, columns=self.idx) def time_reindex_both_axes_ix(self): - self.df.ix[(self.idx, self.idx)] + self.df.ix[self.idx, self.idx] def time_reindex_upcast(self): self.df2.reindex(np.random.permutation(range(1200))) -#---------------------------------------------------------------------- -# iteritems (monitor no-copying behaviour) - class Iteration(object): + goal_time = 0.2 def setup(self): - self.df = DataFrame(randn(10000, 1000)) - self.df2 = DataFrame(np.random.randn(50000, 10)) - self.df3 = pd.DataFrame(np.random.randn(1000,5000), - columns=['C'+str(c) for c in range(5000)]) + N = 1000 + self.df = DataFrame(np.random.randn(N * 10, N)) + self.df2 = DataFrame(np.random.randn(N * 50, 10)) + self.df3 = DataFrame(np.random.randn(N, 5 * N), + columns=['C' + str(c) for c in range(N * 5)]) - def f(self): + def time_iteritems(self): + # (monitor no-copying behaviour) if hasattr(self.df, '_item_cache'): self.df._item_cache.clear() - for (name, col) in self.df.iteritems(): - pass - - def g(self): - for (name, col) in self.df.iteritems(): + for name, col in self.df.iteritems(): pass - def time_iteritems(self): - self.f() - def time_iteritems_cached(self): - self.g() + for name, col in self.df.iteritems(): + pass def time_iteritems_indexing(self): - df = self.df3 - for col in df: - df[col] + for col in self.df3: + self.df3[col] def time_itertuples(self): for row in self.df2.itertuples(): pass + def time_iterrows(self): + for row in self.df.iterrows(): + pass + -#---------------------------------------------------------------------- -# to_string, to_html, repr +class ToString(object): -class Formatting(object): goal_time = 0.2 def setup(self): - self.df = DataFrame(randn(100, 10)) + self.df = DataFrame(np.random.randn(100, 10)) - self.nrows = 500 - self.df2 = DataFrame(randn(self.nrows, 10)) - self.df2[0] = period_range('2000', '2010', self.nrows) - self.df2[1] = range(self.nrows) + def time_to_string_floats(self): + self.df.to_string() - self.nrows = 10000 - self.data = randn(self.nrows, 10) - self.idx = MultiIndex.from_arrays(np.tile(randn(3, int(self.nrows / 100)), 100)) - self.df3 = DataFrame(self.data, index=self.idx) - self.idx = randn(self.nrows) - self.df4 = DataFrame(self.data, index=self.idx) - self.df_tall = pandas.DataFrame(np.random.randn(10000, 10)) +class ToHTML(object): - self.df_wide = pandas.DataFrame(np.random.randn(10, 10000)) + goal_time = 0.2 - def time_to_string_floats(self): - self.df.to_string() + def setup(self): + nrows = 500 + self.df2 = DataFrame(np.random.randn(nrows, 10)) + self.df2[0] = period_range('2000', periods=nrows) + self.df2[1] = range(nrows) def time_to_html_mixed(self): self.df2.to_html() + +class Repr(object): + + goal_time = 0.2 + + def setup(self): + nrows = 10000 + data = np.random.randn(nrows, 10) + arrays = np.tile(np.random.randn(3, int(nrows / 100)), 100) + idx = MultiIndex.from_arrays(arrays) + self.df3 = DataFrame(data, index=idx) + self.df4 = DataFrame(data, index=np.random.randn(nrows)) + self.df_tall = DataFrame(np.random.randn(nrows, 10)) + self.df_wide = DataFrame(np.random.randn(10, nrows)) + def time_html_repr_trunc_mi(self): self.df3._repr_html_() @@ -141,21 +164,16 @@ def time_frame_repr_wide(self): repr(self.df_wide) -#---------------------------------------------------------------------- -# nulls/masking - +class MaskBool(object): -## masking - -class frame_mask_bools(object): goal_time = 0.2 def setup(self): - self.data = np.random.randn(1000, 500) - self.df = DataFrame(self.data) - self.df = self.df.where((self.df > 0)) - self.bools = (self.df > 0) - self.mask = isnull(self.df) + data = np.random.randn(1000, 500) + df = DataFrame(data) + df = df.where(df > 0) + self.bools = df > 0 + self.mask = isnull(df) def time_frame_mask_bools(self): self.bools.mask(self.mask) @@ -164,31 +182,26 @@ def time_frame_mask_floats(self): self.bools.astype(float).mask(self.mask) -## isnull +class Isnull(object): -class FrameIsnull(object): goal_time = 0.2 def setup(self): - self.df_no_null = DataFrame(np.random.randn(1000, 1000)) - - np.random.seed(1234) - self.sample = np.array([np.nan, 1.0]) - self.data = np.random.choice(self.sample, (1000, 1000)) - self.df = DataFrame(self.data) - - np.random.seed(1234) - self.sample = np.array(list(string.ascii_lowercase) + - list(string.ascii_uppercase) + - list(string.whitespace)) - self.data = np.random.choice(self.sample, (1000, 1000)) - self.df_strings= DataFrame(self.data) - - np.random.seed(1234) - self.sample = np.array([NaT, np.nan, None, np.datetime64('NaT'), - np.timedelta64('NaT'), 0, 1, 2.0, '', 'abcd']) - self.data = np.random.choice(self.sample, (1000, 1000)) - self.df_obj = DataFrame(self.data) + N = 10**3 + self.df_no_null = DataFrame(np.random.randn(N, N)) + + sample = np.array([np.nan, 1.0]) + data = np.random.choice(sample, (N, N)) + self.df = DataFrame(data) + + sample = np.array(list(string.ascii_letters + string.whitespace)) + data = np.random.choice(sample, (N, N)) + self.df_strings = DataFrame(data) + + sample = np.array([NaT, np.nan, None, np.datetime64('NaT'), + np.timedelta64('NaT'), 0, 1, 2.0, '', 'abcd']) + data = np.random.choice(sample, (N, N)) + self.df_obj = DataFrame(data) def time_isnull_floats_no_null(self): isnull(self.df_no_null) @@ -203,92 +216,74 @@ def time_isnull_obj(self): isnull(self.df_obj) -# ---------------------------------------------------------------------- -# fillna in place - -class frame_fillna_inplace(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame(randn(10000, 100)) - self.df.values[::2] = np.nan - - def time_frame_fillna_inplace(self): - self.df.fillna(0, inplace=True) - - +class Fillna(object): -class frame_fillna_many_columns_pad(object): goal_time = 0.2 + params = ([True, False], ['pad', 'bfill']) + param_names = ['inplace', 'method'] - def setup(self): - self.values = np.random.randn(1000, 1000) - self.values[::2] = np.nan - self.df = DataFrame(self.values) - - def time_frame_fillna_many_columns_pad(self): - self.df.fillna(method='pad') + def setup(self, inplace, method): + values = np.random.randn(10000, 100) + values[::2] = np.nan + self.df = DataFrame(values) + def time_frame_fillna(self, inplace, method): + self.df.fillna(inplace=inplace, method=method) class Dropna(object): + goal_time = 0.2 + params = (['all', 'any'], [0, 1]) + param_names = ['how', 'axis'] - def setup(self): - self.data = np.random.randn(10000, 1000) - self.df = DataFrame(self.data) + def setup(self, how, axis): + self.df = DataFrame(np.random.randn(10000, 1000)) self.df.ix[50:1000, 20:50] = np.nan self.df.ix[2000:3000] = np.nan self.df.ix[:, 60:70] = np.nan self.df_mixed = self.df.copy() self.df_mixed['foo'] = 'bar' - self.df_mi = self.df.copy() - self.df_mi.index = MultiIndex.from_tuples(self.df_mi.index.map((lambda x: (x, x)))) - self.df_mi.columns = MultiIndex.from_tuples(self.df_mi.columns.map((lambda x: (x, x)))) - - self.df_mixed_mi = self.df_mixed.copy() - self.df_mixed_mi.index = MultiIndex.from_tuples(self.df_mixed_mi.index.map((lambda x: (x, x)))) - self.df_mixed_mi.columns = MultiIndex.from_tuples(self.df_mixed_mi.columns.map((lambda x: (x, x)))) - - def time_dropna_axis0_all(self): - self.df.dropna(how='all', axis=0) + def time_dropna(self, how, axis): + self.df.dropna(how=how, axis=axis) - def time_dropna_axis0_any(self): - self.df.dropna(how='any', axis=0) + def time_dropna_axis_mixed_dtypes(self, how, axis): + self.df_mixed.dropna(how=how, axis=axis) - def time_dropna_axis1_all(self): - self.df.dropna(how='all', axis=1) - def time_dropna_axis1_any(self): - self.df.dropna(how='any', axis=1) +class Count(object): - def time_dropna_axis0_all_mixed_dtypes(self): - self.df_mixed.dropna(how='all', axis=0) - - def time_dropna_axis0_any_mixed_dtypes(self): - self.df_mixed.dropna(how='any', axis=0) - - def time_dropna_axis1_all_mixed_dtypes(self): - self.df_mixed.dropna(how='all', axis=1) + goal_time = 0.2 - def time_dropna_axis1_any_mixed_dtypes(self): - self.df_mixed.dropna(how='any', axis=1) + params = [0, 1] + param_names = ['axis'] - def time_count_level_axis0_multi(self): - self.df_mi.count(axis=0, level=1) + def setup(self, axis): + self.df = DataFrame(np.random.randn(10000, 1000)) + self.df.ix[50:1000, 20:50] = np.nan + self.df.ix[2000:3000] = np.nan + self.df.ix[:, 60:70] = np.nan + self.df_mixed = self.df.copy() + self.df_mixed['foo'] = 'bar' - def time_count_level_axis1_multi(self): - self.df_mi.count(axis=1, level=1) + self.df.index = MultiIndex.from_arrays([self.df.index, self.df.index]) + self.df.columns = MultiIndex.from_arrays([self.df.columns, + self.df.columns]) + self.df_mixed.index = MultiIndex.from_arrays([self.df_mixed.index, + self.df_mixed.index]) + self.df_mixed.columns = MultiIndex.from_arrays([self.df_mixed.columns, + self.df_mixed.columns]) - def time_count_level_axis0_mixed_dtypes_multi(self): - self.df_mixed_mi.count(axis=0, level=1) + def time_count_level_multi(self, axis): + self.df.count(axis=axis, level=1) - def time_count_level_axis1_mixed_dtypes_multi(self): - self.df_mixed_mi.count(axis=1, level=1) + def time_count_level_mixed_dtypes_multi(self, axis): + self.df_mixed.count(axis=axis, level=1) class Apply(object): + goal_time = 0.2 def setup(self): @@ -296,32 +291,29 @@ def setup(self): self.s = Series(np.arange(1028.0)) self.df2 = DataFrame({i: self.s for i in range(1028)}) - self.df3 = DataFrame(np.random.randn(1000, 3), columns=list('ABC')) def time_apply_user_func(self): - self.df2.apply((lambda x: np.corrcoef(x, self.s)[(0, 1)])) + self.df2.apply(lambda x: np.corrcoef(x, self.s)[(0, 1)]) def time_apply_axis_1(self): - self.df.apply((lambda x: (x + 1)), axis=1) + self.df.apply(lambda x: x + 1, axis=1) def time_apply_lambda_mean(self): - self.df.apply((lambda x: x.mean())) + self.df.apply(lambda x: x.mean()) def time_apply_np_mean(self): self.df.apply(np.mean) def time_apply_pass_thru(self): - self.df.apply((lambda x: x)) + self.df.apply(lambda x: x) def time_apply_ref_by_name(self): - self.df3.apply((lambda x: (x['A'] + x['B'])), axis=1) + self.df3.apply(lambda x: x['A'] + x['B'], axis=1) -#---------------------------------------------------------------------- -# dtypes +class Dtypes(object): -class frame_dtypes(object): goal_time = 0.2 def setup(self): @@ -330,331 +322,211 @@ def setup(self): def time_frame_dtypes(self): self.df.dtypes -#---------------------------------------------------------------------- -# equals class Equals(object): + goal_time = 0.2 def setup(self): - self.float_df = DataFrame(np.random.randn(1000, 1000)) - self.object_df = DataFrame(([(['foo'] * 1000)] * 1000)) - self.nonunique_cols = self.object_df.copy() - self.nonunique_cols.columns = (['A'] * len(self.nonunique_cols.columns)) - self.pairs = dict([(name, self.make_pair(frame)) for (name, frame) in ( - ('float_df', self.float_df), ('object_df', self.object_df), - ('nonunique_cols', self.nonunique_cols))]) + N = 10**3 + self.float_df = DataFrame(np.random.randn(N, N)) + self.float_df_nan = self.float_df.copy() + self.float_df_nan.iloc[-1, -1] = np.nan - def make_pair(self, frame): - self.df = frame - self.df2 = self.df.copy() - self.df2.ix[((-1), (-1))] = np.nan - return (self.df, self.df2) + self.object_df = DataFrame('foo', index=range(N), columns=range(N)) + self.object_df_nan = self.object_df.copy() + self.object_df_nan.iloc[-1, -1] = np.nan - def test_equal(self, name): - (self.df, self.df2) = self.pairs[name] - return self.df.equals(self.df) - - def test_unequal(self, name): - (self.df, self.df2) = self.pairs[name] - return self.df.equals(self.df2) + self.nonunique_cols = self.object_df.copy() + self.nonunique_cols.columns = ['A'] * len(self.nonunique_cols.columns) + self.nonunique_cols_nan = self.nonunique_cols.copy() + self.nonunique_cols_nan.iloc[-1, -1] = np.nan def time_frame_float_equal(self): - self.test_equal('float_df') + self.float_df.equals(self.float_df) def time_frame_float_unequal(self): - self.test_unequal('float_df') + self.float_df.equals(self.float_df_nan) def time_frame_nonunique_equal(self): - self.test_equal('nonunique_cols') + self.nonunique_cols.equals(self.nonunique_cols) def time_frame_nonunique_unequal(self): - self.test_unequal('nonunique_cols') + self.nonunique_cols.equals(self.nonunique_cols_nan) def time_frame_object_equal(self): - self.test_equal('object_df') + self.object_df.equals(self.object_df) def time_frame_object_unequal(self): - self.test_unequal('object_df') + self.object_df.equals(self.object_df_nan) class Interpolate(object): + goal_time = 0.2 + params = [None, 'infer'] + param_names = ['downcast'] - def setup(self): + def setup(self, downcast): + N = 10000 # this is the worst case, where every column has NaNs. - self.df = DataFrame(randn(10000, 100)) + self.df = DataFrame(np.random.randn(N, 100)) self.df.values[::2] = np.nan - self.df2 = DataFrame( - {'A': np.arange(0, 10000), 'B': np.random.randint(0, 100, 10000), - 'C': randn(10000), 'D': randn(10000),}) + self.df2 = DataFrame({'A': np.arange(0, N), + 'B': np.random.randint(0, 100, N), + 'C': np.random.randn(N), + 'D': np.random.randn(N)}) self.df2.loc[1::5, 'A'] = np.nan self.df2.loc[1::5, 'C'] = np.nan - def time_interpolate(self): - self.df.interpolate() - - def time_interpolate_some_good(self): - self.df2.interpolate() + def time_interpolate(self, downcast): + self.df.interpolate(downcast=downcast) - def time_interpolate_some_good_infer(self): - self.df2.interpolate(downcast='infer') + def time_interpolate_some_good(self, downcast): + self.df2.interpolate(downcast=downcast) class Shift(object): # frame shift speedup issue-5609 goal_time = 0.2 + params = [0, 1] + param_names = ['axis'] - def setup(self): + def setup(self, axis): self.df = DataFrame(np.random.rand(10000, 500)) - def time_shift_axis0(self): - self.df.shift(1, axis=0) - - def time_shift_axis_1(self): - self.df.shift(1, axis=1) - - -#----------------------------------------------------------------------------- -# from_records issue-6700 - -class frame_from_records_generator(object): - goal_time = 0.2 - - def get_data(self, n=100000): - return ((x, (x * 20), (x * 100)) for x in range(n)) - - def time_frame_from_records_generator(self): - self.df = DataFrame.from_records(self.get_data()) - - def time_frame_from_records_generator_nrows(self): - self.df = DataFrame.from_records(self.get_data(), nrows=1000) + def time_shift(self, axis): + self.df.shift(1, axis=axis) - -#----------------------------------------------------------------------------- -# nunique - -class frame_nunique(object): +class Nunique(object): def setup(self): - self.data = np.random.randn(10000, 1000) - self.df = DataFrame(self.data) + self.df = DataFrame(np.random.randn(10000, 1000)) def time_frame_nunique(self): self.df.nunique() +class Duplicated(object): -#----------------------------------------------------------------------------- -# duplicated - -class frame_duplicated(object): goal_time = 0.2 def setup(self): - self.n = (1 << 20) - self.t = date_range('2015-01-01', freq='S', periods=(self.n // 64)) - self.xs = np.random.randn((self.n // 64)).round(2) - self.df = DataFrame({'a': np.random.randint(((-1) << 8), (1 << 8), self.n), 'b': np.random.choice(self.t, self.n), 'c': np.random.choice(self.xs, self.n), }) - - self.df2 = DataFrame(np.random.randn(1000, 100).astype(str)) + n = (1 << 20) + t = date_range('2015-01-01', freq='S', periods=(n // 64)) + xs = np.random.randn(n // 64).round(2) + self.df = DataFrame({'a': np.random.randint(-1 << 8, 1 << 8, n), + 'b': np.random.choice(t, n), + 'c': np.random.choice(xs, n)}) + self.df2 = DataFrame(np.random.randn(1000, 100).astype(str)).T def time_frame_duplicated(self): self.df.duplicated() def time_frame_duplicated_wide(self): - self.df2.T.duplicated() - - - - - + self.df2.duplicated() +class XS(object): - - - - - - - - - -class frame_xs_col(object): goal_time = 0.2 + params = [0, 1] + param_names = ['axis'] - def setup(self): - self.df = DataFrame(randn(1, 100000)) - - def time_frame_xs_col(self): - self.df.xs(50000, axis=1) + def setup(self, axis): + self.N = 10**4 + self.df = DataFrame(np.random.randn(self.N, self.N)) + def time_frame_xs(self, axis): + self.df.xs(self.N / 2, axis=axis) -class frame_xs_row(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame(randn(100000, 1)) - def time_frame_xs_row(self): - self.df.xs(50000) +class SortValues(object): - -class frame_sort_index(object): goal_time = 0.2 + params = [True, False] + param_names = ['ascending'] - def setup(self): - self.df = DataFrame(randn(1000000, 2), columns=list('AB')) - - def time_frame_sort_index(self): - self.df.sort_index() - + def setup(self, ascending): + self.df = DataFrame(np.random.randn(1000000, 2), columns=list('AB')) -class frame_sort_index_by_columns(object): - goal_time = 0.2 - - def setup(self): - self.N = 10000 - self.K = 10 - self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) - self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) - self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) - self.col_array_list = list(self.df.values.T) + def time_frame_sort_values(self, ascending): + self.df.sort_values(by='A', ascending=ascending) - def time_frame_sort_index_by_columns(self): - self.df.sort_index(by=['key1', 'key2']) +class SortIndexByColumns(object): -class frame_quantile_axis1(object): goal_time = 0.2 def setup(self): - self.df = DataFrame(np.random.randn(1000, 3), - columns=list('ABC')) + N = 10000 + K = 10 + self.df = DataFrame({'key1': tm.makeStringIndex(N).values.repeat(K), + 'key2': tm.makeStringIndex(N).values.repeat(K), + 'value': np.random.randn(N * K)}) - def time_frame_quantile_axis1(self): - self.df.quantile([0.1, 0.5], axis=1) + def time_frame_sort_values_by_columns(self): + self.df.sort_values(by=['key1', 'key2']) -#---------------------------------------------------------------------- -# boolean indexing +class Quantile(object): -class frame_boolean_row_select(object): goal_time = 0.2 + params = [0, 1] + param_names = ['axis'] - def setup(self): - self.df = DataFrame(randn(10000, 100)) - self.bool_arr = np.zeros(10000, dtype=bool) - self.bool_arr[:1000] = True - - def time_frame_boolean_row_select(self): - self.df[self.bool_arr] - -class frame_getitem_single_column(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame(randn(10000, 1000)) - self.df2 = DataFrame(randn(3000, 1), columns=['A']) - self.df3 = DataFrame(randn(3000, 1)) - - def h(self): - for i in range(10000): - self.df2['A'] - - def j(self): - for i in range(10000): - self.df3[0] - - def time_frame_getitem_single_column(self): - self.h() + def setup(self, axis): + self.df = DataFrame(np.random.randn(1000, 3), columns=list('ABC')) - def time_frame_getitem_single_column2(self): - self.j() + def time_frame_quantile(self, axis): + self.df.quantile([0.1, 0.5], axis=axis) -#---------------------------------------------------------------------- -# assignment - -class frame_assign_timeseries_index(object): +class GetDtypeCounts(object): + # 2807 goal_time = 0.2 def setup(self): - self.idx = date_range('1/1/2000', periods=100000, freq='H') - self.df = DataFrame(randn(100000, 1), columns=['A'], index=self.idx) - - def time_frame_assign_timeseries_index(self): - self.f(self.df) + self.df = DataFrame(np.random.randn(10, 10000)) - def f(self, df): - self.x = self.df.copy() - self.x['date'] = self.x.index + def time_frame_get_dtype_counts(self): + self.df.get_dtype_counts() + def time_info(self): + self.df.info() -# insert many columns +class NSort(object): -class frame_insert_100_columns_begin(object): goal_time = 0.2 + params = ['first', 'last', 'all'] + param_names = ['keep'] - def setup(self): - self.N = 1000 - - def f(self, K=100): - self.df = DataFrame(index=range(self.N)) - self.new_col = np.random.randn(self.N) - for i in range(K): - self.df.insert(0, i, self.new_col) - - def g(self, K=500): - self.df = DataFrame(index=range(self.N)) - self.new_col = np.random.randn(self.N) - for i in range(K): - self.df[i] = self.new_col - - def time_frame_insert_100_columns_begin(self): - self.f() - - def time_frame_insert_500_columns_end(self): - self.g() - - - -#---------------------------------------------------------------------- -# strings methods, #2602 - -class series_string_vector_slice(object): - goal_time = 0.2 + def setup(self, keep): + self.df = DataFrame(np.random.randn(1000, 3), columns=list('ABC')) - def setup(self): - self.s = Series((['abcdefg', np.nan] * 500000)) + def time_nlargest(self, keep): + self.df.nlargest(100, 'A', keep=keep) - def time_series_string_vector_slice(self): - self.s.str[:5] + def time_nsmallest(self, keep): + self.df.nsmallest(100, 'A', keep=keep) -#---------------------------------------------------------------------- -# df.info() and get_dtype_counts() # 2807 +class Describe(object): -class frame_get_dtype_counts(object): goal_time = 0.2 def setup(self): - self.df = DataFrame(np.random.randn(10, 10000)) - - def time_frame_get_dtype_counts(self): - self.df.get_dtype_counts() + self.df = DataFrame({ + 'a': np.random.randint(0, 100, int(1e6)), + 'b': np.random.randint(0, 100, int(1e6)), + 'c': np.random.randint(0, 100, int(1e6)) + }) + def time_series_describe(self): + self.df['a'].describe() -class frame_nlargest(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame(np.random.randn(1000, 3), - columns=list('ABC')) - - def time_frame_nlargest(self): - self.df.nlargest(100, 'A') + def time_dataframe_describe(self): + self.df.describe() diff --git a/asv_bench/benchmarks/gil.py b/asv_bench/benchmarks/gil.py index 78a94976e732d1..21c1ccf46e1c44 100644 --- a/asv_bench/benchmarks/gil.py +++ b/asv_bench/benchmarks/gil.py @@ -1,241 +1,139 @@ -from .pandas_vb_common import * - +import numpy as np +import pandas.util.testing as tm +from pandas import DataFrame, Series, read_csv, factorize, date_range from pandas.core.algorithms import take_1d - try: - from cStringIO import StringIO + from pandas import (rolling_median, rolling_mean, rolling_min, rolling_max, + rolling_var, rolling_skew, rolling_kurt, rolling_std) + have_rolling_methods = True except ImportError: - from io import StringIO - + have_rolling_methods = False try: from pandas._libs import algos except ImportError: from pandas import algos - try: from pandas.util.testing import test_parallel - have_real_test_parallel = True except ImportError: have_real_test_parallel = False - def test_parallel(num_threads=1): - def wrapper(fname): return fname - return wrapper +from .pandas_vb_common import BaseIO, setup # noqa -class NoGilGroupby(object): - goal_time = 0.2 - def setup(self): - self.N = 1000000 - self.ngroups = 1000 - np.random.seed(1234) - self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) +class ParallelGroupbyMethods(object): - np.random.seed(1234) - self.size = 2 ** 22 - self.ngroups = 100 - self.data = Series(np.random.randint(0, self.ngroups, size=self.size)) + goal_time = 0.2 + params = ([2, 4, 8], ['count', 'last', 'max', 'mean', 'min', 'prod', + 'sum', 'var']) + param_names = ['threads', 'method'] - if (not have_real_test_parallel): + def setup(self, threads, method): + if not have_real_test_parallel: raise NotImplementedError + N = 10**6 + ngroups = 10**3 + df = DataFrame({'key': np.random.randint(0, ngroups, size=N), + 'data': np.random.randn(N)}) - @test_parallel(num_threads=2) - def _pg2_count(self): - self.df.groupby('key')['data'].count() - - def time_count_2(self): - self._pg2_count() - - @test_parallel(num_threads=2) - def _pg2_last(self): - self.df.groupby('key')['data'].last() - - def time_last_2(self): - self._pg2_last() - - @test_parallel(num_threads=2) - def _pg2_max(self): - self.df.groupby('key')['data'].max() - - def time_max_2(self): - self._pg2_max() - - @test_parallel(num_threads=2) - def _pg2_mean(self): - self.df.groupby('key')['data'].mean() - - def time_mean_2(self): - self._pg2_mean() - - @test_parallel(num_threads=2) - def _pg2_min(self): - self.df.groupby('key')['data'].min() - - def time_min_2(self): - self._pg2_min() + @test_parallel(num_threads=threads) + def parallel(): + getattr(df.groupby('key')['data'], method)() + self.parallel = parallel - @test_parallel(num_threads=2) - def _pg2_prod(self): - self.df.groupby('key')['data'].prod() + def loop(): + getattr(df.groupby('key')['data'], method)() + self.loop = loop - def time_prod_2(self): - self._pg2_prod() + def time_parallel(self, threads, method): + self.parallel() - @test_parallel(num_threads=2) - def _pg2_sum(self): - self.df.groupby('key')['data'].sum() + def time_loop(self, threads, method): + for i in range(threads): + self.loop() - def time_sum_2(self): - self._pg2_sum() - @test_parallel(num_threads=4) - def _pg4_sum(self): - self.df.groupby('key')['data'].sum() +class ParallelGroups(object): - def time_sum_4(self): - self._pg4_sum() - - def time_sum_4_notp(self): - for i in range(4): - self.df.groupby('key')['data'].sum() - - def _f_sum(self): - self.df.groupby('key')['data'].sum() - - @test_parallel(num_threads=8) - def _pg8_sum(self): - self._f_sum() - - def time_sum_8(self): - self._pg8_sum() - - def time_sum_8_notp(self): - for i in range(8): - self._f_sum() - - @test_parallel(num_threads=2) - def _pg2_var(self): - self.df.groupby('key')['data'].var() - - def time_var_2(self): - self._pg2_var() - - # get groups - - def _groups(self): - self.data.groupby(self.data).groups - - @test_parallel(num_threads=2) - def _pg2_groups(self): - self._groups() - - def time_groups_2(self): - self._pg2_groups() - - @test_parallel(num_threads=4) - def _pg4_groups(self): - self._groups() - - def time_groups_4(self): - self._pg4_groups() - - @test_parallel(num_threads=8) - def _pg8_groups(self): - self._groups() - - def time_groups_8(self): - self._pg8_groups() - - - -class nogil_take1d_float64(object): goal_time = 0.2 + params = [2, 4, 8] + param_names = ['threads'] - def setup(self): - self.N = 1000000 - self.ngroups = 1000 - np.random.seed(1234) - self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) - if (not have_real_test_parallel): + def setup(self, threads): + if not have_real_test_parallel: raise NotImplementedError - self.N = 10000000.0 - self.df = DataFrame({'int64': np.arange(self.N, dtype='int64'), 'float64': np.arange(self.N, dtype='float64'), }) - self.indexer = np.arange(100, (len(self.df) - 100)) + size = 2**22 + ngroups = 10**3 + data = Series(np.random.randint(0, ngroups, size=size)) - def time_nogil_take1d_float64(self): - self.take_1d_pg2_int64() + @test_parallel(num_threads=threads) + def get_groups(): + data.groupby(data).groups + self.get_groups = get_groups - @test_parallel(num_threads=2) - def take_1d_pg2_int64(self): - take_1d(self.df.int64.values, self.indexer) + def time_get_groups(self, threads): + self.get_groups() - @test_parallel(num_threads=2) - def take_1d_pg2_float64(self): - take_1d(self.df.float64.values, self.indexer) +class ParallelTake1D(object): -class nogil_take1d_int64(object): goal_time = 0.2 + params = ['int64', 'float64'] + param_names = ['dtype'] - def setup(self): - self.N = 1000000 - self.ngroups = 1000 - np.random.seed(1234) - self.df = DataFrame({'key': np.random.randint(0, self.ngroups, size=self.N), 'data': np.random.randn(self.N), }) - if (not have_real_test_parallel): + def setup(self, dtype): + if not have_real_test_parallel: raise NotImplementedError - self.N = 10000000.0 - self.df = DataFrame({'int64': np.arange(self.N, dtype='int64'), 'float64': np.arange(self.N, dtype='float64'), }) - self.indexer = np.arange(100, (len(self.df) - 100)) + N = 10**6 + df = DataFrame({'col': np.arange(N, dtype=dtype)}) + indexer = np.arange(100, len(df) - 100) - def time_nogil_take1d_int64(self): - self.take_1d_pg2_float64() + @test_parallel(num_threads=2) + def parallel_take1d(): + take_1d(df['col'].values, indexer) + self.parallel_take1d = parallel_take1d - @test_parallel(num_threads=2) - def take_1d_pg2_int64(self): - take_1d(self.df.int64.values, self.indexer) + def time_take1d(self, dtype): + self.parallel_take1d() - @test_parallel(num_threads=2) - def take_1d_pg2_float64(self): - take_1d(self.df.float64.values, self.indexer) +class ParallelKth(object): -class nogil_kth_smallest(object): number = 1 repeat = 5 def setup(self): - if (not have_real_test_parallel): + if not have_real_test_parallel: raise NotImplementedError - np.random.seed(1234) - self.N = 10000000 - self.k = 500000 - self.a = np.random.randn(self.N) - self.b = self.a.copy() - self.kwargs_list = [{'arr': self.a}, {'arr': self.b}] + N = 10**7 + k = 5 * 10**5 + kwargs_list = [{'arr': np.random.randn(N)}, + {'arr': np.random.randn(N)}] + + @test_parallel(num_threads=2, kwargs_list=kwargs_list) + def parallel_kth_smallest(arr): + algos.kth_smallest(arr, k) + self.parallel_kth_smallest = parallel_kth_smallest - def time_nogil_kth_smallest(self): - @test_parallel(num_threads=2, kwargs_list=self.kwargs_list) - def run(arr): - algos.kth_smallest(arr, self.k) - run() + def time_kth_smallest(self): + self.parallel_kth_smallest() -class nogil_datetime_fields(object): +class ParallelDatetimeFields(object): + goal_time = 0.2 def setup(self): - self.N = 100000000 - self.dti = pd.date_range('1900-01-01', periods=self.N, freq='T') - self.period = self.dti.to_period('D') - if (not have_real_test_parallel): + if not have_real_test_parallel: raise NotImplementedError + N = 10**6 + self.dti = date_range('1900-01-01', periods=N, freq='T') + self.period = self.dti.to_period('D') def time_datetime_field_year(self): @test_parallel(num_threads=2) @@ -274,149 +172,104 @@ def run(period): run(self.period) -class nogil_rolling_algos_slow(object): - goal_time = 0.2 - - def setup(self): - self.win = 100 - np.random.seed(1234) - self.arr = np.random.rand(100000) - if (not have_real_test_parallel): - raise NotImplementedError +class ParallelRolling(object): - def time_nogil_rolling_median(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_median(arr, win) - run(self.arr, self.win) - - -class nogil_rolling_algos_fast(object): goal_time = 0.2 + params = ['median', 'mean', 'min', 'max', 'var', 'skew', 'kurt', 'std'] + param_names = ['method'] - def setup(self): - self.win = 100 - np.random.seed(1234) - self.arr = np.random.rand(1000000) - if (not have_real_test_parallel): + def setup(self, method): + if not have_real_test_parallel: + raise NotImplementedError + win = 100 + arr = np.random.rand(100000) + if hasattr(DataFrame, 'rolling'): + df = DataFrame(arr).rolling(win) + + @test_parallel(num_threads=2) + def parallel_rolling(): + getattr(df, method)() + self.parallel_rolling = parallel_rolling + elif have_rolling_methods: + rolling = {'median': rolling_median, + 'mean': rolling_mean, + 'min': rolling_min, + 'max': rolling_max, + 'var': rolling_var, + 'skew': rolling_skew, + 'kurt': rolling_kurt, + 'std': rolling_std} + + @test_parallel(num_threads=2) + def parallel_rolling(): + rolling[method](arr, win) + self.parallel_rolling = parallel_rolling + else: raise NotImplementedError - def time_nogil_rolling_mean(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_mean(arr, win) - run(self.arr, self.win) - - def time_nogil_rolling_min(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_min(arr, win) - run(self.arr, self.win) - - def time_nogil_rolling_max(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_max(arr, win) - run(self.arr, self.win) - - def time_nogil_rolling_var(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_var(arr, win) - run(self.arr, self.win) - - def time_nogil_rolling_skew(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_skew(arr, win) - run(self.arr, self.win) - - def time_nogil_rolling_kurt(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_kurt(arr, win) - run(self.arr, self.win) + def time_rolling(self, method): + self.parallel_rolling() - def time_nogil_rolling_std(self): - @test_parallel(num_threads=2) - def run(arr, win): - rolling_std(arr, win) - run(self.arr, self.win) +class ParallelReadCSV(BaseIO): -class nogil_read_csv(object): number = 1 repeat = 5 + params = ['float', 'object', 'datetime'] + param_names = ['dtype'] - def setup(self): - if (not have_real_test_parallel): + def setup(self, dtype): + if not have_real_test_parallel: raise NotImplementedError - # Using the values - self.df = DataFrame(np.random.randn(10000, 50)) - self.df.to_csv('__test__.csv') - - self.rng = date_range('1/1/2000', periods=10000) - self.df_date_time = DataFrame(np.random.randn(10000, 50), index=self.rng) - self.df_date_time.to_csv('__test_datetime__.csv') + rows = 10000 + cols = 50 + data = {'float': DataFrame(np.random.randn(rows, cols)), + 'datetime': DataFrame(np.random.randn(rows, cols), + index=date_range('1/1/2000', + periods=rows)), + 'object': DataFrame('foo', + index=range(rows), + columns=['object%03d'.format(i) + for i in range(5)])} + + self.fname = '__test_{}__.csv'.format(dtype) + df = data[dtype] + df.to_csv(self.fname) - self.df_object = DataFrame('foo', index=self.df.index, columns=self.create_cols('object')) - self.df_object.to_csv('__test_object__.csv') - - def create_cols(self, name): - return [('%s%03d' % (name, i)) for i in range(5)] - - @test_parallel(num_threads=2) - def pg_read_csv(self): - read_csv('__test__.csv', sep=',', header=None, float_precision=None) - - def time_read_csv(self): - self.pg_read_csv() - - @test_parallel(num_threads=2) - def pg_read_csv_object(self): - read_csv('__test_object__.csv', sep=',') - - def time_read_csv_object(self): - self.pg_read_csv_object() + @test_parallel(num_threads=2) + def parallel_read_csv(): + read_csv(self.fname) + self.parallel_read_csv = parallel_read_csv - @test_parallel(num_threads=2) - def pg_read_csv_datetime(self): - read_csv('__test_datetime__.csv', sep=',', header=None) + def time_read_csv(self, dtype): + self.parallel_read_csv() - def time_read_csv_datetime(self): - self.pg_read_csv_datetime() +class ParallelFactorize(object): -class nogil_factorize(object): number = 1 repeat = 5 + params = [2, 4, 8] + param_names = ['threads'] - def setup(self): - if (not have_real_test_parallel): + def setup(self, threads): + if not have_real_test_parallel: raise NotImplementedError - np.random.seed(1234) - self.strings = tm.makeStringIndex(100000) - - def factorize_strings(self): - pd.factorize(self.strings) - - @test_parallel(num_threads=4) - def _pg_factorize_strings_4(self): - self.factorize_strings() + strings = tm.makeStringIndex(100000) - def time_factorize_strings_4(self): - for i in range(2): - self._pg_factorize_strings_4() + @test_parallel(num_threads=threads) + def parallel(): + factorize(strings) + self.parallel = parallel - @test_parallel(num_threads=2) - def _pg_factorize_strings_2(self): - self.factorize_strings() + def loop(): + factorize(strings) + self.loop = loop - def time_factorize_strings_2(self): - for i in range(4): - self._pg_factorize_strings_2() + def time_parallel(self, threads): + self.parallel() - def time_factorize_strings(self): - for i in range(8): - self.factorize_strings() + def time_loop(self, threads): + for i in range(threads): + self.loop() diff --git a/asv_bench/benchmarks/groupby.py b/asv_bench/benchmarks/groupby.py index 13b5cd2b060322..b51b41614bc498 100644 --- a/asv_bench/benchmarks/groupby.py +++ b/asv_bench/benchmarks/groupby.py @@ -1,510 +1,410 @@ -from .pandas_vb_common import * -from string import ascii_letters, digits +import warnings +from string import ascii_letters from itertools import product +from functools import partial +import numpy as np +from pandas import (DataFrame, Series, MultiIndex, date_range, period_range, + TimeGrouper, Categorical, Timestamp) +import pandas.util.testing as tm -class groupby_agg_builtins(object): - goal_time = 0.2 - - def setup(self): - np.random.seed(27182) - self.n = 100000 - self.df = DataFrame(np.random.randint(1, (self.n / 100), (self.n, 3)), columns=['jim', 'joe', 'jolie']) +from .pandas_vb_common import setup # noqa - def time_groupby_agg_builtins1(self): - self.df.groupby('jim').agg([sum, min, max]) - def time_groupby_agg_builtins2(self): - self.df.groupby(['jim', 'joe']).agg([sum, min, max]) +method_blacklist = { + 'object': {'median', 'prod', 'sem', 'cumsum', 'sum', 'cummin', 'mean', + 'max', 'skew', 'cumprod', 'cummax', 'rank', 'pct_change', 'min', + 'var', 'mad', 'describe', 'std'}, + 'datetime': {'median', 'prod', 'sem', 'cumsum', 'sum', 'mean', 'skew', + 'cumprod', 'cummax', 'pct_change', 'var', 'mad', 'describe', + 'std'} +} -#---------------------------------------------------------------------- -# dict return values -class groupby_apply_dict_return(object): +class ApplyDictReturn(object): goal_time = 0.2 def setup(self): self.labels = np.arange(1000).repeat(10) - self.data = Series(randn(len(self.labels))) - self.f = (lambda x: {'first': x.values[0], 'last': x.values[(-1)], }) + self.data = Series(np.random.randn(len(self.labels))) def time_groupby_apply_dict_return(self): - self.data.groupby(self.labels).apply(self.f) - - -#---------------------------------------------------------------------- -# groups - -class Groups(object): - goal_time = 0.1 - - size = 2 ** 22 - data = { - 'int64_small': Series(np.random.randint(0, 100, size=size)), - 'int64_large' : Series(np.random.randint(0, 10000, size=size)), - 'object_small': Series(tm.makeStringIndex(100).take(np.random.randint(0, 100, size=size))), - 'object_large': Series(tm.makeStringIndex(10000).take(np.random.randint(0, 10000, size=size))) - } - - param_names = ['df'] - params = ['int64_small', 'int64_large', 'object_small', 'object_large'] + self.data.groupby(self.labels).apply(lambda x: {'first': x.values[0], + 'last': x.values[-1]}) - def setup(self, df): - self.df = self.data[df] - def time_groupby_groups(self, df): - self.df.groupby(self.df).groups +class Apply(object): - -#---------------------------------------------------------------------- -# First / last functions - -class FirstLast(object): goal_time = 0.2 - param_names = ['dtype'] - params = ['float32', 'float64', 'datetime', 'object'] + def setup_cache(self): + N = 10**4 + labels = np.random.randint(0, 2000, size=N) + labels2 = np.random.randint(0, 3, size=N) + df = DataFrame({'key': labels, + 'key2': labels2, + 'value1': np.random.randn(N), + 'value2': ['foo', 'bar', 'baz', 'qux'] * (N // 4) + }) + return df - # with datetimes (GH7555) + def time_scalar_function_multi_col(self, df): + df.groupby(['key', 'key2']).apply(lambda x: 1) - def setup(self, dtype): - - if dtype == 'datetime': - self.df = DataFrame( - {'values': date_range('1/1/2011', periods=100000, freq='s'), - 'key': range(100000),}) - elif dtype == 'object': - self.df = DataFrame( - {'values': (['foo'] * 100000), - 'key': range(100000)}) - else: - labels = np.arange(10000).repeat(10) - data = Series(randn(len(labels)), dtype=dtype) - data[::3] = np.nan - data[1::3] = np.nan - labels = labels.take(np.random.permutation(len(labels))) - self.df = DataFrame({'values': data, 'key': labels}) + def time_scalar_function_single_col(self, df): + df.groupby('key').apply(lambda x: 1) - def time_groupby_first(self, dtype): - self.df.groupby('key').first() - - def time_groupby_last(self, dtype): - self.df.groupby('key').last() + @staticmethod + def df_copy_function(g): + # ensure that the group name is available (see GH #15062) + g.name + return g.copy() - def time_groupby_nth_any(self, dtype): - self.df.groupby('key').nth(0, dropna='all') + def time_copy_function_multi_col(self, df): + df.groupby(['key', 'key2']).apply(self.df_copy_function) - def time_groupby_nth_none(self, dtype): - self.df.groupby('key').nth(0) + def time_copy_overhead_single_col(self, df): + df.groupby('key').apply(self.df_copy_function) -#---------------------------------------------------------------------- -# DataFrame Apply overhead +class Groups(object): -class groupby_frame_apply(object): goal_time = 0.2 - def setup(self): - self.N = 10000 - self.labels = np.random.randint(0, 2000, size=self.N) - self.labels2 = np.random.randint(0, 3, size=self.N) - self.df = DataFrame({ - 'key': self.labels, - 'key2': self.labels2, - 'value1': np.random.randn(self.N), - 'value2': (['foo', 'bar', 'baz', 'qux'] * (self.N // 4)), - }) - - @staticmethod - def scalar_function(g): - return 1 + param_names = ['key'] + params = ['int64_small', 'int64_large', 'object_small', 'object_large'] - def time_groupby_frame_apply_scalar_function(self): - self.df.groupby(['key', 'key2']).apply(self.scalar_function) + def setup_cache(self): + size = 10**6 + data = {'int64_small': Series(np.random.randint(0, 100, size=size)), + 'int64_large': Series(np.random.randint(0, 10000, size=size)), + 'object_small': Series( + tm.makeStringIndex(100).take( + np.random.randint(0, 100, size=size))), + 'object_large': Series( + tm.makeStringIndex(10000).take( + np.random.randint(0, 10000, size=size)))} + return data - def time_groupby_frame_apply_scalar_function_overhead(self): - self.df.groupby('key').apply(self.scalar_function) + def setup(self, data, key): + self.ser = data[key] - @staticmethod - def df_copy_function(g): - # ensure that the group name is available (see GH #15062) - g.name - return g.copy() + def time_series_groups(self, data, key): + self.ser.groupby(self.ser).groups - def time_groupby_frame_df_copy_function(self): - self.df.groupby(['key', 'key2']).apply(self.df_copy_function) - def time_groupby_frame_apply_df_copy_overhead(self): - self.df.groupby('key').apply(self.df_copy_function) +class GroupManyLabels(object): - -#---------------------------------------------------------------------- -# 2d grouping, aggregate many columns - -class groupby_frame_cython_many_columns(object): goal_time = 0.2 + params = [1, 1000] + param_names = ['ncols'] - def setup(self): - self.labels = np.random.randint(0, 100, size=1000) - self.df = DataFrame(randn(1000, 1000)) + def setup(self, ncols): + N = 1000 + data = np.random.randn(N, ncols) + self.labels = np.random.randint(0, 100, size=N) + self.df = DataFrame(data) - def time_sum(self): + def time_sum(self, ncols): self.df.groupby(self.labels).sum() -#---------------------------------------------------------------------- -# single key, long, integer key +class Nth(object): -class groupby_frame_singlekey_integer(object): goal_time = 0.2 - def setup(self): - self.data = np.random.randn(100000, 1) - self.labels = np.random.randint(0, 1000, size=100000) - self.df = DataFrame(self.data) - - def time_sum(self): - self.df.groupby(self.labels).sum() + param_names = ['dtype'] + params = ['float32', 'float64', 'datetime', 'object'] + def setup(self, dtype): + N = 10**5 + # with datetimes (GH7555) + if dtype == 'datetime': + values = date_range('1/1/2011', periods=N, freq='s') + elif dtype == 'object': + values = ['foo'] * N + else: + values = np.arange(N).astype(dtype) -#---------------------------------------------------------------------- -# DataFrame nth + key = np.arange(N) + self.df = DataFrame({'key': key, 'values': values}) + self.df.iloc[1, 1] = np.nan # insert missing data -class groupby_nth(object): - goal_time = 0.2 + def time_frame_nth_any(self, dtype): + self.df.groupby('key').nth(0, dropna='any') - def setup(self): - self.df = DataFrame(np.random.randint(1, 100, (10000, 2))) + def time_groupby_nth_all(self, dtype): + self.df.groupby('key').nth(0, dropna='all') - def time_groupby_frame_nth_any(self): - self.df.groupby(0).nth(0, dropna='any') + def time_frame_nth(self, dtype): + self.df.groupby('key').nth(0) - def time_groupby_frame_nth_none(self): - self.df.groupby(0).nth(0) + def time_series_nth_any(self, dtype): + self.df['values'].groupby(self.df['key']).nth(0, dropna='any') - def time_groupby_series_nth_any(self): - self.df[1].groupby(self.df[0]).nth(0, dropna='any') + def time_series_nth_all(self, dtype): + self.df['values'].groupby(self.df['key']).nth(0, dropna='all') - def time_groupby_series_nth_none(self): - self.df[1].groupby(self.df[0]).nth(0) + def time_series_nth(self, dtype): + self.df['values'].groupby(self.df['key']).nth(0) -#---------------------------------------------------------------------- -# groupby_indices replacement, chop up Series +class DateAttributes(object): -class groupby_indices(object): goal_time = 0.2 def setup(self): - try: - self.rng = date_range('1/1/2000', '12/31/2005', freq='H') - (self.year, self.month, self.day) = (self.rng.year, self.rng.month, self.rng.day) - except: - self.rng = date_range('1/1/2000', '12/31/2000', offset=datetools.Hour()) - self.year = self.rng.map((lambda x: x.year)) - self.month = self.rng.map((lambda x: x.month)) - self.day = self.rng.map((lambda x: x.day)) - self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) - - def time_groupby_indices(self): + rng = date_range('1/1/2000', '12/31/2005', freq='H') + self.year, self.month, self.day = rng.year, rng.month, rng.day + self.ts = Series(np.random.randn(len(rng)), index=rng) + + def time_len_groupby_object(self): len(self.ts.groupby([self.year, self.month, self.day])) -class groupby_int64_overflow(object): +class Int64(object): + goal_time = 0.2 def setup(self): - self.arr = np.random.randint(((-1) << 12), (1 << 12), ((1 << 17), 5)) - self.i = np.random.choice(len(self.arr), (len(self.arr) * 5)) - self.arr = np.vstack((self.arr, self.arr[self.i])) - self.i = np.random.permutation(len(self.arr)) - self.arr = self.arr[self.i] - self.df = DataFrame(self.arr, columns=list('abcde')) - (self.df['jim'], self.df['joe']) = (np.random.randn(2, len(self.df)) * 10) + arr = np.random.randint(-1 << 12, 1 << 12, (1 << 17, 5)) + i = np.random.choice(len(arr), len(arr) * 5) + arr = np.vstack((arr, arr[i])) + i = np.random.permutation(len(arr)) + arr = arr[i] + self.cols = list('abcde') + self.df = DataFrame(arr, columns=self.cols) + self.df['jim'], self.df['joe'] = np.random.randn(2, len(self.df)) * 10 - def time_groupby_int64_overflow(self): - self.df.groupby(list('abcde')).max() + def time_overflow(self): + self.df.groupby(self.cols).max() -#---------------------------------------------------------------------- -# count() speed +class CountMultiDtype(object): -class groupby_multi_count(object): goal_time = 0.2 - def setup(self): - self.n = 10000 - self.offsets = np.random.randint(self.n, size=self.n).astype('timedelta64[ns]') - self.dates = (np.datetime64('now') + self.offsets) - self.dates[(np.random.rand(self.n) > 0.5)] = np.datetime64('nat') - self.offsets[(np.random.rand(self.n) > 0.5)] = np.timedelta64('nat') - self.value2 = np.random.randn(self.n) - self.value2[(np.random.rand(self.n) > 0.5)] = np.nan - self.obj = np.random.choice(list('ab'), size=self.n).astype(object) - self.obj[(np.random.randn(self.n) > 0.5)] = np.nan - self.df = DataFrame({'key1': np.random.randint(0, 500, size=self.n), - 'key2': np.random.randint(0, 100, size=self.n), - 'dates': self.dates, - 'value2': self.value2, - 'value3': np.random.randn(self.n), - 'ints': np.random.randint(0, 1000, size=self.n), - 'obj': self.obj, - 'offsets': self.offsets, }) - - def time_groupby_multi_count(self): - self.df.groupby(['key1', 'key2']).count() - - -class groupby_int_count(object): - goal_time = 0.2 + def setup_cache(self): + n = 10000 + offsets = np.random.randint(n, size=n).astype('timedelta64[ns]') + dates = np.datetime64('now') + offsets + dates[np.random.rand(n) > 0.5] = np.datetime64('nat') + offsets[np.random.rand(n) > 0.5] = np.timedelta64('nat') + value2 = np.random.randn(n) + value2[np.random.rand(n) > 0.5] = np.nan + obj = np.random.choice(list('ab'), size=n).astype(object) + obj[np.random.randn(n) > 0.5] = np.nan + df = DataFrame({'key1': np.random.randint(0, 500, size=n), + 'key2': np.random.randint(0, 100, size=n), + 'dates': dates, + 'value2': value2, + 'value3': np.random.randn(n), + 'ints': np.random.randint(0, 1000, size=n), + 'obj': obj, + 'offsets': offsets}) + return df + + def time_multi_count(self, df): + df.groupby(['key1', 'key2']).count() + + +class CountMultiInt(object): - def setup(self): - self.n = 10000 - self.df = DataFrame({'key1': randint(0, 500, size=self.n), - 'key2': randint(0, 100, size=self.n), - 'ints': randint(0, 1000, size=self.n), - 'ints2': randint(0, 1000, size=self.n), }) + goal_time = 0.2 - def time_groupby_int_count(self): - self.df.groupby(['key1', 'key2']).count() + def setup_cache(self): + n = 10000 + df = DataFrame({'key1': np.random.randint(0, 500, size=n), + 'key2': np.random.randint(0, 100, size=n), + 'ints': np.random.randint(0, 1000, size=n), + 'ints2': np.random.randint(0, 1000, size=n)}) + return df + def time_multi_int_count(self, df): + df.groupby(['key1', 'key2']).count() -#---------------------------------------------------------------------- -# nunique() speed + def time_multi_int_nunique(self, df): + df.groupby(['key1', 'key2']).nunique() -class groupby_nunique(object): - def setup(self): - self.n = 10000 - self.df = DataFrame({'key1': randint(0, 500, size=self.n), - 'key2': randint(0, 100, size=self.n), - 'ints': randint(0, 1000, size=self.n), - 'ints2': randint(0, 1000, size=self.n), }) +class AggFunctions(object): - def time_groupby_nunique(self): - self.df.groupby(['key1', 'key2']).nunique() + goal_time = 0.2 + def setup_cache(): + N = 10**5 + fac1 = np.array(['A', 'B', 'C'], dtype='O') + fac2 = np.array(['one', 'two'], dtype='O') + df = DataFrame({'key1': fac1.take(np.random.randint(0, 3, size=N)), + 'key2': fac2.take(np.random.randint(0, 2, size=N)), + 'value1': np.random.randn(N), + 'value2': np.random.randn(N), + 'value3': np.random.randn(N)}) + return df -#---------------------------------------------------------------------- -# group with different functions per column + def time_different_str_functions(self, df): + df.groupby(['key1', 'key2']).agg({'value1': 'mean', + 'value2': 'var', + 'value3': 'sum'}) -class groupby_agg_multi(object): - goal_time = 0.2 + def time_different_numpy_functions(self, df): + df.groupby(['key1', 'key2']).agg({'value1': np.mean, + 'value2': np.var, + 'value3': np.sum}) - def setup(self): - self.fac1 = np.array(['A', 'B', 'C'], dtype='O') - self.fac2 = np.array(['one', 'two'], dtype='O') - self.df = DataFrame({'key1': self.fac1.take(np.random.randint(0, 3, size=100000)), 'key2': self.fac2.take(np.random.randint(0, 2, size=100000)), 'value1': np.random.randn(100000), 'value2': np.random.randn(100000), 'value3': np.random.randn(100000), }) + def time_different_python_functions_multicol(self, df): + df.groupby(['key1', 'key2']).agg([sum, min, max]) - def time_groupby_multi_different_functions(self): - self.df.groupby(['key1', 'key2']).agg({'value1': 'mean', 'value2': 'var', 'value3': 'sum'}) + def time_different_python_functions_singlecol(self, df): + df.groupby('key1').agg([sum, min, max]) - def time_groupby_multi_different_numpy_functions(self): - self.df.groupby(['key1', 'key2']).agg({'value1': np.mean, 'value2': np.var, 'value3': np.sum}) +class GroupStrings(object): -class groupby_multi_index(object): goal_time = 0.2 def setup(self): - self.n = (((5 * 7) * 11) * (1 << 9)) - self.alpha = list(map(''.join, product((ascii_letters + digits), repeat=4))) - self.f = (lambda k: np.repeat(np.random.choice(self.alpha, (self.n // k)), k)) - self.df = DataFrame({'a': self.f(11), 'b': self.f(7), 'c': self.f(5), 'd': self.f(1), }) + n = 2 * 10**5 + alpha = list(map(''.join, product(ascii_letters, repeat=4))) + data = np.random.choice(alpha, (n // 5, 4), replace=False) + data = np.repeat(data, 5, axis=0) + self.df = DataFrame(data, columns=list('abcd')) self.df['joe'] = (np.random.randn(len(self.df)) * 10).round(3) - self.i = np.random.permutation(len(self.df)) - self.df = self.df.iloc[self.i].reset_index(drop=True).copy() + self.df = self.df.sample(frac=1).reset_index(drop=True) - def time_groupby_multi_index(self): + def time_multi_columns(self): self.df.groupby(list('abcd')).max() -class groupby_multi(object): - goal_time = 0.2 - - def setup(self): - self.N = 100000 - self.ngroups = 100 - self.df = DataFrame({'key1': self.get_test_data(ngroups=self.ngroups), 'key2': self.get_test_data(ngroups=self.ngroups), 'data1': np.random.randn(self.N), 'data2': np.random.randn(self.N), }) - self.simple_series = Series(np.random.randn(self.N)) - self.key1 = self.df['key1'] - - def get_test_data(self, ngroups=100, n=100000): - self.unique_groups = range(self.ngroups) - self.arr = np.asarray(np.tile(self.unique_groups, int(n / self.ngroups)), dtype=object) - if (len(self.arr) < n): - self.arr = np.asarray((list(self.arr) + self.unique_groups[:(n - len(self.arr))]), dtype=object) - random.shuffle(self.arr) - return self.arr +class MultiColumn(object): - def f(self): - self.df.groupby(['key1', 'key2']).agg((lambda x: x.values.sum())) + goal_time = 0.2 - def time_groupby_multi_cython(self): - self.df.groupby(['key1', 'key2']).sum() + def setup_cache(self): + N = 10**5 + key1 = np.tile(np.arange(100, dtype=object), 1000) + key2 = key1.copy() + np.random.shuffle(key1) + np.random.shuffle(key2) + df = DataFrame({'key1': key1, + 'key2': key2, + 'data1': np.random.randn(N), + 'data2': np.random.randn(N)}) + return df - def time_groupby_multi_python(self): - self.df.groupby(['key1', 'key2'])['data1'].agg((lambda x: x.values.sum())) + def time_lambda_sum(self, df): + df.groupby(['key1', 'key2']).agg(lambda x: x.values.sum()) - def time_groupby_multi_series_op(self): - self.df.groupby(['key1', 'key2'])['data1'].agg(np.std) + def time_cython_sum(self, df): + df.groupby(['key1', 'key2']).sum() - def time_groupby_series_simple_cython(self): - self.simple_series.groupby(self.key1).sum() + def time_col_select_lambda_sum(self, df): + df.groupby(['key1', 'key2'])['data1'].agg(lambda x: x.values.sum()) - def time_groupby_series_simple_rank(self): - self.df.groupby('key1').rank(pct=True) + def time_col_select_numpy_sum(self, df): + df.groupby(['key1', 'key2'])['data1'].agg(np.sum) -#---------------------------------------------------------------------- -# size() speed +class Size(object): -class groupby_size(object): goal_time = 0.2 def setup(self): - self.n = 100000 - self.offsets = np.random.randint(self.n, size=self.n).astype('timedelta64[ns]') - self.dates = (np.datetime64('now') + self.offsets) - self.df = DataFrame({'key1': np.random.randint(0, 500, size=self.n), 'key2': np.random.randint(0, 100, size=self.n), 'value1': np.random.randn(self.n), 'value2': np.random.randn(self.n), 'value3': np.random.randn(self.n), 'dates': self.dates, }) - - N = 1000000 - self.draws = pd.Series(np.random.randn(N)) - labels = pd.Series(['foo', 'bar', 'baz', 'qux'] * (N // 4)) + n = 10**5 + offsets = np.random.randint(n, size=n).astype('timedelta64[ns]') + dates = np.datetime64('now') + offsets + self.df = DataFrame({'key1': np.random.randint(0, 500, size=n), + 'key2': np.random.randint(0, 100, size=n), + 'value1': np.random.randn(n), + 'value2': np.random.randn(n), + 'value3': np.random.randn(n), + 'dates': dates}) + self.draws = Series(np.random.randn(n)) + labels = Series(['foo', 'bar', 'baz', 'qux'] * (n // 4)) self.cats = labels.astype('category') - def time_groupby_multi_size(self): + def time_multi_size(self): self.df.groupby(['key1', 'key2']).size() - def time_groupby_dt_size(self): - self.df.groupby(['dates']).size() - - def time_groupby_dt_timegrouper_size(self): - self.df.groupby(TimeGrouper(key='dates', freq='M')).size() + def time_dt_timegrouper_size(self): + with warnings.catch_warnings(record=True): + self.df.groupby(TimeGrouper(key='dates', freq='M')).size() - def time_groupby_size(self): + def time_category_size(self): self.draws.groupby(self.cats).size() +class GroupByMethods(object): -#---------------------------------------------------------------------- -# groupby with a variable value for ngroups - -class GroupBySuite(object): goal_time = 0.2 - param_names = ['dtype', 'ngroups'] - params = [['int', 'float'], [100, 10000]] - - def setup(self, dtype, ngroups): - np.random.seed(1234) + param_names = ['dtype', 'method', 'application'] + params = [['int', 'float', 'object', 'datetime'], + ['all', 'any', 'bfill', 'count', 'cumcount', 'cummax', 'cummin', + 'cumprod', 'cumsum', 'describe', 'ffill', 'first', 'head', + 'last', 'mad', 'max', 'min', 'median', 'mean', 'nunique', + 'pct_change', 'prod', 'rank', 'sem', 'shift', 'size', 'skew', + 'std', 'sum', 'tail', 'unique', 'value_counts', 'var'], + ['direct', 'transformation']] + + def setup(self, dtype, method, application): + if method in method_blacklist.get(dtype, {}): + raise NotImplementedError # skip benchmark + ngroups = 1000 size = ngroups * 2 rng = np.arange(ngroups) values = rng.take(np.random.randint(0, ngroups, size=size)) if dtype == 'int': key = np.random.randint(0, size, size=size) - else: + elif dtype == 'float': key = np.concatenate([np.random.random(ngroups) * 0.1, np.random.random(ngroups) * 10.0]) + elif dtype == 'object': + key = ['foo'] * size + elif dtype == 'datetime': + key = date_range('1/1/2011', periods=size, freq='s') - self.df = DataFrame({'values': values, - 'key': key}) - - def time_all(self, dtype, ngroups): - self.df.groupby('key')['values'].all() - - def time_any(self, dtype, ngroups): - self.df.groupby('key')['values'].any() - - def time_count(self, dtype, ngroups): - self.df.groupby('key')['values'].count() - - def time_cumcount(self, dtype, ngroups): - self.df.groupby('key')['values'].cumcount() - - def time_cummax(self, dtype, ngroups): - self.df.groupby('key')['values'].cummax() - - def time_cummin(self, dtype, ngroups): - self.df.groupby('key')['values'].cummin() - - def time_cumprod(self, dtype, ngroups): - self.df.groupby('key')['values'].cumprod() - - def time_cumsum(self, dtype, ngroups): - self.df.groupby('key')['values'].cumsum() - - def time_describe(self, dtype, ngroups): - self.df.groupby('key')['values'].describe() - - def time_diff(self, dtype, ngroups): - self.df.groupby('key')['values'].diff() - - def time_first(self, dtype, ngroups): - self.df.groupby('key')['values'].first() - - def time_head(self, dtype, ngroups): - self.df.groupby('key')['values'].head() - - def time_last(self, dtype, ngroups): - self.df.groupby('key')['values'].last() - - def time_mad(self, dtype, ngroups): - self.df.groupby('key')['values'].mad() - - def time_max(self, dtype, ngroups): - self.df.groupby('key')['values'].max() - - def time_mean(self, dtype, ngroups): - self.df.groupby('key')['values'].mean() - - def time_median(self, dtype, ngroups): - self.df.groupby('key')['values'].median() - - def time_min(self, dtype, ngroups): - self.df.groupby('key')['values'].min() - - def time_nunique(self, dtype, ngroups): - self.df.groupby('key')['values'].nunique() - - def time_pct_change(self, dtype, ngroups): - self.df.groupby('key')['values'].pct_change() - - def time_prod(self, dtype, ngroups): - self.df.groupby('key')['values'].prod() - - def time_rank(self, dtype, ngroups): - self.df.groupby('key')['values'].rank() - - def time_sem(self, dtype, ngroups): - self.df.groupby('key')['values'].sem() - - def time_size(self, dtype, ngroups): - self.df.groupby('key')['values'].size() + df = DataFrame({'values': values, 'key': key}) - def time_skew(self, dtype, ngroups): - self.df.groupby('key')['values'].skew() + if application == 'transform': + if method == 'describe': + raise NotImplementedError - def time_std(self, dtype, ngroups): - self.df.groupby('key')['values'].std() + self.as_group_method = lambda: df.groupby( + 'key')['values'].transform(method) + self.as_field_method = lambda: df.groupby( + 'values')['key'].transform(method) + else: + self.as_group_method = getattr(df.groupby('key')['values'], method) + self.as_field_method = getattr(df.groupby('values')['key'], method) - def time_sum(self, dtype, ngroups): - self.df.groupby('key')['values'].sum() + def time_dtype_as_group(self, dtype, method, application): + self.as_group_method() - def time_tail(self, dtype, ngroups): - self.df.groupby('key')['values'].tail() + def time_dtype_as_field(self, dtype, method, application): + self.as_field_method() - def time_unique(self, dtype, ngroups): - self.df.groupby('key')['values'].unique() - def time_value_counts(self, dtype, ngroups): - self.df.groupby('key')['values'].value_counts() +class RankWithTies(object): + # GH 21237 + goal_time = 0.2 + param_names = ['dtype', 'tie_method'] + params = [['float64', 'float32', 'int64', 'datetime64'], + ['first', 'average', 'dense', 'min', 'max']] + + def setup(self, dtype, tie_method): + N = 10**4 + if dtype == 'datetime64': + data = np.array([Timestamp("2011/01/01")] * N, dtype=dtype) + else: + data = np.array([1] * N, dtype=dtype) + self.df = DataFrame({'values': data, 'key': ['foo'] * N}) - def time_var(self, dtype, ngroups): - self.df.groupby('key')['values'].var() + def time_rank_ties(self, dtype, tie_method): + self.df.groupby('key').rank(method=tie_method) -class groupby_float32(object): +class Float32(object): # GH 13335 goal_time = 0.2 @@ -515,27 +415,28 @@ def setup(self): arr = np.repeat(tmp, 10) self.df = DataFrame(dict(a=arr, b=arr)) - def time_groupby_sum(self): + def time_sum(self): self.df.groupby(['a'])['b'].sum() -class groupby_categorical(object): +class Categories(object): + goal_time = 0.2 def setup(self): - N = 100000 + N = 10**5 arr = np.random.random(N) - - self.df = DataFrame(dict( - a=Categorical(np.random.randint(10000, size=N)), - b=arr)) - self.df_ordered = DataFrame(dict( - a=Categorical(np.random.randint(10000, size=N), ordered=True), - b=arr)) - self.df_extra_cat = DataFrame(dict( - a=Categorical(np.random.randint(100, size=N), - categories=np.arange(10000)), - b=arr)) + data = {'a': Categorical(np.random.randint(10000, size=N)), + 'b': arr} + self.df = DataFrame(data) + data = {'a': Categorical(np.random.randint(10000, size=N), + ordered=True), + 'b': arr} + self.df_ordered = DataFrame(data) + data = {'a': Categorical(np.random.randint(100, size=N), + categories=np.arange(10000)), + 'b': arr} + self.df_extra_cat = DataFrame(data) def time_groupby_sort(self): self.df.groupby('a')['b'].count() @@ -556,130 +457,70 @@ def time_groupby_extra_cat_nosort(self): self.df_extra_cat.groupby('a', sort=False)['b'].count() -class groupby_period(object): +class Datelike(object): # GH 14338 goal_time = 0.2 - - def make_grouper(self, N): - return pd.period_range('1900-01-01', freq='D', periods=N) - - def setup(self): - N = 10000 - self.grouper = self.make_grouper(N) - self.df = pd.DataFrame(np.random.randn(N, 2)) - - def time_groupby_sum(self): + params = ['period_range', 'date_range', 'date_range_tz'] + param_names = ['grouper'] + + def setup(self, grouper): + N = 10**4 + rng_map = {'period_range': period_range, + 'date_range': date_range, + 'date_range_tz': partial(date_range, tz='US/Central')} + self.grouper = rng_map[grouper]('1900-01-01', freq='D', periods=N) + self.df = DataFrame(np.random.randn(10**4, 2)) + + def time_sum(self, grouper): self.df.groupby(self.grouper).sum() -class groupby_datetime(groupby_period): - def make_grouper(self, N): - return pd.date_range('1900-01-01', freq='D', periods=N) - - -class groupby_datetimetz(groupby_period): - def make_grouper(self, N): - return pd.date_range('1900-01-01', freq='D', periods=N, - tz='US/Central') - -#---------------------------------------------------------------------- -# Series.value_counts - -class series_value_counts(object): - goal_time = 0.2 - - def setup(self): - self.s = Series(np.random.randint(0, 1000, size=100000)) - self.s2 = self.s.astype(float) - - self.K = 1000 - self.N = 100000 - self.uniques = tm.makeStringIndex(self.K).values - self.s3 = Series(np.tile(self.uniques, (self.N // self.K))) - - def time_value_counts_int64(self): - self.s.value_counts() - - def time_value_counts_float64(self): - self.s2.value_counts() - - def time_value_counts_strings(self): - self.s.value_counts() - - -#---------------------------------------------------------------------- -# pivot_table - -class groupby_pivot_table(object): - goal_time = 0.2 - - def setup(self): - self.fac1 = np.array(['A', 'B', 'C'], dtype='O') - self.fac2 = np.array(['one', 'two'], dtype='O') - self.ind1 = np.random.randint(0, 3, size=100000) - self.ind2 = np.random.randint(0, 2, size=100000) - self.df = DataFrame({'key1': self.fac1.take(self.ind1), 'key2': self.fac2.take(self.ind2), 'key3': self.fac2.take(self.ind2), 'value1': np.random.randn(100000), 'value2': np.random.randn(100000), 'value3': np.random.randn(100000), }) - - def time_groupby_pivot_table(self): - self.df.pivot_table(index='key1', columns=['key2', 'key3']) - - -#---------------------------------------------------------------------- -# Sum booleans #2692 - -class groupby_sum_booleans(object): +class SumBools(object): + # GH 2692 goal_time = 0.2 def setup(self): - self.N = 500 - self.df = DataFrame({'ii': range(self.N), 'bb': [True for x in range(self.N)], }) + N = 500 + self.df = DataFrame({'ii': range(N), + 'bb': [True] * N}) def time_groupby_sum_booleans(self): self.df.groupby('ii').sum() -#---------------------------------------------------------------------- -# multi-indexed group sum #9049 - -class groupby_sum_multiindex(object): +class SumMultiLevel(object): + # GH 9049 goal_time = 0.2 + timeout = 120.0 def setup(self): - self.N = 50 - self.df = DataFrame({'A': (list(range(self.N)) * 2), 'B': list(range((self.N * 2))), 'C': 1, }).set_index(['A', 'B']) + N = 50 + self.df = DataFrame({'A': list(range(N)) * 2, + 'B': range(N * 2), + 'C': 1}).set_index(['A', 'B']) def time_groupby_sum_multiindex(self): self.df.groupby(level=[0, 1]).sum() -#------------------------------------------------------------------------------- -# Transform testing - class Transform(object): + goal_time = 0.2 def setup(self): n1 = 400 n2 = 250 - - index = MultiIndex( - levels=[np.arange(n1), pd.util.testing.makeStringIndex(n2)], - labels=[[i for i in range(n1) for _ in range(n2)], - (list(range(n2)) * n1)], - names=['lev1', 'lev2']) - - data = DataFrame(np.random.randn(n1 * n2, 3), - index=index, columns=['col1', 'col20', 'col3']) - step = int((n1 * n2 * 0.1)) - for col in range(len(data.columns)): - idx = col - while (idx < len(data)): - data.set_value(data.index[idx], data.columns[col], np.nan) - idx += step + index = MultiIndex(levels=[np.arange(n1), tm.makeStringIndex(n2)], + labels=[np.repeat(range(n1), n2).tolist(), + list(range(n2)) * n1], + names=['lev1', 'lev2']) + arr = np.random.randn(n1 * n2, 3) + arr[::10000, 0] = np.nan + arr[1::10000, 1] = np.nan + arr[2::10000, 2] = np.nan + data = DataFrame(arr, index=index, columns=['col1', 'col20', 'col3']) self.df = data - self.f_fillna = (lambda x: x.fillna(method='pad')) - np.random.seed(2718281) n = 20000 self.df1 = DataFrame(np.random.randint(1, n, (n, 3)), columns=['jim', 'joe', 'jolie']) @@ -691,10 +532,10 @@ def setup(self): self.df4 = self.df3.copy() self.df4['jim'] = self.df4['joe'] - def time_transform_func(self): - self.df.groupby(level='lev2').transform(self.f_fillna) + def time_transform_lambda_max(self): + self.df.groupby(level='lev1').transform(lambda x: max(x)) - def time_transform_ufunc(self): + def time_transform_ufunc_max(self): self.df.groupby(level='lev1').transform(np.max) def time_transform_multi_key1(self): @@ -710,63 +551,31 @@ def time_transform_multi_key4(self): self.df4.groupby(['jim', 'joe'])['jolie'].transform('max') +class TransformBools(object): - -np.random.seed(0) -N = 120000 -N_TRANSITIONS = 1400 -transition_points = np.random.permutation(np.arange(N))[:N_TRANSITIONS] -transition_points.sort() -transitions = np.zeros((N,), dtype=np.bool) -transitions[transition_points] = True -g = transitions.cumsum() -df = DataFrame({'signal': np.random.rand(N), }) - - - - - -class groupby_transform_series(object): goal_time = 0.2 def setup(self): - np.random.seed(0) N = 120000 transition_points = np.sort(np.random.choice(np.arange(N), 1400)) - transitions = np.zeros((N,), dtype=np.bool) + transitions = np.zeros(N, dtype=np.bool) transitions[transition_points] = True self.g = transitions.cumsum() self.df = DataFrame({'signal': np.random.rand(N)}) - def time_groupby_transform_series(self): + def time_transform_mean(self): self.df['signal'].groupby(self.g).transform(np.mean) -class groupby_transform_series2(object): +class TransformNaN(object): + # GH 12737 goal_time = 0.2 def setup(self): - np.random.seed(0) - self.df = DataFrame({'key': (np.arange(100000) // 3), - 'val': np.random.randn(100000)}) - - self.df_nans = pd.DataFrame({'key': np.repeat(np.arange(1000), 10), - 'B': np.nan, - 'C': np.nan}) - self.df_nans.ix[4::10, 'B':'C'] = 5 - - def time_transform_series2(self): - self.df.groupby('key')['val'].transform(np.mean) - - def time_cumprod(self): - self.df.groupby('key').cumprod() - - def time_cumsum(self): - self.df.groupby('key').cumsum() - - def time_shift(self): - self.df.groupby('key').shift() + self.df_nans = DataFrame({'key': np.repeat(np.arange(1000), 10), + 'B': np.nan, + 'C': np.nan}) + self.df_nans.loc[4::10, 'B':'C'] = 5 - def time_transform_dataframe(self): - # GH 12737 + def time_first(self): self.df_nans.groupby('key').transform('first') diff --git a/asv_bench/benchmarks/hdfstore_bench.py b/asv_bench/benchmarks/hdfstore_bench.py deleted file mode 100644 index 7d490180e8af6e..00000000000000 --- a/asv_bench/benchmarks/hdfstore_bench.py +++ /dev/null @@ -1,129 +0,0 @@ -from .pandas_vb_common import * -import os - - -class HDF5(object): - goal_time = 0.2 - - def setup(self): - self.index = tm.makeStringIndex(25000) - self.df = DataFrame({'float1': randn(25000), 'float2': randn(25000),}, - index=self.index) - - self.df_mixed = DataFrame( - {'float1': randn(25000), 'float2': randn(25000), - 'string1': (['foo'] * 25000), - 'bool1': ([True] * 25000), - 'int1': np.random.randint(0, 250000, size=25000),}, - index=self.index) - - self.df_wide = DataFrame(np.random.randn(25000, 100)) - - self.df2 = DataFrame({'float1': randn(25000), 'float2': randn(25000)}, - index=date_range('1/1/2000', periods=25000)) - self.df_wide2 = DataFrame(np.random.randn(25000, 100), - index=date_range('1/1/2000', periods=25000)) - - self.df_dc = DataFrame(np.random.randn(10000, 10), - columns=[('C%03d' % i) for i in range(10)]) - - self.f = '__test__.h5' - self.remove(self.f) - - self.store = HDFStore(self.f) - self.store.put('fixed', self.df) - self.store.put('fixed_mixed', self.df_mixed) - self.store.append('table', self.df2) - self.store.append('table_mixed', self.df_mixed) - self.store.append('table_wide', self.df_wide) - self.store.append('table_wide2', self.df_wide2) - - def teardown(self): - self.store.close() - - def remove(self, f): - try: - os.remove(self.f) - except: - pass - - def time_read_store(self): - self.store.get('fixed') - - def time_read_store_mixed(self): - self.store.get('fixed_mixed') - - def time_write_store(self): - self.store.put('fixed_write', self.df) - - def time_write_store_mixed(self): - self.store.put('fixed_mixed_write', self.df_mixed) - - def time_read_store_table_mixed(self): - self.store.select('table_mixed') - - def time_write_store_table_mixed(self): - self.store.append('table_mixed_write', self.df_mixed) - - def time_read_store_table(self): - self.store.select('table') - - def time_write_store_table(self): - self.store.append('table_write', self.df) - - def time_read_store_table_wide(self): - self.store.select('table_wide') - - def time_write_store_table_wide(self): - self.store.append('table_wide_write', self.df_wide) - - def time_write_store_table_dc(self): - self.store.append('table_dc_write', self.df_dc, data_columns=True) - - def time_query_store_table_wide(self): - start = self.df_wide2.index[10000] - stop = self.df_wide2.index[15000] - self.store.select('table_wide', where="index > start and index < stop") - - def time_query_store_table(self): - start = self.df2.index[10000] - stop = self.df2.index[15000] - self.store.select('table', where="index > start and index < stop") - - def time_store_repr(self): - repr(self.store) - - def time_store_str(self): - str(self.store) - - def time_store_info(self): - self.store.info() - - -class HDF5Panel(object): - goal_time = 0.2 - - def setup(self): - self.f = '__test__.h5' - self.p = Panel(randn(20, 1000, 25), - items=[('Item%03d' % i) for i in range(20)], - major_axis=date_range('1/1/2000', periods=1000), - minor_axis=[('E%03d' % i) for i in range(25)]) - self.remove(self.f) - self.store = HDFStore(self.f) - self.store.append('p1', self.p) - - def teardown(self): - self.store.close() - - def remove(self, f): - try: - os.remove(self.f) - except: - pass - - def time_read_store_table_panel(self): - self.store.select('p1') - - def time_write_store_table_panel(self): - self.store.append('p2', self.p) diff --git a/asv_bench/benchmarks/index_object.py b/asv_bench/benchmarks/index_object.py index 7697c3b9d3840c..f1703e163917ac 100644 --- a/asv_bench/benchmarks/index_object.py +++ b/asv_bench/benchmarks/index_object.py @@ -1,240 +1,194 @@ -from .pandas_vb_common import * +import numpy as np +import pandas.util.testing as tm +from pandas import (Series, date_range, DatetimeIndex, Index, RangeIndex, + Float64Index) + +from .pandas_vb_common import setup # noqa class SetOperations(object): - goal_time = 0.2 - def setup(self): - self.rng = date_range('1/1/2000', periods=10000, freq='T') - self.rng2 = self.rng[:(-1)] + goal_time = 0.2 + params = (['datetime', 'date_string', 'int', 'strings'], + ['intersection', 'union', 'symmetric_difference']) + param_names = ['dtype', 'method'] + + def setup(self, dtype, method): + N = 10**5 + dates_left = date_range('1/1/2000', periods=N, freq='T') + fmt = '%Y-%m-%d %H:%M:%S' + date_str_left = Index(dates_left.strftime(fmt)) + int_left = Index(np.arange(N)) + str_left = tm.makeStringIndex(N) + data = {'datetime': {'left': dates_left, 'right': dates_left[:-1]}, + 'date_string': {'left': date_str_left, + 'right': date_str_left[:-1]}, + 'int': {'left': int_left, 'right': int_left[:-1]}, + 'strings': {'left': str_left, 'right': str_left[:-1]}} + self.left = data[dtype]['left'] + self.right = data[dtype]['right'] + + def time_operation(self, dtype, method): + getattr(self.left, method)(self.right) + + +class SetDisjoint(object): - # object index with datetime values - if (self.rng.dtype == object): - self.idx_rng = self.rng.view(Index) - else: - self.idx_rng = self.rng.asobject - self.idx_rng2 = self.idx_rng[:(-1)] + goal_time = 0.2 - # other datetime - N = 100000 - A = N - 20000 + def setup(self): + N = 10**5 B = N + 20000 - self.dtidx1 = DatetimeIndex(range(N)) - self.dtidx2 = DatetimeIndex(range(A, B)) - self.dtidx3 = DatetimeIndex(range(N, B)) - - # integer - self.N = 1000000 - self.options = np.arange(self.N) - self.left = Index( - self.options.take(np.random.permutation(self.N)[:(self.N // 2)])) - self.right = Index( - self.options.take(np.random.permutation(self.N)[:(self.N // 2)])) - - # strings - N = 10000 - strs = tm.rands_array(10, N) - self.leftstr = Index(strs[:N * 2 // 3]) - self.rightstr = Index(strs[N // 3:]) - - def time_datetime_intersection(self): - self.rng.intersection(self.rng2) - - def time_datetime_union(self): - self.rng.union(self.rng2) - - def time_datetime_difference(self): - self.dtidx1.difference(self.dtidx2) + self.datetime_left = DatetimeIndex(range(N)) + self.datetime_right = DatetimeIndex(range(N, B)) def time_datetime_difference_disjoint(self): - self.dtidx1.difference(self.dtidx3) - - def time_datetime_symmetric_difference(self): - self.dtidx1.symmetric_difference(self.dtidx2) - - def time_index_datetime_intersection(self): - self.idx_rng.intersection(self.idx_rng2) - - def time_index_datetime_union(self): - self.idx_rng.union(self.idx_rng2) - - def time_int64_intersection(self): - self.left.intersection(self.right) - - def time_int64_union(self): - self.left.union(self.right) - - def time_int64_difference(self): - self.left.difference(self.right) - - def time_int64_symmetric_difference(self): - self.left.symmetric_difference(self.right) - - def time_str_difference(self): - self.leftstr.difference(self.rightstr) - - def time_str_symmetric_difference(self): - self.leftstr.symmetric_difference(self.rightstr) + self.datetime_left.difference(self.datetime_right) class Datetime(object): + goal_time = 0.2 def setup(self): - self.dr = pd.date_range('20000101', freq='D', periods=10000) + self.dr = date_range('20000101', freq='D', periods=10000) def time_is_dates_only(self): self.dr._is_dates_only -class Float64(object): - goal_time = 0.2 +class Ops(object): - def setup(self): - self.idx = tm.makeFloatIndex(1000000) - self.mask = ((np.arange(self.idx.size) % 3) == 0) - self.series_mask = Series(self.mask) + sample_time = 0.2 + params = ['float', 'int'] + param_names = ['dtype'] - self.baseidx = np.arange(1000000.0) + def setup(self, dtype): + N = 10**6 + indexes = {'int': 'makeIntIndex', 'float': 'makeFloatIndex'} + self.index = getattr(tm, indexes[dtype])(N) - def time_boolean_indexer(self): - self.idx[self.mask] + def time_add(self, dtype): + self.index + 2 - def time_boolean_series_indexer(self): - self.idx[self.series_mask] + def time_subtract(self, dtype): + self.index - 2 - def time_construct(self): - Index(self.baseidx) + def time_multiply(self, dtype): + self.index * 2 - def time_div(self): - (self.idx / 2) + def time_divide(self, dtype): + self.index / 2 - def time_get(self): - self.idx[1] - - def time_mul(self): - (self.idx * 2) + def time_modulo(self, dtype): + self.index % 2 - def time_slice_indexer_basic(self): - self.idx[:(-1)] - - def time_slice_indexer_even(self): - self.idx[::2] +class Range(object): -class StringIndex(object): goal_time = 0.2 def setup(self): - self.idx = tm.makeStringIndex(1000000) - self.mask = ((np.arange(1000000) % 3) == 0) - self.series_mask = Series(self.mask) - - def time_boolean_indexer(self): - self.idx[self.mask] - - def time_boolean_series_indexer(self): - self.idx[self.series_mask] - - def time_slice_indexer_basic(self): - self.idx[:(-1)] - - def time_slice_indexer_even(self): - self.idx[::2] - + self.idx_inc = RangeIndex(start=0, stop=10**7, step=3) + self.idx_dec = RangeIndex(start=10**7, stop=-1, step=-3) -class Multi1(object): - goal_time = 0.2 + def time_max(self): + self.idx_inc.max() - def setup(self): - (n, k) = (200, 5000) - self.levels = [np.arange(n), tm.makeStringIndex(n).values, (1000 + np.arange(n))] - self.labels = [np.random.choice(n, (k * n)) for lev in self.levels] - self.mi = MultiIndex(levels=self.levels, labels=self.labels) + def time_max_trivial(self): + self.idx_dec.max() - self.iterables = [tm.makeStringIndex(10000), range(20)] + def time_min(self): + self.idx_dec.min() - def time_duplicated(self): - self.mi.duplicated() + def time_min_trivial(self): + self.idx_inc.min() - def time_from_product(self): - MultiIndex.from_product(self.iterables) +class IndexAppend(object): -class Multi2(object): goal_time = 0.2 def setup(self): - self.n = ((((3 * 5) * 7) * 11) * (1 << 10)) - (low, high) = (((-1) << 12), (1 << 12)) - self.f = (lambda k: np.repeat(np.random.randint(low, high, (self.n // k)), k)) - self.i = np.random.permutation(self.n) - self.mi = MultiIndex.from_arrays([self.f(11), self.f(7), self.f(5), self.f(3), self.f(1)])[self.i] - self.a = np.repeat(np.arange(100), 1000) - self.b = np.tile(np.arange(1000), 100) - self.midx2 = MultiIndex.from_arrays([self.a, self.b]) - self.midx2 = self.midx2.take(np.random.permutation(np.arange(100000))) + N = 10000 + self.range_idx = RangeIndex(0, 100) + self.int_idx = self.range_idx.astype(int) + self.obj_idx = self.int_idx.astype(str) + self.range_idxs = [] + self.int_idxs = [] + self.object_idxs = [] + for i in range(1, N): + r_idx = RangeIndex(i * 100, (i + 1) * 100) + self.range_idxs.append(r_idx) + i_idx = r_idx.astype(int) + self.int_idxs.append(i_idx) + o_idx = i_idx.astype(str) + self.object_idxs.append(o_idx) - def time_sortlevel_int64(self): - self.mi.sortlevel() + def time_append_range_list(self): + self.range_idx.append(self.range_idxs) - def time_sortlevel_zero(self): - self.midx2.sortlevel(0) + def time_append_int_list(self): + self.int_idx.append(self.int_idxs) - def time_sortlevel_one(self): - self.midx2.sortlevel(1) + def time_append_obj_list(self): + self.obj_idx.append(self.object_idxs) -class Multi3(object): - goal_time = 0.2 - - def setup(self): - self.level1 = range(1000) - self.level2 = date_range(start='1/1/2012', periods=100) - self.mi = MultiIndex.from_product([self.level1, self.level2]) +class Indexing(object): - def time_datetime_level_values_full(self): - self.mi.copy().values + goal_time = 0.2 + params = ['String', 'Float', 'Int'] + param_names = ['dtype'] + + def setup(self, dtype): + N = 10**6 + self.idx = getattr(tm, 'make{}Index'.format(dtype))(N) + self.array_mask = (np.arange(N) % 3) == 0 + self.series_mask = Series(self.array_mask) + self.sorted = self.idx.sort_values() + half = N // 2 + self.non_unique = self.idx[:half].append(self.idx[:half]) + self.non_unique_sorted = self.sorted[:half].append(self.sorted[:half]) + self.key = self.sorted[N // 4] + + def time_boolean_array(self, dtype): + self.idx[self.array_mask] + + def time_boolean_series(self, dtype): + self.idx[self.series_mask] - def time_datetime_level_values_sliced(self): - self.mi[:10].values + def time_get(self, dtype): + self.idx[1] + def time_slice(self, dtype): + self.idx[:-1] -class Range(object): - goal_time = 0.2 - - def setup(self): - self.idx_inc = RangeIndex(start=0, stop=10**7, step=3) - self.idx_dec = RangeIndex(start=10**7, stop=-1, step=-3) + def time_slice_step(self, dtype): + self.idx[::2] - def time_max(self): - self.idx_inc.max() + def time_get_loc(self, dtype): + self.idx.get_loc(self.key) - def time_max_trivial(self): - self.idx_dec.max() + def time_get_loc_sorted(self, dtype): + self.sorted.get_loc(self.key) - def time_min(self): - self.idx_dec.min() + def time_get_loc_non_unique(self, dtype): + self.non_unique.get_loc(self.key) - def time_min_trivial(self): - self.idx_inc.min() + def time_get_loc_non_unique_sorted(self, dtype): + self.non_unique_sorted.get_loc(self.key) -class IndexOps(object): +class Float64IndexMethod(object): + # GH 13166 goal_time = 0.2 def setup(self): - N = 10000 - self.ridx = [RangeIndex(i * 100, (i + 1) * 100) for i in range(N)] - self.iidx = [idx.astype(int) for idx in self.ridx] - self.oidx = [idx.astype(str) for idx in self.iidx] - - def time_concat_range(self): - self.ridx[0].append(self.ridx[1:]) - - def time_concat_int(self): - self.iidx[0].append(self.iidx[1:]) + N = 100000 + a = np.arange(N) + self.ind = Float64Index(a * 4.8000000418824129e-08) - def time_concat_obj(self): - self.oidx[0].append(self.oidx[1:]) + def time_get_loc(self): + self.ind.get_loc(0) diff --git a/asv_bench/benchmarks/indexing.py b/asv_bench/benchmarks/indexing.py index f3e7ebbbd33e8c..739ad6a3d278b7 100644 --- a/asv_bench/benchmarks/indexing.py +++ b/asv_bench/benchmarks/indexing.py @@ -1,305 +1,354 @@ -from .pandas_vb_common import * +import warnings +import numpy as np +import pandas.util.testing as tm +from pandas import (Series, DataFrame, MultiIndex, Int64Index, Float64Index, + IntervalIndex, CategoricalIndex, + IndexSlice, concat, date_range) +from .pandas_vb_common import setup, Panel # noqa -class Int64Indexing(object): - goal_time = 0.2 - def setup(self): - self.s = Series(np.random.rand(1000000)) +class NumericSeriesIndexing(object): - def time_getitem_scalar(self): - self.s[800000] + goal_time = 0.2 + params = [Int64Index, Float64Index] + param = ['index'] - def time_getitem_slice(self): - self.s[:800000] + def setup(self, index): + N = 10**6 + idx = index(range(N)) + self.data = Series(np.random.rand(N), index=idx) + self.array = np.arange(10000) + self.array_list = self.array.tolist() - def time_getitem_list_like(self): - self.s[[800000]] + def time_getitem_scalar(self, index): + self.data[800000] - def time_getitem_array(self): - self.s[np.arange(10000)] + def time_getitem_slice(self, index): + self.data[:800000] - def time_getitem_lists(self): - self.s[np.arange(10000).tolist()] + def time_getitem_list_like(self, index): + self.data[[800000]] - def time_iloc_array(self): - self.s.iloc[np.arange(10000)] + def time_getitem_array(self, index): + self.data[self.array] - def time_iloc_list_like(self): - self.s.iloc[[800000]] + def time_getitem_lists(self, index): + self.data[self.array_list] - def time_iloc_scalar(self): - self.s.iloc[800000] + def time_iloc_array(self, index): + self.data.iloc[self.array] - def time_iloc_slice(self): - self.s.iloc[:800000] + def time_iloc_list_like(self, index): + self.data.iloc[[800000]] - def time_ix_array(self): - self.s.ix[np.arange(10000)] + def time_iloc_scalar(self, index): + self.data.iloc[800000] - def time_ix_list_like(self): - self.s.ix[[800000]] + def time_iloc_slice(self, index): + self.data.iloc[:800000] - def time_ix_scalar(self): - self.s.ix[800000] + def time_ix_array(self, index): + self.data.ix[self.array] - def time_ix_slice(self): - self.s.ix[:800000] + def time_ix_list_like(self, index): + self.data.ix[[800000]] - def time_loc_array(self): - self.s.loc[np.arange(10000)] + def time_ix_scalar(self, index): + self.data.ix[800000] - def time_loc_list_like(self): - self.s.loc[[800000]] + def time_ix_slice(self, index): + self.data.ix[:800000] - def time_loc_scalar(self): - self.s.loc[800000] + def time_loc_array(self, index): + self.data.loc[self.array] - def time_loc_slice(self): - self.s.loc[:800000] + def time_loc_list_like(self, index): + self.data.loc[[800000]] + def time_loc_scalar(self, index): + self.data.loc[800000] -class StringIndexing(object): - goal_time = 0.2 + def time_loc_slice(self, index): + self.data.loc[:800000] - def setup(self): - self.index = tm.makeStringIndex(1000000) - self.s = Series(np.random.rand(1000000), index=self.index) - self.lbl = self.s.index[800000] - - def time_getitem_label_slice(self): - self.s[:self.lbl] - def time_getitem_pos_slice(self): - self.s[:800000] +class NonNumericSeriesIndexing(object): - def time_get_value(self): - self.s.get_value(self.lbl) + goal_time = 0.2 + params = ['string', 'datetime'] + param_names = ['index'] + + def setup(self, index): + N = 10**5 + indexes = {'string': tm.makeStringIndex(N), + 'datetime': date_range('1900', periods=N, freq='s')} + index = indexes[index] + self.s = Series(np.random.rand(N), index=index) + self.lbl = index[80000] + + def time_getitem_label_slice(self, index): + self.s[:self.lbl] + def time_getitem_pos_slice(self, index): + self.s[:80000] -class DatetimeIndexing(object): - goal_time = 0.2 + def time_get_value(self, index): + with warnings.catch_warnings(record=True): + self.s.get_value(self.lbl) - def setup(self): - tm.N = 1000 - self.ts = tm.makeTimeSeries() - self.dt = self.ts.index[500] + def time_getitem_scalar(self, index): + self.s[self.lbl] - def time_getitem_scalar(self): - self.ts[self.dt] +class DataFrameStringIndexing(object): -class DataFrameIndexing(object): goal_time = 0.2 def setup(self): - self.index = tm.makeStringIndex(1000) - self.columns = tm.makeStringIndex(30) - self.df = DataFrame(np.random.randn(1000, 30), index=self.index, - columns=self.columns) - self.idx = self.index[100] - self.col = self.columns[10] - - self.df2 = DataFrame(np.random.randn(10000, 4), - columns=['A', 'B', 'C', 'D']) - self.indexer = (self.df2['B'] > 0) - self.obj_indexer = self.indexer.astype('O') - - # duptes - self.idx_dupe = (np.array(range(30)) * 99) - self.df3 = DataFrame({'A': ([0.1] * 1000), 'B': ([1] * 1000),}) - self.df3 = concat([self.df3, (2 * self.df3), (3 * self.df3)]) - - self.df_big = DataFrame(dict(A=(['foo'] * 1000000))) + index = tm.makeStringIndex(1000) + columns = tm.makeStringIndex(30) + self.df = DataFrame(np.random.randn(1000, 30), index=index, + columns=columns) + self.idx_scalar = index[100] + self.col_scalar = columns[10] + self.bool_indexer = self.df[self.col_scalar] > 0 + self.bool_obj_indexer = self.bool_indexer.astype(object) def time_get_value(self): - self.df.get_value(self.idx, self.col) + with warnings.catch_warnings(record=True): + self.df.get_value(self.idx_scalar, self.col_scalar) - def time_get_value_ix(self): - self.df.ix[(self.idx, self.col)] + def time_ix(self): + self.df.ix[self.idx_scalar, self.col_scalar] + + def time_loc(self): + self.df.loc[self.idx_scalar, self.col_scalar] def time_getitem_scalar(self): - self.df[self.col][self.idx] + self.df[self.col_scalar][self.idx_scalar] def time_boolean_rows(self): - self.df2[self.indexer] + self.df[self.bool_indexer] def time_boolean_rows_object(self): - self.df2[self.obj_indexer] - - def time_iloc_dups(self): - self.df3.iloc[self.idx_dupe] - - def time_loc_dups(self): - self.df3.loc[self.idx_dupe] + self.df[self.bool_obj_indexer] - def time_iloc_big(self): - self.df_big.iloc[:100, 0] +class DataFrameNumericIndexing(object): -class IndexingMethods(object): - # GH 13166 goal_time = 0.2 def setup(self): - a = np.arange(100000) - self.ind = pd.Float64Index(a * 4.8000000418824129e-08) + self.idx_dupe = np.array(range(30)) * 99 + self.df = DataFrame(np.random.randn(10000, 5)) + self.df_dup = concat([self.df, 2 * self.df, 3 * self.df]) + self.bool_indexer = [True] * 5000 + [False] * 5000 + + def time_iloc_dups(self): + self.df_dup.iloc[self.idx_dupe] + + def time_loc_dups(self): + self.df_dup.loc[self.idx_dupe] - self.s = Series(np.random.rand(100000)) - self.ts = Series(np.random.rand(100000), - index=date_range('2011-01-01', freq='S', periods=100000)) - self.indexer = ([True, False, True, True, False] * 20000) + def time_iloc(self): + self.df.iloc[:100, 0] - def time_get_loc_float(self): - self.ind.get_loc(0) + def time_loc(self): + self.df.loc[:100, 0] - def time_take_dtindex(self): - self.ts.take(self.indexer) + def time_bool_indexer(self): + self.df[self.bool_indexer] - def time_take_intindex(self): + +class Take(object): + + goal_time = 0.2 + params = ['int', 'datetime'] + param_names = ['index'] + + def setup(self, index): + N = 100000 + indexes = {'int': Int64Index(np.arange(N)), + 'datetime': date_range('2011-01-01', freq='S', periods=N)} + index = indexes[index] + self.s = Series(np.random.rand(N), index=index) + self.indexer = [True, False, True, True, False] * 20000 + + def time_take(self, index): self.s.take(self.indexer) class MultiIndexing(object): + goal_time = 0.2 def setup(self): - self.mi = MultiIndex.from_tuples([(x, y) for x in range(1000) for y in range(1000)]) - self.s = Series(np.random.randn(1000000), index=self.mi) + mi = MultiIndex.from_product([range(1000), range(1000)]) + self.s = Series(np.random.randn(1000000), index=mi) self.df = DataFrame(self.s) - # slicers - np.random.seed(1234) - self.idx = pd.IndexSlice - self.n = 100000 - self.mdt = pandas.DataFrame() - self.mdt['A'] = np.random.choice(range(10000, 45000, 1000), self.n) - self.mdt['B'] = np.random.choice(range(10, 400), self.n) - self.mdt['C'] = np.random.choice(range(1, 150), self.n) - self.mdt['D'] = np.random.choice(range(10000, 45000), self.n) - self.mdt['x'] = np.random.choice(range(400), self.n) - self.mdt['y'] = np.random.choice(range(25), self.n) - self.test_A = 25000 - self.test_B = 25 - self.test_C = 40 - self.test_D = 35000 - self.eps_A = 5000 - self.eps_B = 5 - self.eps_C = 5 - self.eps_D = 5000 - self.mdt2 = self.mdt.set_index(['A', 'B', 'C', 'D']).sortlevel() - self.miint = MultiIndex.from_product( - [np.arange(1000), - np.arange(1000)], names=['one', 'two']) - - import string - - self.mi_large = MultiIndex.from_product( - [np.arange(1000), np.arange(20), list(string.ascii_letters)], - names=['one', 'two', 'three']) - self.mi_med = MultiIndex.from_product( - [np.arange(1000), np.arange(10), list('A')], - names=['one', 'two', 'three']) - self.mi_small = MultiIndex.from_product( - [np.arange(100), list('A'), list('A')], - names=['one', 'two', 'three']) - - rng = np.random.RandomState(4) - size = 1 << 16 - self.mi_unused_levels = pd.MultiIndex.from_arrays([ - rng.randint(0, 1 << 13, size), - rng.randint(0, 1 << 10, size)])[rng.rand(size) < 0.1] - - def time_series_xs_mi_ix(self): + n = 100000 + self.mdt = DataFrame({'A': np.random.choice(range(10000, 45000, 1000), + n), + 'B': np.random.choice(range(10, 400), n), + 'C': np.random.choice(range(1, 150), n), + 'D': np.random.choice(range(10000, 45000), n), + 'x': np.random.choice(range(400), n), + 'y': np.random.choice(range(25), n)}) + self.idx = IndexSlice[20000:30000, 20:30, 35:45, 30000:40000] + self.mdt = self.mdt.set_index(['A', 'B', 'C', 'D']).sort_index() + + def time_series_ix(self): self.s.ix[999] - def time_frame_xs_mi_ix(self): + def time_frame_ix(self): self.df.ix[999] - def time_multiindex_slicers(self): - self.mdt2.loc[self.idx[ - (self.test_A - self.eps_A):(self.test_A + self.eps_A), - (self.test_B - self.eps_B):(self.test_B + self.eps_B), - (self.test_C - self.eps_C):(self.test_C + self.eps_C), - (self.test_D - self.eps_D):(self.test_D + self.eps_D)], :] + def time_index_slice(self): + self.mdt.loc[self.idx, :] - def time_multiindex_get_indexer(self): - self.miint.get_indexer( - np.array([(0, 10), (0, 11), (0, 12), - (0, 13), (0, 14), (0, 15), - (0, 16), (0, 17), (0, 18), - (0, 19)], dtype=object)) - def time_multiindex_large_get_loc(self): - self.mi_large.get_loc((999, 19, 'Z')) +class IntervalIndexing(object): - def time_multiindex_large_get_loc_warm(self): - for _ in range(1000): - self.mi_large.get_loc((999, 19, 'Z')) + goal_time = 0.2 - def time_multiindex_med_get_loc(self): - self.mi_med.get_loc((999, 9, 'A')) + def setup_cache(self): + idx = IntervalIndex.from_breaks(np.arange(1000001)) + monotonic = Series(np.arange(1000000), index=idx) + return monotonic - def time_multiindex_med_get_loc_warm(self): - for _ in range(1000): - self.mi_med.get_loc((999, 9, 'A')) + def time_getitem_scalar(self, monotonic): + monotonic[80000] - def time_multiindex_string_get_loc(self): - self.mi_small.get_loc((99, 'A', 'A')) + def time_loc_scalar(self, monotonic): + monotonic.loc[80000] - def time_multiindex_small_get_loc_warm(self): - for _ in range(1000): - self.mi_small.get_loc((99, 'A', 'A')) + def time_getitem_list(self, monotonic): + monotonic[80000:] - def time_is_monotonic(self): - self.miint.is_monotonic + def time_loc_list(self, monotonic): + monotonic.loc[80000:] - def time_remove_unused_levels(self): - self.mi_unused_levels.remove_unused_levels() +class CategoricalIndexIndexing(object): -class IntervalIndexing(object): goal_time = 0.2 + params = ['monotonic_incr', 'monotonic_decr', 'non_monotonic'] + param_names = ['index'] - def setup(self): - self.monotonic = Series(np.arange(1000000), - index=IntervalIndex.from_breaks(np.arange(1000001))) + def setup(self, index): + N = 10**5 + values = list('a' * N + 'b' * N + 'c' * N) + indices = { + 'monotonic_incr': CategoricalIndex(values), + 'monotonic_decr': CategoricalIndex(reversed(values)), + 'non_monotonic': CategoricalIndex(list('abc' * N))} + self.data = indices[index] - def time_getitem_scalar(self): - self.monotonic[80000] + self.int_scalar = 10000 + self.int_list = list(range(10000)) + + self.cat_scalar = 'b' + self.cat_list = ['a', 'c'] + + def time_getitem_scalar(self, index): + self.data[self.int_scalar] + + def time_getitem_slice(self, index): + self.data[:self.int_scalar] - def time_loc_scalar(self): - self.monotonic.loc[80000] + def time_getitem_list_like(self, index): + self.data[[self.int_scalar]] - def time_getitem_list(self): - self.monotonic[80000:] + def time_getitem_list(self, index): + self.data[self.int_list] - def time_loc_list(self): - self.monotonic.loc[80000:] + def time_getitem_bool_array(self, index): + self.data[self.data == self.cat_scalar] + + def time_get_loc_scalar(self, index): + self.data.get_loc(self.cat_scalar) + + def time_get_indexer_list(self, index): + self.data.get_indexer(self.cat_list) class PanelIndexing(object): + goal_time = 0.2 def setup(self): - self.p = Panel(np.random.randn(100, 100, 100)) - self.inds = range(0, 100, 10) + with warnings.catch_warnings(record=True): + self.p = Panel(np.random.randn(100, 100, 100)) + self.inds = range(0, 100, 10) def time_subset(self): - self.p.ix[(self.inds, self.inds, self.inds)] + with warnings.catch_warnings(record=True): + self.p.ix[(self.inds, self.inds, self.inds)] + + +class MethodLookup(object): + + goal_time = 0.2 + + def setup_cache(self): + s = Series() + return s + + def time_lookup_iloc(self, s): + s.iloc + + def time_lookup_ix(self, s): + s.ix + + def time_lookup_loc(self, s): + s.loc + +class GetItemSingleColumn(object): -class IndexerLookup(object): goal_time = 0.2 def setup(self): - self.s = Series(range(10)) + self.df_string_col = DataFrame(np.random.randn(3000, 1), columns=['A']) + self.df_int_col = DataFrame(np.random.randn(3000, 1)) - def time_lookup_iloc(self): - self.s.iloc + def time_frame_getitem_single_column_label(self): + self.df_string_col['A'] - def time_lookup_ix(self): - self.s.ix + def time_frame_getitem_single_column_int(self): + self.df_int_col[0] - def time_lookup_loc(self): - self.s.loc + +class AssignTimeseriesIndex(object): + + goal_time = 0.2 + + def setup(self): + N = 100000 + idx = date_range('1/1/2000', periods=N, freq='H') + self.df = DataFrame(np.random.randn(N, 1), columns=['A'], index=idx) + + def time_frame_assign_timeseries_index(self): + self.df['date'] = self.df.index + + +class InsertColumns(object): + + goal_time = 0.2 + + def setup(self): + self.N = 10**3 + self.df = DataFrame(index=range(self.N)) + + def time_insert(self): + np.random.seed(1234) + for i in range(100): + self.df.insert(0, i, np.random.randn(self.N), + allow_duplicates=True) + + def time_assign_with_setitem(self): + np.random.seed(1234) + for i in range(100): + self.df[i] = np.random.randn(self.N) diff --git a/asv_bench/benchmarks/inference.py b/asv_bench/benchmarks/inference.py index dc1d6de73f8ae3..16d9e7cd73cbb1 100644 --- a/asv_bench/benchmarks/inference.py +++ b/asv_bench/benchmarks/inference.py @@ -1,77 +1,80 @@ -from .pandas_vb_common import * -import pandas as pd +import numpy as np +import pandas.util.testing as tm +from pandas import DataFrame, Series, to_numeric +from .pandas_vb_common import numeric_dtypes, lib, setup # noqa -class DtypeInfer(object): - goal_time = 0.2 +class NumericInferOps(object): # from GH 7332 + goal_time = 0.2 + params = numeric_dtypes + param_names = ['dtype'] + + def setup(self, dtype): + N = 5 * 10**5 + self.df = DataFrame({'A': np.arange(N).astype(dtype), + 'B': np.arange(N).astype(dtype)}) + + def time_add(self, dtype): + self.df['A'] + self.df['B'] + + def time_subtract(self, dtype): + self.df['A'] - self.df['B'] - def setup(self): - self.N = 500000 - self.df_int64 = DataFrame(dict(A=np.arange(self.N, dtype='int64'), - B=np.arange(self.N, dtype='int64'))) - self.df_int32 = DataFrame(dict(A=np.arange(self.N, dtype='int32'), - B=np.arange(self.N, dtype='int32'))) - self.df_uint32 = DataFrame(dict(A=np.arange(self.N, dtype='uint32'), - B=np.arange(self.N, dtype='uint32'))) - self.df_float64 = DataFrame(dict(A=np.arange(self.N, dtype='float64'), - B=np.arange(self.N, dtype='float64'))) - self.df_float32 = DataFrame(dict(A=np.arange(self.N, dtype='float32'), - B=np.arange(self.N, dtype='float32'))) - self.df_datetime64 = DataFrame(dict(A=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'), - B=pd.to_datetime(np.arange(self.N, dtype='int64'), unit='ms'))) - self.df_timedelta64 = DataFrame(dict(A=(self.df_datetime64['A'] - self.df_datetime64['B']), - B=self.df_datetime64['B'])) + def time_multiply(self, dtype): + self.df['A'] * self.df['B'] - def time_int64(self): - (self.df_int64['A'] + self.df_int64['B']) + def time_divide(self, dtype): + self.df['A'] / self.df['B'] - def time_int32(self): - (self.df_int32['A'] + self.df_int32['B']) + def time_modulo(self, dtype): + self.df['A'] % self.df['B'] - def time_uint32(self): - (self.df_uint32['A'] + self.df_uint32['B']) - def time_float64(self): - (self.df_float64['A'] + self.df_float64['B']) +class DateInferOps(object): + # from GH 7332 + goal_time = 0.2 + + def setup_cache(self): + N = 5 * 10**5 + df = DataFrame({'datetime64': np.arange(N).astype('datetime64[ms]')}) + df['timedelta'] = df['datetime64'] - df['datetime64'] + return df - def time_float32(self): - (self.df_float32['A'] + self.df_float32['B']) + def time_subtract_datetimes(self, df): + df['datetime64'] - df['datetime64'] - def time_datetime64(self): - (self.df_datetime64['A'] - self.df_datetime64['B']) + def time_timedelta_plus_datetime(self, df): + df['timedelta'] + df['datetime64'] - def time_timedelta64_1(self): - (self.df_timedelta64['A'] + self.df_timedelta64['B']) + def time_add_timedeltas(self, df): + df['timedelta'] + df['timedelta'] - def time_timedelta64_2(self): - (self.df_timedelta64['A'] + self.df_timedelta64['A']) +class ToNumeric(object): -class to_numeric(object): goal_time = 0.2 + params = ['ignore', 'coerce'] + param_names = ['errors'] - def setup(self): - self.n = 10000 - self.float = Series(np.random.randn(self.n * 100)) + def setup(self, errors): + N = 10000 + self.float = Series(np.random.randn(N)) self.numstr = self.float.astype('str') - self.str = Series(tm.makeStringIndex(self.n)) + self.str = Series(tm.makeStringIndex(N)) - def time_from_float(self): - pd.to_numeric(self.float) + def time_from_float(self, errors): + to_numeric(self.float, errors=errors) - def time_from_numeric_str(self): - pd.to_numeric(self.numstr) + def time_from_numeric_str(self, errors): + to_numeric(self.numstr, errors=errors) - def time_from_str_ignore(self): - pd.to_numeric(self.str, errors='ignore') + def time_from_str(self, errors): + to_numeric(self.str, errors=errors) - def time_from_str_coerce(self): - pd.to_numeric(self.str, errors='coerce') - -class to_numeric_downcast(object): +class ToNumericDowncast(object): param_names = ['dtype', 'downcast'] params = [['string-float', 'string-int', 'string-nint', 'datetime64', @@ -81,37 +84,30 @@ class to_numeric_downcast(object): N = 500000 N2 = int(N / 2) - data_dict = { - 'string-int': (['1'] * N2) + ([2] * N2), - 'string-nint': (['-1'] * N2) + ([2] * N2), - 'datetime64': np.repeat(np.array(['1970-01-01', '1970-01-02'], - dtype='datetime64[D]'), N), - 'string-float': (['1.1'] * N2) + ([2] * N2), - 'int-list': ([1] * N2) + ([2] * N2), - 'int32': np.repeat(np.int32(1), N) - } + data_dict = {'string-int': ['1'] * N2 + [2] * N2, + 'string-nint': ['-1'] * N2 + [2] * N2, + 'datetime64': np.repeat(np.array(['1970-01-01', '1970-01-02'], + dtype='datetime64[D]'), N), + 'string-float': ['1.1'] * N2 + [2] * N2, + 'int-list': [1] * N2 + [2] * N2, + 'int32': np.repeat(np.int32(1), N)} def setup(self, dtype, downcast): self.data = self.data_dict[dtype] def time_downcast(self, dtype, downcast): - pd.to_numeric(self.data, downcast=downcast) + to_numeric(self.data, downcast=downcast) class MaybeConvertNumeric(object): - def setup(self): - n = 1000000 - arr = np.repeat([2**63], n) - arr = arr + np.arange(n).astype('uint64') - arr = np.array([arr[i] if i%2 == 0 else - str(arr[i]) for i in range(n)], - dtype=object) - - arr[-1] = -1 - self.data = arr - self.na_values = set() - - def time_convert(self): - lib.maybe_convert_numeric(self.data, self.na_values, - coerce_numeric=False) + def setup_cache(self): + N = 10**6 + arr = np.repeat([2**63], N) + np.arange(N).astype('uint64') + data = arr.astype(object) + data[1::2] = arr[1::2].astype(str) + data[-1] = -1 + return data + + def time_convert(self, data): + lib.maybe_convert_numeric(data, set(), coerce_numeric=False) diff --git a/doc/sphinxext/ipython_sphinxext/__init__.py b/asv_bench/benchmarks/io/__init__.py similarity index 100% rename from doc/sphinxext/ipython_sphinxext/__init__.py rename to asv_bench/benchmarks/io/__init__.py diff --git a/asv_bench/benchmarks/io/csv.py b/asv_bench/benchmarks/io/csv.py new file mode 100644 index 00000000000000..2d4bdc7ae812a0 --- /dev/null +++ b/asv_bench/benchmarks/io/csv.py @@ -0,0 +1,229 @@ +import random +import timeit +import string + +import numpy as np +import pandas.util.testing as tm +from pandas import DataFrame, Categorical, date_range, read_csv +from pandas.compat import PY2 +from pandas.compat import cStringIO as StringIO + +from ..pandas_vb_common import setup, BaseIO # noqa + + +class ToCSV(BaseIO): + + goal_time = 0.2 + fname = '__test__.csv' + params = ['wide', 'long', 'mixed'] + param_names = ['kind'] + + def setup(self, kind): + wide_frame = DataFrame(np.random.randn(3000, 30)) + long_frame = DataFrame({'A': np.arange(50000), + 'B': np.arange(50000) + 1., + 'C': np.arange(50000) + 2., + 'D': np.arange(50000) + 3.}) + mixed_frame = DataFrame({'float': np.random.randn(5000), + 'int': np.random.randn(5000).astype(int), + 'bool': (np.arange(5000) % 2) == 0, + 'datetime': date_range('2001', + freq='s', + periods=5000), + 'object': ['foo'] * 5000}) + mixed_frame.loc[30:500, 'float'] = np.nan + data = {'wide': wide_frame, + 'long': long_frame, + 'mixed': mixed_frame} + self.df = data[kind] + + def time_frame(self, kind): + self.df.to_csv(self.fname) + + +class ToCSVDatetime(BaseIO): + + goal_time = 0.2 + fname = '__test__.csv' + + def setup(self): + rng = date_range('1/1/2000', periods=1000) + self.data = DataFrame(rng, index=rng) + + def time_frame_date_formatting(self): + self.data.to_csv(self.fname, date_format='%Y%m%d') + + +class StringIORewind(object): + + def data(self, stringio_object): + stringio_object.seek(0) + return stringio_object + + +class ReadCSVDInferDatetimeFormat(StringIORewind): + + goal_time = 0.2 + params = ([True, False], ['custom', 'iso8601', 'ymd']) + param_names = ['infer_datetime_format', 'format'] + + def setup(self, infer_datetime_format, format): + rng = date_range('1/1/2000', periods=1000) + formats = {'custom': '%m/%d/%Y %H:%M:%S.%f', + 'iso8601': '%Y-%m-%d %H:%M:%S', + 'ymd': '%Y%m%d'} + dt_format = formats[format] + self.StringIO_input = StringIO('\n'.join( + rng.strftime(dt_format).tolist())) + + def time_read_csv(self, infer_datetime_format, format): + read_csv(self.data(self.StringIO_input), + header=None, names=['foo'], parse_dates=['foo'], + infer_datetime_format=infer_datetime_format) + + +class ReadCSVSkipRows(BaseIO): + + goal_time = 0.2 + fname = '__test__.csv' + params = [None, 10000] + param_names = ['skiprows'] + + def setup(self, skiprows): + N = 20000 + index = tm.makeStringIndex(N) + df = DataFrame({'float1': np.random.randn(N), + 'float2': np.random.randn(N), + 'string1': ['foo'] * N, + 'bool1': [True] * N, + 'int1': np.random.randint(0, N, size=N)}, + index=index) + df.to_csv(self.fname) + + def time_skipprows(self, skiprows): + read_csv(self.fname, skiprows=skiprows) + + +class ReadUint64Integers(StringIORewind): + + goal_time = 0.2 + + def setup(self): + self.na_values = [2**63 + 500] + arr = np.arange(10000).astype('uint64') + 2**63 + self.data1 = StringIO('\n'.join(arr.astype(str).tolist())) + arr = arr.astype(object) + arr[500] = -1 + self.data2 = StringIO('\n'.join(arr.astype(str).tolist())) + + def time_read_uint64(self): + read_csv(self.data(self.data1), header=None, names=['foo']) + + def time_read_uint64_neg_values(self): + read_csv(self.data(self.data2), header=None, names=['foo']) + + def time_read_uint64_na_values(self): + read_csv(self.data(self.data1), header=None, names=['foo'], + na_values=self.na_values) + + +class ReadCSVThousands(BaseIO): + + goal_time = 0.2 + fname = '__test__.csv' + params = ([',', '|'], [None, ',']) + param_names = ['sep', 'thousands'] + + def setup(self, sep, thousands): + N = 10000 + K = 8 + data = np.random.randn(N, K) * np.random.randint(100, 10000, (N, K)) + df = DataFrame(data) + if thousands is not None: + fmt = ':{}'.format(thousands) + fmt = '{' + fmt + '}' + df = df.applymap(lambda x: fmt.format(x)) + df.to_csv(self.fname, sep=sep) + + def time_thousands(self, sep, thousands): + read_csv(self.fname, sep=sep, thousands=thousands) + + +class ReadCSVComment(StringIORewind): + + goal_time = 0.2 + + def setup(self): + data = ['A,B,C'] + (['1,2,3 # comment'] * 100000) + self.StringIO_input = StringIO('\n'.join(data)) + + def time_comment(self): + read_csv(self.data(self.StringIO_input), comment='#', + header=None, names=list('abc')) + + +class ReadCSVFloatPrecision(StringIORewind): + + goal_time = 0.2 + params = ([',', ';'], ['.', '_'], [None, 'high', 'round_trip']) + param_names = ['sep', 'decimal', 'float_precision'] + + def setup(self, sep, decimal, float_precision): + floats = [''.join(random.choice(string.digits) for _ in range(28)) + for _ in range(15)] + rows = sep.join(['0{}'.format(decimal) + '{}'] * 3) + '\n' + data = rows * 5 + data = data.format(*floats) * 200 # 1000 x 3 strings csv + self.StringIO_input = StringIO(data) + + def time_read_csv(self, sep, decimal, float_precision): + read_csv(self.data(self.StringIO_input), sep=sep, header=None, + names=list('abc'), float_precision=float_precision) + + def time_read_csv_python_engine(self, sep, decimal, float_precision): + read_csv(self.data(self.StringIO_input), sep=sep, header=None, engine='python', + float_precision=None, names=list('abc')) + + +class ReadCSVCategorical(BaseIO): + + goal_time = 0.2 + fname = '__test__.csv' + + def setup(self): + N = 100000 + group1 = ['aaaaaaaa', 'bbbbbbb', 'cccccccc', 'dddddddd', 'eeeeeeee'] + df = DataFrame(np.random.choice(group1, (N, 3)), columns=list('abc')) + df.to_csv(self.fname, index=False) + + def time_convert_post(self): + read_csv(self.fname).apply(Categorical) + + def time_convert_direct(self): + read_csv(self.fname, dtype='category') + + +class ReadCSVParseDates(StringIORewind): + + goal_time = 0.2 + + def setup(self): + data = """{},19:00:00,18:56:00,0.8100,2.8100,7.2000,0.0000,280.0000\n + {},20:00:00,19:56:00,0.0100,2.2100,7.2000,0.0000,260.0000\n + {},21:00:00,20:56:00,-0.5900,2.2100,5.7000,0.0000,280.0000\n + {},21:00:00,21:18:00,-0.9900,2.0100,3.6000,0.0000,270.0000\n + {},22:00:00,21:56:00,-0.5900,1.7100,5.1000,0.0000,290.0000\n + """ + two_cols = ['KORD,19990127'] * 5 + data = data.format(*two_cols) + self.StringIO_input = StringIO(data) + + def time_multiple_date(self): + read_csv(self.data(self.StringIO_input), sep=',', header=None, + names=list(string.digits[:9]), + parse_dates=[[1, 2], [1, 3]]) + + def time_baseline(self): + read_csv(self.data(self.StringIO_input), sep=',', header=None, + parse_dates=[1], + names=list(string.digits[:9])) diff --git a/asv_bench/benchmarks/io/excel.py b/asv_bench/benchmarks/io/excel.py new file mode 100644 index 00000000000000..58ab6bb8046c59 --- /dev/null +++ b/asv_bench/benchmarks/io/excel.py @@ -0,0 +1,36 @@ +import numpy as np +from pandas import DataFrame, date_range, ExcelWriter, read_excel +from pandas.compat import BytesIO +import pandas.util.testing as tm + +from ..pandas_vb_common import BaseIO, setup # noqa + + +class Excel(object): + + goal_time = 0.2 + params = ['openpyxl', 'xlsxwriter', 'xlwt'] + param_names = ['engine'] + + def setup(self, engine): + N = 2000 + C = 5 + self.df = DataFrame(np.random.randn(N, C), + columns=['float{}'.format(i) for i in range(C)], + index=date_range('20000101', periods=N, freq='H')) + self.df['object'] = tm.makeStringIndex(N) + self.bio_read = BytesIO() + self.writer_read = ExcelWriter(self.bio_read, engine=engine) + self.df.to_excel(self.writer_read, sheet_name='Sheet1') + self.writer_read.save() + self.bio_read.seek(0) + + def time_read_excel(self, engine): + read_excel(self.bio_read) + + def time_write_excel(self, engine): + bio_write = BytesIO() + bio_write.seek(0) + writer_write = ExcelWriter(bio_write, engine=engine) + self.df.to_excel(writer_write, sheet_name='Sheet1') + writer_write.save() diff --git a/asv_bench/benchmarks/io/hdf.py b/asv_bench/benchmarks/io/hdf.py new file mode 100644 index 00000000000000..4b6e1d69af92d7 --- /dev/null +++ b/asv_bench/benchmarks/io/hdf.py @@ -0,0 +1,151 @@ +import warnings + +import numpy as np +from pandas import DataFrame, Panel, date_range, HDFStore, read_hdf +import pandas.util.testing as tm + +from ..pandas_vb_common import BaseIO, setup # noqa + + +class HDFStoreDataFrame(BaseIO): + + goal_time = 0.2 + + def setup(self): + N = 25000 + index = tm.makeStringIndex(N) + self.df = DataFrame({'float1': np.random.randn(N), + 'float2': np.random.randn(N)}, + index=index) + self.df_mixed = DataFrame({'float1': np.random.randn(N), + 'float2': np.random.randn(N), + 'string1': ['foo'] * N, + 'bool1': [True] * N, + 'int1': np.random.randint(0, N, size=N)}, + index=index) + self.df_wide = DataFrame(np.random.randn(N, 100)) + self.start_wide = self.df_wide.index[10000] + self.stop_wide = self.df_wide.index[15000] + self.df2 = DataFrame({'float1': np.random.randn(N), + 'float2': np.random.randn(N)}, + index=date_range('1/1/2000', periods=N)) + self.start = self.df2.index[10000] + self.stop = self.df2.index[15000] + self.df_wide2 = DataFrame(np.random.randn(N, 100), + index=date_range('1/1/2000', periods=N)) + self.df_dc = DataFrame(np.random.randn(N, 10), + columns=['C%03d' % i for i in range(10)]) + + self.fname = '__test__.h5' + + self.store = HDFStore(self.fname) + self.store.put('fixed', self.df) + self.store.put('fixed_mixed', self.df_mixed) + self.store.append('table', self.df2) + self.store.append('table_mixed', self.df_mixed) + self.store.append('table_wide', self.df_wide) + self.store.append('table_wide2', self.df_wide2) + + def teardown(self): + self.store.close() + self.remove(self.fname) + + def time_read_store(self): + self.store.get('fixed') + + def time_read_store_mixed(self): + self.store.get('fixed_mixed') + + def time_write_store(self): + self.store.put('fixed_write', self.df) + + def time_write_store_mixed(self): + self.store.put('fixed_mixed_write', self.df_mixed) + + def time_read_store_table_mixed(self): + self.store.select('table_mixed') + + def time_write_store_table_mixed(self): + self.store.append('table_mixed_write', self.df_mixed) + + def time_read_store_table(self): + self.store.select('table') + + def time_write_store_table(self): + self.store.append('table_write', self.df) + + def time_read_store_table_wide(self): + self.store.select('table_wide') + + def time_write_store_table_wide(self): + self.store.append('table_wide_write', self.df_wide) + + def time_write_store_table_dc(self): + self.store.append('table_dc_write', self.df_dc, data_columns=True) + + def time_query_store_table_wide(self): + self.store.select('table_wide', where="index > self.start_wide and " + "index < self.stop_wide") + + def time_query_store_table(self): + self.store.select('table', where="index > self.start and " + "index < self.stop") + + def time_store_repr(self): + repr(self.store) + + def time_store_str(self): + str(self.store) + + def time_store_info(self): + self.store.info() + + +class HDFStorePanel(BaseIO): + + goal_time = 0.2 + + def setup(self): + self.fname = '__test__.h5' + with warnings.catch_warnings(record=True): + self.p = Panel(np.random.randn(20, 1000, 25), + items=['Item%03d' % i for i in range(20)], + major_axis=date_range('1/1/2000', periods=1000), + minor_axis=['E%03d' % i for i in range(25)]) + self.store = HDFStore(self.fname) + self.store.append('p1', self.p) + + def teardown(self): + self.store.close() + self.remove(self.fname) + + def time_read_store_table_panel(self): + with warnings.catch_warnings(record=True): + self.store.select('p1') + + def time_write_store_table_panel(self): + with warnings.catch_warnings(record=True): + self.store.append('p2', self.p) + + +class HDF(BaseIO): + + goal_time = 0.2 + params = ['table', 'fixed'] + param_names = ['format'] + + def setup(self, format): + self.fname = '__test__.h5' + N = 100000 + C = 5 + self.df = DataFrame(np.random.randn(N, C), + columns=['float{}'.format(i) for i in range(C)], + index=date_range('20000101', periods=N, freq='H')) + self.df['object'] = tm.makeStringIndex(N) + self.df.to_hdf(self.fname, 'df', format=format) + + def time_read_hdf(self, format): + read_hdf(self.fname, 'df') + + def time_write_hdf(self, format): + self.df.to_hdf(self.fname, 'df', format=format) diff --git a/asv_bench/benchmarks/io/json.py b/asv_bench/benchmarks/io/json.py new file mode 100644 index 00000000000000..acfdd327c3b518 --- /dev/null +++ b/asv_bench/benchmarks/io/json.py @@ -0,0 +1,127 @@ +import numpy as np +import pandas.util.testing as tm +from pandas import DataFrame, date_range, timedelta_range, concat, read_json + +from ..pandas_vb_common import setup, BaseIO # noqa + + +class ReadJSON(BaseIO): + + goal_time = 0.2 + fname = "__test__.json" + params = (['split', 'index', 'records'], ['int', 'datetime']) + param_names = ['orient', 'index'] + + def setup(self, orient, index): + N = 100000 + indexes = {'int': np.arange(N), + 'datetime': date_range('20000101', periods=N, freq='H')} + df = DataFrame(np.random.randn(N, 5), + columns=['float_{}'.format(i) for i in range(5)], + index=indexes[index]) + df.to_json(self.fname, orient=orient) + + def time_read_json(self, orient, index): + read_json(self.fname, orient=orient) + + +class ReadJSONLines(BaseIO): + + goal_time = 0.2 + fname = "__test_lines__.json" + params = ['int', 'datetime'] + param_names = ['index'] + + def setup(self, index): + N = 100000 + indexes = {'int': np.arange(N), + 'datetime': date_range('20000101', periods=N, freq='H')} + df = DataFrame(np.random.randn(N, 5), + columns=['float_{}'.format(i) for i in range(5)], + index=indexes[index]) + df.to_json(self.fname, orient='records', lines=True) + + def time_read_json_lines(self, index): + read_json(self.fname, orient='records', lines=True) + + def time_read_json_lines_concat(self, index): + concat(read_json(self.fname, orient='records', lines=True, + chunksize=25000)) + + def peakmem_read_json_lines(self, index): + read_json(self.fname, orient='records', lines=True) + + def peakmem_read_json_lines_concat(self, index): + concat(read_json(self.fname, orient='records', lines=True, + chunksize=25000)) + + +class ToJSON(BaseIO): + + goal_time = 0.2 + fname = "__test__.json" + params = ['split', 'columns', 'index'] + param_names = ['orient'] + + def setup(self, lines_orient): + N = 10**5 + ncols = 5 + index = date_range('20000101', periods=N, freq='H') + timedeltas = timedelta_range(start=1, periods=N, freq='s') + datetimes = date_range(start=1, periods=N, freq='s') + ints = np.random.randint(100000000, size=N) + floats = np.random.randn(N) + strings = tm.makeStringIndex(N) + self.df = DataFrame(np.random.randn(N, ncols), index=np.arange(N)) + self.df_date_idx = DataFrame(np.random.randn(N, ncols), index=index) + self.df_td_int_ts = DataFrame({'td_1': timedeltas, + 'td_2': timedeltas, + 'int_1': ints, + 'int_2': ints, + 'ts_1': datetimes, + 'ts_2': datetimes}, + index=index) + self.df_int_floats = DataFrame({'int_1': ints, + 'int_2': ints, + 'int_3': ints, + 'float_1': floats, + 'float_2': floats, + 'float_3': floats}, + index=index) + self.df_int_float_str = DataFrame({'int_1': ints, + 'int_2': ints, + 'float_1': floats, + 'float_2': floats, + 'str_1': strings, + 'str_2': strings}, + index=index) + + def time_floats_with_int_index(self, orient): + self.df.to_json(self.fname, orient=orient) + + def time_floats_with_dt_index(self, orient): + self.df_date_idx.to_json(self.fname, orient=orient) + + def time_delta_int_tstamp(self, orient): + self.df_td_int_ts.to_json(self.fname, orient=orient) + + def time_float_int(self, orient): + self.df_int_floats.to_json(self.fname, orient=orient) + + def time_float_int_str(self, orient): + self.df_int_float_str.to_json(self.fname, orient=orient) + + def time_floats_with_int_idex_lines(self, orient): + self.df.to_json(self.fname, orient='records', lines=True) + + def time_floats_with_dt_index_lines(self, orient): + self.df_date_idx.to_json(self.fname, orient='records', lines=True) + + def time_delta_int_tstamp_lines(self, orient): + self.df_td_int_ts.to_json(self.fname, orient='records', lines=True) + + def time_float_int_lines(self, orient): + self.df_int_floats.to_json(self.fname, orient='records', lines=True) + + def time_float_int_str_lines(self, orient): + self.df_int_float_str.to_json(self.fname, orient='records', lines=True) diff --git a/asv_bench/benchmarks/io/msgpack.py b/asv_bench/benchmarks/io/msgpack.py new file mode 100644 index 00000000000000..8ccce01117ca40 --- /dev/null +++ b/asv_bench/benchmarks/io/msgpack.py @@ -0,0 +1,26 @@ +import numpy as np +from pandas import DataFrame, date_range, read_msgpack +import pandas.util.testing as tm + +from ..pandas_vb_common import BaseIO, setup # noqa + + +class MSGPack(BaseIO): + + goal_time = 0.2 + + def setup(self): + self.fname = '__test__.msg' + N = 100000 + C = 5 + self.df = DataFrame(np.random.randn(N, C), + columns=['float{}'.format(i) for i in range(C)], + index=date_range('20000101', periods=N, freq='H')) + self.df['object'] = tm.makeStringIndex(N) + self.df.to_msgpack(self.fname) + + def time_read_msgpack(self): + read_msgpack(self.fname) + + def time_write_msgpack(self): + self.df.to_msgpack(self.fname) diff --git a/asv_bench/benchmarks/io/pickle.py b/asv_bench/benchmarks/io/pickle.py new file mode 100644 index 00000000000000..2ad0fcca6eb26e --- /dev/null +++ b/asv_bench/benchmarks/io/pickle.py @@ -0,0 +1,26 @@ +import numpy as np +from pandas import DataFrame, date_range, read_pickle +import pandas.util.testing as tm + +from ..pandas_vb_common import BaseIO, setup # noqa + + +class Pickle(BaseIO): + + goal_time = 0.2 + + def setup(self): + self.fname = '__test__.pkl' + N = 100000 + C = 5 + self.df = DataFrame(np.random.randn(N, C), + columns=['float{}'.format(i) for i in range(C)], + index=date_range('20000101', periods=N, freq='H')) + self.df['object'] = tm.makeStringIndex(N) + self.df.to_pickle(self.fname) + + def time_read_pickle(self): + read_pickle(self.fname) + + def time_write_pickle(self): + self.df.to_pickle(self.fname) diff --git a/asv_bench/benchmarks/io/sas.py b/asv_bench/benchmarks/io/sas.py new file mode 100644 index 00000000000000..526c524de7fff7 --- /dev/null +++ b/asv_bench/benchmarks/io/sas.py @@ -0,0 +1,21 @@ +import os + +from pandas import read_sas + + +class SAS(object): + + goal_time = 0.2 + params = ['sas7bdat', 'xport'] + param_names = ['format'] + + def setup(self, format): + # Read files that are located in 'pandas/io/tests/sas/data' + files = {'sas7bdat': 'test1.sas7bdat', 'xport': 'paxraw_d_short.xpt'} + file = files[format] + paths = [os.path.dirname(__file__), '..', '..', '..', 'pandas', + 'tests', 'io', 'sas', 'data', file] + self.f = os.path.join(*paths) + + def time_read_msgpack(self, format): + read_sas(self.f, format=format) diff --git a/asv_bench/benchmarks/io/sql.py b/asv_bench/benchmarks/io/sql.py new file mode 100644 index 00000000000000..ef4e501e5f3b96 --- /dev/null +++ b/asv_bench/benchmarks/io/sql.py @@ -0,0 +1,132 @@ +import sqlite3 + +import numpy as np +import pandas.util.testing as tm +from pandas import DataFrame, date_range, read_sql_query, read_sql_table +from sqlalchemy import create_engine + +from ..pandas_vb_common import setup # noqa + + +class SQL(object): + + goal_time = 0.2 + params = ['sqlalchemy', 'sqlite'] + param_names = ['connection'] + + def setup(self, connection): + N = 10000 + con = {'sqlalchemy': create_engine('sqlite:///:memory:'), + 'sqlite': sqlite3.connect(':memory:')} + self.table_name = 'test_type' + self.query_all = 'SELECT * FROM {}'.format(self.table_name) + self.con = con[connection] + self.df = DataFrame({'float': np.random.randn(N), + 'float_with_nan': np.random.randn(N), + 'string': ['foo'] * N, + 'bool': [True] * N, + 'int': np.random.randint(0, N, size=N), + 'datetime': date_range('2000-01-01', + periods=N, + freq='s')}, + index=tm.makeStringIndex(N)) + self.df.loc[1000:3000, 'float_with_nan'] = np.nan + self.df['datetime_string'] = self.df['datetime'].astype(str) + self.df.to_sql(self.table_name, self.con, if_exists='replace') + + def time_to_sql_dataframe(self, connection): + self.df.to_sql('test1', self.con, if_exists='replace') + + def time_read_sql_query(self, connection): + read_sql_query(self.query_all, self.con) + + +class WriteSQLDtypes(object): + + goal_time = 0.2 + params = (['sqlalchemy', 'sqlite'], + ['float', 'float_with_nan', 'string', 'bool', 'int', 'datetime']) + param_names = ['connection', 'dtype'] + + def setup(self, connection, dtype): + N = 10000 + con = {'sqlalchemy': create_engine('sqlite:///:memory:'), + 'sqlite': sqlite3.connect(':memory:')} + self.table_name = 'test_type' + self.query_col = 'SELECT {} FROM {}'.format(dtype, self.table_name) + self.con = con[connection] + self.df = DataFrame({'float': np.random.randn(N), + 'float_with_nan': np.random.randn(N), + 'string': ['foo'] * N, + 'bool': [True] * N, + 'int': np.random.randint(0, N, size=N), + 'datetime': date_range('2000-01-01', + periods=N, + freq='s')}, + index=tm.makeStringIndex(N)) + self.df.loc[1000:3000, 'float_with_nan'] = np.nan + self.df['datetime_string'] = self.df['datetime'].astype(str) + self.df.to_sql(self.table_name, self.con, if_exists='replace') + + def time_to_sql_dataframe_column(self, connection, dtype): + self.df[[dtype]].to_sql('test1', self.con, if_exists='replace') + + def time_read_sql_query_select_column(self, connection, dtype): + read_sql_query(self.query_col, self.con) + + +class ReadSQLTable(object): + + goal_time = 0.2 + + def setup(self): + N = 10000 + self.table_name = 'test' + self.con = create_engine('sqlite:///:memory:') + self.df = DataFrame({'float': np.random.randn(N), + 'float_with_nan': np.random.randn(N), + 'string': ['foo'] * N, + 'bool': [True] * N, + 'int': np.random.randint(0, N, size=N), + 'datetime': date_range('2000-01-01', + periods=N, + freq='s')}, + index=tm.makeStringIndex(N)) + self.df.loc[1000:3000, 'float_with_nan'] = np.nan + self.df['datetime_string'] = self.df['datetime'].astype(str) + self.df.to_sql(self.table_name, self.con, if_exists='replace') + + def time_read_sql_table_all(self): + read_sql_table(self.table_name, self.con) + + def time_read_sql_table_parse_dates(self): + read_sql_table(self.table_name, self.con, columns=['datetime_string'], + parse_dates=['datetime_string']) + + +class ReadSQLTableDtypes(object): + + goal_time = 0.2 + + params = ['float', 'float_with_nan', 'string', 'bool', 'int', 'datetime'] + param_names = ['dtype'] + + def setup(self, dtype): + N = 10000 + self.table_name = 'test' + self.con = create_engine('sqlite:///:memory:') + self.df = DataFrame({'float': np.random.randn(N), + 'float_with_nan': np.random.randn(N), + 'string': ['foo'] * N, + 'bool': [True] * N, + 'int': np.random.randint(0, N, size=N), + 'datetime': date_range('2000-01-01', + periods=N, + freq='s')}, + index=tm.makeStringIndex(N)) + self.df.loc[1000:3000, 'float_with_nan'] = np.nan + self.df['datetime_string'] = self.df['datetime'].astype(str) + self.df.to_sql(self.table_name, self.con, if_exists='replace') + + def time_read_sql_table_column(self, dtype): + read_sql_table(self.table_name, self.con, columns=[dtype]) diff --git a/asv_bench/benchmarks/io/stata.py b/asv_bench/benchmarks/io/stata.py new file mode 100644 index 00000000000000..e0f5752ca930ff --- /dev/null +++ b/asv_bench/benchmarks/io/stata.py @@ -0,0 +1,37 @@ +import numpy as np +from pandas import DataFrame, date_range, read_stata +import pandas.util.testing as tm + +from ..pandas_vb_common import BaseIO, setup # noqa + + +class Stata(BaseIO): + + goal_time = 0.2 + params = ['tc', 'td', 'tm', 'tw', 'th', 'tq', 'ty'] + param_names = ['convert_dates'] + + def setup(self, convert_dates): + self.fname = '__test__.dta' + N = 100000 + C = 5 + self.df = DataFrame(np.random.randn(N, C), + columns=['float{}'.format(i) for i in range(C)], + index=date_range('20000101', periods=N, freq='H')) + self.df['object'] = tm.makeStringIndex(N) + self.df['int8_'] = np.random.randint(np.iinfo(np.int8).min, + np.iinfo(np.int8).max - 27, N) + self.df['int16_'] = np.random.randint(np.iinfo(np.int16).min, + np.iinfo(np.int16).max - 27, N) + self.df['int32_'] = np.random.randint(np.iinfo(np.int32).min, + np.iinfo(np.int32).max - 27, N) + self.df['float32_'] = np.array(np.random.randn(N), + dtype=np.float32) + self.convert_dates = {'index': convert_dates} + self.df.to_stata(self.fname, self.convert_dates) + + def time_read_stata(self, convert_dates): + read_stata(self.fname) + + def time_write_stata(self, convert_dates): + self.df.to_stata(self.fname, self.convert_dates) diff --git a/asv_bench/benchmarks/io_bench.py b/asv_bench/benchmarks/io_bench.py deleted file mode 100644 index 93273955a29b9f..00000000000000 --- a/asv_bench/benchmarks/io_bench.py +++ /dev/null @@ -1,224 +0,0 @@ -import os -from .pandas_vb_common import * -from pandas import concat, Timestamp, compat -try: - from StringIO import StringIO -except ImportError: - from io import StringIO -import timeit - - -class frame_to_csv(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame(np.random.randn(3000, 30)) - - def time_frame_to_csv(self): - self.df.to_csv('__test__.csv') - - -class frame_to_csv2(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame({'A': range(50000), }) - self.df['B'] = (self.df.A + 1.0) - self.df['C'] = (self.df.A + 2.0) - self.df['D'] = (self.df.A + 3.0) - - def time_frame_to_csv2(self): - self.df.to_csv('__test__.csv') - - -class frame_to_csv_date_formatting(object): - goal_time = 0.2 - - def setup(self): - self.rng = date_range('1/1/2000', periods=1000) - self.data = DataFrame(self.rng, index=self.rng) - - def time_frame_to_csv_date_formatting(self): - self.data.to_csv('__test__.csv', date_format='%Y%m%d') - - -class frame_to_csv_mixed(object): - goal_time = 0.2 - - def setup(self): - self.df_float = DataFrame(np.random.randn(5000, 5), dtype='float64', columns=self.create_cols('float')) - self.df_int = DataFrame(np.random.randn(5000, 5), dtype='int64', columns=self.create_cols('int')) - self.df_bool = DataFrame(True, index=self.df_float.index, columns=self.create_cols('bool')) - self.df_object = DataFrame('foo', index=self.df_float.index, columns=self.create_cols('object')) - self.df_dt = DataFrame(Timestamp('20010101'), index=self.df_float.index, columns=self.create_cols('date')) - self.df_float.ix[30:500, 1:3] = np.nan - self.df = concat([self.df_float, self.df_int, self.df_bool, self.df_object, self.df_dt], axis=1) - - def time_frame_to_csv_mixed(self): - self.df.to_csv('__test__.csv') - - def create_cols(self, name): - return [('%s%03d' % (name, i)) for i in range(5)] - - -class read_csv_infer_datetime_format_custom(object): - goal_time = 0.2 - - def setup(self): - self.rng = date_range('1/1/2000', periods=1000) - self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%m/%d/%Y %H:%M:%S.%f')))) - - def time_read_csv_infer_datetime_format_custom(self): - read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo'], infer_datetime_format=True) - - -class read_csv_infer_datetime_format_iso8601(object): - goal_time = 0.2 - - def setup(self): - self.rng = date_range('1/1/2000', periods=1000) - self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%Y-%m-%d %H:%M:%S')))) - - def time_read_csv_infer_datetime_format_iso8601(self): - read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo'], infer_datetime_format=True) - - -class read_csv_infer_datetime_format_ymd(object): - goal_time = 0.2 - - def setup(self): - self.rng = date_range('1/1/2000', periods=1000) - self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%Y%m%d')))) - - def time_read_csv_infer_datetime_format_ymd(self): - read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo'], infer_datetime_format=True) - - -class read_csv_skiprows(object): - goal_time = 0.2 - - def setup(self): - self.index = tm.makeStringIndex(20000) - self.df = DataFrame({'float1': randn(20000), 'float2': randn(20000), 'string1': (['foo'] * 20000), 'bool1': ([True] * 20000), 'int1': np.random.randint(0, 200000, size=20000), }, index=self.index) - self.df.to_csv('__test__.csv') - - def time_read_csv_skiprows(self): - read_csv('__test__.csv', skiprows=10000) - - -class read_csv_standard(object): - goal_time = 0.2 - - def setup(self): - self.index = tm.makeStringIndex(10000) - self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) - self.df.to_csv('__test__.csv') - - def time_read_csv_standard(self): - read_csv('__test__.csv') - - -class read_parse_dates_iso8601(object): - goal_time = 0.2 - - def setup(self): - self.rng = date_range('1/1/2000', periods=1000) - self.data = '\n'.join(self.rng.map((lambda x: x.strftime('%Y-%m-%d %H:%M:%S')))) - - def time_read_parse_dates_iso8601(self): - read_csv(StringIO(self.data), header=None, names=['foo'], parse_dates=['foo']) - - -class read_uint64_integers(object): - goal_time = 0.2 - - def setup(self): - self.na_values = [2**63 + 500] - - self.arr1 = np.arange(10000).astype('uint64') + 2**63 - self.data1 = '\n'.join(map(lambda x: str(x), self.arr1)) - - self.arr2 = self.arr1.copy().astype(object) - self.arr2[500] = -1 - self.data2 = '\n'.join(map(lambda x: str(x), self.arr2)) - - def time_read_uint64(self): - read_csv(StringIO(self.data1), header=None) - - def time_read_uint64_neg_values(self): - read_csv(StringIO(self.data2), header=None) - - def time_read_uint64_na_values(self): - read_csv(StringIO(self.data1), header=None, na_values=self.na_values) - - -class write_csv_standard(object): - goal_time = 0.2 - - def setup(self): - self.index = tm.makeStringIndex(10000) - self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) - - def time_write_csv_standard(self): - self.df.to_csv('__test__.csv') - - -class read_csv_from_s3(object): - # Make sure that we can read part of a file from S3 without - # needing to download the entire thing. Use the timeit.default_timer - # to measure wall time instead of CPU time -- we want to see - # how long it takes to download the data. - timer = timeit.default_timer - params = ([None, "gzip", "bz2"], ["python", "c"]) - param_names = ["compression", "engine"] - - def setup(self, compression, engine): - if compression == "bz2" and engine == "c" and compat.PY2: - # The Python 2 C parser can't read bz2 from open files. - raise NotImplementedError - try: - import s3fs - except ImportError: - # Skip these benchmarks if `boto` is not installed. - raise NotImplementedError - - self.big_fname = "s3://pandas-test/large_random.csv" - - def time_read_nrows(self, compression, engine): - # Read a small number of rows from a huge (100,000 x 50) table. - ext = "" - if compression == "gzip": - ext = ".gz" - elif compression == "bz2": - ext = ".bz2" - pd.read_csv(self.big_fname + ext, nrows=10, - compression=compression, engine=engine) - - -class read_json_lines(object): - goal_time = 0.2 - fname = "__test__.json" - - def setup(self): - self.N = 100000 - self.C = 5 - self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)])) - self.df.to_json(self.fname,orient="records",lines=True) - - def teardown(self): - try: - os.remove(self.fname) - except: - pass - - def time_read_json_lines(self): - pd.read_json(self.fname, lines=True) - - def time_read_json_lines_chunk(self): - pd.concat(pd.read_json(self.fname, lines=True, chunksize=self.N//4)) - - def peakmem_read_json_lines(self): - pd.read_json(self.fname, lines=True) - - def peakmem_read_json_lines_chunk(self): - pd.concat(pd.read_json(self.fname, lines=True, chunksize=self.N//4)) diff --git a/asv_bench/benchmarks/io_sql.py b/asv_bench/benchmarks/io_sql.py deleted file mode 100644 index ec855e5d33525e..00000000000000 --- a/asv_bench/benchmarks/io_sql.py +++ /dev/null @@ -1,105 +0,0 @@ -import sqlalchemy -from .pandas_vb_common import * -import sqlite3 -from sqlalchemy import create_engine - - -#------------------------------------------------------------------------------- -# to_sql - -class WriteSQL(object): - goal_time = 0.2 - - def setup(self): - self.engine = create_engine('sqlite:///:memory:') - self.con = sqlite3.connect(':memory:') - self.index = tm.makeStringIndex(10000) - self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) - - def time_fallback(self): - self.df.to_sql('test1', self.con, if_exists='replace') - - def time_sqlalchemy(self): - self.df.to_sql('test1', self.engine, if_exists='replace') - - -#------------------------------------------------------------------------------- -# read_sql - -class ReadSQL(object): - goal_time = 0.2 - - def setup(self): - self.engine = create_engine('sqlite:///:memory:') - self.con = sqlite3.connect(':memory:') - self.index = tm.makeStringIndex(10000) - self.df = DataFrame({'float1': randn(10000), 'float2': randn(10000), 'string1': (['foo'] * 10000), 'bool1': ([True] * 10000), 'int1': np.random.randint(0, 100000, size=10000), }, index=self.index) - self.df.to_sql('test2', self.engine, if_exists='replace') - self.df.to_sql('test2', self.con, if_exists='replace') - - def time_read_query_fallback(self): - read_sql_query('SELECT * FROM test2', self.con) - - def time_read_query_sqlalchemy(self): - read_sql_query('SELECT * FROM test2', self.engine) - - def time_read_table_sqlalchemy(self): - read_sql_table('test2', self.engine) - - -#------------------------------------------------------------------------------- -# type specific write - -class WriteSQLTypes(object): - goal_time = 0.2 - - def setup(self): - self.engine = create_engine('sqlite:///:memory:') - self.con = sqlite3.connect(':memory:') - self.df = DataFrame({'float': randn(10000), 'string': (['foo'] * 10000), 'bool': ([True] * 10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) - self.df.loc[1000:3000, 'float'] = np.nan - - def time_string_fallback(self): - self.df[['string']].to_sql('test_string', self.con, if_exists='replace') - - def time_string_sqlalchemy(self): - self.df[['string']].to_sql('test_string', self.engine, if_exists='replace') - - def time_float_fallback(self): - self.df[['float']].to_sql('test_float', self.con, if_exists='replace') - - def time_float_sqlalchemy(self): - self.df[['float']].to_sql('test_float', self.engine, if_exists='replace') - - def time_datetime_sqlalchemy(self): - self.df[['datetime']].to_sql('test_datetime', self.engine, if_exists='replace') - - -#------------------------------------------------------------------------------- -# type specific read - -class ReadSQLTypes(object): - goal_time = 0.2 - - def setup(self): - self.engine = create_engine('sqlite:///:memory:') - self.con = sqlite3.connect(':memory:') - self.df = DataFrame({'float': randn(10000), 'datetime': date_range('2000-01-01', periods=10000, freq='s'), }) - self.df['datetime_string'] = self.df['datetime'].map(str) - self.df.to_sql('test_type', self.engine, if_exists='replace') - self.df[['float', 'datetime_string']].to_sql('test_type', self.con, if_exists='replace') - - def time_datetime_read_and_parse_sqlalchemy(self): - read_sql_table('test_type', self.engine, columns=['datetime_string'], parse_dates=['datetime_string']) - - def time_datetime_read_as_native_sqlalchemy(self): - read_sql_table('test_type', self.engine, columns=['datetime']) - - def time_float_read_query_fallback(self): - read_sql_query('SELECT float FROM test_type', self.con) - - def time_float_read_query_sqlalchemy(self): - read_sql_query('SELECT float FROM test_type', self.engine) - - def time_float_read_table_sqlalchemy(self): - read_sql_table('test_type', self.engine, columns=['float']) diff --git a/asv_bench/benchmarks/join_merge.py b/asv_bench/benchmarks/join_merge.py index 3b0e33b72ddc10..de0a3b33da1474 100644 --- a/asv_bench/benchmarks/join_merge.py +++ b/asv_bench/benchmarks/join_merge.py @@ -1,20 +1,25 @@ -from .pandas_vb_common import * +import warnings +import string +import numpy as np +import pandas.util.testing as tm +from pandas import (DataFrame, Series, MultiIndex, date_range, concat, merge, + merge_asof) try: from pandas import merge_ordered except ImportError: from pandas import ordered_merge as merge_ordered +from .pandas_vb_common import Panel, setup # noqa -# ---------------------------------------------------------------------- -# Append class Append(object): + goal_time = 0.2 def setup(self): - self.df1 = pd.DataFrame(np.random.randn(10000, 4), - columns=['A', 'B', 'C', 'D']) + self.df1 = DataFrame(np.random.randn(10000, 4), + columns=['A', 'B', 'C', 'D']) self.df2 = self.df1.copy() self.df2.index = np.arange(10000, 20000) self.mdf1 = self.df1.copy() @@ -22,7 +27,8 @@ def setup(self): self.mdf1['obj2'] = 'bar' self.mdf1['int1'] = 5 try: - self.mdf1.consolidate(inplace=True) + with warnings.catch_warnings(record=True): + self.mdf1.consolidate(inplace=True) except: pass self.mdf2 = self.mdf1.copy() @@ -35,237 +41,228 @@ def time_append_mixed(self): self.mdf1.append(self.mdf2) -# ---------------------------------------------------------------------- -# Concat - class Concat(object): - goal_time = 0.2 - def setup(self): - self.n = 1000 - self.indices = tm.makeStringIndex(1000) - self.s = Series(self.n, index=self.indices) - self.pieces = [self.s[i:(- i)] for i in range(1, 10)] - self.pieces = (self.pieces * 50) - - self.df_small = pd.DataFrame(randn(5, 4)) + goal_time = 0.2 + params = [0, 1] + param_names = ['axis'] - # empty - self.df = pd.DataFrame(dict(A=range(10000)), index=date_range('20130101', periods=10000, freq='s')) - self.empty = pd.DataFrame() + def setup(self, axis): + N = 1000 + s = Series(N, index=tm.makeStringIndex(N)) + self.series = [s[i:- i] for i in range(1, 10)] * 50 + self.small_frames = [DataFrame(np.random.randn(5, 4))] * 1000 + df = DataFrame({'A': range(N)}, + index=date_range('20130101', periods=N, freq='s')) + self.empty_left = [DataFrame(), df] + self.empty_right = [df, DataFrame()] - def time_concat_series_axis1(self): - concat(self.pieces, axis=1) + def time_concat_series(self, axis): + concat(self.series, axis=axis) - def time_concat_small_frames(self): - concat(([self.df_small] * 1000)) + def time_concat_small_frames(self, axis): + concat(self.small_frames, axis=axis) - def time_concat_empty_frames1(self): - concat([self.df, self.empty]) + def time_concat_empty_right(self, axis): + concat(self.empty_right, axis=axis) - def time_concat_empty_frames2(self): - concat([self.empty, self.df]) + def time_concat_empty_left(self, axis): + concat(self.empty_left, axis=axis) class ConcatPanels(object): - goal_time = 0.2 - - def setup(self): - dataset = np.zeros((10000, 200, 2), dtype=np.float32) - self.panels_f = [pd.Panel(np.copy(dataset, order='F')) - for i in range(20)] - self.panels_c = [pd.Panel(np.copy(dataset, order='C')) - for i in range(20)] - def time_c_ordered_axis0(self): - concat(self.panels_c, axis=0, ignore_index=True) - - def time_f_ordered_axis0(self): - concat(self.panels_f, axis=0, ignore_index=True) + goal_time = 0.2 + params = ([0, 1, 2], [True, False]) + param_names = ['axis', 'ignore_index'] - def time_c_ordered_axis1(self): - concat(self.panels_c, axis=1, ignore_index=True) + def setup(self, axis, ignore_index): + with warnings.catch_warnings(record=True): + panel_c = Panel(np.zeros((10000, 200, 2), + dtype=np.float32, + order='C')) + self.panels_c = [panel_c] * 20 + panel_f = Panel(np.zeros((10000, 200, 2), + dtype=np.float32, + order='F')) + self.panels_f = [panel_f] * 20 - def time_f_ordered_axis1(self): - concat(self.panels_f, axis=1, ignore_index=True) + def time_c_ordered(self, axis, ignore_index): + with warnings.catch_warnings(record=True): + concat(self.panels_c, axis=axis, ignore_index=ignore_index) - def time_c_ordered_axis2(self): - concat(self.panels_c, axis=2, ignore_index=True) + def time_f_ordered(self, axis, ignore_index): + with warnings.catch_warnings(record=True): + concat(self.panels_f, axis=axis, ignore_index=ignore_index) - def time_f_ordered_axis2(self): - concat(self.panels_f, axis=2, ignore_index=True) +class ConcatDataFrames(object): -class ConcatFrames(object): goal_time = 0.2 + params = ([0, 1], [True, False]) + param_names = ['axis', 'ignore_index'] - def setup(self): - dataset = np.zeros((10000, 200), dtype=np.float32) - - self.frames_f = [pd.DataFrame(np.copy(dataset, order='F')) - for i in range(20)] - self.frames_c = [pd.DataFrame(np.copy(dataset, order='C')) - for i in range(20)] - - def time_c_ordered_axis0(self): - concat(self.frames_c, axis=0, ignore_index=True) - - def time_f_ordered_axis0(self): - concat(self.frames_f, axis=0, ignore_index=True) + def setup(self, axis, ignore_index): + frame_c = DataFrame(np.zeros((10000, 200), + dtype=np.float32, order='C')) + self.frame_c = [frame_c] * 20 + frame_f = DataFrame(np.zeros((10000, 200), + dtype=np.float32, order='F')) + self.frame_f = [frame_f] * 20 - def time_c_ordered_axis1(self): - concat(self.frames_c, axis=1, ignore_index=True) + def time_c_ordered(self, axis, ignore_index): + concat(self.frame_c, axis=axis, ignore_index=ignore_index) - def time_f_ordered_axis1(self): - concat(self.frames_f, axis=1, ignore_index=True) + def time_f_ordered(self, axis, ignore_index): + concat(self.frame_f, axis=axis, ignore_index=ignore_index) -# ---------------------------------------------------------------------- -# Joins - class Join(object): - goal_time = 0.2 - - def setup(self): - self.level1 = tm.makeStringIndex(10).values - self.level2 = tm.makeStringIndex(1000).values - self.label1 = np.arange(10).repeat(1000) - self.label2 = np.tile(np.arange(1000), 10) - self.key1 = np.tile(self.level1.take(self.label1), 10) - self.key2 = np.tile(self.level2.take(self.label2), 10) - self.shuf = np.arange(100000) - random.shuffle(self.shuf) - try: - self.index2 = MultiIndex(levels=[self.level1, self.level2], - labels=[self.label1, self.label2]) - self.index3 = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], - labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) - self.df_multi = DataFrame(np.random.randn(len(self.index2), 4), - index=self.index2, - columns=['A', 'B', 'C', 'D']) - except: - pass - self.df = pd.DataFrame({'data1': np.random.randn(100000), - 'data2': np.random.randn(100000), - 'key1': self.key1, - 'key2': self.key2}) - self.df_key1 = pd.DataFrame(np.random.randn(len(self.level1), 4), - index=self.level1, - columns=['A', 'B', 'C', 'D']) - self.df_key2 = pd.DataFrame(np.random.randn(len(self.level2), 4), - index=self.level2, - columns=['A', 'B', 'C', 'D']) - self.df_shuf = self.df.reindex(self.df.index[self.shuf]) - - def time_join_dataframe_index_multi(self): - self.df.join(self.df_multi, on=['key1', 'key2']) - - def time_join_dataframe_index_single_key_bigger(self): - self.df.join(self.df_key2, on='key2') - def time_join_dataframe_index_single_key_bigger_sort(self): - self.df_shuf.join(self.df_key2, on='key2', sort=True) - - def time_join_dataframe_index_single_key_small(self): - self.df.join(self.df_key1, on='key1') + goal_time = 0.2 + params = [True, False] + param_names = ['sort'] + + def setup(self, sort): + level1 = tm.makeStringIndex(10).values + level2 = tm.makeStringIndex(1000).values + label1 = np.arange(10).repeat(1000) + label2 = np.tile(np.arange(1000), 10) + index2 = MultiIndex(levels=[level1, level2], + labels=[label1, label2]) + self.df_multi = DataFrame(np.random.randn(len(index2), 4), + index=index2, + columns=['A', 'B', 'C', 'D']) + + self.key1 = np.tile(level1.take(label1), 10) + self.key2 = np.tile(level2.take(label2), 10) + self.df = DataFrame({'data1': np.random.randn(100000), + 'data2': np.random.randn(100000), + 'key1': self.key1, + 'key2': self.key2}) + + self.df_key1 = DataFrame(np.random.randn(len(level1), 4), + index=level1, + columns=['A', 'B', 'C', 'D']) + self.df_key2 = DataFrame(np.random.randn(len(level2), 4), + index=level2, + columns=['A', 'B', 'C', 'D']) + + shuf = np.arange(100000) + np.random.shuffle(shuf) + self.df_shuf = self.df.reindex(self.df.index[shuf]) + + def time_join_dataframe_index_multi(self, sort): + self.df.join(self.df_multi, on=['key1', 'key2'], sort=sort) + + def time_join_dataframe_index_single_key_bigger(self, sort): + self.df.join(self.df_key2, on='key2', sort=sort) + + def time_join_dataframe_index_single_key_small(self, sort): + self.df.join(self.df_key1, on='key1', sort=sort) + + def time_join_dataframe_index_shuffle_key_bigger_sort(self, sort): + self.df_shuf.join(self.df_key2, on='key2', sort=sort) class JoinIndex(object): + goal_time = 0.2 def setup(self): - np.random.seed(2718281) - self.n = 50000 - self.left = pd.DataFrame(np.random.randint(1, (self.n / 500), (self.n, 2)), columns=['jim', 'joe']) - self.right = pd.DataFrame(np.random.randint(1, (self.n / 500), (self.n, 2)), columns=['jolie', 'jolia']).set_index('jolie') + N = 50000 + self.left = DataFrame(np.random.randint(1, N / 500, (N, 2)), + columns=['jim', 'joe']) + self.right = DataFrame(np.random.randint(1, N / 500, (N, 2)), + columns=['jolie', 'jolia']).set_index('jolie') def time_left_outer_join_index(self): self.left.join(self.right, on='jim') -class join_non_unique_equal(object): +class JoinNonUnique(object): # outer join of non-unique # GH 6329 - goal_time = 0.2 def setup(self): - self.date_index = date_range('01-Jan-2013', '23-Jan-2013', freq='T') - self.daily_dates = self.date_index.to_period('D').to_timestamp('S', 'S') - self.fracofday = (self.date_index.view(np.ndarray) - self.daily_dates.view(np.ndarray)) - self.fracofday = (self.fracofday.astype('timedelta64[ns]').astype(np.float64) / 86400000000000.0) - self.fracofday = Series(self.fracofday, self.daily_dates) - self.index = date_range(self.date_index.min().to_period('A').to_timestamp('D', 'S'), self.date_index.max().to_period('A').to_timestamp('D', 'E'), freq='D') - self.temp = Series(1.0, self.index) + date_index = date_range('01-Jan-2013', '23-Jan-2013', freq='T') + daily_dates = date_index.to_period('D').to_timestamp('S', 'S') + self.fracofday = date_index.values - daily_dates.values + self.fracofday = self.fracofday.astype('timedelta64[ns]') + self.fracofday = self.fracofday.astype(np.float64) / 86400000000000.0 + self.fracofday = Series(self.fracofday, daily_dates) + index = date_range(date_index.min(), date_index.max(), freq='D') + self.temp = Series(1.0, index)[self.fracofday.index] def time_join_non_unique_equal(self): - (self.fracofday * self.temp[self.fracofday.index]) - + self.fracofday * self.temp -# ---------------------------------------------------------------------- -# Merges class Merge(object): - goal_time = 0.2 - def setup(self): - self.N = 10000 - self.indices = tm.makeStringIndex(self.N).values - self.indices2 = tm.makeStringIndex(self.N).values - self.key = np.tile(self.indices[:8000], 10) - self.key2 = np.tile(self.indices2[:8000], 10) - self.left = pd.DataFrame({'key': self.key, 'key2': self.key2, - 'value': np.random.randn(80000)}) - self.right = pd.DataFrame({'key': self.indices[2000:], - 'key2': self.indices2[2000:], - 'value2': np.random.randn(8000)}) - - self.df = pd.DataFrame({'key1': np.tile(np.arange(500).repeat(10), 2), - 'key2': np.tile(np.arange(250).repeat(10), 4), - 'value': np.random.randn(10000)}) - self.df2 = pd.DataFrame({'key1': np.arange(500), 'value2': randn(500)}) + goal_time = 0.2 + params = [True, False] + param_names = ['sort'] + + def setup(self, sort): + N = 10000 + indices = tm.makeStringIndex(N).values + indices2 = tm.makeStringIndex(N).values + key = np.tile(indices[:8000], 10) + key2 = np.tile(indices2[:8000], 10) + self.left = DataFrame({'key': key, 'key2': key2, + 'value': np.random.randn(80000)}) + self.right = DataFrame({'key': indices[2000:], + 'key2': indices2[2000:], + 'value2': np.random.randn(8000)}) + + self.df = DataFrame({'key1': np.tile(np.arange(500).repeat(10), 2), + 'key2': np.tile(np.arange(250).repeat(10), 4), + 'value': np.random.randn(10000)}) + self.df2 = DataFrame({'key1': np.arange(500), + 'value2': np.random.randn(500)}) self.df3 = self.df[:5000] - def time_merge_2intkey_nosort(self): - merge(self.left, self.right, sort=False) + def time_merge_2intkey(self, sort): + merge(self.left, self.right, sort=sort) - def time_merge_2intkey_sort(self): - merge(self.left, self.right, sort=True) + def time_merge_dataframe_integer_2key(self, sort): + merge(self.df, self.df3, sort=sort) - def time_merge_dataframe_integer_2key(self): - merge(self.df, self.df3) + def time_merge_dataframe_integer_key(self, sort): + merge(self.df, self.df2, on='key1', sort=sort) - def time_merge_dataframe_integer_key(self): - merge(self.df, self.df2, on='key1') +class I8Merge(object): -class i8merge(object): goal_time = 0.2 + params = ['inner', 'outer', 'left', 'right'] + param_names = ['how'] - def setup(self): - (low, high, n) = (((-1) << 10), (1 << 10), (1 << 20)) - self.left = pd.DataFrame(np.random.randint(low, high, (n, 7)), - columns=list('ABCDEFG')) + def setup(self, how): + low, high, n = -1000, 1000, 10**6 + self.left = DataFrame(np.random.randint(low, high, (n, 7)), + columns=list('ABCDEFG')) self.left['left'] = self.left.sum(axis=1) - self.i = np.random.permutation(len(self.left)) - self.right = self.left.iloc[self.i].copy() - self.right.columns = (self.right.columns[:(-1)].tolist() + ['right']) - self.right.index = np.arange(len(self.right)) - self.right['right'] *= (-1) + self.right = self.left.sample(frac=1).rename({'left': 'right'}, axis=1) + self.right = self.right.reset_index(drop=True) + self.right['right'] *= -1 - def time_i8merge(self): - merge(self.left, self.right, how='outer') + def time_i8merge(self, how): + merge(self.left, self.right, how=how) class MergeCategoricals(object): + goal_time = 0.2 def setup(self): - self.left_object = pd.DataFrame( + self.left_object = DataFrame( {'X': np.random.choice(range(0, 10), size=(10000,)), 'Y': np.random.choice(['one', 'two', 'three'], size=(10000,))}) - self.right_object = pd.DataFrame( + self.right_object = DataFrame( {'X': np.random.choice(range(0, 10), size=(10000,)), 'Z': np.random.choice(['jjj', 'kkk', 'sss'], size=(10000,))}) @@ -281,103 +278,85 @@ def time_merge_cat(self): merge(self.left_cat, self.right_cat, on='X') -# ---------------------------------------------------------------------- -# Ordered merge - class MergeOrdered(object): def setup(self): - groups = tm.makeStringIndex(10).values - - self.left = pd.DataFrame({'group': groups.repeat(5000), - 'key' : np.tile(np.arange(0, 10000, 2), 10), - 'lvalue': np.random.randn(50000)}) - - self.right = pd.DataFrame({'key' : np.arange(10000), - 'rvalue' : np.random.randn(10000)}) + self.left = DataFrame({'group': groups.repeat(5000), + 'key': np.tile(np.arange(0, 10000, 2), 10), + 'lvalue': np.random.randn(50000)}) + self.right = DataFrame({'key': np.arange(10000), + 'rvalue': np.random.randn(10000)}) def time_merge_ordered(self): merge_ordered(self.left, self.right, on='key', left_by='group') -# ---------------------------------------------------------------------- -# asof merge - class MergeAsof(object): def setup(self): - import string - np.random.seed(0) one_count = 200000 two_count = 1000000 - self.df1 = pd.DataFrame( + df1 = DataFrame( {'time': np.random.randint(0, one_count / 20, one_count), 'key': np.random.choice(list(string.ascii_uppercase), one_count), 'key2': np.random.randint(0, 25, one_count), 'value1': np.random.randn(one_count)}) - self.df2 = pd.DataFrame( + df2 = DataFrame( {'time': np.random.randint(0, two_count / 20, two_count), 'key': np.random.choice(list(string.ascii_uppercase), two_count), 'key2': np.random.randint(0, 25, two_count), 'value2': np.random.randn(two_count)}) - self.df1 = self.df1.sort_values('time') - self.df2 = self.df2.sort_values('time') + df1 = df1.sort_values('time') + df2 = df2.sort_values('time') - self.df1['time32'] = np.int32(self.df1.time) - self.df2['time32'] = np.int32(self.df2.time) + df1['time32'] = np.int32(df1.time) + df2['time32'] = np.int32(df2.time) - self.df1a = self.df1[['time', 'value1']] - self.df2a = self.df2[['time', 'value2']] - self.df1b = self.df1[['time', 'key', 'value1']] - self.df2b = self.df2[['time', 'key', 'value2']] - self.df1c = self.df1[['time', 'key2', 'value1']] - self.df2c = self.df2[['time', 'key2', 'value2']] - self.df1d = self.df1[['time32', 'value1']] - self.df2d = self.df2[['time32', 'value2']] - self.df1e = self.df1[['time', 'key', 'key2', 'value1']] - self.df2e = self.df2[['time', 'key', 'key2', 'value2']] + self.df1a = df1[['time', 'value1']] + self.df2a = df2[['time', 'value2']] + self.df1b = df1[['time', 'key', 'value1']] + self.df2b = df2[['time', 'key', 'value2']] + self.df1c = df1[['time', 'key2', 'value1']] + self.df2c = df2[['time', 'key2', 'value2']] + self.df1d = df1[['time32', 'value1']] + self.df2d = df2[['time32', 'value2']] + self.df1e = df1[['time', 'key', 'key2', 'value1']] + self.df2e = df2[['time', 'key', 'key2', 'value2']] - def time_noby(self): + def time_on_int(self): merge_asof(self.df1a, self.df2a, on='time') + def time_on_int32(self): + merge_asof(self.df1d, self.df2d, on='time32') + def time_by_object(self): merge_asof(self.df1b, self.df2b, on='time', by='key') def time_by_int(self): merge_asof(self.df1c, self.df2c, on='time', by='key2') - def time_on_int32(self): - merge_asof(self.df1d, self.df2d, on='time32') - def time_multiby(self): merge_asof(self.df1e, self.df2e, on='time', by=['key', 'key2']) -# ---------------------------------------------------------------------- -# data alignment - class Align(object): + goal_time = 0.2 def setup(self): - self.n = 1000000 - self.sz = 500000 - self.rng = np.arange(0, 10000000000000, 10000000) - self.stamps = (np.datetime64(datetime.now()).view('i8') + self.rng) - self.idx1 = np.sort(self.sample(self.stamps, self.sz)) - self.idx2 = np.sort(self.sample(self.stamps, self.sz)) - self.ts1 = Series(np.random.randn(self.sz), self.idx1) - self.ts2 = Series(np.random.randn(self.sz), self.idx2) - - def sample(self, values, k): - self.sampler = np.random.permutation(len(values)) - return values.take(self.sampler[:k]) + size = 5 * 10**5 + rng = np.arange(0, 10**13, 10**7) + stamps = np.datetime64('now').view('i8') + rng + idx1 = np.sort(np.random.choice(stamps, size, replace=False)) + idx2 = np.sort(np.random.choice(stamps, size, replace=False)) + self.ts1 = Series(np.random.randn(size), idx1) + self.ts2 = Series(np.random.randn(size), idx2) def time_series_align_int64_index(self): - (self.ts1 + self.ts2) + self.ts1 + self.ts2 def time_series_align_left_monotonic(self): self.ts1.align(self.ts2, join='left') diff --git a/asv_bench/benchmarks/multiindex_object.py b/asv_bench/benchmarks/multiindex_object.py new file mode 100644 index 00000000000000..0c92214795557f --- /dev/null +++ b/asv_bench/benchmarks/multiindex_object.py @@ -0,0 +1,140 @@ +import string + +import numpy as np +import pandas.util.testing as tm +from pandas import date_range, MultiIndex + +from .pandas_vb_common import setup # noqa + + +class GetLoc(object): + + goal_time = 0.2 + + def setup(self): + self.mi_large = MultiIndex.from_product( + [np.arange(1000), np.arange(20), list(string.ascii_letters)], + names=['one', 'two', 'three']) + self.mi_med = MultiIndex.from_product( + [np.arange(1000), np.arange(10), list('A')], + names=['one', 'two', 'three']) + self.mi_small = MultiIndex.from_product( + [np.arange(100), list('A'), list('A')], + names=['one', 'two', 'three']) + + def time_large_get_loc(self): + self.mi_large.get_loc((999, 19, 'Z')) + + def time_large_get_loc_warm(self): + for _ in range(1000): + self.mi_large.get_loc((999, 19, 'Z')) + + def time_med_get_loc(self): + self.mi_med.get_loc((999, 9, 'A')) + + def time_med_get_loc_warm(self): + for _ in range(1000): + self.mi_med.get_loc((999, 9, 'A')) + + def time_string_get_loc(self): + self.mi_small.get_loc((99, 'A', 'A')) + + def time_small_get_loc_warm(self): + for _ in range(1000): + self.mi_small.get_loc((99, 'A', 'A')) + + +class Duplicates(object): + + goal_time = 0.2 + + def setup(self): + size = 65536 + arrays = [np.random.randint(0, 8192, size), + np.random.randint(0, 1024, size)] + mask = np.random.rand(size) < 0.1 + self.mi_unused_levels = MultiIndex.from_arrays(arrays) + self.mi_unused_levels = self.mi_unused_levels[mask] + + def time_remove_unused_levels(self): + self.mi_unused_levels.remove_unused_levels() + + +class Integer(object): + + goal_time = 0.2 + + def setup(self): + self.mi_int = MultiIndex.from_product([np.arange(1000), + np.arange(1000)], + names=['one', 'two']) + self.obj_index = np.array([(0, 10), (0, 11), (0, 12), + (0, 13), (0, 14), (0, 15), + (0, 16), (0, 17), (0, 18), + (0, 19)], dtype=object) + + def time_get_indexer(self): + self.mi_int.get_indexer(self.obj_index) + + def time_is_monotonic(self): + self.mi_int.is_monotonic + + +class Duplicated(object): + + goal_time = 0.2 + + def setup(self): + n, k = 200, 5000 + levels = [np.arange(n), + tm.makeStringIndex(n).values, + 1000 + np.arange(n)] + labels = [np.random.choice(n, (k * n)) for lev in levels] + self.mi = MultiIndex(levels=levels, labels=labels) + + def time_duplicated(self): + self.mi.duplicated() + + +class Sortlevel(object): + + goal_time = 0.2 + + def setup(self): + n = 1182720 + low, high = -4096, 4096 + arrs = [np.repeat(np.random.randint(low, high, (n // k)), k) + for k in [11, 7, 5, 3, 1]] + self.mi_int = MultiIndex.from_arrays(arrs)[np.random.permutation(n)] + + a = np.repeat(np.arange(100), 1000) + b = np.tile(np.arange(1000), 100) + self.mi = MultiIndex.from_arrays([a, b]) + self.mi = self.mi.take(np.random.permutation(np.arange(100000))) + + def time_sortlevel_int64(self): + self.mi_int.sortlevel() + + def time_sortlevel_zero(self): + self.mi.sortlevel(0) + + def time_sortlevel_one(self): + self.mi.sortlevel(1) + + +class Values(object): + + goal_time = 0.2 + + def setup_cache(self): + + level1 = range(1000) + level2 = date_range(start='1/1/2012', periods=100) + mi = MultiIndex.from_product([level1, level2]) + return mi + + def time_datetime_level_values_copy(self, mi): + mi.copy().values + + def time_datetime_level_values_sliced(self, mi): + mi[:10].values diff --git a/asv_bench/benchmarks/offset.py b/asv_bench/benchmarks/offset.py new file mode 100644 index 00000000000000..e161b887ee86f0 --- /dev/null +++ b/asv_bench/benchmarks/offset.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +import warnings +from datetime import datetime + +import numpy as np +import pandas as pd +try: + import pandas.tseries.holiday # noqa +except ImportError: + pass + +hcal = pd.tseries.holiday.USFederalHolidayCalendar() +# These offests currently raise a NotImplimentedError with .apply_index() +non_apply = [pd.offsets.Day(), + pd.offsets.BYearEnd(), + pd.offsets.BYearBegin(), + pd.offsets.BQuarterEnd(), + pd.offsets.BQuarterBegin(), + pd.offsets.BMonthEnd(), + pd.offsets.BMonthBegin(), + pd.offsets.CustomBusinessDay(), + pd.offsets.CustomBusinessDay(calendar=hcal), + pd.offsets.CustomBusinessMonthBegin(calendar=hcal), + pd.offsets.CustomBusinessMonthEnd(calendar=hcal), + pd.offsets.CustomBusinessMonthEnd(calendar=hcal)] +other_offsets = [pd.offsets.YearEnd(), pd.offsets.YearBegin(), + pd.offsets.QuarterEnd(), pd.offsets.QuarterBegin(), + pd.offsets.MonthEnd(), pd.offsets.MonthBegin(), + pd.offsets.DateOffset(months=2, days=2), + pd.offsets.BusinessDay(), pd.offsets.SemiMonthEnd(), + pd.offsets.SemiMonthBegin()] +offsets = non_apply + other_offsets + + +class ApplyIndex(object): + + goal_time = 0.2 + + params = other_offsets + param_names = ['offset'] + + def setup(self, offset): + N = 10000 + self.rng = pd.date_range(start='1/1/2000', periods=N, freq='T') + + def time_apply_index(self, offset): + offset.apply_index(self.rng) + + +class OnOffset(object): + + goal_time = 0.2 + + params = offsets + param_names = ['offset'] + + def setup(self, offset): + self.dates = [datetime(2016, m, d) + for m in [10, 11, 12] + for d in [1, 2, 3, 28, 29, 30, 31] + if not (m == 11 and d == 31)] + + def time_on_offset(self, offset): + for date in self.dates: + offset.onOffset(date) + + +class OffsetSeriesArithmetic(object): + + goal_time = 0.2 + params = offsets + param_names = ['offset'] + + def setup(self, offset): + N = 1000 + rng = pd.date_range(start='1/1/2000', periods=N, freq='T') + self.data = pd.Series(rng) + + def time_add_offset(self, offset): + with warnings.catch_warnings(record=True): + self.data + offset + + +class OffsetDatetimeIndexArithmetic(object): + + goal_time = 0.2 + params = offsets + param_names = ['offset'] + + def setup(self, offset): + N = 1000 + self.data = pd.date_range(start='1/1/2000', periods=N, freq='T') + + def time_add_offset(self, offset): + with warnings.catch_warnings(record=True): + self.data + offset + + +class OffestDatetimeArithmetic(object): + + goal_time = 0.2 + params = offsets + param_names = ['offset'] + + def setup(self, offset): + self.date = datetime(2011, 1, 1) + self.dt64 = np.datetime64('2011-01-01 09:00Z') + + def time_apply(self, offset): + offset.apply(self.date) + + def time_apply_np_dt64(self, offset): + offset.apply(self.dt64) + + def time_add(self, offset): + self.date + offset + + def time_add_10(self, offset): + self.date + (10 * offset) + + def time_subtract(self, offset): + self.date - offset + + def time_subtract_10(self, offset): + self.date - (10 * offset) diff --git a/asv_bench/benchmarks/packers.py b/asv_bench/benchmarks/packers.py deleted file mode 100644 index 24f80cc836dd45..00000000000000 --- a/asv_bench/benchmarks/packers.py +++ /dev/null @@ -1,318 +0,0 @@ -from .pandas_vb_common import * -from numpy.random import randint -import pandas as pd -from collections import OrderedDict -from pandas.compat import BytesIO -import sqlite3 -import os -from sqlalchemy import create_engine -import numpy as np -from random import randrange - -class _Packers(object): - goal_time = 0.2 - - def _setup(self): - self.f = '__test__.msg' - self.N = 100000 - self.C = 5 - self.index = date_range('20000101', periods=self.N, freq='H') - self.df = DataFrame(dict([('float{0}'.format(i), randn(self.N)) for i in range(self.C)]), index=self.index) - self.df2 = self.df.copy() - self.df2['object'] = [('%08x' % randrange((16 ** 8))) for _ in range(self.N)] - self.remove(self.f) - - def remove(self, f): - try: - os.remove(self.f) - except: - pass - -class Packers(_Packers): - goal_time = 0.2 - - def setup(self): - self._setup() - self.df.to_csv(self.f) - - def time_packers_read_csv(self): - pd.read_csv(self.f) - -class packers_read_excel(_Packers): - goal_time = 0.2 - - def setup(self): - self._setup() - self.bio = BytesIO() - self.writer = pd.io.excel.ExcelWriter(self.bio, engine='xlsxwriter') - self.df[:2000].to_excel(self.writer) - self.writer.save() - - def time_packers_read_excel(self): - self.bio.seek(0) - pd.read_excel(self.bio) - - -class packers_read_hdf_store(_Packers): - goal_time = 0.2 - - def setup(self): - self._setup() - self.df2.to_hdf(self.f, 'df') - - def time_packers_read_hdf_store(self): - pd.read_hdf(self.f, 'df') - - -class packers_read_hdf_table(_Packers): - - def setup(self): - self._setup() - self.df2.to_hdf(self.f, 'df', format='table') - - def time_packers_read_hdf_table(self): - pd.read_hdf(self.f, 'df') - - -class packers_read_json(_Packers): - - def setup(self): - self._setup() - self.df.to_json(self.f, orient='split') - self.df.index = np.arange(self.N) - - def time_packers_read_json(self): - pd.read_json(self.f, orient='split') - - -class packers_read_json_date_index(_Packers): - - def setup(self): - self._setup() - self.remove(self.f) - self.df.to_json(self.f, orient='split') - - def time_packers_read_json_date_index(self): - pd.read_json(self.f, orient='split') - - -class packers_read_pack(_Packers): - - def setup(self): - self._setup() - self.df2.to_msgpack(self.f) - - def time_packers_read_pack(self): - pd.read_msgpack(self.f) - - -class packers_read_pickle(_Packers): - - def setup(self): - self._setup() - self.df2.to_pickle(self.f) - - def time_packers_read_pickle(self): - pd.read_pickle(self.f) - -class packers_read_sql(_Packers): - - def setup(self): - self._setup() - self.engine = create_engine('sqlite:///:memory:') - self.df2.to_sql('table', self.engine, if_exists='replace') - - def time_packers_read_sql(self): - pd.read_sql_table('table', self.engine) - - -class packers_read_stata(_Packers): - - def setup(self): - self._setup() - self.df.to_stata(self.f, {'index': 'tc', }) - - def time_packers_read_stata(self): - pd.read_stata(self.f) - - -class packers_read_stata_with_validation(_Packers): - - def setup(self): - self._setup() - self.df['int8_'] = [randint(np.iinfo(np.int8).min, (np.iinfo(np.int8).max - 27)) for _ in range(self.N)] - self.df['int16_'] = [randint(np.iinfo(np.int16).min, (np.iinfo(np.int16).max - 27)) for _ in range(self.N)] - self.df['int32_'] = [randint(np.iinfo(np.int32).min, (np.iinfo(np.int32).max - 27)) for _ in range(self.N)] - self.df['float32_'] = np.array(randn(self.N), dtype=np.float32) - self.df.to_stata(self.f, {'index': 'tc', }) - - def time_packers_read_stata_with_validation(self): - pd.read_stata(self.f) - - -class packers_read_sas(_Packers): - - def setup(self): - - testdir = os.path.join(os.path.dirname(__file__), '..', '..', - 'pandas', 'tests', 'io', 'sas') - if not os.path.exists(testdir): - testdir = os.path.join(os.path.dirname(__file__), '..', '..', - 'pandas', 'io', 'tests', 'sas') - self.f = os.path.join(testdir, 'data', 'test1.sas7bdat') - self.f2 = os.path.join(testdir, 'data', 'paxraw_d_short.xpt') - - def time_read_sas7bdat(self): - pd.read_sas(self.f, format='sas7bdat') - - def time_read_xport(self): - pd.read_sas(self.f2, format='xport') - - -class CSV(_Packers): - - def setup(self): - self._setup() - - def time_write_csv(self): - self.df.to_csv(self.f) - - def teardown(self): - self.remove(self.f) - - -class Excel(_Packers): - - def setup(self): - self._setup() - self.bio = BytesIO() - - def time_write_excel_openpyxl(self): - self.bio.seek(0) - self.writer = pd.io.excel.ExcelWriter(self.bio, engine='openpyxl') - self.df[:2000].to_excel(self.writer) - self.writer.save() - - def time_write_excel_xlsxwriter(self): - self.bio.seek(0) - self.writer = pd.io.excel.ExcelWriter(self.bio, engine='xlsxwriter') - self.df[:2000].to_excel(self.writer) - self.writer.save() - - def time_write_excel_xlwt(self): - self.bio.seek(0) - self.writer = pd.io.excel.ExcelWriter(self.bio, engine='xlwt') - self.df[:2000].to_excel(self.writer) - self.writer.save() - - -class HDF(_Packers): - - def setup(self): - self._setup() - - def time_write_hdf_store(self): - self.df2.to_hdf(self.f, 'df') - - def time_write_hdf_table(self): - self.df2.to_hdf(self.f, 'df', table=True) - - def teardown(self): - self.remove(self.f) - -class JSON(_Packers): - - def setup(self): - self._setup() - self.df_date = self.df.copy() - self.df.index = np.arange(self.N) - self.cols = [(lambda i: ('{0}_timedelta'.format(i), [pd.Timedelta(('%d seconds' % randrange(1000000.0))) for _ in range(self.N)])), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N))), (lambda i: ('{0}_timestamp'.format(i), [pd.Timestamp((1418842918083256000 + randrange(1000000000.0, 1e+18, 200))) for _ in range(self.N)]))] - self.df_mixed = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) - - self.cols = [(lambda i: ('{0}_float'.format(i), randn(self.N))), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N)))] - self.df_mixed2 = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) - - self.cols = [(lambda i: ('{0}_float'.format(i), randn(self.N))), (lambda i: ('{0}_int'.format(i), randint(100000000.0, size=self.N))), (lambda i: ('{0}_str'.format(i), [('%08x' % randrange((16 ** 8))) for _ in range(self.N)]))] - self.df_mixed3 = DataFrame(OrderedDict([self.cols[(i % len(self.cols))](i) for i in range(self.C)]), index=self.index) - - def time_write_json(self): - self.df.to_json(self.f, orient='split') - - def time_write_json_T(self): - self.df.to_json(self.f, orient='columns') - - def time_write_json_date_index(self): - self.df_date.to_json(self.f, orient='split') - - def time_write_json_mixed_delta_int_tstamp(self): - self.df_mixed.to_json(self.f, orient='split') - - def time_write_json_mixed_float_int(self): - self.df_mixed2.to_json(self.f, orient='index') - - def time_write_json_mixed_float_int_T(self): - self.df_mixed2.to_json(self.f, orient='columns') - - def time_write_json_mixed_float_int_str(self): - self.df_mixed3.to_json(self.f, orient='split') - - def time_write_json_lines(self): - self.df.to_json(self.f, orient="records", lines=True) - - def teardown(self): - self.remove(self.f) - - -class MsgPack(_Packers): - - def setup(self): - self._setup() - - def time_write_msgpack(self): - self.df2.to_msgpack(self.f) - - def teardown(self): - self.remove(self.f) - - -class Pickle(_Packers): - - def setup(self): - self._setup() - - def time_write_pickle(self): - self.df2.to_pickle(self.f) - - def teardown(self): - self.remove(self.f) - - -class SQL(_Packers): - - def setup(self): - self._setup() - self.engine = create_engine('sqlite:///:memory:') - - def time_write_sql(self): - self.df2.to_sql('table', self.engine, if_exists='replace') - - -class STATA(_Packers): - - def setup(self): - self._setup() - - self.df3=self.df.copy() - self.df3['int8_'] = [randint(np.iinfo(np.int8).min, (np.iinfo(np.int8).max - 27)) for _ in range(self.N)] - self.df3['int16_'] = [randint(np.iinfo(np.int16).min, (np.iinfo(np.int16).max - 27)) for _ in range(self.N)] - self.df3['int32_'] = [randint(np.iinfo(np.int32).min, (np.iinfo(np.int32).max - 27)) for _ in range(self.N)] - self.df3['float32_'] = np.array(randn(self.N), dtype=np.float32) - - def time_write_stata(self): - self.df.to_stata(self.f, {'index': 'tc', }) - - def time_write_stata_with_validation(self): - self.df3.to_stata(self.f, {'index': 'tc', }) - - def teardown(self): - self.remove(self.f) diff --git a/asv_bench/benchmarks/pandas_vb_common.py b/asv_bench/benchmarks/pandas_vb_common.py index b1a58e49fe86c4..e255cd94f265bf 100644 --- a/asv_bench/benchmarks/pandas_vb_common.py +++ b/asv_bench/benchmarks/pandas_vb_common.py @@ -1,35 +1,43 @@ -from pandas import * -import pandas as pd -from numpy.random import randn -from numpy.random import randint -import pandas.util.testing as tm -import random -import numpy as np -import threading +import os from importlib import import_module -try: - from pandas.compat import range -except ImportError: - pass - -np.random.seed(1234) +import numpy as np +from pandas import Panel -# try em until it works! -for imp in ['pandas._libs.lib', 'pandas.lib', 'pandas_tseries']: +# Compatibility import for lib +for imp in ['pandas._libs.lib', 'pandas.lib']: try: lib = import_module(imp) break except: pass -try: - Panel = Panel -except Exception: - Panel = WidePanel +numeric_dtypes = [np.int64, np.int32, np.uint32, np.uint64, np.float32, + np.float64, np.int16, np.int8, np.uint16, np.uint8] +datetime_dtypes = [np.datetime64, np.timedelta64] + + +def setup(*args, **kwargs): + # This function just needs to be imported into each benchmark file to + # set up the random seed before each function. + # http://asv.readthedocs.io/en/latest/writing_benchmarks.html + np.random.seed(1234) + + +class BaseIO(object): + """ + Base class for IO benchmarks + """ + fname = None + + def remove(self, f): + """Remove created files""" + try: + os.remove(f) + except: + # On Windows, attempting to remove a file that is in use + # causes an exception to be raised + pass -# didn't add to namespace until later -try: - from pandas.core.index import MultiIndex -except ImportError: - pass + def teardown(self, *args, **kwargs): + self.remove(self.fname) diff --git a/asv_bench/benchmarks/panel_ctor.py b/asv_bench/benchmarks/panel_ctor.py index cc6071b054662f..ce946c76ed1996 100644 --- a/asv_bench/benchmarks/panel_ctor.py +++ b/asv_bench/benchmarks/panel_ctor.py @@ -1,65 +1,60 @@ -from .pandas_vb_common import * -from datetime import timedelta +import warnings +from datetime import datetime, timedelta +from pandas import DataFrame, DatetimeIndex, date_range -class Constructors1(object): - goal_time = 0.2 - - def setup(self): - self.data_frames = {} - self.start = datetime(1990, 1, 1) - self.end = datetime(2012, 1, 1) - for x in range(100): - self.end += timedelta(days=1) - self.dr = np.asarray(date_range(self.start, self.end)) - self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) - self.data_frames[x] = self.df - - def time_panel_from_dict_all_different_indexes(self): - Panel.from_dict(self.data_frames) +from .pandas_vb_common import Panel, setup # noqa -class Constructors2(object): +class DifferentIndexes(object): goal_time = 0.2 def setup(self): self.data_frames = {} + start = datetime(1990, 1, 1) + end = datetime(2012, 1, 1) for x in range(100): - self.dr = np.asarray(DatetimeIndex(start=datetime(1990, 1, 1), end=datetime(2012, 1, 1), freq='D')) - self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) - self.data_frames[x] = self.df + end += timedelta(days=1) + idx = date_range(start, end) + df = DataFrame({'a': 0, 'b': 1, 'c': 2}, index=idx) + self.data_frames[x] = df - def time_panel_from_dict_equiv_indexes(self): - Panel.from_dict(self.data_frames) + def time_from_dict(self): + with warnings.catch_warnings(record=True): + Panel.from_dict(self.data_frames) -class Constructors3(object): +class SameIndexes(object): + goal_time = 0.2 def setup(self): - self.dr = np.asarray(DatetimeIndex(start=datetime(1990, 1, 1), end=datetime(2012, 1, 1), freq='D')) - self.data_frames = {} - for x in range(100): - self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) - self.data_frames[x] = self.df + idx = DatetimeIndex(start=datetime(1990, 1, 1), + end=datetime(2012, 1, 1), + freq='D') + df = DataFrame({'a': 0, 'b': 1, 'c': 2}, index=idx) + self.data_frames = dict(enumerate([df] * 100)) - def time_panel_from_dict_same_index(self): - Panel.from_dict(self.data_frames) + def time_from_dict(self): + with warnings.catch_warnings(record=True): + Panel.from_dict(self.data_frames) -class Constructors4(object): +class TwoIndexes(object): + goal_time = 0.2 def setup(self): - self.data_frames = {} - self.start = datetime(1990, 1, 1) - self.end = datetime(2012, 1, 1) - for x in range(100): - if (x == 50): - self.end += timedelta(days=1) - self.dr = np.asarray(date_range(self.start, self.end)) - self.df = DataFrame({'a': ([0] * len(self.dr)), 'b': ([1] * len(self.dr)), 'c': ([2] * len(self.dr)), }, index=self.dr) - self.data_frames[x] = self.df - - def time_panel_from_dict_two_different_indexes(self): - Panel.from_dict(self.data_frames) + start = datetime(1990, 1, 1) + end = datetime(2012, 1, 1) + df1 = DataFrame({'a': 0, 'b': 1, 'c': 2}, + index=DatetimeIndex(start=start, end=end, freq='D')) + end += timedelta(days=1) + df2 = DataFrame({'a': 0, 'b': 1, 'c': 2}, + index=DatetimeIndex(start=start, end=end, freq='D')) + dfs = [df1] * 50 + [df2] * 50 + self.data_frames = dict(enumerate(dfs)) + + def time_from_dict(self): + with warnings.catch_warnings(record=True): + Panel.from_dict(self.data_frames) diff --git a/asv_bench/benchmarks/panel_methods.py b/asv_bench/benchmarks/panel_methods.py index 6609305502011b..a5b1a92e9cf679 100644 --- a/asv_bench/benchmarks/panel_methods.py +++ b/asv_bench/benchmarks/panel_methods.py @@ -1,24 +1,24 @@ -from .pandas_vb_common import * +import warnings +import numpy as np -class PanelMethods(object): - goal_time = 0.2 +from .pandas_vb_common import Panel, setup # noqa - def setup(self): - self.index = date_range(start='2000', freq='D', periods=1000) - self.panel = Panel(np.random.randn(100, len(self.index), 1000)) - def time_pct_change_items(self): - self.panel.pct_change(1, axis='items') +class PanelMethods(object): - def time_pct_change_major(self): - self.panel.pct_change(1, axis='major') + goal_time = 0.2 + params = ['items', 'major', 'minor'] + param_names = ['axis'] - def time_pct_change_minor(self): - self.panel.pct_change(1, axis='minor') + def setup(self, axis): + with warnings.catch_warnings(record=True): + self.panel = Panel(np.random.randn(100, 1000, 100)) - def time_shift(self): - self.panel.shift(1) + def time_pct_change(self, axis): + with warnings.catch_warnings(record=True): + self.panel.pct_change(1, axis=axis) - def time_shift_minor(self): - self.panel.shift(1, axis='minor') + def time_shift(self, axis): + with warnings.catch_warnings(record=True): + self.panel.shift(1, axis=axis) diff --git a/asv_bench/benchmarks/parser_vb.py b/asv_bench/benchmarks/parser_vb.py deleted file mode 100644 index 32bf7e50d1a896..00000000000000 --- a/asv_bench/benchmarks/parser_vb.py +++ /dev/null @@ -1,121 +0,0 @@ -from .pandas_vb_common import * -import os -from pandas import read_csv -try: - from cStringIO import StringIO -except ImportError: - from io import StringIO - - -class read_csv1(object): - goal_time = 0.2 - - def setup(self): - self.N = 10000 - self.K = 8 - self.df = DataFrame((np.random.randn(self.N, self.K) * np.random.randint(100, 10000, (self.N, self.K)))) - self.df.to_csv('test.csv', sep='|') - - self.format = (lambda x: '{:,}'.format(x)) - self.df2 = self.df.applymap(self.format) - self.df2.to_csv('test2.csv', sep='|') - - def time_sep(self): - read_csv('test.csv', sep='|') - - def time_thousands(self): - read_csv('test.csv', sep='|', thousands=',') - - def teardown(self): - os.remove('test.csv') - os.remove('test2.csv') - - -class read_csv2(object): - goal_time = 0.2 - - def setup(self): - self.data = ['A,B,C'] - self.data = (self.data + (['1,2,3 # comment'] * 100000)) - self.data = '\n'.join(self.data) - - def time_comment(self): - read_csv(StringIO(self.data), comment='#') - - -class read_csv3(object): - goal_time = 0.2 - - def setup(self): - self.data = """0.1213700904466425978256438611,0.0525708283766902484401839501,0.4174092731488769913994474336\n -0.4096341697147408700274695547,0.1587830198973579909349496119,0.1292545832485494372576795285\n -0.8323255650024565799327547210,0.9694902427379478160318626578,0.6295047811546814475747169126\n -0.4679375305798131323697930383,0.2963942381834381301075609371,0.5268936082160610157032465394\n -0.6685382761849776311890991564,0.6721207066140679753374342908,0.6519975277021627935170045020\n""" - self.data2 = self.data.replace(',', ';').replace('.', ',') - self.data = (self.data * 200) - self.data2 = (self.data2 * 200) - - def time_default_converter(self): - read_csv(StringIO(self.data), sep=',', header=None, - float_precision=None) - - def time_default_converter_with_decimal(self): - read_csv(StringIO(self.data2), sep=';', header=None, - float_precision=None, decimal=',') - - def time_default_converter_python_engine(self): - read_csv(StringIO(self.data), sep=',', header=None, - float_precision=None, engine='python') - - def time_default_converter_with_decimal_python_engine(self): - read_csv(StringIO(self.data2), sep=';', header=None, - float_precision=None, decimal=',', engine='python') - - def time_precise_converter(self): - read_csv(StringIO(self.data), sep=',', header=None, - float_precision='high') - - def time_roundtrip_converter(self): - read_csv(StringIO(self.data), sep=',', header=None, - float_precision='round_trip') - - -class read_csv_categorical(object): - goal_time = 0.2 - - def setup(self): - N = 100000 - group1 = ['aaaaaaaa', 'bbbbbbb', 'cccccccc', 'dddddddd', 'eeeeeeee'] - df = DataFrame({'a': np.random.choice(group1, N).astype('object'), - 'b': np.random.choice(group1, N).astype('object'), - 'c': np.random.choice(group1, N).astype('object')}) - df.to_csv('strings.csv', index=False) - - def time_convert_post(self): - read_csv('strings.csv').apply(pd.Categorical) - - def time_convert_direct(self): - read_csv('strings.csv', dtype='category') - - def teardown(self): - os.remove('strings.csv') - - -class read_csv_dateparsing(object): - goal_time = 0.2 - - def setup(self): - self.N = 10000 - self.K = 8 - self.data = 'KORD,19990127, 19:00:00, 18:56:00, 0.8100, 2.8100, 7.2000, 0.0000, 280.0000\n KORD,19990127, 20:00:00, 19:56:00, 0.0100, 2.2100, 7.2000, 0.0000, 260.0000\n KORD,19990127, 21:00:00, 20:56:00, -0.5900, 2.2100, 5.7000, 0.0000, 280.0000\n KORD,19990127, 21:00:00, 21:18:00, -0.9900, 2.0100, 3.6000, 0.0000, 270.0000\n KORD,19990127, 22:00:00, 21:56:00, -0.5900, 1.7100, 5.1000, 0.0000, 290.0000\n ' - self.data = (self.data * 200) - self.data2 = 'KORD,19990127 19:00:00, 18:56:00, 0.8100, 2.8100, 7.2000, 0.0000, 280.0000\n KORD,19990127 20:00:00, 19:56:00, 0.0100, 2.2100, 7.2000, 0.0000, 260.0000\n KORD,19990127 21:00:00, 20:56:00, -0.5900, 2.2100, 5.7000, 0.0000, 280.0000\n KORD,19990127 21:00:00, 21:18:00, -0.9900, 2.0100, 3.6000, 0.0000, 270.0000\n KORD,19990127 22:00:00, 21:56:00, -0.5900, 1.7100, 5.1000, 0.0000, 290.0000\n ' - self.data2 = (self.data2 * 200) - - def time_multiple_date(self): - read_csv(StringIO(self.data), sep=',', header=None, - parse_dates=[[1, 2], [1, 3]]) - - def time_baseline(self): - read_csv(StringIO(self.data2), sep=',', header=None, parse_dates=[1]) diff --git a/asv_bench/benchmarks/period.py b/asv_bench/benchmarks/period.py index df3c2bf3e4b464..c34f9a737473e9 100644 --- a/asv_bench/benchmarks/period.py +++ b/asv_bench/benchmarks/period.py @@ -1,143 +1,100 @@ -import pandas as pd -from pandas import Series, Period, PeriodIndex, date_range +from pandas import (DataFrame, Series, Period, PeriodIndex, date_range, + period_range) class PeriodProperties(object): - def setup(self): - self.per = Period('2012-06-01', freq='M') - def time_year(self): - self.per.year + params = (['M', 'min'], + ['year', 'month', 'day', 'hour', 'minute', 'second', + 'is_leap_year', 'quarter', 'qyear', 'week', 'daysinmonth', + 'dayofweek', 'dayofyear', 'start_time', 'end_time']) + param_names = ['freq', 'attr'] + + def setup(self, freq, attr): + self.per = Period('2012-06-01', freq=freq) - def time_month(self): - self.per.month + def time_property(self, freq, attr): + getattr(self.per, attr) - def time_quarter(self): - self.per.quarter - def time_day(self): - self.per.day +class PeriodUnaryMethods(object): - def time_hour(self): - self.per.hour + params = ['M', 'min'] + param_names = ['freq'] - def time_minute(self): - self.per.second + def setup(self, freq): + self.per = Period('2012-06-01', freq=freq) - def time_second(self): - self.per.second + def time_to_timestamp(self, freq): + self.per.to_timestamp() - def time_leap_year(self): - self.per.is_leapyear + def time_now(self, freq): + self.per.now(freq) + + def time_asfreq(self, freq): + self.per.asfreq('A') -class Constructor(object): +class PeriodIndexConstructor(object): + goal_time = 0.2 - def setup(self): + params = ['D'] + param_names = ['freq'] + + def setup(self, freq): self.rng = date_range('1985', periods=1000) self.rng2 = date_range('1985', periods=1000).to_pydatetime() - def time_from_date_range(self): - PeriodIndex(self.rng, freq='D') + def time_from_date_range(self, freq): + PeriodIndex(self.rng, freq=freq) + + def time_from_pydatetime(self, freq): + PeriodIndex(self.rng2, freq=freq) - def time_from_pydatetime(self): - PeriodIndex(self.rng2, freq='D') +class DataFramePeriodColumn(object): -class DataFrame(object): goal_time = 0.2 def setup(self): - self.rng = pd.period_range(start='1/1/1990', freq='S', periods=20000) - self.df = pd.DataFrame(index=range(len(self.rng))) + self.rng = period_range(start='1/1/1990', freq='S', periods=20000) + self.df = DataFrame(index=range(len(self.rng))) def time_setitem_period_column(self): self.df['col'] = self.rng + def time_set_index(self): + # GH#21582 limited by comparisons of Period objects + self.df['col2'] = self.rng + self.df.set_index('col2', append=True) + class Algorithms(object): + goal_time = 0.2 - def setup(self): + params = ['index', 'series'] + param_names = ['typ'] + + def setup(self, typ): data = [Period('2011-01', freq='M'), Period('2011-02', freq='M'), Period('2011-03', freq='M'), Period('2011-04', freq='M')] - self.s = Series(data * 1000) - self.i = PeriodIndex(data, freq='M') - - def time_drop_duplicates_pseries(self): - self.s.drop_duplicates() - - def time_drop_duplicates_pindex(self): - self.i.drop_duplicates() - - def time_value_counts_pseries(self): - self.s.value_counts() - - def time_value_counts_pindex(self): - self.i.value_counts() - -class Properties(object): - def setup(self): - self.per = Period('2017-09-06 08:28', freq='min') - - def time_year(self): - self.per.year - - def time_month(self): - self.per.month - - def time_day(self): - self.per.day - - def time_hour(self): - self.per.hour - - def time_minute(self): - self.per.minute - - def time_second(self): - self.per.second - - def time_is_leap_year(self): - self.per.is_leap_year - - def time_quarter(self): - self.per.quarter + if typ == 'index': + self.vector = PeriodIndex(data * 1000, freq='M') + elif typ == 'series': + self.vector = Series(data * 1000) - def time_qyear(self): - self.per.qyear + def time_drop_duplicates(self, typ): + self.vector.drop_duplicates() - def time_week(self): - self.per.week + def time_value_counts(self, typ): + self.vector.value_counts() - def time_daysinmonth(self): - self.per.daysinmonth - - def time_dayofweek(self): - self.per.dayofweek - - def time_dayofyear(self): - self.per.dayofyear - - def time_start_time(self): - self.per.start_time - - def time_end_time(self): - self.per.end_time - - def time_to_timestamp(): - self.per.to_timestamp() - - def time_now(): - self.per.now() - - def time_asfreq(): - self.per.asfreq('A') +class Indexing(object): -class period_standard_indexing(object): goal_time = 0.2 def setup(self): @@ -158,7 +115,7 @@ def time_series_loc(self): self.series.loc[self.period] def time_align(self): - pd.DataFrame({'a': self.series, 'b': self.series[:500]}) + DataFrame({'a': self.series, 'b': self.series[:500]}) def time_intersection(self): self.index[:750].intersection(self.index[250:]) diff --git a/asv_bench/benchmarks/plotting.py b/asv_bench/benchmarks/plotting.py index dda684b35e3018..5b49112b0e07d7 100644 --- a/asv_bench/benchmarks/plotting.py +++ b/asv_bench/benchmarks/plotting.py @@ -1,24 +1,44 @@ -from .pandas_vb_common import * -try: - from pandas import date_range -except ImportError: - def date_range(start=None, end=None, periods=None, freq=None): - return DatetimeIndex(start, end, periods=periods, offset=freq) +import numpy as np +from pandas import DataFrame, Series, DatetimeIndex, date_range try: from pandas.plotting import andrews_curves except ImportError: from pandas.tools.plotting import andrews_curves +import matplotlib +matplotlib.use('Agg') + +from .pandas_vb_common import setup # noqa + + +class Plotting(object): + + goal_time = 0.2 + + def setup(self): + self.s = Series(np.random.randn(1000000)) + self.df = DataFrame({'col': self.s}) + + def time_series_plot(self): + self.s.plot() + + def time_frame_plot(self): + self.df.plot() class TimeseriesPlotting(object): + goal_time = 0.2 def setup(self): - import matplotlib - matplotlib.use('Agg') - self.N = 2000 - self.M = 5 - self.df = DataFrame(np.random.randn(self.N, self.M), index=date_range('1/1/1975', periods=self.N)) + N = 2000 + M = 5 + idx = date_range('1/1/1975', periods=N) + self.df = DataFrame(np.random.randn(N, M), index=idx) + + idx_irregular = DatetimeIndex(np.concatenate((idx.values[0:10], + idx.values[12:]))) + self.df2 = DataFrame(np.random.randn(len(idx_irregular), M), + index=idx_irregular) def time_plot_regular(self): self.df.plot() @@ -26,18 +46,19 @@ def time_plot_regular(self): def time_plot_regular_compat(self): self.df.plot(x_compat=True) + def time_plot_irregular(self): + self.df2.plot() + class Misc(object): + goal_time = 0.6 def setup(self): - import matplotlib - matplotlib.use('Agg') - self.N = 500 - self.M = 10 - data_dict = {x: np.random.randn(self.N) for x in range(self.M)} - data_dict["Name"] = ["A"] * self.N - self.df = DataFrame(data_dict) + N = 500 + M = 10 + self.df = DataFrame(np.random.randn(N, M)) + self.df['Name'] = ["A"] * N def time_plot_andrews_curves(self): andrews_curves(self.df, "Name") diff --git a/asv_bench/benchmarks/reindex.py b/asv_bench/benchmarks/reindex.py index 537d275e7c727e..413427a16f40bf 100644 --- a/asv_bench/benchmarks/reindex.py +++ b/asv_bench/benchmarks/reindex.py @@ -1,89 +1,77 @@ -from .pandas_vb_common import * -from random import shuffle +import numpy as np +import pandas.util.testing as tm +from pandas import (DataFrame, Series, DatetimeIndex, MultiIndex, Index, + date_range) +from .pandas_vb_common import setup, lib # noqa -class Reindexing(object): +class Reindex(object): + goal_time = 0.2 def setup(self): - self.rng = DatetimeIndex(start='1/1/1970', periods=10000, freq='1min') - self.df = DataFrame(np.random.rand(10000, 10), index=self.rng, + rng = DatetimeIndex(start='1/1/1970', periods=10000, freq='1min') + self.df = DataFrame(np.random.rand(10000, 10), index=rng, columns=range(10)) self.df['foo'] = 'bar' - self.rng2 = Index(self.rng[::2]) - + self.rng_subset = Index(rng[::2]) self.df2 = DataFrame(index=range(10000), data=np.random.rand(10000, 30), columns=range(30)) - - # multi-index N = 5000 K = 200 level1 = tm.makeStringIndex(N).values.repeat(K) level2 = np.tile(tm.makeStringIndex(K).values, N) index = MultiIndex.from_arrays([level1, level2]) - self.s1 = Series(np.random.randn((N * K)), index=index) - self.s2 = self.s1[::2] + self.s = Series(np.random.randn(N * K), index=index) + self.s_subset = self.s[::2] def time_reindex_dates(self): - self.df.reindex(self.rng2) + self.df.reindex(self.rng_subset) def time_reindex_columns(self): self.df2.reindex(columns=self.df.columns[1:5]) def time_reindex_multiindex(self): - self.s1.reindex(self.s2.index) + self.s.reindex(self.s_subset.index) -#---------------------------------------------------------------------- -# Pad / backfill +class ReindexMethod(object): - -class FillMethod(object): goal_time = 0.2 + params = ['pad', 'backfill'] + param_names = ['method'] - def setup(self): - self.rng = date_range('1/1/2000', periods=100000, freq='1min') - self.ts = Series(np.random.randn(len(self.rng)), index=self.rng) - self.ts2 = self.ts[::2] - self.ts3 = self.ts2.reindex(self.ts.index) - self.ts4 = self.ts3.astype('float32') - - def pad(self, source_series, target_index): - try: - source_series.reindex(target_index, method='pad') - except: - source_series.reindex(target_index, fillMethod='pad') + def setup(self, method): + N = 100000 + self.idx = date_range('1/1/2000', periods=N, freq='1min') + self.ts = Series(np.random.randn(N), index=self.idx)[::2] - def backfill(self, source_series, target_index): - try: - source_series.reindex(target_index, method='backfill') - except: - source_series.reindex(target_index, fillMethod='backfill') + def time_reindex_method(self, method): + self.ts.reindex(self.idx, method=method) - def time_backfill_dates(self): - self.backfill(self.ts2, self.ts.index) - def time_pad_daterange(self): - self.pad(self.ts2, self.ts.index) +class Fillna(object): - def time_backfill(self): - self.ts3.fillna(method='backfill') - - def time_backfill_float32(self): - self.ts4.fillna(method='backfill') - - def time_pad(self): - self.ts3.fillna(method='pad') + goal_time = 0.2 + params = ['pad', 'backfill'] + param_names = ['method'] - def time_pad_float32(self): - self.ts4.fillna(method='pad') + def setup(self, method): + N = 100000 + self.idx = date_range('1/1/2000', periods=N, freq='1min') + ts = Series(np.random.randn(N), index=self.idx)[::2] + self.ts_reindexed = ts.reindex(self.idx) + self.ts_float32 = self.ts_reindexed.astype('float32') + def time_reindexed(self, method): + self.ts_reindexed.fillna(method=method) -#---------------------------------------------------------------------- -# align on level + def time_float_32(self, method): + self.ts_float32.fillna(method=method) class LevelAlign(object): + goal_time = 0.2 def setup(self): @@ -92,7 +80,6 @@ def setup(self): labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) - random.shuffle(self.index.values) self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) self.df_level = DataFrame(np.random.randn(100, 4), @@ -102,106 +89,84 @@ def time_align_level(self): self.df.align(self.df_level, level=1, copy=False) def time_reindex_level(self): - self.df_level.reindex(self.df.index, level=1) - + self.df_level.reindex(self.index, level=1) -#---------------------------------------------------------------------- -# drop_duplicates +class DropDuplicates(object): -class Duplicates(object): goal_time = 0.2 - - def setup(self): - self.N = 10000 - self.K = 10 - self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) - self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) - self.df = DataFrame({'key1': self.key1, 'key2': self.key2, - 'value': np.random.randn((self.N * self.K)),}) - self.col_array_list = list(self.df.values.T) - - self.df2 = self.df.copy() - self.df2.ix[:10000, :] = np.nan + params = [True, False] + param_names = ['inplace'] + + def setup(self, inplace): + N = 10000 + K = 10 + key1 = tm.makeStringIndex(N).values.repeat(K) + key2 = tm.makeStringIndex(N).values.repeat(K) + self.df = DataFrame({'key1': key1, 'key2': key2, + 'value': np.random.randn(N * K)}) + self.df_nan = self.df.copy() + self.df_nan.iloc[:10000, :] = np.nan self.s = Series(np.random.randint(0, 1000, size=10000)) - self.s2 = Series(np.tile(tm.makeStringIndex(1000).values, 10)) - - np.random.seed(1234) - self.N = 1000000 - self.K = 10000 - self.key1 = np.random.randint(0, self.K, size=self.N) - self.df_int = DataFrame({'key1': self.key1}) - self.df_bool = DataFrame({i: np.random.randint(0, 2, size=self.K, - dtype=bool) - for i in range(10)}) - - def time_frame_drop_dups(self): - self.df.drop_duplicates(['key1', 'key2']) - - def time_frame_drop_dups_inplace(self): - self.df.drop_duplicates(['key1', 'key2'], inplace=True) + self.s_str = Series(np.tile(tm.makeStringIndex(1000).values, 10)) - def time_frame_drop_dups_na(self): - self.df2.drop_duplicates(['key1', 'key2']) + N = 1000000 + K = 10000 + key1 = np.random.randint(0, K, size=N) + self.df_int = DataFrame({'key1': key1}) + self.df_bool = DataFrame(np.random.randint(0, 2, size=(K, 10), + dtype=bool)) - def time_frame_drop_dups_na_inplace(self): - self.df2.drop_duplicates(['key1', 'key2'], inplace=True) + def time_frame_drop_dups(self, inplace): + self.df.drop_duplicates(['key1', 'key2'], inplace=inplace) - def time_series_drop_dups_int(self): - self.s.drop_duplicates() + def time_frame_drop_dups_na(self, inplace): + self.df_nan.drop_duplicates(['key1', 'key2'], inplace=inplace) - def time_series_drop_dups_string(self): - self.s2.drop_duplicates() + def time_series_drop_dups_int(self, inplace): + self.s.drop_duplicates(inplace=inplace) - def time_frame_drop_dups_int(self): - self.df_int.drop_duplicates() + def time_series_drop_dups_string(self, inplace): + self.s_str.drop_duplicates(inplace=inplace) - def time_frame_drop_dups_bool(self): - self.df_bool.drop_duplicates() + def time_frame_drop_dups_int(self, inplace): + self.df_int.drop_duplicates(inplace=inplace) -#---------------------------------------------------------------------- -# blog "pandas escaped the zoo" + def time_frame_drop_dups_bool(self, inplace): + self.df_bool.drop_duplicates(inplace=inplace) class Align(object): + # blog "pandas escaped the zoo" goal_time = 0.2 def setup(self): n = 50000 indices = tm.makeStringIndex(n) subsample_size = 40000 - - def sample(values, k): - sampler = np.arange(len(values)) - shuffle(sampler) - return values.take(sampler[:k]) - - self.x = Series(np.random.randn(50000), indices) + self.x = Series(np.random.randn(n), indices) self.y = Series(np.random.randn(subsample_size), - index=sample(indices, subsample_size)) + index=np.random.choice(indices, subsample_size, + replace=False)) def time_align_series_irregular_string(self): - (self.x + self.y) + self.x + self.y class LibFastZip(object): + goal_time = 0.2 def setup(self): - self.N = 10000 - self.K = 10 - self.key1 = tm.makeStringIndex(self.N).values.repeat(self.K) - self.key2 = tm.makeStringIndex(self.N).values.repeat(self.K) - self.df = DataFrame({'key1': self.key1, 'key2': self.key2, 'value': np.random.randn((self.N * self.K)), }) - self.col_array_list = list(self.df.values.T) - - self.df2 = self.df.copy() - self.df2.ix[:10000, :] = np.nan - self.col_array_list2 = list(self.df2.values.T) + N = 10000 + K = 10 + key1 = tm.makeStringIndex(N).values.repeat(K) + key2 = tm.makeStringIndex(N).values.repeat(K) + col_array = np.vstack([key1, key2, np.random.randn(N * K)]) + col_array2 = col_array.copy() + col_array2[:, :10000] = np.nan + self.col_array_list = list(col_array) def time_lib_fast_zip(self): lib.fast_zip(self.col_array_list) - - def time_lib_fast_zip_fillna(self): - lib.fast_zip_fillna(self.col_array_list2) diff --git a/asv_bench/benchmarks/replace.py b/asv_bench/benchmarks/replace.py index 63562f90eab2b6..41208125e8f321 100644 --- a/asv_bench/benchmarks/replace.py +++ b/asv_bench/benchmarks/replace.py @@ -1,70 +1,58 @@ -from .pandas_vb_common import * +import numpy as np +import pandas as pd +from .pandas_vb_common import setup # noqa -class replace_fillna(object): - goal_time = 0.2 - - def setup(self): - self.N = 1000000 - try: - self.rng = date_range('1/1/2000', periods=self.N, freq='min') - except NameError: - self.rng = DatetimeIndex('1/1/2000', periods=self.N, offset=datetools.Minute()) - self.date_range = DateRange - self.ts = Series(np.random.randn(self.N), index=self.rng) - def time_replace_fillna(self): - self.ts.fillna(0.0, inplace=True) +class FillNa(object): - -class replace_large_dict(object): goal_time = 0.2 + params = [True, False] + param_names = ['inplace'] - def setup(self): - self.n = (10 ** 6) - self.start_value = (10 ** 5) - self.to_rep = dict(((i, (self.start_value + i)) for i in range(self.n))) - self.s = Series(np.random.randint(self.n, size=(10 ** 3))) - - def time_replace_large_dict(self): - self.s.replace(self.to_rep, inplace=True) + def setup(self, inplace): + N = 10**6 + rng = pd.date_range('1/1/2000', periods=N, freq='min') + data = np.random.randn(N) + data[::2] = np.nan + self.ts = pd.Series(data, index=rng) + def time_fillna(self, inplace): + self.ts.fillna(0.0, inplace=inplace) -class replace_convert(object): - goal_time = 0.5 + def time_replace(self, inplace): + self.ts.replace(np.nan, 0.0, inplace=inplace) - def setup(self): - self.n = (10 ** 3) - self.to_ts = dict(((i, pd.Timestamp(i)) for i in range(self.n))) - self.to_td = dict(((i, pd.Timedelta(i)) for i in range(self.n))) - self.s = Series(np.random.randint(self.n, size=(10 ** 3))) - self.df = DataFrame({'A': np.random.randint(self.n, size=(10 ** 3)), - 'B': np.random.randint(self.n, size=(10 ** 3))}) - def time_replace_series_timestamp(self): - self.s.replace(self.to_ts) +class ReplaceDict(object): - def time_replace_series_timedelta(self): - self.s.replace(self.to_td) + goal_time = 0.2 + params = [True, False] + param_names = ['inplace'] - def time_replace_frame_timestamp(self): - self.df.replace(self.to_ts) + def setup(self, inplace): + N = 10**5 + start_value = 10**5 + self.to_rep = dict(enumerate(np.arange(N) + start_value)) + self.s = pd.Series(np.random.randint(N, size=10**3)) - def time_replace_frame_timedelta(self): - self.df.replace(self.to_td) + def time_replace_series(self, inplace): + self.s.replace(self.to_rep, inplace=inplace) -class replace_replacena(object): - goal_time = 0.2 +class Convert(object): - def setup(self): - self.N = 1000000 - try: - self.rng = date_range('1/1/2000', periods=self.N, freq='min') - except NameError: - self.rng = DatetimeIndex('1/1/2000', periods=self.N, offset=datetools.Minute()) - self.date_range = DateRange - self.ts = Series(np.random.randn(self.N), index=self.rng) - - def time_replace_replacena(self): - self.ts.replace(np.nan, 0.0, inplace=True) + goal_time = 0.5 + params = (['DataFrame', 'Series'], ['Timestamp', 'Timedelta']) + param_names = ['constructor', 'replace_data'] + + def setup(self, constructor, replace_data): + N = 10**3 + data = {'Series': pd.Series(np.random.randint(N, size=N)), + 'DataFrame': pd.DataFrame({'A': np.random.randint(N, size=N), + 'B': np.random.randint(N, size=N)})} + self.to_replace = {i: getattr(pd, replace_data) for i in range(N)} + self.data = data[constructor] + + def time_replace(self, constructor, replace_data): + self.data.replace(self.to_replace) diff --git a/asv_bench/benchmarks/reshape.py b/asv_bench/benchmarks/reshape.py index 177e3e7cb87fac..3cf9a32dab3984 100644 --- a/asv_bench/benchmarks/reshape.py +++ b/asv_bench/benchmarks/reshape.py @@ -1,13 +1,18 @@ -from .pandas_vb_common import * -from pandas import melt, wide_to_long +import string +from itertools import product +import numpy as np +from pandas import DataFrame, MultiIndex, date_range, melt, wide_to_long +import pandas as pd + +from .pandas_vb_common import setup # noqa + + +class Melt(object): -class melt_dataframe(object): goal_time = 0.2 def setup(self): - self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) - self.df = DataFrame(np.random.randn(10000, 4), index=self.index) self.df = DataFrame(np.random.randn(10000, 3), columns=['A', 'B', 'C']) self.df['id1'] = np.random.randint(0, 10, 10000) self.df['id2'] = np.random.randint(100, 1000, 10000) @@ -16,50 +21,42 @@ def time_melt_dataframe(self): melt(self.df, id_vars=['id1', 'id2']) -class reshape_pivot_time_series(object): +class Pivot(object): + goal_time = 0.2 def setup(self): - self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) - self.df = DataFrame(np.random.randn(10000, 4), index=self.index) - self.index = date_range('1/1/2000', periods=10000, freq='h') - self.df = DataFrame(randn(10000, 50), index=self.index, columns=range(50)) - self.pdf = self.unpivot(self.df) - self.f = (lambda : self.pdf.pivot('date', 'variable', 'value')) + N = 10000 + index = date_range('1/1/2000', periods=N, freq='h') + data = {'value': np.random.randn(N * 50), + 'variable': np.arange(50).repeat(N), + 'date': np.tile(index.values, 50)} + self.df = DataFrame(data) def time_reshape_pivot_time_series(self): - self.f() + self.df.pivot('date', 'variable', 'value') - def unpivot(self, frame): - (N, K) = frame.shape - self.data = {'value': frame.values.ravel('F'), 'variable': np.asarray(frame.columns).repeat(N), 'date': np.tile(np.asarray(frame.index), K), } - return DataFrame(self.data, columns=['date', 'variable', 'value']) +class SimpleReshape(object): -class reshape_stack_simple(object): goal_time = 0.2 def setup(self): - self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) - self.df = DataFrame(np.random.randn(10000, 4), index=self.index) + arrays = [np.arange(100).repeat(100), + np.roll(np.tile(np.arange(100), 100), 25)] + index = MultiIndex.from_arrays(arrays) + self.df = DataFrame(np.random.randn(10000, 4), index=index) self.udf = self.df.unstack(1) - def time_reshape_stack_simple(self): + def time_stack(self): self.udf.stack() - -class reshape_unstack_simple(object): - goal_time = 0.2 - - def setup(self): - self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) - self.df = DataFrame(np.random.randn(10000, 4), index=self.index) - - def time_reshape_unstack_simple(self): + def time_unstack(self): self.df.unstack(1) -class reshape_unstack_large_single_dtype(object): +class Unstack(object): + goal_time = 0.2 def setup(self): @@ -67,53 +64,89 @@ def setup(self): n = 1000 levels = np.arange(m) - index = pd.MultiIndex.from_product([levels]*2) + index = MultiIndex.from_product([levels] * 2) columns = np.arange(n) - values = np.arange(m*m*n).reshape(m*m, n) - self.df = pd.DataFrame(values, index, columns) + values = np.arange(m * m * n).reshape(m * m, n) + self.df = DataFrame(values, index, columns) self.df2 = self.df.iloc[:-1] - def time_unstack_full_product(self): + def time_full_product(self): self.df.unstack() - def time_unstack_with_mask(self): + def time_without_last_row(self): self.df2.unstack() -class unstack_sparse_keyspace(object): +class SparseIndex(object): + goal_time = 0.2 def setup(self): - self.index = MultiIndex.from_arrays([np.arange(100).repeat(100), np.roll(np.tile(np.arange(100), 100), 25)]) - self.df = DataFrame(np.random.randn(10000, 4), index=self.index) - self.NUM_ROWS = 1000 - for iter in range(10): - self.df = DataFrame({'A': np.random.randint(50, size=self.NUM_ROWS), 'B': np.random.randint(50, size=self.NUM_ROWS), 'C': np.random.randint((-10), 10, size=self.NUM_ROWS), 'D': np.random.randint((-10), 10, size=self.NUM_ROWS), 'E': np.random.randint(10, size=self.NUM_ROWS), 'F': np.random.randn(self.NUM_ROWS), }) - self.idf = self.df.set_index(['A', 'B', 'C', 'D', 'E']) - if (len(self.idf.index.unique()) == self.NUM_ROWS): - break + NUM_ROWS = 1000 + self.df = DataFrame({'A': np.random.randint(50, size=NUM_ROWS), + 'B': np.random.randint(50, size=NUM_ROWS), + 'C': np.random.randint(-10, 10, size=NUM_ROWS), + 'D': np.random.randint(-10, 10, size=NUM_ROWS), + 'E': np.random.randint(10, size=NUM_ROWS), + 'F': np.random.randn(NUM_ROWS)}) + self.df = self.df.set_index(['A', 'B', 'C', 'D', 'E']) + + def time_unstack(self): + self.df.unstack() - def time_unstack_sparse_keyspace(self): - self.idf.unstack() +class WideToLong(object): -class wide_to_long_big(object): goal_time = 0.2 def setup(self): - vars = 'ABCD' nyrs = 20 nidvars = 20 N = 5000 - yrvars = [] - for var in vars: - for yr in range(1, nyrs + 1): - yrvars.append(var + str(yr)) - - self.df = pd.DataFrame(np.random.randn(N, nidvars + len(yrvars)), - columns=list(range(nidvars)) + yrvars) - self.vars = vars + self.letters = list('ABCD') + yrvars = [l + str(num) + for l, num in product(self.letters, range(1, nyrs + 1))] + columns = [str(i) for i in range(nidvars)] + yrvars + self.df = DataFrame(np.random.randn(N, nidvars + len(yrvars)), + columns=columns) + self.df['id'] = self.df.index def time_wide_to_long_big(self): - self.df['id'] = self.df.index - wide_to_long(self.df, list(self.vars), i='id', j='year') + wide_to_long(self.df, self.letters, i='id', j='year') + + +class PivotTable(object): + + goal_time = 0.2 + + def setup(self): + N = 100000 + fac1 = np.array(['A', 'B', 'C'], dtype='O') + fac2 = np.array(['one', 'two'], dtype='O') + ind1 = np.random.randint(0, 3, size=N) + ind2 = np.random.randint(0, 2, size=N) + self.df = DataFrame({'key1': fac1.take(ind1), + 'key2': fac2.take(ind2), + 'key3': fac2.take(ind2), + 'value1': np.random.randn(N), + 'value2': np.random.randn(N), + 'value3': np.random.randn(N)}) + + def time_pivot_table(self): + self.df.pivot_table(index='key1', columns=['key2', 'key3']) + + +class GetDummies(object): + goal_time = 0.2 + + def setup(self): + categories = list(string.ascii_letters[:12]) + s = pd.Series(np.random.choice(categories, size=1000000), + dtype=pd.api.types.CategoricalDtype(categories)) + self.s = s + + def time_get_dummies_1d(self): + pd.get_dummies(self.s, sparse=False) + + def time_get_dummies_1d_sparse(self): + pd.get_dummies(self.s, sparse=True) diff --git a/asv_bench/benchmarks/rolling.py b/asv_bench/benchmarks/rolling.py index 899349cd21f840..e3bf551fa5f2b3 100644 --- a/asv_bench/benchmarks/rolling.py +++ b/asv_bench/benchmarks/rolling.py @@ -1,185 +1,79 @@ -from .pandas_vb_common import * import pandas as pd import numpy as np - -class DataframeRolling(object): - goal_time = 0.2 - - def setup(self): - self.N = 100000 - self.Ns = 10000 - self.df = pd.DataFrame({'a': np.random.random(self.N)}) - self.dfs = pd.DataFrame({'a': np.random.random(self.Ns)}) - self.wins = 10 - self.winl = 1000 - - def time_rolling_quantile_0(self): - (self.df.rolling(self.wins).quantile(0.0)) - - def time_rolling_quantile_1(self): - (self.df.rolling(self.wins).quantile(1.0)) - - def time_rolling_quantile_median(self): - (self.df.rolling(self.wins).quantile(0.5)) - - def time_rolling_median(self): - (self.df.rolling(self.wins).median()) - - def time_rolling_mean(self): - (self.df.rolling(self.wins).mean()) - - def time_rolling_max(self): - (self.df.rolling(self.wins).max()) - - def time_rolling_min(self): - (self.df.rolling(self.wins).min()) - - def time_rolling_std(self): - (self.df.rolling(self.wins).std()) - - def time_rolling_count(self): - (self.df.rolling(self.wins).count()) - - def time_rolling_skew(self): - (self.df.rolling(self.wins).skew()) - - def time_rolling_kurt(self): - (self.df.rolling(self.wins).kurt()) - - def time_rolling_sum(self): - (self.df.rolling(self.wins).sum()) - - def time_rolling_corr(self): - (self.dfs.rolling(self.wins).corr()) - - def time_rolling_cov(self): - (self.dfs.rolling(self.wins).cov()) - - def time_rolling_quantile_0_l(self): - (self.df.rolling(self.winl).quantile(0.0)) - - def time_rolling_quantile_1_l(self): - (self.df.rolling(self.winl).quantile(1.0)) - - def time_rolling_quantile_median_l(self): - (self.df.rolling(self.winl).quantile(0.5)) - - def time_rolling_median_l(self): - (self.df.rolling(self.winl).median()) - - def time_rolling_mean_l(self): - (self.df.rolling(self.winl).mean()) - - def time_rolling_max_l(self): - (self.df.rolling(self.winl).max()) - - def time_rolling_min_l(self): - (self.df.rolling(self.winl).min()) - - def time_rolling_std_l(self): - (self.df.rolling(self.wins).std()) - - def time_rolling_count_l(self): - (self.df.rolling(self.wins).count()) - - def time_rolling_skew_l(self): - (self.df.rolling(self.wins).skew()) - - def time_rolling_kurt_l(self): - (self.df.rolling(self.wins).kurt()) - - def time_rolling_sum_l(self): - (self.df.rolling(self.wins).sum()) - - -class SeriesRolling(object): - goal_time = 0.2 - - def setup(self): - self.N = 100000 - self.Ns = 10000 - self.df = pd.DataFrame({'a': np.random.random(self.N)}) - self.dfs = pd.DataFrame({'a': np.random.random(self.Ns)}) - self.sr = self.df.a - self.srs = self.dfs.a - self.wins = 10 - self.winl = 1000 - - def time_rolling_quantile_0(self): - (self.sr.rolling(self.wins).quantile(0.0)) - - def time_rolling_quantile_1(self): - (self.sr.rolling(self.wins).quantile(1.0)) - - def time_rolling_quantile_median(self): - (self.sr.rolling(self.wins).quantile(0.5)) - - def time_rolling_median(self): - (self.sr.rolling(self.wins).median()) - - def time_rolling_mean(self): - (self.sr.rolling(self.wins).mean()) - - def time_rolling_max(self): - (self.sr.rolling(self.wins).max()) - - def time_rolling_min(self): - (self.sr.rolling(self.wins).min()) - - def time_rolling_std(self): - (self.sr.rolling(self.wins).std()) - - def time_rolling_count(self): - (self.sr.rolling(self.wins).count()) - - def time_rolling_skew(self): - (self.sr.rolling(self.wins).skew()) - - def time_rolling_kurt(self): - (self.sr.rolling(self.wins).kurt()) - - def time_rolling_sum(self): - (self.sr.rolling(self.wins).sum()) - - def time_rolling_corr(self): - (self.srs.rolling(self.wins).corr()) - - def time_rolling_cov(self): - (self.srs.rolling(self.wins).cov()) - - def time_rolling_quantile_0_l(self): - (self.sr.rolling(self.winl).quantile(0.0)) - - def time_rolling_quantile_1_l(self): - (self.sr.rolling(self.winl).quantile(1.0)) - - def time_rolling_quantile_median_l(self): - (self.sr.rolling(self.winl).quantile(0.5)) - - def time_rolling_median_l(self): - (self.sr.rolling(self.winl).median()) - - def time_rolling_mean_l(self): - (self.sr.rolling(self.winl).mean()) - - def time_rolling_max_l(self): - (self.sr.rolling(self.winl).max()) - - def time_rolling_min_l(self): - (self.sr.rolling(self.winl).min()) - - def time_rolling_std_l(self): - (self.sr.rolling(self.wins).std()) - - def time_rolling_count_l(self): - (self.sr.rolling(self.wins).count()) - - def time_rolling_skew_l(self): - (self.sr.rolling(self.wins).skew()) - - def time_rolling_kurt_l(self): - (self.sr.rolling(self.wins).kurt()) - - def time_rolling_sum_l(self): - (self.sr.rolling(self.wins).sum()) +from .pandas_vb_common import setup # noqa + + +class Methods(object): + + sample_time = 0.2 + params = (['DataFrame', 'Series'], + [10, 1000], + ['int', 'float'], + ['median', 'mean', 'max', 'min', 'std', 'count', 'skew', 'kurt', + 'sum']) + param_names = ['contructor', 'window', 'dtype', 'method'] + + def setup(self, constructor, window, dtype, method): + N = 10**5 + arr = (100 * np.random.random(N)).astype(dtype) + self.roll = getattr(pd, constructor)(arr).rolling(window) + + def time_rolling(self, constructor, window, dtype, method): + getattr(self.roll, method)() + + +class VariableWindowMethods(Methods): + sample_time = 0.2 + params = (['DataFrame', 'Series'], + ['50s', '1h', '1d'], + ['int', 'float'], + ['median', 'mean', 'max', 'min', 'std', 'count', 'skew', 'kurt', + 'sum']) + param_names = ['contructor', 'window', 'dtype', 'method'] + + def setup(self, constructor, window, dtype, method): + N = 10**5 + arr = (100 * np.random.random(N)).astype(dtype) + index = pd.date_range('2017-01-01', periods=N, freq='5s') + self.roll = getattr(pd, constructor)(arr, index=index).rolling(window) + + +class Pairwise(object): + + sample_time = 0.2 + params = ([10, 1000, None], + ['corr', 'cov'], + [True, False]) + param_names = ['window', 'method', 'pairwise'] + + def setup(self, window, method, pairwise): + N = 10**4 + arr = np.random.random(N) + self.df = pd.DataFrame(arr) + + def time_pairwise(self, window, method, pairwise): + if window is None: + r = self.df.expanding() + else: + r = self.df.rolling(window=window) + getattr(r, method)(self.df, pairwise=pairwise) + + +class Quantile(object): + sample_time = 0.2 + params = (['DataFrame', 'Series'], + [10, 1000], + ['int', 'float'], + [0, 0.5, 1], + ['linear', 'nearest', 'lower', 'higher', 'midpoint']) + param_names = ['constructor', 'window', 'dtype', 'percentile'] + + def setup(self, constructor, window, dtype, percentile, interpolation): + N = 10 ** 5 + arr = np.random.random(N).astype(dtype) + self.roll = getattr(pd, constructor)(arr).rolling(window) + + def time_quantile(self, constructor, window, dtype, percentile, + interpolation): + self.roll.quantile(percentile, interpolation=interpolation) diff --git a/asv_bench/benchmarks/series_methods.py b/asv_bench/benchmarks/series_methods.py index 3c0e2869357ae8..a26c5d89bc4839 100644 --- a/asv_bench/benchmarks/series_methods.py +++ b/asv_bench/benchmarks/series_methods.py @@ -1,133 +1,194 @@ -from .pandas_vb_common import * +from datetime import datetime +import numpy as np +import pandas.util.testing as tm +from pandas import Series, date_range, NaT + +from .pandas_vb_common import setup # noqa + + +class SeriesConstructor(object): -class series_constructor_no_data_datetime_index(object): goal_time = 0.2 + params = [None, 'dict'] + param_names = ['data'] - def setup(self): - self.dr = pd.date_range( - start=datetime(2015,10,26), - end=datetime(2016,1,1), - freq='50s' - ) # ~100k long + def setup(self, data): + self.idx = date_range(start=datetime(2015, 10, 26), + end=datetime(2016, 1, 1), + freq='50s') + dict_data = dict(zip(self.idx, range(len(self.idx)))) + self.data = None if data is None else dict_data - def time_series_constructor_no_data_datetime_index(self): - Series(data=None, index=self.dr) + def time_constructor(self, data): + Series(data=self.data, index=self.idx) -class series_constructor_dict_data_datetime_index(object): +class IsIn(object): + goal_time = 0.2 + params = ['int64', 'object'] + param_names = ['dtype'] - def setup(self): - self.dr = pd.date_range( - start=datetime(2015, 10, 26), - end=datetime(2016, 1, 1), - freq='50s' - ) # ~100k long - self.data = {d: v for d, v in zip(self.dr, range(len(self.dr)))} + def setup(self, dtype): + self.s = Series(np.random.randint(1, 10, 100000)).astype(dtype) + self.values = [1, 2] - def time_series_constructor_no_data_datetime_index(self): - Series(data=self.data, index=self.dr) + def time_isin(self, dtypes): + self.s.isin(self.values) -class series_isin_int64(object): - goal_time = 0.2 +class IsInFloat64(object): def setup(self): - self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') - self.s4 = Series(np.random.randint(1, 100, 10000000)).astype('int64') - self.values = [1, 2] + self.small = Series([1, 2], dtype=np.float64) + self.many_different_values = np.arange(10**6, dtype=np.float64) + self.few_different_values = np.zeros(10**7, dtype=np.float64) + self.only_nans_values = np.full(10**7, np.nan, dtype=np.float64) - def time_series_isin_int64(self): - self.s3.isin(self.values) + def time_isin_many_different(self): + # runtime is dominated by creation of the lookup-table + self.small.isin(self.many_different_values) - def time_series_isin_int64_large(self): - self.s4.isin(self.values) + def time_isin_few_different(self): + # runtime is dominated by creation of the lookup-table + self.small.isin(self.few_different_values) + def time_isin_nan_values(self): + # runtime is dominated by creation of the lookup-table + self.small.isin(self.few_different_values) -class series_isin_object(object): - goal_time = 0.2 + +class IsInForObjects(object): def setup(self): - self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') - self.values = [1, 2] - self.s4 = self.s3.astype('object') + self.s_nans = Series(np.full(10**4, np.nan)).astype(np.object) + self.vals_nans = np.full(10**4, np.nan).astype(np.object) + self.s_short = Series(np.arange(2)).astype(np.object) + self.s_long = Series(np.arange(10**5)).astype(np.object) + self.vals_short = np.arange(2).astype(np.object) + self.vals_long = np.arange(10**5).astype(np.object) + # because of nans floats are special: + self.s_long_floats = Series(np.arange(10**5, + dtype=np.float)).astype(np.object) + self.vals_long_floats = np.arange(10**5, + dtype=np.float).astype(np.object) + + def time_isin_nans(self): + # if nan-objects are different objects, + # this has the potential to trigger O(n^2) running time + self.s_nans.isin(self.vals_nans) + + def time_isin_short_series_long_values(self): + # running time dominated by the preprocessing + self.s_short.isin(self.vals_long) + + def time_isin_long_series_short_values(self): + # running time dominated by look-up + self.s_long.isin(self.vals_short) + + def time_isin_long_series_long_values(self): + # no dominating part + self.s_long.isin(self.vals_long) + + def time_isin_long_series_long_values_floats(self): + # no dominating part + self.s_long_floats.isin(self.vals_long_floats) + + +class NSort(object): - def time_series_isin_object(self): - self.s4.isin(self.values) + goal_time = 0.2 + params = ['first', 'last', 'all'] + param_names = ['keep'] + def setup(self, keep): + self.s = Series(np.random.randint(1, 10, 100000)) -class series_nlargest1(object): - goal_time = 0.2 + def time_nlargest(self, keep): + self.s.nlargest(3, keep=keep) - def setup(self): - self.s1 = Series(np.random.randn(10000)) - self.s2 = Series(np.random.randint(1, 10, 10000)) - self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') - self.values = [1, 2] - self.s4 = self.s3.astype('object') + def time_nsmallest(self, keep): + self.s.nsmallest(3, keep=keep) - def time_series_nlargest1(self): - self.s1.nlargest(3, keep='last') - self.s1.nlargest(3, keep='first') +class Dropna(object): -class series_nlargest2(object): goal_time = 0.2 + params = ['int', 'datetime'] + param_names = ['dtype'] + + def setup(self, dtype): + N = 10**6 + data = {'int': np.random.randint(1, 10, N), + 'datetime': date_range('2000-01-01', freq='S', periods=N)} + self.s = Series(data[dtype]) + if dtype == 'datetime': + self.s[np.random.randint(1, N, 100)] = NaT + + def time_dropna(self, dtype): + self.s.dropna() - def setup(self): - self.s1 = Series(np.random.randn(10000)) - self.s2 = Series(np.random.randint(1, 10, 10000)) - self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') - self.values = [1, 2] - self.s4 = self.s3.astype('object') - def time_series_nlargest2(self): - self.s2.nlargest(3, keep='last') - self.s2.nlargest(3, keep='first') +class Map(object): + + goal_time = 0.2 + params = ['dict', 'Series'] + param_names = 'mapper' + + def setup(self, mapper): + map_size = 1000 + map_data = Series(map_size - np.arange(map_size)) + self.map_data = map_data if mapper == 'Series' else map_data.to_dict() + self.s = Series(np.random.randint(0, map_size, 10000)) + + def time_map(self, mapper): + self.s.map(self.map_data) + +class Clip(object): -class series_nsmallest2(object): goal_time = 0.2 def setup(self): - self.s1 = Series(np.random.randn(10000)) - self.s2 = Series(np.random.randint(1, 10, 10000)) - self.s3 = Series(np.random.randint(1, 10, 100000)).astype('int64') - self.values = [1, 2] - self.s4 = self.s3.astype('object') + self.s = Series(np.random.randn(50)) + + def time_clip(self): + self.s.clip(0, 1) - def time_series_nsmallest2(self): - self.s2.nsmallest(3, keep='last') - self.s2.nsmallest(3, keep='first') +class ValueCounts(object): -class series_dropna_int64(object): goal_time = 0.2 + params = ['int', 'float', 'object'] + param_names = ['dtype'] - def setup(self): - self.s = Series(np.random.randint(1, 10, 1000000)) + def setup(self, dtype): + self.s = Series(np.random.randint(0, 1000, size=100000)).astype(dtype) + + def time_value_counts(self, dtype): + self.s.value_counts() - def time_series_dropna_int64(self): - self.s.dropna() +class Dir(object): -class series_dropna_datetime(object): goal_time = 0.2 def setup(self): - self.s = Series(pd.date_range('2000-01-01', freq='S', periods=1000000)) - self.s[np.random.randint(1, 1000000, 100)] = pd.NaT + self.s = Series(index=tm.makeStringIndex(10000)) - def time_series_dropna_datetime(self): - self.s.dropna() + def time_dir_strings(self): + dir(self.s) -class series_clip(object): +class SeriesGetattr(object): + # https://github.com/pandas-dev/pandas/issues/19764 goal_time = 0.2 def setup(self): - self.s = pd.Series(np.random.randn(50)) + self.s = Series(1, + index=date_range("2012-01-01", freq='s', + periods=int(1e6))) - def time_series_dropna_datetime(self): - self.s.clip(0, 1) + def time_series_datetimeindex_repr(self): + getattr(self.s, 'a', None) diff --git a/asv_bench/benchmarks/sparse.py b/asv_bench/benchmarks/sparse.py index a46205026481e5..dcb7694abc2ad9 100644 --- a/asv_bench/benchmarks/sparse.py +++ b/asv_bench/benchmarks/sparse.py @@ -1,211 +1,162 @@ import itertools -from .pandas_vb_common import * +import numpy as np import scipy.sparse -from pandas import SparseSeries, SparseDataFrame, SparseArray +from pandas import (SparseSeries, SparseDataFrame, SparseArray, Series, + date_range, MultiIndex) +from .pandas_vb_common import setup # noqa -class sparse_series_to_frame(object): - goal_time = 0.2 - def setup(self): - self.K = 50 - self.N = 50000 - self.rng = np.asarray(date_range('1/1/2000', periods=self.N, freq='T')) - self.series = {} - for i in range(1, (self.K + 1)): - self.data = np.random.randn(self.N)[:(- i)] - self.this_rng = self.rng[:(- i)] - self.data[100:] = np.nan - self.series[i] = SparseSeries(self.data, index=self.this_rng) +def make_array(size, dense_proportion, fill_value, dtype): + dense_size = int(size * dense_proportion) + arr = np.full(size, fill_value, dtype) + indexer = np.random.choice(np.arange(size), dense_size, replace=False) + arr[indexer] = np.random.choice(np.arange(100, dtype=dtype), dense_size) + return arr - def time_sparse_series_to_frame(self): - SparseDataFrame(self.series) +class SparseSeriesToFrame(object): -class sparse_array_constructor(object): goal_time = 0.2 def setup(self): - np.random.seed(1) - self.int64_10percent = self.make_numeric_array(length=1000000, dense_size=100000, fill_value=0, dtype=np.int64) - self.int64_1percent = self.make_numeric_array(length=1000000, dense_size=10000, fill_value=0, dtype=np.int64) - - self.float64_10percent = self.make_numeric_array(length=1000000, dense_size=100000, fill_value=np.nan, dtype=np.float64) - self.float64_1percent = self.make_numeric_array(length=1000000, dense_size=10000, fill_value=np.nan, dtype=np.float64) - - self.object_nan_fill_value_10percent = self.make_object_array(length=1000000, dense_size=100000, fill_value=np.nan) - self.object_nan_fill_value_1percent = self.make_object_array(length=1000000, dense_size=10000, fill_value=np.nan) - - self.object_non_nan_fill_value_10percent = self.make_object_array(length=1000000, dense_size=100000, fill_value=0) - self.object_non_nan_fill_value_1percent = self.make_object_array(length=1000000, dense_size=10000, fill_value=0) - - def make_numeric_array(self, length, dense_size, fill_value, dtype): - arr = np.array([fill_value] * length, dtype=dtype) - indexer = np.unique(np.random.randint(0, length, dense_size)) - arr[indexer] = np.random.randint(0, 100, len(indexer)) - return (arr, fill_value, dtype) - - def make_object_array(self, length, dense_size, fill_value): - elems = np.array(['a', 0.0, False, 1, 2], dtype=np.object) - arr = np.array([fill_value] * length, dtype=np.object) - indexer = np.unique(np.random.randint(0, length, dense_size)) - arr[indexer] = np.random.choice(elems, len(indexer)) - return (arr, fill_value, np.object) - - def time_sparse_array_constructor_int64_10percent(self): - arr, fill_value, dtype = self.int64_10percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) - - def time_sparse_array_constructor_int64_1percent(self): - arr, fill_value, dtype = self.int64_1percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) - - def time_sparse_array_constructor_float64_10percent(self): - arr, fill_value, dtype = self.float64_10percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) - - def time_sparse_array_constructor_float64_1percent(self): - arr, fill_value, dtype = self.float64_1percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) - - def time_sparse_array_constructor_object_nan_fill_value_10percent(self): - arr, fill_value, dtype = self.object_nan_fill_value_10percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) - - def time_sparse_array_constructor_object_nan_fill_value_1percent(self): - arr, fill_value, dtype = self.object_nan_fill_value_1percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) + K = 50 + N = 50001 + rng = date_range('1/1/2000', periods=N, freq='T') + self.series = {} + for i in range(1, K): + data = np.random.randn(N)[:-i] + idx = rng[:-i] + data[100:] = np.nan + self.series[i] = SparseSeries(data, index=idx) - def time_sparse_array_constructor_object_non_nan_fill_value_10percent(self): - arr, fill_value, dtype = self.object_non_nan_fill_value_10percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) + def time_series_to_frame(self): + SparseDataFrame(self.series) - def time_sparse_array_constructor_object_non_nan_fill_value_1percent(self): - arr, fill_value, dtype = self.object_non_nan_fill_value_1percent - SparseArray(arr, fill_value=fill_value, dtype=dtype) +class SparseArrayConstructor(object): -class sparse_frame_constructor(object): goal_time = 0.2 + params = ([0.1, 0.01], [0, np.nan], + [np.int64, np.float64, np.object]) + param_names = ['dense_proportion', 'fill_value', 'dtype'] - def time_sparse_frame_constructor(self): - SparseDataFrame(columns=np.arange(100), index=np.arange(1000)) + def setup(self, dense_proportion, fill_value, dtype): + N = 10**6 + self.array = make_array(N, dense_proportion, fill_value, dtype) - def time_sparse_from_scipy(self): - SparseDataFrame(scipy.sparse.rand(1000, 1000, 0.005)) + def time_sparse_array(self, dense_proportion, fill_value, dtype): + SparseArray(self.array, fill_value=fill_value, dtype=dtype) - def time_sparse_from_dict(self): - SparseDataFrame(dict(zip(range(1000), itertools.repeat([0])))) +class SparseDataFrameConstructor(object): -class sparse_series_from_coo(object): goal_time = 0.2 def setup(self): - self.A = scipy.sparse.coo_matrix(([3.0, 1.0, 2.0], ([1, 0, 0], [0, 2, 3])), shape=(100, 100)) + N = 1000 + self.arr = np.arange(N) + self.sparse = scipy.sparse.rand(N, N, 0.005) + self.dict = dict(zip(range(N), itertools.repeat([0]))) - def time_sparse_series_from_coo(self): - self.ss = SparseSeries.from_coo(self.A) + def time_constructor(self): + SparseDataFrame(columns=self.arr, index=self.arr) + def time_from_scipy(self): + SparseDataFrame(self.sparse) -class sparse_series_to_coo(object): - goal_time = 0.2 + def time_from_dict(self): + SparseDataFrame(self.dict) - def setup(self): - self.s = pd.Series(([np.nan] * 10000)) - self.s[0] = 3.0 - self.s[100] = (-1.0) - self.s[999] = 12.1 - self.s.index = pd.MultiIndex.from_product((range(10), range(10), range(10), range(10))) - self.ss = self.s.to_sparse() - - def time_sparse_series_to_coo(self): - self.ss.to_coo(row_levels=[0, 1], column_levels=[2, 3], sort_labels=True) +class FromCoo(object): -class sparse_arithmetic_int(object): goal_time = 0.2 def setup(self): - np.random.seed(1) - self.a_10percent = self.make_sparse_array(length=1000000, dense_size=100000, fill_value=np.nan) - self.b_10percent = self.make_sparse_array(length=1000000, dense_size=100000, fill_value=np.nan) - - self.a_10percent_zero = self.make_sparse_array(length=1000000, dense_size=100000, fill_value=0) - self.b_10percent_zero = self.make_sparse_array(length=1000000, dense_size=100000, fill_value=0) - - self.a_1percent = self.make_sparse_array(length=1000000, dense_size=10000, fill_value=np.nan) - self.b_1percent = self.make_sparse_array(length=1000000, dense_size=10000, fill_value=np.nan) - - def make_sparse_array(self, length, dense_size, fill_value): - arr = np.array([fill_value] * length, dtype=np.float64) - indexer = np.unique(np.random.randint(0, length, dense_size)) - arr[indexer] = np.random.randint(0, 100, len(indexer)) - return pd.SparseArray(arr, fill_value=fill_value) - - def time_sparse_make_union(self): - self.a_10percent.sp_index.make_union(self.b_10percent.sp_index) + self.matrix = scipy.sparse.coo_matrix(([3.0, 1.0, 2.0], + ([1, 0, 0], [0, 2, 3])), + shape=(100, 100)) - def time_sparse_intersect(self): - self.a_10percent.sp_index.intersect(self.b_10percent.sp_index) - - def time_sparse_addition_10percent(self): - self.a_10percent + self.b_10percent + def time_sparse_series_from_coo(self): + SparseSeries.from_coo(self.matrix) - def time_sparse_addition_10percent_zero(self): - self.a_10percent_zero + self.b_10percent_zero - def time_sparse_addition_1percent(self): - self.a_1percent + self.b_1percent +class ToCoo(object): - def time_sparse_division_10percent(self): - self.a_10percent / self.b_10percent + goal_time = 0.2 - def time_sparse_division_10percent_zero(self): - self.a_10percent_zero / self.b_10percent_zero + def setup(self): + s = Series([np.nan] * 10000) + s[0] = 3.0 + s[100] = -1.0 + s[999] = 12.1 + s.index = MultiIndex.from_product([range(10)] * 4) + self.ss = s.to_sparse() - def time_sparse_division_1percent(self): - self.a_1percent / self.b_1percent + def time_sparse_series_to_coo(self): + self.ss.to_coo(row_levels=[0, 1], + column_levels=[2, 3], + sort_labels=True) +class Arithmetic(object): -class sparse_arithmetic_block(object): goal_time = 0.2 + params = ([0.1, 0.01], [0, np.nan]) + param_names = ['dense_proportion', 'fill_value'] - def setup(self): - np.random.seed(1) - self.a = self.make_sparse_array(length=1000000, num_blocks=1000, - block_size=10, fill_value=np.nan) - self.b = self.make_sparse_array(length=1000000, num_blocks=1000, - block_size=10, fill_value=np.nan) - - self.a_zero = self.make_sparse_array(length=1000000, num_blocks=1000, - block_size=10, fill_value=0) - self.b_zero = self.make_sparse_array(length=1000000, num_blocks=1000, - block_size=10, fill_value=np.nan) + def setup(self, dense_proportion, fill_value): + N = 10**6 + arr1 = make_array(N, dense_proportion, fill_value, np.int64) + self.array1 = SparseArray(arr1, fill_value=fill_value) + arr2 = make_array(N, dense_proportion, fill_value, np.int64) + self.array2 = SparseArray(arr2, fill_value=fill_value) - def make_sparse_array(self, length, num_blocks, block_size, fill_value): - a = np.array([fill_value] * length) - for block in range(num_blocks): - i = np.random.randint(0, length) - a[i:i + block_size] = np.random.randint(0, 100, len(a[i:i + block_size])) - return pd.SparseArray(a, fill_value=fill_value) + def time_make_union(self, dense_proportion, fill_value): + self.array1.sp_index.make_union(self.array2.sp_index) - def time_sparse_make_union(self): - self.a.sp_index.make_union(self.b.sp_index) + def time_intersect(self, dense_proportion, fill_value): + self.array1.sp_index.intersect(self.array2.sp_index) - def time_sparse_intersect(self): - self.a.sp_index.intersect(self.b.sp_index) + def time_add(self, dense_proportion, fill_value): + self.array1 + self.array2 - def time_sparse_addition(self): - self.a + self.b + def time_divide(self, dense_proportion, fill_value): + self.array1 / self.array2 - def time_sparse_addition_zero(self): - self.a_zero + self.b_zero - def time_sparse_division(self): - self.a / self.b +class ArithmeticBlock(object): - def time_sparse_division_zero(self): - self.a_zero / self.b_zero + goal_time = 0.2 + params = [np.nan, 0] + param_names = ['fill_value'] + + def setup(self, fill_value): + N = 10**6 + self.arr1 = self.make_block_array(length=N, num_blocks=1000, + block_size=10, fill_value=fill_value) + self.arr2 = self.make_block_array(length=N, num_blocks=1000, + block_size=10, fill_value=fill_value) + + def make_block_array(self, length, num_blocks, block_size, fill_value): + arr = np.full(length, fill_value) + indicies = np.random.choice(np.arange(0, length, block_size), + num_blocks, + replace=False) + for ind in indicies: + arr[ind:ind + block_size] = np.random.randint(0, 100, block_size) + return SparseArray(arr, fill_value=fill_value) + + def time_make_union(self, fill_value): + self.arr1.sp_index.make_union(self.arr2.sp_index) + + def time_intersect(self, fill_value): + self.arr2.sp_index.intersect(self.arr2.sp_index) + + def time_addition(self, fill_value): + self.arr1 + self.arr2 + + def time_division(self, fill_value): + self.arr1 / self.arr2 diff --git a/asv_bench/benchmarks/stat_ops.py b/asv_bench/benchmarks/stat_ops.py index 1e1eb167b46bfc..c447c78d0d0703 100644 --- a/asv_bench/benchmarks/stat_ops.py +++ b/asv_bench/benchmarks/stat_ops.py @@ -1,205 +1,114 @@ -from .pandas_vb_common import * +import numpy as np +import pandas as pd +from .pandas_vb_common import setup # noqa -def _set_use_bottleneck_False(): - try: - pd.options.compute.use_bottleneck = False - except: - from pandas.core import nanops - nanops._USE_BOTTLENECK = False +ops = ['mean', 'sum', 'median', 'std', 'skew', 'kurt', 'mad', 'prod', 'sem', + 'var'] -class FrameOps(object): - goal_time = 0.2 - - param_names = ['op', 'use_bottleneck', 'dtype', 'axis'] - params = [['mean', 'sum', 'median'], - [True, False], - ['float', 'int'], - [0, 1]] - - def setup(self, op, use_bottleneck, dtype, axis): - if dtype == 'float': - self.df = DataFrame(np.random.randn(100000, 4)) - elif dtype == 'int': - self.df = DataFrame(np.random.randint(1000, size=(100000, 4))) - - if not use_bottleneck: - _set_use_bottleneck_False() - - self.func = getattr(self.df, op) - - def time_op(self, op, use_bottleneck, dtype, axis): - self.func(axis=axis) +class FrameOps(object): -class stat_ops_level_frame_sum(object): goal_time = 0.2 + params = [ops, ['float', 'int'], [0, 1], [True, False]] + param_names = ['op', 'dtype', 'axis', 'use_bottleneck'] - def setup(self): - self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) - random.shuffle(self.index.values) - self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) - self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) - - def time_stat_ops_level_frame_sum(self): - self.df.sum(level=1) - - -class stat_ops_level_frame_sum_multiple(object): - goal_time = 0.2 + def setup(self, op, dtype, axis, use_bottleneck): + df = pd.DataFrame(np.random.randn(100000, 4)).astype(dtype) + try: + pd.options.compute.use_bottleneck = use_bottleneck + except: + from pandas.core import nanops + nanops._USE_BOTTLENECK = use_bottleneck + self.df_func = getattr(df, op) - def setup(self): - self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) - random.shuffle(self.index.values) - self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) - self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + def time_op(self, op, dtype, axis, use_bottleneck): + self.df_func(axis=axis) - def time_stat_ops_level_frame_sum_multiple(self): - self.df.sum(level=[0, 1]) +class FrameMultiIndexOps(object): -class stat_ops_level_series_sum(object): goal_time = 0.2 + params = ([0, 1, [0, 1]], ops) + param_names = ['level', 'op'] - def setup(self): - self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) - random.shuffle(self.index.values) - self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) - self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) + def setup(self, level, op): + levels = [np.arange(10), np.arange(100), np.arange(100)] + labels = [np.arange(10).repeat(10000), + np.tile(np.arange(100).repeat(100), 10), + np.tile(np.tile(np.arange(100), 100), 10)] + index = pd.MultiIndex(levels=levels, labels=labels) + df = pd.DataFrame(np.random.randn(len(index), 4), index=index) + self.df_func = getattr(df, op) - def time_stat_ops_level_series_sum(self): - self.df[1].sum(level=1) + def time_op(self, level, op): + self.df_func(level=level) -class stat_ops_level_series_sum_multiple(object): - goal_time = 0.2 - - def setup(self): - self.index = MultiIndex(levels=[np.arange(10), np.arange(100), np.arange(100)], labels=[np.arange(10).repeat(10000), np.tile(np.arange(100).repeat(100), 10), np.tile(np.tile(np.arange(100), 100), 10)]) - random.shuffle(self.index.values) - self.df = DataFrame(np.random.randn(len(self.index), 4), index=self.index) - self.df_level = DataFrame(np.random.randn(100, 4), index=self.index.levels[1]) - - def time_stat_ops_level_series_sum_multiple(self): - self.df[1].sum(level=[0, 1]) +class SeriesOps(object): - -class stat_ops_series_std(object): goal_time = 0.2 + params = [ops, ['float', 'int'], [True, False]] + param_names = ['op', 'dtype', 'use_bottleneck'] - def setup(self): - self.s = Series(np.random.randn(100000), index=np.arange(100000)) - self.s[::2] = np.nan - - def time_stat_ops_series_std(self): - self.s.std() + def setup(self, op, dtype, use_bottleneck): + s = pd.Series(np.random.randn(100000)).astype(dtype) + try: + pd.options.compute.use_bottleneck = use_bottleneck + except: + from pandas.core import nanops + nanops._USE_BOTTLENECK = use_bottleneck + self.s_func = getattr(s, op) + def time_op(self, op, dtype, use_bottleneck): + self.s_func() -class stats_corr_spearman(object): - goal_time = 0.2 - def setup(self): - self.df = DataFrame(np.random.randn(1000, 30)) +class SeriesMultiIndexOps(object): - def time_stats_corr_spearman(self): - self.df.corr(method='spearman') - - -class stats_rank2d_axis0_average(object): goal_time = 0.2 + params = ([0, 1, [0, 1]], ops) + param_names = ['level', 'op'] - def setup(self): - self.df = DataFrame(np.random.randn(5000, 50)) - - def time_stats_rank2d_axis0_average(self): - self.df.rank() + def setup(self, level, op): + levels = [np.arange(10), np.arange(100), np.arange(100)] + labels = [np.arange(10).repeat(10000), + np.tile(np.arange(100).repeat(100), 10), + np.tile(np.tile(np.arange(100), 100), 10)] + index = pd.MultiIndex(levels=levels, labels=labels) + s = pd.Series(np.random.randn(len(index)), index=index) + self.s_func = getattr(s, op) + def time_op(self, level, op): + self.s_func(level=level) -class stats_rank2d_axis1_average(object): - goal_time = 0.2 - - def setup(self): - self.df = DataFrame(np.random.randn(5000, 50)) - def time_stats_rank2d_axis1_average(self): - self.df.rank(1) +class Rank(object): - -class stats_rank_average(object): - goal_time = 0.2 - - def setup(self): - self.values = np.concatenate([np.arange(100000), np.random.randn(100000), np.arange(100000)]) - self.s = Series(self.values) - - def time_stats_rank_average(self): - self.s.rank() - - -class stats_rank_average_int(object): - goal_time = 0.2 - - def setup(self): - self.values = np.random.randint(0, 100000, size=200000) - self.s = Series(self.values) - - def time_stats_rank_average_int(self): - self.s.rank() - - -class stats_rank_pct_average(object): goal_time = 0.2 + params = [['DataFrame', 'Series'], [True, False]] + param_names = ['constructor', 'pct'] - def setup(self): - self.values = np.concatenate([np.arange(100000), np.random.randn(100000), np.arange(100000)]) - self.s = Series(self.values) + def setup(self, constructor, pct): + values = np.random.randn(10**5) + self.data = getattr(pd, constructor)(values) - def time_stats_rank_pct_average(self): - self.s.rank(pct=True) + def time_rank(self, constructor, pct): + self.data.rank(pct=pct) + def time_average_old(self, constructor, pct): + self.data.rank(pct=pct) / len(self.data) -class stats_rank_pct_average_old(object): - goal_time = 0.2 - - def setup(self): - self.values = np.concatenate([np.arange(100000), np.random.randn(100000), np.arange(100000)]) - self.s = Series(self.values) - - def time_stats_rank_pct_average_old(self): - (self.s.rank() / len(self.s)) +class Correlation(object): -class stats_rolling_mean(object): goal_time = 0.2 + params = ['spearman', 'kendall', 'pearson'] + param_names = ['method'] - def setup(self): - self.arr = np.random.randn(100000) - self.win = 100 - - def time_rolling_mean(self): - rolling_mean(self.arr, self.win) - - def time_rolling_median(self): - rolling_median(self.arr, self.win) - - def time_rolling_min(self): - rolling_min(self.arr, self.win) - - def time_rolling_max(self): - rolling_max(self.arr, self.win) - - def time_rolling_sum(self): - rolling_sum(self.arr, self.win) - - def time_rolling_std(self): - rolling_std(self.arr, self.win) - - def time_rolling_var(self): - rolling_var(self.arr, self.win) - - def time_rolling_skew(self): - rolling_skew(self.arr, self.win) + def setup(self, method): + self.df = pd.DataFrame(np.random.randn(1000, 30)) - def time_rolling_kurt(self): - rolling_kurt(self.arr, self.win) + def time_corr(self, method): + self.df.corr(method=method) diff --git a/asv_bench/benchmarks/strings.py b/asv_bench/benchmarks/strings.py index c1600d4e07f583..ccfac2f73f14d2 100644 --- a/asv_bench/benchmarks/strings.py +++ b/asv_bench/benchmarks/strings.py @@ -1,107 +1,170 @@ -from .pandas_vb_common import * -import string -import itertools as IT -import pandas.util.testing as testing +import warnings +import numpy as np +from pandas import Series, DataFrame +import pandas.util.testing as tm -class StringMethods(object): - goal_time = 0.2 - def make_series(self, letters, strlen, size): - return Series([str(x) for x in np.fromiter(IT.cycle(letters), count=(size * strlen), dtype='|S1').view('|S{}'.format(strlen))]) +class Methods(object): - def setup(self): - self.many = self.make_series(('matchthis' + string.ascii_uppercase), strlen=19, size=10000) - self.few = self.make_series(('matchthis' + (string.ascii_uppercase * 42)), strlen=19, size=10000) - self.s = self.make_series(string.ascii_uppercase, strlen=10, size=10000).str.join('|') + goal_time = 0.2 - def time_cat(self): - self.many.str.cat(sep=',') + def setup(self): + self.s = Series(tm.makeStringIndex(10**5)) def time_center(self): - self.many.str.center(100) - - def time_contains_few(self): - self.few.str.contains('matchthis') - - def time_contains_few_noregex(self): - self.few.str.contains('matchthis', regex=False) - - def time_contains_many(self): - self.many.str.contains('matchthis') - - def time_contains_many_noregex(self): - self.many.str.contains('matchthis', regex=False) + self.s.str.center(100) def time_count(self): - self.many.str.count('matchthis') + self.s.str.count('A') def time_endswith(self): - self.many.str.endswith('matchthis') + self.s.str.endswith('A') def time_extract(self): - self.many.str.extract('(\\w*)matchthis(\\w*)') + with warnings.catch_warnings(record=True): + self.s.str.extract('(\\w*)A(\\w*)') def time_findall(self): - self.many.str.findall('[A-Z]+') + self.s.str.findall('[A-Z]+') def time_get(self): - self.many.str.get(0) - - def time_join_split(self): - self.many.str.join('--').str.split('--') - - def time_join_split_expand(self): - self.many.str.join('--').str.split('--', expand=True) + self.s.str.get(0) def time_len(self): - self.many.str.len() + self.s.str.len() def time_match(self): - self.many.str.match('mat..this') + self.s.str.match('A') def time_pad(self): - self.many.str.pad(100, side='both') - - def time_repeat(self): - self.many.str.repeat(list(IT.islice(IT.cycle(range(1, 4)), len(self.many)))) + self.s.str.pad(100, side='both') def time_replace(self): - self.many.str.replace('(matchthis)', '\x01\x01') + self.s.str.replace('A', '\x01\x01') def time_slice(self): - self.many.str.slice(5, 15, 2) + self.s.str.slice(5, 15, 2) def time_startswith(self): - self.many.str.startswith('matchthis') + self.s.str.startswith('A') def time_strip(self): - self.many.str.strip('matchthis') + self.s.str.strip('A') def time_rstrip(self): - self.many.str.rstrip('matchthis') + self.s.str.rstrip('A') def time_lstrip(self): - self.many.str.lstrip('matchthis') + self.s.str.lstrip('A') def time_title(self): - self.many.str.title() + self.s.str.title() def time_upper(self): - self.many.str.upper() + self.s.str.upper() def time_lower(self): - self.many.str.lower() + self.s.str.lower() + + +class Repeat(object): + + goal_time = 0.2 + params = ['int', 'array'] + param_names = ['repeats'] + + def setup(self, repeats): + N = 10**5 + self.s = Series(tm.makeStringIndex(N)) + repeat = {'int': 1, 'array': np.random.randint(1, 3, N)} + self.repeat = repeat[repeats] + + def time_repeat(self, repeats): + self.s.str.repeat(self.repeat) + + +class Cat(object): + + goal_time = 0.2 + params = ([0, 3], [None, ','], [None, '-'], [0.0, 0.001, 0.15]) + param_names = ['other_cols', 'sep', 'na_rep', 'na_frac'] + + def setup(self, other_cols, sep, na_rep, na_frac): + N = 10 ** 5 + mask_gen = lambda: np.random.choice([True, False], N, + p=[1 - na_frac, na_frac]) + self.s = Series(tm.makeStringIndex(N)).where(mask_gen()) + if other_cols == 0: + # str.cat self-concatenates only for others=None + self.others = None + else: + self.others = DataFrame({i: tm.makeStringIndex(N).where(mask_gen()) + for i in range(other_cols)}) + + def time_cat(self, other_cols, sep, na_rep, na_frac): + # before the concatenation (one caller + other_cols columns), the total + # expected fraction of rows containing any NaN is: + # reduce(lambda t, _: t + (1 - t) * na_frac, range(other_cols + 1), 0) + # for other_cols=3 and na_frac=0.15, this works out to ~48% + self.s.str.cat(others=self.others, sep=sep, na_rep=na_rep) + + +class Contains(object): + + goal_time = 0.2 + params = [True, False] + param_names = ['regex'] + + def setup(self, regex): + self.s = Series(tm.makeStringIndex(10**5)) + + def time_contains(self, regex): + self.s.str.contains('A', regex=regex) + + +class Split(object): + + goal_time = 0.2 + params = [True, False] + param_names = ['expand'] + + def setup(self, expand): + self.s = Series(tm.makeStringIndex(10**5)).str.join('--') + + def time_split(self, expand): + self.s.str.split('--', expand=expand) + + +class Dummies(object): + + goal_time = 0.2 + + def setup(self): + self.s = Series(tm.makeStringIndex(10**5)).str.join('|') def time_get_dummies(self): self.s.str.get_dummies('|') -class StringEncode(object): +class Encode(object): + goal_time = 0.2 def setup(self): - self.ser = Series(testing.makeUnicodeIndex()) + self.ser = Series(tm.makeUnicodeIndex()) def time_encode_decode(self): self.ser.str.encode('utf-8').str.decode('utf-8') + + +class Slice(object): + + goal_time = 0.2 + + def setup(self): + self.s = Series(['abcdefg', np.nan] * 500000) + + def time_vector_slice(self): + # GH 2602 + self.s.str[:5] diff --git a/asv_bench/benchmarks/timedelta.py b/asv_bench/benchmarks/timedelta.py index c112d1ef72eb80..3fe75b3c34299d 100644 --- a/asv_bench/benchmarks/timedelta.py +++ b/asv_bench/benchmarks/timedelta.py @@ -1,42 +1,129 @@ -from .pandas_vb_common import * -from pandas import to_timedelta, Timestamp +import datetime +import numpy as np +from pandas import Series, timedelta_range, to_timedelta, Timestamp, Timedelta + + +class TimedeltaConstructor(object): -class ToTimedelta(object): goal_time = 0.2 - def setup(self): - self.arr = np.random.randint(0, 1000, size=10000) - self.arr2 = ['{0} days'.format(i) for i in self.arr] + def time_from_int(self): + Timedelta(123456789) + + def time_from_unit(self): + Timedelta(1, unit='d') + + def time_from_components(self): + Timedelta(days=1, hours=2, minutes=3, seconds=4, milliseconds=5, + microseconds=6, nanoseconds=7) + + def time_from_datetime_timedelta(self): + Timedelta(datetime.timedelta(days=1, seconds=1)) + + def time_from_np_timedelta(self): + Timedelta(np.timedelta64(1, 'ms')) + + def time_from_string(self): + Timedelta('1 days') + + def time_from_iso_format(self): + Timedelta('P4DT12H30M5S') - self.arr3 = np.random.randint(0, 60, size=10000) - self.arr3 = ['00:00:{0:02d}'.format(i) for i in self.arr3] + def time_from_missing(self): + Timedelta('nat') - self.arr4 = list(self.arr2) - self.arr4[-1] = 'apple' + +class ToTimedelta(object): + + goal_time = 0.2 + + def setup(self): + self.ints = np.random.randint(0, 60, size=10000) + self.str_days = [] + self.str_seconds = [] + for i in self.ints: + self.str_days.append('{0} days'.format(i)) + self.str_seconds.append('00:00:{0:02d}'.format(i)) def time_convert_int(self): - to_timedelta(self.arr, unit='s') + to_timedelta(self.ints, unit='s') - def time_convert_string(self): - to_timedelta(self.arr2) + def time_convert_string_days(self): + to_timedelta(self.str_days) def time_convert_string_seconds(self): - to_timedelta(self.arr3) + to_timedelta(self.str_seconds) + + +class ToTimedeltaErrors(object): + + goal_time = 0.2 + params = ['coerce', 'ignore'] + param_names = ['errors'] - def time_convert_coerce(self): - to_timedelta(self.arr4, errors='coerce') + def setup(self, errors): + ints = np.random.randint(0, 60, size=10000) + self.arr = ['{0} days'.format(i) for i in ints] + self.arr[-1] = 'apple' - def time_convert_ignore(self): - to_timedelta(self.arr4, errors='ignore') + def time_convert(self, errors): + to_timedelta(self.arr, errors=errors) -class Ops(object): +class TimedeltaOps(object): + goal_time = 0.2 def setup(self): self.td = to_timedelta(np.arange(1000000)) self.ts = Timestamp('2000') - def test_add_td_ts(self): + def time_add_td_ts(self): self.td + self.ts + + +class TimedeltaProperties(object): + + goal_time = 0.2 + + def setup_cache(self): + td = Timedelta(days=365, minutes=35, seconds=25, milliseconds=35) + return td + + def time_timedelta_days(self, td): + td.days + + def time_timedelta_seconds(self, td): + td.seconds + + def time_timedelta_microseconds(self, td): + td.microseconds + + def time_timedelta_nanoseconds(self, td): + td.nanoseconds + + +class DatetimeAccessor(object): + + goal_time = 0.2 + + def setup_cache(self): + N = 100000 + series = Series(timedelta_range('1 days', periods=N, freq='h')) + return series + + def time_dt_accessor(self, series): + series.dt + + def time_timedelta_days(self, series): + series.dt.days + + def time_timedelta_seconds(self, series): + series.dt.seconds + + def time_timedelta_microseconds(self, series): + series.dt.microseconds + + def time_timedelta_nanoseconds(self, series): + series.dt.nanoseconds diff --git a/asv_bench/benchmarks/timeseries.py b/asv_bench/benchmarks/timeseries.py index 779fc0bd20964a..2c98cc16595199 100644 --- a/asv_bench/benchmarks/timeseries.py +++ b/asv_bench/benchmarks/timeseries.py @@ -1,364 +1,331 @@ +import warnings +from datetime import timedelta + +import numpy as np +from pandas import to_datetime, date_range, Series, DataFrame, period_range +from pandas.tseries.frequencies import infer_freq try: from pandas.plotting._converter import DatetimeConverter except ImportError: from pandas.tseries.converter import DatetimeConverter -from .pandas_vb_common import * -import pandas as pd -import datetime as dt -try: - import pandas.tseries.holiday -except ImportError: - pass -from pandas.tseries.frequencies import infer_freq -import numpy as np -if hasattr(Series, 'convert'): - Series.resample = Series.convert +from .pandas_vb_common import setup # noqa class DatetimeIndex(object): + goal_time = 0.2 + params = ['dst', 'repeated', 'tz_aware', 'tz_naive'] + param_names = ['index_type'] - def setup(self): - self.N = 100000 - self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') - self.delta_offset = pd.offsets.Day() - self.fast_offset = pd.offsets.DateOffset(months=2, days=2) - self.slow_offset = pd.offsets.BusinessDay() + def setup(self, index_type): + N = 100000 + dtidxes = {'dst': date_range(start='10/29/2000 1:00:00', + end='10/29/2000 1:59:59', freq='S'), + 'repeated': date_range(start='2000', + periods=N / 10, + freq='s').repeat(10), + 'tz_aware': date_range(start='2000', + periods=N, + freq='s', + tz='US/Eastern'), + 'tz_naive': date_range(start='2000', + periods=N, + freq='s')} + self.index = dtidxes[index_type] - self.rng2 = date_range(start='1/1/2000 9:30', periods=10000, freq='S', tz='US/Eastern') + def time_add_timedelta(self, index_type): + self.index + timedelta(minutes=2) - self.index_repeated = date_range(start='1/1/2000', periods=1000, freq='T').repeat(10) + def time_normalize(self, index_type): + self.index.normalize() - self.rng3 = date_range(start='1/1/2000', periods=1000, freq='H') - self.df = DataFrame(np.random.randn(len(self.rng3), 2), self.rng3) + def time_unique(self, index_type): + self.index.unique() - self.rng4 = date_range(start='1/1/2000', periods=1000, freq='H', tz='US/Eastern') - self.df2 = DataFrame(np.random.randn(len(self.rng4), 2), index=self.rng4) + def time_to_time(self, index_type): + self.index.time - N = 100000 - self.dti = pd.date_range('2011-01-01', freq='H', periods=N).repeat(5) - self.dti_tz = pd.date_range('2011-01-01', freq='H', periods=N, - tz='Asia/Tokyo').repeat(5) + def time_get(self, index_type): + self.index[0] - self.rng5 = date_range(start='1/1/2000', end='3/1/2000', tz='US/Eastern') + def time_timeseries_is_month_start(self, index_type): + self.index.is_month_start - self.dst_rng = date_range(start='10/29/2000 1:00:00', end='10/29/2000 1:59:59', freq='S') - self.index = date_range(start='10/29/2000', end='10/29/2000 00:59:59', freq='S') - self.index = self.index.append(self.dst_rng) - self.index = self.index.append(self.dst_rng) - self.index = self.index.append(date_range(start='10/29/2000 2:00:00', end='10/29/2000 3:00:00', freq='S')) + def time_to_date(self, index_type): + self.index.date - self.N = 10000 - self.rng6 = date_range(start='1/1/1', periods=self.N, freq='B') + def time_to_pydatetime(self, index_type): + self.index.to_pydatetime() - self.rng7 = date_range(start='1/1/1700', freq='D', periods=100000) - self.no_freq = self.rng7[:50000].append(self.rng7[50002:]) - self.d_freq = self.rng7[:50000].append(self.rng7[50000:]) - self.rng8 = date_range(start='1/1/1700', freq='B', periods=75000) - self.b_freq = self.rng8[:50000].append(self.rng8[50000:]) +class TzLocalize(object): - def time_add_timedelta(self): - (self.rng + dt.timedelta(minutes=2)) + goal_time = 0.2 + + def setup(self): + dst_rng = date_range(start='10/29/2000 1:00:00', + end='10/29/2000 1:59:59', freq='S') + self.index = date_range(start='10/29/2000', + end='10/29/2000 00:59:59', freq='S') + self.index = self.index.append(dst_rng) + self.index = self.index.append(dst_rng) + self.index = self.index.append(date_range(start='10/29/2000 2:00:00', + end='10/29/2000 3:00:00', + freq='S')) - def time_add_offset_delta(self): - (self.rng + self.delta_offset) + def time_infer_dst(self): + self.index.tz_localize('US/Eastern', ambiguous='infer') - def time_add_offset_fast(self): - (self.rng + self.fast_offset) - def time_add_offset_slow(self): - (self.rng + self.slow_offset) +class ResetIndex(object): - def time_normalize(self): - self.rng2.normalize() + goal_time = 0.2 + params = [None, 'US/Eastern'] + param_names = 'tz' - def time_unique(self): - self.index_repeated.unique() + def setup(self, tz): + idx = date_range(start='1/1/2000', periods=1000, freq='H', tz=tz) + self.df = DataFrame(np.random.randn(1000, 2), index=idx) - def time_reset_index(self): + def time_reest_datetimeindex(self, tz): self.df.reset_index() - def time_reset_index_tz(self): - self.df2.reset_index() - def time_dti_factorize(self): - self.dti.factorize() +class Factorize(object): - def time_dti_tz_factorize(self): - self.dti_tz.factorize() + goal_time = 0.2 + params = [None, 'Asia/Tokyo'] + param_names = 'tz' - def time_timestamp_tzinfo_cons(self): - self.rng5[0] + def setup(self, tz): + N = 100000 + self.dti = date_range('2011-01-01', freq='H', periods=N, tz=tz) + self.dti = self.dti.repeat(5) - def time_infer_dst(self): - self.index.tz_localize('US/Eastern', infer_dst=True) + def time_factorize(self, tz): + self.dti.factorize() - def time_timeseries_is_month_start(self): - self.rng6.is_month_start - def time_infer_freq_none(self): - infer_freq(self.no_freq) +class InferFreq(object): - def time_infer_freq_daily(self): - infer_freq(self.d_freq) + goal_time = 0.2 + params = [None, 'D', 'B'] + param_names = ['freq'] + + def setup(self, freq): + if freq is None: + self.idx = date_range(start='1/1/1700', freq='D', periods=10000) + self.idx.freq = None + else: + self.idx = date_range(start='1/1/1700', freq=freq, periods=10000) - def time_infer_freq_business(self): - infer_freq(self.b_freq) + def time_infer_freq(self, freq): + infer_freq(self.idx) class TimeDatetimeConverter(object): + goal_time = 0.2 def setup(self): - self.N = 100000 - self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') + N = 100000 + self.rng = date_range(start='1/1/2000', periods=N, freq='T') def time_convert(self): DatetimeConverter.convert(self.rng, None, None) class Iteration(object): - goal_time = 0.2 - def setup(self): - self.N = 1000000 - self.M = 10000 - self.idx1 = date_range(start='20140101', freq='T', periods=self.N) - self.idx2 = period_range(start='20140101', freq='T', periods=self.N) - - def iter_n(self, iterable, n=None): - self.i = 0 - for _ in iterable: - self.i += 1 - if ((n is not None) and (self.i > n)): - break - - def time_iter_datetimeindex(self): - self.iter_n(self.idx1) - - def time_iter_datetimeindex_preexit(self): - self.iter_n(self.idx1, self.M) + goal_time = 0.2 + params = [date_range, period_range] + param_names = ['time_index'] - def time_iter_periodindex(self): - self.iter_n(self.idx2) + def setup(self, time_index): + N = 10**6 + self.idx = time_index(start='20140101', freq='T', periods=N) + self.exit = 10000 - def time_iter_periodindex_preexit(self): - self.iter_n(self.idx2, self.M) + def time_iter(self, time_index): + for _ in self.idx: + pass + def time_iter_preexit(self, time_index): + for i, _ in enumerate(self.idx): + if i > self.exit: + break -#---------------------------------------------------------------------- -# Resampling class ResampleDataFrame(object): - goal_time = 0.2 - - def setup(self): - self.rng = date_range(start='20130101', periods=100000, freq='50L') - self.df = DataFrame(np.random.randn(100000, 2), index=self.rng) - def time_max_numpy(self): - self.df.resample('1s', how=np.max) - - def time_max_string(self): - self.df.resample('1s', how='max') - - def time_mean_numpy(self): - self.df.resample('1s', how=np.mean) - - def time_mean_string(self): - self.df.resample('1s', how='mean') + goal_time = 0.2 + params = ['max', 'mean', 'min'] + param_names = ['method'] - def time_min_numpy(self): - self.df.resample('1s', how=np.min) + def setup(self, method): + rng = date_range(start='20130101', periods=100000, freq='50L') + df = DataFrame(np.random.randn(100000, 2), index=rng) + self.resample = getattr(df.resample('1s'), method) - def time_min_string(self): - self.df.resample('1s', how='min') + def time_method(self, method): + self.resample() class ResampleSeries(object): + + goal_time = 0.2 + params = (['period', 'datetime'], ['5min', '1D'], ['mean', 'ohlc']) + param_names = ['index', 'freq', 'method'] + + def setup(self, index, freq, method): + indexes = {'period': period_range(start='1/1/2000', + end='1/1/2001', + freq='T'), + 'datetime': date_range(start='1/1/2000', + end='1/1/2001', + freq='T')} + idx = indexes[index] + ts = Series(np.random.randn(len(idx)), index=idx) + self.resample = getattr(ts.resample(freq), method) + + def time_resample(self, index, freq, method): + self.resample() + + +class ResampleDatetetime64(object): + # GH 7754 goal_time = 0.2 def setup(self): - self.rng1 = period_range(start='1/1/2000', end='1/1/2001', freq='T') - self.ts1 = Series(np.random.randn(len(self.rng1)), index=self.rng1) - - self.rng2 = date_range(start='1/1/2000', end='1/1/2001', freq='T') - self.ts2 = Series(np.random.randn(len(self.rng2)), index=self.rng2) + rng3 = date_range(start='2000-01-01 00:00:00', + end='2000-01-01 10:00:00', freq='555000U') + self.dt_ts = Series(5, rng3, dtype='datetime64[ns]') - self.rng3 = date_range(start='2000-01-01 00:00:00', end='2000-01-01 10:00:00', freq='555000U') - self.int_ts = Series(5, self.rng3, dtype='int64') - self.dt_ts = self.int_ts.astype('datetime64[ns]') - - def time_period_downsample_mean(self): - self.ts1.resample('D', how='mean') - - def time_timestamp_downsample_mean(self): - self.ts2.resample('D', how='mean') - - def time_resample_datetime64(self): - # GH 7754 - self.dt_ts.resample('1S', how='last') - - def time_1min_5min_mean(self): - self.ts2[:10000].resample('5min', how='mean') - - def time_1min_5min_ohlc(self): - self.ts2[:10000].resample('5min', how='ohlc') + def time_resample(self): + self.dt_ts.resample('1S').last() class AsOf(object): - goal_time = 0.2 - def setup(self): - self.N = 10000 - self.rng = date_range(start='1/1/1990', periods=self.N, freq='53s') - self.ts = Series(np.random.randn(self.N), index=self.rng) - self.dates = date_range(start='1/1/1990', periods=(self.N * 10), freq='5s') + goal_time = 0.2 + params = ['DataFrame', 'Series'] + param_names = ['constructor'] + + def setup(self, constructor): + N = 10000 + M = 10 + rng = date_range(start='1/1/1990', periods=N, freq='53s') + data = {'DataFrame': DataFrame(np.random.randn(N, M)), + 'Series': Series(np.random.randn(N))} + self.ts = data[constructor] + self.ts.index = rng self.ts2 = self.ts.copy() - self.ts2[250:5000] = np.nan + self.ts2.iloc[250:5000] = np.nan self.ts3 = self.ts.copy() - self.ts3[-5000:] = np.nan + self.ts3.iloc[-5000:] = np.nan + self.dates = date_range(start='1/1/1990', periods=N * 10, freq='5s') + self.date = self.dates[0] + self.date_last = self.dates[-1] + self.date_early = self.date - timedelta(10) # test speed of pre-computing NAs. - def time_asof(self): + def time_asof(self, constructor): self.ts.asof(self.dates) # should be roughly the same as above. - def time_asof_nan(self): + def time_asof_nan(self, constructor): self.ts2.asof(self.dates) # test speed of the code path for a scalar index # without *while* loop - def time_asof_single(self): - self.ts.asof(self.dates[0]) + def time_asof_single(self, constructor): + self.ts.asof(self.date) # test speed of the code path for a scalar index # before the start. should be the same as above. - def time_asof_single_early(self): - self.ts.asof(self.dates[0] - dt.timedelta(10)) + def time_asof_single_early(self, constructor): + self.ts.asof(self.date_early) # test the speed of the code path for a scalar index # with a long *while* loop. should still be much # faster than pre-computing all the NAs. - def time_asof_nan_single(self): - self.ts3.asof(self.dates[-1]) + def time_asof_nan_single(self, constructor): + self.ts3.asof(self.date_last) -class AsOfDataFrame(object): - goal_time = 0.2 +class SortIndex(object): - def setup(self): - self.N = 10000 - self.M = 100 - self.rng = date_range(start='1/1/1990', periods=self.N, freq='53s') - self.dates = date_range(start='1/1/1990', periods=(self.N * 10), freq='5s') - self.ts = DataFrame(np.random.randn(self.N, self.M), index=self.rng) - self.ts2 = self.ts.copy() - self.ts2.iloc[250:5000] = np.nan - self.ts3 = self.ts.copy() - self.ts3.iloc[-5000:] = np.nan - - # test speed of pre-computing NAs. - def time_asof(self): - self.ts.asof(self.dates) + goal_time = 0.2 + params = [True, False] + param_names = ['monotonic'] - # should be roughly the same as above. - def time_asof_nan(self): - self.ts2.asof(self.dates) + def setup(self, monotonic): + N = 10**5 + idx = date_range(start='1/1/2000', periods=N, freq='s') + self.s = Series(np.random.randn(N), index=idx) + if not monotonic: + self.s = self.s.sample(frac=1) - # test speed of the code path for a scalar index - # with pre-computing all NAs. - def time_asof_single(self): - self.ts.asof(self.dates[0]) + def time_sort_index(self, monotonic): + self.s.sort_index() - # should be roughly the same as above. - def time_asof_nan_single(self): - self.ts3.asof(self.dates[-1]) + def time_get_slice(self, monotonic): + self.s[:10000] - # test speed of the code path for a scalar index - # before the start. should be without the cost of - # pre-computing all the NAs. - def time_asof_single_early(self): - self.ts.asof(self.dates[0] - dt.timedelta(10)) +class IrregularOps(object): -class TimeSeries(object): goal_time = 0.2 def setup(self): - self.N = 100000 - self.rng = date_range(start='1/1/2000', periods=self.N, freq='s') - self.rng = self.rng.take(np.random.permutation(self.N)) - self.ts = Series(np.random.randn(self.N), index=self.rng) - - self.rng2 = date_range(start='1/1/2000', periods=self.N, freq='T') - self.ts2 = Series(np.random.randn(self.N), index=self.rng2) + N = 10**5 + idx = date_range(start='1/1/2000', periods=N, freq='s') + s = Series(np.random.randn(N), index=idx) + self.left = s.sample(frac=1) + self.right = s.sample(frac=1) - self.lindex = np.random.permutation(self.N)[:(self.N // 2)] - self.rindex = np.random.permutation(self.N)[:(self.N // 2)] - self.left = Series(self.ts2.values.take(self.lindex), index=self.ts2.index.take(self.lindex)) - self.right = Series(self.ts2.values.take(self.rindex), index=self.ts2.index.take(self.rindex)) + def time_add(self): + self.left + self.right - self.rng3 = date_range(start='1/1/2000', periods=1500000, freq='S') - self.ts3 = Series(1, index=self.rng3) - def time_sort_index_monotonic(self): - self.ts2.sort_index() +class Lookup(object): - def time_sort_index_non_monotonic(self): - self.ts.sort_index() + goal_time = 0.2 - def time_timeseries_slice_minutely(self): - self.ts2[:10000] + def setup(self): + N = 1500000 + rng = date_range(start='1/1/2000', periods=N, freq='S') + self.ts = Series(1, index=rng) + self.lookup_val = rng[N // 2] - def time_add_irregular(self): - (self.left + self.right) + def time_lookup_and_cleanup(self): + self.ts[self.lookup_val] + self.ts.index._cleanup() - def time_large_lookup_value(self): - self.ts3[self.ts3.index[(len(self.ts3) // 2)]] - self.ts3.index._cleanup() +class ToDatetimeYYYYMMDD(object): -class SeriesArithmetic(object): goal_time = 0.2 def setup(self): - self.N = 100000 - self.s = Series(date_range(start='20140101', freq='T', periods=self.N)) - self.delta_offset = pd.offsets.Day() - self.fast_offset = pd.offsets.DateOffset(months=2, days=2) - self.slow_offset = pd.offsets.BusinessDay() - - def time_add_offset_delta(self): - (self.s + self.delta_offset) + rng = date_range(start='1/1/2000', periods=10000, freq='D') + self.stringsD = Series(rng.strftime('%Y%m%d')) - def time_add_offset_fast(self): - (self.s + self.fast_offset) + def time_format_YYYYMMDD(self): + to_datetime(self.stringsD, format='%Y%m%d') - def time_add_offset_slow(self): - (self.s + self.slow_offset) +class ToDatetimeISO8601(object): -class ToDatetime(object): goal_time = 0.2 def setup(self): - self.rng = date_range(start='1/1/2000', periods=10000, freq='D') - self.stringsD = Series((((self.rng.year * 10000) + (self.rng.month * 100)) + self.rng.day), dtype=np.int64).apply(str) - - self.rng = date_range(start='1/1/2000', periods=20000, freq='H') - self.strings = [x.strftime('%Y-%m-%d %H:%M:%S') for x in self.rng] - self.strings_nosep = [x.strftime('%Y%m%d %H:%M:%S') for x in self.rng] + rng = date_range(start='1/1/2000', periods=20000, freq='H') + self.strings = rng.strftime('%Y-%m-%d %H:%M:%S').tolist() + self.strings_nosep = rng.strftime('%Y%m%d %H:%M:%S').tolist() self.strings_tz_space = [x.strftime('%Y-%m-%d %H:%M:%S') + ' -0800' - for x in self.rng] - - self.s = Series((['19MAY11', '19MAY11:00:00:00'] * 100000)) - self.s2 = self.s.str.replace(':\\S+$', '') - - def time_format_YYYYMMDD(self): - to_datetime(self.stringsD, format='%Y%m%d') + for x in rng] def time_iso8601(self): to_datetime(self.strings) @@ -375,149 +342,75 @@ def time_iso8601_format_no_sep(self): def time_iso8601_tz_spaceformat(self): to_datetime(self.strings_tz_space) - def time_format_exact(self): - to_datetime(self.s2, format='%d%b%y') - - def time_format_no_exact(self): - to_datetime(self.s, format='%d%b%y', exact=False) +class ToDatetimeNONISO8601(object): -class Offsets(object): goal_time = 0.2 def setup(self): - self.date = dt.datetime(2011, 1, 1) - self.dt64 = np.datetime64('2011-01-01 09:00Z') - self.hcal = pd.tseries.holiday.USFederalHolidayCalendar() - self.day = pd.offsets.Day() - self.year = pd.offsets.YearBegin() - self.cday = pd.offsets.CustomBusinessDay() - self.cmb = pd.offsets.CustomBusinessMonthBegin(calendar=self.hcal) - self.cme = pd.offsets.CustomBusinessMonthEnd(calendar=self.hcal) - self.cdayh = pd.offsets.CustomBusinessDay(calendar=self.hcal) + N = 10000 + half = int(N / 2) + ts_string_1 = 'March 1, 2018 12:00:00+0400' + ts_string_2 = 'March 1, 2018 12:00:00+0500' + self.same_offset = [ts_string_1] * N + self.diff_offset = [ts_string_1] * half + [ts_string_2] * half - def time_timeseries_day_apply(self): - self.day.apply(self.date) + def time_same_offset(self): + to_datetime(self.same_offset) - def time_timeseries_day_incr(self): - (self.date + self.day) + def time_different_offset(self): + to_datetime(self.diff_offset) - def time_timeseries_year_apply(self): - self.year.apply(self.date) - def time_timeseries_year_incr(self): - (self.date + self.year) +class ToDatetimeFormat(object): - # custom business offsets - - def time_custom_bday_decr(self): - (self.date - self.cday) - - def time_custom_bday_incr(self): - (self.date + self.cday) - - def time_custom_bday_apply(self): - self.cday.apply(self.date) - - def time_custom_bday_apply_dt64(self): - self.cday.apply(self.dt64) - - def time_custom_bday_cal_incr(self): - self.date + 1 * self.cdayh - - def time_custom_bday_cal_decr(self): - self.date - 1 * self.cdayh - - def time_custom_bday_cal_incr_n(self): - self.date + 10 * self.cdayh - - def time_custom_bday_cal_incr_neg_n(self): - self.date - 10 * self.cdayh - - # Increment custom business month - - def time_custom_bmonthend_incr(self): - (self.date + self.cme) - - def time_custom_bmonthend_incr_n(self): - (self.date + (10 * self.cme)) - - def time_custom_bmonthend_decr_n(self): - (self.date - (10 * self.cme)) - - def time_custom_bmonthbegin_decr_n(self): - (self.date - (10 * self.cmb)) - - def time_custom_bmonthbegin_incr_n(self): - (self.date + (10 * self.cmb)) - - -class SemiMonthOffset(object): goal_time = 0.2 def setup(self): - self.N = 100000 - self.rng = date_range(start='1/1/2000', periods=self.N, freq='T') - # date is not on an offset which will be slowest case - self.date = dt.datetime(2011, 1, 2) - self.semi_month_end = pd.offsets.SemiMonthEnd() - self.semi_month_begin = pd.offsets.SemiMonthBegin() - - def time_end_apply(self): - self.semi_month_end.apply(self.date) - - def time_end_incr(self): - self.date + self.semi_month_end - - def time_end_incr_n(self): - self.date + 10 * self.semi_month_end - - def time_end_decr(self): - self.date - self.semi_month_end - - def time_end_decr_n(self): - self.date - 10 * self.semi_month_end + self.s = Series(['19MAY11', '19MAY11:00:00:00'] * 100000) + self.s2 = self.s.str.replace(':\\S+$', '') - def time_end_apply_index(self): - self.semi_month_end.apply_index(self.rng) + def time_exact(self): + to_datetime(self.s2, format='%d%b%y') - def time_end_incr_rng(self): - self.rng + self.semi_month_end + def time_no_exact(self): + to_datetime(self.s, format='%d%b%y', exact=False) - def time_end_decr_rng(self): - self.rng - self.semi_month_end - def time_begin_apply(self): - self.semi_month_begin.apply(self.date) +class ToDatetimeCache(object): - def time_begin_incr(self): - self.date + self.semi_month_begin + goal_time = 0.2 + params = [True, False] + param_names = ['cache'] - def time_begin_incr_n(self): - self.date + 10 * self.semi_month_begin + def setup(self, cache): + N = 10000 + self.unique_numeric_seconds = list(range(N)) + self.dup_numeric_seconds = [1000] * N + self.dup_string_dates = ['2000-02-11'] * N + self.dup_string_with_tz = ['2000-02-11 15:00:00-0800'] * N - def time_begin_decr(self): - self.date - self.semi_month_begin + def time_unique_seconds_and_unit(self, cache): + to_datetime(self.unique_numeric_seconds, unit='s', cache=cache) - def time_begin_decr_n(self): - self.date - 10 * self.semi_month_begin + def time_dup_seconds_and_unit(self, cache): + to_datetime(self.dup_numeric_seconds, unit='s', cache=cache) - def time_begin_apply_index(self): - self.semi_month_begin.apply_index(self.rng) + def time_dup_string_dates(self, cache): + to_datetime(self.dup_string_dates, cache=cache) - def time_begin_incr_rng(self): - self.rng + self.semi_month_begin + def time_dup_string_dates_and_format(self, cache): + to_datetime(self.dup_string_dates, format='%Y-%m-%d', cache=cache) - def time_begin_decr_rng(self): - self.rng - self.semi_month_begin + def time_dup_string_tzoffset_dates(self, cache): + to_datetime(self.dup_string_with_tz, cache=cache) class DatetimeAccessor(object): + def setup(self): - self.N = 100000 - self.series = pd.Series( - pd.date_range(start='1/1/2000', periods=self.N, freq='T') - ) + N = 100000 + self.series = Series(date_range(start='1/1/2000', periods=N, freq='T')) def time_dt_accessor(self): self.series.dt diff --git a/asv_bench/benchmarks/timestamp.py b/asv_bench/benchmarks/timestamp.py index e8cb4c9d1c75bd..c142a9b59fc43f 100644 --- a/asv_bench/benchmarks/timestamp.py +++ b/asv_bench/benchmarks/timestamp.py @@ -1,89 +1,119 @@ -from .pandas_vb_common import * -from pandas import to_timedelta, Timestamp -import pytz import datetime +from pandas import Timestamp +import pytz + + +class TimestampConstruction(object): + + def time_parse_iso8601_no_tz(self): + Timestamp('2017-08-25 08:16:14') + + def time_parse_iso8601_tz(self): + Timestamp('2017-08-25 08:16:14-0500') + + def time_parse_dateutil(self): + Timestamp('2017/08/25 08:16:14 AM') + + def time_parse_today(self): + Timestamp('today') + + def time_parse_now(self): + Timestamp('now') + + def time_fromordinal(self): + Timestamp.fromordinal(730120) + + def time_fromtimestamp(self): + Timestamp.fromtimestamp(1515448538) + class TimestampProperties(object): goal_time = 0.2 - def setup(self): - self.ts = Timestamp('2017-08-25 08:16:14') + _tzs = [None, pytz.timezone('Europe/Amsterdam')] + _freqs = [None, 'B'] + params = [_tzs, _freqs] + param_names = ['tz', 'freq'] - def time_tz(self): - self.ts.tz + def setup(self, tz, freq): + self.ts = Timestamp('2017-08-25 08:16:14', tzinfo=tz, freq=freq) - def time_offset(self): - self.ts.offset + def time_tz(self, tz, freq): + self.ts.tz - def time_dayofweek(self): + def time_dayofweek(self, tz, freq): self.ts.dayofweek - def time_weekday_name(self): + def time_weekday_name(self, tz, freq): self.ts.weekday_name - def time_dayofyear(self): + def time_dayofyear(self, tz, freq): self.ts.dayofyear - def time_week(self): + def time_week(self, tz, freq): self.ts.week - def time_quarter(self): + def time_quarter(self, tz, freq): self.ts.quarter - def time_days_in_month(self): + def time_days_in_month(self, tz, freq): self.ts.days_in_month - def time_freqstr(self): + def time_freqstr(self, tz, freq): self.ts.freqstr - def time_is_month_start(self): + def time_is_month_start(self, tz, freq): self.ts.is_month_start - def time_is_month_end(self): + def time_is_month_end(self, tz, freq): self.ts.is_month_end - def time_is_quarter_start(self): + def time_is_quarter_start(self, tz, freq): self.ts.is_quarter_start - def time_is_quarter_end(self): + def time_is_quarter_end(self, tz, freq): self.ts.is_quarter_end - def time_is_year_start(self): + def time_is_year_start(self, tz, freq): self.ts.is_quarter_end - def time_is_year_end(self): + def time_is_year_end(self, tz, freq): self.ts.is_quarter_end - def time_is_leap_year(self): + def time_is_leap_year(self, tz, freq): self.ts.is_quarter_end - def time_microsecond(self): + def time_microsecond(self, tz, freq): self.ts.microsecond class TimestampOps(object): goal_time = 0.2 - def setup(self): - self.ts = Timestamp('2017-08-25 08:16:14') - self.ts_tz = Timestamp('2017-08-25 08:16:14', tz='US/Eastern') + params = [None, 'US/Eastern'] + param_names = ['tz'] - dt = datetime.datetime(2016, 3, 27, 1) - self.tzinfo = pytz.timezone('CET').localize(dt, is_dst=False).tzinfo - self.ts2 = Timestamp(dt) + def setup(self, tz): + self.ts = Timestamp('2017-08-25 08:16:14', tz=tz) - def time_replace_tz(self): + def time_replace_tz(self, tz): self.ts.replace(tzinfo=pytz.timezone('US/Eastern')) - def time_replace_across_dst(self): - self.ts2.replace(tzinfo=self.tzinfo) - - def time_replace_None(self): - self.ts_tz.replace(tzinfo=None) + def time_replace_None(self, tz): + self.ts.replace(tzinfo=None) - def time_to_pydatetime(self): + def time_to_pydatetime(self, tz): self.ts.to_pydatetime() - def time_to_pydatetime_tz(self): - self.ts_tz.to_pydatetime() + +class TimestampAcrossDst(object): + goal_time = 0.2 + + def setup(self): + dt = datetime.datetime(2016, 3, 27, 1) + self.tzinfo = pytz.timezone('CET').localize(dt, is_dst=False).tzinfo + self.ts2 = Timestamp(dt) + + def time_replace_across_dst(self): + self.ts2.replace(tzinfo=self.tzinfo) diff --git a/asv_bench/vbench_to_asv.py b/asv_bench/vbench_to_asv.py deleted file mode 100644 index 2a4ce5d183ea2b..00000000000000 --- a/asv_bench/vbench_to_asv.py +++ /dev/null @@ -1,163 +0,0 @@ -import ast -import vbench -import os -import sys -import astor -import glob - - -def vbench_to_asv_source(bench, kinds=None): - tab = ' ' * 4 - if kinds is None: - kinds = ['time'] - - output = 'class {}(object):\n'.format(bench.name) - output += tab + 'goal_time = 0.2\n\n' - - if bench.setup: - indented_setup = [tab * 2 + '{}\n'.format(x) for x in bench.setup.splitlines()] - output += tab + 'def setup(self):\n' + ''.join(indented_setup) + '\n' - - for kind in kinds: - output += tab + 'def {}_{}(self):\n'.format(kind, bench.name) - for line in bench.code.splitlines(): - output += tab * 2 + line + '\n' - output += '\n\n' - - if bench.cleanup: - output += tab + 'def teardown(self):\n' + tab * 2 + bench.cleanup - - output += '\n\n' - return output - - -class AssignToSelf(ast.NodeTransformer): - def __init__(self): - super(AssignToSelf, self).__init__() - self.transforms = {} - self.imports = [] - - self.in_class_define = False - self.in_setup = False - - def visit_ClassDef(self, node): - self.transforms = {} - self.in_class_define = True - - functions_to_promote = [] - setup_func = None - - for class_func in ast.iter_child_nodes(node): - if isinstance(class_func, ast.FunctionDef): - if class_func.name == 'setup': - setup_func = class_func - for anon_func in ast.iter_child_nodes(class_func): - if isinstance(anon_func, ast.FunctionDef): - functions_to_promote.append(anon_func) - - if setup_func: - for func in functions_to_promote: - setup_func.body.remove(func) - func.args.args.insert(0, ast.Name(id='self', ctx=ast.Load())) - node.body.append(func) - self.transforms[func.name] = 'self.' + func.name - - ast.fix_missing_locations(node) - - self.generic_visit(node) - - return node - - def visit_TryExcept(self, node): - if any([isinstance(x, (ast.Import, ast.ImportFrom)) for x in node.body]): - self.imports.append(node) - else: - self.generic_visit(node) - return node - - def visit_Assign(self, node): - for target in node.targets: - if isinstance(target, ast.Name) and not isinstance(target.ctx, ast.Param) and not self.in_class_define: - self.transforms[target.id] = 'self.' + target.id - self.generic_visit(node) - - return node - - def visit_Name(self, node): - new_node = node - if node.id in self.transforms: - if not isinstance(node.ctx, ast.Param): - new_node = ast.Attribute(value=ast.Name(id='self', ctx=node.ctx), attr=node.id, ctx=node.ctx) - - self.generic_visit(node) - - return ast.copy_location(new_node, node) - - def visit_Import(self, node): - self.imports.append(node) - - def visit_ImportFrom(self, node): - self.imports.append(node) - - def visit_FunctionDef(self, node): - """Delete functions that are empty due to imports being moved""" - self.in_class_define = False - - self.generic_visit(node) - - if node.body: - return node - - -def translate_module(target_module): - g_vars = {} - l_vars = {} - exec('import ' + target_module) in g_vars - - print(target_module) - module = eval(target_module, g_vars) - - benchmarks = [] - for obj_str in dir(module): - obj = getattr(module, obj_str) - if isinstance(obj, vbench.benchmark.Benchmark): - benchmarks.append(obj) - - if not benchmarks: - return - - rewritten_output = '' - for bench in benchmarks: - rewritten_output += vbench_to_asv_source(bench) - - with open('rewrite.py', 'w') as f: - f.write(rewritten_output) - - ast_module = ast.parse(rewritten_output) - - transformer = AssignToSelf() - transformed_module = transformer.visit(ast_module) - - unique_imports = {astor.to_source(node): node for node in transformer.imports} - - transformed_module.body = unique_imports.values() + transformed_module.body - - transformed_source = astor.to_source(transformed_module) - - with open('benchmarks/{}.py'.format(target_module), 'w') as f: - f.write(transformed_source) - - -if __name__ == '__main__': - cwd = os.getcwd() - new_dir = os.path.join(os.path.dirname(__file__), '../vb_suite') - sys.path.insert(0, new_dir) - - for module in glob.glob(os.path.join(new_dir, '*.py')): - mod = os.path.basename(module) - if mod in ['make.py', 'measure_memory_consumption.py', 'perf_HEAD.py', 'run_suite.py', 'test_perf.py', 'generate_rst_files.py', 'test.py', 'suite.py']: - continue - print('') - print(mod) - - translate_module(mod.replace('.py', '')) diff --git a/ci/appveyor-27.yaml b/ci/appveyor-27.yaml new file mode 100644 index 00000000000000..bcd9ddee1715ed --- /dev/null +++ b/ci/appveyor-27.yaml @@ -0,0 +1,31 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - beautifulsoup4 + - bottleneck + - dateutil + - gcsfs + - html5lib + - jinja2=2.8 + - lxml + - matplotlib + - numexpr + - numpy=1.12* + - openpyxl=2.5.5 + - pytables + - python=2.7.* + - pytz + - s3fs + - scipy + - sqlalchemy + - xlrd + - xlsxwriter + - xlwt + # universal + - cython>=0.28.2 + - pytest + - pytest-xdist + - moto + - hypothesis>=3.58.0 diff --git a/ci/appveyor-36.yaml b/ci/appveyor-36.yaml new file mode 100644 index 00000000000000..6230e9b6a1885f --- /dev/null +++ b/ci/appveyor-36.yaml @@ -0,0 +1,28 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - blosc + - bottleneck + - fastparquet + - feather-format + - matplotlib + - numexpr + - numpy=1.14* + - openpyxl=2.5.5 + - pyarrow + - pytables + - python-dateutil + - python=3.6.* + - pytz + - scipy + - thrift=0.10* + - xlrd + - xlsxwriter + - xlwt + # universal + - cython>=0.28.2 + - pytest + - pytest-xdist + - hypothesis>=3.58.0 diff --git a/ci/before_install_travis.sh b/ci/before_script_travis.sh similarity index 93% rename from ci/before_install_travis.sh rename to ci/before_script_travis.sh index 2d0b4da6120dc3..0b3939b1906a24 100755 --- a/ci/before_install_travis.sh +++ b/ci/before_script_travis.sh @@ -4,6 +4,7 @@ echo "inside $0" if [ "${TRAVIS_OS_NAME}" == "linux" ]; then sh -e /etc/init.d/xvfb start + sleep 3 fi # Never fail because bad things happened here. diff --git a/ci/build_docs.sh b/ci/build_docs.sh index a038304fe0f7ae..f445447e3565c4 100755 --- a/ci/build_docs.sh +++ b/ci/build_docs.sh @@ -8,15 +8,6 @@ fi cd "$TRAVIS_BUILD_DIR" echo "inside $0" -git show --pretty="format:" --name-only HEAD~5.. --first-parent | grep -P "rst|txt|doc" - -if [ "$?" != "0" ]; then - echo "Skipping doc build, none were modified" - # nope, skip docs build - exit 0 -fi - - if [ "$DOC" ]; then echo "Will build docs" @@ -24,6 +15,7 @@ if [ "$DOC" ]; then source activate pandas mv "$TRAVIS_BUILD_DIR"/doc /tmp + mv "$TRAVIS_BUILD_DIR/LICENSE" /tmp # included in the docs. cd /tmp/doc echo ############################### @@ -59,15 +51,6 @@ if [ "$DOC" ]; then git remote -v git push origin gh-pages -f - - echo "Running doctests" - cd "$TRAVIS_BUILD_DIR" - pytest --doctest-modules \ - pandas/core/reshape/concat.py \ - pandas/core/reshape/pivot.py \ - pandas/core/reshape/reshape.py \ - pandas/core/reshape/tile.py - fi exit 0 diff --git a/ci/check_imports.py b/ci/check_imports.py index a83436e7d258c2..19e48b659617f7 100644 --- a/ci/check_imports.py +++ b/ci/check_imports.py @@ -5,11 +5,12 @@ blacklist = { 'bs4', + 'gcsfs', 'html5lib', 'ipython', 'jinja2' + 'hypothesis', 'lxml', - 'matplotlib', 'numexpr', 'openpyxl', 'py', diff --git a/ci/circle-27-compat.yaml b/ci/circle-27-compat.yaml new file mode 100644 index 00000000000000..84ec7e20fc8f1f --- /dev/null +++ b/ci/circle-27-compat.yaml @@ -0,0 +1,29 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - bottleneck=1.0.0 + - cython=0.28.2 + - jinja2=2.8 + - numexpr=2.4.4 # we test that we correctly don't use an unsupported numexpr + - numpy=1.9.3 + - openpyxl=2.5.5 + - psycopg2 + - pytables=3.2.2 + - python-dateutil=2.5.0 + - python=2.7* + - pytz=2013b + - scipy=0.14.0 + - sqlalchemy=0.7.8 + - xlrd=0.9.2 + - xlsxwriter=0.5.2 + - xlwt=0.7.5 + # universal + - pytest + - pytest-xdist + - pip: + - html5lib==1.0b2 + - beautifulsoup4==4.2.1 + - pymysql==0.6.0 + - hypothesis>=3.58.0 diff --git a/ci/circle-35-ascii.yaml b/ci/circle-35-ascii.yaml new file mode 100644 index 00000000000000..281ed59e2deff0 --- /dev/null +++ b/ci/circle-35-ascii.yaml @@ -0,0 +1,15 @@ +name: pandas +channels: + - defaults +dependencies: + - cython>=0.28.2 + - nomkl + - numpy + - python-dateutil + - python=3.5* + - pytz + # universal + - pytest + - pytest-xdist + - pip: + - hypothesis>=3.58.0 diff --git a/ci/circle-36-locale.yaml b/ci/circle-36-locale.yaml new file mode 100644 index 00000000000000..ef97b85406709e --- /dev/null +++ b/ci/circle-36-locale.yaml @@ -0,0 +1,35 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - beautifulsoup4 + - cython>=0.28.2 + - html5lib + - ipython + - jinja2 + - lxml + - matplotlib + - nomkl + - numexpr + - numpy + - openpyxl=2.5.5 + - psycopg2 + - pymysql + - pytables + - python-dateutil + - python=3.6* + - pytz + - s3fs + - scipy + - sqlalchemy + - xarray + - xlrd + - xlsxwriter + - xlwt + # universal + - pytest + - pytest-xdist + - moto + - pip: + - hypothesis>=3.58.0 diff --git a/ci/circle-36-locale_slow.yaml b/ci/circle-36-locale_slow.yaml new file mode 100644 index 00000000000000..14b23dd6f3e4c0 --- /dev/null +++ b/ci/circle-36-locale_slow.yaml @@ -0,0 +1,36 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - beautifulsoup4 + - cython>=0.28.2 + - gcsfs + - html5lib + - ipython + - jinja2 + - lxml + - matplotlib + - nomkl + - numexpr + - numpy + - openpyxl=2.5.5 + - psycopg2 + - pymysql + - pytables + - python-dateutil + - python=3.6* + - pytz + - s3fs + - scipy + - sqlalchemy + - xarray + - xlrd + - xlsxwriter + - xlwt + # universal + - pytest + - pytest-xdist + - moto + - pip: + - hypothesis>=3.58.0 diff --git a/ci/doctests.sh b/ci/doctests.sh new file mode 100755 index 00000000000000..a941515fde4ae9 --- /dev/null +++ b/ci/doctests.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +echo "inside $0" + + +source activate pandas +cd "$TRAVIS_BUILD_DIR" + +RET=0 + +if [ "$DOCTEST" ]; then + + echo "Running doctests" + + # running all doctests is not yet working + # pytest --doctest-modules --ignore=pandas/tests -v pandas + + # if [ $? -ne "0" ]; then + # RET=1 + # fi + + # DataFrame / Series docstrings + pytest --doctest-modules -v pandas/core/frame.py \ + -k"-assign -axes -combine -isin -itertuples -join -nlargest -nsmallest -nunique -pivot_table -quantile -query -reindex -reindex_axis -replace -round -set_index -stack -to_dict -to_stata" + + if [ $? -ne "0" ]; then + RET=1 + fi + + pytest --doctest-modules -v pandas/core/series.py \ + -k"-nonzero -reindex -searchsorted -to_dict" + + if [ $? -ne "0" ]; then + RET=1 + fi + + pytest --doctest-modules -v pandas/core/generic.py \ + -k"-_set_axis_name -_xs -describe -droplevel -groupby -interpolate -pct_change -pipe -reindex -reindex_axis -resample -sample -to_json -to_xarray -transpose -values -xs" + + if [ $? -ne "0" ]; then + RET=1 + fi + + # top-level reshaping functions + pytest --doctest-modules -v \ + pandas/core/reshape/concat.py \ + pandas/core/reshape/pivot.py \ + pandas/core/reshape/reshape.py \ + pandas/core/reshape/tile.py \ + -k"-crosstab -pivot_table -cut" + + if [ $? -ne "0" ]; then + RET=1 + fi + +else + echo "NOT running doctests" +fi + +exit $RET diff --git a/ci/environment-dev.yaml b/ci/environment-dev.yaml index c3d3d59f895c66..f3323face4144b 100644 --- a/ci/environment-dev.yaml +++ b/ci/environment-dev.yaml @@ -3,12 +3,16 @@ channels: - defaults - conda-forge dependencies: - - Cython + - Cython>=0.28.2 - NumPy + - flake8 + - flake8-comprehensions + - hypothesis>=3.58.0 - moto - - pytest - - python-dateutil + - pytest>=3.6 + - python-dateutil>=2.5.0 - python=3 - pytz - - setuptools + - setuptools>=24.2.0 - sphinx + - sphinxcontrib-spelling diff --git a/ci/install_circle.sh b/ci/install_circle.sh index fd79f907625e9d..f8bcf6bcffc995 100755 --- a/ci/install_circle.sh +++ b/ci/install_circle.sh @@ -6,14 +6,7 @@ echo "[home_dir: $home_dir]" echo "[ls -ltr]" ls -ltr -echo "[Using clean Miniconda install]" -rm -rf "$MINICONDA_DIR" - -# install miniconda -wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -q -O miniconda.sh || exit 1 -bash miniconda.sh -b -p "$MINICONDA_DIR" || exit 1 - -export PATH="$MINICONDA_DIR/bin:$PATH" +apt-get update -y && apt-get install -y build-essential postgresql-client-9.6 echo "[update conda]" conda config --set ssl_verify false || exit 1 @@ -46,15 +39,19 @@ echo "[environmental variable file]" cat $ENVS_FILE source $ENVS_FILE -export REQ_BUILD=ci/requirements-${JOB}.build -export REQ_RUN=ci/requirements-${JOB}.run -export REQ_PIP=ci/requirements-${JOB}.pip - # edit the locale override if needed if [ -n "$LOCALE_OVERRIDE" ]; then + + apt-get update && apt-get -y install locales locales-all + + export LANG=$LOCALE_OVERRIDE + export LC_ALL=$LOCALE_OVERRIDE + + python -c "import locale; locale.setlocale(locale.LC_ALL, \"$LOCALE_OVERRIDE\")" || exit 1; + echo "[Adding locale to the first line of pandas/__init__.py]" rm -f pandas/__init__.pyc - sedc="3iimport locale\nlocale.setlocale(locale.LC_ALL, '$LOCALE_OVERRIDE')\n" + sedc="3iimport locale\nlocale.setlocale(locale.LC_ALL, \"$LOCALE_OVERRIDE\")\n" sed -i "$sedc" pandas/__init__.py echo "[head -4 pandas/__init__.py]" head -4 pandas/__init__.py @@ -62,25 +59,23 @@ if [ -n "$LOCALE_OVERRIDE" ]; then fi # create envbuild deps -echo "[create env: ${REQ_BUILD}]" -time conda create -n pandas -q --file=${REQ_BUILD} || exit 1 -time conda install -n pandas pytest>=3.1.0 || exit 1 +echo "[create env]" +time conda env create -q -n pandas --file="${ENV_FILE}" || exit 1 source activate pandas -time pip install moto || exit 1 + +# remove any installed pandas package +# w/o removing anything else +echo +echo "[removing installed pandas]" +conda remove pandas -y --force +pip uninstall -y pandas # build but don't install echo "[build em]" time python setup.py build_ext --inplace || exit 1 -# we may have run installations -echo "[conda installs: ${REQ_RUN}]" -if [ -e ${REQ_RUN} ]; then - time conda install -q --file=${REQ_RUN} || exit 1 -fi +echo +echo "[show environment]" -# we may have additional pip installs -echo "[pip installs: ${REQ_PIP}]" -if [ -e ${REQ_PIP} ]; then - pip install -r $REQ_PIP -fi +conda list diff --git a/ci/install_db_circle.sh b/ci/install_db_circle.sh deleted file mode 100755 index a00f74f009f548..00000000000000 --- a/ci/install_db_circle.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -echo "installing dbs" -mysql -e 'create database pandas_nosetest;' -psql -c 'create database pandas_nosetest;' -U postgres - -echo "done" -exit 0 diff --git a/ci/install_travis.sh b/ci/install_travis.sh index b85263daa1eaca..fd4a36f86db6cc 100755 --- a/ci/install_travis.sh +++ b/ci/install_travis.sh @@ -34,9 +34,9 @@ fi # install miniconda if [ "${TRAVIS_OS_NAME}" == "osx" ]; then - time wget http://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -O miniconda.sh || exit 1 + time wget http://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh -q -O miniconda.sh || exit 1 else - time wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh || exit 1 + time wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -q -O miniconda.sh || exit 1 fi time bash miniconda.sh -b -p "$MINICONDA_DIR" || exit 1 @@ -50,16 +50,6 @@ conda config --set ssl_verify false || exit 1 conda config --set quiet true --set always_yes true --set changeps1 false || exit 1 conda update -q conda -echo -echo "[add channels]" -conda config --remove channels defaults || exit 1 -conda config --add channels defaults || exit 1 - -if [ "$CONDA_FORGE" ]; then - # add conda-forge channel as priority - conda config --add channels conda-forge || exit 1 -fi - # Useful for debugging any issues with conda conda info -a || exit 1 @@ -90,64 +80,10 @@ echo echo "[create env]" # create our environment -REQ="ci/requirements-${JOB}.build" -time conda create -n pandas --file=${REQ} || exit 1 +time conda env create -q -n pandas --file="${ENV_FILE}" || exit 1 source activate pandas -# may have addtl installation instructions for this build -echo -echo "[build addtl installs]" -REQ="ci/requirements-${JOB}.build.sh" -if [ -e ${REQ} ]; then - time bash $REQ || exit 1 -fi - -time conda install -n pandas pytest>=3.1.0 -time pip install pytest-xdist moto - -if [ "$LINT" ]; then - conda install flake8 - pip install cpplint -fi - -if [ "$COVERAGE" ]; then - pip install coverage pytest-cov -fi - -echo -if [ -z "$BUILD_TEST" ]; then - - # build but don't install - echo "[build em]" - time python setup.py build_ext --inplace || exit 1 - -fi - -# we may have run installations -echo -echo "[conda installs]" -REQ="ci/requirements-${JOB}.run" -if [ -e ${REQ} ]; then - time conda install -n pandas --file=${REQ} || exit 1 -fi - -# we may have additional pip installs -echo -echo "[pip installs]" -REQ="ci/requirements-${JOB}.pip" -if [ -e ${REQ} ]; then - pip install -r $REQ -fi - -# may have addtl installation instructions for this build -echo -echo "[addtl installs]" -REQ="ci/requirements-${JOB}.sh" -if [ -e ${REQ} ]; then - time bash $REQ || exit 1 -fi - # remove any installed pandas package # w/o removing anything else echo @@ -155,31 +91,18 @@ echo "[removing installed pandas]" conda remove pandas -y --force pip uninstall -y pandas -if [ "$BUILD_TEST" ]; then - - # remove any installation - pip uninstall -y pandas - conda list pandas - pip list --format columns |grep pandas - - # build & install testing - echo ["building release"] - bash scripts/build_dist_for_release.sh - conda uninstall -y cython - time pip install dist/*tar.gz || exit 1 - -else - - # install our pandas - echo - echo "[running setup.py develop]" - python setup.py develop || exit 1 +echo +echo "[no installed pandas]" +conda list pandas +pip list --format columns |grep pandas -fi +# build and install +echo "[running setup.py develop]" +python setup.py develop || exit 1 echo -echo "[show pandas]" -conda list pandas +echo "[show environment]" +conda list echo echo "[done]" diff --git a/ci/lint.sh b/ci/lint.sh index 43d6ea0c118b02..533e1d18d8e0ed 100755 --- a/ci/lint.sh +++ b/ci/lint.sh @@ -8,23 +8,59 @@ RET=0 if [ "$LINT" ]; then + # We're ignoring the following codes across the board + #E402, # module level import not at top of file + #E731, # do not assign a lambda expression, use a def + #E741, # do not use variables named 'l', 'O', or 'I' + #W503, # line break before binary operator + #C406, # Unnecessary (list/tuple) literal - rewrite as a dict literal. + #C408, # Unnecessary (dict/list/tuple) call - rewrite as a literal. + #C409, # Unnecessary (list/tuple) passed to tuple() - (remove the outer call to tuple()/rewrite as a tuple literal). + #C410 # Unnecessary (list/tuple) passed to list() - (remove the outer call to list()/rewrite as a list literal). + # pandas/_libs/src is C code, so no need to search there. - echo "Linting *.py" - flake8 pandas --filename=*.py --exclude pandas/_libs/src + echo "Linting *.py" + flake8 pandas --filename=*.py --exclude pandas/_libs/src --ignore=C406,C408,C409,E402,E731,E741,W503 + if [ $? -ne "0" ]; then + RET=1 + fi + + flake8 scripts/tests --filename=*.py if [ $? -ne "0" ]; then RET=1 fi echo "Linting *.py DONE" echo "Linting setup.py" - flake8 setup.py + flake8 setup.py --ignore=E402,E731,E741,W503 if [ $? -ne "0" ]; then RET=1 fi echo "Linting setup.py DONE" + echo "Linting asv_bench/benchmarks/" + flake8 asv_bench/benchmarks/ --exclude=asv_bench/benchmarks/*.py --ignore=F811,C406,C408,C409,C410 + if [ $? -ne "0" ]; then + RET=1 + fi + echo "Linting asv_bench/benchmarks/*.py DONE" + + echo "Linting scripts/*.py" + flake8 scripts --filename=*.py --ignore=C408,E402,E731,E741,W503 + if [ $? -ne "0" ]; then + RET=1 + fi + echo "Linting scripts/*.py DONE" + + echo "Linting doc scripts" + flake8 doc/make.py doc/source/conf.py --ignore=E402,E731,E741,W503 + if [ $? -ne "0" ]; then + RET=1 + fi + echo "Linting doc scripts DONE" + echo "Linting *.pyx" - flake8 pandas --filename=*.pyx --select=E501,E302,E203,E111,E114,E221,E303,E128,E231,E126,E265,E305,E301,E127,E261,E271,E129,W291,E222,E241,E123,F403 + flake8 pandas --filename=*.pyx --select=E501,E302,E203,E111,E114,E221,E303,E128,E231,E126,E265,E305,E301,E127,E261,E271,E129,W291,E222,E241,E123,F403,C400,C401,C402,C403,C404,C405,C406,C407,C408,C409,C410,C411 if [ $? -ne "0" ]; then RET=1 fi @@ -38,10 +74,20 @@ if [ "$LINT" ]; then if [ $? -ne "0" ]; then RET=1 fi - done echo "Linting *.pxi.in DONE" + echo "Linting *.pxd" + for path in '_libs' + do + echo "linting -> pandas/$path" + flake8 pandas/$path --filename=*.pxd --select=E501,E302,E203,E111,E114,E221,E303,E231,E126,F403 + if [ $? -ne "0" ]; then + RET=1 + fi + done + echo "Linting *.pxd DONE" + # readability/casting: Warnings about C casting instead of C++ casting # runtime/int: Warnings about using C number types instead of C++ ones # build/include_subdir: Warnings about prefacing included header files with directory @@ -51,7 +97,7 @@ if [ "$LINT" ]; then # this particular codebase (e.g. src/headers, src/klib, src/msgpack). However, # we can lint all header files since they aren't "generated" like C files are. echo "Linting *.c and *.h" - for path in '*.h' 'period_helper.c' 'datetime' 'parser' 'ujson' + for path in '*.h' 'parser' 'ujson' do echo "linting -> pandas/_libs/src/$path" cpplint --quiet --extensions=c,h --headers=h --filter=-readability/casting,-runtime/int,-build/include_subdir --recursive pandas/_libs/src/$path @@ -59,15 +105,90 @@ if [ "$LINT" ]; then RET=1 fi done + echo "linting -> pandas/_libs/tslibs/src/datetime" + cpplint --quiet --extensions=c,h --headers=h --filter=-readability/casting,-runtime/int,-build/include_subdir --recursive pandas/_libs/tslibs/src/datetime + if [ $? -ne "0" ]; then + RET=1 + fi echo "Linting *.c and *.h DONE" echo "Check for invalid testing" - grep -r -E --include '*.py' --exclude testing.py '(numpy|np)\.testing' pandas + + # Check for the following code in testing: + # + # np.testing + # np.array_equal + grep -r -E --include '*.py' --exclude testing.py '(numpy|np)(\.testing|\.array_equal)' pandas/tests/ + if [ $? = "0" ]; then RET=1 fi + + # Check for pytest.warns + grep -r -E --include '*.py' 'pytest\.warns' pandas/tests/ + + if [ $? = "0" ]; then + RET=1 + fi + + # Check for the following code in the extension array base tests + # tm.assert_frame_equal + # tm.assert_series_equal + grep -r -E --include '*.py' --exclude base.py 'tm.assert_(series|frame)_equal' pandas/tests/extension/base + + if [ $? = "0" ]; then + RET=1 + fi + echo "Check for invalid testing DONE" + # Check for imports from pandas.core.common instead + # of `import pandas.core.common as com` + echo "Check for non-standard imports" + grep -R --include="*.py*" -E "from pandas.core.common import " pandas + if [ $? = "0" ]; then + RET=1 + fi + echo "Check for non-standard imports DONE" + + echo "Check for incorrect sphinx directives" + SPHINX_DIRECTIVES=$(echo \ + "autosummary|contents|currentmodule|deprecated|function|image|"\ + "important|include|ipython|literalinclude|math|module|note|raw|"\ + "seealso|toctree|versionadded|versionchanged|warning" | tr -d "[:space:]") + for path in './pandas' './doc/source' + do + grep -R --include="*.py" --include="*.pyx" --include="*.rst" -E "\.\. ($SPHINX_DIRECTIVES):[^:]" $path + if [ $? = "0" ]; then + RET=1 + fi + done + echo "Check for incorrect sphinx directives DONE" + + echo "Check for deprecated messages without sphinx directive" + grep -R --include="*.py" --include="*.pyx" -E "(DEPRECATED|DEPRECATE|Deprecated)(:|,|\.)" pandas + + if [ $? = "0" ]; then + RET=1 + fi + echo "Check for deprecated messages without sphinx directive DONE" + + echo "Check for old-style classes" + grep -R --include="*.py" -E "class\s\S*[^)]:" pandas scripts + + if [ $? = "0" ]; then + RET=1 + fi + echo "Check for old-style classes DONE" + + echo "Check for backticks incorrectly rendering because of missing spaces" + grep -R --include="*.rst" -E "[a-zA-Z0-9]\`\`?[a-zA-Z0-9]" doc/source/ + + if [ $? = "0" ]; then + RET=1 + fi + echo "Check for backticks incorrectly rendering because of missing spaces DONE" + else echo "NOT Linting" fi diff --git a/ci/print_skipped.py b/ci/print_skipped.py index dd2180f6eeb193..67bc7b556cd439 100755 --- a/ci/print_skipped.py +++ b/ci/print_skipped.py @@ -10,7 +10,7 @@ def parse_results(filename): root = tree.getroot() skipped = [] - current_class = old_class = '' + current_class = '' i = 1 assert i - 1 == len(skipped) for el in root.findall('testcase'): @@ -24,7 +24,9 @@ def parse_results(filename): out = '' if old_class != current_class: ndigits = int(math.log(i, 10) + 1) - out += ('-' * (len(name + msg) + 4 + ndigits) + '\n') # 4 for : + space + # + space + + # 4 for : + space + # + space + out += ('-' * (len(name + msg) + 4 + ndigits) + '\n') out += '#{i} {name}: {msg}'.format(i=i, name=name, msg=msg) skipped.append(out) i += 1 diff --git a/ci/requirements-2.7.build b/ci/requirements-2.7.build deleted file mode 100644 index 415df13179fcf9..00000000000000 --- a/ci/requirements-2.7.build +++ /dev/null @@ -1,6 +0,0 @@ -python=2.7* -python-dateutil=2.4.1 -pytz=2013b -nomkl -numpy -cython=0.23 diff --git a/ci/requirements-2.7.pip b/ci/requirements-2.7.pip deleted file mode 100644 index 876d9e978fa849..00000000000000 --- a/ci/requirements-2.7.pip +++ /dev/null @@ -1,10 +0,0 @@ -blosc -pandas-gbq -html5lib -beautifulsoup4 -pathlib -backports.lzma -py -PyCrypto -mock -ipython diff --git a/ci/requirements-2.7.run b/ci/requirements-2.7.run deleted file mode 100644 index a68e1d256058df..00000000000000 --- a/ci/requirements-2.7.run +++ /dev/null @@ -1,20 +0,0 @@ -python-dateutil=2.4.1 -pytz=2013b -numpy -xlwt=0.7.5 -numexpr -pytables -matplotlib -openpyxl=1.6.2 -xlrd=0.9.2 -sqlalchemy=0.9.6 -lxml -scipy -xlsxwriter=0.5.2 -s3fs -bottleneck -psycopg2 -patsy -pymysql=0.6.3 -jinja2=2.8 -xarray=0.8.0 diff --git a/ci/requirements-2.7.sh b/ci/requirements-2.7.sh deleted file mode 100644 index e3bd5e46026c54..00000000000000 --- a/ci/requirements-2.7.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -source activate pandas - -echo "install 27" - -conda install -n pandas -c conda-forge feather-format pyarrow=0.4.1 fastparquet diff --git a/ci/requirements-2.7_BUILD_TEST.build b/ci/requirements-2.7_BUILD_TEST.build deleted file mode 100644 index aadec00cb7ebf2..00000000000000 --- a/ci/requirements-2.7_BUILD_TEST.build +++ /dev/null @@ -1,6 +0,0 @@ -python=2.7* -dateutil -pytz -nomkl -numpy -cython diff --git a/ci/requirements-2.7_BUILD_TEST.pip b/ci/requirements-2.7_BUILD_TEST.pip deleted file mode 100644 index a0fc77c40bc00d..00000000000000 --- a/ci/requirements-2.7_BUILD_TEST.pip +++ /dev/null @@ -1,7 +0,0 @@ -xarray -geopandas -seaborn -pandas_gbq -pandas_datareader -statsmodels -scikit-learn diff --git a/ci/requirements-2.7_BUILD_TEST.sh b/ci/requirements-2.7_BUILD_TEST.sh deleted file mode 100755 index 78941fd0944e57..00000000000000 --- a/ci/requirements-2.7_BUILD_TEST.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -source activate pandas - -echo "install 27 BUILD_TEST" - -conda install -n pandas -c conda-forge pyarrow dask diff --git a/ci/requirements-2.7_COMPAT.build b/ci/requirements-2.7_COMPAT.build deleted file mode 100644 index d9c932daa110ba..00000000000000 --- a/ci/requirements-2.7_COMPAT.build +++ /dev/null @@ -1,5 +0,0 @@ -python=2.7* -numpy=1.9.2 -cython=0.23 -dateutil=1.5 -pytz=2013b diff --git a/ci/requirements-2.7_COMPAT.pip b/ci/requirements-2.7_COMPAT.pip deleted file mode 100644 index 13cd35a923124f..00000000000000 --- a/ci/requirements-2.7_COMPAT.pip +++ /dev/null @@ -1,4 +0,0 @@ -html5lib==1.0b2 -beautifulsoup4==4.2.0 -openpyxl -argparse diff --git a/ci/requirements-2.7_COMPAT.run b/ci/requirements-2.7_COMPAT.run deleted file mode 100644 index 39bf7201407333..00000000000000 --- a/ci/requirements-2.7_COMPAT.run +++ /dev/null @@ -1,14 +0,0 @@ -numpy=1.9.2 -dateutil=1.5 -pytz=2013b -scipy=0.14.0 -xlwt=0.7.5 -xlrd=0.9.2 -bottleneck=1.0.0 -numexpr=2.4.4 # we test that we correctly don't use an unsupported numexpr -pytables=3.2.2 -psycopg2 -pymysql=0.6.0 -sqlalchemy=0.7.8 -xlsxwriter=0.5.2 -jinja2=2.8 diff --git a/ci/requirements-2.7_LOCALE.build b/ci/requirements-2.7_LOCALE.build deleted file mode 100644 index 96cb184ec2665e..00000000000000 --- a/ci/requirements-2.7_LOCALE.build +++ /dev/null @@ -1,5 +0,0 @@ -python=2.7* -python-dateutil -pytz=2013b -numpy=1.9.2 -cython=0.23 diff --git a/ci/requirements-2.7_LOCALE.pip b/ci/requirements-2.7_LOCALE.pip deleted file mode 100644 index 1b825bbf492ca9..00000000000000 --- a/ci/requirements-2.7_LOCALE.pip +++ /dev/null @@ -1,3 +0,0 @@ -html5lib==1.0b2 -beautifulsoup4==4.2.1 -blosc diff --git a/ci/requirements-2.7_LOCALE.run b/ci/requirements-2.7_LOCALE.run deleted file mode 100644 index 978bbf6a051c51..00000000000000 --- a/ci/requirements-2.7_LOCALE.run +++ /dev/null @@ -1,12 +0,0 @@ -python-dateutil -pytz=2013b -numpy=1.9.2 -xlwt=0.7.5 -openpyxl=1.6.2 -xlsxwriter=0.5.2 -xlrd=0.9.2 -bottleneck=1.0.0 -matplotlib=1.4.3 -sqlalchemy=0.8.1 -lxml -scipy diff --git a/ci/requirements-2.7_SLOW.build b/ci/requirements-2.7_SLOW.build deleted file mode 100644 index a665ab9edd5850..00000000000000 --- a/ci/requirements-2.7_SLOW.build +++ /dev/null @@ -1,5 +0,0 @@ -python=2.7* -python-dateutil -pytz -numpy=1.10* -cython diff --git a/ci/requirements-2.7_SLOW.run b/ci/requirements-2.7_SLOW.run deleted file mode 100644 index db95a6ccb23140..00000000000000 --- a/ci/requirements-2.7_SLOW.run +++ /dev/null @@ -1,19 +0,0 @@ -python-dateutil -pytz -numpy=1.10* -matplotlib=1.4.3 -scipy -patsy -xlwt -openpyxl -xlsxwriter -xlrd -numexpr -pytables -sqlalchemy -lxml -s3fs -psycopg2 -pymysql -html5lib -beautifulsoup4 diff --git a/ci/requirements-2.7_WIN.run b/ci/requirements-2.7_WIN.run deleted file mode 100644 index c4ca7fc736bb17..00000000000000 --- a/ci/requirements-2.7_WIN.run +++ /dev/null @@ -1,18 +0,0 @@ -dateutil -pytz -numpy=1.10* -xlwt -numexpr -pytables==3.2.2 -matplotlib -openpyxl -xlrd -sqlalchemy -lxml -scipy -xlsxwriter -s3fs -bottleneck -html5lib -beautifulsoup4 -jinja2=2.8 diff --git a/ci/requirements-3.5.build b/ci/requirements-3.5.build deleted file mode 100644 index 76227e106e1fd4..00000000000000 --- a/ci/requirements-3.5.build +++ /dev/null @@ -1,6 +0,0 @@ -python=3.5* -python-dateutil -pytz -nomkl -numpy=1.11.3 -cython diff --git a/ci/requirements-3.5.pip b/ci/requirements-3.5.pip deleted file mode 100644 index 6e4f7b65f97286..00000000000000 --- a/ci/requirements-3.5.pip +++ /dev/null @@ -1,2 +0,0 @@ -xarray==0.9.1 -pandas-gbq diff --git a/ci/requirements-3.5.run b/ci/requirements-3.5.run deleted file mode 100644 index 52828b52209971..00000000000000 --- a/ci/requirements-3.5.run +++ /dev/null @@ -1,20 +0,0 @@ -pytz -numpy=1.11.3 -openpyxl -xlsxwriter -xlrd -xlwt -scipy -numexpr -pytables -html5lib -lxml -matplotlib -jinja2 -bottleneck -sqlalchemy -pymysql -psycopg2 -s3fs -beautifulsoup4 -ipython diff --git a/ci/requirements-3.5.sh b/ci/requirements-3.5.sh deleted file mode 100644 index d694ad3679ac12..00000000000000 --- a/ci/requirements-3.5.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -source activate pandas - -echo "install 35" - -# pip install python-dateutil to get latest -conda remove -n pandas python-dateutil --force -pip install python-dateutil - -conda install -n pandas -c conda-forge feather-format pyarrow=0.5.0 diff --git a/ci/requirements-3.5_ASCII.build b/ci/requirements-3.5_ASCII.build deleted file mode 100644 index f7befe3b318650..00000000000000 --- a/ci/requirements-3.5_ASCII.build +++ /dev/null @@ -1,6 +0,0 @@ -python=3.5* -python-dateutil -pytz -nomkl -numpy -cython diff --git a/ci/requirements-3.5_ASCII.run b/ci/requirements-3.5_ASCII.run deleted file mode 100644 index b9d543f557d06e..00000000000000 --- a/ci/requirements-3.5_ASCII.run +++ /dev/null @@ -1,3 +0,0 @@ -python-dateutil -pytz -numpy diff --git a/ci/requirements-3.5_OSX.build b/ci/requirements-3.5_OSX.build deleted file mode 100644 index f5bc01b67a20ab..00000000000000 --- a/ci/requirements-3.5_OSX.build +++ /dev/null @@ -1,4 +0,0 @@ -python=3.5* -nomkl -numpy=1.10.4 -cython diff --git a/ci/requirements-3.5_OSX.pip b/ci/requirements-3.5_OSX.pip deleted file mode 100644 index d1fc1fe24a079f..00000000000000 --- a/ci/requirements-3.5_OSX.pip +++ /dev/null @@ -1 +0,0 @@ -python-dateutil==2.5.3 diff --git a/ci/requirements-3.5_OSX.run b/ci/requirements-3.5_OSX.run deleted file mode 100644 index 1d83474d10f2fc..00000000000000 --- a/ci/requirements-3.5_OSX.run +++ /dev/null @@ -1,16 +0,0 @@ -pytz -numpy=1.10.4 -openpyxl -xlsxwriter -xlrd -xlwt -numexpr -pytables -html5lib -lxml -matplotlib -jinja2 -bottleneck -xarray -s3fs -beautifulsoup4 diff --git a/ci/requirements-3.5_OSX.sh b/ci/requirements-3.5_OSX.sh deleted file mode 100644 index c2978b175968c5..00000000000000 --- a/ci/requirements-3.5_OSX.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -source activate pandas - -echo "install 35_OSX" - -conda install -n pandas -c conda-forge feather-format==0.3.1 fastparquet diff --git a/ci/requirements-3.6.build b/ci/requirements-3.6.build deleted file mode 100644 index 1c4b46aea3865d..00000000000000 --- a/ci/requirements-3.6.build +++ /dev/null @@ -1,6 +0,0 @@ -python=3.6* -python-dateutil -pytz -nomkl -numpy -cython diff --git a/ci/requirements-3.6.pip b/ci/requirements-3.6.pip deleted file mode 100644 index 753a60d6c119ac..00000000000000 --- a/ci/requirements-3.6.pip +++ /dev/null @@ -1 +0,0 @@ -brotlipy diff --git a/ci/requirements-3.6.run b/ci/requirements-3.6.run deleted file mode 100644 index 822144a80bc9a0..00000000000000 --- a/ci/requirements-3.6.run +++ /dev/null @@ -1,25 +0,0 @@ -python-dateutil -pytz -numpy -scipy -openpyxl -xlsxwriter -xlrd -xlwt -numexpr -pytables -matplotlib -lxml -html5lib -jinja2 -sqlalchemy -pymysql -feather-format -pyarrow -psycopg2 -python-snappy -fastparquet -beautifulsoup4 -s3fs -xarray -ipython diff --git a/ci/requirements-3.6_DOC.build b/ci/requirements-3.6_DOC.build deleted file mode 100644 index bdcfe28105866e..00000000000000 --- a/ci/requirements-3.6_DOC.build +++ /dev/null @@ -1,5 +0,0 @@ -python=3.6* -python-dateutil -pytz -numpy -cython diff --git a/ci/requirements-3.6_DOC.run b/ci/requirements-3.6_DOC.run deleted file mode 100644 index 6c45e3371e9cfa..00000000000000 --- a/ci/requirements-3.6_DOC.run +++ /dev/null @@ -1,25 +0,0 @@ -ipython -ipykernel -ipywidgets -sphinx=1.5* -nbconvert -nbformat -notebook -matplotlib -seaborn -scipy -lxml -beautifulsoup4 -html5lib -pytables -python-snappy -openpyxl -xlrd -xlwt -xlsxwriter -sqlalchemy -numexpr -bottleneck -statsmodels -xarray -pyqt diff --git a/ci/requirements-3.6_DOC.sh b/ci/requirements-3.6_DOC.sh deleted file mode 100644 index aec0f62148622d..00000000000000 --- a/ci/requirements-3.6_DOC.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -source activate pandas - -echo "[install DOC_BUILD deps]" - -pip install pandas-gbq - -conda install -n pandas -c conda-forge feather-format pyarrow nbsphinx pandoc fastparquet - -conda install -n pandas -c r r rpy2 --yes diff --git a/ci/requirements-3.6_LOCALE.build b/ci/requirements-3.6_LOCALE.build deleted file mode 100644 index 1c4b46aea3865d..00000000000000 --- a/ci/requirements-3.6_LOCALE.build +++ /dev/null @@ -1,6 +0,0 @@ -python=3.6* -python-dateutil -pytz -nomkl -numpy -cython diff --git a/ci/requirements-3.6_LOCALE.run b/ci/requirements-3.6_LOCALE.run deleted file mode 100644 index ad54284c6f7e3d..00000000000000 --- a/ci/requirements-3.6_LOCALE.run +++ /dev/null @@ -1,22 +0,0 @@ -python-dateutil -pytz -numpy -scipy -openpyxl -xlsxwriter -xlrd -xlwt -numexpr -pytables -matplotlib -lxml -html5lib -jinja2 -sqlalchemy -pymysql -# feather-format (not available on defaults ATM) -psycopg2 -beautifulsoup4 -s3fs -xarray -ipython diff --git a/ci/requirements-3.6_LOCALE_SLOW.build b/ci/requirements-3.6_LOCALE_SLOW.build deleted file mode 100644 index 1c4b46aea3865d..00000000000000 --- a/ci/requirements-3.6_LOCALE_SLOW.build +++ /dev/null @@ -1,6 +0,0 @@ -python=3.6* -python-dateutil -pytz -nomkl -numpy -cython diff --git a/ci/requirements-3.6_LOCALE_SLOW.run b/ci/requirements-3.6_LOCALE_SLOW.run deleted file mode 100644 index ad54284c6f7e3d..00000000000000 --- a/ci/requirements-3.6_LOCALE_SLOW.run +++ /dev/null @@ -1,22 +0,0 @@ -python-dateutil -pytz -numpy -scipy -openpyxl -xlsxwriter -xlrd -xlwt -numexpr -pytables -matplotlib -lxml -html5lib -jinja2 -sqlalchemy -pymysql -# feather-format (not available on defaults ATM) -psycopg2 -beautifulsoup4 -s3fs -xarray -ipython diff --git a/ci/requirements-3.6_NUMPY_DEV.build b/ci/requirements-3.6_NUMPY_DEV.build deleted file mode 100644 index 336fbe86b57d88..00000000000000 --- a/ci/requirements-3.6_NUMPY_DEV.build +++ /dev/null @@ -1,2 +0,0 @@ -python=3.6* -pytz diff --git a/ci/requirements-3.6_NUMPY_DEV.build.sh b/ci/requirements-3.6_NUMPY_DEV.build.sh deleted file mode 100644 index fd79142c5cebbe..00000000000000 --- a/ci/requirements-3.6_NUMPY_DEV.build.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -source activate pandas - -echo "install numpy master wheel" - -# remove the system installed numpy -pip uninstall numpy -y - -# install numpy wheel from master -PRE_WHEELS="https://7933911d6844c6c53a7d-47bd50c35cd79bd838daf386af554a83.ssl.cf2.rackcdn.com" -pip install --pre --upgrade --timeout=60 -f $PRE_WHEELS numpy scipy - -# install dateutil from master -pip install -U git+git://github.com/dateutil/dateutil.git - -# cython via pip -pip install cython - -true diff --git a/ci/requirements-3.6_NUMPY_DEV.run b/ci/requirements-3.6_NUMPY_DEV.run deleted file mode 100644 index af44f198c687e2..00000000000000 --- a/ci/requirements-3.6_NUMPY_DEV.run +++ /dev/null @@ -1 +0,0 @@ -pytz diff --git a/ci/requirements-3.6_WIN.run b/ci/requirements-3.6_WIN.run deleted file mode 100644 index 5d6c074ec1f856..00000000000000 --- a/ci/requirements-3.6_WIN.run +++ /dev/null @@ -1,16 +0,0 @@ -python-dateutil -pytz -numpy=1.12* -bottleneck -openpyxl -xlsxwriter -xlrd -xlwt -# scipy -feather-format -numexpr -pytables -matplotlib -blosc -fastparquet -pyarrow diff --git a/ci/requirements-optional-conda.txt b/ci/requirements-optional-conda.txt index 6edb8d17337e40..376fdb1e14e3ac 100644 --- a/ci/requirements-optional-conda.txt +++ b/ci/requirements-optional-conda.txt @@ -1,17 +1,18 @@ -beautifulsoup4 +beautifulsoup4>=4.2.1 blosc bottleneck fastparquet feather-format +gcsfs html5lib -ipython +ipython>=5.6.0 ipykernel jinja2 lxml matplotlib nbsphinx numexpr -openpyxl +openpyxl=2.5.5 pyarrow pymysql pytables @@ -21,6 +22,7 @@ s3fs scipy seaborn sqlalchemy +statsmodels xarray xlrd xlsxwriter diff --git a/ci/requirements-optional-pip.txt b/ci/requirements-optional-pip.txt index 06b22bd8f2c63f..2e1bf0ca22bcf0 100644 --- a/ci/requirements-optional-pip.txt +++ b/ci/requirements-optional-pip.txt @@ -1,17 +1,20 @@ # This file was autogenerated by scripts/convert_deps.py -# Do not modify directlybeautifulsoup4 +# Do not modify directly +beautifulsoup4>=4.2.1 blosc bottleneck fastparquet feather-format +gcsfs html5lib -ipython +ipython>=5.6.0 +ipykernel jinja2 lxml matplotlib nbsphinx numexpr -openpyxl +openpyxl=2.5.5 pyarrow pymysql tables @@ -21,7 +24,8 @@ s3fs scipy seaborn sqlalchemy +statsmodels xarray xlrd xlsxwriter -xlwt \ No newline at end of file +xlwt diff --git a/ci/requirements_dev.txt b/ci/requirements_dev.txt index 2fb36b7cd70d8b..68fffe5d0df09c 100644 --- a/ci/requirements_dev.txt +++ b/ci/requirements_dev.txt @@ -1,10 +1,14 @@ # This file was autogenerated by scripts/convert_deps.py # Do not modify directly -Cython +Cython>=0.28.2 NumPy +flake8 +flake8-comprehensions +hypothesis>=3.58.0 moto -pytest -python-dateutil +pytest>=3.6 +python-dateutil>=2.5.0 pytz -setuptools -sphinx \ No newline at end of file +setuptools>=24.2.0 +sphinx +sphinxcontrib-spelling \ No newline at end of file diff --git a/ci/run_circle.sh b/ci/run_circle.sh index 0e46d28ab6fc4d..fc2a8b849a3548 100755 --- a/ci/run_circle.sh +++ b/ci/run_circle.sh @@ -5,5 +5,5 @@ export PATH="$MINICONDA_DIR/bin:$PATH" source activate pandas -echo "pytest --junitxml=$CIRCLE_TEST_REPORTS/reports/junit.xml $@ pandas" -pytest --junitxml=$CIRCLE_TEST_REPORTS/reports/junit.xml $@ pandas +echo "pytest --strict --junitxml=$CIRCLE_TEST_REPORTS/reports/junit.xml $@ pandas" +pytest --strict --color=no --junitxml=$CIRCLE_TEST_REPORTS/reports/junit.xml $@ pandas diff --git a/ci/script_multi.sh b/ci/script_multi.sh index ee9fbcaad5ef5f..2b2d4d5488b91f 100755 --- a/ci/script_multi.sh +++ b/ci/script_multi.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -e echo "[script multi]" @@ -12,38 +12,32 @@ if [ -n "$LOCALE_OVERRIDE" ]; then python -c "$pycmd" fi +# Enforce absent network during testing by faking a proxy +if echo "$TEST_ARGS" | grep -e --skip-network -q; then + export http_proxy=http://1.2.3.4 https_proxy=http://1.2.3.4; +fi + # Workaround for pytest-xdist flaky collection order # https://github.com/pytest-dev/pytest/issues/920 # https://github.com/pytest-dev/pytest/issues/1075 export PYTHONHASHSEED=$(python -c 'import random; print(random.randint(1, 4294967295))') echo PYTHONHASHSEED=$PYTHONHASHSEED -if [ "$BUILD_TEST" ]; then - echo "[build-test]" - - echo "[env]" - pip list --format columns |grep pandas - - echo "[running]" - cd /tmp - unset PYTHONPATH - python -c 'import pandas; pandas.test(["-n 2", "--skip-slow", "--skip-network", "-r xX", "-m not single"])' - -elif [ "$DOC" ]; then +if [ "$DOC" ]; then echo "We are not running pytest as this is a doc-build" elif [ "$COVERAGE" ]; then - echo pytest -s -n 2 -m "not single" --cov=pandas --cov-report xml:/tmp/cov-multiple.xml --junitxml=/tmp/multiple.xml $TEST_ARGS pandas - pytest -s -n 2 -m "not single" --cov=pandas --cov-report xml:/tmp/cov-multiple.xml --junitxml=/tmp/multiple.xml $TEST_ARGS pandas + echo pytest -s -n 2 -m "not single" --cov=pandas --cov-report xml:/tmp/cov-multiple.xml --junitxml=/tmp/multiple.xml --strict $TEST_ARGS pandas + pytest -s -n 2 -m "not single" --cov=pandas --cov-report xml:/tmp/cov-multiple.xml --junitxml=/tmp/multiple.xml --strict $TEST_ARGS pandas elif [ "$SLOW" ]; then TEST_ARGS="--only-slow --skip-network" - echo pytest -r xX -m "not single and slow" -v --junitxml=/tmp/multiple.xml $TEST_ARGS pandas - pytest -r xX -m "not single and slow" -v --junitxml=/tmp/multiple.xml $TEST_ARGS pandas + echo pytest -r xX -m "not single and slow" -v --junitxml=/tmp/multiple.xml --strict $TEST_ARGS pandas + pytest -r xX -m "not single and slow" -v --junitxml=/tmp/multiple.xml --strict $TEST_ARGS pandas else - echo pytest -n 2 -r xX -m "not single" --junitxml=/tmp/multiple.xml $TEST_ARGS pandas - pytest -n 2 -r xX -m "not single" --junitxml=/tmp/multiple.xml $TEST_ARGS pandas # TODO: doctest + echo pytest -n 2 -r xX -m "not single" --junitxml=/tmp/multiple.xml --strict $TEST_ARGS pandas + pytest -n 2 -r xX -m "not single" --junitxml=/tmp/multiple.xml --strict $TEST_ARGS pandas # TODO: doctest fi diff --git a/ci/script_single.sh b/ci/script_single.sh index 375e9879e950fd..ed12ee35b91513 100755 --- a/ci/script_single.sh +++ b/ci/script_single.sh @@ -16,19 +16,23 @@ if [ "$SLOW" ]; then TEST_ARGS="--only-slow --skip-network" fi -if [ "$BUILD_TEST" ]; then - echo "We are not running pytest as this is a build test." +# Enforce absent network during testing by faking a proxy +if echo "$TEST_ARGS" | grep -e --skip-network -q; then + export http_proxy=http://1.2.3.4 https_proxy=http://1.2.3.4; +fi -elif [ "$DOC" ]; then +if [ "$DOC" ]; then echo "We are not running pytest as this is a doc-build" elif [ "$COVERAGE" ]; then - echo pytest -s -m "single" --cov=pandas --cov-report xml:/tmp/cov-single.xml --junitxml=/tmp/single.xml $TEST_ARGS pandas - pytest -s -m "single" --cov=pandas --cov-report xml:/tmp/cov-single.xml --junitxml=/tmp/single.xml $TEST_ARGS pandas + echo pytest -s -m "single" -r xXs --strict --cov=pandas --cov-report xml:/tmp/cov-single.xml --junitxml=/tmp/single.xml $TEST_ARGS pandas + pytest -s -m "single" -r xXs --strict --cov=pandas --cov-report xml:/tmp/cov-single.xml --junitxml=/tmp/single.xml $TEST_ARGS pandas + echo pytest -s -r xXs --strict scripts + pytest -s -r xXs --strict scripts else - echo pytest -m "single" -r xX --junitxml=/tmp/single.xml $TEST_ARGS pandas - pytest -m "single" -r xX --junitxml=/tmp/single.xml $TEST_ARGS pandas # TODO: doctest + echo pytest -m "single" -r xXs --junitxml=/tmp/single.xml --strict $TEST_ARGS pandas + pytest -m "single" -r xXs --junitxml=/tmp/single.xml --strict $TEST_ARGS pandas # TODO: doctest fi diff --git a/ci/travis-27-locale.yaml b/ci/travis-27-locale.yaml new file mode 100644 index 00000000000000..aca65f27d41876 --- /dev/null +++ b/ci/travis-27-locale.yaml @@ -0,0 +1,28 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - bottleneck=1.0.0 + - cython=0.28.2 + - lxml + - matplotlib=1.4.3 + - numpy=1.9.3 + - openpyxl=2.4.0 + - python-dateutil + - python-blosc + - python=2.7 + - pytz + - pytz=2013b + - scipy + - sqlalchemy=0.8.1 + - xlrd=0.9.2 + - xlsxwriter=0.5.2 + - xlwt=0.7.5 + # universal + - pytest + - pytest-xdist + - hypothesis>=3.58.0 + - pip: + - html5lib==1.0b2 + - beautifulsoup4==4.2.1 diff --git a/ci/travis-27.yaml b/ci/travis-27.yaml new file mode 100644 index 00000000000000..a921bcb46dba4f --- /dev/null +++ b/ci/travis-27.yaml @@ -0,0 +1,53 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - beautifulsoup4 + - bottleneck + - cython=0.28.2 + - fastparquet + - feather-format + - flake8=3.4.1 + - flake8-comprehensions + - gcsfs + - html5lib + - ipython + - jemalloc=4.5.0.post + - jinja2=2.8 + - lxml + - matplotlib + - mock + - nomkl + - numexpr + - numpy=1.13* + - openpyxl=2.4.0 + - patsy + - psycopg2 + - py + - pyarrow=0.4.1 + - PyCrypto + - pymysql=0.6.3 + - pytables + - blosc=1.14.3 + - python-blosc + - python-dateutil=2.5.0 + - python=2.7* + - pytz=2013b + - s3fs + - scipy + - sqlalchemy=0.9.6 + - xarray=0.8.0 + - xlrd=0.9.2 + - xlsxwriter=0.5.2 + - xlwt=0.7.5 + # universal + - pytest + - pytest-xdist + - moto + - hypothesis>=3.58.0 + - pip: + - backports.lzma + - cpplint + - pandas-gbq + - pathlib diff --git a/ci/travis-35-osx.yaml b/ci/travis-35-osx.yaml new file mode 100644 index 00000000000000..a36f748ded8129 --- /dev/null +++ b/ci/travis-35-osx.yaml @@ -0,0 +1,28 @@ +name: pandas +channels: + - defaults +dependencies: + - beautifulsoup4 + - bottleneck + - cython>=0.28.2 + - html5lib + - jinja2 + - lxml + - matplotlib + - nomkl + - numexpr + - numpy=1.10.4 + - openpyxl=2.5.5 + - pytables + - python=3.5* + - pytz + - xarray + - xlrd + - xlsxwriter + - xlwt + # universal + - pytest + - pytest-xdist + - pip: + - python-dateutil==2.5.3 + - hypothesis>=3.58.0 diff --git a/ci/travis-36-doc.yaml b/ci/travis-36-doc.yaml new file mode 100644 index 00000000000000..50626088d5bc49 --- /dev/null +++ b/ci/travis-36-doc.yaml @@ -0,0 +1,47 @@ +name: pandas +channels: + - defaults + - conda-forge + - r +dependencies: + - beautifulsoup4 + - bottleneck + - cython>=0.28.2 + - fastparquet + - feather-format + - html5lib + - hypothesis>=3.58.0 + - ipykernel + - ipython + - ipywidgets + - lxml + - matplotlib + - nbconvert + - nbformat + - nbsphinx + - notebook + - numexpr + - numpy=1.13* + - openpyxl=2.5.5 + - pandoc + - pyqt + - pytables + - python-dateutil + - python-snappy + - python=3.6* + - pytz + - r + - rpy2 + - scipy + - seaborn + - sphinx + - sqlalchemy + - statsmodels + - tzlocal + - xarray + - xlrd + - xlsxwriter + - xlwt + # universal + - pytest + - pytest-xdist diff --git a/ci/travis-36-slow.yaml b/ci/travis-36-slow.yaml new file mode 100644 index 00000000000000..1a7bc53e1b74be --- /dev/null +++ b/ci/travis-36-slow.yaml @@ -0,0 +1,31 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - beautifulsoup4 + - cython>=0.28.2 + - html5lib + - lxml + - matplotlib + - numexpr + - numpy + - openpyxl=2.5.5 + - patsy + - psycopg2 + - pymysql + - pytables + - python-dateutil + - python=3.6* + - pytz + - s3fs + - scipy + - sqlalchemy + - xlrd + - xlsxwriter + - xlwt + # universal + - pytest + - pytest-xdist + - moto + - hypothesis>=3.58.0 diff --git a/ci/travis-36.yaml b/ci/travis-36.yaml new file mode 100644 index 00000000000000..3c9daa5f8b73c8 --- /dev/null +++ b/ci/travis-36.yaml @@ -0,0 +1,49 @@ +name: pandas +channels: + - defaults + - conda-forge +dependencies: + - beautifulsoup4 + - cython>=0.28.2 + - dask + - fastparquet + - feather-format + - gcsfs + - geopandas + - html5lib + - ipython + - jinja2 + - lxml + - matplotlib + - nomkl + - numexpr + - numpy + - openpyxl=2.5.5 + - psycopg2 + - pyarrow + - pymysql + - pytables + - python-snappy + - python=3.6* + - pytz + - s3fs + - scikit-learn + - scipy + - seaborn + - sqlalchemy + - statsmodels + - xarray + - xlrd + - xlsxwriter + - xlwt + # universal + - pytest + - pytest-xdist + - pytest-cov + - moto + - hypothesis>=3.58.0 + - pip: + - brotlipy + - coverage + - pandas-datareader + - python-dateutil diff --git a/ci/travis-37-numpydev.yaml b/ci/travis-37-numpydev.yaml new file mode 100644 index 00000000000000..82c75b7c91b1f4 --- /dev/null +++ b/ci/travis-37-numpydev.yaml @@ -0,0 +1,17 @@ +name: pandas +channels: + - defaults +dependencies: + - python=3.7* + - pytz + - Cython>=0.28.2 + # universal + - pytest + - pytest-xdist + - hypothesis>=3.58.0 + - pip: + - "git+git://github.com/dateutil/dateutil.git" + - "-f https://7933911d6844c6c53a7d-47bd50c35cd79bd838daf386af554a83.ssl.cf2.rackcdn.com" + - "--pre" + - "numpy" + - "scipy" diff --git a/ci/travis-37.yaml b/ci/travis-37.yaml new file mode 100644 index 00000000000000..4f2138d8555e34 --- /dev/null +++ b/ci/travis-37.yaml @@ -0,0 +1,15 @@ +name: pandas +channels: + - defaults + - conda-forge + - c3i_test +dependencies: + - python=3.7 + - cython>=0.28.2 + - numpy + - python-dateutil + - nomkl + - pytz + - pytest + - pytest-xdist + - hypothesis>=3.58.0 diff --git a/circle.yml b/circle.yml deleted file mode 100644 index 9d49145af54e33..00000000000000 --- a/circle.yml +++ /dev/null @@ -1,38 +0,0 @@ -machine: - environment: - # these are globally set - MINICONDA_DIR: /home/ubuntu/miniconda3 - - -database: - override: - - ./ci/install_db_circle.sh - - -checkout: - post: - # since circleci does a shallow fetch - # we need to populate our tags - - git fetch --depth=1000 - - -dependencies: - override: - - > - case $CIRCLE_NODE_INDEX in - 0) - sudo apt-get install language-pack-it && ./ci/install_circle.sh JOB="2.7_COMPAT" LOCALE_OVERRIDE="it_IT.UTF-8" ;; - 1) - sudo apt-get install language-pack-zh-hans && ./ci/install_circle.sh JOB="3.6_LOCALE" LOCALE_OVERRIDE="zh_CN.UTF-8" ;; - 2) - sudo apt-get install language-pack-zh-hans && ./ci/install_circle.sh JOB="3.6_LOCALE_SLOW" LOCALE_OVERRIDE="zh_CN.UTF-8" ;; - 3) - ./ci/install_circle.sh JOB="3.5_ASCII" LOCALE_OVERRIDE="C" ;; - esac - - ./ci/show_circle.sh - - -test: - override: - - case $CIRCLE_NODE_INDEX in 0) ./ci/run_circle.sh --skip-slow --skip-network ;; 1) ./ci/run_circle.sh --only-slow --skip-network ;; 2) ./ci/run_circle.sh --skip-slow --skip-network ;; 3) ./ci/run_circle.sh --skip-slow --skip-network ;; esac: - parallel: true diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 2aee11772896f8..f92090fecccf35 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,9 +1,9 @@ package: name: pandas - version: {{ GIT_DESCRIBE_TAG|replace("v","") }} + version: {{ environ.get('GIT_DESCRIBE_TAG','').replace('v', '', 1) }} build: - number: {{ GIT_DESCRIBE_NUMBER|int }} + number: {{ environ.get('GIT_DESCRIBE_NUMBER', 0) }} {% if GIT_DESCRIBE_NUMBER|int == 0 %}string: np{{ CONDA_NPY }}py{{ CONDA_PY }}_0 {% else %}string: np{{ CONDA_NPY }}py{{ CONDA_PY }}_{{ GIT_BUILD_STR }}{% endif %} @@ -12,22 +12,28 @@ source: requirements: build: + - {{ compiler('c') }} + - {{ compiler('cxx') }} + host: - python + - pip - cython - - numpy x.x - - setuptools + - numpy + - setuptools >=3.3 + - python-dateutil >=2.5.0 - pytz - - python-dateutil - run: - - python - - numpy x.x - - python-dateutil + - python {{ python }} + - {{ pin_compatible('numpy') }} + - python-dateutil >=2.5.0 - pytz test: - imports: - - pandas + requires: + - pytest + commands: + - python -c "import pandas; pandas.test()" + about: home: http://pandas.pydata.org diff --git a/doc/README.rst b/doc/README.rst index b2c66611b68bbb..12950d323f5d34 100644 --- a/doc/README.rst +++ b/doc/README.rst @@ -42,7 +42,7 @@ Some other important things to know about the docs: - The docstrings follow the **Numpy Docstring Standard** which is used widely in the Scientific Python community. This standard specifies the format of the different sections of the docstring. See `this document - `_ + `_ for a detailed explanation, or look at some of the existing functions to extend it in a similar manner. @@ -160,8 +160,8 @@ Where to start? There are a number of issues listed under `Docs `_ -and `Good as first PR -`_ +and `good first issue +`_ where you could start out. Or maybe you have an idea of your own, by using pandas, looking for something diff --git a/doc/cheatsheet/Pandas_Cheat_Sheet.pdf b/doc/cheatsheet/Pandas_Cheat_Sheet.pdf index 0492805a1408b1cd5b398eaad3bb0df2852c4232..696ed288cf7a6067e73e819213b014e6d4ee6b32 100644 GIT binary patch literal 339134 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 PhOFQtWKk8=f7c zF*jo@x0Oy5Zw?n+v&eGYZcV9di<3nE5*$}kIVsb_B@D;g3c!6|GS~RIEueY;4IqBN zYR)>KlWA5#hxO!JuOlHiN3AM{1o10rj#^p4LZ_A8dLlv+UyO`*O)eO@IF8{I>siL= z2TSuJskul|N(7rsxl%f5IlBTzBCg8~`496UvSvf>>OotZ+pHf-qESbH!sYNIED{o2 zqlHH9)BQRdi?}xi0l#J)4I%H9ZJQ;3;LwXYGLIC8nnjuAc~cW5$XA0qm8a-cO7``d zXkPbrJ&beML8wR0ZSn&6ENq`s2(O1-HOc zO1re7^vT*n{`vR;XU6$`r*!XNPrV%Ub~z)n{q#qep)d7*D-SC|)a{=l+8Z0og z$Jm1kBgE=*iV8c?Pj9JD z51=xnv;dI}z4?c+50&%RQMtn!xf)*pfwh9QSWakH=%)a9UX)g_rTabF9Q-5aD`h#m zVD;>WwV`0nqiW3C4k+$b82^1@KE5j7XZuyz1Et|Zs9}aB7**NAIJD@u zHpGUI?HmY9>H&BY(NGBFRa1$q%8*VRpc}L>f|(gSVFbX3Q3W)TcMh)Xtx2UMHYyeW ztOSVL+a{obkI$DtRW{&So(5JYU!`AMmOxiDwArea>&0}QS~e0qXrh*97Tva5YEP>! zJ^xfI0MJ$fZg)pdQW>V$!ONF3-@#S6q<`ru*ax3b9zTtJ5fE`nyd#vV!^rQD_C%@N z*oT+JowN)v=h1EQ?8mhEGiD|h^PD_g(8VzI1XfXhgIbeW#7AHH0JSVXN2I+ekFXl~ zgUWOX6He`L(m|mN9j6zk4fAglCegA`L)Lx?jo%qLJm| zuXdh1;c=#NH!pwv6Mp@Cya-#hrMw`ixr}PnpURag@f-c^l#A+*m$%;O&&M~nL((A5 z^TDV;n?3ECRYKy17Fe2c(OOUO^-W|vk@d55%@$^k7)J4`YnkkcKb7fl=s;;bvKVFb zYsGw{j9Q&Za(Y&Ys)vxH4yF~04Bt6bR5`;^>ml=!6K~qnp!s}>fE>&0W2Q|}(gX8Q z(iELJ|A*IH4SRz^>7g}U-nO(iap@9gE@T6R1z)D(`ea4_u?3$43@Sw7l4MG$N@M!r zhG7QF0sO9m`Ua0gD*oa9GjYH{@7qZ(K<{Jx{<8A-1DfHnOwecN`^OF_1doKz>-uWP zwH}~j-D1a7NLoZN#{Ta93AEGlaGRl%d0Pj*ph%~?HB_F8<3DF@qSv?6ges?I^0`l1 zx{XN9r<`sMIIeH2FJBwvm&guyUt=@5y^gG#Ovt%dTn|q41#=jm{H1BE2 zrxp;9jF)Z4>#do`9@5!R0!i^F_jgGIwKj_A2H?SLzGH>8t{~<@SSMK3N$Qk*Gcy`8 zkwNa)j;Odf{!Mmv9|d35upuS}=kwY0-v097&omcgFvdx!{4SO7U zYXP|uG8XLgC3m(SoxOZ~LO(+~z}a0<-X|R=JW9u3#{T5K->DQOg-UT%Z!0TV6c@}5 z+p8%6Z3Lywqg0A+x{d^h4W8>x_KcPnJAofH@VoAfUFDhrJc6)UHIP}Ea)RlWQKui0 z({YT%^i+2*)|xN56>$B>qWzAMdo|3uH*OR7Ob~YQI>YW}!3^P4(6Q?9_%=O#vzQv6 z5yNL+#iL(XWmu3!_fH57JHSk&AO0lzyWuHGzZ0yyG_y`( z53F5!c28&fY*qv{f^)o**xl=AFJQTg?}opqQ)_+PU)!{;D?i=`TDH$qGG{&KT)crs ze&na*wn_82NR)ebX5{DM1%}Me(H2TYK+d+ELP4f=+3vC^nkW+EIHT->OL?pWu98Fxe#$b3#+5qBstGX(JlfJTL2?e12Y zd@5QBx~@K-GrC3b?~=5oHdM>`X0JwC;w#b+RfUE-g-G6POs@I;y@nF@(XSFH&DB-q z2U_;@l_1Hs3!2J>bwLTK^;TTKu9v)R3!fMG5?^w{eb`<6Q+!aViH9vEqhuP z2dVz49GI~kEi!p=g7DVdHd5k>|Ra9#?ua*ULuBjo-X9vSV@4)7f5i{qjUQVcT1*K=>W-El8FQ`59<80aa z7z*=ZsRwqwiT=K=+YscM^*vieJ*9Q>Sfwc_b!CJv=Z;Q4vtt4kHS9Z%G3paB>Q8T; zG!xKVpOdb-`lzbxhm(r5mw_sMHBamx*6tFcfS4OOuRq5@X3M~Dt#t16TR_FwO%)S! z?bzpnAIsSlZ311mT{_&}9<8gQ+b}dSqB5PIw%W%XXU9dSGD!@%Avsuc$74$oi4$1A zI%dC2)2?6Y-J?V;QV%-PB0#;8@P7*1f(@v`ai9^WihP9?#><({m$e7d&l z{W=*wviQ;dOCmWobHceu{|47ch7>wcBU4K$n~>&v%NWo~Cz~M_+xPLKIg(XQ>gQ0? z2j`r$6w#1#M{dpxCxPF}ah*s*y~5TY@J1qcDkT`nRkYfyOS9)<>6?b=l;+^-YhztI zH4Ey1^2Np05xwpiMT32xPM8=Xrw@2Mk&$bk@VgE>1Q0r8Og*X@Fwl}o>K2%9E z{-~h=(0Q9I%Q)7Yln-+1xtMK7v!BA^;pGbAejd{}RDeGGc$fbqMxkv!7Tt8*H88@5 zgWQ0PkTNJe{h6H^>L%^g;k`EBj+Qpvo93!_R65Y5O5YhlyB;rkAtJe2H*C%aBRVS} z!54k|{pL6dUDb}!)!>y7i-7R!!fcBn`>lkvpa zw*h%lnz3JcY!Q@zvS!&#K9+|R_`eT)y*srt88I13Tk)n^sD*P3udDZVpaEp>O@29v z{#k55E5U4`UE+76Vp*>aLr)E+B|!O$MZ`R{kbuZXGz!(xZEflO5R=Zkv-JGXFW{ZA zG+8rwU5d)REw0L6AyKddXS!5{pt*uqJYy7HKgMY&TFH~Nm{ZD&xfaC)*aMjM&>O9qoSnRsJ9CXwy9{zJByn+&=qzHu1IOdC4kXbH7d}eS6zK zbtLAX4V~Ch6ZC3xQ=hKUkYtj3-2cFRq7suaOH{^~qAl}{kqr$$%{6GmSw_No3@!~W zBqDNqk9Hsz((Onh2@mCJBu^^{0z1fGlLmV#BK-KCF+3gRsaBsY`KH05paZz2OOB|5|ypX4$ zH?ni|3=1m}88`jqM)Wtm>z(r}$m)So{$z$;BGO-9hm6fPge87T<5@NZzRgbs8V8}_ zFRGY$DqOgYAiqUamMRP}efr$H`}M9cem2(nzN^wF7#KIOE)bbIH9DmUqxhxq3yFB^ z-7OPg&icrdrXz}@gsc)e(=t@P+FpnCy!7~K_&7bWG3kaT|9P}{8d$J%#Z25i%b`+W zf%SX(*q_FxS(3k9C~wnz&YXO|cN8!;y|4InPYMc{Yw~PCKUqyGGkcZ0$H2ay4EAg( zhK;zMC3uwMt)1S=ekZRF@}sQ&8uUIgdEiiWri8;xPx-7`Q^R_+qLA~;^BP(Y-rk1} zb=ZLOi7lZR_ITUAV(}%OX*x;@XTZawx2?UBaCuxv@Imb>0+Zj{_;;34kF#LPrcyeN zDmA7{PgR^UrV@`r3|hlx zHEJ-Ekruu;R$;V3a6@-ch^oj)rh`-u6v-PO%wZomvOqIONJU;qs-a+rwJ+6(IT-Vi zz3}lYdxpHH;FQ7IQ-tH7WqWczM>Y2+AjU*`Qj6+R(IlBNvF#|&@}8Qfek0qacD_5t zbYEX(Xk-kE<^Ym#jPvr`)2>J86%&KY8q)2*l`N=j^t88~yK$`p@1Mr4r;FU{=Guw% zO??}_w4yu2FbJr>E*iFWm50&@o}~)0-L|Yah1j_+;`P*q6DmDT3d>&W-&j8`BFrQc z$im=6N{2rF{h;mnpbA17TFBXo@R%DL4P71wB`4Ue6!E)6lB%!P6d1__o!nt?Y_t6Z ztiuu0Nc>tHZ>1NUO14?QXKr#0VwglcD6@ASeV%`I%3{OxF=QEQbowejMb-Mc9}sue z`F;NA_RtASTGLedlgGgwPw8#EQzc0eslM4x(CzVwt zo`9y`wkVzM4VNDmU3%BLI$w5AqU@0>JYL=BM`YI03cM*{cc-LgM$m4hqg%5ME(%^A zJAHkg*p{PMT%JmGFCW?uynL?^HqMQ^=5dU1Qss;Jy^R1<45fk<%L!T4M61 zu{N$+QvktOso3*8-8o(z1OKkdruU|@`Z2*a=;gRw-|+nwBrF_f=}o0VdE3csP`r_~ zC55^!o+XUCqM@{869$%|Y`zWV|Mc*A+4G6E$bW?mP|OTyG8}`H99C6?nK>xIP9%N~ zf>K)s<~_Bg1pj}0y>oPBP4Fn1OpHk;w(aD^b|$uM+qP}nwv!Xvw(U$jnds&Ft@qwq z_pN*1AE&#ktGf3-)xBHQRi&Q>IY1K5OQ)9>(0|@xKq*nN6jq1$m0hrKNWrbY z@C1_Zm|~W+JPY?exh#j@lz&tS{eE0r)RS+=MV)SUErYY0uHM>BSv%#4NVI|nK|oZA z{Ab<3Mj7A05o2lk{cqU;8c~fj*Qp3tf&IIbd%E>51)O@rGml1Onl+ekeINbzH zyoGvr3I(xpw&j#&Xkls%X|cdZ)ZnuPqt>_Me=wsm2n3_=uCkI!s><0_U$z~(JEMDv zrzLry?bE~h!$#p;Yb+cyv&|8ubJC*v!@ZE+z3yM6zFC7K8l|Pm`{7rgZ=83h2b~8@ zg@2oVak4LBV&S3Z_|3>RJikPNJ+*1%=Nwu}enb&K{jJS|*R{s(j>9B`<&UaoUbHT{ zX;bR-6XDa@sW4ew^9HX7V&y>_*uV^FdsQ;mru8v=*iDDm+bvF8IM%OD@1`x`MjJU` z_IBZJX)u>+`_TpLwwXRAtWIBARP4mvn3AcDqHoOFP<1Y0`l{kZY-nv;w)uK+M7rcc zFw{&FZu;KwDaPW$qA5j9B!ES0ybik;N3qTGGBcxqCC)3w@i{u(v!uMJCXUwmO{Y9qi52IdhFN)M#Cl1A)@*g>TQA9};=a^KT z?kH}Acjq@7B8-glx-u-1D8L8_&!jIfa>jGP|LtWFCPwye;|Tw+!HWNrYCbD7EBpV? zZ4q_=)Bi^`e_2N-4sSHZM^FDtxOZH`z2t`Y(h3Q}{s6Pz6bZaFK8+GlZ6Sqa%=>x@ zPwVq#a`5H?Ym*w?EIZ97fy1XugBIOmjM`O&!6~=QL-Rzr%p^j{I5Ra{;14RX?}P*K zLf*nq)Mqk9?LVaqLj=N$WOYASB?OJ|M(L0{rHnF3@W4_{EbzLk5ad=kHTipcXozGU z5zwuu_wgp(B&`GZPf_>LK)oVuDQZHIaSKqgFI2P!*tEo_%x0Y+-J})Ec`FlGX2B`V zvU*xclLBhZDhpU5Dl)FQ9)<@1L~cQ`My*C<uEG+dA-`41(cKzXzmI+g^UACaQ38=27v4l8<#A{JD8X%rI*WbsxIuv)2H z3NaIP($zri0bZnb8S!I}5 z*&4axl|+?>c1;%ozSEdRqP7t(3c`tO-`AF8Em$p>`kT)%9dZ?+_lQF?#eYjlGt^v1 z5=DSswg5_6wkc;zMJr4sHCo6cWxfMTxsWGpnTpC4k%)>5O7R!wY{7CCla@QO=>wc7 z#VC0$e8XXl&|j0I6{L6;cTb6XrBRp$;|f}E zN>r6z2Gl2Edc)w7Dl_(fH8`W>Ry~fj%Q`8|UYlwUi4Im&s14+)gscuqQ{$@7!7S3d<%pM52v`9D%b#4@=honOqE9_-5RfA$@p~Vismk*TF zUEnpvDy2Kv$y*05PY-#5^#u=G1%uN&Dwu*at5~3gr!H-v1t#wJlS6RLZxr@H8w@rc ztiUVw!_(uVi^477BnAfam2!Ys!Bl4UQ46co4g3_`mb8-xHn9~%Mp~i3K5PVY2`rGW z+^M9T`Bw{7LM{&kVYgwc6D}9*2sF9kP{UB4YqS4C#1{HdL0I1{@DJo4p7^@)2ZkSW z5Mp5H5Dw74_s|oJgM7qpf_!!Y-p}lsJg6?v%73=@tn;G8)P&q`u~GsA33Oca;)f%U zhRhEcwPm*+oVqD-uWFtWq*|h% z38ctFl^g7DqnI#SFj@m@w#IJ;!cGT)D_HX|HDPJ@Xcv7@ohcfq*D#WQ$RI1#ztHEn zD3&!K!*HLNEOMeQ;N|g)i9a4 za{hWm#{tb7G>XB+Uyy`?-+41#hIG3{&L$09asuML7z~USCjrl$D{&f zRRo0we@{{t|6zH=dG>RFh(twwn+@#EpjfCfKA32lnzg?SK;|R;IS#KzlAqw8^ZZlo z&{BagX#!+vOyd^9@+dGAx;z06K3E^MLs6==vD7r!fEt?auf3VR6rG2pxr#aaJSC z2Yb?fZlHk-;SYVuX{hoI+wCkfMKNqIN(KBx*qd-`gD~jyrKtjh6|j&wlp%=wkrP0S zBEbo(UpYjzb(%5Y#A6VX^PTo)PuX=IZ?Ko#L~GF+p( zZUF{vVWuPKF7yjjI~>?wcoqAxji?_89>;{d=yq|iJ3_YKO{$U;(I3@Y`F1HSm_&=b zg@l}oXcM7NO-hbkJc5Xl>|TBoClRKO=^3p7RS_S39t_X2NALin;J6@9R4iMI=>(@4 zQr)h(5)cBP^0*UuKG7(X&*&tmj&*V-N^} zC{&2e6gZhaqz`Riuw;CrM6w8`v2+}1Ydj=VJhd>$Ze@bhV@!D66ty@Aw6)$qx!90D zOsXj^E+dYLh_Qttq>>S8KoEJIzbKI!!h(^Y%^1x_;#n7LL>0^m1urVVDx35VUGY?3 z+YGiYm^hlEZ(=;oBjkQO<0=XuXz362zf|!Wp+;G-maJ$GLK{#`@fBOx0q6=Lx6#5+&7kj4G>w; z4+*4KC&1y;7N3AbS5*T+_{N~AVR{r?Ah*W3M$PtQSDcX^^odj;)$=&o_#k`G@S_9> zN$nE@$dE%HA*aG!fB^wyqKl%^y`*6JXn1O@vVfD#5M{_d$^DdM@}Y}6%=|*qV>plm z9=J^KYG^)TNdIYUc}#OsP|-R=`r36GFahe)?y->Ir3g?k>&g?Na8y8bW-zEg<;n6d z5k+tnn7&d=Pmn(JMru8t(s7njXpo=U5NqPy0t`bQWLh8#jpEdt!3fou@$urR@u6e# zM1Vd^Qc-zk{CTthQ5s3y&8k(p zCbXjFjue#?IcS%ia5ejckxp}&yZI7|n1Zsd6Ct5GIC@+Nck~RIgV?2M&22 z|EiBo1j!H=CKVAdQ~0)7JS_#LNu%JT-mDsQk2YVD=Bc7dlCuVq3G*Xp=x3(6R1Xbl zMIpEV>8?CNunEqi{Fpx)uCZ=*zn}vkvP}vye~{Rg<`wcBsBWn>DuhbG^aC1Yn4L@p zMiNOX3;|D+-jJ&b%Ns zX)zm8f15c9(u=AMaiHBYIk-V_8dq>2W1?^{YYkKcCXGLBv246PD)P=Fqys5YOV)t4 zV{ZABy`3_*)E*A&pxj>8QX%r+ll&=YW0mpZ(H{!!0euA*KYySlZi5KayOI_E{cGp< zc2IYzc*^7RcF={ft3yDq*ZuGA-`|6-#p&(MMS|Hl42B+0uTJjlUM^oQpS!TCsLQTJ z2QKZNEQHn7->pI_}tG5kK?lo$EG;}6D&lai3# zkDJ{u8!JF7`PaXw=c5J_o#2nwhkEB>ircQ2EX>zc$A524y#+?2W?$*LvN((Pm&0D4 z{G*eIWpOxz|E#b+M<>iPPW=MR{kU>{{<>S@ruk)9@9Pn6u8v-ovPN9VwJ;6bUQWD; z4T%+t9f>82DGvfBudW8wZg*tb%+d&E;<840?11|e&te0OL}_YmtGBsdx0_u)ONVvG zFaM%OD#O5SRRLFpl_RyM^R}*fvT1sa&U3#rt4`+kp0Psq= z2(}BI53*zLeQ`^(lQUCGi!ng#v1+8NVUwytC%(O4lBw~mKFw-EbYsuM$!JOJgfZga zqRzi*I0&1aUmU3f+x7M3C#XUQH#%OyrcriM;Vu8gy<`-#O#Z$&3ad0BldcbQ*m8PV znk_4S@08g5&z@UnSKG($`No|akCbQIn?ts3bkX_AmtaZO`JVmZ!;;j-+Rkkz=WPGf z`=9$Sg}OL)s0>nV9oevlhY=p*nO%>G_;~IA0z;yuRyik0b+jd3j~8 zfT~UV_;K{2EP65s;Un7dA1s_7I$)G0dGmS3_hjQ+8l=eMh#Hxt-OdaR94B0-oh}ma z;WGn3WK*kn~G5^y%B=%^ql?Jq?zH~OClJ(i~ zL24I=K84w}@y~7B`)!EWq@KonKZ;3SSrz<~IP+ z2q7rV(HpRXOaJxyFDmNr{BXG|ZFUEb!7gt0=4mx(w!r$MzK8+p)%Z=-xJw7k-GkMK zLwol|^0MGoo{^?F^pUhgCtGKyD%x|7H+jl2V9y0qCBq+w@F*x)D8VMMS;k>03RL)x zHjc3F_ZAD2XTadJ#P58E%Mb|mw#zmfbU9vSw+GMHi<28)Uuj-@e5!2hA4#7GFQePT+iVQVOW*4BIiK4ezT!Oqv*o08i)Bi6&cJT&Rg}%a_wS#5vvKej zdl$-PG@msbpPe0@tsNZ}4bSo`)9(-QZT_tPzTSwgB}Oa(-0qAEYX9co=G~s_O}CWB z4Wnzri;zE&UNh<9Ovn9Kiykf?tA?lfwdsreHLp9KYxTNsvo(LG&6n=AOe21Ir$^+( z^W7!!TzS?{j3PAILiTKZ!r6^~3ReLcS=&JY(Q=|qt+ml9>vHHeX<$s_MAqv~p8{m@iZ;qK}L`7+OfflJJhMR09){qmhhsg&F^*>4D6E~2`dB0Ch^AYZ87ekRP1uY`rfyv8OY7tH1J-7+{pE2NpTLH1V;Yz> z%c`g3`f?z*+M${FT;m4mhXRP9GQsN)ntkL~Nl*GG$Y4zyVwMj72^c-55of^VLTn6}992B`%7ys=c3+Hy4G`xW>RYeYCn{@htw zAq)6P61QZr&*pI|y34}rd;%75<)QG69AjpHRo%9$h5{(%Bxtl8%#mBx5$ssJt;*!& zyb2I{t>8y*q<>p7C|_iWW>G9l2#0!}iNe-Ap7AEE=VgGkUI+I&5zVTXTL#PO7#geA zG;lz98jsL2uVV~Rz2Cw$ydCgwxkE7id_Nj^v1TB0!{|q_(VI#1!Xnv}LJIJ^-aO7~ z&NGyu4 zicuTWrpXP}3LKx!y}IY6d61=IeWgUdiVUnOD^+wPWq&0(gd3~H?`+*QeAJ{s6=~R7 zL&f??2?SpCXLwOHlvGWZ><0YEh)oiHE76v@)@DenQFD8>lnv|7 zM?k)y3YEG_$zCNjL{%lKB<}fgBGUdd;4@9RYm-!#3f56p$1ATm9`!eZ*lWLz|D=^h$im7r z;jLRRK@Fj-vpeKf!#E-E-8XmE#90TmPQE{)r9HQ*%iMNPWb&^aK8s-q)yTb%QKRpq>A z2j-+Ds%RDLjZ2MJRz;&3sH~e~Ep=4b3~Y^9r**6n+39Ya_yI}6&FknNA1yV0|2Znj zs^>)y;t8(4b`sg?cJ|<7mvII-6LT|@RZR&UjZ2SHH$<}>` zI|=Y)P-(o4;(9VBcpX{TsG+t@%Nwigh6DeHYNn1D-?&s27&4ZUf!%`6tG=>QrQ$*I z4EZw0L-#ndON=k#);blWGrzr&aXc4nfwXh>DYGcd@cUHIzRi_wUKgkFNx%Q)d!XrL zzh|+`u-N2i8{gW;0HVFsW$Aih`8Cr#8{6mi>b4LqyE@9dEkv6PImzdhE^`Uu_r zVUG+t!>4-)uRXK1iFY&~XoPkXJXiUCKn(s;(pV)$LRGGaDz8N~R8=m^bF=D0ajTq3 z((AaBfMr>b^}IV&6p(>e$0Md~8dUh!nO72QvjvtuS-aJ0S)DTG{#Vtr*o_nJCNAUS z3}i76Z5PA=$rF$(suT9=f;xjbKFeYlJmMR&tnFT^Zd_78H$>Yl_Z0SmGY1L-EOwQb7lTZ2m(kXzLoOQd;l1=<@Jrdg zE_1HOgLtK_uMGy;_(nYStF~B|z_e0o8}gP@g;(h6Z2A7*COyWzGET1H74hzM z8(9j1*fHWwZ|A*lYOS)uY5e9s|4VCWYV@-#?n!?ud21!@)yB$@szHcFvbXvZTj?ly z5s*32V^?wMKMoy5UaiCuhvCzD+2{GKCeH7S&+u?~hSf}qOx5<;s9S?E8N`K5TCE>T@3M? zXlk`+7L9n-m)Tsu#c&K0kFvKX{pbX2t$)wjUU@R>`@E`Q;M&4+M;bWQ;cQepqFyc{ z+pbo*-?E?xObn_<23~I0H9T1-sQ)<(1nAbtCw3=%1cW>}p0R{quax4+)~?y&m9eh` ztJoR2{j4~S1ujl`$O{=(1rOCCBWsb7hT%_zlqQr7+n@z+8aP{D9pBT|TPIEMe&6)F zkHz*X;{ur3b+`MzydStf?5~B^r+s!|wJL=P-{!mWSNWLPp5;{DoIV{dsXrkzuvf9a z7(ONb>{X9ZV$ePnY`49IblOxHynb`o>LD2Yj;zs6IJ~w$4wn&SE_BUZzE`VP?|(m+ z)}DwXv$mTU%AP&)=eRrGnFf3`pOfZ_Hj1z9MO*_PpAW4*fa3IK2P( ze7Jrbc7AdZwt4~eE%%iE7#2RgNWRO7=-%w}zOyH4HYBwm|6 z^#yv_USU)@T#QTvlr#g?w-7E5RSWkwYLn6p4A&C7S~?h)@V$3{a3#QtWj!%e)-z^RNv$nU!VHi`U8WiKe}%k zI^7iN+*uyRAIk>OjambIOgSk*sl zj9b_s|K~|^*V(k~soWeLU3|Nn@49$O^A2af#pZVOa-^vSB z>Y{IAA`uzO+;B7V)|;xj7VkAla6L-%fN`B8Pgwrdvhpd;(1Jylx{9vR8)<6GR9*@Q%}xzd$9f5HAuv3{@`wAyrp!@8eKMnZ??Hy=xLavE@_}GPPiQjH*aEBegadI=ENh0`>G({YJ^PBYomO+n<$y|AucebSW8s_{o``&*d^m)_H908l39;D5 zYD15Bjn0}L!hI#@z}zdfl6(5n$eHG*>k@kkG0u|1^yA9p@?ZpxH+A30+@%uCl%jq{ z?53ygo}pc42oO2WOhm1#^E1^5P5+UQd=!pnFBT2Bq+cptpLA<#7@u%cmYcZ8Qy9;v zq7%s%sSL`xDy7^dJFHH+&33TO>^Q0z0yi}be`tD_)P@P5Dg3Sdh>~`;y$(rlLXGx1 zgPoR&KVO%z$)kj!EwL1`E_O)4KxSB*lMZlM)-q&D$-bL$!fTbU7^@rd>g~>oM%;0- zVB-UqNJ*Jh?AKvUXi1O z^D(bv?H#H8L+Q2;7h|IJCK3zo>&~m8RtmYOrI%S!X)Ik ziRc^!xaXV<$r1+TCf~I|JcVendNDK96!vF{&UFYfvro?qb#l`6Hl|9>T40{yhQRWw z;XZ_*CaX{MlG`ni@=_>BtiYg2l}y=WXpjZHYf9fw)@4Xm3o#Q3z$%o_IVpIGWM-<{ zRfs&cGbcXgng=lDqo}E!)u^!?3 ztKzD}r}&gp-4?Dw51}xqST!RwUP>emEl~1tgtn$EU^XgxarB$1jKmlTuE^~G8F&a~ zlMGWTBv_4E0YPjz8CmVdQjV1kkxcFGB)udm0}r=SWGk$@wdAq0RPm3AAAsUslT|7rH=dgPb?sBw6%Ee`+N5wiBQN#=HOUcKest*<5H}IEatbuvQ z0f%83KL(pkaFb&bi^stdqBL~jq7MVI20N{SQX-i#utpU1I~DNt|DbCZnPuG2s<`{I zNua%tnpO}q>IB>k-ENd5ypPIE)ebp9wS*Fc1A=G~=j3LX22r9aoFu~UnsOz`7aT5s z1ZfhJl^LEqH@0_R24j9W!2fyNm>MQUWZZ7%>2qdAG&Y>3n8Gl8w@$FVU;7&|PuGzC zHzI`ZF5YvJ_7~$L9EAp=#QPCw?#KH*$j1>FoVcO+BM}UfFPkKLMpLdC4K-jpBxy^L zp;|_I-t3$lj$}U}ntYM&9;8!0bXWvuJcYV7gHnw%1}LMmt%8QNp2L%A<8Gc+eSw$-}d>FhzpUejY}M znTag|S}{ZjxjSjK&_9cZ(7q3lUP3c7309~i&8sz!aw3er0)?M?B@&)NmeEhnl&mx# zrS3qIBOaKp5J;ENkqt2(sXS#U;+?Qs{E>uOB8i_p1tR2kq~$9ZPXpH$*sP|BjpYac z6E`IpiR@3ra;i~>(Ew*?Dm={&CS6rkk7JJW$Y^KCAgiXe*_)?Rh4kN#+*7+CJrIQt znYvB=m6lrXLW!p@%FqN)#9TBb6aZQr-e`K`nh+_XErqm`wDb#8LJ5X-i!@b|JlG-0 zXhs3C;>_dS>B#Kk9t5W-U~{x+(v@m4#yW0PLzhI#F*9UfYW5!7dR>HQDm}!>SYLLb zhsOzRSTcdS6)5L2yPd`LYZus zh|ngWA*-FmNZtfxFbObb##vU4jEE}KD4qhJAPy(pn2G33sPKrL((6jUjI9@=HZ|gD zTsa=AYiN-~l(&&R;mdrepoG+#(bj?yine@6`V%cOm+&JTXRn=d;di}|YK?PlU#K$~ zw2oygBC%MA9tujZNOUBV1XJU0LX}@wrzQ*2JomaFBuTmQOi{*whJg*mwSDNMKWV(N z`ao}~It3G2!7FxfyON(7QPBe?cUkBM=w2&h`U72%-Hhnub)EQ{OvWjg`W}QetdxjcO#Pr7 zMX@+?{4Bu?1;gW>DuB0(kWhf@HcI-FrkW+bt(KDePc zTuU3%dV+QqkebX%hdCizuiUS$h`CJbHC!7Gp(s8Pak_vT%OefvW{xWnV?t~CsVZ$C zWbj-hiY1Ocj%qMwj1v$!X?3(Ed%&7J#K-Qn6ucH2HIOsqJbXa~&K5k*)6mF#Tt=)- z;rllHNtS!*!C{q+=Z^KmD2#-|ON+SdrT%?JU(A(pg7HuCQKTl5Xslb;1uXbLHP{`U(JY8 z&T12iHbULfrzfYEBq7V(Z<5ca_EsnVT{-YuRSMttcHJjUA}BIC6$J{wGuy0O90>$L z3gXTfRm3TPL^D}9u7~We^3LiQ6X17n4?aOT&pPJ#9twvhqH-pFiIxo6_7s%LCrOZr z_m$%`4XKMKi{qIi?|}#${h)%Cf?b~-n(_O3X(C81-!RV2`*43=eBM5P|8sLy_OiO! zL?Ac18MSCv*J?NO`ImV!IW_NJ7U$c33ek1hz2Ez2?3e+y*@8sDRFpuATwB5%L?sjwWr z>M*rnb!sV}c<8)Xh4oBb>(AGz_}MKZaeUmg>0_zr=r2W0ew2o?+pERxY1^-Z@eXhI zyXjp4{^ql?lmw_tNjc=naxq^w7n9hqHg?lCc5}^l#ln|04nL}z#mnjO?w$8WR-6Y@ zr%rdD-jZ{vioD$xmTz2HzA~SadDP&XC+ZJaq>$W$w8u42Vz7HDi;wp&f?v+^cKh#) zPnAr@OTP440Z5`MVJKQMHycE;GyOtMnSP)pd7yt3E#`p-}*qQ7j+ zUr0LN8f25Y?n+o@Z`If4&K)%61kagWG9OB)o$y2ag+vU*hzjO%r*CAUw%38MK+ytZ zI~)PGA-^^+7cX!71u}}deiagcu#7mZCk@=PgF~h9aZR*!m)){RS8OvPrn99d} znkzrVGceOZgJltu!z=8K{}f%R-tr#cG0c?d1z`djCU!?fy`n(|ipp)J;Ia8}YWp#D6?~45t#rPjKUiH0D_n(=pu&=_!k6~;A zMYkPwlq#%-I9){t*&^Gw7k#ry0&yB$uZwXJ?E4Kbn79s8vaG8stOJiF2G~8}NrEvN zUj>Q}61Z}xzjKq&wGRbp@Y)zv!F@UuG#tk55PiDA`7?yul{L1_MjQr@{BAy$8N4RL+4MH&1Xq&h z76Mo;TE1Jkb1A9E0O?D${H4t1Fe;tv&jwb%jvajVvTXxDu+AEZ`sy`R@quZG35^X$ z#);48A+F-W9wvwqizT*lz8t%J_soAIf|*?3Ke1>q8=I&h$$EL5HBT>8gG#wmoV#?E zCnR#01-3>S(_kb#V=R4<*$Ud_E?;-9|7jVP0X{a%3!EnLMxRTM400R2La+Nx$RaJu&D$*RJZW-%KRfb`|CF#~xJ%mFfPT#_{`VV7N_enP%2!m`OCs+m zOr$04_4~hIbgI4&1yg!o9D^!h{!AsF#KR7?zW>m-xFGXMB!EdR)jgqjO(85`s~-+i zc<8xMn}kI03F3Q7HuY0qwgm&x{n*u=fI8Rg)YJcmb_fHjC%6baIa^&C zBC%N{fIM22oGJ5|-qszU50Onflhwr@V;Xr~fk-QB>&%u5YOyE0K-m{YA; znyjq;?xsds7*(7?)uDx*Htc-{Y)^f?AQ3SwvG|Q;3iCCwg4Udn7NV|R<9W%U#%*b! zk`^vgo{ikyc-35x4ab<(S5Q*GD>>{9#8gkJd>66D=b)0zJR2ChK>a7=K&m*g%stGZ zRHJw`Vi{n!*o1IG>CQ~Ea~pHb@Jz0#t{7f%r5@cVVI7A!uvmOT7(vm_YXyYB^S+*1 zRih2lT#26mMTu;wiFcyh#3#nV!UJ!h3o3zY6^rL1boAm7^cP(qoHk!l;dFvI3E&@u? z;LsW2HNwIT;Wd!Xdp(96!u4%(d-%kegYWI!y{kq)huCNibq-cs>Tc zTeva^bis$Kc~Ba$FjzsX8B`pR_-N(sp+$hK=IixVvjXQ=A9(2ku)AZ&$-*}dK`+kyr>`$0%UMW!oT&Fx+Ap`F$v|Bt@2O)#=_Gm3v#n27l(9}kh~S* zRb@O$TY3Wc?3!!_igXKj&@ZUa6Zn|3;_FdqksK?UA8L4Y*5=N%arfbf&^+Cwh!$41 zw!7WyxVu?tZC(;-Tj^EX(-C5BPQHIltmxUioO(>yFD!rSP+3iZry4zh?9wkB8DPnJeK~Id10WhW6ObHyyokg3 zZS8akYU%CfuE=elvUIq#G=BHPEMmu^%&03Ua8dY8_)rD450Ae4`fJtHxF51yy0^JD zrF70Ffse2Kwa-)tXF{zWq0dVh~hnAKTTS%be-zip1N%S{tJgGY4XcwU*l z)nNAND}l|7;((#d|MFP!)>nJRUf-PCFksS!X>Muh(9ce^AIi3~b!Feh*7fb5;)r~c z`S}&%y)}3Txn)taPf%y;v^8+tzHy_MqkFix-~R2q$Ly^wH8)OeSmAsZZ(I~&7`^eQ zQZRi>Dg(x*9=cwAUy;6@y!~;Lj_YIfjp)+XSRAhTUH~=6&aN zN2>%o1NY`NHFPc%qCp%MPdjo;I&^v(oGv)WKP7EM?SJ==&9P@Tvvv!+Okwho#8I>#PUT2`Q3%>OmxN>t z#(-ezeQSFHH?m!Ot?PD#i?k-wR3n=eWTkPX1YWCa7TLk=&dfw)$CJXh656WuvUFfIq^ycOL~J-e^89fYE(S{=)lqAFbi_1g2EW3KG^Pu_KEK+U^_8wqV^ z+d@eTAF$dwi2-PH@1}FnSk@%tI~6+|8M&aPpl~t|<~(M-UlRW|k+pIJkiNrbX;a-u z>vZTEHpjdKhWs$$u>0hFvhR?)ypA<(_RSc1*W6d7z3#%GDcRqD(ex^xI2`ZAZ z%X7!t_^Zcd1{EEEv+!8r7A%0p2k!5Dmf8OB_;drg|Ge@X5nrusWMg9zZ^> z+u3%c@b&j)sdupI@Fd2=gM&VmQgbcv!C(VUK2RHOPK_J>`uu92KzRuM@q8OaEA&<| zBzjBRTGk~^*8F-7v+V5vW}&wRh;`VU>+@5QZVaFN>G{&Gp|r3i;(+PeQ^zePc!e#p z(J{_IP_;qdN1%T=5W-_b(bE&)oBRkEIXQSbQ78FX6N7zdjDhp+*~A^$>+7?2Ef=2A z%4S>b2=V&5Fg_b+32$1>z=Ooa!WJ71e0vQW4ufj57z^@yefsk8eNKD$V)GnWDno0x zz<$Eg&68dIa&;Xsn3Ly(sTYJY2UYbg@l%J8&>KKWohp$s7a0^f1)}YS= zoY(bWN-r+!gXZp9;Kks`1AKdzkt7(A@RgC0Cy?|2_paXujR59$3ssj}lK}4arv!tg zkGje#v@d1VxfAyN^Yv!gsL58IF78e?5Ga;}&xVgL`0so7rZ{9Ei4pc;(Z!#$y|C5W z(al+;cDQ~tLvNK#$oBlhTg(Y33j}{qDV&G0mF4`-#_D{AgQn_+2RO3RvZfxv5AM-9 z7#be8dF%@$*k<1Jxc<^QY%l0#Tz`^~c~H#zS7) z_dc=8j^-oG`GsUiTxQ6=$aE5Mbo5&l*P^vcgw+)e$WQlhH<74-vvK!is$2{489n-L~#5lnFQ;Lfuh<9 zQE$U23)@*)hJmbbn2yFNj!$S4?1bLw;5rrC_9;pLQ>t%8y=p~4ILS8rATP>S{Q|G@ z3tZ;!zsRe%bopVzEkj9Z67_Awpiv8bpDJwF2;of#?>U5vR9rh-9-49~@6jc$NSDWz z1)@3%HXKycIEm!G21%=k#1?uHZaXHYA>C%guode%qoLh9bd<-);T2wNT7NP+q?{SO zklbDu(Xpz_{8Cn$UjLXujG|}~OJ@dJ{^){x@2J@DQYbQ0AZ!=%8Qpr67W4SWN{TWG zs5_iBl?#(a1p-{Ng=NXm&G?ht==JmKzCD+hZ~Mllg_F(W-Ub2N@63x=wIWboWZ&%) z)f?Hrb#fmWs5fz&FOcHT+=U(d*{x=NC;YwJdOJS;wvmw^zFi$#_-TONpnHO67AHGD zZ{U9FJ;v^JMBo-qab8^6_T*2rqeVT$QNL^ggfEV_PkV<+IMHLA4E>ITvL=2T`q(h9 zJio!6E8y(zEt^`H+Dp&hJ4?3?;LDXFBJT(h$x~NzonMcS(*v^u_`GZom}Jg8iewDC zr$`wLB;eQWoI_7gw=?2_fZv0u*Tcho0;EAfdvHRGqDqH4v60xafQg7OL?mh?>;)A@ z{^C6%2beQxGDuN#P#<(T>CE4L00Zr@BO3lAf4oRu5CY-%EN$t44C(4af`O0@B1uRV z7tMow?@wQjPX9ZEO?WZhRrm+8J)}upTQ8`{g-?$^)^L<3edcFf7w40o&L`w?*p2XE z!E$AX%k$z_`kVfO0rheQ>LR%{f4Xn|yZ+z)o1k^5Dnzk7`U$6WE0=d%T2MTOvcqHN z>}+~X`^Zz-(ed+k4m^x0(sXg{KBo-?Jc6>rLuYT?C5Z-%rk~_E{{v;m#wm3>Rsv+1 zjb$k?*bjYb^eD*7I**|uLlQ>M?gZ=C7fxNc;Ns%0sDlszOW`8Zd`(;xEIsHrSg zcypw{l{xM!OXXBn1Z7h$crB~d-5;pvc27j90iUSZb)QzNJ`HQ1zf;E}Ro(6>h;{e- zD)`+K0jmx#p1BdLch6isx})=#?H+g(b^hlmU%F3YGSJH=1o6-}k5@Seo-t7ryM;f>pM`{DSYPt&N)E58ZYi4dzxCUX=1V3@&86n%>S3f161+s16+X%+k5CXK#|QofX27$s4GrR&w4E=$m{%MVN4*6RH7SEpr^ONu~I|F8q=v+k@`B*@) z>9ZJXF}r(!eY`zsuWpvHJ)n0-&-if%r)c&6BJ3N(YipWqW81cE+qR7z+qP}nwrx8* z*|B$QJGptkbI*D1`L3Q`y=Ki?U8Af2^_**TjT4NX=&_R?J~6u_Mo-3=1!&pm?KqPn*yMY>w#dO@oIo@FI0djGn;$lNd0uYf%Qs)~0=|*yYjN zYtQVy1?AnCTuZwL7Uv?fN^IWTt&@grF?mRKPo0i|0&xyq%rNQ$Ym@BqXyBAb9+RLX zH-{U#*{zX=F3+>t0m&*3bJXMNvw})6a_T)8Ih=urAa;jcBssQWk5G;ggfNVK7-8PQ z`CV@^UY_|~2<~kAP~lShQIy#9MdM;B|^E{u(WI)GDJE~-_6>3~*n4R1(M z^ez)63nk%V>g-t61;0t1#n2Bk0`vXh@KOs-saT4ryI|D5PTt6ip#7t3nV7;ImH;vW z@l$EDtLFpKR0SyZv$x{X-+ms)Js)(b* zu>vz)D|;CSRqQWlh3?S`Jfgz8MG3Zv5bVgUqGql5%;r2LtaQ zXCFZ9JOiQyAa5{Pax$Uf}7&V zg1g8-l*ni-vJv32cOB&+h~yyFWp4(_MW)EAqciROCw?>vPq@`aW$f3LDs&j7?a22L%&w+C1LSb048@qKoyS&Y09vGHickC`B5jYwl5K;_Q z))4z@*D2zkd)8QWU{_WpaFW}T{4fA_m^Sh3jUsLc5DoZ}r+J-WAeulxG(`Ytx1GVd zHv7M{JTA~H*-%mp2D?CDa91rM{5Ha{EZd?Os%$`^lm^Z~A}j#CyZlLPyM_;5c5$0JrE0#0)62N5eRG|5aj@Y7#tw5bYXGC#t;y^TbS2g^FovZOcG|mB25b>#+a1wvKS%TJ2obj3OHc-! z`^ha?+x-yDwj)H}b}wDq{YXWC0vj0ocyo}u&3=yd!-$*+(NjyUe6P_mE?g} zkO}!Of-iIJ9a}r&`tInjpe|onx~`g)=09Fi=df9ikrSSrMm@OodYtNYI#p>Q%Nvco zH){Cz>Cgt#W?OHDcuw5GujIJ>cJ@a-m>iy4JV!6K_a1cmo&b~*Un z0~@Ec@O3J5o#KLkUkl{>pjGU57TFoL!os?u^LgI)L7yusr~H3p@-Z0iq+N3I_>^+zK#KKo$Bj;aCEoI;$!OCWvmP=*E#cRufS~)@Dxk>GiQs*k8W+ zyzhKIeSg1Zdg|(K>FTQfe1DP=L?hgVpa;DSVoFlR@@az$wZoJ%%f^VEPtGVuA|&zy zHCrl21-;i*^MWHnU5JIl*0s!9eNf$BmA$XnMN7K1YpQ!9M1fqsXcs#$s^Zaa zg*p=l46tHi%dE@oQ;$)o1}um#Qj6N!!-}v(#5yKk(zY?R+WNZ@Bv_CFF|in*k1Z$b zbN_YcMx~muLs$a@IhR!AdMng>Z8=rld+d3wwDF7Kg4DR@v(aRIuUHZhk^6Y>2 z{)P3dOr=mRuEtRtTiwPWeC|3q@el~B4R@Dbn?n+ zQ=AT{X~)xc73bqslc2s`-93&EoThcb?#)wE*a~+2*{`1GblLoH$ib6y*ga7~Q2Ozc z9$9?sbDWZS)Zx3u#&^-IvxOEW9v$oB<9EUCLmQypd=wi_0l-dVtI?`@`EzUR#Ru>vVooqAIjx@0;yQiiCEQGuV9vUU$ zwesB1$;%mgqRjzh8pt4nQOpA~3kOYoas?_f=QvY-&WLx$zN#{48sf^a^sqX*t=fe8 z)XFc|c<6{bWbiF!lq{!VI}N#k7Q~*`c#&bYORoGO8NOC}k4oJ>EK5Yd*OwpO)E8%1 z)ae(nY^!J>Nbp5!4^LutAdt-1mK=#j(mPTtA7X*Z98iuOD10>NtAu+rHzZocXvsZ) zfeRo$q4)Km9idSC#dvld?+r$UCY@z)sa^ z7Kj0piYiF%uqdhjZ$iQ#P2DA1z9j|6Mrlff37o2x8?msGPDfHDk|kV+RiJcmCYzhA z-!m0&`@LRcdQeW}>X#qYV}5^k=Yky1$+b$>h^Gdh$0l89%qay`6sv3X@~E22rYf9r z61;Rn5wZTRhr zbV?LPNeLizdI5bpTUGSbd3hq4Twyd3DFV|5bc-TxIkEwCzo7qfIb0Av_mqQ(x<}>t z5_#DPY^*J)r=FXoQ>xrElOEWlDwLg0eb-}nEjIWiC1%Y*<7YW!IJi0R2}nCkKM~%w zI9T@%f`m<`i-&R(hxL%PrE3Wu z7=@R^J>r%ifR!u47fK7DGms9LKQ>JFG5`($ya9m0Elv=8a~}PJCWBU3BXhYJ(BTA04Bf&ny)968IC3Iwp5GF)uzmC7Hn2U>tw4sH#N7uiF0(UtWlzdnE0u=RG4%6 zq9JaLTBWKaN5oNbHWjqlLU*D%>b}r=K1(^31F3E?jgscc;e#jFa9~xkYUSZ-Wpm}9 z12&VaN@zDKZdE?+TeL&8Wx)#-F4gNjVX2`2;Y#@%heL;yIJw#sn1>2k2 zWONVhzpC3)hicc4cWl>m9%avRuV~jnj%CkYcf#9w<8fYL6~CxF5@{r7+Y@LsQ@fSa zDAmg`P^TDivPOP2pp6dFnWZ-A%AlVY887!r(i~@v-1UZ3540uH-nG=L_D*S5U3<39 zv_)M$Y)$+eof+ry*)fKH^&P}}h7}gni6<c zM9>Ffk7R(|KN>;#CFN&g#-3}%FwUKq=r*XsOK`12a@{<^EqfeZE70jrmClHV&H$%_Y1O(^ER* z*!Xt4imBia6*=}Jw!IHU043vAI)=(|DB3jTYS<08e}nrA`)ag6$RkBJDa>WYqDJZRt6o8=ROj>2*aTo3;%Q0F;Er%eN{IS^Ce3`HVmXM!72GRO_R;2k>J zstT;=tCro+I|}@G8CnW0pH#IX-~t{@RP)Zv~LV9mLWp`{#XGeNgazmA*m2iFs_4RcsS6d5Ze+UjP^@L$|QsQ8ab6S(fn- zif=kk@D$;^(aslA!Kb(sIE3nP*l(#_y#bvP<8|{@h(>eUe?hhY>NQ1l+uS#0b*st~ z*!e@fn$LR=HG2Sj0O!FN&|M1Moq%Y4eP`oVY9dp5ExbFxSIgw<{`GtQlPLx&=cg zDGy+8oTf-t7oYWZ$~#>?X*z(lNGs5Ed)T$`ccNVFjCcK?Y>80)WTN>tq|qwye>8*9 zg7B&o!95XpqdN^uTMNwQ_2y4xAJ9C(ePVloyj~6ra00}4owGyC_Ltj%`9Tu9!Pq+e z`wGpaL}3dH31NX{q023jL$t(g3UiCIRq%PU=?b40@)p%I5X6S;WuTa|UTK~9o02$3 zW{uG6`%LhE;U|esVEcM@u{X?>)wN!C^v(%H*{^V{{8Tz$*{Y2j(1NgCV#y}?g@Ej% zfbk;F@?r`kB?4BjP3OJ~!h*X9)BZLqNTvc#T?%O`l};@ln-hpJC$V-D>J z!?Fd(_XgvMcNw(i2YPfv;fe19!gqr%!Fxi}=}%XH9}nGOV0*X<{vJsBF@Ut-4zX$k zgBMn|kHiDM(tn{*54(sZ;kGCHf>=M73dW~eETM9Sr3&~=6AxxkuuaJFrEN+OJeL5~105Vl z-rQKGLiEVJQObi0d8mB7zY!>na?OqiUU4>MM|#4$)4dS9;CtdC1t}`7ogR-Vq}|Ey z6TT9@7;gp<&isx}g!!>G9+3Cbh3jke>>qb~F47Pjz={~_rxZa$Z~SAh=(P@F?CbwL zCwJ4nB+F$Le~L)cuNYnOow1=5^lCNS?6;wR0y8lwsHJv3TQkKyHV6~MNML7VGEs0y zT!mQ>rkxgnVC80prc|B~zG50XhKX47R!u}bv-BVc>Vp|y|{>J0_x{Gv%JE_ z$m(I_Yq<^*KP^648~}C1 zoVWw2rOyvTjHPPc{BS*y0rap+Nxac9`WM%?e?CMk?DFYg1vsLvnNxq;9u2-$OpbfzCN;r zV&nUN%Juzpb2B2447sQYsNk`Jf{4Y7ON--h64-)clcxfMM3g4Sok^>M-5kpWW|LRD zxGm(Y)4eV1+;UxAEu^krGgyai@!xyPy4RZcdpUaY3C8W}{Rr@S-1cw&egp;vdcIw5 zi|uJ|d)I3-T^tE7c!j=5URbxPws4%tE#nHtF~B!ON}<`Q*g(A{l%!nzGG&r>vedIt zaI3_0VQ0fK@^KE34A2Y+2{;Gt0x}5+;J6XaON@_)Xg45L)I_N%;wzx2%%WlnHl(4) z)C#1qiKrzJDuByA$4AH?uyKZ5j?olO_q{pa&YVG%EvHt>~&}l^6>?`-JFYO2x0G9tbAexxvgZq_d1DLmZmAzJ`c_NkJYqB4$Xj z(coK!LA|n%4{^-!o1jfrJoZLD= ziRKaS$sT_&vM_Rdd>h)$=7iNwd&P^zL_<(;+Wu&uKrs+?kCYyi8cw(@cP?`1S+RY? zrHe3XG1&egKRzB71y@9o1#a0KP6|MP12a#I3V^=-GnefJ7HYd%#lyry)x*VuQEzQq1$CGNcPUIrWCPkLI~4oQA}BGA zO+-0ofx{DDH6paCZk>u`Nc9(#rhMFPG9V`4F#Z54b3iubVWM#DE3AXW_Nq zELt_X%&7%mHMo=5E&@f|P$6s4jc7MKzrUYGW)6en$KW>SlvwFw$loX5p|rVkUI#N5 zqd!bfH}YzwO$2PGWnwhC#$Wz#qoo;3qN^i|BfYXZFZPAB8d!-F(e$MUo>mU@d&>Q{3y+mW)Nu zv6|66$r?GBVVf<04Z=ZzVZ)04Mmk(l z8sCAZze9(Wm>rbG#9Vg>Wk-cmwE50;+^?%2i5u@7#n@@|6*pdPq9ZO0zwzIpU_imG zjt%qpeOhLjtk@3uc{-lYu6F!HTCa4Mb5_49 zIH@_Q78wW!3GYDgVopZmB*UAL0b`4tb{~LDO*wC`c46x?ki0$D-%;pN9``jb&h58t z+V$wC?U3@P<>?%j-Amt5gAB^`1^MQ^P&)gr)@5Z{-Bc=Rpn{`b57abd-LZm@J zA%={F#6^*u8nP(3(=Z^j>K0xq(gg=TL_Z8o4P^W=wzm|Zs|Zo`M$sWdhaFuP2W{cL zJ`P@!WELkYBcWae6jmaOlQyb{JbXNDA;0R9Ox_6|6O;w@{pG(@gY-; z^zNt5>%Yk_XWZ^FEe2>$kLEC11Pkq!o`ghqpFg$N%c1=8m{l;ro+S@C zo7mUhDPw;}3r-w31d;usV> z#dG5L(Aq6Ch)N-fNV+G*qM}H%rzZpa*dFXvln}W=x(TlN?x25tA4yNT3BL@IL(-lW z*1H`@H&6s|bs+eRe6t$?q7K~&5_JFugomIbdqWWSG%##S#5W#YnBb|QKksp*ydmJ))u~* z89qX#L zm8GoUr>Ei5BaazaF>U@Pkmq{l8Mdx|Moz{MapeTiH3ed(#5&O$g-WrSRdjE6zGV7% zdWowyO#6KXpc1fcHWgvJLbnC_-{62x3-709igcCY_dhQlr2U0q_a(Fo(8FZyr{O9hv{qid2dW4#D`~lw+3HBq$10klTPt;s)2<)U+m;cLJEBsl4;YM+isd zi}Su>jUn3B#H%Oa1*+VSm%|Zdnb&zPPKi(iZVlgg6P3-khT1#bw*}FyC6c%l$1y|_ zxV5Mt9lA<5>KCylTNwt6?Jf&QtODBkx3W^;Nx>%eR6>$X+9onI#HFm3M`)Bm zu0!E~*w6&avreERWI324-SRukq9-s;FSg5yzzNb3zex9ppp&qE5q%!KKQPV~Lwy~~VOuTh^_0h`1EJz-T@+!EHj)Hth+q-CAFVDce?H5 zI%aVa-6P!BoHRlDMu+$obfN65?w*f3qYH2c`=-r(VhA0O&OK7K@z{SkSn(K;hOlR3 z?LkxzB=X(H{*tHN#<_>TleOaNnMjbBFfcq})G37(xnip~Ue+C(bk2&@bB=i10<^Y< z;J338ZyTxYLq#z5-wcnO>4|<)(A#hQksXg=YQGK@Wr;O1i){IeHG+|h+eBTOVJA?( z#=->($VH+=q=>R`hxfM>6Cx|7hzBc>Sjpi~V29N|@)abWkS|6j$F}tD8!9RgYPldv zvOuRzka`d*aNDoHe4rnA@~8dVc9{q3Lupuk&xP zuQ$Dr>2cOaZdPqyE*t%|B2^sZEj1`Yi+iy7ThvP)mLLji-_Ihs5+e%9 zaIfGn6SAgG6RRTb3d5MFeCM6GKpe2M#pK3Z5PZ^SM9M5FC!5p|ChE?3F$ii7>oUHL zd1{pKghXTZvd0WhW{*`Tu7SjkNSyg(EYix%Ad7qP-U`>DSUA&?-lEFf;PfiBFhxqTyTT28l=f$;?`z#=K;P%l?OGp6ig4eqN1FPRgdBN_KEp}=T6kPB z#9NCnWLbP)A97*0k|%rcuI(juaQ@t@tyvlH;j6pDFI-3l{DGG6sxM&ro0+V$=vzP< zy4i+^x*tI2M06X%w zt#V%++>7~=F|pFS-r4=Iu}V)ywIUpP{P@1_7QsM*-l z`s=cxSw1L7yvad*ZF?muLC_nyAQqJJp?p=YZ1#|MT`sH$vHnwK0QMDc$+>fv+vxEt zb9(oZgy9zKm1K7^7O5WX@ReohhM^v|>3nMPg_)I;<82GS3ApoG=}x&LD>qd@GU>K` zGIw?4tjOMVneBba8qGx;DotkTVy>>gx-N;uEuUR&^JZYT+JaxE`|vY~AZ(O>(vV~? z7x|37(#|xN?DVN4c3hF5LlHbg@ogW%MS$H1p3hi4vlmBt*&G*LADk@7dPX1)F@I05 zJaq9%>G*9hB_x$;a=AtD5m#@Ro|;;MZFG69N+#P&uq>#tS@3>y(^!%qb-^or-8+>*}^|uEXxpSeXvr? zbkB6v*b#Fl_V~g7CCOt=%Bfe;3Ie*+w-RnbQ3W&7hSiKIbX(Ft#)aF*6&p-D=cjC+ z(|cT`ox6-*5DzEPjKHvu#k-+rV04m*vRV0XNLQY6u`Z)-1H(Ne1S~{$3-A*59pF@Xd`EgC& zJAI}i^V42XlK~i$-&*I9i>|a3@xFeA^f0yW%WHe=_;QBqAig|_C%JqWVCoLKgTiH6 zv@Xw;=dBE*Ze(7<*;cMKj2mgk;|zjB!*&CIZo=+&NXnKD|8@6m*C@b0(cCdVGUbSl z`SVulu?f>uQ?mW*s8pLK_Ad*cs5LHoOMDg&rPoLCL{j8b$3=E_cj12brn_yqg@zcH z+a-p#NVuIC7e5ha2>Dz!f<9l2{Lyb^CGlU;#WiyOXCr@1iS8hs|mnY8= zn}?kn2gpbpLv9nUcF(>GJ8cg|n11Gb_iAT1TjX_AW@Wk^^J`@foW5GzRyz$&>es6+ zuk)Gd^uEfat#kSxvxB?a>{GRHUZvJopE7nrEqrhLsbcL|}(VYXQ}{U1FWV!k&`Onc8>%y^~d_9y2$fnXicq`n8Kc-si| z)A~JhXD1W90S--b$4~C`z7G*5>a9~Yh<=oP&d!G!+}By&o|U(Yx#Yf+_}a-wTP8Uk zE?YN;gx9{dT&r62ZRA|+aF;Jv`@gy6RB-M+wQF>~uX1yQul;&lRwrTo953_OefL}C zT;>E1;NzxWKDM7PHTfTG>2zMLC*FI$$TZ|(M(Xm>tqUk+6fH**M>$i^yr7@^wzKXv z<4y0sqvT-tvJ#ojw8-(+u7|ZZ?>x2$@`^K_X<4y{%)()nB4=8~x^9N#o3^GgadmQr z3|r#lq_mpN6^)>sTZNBBl1dmSOj)4)M4m1jY0zMVfShFt0}r(9R%zWU{9K8zDbhCgp- z+tg`%YIaKs?3!0{xVr{#tiMiZ{id)ytnUK$Z<|un)1GQBIC%$(x9hx`Bdx&wObNN4Cgp>fcvP z#GJc`MqopS(x=uqNB5Zdd<6e$Om1y;yT6>f2g?8=;+mQq;2kh@-_||4Ju^2{GLWMo z>v~+5M5K^(4O>{SK2Bkv3<5SpB;ZpQ;54P7pKfwnK8tXFg!jPExF32gupLFgL-~3( z&4Nd1A7j5IWtay=naB-oQGsG!ojUvOKfJoWPKUAQSboEcJwiu^L6j$ z&3BXo{Z{o1Tg8y9gy8$6vzPmT`?Mn>VZltE5jq~`~9Fcv-e}z-Up$cZ0vSuI0PYu`Q~?J#7A@H ztZW7Q8jY)TP0$BIW;)J5SX4|Ip zXA9M`n+eK_38h;m9P0Whr2)M?`-_D zF|eV(m{HT!YBulothd*@whf37@?2NEqmD+V&~t8PN?pZk0n z3S57ecCLoS#>MiV+T=I+A(wG-KM5);sA5`OVP*6A%sg+wKGZvcZ1O9!t$z$1}}JdVP{kL)9*N;cZm4yWB$qt$h>GDwe;!l)t--gWitIc#`#g z2evs|8>>k>vxz$^qlI4QHOV>88MFTWdey##_s&K;vOn;+7IxG35MbUnVvqeABKoFw zs#NO4d-OHK@tVUu-@)=>yUUs?c^>8OGZ{=cljiqxcb-nysKU(r@#Ty3YB$ ztmVh2{G8-Dy?NM2e_9j<*2yWOqy9sG?zirFDPH2s<>FD`@UOwWw&hP-t^ z`3+h&tgED1(CaolDxMHN|E1sEPtjrd9>*tsBAOcnZ~~fWN4qED#H2j{YP8oUn~80b ze&$Aj%3orR1lRN^C;@sUVqUlx9dH=pGw+Zh9{Jv#9iX(j9&cQIRXUA}+6etv&k@#sDF zn)R4{_2ti7dA|3}yT>79UFt23NDe1Miej1ICTeSe2CVKkqd`c)CWGA|0xIb8!tEeVrjVRQKDF4xhX zU$r6lJKHHJEs@iJA90;Ev7-Tfoo$w=uFrCJBXiemq}k0$fJ%kKHE$ZIHL37(4Oca8 zGKyrb%bu8>0)f8C;vrFAI$LLcmI-GFBmiZBf3p-)|G=K9E3@PcEz;p>S+b*q+u^VE zpJi!pcaaaDZj-Z-NM2d)WYv3E^4)T?pytT_ zI@N{(`JfOe0MP8x1JkY>{hCw4O~>aKM#fR6Tkq=}173=UK*F!x-!Db@qTJw@d9x zDI^ZT=$6X824|5Agb;-=c-_O9+V`0-{fSBi`uaV9v<9{V%OdhH1SrNq48XuNm=%6v zMiHEspl}tQDL{1J_es!hSAzJ0js6~IvUFIDHAo6tljdm}K63LJ#%@q}3LJmL&7WD_`e=c-H4^IEW{Tc&E*OmP)40ZdSm`zb)ot{XTw;F7riL zt=H~3eP83$bI?y|Osm*;rA#RyC?m zkiZ#{aTjaVR}+wa=hJeEaWWIrntvor6zkq;1dD>^3Cop(v!A6|J@;2oXIA5nt$8>Y zPMo3<8nSzq&c+g2uJoURiOk*yZoHcZq<=LEhUmAG%!~Gn+H^1eMab)jb&1*2k*Qb; zJPnSvSsHfKNF6M?c_WDrtgg)cxV|#(g3a&)<>+%RMvEcv68H_YBkU!i*X@GXwx82w zxXIA@_hWWh%}yR~oI3Eh*|<0=XTN1}kktyfO!KHC-E8K#%3OoWxdb9=UnqonX>kYo zg)ivY42_n!0bamIgSka;)x_YWaE(Swa%b+#kwNWF*;vE<8DBeG6#3OyTMnZIUoP0d zgmCe>isqhjz?W8)oBn$Zk5b2Sh>ueT=^Waf`3ADRuJ>yF;fpt9y{)&}$dc^iTs>ST zWG;w15(yEneuthY{>~%=q9AY>N-Yu>Q@Bj6W!hu7%&cI~oPnpjCF+j(dpX1_0Lu-T z6B;V5Crl0`hbCkC9KJkTk?X2I#T0BxX0Q!LtKKsDdB&D*4xyfD)i5#`!y>b{&oA}Q z8Ml@16IOrrO$&GvT4a!&vt7!w+P$@BF3gM4)mqT?rBU2vyZMSDx)R~50GC##14~I0 zFN^~rINB3O$b`LY`Kc@b3i{y`Z8HGViK=_i3fj-YPa z%%hgVi3&{T8j_pgHjreS$4#~*>JE&;$R*z_3XC)=IfNS~t(fcDcaK#^@b#OAju#MA z9vH*^0X9NBgD?MsK!b#$EJ32c>LZ77!p^J7MsqJcrAnJ^Zn4hvEf>2cw<<&F7@#*Hq!j!441D0A_h_PA{pFBZ!jgn@vJ#N8P`*e zp!AyUSouuUrdifB2w|K*LS(u$r_)#Yj!*T{voK56f9Cf2`P+FnF_;P%&DBpfl)zb2 z4VE&kbJlP#0(JTZHx$)2 zo*HZ0dt^t;>2F!eK*)A#x1Rd92A5g&cv*{3VqT|iXmOCrE5R4{q9rXw!#{x)rRPuo zFO+WP{}PVW{vlkm{Wlsn0|7H5)4%$E61|!JMf7H6U?=$Z{+}cM{mRC`M!?F(NWl8T z9cTNYfwORM5U{ZRW3&JCeJE3`%eV(Kjd;&Hf92rpX#wJoUH%c zaWWEc{-FK)3_sDFEI$$K1T2gk|GKg=F#lxD_7nRbekPWGqF6W>2>!7+7@7ZL6!U+K z{#hj}D*-bnCjm3d&$|A>`I(cQh4o)~{)55H$^LJ2_J6Yb|I^u7*csTE{)^7e$i(== zi~l!1dk&Bt&-eSq$rLx-VWLp%p+QRHmCG(45%70QDD-5U=G*JdX zN2m(-p{UyF%ZmXUAgH*aW1-JD$`4{U+FeCJaR=CTI<84dOfWHB`22RRrwWcguX&$0 zFE`(9x2@i(`vC;v&>=Iaq^7WswqfIdz3O2J_D>@h9Zbw*Jr|%aYOMg0!O503?%D8g zvH|=57}S)eg3j1@>3d#!1E|yb6LlPRj~peA>FNVlr^kI+9W~GB+K;7`zyr!?!yw== zx_vcr8kgzS0JZ-`=&udBH)WrD+Y6B9A9-qC)!XA?IdK(TW6+O%P4<9BqtBUVkQ)9t z21q)ZwzIM5J@^X2?U&*M9M9^`_pr!%99X5H$qV~B0&PNP@AFb01Tm0DySdHz-EHu6 zFX%=UKaDVk(eZ z0A5;fIMcIU7}@_xf3?oPq>x2z6&4CYX|r&Aj7(PKR@Gg{p8!EfHIPEGkO0?TaGN(i zP;m?~e`zUe#sG|iY60Wt;Ds7913f+RGlkHL451PfCmYri6y38n0`PZ%1bV-g1&0iW zW`+>3)%)?t9N3XO>ArBi8X~x{oVmQ0=c8Z4X9l^Q_*&GbT6VXL1KH9SxsOE2*m?pT z7ag2mKw?ttIr#jK59Y)UU8D*p{X+>4dux~D>TgDSRyN~7Si|7f*N?eMU4z5PQ zb&=~h$WR~;exRgmBaa0GW-=CeMK7_R>I!%U(x)aU0r+lb=;ZfhRo$g!yMlFaWl~Co znm`H_L}fCeN^I{k@L8q7#pwfKbpXd9GXgpejKkv8=VA?l8`onBx7?haKn@nqo*hR6 z{B|nQTe>VO?!Nssc5I#BhmKDx^ryuWarURQu|OWQyeaw)&it&TPcr&Y$mct^Aq^|J zev|Usvz7GAd%x?*Ci0v)UF0Y5w_b3@!cyv;B$259*FZD>XfHTzDd_dcrj zx&WUC@i-y^Ku8GziQt%m-TK_o2q*?9twRz6F>}OQ^cS4vg1DdB zXHap0xaXx%Hu1zXU{UjMZ%MCtwfX`;Nb&q?#bt)Gb~eJ%{u+v~(j(^P2y>w&gU016 zhF?JTkxqsde)@p-i(oVdhi?AL93qE>aOc$n&s6L=G2ODKa1!4&#?TV~0QrNE{A=m| zm>)YxKaZ8lmtOi0J!X@q`tEbdK3Dm9xA)Joue!gVb1~h=VE(tDf8t*cg17F(;|Tr> z>3;$J$Hb%%!v0&xmd~XyrTE+TneRvd(USPge5s-Q>37{_&-XK){J-Y{^7lI?oKH5t zFL3H=6sL3;mSDnuyya$ig+yD zj%JWe?5U+;up4ayz&gkS{$Q0XB4~K4_ZAy+8?8YJ2QsLy(|fn?syUAS{e{UtPTh|I zsQ)?5_tVeVi6eT15n$E?E&CqY!7{PV?AAQOcqB_8kO3l0BRUIpkpOywCJd^4v|J|i zlpzX|Cizs8hq=L7ZHlbP!kW*@WD1dbv0OU;7PuB*n)9{cOdk?M40; z`*xRdgVXm9$=DGbi`QQw4evz5Yy{Ni$0+C{x$tTF>5DkD+lS2;%Us_gYq{MkYy#Q4 z$GGx8@3EGWO1F*hl1ZOY-PCOm$vYndOto$h*cx#n{9I;-AwvS~@Jn_Vrt- zIVrZXvJE8Uqhg__!Y)`Y_VH2`@gf0&Y9S?!6Bn&)9i&wyl~h^Bv@_=BS7zppSqmzh z^J6x)iCfdaytpTv#~kwD9$arc8QVNKp=M?o)HJ5gy^c{GQL?p8hMqPZB?}iq9$;T=hEEW-_NyuO{!0TvS+6jJA4woaSfF%G31%~tc` zs=J&TnktvNrkbeTtE6dLk4oVhiHeUMUe(LEg_dmQG<+m!WZzl4rIvIL=2#4jR+2xt z^lwJ0^o(peVA$WJUe$qXW%{6*RDLnskmMQZr`K=hf#G1sA{?hB505#Tqyd{6jrLT| zih3|lv$*#g&RIJ{%Xa^Y>m!+*kXCz@eye2HOngyNWqIwL%|budWBr|-6S9!jr*sQF zHDkN5&eCLpXLf%9C+)#GQZsPqnru9{aFJytY8H$8nU!UaWOm1})UoL*oyEPVBn4;A zaL>xov`wmhtLh}4+EGw3qCRC)M{#_>r0&d;@*BY8M+$pIZu}YVgoXjT_3&Wf_xRXe zEZvZ3gPL=@>5Kz88>Z>rSGKV$X5wb77>s_=2y0hDU83mqEQkLV=>+d&i@oib$9vA} zv}%Q*X_^57_N!&VfKCLu^r=0~{DI?yW^ZB1&3~klEC{dl3 znu&y^4ACpQFw@Iuv4jiwqm^`AXfLB8e;E#z$337)I<;xqGxn~(7-}!zn-=#g2Phu2 z{+I@FIK5d)pM=Z^H@XcF8*$bP)oA9Hf|aYLsWujEdl*g&9UnWMm4{E&IqkAblJ1@5 zyQ}1oKTZm|;w-GB#>E_jNjo?-Gwhd1%6-wHw|?tc`#$5Bk&}3QNoQ{myX`G2glTt> z{i4))`Vn>1AoR_j>fzrrN^91P=QAm|GrHTV%-meKv9Ya@r5?f_*r|+7Tr`ihdte^b z$hy=pQy%Jj3Nw}1QcX=a7nGOH^{g&AaIK}jjaFrN{oSPlhluG4e^l02GXhO&b4+{d?!G)U8=8U<(DoEhV71bwlCQt1M$J^N$@vP9UztPcXC zP`KfRqsMGQJka!Wp|Or#SXl3}pbH%+Z=*UgOi0>6r^e;TC|Yb=Ok69pjVTYGkZkD* zyAn54+Zi=jhIVh5D~cupk5OzX&@nJTGU9-<>Gaf7xJpY9+iLm*oiPvKM$rO&X!FHObi(Y!tCs?;f}kl@ z^g}S8E5+Q5$*z}NOpCg69&O7TVMa{K*ihBB6M7nmHxtQsvfQc5mFbTmMjHfsqG-UT zjm%i`Dn2%ql+%nOf!-c z0^HI?YMw?3HcSztXX6|isL0T0#rxWFXu8iH;{j8Zv`j~V<1O08k zi;WD!?O-fyJa!BAoIHI|oqtfnwYIr{Sj_DK8mS&%8)pt8U;na9QKS*7?VHX4Ri_@w zS&yg+AlW=bvouovu1LzLjRPVYPht9+P6>C1LR!ibveu>8Rus9-Yu;R}dXUDm@ubj)z|Zbh#AHYLihHmvI4IZ-;+tg7c5vm_N8}CZ z9`xXG@EpW9fw$Dl@c#g0K%2i~3PyZPxsM1RdW_+S10G`>;scM-j(DH&9^qZWJLK{< z<=!Ivo$w~%4Z`b${e-^}UL*XK@G9XI!pk&>eT0_?FA`p$Zl5R5zYv}yJWKd9VK3oN zgl7m(6ZR0EqBfr-JVD0Ygk6Nk2|Ed0gvSUw2#*rB6SfgNgicRF9>Pu7>Pg5)JVJPw z@DO1O;XzMAF5&^g{Z#Kh!o7rh2zL|iBHT&U?;va@Y$DuFxQ%ctHNBCrfvVp^xS4Ph z;YPv@RPTDidct*tYYEp7))B6zrq@#Ss|Z&TItW(~)=-7Z36~L86D}oOLb%vtC_r39 zSVdS#xR9`dZ~@_b!g9hg!cxK#!g+*t!eYWA!a~Bigf>E}Cw?&E9Kr&^e8Sm;vj}Gr z<`L!+<`8BRW)WHlGYQRvCc+HDbiy>kRKgU(WJ04SZV19fID;^W;3PB<>IoAGb%a{N z1j2Yi4PhLinlP3yhEPQqO{gSP5XuQ(7)cmG7)}^Q7)mJi#1k zgu#RYLOvmnkW0vsAu>;_4Rdxf+6dW%EJ7w>5Fvw*PDmqI38|i#VTcrh#S_Cfbh0OA zC?biBWLG%R;e;@Po)Ah1A?OHNf`*_b1XG(q z1Qi*T1O-7Nhy;Pa2q1%b3B80K!q0@Ggd>EX2>&AdD0j<#kY~gWlkpJYd%|~wZwUtp z-w^&u=q7wk_=@l);S0j&gwLqIe|VxTh))Thc%pHGv5yHKd7_ID9}*6DqRS8;c%sV@ z?-Sl5yz7asK)mCLu0*^|c#H6NYWhvW8`RkA)YyK)-w3Z!V}GT3uM%D%yiC|fc!}^L z)q8=OexC3b8vJvFXQ{tGd!kDbd#S>osH10S)K61mdk9Yvo+La$*iG0)c$}KvNlkZA z(~nWpI|z>wwo^yj2p&Qwb?YWz+p1bURPt+*HeS~{GQ8kEr zJW=BjcYC5HAnx)+O+?)3iE<$BAeYVLvWZ-7Czso(>{jyJNVyHK&+?Q8%I9uAY~;0reKtn^A8Tc9ssE?!GhD&iPY8P8YkzVcz<6C|i1!pN?3E@0K zJE4qFN^uxPa1creBMBpD%29+!LIlT7Q4|G_Bk}GhMFClWrzia=vIpHNS$K9NRN zN2n!CAdDx}5XKRz31bOk2vvm9gi1mMp`4IRNTR`;35f&~!AM9T7zpu%I6^Ew{TcNr>JikRaDo4Y`XlNOsE1Jxp?;66`W@=GsGp(!1NBqXPf$Nb{Rs6#T-|-B zFQLAO`U2|nsDD9y4)s~oKcntN{S#^z>SMU#J5V1*-Hy5qbt7MWp@(9;f^Y%hOivg- z3bA>FxfGT;gxQ2ygcia~LNlR>FoQ6iFpV&kFoiIg&`59*&LB)8I0+2|JHbYw&L(6L zG6{nS8H98~8o^3PrL{>RSO^M&L=XuAfzcfajysWF)LzujF|co-zK*&d^>3)Jq5c*1 zRn%8dU&cW1L|rYWCSEGq5-(x4#EYv|IWO9>%DJ*?h4aEKE1a4Y!&X$U5H%|di1Sx$ zS@F&acd>KEoLbSxClt!j0)ZE1B*Xl-p>*}AFq zsaD0x)^)AIR!j+w)?i)bIaLdsA1q+7TkwJ&b&ufni0al|LN74*M(A~T+1VI?voH{6 z+U7dvZJFzwW1Hoiy=9iO#WvH~Y-@7PuuXGL-!jcP)i&8VWy@q|qs`?!1N|r28l288 z4bFO7opa)rI_Cu2c;|Su*Vw9^fiMZeHirqJ>q0k$ZVeSDgw6>4Ce#}$Z4G5xL!JtGB}AMMG9#ol zL<|k#c~S2OvE^2V>JoL1(RQ6U+^#FpP0)$!bj+c%IkeV{ z%5T(Owct==!8gI)V8I*AKxAgdfawup5U$O37L`~jKEe18OBKM_HPDb*-KFwQtab<0 zPI0p}?$mmIb<|CEE7!QeIeCh!ld-ECJDE_{;Ev?qTbJ{z*RBO)X|>x}@A8P7HycYE ztKF-3+ToDXUY-VYY0R9ysD06*#hHsT@q#*i5n2|vpt>EPcYVL#LbwS3-3nXaQFt7lh8N&(@I6yQ6Rd`(;A8j_zJsH9->O&?OJEtN z_nRK4BfXa>7JyFN14{lst$L4mzvz9y`vo2kA^j}tF&86Qk6FCo-tOaVz3Y3sdS6y* zKrh$T3ooMeAnW!X5lVR8Tgdami^Z0vli>#_=||9X9#Oc>Z?$ zccWa&OYVew;Q@FEc^BLb_rQH{Kjt6A=syIHpp7h)e;6&B;SRLki&pN%ZCml58#=)Q z+h9Ac8Rh-CF4zM*;4$P*T+Lmu8=inCaUJ*I%0468xW%78wI^Nw1bgAn@GLwBe}U(5 zXS@h6!9I8yUinoef9|vJ+^g_ccn$a3es~?;fH&bScn98x58wcNguCwR6UzUN9&e-1 zdp@rZ(d$$A0zJFYll;i%UAgpgxrO~$_W*ptg5WR{;3#-8#aHh}d4+C~*O9LtU!A+< zIP>+`ig~_5_w}vK!x-a-aXopCr#JXk;}P`j#0dK1ck-yc>{}g*_ipszvEU{9e6e`W zw-UUaC;RHYD3^KUde8K=dMu(e!`J&o=iPoW{1pBnM~0$DrN^SjJw8Dn9%bIfz}S9- zbt(G1F1Pou!^_^r{1K#o{`(jF1V?ZMe}P;H-qJ{C3xk(&t=DSE-PSz*$`HYmTb)DVSXr<<;X0BT9^s* z;fUgM;U#Q85>J)RUwdjR9)u{^?EROwwD-=Q-Qo_`z+S?Lgn$=U>Kx{P&5G%8wxZ4Z z155UPs~GM5S~}wWn&o;Afm+-w&cXZOLunjbfKP$YyGVQoPizrXPz*IN9vXIoj@^dG z`cU@b_VV(eY}J#P6~N41gdkkL+Z+*+pfeasEQ6I-iFILPN>o<~4N%ha{(H~jWnXx) zeIK*G*ZoGfzUSGnVte=g?wni}mJ}vyWQd?rDV3IFn=m-dT9}`oH&Pf}V6`NN2(qo9 zaL7n8KhGqHk$%faf#;d{&d(FXik=iEkSeXP)Z$z+Hu+_BY+8abEmn;*CLnvBQG^`%P7!kS45|F+ZsGG{*T@v*GMz?H z1P9%gZi-6DO&C$F3)Lw?3^DNus-UnC^`NTeo?GHmW7O)H)cAx{-d1YQFpNly_lWc- zMIF9_5MO&{s}wW@ck*bTqA5nwX>t5iQA9YvB+^ z3l*cXh)GhXRvBHCn_q0wN@w)OPn2}V!I`##NTrsoQ|c`v^M_TYg(;t5kFnO7DTAUE zVz6Gvq@IunjiihjWRWfii_(aqCOYETp0{x?t_6?^aaWok6N=zAe{2(l^^eADqM|gw zf99BF&F4Rb)5NFYi}$wNTvbY!Z{8{RvhE1h*A>L_TmgTrcc>b0e(~LzCEb}gx$a_S z@6NM#2^LEj-{29)l2W0y zY+BpO@xAvaWoIX`iY51)J3Q7_mN{fvMSAZ;u{mQ#tX^MSo*i9g8alb^)+dKl4@qQ~ zRDJ?lMb7tAkIKQTH&KSE+tqqd)##!RRV^Wf$ zC*F1F&U+X-pJW*zr5GNLxcV;U=;qg&mi~$*Dtwd(PvL5iSc3 zQ7aU|GdX(l}SHNAT^G5BF%jZycm*TkmryJW5R zh}eShN`uFI@lr)}3D-NKbw)55Rq3IuMir~ov2iNB29uAoGa$lya0jL%BI1-?-UHjv zLn%)-gpE^nu_@af$#rq^QHnG4%`cP3Y;Rbx956@N@7HYKKI$JQ|L3MZk~l#P#;B34 z4Gz&LMGBO_TNJBp2??RG{MR-hEp(S~3l#9}&qp4MBj2Wzd2pMSlcjA>PA;~O+{Ntp z%%S#e4mD295nNm!DQ}KQ{=Hv^eUfi;@H2yd3{m*-?CHjg|0esd^x}`^fCH&;NEm+F z$qylNjKlb8f9$bD!jJ^(f^|ciR=cL(Jb&o0vu>E2H7WIQcqHGL>`{GOggR-)cC0O5s=%F7A^mMo0t?0 z0v`ur22D(nAt)Rt6g#ix-@>4-34;-`a@6OZH;{g|gBly=g z<-h&qP1}F}(uYA5+WbjrrOuRRP0KgxdK0uJ+QT|izBMh+q-CGzjQMHSJd-X(tye3R zco8%`hy7{kS%0cGmA&In`_9Y;jA=ZK@y9d@j{pq>hfa)=Cltkh4sq<*V)lLfw0E4U zeBg1`Hwk_#HsBGZ?%A4@?Hja?-Gm0kIi?JQ77weN{KGo>jV3OG)?0Zlo=?N!O&Xg+ zqsz&OvD?+Q*x2|kVb=DPT&-4(iN_$Nur5xkiQUDrG59v`!R>mBFfJEw4u_eiV)Xo~ zqiYP_Nj7C-dR?NkZ$C6?(6b!V`0nlXDWo#oikQjmeI7qoy$XAzNvV zS<7N2maI$6C`#=#q{SWE7LxJkC%Q1TsNm;Y!qJcW>=)%1hFXdT{oEt6K|@nQL$H?b zQ$p%egu@8fMys$REmUm_4UOc#A!M@UA-035XkrGBLwKlF7?+W5OV;XnN~=+ZcCi(Y z;inKk!EOA9X8x_h?}B1{1TD_QBdGY;J!KE0V0(Uhll}-(V6E0POLTP9iQ$bfi81-s ze%n>*(i>7E+AR5*>2bYJCJc=cBuQhirC4n7>LKZCtpyn=5kE&~rdz|AC~6aIDap1t z_0$+V076nr@`P!HD~46A8`m>MO&=p_=}Nm@XBwQ=o0eH$Uz=WebA>QNt=B3PTD%7Z zsP%rKh*P9O1b!0tJ&8pM&)}1o39o91JN7&=6>q$HODw(L@EcDt=_F5Lr&*!jneTtm zlpnmdw`!qbjm z2uqa*iSKHe+muSJrK|5Xj%99lMAd2i4*>E97T+ztXR!aMo`1@gmM;<*q@R z-Z9A|oW6P2;Jgc=95&Ltx9e?T8R}iav$(!PgpHnzk}&zVKy7;e(DnH4wawv(8R0jK zz}K%Gj-XXOOv{pT$K}WOM)XDVrmQqc)D)hvq-NCF4I?8$(u>E~yjF`i%i#)F zD0{Cps&N-T(o(j_H7s5u;p2Wter@ZRoNtoqrE@mSEr?D`j?c9v4vN<#r6_{9$1#aRVrO9pAq&HnLngq$%$ympCEE%PVTlJGkj(IcCxJW&aL74%;o)~6-T^6zt@b}VbXX~mLUJ{w*#p&pmO*vuxckVTJ>c_ z04j$my+WX@i9yK$cgvjrCD7>Q*_WV^uJoZfR6mD`YVnCf5x?aMo#!BifB>lS9K{zx z6#ghIeTZi)egpH~)w&_67=zzp4H#$$+H1a|m94SEvSaXs^Z6tT;+BNP8^CfP7reQtgaRFY&lsjB^HiGONt$ne<3tB<7;= z1$0-}+|&%wOh%c}%dc?P$_yV-va)6WvOZ@JHC%WNztm^1N~)?HS@jCaf&8UF6X;21 zR{50Vzhjq4rMEZT3Vsn(UK3-6Ofs4_Q}}Pt-w_g9b2yfV+?bnhxtx;Wb;6GLAB_tuytFQU+pUZU;lGFx0knf;?-aCm9 z(7O*AIIq`v8CEibt-h#Z!5x|fF!Gu62m5@dU1qyd((%sK8bq9 zT|Nzo3uTh$XQTk63A6zx{u#N7B2YreD3~u-N^ocV8Svxx1Y2bY*PdmQm#|w98nIzd z)hWUsXVoFvc#jwL{_@B1U&XP5aWozmdSH*7d?Go6ip~mmBVAX!U}ZUW`07{&#y6f3 z(X8=h+|l7SXXP78HXVET@o37aNN9q6 zZJ(ctw)(YbZ~N9l!Xb6D_+zZw+Ow{DM$2mRXy@dS)VGu3aG;Oz_7AM!OxC@&>l^3G%t~eGC&7k|w3il#i zvscEhazCm(o@YTFyBrmVe@tvi7B)8>{pOiM`Jrzg36ADl%nT`#h!}V4NTzdJx6{`@ z*_kT0co`ujz`x{=ST^_0nOif_8RwCTQ4ufbvvY5mY5 zffk8Yphd{Qc_H`qMUH#B2Xb#{?3{GMG=s*^lDw9x;BH0ctabI1|M6($bxs4VkG%9q zvGONJ;mEfA`#0QHW-;fJKmKSNFYN5S-+d@|d}CsEduaVBAXjKlVK9;q(!p_N_goa) zRdy93HqM~Z3vw3aSS?g>PBHwKM07?KujDlUYt-I7SX#3gN-l~x6_yh7l3djR3 z#nd#p=F%jras)y?BGFb-1b(LJQ(;6iJ~=4Ru?@t^4U-~T z#+vj%bySW4#c)?pK^{noJj7iAENY{8!=lhnSN7Dd@i*%n>KXJz?YcU4^kFb|4WfD$ zc5wMu1x~jyD|SkvR5vp&)(3S(ZsL)P$2^#P=q&M`}g|YbN-OrneokD#xj9cmn`J3`B^uR zY8w(c>rlcCP-Y?q-hjcFn|Vnofey9;Nd)#{QFynz|% z4zfS+$CSTtWUVNMp<;c&=?ojh5%$MQn^7zNp{Li5p%{va4FRVsXb`XUhu8r6z1%0e zt+_(pTEQA8BUV||l`TV$6 z?Q%i8A@?rIjVo{&#OeIQKf3SUe?7CRAH1J@;lV=XZByrDe`!~j$<#T~U)-HFV~#UF zd92ia-+zDn-XDLm+f4vB-%L33>{46WD1bkEh z2X_upfb=MtB1y&r-!&6VL&~{Q$5o5z2UuZ~jb$}{vF-4eZ{NpxWzxb#STy7-xqJ2$ zyp=!1BdUO5-_c~dPldfc{)zEe<@rXb3WRiOXy3Z@AVA8M^TtRQQXTV~V9ZI7hkBj` z0p%a3M7Qy2k^?8$xrNQH8u^V3;~Z*zLpYIzN28J zgcOMrl$`mEFT*M;_tdBRP1fx!92{ugly8z#)^LaSXJ!lbBXi89uKaJcCk6eZ_xf+~ z0I;M1Wc9O14|eiAn_^Q^3*5|$NMn~!*!e*L$f(MIm%eibrO#V>$>1(M1UkHdRawQw zG(gqj1UFo{2RaXacC2Z~a7HB(V7Q2(m}q`mr>8Zb^YyIRu%_GBw)<~}BkOVrxsb$h zAuXl@9m6q4(yjFOuHCq{$B(uReq?=AZm=k28k^SU(^F=rNp1_7opGt0mOA)86xc)J1<$`9 z__hy3tRUik4zXh=foE&6Q|BpmQa)*#bL*~!ZatR~st(-{mwcVazINMze?Hd1SP~w% zAY#o7MIz<2nYPAQf7C*wPapl5`SIZZ(Um0DKHd)ex1K4Ek9xorl494d~ z;^z<@$Q_w!r;gHTX0Vf4iq=^swPY0z)R=)eV!*Rp84QbG>_?=`*_rIfv2wEVuQaJi z$79VFn)nO$XF_60g~ADyhz`ot6b_16CH`rbUk!UjWY>O&OXMn=5NiA`zWNu8gYmT^ z>*m${qx0+jr?LuA_D=>T`Qm*JXw|F!<%<3fUe%A1GFNA^J?D{&WRXPHK8LumFCa$52L+KZBojvPLZoo-xE`(& zJ(HCq49ha%NtRLBCRL3n$`DOP^+1K37Bk!$KTpmz^!|8-c)h&G=j5SF*TsP2-!Y)( zu3)^yE)~qs)HErzG`Yi_7EFhV{-C0Do#|+^O(Oh?lzy6&n&Y8lMolZ;o{YH_0z#~i zpe3`pGR4R#LZEO3(aY$U+@+%?;pPY1(dr(xw3$}Zj#*NQC&Y-P)nVaB3&(&%{*-%fysFOw=jcd_7jD-c-YJfIHv)jCW zf>A5bCn^UtD!9^!-7nY6g#@jZSB{_;6v|210T=WJwGO-6h!vt~Gl-s)(je>5+N>_a z>_vFWO8)v=_#ODGFi)c1DnBUJfi$^!8u5CO)){P7R<6Kx=pS{cZiY#r*HUN-?)(wM zj)qh!(jAyV^;y%eoGAVg=f|B`);a9l=EP-An-gOQr<1VET>n*8%E-`?MK4FomUkmX zNYQ7-;Fpd!vP_vk^wH`9O^{zG9vd4U;}+_Jkf=EfBy^c8UU`1*|LoXW;h8ELpD7_+7ArN0+JMI;e^ZH~AF}%Wz)J;$+8%+Zvb^ zDzsV-%p$2BpV%B8%&&6OhJe-PH&Bcv=JCWVjI*z=;M@7|dSB%|MW8onh$Wk?P1~E| zePK2FyJOFvDJa-h|8{QWg_6;vtF}y8Q8{Ba>Cl;}qnUjpajCP}SNUmQJ~6xtcya-t zCD7pN1{e@sji)?NaWEg^X{m!&q95i{;AN#P=H`7B=KAQ4PfvsbQmCE*Xg?t$Pu@%j~R z2@u3~KAbn!a@_odb2nJF3P*{h#iN-gM6HfxtK!5p#6R_%DQ^Bq*~ysWZcp6IDA^V^ zzP-8jtJqAZ`XgGihZ5jwh1{7~6|c&&*yIMX6cIQn(zf)k<0PNmcmFE6Q)<#T-+t~y zdQ(q8fp5rmweR`Z&e>m3d?`qwv)#oeORjhJYqdMXLl|lZWNeW(uT1MQwMLCLBd-Ii z$4VQ64x>va(>nB=woZTZc!nem*--cG>*6HEC>6Yh1XqEEjv*hNS~r;82sLD5v)Uui zgLp8BFhD@n9ixRlsI@kv z8O@#VFDpu93BrmwEkUJKHN}?@vxzt4b%ia(*n9{L&5=9;A&P=*ewDT)eZG`KDX6@% zKusogPEFhQegHM0Vxig*=URB=(#pGNgkc<@Y==lig1%DmEmTz?%ifHtu3bZSGD_~N zXqi)0`DrDrw($BRUm*`8cOxgKkz;#@@EL5&bRj(?1yFrFOD8*$L*R8x&2E~(j%2B0 zr9Y3Xf4g|HZ~*FQ0vShhQ@53qpuV$BNjnN=xWPSK?wvu+XGJ-VPv}YlBvMl#N4s*W z;~IkG-vjafvI4qVUF-miRAmmUC2fP6h+5&q&QFRrtXuS&L6_R|+1(S5jYqx<<*HV_ z5NT7}^-7_D5)rh*9?4isw-%feDm4`OPL(I)akY3gI=7g_)N;8q))!w8&l;m&cHe2B zT>OHeJJfx6G#1@-|GGg+=d+}vmBVBGLa|V&ahpRig_IGpL&tZa=c8$hPe-M~t3q0> zH{%L+x@9^T3G1rmBcY=)W&+i=2w)x_0O;yP@&Lkun)~r;9-&Q{OBmc27{zYOQYuG| z&Uj6PG*HW;0K)WV#rk5s5xsvpD=h;j;}?wi6w23%JRlO^Kcf;9&J+jMrV0 zQ&<{*k<$CEcAtS>^|xDgeSD)Yx#O|%ffMaCmx|5IyUjbBF-M!}lfb1V#|%=nUUH3g5GK@R{fvY*GIw zL@JkJ3S27IGiX_?2OkjsC2Ou`*WeX^`L0&s-`L@;W5KIi#~>H+YH8kI6t_!!bf6Y29?B=h)Qow$3~LVc(%I?25gE zZyt~3qXrCpHxkN>bvso$l~Cz0Xl+`VRIgLCpZLZ{j(zKNuIK2}TkZSqba#wKK@>7v ze;4~S$Rh2?;i^uwa>N9ad@SIhK#G`Z&Kud8xs3w03)xt~UXmAT%{K{{!7nFgFDEZ^ zU0c+R{msHo-Nx86$JEpV4!`u|vA@u3u%0tLTLePCV$sr#Qs52Zx->@jwfT0C~4<;pDHF++B zxdq3PI|1e{7y8^x6>}4ekn;FL+Hku|`UD@JpJXiYc|!HAKfTq|*%H)Caa3%G``sV~ zyL(p^d^>oI?(a(&;)%4a8DR8Pp`|c7aYi5z32~*T-M_3V%9|eA943TfF(Vd(XuUF^ z=d~qzo;-mlk*AR_Oh56&!Ka~?&Yv6~FK*lkuMVmXb_MAfY+F`bv=eq%*XZWMg{tRc^7 z@+zmpE?%Vxe&Husg-2YD&G4x-*N%^^_chjMHfz;ZSRZFAvL`7iO=^^%szI{Kd2r=v zv>H$O=x``!V1O@5WJ0Chp>9o}uPsm{W*FN1Ag6YbgkGffoi#(+LCYXl0}Sb50dQ$t z!M6F=E;gjaM%Ar6t41f=Wm!Sb9xz(wvL(fV7L#fU& zcboVn5T?Rl*R&=<41_B9QiBQ>IPQ`v7+}jsR|oS3S|%chcVa*&g2L!c3zJhH_(m2f}IacA=c_om3g*pemf+QykBEVdNamr+c9v zQsqKNDO@mAi;%gP2}_WdlKct|lrfjPJp?me<2f zw)4rIDJ~v%GMziY>rfEt!*=4xp(hHDLK{Don^=Dc>Opp*u&*>$Di?IdOvwY8pz^e_ zsL17E7$j?95c0Ci1;NE3aA`rWQ0V{FLZ1WsKTAcr?g#ogF2EAwxd2awjqPZvu~0zK zVpnMSXqUJFS0iLgMYkK_2>uFTj?0m-YyAYGLe?U~XICMYux}s~VgtUocC{VaMsqB* zx=@B5*q*nCfaa&0V=`1WgWh$4Y%Z`R1LuZUu8zsC)^rSzGpH*6ZSit7egm4BM`>wb zqYr^g>}kKh#UYV6TKxXBU7}hcr<9HiX~RA%EhI5oE|6)=nx+`~F3S=>^dxN(i7n}I zC+t$GJ@H;@C3*2lM?}$5t;-nm5&{y0K!=-`m|%dD*h%E0)5F8z<4{i1p|Q{{06aW* zfeL|FhC7k>PkX2$p~2d`H=c30IWy3gRY~NF$4NAQ+H1(gA)|K5+Da1MDCdG>x*_4AYZu# z(O}yU0pbQxFuFe~oWU+!P(;CNjcW$GIBnRvVNDD4f{A=#4TlG}76wb5g+NK*W~?Qq zAIa60+NwFJA=+`VZZ>hX9_i*cEAc#*W(k_?CUO*hJIp00B~;tt3YSfyfc#aIW@t-- zW66YbEE!IVXm=>6nV+c=i=ll-YoMB`$U`tfUHiilycI)B0hV7#kbUr!Rn1a&0w4Pn z^3=1)Y3#!JPmGVZ?Qe(is1OWlJzUk*c1zpimw@K(M`)O_w0COTz^gz3b!8c3q*S<{ zCLiv<8y*U4nZ7N*zpxu#Y{<1o3s8Z~NTH|HRPq!QbtqAHx~{G&oR~{jKz;KQ)^g2g zH=UD~cE!1LxWHaScS4Q&lMa=j@@mZ)fkr70uhAP$NuK!`iO+)>Ug1VQ527LwFelh& zD3QsaIWe?jNp0U$R+2QjZF$qfn9zU60!R^-^Xc4uCaD*4l<|V2q%J)G)N)o>CF{5y&Q*lg#n(0sizo|=oBDo? z8;4~}spx}gPRK%8r_BRE)|Ia*Bf?KdT(WsA=y(SBF&3jFQuJh&14{Zrcq*A@lVs@!OAQZ?w?SZw+n*f3% zrpn{^Gx$%CPGk@nN0I8Du_0MZh_|?k$>Iw|+*U-3zy1M(>KT;z!6<4SMfIcT=pSCv zpgIkTXyh79rqOI`!T-`;2-rhC&-GwP58CrmOHsBNmE)UV%-V;zu7>fgV_jFr#z1Au zHHpA}5%BBSE8H8`>|n~SZG13YMBo3}bB}KCd9ep0dQjO)kKZ~sfO*d!t94rdOQ>N= z)++#jUaPC_ajjJgX}G%AoUX0$X>|bTqbauDzXEqZv0kqful|NVqm}Q~s#4n@S`!@9 zFsfwaXQgASgRMutcJ#Kt+Z|OnVzywkIp_+ccRV-}C_7M-LR0zXaKER;qa4n&Egn@{ zp=-)$Qwb)wWCmkud|ND{?{Ey>IU3YRC2p<7gNblY@7DI7qw5mx?8YWXdpe=h4Mp3w zdtE#F2k%-Nro^GjUkby9V8+%rqz|NL*M(yksdCw^@gEBI-H&t~)MsYUB;!9$f9*=i~ec;oT^h$K}-XE4X$>dSU7G~=bE)`9c$OL*GG<@06-Uv6U-r2YHjH+ zwPkn>p(pU~)pqP`o2IzuF27@E(UayLaI$t))%+!(`4qCfHv2f3w-aH&Pc7oYE=+~P zTCS>+W)ZEECVl;Z$Hj z;)sKS#KwSv8xfAnM8xqG)hyb1VL#6fU<4pvy?o? z&jpP_HFIr(W2ULv-6a*jf(qsaRvm*t3}V(W@(i0IbK#c$aLLdp__@O~GTi=Gc&r^T-VgI#@8i46IkTqPid)0;V#W+N z5Lsx2tH~4I(##R9Kuii}vpce-?&6fuZ?gw>oS``(-On z5(t=MW52AUnX2{6o?fY6wqHK$2W~ z!OI`a1mT@|knTGJ8kj zGPo-HT5o@1^)B9HuuEJY`K?utVP$aXh(U}p%0@*gT!K@uCx(Wnl%b^FA79WKvXpah(h*>n2$6&msSQ@8CJ+WLvcNT5oh>b9iPf&B zNdm(M+z}%M>koH(X!got=Qx`6q> z$Qx;pM5s3v=`4%@X?q&Oxsz06?PxnZ`N_ncrt$_nNu>zNehFGaw5XiWzFo5jc!nB( zoXQxtJ!^a{D2GceWAlz`$=d&GA9fQbxL|K*_B=A0*j$Kd8A8N}>0owkv$M&o_H>k2 zmpeR(tq-gT3}r(q5rN}EMkHo412Jd9E@wN3Ru6TusI_!t&@0pFHQ|uOr4bseMyb(f zvlToNA#)uaO#EYFof=c7(DUc^#3TCl4c!A)opd(t<^h zNn{Jwhjb%{u-<96Uv<}Mjs=hzWCyw@yHzros(X?s-;0#*g8!+DIcq+eYuU0d=Y2CW z@a9Mayw)e*VD}Z*znv?emch<#L*XIF2Z%X7fFl%>b9?CEX+<1YcI7hg=V%mexZ%4i zUx(45y7fb_eDfr>P@xi!tS2 zLVq1AYrl7I!9x=2UN(E{NTji&bB+=K7NEQSJM0nSEYga6lK0Y!3WcQ2kGSBf+&P^j zTno!#NUOOD7D?@f1nO5;h{ML&tdRE(5Sd@%l3H>$aXF!=omLsXiSOXE{Nm2pmDGnl zLMvTWE@waA3A=A03j^C`q1b5wc_I{5EfD$&{0S#3(oP;nCXlV?N4mQc6G_fH2F+{& zNjSkvvSDzduyv~-$qvGaZ78I{#4Z%dp^~|vg=_wTe3ci2%oyavfTS*0`LLI&9WQY0 zYd(`zEs2+*iC1nku89jzd&+l=uz4@+R}qN?LYH4__8BA%?JpejUOCVppyj2Be|xUy zkK?5z;$=Dn8%f9&#Eo3P4&_Vqk%JhEe)a#-_9gIf6j$C|)zdxG-E;LEJx9-d--o0b zX>?d4$(H0>mVC&E48{ir+gP%UF*pu~%?BYI1{Mh6Fkce#abrue8G{3Siy@m3=Yk*E zBp+dS;}NEOUfi2D_)*(oEH>_x|swSMMP+N)G)}#=S&$SqkxJ z8__zFY}4WhWz^w_YH->GnTfV_YonO4nljx6MDJ1mVn&Mnww^wNYdDrtRB=f`ys21S z`S0@+@Anb+WMpt>6@gft@4N)^dCopEI~n4}^OK>(WeVAE5fl%g+2VNYNOVa*<}^Xo zuCk#Qk%=xRmUOpucXv1StMS}NGTk~XL;l6530rQr15M7@Z^*2Qb9$V5_dttT-%p}^Hs5-ROcRENQ@iX{wcWtmo0B(%8& zjY@q!B7Rh<`t{Ly5KsP1B*nK9H;i1gy93jA{k1{NRPC3yYps~jroeT9W$l@OAOte) z%P3;&`pfoRwr?v==gqS>c3s=OySpQ3U5^RBwYv)wzJD=VhOT4Hi=`~xl7yF{->v1^ zEm+b^O0FvSUFOQq%Hy4#Q9n2Py3c(plYbLOt8o}x5KAyn&IB%V`HrepVD-M)R+ZKH zKXXmNofvlf-9ZgQepW7VwTQ%oNfG&+k~6jFQ@bN2Orf8bFlDTSDO9?GDfDAV$}S}? z9&yfDDs3`dT63xT(t&|X)ugxtvqgIv?=_A1#Xh{%q~5f+d(oWkbaz8TbSWX?#rJp1 zu(%n^)=f#+q^+h>B8s%$(n2Sty{0d|T%QB4z;~(%zqWqQk^auG0QA1o(_KCP)>F9?OErLcLpC9BX%lvX3Wt=iM?UY8T zdI@rxr9A}o=lJQ_PISyDB9N_ookMVEO}K|++nh|ye{9>fZQHhO+qN^Yt%+?r6W)A_ zySSUXI8}YBy80~7+i&;pdGa_n?uajuItNW%`+IsWp6OhrjD=(qlK-|A^g5OfD&eF4 zeQN>O-wPvAMs`yW#LrqsBrLnF8xGvx%~R{5X?K;kL>Gth2$ zP|5rvS2U4=_>iEM`c=BrozMF&rEL+fh|^*`x2w45-j`(pJf9WVyH~OiWbdVv_O|EfTeJPmrQsW>IU&Srs~-O=EG8d(yz)0 zHwSG>wfyKMmD`GS^N}wUHC?1Rxd+P=*P*v$86#}uI*WnVUqkZYfR6$kT(Msvw_U{( znUC+NL}Ib=w+!LLu3yDtiHHugqiCcBK?Wn=E|ImaY@_?p))+}D6+_0u!YlO$8y)vK z(ewHl4usbo;0hcP+Iofe5(A)iL{q_tqW97R(YnDAN*KGL-Al$HXze6>Pmb2Wzb309 zxG{5Yj@;k9eW{XFhjr4cO|PY7j5Bhd-YPYrR8o*?)qu2& zsB~|Z#(w##m$t5o7`mAL@qXljP7Z34fwURA|UAc}1x* z6qf|t?qb{b%@meOXbxlS03nB&S_Q~(c_LszN$Um5XI zTd`p7+Uq8%Y2`css(pF8YXe}@Z^`o9+n1_o}t>er_K8?V4BZQpyn0id~Z?SiD-vA=6`84oYn|kjB&(N;BQ%ITE zZ((U#F_ps0X322z)*{_%6wz=)vne4E#eS@E5IY(f0dup6?rJB1xHHzRwrdyO9UCX2 z-$27J?+jm)g+;75jtk-)rk%=fmx7hRmp`Ddq6wl*pcA8m) zvWRIHq_!t5L$Al${JW0Y$euOhwkV@IbSMGbvRS4mqTU8ekG09Ujl>krTNt~D@}e_n z;02N{ZrC>kww+!gWWi6{!e?$dH77zLJqd3?T}bml#_swvu_v5B_av!|=HA0;xR!@m z#mRR~#+q1^ok^R>CP5mQR`#ImOib=M8Bub=NmZEix`X8 zY-DC1sf--9ty%iSMhiV=aoi7H?`>m|yH8_--NVSrT3V!%Nj$3E+0=0@chxK=#As^I zdwKIp6(cw}gMR#KR%9g-F&3Q)?gNTFS+2h8&)etiGP>dkKjXcirKE1K^iiV(#kevVf$2UqBvQkV&4R!maA^tHnF~=plzfB-$m9+`<*-@D6_33DQy3?Q39V zh=`BY!vYa%ijT8VmcjTKOKFab)qSror93aDY+X~`^st5X0o}1Xwi$Q=I3Z+-4bX~apv9dd-hs2xB^_%5REx^VF+TLp_nv(Syx>W zt7}k&R9Q&)962u;!a@}q$?9fnMK4_6d$!VEgoSi)9ZN$oa+nN7x{ZVAg4E2Z6G#({ zIPnWGV0O)O&UTXo&<$FDVphtj$nM~Z zj*+ex?n$A#RV(ExpwYW+8=qvQIx)5zG%l0p02bBM(4{Dds7OO}&MwNc@ZhcCs3W}C zHhV|=Ixaj1l13kR*N(s=5$(QJxGxa8vT9+bhH!PMOPhmmlids9@VNjXsE3n)jd139 z5QHNQ4`x7GSyAy%B~Xbhs2w{$eU!G9w1KVZn%3~{DkCUs8b_h0ELgIT(#ONqd>(H# zdl*TmbULMF=J-=A6p*$FQ;VpV2=eD;Kqm2!!$W)~$Ad*EJ+9iUEO(Mga~1CEB8~b0~oh}y~|*(HKKPgaa5iQ;E_J zte>!Ii!cV4#Eg`*ej0BSZMn3!N*aJ2SKpd6MlkK!@Jg2X4`tCMubQF!CHdcie`FpVdUZAbjr(Ix#$~5F(Na3&1l~n(9^-#h9~+EhkRGW>npjw z6fEOI!hXoq0YR;_A_1i$3-g*hE-Ql|wQit|ypBO3kqHXiRKuK9%+|uNv8iU1$r|Lz zye~F`-N39Wei*OI9WhcVmO1Z~Nbi5(&PK3C0cXWgjeYOiWo(jDH&^bx&dSXwV>DT( zz2G*CqSx-Gx3j<_75F{0hN5e>P_Q=?+*T3uQSa2whOEiV-siO1sBS(#BeGqZK8$9A z0G3HqDx$u>>W{eRWG?&{q?*8?R9%|C$QT$0ia1M>(*%tbWLV(pXjwGh!j;$_2Ul+4 zM=4kT6o?^3;_scvs7LWAt2B|dxs<54p`Q}X&v4;jj8xKq%y4jm2OFsR?b(;Sd2j5I9VIEF^S(^{pX@;lBIJTA^R_- zOoFIy;G$$|r`qPp)8UvD%oD1H+t5Ui*X+lU9fp!pz}&2&6vS<%4hgV1`e(9ch#HQ` ze&IYruwfMA#wn7Y`jalHI0Y(PNg9VbW2JVF$pDQoIK=`F%wuk+1zA#@nm|*$1kXA) z4C~xgwEH79vmAH^E+U4Sd~*h6E5vqUz!t#3QLmBOWN!(lWUGL!iW0t#bwgUUh;lPE zre#zHMs|2D+cQbBbcxCaqG_2Tc%4M*oWwnZQ+f%hL1EwmZXbRAoF&`I?A8GGrQX-< zk-;P4K~9PsS2iZkvuOfrc8Wf|GP*KRB{nZW4UMXaJiqUCpj)#@nRoC)Nf{%uUyyW5IN^V}`l>LZ#W;M0 zrQ%K}6bkv%v`>%_@@~9cpfPno)=MFr6Wx?`;Xf0wE2(#5l^8L7p%Uq^o?qJf~Y&p znwxFg1ZO!88H5yjxDkqq0iQQoEoUS;lysbSKRpftbrHb;zM0W{w2%ldNg2D++#bI! zQ-=;&SGqAcpNYSts1-&egSHmR`_`^Yf3?WHh(;%s*%x8_0%z z>@+R_Nm3{~YaK_Mz^bwQn3g77&0mP4qtHwJ#$o=*0s)71#sI~Cm*WeCO+%NaGZgM$ z<0?I*H!V^qo|xkrNdfwj$^%D0v;!^8K?TL-B#7fC)s*IL5YupY{`#QCaN?65@Nkp)B1!2b`+qzAOM-S|6il^U~ToUeo2<%A^E+Q(# z@!ZX%cN6infNqF%PL2kGbYmM4?~^)Z3+E=4CbiMsKvPaN<#i)!!9h(5(`fm9CnR0OoaMuHmENZeOWL)gCg#<~0CPjL|)k_*TAy%1nJm*pAF7 zICcPy3k2_>ODY8W02WNvl^PlyOP33h4+<$u8AGAJRvA<$sCllR$thsoA2x~)@kqoC zjy2^Jo%J1SQa18V-vS%(5Ow-}eu|ln(Y7Gh(jlA)&Qy*jm!FVK9ogj~8qT~a^|Ox= zC4O-HJJytm>Fe(dC4v*fs%y~FsqC2(3yM=mur>L_ns>^I!I$5{T0IGUFG3lXNt_%E zY)0NkFUmwh>wmX$)|jDTk{6^!ML9ccuogFgJu^IdcQOW|Pw+Ihbn+qnmMwGgFWX0k zhbLy5ho@uzNx8dFVW6-Ww~`y7H%T$cTOf3KLo-P{^(k-OR_S4~^%k;NpsTys`dnf5 z{lfWpqSNgQRveS)(BwZ@^B*Y^I&eVcoe~%%<|KZ?!$}Rb50n#)QEg@Zz1jB_!x%Ct z6LWsv)G3XhJwz-3>9R7lKvRJ%)M~Gt|E^l2Es&7fzJuN9c(`&k$N6}n*WHRv?Ff#u zKxzNF+6NM*rwDDyj0OJmU`T*78w>q&srXVwnBWCA7y~ApQ8m2VML5rfIGk6wQ8;(C zYD{Tl%wh@n#%1ctTIe+m>aUO9;a)y`(eE*e>=I^ z=~r27^pF0*^KjhP*et;@1-NcilsVU}?N0}5Y2;2?ZtLK5^1@6aKB zS4XIsN4B!sTo^jQHjk?H~A&|sW$|2b+^?76@GjX{f&3WkK9X%;T zXS0rYrrfHyP_B%AY4;ufIEz0WgJ_(JaOGk(nh~vTU+%kTaA?qm!ujd^9_&B%l$T&uRC}zZPx=Nq$-|vQgmHsr`>Qs zON9FO@)3+}Oe0z%_=y6ln!j8uN_Qf)zm=$sRmD@d?Lk?IE%x$>*den{WXSUS3KUI2+kazcz z-hOuD+EI|TxS;8hVdj)jvK-CvL85RBg}D74;{-pG@-oo4!)HgN&Cnsak_L zCzj9RpWc6%c%2kBIbQ!Vi*|Xs2h!FPim9g*^4N}=EOaGlCQgLCevC9aM7D5-^{|@T zM;L-qVJBs@n~hZm7m^iqc47{J-2~I_@C{F33a~pOZlq3owA-34(bO1f$m9Qq`Fq6z4HZyrLCp*%|OE?~L zi_I6$pe1SXrjR!!jGz70vCfg2KI9xkl^2&w^_}3cPi+ITBm| ze5JbPpp0lVW3sg}$J_8x&KcOvMpuEC_JstP-QxZ`J_~>*M+tLzzrlKHX4cd+qSdd} z%qU9rZg@Dmn(2>x5E#DrEF)eu86vU)g1wc&X2mkjcTpT(PG92KKhoVoy$Ug?a#HMf z&B3T?Y4(P*m_yL_F`WhTR=uvqPW7&W)T}ZOs zoo+X0et+B@w$4F68*U@5R12+`n?VkS_vBIF9u4OFjstcLyr zF|P_g$bw>|^2lK#ZD@7Hc-<}Gjv;1loEvR|;xgYX`ufbvyyS*Qwg0K12H96v@l|f9P-kMY?`$!k9Vzrrl7&QXKI10`tePRtD;s~EQ7@H*hm8VyAx1tU_;lY#>L zx~$xCAFpj?OswV?cf^~n&uc#gO9=f=R0EvB(u_l<(m)?dw5a?035hczTBOgHk`YD$ z8~f_Pfrd|tOzV*gz{x?GU{Ma+P4FjvFvE?1R5^DugWFwX+>hLVJ7XyKeZ3}I;J~T@NsYa&EwIHAA)cxK^G{p`oH#e_fh1_i0 z-}kEpoNqb3{-)kX$!4YJ;zrKaa?n_^vy8^ik=b-rnF>>ZeJ49y5z&oiL zM)(n(*X6$IMzp#hQ9D3svXF>UM2C_PJ)EzQqQhgiO-+210g#zOe2t9O%cplX&^*0> z0kS!@`~{yp$!Kp~+kQ?0(Db zBRt&pho~;qNT3N6tm;^1gel%K+HPK1bu=OphVY-*#*~H!_ZoikR((_>t%_+QnU2r- zG`A>`u#Xf%)e(KSY)kG z;PIK(U?Ey1sx&bH8Zz*=B?g5~*C{(4`FDlj7P$rDHJR|O)l;Nhmenhpl^j~i-W4R5 z&+cw9DhJ~bia!6afg5Hka-v=yRi;_q^w_mIlOoH>)ll`$G{!(g>LNNgdJ^J&}!fB3PiSB z;nlV}KK{hnY5f3;s@QD%I#%(o_~!a*oQFFa#dRMV!D5|^vW&i&5PoIgX6vc}>ES=w zj%Ss%6G6xm;X7(qPsi$~<&`R@tT$h+d6A7Y+M0#l%)QjN?5S-V37+GSmlT$*u(W$GJaH!kEl*QQ z#S1thhZBZ+h(-2A?Qt3KN@#5eJR;8I)dT*4Xw-Z#+ZbgJSM+?nL)v-YO@uyQ^!a_R z>b9eBwA8M&$Xs1$U0yFNL)f+7@a5s1`d#uN@ZH`mf?EB0KNVPpH{wF+C>V7uuUE))@xA?DGf^BI1x0u}OA-BMaNpOPeNE+f4QEdNKKcL~0tgBmNe|sd=(UORK zUfbT%XLA!{Dc!JQ-`dAhJA^M)ki9&M-EO#j?8RCFfUVncKzyZU6>eJ_97AFm?!GSG zvHEa2xdrFpbyJ$!zvbXyI78Pq)y2HkvRb{qvHkopx!Uw0;ua~E^}CI|&sV=U=w*fO z@QFQi>nw0rkxVyzvFpuqP)nLtNHa>k$M`!2|8bVZ!?DoTOTM=F8>Ozywso zOc)>HvIvbLXn!xI+F#8zT-5q`!rpgj6fv#rT4>^}LXU&H^dGki(S@+Ug#!LUzm1u7)=0AoI4+9G|z=JBb-VC(MI z|1Ajzq}@gG!vW*R@{w6)+oOBMBM5W94h&crg_9-||3(Y}8Us%v1Zn{Z10sR@I%L5E zp%4S2M<6yT5awv1fiPD1!wfPxz&8}Oa4RIWZ#X-Mj~$9Vt?AV zPD7DQZR`GZ&gW#q8RoTlF50h=@uW1%nxgjFMp&) zwU|_ySkQ2|$uV@Fa-K=6z$}Gq;(=5pm{1^IJgP;Jg(O)8we-5!aRBz+)44O03Q(7> zmNFVQQbYJXI?C9xQq|WTSsiSH|Jmq_dkFnI z4rCqTQ1d5lq6y9p{flD?f>PK+B1u6p8FBQLVraZD{CFAuc7!(}jkPQuRz6 zU$y37UP-)7v@Drg*Fl1Amvjb#<##$zKLylZetFnHOC#FH?P4=djnymzc&bYrA zqTUEHdE}y_8K3lE(1D!cPANDqEMLAa;t?Z^!KKb=1b#2vb-@=nPr;eZ|tx5H&V}mC4|{kYY|lb!zB56&+T`5RJJjZ90IKgR@MXfj zj$-fr#(xjH-W}z1%63_KoiZ1}7dDI*@8F9+fv_6BHjjP&YFzE-1tJaX$JA++(?3fc z%^+XD?@ev4TowzH#cVU=KP|V-6 zgR$I*_C&LixubbDUKKt^>}iLd@_8sHATRWS;uE^-lej5p#Tv)Z#-SVl*E(5N)$yu8 zCmeM7qxw?-ltG&yHWBy=qu4>`W1F zQ}Jd%#LO1=YK?5I?q7H!$t^V^UdfC4%q`ZYXHGjIPD>~fXVIL2U5qQ+AdxwCCmxBL z?%ru9F8i$rh~^m~b5^PFlrdAVn-i6s2cI1H-Wgdv(27|MW&5u1RKhmss^skXJ_^l&KhkSV_0nwoSqRq8%lt@#3Mq~T5Ss0N3LX!$O+Bj zMl(#xbhQg}^ecoJ9P>f-*&nBi#HN--Xo!Rd7(G6|FPZ zo*-LY%!MH|YW}xI6%1vy?!E8Xx)T!8kUciZr$0kGXzqQgp^bQjmRF$X7r0i%i)X)b z9VYH3f|W#qj?7jhpJt5Sl==l#(Q{3Y|CI|I$Sm?3%k?J`z6-AJcR(j--#35GpPMjm zI2Ycm2VW?S0*5cm-?cW@)-d6eJz>Mtl>m5DrZw!qtvdvKM}lzKIcwb>8n1H!M+2`P!QH zdwC~`?QK?{awh2g5}mV~UUNIkI-NB=*c2j};Th^l^JzaM7-rLc^IAhXv8BS6kg=6| zM(+qy(sC>HyqvADJ_-Tf21yyY2H3mTz*xHP-`2jp<*eGSIc{C^FJ4!PWsX_`jxzx= zS>%;ZE9-#YB@0aiih8AdA*+VF>~57(Cd&j0imzmo26s;%GO0Y6-IIyXE_$gNlR7gn zP%aQrlEMPGTYaI{wj zKyuc~sj6|yoo&v4Ri56*vmD+m2>BaObNU}_*mW)m8RZtR&d$Y`#V81PQ{PmIRgR3n zC|6aL$h5dU6~as?IxLkeXU0pN6l(b$6#jBnpiOIkxlJlflWsn18X|etm+PbIa6{Cn zYIQ^Wl2fhA;roi9W#q8dq|3itLL%CY_oL#GXZWjV8&8RTKM>g}nN}xX#dD;_ zY_+wyGD~FVo3KykI)swY<@)2Lxt@^F&Z+g=dV2F|<5p{7!ePK2D32Ne4!g3SNjIhK zPRnY?D$=Iynrxd*sKSQ)Z1f0-ET{ z-_FkXPgf>IpV?c;N}wPWO4e0WZ(yRA)CIkG;J1ld7Je_|2umiZUewxBZ#+fV2T{2H zJ3+x8_Uu?0z*uTzj94<3PkX+!)b7=_p&utg|>xc>_2kkLJ`^9mXC#vnWV<;-&HEX=?<-hdp zO7_h;&L>7P2a!ntIsH8QDi?Fp<%7B;Cm*hwkL(6(g-9{OG=%`VXPCX{}E6;xPIrh0X@| zy1}{(Z%0u35EH5e!^V=_Z&C(TTW3P+m$h-$GI1g58ok6&#(HyRFQLpCqWuGz>JcH! zs_6WyqjGMuwX)S&(;{BVKtV#~6EJ?UgzbVO6)>TrvTu&Mueae7N5tUq2tjYA1 zH%Uo9I+TIj?ZRvBldRt3g3=>~^7i_D?&hK)wTu%pT%|~b9oJL6*Cf)7T3SpRD0gq! zpgy7B8r0J|PC;^N$D;Cv5vJSNvDIo8>swgS$@F?rI#U_C!tXJwexYuK_+Wfu8#ZX` zw(!D!$uvJgS>=0^=d%q7Vr9n+mRk#if6D+tGDSp}JNk`f@ZfO}yy>eM(*fWHAh%EF zOrF@AwWyCd_X^AXYSGFx`gZwZm|AeF?Pi*rd(1AeFtfAyEX4k3$q=HX2oV`lUJ~HN-Jiql!_=Wo)OP%tK8^#K$ z$*_2pRjr>dNyVZY@f{T5TZ(DPqG7D4`;Uf6B2fi!Y$0~RvDA*ntC*G4tb|UikYgQH z!KbSnSfy}Rnbmp?k9=N(^PQeAZx%kPn)-3yf;5?pdt& zcDQ@w)+}k4vEZ~MFP#t6Mcly6`WpC2dF@|k+*OTHkZw=MaB!+ftR4YYwE;=^CO#^| zGXpJUPo_PZmUfwaPB-XzaV;F0*IEllYlqLJGLGfnG%yrl^Los zk*|MUN5_J40-c-F5y7fC9<%uimKIkTFA`tDUBVW3e^&yRKEX*Zaet{O5Lfaj z5Yd%;M88oL$1JH4(9WrRk&`l3j0mT-F{h$+y9C^#X)d`{JmRE87fRydZboOi?7R3c`Ig9*Bx+PvTd7&X zLBRV=93^I`Z>-PK)CzXZ7|(SiD@#NAxd-o_fV#uO#maJ?%g6`Ccs>MAy;5Q3=%VM* zaYFBKuH6d2nKtt}k8UsS1Yh-v5%?K+%GvbI;%$bt72Zx^KDY6{FQDgb?7Y={w>bV? z>}fjdwBq4OOTv;cB}BT|Dt}Iwdc%5xP&8ugL=(T_1SC*omp!>RmW<_CANl4N4rNo1 zS`U#3d<0C?K#t;0u4_(k$0kibq{!sVZuIyT_0_iNJXXzw?A_;~ss!afVvKsvX_zK_ zm&4w9_gh1a{)oW%`taE#>qSmD0>Q{8~sy1Vbfar${+J6U9U(rZKp}#$ki-=TO*L zSs(a3A>EDOlJ5=ZE780M-J3w~1-#vlL+Wvcsf^KdW&T*Y=NGaSjL-Fg=8v?aK5m}F zipRL{2@7Cp>Fi;k>bNB!YVpLm=2(@;;S3;VN^4w3Ckp-A(JV?trX>9Gv$Rn#QjWwf zQ4rfHq94mIRIbuglJ5(_t_)AOShlh}M|8i6+N5HtsK;Mc;O$guMm+{19eXCB()UbA zJrfwN$7H%1>Y#Oolq2$1FIZg0$Hs%Uqq27u3vCVFfaNW5Q03wRb>C2u@_UE*h$ni> z*!u8w9aZ6Zj@#+=sVKW8xJAcXmcWb%9E-3XRbCk_a3ZA&zQ$hg@iF_2JJo=FUV_5d zaX>dIu1}|EzEZ1N)iQx=%Zh_`-j!@CSHe-DtOU6h2+}$vIvGe+wYn!iHBKTqoB`@; zt)-*PrbE0Q^)cq6Epw3@OsjFK9b5TZq5Nt)O98;R296p(2^Hfcy8-Vq^PwPA#UjtirS;wXzs|`(i>c^cBU$xMZ%`kwDuP8>({BRvbY!Z&#kYl*!>exIkF|2 z1F=+#>DK+F}Z1E#X`CiN?lj?pndy%4kIxp@0SPNVc)hRa!XXCu{h#C+cix*@I2dy zNgwHmK7+WrDSiw~uY;m)@{}r8dGb}v6IQYAXq6l2!`F_Bg^Ev*VQY$q^h#xKGWg)E zYbNxrW>jlC81>qco4DKIr0n>%>cv`Z>*EkhOeflYwa1;)N3oYsbQtJ@We7)@NO7HXGa z@a3EmYq6V^P>)?}Fdlx)K+#V5<%ZbAr0DO00l|j8eTm%~Y9ha>t8t$F^HF& zQuxr)%otS7oDECL##D+{%hN1RGNl6`MpiZ!K(zZV2w6I{fbGr}r!rlVozT3({LwR0 zQv$nhSwwxWV26zqN$c+%{cjzDwXZBdPOYNd{JNb$lVQodM?`7<)Uxh&g?x{!&o|^! z|68+Qg>tb7Ro0r8Rbgv+v!iI8mek+!L94t$SO1yk@GJdy%VG~W=bf0PXh?&rEZmL@ zN^b|i+gyGEHBVR3xQtx4$qHv=$#EqLQ{jxS%7;sWEQiK+!mgK7OlA5VwmIU2_8e(ENOzqBWS?TsvbyBGU>R2 zg&hKqw{PMyvS$?WKTN07!KehowtYlQ;-hQWg{sOKyf-X4K901dr*lZKg>tAC>-=pv z9+*eh)Mlo2%%)=MZXf`vXB_b-3&$gt7{rmsnd6`q2=)sO0ooYJ$(b7_(L)&^h2zoe z;-WRFH3?h^Z!PDfzzY@;-DjTRFuB9I_I-x*ITcpn?&!MxT@Ej$dskyvIrF&|M%i>? z4nNqpHDTh3!x^&R#-w6@M)IAr^XWrbMds8B?_cet;uB%)2U%|JQ(t$2C4?1k`KQZO z7;eS&{M*C#7XIJN0s^*Z)6=kyCHD1K`=o+1{l$yvtV}-h4BL*XqgvI<<()VFta6*` ztNB*34fHFqb-fMczOw^-aQrss?hcMy0$DCry`(bkPxMo+jwK5XF&94(%`0!sd|D5+ z__^BJjHtPWKA4=V>oebK^38`UnkO7D)E>L%t+|&)ny1wlx|eUqT_#YoMrL+a_nTcd z2m*YnsRHV-US4h1k9~0;1RuM}h10)(w;jX~JVvcXv_`r{#bydB?zRqIV!t@T)!W>4lO`&R?MaXwUT-8|m>!b(ZMX)Q_ti)_+6j6Tk9UW;{d z-@#>iGJSlXCpJ^8r11_LHXFR4kCQexN0f3N6H2-FkKfcbd0?JUr*d4P{=F_4p=B~@ zTRlm@I6$18Qr%VPrwQEuJ2koN{|uo|gC;@KcAWpccX82XAY6SN{~FI-${l5!!wvpQ z|G#tp``DrwX?HW2%A)PZ8f$j3OK~va&h%V7o=~p{A*xTF9Mc$`XS`fgyv!qB9){4H zn71a#8Q-l1CFk#zTMO(;G=if=$013+!7}tmKGQeF!m9|Ebzg=J3XEu z<>Yw0ke%JZOm0T||G(C({Qdj#kD2`B9VzNu0Z=J49gicVfF>%D%uo5s7q%e30$V|% zNwk5KEKG2E}t81;u2qy_PhD~4s|JW{b~K1rZz{s>qzMgVK+ zJe5R)Ihv+!h-;ce9E12Ys;v5Jo@n=|m2x@mc}OnWu!{ucp88iMdH5Xy~^otWP{79BN9T$!cfW1<=T{M1TkGJ8fUQ7uqE4>ixyx>*8; z6FchBD+}YO_E1v>3|>|MiVX+}kI_d|*A9~k=Qh|S5q?8__IIH?!1N|5OG|&@{x!AotGXIqrGU(cqNZ_EaKmV?CXXK2+cv{CCk$ z8cy}F=+-Zjf*U3~Sb^iN8|I5W3L-*<1j@`JpS1oHCm&tV7sX>$D>kpK4M)5VCGHN%E8l{VOdciaqf#O@c)xK?3{t;oFnR+giAPR5i7*tiitANzxij9J3@hK-4?( z;ls%!Zgx*J%duRqVJ2{PhjVmLk7`5vdsoyum7r-+*lEwj=tLB3Ey0mk?}~%fKfzwT z9Xl9_Iw@mqj0QXIfFw4UHaxkhXO6RKe_tSQ$FaQqk?{_bmUlX_0WdL&QH!t5BwF|# zVv`)T@1V=HwgQeAaXiJ0A>JKz?>M5MBeQQ3Jox9)) z@Ly;<5}|`<$P{Ct@Vj~yA;lm{Ciz`Bm+D|!hn>)6^==OvE})SKEFde6kyB^i{11kW zxskGYkc)BkKS_#%M-p{-Hlv8UBJq_@I@SSbRgXOd1S?y{1CEMp4wy2#85kmOJ?*8~ z2hSJeDGA?4)cXWHSPi08V+KPzSPo*E z(I>b)(t$YTNo<|t5fs@lmhKUyAt^)bUtoQ@c2a4y%bUo#LK$2O)oo|hB&y+fnBRgt zFh%{09s7qQsN;M3sn!m88XeluECU=yVsAuu=}{j|U;*^|Ej3a5gyswaL^J=)wj3Bm zp^BuhS+eM5v*}8!`KUzNTH&DMe6f6`YXLIw#ufZL zJO#t?-$cLy1Qi=&O{j+#3a~fgJNn44Lz0@v8%6TziZZtZMGFbZ+u>p#w6g}*=)gF;L)#`0(i==FP*BZv2j03?hMX{EQjY z*kl=^=Oc5>mKEa25@^q@GFT}3vxapTIQNC**NnUVi|oqa%i$Z8geP~;$^WD|YYeI_ zdgBs2R#XBZ%{J(hWGRd2(+zbBuk8SA5D4$2{t*?ye%ALFwHo528J8c}1=Ir@OtQ$b zj4{1%`}jm1=5x{?4qHE@SlJ|GLy(zEV)3%@$2X4*gXSWVG?8J8%C!7`#bL(Nphv6^ zf~hfD@m4&#{_K^NNn1#c+?wINi{rK)VaNYr?X6-f38E}PGeh~A*<~tYnVH#TKQl8k zGnW~jnVFfHne8$&Lz$VGx4L(xXM3g5?8i!1siTY=p@@^29~p{sE;{*$MM27bF{t`l zfw*Rzq_3`SnQ##B_N&S^z@5hEJLI4z*Cq7X{%h*!PS6?Z8G8zLU-@dpGu(2xy*GZ% ziPJ$q(Uy#Hz)Skry?0)6o!w_swQ$373LE+7-;S`2O-_L{V!FJ*r@DtGm&tQ=)=Xd_ zz{#SSBTie2T;#-@^wO-uh>0C1OHZ<7MV}n=7g5;6>!L_pnz30_O5RRBOxWLv*w%t zIkB}>W%7P;EHl!EhByuO;iUS8IAu;;o&IY{;)Xb9Dm>{IFOj-qAanQ|TwMgb`L|d2 zA*C59X6})xV61{V6<3OMU45l-mJ{_L8Oq#kb8n*5fbx@3(oEbOXmIkqIODNtl#;}LP>3qY~CLVt{oM4%r# zW6O*uU9!3XwqUEZvja7TY{M*P#&A8%)L)EVoX~E7(>c&Nn{~n^F`584@Mrb|O<;V0 zPP#54@0kW)7beNk+vsLUX!OrF{a@lr>iKd1>}@)OI{dMY^2jl}@XAZj!H&T~Fbsvj zBeeBa-1`yp$QiMIy|Tb8Qr`c0BsXkW7h+Yvm-&3v?C!)%sX_PU#!Zi+3yFVY!ult8 zb(soWNU?X|1SbuXAfx^|c5LNMEC-XR5Bwua+7&Cy(6qQvSy}mv9enpL-$mKgo|q~Z zl8mKl)qm0^%A2)YF`PV*he6%@P@h$loRVy)z)0jhF?|W73tUkB_eWX4%C4>*8H@(= zP)x?}%AT$XL3Wtfo*3Cb%cuEU+n2f|hf6v?_ z)D4hi#P4Ht$O@LUw&)W5&hG!=xL7BgKd6S4&oavzt#E3g@A1>052j%vVr^t9NU_(7 zG#i8!02uSo3LE^Oo&A_C8ntHKmm@#2vag1*yxiN9f-X%-g}#B@n0SHQd4X8@+P8|_ z#oHb*>}Cc}tu^n>G5od>*18<}PuJkmr&yIeIQ9!o0%C(C04@`{7&$)eq0Z?SocD@Y zFYXaIOES|a0xLpE0|*z+-GMIg8~jp0mJT<2 zw3c>ga@KCa!xIghL<2dgqbH{wAHd4NA-e6w-DzM0G1N$*R;k)8u(w~!#m9HT(iz67(gBCo94U8AF&w#rQ;~@VOTH}C#sC_>(B!$($ z(BylaJ6hxla&m%$KBX{Ts*E53MW;3{d?!&wlF}D)M6BFKFiY9x8%oKLhVFr#~v{0oE&&WPOu` zmz%e1egp+cE@qD%Hh0$6wVsEQZ==Jek!Mua7Ex9f_#pD+GjslY{Ve#+^Mv?}I48uw zjbLo$^CH%uB&1zJ;+NXyy5AegPK}$PqnW+Cy?HueI?lyeXn*$azm*+kjX7rsf)CNI zs4*`q-IsNjeZL)-pc(<>i|&`MNDm35$2It$53;Cokw!RO=zH@*qpx5l_S{aV(K}_o ziPs4Uvil)$;baBx)HCgep)8=L@UM_Qo0nWFmEdO_WUU{YFeOnUm-PXWwhtIl-IaEU@DJOXB5$SIaMEn4W+9rhua68Wy zEvZ#F_=vleJv3=*>yfuFymAwkeT_(0)hzG5?zS*AbHUHZgF{rXbkn4-^LU?3G_Z|xB*4H2GohE1@ zM}hS(B6T}1K1HuEwgVCwQY084r!d2Okg{V)8DhpX-R9oav6O>v0L&nXi z4Y3$TyLq8QLQmp5EAHV==^EyqJUc`FT!EqYxKDmby#!DbYG8+)`rTNJ+YqTeV5vP2sWIS(KfvzX!0u@MUg&$@+4VpDJfoArP0934 z!JRPmZJ{T0{5$}Rdf=(pV0X;=-QbMA07hRl#%kdV13T0MKSZ6SqmZB;gGoIDyMxo; zLPsuLj9(axJ=5>$d1-FAe0TUECj9!AsRGOwejeW# z<*G(1-Jvdu zAo{(C_j>c_e**M>gE0!gr}iMG`og7dgHKo~Bi*Ow>MStpNE7D1fjfO;yn>v7@AanF z|K!yFq|@()Wh923n1(!51G|$0zq9+2W6~q~ru6jXdv&gbs3E>K3edc4G^e7bt|vFq z`(ZOjV=z}rZH#!6JF3|HO&GPFJuNY{1i*};Ihr0qXRvUU>19^DbMxYzeMOwJeUw>t z`IhN4?a?#s(Y1BuWO^u`4Q?$>!tw`XY~;wDCh=RENY<7z29kXmf}H_^y#|ck4vhT@ zik%pYJ?C}Rw2PHKBg%hrz<+Yyf3mLkkgfMHtM|}b--)8Ojc8>fI#R+5GUKJ!ltJH# zvDSmD)`PJ2g|YU9yS5FmvH@nTno9{*fkp1K5W0Y!C58u@qL6`MX8>a#fyhwuoAmOZ zZ0kLY=sncxHRY;pgI{^aO^T&9M{DEI6mAxi{!?8V$&0Oy1!E1fLJ4V|;0B%{2cCiG zH)+y)DA9Y!(Q8Waf+!ZcA$}tEDRqLn!HPP}0n-&IbmW-z2K@sHmc?AqHsMdN^wMxH zDU#;B47?;q0j_gUpLs%(UtzgLf@H7sZ30PO2B=z^{D6XjR2z(=ai9YSBS%-?0q>C2vUqB~kgT^qV6~z5%if z2o2s2Ml%u&!@%D)`+GK2o#*w0~<3lCPe*{53`X9at|K@J+R%ycaGvSx6Yic+pwX z94Tn{RT~mL594=>C2wplQMn=`BrCIU!2%iwpnOTp$i-O-HcQw%Xvb}gCkY0de|FX$ zgA#|7lT%#<582bq98Vttd@Bb++mC`Y4+()EPCiFeSW-|63)et?0;;-pK}A0#!q6T% zzCsj8S%74zs)|)d`F!nYC{uepZ~rS%R0bv`0$#ZlT$oj@%h~%g5*JtMX9_~eq{{B; zsT2hnFnn-AMZ2V%nT%xkC^R$_Qk%)V6iYvkgf3(a6EUyXZwM+;!KOD~(=T}PFJBXL z8XUHuR}oSu7D5W5oDCA?nEn@GEmhzuygG?FScRhWQZe3c4w&i?mOf6-^j{JrS$Nd| zF?eAiBFa9&B?!8N5XKXErVU>D!Cg!O6bUF=QC2XScKPB&Nl~CBY(hWwJ4%Cq3*{Sb zBao&)s6jASRiz|^9x<=3C*pfeSR|^%eLfy8`F9bewPNAQUA61oDWP0(25Sbg`(`s#>-)?wtBVc)|YG=dEYhGz_Ca4!Xep!|YbbN!ig z6UKJH2&|yKhbBm|&iAH9){X{n&(J0X)Ka;C-6K3;s*V_w0*leYs6>Q99?40?c1f8M zLYN&^b_Iakv6or{8c|CQ4G)o+{&OpfRgRs5a=)B5)*sg#f@ zA)I-!HMx;#l}f1urSQqc4T_Cq8;}?n=|*B>-KFK!k*^#sJ=Ld}8j!_CvwM80jMIyg-~la& zRcB5Wkq2&$pA|j_>UCzpt5Mw3q0FC`=Z2(92mDj&U>Yc}g<<<8JGVF!Qa%wpvNU8M^_Z06u!LS#kFtPbgWkWxgD-vF{xe^8bSnYg>dOIJ{1Pmr7w1Hk{H z;N?blb7IN^YC}c9i(;wWAr|()+!c4Avjw4p5e~soP3);vtYgtGCB$HXzZTHEW1Xcq z$?QQDV({!@GVtswGVt#R6-IU6up$Ce{gCz=dN|RHz1fbbBFdnSg9R?6sF*X+@$^+h z0$3va>($2|6~m?!vI@hjezEM=6PsDx2*doKuerWqP1?|GIs9n)oxrJ1) z`>#Kweo^rNZL_?3^*PGjLYiPYn0`ZNXL}XUkf?gkx6oV^Y1Gbe^SMO71$~WL>(UL4 zW4e7q?MT4_K&>#f;k*Jn`kGQij4tA;2=;EAeAx1=pk~N2Jy~o8)IIo>gh~aHN|c2A z*EC^G88!?>!Bm=DXiEeO2gwwOaEJIZN%CIj@A)^hm{Imbbq++}(e*f_{gUSR+U`h^ ze(1l-%4PC|XqsBAL=_s*Z4VS4J)p@^3IJE94?!*ZVf zjac78p@vv%ZfUR(9Im<11H3QAN#?i8BAFtTeN*$(Is;FWAaze_Z$XLWc?;<>ABFWa zJj=E2;{Hvj_g(of&vg&;=UC||)j_i3jV||#TJew|JEDox-<1bV^NN(eMk1rGj`I0w z{(z$TLQ$HbNk6(ubUY!vdR#cIh!AadL?C77tR51JL%82ocwp^AFCw!-Iz$={9pXqA zV@`|%h_IL$Q`bTb*%ZFxU%77;7WC z-8GFE|Fo9xg?!QT$7Q?KBh+OK2+@k2g zU(unyd`cSDBymHQMIf}Y%3{fkvi9OAY3&(|@z6=36|=Lsz5Oo<*eIAOGj0r(QK+9l zSR$X?VP~3r5rRPGd@k#tfmt!u3b5vE!D^Uy5Mzkair<>3*9`#|_GgQWGRI6Uvcl zu8*tWj%IUzqa<_fbQ0%_rb?$IcPi~+w7TqDGpJS(R(1bq6CLM|7zRv5^T4Bd+%RFZzZO9r{zbOEsp zelb3?x)E2&FZpJ<=V@Uv%Lzh`QiEscSz%eO{fHK@&VAh9eyl}e+y5oPbLSw(*@qg$ zMf2O9nLrT@G7s^Zn+>~KEQ;M$riUf*m$AoI(9~UDQq|I>S^S>ItqgKCbd)dNs^QOt z8c>kOCDTaPz}5E9ePW6xiEB14=mLG zSdoV?#I|IBq&jbagg;opR~%BHfD}4JBBZoBD*4-T!A_G_tT;laN93 z^HVYXB<1sn_-6-qr!NLEyxrW$cK0UKL2=QeCpsn%b;MV z*70j*DYQS(^Kt3cKYJVwuZP1oM=T@DwWdE)(x%}DQ79FvGjnl7AgRV1>%%H{aur`~ z1#-8Lv)BjQ8FJ&aS%}>@CJIYX?5Nn0 zoc6i6uL;l1z~gEt41c|RVNNu z@SdJky%g~vQY8|(@aX(Z$WG)Z&bHt*?6^pZe0=0CW zzG1A(Zs%S#noJ*P8tnw{uvyhiJt{MXBoS3VaQ_Z%uKGA}W3Zj_`%V0F(yY1CC)Fjq zlg(9kjRY!H; zaC&PF?arR9G+n+L?><81qIVfx9w_dGDNY2fxKGep0h1-dJ5Jwb!I^e?yal+q=`fPl zN{JRV3=1^GTf?78A(S-(DOZs2AipI@6%|mKK(M3WS0pnjhTrwPL$LD;%1`v1aAC3d zy*`%MGbXo7Gw)#w$A6b{wOelBl=hvI>=xKv>z>>3u-4F1`da1BkBlIrOw3v{QcK0` zF@JclGi|#%L988(ul3Jw63j_5VQ<@;#h%yA-}%PdWT>>? zGM$qGOw8uq*6JA^r5<8>R8$fgvH(NDBW$h1>W`{>_o8bY=}MWc*|Orl#8RKIfn55! z>0|zOu^5Q76tIkV_M-G%sX>{S)*7yF?{^mOV^lbVEJUS_xxKlcuXSwN`rJye0#ja{ z!;G{+bSj_eNP|o5KnOU4$@qX64^sFS&(li|!Q|)pHH)0puq{3vLc^tsZ&TjQaP^-< z{vYGSPF-&&T^$KdX8nKECo0GBUq7gM+P!S9_$=4UBDq%lBqUeHpDXN^=O4O{6`3*4 zOp04BUaL0Wc8tQ}ikLr#xc8PBI#Err)801M?k5WZG`JXQZttna{A(oozu-Ld70yoF zxQlMvf=eEH(Ww)PUmdgK=zAEXqz6cso2LdJe@mCjPW!I@;LEET%T03VW9Wa9i)s8Y zigPdu=s+UC@Mis3)zO@5h163!a>kvHO6&A>xl=aaXq7ejc+*;jeAyi(u@WtZQ z#I1LXJge5a<;4+NXXuJyjJl3)=weiVc?Rty{y4f~&R*|tYyPG(jNcN;VJM08c6fG- zMrfrDBUjV#&Ou9raqqp?#dH%g5bFVpxUH@6hX~VmnxS}_=X}Y;U?y|bTuzl^vs_}6 znV(A!DLc;2XK@!{ud9J?((6t;)UMug~ahGUvflb3E=x$Kw_rkqeuJK3&y# zhlvjYOF{&UESIn8Y}mu<`1@Dn1UsjqyLV*1)j|w%^N!hij%;_Dr7o7YOU=z%wSOU+ zss~F82JhM3`^JeDxGzG9{8gLATjt8|*IGsn0jnd$fzb6OJh}@jBdG5Ro=rY&IL8lO5JBR6XoZNX9{g-KjUE#w5k%0*e ztgoN^40KRHjV909q*V)1x-I8dG9nQ=yH!C5vY~Ll?+}HSJ|vuBy5%w~OxjCu$lqye zh!P~?l_NBKEuxqsbE^pChJ$}tD=Lhl>h-IxPKE8qSH$5L({JVKE)Gk{{;g07+DpP% zcGqpygBCZ5Y3A*`?P83>)1xjLukZMOe{^*hGUnrXL@#t}Vi?BwT+ZIf-Cv{34o8I2 zWw3J(`LG`i+E_gJoQC7+FnquAVQDb@L;JF8kQRRX$x>B5X4;?$D7SGr8g?z}+?2TC z0f-}5WNt zv|bZf;mU#En_Y2+8wl&coO&TbV7N570t!Nty7(AYEQS2KdXl=b_;Rp~r=8#ip9L#o|u3R;rmUEj|(Z|u5Ul6{~8u4LkF5$QjEZBTzB2R6? zuO+~*T2=@p|1xAewJzqp4BD1J|4Q2G5;YPlS=D-GuAqGig(h5A5Vc)Vb!BR?kUN4J(=gw<6>v2-)^4#gFHd;2bECu&*P7+JZoLGnOd*K$oVH%j+<^9;s%d{ zIGC$e)t5~%S3d9j?U?q=KJUfv>r5`}1@;+N3gS0!DOWt&#NL~H&Q~$g7FOlO?a!I_ ztTrdp)GHj`bQHN_sSf%-HA2a2*v4(rT`zx0$LOB~mi?hjhz~Y-E5Rgk*>FTw;I{c1Fp0S^1P{g63Px`v0dlye6@fB|~VrO<)y$bOC{k+IV4P8%5t8gyd zc~jTcRWnBU_zvJ2zU)4m7i+2fft}f*{=I0!#dGUfO5j0es^~{()UIH?bPTT0#93z*(kA(L3QU!dMB%!!P!OF(vDNT zm-l_A@(3y~8tyR(Z#-tMnalD+O!M#$=d3rUT@){5&papkas8L33o^}a4wSSaJ8p;c zA%9FJ7oAYO>+~OXwyxXlrv~q<&xu>8I#Y#HK5f6}EC*0m*;#UmxHPirGaU8;q&qG) zy>G)<%M_U3NQqvE6PZfo~=N30Rzg29q- zR1FEsV5j>wC1BO?+IP?Agpi`8-f0&dt7%=gv3tr{R{DGL_+e-Qp5v0xwFR_!Ls2hd z&OR`wU#&l4oAS%Gf;dZe`R)(@RSb`u-pvHUbZL2oZb~_qJX@gO^C^c}{uJEvy8eQ+ zlL!YO*r;Fl{aPY+1Fa9uGIn?+ze8}2!JUEJx8q&aHG7lsyO0Yoy`xG>qf(Jn-OiaJANRIfH0VJxE; zx)zI(@xNN9L4W1ECP#7}NwZNRA?E;#P7y-sB^*_gk-peIBK(B}Q>7UIGjks`BK$dy zgsui@pWbGj0@v!w@V!Dz=*gC5XN!d44UqccZ<~GTCHj(nrV*6pkR>RLM;Fdaehzb& zwXvvdex-v`%0%W8oH}#8uY(ryZ}O$P_!`rE8j6>wCBzgge#1 zB#AjgHJev=FR(vO*AK|ADX4@6j?5X@zqQP}$gHkM`wUn*A%JOlaShC_{8|qR^+k(L zqv%CS2P&b-qn{<&N66OI-W%l^E#stoM){X;kFdk9mP%#xEkX_h<=&6o0$m|>QtHdn zve}-$9}Q%lToU+9uWhhVS%JL&Do3xQkMEe~;hLFM>*3%gIek|>l`0|>g4Jpzk6}&4 znMmH3dsptEn58OzlZweSnbv`YB}|-p(1|5wL%~V^cgkDAYCV)_wF7qP%Z0P+c5?%) zWq9?T&q~L9+``S=EIHk^`a~l(me& z1c896Z^}v|0M~gBc(@ZsG%iCRRgOZi(qkyLZD-_`dia~z=;vo+O%>yL|MPtahjeg= zogU9+_+Io?=@f@vYa{hlhT|T7^Rr8-QZ~S<7`XC&e=-;5S4DPto^{AqCePbt*IXN6 zlY>cbTggJ!L!3mIu9evJ)9H2BV#|n+ykLwuWzrNh67mtYuIJ1~YN(KQ1%S-Lc)J;^}%x>m+*iSv!ef-tT|9)F1(~#qE%VH&UN6@{g zjkD((Q?GJ$+iCg@=B!|EK8B9*v|QcMG3{Y4=<2{q zqUXevjjNk!m}dbwk-qS+VYsdX`TGVB`MLY>lnlX6uj}PwUuwiLR7g#YJdvn{*oGzZXH@U4wMlS3< zOOg1^7kE+xnB@g|4^RE&<1nr@!)8}kSKc=bUy=QahNS8@ipzuF(-7m6GP@5QL=onn z2R^J}NoaMI7@^v<873diKdGnEHwvSa}g1{=~DTy%g!(v zqw!nj>FZp7Rc4`FJqCH9?7uo$AwVF&{y;iaTvg?~wD(De=9$r+wRGn#f!-k|)M(zh zYhA%!+R=LqeO09|gd&`(`$hL~U|q58vU+e@JZZ3$2VYS=;ebMShZ6BPcHg}E*J^3R z`eSfdIB(G}^I`v`|A11~KlrSfV{r1a>S!Ysm@`$~I^mh>X8zA=WLh*sWc`eNm3X~f z(X;H^8M|{=N|F)V?HAa*r1%~(f{CrMle43Vfz5wHJ3~uk1ZGAS77|91|HQn!4B{5n z&L)lw;?@SvCZZ-rcE%=f5sdUcwk5~EJi!#ckoeK;JuR!fWa?OOHMFHZR8YbuF?2|` z6N(@P9`t>;ETG+1a_++5ZQ_ zOe9Qf9PAv-|DEM?A6ReYp|ww*qx0ev846?g4ufA*_;B>!!i|3ge$yn0$d~~r!hPcw zD#S$`B1yKoTImXC*N_ju>{`L}V)!f8R09 zGXLroN!*H`DyGUE4Yq14&pE{{kc3%4r^&j^=cwPUKJ4d3;4N7bqS>U@T^xUyxhFuO z&`I@UwMj2hH&)X5033ijaArwU;oE6zBe5SL*zNCPFS?b%h;ZPY*s(OJ)!yk~v}v0t z@FQJYt0%Yow%;uzIo_Q)uvG7*bL;?-C4U|^zZ>P|(SuEzR-m-f&_4CMD#%HVi$YjbQ-3CVMm_4hM|9%~dnePc_by1u!2 zra;^8i1a@Q>FE=Hohh(~>GVra` z?Cj@h``j_O^*MP*mbPe5dMj!lhsB92psHSW+aNmLP3oq&)Tj%MVb5V(80D2?Qdw3@ z=0(|Kt{t+m$wuR=)8|FGcw1U)5{>mB$h(KoswPdAAqA}i6tI4f<9gdHWVhGOC#P#h zB%)H{#b;6cGjoJDp&XdKH@u^Z=TXo8YKF0SnXYr3J>RX1?gD=aG<)aqv39!MQK@X-*kB;Iz!LlPWN1?nduj{ICSv-;}S}`z!sb~9R&mA}Lx9*LE!`MB3 zSw!2xpjl~-7~g$H**N?sk+N&K_L}P0GJlb$O=e#~BNiTYc5e0B;)2p!z^NFfO1MYW zRjxKeu~L@>v!MWsyndqy{ta0x>OuI&eymMnlkt2{F_I0k%kom348CYviI?41S%`;> z;dIVsgda4WKDg0*HMT)XWkqhF&G>Wl;{3H+Q79XWj!&oFjqk`k3VCCfF;5<<^fe0j z{kEoW;&TD-8m}f|%2H$1baHZJyvRD!<<~n z`mOKu{dQ@Eu@X{IYIQE|8sh#8>I^V-t~+M)4;FtX727@T-9Wzc;_3Ub1*q8 z8+?#V8QlHzhfNbcwbr|!PZNk0NSm*lDsrRweJxR*m_DQ3+>CTteV>1`^>AtTE5V6U z9~@ELi-qsz>Z2tlA?*>;W$sf5`%Fl=8hd_dZL?R5>ZpJ>_$QVd1VijSstfW8 z2Y#ux*T~Gl+JkfPl4S4-KG2i*{?{eKMD3xQSppU>hy;Nw^GpQ}`uJ+ETp z2fq0k-)p}4FpIxm-PApHc-w3r+bodVOpyPN{Qm_%dC^PWwJ!hP1OCs1l^mlr;c#de za0@~18QfzOXQ)cS&V{c6tA#mxeQw6Bm@Ps0Sky=;ZN;2Um$S{U1S{Boug8C%-DeN` zW{m8+mibSB&GL~OyWz=KXhnoAE2fKT_hpYRm2a#9Q*EHjNobV#@NH=bm0V-od(a=47UvNw# z?eWsgVkNf4S%4-DD;hl=sfIJw<`9&^&tlMOzAoK2WWzLd`kxs1Lt?v%4q5Jk=K#5| zk|CB|u>@OYkPl@8^(cll0#k5$KX9iQPN|Suic`#vNzpjM5CQO>QTm(rlY_XR^2JxK zUcAR{W6t*~GEWGRarKd(Q9Lw(%3lf<=iiH zY05}q4p-pKalQf>BI50xqeQD?$iFR#Xc$UT8fiqos*{1wH0A~#Qg$OJhjWG5HYT4M68{2 z&V^M`{d~Y&y#~q4f8f%GdfUJb?SO*lSmq^~x#KA}Zv<~G(H4VLK~hEx(Mw2Cr+br@ z<{Wyf-^4`*8uMjznSdzyXtVm6Itr2tS0;5{vgF_ zIfs~@zT{<;xkVK1Z5M-?L%x%2)rlMZ4pB4jZ#;w^qbuk>X@M2mbpk7VLf(pm`SBEesr{SNGN*|gxxHsuccR$SI$OZPV=n723506O7Pt&buUIrEA7cCDK z#9Nb|b7&dNmkpt`afRL0UmsdeY^b$bEe|E&%9L+AG7|$LzZlGKm6ttjFqbSRrZqc8 z(obEI44%gbveTJg5(%*EVtiV)%N@iDFfT7!%`xe&csc0@FJ~(~)4Vn9R}gP@MhQa@ z5Q$P066ILkQa8ye3;XRceS?%QZgX=>4x-{!+O5+$#?m#D#~yif>R;cCW$!{7|Cspi znddxnmz?8CjH5i%VlV8soalEHn)*%;3#uF>Xl$*!@IrvD|$EHG3KW6qoJ@-2XxlZwqK;IToI5Q%B6nX zSUzHzD1moSFr+Y|f?Z}AdakCV^4Opz?gS@R zn5?>QP=#gK;e?^eeLY8OU2bh*lexNZ?#M<@S6Yf6;4-^URc`ADyhUoj%gQ;{u+jNm zLnu9z-^z+z#yV!>8iq_U`LoVIvCXU`c(gljVQ)StSuIX$X#>+GJIl2b45@~)YmOSx zRUy7?Kb6+BG_|Dp$`~|IlZy=LWuV9Sw&Z{4+8#E}hT&5y zfImsv8L1SV!?y9&+t_O=sNgOYNrlCd+EFnFy|R$x&zO@fQ}P zDd{e-bWEt%U@=5FBHh3gImtS;cgmY;C{-5Z)V=6eg%(w%V1#$ilB0T6QtcX=@JjZf z9eX4}s;FSPW|Jk1LGlXqe*5zxv6Q7=s=Vaf zIlwctN=vryZdbTtYl#5j^?)R*i5)Gl=4@)Dc~J!$hc}zx@bdRo;TGqx+RKDN49pPc zxrUjYBe$QKt@BpASTtcq(8<<6Hz`2^*aYlbtx0Yf+OcF?q@A_tGhL-Q~3|* zYufRP{8io8jc8*YIjtI*Q2u@kTFE%a8u=Fb&WIP2SlTPX-A>2&!F0BtZ&6wAWolSY zW?&$uWRSp{ud4DII_XPseM#(h<|09XHf&+)4cx?<%f@X_Ew+-^Ay-BT zbP3@djsRjN0fC{h*fgbQC%ST2U3Q`R{=Fq(y#lqJE|Bi2)JH01Q4B{H+cZg~x!J2p zG3M(A=OV&bslro#1Bqyla92-HVw?Sxk99GeiLZ#50oG@b{6gcxVvI85F)~M>(E5VU z(dsH-8>VOPsHN8~U>mFl&9lR`(O-$anAi;9+8Zkv74&^UIbJKFJ0#=0wlM%B z`Y~X)=?67&DNHhi8kp%Ie@Od!oIXE)%8+MyZ{C6!q)h)1DHTPFod zlB$&7wWdg>bw~z`Cz{I}mI0&_)e8rODX^%R^gtd`3$#pXATFs1)qGiyhSUO$LV;)# zKt*aoIbRWkKw(P7qyw^$0;(8>0}iATsdp51ffSUqJF5B0pkGoz<$O^Pyi}x`VJ5&R z38z4`4p5LprD&K4AWNcB&KCrEQ`{zwsu%_Veo{Cl;#3dfN+Bs3mI6c)aVkZd0fC7) zrJ~6I$i(9sQ2~lqnpp`DkiwI8RvLsvktubroF59W|=PJ8o6#UA& zkQ7^LyL=Q|D!YUfTdKSC6kE!>$P~J2yKEG?D!Z5zx~hgT00!!td;kO0O($TQ`lb>v zO?A@ZCyUhG1JFY4PyuM6s?z{vB(?qm;U~2U zfzFazWkFU+t>U1Hq*f^qZBnZ+XgujT0+2%OPzFe$a;O7jB(_R|qNG@<9r6J9iRv|j z+!RYRdC`2rgkC}1k8m#MXs0V=3w08uMltduME{3|K|_j#7m3ol82KaOyeR?UEZ-pR zFF2P^w9|L8|34f4YdW$#!db3C+!t^zYiOs9WD6D&rSsA9C4_mhJfwCR81!q<-BSZL zoGfqLKm4Zl=GwZaLxkD|YYMh|V*-})Qs*E-JoSPX;pv>DCC{UfT=9!COs1SukVCe&_8D-HHSV~njO8liE(u+V9AWIre8cnJx zqs)=(d@E~`1%eWn5^h5139$GN(6(5y_!kg8O)8a=G0F^Ygf-a$Nr`FRJf{gxd60F? zj1U>`kMeN?Rv?1+5>u{sF>kSUHGbcPHjrz>mUA8#IKb&hHUG_)Kb1Pe;@iAnF`X>C zUzvc}$;d)V8S0O5cu$K4UA$9EaBAg)B$JxY5l3fZ9jvk zQ>jOn9Uw-}&(tB9nNH3ZTFFyKNoL2K2jS2{+wSq_Yk)oWn?0@fEc0?e0p^dt(lpS7 zw-hoEKGQ{4sof^8A!pr(b80}?G!*;I6yTTf5jHS~+8ZAmwxFo@t)H zdVTyJjYq)v)$hco_=$60=V#ZzeRIt~T5gLsA!Xo}v1edb4NKSXJJUhg)2dmTkB;dCw8;9WO1%cwy+7c}8U9nV1#B$TxBSZC)g$dhviH(-_{MqQ97IAH>sYvCyfKA zInbD%QM2nxo2L2Jtwx;p@xG0_`Y>T8ZQ1}QNd9!8{My#mSw5jj`Aqcca8r&&`h zQ0A>|)kat&yi~_0ty0Um>ccH4l_->;=aGs}yyxdz&6LuLuVqr4PX8~~&LKRL=u6|V zZKGq`PCD+WW81bnwr$(CzSy>Hed*ZK|5?m4t69xc@8Z^3RMq0#TlL&J=l8Pq#{Wyl zn;Vnf_^hU6Rym{0F_nWT_W;V5gJaB*_k-gHqSGiLV)hm6U3m6TvB(UG_X9^p6mcEA zVfMtFklq)Ld@%hFFU4M_F9O9}re4(K%P0nj7y~DkV`jwX;e$`cnY{&O{a?5i|B_Wd zIvX!2qtTazOeDyMg=kJ#{}&H+)Fl-2C6^mNCkRQ3Qa~u(JU)s@=?<- zXjh=7nLkkF4|s@*xN$0x|;Sk90OS6MSv$ z19qdU+j>wl?7Rs*5Z{)i%C0f@Obw7P^aF2)$2?oH^Yg;~Aib@R@wA%%FyG9Lt!@&) z|5JBgZM$-K;3}dK-|FGnsyQT;5*Q5Y=P|% z2(G%ZJ;=>*fpH1z$LXw+uC|Q1BKoL)wjK5u|cWjj%7};b*$}-)= za0|OGtnae1eq`T-^lH8KNwDRc-98g^mo0iHc(!`ZWT@KSuM&T;y1Y18rc<}q{QR;~ zw^3Z9eTI9UV4&MF@0xXD+I32OC$%M9wzAe8+?s4RIbCnKa^J$gOX8Y;bR|EO)=_9mZq8GGwUfYGr73V}$5ZV~B0WV02<~ zVA^T~2=uw-dL!|2^LeLs*-g^B+q$)MnaQ?v(R!D5v33mzka=f%zolBt49o)3_>3Fghx1{XQVd6POV|`f6AozG2ah+%9U8?1*ZOc8Z%~biv*` zsYohG>PfOoAjDaP6(Fq|yEb;!eAeu1$Q-+9xoNy;m>+L7sgZP%OyKG*(wMu;j!kn} zDoWCmU(k^jV1+B<>)tZ753A!#KhPocdSER6DO)I@q!9m{%H7&Lx0mg6(yKYrvw=o< z9x@O6gSS65AJZp?WF>*|N;JOS{{dyl1{=0j^izrSJ2F2bxII}WXPAMMydDpUFq%@nbLm-IZY z?#7rC8+R_7${RzRJn=J#p0`B(i(WIb@ng{-dHl6sOM)<8DJ`TVx+t#5lMZ#&@I z=df>_tx&bgzp~{%;NIUkKw^);0I?oV1F{-I4a6LLGN8%dR2aM-Lj#N+3=8aEKQn+o zpC}!E3e*hT6+oYlRSsJDZ{wI!5mp6+&Ho(0Za~WnNew*#g6u%ajOzei0w6c|p$PU1 zWCZ-szX5=gkAs7V0b1mrAWW(Vas=)v%*YJp0LlY!*h4VDVaC7#Lx5@w5CI62z~g{C zK)-?d1_%mM&f%Xynt;gXQ_X?@+d>6j2w=~r+XLwYsqiPP2h9n<$VWGTObmz>MwgBV9@rkx9{3*c9_Sw69{<)M4@?h858O5IZisG}ZV-NCerSGpesF$7 ze#k4RFDQOke$Xp0B4{FTB1j@oA}As-H!ubO(w@j3r~zL+A`o=iAG@8n9l0HQ4bBGi z2J{PV3vml_3w8^13uy~#3vLU{2Feb~4$Kb14x|>k7Q7a+7PJG7zXo(vV#y!-HJu1H55te1l!;8+^i7`vp8Q)qnjT!6?ux zP%v+Q01-(&G|d0&@PF>z3)uMQAOL2qZ*UD??Hka-RR09I@-O(^^t}J=K=%4jaeU5uc9p)4dzYkN;)M7KaEQzMMWbT!?;PYCjr-dNDK1~FYIbj4Q<^mG)s2u^!8fclbL^V8{UjW;qLcAUx8 zzQMVr&}V|3c|`0Zjc`RHWQ8LoD>#E8I67%#RMMW)8&y2S<<9=n6`$Bbc zQKnyx$qA=qiA_M~cuh58F0`}*A`Rj$GDcm?t#20lO{G_XI=ndijp(UI3F*qip0Wk? z`529Wwms$8N|iRzrq1;_+fOdSm~ES6`=ZTrB>t$bf4`yx+(mcA-HmN`#k4Kxz6cg= zG4Fj{>h6xZmwpLuNNnDb6BiRM8NK+`-I#pY{^`3dH>VQ#iEJFoFVR)M$R8mzaZl|N z_ukWmNSu~e+*d$f)c(LO5JY(4=@pKj;I*g57s z6^1w&@bQ~8`W}%zr}W$Y#%?r=Cj-sG`Es_#yydGpu24%U68uPwzvS8lwYOnb2#dxB z!|aW3c=2h4__1Q|CTy2&m9V4b(fai})Wam=3(t)wC(x2Pro_>u#l2?n9!C5iIZ;Y% z2ppOG=rrsB?hgVLO3W4aU~oK&XRSpNRtFgm&u9Y~okbFn^3o44+gaG1;6=}w{WzrC zasH3_{D1=r}rww2itS9xj)G zbII97Lq$d92HcyPvRpLcMTiZEKDXytV=DFA6&&E1{(f@jt*M=n!cA~1@3oz2^-NSL zEV9fV3k*w3O~*0eZ?N;KBr4(SEG|PPAb(+Tg>gHpC=Eq1lx|vII1rVCNAly8M2>QH zk&%wVA{{V~yjrVi>M?gpwk%nr%jGAV$1`0BA`=~+BbyD82+f>QTKSp8#83NkRjhE3 zi%>6Oy*p)$oVkuKDXHKL_1MDx<#|_Sdv^Y@dwawRBHVDczaoZr$6Kk0{a3T zZGg?hArxUIz8{yBTMWvaKbUELsq+%lLgqH^v>7pB&%Rasoo8W>xJ?}AV1T5-3xUpMA^MV~caJeUhQ?e|PSf$=Z`R>qzC4x_BsX+ZDm*oP zhkcvaqm*F+PwT3-OrR;2zQBUP{t*r$)FcNwv8hwBoAhiXE_1yf?Fg?3WA02R&YZS0 zx6#o=1Rtf`K&n8mmC}5|JMY8Uyht%qPhq8gq4Uq#>I%s1I0E?@M&j$u94<$LQAbO% z)6}b1({d^%U3wnlm7#qBberv8r>;$=$+b9}T`neWHX18KubE>6Nz3PB?4xscVL}84 zxMqBb+m>@bU+v53wEI}Z)A@}1Se`O%b1cdig(Bs@sRNP6lpy>lBRfu=Fhyu#4O<7ca^`$(YlTT7H(2pv?`~e@smUx2Q*&s#tFn}bluF-S)QG~4iU4)h#R83SS~5a75)%A^yGEi> z(Sf&1Q|ivwbxhlb+xHTLw}Q2bj+2c~S^Jz_#x~rFK!eqB(P^~Q>@VcVb9z77!0gF1 z1IE$Bm|7MyCmH$5@TB{H4&$@!9?>c~^r1A2u*MkA_1SsJQ)HP}#PcTK-M^k@Cr!S? zDTS(s6{#iI2e4I*Y*Ejr&2poxAa)h+?J^(xq~5WBoR!wwo|b0CxYBHR0ur}nkM%Z_ zsRVp~mEArfiKT6*+|UlXZKxoi5`h*l#ia4cZE7{?=BmM26uab z)1;WfMfyU|bFt@QJ=nvk;NMX3VB}QKpyPD)RQX$yx-5uPEOM3Ul&ZgyXiKFrvq*=s z^_U=wK~QEmf|_^^1E{}jF#KpDC5xKT8GCV|jrR_zb+f&VyXwG=%HpBXn|Wa7(Z#_X z;DobtAbMiti=hrl5TUtC=k6En7DreRg@>Ri^|+}StrFjI}uXvNd^*`Dft@b2tDy3lasU=a3S`D-`NQVn)tVmUE2d$?D&*e@f zYz5nOV&?#xhv1Jdr9xrlW99uM;@uDf6PlH}Ux$MaCd zWsrZIrEzx+8(6N@yB41G3;Fq)T=6wMKkW#vpR+3BQ`8MfR29gj=# z)&<0`E=`IJdJv!@X~hPm9_Al&Tks%xaUzWzb0J4(yvPcd-HIRJbc=ir3Ucmn3 zg6#54gb6!Tk7eW?-=%qE>yNntRPt7`{M7BVgsskow2%#CMg1M~`$7k|WD4Bz zt^n498%$bEke}=s=0`vXfyRW=OoGxSfcQ6)-HL?(sOqiNngL0pLhQyHH~bc@Gb-z#B{<*DbQbwz^7tUYD4 zY=HlYNzIaNo{rV@=HJY?OsQbRsj8JlStFOUQYvk|SlrTY?#SHZImQ`8)si1vrk9;I z!~b)zE^^<@FrDTHQs=TD3h#q+8DRw205FY2>87cZLICE60!Fm+zO~nU(LuO;VEcUV zC-mREfs<5ShTw+IjRYCoN|SYtd(?4=?EYRU#99130!{#rjlc66$Z0+3j3GEXt-&l0 zRkK5}U3?PZNV1Ny`1@hd7e@%qh7~C8PblhqK!6AlDTcODD^JQe;KKx=I4O-#ESJ~> z)MJqQmyqy}z%cA!vgC+8-1H<8@dfFX3wPc?G}$9Ia`SsFTR}R>qb^5g^&BT*Bib!> zs7kU%qTQlFWM@XdCC`}ke>h-ggZB`!=m1h0z?*R8i{jmj@iFQSrn^1?1@V0fA5YIw zi)F5JpZri}!zc<}Y{s;j-1XUFwJ+ZMskY+vzZ11$x4eQ%TEykt)M+4Mb~={F8dzEJ zJ`LE3Hm^xJ>nJr<^fHREl%(P`@thMaxH95mAyVT?QNFTj%De@=P1`18ks|T=*iTuY z^flLp&WM*fJwfYn9YV7wOrQZpAN@OnO^Edv{=K(&cfWR8ZGt1fhrDl*sJ?z%EuP<9&Q27uuWYt40cpC@u^kHrVfms^u_i^fz5!SE2{rQK&zEz`2ycVVYTmb0>)d zKFigl6_!N^Z=MhaE*3nwCwjTK5zfOKv@j>>2;%Fi0sTZ)Y?`M?vC<^W@u)cY2&43< zc=@O}{V1$Yg=CnCG#LT|;4$&ntJ87uw*3@DQUk=~5Z<>60rW(RkX``1RJ zD}D)=qur>kd2fiURvyx&PuDVY0z@Ajh0f5 zpo06){t;D@85jLbic!#+v_r>~yk=cqE>kSv7pGi~ZD!_XGxcI=MT>1{`546_&v@i> znX`YA_(B5vZK|O@7s6jV5r6yqDE!QsPYfk+vQI~@LYG-0cdI-m59i{`QTP^j{pCTb)Dogi|2XgJ90nk<97}l%v6#pq=TS zoc2n6>Fzy`st#@SKLW|=ync%mQSQ}KVY1gEA?dh`<-7mJ_uAo5hA%g^O^{(^M4mr- zX%x`Mx8CI0INJkZFp!=~^8KJ}}h(to-#EIg|DUGuC24D+D=@VcagsvzfqA5__q(@o<5jRI3plCh^HRrQ4q4?Nz&~#zBVE)Hz)Ky zx)o69uYP}F8Bg0Cv-Ga>n;X&9C;CZCkpiF%JUoA81^DEuI7o+Aexa%I#A2|*&Mj1u z9FeMki>!Z#)L|&~reF#r7O%_&WXA=)^kUavlXKR*T}`KWfOy4$JWztdOoANcf`&`I zBzw!#PZNVivUHWg{cpW12ZJK!a|CBB{=}Q_Ez}rcyc33@3^}lzPeSkCPUL^@j3k4iw~V7Wi1k)+5I`KuBuwY`4!iXXSf_=4-Y?+8uAaeyh`Ejp6J zmgy{vc$RrQfVwuOxkp-dm0V={MXG78%_Dxdc{z@T#WLGV-?lR0cm zf^EV@r^jKiu$mSOD?_3=XGp&TsrK)w1So00Iqw85ohZQi;o>r;gyav6*!SY35CXy+ zw`4AAOa&F@Dyi-u0=%WQ;JkeeL084)ejJSzMttaFD~E7C>W0D7&J5{t%W*iEr7vZ6 zzzdb)A?DYxbr6sQ!ULK<0wTdah8ngNqZS*r_)*qW!7jH0UMuC-S)xFzt;~vk%~?hlH1IAZcEaljV^XjjP!C1?g{=;vsD++R;LVV%V3FrFf~6#6F9^@rLYz^I9!NZh&wjf zVboVuVK||OPRV-9yeYftGLsD%(=@Q&+zF#kHUOcDE)s8a~W=ic^tF=yY%*!GDXYX>2;@TU>8#ubI~s+PZt7ljUXA<5%We z$UuVKA$g6-=UQUf!Me04XKy&3Tsc4v!#{ZXV7r+p_0ezak(u!u%(V%)Kh2c2Pk^ql zvVnEuSQ=o#jhaSb-~qSqi~rl|1#52s)#lIK8{@&GsH`itq%yT98_UXP&|qeR)dRZV z3dJ~{4cuU&)Z5nCFZUz zmhi^c^@{()rqk?7zv}vFAZ}$c`}bu2q&>mR^$5F1M179T)$b`})BgSS)C*E!4iiaB z=f`E-%SD?Ick5$+L^RV?kvOtREea$yDBK?Huc%H5MpVuAIZ+K~uO6Qr_I<&+O+Bg4 zr4qXx@;vol=)BLK;%&Z$mDs%>TCkpuuY^J!?_jJ&9;1DPS1%$y(`6~|H`{I=x{&*Q zm#1NyDp9UPUS{8Ox|{fny_#&VkQVqJev}S=m}?sYTCnXbRe~gtO zj?)vxIvW$U-E>p)mcs|Yj;6q;(ZU&Jh;MsBW~1jbQlC{r!cu<5sZn1IX`4C!Vd{-K zDL~=R=}Sv77;9++@Sjeb{pCs!{u7Croj4467e=oJLqNs+ZrwEt~MA9gK@ zI(o`B36!>^x636>JwcEixaD@;Q?>Pvi{!9r3Vd~F_6jp2wZL~B0YQdMLv+e!`-lzX zWd{%`%M7+!t(~U-?kO^$!*Lg~X&~WO=r!mGHCu{TPS-lh;+0UyuzssMC+;wowf%fC zhpuWJ`qHT{q5-3oXq|IvaCDpy73s?Y z^@KVvS{S?y|L{1;=jS6CF#7+83a<%fhLjARJ`bQ8DM4QuV#yziHe55LD&#^{!&% zCKuSRTq|BqUHAr58SWE!7;MLiM!e=FPxoDDbyjSu<^Th;Ks%yy4Qp<~C$Zge{5y4O z{f7=z$yRI24Y<)q;gOoQsaU($sU`57hw37^>JIko9MWVPVlH$;Bc_#8Ql3gO$|B6- zhaG}3n~b51_|1o|?#5B5yeNl%5G}!#0^Qzh;3PEJm1Gnao=TE0xI*=z;PBQ(3$R8- z>U*+M2ILin4400d{XkIpESm&Kx43EoaD`UN7&xR!rC}1hZc-=K^)=Qy|Pijk6(?w_K7p^fb`@TUq6Q1J77OHU#?! zg!Roh{9jTGX5MQOUf)AKRm>qgsQ;dZY<7C!lXa@{olyqV=|<{?tlZMtq_BWQ$nyA( zrL(H2g<2s3nNZ;wGRm8si@A9Bdw$O$C{k z7F~32mu8t1`w!yQGynXOrzL3fr1xU|M(Ni8lP}vH_-Q( ziOlVkuH6DHg6rtPh|Dyfa4gwn5++52_1EHQtGsNDDo(j_lPrzQ=AwL68*}XuqCJ`& zRv&T52H?&cr}Zdq_!e%`HohL=3IFXE+Bk3=(@U^JhWro-y!37tTH0L2&-Ct8QCp#h ze;wOf4Lz`4i5|Lh*KkFQ`sWk9S;AF;L>p6iBA|F<&P+EClO2iNJ*d_8n(nFX0mWtg zRV3x17_iA-lHS%2*4A+*CHOm_tLS=#c*o~{Tsw0E`2%=@U-o<)3+ZjI)#YZd&pih% zXn%u@*1P$A>PyEf__;XvuHWr0KDtl5+w}COgr@EOtDlajyR^Y~6+FHSG)fl|UBl+LN(@S34D`SV`iQb+HQ{EOS?9kb%Yw}i3)SFp*bvCX`y zeDS#MZuPmMbxl|R+(s$Xv|&12> z9S0|GfjGL`}P)8;Jvda1H`_c)mE;uW3<^z2OOI^AWB=C%SXTpck3tpX;^H{+A^dl~nv9Ok)>Fs+ROuH5SP>Zv zAg5!ZmO(D%^YP1M^{wG?`?v-F=`k6Zp^By8_Ay#;oW2Lpx%I1& zSQ0u&lRAAPV3_^OKx|3IIJ6yw8z%M87MV6BpJ+ksUCYo6ni)1krZ4W6H_W9N2ly0d z{(ahcJeh&RnlNoLn*-8qv2GcQ5j;$OIcG6esG{nb$=$oS_~2yngyK9stf-0}6E5<_hZn!Q1A3>tVAl&#dZKn*^ z;Z|-(=R5!$0RT)gW>`{NzWour0?N?i`)c*#?Rv zK8J5BZ6}W0Kx~&mWp|OAQ~K>xl<-JXjTq_W4S2*hGNiiz@NE6WFiD;&Bp57$C^3Ii zl9crRD#(<$>|{(7>#%}=3^~|9ldJ46H+OC`Wz?~ogZ6)AX)cJa5U|cUJ163Lj zI(IliZmhSnNH+awdzn?_K#jlrC}PC!MODMFOq$G`1=|Kxor{-NP&s63AdpisqsoRP1b$C~^|BP4oGBQA zH5~s0!0BmVe7WS4`ezqA51@$ufhnc2JffeqI;J>d0hjk!X$F&D6j!YaMoVkH;EQVc z7rnfL%)(ptK~Q9Hz~56ltxfyHpu@S_Jq`*4;h`%4qA4U*XUsywPMO>^w?nSn!e?G1 zwf*eI34X`I9kJn{oZ`$<&a8qJF>BdhpkJ5y!f=dqpZ`Eg-~7C;a7$d|v+^V&E)Ths zY;ia*SM#?fYGHfXb*7}pVl(EB>&K+57SX1#oqIZAx2O_F3~@~i#SNU+6d!fgs8N(< z7u1e2Zt<|SRn>k)Kq~!`CFRE`?6y~V8b7tgcTua&bD;P}@w) zhWcZCn9gT@MBq_#$O9RREegJYNgupP!)%uFj95~cX8%Vs;BcZMk#NF7=sZ0$Y|bH* zUh}u;3#%-9;=kfipj4-7pqIUlY$)G6AKju%tW=x9l^crmQ21s`WsYY4N^s=S3t83=U{;t%e zE8B}VPa6a5vo$$5P#Vl)m|O?<7u*>r_(1%kF{jveB1s82yQKS%jmsOfx2Akg6)t~K z8s=a!?Jazcx>uHG=@xwqx2bc?mMWwt$a*5hAcnbCGHoMb!Dr=@#tJ(D(le$M-?@3Qvgn|H8`=D#u=lI~soW(=I(rx(gv5Jh=*Zhdr>pyT&os4y$qLO+tgpff^) z&i1KCF+Tle#O5RWkBRs4RTre0G?@Q^CPvnm+BjQ|`^PD4yNI>Y2(C1KTv`qov5#i1 zuwQj>q~lvp#5PlUwkO@{|17g`N%dst(2m`GsW7**!_XmJCm&Bu7s5f#^)Y(b+b|)= zHKVAjRDI*>%&Nz4V57F)?6m~azHA;YKL(|nLkaouV{MuUgyfBC0MqZ1V^HRuHI)Wq(mcMq0+QYaZG2$dv5Pz+e63$R=m(_ zO>|LbSLt!8JXVS?c`AHXmSkEdS<0B&NaK}(TGMjoijxVQ#rjCElF54Z-ww=HxN*ap z^(SELPjlTdsg*|t`<q z+o%^+{IG-=+rY&EzDa%<#IQdu%BhC@le8Ok+PX!?+(}AVnh)#%0MXSd3^*B`(@(@Y>69)*|7iLoS&Bbx;ddzlBL<($SC(Ei7 zIUah9tLkaspa5WaesL0d=#Q?DjI*rcT;=hXd5gJbaNA-X97Q~}7@57xG%bGDG^}4B z053$sAD;cqVVMUqx{p9_FSt+_lwuTKX|8ewfl*!Q^PBn82Nf%xoq##Ras5zv}(`XcNe$?zb&0k;}pH3{od5r;bFQW!j~vgaq>iuI!@AyIW(lt1Q zE0uwPH!iS<2@xKIpUzg=X<|FUW|v1rmBVQ>GbZ{h@kc$V zW!u3m^p8YY6R#|Z%k5kj_1A^|=J5mikXXDQ)g}E9!saxHJm+R8QN;7QLE;VcPhvyT zpEWVur!%6InIU``jSgwLSWfBm#q63mqRjLq5*Nu>`N~@U@|IWZC6H$r#R4Q5=Ld}} zT&A>P!QwZN&8fV0c*1{7uo7}t#1+0Ps;SJWU6KuFX~b_h`g@h(E)XV3!XN0%&(m0C znHNu^5X6ZC=(QCD2f~Tyd}KP`3+P5}@nXu_cG@hD|J55kik%es*{oCXX@Smyc9$`% zWnV_}z_Xjr0>%LSMcVeuNHJG1L+epP%w@Y5;*~OvSE?qQ3BV@KVP=on)^u1l96Ta@was*_Oh>8t@Be#_1i=sI@C06hYBgk zVlCJgN;U8bj66MDqmzT^mJ#UQCIQ^WbJzxkbyiJInlbhyHv!6eClH!kw`g=omghCa`LIL&8I(Y;jLGV%IEq;9FjdeU4H?3< zV~(82woh7tmtt$k*EOZ<`-iaLLX>JR2S2Ph%yRVXKf%x=rBj4Smz_R1nbjLsUGOk| zRiGG1WnD0iaQ^WkH)Ow0#PocPmr^!lE&0YMA0M|$!8MLl8xAtQ^lc(+*sR+! zvpQ%<%C6LVuR_VVb4*E8YkNs{`ZV=yt0FcL3bcGC5EXofE)+x2RK{;+&ye({^JJ-E zU+z%`C0$r(&p9wc#;#ueo2}u5h)ptvzqS$Kn+S^+{E{E$9!3|N#STG<6UpZh0U`kM z3bq-o{6iF68HG!>WscZXRn>zeD{2p?2Ez$S%8EY8PT{IHswg_#v{=<$GFuDLGs?k7XGV5(Dnrx!r4q&HDU zPnGrROYi!iK;GHzd|z!@Q(p=jd4&}^yYiqvl23Lu6wNcRx(Odt{*dUNQtCVt3lFpA7PS_7s!dI`hg(~Fx(w=B>X=%9oa$b;G) z%8x0(h9`;1~#;dRPn++j5`@ufghV_V!er zGS%|C6En6}S;~K&<#h`ny4~6=SHGBe3u3tyLl?}HJQ>h|(%fgs0Y5z3MPYz|6XBz- zrPtNLKPtBhS3;6iaopjttg1?8OdpQXJf_}RE1Ym4D(xr|tHU*E&ClP)tb4e>{`xDX zF3;Y2Oj0Df@27+>HRC%zv1~6m>@8&QE)a|plc`(5Ee9z`0lf%oPkAAF=QL3a?2o~~ zt(^}gP?#2y4M2JT9}can>st?Vgp6(X?CcD2% z5Sz%$V)nde&WmY!8d1S6i0vhp&AT%JlUNP;7F1srwq5P~X~);*oc(!ygG$!BjbZub z1W5(EGAVmGp)Ry4$DbpO;4t)e$4K}Hekte*+qN}g+bR3=`0R=Y_sg~{N3W{~Gy$=O zwFhLW&S6Gp3l`&oNtJrm$t4r`XW6=iP|Lyyc^Wa{?jNTCCawd>-`brEJU&JUFc3C7 z;*27dw_+K`i)h+>|LUIMr2s^9n8YhYVz+y758@=slty&5KLpw$JYso&QNuFTgKL}n zC}z_4SSBIkoTkc#Bf}v4(4B(Kr%x=$*u& zr;ah}ul3buFw`+7gUBIN8?U_xmF8=eTN?i`vYd}6{5V@|An ze1}pqP_ob3y$1O^puEX#Plj6fjdy-)WO@wjTxJoS+u92)ikepghGlDU;_VNaG1y%6QFSN`p!gaY}KCTCgpw=A~IUGdM z0K`=f?odJ`r(EbFgUd{GO}G)wyeiRSgr^vx=9TrZXN9ao(zM6|ng|sd)wM%C_lcT! zX04Y|p<8awG$<+>6|bJ1v!zK48Rg2~1z|gB^0oYoXGcXt?g{cc-nR$lZla%jI3V4; zU>+RcJ4Xvm@k+gt*pmOiyrXdhTU)LdY+Gb4=p{K#(AJ}_Q;v4}uD!gV7QPjJywk4i z2Za4tqL7#x?y3*JNS`yel-W-rB(3-f9$!REi0|4z9SoS&2MVqUrxRifI16f9&8eG^ zvJh-#tA)a8>r~g>ITRml#^VX^l*riDK#3DBM3fASH83o2Q6O`cZyn0`JD&@-2Ov7M ze&|`v9t)}SC@H!~5Mp3d{DLDd3ETPTRV94anz{r?3I?LGF-FIjhIV{Qe+8_GYLvr} zQiuXJCkXx-gDZcCi$VF=!s?ZpMKQh~e58JD?69_#w2sNChIPbNvKK$8EMpdutK~0Y zCtt*3I#umV^z4vRdcRxqH`~C-{?Eb;p1W*#GVO#Hd52`xKyi^rY;Wy>s;0+OqFi+9ei%Rf#s; zil19c2OvDUc@f|w8~q_7X7n~mEb6RuW&Mrf6_E*6-|~r_pXF}2lwN3LSIc(zSc$To zyPYzQKqz{N=6-z@9PE-7Ddr9$x}&x;zWuu@l{ZMN1#MN^w$MWC^}=L03eCSAs$ceL zTd5Nf1t<1*Pszxjql_3wuO+#5Rca4$pr1pJ(U-Ui5guLKu^26~fkrh=dCNDIm1LIq z&+gxM+T*KAvHOnyUOJ=utifLT%u+75n`MmC?x=GMjb4u!4<7V56H%OYEFaP%?Kz5;3KL|1s?LK!7>L?j1f9cc$jpv8ds~K zob!T&$&9P=)KLJ3bmrfJJBRV2)cIzWnXzf+vc==Y1cfof<%n78ZwiPa=8HeelMRMx z;!sG5)DO8Hp$xYSo#zj{mIS}PPO4|=e*9Rb6Ft%BATf*G2JKNJMN}ZjDQr%sThIq( zc&EQp7!yQ9<|{S0xm-VsCB)N%CsP@1J~Vz7!MvO!Sl|YzKcN5QME%4Wb(V}Xv#+vc zP;k_#sdLFw#;-Bu@mtpMMUh})Z7640g;9d{I4-ZCHMm|-lEU%4wB;a*-G-**W%uIL zI=p*ngjO;kt5WYh#v`p-Tc-BRL$%@~>JwU#^(&e425pk@j>@%uZDv--CcFnJv5~$` zC=)YHAA+~a_n|IkZNmQq9fP)k3?Tz}fsd4bQzRm@#Uoc7rJ9B6X{(!W!cDdghd{Rt zw`lDfJAl1;%)YTgu)ui<`@A!MA`daMh+mOwniMdMsNk-^CLdb?2g|q;mYvl1|9am7 zhO9)&Q9$bIbc6k9$4dL_#A9Zp)XH+ubg8x}lKOpGiA)Xql$ZSVf9tZADX*j?0;X&m z@JsDZ_bE<%y&N`tB-_iu>I`+uqHl=5BfM@9qfFI>J}*gY2ixwJzwWg49_8R`rXdmH z-{9oMC_8Hhl4~%fNFfke{E;8k(f9mBKLT`^*lWE$sJb_dGQ5Mrf{^F?PWFMH`1;51 zqrPq36Yr(N5@%qHF3Upt3Nm1zr~)@qDsVqoR%l5$A_BCCt2NKB(dpDR=)&j5Zlro% zFb5ca7Ai3?bQckGp5MTBI>F~x03z@ zv6!6r*M3cqySteKpV9923HjN5{d)N*R5t-QFf!iNR*d2FJ)zBK_xz}Cv}u3;u)-1La$y##s+9|OiZh$#XT$xadVGxVvRGy*n=)_--p7g`MuCy`#UQ1jXPga8 z+2IR$bada%(OyATjMucL>Se<#LGVk~$8A=pP7`UBbx+j(n9O*18{hZt&WVRMHGXI^ zYr>I5th+Rv+~;guS2|_BaQ=MSDt(k~T`m^!z4HCwHQw%TZ<(FI+w}W?0Y*T%zsiR2 zVEm8*H|!`@-bQ65g-!SF9Wus8vv4kb5_pw=!z>dyj4^nj&`owUpp}J^h9=Bq0fQOL zw^k2^w?#m=2;&wNo2cO5lo;98(}B`Emr~=QQazyqG^mb!iVKtT7`E1)LU|koUq2i> zqsHr`YgRAl(|^;lqJDA=&xt0PSczQzY~|)_r&F5CkHriLMLh7{AITXeLs$qu@l}jk z8=MXv3DT@kLEnPAWJ0g6t-@!*cudbx%Y=)ttOutmklg}Ec~R+wsQz$6;|q3u1<~-8 zT0*F^5o(+;#JL?F^em5$0;GFB(b=vk-vr%5Xeoe+Act4e#*`c!NWkwpb?Ey=j99XB zpd+3K-&k%yfcC8>Yyk3|3rgVzMQi}!M%rTothsd46@jqQG!R=jKRg8V|16+-h1g2$ z#!~tXVw_q!zd5$!GI+VkGYsg2tN}_+sem=uGwcbDRd&uns%@W4SMsZ^!7Dis6rpV% z8V2Fz*Yz0sL{%SP5{__@heHJOZH>b7xr8{-_3Xl$wza+nF`9V7H2qHhMfd){+MivV z&RS&@C1I3OMSRoVvBHiGp1`Kkcx3xsWsf+cn-d!|&isb4sOSQ|`wxJR9f`rg4r&bk zgzvD?FqjQGtyybu0;6F?M&s6SZ^$rs+e4F7mq`0}|8-#JXvh#RbW+E}&*~B&eiPJt zKU{g7+za>1)t~WbMSsjBQd+n7#Fm6ysWBKe5Z<0Kr??9J zKh`P`K_a@%01XP^&d76W_^21blSWz|PmoZEJB0q!`XD#(7}vS=Yu~XjL!1ONL^tsa z^3BwRUNW8~vqd90nZ5kpONd=rp`0)a`Kd;)sGKnS92F%3gj(S0`uOQ!(r~b;6akrx zCl5BDVqz6nslMcembtEg=^~>?b#l4aMBBFjbhi0un{fCIgJ$3*Ci-M!iRu2;)`{FA z7wWDR8d!IISkrz{s4;c4U&s+{C!nZ>n5ko*A3@mX?ZLzwI)Q9#Nwl#Itn<|^Q4Vdpv*K;|F2VdN z-(~G5jrsJht<#RoNGvW#C09!I{YEHf~z^Z&Mq9VY0ab3>qUsy^M^_&AnZNlK`ig}rG4Su=Gw?*;K6 zhCLxK@VapbdqUN#Vs8ZYg#N|A(Z9Xp$bUQBn?L&Xqu{mg@0`O2ra>s5-JS1VycbgM$(7Ue4*~UHr{p=YQ_|n7 z6l6^)$eL2LgGzxuN)(1zaFZlzmqduZxL>kumt;jhy>6G}wVNctnb&KQY$JB-H%UIW z7#kZYhMMHhY;hW8@#^GE3fA-fouvykNtU8xcaIKl?{kp9zVlo6mGyz{;L5OQwI#n6 zL%WZ4496|i`=2_#>7KnqCJ@`L{MWhpp}i+j{Cpb4&yc#8uw@72^{Nt3O%qDB*kFpx zaRT;abP!!w5Sw-e`;D+On7Ct@xHFitsI-JDstpORM4yKAag6uFo(%mYbYI%{WQZ*p z;(3lVs=alL>-$kl20FK;C8GiTaN{wy0&2R~EUTAD=k}c187plncfh^u%H!Ys9_JD{CCM1m=$zDh|Ia=FzV zve-L&27;@tVR&R9@7DN3ZncCa>04QkL7`B{&FO02yHBsRhxhf4MRl}XsZ?ko9@or! zHR?q`lM1QFeq&~$Ffl#xiHWBsm?psP{}6z>k)Vyh_FdB|Aa4ZVP5!Lt#i-o~uN#W3 z0NM>(ETCm{ev|wUv^|Fsx{&H3ax1~x2pF%Reo9TL(?9Q1zG>KO*kxEU&={Qirw~DV zoP7fuggPv@0Lr}pp^%$ExtpTxVz@8;bKanQlP3&%gU>)~X#tq~rwEmMoMGP(O+_7& z8}_z*5L9mJ#jeGBr#iQ7>SUD?h`OC9+|=JOmUBjno43vsqw(1jvmtIEZjsS6s)q>l zRx%yMxFuGc-8xr{lG;r?kP@ri9P*lglkfC7jltee*dMs*M)CTF2@k zekE&XO~FoAv?t~ZbPR1FFgKY)%n{--;`bO;tDpQCv5(jRXg)$Lk*{3{#Z4z3fWg{; z&aOK&vTwws)0sy0Nha?hCQoqQ+VN8VjsvBMH)l7`?wVbirPH(N*==1fL=KE^d!sb@ zfUaie9)?km0?%5_?SFc>;F?FtwwJFM@k*-^m-y>{0pYJOxJLI0?zp$c;|tAB0M5+n zXMMAPGw50ex?bSH)k@pm;KB9mx*Bii6c3|dN+Ha7t$lzA1NQlvo3h(>`%$a;Ww|DQ zn|emqS^j4ZQ4*Qj8$;O|&k3CoqKe;bPj8IJMmrrrw;aZCia^hJGn20^BB{*>hwTX? zYwg@|-d9)za<8Uhmrk^6NX?)un8%_R-^=5krF1Mlwem=DEVjAq-sIV zt*KeLY$IhL$ z^gxh1R0)j2UNn^EOmw0w)(bed`H$jswUTHe>-s#PFEv`#P}<6b zTne~C|CY&65%OyULCB~u^;dA?V)XgXfJBerYK`-m5j~9F6CO`O2d$)Duzh3(mEOWtNyHHiIJ75G;|Gg9T-c19By>D-l2FAns?loR$LPkX z{520NHm9#-Zjh2r$Dhx>e|ia0{C&xf!PM~;fi7A=m-C6Kc~qyY*{E@WFQO;0g_z<- zxWPdm*U3@byf#tm;fzpG!;?Fj6dcO(l?9v*z5-MC^&WA7bap%p!Ra|lMRPs#T1ZGh zMx#JR*^UNnD+D+PEfSvJn^O8BCmm?uhm|#Fz!PFr}PT~y!4H9&bC*b8&;?$_SdujvRx8JA(dHB9^R{~_ud-)IJ2K@ z;-<{tkG7Exx!!+W*&ttr6#?Oqfadz$yXz?J4eD~U@F25_(*A-)l+GcGcmZ2Ph7v8J zbOdPr0lbcU-a9;v4B>&?0quc>g#%jJIR&e*HfG^E=lQU64$eE)y^~yZn9FjBgs;D| zpX#3`oV73~fhNErxQc=SDB!ssT23TGNO;hWrF+p(9=3QPq1MF>Qz1OpZhmpkjZ_`EH-%8vA7KuQ=@Jxs^EfH-F(6g;7})MrBdB7fTc^CPejU5tsbKMI7IH1y9Z^cyi$N z9TXA6U!FmmnF}GZSBU$(sN2kxszgN<-G;RJ06Ei5!3 z9#$b~*AX68rRI7YnK}9kGNapKbsMCUPoSkiG2Ld(aGk>^Hp$Fhm~2zjR}AmkIyH3r z!?#j_dLHfnP465H&u^uUH?o>&FB|#KUj2OtMo{TYMAO=3z5FkSV(hq+v_{or;^r26EWXMNG zb>y9X(huPY6b1|D_knoX4|m8>04LiIaV6k8$S*$}Uky(5$0~l6qoS&caDRyQL}CH0 zEGF=OxNpt^<__FTCgFUR@RNE5T}TBkR38K50w#dE3C3Ag-{`VwrAI_S^icE(lA@`V zs|YL76SHe2D=$hIxZ|SL9W*HP^+n5LcBvtu7Z5&dGC+R{eUl<$Smed`MvKHHvl5^!&0PpKiLOg!)Y?& zCnG*G;w2* zT1Ecj4HNH*}U1)QXq|rr;;3AP^ zZ<3;bs7ml<0LOj^fpQW%;gx{@xwwE=>7;emi8z)R^s@~Yn|@{PmoO`D(;92c2FiiQ?$kr_jse=-O3+;Z3F(PD*znNS1Ia$Qwk%{Ij>Pp{fHu8p%f;+!{&yZmYH=8 zK2x7oDBeBV;JVH%Q>XybWg5VAg#s`g7RSMziEZLLO0EPF5C@t$0VE(pd>KnX7Er+e z5on-gOGBGBm?mvN7cN3{MH^`qtQRYO#F7fADIG9(2hSNI$o?SNt0GlCm>z+AR;jX` z@k&r-a90fV6bRmXDpTKg3MvlP9l$A7^WiPfp(5}#-4-~s2{v?8Zi;$6L5oWA;~z;> zmVnD0HjoO^w(_=|G(~;xpjj!o`jSLx@H*XLBc)jRLsDx}Gc?55+_&<12=B|NOp?VmSQ_WP(PwC5ebZK{tZG8o|J{Vibc>)kQs1H zw_;2|DZ+-!B=wA)(?wBQW}*%3i^kg(2@j<_a*a_t zxOc3VEblTQ3u?j1ChCh2AIz0Yr)TH4G7w>RYm6GD&Hu!wr;kpAq$-0!sWoa< zW}{N#x9-}#>lSxVVSqiI9C)g`r3PTfdN6kId4;{_IdUF^GAZ)mqTb*=WLMC!r`hG) z=haQJp2sNWA~)edZ0u>CT~_Bl&#RjST1ae3TO84ALX80-zT56MusUgG_t3^$@($m~ z&O&xJCetB~N*{`qV<8Y-sy(?#sFJ4s4RdfLlg&(jWT

IuVJGX+|!g!JNpf%%#)5 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 BSpon6 diff --git a/doc/cheatsheet/Pandas_Cheat_Sheet.pptx b/doc/cheatsheet/Pandas_Cheat_Sheet.pptx index 6cca9ac4647f7e9bedaf9fb1eb0791d4642ec394..f8b98a6f1f8e4afab4de9892cd8cd8920c6538f7 100644 GIT binary patch delta 70693 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 z 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%0AX4$(Epq@OGGm%vPbh62~C(fGu|I1pUX1 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 literal 0 HcmV?d00001 diff --git a/doc/cheatsheet/Pandas_Cheat_Sheet_JP.pptx b/doc/cheatsheet/Pandas_Cheat_Sheet_JP.pptx new file mode 100644 index 0000000000000000000000000000000000000000..f8b98a6f1f8e4afab4de9892cd8cd8920c6538f7 GIT binary patch literal 105265 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 z z$CQF3zjgfWua2px{?+mSJgBJyf4E;9zM^q)TgHHleFQ~Nw%-)7{k3563BN6v%3nR^ zHWB=*$CdI04xW`OC1kv#!Ko{pO1zBz|4=BA{RPo5z}lg)NOxp9SkBj)bp^r$0DCl1 zFp|P)q4;$;mFxIB`$&8ce_!N_W`jNyfI?jx20!kjN(iWN=+V=6LL^3urA3)P@bqPg zgfO+7bioq4lD>TTlJnz*aii_8Q4!SEi*c!k+e<>g9WKc9-V+gB2&?OP;oJ70H)d;Q z0g0$~Acyyuwq9IP-gG|9_fj@(c5E!B_~F0$!ZzC4=?}f4VnU*Z@dVfiILJqz5P+%K z;huy!-zJ);b3UB^3Iq`8D_Yo2XMiZQuKfU&X1(>-Wo|6cFn!;^K>_yweeH@wHp8<~ zC|vIL&W$w`2qF*J^?nfwz-X5H%qEJ!07RU>*8R@%Q3~YR3}ZTg$+OKZiRB?!n41S9 z6B>u>C@D?UnoWe)I~FOj!kd#7jJtsdzpT6$Mgh;SE8V__$GvL6DH34(m(B~-Mq$^1 zM9!4^pZVR+E@yO?^E6J8vM7%1tp;BKUYSbCdn&2vnVBIHC6~0<9#<4m{IU0M>0%&Y zQHb7oldEpwGN?u0+ek@;VMRAG+zbF*=mG>RsGsPQ%yWIU_T;>)E$6E7*^P5yupd5` z+}g`1nSD*0vryR6$V=h%k-J|gm@LzM^nOz$k`Da}aH;br!{eU@nc@;O63!&NwwVSH zHk0Ng9~6tgA}KtkqA(e!irpzi3$QTf#y4`${?G`qD%H|-^mFu`dy%p+p)Hg59pTd^F?=%{L-Fw?CVXq)v}dK z_WOv|WKGiSdPyEnfGeYUU5tr0Ha60$mQNBp1RDCj=FPo<2sJ2WZpSJh#wWV-SPOF? z6Vm~k;11{v zrVw0m)9vB(vpZ01{a30@+f8}%kw&xgA)!qRtJm!XDE5BT{wbDEbK3k&_~T~&Ej%g? zBV(m$<+qK!qRdrHYjvOD(?R-*elwcJ6Z#n*>&8u-f$963bI~uQ%d`cTCeMEU3jxpT zqJj+G)j-THY}rGQ7ecBR>MOY2u=a@_6d!jRyaMte)bUA4NkfM!XUVZzn*x9qX5o6?eD)G#KTe~nsJnu7a@1{e)sRN|$J+M?t%OhCmEUd=^P0YQukurQdg z1@UiaY!ZOiBf+O#D$4ZHRt^#r1P_B5$`;jQ!jCb(2@fHtc6#TqCQ&WHKp9!e- zU|~i)fTs3OHp;dBlEks*py~Y<42YRjW>rke3bdzgW-@URZTZP#xKa7=V@B*vF8;#E=0-N;bL} z{CW2eq!T-A(``^21A^Ni$mlQqfBz>2xR$@+HQA7k_dj>Bru2jLA*s-Qj zgvCisfQA|f1YzKy=@URvf&LF5I2h1g`>h`abqJszZoKViSnj)A%kB_VuKADsuyI^2 z)i0!g{F)9ppcCC3=tTM{{q)jAuyk!Zq5nt`TP?NB84_lbSSVbiqKP4PWak0OAW<}| z1EUvDTGK>t*zW$cFVlUmsKCh@5(bH79_|^Fe0_x={CN5VA5Wuze0e57LqKT%XN^fz zCp8)ZAQnJ?0$7+>B+<>RLDbaD46{y)>rAHINgy*?=YStOTM6R+vEATae6%kkedQTU)z&qseK1BdUmR$#Fua$VH~#iG?=0 zN$dxJ@=CgU)gHgBpM&J38>=BC0ve&E>&#?|72g3NB>MM?3tT>&Wt#7#1hUhrPr?pGvvIOuww_9)5n zP-&3LBLchz20;uD0J^=A*!Oh+((L`*=c8KxP;VxJI$gO=^F+Qb4{9IT4$_<4?xG1Rd5J z93aG3O&ZDpay)z$09#R5c!tMlXdtYJ8#`-sh>1(t_ywF{o&f;xyrDHJCdcK2X^=yw zOYAdc3=U*BdHLOf7wC(82Um%}{k|6xWYo{B0cyJ?k{+k*)W!p0c&>vW85c=DRWZ@tIiEbxXd)0DPMeu}f0Lvvf zK``<`1PBrX*U+K?4b~T!YtVY642E9~&!=~0%P<0hhmIbYD7M(2Qs^lv&3 z`VIXR6~O<5<-e5BAIxbCq;hd^a9(k6U}0e;hbDitKUwJnqK9-}C5!f@dsT`n6rT!| z{|j|C0Tn9K)6=8l1r=&rA*C%vT>pw$xPf98QerpN6rUVEil^N3wAExvmUtk!cZhr@ zrkB7fJSCbm2-5i!gjMUoKn8u-*2)BhTv_ipp@x|A6%^>0>5|f?DhzzZ&x{X;yB9w+ zN7ub_id$u4X+Za!|^4zpkesmR~7@69}H?87}L?` zI?ThX>DW}yMMo=$K<(E9$PomC`lI#>q2MCcwm8DQOmEB>4dgf1K8FY-kJ3&4vRmLq zZJ?mR;maiXzjn*NLJa>3afsKR1!;hQ;tIafTE&$|Z?X7fR`SQGy6~W+RJ&Szaelt> zEQ;Ij^N%x2jCVST?tJgvDyq~h%x3qEs;pHCb+xq%JtP0x6W{f2Z~m8KK$IF+*`+t2YA zm46EcP@n>NoCk+dgTt^ty25jloF-N#Fy9XJFM!X1_*8>O` z$glvOP9jhH%4huDm3jJ;c0%E^lH;IZfx|rB?g2)3q>WYN>djq{``R z@kYyqEzFvKq;hNppc+*R0V`*U#*NxI_MZx>W zbPADH8la&6>VQO5R#7=zZhz_m(mYR(ckRDgkAt$3d7rJWgUOFHz1v#qBg!+A8pA<3 z*A0eiWrL8|*VhSPw@WP2=av2jr)C?On3$OPbiciPzs0pFwq)bAuerIoX|H7Stulz> zSAF|K89&2Zg>E}g(-(+I#`d+^-8f0vYQ9#&+AV3@>h5B<21tkZQ?eOm0Y2|Y53cS4 zkZ2MLfRRbz*e$DHLg3NkC{DV}G(7F7aJD|fTLB!E7Y){k!(?2#16IxU6w`p?PFtca zLE&?rx(u~cN%Nith1czDL-$^o*d^++ckgpw{u59{Xulr15J(=i(A(rdwCKt@3FMW4 z#6p>FyH2p2g2EV3RIz#v+E_qUNL7^rPSEWtst-4i-*?O4*JIG<*V!o<26np3cA7(E zg?4rGi9ytB=d*#ACN6}{HtGC$l&FwYgFrgyZJX&3%SZO;$+|FyQk_-;f<6px+ZEpq zbY^f_TnKv^W(#Q|FDS(YN*3B!2jLo)(vt zB^2xfr5f0l)(m_=IFGNmq-1lTQ%_UWYK)4s!s+Jzd}OoMsT%(54#;3+|0ItmBqh}? z1i~0wK!gmHL}1|!_b-wALmMBy-P|}?{?l)BH6}xJ@@HpZdYmC^L_m%#RjZHBneV7! zU6EP8_1BUI$ew|k4&&i8e9MxB(jOE!Ts=7m5KNfSHwxvcgTE}2L{lcI-&c9vT_x$b zO8_rf#BJ=^SB{CeVaVff#mmquTNm*Hb%UF7)h$P;-Y1ZaM^8ZU4DBp6k7g<^1Nq}= zA4w(r+cUs-7j zD)tcTSBJZK9gmCj_A|zO98jINk?03h0O9<6H$%T+-skgpo~d^yO*1^!`j%%N4+v#( zwVfiXZ|vzl-6oYfP-#|{eKNK3xH^b|ly+MZmAx2Zt{!MjMz@lpu2z42uI4_DnJd_G zHE(fNkk02acs#Dj=9l*3Zcu{G?dcn+dW5#{n>4vpn2GoVn_16c{W6od9$Q@h6bg^T zBd~Zw^cieL@-;S<_2zCxGDo~Jtx)9kBKdWR3Zmh{F z>|>_x0AFU)RrsCNB~Ss9ghxA2*3f{*pq&gy#50GOnE7yE0;t@WRSK7+{vtXabJR2m zni(F5S6sz^)L|#Vsc~y=DxQylsw#jYU?7py7E=WYf}UhdfIODKO$9(mu?&d1<^I{{ zIQnU7jegOG>(v@eX z$L9lq$44GOs&2jT-2zpkoX7yR*%9F{K&bgG4e+YZQQn+`@aLM^*Wp^M7v))r$pT8u z4fe|o=!qwAgq{=z&-L1@KvL*i3*@NhKZkMcqrS<{XTReOx;#3VgsAM>a$!Axc_~OJ z1kek>4;k1|pEFgTFmQ`V;1>&c1#~;*->U7|{)cM&H(+4kX3y33cQs(3qWj;g?S=jR zs?e_oC_SR8Vbzj@?0S~~$JwJZ^-W#)cx!)OkV_=YgNt~RRI1I3TWz8$Uvp=Vete8tAC?fGS zylsJ_cC}RZDS*j|X=$dZe=yu`$SAySe-k7Ycygc`O+5&_Sy(uM%4cTfWr7@3Oa0r$ z5y~k-vaeN#J3k90oH7@H4BoMjq)k9bhZ5+e(J`Knd9<;%i#(!pJW**d5@BQzFY`!140E6)Kcz^$M!ay$OW-93+c4V~E`075%dMu!hh&J1HbRiS^ zc$DF>*QGYno^6Pdvy(86(^Wma8sC-Bnk}v`w6FYj1|@{AdoK;KXfKN2nV$JmajETK zF8cKq2hG2Y4GRgA&e9TAW8YW2g(VL!Ia*z_ykz zbi(bB2{`gx?f!iC<@wyUz47a-6E*5KO~CudXOMr(VrS8YcPKfde$C9LoI|n9!v5w)v z2Z2L;28soYEBa@FO97vVnvnIM$)Fz|?0{E7jM7s2JO5~4nvAWB`5(BAsWx)i{B5Z@ zrlr3F{qx(kQ@K@UgX>taj9fF!dfKwK1~OUx&I4I2o~r^6ZL83KTlN3fWL3m_EB&vj z;DDy`531$=ok&Za=6D#B5sYkPSHvqRp5hk$r(p;N+SPw1h$QnCEZ-PV?fCaP@yM2G z5NasousgK{<_|iq6PyPz+s+wyQowsV-7Qsk<8|%YwWY>Snk>>nPped~!DZOVn`grk z->26I$4rIQ;cYfE%KM{Le9cAw>l#Iz!HL~nU5|eK>Lr?2>%JAb|LfQC0op#YeCp5} zk0ImUtxRFC84)Od@V$iZ2*i$-(^NlLn@@t>wi^RWL922aPMH=e2Ec;h7|VgNSrd}THWI52Z2 z4<@cBD2gszxNx3MwE1YI5-7|y6!-eIz+Cf(K$^+5FG)3Gk(-;lQ>J=5^7%CSid!G? z8aTGgpUOvLE?gcN8R2{KJ@9xP!{EA_)d)so!ulb&uXiB0YI?<>5O`9c8ofA}{laCe z0vuaN&0Zq%&Lf5=DT}l-V-`pdQXXZGT1IqpWXm7XFNF-|DloOzRdiL^bi4xT3Wm@; zRsREg;A~N6k((c$fB~D;J$MdN;lW^*m{qH1c}i__vm{WL!L6E_n!3cTaRKwJF!vyf zL|c*`+IkNhLWZ<3$a^vK=A4rxJCV>Lm`waS_E#Xm0XB>GuUWaj&$S(EUMo&_%ml`v z1BQ{UJkb}3Wn9N9#%k@9-=D)+O(7l5e1X58_C|59cMeUpE@rt7op!NjGC2B>{GBeI zsIt{goz12Po8OAH)3d$`wq=RmIqD`+u;m=69|Dhf%g*cE`}gm=+p_lhKYomlb1vt> zeDgpZG3e~S8ufO(qrT$(wP9xBQ4GU)2VxDEPi2W5a*rh+)v)p#epx)Bm-N1@wK^yJQOZEmV)M zV2R+lwsVf0Ib?`*2Fog6xY%BmR84RjR{_l<&@*(s29tAycqaC2sLi^?qnPI>M!Dv_ zHVKL(drLCH%-PT6{UrP6sD0AQ7@|3`$hT5E0r{@WOdeaArBnAlv|znl6BnGqX_m^O z(i2w>Qz}MO4yWx2=(37NCngb|iG0 zV8SA}u^5M_47z*Eul}_Rc^vRYaq$$I;3^&`CD&y(EOJy7f@Fyxsv7oN2}9J5@5Y~{ay%TOiT+psCuro#`(PouZXj(I zOgtcUxdh|sghU}1s#T+_#Fjc)UHvZUVr;x01-Mb415(jsQ zjyV{`qz433%T0e+x&h8 zo{G>t+W*NGEpQh2LF48B9TNF6@>xE;itR@@4^Q_d_^*K#P*;uvJL(l;% zdVxm;qC%6MN>ccx=vB0^qFg8Z70>ObvA@Iu)2!txZE-jk*C&J1WY=n(3 zG27IlBz1W1mH1`%OG2CRTzLgJkN1^2E?vGnN=`X(KpM31`2~rbP;+C2&2Tm5Ue6>3 zCs6e(iENi?s3cV`bs`HszJITr5P>l^G#OG2Fttz@uvmCgLLCZ#dsDjojF;{@z6h^K zHJt+9bI=u@wD|5gX+HAUis?_~W}n2rXgw8#SeWXI_P=o=WmRuIqZY(fr>O{WlW;pPv0edX60O7^H$ z`hndb(6T^|pOdSKS*WA`HXEPDjHxM679Anvx7!H5AChW#yKC=T`$PBGKjSzgvbAor zUC*w+h@%s$fJ6-3m^VK&PFsJZT?e!v4$?#yiGy~RhUGwxGEy8JkIoQ-r&|<-x|Yw! zo_uSII=}eKt4k-4+!MZZtNre)Lnosm@Wog%Ug=gD>D_anrIq^f_<`j-MX4`AUypPC$Y%P;0^P{iZ%qV`XuwG5 z6!Z%e4p?Y61=9({#6gequ#$+oMcM9gF)U8uq^i3tnRpo6AHm`_e(fgzwfc7!`7y5k zbE2*+nUegXS^J|Qs-qj9vXGvvq+10u3%n_J9#JGk4%V|iyvShga8>V(rXmiuC1q7e z;zFbb9%sCqHdtc~Rc6-cM@Dut`;nNK$q6pNtrdKeiPweJv8MpX=q)8B8mW=TiX}kc z6sw^N@s=38Ry4qzsLU>fESgy7f{}g#iUK9suS+u`du&dl-ItV1tV8Xarj4yYZkuBD z%a8f@n*A~f!3ZvDswR$@&*5CLbQT%vO3Krk*!nWn*CR}nMTB`%B;6&=BNEKpFd)ZS z2StPp=XtTd#($Ia*~)tvo1W)$KbS2>22Av~~{723x_G*Kp$B#U*Zi{@{5SJEO*HH`c;?Qqe&k>sa zHu-L(d6K775}!o*dPg_cq?%p;hm~mmhJVggN=?hcT{r(_>`8~R?{~b~7 zk|o#8wA4y|&zKSTkv_#-9eZrgjF?_>=JbS^N70gRq+*inuwUrh#kY>6f54;P3&wi< zzQ2EsJIO7L*YSb=ZOK4#smka+A{~SbQTKg4t&WQ2^M;IgqK>L{ILrz4(WJpdUD0mt z9`=^%MKA1T%APscg`_^BN=C{}_qa0ba?s<7G*TolS0Vzr9ToJzsn>IOevkQ^CUy=A z?M2#WP-r>)^Yz1P_K^)k{I%Gt6w;3u5|>7{!{qhleb-BIc0NfPYw?AaXy9g;Euos1 zYS3}7JE*#f%u@S=bYd=KuwULRTOsoM-6on=WRc57Q!^-FYkr=f9UQSIID{W>35gjz z2`;0`r>8OqC)4Gswo>ymuN(|c@dj&02E`VUSQwjTWtvcoCl7O|=q1-p- z;yx1zg1WZ06NselgY|;!?qjZcKm-+XHqrPLuo#5ZK-!=IK*oxt;-Ou0oQx+(N)~3h zJb}o|Zj`&UvU+dc?2tr&+hc|Id*(5Txbuj^_S_qAVsl`H0|^0R(20BUA3#Nf?Lcdd zF=G$`G{X7R;~5<(3xZ6NrNV=QPtVVc;g>~MT^_1?rRi?F@*xBS{I8|X(+cIm+HiK5 zdxn9nn_MTd3M)oS_0&n$Kzt^7cCusRGaCv{HXsgoA~XF;8j1?ox)Q-=TzR^tDq(@* zaTPr)(zP33U)Gq{VRt_k8U(-mJIEp+Dw_2JIszaBz-KGzqZ7Z4S*CnmmRThDB`beKEb)fnTge zJHJu+YBw6oEIxswI*^ zJ8!)e(Z8box{-}p&R7t?u30hWPF+dGG($#`gCS2?7gqod;Z(ZG>$UKY?~;bBT5jpi zUpKq|fC}x={C?2tl2;)q@KR48t1vjS0?N(){(g}&6~yVMa-+f3zuv>~k8~R+%7T}4 zoyHreGKz|H{XbD$_w0T(C)(K}aE{M^fE5L4wqWdfw!7CSC~Yznf2_QjJ)bX3P^VN% z{fePo;Dne=?F>W+Ab2`o7qQ5&bZ?gTa!erTpg_&9(so0`ug6%K0v_)b4y36tDbClL zyJ5m3LKgGwdbxLLSv;erxB>#?3a85Bx;FJZG#a<+S+nw)J~Al%0&qsd+S(f8Hc)zg z22M&O1s9`?_dvfdlwMd=azansXK5gv8R#LyI`d(TJIUp&a?@=20S=J>{H8+mE* zLD9W}%UQg)wKt7*y*BnEGo%SBgqDgoNDI_uG?zd6rDXQ)u`-_`Di)g2o3~R8ZD^9^ zSnmE%UdyI1l?7A8kYRm?v)Cje*o|a1{4TacgGND3dS6aT;4ldv*20Aw-*xa7AD$-u zlAL*I%BLuYZ6b$`j*IYfG2t~(ieKU&RgV6NcyNxO@?HtfeKRKdq5_=zi0BsttTV-I ztQtuCDb%tHYK=!rQU7Wp%kM!Gu`~!ZUM5HtToE(AeiM5*Mw)^=kGB5~$qz>IXFGy@ z)oY%%-kRI;pO+h+BHk^n}!ZtqaGMkV| z%t!BCMEwh2rG+iYZByltGaqTkrHDuEO=#4Shk|#z`f~DIF1#;Sgaw!C5fV)n;iInd z$w3bxGm58=uC;g*QvsiUJADPa3suWDM^;?J^*o~mA@)W6uk!ym_iz`z9`IrZ;>S`l0TO8GRV`Lyq0hj^)cdQIsN z#1ZU;!lKNNTQ6Y7XE3L%(qU*PN7b{Xw7`Eq3aW(O`ZT z7a`sF-^V@)+fcIS<3vA7EidH4#(JP4+jmLSed{z8G0uY2N9(f*H8@}*CIt;<+>l@y z)|E-NgFjJ)UZ{-{b_S~aIDT$TB}~{r%bxH^af^Y>ONX_%Bguo|(LPUKifRUD#D3z& zNwIVZQ7QY%lc#K^(8shHuA$UdbKRGrkjIFRD-ruL~W9!cOm+J^J?B;V2n zZ7%yCppLP3bk8t|QE!@5csPPf_fuW*AdjXXTOd`y!h^87KA{}Zn2YBNslL5`UrIww zef#?>D+bQQRP^8YDh{7}jLe-cz?{73Nz$&ovgxpTAUWFuXZjB7=5KZO>gEwHRR9pZ zeOtK1PI?8K$DWOsfBO3KwWpwUlUfln*-gCJ%Ulzs+)h5hAnh5!>_28)f@3tuni38$ z25tzuQ4*E<*~*2t+FZKyuvC$}kN_|XB2yVR-lKQYVZ(hwZ+jLyf6vLuoj!<|SA6hA z*R-wI3|mX47S@79HgzWlhflE5K&lF)-_+4Cv&8{u%-vuAoF3q7Q;E9Fg++sG)45X2 zC(s8YG~AIGR`=FwOI4MrrQCgfIxOVNUjuR=UYyXzg2L`s^PRg^4j9jiFCOm!Pf|GD z9R*Jupo-BH?_UdjWv>Zo1ik<{4RV{GU);lZ<62P~k;}%^oVaWuohV}h#TSo0ytwn( zR9_#_yI9H2%`twr>$N!z*ZJ-f2|^o5a^}F(U>8?>|2Ipl_j#^X&ngYsCVc^%8B%-B zUG@JJlvVz(pv=?u^<-!ntlkGJX`UrC-kfXqgFc+1(sAw>W3htXOuH+>3$s91(^g2xudqKi|AR-vLorHY{0W z2%nn9Mo}NJXyNMZeDQZY-1yvzoe#^bl{m=xN4loVDSrHj$9*2xpT+Y2!^V>w`MB3K z1jZ5_D*6*4PbJ-1xww9U++F?PZH;{m@Z+X=!Z1~3+-puw{7a>_0?AQKSSg!+pwnLdhJA<8#RDuQ*y&0;)!DYohM6nRj= z%`nDEa0#B(K-dhq4WADoJg!;GL(O@x)leoxxxZq zN?ma23!afrVz2I&s#ge?b$_gd#fK1+t?v+nNmA+W&i`x<)9zONk8p4U!od#6>VAFs zAbsZK8aw`yCUbS}u5cF}k@CWUb+M`ixI|0fr}X5@${d%f>~tE+@!nG{PYuv9e{t6e z0&qsZB^JINKe&Ma$j38Q@~lI47$5~q(IZ$3nPV8W=Psz#R59>mWFb$8$D%j)nQhtM zajTSe&a-a**d=>PP_=k!=x4hUHr%ZdP0imr^N0}qz5CyMf1b`Wokd7|hOm%SC%)!r z@7O&#qk=kB$!IW2wVYL{(?G{xwUoT)Am?emEKgd6WS+~B(77)%;-TR8IpZzT+F4@r zh_<5!8rf&Ef>(LyB~#7I7#BN9=b}v?rtM1!O<26sddHYS`pYoO65NJvA$e^E4Q5j8 z>QXmL^a^f)eqLzN7Y0dvXY&jSFq68swynvxGJ~Tv?#AQE{wlkiAv%Ybc4S!|Fpxt$ zpx!)Sfx@D>)0*Ic^Py*NoK~E~N2faOseXHK2=W?zyH7$RZkj3{Cn;wGxlX57wtzYD z_xkAl!Rl}~Z81=dy4ATdN5uP#!J8psR+?6Yp*BT@8j~F;Bz4Tp{!zlr%ppEtz}`wjVft%O z%;i(ORISSkUA+wp75+woZHmV<_QKB?pikc1Q|;;mS6_B*%U?udTR)|6_{o-d?~nE` z#tepuIrse36s~g@sX|^XT~UN^NlJ+0oX1yuvW*skStFS~mX|q?JnUYo*wIW}1Qvo= zV7A+;XSRD7W2xJdbC1z4k6MH(3)zc)qRg5kR%gFF)#mx(-r15NV1%5qa^oq8a40D8 zHtZ*N`&rmJ7x-t#dYnY;&!=8n>B8SEDn&=dRpJ|WQM__scaEiM4GPtsS+Q>ChJyC-kw6b}g+&-EY|2tBlA8L# zE#4<4dbyP2J?%WHu@42jPSzSe`ineYy!Lf2}aO~-kPI{v=q$=9vEMG9r1Z^lyu%c?>OE?G3b$Px&NTOZgC`9q@e?DYFt02F6}N?!LN z?*?2Kg`k63ybzT(2aeDZnvnI9tv0{R`4xd`}MCBNYgb#{}PX>P9NkQ{BnU zDZE|yu)#GbdbkU6a*n`Q%)o!&*XIkAZ3wj-7Jq|aJjZu2v-&=Dl79buFlpbq1MBmb zwxudm8|4SPtyh0!(z1|D1A5l&=3S9n-*t@DW02#$B-O8)N-aW$MWtAAujw-$Z*%!F~JgMhF4HLl`6&2VRF+h<=3@x57Q zM*Ppiq~qRfcB*bz8*A3t)Mq6n84Kw%TDLJhK@8JHWX42M)sWZj!KMdK?8Vf-n>@cB0i>?``vFf zjm=<8dXIcJaOM&4)iIWy$lb`rS+aj*7@!%LXZqhn@u1lsnprZUm|_?G52e!o`th{bXIC>dn7+ zGE(01rT3k7zrCaV&3L&hMYZ<%fuv>9JKtOG|1`ff*NhIAJ7RggBeMW4S0Ox9}-AE#2Qx{mc!Lr#4DYNg2ph`2MP^ZB!-%(S>(u z5N>GNEX8IN`$rapm{l3`LY|A5$^9#jHCc5Po$&UOtP zfeJuSvxl0BO7%-rNVy=df2Wt?^OtEBX<6QDOYRcpsU{7D@|!FnKG+cdOWj`tedaQd z660uSzVSlYH9(S&NGA>w)XtY&W|8pkG*I*|PNRFD3ydDe?2u@WF`a9f?Yrt!X8gq) zZ6U}@q@*3p*Hz*G%?-WT)yL=Lly2pH&Dxq#0Js2FNY76DYoV6lRsjYOFeXyWM@W<3 zIwOnB=_{Jp@UD)3^hxz9&9U}!LDtN7L<1ojlO-Bvq&26PbYqs0xp=c_rU}FjIspJC z5L%yqKKbHa?hmy4S5QZ;+O4(nG!o}QuMtxrhO&) zX&{EkAI#u5e1ggo0^tS!v*ZV;!p&c>j5%%3~a8^cZY!r0fbLnt~mbf$-9Z)<-I(=j1sfCWF z`FLimeVU$u(|wTtqtj`2bD_6}-C&d}{-XKdEb(?oew@V>FeY+-wgMH8D6<3>c4Z=& z^uDBa;aNV=LO&p#w|m?4DPu{lTWIFR(0*2G&Nr0Knr#go$82S96I)W*LrY|E#HFl5 zbSm7ubYi}$vE}c6xLZBztw!X*3X0nNTPR^c#tBstu?3Ull~Aw~85$3@@_7ug@_i5Y zd)9~X4~MVlXy~G_9`v_vF{4ZVS44+|j!A zjT0UG(n<(f?VwRszom+b>-^{!yZ%+500yuo2( zA)+kpVi^XKxqfAT_SThL?o?1=qT)+*Vi{p3s)LVHdEOaFD)^Pj@2x))!`5cQ+K29Z zY1k2TOgLW|WKoveuz@-G`X>o`4tA_$xOkMq2jNf0BD*6VXtr3Pn#PZ7frME_O}UIHRhO@45TWh2zp5w z4SqYyvvAF9{)zkLkzU_W3n8GnS z!g>?G3?=OM1(LX9P43Lnb`?Gk;C`xvxf3F4h=OL+(1S#FgsPGyQrSo8wq*rp8Z_KI zr{d@0-10Y7@-dz=ekNs~PtQq;jUwQP(p!`wC7ez-87(r-h8XRknSFrL>s+aoB;SgJ z<9fDKgX3>T+fUhv{!lx5iP^KMI`{f(C{n^5GhlD(>xE;3>@j38QNiAHjcR-abA9CqI-^^+c2b-L6tEXqg7 zT|jh7I?j&`<+Yl}$Hc?{*|_k&_^lykozmH(EZ1tASN>P4YM%c~I4MWsD1H*+EM~@% z!;lCtlxYF0R?*v&LYFV!2ZGqG>A6VV|6Jq*!@72Z8C-ZOqxUi(jp6eEA~~6RuUe|w zPUw4rdcJI6-*_T2G4lf#(3WsTKK z@!wq1*E3wi&Q4i=;~!a%b2W?CH^`KhO4PSHHmiBm-MFvJS0|f!5x)mRGo!PZ1Pvw* zWI`*=YQ&50j8{$l2U3d3vwGS_WrzfxVM<(H+E`h?ByeY(CzodPXW$9xHGE?N#^HNR zJo*++s@Q&H33HvF7?ff*69OS=>t-8EH;e!Ef5q{>IB#kHhVksBIPVQBNh9L-G(?4; z)07TjST8)=O6=<+-rk0c(IA3ROqRH%!6m_%pA-bRt=>IWC?xW16 zEG^<2;RhlL`!r#*2|Wclwvx39$yBpBx+}j6 znBA254A?VC@XM6JU-3R(e__vg8?bDFGN7ZMk9-J~hhDxzYqpV=wW5wv%@ze93rOeO z;{`ai{rp3!R>y;$KXgqgMD|*ta3r1RVy=oA;IF@`}u{b>dTj0d|L%Bl8@V^lJeFRX&punZ0>m;&U!57pNTt0D2N+CzJm)cisiduKowo+-1(I`q(RJ7aLUrL`aJf-7Hc3(^_e-mEF||l83t{V@lwu*9%b) zye(YatEVaEz)Ho~o3V8aFjCMqNBER~HGc+JnfyFFuSXWUx|BldT>NA`QAtT5zK;|| zE<#RT3i-*)*271o-1yw0YTxvyRHPCtAAD%FrgFnERSPkf7`djBNhe0ktPVyNk>%ke zhkf&Ujs2qVS+mA!2?ZB16-|xAe$2kJpw)!M<$N}5Y~IL158uo9$iEP)^?UNbq%^7w zn$Oz%18DUpK2%xDk2#pzl90UeV7>9c1k!gV1y<@AY@+S}j%T(PL4kgtWj1Aor8ISQ zyFBT@1?8lRy#W@vWuB8IHR$uOnh?Ek)mO^1OOa^0kF1)^RIq#)qf-vQDM%!9({J}a z<#HXbDv$a72p8W~;!TGZ>m*_z4yi(#heL5iI6?L#+OLK-u6ayIKqTg69tCw|xJXua z>D?#-oTNV{Ns23yge+J$p;=G1lYAa@6>6&7nPQ}go5a6a9V(Nh>?5K26id^FH?pT6 zNGQz0SgHG*+pO6s0ax2lx4E8u|2%x-da^nH_P&FIOxBTK{FYo}iuCH#rq*1gb4JT6 z4E<^?WO>(Ne&4%svXwWiyEi$}q?7-7_S|T2k*j{78TrH`VHSK87)Va~^34lJFB~6w zI_Xz1Hbm-uxu$y%TqGlWsrXk-5{fK7Ga;B1)nT2`5!sfGlHw6#sZW5cd8xQEecZ;ZnH;D}22?V`3o&jGEgV;GD4Dz-;s ziTl%ajR}>QFCXq}E*Cw$naPUV{>rUrAOX1sBiNwKL$r_f+Klx1Ea@@Q6Y}j?1-9A?>7%Esdct54*%UnqL0&xsFbgLZwGDI`r)q4MmKH zVUhi@ddpC$9VaI`>QVA@*L&a8v4@!L+o z++IAOin~^%`Z@d%=pd4uz%ioDEP<75Pghcd+g;$22G=uZvAjukQcmnv=~^fVT5t8z z+iT_1G9+=pBy>5D+jx;ttvq!|(4VtRVbYy8yDxMfCW9cd(bEq?`N@ev{KOLGk5ZTAu4M0Wi6y_wJ{rYEIAo7KY2Gt3?GIT<%8xEi^8 z-gA+;pY{Q99V%xUCl zsA?Guy+v`-!r#Ck8nfo*;=F(NPD4-cJ46=6_|-sa$r@_(_4QSrvjz!M6_yeT?UW#d zADhB(m4!VMAODutzvfolM|DK#0FT06`fG$WFNai^xP-4q$u;nN!jWOZG%! zQkR!IR!2)eCvij@Cnx_(2=>JG$g;#Oyk;1M7V@h?WJBBrJf?%}?~kPe z-jER9Y*1J9LF8-^tuN0mSG%bc`Y3hwu;&S3@rRSHZ>5apHnC-X+(%s~ROb9|4~RqX z9}mbrlE;fY$F85;7egFNz)bWbTz8~1d3!&3GhW*kLU#7TiX)wtHc*l9zz>+ds~ zp?&(#f&ME4hCt&oW`#+ZBqsYV>DJh~93+3i_qd-}Ihbnw`#yC}{%L_P7o6K15>TN% z^;Eq}uS8;Ahq=>u0@}-T<28^Xo~-cr7pHF#J$30hhVv<@fh}i0_e@evVnk@XM@gtQ zedBhO109ffjpRb{X7E1_m8-P@Bb^zOnNqqj)GXYpPE^<_#2AfB`n*eKeD($(S#+FL z*(HA&?%4~i`cay&3Upn8v(kH?7(^S{dn&}y)4eTrkFuk|$GPr=RyT3^hgThT1&=z% z!ZvQ$?%D&LViWhMXFX!#{si$ApMX*m3>WJ%!y|1XlhO0AyiI&t@LSzuCVBT42q}O6 zGBW7mEmSQYHJ#C)AXVB;8l^%*4oKi#!ZgvGr{Kb7c&ZzeJNKrkB=6EvOx0k<#vE~7 zSn4^(|Dw#>*c1|#s7Q+$q~Qv(QOy}f3o{0h~j}vHkh^Gl?o~l?DT}>M6$I977VroNbs_PL9FOD{U9kEAY25 zdp&>)|JjV^&xilc9z8fL%Z)nLFT2O4rGah78oVg_%1hP$Vw<-!?HtjoPmk-&x;)7I zBd!Vfn;05;fZPD^r_-Q6KZB}dxPbBvJQh%q>?Fg0QtsdTyO5-MbjwLeNztYae)vFa zeI-o;!%j_Pg#bTw6vy>Tv#{=KjRTQ(nj`BiYtS)nIl(8hc`boX>#TfmGO{$z`k!n2v*4vtLDtI6r*znLn?S zYIn;W_!Jl+>n7C0ESrisf@c*&pqs{d2?eS9=dI1#VmkO-Ust{kXOQwheyxX1Had%k z6EM_EMQk$m&T)lDYNh>{m!#)lM%mS}di_J#MS+J9oi|)Af;k;J1SZ7450?h>Bbe8$ zw>&F!FsHBszn~_jxu*Z`;#0*mDIAzTMlJWfM)vX2tX+I2W#VQpC%8 zFNPlU{VC}RPP7tqYX8KFyUME%C?xUx7 z#vuP1KdmBK_YiYSI`v?H0!OG)9t8ebg9z%vTaE5pu^2+-72nGkuN}kRX2>{~CbL@A zkOmO+tvD!^+BQ#@dy82@70enlmI9c+Lrt?=-)Jvm5JYw2P$fqv7zjEH7kbi%68P1@ z$O7mKU;lXN#y=w@3?md9t3Hf*rkML-FbZx5to%cu{=fW^{&dJG><{u(+N%OIX0Xii zz5Sm|lal?3xXQB;PIS8!vO-R*S{8b)!(Tzwcsk^@0)+1({QQHghzFrY zkx=dB6+E2~63GL(3yRn7CdZ$&b#GHRM)P!Vnxrt(??qXZnbu&ZsaxSa_t~CKr-76Ig?!o<+OilU}5eT@UJ;RSN0Mp!I)~cP+qN!JP!P} zfdQRW4OChmY%)GEcC&rm@e07x zJ7aC6z6a4ZCk0Ml2(8x}M|F>X2nOLxk=2LX&E(huw|0yF%XJefAw6n(l{6L1Tx7SU zz2)=RliS13w(tDu)XiL|nKs#0T2zE=uf${;z)HcNr6*R_Av0Ir<+_Gtp5(qfz}M%jNaf2S*swZIJVIDU%Vt;>vISS{;$}w~gj4 z71%6!Rej)Q|6_5O@yov95GLWi|0@U^iU>X@Clq_j(D?7+P6#z|!?JMyHY$RhR0%Jv zIo{@U#mrpJ6w*K-qx%U#wVd}_#v7fQ_Fxd7-!QLb(1b(d&#rTg{Cf3c4<36qhelB4 zm^;Y>2|ixokK`+EKC~hcvCb&iE(RIz1J2NQG4M#n^i6=EySv|5ke{?4QX?A34eW>D z4@XBwHyI&^F&jMy1$_brjL%F6o@j+J07Hx-4w&4$el#_oxvlyyK+)qaTt3I?`d1YY ztLU0YHEm*z-_$7{7=hEv`W471%CAA(gkR@n`uoZ)GKYacAxD-^fxtk4jU9R~)j{ot zf(z|X9CEM#1URr;%n9rkWcTplmvPAU!&VAuCF^?%f4S8II$cOW{{)Ni=5qb!I+myd_PRez%3ZKq7DgL`qLeeL!vm9l9 zxw4QNOtiU<2Z(V%*~Dn@VbaDE@SSO%UqBO`n~35k-13Q16}vUg1PoED#^A}VSFqbb z_&+j)XLK10Ki!}}<6QXTLHeym_dbqv$oh>sw^IcMDe>1PGi4dA$%Op;1dNIr&`iOC z`aFtQkx;ogr^4|7T$U$bqf3mT{Fyn+ot6;bjvT==s&b|ymU-1z{~|nrH?8OKDM=*F zW%EkP#x!w1nLEebl-LOa+jI4)^jMqPSTA`yteF*6!$3-|$^Eli%4=HHyjK6753eMh z+DGvf6y~H*8rMjKn#9=Mm(r*~2upR8GHr6{gnEv_-0Ng}w9KS(9OShwmm=2RCz5Vl zNwm@8;GZk*;wF0{s@5{Vg20Gp1sH?j^X4SuIi1+y8t?jz& z=er~V86Mg#SPD`x^M_^G_$_mMDh6Wh4O7}3?2?O%+GN;Ex2^6Eiuou#6}DGPV0B*Z zgi@CZwwBE+gs+Js2!*y;e!))ZJ|}0NzyEQ(LJC1x@c~Qb`pb&DA+;2E%Z@t-_pPMiY&?8cOmJUfv7Lw zRE9})7Ecq#axy*<-nd5)rbaOll4CRzf@-7Ttb{x^f6UkGQ_N{3UehC}4!r?w-bykj zdIJ+7bi@UkHlbK_A*)*m7kg|Y!k_*U`Y{t9?+o4SodYAm`^*VcAMdA8(*|7mXeh%! z7i6e;FdrW8J#bXq>EN@d`1!{y&9c4W=tH|AI&8MLlb3jy`6(lBlX0JGqcM%L%_I{L zB6fW>a3WlZ<{$+3PEi{zbd-Ctz=f#>flJLV&P$YSi=3&pN%`F& zWjt@WJ0NWYB~~ptV%8T`-Yfe^zyj)oAoY}JPkK-nKm6_%qc{AOixa3~eiE#%i1eIc z(F+wiLR&D86KQ|hdJ<*Rxc5-K_r2&oW0|_blql0IHb2@=J7Lf2qDl{_$8hAn6Bt&0@yb|&)~-! z!#K54j5~b_d)FWageSM+gHG5OqXnY!_K-o1%fLtGV~2IBpqZLhqh`0TGjgYdsv?RQ_&QHa zPI{i0jF^y+l$w-`f)Yd(L?kq{)ReU3lvI?MlVIV%caXUFxVZR~=Lye4*|YzTKWCi? zG8E!176J#06@g8Lg#&c?9t0DV0q_I08wAOU@#EW0TK0X4hmEXOvcYyb4@|6Ru({a^L$zdQE7`ZbLp!oh-@ zheL)?K%5#?6Z{Gzo5xMW8Z&-FlUdTX%L8o{HY4S@;p;iQ-}kzt$l$n4a;$E4#nYf0nIZ+w~NY+ywuTTkpnMkIdPuIsmp*Fp8f|3RJ$ z-JA9=M;b{cu0D6}I)sTor87$m@Cd&1QF69nXgm=u=xcDIky7lc_F~2~c^=2P&hp}* z*rJ9*vuT$2q)5D1?H#H4JC%+NW9e~jGC@SEHd~3e#QhRtS!wXw*gYZ<3-N7;k9xY& zhLc~f9n>gmT2DDOv?|dNrkEmcB83(hRjnEtUW~3MeH%xuKbxo3$XBdrKfnpG6mz^< zsYYMlalbyrg){r<*h_k|-t!)3i0)iMv9HQHEf2LP4O!@iPk($B;pv^Z>K}B5AWZIM z+7(?1+CQ22_QEv5=6c_~`$P{&HN@Kt^BnD#uFQ-poG{DNo+0w@Yr+uIb{u5wZe0i^ z;*cO{Y{`D`DtE!RdF}jd6IE$1U&HIJe{S~JY_-U`pCOcWOV1ENgG~S1tAOOWcmkgw z)va&kL9Vm0jMuYWojKzqYGcA24HcP*a@1Y6rDPvmQmoFw-x{d4+qqz-W>@!O-ubXa z^5-_y@)_dxtilpQAk%_x#}sYN5h^JDFh})2J2Cv9FDB}2d`7gd5h%}W5?T@EkqgAV zR(s&}-n;W;bx5ANyX2tHD`;JTV2O-SGnFOjvyL%258h(;%^`!+2J{&s&+8y4;S5nP zY_m&xhG5!}w>m?F_RYs1(RnEx|8X7h%%!t*rJ>F|2rYN6!+nwD)jY=P9k3FnYUqvo zxuxMrV(pe5)$VP1vaNuDczS7paK6a>M1B_b07a@kf7AMr6N$Z;B zSJkn!q__wlkEz<5iFX@YuU`!KzHmpIw`VkP&-L^SvFKBsJNL}vyQR2ade3<^a~r*| zJ$jqsobTf1TlmRt?23Qv3_kcUh}@oDrEBW4DD=0=L;rv0{27cu`YqnuN~kQfKvS&RPiPXpCUFoMPqR zdLr^#+> zcv{&df3>P(tEM_brzlmAX-?*n@7s&Txch>?q{fXRR=75F)BykhualAyrm)4v?lxvk;}Vbv%oYZwtjMRzhg(<$%fHqJC8h3-^|nSXku?VraeY{|bL&o63&vR)~by1C@kSF(l)5km|XFL z243OuP5d*2;_B8Jg85JHo1h`(lc0fZk^{>eNiasGMrVkQ#rXg2Rr~SVZ!C>lf9lRZ zD}5|0ohYA^j<$C0kn~0#22lQ#wJnp+Gb{9w==Q^lXcH`1F|(!}&Tno(Yi#%0(VECV zW)ltiFY6+>7GrjbROmhV7zgW{htK?-&>fo*(9AS2ZW@e*AdyQNN%i*2r>v zZSTVD^O5nz?*j((y+L1l6c=!%7S(<#bWYJbRhl1+|5^OD&{x!Gs1#KgiEz%6MgKp1 zeN{kPQPXX3heFX}ZE<%iR-jlZQrs!-?iwiWR-kx`J4J%KI}}TC39i9|g`2DY{qDnk z$m`kXWbc_-vu0-PU34rnvRaCr(BL53ui1vaC&4p1=_J{FqtdF(Tuds6S^>;{K-OLhCO?itpPRQCm=#HCf~2M z999n>yWD#B*D`DI)r6A;*PByKd{veNw=t2U4#@jI9!!B`+X>`#oX^7K z=Hb6lg0`4`7Ng(_k`f<i zka4%_9>ZU~E7KkD3BQuxLMM>THJJgwqO9VRb=vxtyyv9KF&eaQ3Zvs&!Az2T$S!;# zy-y4<>P=NV__W_$zpezML}SM6Q8Z^uR>A$^o_5MN9lS7>*G1t$$CmkMhTx(nTxfH6 z(3>ZAXm|gJn1=nfQZ|PKhlHa3jaB+CM4I{sI)f%j02eeITjCVp;b$?dl!8(w-E=3& z9d&y8SGsX)tmb4N^_rX--+oHcNvZV&XdM{j!x><2^EZCT8HqJl>Z3M&iaa5HjT8n- zwLgCzX;Z#w-uBs6;R`@>_KQ2=jiGtoha52NMf+Ap2wcDiLk()3z?pgNrIoT}Hm|>^ z`Ifq7B2J>^np*VN;JK zrsG$i6B=Pj20&g>+(hc_sX8Zu4|F$_Mm5eAt%@!79sC{$VsEofmSH2op+CWNLV^f8 zVG6%R`4=GM>59>ti>xN5=jwjT-_sT^3Ho{B5cmr~EP3|_L%3{ro}~4iPj^y#j)J1J>M0l zG58OHsFwQecQ`An(}=3-8tl~5W9{n0)m3pKM5tj^yDGfi7H%bH6FA4M=ltL%T4hu_A@|M-iGZt907PKQdm;k}LYh6Xo>Zx(aqod#1D>Rgz2rnvz5`}pQigqgLT2A+crh9lkmT8YQl7^ z1c10W*IqThnD43)UYCy3QDSlwGI;%3sbV?%;+?{$AIWamm}Wf;>@C~cJD7KT=SJJK zr&QSi(}qFFWww>x>~3j^>OsKWxQkkNn5@agVrzkqPQPP?PXcVo*6XsLs@VyjuqfF~ zJAfd~`@?PvHm?eR-aR9T7fKqr*-1C3pI%6k9$FQceUjl9Y~$_w81PFgm|100;hW&* zKDj{L_HOeHjF7oWs#d<7V;%L)=Dj@f8PyBmK=aSiF_$%=0T+p&4qVSpFgU1Ir$ftr zbCSd(HeTnMLco5+<5;}ngdxxH-aZ(gFLbnr`q&~s1iGJ2*f_F^6xSdK%yk~+Q$F*FFq7cJh7@U0k>hpeGhN|9Dswc5u0OR!C z=9yQQ7x!Q!->rO7Bi{_Bz6bjw-Y-+uSvE#ZKgH@& z<6d`U3acTZklc`eVI(RhpQ^meh0hvi7xoXD)oC7oCSHtLqr5rtqkR&P50TvOyn`d> zUlhXM6!zp_tv|j1kW^vdA4e&69~`F9OACCwC?}IJAszEuU#VP2TQ%RI?7nrB_|+_S zvERJx3F_)}clRvwQC}-bQ5@{ZTKmIV+X6rlTt%5VJpvtQj9)&)m#n=22J#PFHHXbN zQ@?gUw}FoWd0qf`UpH0n&jVio!KF_&FMxD*IoEbHYzJwDOi=Uz)vr7u#D;;Ht3br;bs@ zA((>CeJ%i6p)WeL^Da6YF90T!9nWWf3dinC9k@9YENzqeD<@+sv^4yzhEUs-J`3X~ zsj4W2nTGIXl+l_uOfPJq6g#DA zi~$p_B{4E{a+?vCEpGCW6w{9?nhwJvQ~n-h=N(M7iZr3_wp-z#d3Gn`y41Ae2i*@KVyK)_)It}0XMmxCKEB>f3u8Zt5-`ZO$!ef8Q09Y3YV0r z`xR+O`7JF`%t}7)(*>imHTA2Wy;OPkW=p%}%uCf|>v|4Q z?=~=>qJFEu+GEF5<#p3b2-eZb9GQ!R@k+n2RT-a933a;$?albgvPy+CrPe+GK2|j6X5@|(J#qhEG^OIBF?uF?rmr2~_U<=nG6Hn&6|qE(NB(0QmkrXu`?Ksi+7D zG#qu0EasX19CKAKEq;`|k|??`c{rB5vw+*`dNyzOk=paBpf5>g>9ARD<8i46D_fWA z8%eL!(eqW7uiUj_G|2_>nFuLu%FoQhmIiz(`?MwAUs(39O_#|;rMX-Ejzn@D{;}pQ zs3ONLyw{OGw1M=*SL1V{=_i4gJ*JOUtt9YsEVB5;MIp zw9hG`Pmv%+F2qzaxS*Ys3=eyVc$7Ygg81nL;Bp2jn+EwKaF%f5{R8}J=%Gq7sTNAR zwU-LLJsx;<$anO*c+5a7QcVr>?F9Pjd)MhszcqK7SF`6Hk89EfWu@`-2_&lG5VOyj zSVMiljt^i}V_CnH%CA!@r+MMbWm2+iM2Mp^KK$$=`M|?QraiL-URGd4G*$;Rqhm0; zKlaXh?KL4B;w}WZwnt4*06%%r_hc0gPXE-~T{_MTL8`w7IEh9uohwD-9fjlt;A7R6kx1Jm z^2x&l+Te_9Sn_zZ{`AdLKNSvdKbt-@J}oe*`TfhdZRl?}CwC9QCe6*&eGm?Rq0#)1 z)DT{~QEB1QnU|UEx5MG*e3Dc8J8iq^ihC-PAypLHrgegabJOO`Gx{{F`<-v@tf@T$ z`*|2J|I#C`Wv!iC9U2d}O%gt4@}%TmXTO{L#EkNiCxHbg`tOPhmSMyR;sbkHwCg0p z0TdVfWHcmy*eqRXjw1m4-^>x9+-Fe$>Rarf3hM8Dq|`sGbT_d#scR?>^|(LUZe;~B zWY2ZJ08pH_L5V~DmD8~1tnSb%hvptFfpMHn#;x8A_oClkX;T2@wPu12QTucB6`${v zA|Th>*n=(Ios{_w*Yu-79oL>wVbs)wz2>so(jOveiM+3Oy~RL5ga_a4haRaHEvA6} zT$0=pAY<@mVx;+nTyiCjXq~sM81K-KtyhGi5N;f#?A#b6>$?J%KV*#H~M$}yCjN!T1Jhoa)tD5 z`rX`NsuD`Y+6pSK{1p>htHSiWcdhQOaMaVga-2y4V8e}#!>O6BwA8j<;m0xsqp?!X z0Um~*JDV1_WljN<6^iz_Zu<5q)mfjCDqx|Mi-Jal0Kf#g%I$r^-}EWWECI0WSvIyE z4M)tfaJmSOy~Xi6btzx!nWp_Il~ttXkOVune3$~wB7LC7;8&ba(Yh;#i@l})#)O)2 zCr)#kW{Jav)p&7~A6E5}rt1CB{jJ1C`zdKZ+^yB#7_ZtM>74{p>`bo999zXLekH~4QB#XgQtMS7uweLArkS?Q-Fj3uG;;1zJ0wn0#+b+*QiR8}- z=n;Z(|MUi?Hl3Izuu{TEFq|(eoO<5p_MBZCnHzR3Fh;7)02`|2xs^gZQqsTq+{=HI zf^Aex1sYoOfLY;p@cTO z!{g$mVY50#2()feaoze-l>CP z#z+ek_9;Q;&FJ2j&mnY{(Ud%w`D)5uT?`juUDP&V`kcj86z@}%+dS-cy&UgV_P(aJ zC-^Sg)AcWhEr$ucevTYS=W^$1QmBn{aOhPr3bI0zVG+%CNB)Q61ep1rAGz~}HWrji zryTfUTqVA5#Wrc#mzm-6t@BOnkXNLr;7+iL3#K6~z&p?tK|f-w$yTq7-OUbC%`(IV zuUhe&cOaamyz|f8DqblyOvaqQM<0rJ*Sipe{9I{ME~oilh})rb1buaFl5~S+&bq-7*OXfQAkyfD$}W1F#KdN<_V#w>DquB zOCE>30RBcB?nk{=BNA(Ka2DG#*C3jDPpKG?lMH?vSMS4h2{k76asqmCZCOr0nfk>q$^krsO9E z9Gzmg@ridxEN?*&N+bCZWjYUC)Yf@58aY3+Oz&-i*LpBj{l&8a1EeDP+tIhSPv?z2 zQRl2I>Vk-Yizw40(ZmlF2{fLI)IyWBOI~x+=6*hYY0UGr#I4^>ZWND8V!ba#xnL@d z9CNiR^ZZy{AI)7sZs>k~S$}5*j;Y-!EdI1690_ljr%_W<3`^?&uHx5c$ZT!t=(g!c z8<2P1|A)QDDM4q`1a>v(oC57B#X!M-U;xe@_s2VM(hZ`Fq98wc7p zvhh{4^MN)puF~IrcR#}-sktS62+H)NZe&3wwqgxM5%q(og>C^~>B3rTWaHP%x~*5b zPqB8NPaqUj*8;VH#eeErBpusd0NNWv;shW^B@!wl;rUXHEOCLhnTmgQKlKxGb=^jt z+K${zh&W4HgdT$aDu_E9I?qm2k)l42;<%|jMHRe#Wzzd(GwHUN;kDQBJwWOjhp-9FomenufA5c zUU64kL}ly5KYyyZIaBA7Pz|)%qPeAAhB@7XH{zo1kdoe1>$rF;Zqt_Lw-)1oK ztsPX~Vd>e>Cb*|1JD_K!3}N!Rn8(lYI}S`Yxqr&OL_DzJ#`%;@wN)T4w?P=CPK^Vud_MhO5#(p&VEWgN&vmN;`;j#?iWb;Pf3R4C@ijM5f_YMu zdHV;9>238X6Ul7(zL?3y7eaR@c)s&q^5BU&p`inCTbM+g+x3+pr~0Iga*6%wTxk^T znV_cF@ub`uQb~qrwLt)V+}QzZ@%cct9XZEStSVk~mN06*BRGuN(jil5*E3Iv?dT-nZeBy;DU3yDWvT z@-Ecm2|}O3`;N2xQHS=(6dNrzarY^1OXxBZhx5F$^aNUzkG_clttNMT!$SVxI=#hr zoln94cyBM?UpUZ~huC?aNY&1XnD_q5tV*)?1`fX$73t}TD9M-o0@jWz8@ih29S3eR z2#r1}ex>K6Rz&^ID~?Hb#A^3VXRfd%QWcbN_7x%5T*+Snz~98103a&f3uQpa(Hy+% zJ;EWzDwoRqUjbG1n?cq(Z>D3{G~d}0m0P=``Y?*EFiPq*31o2*jY3R%DNU&a z$~%QGIeNr4A?6-=lEbGI0l@~jzrgjd+Go%F$9f=tjk8+An}~dOJBt)TF=fIOx=5p* zxX>d$Jq;LPwQ78xk$;U3*1M+etYL$65%V;4Sx~q2^IRC~-;fR`iOPr}#ly@RG1*Pw zQ)kBXVf~nYs}8n>b0Cy`1r&>#0d_f~N4$a8Q%FU#gV%yV{A`ZpDg~4mxU|d3?0jkI zYQM>Y9d&bpRmVe944mvFqZXSpl5E|0?b)aV!ETB>$Ao&}->SY^#Nkee;-Uoe_T;ru za=$!>N7oCt%b>45QD1Z`~u*jz3D*^>;qMfItHOqwoaU+ zR`FrBQECkqnFLZRF-y$|b4`5M1YVnI=|&unhctViK_C=oH$R$^tAdzwIDcR8Nf~J% zX3R{c-l>i{tpuIJv;y4+-sr?iP{7vNY-_518L@6LwseR0#PRdu{R5-`P;-#&Yv!x< zK)ij+a^xmI!X+j5FIolvaOIL$ApcEo;hL&FV{U~ZxrS@X;)WadN_%LF z#Z_XpYeqh$M?QWZB4x!qkEubOjFT^oq_a7{y1489d_(a=nX<-35BqubcDUNSD_9Tt zejF@$^a6Oec@?f&JC_6Tv%7oD1#Lj7x@w^A2fDC*rnTObVL+sijU~vU8k(TM)J0k5=Z~2tV@obm_7F z5f%TOz*O{{Xf%*io4nMFwbhzh(b^kNx*@{wxjd@GZD_ExJSK)AKD|sx1FW00_&YG1j+Upns#&oU5(l9evSS1@WDSW} zz<|CC|F-REuce_(NbYnB@0o1rD_V!dhwSB{50}((dZ}{IdBImR z{?L>F;VemR1DibRuOBe?@%Bx@sHdBOGce(6k~cpLXP=}vtEsHcdzDKnTZyvEt1Z-q zd=~zgd1Ju+0#+24y9axYQT1ZJN+MCTs)r9=6j}6x%gB{Lli#rxQ99fmBduQz( zcTz`1@Xm&*?hXfSxcWEnYIEcg?QoZ_FbzpZHNZ!e_t<7azavC_23+Op-qMH50^Hnu zXs%EDT@B-VEaI+0UjRpvX{OB~9$56bD~e4Vyr-!wcM(!>^ZSQ+jIHhny}Mk}h5T}} zq7<*wQIVa^n-UDU39^)r6vOGhF!jwjPeP=G`ri3>A*jeO@x*$}0)pxXd5XrG}Mj?I1D>Xq|WQoTrHLk3MrF z$aB9Ena(st-pxg#wW>Xl#>Qo3%{ZUZXozlg!^V-$HG-#Q*K_D$BNphNmHq`GmW`4D6NZW=K{$K5no+WUsCeI^An2J_>`e5sJ>kA=;mklRd{ zDQ-gLHouN@?)QI&S9!dyw9SV`-I@cy>DIuBz1#Wj%)tGE!?v6BYViTVSy5#t;&G~E zF-tdH+z6C5q1`jqXEPtkfj3OCjk=&tWQ8;S$ELt$ESygktS8k;W0Vni^L}|Z&4!c0 z?c$TpfnPbgpE`hGlovoDQENV_O=7K{(aNCs4j;QMz1h&sDUBTEZQi$N;{Yqpt%EiuR>StaK^Ff7s$6c`dbh*WC$uEElBJ_LjGS$RgIJZ^k{H-^xDZ z?qAn*NZ{8ne0Eu)`Wa`*E*fXuE_xrpR(V7rxzzQxUNd$yUSr_=6=3KWb=kj>WpvfR z;hde;4itBxe5$4oa~Qr1d=gz2Zu)!_*ryqB=Jl^Wcpiw11IeGHTeB`1{(6w4AYHPj zPf}!d%*U}tCcPSH>HCAx#5YKq#|caJj-a8LF^i3xWH(i_M2X86O`r(M{y|gF1fMQ% z{}FU;dGi1qgYP-ZZyL#uHP;6s@W)9suPVrMQMWmaFc)^equy$TtMWNCF2&xtw@soL z0mu}tMN+U9$&D33LX1DXC$PS;&{TQ~ zV^h(l@GB&f&OF$#0HqIj`|~h;J~ZB@m@Yw4Fa1@JCOyx#lP?BM3%!K~e5x$Brlw=2 zyO9Otk-s|aS0+FJyFgSIYaE~AeZF1P4tQl2nBdzu94B8EBq?xK{fch=X8!Htj`^zP zT@XJk)S*T$erqK@JM^CC3=p;v9I(p6)^e(@LejFGe;cT@k|pU!20mQb0=kPPzJf{n z1ju@p**>rxO$YqUQuJJjHKn+hQVV5$6$N3k*~fT$Hx{}zkvvQjz?X`f+<_$&UCW5{ zqlw}!aI=+`5A^_-|?YRwY?yX6`G4U-y*}@wP47k45Fl#MW#PnWNx~;S%33xQGwj3sLJn*L9$WDT)r`4I!*Rey%lV)Tr zjI*wwBJ__}?;QnW+azW0gLX)u_*xtR@f<0qzO{=YX3^6CB&zTQ&=ol4OAyz^ld*-U zl00z%iAb7%rYz zD+V(YzagC;>i!)+S}Z;-Z0ZgH8G5n`h{qw28sEXuIGFz@XvDbBm-Ai3Hio>vUKR^r zHJ4g}4q8hYI<)bshJ8QRLmX9+I40lP#^nt2N4m-SCD~}e-LNG$y`i*1S!buxr zq_s1uo9M_G@vB5o@W5*B62QB6$W`Y#U;TD3aXsqcM*QAnb*kyHry0)|mC(RGd0FO- zZofc&R7vD`7&oKz?=CBGC91l^e{V{_Fcx6Y(bhI}a=|y0yv{rJm zWh(AClI=25JJHouIcm+vkxBX6z)!UkUDqby!_L&l%!+ROb8W>CED*6 zo`jr7zW}TgbQ^Qu2aeQi^V2i#TdD+{2%Z*)sLSE|X}bkjT+|PHfmwbp;pkb!n6nf8 zkq#$mm3MfWl@p%w_CvNyH_$fVhudWQR8KgpO+GXxfKJ>>+9n*0-OjR5wFg#e3YDm- z$?rb(q#0FIhtur=uF@xMB=8QKDv4d}^B7_lMNlJF?KSF~P|(x|W5dy!zj5COi&st~ z%3V$Y(t?gI{LfUu2O-*m^k>?VSK#l+m!+sqRBAyS0dl&FG9@;@DZFJ_4a4=6#wEU20ky* z=Oht)%{qAZ0!XY>eSpQj0OU9VZu~C_hqD~3u8j0-U;Xsu`DvKaKH=c=|jo z=VVnMR{sw^(DmF#FqbEquq8-0k=W}hSn80*>c6E?SDPexN`CM6d>yzDv|;nb793!N zU*}?CCBu3?|DwyNn0t};anetQv~J&=t%hMUwvD?FuyklY(Wvkj0$yK2ue2{uzd!H4 z^F4;?2ru60&`@8nIIk0@91xQ=486Zsa-`)Xch581im^+giZ^$!Kk6p)z=xZ zy?62E^p(4(^Hvs?Jax+5htzz{8{qrLL>ZX#Z`&XWXna?8q28!zi4;Fvxud=@E;IArZsyON6jhDI zHosn|m?K$ap**FovY`CWS>U)foN;II#@F3(wCQXL_QcvB5$d>|?I@$r!OKy7nv*p0 zmr5A5_HB~y6I*=4bE+6u=_JYP$gmEYYW`YmUBCWwhU(mA!io$m z4Hb)xSBmtv-EZ=5X8}i zFDWRZsWSeK9>Tm~T!UzC$l+GoQyg5GS;@Hd|Lb935ZfwdxgE>q^Qrmu7f;N;nu2e1 z%y;kp73JSbof^78&-=O=zXX_dUS@t$jSpHub?ni&1bUbsu>FCWoV);hH|=XF)<~P&)nTT!_6tBiH{=CS zVtg|iHt4Up<~J#saTH&<^$tDlgY7e<2%6s)-89HF*j|p@(ni?T>L9m?gVC$fLchO` zh)iMfTi9%E0lHbtyQ^XH)%q1Q#3TUuxNmQVf6;s|MMNvt`L4g+k3!1BX}gHtAd~z3 zX1K4W@}r=g+%kgHYw(z;YyeiPYyl55Kz`UDTEtY&J=Z-|w>I!koX=kG_Or zI7UqIL-;+;+Q5-!$PljX+hE}XS+&$#S%d}`e~R71aeJMWRUTD}FVnM@zh#vij;=W! z8lg_2X-s+-@KK43tXR$uxCGO4R;D6L?7}?&67uKLsdnc*EK+lPHUJgHP}*u43hsXM z(K=mj*i)rIfF+|N(!2RiJ{MUS#fU#;fQZs9#6;{KOO zk8c+(F+cxFyLUKT&t0u<4w|w^aVq?Si1D|n6r0s8tprFnHLE!W6wf<)Raw*5Ae-BA zuKMTeAHfM>LZ4wj+N!i4G7|WS|Jax~P8A~&@hMy)x4+tqRA0SwxTz+H^wJo%7PfIB zyX!wkzow~+X@_?A-qEnk1ZWfk?T>@r_(y=)%52r6oKo#YO)0kDqQubeE>EADQjWGob@%*_zsRKi;pv$IxX(4&FH_zc z&FC4aMm>Gj`cXXQZ*mU;#&R}>zg`PPP4TbR7ELG68u{2=kg8t%vS%tvw)?)-DR zV&+HSkF3^oG7PzbfQwd$4sHEeh_@sCYgp)jhAf@4DZ>Q2;*=^Q=YHyO$N{S=E_{5Q z6xtod|7^Ve0?^6Z9<$67-p_g;{$t15;TuHa=7e7-;fl&2HnGvm+O5Y_^G7Sm-ziwb z|7IdF6rg7fCI5;vU|Eo_t?SbagM*DSUS`E0&zQpIR?p=znd=UA0*;w|ZzOx5ngCy^UCt!%#9Oxu_%F9Mc{p)P-%qYT?AOhj)Et z2sck*gEg*8`t%q~kLx)~GO)64lm4Np-7}YUb%IGQOZ*!OeMnP%!49Sg!>6!s=WMzE z&}&9w>%>G%?F%e$M$v?A#WcAw6%m6x$E%&8a@dM;qgRtDK5#IJ=v^uCL33DAwa1d*0i+R8gi> z$Gy^8)s`=|9d~Hr&K6Fmv^F}3rcLKweO|?-31l5~`5>7fpj*S?=t(VzW1;vS^s}iL zwZ8Iah?&YJjx(zugr0is!U$ATY#T7q1Xf$+t!T$A!V7me74s67OfGGq%zN_!NUB4m zXn2SLB@Sz!IsFT-&@v@YN7t=!N7PTFg!8z48bay1{3*z!!o3>pNC`8lARCxHTzVMZ zA_NZu=?vyEzW@}w=ZN|ZRqG70N4ZWtB3h$wg9FOy2{PZUa=)UHq8NGK!WJO!NEdR+dr}>_Bzm;bgwP@^s<*&vHiOaz7(>86mCBgQ+y9A!cBtY68z(xwV~nF9sQ13 z%NwF6$!w9#+metX)ILpP#0c9RPT#rHzRFhi!0Y^jldk?-)Jx+ag*lq!Jc&Z!+h_%eLV`2@-QxyT}pWj^-)olqioQch}v7X}rC ziDX~@ZeY!CuqdHl1N!CC;Ox6)*Su9zat)~zrI~mAFu-iqSYSfaoCyHlnG8e~CjW__9S!?%IHFQK7 zmZI~)x=C^}uP>p@$k&LixTnk06WBmm>38HSsvq`cKa!$|mkf>+HXYi!Y(ke~^$B`+ zoNqT*oUH@>;^&dU&ScS@+1&RUAkR2cAVbH5O4yiJQg866XWsea*zal*cjXfh8jEg5 z$tcF6(JBX~OqBL36BaclAbVq&k>MA<-dwd}$YWDo!%qi@LW@JgCi6zqeOgV~uR#OY z`{-<=wI9?nMG35-fiMdd8Qxg-vNRTa@6|o;O`TX-jqg;k|J`(973~|)B=|5Gc2}L$ zbg^2f;F_}~HEn*c>Bm@XUKOp4_u*)s1uc9xEd4RT-}!3};mW_o(xtaoDEB<)7%q;X zZy^*Y*n&oEbcQ8{k$CMYgymls&DOmM!dXRk8h*j_dVJt$tzOJVul6)4f zIe~sUDeEgRPt&=^aU2ue7l7G&SAB&3HzB;moXTz;x8p zp{qVudb<4sK}+5?&=JjTA>Emp?SUGMF#`bieFEZ&zz^%?Ov@acV(x{?Vnl4cHn-|B zxM6>Y%#;UmN61KQZWVVE9z;cSz^Cp{~=~pK`A6WIL1F z;n4?o_=Qile^dC$99RDoOkG-TnwW7;txx2tbXY^}=T0N@F?!p0J( z2fV(EB*#U!zI6^`U&Lb+gc>DeTNukWBo3&vRTd!ExHj*t)}1ji*@dPCvz5TSx7zdZ z1Se7Y;k19NaieJpNji5fC6LcQ78jy;G2r?o{*23O9MJv_Hf)~pI2RGK_V%a#m#&@V zZysPK0=MOY@o}x5y@kpI~IQQk6VUhEmt;GSf=^y&Boh)7aO4gu}J2npI96 zYT)G9Ng>6AITw8B#@HEIPEyG$zB`|3_i3tY;t1levVi~obMHd5fE!uEPx2?(LK3%z z!+vLB6+*jWQl&zOV@vzqh}{cl^uyc^y_(^4eA6o`uJyGza$clO^SKgU zcNSRY*0G|s{DpB-3iZf1qg$kSNb_bw{xoCrLmm@6u)FnVpgW?@AxX9##ozKow~eR5 zESnHgrtB@=gYk%^4rIe!ky(o2GsJ zi`{oH3BoDkRPl=oUdU!j6cgd-STrA4f2+ZDj-|(NrQ;g?qtaId1(PQMGx_1H%wQOS zy$ui+71loR-WH{jb>v?42TG$aEhqARDOHw4X%wQsJSmK1(9~273JK~o$ zX$%sDwmGhZXc;DE{~D_h@UEVop7_ zjaOgsRN#|QbMMdbsGSR6k>x^q7AJYJoq$%1m^?|W4Q2X*S+IV4of+NtL$S}}KjqHQ z@ui>FKkQuk)JROJq7QaD>_B;qt5QBq+i#UL#Vf~2l>n4{|^3`Oa zUQEK}+o1GD={lAgwysN`f__13eH<&nfTs5}tpQI}|o7sPZZT8=_ ziqN}>YB%L?wi`*RH+L#Mt1Ft0=PtXvZ|Uvr;Teo71Eqx2-TivoMRUo$vrdew3kD(P_Nu$Lq_4omh+tw1!viP zFj)~`9|EiOHB~jKT5g9oUvY$T4jXlItBd8i$xlxCFwKg&25vozezZ?~Era@?K8?xZ zYUiXg$;%uShCR@9+49!K7eY}>e<4`6g*o zNMz_r{iP((IXU1~c%;ATMrsu!$@3|aeZ{M#mx%!%)6hH&w9tW7@?3B4pO4x%ep_r6 z+dtPhC^yF?+A-Yo)=~xEMdF;gG&21RF%p})WSb#D)*_qgxtn$P8Z-B^bZ^+ZdjAM}t*aUuR;dLW2}*WP-v! z-umPuDQYQ_Ez&IT_r@2%D}%`bW1rVw<~agdX16(z3Uj}NENF|M;9Bv9qKH`wYm*%3 zVYlQdkb!qat{1{bHh*K}E`-*4dW)k4KK?xV}@!wqi@I~U?9G9ms$XRqe zVUc;~>n{1|Ds=|jkMqN|z@}gKsq2=blA5hLwYsR<uiZ1`pd}Jkm!8` z1;^6Pd0(_hPpvM#F+US@7?PN?wcs1<|%)9}W8 z_m(0I2Oh@8^>{`00wB}$tPM3rh~inM1(2B9Xx5&ulgIp8Q_bkWC;vp<;b60sy-)|G@f9y;kC9rwg+@XbYeGDaM# z(=Sw8r+vDtIJ~9EsZFm=yv}Q3Efsl-6lYes93TvJh(+hFh>h(BCHq%5uN<@&fRcy^v%NCHkneRw_H^Nb zJD6O3KlB$O+TX+Tmv*B;!V4B5Me!R+s<@TShzn6}YfItuoX13xo|CyFF93zGN!m}3 ze-n%XHQnS%Alfr}$7G0OHd89&bordwA@ZJW0G;QGyWhPp@0ZYjYwxVXs#>~$e+X%5 zr6r_Gx+Mfb1QaC&q#Mqm4&5OQhgMo?q`N@`K^ml_ySp2|t-kNQ!oA+_KJUNZw|O{l z&hyOgti5K2zn=`L6+?Dpdp_+I#k?TWJY+uHbN66Vi(_S&GgrCioz(4pwB+sJ zc1tk?Gh8dc+d3Tfn5wR%Zx^(lx1C0jG;p4ad|uM;trfpW&k-3h*FKXP!EePZ!hbHQ z?ce-U}p)69mc=v2r{AS%&z0Ie{!MTZpdZSJ+baOnFA(k8se(pjQ zXA^jn@Nvk5wB(<0McnJT6F z+z-Rnd}zib`0(zUJmWN}9?kLH`#|d~y6i7_o~~Bp-EVKU(!VJ2A!TS8`I4E z>fLCsWr#zLZzel4IArJ`140OCSlyQD83;ZP>LKl(yj6WBWZ61{ zsFPbpJ$u;~cVp+3I1+c92@ToWH?zaw5x)V{`>jjBfP4n$BE4amDcgN|66=z+{IV4Y z9g8UfyAvr+fz3fno%M4YV|>Izz!P&vR!wd+!`CEJWZfX5Q?$5x@@GV9%ps*gB0!w6sg>83K;6%}9 z<3&{$I&dF5nSfH>y_?3$L`ZI=k2HS4NC*{i>}Z#U?T=n! zAMPmgwIDgJ^>8D)AyISl23tO4Qe%Y$FFbK1LMB{MEkD)Txar982|0k(FuHzKDu0ag4(A74 zC!75|y(ooitx@UE!Xx?YxOn1Cbfp!G(Pj48#JhQ-dDOlMMA^$<@hO z2C0BDzY*HQkWLcnc}uD24|C-LaVH3uIOL=1mtNJcFK+@H@@AL6KOs1b0nWq9PyYt; zb`UwPE?9SR-@o+~*wjZbyaa5$GdLnwc6qe0?t839OXOkZeU`f!1n2iAc8Tmv1^I0! zvn{>hz&B7Kc=|OhPhs^KbEHe^0t=7u8vUl5&f3e;7^hc9ezjbX;9`wLUW0x|IW~L! zAWLwawYW`xp7oI?$$UV=#VqM&5i^oKXb-#_hpqt-fGW5RVt;d5d>KExjLF%^sjXL$T zRU8#}O&a}g%<<13<}t02bcE1#P_3F3%ZDF2N=W!3hbbmJBbjh-L^dOJtpL{l0E?}3 z1n<1iORR^~!lsY3j7i~tx`G;eQy+1Mp;aeM;V1WCow&k`Z$_q)m$*M zK`APfYuOEdFz+@uHI{v@_g$y*F=n2;ul5}!!XL?-p6v} zJ_V!PQ!`yOk1*j;Xepn3!S|lG=CG7RM!aCyGZq*qIx!OMH;`~){2aN#;4A32iHXA8 zM0m+zGfY=^p`mtbV`-52JYI%@%UB7C+Dp*yWimUF5}rF0E|ecRi76AN*q^4PAETnI z{a*Rv5wkQ1Yw~~^=U9o1_an~{c8TdIP4&11IAyeLUPC)y+Ss#ASzA&7m%~O)s!2eH zB9TW|O8oHlT*J}*o~0kRh{~exb%?`VYj4v$0{^Ihm!Yw7UV81hqqA&@SXg^9OPj3`V@ ztqd;K_F!O1>mfT#WynP)&B0a&tgcl2WyolEmiIL(N_e5V>E>NJv{r;d;poS$t&=2! zw`mK9OD`VkKcgy(ZhyiE)Q9kS3vk~O)6)9*=6aIo~o|G}NZS)ZcFB@3FBXaDXXFOzKn+hyFJE*yc z;f{0kfiVYA`6~tB!gnQjp;BNYJ-YGXU_E$Fs4vXMyFbryDE-~)Bujr8iCH42c=eY- z)=$+epBiIiLO$75pccuT#22;_YCu1)3yGxWzcxTS!5RIWCI1Q1dAG%Z#>VR_dSu&L zH=~bjJsz+U0oeR`x;0HSRHHx*5$oC@f65%cf4=`70}x*Sj#s2IHjz#_qMqI?i=Bc zLyPkv-oX$QexjAoiIP^;yxV=1T1c&YdsZ6VukYlgHXk0UDdoM&2CtFjlxi2SmqDpytGxo~Ao#juOz z_CK=nQ+sc;p!A!R^!ThQl2HB``BxOc&N`Td0=E#}|*GJ;=!C zOupNi@hq(YwYE0519aRr-j6@1sCe^Y!JJ`N)it_3gJY!Ux!aS2-mzm%2e*N|nfpjz zcUoA{@{uv+;3t>6-)nOu>^sJ((8)RuJtTkpi@#Q~rBn5JVD<59n-v}Zfq~}aVDj`=$bOCE25auHc!)-+@~P=bmef%( zxWBwFB$aTJ{Uy4lWGYLRrf2Z{7-sU(W)=9t{n6+WOWxAiDn z%moVaj(6*0uDl8*5xo8TU99v`kdRaY6l+O7O1`<^Bm4^+IoHRF`>gR6x%mg=I~@M3 zn9abtb(qR*85fbQ>ZrQ&;MvV6#%xn&rDR49eg()o5Q!)#X@5TP8>nCxSASF@E+Ass z)V~pFiY9k-I&#=l~OjZ9swT zbOpycuWg-QqV3IG)Vfi}@o`zuj$}9o#Z<`pKJZN7NYbEh6k0;&|Kylal(wvbN9F1* zEkj#~^YwE*ZQRJ6&TtSa4${nPVnjs438vMYoT)KVvL&o$MKbi^3M-MqEkpu+(T2yI_+-;%BwV1ACGDo?j9*gXdueC}LuHr1Db8zq zxQFl=)v87tJnez$w9kI*CV0Y15dgJK-e56e>XcQHG)eWf zJUzTeynv+rZCcrjaWF!{V&xRNL-Fd7Tun@?Rz>Jgw?p3OV5vySItSrl6p}oe+cxWZ zc-VLXFzh@$xESqbu`Tm`#46m~VU^Bqs4Y{?xb=L!D7sA+7L^_-S-gOt%Um+_{Dg@#^F~kni?kl2yyXK&Ui%Gk$CDPNTL|ownMV zT1$Gas>#qK-7}#bmgDf!QgmvTO2!Qi2*`ijyOBs^DIFSVBFr$FLXPu-0p|v-9CNvr z@r}wTcWk;l$4f+SF=GN3H@TAWq;FI0+{lFxcvV{x@zW(#wURZv%Q%K~^A=Y0 z#-TgsYw~SkGch1yz?ia;!!P@-onMoGB_G+<5)Pt!O{!;|*A5R)F$&r(^2kKU5P+rx zCK(D+xk_$H4QHGw9mZPOaM`29I;WjzH2dKASA*Ry_LS1%o8nv(A`&ql&7qS%p^6iV z{um}Qh~aTp)|Eb`nqJLTj|gnTSiepp;jOw|F&24Aqv9n^9jd+BXL$n7JL03*oOf1q zat{z;{|HJIt5g&T#c>-$ALt6BQa&W-s`S@aU)t*=h3k!)aM!A|gj&p!4!RbJ{G z1lDN8UQ(%_L_S?In^c}Ua35vzBE(5BpAKH~9ze^Q}4G2974VE38)o(sse#QVvB zkd;9e@=e>>M^jdeMW(v!l_78SSw&af-=zfJ#`N30WEL(_sp^w^ufaqUUNacOPqTO1 zV89PZoH?CLmr2GM46{+%JkT%knq1m&8e{NoS8XV*Wb6x%u+wK-MOk7Lj(VoW<7{X? z$yQNT3_PrTxis-x)nPft}Q=VvG#8O$gbGyYFc;H|R-%0@? zVhR&T&c08dQg=LK+|E#WX#`_Dz>kyN$3hqhQEnMikyB9B?*7nd3oT~4HSQB$is`fy zDw^LN$n+`a7I8%2=u);^l^Bovw-I?61Vnrg5(ou2O`H-W*04904jh@Ti2wrO0H0V| zLho5x8`%6f7oODtY@XXcVLHZ!51Kw}oNQdyETZnPGuI{fb_0nds!!O1u_GW0j4Ev+ z*fQxF7YQ|yc^CY$?Sb%;%hK0Tjr($X+Z4gkrmP@MN^Jkw9L??;`0+{e8DhktqAH`* zxQB3VDCqg^J;^)*!;-4(f{QN8WvDJGBa68p=OySJ-M4+ubX>Z`4oTW;fD`{(L2VKJ~;9 zbHR6EXnixT4-w0p83cY#Oo<&6zr7_WK=5=k$2K!_T3a8^&CcWtlqgTzD+TGfENX5^ zzOQspDn4Z}W5ngD0(yV#>ln^{_t>vbpmk6doAq(D42!r}YTowujd_)EPZUtgobV-? zsxXjJ`=JB}MC(?-VH-Y7QDJBqBh_A9R7AO}<*#gC=FL%4(zh&+&?DIqPUxDKox_A4 zOx}QuRgNhup+6gjhP6CHF0u8YlrzO0Ow^)sLTurm;+%tE%pF~lpRxMJz33C+oO9QS zkfE)YxHG(v>Q_)8aY6!|%>NAmbhS<+_?IV~;X$CFTObhLf9e#fqib%U0ChAsu=!rA z>&jCWqioo2$)(>Kcb$oM5s0zhQHhpHPuvk0vZu59@Ln&qnMtw#@`(S5hv+-TC|Tp} z2j+mV{%gBl_$Z@jz2WYh;Osk;TE_)_tP%E+h{WCYgJW_ilVDl7EV{xGNZ2aq}eo zqdx83p05%(pZRFQpJwUSzLNNao2{F^v>7P1a-SyBB!rFW$g5{noFNfe10`tyx#aMv zswCBUx^NbnXpu`U$y!lvd-3UPdJgY7)u7PBEflJ;M;A=a8ef=pVvz0L5}=@!FuS>y z+(6*>#)$UXIP4W^>Agg0;?8j~*qp1FQ`E`n&M9!Td&Zy~xFYOUlfuY|*Y@l)FC86< z#^+dF$7;Ch`~_a*<;JS6GztDvM0a@zBmDFmD0F#$#%|aBbInBVrBu$z{k?=Qu zL%U`HFGj|VQjUO(6MwbUXX^ul*?|9n{NjJ?ObqP*@IS!{jZfy-up7ckX4Rfas@ zjSrnFBUYaZJkzYjvl^owHc_L_>-B{lTnZl8)ePcZs#RGu`gk^r--QooO|)|`w3*Ve zxf5ord+;jlRxIcJLPs*@&0LWS95*>tVlgIxiB-HT6zT}=`&mX`k$f`)r!MQe`SH%Q z$p^;nh<{Q@>I^4YquOS@7x?Be>)3&+d8rpHM}yaNz)P|+#C2EgpqZWD5Hn3a&==p3 zJ@mq$44=j>*iL=iN|O5pvGeo&WBxc;2op_-xUrLNH!p^oc4lzKkEJh}v+?o@ zp}TJIgedp4({5I#J^oV1JCO8)fXO~H@l9VGxI|*g z1ITS~ky^nAJn{va@Kk>_cfg#fBa@)Zczl0 zx+U!0#3$MgeY7Lm34*t-LU%Cf*lV47;hU94P$bJ{_oo{e8D-TDmXad$0-S0#EOfobIn|_HYm_bgucRB3WozC(2U%!Dw;d{vS9s4Zbo7?eA z9QI&M$A0@%N!DJsTCFRZS$qa#g?0gLaha&2(%QI-M(p*6oTI|UFI0QenaGdoikjOR zj;UyI92YSeGmZK@)!WKorfOt}xsR7v)Co7pMg*|AAQ5ooRbb|V5tyjxHfzz4z{Hwg znN)Hw=3%&m(~V6$so*mhir6-e)$q)ze=Ek;_z|I7KabG9{MgG18^6={6Pn(O8f`{Q zQ#s+tRUNJ(2wKaNch1Zt1ydbbqmgXs^8GA{h`uEG6j%$k)EDiFtrAqQ;Mr*1yjV%M zkAz0rpu-IFkT8RIU&z>o;1kk1!OuE6!+<~HQzJ$vB@Vs+xrNFY5%TO z-2fvm$pLM~3usw5zqTqp3u}Y_->m-hATANl%s#SVw@x9SVbW}Y<5m;U!LPu_Tsmw9 zdKQ%Y+_}=?5ic$dWz_S~iYsc)zHPNm(43eTyf;Q3YEvWdr)CHg-BWv1$Ixra56h&t zPBLkHuO{w^Io+FE+t5+CRcgR_s-OdF)u!@=wialJW)af?> zDbzXl1A~lA1RBwV@H#oi;q^GN`*0YJJ-8amS3zESS)!hYn2|oyCBxoIn}*_<8hp|F z$Oyc7bXJyIiKM}D{nTAqCB7%9muj`H(43a%6&14{?HZP==>=~)cla@IDn7V?&vwIn z%#=G%9`c>5c{vCpUP!V;F|X^NsnV>FipP=jZpBihu(59(2{I(7z8+p6jehZ%mc31P zx3CjMF4_3>cp}th&>iXh9OxTfrj>wcfWB<&9H@>W33TyfxFO>l=#zhXb~tzz(4TV# z)}x(*YQPFlF@BCO|5W?;|J21TAW#DcR7=s((!l2BcdL|_xe72ohQ0&x|A1xzGe*Bs zdJp(YEo%dFn|rL^U#}O$E07X<4it0+5;##@DM*L>bM9heZlZ5sbMGhP#~Y6C68tTV zbl)RQ5TIEAUwV~R0Zfj*&xHO;WB)CUkyH399zat9WCOBM{c^FP{iOXA>ig^pP>&AO z!~*hLSWB*f^C6%e2}}^6_+Kx7KeP{EH00JL6vvvO10yw$Llp z_VXjI-)iXhWDb*mL+1M*$b6>%hRpk~$Sha1A#C<<$n0$Y3Vl`456%A#n*VMJT)4+S<9<}mbsW+?^Ys5xJjit%Nf3H89UxsL&{bc(*@M`B#{ID7>o{EOz^W~v!!-r;cNM3e_|Lc>?*2NC z@aBc>Hc+$nxYuz3Z~qzhqhGp?8x>5K9tCg#f5BCz|1<7~U%!s~y+7!C|2Mc_22(#P z`$yaO+aXnwnf7f&BoGKpe0|(9ob!_mH8ubn00~Ed*I$en7$N<*C_%C)7u!PjK%nox zS4TcKi+>Wp2KpvC_e{V#MgYMQV)XOw{v>R++R?N=0DM32dzIik^A`fg-x03oN&Sy- zz#k|z-0!lcURUz<$oiiUKQFjHhH!txxvm$#9>o2#xVq2J;@3jD*8$ffYkvZe{eA+j z#M!PFzZ$^#voHuW<^PKg{u9o*Ui#`p_1Dte!M~LL@3d831~|tMxEO#RU7#ze3WWpS F{U7Note: currently latex builds do not work because of table formats that are not -supported in the latex generation. - -2014-01-30: Latex has some issues but 'latex_forced' works ok for 0.13.0-400 or so - Usage ----- -python make.py clean -python make.py html + $ python make.py clean + $ python make.py html + $ python make.py latex """ -from __future__ import print_function - -import io -import glob # noqa +import importlib +import sys import os import shutil -import sys -from contextlib import contextmanager - -import sphinx # noqa +# import subprocess import argparse -import jinja2 # noqa - -os.environ['PYTHONPATH'] = '..' - -SPHINX_BUILD = 'sphinxbuild' +from contextlib import contextmanager +import webbrowser +import jinja2 -def _process_user(user): - if user is None or user is False: - user = '' - else: - user = user + '@' - return user - - -def upload_dev(user=None): - 'push a copy to the pydata dev directory' - user = _process_user(user) - if os.system('cd build/html; rsync -avz . {0}pandas.pydata.org' - ':/usr/share/nginx/pandas/pandas-docs/dev/ -essh'.format(user)): - raise SystemExit('Upload to Pydata Dev failed') - - -def upload_dev_pdf(user=None): - 'push a copy to the pydata dev directory' - user = _process_user(user) - if os.system('cd build/latex; scp pandas.pdf {0}pandas.pydata.org' - ':/usr/share/nginx/pandas/pandas-docs/dev/'.format(user)): - raise SystemExit('PDF upload to Pydata Dev failed') - - -def upload_stable(user=None): - 'push a copy to the pydata stable directory' - user = _process_user(user) - if os.system('cd build/html; rsync -avz . {0}pandas.pydata.org' - ':/usr/share/nginx/pandas/pandas-docs/stable/ -essh'.format(user)): - raise SystemExit('Upload to stable failed') - - -def upload_stable_pdf(user=None): - 'push a copy to the pydata dev directory' - user = _process_user(user) - if os.system('cd build/latex; scp pandas.pdf {0}pandas.pydata.org' - ':/usr/share/nginx/pandas/pandas-docs/stable/'.format(user)): - raise SystemExit('PDF upload to stable failed') - - -def upload_prev(ver, doc_root='./', user=None): - 'push a copy of older release to appropriate version directory' - user = _process_user(user) - local_dir = doc_root + 'build/html' - remote_dir = '/usr/share/nginx/pandas/pandas-docs/version/%s/' % ver - cmd = 'cd %s; rsync -avz . %spandas.pydata.org:%s -essh' - cmd = cmd % (local_dir, user, remote_dir) - print(cmd) - if os.system(cmd): - raise SystemExit( - 'Upload to %s from %s failed' % (remote_dir, local_dir)) - - local_dir = doc_root + 'build/latex' - pdf_cmd = 'cd %s; scp pandas.pdf %spandas.pydata.org:%s' - pdf_cmd = pdf_cmd % (local_dir, user, remote_dir) - if os.system(pdf_cmd): - raise SystemExit('Upload PDF to %s from %s failed' % (ver, doc_root)) - -def build_pandas(): - os.chdir('..') - os.system('python setup.py clean') - os.system('python setup.py build_ext --inplace') - os.chdir('doc') - -def build_prev(ver): - if os.system('git checkout v%s' % ver) != 1: - os.chdir('..') - os.system('python setup.py clean') - os.system('python setup.py build_ext --inplace') - os.chdir('doc') - os.system('python make.py clean') - os.system('python make.py html') - os.system('python make.py latex') - os.system('git checkout master') - - -def clean(): - if os.path.exists('build'): - shutil.rmtree('build') - - if os.path.exists('source/generated'): - shutil.rmtree('source/generated') +DOC_PATH = os.path.dirname(os.path.abspath(__file__)) +SOURCE_PATH = os.path.join(DOC_PATH, 'source') +BUILD_PATH = os.path.join(DOC_PATH, 'build') +BUILD_DIRS = ['doctrees', 'html', 'latex', 'plots', '_static', '_templates'] @contextmanager -def maybe_exclude_notebooks(): - """ - Skip building the notebooks if pandoc is not installed. +def _maybe_exclude_notebooks(): + """Skip building the notebooks if pandoc is not installed. + This assumes that nbsphinx is installed. + + Skip notebook conversion if: + 1. nbconvert isn't installed, or + 2. nbconvert is installed, but pandoc isn't """ + # TODO move to exclude_pattern base = os.path.dirname(__file__) notebooks = [os.path.join(base, 'source', nb) for nb in ['style.ipynb']] @@ -135,304 +50,327 @@ def _remove_notebooks(): contents[nb] = f.read() os.remove(nb) - # Skip notebook conversion if - # 1. nbconvert isn't installed, or - # 2. nbconvert is installed, but pandoc isn't try: import nbconvert except ImportError: - print("Warning: nbconvert not installed. Skipping notebooks.") + sys.stderr.write('Warning: nbconvert not installed. ' + 'Skipping notebooks.\n') _remove_notebooks() else: try: nbconvert.utils.pandoc.get_pandoc_version() except nbconvert.utils.pandoc.PandocMissing: - print("Warning: Pandoc is not installed. Skipping notebooks.") + sys.stderr.write('Warning: Pandoc is not installed. ' + 'Skipping notebooks.\n') _remove_notebooks() yield + for nb, content in contents.items(): with open(nb, 'wt') as f: f.write(content) -def html(): - check_build() - - with maybe_exclude_notebooks(): - if os.system('sphinx-build -P -b html -d build/doctrees ' - 'source build/html'): - raise SystemExit("Building HTML failed.") - try: - # remove stale file - os.remove('build/html/pandas.zip') - except: - pass - - -def zip_html(): - try: - print("\nZipping up HTML docs...") - # just in case the wonky build box doesn't have zip - # don't fail this. - os.system('cd build; rm -f html/pandas.zip; zip html/pandas.zip -r -q html/* ') - print("\n") - except: - pass - -def latex(): - check_build() - if sys.platform != 'win32': - # LaTeX format. - if os.system('sphinx-build -j 2 -b latex -d build/doctrees ' - 'source build/latex'): - raise SystemExit("Building LaTeX failed.") - # Produce pdf. - - os.chdir('build/latex') - - # Call the makefile produced by sphinx... - if os.system('make'): - print("Rendering LaTeX failed.") - print("You may still be able to get a usable PDF file by going into 'build/latex'") - print("and executing 'pdflatex pandas.tex' for the requisite number of passes.") - print("Or using the 'latex_forced' target") - raise SystemExit - - os.chdir('../..') - else: - print('latex build has not been tested on windows') - -def latex_forced(): - check_build() - if sys.platform != 'win32': - # LaTeX format. - if os.system('sphinx-build -j 2 -b latex -d build/doctrees ' - 'source build/latex'): - raise SystemExit("Building LaTeX failed.") - # Produce pdf. - - os.chdir('build/latex') - - # Manually call pdflatex, 3 passes should ensure latex fixes up - # all the required cross-references and such. - os.system('pdflatex -interaction=nonstopmode pandas.tex') - os.system('pdflatex -interaction=nonstopmode pandas.tex') - os.system('pdflatex -interaction=nonstopmode pandas.tex') - raise SystemExit("You should check the file 'build/latex/pandas.pdf' for problems.") - - os.chdir('../..') - else: - print('latex build has not been tested on windows') +class DocBuilder: + """Class to wrap the different commands of this script. + All public methods of this class can be called as parameters of the + script. + """ + def __init__(self, num_jobs=1, include_api=True, single_doc=None, + verbosity=0): + self.num_jobs = num_jobs + self.include_api = include_api + self.verbosity = verbosity + self.single_doc = None + self.single_doc_type = None + if single_doc is not None: + self._process_single_doc(single_doc) + self.exclude_patterns = self._exclude_patterns + + self._generate_index() + if self.single_doc_type == 'docstring': + self._run_os('sphinx-autogen', '-o', + 'source/generated_single', 'source/index.rst') + + @property + def _exclude_patterns(self): + """Docs source files that will be excluded from building.""" + # TODO move maybe_exclude_notebooks here + if self.single_doc is not None: + rst_files = [f for f in os.listdir(SOURCE_PATH) + if ((f.endswith('.rst') or f.endswith('.ipynb')) + and (f != 'index.rst') + and (f != '{0}.rst'.format(self.single_doc)))] + if self.single_doc_type != 'api': + rst_files += ['generated/*.rst'] + elif not self.include_api: + rst_files = ['api.rst', 'generated/*.rst'] + else: + rst_files = ['generated_single/*.rst'] + + exclude_patterns = ','.join( + '{!r}'.format(i) for i in ['**.ipynb_checkpoints'] + rst_files) + + return exclude_patterns + + def _process_single_doc(self, single_doc): + """Extract self.single_doc (base name) and self.single_doc_type from + passed single_doc kwarg. + + """ + self.include_api = False + + if single_doc == 'api.rst' or single_doc == 'api': + self.single_doc_type = 'api' + self.single_doc = 'api' + elif os.path.exists(os.path.join(SOURCE_PATH, single_doc)): + self.single_doc_type = 'rst' + self.single_doc = os.path.splitext(os.path.basename(single_doc))[0] + elif os.path.exists( + os.path.join(SOURCE_PATH, '{}.rst'.format(single_doc))): + self.single_doc_type = 'rst' + self.single_doc = single_doc + elif single_doc is not None: + try: + obj = pandas # noqa: F821 + for name in single_doc.split('.'): + obj = getattr(obj, name) + except AttributeError: + raise ValueError('Single document not understood, it should ' + 'be a file in doc/source/*.rst (e.g. ' + '"contributing.rst" or a pandas function or ' + 'method (e.g. "pandas.DataFrame.head")') + else: + self.single_doc_type = 'docstring' + if single_doc.startswith('pandas.'): + self.single_doc = single_doc[len('pandas.'):] + else: + self.single_doc = single_doc + + def _copy_generated_docstring(self): + """Copy existing generated (from api.rst) docstring page because + this is more correct in certain cases (where a custom autodoc + template is used). + + """ + fname = os.path.join(SOURCE_PATH, 'generated', + 'pandas.{}.rst'.format(self.single_doc)) + temp_dir = os.path.join(SOURCE_PATH, 'generated_single') -def check_build(): - build_dirs = [ - 'build', 'build/doctrees', 'build/html', - 'build/latex', 'build/plots', 'build/_static', - 'build/_templates'] - for d in build_dirs: try: - os.mkdir(d) + os.makedirs(temp_dir) except OSError: pass + if os.path.exists(fname): + try: + # copying to make sure sphinx always thinks it is new + # and needs to be re-generated (to pick source code changes) + shutil.copy(fname, temp_dir) + except: # noqa + pass + + def _generate_index(self): + """Create index.rst file with the specified sections.""" + if self.single_doc_type == 'docstring': + self._copy_generated_docstring() + + with open(os.path.join(SOURCE_PATH, 'index.rst.template')) as f: + t = jinja2.Template(f.read()) + + with open(os.path.join(SOURCE_PATH, 'index.rst'), 'w') as f: + f.write(t.render(include_api=self.include_api, + single_doc=self.single_doc, + single_doc_type=self.single_doc_type)) + + @staticmethod + def _create_build_structure(): + """Create directories required to build documentation.""" + for dirname in BUILD_DIRS: + try: + os.makedirs(os.path.join(BUILD_PATH, dirname)) + except OSError: + pass + + @staticmethod + def _run_os(*args): + """Execute a command as a OS terminal. + + Parameters + ---------- + *args : list of str + Command and parameters to be executed + + Examples + -------- + >>> DocBuilder()._run_os('python', '--version') + """ + # TODO check_call should be more safe, but it fails with + # exclude patterns, needs investigation + # subprocess.check_call(args, stderr=subprocess.STDOUT) + os.system(' '.join(args)) + + def _sphinx_build(self, kind): + """Call sphinx to build documentation. + + Attribute `num_jobs` from the class is used. + + Parameters + ---------- + kind : {'html', 'latex'} + + Examples + -------- + >>> DocBuilder(num_jobs=4)._sphinx_build('html') + """ + if kind not in ('html', 'latex', 'spelling'): + raise ValueError('kind must be html, latex or ' + 'spelling, not {}'.format(kind)) + + self._run_os('sphinx-build', + '-j{}'.format(self.num_jobs), + '-b{}'.format(kind), + '-{}'.format( + 'v' * self.verbosity) if self.verbosity else '', + '-d{}'.format(os.path.join(BUILD_PATH, 'doctrees')), + '-Dexclude_patterns={}'.format(self.exclude_patterns), + SOURCE_PATH, + os.path.join(BUILD_PATH, kind)) + + def _open_browser(self): + base_url = os.path.join('file://', DOC_PATH, 'build', 'html') + if self.single_doc_type == 'docstring': + url = os.path.join( + base_url, + 'generated_single', 'pandas.{}.html'.format(self.single_doc)) + else: + url = os.path.join(base_url, '{}.html'.format(self.single_doc)) + webbrowser.open(url, new=2) + + def html(self): + """Build HTML documentation.""" + self._create_build_structure() + with _maybe_exclude_notebooks(): + self._sphinx_build('html') + zip_fname = os.path.join(BUILD_PATH, 'html', 'pandas.zip') + if os.path.exists(zip_fname): + os.remove(zip_fname) + + if self.single_doc is not None: + self._open_browser() + shutil.rmtree(os.path.join(SOURCE_PATH, 'generated_single'), + ignore_errors=True) + + def latex(self, force=False): + """Build PDF documentation.""" + self._create_build_structure() + if sys.platform == 'win32': + sys.stderr.write('latex build has not been tested on windows\n') + else: + self._sphinx_build('latex') + os.chdir(os.path.join(BUILD_PATH, 'latex')) + if force: + for i in range(3): + self._run_os('pdflatex', + '-interaction=nonstopmode', + 'pandas.tex') + raise SystemExit('You should check the file ' + '"build/latex/pandas.pdf" for problems.') + else: + self._run_os('make') + + def latex_forced(self): + """Build PDF documentation with retries to find missing references.""" + self.latex(force=True) + + @staticmethod + def clean(): + """Clean documentation generated files.""" + shutil.rmtree(BUILD_PATH, ignore_errors=True) + shutil.rmtree(os.path.join(SOURCE_PATH, 'generated'), + ignore_errors=True) + + def zip_html(self): + """Compress HTML documentation into a zip file.""" + zip_fname = os.path.join(BUILD_PATH, 'html', 'pandas.zip') + if os.path.exists(zip_fname): + os.remove(zip_fname) + dirname = os.path.join(BUILD_PATH, 'html') + fnames = os.listdir(dirname) + os.chdir(dirname) + self._run_os('zip', + zip_fname, + '-r', + '-q', + *fnames) + + def spellcheck(self): + """Spell check the documentation.""" + self._sphinx_build('spelling') + output_location = os.path.join('build', 'spelling', 'output.txt') + with open(output_location) as output: + lines = output.readlines() + if lines: + raise SyntaxError( + 'Found misspelled words.' + ' Check pandas/doc/build/spelling/output.txt' + ' for more details.') -def all(): - # clean() - html() - - -def auto_dev_build(debug=False): - msg = '' - try: - step = 'clean' - clean() - step = 'html' - html() - step = 'upload dev' - upload_dev() - if not debug: - sendmail(step) - - step = 'latex' - latex() - step = 'upload pdf' - upload_dev_pdf() - if not debug: - sendmail(step) - except (Exception, SystemExit) as inst: - msg = str(inst) + '\n' - sendmail(step, '[ERROR] ' + msg) - - -def sendmail(step=None, err_msg=None): - from_name, to_name = _get_config() - - if step is None: - step = '' - - if err_msg is None or '[ERROR]' not in err_msg: - msgstr = 'Daily docs %s completed successfully' % step - subject = "DOC: %s successful" % step - else: - msgstr = err_msg - subject = "DOC: %s failed" % step - - import smtplib - from email.MIMEText import MIMEText - msg = MIMEText(msgstr) - msg['Subject'] = subject - msg['From'] = from_name - msg['To'] = to_name - - server_str, port, login, pwd = _get_credentials() - server = smtplib.SMTP(server_str, port) - server.ehlo() - server.starttls() - server.ehlo() - - server.login(login, pwd) - try: - server.sendmail(from_name, to_name, msg.as_string()) - finally: - server.close() - - -def _get_dir(subdir=None): - import getpass - USERNAME = getpass.getuser() - if sys.platform == 'darwin': - HOME = '/Users/%s' % USERNAME - else: - HOME = '/home/%s' % USERNAME - - if subdir is None: - subdir = '/code/scripts/config' - conf_dir = '%s/%s' % (HOME, subdir) - return conf_dir - - -def _get_credentials(): - tmp_dir = _get_dir() - cred = '%s/credentials' % tmp_dir - with open(cred, 'r') as fh: - server, port, un, domain = fh.read().split(',') - port = int(port) - login = un + '@' + domain + '.com' - - import base64 - with open('%s/cron_email_pwd' % tmp_dir, 'r') as fh: - pwd = base64.b64decode(fh.read()) - - return server, port, login, pwd - - -def _get_config(): - tmp_dir = _get_dir() - with open('%s/addresses' % tmp_dir, 'r') as fh: - from_name, to_name = fh.read().split(',') - return from_name, to_name - -funcd = { - 'html': html, - 'zip_html': zip_html, - 'upload_dev': upload_dev, - 'upload_stable': upload_stable, - 'upload_dev_pdf': upload_dev_pdf, - 'upload_stable_pdf': upload_stable_pdf, - 'latex': latex, - 'latex_forced': latex_forced, - 'clean': clean, - 'auto_dev': auto_dev_build, - 'auto_debug': lambda: auto_dev_build(True), - 'build_pandas': build_pandas, - 'all': all, -} - -small_docs = False - -# current_dir = os.getcwd() -# os.chdir(os.path.dirname(os.path.join(current_dir, __file__))) - -import argparse -argparser = argparse.ArgumentParser(description=""" -pandas documentation builder -""".strip()) - -# argparser.add_argument('-arg_name', '--arg_name', -# metavar='label for arg help', -# type=str|etc, -# nargs='N|*|?|+|argparse.REMAINDER', -# required=False, -# #choices='abc', -# help='help string', -# action='store|store_true') - -# args = argparser.parse_args() - -#print args.accumulate(args.integers) - -def generate_index(api=True, single=False, **kwds): - from jinja2 import Template - with open("source/index.rst.template") as f: - t = Template(f.read()) - - with open("source/index.rst","w") as f: - f.write(t.render(api=api,single=single,**kwds)) - -import argparse -argparser = argparse.ArgumentParser(description="pandas documentation builder", - epilog="Targets : %s" % funcd.keys()) - -argparser.add_argument('--no-api', - default=False, - help='Ommit api and autosummary', - action='store_true') -argparser.add_argument('--single', - metavar='FILENAME', - type=str, - default=False, - help='filename of section to compile, e.g. "indexing"') -argparser.add_argument('--user', - type=str, - default=False, - help='Username to connect to the pydata server') def main(): - args, unknown = argparser.parse_known_args() - sys.argv = [sys.argv[0]] + unknown - if args.single: - args.single = os.path.basename(args.single).split(".rst")[0] - - if 'clean' in unknown: - args.single=False - - generate_index(api=not args.no_api and not args.single, single=args.single) - - if len(sys.argv) > 2: - ftype = sys.argv[1] - ver = sys.argv[2] - - if ftype == 'build_previous': - build_prev(ver, user=args.user) - if ftype == 'upload_previous': - upload_prev(ver, user=args.user) - elif len(sys.argv) == 2: - for arg in sys.argv[1:]: - func = funcd.get(arg) - if func is None: - raise SystemExit('Do not know how to handle %s; valid args are %s' % ( - arg, list(funcd.keys()))) - if args.user: - func(user=args.user) - else: - func() - else: - small_docs = False - all() -# os.chdir(current_dir) + cmds = [method for method in dir(DocBuilder) if not method.startswith('_')] + + argparser = argparse.ArgumentParser( + description='pandas documentation builder', + epilog='Commands: {}'.format(','.join(cmds))) + argparser.add_argument('command', + nargs='?', + default='html', + help='command to run: {}'.format(', '.join(cmds))) + argparser.add_argument('--num-jobs', + type=int, + default=1, + help='number of jobs used by sphinx-build') + argparser.add_argument('--no-api', + default=False, + help='ommit api and autosummary', + action='store_true') + argparser.add_argument('--single', + metavar='FILENAME', + type=str, + default=None, + help=('filename of section or method name to ' + 'compile, e.g. "indexing", "DataFrame.join"')) + argparser.add_argument('--python-path', + type=str, + default=os.path.dirname(DOC_PATH), + help='path') + argparser.add_argument('-v', action='count', dest='verbosity', default=0, + help=('increase verbosity (can be repeated), ' + 'passed to the sphinx build command')) + args = argparser.parse_args() + + if args.command not in cmds: + raise ValueError('Unknown command {}. Available options: {}'.format( + args.command, ', '.join(cmds))) + + # Below we update both os.environ and sys.path. The former is used by + # external libraries (namely Sphinx) to compile this module and resolve + # the import of `python_path` correctly. The latter is used to resolve + # the import within the module, injecting it into the global namespace + os.environ['PYTHONPATH'] = args.python_path + sys.path.append(args.python_path) + globals()['pandas'] = importlib.import_module('pandas') + + # Set the matplotlib backend to the non-interactive Agg backend for all + # child processes. + os.environ['MPLBACKEND'] = 'module://matplotlib.backends.backend_agg' + + builder = DocBuilder(args.num_jobs, not args.no_api, args.single, + args.verbosity) + getattr(builder, args.command)() + if __name__ == '__main__': - import sys sys.exit(main()) diff --git a/doc/plots/stats/moment_plots.py b/doc/plots/stats/moment_plots.py deleted file mode 100644 index 9e3a902592c6bf..00000000000000 --- a/doc/plots/stats/moment_plots.py +++ /dev/null @@ -1,30 +0,0 @@ -import numpy as np - -import matplotlib.pyplot as plt -import pandas.util.testing as t -import pandas.stats.moments as m - - -def test_series(n=1000): - t.N = n - s = t.makeTimeSeries() - return s - - -def plot_timeseries(*args, **kwds): - n = len(args) - - fig, axes = plt.subplots(n, 1, figsize=kwds.get('size', (10, 5)), - sharex=True) - titles = kwds.get('titles', None) - - for k in range(1, n + 1): - ax = axes[k - 1] - ts = args[k - 1] - ax.plot(ts.index, ts.values) - - if titles: - ax.set_title(titles[k - 1]) - - fig.autofmt_xdate() - fig.subplots_adjust(bottom=0.10, top=0.95) diff --git a/doc/plots/stats/moments_ewma.py b/doc/plots/stats/moments_ewma.py deleted file mode 100644 index 3e521ed60bb8f5..00000000000000 --- a/doc/plots/stats/moments_ewma.py +++ /dev/null @@ -1,15 +0,0 @@ -import matplotlib.pyplot as plt -import pandas.util.testing as t -import pandas.stats.moments as m - -t.N = 200 -s = t.makeTimeSeries().cumsum() - -plt.figure(figsize=(10, 5)) -plt.plot(s.index, s.values) -plt.plot(s.index, m.ewma(s, 20, min_periods=1).values) -f = plt.gcf() -f.autofmt_xdate() - -plt.show() -plt.close('all') diff --git a/doc/plots/stats/moments_ewmvol.py b/doc/plots/stats/moments_ewmvol.py deleted file mode 100644 index 093f62868fc4e3..00000000000000 --- a/doc/plots/stats/moments_ewmvol.py +++ /dev/null @@ -1,23 +0,0 @@ -import matplotlib.pyplot as plt -import pandas.util.testing as t -import pandas.stats.moments as m - -t.N = 500 -ts = t.makeTimeSeries() -ts[::100] = 20 - -s = ts.cumsum() - - -plt.figure(figsize=(10, 5)) -plt.plot(s.index, m.ewmvol(s, span=50, min_periods=1).values, color='b') -plt.plot(s.index, m.rolling_std(s, 50, min_periods=1).values, color='r') - -plt.title('Exp-weighted std with shocks') -plt.legend(('Exp-weighted', 'Equal-weighted')) - -f = plt.gcf() -f.autofmt_xdate() - -plt.show() -plt.close('all') diff --git a/doc/plots/stats/moments_expw.py b/doc/plots/stats/moments_expw.py deleted file mode 100644 index 5fff419b3a9405..00000000000000 --- a/doc/plots/stats/moments_expw.py +++ /dev/null @@ -1,35 +0,0 @@ -from moment_plots import * - -np.random.seed(1) - -ts = test_series(500) * 10 - -# ts[::100] = 20 - -s = ts.cumsum() - -fig, axes = plt.subplots(3, 1, figsize=(8, 10), sharex=True) - -ax0, ax1, ax2 = axes - -ax0.plot(s.index, s.values) -ax0.set_title('time series') - -ax1.plot(s.index, m.ewma(s, span=50, min_periods=1).values, color='b') -ax1.plot(s.index, m.rolling_mean(s, 50, min_periods=1).values, color='r') -ax1.set_title('rolling_mean vs. ewma') - -line1 = ax2.plot( - s.index, m.ewmstd(s, span=50, min_periods=1).values, color='b') -line2 = ax2.plot( - s.index, m.rolling_std(s, 50, min_periods=1).values, color='r') -ax2.set_title('rolling_std vs. ewmstd') - -fig.legend((line1, line2), - ('Exp-weighted', 'Equal-weighted'), - loc='upper right') -fig.autofmt_xdate() -fig.subplots_adjust(bottom=0.10, top=0.95) - -plt.show() -plt.close('all') diff --git a/doc/plots/stats/moments_rolling.py b/doc/plots/stats/moments_rolling.py deleted file mode 100644 index 30a6c5f53e20cf..00000000000000 --- a/doc/plots/stats/moments_rolling.py +++ /dev/null @@ -1,24 +0,0 @@ -from moment_plots import * - -ts = test_series() -s = ts.cumsum() - -s[20:50] = np.NaN -s[120:150] = np.NaN -plot_timeseries(s, - m.rolling_count(s, 50), - m.rolling_sum(s, 50, min_periods=10), - m.rolling_mean(s, 50, min_periods=10), - m.rolling_std(s, 50, min_periods=10), - m.rolling_skew(s, 50, min_periods=10), - m.rolling_kurt(s, 50, min_periods=10), - size=(10, 12), - titles=('time series', - 'rolling_count', - 'rolling_sum', - 'rolling_mean', - 'rolling_std', - 'rolling_skew', - 'rolling_kurt')) -plt.show() -plt.close('all') diff --git a/doc/plots/stats/moments_rolling_binary.py b/doc/plots/stats/moments_rolling_binary.py deleted file mode 100644 index ab6b7b1c8ff490..00000000000000 --- a/doc/plots/stats/moments_rolling_binary.py +++ /dev/null @@ -1,30 +0,0 @@ -from moment_plots import * - -np.random.seed(1) - -ts = test_series() -s = ts.cumsum() -ts2 = test_series() -s2 = ts2.cumsum() - -s[20:50] = np.NaN -s[120:150] = np.NaN -fig, axes = plt.subplots(3, 1, figsize=(8, 10), sharex=True) - -ax0, ax1, ax2 = axes - -ax0.plot(s.index, s.values) -ax0.plot(s2.index, s2.values) -ax0.set_title('time series') - -ax1.plot(s.index, m.rolling_corr(s, s2, 50, min_periods=1).values) -ax1.set_title('rolling_corr') - -ax2.plot(s.index, m.rolling_cov(s, s2, 50, min_periods=1).values) -ax2.set_title('rolling_cov') - -fig.autofmt_xdate() -fig.subplots_adjust(bottom=0.10, top=0.95) - -plt.show() -plt.close('all') diff --git a/doc/source/10min.rst b/doc/source/10min.rst index 49142311ff0576..fbbe94a72c71e5 100644 --- a/doc/source/10min.rst +++ b/doc/source/10min.rst @@ -25,7 +25,7 @@ ******************** This is a short introduction to pandas, geared mainly for new users. -You can see more complex recipes in the :ref:`Cookbook` +You can see more complex recipes in the :ref:`Cookbook`. Customarily, we import as follows: @@ -38,7 +38,7 @@ Customarily, we import as follows: Object Creation --------------- -See the :ref:`Data Structure Intro section ` +See the :ref:`Data Structure Intro section `. Creating a :class:`Series` by passing a list of values, letting pandas create a default integer index: @@ -48,7 +48,7 @@ a default integer index: s = pd.Series([1,3,5,np.nan,6,8]) s -Creating a :class:`DataFrame` by passing a numpy array, with a datetime index +Creating a :class:`DataFrame` by passing a NumPy array, with a datetime index and labeled columns: .. ipython:: python @@ -70,7 +70,8 @@ Creating a ``DataFrame`` by passing a dict of objects that can be converted to s 'F' : 'foo' }) df2 -Having specific :ref:`dtypes ` +The columns of the resulting ``DataFrame`` have different +:ref:`dtypes `. .. ipython:: python @@ -104,16 +105,16 @@ truncated for brevity. Viewing Data ------------ -See the :ref:`Basics section ` +See the :ref:`Basics section `. -See the top & bottom rows of the frame +Here is how to view the top and bottom rows of the frame: .. ipython:: python df.head() df.tail(3) -Display the index, columns, and the underlying numpy data +Display the index, columns, and the underlying NumPy data: .. ipython:: python @@ -121,25 +122,25 @@ Display the index, columns, and the underlying numpy data df.columns df.values -Describe shows a quick statistic summary of your data +:func:`~DataFrame.describe` shows a quick statistic summary of your data: .. ipython:: python df.describe() -Transposing your data +Transposing your data: .. ipython:: python df.T -Sorting by an axis +Sorting by an axis: .. ipython:: python df.sort_index(axis=1, ascending=False) -Sorting by values +Sorting by values: .. ipython:: python @@ -153,15 +154,15 @@ Selection While standard Python / Numpy expressions for selecting and setting are intuitive and come in handy for interactive work, for production code, we recommend the optimized pandas data access methods, ``.at``, ``.iat``, - ``.loc``, ``.iloc`` and ``.ix``. + ``.loc`` and ``.iloc``. -See the indexing documentation :ref:`Indexing and Selecting Data ` and :ref:`MultiIndex / Advanced Indexing ` +See the indexing documentation :ref:`Indexing and Selecting Data ` and :ref:`MultiIndex / Advanced Indexing `. Getting ~~~~~~~ Selecting a single column, which yields a ``Series``, -equivalent to ``df.A`` +equivalent to ``df.A``: .. ipython:: python @@ -177,39 +178,39 @@ Selecting via ``[]``, which slices the rows. Selection by Label ~~~~~~~~~~~~~~~~~~ -See more in :ref:`Selection by Label ` +See more in :ref:`Selection by Label `. -For getting a cross section using a label +For getting a cross section using a label: .. ipython:: python df.loc[dates[0]] -Selecting on a multi-axis by label +Selecting on a multi-axis by label: .. ipython:: python df.loc[:,['A','B']] -Showing label slicing, both endpoints are *included* +Showing label slicing, both endpoints are *included*: .. ipython:: python df.loc['20130102':'20130104',['A','B']] -Reduction in the dimensions of the returned object +Reduction in the dimensions of the returned object: .. ipython:: python df.loc['20130102',['A','B']] -For getting a scalar value +For getting a scalar value: .. ipython:: python df.loc[dates[0],'A'] -For getting fast access to a scalar (equiv to the prior method) +For getting fast access to a scalar (equivalent to the prior method): .. ipython:: python @@ -218,45 +219,45 @@ For getting fast access to a scalar (equiv to the prior method) Selection by Position ~~~~~~~~~~~~~~~~~~~~~ -See more in :ref:`Selection by Position ` +See more in :ref:`Selection by Position `. -Select via the position of the passed integers +Select via the position of the passed integers: .. ipython:: python df.iloc[3] -By integer slices, acting similar to numpy/python +By integer slices, acting similar to numpy/python: .. ipython:: python df.iloc[3:5,0:2] -By lists of integer position locations, similar to the numpy/python style +By lists of integer position locations, similar to the numpy/python style: .. ipython:: python df.iloc[[1,2,4],[0,2]] -For slicing rows explicitly +For slicing rows explicitly: .. ipython:: python df.iloc[1:3,:] -For slicing columns explicitly +For slicing columns explicitly: .. ipython:: python df.iloc[:,1:3] -For getting a value explicitly +For getting a value explicitly: .. ipython:: python df.iloc[1,1] -For getting fast access to a scalar (equiv to the prior method) +For getting fast access to a scalar (equivalent to the prior method): .. ipython:: python @@ -290,7 +291,7 @@ Setting ~~~~~~~ Setting a new column automatically aligns the data -by the indexes +by the indexes. .. ipython:: python @@ -298,25 +299,25 @@ by the indexes s1 df['F'] = s1 -Setting values by label +Setting values by label: .. ipython:: python df.at[dates[0],'A'] = 0 -Setting values by position +Setting values by position: .. ipython:: python df.iat[0,1] = 0 -Setting by assigning with a numpy array +Setting by assigning with a NumPy array: .. ipython:: python df.loc[:,'D'] = np.array([5] * len(df)) -The result of the prior setting operations +The result of the prior setting operations. .. ipython:: python @@ -336,7 +337,7 @@ Missing Data pandas primarily uses the value ``np.nan`` to represent missing data. It is by default not included in computations. See the :ref:`Missing Data section -` +`. Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data. @@ -353,13 +354,13 @@ To drop any rows that have missing data. df1.dropna(how='any') -Filling missing data +Filling missing data. .. ipython:: python df1.fillna(value=5) -To get the boolean mask where values are ``nan`` +To get the boolean mask where values are ``nan``. .. ipython:: python @@ -369,20 +370,20 @@ To get the boolean mask where values are ``nan`` Operations ---------- -See the :ref:`Basic section on Binary Ops ` +See the :ref:`Basic section on Binary Ops `. Stats ~~~~~ Operations in general *exclude* missing data. -Performing a descriptive statistic +Performing a descriptive statistic: .. ipython:: python df.mean() -Same operation on the other axis +Same operation on the other axis: .. ipython:: python @@ -401,7 +402,7 @@ In addition, pandas automatically broadcasts along the specified dimension. Apply ~~~~~ -Applying functions to the data +Applying functions to the data: .. ipython:: python @@ -411,7 +412,7 @@ Applying functions to the data Histogramming ~~~~~~~~~~~~~ -See more at :ref:`Histogramming and Discretization ` +See more at :ref:`Histogramming and Discretization `. .. ipython:: python @@ -425,7 +426,7 @@ String Methods Series is equipped with a set of string processing methods in the `str` attribute that make it easy to operate on each element of the array, as in the code snippet below. Note that pattern-matching in `str` generally uses `regular -expressions `__ by default (and in +expressions `__ by default (and in some cases always uses them). See more at :ref:`Vectorized String Methods `. @@ -445,7 +446,7 @@ DataFrame, and Panel objects with various kinds of set logic for the indexes and relational algebra functionality in the case of join / merge-type operations. -See the :ref:`Merging section ` +See the :ref:`Merging section `. Concatenating pandas objects together with :func:`concat`: @@ -462,7 +463,7 @@ Concatenating pandas objects together with :func:`concat`: Join ~~~~ -SQL style merges. See the :ref:`Database style joining ` +SQL style merges. See the :ref:`Database style joining ` section. .. ipython:: python @@ -486,7 +487,8 @@ Another example that can be given is: Append ~~~~~~ -Append rows to a dataframe. See the :ref:`Appending ` +Append rows to a dataframe. See the :ref:`Appending ` +section. .. ipython:: python @@ -500,13 +502,13 @@ Grouping -------- By "group by" we are referring to a process involving one or more of the -following steps +following steps: - **Splitting** the data into groups based on some criteria - **Applying** a function to each group independently - **Combining** the results into a data structure -See the :ref:`Grouping section ` +See the :ref:`Grouping section `. .. ipython:: python @@ -518,14 +520,15 @@ See the :ref:`Grouping section ` 'D' : np.random.randn(8)}) df -Grouping and then applying a function ``sum`` to the resulting groups. +Grouping and then applying the :meth:`~DataFrame.sum` function to the resulting +groups. .. ipython:: python df.groupby('A').sum() -Grouping by multiple columns forms a hierarchical index, which we then apply -the function. +Grouping by multiple columns forms a hierarchical index, and again we can +apply the ``sum`` function. .. ipython:: python @@ -595,7 +598,7 @@ Time Series pandas has simple, powerful, and efficient functionality for performing resampling operations during frequency conversion (e.g., converting secondly data into 5-minutely data). This is extremely common in, but not limited to, -financial applications. See the :ref:`Time Series section ` +financial applications. See the :ref:`Time Series section `. .. ipython:: python @@ -603,7 +606,7 @@ financial applications. See the :ref:`Time Series section ` ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng) ts.resample('5Min').sum() -Time zone representation +Time zone representation: .. ipython:: python @@ -613,13 +616,13 @@ Time zone representation ts_utc = ts.tz_localize('UTC') ts_utc -Convert to another time zone +Converting to another time zone: .. ipython:: python ts_utc.tz_convert('US/Eastern') -Converting between time span representations +Converting between time span representations: .. ipython:: python @@ -659,14 +662,15 @@ Convert the raw grades to a categorical data type. df["grade"] = df["raw_grade"].astype("category") df["grade"] -Rename the categories to more meaningful names (assigning to ``Series.cat.categories`` is inplace!) +Rename the categories to more meaningful names (assigning to +``Series.cat.categories`` is inplace!). .. ipython:: python df["grade"].cat.categories = ["very good", "good", "very bad"] Reorder the categories and simultaneously add the missing categories (methods under ``Series -.cat`` return a new ``Series`` per default). +.cat`` return a new ``Series`` by default). .. ipython:: python @@ -679,7 +683,7 @@ Sorting is per order in the categories, not lexical order. df.sort_values(by="grade") -Grouping by a categorical column shows also empty categories. +Grouping by a categorical column also shows empty categories. .. ipython:: python @@ -689,7 +693,7 @@ Grouping by a categorical column shows also empty categories. Plotting -------- -:ref:`Plotting ` docs. +See the :ref:`Plotting ` docs. .. ipython:: python :suppress: @@ -705,8 +709,8 @@ Plotting @savefig series_plot_basic.png ts.plot() -On DataFrame, :meth:`~DataFrame.plot` is a convenience to plot all of the -columns with labels: +On a DataFrame, the :meth:`~DataFrame.plot` method is a convenience to plot all +of the columns with labels: .. ipython:: python @@ -723,13 +727,13 @@ Getting Data In/Out CSV ~~~ -:ref:`Writing to a csv file ` +:ref:`Writing to a csv file. ` .. ipython:: python df.to_csv('foo.csv') -:ref:`Reading from a csv file ` +:ref:`Reading from a csv file. ` .. ipython:: python @@ -743,15 +747,15 @@ CSV HDF5 ~~~~ -Reading and writing to :ref:`HDFStores ` +Reading and writing to :ref:`HDFStores `. -Writing to a HDF5 Store +Writing to a HDF5 Store. .. ipython:: python df.to_hdf('foo.h5','df') -Reading from a HDF5 Store +Reading from a HDF5 Store. .. ipython:: python @@ -765,15 +769,15 @@ Reading from a HDF5 Store Excel ~~~~~ -Reading and writing to :ref:`MS Excel ` +Reading and writing to :ref:`MS Excel `. -Writing to an excel file +Writing to an excel file. .. ipython:: python df.to_excel('foo.xlsx', sheet_name='Sheet1') -Reading from an excel file +Reading from an excel file. .. ipython:: python @@ -787,7 +791,7 @@ Reading from an excel file Gotchas ------- -If you are trying an operation and you see an exception like: +If you are attempting to perform an operation you might see an exception like: .. code-block:: python diff --git a/doc/source/_static/banklist.html b/doc/source/_static/banklist.html index 8ec1561f8c3941..cbcce5a2d49ffe 100644 --- a/doc/source/_static/banklist.html +++ b/doc/source/_static/banklist.html @@ -7,7 +7,7 @@ - + @@ -4849,7 +4849,7 @@

Failed Bank List

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ৰ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 literal 175124 zcmY&Xo(ZsfG+qR7fzdY~xb$-?AUDefH*REc*)#M5y zVswo3%rNAGNB2h;B@cgQ2Zv!;h!}|MjI3aIc!++>nA(~zlq zHipioBBsW6CZCg8EF#qu04$@x>_59K9izy*OVnDz|NZen>-xr^Lmx%8J z3;8wg!ai2dOMBkFTx=tsWxV`37v0<6|8|~xHok8@NA!L5uX;Xx^+Ue9zf)_vj=TUn zD<{u*Ju7+dpJlLBBltV-1HT0F-h|z_mb|%ERNZ*+k5Ku~yEj1payH7#ZY{nWyLp#) zn0=RYo;@xS%q&%N;^mc}dv6oQg_UIHK63K1P9@Y>PP8yV*qh7lNGgA-Fymh}7Z&?) zfq5ghKF+0b1OidBv7Rg_yKr5Bk^#PPUMjk+0YJ+{3(^OT%{La(4RdVA zY2mZkr1m8NvAY|egdw@;7tX8Sd7qZw6|H3YUl^Xtx?X&X_3?lW71^Cj1o@Hj^Eg1y z_f=Z`usr0~O5WS~XyQC0t)2~6wtUrrve3`Ul}{I%KJOOs-SD>% zu9W>`2s1HMCgT`Yyt?P}@_?>ocdlnnl$TWKKo@O=HbAZIc}(#wt*l&ANoz51BPx|I zo2)b6yuk$g(R)@|bZ1ua+!wMDMxKjES1)dM-UO5vuDSDKpT{Yy{)7P>!0P3Cj&yuJ zP^Txp-}EpF;3@sbWceL{+K*ososp{fRpnK^lAGMi&mZ_;64S%MH}Ea82q{drjf1vB||!0T4F4(?7AQA$>kbixtfKLt0;TCy#%vR z8|O*$OwXW%P-{&1q;d(-u>Q@Rr9S;nzPn~k%5nRG_k_28H_>V9-!&ILj_XSPmP2(G z>ST+@`LkUdJj>~!f_By|)LvOO`PxWUr!la&-zC?c6DNW-?w*Alo=N(;lf#guif&8I zJ2Tv^B*oy*U5??6)YIbFr%$cx-B)`)BXDV~y5ihHuXkSbyQCrAfJJ9wVhoss>XI%l z{XZUKqn2t_q3qE?G7UBm>psh&Hjvkj7l}L0f`dUB^X)xcg-xbVNp#$TEoI_;a*2gq zkp%1c#;$07#d3@UvfzUVlM5Xg<_rU-j&C+Fh|_SN6qaV)N8} zc<;@BGi^W%)>pMV73ggZbc@DH6K;p*IXLIUU6UTG+z?`89bRKmS{zAS65jA9KA9!| zZaUigEc8uA9e0Vec!x1bI{j=kdECI z^KVL=mc!Vu)tJFS#clx7EY-zm+S!xT>7?Y5E}tcs??rc{%mR1tG)Pfv1he$2hZb=& z^d1dj1u7`9-TIa=I+B0g9AjgdHYGoHQoLyiu0j(x zx8`F8ujUfAp?>h-L77-g&~JO@;%0nvl+OztQr^PEMSytCg0g!4($c8QQU>n2R`*r| z=Pbhc_(pt(d}$7(3f~1J50>8RU!j*&76=1P+cWB$}>loJaunc z`9#(;dbq5cAO6i6$@^cA#7@lrW_DI=<7!O@EirK8b-~9wYW16tWo_jk(C_hR^#Z<` zpU|4g(^RL&>Zb_`!EfQstc@nt-8u6_f{4$@gt50A^P4FELWz>eBDATg=2Qo;0eTW* zhudPhei85Avi{*_f#LwGB!T%gi!5C^gpJbzQmAO4C7opi zVD~8*vz;Z)i9KBVwCZZ)AqLTyb!#}uQS{Q%J>jVcu#L99Wf=ApyBwsKAh_z7e)eCJ zxi<5a6}8hCzOf>?O=7O&jx?EzwGDSvm}Wi-1htrsqUSBKVbvpdZUKxW$Ow#4R8mtTlrZ_N|?U|^z5t^mD;;UqG3X^ z8n9~WMoIP-AP=-e-K>!di97y*aW^&_Y*poYVzoB6!VQ&3fw^1< zO)7c!r-vxkqH92Vl7mdt%?$scqm7GE-OwP)QnWITm5Ko4Eewh!h9(4mU&|+tJo8P} zz7E!M8I0E8B`zdyu(PV3!B2HSYkJ)a9uD2q&s$9kyTzxUWuw9>qg%B?)L`y6Th8s% z*0GU_tQB($xIOcNXG7_PrW~E*L_W2F;jF7w=G=)k zGN;>FckfEGXU`ydsQ0Z8NTCTOvL1xMAI|skGy>D;#>oUVa~v$MeP=Mvn@>Ryo8%WP zweJE=k@qV@lqnNl#lIk_&g1KXDW~#;e4%E?`1XD6i|W8UrE;~D_2EuKY!YI#Q|W5Z z$EnlZ<4cE|z0tyi;*(v^k%Y=SW3}O$L==M6ijjuMST=SPMs+3|1ixtpQTgq9aWB}u zdqC(Kmtj;nzJRDo!!Wh3Xh|59_9E%|=X0vD6;6_^Sf^P7Svrj^{wg`(di`m0Q(Wcl zt~n!(?Hs?p4v3>tI@Ad5;@1ZsZ<=eILOzIGkPt?7j4nX6EK$Jf6V#evmJ_50 zE|dGh3Y5espYezS(t4mVl?P!hgk%2Rh4ys@501uo?lk_(p5u(tNIat5;hZ}2eb}O2k+}BUYG1ppE`4#6IncA zwh-(Qq=Mp&izH*Hxl^N&S=!h`Fr3}mX5?5{JmH4cbO=MZ@X%{;NAd9od|}+yN!Y{I z%Cc4Hx`2UBf!Kk}>VW{-*w4#wyfgra9bVP!-{=T@@qZfK3xSwWBgUb^S+>D_D+I(> zY_a)k85{%;ApbHo7M@~>3ozr$>Ws<>MeS;6wyW6f;qn0}(7}uRBFM?}8{DDk6UsiN z_}Yn{K{B5_BMN?%#?F)UQL)g6)OV?c^trVn&8vi-;akop5I8rtdU9a?7lPAPTV(oi}!c+nQQ=8b-5`7wlDz^ zptg z$`v*U_%PvRR8*Hp<8|uPBJ@qa-=c5iFF8Q*hn~&`qS8j+ z;jX|5eryq`UPKn;6@h5mad0)2MC36PSiCqXow9V6!6QPJz5wfE-wPzHLJCb) zJCG%f8GwY`NKlg~YI$ZqP`zS!PUWBh8#Yiin1&5eHEv8U(YQiOMDBEtw>aRr;!#n@Mx z+9}_XIh$C`^-A2kq;%~kIc_zSqd-ME(1?&sHn^>VuixUIfz8a}+)-e+^q3^HAQP%~cRHm^ET}_IjE2jVKEc zVXza;+FH%|Jvj!99dj5pyE!{66KN&{Gp0l%X@}Q!yNSuAkZA=53#JcpFP}_Jckj(m z1FN4-z`ez#X?KY{e(AWjS3rO$Sq(}o8oqPAdu9Y$Yq;HCdJ#QFkOh0D$NqqjQcXEm%sZBPU zon2jAyDX{wRZo^{;D*~P>BVc^%|1!&*P`J=Kk0TP?l1z9d|^)Ac_ewQ{6^%OCN$u-~|=VtcB-xQwYKFsm{rCtlTL*_1ae z|Ch>8@U~?rE2g#s=hj^PEbjDpUVn;a1MTdDWq?oM@RFUQnEn3RYx-^)%U_#)rV+8= zYGkE_mYCg8JfzKG&WZs>U%%EtesXE#k06QQcrZoIDPewiHH%QgKaR4d5qAp0J-cG7PZm)wY+5b*u$1maUWV)7|gkpzE20HjmrbWGbmjwhx3hBShJ7Gs+4Ibc8Z~xGrUW@Obw^aR8@uA z4W5(Obo59>z#-;g9>X2oK#b$fhvcPOY8@U%YQ$q}4LvA#Un8zx=xy{lY;%|}LqF?H zaSsQ!$=?qMWa$+}_6-XG8`@Pix5>vx)qBm*z`O@l!XhdlLN@H{?{^!6kQx`oNGqr; zA{zE&Y9k~2cPN3Cs<4M-%-ad>n6JrNe)31fr@tTxHx~5?h=ogYewxR5q_CB?k~0bTvT{k2?LgF1hs zCfJgTom*VFlW{Y*t$9NaC6a9ZU+~zpV_I0mmQAW83fmtRd@mpv?CP@FG`Qs9^&%=1 zahfMwEwmoV88p#-Ufk?}Rk2}SI#bO;2D1Y>S4;{r+;vn3PVs1cN7-R2f1DR}sBxl9 zXk2}#A0NwnFkK3wrcu;s7aY42)ug@xevMDWR6@lfbaI`fUN*_@@{9glPDSL7c?a8)WMJjajwG$OnNC<6~ih_P<$fFML_HFmxci$8v}r5=?u-JmJ~z#ts47&UJ`26?)MUI@$`$MU!@s(ngjaAe2i1xJ$_f@K)O`u!1|A2#uB6usljB#vi=4~z`&j|s2qAZ`SYG+ zOpKBux%U}FDwM}g_(O0}b;&lWl~w*zw79NRMM3^il%C^;3NH|nA0B$2;eCf5PngW< zk++m(z|4jWNs%nfB-8PI9Hq!Xf)?_7gOY=Hxug&WysQe#q3lKs>rQHeZT@|$3Sw{& zvu9p z=!JrztJJHiT8vG^r^_3Vx?e_*90aQdDG4NA*Zh^Q!zA;7#`KoON5*3RHtp$bnqe#t zxojumlC+H7rRa-o=@*5DKQs#p*_-|g5tTW@JlN30hJveV;udMsbRU_lK#GT!V(%~0 zXqLm$fD{h?tQ0g{nKs@ z*JyK-#_V;f=kwo&-+Rw@-uH|CPssM)Hx2aLq#2GGQRByJiyxWhS6pT5JP0UmW3Pgc z2hSYMKxbU=sg`!8g3W+QSU zPqMzFevu-z6Gf?9{8wf!O2Lau*fHmzh-OKXzzdNZ4kYRTVEAT)z5MmA)OGuA=-wnVNON?^hY zCYmuPX>b+-N(~u)IPowjs_3B$rb>PBgMvU*Hm(sW0UzGd0@!8Ef;pg6L{DgHU>X`d zP)-760ExlIz4nwUBK@#of0AhJFH8v2WSqeEP$frXWtdxxy{#}>w=W|hoR&GXV!eLMqYq$3Ag*{PPz7gj zA#1?Yl4=4{hWR82XP09BQf6sWP7K^M8SKFf(em4CWS3+U5aEk$6pW&B?Y;_SjKvY99^Dq1fSWkPK)T`UYZ?KTho--J`<2uMlU5 z|G>I!FsWW5?=xybNc^zK(%<=V72`gF62OY=U;6t0 z#>3>Oxlt7#fAp*E5tMA%^%oh5gS5RIAF6c+0<^*yT}|PEd|U+kwgqBIABxuD$>7gZ z23i=N6bAQM!k#gKLfPBgD820P&75?KqTEMB@n5T z5b;6kgK_**nfy@v{4wO4aYKM4ILS1XnF>UUq+=omB0kvy?CffeI3gX9&s%Xi*GT|0=;1XWaFI#K9SW)#1FY8qJu; z4F=*`K5(nPc=F;azueGvDYWdkg^i%oNQt%*j9QfbngojP1Leh$H1u(^sfBi`MAT*( zco7p@vx|i>IS&_+aZ(tQbdyBhpxC6BB7eR$s_~JIQ7fzx&{`mSJnxyKFi4Ue1q}mx zrUpS2YwOF_*GlliA~o6zz#FVEJmi?uVqxh}(SqdfuSZDjLCkwnyS`6Aq7X>ksZVH( z7JjP-fv>18#12u$Nm2(zKE+xR40~#dwGaMjs-zj(QrfGb4IreolgyoiYxTzj zE&9aF^A8kPUj*3&n_6cOod9;h>EDMx(Nk43^xAE73dcOHW4Ll>wtpP?ni8451FTbt zHQ35(mcASlG_l=7`_Y!jk|EKS-BHnynIKG7lx49G_L`$yRx&g>U>1~^(U#R{?`sMe z@L7co0WE@tI98$k>$XAtj|*@iOZ`lm@f!fU^iPb;n$^My}6mT@KlDk{9jTBZ{DbZHmUZ7H93>&5RQy>1(Fp)5h<{j0tidRx?(SIkP-VcNdbbi62QTd zm92!AQ!K&Pq)BWk=5T?Nm8@{*nTiMHu9DY78->b%#;KaX&p`@X7HB&bl7bDyZggyj zvXW*&Cx2&}s~TwLi6)u^6QfvnBBONBk>H|IR@m2=Ky@J}LTMAgvS|+L&MvD=2Ah{1 zamZjf;4M4jBUJi?DTfey+M9b^#EcdTLi|g#*oaZ!XsXwqJxgKL6K5PTzRxnQ`x|aN z7m9nXk+NnVXY_oyW-?g@hCD8<)E6qvI)!?4K8QYgfs(FPWUIrlUr^w6uo@nS zRdpVXp*_d*0y)Job6z){p2|7bX343U-;h~a(R@xaz#$C}6Xw)~j~kxxfta=5N1r%P zMMA=Hs&nWF{5Wm}Z3@K&_Z z5aoy@5eFYIMCj8sN65nm9>e#`Ss?0MJs=7p4;#TO*6tg;4|mS`);tyW+t`|!Uu5d0{fxKU30n%&z0qV*>%S1#EK27m+9mg*ENS1 zt!^4`q!n3OebtOCR%6<;*lGZkCvT5mP`aPB-ye%DcN+7t-Ik-gFV=p=eX_Qq9Z3{uDHP_+YcA4 z5Z}H3)`zp}nzLF(PdBa`#wET(7o6bD3ul9!Isa=RD@j?qd=Y*eZnI+c%NT$RZKvhB z5_)-e9CKK1Kq6Sn^VDgLJH@N&!;@nz$$J=~2XlUx4wIT?Ottn~jL4e2`c|ZwLaLhw zUWha5)l1coR%j`KCOSW)+(*Meh|l42E|;2prUQm2Y;x^n4m?I#~CAgiyNtj8vTLGhbIx)p;TlfIxe9WCli2qZByRKvmP8c*0u@J zgd97xL2VBwl8d6C7;U6-p8qKCzH1Yh{N!g92a9b1s!#rhf`B7pqz)RxKhg*-o??0& zNb*D-q|DiOFN8fe2s`Q@DxD>Pr5E9ke@;VZU+wrw8gY6bm(>T3gP)3lmzl_R9Zib8UUrU=k9sA7fps72-0X8RJ= z>aJ#zM^K4Iq~r)PjxEg>%L55TqFAeql~-yKP=N!iQ96lJgX`78fge6X9mK4>(-Grc z26xN2S9A-rju#E8!q0rlIKIMkc0F+>@gxd{ULydqWSyXLXJAZGdsIm{$v^N! zyosW@El|nWDUyB_XD)z$CYXQ&cNtOW(Apc)$X1gt7LS=g@Ur&EB=`!28=M7NGFw0p~mBH*nmvY{_Vjs8J{;E zdx=UCGGdcHks(L}P|3_BELgaRCfx`Tw24f1ygF%%M+G9yaGqKI&2XFkx+aSlvMdOZ z|1Ecr*oqW8504&>REa7P#;Vj|yOlpz`xSVaNPFxy%1$BH<2onVd6)Eb&_HS!-l1utH{4HtnsMp>gjoJ;2#6WNlIE&5xPXAlJ+O=-@2 z1R0X*xPU?%J_#TwbC3*_W{4~-eHnBJ^a%I_L;*Dwq11UUSaA)^<6kmUrS*!w3W5n0 zSQKJp7W_#Iyd^oGD@PANVd%lwFUK9$`roitZtmda+dTk8D9>p4C8E7b$uN*BEx>D=(3UVbkWK%a)ozm&W`8Bm52Bp>qIUxZWxh9z*Jc+h7h{3Xd^Sm2KgI zq8kELXsRX4bM2T#CXMBGIA_rWZ5$QiL@y4Z5@f|Y@c9NXy+N6kN|SYy4&YW(L^{Y;r|^7 zWA*`^nNx#5aU&7K5wZ;xZmMOqXx2g@Wk$^0;?x6)r~?=7IVK~dBk@(FKf8dGcOaCV3ncI+`@uEtW-*XJ23mg9zduZ55;)p0b60Y*-oi)O36!rx z@)if%hX!(35#5>-vB@dmBh6vEW+yxbb|rSd*72gehXHfyi^r@iB3L;J8ueq7Cm0Fw625&I(JcGnv9to~?I0@p z5)G{}oPUWejd+glZ-dh3l1;H9?!4LZECZQyHZ-%%L41RtgLS#2EIhwgf70NH8}%ZE zsCSIw5i*H1&*DOr6y_{>Ibow8Iy;z4GQ{#E^PMD9%vu%dSFkFO7EAiqBpc-H;A^Lg5r9YR=}-gCCyO@E1!OgYgT z*AKC1MrOD0UF@p7`E3G$wr(mIb1^j`{>{(4Y6juzURAJjsPWq=WDDkZTQ0WqE4#hy zPjrLXY*rFrR1U@$hK+YqaV-p0Pj|R}M>m*1|(g1_hYL~ZV_4k^8;M>KZyd0ex;-Z&K3hwYhWeBk4O{u%lu=3&rs$0Gk) zOxY33OWaq9Gc~6EP)D1MA-AF{=uA(GE{cTBJ#zPjhZGWCEP^ogpNQ_;_fKO7vb%=i zMAzH~^WcpVW2f<(fWcy?t>Rs=lO;H_sLEJ~`=O4lt8~!R>RihDIlP=pZVAh^(>`k9u!-bY>ho#V*YqD)jgKf&vGkEwkb7qmvCY)rj?-n3JL+_H#Z=lFAPd!%l=a;6WuRUc`=-cM-v6QjQv@`3PLk{9Z#m)aEO$r zVamb~t>!8Enj1o220rW!Pcxx5SHG(A3`_#Jeds}6^0=5Ns4Jac{I~Qf>$*ng z*|xs?Sik$*uofk^w?B&#gCAxu2_Lq;<2u~#!T?Yoh;ImCn;; zXI7ae{Yo`8qshA@_`UqJl)GRgJeZwiYk&SCov5|=6qeK#|1Alj{Tl^v=qJ;>N%Xw` zIw;q^d#z?-t>e%H_a!O%w$#arS|fd1rSkW?;{7}fQ6KsA@#!;*&=)=NsaffmqI9Lz zft>ZH5NO&0^{ONzX_o{AHt7_n%e~+6UL(LnDwGb@cakaI>x=R+WwSHw<(S|V?wVLO zFF99%wdvl<8f)w@c>i4(D+k%iZdz$XIHO)g&ELHqJ51C!dK4~X#v3uMP!FQ`iPQC- zZvNCt@{-s)UNxDF5d_i$4fOBgZuO0IE;8BI+(yx$g*<4%L_kXjF7zz=yPxow!Zz}? z>oSQd8*cdxs<}Bpgy6msHD7Lxo$(y0c_CK-E5I6*F~SlIM2cInFMw9BtnCy)wLs^X zJU~Ht3x}b#59KPu)jSGzAmNeD(&UpiCBET34&BOjiG$zQa#x3-sJqKPo7m29hy|-0 zMJtgx+GH+kOfl$)>mf; zi&9(Y2GIESv%r(gV<4=sp`uu>Ez zysV$)Au*oPp{dG5s+Tdp&D@~xYC872;mB<#kHO{bx1?)AvnWCz z!H9kszY6w5bxG=Wz>80n=>54NDqe0w%NXve`FJxD$lsl03?`zGAkk;x#4c8>_d7P; z4`7uyqkSX6?syHW|BPxE+xQwEcCf|<5US=0Bo29%Pewo1L3!=5r2KWBgpM4 z8zoPq^XOU}TihyQVAcatH_2tmltv5#JdLFzst5ZjqGA+Onr@5i(t8|=-T15AVe;Ox-?YMl zB_b)js01^D$eb#OZLQ9##M0lFs1<4oPzqxu)-024_*MbJ6B<$s(isY3XKXLE%2Aid zN-8l`wJQ;sp^RUQtr?Ot{znE_BLP#^x7kh1)VR;nLsBfI{^bmJ@s4P`%bZk>N@0I! zU|61$#uFI&CpoKBx2V_Q%n{%DF zF)b+0Ku^M&mCx+b)>z)ji2tD|yw8aBte$jUbOLGc{+n}1s$#;g&%eM}I#z1)_aJwI z8UH1_m&eV$3*$+O5T_h5lx^uJP6!n_KIZtZFuI^4VwTJyaIM^Yid_pWTt4TF7z5CO45N=K z5z+~~V-F_Eln`ASs^mRZTYK^02VS|F${0XJ6`Q6Kp8*N_33rla)JPZm?_VfX z3=9!HIPxb+5tf+F@IzRoo#$*{o!~Kyadvw~u-knm(2uxtqwphbL$M(!ZMFlByOS7(b8MMN6G?xIpye zZ2p~8E?{C-DI@>==knH3K)uGL8*t`kn(mxa-TRo;^IJ$1ivvSDx#v3gaM@+#OlXQ5 zmjxo|G%iv4fQ09AIx-v)Owt}v-;x6D^7s@BR|W&#H!}7kG0z!sD=wDctr^FkE#tU+ zLL%6dU<0FbY_eR%=i7ac#X}uM!F-l3wD-8$d+1^P>*XNNmEY%c=we|;?}h(H{~IJt zRZ%EP9;?j1B%3v#yn{ph-JC@kxA$U&|I-w!ujXyVZ>#4kiy;uiVNl%v1y%TQ=nUu| z6dwX9hu=aE1^n*Qza;sdV1$nvvX&9Zz=q26GGwH!HOwRuk*M0aJD$$3BEQcIl|83l zK>c?INe533@P{~aepJ#1vtjZKB9rFNefznWx{2)fo~+w0F6mjY+XXB<*hGR0908I{ z{`_-*Q1=0w-ARiYWSC|0Q2N`$mlGz6&?&mUSL|$;IYk_#sP{Y(5sTWvqit`}7PN#) zIS$YRM{~ylE_oGOWB-l)rh%bb(JjQ72kmV!QVb7j@nJo@+e(KoT*pHc=h@w3Jk7i6 zobhv4yf$+19E+V3hr@+4^H1y7-G8{P2F;cjS0mk)R5OZ%v+21*UUId*?l=EV_sWdN?-q4(be?h#m=2ae6?0Ip7tNbD}AwKR3^_guc<3`JOuPOD_-m? zqnAod>LxUJjWZ3O2zt#b^>R8N`ZUkc6!}@E)r|zGB&NsaM@m1Gukn!IvC)SeVhPKX z<`n%bFH4Yiig_e?uQ}@;>rFaOC0tyIA2%lsR+;l^-FFA^iF1C)=V&=tH2Q5SJzsHP z8Z0o{OO6Of6l)Vg)ZSSc$RdStWlfr01z?KYo z>or>f?{nangDYi`Jw&~5RS7Ap-E!*5K&l~ZGW|g5&Nx%F=QNz{K-$p*o}vka${kOO zz!{JDr`j>+IVW>#jK}(T64F$I<^A;JD^P69Mr#Ra(^az&@|vwH5W66GWb`|ysIxto zYA`6rH7E8aIJ#^!Tc;wOJSG@BA~0imN)Rgnbg;ij|FY2nb`FlOLth1515_-p<<>o4 zkVZZFe;G_km(uX1=wsiZ{GUt~ahfm;Jbv?$_S+v0nNT1jX)L%vd86zD=l2`_ubMRB zU(tO|7HgcE?!_?xg3Wd9GdV|u8X>@1z9MfJK6M=lx6H=UoRQP7X2?Wg00jK7kdqfP z=y&`oj63uJ9u0XPl{`-=j>^{}7Ur4Nx-9Vf*jOl1ovtKb9-fOUwEiBs)6U*9nxgK0 zqII}@k=m%99x{NtX+%VnZ;;2dIq*WqF_=%eH%Q|MTc+h{6q!?;1)(k&ROZ_Qp)It4 zx3imVwhqSpQQ?%I2%)ZDi+vEy3@z}g1@lZHSVEWNR;gUxQo(N%K7{$L6-tpjA;nM( z%w0gPF1M*~`EuYCoOSYsZCQn7RoS z@+-RvH7BKUPFuHiXDbl0qvlg0xbHojOO%$9b$&`MNRhJFd%a8bE1XG$v=*8lJm?;* zJgtQm6jxs8a)n*JZzN>3Et22{ZVy)rx?s_PCSBNL_JK*;Z3~d!Lve0-q>jF;*37fp zRc3I$L@wu7(7pS8b<~8sYks}@VvUO6`jzG70RZE{UUErU7Mj31d_$nWy~ohp2H;t& z2TPZ(*m>ZQN|idb1e3qk$&N0^(uwYR6{tQ$J3if`4&7!AOoXxbq=4YN-SBhq`Md^& z4M6_BxyX`lqmWHHA-fM&z!$ZY2~upOIF^@k<@IXGqiT5pvF@+n^L-`rZnb-t*NX_M z7@RW->MNPHisH7bn_n3o_WRU=p;|h0(rtc*epp{m>KZhQPJtK8)}FL@eSrO#J}9du zIs78!2G9#Z5-wNNpQAQ+{c200;!j|hCOkY8$$K)|YdHW?+LbQ^XVKf+lN$iP?MhoD zOOK|$;v+<@Tj#(p8$X>B;%m%WM$5#Vs4WQL8ST)R>+dICBsUYp)!Q0-lPD7{oU!FB zb@q}$uZE{C#2;%Q?OYvuK*aDfM8@tC%lnWJX2dAxOkM<{#==*pnyESbu%zG`*a}J_ zbJ#S}O#RD4CPC%gK&l@JN{lFGfr<_4K8s-Tksv6b2WG*LfmA?lsz==fqaEENeM|=| z45`N-M|TKej7OFUBi!fE9BfESv*{{QZ5#d2h zDI5y!Fl@E--x4qMW3KsV9$H}JgtS~bBUle{Jin{PRx(w5XP?vE#tMoN_q36Micghk zPV-@?BiAM7dCDAla(GXr=*dY>uy+Kl7nH(sRNZLn1narUjnS|pZ;JU6wl@KQNHj*OZ!n=LCn{hH$t_7uN10${qoa#!O*=#DkqF2@ZWH`dR=b9L@6 zj=s(#Jud^5vdrf+B?weM)HS;ol*O9#Rt<&zvD~3O6I+6Qua?C{Al^y5C*bjp6VFJ3 z0rzO8vNO|KbRs$=^(j59Nhainu0Yrs!#!kSC##iSZh20mL3}lhGg7SOghd%F3jk`0S|b1I1M#3W8kLUJ1k2^}J zhi-$w7J%wwPhn|Mj|%qAwT8X_a#YDsoGrChaTwy&|sGmw9!p4b_offn7d)KNFz%Tkd zB95_ru^3>1ULW-QOpROb=2w3U@-c`m z2i~lm&#ka`Y)L7vUEan!Rz@5ufu38uTThs^o+1+MpA$WDF%`+OoK-9RMtmqpC=pj$ z_o#wVLHe#Ht70VuGW5ZAbA(PX5@!^dp9!1!iq%^`(97QEgo3l}uP9^aVyCX9z*hD= zRXtN@6D=AU7L82g6P!N4p?7KO#bX+F3S1UXlGNZ4d_3!N zBE4zgySNc^9u6b;d6@n+7kH8%_wlFN257mv^7U7jD9VNYl+(o;Gh}0NC+748HFE4* zEf1%uX$_6NowA5ypU!_ww%4CEc?E9}UPfjZyEbUm;i6D0D@3MR2S@T0D6A+Q|uwX-&V;y))L(n8XxG~`cI>SWwV(3dGZZ0$F*z^F(j6TjlrZ7bNSDnb@a{ka1u|7T*2n0w>YaE6=~DBr3QVXGRnC~cxhc_7-y@nq;JJ( z-DK|8lnB!v!vW#h-v*+{S$ouIcWC&!{P}<0Y>MZ-V?dbG>0BdO*z&HF#PPGHT+0qj znx*m43x1GsAQeF=gXA$5ii8k^g?qvc&}o`p`V)G zA6X5$=cUFCKa*uoy8buh2gx8|T5A}33gOe%olE1SFw#^Wjlw$;FD_b(P7fmpZmF#* zq3Yqt14dxZaLW)cO!lm+Q1SZXI;w~Nr0(^W83Wk+1-BGPSnf2=d3p{1yRtk+a00{% z{rtrvxI-{Bu5K(PtN6Zn&l{eil~t_`Kcd*usopn4#Mc}=kZBtN$|h_p7X2;vSL@0O^xok@a_aTx&PlXN2b5~izZ$ah}zjMl>AU`Oh4H|$Z`PwU9jWXi?F z*S1QXugR|a%Nza|zbX?n-Qw`z>g31v{&x*mLMI9f&D-97pDi4S_Z~nt=j6t<6J3gz zIeTnf*2>VDJ)5+MD*WUwj%2cor!BLP22+iaonXz5C^MctE=X97z&8IKxg@C#5p9AtyyEp47#LZKF8$KlQ4F|A%1a{-1v5 z=_Ki3{-;gi^?ADgIy3(3{82BX;9_r}X$ELSp~~^CY>qQQ0%YPOGJ%@-@t`@$C znrWm{?a5FxMY21P1;gD^S#)=gy=1$Wx_n!wwA9lqguh>EErl=u+T_-IqD$JD_tg$Mesj_k1>>=ojLT$~ zg3+61%MR;S9G#PU-OAzuF>omvKQ~Sa3ojQZ`DfCkmM76bWku2niR!|rlV}Ud#CZUa z#aD;5lMb)9Qkk$c$yTKC&@NBCw%rM}C6q$Lc1iLgxQ3l5Ch!rM*li zjQnoa5a^Pn^f^<#e!sw-?wJvxGSgr82%1aT#I z1Aiq8ENgY|^Rs-^TQO)zXcGE+S9}PuO8cv8=x7#`M|av9N1o@D>xpR8 zB4lJ>P|AsRujQ;CNP+ilfwad$+%UiwZWGo2+663IBy)^aFi-a(Ur9nWRcDl6={;05 zJ?m-RjiF&U5INRDrhb|88bGJnIt3k6&Qve8PwcYqjj&o1rxrSib@m}qEHHt;n^d2l6Jh1PK)Y{ zAA9K2U%t>|5xo*ac3X$KB`gu!>0nk#`C+ z?;4geZ|9IS@8FQM?qHFmxS9j7yN|EXFh)SpSguw4h8kF?RIYp$nx8?y6^P=Sjhz)8 zAcc~GBrJ8UVGbRlPg##TP)$9blgmo?e81e>N7Gpffswz5hwJ;Go~o-Xy9l{nY^$-PcW;tvHl!E zoo{nvIZod;Cks~aFSP;|ZFyCCn(!H>#!?%8dy)yV!^(H+O36#~W(AT~G1|2Hvv|n6 z7H9@~;rm%!HvcNhRg&1ERT1GbI4(s^P^_h$O@!0o@_f8YZNaOB!+YQD>lwiF9_FEW z&P3ckBdlzSP(}vW+D;-yNa!X0k!}i~S!-Z>RVVTEaORem^`VuG16Ck48n`72^Z>1^ z66u3i3##9yluc{Z#Z83byJ-gnjn}`(LHrW}{{s7lpHom8B*`3@VMlTA+{GvgY4hkS zTVNe7L9*{D@?%I+NhL_~@>zG?^zNI7Qtue{X5WI8A7&m<{G_0GMW7VH9O?5;k-gGn zw6SmnLGm@Mtl-sbO(L>*^YO=WyA_&5h5OP(vv4Hv7f>pYkn<>uYrH8%o$eIs()H0 z!HDbKB|*)TS@*nldJP^Di?uM7tS38@H#ZaqgXNw|$G;YmEFw4Hhrtxm?fFVn8po`` zUPfYcGG3XY;tP|2HD{T5A{$uRZg*0-whm8lT|EfEz{k|=xtm;7AoNskRqjd2BM(X{ zT3FrcC|E*J9i3%XbP8f;6LKdnb15}RmlgP+46%&C5C%0dVrpFavM2I%rfI*hSghH} zPc_)wzrIs*iB!z83yf#&8-@tJ=$iMXN}h5H(ctQSd9f~p0M6IdbY{Jo>ixW1fU~!% znWO+(w0cUS*v%!}_R_Zp5eJdpVDC6ON`ibhV8N$&?ZIJ*H zP|4>B;7mv?do?nTuZHAq_6ahf6F`F#WfQwcY=HU z#5D!yQlov4ht?0N>5=k8UuBiOyaDW+QFbk&mT=<>VWNECP)r&|2|n(%dWybRrylTz zhEvpRF_E7l)j|jo_xL7)OJ#&#heXj0K%Apyxc9|s;oujFyRrT7NEFox*26#97CyGE z9MbeiL*}*GJu#;+Wek5JfCWgUh;vSLCM2lOAD1Io5Z zr3jefQ*?8yq9xnwN3>h4ikP39zx?i$D47R z9!tLplg{wiJ;hK+QbXs0V#zV3ib|J-v5w3UwW$PGr&%)N?1Maw6eM@8im?MKpuTMyClSdDaBS~HA<}9T+;~; z13#77&+gQKUREwOK3o-d`Z7#^dOQ!$xw9WikMp>;!*g^k(|%&v{e!fI#4jmwOOp=| zOITUAzrYyaT{{x;<)Y!}z-HI;@}=dr#c3Ay8T7@E;d@XESgLGVi9>Z40*KKT0;4PD zvylhyL}yRBl=(Hw*-pUs@M~^!ZTMROMdzI%)WRGGLxgKkR5UTwWTTtE|3lT5g5Q z9q(&~ohwJw`jDu;p!fpf`M_!CAgoJwyv@{240HpM4dydy0vH$>Bl*&IF^ZNq)O?Ul zq>q7Zw&k3rJ_k%6H2$-}M`Bfy_y%Yc&6&cBjx~hPhu#)L`6}5QpWcfQ6)X+M)Wo!C zMZTX=*Ci+c7NE!r7+R0w&qP_lg%-hk-vF6HAVK0qK+gx|e!{E#@C?i))F=4nPmtTa zJsOr7zlC)-+MoGT-{MttK0G_0LLac`?&@L*a!~aee#Z9IA$QqTe+n%aT1px{JID|8 zngSy{Lp;-;pI1UZYZ|C8rJy{`QYXtw7ORia(>E~7(brS4owp}L9CBh@6Q{#8vYmG& zOSvD9cM0gzD_jj9a1Tnb_K+{s3>IxL&WeTf5ULi&+~SAxkAG)v=Dn>&s;%ns^sVPB z57)Ub$^3l%Hz?%#wkp>6mC{NG|5RcQ>@u}5UbBZt3kyLA3!nhM^Oj$^Hfkx zU4Q(}>GS78Ie7_^oexsarj|7g@%#y5IVFo~5?-;M*X$3_B_J*De`3B)@&rl=?h4iH!GIYtMwq0H{)VDbj)jZB{2zK*MWur24ipYD&*p zDQW8lrPV&UH^C15X|P1=HhDpZ+w#p%O_BQ|nnP8PUOEhFESy@M3vRCb1Hj&8-A z%#tqs5%AbePV%Y-*|C#MWI|ssF+Ml7Na+*mn z0C@d|cj2>#P*b+pvYek==EzE$Kf+v`Yqsh%RSH56k~9Mjld>NcAvx`RO+CyilxD=! zx)O9F_GJO?cTa+vO}#Vs%+biQ%;||_mrK<2%IV2qpYn9?$tSY}0FmK)BY6#Y1XJ!f zRbBZNJDOF^>C55LhEYN~K&tAM;NPxuy&$#NfA)Pf(||{b=0vQbnPh+yDznWm?|{#% z#E!%STMEpp1QOOEZ@AZ-Y=P&PA{ip2e(tw`6pOX~l2=`S5{vs-%pIf-^I zGVN|o|FaoE2Spltf-%M@=~wGtj;*_?Bm;T^?$==m zjAT_WMlOh<2zPlc4f%92OmzJlW|8@JNPMKlfF7QxTdrujYm^I$PK8FoCbMf}v!lRw zlWj0#?%&^1(LOzBimtEQpY7mh;IJ@a*k2KP`G&*OV=&9cQ7fpQlIt*lNC`PBI^ zlImPH8Y7?`GuQAH^NevCDpwA^>W7;4yBO={jIenO3eD73k5b($`*vV-3|sF@+W zN$|&eJmETOLiTNHC<1KQZ)gpXZ<`74qL)7~wB&*>7>(^{NH=Ff;I*CBewx8K%B|RW zGnXx(T66{;&}och%!gvx6p%iR}0t#H?k>-b-JX!j(@Nh~9Q_m7_4Q3U)__TL_+&r&2aYB68Sv zXB1bpI8fX)P5YZi1xm{=w;stwM{h-H?s7BmxRJnWB9Ki`GauJI(dYtwN@_pf4#l!O4So`i#ShRkT2*R@2KaG)bIXkIT% zq-SVnCOj5WT72^wxdz>o)bq;rfZIm&JWLbOm18>BdPFEm-di!@?($j`mt}G@3eXAn z^$Z5vT|&@@7HzS2uIoZScYCIJpvQ>@z?qGMwEQfs9Mu@{?Y+f8sydb*+Qo8$-U5oO zc#$S7IJ>6$F(&NP4UF!~Y2-Z%Vc!!WS!NtUubD&4LrA~(*5Z1MnGu>As#sHV?vrkg z<%{sfl#5{)x?DfApO+r(4I^|C-iUoTEG&$`0;sjcZ*0%~_#gq(HIDlQUT>DVWL>Fc zw9?HI_cnG;&LQf|x3n zMu?NcVKPQ)&}eo1W$FEPg|X}^rkU4SMnt@uKMG~O!esC~F@vm+DF$!BIyS7L93fDR z&tPv9bwxn9SHl3|Tj*fO@kOS5;Onc@$1-%Xkt9DUyIOrX5+YWQQs^4`J|l(Vj9r&D z3A`b=i!uY{Z0sc#W{(}@b_O`ep7MyGdf5hYCAX<@%hxBGX{OtF((|2SzL_4j`O>?0 z2H1TQF7bzCoK8dN9s3dhbQaly?H?gkpi-_?G#n%oT6Db38Oi59U&*?Ug8jDtU=Clegs9VKmMBT`EKe5GaMKzW@J!dkpv@2lD~UA z@wu(x{^P`>K|NLl|Kr3c)+$(JU^88)ane7WSNa<+;d&|l_dUT!PCH3NH(N0XT`;1M zIYa$Z;sh;oqo|WR`EHe1bW>@Z;<>(WIoI^+6sM{DM%acy_yTrQR?*9LSVTQS zXN@q3QlXwUqD@S8zwceJAP5>;MDU|9-%Dy|BMqVl1SQIwn;$XZ7d%(VPos{c5mdfv zn11c;LJhB0kS`-5icxV5_Bdu8sIEK&5p?Y$DXy`@|uYvtztMH#L6ZqWM_6=J-bxtgwYC%sI z>7MBVs@J?6@nzVFK4rq70~H$#&~1i}Z;#d!z!-(D`Gq7NkiV1;B(va`WKaMy;wk!- zNu}tQO$uACJR9?l%;AgDMn_dvlq3=@lqQ%}l0sgLMh#XfRD(Wsr_Cx`)v;aMuy6@(|0(d`~5t))Kvo+q-6iS?%d(5 z`6YiMlo84KYnnB#QQj0Y`ArCtdwW0b7$7GFbo7Cdg7DPk_BWbhOFszv4?+!6B5adV zt?I!>j~3u$eFK~&@gL(<_MTJ6nbcZG1Qj3L-*7;$IHUE1^DpP{%1b(`^dy2XqZgyg z7s0A|D`7O0v}{C-yqxG1rW;qp3k_@o1Uf*Fc`k@KvT^~gwiI>hfxSN_9`GD#Xx0D( z6hFL}I~T6Lvt>JlSP7+HznkqxJ#&q`EEqMkx9irguIFK9zma=$c_bC;E-d!tO@_~9 zDUa0eF1y|v6C}3n*lAiad{r14)n87(e3_6w@OgSFM7s&|r#u_Qfc_9->G3&po~mP@ z31ZIE>Y>{4a13lYtWP>ITv7aJ^th#>N`$vp9Quj7Qj}}9JQDk6u^njMqbw5f{!ab& zrf;k)hx)U@joQHY>|%rG{p8}Et)Jt4rnKcF`Km6#l@Lu2ao(^>bG3+rf(a#*He{Y8 zAzUcwwR#$*dc2?8vDm8AliJY;<_<1|Nmi$)y{0 zlPcKNUe&kvTmuzD9G#RIO8!xwv8u%DY9#+L78f2G%A7E^5)MRY+bxB>juayo5)-qc zP&M(X=pU%Y9P9OU=OQO1FwJ~-@u#@Ou^`0J2e6TBuWGT?EqpN%U+ zXi4>n&*7Mq>~?v|*J~cgVK)Sv1izAwoUh^Cy8*VP71-evQb}+~`+sw!b&6eNcAt+l z2&FY&vm4jTtWgT}DwJ-&9X;-aNEG_mjaO8Y0kRkGK_D5NzaI#-xN&^n50h!HQpIKi z0(}9t7T90l_peyc^csJ!OqG5TS%#?43C9S%iPscdoj$wO?# zbU;Zgp7$$jcD1vTeGY0LPP<*JBysI3=z*!fQlg^E-_~m6_PSbH<3L!j@8!MfSf|0J zB{9e&3R%lZW<~K1Wx&z!5G$?eWerHtr8}4v-+A)& zxNH>cFkYWOfRiB^E+CDp4gaQV{=ECm^8B0H`S+Eco{f?9_v1f-|3U$+=w@q#Pa~^m z^5<-CWbKI0@E0Alype;Alf8kF13vR#5dt>Wj-SsR@PAWCfAU3385x@C@!PoKYtVj1 z(9zM-;=EhdJ) z`p&=G?oa3Y2h(4J=wCe)pN5Z5R+62M@2~p)FPVO~?Ejj{SkKbo5A*upqln>m_xvZ< z-<0hP^q+B`eOdZ*w9@eX=54qB92)pEf=13}21fEC{GV<7ztFj-|8!AQSV9e&Xk%%c zL?px~zQuHhz@O$2MFEiu5&JF+6zEUlEC?!$j6kkzsMrZ85=3Yqgbd~PLw^C{8eX=) zOHNQ|Z!O#c;-Z}CWhFdvE0i6wBo6Z*J~4zW0z_W`Acf|b zIlW2H_JHCQYWgtfKR||W6UgZU>F80jA#%zHcY1$W-WTqFYZ*#PB-zczR2#==Wy}a~ zkzG$A{v>k*$<|CF-ZaVe1T$(={3Nv5dmx*cc}$Z8phZsB89gA$whW;cLdG}`xds9N zkMCt`wTBIRVl&MEa4j&|4Fw4i(=R|+NHW_y95jBus!@2-r~4M)BefOmDmigm3mr-O z=|f`kQwWe)%_`Y6=Byn1>`ZNb-}I?tX#>|=;f-t1{YB}DM3-8`mnal+~z%?j9?Rwe`ZlI-hZ0|NSDOA|$sigy8rUmu4Lzb7! zA2!1sfou=SBj+#590h1RzF);q7>tDW3JMD(1V=}qVG}0|-yYyUb~@S2#)f(*(=t2J zt^y8~0oQ%az<*rAqvY_FM5E@xCG*e2W2u9?3Gm6X zA_Mmcgha!~@;*(H6rof2m1GOZa@~G)#B2uF@_Wt#o5W}Q@&@STkC61~g#fb%Q2%|Y zk^>uDq#%>q*OHj665;|%>#!ir0_?Eu1-n_mz?Oc*UlCmV)KC>}A zgYVOieEqqq0#(v79%l$%J)F-csT;yvN!zPiALlz4pLX#&VPp{Dvv9Tu}C;c^dOdrUr2OG)S=EK)gkZ^e=m4#1d{9G?Nac~ ztyIny-m2~93J?=Y$w|-;)=$w7(f8YC>XRdGjrEOfK$I!wJ*u20&L_a+pUHQdZmgB6 zWnVU0ro|Cq$$OcJJLIv;4n%!V{h&^pHX-?ZRMD8YCX6k+yyC2oYKl8=t(2?Wpr}UGBv-m-97!vdT7!kJ zL9;=@gDu~@N)At{B$*>y$T=84(~Xp4PQ62?-dmVungRW-FT z;rT4K9?n6}T({JxZ%|xes$uD!_k=GbFLYpBL9Rh1yNT<1pj7P|#?XXtPx4_EUCSjo9`v)P~gII z0_#23dH{^;2gjS!33>^^6Y?4P03hBa_ZKoU9$lqs(EsQH1^5-IQJH5uBl$p%-r^V>NfFT<|1>2$9c!Tm{BSFZO0xBXX(oWD+?VP zRz5R;5x{+5+_=cttv-VfvKHlhR(*P_TV*{HCppK>9VR|HK7wbWS1}VJ0V4SW-BC_+ z9J327MJ(~m-4U_(o)$nUA(XP z`vb1RLePTPRUEmSYj>y9D=I72M|=~1X&R>U zZ3?UyPMc@co%PN1&ERw=hZItVBBO+-{B7=W!MM2X_B3ljccLcPBr32`faW9N>6c6o z=tS|vH{n|0W07)^iSVcJHTSC9zRQvD#F?Fd4)XW+EW*)l$}JV%u$(B??qB2kaBmS3Bq5m#%0S-mue%2yK? zXE=IFG%h&}XgB7C;QV80cM^YCS{Q_SM1n0qBsAy zink68o@g0b71DFd3l*CtEJ}L`;_EfAcIDbx;!Pw$-x~9^+K?}ST{3tLCqQA?fl@@^ zuQ{E2%z+VsXe*CQB5@OaS!__0r3w59uAr`-RY5clo6fMZoiedltFwwiw}ck+;wj@e z0v=64O(JeAjd?7xH8(51PJ<=mIQ>r0bsh4Qy`UK&+Hz1KY?~tAe=*esNP=xttW05F z8VJ6pM;v>CxU$%m7~-aZ1>$w6ndLPBe^J+bK1yZ}^*AOhJsYX&JM<%26sX4peoh?K~&?i8o^vvjR;exu4SS}wH|ef)TGz!?;` zV2hzA3fbuAn47~NJB8^Z5s{ggSbBQ(Xdf?&lq(YjOVH$}Mt1U;(zWx2EAFUTN+1cxV>MD%D5#Mh`ZbLEu{3rVVM6gG)? zKXu!WLP8 zZw6I!cP`CxHuTq_*&(bh;uea70~V1bY?9B-=x($&x&&!)!=n*banc~9LE#`)y?*+& z=%#k19FD=@o8Yw38y2&dH>xH|c-#=-wht0O$776vH~+ZIqvM>Z4N&9ip;k zcC(A^bx}C|+MMjr9@K87!a438X!@b!`rvh8H-IVl4Rva82bU$#We@lQG2MgTDru~q z=lZGrYqhw?1M5S3HrcukPlGzk6)u)*nCZ=!@=4}{M)?@rrjOs@k9WMROi!i%hgkb9 ziGE9`Poh}1e?-N- z*;*QX+Pr8K%-oGW4K;KO%uK&6H-A}jAb;C?{#bJ4^{hXQbbkeZNBtfBzfJS!y1{gi zQ~&@jqg3*gO3HK1apsiE`>G$-JuXmqnTh-*tC3=(g-DhlqWuZ5c=&H3InLMDJn*tU zHhAv1Vt)k2ZD81Ri@B4z2}rN{Z+7*<+-{P%+In%=+D5edoQZT?U+A0_Tx7r8R}5Z# z!^>sy-iy$w9-wZkl7MUHa2IQ}6 zu(ZuRSsO51s9JaGEpx!B;)rq-EWZi9kv-v@J;ye`oZ|?}@?*+(&Qlz{j}MhIlOb4^ z7uOKili0Rak88BIkhhllj_RCD47ese7(9Ijvg7NRYR(0o03g}nU>>z;N82v`XZt@G)bRT1q#VZo73(8^K@OQTO`s$ZG$NbcN7D!wd| zx+if~&fHK;N>S*iVvNu$sF6QIYZl1C1x5GGC7Td>Ge!omz>$vKUbfmRhMTQ$AU73M zY<`y+s|@C@7_h9^cagMMkjXw@v1T86=ydoOK7{SYL79z3924x7MIq$#NWy2~fKAb7 z_UFsyD9TG1fi?jk>2{Z3*1?CIUv6OYoQ-c5xV9)&Hgf`w59Q4-%2{pStb2`IE~;CC z&X3gsooSkETYhS8Zflt=5H>kXL1@`J%X6TnrE%cg=yDjZyuz{uEwUeE`8d_m*LynQ zkF%>A5nBay^4dceFsd|uTa z$MvG7D-?-(v1x#Pl4yur&3^%!IG>iQThi*4wqm}@l%{eIx@SI?T^HVAN^+lciYGR#zWuV%9^%u`Bbt(@&FKsG; zvRJNPvG0K&W#Z3eh;L^3{+a}CkUsJRdNhfg1l-h#@O@DuTSnVDS3cxOe)&g)`y%;- zrXhz2cX}bg4m)~uj||?*SHj8&4YZ}AkDJ!nmw>O{+0kvhu6UXs5G+1#BCn&bccY$s z#<<&UoPb;^wo!CnRd{zzcI6!&F?#XrA3rWW0F^k(ApRfH?Vm*fI$C<>f214zZ=>t~ zlw5z?um7pVG0XeX{9$;@-A>%OFsvAyj)(-uA&B1cwVwu+uycS{Xe{2 zM;5rZJe*d3YOUREShU=`ngQKB|FXHaPzKFh#`+=`WrCL67<%2^rVDlXCwA3J5XL)?CIBY-fq@-x& z#LATxmczAhcD0f@B+iresN-Q4#sDSJQ|ZqI{$nBbb86!F9tc%FR3hI;`OkNr-2eYFo zTQXiS2iK8@XJ#XX$}wrmp904U3i0y}ON>??aolOCc#8B0ZqXY;dwlUiB+@185y$f z*O+$x)Sf0*rAqKY!-&x5-lzIVwKiDo(F?#AIUk>s-0-X(j?D0S{WA6)hf`O81qY10yJ-i>L;B=!g3C!6P%c#kW^6q{IS`zMFRtIHY;5^btBR(9jykw<4Pw6-l*TV;US7*``zZ3OEckAmQ5#i zg$5OHhE)c)IW)p66~?x2qa$}WT9$p;VLc3oCRuIDyeq!ox;z07F&NzFSx=P@=c0VQ zUF}lL;^L3XhHMedPAeKozVSNc@t^wvrM1lL?Kgkr0*lNKV2!iOXZf`yal1CZUn0W6@BX1Q5kaa!h8S*5n{p0D0w!%j=th|~(X1#lCUzSs{?wVD>MK(DgP zvhD&JaysUlDrA%4uLD`x)(*UnN_5 zNzX}x$YPae5MFSNLs${3cQ?(i4xV=Rx0G~m&$pHx9^4Ba>v23>9`eYCtAQD`w_kW~ zLLW7+m-s$!n_?d)GbS=TobNMNcfTTa+RuYHXY-k%pC;kdA`ONpU#5;}jQp1{OZ%b9K1xl%UYa#XtYQ$EA53c4!E3`Z`%<%{y6-4hV^#T5$+l$;t@e zT*%L=NyULv4hM*?5%PW0F~KOHBCoPYwT}0BTuBT`6#GZ9VJGX414yGDMS4|Mps2BN zyt)Sm($_5R85L|let(Q3RhWM3a3uQZF*Od8P;m?#{`cgE3yLoHCa2hRRZVGoPTA%a zZEFn0aZ$f>Y&eNublD}j%Kid0?$1Jo@!hYRq`W*&5RTjShBk#o zK3*rGquOgRu)P3s$o!kK9fRW5U1l@ANepTG_iujA(5%6Iw?pUCT6BFbMJ13Oiad@M zIFRspg!A4$`6(eB_WgQhhxFYfO&50j>RpA{L|ygf4QvZ|;B{e3CdlJOqR^*`ga;13 zU0Xt<{dK?RF*}4OAP(Ok^1%gCa}GoiR>{i>Jo}gS zjF1xolU~-5wmTnn18$P6Yawj zB!y=Kqh31hJ~tEk4lO2P@M&;4!mwl!kMTK`&+x?)m9apDLLJXEm9Z%>z3In^DV58U z4N!@?L-25u4-5P<&=ZGz9#+tcE~&B<`s$GiikZzvM}`hb0%i+arFG0=bDYV0afbd? z$%IaSx_h>>B3b`6&&|&LeMV(b^c)@wkm~+NIT8$(mvK(OB&VdK;5^F%UR4wGDB{z1 zvwVXmSkvKLrZB~DMBp}bDh1WC;h;`;*&KnLYge6O+gGzk{OK!g9%(rw=%TL@WtknAlt@{ z7tQ9FnKHi`5@zqr*t^I52kxpY6U}$CAG8(#Ck}kdqR>v^7>YWaoY(KJzOi`j!k)#Dz>}sVM*90pSp-7 zOKLXw_9obZ19c=Wju{1`mGLNG^lc}%7;SQ-^yeGv|4|{QwLCLw8OJq5F`^8ze?UeQibeoQ^pRcCZK{&IPB9 z*}~VPyD^#c39{4%QbeAp{saShglc61J3xUW9`zk-eV+qV$QZgyFf4l#>EI0?3-)^Wo998)kDt zmwM-V!)A(!9`}*+N~%1>jrKgN1OatY{a3}ffYYj;w)3xNJ@tp!M$;W0~RZPks2%#Q3Q^FA2rt6zKLB38-+Nv zZCdrIMM70}RD5IOq|~V8>FB$BO+pZCVso*em{7GD=NzQ{?wTyCmXHyn((#zh`u+}f zgS5#fw*Kfww~aL40cErEeiYOI#+arsW^r`o*>9_DhE#31hMJ3WSFt;4^OIRP|>PFDkOj@Xkyd$b!H!KuVN$W_FQ#e zW%X2&M`1+q5mN9f=!~ONAQ7Sa!!#lxs$yvB`uBe4An+A$HPLca@)tusK)NBjOky=? zi2S}nw)ZyDt&0tQZj9jPd*2N>)AI|grEa2|w_!_{lxZ)Yx^F%U3yKoLwGh;IsDaof zjvO`M%)fg{gl)WUZHN$y_NGDCX&1QTX= z@(Ql^bYTHxB(@~jgiTXgr*xyz=GwPY9JFHb@D*Dw(0kyR#DUI$FsO0!Ygw~40(bQ^ zlNk6_xvC{b(y0kZJM+(9)ztx`uHal%7U1j`xU`{_w#8BW^f6IX@tl4nvA)n`MF6W* z@glcFayIYS+xI%;njGD?KbWU)SZmB5C_}vmWl~=BNW`=l&DeP>qUw`moKMHRk9?SN z?hZ@5$JSJL&78JbNi4&93)8?I`*~fguJWiHNe=9@rv@Z!5z2bUMn#ubDR(*NWD(l( zSgVrutnGbShpqs|upU0fCxD7rs9=A%q)sn`+Mq?ZA((P_Z<^#y#VdD#2 z;z1@Y0GsI6Mj?$KY52R<&gA9ufD)K_UL;9wRfMXU<9>Qgj`i2D?F>o;>Npd9Xxma> zusdo}@3L&Z#kYEd4{?{NjiNOVH;ZMy>#td53(xUfRB#{Lih2cJFDEShV530Rc*Y)R zM=7ivm5E2G5r!+8Q5EluiaG%W&;lR&GLp=Jq*r}+7H4zZsx&nsv$!j`iyDz(upEp z32`r+zRpjj&biY)ujntWi|M>9D$@q~gpP7QPd3toU$|~y&S!fiog3khz7S+UzPvMF z<@gE?Etx1uT+JtWT?Kt>$I~w7uq4bB@a)GZcfQW)Q6-TybB<_004;oqgl`=!uP{+b z9Ig*K!`{KJKv|Tlo39VvdCySedDDR%3TxbUbk58LJ;j=NNqRaa_3gWA zuRwQ-wNC-r^R0XCGa-oh5@%XhE9(TsA{Hy7h7S&^FGy!fa^ zD74AHhU&~Oq>)BrC^hfuMpWQ6^m9m==Y7a!__2#4X6F9vmm;JO8aFMZ7SbB|#5B{o z^SB##vtuvfZF|mADPo##!!M{V0vs9OWKH6pCB`^(dw!=&%o~Hmy9oQ?GZD#Hx zJX5T`Fe_jV?fb5IXQf6`_7Jb3{simbv^xqXlbs1zPzNUXHPWyaNs_S)^<^VjXp*Z( zE#ZE^?FsYMr?|y7wy5ctum`Y-%y!Gru@z_zcw-EH5f4X;fe*ZR$?-QS#$-!TPC4a7 z?{j$4Z`2?`X`xPbcK-R4l#wl_Yn7~s5z5T&WHoA?7CG7%+U>6I`|sDOCO%iC_be0b zPjfQvH1kX{1{>obJMa*mYu}ym{bw-lE_O%x**UW6ISFn{3QN(p!wzl?-BDT!1G0xc2tibsOSYerzqE zoL~08M}RH9J3ZxmW?s@ZLWl<%RD0J`#b16r z+kSAPQkZ+Es+2r2s^GtfTg|+@Z=KuxkpEKHz%+9gEOKD`3*hT%Jt$)LJrwf9kGq>- zQ1)Y>CjDOrZY`Sgag2(0=+^6AM}7xSm~m8-qI@IsNr+Dtw{6WzuW)JeXc}0huQxh zOV=2rNz-h1cXn*s&)BwY?AW$#+qP}nwr$%s?z~^zKh@dQ9nl?KRi_fCGpXG^dm{T7 z#yLo94Rf)h1B|EkRvmML(+<}7)9DUUE6v}a;FEEIHXaQ7_}ae4;ytS;&RFzOK0-G2 z&O4o+Z-C&CyIg9D9niP9EF_~>{6A9`_$C?eke%NN$#!ql`!}&+uY&Icod9}_X)(c*mP9hXpbU zpF+m321Rjwps-uFoP4ferQmcU;lp4V1TJ@=%3s_j_<-&^R~Ys?_(y%77fR4elp|J? zaT5(5R9F|MP}pH2Lesf(Qb>#785`{oF7ZhTV;8YEJvi><*RR8|i?^I^ zpo%^5pLo)FFX|eAh@>m6cl-7ws`^YTVmgR;*TB;E<_k@7psH< zZairV-kQH|n4?(m*GqergvMJ-gF0LYi;+s1&zSs}gQkq6*aridvH7vH_3ZmPJk)VG z7tR1sLb*5uzYw>^732sZerIj0kZBh7s3glpeP$7-;_SY zHRy!Iens9i35Lc!zS22SiqU})!RWefe5uXu=NaU)8rF{gJI)EjNHsK8F$bKm>ibj0 zGHON`%PlI1MQ#XRq0x%VjY=e=cd-Q%mL(RHfb)@X!2n(P|D2RTJ+MNxz($p5l#Ffc z)9!Gy=Jg4(2WVv)GC?2!iJG|n-Dp7C@>Eb0Qdjy5vIZ`spgR6H(AS9{9(jp7qmCrr z*NWelTd-^}3@zPZp4}mPG3YK%$iqiK_g&`(c-TQL18iW|>RKY}mo-6herQ>l$!J?O z)Ixp>27zOO@^c3qnVvtLsoa5&Eb0VtLAPJ>=ourn5c!MXo4%cYu*w5BKlyKAE2HXj z=w2xU^Q2$TE9keHc`^_odT<+hyFQ@&s=s657t%WKjS7s0jf-1xa0gS4v~MUjJVp7W zd@M)69M>)ec#j&5rBu57f-z+RkObPVAAD-%~@qa^u5aA)QnP{iGIS z#vDP?DUYVJQL{HaO~cXU84UC?Q;t__EF?3N(M}zIf0yH{h>o#|2+EMkv}N$=Kw-Av zqrN4YdOm&}8f(WPIURF}&w*snv$@T4r9F=v+XE2Yhaver6dop1x>N{)^%WwyTBy8Y zmNBx9inmhV0M=EsPd6OUM)kvmtH}i%=Y8BK@p0`6FZTbitPqrsD<9mMiQGq0U3AW0 zsK(^gCErq4byGFIjq11<{kbs6}tSzrx2s<$j z(0)@!Fp?lEVL+63$h2I9U~~DUP2q_{sT%a=9>CNrZ*TV)884ep82wA4HsqKy{oH$v z7j)WaP`d+}MO_E07pHrrp6KoI2Of^#7x<)uoMOwTv{6>Mu>T6a$Afy947TR>_?n$( zd7d<;Mbk@Unv3ht-p|w1&;n(EPXzW-CMgv=loJqNiJVVNn8S9R?Q;ZvS0M2z(%SfIFCB)zifrR_$bu+vOwt`&!sG0H!3tx+bV|fl#RbKaD(+_q1+M3XxCoEgaXyQ(PvC4g zPIU8fAo+sJmH2Pv20}?Lt%= z?b}RZq}Rft;#&0DChvP2#mc}695IJ6!{xB%>&eg7^|bHA{U-V@v>hlA2TL2`IItwo z&AV-=S8xOZ(*BbUW8y_YZ^Qww@XPPI55)ZrEqJ8Wgk5<3>~i#X@bBkdzGY733^5}M zCzUc36wZl0aKC)ME-4Qyn5}MA&FVLgi1yw!jjqB zD28q}=MA^jkSl@DY^P(x-Ajql-YfLz-c=e7Z`I)|fw#dd`uX2#%G_VN64>42-_Q@* zsCAJ0xO3i>6u93tg;6|;#7Ykc`QK$JLhhYe1#Z0Gi&YjM`AMTM`7kxRL@P#q$Zmkv zaJJD&j&Y+=uAy6Qz%y1+UyqwZ;ZeIN!Pn(x0@q>CfO5aW4dR~&%X5wtqhF=E z75Qq{W__F0k!GYP4hmrGhzqMfJ>>2R0=I?v;)BXhB}?sN*o&g1oAhOiRm>wS+q#_| zh^vU!MQ0J*EvX3I^{QQyyC-ac3fnd6`cfQZJykIlIJFzyqZq9)B2Yi08Z4InH@MfS zPxp?v_rIaF+1|;L#v9~iWOc|!W?^Ykm_WC|#p)_YP>r9V@ZA#puLw19uU-v~ND~x7 zG%xvt(P&O6wn|GUaz-yGcD$X0Rx^}sQ(v!#!nvQmo<349eD#fG5*c;3B zpN~kSk(%|V*;2eJQTjn0(8ok%jY~6ss5|VZFM}DZD3`EFZAP{}b?D^q&GZH_I5f(1 zSgJf)-S`~Z6>d_=B>*Xu6Cy-}753?4h`pqczd-YN5SyBioIZ6yDHYcB;H26l7RE-&jeFyjr zEJCl%OdD{?{zvdlSC;t!rR#Gk_QX03aotvb3KUX=Y@AV75vlf#B2iP6#ZEGU_JIsF z9bvZd#`k#Lnfb;(Rxsi?WS!$nyc>v>Q*lQvBonf8Nke&y?F<=>f_bxYh{k+3G<>}tB+I|EnqOji9M(KyL2@KBxCKWp?|eUX_xuNlXN}`4 zK~1eZ`gBSGqx!M9X)ZA%|8{F?P>REQ4)7L_B?8Sk4PZdQGnsGz)cIobyK-?f!T$&| zsQD~vY@!Olh_^I&YU-7y;S+QuY>ARQ9rCKg9?EL{1v8Os2XV0qPW0{X`Roqvc4kef z_I%u*{SAHtFT*yuLvdweT$F?y68>wbU_nK{-g67>>4 zTW@M28D=rk)=7r^ixG!TA|?uR)VSwxNQg+*P0Xp+Syxw<|HfIC%HyU$i6(GKpL1d@h~2Y_U#x zjiM_pc^ZqDLK)2pnJjeu$wp>SYyRc7-6t#oeW?Wz79$9M_bP*p8NDVYZqb#6Gz#jzW4ykE_<+aO~WiW(<6E!^p9 z9D+z;k((@2PPr=YP3Gu;9Z`FRONsum%$~}qle<041MBTa)o<+sP!zP__H-80`?sIz zl#=1oMqiIUKmdZ7T-g$?m^fq%36#@)nY*7yg=1#|tp z>)66%v_WtimMQDS)n?F)zVftIo01wIv0yvk{3#?t5;I%^4l%r#Da|GD_OWl1`HFSs z0GKpEyUXJqAHyUWT}9+WG_?P?Hi3~e0d`_zS5Td{;9&won_M6J&%Ay1fGE8>=Qd1} zytZKEGV1J7qjsJ_@OpB@$WRRQAg-QwTUVF1g^D&A>ho_A?2GGtpZU(1;+LU83U!E6 zU6}PYm*b+BtI1E$>FX{J7qvy1Y}CX1Htpd?KulsK;jVfz1A2^`eSkUTSZRnjtt&bBhhfm}=wVXm#xArA*05wKgRGDeabW}$Nn=Tpa7ca(gMY~gMTrroshipADU9Sbf<%>S7Yjyir<=v^y#v6V1TH@kxQ*|67 zvF^FjG_IG>htpxTv&P#iJMv8=Y@F3tj;4K_0TXJ8jen7n-+4|aMNsElV$;Ki%+m!Y zPlem+3@k=oiOfqXJ;*|?TNKgXrc>8s1;`4w@OU?8^wAeMh;Daqy*-;Y&N><)ylsS}U0 zP;Dd_B7cC?&d8mC9b5Mj9#Pi{O@& zuZ_R?y4iW@05Fv#Y^gF!2C+a~A*yY=BiCl9$_+uF6zwEopUX@+AT0U*Y>o9ze}DZ8RMC23U~pWk3Sm9K+w%*o zMkvj~7Ze+y5@x;c75{N}z$tg79C5zYG>iCO2IQC07$=a1dN5;ww1b0YjT&s418!At zTmAi$UpUEr^c?UnPpb1Y0=gd?++%Ujyr42Ij2;R6|Fu|4p*@LG-58x8{XyTqSgAXn z2FuTYqP$&!LDESvHa7~1CaqL#!t~1E4*bZ)L1n?EJ(02?Ff3!drpSv5QiY_7D!b=e zM8#iV!gQ5q(inU7O|aU!07p8UB2yb@Pvg3Kw5@CfDj3bE65}O0mK^(djI6GEOaNu2 zy+RM^FVLipplm6(SZ#1?>8BJ;Y=$=FhX@3BOT)w@N z5zn+h5d-GlTAPVBU?gt{e=9y^z}sh3>JL-Et!s{OaJQKhaFnA^9$_p+D_L1!l3dM{ z%dJ1-kglj?BcbLz0PA!yN$$!$+q^8`*|qVoV46v@@BL>~o?7v#dy5$rsn^gxBJF;g zM`4J(gB|Mm4KzZ&EJZlsuW2l>))`JfAp9ee99f8#rBRAWp^n9)Td`!&?T`0v>scjF z{Dj%0{xCj9AOu6`q!&Gu#Xg~PJEV-$dKjN08588M`*9u3V#S^!f@AnwF465(v|xOe zunQmjqMbXaF)CsHM+DTrL6`uQ{Ui%~GaQ(n2$j7D2duv5fZ^&O&zy>3I+9o#cN;TO ze(n{)osBCndQ%Gh69~Tv819nr%{mSEa@r3F+T)g`abe}44|Dz}Sdl956LnLisaTC< z7{O^)D3XtP<09<kYYJW#ZXt`rs16IQMB+kEWrLE6<(iZpE*#j=oGMleq9>(mODT|S9>AlX)bU*aCZf*(x>Vzkc zzJ!B+RyQ%`NzLJp7(Fb&{}{f?++LpZJ&}g3qz%#CD6b-Yd!t{eGv8(sgc#Nk1tEh*o zsjP7(B=F&|*1lW_{+EG(H9jrvFA$bJ3$bX#w z#hyD?6Xsu3)x`CG6lLxh8Ne1HZ$G%upi|EvIti1V zJVk!NjecI&GRQOF3nKQw2fAEPqrV5(YdS}2VEKBSTNDeY*-&Y@g4>yuBV9WhcfW!r zvTuC^$4`2I+l|4%6G zM_Kvy{BQoET;+v>3s%h6lRNLK3^6beKzrfn?WV1(bbGy-cRPQb8^Uo=^*)2Pw6$O^2W_SZrUv!NEX7|^&04<3g<@J zubISI@1I%R9f?WVX>b~DqoaZe>5hh7lOMzLQ{s}}DKV_g8WSq^cFuABlblaaxfCh% zx3ydiBA`m=*?Owf3L8IKw%izgg^OHn8@dSCqR>v(CY_X^_BgM&33eSv3x zK4CeFQP*z(FIJc4CeHzZhW+Pij^9muiy5gQgrO|q2dyKVS}cD-q?80p21f_m&ju1% z@soj^^OR+u4`V5QC@7gWtgSJUEv)~t8t*Xif@FiQ8mVvTlQ{QcOq*dP5sr&@Xy5_` zepY@9H$Xwk=|0*P7))cX=1Yaerza+cs#*G}mc_?r53fnQ_t^$0Bmi3{rTZ6U2iO63 zB`FtS({uSZ#cdv=$Ml{~bQ@J2Fn;XYh?d35U9wx`?C$A^9S_km$T8u&evRWE_T}ASvmMgMvNq&_EjV$Ito*_#L15qDi1g>)E zo8-x~%ZDS@{~+31@~llPXY%K87WdCiZlW0}J7XTUr@qH}n>N)d1w(7Ug^H7b=hk}Z6f+SOEY zcK-%zzW#MoFiV-X^d>Gm=pdmt?EyEx2(l5A(zjSz$we8*2p+PsE}$U* zT?G_m^Dc|8c!qq&mF$;b??0B*K&!1xNMePqZXyCe)*(Yn94&5pC4VA&2(}ZsOA2|% z`&C6h^q?Ic2`boKh|?##6KM%+anG>99|F~Fp-5r1j7uxYl~f#+fNyi`#H?&{!H`dq z1_?%SOtH#VG~;am{7*83lgu3Um1zWHo)K^r&3)nP!_3;ruI%w1Rji ze%+RAwoGR!qGACeysFl_biy~aII2nFnLTJ*>x;Apd&k}3sQv8zPCSM``hs|lz z@+G&Mv|P}V36Ns^&FJ1qd`gTB^YrAXocS$+ew97kcdjIYcxvr2+IRhVy<1K8n>{hYKWFYPIry4wy##QVWa|BvK!(y}u9S1Id z(qJfqW9)*d;V_9+E^aj_Fdt3nb;q80y&rNlyp59+w%m%bo|CajDrS8PxVBtEfGOf8 zgJyeWeg2-#FgKbB5uq4MGb+#0x9984k(6S$i}b61+b0^y&D*^69Rn^sbBqRPA?HqN z&O?;wK#9yd4s=R>am2CHG89RH;tjB>5lE#W4SI!X=lw91Ix(foh~xYT$P z5qu^=y73`rWO?)#CnS0F6{r7~7TOFcrVP39ekFhR1>O3aad?pyOwsVX-`(s5N<@Wa@&$L1lhOX1WY8 zz)McH89DJ`arGxoi1N^GI#9;Hl4;ENxa;Gx#$^+(hr_-ozf_yEMLHn?Ao;!lY z5S1ZBOC>?uQCubbb%$s>!}qII&D=)`$=7e;aW&5N^j0NRhHV40&V-SA(;&9e^@~WVD@+tJYRB@N3!pVL!pC}5>ibTr#bPs{5<@ke`X;N@XuzMKP2W(A@Y{kY5eEfx*FLI| ztJax0jXRW&U;Yv}Y@F@|RIu0ybt!mEJi-EQjfF7NZ-7tzdAk`BM7eFz^Lw-L6=RGN zxeUPQ35}@k?6D>(i}BXnZv-ac!tgiBa?JYxwN03J)j; z-b&<^HQ0&bA9Me)CQQu_?Q+=DLq2a6T~WPhtzQVoqRdrQgzE z8z^E9ws1TGz#IAncw}1AW3U`TR`mh5)IddC#z+Hw_G^KJnF>M(4DJ{`2A6)^ zaYA=*G(^%P4;7qLQ=qW1W_q}(gJe@4_7e#JYL!Rq{U_Ih>D!!n|F_vpb|MVhwvA~D z(K7*;a9tiS^-h=%iD-L5%|N%5y+^x4O`0J!K1)bJ-32E`M7BYIaHDljAg?MvSbY8y zBl@Xcw0_GS-T|e#8&-P9&{u;9lg`tue0y*mjU7U2tHYncdL`o8<< zo|aNNG80%bm@q(OfQKQx!QNS0x@#A{E=`R?p52(A5Eynv@RH@Z#^tWsMY**Rt`6Pp z`4Dd*gUFsV4&4+Mhji2#*id{iQb-`_q(}D>x*=T4ID~80f7GmI5%%Fhux#%oT%)1; zN`=N2?$7(_)LKLE;yDpH_e0I*+uCrm=uU7McR zds*tNmimF$xQ9oR{K(O0RYKO^I-gKA{N6>Tn(+jMImnM%aIqdAG?5<1b@sz5niDo3=^lirm6H4h17wKL?rGmr;D$ z(~lT(4gQo;RqC@R7-!$$NirNvyCxft(?Mz3HA-UAh|LPc0tti{6Y_s0apYFSsT%~Y zF;?wAOwm_WaPllEd>Rx4Kw<6AQ0fZ}pqYgoI>nLks6aNB2nsFQn9+u-Sp*W3i(N=} z$>2e&o~G#sHvRG87gh{sYNYRpm5&8%?MEk!MMk#l{@Nd#s_fO_eId3*Tzkg%9e@w$ zdQ&oRC*#2S{oX|ofgvPMGv+QbK2*2vIH$}55=cvpUFN&B>HuZHFtkYaF!@)%78&njA>WRN7C{{AN;kS*d^`Ak-;~l;@JHY6(A+|qY(d**=%6G+ ztXbX|q?{wxhoAsxBK{=X5LGqK|k~C!!bM~ZGyCHtni;}0lB|qsiWxv z6w`!J4pQkh18itx8!WS;Nj(2~{Rv!nuW-dF<54hn+sS3z=Pp06r*xV<~8_P$Ug-fof7647uNf zdCNaTi~Zdr5?}vDc!tJ($p)=soqJKA+27PG`_u}p=##T?L6zufCScGkdU*a8Bx6|u z6i^z81L9O7iUVjlz(6-)Q7?Xa7Q6c}nZF-1m)C7iK+q=&Oq5CK(fNnUX$v`F4w47a z;#U(X*Q3#aPLpy-`|c2I2Z8C4$ZmYXm|-)BH#m$8;ua?wYB}|u-iPOV;3MKjERgz} zXglJbUDi^GZeo3l|3%k|?G8a5rf38K2=KeNH=MufNrmxt{#+tjqH z{kghltoJR;TGuOXar$*A9=x=QI-l%AG$vuh5FWKi}*zOQHR zzJa%t--yszCdg#w#?T;wjYiM-{?5*x*Zd42 zHmI!8Jb|u~tvU)rcWLqz+`AMT^+dhQ;9>ZT#mo^o3S~UNO>3ouZTvo=(?!q(EFz0X z9G@VxqkOit-c2%oP`-k#Ur7txy>%ZuZd*_kG4rKMrq!+iRh@J|Ph!%oRcf|$%HFA< zL5~EnsJ?R4gP8<&mehd;Tq|#3{UdjElfn-yR{-6ja3J?YB~ZJv4G8nl&Xr?&QOGY{ z&35)XYpCryn!_ZE0|~`$HJ9&r0)LfV+T&B1Job;uudV<?NRUuRT=U|GkSzZ}uWpX7_l#+@JgYs^YqJ_A{}4W--ai0fh)xK9o307~$Eevrt^j(dXz?tBXFd_*g7kSv~4~fCd>f1CJZ0z>d^B z=p!y+d!M_y*Agmac^fu$sLk9R$ z`TewfJ1PGzCql)BDdIQD+~~gMs^DQ;L2wME&0G#D_XP^dEgBuV9cfVyp@4QJP5)~7 zJFRUI7gAR3O_eR(0@-TP5H1x=e@kVSqZq@HPj!ltCrJ;ES}ldiMa41a|V+ z&z~@MxF?bY`7%m<4bvP1;bLe=5)pEMi4fL66;lMp zNFLXK13w?x)4ku#Irx-Z+Y{_}pqYX2 z$dnf$gGOYm_UWr<;dv?U9OIBpS;gza^tP4&wDr^zlR+cCl+|S?zY^=U$b0^l2MRa zv1A8l7B|uh7SNGT|LclF^9*3CQy}5Mm+e@T$G4+~TLE)8hBe1QWN}e#uZkr&R8H#Z zA9(6JVhvYQFG-LTj^RuLN zKF-)fm(K((4AZD@6{^zgClO0O)VwgNRoaPET|T?1AFB40@BaD{=%5i*zH1<;4+CU{ z(3Ad?hz$=rm`F+FOJgqJiB64EGn@h5iX`H4v9&3V;B-g(>Pm-_H@KDqiInYdMo;j! z=J{zXWqukOb&y6}&_@$Ru+yakGuLB8r2((yY3joYgd*2yZ4?>pF0(6~sm1H5;^S0Q z`oX9?zh$HLRo0t}$J5u>dzR-%83D4^=<+jtk5~Sq+rxft;SNU2vawzFMT#>*WJV;2 z_fvt}KaZ>=+pY_nc104tWuS8+KY1n zUkIb>-vyT3o}p!b-YWb|ZXp11d6u@yX@@1T1ykMDvo?F!9{Y~#Oc@7F1nAuC6Gbof z!5Zmzn7J#(`I|%{_h+N*ODqM_j8TF1EbFP^4p~DbAtV)@q@s-CZCj-`LhW?GQx)Jz zNtje}q^Jc&Zf$8}#N-D2sJ2q0`Qr{Q2;MV~&mPDHA!k~(oqVY1vxFrO`EJQ8gEy7B zRK^PkRs-n4%GK+H234lWEr|(8Qz>~qFaNv^SjbWcK53!>4xB2TVT=kSfb=QDrWMU< zjMD+G-pK)qRDWJ3fzUx@XUqjLk3`y-`13G&H^3SGK)>z)L&KhkL{eqb(Fh{S4PGf+ z$P!)wub&C@-4p2-g;XF%eDBZybCjD7djZwk2E2m%vVkRS16#=a+O|-0$xQ@uPo)BJ zV%iY?`*$%w1m~GN@MgTknXEznj4*IVXu}xnV6^;77Q$;&#+98E2ePMVIH?E3f5|A> zukHp;1h2&?hozc&Qb#C7JqJV>UC^O(;}W<6P9AV+L%_ECn9BR^g}Z=)CGdh{j)O)@ zej}~L#T6ySoE1>fn&ri{4%?98!4Ns1q%#sxpY?)@W5%9=JeLM9wN;5_MfwR{d5$rS zfkFAex}lZ)Ryn7oDblY=Kv{bJg*Mz%qc@iBVXP!y0Y9u5AEwp8-Y(%mvR6@}Du(s` z8jUM&R!KCwaEs`5YCgXQjj_7bOw)qU?^3!r+Wo`t^Sb$))MGu}XN?w=`FX~6_!<9= z(yvM^5b=SwPF-sW&;jqC*A6+{J53|p^N%24>pU=t`I3~!d&(LH`|Hg^d2vukP>)%}8--)YkIU)$YlrL$wGeXL%lF0Dg# z_Q}{$^H%&nGiosMR9p;!c}4sH{Tj}+dei=oAI@y%wwug&D}LPT?!%@$f=l$H`Zc+; z*E!eWRJ8uD;asKr%XfzS@`+c&hlF+>iLl9J0Mwek*U!JpQ`Viu8eatHVrO~P2K21n zX@*?iABGNz9NiIoY~PuqlY7V20If4gg?pUy<{yIV$CCTlR(47B$@0Ii(yS}YCF{=e zjn~TOgh}m@J;}~-I9r?ZFOB~mZq79cvKpuCH+N>Zz@ z?d{!zM}QXxlDlM4B0zhp{ZNmgD+J+F;0=5^?|qT-j{G@lUoNQKY$(9kAyAjuYgD{L zDtk*&1r&t$)usGQ>T^)Fn>r4MWN1gPF#p)aFX6ul!V3P~2>J!0wxcSq!5>G|8V9+~ zThDUCEut>3W^;_G_aBYs!=ip^;7DR4^HLpjQ%TAAJ@18rX5e z3~JVnjUqkcgG=7e)?bjRXd&xFp}?w%h3LCpwaBTQ4ai~=AuA;J6Ybm_b{*FKw)oU? z8@;-LfIxU>o2um#b*EiEdz_8t-8(%Ufqb0ihxFFKtyUC9=WXI4;KN2kZDWVV3b^+d zeEL@@)o7R8+uQY$B$^HGURz}bL=7cY4?lEGw#p-`jnTiZ$N4GsniOTd_Tl(KXXm0B^gP_VaI*SwtQ@n z00OaLeT9;%#cdSP~QaiOd$YDr$1YUOp;9kOzJj3SAKoVK&A2{?hPH! z4`=WXb~~1T?HT1dohtuOf}F>y6cy|AXfgZhm$W*#xPyC=$9)SUwurunjrp)mW0sCT zpht_!bWOSK(lqV#@233yGjQ+{50ID10>06Fd%HhNuEx>&nA3Vg{X{1f?BP5Ntw6A6 z@|@ysJWns@KrHLuVsM900_AdsX>!&lvpJxFU(T!~$w!yu7oBwZT4y%yaY{(YH! zW7z#%#rPwZ9dadkZUtB_`+ba-i@Y!zdI3UrI12VzjmEs@_=il`r&fNIp`N)8ze#45 zxdB!CMGEjWSvJn2LKt@DA&i*SAVdQ_I3w((!CHOz z;xm!U(L#6(hP~UwSybG(oY2Xkto`sz2g5fch6Aotmc+LFA^d#jSd~@dH>sg1GJm~@ zCT2^a3_EN%scy?3Giv*Kzk5c60h*Y}=(VsJ(5L#|on1Ly<6)RdfXP+|=GzV4hp-e{ zure?$VMiS6qcA~d*CV{}kE>`oX$DcU;ABdftf+e!WVC4-?sw=o7SxyAezYWQNqWA5 z_5jnp6~{4@^Y_DK=Zw5(Jv}2;;j+(Z)YJhmlfRF|6(FYGS->{yRs>$tKTu7H^_H~I z04<2R)gZIhXu^ypYzRsEL%naP2Dl!!NFpVRw*b2@EFklV1h#I$v5`l$Oln?9q2^o$ z(#|%KTK)ZxJ6d`8)61TQ@f^fK}Sf3$0pzLJ;=Yh8Z@vqA?DAsVVt)F#vZs}%-Wp!6p z8IiUWJggF}6pagdreq<15ID4tDyi1$7)bpd>`!Nzo?i66@|w@e;@tiBoX+X&MM!t} zw>SFyf^t0DA}^aF^l`{+K^_4!HevNNmt$g+ONjKruk1S}fK_d}OXZe6f9=r)HszrY4rS+VNw@hI?vS3Jm?4SNq%vQZ1m)YY|* zw$vBT+o@RJ=yx*?B4HJh$gqg2)SuPig4ecyZNtqU#zc!3oPnxo+9Ok2nF2kVC5K7d zq$CO5;O?1iD&3;s8So-NWNJ*XgqQ;4AAO-t@0Q!hWzUIR-7I+znhs+p;C2L&*utS! zE5cwc)3X=?6mdM|Cx$i^S5{DQjWBe*hCTfkKj151966qSsSB7C+tUVpAB-uayY|bXu$%u87{8w%EC+gv5zZoXMru zi(zEfimheSD=k2pPFIv<>Ll}RHG9(677QqYKTNxws;+~Cg5bJywJ1JM9WiB|8lcBx z227ExzEcAnOPIm2>%VlDHju=sEs+H3BD+FRj4ksxW~POsORhB~U@d#ti!Jnfp2~WrF0?De~nKOfEYmORU5V|cE0d4F~OUQ|q;JAVId~dEu zhWYeoanbzL12^9oHa=(*?_Vqpa#28Zk*2G??8*>54RYvnNQ%3;Pb>>A1}W7sXK(SsU#ZPi;Yr4^veQ$+uxH0}APn zDbKgJQ_y@VXOs6NA3-FWMH?hbcNV_PUyHaHT(WsCXX9e7XBHzK&mdhccGcJ2 zS^3-PSAqFF=r+}?HG=>m$3)^u^Nyu3J_W8uLnO>kQ3a127t|~zziS)x4(|uw? zJi@R!zwUz&qn~Z_6m=mCQs@uEmc5l?pW_~)8%7UG#2+ns^(DuOU^T=-w&n^?V$B%6 zl6=;ja$&c#`Ux1Y)vV?nKEX0I1}Cj!s@bbjm4N09T&<3kF;%-8DmNx%S106kW)o7R z?T(VbiN^7TuG450Ox18p>uFX!b1PiCscLLD4w7xDRFP`|`e{xB(7fO3JmnLFZ0Sxu z`&&-VX%0^g15o z`7Sn~9Q3fIdu2?8XUV{=upYXYQb~Cauk`mHA>*r%wG)@@G#|SXid4N2TOXnu2RqaC z$*S1H@ok>zC1lbyidH|e&4KXc!U?7XwIw8u!0QA~aH;%;v^j+4YGFRVxBt&GV;yz*KXad>EHGb8kj4F`( zu;xqET|!rgwtv}Bv}*Tg=raGu+*?3Z)pc#dfHX=N=r)hxtEM;)U7dbZ7^o{a?q@0X&w>stYCr4hnAW6h@AXPkRqn0h4W^ncuQ=zD zZP(_%_BxM#J!!h}ovXNvjQ>#&(?Y5rHRP8<2e8=6b0;w(fr zq+n_|>MKWehK(?n7C%Gs*aqC0Tj9m05|Z?*PpxqBKPNZ6>C9k@bo4agN1pZ0kQ_Tt2^ab2MYyL3C-60Z3g zSurkLaCDhIqVAiEg{WIh$OvtIoT}mH(TlD0FLY~=2RYLc#g+2L!5>0_)2X&RtYFd? z1Q9b&)V+OK6!qg>EMmyH!?YjKh2MMfX6cidFdJWDo#u1ICL(ME)tyuvM3K?Zg~ZkA zu1R_&+gA^>9k>GmzfuTr_nBjzPss2z3Bxu$!mi6@3HMLUaP!9?KHO0zvT@2}8)hTU4ESBkfMAE%=Ge-YCcI^U`Zc!!zw=!&WRgFd04HB!25UqW>oIFuvSyQYPV`=3s|4ciQ?w7uz|3 z@HIE<&PwG3b?P@dqL9_0`#6VB7h1Xz?>UNUJ2dP}b~k+)z9pXj7zU^M1kF?$2lrQQ zANJy7QepHEimKV4NTOR+$j`-$3|BMQb4sd@-@2W;2e{LGqqDm=sr>@OWqMyZl_U8ZM15P+_@(TC>aSnRfd(K5<^+2K^;z}x@0@IxuU!`WvCh^Q4bRI3R%n6 zX+G6tBZMUy+BVN)-DCVr(ZdT{!%vuX&^E>H&KD7XM=Z@}Z(01M%!^Jbd^tSD>KgwC z*=a$%$jP*Z=Ay4C3`*bB;INiuSKr!_h=VAFjb7V!i0fE!55OoN)}OO>R8JGHALP$x-j;(m3qdgJzQ}}_67c=-6cBGyQb!ACC3G~%4kaBSmo%Zcm2@g zEK<~RH5{rBI;pZp3iTZ>wQR;;dw3 zWRsT1XNdqZW%CGH6#Z4{fx2md$IBls;a3ON>^-)6T!gwb3j~YES5BSA{aIu;1YId! z?dMo&gw$j0r3gEfaKK5bmKI#Hu@~0zd`@A2f5@NoC3$(GM&3wzSm%BY_cJo(daG`} z0L#&o;hayZn1~Ld>3@KwwMfcTR1ZzAZH?>Gk8z^C99&5d4c(Zqk5fA;lybf$KQdNf5$@_DVCOi|qA<0+%0S+z;QZd0 znn%%2hG%&-9#Q6z`-!0Tcr@@Qd~&n%i;Q36DIAuQr$dRB1DaN^Gq&tgKPDF=Nib*Y zIZ4foUA}*&z%)Rg6{_^^O?QNvt6g;Xvt$nc41GI7G;s`(VxwviL#>rcwQPICi>Jm5 z97H*p4Y@Nq>EL1V%-6g7FfSrl zPEm>gFUFL5@_>bquq)WVyVd)O8WHzNrlAbFJk=bE?Mv?C_}Bdvr8weJ!EbXBFE!ck zwyF8udW&Z=Asl-yhtQ*c%5CX~a;WGZDoy&3ogzja<2`j0mDh>G?sn?c7$;%F(UiKe zV+*^=Kyx=^O~1)EVM~MO2HDLpB(xV|Tu66EQrr0)tJHPP6YJF6H_pDX1y>cM_kFI; z;3&TAtvQd{=Bus3uZK4jkZ7ZOyIdM#+4^~(%1pTe{n8+-y=r%P`umADU&;LT4+WwX z{0)pLe#yT3L-L%}TgNMhE~8KIL(>kqt9MoiOYPb013q@MYf)v^h28V$!%$555*3JI z_4v_g`qk$znR^UK$$>&RuULtunJBHl+$Abkp6T+JK7UW=Sya19PsQex0_BjY=bnxiSI-)PS8bb&rXN_(rih9o=BKk}PhLIn zlM)M1{B~57qByR)>)(ytOHfN9y8Try9gB_>;l(_TA`RROD}Pk3c1j!FmpOiARD6B5 z*WHC|pRRf=7|_K~LRlS^x0f5wraR`#?)`h8n(J4gLt4_Xv2$~=|87*n{?~R7(8k;U zefN3}NUJQ+D*I3S`s>%OgD-yfuSflR|N6f)XutmH@1{8av4K6al%>A$OVDlm`d`tT zf2IDr#`dV7$Nhh7Y=7Of{(r5p{h!|SkPh~sx%|x(|K8>PPcwVabe>sV{)O2~1BdHp zNLjLybKEprl(J+a=eX|kg9^Frrk(xuZOSH`(E@xQgOzrOyPL;pK1 z?AbWk+1PkN4|{G79(F+gpa1{w_ps-HXoS*V#Reht|7)WD*~I>u;lGKx>Eh0D(;5z{ z#=k|xtnB#0;gt>O=6rUZb7I0fis2 zUI+&MGs=YL*(MtPLopkh-dm?g;MqPV$mBd3@$|RvLT+dw_ntvEAZ0;?5cMWN2#>g= z;dJc|_k_(_er}50H#+klA9&r5Z8+dq6t3y^nZiz+NyF%Pe09?6by%o-F)nDp z4Sek2kVA z7{xV3Fvyrb^=?N4Y9_j_tJ%Sb2pt*XK`Trj&>nu)o2+qc+m?aFzqyf^*Uo>cU~PN5 zSJ47oI{UTB+;BYi$#VQ*%}R#!!)pJv1-FV2Ac*z!KvLJ!)m-OUSP0GJGx0F-Od1af ztvlaUrxfedI*pdUw65EgScLhtIWD>VLSXj`PIf(Yx*rmhV;CsmyD=Z)7FT7tCmnu` z8n0WAh*qTlu;3=$nt4p6srAWXm$+h=Q+~v1_s-bW8=ve*)>0U08raJ4t{BGH;3~tm zdatMXwm&qC>wk@zClu>?T{xZ|`%P8T4^!x5`Cc+d&#yK$!I0;{dyBsmp=p9+jD{a- z5n_xLJj@~Mo2a&5PV68Z?KL6gb6APdvU&w*INF|WH0THo0#j~5V?N($#gG<(Q&haC ziY&i6&Ps8c>LV+R^kOg!TB!=Q0@|%I?b8L{hcxfPkVsv;C8T$4+dv|!QND0IAC}uI zxPlWtCr_|o2d5Yj_8=)FTRJv?J1Oz&(WHccypl>5Fw0V5Pi+ZPYcm59~hMDTj8`x39un- z&4V{oFTRbtw(&Ez?~c|6QN##bsY(wWly3?Fi{BK|dqO=>rYegKks&msm17o)w^6p* zz06ZEMxuep5tAGi@(6M7?^L4{{T|jPiigMPjiYkq_OP?C*lEh5P2GHkdB`@evUsW4 zb{ZORR_j)F{rJS4vZ@y{l$jty?UcFfO}Fm#yVO~(l^K42yOkhy^mu)?G1ECDvzRb{ zt&9adxXN5l@#OpOc{ayBXCPcFBSu4i8WQGu9CkIP8viG|9vjz|lem9no|hym}s#Sv(JQ_lz=c?TVDY=uJtj*U?*;2pt8*jH969x*uv zFExNJC|PydeX(bhr}TySLYGu>okMCL(raER%O#-@O&|PVP6m zI#*WmJgD|G`wXPGcn;JTm~M%RH)Z%nLZ#=2jR)6>h=gY8aE}Vgx!`rlg*Yr?%3RzG zV(f6pT|7z8I9`gvH0z6EbmRyLK?a^RsF#(MJu%_>#dW9-=oX0i`Jn#r*hgIa0dzhc z4e-v=d4_q=$*M%kq+_ZNX~g_dncAXfY(r3r=%sQLkQvt)Z`dh}g63oB=l7b6FC^l6 zj+E_(RCZm+=n;dcis(>{A(mrED5vnADNPSFP$s`-&Q95sgoK1U2a#K%D`O{OAgT05 z)RgOaQ$|MA?}xHIdSo&ErVj7mnqs_H-kf8wk}*^juuoQA{D5pM9-mbePx7Iaar3XJ;2o2&tD9h%xjN4Ws!bWi8;T zr`X^5M?EI7>4AD&izk{|nHC<;G3MoOMaLw(Q3|G9Ib*fleMO8bMQ4(WCU<#w>+Oc& zN-HvT6^Bt?Y<@zBO+lDr!AnCx%=oe2G#E-0YcW}bfrQPQq-SsJpp?(rX!gIq1Kju> z0pdisYq7o#JN)!&--xWceJY1ky1Y5P1N$tiiu7@5-pU`F`=Hx6)qwSiX$4B^UW`vV zrJkbj%{=~xa(SX(FP@IojMc`WAAUoyU<~Y5jDnPE7|rNRpFuu#ya+{UUIpWC#W8&G zqUHZM89+VSJ32i6JM}1cJv93t8z|ZUDJD1sxsT&XL5f z@y1@h;;cDZG-b@)>9bqy&U=l9-*7M>%`xV2_Dk_i-A)VI$yesujq*h6241fOOZdDD z4w2$q0|NtXoxq8b8kSyICsE8FGuF+qxLhP}z<{-G{(9W0KTzzM(=dx(ap*_q}xl=5c zUBTrk%{o7c8AXZwro!uZkxrXjb|n`+0kv6Y$=Zp^pcy@##pSy_&BO>Lx)IS4)e-qd zT+$_*`-=%-;pX!>iB^1P8x@_Y`>-=b1psTgO2DWQ3y6k?VaEY)7`y550=^6LQtDPF+O#DgsrFOgY=?${YMf1;gGWP)`S$9 zv0+$iAck>f{eBO>JpblLNivW3mrAjh#7F1*y&b9Z1^eo1B5JXYwMq|1pw2Z?hovb) z&V#&J*o#k`%om>wWOO1|9xj9%W~>(-4^|0|g?;=TF9xbVk#Uvg-To62`sBIBxhYE!pmd2( zv9YMYGt$%khEDnv;TATfeG<8>(D3}_v!_@nA*kBXr1(Yw6-=wCxH1*Obi;4wHF|=j*SStKC$yOEc2?QJ`XrLc#sh z=p&B6@F%h!t_}YRVfi$}#Pf`bXUH_fqcZPZ(tDVocZ$C)tqvjZ5l`_6;I^i)JmGV2b~WD5T2*)F3qYF`R46 z^)XevT9T4yp@-?cxC|7l?XvB0Ilu>Ue>5TZ*IjL=R1Y3JSa+5v?a;E3nPW$HJT=f| zDxiEo)0FYzPx^v=X5Ht477E}}P0fpczs$zZZ$6D|fHvi8fY+QZXZ~+9P?%%l*-=wf z*Cy{vfjYqp#%}`H%@od7>5MPnX4SWPlKEHbzkn3#p?ay__$NzV<K3| zlg|HIS)n!9{-xuF7ODsz$j4t+f~Oi01tJYAqDi%x4Ws5qlij&Cd~KWN8pri1urxxe zlIJHTg$6g}dy6czD(((39Nd*O`T5LGa2;gEy6(H;HMgr*GJ+mfFGPZv|9**C2sayR z&XgZ6AE5(S!xKAZvcbW@%^XC@Y#Hwulib1dt5zR{nmJl@i|GcBk4JAGq|o9GIOV+P zjHEf(b-h$Cdm+B7w)EiseG|3aro;6S>!~_k=5&d?maZ)n4*1}CI+!|enuW`E)H5KKt9&{)bt-3UKP&s7 zKmykYm8Lbh=gI8qf%fZs5tMpk)$=;PhG}6Y3tES#NBty>L%Gtpr}g0d0B;KwFUkis zct)({uh!T3S-+!y_;p?vz`j6h*GS1gWlyEtZSkqGF*U}Nv02y-vX0}nUC%udZE4ty z_5K=Y;TeRQ-{!h7Vs~TYIoM|A9MkGTKNO0YChq0SzM{Ky{k3h9d-4{@t_&P-GVl?9 zjgz)$R?PDpvLukm;JREuO$}kHoj^7|inb2_>WG$2-^E<4EYlX)Rh-)r+IXsgsRfSD_^Q55ejP z8gm_3DtOF@f+8tys<$C;;Ds~}9^m%uo|YU353q<7Ic`10<^Y3gdBGEEaYP-3g)mO@ zAH;(0$L|pV&DndrcDD9f;(4Tr&6ftvM@%Y!*G3PFHVh4~7d1w^dM25; zoDWGYsP7T0Ta)WSQ#^g1mr|;tHYO#(8|-(zRHKJZ7G$oc*)p1iYKGkGGlTgtY4OSR z(~i|u+fsQB`Wv>n>JcP&oo@|~Y`$$!#f8L&dw-1&{+{rI4Os1XbqGioOCNxKN!>&d zg@4_JL^I_})%)gKh?w84^*ivlq1fkkE@QqKM68N0*Es3F1kOt(%lCZw2FZYvWDC*) zFo}`Tg}-Zr-o2JrlIo%yitnxFSu4(T8e^#JL+(2Q2(RMoad33xTx9UvhtHDZ$=NrK zPd)vCmqAk@Q%Rll7$$dk`+Iq8tV6!xqA}9PY<$VO8rH#z{;Hslo^-peWcv%Rfl{#$L$Q+2q?TxhC?yQ_a0*MRB29Gyy;&_8isnEG9i<=t;Epv_X#%i(5k@)nVf(nHvmgc=PfsQ2VG%}K(FCi`_iW*DLTjlzOm$5sUd3`P+Tu%vFO6c zIDOM&lX2(?>-i^v5H2vSuEjsu1ziPj- zvhshhk!DtfmxzZ{>< zQ|MUA1PU9fQr|kgCBT3fWt#CZg7#lx2@XD1FD|PB(!31U_u*aF&+zD?!78*q&PKH#bk3{w>Waqpx3+x7N`;Pxe( zXC==)CLKo>fuyXqfrM^nzTs!y~zbfsNm-kkccAeVe3ocgGxTK^mEdnAUB4XmM)B!|<)Qh}^ z!y;?kjrR@Tx%yV`Zl?<$-R||WevvbnK0T6y8ilY;vhIM0Cg16(=FB($I`VC`=sT;r zhQSl3+zOlG>8UHp!uN>EyanB_^_4l5o<{CR3>p)*^)}l-dzDPdz(;RTneJUhQizvX zQ`l#^n73i9Kr$@KXg@aM{33=#G0BhLY2!^B;rR)!2B9$dZ_H_4+U!$R@Gd>d+Su0m z7hh5^hqL1MkPSzk3;D~53Q!vNGk@_oC~&bZ&TlX2ysKb>y!8X4 zd^Jl&TH5_Gmo{PLOi!Lm00m=n7$I=8#v@@hnZF~*NWEHCP(foVLm@JGt?Y?XLF!7R zk^r8E@{(JAY@9C@t((I-b&(cYhaCn9-vL;NdVDltf0sCs%Q9p077}`RG0?*OkAre< z2mO*@T~pR8)a~+QdA`>cG>14@ov1YGG_3jItOT3P*Q`E*j5hVvH?y)9RgfiV#$~Vb z0Ug^)=FWMUQFlV{d3y*^1vAWZu&;OwN6sp2^SL&-z(EC%A1DI6x=KG~XA&i`pH^Ck@J#JIoVZQ3(@&?73eb z0l<+pbGN+GDCf0LSYjxWvgu3hPe|=QO`zaO^z>hHJ5;Bp8)m1Y8#d_Ye%ZiXK9kl+ z$n}^TC!Y?IWV7hn$@;dQJ8WrI7_#ZC^XGfZCF^}K_eZccY}WUDk)x~(iH!OUYna4a z4>RdWqTA#KSMP#L#Ymbrm&71YNfKUt0QH|=hgwwZ+4-SrY;YvYVG%DayQbZcDV-%{ zbNlnYx>Qe22c?v$4v*0yO|~oJX-?OX1Rn9{#W!ZMe_VJ1JklgV-+Azl5ytr7hVsJt z6uw~tz={+pWFXv?4(sbVon`(=e%l#y9WT1@^`mB39w*oSxZONjgFYaIKAijO_pd<|YD+aP zcW?Xpg6%gMUVkBj_Hr-bM2f!l<`LPPDCnoAkN4R%b=l#K2gCZ@OGtyLvt951WwHl_ z$xF*dl)o8MEM*gy+M{D0Ba>t9@c_3kA1Bx`q;w{Pk*7<(%fSq)7iuKFt&=ZRvNOwn zn(_fG_g9rc{?D3(?Asb)`Ruus0!2`A&LAD&gf_;<8#3PlU?A*F%FsD_0Cc4Yt>Z&o z7ErM1_a{KJ4Qy=s!13X%n|nJs!OW1N zGF@6UtpaB(Vz6&x1S*LtY!-;)5idP3;=7q|A$qf-BUXRU7y2*}8hmCOmmZh2Nno3xka;_^n zg+oC{23g}ZQ=FVWZOO=d(uNub@^8O@-1EaRT#jDoT54kdoayWqTfx8tCULa7Htv5G zn%LjJ2Ify-x4?2>7S(3>$g!YfE?@bA;TMGA{bAGYz(OHV$AtQZT*X@r>Wq*2%oQ*QxUIil1E5+{ubt ztsz@O?e{Us+~>R%5RJp`^p#*EWUA`tIgGAWfn?87sdY9zt!}5&VB?5;gv_@!D*r|W z4?OXjpFjNW7!)Agre$5vX*@H%>fkv(?uCX)4BnJ7uxo<{(vYglj=p=bi#5^Tvgg!o zg3mb0zTppd5F&NFuPrN!3kJST{gI<4Z}cmDh*2$wR!+QO2%d!06#MZF+%*jAl zWUEoE<*H2&@rA}~GKi$lCEKNV(VoKxYF!zagnYM~e7dOQGb3d4nW_nbbt!o!PRT^g zwPV(w(Z{|c@HK$%d3K#D$w73rt&3Th(? zC08K<%#1naJ(%WQjE|$Cj64B>fs=pZNMJY0bG}c8Y}xfGDH+Q0dKE?*JHU}zbw8DW zJUxaq78O3Q_Io^^o1rb2gC;kL+&3&@tBbI7P9QRdXlVq9(+CyfGkrZ{v+i~Knw0!& zQV4mpAhz!C2;vgjIu{Wk6nAxX{exnkYl>;2Oh=v!X5Of3{a-cp-z4J@`QHX9a7qac+TA}1Icwi4+{>`sB(8QHJZF3&O%W-;)QpX+tROH4>C)=)*P& zEibE=7U*~ckE(lD*X{FxHq|EOvlF_wkPtptWOTtIc6}VA#~izukeNQivziqZ^H9eX z?5*l}T^xe-GKH{zsGtf)&<6+|tOA$E^NnYd+rKtO_X8iF&kjg43jo{$Adm`Q5>SEG zWXm7*o<{#t5Sm*-+jOyupQsLd__ve5$uY1YtGl`*(+1h(T!OjY;dk7ie(%68lR^9VE_@~{j1uUGL(cF9UWLKZ<4_H0B9vkx~`^XvZ{Z!`r z4%yLcQKr|>$&;6Vu!K&R5_SOlayLwCg)x&Wh#M<|Ojey|gn2XLR_-#r46ZBTrb9re zK(>KS$XX+6^0Ux_V|Jla#s1Pel8*N2gH9jlCB@a*mc*Z(}mSMGUTlahpKao!qLt?n4#6m)x00l1I%%}qF6Q5AyjUv|8yPxchTh$hE)G_ju zXRD7b9-7`(BR2dLFFJO`yz2NF67f%8G2h^?qbuLmb#QLn*0p=JfR1(3M#GBV8=RDz z0tduAFZWYp(U+C5ME@%c@YKpLSIip-b9T^iMOj{;((CFnH`UX1@mn-F}q$u11;E3UI(- z;2}XYl`}m>~<5kK}1<8DgC=Ehr;Q9hRuKXTTwoNBN4VrJ-+zOvp=o~ zH0OZ{D^;tI^8ij5noXv`h&&4T?MofI4o~QZUB%IsZ>7< z2_P$pY||h}zTZ-x`%z123GwA~a}Y`N6~%P*ns@-$v%*k2ww|vnfG3~47VqB&u(;>> zk{cBodW~$9RwMRxU=#0vaN<8>&mxV^>liUG4`PIkGq18S+s+Ojo7^{zoxcT&8*xAu zd+z>iwjeaMrAn8&hkX05&}U7c*8ICFh*OsimKML=%<3Kc1>)dDc5Lj)KILmD6?D89 zRNVdf)z{Cn>FbS;o6MNMo+!p9Zm&k-W@P72j+dSvZp5cX@>lVxA^aomTxUc7$HfN` zkZ*-5WD%}x5E80w?LtID0G>KnAGW%9Dg=pXcqG>m_2W0Lab6)nfz`sAqAO$M`+~6` z8i<;<-Lm{dg%;Z1uUO?tlLlc)P$+~Y`u4uDp-k~IrX{(#D?>OxKWO~NIFi#ts*!Xj z`G;&^l-+*_@8NPFQ~O77N4*a2G$a@hTer2V7KTs^7KHvmaoRP-orYta0|&G~mC9V! zR7wQ=0rWYT=Z5IuObk_lj=e@PA9f=4HQeF&uOOX_y!`m*sILaq02#?ZZk62iubg-o zANw5}xwENt{VNZhadXh$PzogdbcTm49xA8Iq?H(i zD;^wE9P*R`P^m+J)piGy1^C~BNk!!Ta4|$v)UTHV)^G5)dwdq`b z`VBp^e?w2^!vS-C0X*VO_)q-ryjf@+&5IlX@Uoh88H={he*+c*lrGv%I)*dbb)r?iEJcoz> zaFz9`;-#^`#bwMwEZ-vF-)#+_xTx$u(DXxX)QBGmxp{OfL|fn~#C@u|m1O~FnC+6* z&E=PDgvT1I!6Y$t56y4D32*Fx_ThI+J~>N_H*9w)J++(b4_l>=t z5q$SKou5*@YR%a9m(|7XsgNZASHeph6vfnUHP~<>Q|FkJBsY6Q#IiJo}IQk{IsDL<#6E4+O|gaj##3PYp1$l$It-@{C5!!Mvgk*kTnA z;+Z9cE6@n&gx6QTp*g6J;IM|7Gj?~UK!!M`bS8UuQ0m>x3MnIUXi6OKcMWejlGC`q zT&3cv$weH7FeC|Ek9WF1U$o;{;!`AM-&R^qOk&Mm;*l-YUS`?1S<3PdQFZ$d6#rfa zlTJ<`Gf^JQ8Ty=SQ|x;Ms!B?>Bc&gn?5AF7zr%qCgWMk4Hgnigco|dCbmIYT{qX<+X+!QG zRVp~~@Ul5(bdGJ3*ygGlFE)2O$gY}hVSod1lP>ciL3m6F@$qyx16-Vp99q5D z?|4!59K7_L(b(rEuu(F_Kw`MG?MJS03R+8!%OC3M?;}6zActarV{V{$0GxWzO1TTl zCR#a1w4(sJ)wZ2^mzg4zExuCZz32{^Pt4OuCR9;{F_WLy@-;;c4VwbQgB9~f;85Kw zCHJG+X&rDl;PO3Jisz~6)1Rc%7XbrnVP5A{hvTas)*UXrtgo2j)?*uPOEV~6ZGW`F zJqW}YLJ@t?jmK@g%SocTFj--3S9`II z@H`^7QEqBCpilXae{16W1bg}14Z9&=557Ne6>Rxmf`!u6l2=+)_g9<9E>I^BDZ(5)|;$Q6uy!lz&UT!TqH3L28}L z?u#1LHgNFd#b{b^tJleQUC&TcL4VsT~eY*ZGGXk(Q6Zq1cpD)H;m`mI@AGa5TlxDQAH}tjYW<*u|HZmO)0J zOsf^=Z$a;D(3ka+5uc9Cj9r0K68#A;46S;CmQwxy{%;lRV=^1@CEfo}HVY{#gcKUG za}qQMq=WA?@o#f%dpA|?Js>uG;ziz;#IhAk$TvEaKDZcePLr9QF@_~covv&b zFA@0d>-OaHAM>N;Mcb#v-;F1yr&(Y9s7P6^NaJrBgLCPiW2v9K`=J&&p^ zFr4@IBX7Y5U5x=>3rzGBfQXrank&uEHWZYcF08}UUtWN9t5iNiU-&29kk1^o-mY%c z19?(5!#DjflU~CkBO^mYD|h(80mcV1acRp0t5+Z}fJGV7%gWRj=qTYZDB<3WK9q^t zlU_yYWf`J@=#U%k)HR=vj9WMA&_|#C+SJOun8BMJI;Ogw2C@{)k_vmVBg-e2YL>ck zD^{EVhpX4SO<+@yliQ2ubt@>U5XIV_4}|O^>+M0Mib(`ZFeT$cJSwqvxekgCuN2Nm zTxNVg8N&X9RCiwnSKUVaFS_hTUC1ZF5iX98W~rwTBM=uvBiv1V(7OXEheQ^vmBo;Q znd%JF=Snumt4cI0&A`&ojxH$jV+QYaw)*HI;cOfqE4*CrY+OliS6wx&ir@ehp8iJOBCXG65J(Q;yvqr$Hvc7DK zdKTLeLS($5D+tySzi;aH-05;Zf1NSEm;OZXqn@*RuuOU2$>)4K1G}ht!r;PXL?gj1 zONXa|cRK^|HbOam(hdi>PpDM0Ru|}E%Pd@9oj^HJpeEBS<;Uib{UyCTpYtuGv(j1N zoVVKNEtB=`V9?yV>l@O%_S2Co-^|H##sT^!^wz%rpp?-_c`pGmkcaRlb~-c10^)I= zZ_6G*WC(v>D2j+6xt>ygES@D0q6w6gLQxFJF)RrBN_Qc5e8x%ZbX=ZaXVgD!X={Nf z7iIvAtQCQ4OpU)OY>OyFLEnVJ$QF}pwcPcWQiR+wBjj^NmBWeT8v`*YQ9ON4^ykUr+RTx!f4+JZjQeBGQ z&phL)= zLiDFYj>-V6CGe`AzQs|!fb0#NreC7z5f~d6>9;3lBBQ4OjZolldGA3JMbVor`_uVs$;MciV}= zc;?=C98KcqLXLyVCUVg|1!oNi_?;|joi>5ebGjezfa4c=%B~sSERKiq_krBrz~EWf zT*W3^!pd&>BB0%uOX4x^Nm^SoTWkc?wp?I&9^g>YqfStJnu z0mV`0muK6lHZ3T(5N|8w9*Du}udT7mLd0T=O03H93T8^bvTSn1i9&u80r`#Nu5L;FF91`zJ&%fLjW$VX5y=#9Z z_B8G5{gHkzeF~&!&cyaztP(p2#|OF*Q$Ba)AQUts_j#>O%+&P&{0?063WLf;DA|wU z;pSTfWD}{LC^-J6q>^v=xFcxbA9u5g_Mh z3Nec(C_ZrQkOgJkO0(f_(G0VVTlGiJv$(A$ke3}nrLXhqKz4e%e#OZ+sF&)OHE0iB z{ZTXy7QLT+Q15T_@+wZ1@0|Q@6fUF$e=J;_^>uxODebC->!Hg-Mmm*7#Y_pypQXaR z90S%3Cppci416G8xbZpFUK)+B*2V9g*^4-8Hs9O(8pKj>Qdsll<`_qDS^`w zXSpZx+h_a_T-Pfa%%%ET{k5gA2eQR_so2-v!{;0ed4Fn>#c^M9pzjS}oH5in3SA<{ zorU_OuB@o8B_iO(>z043{wRPe?Ot3Lr`uC_V>%f|$dk52U(7`5-3@CgJ}Cis_3q zEAN2~Z?K9qL?@sq6jyU91AO~u9G2x$UkG(NN6%g!SwLOMOzu)wyt0l?(OC(da?VG~ zai`1k6Y!P=LM{vSFj4`htqIeEjg|gP;G1e(cIQCecjb>GN5G=zZ4ic!nL~wS6bXaE zgAJVo2~m_^7l0bl=dZt-k9{kaxK`w+=a4$mFmGS=c#VReD~y5*I(O*F0Qm^10O!Mi$n}J>_yM;$B@G-)r@a zhO;f@Kzc>PI8-_RTj*Px@M6qAy+gj-UHe@3lmA)Sp~r*1|>tkddnwaDiA z*=ANGluTj-?Y#_~_iY70HSa52?5_f_5q(nNk&5_zUiw7%kMINFud$EBv}^)L=g-DR zE<1YPFBfg++X>HN!RtV@w{&~vih8)Bg!oY6l+}c}I2l49eAJM-+vg=d!s$;)qV@E? zPaTw2YI}cEJA~R`DEzql&iiY-Ar=K;iyUw`8aEC{11?SlwK1JX1J};W5%{Ku_o2Q? z3X68>`An8cVD-bl;*+l+#4?HH-D%TMd1P;y1B{35#(0o@T8hQx{hhuB4J-t}=czrA zNk$x`4i|@eJ&Bgo)&sFK&fmAfw(Gvt!*Ehen9!RbHpj}L!ZXT=f*Bc!UdOk;WEcvV zvulZGe&T&UmIVPtLFGQOjYqN@cjp#@+&M4BF5>4wbo-b~hT8(tIxQbzX7vFpcEtlm zM%whETDNcR5%ahjTtLOXo(wJ)th%Q=TfWLQ(!jX&GCN%NG9<6ksm#aH?)Jmpfw3>C zIM~+S2yc!l0P<40rqUPQVKDjd&=JOrUgbpbgp#QG_U$9Fi$vbnEi@l<%;i0!I`qJJb zrzEKX{rju~>#nBH=kDwbd<}nTVkZhWREU!!=ePO=<$Z-7D4!0TwG3|gb?*1^-92pU z3b$L|Oc&T*EidfhiLO6LacQ~G#O-}%5xhEy?I!o64i=X%fDzzO?6l{}EROeN9>_Iy zI#~O!N(heOd3xwjqMlZE%GP%|XDeZL+@bI`+Kt?Dft7S3X+X2=SZW)EiTxz*`tH6O zCbK?jOIF?vd_sbiL8X37%soDAjk?WjzuDmiG26t??!Dn2 zScZ>XqN}I0^saeIiISi#ym75#V#p>rM0jUpp?F#gBCKe;FQXD`>dJ|bh&_Bz`t$?P z=o5``$S54Fo_8f; zbJ$N?@oy6-jHqXS_%4lC(gC9o7+%2v{D0uJ|Hr1DVbH{?vnmj));hB@Cc045h&85- zyF2v`$0mP{OxyrGCm$LqU~S=y{1;g!)Ozqgcj(SB9nh2}^}c?5Nb{ifH87vEP>A`c zu%a~GA6Gk-O1B~0Vpv9#<1;0{e}~oaC(lk?4T>0k7$X8xw;dSNE%5sGeq^49sc+y! zs%Hfyb!X=GGE5S6++Q`rXmO^sWKv3H&{IgoiVrV532)KIo*y9@KiKCqkI5mB0|+d++q5{fE} zss=T15YG>CWB1)Qd{DvE0+t$&K()3$2Yw; zp=J~pvfGT@?)XGKZVvCAOn}Bh5_*Uv%3x%7e{hqY9lTKr#ywX9XRd z`jO{upwQ~JK|uQ`C?2G=2gjBRcHUr7NrV#T-web;2{+ZTNNFa-TPE9DTt4neQkb}} zi_UPNR9KQp*%cfD@~hB${m)__>VRzd5WHTXD~>f2gyg|oc}dt)=49+a6l{|*mWhH=YZ2wT}_Q! z`1x%i4^#-ZlOB54yk@{wgOv~(J{8iqy zVTU`2g38!VMz->eBHU_T(Ix+WXju5f^E--Da3cF^?HSF!}x5qL;6Y`foPuqQdu3dVQl1{T> zf_p~8|Ga_Tz}C>ciLJCWcG2C@P&^VRyHav6I%I8$+eFf8Ra_`P8Tb@e7Gx^kfV6#p zo_rO)`VNob@%4Gr&B+K$MOTqrV)V@jv=q~=WoYQ@dE}y%9~lFu7hD9hvsG8;LbT3a z1o0hM&HeL^@TsU$lB1iELpcR^*c&QPGj=%sWxrU_fv<6_Ju3;`ahjf*iLS%1Cnn77 zgVMr-)eFaA`9mIk*o=v+uUyQTju84tLoO72S#0%QeQPghFN*4b(E2=Uk@8hwk54q8 z`~ESPb`DFSRWc4USMi(DoG9SIWtaFX;&5l%ricx@-in@vPMI#feo~y8Vg$IgOP-Ih`Zl z55a;ENfMS8WKBuy)3%6)$S47n^X|RiY{R5?B~UMWO~%3_0XqVn6#rk7dPo+AYf&(` zKBn4W2K;^@<@<$u0vkq2Cf1BELA~!u-q0#~wLriO>9px^17hh4s8Wb}5(^xfgx|L* z)WKR<$}oi;B0M@JFx=eza1WI!8g2SXUdA}Xi=(B|Z!JOnlA}LADNu~t(1anfvKbcC zHa!GVcJ5wAvm^IC4l6?P%K9XaMvQ6pLDJ`vc`F6X6pjvRMc`QzB#?b!lVM;pWDZj( zD!npuL;(uc`Ch@ggi-G1lLj`JxyCw^yQ8Jbs$dK(U<0l31q@lgTJZ2{lB{!$%|SHc z8+QM-FVr3K1Sje_s~v|^?!xBCHmte8!!0tjJP3tfJ@I-ClYnXfb&&Rfb#B!y)lUwc z7=K~%e903J{PNQ2X|Y{fFuJM9J-Q%IjV6b2-XO(b^SWc#S6Pfgku6eSCcA zXqceGA>Yq)7fm8^f#o=)SINjCSH0Y$95=spR7__IJPxY+$MH(^OV1m#^QghykF34^ zN=6%jMDQ%UH7lccwSw<(9hR8}jewIj-+aH4vJ^rH8T|OYrJOGGDfyi+_a`XC+}aoJ zwmC}`DbOd9(c0QT=gIO11qsr`Vnw>hYI>b+9Y}syS?##gbi~%tQ(VHFaGY8?UOMzM zWXOQB=WO70F{qD*U|8}bvnA(9zLmYMphUmoJ=J{@13E_ z2dW-k9DI52u<#BfAgmTX{L5MSNdCuF(d>}NED`TUK2*gOy3t zOBU`Jlb+`W_m#}6VEtL7M2X{3)AO&| z8X6pKTZ$f^Wiju;uP$YZhq-34Z8vpau9Gw#P;$)k=CqIDxs5)!t~!o1^i;!2Qv}K= zdmR!^`U2$8WP2`qBat|FsmYN3?88wZu*M1n2y_+jVDQLzomYPyug~WHQE3S;mGcaf zic(SDeC{FlfA8&4Zv{Je4A+pqJ4rs*jwDJ@1U7;)x*A?dlVkhO&meIf%72tq$rUC= z1dK_2psYZ3AuX>ypq*r5HN&NY|J*V^EQc&ghpb9!$&^xQE*gI02ewC%U*k+a)HtmK z!~`VnGi%;SrsWOIeghtZ8NjZeZD-h5@2+%;Jo5j|5-s{@HsI&apYjwq)T+90N`*zM zQD@&_GUd6ibp+y||#`L=Q z;soSQ*VL?Zq0NEFsSR#z%}N@Veac@p1SJYRoPH8@t*pvxF6{HN?HLUfh2Ok6yKZ;7 zZowo`#)9s2z)CsQ>+s_X!=zKmxdvf7VZasy#(@ujZ(`s;ETF2YDx1g2SV98+^Tfs8 zY}Ed?hr42;s1#gDf2^IeN}SJkGITyX0|EosvCMsYV^Hf!odQS4eJm@07!Kd$50S`A^T3_SJn5zpyFaD=aB24?|rie&p|o zb(893vB`jG<;^Xa$O9Kt>hwVtqX}-ECB73W!w@Sv4D((NJf$;z^x#2yhb>WrmT^(4 zD{gm&HQa{$mFe~QOu-QP__%f=>vP$(cv!fO0T^_D$)50;M~D5>*6wTH_@+0)tjnmu zev1Do36q#3l?)#T>v}0&(TaN5Ct(H(bfc)&D5vqqM3=y4p1s|vY_)Pj9=RaMlf5p+ znKmfi20-9H(dOb>KhwkWBKA4&n6rHQ945ohG|86HAkn!$ZBI5+}y0o)Yto zUsF+`s0uItmZek$W;vf-JTc!PWEq|=9UiCRPhh)V4wP#l?|g{SX*_jfhyjP%N5OD3 znu^t$v_(ZOWcj#YE)yRazl*jX@WlI)BLB$z<#8VUbOrVa>Fm(O!FJg@Q>)t@ylw#K z!WywTnXWTO%IKp`fng=) zXT1&Fjq`dNCXX~7p9S`2d{A-$)L?o#Te{}@4sp8XvIKI`u03`Xn!t2qsV}p^$IXwV zR_$$tp>I^bPOv({(z&=ZH@W0kDbVAo-K?!go!RdiaHZFf!avH;?vQTS#_I`y)1Fp0 zkfb#ZYFo-zxD{_$pq8*ywTsYQVP}5niKQj2!t;xbfh+etZTqlQ!mphw{|oc=?8?x2 zMyj?{x4d=~r@{zZ`)K+iFuJym0`Gi}mfHcqA#CyS4G5y=0;EQMXe^O0ZMj(rpV7-n z;vEeH0S314d9X<_Pi|yCNyyVlCfTRk8F65N1<76SNbXcO4 z3490FkCfrx0c@Rydj%*s(a^ZHZHwJ;DaXUKirI(IbxMvL~WH6y)K4pAKlGlN{q_yfzmTZIVSoT z=Re7i-vH4B(m}^eg+Wjc)M%g{5iwxBd6$6x_}W;g{6s0&Xj6oQu}o*WgeZzR>lJQl zR3x%XJo&Gr)UPb>V=&&n*OX#8E2_pT&2mUzglaf|mVKYE13*oK>gBg^a)88G4MqQE zHDG%1Md)bwldgQB<2)0*znQ3F#?>0gb{Dp)3)%xQ{I~6@P;1sKcL(?>D2`gn zs$$&=y>q4BtD34Bk;4ek!5yi<;B~K`;RkX_8xyESpC1I)l@p$bA8Le9hSu|=AUpv; zLv*G&Q;&OJ!mXm)?S9-+w*M6wPQUi%St0$LI8J;oE~NR{C|yt)%H#$=cE^5oD~PmI zgRq3hi?zPj01gEP$mU<(?#WLC$Q~zqQlrYH`AHN2;ksQZpIO7>QPE;kf=LfP`U<7H zfM^2!U8tuPWaaGo_vzeQy;q*A7dxNKx5u;3BZ0S^kWVsF)Jf=ajg>@6C$Wdj{eBUb z@&vI)Tn!-M!1W8A2Lv5xG1g8H<^f^PcPAzhZ8IZy#{?>rDi)k59^>AY@p*?w?N^M{?z_x zjL4^V&}8Vny}hwap2~zL($NHbu0{NsC_S3=Z;-79JW!;+G-MI#@|m*Dz(1JrUSUsh zgk=ZOQsX7=ia-8R(jDa;)me?_iH~RKJistC=9szd zxK6|4dL>n8h=TJg)=bJ1?#v`|B8$%r)B4*8IZW2WJv=-l-kbRQ zx3@@&VP_Bye(kh2#b=49lK(HBvyfEA#zzFHr`vb2oygr7&C}w0Fzck5Lcd#rbG(+r_m{q3c zlmPu8A;vS3goadZ3ZL7{O3W=X5ZXZWlxa{thP>dvbz*S;4F!cOP#&l5mnDgZ(1(SNwE zo34{@YSLXcJ53W6KrP|aWO!I{?BlIndPNC;&zFSc_*_bLJ&$ypyo+q{XQ|qmL$`Ba zZcXktX!5J~Ays6d`;(@a;i_ie>BTDOrlYg-AHz z(&-CXa*Iphp&zO`hQ(6I2pZhZeicL$2q;Cl;Po^m#{xJSz8XXvJ0gZs(B0PWr3NfX zwO+rc-(H<}^moBvvpQL@D<7^wL%_@h!J*WTgQ&XWrK}{w14yfpb6s0l-!aI9{XPcE zj%NY&F_)y$kEJ%uUmlJ{oWAu8CuSG+&>5yC*Rt3S@W`Qo%?6|X6>&W?UUHIMGjesH zDI^Y#V!n-3c6FHd&KJZ2m-;^D*A+cp{jh*r(i=mrkA+m)6ivd}Dv6pTSDI)cRBX7V zpZX0(VrD|e2>&R-cRP8XXA4$o<1{^#A0pN?226&Q`Py1SML#Q5OJ!SN)IZ{Q(3;_Z zR1CVFwY;QX(>SHYiv2z{$>kuig>133QS#8M1TtW&qcLmG#zVU=;fy8qg6#s1B^3iM zox9m~KUlGMw8cp2>zHb_&~Gp02r6*T(Z8uxV?|4p9Qle9h9@{j{pM$jT9)TLrUeng zzrv`nJF9eXnnAE-L!ie{^%*i}c%<1jRx;0Xcs|RPa5ijDY$kqglniL)|qifQMBFf{IXB;30&+2knOgd0ymt zar$mNOpq@^zganydH~{zyT}~(gU6;?m3YEgb&bRfEvMI6^Z#F?na+`y6N*9t2>x?6lZkmhl}_8FM+ArHhK>jhvtgu=_wQw!GC`QI%K$*% zL`8Lkh+I!n2{Um{R+;7)TiG#EXDy7fkpg`I=deozM!_$KTD+q>kFu=gC|01O-eVCy zSeqTA61lkRtcCbFAQZT8KV1{xBu__`xgO8Gvm9Zq)&<0ZT%SGLv5Z+@L-t0uWS+XJ zr2rm}EDG2(?N4Y`au#b$I&aRu9=(Kr#0yGln=YKyMd&AQC!JgX0qaO;S9q zqCjGq8wgp_R(6byuC!};cOZ*~|1gtH1?(LiX8J@szCos9 zS@lOK^Wd?4NhjblXmYHosPF+?$Y_Z_F76cIAyt-_r}Md$6f*- zh8lSqjyk@VJ<)77CjT>eZ!}QR(>tAS#RwO3HS0$jim3OgiuD!vsNe8`haPLx=zHN9 z4Gq>4S_6#qp$W7~?tk)Q6Zkm`b41$kK08sIUc9N)6#rtI=AxoXyJMI|)h)E163op0 zw5N?3r6>rz2<9x&WI`>z7l)w!0sHvniOCP2KU!s-CXJ93_NpkYj#Yx(s&Dqd@eyBe zmDx27l;Qz{V5-cu&W}6r7$f9|Sx6zWA)vb&wYdKV&YtF@K@7Zy<&tO$CydL(%O|dm z@4h)(5O&AelP?CiRP|j-$+&l?Dd4U$Ov6Pi0FC(-s`x$Hrywpkx2xBT9SQGE(IBQ zU3?HWiwPh;`4;1WHywPaEOdR^W}}$i4(Mk-Gnwff0epA z1qMGERdFf=1g8YaFB4H#v7)g`j@SP23TaqOo-$o{z58zKok)@1{Sl4{W<5opmr*vR zHhgqU8ZDS18NL2JBTJ|PSSceEGzFQG=M#xjCo&YNv^?dG!{nnoZJ@wB)fSiR>qA<( zJ&g3Zv4=s|>5B+M+Za~v#sfn;OEJy0pd>F>H(B)AlsCG1L8~0q!J~&0u=j@v&;+t( zw?)q@d{Od!6og)^p6kc55fMS%*W*v!>cc@bi+wGzRa`Gl5lG7;cG4VD?oH@-wN4&v zVmkAf$_&qJUtP{ClBrvuJHYmsf<~(_{?iimi-b{1SSc_=9b0@is#I1kmU=qz;Nk?M z&D&vy8cu0rXXDQFyVs#!Y%4I#sW=$wimCArOUZvKt-+;~Mk?Ol+M_YH(Vb;c2C_8j z*(?(4pfEk8f57)C=91Fd<{qPlC>$Sm^YH~OB=bH=M3tTkCU@nSreJU||m#ly+qh5PUsNHCqie<%`791p3`@o`3J3lMn zu|UN0Sm;Kfu;_6Qd2QM~LgW=MwAVziOvNe`lbWT17FXQU25>yYKX(* z8doI_3svv9|y$TTCa$IVe zRZj&dn+3*LJbyS=55hW&9%(Y?Age~UB_LC-eiA<-O?9xMn5H9(Hg&MD9VI%y@?{(z>c70Lo?I)Vz+GNeQ(AaaH! z_?A~ZEz_HR8cX0mp5yqXp}eAE55SFTp`dBP03ekb|LYurK*G7pW6Mkcf8VVnh4q+Z_fieMr z_uHdzahB)D#hz<$H+Fp|;DVp9=re|5 zVyUU|(XFO`p^jHJYGUj1(|4RH8=4k*Vub>3ju*8mXW~8xCYd3I*gl#(0PGugpcCqw#BS*#ilowO8f5GpRF)ii8NOv!05szgf&>_8W*UObfawuk~I-vW=~ z)>zAG0(yoBeVfbamKZRB98!FyfyMqI1{P!v>B)o?V7!pX;u`Spr1PT!1`lqMXuMLj zS1LZC)pSswdhO5fH6igJFeV?ZszoBha#e_4Lvny_&}%+nW(}-6jRH~ZA5d%nl_t&- zdHP8i2`-MGi}oWMRYYLALdDGsfNZ9_s%`n@b_Fyg*$;2Ui`v~=l;|L`p;%v5Lfq86 z!ZhaJ-?*6$jyF955%W>bD7(uw#@;}ePJ;~J=;tGJQ2!+W>O;-E zrUoQwTYCZ>{#0RKBU7PQpj9PF+<)6?<0xk8dXczeBmsfGMku&_8`?$nAZ7tj!8Tx` z0J7Hi*~&TK2muEm)?ugDetYIs69b1iFajOmGuFsA`UcLAD6ut!7ZxHB-~#8htGVD`6nt zxiAN~fEg{gz<%l;sFpBYZ>>`JxF=?7EYk^yGhRPXA?j;`?J2nSyyau06280sCYAXk zxGg|Q>XXdlrJci9mDB}BA4kRFi?7dRNIjA&Vqt()X$ROz&tzyK;S-&5RkOztz|yEg zm!=)ZxXIB7R8R+vYvc-twRDWQEIwjt-GD6r;JY5tf?>7S_lvAK#~}vj$s$2(X^SX0 zv|UH@fq-kDHmSDJdAY~%cID-SI$ywzj*-!l>Vb}lNsS~MI2^qGm}xM7g&k7lX}s#X z;Of|hGFfpomh;tv10yi$H1m0?j=#PNw3$n(DurtSUT^{algU1*1 zw05>q$NbAa@CQEp{A@sa70OCl$C?Noq<{i|NUHvzNf9enNkAH{gg)%x?Iy>Bpc@dA zp{FeX4npk+)Pq3odHmSaqIWdNxzMob{|)N)DH2W%L-+p0agKzT{2x9x6~c+Nt5hul zP6AyTm?5cfLa=8Pp-9p3_-|8P-Kame^oA~x7?IqB{S;yPx@Qg$tRX(ZHJ_hydvG>)o3H$%|cm z|72aa;;iaHH(*4JsH38z18{Ydh|{7w4Smv~3{rJ*3LaV>bU`q9)?H66B~?wJ^DP59 z55ZTcO^Wj|acK6ZJasl*n(lLC{Lj3RAGXPhnr~U-Gb8bVoTHbaP@!$gimlt+#-N2# zr*#}IFjyo3VKqwhRHDODRc2_?1C`JNN*-FBhr1?smvi79tZ!-2 z|IOl6391hJfiy^Tbaa-^>l45U4;*1?;x%UGVFfv4du66u?5EJYhpw?i45>0HpYPzY zR3odm?H|?lKDq*?(Ah84bO0c(08`54HRy%V00=waLQyx7%|YpLovQAte-a}ewf4)h z(vkCMfyeqw00L+<;C2E4iJ!+|KJTgq)EhY{D~we?5xKi|%QAXzmki{>V%O+kdrZJk zIMwgT;H7*tDI)AYi5I;q*g$+-0=^IB;94it8l#j5qyG)cKI2^DKfuai;Ls z;Fk1LZ$1txB@-ta9H*qQLg21rZ^Fx&{TzRRI~D;YXQD$1r9+ChI@_*lnpOgcbB8n7 z%pa6lUFzuQr0$+q4*W?UQ3g|)5x?=L$$429Iu!b?%I2=#c=a!71EBwX&||BcI`y)9 z4D`-21}UFU8_tCTet}rS_urqN1VW!B;MZfl{5IC&`*7hFy5bV27l745Nq+^+;QTpf zBJmwi`B&#=E@KACe9`uKR!_d`ghV0838GQo>h?SUZ_pdjLzJ%ho{gR#U#eUnZj7fU z1e)KMT6s#kSPLR-YXB~>`q{vViIL>lJu#m8jXvBDlgnF{2Ar$Zx~C5Rl07lD?`9fv z(f_3PfOqwO^%wL8fz|TGpQb47AjcJucrrL`6FNjct?vg)G>TPRzQPcmuQF)L$jDfa z6>tQdyVT8|B)^K;2ATq_&kd{C>nhB7ntT(-KPbH992ya)4KTnj%V$cCTK1V8)}U3= zwNUGe5kDUqdwmN9%L)I2F|bGc!|2msTgSIE?6+kgLgRgP(8PfEM%LRC^vOaHND}ba z3u(1ETx>Sh?*QCqz<(|n`FFm=&U!*@o%%pn{LaGCL5& z$ysAa{Npfbce=F3sP*xY?tpwI$R1ncdMf=5a1caM-G?){?8DHBKNrei_?hKpWhHH_ z*TGuVgJ}J5prt|-dB88&I8m~)*BM!^{z~tYcV%GVxyF%OIbb)wJtn-yI3b`}xM_#LFeO zpa5hbsM~ndam7qlfBd~7BSV}?^Xt2W58FAuKf0_MK40wzPUn$2hS^s)57-R-+c7E0 zhb(`E36HWK2V}vKvfw|2Z6Z(Mwc&IQYoFA|fkPnw;}~ev0MJiQ86}2NlPr{?3@P8xgs#S{%Z%$x8eOX@b)}<>xoH2Ot~2+u3jp{d5*4 z8gngRz{-85$6Vyl@8>ht4Kxy7=j&g`9S8%41nZRGK?*TfT( zVXF!$ZRX_r+6IJA{vfU8$4vM&=*d%}hpI3#?Tvi30AhO}pfhEYb1_FpTm2|3-X#~> z8K8oOz*-n^GiD)|I1z+w0cB*j0N0AVA~bod%0$j)*7q^~$t>gxcI}%qCU#nt^0`linpBXF#S-)mBY8lPo+6Ozk z%h#-~mNLp%7mR+b;rQEwX(ku%v8!p!Fxw!BIfBVYmFCA4o5ys9#&?w+man;V(wbS9 zFDvyw9!rE$?ezgq3H{Zpg%=)_sjxU&v_dH6jif491HMJaJobXufq;!6Yi)yzE1?4A ziojigfb8ms5AP_*^8p!?pm;&;)EY>M=LMwzI7&kue;fTO_1jRI>)FB5HBx+T8Z!-8 zs5O`LoBCxhN?3zFqK@weqcV5ZzFHPMs=1rBr%7%E*5g7mc$|rL(KY)$-udrYf2Qc4 zqu2|o84MR~ID=}vTLMKF*W?;yX{fyg@|-LZ`g!j`l(>Var=OCRL`Cpe65cfoSF9^E z)q{9!pz{w~lD#yv|0H!i_aqtPF%#N$X#6?YaLOK-*iYxgo$M;6BHCCTyuR3$QU)zN zUbk*wHK@7k{~|c5UH0?z{rmSI2U4j*Re;+HkU@XZ!@P(}`_2P$xF@9L-sXlp2Kupg z%I9sa3{P?3P1`3|u7HSM2iqVT2!VJ=_ubjF%CV30cRF@$VG9K;v?2-wU%ygD_&y>xbA>?|WOoznsfjFd$TCna_}m;xU~OI4GQ^>rF(y|+-I)>HTZx3PqYykbhLaAsKuU39;u(cLoJ1)m_eDOcg0XJ7OLJ= zMd4W5&#?VI1EmojHxI2$=M;El086QAd9PrD7_qx_IDS}4`}zC?@44oR+He7t1IPW{ zh~^`&8stW_oiF=3`JFYZMrz!f!W2P@IJ)&#=)#=Mfai7tYA=j8P&wQufW8rRK{oBG z1xn=??@`iI4d61y;gR-#%Faj-g@L=nc$NPC;eV5}4$VZr&spcwj9X&V@rRS`PotgP*9s%HhIRL>ft zQ{ak|lw|m)l1p|KFYejTbuHW!IWLUQ1T)O}T~AjRyk*W`<#AlWx^|~;dRXFnaiB8q4IUqk%1o*p zqUF(@4kd2gewTY?zB_RprR(Ehho!*e$Nqg?p?X2Y2y188%AP!_9CSfpOXg5xZ0i z%6lB-FVp{Ny&z6M!G`{~^oTG#4o^~OjHO>gFfpYPURKi{msm!n@wbdQ!N=v^d~8M1 zHRd066-eP7Odki>!x#F#jj2CGCfX#(-PpdFG7sv3*nDNGTNf8#4$m@5E!=mN zcjs@_)KPKtTtV4&zK{{}54WaZ;C5CGU!>>8J%6OOr8C1obQj64qINy=XkXy{Y0iTG zo4)ky=TF8R`gol0crt%9k6{q;HX)8z^{iCE-mZEw{KBw*GlzW%dpC`379ObIXRO&YPn$%gbc&cr~CLf2dN!91lpldQY6wY)pHOE3N0|0)3Pw>4A%@N%;L zYx_f6X#b~@6UD@!OO)8l(&SF2k2(cPQjvJYvBfTJ3IJUoq_{uMW_Rv5A?XDqXl#n zF6b|ROO`*^mVmfJ9Gt8vSpEzG9bEk%XR!Z0K|w)^zv|^kJAuJiG(61Qy`3$=m#!X` ze=a2sakKpMqmG`Kn1&XEn5!+sK}i!>7vL00OE+^@TW5DC*N0qxMq!b1GGq2l=OZ=`Kq-P|Q?Ag&Y~;Kmdo|M;L|YvFElf1f8~qXWd+?S3%mIpX*0%)||hC?*beE(&&5u-ah7xs4vO$bl8JH5YTV1_l?fz{K3l zEy0TLv2p=x3*0310~0$Nn6(7N`LDu3JZzwdkcPYEb8QMfaG0Vc1bW|~;RXeZ?q7#+ zvGM&mM3#b=6I}I$_5FQPaB_m0LrM^@KcDXBalf9xVzXqY;NtvG5A6PnzaR16wj;DM zk~(x)M{9Q*HVSSYUNG3)LLv)sY!qZ{IZ@4!{K&2!?`G7yk%TJ>wE5C0vSCu_?HD4RlkNP2ZEC*MAYc01 z`EM=;=B88Vb}rYS*1SL0x9i*KxECO#KST%5{OweehAnGz9eGA-tNa~JDWwPKQm6)94MFKf4>DoJPCY0qCi zqB48K=P!n{Yy3|1of?XfT+y}K&=Z`!DM$I|mj@j(gJW{pzlynZm|yL5W60pj-}WrI z)m*-~z&LfVP?F~A{*n5ipylXhmGeeelH&}TjcBu>XM{$Ez1ZrMs|3dBN)qTZ+XjT68BC5d7>`F5<8nVs&?xSt?t`m z`ItC{tadcv%XGTbG*u1H;`gu7iW6T24yX(=Ub|1^HB4n|b#9c}@Hk^)UgHiUUBm15 zs|=^T(uNZVdex=2ie|b+r>30OHnCEwc}tcIliWpOO6QEp3$OdjH;?qyn zdrUZgja(zX>O{!FxPsi8QLl(;$<^X~neTeON>iKpt6r#gn$$;&NF)N8UsU0xyy-Jm zq4woH$;A3p!8 zmfY9w%|I=;*z`Pv`t?=G>>Fwq7Q+W}*q-}vvI!ro$AYL|``SIBena1Rq|z(HJ6vKs zGE<=$0AJw#*Wc6Y2YNfiQsc*mvJgtD#@>BGy&dEO^L%(l&g@V!i+t|K`a|NCdNx$3 zMq}b+kKfg+3Zr`K*@zH_tA?a`P9V-6FEc*o9~D=5r%H#~tXK9jG_3y3@Nk>jVYFdb z>7!BW+MH*@gED2g=tgDlL$fz9Tb4T>ttD6BTD zHB3EQHb>gS(*8Wx$kv$G$uG6xG%RDt#R%`v88V~ZE$C2cIDI{5=JHLtLnJw#~ zitQ9T?K2*9x$+rQpiyJsL|RmP(5S*?=zFkEqC&=PsMA~fWKH+!g7F~Jxm>LML0CSM z)rS@wE~g6f7T*+e_RGrm6CPdypSF!U4bi zHu{d<{^GG-quzB&d5VdyJd@Pp(tgNL{f2&+?sOIRK85`|u1|LFGpZt!4TkusD{{|# zHVm917QB9^$4^G%N;E>kA+DLQG~;ix0_47!s!i-$Yu5Wz)r9VCSA5aoFjPz7eV$_F zs>Q+7p0h_>`Q9bxvP>$sI@x=VOQE;sdMWz(BhkuZ4>jqSTl(o@JEiIr00T=@!TEN=hm{5st@diM2z)BB6Ap3avG}w!c2SxS@M$Q#U@Z^ z>^rmbxqtgE;D3Kx)0pbdtk<=|@N6ExV^^K!nH_x4C4KAEk0;6gk3=lc2(I6Hu_=hC zSN&$|BxUP_YY1O)9$HO(BZ?SiA|@XEt(0|lZi#PE=c^D2f^hmX4|=1sjc<)hP~VGU}h6y%o%P*`-v%WH?8-rG!*C+w2R%% zOa}=(O}4N)234QeDzsWhVqS=_@yNL~S2kv5_{H2F(mEMDFIqG>bmN+P;6uw5{j}Be z?a%E2qUj$T=3F1g2R_!(5*`GwYo~LnB$y`;)eUdxCblI;*M0nW{2;I?xdNW+Ltw(i zk0Qwpd)7I^vhi9EO@bkV!%_Y8R*ceQqofTKo1tnuCd4=1Muu93G)i72MYfnTSssVi5WeetPJHipZt)r z^FWN#t$OA?G-RgEj(Bqho2*b)&asoDUOo8^YJPZKQ@YdI@u1}mezbHmqMmmGNR#h5 znfuK@;cbW6mxc>w!&4IOj6Zp0iTOm^h|J-6iGLFMMjBbML%-6m+fO17gyY)+J8oY$ zD2(5|j$tN3`o!#$Fjh*pOCdBkUNGypS1d#wC;HwUqbg6pmdV(@K2J|&T1|0sW$4{c zpYC7yCdSCj=ko~C`#+>w;A6XME{{Atsj z)T8#z;T+Gt!B3IN-Wi75iaSxcBnc*ZnX?JSz`2!TvxZ-!&r5L}?0cp+`spdXmK79i z!qci){c~=atX7MNS&>3ZCb2#b3hlJV2wUkngqDf1VC-hx3buXc%=}`DbYO12Kz+!` zwX1RVBq@k3rEu;5H@}@;%_nTxYN(|ClKiYbNlD6`@N<2*v88{(UHI%xazrMI8j;*O zL{BlWq;ryO%WUGLzr;eLe8|2R?^K@;IJSXapuEII# zU}j3DH}fNr6XcCG1?Qf&#FgH-0+RK+wUr1(Hbt*KT{bm@KC@A~st@p+w#PvUg(O<; zea$lsV-3>{BWEGIeA9Yv?>6VW20Kq~Bt&p;e*}p9tl3}rOuoBP7$_>?f^mG_MK>=w z+CgXudw9WZvFPZNP4nah-`h7@wIf*Rd=9X!IZQItPUZshy#tH6W=NRDJPU-Qe4$@s z_)JCzPwa&8Htm)NY6c+=3@g1Wt1AzqWUcu`_XjB zd`gz=&qvc(jFd?)8dXbqcJY*)fjl!qktOpMqRh#{zTz00Au?EA(lce6Zk7Ig!EC{v z&k>zU0OQm28J)#yb5u5NWvGgvQs!?P8sc2m8mioF)ylM<_;NpdgFz>V?=RG5OzDq-l2R!KY&#sMJ`Z>n1`3;&H47?m=mMiak`AK3Rj?xeI2ck`_+ zzx^PNGwPD^+LR#J>K9FT1)46wH9gf+Awthtat{6Hkt+IdZQi}% zOMSv(Wfndkp@cl(b6#Tx7?xr;XeM?juS8tSGe53m_{A8j(dusKHkZip z*??gCwqUwawk%FmlxD8NZ0t2h-6+@m~DY|zgK}5oT~nM2k$Ee zf-6)i4L*~dBictr>3XW0#Z;Cs)qRL)!AYc`6`Nu=B3)vv4<>}0I8)l$vQX;AeovxP zr84p&|7i;rV#k(t6(nOtClhp!jEv&co?gqSj2C?BjfP*r7WQeBE2E!4Iy;UdR+@O` zu%P3|Kv~Sz1EHa+>d#xWowOOB!c`PbO&9f2%k^Il;38|DJz82=jv2}C|X`|saIL&J~L)Q%(PfD45xoLQshnn6d6EHEQI<_Z#k!m+W@ZCN) zuP*w|%rRRz~_{}8zPmc{Dy5@8nu=pgY zH$xffFGcF(XR6eq@bqkL()3Fgf)mX--|V;#N5mUTZv!_U$-ECL}zR&QPFSZt(Qf)ew=@#Y0sJQnywxu@YeV7`VKe@%Yk zexk3UQlUtIL3GHQI5Jn{J5@2BljxwR{ErNT^1nOLer7#*8bcLW4$GFm>h478TEaK| zQ1nOTBmbJnj-z(k%UI1~4C8?~0nAy2a^egU0NV0!_5QDT z9`_%7>EGzx|1qA&!vm1Gf8u#iX!HNeKOS}{#tHsCWToKdhK5)F{g026^FP9&(0Tuj zmHm4${*6@r6EFNPYw+LUg>3hDAuA6B8#^dG&c@El_CLo9c>yH&54;e3`UhUf@fR4V z4QBW^MEH=C2S9=U1_rqSO!zNgkd2)e1b?B=@-JZUPmS|`V84HdnxRPU-@xD>i1=T? zAQ$)l2{2f!>+6N9l_GMXtp!^9%ISC-D-o&BYGPAo7iIDU$?C}R3+flcX1Y`43xt?@ zrHhJ7n}#=3_9(uZVqZrc#m|b~@e9b+R2>|^Kd$SEeP?0VueT(Y6;rS;=_inzah9_u z|I76J>ypU%^6hN%c9y}#vfE*ET=n>YfIbCjLD$Qvw)f?v>O&P2yAFqYN$QM0kYGN% zCjR2IP;t5&2VdK?^3HPmL3Yz43X}OSQw_%3-{^|!4b<{ZEoi5DK38Qo?Y6zgwLMR1 z++u70X}dAq#J$A*S>#&aWU5NZz~Jn%Ie4I{$-{lmZya-K>imGo{HGjpSKdz-tziU; zkFG!PG<&#gk#;gZpaR3Knc&)*gelXE{F2#$0P$YS8?M97dD~W_?Cyn{;nG@ zcYUXOKW3=^K`aoX#2iTt5_^)fFhPRk~frB#$2AZspT}9 zKzPOX_SNZV{&)yh4%Wnlm(;P;J0xNhdzCejy3^=1iUk$K?bqsBv_=SIlDJqhenG2U z5;^dpf~6LpdMhU)uq1a9Io3*vdgk{~j!)ZVaqB;L&JiAOIu{che)`4vsa{%7VlKq; zJH?s91mQ7mLHn~z!w`C^*k5qn1@ZV|qO!;s;$qH4Vse9*nGK%Y6FB)5!Jl6eV@XS5 zs`a__@%34TU_BU=$CYHna@dD!^nitnfbFALqv~;%A`+`6#gZbCLZcY4_ZMTPA8MfE z&c(`C*-5+<^p`iun}89cq(>AIqai>hT8(g)#~B>H!RfaEs)GRyyVYU zt~i}}>M>j_YLv(1JVb4DVyMo{mZKOaHKfV-D*e^tSEUNO1vy5;%tQx~o}YHAe=%Q5 zk+T^Isyut};?ZHzryMVgpJ((!oJ6r5Bp8DxR#Ms&Hl-|aT%_haTRJ1hX$R}G+QdXSWr{tn= z>Eb%$KI0l$Mmy^oixeboBjMQC3_4#aa~ zFWlN4SW=l?#ltca+1s+{%n3^^LYhUTiSdVaw!UyYa{Ux-%$(zrC6M6~slhSs0#8Wp z{EG1R8zxJJg-;HT?d)CT=HE(N)+JHkt1#xoZjffTRV6mLyK2)p?QLjfbM9EYR~F|l zpO#al8}WFjNQcPpvO{e`=Pl21euchf-gT`hk`wWUK8fru5KkIQd;)#^cUJ_x%GW#f`t`mx-A!d z`MPtv-^u%!n~du=nLg6K;8&BMAkDi(9M}&lD-9y-C<7}r>!Ej<*elXwA4SVnkWu$5 ziQO-8xk|sidGg5mrpGYfU(D|MH2YjAc3YPs?$v@;P00xAELw<_zMhs|a!HSpvW8{B zJbTHzqx2(pK^Zb~4HWvu0{DD$&>nL8ks>K6X;EQ)q1*GpFUq)(sUiWxY*GP!fk~Jf zmwxP+gT-&I2hJWZ<^8KFLR8OXH2()>ZvoZD*FNeNFJ8PjgaF0e-3eOUtps;>_u|35 z#frOoTcE+ASaA#Pu7%6*`^)*xJ?GwY?^-jNS(80`&tzu5D|zzFenB;Am_2idE1Yzh z%=6Acq4p=-(aU+_nQPyrgMs;Og0h_{CSS*6uIwz?DA*~#jc3_W8YCT0$qcj6gF7SesGk9iJZM<2&t_v#g_XtxXV=ccBjwt zPL+9HiXK#G6l=->T=xL{96RF|M!NmE0CVfxy0?$Go`ff@8(ZshlK63h{R90BD<{D# z)$l{;p{c-8l*Spsc}jp1xuz6LOAFp=h?p8e{@MOV1il}FZFmV&vc7C>^``@M#DeP_ zdr?l&X&8+muvFN0*jLy-jMm--XBp98L(Llpnf(QCXC$1)0>&2C?@lX}B9}6;6}`ev z#9|oHtn!_zD{<~g+7d!PMAfcz>@KRzKGGHm7Ap=xf2@pp+hkT?R7dIK%|L>OA+w$==3P5OH^I6K&Yg8hx{$wjen8Eybu-9e3K_y_7flq=WgqgS_wp`}E;mb!Mhvl406%T9=RyTsM+;rTH11S)T|8`2|NH8VB#l z7c%@S15DXj zjBE8moBNY*Bk_!4u+M}Y`}?mm2E)i+30w$&t1yV3cn_7yw=hXb!eo>l9jXkJCxQCr z=J7U=Uy6>RK+P`LA9mGTdpb%4~^nX;+GUiI=IhL$D)ciFnJ)C6v>hM{X%6u%2s3(2Cf7 zhvt>-7webvIQfpd3w#$+%eN>YW02owYhkC7JL)b$$`D4lBNJD3`z6s(HP;>Op5(-A zqA{q{krySs;W8$^J>sg+YPFxoF9htY><;g;g(f;+zkb55giO?n4WyYTr1uW%O0vR!|1W zr+w7ZX1oW3L=0%QW=*dz-ld<`Bp=dx@N4yOXj#T;C?RvI(DzW^A64@}6aWy_>SNpZ z``3K(CBY%5fZ=v03E1~&zPno3KJ4>1#0 z0(5k|*f|OUii*3*V~38?84^l!+MxVf~$)d@|D`cDQ! z>^R4iR@Mm@zJUNaz*!($s)2b9fM4&PgFySpJs)aPk*j1JULwli=_c=4VH{<+rpZ+= zM*4}#Q?yw+Io+_5f$5m2s^i-u7mInsRa_-H3qN`XtCoV+yaNA$iw>TH^aZZg_xE<` z&OmCt5*fE!?o{0hC@0zNUMWj7q#H$SoKY3wR??QGYi)0f1TF z>+hBWZ-dlY_k0aSMav7eKYt4O=%QiYTf~nm^f6J*D7I3NurjS=Q5QIuDla=f1flx% z@b_7_6I-XqQ5_&qxAv70<-h<{P%H1NpVU|d76(>^3|)Fz*mp=!$&pEqAn^WEay<_x z-PF#v9t;QeFSPi#fD`u%MMnbr&C|%C4|BaV*1KhJPOQP-RD6cP%+F%Dj^XAp#B9YM zR+TuEzdtc9h&u$6k|n(5%J&z>7x~HiW=$M-=9;;<{ubVg%?&~b*Cr>1D+*tGle^=h zpEn2af7b>70^~ptV<3Bai!1bo`<}MthH#Y?y${tYb>$w37RjTj=8MYW+v=8hBy45Q zm{5%-U0Ss!85t_vukI-_qb<79A3p3g#VqjV=$bZuoZCnZ4V}$a4c>_JL^*xCLuwN# z>eFlVNrL3mEn(nnd#_5%PG_7cNyLZ?QEI;otnr{NJ@V zT6VN_9S8{I`%cJf@EMtyy3;(3mjO%fgPGpJL?cfg%k-9c`OkFLwDS3Bvt0^}Y?_4C~okVW>2j0s6*wxkG3xK6) z9V$Y5;{#R4mVb!}cm6n?7|#Wd0WR~64LPglPH&yS&+MU;18?mmdzF8ZK6p5*Fc|%) z-tg3S9CN($TDCWK>5VjC zSzcQbr&}afc}<7;_#oX)^(%L$;_RcO{zk<7a36m5{V-IVT!KT_6u)6k-+@;shEpP& zDi^}0>N{qC%FssO$f9WxDilqYytFNmm7=;CRaE}NYl(y@DpHm)Dm;0Edc|j*oMO7pcWc&-#hnjq0gHW z-lJwqt-pmXd3wo-vR~Uk?7fjehsY&%qNcE}sKr5?U;A{CcwC6=H#gWcLX@n2!V1^L z&Q*C}kQ(aax<^}TbW8r7;MJxk|4ZDwOrSCdaF6{tWAPG5$H#X1&Z2?A0*cuA7oS!a z*zOKbZt1EfK?)E`sE4gdC!A$TQ9UUl58qy#(Izi_?@lpb)a zvK^At@ffMj6KXkqVzb04#QERQsQ;4MxjDH0+jQsn-y2*12fa*DTj!(XN2b@ovu!@P z+WfCL>L14Ssyk^qX*t@w8fF$$y#Fwu*De1hmA#r*|1FhqaJ+Jr|E5rU9Iv_;rvMe# zYZ5u0f7CBdUaEhV+hoA3tJNv)N@V*iyZXTZ3wm8suc{yMA<@(pm!~I(R^;rH@?iD@p{2yli*E(K- z;A=bosuzu4fc>?e*K_1}ZR^$d`)B`u&Wq=jmhtev*89q$c==w>=ar`MzItq2ukZhB zeihcZUTrpB?$_gFf3?aux&9{`?_VGKf6=x71WvE{^ZxTf*t=V}zFrV}Gj|JVi+^3D ze}CM-D0RefiT$0-?E@O?w2Y}fehK0`3`7Qa?%0aso3c+Gmo6pks0#e2MIs_u${t0lmj|Ol{3;Ug-fb#0(E-3jvBac zC?%)Xw3~jl&iHp$M%-#Oj~ocgh2Cx#fnP_SkZgE;K^clhJng2O}ZQKf}Iqo{KgyYO!C<=_KiU}fd&T3E&C6UI?aKiLXy{6Q8xazYj7j&;5@!z0o+ z`akkTOlOSIEf8;l*LL7*;mbjU-Ylb3Q3?IIrY4nf0=59A*iQ*s@+tzAG&_hW6?8Pn zNb00&ed4wdLpX$TgD4h+@(pPWG$83Y#k28~aG>{FoV8FTOvX(EDxR!prx48-oHh7H z!R2Tt7yIt!@LO*oyT+gI3*!qLKA1w^dTz)JQ+Ej zt-%?c4aQ%F^C+S7(M2}WV;Jnaq}D&kaz4f2Ro5|eMqqgC3PdPxw2TPROv&y2E~|~^ zW~j-iL&xzePma?E!a;BSyW~C&f0(KNPMZH=%l}Q9d0wN!zmaAx&i{!t zzlNfJ`t<)G&Hvi)fA9GJsr>$zg386i$Ntax*!;i8fthX}|FnSxK2f(dtF>ENdI3ch z*M{69KPn(f1O036yQDW}CR(2F5H*(x?2POxn^~K+n6#zD-!5t|M$Ih}+8I(=&(Q3Ly=%Iogi2 zPqhc+ef6^$Cvl&hPmm>>vJP8n)_^}E=5arb>IMy297?xY!cqUt#r z0Vq`l3y|_2FVp-;!^V}|HEOW%c<{Y8j}G#m9v0a@rSFyC@9^0!Z3g@uLtyUmcwD^l z`0Sjp73@K1Y~W%oPp5cem?NM2+_b?YPBi(!CFup=Tlhv1HGi)w-dLHtZMeqnl(Kuf zn^G`iiS$`H6glv;F=*k1MmE29qdrIM!THE?%jEjkJMK-?P3+tKQ_4pI>QWT3hu1Mk z;)AwT6-;1tru}8Ia%pynBnVCDFcMHrI*bv7CGT1S)RA{>2R_m+&<`1dSX01>z)sqB zO^6ZXC>0z9TmmjI4iSQQ6&pYhMPR!wBo?^vVF(#Cr`VtZX@*oKgPVbsKs|;bG*G%? zgA#-ql&;Vq4HK9>N4l0J?x0Xk$RQX+Qu-7s3qUq(ue29@j@mFfb70 z5Amiwm)}h9r;X9TjRJat>>;|e_41$6`++fPxM4tFkUPYhc1pfbp-^6umfA*=9!Q)4 zR)RD_{DDJJ5PzznM@Sd_P!RCG75D;y6+oV(AYQaSa*$rd3qH`e{Dlta88Ea2dD4Tl z0(~?fVxS8-&@_CCELu|D75x`o7i_bu@444Hd zkZwqo_C5y42D&f@8K=UUfMO6>6y!-9LIk|;0Zu4hh=6*Sh8RH4ijY(J3kQ&j!bL7{ z4Fb!7_)9^oXnkZMc#t>+S3`(7M3`kr4U{0y2^ca1Mbi2xKj3D0TTq(r2YT6$7mPmhO|K~@(p?r zWr!hQXaHge9Fhg`$~PE8JRntR;CNsqtsd==0!UlF!4P5r!2mUALTDk(>EMqLI1nMI z;UgpvL@3W`0ucr6fH-v^0+7-4Vgm>(NRW0vsn`g@3(}{xNiM#B+n8>~lNe4)Q+2;tCf%b>C=2g@p zhi{36I?(7fI{(y$GeER|?HQy1}6eV?y5+&RE++NC05}j_1Uwod3>}J>sPYy{Ffoer zjwp$Rf*kK1!L1BpI1(5YivJEbi37rcGK_}yHV!;017+)@2Xw;=1Aepg(e^Ra2q6BE zDOL{F3YIbCLT5*1|7?d0=L^@7ye{nD=?VOUKKb^eOff)G^Ua1hJ!0G?&|N8f9PLiN zFKTlU1#s09e2e%b*Viitj}9ohGNB2%4-Wb~DTdg^v`+4Fd(lUIE4Q`cz z6(Dudt}DX@;ewt&NCv(8x)wVbgzhcXceuHDir7U52x402gAZg`*8vQ%$?Orq8!seQI!Wvi{1@D`>P6 z>Uv$U8JsGrw|d_^k}&mpQt&T1|Gn$|`F;%wytA^lo9N(Lw7bv2QAqxJeNylg_-Dc1 zfBtSVnBY1WwB5+S-J-S0^%3=B77%^yMDkbZGum9t+hp*1+h%0gsoYl$FUqt|2v>l^ z;6(T}4BipfxhR+v(NJvDD5lGVZ_@~=O}meWX4T`Z5zBf7j+2-qifq?=`@J-pRgyje zcvhm;Q=;2rygIM`PGk@(Uh64Nok3p-yeH}(2Gc0-D^Hh4UN{4}uFCUNmQAx9nc>$= z131q0!Lf+;__q%4>WsS<1YI8W;q0V`XW_L`bs0<}g16z*W0bIC_zW0LW1v@`&i5qF zWf0&AW9E%M^pu$hTZ9DP!#^NiC3vet|8(JCYaA})VB6KX$qLWE@s$-G2wnhyT7zqF zurW{<86?T!7iGXp(Yt7dcI4;FZ>)*W4NppyGJine$1<^;oO?$aA&whb7WyCJ5$eOWsTJVf=xiZmJ?-)kpa+%F7XjJB? z)6hQPv=YTSeZWn^$7aI+NJWv(Mx`n)DSi^2V#6ROZYa!UAk0NaK}et)^Y(4*V*?@> z?JX+w-8(WDjE$@ioL`*5LH+e)>v-z~>p1I#>$rUU1DIGiHbka)rUa%q3}b*2kTeO> zd&E7YJ!yq%`Es1(iZ?QE2*lO#ZnSXdwr*yVIUcj2dS{7Ll#-(2%a751*cX)0Ug{Ug zCo$@mzGg3+K$HtF=o*#PyB8g(iSw~T_zQ*)`UM?KwdFclY>`*``OUoute4t}>cnIH zl&V%DF!szTxHs|%?LraCRz)Od+?+0F4EMb33xZkL0WP?ps^5b?Da#s%KE1yH)D*}r zCsySE#1LQL?$FoQT8;62Ry#N@L=GdNUe$**-<(f_Hhk7X{7E6%{4o=|RBNIB(+w;a zm?JmP#&q&zD`p`Yda9zNt!Oc1ACmcm%|)F4cyTPLNNUwAwpd}CRnq$opCB0O<#w{v z4ig|zst4Hz$q9cw6c2++Bu z-0MA<40&dHWIOHMoZSAqGg5wkF}b~xaoYJbx!v0%y!|`t=Jxb>&CA;9#o}-0<1N|Z z%1fN9h~78D4BNfltI3+cG1iHiyv~`R#v$U*4c)}AitLcsinuE z8=oa?d&IpJh$$oB*n!Bp4F_`UbaFltu==l0<5f%B6F~@RZ;%e>kV!9&!0w^}oZT-^w zG8y`O@6r7?AjsCkM0NMSeu=4sGhT9=5LliiRu-?C7RQ~5)buBw8~LI%U{UU;Mn z$-&dDzv_xFYd1SBwY|KZ#e$X9j)pN_z3PeoO+`pI=C$miEQ7#ik-ngUlTepwAm@UJ zEmgqE&qyD|$o=@A?UxHy6<+6cCxd3cd%cJH%oN0gyfYcc&?7}wx?^STIt(1C8yh;J z8h5ZU#4>sQi1@z&4nPs#4hbI7G$N;rcpfb#E1eidCRzx2(%lEWoibt$7c=Y&67mF$ zKEu7EI~xA>5(AcR^+$QWGw+`k`A@&qQZN%39n1yBgW*C4l47YysY$60sb8PL zpthr`q^_i5qGqBRp&p@FM=2)%jcgOqB%V#(NX13XAdgp!!-??wO%_%ba(UE@ge^5slC3;JF|IlsLsY7S z0yS;YCwUwoDnmHF_yx635+aZYf)FFsK+PeKj~fzBt(T-E{}uv=DhdBitRLlEQurNT zKaz_i**l?r7_i!;Uh&n)C*li2m@>40Dk%I3?!pfmB()mc zg>_F3#1rmX1_oy&hXd*S6q>5A^;ypDCC5eb? zElL>so&wgHq>=Oz>W^~a00lwalAI)ZQ16jpdQh$;yd*WK3zP#oom7-WlY|2`gR;XI zpeaeUQu)DTp~6`ABrpzWQIZ^$NrXSr1v_jcDT)ePk|KB+`yLl23MHbxl{^XYhr9Uq zxZ^4WB2<;@U1h6+S1t>w%2=ycN zBb6U@hQy7yrxa_%QRq?lQLufKeVBcOeTaReeW)RP`+HX$Fbx<1ECMD6vw$(dJYWJa zEf@(b044^%ZNP6pYlsWuLicow<>VfK#%8lBMs*!pniB+Dy7~waTO<0qp zKGhg_?B&eyA?V={^I0|M`^&~Dk#0}i@p}OHX}mlq94hRJvmk-BzIF{Gbfx!6c*?E< z%m=SXQ2-N@YLm?_94_E}uDd#)gOCT=rX2x<*ZfmBeAIZ9D!If#h@2J8$}#PD)U9;B ztd>7G&RfwppLqj!!_ECQcL8*PwOaQK`8TS9yyw(|I^^{#Gj(;Y2yJ;m)142GzY0i# zuDUQrX}ZB2dXni7>W0uN>F4=>{tD-I<7f}J2juuzbJbL%m_$vw7E7A^xNp}qfND2H z*wYIQvAQxmJ0PtkW7XR&d3zHr#0U97Ex>FGayKa>(*>PAqk)DCBj&g3!vrve)KM*% z?KtprrX92yCYZX236pijQ#hKI;!`daly{^nkPrw;Use!}UvpheTY@^kJY7)^ej35t zV2&3^GqG%tN7m@S!il{Z%c>OOd1hYzSRB~So_zPh_sI7YKH0*ce88_ZRvoEUNg8#w z!?w~^NtDOrUAxk*`pKOWkb@DNL!CdR(ykx&mDhEu5UcWGvdt+;F?dlRlNIGAb!3`D z9j}$zDzspPei~=wXZ7y3#%m<`Y$0Ij+kyQ6$u<-0Bz3tBWcIZET>j*ELEF?9bvD#A z{3qi(l3(y;`T4DCX+V;RU#5SAKY_*h2Q#I@XdgtEM98nn7E1akDBhh{f~v*lK?>}! z3l=$K#wnSQRPW-zr{7bQ{qpQaG06g2feAWX$VKbdcfrQPnTzaxa`3=uV1}2M9gSYdSpzlvTt3GbKSEDB<2S?UUb`CcA zJY2Ig{6%IDO%EN5*$2NNn}tu(jw-@JxM%$2o|Ow=?mZ9vc(jq0GM?2IfMBjJM-`}F zNbs{Be-ADW(>Lj=_X&WC<0tN)YMyHfhJtJsXbkg4Nu0FmrF0tVa!n!J_(U=WTT>g; zEa!V4jFyGo1S%@}vkUr1UQ&$npiW1o-~3 zw@u)yf;l6qri>cq#!bGTQr=`Y_OSsnSOEWEgEanCO z@6iIDDm#j~ODh>ZtgXDEv8kUj^w@!xGZNa>^7?cA^Hqj|>{T`W$|$pQVJJ@TJ?Wy* zH(7on`MtaghM&hG8Zgk0N^$AZ^;&}wO`18>&`^lnIfZ5<7Thzf`YMbLyT`H4pF90v zZD3ZZu*s}R&0SwPi-ejm53X+SOyTQA^qqyQ!r>%9w7%j%7?rWGn3(>grCfY&Eie+G zs#RL;0bq@_3>xSZzjV4wncnqPSi9gTq`zbcRSgYX@6~1N*4thqM>5S*#I;gIP15SU z`KF96Z)>5SRUI{=kQ}&;2L42&A$8j4Y~z1eM=z>qO^V|!?|3+PkMKl@vm|(ALqW%+ z{q2;5)nTB!3{Z`t_q~n?Jn{J!E0-z_ua>grb7X=hgpm`vYW`5aL8ja2$lm~H zLcVr0a;L&4Rl$@D2s;mH4y#JtOxOsWKliwkg1hKUYDHHc>4)CbiO#y0CFdK}XV3zl`0XJ{<9r+h(K+1-}Z-)0mrvh)w+Q-P-h@%a1gd{mM9iMM|eM*v` zZ;Z|Vu-~hYbcNq63&ot?&*krXF!TzR>(%Mqy#0>Tl19^?ah9sM=6>H5ADy?Qv=x(<(UXq3)RwvjDqK)+gpuO^NQR+frHu55pa z_cGP<hI_X*MOTI%*K=jJW2uh!^AQL?#?n~fAK4p-x$Ke%E+;_AJdli_WJunL;mbfW_^F3 z-LDSa3^6mu-3sPyMc-e{suFj9JPVm+TJTE>;GB@+E5=*zB>!pIrS|DF<20YRP}|JV zD$>hJaE2AAcZ_0MNa11AZ<41WW5=ZA*S49Rd5ML+&HB$EV3*{LAG%D5qTZ9He_^EI zJs5K!uxd=prz&dcp9%F(?_X2O*%7ADbF+X;c4}d$*DTQaAv}F_y+Q%S{Eys82GPdk z0M$KX8GmXpuU_>Kat%Dz+12quL9|hhGQ~U@aN&VH>+5qa^Q>mF-;5TR!#UyshgiKO z*>H?n9s!0iq@|i{n~wb4cDT2MC#FNW^F*;i;))$RKXdL!Z1VN#&BW(q<82V`^bu~M z2SO#(=paMB#WPj2vJ({Y@McIG9ZHoCT90McbcHsaX$R)J%&LCq8mm57hfWkc9R6eeF2uI*Aji|F-jWRKMR>U(fp6DJ7XR zGaB6FI5>&69CK5X>dmA%3(T~6Pk7im@Up9{Z7`JoTvie18%pe4l^n z-MlJx@A=sL{0KiALLVj+c8WM*X^*`fo?vO5JDYpm=xlU%xncD)C|*;BP}VV8nBd+9 z)@{w`YjAbHx1j5Iw0Tr`M6~tj)|0zbPzTJ1`mqN&NXSZfes4uL{?J9jRvGclJnBKi z8%fi;f}%Y~D&0R!ccbSr+2(5hTQ>_!)9Ie_~Rl7Uz-Fh=0D7B5fdxFraA2} z(6rk9z#_U>+>7LRSXw_nXv|FRcN|yQbA`e3_n5S{d&B!y#wx&Oo0P3r%~&>%gPtf+ zdFoK4!`m}PJujoIysFAtv!W9B+&<^WR)wuC>Fn_5xC`}J>g!_l~keOs>1l2E#|}1qTa$vMw8`>!s+P6LxUl57}Ln^ znCro>!0P6JJM8M?BFiya%9WCXQZ|QSwO&)s4+N8Iu{M~XLXV&56e%tWnOs1{I z)Gc8DHy`MM$&Br{6dMa45$y z{6|MWKPLtwQL4cRI*Aq4?}=COYy33YPOh_KbvFU&ZPB!>pJHBD3tu1Gyen4`#ZmO) z0uo-Mx@+^gd+{)vn(fRPnVUiWQPQ8hJQN5u|~S%Dm8y^^ZhlAz1M0a;@lMo;SyfZ~e@tNUrh5uCxlyPsEH{Ys!#^P{!`8 zIQ{gnYcs0#X0-Q_UT4mzsf`6ZSwRxEU|N~k>2UJHU~Wdcw#NZ9k+90xxmv7|CLE-^U)G?NMnP$z6;hqy~LYCfh9Z zfa?=YZH>4Ny)l=@?5!KB2}dH%BP^=c6Dz$jYU08{aIwcvoc-Xg!8dDyp){(@;yy4Ctj|T51nefC_nvP~1RPbfU5gquZ=W9) z2zI@kA72l5Ck9;2imFYZpxaAnhoNQu&MQCI-tN7s6 z)?_{f+l0^XdW5W!m?~%K0+zj6^8XHBOYKGp&T5LA5hsCU=jvC{oY_s3YZdUD>F_8Y;u(id8 z7g#fkp59f%5n0)ksWZ4^aD_Og>L}P^FUISnEE!$!hUc?mLe%=#SK#{Rs}PZ~80SS``)=&f$jtZ*2;(7QMv3dAp{ZZ- z*kHE?8sQAKECfNSwWYoI`vpJMp5t~tuv1CF9qC_$RmOt8Sy^eKzd_f6dfw#p$3qPR zk8u;f(Ug$k-*-0c*Q0kY!Vb>~3ycaC=M6+v%j3<{>6XljutMC8=;;ULQXxxyUwy{(L#;n#`>or5(--4cXZbycO{kcV z0%EevSMrmVq62S0dPkHZVE4^=BJZUs+NoCFBzpA(f_MW`0z18|-liE%+_z^T*vetp z(bnW-=QZNbHBW+!63BLP8@aBr1O57tm}VfJ9f)oYqEtnjr7IE=pN`g`kfJedhjmw7 z5^{lS1nlMe%{DeiM}#q_z>RNX^W8SBx?gXt=R#{e~JsU~K6)8fwND_=KR zAkH!vyPajXV)r5Ogh`w;a?6l&_SCJ7VT>FF1;$KHCU|)R9PuA$DC%157TR?{EZmwy zuCzaw+!DN{^Klnlz+hfh_QbnKS|_4yeN`MoYly9 zkvf0KR